keevo-components 1.8.418 → 1.8.419
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.
- package/esm2022/lib/api/base-components/base-component-dropdown.mjs +2 -2
- package/esm2022/lib/api/base-components/base-component-multi-select.mjs +12 -9
- package/esm2022/lib/api/components/table/table.config.mjs +1 -1
- package/esm2022/lib/api/pipes/capitalize.pipe.mjs +7 -1
- package/esm2022/lib/components/kv-content-viewer/kv-content-viewer.component.mjs +45 -3
- package/esm2022/lib/components/kv-layout/dropdown-master/dropdown-master.component.mjs +3 -3
- package/esm2022/lib/components/kv-layout/layout/kv-layout.component.mjs +3 -3
- package/esm2022/lib/components/kv-table/kv-table.component.mjs +9 -3
- package/esm2022/lib/components/kv-table-edit/kv-table-edit.component.mjs +6 -3
- package/esm2022/lib/components/kv-table-expandable/kv-table-expandable.component.mjs +20 -4
- package/esm2022/lib/components/kv-tree-table/kv-tree-table.component.mjs +3 -3
- package/fesm2022/keevo-components.mjs +100 -24
- package/fesm2022/keevo-components.mjs.map +1 -1
- package/lib/api/base-components/base-component-multi-select.d.ts +1 -0
- package/lib/api/components/table/table.config.d.ts +1 -0
- package/lib/api/pipes/capitalize.pipe.d.ts +1 -0
- package/lib/components/kv-content-viewer/kv-content-viewer.component.d.ts +3 -1
- package/lib/components/kv-table/kv-table.component.d.ts +2 -1
- package/lib/components/kv-table-edit/kv-table-edit.component.d.ts +2 -1
- package/lib/components/kv-table-expandable/kv-table-expandable.component.d.ts +6 -3
- package/package.json +1 -1
|
@@ -229,11 +229,11 @@ export class KvTreetableComponent {
|
|
|
229
229
|
this.inputBusca.nativeElement.value = '';
|
|
230
230
|
}
|
|
231
231
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvTreetableComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
232
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvTreetableComponent, selector: "kv-tree-table", inputs: { disableRowNodeSticky: "disableRowNodeSticky", config: "config", dataSource: "dataSource", gridLines: "gridLines", tableCaptalized: "tableCaptalized", selectedItems: "selectedItems", paginator: "paginator", rows: "rows", treeTableDraggable: "treeTableDraggable", transferArrayItem: "transferArrayItem", ordenacao: "ordenacao", totalRecords: "totalRecords", textoEmptyMessage: "textoEmptyMessage", childrenRecoil: "childrenRecoil", showHeader: "showHeader", scrollHeight: "scrollHeight", pageLinksOptions: "pageLinksOptions", pageLinks: "pageLinks", showFirstLastIcon: "showFirstLastIcon", _templates: ["templates", "_templates"] }, outputs: { onFilter: "onFilter", onPaginate: "onPaginate", onActiveItem: "onActiveItem", onActiveItemLote: "onActiveItemLote", doubleClickEvent: "doubleClickEvent", onNodeSelect: "onNodeSelect", onNodeUnselect: "onNodeUnselect", onDropItem: "onDropItem" }, host: { listeners: { "window:resize": "onWindowResize($event)" } }, queries: [{ propertyName: "templates", predicate: TemplateDirective }], viewQueries: [{ propertyName: "pTreeTable", first: true, predicate: TreeTable, descendants: true }, { propertyName: "inputBusca", first: true, predicate: ["inputBusca"], descendants: true }], ngImport: i0, template: "<div>\r\n <p-treeTable\r\n #tt\r\n cdkDropList\r\n class=\"example-list\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n [value]=\"dataSource\"\r\n [columns]=\"config.columns\"\r\n [resizableColumns]=\"true\"\r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [resizableColumns]=\"true\"\r\n [paginator]=\"paginator\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalRecords\"\r\n [rowsPerPageOptions]=\"[5, 10, 25, 50]\"\r\n [showFirstLastIcon]=\"tamanhoTela > 960 ? true : false\"\r\n [pageLinks]=\"tamanhoTela > 960 ? 2 : 1\"\r\n [styleClass]=\"gridLines ? 'p-treetable-gridlines' : ''\"\r\n [(selection)]=\"selectedItems\"\r\n [lazy]=\"config.lazy\"\r\n (onLazyLoad)=\"paginate($event)\"\r\n (onNodeSelect)=\"onNodeSelected($event)\"\r\n (onNodeUnselect)=\"onNodeUnselected($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{first} - {last} de {totalRecords}\"\r\n [scrollHeight]=\"scrollHeight\"\r\n >\r\n <ng-template pTemplate=\"caption\" *ngIf=\"config.enableCation\">\r\n <div\r\n class=\"flex flex-row flex-wrap justify-content-between align-items-center grid formgrid p-fluid col-12 m-0\"\r\n style=\"background-color: #eaeaea\"\r\n >\r\n <div class=\"col-12 flex flex-column\">\r\n <div *ngIf=\"config.title\" class=\"text-md font-bold my-3\">\r\n {{ config.title }}\r\n </div>\r\n <div *ngIf=\"config.subtitle\" class=\"text-sm mb-4 font-medium\">\r\n {{ config.subtitle }}\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-row align-items-center col-10 p-0 md:col-6 lg:col-4 justify-content-center {{\r\n tamanhoTela < 768 ? '' : 'input-search'\r\n }}\"\r\n >\r\n <span *ngIf=\"config.enableFilter\" class=\"p-input-icon-left\">\r\n <i class=\"pi pi-search\"></i>\r\n\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"true\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(tt, $event)\"\r\n placeholder=\"Pesquisar...\"\r\n class=\"h-2rem\"\r\n #inputBusca\r\n />\r\n </span>\r\n </div>\r\n\r\n <div class=\"flex flex-row col-1 justify-content-end p-0\">\r\n <div class=\"flex flex-row gap-2 btns-options\">\r\n @for (action of config.actionsLote; track $index) {\r\n @if((selectedItems.length > 0 || action.showAcoesLote) &&\r\n exibirCampo(action, this.action)) {\r\n <kv-button\r\n (onClick)=\"action?.command(); activeItemLote(selectedItems)\"\r\n [pTooltip]=\"getOrExecute(action.tooltip, selectedItems)\"\r\n [tooltipPosition]=\"'bottom'\"\r\n [disabled]=\"getOrExecute(action.disabled, selectedItems) || false\"\r\n [icon]=\"getOrExecute(action.icon, selectedItems)\"\r\n [severity]=\"action.severity || 'tertiary'\"\r\n />\r\n } }\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n @if(showHeader){\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @for(col of columns; track $index){\r\n <th\r\n [ttSortableColumn]=\"col.field\"\r\n [ttSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div>\r\n <div [ngClass]=\"{ flex: $index == 0, 'gap-3': $index == 0 }\">\r\n <div *ngIf=\"$index == 0 && config.enableSelect\">\r\n <p-treeTableHeaderCheckbox\r\n (click)=\"activeItemLote(selectedItems)\"\r\n />\r\n </div>\r\n \r\n <div class=\"flex flex-row align-items-center {{ align(col) }}\">\r\n <span class=\"text-xs\">{{ col.header }}</span>\r\n \r\n @if(col.sortable) {\r\n <p-treeTableSortIcon [field]=\"col.field\" class=\"pb-1\"/>\r\n \r\n }\r\n \r\n <span\r\n *ngIf=\"col.headerTooltip\"\r\n class=\"material-symbols-outlined flex align-items-center\"\r\n [pTooltip]=\"col.headerTooltip\"\r\n >info</span\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n @if (config.actions?.length ?? 0 > 0) {\r\n <th [style.width]=\"5\"></th>\r\n } }\r\n </tr>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @for (col of columns; track $index) {\r\n <th\r\n [ttSortableColumn]=\"col.field\"\r\n [ttSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div class=\"flex flex-row align-items-center {{ align(col) }}\">\r\n <span class=\"text-xs\">{{ col.header }}</span>\r\n \r\n @if(col.sortable) {\r\n <p-treeTableSortIcon [field]=\"col.field\" class=\"pb-1\"/>\r\n }\r\n </div>\r\n </th>\r\n } @if (config.actions?.length ?? 0 > 0) {\r\n <th [style.width]=\"5\"></th>\r\n }\r\n </tr>\r\n </ng-template>\r\n }\r\n\r\n\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-rowNode\r\n let-rowData=\"rowData\"\r\n let-columns=\"columns\"\r\n > \r\n\r\n @if(treeTableDraggable) {\r\n <tr\r\n cdkDrag\r\n cdkDragLockAxis=\"y\"\r\n [cdkDragData]=\"rowNode\"\r\n [ttRow]=\"rowNode\"\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{ capitalize: tableCaptalized }\"\r\n >\r\n \r\n @for(col of columns; track $index){\r\n <td\r\n class=\"draggable-cell\"\r\n [style.position]=\"!disableRowNodeSticky && rowNode.level !== 0 ? 'sticky' : null\"\r\n \r\n >\r\n \r\n <!-- [style.left.px]=\"\r\n childrenRecoil && rowNode.level !== 0 ? rowNode.level * 30 : null\r\n \" -->\r\n \r\n <div class=\"flex flex-row {{ align(col) }}\">\r\n \r\n <div\r\n class=\"w-full-h-full flex align-items-center\"\r\n *ngIf=\"$index == 0\"\r\n \r\n >\r\n <span\r\n class=\"material-symbols-outlined drag-icon\"\r\n style=\"cursor: grab; font-size: 25px; color: #6b7280; opacity: 0.9;\"\r\n cdkDragHandle\r\n >\r\n drag_indicator\r\n </span>\r\n <p-treeTableToggler \r\n class=\"hiddenVisible\" \r\n [rowNode]=\"rowNode\"\r\n />\r\n\r\n @if(config.enableSelect) {\r\n <p-treeTableCheckbox\r\n [disabled]=\"isDisabledCheckbox(rowData, rowNode)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [value]=\"rowNode\"\r\n [ngStyle]=\"{\r\n 'display': isSelectEnabled(rowData, rowNode) ? 'block' : 'none',\r\n 'margin-left': config.visibleCheckboxFunction ? '-34px' : '0px'\r\n }\"\r\n />\r\n }\r\n \r\n </div>\r\n\r\n <div class=\"flex flex-row align-items-center\">\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-center gap-2\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n }\r\n\r\n <i\r\n *ngIf=\"col.boolean\"\r\n class=\"pi {{\r\n rowData[col.field] ? 'pi-check text-green-300' : ''\r\n }}\"\r\n style=\"font-size: 1.1rem\"\r\n ></i>\r\n\r\n <div class=\"flex flex-column\" *ngIf=\"!col.boolean\">\r\n <span class=\"m-0 text-xs\">{{ rowData[col.field] }}</span>\r\n\r\n <p *ngIf=\"col.subtitle\" class=\"m-0 text-xs font-semibold\">\r\n {{ rowData[col.subtitle] }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <span *ngIf=\"col.template && validateShowTemplate(rowNode, col)\">\r\n <ng-container\r\n *ngIf=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n >\r\n </ng-container>\r\n </span>\r\n </td>\r\n }\r\n\r\n <td\r\n style=\"border-left: none; text-align: center\"\r\n *ngIf=\"(config.actions?.length ?? 0 > 0) || config.actionsPai\"\r\n [style.borderRight]=\"rowNode.level === 0 ? 'none' : ''\"\r\n [style.borderLeft]=\"rowNode.level === 0 ? 'none' : ''\"\r\n >\r\n <div\r\n *ngIf=\"\r\n (config.actions?.length ?? 0 > 0) &&\r\n validateActionPosition(rowNode)\r\n \"\r\n class=\"flex align-items-center justify-content-center\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz p-1\"\r\n style=\"font-size: 20px\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n more_horiz\r\n </span>\r\n\r\n \r\n\r\n @for(action of config.actions; track $index) {\r\n {{ criarMenusModal(rowData) }}\r\n }\r\n \r\n <p-menu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"menuItems\"\r\n appendTo=\"body\"\r\n ></p-menu>\r\n \r\n </div>\r\n \r\n @if(config.actionsPai?.length ?? 0 > 0 && rowNode.level == 0){\r\n <div class=\"flex justify-content-end align-items-center \">\r\n @for (actionPai of config.actionsPai; track $index) {\r\n @if(getOrExecute(actionPai.visible, rowData) ?? true) {\r\n <kv-button\r\n (onClick)=\"activeItem(rowData); actionPai.command($event)\"\r\n [type]=\"'text'\"\r\n [icon]=\"actionPai.icon\"\r\n [severity]=\"actionPai.severity || 'tertiary'\"\r\n />\r\n \r\n } }\r\n </div>\r\n }\r\n \r\n \r\n\r\n </td>\r\n \r\n </tr>\r\n } @else {\r\n <tr\r\n [ttRow]=\"rowNode\"\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{ capitalize: tableCaptalized }\"\r\n >\r\n @for(col of columns; track $index){\r\n <td\r\n [style.position]=\"rowNode.level !== 0 ? 'sticky' : null\"\r\n [style.left.px]=\"\r\n childrenRecoil && rowNode.level !== 0 ? rowNode.level * 30 : null\r\n \"\r\n [style.borderRight]=\"rowNode.level === 0 ? 'none' : ''\"\r\n [style.borderLeft]=\"\r\n rowNode.level === 0 && col.field != config.columns[0].field\r\n ? 'none'\r\n : ''\r\n \"\r\n >\r\n <div class=\"flex flex-row {{ align(col) }}\">\r\n <div\r\n class=\"w-full-h-full flex align-items-center\"\r\n *ngIf=\"$index == 0\"\r\n >\r\n <p-treeTableToggler class=\"hiddenVisible\" [rowNode]=\"rowNode\" />\r\n\r\n @if(config.enableSelect) {\r\n <p-treeTableCheckbox\r\n [disabled]=\"isDisabledCheckbox(rowData, rowNode)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [value]=\"rowNode\"\r\n [ngStyle]=\"{\r\n 'display': isSelectEnabled(rowData, rowNode) ? 'block' : 'none',\r\n 'margin-left': config.visibleCheckboxFunction ? '-34px' : '0px'\r\n }\"\r\n />\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"flex flex-row align-items-center\">\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-center gap-2\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n }\r\n <i\r\n *ngIf=\"col.boolean\"\r\n class=\"pi {{\r\n rowData[col.field] ? 'pi-check text-green-300' : ''\r\n }}\"\r\n style=\"font-size: 1.1rem\"\r\n ></i>\r\n\r\n <div class=\"flex flex-column\" *ngIf=\"!col.boolean\">\r\n <span class=\"m-0 text-xs\">{{ rowData[col.field] }}</span>\r\n\r\n <p *ngIf=\"col.subtitle\" class=\"m-0 text-xs font-semibold\">\r\n {{ rowData[col.subtitle] }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <span *ngIf=\"col.template && validateShowTemplate(rowNode, col)\">\r\n <ng-container\r\n *ngIf=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n >\r\n </ng-container>\r\n </span>\r\n </td>\r\n }\r\n\r\n <td\r\n style=\"border-left: none; text-align: center\"\r\n *ngIf=\"(config.actions?.length ?? 0 > 0) || config.actionsPai\"\r\n >\r\n <div\r\n *ngIf=\"\r\n (config.actions?.length ?? 0 > 0) &&\r\n validateActionPosition(rowNode)\r\n \"\r\n >\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz p-1\"\r\n style=\"font-size: 20px\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n more_horiz\r\n </span>\r\n\r\n @for(action of config.actions; track $index) {\r\n {{ criarMenusModal(rowData) }}\r\n }\r\n\r\n <p-menu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"menuItems\"\r\n appendTo=\"body\"\r\n ></p-menu>\r\n </div>\r\n\r\n @if(config.actionsPai?.length ?? 0 > 0 && rowNode.level == 0){\r\n <div class=\"flex justify-content-end\">\r\n @for (actionPai of config.actionsPai; track $index) { @if\r\n (getOrExecute(actionPai.visible, rowData) ?? true) {\r\n <kv-button\r\n (onClick)=\"activeItem(rowData); actionPai.command($event)\"\r\n [type]=\"'text'\"\r\n [icon]=\"actionPai.icon\"\r\n [severity]=\"actionPai.severity || 'tertiary'\"\r\n />\r\n } }\r\n </div>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td\r\n [attr.colspan]=\"config.columns.length + 1\"\r\n style=\"text-align: center;\"\r\n class=\"text-sm\"\r\n >\r\n {{ textoEmptyMessage }}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-treeTable>\r\n</div>\r\n\r\n\r\n", styles: ["@charset \"UTF-8\";::ng-deep .p-treetable .p-treetable-tbody>tr>td{padding:.4rem}::ng-deep .p-treetable .p-treetable-header{padding:0rem}span{font-size:14px}:host ::ng-deep .p-treetable table{table-layout:auto!important}::ng-deep .p-checkbox .p-checkbox-box{width:1.125rem;height:1.125rem}::ng-deep .p-checkbox{display:flex;align-items:center}::ng-deep .p-treetable .p-paginator{scale:.8}.icon-more-horiz{font-weight:700}.icon-more-horiz:hover,.icon-more-horiz:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}::ng-deep .p-treetable .p-treetable-thead>tr>th{background-color:#eaeaea}:host ::ng-deep .treetabledraggable .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler{width:1rem;height:1rem}.tag{width:5px;height:20px;border-radius:.25rem}:host ::ng-deep .draggable-cell .drag-icon{visibility:hidden}:host ::ng-deep .draggable-cell:hover .drag-icon{visibility:visible}.cdk-drag-preview{display:flex;align-items:center;justify-content:space-between;border-radius:10px!important}.cdk-drop-list-dragging{cursor:grabbing}:host ::ng-deep .cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}:host ::ng-deep .cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}::ng-deep svg.p-icon{width:.65rem;height:.65rem}::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:#004172;background:#004172}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:hover{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:active{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:disabled{background-color:#002542;opacity:.4;cursor:auto}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.AutoFocus, selector: "[pAutoFocus]", inputs: ["autofocus"] }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i6.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: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i8.TreeTable, selector: "p-treeTable", inputs: ["columns", "style", "styleClass", "tableStyle", "tableStyleClass", "autoLayout", "lazy", "lazyLoadOnInit", "paginator", "rows", "first", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "customSort", "selectionMode", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "compareSelectionBy", "rowHover", "loading", "loadingIcon", "showLoader", "scrollable", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "frozenColumns", "resizableColumns", "columnResizeMode", "reorderableColumns", "contextMenu", "rowTrackBy", "filters", "globalFilterFields", "filterDelay", "filterMode", "filterLocale", "paginatorLocale", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "value", "virtualRowHeight", "selectionKeys"], outputs: ["selectionChange", "contextMenuSelectionChange", "onFilter", "onNodeExpand", "onNodeCollapse", "onPage", "onSort", "onLazyLoad", "sortFunction", "onColResize", "onColReorder", "onNodeSelect", "onNodeUnselect", "onContextMenuSelect", "onHeaderCheckboxToggle", "onEditInit", "onEditComplete", "onEditCancel", "selectionKeysChange"] }, { kind: "component", type: i8.TreeTableToggler, selector: "p-treeTableToggler", inputs: ["rowNode"] }, { kind: "directive", type: i8.TTSortableColumn, selector: "[ttSortableColumn]", inputs: ["ttSortableColumn", "ttSortableColumnDisabled"] }, { kind: "component", type: i8.TTSortIcon, selector: "p-treeTableSortIcon", inputs: ["field", "ariaLabelDesc", "ariaLabelAsc"] }, { kind: "directive", type: i8.TTRow, selector: "[ttRow]", inputs: ["ttRow"] }, { kind: "component", type: i8.TTCheckbox, selector: "p-treeTableCheckbox", inputs: ["disabled", "value"] }, { kind: "component", type: i8.TTHeaderCheckbox, selector: "p-treeTableHeaderCheckbox" }, { kind: "component", type: i9.KvButtonComponent, selector: "kv-button", inputs: ["fullWidth", "type", "loading", "severity", "size", "icon", "label", "disabled"], outputs: ["onClick"] }] }); }
|
|
232
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvTreetableComponent, selector: "kv-tree-table", inputs: { disableRowNodeSticky: "disableRowNodeSticky", config: "config", dataSource: "dataSource", gridLines: "gridLines", tableCaptalized: "tableCaptalized", selectedItems: "selectedItems", paginator: "paginator", rows: "rows", treeTableDraggable: "treeTableDraggable", transferArrayItem: "transferArrayItem", ordenacao: "ordenacao", totalRecords: "totalRecords", textoEmptyMessage: "textoEmptyMessage", childrenRecoil: "childrenRecoil", showHeader: "showHeader", scrollHeight: "scrollHeight", pageLinksOptions: "pageLinksOptions", pageLinks: "pageLinks", showFirstLastIcon: "showFirstLastIcon", _templates: ["templates", "_templates"] }, outputs: { onFilter: "onFilter", onPaginate: "onPaginate", onActiveItem: "onActiveItem", onActiveItemLote: "onActiveItemLote", doubleClickEvent: "doubleClickEvent", onNodeSelect: "onNodeSelect", onNodeUnselect: "onNodeUnselect", onDropItem: "onDropItem" }, host: { listeners: { "window:resize": "onWindowResize($event)" } }, queries: [{ propertyName: "templates", predicate: TemplateDirective }], viewQueries: [{ propertyName: "pTreeTable", first: true, predicate: TreeTable, descendants: true }, { propertyName: "inputBusca", first: true, predicate: ["inputBusca"], descendants: true }], ngImport: i0, template: "<div>\r\n <p-treeTable\r\n #tt\r\n cdkDropList\r\n class=\"example-list\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n [value]=\"dataSource\"\r\n [columns]=\"config.columns\"\r\n [resizableColumns]=\"true\"\r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [resizableColumns]=\"true\"\r\n [paginator]=\"paginator\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalRecords\"\r\n [rowsPerPageOptions]=\"[5, 10, 25, 50]\"\r\n [showFirstLastIcon]=\"tamanhoTela > 960 ? true : false\"\r\n [pageLinks]=\"tamanhoTela > 960 ? 2 : 1\"\r\n [styleClass]=\"gridLines ? 'p-treetable-gridlines' : ''\"\r\n [(selection)]=\"selectedItems\"\r\n [lazy]=\"config.lazy\"\r\n (onLazyLoad)=\"paginate($event)\"\r\n (onNodeSelect)=\"onNodeSelected($event)\"\r\n (onNodeUnselect)=\"onNodeUnselected($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{first} - {last} de {totalRecords}\"\r\n [scrollHeight]=\"scrollHeight\"\r\n >\r\n <ng-template pTemplate=\"caption\" *ngIf=\"config.enableCation\">\r\n <div\r\n class=\"flex flex-row flex-wrap justify-content-between align-items-center grid formgrid p-fluid col-12 m-0\"\r\n style=\"background-color: #eaeaea\"\r\n >\r\n <div class=\"col-12 flex flex-column\">\r\n <div *ngIf=\"config.title\" class=\"text-md font-bold my-3\">\r\n {{ config.title }}\r\n </div>\r\n <div *ngIf=\"config.subtitle\" class=\"text-sm mb-4 font-medium\">\r\n {{ config.subtitle }}\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-row align-items-center col-10 p-0 md:col-6 lg:col-4 justify-content-center {{\r\n tamanhoTela < 768 ? '' : 'input-search'\r\n }}\"\r\n >\r\n <span *ngIf=\"config.enableFilter\" class=\"p-input-icon-left\">\r\n <i class=\"pi pi-search\"></i>\r\n\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"true\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(tt, $event)\"\r\n placeholder=\"Pesquisar...\"\r\n class=\"h-2rem\"\r\n #inputBusca\r\n />\r\n </span>\r\n </div>\r\n\r\n <div class=\"flex flex-row col-1 justify-content-end p-0\">\r\n <div class=\"flex flex-row gap-2 btns-options\">\r\n @for (action of config.actionsLote; track $index) {\r\n @if((selectedItems.length > 0 || action.showAcoesLote) &&\r\n exibirCampo(action, this.action)) {\r\n <kv-button\r\n (onClick)=\"action?.command(); activeItemLote(selectedItems)\"\r\n [pTooltip]=\"getOrExecute(action.tooltip, selectedItems)\"\r\n [tooltipPosition]=\"'bottom'\"\r\n [disabled]=\"getOrExecute(action.disabled, selectedItems) || false\"\r\n [icon]=\"getOrExecute(action.icon, selectedItems)\"\r\n [severity]=\"action.severity || 'tertiary'\"\r\n />\r\n } }\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n @if(showHeader){\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @for(col of columns; track $index){\r\n <th\r\n [ttSortableColumn]=\"col.field\"\r\n [ttSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div>\r\n <div [ngClass]=\"{ flex: $index == 0, 'gap-3': $index == 0 }\">\r\n <div *ngIf=\"$index == 0 && config.enableSelect\">\r\n <p-treeTableHeaderCheckbox\r\n (click)=\"activeItemLote(selectedItems)\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex flex-row align-items-center {{ align(col) }}\">\r\n <span class=\"text-xs\">{{ col.header }}</span>\r\n\r\n @if(col.sortable) {\r\n <p-treeTableSortIcon [field]=\"col.field\" class=\"pb-1\"/>\r\n\r\n }\r\n\r\n <span\r\n *ngIf=\"col.headerTooltip\"\r\n class=\"material-symbols-outlined flex align-items-center\"\r\n [pTooltip]=\"col.headerTooltip\"\r\n >info</span\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n @if (config.actions?.length ?? 0 > 0) {\r\n <th [style.width]=\"5\"></th>\r\n } }\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @for (col of columns; track $index) {\r\n <th\r\n [ttSortableColumn]=\"col.field\"\r\n [ttSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div class=\"flex flex-row align-items-center {{ align(col) }}\">\r\n <span class=\"text-xs\">{{ col.header }}</span>\r\n\r\n @if(col.sortable) {\r\n <p-treeTableSortIcon [field]=\"col.field\" class=\"pb-1\"/>\r\n }\r\n </div>\r\n </th>\r\n } @if (config.actions?.length ?? 0 > 0) {\r\n <th [style.width]=\"5\"></th>\r\n }\r\n </tr>\r\n </ng-template>\r\n }\r\n\r\n\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-rowNode\r\n let-rowData=\"rowData\"\r\n let-columns=\"columns\"\r\n >\r\n\r\n @if(treeTableDraggable) {\r\n <tr\r\n cdkDrag\r\n cdkDragLockAxis=\"y\"\r\n [cdkDragData]=\"rowNode\"\r\n [ttRow]=\"rowNode\"\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{ capitalize: tableCaptalized }\"\r\n >\r\n\r\n @for(col of columns; track $index){\r\n <td\r\n class=\"draggable-cell\"\r\n [style.position]=\"!disableRowNodeSticky && rowNode.level !== 0 ? 'sticky' : null\"\r\n\r\n >\r\n\r\n <!-- [style.left.px]=\"\r\n childrenRecoil && rowNode.level !== 0 ? rowNode.level * 30 : null\r\n \" -->\r\n\r\n <div class=\"flex flex-row {{ align(col) }}\">\r\n\r\n <div\r\n class=\"w-full-h-full flex align-items-center\"\r\n *ngIf=\"$index == 0\"\r\n\r\n >\r\n <span\r\n class=\"material-symbols-outlined drag-icon\"\r\n style=\"cursor: grab; font-size: 25px; color: #6b7280; opacity: 0.9;\"\r\n cdkDragHandle\r\n >\r\n drag_indicator\r\n </span>\r\n <p-treeTableToggler\r\n class=\"hiddenVisible\"\r\n [rowNode]=\"rowNode\"\r\n />\r\n\r\n @if(config.enableSelect) {\r\n <p-treeTableCheckbox\r\n [disabled]=\"isDisabledCheckbox(rowData, rowNode)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [value]=\"rowNode\"\r\n [ngStyle]=\"{\r\n 'display': isSelectEnabled(rowData, rowNode) ? 'block' : 'none',\r\n 'margin-left': config.visibleCheckboxFunction ? '-34px' : '0px'\r\n }\"\r\n />\r\n }\r\n\r\n </div>\r\n\r\n\r\n <div class=\"flex flex-row align-items-center\">\r\n @if (col.template && validateShowTemplate(rowNode, col)) {\r\n <span>\r\n <ng-container\r\n *ngIf=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n >\r\n </ng-container>\r\n </span>\r\n } @else {\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-center gap-2\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n }\r\n\r\n <i\r\n *ngIf=\"col.boolean\"\r\n class=\"pi {{\r\n rowData[col.field] ? 'pi-check text-green-300' : ''\r\n }}\"\r\n style=\"font-size: 1.1rem\"\r\n ></i>\r\n\r\n <div class=\"flex flex-column\" *ngIf=\"!col.boolean\">\r\n <span class=\"m-0 text-xs\">{{ rowData[col.field] }}</span>\r\n\r\n <p *ngIf=\"col.subtitle\" class=\"m-0 text-xs font-semibold\">\r\n {{ rowData[col.subtitle] }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n }\r\n\r\n <td\r\n style=\"border-left: none; text-align: center\"\r\n *ngIf=\"(config.actions?.length ?? 0 > 0) || config.actionsPai\"\r\n [style.borderRight]=\"rowNode.level === 0 ? 'none' : ''\"\r\n [style.borderLeft]=\"rowNode.level === 0 ? 'none' : ''\"\r\n >\r\n <div\r\n *ngIf=\"\r\n (config.actions?.length ?? 0 > 0) &&\r\n validateActionPosition(rowNode)\r\n \"\r\n class=\"flex align-items-center justify-content-center\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz p-1\"\r\n style=\"font-size: 20px\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n more_horiz\r\n </span>\r\n\r\n\r\n\r\n @for(action of config.actions; track $index) {\r\n {{ criarMenusModal(rowData) }}\r\n }\r\n\r\n <p-menu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"menuItems\"\r\n appendTo=\"body\"\r\n ></p-menu>\r\n\r\n </div>\r\n\r\n @if(config.actionsPai?.length ?? 0 > 0 && rowNode.level == 0){\r\n <div class=\"flex justify-content-end align-items-center \">\r\n @for (actionPai of config.actionsPai; track $index) {\r\n @if(getOrExecute(actionPai.visible, rowData) ?? true) {\r\n <kv-button\r\n (onClick)=\"activeItem(rowData); actionPai.command($event)\"\r\n [type]=\"'text'\"\r\n [icon]=\"actionPai.icon\"\r\n [severity]=\"actionPai.severity || 'tertiary'\"\r\n />\r\n\r\n } }\r\n </div>\r\n }\r\n\r\n\r\n\r\n </td>\r\n\r\n </tr>\r\n } @else {\r\n <tr\r\n [ttRow]=\"rowNode\"\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{ capitalize: tableCaptalized }\"\r\n >\r\n @for(col of columns; track $index){\r\n <td\r\n [style.position]=\"rowNode.level !== 0 ? 'sticky' : null\"\r\n [style.left.px]=\"\r\n childrenRecoil && rowNode.level !== 0 ? rowNode.level * 30 : null\r\n \"\r\n [style.borderRight]=\"rowNode.level === 0 ? 'none' : ''\"\r\n [style.borderLeft]=\"\r\n rowNode.level === 0 && col.field != config.columns[0].field\r\n ? 'none'\r\n : ''\r\n \"\r\n >\r\n <div class=\"flex flex-row {{ align(col) }}\">\r\n <div\r\n class=\"w-full-h-full flex align-items-center\"\r\n *ngIf=\"$index == 0\"\r\n >\r\n <p-treeTableToggler class=\"hiddenVisible\" [rowNode]=\"rowNode\" />\r\n\r\n @if(config.enableSelect) {\r\n <p-treeTableCheckbox\r\n [disabled]=\"isDisabledCheckbox(rowData, rowNode)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [value]=\"rowNode\"\r\n [ngStyle]=\"{\r\n 'display': isSelectEnabled(rowData, rowNode) ? 'block' : 'none',\r\n 'margin-left': config.visibleCheckboxFunction ? '-34px' : '0px'\r\n }\"\r\n />\r\n }\r\n\r\n </div>\r\n <div class=\"flex flex-row align-items-center\">\r\n @if (col.template && validateShowTemplate(rowNode, col)) {\r\n <span>\r\n <ng-container\r\n *ngIf=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n >\r\n </ng-container>\r\n </span>\r\n } @else {\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-center gap-2\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n }\r\n <i\r\n *ngIf=\"col.boolean\"\r\n class=\"pi {{\r\n rowData[col.field] ? 'pi-check text-green-300' : ''\r\n }}\"\r\n style=\"font-size: 1.1rem\"\r\n ></i>\r\n\r\n <div class=\"flex flex-column\" *ngIf=\"!col.boolean\">\r\n <span class=\"m-0 text-xs\">{{ rowData[col.field] }}</span>\r\n\r\n <p *ngIf=\"col.subtitle\" class=\"m-0 text-xs font-semibold\">\r\n {{ rowData[col.subtitle] }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n }\r\n\r\n <td\r\n style=\"border-left: none; text-align: center\"\r\n *ngIf=\"(config.actions?.length ?? 0 > 0) || config.actionsPai\"\r\n >\r\n <div\r\n *ngIf=\"\r\n (config.actions?.length ?? 0 > 0) &&\r\n validateActionPosition(rowNode)\r\n \"\r\n >\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz p-1\"\r\n style=\"font-size: 20px\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n more_horiz\r\n </span>\r\n\r\n @for(action of config.actions; track $index) {\r\n {{ criarMenusModal(rowData) }}\r\n }\r\n\r\n <p-menu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"menuItems\"\r\n appendTo=\"body\"\r\n ></p-menu>\r\n </div>\r\n\r\n @if(config.actionsPai?.length ?? 0 > 0 && rowNode.level == 0){\r\n <div class=\"flex justify-content-end\">\r\n @for (actionPai of config.actionsPai; track $index) { @if\r\n (getOrExecute(actionPai.visible, rowData) ?? true) {\r\n <kv-button\r\n (onClick)=\"activeItem(rowData); actionPai.command($event)\"\r\n [type]=\"'text'\"\r\n [icon]=\"actionPai.icon\"\r\n [severity]=\"actionPai.severity || 'tertiary'\"\r\n />\r\n } }\r\n </div>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td\r\n [attr.colspan]=\"config.columns.length + 1\"\r\n style=\"text-align: center;\"\r\n class=\"text-sm\"\r\n >\r\n {{ textoEmptyMessage }}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-treeTable>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";::ng-deep .p-treetable .p-treetable-tbody>tr>td{padding:.4rem}::ng-deep .p-treetable .p-treetable-header{padding:0rem}span{font-size:14px}:host ::ng-deep .p-treetable table{table-layout:auto!important}::ng-deep .p-checkbox .p-checkbox-box{width:1.125rem;height:1.125rem}::ng-deep .p-checkbox{display:flex;align-items:center}::ng-deep .p-treetable .p-paginator{scale:.8}.icon-more-horiz{font-weight:700}.icon-more-horiz:hover,.icon-more-horiz:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}::ng-deep .p-treetable .p-treetable-thead>tr>th{background-color:#eaeaea}:host ::ng-deep .treetabledraggable .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler{width:1rem;height:1rem}.tag{width:5px;height:20px;border-radius:.25rem}:host ::ng-deep .draggable-cell .drag-icon{visibility:hidden}:host ::ng-deep .draggable-cell:hover .drag-icon{visibility:visible}.cdk-drag-preview{display:flex;align-items:center;justify-content:space-between;border-radius:10px!important}.cdk-drop-list-dragging{cursor:grabbing}:host ::ng-deep .cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}:host ::ng-deep .cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}::ng-deep svg.p-icon{width:.65rem;height:.65rem}::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:#004172;background:#004172}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:hover{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:active{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:disabled{background-color:#002542;opacity:.4;cursor:auto}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.AutoFocus, selector: "[pAutoFocus]", inputs: ["autofocus"] }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i6.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: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i8.TreeTable, selector: "p-treeTable", inputs: ["columns", "style", "styleClass", "tableStyle", "tableStyleClass", "autoLayout", "lazy", "lazyLoadOnInit", "paginator", "rows", "first", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "customSort", "selectionMode", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "compareSelectionBy", "rowHover", "loading", "loadingIcon", "showLoader", "scrollable", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "frozenColumns", "resizableColumns", "columnResizeMode", "reorderableColumns", "contextMenu", "rowTrackBy", "filters", "globalFilterFields", "filterDelay", "filterMode", "filterLocale", "paginatorLocale", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "value", "virtualRowHeight", "selectionKeys"], outputs: ["selectionChange", "contextMenuSelectionChange", "onFilter", "onNodeExpand", "onNodeCollapse", "onPage", "onSort", "onLazyLoad", "sortFunction", "onColResize", "onColReorder", "onNodeSelect", "onNodeUnselect", "onContextMenuSelect", "onHeaderCheckboxToggle", "onEditInit", "onEditComplete", "onEditCancel", "selectionKeysChange"] }, { kind: "component", type: i8.TreeTableToggler, selector: "p-treeTableToggler", inputs: ["rowNode"] }, { kind: "directive", type: i8.TTSortableColumn, selector: "[ttSortableColumn]", inputs: ["ttSortableColumn", "ttSortableColumnDisabled"] }, { kind: "component", type: i8.TTSortIcon, selector: "p-treeTableSortIcon", inputs: ["field", "ariaLabelDesc", "ariaLabelAsc"] }, { kind: "directive", type: i8.TTRow, selector: "[ttRow]", inputs: ["ttRow"] }, { kind: "component", type: i8.TTCheckbox, selector: "p-treeTableCheckbox", inputs: ["disabled", "value"] }, { kind: "component", type: i8.TTHeaderCheckbox, selector: "p-treeTableHeaderCheckbox" }, { kind: "component", type: i9.KvButtonComponent, selector: "kv-button", inputs: ["fullWidth", "type", "loading", "severity", "size", "icon", "label", "disabled"], outputs: ["onClick"] }] }); }
|
|
233
233
|
}
|
|
234
234
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvTreetableComponent, decorators: [{
|
|
235
235
|
type: Component,
|
|
236
|
-
args: [{ selector: 'kv-tree-table', template: "<div>\r\n <p-treeTable\r\n #tt\r\n cdkDropList\r\n class=\"example-list\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n [value]=\"dataSource\"\r\n [columns]=\"config.columns\"\r\n [resizableColumns]=\"true\"\r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [resizableColumns]=\"true\"\r\n [paginator]=\"paginator\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalRecords\"\r\n [rowsPerPageOptions]=\"[5, 10, 25, 50]\"\r\n [showFirstLastIcon]=\"tamanhoTela > 960 ? true : false\"\r\n [pageLinks]=\"tamanhoTela > 960 ? 2 : 1\"\r\n [styleClass]=\"gridLines ? 'p-treetable-gridlines' : ''\"\r\n [(selection)]=\"selectedItems\"\r\n [lazy]=\"config.lazy\"\r\n (onLazyLoad)=\"paginate($event)\"\r\n (onNodeSelect)=\"onNodeSelected($event)\"\r\n (onNodeUnselect)=\"onNodeUnselected($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{first} - {last} de {totalRecords}\"\r\n [scrollHeight]=\"scrollHeight\"\r\n >\r\n <ng-template pTemplate=\"caption\" *ngIf=\"config.enableCation\">\r\n <div\r\n class=\"flex flex-row flex-wrap justify-content-between align-items-center grid formgrid p-fluid col-12 m-0\"\r\n style=\"background-color: #eaeaea\"\r\n >\r\n <div class=\"col-12 flex flex-column\">\r\n <div *ngIf=\"config.title\" class=\"text-md font-bold my-3\">\r\n {{ config.title }}\r\n </div>\r\n <div *ngIf=\"config.subtitle\" class=\"text-sm mb-4 font-medium\">\r\n {{ config.subtitle }}\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-row align-items-center col-10 p-0 md:col-6 lg:col-4 justify-content-center {{\r\n tamanhoTela < 768 ? '' : 'input-search'\r\n }}\"\r\n >\r\n <span *ngIf=\"config.enableFilter\" class=\"p-input-icon-left\">\r\n <i class=\"pi pi-search\"></i>\r\n\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"true\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(tt, $event)\"\r\n placeholder=\"Pesquisar...\"\r\n class=\"h-2rem\"\r\n #inputBusca\r\n />\r\n </span>\r\n </div>\r\n\r\n <div class=\"flex flex-row col-1 justify-content-end p-0\">\r\n <div class=\"flex flex-row gap-2 btns-options\">\r\n @for (action of config.actionsLote; track $index) {\r\n @if((selectedItems.length > 0 || action.showAcoesLote) &&\r\n exibirCampo(action, this.action)) {\r\n <kv-button\r\n (onClick)=\"action?.command(); activeItemLote(selectedItems)\"\r\n [pTooltip]=\"getOrExecute(action.tooltip, selectedItems)\"\r\n [tooltipPosition]=\"'bottom'\"\r\n [disabled]=\"getOrExecute(action.disabled, selectedItems) || false\"\r\n [icon]=\"getOrExecute(action.icon, selectedItems)\"\r\n [severity]=\"action.severity || 'tertiary'\"\r\n />\r\n } }\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n @if(showHeader){\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @for(col of columns; track $index){\r\n <th\r\n [ttSortableColumn]=\"col.field\"\r\n [ttSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div>\r\n <div [ngClass]=\"{ flex: $index == 0, 'gap-3': $index == 0 }\">\r\n <div *ngIf=\"$index == 0 && config.enableSelect\">\r\n <p-treeTableHeaderCheckbox\r\n (click)=\"activeItemLote(selectedItems)\"\r\n />\r\n </div>\r\n \r\n <div class=\"flex flex-row align-items-center {{ align(col) }}\">\r\n <span class=\"text-xs\">{{ col.header }}</span>\r\n \r\n @if(col.sortable) {\r\n <p-treeTableSortIcon [field]=\"col.field\" class=\"pb-1\"/>\r\n \r\n }\r\n \r\n <span\r\n *ngIf=\"col.headerTooltip\"\r\n class=\"material-symbols-outlined flex align-items-center\"\r\n [pTooltip]=\"col.headerTooltip\"\r\n >info</span\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n @if (config.actions?.length ?? 0 > 0) {\r\n <th [style.width]=\"5\"></th>\r\n } }\r\n </tr>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @for (col of columns; track $index) {\r\n <th\r\n [ttSortableColumn]=\"col.field\"\r\n [ttSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div class=\"flex flex-row align-items-center {{ align(col) }}\">\r\n <span class=\"text-xs\">{{ col.header }}</span>\r\n \r\n @if(col.sortable) {\r\n <p-treeTableSortIcon [field]=\"col.field\" class=\"pb-1\"/>\r\n }\r\n </div>\r\n </th>\r\n } @if (config.actions?.length ?? 0 > 0) {\r\n <th [style.width]=\"5\"></th>\r\n }\r\n </tr>\r\n </ng-template>\r\n }\r\n\r\n\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-rowNode\r\n let-rowData=\"rowData\"\r\n let-columns=\"columns\"\r\n > \r\n\r\n @if(treeTableDraggable) {\r\n <tr\r\n cdkDrag\r\n cdkDragLockAxis=\"y\"\r\n [cdkDragData]=\"rowNode\"\r\n [ttRow]=\"rowNode\"\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{ capitalize: tableCaptalized }\"\r\n >\r\n \r\n @for(col of columns; track $index){\r\n <td\r\n class=\"draggable-cell\"\r\n [style.position]=\"!disableRowNodeSticky && rowNode.level !== 0 ? 'sticky' : null\"\r\n \r\n >\r\n \r\n <!-- [style.left.px]=\"\r\n childrenRecoil && rowNode.level !== 0 ? rowNode.level * 30 : null\r\n \" -->\r\n \r\n <div class=\"flex flex-row {{ align(col) }}\">\r\n \r\n <div\r\n class=\"w-full-h-full flex align-items-center\"\r\n *ngIf=\"$index == 0\"\r\n \r\n >\r\n <span\r\n class=\"material-symbols-outlined drag-icon\"\r\n style=\"cursor: grab; font-size: 25px; color: #6b7280; opacity: 0.9;\"\r\n cdkDragHandle\r\n >\r\n drag_indicator\r\n </span>\r\n <p-treeTableToggler \r\n class=\"hiddenVisible\" \r\n [rowNode]=\"rowNode\"\r\n />\r\n\r\n @if(config.enableSelect) {\r\n <p-treeTableCheckbox\r\n [disabled]=\"isDisabledCheckbox(rowData, rowNode)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [value]=\"rowNode\"\r\n [ngStyle]=\"{\r\n 'display': isSelectEnabled(rowData, rowNode) ? 'block' : 'none',\r\n 'margin-left': config.visibleCheckboxFunction ? '-34px' : '0px'\r\n }\"\r\n />\r\n }\r\n \r\n </div>\r\n\r\n <div class=\"flex flex-row align-items-center\">\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-center gap-2\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n }\r\n\r\n <i\r\n *ngIf=\"col.boolean\"\r\n class=\"pi {{\r\n rowData[col.field] ? 'pi-check text-green-300' : ''\r\n }}\"\r\n style=\"font-size: 1.1rem\"\r\n ></i>\r\n\r\n <div class=\"flex flex-column\" *ngIf=\"!col.boolean\">\r\n <span class=\"m-0 text-xs\">{{ rowData[col.field] }}</span>\r\n\r\n <p *ngIf=\"col.subtitle\" class=\"m-0 text-xs font-semibold\">\r\n {{ rowData[col.subtitle] }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <span *ngIf=\"col.template && validateShowTemplate(rowNode, col)\">\r\n <ng-container\r\n *ngIf=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n >\r\n </ng-container>\r\n </span>\r\n </td>\r\n }\r\n\r\n <td\r\n style=\"border-left: none; text-align: center\"\r\n *ngIf=\"(config.actions?.length ?? 0 > 0) || config.actionsPai\"\r\n [style.borderRight]=\"rowNode.level === 0 ? 'none' : ''\"\r\n [style.borderLeft]=\"rowNode.level === 0 ? 'none' : ''\"\r\n >\r\n <div\r\n *ngIf=\"\r\n (config.actions?.length ?? 0 > 0) &&\r\n validateActionPosition(rowNode)\r\n \"\r\n class=\"flex align-items-center justify-content-center\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz p-1\"\r\n style=\"font-size: 20px\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n more_horiz\r\n </span>\r\n\r\n \r\n\r\n @for(action of config.actions; track $index) {\r\n {{ criarMenusModal(rowData) }}\r\n }\r\n \r\n <p-menu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"menuItems\"\r\n appendTo=\"body\"\r\n ></p-menu>\r\n \r\n </div>\r\n \r\n @if(config.actionsPai?.length ?? 0 > 0 && rowNode.level == 0){\r\n <div class=\"flex justify-content-end align-items-center \">\r\n @for (actionPai of config.actionsPai; track $index) {\r\n @if(getOrExecute(actionPai.visible, rowData) ?? true) {\r\n <kv-button\r\n (onClick)=\"activeItem(rowData); actionPai.command($event)\"\r\n [type]=\"'text'\"\r\n [icon]=\"actionPai.icon\"\r\n [severity]=\"actionPai.severity || 'tertiary'\"\r\n />\r\n \r\n } }\r\n </div>\r\n }\r\n \r\n \r\n\r\n </td>\r\n \r\n </tr>\r\n } @else {\r\n <tr\r\n [ttRow]=\"rowNode\"\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{ capitalize: tableCaptalized }\"\r\n >\r\n @for(col of columns; track $index){\r\n <td\r\n [style.position]=\"rowNode.level !== 0 ? 'sticky' : null\"\r\n [style.left.px]=\"\r\n childrenRecoil && rowNode.level !== 0 ? rowNode.level * 30 : null\r\n \"\r\n [style.borderRight]=\"rowNode.level === 0 ? 'none' : ''\"\r\n [style.borderLeft]=\"\r\n rowNode.level === 0 && col.field != config.columns[0].field\r\n ? 'none'\r\n : ''\r\n \"\r\n >\r\n <div class=\"flex flex-row {{ align(col) }}\">\r\n <div\r\n class=\"w-full-h-full flex align-items-center\"\r\n *ngIf=\"$index == 0\"\r\n >\r\n <p-treeTableToggler class=\"hiddenVisible\" [rowNode]=\"rowNode\" />\r\n\r\n @if(config.enableSelect) {\r\n <p-treeTableCheckbox\r\n [disabled]=\"isDisabledCheckbox(rowData, rowNode)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [value]=\"rowNode\"\r\n [ngStyle]=\"{\r\n 'display': isSelectEnabled(rowData, rowNode) ? 'block' : 'none',\r\n 'margin-left': config.visibleCheckboxFunction ? '-34px' : '0px'\r\n }\"\r\n />\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"flex flex-row align-items-center\">\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-center gap-2\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n }\r\n <i\r\n *ngIf=\"col.boolean\"\r\n class=\"pi {{\r\n rowData[col.field] ? 'pi-check text-green-300' : ''\r\n }}\"\r\n style=\"font-size: 1.1rem\"\r\n ></i>\r\n\r\n <div class=\"flex flex-column\" *ngIf=\"!col.boolean\">\r\n <span class=\"m-0 text-xs\">{{ rowData[col.field] }}</span>\r\n\r\n <p *ngIf=\"col.subtitle\" class=\"m-0 text-xs font-semibold\">\r\n {{ rowData[col.subtitle] }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <span *ngIf=\"col.template && validateShowTemplate(rowNode, col)\">\r\n <ng-container\r\n *ngIf=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n >\r\n </ng-container>\r\n </span>\r\n </td>\r\n }\r\n\r\n <td\r\n style=\"border-left: none; text-align: center\"\r\n *ngIf=\"(config.actions?.length ?? 0 > 0) || config.actionsPai\"\r\n >\r\n <div\r\n *ngIf=\"\r\n (config.actions?.length ?? 0 > 0) &&\r\n validateActionPosition(rowNode)\r\n \"\r\n >\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz p-1\"\r\n style=\"font-size: 20px\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n more_horiz\r\n </span>\r\n\r\n @for(action of config.actions; track $index) {\r\n {{ criarMenusModal(rowData) }}\r\n }\r\n\r\n <p-menu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"menuItems\"\r\n appendTo=\"body\"\r\n ></p-menu>\r\n </div>\r\n\r\n @if(config.actionsPai?.length ?? 0 > 0 && rowNode.level == 0){\r\n <div class=\"flex justify-content-end\">\r\n @for (actionPai of config.actionsPai; track $index) { @if\r\n (getOrExecute(actionPai.visible, rowData) ?? true) {\r\n <kv-button\r\n (onClick)=\"activeItem(rowData); actionPai.command($event)\"\r\n [type]=\"'text'\"\r\n [icon]=\"actionPai.icon\"\r\n [severity]=\"actionPai.severity || 'tertiary'\"\r\n />\r\n } }\r\n </div>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td\r\n [attr.colspan]=\"config.columns.length + 1\"\r\n style=\"text-align: center;\"\r\n class=\"text-sm\"\r\n >\r\n {{ textoEmptyMessage }}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-treeTable>\r\n</div>\r\n\r\n\r\n", styles: ["@charset \"UTF-8\";::ng-deep .p-treetable .p-treetable-tbody>tr>td{padding:.4rem}::ng-deep .p-treetable .p-treetable-header{padding:0rem}span{font-size:14px}:host ::ng-deep .p-treetable table{table-layout:auto!important}::ng-deep .p-checkbox .p-checkbox-box{width:1.125rem;height:1.125rem}::ng-deep .p-checkbox{display:flex;align-items:center}::ng-deep .p-treetable .p-paginator{scale:.8}.icon-more-horiz{font-weight:700}.icon-more-horiz:hover,.icon-more-horiz:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}::ng-deep .p-treetable .p-treetable-thead>tr>th{background-color:#eaeaea}:host ::ng-deep .treetabledraggable .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler{width:1rem;height:1rem}.tag{width:5px;height:20px;border-radius:.25rem}:host ::ng-deep .draggable-cell .drag-icon{visibility:hidden}:host ::ng-deep .draggable-cell:hover .drag-icon{visibility:visible}.cdk-drag-preview{display:flex;align-items:center;justify-content:space-between;border-radius:10px!important}.cdk-drop-list-dragging{cursor:grabbing}:host ::ng-deep .cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}:host ::ng-deep .cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}::ng-deep svg.p-icon{width:.65rem;height:.65rem}::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:#004172;background:#004172}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:hover{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:active{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:disabled{background-color:#002542;opacity:.4;cursor:auto}\n"] }]
|
|
236
|
+
args: [{ selector: 'kv-tree-table', template: "<div>\r\n <p-treeTable\r\n #tt\r\n cdkDropList\r\n class=\"example-list\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n [value]=\"dataSource\"\r\n [columns]=\"config.columns\"\r\n [resizableColumns]=\"true\"\r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [resizableColumns]=\"true\"\r\n [paginator]=\"paginator\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalRecords\"\r\n [rowsPerPageOptions]=\"[5, 10, 25, 50]\"\r\n [showFirstLastIcon]=\"tamanhoTela > 960 ? true : false\"\r\n [pageLinks]=\"tamanhoTela > 960 ? 2 : 1\"\r\n [styleClass]=\"gridLines ? 'p-treetable-gridlines' : ''\"\r\n [(selection)]=\"selectedItems\"\r\n [lazy]=\"config.lazy\"\r\n (onLazyLoad)=\"paginate($event)\"\r\n (onNodeSelect)=\"onNodeSelected($event)\"\r\n (onNodeUnselect)=\"onNodeUnselected($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{first} - {last} de {totalRecords}\"\r\n [scrollHeight]=\"scrollHeight\"\r\n >\r\n <ng-template pTemplate=\"caption\" *ngIf=\"config.enableCation\">\r\n <div\r\n class=\"flex flex-row flex-wrap justify-content-between align-items-center grid formgrid p-fluid col-12 m-0\"\r\n style=\"background-color: #eaeaea\"\r\n >\r\n <div class=\"col-12 flex flex-column\">\r\n <div *ngIf=\"config.title\" class=\"text-md font-bold my-3\">\r\n {{ config.title }}\r\n </div>\r\n <div *ngIf=\"config.subtitle\" class=\"text-sm mb-4 font-medium\">\r\n {{ config.subtitle }}\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-row align-items-center col-10 p-0 md:col-6 lg:col-4 justify-content-center {{\r\n tamanhoTela < 768 ? '' : 'input-search'\r\n }}\"\r\n >\r\n <span *ngIf=\"config.enableFilter\" class=\"p-input-icon-left\">\r\n <i class=\"pi pi-search\"></i>\r\n\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"true\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(tt, $event)\"\r\n placeholder=\"Pesquisar...\"\r\n class=\"h-2rem\"\r\n #inputBusca\r\n />\r\n </span>\r\n </div>\r\n\r\n <div class=\"flex flex-row col-1 justify-content-end p-0\">\r\n <div class=\"flex flex-row gap-2 btns-options\">\r\n @for (action of config.actionsLote; track $index) {\r\n @if((selectedItems.length > 0 || action.showAcoesLote) &&\r\n exibirCampo(action, this.action)) {\r\n <kv-button\r\n (onClick)=\"action?.command(); activeItemLote(selectedItems)\"\r\n [pTooltip]=\"getOrExecute(action.tooltip, selectedItems)\"\r\n [tooltipPosition]=\"'bottom'\"\r\n [disabled]=\"getOrExecute(action.disabled, selectedItems) || false\"\r\n [icon]=\"getOrExecute(action.icon, selectedItems)\"\r\n [severity]=\"action.severity || 'tertiary'\"\r\n />\r\n } }\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n @if(showHeader){\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @for(col of columns; track $index){\r\n <th\r\n [ttSortableColumn]=\"col.field\"\r\n [ttSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div>\r\n <div [ngClass]=\"{ flex: $index == 0, 'gap-3': $index == 0 }\">\r\n <div *ngIf=\"$index == 0 && config.enableSelect\">\r\n <p-treeTableHeaderCheckbox\r\n (click)=\"activeItemLote(selectedItems)\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex flex-row align-items-center {{ align(col) }}\">\r\n <span class=\"text-xs\">{{ col.header }}</span>\r\n\r\n @if(col.sortable) {\r\n <p-treeTableSortIcon [field]=\"col.field\" class=\"pb-1\"/>\r\n\r\n }\r\n\r\n <span\r\n *ngIf=\"col.headerTooltip\"\r\n class=\"material-symbols-outlined flex align-items-center\"\r\n [pTooltip]=\"col.headerTooltip\"\r\n >info</span\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n @if (config.actions?.length ?? 0 > 0) {\r\n <th [style.width]=\"5\"></th>\r\n } }\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @for (col of columns; track $index) {\r\n <th\r\n [ttSortableColumn]=\"col.field\"\r\n [ttSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div class=\"flex flex-row align-items-center {{ align(col) }}\">\r\n <span class=\"text-xs\">{{ col.header }}</span>\r\n\r\n @if(col.sortable) {\r\n <p-treeTableSortIcon [field]=\"col.field\" class=\"pb-1\"/>\r\n }\r\n </div>\r\n </th>\r\n } @if (config.actions?.length ?? 0 > 0) {\r\n <th [style.width]=\"5\"></th>\r\n }\r\n </tr>\r\n </ng-template>\r\n }\r\n\r\n\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-rowNode\r\n let-rowData=\"rowData\"\r\n let-columns=\"columns\"\r\n >\r\n\r\n @if(treeTableDraggable) {\r\n <tr\r\n cdkDrag\r\n cdkDragLockAxis=\"y\"\r\n [cdkDragData]=\"rowNode\"\r\n [ttRow]=\"rowNode\"\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{ capitalize: tableCaptalized }\"\r\n >\r\n\r\n @for(col of columns; track $index){\r\n <td\r\n class=\"draggable-cell\"\r\n [style.position]=\"!disableRowNodeSticky && rowNode.level !== 0 ? 'sticky' : null\"\r\n\r\n >\r\n\r\n <!-- [style.left.px]=\"\r\n childrenRecoil && rowNode.level !== 0 ? rowNode.level * 30 : null\r\n \" -->\r\n\r\n <div class=\"flex flex-row {{ align(col) }}\">\r\n\r\n <div\r\n class=\"w-full-h-full flex align-items-center\"\r\n *ngIf=\"$index == 0\"\r\n\r\n >\r\n <span\r\n class=\"material-symbols-outlined drag-icon\"\r\n style=\"cursor: grab; font-size: 25px; color: #6b7280; opacity: 0.9;\"\r\n cdkDragHandle\r\n >\r\n drag_indicator\r\n </span>\r\n <p-treeTableToggler\r\n class=\"hiddenVisible\"\r\n [rowNode]=\"rowNode\"\r\n />\r\n\r\n @if(config.enableSelect) {\r\n <p-treeTableCheckbox\r\n [disabled]=\"isDisabledCheckbox(rowData, rowNode)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [value]=\"rowNode\"\r\n [ngStyle]=\"{\r\n 'display': isSelectEnabled(rowData, rowNode) ? 'block' : 'none',\r\n 'margin-left': config.visibleCheckboxFunction ? '-34px' : '0px'\r\n }\"\r\n />\r\n }\r\n\r\n </div>\r\n\r\n\r\n <div class=\"flex flex-row align-items-center\">\r\n @if (col.template && validateShowTemplate(rowNode, col)) {\r\n <span>\r\n <ng-container\r\n *ngIf=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n >\r\n </ng-container>\r\n </span>\r\n } @else {\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-center gap-2\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n }\r\n\r\n <i\r\n *ngIf=\"col.boolean\"\r\n class=\"pi {{\r\n rowData[col.field] ? 'pi-check text-green-300' : ''\r\n }}\"\r\n style=\"font-size: 1.1rem\"\r\n ></i>\r\n\r\n <div class=\"flex flex-column\" *ngIf=\"!col.boolean\">\r\n <span class=\"m-0 text-xs\">{{ rowData[col.field] }}</span>\r\n\r\n <p *ngIf=\"col.subtitle\" class=\"m-0 text-xs font-semibold\">\r\n {{ rowData[col.subtitle] }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n }\r\n\r\n <td\r\n style=\"border-left: none; text-align: center\"\r\n *ngIf=\"(config.actions?.length ?? 0 > 0) || config.actionsPai\"\r\n [style.borderRight]=\"rowNode.level === 0 ? 'none' : ''\"\r\n [style.borderLeft]=\"rowNode.level === 0 ? 'none' : ''\"\r\n >\r\n <div\r\n *ngIf=\"\r\n (config.actions?.length ?? 0 > 0) &&\r\n validateActionPosition(rowNode)\r\n \"\r\n class=\"flex align-items-center justify-content-center\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz p-1\"\r\n style=\"font-size: 20px\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n more_horiz\r\n </span>\r\n\r\n\r\n\r\n @for(action of config.actions; track $index) {\r\n {{ criarMenusModal(rowData) }}\r\n }\r\n\r\n <p-menu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"menuItems\"\r\n appendTo=\"body\"\r\n ></p-menu>\r\n\r\n </div>\r\n\r\n @if(config.actionsPai?.length ?? 0 > 0 && rowNode.level == 0){\r\n <div class=\"flex justify-content-end align-items-center \">\r\n @for (actionPai of config.actionsPai; track $index) {\r\n @if(getOrExecute(actionPai.visible, rowData) ?? true) {\r\n <kv-button\r\n (onClick)=\"activeItem(rowData); actionPai.command($event)\"\r\n [type]=\"'text'\"\r\n [icon]=\"actionPai.icon\"\r\n [severity]=\"actionPai.severity || 'tertiary'\"\r\n />\r\n\r\n } }\r\n </div>\r\n }\r\n\r\n\r\n\r\n </td>\r\n\r\n </tr>\r\n } @else {\r\n <tr\r\n [ttRow]=\"rowNode\"\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{ capitalize: tableCaptalized }\"\r\n >\r\n @for(col of columns; track $index){\r\n <td\r\n [style.position]=\"rowNode.level !== 0 ? 'sticky' : null\"\r\n [style.left.px]=\"\r\n childrenRecoil && rowNode.level !== 0 ? rowNode.level * 30 : null\r\n \"\r\n [style.borderRight]=\"rowNode.level === 0 ? 'none' : ''\"\r\n [style.borderLeft]=\"\r\n rowNode.level === 0 && col.field != config.columns[0].field\r\n ? 'none'\r\n : ''\r\n \"\r\n >\r\n <div class=\"flex flex-row {{ align(col) }}\">\r\n <div\r\n class=\"w-full-h-full flex align-items-center\"\r\n *ngIf=\"$index == 0\"\r\n >\r\n <p-treeTableToggler class=\"hiddenVisible\" [rowNode]=\"rowNode\" />\r\n\r\n @if(config.enableSelect) {\r\n <p-treeTableCheckbox\r\n [disabled]=\"isDisabledCheckbox(rowData, rowNode)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [value]=\"rowNode\"\r\n [ngStyle]=\"{\r\n 'display': isSelectEnabled(rowData, rowNode) ? 'block' : 'none',\r\n 'margin-left': config.visibleCheckboxFunction ? '-34px' : '0px'\r\n }\"\r\n />\r\n }\r\n\r\n </div>\r\n <div class=\"flex flex-row align-items-center\">\r\n @if (col.template && validateShowTemplate(rowNode, col)) {\r\n <span>\r\n <ng-container\r\n *ngIf=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n >\r\n </ng-container>\r\n </span>\r\n } @else {\r\n <div\r\n class=\"flex flex-row align-items-center justify-content-center gap-2\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n }\r\n <i\r\n *ngIf=\"col.boolean\"\r\n class=\"pi {{\r\n rowData[col.field] ? 'pi-check text-green-300' : ''\r\n }}\"\r\n style=\"font-size: 1.1rem\"\r\n ></i>\r\n\r\n <div class=\"flex flex-column\" *ngIf=\"!col.boolean\">\r\n <span class=\"m-0 text-xs\">{{ rowData[col.field] }}</span>\r\n\r\n <p *ngIf=\"col.subtitle\" class=\"m-0 text-xs font-semibold\">\r\n {{ rowData[col.subtitle] }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n }\r\n\r\n <td\r\n style=\"border-left: none; text-align: center\"\r\n *ngIf=\"(config.actions?.length ?? 0 > 0) || config.actionsPai\"\r\n >\r\n <div\r\n *ngIf=\"\r\n (config.actions?.length ?? 0 > 0) &&\r\n validateActionPosition(rowNode)\r\n \"\r\n >\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz p-1\"\r\n style=\"font-size: 20px\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n more_horiz\r\n </span>\r\n\r\n @for(action of config.actions; track $index) {\r\n {{ criarMenusModal(rowData) }}\r\n }\r\n\r\n <p-menu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"menuItems\"\r\n appendTo=\"body\"\r\n ></p-menu>\r\n </div>\r\n\r\n @if(config.actionsPai?.length ?? 0 > 0 && rowNode.level == 0){\r\n <div class=\"flex justify-content-end\">\r\n @for (actionPai of config.actionsPai; track $index) { @if\r\n (getOrExecute(actionPai.visible, rowData) ?? true) {\r\n <kv-button\r\n (onClick)=\"activeItem(rowData); actionPai.command($event)\"\r\n [type]=\"'text'\"\r\n [icon]=\"actionPai.icon\"\r\n [severity]=\"actionPai.severity || 'tertiary'\"\r\n />\r\n } }\r\n </div>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td\r\n [attr.colspan]=\"config.columns.length + 1\"\r\n style=\"text-align: center;\"\r\n class=\"text-sm\"\r\n >\r\n {{ textoEmptyMessage }}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-treeTable>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";::ng-deep .p-treetable .p-treetable-tbody>tr>td{padding:.4rem}::ng-deep .p-treetable .p-treetable-header{padding:0rem}span{font-size:14px}:host ::ng-deep .p-treetable table{table-layout:auto!important}::ng-deep .p-checkbox .p-checkbox-box{width:1.125rem;height:1.125rem}::ng-deep .p-checkbox{display:flex;align-items:center}::ng-deep .p-treetable .p-paginator{scale:.8}.icon-more-horiz{font-weight:700}.icon-more-horiz:hover,.icon-more-horiz:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}::ng-deep .p-treetable .p-treetable-thead>tr>th{background-color:#eaeaea}:host ::ng-deep .treetabledraggable .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler{width:1rem;height:1rem}.tag{width:5px;height:20px;border-radius:.25rem}:host ::ng-deep .draggable-cell .drag-icon{visibility:hidden}:host ::ng-deep .draggable-cell:hover .drag-icon{visibility:visible}.cdk-drag-preview{display:flex;align-items:center;justify-content:space-between;border-radius:10px!important}.cdk-drop-list-dragging{cursor:grabbing}:host ::ng-deep .cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}:host ::ng-deep .cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}::ng-deep svg.p-icon{width:.65rem;height:.65rem}::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:#004172;background:#004172}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:hover{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:active{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:disabled{background-color:#002542;opacity:.4;cursor:auto}\n"] }]
|
|
237
237
|
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { disableRowNodeSticky: [{
|
|
238
238
|
type: Input
|
|
239
239
|
}], config: [{
|
|
@@ -304,4 +304,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImpor
|
|
|
304
304
|
type: HostListener,
|
|
305
305
|
args: ['window:resize', ['$event']]
|
|
306
306
|
}] } });
|
|
307
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtdHJlZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9rdi10cmVlLXRhYmxlL2t2LXRyZWUtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtdHJlZS10YWJsZS9rdi10cmVlLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFFTCxZQUFZLEVBQ1osYUFBYSxHQUNkLE1BQU0sd0NBQXdDLENBQUM7QUFFaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFckYsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7OztBQVF0RSxNQUFNLE9BQU8sb0JBQW9CO0lBc0IvQixZQUNVLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUF0QmhDLGNBQVMsR0FBZSxFQUFFLENBQUM7UUFFbEIseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBSXRDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0Isb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFDeEIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1YsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQzNCLHNCQUFp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biAgQ29udGVudENoaWxkcmVuLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWVudUl0ZW0sIFRyZWVOb2RlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBUcmVlVGFibGUgfSBmcm9tICdwcmltZW5nL3RyZWV0YWJsZSc7XHJcbmltcG9ydCB7XHJcbiAgVmFsdWVPckZuLFxyXG4gIGdldE9yRXhlY3V0ZSxcclxuICBtYXBUb01lbnVJdGVtLFxyXG59IGZyb20gJy4uLy4uL2FwaS9jb21wb25lbnRzL3RhYmxlL2t2LW1lbnVpdGVtJztcclxuaW1wb3J0IHsgVGFibGVQYWdpbmF0ZSB9IGZyb20gJy4uLy4uL2FwaS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLnBhZ2luYXRlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9hcGkvZGlyZWN0aXZlcy90ZW1wbGF0ZS90ZW1wbGF0ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBUcmVlVGFibGVDb25maWcgfSBmcm9tICcuLi8uLi9hcGkvY29tcG9uZW50cy90cmVlLXRhYmxlL3RyZWUtdGFibGUuY29uZmlnJztcclxuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBUYWJsZUNvbmZpZ0NvbHVtbiB9IGZyb20gJy4uLy4uL2FwaS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbmZpZy5jb2x1bW4nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdrdi10cmVlLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4va3YtdHJlZS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4va3YtdHJlZS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgS3ZUcmVldGFibGVDb21wb25lbnQge1xyXG4gIG1lbnVJdGVtczogTWVudUl0ZW1bXSA9IFtdO1xyXG4gIHRhbWFuaG9UZWxhITogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVSb3dOb2RlU3RpY2t5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZyE6IFRyZWVUYWJsZUNvbmZpZztcclxuICBASW5wdXQoKSBkYXRhU291cmNlITogYW55O1xyXG4gIEBJbnB1dCgpIGdyaWRMaW5lczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHRhYmxlQ2FwdGFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIHBhZ2luYXRvciA9IHRydWU7XHJcbiAgQElucHV0KCkgcm93cyA9IDEwO1xyXG4gIEBJbnB1dCgpIHRyZWVUYWJsZURyYWdnYWJsZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHRyYW5zZmVyQXJyYXlJdGVtID0gZmFsc2U7XHJcbiAgQElucHV0KCkgb3JkZW5hY2FvITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHRvdGFsUmVjb3JkcyE6IG51bWJlcjtcclxuICBASW5wdXQoKSB0ZXh0b0VtcHR5TWVzc2FnZTogc3RyaW5nID0gJ05lbmh1bSByZWdpc3RybyBlbmNvbnRyYWRvJztcclxuICBASW5wdXQoKSBjaGlsZHJlblJlY29pbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2Nyb2xsSGVpZ2h0OiBzdHJpbmcgPSAnJztcclxuICBcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcclxuICApe31cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgTyB2YWxvciBkZSBwYWdlTGlua3Mgw6kgYXRyaWJ1w61kbyBkZSBhY29yZG8gY29tIG8gdGFtYW5obyBkYSB0ZWxhLCBlc3NhIHByb3ByaWVkYWRlIG7Do28gZXN0w6Egc2VuZG8gdXRpbGl6YWRhXHJcbiAgICovXHJcbiAgQElucHV0KCkgcGFnZUxpbmtzT3B0aW9ucyE6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCBPIHZhbG9yIGRlIHBhZ2VMaW5rcyDDqSBhdHJpYnXDrWRvIGRlIGFjb3JkbyBjb20gbyB0YW1hbmhvIGRhIHRlbGEsIGVzc2EgcHJvcHJpZWRhZGUgbsOjbyBlc3TDoSBzZW5kbyB1dGlsaXphZGFcclxuICAgKi9cclxuICBASW5wdXQoKSBwYWdlTGlua3MhOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgQSBxdWFudGlkYWRlIGRlIHBhZ2luaXRvclBhZ2VJY29ucyDDqSBhdHJpYnXDrWRvIGRlIGFjb3JkbyBjb20gbyB0YW1hbmhvIGRhIHRlbGEsIGVzc2EgcHJvcHJpZWRhZGUgbsOjbyBlc3TDoSBzZW5kbyB1dGlsaXphZGFcclxuICAgKi9cclxuICBASW5wdXQoKSBzaG93Rmlyc3RMYXN0SWNvbiE6IGJvb2xlYW47XHJcblxyXG4gIEBPdXRwdXQoKSBvbkZpbHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uUGFnaW5hdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvbkFjdGl2ZUl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvbkFjdGl2ZUl0ZW1Mb3RlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZG91YmxlQ2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uTm9kZVNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uTm9kZVVuc2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25Ecm9wSXRlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnRhbWFuaG9UZWxhID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICBpZiAodGhpcy5vcmRlbmFjYW8pIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlID0gdGhpcy5zb3J0VHJlZU5vZGVzKHRoaXMuZGF0YVNvdXJjZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlRGlyZWN0aXZlKSB0ZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8YW55PjtcclxuICBASW5wdXQoJ3RlbXBsYXRlcycpIF90ZW1wbGF0ZXMhOiBhbnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoVHJlZVRhYmxlKSBwVHJlZVRhYmxlITogVHJlZVRhYmxlO1xyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0QnVzY2EnKSBpbnB1dEJ1c2NhITogRWxlbWVudFJlZjtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgb25XaW5kb3dSZXNpemUoKSB7XHJcbiAgICB0aGlzLnRhbWFuaG9UZWxhID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWN0aXZlSXRlbShyb3dEYXRhOiBhbnkpIHtcclxuICAgIHRoaXMub25BY3RpdmVJdGVtLmVtaXQocm93RGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWN0aXZlSXRlbUxvdGUocm93RGF0YTogYW55KSB7XHJcbiAgICB0aGlzLm9uQWN0aXZlSXRlbUxvdGUuZW1pdChyb3dEYXRhKTtcclxuICB9XHJcblxyXG4gIGdldE9yRXhlY3V0ZTxUPihhY3Rpb246IFZhbHVlT3JGbjxUPiwgZGF0YTogYW55KTogVCB7XHJcbiAgICByZXR1cm4gZ2V0T3JFeGVjdXRlKGFjdGlvbiwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25HbG9iYWxGaWx0ZXIodGFibGU6IFRyZWVUYWJsZSwgZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XHJcbiAgICB0YWJsZS5maWx0ZXJHbG9iYWwoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSwgJ2NvbnRhaW5zJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGFnaW5hdGUoJGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICgkZXZlbnQpIHtcclxuICAgICAgbGV0IHBhZ2luYUluaWNpYWwgPVxyXG4gICAgICAgICgkZXZlbnQ/LmZpcnN0ID4gMCA/ICRldmVudC5maXJzdCAvICRldmVudC5yb3dzIDogJGV2ZW50LmZpcnN0KSArIDE7XHJcbiAgICAgIGxldCB0ZXJtb1Blc3F1aXNhID0gJyc7XHJcbiAgICAgIGxldCBvcmRlbmFjYW8gPSAnJztcclxuXHJcbiAgICAgIGlmICgkZXZlbnQuZ2xvYmFsRmlsdGVyKSB0ZXJtb1Blc3F1aXNhID0gJGV2ZW50Lmdsb2JhbEZpbHRlcjtcclxuXHJcbiAgICAgIGlmICgkZXZlbnQuc29ydEZpZWxkKVxyXG4gICAgICAgIG9yZGVuYWNhbyA9IGAkeyRldmVudC5zb3J0RmllbGR9ICR7XHJcbiAgICAgICAgICAkZXZlbnQuc29ydE9yZGVyID09PSAxID8gJ0FTQycgOiAnREVTQydcclxuICAgICAgICB9YDtcclxuXHJcbiAgICAgIGNvbnN0IG9iamV0bzogVGFibGVQYWdpbmF0ZSA9IHtcclxuICAgICAgICBwYWdpbmFJbmljaWFsOiBwYWdpbmFJbmljaWFsLFxyXG4gICAgICAgIHRhbWFuaG9QYWdpbmE6ICRldmVudC5yb3dzLFxyXG4gICAgICAgIHRlcm1vUGVzcXVpc2E6IHRlcm1vUGVzcXVpc2EsXHJcbiAgICAgICAgb3JkZW5hY2FvOiBvcmRlbmFjYW8sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm9uUGFnaW5hdGUuZW1pdChvYmpldG8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8YW55Pikge1xyXG4gICAgY29uc3QgZHJhZ2dlZE5vZGUgPSBldmVudC5pdGVtLmRhdGE7XHJcbiAgICBjb25zdCBkcmFnZ2VkQ2hpbGREYXRhID0gZHJhZ2dlZE5vZGUubm9kZS5kYXRhO1xyXG5cclxuICAgIGlmIChkcmFnZ2VkTm9kZS5sZXZlbCA9PT0gMCkge1xyXG4gICAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5kYXRhU291cmNlLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xyXG4gICAgfSBlbHNlIGlmIChkcmFnZ2VkTm9kZS5sZXZlbCA+PSAxKSB7XHJcbiAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBkcmFnZ2VkTm9kZS5ub2RlLnBhcmVudDtcclxuXHJcbiAgICAgIGlmIChwYXJlbnROb2RlKSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Q2hpbGRyZW4gPSBwYXJlbnROb2RlLmNoaWxkcmVuLm1hcChcclxuICAgICAgICAgIChjaGlsZDogYW55KSA9PiBjaGlsZC5kYXRhXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBwcmV2aW91c0NoaWxkSW5kZXggPSBwYXJlbnRDaGlsZHJlbi5pbmRleE9mKGRyYWdnZWRDaGlsZERhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCByZWxhdGl2ZUN1cnJlbnRJbmRleCA9XHJcbiAgICAgICAgICBwcmV2aW91c0NoaWxkSW5kZXggKyAoZXZlbnQuY3VycmVudEluZGV4IC0gZXZlbnQucHJldmlvdXNJbmRleCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldENoaWxkSW5kZXggPSBNYXRoLm1heChcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICBNYXRoLm1pbihwYXJlbnRDaGlsZHJlbi5sZW5ndGggLSAxLCByZWxhdGl2ZUN1cnJlbnRJbmRleClcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAocHJldmlvdXNDaGlsZEluZGV4ICE9PSAtMSAmJiB0YXJnZXRDaGlsZEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgbW92ZUl0ZW1JbkFycmF5KFxyXG4gICAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkcmVuLFxyXG4gICAgICAgICAgICBwcmV2aW91c0NoaWxkSW5kZXgsXHJcbiAgICAgICAgICAgIHRhcmdldENoaWxkSW5kZXhcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRyb3BJbmZvOiBhbnkgPSB7XHJcbiAgICAgICAgICBwcmV2aW91c0NoaWxkSW5kZXg6IHByZXZpb3VzQ2hpbGRJbmRleCArIDEsXHJcbiAgICAgICAgICB0YXJnZXRDaGlsZEluZGV4OiB0YXJnZXRDaGlsZEluZGV4ICsgMSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLm9uRHJvcEl0ZW0uZW1pdCh7IGV2ZW50OiBldmVudCwgZHJvcENoaWxkSW5mbzogZHJvcEluZm8gfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBbLi4udGhpcy5kYXRhU291cmNlXTtcclxuICAgIGlmIChkcmFnZ2VkTm9kZS5sZXZlbCA9PT0gMCkge1xyXG4gICAgICB0aGlzLm9uRHJvcEl0ZW0uZW1pdChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzb3J0VHJlZU5vZGVzKG5vZGVzOiBUcmVlTm9kZVtdKTogVHJlZU5vZGVbXSB7XHJcbiAgICByZXR1cm4gbm9kZXNcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEuZGF0YVt0aGlzLm9yZGVuYWNhb10gLSBiLmRhdGFbdGhpcy5vcmRlbmFjYW9dKVxyXG4gICAgICAubWFwKChub2RlKSA9PiB7XHJcbiAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSB0aGlzLnNvcnRUcmVlTm9kZXMobm9kZS5jaGlsZHJlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZVRhcmdldENoaWxkSW5kZXgoXHJcbiAgICBldmVudDogQ2RrRHJhZ0Ryb3A8YW55PixcclxuICAgIHBhcmVudENoaWxkcmVuOiBhbnlbXSxcclxuICAgIHByZXZpb3VzQ2hpbGRJbmRleDogbnVtYmVyXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHRhcmdldENoaWxkSW5kZXggPVxyXG4gICAgICBwcmV2aW91c0NoaWxkSW5kZXggKyAoZXZlbnQuY3VycmVudEluZGV4IC0gZXZlbnQucHJldmlvdXNJbmRleCk7XHJcblxyXG4gICAgaWYgKHRhcmdldENoaWxkSW5kZXggPCAwKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSBlbHNlIGlmICh0YXJnZXRDaGlsZEluZGV4ID49IHBhcmVudENoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gcGFyZW50Q2hpbGRyZW4ubGVuZ3RoIC0gMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0YXJnZXRDaGlsZEluZGV4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcmV0dXJuU3R5bGVSb3coY29sOiBhbnksIHJvd05vZGU6IGFueSk6IHN0cmluZyB7XHJcbiAgLy8gICBjb25zdCBpc0ZpcnN0Q29sdW1uID0gY29sLmZpZWxkID09PSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLmZpZWxkO1xyXG4gIC8vICAgY29uc3QgYmFzZU9wYWNpdHkgPSAxO1xyXG4gIC8vICAgY29uc3QgbWF4TGV2ZWxzID0gNDtcclxuXHJcbiAgLy8gICBpZiAoaXNGaXJzdENvbHVtbiAmJiByb3dOb2RlLmxldmVsID49IDApIHtcclxuICAvLyAgICAgY29uc3Qgb3BhY2l0eSA9IGJhc2VPcGFjaXR5IC0gKHJvd05vZGUubGV2ZWwgLyBtYXhMZXZlbHMpO1xyXG5cclxuICAvLyAgICAgcmV0dXJuIGBib3JkZXItbGVmdDogc29saWQgNHB4IHJnYmEoNTksIDExMCwgMTU4LCAkeyBvcGFjaXR5IH0pICFpbXBvcnRhbnQ7YDtcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICBpZiAocm93Tm9kZS5sZXZlbCA9PSAwKVxyXG4gIC8vICAgICByZXR1cm4gJ2JvcmRlci1sZWZ0OiBub25lICFpbXBvcnRhbnQ7IGJvcmRlci1yaWdodDogbm9uZSAhaW1wb3J0YW50J1xyXG5cclxuICAvLyAgIHJldHVybiAnJztcclxuICAvLyB9XHJcblxyXG4gIGNyaWFyTWVudXNNb2RhbChkYXRhOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5hY3Rpb25zICYmIGRhdGEpIHtcclxuICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5jb25maWcuYWN0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IG1lbnVJbnNlcnQgPSBtYXBUb01lbnVJdGVtKGFjdGlvbiwgZGF0YSk7XHJcblxyXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5tZW51SXRlbXMuZmlsdGVyKFxyXG4gICAgICAgICAgKHgpID0+IHguY29tbWFuZCA9PSBtZW51SW5zZXJ0LmNvbW1hbmRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoaXRlbS5sZW5ndGggPT0gMCkgdGhpcy5tZW51SXRlbXMucHVzaChtZW51SW5zZXJ0KTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmIChtZW51SW5zZXJ0LmxhYmVsICE9IGl0ZW1bMF0ubGFiZWwpIHtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5tZW51SXRlbXMuaW5kZXhPZihpdGVtWzBdKTtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobWVudUluc2VydC52aXNpYmxlICE9IGl0ZW1bMF0udmlzaWJsZSkge1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLm1lbnVJdGVtcy5pbmRleE9mKGl0ZW1bMF0pO1xyXG4gICAgICAgICAgICB0aGlzLm1lbnVJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChtZW51SW5zZXJ0LmRpc2FibGVkICE9IGl0ZW1bMF0uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5tZW51SXRlbXMuaW5kZXhPZihpdGVtWzBdKTtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4aWJpckNhbXBvKGZpZWxkOiBhbnksIHJvd0RhdGE6IGFueSkge1xyXG4gICAgbGV0IHZpc2libGUgPSBmaWVsZC52aXNpYmxlID8gZmllbGQudmlzaWJsZShyb3dEYXRhKSA6IHRydWU7XHJcbiAgICByZXR1cm4gdmlzaWJsZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlQWN0aW9uUG9zaXRpb24ocm93Tm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5jb25maWcuYWN0aW9uc1BhaSAmJiByb3dOb2RlLmxldmVsID09IDApIHJldHVybiBmYWxzZTtcclxuICAgIGVsc2UgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBkb3VibGVDbGljayhlOiBhbnksIHJvd0RhdGE6IGFueSkge1xyXG4gICAgbGV0IGV2ZW50RG91YmxlQ2xpY2sgPSB7IGV2ZW50OiBlLCByb3dEYXRhOiByb3dEYXRhIH07XHJcblxyXG4gICAgbGV0IGFycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZS50YXJnZXQuY2xhc3NMaXN0LmZvckVhY2goKHg6IGFueSkgPT4gYXJyYXkucHVzaCh4KSk7XHJcblxyXG4gICAgLy8gaWYgKGFycmF5LmZpbmQoKHg6IGFueSkgPT4geCA9PSAnbmctc3Rhci1pbnNlcnRlZCcpICE9IHVuZGVmaW5lZClcclxuICAgIHRoaXMuZG91YmxlQ2xpY2tFdmVudC5lbWl0KGV2ZW50RG91YmxlQ2xpY2spO1xyXG4gIH1cclxuXHJcbiAgaXNEaXNhYmxlZENoZWNrYm94KHJvd0RhdGE6IGFueSwgcm93Tm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGlzYWJsZUNvbnRyb2xDaGVja2JveEZ1bmN0aW9uXHJcbiAgICAgID8gdGhpcy5jb25maWcuZGlzYWJsZUNvbnRyb2xDaGVja2JveEZ1bmN0aW9uKHJvd0RhdGEsIHJvd05vZGUpXHJcbiAgICAgIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc1NlbGVjdEVuYWJsZWQocm93RGF0YTogYW55LCByb3dOb2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgcmV0dXJuIHRoaXMuY29uZmlnLnZpc2libGVDaGVja2JveEZ1bmN0aW9uXHJcbiAgID8gdGhpcy5jb25maWcudmlzaWJsZUNoZWNrYm94RnVuY3Rpb24ocm93RGF0YSwgcm93Tm9kZSkgXHJcbiAgICA6IHRydWVcclxuICB9XHJcblxyXG4gIG9uTm9kZVNlbGVjdGVkKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMub25Ob2RlU2VsZWN0LmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Ob2RlVW5zZWxlY3RlZChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLm9uTm9kZVVuc2VsZWN0LmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3VzdG9tVGVtcGxhdGUodGVtcGxhdGVuYW1lOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZXNbdGVtcGxhdGVuYW1lXTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlU2hvd1RlbXBsYXRlKHJvd05vZGU6IGFueSwgY29sOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmIChjb2wudGVtcGxhdGVPbmx5KSB7XHJcbiAgICAgIGlmIChjb2wudGVtcGxhdGVPbmx5ID09PSAncGFpJykge1xyXG4gICAgICAgIHJldHVybiByb3dOb2RlLmxldmVsID09PSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2wudGVtcGxhdGVPbmx5ID09PSAnZmlsaG8nKSB7XHJcbiAgICAgICAgcmV0dXJuIHJvd05vZGUubGV2ZWwgPT09IDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0SWNvbihpY29uOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGljb24uaW5jbHVkZXMoJ3BpLScpID8gYHBpICR7aWNvbn1gIDogJyc7XHJcbiAgfVxyXG5cclxuICBhbGlnbihjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogc3RyaW5nIHtcclxuICAgIGlmIChjb2wuY2VudHJhbGl6ZSkgcmV0dXJuICdqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJztcclxuICAgIGVsc2UgaWYgKGNvbC5hbGlnbiA9PSAncmlnaHQnKSByZXR1cm4gJ2p1c3RpZnktY29udGVudC1lbmQnO1xyXG4gICAgZWxzZSByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICByZXNldFRyZWVUYWJsZSgpe1xyXG4gICAgaWYgKHRoaXMucFRyZWVUYWJsZSkgdGhpcy5wVHJlZVRhYmxlLnJlc2V0KCk7XHJcbiAgICBpZiAodGhpcy5pbnB1dEJ1c2NhKSB0aGlzLmlucHV0QnVzY2EubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2PlxyXG4gIDxwLXRyZWVUYWJsZVxyXG4gICAgI3R0XHJcbiAgICBjZGtEcm9wTGlzdFxyXG4gIGNsYXNzPVwiZXhhbXBsZS1saXN0XCJcclxuICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiXHJcbiAgICBbdmFsdWVdPVwiZGF0YVNvdXJjZVwiXHJcbiAgICBbY29sdW1uc109XCJjb25maWcuY29sdW1uc1wiXHJcbiAgICBbcmVzaXphYmxlQ29sdW1uc109XCJ0cnVlXCJcclxuICAgIFt0YWJsZVN0eWxlXT1cInsgJ21pbi13aWR0aCc6ICc1MHJlbScgfVwiXHJcbiAgICBbcmVzaXphYmxlQ29sdW1uc109XCJ0cnVlXCJcclxuICAgIFtwYWdpbmF0b3JdPVwicGFnaW5hdG9yXCJcclxuICAgIFtyb3dzXT1cInJvd3NcIlxyXG4gICAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHNcIlxyXG4gICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJbNSwgMTAsIDI1LCA1MF1cIlxyXG4gICAgW3Nob3dGaXJzdExhc3RJY29uXT1cInRhbWFuaG9UZWxhID4gOTYwID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgIFtwYWdlTGlua3NdPVwidGFtYW5ob1RlbGEgPiA5NjAgPyAyIDogMVwiXHJcbiAgICBbc3R5bGVDbGFzc109XCJncmlkTGluZXMgPyAncC10cmVldGFibGUtZ3JpZGxpbmVzJyA6ICcnXCJcclxuICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZEl0ZW1zXCJcclxuICAgIFtsYXp5XT1cImNvbmZpZy5sYXp5XCJcclxuICAgIChvbkxhenlMb2FkKT1cInBhZ2luYXRlKCRldmVudClcIlxyXG4gICAgKG9uTm9kZVNlbGVjdCk9XCJvbk5vZGVTZWxlY3RlZCgkZXZlbnQpXCJcclxuICAgIChvbk5vZGVVbnNlbGVjdCk9XCJvbk5vZGVVbnNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcclxuICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IC0ge2xhc3R9IGRlIHt0b3RhbFJlY29yZHN9XCJcclxuICAgIFtzY3JvbGxIZWlnaHRdPVwic2Nyb2xsSGVpZ2h0XCJcclxuICA+XHJcbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiICpuZ0lmPVwiY29uZmlnLmVuYWJsZUNhdGlvblwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ3JpZCBmb3JtZ3JpZCBwLWZsdWlkIGNvbC0xMiBtLTBcIlxyXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2VhZWFlYVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGZsZXggZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb25maWcudGl0bGVcIiBjbGFzcz1cInRleHQtbWQgZm9udC1ib2xkIG15LTNcIj5cclxuICAgICAgICAgICAge3sgY29uZmlnLnRpdGxlIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb25maWcuc3VidGl0bGVcIiBjbGFzcz1cInRleHQtc20gbWItNCBmb250LW1lZGl1bVwiPlxyXG4gICAgICAgICAgICB7eyBjb25maWcuc3VidGl0bGUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGNvbC0xMCBwLTAgbWQ6Y29sLTYgbGc6Y29sLTQganVzdGlmeS1jb250ZW50LWNlbnRlciB7e1xyXG4gICAgICAgICAgICB0YW1hbmhvVGVsYSA8IDc2OCA/ICcnIDogJ2lucHV0LXNlYXJjaCdcclxuICAgICAgICAgIH19XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZy5lbmFibGVGaWx0ZXJcIiBjbGFzcz1cInAtaW5wdXQtaWNvbi1sZWZ0XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktc2VhcmNoXCI+PC9pPlxyXG5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgIHBBdXRvRm9jdXNcclxuICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25HbG9iYWxGaWx0ZXIodHQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUGVzcXVpc2FyLi4uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImgtMnJlbVwiXHJcbiAgICAgICAgICAgICAgI2lucHV0QnVzY2FcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgY29sLTEganVzdGlmeS1jb250ZW50LWVuZCBwLTBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0yIGJ0bnMtb3B0aW9uc1wiPlxyXG4gICAgICAgICAgICBAZm9yIChhY3Rpb24gb2YgY29uZmlnLmFjdGlvbnNMb3RlOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgQGlmKChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgfHwgYWN0aW9uLnNob3dBY29lc0xvdGUpICYmXHJcbiAgICAgICAgICAgIGV4aWJpckNhbXBvKGFjdGlvbiwgdGhpcy5hY3Rpb24pKSB7XHJcbiAgICAgICAgICAgIDxrdi1idXR0b25cclxuICAgICAgICAgICAgICAob25DbGljayk9XCJhY3Rpb24/LmNvbW1hbmQoKTsgYWN0aXZlSXRlbUxvdGUoc2VsZWN0ZWRJdGVtcylcIlxyXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJnZXRPckV4ZWN1dGUoYWN0aW9uLnRvb2x0aXAsIHNlbGVjdGVkSXRlbXMpXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIidib3R0b20nXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0T3JFeGVjdXRlKGFjdGlvbi5kaXNhYmxlZCwgc2VsZWN0ZWRJdGVtcykgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cImdldE9yRXhlY3V0ZShhY3Rpb24uaWNvbiwgc2VsZWN0ZWRJdGVtcylcIlxyXG4gICAgICAgICAgICAgIFtzZXZlcml0eV09XCJhY3Rpb24uc2V2ZXJpdHkgfHwgJ3RlcnRpYXJ5J1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIH0gfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICBAaWYoc2hvd0hlYWRlcil7XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICBAZm9yKGNvbCBvZiBjb2x1bW5zOyB0cmFjayAkaW5kZXgpe1xyXG4gICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgIFt0dFNvcnRhYmxlQ29sdW1uXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgIFt0dFNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiY29sLnNvcnRhYmxlID09PSBmYWxzZVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGhcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyBmbGV4OiAkaW5kZXggPT0gMCwgJ2dhcC0zJzogJGluZGV4ID09IDAgfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiRpbmRleCA9PSAwICYmIGNvbmZpZy5lbmFibGVTZWxlY3RcIj5cclxuICAgICAgICAgICAgICAgICAgPHAtdHJlZVRhYmxlSGVhZGVyQ2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlSXRlbUxvdGUoc2VsZWN0ZWRJdGVtcylcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgIHt7IGFsaWduKGNvbCkgfX1cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzXCI+e3sgY29sLmhlYWRlciB9fTwvc3Bhbj5cclxuICBcclxuICAgICAgICAgICAgICAgICAgQGlmKGNvbC5zb3J0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICA8cC10cmVlVGFibGVTb3J0SWNvbiBbZmllbGRdPVwiY29sLmZpZWxkXCIgY2xhc3M9XCJwYi0xXCIvPlxyXG4gIFxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGVhZGVyVG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiY29sLmhlYWRlclRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgID5pbmZvPC9zcGFuXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICBAaWYgKGNvbmZpZy5hY3Rpb25zPy5sZW5ndGggPz8gMCA+IDApIHtcclxuICAgICAgICAgIDx0aCBbc3R5bGUud2lkdGhdPVwiNVwiPjwvdGg+XHJcbiAgICAgICAgICB9IH1cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gIFxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCIgbGV0LWNvbHVtbnM+XHJcbiAgICAgICAgPHRyPlxyXG4gICAgICAgICAgQGZvciAoY29sIG9mIGNvbHVtbnM7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgIFt0dFNvcnRhYmxlQ29sdW1uXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgIFt0dFNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiY29sLnNvcnRhYmxlID09PSBmYWxzZVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGhcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIge3sgYWxpZ24oY29sKSB9fVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC14c1wiPnt7IGNvbC5oZWFkZXIgfX08L3NwYW4+XHJcbiAgXHJcbiAgICAgICAgICAgICAgQGlmKGNvbC5zb3J0YWJsZSkge1xyXG4gICAgICAgICAgICAgIDxwLXRyZWVUYWJsZVNvcnRJY29uIFtmaWVsZF09XCJjb2wuZmllbGRcIiAgY2xhc3M9XCJwYi0xXCIvPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgfSBAaWYgKGNvbmZpZy5hY3Rpb25zPy5sZW5ndGggPz8gMCA+IDApIHtcclxuICAgICAgICAgIDx0aCBbc3R5bGUud2lkdGhdPVwiNVwiPjwvdGg+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIH1cclxuXHJcblxyXG4gICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgIHBUZW1wbGF0ZT1cImJvZHlcIlxyXG4gICAgICBsZXQtcm93Tm9kZVxyXG4gICAgICBsZXQtcm93RGF0YT1cInJvd0RhdGFcIlxyXG4gICAgICBsZXQtY29sdW1ucz1cImNvbHVtbnNcIlxyXG4gICAgPiBcclxuXHJcbiAgICBAaWYodHJlZVRhYmxlRHJhZ2dhYmxlKSB7XHJcbiAgICAgIDx0clxyXG4gICAgICAgIGNka0RyYWdcclxuICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ5XCJcclxuICAgICAgICBbY2RrRHJhZ0RhdGFdPVwicm93Tm9kZVwiXHJcbiAgICAgICAgW3R0Um93XT1cInJvd05vZGVcIlxyXG4gICAgICAgIChkYmxjbGljayk9XCJkb3VibGVDbGljaygkZXZlbnQsIHJvd0RhdGEpXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7IGNhcGl0YWxpemU6IHRhYmxlQ2FwdGFsaXplZCB9XCJcclxuICAgICAgPlxyXG4gICAgICBcclxuICAgICAgICBAZm9yKGNvbCBvZiBjb2x1bW5zOyB0cmFjayAkaW5kZXgpe1xyXG4gICAgICAgICAgPHRkXHJcbiAgICAgICAgICBjbGFzcz1cImRyYWdnYWJsZS1jZWxsXCJcclxuICAgICAgICAgIFtzdHlsZS5wb3NpdGlvbl09XCIhZGlzYWJsZVJvd05vZGVTdGlja3kgJiYgcm93Tm9kZS5sZXZlbCAhPT0gMCA/ICdzdGlja3knIDogbnVsbFwiXHJcbiAgICAgICAgICBcclxuICAgICAgICA+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPCEtLSBbc3R5bGUubGVmdC5weF09XCJcclxuICAgICAgICAgICAgY2hpbGRyZW5SZWNvaWwgJiYgcm93Tm9kZS5sZXZlbCAhPT0gMCA/IHJvd05vZGUubGV2ZWwgKiAzMCA6IG51bGxcclxuICAgICAgICAgIFwiIC0tPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgIHt7IGFsaWduKGNvbCkgfX1cIj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbC1oLWZ1bGwgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiJGluZGV4ID09IDBcIlxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBkcmFnLWljb25cIlxyXG4gICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogZ3JhYjsgZm9udC1zaXplOiAyNXB4OyBjb2xvcjogIzZiNzI4MDsgb3BhY2l0eTogMC45O1wiXHJcbiAgICAgICAgICAgIGNka0RyYWdIYW5kbGVcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgZHJhZ19pbmRpY2F0b3JcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8cC10cmVlVGFibGVUb2dnbGVyIFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW5WaXNpYmxlXCIgXHJcbiAgICAgICAgICAgICAgICBbcm93Tm9kZV09XCJyb3dOb2RlXCJcclxuICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICBAaWYoY29uZmlnLmVuYWJsZVNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgPHAtdHJlZVRhYmxlQ2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRDaGVja2JveChyb3dEYXRhLCByb3dOb2RlKVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVJdGVtTG90ZShzZWxlY3RlZEl0ZW1zKVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyb3dOb2RlXCJcclxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogaXNTZWxlY3RFbmFibGVkKHJvd0RhdGEsIHJvd05vZGUpID8gJ2Jsb2NrJyA6ICdub25lJyxcclxuICAgICAgICAgICAgICAgICAgICAnbWFyZ2luLWxlZnQnOiBjb25maWcudmlzaWJsZUNoZWNrYm94RnVuY3Rpb24gPyAnLTM0cHgnIDogJzBweCdcclxuICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0yXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICBAaWYoY29sLnRhZ0NvbG9yKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnXCJcclxuICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50b29sdGlwVGFnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnRvb2x0aXBUYWcocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0pXHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50YWdDb2xvcihyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgID48L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuYm9vbGVhblwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGkge3tcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhW2NvbC5maWVsZF0gPyAncGktY2hlY2sgdGV4dC1ncmVlbi0zMDAnIDogJydcclxuICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtXCJcclxuICAgICAgICAgICAgICAgID48L2k+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdJZj1cIiFjb2wuYm9vbGVhblwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tMCB0ZXh0LXhzXCI+e3sgcm93RGF0YVtjb2wuZmllbGRdIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJjb2wuc3VidGl0bGVcIiBjbGFzcz1cIm0tMCB0ZXh0LXhzIGZvbnQtc2VtaWJvbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyByb3dEYXRhW2NvbC5zdWJ0aXRsZV0gfX1cclxuICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2wudGVtcGxhdGUgJiYgdmFsaWRhdGVTaG93VGVtcGxhdGUocm93Tm9kZSwgY29sKVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJnZXRDdXN0b21UZW1wbGF0ZShjb2wudGVtcGxhdGUubmFtZSlcIlxyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldEN1c3RvbVRlbXBsYXRlKGNvbC50ZW1wbGF0ZS5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3dEYXRhIH1cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8dGRcclxuICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLWxlZnQ6IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlclwiXHJcbiAgICAgICAgICAqbmdJZj1cIihjb25maWcuYWN0aW9ucz8ubGVuZ3RoID8/IDAgPiAwKSB8fCBjb25maWcuYWN0aW9uc1BhaVwiXHJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyUmlnaHRdPVwicm93Tm9kZS5sZXZlbCA9PT0gMCA/ICdub25lJyA6ICcnXCJcclxuICAgICAgICAgIFtzdHlsZS5ib3JkZXJMZWZ0XT1cInJvd05vZGUubGV2ZWwgPT09IDAgPyAnbm9uZScgOiAnJ1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgIChjb25maWcuYWN0aW9ucz8ubGVuZ3RoID8/IDAgPiAwKSAmJlxyXG4gICAgICAgICAgICAgIHZhbGlkYXRlQWN0aW9uUG9zaXRpb24ocm93Tm9kZSlcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgY3Vyc29yLXBvaW50ZXIgaWNvbi1tb3JlLWhvcml6IHAtMVwiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDIwcHhcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJtZW51LnRvZ2dsZSgkZXZlbnQpOyBhY3RpdmVJdGVtKHJvd0RhdGEpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIG1vcmVfaG9yaXpcclxuICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICBAZm9yKGFjdGlvbiBvZiBjb25maWcuYWN0aW9uczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgIHt7IGNyaWFyTWVudXNNb2RhbChyb3dEYXRhKSB9fVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgPHAtbWVudVxyXG4gICAgICAgICAgICAgICNtZW51XHJcbiAgICAgICAgICAgICAgW3BvcHVwXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIFttb2RlbF09XCJtZW51SXRlbXNcIlxyXG4gICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgID48L3AtbWVudT5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgQGlmKGNvbmZpZy5hY3Rpb25zUGFpPy5sZW5ndGggPz8gMCA+IDAgJiYgcm93Tm9kZS5sZXZlbCA9PSAwKXtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIFwiPlxyXG4gICAgICAgICAgICBAZm9yIChhY3Rpb25QYWkgb2YgY29uZmlnLmFjdGlvbnNQYWk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgICBAaWYoZ2V0T3JFeGVjdXRlKGFjdGlvblBhaS52aXNpYmxlLCByb3dEYXRhKSA/PyB0cnVlKSB7XHJcbiAgICAgICAgICAgIDxrdi1idXR0b25cclxuICAgICAgICAgICAgICAob25DbGljayk9XCJhY3RpdmVJdGVtKHJvd0RhdGEpOyBhY3Rpb25QYWkuY29tbWFuZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cImFjdGlvblBhaS5pY29uXCJcclxuICAgICAgICAgICAgICBbc2V2ZXJpdHldPVwiYWN0aW9uUGFpLnNldmVyaXR5IHx8ICd0ZXJ0aWFyeSdcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgfSB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICBcclxuICAgICAgPC90cj5cclxuICAgIH0gQGVsc2Uge1xyXG4gICAgICA8dHJcclxuICAgICAgW3R0Um93XT1cInJvd05vZGVcIlxyXG4gICAgICAoZGJsY2xpY2spPVwiZG91YmxlQ2xpY2soJGV2ZW50LCByb3dEYXRhKVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsgY2FwaXRhbGl6ZTogdGFibGVDYXB0YWxpemVkIH1cIlxyXG4gICAgPlxyXG4gICAgICBAZm9yKGNvbCBvZiBjb2x1bW5zOyB0cmFjayAkaW5kZXgpe1xyXG4gICAgICA8dGRcclxuICAgICAgICBbc3R5bGUucG9zaXRpb25dPVwicm93Tm9kZS5sZXZlbCAhPT0gMCA/ICdzdGlja3knIDogbnVsbFwiXHJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiXHJcbiAgICAgICAgICBjaGlsZHJlblJlY29pbCAmJiByb3dOb2RlLmxldmVsICE9PSAwID8gcm93Tm9kZS5sZXZlbCAqIDMwIDogbnVsbFxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgW3N0eWxlLmJvcmRlclJpZ2h0XT1cInJvd05vZGUubGV2ZWwgPT09IDAgPyAnbm9uZScgOiAnJ1wiXHJcbiAgICAgICAgW3N0eWxlLmJvcmRlckxlZnRdPVwiXHJcbiAgICAgICAgICByb3dOb2RlLmxldmVsID09PSAwICYmIGNvbC5maWVsZCAhPSBjb25maWcuY29sdW1uc1swXS5maWVsZFxyXG4gICAgICAgICAgICA/ICdub25lJ1xyXG4gICAgICAgICAgICA6ICcnXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHt7IGFsaWduKGNvbCkgfX1cIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwtaC1mdWxsIGZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIkaW5kZXggPT0gMFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxwLXRyZWVUYWJsZVRvZ2dsZXIgY2xhc3M9XCJoaWRkZW5WaXNpYmxlXCIgW3Jvd05vZGVdPVwicm93Tm9kZVwiIC8+XHJcblxyXG4gICAgICAgICAgICBAaWYoY29uZmlnLmVuYWJsZVNlbGVjdCkge1xyXG4gICAgICAgICAgICAgIDxwLXRyZWVUYWJsZUNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZENoZWNrYm94KHJvd0RhdGEsIHJvd05vZGUpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVJdGVtTG90ZShzZWxlY3RlZEl0ZW1zKVwiXHJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwicm93Tm9kZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogaXNTZWxlY3RFbmFibGVkKHJvd0RhdGEsIHJvd05vZGUpID8gJ2Jsb2NrJyA6ICdub25lJyxcclxuICAgICAgICAgICAgICAgICAgJ21hcmdpbi1sZWZ0JzogY29uZmlnLnZpc2libGVDaGVja2JveEZ1bmN0aW9uID8gJy0zNHB4JyA6ICcwcHgnXHJcbiAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZ2FwLTJcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgQGlmKGNvbC50YWdDb2xvcikge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnXCJcclxuICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJcclxuICAgICAgICAgICAgICAgICAgY29sLnRvb2x0aXBUYWcgJiZcclxuICAgICAgICAgICAgICAgICAgY29sLnRvb2x0aXBUYWcocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0pXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50YWdDb2xvcihyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmJvb2xlYW5cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwaSB7e1xyXG4gICAgICAgICAgICAgICAgICByb3dEYXRhW2NvbC5maWVsZF0gPyAncGktY2hlY2sgdGV4dC1ncmVlbi0zMDAnIDogJydcclxuICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW1cIlxyXG4gICAgICAgICAgICAgID48L2k+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nSWY9XCIhY29sLmJvb2xlYW5cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS0wIHRleHQteHNcIj57eyByb3dEYXRhW2NvbC5maWVsZF0gfX08L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJjb2wuc3VidGl0bGVcIiBjbGFzcz1cIm0tMCB0ZXh0LXhzIGZvbnQtc2VtaWJvbGRcIj5cclxuICAgICAgICAgICAgICAgICAge3sgcm93RGF0YVtjb2wuc3VidGl0bGVdIH19XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY29sLnRlbXBsYXRlICYmIHZhbGlkYXRlU2hvd1RlbXBsYXRlKHJvd05vZGUsIGNvbClcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgKm5nSWY9XCJnZXRDdXN0b21UZW1wbGF0ZShjb2wudGVtcGxhdGUubmFtZSlcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRDdXN0b21UZW1wbGF0ZShjb2wudGVtcGxhdGUubmFtZSlcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvd0RhdGEgfVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDx0ZFxyXG4gICAgICAgIHN0eWxlPVwiYm9yZGVyLWxlZnQ6IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlclwiXHJcbiAgICAgICAgKm5nSWY9XCIoY29uZmlnLmFjdGlvbnM/Lmxlbmd0aCA/PyAwID4gMCkgfHwgY29uZmlnLmFjdGlvbnNQYWlcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgKGNvbmZpZy5hY3Rpb25zPy5sZW5ndGggPz8gMCA+IDApICYmXHJcbiAgICAgICAgICAgIHZhbGlkYXRlQWN0aW9uUG9zaXRpb24ocm93Tm9kZSlcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGN1cnNvci1wb2ludGVyIGljb24tbW9yZS1ob3JpeiBwLTFcIlxyXG4gICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMjBweFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJtZW51LnRvZ2dsZSgkZXZlbnQpOyBhY3RpdmVJdGVtKHJvd0RhdGEpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgbW9yZV9ob3JpelxyXG4gICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgIEBmb3IoYWN0aW9uIG9mIGNvbmZpZy5hY3Rpb25zOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgIHt7IGNyaWFyTWVudXNNb2RhbChyb3dEYXRhKSB9fVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIDxwLW1lbnVcclxuICAgICAgICAgICAgI21lbnVcclxuICAgICAgICAgICAgW3BvcHVwXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbbW9kZWxdPVwibWVudUl0ZW1zXCJcclxuICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgID48L3AtbWVudT5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgQGlmKGNvbmZpZy5hY3Rpb25zUGFpPy5sZW5ndGggPz8gMCA+IDAgJiYgcm93Tm9kZS5sZXZlbCA9PSAwKXtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICBAZm9yIChhY3Rpb25QYWkgb2YgY29uZmlnLmFjdGlvbnNQYWk7IHRyYWNrICRpbmRleCkgeyBAaWZcclxuICAgICAgICAgIChnZXRPckV4ZWN1dGUoYWN0aW9uUGFpLnZpc2libGUsIHJvd0RhdGEpID8/IHRydWUpIHtcclxuICAgICAgICAgIDxrdi1idXR0b25cclxuICAgICAgICAgICAgKG9uQ2xpY2spPVwiYWN0aXZlSXRlbShyb3dEYXRhKTsgYWN0aW9uUGFpLmNvbW1hbmQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXHJcbiAgICAgICAgICAgIFtpY29uXT1cImFjdGlvblBhaS5pY29uXCJcclxuICAgICAgICAgICAgW3NldmVyaXR5XT1cImFjdGlvblBhaS5zZXZlcml0eSB8fCAndGVydGlhcnknXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICB9IH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICB9XHJcblxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIDx0ZFxyXG4gICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjb25maWcuY29sdW1ucy5sZW5ndGggKyAxXCJcclxuICAgICAgICAgIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiXHJcbiAgICAgICAgICBjbGFzcz1cInRleHQtc21cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IHRleHRvRW1wdHlNZXNzYWdlIH19XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9wLXRyZWVUYWJsZT5cclxuPC9kaXY+XHJcblxyXG5cclxuIl19
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtdHJlZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9rdi10cmVlLXRhYmxlL2t2LXRyZWUtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtdHJlZS10YWJsZS9rdi10cmVlLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFFTCxZQUFZLEVBQ1osYUFBYSxHQUNkLE1BQU0sd0NBQXdDLENBQUM7QUFFaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFckYsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7OztBQVF0RSxNQUFNLE9BQU8sb0JBQW9CO0lBc0IvQixZQUNVLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUF0QmhDLGNBQVMsR0FBZSxFQUFFLENBQUM7UUFFbEIseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBSXRDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0Isb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFDeEIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1YsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQzNCLHNCQUFp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biAgQ29udGVudENoaWxkcmVuLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWVudUl0ZW0sIFRyZWVOb2RlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBUcmVlVGFibGUgfSBmcm9tICdwcmltZW5nL3RyZWV0YWJsZSc7XHJcbmltcG9ydCB7XHJcbiAgVmFsdWVPckZuLFxyXG4gIGdldE9yRXhlY3V0ZSxcclxuICBtYXBUb01lbnVJdGVtLFxyXG59IGZyb20gJy4uLy4uL2FwaS9jb21wb25lbnRzL3RhYmxlL2t2LW1lbnVpdGVtJztcclxuaW1wb3J0IHsgVGFibGVQYWdpbmF0ZSB9IGZyb20gJy4uLy4uL2FwaS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLnBhZ2luYXRlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9hcGkvZGlyZWN0aXZlcy90ZW1wbGF0ZS90ZW1wbGF0ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBUcmVlVGFibGVDb25maWcgfSBmcm9tICcuLi8uLi9hcGkvY29tcG9uZW50cy90cmVlLXRhYmxlL3RyZWUtdGFibGUuY29uZmlnJztcclxuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBUYWJsZUNvbmZpZ0NvbHVtbiB9IGZyb20gJy4uLy4uL2FwaS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbmZpZy5jb2x1bW4nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdrdi10cmVlLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4va3YtdHJlZS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4va3YtdHJlZS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgS3ZUcmVldGFibGVDb21wb25lbnQge1xyXG4gIG1lbnVJdGVtczogTWVudUl0ZW1bXSA9IFtdO1xyXG4gIHRhbWFuaG9UZWxhITogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVSb3dOb2RlU3RpY2t5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZyE6IFRyZWVUYWJsZUNvbmZpZztcclxuICBASW5wdXQoKSBkYXRhU291cmNlITogYW55O1xyXG4gIEBJbnB1dCgpIGdyaWRMaW5lczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHRhYmxlQ2FwdGFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIHBhZ2luYXRvciA9IHRydWU7XHJcbiAgQElucHV0KCkgcm93cyA9IDEwO1xyXG4gIEBJbnB1dCgpIHRyZWVUYWJsZURyYWdnYWJsZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHRyYW5zZmVyQXJyYXlJdGVtID0gZmFsc2U7XHJcbiAgQElucHV0KCkgb3JkZW5hY2FvITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHRvdGFsUmVjb3JkcyE6IG51bWJlcjtcclxuICBASW5wdXQoKSB0ZXh0b0VtcHR5TWVzc2FnZTogc3RyaW5nID0gJ05lbmh1bSByZWdpc3RybyBlbmNvbnRyYWRvJztcclxuICBASW5wdXQoKSBjaGlsZHJlblJlY29pbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2Nyb2xsSGVpZ2h0OiBzdHJpbmcgPSAnJztcclxuICBcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcclxuICApe31cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgTyB2YWxvciBkZSBwYWdlTGlua3Mgw6kgYXRyaWJ1w61kbyBkZSBhY29yZG8gY29tIG8gdGFtYW5obyBkYSB0ZWxhLCBlc3NhIHByb3ByaWVkYWRlIG7Do28gZXN0w6Egc2VuZG8gdXRpbGl6YWRhXHJcbiAgICovXHJcbiAgQElucHV0KCkgcGFnZUxpbmtzT3B0aW9ucyE6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCBPIHZhbG9yIGRlIHBhZ2VMaW5rcyDDqSBhdHJpYnXDrWRvIGRlIGFjb3JkbyBjb20gbyB0YW1hbmhvIGRhIHRlbGEsIGVzc2EgcHJvcHJpZWRhZGUgbsOjbyBlc3TDoSBzZW5kbyB1dGlsaXphZGFcclxuICAgKi9cclxuICBASW5wdXQoKSBwYWdlTGlua3MhOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgQSBxdWFudGlkYWRlIGRlIHBhZ2luaXRvclBhZ2VJY29ucyDDqSBhdHJpYnXDrWRvIGRlIGFjb3JkbyBjb20gbyB0YW1hbmhvIGRhIHRlbGEsIGVzc2EgcHJvcHJpZWRhZGUgbsOjbyBlc3TDoSBzZW5kbyB1dGlsaXphZGFcclxuICAgKi9cclxuICBASW5wdXQoKSBzaG93Rmlyc3RMYXN0SWNvbiE6IGJvb2xlYW47XHJcblxyXG4gIEBPdXRwdXQoKSBvbkZpbHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uUGFnaW5hdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvbkFjdGl2ZUl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvbkFjdGl2ZUl0ZW1Mb3RlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZG91YmxlQ2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uTm9kZVNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uTm9kZVVuc2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25Ecm9wSXRlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnRhbWFuaG9UZWxhID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICBpZiAodGhpcy5vcmRlbmFjYW8pIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlID0gdGhpcy5zb3J0VHJlZU5vZGVzKHRoaXMuZGF0YVNvdXJjZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlRGlyZWN0aXZlKSB0ZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8YW55PjtcclxuICBASW5wdXQoJ3RlbXBsYXRlcycpIF90ZW1wbGF0ZXMhOiBhbnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoVHJlZVRhYmxlKSBwVHJlZVRhYmxlITogVHJlZVRhYmxlO1xyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0QnVzY2EnKSBpbnB1dEJ1c2NhITogRWxlbWVudFJlZjtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgb25XaW5kb3dSZXNpemUoKSB7XHJcbiAgICB0aGlzLnRhbWFuaG9UZWxhID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWN0aXZlSXRlbShyb3dEYXRhOiBhbnkpIHtcclxuICAgIHRoaXMub25BY3RpdmVJdGVtLmVtaXQocm93RGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWN0aXZlSXRlbUxvdGUocm93RGF0YTogYW55KSB7XHJcbiAgICB0aGlzLm9uQWN0aXZlSXRlbUxvdGUuZW1pdChyb3dEYXRhKTtcclxuICB9XHJcblxyXG4gIGdldE9yRXhlY3V0ZTxUPihhY3Rpb246IFZhbHVlT3JGbjxUPiwgZGF0YTogYW55KTogVCB7XHJcbiAgICByZXR1cm4gZ2V0T3JFeGVjdXRlKGFjdGlvbiwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25HbG9iYWxGaWx0ZXIodGFibGU6IFRyZWVUYWJsZSwgZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XHJcbiAgICB0YWJsZS5maWx0ZXJHbG9iYWwoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSwgJ2NvbnRhaW5zJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGFnaW5hdGUoJGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICgkZXZlbnQpIHtcclxuICAgICAgbGV0IHBhZ2luYUluaWNpYWwgPVxyXG4gICAgICAgICgkZXZlbnQ/LmZpcnN0ID4gMCA/ICRldmVudC5maXJzdCAvICRldmVudC5yb3dzIDogJGV2ZW50LmZpcnN0KSArIDE7XHJcbiAgICAgIGxldCB0ZXJtb1Blc3F1aXNhID0gJyc7XHJcbiAgICAgIGxldCBvcmRlbmFjYW8gPSAnJztcclxuXHJcbiAgICAgIGlmICgkZXZlbnQuZ2xvYmFsRmlsdGVyKSB0ZXJtb1Blc3F1aXNhID0gJGV2ZW50Lmdsb2JhbEZpbHRlcjtcclxuXHJcbiAgICAgIGlmICgkZXZlbnQuc29ydEZpZWxkKVxyXG4gICAgICAgIG9yZGVuYWNhbyA9IGAkeyRldmVudC5zb3J0RmllbGR9ICR7XHJcbiAgICAgICAgICAkZXZlbnQuc29ydE9yZGVyID09PSAxID8gJ0FTQycgOiAnREVTQydcclxuICAgICAgICB9YDtcclxuXHJcbiAgICAgIGNvbnN0IG9iamV0bzogVGFibGVQYWdpbmF0ZSA9IHtcclxuICAgICAgICBwYWdpbmFJbmljaWFsOiBwYWdpbmFJbmljaWFsLFxyXG4gICAgICAgIHRhbWFuaG9QYWdpbmE6ICRldmVudC5yb3dzLFxyXG4gICAgICAgIHRlcm1vUGVzcXVpc2E6IHRlcm1vUGVzcXVpc2EsXHJcbiAgICAgICAgb3JkZW5hY2FvOiBvcmRlbmFjYW8sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm9uUGFnaW5hdGUuZW1pdChvYmpldG8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8YW55Pikge1xyXG4gICAgY29uc3QgZHJhZ2dlZE5vZGUgPSBldmVudC5pdGVtLmRhdGE7XHJcbiAgICBjb25zdCBkcmFnZ2VkQ2hpbGREYXRhID0gZHJhZ2dlZE5vZGUubm9kZS5kYXRhO1xyXG5cclxuICAgIGlmIChkcmFnZ2VkTm9kZS5sZXZlbCA9PT0gMCkge1xyXG4gICAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5kYXRhU291cmNlLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xyXG4gICAgfSBlbHNlIGlmIChkcmFnZ2VkTm9kZS5sZXZlbCA+PSAxKSB7XHJcbiAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBkcmFnZ2VkTm9kZS5ub2RlLnBhcmVudDtcclxuXHJcbiAgICAgIGlmIChwYXJlbnROb2RlKSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Q2hpbGRyZW4gPSBwYXJlbnROb2RlLmNoaWxkcmVuLm1hcChcclxuICAgICAgICAgIChjaGlsZDogYW55KSA9PiBjaGlsZC5kYXRhXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBwcmV2aW91c0NoaWxkSW5kZXggPSBwYXJlbnRDaGlsZHJlbi5pbmRleE9mKGRyYWdnZWRDaGlsZERhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCByZWxhdGl2ZUN1cnJlbnRJbmRleCA9XHJcbiAgICAgICAgICBwcmV2aW91c0NoaWxkSW5kZXggKyAoZXZlbnQuY3VycmVudEluZGV4IC0gZXZlbnQucHJldmlvdXNJbmRleCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldENoaWxkSW5kZXggPSBNYXRoLm1heChcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICBNYXRoLm1pbihwYXJlbnRDaGlsZHJlbi5sZW5ndGggLSAxLCByZWxhdGl2ZUN1cnJlbnRJbmRleClcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAocHJldmlvdXNDaGlsZEluZGV4ICE9PSAtMSAmJiB0YXJnZXRDaGlsZEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgbW92ZUl0ZW1JbkFycmF5KFxyXG4gICAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkcmVuLFxyXG4gICAgICAgICAgICBwcmV2aW91c0NoaWxkSW5kZXgsXHJcbiAgICAgICAgICAgIHRhcmdldENoaWxkSW5kZXhcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRyb3BJbmZvOiBhbnkgPSB7XHJcbiAgICAgICAgICBwcmV2aW91c0NoaWxkSW5kZXg6IHByZXZpb3VzQ2hpbGRJbmRleCArIDEsXHJcbiAgICAgICAgICB0YXJnZXRDaGlsZEluZGV4OiB0YXJnZXRDaGlsZEluZGV4ICsgMSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLm9uRHJvcEl0ZW0uZW1pdCh7IGV2ZW50OiBldmVudCwgZHJvcENoaWxkSW5mbzogZHJvcEluZm8gfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBbLi4udGhpcy5kYXRhU291cmNlXTtcclxuICAgIGlmIChkcmFnZ2VkTm9kZS5sZXZlbCA9PT0gMCkge1xyXG4gICAgICB0aGlzLm9uRHJvcEl0ZW0uZW1pdChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzb3J0VHJlZU5vZGVzKG5vZGVzOiBUcmVlTm9kZVtdKTogVHJlZU5vZGVbXSB7XHJcbiAgICByZXR1cm4gbm9kZXNcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEuZGF0YVt0aGlzLm9yZGVuYWNhb10gLSBiLmRhdGFbdGhpcy5vcmRlbmFjYW9dKVxyXG4gICAgICAubWFwKChub2RlKSA9PiB7XHJcbiAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSB0aGlzLnNvcnRUcmVlTm9kZXMobm9kZS5jaGlsZHJlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZVRhcmdldENoaWxkSW5kZXgoXHJcbiAgICBldmVudDogQ2RrRHJhZ0Ryb3A8YW55PixcclxuICAgIHBhcmVudENoaWxkcmVuOiBhbnlbXSxcclxuICAgIHByZXZpb3VzQ2hpbGRJbmRleDogbnVtYmVyXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHRhcmdldENoaWxkSW5kZXggPVxyXG4gICAgICBwcmV2aW91c0NoaWxkSW5kZXggKyAoZXZlbnQuY3VycmVudEluZGV4IC0gZXZlbnQucHJldmlvdXNJbmRleCk7XHJcblxyXG4gICAgaWYgKHRhcmdldENoaWxkSW5kZXggPCAwKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSBlbHNlIGlmICh0YXJnZXRDaGlsZEluZGV4ID49IHBhcmVudENoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gcGFyZW50Q2hpbGRyZW4ubGVuZ3RoIC0gMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0YXJnZXRDaGlsZEluZGV4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcmV0dXJuU3R5bGVSb3coY29sOiBhbnksIHJvd05vZGU6IGFueSk6IHN0cmluZyB7XHJcbiAgLy8gICBjb25zdCBpc0ZpcnN0Q29sdW1uID0gY29sLmZpZWxkID09PSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLmZpZWxkO1xyXG4gIC8vICAgY29uc3QgYmFzZU9wYWNpdHkgPSAxO1xyXG4gIC8vICAgY29uc3QgbWF4TGV2ZWxzID0gNDtcclxuXHJcbiAgLy8gICBpZiAoaXNGaXJzdENvbHVtbiAmJiByb3dOb2RlLmxldmVsID49IDApIHtcclxuICAvLyAgICAgY29uc3Qgb3BhY2l0eSA9IGJhc2VPcGFjaXR5IC0gKHJvd05vZGUubGV2ZWwgLyBtYXhMZXZlbHMpO1xyXG5cclxuICAvLyAgICAgcmV0dXJuIGBib3JkZXItbGVmdDogc29saWQgNHB4IHJnYmEoNTksIDExMCwgMTU4LCAkeyBvcGFjaXR5IH0pICFpbXBvcnRhbnQ7YDtcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICBpZiAocm93Tm9kZS5sZXZlbCA9PSAwKVxyXG4gIC8vICAgICByZXR1cm4gJ2JvcmRlci1sZWZ0OiBub25lICFpbXBvcnRhbnQ7IGJvcmRlci1yaWdodDogbm9uZSAhaW1wb3J0YW50J1xyXG5cclxuICAvLyAgIHJldHVybiAnJztcclxuICAvLyB9XHJcblxyXG4gIGNyaWFyTWVudXNNb2RhbChkYXRhOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5hY3Rpb25zICYmIGRhdGEpIHtcclxuICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5jb25maWcuYWN0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IG1lbnVJbnNlcnQgPSBtYXBUb01lbnVJdGVtKGFjdGlvbiwgZGF0YSk7XHJcblxyXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5tZW51SXRlbXMuZmlsdGVyKFxyXG4gICAgICAgICAgKHgpID0+IHguY29tbWFuZCA9PSBtZW51SW5zZXJ0LmNvbW1hbmRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoaXRlbS5sZW5ndGggPT0gMCkgdGhpcy5tZW51SXRlbXMucHVzaChtZW51SW5zZXJ0KTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmIChtZW51SW5zZXJ0LmxhYmVsICE9IGl0ZW1bMF0ubGFiZWwpIHtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5tZW51SXRlbXMuaW5kZXhPZihpdGVtWzBdKTtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobWVudUluc2VydC52aXNpYmxlICE9IGl0ZW1bMF0udmlzaWJsZSkge1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLm1lbnVJdGVtcy5pbmRleE9mKGl0ZW1bMF0pO1xyXG4gICAgICAgICAgICB0aGlzLm1lbnVJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChtZW51SW5zZXJ0LmRpc2FibGVkICE9IGl0ZW1bMF0uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5tZW51SXRlbXMuaW5kZXhPZihpdGVtWzBdKTtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4aWJpckNhbXBvKGZpZWxkOiBhbnksIHJvd0RhdGE6IGFueSkge1xyXG4gICAgbGV0IHZpc2libGUgPSBmaWVsZC52aXNpYmxlID8gZmllbGQudmlzaWJsZShyb3dEYXRhKSA6IHRydWU7XHJcbiAgICByZXR1cm4gdmlzaWJsZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlQWN0aW9uUG9zaXRpb24ocm93Tm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5jb25maWcuYWN0aW9uc1BhaSAmJiByb3dOb2RlLmxldmVsID09IDApIHJldHVybiBmYWxzZTtcclxuICAgIGVsc2UgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBkb3VibGVDbGljayhlOiBhbnksIHJvd0RhdGE6IGFueSkge1xyXG4gICAgbGV0IGV2ZW50RG91YmxlQ2xpY2sgPSB7IGV2ZW50OiBlLCByb3dEYXRhOiByb3dEYXRhIH07XHJcblxyXG4gICAgbGV0IGFycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZS50YXJnZXQuY2xhc3NMaXN0LmZvckVhY2goKHg6IGFueSkgPT4gYXJyYXkucHVzaCh4KSk7XHJcblxyXG4gICAgLy8gaWYgKGFycmF5LmZpbmQoKHg6IGFueSkgPT4geCA9PSAnbmctc3Rhci1pbnNlcnRlZCcpICE9IHVuZGVmaW5lZClcclxuICAgIHRoaXMuZG91YmxlQ2xpY2tFdmVudC5lbWl0KGV2ZW50RG91YmxlQ2xpY2spO1xyXG4gIH1cclxuXHJcbiAgaXNEaXNhYmxlZENoZWNrYm94KHJvd0RhdGE6IGFueSwgcm93Tm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGlzYWJsZUNvbnRyb2xDaGVja2JveEZ1bmN0aW9uXHJcbiAgICAgID8gdGhpcy5jb25maWcuZGlzYWJsZUNvbnRyb2xDaGVja2JveEZ1bmN0aW9uKHJvd0RhdGEsIHJvd05vZGUpXHJcbiAgICAgIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc1NlbGVjdEVuYWJsZWQocm93RGF0YTogYW55LCByb3dOb2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgcmV0dXJuIHRoaXMuY29uZmlnLnZpc2libGVDaGVja2JveEZ1bmN0aW9uXHJcbiAgID8gdGhpcy5jb25maWcudmlzaWJsZUNoZWNrYm94RnVuY3Rpb24ocm93RGF0YSwgcm93Tm9kZSkgXHJcbiAgICA6IHRydWVcclxuICB9XHJcblxyXG4gIG9uTm9kZVNlbGVjdGVkKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMub25Ob2RlU2VsZWN0LmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Ob2RlVW5zZWxlY3RlZChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLm9uTm9kZVVuc2VsZWN0LmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3VzdG9tVGVtcGxhdGUodGVtcGxhdGVuYW1lOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZXNbdGVtcGxhdGVuYW1lXTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlU2hvd1RlbXBsYXRlKHJvd05vZGU6IGFueSwgY29sOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmIChjb2wudGVtcGxhdGVPbmx5KSB7XHJcbiAgICAgIGlmIChjb2wudGVtcGxhdGVPbmx5ID09PSAncGFpJykge1xyXG4gICAgICAgIHJldHVybiByb3dOb2RlLmxldmVsID09PSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2wudGVtcGxhdGVPbmx5ID09PSAnZmlsaG8nKSB7XHJcbiAgICAgICAgcmV0dXJuIHJvd05vZGUubGV2ZWwgPT09IDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0SWNvbihpY29uOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGljb24uaW5jbHVkZXMoJ3BpLScpID8gYHBpICR7aWNvbn1gIDogJyc7XHJcbiAgfVxyXG5cclxuICBhbGlnbihjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogc3RyaW5nIHtcclxuICAgIGlmIChjb2wuY2VudHJhbGl6ZSkgcmV0dXJuICdqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJztcclxuICAgIGVsc2UgaWYgKGNvbC5hbGlnbiA9PSAncmlnaHQnKSByZXR1cm4gJ2p1c3RpZnktY29udGVudC1lbmQnO1xyXG4gICAgZWxzZSByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICByZXNldFRyZWVUYWJsZSgpe1xyXG4gICAgaWYgKHRoaXMucFRyZWVUYWJsZSkgdGhpcy5wVHJlZVRhYmxlLnJlc2V0KCk7XHJcbiAgICBpZiAodGhpcy5pbnB1dEJ1c2NhKSB0aGlzLmlucHV0QnVzY2EubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2PlxyXG4gIDxwLXRyZWVUYWJsZVxyXG4gICAgICAjdHRcclxuICAgICAgY2RrRHJvcExpc3RcclxuICAgICAgY2xhc3M9XCJleGFtcGxlLWxpc3RcIlxyXG4gICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiXHJcbiAgICAgIFt2YWx1ZV09XCJkYXRhU291cmNlXCJcclxuICAgICAgW2NvbHVtbnNdPVwiY29uZmlnLmNvbHVtbnNcIlxyXG4gICAgICBbcmVzaXphYmxlQ29sdW1uc109XCJ0cnVlXCJcclxuICAgICAgW3RhYmxlU3R5bGVdPVwieyAnbWluLXdpZHRoJzogJzUwcmVtJyB9XCJcclxuICAgICAgW3Jlc2l6YWJsZUNvbHVtbnNdPVwidHJ1ZVwiXHJcbiAgICAgIFtwYWdpbmF0b3JdPVwicGFnaW5hdG9yXCJcclxuICAgICAgW3Jvd3NdPVwicm93c1wiXHJcbiAgICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcclxuICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJbNSwgMTAsIDI1LCA1MF1cIlxyXG4gICAgICBbc2hvd0ZpcnN0TGFzdEljb25dPVwidGFtYW5ob1RlbGEgPiA5NjAgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICBbcGFnZUxpbmtzXT1cInRhbWFuaG9UZWxhID4gOTYwID8gMiA6IDFcIlxyXG4gICAgICBbc3R5bGVDbGFzc109XCJncmlkTGluZXMgPyAncC10cmVldGFibGUtZ3JpZGxpbmVzJyA6ICcnXCJcclxuICAgICAgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGVkSXRlbXNcIlxyXG4gICAgICBbbGF6eV09XCJjb25maWcubGF6eVwiXHJcbiAgICAgIChvbkxhenlMb2FkKT1cInBhZ2luYXRlKCRldmVudClcIlxyXG4gICAgICAob25Ob2RlU2VsZWN0KT1cIm9uTm9kZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAob25Ob2RlVW5zZWxlY3QpPVwib25Ob2RlVW5zZWxlY3RlZCgkZXZlbnQpXCJcclxuICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcclxuICAgICAgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cIntmaXJzdH0gLSB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc31cIlxyXG4gICAgICBbc2Nyb2xsSGVpZ2h0XT1cInNjcm9sbEhlaWdodFwiXHJcbiAgPlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIiAqbmdJZj1cImNvbmZpZy5lbmFibGVDYXRpb25cIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ3JpZCBmb3JtZ3JpZCBwLWZsdWlkIGNvbC0xMiBtLTBcIlxyXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZWFlYWVhXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZmxleCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbmZpZy50aXRsZVwiIGNsYXNzPVwidGV4dC1tZCBmb250LWJvbGQgbXktM1wiPlxyXG4gICAgICAgICAgICB7eyBjb25maWcudGl0bGUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbmZpZy5zdWJ0aXRsZVwiIGNsYXNzPVwidGV4dC1zbSBtYi00IGZvbnQtbWVkaXVtXCI+XHJcbiAgICAgICAgICAgIHt7IGNvbmZpZy5zdWJ0aXRsZSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBjb2wtMTAgcC0wIG1kOmNvbC02IGxnOmNvbC00IGp1c3RpZnktY29udGVudC1jZW50ZXIge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YW1hbmhvVGVsYSA8IDc2OCA/ICcnIDogJ2lucHV0LXNlYXJjaCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuZW5hYmxlRmlsdGVyXCIgY2xhc3M9XCJwLWlucHV0LWljb24tbGVmdFwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXNlYXJjaFwiPjwvaT5cclxuXHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgcEF1dG9Gb2N1c1xyXG4gICAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbkdsb2JhbEZpbHRlcih0dCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBlc3F1aXNhci4uLlwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImgtMnJlbVwiXHJcbiAgICAgICAgICAgICAgICAjaW5wdXRCdXNjYVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBjb2wtMSBqdXN0aWZ5LWNvbnRlbnQtZW5kIHAtMFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTIgYnRucy1vcHRpb25zXCI+XHJcbiAgICAgICAgICAgIEBmb3IgKGFjdGlvbiBvZiBjb25maWcuYWN0aW9uc0xvdGU7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgICBAaWYoKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCB8fCBhY3Rpb24uc2hvd0Fjb2VzTG90ZSkgJiZcclxuICAgICAgICAgICAgZXhpYmlyQ2FtcG8oYWN0aW9uLCB0aGlzLmFjdGlvbikpIHtcclxuICAgICAgICAgICAgPGt2LWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiYWN0aW9uPy5jb21tYW5kKCk7IGFjdGl2ZUl0ZW1Mb3RlKHNlbGVjdGVkSXRlbXMpXCJcclxuICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJnZXRPckV4ZWN1dGUoYWN0aW9uLnRvb2x0aXAsIHNlbGVjdGVkSXRlbXMpXCJcclxuICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2JvdHRvbSdcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldE9yRXhlY3V0ZShhY3Rpb24uZGlzYWJsZWQsIHNlbGVjdGVkSXRlbXMpIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cImdldE9yRXhlY3V0ZShhY3Rpb24uaWNvbiwgc2VsZWN0ZWRJdGVtcylcIlxyXG4gICAgICAgICAgICAgICAgW3NldmVyaXR5XT1cImFjdGlvbi5zZXZlcml0eSB8fCAndGVydGlhcnknXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgfSB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIEBpZihzaG93SGVhZGVyKXtcclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIEBmb3IoY29sIG9mIGNvbHVtbnM7IHRyYWNrICRpbmRleCl7XHJcbiAgICAgICAgPHRoXHJcbiAgICAgICAgICAgIFt0dFNvcnRhYmxlQ29sdW1uXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgIFt0dFNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiY29sLnNvcnRhYmxlID09PSBmYWxzZVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGhcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyBmbGV4OiAkaW5kZXggPT0gMCwgJ2dhcC0zJzogJGluZGV4ID09IDAgfVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIkaW5kZXggPT0gMCAmJiBjb25maWcuZW5hYmxlU2VsZWN0XCI+XHJcbiAgICAgICAgICAgICAgICA8cC10cmVlVGFibGVIZWFkZXJDaGVja2JveFxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVJdGVtTG90ZShzZWxlY3RlZEl0ZW1zKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgIHt7IGFsaWduKGNvbCkgfX1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC14c1wiPnt7IGNvbC5oZWFkZXIgfX08L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgQGlmKGNvbC5zb3J0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgPHAtdHJlZVRhYmxlU29ydEljb24gW2ZpZWxkXT1cImNvbC5maWVsZFwiIGNsYXNzPVwicGItMVwiLz5cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5oZWFkZXJUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJjb2wuaGVhZGVyVG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICA+aW5mbzwvc3BhblxyXG4gICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICBAaWYgKGNvbmZpZy5hY3Rpb25zPy5sZW5ndGggPz8gMCA+IDApIHtcclxuICAgICAgICA8dGggW3N0eWxlLndpZHRoXT1cIjVcIj48L3RoPlxyXG4gICAgICAgIH0gfVxyXG4gICAgICA8L3RyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCIgbGV0LWNvbHVtbnM+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPHRoXHJcbiAgICAgICAgICAgIFt0dFNvcnRhYmxlQ29sdW1uXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgIFt0dFNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiY29sLnNvcnRhYmxlID09PSBmYWxzZVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGhcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciB7eyBhbGlnbihjb2wpIH19XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC14c1wiPnt7IGNvbC5oZWFkZXIgfX08L3NwYW4+XHJcblxyXG4gICAgICAgICAgICBAaWYoY29sLnNvcnRhYmxlKSB7XHJcbiAgICAgICAgICAgIDxwLXRyZWVUYWJsZVNvcnRJY29uIFtmaWVsZF09XCJjb2wuZmllbGRcIiAgY2xhc3M9XCJwYi0xXCIvPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIH0gQGlmIChjb25maWcuYWN0aW9ucz8ubGVuZ3RoID8/IDAgPiAwKSB7XHJcbiAgICAgICAgPHRoIFtzdHlsZS53aWR0aF09XCI1XCI+PC90aD5cclxuICAgICAgICB9XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgfVxyXG5cclxuXHJcbiAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICBwVGVtcGxhdGU9XCJib2R5XCJcclxuICAgICAgICBsZXQtcm93Tm9kZVxyXG4gICAgICAgIGxldC1yb3dEYXRhPVwicm93RGF0YVwiXHJcbiAgICAgICAgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCJcclxuICAgID5cclxuXHJcbiAgICAgIEBpZih0cmVlVGFibGVEcmFnZ2FibGUpIHtcclxuICAgICAgPHRyXHJcbiAgICAgICAgICBjZGtEcmFnXHJcbiAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ5XCJcclxuICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJyb3dOb2RlXCJcclxuICAgICAgICAgIFt0dFJvd109XCJyb3dOb2RlXCJcclxuICAgICAgICAgIChkYmxjbGljayk9XCJkb3VibGVDbGljaygkZXZlbnQsIHJvd0RhdGEpXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgY2FwaXRhbGl6ZTogdGFibGVDYXB0YWxpemVkIH1cIlxyXG4gICAgICA+XHJcblxyXG4gICAgICAgIEBmb3IoY29sIG9mIGNvbHVtbnM7IHRyYWNrICRpbmRleCl7XHJcbiAgICAgICAgPHRkXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZHJhZ2dhYmxlLWNlbGxcIlxyXG4gICAgICAgICAgICBbc3R5bGUucG9zaXRpb25dPVwiIWRpc2FibGVSb3dOb2RlU3RpY2t5ICYmIHJvd05vZGUubGV2ZWwgIT09IDAgPyAnc3RpY2t5JyA6IG51bGxcIlxyXG5cclxuICAgICAgICA+XHJcblxyXG4gICAgICAgICAgPCEtLSBbc3R5bGUubGVmdC5weF09XCJcclxuICAgICAgICAgICAgICAgY2hpbGRyZW5SZWNvaWwgJiYgcm93Tm9kZS5sZXZlbCAhPT0gMCA/IHJvd05vZGUubGV2ZWwgKiAzMCA6IG51bGxcclxuICAgICAgICAgICAgICAgXCIgLS0+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgIHt7IGFsaWduKGNvbCkgfX1cIj5cclxuXHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsLWgtZnVsbCBmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiRpbmRleCA9PSAwXCJcclxuXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZHJhZy1pY29uXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IGdyYWI7IGZvbnQtc2l6ZTogMjVweDsgY29sb3I6ICM2YjcyODA7IG9wYWNpdHk6IDAuOTtcIlxyXG4gICAgICAgICAgICAgICAgICBjZGtEcmFnSGFuZGxlXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgZHJhZ19pbmRpY2F0b3JcclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHAtdHJlZVRhYmxlVG9nZ2xlclxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImhpZGRlblZpc2libGVcIlxyXG4gICAgICAgICAgICAgICAgICBbcm93Tm9kZV09XCJyb3dOb2RlXCJcclxuICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICBAaWYoY29uZmlnLmVuYWJsZVNlbGVjdCkge1xyXG4gICAgICAgICAgICAgIDxwLXRyZWVUYWJsZUNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkQ2hlY2tib3gocm93RGF0YSwgcm93Tm9kZSlcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlSXRlbUxvdGUoc2VsZWN0ZWRJdGVtcylcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicm93Tm9kZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiBpc1NlbGVjdEVuYWJsZWQocm93RGF0YSwgcm93Tm9kZSkgPyAnYmxvY2snIDogJ25vbmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFyZ2luLWxlZnQnOiBjb25maWcudmlzaWJsZUNoZWNrYm94RnVuY3Rpb24gPyAnLTM0cHgnIDogJzBweCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICBAaWYgKGNvbC50ZW1wbGF0ZSAmJiB2YWxpZGF0ZVNob3dUZW1wbGF0ZShyb3dOb2RlLCBjb2wpKSB7XHJcbiAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRDdXN0b21UZW1wbGF0ZShjb2wudGVtcGxhdGUubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldEN1c3RvbVRlbXBsYXRlKGNvbC50ZW1wbGF0ZS5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3dEYXRhIH1cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0yXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICBAaWYoY29sLnRhZ0NvbG9yKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLnRvb2x0aXBUYWcgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLnRvb2x0aXBUYWcocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50YWdDb2xvcihyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgID48L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5ib29sZWFuXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBpIHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGFbY29sLmZpZWxkXSA/ICdwaS1jaGVjayB0ZXh0LWdyZWVuLTMwMCcgOiAnJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbVwiXHJcbiAgICAgICAgICAgICAgICA+PC9pPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nSWY9XCIhY29sLmJvb2xlYW5cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLTAgdGV4dC14c1wiPnt7IHJvd0RhdGFbY29sLmZpZWxkXSB9fTwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiY29sLnN1YnRpdGxlXCIgY2xhc3M9XCJtLTAgdGV4dC14cyBmb250LXNlbWlib2xkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgcm93RGF0YVtjb2wuc3VidGl0bGVdIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPHRkXHJcbiAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLWxlZnQ6IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlclwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiKGNvbmZpZy5hY3Rpb25zPy5sZW5ndGggPz8gMCA+IDApIHx8IGNvbmZpZy5hY3Rpb25zUGFpXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJvcmRlclJpZ2h0XT1cInJvd05vZGUubGV2ZWwgPT09IDAgPyAnbm9uZScgOiAnJ1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJMZWZ0XT1cInJvd05vZGUubGV2ZWwgPT09IDAgPyAnbm9uZScgOiAnJ1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChjb25maWcuYWN0aW9ucz8ubGVuZ3RoID8/IDAgPiAwKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUFjdGlvblBvc2l0aW9uKHJvd05vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjdXJzb3ItcG9pbnRlciBpY29uLW1vcmUtaG9yaXogcC0xXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJtZW51LnRvZ2dsZSgkZXZlbnQpOyBhY3RpdmVJdGVtKHJvd0RhdGEpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIG1vcmVfaG9yaXpcclxuICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICBAZm9yKGFjdGlvbiBvZiBjb25maWcuYWN0aW9uczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgIHt7IGNyaWFyTWVudXNNb2RhbChyb3dEYXRhKSB9fVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICA8cC1tZW51XHJcbiAgICAgICAgICAgICAgICAjbWVudVxyXG4gICAgICAgICAgICAgICAgW3BvcHVwXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW21vZGVsXT1cIm1lbnVJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICA+PC9wLW1lbnU+XHJcblxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgQGlmKGNvbmZpZy5hY3Rpb25zUGFpPy5sZW5ndGggPz8gMCA+IDAgJiYgcm93Tm9kZS5sZXZlbCA9PSAwKXtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIFwiPlxyXG4gICAgICAgICAgICBAZm9yIChhY3Rpb25QYWkgb2YgY29uZmlnLmFjdGlvbnNQYWk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgICBAaWYoZ2V0T3JFeGVjdXRlKGFjdGlvblBhaS52aXNpYmxlLCByb3dEYXRhKSA/PyB0cnVlKSB7XHJcbiAgICAgICAgICAgIDxrdi1idXR0b25cclxuICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImFjdGl2ZUl0ZW0ocm93RGF0YSk7IGFjdGlvblBhaS5jb21tYW5kKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cImFjdGlvblBhaS5pY29uXCJcclxuICAgICAgICAgICAgICAgIFtzZXZlcml0eV09XCJhY3Rpb25QYWkuc2V2ZXJpdHkgfHwgJ3RlcnRpYXJ5J1wiXHJcbiAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICB9IH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICA8L3RyPlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgPHRyXHJcbiAgICAgICAgICBbdHRSb3ddPVwicm93Tm9kZVwiXHJcbiAgICAgICAgICAoZGJsY2xpY2spPVwiZG91YmxlQ2xpY2soJGV2ZW50LCByb3dEYXRhKVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7IGNhcGl0YWxpemU6IHRhYmxlQ2FwdGFsaXplZCB9XCJcclxuICAgICAgPlxyXG4gICAgICAgIEBmb3IoY29sIG9mIGNvbHVtbnM7IHRyYWNrICRpbmRleCl7XHJcbiAgICAgICAgPHRkXHJcbiAgICAgICAgICAgIFtzdHlsZS5wb3NpdGlvbl09XCJyb3dOb2RlLmxldmVsICE9PSAwID8gJ3N0aWNreScgOiBudWxsXCJcclxuICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUmVjb2lsICYmIHJvd05vZGUubGV2ZWwgIT09IDAgPyByb3dOb2RlLmxldmVsICogMzAgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJSaWdodF09XCJyb3dOb2RlLmxldmVsID09PSAwID8gJ25vbmUnIDogJydcIlxyXG4gICAgICAgICAgICBbc3R5bGUuYm9yZGVyTGVmdF09XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Tm9kZS5sZXZlbCA9PT0gMCAmJiBjb2wuZmllbGQgIT0gY29uZmlnLmNvbHVtbnNbMF0uZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbm9uZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHt7IGFsaWduKGNvbCkgfX1cIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwtaC1mdWxsIGZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiJGluZGV4ID09IDBcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHAtdHJlZVRhYmxlVG9nZ2xlciBjbGFzcz1cImhpZGRlblZpc2libGVcIiBbcm93Tm9kZV09XCJyb3dOb2RlXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgQGlmKGNvbmZpZy5lbmFibGVTZWxlY3QpIHtcclxuICAgICAgICAgICAgICA8cC10cmVlVGFibGVDaGVja2JveFxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZENoZWNrYm94KHJvd0RhdGEsIHJvd05vZGUpXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2ZUl0ZW1Mb3RlKHNlbGVjdGVkSXRlbXMpXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvd05vZGVcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogaXNTZWxlY3RFbmFibGVkKHJvd0RhdGEsIHJvd05vZGUpID8gJ2Jsb2NrJyA6ICdub25lJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmdpbi1sZWZ0JzogY29uZmlnLnZpc2libGVDaGVja2JveEZ1bmN0aW9uID8gJy0zNHB4JyA6ICcwcHgnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIEBpZiAoY29sLnRlbXBsYXRlICYmIHZhbGlkYXRlU2hvd1RlbXBsYXRlKHJvd05vZGUsIGNvbCkpIHtcclxuICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEN1c3RvbVRlbXBsYXRlKGNvbC50ZW1wbGF0ZS5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0Q3VzdG9tVGVtcGxhdGUoY29sLnRlbXBsYXRlLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvd0RhdGEgfVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZ2FwLTJcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEBpZihjb2wudGFnQ29sb3IpIHtcclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudG9vbHRpcFRhZyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudG9vbHRpcFRhZyhyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLnRhZ0NvbG9yKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuYm9vbGVhblwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwaSB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhW2NvbC5maWVsZF0gPyAncGktY2hlY2sgdGV4dC1ncmVlbi0zMDAnIDogJydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW1cIlxyXG4gICAgICAgICAgICAgICAgPjwvaT5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ0lmPVwiIWNvbC5ib29sZWFuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS0wIHRleHQteHNcIj57eyByb3dEYXRhW2NvbC5maWVsZF0gfX08L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImNvbC5zdWJ0aXRsZVwiIGNsYXNzPVwibS0wIHRleHQteHMgZm9udC1zZW1pYm9sZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHJvd0RhdGFbY29sLnN1YnRpdGxlXSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDx0ZFxyXG4gICAgICAgICAgICBzdHlsZT1cImJvcmRlci1sZWZ0OiBub25lOyB0ZXh0LWFsaWduOiBjZW50ZXJcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIihjb25maWcuYWN0aW9ucz8ubGVuZ3RoID8/IDAgPiAwKSB8fCBjb25maWcuYWN0aW9uc1BhaVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChjb25maWcuYWN0aW9ucz8ubGVuZ3RoID8/IDAgPiAwKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUFjdGlvblBvc2l0aW9uKHJvd05vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgY3Vyc29yLXBvaW50ZXIgaWNvbi1tb3JlLWhvcml6IHAtMVwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMjBweFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibWVudS50b2dnbGUoJGV2ZW50KTsgYWN0aXZlSXRlbShyb3dEYXRhKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICBtb3JlX2hvcml6XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIEBmb3IoYWN0aW9uIG9mIGNvbmZpZy5hY3Rpb25zOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAge3sgY3JpYXJNZW51c01vZGFsKHJvd0RhdGEpIH19XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIDxwLW1lbnVcclxuICAgICAgICAgICAgICAgICNtZW51XHJcbiAgICAgICAgICAgICAgICBbcG9wdXBdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbbW9kZWxdPVwibWVudUl0ZW1zXCJcclxuICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgID48L3AtbWVudT5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIEBpZihjb25maWcuYWN0aW9uc1BhaT8ubGVuZ3RoID8/IDAgPiAwICYmIHJvd05vZGUubGV2ZWwgPT0gMCl7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgIEBmb3IgKGFjdGlvblBhaSBvZiBjb25maWcuYWN0aW9uc1BhaTsgdHJhY2sgJGluZGV4KSB7IEBpZlxyXG4gICAgICAgICAgICAoZ2V0T3JFeGVjdXRlKGFjdGlvblBhaS52aXNpYmxlLCByb3dEYXRhKSA/PyB0cnVlKSB7XHJcbiAgICAgICAgICAgIDxrdi1idXR0b25cclxuICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImFjdGl2ZUl0ZW0ocm93RGF0YSk7IGFjdGlvblBhaS5jb21tYW5kKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cImFjdGlvblBhaS5pY29uXCJcclxuICAgICAgICAgICAgICAgIFtzZXZlcml0eV09XCJhY3Rpb25QYWkuc2V2ZXJpdHkgfHwgJ3RlcnRpYXJ5J1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIH0gfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgICAgfVxyXG5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGRcclxuICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjb25maWcuY29sdW1ucy5sZW5ndGggKyAxXCJcclxuICAgICAgICAgICAgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyB0ZXh0b0VtcHR5TWVzc2FnZSB9fVxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvcC10cmVlVGFibGU+XHJcbjwvZGl2PlxyXG4iXX0=
|