@smartbit4all/ng-client 6.0.31 → 6.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1031,11 +1031,11 @@ export class SmartGridComponent {
1031
1031
  return arr;
1032
1032
  }
1033
1033
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartGridComponent, deps: [{ token: i1.SmartGridService }, { token: i2.ComponentFactoryService }, { token: i3.MatDialog }, { token: i0.Injector }, { token: i4.UiActionDescriptorService }, { token: i5.SmartDatePipe }, { token: i5.SmartDateTimePipe }, { token: i5.SmartTimePipe }, { token: COMPONENT_LIBRARY }, { token: 'gridMenuIcon' }], target: i0.ɵɵFactoryTarget.Component }); }
1034
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SmartGridComponent, selector: "smart-grid", inputs: { smartGrid: "smartGrid", uuid: "uuid", parent: "parent", parentLayoutComponent: "parentLayoutComponent", dev: "dev" }, host: { properties: { "attr.data-testid": "this.testId" } }, providers: [SmartGridService, SmartDatePipe, SmartDateTimePipe, SmartTimePipe], viewQueries: [{ propertyName: "vcRefTable", first: true, predicate: ["table"], descendants: true, read: ViewContainerRef }, { propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "_headerToolbar", first: true, predicate: ["headerToolbar"], descendants: true }, { propertyName: "menu", first: true, predicate: ["menu"], descendants: true }, { propertyName: "expandedRowsComps", predicate: ExpandedRowRendererComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (compLib === componentLibrary.PRIMENG) {\r\n <div *ngIf=\"smartGrid\" class=\"primeSmartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n </div>\r\n <p-table\r\n *ngIf=\"!smartGrid.layoutDef || smartGrid.layoutDef === layoutDef().TABLE\"\r\n #pTable\r\n [value]=\"smartGrid.gridModel.page.rows!\"\r\n (onSort)=\"gridSort($event)\"\r\n [customSort]=\"true\"\r\n [sortMode]=\"'multiple'\"\r\n [lazy]=\"true\"\r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n [reorderableColumns]=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\"\r\n [columns]=\"columns\"\r\n (onColReorder)=\"onColOrder($event)\"\r\n (onRowSelect)=\"onRowSelect($event)\"\r\n (onRowUnselect)=\"onRowUnselect($event)\"\r\n [selection]=\"selectedRows\"\r\n (onHeaderCheckboxToggle)=\"onSelectAllRow($event)\"\r\n dataKey=\"id\"\r\n [expandedRowKeys]=\"expandedRows\"\r\n [rowExpandMode]=\"'multiple'\"\r\n [rowTrackBy]=\"rowTrackByFn\"\r\n >\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"tableCaption\">\r\n <div *ngIf=\"smartGrid.gridModel.title\" class=\"captionTitle\">\r\n {{ smartGrid.gridModel.title }}\r\n </div>\r\n <div *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <p-multiSelect\r\n display=\"chip\"\r\n [options]=\"smartGrid.gridModel.view?.descriptor?.columns\"\r\n optionLabel=\"label\"\r\n [(ngModel)]=\"columns\"\r\n selectedItemsLabel=\"{0} columns selected\"\r\n [style]=\"{ 'min-width': '200px' }\"\r\n placeholder=\"Choose Columns\"\r\n (onChange)=\"headerChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n @if (smartGrid.gridModel.view?.descriptor?.showEditColumns) {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n pReorderableColumn\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n } @else {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n }\r\n\r\n <th>\r\n <smart-ui-action-toolbar\r\n class=\"headerToolbar\"\r\n #headerToolbar\r\n [id]=\"'header_not_initialized'\"\r\n ></smart-ui-action-toolbar>\r\n </th>\r\n <th *ngIf=\"smartGrid.expandable\"> </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-row let-expanded=\"expanded\">\r\n <tr\r\n [ngClass]=\"getStyle(row)\"\r\n [class.rowExpanded]=\"expanded\"\r\n (dblclick)=\"onDoubleClick(row)\"\r\n *ngIf=\"row && row.data\"\r\n [attr.data-testid]=\"row.id ?? null\"\r\n >\r\n <td *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableCheckbox *ngIf=\"row.selectable != false\" [value]=\"row\" />\r\n </td>\r\n <td *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableRadioButton [value]=\"row\" />\r\n </td>\r\n <td *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\r\n <div *ngIf=\"row.icons[col]\">\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(row, col)\">\r\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showCellToolbar(row, col)\">\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, col)\"\r\n ></smart-ui-action-toolbar>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!row.icons[col]\" [innerHtml]=\"getColValue(col, row)\"> </div>\r\n </td>\r\n <td>\r\n <div class=\"menu-button\">\r\n @if (showCellToolbar(row, defaultActionToolbarId)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, defaultActionToolbarId)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n @if (shouldShowOptionsButton(row)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowMenuActionModelArray(row)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </div>\r\n </td>\r\n <td *ngIf=\"smartGrid.expandable\">\r\n <p-button\r\n type=\"button\"\r\n pRipple\r\n [pRowToggler]=\"row\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n [rounded]=\"true\"\r\n [icon]=\"expanded ? 'pi pi-chevron-up' : 'pi pi-chevron-down'\"\r\n />\r\n </td>\r\n </tr>\r\n </ng-template>\r\n @if (smartGrid.expandable) {\r\n <ng-template pTemplate=\"rowexpansion\" let-row>\r\n <tr>\r\n <td colspan=\"100%\">\r\n <lib-expanded-row-renderer-component\r\n [rowId]=\"row.id\"\r\n [rowExpander]=\"this\"\r\n [expandedComponent]=\"smartGrid.expandedComponent\"\r\n [smartGrid]=\"this.smartGrid\"\r\n ></lib-expanded-row-renderer-component>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n }\r\n </p-table>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n (click)=\"onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row\">\r\n <div class=\"paginator-wrap\">\r\n <p-paginator\r\n [first]=\"pageIndex!\"\r\n [totalRecords]=\"length!\"\r\n [rows]=\"pageSize\"\r\n [rowsPerPageOptions]=\"pageSizeOptions\"\r\n currentPageReportTemplate=\"{first} - {last} / {totalRecords}\"\r\n (onPageChange)=\"onPrimeChangePage($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n dropdownAppendTo=\"body\"\r\n ></p-paginator>\r\n </div>\r\n\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n </div>\r\n <p-menu #menu [model]=\"menuButtons\" [popup]=\"true\" appendTo=\"body\"> </p-menu>\r\n </div>\r\n} @else {\r\n <div *ngIf=\"smartGrid\" class=\"smartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n <button\r\n (click)=\"editColumns()\"\r\n mat-mini-fab\r\n color=\"text-primary\"\r\n *ngIf=\"smartGrid.showEditColumns\"\r\n >\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Columns\" class=\"smart-grid-edit-icon\"\r\n >view_columns</mat-icon\r\n >\r\n </button>\r\n </div>\r\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\r\n <div class=\"smartGridContent\">\r\n <div>\r\n <div *ngIf=\"smartGrid.showResultCount\">\r\n <div class=\"smartGrid-data-number\">\r\n {{ smartGrid.gridModel.totalRowCount }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"smart-grid-table-container\">\r\n <ng-template #table></ng-template>\r\n </div>\r\n\r\n <div *ngIf=\"smartGrid.layoutDef === layoutDef().EXPANDABLE\">\r\n <smart-expandable-section\r\n #gridExpandableSection\r\n *ngFor=\"let expandableSection of expandableSections\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n (click)=\"onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().TREE && treeControl\"\r\n class=\"tree-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodeToggle\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button mat-icon-button disabled class=\"tree-button\"></button>\r\n <mat-checkbox\r\n class=\"checklist-leaf-node\"\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n class=\"tree-button\"\r\n [attr.aria-label]=\"'Toggle ' + node.item\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n [indeterminate]=\"descendantsPartiallySelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row-material\">\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n <mat-paginator\r\n *ngIf=\"smartGrid.paginator && !treeControl\"\r\n #paginator\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n (page)=\"onChangePage($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.primeSmartGrid-container{display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.menu-button{display:flex;flex-direction:row;justify-content:flex-end;text-align:-webkit-right;align-items:center}.headerToolbar ::ng-deep .uiActionButtonsContainer{justify-content:flex-end}.tableCaption{display:flex;flex-direction:row;justify-content:space-between}.tableCaption:has(*){padding:.5rem;border-top:1px solid #e9ecef;border-bottom:1px solid #e9ecef}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th,:host ::ng-deep .p-datatable .p-datatable-header{padding:.5rem}.captionTitle{font-size:1.5rem;align-content:center}:host ::ng-deep .p-datatable-header:has(.tableCaption){padding:0;border:unset}.paginator-row{display:flex;align-items:center;align-self:center;gap:.25rem}.paginator-row-material{display:flex;align-items:center;align-self:flex-end;gap:.25rem}.paginator-wrap{flex:0 0 auto;min-width:0}:host ::ng-deep .paginator-wrap .p-paginator{width:auto}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i7.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i9.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: i11.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i11.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i11.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i11.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i11.MatTreeNode, selector: "mat-tree-node", inputs: ["disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "component", type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i13.ExpandableSectionComponent, selector: "smart-expandable-section", inputs: ["data", "index"] }, { kind: "component", type: i14.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "directive", type: i15.ComparableMultiselectDirective, selector: "p-multiSelect", inputs: ["compareWith"] }, { kind: "component", type: i16.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i17.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i16.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i16.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i16.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i16.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i16.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i16.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i16.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i18.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i18.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i19.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "directive", type: i20.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i21.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "directive", type: i22.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i22.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i23.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i24.SmartGridCardComponent, selector: "app-smart-grid-card", inputs: ["item", "smartGrid", "parent", "parentLayoutComponent"] }, { kind: "component", type: i25.ExpandedRowRendererComponent, selector: "lib-expanded-row-renderer-component", inputs: ["rowId", "rowExpander", "expandedComponent", "smartGrid"] }] }); }
1034
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SmartGridComponent, selector: "smart-grid", inputs: { smartGrid: "smartGrid", uuid: "uuid", parent: "parent", parentLayoutComponent: "parentLayoutComponent", dev: "dev" }, host: { properties: { "attr.data-testid": "this.testId" } }, providers: [SmartGridService, SmartDatePipe, SmartDateTimePipe, SmartTimePipe], viewQueries: [{ propertyName: "vcRefTable", first: true, predicate: ["table"], descendants: true, read: ViewContainerRef }, { propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "_headerToolbar", first: true, predicate: ["headerToolbar"], descendants: true }, { propertyName: "menu", first: true, predicate: ["menu"], descendants: true }, { propertyName: "expandedRowsComps", predicate: ExpandedRowRendererComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (compLib === componentLibrary.PRIMENG) {\r\n <div *ngIf=\"smartGrid\" class=\"primeSmartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n </div>\r\n <p-table\r\n *ngIf=\"!smartGrid.layoutDef || smartGrid.layoutDef === layoutDef().TABLE\"\r\n #pTable\r\n [value]=\"smartGrid.gridModel.page.rows!\"\r\n (onSort)=\"gridSort($event)\"\r\n [customSort]=\"true\"\r\n [sortMode]=\"'multiple'\"\r\n [lazy]=\"true\"\r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n [reorderableColumns]=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\"\r\n [columns]=\"columns\"\r\n (onColReorder)=\"onColOrder($event)\"\r\n (onRowSelect)=\"onRowSelect($event)\"\r\n (onRowUnselect)=\"onRowUnselect($event)\"\r\n [selection]=\"selectedRows\"\r\n (onHeaderCheckboxToggle)=\"onSelectAllRow($event)\"\r\n dataKey=\"id\"\r\n [expandedRowKeys]=\"expandedRows\"\r\n [rowExpandMode]=\"'multiple'\"\r\n [rowTrackBy]=\"rowTrackByFn\"\r\n >\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"tableCaption\">\r\n <div *ngIf=\"smartGrid.gridModel.title\" class=\"captionTitle\">\r\n {{ smartGrid.gridModel.title }}\r\n </div>\r\n <div *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <p-multiSelect\r\n display=\"chip\"\r\n [options]=\"smartGrid.gridModel.view?.descriptor?.columns\"\r\n optionLabel=\"label\"\r\n [(ngModel)]=\"columns\"\r\n selectedItemsLabel=\"{0} columns selected\"\r\n [style]=\"{ 'min-width': '200px' }\"\r\n placeholder=\"Choose Columns\"\r\n (onChange)=\"headerChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n @if (smartGrid.gridModel.view?.descriptor?.showEditColumns) {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n pReorderableColumn\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n } @else {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n }\r\n\r\n <th>\r\n <smart-ui-action-toolbar\r\n class=\"headerToolbar\"\r\n #headerToolbar\r\n [id]=\"'header_not_initialized'\"\r\n ></smart-ui-action-toolbar>\r\n </th>\r\n <th *ngIf=\"smartGrid.expandable\"> </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-row let-expanded=\"expanded\">\r\n <tr\r\n [ngClass]=\"getStyle(row)\"\r\n [class.rowExpanded]=\"expanded\"\r\n (dblclick)=\"onDoubleClick(row)\"\r\n *ngIf=\"row && row.data\"\r\n [attr.data-testid]=\"row.id ?? null\"\r\n >\r\n <td *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableCheckbox *ngIf=\"row.selectable != false\" [value]=\"row\" />\r\n </td>\r\n <td *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableRadioButton [value]=\"row\" />\r\n </td>\r\n <td *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\r\n <div *ngIf=\"row.icons[col]\">\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(row, col)\">\r\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showCellToolbar(row, col)\">\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, col)\"\r\n ></smart-ui-action-toolbar>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!row.icons[col]\" [innerHtml]=\"getColValue(col, row)\"> </div>\r\n </td>\r\n <td>\r\n <div class=\"menu-button\">\r\n @if (showCellToolbar(row, defaultActionToolbarId)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, defaultActionToolbarId)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n @if (shouldShowOptionsButton(row)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowMenuActionModelArray(row)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </div>\r\n </td>\r\n <td *ngIf=\"smartGrid.expandable\">\r\n <p-button\r\n type=\"button\"\r\n pRipple\r\n [pRowToggler]=\"row\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n [rounded]=\"true\"\r\n [icon]=\"expanded ? 'pi pi-chevron-up' : 'pi pi-chevron-down'\"\r\n />\r\n </td>\r\n </tr>\r\n </ng-template>\r\n @if (smartGrid.expandable) {\r\n <ng-template pTemplate=\"rowexpansion\" let-row>\r\n <tr>\r\n <td colspan=\"100%\">\r\n <lib-expanded-row-renderer-component\r\n [rowId]=\"row.id\"\r\n [rowExpander]=\"this\"\r\n [expandedComponent]=\"smartGrid.expandedComponent\"\r\n [smartGrid]=\"this.smartGrid\"\r\n ></lib-expanded-row-renderer-component>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n }\r\n </p-table>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n [class.clickable-row]=\"row.layoutDescriptor\"\r\n (click)=\"row.layoutDescriptor && onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row\">\r\n <div class=\"paginator-wrap\">\r\n <p-paginator\r\n [first]=\"pageIndex!\"\r\n [totalRecords]=\"length!\"\r\n [rows]=\"pageSize\"\r\n [rowsPerPageOptions]=\"pageSizeOptions\"\r\n currentPageReportTemplate=\"{first} - {last} / {totalRecords}\"\r\n (onPageChange)=\"onPrimeChangePage($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n dropdownAppendTo=\"body\"\r\n ></p-paginator>\r\n </div>\r\n\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n </div>\r\n <p-menu #menu [model]=\"menuButtons\" [popup]=\"true\" appendTo=\"body\"> </p-menu>\r\n </div>\r\n} @else {\r\n <div *ngIf=\"smartGrid\" class=\"smartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n <button\r\n (click)=\"editColumns()\"\r\n mat-mini-fab\r\n color=\"text-primary\"\r\n *ngIf=\"smartGrid.showEditColumns\"\r\n >\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Columns\" class=\"smart-grid-edit-icon\"\r\n >view_columns</mat-icon\r\n >\r\n </button>\r\n </div>\r\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\r\n <div class=\"smartGridContent\">\r\n <div>\r\n <div *ngIf=\"smartGrid.showResultCount\">\r\n <div class=\"smartGrid-data-number\">\r\n {{ smartGrid.gridModel.totalRowCount }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"smart-grid-table-container\">\r\n <ng-template #table></ng-template>\r\n </div>\r\n\r\n <div *ngIf=\"smartGrid.layoutDef === layoutDef().EXPANDABLE\">\r\n <smart-expandable-section\r\n #gridExpandableSection\r\n *ngFor=\"let expandableSection of expandableSections\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n [class.clickable-row]=\"row.layoutDescriptor\"\r\n (click)=\"row.layoutDescriptor && onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().TREE && treeControl\"\r\n class=\"tree-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodeToggle\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button mat-icon-button disabled class=\"tree-button\"></button>\r\n <mat-checkbox\r\n class=\"checklist-leaf-node\"\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n class=\"tree-button\"\r\n [attr.aria-label]=\"'Toggle ' + node.item\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n [indeterminate]=\"descendantsPartiallySelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row-material\">\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n <mat-paginator\r\n *ngIf=\"smartGrid.paginator && !treeControl\"\r\n #paginator\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n (page)=\"onChangePage($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.primeSmartGrid-container{display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.menu-button{display:flex;flex-direction:row;justify-content:flex-end;text-align:-webkit-right;align-items:center}.headerToolbar ::ng-deep .uiActionButtonsContainer{justify-content:flex-end}.tableCaption{display:flex;flex-direction:row;justify-content:space-between}.tableCaption:has(*){padding:.5rem;border-top:1px solid #e9ecef;border-bottom:1px solid #e9ecef}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th,:host ::ng-deep .p-datatable .p-datatable-header{padding:.5rem}.captionTitle{font-size:1.5rem;align-content:center}:host ::ng-deep .p-datatable-header:has(.tableCaption){padding:0;border:unset}.paginator-row{display:flex;align-items:center;align-self:center;gap:.25rem}.paginator-row-material{display:flex;align-items:center;align-self:flex-end;gap:.25rem}.paginator-wrap{flex:0 0 auto;min-width:0}:host ::ng-deep .paginator-wrap .p-paginator{width:auto}.clickable-row{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i7.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i9.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: i11.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i11.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i11.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i11.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i11.MatTreeNode, selector: "mat-tree-node", inputs: ["disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "component", type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i13.ExpandableSectionComponent, selector: "smart-expandable-section", inputs: ["data", "index"] }, { kind: "component", type: i14.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "directive", type: i15.ComparableMultiselectDirective, selector: "p-multiSelect", inputs: ["compareWith"] }, { kind: "component", type: i16.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i17.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i16.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i16.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i16.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i16.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i16.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i16.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i16.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i18.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i18.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i19.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "directive", type: i20.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i21.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "directive", type: i22.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i22.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i23.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i24.SmartGridCardComponent, selector: "app-smart-grid-card", inputs: ["item", "smartGrid", "parent", "parentLayoutComponent"] }, { kind: "component", type: i25.ExpandedRowRendererComponent, selector: "lib-expanded-row-renderer-component", inputs: ["rowId", "rowExpander", "expandedComponent", "smartGrid"] }] }); }
1035
1035
  }
1036
1036
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartGridComponent, decorators: [{
1037
1037
  type: Component,
1038
- args: [{ selector: 'smart-grid', providers: [SmartGridService, SmartDatePipe, SmartDateTimePipe, SmartTimePipe], template: "@if (compLib === componentLibrary.PRIMENG) {\r\n <div *ngIf=\"smartGrid\" class=\"primeSmartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n </div>\r\n <p-table\r\n *ngIf=\"!smartGrid.layoutDef || smartGrid.layoutDef === layoutDef().TABLE\"\r\n #pTable\r\n [value]=\"smartGrid.gridModel.page.rows!\"\r\n (onSort)=\"gridSort($event)\"\r\n [customSort]=\"true\"\r\n [sortMode]=\"'multiple'\"\r\n [lazy]=\"true\"\r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n [reorderableColumns]=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\"\r\n [columns]=\"columns\"\r\n (onColReorder)=\"onColOrder($event)\"\r\n (onRowSelect)=\"onRowSelect($event)\"\r\n (onRowUnselect)=\"onRowUnselect($event)\"\r\n [selection]=\"selectedRows\"\r\n (onHeaderCheckboxToggle)=\"onSelectAllRow($event)\"\r\n dataKey=\"id\"\r\n [expandedRowKeys]=\"expandedRows\"\r\n [rowExpandMode]=\"'multiple'\"\r\n [rowTrackBy]=\"rowTrackByFn\"\r\n >\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"tableCaption\">\r\n <div *ngIf=\"smartGrid.gridModel.title\" class=\"captionTitle\">\r\n {{ smartGrid.gridModel.title }}\r\n </div>\r\n <div *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <p-multiSelect\r\n display=\"chip\"\r\n [options]=\"smartGrid.gridModel.view?.descriptor?.columns\"\r\n optionLabel=\"label\"\r\n [(ngModel)]=\"columns\"\r\n selectedItemsLabel=\"{0} columns selected\"\r\n [style]=\"{ 'min-width': '200px' }\"\r\n placeholder=\"Choose Columns\"\r\n (onChange)=\"headerChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n @if (smartGrid.gridModel.view?.descriptor?.showEditColumns) {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n pReorderableColumn\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n } @else {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n }\r\n\r\n <th>\r\n <smart-ui-action-toolbar\r\n class=\"headerToolbar\"\r\n #headerToolbar\r\n [id]=\"'header_not_initialized'\"\r\n ></smart-ui-action-toolbar>\r\n </th>\r\n <th *ngIf=\"smartGrid.expandable\"> </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-row let-expanded=\"expanded\">\r\n <tr\r\n [ngClass]=\"getStyle(row)\"\r\n [class.rowExpanded]=\"expanded\"\r\n (dblclick)=\"onDoubleClick(row)\"\r\n *ngIf=\"row && row.data\"\r\n [attr.data-testid]=\"row.id ?? null\"\r\n >\r\n <td *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableCheckbox *ngIf=\"row.selectable != false\" [value]=\"row\" />\r\n </td>\r\n <td *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableRadioButton [value]=\"row\" />\r\n </td>\r\n <td *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\r\n <div *ngIf=\"row.icons[col]\">\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(row, col)\">\r\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showCellToolbar(row, col)\">\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, col)\"\r\n ></smart-ui-action-toolbar>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!row.icons[col]\" [innerHtml]=\"getColValue(col, row)\"> </div>\r\n </td>\r\n <td>\r\n <div class=\"menu-button\">\r\n @if (showCellToolbar(row, defaultActionToolbarId)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, defaultActionToolbarId)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n @if (shouldShowOptionsButton(row)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowMenuActionModelArray(row)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </div>\r\n </td>\r\n <td *ngIf=\"smartGrid.expandable\">\r\n <p-button\r\n type=\"button\"\r\n pRipple\r\n [pRowToggler]=\"row\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n [rounded]=\"true\"\r\n [icon]=\"expanded ? 'pi pi-chevron-up' : 'pi pi-chevron-down'\"\r\n />\r\n </td>\r\n </tr>\r\n </ng-template>\r\n @if (smartGrid.expandable) {\r\n <ng-template pTemplate=\"rowexpansion\" let-row>\r\n <tr>\r\n <td colspan=\"100%\">\r\n <lib-expanded-row-renderer-component\r\n [rowId]=\"row.id\"\r\n [rowExpander]=\"this\"\r\n [expandedComponent]=\"smartGrid.expandedComponent\"\r\n [smartGrid]=\"this.smartGrid\"\r\n ></lib-expanded-row-renderer-component>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n }\r\n </p-table>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n (click)=\"onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row\">\r\n <div class=\"paginator-wrap\">\r\n <p-paginator\r\n [first]=\"pageIndex!\"\r\n [totalRecords]=\"length!\"\r\n [rows]=\"pageSize\"\r\n [rowsPerPageOptions]=\"pageSizeOptions\"\r\n currentPageReportTemplate=\"{first} - {last} / {totalRecords}\"\r\n (onPageChange)=\"onPrimeChangePage($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n dropdownAppendTo=\"body\"\r\n ></p-paginator>\r\n </div>\r\n\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n </div>\r\n <p-menu #menu [model]=\"menuButtons\" [popup]=\"true\" appendTo=\"body\"> </p-menu>\r\n </div>\r\n} @else {\r\n <div *ngIf=\"smartGrid\" class=\"smartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n <button\r\n (click)=\"editColumns()\"\r\n mat-mini-fab\r\n color=\"text-primary\"\r\n *ngIf=\"smartGrid.showEditColumns\"\r\n >\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Columns\" class=\"smart-grid-edit-icon\"\r\n >view_columns</mat-icon\r\n >\r\n </button>\r\n </div>\r\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\r\n <div class=\"smartGridContent\">\r\n <div>\r\n <div *ngIf=\"smartGrid.showResultCount\">\r\n <div class=\"smartGrid-data-number\">\r\n {{ smartGrid.gridModel.totalRowCount }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"smart-grid-table-container\">\r\n <ng-template #table></ng-template>\r\n </div>\r\n\r\n <div *ngIf=\"smartGrid.layoutDef === layoutDef().EXPANDABLE\">\r\n <smart-expandable-section\r\n #gridExpandableSection\r\n *ngFor=\"let expandableSection of expandableSections\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n (click)=\"onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().TREE && treeControl\"\r\n class=\"tree-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodeToggle\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button mat-icon-button disabled class=\"tree-button\"></button>\r\n <mat-checkbox\r\n class=\"checklist-leaf-node\"\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n class=\"tree-button\"\r\n [attr.aria-label]=\"'Toggle ' + node.item\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n [indeterminate]=\"descendantsPartiallySelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row-material\">\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n <mat-paginator\r\n *ngIf=\"smartGrid.paginator && !treeControl\"\r\n #paginator\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n (page)=\"onChangePage($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.primeSmartGrid-container{display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.menu-button{display:flex;flex-direction:row;justify-content:flex-end;text-align:-webkit-right;align-items:center}.headerToolbar ::ng-deep .uiActionButtonsContainer{justify-content:flex-end}.tableCaption{display:flex;flex-direction:row;justify-content:space-between}.tableCaption:has(*){padding:.5rem;border-top:1px solid #e9ecef;border-bottom:1px solid #e9ecef}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th,:host ::ng-deep .p-datatable .p-datatable-header{padding:.5rem}.captionTitle{font-size:1.5rem;align-content:center}:host ::ng-deep .p-datatable-header:has(.tableCaption){padding:0;border:unset}.paginator-row{display:flex;align-items:center;align-self:center;gap:.25rem}.paginator-row-material{display:flex;align-items:center;align-self:flex-end;gap:.25rem}.paginator-wrap{flex:0 0 auto;min-width:0}:host ::ng-deep .paginator-wrap .p-paginator{width:auto}\n"] }]
1038
+ args: [{ selector: 'smart-grid', providers: [SmartGridService, SmartDatePipe, SmartDateTimePipe, SmartTimePipe], template: "@if (compLib === componentLibrary.PRIMENG) {\r\n <div *ngIf=\"smartGrid\" class=\"primeSmartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n </div>\r\n <p-table\r\n *ngIf=\"!smartGrid.layoutDef || smartGrid.layoutDef === layoutDef().TABLE\"\r\n #pTable\r\n [value]=\"smartGrid.gridModel.page.rows!\"\r\n (onSort)=\"gridSort($event)\"\r\n [customSort]=\"true\"\r\n [sortMode]=\"'multiple'\"\r\n [lazy]=\"true\"\r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n [reorderableColumns]=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\"\r\n [columns]=\"columns\"\r\n (onColReorder)=\"onColOrder($event)\"\r\n (onRowSelect)=\"onRowSelect($event)\"\r\n (onRowUnselect)=\"onRowUnselect($event)\"\r\n [selection]=\"selectedRows\"\r\n (onHeaderCheckboxToggle)=\"onSelectAllRow($event)\"\r\n dataKey=\"id\"\r\n [expandedRowKeys]=\"expandedRows\"\r\n [rowExpandMode]=\"'multiple'\"\r\n [rowTrackBy]=\"rowTrackByFn\"\r\n >\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"tableCaption\">\r\n <div *ngIf=\"smartGrid.gridModel.title\" class=\"captionTitle\">\r\n {{ smartGrid.gridModel.title }}\r\n </div>\r\n <div *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <p-multiSelect\r\n display=\"chip\"\r\n [options]=\"smartGrid.gridModel.view?.descriptor?.columns\"\r\n optionLabel=\"label\"\r\n [(ngModel)]=\"columns\"\r\n selectedItemsLabel=\"{0} columns selected\"\r\n [style]=\"{ 'min-width': '200px' }\"\r\n placeholder=\"Choose Columns\"\r\n (onChange)=\"headerChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n @if (smartGrid.gridModel.view?.descriptor?.showEditColumns) {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n pReorderableColumn\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n } @else {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n }\r\n\r\n <th>\r\n <smart-ui-action-toolbar\r\n class=\"headerToolbar\"\r\n #headerToolbar\r\n [id]=\"'header_not_initialized'\"\r\n ></smart-ui-action-toolbar>\r\n </th>\r\n <th *ngIf=\"smartGrid.expandable\"> </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-row let-expanded=\"expanded\">\r\n <tr\r\n [ngClass]=\"getStyle(row)\"\r\n [class.rowExpanded]=\"expanded\"\r\n (dblclick)=\"onDoubleClick(row)\"\r\n *ngIf=\"row && row.data\"\r\n [attr.data-testid]=\"row.id ?? null\"\r\n >\r\n <td *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableCheckbox *ngIf=\"row.selectable != false\" [value]=\"row\" />\r\n </td>\r\n <td *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableRadioButton [value]=\"row\" />\r\n </td>\r\n <td *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\r\n <div *ngIf=\"row.icons[col]\">\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(row, col)\">\r\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showCellToolbar(row, col)\">\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, col)\"\r\n ></smart-ui-action-toolbar>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!row.icons[col]\" [innerHtml]=\"getColValue(col, row)\"> </div>\r\n </td>\r\n <td>\r\n <div class=\"menu-button\">\r\n @if (showCellToolbar(row, defaultActionToolbarId)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, defaultActionToolbarId)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n @if (shouldShowOptionsButton(row)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowMenuActionModelArray(row)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </div>\r\n </td>\r\n <td *ngIf=\"smartGrid.expandable\">\r\n <p-button\r\n type=\"button\"\r\n pRipple\r\n [pRowToggler]=\"row\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n [rounded]=\"true\"\r\n [icon]=\"expanded ? 'pi pi-chevron-up' : 'pi pi-chevron-down'\"\r\n />\r\n </td>\r\n </tr>\r\n </ng-template>\r\n @if (smartGrid.expandable) {\r\n <ng-template pTemplate=\"rowexpansion\" let-row>\r\n <tr>\r\n <td colspan=\"100%\">\r\n <lib-expanded-row-renderer-component\r\n [rowId]=\"row.id\"\r\n [rowExpander]=\"this\"\r\n [expandedComponent]=\"smartGrid.expandedComponent\"\r\n [smartGrid]=\"this.smartGrid\"\r\n ></lib-expanded-row-renderer-component>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n }\r\n </p-table>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n [class.clickable-row]=\"row.layoutDescriptor\"\r\n (click)=\"row.layoutDescriptor && onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row\">\r\n <div class=\"paginator-wrap\">\r\n <p-paginator\r\n [first]=\"pageIndex!\"\r\n [totalRecords]=\"length!\"\r\n [rows]=\"pageSize\"\r\n [rowsPerPageOptions]=\"pageSizeOptions\"\r\n currentPageReportTemplate=\"{first} - {last} / {totalRecords}\"\r\n (onPageChange)=\"onPrimeChangePage($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n dropdownAppendTo=\"body\"\r\n ></p-paginator>\r\n </div>\r\n\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n </div>\r\n <p-menu #menu [model]=\"menuButtons\" [popup]=\"true\" appendTo=\"body\"> </p-menu>\r\n </div>\r\n} @else {\r\n <div *ngIf=\"smartGrid\" class=\"smartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n <button\r\n (click)=\"editColumns()\"\r\n mat-mini-fab\r\n color=\"text-primary\"\r\n *ngIf=\"smartGrid.showEditColumns\"\r\n >\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Columns\" class=\"smart-grid-edit-icon\"\r\n >view_columns</mat-icon\r\n >\r\n </button>\r\n </div>\r\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\r\n <div class=\"smartGridContent\">\r\n <div>\r\n <div *ngIf=\"smartGrid.showResultCount\">\r\n <div class=\"smartGrid-data-number\">\r\n {{ smartGrid.gridModel.totalRowCount }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"smart-grid-table-container\">\r\n <ng-template #table></ng-template>\r\n </div>\r\n\r\n <div *ngIf=\"smartGrid.layoutDef === layoutDef().EXPANDABLE\">\r\n <smart-expandable-section\r\n #gridExpandableSection\r\n *ngFor=\"let expandableSection of expandableSections\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n [class.clickable-row]=\"row.layoutDescriptor\"\r\n (click)=\"row.layoutDescriptor && onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().TREE && treeControl\"\r\n class=\"tree-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodeToggle\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button mat-icon-button disabled class=\"tree-button\"></button>\r\n <mat-checkbox\r\n class=\"checklist-leaf-node\"\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n class=\"tree-button\"\r\n [attr.aria-label]=\"'Toggle ' + node.item\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n [indeterminate]=\"descendantsPartiallySelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row-material\">\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n <mat-paginator\r\n *ngIf=\"smartGrid.paginator && !treeControl\"\r\n #paginator\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n (page)=\"onChangePage($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.primeSmartGrid-container{display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.menu-button{display:flex;flex-direction:row;justify-content:flex-end;text-align:-webkit-right;align-items:center}.headerToolbar ::ng-deep .uiActionButtonsContainer{justify-content:flex-end}.tableCaption{display:flex;flex-direction:row;justify-content:space-between}.tableCaption:has(*){padding:.5rem;border-top:1px solid #e9ecef;border-bottom:1px solid #e9ecef}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th,:host ::ng-deep .p-datatable .p-datatable-header{padding:.5rem}.captionTitle{font-size:1.5rem;align-content:center}:host ::ng-deep .p-datatable-header:has(.tableCaption){padding:0;border:unset}.paginator-row{display:flex;align-items:center;align-self:center;gap:.25rem}.paginator-row-material{display:flex;align-items:center;align-self:flex-end;gap:.25rem}.paginator-wrap{flex:0 0 auto;min-width:0}:host ::ng-deep .paginator-wrap .p-paginator{width:auto}.clickable-row{cursor:pointer}\n"] }]
1039
1039
  }], ctorParameters: () => [{ type: i1.SmartGridService }, { type: i2.ComponentFactoryService }, { type: i3.MatDialog }, { type: i0.Injector }, { type: i4.UiActionDescriptorService }, { type: i5.SmartDatePipe }, { type: i5.SmartDateTimePipe }, { type: i5.SmartTimePipe }, { type: i4.ComponentLibrary, decorators: [{
1040
1040
  type: Inject,
1041
1041
  args: [COMPONENT_LIBRARY]
@@ -1071,4 +1071,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
1071
1071
  type: ViewChild,
1072
1072
  args: ['menu']
1073
1073
  }] } });
