ngx-vector-components 5.106.0 → 5.107.1
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/CHANGELOG.md +17 -0
- package/esm2022/lib/components/fields/data-table/data-table.component.mjs +3 -3
- package/esm2022/lib/components/fields/filters/filters.component.mjs +3 -3
- package/esm2022/lib/models/profile.model.mjs +3 -1
- package/esm2022/lib/services/profile.service.mjs +3 -1
- package/fesm2022/ngx-vector-components.mjs +8 -4
- package/fesm2022/ngx-vector-components.mjs.map +1 -1
- package/lib/models/profile.model.d.ts +3 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [5.107.1] (27/06/2025)
|
|
4
|
+
|
|
5
|
+
### Fix
|
|
6
|
+
|
|
7
|
+
- Layout adjustments in `datatable.component.scss`
|
|
8
|
+
- Add round button in `datatable.component.ts`
|
|
9
|
+
- Add round and type options to button in `filters.component.ts`
|
|
10
|
+
|
|
11
|
+
## [5.107.0] (25/06/2025)
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
- Add 'regionalId' in `profile.service.ts`
|
|
16
|
+
- Add 'regionalUserList' in `profile.service.ts`
|
|
17
|
+
- Add 'SHOW_HEAT_MAP' ProfileModuleActionType in `profile.model.ts`
|
|
18
|
+
- Add 'SHOW_STATUS_MAP' ProfileModuleActionType in `profile.model.ts`
|
|
19
|
+
|
|
3
20
|
## [5.106.0] (23/06/2025)
|
|
4
21
|
|
|
5
22
|
### Features
|
|
@@ -336,11 +336,11 @@ export class DataTableComponent {
|
|
|
336
336
|
return active ? 'success' : 'error';
|
|
337
337
|
}
|
|
338
338
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataTableComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
339
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DataTableComponent, selector: "vector-data-table", inputs: { columns: "columns", data: "data", exportExcel: "exportExcel", exportPDF: "exportPDF", customFunction: "customFunction", totalRecords: "totalRecords", disabledHeadercheckbox: "disabledHeadercheckbox", filters: "filters", addItemLabel: "addItemLabel", pagination: "pagination", virtualPagination: "virtualPagination", tabs: "tabs", customButtons: "customButtons", addItemButtonPlusSign: "addItemButtonPlusSign", hasActions: "hasActions", hasExpandableIcon: "hasExpandableIcon", addNameColumnExpand: "addNameColumnExpand", expandable: "expandable", expansionTemplate: "expansionTemplate", selectionMode: "selectionMode", selectionType: "selectionType", height: "height", showLimitBalance: "showLimitBalance", showDataBalance: "showDataBalance", dataAccountBalance: "dataAccountBalance", firstLazyLoad: "firstLazyLoad", shouldLazyLoadWithoutFilter: "shouldLazyLoadWithoutFilter", reorderableColumns: "reorderableColumns" }, outputs: { onLazyLoad: "onLazyLoad", onFilter: "onFilter", onAdd: "onAdd", onExportExcel: "onExportExcel", onExportPDF: "onExportPDF", onSelectedRows: "onSelectedRows", onFilterChanged: "onFilterChanged", onTabSelected: "onTabSelected", onExpandRow: "onExpandRow" }, viewQueries: [{ propertyName: "filtersComponent", first: true, predicate: FiltersComponent, descendants: true, static: true }], ngImport: i0, template: "<div class=\"grid\">\r\n <div class=\"col-12\">\r\n <vector-filters\r\n [fields]=\"filters\"\r\n (onSearch)=\"lazyLoaded({ filter: true, data: $event })\"\r\n (formBuilded)=\"subscribeToFilterChanges()\"\r\n ></vector-filters>\r\n </div>\r\n <div class=\"table-header-actions field\" *ngIf=\"addItemLabel || exportExcel || exportPDF || customFunction\">\r\n <button *ngIf=\"exportExcel\" (click)=\"onExportExcel.emit()\" class=\"export-button export-excel\">\r\n <i class=\"fas fa-file-excel\"></i><span>Excel</span>\r\n </button>\r\n <button *ngIf=\"exportPDF\" (click)=\"onExportPDF.emit()\" class=\"export-button export-pdf\">\r\n <i class=\"fas fa-file-pdf\"></i><span>PDF</span>\r\n </button>\r\n <button\r\n *ngFor=\"let button of customFunction\"\r\n (click)=\"button.clickFunction()\"\r\n class=\"export-button custom-function\"\r\n >\r\n <i *ngIf=\"button?.icon\" class=\"{{ button?.icon }}\"></i><span>{{ button?.label }}</span>\r\n </button>\r\n\r\n <vector-button\r\n *ngFor=\"let button of customButtons\"\r\n class=\"add-item-button\"\r\n [label]=\"button.label\"\r\n (click)=\"button.clickFunction()\"\r\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\r\n ></vector-button>\r\n <vector-button\r\n *ngIf=\"addItemLabel\"\r\n class=\"add-item-button\"\r\n [label]=\"addItemLabel\"\r\n (click)=\"onAdd.emit()\"\r\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\r\n ></vector-button>\r\n </div>\r\n @if(showLimitBalance){\r\n <div class=\"col-12 grid ml-0\">\r\n @for (itemAccount of dataAccountBalance; track $index) { @if(itemAccount.visible){\r\n <div class=\"card balance-container\">\r\n <span class=\"card-header\">{{ itemAccount.name }}</span>\r\n <div class=\"card-content value-container\">\r\n <span>R$ </span>\r\n <span *ngIf=\"itemAccount.showBalance\" class=\"balance\">{{ balance(itemAccount) }}</span>\r\n <div class=\"hidden-balance\" *ngIf=\"!itemAccount.showBalance\"></div>\r\n <div class=\"icon-container\">\r\n <i\r\n class=\"fas\"\r\n [ngClass]=\"{ 'fa-eye': !itemAccount.showBalance, 'fa-eye-slash': itemAccount.showBalance }\"\r\n (click)=\"changeShowBalance(itemAccount)\"\r\n ></i>\r\n </div>\r\n </div>\r\n </div>\r\n } }\r\n </div>\r\n\r\n } @if(showDataBalance){\r\n <div class=\"col-12 grid ml-0\">\r\n @for (itemAccount of dataAccountBalance; track $index) {\r\n <div class=\"card balance-container\">\r\n <span class=\"card-header\">{{ itemAccount.name }}</span>\r\n <div class=\"card-content value-container\">\r\n <span class=\"balance\">{{ itemAccount.valueBalance }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n }\r\n\r\n <div class=\"col-12\">\r\n <vector-panel class=\"data-table-panel\">\r\n <p-tabView (onChange)=\"onTabChange($event)\" *ngIf=\"tabs?.length\">\r\n <p-tabPanel *ngFor=\"let tab of tabs\">\r\n <ng-template pTemplate=\"header\">\r\n <em *ngIf=\"tab.icon\" [class]=\"tab.icon\"> </em>\r\n <span>{{ tab.name }}</span>\r\n </ng-template>\r\n </p-tabPanel>\r\n </p-tabView>\r\n <p-table\r\n currentPageReportTemplate=\"Mostrando {first} at\u00E9 {last} de {totalRecords} registros\"\r\n sortMode=\"single\"\r\n [rows]=\"10\"\r\n [lazy]=\"pagination && !virtualPagination\"\r\n [value]=\"data\"\r\n [paginator]=\"pagination\"\r\n [totalRecords]=\"totalRecords\"\r\n [showCurrentPageReport]=\"true\"\r\n [rowsPerPageOptions]=\"[10, 25, 50, 100]\"\r\n [responsive]=\"true\"\r\n [resizableColumns]=\"true\"\r\n [scrollable]=\"true\"\r\n scrollDirection=\"vertical\"\r\n responsiveLayout=\"scroll\"\r\n dataKey=\"id\"\r\n [scrollHeight]=\"height\"\r\n [attr.selectionMode]=\"selectionMode\"\r\n [(selection)]=\"selectedItems\"\r\n (onRowSelect)=\"changeSelectedItems($event)\"\r\n (onHeaderCheckboxToggle)=\"changeSelectedItems($event)\"\r\n (onRowUnselect)=\"changeSelectedItems($event)\"\r\n (onLazyLoad)=\"lazyLoaded({ filter: false, data: $event })\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [reorderableColumns]=\"reorderableColumns\"\r\n >\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"header\">\r\n <th *ngIf=\"reorderableColumns\" style=\"width: 5rem\"></th>\r\n\r\n <th *ngIf=\"selectionType === 'checkbox'\">\r\n <p-tableHeaderCheckbox [disabled]=\"disabledHeadercheckbox\"></p-tableHeaderCheckbox>\r\n </th>\r\n <th class=\"text-center\" *ngIf=\"hasExpandableIcon\">\r\n {{ addNameColumnExpand }}\r\n </th>\r\n <th *ngIf=\"hasActions\">{{ 'app.label.actions' | translate }}</th>\r\n <th *ngIf=\"selectionType === 'radiobutton'\">\r\n <div class=\"flex align-items-center\">\r\n <span></span>\r\n </div>\r\n </th>\r\n <th\r\n *ngFor=\"let col of columns\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n [pSortableColumn]=\"col.notSortable ? '' : col.field\"\r\n pReorderableColumn\r\n >\r\n <div class=\"flex align-items-center\">\r\n <span>{{ col.header }}</span> <p-sortIcon *ngIf=\"!col.notSortable\" [field]=\"col.field\"></p-sortIcon>\r\n </div>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-item let-expanded=\"expanded\" let-index=\"rowIndex\">\r\n <tr\r\n class=\"row\"\r\n [pSelectableRow]=\"rowData\"\r\n [ngClass]=\"{ expandable: expandable }\"\r\n [pRowToggler]=\"expandable ? item : undefined\"\r\n (click)=\"onRowClick(item)\"\r\n [pReorderableRow]=\"index\"\r\n >\r\n <ng-container *ngIf=\"reorderableColumns\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectionType === 'checkbox'\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <p-tableCheckbox [value]=\"item\" [disabled]=\"item.disabledCheckBox\"></p-tableCheckbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectionType === 'radiobutton'\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"hasExpandableIcon\" style=\"max-width: 150px\" class=\"centered\">\r\n <p-menu #menu [model]=\"item.actions\" [popup]=\"true\" appendTo=\"body\"></p-menu>\r\n <i\r\n [ngClass]=\"\r\n expanded ? 'actions-menu-button pi pi-chevron-down' : 'actions-menu-button pi pi-chevron-right'\r\n \"\r\n ></i>\r\n </td>\r\n <td *ngIf=\"hasActions\">\r\n <p-menu #menu [model]=\"item.actions\" [popup]=\"true\" appendTo=\"body\"></p-menu>\r\n <i class=\"actions-menu-button fas fa-cog\" (click)=\"menu.toggle($event)\"></i>\r\n </td>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <td\r\n *ngIf=\"isHtmlCell(col)\"\r\n class=\"cell\"\r\n [innerHTML]=\"getCellContent(item, col)\"\r\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n ></td>\r\n <td\r\n *ngIf=\"(!isHtmlCell(col) && !!col.getStatus) || isScoreCell(col)\"\r\n class=\"cell\"\r\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n >\r\n <vector-badge\r\n *ngIf=\"isBadgeCell(col)\"\r\n [label]=\"getCellText(item, col)\"\r\n [type]=\"col.getStatus && col.getStatus(item[col.field])\"\r\n [tooltip]=\"getTooltipText(item, col)\"\r\n ></vector-badge>\r\n <vector-score *ngIf=\"isScoreCell(col)\" [score]=\"item[col.field]\"></vector-score>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"row\">\r\n <td class=\"no-results\" [attr.colspan]=\"columns.length + 1\">Nenhum resultado encontrado</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"paginatorright\"> </ng-template>\r\n <ng-template let-item pTemplate=\"paginatordropdownitem\"> {{ item.value }} </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-item>\r\n <tr>\r\n <td [attr.colspan]=\"columns.length + (hasActions ? 1 : 0)\">\r\n <ng-container *ngTemplateOutlet=\"expansionTemplate; context: { item }\"> </ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </vector-panel>\r\n </div>\r\n</div>\r\n", styles: [".no-results{padding:15px;background-color:#fff;width:100%}.centered{display:flex;justify-content:center}.table-header-actions{display:flex;justify-content:flex-end;align-items:flex-end;width:100%;padding-right:7px;margin-bottom:15px!important}@media (min-width: 768px){.table-header-actions{margin-top:-3px}}.table-header-actions .export-button{padding:7px 10px;color:#fff;display:flex;align-items:center;border:none;border-radius:5px;margin:5px;font-size:.75rem;cursor:pointer}.table-header-actions .export-button.export-excel{background-color:var(--success-color)}.table-header-actions .export-button.export-excel:hover{background-color:var(--success-color-dark)}.table-header-actions .export-button.export-pdf{background-color:var(--error-color)}.table-header-actions .export-button.export-pdf:hover{background-color:var(--error-color-dark)}.table-header-actions .export-button.custom-function{background-color:var(--theme-primary)}.table-header-actions .export-button.custom-function:hover{background-color:var(--theme-medium)}.table-header-actions .export-button i{color:#fff}.table-header-actions .export-button span{margin-left:5px}.table-header-actions .add-item-button{margin-left:10px}.actions-menu-button{font-size:23px;cursor:pointer;color:var(--theme-medium)}.expandable{cursor:pointer}.balance-container{display:flex;flex-direction:column;width:20%;padding:0;margin-bottom:30px;top:30px;right:40px;border-radius:8px;margin-right:15px}.balance-container .header-right{flex:1;flex-direction:row;justify-content:flex-end;display:flex}@media screen and (max-width: 1450px){.balance-container{width:40%}}@media screen and (max-width: 960px){.balance-container{position:relative;width:80%;top:auto;right:auto}}.balance-container .card-header{color:var(--theme-medium);border-radius:9px 9px 0 0;padding:10px 10px 2px;font-weight:500;font-size:13px;line-height:17px;letter-spacing:.25px}.balance-container .value-container{display:flex;flex-direction:row;align-items:center;padding:0 10px 5px}.balance-container .value-container span{font-size:2em;font-weight:700;color:var(--theme-secondary)}@media screen and (max-width: 640px){.balance-container .value-container span{font-size:1.6em}}.balance-container .value-container .balance{margin-left:8px;width:70%}.balance-container .value-container .hidden-balance{background-color:var(--gray-lighter);padding:15px;margin-left:8px;width:70%;height:100%}.balance-container .value-container .icon-container{display:flex;flex:1;justify-content:center;align-items:center}.balance-container .value-container .icon-container i{cursor:pointer;font-size:2em;padding-top:2px;color:var(--theme-medium)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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: "component", type: i3.PanelComponent, selector: "vector-panel" }, { kind: "component", type: i4.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i4.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: i5.BadgeComponent, selector: "vector-badge", inputs: ["type", "label", "customColor", "customBackgroundColor", "tooltip"] }, { kind: "component", type: i6.ScoreComponent, selector: "vector-score", inputs: ["score"] }, { kind: "component", type: i7.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i8.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i8.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i8.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i8.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i8.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i8.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i8.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i8.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i8.ReorderableRowHandle, selector: "[pReorderableRowHandle]" }, { kind: "directive", type: i8.ReorderableRow, selector: "[pReorderableRow]", inputs: ["pReorderableRow", "pReorderableRowDisabled"] }, { kind: "component", type: i9.ButtonComponent, selector: "vector-button", inputs: ["disabled", "label", "type", "leftIcon", "rightIcon", "noShadow", "round", "style", "loading"], outputs: ["onClick"] }, { kind: "component", type: i10.FiltersComponent, selector: "vector-filters", inputs: ["fields"], outputs: ["onSearch", "formBuilded"] }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }] }); }
|
|
339
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DataTableComponent, selector: "vector-data-table", inputs: { columns: "columns", data: "data", exportExcel: "exportExcel", exportPDF: "exportPDF", customFunction: "customFunction", totalRecords: "totalRecords", disabledHeadercheckbox: "disabledHeadercheckbox", filters: "filters", addItemLabel: "addItemLabel", pagination: "pagination", virtualPagination: "virtualPagination", tabs: "tabs", customButtons: "customButtons", addItemButtonPlusSign: "addItemButtonPlusSign", hasActions: "hasActions", hasExpandableIcon: "hasExpandableIcon", addNameColumnExpand: "addNameColumnExpand", expandable: "expandable", expansionTemplate: "expansionTemplate", selectionMode: "selectionMode", selectionType: "selectionType", height: "height", showLimitBalance: "showLimitBalance", showDataBalance: "showDataBalance", dataAccountBalance: "dataAccountBalance", firstLazyLoad: "firstLazyLoad", shouldLazyLoadWithoutFilter: "shouldLazyLoadWithoutFilter", reorderableColumns: "reorderableColumns" }, outputs: { onLazyLoad: "onLazyLoad", onFilter: "onFilter", onAdd: "onAdd", onExportExcel: "onExportExcel", onExportPDF: "onExportPDF", onSelectedRows: "onSelectedRows", onFilterChanged: "onFilterChanged", onTabSelected: "onTabSelected", onExpandRow: "onExpandRow" }, viewQueries: [{ propertyName: "filtersComponent", first: true, predicate: FiltersComponent, descendants: true, static: true }], ngImport: i0, template: "<div class=\"grid\">\r\n <div class=\"col-12\">\r\n <vector-filters\r\n [fields]=\"filters\"\r\n (onSearch)=\"lazyLoaded({ filter: true, data: $event })\"\r\n (formBuilded)=\"subscribeToFilterChanges()\"\r\n ></vector-filters>\r\n </div>\r\n <div class=\"table-header-actions field\" *ngIf=\"addItemLabel || exportExcel || exportPDF || customFunction\">\r\n <button *ngIf=\"exportExcel\" (click)=\"onExportExcel.emit()\" class=\"export-button export-excel\">\r\n <i class=\"fas fa-file-excel\"></i><span>Excel</span>\r\n </button>\r\n <button *ngIf=\"exportPDF\" (click)=\"onExportPDF.emit()\" class=\"export-button export-pdf\">\r\n <i class=\"fas fa-file-pdf\"></i><span>PDF</span>\r\n </button>\r\n <button\r\n *ngFor=\"let button of customFunction\"\r\n (click)=\"button.clickFunction()\"\r\n class=\"export-button custom-function\"\r\n >\r\n <i *ngIf=\"button?.icon\" class=\"{{ button?.icon }}\"></i><span>{{ button?.label }}</span>\r\n </button>\r\n\r\n <vector-button\r\n *ngFor=\"let button of customButtons\"\r\n class=\"add-item-button\"\r\n [round]=\"true\"\r\n [label]=\"button.label\"\r\n (click)=\"button.clickFunction()\"\r\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\r\n ></vector-button>\r\n <vector-button\r\n *ngIf=\"addItemLabel\"\r\n class=\"add-item-button\"\r\n [label]=\"addItemLabel\"\r\n (click)=\"onAdd.emit()\"\r\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\r\n [round]=\"true\"\r\n ></vector-button>\r\n </div>\r\n @if(showLimitBalance){\r\n <div class=\"col-12 grid ml-0\">\r\n @for (itemAccount of dataAccountBalance; track $index) { @if(itemAccount.visible){\r\n <div class=\"card balance-container\">\r\n <span class=\"card-header\">{{ itemAccount.name }}</span>\r\n <div class=\"card-content value-container\">\r\n <span>R$ </span>\r\n <span *ngIf=\"itemAccount.showBalance\" class=\"balance\">{{ balance(itemAccount) }}</span>\r\n <div class=\"hidden-balance\" *ngIf=\"!itemAccount.showBalance\"></div>\r\n <div class=\"icon-container\">\r\n <i\r\n class=\"fas\"\r\n [ngClass]=\"{ 'fa-eye': !itemAccount.showBalance, 'fa-eye-slash': itemAccount.showBalance }\"\r\n (click)=\"changeShowBalance(itemAccount)\"\r\n ></i>\r\n </div>\r\n </div>\r\n </div>\r\n } }\r\n </div>\r\n\r\n } @if(showDataBalance){\r\n <div class=\"col-12 grid ml-0\">\r\n @for (itemAccount of dataAccountBalance; track $index) {\r\n <div class=\"card balance-container\">\r\n <span class=\"card-header\">{{ itemAccount.name }}</span>\r\n <div class=\"card-content value-container\">\r\n <span class=\"balance\">{{ itemAccount.valueBalance }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n }\r\n\r\n <div class=\"col-12\">\r\n <vector-panel class=\"data-table-panel\">\r\n <p-tabView (onChange)=\"onTabChange($event)\" *ngIf=\"tabs?.length\">\r\n <p-tabPanel *ngFor=\"let tab of tabs\">\r\n <ng-template pTemplate=\"header\">\r\n <em *ngIf=\"tab.icon\" [class]=\"tab.icon\"> </em>\r\n <span>{{ tab.name }}</span>\r\n </ng-template>\r\n </p-tabPanel>\r\n </p-tabView>\r\n <p-table\r\n currentPageReportTemplate=\"Mostrando {first} at\u00E9 {last} de {totalRecords} registros\"\r\n sortMode=\"single\"\r\n [rows]=\"10\"\r\n [lazy]=\"pagination && !virtualPagination\"\r\n [value]=\"data\"\r\n [paginator]=\"pagination\"\r\n [totalRecords]=\"totalRecords\"\r\n [showCurrentPageReport]=\"true\"\r\n [rowsPerPageOptions]=\"[10, 25, 50, 100]\"\r\n [responsive]=\"true\"\r\n [resizableColumns]=\"true\"\r\n [scrollable]=\"true\"\r\n scrollDirection=\"vertical\"\r\n responsiveLayout=\"scroll\"\r\n dataKey=\"id\"\r\n [scrollHeight]=\"height\"\r\n [attr.selectionMode]=\"selectionMode\"\r\n [(selection)]=\"selectedItems\"\r\n (onRowSelect)=\"changeSelectedItems($event)\"\r\n (onHeaderCheckboxToggle)=\"changeSelectedItems($event)\"\r\n (onRowUnselect)=\"changeSelectedItems($event)\"\r\n (onLazyLoad)=\"lazyLoaded({ filter: false, data: $event })\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [reorderableColumns]=\"reorderableColumns\"\r\n >\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"header\">\r\n <th *ngIf=\"reorderableColumns\" style=\"width: 5rem\"></th>\r\n\r\n <th *ngIf=\"selectionType === 'checkbox'\">\r\n <p-tableHeaderCheckbox [disabled]=\"disabledHeadercheckbox\"></p-tableHeaderCheckbox>\r\n </th>\r\n <th class=\"text-center\" *ngIf=\"hasExpandableIcon\">\r\n {{ addNameColumnExpand }}\r\n </th>\r\n <th *ngIf=\"hasActions\">{{ 'app.label.actions' | translate }}</th>\r\n <th *ngIf=\"selectionType === 'radiobutton'\">\r\n <div class=\"flex align-items-center\">\r\n <span></span>\r\n </div>\r\n </th>\r\n <th\r\n *ngFor=\"let col of columns\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n [pSortableColumn]=\"col.notSortable ? '' : col.field\"\r\n pReorderableColumn\r\n >\r\n <div class=\"flex align-items-center\">\r\n <span>{{ col.header }}</span> <p-sortIcon *ngIf=\"!col.notSortable\" [field]=\"col.field\"></p-sortIcon>\r\n </div>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-item let-expanded=\"expanded\" let-index=\"rowIndex\">\r\n <tr\r\n class=\"row\"\r\n [pSelectableRow]=\"rowData\"\r\n [ngClass]=\"{ expandable: expandable }\"\r\n [pRowToggler]=\"expandable ? item : undefined\"\r\n (click)=\"onRowClick(item)\"\r\n [pReorderableRow]=\"index\"\r\n >\r\n <ng-container *ngIf=\"reorderableColumns\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectionType === 'checkbox'\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <p-tableCheckbox [value]=\"item\" [disabled]=\"item.disabledCheckBox\"></p-tableCheckbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectionType === 'radiobutton'\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"hasExpandableIcon\" style=\"max-width: 150px\" class=\"centered\">\r\n <p-menu #menu [model]=\"item.actions\" [popup]=\"true\" appendTo=\"body\"></p-menu>\r\n <i\r\n [ngClass]=\"\r\n expanded ? 'actions-menu-button pi pi-chevron-down' : 'actions-menu-button pi pi-chevron-right'\r\n \"\r\n ></i>\r\n </td>\r\n <td *ngIf=\"hasActions\">\r\n <p-menu #menu [model]=\"item.actions\" [popup]=\"true\" appendTo=\"body\"></p-menu>\r\n <i class=\"actions-menu-button fas fa-cog\" (click)=\"menu.toggle($event)\"></i>\r\n </td>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <td\r\n *ngIf=\"isHtmlCell(col)\"\r\n class=\"cell\"\r\n [innerHTML]=\"getCellContent(item, col)\"\r\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n ></td>\r\n <td\r\n *ngIf=\"(!isHtmlCell(col) && !!col.getStatus) || isScoreCell(col)\"\r\n class=\"cell\"\r\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n >\r\n <vector-badge\r\n *ngIf=\"isBadgeCell(col)\"\r\n [label]=\"getCellText(item, col)\"\r\n [type]=\"col.getStatus && col.getStatus(item[col.field])\"\r\n [tooltip]=\"getTooltipText(item, col)\"\r\n ></vector-badge>\r\n <vector-score *ngIf=\"isScoreCell(col)\" [score]=\"item[col.field]\"></vector-score>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"row\">\r\n <td class=\"no-results\" [attr.colspan]=\"columns.length + 1\">Nenhum resultado encontrado</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"paginatorright\"> </ng-template>\r\n <ng-template let-item pTemplate=\"paginatordropdownitem\"> {{ item.value }} </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-item>\r\n <tr>\r\n <td [attr.colspan]=\"columns.length + (hasActions ? 1 : 0)\">\r\n <ng-container *ngTemplateOutlet=\"expansionTemplate; context: { item }\"> </ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </vector-panel>\r\n </div>\r\n</div>\r\n", styles: [".no-results{padding:15px;background-color:#fff;width:100%}.centered{display:flex;justify-content:center}.table-header-actions{display:flex;justify-content:flex-end;align-items:flex-end;width:100%;padding-right:7px;margin-bottom:15px!important}@media (min-width: 768px){.table-header-actions{margin-top:-3px}}.table-header-actions .export-button{padding:7px 10px;color:#fff;display:flex;align-items:center;border:none;border-radius:5px;margin:5px;font-size:.75rem;cursor:pointer}.table-header-actions .export-button.export-excel{background-color:var(--success-color)}.table-header-actions .export-button.export-excel:hover{background-color:var(--success-color-dark)}.table-header-actions .export-button.export-pdf{background-color:var(--error-color)}.table-header-actions .export-button.export-pdf:hover{background-color:var(--error-color-dark)}.table-header-actions .export-button.custom-function{background-color:var(--theme-primary)}.table-header-actions .export-button.custom-function:hover{background-color:var(--theme-medium)}.table-header-actions .export-button i{color:#fff}.table-header-actions .export-button span{margin-left:5px}.table-header-actions .add-item-button{margin-left:10px}.actions-menu-button{font-size:23px;cursor:pointer;color:var(--theme-medium)}.expandable{cursor:pointer}.balance-container{display:flex;flex-direction:column;min-width:13%;padding:0;margin-bottom:30px;top:30px;right:40px;border-radius:8px;margin-right:15px}.balance-container .header-right{flex:1;flex-direction:row;justify-content:flex-end;display:flex}@media screen and (max-width: 1450px){.balance-container{width:40%}}@media screen and (max-width: 960px){.balance-container{position:relative;width:80%;top:auto;right:auto}}.balance-container .card-header{color:var(--theme-medium);border-radius:9px 9px 0 0;padding:10px 10px 2px;font-weight:500;font-size:13px;line-height:17px;letter-spacing:.25px}.balance-container .value-container{display:flex;flex-direction:row;align-items:center;padding:0 10px 5px}.balance-container .value-container span{font-size:2em;font-weight:700;color:var(--theme-secondary)}@media screen and (max-width: 640px){.balance-container .value-container span{font-size:1.6em}}.balance-container .value-container .balance{margin-left:8px;width:70%}.balance-container .value-container .hidden-balance{background-color:var(--gray-lighter);padding:15px;margin-left:8px;width:70%;height:100%}.balance-container .value-container .icon-container{display:flex;flex:1;justify-content:center;align-items:center}.balance-container .value-container .icon-container i{cursor:pointer;font-size:2em;padding-top:2px;color:var(--theme-medium)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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: "component", type: i3.PanelComponent, selector: "vector-panel" }, { kind: "component", type: i4.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i4.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: i5.BadgeComponent, selector: "vector-badge", inputs: ["type", "label", "customColor", "customBackgroundColor", "tooltip"] }, { kind: "component", type: i6.ScoreComponent, selector: "vector-score", inputs: ["score"] }, { kind: "component", type: i7.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i8.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i8.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i8.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i8.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i8.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i8.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i8.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i8.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i8.ReorderableRowHandle, selector: "[pReorderableRowHandle]" }, { kind: "directive", type: i8.ReorderableRow, selector: "[pReorderableRow]", inputs: ["pReorderableRow", "pReorderableRowDisabled"] }, { kind: "component", type: i9.ButtonComponent, selector: "vector-button", inputs: ["disabled", "label", "type", "leftIcon", "rightIcon", "noShadow", "round", "style", "loading"], outputs: ["onClick"] }, { kind: "component", type: i10.FiltersComponent, selector: "vector-filters", inputs: ["fields"], outputs: ["onSearch", "formBuilded"] }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }] }); }
|
|
340
340
|
}
|
|
341
341
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataTableComponent, decorators: [{
|
|
342
342
|
type: Component,
|
|
343
|
-
args: [{ selector: 'vector-data-table', template: "<div class=\"grid\">\r\n <div class=\"col-12\">\r\n <vector-filters\r\n [fields]=\"filters\"\r\n (onSearch)=\"lazyLoaded({ filter: true, data: $event })\"\r\n (formBuilded)=\"subscribeToFilterChanges()\"\r\n ></vector-filters>\r\n </div>\r\n <div class=\"table-header-actions field\" *ngIf=\"addItemLabel || exportExcel || exportPDF || customFunction\">\r\n <button *ngIf=\"exportExcel\" (click)=\"onExportExcel.emit()\" class=\"export-button export-excel\">\r\n <i class=\"fas fa-file-excel\"></i><span>Excel</span>\r\n </button>\r\n <button *ngIf=\"exportPDF\" (click)=\"onExportPDF.emit()\" class=\"export-button export-pdf\">\r\n <i class=\"fas fa-file-pdf\"></i><span>PDF</span>\r\n </button>\r\n <button\r\n *ngFor=\"let button of customFunction\"\r\n (click)=\"button.clickFunction()\"\r\n class=\"export-button custom-function\"\r\n >\r\n <i *ngIf=\"button?.icon\" class=\"{{ button?.icon }}\"></i><span>{{ button?.label }}</span>\r\n </button>\r\n\r\n <vector-button\r\n *ngFor=\"let button of customButtons\"\r\n class=\"add-item-button\"\r\n [label]=\"button.label\"\r\n (click)=\"button.clickFunction()\"\r\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\r\n ></vector-button>\r\n <vector-button\r\n *ngIf=\"addItemLabel\"\r\n class=\"add-item-button\"\r\n [label]=\"addItemLabel\"\r\n (click)=\"onAdd.emit()\"\r\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\r\n ></vector-button>\r\n </div>\r\n @if(showLimitBalance){\r\n <div class=\"col-12 grid ml-0\">\r\n @for (itemAccount of dataAccountBalance; track $index) { @if(itemAccount.visible){\r\n <div class=\"card balance-container\">\r\n <span class=\"card-header\">{{ itemAccount.name }}</span>\r\n <div class=\"card-content value-container\">\r\n <span>R$ </span>\r\n <span *ngIf=\"itemAccount.showBalance\" class=\"balance\">{{ balance(itemAccount) }}</span>\r\n <div class=\"hidden-balance\" *ngIf=\"!itemAccount.showBalance\"></div>\r\n <div class=\"icon-container\">\r\n <i\r\n class=\"fas\"\r\n [ngClass]=\"{ 'fa-eye': !itemAccount.showBalance, 'fa-eye-slash': itemAccount.showBalance }\"\r\n (click)=\"changeShowBalance(itemAccount)\"\r\n ></i>\r\n </div>\r\n </div>\r\n </div>\r\n } }\r\n </div>\r\n\r\n } @if(showDataBalance){\r\n <div class=\"col-12 grid ml-0\">\r\n @for (itemAccount of dataAccountBalance; track $index) {\r\n <div class=\"card balance-container\">\r\n <span class=\"card-header\">{{ itemAccount.name }}</span>\r\n <div class=\"card-content value-container\">\r\n <span class=\"balance\">{{ itemAccount.valueBalance }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n }\r\n\r\n <div class=\"col-12\">\r\n <vector-panel class=\"data-table-panel\">\r\n <p-tabView (onChange)=\"onTabChange($event)\" *ngIf=\"tabs?.length\">\r\n <p-tabPanel *ngFor=\"let tab of tabs\">\r\n <ng-template pTemplate=\"header\">\r\n <em *ngIf=\"tab.icon\" [class]=\"tab.icon\"> </em>\r\n <span>{{ tab.name }}</span>\r\n </ng-template>\r\n </p-tabPanel>\r\n </p-tabView>\r\n <p-table\r\n currentPageReportTemplate=\"Mostrando {first} at\u00E9 {last} de {totalRecords} registros\"\r\n sortMode=\"single\"\r\n [rows]=\"10\"\r\n [lazy]=\"pagination && !virtualPagination\"\r\n [value]=\"data\"\r\n [paginator]=\"pagination\"\r\n [totalRecords]=\"totalRecords\"\r\n [showCurrentPageReport]=\"true\"\r\n [rowsPerPageOptions]=\"[10, 25, 50, 100]\"\r\n [responsive]=\"true\"\r\n [resizableColumns]=\"true\"\r\n [scrollable]=\"true\"\r\n scrollDirection=\"vertical\"\r\n responsiveLayout=\"scroll\"\r\n dataKey=\"id\"\r\n [scrollHeight]=\"height\"\r\n [attr.selectionMode]=\"selectionMode\"\r\n [(selection)]=\"selectedItems\"\r\n (onRowSelect)=\"changeSelectedItems($event)\"\r\n (onHeaderCheckboxToggle)=\"changeSelectedItems($event)\"\r\n (onRowUnselect)=\"changeSelectedItems($event)\"\r\n (onLazyLoad)=\"lazyLoaded({ filter: false, data: $event })\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [reorderableColumns]=\"reorderableColumns\"\r\n >\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"header\">\r\n <th *ngIf=\"reorderableColumns\" style=\"width: 5rem\"></th>\r\n\r\n <th *ngIf=\"selectionType === 'checkbox'\">\r\n <p-tableHeaderCheckbox [disabled]=\"disabledHeadercheckbox\"></p-tableHeaderCheckbox>\r\n </th>\r\n <th class=\"text-center\" *ngIf=\"hasExpandableIcon\">\r\n {{ addNameColumnExpand }}\r\n </th>\r\n <th *ngIf=\"hasActions\">{{ 'app.label.actions' | translate }}</th>\r\n <th *ngIf=\"selectionType === 'radiobutton'\">\r\n <div class=\"flex align-items-center\">\r\n <span></span>\r\n </div>\r\n </th>\r\n <th\r\n *ngFor=\"let col of columns\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n [pSortableColumn]=\"col.notSortable ? '' : col.field\"\r\n pReorderableColumn\r\n >\r\n <div class=\"flex align-items-center\">\r\n <span>{{ col.header }}</span> <p-sortIcon *ngIf=\"!col.notSortable\" [field]=\"col.field\"></p-sortIcon>\r\n </div>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-item let-expanded=\"expanded\" let-index=\"rowIndex\">\r\n <tr\r\n class=\"row\"\r\n [pSelectableRow]=\"rowData\"\r\n [ngClass]=\"{ expandable: expandable }\"\r\n [pRowToggler]=\"expandable ? item : undefined\"\r\n (click)=\"onRowClick(item)\"\r\n [pReorderableRow]=\"index\"\r\n >\r\n <ng-container *ngIf=\"reorderableColumns\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectionType === 'checkbox'\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <p-tableCheckbox [value]=\"item\" [disabled]=\"item.disabledCheckBox\"></p-tableCheckbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectionType === 'radiobutton'\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"hasExpandableIcon\" style=\"max-width: 150px\" class=\"centered\">\r\n <p-menu #menu [model]=\"item.actions\" [popup]=\"true\" appendTo=\"body\"></p-menu>\r\n <i\r\n [ngClass]=\"\r\n expanded ? 'actions-menu-button pi pi-chevron-down' : 'actions-menu-button pi pi-chevron-right'\r\n \"\r\n ></i>\r\n </td>\r\n <td *ngIf=\"hasActions\">\r\n <p-menu #menu [model]=\"item.actions\" [popup]=\"true\" appendTo=\"body\"></p-menu>\r\n <i class=\"actions-menu-button fas fa-cog\" (click)=\"menu.toggle($event)\"></i>\r\n </td>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <td\r\n *ngIf=\"isHtmlCell(col)\"\r\n class=\"cell\"\r\n [innerHTML]=\"getCellContent(item, col)\"\r\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n ></td>\r\n <td\r\n *ngIf=\"(!isHtmlCell(col) && !!col.getStatus) || isScoreCell(col)\"\r\n class=\"cell\"\r\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n >\r\n <vector-badge\r\n *ngIf=\"isBadgeCell(col)\"\r\n [label]=\"getCellText(item, col)\"\r\n [type]=\"col.getStatus && col.getStatus(item[col.field])\"\r\n [tooltip]=\"getTooltipText(item, col)\"\r\n ></vector-badge>\r\n <vector-score *ngIf=\"isScoreCell(col)\" [score]=\"item[col.field]\"></vector-score>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"row\">\r\n <td class=\"no-results\" [attr.colspan]=\"columns.length + 1\">Nenhum resultado encontrado</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"paginatorright\"> </ng-template>\r\n <ng-template let-item pTemplate=\"paginatordropdownitem\"> {{ item.value }} </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-item>\r\n <tr>\r\n <td [attr.colspan]=\"columns.length + (hasActions ? 1 : 0)\">\r\n <ng-container *ngTemplateOutlet=\"expansionTemplate; context: { item }\"> </ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </vector-panel>\r\n </div>\r\n</div>\r\n", styles: [".no-results{padding:15px;background-color:#fff;width:100%}.centered{display:flex;justify-content:center}.table-header-actions{display:flex;justify-content:flex-end;align-items:flex-end;width:100%;padding-right:7px;margin-bottom:15px!important}@media (min-width: 768px){.table-header-actions{margin-top:-3px}}.table-header-actions .export-button{padding:7px 10px;color:#fff;display:flex;align-items:center;border:none;border-radius:5px;margin:5px;font-size:.75rem;cursor:pointer}.table-header-actions .export-button.export-excel{background-color:var(--success-color)}.table-header-actions .export-button.export-excel:hover{background-color:var(--success-color-dark)}.table-header-actions .export-button.export-pdf{background-color:var(--error-color)}.table-header-actions .export-button.export-pdf:hover{background-color:var(--error-color-dark)}.table-header-actions .export-button.custom-function{background-color:var(--theme-primary)}.table-header-actions .export-button.custom-function:hover{background-color:var(--theme-medium)}.table-header-actions .export-button i{color:#fff}.table-header-actions .export-button span{margin-left:5px}.table-header-actions .add-item-button{margin-left:10px}.actions-menu-button{font-size:23px;cursor:pointer;color:var(--theme-medium)}.expandable{cursor:pointer}.balance-container{display:flex;flex-direction:column;width:20%;padding:0;margin-bottom:30px;top:30px;right:40px;border-radius:8px;margin-right:15px}.balance-container .header-right{flex:1;flex-direction:row;justify-content:flex-end;display:flex}@media screen and (max-width: 1450px){.balance-container{width:40%}}@media screen and (max-width: 960px){.balance-container{position:relative;width:80%;top:auto;right:auto}}.balance-container .card-header{color:var(--theme-medium);border-radius:9px 9px 0 0;padding:10px 10px 2px;font-weight:500;font-size:13px;line-height:17px;letter-spacing:.25px}.balance-container .value-container{display:flex;flex-direction:row;align-items:center;padding:0 10px 5px}.balance-container .value-container span{font-size:2em;font-weight:700;color:var(--theme-secondary)}@media screen and (max-width: 640px){.balance-container .value-container span{font-size:1.6em}}.balance-container .value-container .balance{margin-left:8px;width:70%}.balance-container .value-container .hidden-balance{background-color:var(--gray-lighter);padding:15px;margin-left:8px;width:70%;height:100%}.balance-container .value-container .icon-container{display:flex;flex:1;justify-content:center;align-items:center}.balance-container .value-container .icon-container i{cursor:pointer;font-size:2em;padding-top:2px;color:var(--theme-medium)}\n"] }]
|
|
343
|
+
args: [{ selector: 'vector-data-table', template: "<div class=\"grid\">\r\n <div class=\"col-12\">\r\n <vector-filters\r\n [fields]=\"filters\"\r\n (onSearch)=\"lazyLoaded({ filter: true, data: $event })\"\r\n (formBuilded)=\"subscribeToFilterChanges()\"\r\n ></vector-filters>\r\n </div>\r\n <div class=\"table-header-actions field\" *ngIf=\"addItemLabel || exportExcel || exportPDF || customFunction\">\r\n <button *ngIf=\"exportExcel\" (click)=\"onExportExcel.emit()\" class=\"export-button export-excel\">\r\n <i class=\"fas fa-file-excel\"></i><span>Excel</span>\r\n </button>\r\n <button *ngIf=\"exportPDF\" (click)=\"onExportPDF.emit()\" class=\"export-button export-pdf\">\r\n <i class=\"fas fa-file-pdf\"></i><span>PDF</span>\r\n </button>\r\n <button\r\n *ngFor=\"let button of customFunction\"\r\n (click)=\"button.clickFunction()\"\r\n class=\"export-button custom-function\"\r\n >\r\n <i *ngIf=\"button?.icon\" class=\"{{ button?.icon }}\"></i><span>{{ button?.label }}</span>\r\n </button>\r\n\r\n <vector-button\r\n *ngFor=\"let button of customButtons\"\r\n class=\"add-item-button\"\r\n [round]=\"true\"\r\n [label]=\"button.label\"\r\n (click)=\"button.clickFunction()\"\r\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\r\n ></vector-button>\r\n <vector-button\r\n *ngIf=\"addItemLabel\"\r\n class=\"add-item-button\"\r\n [label]=\"addItemLabel\"\r\n (click)=\"onAdd.emit()\"\r\n [rightIcon]=\"addItemButtonPlusSign ? 'pi pi-plus' : ''\"\r\n [round]=\"true\"\r\n ></vector-button>\r\n </div>\r\n @if(showLimitBalance){\r\n <div class=\"col-12 grid ml-0\">\r\n @for (itemAccount of dataAccountBalance; track $index) { @if(itemAccount.visible){\r\n <div class=\"card balance-container\">\r\n <span class=\"card-header\">{{ itemAccount.name }}</span>\r\n <div class=\"card-content value-container\">\r\n <span>R$ </span>\r\n <span *ngIf=\"itemAccount.showBalance\" class=\"balance\">{{ balance(itemAccount) }}</span>\r\n <div class=\"hidden-balance\" *ngIf=\"!itemAccount.showBalance\"></div>\r\n <div class=\"icon-container\">\r\n <i\r\n class=\"fas\"\r\n [ngClass]=\"{ 'fa-eye': !itemAccount.showBalance, 'fa-eye-slash': itemAccount.showBalance }\"\r\n (click)=\"changeShowBalance(itemAccount)\"\r\n ></i>\r\n </div>\r\n </div>\r\n </div>\r\n } }\r\n </div>\r\n\r\n } @if(showDataBalance){\r\n <div class=\"col-12 grid ml-0\">\r\n @for (itemAccount of dataAccountBalance; track $index) {\r\n <div class=\"card balance-container\">\r\n <span class=\"card-header\">{{ itemAccount.name }}</span>\r\n <div class=\"card-content value-container\">\r\n <span class=\"balance\">{{ itemAccount.valueBalance }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n }\r\n\r\n <div class=\"col-12\">\r\n <vector-panel class=\"data-table-panel\">\r\n <p-tabView (onChange)=\"onTabChange($event)\" *ngIf=\"tabs?.length\">\r\n <p-tabPanel *ngFor=\"let tab of tabs\">\r\n <ng-template pTemplate=\"header\">\r\n <em *ngIf=\"tab.icon\" [class]=\"tab.icon\"> </em>\r\n <span>{{ tab.name }}</span>\r\n </ng-template>\r\n </p-tabPanel>\r\n </p-tabView>\r\n <p-table\r\n currentPageReportTemplate=\"Mostrando {first} at\u00E9 {last} de {totalRecords} registros\"\r\n sortMode=\"single\"\r\n [rows]=\"10\"\r\n [lazy]=\"pagination && !virtualPagination\"\r\n [value]=\"data\"\r\n [paginator]=\"pagination\"\r\n [totalRecords]=\"totalRecords\"\r\n [showCurrentPageReport]=\"true\"\r\n [rowsPerPageOptions]=\"[10, 25, 50, 100]\"\r\n [responsive]=\"true\"\r\n [resizableColumns]=\"true\"\r\n [scrollable]=\"true\"\r\n scrollDirection=\"vertical\"\r\n responsiveLayout=\"scroll\"\r\n dataKey=\"id\"\r\n [scrollHeight]=\"height\"\r\n [attr.selectionMode]=\"selectionMode\"\r\n [(selection)]=\"selectedItems\"\r\n (onRowSelect)=\"changeSelectedItems($event)\"\r\n (onHeaderCheckboxToggle)=\"changeSelectedItems($event)\"\r\n (onRowUnselect)=\"changeSelectedItems($event)\"\r\n (onLazyLoad)=\"lazyLoaded({ filter: false, data: $event })\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [reorderableColumns]=\"reorderableColumns\"\r\n >\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"header\">\r\n <th *ngIf=\"reorderableColumns\" style=\"width: 5rem\"></th>\r\n\r\n <th *ngIf=\"selectionType === 'checkbox'\">\r\n <p-tableHeaderCheckbox [disabled]=\"disabledHeadercheckbox\"></p-tableHeaderCheckbox>\r\n </th>\r\n <th class=\"text-center\" *ngIf=\"hasExpandableIcon\">\r\n {{ addNameColumnExpand }}\r\n </th>\r\n <th *ngIf=\"hasActions\">{{ 'app.label.actions' | translate }}</th>\r\n <th *ngIf=\"selectionType === 'radiobutton'\">\r\n <div class=\"flex align-items-center\">\r\n <span></span>\r\n </div>\r\n </th>\r\n <th\r\n *ngFor=\"let col of columns\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n [pSortableColumn]=\"col.notSortable ? '' : col.field\"\r\n pReorderableColumn\r\n >\r\n <div class=\"flex align-items-center\">\r\n <span>{{ col.header }}</span> <p-sortIcon *ngIf=\"!col.notSortable\" [field]=\"col.field\"></p-sortIcon>\r\n </div>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-item let-expanded=\"expanded\" let-index=\"rowIndex\">\r\n <tr\r\n class=\"row\"\r\n [pSelectableRow]=\"rowData\"\r\n [ngClass]=\"{ expandable: expandable }\"\r\n [pRowToggler]=\"expandable ? item : undefined\"\r\n (click)=\"onRowClick(item)\"\r\n [pReorderableRow]=\"index\"\r\n >\r\n <ng-container *ngIf=\"reorderableColumns\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectionType === 'checkbox'\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <p-tableCheckbox [value]=\"item\" [disabled]=\"item.disabledCheckBox\"></p-tableCheckbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectionType === 'radiobutton'\">\r\n <td style=\"max-width: 3rem; padding-left: 10px\" class=\"justify-content-center align-items-center\">\r\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"hasExpandableIcon\" style=\"max-width: 150px\" class=\"centered\">\r\n <p-menu #menu [model]=\"item.actions\" [popup]=\"true\" appendTo=\"body\"></p-menu>\r\n <i\r\n [ngClass]=\"\r\n expanded ? 'actions-menu-button pi pi-chevron-down' : 'actions-menu-button pi pi-chevron-right'\r\n \"\r\n ></i>\r\n </td>\r\n <td *ngIf=\"hasActions\">\r\n <p-menu #menu [model]=\"item.actions\" [popup]=\"true\" appendTo=\"body\"></p-menu>\r\n <i class=\"actions-menu-button fas fa-cog\" (click)=\"menu.toggle($event)\"></i>\r\n </td>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <td\r\n *ngIf=\"isHtmlCell(col)\"\r\n class=\"cell\"\r\n [innerHTML]=\"getCellContent(item, col)\"\r\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n ></td>\r\n <td\r\n *ngIf=\"(!isHtmlCell(col) && !!col.getStatus) || isScoreCell(col)\"\r\n class=\"cell\"\r\n (click)=\"col && col.clickFunction && col.clickFunction(item)\"\r\n [ngStyle]=\"getColStyle(col)\"\r\n >\r\n <vector-badge\r\n *ngIf=\"isBadgeCell(col)\"\r\n [label]=\"getCellText(item, col)\"\r\n [type]=\"col.getStatus && col.getStatus(item[col.field])\"\r\n [tooltip]=\"getTooltipText(item, col)\"\r\n ></vector-badge>\r\n <vector-score *ngIf=\"isScoreCell(col)\" [score]=\"item[col.field]\"></vector-score>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"row\">\r\n <td class=\"no-results\" [attr.colspan]=\"columns.length + 1\">Nenhum resultado encontrado</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"paginatorright\"> </ng-template>\r\n <ng-template let-item pTemplate=\"paginatordropdownitem\"> {{ item.value }} </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-item>\r\n <tr>\r\n <td [attr.colspan]=\"columns.length + (hasActions ? 1 : 0)\">\r\n <ng-container *ngTemplateOutlet=\"expansionTemplate; context: { item }\"> </ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </vector-panel>\r\n </div>\r\n</div>\r\n", styles: [".no-results{padding:15px;background-color:#fff;width:100%}.centered{display:flex;justify-content:center}.table-header-actions{display:flex;justify-content:flex-end;align-items:flex-end;width:100%;padding-right:7px;margin-bottom:15px!important}@media (min-width: 768px){.table-header-actions{margin-top:-3px}}.table-header-actions .export-button{padding:7px 10px;color:#fff;display:flex;align-items:center;border:none;border-radius:5px;margin:5px;font-size:.75rem;cursor:pointer}.table-header-actions .export-button.export-excel{background-color:var(--success-color)}.table-header-actions .export-button.export-excel:hover{background-color:var(--success-color-dark)}.table-header-actions .export-button.export-pdf{background-color:var(--error-color)}.table-header-actions .export-button.export-pdf:hover{background-color:var(--error-color-dark)}.table-header-actions .export-button.custom-function{background-color:var(--theme-primary)}.table-header-actions .export-button.custom-function:hover{background-color:var(--theme-medium)}.table-header-actions .export-button i{color:#fff}.table-header-actions .export-button span{margin-left:5px}.table-header-actions .add-item-button{margin-left:10px}.actions-menu-button{font-size:23px;cursor:pointer;color:var(--theme-medium)}.expandable{cursor:pointer}.balance-container{display:flex;flex-direction:column;min-width:13%;padding:0;margin-bottom:30px;top:30px;right:40px;border-radius:8px;margin-right:15px}.balance-container .header-right{flex:1;flex-direction:row;justify-content:flex-end;display:flex}@media screen and (max-width: 1450px){.balance-container{width:40%}}@media screen and (max-width: 960px){.balance-container{position:relative;width:80%;top:auto;right:auto}}.balance-container .card-header{color:var(--theme-medium);border-radius:9px 9px 0 0;padding:10px 10px 2px;font-weight:500;font-size:13px;line-height:17px;letter-spacing:.25px}.balance-container .value-container{display:flex;flex-direction:row;align-items:center;padding:0 10px 5px}.balance-container .value-container span{font-size:2em;font-weight:700;color:var(--theme-secondary)}@media screen and (max-width: 640px){.balance-container .value-container span{font-size:1.6em}}.balance-container .value-container .balance{margin-left:8px;width:70%}.balance-container .value-container .hidden-balance{background-color:var(--gray-lighter);padding:15px;margin-left:8px;width:70%;height:100%}.balance-container .value-container .icon-container{display:flex;flex:1;justify-content:center;align-items:center}.balance-container .value-container .icon-container i{cursor:pointer;font-size:2em;padding-top:2px;color:var(--theme-medium)}\n"] }]
|
|
344
344
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { columns: [{
|
|
345
345
|
type: Input
|
|
346
346
|
}], data: [{
|
|
@@ -419,4 +419,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
419
419
|
type: ViewChild,
|
|
420
420
|
args: [FiltersComponent, { static: true }]
|
|
421
421
|
}] } });
|
|
422
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVjdG9yLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkcy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZlY3Rvci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFnQyxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RSxPQUFPLEVBQXVDLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQWUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7OztBQU83RSxNQUFNLE9BQU8sa0JBQWtCO0lBRzdCLElBQ1csSUFBSSxDQUFDLEtBQVk7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFB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O3NCQUQ1QixLQUFLO2dCQUdDLE9BQU87c0JBRGIsS0FBSztnQkFHQyxZQUFZO3NCQURsQixLQUFLO2dCQUdDLFVBQVU7c0JBRGhCLEtBQUs7Z0JBR0MsaUJBQWlCO3NCQUR2QixLQUFLO2dCQUdLLElBQUk7c0JBRGQsS0FBSztnQkFNQyxhQUFhO3NCQURuQixLQUFLO2dCQUdDLHFCQUFxQjtzQkFEM0IsS0FBSztnQkFHQyxVQUFVO3NCQURoQixLQUFLO2dCQUdDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFHQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUssYUFBYTtzQkFEdkIsS0FBSztnQkFlQyxhQUFhO3NCQURuQixLQUFLO2dCQUdLLE1BQU07c0JBRGhCLEtBQUs7Z0JBb0JDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFHQyxlQUFlO3NCQURyQixLQUFLO2dCQUdDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxVQUFVO3NCQURoQixNQUFNO2dCQUdBLFFBQVE7c0JBRGQsTUFBTTtnQkFHQSxLQUFLO3NCQURYLE1BQU07Z0JBR0EsYUFBYTtzQkFEbkIsTUFBTTtnQkFHQSxXQUFXO3NCQURqQixNQUFNO2dCQUdBLGNBQWM7c0JBRHBCLE1BQU07Z0JBR0EsZUFBZTtzQkFEckIsTUFBTTtnQkFHQSxhQUFhO3NCQURuQixNQUFNO2dCQUdBLFdBQVc7c0JBRGpCLE1BQU07Z0JBSUEsYUFBYTtzQkFEbkIsS0FBSztnQkFHQywyQkFBMkI7c0JBRGpDLEtBQUs7Z0JBR0Msa0JBQWtCO3NCQUR4QixLQUFLO2dCQUlDLGdCQUFnQjtzQkFEdEIsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ2x1eG9uJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRmlsdGVyQ2hhbmdlZEV2ZW50LCBMaXN0SXRlbSwgU3RhdHVzIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgRGF0YVRhYmxlTGF6eUxvYWRFdmVudCwgVGFibGVDb2x1bW4sIFRhYmxlQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kYXRhLXRhYmxlLm1vZGVsJztcclxuaW1wb3J0IHsgTWFza1V0aWwgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XHJcbmltcG9ydCB7IEZpbHRlckZpZWxkLCBGaWx0ZXJzQ29tcG9uZW50IH0gZnJvbSAnLi4vZmlsdGVycy9maWx0ZXJzLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3ZlY3Rvci1kYXRhLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGNvbHVtbnM6IFRhYmxlQ29sdW1uW10gPSBbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgZGF0YShfZGF0YTogYW55W10pIHtcclxuICAgIHRoaXMuX2RhdGEgPSBfZGF0YTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuX2RhdGE/LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zZWxlY3RlZCkgfHwgW107XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgZGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuICBwcml2YXRlIF9kYXRhOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGV4cG9ydEV4Y2VsID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZXhwb3J0UERGID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY3VzdG9tRnVuY3Rpb246IHsgbGFiZWw6IHN0cmluZzsgaWNvbj86IHN0cmluZzsgY2xpY2tGdW5jdGlvbjogRnVuY3Rpb24gfVtdIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHRvdGFsUmVjb3JkcyA9IDA7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGlzYWJsZWRIZWFkZXJjaGVja2JveCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGZpbHRlcnM6IEZpbHRlckZpZWxkW10gPSBbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhZGRJdGVtTGFiZWwgPSAnJztcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBwYWdpbmF0aW9uID0gdHJ1ZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyB2aXJ0dWFsUGFnaW5hdGlvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCB0YWJzKF90YWJzOiBMaXN0SXRlbVtdKSB7XHJcbiAgICB0aGlzLl90YWJzID0gX3RhYnM7XHJcbiAgICB0aGlzLl90YWJTZWxlY3RlZCA9IF90YWJzWzBdO1xyXG4gIH1cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjdXN0b21CdXR0b25zOiB7IGxhYmVsOiBzdHJpbmc7IGNsaWNrRnVuY3Rpb246IEZ1bmN0aW9uIH1bXSB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhZGRJdGVtQnV0dG9uUGx1c1NpZ24gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBoYXNBY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBoYXNFeHBhbmRhYmxlSWNvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGFkZE5hbWVDb2x1bW5FeHBhbmQgPSAnJztcclxuICBASW5wdXQoKSBleHBhbmRhYmxlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZXhwYW5zaW9uVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbDtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgc2VsZWN0aW9uTW9kZShfc2VsZWN0aW9uTW9kZSkge1xyXG4gICAgc3dpdGNoIChfc2VsZWN0aW9uTW9kZSkge1xyXG4gICAgICBjYXNlICdzaW5nbGUnOlxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGUgPSAnc2luZ2xlJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbXVsdGlwbGUnOlxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGUgPSAnbXVsdGlwbGUnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGUgPSBudWxsO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZWxlY3Rpb25UeXBlOiAnY2hlY2tib3gnIHwgJ3JhZGlvYnV0dG9uJyB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBoZWlnaHQoX2hlaWdodDogc3RyaW5nKSB7XHJcbiAgICBzd2l0Y2ggKF9oZWlnaHQpIHtcclxuICAgICAgY2FzZSAnc21hbGwnOlxyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9ICczMDBweCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ21lZGl1bSc6XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gJzUwMHB4JztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbGFyZ2UnOlxyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9ICc3MDBweCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2Z1bGwnOlxyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9ICdmbGV4JztcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSAnMzAwcHgnO1xyXG4gICAgfVxyXG4gIH1cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaG93TGltaXRCYWxhbmNlID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd0RhdGFCYWxhbmNlID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGF0YUFjY291bnRCYWxhbmNlOiB7IHZpc2libGU6IGJvb2xlYW47IG5hbWU6IHN0cmluZzsgdmFsdWVCYWxhbmNlOiBudW1iZXI7IHNob3dCYWxhbmNlOiBib29sZWFuIH1bXSA9IFtdO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgb25MYXp5TG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlTGF6eUxvYWRFdmVudD4oKTtcclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgb25GaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgb25BZGQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIG9uRXhwb3J0RXhjZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIG9uRXhwb3J0UERGID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBvblNlbGVjdGVkUm93cyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBvbkZpbHRlckNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbHRlckNoYW5nZWRFdmVudD4oKTtcclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgb25UYWJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TGlzdEl0ZW0+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIG9uRXhwYW5kUm93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZmlyc3RMYXp5TG9hZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNob3VsZExhenlMb2FkV2l0aG91dEZpbHRlciA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHJlb3JkZXJhYmxlQ29sdW1ucyA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKEZpbHRlcnNDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcHVibGljIGZpbHRlcnNDb21wb25lbnQ6IEZpbHRlcnNDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW1zOiBhbnkgPSBbXTtcclxuXHJcbiAgZ2V0IGJhbGFuY2UoKTogKGl0ZW1BY2NvdW50PzogYW55KSA9PiBudW1iZXIgfCBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChpdGVtQWNjb3VudD86IGFueSk6IG51bWJlciB8IHN0cmluZyA9PiB7XHJcbiAgICAgIHJldHVybiBpdGVtQWNjb3VudC5zaG93QmFsYW5jZVxyXG4gICAgICAgID8gaXRlbUFjY291bnQudmFsdWVCYWxhbmNlLnRvTG9jYWxlU3RyaW5nKCdwdC1CUicsIHtcclxuICAgICAgICAgICAgY3VycmVuY3k6ICdCUkwnLFxyXG4gICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIsXHJcbiAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMixcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgOiAnLSwtLSc7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRhYnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFicztcclxuICB9XHJcbiAgZ2V0IGhlaWdodCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XHJcbiAgfVxyXG4gIGdldCBzZWxlY3Rpb25Nb2RlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyB8ICdtdWx0aXBsZScgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9oZWlnaHQ6IHN0cmluZyA9ICdzbWFsbCc7XHJcbiAgcHJpdmF0ZSBfdGFiczogTGlzdEl0ZW1bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2RyYXcgPSAxO1xyXG4gIHByaXZhdGUgX2ZpcnN0TGF6eUxvYWRlZERvbmUgPSB0aGlzLmZpcnN0TGF6eUxvYWQ7XHJcbiAgcHJpdmF0ZSBfbGFzdExhenlMb2FkRXZlbnQ6IERhdGFUYWJsZUxhenlMb2FkRXZlbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfdGFiU2VsZWN0ZWQ6IExpc3RJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2ZpbHRlclN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGNkOiBDaGFuZ2VEZXRlY3RvclJlZikge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgIHRoaXMuaGVpZ2h0ID0gJ3NtYWxsJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbiB8fCB0aGlzLnZpcnR1YWxQYWdpbmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyc0NvbXBvbmVudD8uc2VhcmNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpbHRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29sU3R5bGUoY29sOiBUYWJsZUNvbHVtbikge1xyXG4gICAgcmV0dXJuIHsgJ21pbi13aWR0aCc6IGNvbC53aWR0aCB9O1xyXG4gIH1cclxuXHJcbiAgbGF6eUxvYWRlZChwYXJhbXM6IHsgZmlsdGVyOiBib29sZWFuOyBkYXRhOiBhbnkgfSA9IHsgZmlsdGVyOiBmYWxzZSwgZGF0YTogeyBzdGFydDogMCwgcm93czogMTAgfSB9KSB7XHJcbiAgICBpZiAoIXBhcmFtcy5maWx0ZXIgJiYgIXRoaXMuc2hvdWxkTGF6eUxvYWRXaXRob3V0RmlsdGVyKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2wpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgZGF0YTogY29sLmZpZWxkLFxyXG4gICAgICAgICAgbmFtZTogYCR7Y29sLmZpZWxkLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpfSR7Y29sLmZpZWxkLnN1YnN0cmluZygxLCBjb2wuZmllbGQubGVuZ3RoKX1gLFxyXG4gICAgICAgICAgb3JkZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgc2VhcmNoOiB7IHZhbHVlOiAnJywgcmVnZXg6IGZhbHNlIH0sXHJcbiAgICAgICAgICBzZWFyY2hhYmxlOiB0cnVlLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodGhpcy5oYXNBY3Rpb25zKSB7XHJcbiAgICAgICAgY29sdW1ucy51bnNoaWZ0KHtcclxuICAgICAgICAgIGRhdGE6ICdhY3RpdmUnLFxyXG4gICAgICAgICAgbmFtZTogJ0FjdGl2ZScsXHJcbiAgICAgICAgICBvcmRlcmFibGU6IHRydWUsXHJcbiAgICAgICAgICBzZWFyY2g6IHsgdmFsdWU6ICcnLCByZWdleDogZmFsc2UgfSxcclxuICAgICAgICAgIHNlYXJjaGFibGU6IHRydWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fbGFzdExhenlMb2FkRXZlbnQgPSB7XHJcbiAgICAgICAgLi4uKHRoaXMuX2xhc3RMYXp5TG9hZEV2ZW50IHx8ICh7fSBhcyBhbnkpKSxcclxuICAgICAgICBwYWdlOiBwYXJhbXMuZGF0YS5maXJzdCAvIHBhcmFtcy5kYXRhLnJvd3MgKyAxLFxyXG4gICAgICAgIHN0YXJ0OiBwYXJhbXMuZGF0YS5maXJzdCxcclxuICAgICAgICBsZW5ndGg6IHBhcmFtcy5kYXRhLnJvd3MsXHJcbiAgICAgICAgZHJhdzogdGhpcy5fZHJhdysrLFxyXG4gICAgICAgIG9yZGVyOiBwYXJhbXMuZGF0YS5zb3J0RmllbGRcclxuICAgICAgICAgID8gW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbHVtbjpcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmRJbmRleCgoY29sKSA9PiBjb2wuZmllbGQgPT09IHBhcmFtcy5kYXRhLnNvcnRGaWVsZCkgKyAodGhpcy5oYXNBY3Rpb25zID8gMSA6IDApLFxyXG4gICAgICAgICAgICAgICAgZGlyOiBwYXJhbXMuZGF0YS5zb3J0T3JkZXIgPiAwID8gJ2FzYycgOiAnZGVzYycsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgOiBbeyBjb2x1bW46IDAsIGRpcjogJ2Rlc2MnIH1dLFxyXG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXHJcbiAgICAgICAgdGFiOiB0aGlzLl90YWJTZWxlY3RlZCxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2xhc3RMYXp5TG9hZEV2ZW50ID0ge1xyXG4gICAgICAgIC4uLnRoaXMuX2xhc3RMYXp5TG9hZEV2ZW50LFxyXG4gICAgICAgIC4uLnBhcmFtcy5kYXRhLFxyXG4gICAgICAgIHN0YXJ0OiAwLFxyXG4gICAgICB9O1xyXG4gICAgICBpZiAodGhpcy5fdGFiU2VsZWN0ZWQpIHtcclxuICAgICAgICB0aGlzLl9sYXN0TGF6eUxvYWRFdmVudCA9IHtcclxuICAgICAgICAgIC4uLih0aGlzLl9sYXN0TGF6eUxvYWRFdmVudCB8fCAoe30gYXMgYW55KSksXHJcbiAgICAgICAgICAuLi57IFN0YXR1czogdGhpcy5fdGFiU2VsZWN0ZWQuY29kZSB9LFxyXG4gICAgICAgICAgdGFiOiB0aGlzLl90YWJTZWxlY3RlZCxcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpcnN0TGF6eUxvYWRlZERvbmUgfHwgdGhpcy5maXJzdExhenlMb2FkKSB7XHJcbiAgICAgIHRoaXMub25MYXp5TG9hZC5lbWl0KHRoaXMuX2xhc3RMYXp5TG9hZEV2ZW50KTtcclxuICAgIH1cclxuICAgIHRoaXMuX2ZpcnN0TGF6eUxvYWRlZERvbmUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2VsbENvbnRlbnQoaXRlbTogYW55LCBjb2w6IFRhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBjZWxsVGV4dCA9IHRoaXMuZ2V0Q2VsbFRleHQoaXRlbSwgY29sKTtcclxuICAgIGxldCBjb250ZW50ID0gYDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj4ke2NvbC5oZWFkZXJ9PC9zcGFuPjxzcGFuIGNsYXNzPVwidy0xMDBcIj5gO1xyXG4gICAgaWYgKFxyXG4gICAgICAhY29sLnR5cGUgfHxcclxuICAgICAgW1RhYmxlQ29sdW1uVHlwZS5FTlVNLCBUYWJsZUNvbHVtblR5cGUuVEVYVCwgVGFibGVDb2x1bW5UeXBlLkRBVEVUSU1FLCBUYWJsZUNvbHVtblR5cGUuREFURV0uaW5jbHVkZXMoY29sLnR5cGUpXHJcbiAgICApIHtcclxuICAgICAgY29udGVudCArPSBjZWxsVGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKGNvbC50eXBlKSB7XHJcbiAgICAgIGNhc2UgVGFibGVDb2x1bW5UeXBlLkNVU1RPTV9TVFlMRTpcclxuICAgICAgICBjb250ZW50ICs9IGA8c3BhbiBjbGFzcz1cIiR7Y29sLnRleHRGaWVsZENsYXNzID8gaXRlbVtjb2wudGV4dEZpZWxkQ2xhc3NdIDogJyd9XCI+JHtjZWxsVGV4dH08L3NwYW4+YDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuQk9PTEVBTjpcclxuICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJlZFwiPjxpIGNsYXNzPVwiIHN0YXR1cy10YWJsZS1maWVsZCBmYXMgZmEtJHtcclxuICAgICAgICAgIGNlbGxUZXh0ID8gJ2NoZWNrIGJvb2xlYW4tdmFsdWUtcG9zaXRpdmUnIDogJ3RpbWVzIGJvb2xlYW4tdmFsdWUtbmVnYXRpdmUnXHJcbiAgICAgICAgfVwiPjwvaT48L2Rpdj5gO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5TVEFUVVNfQkFER0U6XHJcbiAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyZWRcIj48aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUgc3RhdHVzLXRhYmxlLWZpZWxkICR7dGhpcy5nZXRTdGF0dXNDb2xvcihcclxuICAgICAgICAgIGNlbGxUZXh0XHJcbiAgICAgICAgKX1cIj48L2k+PC9kaXY+YDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuQUNUSVZFX0JPT0xFQU5fQkFER0U6XHJcbiAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyZWRcIj48aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUgc3RhdHVzLXRhYmxlLWZpZWxkICR7dGhpcy5nZXRBY3RpdmVTdGF0dXNDb2xvcihcclxuICAgICAgICAgIGNlbGxUZXh0XHJcbiAgICAgICAgKX1cIj48L2k+PC9kaXY+YDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuQlVUVE9OOlxyXG4gICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlcmVkXCI+PGkgY2xhc3M9XCIke1xyXG4gICAgICAgICAgY29sLmljb24gfHwgJ2ZhcyBmYS1jaXJjbGUnXHJcbiAgICAgICAgfSBzdGF0dXMtdGFibGUtZmllbGQgdGFibGUtYnV0dG9uXCI+PC9pPjwvZGl2PmA7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgVGFibGVDb2x1bW5UeXBlLk1BU0s6XHJcbiAgICAgICAgY29udGVudCArPSBNYXNrVXRpbC5kb01hc2tTdHJpbmcoY2VsbFRleHQsIGNvbC5tYXNrKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuQ1VSUkVOQ1k6XHJcbiAgICAgICAgY29udGVudCArPSBOdW1iZXIoY2VsbFRleHQpLnRvTG9jYWxlU3RyaW5nKCdwdC1CUicsIHtcclxuICAgICAgICAgIGN1cnJlbmN5OiBjb2wuY3VycmVuY3lUeXBlIHx8ICdCUkwnLFxyXG4gICAgICAgICAgY3VycmVuY3lEaXNwbGF5OiAnbmFycm93U3ltYm9sJyxcclxuICAgICAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnRlbnQgKz0gYDwvc3Bhbj5gO1xyXG4gICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2VsbFRleHQoaXRlbTogYW55LCBjb2w6IFRhYmxlQ29sdW1uKSB7XHJcbiAgICBpZiAoY29sLmdldEVudW1UcmFuc2xhdGVkKSB7XHJcbiAgICAgIHJldHVybiBjb2wuZ2V0RW51bVRyYW5zbGF0ZWQoaXRlbVtjb2wuZmllbGRdKTtcclxuICAgIH1cclxuICAgIGlmIChjb2wudHlwZSA9PT0gVGFibGVDb2x1bW5UeXBlLkRBVEVUSU1FICYmIGl0ZW1bY29sLmZpZWxkXSkge1xyXG4gICAgICBjb25zdCBkYXRlVGltZSA9XHJcbiAgICAgICAgaXRlbVtjb2wuZmllbGRdIGluc3RhbmNlb2YgRGF0ZSA/IERhdGVUaW1lLmZyb21KU0RhdGUoaXRlbVtjb2wuZmllbGRdKSA6IERhdGVUaW1lLmZyb21JU08oaXRlbVtjb2wuZmllbGRdKTtcclxuICAgICAgcmV0dXJuIGRhdGVUaW1lLnRvVVRDKCkudG9Gb3JtYXQoJ2RkL01NL3l5eXkgSEg6bW0nKTtcclxuICAgIH1cclxuICAgIGlmIChjb2wudHlwZSA9PT0gVGFibGVDb2x1bW5UeXBlLkRBVEUgJiYgaXRlbVtjb2wuZmllbGRdKSB7XHJcbiAgICAgIGNvbnN0IGRhdGVUaW1lID1cclxuICAgICAgICBpdGVtW2NvbC5maWVsZF0gaW5zdGFuY2VvZiBEYXRlID8gRGF0ZVRpbWUuZnJvbUpTRGF0ZShpdGVtW2NvbC5maWVsZF0pIDogRGF0ZVRpbWUuZnJvbUlTTyhpdGVtW2NvbC5maWVsZF0pO1xyXG4gICAgICByZXR1cm4gZGF0ZVRpbWUudG9VVEMoKS50b0Zvcm1hdCgnZGQvTU0veXl5eScpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbC50eXBlID09PSBUYWJsZUNvbHVtblR5cGUuU1RBQ0tfQkFER0UpIHtcclxuICAgICAgaWYgKCFpdGVtW2NvbC5maWVsZF0ubGVuZ3RoIHx8IGl0ZW1bY29sLmZpZWxkXS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICByZXR1cm4gaXRlbVtjb2wuZmllbGRdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBgKyR7aXRlbVtjb2wuZmllbGRdLmxlbmd0aH1gO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY29sLnR5cGUgPT09IFRhYmxlQ29sdW1uVHlwZS5TVEFUVVNfQkFER0UpIHtcclxuICAgICAgcmV0dXJuIGl0ZW1bY29sLmZpZWxkXSA9PSAwID8gMCA6IGl0ZW1bY29sLmZpZWxkXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXRlbVtjb2wuZmllbGQgfHwgJyddIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRvb2x0aXBUZXh0KGl0ZW06IGFueSwgY29sOiBUYWJsZUNvbHVtbikge1xyXG4gICAgaWYgKFxyXG4gICAgICAhY29sLnR5cGUgfHxcclxuICAgICAgIVtUYWJsZUNvbHVtblR5cGUuU1RBQ0tfQkFER0VdLmluY2x1ZGVzKGNvbC50eXBlKSB8fFxyXG4gICAgICAhQXJyYXkuaXNBcnJheShpdGVtW2NvbC5maWVsZF0pIHx8XHJcbiAgICAgIGl0ZW1bY29sLmZpZWxkXS5sZW5ndGggPT09IDFcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbVtjb2wuZmllbGRdKSkge1xyXG4gICAgICByZXR1cm4gaXRlbVtjb2wuZmllbGRdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGl0ZW1bY29sLmZpZWxkXS5qb2luKCcgLSAnKTtcclxuICB9XHJcblxyXG4gIG9uVGFiQ2hhbmdlKCRldmVudDogYW55KSB7XHJcbiAgICB0aGlzLl90YWJTZWxlY3RlZCA9IHRoaXMudGFic1skZXZlbnQuaW5kZXhdO1xyXG4gICAgdGhpcy5sYXp5TG9hZGVkKHsgZmlsdGVyOiB0cnVlLCBkYXRhOiB7fSB9KTtcclxuICAgIHRoaXMub25UYWJTZWxlY3RlZC5lbWl0KHRoaXMuX3RhYlNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmliZVRvRmlsdGVyQ2hhbmdlcygpIHtcclxuICAgIHRoaXMuX2ZpbHRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5fZmlsdGVyU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzQ29tcG9uZW50Py5mb3JtR3JvdXAuY29udHJvbHMgfHwge30pLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICB0aGlzLl9maWx0ZXJTdWJzY3JpcHRpb24uYWRkKFxyXG4gICAgICAgIHRoaXMuZmlsdGVyc0NvbXBvbmVudD8uZm9ybUdyb3VwXHJcbiAgICAgICAgICAuZ2V0KGtleSlcclxuICAgICAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uRmlsdGVyQ2hhbmdlZC5lbWl0KHsgZmllbGQ6IGtleSwgdmFsdWUgfSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm9uRmlsdGVyQ2hhbmdlZC5lbWl0KHsgZmllbGQ6IGtleSwgdmFsdWU6IHRoaXMuZmlsdGVyc0NvbXBvbmVudD8uZm9ybUdyb3VwLmdldChrZXkpPy52YWx1ZSB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25Sb3dDbGljayhpdGVtOiBhbnkpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5vbkV4cGFuZFJvdy5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxpc3RIYXNBY3Rpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zb21lKChpdGVtKSA9PiBpdGVtLmFjdGlvbnM/Lmxlbmd0aCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hhbmdlU2VsZWN0ZWRJdGVtcyh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLm9uU2VsZWN0ZWRSb3dzLmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0h0bWxDZWxsKGNvbDogVGFibGVDb2x1bW4pIHtcclxuICAgIHJldHVybiAhY29sLnR5cGUgfHwgIXRoaXMuaXNCYWRnZUNlbGwoY29sKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0JhZGdlQ2VsbChjb2w6IFRhYmxlQ29sdW1uKSB7XHJcbiAgICByZXR1cm4gY29sLnR5cGUgJiYgW1RhYmxlQ29sdW1uVHlwZS5URVhUX0JBREdFLCBUYWJsZUNvbHVtblR5cGUuU1RBQ0tfQkFER0VdLmluY2x1ZGVzKGNvbC50eXBlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1Njb3JlQ2VsbChjb2w6IFRhYmxlQ29sdW1uKSB7XHJcbiAgICByZXR1cm4gY29sLnR5cGUgPT09IFRhYmxlQ29sdW1uVHlwZS5TQ09SRTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNlbGVjdGlvbkNoYW5nZShzZWxlY3Rpb246IGFueSkge1xyXG4gICAgZm9yIChsZXQgaSA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBsZXQgZGF0YSA9IHNlbGVjdGlvbltpXTtcclxuICAgICAgaWYgKGRhdGEuZGlzYWJsZWRDaGVja0JveCkge1xyXG4gICAgICAgIHNlbGVjdGlvbi5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGFuZ2VTaG93QmFsYW5jZShpdGVtQWNjb3VudD86IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGl0ZW1BY2NvdW50KSB7XHJcbiAgICAgIGl0ZW1BY2NvdW50LnNob3dCYWxhbmNlID0gIWl0ZW1BY2NvdW50LnNob3dCYWxhbmNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGF0dXNDb2xvcihzdGF0dXM6IFN0YXR1cykge1xyXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcclxuICAgICAgY2FzZSBTdGF0dXMuUEVORElORzpcclxuICAgICAgICByZXR1cm4gJ3dhcm5pbmcnO1xyXG4gICAgICBjYXNlIFN0YXR1cy5BUFBST1ZFRDpcclxuICAgICAgICByZXR1cm4gJ3N1Y2Nlc3MnO1xyXG4gICAgICBjYXNlIFN0YXR1cy5SRUpFQ1RFRDpcclxuICAgICAgICByZXR1cm4gJ2Vycm9yJztcclxuICAgICAgY2FzZSBTdGF0dXMuSU5GTzpcclxuICAgICAgICByZXR1cm4gJ2luZm8nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRBY3RpdmVTdGF0dXNDb2xvcihhY3RpdmU6IGJvb2xlYW4pIHtcclxuICAgIHJldHVybiBhY3RpdmUgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDx2ZWN0b3ItZmlsdGVyc1xyXG4gICAgICBbZmllbGRzXT1cImZpbHRlcnNcIlxyXG4gICAgICAob25TZWFyY2gpPVwibGF6eUxvYWRlZCh7IGZpbHRlcjogdHJ1ZSwgZGF0YTogJGV2ZW50IH0pXCJcclxuICAgICAgKGZvcm1CdWlsZGVkKT1cInN1YnNjcmliZVRvRmlsdGVyQ2hhbmdlcygpXCJcclxuICAgID48L3ZlY3Rvci1maWx0ZXJzPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXItYWN0aW9ucyBmaWVsZFwiICpuZ0lmPVwiYWRkSXRlbUxhYmVsIHx8IGV4cG9ydEV4Y2VsIHx8IGV4cG9ydFBERiB8fCBjdXN0b21GdW5jdGlvblwiPlxyXG4gICAgPGJ1dHRvbiAqbmdJZj1cImV4cG9ydEV4Y2VsXCIgKGNsaWNrKT1cIm9uRXhwb3J0RXhjZWwuZW1pdCgpXCIgY2xhc3M9XCJleHBvcnQtYnV0dG9uIGV4cG9ydC1leGNlbFwiPlxyXG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1maWxlLWV4Y2VsXCI+PC9pPjxzcGFuPkV4Y2VsPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiZXhwb3J0UERGXCIgKGNsaWNrKT1cIm9uRXhwb3J0UERGLmVtaXQoKVwiIGNsYXNzPVwiZXhwb3J0LWJ1dHRvbiBleHBvcnQtcGRmXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZpbGUtcGRmXCI+PC9pPjxzcGFuPlBERjwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGN1c3RvbUZ1bmN0aW9uXCJcclxuICAgICAgKGNsaWNrKT1cImJ1dHRvbi5jbGlja0Z1bmN0aW9uKClcIlxyXG4gICAgICBjbGFzcz1cImV4cG9ydC1idXR0b24gY3VzdG9tLWZ1bmN0aW9uXCJcclxuICAgID5cclxuICAgICAgPGkgKm5nSWY9XCJidXR0b24/Lmljb25cIiBjbGFzcz1cInt7IGJ1dHRvbj8uaWNvbiB9fVwiPjwvaT48c3Bhbj57eyBidXR0b24/LmxhYmVsIH19PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPHZlY3Rvci1idXR0b25cclxuICAgICAgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBjdXN0b21CdXR0b25zXCJcclxuICAgICAgY2xhc3M9XCJhZGQtaXRlbS1idXR0b25cIlxyXG4gICAgICBbbGFiZWxdPVwiYnV0dG9uLmxhYmVsXCJcclxuICAgICAgKGNsaWNrKT1cImJ1dHRvbi5jbGlja0Z1bmN0aW9uKClcIlxyXG4gICAgICBbcmlnaHRJY29uXT1cImFkZEl0ZW1CdXR0b25QbHVzU2lnbiA/ICdwaSBwaS1wbHVzJyA6ICcnXCJcclxuICAgID48L3ZlY3Rvci1idXR0b24+XHJcbiAgICA8dmVjdG9yLWJ1dHRvblxyXG4gICAgICAqbmdJZj1cImFkZEl0ZW1MYWJlbFwiXHJcbiAgICAgIGNsYXNzPVwiYWRkLWl0ZW0tYnV0dG9uXCJcclxuICAgICAgW2xhYmVsXT1cImFkZEl0ZW1MYWJlbFwiXHJcbiAgICAgIChjbGljayk9XCJvbkFkZC5lbWl0KClcIlxyXG4gICAgICBbcmlnaHRJY29uXT1cImFkZEl0ZW1CdXR0b25QbHVzU2lnbiA/ICdwaSBwaS1wbHVzJyA6ICcnXCJcclxuICAgID48L3ZlY3Rvci1idXR0b24+XHJcbiAgPC9kaXY+XHJcbiAgQGlmKHNob3dMaW1pdEJhbGFuY2Upe1xyXG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgZ3JpZCBtbC0wXCI+XHJcbiAgICBAZm9yIChpdGVtQWNjb3VudCBvZiBkYXRhQWNjb3VudEJhbGFuY2U7IHRyYWNrICRpbmRleCkgeyBAaWYoaXRlbUFjY291bnQudmlzaWJsZSl7XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBiYWxhbmNlLWNvbnRhaW5lclwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+e3sgaXRlbUFjY291bnQubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudCB2YWx1ZS1jb250YWluZXJcIj5cclxuICAgICAgICA8c3Bhbj5SJCA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtQWNjb3VudC5zaG93QmFsYW5jZVwiIGNsYXNzPVwiYmFsYW5jZVwiPnt7IGJhbGFuY2UoaXRlbUFjY291bnQpIH19PC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4tYmFsYW5jZVwiICpuZ0lmPVwiIWl0ZW1BY2NvdW50LnNob3dCYWxhbmNlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8aVxyXG4gICAgICAgICAgICBjbGFzcz1cImZhc1wiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2ZhLWV5ZSc6ICFpdGVtQWNjb3VudC5zaG93QmFsYW5jZSwgJ2ZhLWV5ZS1zbGFzaCc6IGl0ZW1BY2NvdW50LnNob3dCYWxhbmNlIH1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU2hvd0JhbGFuY2UoaXRlbUFjY291bnQpXCJcclxuICAgICAgICAgID48L2k+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICB9IH1cclxuICA8L2Rpdj5cclxuXHJcbiAgfSBAaWYoc2hvd0RhdGFCYWxhbmNlKXtcclxuICA8ZGl2IGNsYXNzPVwiY29sLTEyIGdyaWQgbWwtMFwiPlxyXG4gICAgQGZvciAoaXRlbUFjY291bnQgb2YgZGF0YUFjY291bnRCYWxhbmNlOyB0cmFjayAkaW5kZXgpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIGJhbGFuY2UtY29udGFpbmVyXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1oZWFkZXJcIj57eyBpdGVtQWNjb3VudC5uYW1lIH19PC9zcGFuPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50IHZhbHVlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYmFsYW5jZVwiPnt7IGl0ZW1BY2NvdW50LnZhbHVlQmFsYW5jZSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgfVxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICA8dmVjdG9yLXBhbmVsIGNsYXNzPVwiZGF0YS10YWJsZS1wYW5lbFwiPlxyXG4gICAgICA8cC10YWJWaWV3IChvbkNoYW5nZSk9XCJvblRhYkNoYW5nZSgkZXZlbnQpXCIgKm5nSWY9XCJ0YWJzPy5sZW5ndGhcIj5cclxuICAgICAgICA8cC10YWJQYW5lbCAqbmdGb3I9XCJsZXQgdGFiIG9mIHRhYnNcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgPGVtICpuZ0lmPVwidGFiLmljb25cIiBbY2xhc3NdPVwidGFiLmljb25cIj4mbmJzcDs8L2VtPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyB0YWIubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgICA8L3AtdGFiVmlldz5cclxuICAgICAgPHAtdGFibGVcclxuICAgICAgICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwiTW9zdHJhbmRvIHtmaXJzdH0gYXTDqSB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCJcclxuICAgICAgICBzb3J0TW9kZT1cInNpbmdsZVwiXHJcbiAgICAgICAgW3Jvd3NdPVwiMTBcIlxyXG4gICAgICAgIFtsYXp5XT1cInBhZ2luYXRpb24gJiYgIXZpcnR1YWxQYWdpbmF0aW9uXCJcclxuICAgICAgICBbdmFsdWVdPVwiZGF0YVwiXHJcbiAgICAgICAgW3BhZ2luYXRvcl09XCJwYWdpbmF0aW9uXCJcclxuICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3Jkc1wiXHJcbiAgICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcclxuICAgICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cIlsxMCwgMjUsIDUwLCAxMDBdXCJcclxuICAgICAgICBbcmVzcG9uc2l2ZV09XCJ0cnVlXCJcclxuICAgICAgICBbcmVzaXphYmxlQ29sdW1uc109XCJ0cnVlXCJcclxuICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICBzY3JvbGxEaXJlY3Rpb249XCJ2ZXJ0aWNhbFwiXHJcbiAgICAgICAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgZGF0YUtleT1cImlkXCJcclxuICAgICAgICBbc2Nyb2xsSGVpZ2h0XT1cImhlaWdodFwiXHJcbiAgICAgICAgW2F0dHIuc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25Nb2RlXCJcclxuICAgICAgICBbKHNlbGVjdGlvbildPVwic2VsZWN0ZWRJdGVtc1wiXHJcbiAgICAgICAgKG9uUm93U2VsZWN0KT1cImNoYW5nZVNlbGVjdGVkSXRlbXMoJGV2ZW50KVwiXHJcbiAgICAgICAgKG9uSGVhZGVyQ2hlY2tib3hUb2dnbGUpPVwiY2hhbmdlU2VsZWN0ZWRJdGVtcygkZXZlbnQpXCJcclxuICAgICAgICAob25Sb3dVbnNlbGVjdCk9XCJjaGFuZ2VTZWxlY3RlZEl0ZW1zKCRldmVudClcIlxyXG4gICAgICAgIChvbkxhenlMb2FkKT1cImxhenlMb2FkZWQoeyBmaWx0ZXI6IGZhbHNlLCBkYXRhOiAkZXZlbnQgfSlcIlxyXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgW3Jlb3JkZXJhYmxlQ29sdW1uc109XCJyZW9yZGVyYWJsZUNvbHVtbnNcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgPHRyIGNsYXNzPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cInJlb3JkZXJhYmxlQ29sdW1uc1wiIHN0eWxlPVwid2lkdGg6IDVyZW1cIj48L3RoPlxyXG5cclxuICAgICAgICAgICAgPHRoICpuZ0lmPVwic2VsZWN0aW9uVHlwZSA9PT0gJ2NoZWNrYm94J1wiPlxyXG4gICAgICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggW2Rpc2FibGVkXT1cImRpc2FibGVkSGVhZGVyY2hlY2tib3hcIj48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1jZW50ZXJcIiAqbmdJZj1cImhhc0V4cGFuZGFibGVJY29uXCI+XHJcbiAgICAgICAgICAgICAge3sgYWRkTmFtZUNvbHVtbkV4cGFuZCB9fVxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCJoYXNBY3Rpb25zXCI+e3sgJ2FwcC5sYWJlbC5hY3Rpb25zJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cInNlbGVjdGlvblR5cGUgPT09ICdyYWRpb2J1dHRvbidcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRDb2xTdHlsZShjb2wpXCJcclxuICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5ub3RTb3J0YWJsZSA/ICcnIDogY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICBwUmVvcmRlcmFibGVDb2x1bW5cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgY29sLmhlYWRlciB9fTwvc3Bhbj4gPHAtc29ydEljb24gKm5nSWY9XCIhY29sLm5vdFNvcnRhYmxlXCIgW2ZpZWxkXT1cImNvbC5maWVsZFwiPjwvcC1zb3J0SWNvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhIGxldC1pdGVtIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCIgbGV0LWluZGV4PVwicm93SW5kZXhcIj5cclxuICAgICAgICAgIDx0clxyXG4gICAgICAgICAgICBjbGFzcz1cInJvd1wiXHJcbiAgICAgICAgICAgIFtwU2VsZWN0YWJsZVJvd109XCJyb3dEYXRhXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBleHBhbmRhYmxlOiBleHBhbmRhYmxlIH1cIlxyXG4gICAgICAgICAgICBbcFJvd1RvZ2dsZXJdPVwiZXhwYW5kYWJsZSA/IGl0ZW0gOiB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Sb3dDbGljayhpdGVtKVwiXHJcbiAgICAgICAgICAgIFtwUmVvcmRlcmFibGVSb3ddPVwiaW5kZXhcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVvcmRlcmFibGVDb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwibWF4LXdpZHRoOiAzcmVtOyBwYWRkaW5nLWxlZnQ6IDEwcHhcIiBjbGFzcz1cImp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpIHBpLWJhcnNcIiBwUmVvcmRlcmFibGVSb3dIYW5kbGU+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0aW9uVHlwZSA9PT0gJ2NoZWNrYm94J1wiPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDogM3JlbTsgcGFkZGluZy1sZWZ0OiAxMHB4XCIgY2xhc3M9XCJqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPHAtdGFibGVDaGVja2JveCBbdmFsdWVdPVwiaXRlbVwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkQ2hlY2tCb3hcIj48L3AtdGFibGVDaGVja2JveD5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGlvblR5cGUgPT09ICdyYWRpb2J1dHRvbidcIj5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJtYXgtd2lkdGg6IDNyZW07IHBhZGRpbmctbGVmdDogMTBweFwiIGNsYXNzPVwianVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlUmFkaW9CdXR0b24gW3ZhbHVlXT1cIml0ZW1cIj48L3AtdGFibGVSYWRpb0J1dHRvbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaGFzRXhwYW5kYWJsZUljb25cIiBzdHlsZT1cIm1heC13aWR0aDogMTUwcHhcIiBjbGFzcz1cImNlbnRlcmVkXCI+XHJcbiAgICAgICAgICAgICAgPHAtbWVudSAjbWVudSBbbW9kZWxdPVwiaXRlbS5hY3Rpb25zXCIgW3BvcHVwXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIj48L3AtbWVudT5cclxuICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgICAgIGV4cGFuZGVkID8gJ2FjdGlvbnMtbWVudS1idXR0b24gcGkgcGktY2hldnJvbi1kb3duJyA6ICdhY3Rpb25zLW1lbnUtYnV0dG9uIHBpIHBpLWNoZXZyb24tcmlnaHQnXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImhhc0FjdGlvbnNcIj5cclxuICAgICAgICAgICAgICA8cC1tZW51ICNtZW51IFttb2RlbF09XCJpdGVtLmFjdGlvbnNcIiBbcG9wdXBdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiPjwvcC1tZW51PlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiYWN0aW9ucy1tZW51LWJ1dHRvbiBmYXMgZmEtY29nXCIgKGNsaWNrKT1cIm1lbnUudG9nZ2xlKCRldmVudClcIj48L2k+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbENlbGwoY29sKVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNlbGxcIlxyXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJnZXRDZWxsQ29udGVudChpdGVtLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2wgJiYgY29sLmNsaWNrRnVuY3Rpb24gJiYgY29sLmNsaWNrRnVuY3Rpb24oaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Q29sU3R5bGUoY29sKVwiXHJcbiAgICAgICAgICAgICAgPjwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIighaXNIdG1sQ2VsbChjb2wpICYmICEhY29sLmdldFN0YXR1cykgfHwgaXNTY29yZUNlbGwoY29sKVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNlbGxcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbCAmJiBjb2wuY2xpY2tGdW5jdGlvbiAmJiBjb2wuY2xpY2tGdW5jdGlvbihpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRDb2xTdHlsZShjb2wpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8dmVjdG9yLWJhZGdlXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNCYWRnZUNlbGwoY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJnZXRDZWxsVGV4dChpdGVtLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiY29sLmdldFN0YXR1cyAmJiBjb2wuZ2V0U3RhdHVzKGl0ZW1bY29sLmZpZWxkXSlcIlxyXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCJnZXRUb29sdGlwVGV4dChpdGVtLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgID48L3ZlY3Rvci1iYWRnZT5cclxuICAgICAgICAgICAgICAgIDx2ZWN0b3Itc2NvcmUgKm5nSWY9XCJpc1Njb3JlQ2VsbChjb2wpXCIgW3Njb3JlXT1cIml0ZW1bY29sLmZpZWxkXVwiPjwvdmVjdG9yLXNjb3JlPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgIDx0ciBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJuby1yZXN1bHRzXCIgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW5zLmxlbmd0aCArIDFcIj5OZW5odW0gcmVzdWx0YWRvIGVuY29udHJhZG88L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJwYWdpbmF0b3JyaWdodFwiPiA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJwYWdpbmF0b3Jkcm9wZG93bml0ZW1cIj4ge3sgaXRlbS52YWx1ZSB9fSA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJyb3dleHBhbnNpb25cIiBsZXQtaXRlbT5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiY29sdW1ucy5sZW5ndGggKyAoaGFzQWN0aW9ucyA/IDEgOiAwKVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJleHBhbnNpb25UZW1wbGF0ZTsgY29udGV4dDogeyBpdGVtIH1cIj4gPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvcC10YWJsZT5cclxuICAgIDwvdmVjdG9yLXBhbmVsPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|
|
422
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVjdG9yLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkcy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZlY3Rvci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFnQyxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RSxPQUFPLEVBQXVDLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQWUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7OztBQU83RSxNQUFNLE9BQU8sa0JBQWtCO0lBRzdCLElBQ1csSUFBSSxDQUFDLEtBQVk7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFB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O3NCQUQ1QixLQUFLO2dCQUdDLE9BQU87c0JBRGIsS0FBSztnQkFHQyxZQUFZO3NCQURsQixLQUFLO2dCQUdDLFVBQVU7c0JBRGhCLEtBQUs7Z0JBR0MsaUJBQWlCO3NCQUR2QixLQUFLO2dCQUdLLElBQUk7c0JBRGQsS0FBSztnQkFNQyxhQUFhO3NCQURuQixLQUFLO2dCQUdDLHFCQUFxQjtzQkFEM0IsS0FBSztnQkFHQyxVQUFVO3NCQURoQixLQUFLO2dCQUdDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFHQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUssYUFBYTtzQkFEdkIsS0FBSztnQkFlQyxhQUFhO3NCQURuQixLQUFLO2dCQUdLLE1BQU07c0JBRGhCLEtBQUs7Z0JBb0JDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFHQyxlQUFlO3NCQURyQixLQUFLO2dCQUdDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxVQUFVO3NCQURoQixNQUFNO2dCQUdBLFFBQVE7c0JBRGQsTUFBTTtnQkFHQSxLQUFLO3NCQURYLE1BQU07Z0JBR0EsYUFBYTtzQkFEbkIsTUFBTTtnQkFHQSxXQUFXO3NCQURqQixNQUFNO2dCQUdBLGNBQWM7c0JBRHBCLE1BQU07Z0JBR0EsZUFBZTtzQkFEckIsTUFBTTtnQkFHQSxhQUFhO3NCQURuQixNQUFNO2dCQUdBLFdBQVc7c0JBRGpCLE1BQU07Z0JBSUEsYUFBYTtzQkFEbkIsS0FBSztnQkFHQywyQkFBMkI7c0JBRGpDLEtBQUs7Z0JBR0Msa0JBQWtCO3NCQUR4QixLQUFLO2dCQUlDLGdCQUFnQjtzQkFEdEIsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ2x1eG9uJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRmlsdGVyQ2hhbmdlZEV2ZW50LCBMaXN0SXRlbSwgU3RhdHVzIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgRGF0YVRhYmxlTGF6eUxvYWRFdmVudCwgVGFibGVDb2x1bW4sIFRhYmxlQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kYXRhLXRhYmxlLm1vZGVsJztcclxuaW1wb3J0IHsgTWFza1V0aWwgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XHJcbmltcG9ydCB7IEZpbHRlckZpZWxkLCBGaWx0ZXJzQ29tcG9uZW50IH0gZnJvbSAnLi4vZmlsdGVycy9maWx0ZXJzLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3ZlY3Rvci1kYXRhLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGNvbHVtbnM6IFRhYmxlQ29sdW1uW10gPSBbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgZGF0YShfZGF0YTogYW55W10pIHtcclxuICAgIHRoaXMuX2RhdGEgPSBfZGF0YTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuX2RhdGE/LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zZWxlY3RlZCkgfHwgW107XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgZGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuICBwcml2YXRlIF9kYXRhOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGV4cG9ydEV4Y2VsID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZXhwb3J0UERGID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY3VzdG9tRnVuY3Rpb246IHsgbGFiZWw6IHN0cmluZzsgaWNvbj86IHN0cmluZzsgY2xpY2tGdW5jdGlvbjogRnVuY3Rpb24gfVtdIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHRvdGFsUmVjb3JkcyA9IDA7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGlzYWJsZWRIZWFkZXJjaGVja2JveCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGZpbHRlcnM6IEZpbHRlckZpZWxkW10gPSBbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhZGRJdGVtTGFiZWwgPSAnJztcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBwYWdpbmF0aW9uID0gdHJ1ZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyB2aXJ0dWFsUGFnaW5hdGlvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCB0YWJzKF90YWJzOiBMaXN0SXRlbVtdKSB7XHJcbiAgICB0aGlzLl90YWJzID0gX3RhYnM7XHJcbiAgICB0aGlzLl90YWJTZWxlY3RlZCA9IF90YWJzWzBdO1xyXG4gIH1cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjdXN0b21CdXR0b25zOiB7IGxhYmVsOiBzdHJpbmc7IGNsaWNrRnVuY3Rpb246IEZ1bmN0aW9uIH1bXSB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhZGRJdGVtQnV0dG9uUGx1c1NpZ24gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBoYXNBY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBoYXNFeHBhbmRhYmxlSWNvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGFkZE5hbWVDb2x1bW5FeHBhbmQgPSAnJztcclxuICBASW5wdXQoKSBleHBhbmRhYmxlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZXhwYW5zaW9uVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbDtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgc2VsZWN0aW9uTW9kZShfc2VsZWN0aW9uTW9kZSkge1xyXG4gICAgc3dpdGNoIChfc2VsZWN0aW9uTW9kZSkge1xyXG4gICAgICBjYXNlICdzaW5nbGUnOlxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGUgPSAnc2luZ2xlJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbXVsdGlwbGUnOlxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGUgPSAnbXVsdGlwbGUnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGUgPSBudWxsO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZWxlY3Rpb25UeXBlOiAnY2hlY2tib3gnIHwgJ3JhZGlvYnV0dG9uJyB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBoZWlnaHQoX2hlaWdodDogc3RyaW5nKSB7XHJcbiAgICBzd2l0Y2ggKF9oZWlnaHQpIHtcclxuICAgICAgY2FzZSAnc21hbGwnOlxyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9ICczMDBweCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ21lZGl1bSc6XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gJzUwMHB4JztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbGFyZ2UnOlxyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9ICc3MDBweCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2Z1bGwnOlxyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9ICdmbGV4JztcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSAnMzAwcHgnO1xyXG4gICAgfVxyXG4gIH1cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaG93TGltaXRCYWxhbmNlID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd0RhdGFCYWxhbmNlID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGF0YUFjY291bnRCYWxhbmNlOiB7IHZpc2libGU6IGJvb2xlYW47IG5hbWU6IHN0cmluZzsgdmFsdWVCYWxhbmNlOiBudW1iZXI7IHNob3dCYWxhbmNlOiBib29sZWFuIH1bXSA9IFtdO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgb25MYXp5TG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlTGF6eUxvYWRFdmVudD4oKTtcclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgb25GaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgb25BZGQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIG9uRXhwb3J0RXhjZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIG9uRXhwb3J0UERGID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBvblNlbGVjdGVkUm93cyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBvbkZpbHRlckNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbHRlckNoYW5nZWRFdmVudD4oKTtcclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgb25UYWJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TGlzdEl0ZW0+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIG9uRXhwYW5kUm93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZmlyc3RMYXp5TG9hZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNob3VsZExhenlMb2FkV2l0aG91dEZpbHRlciA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHJlb3JkZXJhYmxlQ29sdW1ucyA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKEZpbHRlcnNDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcHVibGljIGZpbHRlcnNDb21wb25lbnQ6IEZpbHRlcnNDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW1zOiBhbnkgPSBbXTtcclxuXHJcbiAgZ2V0IGJhbGFuY2UoKTogKGl0ZW1BY2NvdW50PzogYW55KSA9PiBudW1iZXIgfCBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChpdGVtQWNjb3VudD86IGFueSk6IG51bWJlciB8IHN0cmluZyA9PiB7XHJcbiAgICAgIHJldHVybiBpdGVtQWNjb3VudC5zaG93QmFsYW5jZVxyXG4gICAgICAgID8gaXRlbUFjY291bnQudmFsdWVCYWxhbmNlLnRvTG9jYWxlU3RyaW5nKCdwdC1CUicsIHtcclxuICAgICAgICAgICAgY3VycmVuY3k6ICdCUkwnLFxyXG4gICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIsXHJcbiAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMixcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgOiAnLSwtLSc7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRhYnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFicztcclxuICB9XHJcbiAgZ2V0IGhlaWdodCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XHJcbiAgfVxyXG4gIGdldCBzZWxlY3Rpb25Nb2RlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyB8ICdtdWx0aXBsZScgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9oZWlnaHQ6IHN0cmluZyA9ICdzbWFsbCc7XHJcbiAgcHJpdmF0ZSBfdGFiczogTGlzdEl0ZW1bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2RyYXcgPSAxO1xyXG4gIHByaXZhdGUgX2ZpcnN0TGF6eUxvYWRlZERvbmUgPSB0aGlzLmZpcnN0TGF6eUxvYWQ7XHJcbiAgcHJpdmF0ZSBfbGFzdExhenlMb2FkRXZlbnQ6IERhdGFUYWJsZUxhenlMb2FkRXZlbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfdGFiU2VsZWN0ZWQ6IExpc3RJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2ZpbHRlclN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGNkOiBDaGFuZ2VEZXRlY3RvclJlZikge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgIHRoaXMuaGVpZ2h0ID0gJ3NtYWxsJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbiB8fCB0aGlzLnZpcnR1YWxQYWdpbmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyc0NvbXBvbmVudD8uc2VhcmNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpbHRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29sU3R5bGUoY29sOiBUYWJsZUNvbHVtbikge1xyXG4gICAgcmV0dXJuIHsgJ21pbi13aWR0aCc6IGNvbC53aWR0aCB9O1xyXG4gIH1cclxuXHJcbiAgbGF6eUxvYWRlZChwYXJhbXM6IHsgZmlsdGVyOiBib29sZWFuOyBkYXRhOiBhbnkgfSA9IHsgZmlsdGVyOiBmYWxzZSwgZGF0YTogeyBzdGFydDogMCwgcm93czogMTAgfSB9KSB7XHJcbiAgICBpZiAoIXBhcmFtcy5maWx0ZXIgJiYgIXRoaXMuc2hvdWxkTGF6eUxvYWRXaXRob3V0RmlsdGVyKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2wpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgZGF0YTogY29sLmZpZWxkLFxyXG4gICAgICAgICAgbmFtZTogYCR7Y29sLmZpZWxkLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpfSR7Y29sLmZpZWxkLnN1YnN0cmluZygxLCBjb2wuZmllbGQubGVuZ3RoKX1gLFxyXG4gICAgICAgICAgb3JkZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgc2VhcmNoOiB7IHZhbHVlOiAnJywgcmVnZXg6IGZhbHNlIH0sXHJcbiAgICAgICAgICBzZWFyY2hhYmxlOiB0cnVlLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodGhpcy5oYXNBY3Rpb25zKSB7XHJcbiAgICAgICAgY29sdW1ucy51bnNoaWZ0KHtcclxuICAgICAgICAgIGRhdGE6ICdhY3RpdmUnLFxyXG4gICAgICAgICAgbmFtZTogJ0FjdGl2ZScsXHJcbiAgICAgICAgICBvcmRlcmFibGU6IHRydWUsXHJcbiAgICAgICAgICBzZWFyY2g6IHsgdmFsdWU6ICcnLCByZWdleDogZmFsc2UgfSxcclxuICAgICAgICAgIHNlYXJjaGFibGU6IHRydWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fbGFzdExhenlMb2FkRXZlbnQgPSB7XHJcbiAgICAgICAgLi4uKHRoaXMuX2xhc3RMYXp5TG9hZEV2ZW50IHx8ICh7fSBhcyBhbnkpKSxcclxuICAgICAgICBwYWdlOiBwYXJhbXMuZGF0YS5maXJzdCAvIHBhcmFtcy5kYXRhLnJvd3MgKyAxLFxyXG4gICAgICAgIHN0YXJ0OiBwYXJhbXMuZGF0YS5maXJzdCxcclxuICAgICAgICBsZW5ndGg6IHBhcmFtcy5kYXRhLnJvd3MsXHJcbiAgICAgICAgZHJhdzogdGhpcy5fZHJhdysrLFxyXG4gICAgICAgIG9yZGVyOiBwYXJhbXMuZGF0YS5zb3J0RmllbGRcclxuICAgICAgICAgID8gW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbHVtbjpcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmRJbmRleCgoY29sKSA9PiBjb2wuZmllbGQgPT09IHBhcmFtcy5kYXRhLnNvcnRGaWVsZCkgKyAodGhpcy5oYXNBY3Rpb25zID8gMSA6IDApLFxyXG4gICAgICAgICAgICAgICAgZGlyOiBwYXJhbXMuZGF0YS5zb3J0T3JkZXIgPiAwID8gJ2FzYycgOiAnZGVzYycsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgOiBbeyBjb2x1bW46IDAsIGRpcjogJ2Rlc2MnIH1dLFxyXG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXHJcbiAgICAgICAgdGFiOiB0aGlzLl90YWJTZWxlY3RlZCxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2xhc3RMYXp5TG9hZEV2ZW50ID0ge1xyXG4gICAgICAgIC4uLnRoaXMuX2xhc3RMYXp5TG9hZEV2ZW50LFxyXG4gICAgICAgIC4uLnBhcmFtcy5kYXRhLFxyXG4gICAgICAgIHN0YXJ0OiAwLFxyXG4gICAgICB9O1xyXG4gICAgICBpZiAodGhpcy5fdGFiU2VsZWN0ZWQpIHtcclxuICAgICAgICB0aGlzLl9sYXN0TGF6eUxvYWRFdmVudCA9IHtcclxuICAgICAgICAgIC4uLih0aGlzLl9sYXN0TGF6eUxvYWRFdmVudCB8fCAoe30gYXMgYW55KSksXHJcbiAgICAgICAgICAuLi57IFN0YXR1czogdGhpcy5fdGFiU2VsZWN0ZWQuY29kZSB9LFxyXG4gICAgICAgICAgdGFiOiB0aGlzLl90YWJTZWxlY3RlZCxcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpcnN0TGF6eUxvYWRlZERvbmUgfHwgdGhpcy5maXJzdExhenlMb2FkKSB7XHJcbiAgICAgIHRoaXMub25MYXp5TG9hZC5lbWl0KHRoaXMuX2xhc3RMYXp5TG9hZEV2ZW50KTtcclxuICAgIH1cclxuICAgIHRoaXMuX2ZpcnN0TGF6eUxvYWRlZERvbmUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2VsbENvbnRlbnQoaXRlbTogYW55LCBjb2w6IFRhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBjZWxsVGV4dCA9IHRoaXMuZ2V0Q2VsbFRleHQoaXRlbSwgY29sKTtcclxuICAgIGxldCBjb250ZW50ID0gYDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj4ke2NvbC5oZWFkZXJ9PC9zcGFuPjxzcGFuIGNsYXNzPVwidy0xMDBcIj5gO1xyXG4gICAgaWYgKFxyXG4gICAgICAhY29sLnR5cGUgfHxcclxuICAgICAgW1RhYmxlQ29sdW1uVHlwZS5FTlVNLCBUYWJsZUNvbHVtblR5cGUuVEVYVCwgVGFibGVDb2x1bW5UeXBlLkRBVEVUSU1FLCBUYWJsZUNvbHVtblR5cGUuREFURV0uaW5jbHVkZXMoY29sLnR5cGUpXHJcbiAgICApIHtcclxuICAgICAgY29udGVudCArPSBjZWxsVGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKGNvbC50eXBlKSB7XHJcbiAgICAgIGNhc2UgVGFibGVDb2x1bW5UeXBlLkNVU1RPTV9TVFlMRTpcclxuICAgICAgICBjb250ZW50ICs9IGA8c3BhbiBjbGFzcz1cIiR7Y29sLnRleHRGaWVsZENsYXNzID8gaXRlbVtjb2wudGV4dEZpZWxkQ2xhc3NdIDogJyd9XCI+JHtjZWxsVGV4dH08L3NwYW4+YDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuQk9PTEVBTjpcclxuICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJlZFwiPjxpIGNsYXNzPVwiIHN0YXR1cy10YWJsZS1maWVsZCBmYXMgZmEtJHtcclxuICAgICAgICAgIGNlbGxUZXh0ID8gJ2NoZWNrIGJvb2xlYW4tdmFsdWUtcG9zaXRpdmUnIDogJ3RpbWVzIGJvb2xlYW4tdmFsdWUtbmVnYXRpdmUnXHJcbiAgICAgICAgfVwiPjwvaT48L2Rpdj5gO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5TVEFUVVNfQkFER0U6XHJcbiAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyZWRcIj48aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUgc3RhdHVzLXRhYmxlLWZpZWxkICR7dGhpcy5nZXRTdGF0dXNDb2xvcihcclxuICAgICAgICAgIGNlbGxUZXh0XHJcbiAgICAgICAgKX1cIj48L2k+PC9kaXY+YDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuQUNUSVZFX0JPT0xFQU5fQkFER0U6XHJcbiAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyZWRcIj48aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUgc3RhdHVzLXRhYmxlLWZpZWxkICR7dGhpcy5nZXRBY3RpdmVTdGF0dXNDb2xvcihcclxuICAgICAgICAgIGNlbGxUZXh0XHJcbiAgICAgICAgKX1cIj48L2k+PC9kaXY+YDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuQlVUVE9OOlxyXG4gICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlcmVkXCI+PGkgY2xhc3M9XCIke1xyXG4gICAgICAgICAgY29sLmljb24gfHwgJ2ZhcyBmYS1jaXJjbGUnXHJcbiAgICAgICAgfSBzdGF0dXMtdGFibGUtZmllbGQgdGFibGUtYnV0dG9uXCI+PC9pPjwvZGl2PmA7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgVGFibGVDb2x1bW5UeXBlLk1BU0s6XHJcbiAgICAgICAgY29udGVudCArPSBNYXNrVXRpbC5kb01hc2tTdHJpbmcoY2VsbFRleHQsIGNvbC5tYXNrKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuQ1VSUkVOQ1k6XHJcbiAgICAgICAgY29udGVudCArPSBOdW1iZXIoY2VsbFRleHQpLnRvTG9jYWxlU3RyaW5nKCdwdC1CUicsIHtcclxuICAgICAgICAgIGN1cnJlbmN5OiBjb2wuY3VycmVuY3lUeXBlIHx8ICdCUkwnLFxyXG4gICAgICAgICAgY3VycmVuY3lEaXNwbGF5OiAnbmFycm93U3ltYm9sJyxcclxuICAgICAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnRlbnQgKz0gYDwvc3Bhbj5gO1xyXG4gICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2VsbFRleHQoaXRlbTogYW55LCBjb2w6IFRhYmxlQ29sdW1uKSB7XHJcbiAgICBpZiAoY29sLmdldEVudW1UcmFuc2xhdGVkKSB7XHJcbiAgICAgIHJldHVybiBjb2wuZ2V0RW51bVRyYW5zbGF0ZWQoaXRlbVtjb2wuZmllbGRdKTtcclxuICAgIH1cclxuICAgIGlmIChjb2wudHlwZSA9PT0gVGFibGVDb2x1bW5UeXBlLkRBVEVUSU1FICYmIGl0ZW1bY29sLmZpZWxkXSkge1xyXG4gICAgICBjb25zdCBkYXRlVGltZSA9XHJcbiAgICAgICAgaXRlbVtjb2wuZmllbGRdIGluc3RhbmNlb2YgRGF0ZSA/IERhdGVUaW1lLmZyb21KU0RhdGUoaXRlbVtjb2wuZmllbGRdKSA6IERhdGVUaW1lLmZyb21JU08oaXRlbVtjb2wuZmllbGRdKTtcclxuICAgICAgcmV0dXJuIGRhdGVUaW1lLnRvVVRDKCkudG9Gb3JtYXQoJ2RkL01NL3l5eXkgSEg6bW0nKTtcclxuICAgIH1cclxuICAgIGlmIChjb2wudHlwZSA9PT0gVGFibGVDb2x1bW5UeXBlLkRBVEUgJiYgaXRlbVtjb2wuZmllbGRdKSB7XHJcbiAgICAgIGNvbnN0IGRhdGVUaW1lID1cclxuICAgICAgICBpdGVtW2NvbC5maWVsZF0gaW5zdGFuY2VvZiBEYXRlID8gRGF0ZVRpbWUuZnJvbUpTRGF0ZShpdGVtW2NvbC5maWVsZF0pIDogRGF0ZVRpbWUuZnJvbUlTTyhpdGVtW2NvbC5maWVsZF0pO1xyXG4gICAgICByZXR1cm4gZGF0ZVRpbWUudG9VVEMoKS50b0Zvcm1hdCgnZGQvTU0veXl5eScpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbC50eXBlID09PSBUYWJsZUNvbHVtblR5cGUuU1RBQ0tfQkFER0UpIHtcclxuICAgICAgaWYgKCFpdGVtW2NvbC5maWVsZF0ubGVuZ3RoIHx8IGl0ZW1bY29sLmZpZWxkXS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICByZXR1cm4gaXRlbVtjb2wuZmllbGRdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBgKyR7aXRlbVtjb2wuZmllbGRdLmxlbmd0aH1gO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY29sLnR5cGUgPT09IFRhYmxlQ29sdW1uVHlwZS5TVEFUVVNfQkFER0UpIHtcclxuICAgICAgcmV0dXJuIGl0ZW1bY29sLmZpZWxkXSA9PSAwID8gMCA6IGl0ZW1bY29sLmZpZWxkXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXRlbVtjb2wuZmllbGQgfHwgJyddIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRvb2x0aXBUZXh0KGl0ZW06IGFueSwgY29sOiBUYWJsZUNvbHVtbikge1xyXG4gICAgaWYgKFxyXG4gICAgICAhY29sLnR5cGUgfHxcclxuICAgICAgIVtUYWJsZUNvbHVtblR5cGUuU1RBQ0tfQkFER0VdLmluY2x1ZGVzKGNvbC50eXBlKSB8fFxyXG4gICAgICAhQXJyYXkuaXNBcnJheShpdGVtW2NvbC5maWVsZF0pIHx8XHJcbiAgICAgIGl0ZW1bY29sLmZpZWxkXS5sZW5ndGggPT09IDFcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbVtjb2wuZmllbGRdKSkge1xyXG4gICAgICByZXR1cm4gaXRlbVtjb2wuZmllbGRdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGl0ZW1bY29sLmZpZWxkXS5qb2luKCcgLSAnKTtcclxuICB9XHJcblxyXG4gIG9uVGFiQ2hhbmdlKCRldmVudDogYW55KSB7XHJcbiAgICB0aGlzLl90YWJTZWxlY3RlZCA9IHRoaXMudGFic1skZXZlbnQuaW5kZXhdO1xyXG4gICAgdGhpcy5sYXp5TG9hZGVkKHsgZmlsdGVyOiB0cnVlLCBkYXRhOiB7fSB9KTtcclxuICAgIHRoaXMub25UYWJTZWxlY3RlZC5lbWl0KHRoaXMuX3RhYlNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmliZVRvRmlsdGVyQ2hhbmdlcygpIHtcclxuICAgIHRoaXMuX2ZpbHRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5fZmlsdGVyU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzQ29tcG9uZW50Py5mb3JtR3JvdXAuY29udHJvbHMgfHwge30pLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICB0aGlzLl9maWx0ZXJTdWJzY3JpcHRpb24uYWRkKFxyXG4gICAgICAgIHRoaXMuZmlsdGVyc0NvbXBvbmVudD8uZm9ybUdyb3VwXHJcbiAgICAgICAgICAuZ2V0KGtleSlcclxuICAgICAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uRmlsdGVyQ2hhbmdlZC5lbWl0KHsgZmllbGQ6IGtleSwgdmFsdWUgfSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm9uRmlsdGVyQ2hhbmdlZC5lbWl0KHsgZmllbGQ6IGtleSwgdmFsdWU6IHRoaXMuZmlsdGVyc0NvbXBvbmVudD8uZm9ybUdyb3VwLmdldChrZXkpPy52YWx1ZSB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25Sb3dDbGljayhpdGVtOiBhbnkpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5vbkV4cGFuZFJvdy5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxpc3RIYXNBY3Rpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zb21lKChpdGVtKSA9PiBpdGVtLmFjdGlvbnM/Lmxlbmd0aCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hhbmdlU2VsZWN0ZWRJdGVtcyh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLm9uU2VsZWN0ZWRSb3dzLmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0h0bWxDZWxsKGNvbDogVGFibGVDb2x1bW4pIHtcclxuICAgIHJldHVybiAhY29sLnR5cGUgfHwgIXRoaXMuaXNCYWRnZUNlbGwoY29sKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0JhZGdlQ2VsbChjb2w6IFRhYmxlQ29sdW1uKSB7XHJcbiAgICByZXR1cm4gY29sLnR5cGUgJiYgW1RhYmxlQ29sdW1uVHlwZS5URVhUX0JBREdFLCBUYWJsZUNvbHVtblR5cGUuU1RBQ0tfQkFER0VdLmluY2x1ZGVzKGNvbC50eXBlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1Njb3JlQ2VsbChjb2w6IFRhYmxlQ29sdW1uKSB7XHJcbiAgICByZXR1cm4gY29sLnR5cGUgPT09IFRhYmxlQ29sdW1uVHlwZS5TQ09SRTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNlbGVjdGlvbkNoYW5nZShzZWxlY3Rpb246IGFueSkge1xyXG4gICAgZm9yIChsZXQgaSA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBsZXQgZGF0YSA9IHNlbGVjdGlvbltpXTtcclxuICAgICAgaWYgKGRhdGEuZGlzYWJsZWRDaGVja0JveCkge1xyXG4gICAgICAgIHNlbGVjdGlvbi5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGFuZ2VTaG93QmFsYW5jZShpdGVtQWNjb3VudD86IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGl0ZW1BY2NvdW50KSB7XHJcbiAgICAgIGl0ZW1BY2NvdW50LnNob3dCYWxhbmNlID0gIWl0ZW1BY2NvdW50LnNob3dCYWxhbmNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGF0dXNDb2xvcihzdGF0dXM6IFN0YXR1cykge1xyXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcclxuICAgICAgY2FzZSBTdGF0dXMuUEVORElORzpcclxuICAgICAgICByZXR1cm4gJ3dhcm5pbmcnO1xyXG4gICAgICBjYXNlIFN0YXR1cy5BUFBST1ZFRDpcclxuICAgICAgICByZXR1cm4gJ3N1Y2Nlc3MnO1xyXG4gICAgICBjYXNlIFN0YXR1cy5SRUpFQ1RFRDpcclxuICAgICAgICByZXR1cm4gJ2Vycm9yJztcclxuICAgICAgY2FzZSBTdGF0dXMuSU5GTzpcclxuICAgICAgICByZXR1cm4gJ2luZm8nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRBY3RpdmVTdGF0dXNDb2xvcihhY3RpdmU6IGJvb2xlYW4pIHtcclxuICAgIHJldHVybiBhY3RpdmUgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDx2ZWN0b3ItZmlsdGVyc1xyXG4gICAgICBbZmllbGRzXT1cImZpbHRlcnNcIlxyXG4gICAgICAob25TZWFyY2gpPVwibGF6eUxvYWRlZCh7IGZpbHRlcjogdHJ1ZSwgZGF0YTogJGV2ZW50IH0pXCJcclxuICAgICAgKGZvcm1CdWlsZGVkKT1cInN1YnNjcmliZVRvRmlsdGVyQ2hhbmdlcygpXCJcclxuICAgID48L3ZlY3Rvci1maWx0ZXJzPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXItYWN0aW9ucyBmaWVsZFwiICpuZ0lmPVwiYWRkSXRlbUxhYmVsIHx8IGV4cG9ydEV4Y2VsIHx8IGV4cG9ydFBERiB8fCBjdXN0b21GdW5jdGlvblwiPlxyXG4gICAgPGJ1dHRvbiAqbmdJZj1cImV4cG9ydEV4Y2VsXCIgKGNsaWNrKT1cIm9uRXhwb3J0RXhjZWwuZW1pdCgpXCIgY2xhc3M9XCJleHBvcnQtYnV0dG9uIGV4cG9ydC1leGNlbFwiPlxyXG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1maWxlLWV4Y2VsXCI+PC9pPjxzcGFuPkV4Y2VsPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiZXhwb3J0UERGXCIgKGNsaWNrKT1cIm9uRXhwb3J0UERGLmVtaXQoKVwiIGNsYXNzPVwiZXhwb3J0LWJ1dHRvbiBleHBvcnQtcGRmXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZpbGUtcGRmXCI+PC9pPjxzcGFuPlBERjwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGN1c3RvbUZ1bmN0aW9uXCJcclxuICAgICAgKGNsaWNrKT1cImJ1dHRvbi5jbGlja0Z1bmN0aW9uKClcIlxyXG4gICAgICBjbGFzcz1cImV4cG9ydC1idXR0b24gY3VzdG9tLWZ1bmN0aW9uXCJcclxuICAgID5cclxuICAgICAgPGkgKm5nSWY9XCJidXR0b24/Lmljb25cIiBjbGFzcz1cInt7IGJ1dHRvbj8uaWNvbiB9fVwiPjwvaT48c3Bhbj57eyBidXR0b24/LmxhYmVsIH19PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPHZlY3Rvci1idXR0b25cclxuICAgICAgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBjdXN0b21CdXR0b25zXCJcclxuICAgICAgY2xhc3M9XCJhZGQtaXRlbS1idXR0b25cIlxyXG4gICAgICBbcm91bmRdPVwidHJ1ZVwiXHJcbiAgICAgIFtsYWJlbF09XCJidXR0b24ubGFiZWxcIlxyXG4gICAgICAoY2xpY2spPVwiYnV0dG9uLmNsaWNrRnVuY3Rpb24oKVwiXHJcbiAgICAgIFtyaWdodEljb25dPVwiYWRkSXRlbUJ1dHRvblBsdXNTaWduID8gJ3BpIHBpLXBsdXMnIDogJydcIlxyXG4gICAgPjwvdmVjdG9yLWJ1dHRvbj5cclxuICAgIDx2ZWN0b3ItYnV0dG9uXHJcbiAgICAgICpuZ0lmPVwiYWRkSXRlbUxhYmVsXCJcclxuICAgICAgY2xhc3M9XCJhZGQtaXRlbS1idXR0b25cIlxyXG4gICAgICBbbGFiZWxdPVwiYWRkSXRlbUxhYmVsXCJcclxuICAgICAgKGNsaWNrKT1cIm9uQWRkLmVtaXQoKVwiXHJcbiAgICAgIFtyaWdodEljb25dPVwiYWRkSXRlbUJ1dHRvblBsdXNTaWduID8gJ3BpIHBpLXBsdXMnIDogJydcIlxyXG4gICAgICBbcm91bmRdPVwidHJ1ZVwiXHJcbiAgICA+PC92ZWN0b3ItYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG4gIEBpZihzaG93TGltaXRCYWxhbmNlKXtcclxuICA8ZGl2IGNsYXNzPVwiY29sLTEyIGdyaWQgbWwtMFwiPlxyXG4gICAgQGZvciAoaXRlbUFjY291bnQgb2YgZGF0YUFjY291bnRCYWxhbmNlOyB0cmFjayAkaW5kZXgpIHsgQGlmKGl0ZW1BY2NvdW50LnZpc2libGUpe1xyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgYmFsYW5jZS1jb250YWluZXJcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLWhlYWRlclwiPnt7IGl0ZW1BY2NvdW50Lm5hbWUgfX08L3NwYW4+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnQgdmFsdWUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPHNwYW4+UiQgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbUFjY291bnQuc2hvd0JhbGFuY2VcIiBjbGFzcz1cImJhbGFuY2VcIj57eyBiYWxhbmNlKGl0ZW1BY2NvdW50KSB9fTwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGlkZGVuLWJhbGFuY2VcIiAqbmdJZj1cIiFpdGVtQWNjb3VudC5zaG93QmFsYW5jZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGlcclxuICAgICAgICAgICAgY2xhc3M9XCJmYXNcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdmYS1leWUnOiAhaXRlbUFjY291bnQuc2hvd0JhbGFuY2UsICdmYS1leWUtc2xhc2gnOiBpdGVtQWNjb3VudC5zaG93QmFsYW5jZSB9XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVNob3dCYWxhbmNlKGl0ZW1BY2NvdW50KVwiXHJcbiAgICAgICAgICA+PC9pPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgfSB9XHJcbiAgPC9kaXY+XHJcblxyXG4gIH0gQGlmKHNob3dEYXRhQmFsYW5jZSl7XHJcbiAgPGRpdiBjbGFzcz1cImNvbC0xMiBncmlkIG1sLTBcIj5cclxuICAgIEBmb3IgKGl0ZW1BY2NvdW50IG9mIGRhdGFBY2NvdW50QmFsYW5jZTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBiYWxhbmNlLWNvbnRhaW5lclwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+e3sgaXRlbUFjY291bnQubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudCB2YWx1ZS1jb250YWluZXJcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImJhbGFuY2VcIj57eyBpdGVtQWNjb3VudC52YWx1ZUJhbGFuY2UgfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcblxyXG4gIH1cclxuXHJcbiAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgPHZlY3Rvci1wYW5lbCBjbGFzcz1cImRhdGEtdGFibGUtcGFuZWxcIj5cclxuICAgICAgPHAtdGFiVmlldyAob25DaGFuZ2UpPVwib25UYWJDaGFuZ2UoJGV2ZW50KVwiICpuZ0lmPVwidGFicz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgPHAtdGFiUGFuZWwgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJzXCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxlbSAqbmdJZj1cInRhYi5pY29uXCIgW2NsYXNzXT1cInRhYi5pY29uXCI+Jm5ic3A7PC9lbT5cclxuICAgICAgICAgICAgPHNwYW4+e3sgdGFiLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC10YWJQYW5lbD5cclxuICAgICAgPC9wLXRhYlZpZXc+XHJcbiAgICAgIDxwLXRhYmxlXHJcbiAgICAgICAgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cIk1vc3RyYW5kbyB7Zmlyc3R9IGF0w6kge2xhc3R9IGRlIHt0b3RhbFJlY29yZHN9IHJlZ2lzdHJvc1wiXHJcbiAgICAgICAgc29ydE1vZGU9XCJzaW5nbGVcIlxyXG4gICAgICAgIFtyb3dzXT1cIjEwXCJcclxuICAgICAgICBbbGF6eV09XCJwYWdpbmF0aW9uICYmICF2aXJ0dWFsUGFnaW5hdGlvblwiXHJcbiAgICAgICAgW3ZhbHVlXT1cImRhdGFcIlxyXG4gICAgICAgIFtwYWdpbmF0b3JdPVwicGFnaW5hdGlvblwiXHJcbiAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHNcIlxyXG4gICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXHJcbiAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJbMTAsIDI1LCA1MCwgMTAwXVwiXHJcbiAgICAgICAgW3Jlc3BvbnNpdmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgW3Jlc2l6YWJsZUNvbHVtbnNdPVwidHJ1ZVwiXHJcbiAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgc2Nyb2xsRGlyZWN0aW9uPVwidmVydGljYWxcIlxyXG4gICAgICAgIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgIGRhdGFLZXk9XCJpZFwiXHJcbiAgICAgICAgW3Njcm9sbEhlaWdodF09XCJoZWlnaHRcIlxyXG4gICAgICAgIFthdHRyLnNlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGVkSXRlbXNcIlxyXG4gICAgICAgIChvblJvd1NlbGVjdCk9XCJjaGFuZ2VTZWxlY3RlZEl0ZW1zKCRldmVudClcIlxyXG4gICAgICAgIChvbkhlYWRlckNoZWNrYm94VG9nZ2xlKT1cImNoYW5nZVNlbGVjdGVkSXRlbXMoJGV2ZW50KVwiXHJcbiAgICAgICAgKG9uUm93VW5zZWxlY3QpPVwiY2hhbmdlU2VsZWN0ZWRJdGVtcygkZXZlbnQpXCJcclxuICAgICAgICAob25MYXp5TG9hZCk9XCJsYXp5TG9hZGVkKHsgZmlsdGVyOiBmYWxzZSwgZGF0YTogJGV2ZW50IH0pXCJcclxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgIFtyZW9yZGVyYWJsZUNvbHVtbnNdPVwicmVvcmRlcmFibGVDb2x1bW5zXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgIDx0ciBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCJyZW9yZGVyYWJsZUNvbHVtbnNcIiBzdHlsZT1cIndpZHRoOiA1cmVtXCI+PC90aD5cclxuXHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cInNlbGVjdGlvblR5cGUgPT09ICdjaGVja2JveCdcIj5cclxuICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94IFtkaXNhYmxlZF09XCJkaXNhYmxlZEhlYWRlcmNoZWNrYm94XCI+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtY2VudGVyXCIgKm5nSWY9XCJoYXNFeHBhbmRhYmxlSWNvblwiPlxyXG4gICAgICAgICAgICAgIHt7IGFkZE5hbWVDb2x1bW5FeHBhbmQgfX1cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiaGFzQWN0aW9uc1wiPnt7ICdhcHAubGFiZWwuYWN0aW9ucycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCJzZWxlY3Rpb25UeXBlID09PSAncmFkaW9idXR0b24nXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Q29sU3R5bGUoY29sKVwiXHJcbiAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wubm90U29ydGFibGUgPyAnJyA6IGNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgcFJlb3JkZXJhYmxlQ29sdW1uXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvbC5oZWFkZXIgfX08L3NwYW4+IDxwLXNvcnRJY29uICpuZ0lmPVwiIWNvbC5ub3RTb3J0YWJsZVwiIFtmaWVsZF09XCJjb2wuZmllbGRcIj48L3Atc29ydEljb24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93RGF0YSBsZXQtaXRlbSBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiIGxldC1pbmRleD1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICA8dHJcclxuICAgICAgICAgICAgY2xhc3M9XCJyb3dcIlxyXG4gICAgICAgICAgICBbcFNlbGVjdGFibGVSb3ddPVwicm93RGF0YVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZXhwYW5kYWJsZTogZXhwYW5kYWJsZSB9XCJcclxuICAgICAgICAgICAgW3BSb3dUb2dnbGVyXT1cImV4cGFuZGFibGUgPyBpdGVtIDogdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2soaXRlbSlcIlxyXG4gICAgICAgICAgICBbcFJlb3JkZXJhYmxlUm93XT1cImluZGV4XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlb3JkZXJhYmxlQ29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIm1heC13aWR0aDogM3JlbTsgcGFkZGluZy1sZWZ0OiAxMHB4XCIgY2xhc3M9XCJqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaSBwaS1iYXJzXCIgcFJlb3JkZXJhYmxlUm93SGFuZGxlPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGlvblR5cGUgPT09ICdjaGVja2JveCdcIj5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJtYXgtd2lkdGg6IDNyZW07IHBhZGRpbmctbGVmdDogMTBweFwiIGNsYXNzPVwianVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cIml0ZW1cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZENoZWNrQm94XCI+PC9wLXRhYmxlQ2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25UeXBlID09PSAncmFkaW9idXR0b24nXCI+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwibWF4LXdpZHRoOiAzcmVtOyBwYWRkaW5nLWxlZnQ6IDEwcHhcIiBjbGFzcz1cImp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8cC10YWJsZVJhZGlvQnV0dG9uIFt2YWx1ZV09XCJpdGVtXCI+PC9wLXRhYmxlUmFkaW9CdXR0b24+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImhhc0V4cGFuZGFibGVJY29uXCIgc3R5bGU9XCJtYXgtd2lkdGg6IDE1MHB4XCIgY2xhc3M9XCJjZW50ZXJlZFwiPlxyXG4gICAgICAgICAgICAgIDxwLW1lbnUgI21lbnUgW21vZGVsXT1cIml0ZW0uYWN0aW9uc1wiIFtwb3B1cF09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLW1lbnU+XHJcbiAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxyXG4gICAgICAgICAgICAgICAgICBleHBhbmRlZCA/ICdhY3Rpb25zLW1lbnUtYnV0dG9uIHBpIHBpLWNoZXZyb24tZG93bicgOiAnYWN0aW9ucy1tZW51LWJ1dHRvbiBwaSBwaS1jaGV2cm9uLXJpZ2h0J1xyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJoYXNBY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgPHAtbWVudSAjbWVudSBbbW9kZWxdPVwiaXRlbS5hY3Rpb25zXCIgW3BvcHVwXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIj48L3AtbWVudT5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImFjdGlvbnMtbWVudS1idXR0b24gZmFzIGZhLWNvZ1wiIChjbGljayk9XCJtZW51LnRvZ2dsZSgkZXZlbnQpXCI+PC9pPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWxDZWxsKGNvbClcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsXCJcclxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiZ2V0Q2VsbENvbnRlbnQoaXRlbSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29sICYmIGNvbC5jbGlja0Z1bmN0aW9uICYmIGNvbC5jbGlja0Z1bmN0aW9uKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldENvbFN0eWxlKGNvbClcIlxyXG4gICAgICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIoIWlzSHRtbENlbGwoY29sKSAmJiAhIWNvbC5nZXRTdGF0dXMpIHx8IGlzU2NvcmVDZWxsKGNvbClcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2wgJiYgY29sLmNsaWNrRnVuY3Rpb24gJiYgY29sLmNsaWNrRnVuY3Rpb24oaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Q29sU3R5bGUoY29sKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHZlY3Rvci1iYWRnZVxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImlzQmFkZ2VDZWxsKGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0Q2VsbFRleHQoaXRlbSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImNvbC5nZXRTdGF0dXMgJiYgY29sLmdldFN0YXR1cyhpdGVtW2NvbC5maWVsZF0pXCJcclxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiZ2V0VG9vbHRpcFRleHQoaXRlbSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICA+PC92ZWN0b3ItYmFkZ2U+XHJcbiAgICAgICAgICAgICAgICA8dmVjdG9yLXNjb3JlICpuZ0lmPVwiaXNTY29yZUNlbGwoY29sKVwiIFtzY29yZV09XCJpdGVtW2NvbC5maWVsZF1cIj48L3ZlY3Rvci1zY29yZT5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICA8dHIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibm8tcmVzdWx0c1wiIFthdHRyLmNvbHNwYW5dPVwiY29sdW1ucy5sZW5ndGggKyAxXCI+TmVuaHVtIHJlc3VsdGFkbyBlbmNvbnRyYWRvPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicGFnaW5hdG9ycmlnaHRcIj4gPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW0gcFRlbXBsYXRlPVwicGFnaW5hdG9yZHJvcGRvd25pdGVtXCI+IHt7IGl0ZW0udmFsdWUgfX0gPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicm93ZXhwYW5zaW9uXCIgbGV0LWl0ZW0+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoICsgKGhhc0FjdGlvbnMgPyAxIDogMClcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXhwYW5zaW9uVGVtcGxhdGU7IGNvbnRleHQ6IHsgaXRlbSB9XCI+IDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L3AtdGFibGU+XHJcbiAgICA8L3ZlY3Rvci1wYW5lbD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|