@rangertechnologies/ngnxt
Version:
This library was used for creating dymanic UI based on the input JSON/data
395 lines • 54 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
export class PdfDesignerService {
http;
pdfElements = [];
pdfElementsSubject = new BehaviorSubject([]);
selectedElementSubject = new BehaviorSubject(-1);
selectHeaderSubject = new BehaviorSubject(null);
elementComponent = null;
pdf;
unique_id;
tempElem;
pdfElements$ = this.pdfElementsSubject.asObservable();
selectedElement$ = this.selectedElementSubject.asObservable();
selectHeaderSubject$ = this.selectHeaderSubject.asObservable();
currentElement;
selectTableColumn;
constructor(http) {
this.http = http;
// Load saved elements from localStorage
this.pdfElements = [];
const savedPdfElements = localStorage.getItem('pdfElements');
if (savedPdfElements) {
this.pdfElements = JSON.parse(savedPdfElements);
this.pdfElementsSubject.next([...this.pdfElements]);
}
}
intializeBook(pdf) {
// - Get the unique id in the pdf
this.unique_id = Object.keys(pdf)[0];
let tempbook = pdf[this.unique_id];
// SKS28MAR25 update nested pdf QuestionsMap
tempbook.forEach((element) => {
if (element.type === "pdf" && element.pdfReference) {
this.getRefQbData(element.pdfReference).subscribe((response) => {
element['pdfReferenceQuestions'] = response; // Assign response to pdfReferenceQuestions
}, (error) => {
console.error("API Error:", error);
});
}
});
pdf[this.unique_id] = tempbook;
this.pdf = pdf;
this.pdf[this.unique_id]?.forEach(element => {
// if (this.pdf.sqOptions?.[element.id]) {
// element.options = this.pdf.sqOptions[element.id].options;
// }
this.addElement(element);
});
}
//SKS28MAR25 Function to fetch refqb data
getRefQbData(refqbid) {
return this.http.get(`https://dev-api.valarhr.com/nxt?name=${refqbid}`);
}
//AP-17APR25 Function to generate unique id
addElementWithId() {
const prefix = 'ngnxt';
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
let id = '';
for (let i = 0; i < 11; i++) {
id += chars.charAt(Math.floor(Math.random() * chars.length));
}
return prefix + id;
}
newBook() {
this.unique_id = this.addElementWithId();
this.pdf = {
[this.unique_id]: [],
'title': 'Untitled',
};
}
// AP 26FEB25 - clear the form elements
clearElements() {
this.pdfElements = [];
this.pdfElementsSubject.next([...this.pdfElements]);
}
// Get the element component reference
getElementComponent() {
return this.elementComponent;
}
setElementComponent(component) {
this.elementComponent = component;
}
// Add a new element to the form
addElement(element) {
this.pdfElements.push(element);
this.pdfElementsSubject.next([...this.pdfElements]);
}
// SKS13MAR25 add table element
addTableElement(element, ind) {
//SKS13MAR25 Ensure currentElement exists
if (!this.currentElement)
return;
// Clone elements array
const elements = [...this.getElements()];
// SKS13MAR25 Find the element and update its columns
const index = elements.findIndex(el => el.id === this.currentElement.id);
// Clone columns array to trigger change detection
const updatedColumns = [...(this.pdfElements[index].columns || []), element];
let tempFieldsMeta = {
'label': element.label,
'apiName': element.fieldName,
"isdeleted": false,
"orderbyflag": false,
"filterflag": false,
"outputFlag": true,
"ischild": false,
"resultantflag": false,
"searchflag": false,
"fldType": element.type,
"readOnly": false,
"uniqueIdentifier": element.id
};
let fieldsMeta = [...this.pdfElements[index].fieldsMeta, tempFieldsMeta];
if (index !== -1) {
elements[index] = { ...elements[index], columns: updatedColumns, fieldsMeta: fieldsMeta };
}
// Emit the updated form elements
// this.pdfElementsSubject.next(elements);
this.pdfElements = elements;
this.pdfElementsSubject.next([...elements]);
this.selectedElementSubject.next(ind);
// Log for debugging
// console.log("Updated form elements:", this.pdfElements);
}
updateElement(index, updates) {
const elements = [...this.getElements()];
if (elements[index]) {
elements[index] = {
...elements[index],
...updates,
};
this.pdfElementsSubject.next(elements);
}
if (index >= 0 && index < this.pdfElements.length) {
const updatedElement = {
...this.pdfElements[index],
...updates
};
if (elements[index]) {
elements[index] = { ...elements[index], ...updates };
this.pdfElements = elements;
this.pdfElementsSubject.next([...this.pdfElements]);
}
this.pdfElements[index] = updatedElement;
this.pdfElementsSubject.next([...this.pdfElements]);
}
}
updateTitle(event) {
//AP-10MAR25 Updates the title of the first record in the pdf
this.pdf.title = event;
}
setSelectedElement(index) {
this.selectedElementSubject.next(index);
this.currentElement = this.pdfElements[index];
this.selectTableColumn = null;
}
// SKS19MAR25 set the selected table column
setSelectedTableElement(index, event) {
this.currentElement = this.pdfElements[index];
if (this.currentElement?.type === 'Table') {
}
const foundItem = this.currentElement?.type === 'Table' ? this.currentElement['fieldsMeta'].find(item => item['apiName'] === event?.column) : undefined;
this.selectTableColumn = foundItem?.uniqueIdentifier;
this.selectedElementSubject.next(index);
}
removeSelectedTableElement(index, event) {
// console.log("ddd",index, event)
this.currentElement = this.pdfElements[index];
if (this.currentElement?.type === 'Table') {
// Find the index of the item
const itemIndex = this.currentElement['fieldsMeta'].findIndex(item => item['apiName'] === event?.column);
// Remove the item if found
if (itemIndex !== -1) {
this.currentElement['fieldsMeta'].splice(itemIndex, 1);
}
}
this.selectTableColumn = null;
this.elementUpdate(this.currentElement);
}
// SKS19MAR25 get the selected table column
getSelectTableColumn() {
return this.selectTableColumn;
}
selectHeading(event) {
//AP-10MAR25 Emits the selected heading event
this.selectHeaderSubject.next(event);
}
getElements() {
return this.pdfElements.map(element => ({
...element
}));
}
sortElementsByOrder() {
//AP-10MAR25 Sort elements by current order
this.pdfElements.sort((a, b) => a.questionNumber - b.questionNumber);
this.pdfElements.forEach((element, index) => {
element.questionNumber = index + 1;
});
this.pdfElementsSubject.next([...this.pdfElements]);
}
//AP-10MAR25 Returns the current pdf data
getBook() {
return this.pdf;
}
downloadElement() {
this.pdfElements.forEach(element => {
//AP-02JUN25 - Set a default value for 'date' type elements if no value is provided
// const defaultDate = 'date'
// if (element.type === '' && !element.value) {
// element.value = defaultDate;11
// }
if (element.type === 'text' || 'input') {
// element.value = (element.question || element.value || '').replace(/\\n/g, '\n');
}
if (element.subText && typeof element.subText === 'object') {
element.subText = JSON.stringify(element.subText);
}
// if (element.pdfReferenceQuestions) {
// delete element.pdfReferenceQuestions;
// }
});
this.pdf[this.unique_id] = this.pdfElements;
this.pdf['pdfJson'] = this.convertToPdfLayout(this.pdf);
// Scale widths for columns
this.pdf?.pdfJson?.content?.forEach((row) => {
row.columns?.forEach((col) => {
if (typeof col.width === 'number' && col.width < 520) {
col.width = col.width * 5.2;
}
});
});
console.log('pdf', this.pdf.pdfJson);
return this.pdf;
}
convertToPdfLayout(input) {
const result = { content: [] };
const items = input[this.unique_id];
const processItems = (items) => {
const rows = [];
let currentRow = { columns: [] };
let currentWidth = 0;
for (const item of items) {
const width = item.width || 100;
let element = { width, "margin": [0, 10, 0, 10], };
if (currentWidth + width > 100) {
rows.push(currentRow);
currentRow = { columns: [] };
currentWidth = 0;
}
if (item.type === "Space") {
currentRow.columns.push({ width, text: '' });
}
else if (item.type === 'Line') {
element.canvas = [
{
type: 'line',
x1: item.x1 ?? 0,
y1: item.y1 ?? 0,
x2: item.x2 ?? 520,
y2: item.y2 ?? 0,
lineWidth: item.lineWidth ?? 1,
lineColor: item.lineColor ?? '#000000',
}
];
currentRow.columns.push(element);
}
else if (item.type === "Pdf" && item.pdfReferenceQuestions) {
const nestedQuestions = item.pdfReferenceQuestions[item.pdfReference];
const nestedContent = processItems(nestedQuestions); // recursive processing
currentRow.columns.push(nestedContent);
}
else if (item.type === 'Table') {
let summaryRowPosition = 0;
const tableColumns = item.fieldsMeta || [];
const mainColumns = tableColumns.filter(column => column.summaryRow !== true);
const summaryRow = tableColumns.filter(column => column.summaryRow === true);
tableColumns.forEach(element => {
if (element.column) {
mainColumns.forEach((mCol, index) => {
if (element.column === mCol.apiName) {
summaryRowPosition = index;
}
});
}
});
const body = [];
// Table headers
body.push(mainColumns.map(col => ({
text: col.label, style: item.styleClass
})));
// Table data
item?.value?.data?.forEach(tableData => {
body.push(mainColumns.map(col => ({
text: tableData[col.apiName]
})));
});
// Summary rows
summaryRow.forEach((col) => {
//AP-14JUN25 - Create an empty row with same number of columns as main table, filled with blank cells (no borders)
const row = new Array(mainColumns.length).fill({ text: '', "border": [false, false, false, false] });
//AP-14JUN25 - Set the label text at the left summary position with bottom-side border
row[summaryRowPosition - 1] = { text: col.label, "border": [false, false, false, true] };
row[summaryRowPosition] = { text: item?.value?.summaryValues?.[col.apiName], "border": [false, false, false, true] };
body.push(row);
});
element = {
width: item.width || 520,
table: {
body,
widths: new Array(mainColumns.length).fill('*')
},
};
currentRow.columns.push(element);
}
else if (item.type === 'image') {
currentRow.columns.push({
width,
image: item.imageData || '',
fit: [item.width || 100, item.height || 100], style: item.styleClass
});
}
else {
const val = item.value || '';
currentRow.columns.push({
width,
text: val, style: item.styleClass,
});
}
currentWidth += width;
if (currentWidth === 100) {
rows.push(currentRow);
currentRow = { columns: [] };
currentWidth = 0;
}
}
if (currentRow.columns.length > 0) {
rows.push(currentRow);
}
return rows;
};
result.content = processItems(items);
let styleJson = {};
for (const item of items) {
styleJson[item.styleClass] = item.style;
}
result['styles'] = styleJson;
return result;
}
// AP-06MAR25 - Element new order update
updateElementsOrder(updatedElements) {
this.pdfElements = [...updatedElements];
this.pdfElementsSubject.next(this.pdfElements);
}
// Remove an element by ID
// Save elements to localStorage and update the subject
removeElementComponent(id) {
this.tempElem = [];
this.selectedElementSubject.next(null);
this.currentElement = {};
this.pdfElements.forEach((element) => {
if (element.id !== id) {
this.tempElem.push(element);
}
});
this.pdfElements = this.tempElem;
this.pdfElementsSubject.next([...this.pdfElements]);
}
// SKS19MAR25 update the element
elementUpdate(element) {
let eleIndex;
const elements = [...this.getElements()];
elements.forEach((ele, index) => {
if (ele.id === element.id) {
elements[index] = element;
eleIndex = index;
}
});
this.pdfElements = elements;
this.sortElementsByOrder();
this.pdfElementsSubject.next([...elements]);
this.selectedElementSubject.next(eleIndex);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PdfDesignerService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PdfDesignerService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PdfDesignerService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.HttpClient }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRlc2lnbmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvc2VydmljZXMvcGRmLWRlc2lnbmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7QUFPbkQsTUFBTSxPQUFPLGtCQUFrQjtJQWdCVDtJQWZaLFdBQVcsR0FBVSxFQUFFLENBQUM7SUFDeEIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEQsc0JBQXNCLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RCxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztJQUNyRCxnQkFBZ0IsR0FBNEIsSUFBSSxDQUFDO0lBQ3pELEdBQUcsQ0FBTTtJQUNULFNBQVMsQ0FBTTtJQUNmLFFBQVEsQ0FBUTtJQUVoQixZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RELGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5RCxvQkFBb0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDL0QsY0FBYyxDQUFNO0lBQ3BCLGlCQUFpQixDQUFNO0lBRXZCLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDbEMsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3RCxJQUFJLGdCQUFnQixF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QUMsRUFBRSxFQUFFLENBQUM7Z0JBQzFCLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUM7Z0JBQzFCLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7d0dBaGFVLGtCQUFrQjs0R0FBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuLi9wYWdlcy9idWlsZGVyL2VsZW1lbnQvZWxlbWVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGRmRGVzaWduZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBwZGZFbGVtZW50czogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSBwZGZFbGVtZW50c1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gIHByaXZhdGUgc2VsZWN0ZWRFbGVtZW50U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigtMSk7XG4gIHByaXZhdGUgc2VsZWN0SGVhZGVyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHJpdmF0ZSBlbGVtZW50Q29tcG9uZW50OiBFbGVtZW50Q29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG4gIHBkZjogYW55O1xuICB1bmlxdWVfaWQ6IGFueTtcbiAgdGVtcEVsZW06IGFueVtdO1xuXG4gIHBkZkVsZW1lbnRzJCA9IHRoaXMucGRmRWxlbWVudHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBzZWxlY3RlZEVsZW1lbnQkID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBzZWxlY3RIZWFkZXJTdWJqZWN0JCA9IHRoaXMuc2VsZWN0SGVhZGVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgY3VycmVudEVsZW1lbnQ6IGFueTtcbiAgc2VsZWN0VGFibGVDb2x1bW46IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcbiAgICAvLyBMb2FkIHNhdmVkIGVsZW1lbnRzIGZyb20gbG9jYWxTdG9yYWdlXG4gICAgdGhpcy5wZGZFbGVtZW50cyA9IFtdO1xuICAgIGNvbnN0IHNhdmVkUGRmRWxlbWVudHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGRmRWxlbWVudHMnKTtcbiAgICBpZiAoc2F2ZWRQZGZFbGVtZW50cykge1xuICAgICAgdGhpcy5wZGZFbGVtZW50cyA9IEpTT04ucGFyc2Uoc2F2ZWRQZGZFbGVtZW50cyk7XG4gICAgICB0aGlzLnBkZkVsZW1lbnRzU3ViamVjdC5uZXh0KFsuLi50aGlzLnBkZkVsZW1lbnRzXSk7XG4gICAgfVxuICB9XG4gIGludGlhbGl6ZUJvb2socGRmOiBhbnkpIHtcbiAgICAvLyAgLSBHZXQgdGhlIHVuaXF1ZSBpZCBpbiB0aGUgcGRmIFxuICAgIHRoaXMudW5pcXVlX2lkID0gT2JqZWN0LmtleXMocGRmKVswXTtcbiAgICBsZXQgdGVtcGJvb2sgPSBwZGZbdGhpcy51bmlxdWVfaWRdO1xuLy8gU0tTMjhNQVIyNSB1cGRhdGUgbmVzdGVkIHBkZiBRdWVzdGlvbnNNYXBcbiAgICB0ZW1wYm9vay5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcInBkZlwiICYmIGVsZW1lbnQucGRmUmVmZXJlbmNlKSB7XG4gICAgICAgIHRoaXMuZ2V0UmVmUWJEYXRhKGVsZW1lbnQucGRmUmVmZXJlbmNlKS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50WydwZGZSZWZlcmVuY2VRdWVzdGlvbnMnXSA9IHJlc3BvbnNlOyAvLyBBc3NpZ24gcmVzcG9uc2UgdG8gcGRmUmVmZXJlbmNlUXVlc3Rpb25zXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBUEkgRXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcGRmW3RoaXMudW5pcXVlX2lkXSA9IHRlbXBib29rXG4gICAgdGhpcy5wZGYgPSBwZGZcblxuICAgIHRoaXMucGRmW3RoaXMudW5pcXVlX2lkXT8uZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIC8vIGlmICh0aGlzLnBkZi5zcU9wdGlvbnM/LltlbGVtZW50LmlkXSkge1xuICAgICAgLy8gICBlbGVtZW50Lm9wdGlvbnMgPSB0aGlzLnBkZi5zcU9wdGlvbnNbZWxlbWVudC5pZF0ub3B0aW9ucztcbiAgICAgIC8vIH1cbiAgICAgIHRoaXMuYWRkRWxlbWVudChlbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vU0tTMjhNQVIyNSBGdW5jdGlvbiB0byBmZXRjaCByZWZxYiBkYXRhXG4gIGdldFJlZlFiRGF0YShyZWZxYmlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYGh0dHBzOi8vZGV2LWFwaS52YWxhcmhyLmNvbS9ueHQ/bmFtZT0ke3JlZnFiaWR9YCk7XG4gIH1cblxuICAgLy9BUC0xN0FQUjI1IEZ1bmN0aW9uIHRvIGdlbmVyYXRlIHVuaXF1ZSBpZFxuICAgYWRkRWxlbWVudFdpdGhJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9ICduZ254dCc7IFxuICAgIGNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV8nO1xuICAgIGxldCBpZCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTE7IGkrKykge1xuICAgICAgaWQgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gcHJlZml4K2lkO1xuICB9XG5cbiAgbmV3Qm9vaygpIHtcbiAgICB0aGlzLnVuaXF1ZV9pZCA9IHRoaXMuYWRkRWxlbWVudFdpdGhJZCgpO1xuICAgIHRoaXMucGRmID0ge1xuICAgICAgICBbdGhpcy51bmlxdWVfaWRdOiBbXSxcbiAgICAgICAgJ3RpdGxlJzogJ1VudGl0bGVkJyxcbiAgICB9XG4gIH1cbiAgLy8gQVAgMjZGRUIyNSAtIGNsZWFyIHRoZSBmb3JtIGVsZW1lbnRzIFxuICBjbGVhckVsZW1lbnRzKCkge1xuICAgIHRoaXMucGRmRWxlbWVudHMgPSBbXTtcbiAgICB0aGlzLnBkZkVsZW1lbnRzU3ViamVjdC5uZXh0KFsuLi50aGlzLnBkZkVsZW1lbnRzXSk7XG4gIH1cbiAgLy8gR2V0IHRoZSBlbGVtZW50IGNvbXBvbmVudCByZWZlcmVuY2VcbiAgZ2V0RWxlbWVudENvbXBvbmVudCgpOiBFbGVtZW50Q29tcG9uZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENvbXBvbmVudDtcbiAgfVxuXG4gIHNldEVsZW1lbnRDb21wb25lbnQoY29tcG9uZW50OiBFbGVtZW50Q29tcG9uZW50KSB7XG4gICAgdGhpcy5lbGVtZW50Q29tcG9uZW50ID0gY29tcG9uZW50O1xuICB9XG5cbiAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGZvcm1cbiAgYWRkRWxlbWVudChlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgICBcbiAgICB0aGlzLnBkZkVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgdGhpcy5wZGZFbGVtZW50c1N1YmplY3QubmV4dChbLi4udGhpcy5wZGZFbGVtZW50c10pO1xuICB9XG4gIC8vIFNLUzEzTUFSMjUgYWRkIHRhYmxlIGVsZW1lbnRcbiAgYWRkVGFibGVFbGVtZW50KGVsZW1lbnQ6IGFueSwgaW5kIDphbnkpIHtcbiAgICAvL1NLUzEzTUFSMjUgRW5zdXJlIGN1cnJlbnRFbGVtZW50IGV4aXN0c1xuICAgIGlmICghdGhpcy5jdXJyZW50RWxlbWVudCkgcmV0dXJuO1xuICAgIC8vIENsb25lIGVsZW1lbnRzIGFycmF5XG4gICAgY29uc3QgZWxlbWVudHMgPSBbLi4udGhpcy5nZXRFbGVtZW50cygpXTtcblxuICAgIC8vIFNLUzEzTUFSMjUgRmluZCB0aGUgZWxlbWVudCBhbmQgdXBkYXRlIGl0cyBjb2x1bW5zXG4gICAgY29uc3QgaW5kZXggPSBlbGVtZW50cy5maW5kSW5kZXgoZWwgPT4gZWwuaWQgPT09IHRoaXMuY3VycmVudEVsZW1lbnQuaWQpO1xuXG4gICAgLy8gQ2xvbmUgY29sdW1ucyBhcnJheSB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb25zdCB1cGRhdGVkQ29sdW1ucyA9IFsuLi4odGhpcy5wZGZFbGVtZW50c1tpbmRleF0uY29sdW1ucyB8fCBbXSksIGVsZW1lbnRdO1xuICAgIGxldCB0ZW1wRmllbGRzTWV0YSA9IHtcbiAgICAgICdsYWJlbCc6IGVsZW1lbnQubGFiZWwsXG4gICAgICAnYXBpTmFtZSc6IGVsZW1lbnQuZmllbGROYW1lLFxuICAgICAgXCJpc2RlbGV0ZWRcIjogZmFsc2UsXG4gICAgICBcIm9yZGVyYnlmbGFnXCI6IGZhbHNlLFxuICAgICAgXCJmaWx0ZXJmbGFnXCI6IGZhbHNlLFxuICAgICAgXCJvdXRwdXRGbGFnXCI6IHRydWUsXG4gICAgICBcImlzY2hpbGRcIjogZmFsc2UsXG4gICAgICBcInJlc3VsdGFudGZsYWdcIjogZmFsc2UsXG4gICAgICBcInNlYXJjaGZsYWdcIjogZmFsc2UsXG4gICAgICBcImZsZFR5cGVcIjogZWxlbWVudC50eXBlLFxuICAgICAgXCJyZWFkT25seVwiOiBmYWxzZSxcbiAgICAgIFwidW5pcXVlSWRlbnRpZmllclwiOiBlbGVtZW50LmlkXG4gICAgfVxuICAgIGxldCBmaWVsZHNNZXRhID0gWy4uLnRoaXMucGRmRWxlbWVudHNbaW5kZXhdLmZpZWxkc01ldGEsIHRlbXBGaWVsZHNNZXRhXTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGVsZW1lbnRzW2luZGV4XSA9IHsgLi4uZWxlbWVudHNbaW5kZXhdLCBjb2x1bW5zOiB1cGRhdGVkQ29sdW1ucywgZmllbGRzTWV0YTogZmllbGRzTWV0YSB9O1xuICAgIH1cblxuICAgIC8vIEVtaXQgdGhlIHVwZGF0ZWQgZm9ybSBlbGVtZW50c1xuICAgIC8vIHRoaXMucGRmRWxlbWVudHNTdWJqZWN0Lm5leHQoZWxlbWVudHMpO1xuICAgIHRoaXMucGRmRWxlbWVudHMgPSBlbGVtZW50cztcbiAgICB0aGlzLnBkZkVsZW1lbnRzU3ViamVjdC5uZXh0KFsuLi5lbGVtZW50c10pO1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50U3ViamVjdC5uZXh0KGluZCk7XG4gICAgLy8gTG9nIGZvciBkZWJ1Z2dpbmdcbiAgICAvLyBjb25zb2xlLmxvZyhcIlVwZGF0ZWQgZm9ybSBlbGVtZW50czpcIiwgIHRoaXMucGRmRWxlbWVudHMpO1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudChpbmRleDogbnVtYmVyLCB1cGRhdGVzOiBQYXJ0aWFsPGFueT4pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IFsuLi50aGlzLmdldEVsZW1lbnRzKCldO1xuICAgIGlmIChlbGVtZW50c1tpbmRleF0pIHtcbiAgICAgIGVsZW1lbnRzW2luZGV4XSA9IHtcbiAgICAgICAgLi4uZWxlbWVudHNbaW5kZXhdLFxuICAgICAgICAuLi51cGRhdGVzLFxuICAgICAgfTtcbiAgICAgIHRoaXMucGRmRWxlbWVudHNTdWJqZWN0Lm5leHQoZWxlbWVudHMpO1xuICAgIH1cblxuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5wZGZFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0ge1xuICAgICAgICAuLi50aGlzLnBkZkVsZW1lbnRzW2luZGV4XSxcbiAgICAgICAgLi4udXBkYXRlc1xuICAgICAgfTtcbiAgICAgICAgaWYgKGVsZW1lbnRzW2luZGV4XSkge1xuICAgICAgICAgIGVsZW1lbnRzW2luZGV4XSA9IHsgLi4uZWxlbWVudHNbaW5kZXhdLCAuLi51cGRhdGVzIH07XG4gICAgICAgICAgdGhpcy5wZGZFbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgICAgICAgIHRoaXMucGRmRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMucGRmRWxlbWVudHNdKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZGZFbGVtZW50c1tpbmRleF0gPSB1cGRhdGVkRWxlbWVudDtcbiAgICAgIHRoaXMucGRmRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMucGRmRWxlbWVudHNdKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlVGl0bGUoZXZlbnQ6IGFueSkge1xuICAgIC8vQVAtMTBNQVIyNSBVcGRhdGVzIHRoZSB0aXRsZSBvZiB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBwZGYgIFxuICAgIHRoaXMucGRmLnRpdGxlID0gZXZlbnQ7XG4gIH1cbiAgc2V0U2VsZWN0ZWRFbGVtZW50KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudFN1YmplY3QubmV4dChpbmRleCk7XG4gICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMucGRmRWxlbWVudHNbaW5kZXhdXG4gICAgdGhpcy5zZWxlY3RUYWJsZUNvbHVtbiA9IG51bGxcbiAgfVxuICAvLyBTS1MxOU1BUjI1IHNldCB0aGUgc2VsZWN0ZWQgdGFibGUgY29sdW1uXG4gIHNldFNlbGVjdGVkVGFibGVFbGVtZW50KGluZGV4OiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gdGhpcy5wZGZFbGVtZW50c1tpbmRleF1cbiAgICBpZiAodGhpcy5jdXJyZW50RWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJykge1xuICAgIH1cbiAgICBjb25zdCBmb3VuZEl0ZW0gPSB0aGlzLmN1cnJlbnRFbGVtZW50Py50eXBlID09PSAnVGFibGUnID8gdGhpcy5jdXJyZW50RWxlbWVudFsnZmllbGRzTWV0YSddLmZpbmQoaXRlbSA9PiBpdGVtWydhcGlOYW1lJ10gPT09IGV2ZW50Py5jb2x1bW4pIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuc2VsZWN0VGFibGVDb2x1bW4gPSBmb3VuZEl0ZW0/LnVuaXF1ZUlkZW50aWZpZXJcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudFN1YmplY3QubmV4dChpbmRleCk7XG4gIH1cbiAgcmVtb3ZlU2VsZWN0ZWRUYWJsZUVsZW1lbnQoaW5kZXg6IG51bWJlciwgZXZlbnQ6IGFueSkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiZGRkXCIsaW5kZXgsIGV2ZW50KVxuICAgIHRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLnBkZkVsZW1lbnRzW2luZGV4XTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRFbGVtZW50Py50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgaXRlbVxuICAgICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy5jdXJyZW50RWxlbWVudFsnZmllbGRzTWV0YSddLmZpbmRJbmRleChpdGVtID0+IGl0ZW1bJ2FwaU5hbWUnXSA9PT0gZXZlbnQ/LmNvbHVtbik7XG4gICAgICAvLyBSZW1vdmUgdGhlIGl0ZW0gaWYgZm91bmRcbiAgICAgIGlmIChpdGVtSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEVsZW1lbnRbJ2ZpZWxkc01ldGEnXS5zcGxpY2UoaXRlbUluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWxlY3RUYWJsZUNvbHVtbiA9IG51bGxcbiAgICB0aGlzLmVsZW1lbnRVcGRhdGUoIHRoaXMuY3VycmVudEVsZW1lbnQpXG4gIH1cbiAgLy8gU0tTMTlNQVIyNSBnZXQgdGhlIHNlbGVjdGVkIHRhYmxlIGNvbHVtblxuICBnZXRTZWxlY3RUYWJsZUNvbHVtbigpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RUYWJsZUNvbHVtbjtcbiAgfVxuICBzZWxlY3RIZWFkaW5nKGV2ZW50OiBhbnkpIHtcbiAgICAvL0FQLTEwTUFSMjUgRW1pdHMgdGhlIHNlbGVjdGVkIGhlYWRpbmcgZXZlbnQgIFxuICAgIHRoaXMuc2VsZWN0SGVhZGVyU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgfVxuXG4gIGdldEVsZW1lbnRzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5wZGZFbGVtZW50cy5tYXAoZWxlbWVudCA9PiAoe1xuICAgICAgLi4uZWxlbWVudFxuICAgIH0pKTtcbiAgfVxuICBzb3J0RWxlbWVudHNCeU9yZGVyKCk6IHZvaWQge1xuICAgIC8vQVAtMTBNQVIyNSBTb3J0IGVsZW1lbnRzIGJ5IGN1cnJlbnQgb3JkZXJcbiAgICB0aGlzLnBkZkVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IGEucXVlc3Rpb25OdW1iZXIgLSBiLnF1ZXN0aW9uTnVtYmVyKTtcbiAgICB0aGlzLnBkZkVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBlbGVtZW50LnF1ZXN0aW9uTnVtYmVyID0gaW5kZXggKyAxO1xuICAgIH0pO1xuICAgIHRoaXMucGRmRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMucGRmRWxlbWVudHNdKTtcbiAgfVxuICAvL0FQLTEwTUFSMjUgUmV0dXJucyB0aGUgY3VycmVudCBwZGYgZGF0YSAgXG4gIGdldEJvb2soKSB7XG4gICAgcmV0dXJuIHRoaXMucGRmO1xuICB9XG5cbmRvd25sb2FkRWxlbWVudCgpIHtcbiAgdGhpcy5wZGZFbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIC8vQVAtMDJKVU4yNSAtIFNldCBhIGRlZmF1bHQgdmFsdWUgZm9yICdkYXRlJyB0eXBlIGVsZW1lbnRzIGlmIG5vIHZhbHVlIGlzIHByb3ZpZGVkXG4gICAgLy8gY29uc3QgZGVmYXVsdERhdGUgPSAnZGF0ZSdcbiAgICAvLyBpZiAoZWxlbWVudC50eXBlID09PSAnJyAmJiAhZWxlbWVudC52YWx1ZSkge1xuICAgIC8vICAgIGVsZW1lbnQudmFsdWUgPSBkZWZhdWx0RGF0ZTsxMVxuICAgIC8vIH1cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAndGV4dCcgfHwgJ2lucHV0Jykge1xuICAgICAgLy8gZWxlbWVudC52YWx1ZSA9IChlbGVtZW50LnF1ZXN0aW9uIHx8IGVsZW1lbnQudmFsdWUgfHwgJycpLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQuc3ViVGV4dCAmJiB0eXBlb2YgZWxlbWVudC5zdWJUZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZWxlbWVudC5zdWJUZXh0ID0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudC5zdWJUZXh0KTtcbiAgICB9XG4gICAgLy8gaWYgKGVsZW1lbnQucGRmUmVmZXJlbmNlUXVlc3Rpb25zKSB7XG4gICAgLy8gICBkZWxldGUgZWxlbWVudC5wZGZSZWZlcmVuY2VRdWVzdGlvbnM7XG4gICAgLy8gfVxuICB9KTtcblxuICB0aGlzLnBkZlt0aGlzLnVuaXF1ZV9pZF0gPSB0aGlzLnBkZkVsZW1lbnRzO1xuICB0aGlzLnBkZlsncGRmSnNvbiddID0gdGhpcy5jb252ZXJ0VG9QZGZMYXlvdXQodGhpcy5wZGYpO1xuXG4gIC8vIFNjYWxlIHdpZHRocyBmb3IgY29sdW1uc1xuICB0aGlzLnBkZj8ucGRmSnNvbj8uY29udGVudD8uZm9yRWFjaCgocm93OiBhbnkpID0+IHtcbiAgICByb3cuY29sdW1ucz8uZm9yRWFjaCgoY29sOiBhbnkpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgY29sLndpZHRoID09PSAnbnVtYmVyJyAmJiBjb2wud2lkdGggPCA1MjApIHtcbiAgICAgICAgY29sLndpZHRoID0gY29sLndpZHRoICogNS4yO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBjb25zb2xlLmxvZygncGRmJywgdGhpcy5wZGYucGRmSnNvbik7XG4gIHJldHVybiB0aGlzLnBkZjtcbn1cblxuY29udmVydFRvUGRmTGF5b3V0KGlucHV0OiBhbnkpOiBhbnkge1xuICBjb25zdCByZXN1bHQgPSB7IGNvbnRlbnQ6IFtdIH07XG4gIGNvbnN0IGl0ZW1zID0gaW5wdXRbdGhpcy51bmlxdWVfaWRdO1xuICBjb25zdCBwcm9jZXNzSXRlbXMgPSAoaXRlbXM6IGFueVtdKTogYW55W10gPT4ge1xuICAgIGNvbnN0IHJvd3MgPSBbXTtcbiAgICBsZXQgY3VycmVudFJvdyA9IHsgY29sdW1uczogW10gfTtcbiAgICBsZXQgY3VycmVudFdpZHRoID0gMDtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgY29uc3Qgd2lkdGggPSBpdGVtLndpZHRoIHx8IDEwMDtcbiAgICAgIGxldCBlbGVtZW50OiBhbnkgPSB7IHdpZHRoLCBcIm1hcmdpblwiOiBbMCwgMTAsIDAsIDEwXSx9O1xuXG4gICAgICBpZiAoY3VycmVudFdpZHRoICsgd2lkdGggPiAxMDApIHtcbiAgICAgICAgcm93cy5wdXNoKGN1cnJlbnRSb3cpO1xuICAgICAgICBjdXJyZW50Um93ID0geyBjb2x1bW5zOiBbXSB9O1xuICAgICAgICBjdXJyZW50V2lkdGggPSAwO1xuICAgICAgfSAgICAgXG4gICAgICBpZiAoaXRlbS50eXBlID09PSBcIlNwYWNlXCIpIHtcbiAgICAgICAgY3VycmVudFJvdy5jb2x1bW5zLnB1c2goeyB3aWR0aCwgdGV4dDogJyd9KTtcblxuICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdMaW5lJykge1xuICAgICAgICBlbGVtZW50LmNhbnZhcyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgICAgICB4MTogaXRlbS54MSA/PyAwLFxuICAgICAgICAgICAgeTE6IGl0ZW0ueTEgPz8gMCxcbiAgICAgICAgICAgIHgyOiBpdGVtLngyID8/IDUyMCxcbiAgICAgICAgICAgIHkyOiBpdGVtLnkyID8/IDAsXG4gICAgICAgICAgICBsaW5lV2lkdGg6IGl0ZW0ubGluZVdpZHRoID8/IDEsXG4gICAgICAgICAgICBsaW5lQ29sb3I6IGl0ZW0ubGluZUNvbG9yID8/ICcjMDAwMDAwJywgIFxuICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICAgICAgY3VycmVudFJvdy5jb2x1bW5zLnB1c2goZWxlbWVudCwpO1xuXG4gICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJQZGZcIiAmJiBpdGVtLnBkZlJlZmVyZW5jZVF1ZXN0aW9ucykge1xuICAgICAgICBjb25zdCBuZXN0ZWRRdWVzdGlvbnMgPSBpdGVtLnBkZlJlZmVyZW5jZVF1ZXN0aW9uc1tpdGVtLnBkZlJlZmVyZW5jZV07XG4gICAgICAgIGNvbnN0IG5lc3RlZENvbnRlbnQgPSBwcm9jZXNzSXRlbXMobmVzdGVkUXVlc3Rpb25zKTsgLy8gcmVjdXJzaXZlIHByb2Nlc3NpbmdcbiAgICAgICAgY3VycmVudFJvdy5jb2x1bW5zLnB1c2goIG5lc3RlZENvbnRlbnQpO1xuICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdUYWJsZScpIHtcbiAgICAgICAgbGV0IHN1bW1hcnlSb3dQb3NpdGlvbiA9IDA7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29sdW1ucyA9IGl0ZW0uZmllbGRzTWV0YSB8fCBbXTtcbiAgICAgICAgY29uc3QgbWFpbkNvbHVtbnMgPSB0YWJsZUNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uc3VtbWFyeVJvdyAhPT0gdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlSb3cgPSB0YWJsZUNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uc3VtbWFyeVJvdyA9PT0gdHJ1ZSk7XG4gICAgICAgIHRhYmxlQ29sdW1ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50LmNvbHVtbikge1xuICAgICAgICAgICAgbWFpbkNvbHVtbnMuZm9yRWFjaCgobUNvbCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY29sdW1uID09PSBtQ29sLmFwaU5hbWUpIHtcbiAgICAgICAgICAgICAgICBzdW1tYXJ5Um93UG9zaXRpb24gPSBpbmRleDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTsgICAgICAgIFxuICAgICAgICBjb25zdCBib2R5OiBhbnlbXVtdID0gW107XG5cbiAgICAgICAgLy8gVGFibGUgaGVhZGVyc1xuICAgICAgICBib2R5LnB1c2gobWFpbkNvbHVtbnMubWFwKGNvbCA9PiAoe1xuICAgICAgICAgIHRleHQ6IGNvbC5sYWJlbCxzdHlsZTppdGVtLnN0eWxlQ2xhc3NcbiAgICAgICAgfSkpKTtcblxuICAgICAgICAvLyBUYWJsZSBkYXRhXG4gICAgICAgIGl0ZW0/LnZhbHVlPy5kYXRhPy5mb3JFYWNoKHRhYmxlRGF0YSA9PiB7XG4gICAgICAgICAgYm9keS5wdXNoKFxuICAgICAgICAgICAgbWFpbkNvbHVtbnMubWFwKGNvbCA9PiAoe1xuICAgICAgICAgICAgICB0ZXh0OiB0YWJsZURhdGFbY29sLmFwaU5hbWVdXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSkpXG4gIC