1074
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1ncmlkL3NtYXJ0LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtZ3JpZC9zbWFydC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUVMLFNBQVMsRUFFVCxXQUFXLEVBQ1gsTUFBTSxFQUVOLEtBQUssRUFNTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsVUFBVSxFQUNWLG9CQUFvQixFQUVwQiw0QkFBNEIsRUFFNUIsMkJBQTJCLEVBQzNCLGVBQWUsRUFDZixjQUFjLEVBQ2QsbUJBQW1CLEdBQ3BCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUdMLGtCQUFrQixHQUVuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZ0JBQWdCLEdBSWpCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUdMLGlCQUFpQixFQUNqQixpQkFBaUIsRUFFakIsMEJBQTBCLEdBQzNCLE1BQU0sZ0JBQWdCLENB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QUFpQixhQUNqQixjQUFjO21HQXZFYixrQkFBa0Isa09BRmxCLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsQ0FBQywwR0FtQmxELGdCQUFnQiwwVEFVOUIsNEJBQTRCLHFFQ3BINUMsZzFhQXlWQTs7NEZEaFFhLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDRSxZQUFZLGFBR1gsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxDQUFDOzswQkF3RTNFLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxjQUFjO3lDQWxFZixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdGLE1BQU07c0JBRFQsV0FBVzt1QkFBQyxrQkFBa0I7Z0JBSXRCLEdBQUc7c0JBQVgsS0FBSztnQkFHMEMsVUFBVTtzQkFBekQsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBS3hCLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDUSxjQUFjO3NCQUF6QyxTQUFTO3VCQUFDLGVBQWU7Z0JBSzFCLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyw0QkFBNEI7Z0JBKzhCdkIsSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEluamVjdCxcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBzaWduYWwsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSwgTWF0VHJlZUZsYXR0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnQtZmFjdG9yeS1zZXJ2aWNlL3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnREaWFsb2dEYXRhIH0gZnJvbSAnLi4vc21hcnQtZGlhbG9nL3Byb2plY3RzJztcclxuaW1wb3J0IHsgRXhwYW5kYWJsZVNlY3Rpb24gfSBmcm9tICcuLi9zbWFydC1leHBhbmRhYmxlLXNlY3Rpb24vcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSB9IGZyb20gJy4uL3NtYXJ0LWZpbHRlci1lZGl0b3IvYXBpL21vZGVsL2ZpbHRlckV4cHJlc3Npb25PcmRlckJ5JztcclxuaW1wb3J0IHtcclxuICBTbWFydFRhYmxlLFxyXG4gIFNtYXJ0VGFibGVCdXR0b25UeXBlLFxyXG4gIFNtYXJ0VGFibGVIZWFkZXIsXHJcbiAgU21hcnRUYWJsZUhlYWRlclByb3BlcnR5VHlwZSxcclxuICBTbWFydFRhYmxlSW50ZXJmYWNlLFxyXG4gIFNtYXJ0VGFibGVJbnRlcmZhY2VUeXBlRW51bSxcclxuICBTbWFydFRhYmxlT3JkZXIsXHJcbiAgU21hcnRUYWJsZVR5cGUsXHJcbiAgU21hcnR0YWJsZUNvbXBvbmVudCxcclxufSBmcm9tICcuLi9zbWFydC10YWJsZS9wcm9qZWN0cyc7XHJcbmltcG9ydCB7XHJcbiAgSW1hZ2VSZXNvdXJjZSxcclxuICBVaUFjdGlvbixcclxuICBVaUFjdGlvbkJ1dHRvblR5cGUsXHJcbiAgVWlBY3Rpb25EZXNjcmlwdG9yLFxyXG59IGZyb20gJy4uL3ZpZXctY29udGV4dC9hcGknO1xyXG5pbXBvcnQge1xyXG4gIENPTVBPTkVOVF9MSUJSQVJZLFxyXG4gIENvbXBvbmVudExpYnJhcnksXHJcbiAgVWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSxcclxuICBVaUFjdGlvbk1vZGVsLFxyXG4gIFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudCxcclxufSBmcm9tICcuLi92aWV3LWNvbnRleHQvcHJvamVjdHMnO1xyXG5pbXBvcnQge1xyXG4gIEdyaWRDb2x1bW5NZXRhLFxyXG4gIEdyaWRSb3csXHJcbiAgR3JpZFNlbGVjdGlvbk1vZGUsXHJcbiAgR3JpZFNlbGVjdGlvblR5cGUsXHJcbiAgR3JpZFVwZGF0ZURhdGEsXHJcbiAgR3JpZFZpZXdEZXNjcmlwdG9yS2luZEVudW0sXHJcbn0gZnJvbSAnLi9hcGkvZ3JpZC1hcGknO1xyXG5pbXBvcnQgeyBUYWJsZUxheW91dERlZmluZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtbGF5b3V0LWRlZmluZXIvdGFibGUtbGF5b3V0LWRlZmluZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBHcmlkVWlBY3Rpb25UeXBlLFxyXG4gIFNtYXJ0R3JpZCxcclxuICBTbWFydEdyaWREYXRhTGF5b3V0LFxyXG4gIFNtYXJ0R3JpZFR5cGUsXHJcbiAgU21hcnRMYXlvdXREZWYsXHJcbn0gZnJvbSAnLi9tb2RlbHMvbW9kZWwnO1xyXG5pbXBvcnQgeyBTbWFydEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi9zbWFydC1ncmlkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgU29ydE1ldGEgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnO1xyXG5pbXBvcnQge1xyXG4gIFRhYmxlQ29sdW1uUmVvcmRlckV2ZW50LFxyXG4gIFRhYmxlSGVhZGVyQ2hlY2tib3hUb2dnbGVFdmVudCxcclxuICBUYWJsZUxhenlMb2FkRXZlbnQsXHJcbiAgVGFibGVSb3dTZWxlY3RFdmVudCxcclxuICBUYWJsZVJvd1VuU2VsZWN0RXZlbnQsXHJcbn0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5T3JkZXJFbnVtIH0gZnJvbSAnLi4vc21hcnQtZmlsdGVyL3Byb2plY3RzJztcclxuaW1wb3J0IHsgTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCB9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xyXG5pbXBvcnQgeyBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwgfSBmcm9tICcuL3NtYXJ0LWdyaWQtdG9vbGJhci11dGlsJztcclxuaW1wb3J0IHsgRXhwYW5kZWRSb3dSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9nZW5lcmljLWNvbXBvbmVudC9leHBhbmRlZC1yb3ctcmVuZGVyZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU21hcnREYXRlUGlwZSwgU21hcnREYXRlVGltZVBpcGUsIFNtYXJ0VGltZVBpcGUgfSBmcm9tICcuLi9zaGFyZWQvc21hcnR0YWJsZS5kYXRlLXBpcGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzbWFydC1ncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc21hcnQtZ3JpZC5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbU21hcnRHcmlkU2VydmljZSwgU21hcnREYXRlUGlwZSwgU21hcnREYXRlVGltZVBpcGUsIFNtYXJ0VGltZVBpcGVdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFBhZ2VTaXplOiBudW1iZXIgPSAxMDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gWzUsIDEwLCAyNSwgNTBdO1xyXG4gIGNvbXBvbmVudExpYnJhcnkgPSBDb21wb25lbnRMaWJyYXJ5O1xyXG4gIHByaXZhdGUgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuICBASW5wdXQoKSBzbWFydEdyaWQ/OiBTbWFydEdyaWQ7XHJcbiAgQElucHV0KCkgdXVpZD86IHN0cmluZztcclxuICBASW5wdXQoKSBwYXJlbnQ/OiBhbnk7XHJcbiAgQElucHV0KCkgcGFyZW50TGF5b3V0Q29tcG9uZW50PzogYW55O1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS10ZXN0aWQnKVxyXG4gIGdldCB0ZXN0SWQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbD8uaWRlbnRpZmllciA/PyBudWxsO1xyXG4gIH1cclxuICBASW5wdXQoKSBkZXY6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gdGFibGVcclxuICBAVmlld0NoaWxkKCd0YWJsZScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSB2Y1JlZlRhYmxlPzogVmlld0NvbnRhaW5lclJlZjtcclxuICBjb21wb25lbnRSZWZUYWJsZT86IENvbXBvbmVudFJlZjxTbWFydHRhYmxlQ29tcG9uZW50PjtcclxuICBzbWFydFRhYmxlITogU21hcnRUYWJsZTxHcmlkUm93PjtcclxuXHJcbiAgLy8gdG9vbGJhclxyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXInKSB0b29sYmFyPzogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ2hlYWRlclRvb2xiYXInKSBfaGVhZGVyVG9vbGJhcj86IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudDtcclxuICBkZWZhdWx0QWN0aW9uVG9vbGJhcklkOiBzdHJpbmcgPSBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwuZGVmYXVsdEFjdGlvblRvb2xiYXJJZDtcclxuXHJcbiAgLy8gZXhwYW5kYWJsZVxyXG4gIEBWaWV3Q2hpbGRyZW4oRXhwYW5kZWRSb3dSZW5kZXJlckNvbXBvbmVudClcclxuICBleHBhbmRlZFJvd3NDb21wcyE6IFF1ZXJ5TGlzdDxFeHBhbmRlZFJvd1JlbmRlcmVyQ29tcG9uZW50PjtcclxuXHJcbiAgZXhwYW5kYWJsZVNlY3Rpb25zPzogRXhwYW5kYWJsZVNlY3Rpb248YW55PltdO1xyXG4gIGV4cGFuZGVkUm93cyA9IHt9O1xyXG5cclxuICAvLyBncmlkRGF0YVxyXG4gIHBhZ2VFdmVudD86IFBhZ2VFdmVudDtcclxuICBkYXRhc291cmNlPzogbnVsbDtcclxuICBwYWdlU2l6ZT86IG51bWJlcjtcclxuICBsZW5ndGg/OiBudW1iZXI7XHJcbiAgcGFnZUluZGV4PzogbnVtYmVyO1xyXG4gIHZhbHVlczogYW55O1xyXG4gIGdyaWRUYWJsZSE6IFNtYXJ0VGFibGU8YW55PjtcclxuICBpc011bHRpcGxlPzogYm9vbGVhbjtcclxuICBzZWxlY3RlZFJvd3M6IEdyaWRSb3dbXSA9IFtdO1xyXG4gIHRhYmxlVHlwZT86IGFueTtcclxuICBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gdGhpcy5kZWZhdWx0UGFnZVNpemVPcHRpb25zO1xyXG4gIGNvbHVtbk1ldGFCeU5hbWU/OiBNYXA8c3RyaW5nLCBHcmlkQ29sdW1uTWV0YT47XHJcblxyXG4gIHNlbGVjdGlvbkNoYW5nZXM6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHVpQWN0aW9uRGVzY3JpcHRvcnM6IE1hcDxzdHJpbmcsIFVpQWN0aW9uRGVzY3JpcHRvcj4gPSBuZXcgTWFwKCk7XHJcbiAgY2VsbFRvQWN0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBVaUFjdGlvbk1vZGVsW10+ID0ge307XHJcblxyXG4gIGFmdGVyVmlld0luaXRFeGVjdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQmxvY2tlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8vIHRyZWVcclxuICB0cmVlQ29udHJvbD86IEZsYXRUcmVlQ29udHJvbDxHcmlkUm93PjtcclxuICB0cmVlRmxhdHRlbmVyPzogTWF0VHJlZUZsYXR0ZW5lcjxHcmlkUm93LCBHcmlkUm93PjtcclxuICB0cmVlRGF0YVNvdXJjZT86IE1hdFRyZWVGbGF0RGF0YVNvdXJjZTxHcmlkUm93LCBHcmlkUm93PjtcclxuICB0cmVlQ2hlY2tsaXN0U2VsZWN0aW9uPzogU2VsZWN0aW9uTW9kZWw8R3JpZFJvdz47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTbWFydEdyaWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZlNlcnZpY2U6IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgcHJpdmF0ZSB1aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlOiBVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzbWFydERhdGVQaXBlOiBTbWFydERhdGVQaXBlLFxyXG4gICAgcHJpdmF0ZSBzbWFydERhdGVUaW1lUGlwZTogU21hcnREYXRlVGltZVBpcGUsXHJcbiAgICBwcml2YXRlIHNtYXJ0VGltZVBpcGU6IFNtYXJ0VGltZVBpcGUsXHJcbiAgICBASW5qZWN0KENPTVBPTkVOVF9MSUJSQVJZKSBwdWJsaWMgY29tcExpYjogQ29tcG9uZW50TGlicmFyeSxcclxuICAgIEBJbmplY3QoJ2dyaWRNZW51SWNvbicpIHByaXZhdGUgZ3JpZE1lbnVJY29uPzogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyBjYWxsZWQgYWZ0ZXIgZXZlcnkgc2VydmljZSBjYWxsIChsb2FkLCBzYXZlLCByZWZyZXNoLCBldGMuKVxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsID0gdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbDtcclxuICAgICAgdGhpcy5yZW5kZXIoKTtcclxuXHJcbiAgICAgIC8vUmVmcmVzaCBleHBhbmRlZCBzZWN0aW9ucyBkYXRhXHJcbiAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEuZXhwYW5kYWJsZSkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRSb3dzQ29tcHMuZm9yRWFjaCgocm93Q29tcCkgPT4gcm93Q29tcC5yZWZyZXNoUm93RGF0YSgpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snc21hcnRHcmlkJ10pIHtcclxuICAgICAgdGhpcy5zbWFydEdyaWQgPSBjaGFuZ2VzWydzbWFydEdyaWQnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIHRoaXMuc2VydmljZS5wYWdpbmF0b3IgPSB0aGlzLnNtYXJ0R3JpZD8ucGFnaW5hdG9yO1xyXG4gICAgICB0aGlzLnNldHVwVG9vbGJhcigpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ3V1aWQnXSkge1xyXG4gICAgICBpZiAoY2hhbmdlc1sndXVpZCddICYmIHRoaXMudXVpZCA9PT0gY2hhbmdlc1sndXVpZCddLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRSb3dzID0ge307XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51dWlkID0gY2hhbmdlc1sndXVpZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFmdGVyVmlld0luaXRFeGVjdXRlZCAmJiB0aGlzLnV1aWQgJiYgdGhpcy5zbWFydEdyaWQpIHtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy51dWlkICYmIHRoaXMuc21hcnRHcmlkKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hZnRlclZpZXdJbml0RXhlY3V0ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB0aGUgc2VsZWN0ZWQgcm93cyBvZiB0aGUgdGFibGVcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRSb3dzKCk6IFNlbGVjdGlvbk1vZGVsPEdyaWRSb3c+IHtcclxuICAgIGlmICghdGhpcy5zbWFydFRhYmxlLnNlbGVjdGlvbikgdGhyb3cgbmV3IEVycm9yKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zbWFydFRhYmxlIS5zZWxlY3Rpb24hO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBHRVQgcmVxdWVzdCB0byB0aGUgZ2VuZXJpYyBHcmlkQVBJIGFuZCByZWZyZXNoZXMgdGhlIHByZXNlbnRlZFxyXG4gICAqIGdyaWQgd2l0aCB0aGUgbmV3ZXN0IG9uZS5cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2V0dXBUb29sYmFyKCk7XHJcbiAgICAvLyB3aWxsIGNhdXNlIHRoaXMuc2VydmljZS5ncmlkTW9kZWxDaGFuZ2VkIHRvIGZpcmVcclxuICAgIGlmICh0aGlzLnV1aWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLmxvYWQodGhpcy51dWlkLCB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U3R5bGUocm93OiBhbnkpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAocm93ICYmIHJvdy5zdHlsZSkge1xyXG4gICAgICBsZXQgc3R5bGUgPSByb3cuc3R5bGU7XHJcbiAgICAgIGxldCBjbGFzc2VzVG9BZGQ6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICAgIGlmIChzdHlsZS5jbGFzc2VzVG9BZGQpIHtcclxuICAgICAgICBzdHlsZS5jbGFzc2VzVG9BZGQuZm9yRWFjaCgoY2w6IHN0cmluZykgPT4gY2xhc3Nlc1RvQWRkLnB1c2goY2wpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFzdHlsZS5jbGFzc2VzVG9SZW1vdmUpIHtcclxuICAgICAgICByZXR1cm4gY2xhc3Nlc1RvQWRkO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjbGFzc2VzVG9BZGQuZmlsdGVyKChjbHMpID0+ICFzdHlsZS5jbGFzc2VzVG9SZW1vdmUuaW5jbHVkZXMoY2xzKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0dXBUb29sYmFyKCkge1xyXG4gICAgLy8gY2hlY2sgaWYgdG9vbGJhciBpcyBhdmFpbGFibGUgX2FuZF8gbmVlZCBzZXQgdXBcclxuICAgIGlmICh0aGlzLnRvb2xiYXIgJiYgdGhpcy5zbWFydEdyaWQpIHtcclxuICAgICAgbGV0IHRvb2xiYXJJZCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciArICdfdG9vbGJhcic7XHJcbiAgICAgIGlmICh0b29sYmFySWQgIT09IHRoaXMudG9vbGJhci5pZCkge1xyXG4gICAgICAgIHRoaXMudG9vbGJhci5pZCA9IHRvb2xiYXJJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9oZWFkZXJUb29sYmFyICYmIHRoaXMuc21hcnRHcmlkKSB7XHJcbiAgICAgIGxldCBoZWFkZXJUb29sYmFySWQgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZElkZW50aWZpZXIgKyAnX2hlYWRlclRvb2xiYXInO1xyXG4gICAgICBpZiAoaGVhZGVyVG9vbGJhcklkICE9PSB0aGlzLl9oZWFkZXJUb29sYmFyLmlkKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyVG9vbGJhci5pZCA9IGhlYWRlclRvb2xiYXJJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhlYWRlclRvb2xiYXIoKTogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IENvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xyXG4gICAgICByZXR1cm4gdGhpcy5faGVhZGVyVG9vbGJhcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFJlZlRhYmxlPy5pbnN0YW5jZS5jb21wb25lbnRSZWZUYWJsZT8uaW5zdGFuY2UuaGVhZGVyVG9vbGJhcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZ3JpZE1vZGVsID0gdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbDtcclxuICAgIGlmIChncmlkTW9kZWwpIHtcclxuICAgICAgdGhpcy5sZW5ndGggPSBncmlkTW9kZWwudG90YWxSb3dDb3VudDtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IGdyaWRNb2RlbC5wYWdlU2l6ZTtcclxuICAgICAgdGhpcy5wYWdlSW5kZXggPSBncmlkTW9kZWwucGFnZUluZGV4ID8/IDA7XHJcbiAgICAgIGlmIChncmlkTW9kZWwucGFnZVNpemVPcHRpb25zICYmIGdyaWRNb2RlbC5wYWdlU2l6ZU9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMucGFnZVNpemVPcHRpb25zID0gZ3JpZE1vZGVsLnBhZ2VTaXplT3B0aW9ucztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnBhZ2VTaXplT3B0aW9ucyA9IHRoaXMuZGVmYXVsdFBhZ2VTaXplT3B0aW9ucztcclxuICAgICAgfVxyXG4gICAgICBpZiAoZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnMpIHtcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuc2hvd0VkaXRDb2x1bW5zID0gZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnM7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uY29sdW1ucykge1xyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YUJ5TmFtZSA9IG5ldyBNYXAoXHJcbiAgICAgICAgICBncmlkTW9kZWw/LnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnMubWFwKChjb2wpID0+IFtjb2wucHJvcGVydHlOYW1lLCBjb2xdKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5NZXRhQnlOYW1lID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQga2luZCA9IGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8ua2luZDtcclxuICAgICAgaWYgKGtpbmQpIHtcclxuICAgICAgICBsZXQgbGF5b3V0RGVmO1xyXG4gICAgICAgIGlmIChraW5kID09PSBHcmlkVmlld0Rlc2NyaXB0b3JLaW5kRW51bS5UQUJMRSkge1xyXG4gICAgICAgICAgbGF5b3V0RGVmID0gU21hcnRMYXlvdXREZWYuVEFCTEU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSBHcmlkVmlld0Rlc2NyaXB0b3JLaW5kRW51bS5UUkVFKSB7XHJcbiAgICAgICAgICBsYXlvdXREZWYgPSBTbWFydExheW91dERlZi5UUkVFO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gR3JpZFZpZXdEZXNjcmlwdG9yS2luZEVudW0uQ0FSRFMpIHtcclxuICAgICAgICAgIGxheW91dERlZiA9IFNtYXJ0TGF5b3V0RGVmLkNBUkQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsYXlvdXREZWYpIHtcclxuICAgICAgICAgIHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPSBsYXlvdXREZWY7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChncmlkTW9kZWw/LnBhZ2luYXRvciA9PT0gdHJ1ZSB8fCBncmlkTW9kZWw/LnBhZ2luYXRvciA9PT0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEucGFnaW5hdG9yID0gZ3JpZE1vZGVsLnBhZ2luYXRvcjtcclxuICAgICAgICB0aGlzLnNlcnZpY2UucGFnaW5hdG9yID0gdGhpcy5zbWFydEdyaWQhLnBhZ2luYXRvcjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignR3JpZE1vZGVsIGlzIHVuZGVmaW5lZCBpbiBjb21wb25lbnQhJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYpIHtcclxuICAgICAgLy8gZmFsbGJhY2ssIGRlZmF1bHQgVEFCTEVcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9IFNtYXJ0TGF5b3V0RGVmLlRBQkxFO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPT09IFNtYXJ0TGF5b3V0RGVmLlRBQkxFKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyVGFibGUoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9PT0gU21hcnRMYXlvdXREZWYuRVhQQU5EQUJMRSkge1xyXG4gICAgICB0aGlzLnJlbmRlckV4cGFuZGFibGVTZWN0aW9ucygpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5DQVJEKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyQ2FyZHMoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9PT0gU21hcnRMYXlvdXREZWYuVFJFRSkge1xyXG4gICAgICB0aGlzLnJlbmRlclRyZWUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNCbG9ja2VkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVGFibGUoKSB7XHJcbiAgICB0aGlzLnZjUmVmVGFibGU/LmNsZWFyKCk7XHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZlRhYmxlID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJUYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuY2xlYXJUcmVlKCk7XHJcbiAgICBpZiAodGhpcy5jb21wTGliID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xyXG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZVNpemUhICogdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5wYWdlSW5kZXghO1xyXG4gICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcclxuICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5vcmRlcmVkQ29sdW1uTmFtZXMubWFwKChvcmRlcmVkQ29sOiBzdHJpbmcpID0+IHtcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnMubWFwKChjb2x1bTogR3JpZENvbHVtbk1ldGEpID0+IHtcclxuICAgICAgICAgIGlmIChvcmRlcmVkQ29sID09PSBjb2x1bS5wcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnB1c2goY29sdW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGFibGVSb3cgPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsIS5wYWdlLnJvd3MhLm1hcCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuY3JlYXRlQ2VsbFRvQWN0aW9uTWFwKCk7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF0YWJsZVJvdy5sZW5ndGgpIHtcclxuICAgICAgbGV0IHBsYWNlSG9sZGVyUm93OiBhbnkgPSB7fTtcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5jb2x1bW5zLm1hcCgobWV0YTogR3JpZENvbHVtbk1ldGEpID0+IHtcclxuICAgICAgICBwbGFjZUhvbGRlclJvd1ttZXRhLnByb3BlcnR5TmFtZV0gPSB1bmRlZmluZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cyA9IFtwbGFjZUhvbGRlclJvd107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS50YWJsZUNvbmZpZz8udGFibGVUeXBlKSB7XHJcbiAgICAgIHRoaXMudGFibGVUeXBlID0gdGhpcy5zbWFydEdyaWQhLnRhYmxlQ29uZmlnLnRhYmxlVHlwZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZXJ2aWNlLmdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uc2VsZWN0aW9uVHlwZSkge1xyXG4gICAgICB0aGlzLnRhYmxlVHlwZSA9XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC52aWV3LmRlc2NyaXB0b3Iuc2VsZWN0aW9uVHlwZSA9PT0gR3JpZFNlbGVjdGlvblR5cGUuQ0hFQ0tCT1hcclxuICAgICAgICAgID8gU21hcnRUYWJsZVR5cGUuQ0hFQ0tfQk9YXHJcbiAgICAgICAgICA6IFNtYXJ0VGFibGVUeXBlLlJPV19TRUxFQ1Q7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRhYmxlVHlwZSA9IFNtYXJ0VGFibGVUeXBlLklOSEVSSVRFRDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5UQUJMRSkge1xyXG4gICAgICBsZXQgdGFibGVDb25maWc6IFNtYXJ0VGFibGVJbnRlcmZhY2U8R3JpZFJvdz4gPSB7XHJcbiAgICAgICAgLi4udGhpcy5zbWFydEdyaWQhLnRhYmxlQ29uZmlnLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnRpdGxlLFxyXG4gICAgICAgIHRhYmxlUm93czogdGFibGVSb3csXHJcbiAgICAgICAgdGFibGVUeXBlOiB0aGlzLnRhYmxlVHlwZSxcclxuICAgICAgICBjdXN0b21TbWFydFRhYmxlSGVhZGVyczogYXdhaXQgdGhpcy5jb25zdHJ1Y3RIZWFkZXIoKSEsXHJcbiAgICAgICAgZXhwYW5kYWJsZTogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGFibGUsXHJcbiAgICAgICAgYXN5bmNPbkV4cGFuZDogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGFibGUsXHJcbiAgICAgICAgZXhwYW5kZWRDb21wb25lbnQ6IHRoaXMuc21hcnRHcmlkIS5leHBhbmRlZENvbXBvbmVudCxcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSW50ZXJmYWNlVHlwZUVudW0uTk9STUFMLFxyXG4gICAgICAgIHNvcnRhYmxlOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRBY3Rpb25Db2RlczogdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5kZWZhdWx0Um93QWN0aW9ucyEsXHJcbiAgICAgICAgZGVmYXVsdEFjdGlvbnM6IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwuZGVmYXVsdFJvd0FjdGlvbnM/Lm1hcCgoY29kZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0eXBlOlxyXG4gICAgICAgICAgICAgIGNvZGUgPT09ICdfYWN0aW9uU2VwYXJhdG9yXydcclxuICAgICAgICAgICAgICAgID8gU21hcnRUYWJsZUJ1dHRvblR5cGUuU0VQQVJBVE9SXHJcbiAgICAgICAgICAgICAgICA6IFNtYXJ0VGFibGVCdXR0b25UeXBlLk5PUk1BTCxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuZXhlY3V0ZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICAgICAgICAvLyBsYWJlbDogdGhpcy5idXR0b25UcmFuc2xhdG9yKHsgY29kZTogY29kZSB9KSxcclxuICAgICAgICAgICAgdHJhbnNsYXRvcjogdGhpcy5idXR0b25UcmFuc2xhdG9yLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIC8vIGFyZ3M6IFtcclxuICAgICAgICAgICAgLy8gICB7XHJcbiAgICAgICAgICAgIC8vICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgICAgIC8vIF0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uaGlnaGxpZ2h0UHJvcGVydHkgJiZcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmhpZ2hsaWdodENsYXNzXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLmhpZ2hsaWdodENsYXNzID0gdGhpcy5zbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXcuZGVzY3JpcHRvci5oaWdobGlnaHRDbGFzcztcclxuICAgICAgICB0YWJsZUNvbmZpZy5oaWdobGlnaHRQcm9wZXJ0eSA9IHRoaXMuc21hcnRHcmlkLmdyaWRNb2RlbC52aWV3LmRlc2NyaXB0b3IuaGlnaGxpZ2h0UHJvcGVydHk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEudWlBY3Rpb25TZXJ2aWNlICYmXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UgJiZcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuc2VydmljZVRvVXNlICYmXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLnZpZXdDb250ZXh0U2VydmljZVxyXG4gICAgICApIHtcclxuICAgICAgICB0YWJsZUNvbmZpZy5vblNlbGVjdGlvbiA9IHRoaXMub25TZWxlY3QuYmluZCh0aGlzKTtcclxuICAgICAgICB0YWJsZUNvbmZpZy5vbkFsbFNlbGVjdGlvbiA9IHRoaXMub25TZWxlY3RBbGwuYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJlcGFyZWQgZm9yIHNpbXBsZSBjbGlja3NcclxuICAgICAgLy8gaWYgKCF0YWJsZUNvbmZpZy5vblJvd0NsaWNrKSB7XHJcbiAgICAgIC8vICAgdGFibGVDb25maWcub25Sb3dDbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICBpZiAoIXRhYmxlQ29uZmlnLm9uUm93RG91YmxlQ2xpY2spIHtcclxuICAgICAgICB0YWJsZUNvbmZpZy5vblJvd0RvdWJsZUNsaWNrID0gdGhpcy5vbkRvdWJsZUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGFibGVDb25maWcuaXNSb3dEaXNhYmxlZFByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLnNlbGVjdGFibGVQcm9wZXJ0eU5hbWUgPSAnc2VsZWN0YWJsZSc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0YWJsZUNvbmZpZy5hc3luY09uRXhwYW5kKSB7XHJcbiAgICAgICAgdGFibGVDb25maWcucm93RXhwYW5kZXIgPSB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzZWxlY3Rpb25Nb2RlID0gdGhpcy5zZXJ2aWNlIS5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uc2VsZWN0aW9uTW9kZTtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICAhdGFibGVDb25maWcuc2VsZWN0aW9uICYmXHJcbiAgICAgICAgIXRhYmxlQ29uZmlnLnNlbGVjdGlvblByb3BlcnR5ICYmXHJcbiAgICAgICAgc2VsZWN0aW9uTW9kZSAhPT0gR3JpZFNlbGVjdGlvbk1vZGUuTk9ORVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLmlzTXVsdGlwbGUgPSBzZWxlY3Rpb25Nb2RlID09PSBHcmlkU2VsZWN0aW9uTW9kZS5NVUxUSVBMRTtcclxuXHJcbiAgICAgICAgdGFibGVDb25maWcuc2VsZWN0aW9uUHJvcGVydHkgPSAnaWQnO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZElkcztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuc2VydmljZS5ncmlkTW9kZWwucGFnZS5yb3dzIS5maWx0ZXIoXHJcbiAgICAgICAgICAoZ3JpZFJvdzogR3JpZFJvdykgPT4gZ3JpZFJvdy5zZWxlY3RlZFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHNlbGVjdGVkSWRzID0gdGhpcy5zZWxlY3RlZFJvd3MubWFwKChncmlkUm93OiBHcmlkUm93KSA9PiBncmlkUm93LmlkISk7XHJcbiAgICAgICAgdGFibGVDb25maWcuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPHN0cmluZz4odGhpcy5pc011bHRpcGxlLCBzZWxlY3RlZElkcyk7XHJcbiAgICAgICAgdGFibGVDb25maWcuc2hvd0NoZWNrYm94SW5IZWFkZXIgPVxyXG4gICAgICAgICAgdHlwZW9mIHRhYmxlQ29uZmlnLnNob3dDaGVja2JveEluSGVhZGVyICE9PSAndW5kZWZpbmVkJ1xyXG4gICAgICAgICAgICA/IHRhYmxlQ29uZmlnLnNob3dDaGVja2JveEluSGVhZGVyIC8vIGtlZXAgaWYgc2V0XHJcbiAgICAgICAgICAgIDogdGhpcy5pc011bHRpcGxlOyAvL2lmIHVuc2V0LCB0dXJuIGl0IG9uIGZvciBtdWx0aXBsZSBzZWxlY3Rpb25cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zbWFydFRhYmxlID0gbmV3IFNtYXJ0VGFibGU8YW55PihcclxuICAgICAgICB0YWJsZUNvbmZpZyxcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZElkZW50aWZpZXIsXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQ/LnNlcnZpY2VUb1VzZVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmVGFibGUpIHtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLnVwZGF0ZVNtYXJ0VGFibGUodGhpcy5zbWFydFRhYmxlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnZjUmVmVGFibGU/LmNsZWFyKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy52Y1JlZlRhYmxlKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmVGFibGUgPSB0aGlzLmNmU2VydmljZS5jcmVhdGVDb21wb25lbnQoXHJcbiAgICAgICAgICB0aGlzLnZjUmVmVGFibGUhLFxyXG4gICAgICAgICAgU21hcnR0YWJsZUNvbXBvbmVudCxcclxuICAgICAgICAgIG5ldyBNYXA8c3RyaW5nLCBhbnk+KFtbJ3NtYXJ0VGFibGUnLCB0aGlzLnNtYXJ0VGFibGVdXSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uID0gdGhpcy5jb21wb25lbnRSZWZUYWJsZS5pbnN0YW5jZS5zb3J0RXZlbnRcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLl9kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChoZWFkZXI6IFNtYXJ0VGFibGVIZWFkZXIpID0+IHtcclxuICAgICAgICAgICAgaGVhZGVyLnByb3BlcnR5TmFtZSA9IGhlYWRlci5wcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDUpO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChoZWFkZXIub3JkZXIpIHtcclxuICAgICAgICAgICAgICBjYXNlIHVuZGVmaW5lZDpcclxuICAgICAgICAgICAgICAgIGhlYWRlci5vcmRlciA9IFNtYXJ0VGFibGVPcmRlci5BU0M7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBjYXNlIFNtYXJ0VGFibGVPcmRlci5BU0M6XHJcbiAgICAgICAgICAgICAgICBoZWFkZXIub3JkZXIgPSBTbWFydFRhYmxlT3JkZXIuREVTQztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgU21hcnRUYWJsZU9yZGVyLkRFU0M6XHJcbiAgICAgICAgICAgICAgICBoZWFkZXIub3JkZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGZpbHRlciA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QuZmluZChcclxuICAgICAgICAgICAgICAoZmlsdGVyRXhwcmVzc2lvbjogRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnkpID0+XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJFeHByZXNzaW9uLnByb3BlcnR5TmFtZSA9PT0gaGVhZGVyLnByb3BlcnR5TmFtZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyICYmICFoZWFkZXIub3JkZXIpIHtcclxuICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0LmluZGV4T2YoZmlsdGVyKTtcclxuICAgICAgICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0LnNwbGljZShpbmRleCEsIDEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlcikge1xyXG4gICAgICAgICAgICAgIGZpbHRlci5vcmRlciA9IGhlYWRlci5vcmRlcjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3JkZXI6IGhlYWRlci5vcmRlcixcclxuICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogaGVhZGVyLnByb3BlcnR5TmFtZSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGdyaWRVcGRhdGVEYXRhOiBHcmlkVXBkYXRlRGF0YSA9IHtcclxuICAgICAgICAgICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcclxuICAgICAgICAgICAgICBvcmRlcmVkQ29sdW1uTmFtZXM6IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJlZENvbHVtbk5hbWVzLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc29ydCh0aGlzLnNtYXJ0R3JpZCEsIGdyaWRVcGRhdGVEYXRhKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLnNtYXJ0VGFibGUuc2VsZWN0aW9uPy5jaGFuZ2VkXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnRSZWZUYWJsZS5pbnN0YW5jZS5fZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgocm93OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VzLm5leHQocm93KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwYW5kKHJvd0lkOiBudW1iZXIpOiBhbnkge31cclxuXHJcbiAgcHVibGljIGFzeW5jIGV4cGFuZEFzeW5jKHJvd0luZGV4OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzKSB7XHJcbiAgICAgIGxldCByb3cgPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93c1tyb3dJbmRleF07XHJcbiAgICAgIGlmIChyb3cgJiYgcm93LmlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZS5leHBhbmQodGhpcy5zbWFydEdyaWQhLCByb3cuaWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJ2aWNlLmV4cGFuZCh0aGlzLnNtYXJ0R3JpZCEsIHJvd0luZGV4LnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJFeHBhbmRhYmxlU2VjdGlvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cGFuZGFibGVTZWN0aW9ucyA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwhLnBhZ2Uucm93cyEubWFwKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0aXRsZTogJycsXHJcbiAgICAgICAgaGVhZGVyQ29tcG9uZW50OiB0aGlzLnNtYXJ0R3JpZCEuaGVhZGVyQ29tcG9uZW50LFxyXG4gICAgICAgIGhlYWRlcklucHV0TmFtZTogdGhpcy5zbWFydEdyaWQhLmhlYWRlckNvbXBvbmVudElucHV0TmFtZSxcclxuICAgICAgICBoZWFkZXJEYXRhOiBpdGVtLFxyXG4gICAgICAgIGN1c3RvbUNvbXBvbmVudDogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGFibGVDb21wb25lbnQsXHJcbiAgICAgICAgaW5wdXROYW1lOiB0aGlzLnNtYXJ0R3JpZCEuZXhwYW5kYWJsZUNvbXBvbmVudElucHV0TmFtZSxcclxuICAgICAgICBkYXRhOiBpdGVtLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNhcmRzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29tcExpYiA9PT0gdGhpcy5jb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcpIHtcclxuICAgICAgdGhpcy5wYWdlSW5kZXggPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2VTaXplISAqIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZUluZGV4ITtcclxuICAgICAgdGhpcy5jb2x1bW5zID0gW107XHJcbiAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzLm1hcCgob3JkZXJlZENvbDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5jb2x1bW5zLm1hcCgoY29sdW06IEdyaWRDb2x1bW5NZXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAob3JkZXJlZENvbCA9PT0gY29sdW0ucHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc21hcnRHcmlkIS5jdXN0b21Db21wb25lbnQpIHtcclxuICAgICAgbGV0IGRhdGFsYXlvdXREZWYgPSB7XHJcbiAgICAgICAgZGF0YUxheW91dDogU21hcnRHcmlkRGF0YUxheW91dC5DT0xVTU4sXHJcbiAgICAgICAgZ3JpZExheW91dDogU21hcnRHcmlkRGF0YUxheW91dC5DT0xVTU4sXHJcbiAgICAgICAgdHlwZTogU21hcnRHcmlkVHlwZS5DVVNUT00sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZGF0YUxheW91dERlZiA9IGRhdGFsYXlvdXREZWY7XHJcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyICsgJ0NhcmQnO1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuY3VzdG9tQ29tcG9uZW50ID0gdGhpcy5pbmplY3Rvci5nZXQodG9rZW4sIG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc011bHRpcGxlU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZSA9IHRoaXMuc2VydmljZSEuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNlbGVjdGlvbk1vZGU7XHJcbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZSA9PT0gR3JpZFNlbGVjdGlvbk1vZGUuTVVMVElQTEU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVHJlZSgpIHtcclxuICAgIHRoaXMudHJlZUNvbnRyb2wgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRyZWVEYXRhU291cmNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50cmVlRmxhdHRlbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJUcmVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhclRhYmxlKCk7XHJcbiAgICBpZiAoIXRoaXMudHJlZURhdGFTb3VyY2UpIHtcclxuICAgICAgdGhpcy50cmVlRmxhdHRlbmVyID0gbmV3IE1hdFRyZWVGbGF0dGVuZXIoXHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1lcixcclxuICAgICAgICB0aGlzLmdldExldmVsLFxyXG4gICAgICAgIHRoaXMuaXNFeHBhbmRhYmxlLFxyXG4gICAgICAgIHRoaXMuZ2V0Q2hpbGRyZW5cclxuICAgICAgKTtcclxuICAgICAgdGhpcy50cmVlQ29udHJvbCA9IG5ldyBGbGF0VHJlZUNvbnRyb2w8R3JpZFJvdz4odGhpcy5nZXRMZXZlbCwgdGhpcy5pc0V4cGFuZGFibGUpO1xyXG4gICAgICB0aGlzLnRyZWVEYXRhU291cmNlID0gbmV3IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSh0aGlzLnRyZWVDb250cm9sLCB0aGlzLnRyZWVGbGF0dGVuZXIpO1xyXG4gICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8R3JpZFJvdz4odGhpcy5pc011bHRpcGxlU2VsZWN0aW9uKCkpO1xyXG4gICAgfVxyXG4gICAgbGV0IG5vZGVzID0gdGhpcy50cmVlQ29udHJvbD8uZGF0YU5vZGVzO1xyXG4gICAgbGV0IGV4cGFuZGVkTm9kZXM6IChzdHJpbmcgfCB1bmRlZmluZWQpW107XHJcbiAgICBpZiAobm9kZXMpIHtcclxuICAgICAgZXhwYW5kZWROb2RlcyA9IG5vZGVzXHJcbiAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gdGhpcy50cmVlQ29udHJvbD8uaXNFeHBhbmRhYmxlKG5vZGUpKVxyXG4gICAgICAgIC5maWx0ZXIoKG5vZGUpID0+IHRoaXMudHJlZUNvbnRyb2w/LmlzRXhwYW5kZWQobm9kZSkpXHJcbiAgICAgICAgLm1hcCgobm9kZSkgPT4gbm9kZS5pZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBleHBhbmRlZE5vZGVzID0gW107XHJcbiAgICB9XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cyEuZm9yRWFjaCgocm93OiBhbnkpID0+IChyb3cubGV2ZWwgPSB1bmRlZmluZWQpKTtcclxuICAgIHRoaXMudHJlZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzIS5maWx0ZXIoKHJvdykgPT4gIXJvdy5wYXJlbnQpO1xyXG4gICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uPy5jbGVhcigpO1xyXG4gICAgdGhpcy50cmVlQ29udHJvbD8uZGF0YU5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgaWYgKG5vZGUuc2VsZWN0ZWQpIHtcclxuICAgICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LnNlbGVjdChub2RlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRyZWVDb250cm9sPy5jb2xsYXBzZUFsbCgpO1xyXG4gICAgZXhwYW5kZWROb2Rlcy5mb3JFYWNoKChyb3dJZCkgPT4ge1xyXG4gICAgICBsZXQgcm93ID0gdGhpcy50cmVlQ29udHJvbD8uZGF0YU5vZGVzLmZpbmQoKHJvdykgPT4gcm93SWQgPT09IHJvdy5pZCk7XHJcbiAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICB0aGlzLnRyZWVDb250cm9sPy5leHBhbmQocm93KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRMZXZlbCA9IChub2RlOiBhbnkpID0+IG5vZGUubGV2ZWwgPz8gMDtcclxuXHJcbiAgaXNFeHBhbmRhYmxlID0gKG5vZGU6IEdyaWRSb3cpID0+IChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZSk7XHJcblxyXG4gIGdldENoaWxkcmVuID0gKG5vZGU6IEdyaWRSb3cpOiBHcmlkUm93W10gPT4ge1xyXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgbGV0IHJvd3MgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2Uucm93cz8uZmlsdGVyKChyb3cpID0+XHJcbiAgICAgICAgbm9kZS5jaGlsZHJlbj8uc29tZSgoY2hpbGQpID0+IGNoaWxkID09PSByb3cuaWQhKVxyXG4gICAgICApO1xyXG4gICAgICBpZiAocm93cykge1xyXG4gICAgICAgIHJldHVybiByb3dzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfTtcclxuXHJcbiAgaGFzQ2hpbGQgPSAoXzogbnVtYmVyLCBfbm9kZURhdGE6IEdyaWRSb3cpID0+IHRoaXMuaXNFeHBhbmRhYmxlKF9ub2RlRGF0YSk7XHJcblxyXG4gIHRyYW5zZm9ybWVyID0gKHJvdzogR3JpZFJvdywgbGV2ZWw6IG51bWJlcikgPT4ge1xyXG4gICAgKHJvdyBhcyBhbnkpLmxldmVsID0gbGV2ZWw7XHJcbiAgICByZXR1cm4gcm93O1xyXG4gIH07XHJcblxyXG4gIGdldFRyZWVJdGVtKHJvdzogR3JpZFJvdyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29sdW1uczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcztcclxuICAgIGxldCBkYXRhOiBhbnkgPSByb3cuZGF0YSE7XHJcbiAgICBpZiAoY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2wpID0+IGRhdGFbY29sXSkuam9pbignICcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvdy5pZCE7XHJcbiAgfVxyXG5cclxuICAvKiogVG9nZ2xlIHRoZSB0cmVlTm9kZSBzZWxlY3Rpb24uIFNlbGVjdC9kZXNlbGVjdCBhbGwgdGhlIGRlc2NlbmRhbnRzIG5vZGUgKi9cclxuICB0cmVlTm9kZVNlbGVjdGlvblRvZ2dsZShub2RlOiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgc2VsZWN0aW9uQmVmb3JlID0gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkLm1hcCgocm93KSA9PiByb3cuaWQpO1xyXG4gICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcclxuICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSkge1xyXG4gICAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2whLmdldERlc2NlbmRhbnRzKG5vZGUpO1xyXG4gICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVxyXG4gICAgICAgID8gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdCguLi5kZXNjZW5kYW50cylcclxuICAgICAgICA6IHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdCguLi5kZXNjZW5kYW50cyk7XHJcbiAgICAgIHRoaXMuY2hlY2tBbGxQYXJlbnRzU2VsZWN0aW9uKG5vZGUpO1xyXG4gICAgfVxyXG4gICAgbGV0IHNlbGVjdGlvbkFmdGVyID0gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkLm1hcCgocm93KSA9PiByb3cuaWQpO1xyXG5cclxuICAgIGxldCBzZWxlY3RlZElkcyA9IHNlbGVjdGlvbkFmdGVyLmZpbHRlcigocykgPT4gIXNlbGVjdGlvbkJlZm9yZS5pbmNsdWRlcyhzKSk7XHJcbiAgICBsZXQgdW5zZWxlY3RlZElkcyA9IHNlbGVjdGlvbkJlZm9yZS5maWx0ZXIoKHMpID0+ICFzZWxlY3Rpb25BZnRlci5pbmNsdWRlcyhzKSk7XHJcbiAgICB0aGlzLm9uU2VsZWN0Um93cyhzZWxlY3RlZElkcywgdW5zZWxlY3RlZElkcyk7XHJcbiAgfVxyXG5cclxuICBjaGVja0FsbFBhcmVudHNTZWxlY3Rpb24obm9kZTogR3JpZFJvdyk6IHZvaWQge1xyXG4gICAgbGV0IHBhcmVudDogR3JpZFJvdyB8IG51bGwgPSB0aGlzLmdldFBhcmVudE5vZGUobm9kZSk7XHJcbiAgICB3aGlsZSAocGFyZW50KSB7XHJcbiAgICAgIHRoaXMuY2hlY2tQYXJlbnROb2RlU2VsZWN0aW9uKHBhcmVudCk7XHJcbiAgICAgIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50Tm9kZShwYXJlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tQYXJlbnROb2RlU2VsZWN0aW9uKG5vZGU6IEdyaWRSb3cpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG5vZGVTZWxlY3RlZCA9IHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpO1xyXG4gICAgY29uc3QgZGVzY0FsbFNlbGVjdGVkID0gdGhpcy5kZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpO1xyXG4gICAgaWYgKG5vZGVTZWxlY3RlZCAmJiAhZGVzY0FsbFNlbGVjdGVkKSB7XHJcbiAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdChub2RlKTtcclxuICAgIH0gZWxzZSBpZiAoIW5vZGVTZWxlY3RlZCAmJiBkZXNjQWxsU2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdChub2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qIEdldCB0aGUgcGFyZW50IG5vZGUgb2YgYSBub2RlICovXHJcbiAgZ2V0UGFyZW50Tm9kZShub2RlOiBHcmlkUm93KTogR3JpZFJvdyB8IG51bGwge1xyXG4gICAgY29uc3QgY3VycmVudExldmVsID0gdGhpcy5nZXRMZXZlbChub2RlKTtcclxuXHJcbiAgICBpZiAoY3VycmVudExldmVsIDwgMSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy50cmVlQ29udHJvbCEuZGF0YU5vZGVzLmluZGV4T2Yobm9kZSkgLSAxO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpID49IDA7IGktLSkge1xyXG4gICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHRoaXMudHJlZUNvbnRyb2whLmRhdGFOb2Rlc1tpXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmdldExldmVsKGN1cnJlbnROb2RlKSA8IGN1cnJlbnRMZXZlbCkge1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciBhbGwgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBub2RlIGFyZSBzZWxlY3RlZC4gKi9cclxuICBkZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGU6IEdyaWRSb3cpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy50cmVlQ29udHJvbCB8fCAhdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcclxuICAgIGNvbnN0IGRlc2NBbGxTZWxlY3RlZCA9XHJcbiAgICAgIGRlc2NlbmRhbnRzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgZGVzY2VuZGFudHMuZXZlcnkoKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbiEuaXNTZWxlY3RlZChjaGlsZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgcmV0dXJuIGRlc2NBbGxTZWxlY3RlZDtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIHBhcnQgb2YgdGhlIGRlc2NlbmRhbnRzIGFyZSBzZWxlY3RlZCAqL1xyXG4gIGRlc2NlbmRhbnRzUGFydGlhbGx5U2VsZWN0ZWQobm9kZTogR3JpZFJvdyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnRyZWVDb250cm9sIHx8ICF0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpO1xyXG4gICAgbGV0IHJlc3VsdCA9IGRlc2NlbmRhbnRzLnNvbWUoKGNoaWxkKSA9PiB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24hLmlzU2VsZWN0ZWQoY2hpbGQpKTtcclxuICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSkge1xyXG4gICAgICByZXN1bHQgPSByZXN1bHQgJiYgIXRoaXMuZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbnN0cnVjdEhlYWRlcigpOiBQcm9taXNlPFNtYXJ0VGFibGVIZWFkZXJbXT4ge1xyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzICYmIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzLmxlbmd0aCkge1xyXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cy5tYXAoYXN5bmMgKGdyaWRSb3c6IEdyaWRSb3cpID0+IHtcclxuICAgICAgICAgIGxldCBuZXdVaUFjdGlvbnMgPSBncmlkUm93LmFjdGlvbnM/LmZpbHRlcihcclxuICAgICAgICAgICAgKHVpQWN0aW9uOiBhbnkpID0+ICF0aGlzLnVpQWN0aW9uRGVzY3JpcHRvcnMuZ2V0KHVpQWN0aW9uLmNvZGUhKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBpZiAobmV3VWlBY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgIG5ld1VpQWN0aW9ucy5tYXAoYXN5bmMgKHVpQWN0aW9uOiBVaUFjdGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlc2NyaXB0b3I6IFVpQWN0aW9uRGVzY3JpcHRvciA9XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc21hcnRHcmlkIS51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlPy5nZXRBY3Rpb25EZXNjcmlwdG9yKHVpQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIGlmICghZGVzY3JpcHRvcikge1xyXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB1aUFjdGlvbi5jb2RlID8/ICdDT0RFJyxcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFVpQWN0aW9uQnV0dG9uVHlwZS5OT1JNQUwsXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvcnMuc2V0KHVpQWN0aW9uLmNvZGUhLCBzdHJ1Y3R1cmVkQ2xvbmUoZGVzY3JpcHRvcikpO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3JlZGVyZWREZXNjQ29sdW1ucyA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJlZENvbHVtbk5hbWVzLm1hcChcclxuICAgICAgKHByb3BlcnR5TmFtZTogc3RyaW5nKSA9PlxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEuZGVzY3JpcHRvciEuY29sdW1ucyEuZmluZChcclxuICAgICAgICAgIChjb2xEZXNjcmlwdG9yOiBHcmlkQ29sdW1uTWV0YSkgPT4gY29sRGVzY3JpcHRvci5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZVxyXG4gICAgICAgIClcclxuICAgICkuZmxhdE1hcCgoZikgPT4gZiA/PyBbXSk7XHJcblxyXG4gICAgbGV0IGhlYWRlciA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBvcmVkZXJlZERlc2NDb2x1bW5zLm1hcChhc3luYyAoZGVzY0NvbHVtbjogR3JpZENvbHVtbk1ldGEpOiBQcm9taXNlPFNtYXJ0VGFibGVIZWFkZXI+ID0+IHtcclxuICAgICAgICBsZXQgY3VzdG9tVGFibGVIZWFkZXIgPSB0aGlzLnNtYXJ0R3JpZCEudGFibGVDb25maWc/LmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzPy5maW5kKFxyXG4gICAgICAgICAgKGhlYWRlcjogU21hcnRUYWJsZUhlYWRlcikgPT4gaGVhZGVyLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbi5wcm9wZXJ0eU5hbWVcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCBmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0gPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0Py5maW5kKFxyXG4gICAgICAgICAgKGZpbHRlckV4cHJlc3Npb246IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5KSA9PlxyXG4gICAgICAgICAgICBmaWx0ZXJFeHByZXNzaW9uLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbiEucHJvcGVydHlOYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgb3JkZXI7XHJcbiAgICAgICAgbGV0IG9yZGVyTnVtYmVyO1xyXG4gICAgICAgIGlmIChmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0pIHtcclxuICAgICAgICAgIG9yZGVyID1cclxuICAgICAgICAgICAgZmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlJdGVtLm9yZGVyID09PSBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeS5PcmRlckVudW0uQXNjXHJcbiAgICAgICAgICAgICAgPyBTbWFydFRhYmxlT3JkZXIuQVNDXHJcbiAgICAgICAgICAgICAgOiBTbWFydFRhYmxlT3JkZXIuREVTQztcclxuICAgICAgICAgIGlmICh0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgb3JkZXJOdW1iZXIgPSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0LmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAoZmlsdGVyOiBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSkgPT4gZmlsdGVyLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbiEucHJvcGVydHlOYW1lXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIG9yZGVyTnVtYmVyKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWduYWxMYWJlbCA9IGN1c3RvbVRhYmxlSGVhZGVyPy5sYWJlbCA/PyBkZXNjQ29sdW1uLmxhYmVsO1xyXG4gICAgICAgIGxldCBsYWJlbCA9ICcnO1xyXG4gICAgICAgIGlmICghZGVzY0NvbHVtbi5oaWRlTGFiZWwpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEudHJhbnNsYXRlU2VydmljZSkge1xyXG4gICAgICAgICAgICBsYWJlbCA9IGF3YWl0IHRoaXMuc21hcnRHcmlkIS50cmFuc2xhdGVTZXJ2aWNlPy5nZXQob3JpZ25hbExhYmVsKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxhYmVsID0gb3JpZ25hbExhYmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBjdXN0b21UYWJsZUhlYWRlcj8ucHJvcGVydGllcztcclxuICAgICAgICBpZiAoIXByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLmdldFNtYXJ0VGFibGVQcm9wZXJ0eShkZXNjQ29sdW1uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5jdXN0b21UYWJsZUhlYWRlcixcclxuICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ2RhdGEuJyArIGRlc2NDb2x1bW4ucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgb3JkZXIsXHJcbiAgICAgICAgICBvcmRlck51bWJlcixcclxuICAgICAgICAgIHByb3BlcnRpZXMsXHJcbiAgICAgICAgICBzdHlsZTogZGVzY0NvbHVtbi5zdHlsZSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgY29tcGxlbWVudCA9IHRoaXMuc21hcnRHcmlkIS50YWJsZUNvbmZpZz8uY3VzdG9tU21hcnRUYWJsZUhlYWRlcnM/LmZpbHRlcihcclxuICAgICAgKHRhYmxlSGVhZGVyOiBTbWFydFRhYmxlSGVhZGVyKSA9PlxyXG4gICAgICAgICFoZWFkZXIuc29tZSgodEg6IFNtYXJ0VGFibGVIZWFkZXIpID0+IHRILnByb3BlcnR5TmFtZS5pbmNsdWRlcyh0YWJsZUhlYWRlci5wcm9wZXJ0eU5hbWUpKVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY29tcGxlbWVudCkge1xyXG4gICAgICBoZWFkZXIucHVzaCguLi5jb21wbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLm9wdGlvbnM/LnNpbXBsZUJ1dHRvbnMpIHtcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLm9wdGlvbnMuc2ltcGxlQnV0dG9ucy5mb3JFYWNoKCh1aUFjdGlvbkNvZGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGhlYWRlci5wdXNoKHtcclxuICAgICAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ3NpbXBsZV9idXR0b25zJyxcclxuICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IFNtYXJ0VGFibGVCdXR0b25UeXBlLlJBSVNFRCxcclxuICAgICAgICAgICAgICBjYWxsYmFjazogdGhpcy5leGVjdXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgLy8gbGFiZWw6IHRoaXMuYnV0dG9uVHJhbnNsYXRvcih7IGNvZGU6IHVpQWN0aW9uQ29kZSB9KSxcclxuICAgICAgICAgICAgICBhcmdzOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGNvZGU6IHVpQWN0aW9uQ29kZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICAgICAgICAgIHNob3dCdXR0b25JZjogKHJvdzogYW55KSA9PlxyXG4gICAgICAgICAgICAgICAgcm93LmFjdGlvbnMuc29tZSgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmNvZGUgPT09IHVpQWN0aW9uQ29kZTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFoZWFkZXIuc29tZSgoaGVhZGVyOiBTbWFydFRhYmxlSGVhZGVyKSA9PiBoZWFkZXIucHJvcGVydHlOYW1lID09PSAnbXlfbWVudScpKSB7XHJcbiAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucz8ucm93VWlBY3Rpb25UeXBlID09PSBHcmlkVWlBY3Rpb25UeXBlLlBPUFVQX01FTlUpIHtcclxuICAgICAgICBsZXQgaWNvbiA9IHRoaXMuZ3JpZE1lbnVJY29uID8/ICdtb3JlX3ZlcnQnO1xyXG4gICAgICAgIGhlYWRlci5wdXNoKHtcclxuICAgICAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ215X21lbnUnLFxyXG4gICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogU21hcnRUYWJsZUJ1dHRvblR5cGUuTUVOVSxcclxuICAgICAgICAgICAgICBjYWxsYmFjazogdGhpcy5leGVjdXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgICBtZW51SXRlbUJ1dHRvbnNQcm9wZXJ0eU5hbWU6ICdhY3Rpb25zJyxcclxuICAgICAgICAgICAgICB0cmFuc2xhdG9yOiB0aGlzLmJ1dHRvblRyYW5zbGF0b3IuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICBhcmdzOiBbXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICBpc1NvcnRhYmxlOiBmYWxzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoZWFkZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNtYXJ0VGFibGVQcm9wZXJ0eShkZXNjQ29sdW1uOiBHcmlkQ29sdW1uTWV0YSkge1xyXG4gICAgaWYgKFxyXG4gICAgICBkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5PZmZzZXREYXRlVGltZScgfHxcclxuICAgICAgZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLnRpbWUuTG9jYWxEYXRlVGltZSdcclxuICAgICkge1xyXG4gICAgICBsZXQgZGF0ZUZvcm1hdCA9IGRlc2NDb2x1bW4udHlwZUZvcm1hdCA/PyAneXl5eS5NTS5kZCBIOm1tJztcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEVUSU1FLFxyXG4gICAgICAgIGRhdGVGb3JtYXQsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKGRlc2NDb2x1bW4udHlwZUNsYXNzID09PSAnamF2YS50aW1lLkxvY2FsRGF0ZScpIHtcclxuICAgICAgbGV0IGRhdGVGb3JtYXQgPSBkZXNjQ29sdW1uLnR5cGVGb3JtYXQgPz8gJ3l5eXkuTU0uZGQnO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUuREFURSxcclxuICAgICAgICBkYXRlRm9ybWF0LFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmIChkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5Mb2NhbFRpbWUnKSB7XHJcbiAgICAgIGxldCBkYXRlRm9ybWF0ID0gZGVzY0NvbHVtbi50eXBlRm9ybWF0ID8/ICdIOm1tJztcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLlRJTUUsXHJcbiAgICAgICAgZGF0ZUZvcm1hdCxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAoZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLmxhbmcuQm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkNIRUNLQk9YLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25DaGFuZ2VQYWdlKGV2ZW50OiBQYWdlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBvZmZzZXQgPSBldmVudC5wYWdlU2l6ZSAqIGV2ZW50LnBhZ2VJbmRleDtcclxuICAgIGxldCBsaW1pdCA9IGV2ZW50LnBhZ2VTaXplO1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc2V0UGFnZShcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3VXVpZCEsXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgb2Zmc2V0LnRvU3RyaW5nKCksXHJcbiAgICAgIGxpbWl0LnRvU3RyaW5nKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25QcmltZUNoYW5nZVBhZ2UoZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG9mZnNldCA9IGV2ZW50LmZpcnN0O1xyXG4gICAgbGV0IGxpbWl0ID0gZXZlbnQucm93cztcclxuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQuZmlyc3Q7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc2V0UGFnZShcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3VXVpZCEsXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgb2Zmc2V0LnRvU3RyaW5nKCksXHJcbiAgICAgIGxpbWl0LnRvU3RyaW5nKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWZyZXNoUGFydGlhbFJlc3VsdHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2UucmVmcmVzaCh0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXdVdWlkISwgdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZShhcmdzOiBhbnlbXSwgcm93OiBhbnksIHVpQWN0aW9uOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBfdWlBY3Rpb246IFVpQWN0aW9uO1xyXG5cclxuICAgIGlmICghdWlBY3Rpb24pIHtcclxuICAgICAgdWlBY3Rpb24gPSByb3cuYWN0aW9ucy5maWx0ZXIoKGFjdGlvbjogVWlBY3Rpb24pID0+IGFjdGlvbi5jb2RlID09PSBhcmdzWzBdLmNvZGUpWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIF91aUFjdGlvbiA9IHsgLi4udWlBY3Rpb24gfTtcclxuICAgIGlmIChfdWlBY3Rpb24uZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgX3VpQWN0aW9uLnBhcmFtcyA9IHtcclxuICAgICAgLi4udWlBY3Rpb24ucGFyYW1zLFxyXG4gICAgICBtb2RlbDogcm93LFxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgdWlBY3Rpb25Nb2RlbDogYW55ID0ge1xyXG4gICAgICBzZXJ2aWNlVG9Vc2U6IHRoaXMuc21hcnRHcmlkIS5zZXJ2aWNlVG9Vc2UsXHJcbiAgICAgIHVpQWN0aW9uOiBfdWlBY3Rpb24sXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucz8udWlBY3Rpb25Nb2RlbENhbGxiYWNrKSB7XHJcbiAgICAgIHVpQWN0aW9uTW9kZWwgPSB0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucyEudWlBY3Rpb25Nb2RlbENhbGxiYWNrKHVpQWN0aW9uTW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc21hcnRHcmlkIS51aUFjdGlvblNlcnZpY2UuZXhlY3V0ZShfdWlBY3Rpb24sIHVpQWN0aW9uTW9kZWwsIHtcclxuICAgICAgd2lkZ2V0SWQ6IHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgbm9kZUlkOiByb3cuaWQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnV0dG9uVHJhbnNsYXRvcih1aUFjdGlvbjogVWlBY3Rpb24pOiBVaUFjdGlvbkRlc2NyaXB0b3Ige1xyXG4gICAgbGV0IGRlc2MgPSB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvcnMuZ2V0KHVpQWN0aW9uLmNvZGUhKTtcclxuICAgIGlmICghZGVzYykge1xyXG4gICAgICBkZXNjID0ge1xyXG4gICAgICAgIHRpdGxlOiB1aUFjdGlvbi5jb2RlISxcclxuICAgICAgICB0eXBlOiBVaUFjdGlvbkJ1dHRvblR5cGUuRkxBVCxcclxuICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKHVpQWN0aW9uLmRlc2NyaXB0b3IpIHtcclxuICAgICAgdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLm1lcmdlQWN0aW9uRGVzY3JpcHRvckludG9DbGllbnQodWlBY3Rpb24uZGVzY3JpcHRvciEsIGRlc2MpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlc2M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbGF5b3V0RGVmKCk6IHR5cGVvZiBTbWFydExheW91dERlZiB7XHJcbiAgICByZXR1cm4gU21hcnRMYXlvdXREZWY7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbGljayhncmlkUm93OiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICB0aGlzLmhhbmRsZU9uQ2xpY2soZ3JpZFJvdyk7XHJcbiAgfVxyXG4gIHB1YmxpYyBvbkRvdWJsZUNsaWNrKGdyaWRSb3c6IEdyaWRSb3cpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlT25DbGljayhncmlkUm93KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlT25DbGljayhncmlkUm93OiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICBsZXQgZGVmYXVsdFJvd0FjdGlvbjogVWlBY3Rpb24gfCB1bmRlZmluZWQ7XHJcbiAgICBpZiAodGhpcy5zZXJ2aWNlLmdyaWRNb2RlbD8uZGVmYXVsdFJvd0FjdGlvbnMpIHtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuc2VydmljZS5ncmlkTW9kZWwuZGVmYXVsdFJvd0FjdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFJvd0FjdGlvbkNvZGUgPSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLmRlZmF1bHRSb3dBY3Rpb25zW2luZGV4XTtcclxuXHJcbiAgICAgICAgZGVmYXVsdFJvd0FjdGlvbiA9IGdyaWRSb3cuYWN0aW9ucy5maW5kKFxyXG4gICAgICAgICAgKHVpQWN0aW9uOiBVaUFjdGlvbikgPT4gdWlBY3Rpb24uY29kZSA9PT0gZGVmYXVsdFJvd0FjdGlvbkNvZGVcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChkZWZhdWx0Um93QWN0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGUoW10sIGdyaWRSb3csIGRlZmF1bHRSb3dBY3Rpb24pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIG9uU2VsZWN0KHJvd0lkOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuaXNCbG9ja2VkID0gdHJ1ZTtcclxuICAgIGNvbnN0IHJvdyA9IHRoaXMuc2VydmljZS5ncmlkTW9kZWwucGFnZS5yb3dzPy5maW5kKChncmlkUm93OiBHcmlkUm93KSA9PiBncmlkUm93LmlkID09PSByb3dJZCk7XHJcbiAgICBjb25zdCB2aWV3Q29udGV4dENoYW5nZSA9IGF3YWl0IHRoaXMuc2VydmljZS5zZWxlY3QodGhpcy5zbWFydEdyaWQhLCByb3chKTtcclxuICAgIHRoaXMuc21hcnRHcmlkIS52aWV3Q29udGV4dFNlcnZpY2UuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKHZpZXdDb250ZXh0Q2hhbmdlKTtcclxuICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgY29uc29sZS5sb2coJ2luIHJlZnJlc2poaicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvblNlbGVjdEFsbChzZWxlY3RlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pc0Jsb2NrZWQgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IHZpZXdDb250ZXh0Q2hhbmdlID0gYXdhaXQgdGhpcy5zZXJ2aWNlLnNlbGVjdEFsbCh0aGlzLnNtYXJ0R3JpZCEsIHNlbGVjdGVkKTtcclxuICAgIHRoaXMuc21hcnRHcmlkIS52aWV3Q29udGV4dFNlcnZpY2UuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKHZpZXdDb250ZXh0Q2hhbmdlKTtcclxuXHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25TZWxlY3RSb3dzKFxyXG4gICAgc2VsZWN0ZWRJZHM6IChzdHJpbmcgfCB1bmRlZmluZWQpW10sXHJcbiAgICB1bnNlbGVjdGVkSWRzOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmlzQmxvY2tlZCA9IHRydWU7XHJcbiAgICBsZXQgc2VsZWN0ZWQ6IHN0cmluZ1tdID0gc2VsZWN0ZWRJZHMuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcclxuICAgIGxldCB1bnNlbGVjdGVkOiBzdHJpbmdbXSA9IHVuc2VsZWN0ZWRJZHMuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcclxuICAgIGNvbnN0IHZpZXdDb250ZXh0Q2hhbmdlID0gYXdhaXQgdGhpcy5zZXJ2aWNlLnNlbGVjdFJvd3ModGhpcy5zbWFydEdyaWQhLCBzZWxlY3RlZCwgdW5zZWxlY3RlZCk7XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCEudmlld0NvbnRleHRTZXJ2aWNlLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZSh2aWV3Q29udGV4dENoYW5nZSk7XHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uUm93U2VsZWN0KGV2ZW50OiBUYWJsZVJvd1NlbGVjdEV2ZW50KSB7XHJcbiAgICBhd2FpdCB0aGlzLm9uU2VsZWN0KGV2ZW50LmRhdGEuaWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25Sb3dVbnNlbGVjdChldmVudDogVGFibGVSb3dVblNlbGVjdEV2ZW50KSB7XHJcbiAgICBhd2FpdCB0aGlzLm9uU2VsZWN0KGV2ZW50LmRhdGEuaWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TZWxlY3RBbGxSb3coZXZlbnQ6IFRhYmxlSGVhZGVyQ2hlY2tib3hUb2dnbGVFdmVudCkge1xyXG4gICAgYXdhaXQgdGhpcy5vblNlbGVjdEFsbChldmVudC5jaGVja2VkKTtcclxuICB9XHJcblxyXG4gIGVkaXRDb2x1bW5zKCk6IHZvaWQge1xyXG4gICAgbGV0IGRpYWxvZ0RhdGE6IFNtYXJ0RGlhbG9nRGF0YSA9IHtcclxuICAgICAgY29udGVudDoge1xyXG4gICAgICAgIHRpdGxlOiAnT3N6bG9wb2sgdGVzdHJlc3phYsOhc2EnLFxyXG4gICAgICB9LFxyXG4gICAgICBzaXplOiB7fSxcclxuICAgICAgY3VzdG9tQ29tcG9uZW50OiBUYWJsZUxheW91dERlZmluZXJDb21wb25lbnQsXHJcbiAgICAgIGN1c3RvbUNvbXBvbmVudElucHV0czoge1xyXG4gICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgdXVpZDogdGhpcy51dWlkLFxyXG4gICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyLFxyXG4gICAgICAgICAgdmlldzogdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC52aWV3LFxyXG4gICAgICAgICAgc2VydmljZTogdGhpcy5zZXJ2aWNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5kaWFsb2cub3BlbihUYWJsZUxheW91dERlZmluZXJDb21wb25lbnQsIHsgZGF0YTogZGlhbG9nRGF0YSB9KTtcclxuICB9XHJcblxyXG4gIC8vUFJJTUVOR1xyXG4gIGNvbHVtbnM6IEdyaWRDb2x1bW5NZXRhW10gPSBbXTtcclxuICBtZW51QnV0dG9ucyE6IE1lbnVJdGVtW107XHJcbiAgQFZpZXdDaGlsZCgnbWVudScpIG1lbnUhOiBNZW51O1xyXG4gIG9uT3B0aW9uc0NsaWNrKGV2ZW50OiBFdmVudCwgcm93OiBHcmlkUm93KSB7XHJcbiAgICB0aGlzLm1lbnVCdXR0b25zID0gW107XHJcblxyXG4gICAgbGV0IG1lbnVBY3Rpb25zID0gdGhpcy5jYWxjdWxhdGVNZW51QWN0aW9ucyhyb3cpO1xyXG5cclxuICAgIG1lbnVBY3Rpb25zPy5tYXAoYXN5bmMgKHVpQWN0aW9uOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGRlc2MgPSBhd2FpdCB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UuZ2V0QWN0aW9uRGVzY3JpcHRvcih1aUFjdGlvbik7XHJcblxyXG4gICAgICB0aGlzLm1lbnVCdXR0b25zLnB1c2goe1xyXG4gICAgICAgIGxhYmVsOiBkZXNjPy50aXRsZSA/PyB1aUFjdGlvbi5jb2RlLFxyXG4gICAgICAgIGljb246IGRlc2M/Lmljb24sXHJcbiAgICAgICAgYXV0b21hdGlvbklkOiB1aUFjdGlvbi5jb2RlLFxyXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXhlY3V0ZShbXSwgcm93LCB1aUFjdGlvbik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubWVudS50b2dnbGUoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJldmlvdXNtdWx0aVNvcnRNZXRhPzogU29ydE1ldGFbXTtcclxuICBhc3luYyBncmlkU29ydChldmVudDogYW55KSB7XHJcbiAgICBsZXQgb3JkZXJCeUxpc3Q6IEFycmF5PEZpbHRlckV4cHJlc3Npb25PcmRlckJ5PiA9IFtdO1xyXG5cclxuICAgIGV2ZW50Lm11bHRpc29ydG1ldGE/Lm1hcCgobWV0YTogU29ydE1ldGEsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgaWYgKHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhICYmIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YS5tYXAoKG9yZGVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAobWV0YS5maWVsZCA9PT0gb3JkZXIuZmllbGQgJiYgb3JkZXIub3JkZXIgIT0gbWV0YS5vcmRlcikge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9yZGVyLm9yZGVyKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAtMTpcclxuICAgICAgICAgICAgICAgIGV2ZW50Lm11bHRpc29ydG1ldGEhLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhID0gZXZlbnQubXVsdGlzb3J0bWV0YTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBldmVudC5tdWx0aXNvcnRtZXRhPy5tYXAoKG1ldGE6IGFueSkgPT4ge1xyXG4gICAgICBvcmRlckJ5TGlzdC5wdXNoKHtcclxuICAgICAgICBwcm9wZXJ0eU5hbWU6IG1ldGEuZmllbGQsXHJcbiAgICAgICAgb3JkZXI6XHJcbiAgICAgICAgICBtZXRhLm9yZGVyID09PSAxXHJcbiAgICAgICAgICAgID8gRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlPcmRlckVudW0uQVNDXHJcbiAgICAgICAgICAgIDogbWV0YS5vcmRlciA9PT0gLTFcclxuICAgICAgICAgICAgICA/IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5T3JkZXJFbnVtLkRFU0NcclxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc29ydCh0aGlzLnNtYXJ0R3JpZCEsIHtcclxuICAgICAgb3JkZXJCeUxpc3Q6IG9yZGVyQnlMaXN0LFxyXG4gICAgICBvcmRlcmVkQ29sdW1uTmFtZXM6IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzISxcclxuICAgIH0pO1xyXG4gIH1cclxuICBsYXp5TG9hZChldmVudD86IFRhYmxlTGF6eUxvYWRFdmVudCkge1xyXG4gICAgdGhpcy5wcmV2aW91c211bHRpU29ydE1ldGEgPSBbXTtcclxuICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJCeUxpc3QubWFwKChvcmRlcikgPT4ge1xyXG4gICAgICB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YT8ucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6IG9yZGVyLnByb3BlcnR5TmFtZSEsXHJcbiAgICAgICAgb3JkZXI6IG9yZGVyLm9yZGVyID09PSBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeU9yZGVyRW51bS5BU0MgPyAxIDogLTEsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBldmVudCEubXVsdGlTb3J0TWV0YSA9IHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGVhZGVyQ2hhbmdlKGV2ZW50OiBNdWx0aVNlbGVjdENoYW5nZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZ3JpZFVwZGF0ZURhdGE6IEdyaWRVcGRhdGVEYXRhID0ge1xyXG4gICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcclxuICAgICAgb3JkZXJlZENvbHVtbk5hbWVzOiB0aGlzLmdldE9yZGVyQ29sdW1OYW1lcyhldmVudC52YWx1ZSEpLFxyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2UudXBkYXRlKHRoaXMudXVpZCEsIHRoaXMuc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciEsIGdyaWRVcGRhdGVEYXRhKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ29sT3JkZXIoZXZlbnQ6IFRhYmxlQ29sdW1uUmVvcmRlckV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZ3JpZFVwZGF0ZURhdGE6IEdyaWRVcGRhdGVEYXRhID0ge1xyXG4gICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcclxuICAgICAgb3JkZXJlZENvbHVtbk5hbWVzOiB0aGlzLmdldE9yZGVyQ29sdW1OYW1lcyhldmVudC5jb2x1bW5zISksXHJcbiAgICB9O1xyXG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnVwZGF0ZSh0aGlzLnV1aWQhLCB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIhLCBncmlkVXBkYXRlRGF0YSk7XHJcbiAgfVxyXG5cclxuICBnZXRPcmRlckNvbHVtTmFtZXMoY29sdW1uczogR3JpZENvbHVtbk1ldGFbXSk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW06IEdyaWRDb2x1bW5NZXRhKSA9PiB7XHJcbiAgICAgIHJldHVybiBjb2x1bS5wcm9wZXJ0eU5hbWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldENvbFZhbHVlKGNvbDogc3RyaW5nLCByb3c6IGFueSkge1xyXG4gICAgaWYgKHJvdy5pY29uc1tjb2xdKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmV0VmFsdWUgPSAnJztcclxuICAgIGlmIChjb2wuaW5jbHVkZXMoJy4nKSkge1xyXG4gICAgICBsZXQgcGF0aEFycmF5ID0gY29sLnNwbGl0KCcuJyk7XHJcbiAgICAgIGxldCBjb2xWYWx1ZSA9IHJvdy5kYXRhO1xyXG4gICAgICBwYXRoQXJyYXkubWFwKChwYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbFZhbHVlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29sVmFsdWUgPSByb3cuZGF0YVtjb2xdO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb2xWYWx1ZSA9IGNvbFZhbHVlW3BhdGhdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldFZhbHVlID0gY29sVmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXRWYWx1ZSA9IHJvdy5kYXRhW2NvbF07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29sdW1uTWV0YUJ5TmFtZSkge1xyXG4gICAgICBsZXQgY29sdW1uTWV0YSA9IHRoaXMuY29sdW1uTWV0YUJ5TmFtZSEuZ2V0KGNvbCk7XHJcbiAgICAgIGlmIChjb2x1bW5NZXRhKSB7XHJcbiAgICAgICAgbGV0IHByb3BlcnR5ID0gdGhpcy5nZXRTbWFydFRhYmxlUHJvcGVydHkoY29sdW1uTWV0YSk7XHJcbiAgICAgICAgc3dpdGNoIChwcm9wZXJ0eT8udHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEU6XHJcbiAgICAgICAgICAgIHJldFZhbHVlID0gdGhpcy5zbWFydERhdGVQaXBlLnRyYW5zZm9ybShyZXRWYWx1ZSwgcHJvcGVydHkuZGF0ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEVUSU1FOlxyXG4gICAgICAgICAgICByZXRWYWx1ZSA9IHRoaXMuc21hcnREYXRlVGltZVBpcGUudHJhbnNmb3JtKHJldFZhbHVlLCBwcm9wZXJ0eS5kYXRlRm9ybWF0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUuVElNRTpcclxuICAgICAgICAgICAgcmV0VmFsdWUgPSB0aGlzLnNtYXJ0VGltZVBpcGUudHJhbnNmb3JtKHJldFZhbHVlLCBwcm9wZXJ0eS5kYXRlRm9ybWF0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0VmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXRJbWFnZVJlc291cmNlSWNvbnMocm93OiBhbnksIGhlYWRlcjogc3RyaW5nKTogSW1hZ2VSZXNvdXJjZVtdIHtcclxuICAgIGlmIChyb3c/Lmljb25zKSB7XHJcbiAgICAgIGxldCBpY29uQ29kZXMgPSByb3c/Lmljb25zW2hlYWRlcl07XHJcbiAgICAgIHJldHVybiBpY29uQ29kZXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG4gIGdldEltYWdlUmVzb3VyY2VTdHlsZShyZXNvdXJjZTogSW1hZ2VSZXNvdXJjZSk6IGFueSB7XHJcbiAgICByZXR1cm4gcmVzb3VyY2Uuc3R5bGUgPyByZXNvdXJjZS5zdHlsZSA6IHt9O1xyXG4gIH1cclxuXHJcbiAgZ2V0Um93Q29sdW1uQWN0aW9uKHJvdzogYW55LCBjb2x1bW5OYW1lOiBzdHJpbmcpOiBVaUFjdGlvbk1vZGVsW10ge1xyXG4gICAgcmV0dXJuIFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5nZXRBY3Rpb25Nb2RlbHNGcm9tTWFwKFxyXG4gICAgICB0aGlzLmNlbGxUb0FjdGlvbk1hcCxcclxuICAgICAgcm93LFxyXG4gICAgICBjb2x1bW5OYW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2hvd0NlbGxUb29sYmFyKHJvdzogYW55LCBjb2x1bW5OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwuc2hvd1Rvb2xiYXIocm93LCBjb2x1bW5OYW1lKTtcclxuICB9XHJcblxyXG4gIHNob3VsZFNob3dPcHRpb25zQnV0dG9uKHJvdzogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLnNob3dNZW51KFxyXG4gICAgICByb3csXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzIVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZU1lbnVBY3Rpb25zKHJvdzogR3JpZFJvdyk6IFVpQWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5jYWxjdWxhdGVNZW51QWN0aW9ucyhcclxuICAgICAgcm93LFxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcyFcclxuICAgICk7XHJcbiAgfVxyXG4gIGNyZWF0ZUNlbGxUb0FjdGlvbk1hcCgpIHtcclxuICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HICYmIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZS5yb3dzKSB7XHJcbiAgICAgIHRoaXMucm93TWVudUFjdGlvbk1vZGVsQ2FjaGUuY2xlYXIoKTtcclxuICAgICAgdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxBcnJheUNhY2hlLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuY2VsbFRvQWN0aW9uTWFwID0gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLmNhbGN1bGF0ZUNlbGxUb0FjdGlvbk1hcChcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2Uucm93cyEsXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQuc2VydmljZVRvVXNlLFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkLmdyaWRJZGVudGlmaWVyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByb3dUcmFja0J5Rm4oaW5kZXg6IG51bWJlciwgcm93OiBhbnkpIHtcclxuICAgIHJldHVybiByb3cuaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJvd01lbnVBY3Rpb25Nb2RlbENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICBwcml2YXRlIHJvd01lbnVBY3Rpb25Nb2RlbEFycmF5Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XHJcblxyXG4gIGdldFJvd01lbnVBY3Rpb25Nb2RlbEFycmF5KHJvdzogR3JpZFJvdyk6IGFueVtdIHtcclxuICAgIGNvbnN0IGNhY2hlS2V5ID0gcm93LmlkITtcclxuICAgIGlmICh0aGlzLnJvd01lbnVBY3Rpb25Nb2RlbEFycmF5Q2FjaGUuaGFzKGNhY2hlS2V5KSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxBcnJheUNhY2hlLmdldChjYWNoZUtleSkhO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XHJcbiAgICAgIGNvbnN0IGxlZnRvdmVyQWN0aW9uTW9kZWxzID0gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLmNhbGN1bGF0ZU1lbnVBY3Rpb25Nb2RlbHMoXHJcbiAgICAgICAgcm93LFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzISxcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuc2VydmljZVRvVXNlLFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllclxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgbWVudVVpQWN0aW9uOiBVaUFjdGlvbiA9IHtcclxuICAgICAgICBjb2RlOiAncm93TWVudScsXHJcbiAgICAgICAgZGVzY3JpcHRvcjoge1xyXG4gICAgICAgICAgaWNvbjogJ2VsbGlwc2lzLXYnLFxyXG4gICAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgICAgdHlwZTogVWlBY3Rpb25CdXR0b25UeXBlLklDT04sXHJcbiAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3ViQWN0aW9uczogbGVmdG92ZXJBY3Rpb25Nb2RlbHMubWFwKChtKSA9PiBtLnVpQWN0aW9uKSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IG1vZGVsID0ge1xyXG4gICAgICAgIHNlcnZpY2VUb1VzZTogdGhpcy5zbWFydEdyaWQhLnNlcnZpY2VUb1VzZSxcclxuICAgICAgICB1aUFjdGlvbjogbWVudVVpQWN0aW9uLFxyXG4gICAgICAgIG5vZGVJZDogcm93LmlkLFxyXG4gICAgICAgIHdpZGdldElkOiB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLnJvd01lbnVBY3Rpb25Nb2RlbENhY2hlLnNldChjYWNoZUtleSwgbW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFyciA9IFt0aGlzLnJvd01lbnVBY3Rpb25Nb2RlbENhY2hlLmdldChjYWNoZUtleSldO1xyXG4gICAgdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxBcnJheUNhY2hlLnNldChjYWNoZUtleSwgYXJyKTtcclxuICAgIHJldHVybiBhcnI7XHJcbiAgfVxyXG59XHJcbiIsIkBpZiAoY29tcExpYiA9PT0gY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbiAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZFwiIGNsYXNzPVwicHJpbWVTbWFydEdyaWQtY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21hcnQtZ3JpZC10b29sYmFyXCI+XHJcbiAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhciAjdG9vbGJhciBbaWRdPVwiJ2dyaWRfbm90X2luaXRpYWxpemVkJ1wiPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxwLXRhYmxlXHJcbiAgICAgICpuZ0lmPVwiIXNtYXJ0R3JpZC5sYXlvdXREZWYgfHwgc21hcnRHcmlkLmxheW91dERlZiA9PT0gbGF5b3V0RGVmKCkuVEFCTEVcIlxyXG4gICAgICAjcFRhYmxlXHJcbiAgICAgIFt2YWx1ZV09XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnBhZ2Uucm93cyFcIlxyXG4gICAgICAob25Tb3J0KT1cImdyaWRTb3J0KCRldmVudClcIlxyXG4gICAgICBbY3VzdG9tU29ydF09XCJ0cnVlXCJcclxuICAgICAgW3NvcnRNb2RlXT1cIidtdWx0aXBsZSdcIlxyXG4gICAgICBbbGF6eV09XCJ0cnVlXCJcclxuICAgICAgKG9uTGF6eUxvYWQpPVwibGF6eUxvYWQoJGV2ZW50KVwiXHJcbiAgICAgIFtyZW9yZGVyYWJsZUNvbHVtbnNdPVwic21hcnRHcmlkLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnNcIlxyXG4gICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgKG9uQ29sUmVvcmRlcik9XCJvbkNvbE9yZGVyKCRldmVudClcIlxyXG4gICAgICAob25Sb3dTZWxlY3QpPVwib25Sb3dTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgIChvblJvd1Vuc2VsZWN0KT1cIm9uUm93VW5zZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgIFtzZWxlY3Rpb25dPVwic2VsZWN0ZWRSb3dzXCJcclxuICAgICAgKG9uSGVhZGVyQ2hlY2tib3hUb2dnbGUpPVwib25TZWxlY3RBbGxSb3coJGV2ZW50KVwiXHJcbiAgICAgIGRhdGFLZXk9XCJpZFwiXHJcbiAgICAgIFtleHBhbmRlZFJvd0tleXNdPVwiZXhwYW5kZWRSb3dzXCJcclxuICAgICAgW3Jvd0V4cGFuZE1vZGVdPVwiJ211bHRpcGxlJ1wiXHJcbiAgICAgIFtyb3dUcmFja0J5XT1cInJvd1RyYWNrQnlGblwiXHJcbiAgICA+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlQ2FwdGlvblwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5ncmlkTW9kZWwudGl0bGVcIiBjbGFzcz1cImNhcHRpb25UaXRsZVwiPlxyXG4gICAgICAgICAgICB7eyBzbWFydEdyaWQuZ3JpZE1vZGVsLnRpdGxlIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNob3dFZGl0Q29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxyXG4gICAgICAgICAgICAgIGRpc3BsYXk9XCJjaGlwXCJcclxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IGNvbHVtbnMgc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZV09XCJ7ICdtaW4td2lkdGgnOiAnMjAwcHgnIH1cIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIENvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJoZWFkZXJDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIEBpZiAoc21hcnRHcmlkLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnMpIHtcclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc011bHRpcGxlICYmICh0YWJsZVR5cGUgPT09ICdjaGVja2JveCcgfHwgdGFibGVUeXBlID09PSAnQ2hlY2tCb3gnKVwiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNHJlbVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94IC8+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCJcclxuICAgICAgICAgICAgPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnByb3BlcnR5TmFtZVwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgICAgICBwUmVvcmRlcmFibGVDb2x1bW5cclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJjb2wucHJvcGVydHlOYW1lXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wucHJvcGVydHlOYW1lXCIgLz5cclxuICAgICAgICAgICAgICB7eyBjb2wubGFiZWwgfX1cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggLz5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDRyZW1cIlxyXG4gICAgICAgICAgICA+PC90aD5cclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wucHJvcGVydHlOYW1lXCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cImNvbC5wcm9wZXJ0eU5hbWVcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHAtc29ydEljb24gW2ZpZWxkXT1cImNvbC5wcm9wZXJ0eU5hbWVcIiAvPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXJUb29sYmFyXCJcclxuICAgICAgICAgICAgICAjaGVhZGVyVG9vbGJhclxyXG4gICAgICAgICAgICAgIFtpZF09XCInaGVhZGVyX25vdF9pbml0aWFsaXplZCdcIlxyXG4gICAgICAgICAgICA+PC9zbWFydC11aS1hY3Rpb24tdG9vbGJhcj5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8dGggKm5nSWY9XCJzbWFydEdyaWQuZXhwYW5kYWJsZVwiPiA8L3RoPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvdyBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiPlxyXG4gICAgICAgIDx0clxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0U3R5bGUocm93KVwiXHJcbiAgICAgICAgICBbY2xhc3Mucm93RXhwYW5kZWRdPVwiZXhwYW5kZWRcIlxyXG4gICAgICAgICAgKGRibGNsaWNrKT1cIm9uRG91YmxlQ2xpY2socm93KVwiXHJcbiAgICAgICAgICAqbmdJZj1cInJvdyAmJiByb3cuZGF0YVwiXHJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJyb3cuaWQgPz8gbnVsbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwiaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIj5cclxuICAgICAgICAgICAgPHAtdGFibGVDaGVja2JveCAqbmdJZj1cInJvdy5zZWxlY3RhYmxlICE9IGZhbHNlXCIgW3ZhbHVlXT1cInJvd1wiIC8+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCI+XHJcbiAgICAgICAgICAgIDxwLXRhYmxlUmFkaW9CdXR0b24gW3ZhbHVlXT1cInJvd1wiIC8+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2wgb2Ygc21hcnRHcmlkPy5ncmlkTW9kZWw/LnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lc1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93Lmljb25zW2NvbF1cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hcnQtdGFibGUtaWNvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGlyIG9mIGdldEltYWdlUmVzb3VyY2VJY29ucyhyb3csIGNvbClcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtYXJ0LWljb24gW2ltYWdlUmVzb3VyY2VdPVwiaXJcIj4gPC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0NlbGxUb29sYmFyKHJvdywgY29sKVwiPlxyXG4gICAgICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgICAgICAgW3VpQWN0aW9uTW9kZWxzXT1cImdldFJvd0NvbHVtbkFjdGlvbihyb3csIGNvbClcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhcm93Lmljb25zW2NvbF1cIiBbaW5uZXJIdG1sXT1cImdldENvbFZhbHVlKGNvbCwgcm93KVwiPiA8L2Rpdj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgIEBpZiAoc2hvd0NlbGxUb29sYmFyKHJvdywgZGVmYXVsdEFjdGlvblRvb2xiYXJJZCkpIHtcclxuICAgICAgICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgICAgICAgICBbdWlBY3Rpb25Nb2RlbHNdPVwiZ2V0Um93Q29sdW1uQWN0aW9uKHJvdywgZGVmYXVsdEFjdGlvblRvb2xiYXJJZClcIlxyXG4gICAgICAgICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIEBpZiAoc2hvdWxkU2hvd09wdGlvbnNCdXR0b24ocm93KSkge1xyXG4gICAgICAgICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICAgICAgIFt1aUFjdGlvbk1vZGVsc109XCJnZXRSb3dNZW51QWN0aW9uTW9kZWxBcnJheShyb3cpXCJcclxuICAgICAgICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwic21hcnRHcmlkLmV4cGFuZGFibGVcIj5cclxuICAgICAgICAgICAgPHAtYnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgIFtwUm93VG9nZ2xlcl09XCJyb3dcIlxyXG4gICAgICAgICAgICAgIFt0ZXh0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICBbcm91bmRlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJleHBhbmRlZCA/ICdwaSBwaS1jaGV2cm9uLXVwJyA6ICdwaSBwaS1jaGV2cm9uLWRvd24nXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgQGlmIChzbWFydEdyaWQuZXhwYW5kYWJsZSkge1xyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJyb3dleHBhbnNpb25cIiBsZXQtcm93PlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICA8bGliLWV4cGFuZGVkLXJvdy1yZW5kZXJlci1jb21wb25lbnRcclxuICAgICAgICAgICAgICAgIFtyb3dJZF09XCJyb3cuaWRcIlxyXG4gICAgICAgICAgICAgICAgW3Jvd0V4cGFuZGVyXT1cInRoaXNcIlxyXG4gICAgICAgICAgICAgICAgW2V4cGFuZGVkQ29tcG9uZW50XT1cInNtYXJ0R3JpZC5leHBhbmRlZENvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICBbc21hcnRHcmlkXT1cInRoaXMuc21hcnRHcmlkXCJcclxuICAgICAgICAgICAgICA+PC9saWItZXhwYW5kZWQtcm93LXJlbmRlcmVyLWNvbXBvbmVudD5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgfVxyXG4gICAgPC9wLXRhYmxlPlxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdJZj1cInNtYXJ0R3JpZC5sYXlvdXREZWYgPT09IGxheW91dERlZigpLkNBUkQgJiYgc21hcnRHcmlkLmRhdGFMYXlvdXREZWZcIlxyXG4gICAgICBjbGFzcz1cImNhcmRzLWNvbnRhaW5lclwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJzpcclxuICAgICAgICAgIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gJ3JlcGVhdCgnICsgc21hcnRHcmlkLm51bWJlck9mQ29sdW1uICsgJywgMWZyKSdcclxuICAgICAgICAgICAgOiAnJyxcclxuICAgICAgfVwiXHJcbiAgICA+XHJcbiAgICAgIDxhcHAtc21hcnQtZ3JpZC1jYXJkXHJcbiAgICAgICAgY2xhc3M9XCJzbWFydEdyaWQtY2FyZC1jb250YWluZXJcIlxyXG4gICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2Ygc21hcnRHcmlkLmdyaWRNb2RlbC5wYWdlLnJvd3NcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkNsaWNrKHJvdylcIlxyXG4gICAgICAgIFtpdGVtXT1cInJvd1wiXHJcbiAgICAgICAgW3NtYXJ0R3JpZF09XCJzbWFydEdyaWRcIlxyXG4gICAgICAgIFtwYXJlbnRdPVwidGhpcy5wYXJlbnRcIlxyXG4gICAgICAgIFtwYXJlbnRMYXlvdXRDb21wb25lbnRdPVwidGhpcy5wYXJlbnRMYXlvdXRDb21wb25lbnRcIlxyXG4gICAgICA+PC9hcHAtc21hcnQtZ3JpZC1jYXJkPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic21hcnRHcmlkLnBhZ2luYXRvclwiIGNsYXNzPVwicGFnaW5hdG9yLXJvd1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGFnaW5hdG9yLXdyYXBcIj5cclxuICAgICAgICA8cC1wYWdpbmF0b3JcclxuICAgICAgICAgIFtmaXJzdF09XCJwYWdlSW5kZXghXCJcclxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwibGVuZ3RoIVwiXHJcbiAgICAgICAgICBbcm93c109XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAgICAgICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSAtIHtsYXN0fSAvIHt0b3RhbFJlY29yZHN9XCJcclxuICAgICAgICAgIChvblBhZ2VDaGFuZ2UpPVwib25QcmltZUNoYW5nZVBhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIlxyXG4gICAgICAgICAgZHJvcGRvd25BcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgID48L3AtcGFnaW5hdG9yPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgaWNvbj1cInBpIHBpLXJlZnJlc2hcIlxyXG4gICAgICAgIGNsYXNzPVwicC1idXR0b24tdGV4dFwiXHJcbiAgICAgICAgcFRvb2x0aXA9XCJGcmlzc8OtdMOpc1wiXHJcbiAgICAgICAgKGNsaWNrKT1cInJlZnJlc2hQYXJ0aWFsUmVzdWx0cygpXCJcclxuICAgICAgICAqbmdJZj1cInNtYXJ0R3JpZC5ncmlkTW9kZWw/LnJlZnJlc2hFbmFibGVkXCJcclxuICAgICAgPjwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8cC1tZW51ICNtZW51IFttb2RlbF09XCJtZW51QnV0dG9uc1wiIFtwb3B1cF09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCI+IDwvcC1tZW51PlxyXG4gIDwvZGl2PlxyXG59IEBlbHNlIHtcclxuICA8ZGl2ICpuZ0lmPVwic21hcnRHcmlkXCIgY2xhc3M9XCJzbWFydEdyaWQtY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21hcnQtZ3JpZC10b29sYmFyXCI+XHJcbiAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhciAjdG9vbGJhciBbaWRdPVwiJ2dyaWRfbm90X2luaXRpYWxpemVkJ1wiPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICAoY2xpY2spPVwiZWRpdENvbHVtbnMoKVwiXHJcbiAgICAgICAgbWF0LW1pbmktZmFiXHJcbiAgICAgICAgY29sb3I9XCJ0ZXh0LXByaW1hcnlcIlxyXG4gICAgICAgICpuZ0lmPVwic21hcnRHcmlkLnNob3dFZGl0Q29sdW1uc1wiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWljb24gYXJpYS1oaWRkZW49XCJmYWxzZVwiIGFyaWEtbGFiZWw9XCJDb2x1bW5zXCIgY2xhc3M9XCJzbWFydC1ncmlkLWVkaXQtaWNvblwiXHJcbiAgICAgICAgICA+dmlld19jb2x1bW5zPC9tYXQtaWNvblxyXG4gICAgICAgID5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gPGRpdiBbbmdDbGFzc109XCJpc0Jsb2NrZWQgPyAnYmxvY2tlZCcgOiAnJ1wiPjwvZGl2PiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWFydEdyaWRDb250ZW50XCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5zaG93UmVzdWx0Q291bnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFydEdyaWQtZGF0YS1udW1iZXJcIj5cclxuICAgICAgICAgICAge3sgc21hcnRHcmlkLmdyaWRNb2RlbC50b3RhbFJvd0NvdW50IH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21hcnQtZ3JpZC10YWJsZS1jb250YWluZXJcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3RhYmxlPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5sYXlvdXREZWYgPT09IGxheW91dERlZigpLkVYUEFOREFCTEVcIj5cclxuICAgICAgICA8c21hcnQtZXhwYW5kYWJsZS1zZWN0aW9uXHJcbiAgICAgICAgICAjZ3JpZEV4cGFuZGFibGVTZWN0aW9uXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZXhwYW5kYWJsZVNlY3Rpb24gb2YgZXhwYW5kYWJsZVNlY3Rpb25zXCJcclxuICAgICAgICAgIFtkYXRhXT1cImV4cGFuZGFibGVTZWN0aW9uXCJcclxuICAgICAgICA+PC9zbWFydC1leHBhbmRhYmxlLXNlY3Rpb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJzbWFydEdyaWQubGF5b3V0RGVmID09PSBsYXlvdXREZWYoKS5DQVJEICYmIHNtYXJ0R3JpZC5kYXRhTGF5b3V0RGVmXCJcclxuICAgICAgICBjbGFzcz1cImNhcmRzLWNvbnRhaW5lclwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucyc6XHJcbiAgICAgICAgICAgIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgPyAncmVwZWF0KCcgKyBzbWFydEdyaWQubnVtYmVyT2ZDb2x1bW4gKyAnLCAxZnIpJ1xyXG4gICAgICAgICAgICAgIDogJycsXHJcbiAgICAgICAgfVwiXHJcbiAgICAgID5cclxuICAgICAgICA8YXBwLXNtYXJ0LWdyaWQtY2FyZFxyXG4gICAgICAgICAgY2xhc3M9XCJzbWFydEdyaWQtY2FyZC1jb250YWluZXJcIlxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHJvdyBvZiBzbWFydEdyaWQuZ3JpZE1vZGVsLnBhZ2Uucm93c1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25DbGljayhyb3cpXCJcclxuICAgICAgICAgIFtpdGVtXT1cInJvd1wiXHJcbiAgICAgICAgICBbc21hcnRHcmlkXT1cInNtYXJ0R3JpZFwiXHJcbiAgICAgICAgICBbcGFyZW50XT1cInRoaXMucGFyZW50XCJcclxuICAgICAgICAgIFtwYXJlbnRMYXlvdXRDb21wb25lbnRdPVwidGhpcy5wYXJlbnRMYXlvdXRDb21wb25lbnRcIlxyXG4gICAgICAgID48L2FwcC1zbWFydC1ncmlkLWNhcmQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJzbWFydEdyaWQubGF5b3V0RGVmID09PSBsYXlvdXREZWYoKS5UUkVFICYmIHRyZWVDb250cm9sXCJcclxuICAgICAgICBjbGFzcz1cInRyZWUtY29udGFpbmVyXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJzpcclxuICAgICAgICAgICAgc21hcnRHcmlkLm51bWJlck9mQ29sdW1uICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICA/ICdyZXBlYXQoJyArIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiArICcsIDFmciknXHJcbiAgICAgICAgICAgICAgOiAnJyxcclxuICAgICAgICB9XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtdHJlZSBbZGF0YVNvdXJjZV09XCJ0cmVlRGF0YVNvdXJjZSFcIiBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2whXCI+XHJcbiAgICAgICAgICA8bWF0LXRyZWUtbm9kZVxyXG4gICAgICAgICAgICAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZVwiXHJcbiAgICAgICAgICAgIG1hdFRyZWVOb2RlVG9nZ2xlXHJcbiAgICAgICAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ1xyXG4gICAgICAgICAgICBtYXRUcmVlTm9kZVBhZGRpbmdJbmRlbnQ9XCIyNFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGRpc2FibGVkIGNsYXNzPVwidHJlZS1idXR0b25cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tsaXN0LWxlYWYtbm9kZVwiXHJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJlZUNoZWNrbGlzdFNlbGVjdGlvbj8uaXNTZWxlY3RlZChub2RlKVwiXHJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0cmVlTm9kZVNlbGVjdGlvblRvZ2dsZShub2RlKVwiXHJcbiAgICAgICAgICAgICAgPnt7IGdldFRyZWVJdGVtKG5vZGUpIH19PC9tYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPC9tYXQtdHJlZS1ub2RlPlxyXG5cclxuICAgICAgICAgIDxtYXQtdHJlZS1ub2RlXHJcbiAgICAgICAgICAgICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlOyB3aGVuOiBoYXNDaGlsZFwiXHJcbiAgICAgICAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ1xyXG4gICAgICAgICAgICBtYXRUcmVlTm9kZVBhZGRpbmdJbmRlbnQ9XCIyNFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICBtYXRUcmVlTm9kZVRvZ2dsZVxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidHJlZS1idXR0b25cIlxyXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1RvZ2dsZSAnICsgbm9kZS5pdGVtXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uLXJ0bC1taXJyb3JcIj5cclxuICAgICAgICAgICAgICAgIHt7IHRyZWVDb250cm9sIS5pc0V4cGFuZGVkKG5vZGUpID8gJ2V4cGFuZF9tb3JlJyA6ICdjaGV2cm9uX3JpZ2h0JyB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJlZUNoZWNrbGlzdFNlbGVjdGlvbj8uaXNTZWxlY3RlZChub2RlKVwiXHJcbiAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiZGVzY2VuZGFudHNQYXJ0aWFsbHlTZWxlY3RlZChub2RlKVwiXHJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0cmVlTm9kZVNlbGVjdGlvblRvZ2dsZShub2RlKVwiXHJcbiAgICAgICAgICAgICAgPnt7IGdldFRyZWVJdGVtKG5vZGUpIH19PC9tYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPC9tYXQtdHJlZS1ub2RlPlxyXG4gICAgICAgIDwvbWF0LXRyZWU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic21hcnRHcmlkLnBhZ2luYXRvclwiIGNsYXNzPVwicGFnaW5hdG9yLXJvdy1tYXRlcmlhbFwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGljb249XCJwaSBwaS1yZWZyZXNoXCJcclxuICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHRcIlxyXG4gICAgICAgIHBUb29sdGlwPVwiRnJpc3PDrXTDqXNcIlxyXG4gICAgICAgIChjbGljayk9XCJyZWZyZXNoUGFydGlhbFJlc3VsdHMoKVwiXHJcbiAgICAgICAgKm5nSWY9XCJzbWFydEdyaWQuZ3JpZE1vZGVsPy5yZWZyZXNoRW5hYmxlZFwiXHJcbiAgICAgID48L2J1dHRvbj5cclxuICAgICAgPG1hdC1wYWdpbmF0b3JcclxuICAgICAgICAqbmdJZj1cInNtYXJ0R3JpZC5wYWdpbmF0b3IgJiYgIXRyZWVDb250cm9sXCJcclxuICAgICAgICAjcGFnaW5hdG9yXHJcbiAgICAgICAgW2xlbmd0aF09XCJsZW5ndGhcIlxyXG4gICAgICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcclxuICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxyXG4gICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcclxuICAgICAgICAocGFnZSk9XCJvbkNoYW5nZVBhZ2UoJGV2ZW50KVwiXHJcbiAgICAgID48L21hdC1wYWdpbmF0b3I+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxufVxyXG4iXX0=
1074
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1ncmlkL3NtYXJ0LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtZ3JpZC9zbWFydC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUVMLFNBQVMsRUFFVCxXQUFXLEVBQ1gsTUFBTSxFQUVOLEtBQUssRUFNTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsVUFBVSxFQUNWLG9CQUFvQixFQUVwQiw0QkFBNEIsRUFFNUIsMkJBQTJCLEVBQzNCLGVBQWUsRUFDZixjQUFjLEVBQ2QsbUJBQW1CLEdBQ3BCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUdMLGtCQUFrQixHQUVuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZ0JBQWdCLEdBSWpCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUdMLGlCQUFpQixFQUNqQixpQkFBaUIsRUFFakIsMEJBQTBCLEdBQzNCLE1BQU0sZ0JBQWdCLENB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QUFpQixhQUNqQixjQUFjO21HQXZFYixrQkFBa0Isa09BRmxCLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsQ0FBQywwR0FtQmxELGdCQUFnQiwwVEFVOUIsNEJBQTRCLHFFQ3BINUMscy9hQTJWQTs7NEZEbFFhLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDRSxZQUFZLGFBR1gsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxDQUFDOzswQkF3RTNFLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxjQUFjO3lDQWxFZixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdGLE1BQU07c0JBRFQsV0FBVzt1QkFBQyxrQkFBa0I7Z0JBSXRCLEdBQUc7c0JBQVgsS0FBSztnQkFHMEMsVUFBVTtzQkFBekQsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBS3hCLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDUSxjQUFjO3NCQUF6QyxTQUFTO3VCQUFDLGVBQWU7Z0JBSzFCLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyw0QkFBNEI7Z0JBKzhCdkIsSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEluamVjdCxcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBzaWduYWwsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSwgTWF0VHJlZUZsYXR0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnQtZmFjdG9yeS1zZXJ2aWNlL3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnREaWFsb2dEYXRhIH0gZnJvbSAnLi4vc21hcnQtZGlhbG9nL3Byb2plY3RzJztcclxuaW1wb3J0IHsgRXhwYW5kYWJsZVNlY3Rpb24gfSBmcm9tICcuLi9zbWFydC1leHBhbmRhYmxlLXNlY3Rpb24vcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSB9IGZyb20gJy4uL3NtYXJ0LWZpbHRlci1lZGl0b3IvYXBpL21vZGVsL2ZpbHRlckV4cHJlc3Npb25PcmRlckJ5JztcclxuaW1wb3J0IHtcclxuICBTbWFydFRhYmxlLFxyXG4gIFNtYXJ0VGFibGVCdXR0b25UeXBlLFxyXG4gIFNtYXJ0VGFibGVIZWFkZXIsXHJcbiAgU21hcnRUYWJsZUhlYWRlclByb3BlcnR5VHlwZSxcclxuICBTbWFydFRhYmxlSW50ZXJmYWNlLFxyXG4gIFNtYXJ0VGFibGVJbnRlcmZhY2VUeXBlRW51bSxcclxuICBTbWFydFRhYmxlT3JkZXIsXHJcbiAgU21hcnRUYWJsZVR5cGUsXHJcbiAgU21hcnR0YWJsZUNvbXBvbmVudCxcclxufSBmcm9tICcuLi9zbWFydC10YWJsZS9wcm9qZWN0cyc7XHJcbmltcG9ydCB7XHJcbiAgSW1hZ2VSZXNvdXJjZSxcclxuICBVaUFjdGlvbixcclxuICBVaUFjdGlvbkJ1dHRvblR5cGUsXHJcbiAgVWlBY3Rpb25EZXNjcmlwdG9yLFxyXG59IGZyb20gJy4uL3ZpZXctY29udGV4dC9hcGknO1xyXG5pbXBvcnQge1xyXG4gIENPTVBPTkVOVF9MSUJSQVJZLFxyXG4gIENvbXBvbmVudExpYnJhcnksXHJcbiAgVWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSxcclxuICBVaUFjdGlvbk1vZGVsLFxyXG4gIFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudCxcclxufSBmcm9tICcuLi92aWV3LWNvbnRleHQvcHJvamVjdHMnO1xyXG5pbXBvcnQge1xyXG4gIEdyaWRDb2x1bW5NZXRhLFxyXG4gIEdyaWRSb3csXHJcbiAgR3JpZFNlbGVjdGlvbk1vZGUsXHJcbiAgR3JpZFNlbGVjdGlvblR5cGUsXHJcbiAgR3JpZFVwZGF0ZURhdGEsXHJcbiAgR3JpZFZpZXdEZXNjcmlwdG9yS2luZEVudW0sXHJcbn0gZnJvbSAnLi9hcGkvZ3JpZC1hcGknO1xyXG5pbXBvcnQgeyBUYWJsZUxheW91dERlZmluZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtbGF5b3V0LWRlZmluZXIvdGFibGUtbGF5b3V0LWRlZmluZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBHcmlkVWlBY3Rpb25UeXBlLFxyXG4gIFNtYXJ0R3JpZCxcclxuICBTbWFydEdyaWREYXRhTGF5b3V0LFxyXG4gIFNtYXJ0R3JpZFR5cGUsXHJcbiAgU21hcnRMYXlvdXREZWYsXHJcbn0gZnJvbSAnLi9tb2RlbHMvbW9kZWwnO1xyXG5pbXBvcnQgeyBTbWFydEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi9zbWFydC1ncmlkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgU29ydE1ldGEgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnO1xyXG5pbXBvcnQge1xyXG4gIFRhYmxlQ29sdW1uUmVvcmRlckV2ZW50LFxyXG4gIFRhYmxlSGVhZGVyQ2hlY2tib3hUb2dnbGVFdmVudCxcclxuICBUYWJsZUxhenlMb2FkRXZlbnQsXHJcbiAgVGFibGVSb3dTZWxlY3RFdmVudCxcclxuICBUYWJsZVJvd1VuU2VsZWN0RXZlbnQsXHJcbn0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5T3JkZXJFbnVtIH0gZnJvbSAnLi4vc21hcnQtZmlsdGVyL3Byb2plY3RzJztcclxuaW1wb3J0IHsgTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCB9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xyXG5pbXBvcnQgeyBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwgfSBmcm9tICcuL3NtYXJ0LWdyaWQtdG9vbGJhci11dGlsJztcclxuaW1wb3J0IHsgRXhwYW5kZWRSb3dSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9nZW5lcmljLWNvbXBvbmVudC9leHBhbmRlZC1yb3ctcmVuZGVyZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU21hcnREYXRlUGlwZSwgU21hcnREYXRlVGltZVBpcGUsIFNtYXJ0VGltZVBpcGUgfSBmcm9tICcuLi9zaGFyZWQvc21hcnR0YWJsZS5kYXRlLXBpcGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzbWFydC1ncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc21hcnQtZ3JpZC5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbU21hcnRHcmlkU2VydmljZSwgU21hcnREYXRlUGlwZSwgU21hcnREYXRlVGltZVBpcGUsIFNtYXJ0VGltZVBpcGVdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFBhZ2VTaXplOiBudW1iZXIgPSAxMDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gWzUsIDEwLCAyNSwgNTBdO1xyXG4gIGNvbXBvbmVudExpYnJhcnkgPSBDb21wb25lbnRMaWJyYXJ5O1xyXG4gIHByaXZhdGUgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuICBASW5wdXQoKSBzbWFydEdyaWQ/OiBTbWFydEdyaWQ7XHJcbiAgQElucHV0KCkgdXVpZD86IHN0cmluZztcclxuICBASW5wdXQoKSBwYXJlbnQ/OiBhbnk7XHJcbiAgQElucHV0KCkgcGFyZW50TGF5b3V0Q29tcG9uZW50PzogYW55O1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS10ZXN0aWQnKVxyXG4gIGdldCB0ZXN0SWQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbD8uaWRlbnRpZmllciA/PyBudWxsO1xyXG4gIH1cclxuICBASW5wdXQoKSBkZXY6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gdGFibGVcclxuICBAVmlld0NoaWxkKCd0YWJsZScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSB2Y1JlZlRhYmxlPzogVmlld0NvbnRhaW5lclJlZjtcclxuICBjb21wb25lbnRSZWZUYWJsZT86IENvbXBvbmVudFJlZjxTbWFydHRhYmxlQ29tcG9uZW50PjtcclxuICBzbWFydFRhYmxlITogU21hcnRUYWJsZTxHcmlkUm93PjtcclxuXHJcbiAgLy8gdG9vbGJhclxyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXInKSB0b29sYmFyPzogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ2hlYWRlclRvb2xiYXInKSBfaGVhZGVyVG9vbGJhcj86IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudDtcclxuICBkZWZhdWx0QWN0aW9uVG9vbGJhcklkOiBzdHJpbmcgPSBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwuZGVmYXVsdEFjdGlvblRvb2xiYXJJZDtcclxuXHJcbiAgLy8gZXhwYW5kYWJsZVxyXG4gIEBWaWV3Q2hpbGRyZW4oRXhwYW5kZWRSb3dSZW5kZXJlckNvbXBvbmVudClcclxuICBleHBhbmRlZFJvd3NDb21wcyE6IFF1ZXJ5TGlzdDxFeHBhbmRlZFJvd1JlbmRlcmVyQ29tcG9uZW50PjtcclxuXHJcbiAgZXhwYW5kYWJsZVNlY3Rpb25zPzogRXhwYW5kYWJsZVNlY3Rpb248YW55PltdO1xyXG4gIGV4cGFuZGVkUm93cyA9IHt9O1xyXG5cclxuICAvLyBncmlkRGF0YVxyXG4gIHBhZ2VFdmVudD86IFBhZ2VFdmVudDtcclxuICBkYXRhc291cmNlPzogbnVsbDtcclxuICBwYWdlU2l6ZT86IG51bWJlcjtcclxuICBsZW5ndGg/OiBudW1iZXI7XHJcbiAgcGFnZUluZGV4PzogbnVtYmVyO1xyXG4gIHZhbHVlczogYW55O1xyXG4gIGdyaWRUYWJsZSE6IFNtYXJ0VGFibGU8YW55PjtcclxuICBpc011bHRpcGxlPzogYm9vbGVhbjtcclxuICBzZWxlY3RlZFJvd3M6IEdyaWRSb3dbXSA9IFtdO1xyXG4gIHRhYmxlVHlwZT86IGFueTtcclxuICBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gdGhpcy5kZWZhdWx0UGFnZVNpemVPcHRpb25zO1xyXG4gIGNvbHVtbk1ldGFCeU5hbWU/OiBNYXA8c3RyaW5nLCBHcmlkQ29sdW1uTWV0YT47XHJcblxyXG4gIHNlbGVjdGlvbkNoYW5nZXM6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHVpQWN0aW9uRGVzY3JpcHRvcnM6IE1hcDxzdHJpbmcsIFVpQWN0aW9uRGVzY3JpcHRvcj4gPSBuZXcgTWFwKCk7XHJcbiAgY2VsbFRvQWN0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBVaUFjdGlvbk1vZGVsW10+ID0ge307XHJcblxyXG4gIGFmdGVyVmlld0luaXRFeGVjdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQmxvY2tlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8vIHRyZWVcclxuICB0cmVlQ29udHJvbD86IEZsYXRUcmVlQ29udHJvbDxHcmlkUm93PjtcclxuICB0cmVlRmxhdHRlbmVyPzogTWF0VHJlZUZsYXR0ZW5lcjxHcmlkUm93LCBHcmlkUm93PjtcclxuICB0cmVlRGF0YVNvdXJjZT86IE1hdFRyZWVGbGF0RGF0YVNvdXJjZTxHcmlkUm93LCBHcmlkUm93PjtcclxuICB0cmVlQ2hlY2tsaXN0U2VsZWN0aW9uPzogU2VsZWN0aW9uTW9kZWw8R3JpZFJvdz47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTbWFydEdyaWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZlNlcnZpY2U6IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgcHJpdmF0ZSB1aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlOiBVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzbWFydERhdGVQaXBlOiBTbWFydERhdGVQaXBlLFxyXG4gICAgcHJpdmF0ZSBzbWFydERhdGVUaW1lUGlwZTogU21hcnREYXRlVGltZVBpcGUsXHJcbiAgICBwcml2YXRlIHNtYXJ0VGltZVBpcGU6IFNtYXJ0VGltZVBpcGUsXHJcbiAgICBASW5qZWN0KENPTVBPTkVOVF9MSUJSQVJZKSBwdWJsaWMgY29tcExpYjogQ29tcG9uZW50TGlicmFyeSxcclxuICAgIEBJbmplY3QoJ2dyaWRNZW51SWNvbicpIHByaXZhdGUgZ3JpZE1lbnVJY29uPzogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyBjYWxsZWQgYWZ0ZXIgZXZlcnkgc2VydmljZSBjYWxsIChsb2FkLCBzYXZlLCByZWZyZXNoLCBldGMuKVxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsID0gdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbDtcclxuICAgICAgdGhpcy5yZW5kZXIoKTtcclxuXHJcbiAgICAgIC8vUmVmcmVzaCBleHBhbmRlZCBzZWN0aW9ucyBkYXRhXHJcbiAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEuZXhwYW5kYWJsZSkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRSb3dzQ29tcHMuZm9yRWFjaCgocm93Q29tcCkgPT4gcm93Q29tcC5yZWZyZXNoUm93RGF0YSgpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snc21hcnRHcmlkJ10pIHtcclxuICAgICAgdGhpcy5zbWFydEdyaWQgPSBjaGFuZ2VzWydzbWFydEdyaWQnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIHRoaXMuc2VydmljZS5wYWdpbmF0b3IgPSB0aGlzLnNtYXJ0R3JpZD8ucGFnaW5hdG9yO1xyXG4gICAgICB0aGlzLnNldHVwVG9vbGJhcigpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ3V1aWQnXSkge1xyXG4gICAgICBpZiAoY2hhbmdlc1sndXVpZCddICYmIHRoaXMudXVpZCA9PT0gY2hhbmdlc1sndXVpZCddLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRSb3dzID0ge307XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51dWlkID0gY2hhbmdlc1sndXVpZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFmdGVyVmlld0luaXRFeGVjdXRlZCAmJiB0aGlzLnV1aWQgJiYgdGhpcy5zbWFydEdyaWQpIHtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy51dWlkICYmIHRoaXMuc21hcnRHcmlkKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hZnRlclZpZXdJbml0RXhlY3V0ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB0aGUgc2VsZWN0ZWQgcm93cyBvZiB0aGUgdGFibGVcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRSb3dzKCk6IFNlbGVjdGlvbk1vZGVsPEdyaWRSb3c+IHtcclxuICAgIGlmICghdGhpcy5zbWFydFRhYmxlLnNlbGVjdGlvbikgdGhyb3cgbmV3IEVycm9yKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zbWFydFRhYmxlIS5zZWxlY3Rpb24hO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBHRVQgcmVxdWVzdCB0byB0aGUgZ2VuZXJpYyBHcmlkQVBJIGFuZCByZWZyZXNoZXMgdGhlIHByZXNlbnRlZFxyXG4gICAqIGdyaWQgd2l0aCB0aGUgbmV3ZXN0IG9uZS5cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2V0dXBUb29sYmFyKCk7XHJcbiAgICAvLyB3aWxsIGNhdXNlIHRoaXMuc2VydmljZS5ncmlkTW9kZWxDaGFuZ2VkIHRvIGZpcmVcclxuICAgIGlmICh0aGlzLnV1aWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLmxvYWQodGhpcy51dWlkLCB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U3R5bGUocm93OiBhbnkpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAocm93ICYmIHJvdy5zdHlsZSkge1xyXG4gICAgICBsZXQgc3R5bGUgPSByb3cuc3R5bGU7XHJcbiAgICAgIGxldCBjbGFzc2VzVG9BZGQ6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICAgIGlmIChzdHlsZS5jbGFzc2VzVG9BZGQpIHtcclxuICAgICAgICBzdHlsZS5jbGFzc2VzVG9BZGQuZm9yRWFjaCgoY2w6IHN0cmluZykgPT4gY2xhc3Nlc1RvQWRkLnB1c2goY2wpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFzdHlsZS5jbGFzc2VzVG9SZW1vdmUpIHtcclxuICAgICAgICByZXR1cm4gY2xhc3Nlc1RvQWRkO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjbGFzc2VzVG9BZGQuZmlsdGVyKChjbHMpID0+ICFzdHlsZS5jbGFzc2VzVG9SZW1vdmUuaW5jbHVkZXMoY2xzKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0dXBUb29sYmFyKCkge1xyXG4gICAgLy8gY2hlY2sgaWYgdG9vbGJhciBpcyBhdmFpbGFibGUgX2FuZF8gbmVlZCBzZXQgdXBcclxuICAgIGlmICh0aGlzLnRvb2xiYXIgJiYgdGhpcy5zbWFydEdyaWQpIHtcclxuICAgICAgbGV0IHRvb2xiYXJJZCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciArICdfdG9vbGJhcic7XHJcbiAgICAgIGlmICh0b29sYmFySWQgIT09IHRoaXMudG9vbGJhci5pZCkge1xyXG4gICAgICAgIHRoaXMudG9vbGJhci5pZCA9IHRvb2xiYXJJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9oZWFkZXJUb29sYmFyICYmIHRoaXMuc21hcnRHcmlkKSB7XHJcbiAgICAgIGxldCBoZWFkZXJUb29sYmFySWQgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZElkZW50aWZpZXIgKyAnX2hlYWRlclRvb2xiYXInO1xyXG4gICAgICBpZiAoaGVhZGVyVG9vbGJhcklkICE9PSB0aGlzLl9oZWFkZXJUb29sYmFyLmlkKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyVG9vbGJhci5pZCA9IGhlYWRlclRvb2xiYXJJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhlYWRlclRvb2xiYXIoKTogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IENvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xyXG4gICAgICByZXR1cm4gdGhpcy5faGVhZGVyVG9vbGJhcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFJlZlRhYmxlPy5pbnN0YW5jZS5jb21wb25lbnRSZWZUYWJsZT8uaW5zdGFuY2UuaGVhZGVyVG9vbGJhcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZ3JpZE1vZGVsID0gdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbDtcclxuICAgIGlmIChncmlkTW9kZWwpIHtcclxuICAgICAgdGhpcy5sZW5ndGggPSBncmlkTW9kZWwudG90YWxSb3dDb3VudDtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IGdyaWRNb2RlbC5wYWdlU2l6ZTtcclxuICAgICAgdGhpcy5wYWdlSW5kZXggPSBncmlkTW9kZWwucGFnZUluZGV4ID8/IDA7XHJcbiAgICAgIGlmIChncmlkTW9kZWwucGFnZVNpemVPcHRpb25zICYmIGdyaWRNb2RlbC5wYWdlU2l6ZU9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMucGFnZVNpemVPcHRpb25zID0gZ3JpZE1vZGVsLnBhZ2VTaXplT3B0aW9ucztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnBhZ2VTaXplT3B0aW9ucyA9IHRoaXMuZGVmYXVsdFBhZ2VTaXplT3B0aW9ucztcclxuICAgICAgfVxyXG4gICAgICBpZiAoZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnMpIHtcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuc2hvd0VkaXRDb2x1bW5zID0gZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnM7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uY29sdW1ucykge1xyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YUJ5TmFtZSA9IG5ldyBNYXAoXHJcbiAgICAgICAgICBncmlkTW9kZWw/LnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnMubWFwKChjb2wpID0+IFtjb2wucHJvcGVydHlOYW1lLCBjb2xdKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5NZXRhQnlOYW1lID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQga2luZCA9IGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8ua2luZDtcclxuICAgICAgaWYgKGtpbmQpIHtcclxuICAgICAgICBsZXQgbGF5b3V0RGVmO1xyXG4gICAgICAgIGlmIChraW5kID09PSBHcmlkVmlld0Rlc2NyaXB0b3JLaW5kRW51bS5UQUJMRSkge1xyXG4gICAgICAgICAgbGF5b3V0RGVmID0gU21hcnRMYXlvdXREZWYuVEFCTEU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSBHcmlkVmlld0Rlc2NyaXB0b3JLaW5kRW51bS5UUkVFKSB7XHJcbiAgICAgICAgICBsYXlvdXREZWYgPSBTbWFydExheW91dERlZi5UUkVFO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gR3JpZFZpZXdEZXNjcmlwdG9yS2luZEVudW0uQ0FSRFMpIHtcclxuICAgICAgICAgIGxheW91dERlZiA9IFNtYXJ0TGF5b3V0RGVmLkNBUkQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsYXlvdXREZWYpIHtcclxuICAgICAgICAgIHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPSBsYXlvdXREZWY7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChncmlkTW9kZWw/LnBhZ2luYXRvciA9PT0gdHJ1ZSB8fCBncmlkTW9kZWw/LnBhZ2luYXRvciA9PT0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEucGFnaW5hdG9yID0gZ3JpZE1vZGVsLnBhZ2luYXRvcjtcclxuICAgICAgICB0aGlzLnNlcnZpY2UucGFnaW5hdG9yID0gdGhpcy5zbWFydEdyaWQhLnBhZ2luYXRvcjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignR3JpZE1vZGVsIGlzIHVuZGVmaW5lZCBpbiBjb21wb25lbnQhJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYpIHtcclxuICAgICAgLy8gZmFsbGJhY2ssIGRlZmF1bHQgVEFCTEVcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9IFNtYXJ0TGF5b3V0RGVmLlRBQkxFO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPT09IFNtYXJ0TGF5b3V0RGVmLlRBQkxFKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyVGFibGUoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9PT0gU21hcnRMYXlvdXREZWYuRVhQQU5EQUJMRSkge1xyXG4gICAgICB0aGlzLnJlbmRlckV4cGFuZGFibGVTZWN0aW9ucygpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5DQVJEKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyQ2FyZHMoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9PT0gU21hcnRMYXlvdXREZWYuVFJFRSkge1xyXG4gICAgICB0aGlzLnJlbmRlclRyZWUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNCbG9ja2VkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVGFibGUoKSB7XHJcbiAgICB0aGlzLnZjUmVmVGFibGU/LmNsZWFyKCk7XHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZlRhYmxlID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJUYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuY2xlYXJUcmVlKCk7XHJcbiAgICBpZiAodGhpcy5jb21wTGliID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xyXG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZVNpemUhICogdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5wYWdlSW5kZXghO1xyXG4gICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcclxuICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5vcmRlcmVkQ29sdW1uTmFtZXMubWFwKChvcmRlcmVkQ29sOiBzdHJpbmcpID0+IHtcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnMubWFwKChjb2x1bTogR3JpZENvbHVtbk1ldGEpID0+IHtcclxuICAgICAgICAgIGlmIChvcmRlcmVkQ29sID09PSBjb2x1bS5wcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnB1c2goY29sdW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGFibGVSb3cgPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsIS5wYWdlLnJvd3MhLm1hcCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuY3JlYXRlQ2VsbFRvQWN0aW9uTWFwKCk7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF0YWJsZVJvdy5sZW5ndGgpIHtcclxuICAgICAgbGV0IHBsYWNlSG9sZGVyUm93OiBhbnkgPSB7fTtcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5jb2x1bW5zLm1hcCgobWV0YTogR3JpZENvbHVtbk1ldGEpID0+IHtcclxuICAgICAgICBwbGFjZUhvbGRlclJvd1ttZXRhLnByb3BlcnR5TmFtZV0gPSB1bmRlZmluZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cyA9IFtwbGFjZUhvbGRlclJvd107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS50YWJsZUNvbmZpZz8udGFibGVUeXBlKSB7XHJcbiAgICAgIHRoaXMudGFibGVUeXBlID0gdGhpcy5zbWFydEdyaWQhLnRhYmxlQ29uZmlnLnRhYmxlVHlwZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZXJ2aWNlLmdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uc2VsZWN0aW9uVHlwZSkge1xyXG4gICAgICB0aGlzLnRhYmxlVHlwZSA9XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC52aWV3LmRlc2NyaXB0b3Iuc2VsZWN0aW9uVHlwZSA9PT0gR3JpZFNlbGVjdGlvblR5cGUuQ0hFQ0tCT1hcclxuICAgICAgICAgID8gU21hcnRUYWJsZVR5cGUuQ0hFQ0tfQk9YXHJcbiAgICAgICAgICA6IFNtYXJ0VGFibGVUeXBlLlJPV19TRUxFQ1Q7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRhYmxlVHlwZSA9IFNtYXJ0VGFibGVUeXBlLklOSEVSSVRFRDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5UQUJMRSkge1xyXG4gICAgICBsZXQgdGFibGVDb25maWc6IFNtYXJ0VGFibGVJbnRlcmZhY2U8R3JpZFJvdz4gPSB7XHJcbiAgICAgICAgLi4udGhpcy5zbWFydEdyaWQhLnRhYmxlQ29uZmlnLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnRpdGxlLFxyXG4gICAgICAgIHRhYmxlUm93czogdGFibGVSb3csXHJcbiAgICAgICAgdGFibGVUeXBlOiB0aGlzLnRhYmxlVHlwZSxcclxuICAgICAgICBjdXN0b21TbWFydFRhYmxlSGVhZGVyczogYXdhaXQgdGhpcy5jb25zdHJ1Y3RIZWFkZXIoKSEsXHJcbiAgICAgICAgZXhwYW5kYWJsZTogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGFibGUsXHJcbiAgICAgICAgYXN5bmNPbkV4cGFuZDogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGFibGUsXHJcbiAgICAgICAgZXhwYW5kZWRDb21wb25lbnQ6IHRoaXMuc21hcnRHcmlkIS5leHBhbmRlZENvbXBvbmVudCxcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSW50ZXJmYWNlVHlwZUVudW0uTk9STUFMLFxyXG4gICAgICAgIHNvcnRhYmxlOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRBY3Rpb25Db2RlczogdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5kZWZhdWx0Um93QWN0aW9ucyEsXHJcbiAgICAgICAgZGVmYXVsdEFjdGlvbnM6IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwuZGVmYXVsdFJvd0FjdGlvbnM/Lm1hcCgoY29kZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0eXBlOlxyXG4gICAgICAgICAgICAgIGNvZGUgPT09ICdfYWN0aW9uU2VwYXJhdG9yXydcclxuICAgICAgICAgICAgICAgID8gU21hcnRUYWJsZUJ1dHRvblR5cGUuU0VQQVJBVE9SXHJcbiAgICAgICAgICAgICAgICA6IFNtYXJ0VGFibGVCdXR0b25UeXBlLk5PUk1BTCxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuZXhlY3V0ZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICAgICAgICAvLyBsYWJlbDogdGhpcy5idXR0b25UcmFuc2xhdG9yKHsgY29kZTogY29kZSB9KSxcclxuICAgICAgICAgICAgdHJhbnNsYXRvcjogdGhpcy5idXR0b25UcmFuc2xhdG9yLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIC8vIGFyZ3M6IFtcclxuICAgICAgICAgICAgLy8gICB7XHJcbiAgICAgICAgICAgIC8vICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgICAgIC8vIF0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uaGlnaGxpZ2h0UHJvcGVydHkgJiZcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmhpZ2hsaWdodENsYXNzXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLmhpZ2hsaWdodENsYXNzID0gdGhpcy5zbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXcuZGVzY3JpcHRvci5oaWdobGlnaHRDbGFzcztcclxuICAgICAgICB0YWJsZUNvbmZpZy5oaWdobGlnaHRQcm9wZXJ0eSA9IHRoaXMuc21hcnRHcmlkLmdyaWRNb2RlbC52aWV3LmRlc2NyaXB0b3IuaGlnaGxpZ2h0UHJvcGVydHk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEudWlBY3Rpb25TZXJ2aWNlICYmXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UgJiZcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuc2VydmljZVRvVXNlICYmXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLnZpZXdDb250ZXh0U2VydmljZVxyXG4gICAgICApIHtcclxuICAgICAgICB0YWJsZUNvbmZpZy5vblNlbGVjdGlvbiA9IHRoaXMub25TZWxlY3QuYmluZCh0aGlzKTtcclxuICAgICAgICB0YWJsZUNvbmZpZy5vbkFsbFNlbGVjdGlvbiA9IHRoaXMub25TZWxlY3RBbGwuYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJlcGFyZWQgZm9yIHNpbXBsZSBjbGlja3NcclxuICAgICAgLy8gaWYgKCF0YWJsZUNvbmZpZy5vblJvd0NsaWNrKSB7XHJcbiAgICAgIC8vICAgdGFibGVDb25maWcub25Sb3dDbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICBpZiAoIXRhYmxlQ29uZmlnLm9uUm93RG91YmxlQ2xpY2spIHtcclxuICAgICAgICB0YWJsZUNvbmZpZy5vblJvd0RvdWJsZUNsaWNrID0gdGhpcy5vbkRvdWJsZUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGFibGVDb25maWcuaXNSb3dEaXNhYmxlZFByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLnNlbGVjdGFibGVQcm9wZXJ0eU5hbWUgPSAnc2VsZWN0YWJsZSc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0YWJsZUNvbmZpZy5hc3luY09uRXhwYW5kKSB7XHJcbiAgICAgICAgdGFibGVDb25maWcucm93RXhwYW5kZXIgPSB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzZWxlY3Rpb25Nb2RlID0gdGhpcy5zZXJ2aWNlIS5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uc2VsZWN0aW9uTW9kZTtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICAhdGFibGVDb25maWcuc2VsZWN0aW9uICYmXHJcbiAgICAgICAgIXRhYmxlQ29uZmlnLnNlbGVjdGlvblByb3BlcnR5ICYmXHJcbiAgICAgICAgc2VsZWN0aW9uTW9kZSAhPT0gR3JpZFNlbGVjdGlvbk1vZGUuTk9ORVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLmlzTXVsdGlwbGUgPSBzZWxlY3Rpb25Nb2RlID09PSBHcmlkU2VsZWN0aW9uTW9kZS5NVUxUSVBMRTtcclxuXHJcbiAgICAgICAgdGFibGVDb25maWcuc2VsZWN0aW9uUHJvcGVydHkgPSAnaWQnO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZElkcztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuc2VydmljZS5ncmlkTW9kZWwucGFnZS5yb3dzIS5maWx0ZXIoXHJcbiAgICAgICAgICAoZ3JpZFJvdzogR3JpZFJvdykgPT4gZ3JpZFJvdy5zZWxlY3RlZFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHNlbGVjdGVkSWRzID0gdGhpcy5zZWxlY3RlZFJvd3MubWFwKChncmlkUm93OiBHcmlkUm93KSA9PiBncmlkUm93LmlkISk7XHJcbiAgICAgICAgdGFibGVDb25maWcuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPHN0cmluZz4odGhpcy5pc011bHRpcGxlLCBzZWxlY3RlZElkcyk7XHJcbiAgICAgICAgdGFibGVDb25maWcuc2hvd0NoZWNrYm94SW5IZWFkZXIgPVxyXG4gICAgICAgICAgdHlwZW9mIHRhYmxlQ29uZmlnLnNob3dDaGVja2JveEluSGVhZGVyICE9PSAndW5kZWZpbmVkJ1xyXG4gICAgICAgICAgICA/IHRhYmxlQ29uZmlnLnNob3dDaGVja2JveEluSGVhZGVyIC8vIGtlZXAgaWYgc2V0XHJcbiAgICAgICAgICAgIDogdGhpcy5pc011bHRpcGxlOyAvL2lmIHVuc2V0LCB0dXJuIGl0IG9uIGZvciBtdWx0aXBsZSBzZWxlY3Rpb25cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zbWFydFRhYmxlID0gbmV3IFNtYXJ0VGFibGU8YW55PihcclxuICAgICAgICB0YWJsZUNvbmZpZyxcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZElkZW50aWZpZXIsXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQ/LnNlcnZpY2VUb1VzZVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmVGFibGUpIHtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLnVwZGF0ZVNtYXJ0VGFibGUodGhpcy5zbWFydFRhYmxlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnZjUmVmVGFibGU/LmNsZWFyKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy52Y1JlZlRhYmxlKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmVGFibGUgPSB0aGlzLmNmU2VydmljZS5jcmVhdGVDb21wb25lbnQoXHJcbiAgICAgICAgICB0aGlzLnZjUmVmVGFibGUhLFxyXG4gICAgICAgICAgU21hcnR0YWJsZUNvbXBvbmVudCxcclxuICAgICAgICAgIG5ldyBNYXA8c3RyaW5nLCBhbnk+KFtbJ3NtYXJ0VGFibGUnLCB0aGlzLnNtYXJ0VGFibGVdXSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uID0gdGhpcy5jb21wb25lbnRSZWZUYWJsZS5pbnN0YW5jZS5zb3J0RXZlbnRcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLl9kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChoZWFkZXI6IFNtYXJ0VGFibGVIZWFkZXIpID0+IHtcclxuICAgICAgICAgICAgaGVhZGVyLnByb3BlcnR5TmFtZSA9IGhlYWRlci5wcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDUpO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChoZWFkZXIub3JkZXIpIHtcclxuICAgICAgICAgICAgICBjYXNlIHVuZGVmaW5lZDpcclxuICAgICAgICAgICAgICAgIGhlYWRlci5vcmRlciA9IFNtYXJ0VGFibGVPcmRlci5BU0M7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBjYXNlIFNtYXJ0VGFibGVPcmRlci5BU0M6XHJcbiAgICAgICAgICAgICAgICBoZWFkZXIub3JkZXIgPSBTbWFydFRhYmxlT3JkZXIuREVTQztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgU21hcnRUYWJsZU9yZGVyLkRFU0M6XHJcbiAgICAgICAgICAgICAgICBoZWFkZXIub3JkZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGZpbHRlciA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QuZmluZChcclxuICAgICAgICAgICAgICAoZmlsdGVyRXhwcmVzc2lvbjogRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnkpID0+XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJFeHByZXNzaW9uLnByb3BlcnR5TmFtZSA9PT0gaGVhZGVyLnByb3BlcnR5TmFtZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyICYmICFoZWFkZXIub3JkZXIpIHtcclxuICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0LmluZGV4T2YoZmlsdGVyKTtcclxuICAgICAgICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0LnNwbGljZShpbmRleCEsIDEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlcikge1xyXG4gICAgICAgICAgICAgIGZpbHRlci5vcmRlciA9IGhlYWRlci5vcmRlcjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3JkZXI6IGhlYWRlci5vcmRlcixcclxuICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogaGVhZGVyLnByb3BlcnR5TmFtZSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGdyaWRVcGRhdGVEYXRhOiBHcmlkVXBkYXRlRGF0YSA9IHtcclxuICAgICAgICAgICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcclxuICAgICAgICAgICAgICBvcmRlcmVkQ29sdW1uTmFtZXM6IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJlZENvbHVtbk5hbWVzLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc29ydCh0aGlzLnNtYXJ0R3JpZCEsIGdyaWRVcGRhdGVEYXRhKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLnNtYXJ0VGFibGUuc2VsZWN0aW9uPy5jaGFuZ2VkXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnRSZWZUYWJsZS5pbnN0YW5jZS5fZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgocm93OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VzLm5leHQocm93KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwYW5kKHJvd0lkOiBudW1iZXIpOiBhbnkge31cclxuXHJcbiAgcHVibGljIGFzeW5jIGV4cGFuZEFzeW5jKHJvd0luZGV4OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzKSB7XHJcbiAgICAgIGxldCByb3cgPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93c1tyb3dJbmRleF07XHJcbiAgICAgIGlmIChyb3cgJiYgcm93LmlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZS5leHBhbmQodGhpcy5zbWFydEdyaWQhLCByb3cuaWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJ2aWNlLmV4cGFuZCh0aGlzLnNtYXJ0R3JpZCEsIHJvd0luZGV4LnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJFeHBhbmRhYmxlU2VjdGlvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cGFuZGFibGVTZWN0aW9ucyA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwhLnBhZ2Uucm93cyEubWFwKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0aXRsZTogJycsXHJcbiAgICAgICAgaGVhZGVyQ29tcG9uZW50OiB0aGlzLnNtYXJ0R3JpZCEuaGVhZGVyQ29tcG9uZW50LFxyXG4gICAgICAgIGhlYWRlcklucHV0TmFtZTogdGhpcy5zbWFydEdyaWQhLmhlYWRlckNvbXBvbmVudElucHV0TmFtZSxcclxuICAgICAgICBoZWFkZXJEYXRhOiBpdGVtLFxyXG4gICAgICAgIGN1c3RvbUNvbXBvbmVudDogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGFibGVDb21wb25lbnQsXHJcbiAgICAgICAgaW5wdXROYW1lOiB0aGlzLnNtYXJ0R3JpZCEuZXhwYW5kYWJsZUNvbXBvbmVudElucHV0TmFtZSxcclxuICAgICAgICBkYXRhOiBpdGVtLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNhcmRzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29tcExpYiA9PT0gdGhpcy5jb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcpIHtcclxuICAgICAgdGhpcy5wYWdlSW5kZXggPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2VTaXplISAqIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZUluZGV4ITtcclxuICAgICAgdGhpcy5jb2x1bW5zID0gW107XHJcbiAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzLm1hcCgob3JkZXJlZENvbDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5jb2x1bW5zLm1hcCgoY29sdW06IEdyaWRDb2x1bW5NZXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAob3JkZXJlZENvbCA9PT0gY29sdW0ucHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc21hcnRHcmlkIS5jdXN0b21Db21wb25lbnQpIHtcclxuICAgICAgbGV0IGRhdGFsYXlvdXREZWYgPSB7XHJcbiAgICAgICAgZGF0YUxheW91dDogU21hcnRHcmlkRGF0YUxheW91dC5DT0xVTU4sXHJcbiAgICAgICAgZ3JpZExheW91dDogU21hcnRHcmlkRGF0YUxheW91dC5DT0xVTU4sXHJcbiAgICAgICAgdHlwZTogU21hcnRHcmlkVHlwZS5DVVNUT00sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZGF0YUxheW91dERlZiA9IGRhdGFsYXlvdXREZWY7XHJcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyICsgJ0NhcmQnO1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuY3VzdG9tQ29tcG9uZW50ID0gdGhpcy5pbmplY3Rvci5nZXQodG9rZW4sIG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc011bHRpcGxlU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZSA9IHRoaXMuc2VydmljZSEuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNlbGVjdGlvbk1vZGU7XHJcbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZSA9PT0gR3JpZFNlbGVjdGlvbk1vZGUuTVVMVElQTEU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVHJlZSgpIHtcclxuICAgIHRoaXMudHJlZUNvbnRyb2wgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRyZWVEYXRhU291cmNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50cmVlRmxhdHRlbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJUcmVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhclRhYmxlKCk7XHJcbiAgICBpZiAoIXRoaXMudHJlZURhdGFTb3VyY2UpIHtcclxuICAgICAgdGhpcy50cmVlRmxhdHRlbmVyID0gbmV3IE1hdFRyZWVGbGF0dGVuZXIoXHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1lcixcclxuICAgICAgICB0aGlzLmdldExldmVsLFxyXG4gICAgICAgIHRoaXMuaXNFeHBhbmRhYmxlLFxyXG4gICAgICAgIHRoaXMuZ2V0Q2hpbGRyZW5cclxuICAgICAgKTtcclxuICAgICAgdGhpcy50cmVlQ29udHJvbCA9IG5ldyBGbGF0VHJlZUNvbnRyb2w8R3JpZFJvdz4odGhpcy5nZXRMZXZlbCwgdGhpcy5pc0V4cGFuZGFibGUpO1xyXG4gICAgICB0aGlzLnRyZWVEYXRhU291cmNlID0gbmV3IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSh0aGlzLnRyZWVDb250cm9sLCB0aGlzLnRyZWVGbGF0dGVuZXIpO1xyXG4gICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8R3JpZFJvdz4odGhpcy5pc011bHRpcGxlU2VsZWN0aW9uKCkpO1xyXG4gICAgfVxyXG4gICAgbGV0IG5vZGVzID0gdGhpcy50cmVlQ29udHJvbD8uZGF0YU5vZGVzO1xyXG4gICAgbGV0IGV4cGFuZGVkTm9kZXM6IChzdHJpbmcgfCB1bmRlZmluZWQpW107XHJcbiAgICBpZiAobm9kZXMpIHtcclxuICAgICAgZXhwYW5kZWROb2RlcyA9IG5vZGVzXHJcbiAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gdGhpcy50cmVlQ29udHJvbD8uaXNFeHBhbmRhYmxlKG5vZGUpKVxyXG4gICAgICAgIC5maWx0ZXIoKG5vZGUpID0+IHRoaXMudHJlZUNvbnRyb2w/LmlzRXhwYW5kZWQobm9kZSkpXHJcbiAgICAgICAgLm1hcCgobm9kZSkgPT4gbm9kZS5pZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBleHBhbmRlZE5vZGVzID0gW107XHJcbiAgICB9XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cyEuZm9yRWFjaCgocm93OiBhbnkpID0+IChyb3cubGV2ZWwgPSB1bmRlZmluZWQpKTtcclxuICAgIHRoaXMudHJlZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzIS5maWx0ZXIoKHJvdykgPT4gIXJvdy5wYXJlbnQpO1xyXG4gICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uPy5jbGVhcigpO1xyXG4gICAgdGhpcy50cmVlQ29udHJvbD8uZGF0YU5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgaWYgKG5vZGUuc2VsZWN0ZWQpIHtcclxuICAgICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LnNlbGVjdChub2RlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRyZWVDb250cm9sPy5jb2xsYXBzZUFsbCgpO1xyXG4gICAgZXhwYW5kZWROb2Rlcy5mb3JFYWNoKChyb3dJZCkgPT4ge1xyXG4gICAgICBsZXQgcm93ID0gdGhpcy50cmVlQ29udHJvbD8uZGF0YU5vZGVzLmZpbmQoKHJvdykgPT4gcm93SWQgPT09IHJvdy5pZCk7XHJcbiAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICB0aGlzLnRyZWVDb250cm9sPy5leHBhbmQocm93KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRMZXZlbCA9IChub2RlOiBhbnkpID0+IG5vZGUubGV2ZWwgPz8gMDtcclxuXHJcbiAgaXNFeHBhbmRhYmxlID0gKG5vZGU6IEdyaWRSb3cpID0+IChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZSk7XHJcblxyXG4gIGdldENoaWxkcmVuID0gKG5vZGU6IEdyaWRSb3cpOiBHcmlkUm93W10gPT4ge1xyXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgbGV0IHJvd3MgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2Uucm93cz8uZmlsdGVyKChyb3cpID0+XHJcbiAgICAgICAgbm9kZS5jaGlsZHJlbj8uc29tZSgoY2hpbGQpID0+IGNoaWxkID09PSByb3cuaWQhKVxyXG4gICAgICApO1xyXG4gICAgICBpZiAocm93cykge1xyXG4gICAgICAgIHJldHVybiByb3dzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfTtcclxuXHJcbiAgaGFzQ2hpbGQgPSAoXzogbnVtYmVyLCBfbm9kZURhdGE6IEdyaWRSb3cpID0+IHRoaXMuaXNFeHBhbmRhYmxlKF9ub2RlRGF0YSk7XHJcblxyXG4gIHRyYW5zZm9ybWVyID0gKHJvdzogR3JpZFJvdywgbGV2ZWw6IG51bWJlcikgPT4ge1xyXG4gICAgKHJvdyBhcyBhbnkpLmxldmVsID0gbGV2ZWw7XHJcbiAgICByZXR1cm4gcm93O1xyXG4gIH07XHJcblxyXG4gIGdldFRyZWVJdGVtKHJvdzogR3JpZFJvdyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29sdW1uczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcztcclxuICAgIGxldCBkYXRhOiBhbnkgPSByb3cuZGF0YSE7XHJcbiAgICBpZiAoY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2wpID0+IGRhdGFbY29sXSkuam9pbignICcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvdy5pZCE7XHJcbiAgfVxyXG5cclxuICAvKiogVG9nZ2xlIHRoZSB0cmVlTm9kZSBzZWxlY3Rpb24uIFNlbGVjdC9kZXNlbGVjdCBhbGwgdGhlIGRlc2NlbmRhbnRzIG5vZGUgKi9cclxuICB0cmVlTm9kZVNlbGVjdGlvblRvZ2dsZShub2RlOiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgc2VsZWN0aW9uQmVmb3JlID0gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkLm1hcCgocm93KSA9PiByb3cuaWQpO1xyXG4gICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcclxuICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSkge1xyXG4gICAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2whLmdldERlc2NlbmRhbnRzKG5vZGUpO1xyXG4gICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVxyXG4gICAgICAgID8gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdCguLi5kZXNjZW5kYW50cylcclxuICAgICAgICA6IHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdCguLi5kZXNjZW5kYW50cyk7XHJcbiAgICAgIHRoaXMuY2hlY2tBbGxQYXJlbnRzU2VsZWN0aW9uKG5vZGUpO1xyXG4gICAgfVxyXG4gICAgbGV0IHNlbGVjdGlvbkFmdGVyID0gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkLm1hcCgocm93KSA9PiByb3cuaWQpO1xyXG5cclxuICAgIGxldCBzZWxlY3RlZElkcyA9IHNlbGVjdGlvbkFmdGVyLmZpbHRlcigocykgPT4gIXNlbGVjdGlvbkJlZm9yZS5pbmNsdWRlcyhzKSk7XHJcbiAgICBsZXQgdW5zZWxlY3RlZElkcyA9IHNlbGVjdGlvbkJlZm9yZS5maWx0ZXIoKHMpID0+ICFzZWxlY3Rpb25BZnRlci5pbmNsdWRlcyhzKSk7XHJcbiAgICB0aGlzLm9uU2VsZWN0Um93cyhzZWxlY3RlZElkcywgdW5zZWxlY3RlZElkcyk7XHJcbiAgfVxyXG5cclxuICBjaGVja0FsbFBhcmVudHNTZWxlY3Rpb24obm9kZTogR3JpZFJvdyk6IHZvaWQge1xyXG4gICAgbGV0IHBhcmVudDogR3JpZFJvdyB8IG51bGwgPSB0aGlzLmdldFBhcmVudE5vZGUobm9kZSk7XHJcbiAgICB3aGlsZSAocGFyZW50KSB7XHJcbiAgICAgIHRoaXMuY2hlY2tQYXJlbnROb2RlU2VsZWN0aW9uKHBhcmVudCk7XHJcbiAgICAgIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50Tm9kZShwYXJlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tQYXJlbnROb2RlU2VsZWN0aW9uKG5vZGU6IEdyaWRSb3cpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG5vZGVTZWxlY3RlZCA9IHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpO1xyXG4gICAgY29uc3QgZGVzY0FsbFNlbGVjdGVkID0gdGhpcy5kZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpO1xyXG4gICAgaWYgKG5vZGVTZWxlY3RlZCAmJiAhZGVzY0FsbFNlbGVjdGVkKSB7XHJcbiAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdChub2RlKTtcclxuICAgIH0gZWxzZSBpZiAoIW5vZGVTZWxlY3RlZCAmJiBkZXNjQWxsU2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdChub2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qIEdldCB0aGUgcGFyZW50IG5vZGUgb2YgYSBub2RlICovXHJcbiAgZ2V0UGFyZW50Tm9kZShub2RlOiBHcmlkUm93KTogR3JpZFJvdyB8IG51bGwge1xyXG4gICAgY29uc3QgY3VycmVudExldmVsID0gdGhpcy5nZXRMZXZlbChub2RlKTtcclxuXHJcbiAgICBpZiAoY3VycmVudExldmVsIDwgMSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy50cmVlQ29udHJvbCEuZGF0YU5vZGVzLmluZGV4T2Yobm9kZSkgLSAxO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpID49IDA7IGktLSkge1xyXG4gICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHRoaXMudHJlZUNvbnRyb2whLmRhdGFOb2Rlc1tpXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmdldExldmVsKGN1cnJlbnROb2RlKSA8IGN1cnJlbnRMZXZlbCkge1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciBhbGwgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBub2RlIGFyZSBzZWxlY3RlZC4gKi9cclxuICBkZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGU6IEdyaWRSb3cpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy50cmVlQ29udHJvbCB8fCAhdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcclxuICAgIGNvbnN0IGRlc2NBbGxTZWxlY3RlZCA9XHJcbiAgICAgIGRlc2NlbmRhbnRzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgZGVzY2VuZGFudHMuZXZlcnkoKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbiEuaXNTZWxlY3RlZChjaGlsZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgcmV0dXJuIGRlc2NBbGxTZWxlY3RlZDtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIHBhcnQgb2YgdGhlIGRlc2NlbmRhbnRzIGFyZSBzZWxlY3RlZCAqL1xyXG4gIGRlc2NlbmRhbnRzUGFydGlhbGx5U2VsZWN0ZWQobm9kZTogR3JpZFJvdyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnRyZWVDb250cm9sIHx8ICF0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpO1xyXG4gICAgbGV0IHJlc3VsdCA9IGRlc2NlbmRhbnRzLnNvbWUoKGNoaWxkKSA9PiB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24hLmlzU2VsZWN0ZWQoY2hpbGQpKTtcclxuICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSkge1xyXG4gICAgICByZXN1bHQgPSByZXN1bHQgJiYgIXRoaXMuZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbnN0cnVjdEhlYWRlcigpOiBQcm9taXNlPFNtYXJ0VGFibGVIZWFkZXJbXT4ge1xyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzICYmIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzLmxlbmd0aCkge1xyXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cy5tYXAoYXN5bmMgKGdyaWRSb3c6IEdyaWRSb3cpID0+IHtcclxuICAgICAgICAgIGxldCBuZXdVaUFjdGlvbnMgPSBncmlkUm93LmFjdGlvbnM/LmZpbHRlcihcclxuICAgICAgICAgICAgKHVpQWN0aW9uOiBhbnkpID0+ICF0aGlzLnVpQWN0aW9uRGVzY3JpcHRvcnMuZ2V0KHVpQWN0aW9uLmNvZGUhKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBpZiAobmV3VWlBY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgIG5ld1VpQWN0aW9ucy5tYXAoYXN5bmMgKHVpQWN0aW9uOiBVaUFjdGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlc2NyaXB0b3I6IFVpQWN0aW9uRGVzY3JpcHRvciA9XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc21hcnRHcmlkIS51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlPy5nZXRBY3Rpb25EZXNjcmlwdG9yKHVpQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIGlmICghZGVzY3JpcHRvcikge1xyXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB1aUFjdGlvbi5jb2RlID8/ICdDT0RFJyxcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFVpQWN0aW9uQnV0dG9uVHlwZS5OT1JNQUwsXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvcnMuc2V0KHVpQWN0aW9uLmNvZGUhLCBzdHJ1Y3R1cmVkQ2xvbmUoZGVzY3JpcHRvcikpO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3JlZGVyZWREZXNjQ29sdW1ucyA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJlZENvbHVtbk5hbWVzLm1hcChcclxuICAgICAgKHByb3BlcnR5TmFtZTogc3RyaW5nKSA9PlxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEuZGVzY3JpcHRvciEuY29sdW1ucyEuZmluZChcclxuICAgICAgICAgIChjb2xEZXNjcmlwdG9yOiBHcmlkQ29sdW1uTWV0YSkgPT4gY29sRGVzY3JpcHRvci5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZVxyXG4gICAgICAgIClcclxuICAgICkuZmxhdE1hcCgoZikgPT4gZiA/PyBbXSk7XHJcblxyXG4gICAgbGV0IGhlYWRlciA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBvcmVkZXJlZERlc2NDb2x1bW5zLm1hcChhc3luYyAoZGVzY0NvbHVtbjogR3JpZENvbHVtbk1ldGEpOiBQcm9taXNlPFNtYXJ0VGFibGVIZWFkZXI+ID0+IHtcclxuICAgICAgICBsZXQgY3VzdG9tVGFibGVIZWFkZXIgPSB0aGlzLnNtYXJ0R3JpZCEudGFibGVDb25maWc/LmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzPy5maW5kKFxyXG4gICAgICAgICAgKGhlYWRlcjogU21hcnRUYWJsZUhlYWRlcikgPT4gaGVhZGVyLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbi5wcm9wZXJ0eU5hbWVcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCBmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0gPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0Py5maW5kKFxyXG4gICAgICAgICAgKGZpbHRlckV4cHJlc3Npb246IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5KSA9PlxyXG4gICAgICAgICAgICBmaWx0ZXJFeHByZXNzaW9uLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbiEucHJvcGVydHlOYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgb3JkZXI7XHJcbiAgICAgICAgbGV0IG9yZGVyTnVtYmVyO1xyXG4gICAgICAgIGlmIChmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0pIHtcclxuICAgICAgICAgIG9yZGVyID1cclxuICAgICAgICAgICAgZmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlJdGVtLm9yZGVyID09PSBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeS5PcmRlckVudW0uQXNjXHJcbiAgICAgICAgICAgICAgPyBTbWFydFRhYmxlT3JkZXIuQVNDXHJcbiAgICAgICAgICAgICAgOiBTbWFydFRhYmxlT3JkZXIuREVTQztcclxuICAgICAgICAgIGlmICh0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgb3JkZXJOdW1iZXIgPSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0LmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAoZmlsdGVyOiBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSkgPT4gZmlsdGVyLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbiEucHJvcGVydHlOYW1lXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIG9yZGVyTnVtYmVyKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWduYWxMYWJlbCA9IGN1c3RvbVRhYmxlSGVhZGVyPy5sYWJlbCA/PyBkZXNjQ29sdW1uLmxhYmVsO1xyXG4gICAgICAgIGxldCBsYWJlbCA9ICcnO1xyXG4gICAgICAgIGlmICghZGVzY0NvbHVtbi5oaWRlTGFiZWwpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEudHJhbnNsYXRlU2VydmljZSkge1xyXG4gICAgICAgICAgICBsYWJlbCA9IGF3YWl0IHRoaXMuc21hcnRHcmlkIS50cmFuc2xhdGVTZXJ2aWNlPy5nZXQob3JpZ25hbExhYmVsKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxhYmVsID0gb3JpZ25hbExhYmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBjdXN0b21UYWJsZUhlYWRlcj8ucHJvcGVydGllcztcclxuICAgICAgICBpZiAoIXByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLmdldFNtYXJ0VGFibGVQcm9wZXJ0eShkZXNjQ29sdW1uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5jdXN0b21UYWJsZUhlYWRlcixcclxuICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ2RhdGEuJyArIGRlc2NDb2x1bW4ucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgb3JkZXIsXHJcbiAgICAgICAgICBvcmRlck51bWJlcixcclxuICAgICAgICAgIHByb3BlcnRpZXMsXHJcbiAgICAgICAgICBzdHlsZTogZGVzY0NvbHVtbi5zdHlsZSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgY29tcGxlbWVudCA9IHRoaXMuc21hcnRHcmlkIS50YWJsZUNvbmZpZz8uY3VzdG9tU21hcnRUYWJsZUhlYWRlcnM/LmZpbHRlcihcclxuICAgICAgKHRhYmxlSGVhZGVyOiBTbWFydFRhYmxlSGVhZGVyKSA9PlxyXG4gICAgICAgICFoZWFkZXIuc29tZSgodEg6IFNtYXJ0VGFibGVIZWFkZXIpID0+IHRILnByb3BlcnR5TmFtZS5pbmNsdWRlcyh0YWJsZUhlYWRlci5wcm9wZXJ0eU5hbWUpKVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY29tcGxlbWVudCkge1xyXG4gICAgICBoZWFkZXIucHVzaCguLi5jb21wbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLm9wdGlvbnM/LnNpbXBsZUJ1dHRvbnMpIHtcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLm9wdGlvbnMuc2ltcGxlQnV0dG9ucy5mb3JFYWNoKCh1aUFjdGlvbkNvZGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGhlYWRlci5wdXNoKHtcclxuICAgICAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ3NpbXBsZV9idXR0b25zJyxcclxuICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IFNtYXJ0VGFibGVCdXR0b25UeXBlLlJBSVNFRCxcclxuICAgICAgICAgICAgICBjYWxsYmFjazogdGhpcy5leGVjdXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgLy8gbGFiZWw6IHRoaXMuYnV0dG9uVHJhbnNsYXRvcih7IGNvZGU6IHVpQWN0aW9uQ29kZSB9KSxcclxuICAgICAgICAgICAgICBhcmdzOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGNvZGU6IHVpQWN0aW9uQ29kZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICAgICAgICAgIHNob3dCdXR0b25JZjogKHJvdzogYW55KSA9PlxyXG4gICAgICAgICAgICAgICAgcm93LmFjdGlvbnMuc29tZSgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmNvZGUgPT09IHVpQWN0aW9uQ29kZTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFoZWFkZXIuc29tZSgoaGVhZGVyOiBTbWFydFRhYmxlSGVhZGVyKSA9PiBoZWFkZXIucHJvcGVydHlOYW1lID09PSAnbXlfbWVudScpKSB7XHJcbiAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucz8ucm93VWlBY3Rpb25UeXBlID09PSBHcmlkVWlBY3Rpb25UeXBlLlBPUFVQX01FTlUpIHtcclxuICAgICAgICBsZXQgaWNvbiA9IHRoaXMuZ3JpZE1lbnVJY29uID8/ICdtb3JlX3ZlcnQnO1xyXG4gICAgICAgIGhlYWRlci5wdXNoKHtcclxuICAgICAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ215X21lbnUnLFxyXG4gICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogU21hcnRUYWJsZUJ1dHRvblR5cGUuTUVOVSxcclxuICAgICAgICAgICAgICBjYWxsYmFjazogdGhpcy5leGVjdXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgICBtZW51SXRlbUJ1dHRvbnNQcm9wZXJ0eU5hbWU6ICdhY3Rpb25zJyxcclxuICAgICAgICAgICAgICB0cmFuc2xhdG9yOiB0aGlzLmJ1dHRvblRyYW5zbGF0b3IuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICBhcmdzOiBbXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICBpc1NvcnRhYmxlOiBmYWxzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoZWFkZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNtYXJ0VGFibGVQcm9wZXJ0eShkZXNjQ29sdW1uOiBHcmlkQ29sdW1uTWV0YSkge1xyXG4gICAgaWYgKFxyXG4gICAgICBkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5PZmZzZXREYXRlVGltZScgfHxcclxuICAgICAgZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLnRpbWUuTG9jYWxEYXRlVGltZSdcclxuICAgICkge1xyXG4gICAgICBsZXQgZGF0ZUZvcm1hdCA9IGRlc2NDb2x1bW4udHlwZUZvcm1hdCA/PyAneXl5eS5NTS5kZCBIOm1tJztcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEVUSU1FLFxyXG4gICAgICAgIGRhdGVGb3JtYXQsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKGRlc2NDb2x1bW4udHlwZUNsYXNzID09PSAnamF2YS50aW1lLkxvY2FsRGF0ZScpIHtcclxuICAgICAgbGV0IGRhdGVGb3JtYXQgPSBkZXNjQ29sdW1uLnR5cGVGb3JtYXQgPz8gJ3l5eXkuTU0uZGQnO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUuREFURSxcclxuICAgICAgICBkYXRlRm9ybWF0LFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmIChkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5Mb2NhbFRpbWUnKSB7XHJcbiAgICAgIGxldCBkYXRlRm9ybWF0ID0gZGVzY0NvbHVtbi50eXBlRm9ybWF0ID8/ICdIOm1tJztcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLlRJTUUsXHJcbiAgICAgICAgZGF0ZUZvcm1hdCxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAoZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLmxhbmcuQm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkNIRUNLQk9YLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25DaGFuZ2VQYWdlKGV2ZW50OiBQYWdlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBvZmZzZXQgPSBldmVudC5wYWdlU2l6ZSAqIGV2ZW50LnBhZ2VJbmRleDtcclxuICAgIGxldCBsaW1pdCA9IGV2ZW50LnBhZ2VTaXplO1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc2V0UGFnZShcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3VXVpZCEsXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgb2Zmc2V0LnRvU3RyaW5nKCksXHJcbiAgICAgIGxpbWl0LnRvU3RyaW5nKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25QcmltZUNoYW5nZVBhZ2UoZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG9mZnNldCA9IGV2ZW50LmZpcnN0O1xyXG4gICAgbGV0IGxpbWl0ID0gZXZlbnQucm93cztcclxuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQuZmlyc3Q7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc2V0UGFnZShcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3VXVpZCEsXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgb2Zmc2V0LnRvU3RyaW5nKCksXHJcbiAgICAgIGxpbWl0LnRvU3RyaW5nKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWZyZXNoUGFydGlhbFJlc3VsdHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2UucmVmcmVzaCh0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXdVdWlkISwgdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZShhcmdzOiBhbnlbXSwgcm93OiBhbnksIHVpQWN0aW9uOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBfdWlBY3Rpb246IFVpQWN0aW9uO1xyXG5cclxuICAgIGlmICghdWlBY3Rpb24pIHtcclxuICAgICAgdWlBY3Rpb24gPSByb3cuYWN0aW9ucy5maWx0ZXIoKGFjdGlvbjogVWlBY3Rpb24pID0+IGFjdGlvbi5jb2RlID09PSBhcmdzWzBdLmNvZGUpWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIF91aUFjdGlvbiA9IHsgLi4udWlBY3Rpb24gfTtcclxuICAgIGlmIChfdWlBY3Rpb24uZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgX3VpQWN0aW9uLnBhcmFtcyA9IHtcclxuICAgICAgLi4udWlBY3Rpb24ucGFyYW1zLFxyXG4gICAgICBtb2RlbDogcm93LFxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgdWlBY3Rpb25Nb2RlbDogYW55ID0ge1xyXG4gICAgICBzZXJ2aWNlVG9Vc2U6IHRoaXMuc21hcnRHcmlkIS5zZXJ2aWNlVG9Vc2UsXHJcbiAgICAgIHVpQWN0aW9uOiBfdWlBY3Rpb24sXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucz8udWlBY3Rpb25Nb2RlbENhbGxiYWNrKSB7XHJcbiAgICAgIHVpQWN0aW9uTW9kZWwgPSB0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucyEudWlBY3Rpb25Nb2RlbENhbGxiYWNrKHVpQWN0aW9uTW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc21hcnRHcmlkIS51aUFjdGlvblNlcnZpY2UuZXhlY3V0ZShfdWlBY3Rpb24sIHVpQWN0aW9uTW9kZWwsIHtcclxuICAgICAgd2lkZ2V0SWQ6IHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgbm9kZUlkOiByb3cuaWQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnV0dG9uVHJhbnNsYXRvcih1aUFjdGlvbjogVWlBY3Rpb24pOiBVaUFjdGlvbkRlc2NyaXB0b3Ige1xyXG4gICAgbGV0IGRlc2MgPSB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvcnMuZ2V0KHVpQWN0aW9uLmNvZGUhKTtcclxuICAgIGlmICghZGVzYykge1xyXG4gICAgICBkZXNjID0ge1xyXG4gICAgICAgIHRpdGxlOiB1aUFjdGlvbi5jb2RlISxcclxuICAgICAgICB0eXBlOiBVaUFjdGlvbkJ1dHRvblR5cGUuRkxBVCxcclxuICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKHVpQWN0aW9uLmRlc2NyaXB0b3IpIHtcclxuICAgICAgdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLm1lcmdlQWN0aW9uRGVzY3JpcHRvckludG9DbGllbnQodWlBY3Rpb24uZGVzY3JpcHRvciEsIGRlc2MpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlc2M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbGF5b3V0RGVmKCk6IHR5cGVvZiBTbWFydExheW91dERlZiB7XHJcbiAgICByZXR1cm4gU21hcnRMYXlvdXREZWY7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbGljayhncmlkUm93OiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICB0aGlzLmhhbmRsZU9uQ2xpY2soZ3JpZFJvdyk7XHJcbiAgfVxyXG4gIHB1YmxpYyBvbkRvdWJsZUNsaWNrKGdyaWRSb3c6IEdyaWRSb3cpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlT25DbGljayhncmlkUm93KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlT25DbGljayhncmlkUm93OiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICBsZXQgZGVmYXVsdFJvd0FjdGlvbjogVWlBY3Rpb24gfCB1bmRlZmluZWQ7XHJcbiAgICBpZiAodGhpcy5zZXJ2aWNlLmdyaWRNb2RlbD8uZGVmYXVsdFJvd0FjdGlvbnMpIHtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuc2VydmljZS5ncmlkTW9kZWwuZGVmYXVsdFJvd0FjdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFJvd0FjdGlvbkNvZGUgPSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLmRlZmF1bHRSb3dBY3Rpb25zW2luZGV4XTtcclxuXHJcbiAgICAgICAgZGVmYXVsdFJvd0FjdGlvbiA9IGdyaWRSb3cuYWN0aW9ucy5maW5kKFxyXG4gICAgICAgICAgKHVpQWN0aW9uOiBVaUFjdGlvbikgPT4gdWlBY3Rpb24uY29kZSA9PT0gZGVmYXVsdFJvd0FjdGlvbkNvZGVcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChkZWZhdWx0Um93QWN0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGUoW10sIGdyaWRSb3csIGRlZmF1bHRSb3dBY3Rpb24pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIG9uU2VsZWN0KHJvd0lkOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuaXNCbG9ja2VkID0gdHJ1ZTtcclxuICAgIGNvbnN0IHJvdyA9IHRoaXMuc2VydmljZS5ncmlkTW9kZWwucGFnZS5yb3dzPy5maW5kKChncmlkUm93OiBHcmlkUm93KSA9PiBncmlkUm93LmlkID09PSByb3dJZCk7XHJcbiAgICBjb25zdCB2aWV3Q29udGV4dENoYW5nZSA9IGF3YWl0IHRoaXMuc2VydmljZS5zZWxlY3QodGhpcy5zbWFydEdyaWQhLCByb3chKTtcclxuICAgIHRoaXMuc21hcnRHcmlkIS52aWV3Q29udGV4dFNlcnZpY2UuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKHZpZXdDb250ZXh0Q2hhbmdlKTtcclxuICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgY29uc29sZS5sb2coJ2luIHJlZnJlc2poaicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvblNlbGVjdEFsbChzZWxlY3RlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pc0Jsb2NrZWQgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IHZpZXdDb250ZXh0Q2hhbmdlID0gYXdhaXQgdGhpcy5zZXJ2aWNlLnNlbGVjdEFsbCh0aGlzLnNtYXJ0R3JpZCEsIHNlbGVjdGVkKTtcclxuICAgIHRoaXMuc21hcnRHcmlkIS52aWV3Q29udGV4dFNlcnZpY2UuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKHZpZXdDb250ZXh0Q2hhbmdlKTtcclxuXHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25TZWxlY3RSb3dzKFxyXG4gICAgc2VsZWN0ZWRJZHM6IChzdHJpbmcgfCB1bmRlZmluZWQpW10sXHJcbiAgICB1bnNlbGVjdGVkSWRzOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmlzQmxvY2tlZCA9IHRydWU7XHJcbiAgICBsZXQgc2VsZWN0ZWQ6IHN0cmluZ1tdID0gc2VsZWN0ZWRJZHMuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcclxuICAgIGxldCB1bnNlbGVjdGVkOiBzdHJpbmdbXSA9IHVuc2VsZWN0ZWRJZHMuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcclxuICAgIGNvbnN0IHZpZXdDb250ZXh0Q2hhbmdlID0gYXdhaXQgdGhpcy5zZXJ2aWNlLnNlbGVjdFJvd3ModGhpcy5zbWFydEdyaWQhLCBzZWxlY3RlZCwgdW5zZWxlY3RlZCk7XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCEudmlld0NvbnRleHRTZXJ2aWNlLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZSh2aWV3Q29udGV4dENoYW5nZSk7XHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uUm93U2VsZWN0KGV2ZW50OiBUYWJsZVJvd1NlbGVjdEV2ZW50KSB7XHJcbiAgICBhd2FpdCB0aGlzLm9uU2VsZWN0KGV2ZW50LmRhdGEuaWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25Sb3dVbnNlbGVjdChldmVudDogVGFibGVSb3dVblNlbGVjdEV2ZW50KSB7XHJcbiAgICBhd2FpdCB0aGlzLm9uU2VsZWN0KGV2ZW50LmRhdGEuaWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TZWxlY3RBbGxSb3coZXZlbnQ6IFRhYmxlSGVhZGVyQ2hlY2tib3hUb2dnbGVFdmVudCkge1xyXG4gICAgYXdhaXQgdGhpcy5vblNlbGVjdEFsbChldmVudC5jaGVja2VkKTtcclxuICB9XHJcblxyXG4gIGVkaXRDb2x1bW5zKCk6IHZvaWQge1xyXG4gICAgbGV0IGRpYWxvZ0RhdGE6IFNtYXJ0RGlhbG9nRGF0YSA9IHtcclxuICAgICAgY29udGVudDoge1xyXG4gICAgICAgIHRpdGxlOiAnT3N6bG9wb2sgdGVzdHJlc3phYsOhc2EnLFxyXG4gICAgICB9LFxyXG4gICAgICBzaXplOiB7fSxcclxuICAgICAgY3VzdG9tQ29tcG9uZW50OiBUYWJsZUxheW91dERlZmluZXJDb21wb25lbnQsXHJcbiAgICAgIGN1c3RvbUNvbXBvbmVudElucHV0czoge1xyXG4gICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgdXVpZDogdGhpcy51dWlkLFxyXG4gICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyLFxyXG4gICAgICAgICAgdmlldzogdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC52aWV3LFxyXG4gICAgICAgICAgc2VydmljZTogdGhpcy5zZXJ2aWNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5kaWFsb2cub3BlbihUYWJsZUxheW91dERlZmluZXJDb21wb25lbnQsIHsgZGF0YTogZGlhbG9nRGF0YSB9KTtcclxuICB9XHJcblxyXG4gIC8vUFJJTUVOR1xyXG4gIGNvbHVtbnM6IEdyaWRDb2x1bW5NZXRhW10gPSBbXTtcclxuICBtZW51QnV0dG9ucyE6IE1lbnVJdGVtW107XHJcbiAgQFZpZXdDaGlsZCgnbWVudScpIG1lbnUhOiBNZW51O1xyXG4gIG9uT3B0aW9uc0NsaWNrKGV2ZW50OiBFdmVudCwgcm93OiBHcmlkUm93KSB7XHJcbiAgICB0aGlzLm1lbnVCdXR0b25zID0gW107XHJcblxyXG4gICAgbGV0IG1lbnVBY3Rpb25zID0gdGhpcy5jYWxjdWxhdGVNZW51QWN0aW9ucyhyb3cpO1xyXG5cclxuICAgIG1lbnVBY3Rpb25zPy5tYXAoYXN5bmMgKHVpQWN0aW9uOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGRlc2MgPSBhd2FpdCB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UuZ2V0QWN0aW9uRGVzY3JpcHRvcih1aUFjdGlvbik7XHJcblxyXG4gICAgICB0aGlzLm1lbnVCdXR0b25zLnB1c2goe1xyXG4gICAgICAgIGxhYmVsOiBkZXNjPy50aXRsZSA/PyB1aUFjdGlvbi5jb2RlLFxyXG4gICAgICAgIGljb246IGRlc2M/Lmljb24sXHJcbiAgICAgICAgYXV0b21hdGlvbklkOiB1aUFjdGlvbi5jb2RlLFxyXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXhlY3V0ZShbXSwgcm93LCB1aUFjdGlvbik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubWVudS50b2dnbGUoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJldmlvdXNtdWx0aVNvcnRNZXRhPzogU29ydE1ldGFbXTtcclxuICBhc3luYyBncmlkU29ydChldmVudDogYW55KSB7XHJcbiAgICBsZXQgb3JkZXJCeUxpc3Q6IEFycmF5PEZpbHRlckV4cHJlc3Npb25PcmRlckJ5PiA9IFtdO1xyXG5cclxuICAgIGV2ZW50Lm11bHRpc29ydG1ldGE/Lm1hcCgobWV0YTogU29ydE1ldGEsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgaWYgKHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhICYmIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YS5tYXAoKG9yZGVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAobWV0YS5maWVsZCA9PT0gb3JkZXIuZmllbGQgJiYgb3JkZXIub3JkZXIgIT0gbWV0YS5vcmRlcikge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9yZGVyLm9yZGVyKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAtMTpcclxuICAgICAgICAgICAgICAgIGV2ZW50Lm11bHRpc29ydG1ldGEhLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhID0gZXZlbnQubXVsdGlzb3J0bWV0YTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBldmVudC5tdWx0aXNvcnRtZXRhPy5tYXAoKG1ldGE6IGFueSkgPT4ge1xyXG4gICAgICBvcmRlckJ5TGlzdC5wdXNoKHtcclxuICAgICAgICBwcm9wZXJ0eU5hbWU6IG1ldGEuZmllbGQsXHJcbiAgICAgICAgb3JkZXI6XHJcbiAgICAgICAgICBtZXRhLm9yZGVyID09PSAxXHJcbiAgICAgICAgICAgID8gRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlPcmRlckVudW0uQVNDXHJcbiAgICAgICAgICAgIDogbWV0YS5vcmRlciA9PT0gLTFcclxuICAgICAgICAgICAgICA/IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5T3JkZXJFbnVtLkRFU0NcclxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc29ydCh0aGlzLnNtYXJ0R3JpZCEsIHtcclxuICAgICAgb3JkZXJCeUxpc3Q6IG9yZGVyQnlMaXN0LFxyXG4gICAgICBvcmRlcmVkQ29sdW1uTmFtZXM6IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzISxcclxuICAgIH0pO1xyXG4gIH1cclxuICBsYXp5TG9hZChldmVudD86IFRhYmxlTGF6eUxvYWRFdmVudCkge1xyXG4gICAgdGhpcy5wcmV2aW91c211bHRpU29ydE1ldGEgPSBbXTtcclxuICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJCeUxpc3QubWFwKChvcmRlcikgPT4ge1xyXG4gICAgICB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YT8ucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6IG9yZGVyLnByb3BlcnR5TmFtZSEsXHJcbiAgICAgICAgb3JkZXI6IG9yZGVyLm9yZGVyID09PSBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeU9yZGVyRW51bS5BU0MgPyAxIDogLTEsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBldmVudCEubXVsdGlTb3J0TWV0YSA9IHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGVhZGVyQ2hhbmdlKGV2ZW50OiBNdWx0aVNlbGVjdENoYW5nZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZ3JpZFVwZGF0ZURhdGE6IEdyaWRVcGRhdGVEYXRhID0ge1xyXG4gICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcclxuICAgICAgb3JkZXJlZENvbHVtbk5hbWVzOiB0aGlzLmdldE9yZGVyQ29sdW1OYW1lcyhldmVudC52YWx1ZSEpLFxyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2UudXBkYXRlKHRoaXMudXVpZCEsIHRoaXMuc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciEsIGdyaWRVcGRhdGVEYXRhKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ29sT3JkZXIoZXZlbnQ6IFRhYmxlQ29sdW1uUmVvcmRlckV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZ3JpZFVwZGF0ZURhdGE6IEdyaWRVcGRhdGVEYXRhID0ge1xyXG4gICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcclxuICAgICAgb3JkZXJlZENvbHVtbk5hbWVzOiB0aGlzLmdldE9yZGVyQ29sdW1OYW1lcyhldmVudC5jb2x1bW5zISksXHJcbiAgICB9O1xyXG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnVwZGF0ZSh0aGlzLnV1aWQhLCB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIhLCBncmlkVXBkYXRlRGF0YSk7XHJcbiAgfVxyXG5cclxuICBnZXRPcmRlckNvbHVtTmFtZXMoY29sdW1uczogR3JpZENvbHVtbk1ldGFbXSk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW06IEdyaWRDb2x1bW5NZXRhKSA9PiB7XHJcbiAgICAgIHJldHVybiBjb2x1bS5wcm9wZXJ0eU5hbWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldENvbFZhbHVlKGNvbDogc3RyaW5nLCByb3c6IGFueSkge1xyXG4gICAgaWYgKHJvdy5pY29uc1tjb2xdKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmV0VmFsdWUgPSAnJztcclxuICAgIGlmIChjb2wuaW5jbHVkZXMoJy4nKSkge1xyXG4gICAgICBsZXQgcGF0aEFycmF5ID0gY29sLnNwbGl0KCcuJyk7XHJcbiAgICAgIGxldCBjb2xWYWx1ZSA9IHJvdy5kYXRhO1xyXG4gICAgICBwYXRoQXJyYXkubWFwKChwYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbFZhbHVlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29sVmFsdWUgPSByb3cuZGF0YVtjb2xdO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb2xWYWx1ZSA9IGNvbFZhbHVlW3BhdGhdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldFZhbHVlID0gY29sVmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXRWYWx1ZSA9IHJvdy5kYXRhW2NvbF07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29sdW1uTWV0YUJ5TmFtZSkge1xyXG4gICAgICBsZXQgY29sdW1uTWV0YSA9IHRoaXMuY29sdW1uTWV0YUJ5TmFtZSEuZ2V0KGNvbCk7XHJcbiAgICAgIGlmIChjb2x1bW5NZXRhKSB7XHJcbiAgICAgICAgbGV0IHByb3BlcnR5ID0gdGhpcy5nZXRTbWFydFRhYmxlUHJvcGVydHkoY29sdW1uTWV0YSk7XHJcbiAgICAgICAgc3dpdGNoIChwcm9wZXJ0eT8udHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEU6XHJcbiAgICAgICAgICAgIHJldFZhbHVlID0gdGhpcy5zbWFydERhdGVQaXBlLnRyYW5zZm9ybShyZXRWYWx1ZSwgcHJvcGVydHkuZGF0ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEVUSU1FOlxyXG4gICAgICAgICAgICByZXRWYWx1ZSA9IHRoaXMuc21hcnREYXRlVGltZVBpcGUudHJhbnNmb3JtKHJldFZhbHVlLCBwcm9wZXJ0eS5kYXRlRm9ybWF0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUuVElNRTpcclxuICAgICAgICAgICAgcmV0VmFsdWUgPSB0aGlzLnNtYXJ0VGltZVBpcGUudHJhbnNmb3JtKHJldFZhbHVlLCBwcm9wZXJ0eS5kYXRlRm9ybWF0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0VmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXRJbWFnZVJlc291cmNlSWNvbnMocm93OiBhbnksIGhlYWRlcjogc3RyaW5nKTogSW1hZ2VSZXNvdXJjZVtdIHtcclxuICAgIGlmIChyb3c/Lmljb25zKSB7XHJcbiAgICAgIGxldCBpY29uQ29kZXMgPSByb3c/Lmljb25zW2hlYWRlcl07XHJcbiAgICAgIHJldHVybiBpY29uQ29kZXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG4gIGdldEltYWdlUmVzb3VyY2VTdHlsZShyZXNvdXJjZTogSW1hZ2VSZXNvdXJjZSk6IGFueSB7XHJcbiAgICByZXR1cm4gcmVzb3VyY2Uuc3R5bGUgPyByZXNvdXJjZS5zdHlsZSA6IHt9O1xyXG4gIH1cclxuXHJcbiAgZ2V0Um93Q29sdW1uQWN0aW9uKHJvdzogYW55LCBjb2x1bW5OYW1lOiBzdHJpbmcpOiBVaUFjdGlvbk1vZGVsW10ge1xyXG4gICAgcmV0dXJuIFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5nZXRBY3Rpb25Nb2RlbHNGcm9tTWFwKFxyXG4gICAgICB0aGlzLmNlbGxUb0FjdGlvbk1hcCxcclxuICAgICAgcm93LFxyXG4gICAgICBjb2x1bW5OYW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2hvd0NlbGxUb29sYmFyKHJvdzogYW55LCBjb2x1bW5OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwuc2hvd1Rvb2xiYXIocm93LCBjb2x1bW5OYW1lKTtcclxuICB9XHJcblxyXG4gIHNob3VsZFNob3dPcHRpb25zQnV0dG9uKHJvdzogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLnNob3dNZW51KFxyXG4gICAgICByb3csXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzIVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZU1lbnVBY3Rpb25zKHJvdzogR3JpZFJvdyk6IFVpQWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5jYWxjdWxhdGVNZW51QWN0aW9ucyhcclxuICAgICAgcm93LFxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcyFcclxuICAgICk7XHJcbiAgfVxyXG4gIGNyZWF0ZUNlbGxUb0FjdGlvbk1hcCgpIHtcclxuICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HICYmIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZS5yb3dzKSB7XHJcbiAgICAgIHRoaXMucm93TWVudUFjdGlvbk1vZGVsQ2FjaGUuY2xlYXIoKTtcclxuICAgICAgdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxBcnJheUNhY2hlLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuY2VsbFRvQWN0aW9uTWFwID0gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLmNhbGN1bGF0ZUNlbGxUb0FjdGlvbk1hcChcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2Uucm93cyEsXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQuc2VydmljZVRvVXNlLFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkLmdyaWRJZGVudGlmaWVyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByb3dUcmFja0J5Rm4oaW5kZXg6IG51bWJlciwgcm93OiBhbnkpIHtcclxuICAgIHJldHVybiByb3cuaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJvd01lbnVBY3Rpb25Nb2RlbENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICBwcml2YXRlIHJvd01lbnVBY3Rpb25Nb2RlbEFycmF5Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XHJcblxyXG4gIGdldFJvd01lbnVBY3Rpb25Nb2RlbEFycmF5KHJvdzogR3JpZFJvdyk6IGFueVtdIHtcclxuICAgIGNvbnN0IGNhY2hlS2V5ID0gcm93LmlkITtcclxuICAgIGlmICh0aGlzLnJvd01lbnVBY3Rpb25Nb2RlbEFycmF5Q2FjaGUuaGFzKGNhY2hlS2V5KSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxBcnJheUNhY2hlLmdldChjYWNoZUtleSkhO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XHJcbiAgICAgIGNvbnN0IGxlZnRvdmVyQWN0aW9uTW9kZWxzID0gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLmNhbGN1bGF0ZU1lbnVBY3Rpb25Nb2RlbHMoXHJcbiAgICAgICAgcm93LFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzISxcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuc2VydmljZVRvVXNlLFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllclxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgbWVudVVpQWN0aW9uOiBVaUFjdGlvbiA9IHtcclxuICAgICAgICBjb2RlOiAncm93TWVudScsXHJcbiAgICAgICAgZGVzY3JpcHRvcjoge1xyXG4gICAgICAgICAgaWNvbjogJ2VsbGlwc2lzLXYnLFxyXG4gICAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgICAgdHlwZTogVWlBY3Rpb25CdXR0b25UeXBlLklDT04sXHJcbiAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3ViQWN0aW9uczogbGVmdG92ZXJBY3Rpb25Nb2RlbHMubWFwKChtKSA9PiBtLnVpQWN0aW9uKSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IG1vZGVsID0ge1xyXG4gICAgICAgIHNlcnZpY2VUb1VzZTogdGhpcy5zbWFydEdyaWQhLnNlcnZpY2VUb1VzZSxcclxuICAgICAgICB1aUFjdGlvbjogbWVudVVpQWN0aW9uLFxyXG4gICAgICAgIG5vZGVJZDogcm93LmlkLFxyXG4gICAgICAgIHdpZGdldElkOiB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLnJvd01lbnVBY3Rpb25Nb2RlbENhY2hlLnNldChjYWNoZUtleSwgbW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFyciA9IFt0aGlzLnJvd01lbnVBY3Rpb25Nb2RlbENhY2hlLmdldChjYWNoZUtleSldO1xyXG4gICAgdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxBcnJheUNhY2hlLnNldChjYWNoZUtleSwgYXJyKTtcclxuICAgIHJldHVybiBhcnI7XHJcbiAgfVxyXG59XHJcbiIsIkBpZiAoY29tcExpYiA9PT0gY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbiAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZFwiIGNsYXNzPVwicHJpbWVTbWFydEdyaWQtY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21hcnQtZ3JpZC10b29sYmFyXCI+XHJcbiAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhciAjdG9vbGJhciBbaWRdPVwiJ2dyaWRfbm90X2luaXRpYWxpemVkJ1wiPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxwLXRhYmxlXHJcbiAgICAgICpuZ0lmPVwiIXNtYXJ0R3JpZC5sYXlvdXREZWYgfHwgc21hcnRHcmlkLmxheW91dERlZiA9PT0gbGF5b3V0RGVmKCkuVEFCTEVcIlxyXG4gICAgICAjcFRhYmxlXHJcbiAgICAgIFt2YWx1ZV09XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnBhZ2Uucm93cyFcIlxyXG4gICAgICAob25Tb3J0KT1cImdyaWRTb3J0KCRldmVudClcIlxyXG4gICAgICBbY3VzdG9tU29ydF09XCJ0cnVlXCJcclxuICAgICAgW3NvcnRNb2RlXT1cIidtdWx0aXBsZSdcIlxyXG4gICAgICBbbGF6eV09XCJ0cnVlXCJcclxuICAgICAgKG9uTGF6eUxvYWQpPVwibGF6eUxvYWQoJGV2ZW50KVwiXHJcbiAgICAgIFtyZW9yZGVyYWJsZUNvbHVtbnNdPVwic21hcnRHcmlkLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnNcIlxyXG4gICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgKG9uQ29sUmVvcmRlcik9XCJvbkNvbE9yZGVyKCRldmVudClcIlxyXG4gICAgICAob25Sb3dTZWxlY3QpPVwib25Sb3dTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgIChvblJvd1Vuc2VsZWN0KT1cIm9uUm93VW5zZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgIFtzZWxlY3Rpb25dPVwic2VsZWN0ZWRSb3dzXCJcclxuICAgICAgKG9uSGVhZGVyQ2hlY2tib3hUb2dnbGUpPVwib25TZWxlY3RBbGxSb3coJGV2ZW50KVwiXHJcbiAgICAgIGRhdGFLZXk9XCJpZFwiXHJcbiAgICAgIFtleHBhbmRlZFJvd0tleXNdPVwiZXhwYW5kZWRSb3dzXCJcclxuICAgICAgW3Jvd0V4cGFuZE1vZGVdPVwiJ211bHRpcGxlJ1wiXHJcbiAgICAgIFtyb3dUcmFja0J5XT1cInJvd1RyYWNrQnlGblwiXHJcbiAgICA+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlQ2FwdGlvblwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5ncmlkTW9kZWwudGl0bGVcIiBjbGFzcz1cImNhcHRpb25UaXRsZVwiPlxyXG4gICAgICAgICAgICB7eyBzbWFydEdyaWQuZ3JpZE1vZGVsLnRpdGxlIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNob3dFZGl0Q29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxyXG4gICAgICAgICAgICAgIGRpc3BsYXk9XCJjaGlwXCJcclxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IGNvbHVtbnMgc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZV09XCJ7ICdtaW4td2lkdGgnOiAnMjAwcHgnIH1cIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIENvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJoZWFkZXJDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIEBpZiAoc21hcnRHcmlkLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnMpIHtcclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc011bHRpcGxlICYmICh0YWJsZVR5cGUgPT09ICdjaGVja2JveCcgfHwgdGFibGVUeXBlID09PSAnQ2hlY2tCb3gnKVwiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNHJlbVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94IC8+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCJcclxuICAgICAgICAgICAgPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnByb3BlcnR5TmFtZVwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgICAgICBwUmVvcmRlcmFibGVDb2x1bW5cclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJjb2wucHJvcGVydHlOYW1lXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wucHJvcGVydHlOYW1lXCIgLz5cclxuICAgICAgICAgICAgICB7eyBjb2wubGFiZWwgfX1cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggLz5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDRyZW1cIlxyXG4gICAgICAgICAgICA+PC90aD5cclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wucHJvcGVydHlOYW1lXCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cImNvbC5wcm9wZXJ0eU5hbWVcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHAtc29ydEljb24gW2ZpZWxkXT1cImNvbC5wcm9wZXJ0eU5hbWVcIiAvPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXJUb29sYmFyXCJcclxuICAgICAgICAgICAgICAjaGVhZGVyVG9vbGJhclxyXG4gICAgICAgICAgICAgIFtpZF09XCInaGVhZGVyX25vdF9pbml0aWFsaXplZCdcIlxyXG4gICAgICAgICAgICA+PC9zbWFydC11aS1hY3Rpb24tdG9vbGJhcj5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8dGggKm5nSWY9XCJzbWFydEdyaWQuZXhwYW5kYWJsZVwiPiA8L3RoPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvdyBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiPlxyXG4gICAgICAgIDx0clxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0U3R5bGUocm93KVwiXHJcbiAgICAgICAgICBbY2xhc3Mucm93RXhwYW5kZWRdPVwiZXhwYW5kZWRcIlxyXG4gICAgICAgICAgKGRibGNsaWNrKT1cIm9uRG91YmxlQ2xpY2socm93KVwiXHJcbiAgICAgICAgICAqbmdJZj1cInJvdyAmJiByb3cuZGF0YVwiXHJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJyb3cuaWQgPz8gbnVsbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwiaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIj5cclxuICAgICAgICAgICAgPHAtdGFibGVDaGVja2JveCAqbmdJZj1cInJvdy5zZWxlY3RhYmxlICE9IGZhbHNlXCIgW3ZhbHVlXT1cInJvd1wiIC8+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCI+XHJcbiAgICAgICAgICAgIDxwLXRhYmxlUmFkaW9CdXR0b24gW3ZhbHVlXT1cInJvd1wiIC8+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2wgb2Ygc21hcnRHcmlkPy5ncmlkTW9kZWw/LnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lc1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93Lmljb25zW2NvbF1cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hcnQtdGFibGUtaWNvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGlyIG9mIGdldEltYWdlUmVzb3VyY2VJY29ucyhyb3csIGNvbClcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtYXJ0LWljb24gW2ltYWdlUmVzb3VyY2VdPVwiaXJcIj4gPC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0NlbGxUb29sYmFyKHJvdywgY29sKVwiPlxyXG4gICAgICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgICAgICAgW3VpQWN0aW9uTW9kZWxzXT1cImdldFJvd0NvbHVtbkFjdGlvbihyb3csIGNvbClcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhcm93Lmljb25zW2NvbF1cIiBbaW5uZXJIdG1sXT1cImdldENvbFZhbHVlKGNvbCwgcm93KVwiPiA8L2Rpdj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgIEBpZiAoc2hvd0NlbGxUb29sYmFyKHJvdywgZGVmYXVsdEFjdGlvblRvb2xiYXJJZCkpIHtcclxuICAgICAgICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgICAgICAgICBbdWlBY3Rpb25Nb2RlbHNdPVwiZ2V0Um93Q29sdW1uQWN0aW9uKHJvdywgZGVmYXVsdEFjdGlvblRvb2xiYXJJZClcIlxyXG4gICAgICAgICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIEBpZiAoc2hvdWxkU2hvd09wdGlvbnNCdXR0b24ocm93KSkge1xyXG4gICAgICAgICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICAgICAgIFt1aUFjdGlvbk1vZGVsc109XCJnZXRSb3dNZW51QWN0aW9uTW9kZWxBcnJheShyb3cpXCJcclxuICAgICAgICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwic21hcnRHcmlkLmV4cGFuZGFibGVcIj5cclxuICAgICAgICAgICAgPHAtYnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgIFtwUm93VG9nZ2xlcl09XCJyb3dcIlxyXG4gICAgICAgICAgICAgIFt0ZXh0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICBbcm91bmRlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJleHBhbmRlZCA/ICdwaSBwaS1jaGV2cm9uLXVwJyA6ICdwaSBwaS1jaGV2cm9uLWRvd24nXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgQGlmIChzbWFydEdyaWQuZXhwYW5kYWJsZSkge1xyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJyb3dleHBhbnNpb25cIiBsZXQtcm93PlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICA8bGliLWV4cGFuZGVkLXJvdy1yZW5kZXJlci1jb21wb25lbnRcclxuICAgICAgICAgICAgICAgIFtyb3dJZF09XCJyb3cuaWRcIlxyXG4gICAgICAgICAgICAgICAgW3Jvd0V4cGFuZGVyXT1cInRoaXNcIlxyXG4gICAgICAgICAgICAgICAgW2V4cGFuZGVkQ29tcG9uZW50XT1cInNtYXJ0R3JpZC5leHBhbmRlZENvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICBbc21hcnRHcmlkXT1cInRoaXMuc21hcnRHcmlkXCJcclxuICAgICAgICAgICAgICA+PC9saWItZXhwYW5kZWQtcm93LXJlbmRlcmVyLWNvbXBvbmVudD5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgfVxyXG4gICAgPC9wLXRhYmxlPlxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdJZj1cInNtYXJ0R3JpZC5sYXlvdXREZWYgPT09IGxheW91dERlZigpLkNBUkQgJiYgc21hcnRHcmlkLmRhdGFMYXlvdXREZWZcIlxyXG4gICAgICBjbGFzcz1cImNhcmRzLWNvbnRhaW5lclwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJzpcclxuICAgICAgICAgIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gJ3JlcGVhdCgnICsgc21hcnRHcmlkLm51bWJlck9mQ29sdW1uICsgJywgMWZyKSdcclxuICAgICAgICAgICAgOiAnJyxcclxuICAgICAgfVwiXHJcbiAgICA+XHJcbiAgICAgIDxhcHAtc21hcnQtZ3JpZC1jYXJkXHJcbiAgICAgICAgY2xhc3M9XCJzbWFydEdyaWQtY2FyZC1jb250YWluZXJcIlxyXG4gICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2Ygc21hcnRHcmlkLmdyaWRNb2RlbC5wYWdlLnJvd3NcIlxyXG4gICAgICAgIFtjbGFzcy5jbGlja2FibGUtcm93XT1cInJvdy5sYXlvdXREZXNjcmlwdG9yXCJcclxuICAgICAgICAoY2xpY2spPVwicm93LmxheW91dERlc2NyaXB0b3IgJiYgb25DbGljayhyb3cpXCJcclxuICAgICAgICBbaXRlbV09XCJyb3dcIlxyXG4gICAgICAgIFtzbWFydEdyaWRdPVwic21hcnRHcmlkXCJcclxuICAgICAgICBbcGFyZW50XT1cInRoaXMucGFyZW50XCJcclxuICAgICAgICBbcGFyZW50TGF5b3V0Q29tcG9uZW50XT1cInRoaXMucGFyZW50TGF5b3V0Q29tcG9uZW50XCJcclxuICAgICAgPjwvYXBwLXNtYXJ0LWdyaWQtY2FyZD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5wYWdpbmF0b3JcIiBjbGFzcz1cInBhZ2luYXRvci1yb3dcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInBhZ2luYXRvci13cmFwXCI+XHJcbiAgICAgICAgPHAtcGFnaW5hdG9yXHJcbiAgICAgICAgICBbZmlyc3RdPVwicGFnZUluZGV4IVwiXHJcbiAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cImxlbmd0aCFcIlxyXG4gICAgICAgICAgW3Jvd3NdPVwicGFnZVNpemVcIlxyXG4gICAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxyXG4gICAgICAgICAgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cIntmaXJzdH0gLSB7bGFzdH0gLyB7dG90YWxSZWNvcmRzfVwiXHJcbiAgICAgICAgICAob25QYWdlQ2hhbmdlKT1cIm9uUHJpbWVDaGFuZ2VQYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcclxuICAgICAgICAgIGRyb3Bkb3duQXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICA+PC9wLXBhZ2luYXRvcj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGljb249XCJwaSBwaS1yZWZyZXNoXCJcclxuICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHRcIlxyXG4gICAgICAgIHBUb29sdGlwPVwiRnJpc3PDrXTDqXNcIlxyXG4gICAgICAgIChjbGljayk9XCJyZWZyZXNoUGFydGlhbFJlc3VsdHMoKVwiXHJcbiAgICAgICAgKm5nSWY9XCJzbWFydEdyaWQuZ3JpZE1vZGVsPy5yZWZyZXNoRW5hYmxlZFwiXHJcbiAgICAgID48L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHAtbWVudSAjbWVudSBbbW9kZWxdPVwibWVudUJ1dHRvbnNcIiBbcG9wdXBdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiPiA8L3AtbWVudT5cclxuICA8L2Rpdj5cclxufSBAZWxzZSB7XHJcbiAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZFwiIGNsYXNzPVwic21hcnRHcmlkLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNtYXJ0LWdyaWQtdG9vbGJhclwiPlxyXG4gICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXIgI3Rvb2xiYXIgW2lkXT1cIidncmlkX25vdF9pbml0aWFsaXplZCdcIj48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgKGNsaWNrKT1cImVkaXRDb2x1bW5zKClcIlxyXG4gICAgICAgIG1hdC1taW5pLWZhYlxyXG4gICAgICAgIGNvbG9yPVwidGV4dC1wcmltYXJ5XCJcclxuICAgICAgICAqbmdJZj1cInNtYXJ0R3JpZC5zaG93RWRpdENvbHVtbnNcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1pY29uIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBhcmlhLWxhYmVsPVwiQ29sdW1uc1wiIGNsYXNzPVwic21hcnQtZ3JpZC1lZGl0LWljb25cIlxyXG4gICAgICAgICAgPnZpZXdfY29sdW1uczwvbWF0LWljb25cclxuICAgICAgICA+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIDxkaXYgW25nQ2xhc3NdPVwiaXNCbG9ja2VkID8gJ2Jsb2NrZWQnIDogJydcIj48L2Rpdj4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21hcnRHcmlkQ29udGVudFwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQuc2hvd1Jlc3VsdENvdW50XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hcnRHcmlkLWRhdGEtbnVtYmVyXCI+XHJcbiAgICAgICAgICAgIHt7IHNtYXJ0R3JpZC5ncmlkTW9kZWwudG90YWxSb3dDb3VudCB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtYXJ0LWdyaWQtdGFibGUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICN0YWJsZT48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQubGF5b3V0RGVmID09PSBsYXlvdXREZWYoKS5FWFBBTkRBQkxFXCI+XHJcbiAgICAgICAgPHNtYXJ0LWV4cGFuZGFibGUtc2VjdGlvblxyXG4gICAgICAgICAgI2dyaWRFeHBhbmRhYmxlU2VjdGlvblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGV4cGFuZGFibGVTZWN0aW9uIG9mIGV4cGFuZGFibGVTZWN0aW9uc1wiXHJcbiAgICAgICAgICBbZGF0YV09XCJleHBhbmRhYmxlU2VjdGlvblwiXHJcbiAgICAgICAgPjwvc21hcnQtZXhwYW5kYWJsZS1zZWN0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwic21hcnRHcmlkLmxheW91dERlZiA9PT0gbGF5b3V0RGVmKCkuQ0FSRCAmJiBzbWFydEdyaWQuZGF0YUxheW91dERlZlwiXHJcbiAgICAgICAgY2xhc3M9XCJjYXJkcy1jb250YWluZXJcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICdncmlkLXRlbXBsYXRlLWNvbHVtbnMnOlxyXG4gICAgICAgICAgICBzbWFydEdyaWQubnVtYmVyT2ZDb2x1bW4gIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgID8gJ3JlcGVhdCgnICsgc21hcnRHcmlkLm51bWJlck9mQ29sdW1uICsgJywgMWZyKSdcclxuICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgIH1cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGFwcC1zbWFydC1ncmlkLWNhcmRcclxuICAgICAgICAgIGNsYXNzPVwic21hcnRHcmlkLWNhcmQtY29udGFpbmVyXCJcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2Ygc21hcnRHcmlkLmdyaWRNb2RlbC5wYWdlLnJvd3NcIlxyXG4gICAgICAgICAgW2NsYXNzLmNsaWNrYWJsZS1yb3ddPVwicm93LmxheW91dERlc2NyaXB0b3JcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInJvdy5sYXlvdXREZXNjcmlwdG9yICYmIG9uQ2xpY2socm93KVwiXHJcbiAgICAgICAgICBbaXRlbV09XCJyb3dcIlxyXG4gICAgICAgICAgW3NtYXJ0R3JpZF09XCJzbWFydEdyaWRcIlxyXG4gICAgICAgICAgW3BhcmVudF09XCJ0aGlzLnBhcmVudFwiXHJcbiAgICAgICAgICBbcGFyZW50TGF5b3V0Q29tcG9uZW50XT1cInRoaXMucGFyZW50TGF5b3V0Q29tcG9uZW50XCJcclxuICAgICAgICA+PC9hcHAtc21hcnQtZ3JpZC1jYXJkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwic21hcnRHcmlkLmxheW91dERlZiA9PT0gbGF5b3V0RGVmKCkuVFJFRSAmJiB0cmVlQ29udHJvbFwiXHJcbiAgICAgICAgY2xhc3M9XCJ0cmVlLWNvbnRhaW5lclwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucyc6XHJcbiAgICAgICAgICAgIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgPyAncmVwZWF0KCcgKyBzbWFydEdyaWQubnVtYmVyT2ZDb2x1bW4gKyAnLCAxZnIpJ1xyXG4gICAgICAgICAgICAgIDogJycsXHJcbiAgICAgICAgfVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LXRyZWUgW2RhdGFTb3VyY2VdPVwidHJlZURhdGFTb3VyY2UhXCIgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sIVwiPlxyXG4gICAgICAgICAgPG1hdC10cmVlLW5vZGVcclxuICAgICAgICAgICAgKm1hdFRyZWVOb2RlRGVmPVwibGV0IG5vZGVcIlxyXG4gICAgICAgICAgICBtYXRUcmVlTm9kZVRvZ2dsZVxyXG4gICAgICAgICAgICBtYXRUcmVlTm9kZVBhZGRpbmdcclxuICAgICAgICAgICAgbWF0VHJlZU5vZGVQYWRkaW5nSW5kZW50PVwiMjRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBkaXNhYmxlZCBjbGFzcz1cInRyZWUtYnV0dG9uXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrbGlzdC1sZWFmLW5vZGVcIlxyXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LmlzU2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidHJlZU5vZGVTZWxlY3Rpb25Ub2dnbGUobm9kZSlcIlxyXG4gICAgICAgICAgICAgID57eyBnZXRUcmVlSXRlbShub2RlKSB9fTwvbWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgIDwvbWF0LXRyZWUtbm9kZT5cclxuXHJcbiAgICAgICAgICA8bWF0LXRyZWUtbm9kZVxyXG4gICAgICAgICAgICAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZTsgd2hlbjogaGFzQ2hpbGRcIlxyXG4gICAgICAgICAgICBtYXRUcmVlTm9kZVBhZGRpbmdcclxuICAgICAgICAgICAgbWF0VHJlZU5vZGVQYWRkaW5nSW5kZW50PVwiMjRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgbWF0VHJlZU5vZGVUb2dnbGVcclxuICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtYnV0dG9uXCJcclxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidUb2dnbGUgJyArIG5vZGUuaXRlbVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCI+XHJcbiAgICAgICAgICAgICAgICB7eyB0cmVlQ29udHJvbCEuaXNFeHBhbmRlZChub2RlKSA/ICdleHBhbmRfbW9yZScgOiAnY2hldnJvbl9yaWdodCcgfX1cclxuICAgICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LmlzU2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImRlc2NlbmRhbnRzUGFydGlhbGx5U2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidHJlZU5vZGVTZWxlY3Rpb25Ub2dnbGUobm9kZSlcIlxyXG4gICAgICAgICAgICAgID57eyBnZXRUcmVlSXRlbShub2RlKSB9fTwvbWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgIDwvbWF0LXRyZWUtbm9kZT5cclxuICAgICAgICA8L21hdC10cmVlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5wYWdpbmF0b3JcIiBjbGFzcz1cInBhZ2luYXRvci1yb3ctbWF0ZXJpYWxcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHBCdXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBpY29uPVwicGkgcGktcmVmcmVzaFwiXHJcbiAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0XCJcclxuICAgICAgICBwVG9vbHRpcD1cIkZyaXNzw610w6lzXCJcclxuICAgICAgICAoY2xpY2spPVwicmVmcmVzaFBhcnRpYWxSZXN1bHRzKClcIlxyXG4gICAgICAgICpuZ0lmPVwic21hcnRHcmlkLmdyaWRNb2RlbD8ucmVmcmVzaEVuYWJsZWRcIlxyXG4gICAgICA+PC9idXR0b24+XHJcbiAgICAgIDxtYXQtcGFnaW5hdG9yXHJcbiAgICAgICAgKm5nSWY9XCJzbWFydEdyaWQucGFnaW5hdG9yICYmICF0cmVlQ29udHJvbFwiXHJcbiAgICAgICAgI3BhZ2luYXRvclxyXG4gICAgICAgIFtsZW5ndGhdPVwibGVuZ3RoXCJcclxuICAgICAgICBbcGFnZUluZGV4XT1cInBhZ2VJbmRleFwiXHJcbiAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAgICAgKHBhZ2UpPVwib25DaGFuZ2VQYWdlKCRldmVudClcIlxyXG4gICAgICA+PC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbn1cclxuIl19