keevo-components 2.0.174 → 2.0.177

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.
@@ -582,11 +582,11 @@ export class KvTableComponent {
582
582
  return this.tableConfig();
583
583
  }
584
584
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvTableComponent, deps: [{ token: i1.DatePipe }, { token: i1.DecimalPipe }, { token: i2.CpfCnpjPipe }, { token: i3.TelefonePipe }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
585
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvTableComponent, selector: "kv-table", inputs: { searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: false, isRequired: false, transformFunction: null }, _templates: { classPropertyName: "_templates", publicName: "templates", isSignal: false, isRequired: false, transformFunction: null }, setConfig: { classPropertyName: "setConfig", publicName: "config", isSignal: false, isRequired: false, transformFunction: null }, first: { classPropertyName: "first", publicName: "first", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, defaultSortField: { classPropertyName: "defaultSortField", publicName: "defaultSortField", isSignal: false, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: false, isRequired: false, transformFunction: null }, selectedItems: { classPropertyName: "selectedItems", publicName: "selectedItems", isSignal: false, isRequired: false, transformFunction: null }, totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: false, isRequired: false, transformFunction: null }, paginator: { classPropertyName: "paginator", publicName: "paginator", isSignal: false, isRequired: false, transformFunction: null }, rowsPerPageOptions: { classPropertyName: "rowsPerPageOptions", publicName: "rowsPerPageOptions", isSignal: false, isRequired: false, transformFunction: null }, tableSize: { classPropertyName: "tableSize", publicName: "tableSize", isSignal: false, isRequired: false, transformFunction: null }, filterColumnsBtn: { classPropertyName: "filterColumnsBtn", publicName: "filterColumnsBtn", isSignal: false, isRequired: false, transformFunction: null }, replaceEmptyValues: { classPropertyName: "replaceEmptyValues", publicName: "replaceEmptyValues", isSignal: false, isRequired: false, transformFunction: null }, autoFocusSearch: { classPropertyName: "autoFocusSearch", publicName: "autoFocusSearch", isSignal: false, isRequired: false, transformFunction: null }, filtrosAvancados: { classPropertyName: "filtrosAvancados", publicName: "filtrosAvancados", isSignal: false, isRequired: false, transformFunction: null }, scrollHeight: { classPropertyName: "scrollHeight", publicName: "scrollHeight", isSignal: false, isRequired: false, transformFunction: null }, isTableScrollable: { classPropertyName: "isTableScrollable", publicName: "isTableScrollable", isSignal: false, isRequired: false, transformFunction: null }, tableCaptalized: { classPropertyName: "tableCaptalized", publicName: "tableCaptalized", isSignal: false, isRequired: false, transformFunction: null }, rowTrackBy: { classPropertyName: "rowTrackBy", publicName: "rowTrackBy", isSignal: false, isRequired: false, transformFunction: null }, responsiveLayout: { classPropertyName: "responsiveLayout", publicName: "responsiveLayout", isSignal: false, isRequired: false, transformFunction: null }, disabledHeaderCheckbox: { classPropertyName: "disabledHeaderCheckbox", publicName: "disabledHeaderCheckbox", isSignal: false, isRequired: false, transformFunction: null }, applyStyle: { classPropertyName: "applyStyle", publicName: "applyStyle", isSignal: false, isRequired: false, transformFunction: null }, pageLinksOptions: { classPropertyName: "pageLinksOptions", publicName: "pageLinksOptions", isSignal: false, isRequired: false, transformFunction: null }, showFirstLastIcon: { classPropertyName: "showFirstLastIcon", publicName: "showFirstLastIcon", isSignal: false, isRequired: false, transformFunction: null }, ellipsisText: { classPropertyName: "ellipsisText", publicName: "ellipsisText", isSignal: true, isRequired: false, transformFunction: null }, isLoadingSkeleton: { classPropertyName: "isLoadingSkeleton", publicName: "isLoadingSkeleton", isSignal: true, isRequired: false, transformFunction: null }, filterButton: { classPropertyName: "filterButton", publicName: "filterButton", isSignal: true, isRequired: false, transformFunction: null }, filterButtonBadge: { classPropertyName: "filterButtonBadge", publicName: "filterButtonBadge", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { first: "firstChange", rows: "rowsChange", onActiveItem: "onActiveItem", onActiveItemLote: "onActiveItemLote", onPaginate: "onPaginate", onSelectionChange: "onSelectionChange", doubleClickEvent: "doubleClickEvent", filterField: "filterField", onSwitchTableChange: "onSwitchTableChange" }, host: { listeners: { "window:resize": "onWindowResize($event)", "document:keydown.escape": "onEscapeKey($event)", "document:click": "onClickEvent($event)" } }, queries: [{ propertyName: "templates", predicate: TemplateDirective }], viewQueries: [{ propertyName: "tableCell", first: true, predicate: ["tableCell"], descendants: true, isSignal: true }, { propertyName: "table", first: true, predicate: ["table"], descendants: true }, { propertyName: "ptable", first: true, predicate: Table, descendants: true }, { propertyName: "menuFiltroDiv", first: true, predicate: ["menuFiltroDiv"], descendants: true }, { propertyName: "botaoFiltro", first: true, predicate: ["botaoFiltro"], descendants: true }, { propertyName: "inputField", first: true, predicate: ["inputField"], descendants: true }], ngImport: i0, template: "<div class=\"kv-table-container\">\r\n @if (config) {\r\n <p-table\r\n #dt\r\n styleClass=\"p-datatable-sm\"\r\n [value]=\"dataSource\"\r\n [(selection)]=\"selectedItems\"\r\n [rowSelectable]=\"isRowSelectable\"\r\n [columns]=\"config.columns\"\r\n [globalFilterFields]=\"globalFilterFields\"\r\n [rows]=\"rows()\"\r\n [paginator]=\"paginator\"\r\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{first} - {last} de {totalRecords}\"\r\n [rowHover]=\"true\"\r\n [totalRecords]=\"totalRecords\"\r\n [lazy]=\"config.lazy\"\r\n [first]=\"first()\"\r\n (onLazyLoad)=\"paginate($event)\"\r\n (selectionChange)=\"selectionChange($event)\"\r\n (onSort)=\"onSort($event)\"\r\n (onPage)=\"onPage($event)\"\r\n rowGroupMode=\"rowspan\"\r\n [groupRowsBy]=\"config.fieldGroup\"\r\n [showFirstLastIcon]=\"widthPage() > 960 ? true : false\"\r\n [pageLinks]=\"widthPage() > 960 ? 2 : 1\"\r\n [responsive]=\"true\"\r\n [responsiveLayout]=\"responsiveLayout ? 'stack' : ''\"\r\n [scrollable]=\"isTableScrollable\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [rowTrackBy]=\"rowTrackBy\"\r\n >\r\n @if (config?.enableCation) {\r\n <ng-template pTemplate=\"caption\">\r\n <div\r\n class=\"flex flex-row flex-wrap justify-content-between grid formgrid p-fluid col-12 m-0 mb-2\"\r\n [style.padding.rem]=\"0.1\"\r\n >\r\n <div class=\"col-12 flex flex-column\">\r\n @if (config.title) {\r\n <div class=\"text-md font-bold my-3\">\r\n {{ config.title }}\r\n </div>\r\n } @if (config.subtitle) {\r\n <div class=\"text-sm mb-4 font-medium\">\r\n {{ config.subtitle }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-row align-items-center md:col-6 lg:col-4 {{\r\n widthPage() < 768 ? 'col-10' : 'col-12'\r\n }} gap-1 p-0\"\r\n >\r\n @if (config?.enableFilter) {\r\n <!-- <span class=\"p-input-icon-left\">\r\n <i class=\"pi pi-search text-sm\"></i>\r\n\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm \"\r\n />\r\n </span> -->\r\n @if(autoFocusSearch) {\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm col-6\"\r\n />\r\n } \r\n @else {<input\r\n pInputText\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm col-6\"\r\n />}\r\n\r\n } @if(filterColumnsBtn) {\r\n <div #botaoFiltro>\r\n <kv-button\r\n id=\"botaoFiltro\"\r\n [icon]=\"'align_vertical_top'\"\r\n (onClick)=\"abrirMenuFiltro($event)\"\r\n severity=\"tertiary\"\r\n pTooltip=\"Ocultar/Exibir colunas\"\r\n size=\"small\"\r\n >\r\n </kv-button>\r\n </div>\r\n\r\n <div\r\n #menuFiltroDiv\r\n id=\"menuFiltroDiv\"\r\n [style.visibility]=\"'hidden'\"\r\n class=\"absolute z-4 bg-gray-200 menu-columns-filtro\"\r\n >\r\n <p-card styleClass=\"p-1\">\r\n <div\r\n class=\"flex flex-column text-medium w-15rem p-1\"\r\n *ngFor=\"let col of columnsFilter()\"\r\n >\r\n {{ checkMenuFiltro(col) }}\r\n <p-checkbox\r\n #filterColumns\r\n [label]=\"col.header\"\r\n [binary]=\"true\"\r\n class=\"checkbox-container\"\r\n (onChange)=\"dinamicColumnSet($event, col)\"\r\n [(ngModel)]=\"col.checked\"\r\n *ngIf=\"!dinamicDisableColumn(col)\"\r\n ></p-checkbox>\r\n </div>\r\n </p-card>\r\n </div>\r\n } @if(filterButton()) {\r\n <p-button\r\n styleClass=\"kv-button small tertiary text-xs font-medium\"\r\n label=\"Filtrar\"\r\n icon=\"pi pi-filter\"\r\n [badge]=\"filterButtonBadge()\"\r\n badgeClass=\"text-gray-800\"\r\n class=\"text-xs\"\r\n (onClick)=\"op.toggle($event)\"\r\n ></p-button>\r\n }\r\n\r\n <p-overlayPanel #op>\r\n <ng-content select=\"[filtro]\"> </ng-content>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n <div class=\"flex flex-row col-2 justify-content-end gap-2 p-0\">\r\n @for (action of config.actionsLote; track i; let i = $index) {\r\n <div class=\"flex align-items-center justify-content-center\">\r\n @if ((selectedItems.length > 0 || action.showAcoesLote) &&\r\n (getOrExecute(action.visible, selectedItems) ?? true)) {\r\n <kv-button\r\n (onClick)=\"action?.command(); activeItemLote(selectedItems)\"\r\n [pTooltip]=\"getOrExecute(action.tooltip, selectedItems)\"\r\n [tooltipPosition]=\"'left'\"\r\n [disabled]=\"getOrExecute(action.disabled, selectedItems) || false\"\r\n [icon]=\"getOrExecute(action.icon, selectedItems)\"\r\n [severity]=\"action.severity || 'tertiary'\"\r\n size=\"small\"\r\n [label]=\"getOrExecute(action.label, selectedItems) || ''\"\r\n [items]=\"action.items || []\"\r\n [popup]=\"(action.items && action.items.length > 0) || false\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n }\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @if (config.enableSelect) {\r\n <th>\r\n <p-tableHeaderCheckbox\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [disabled]=\"disabledHeaderCheckbox\"\r\n ></p-tableHeaderCheckbox>\r\n </th>\r\n } @for (col of columns; track $index) {\r\n <th\r\n [pSortableColumn]=\"col.field\"\r\n [pSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div\r\n class=\"flex flex-row align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <span class=\"text-xs font-semibold\">{{ col.header }}</span>\r\n @if (col.sortable) {\r\n <p-sortIcon [field]=\"col.field\" class=\"pb-1\"></p-sortIcon>\r\n } @if (col.headerTooltip) {\r\n <span\r\n class=\"material-symbols-outlined flex align-items-center\"\r\n [pTooltip]=\"col.headerTooltip\"\r\n >info</span\r\n >\r\n }\r\n </div>\r\n </th>\r\n } @if (config.actions && config.actions.length > 0) {\r\n <th></th>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-rowData\r\n let-columns=\"columns\"\r\n let-rowgroup=\"rowgroup\"\r\n let-rowspan=\"rowspan\"\r\n let-rowIndex=\"rowIndex\"\r\n >\r\n <tr\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{\r\n capitalize: tableCaptalized,\r\n last: rowIndex === dataSource.length - 1\r\n }\"\r\n class=\"tr-td {{ isDisabledRow(rowData) ? 'disabled-row' : '' }}\"\r\n >\r\n @if (config.enableSelect) {\r\n <td style=\"width: 8px !important\">\r\n <p-tableCheckbox\r\n [value]=\"rowData\"\r\n [disabled]=\"isDisabledCheckbox(rowData)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n ></p-tableCheckbox>\r\n </td>\r\n } @for (col of columns; track $index) {\r\n <ng-container>\r\n @if (rowgroup && !col.template) {\r\n <td\r\n [attr.rowspan]=\"rowgroup && col.grouped ? rowspan : null\"\r\n [pTooltip]=\"returnTooltipRow(rowData, col)\"\r\n class=\"{{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }}\"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n\r\n <span\r\n *ngIf=\"!isBooleanField(rowData, col); else booleanField\"\r\n [class]=\"returnRowClass(rowData, col)\"\r\n >\r\n @if (!isChipField(col) && !col.iconField && !isImageField(col) &&\r\n !isEmptyDataSource()) {\r\n <span\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }} text-xs {{ ellipsisText() && 'ellipsis-text' }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n [style.max-width]=\"\r\n ellipsisText() && returnMaxWidth()(col.width)\r\n \"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n } @if (col.icon) {\r\n <i [class]=\"col.icon + ' mr-2'\"></i>\r\n }\r\n {{ transformValue(rowData, col) }}\r\n </span>\r\n } @if (isChipField(col) && !col.iconField) {\r\n <div>\r\n <span\r\n [class]=\"returnClassChip(rowData, col)\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n class=\"text-xs\"\r\n >{{ transformValue(rowData, col) }}</span\r\n >\r\n </div>\r\n } @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </span>\r\n\r\n @if (isImageField(col)) {\r\n <span>\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n } @if (col.iconField) {\r\n <i\r\n [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n >\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n }\r\n\r\n <ng-template #booleanField>\r\n @if (!col.iconField && !isSwitchField(col)) {\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n <i\r\n [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"\r\n ><span\r\n class=\"material-symbols-outlined text-lg font-semibold\"\r\n >\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n </div>\r\n\r\n } @if (isSwitchField(col)) {\r\n <span\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row align-items-center justify-content-center'\r\n \"\r\n style=\"height: 25px\"\r\n >\r\n @if(col.switchDisable){\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col.switchDisable(rowData, col)\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n } @else {\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n }\r\n </span>\r\n } @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </ng-template>\r\n </td>\r\n } @if (!rowgroup && !col.grouped && !col.template) {\r\n <td\r\n #tableCell\r\n class=\"rowTable {{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }} \"\r\n [pTooltip]=\"returnTooltipRow(rowData, col)\"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n\r\n @if(!isEmptyDataSource()) {\r\n\r\n <span\r\n *ngIf=\"!isBooleanField(rowData, col); else booleanField\"\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row gap-2 align-items-center ' +\r\n (col?.centralize && 'justify-content-center')\r\n \"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n [style.max-width]=\"ellipsisText() && returnMaxWidth()(col.width)\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n } @if (!isChipField(col) && !col.iconField && !isImageField(col)){\r\n <span class=\"text-xs {{ ellipsisText() && 'ellipsis-text' }}\">\r\n @if (col.icon) {\r\n <i [class]=\"col.icon + ' mr-2'\"></i>\r\n }\r\n {{ transformValue(rowData, col) }}\r\n </span>\r\n } @if (isChipField(col) && !col.iconField) {\r\n <div>\r\n <span\r\n [class]=\"returnClassChip(rowData, col)\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n class=\"text-xs\"\r\n >\r\n {{ transformValue(rowData, col) }}</span\r\n >\r\n </div>\r\n }\r\n </span>\r\n } @if (isImageField(col)) {\r\n <span>\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n } @if (col.iconField) {\r\n <i\r\n [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n >\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n }\r\n\r\n <ng-template #booleanField>\r\n @if (!col.iconField && !isSwitchField(col)) {\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n <i\r\n [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"\r\n ><span\r\n class=\"material-symbols-outlined text-lg font-semibold\"\r\n >\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n </div>\r\n } @if (isSwitchField(col)) {\r\n\r\n <span\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row align-items-center justify-content-center'\r\n \"\r\n style=\"height: 25px\"\r\n >\r\n @if(col.switchDisable){\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col.switchDisable(rowData, col)\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n } @else {\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n }\r\n </span>\r\n }\r\n </ng-template>\r\n\r\n @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </td>\r\n } @if (col.template) {\r\n <td\r\n class=\"rowTable {{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }} \"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n @if (getCustomTemplate(col.template.name)) {\r\n\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && ' justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"col.tooltipTag && col.tooltipTag(rowData, col)\"\r\n [style.background-color]=\"col.tagColor(rowData, col)\"\r\n ></div>\r\n } @if(!isEmptyDataSource()) {\r\n\r\n <div class=\"w-full\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <p-skeleton\r\n [width]=\"widthRandom()(col, rowIndex) + '%'\"\r\n ></p-skeleton>\r\n } }\r\n </td>\r\n }\r\n </ng-container>\r\n } @if (config.actions && config.actions.length > 0) {\r\n <td>\r\n <div class=\"flex flex-row justify-content-end w-full\">\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n <!-- more_vert -->\r\n more_horiz\r\n </span>\r\n\r\n <p-tieredMenu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"tableActions[rowIndex - actionsOffset]\"\r\n appendTo=\"body\"\r\n >\r\n <ng-template let-item pTemplate=\"item\">\r\n <div\r\n [pTooltip]=\"item.tooltip\"\r\n tooltipPosition=\"left\"\r\n class=\"cursor-pointer\"\r\n >\r\n <span class=\"text-xs\">\r\n {{ item.label }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </p-tieredMenu>\r\n <!-- <span pTooltip=\"{{ tableActions[rowIndex - actionsOffset][0]?.tooltip }}\" tooltipPosition=\"top\">a</span> -->\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"emptymessage\" let-columns>\r\n <tr>\r\n <td\r\n [attr.colspan]=\"columns.length + 2\"\r\n style=\"text-align: center; border-radius: 10px !important\"\r\n >\r\n <p class=\"font-medium m-0 text-xs\">Nenhum registro encontrado</p>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n }\r\n</div>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://fonts.googleapis.com/icon?family=Material+Icons\"\r\n/>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0\"\r\n/>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap\";@import\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\";::ng-deep :root{--kv-color-system: 10,58,120;--kv-color-system-cta: 76, 175, 80;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255;--kv-primary-color: 41, 185, 45;--kv-secondary-color: 0, 37, 66;--kv-tertiary-color: 165, 165, 165;--kv-danger-color: 220, 53, 69;--kv-success-color: 75, 181, 67;--kv-info-color: 58, 170, 208;--kv-warn-color: 241, 90, 36;--kv-contrast-color: 33, 37, 41}::ng-deep .padrao{--kv-color-system: 10,58,120;--kv-color-system-cta: 76, 175, 80;--kv-color-text: 0, 0, 0;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255}::ng-deep .theme-keevocenter{--kv-color-system: 88,25,153;--kv-color-system-cta: 0, 116, 217;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255}::ng-deep .theme-holos{--kv-color-system: 241,90,36;--kv-color-system-cta: 224, 168, 35;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 240,240,240;--kv-background-card: 2255,255,255}.system-color{color:rgb(var(--kv-color-system),1)}.bg-system-100{background:rgb(var(--kv-color-system),1)}.bg-system-75{background:rgb(var(--kv-color-system),.75)}.bg-system-50{background:rgb(var(--kv-color-system),.5)}.bg-system-25{background:rgb(var(--kv-color-system),.25)}.material-symbols-outlined{font-family:Material Symbols Outlined!important}*{font-family:Inter,Inter var,sans-serif!important}::ng-deep .p-accordion,::ng-deep .p-accordion-header,::ng-deep .p-accordion-content,::ng-deep .p-badge,::ng-deep .p-overlay-badge,::ng-deep .p-breadcrumb,::ng-deep .p-breadcrumb-item,::ng-deep .p-breadcrumb-link,::ng-deep .p-button,::ng-deep .p-calendar,::ng-deep .p-card,::ng-deep .p-card-title,::ng-deep .p-card-subtitle,::ng-deep .p-card-content,::ng-deep .p-checkbox,::ng-deep .p-chip,::ng-deep .p-confirm-dialog,::ng-deep .p-confirm-dialog-message,::ng-deep .p-contextmenu,::ng-deep .p-contextmenu-item,::ng-deep .p-dataview,::ng-deep .p-dataview-content,::ng-deep .p-dialog,::ng-deep .p-dialog-title,::ng-deep .p-dialog-content,::ng-deep .p-dropdown,::ng-deep .p-dropdown-label,::ng-deep .p-dropdown-item,::ng-deep .p-dynamic-dialog,::ng-deep .p-dynamic-dialog-title,::ng-deep .p-dynamic-dialog-content,::ng-deep .p-editor,::ng-deep .p-fieldset,::ng-deep .p-fieldset-legend,::ng-deep .p-fieldset-content,::ng-deep .p-fileupload,::ng-deep .p-inputmask,::ng-deep .p-inputnumber,::ng-deep .p-inputtextarea,::ng-deep .p-inputtext,::ng-deep .p-menu,::ng-deep .p-menuitem,::ng-deep .p-menuitem-text,::ng-deep .p-message,::ng-deep .p-messages,::ng-deep .p-multiselect,::ng-deep .p-multiselect-label,::ng-deep .p-multiselect-item,::ng-deep .p-panelmenu,::ng-deep .p-panelmenu-header,::ng-deep .p-panelmenu-content,::ng-deep .p-panel,::ng-deep .p-panel-header,::ng-deep .p-panel-content,::ng-deep .p-password,::ng-deep .p-picklist,::ng-deep .p-progressbar,::ng-deep .p-radiobutton,::ng-deep .p-rating,::ng-deep .p-sidebar,::ng-deep .p-splitbutton,::ng-deep .p-steps,::ng-deep .p-step,::ng-deep .p-table,::ng-deep .p-datatable,::ng-deep .p-tabview,::ng-deep .p-tabpanel,::ng-deep .p-tag,::ng-deep .p-toast,::ng-deep .p-toolbar,::ng-deep .p-tooltip,::ng-deep .p-tree,::ng-deep .p-treetable,::ng-deep .p-selectbutton,::ng-deep .p-stepper,::ng-deep .p-inputgroup,::ng-deep .p-inputgroup-addon,::ng-deep .p-text{font-family:Inter,Inter var,sans-serif!important}::ng-deep .p-icon,svg{height:.6rem}:host ::ng-deep .inputs{height:1.875rem}:host ::ng-deep .inputs,.p-inputtext,.p-inputtextarea{font-size:.875rem}::ng-deep .p-dialog .p-dialog-header{color:rgb(var(--kv-color-text))!important;background:linear-gradient(0deg,#00000005 .44%,#0000 49.5%),#fff!important;display:flex!important;flex-wrap:wrap;word-wrap:break-word;border-bottom:1px solid rgb(var(--kv-color-text),.15)}::ng-deep .p-dialog{min-width:320px}::ng-deep .p-dialog-content{overflow-x:hidden}::ng-deep .p-dialog-content::-webkit-scrollbar{width:8px}::ng-deep .p-dialog-content::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .p-dialog-content::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .p-dialog-content:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .p-dialog-content::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}::ng-deep .p-dialog-footer{display:flex;justify-content:flex-end;padding:10px;gap:10px}::ng-deep .p-dialog .p-dialog-header .p-dialog-header-icon{display:none}::ng-deep .p-tooltip{font-size:.825rem!important}::ng-deep p-tablecheckbox p-tableheadercheckbox .p-checkbox{display:flex!important;align-items:center!important;justify-content:right}::ng-deep .p-checkbox{display:flex!important;align-items:center!important;justify-content:center}::ng-deep .kv-button .p-button-loading-icon svg{width:100%;height:100%;display:block}::ng-deep .kv-button .p-button-loading-icon svg g{transform:translate(0)}::ng-deep .kv-button{white-space:nowrap;border:none;padding:.4rem;display:flex;flex-direction:row;align-items:center;justify-content:center;gap:.125rem}::ng-deep .kv-button .kv-button-label{font-weight:500}::ng-deep .small{height:1.625rem;min-width:1.625rem}::ng-deep .small .kv-button-label{font-size:.625rem}::ng-deep .small .kv-button-icon{font-size:.75rem}::ng-deep .small .p-button-loading-icon{width:.55rem;height:.55rem}::ng-deep .normal{height:1.875rem;min-width:1.875rem}::ng-deep .normal .kv-button-label{font-size:.825rem}::ng-deep .normal .kv-button-icon{font-size:1rem}::ng-deep .normal .p-button-loading-icon{width:.75rem;height:.75rem}::ng-deep .large{height:2.125rem;min-width:2.125rem}::ng-deep .large .kv-button-label{font-size:1rem}::ng-deep .large .kv-button-icon{font-size:1.25rem}::ng-deep .large .p-button-loading-icon{width:.875rem;height:.875rem}::ng-deep .primary{background-color:rgb(var(--kv-primary-color))}::ng-deep .primary:hover{background-color:rgba(var(--kv-primary-color),.8)}::ng-deep .primary:active{background-color:rgba(var(--kv-primary-color),.95)}.primary.outline{border:solid .5px rgb(var(--kv-primary-color));background-color:#fff;color:rgb(var(--kv-primary-color))}.primary.outline:hover{background-color:rgb(var(--kv-primary-color));color:#fff}.primary.outline:active{background-color:rgba(var(--kv-primary-color),.8)}.primary.text{opacity:.9;background-color:transparent;color:rgb(var(--kv-primary-color))}.primary.text:hover{background-color:rgba(var(--kv-primary-color),.1)}.primary.text:active{background-color:rgba(var(--kv-primary-color),.2)}::ng-deep .secondary{background-color:rgb(var(--kv-secondary-color))}::ng-deep .secondary:hover{background-color:rgba(var(--kv-secondary-color),.8)}::ng-deep .secondary:active{background-color:rgba(var(--kv-secondary-color),.95)}.secondary.outline{border:solid .5px rgb(var(--kv-secondary-color));background-color:#fff;color:rgb(var(--kv-secondary-color))}.secondary.outline:hover{background-color:rgb(var(--kv-secondary-color));color:#fff}.secondary.outline:active{background-color:rgba(var(--kv-secondary-color),.8)}.secondary.text{background-color:transparent;color:rgb(var(--kv-secondary-color))}.secondary.text:hover{background-color:rgba(var(--kv-secondary-color),.1)}.secondary.text:active{background-color:rgba(var(--kv-secondary-color),.2)}::ng-deep .tertiary{color:#212121;background-color:rgba(var(--kv-tertiary-color),.3)}::ng-deep .tertiary:hover{background-color:rgba(var(--kv-tertiary-color),.8)}::ng-deep .tertiary:active{background-color:rgba(var(--kv-tertiary-color),.95)}.tertiary.outline{border:solid .5px rgb(var(--kv-tertiary-color));background-color:#fff;color:rgb(var(--kv-tertiary-color))}.tertiary.outline:hover{background-color:rgb(var(--kv-tertiary-color));color:#fff}.tertiary.outline:active{background-color:rgba(var(--kv-tertiary-color),.8)}.tertiary.text{background-color:transparent;color:rgb(var(--kv-tertiary-color))}.tertiary.text:hover{background-color:rgba(var(--kv-tertiary-color),.1)}.tertiary.text:active{background-color:rgba(var(--kv-tertiary-color),.2)}::ng-deep .danger{background-color:rgb(var(--kv-danger-color))}::ng-deep .danger:hover{background-color:rgba(var(--kv-danger-color),.8)}::ng-deep .danger:active{background-color:rgba(var(--kv-danger-color),.95)}::ng-deep .danger.outline{border:solid .5px rgb(var(--kv-danger-color));background-color:#fff;color:rgb(var(--kv-danger-color))}::ng-deep .danger.outline:hover{background-color:rgb(var(--kv-danger-color));color:#fff}::ng-deep .danger.outline:active{background-color:rgba(var(--kv-danger-color),.8)}::ng-deep .danger.text{background-color:transparent;color:rgb(var(--kv-danger-color))}::ng-deep .danger.text:hover{background-color:rgba(var(--kv-danger-color),.1)}::ng-deep .danger.text:active{background-color:rgba(var(--kv-danger-color),.2)}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar{width:6px}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .p-datatable>.p-datatable-wrapper:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}.tag{width:5px;height:20px;border-radius:.25rem}::ng-deep .p-panel .p-panel-header{border:none!important}:host ::ng-deep .p-datatable-header{padding:0!important;border-radius:5px!important;background-color:transparent;border:none}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th{padding:.15rem;background-color:rgba(var(--kv-color-system),.05);color:rgba(var(--kv-color-text),.6)}::ng-deep .p-datatable-table{border:1px solid rgba(var(--kv-color-system),.1);border-radius:.5rem;overflow:hidden;color:rgb(var(--kv-color-system))}.icon-more{font-weight:500;font-size:1.4rem!important;color:rgb(var(--kv-color-system),.75);transition:all .4s}.icon-more:hover,.icon-more:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}.tr-td{overflow-wrap:anywhere}.tr-td:hover{box-shadow:#3c40434d 0 1px 2px,#3c404326 0 2px 6px 2px;background-color:#fff;transition:color .3s,transform .3s;transform:scale(1)}.tr-td:hover.last{box-shadow:-1px -1px 9px -3px #000000bf;-webkit-box-shadow:-1px -1px 9px -3px rgba(0,0,0,.75);-moz-box-shadow:-1px -1px 9px -3px rgba(0,0,0,.75)}.disabled-row{pointer-events:none;opacity:.6;background-color:#dddddd8e}::ng-deep .p-tooltip{pointer-events:auto}.btn-table{background-color:#29b92d;padding:12px}.btn-table:hover{background-color:#249a29}.btn-table:active{background-color:#1c801f}.btn-table:disabled{background-color:#29b92d}::ng-deep svg.p-icon{width:.65rem;height:.65rem}::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:#004172;background:#004172}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:hover{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:active{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:disabled{background-color:#002542;opacity:.4;cursor:auto}input{height:1.75rem}::ng-deep .p-checkbox .p-checkbox-box{width:1.125rem;height:1.125rem;border:1.5px solid #d1d5db}::ng-deep .p-checkbox{display:flex!important;align-items:center!important;justify-content:right;width:1.625rem!important;height:1.125rem}::ng-deep .p-checkbox-label{font-size:.875rem}::ng-deep .p-datatable .p-paginator-bottom{border:solid #ffffff;scale:.75}::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td{padding:.1rem}::ng-deep .p-dropdown-panel .p-dropdown-items .p-dropdown-item{padding:.25rem!important}::ng-deep .p-dropdown-panel .p-dropdown-items{padding:.5rem!important}::ng-deep .p-button-label{font-weight:500!important}::ng-deep .p-button .p-button-icon-left{margin-left:.25rem;margin-right:.25rem;font-size:.675rem!important}:host{height:100%}::ng-deep .kv-table-container,::ng-deep p-table{height:100%}::ng-deep p-table .p-datatable{display:flex;flex-direction:column;height:100%}::ng-deep .p-datatable .p-datatable-wrapper{flex:1 1 1}::ng-deep p-table .p-datatable .p-datatable-wrapper,::ng-deep p-table{height:100%}::ng-deep table{height:auto!important}.ellipsis-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:inline-block}::ng-deep .p-tieredmenu{padding:.5rem!important}:host ::ng-deep .p-disabled *{pointer-events:auto!important}::ng-deep p-tieredmenusub .p-disabled *:active{pointer-events:none!important;font-size:.75rem!important;padding:.5rem!important}::ng-deep .p-tieredmenu .p-tieredmenu-root-list{font-size:.75rem!important}::ng-deep .p-tieredmenu .p-menuitem>.p-menuitem-content{padding:.5rem}\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: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i5.AutoFocus, selector: "[pAutoFocus]", inputs: ["autofocus"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i7.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i8.Card, selector: "p-card", inputs: ["header", "subheader", "style", "styleClass"] }, { kind: "component", type: i9.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i10.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i11.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i12.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: i13.TieredMenu, selector: "p-tieredMenu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "autoDisplay", "showTransitionOptions", "hideTransitionOptions", "id", "ariaLabel", "ariaLabelledBy", "disabled", "tabindex"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i14.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: i14.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i14.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i14.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i14.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i16.KvSwitchComponent, selector: "kv-switch", inputs: ["readonly", "switchValue"], outputs: ["onSwitchChange"] }, { kind: "component", type: i17.KvButtonComponent, selector: "kv-button", inputs: ["fullWidth", "type", "loading", "severity", "size", "icon", "iconPosition", "label", "disabled", "items", "popup", "popupIcon"], outputs: ["iconChange", "onClick"] }] }); }
585
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvTableComponent, selector: "kv-table", inputs: { searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: false, isRequired: false, transformFunction: null }, _templates: { classPropertyName: "_templates", publicName: "templates", isSignal: false, isRequired: false, transformFunction: null }, setConfig: { classPropertyName: "setConfig", publicName: "config", isSignal: false, isRequired: false, transformFunction: null }, first: { classPropertyName: "first", publicName: "first", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, defaultSortField: { classPropertyName: "defaultSortField", publicName: "defaultSortField", isSignal: false, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: false, isRequired: false, transformFunction: null }, selectedItems: { classPropertyName: "selectedItems", publicName: "selectedItems", isSignal: false, isRequired: false, transformFunction: null }, totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: false, isRequired: false, transformFunction: null }, paginator: { classPropertyName: "paginator", publicName: "paginator", isSignal: false, isRequired: false, transformFunction: null }, rowsPerPageOptions: { classPropertyName: "rowsPerPageOptions", publicName: "rowsPerPageOptions", isSignal: false, isRequired: false, transformFunction: null }, tableSize: { classPropertyName: "tableSize", publicName: "tableSize", isSignal: false, isRequired: false, transformFunction: null }, filterColumnsBtn: { classPropertyName: "filterColumnsBtn", publicName: "filterColumnsBtn", isSignal: false, isRequired: false, transformFunction: null }, replaceEmptyValues: { classPropertyName: "replaceEmptyValues", publicName: "replaceEmptyValues", isSignal: false, isRequired: false, transformFunction: null }, autoFocusSearch: { classPropertyName: "autoFocusSearch", publicName: "autoFocusSearch", isSignal: false, isRequired: false, transformFunction: null }, filtrosAvancados: { classPropertyName: "filtrosAvancados", publicName: "filtrosAvancados", isSignal: false, isRequired: false, transformFunction: null }, scrollHeight: { classPropertyName: "scrollHeight", publicName: "scrollHeight", isSignal: false, isRequired: false, transformFunction: null }, isTableScrollable: { classPropertyName: "isTableScrollable", publicName: "isTableScrollable", isSignal: false, isRequired: false, transformFunction: null }, tableCaptalized: { classPropertyName: "tableCaptalized", publicName: "tableCaptalized", isSignal: false, isRequired: false, transformFunction: null }, rowTrackBy: { classPropertyName: "rowTrackBy", publicName: "rowTrackBy", isSignal: false, isRequired: false, transformFunction: null }, responsiveLayout: { classPropertyName: "responsiveLayout", publicName: "responsiveLayout", isSignal: false, isRequired: false, transformFunction: null }, disabledHeaderCheckbox: { classPropertyName: "disabledHeaderCheckbox", publicName: "disabledHeaderCheckbox", isSignal: false, isRequired: false, transformFunction: null }, applyStyle: { classPropertyName: "applyStyle", publicName: "applyStyle", isSignal: false, isRequired: false, transformFunction: null }, pageLinksOptions: { classPropertyName: "pageLinksOptions", publicName: "pageLinksOptions", isSignal: false, isRequired: false, transformFunction: null }, showFirstLastIcon: { classPropertyName: "showFirstLastIcon", publicName: "showFirstLastIcon", isSignal: false, isRequired: false, transformFunction: null }, ellipsisText: { classPropertyName: "ellipsisText", publicName: "ellipsisText", isSignal: true, isRequired: false, transformFunction: null }, isLoadingSkeleton: { classPropertyName: "isLoadingSkeleton", publicName: "isLoadingSkeleton", isSignal: true, isRequired: false, transformFunction: null }, filterButton: { classPropertyName: "filterButton", publicName: "filterButton", isSignal: true, isRequired: false, transformFunction: null }, filterButtonBadge: { classPropertyName: "filterButtonBadge", publicName: "filterButtonBadge", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { first: "firstChange", rows: "rowsChange", onActiveItem: "onActiveItem", onActiveItemLote: "onActiveItemLote", onPaginate: "onPaginate", onSelectionChange: "onSelectionChange", doubleClickEvent: "doubleClickEvent", filterField: "filterField", onSwitchTableChange: "onSwitchTableChange" }, host: { listeners: { "window:resize": "onWindowResize($event)", "document:keydown.escape": "onEscapeKey($event)", "document:click": "onClickEvent($event)" } }, queries: [{ propertyName: "templates", predicate: TemplateDirective }], viewQueries: [{ propertyName: "tableCell", first: true, predicate: ["tableCell"], descendants: true, isSignal: true }, { propertyName: "table", first: true, predicate: ["table"], descendants: true }, { propertyName: "ptable", first: true, predicate: Table, descendants: true }, { propertyName: "menuFiltroDiv", first: true, predicate: ["menuFiltroDiv"], descendants: true }, { propertyName: "botaoFiltro", first: true, predicate: ["botaoFiltro"], descendants: true }, { propertyName: "inputField", first: true, predicate: ["inputField"], descendants: true }], ngImport: i0, template: "<div class=\"kv-table-container\">\r\n @if (config) {\r\n <p-table\r\n #dt\r\n styleClass=\"p-datatable-sm\"\r\n [value]=\"dataSource\"\r\n [(selection)]=\"selectedItems\"\r\n [rowSelectable]=\"isRowSelectable\"\r\n [columns]=\"config.columns\"\r\n [globalFilterFields]=\"globalFilterFields\"\r\n [rows]=\"rows()\"\r\n [paginator]=\"paginator\"\r\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{first} - {last} de {totalRecords}\"\r\n [rowHover]=\"true\"\r\n [totalRecords]=\"totalRecords\"\r\n [lazy]=\"config.lazy\"\r\n [first]=\"first()\"\r\n (onLazyLoad)=\"paginate($event)\"\r\n (selectionChange)=\"selectionChange($event)\"\r\n (onSort)=\"onSort($event)\"\r\n (onPage)=\"onPage($event)\"\r\n rowGroupMode=\"rowspan\"\r\n [groupRowsBy]=\"config.fieldGroup\"\r\n [showFirstLastIcon]=\"widthPage() > 960 ? true : false\"\r\n [pageLinks]=\"widthPage() > 960 ? 2 : 1\"\r\n [responsive]=\"true\"\r\n [responsiveLayout]=\"responsiveLayout ? 'stack' : ''\"\r\n [scrollable]=\"isTableScrollable\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [rowTrackBy]=\"rowTrackBy\"\r\n >\r\n @if (config?.enableCation) {\r\n <ng-template pTemplate=\"caption\">\r\n <div\r\n class=\"flex flex-row flex-wrap justify-content-between grid formgrid p-fluid col-12 m-0 mb-2\"\r\n [style.padding.rem]=\"0.1\"\r\n >\r\n <div class=\"col-12 flex flex-column\">\r\n @if (config.title) {\r\n <div class=\"text-md font-bold my-3\">\r\n {{ config.title }}\r\n </div>\r\n } @if (config.subtitle) {\r\n <div class=\"text-sm mb-4 font-medium\">\r\n {{ config.subtitle }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-row align-items-center md:col-6 lg:col-4 {{\r\n widthPage() < 768 ? 'col-10' : 'col-12'\r\n }} gap-1 p-0\"\r\n >\r\n @if (config?.enableFilter) {\r\n <!-- <span class=\"p-input-icon-left\">\r\n <i class=\"pi pi-search text-sm\"></i>\r\n\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm \"\r\n />\r\n </span> -->\r\n @if(autoFocusSearch) {\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm col-6\"\r\n />\r\n } \r\n @else {<input\r\n pInputText\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm col-6\"\r\n />}\r\n\r\n } @if(filterColumnsBtn) {\r\n <div #botaoFiltro>\r\n <kv-button\r\n id=\"botaoFiltro\"\r\n [icon]=\"'align_vertical_top'\"\r\n (onClick)=\"abrirMenuFiltro($event)\"\r\n severity=\"tertiary\"\r\n pTooltip=\"Ocultar/Exibir colunas\"\r\n size=\"small\"\r\n >\r\n </kv-button>\r\n </div>\r\n\r\n <div\r\n #menuFiltroDiv\r\n id=\"menuFiltroDiv\"\r\n [style.visibility]=\"'hidden'\"\r\n class=\"absolute z-4 bg-gray-200 menu-columns-filtro\"\r\n >\r\n <p-card styleClass=\"p-1\">\r\n <div\r\n class=\"flex flex-column text-medium w-15rem p-1\"\r\n *ngFor=\"let col of columnsFilter()\"\r\n >\r\n {{ checkMenuFiltro(col) }}\r\n <p-checkbox\r\n #filterColumns\r\n [label]=\"col.header\"\r\n [binary]=\"true\"\r\n class=\"checkbox-container\"\r\n (onChange)=\"dinamicColumnSet($event, col)\"\r\n [(ngModel)]=\"col.checked\"\r\n *ngIf=\"!dinamicDisableColumn(col)\"\r\n ></p-checkbox>\r\n </div>\r\n </p-card>\r\n </div>\r\n } @if(filterButton()) {\r\n <p-button\r\n styleClass=\"kv-button small tertiary text-xs font-medium\"\r\n label=\"Filtrar\"\r\n icon=\"pi pi-filter\"\r\n [badge]=\"filterButtonBadge()\"\r\n badgeClass=\"text-gray-800\"\r\n class=\"text-xs\"\r\n (onClick)=\"op.toggle($event)\"\r\n ></p-button>\r\n }\r\n\r\n <p-overlayPanel #op>\r\n <ng-content select=\"[filtro]\"> </ng-content>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n <div class=\"flex flex-row col-2 justify-content-end gap-2 p-0\">\r\n @for (action of config.actionsLote; track i; let i = $index) {\r\n <div class=\"flex align-items-center justify-content-center\">\r\n @if ((selectedItems.length > 0 || action.showAcoesLote) &&\r\n (getOrExecute(action.visible, selectedItems) ?? true)) {\r\n <kv-button\r\n (onClick)=\"action?.command(); activeItemLote(selectedItems)\"\r\n [pTooltip]=\"getOrExecute(action.tooltip, selectedItems)\"\r\n [tooltipPosition]=\"'left'\"\r\n [disabled]=\"getOrExecute(action.disabled, selectedItems) || false\"\r\n [icon]=\"getOrExecute(action.icon, selectedItems)\"\r\n [severity]=\"action.severity || 'tertiary'\"\r\n size=\"small\"\r\n [label]=\"getOrExecute(action.label, selectedItems) || ''\"\r\n [items]=\"action.items || []\"\r\n [popup]=\"(action.items && action.items.length > 0) || false\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n }\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @if (config.enableSelect) {\r\n <th>\r\n <p-tableHeaderCheckbox\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [disabled]=\"disabledHeaderCheckbox\"\r\n ></p-tableHeaderCheckbox>\r\n </th>\r\n } @for (col of columns; track $index) {\r\n <th\r\n [pSortableColumn]=\"col.field\"\r\n [pSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div\r\n class=\"flex flex-row align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <span class=\"text-xs font-semibold\">{{ col.header }}</span>\r\n @if (col.sortable) {\r\n <p-sortIcon [field]=\"col.field\" class=\"pb-1\"></p-sortIcon>\r\n } @if (col.headerTooltip) {\r\n <span\r\n class=\"material-symbols-outlined flex align-items-center\"\r\n [pTooltip]=\"col.headerTooltip\"\r\n >info</span\r\n >\r\n }\r\n </div>\r\n </th>\r\n } @if (config.actions && config.actions.length > 0) {\r\n <th></th>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-rowData\r\n let-columns=\"columns\"\r\n let-rowgroup=\"rowgroup\"\r\n let-rowspan=\"rowspan\"\r\n let-rowIndex=\"rowIndex\"\r\n >\r\n <tr\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{\r\n capitalize: tableCaptalized,\r\n last: rowIndex === dataSource.length - 1\r\n }\"\r\n class=\"tr-td {{ isDisabledRow(rowData) ? 'disabled-row' : '' }}\"\r\n >\r\n @if (config.enableSelect) {\r\n <td style=\"width: 8px !important\">\r\n <p-tableCheckbox\r\n [value]=\"rowData\"\r\n [disabled]=\"isDisabledCheckbox(rowData)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n ></p-tableCheckbox>\r\n </td>\r\n } @for (col of columns; track $index) {\r\n <ng-container>\r\n @if (rowgroup && !col.template) {\r\n <td\r\n [attr.rowspan]=\"rowgroup && col.grouped ? rowspan : null\"\r\n [pTooltip]=\"returnTooltipRow(rowData, col)\"\r\n class=\"{{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }}\"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n\r\n <span\r\n *ngIf=\"!isBooleanField(rowData, col); else booleanField\"\r\n [class]=\"returnRowClass(rowData, col)\"\r\n >\r\n @if (!isChipField(col) && !col.iconField && !isImageField(col) &&\r\n !isEmptyDataSource()) {\r\n <span\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }} text-xs {{ ellipsisText() && 'ellipsis-text' }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n [style.max-width]=\"\r\n ellipsisText() && returnMaxWidth()(col.width)\r\n \"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n } \r\n <span class=\"text-xs {{ ellipsisText() && 'ellipsis-text' }}\">\r\n @if (col.icon) {\r\n <i [class]=\"col.icon + ' mr-2'\"></i>\r\n }\r\n {{ transformValue(rowData, col) }} \r\n </span> \r\n </span>\r\n } @if (isChipField(col) && !col.iconField) {\r\n <div>\r\n <span\r\n [class]=\"returnClassChip(rowData, col)\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n class=\"text-xs\"\r\n >{{ transformValue(rowData, col) }}</span\r\n >\r\n </div>\r\n } @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </span>\r\n\r\n @if (isImageField(col)) {\r\n <span>\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n } @if (col.iconField) {\r\n <i\r\n [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n >\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n }\r\n\r\n <ng-template #booleanField>\r\n @if (!col.iconField && !isSwitchField(col)) {\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n <i\r\n [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"\r\n ><span\r\n class=\"material-symbols-outlined text-lg font-semibold\"\r\n >\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n </div>\r\n\r\n } @if (isSwitchField(col)) {\r\n <span\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row align-items-center justify-content-center'\r\n \"\r\n style=\"height: 25px\"\r\n >\r\n @if(col.switchDisable){\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col.switchDisable(rowData, col)\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n } @else {\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n }\r\n </span>\r\n } @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </ng-template>\r\n </td>\r\n } @if (!rowgroup && !col.grouped && !col.template) {\r\n <td\r\n #tableCell\r\n class=\"rowTable {{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }} \"\r\n [pTooltip]=\"returnTooltipRow(rowData, col)\"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n\r\n @if(!isEmptyDataSource()) {\r\n\r\n <span\r\n *ngIf=\"!isBooleanField(rowData, col); else booleanField\"\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row gap-2 align-items-center ' +\r\n (col?.centralize && 'justify-content-center')\r\n \"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n [style.max-width]=\"ellipsisText() && returnMaxWidth()(col.width)\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n } @if (!isChipField(col) && !col.iconField && !isImageField(col)){\r\n <span class=\"text-xs {{ ellipsisText() && 'ellipsis-text' }}\">\r\n @if (col.icon) {\r\n <i [class]=\"col.icon + ' mr-2'\"></i>\r\n }\r\n {{ transformValue(rowData, col) }}\r\n </span>\r\n } @if (isChipField(col) && !col.iconField) {\r\n <div>\r\n <span\r\n [class]=\"returnClassChip(rowData, col)\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n class=\"text-xs\"\r\n >\r\n {{ transformValue(rowData, col) }}</span\r\n >\r\n </div>\r\n }\r\n </span>\r\n } @if (isImageField(col)) {\r\n <span>\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n } @if (col.iconField) {\r\n <i\r\n [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n >\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n }\r\n\r\n <ng-template #booleanField>\r\n @if (!col.iconField && !isSwitchField(col)) {\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n <i\r\n [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"\r\n ><span\r\n class=\"material-symbols-outlined text-lg font-semibold\"\r\n >\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n </div>\r\n } @if (isSwitchField(col)) {\r\n\r\n <span\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row align-items-center justify-content-center'\r\n \"\r\n style=\"height: 25px\"\r\n >\r\n @if(col.switchDisable){\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col.switchDisable(rowData, col)\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n } @else {\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n }\r\n </span>\r\n }\r\n </ng-template>\r\n\r\n @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </td>\r\n } @if (col.template) {\r\n <td\r\n class=\"rowTable {{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }} \"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n @if (getCustomTemplate(col.template.name)) {\r\n\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && ' justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"col.tooltipTag && col.tooltipTag(rowData, col)\"\r\n [style.background-color]=\"col.tagColor(rowData, col)\"\r\n ></div>\r\n } @if(!isEmptyDataSource()) {\r\n\r\n <div class=\"w-full\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <p-skeleton\r\n [width]=\"widthRandom()(col, rowIndex) + '%'\"\r\n ></p-skeleton>\r\n } }\r\n </td>\r\n }\r\n </ng-container>\r\n } @if (config.actions && config.actions.length > 0) {\r\n <td>\r\n <div class=\"flex flex-row justify-content-end w-full\">\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n <!-- more_vert -->\r\n more_horiz\r\n </span>\r\n\r\n <p-tieredMenu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"tableActions[rowIndex - actionsOffset]\"\r\n appendTo=\"body\"\r\n >\r\n <ng-template let-item pTemplate=\"item\">\r\n <div\r\n [pTooltip]=\"item.tooltip\"\r\n tooltipPosition=\"left\"\r\n class=\"cursor-pointer\"\r\n >\r\n <span class=\"text-xs\">\r\n {{ item.label }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </p-tieredMenu>\r\n <!-- <span pTooltip=\"{{ tableActions[rowIndex - actionsOffset][0]?.tooltip }}\" tooltipPosition=\"top\">a</span> -->\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"emptymessage\" let-columns>\r\n <tr>\r\n <td\r\n [attr.colspan]=\"columns.length + 2\"\r\n style=\"text-align: center; border-radius: 10px !important\"\r\n >\r\n <p class=\"font-medium m-0 text-xs\">Nenhum registro encontrado</p>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n }\r\n</div>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://fonts.googleapis.com/icon?family=Material+Icons\"\r\n/>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0\"\r\n/>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap\";@import\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\";::ng-deep :root{--kv-color-system: 10,58,120;--kv-color-system-cta: 76, 175, 80;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255;--kv-primary-color: 41, 185, 45;--kv-secondary-color: 0, 37, 66;--kv-tertiary-color: 165, 165, 165;--kv-danger-color: 220, 53, 69;--kv-success-color: 75, 181, 67;--kv-info-color: 58, 170, 208;--kv-warn-color: 241, 90, 36;--kv-contrast-color: 33, 37, 41}::ng-deep .padrao{--kv-color-system: 10,58,120;--kv-color-system-cta: 76, 175, 80;--kv-color-text: 0, 0, 0;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255}::ng-deep .theme-keevocenter{--kv-color-system: 88,25,153;--kv-color-system-cta: 0, 116, 217;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255}::ng-deep .theme-holos{--kv-color-system: 241,90,36;--kv-color-system-cta: 224, 168, 35;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 240,240,240;--kv-background-card: 2255,255,255}.system-color{color:rgb(var(--kv-color-system),1)}.bg-system-100{background:rgb(var(--kv-color-system),1)}.bg-system-75{background:rgb(var(--kv-color-system),.75)}.bg-system-50{background:rgb(var(--kv-color-system),.5)}.bg-system-25{background:rgb(var(--kv-color-system),.25)}.material-symbols-outlined{font-family:Material Symbols Outlined!important}*{font-family:Inter,Inter var,sans-serif!important}::ng-deep .p-accordion,::ng-deep .p-accordion-header,::ng-deep .p-accordion-content,::ng-deep .p-badge,::ng-deep .p-overlay-badge,::ng-deep .p-breadcrumb,::ng-deep .p-breadcrumb-item,::ng-deep .p-breadcrumb-link,::ng-deep .p-button,::ng-deep .p-calendar,::ng-deep .p-card,::ng-deep .p-card-title,::ng-deep .p-card-subtitle,::ng-deep .p-card-content,::ng-deep .p-checkbox,::ng-deep .p-chip,::ng-deep .p-confirm-dialog,::ng-deep .p-confirm-dialog-message,::ng-deep .p-contextmenu,::ng-deep .p-contextmenu-item,::ng-deep .p-dataview,::ng-deep .p-dataview-content,::ng-deep .p-dialog,::ng-deep .p-dialog-title,::ng-deep .p-dialog-content,::ng-deep .p-dropdown,::ng-deep .p-dropdown-label,::ng-deep .p-dropdown-item,::ng-deep .p-dynamic-dialog,::ng-deep .p-dynamic-dialog-title,::ng-deep .p-dynamic-dialog-content,::ng-deep .p-editor,::ng-deep .p-fieldset,::ng-deep .p-fieldset-legend,::ng-deep .p-fieldset-content,::ng-deep .p-fileupload,::ng-deep .p-inputmask,::ng-deep .p-inputnumber,::ng-deep .p-inputtextarea,::ng-deep .p-inputtext,::ng-deep .p-menu,::ng-deep .p-menuitem,::ng-deep .p-menuitem-text,::ng-deep .p-message,::ng-deep .p-messages,::ng-deep .p-multiselect,::ng-deep .p-multiselect-label,::ng-deep .p-multiselect-item,::ng-deep .p-panelmenu,::ng-deep .p-panelmenu-header,::ng-deep .p-panelmenu-content,::ng-deep .p-panel,::ng-deep .p-panel-header,::ng-deep .p-panel-content,::ng-deep .p-password,::ng-deep .p-picklist,::ng-deep .p-progressbar,::ng-deep .p-radiobutton,::ng-deep .p-rating,::ng-deep .p-sidebar,::ng-deep .p-splitbutton,::ng-deep .p-steps,::ng-deep .p-step,::ng-deep .p-table,::ng-deep .p-datatable,::ng-deep .p-tabview,::ng-deep .p-tabpanel,::ng-deep .p-tag,::ng-deep .p-toast,::ng-deep .p-toolbar,::ng-deep .p-tooltip,::ng-deep .p-tree,::ng-deep .p-treetable,::ng-deep .p-selectbutton,::ng-deep .p-stepper,::ng-deep .p-inputgroup,::ng-deep .p-inputgroup-addon,::ng-deep .p-text{font-family:Inter,Inter var,sans-serif!important}::ng-deep .p-icon,svg{height:.6rem}:host ::ng-deep .inputs{height:1.875rem}:host ::ng-deep .inputs,.p-inputtext,.p-inputtextarea{font-size:.875rem}::ng-deep .p-dialog .p-dialog-header{color:rgb(var(--kv-color-text))!important;background:linear-gradient(0deg,#00000005 .44%,#0000 49.5%),#fff!important;display:flex!important;flex-wrap:wrap;word-wrap:break-word;border-bottom:1px solid rgb(var(--kv-color-text),.15)}::ng-deep .p-dialog{min-width:320px}::ng-deep .p-dialog-content{overflow-x:hidden}::ng-deep .p-dialog-content::-webkit-scrollbar{width:8px}::ng-deep .p-dialog-content::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .p-dialog-content::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .p-dialog-content:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .p-dialog-content::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}::ng-deep .p-dialog-footer{display:flex;justify-content:flex-end;padding:10px;gap:10px}::ng-deep .p-dialog .p-dialog-header .p-dialog-header-icon{display:none}::ng-deep .p-tooltip{font-size:.825rem!important}::ng-deep p-tablecheckbox p-tableheadercheckbox .p-checkbox{display:flex!important;align-items:center!important;justify-content:right}::ng-deep .p-checkbox{display:flex!important;align-items:center!important;justify-content:center}::ng-deep .kv-button .p-button-loading-icon svg{width:100%;height:100%;display:block}::ng-deep .kv-button .p-button-loading-icon svg g{transform:translate(0)}::ng-deep .kv-button{white-space:nowrap;border:none;padding:.4rem;display:flex;flex-direction:row;align-items:center;justify-content:center;gap:.125rem}::ng-deep .kv-button .kv-button-label{font-weight:500}::ng-deep .small{height:1.625rem;min-width:1.625rem}::ng-deep .small .kv-button-label{font-size:.625rem}::ng-deep .small .kv-button-icon{font-size:.75rem}::ng-deep .small .p-button-loading-icon{width:.55rem;height:.55rem}::ng-deep .normal{height:1.875rem;min-width:1.875rem}::ng-deep .normal .kv-button-label{font-size:.825rem}::ng-deep .normal .kv-button-icon{font-size:1rem}::ng-deep .normal .p-button-loading-icon{width:.75rem;height:.75rem}::ng-deep .large{height:2.125rem;min-width:2.125rem}::ng-deep .large .kv-button-label{font-size:1rem}::ng-deep .large .kv-button-icon{font-size:1.25rem}::ng-deep .large .p-button-loading-icon{width:.875rem;height:.875rem}::ng-deep .primary{background-color:rgb(var(--kv-primary-color))}::ng-deep .primary:hover{background-color:rgba(var(--kv-primary-color),.8)}::ng-deep .primary:active{background-color:rgba(var(--kv-primary-color),.95)}.primary.outline{border:solid .5px rgb(var(--kv-primary-color));background-color:#fff;color:rgb(var(--kv-primary-color))}.primary.outline:hover{background-color:rgb(var(--kv-primary-color));color:#fff}.primary.outline:active{background-color:rgba(var(--kv-primary-color),.8)}.primary.text{opacity:.9;background-color:transparent;color:rgb(var(--kv-primary-color))}.primary.text:hover{background-color:rgba(var(--kv-primary-color),.1)}.primary.text:active{background-color:rgba(var(--kv-primary-color),.2)}::ng-deep .secondary{background-color:rgb(var(--kv-secondary-color))}::ng-deep .secondary:hover{background-color:rgba(var(--kv-secondary-color),.8)}::ng-deep .secondary:active{background-color:rgba(var(--kv-secondary-color),.95)}.secondary.outline{border:solid .5px rgb(var(--kv-secondary-color));background-color:#fff;color:rgb(var(--kv-secondary-color))}.secondary.outline:hover{background-color:rgb(var(--kv-secondary-color));color:#fff}.secondary.outline:active{background-color:rgba(var(--kv-secondary-color),.8)}.secondary.text{background-color:transparent;color:rgb(var(--kv-secondary-color))}.secondary.text:hover{background-color:rgba(var(--kv-secondary-color),.1)}.secondary.text:active{background-color:rgba(var(--kv-secondary-color),.2)}::ng-deep .tertiary{color:#212121;background-color:rgba(var(--kv-tertiary-color),.3)}::ng-deep .tertiary:hover{background-color:rgba(var(--kv-tertiary-color),.8)}::ng-deep .tertiary:active{background-color:rgba(var(--kv-tertiary-color),.95)}.tertiary.outline{border:solid .5px rgb(var(--kv-tertiary-color));background-color:#fff;color:rgb(var(--kv-tertiary-color))}.tertiary.outline:hover{background-color:rgb(var(--kv-tertiary-color));color:#fff}.tertiary.outline:active{background-color:rgba(var(--kv-tertiary-color),.8)}.tertiary.text{background-color:transparent;color:rgb(var(--kv-tertiary-color))}.tertiary.text:hover{background-color:rgba(var(--kv-tertiary-color),.1)}.tertiary.text:active{background-color:rgba(var(--kv-tertiary-color),.2)}::ng-deep .danger{background-color:rgb(var(--kv-danger-color))}::ng-deep .danger:hover{background-color:rgba(var(--kv-danger-color),.8)}::ng-deep .danger:active{background-color:rgba(var(--kv-danger-color),.95)}::ng-deep .danger.outline{border:solid .5px rgb(var(--kv-danger-color));background-color:#fff;color:rgb(var(--kv-danger-color))}::ng-deep .danger.outline:hover{background-color:rgb(var(--kv-danger-color));color:#fff}::ng-deep .danger.outline:active{background-color:rgba(var(--kv-danger-color),.8)}::ng-deep .danger.text{background-color:transparent;color:rgb(var(--kv-danger-color))}::ng-deep .danger.text:hover{background-color:rgba(var(--kv-danger-color),.1)}::ng-deep .danger.text:active{background-color:rgba(var(--kv-danger-color),.2)}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar{width:6px}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .p-datatable>.p-datatable-wrapper:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}.tag{width:5px;height:20px;border-radius:.25rem}::ng-deep .p-panel .p-panel-header{border:none!important}:host ::ng-deep .p-datatable-header{padding:0!important;border-radius:5px!important;background-color:transparent;border:none}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th{padding:.15rem;background-color:rgba(var(--kv-color-system),.05);color:rgba(var(--kv-color-text),.6)}::ng-deep .p-datatable-table{border:1px solid rgba(var(--kv-color-system),.1);border-radius:.5rem;overflow:hidden;color:rgb(var(--kv-color-system))}.icon-more{font-weight:500;font-size:1.4rem!important;color:rgb(var(--kv-color-system),.75);transition:all .4s}.icon-more:hover,.icon-more:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}.tr-td{overflow-wrap:anywhere}.tr-td:hover{box-shadow:#3c40434d 0 1px 2px,#3c404326 0 2px 6px 2px;background-color:#fff;transition:color .3s,transform .3s;transform:scale(1)}.tr-td:hover.last{box-shadow:-1px -1px 9px -3px #000000bf;-webkit-box-shadow:-1px -1px 9px -3px rgba(0,0,0,.75);-moz-box-shadow:-1px -1px 9px -3px rgba(0,0,0,.75)}.disabled-row{pointer-events:none;opacity:.6;background-color:#dddddd8e}::ng-deep .p-tooltip{pointer-events:auto}.btn-table{background-color:#29b92d;padding:12px}.btn-table:hover{background-color:#249a29}.btn-table:active{background-color:#1c801f}.btn-table:disabled{background-color:#29b92d}::ng-deep svg.p-icon{width:.65rem;height:.65rem}::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:#004172;background:#004172}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:hover{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:active{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:disabled{background-color:#002542;opacity:.4;cursor:auto}input{height:1.75rem}::ng-deep .p-checkbox .p-checkbox-box{width:1.125rem;height:1.125rem;border:1.5px solid #d1d5db}::ng-deep .p-checkbox{display:flex!important;align-items:center!important;justify-content:right;width:1.625rem!important;height:1.125rem}::ng-deep .p-checkbox-label{font-size:.875rem}::ng-deep .p-datatable .p-paginator-bottom{border:solid #ffffff;scale:.75}::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td{padding:.1rem}::ng-deep .p-dropdown-panel .p-dropdown-items .p-dropdown-item{padding:.25rem!important}::ng-deep .p-dropdown-panel .p-dropdown-items{padding:.5rem!important}::ng-deep .p-button-label{font-weight:500!important}::ng-deep .p-button .p-button-icon-left{margin-left:.25rem;margin-right:.25rem;font-size:.675rem!important}:host{height:100%}::ng-deep .kv-table-container,::ng-deep p-table{height:100%}::ng-deep p-table .p-datatable{display:flex;flex-direction:column;height:100%}::ng-deep .p-datatable .p-datatable-wrapper{flex:1 1 1}::ng-deep p-table .p-datatable .p-datatable-wrapper,::ng-deep p-table{height:100%}::ng-deep table{height:auto!important}.ellipsis-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:inline-block}::ng-deep .p-tieredmenu{padding:.5rem!important}:host ::ng-deep .p-disabled *{pointer-events:auto!important}::ng-deep p-tieredmenusub .p-disabled *:active{pointer-events:none!important;font-size:.75rem!important;padding:.5rem!important}::ng-deep .p-tieredmenu .p-tieredmenu-root-list{font-size:.75rem!important}::ng-deep .p-tieredmenu .p-menuitem>.p-menuitem-content{padding:.5rem}\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: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i5.AutoFocus, selector: "[pAutoFocus]", inputs: ["autofocus"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i7.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i8.Card, selector: "p-card", inputs: ["header", "subheader", "style", "styleClass"] }, { kind: "component", type: i9.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i10.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i11.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i12.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: i13.TieredMenu, selector: "p-tieredMenu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "autoDisplay", "showTransitionOptions", "hideTransitionOptions", "id", "ariaLabel", "ariaLabelledBy", "disabled", "tabindex"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i14.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: i14.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i14.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i14.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i14.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i16.KvSwitchComponent, selector: "kv-switch", inputs: ["readonly", "switchValue"], outputs: ["onSwitchChange"] }, { kind: "component", type: i17.KvButtonComponent, selector: "kv-button", inputs: ["fullWidth", "type", "loading", "severity", "size", "icon", "iconPosition", "label", "disabled", "items", "popup", "popupIcon"], outputs: ["iconChange", "onClick"] }] }); }
586
586
  }
587
587
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvTableComponent, decorators: [{
588
588
  type: Component,
589
- args: [{ selector: 'kv-table', template: "<div class=\"kv-table-container\">\r\n @if (config) {\r\n <p-table\r\n #dt\r\n styleClass=\"p-datatable-sm\"\r\n [value]=\"dataSource\"\r\n [(selection)]=\"selectedItems\"\r\n [rowSelectable]=\"isRowSelectable\"\r\n [columns]=\"config.columns\"\r\n [globalFilterFields]=\"globalFilterFields\"\r\n [rows]=\"rows()\"\r\n [paginator]=\"paginator\"\r\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{first} - {last} de {totalRecords}\"\r\n [rowHover]=\"true\"\r\n [totalRecords]=\"totalRecords\"\r\n [lazy]=\"config.lazy\"\r\n [first]=\"first()\"\r\n (onLazyLoad)=\"paginate($event)\"\r\n (selectionChange)=\"selectionChange($event)\"\r\n (onSort)=\"onSort($event)\"\r\n (onPage)=\"onPage($event)\"\r\n rowGroupMode=\"rowspan\"\r\n [groupRowsBy]=\"config.fieldGroup\"\r\n [showFirstLastIcon]=\"widthPage() > 960 ? true : false\"\r\n [pageLinks]=\"widthPage() > 960 ? 2 : 1\"\r\n [responsive]=\"true\"\r\n [responsiveLayout]=\"responsiveLayout ? 'stack' : ''\"\r\n [scrollable]=\"isTableScrollable\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [rowTrackBy]=\"rowTrackBy\"\r\n >\r\n @if (config?.enableCation) {\r\n <ng-template pTemplate=\"caption\">\r\n <div\r\n class=\"flex flex-row flex-wrap justify-content-between grid formgrid p-fluid col-12 m-0 mb-2\"\r\n [style.padding.rem]=\"0.1\"\r\n >\r\n <div class=\"col-12 flex flex-column\">\r\n @if (config.title) {\r\n <div class=\"text-md font-bold my-3\">\r\n {{ config.title }}\r\n </div>\r\n } @if (config.subtitle) {\r\n <div class=\"text-sm mb-4 font-medium\">\r\n {{ config.subtitle }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-row align-items-center md:col-6 lg:col-4 {{\r\n widthPage() < 768 ? 'col-10' : 'col-12'\r\n }} gap-1 p-0\"\r\n >\r\n @if (config?.enableFilter) {\r\n <!-- <span class=\"p-input-icon-left\">\r\n <i class=\"pi pi-search text-sm\"></i>\r\n\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm \"\r\n />\r\n </span> -->\r\n @if(autoFocusSearch) {\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm col-6\"\r\n />\r\n } \r\n @else {<input\r\n pInputText\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm col-6\"\r\n />}\r\n\r\n } @if(filterColumnsBtn) {\r\n <div #botaoFiltro>\r\n <kv-button\r\n id=\"botaoFiltro\"\r\n [icon]=\"'align_vertical_top'\"\r\n (onClick)=\"abrirMenuFiltro($event)\"\r\n severity=\"tertiary\"\r\n pTooltip=\"Ocultar/Exibir colunas\"\r\n size=\"small\"\r\n >\r\n </kv-button>\r\n </div>\r\n\r\n <div\r\n #menuFiltroDiv\r\n id=\"menuFiltroDiv\"\r\n [style.visibility]=\"'hidden'\"\r\n class=\"absolute z-4 bg-gray-200 menu-columns-filtro\"\r\n >\r\n <p-card styleClass=\"p-1\">\r\n <div\r\n class=\"flex flex-column text-medium w-15rem p-1\"\r\n *ngFor=\"let col of columnsFilter()\"\r\n >\r\n {{ checkMenuFiltro(col) }}\r\n <p-checkbox\r\n #filterColumns\r\n [label]=\"col.header\"\r\n [binary]=\"true\"\r\n class=\"checkbox-container\"\r\n (onChange)=\"dinamicColumnSet($event, col)\"\r\n [(ngModel)]=\"col.checked\"\r\n *ngIf=\"!dinamicDisableColumn(col)\"\r\n ></p-checkbox>\r\n </div>\r\n </p-card>\r\n </div>\r\n } @if(filterButton()) {\r\n <p-button\r\n styleClass=\"kv-button small tertiary text-xs font-medium\"\r\n label=\"Filtrar\"\r\n icon=\"pi pi-filter\"\r\n [badge]=\"filterButtonBadge()\"\r\n badgeClass=\"text-gray-800\"\r\n class=\"text-xs\"\r\n (onClick)=\"op.toggle($event)\"\r\n ></p-button>\r\n }\r\n\r\n <p-overlayPanel #op>\r\n <ng-content select=\"[filtro]\"> </ng-content>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n <div class=\"flex flex-row col-2 justify-content-end gap-2 p-0\">\r\n @for (action of config.actionsLote; track i; let i = $index) {\r\n <div class=\"flex align-items-center justify-content-center\">\r\n @if ((selectedItems.length > 0 || action.showAcoesLote) &&\r\n (getOrExecute(action.visible, selectedItems) ?? true)) {\r\n <kv-button\r\n (onClick)=\"action?.command(); activeItemLote(selectedItems)\"\r\n [pTooltip]=\"getOrExecute(action.tooltip, selectedItems)\"\r\n [tooltipPosition]=\"'left'\"\r\n [disabled]=\"getOrExecute(action.disabled, selectedItems) || false\"\r\n [icon]=\"getOrExecute(action.icon, selectedItems)\"\r\n [severity]=\"action.severity || 'tertiary'\"\r\n size=\"small\"\r\n [label]=\"getOrExecute(action.label, selectedItems) || ''\"\r\n [items]=\"action.items || []\"\r\n [popup]=\"(action.items && action.items.length > 0) || false\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n }\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @if (config.enableSelect) {\r\n <th>\r\n <p-tableHeaderCheckbox\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [disabled]=\"disabledHeaderCheckbox\"\r\n ></p-tableHeaderCheckbox>\r\n </th>\r\n } @for (col of columns; track $index) {\r\n <th\r\n [pSortableColumn]=\"col.field\"\r\n [pSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div\r\n class=\"flex flex-row align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <span class=\"text-xs font-semibold\">{{ col.header }}</span>\r\n @if (col.sortable) {\r\n <p-sortIcon [field]=\"col.field\" class=\"pb-1\"></p-sortIcon>\r\n } @if (col.headerTooltip) {\r\n <span\r\n class=\"material-symbols-outlined flex align-items-center\"\r\n [pTooltip]=\"col.headerTooltip\"\r\n >info</span\r\n >\r\n }\r\n </div>\r\n </th>\r\n } @if (config.actions && config.actions.length > 0) {\r\n <th></th>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-rowData\r\n let-columns=\"columns\"\r\n let-rowgroup=\"rowgroup\"\r\n let-rowspan=\"rowspan\"\r\n let-rowIndex=\"rowIndex\"\r\n >\r\n <tr\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{\r\n capitalize: tableCaptalized,\r\n last: rowIndex === dataSource.length - 1\r\n }\"\r\n class=\"tr-td {{ isDisabledRow(rowData) ? 'disabled-row' : '' }}\"\r\n >\r\n @if (config.enableSelect) {\r\n <td style=\"width: 8px !important\">\r\n <p-tableCheckbox\r\n [value]=\"rowData\"\r\n [disabled]=\"isDisabledCheckbox(rowData)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n ></p-tableCheckbox>\r\n </td>\r\n } @for (col of columns; track $index) {\r\n <ng-container>\r\n @if (rowgroup && !col.template) {\r\n <td\r\n [attr.rowspan]=\"rowgroup && col.grouped ? rowspan : null\"\r\n [pTooltip]=\"returnTooltipRow(rowData, col)\"\r\n class=\"{{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }}\"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n\r\n <span\r\n *ngIf=\"!isBooleanField(rowData, col); else booleanField\"\r\n [class]=\"returnRowClass(rowData, col)\"\r\n >\r\n @if (!isChipField(col) && !col.iconField && !isImageField(col) &&\r\n !isEmptyDataSource()) {\r\n <span\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }} text-xs {{ ellipsisText() && 'ellipsis-text' }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n [style.max-width]=\"\r\n ellipsisText() && returnMaxWidth()(col.width)\r\n \"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n } @if (col.icon) {\r\n <i [class]=\"col.icon + ' mr-2'\"></i>\r\n }\r\n {{ transformValue(rowData, col) }}\r\n </span>\r\n } @if (isChipField(col) && !col.iconField) {\r\n <div>\r\n <span\r\n [class]=\"returnClassChip(rowData, col)\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n class=\"text-xs\"\r\n >{{ transformValue(rowData, col) }}</span\r\n >\r\n </div>\r\n } @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </span>\r\n\r\n @if (isImageField(col)) {\r\n <span>\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n } @if (col.iconField) {\r\n <i\r\n [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n >\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n }\r\n\r\n <ng-template #booleanField>\r\n @if (!col.iconField && !isSwitchField(col)) {\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n <i\r\n [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"\r\n ><span\r\n class=\"material-symbols-outlined text-lg font-semibold\"\r\n >\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n </div>\r\n\r\n } @if (isSwitchField(col)) {\r\n <span\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row align-items-center justify-content-center'\r\n \"\r\n style=\"height: 25px\"\r\n >\r\n @if(col.switchDisable){\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col.switchDisable(rowData, col)\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n } @else {\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n }\r\n </span>\r\n } @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </ng-template>\r\n </td>\r\n } @if (!rowgroup && !col.grouped && !col.template) {\r\n <td\r\n #tableCell\r\n class=\"rowTable {{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }} \"\r\n [pTooltip]=\"returnTooltipRow(rowData, col)\"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n\r\n @if(!isEmptyDataSource()) {\r\n\r\n <span\r\n *ngIf=\"!isBooleanField(rowData, col); else booleanField\"\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row gap-2 align-items-center ' +\r\n (col?.centralize && 'justify-content-center')\r\n \"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n [style.max-width]=\"ellipsisText() && returnMaxWidth()(col.width)\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n } @if (!isChipField(col) && !col.iconField && !isImageField(col)){\r\n <span class=\"text-xs {{ ellipsisText() && 'ellipsis-text' }}\">\r\n @if (col.icon) {\r\n <i [class]=\"col.icon + ' mr-2'\"></i>\r\n }\r\n {{ transformValue(rowData, col) }}\r\n </span>\r\n } @if (isChipField(col) && !col.iconField) {\r\n <div>\r\n <span\r\n [class]=\"returnClassChip(rowData, col)\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n class=\"text-xs\"\r\n >\r\n {{ transformValue(rowData, col) }}</span\r\n >\r\n </div>\r\n }\r\n </span>\r\n } @if (isImageField(col)) {\r\n <span>\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n } @if (col.iconField) {\r\n <i\r\n [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n >\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n }\r\n\r\n <ng-template #booleanField>\r\n @if (!col.iconField && !isSwitchField(col)) {\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n <i\r\n [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"\r\n ><span\r\n class=\"material-symbols-outlined text-lg font-semibold\"\r\n >\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n </div>\r\n } @if (isSwitchField(col)) {\r\n\r\n <span\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row align-items-center justify-content-center'\r\n \"\r\n style=\"height: 25px\"\r\n >\r\n @if(col.switchDisable){\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col.switchDisable(rowData, col)\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n } @else {\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n }\r\n </span>\r\n }\r\n </ng-template>\r\n\r\n @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </td>\r\n } @if (col.template) {\r\n <td\r\n class=\"rowTable {{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }} \"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n @if (getCustomTemplate(col.template.name)) {\r\n\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && ' justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"col.tooltipTag && col.tooltipTag(rowData, col)\"\r\n [style.background-color]=\"col.tagColor(rowData, col)\"\r\n ></div>\r\n } @if(!isEmptyDataSource()) {\r\n\r\n <div class=\"w-full\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <p-skeleton\r\n [width]=\"widthRandom()(col, rowIndex) + '%'\"\r\n ></p-skeleton>\r\n } }\r\n </td>\r\n }\r\n </ng-container>\r\n } @if (config.actions && config.actions.length > 0) {\r\n <td>\r\n <div class=\"flex flex-row justify-content-end w-full\">\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n <!-- more_vert -->\r\n more_horiz\r\n </span>\r\n\r\n <p-tieredMenu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"tableActions[rowIndex - actionsOffset]\"\r\n appendTo=\"body\"\r\n >\r\n <ng-template let-item pTemplate=\"item\">\r\n <div\r\n [pTooltip]=\"item.tooltip\"\r\n tooltipPosition=\"left\"\r\n class=\"cursor-pointer\"\r\n >\r\n <span class=\"text-xs\">\r\n {{ item.label }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </p-tieredMenu>\r\n <!-- <span pTooltip=\"{{ tableActions[rowIndex - actionsOffset][0]?.tooltip }}\" tooltipPosition=\"top\">a</span> -->\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"emptymessage\" let-columns>\r\n <tr>\r\n <td\r\n [attr.colspan]=\"columns.length + 2\"\r\n style=\"text-align: center; border-radius: 10px !important\"\r\n >\r\n <p class=\"font-medium m-0 text-xs\">Nenhum registro encontrado</p>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n }\r\n</div>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://fonts.googleapis.com/icon?family=Material+Icons\"\r\n/>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0\"\r\n/>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap\";@import\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\";::ng-deep :root{--kv-color-system: 10,58,120;--kv-color-system-cta: 76, 175, 80;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255;--kv-primary-color: 41, 185, 45;--kv-secondary-color: 0, 37, 66;--kv-tertiary-color: 165, 165, 165;--kv-danger-color: 220, 53, 69;--kv-success-color: 75, 181, 67;--kv-info-color: 58, 170, 208;--kv-warn-color: 241, 90, 36;--kv-contrast-color: 33, 37, 41}::ng-deep .padrao{--kv-color-system: 10,58,120;--kv-color-system-cta: 76, 175, 80;--kv-color-text: 0, 0, 0;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255}::ng-deep .theme-keevocenter{--kv-color-system: 88,25,153;--kv-color-system-cta: 0, 116, 217;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255}::ng-deep .theme-holos{--kv-color-system: 241,90,36;--kv-color-system-cta: 224, 168, 35;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 240,240,240;--kv-background-card: 2255,255,255}.system-color{color:rgb(var(--kv-color-system),1)}.bg-system-100{background:rgb(var(--kv-color-system),1)}.bg-system-75{background:rgb(var(--kv-color-system),.75)}.bg-system-50{background:rgb(var(--kv-color-system),.5)}.bg-system-25{background:rgb(var(--kv-color-system),.25)}.material-symbols-outlined{font-family:Material Symbols Outlined!important}*{font-family:Inter,Inter var,sans-serif!important}::ng-deep .p-accordion,::ng-deep .p-accordion-header,::ng-deep .p-accordion-content,::ng-deep .p-badge,::ng-deep .p-overlay-badge,::ng-deep .p-breadcrumb,::ng-deep .p-breadcrumb-item,::ng-deep .p-breadcrumb-link,::ng-deep .p-button,::ng-deep .p-calendar,::ng-deep .p-card,::ng-deep .p-card-title,::ng-deep .p-card-subtitle,::ng-deep .p-card-content,::ng-deep .p-checkbox,::ng-deep .p-chip,::ng-deep .p-confirm-dialog,::ng-deep .p-confirm-dialog-message,::ng-deep .p-contextmenu,::ng-deep .p-contextmenu-item,::ng-deep .p-dataview,::ng-deep .p-dataview-content,::ng-deep .p-dialog,::ng-deep .p-dialog-title,::ng-deep .p-dialog-content,::ng-deep .p-dropdown,::ng-deep .p-dropdown-label,::ng-deep .p-dropdown-item,::ng-deep .p-dynamic-dialog,::ng-deep .p-dynamic-dialog-title,::ng-deep .p-dynamic-dialog-content,::ng-deep .p-editor,::ng-deep .p-fieldset,::ng-deep .p-fieldset-legend,::ng-deep .p-fieldset-content,::ng-deep .p-fileupload,::ng-deep .p-inputmask,::ng-deep .p-inputnumber,::ng-deep .p-inputtextarea,::ng-deep .p-inputtext,::ng-deep .p-menu,::ng-deep .p-menuitem,::ng-deep .p-menuitem-text,::ng-deep .p-message,::ng-deep .p-messages,::ng-deep .p-multiselect,::ng-deep .p-multiselect-label,::ng-deep .p-multiselect-item,::ng-deep .p-panelmenu,::ng-deep .p-panelmenu-header,::ng-deep .p-panelmenu-content,::ng-deep .p-panel,::ng-deep .p-panel-header,::ng-deep .p-panel-content,::ng-deep .p-password,::ng-deep .p-picklist,::ng-deep .p-progressbar,::ng-deep .p-radiobutton,::ng-deep .p-rating,::ng-deep .p-sidebar,::ng-deep .p-splitbutton,::ng-deep .p-steps,::ng-deep .p-step,::ng-deep .p-table,::ng-deep .p-datatable,::ng-deep .p-tabview,::ng-deep .p-tabpanel,::ng-deep .p-tag,::ng-deep .p-toast,::ng-deep .p-toolbar,::ng-deep .p-tooltip,::ng-deep .p-tree,::ng-deep .p-treetable,::ng-deep .p-selectbutton,::ng-deep .p-stepper,::ng-deep .p-inputgroup,::ng-deep .p-inputgroup-addon,::ng-deep .p-text{font-family:Inter,Inter var,sans-serif!important}::ng-deep .p-icon,svg{height:.6rem}:host ::ng-deep .inputs{height:1.875rem}:host ::ng-deep .inputs,.p-inputtext,.p-inputtextarea{font-size:.875rem}::ng-deep .p-dialog .p-dialog-header{color:rgb(var(--kv-color-text))!important;background:linear-gradient(0deg,#00000005 .44%,#0000 49.5%),#fff!important;display:flex!important;flex-wrap:wrap;word-wrap:break-word;border-bottom:1px solid rgb(var(--kv-color-text),.15)}::ng-deep .p-dialog{min-width:320px}::ng-deep .p-dialog-content{overflow-x:hidden}::ng-deep .p-dialog-content::-webkit-scrollbar{width:8px}::ng-deep .p-dialog-content::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .p-dialog-content::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .p-dialog-content:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .p-dialog-content::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}::ng-deep .p-dialog-footer{display:flex;justify-content:flex-end;padding:10px;gap:10px}::ng-deep .p-dialog .p-dialog-header .p-dialog-header-icon{display:none}::ng-deep .p-tooltip{font-size:.825rem!important}::ng-deep p-tablecheckbox p-tableheadercheckbox .p-checkbox{display:flex!important;align-items:center!important;justify-content:right}::ng-deep .p-checkbox{display:flex!important;align-items:center!important;justify-content:center}::ng-deep .kv-button .p-button-loading-icon svg{width:100%;height:100%;display:block}::ng-deep .kv-button .p-button-loading-icon svg g{transform:translate(0)}::ng-deep .kv-button{white-space:nowrap;border:none;padding:.4rem;display:flex;flex-direction:row;align-items:center;justify-content:center;gap:.125rem}::ng-deep .kv-button .kv-button-label{font-weight:500}::ng-deep .small{height:1.625rem;min-width:1.625rem}::ng-deep .small .kv-button-label{font-size:.625rem}::ng-deep .small .kv-button-icon{font-size:.75rem}::ng-deep .small .p-button-loading-icon{width:.55rem;height:.55rem}::ng-deep .normal{height:1.875rem;min-width:1.875rem}::ng-deep .normal .kv-button-label{font-size:.825rem}::ng-deep .normal .kv-button-icon{font-size:1rem}::ng-deep .normal .p-button-loading-icon{width:.75rem;height:.75rem}::ng-deep .large{height:2.125rem;min-width:2.125rem}::ng-deep .large .kv-button-label{font-size:1rem}::ng-deep .large .kv-button-icon{font-size:1.25rem}::ng-deep .large .p-button-loading-icon{width:.875rem;height:.875rem}::ng-deep .primary{background-color:rgb(var(--kv-primary-color))}::ng-deep .primary:hover{background-color:rgba(var(--kv-primary-color),.8)}::ng-deep .primary:active{background-color:rgba(var(--kv-primary-color),.95)}.primary.outline{border:solid .5px rgb(var(--kv-primary-color));background-color:#fff;color:rgb(var(--kv-primary-color))}.primary.outline:hover{background-color:rgb(var(--kv-primary-color));color:#fff}.primary.outline:active{background-color:rgba(var(--kv-primary-color),.8)}.primary.text{opacity:.9;background-color:transparent;color:rgb(var(--kv-primary-color))}.primary.text:hover{background-color:rgba(var(--kv-primary-color),.1)}.primary.text:active{background-color:rgba(var(--kv-primary-color),.2)}::ng-deep .secondary{background-color:rgb(var(--kv-secondary-color))}::ng-deep .secondary:hover{background-color:rgba(var(--kv-secondary-color),.8)}::ng-deep .secondary:active{background-color:rgba(var(--kv-secondary-color),.95)}.secondary.outline{border:solid .5px rgb(var(--kv-secondary-color));background-color:#fff;color:rgb(var(--kv-secondary-color))}.secondary.outline:hover{background-color:rgb(var(--kv-secondary-color));color:#fff}.secondary.outline:active{background-color:rgba(var(--kv-secondary-color),.8)}.secondary.text{background-color:transparent;color:rgb(var(--kv-secondary-color))}.secondary.text:hover{background-color:rgba(var(--kv-secondary-color),.1)}.secondary.text:active{background-color:rgba(var(--kv-secondary-color),.2)}::ng-deep .tertiary{color:#212121;background-color:rgba(var(--kv-tertiary-color),.3)}::ng-deep .tertiary:hover{background-color:rgba(var(--kv-tertiary-color),.8)}::ng-deep .tertiary:active{background-color:rgba(var(--kv-tertiary-color),.95)}.tertiary.outline{border:solid .5px rgb(var(--kv-tertiary-color));background-color:#fff;color:rgb(var(--kv-tertiary-color))}.tertiary.outline:hover{background-color:rgb(var(--kv-tertiary-color));color:#fff}.tertiary.outline:active{background-color:rgba(var(--kv-tertiary-color),.8)}.tertiary.text{background-color:transparent;color:rgb(var(--kv-tertiary-color))}.tertiary.text:hover{background-color:rgba(var(--kv-tertiary-color),.1)}.tertiary.text:active{background-color:rgba(var(--kv-tertiary-color),.2)}::ng-deep .danger{background-color:rgb(var(--kv-danger-color))}::ng-deep .danger:hover{background-color:rgba(var(--kv-danger-color),.8)}::ng-deep .danger:active{background-color:rgba(var(--kv-danger-color),.95)}::ng-deep .danger.outline{border:solid .5px rgb(var(--kv-danger-color));background-color:#fff;color:rgb(var(--kv-danger-color))}::ng-deep .danger.outline:hover{background-color:rgb(var(--kv-danger-color));color:#fff}::ng-deep .danger.outline:active{background-color:rgba(var(--kv-danger-color),.8)}::ng-deep .danger.text{background-color:transparent;color:rgb(var(--kv-danger-color))}::ng-deep .danger.text:hover{background-color:rgba(var(--kv-danger-color),.1)}::ng-deep .danger.text:active{background-color:rgba(var(--kv-danger-color),.2)}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar{width:6px}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .p-datatable>.p-datatable-wrapper:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}.tag{width:5px;height:20px;border-radius:.25rem}::ng-deep .p-panel .p-panel-header{border:none!important}:host ::ng-deep .p-datatable-header{padding:0!important;border-radius:5px!important;background-color:transparent;border:none}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th{padding:.15rem;background-color:rgba(var(--kv-color-system),.05);color:rgba(var(--kv-color-text),.6)}::ng-deep .p-datatable-table{border:1px solid rgba(var(--kv-color-system),.1);border-radius:.5rem;overflow:hidden;color:rgb(var(--kv-color-system))}.icon-more{font-weight:500;font-size:1.4rem!important;color:rgb(var(--kv-color-system),.75);transition:all .4s}.icon-more:hover,.icon-more:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}.tr-td{overflow-wrap:anywhere}.tr-td:hover{box-shadow:#3c40434d 0 1px 2px,#3c404326 0 2px 6px 2px;background-color:#fff;transition:color .3s,transform .3s;transform:scale(1)}.tr-td:hover.last{box-shadow:-1px -1px 9px -3px #000000bf;-webkit-box-shadow:-1px -1px 9px -3px rgba(0,0,0,.75);-moz-box-shadow:-1px -1px 9px -3px rgba(0,0,0,.75)}.disabled-row{pointer-events:none;opacity:.6;background-color:#dddddd8e}::ng-deep .p-tooltip{pointer-events:auto}.btn-table{background-color:#29b92d;padding:12px}.btn-table:hover{background-color:#249a29}.btn-table:active{background-color:#1c801f}.btn-table:disabled{background-color:#29b92d}::ng-deep svg.p-icon{width:.65rem;height:.65rem}::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:#004172;background:#004172}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:hover{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:active{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:disabled{background-color:#002542;opacity:.4;cursor:auto}input{height:1.75rem}::ng-deep .p-checkbox .p-checkbox-box{width:1.125rem;height:1.125rem;border:1.5px solid #d1d5db}::ng-deep .p-checkbox{display:flex!important;align-items:center!important;justify-content:right;width:1.625rem!important;height:1.125rem}::ng-deep .p-checkbox-label{font-size:.875rem}::ng-deep .p-datatable .p-paginator-bottom{border:solid #ffffff;scale:.75}::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td{padding:.1rem}::ng-deep .p-dropdown-panel .p-dropdown-items .p-dropdown-item{padding:.25rem!important}::ng-deep .p-dropdown-panel .p-dropdown-items{padding:.5rem!important}::ng-deep .p-button-label{font-weight:500!important}::ng-deep .p-button .p-button-icon-left{margin-left:.25rem;margin-right:.25rem;font-size:.675rem!important}:host{height:100%}::ng-deep .kv-table-container,::ng-deep p-table{height:100%}::ng-deep p-table .p-datatable{display:flex;flex-direction:column;height:100%}::ng-deep .p-datatable .p-datatable-wrapper{flex:1 1 1}::ng-deep p-table .p-datatable .p-datatable-wrapper,::ng-deep p-table{height:100%}::ng-deep table{height:auto!important}.ellipsis-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:inline-block}::ng-deep .p-tieredmenu{padding:.5rem!important}:host ::ng-deep .p-disabled *{pointer-events:auto!important}::ng-deep p-tieredmenusub .p-disabled *:active{pointer-events:none!important;font-size:.75rem!important;padding:.5rem!important}::ng-deep .p-tieredmenu .p-tieredmenu-root-list{font-size:.75rem!important}::ng-deep .p-tieredmenu .p-menuitem>.p-menuitem-content{padding:.5rem}\n"] }]
589
+ args: [{ selector: 'kv-table', template: "<div class=\"kv-table-container\">\r\n @if (config) {\r\n <p-table\r\n #dt\r\n styleClass=\"p-datatable-sm\"\r\n [value]=\"dataSource\"\r\n [(selection)]=\"selectedItems\"\r\n [rowSelectable]=\"isRowSelectable\"\r\n [columns]=\"config.columns\"\r\n [globalFilterFields]=\"globalFilterFields\"\r\n [rows]=\"rows()\"\r\n [paginator]=\"paginator\"\r\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{first} - {last} de {totalRecords}\"\r\n [rowHover]=\"true\"\r\n [totalRecords]=\"totalRecords\"\r\n [lazy]=\"config.lazy\"\r\n [first]=\"first()\"\r\n (onLazyLoad)=\"paginate($event)\"\r\n (selectionChange)=\"selectionChange($event)\"\r\n (onSort)=\"onSort($event)\"\r\n (onPage)=\"onPage($event)\"\r\n rowGroupMode=\"rowspan\"\r\n [groupRowsBy]=\"config.fieldGroup\"\r\n [showFirstLastIcon]=\"widthPage() > 960 ? true : false\"\r\n [pageLinks]=\"widthPage() > 960 ? 2 : 1\"\r\n [responsive]=\"true\"\r\n [responsiveLayout]=\"responsiveLayout ? 'stack' : ''\"\r\n [scrollable]=\"isTableScrollable\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [rowTrackBy]=\"rowTrackBy\"\r\n >\r\n @if (config?.enableCation) {\r\n <ng-template pTemplate=\"caption\">\r\n <div\r\n class=\"flex flex-row flex-wrap justify-content-between grid formgrid p-fluid col-12 m-0 mb-2\"\r\n [style.padding.rem]=\"0.1\"\r\n >\r\n <div class=\"col-12 flex flex-column\">\r\n @if (config.title) {\r\n <div class=\"text-md font-bold my-3\">\r\n {{ config.title }}\r\n </div>\r\n } @if (config.subtitle) {\r\n <div class=\"text-sm mb-4 font-medium\">\r\n {{ config.subtitle }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-row align-items-center md:col-6 lg:col-4 {{\r\n widthPage() < 768 ? 'col-10' : 'col-12'\r\n }} gap-1 p-0\"\r\n >\r\n @if (config?.enableFilter) {\r\n <!-- <span class=\"p-input-icon-left\">\r\n <i class=\"pi pi-search text-sm\"></i>\r\n\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm \"\r\n />\r\n </span> -->\r\n @if(autoFocusSearch) {\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm col-6\"\r\n />\r\n } \r\n @else {<input\r\n pInputText\r\n [autofocus]=\"widthPage() > 800\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(dt, $event)\"\r\n [placeholder]=\"searchPlaceholder\"\r\n autocomplete=\"off\"\r\n #inputField\r\n class=\"text-sm col-6\"\r\n />}\r\n\r\n } @if(filterColumnsBtn) {\r\n <div #botaoFiltro>\r\n <kv-button\r\n id=\"botaoFiltro\"\r\n [icon]=\"'align_vertical_top'\"\r\n (onClick)=\"abrirMenuFiltro($event)\"\r\n severity=\"tertiary\"\r\n pTooltip=\"Ocultar/Exibir colunas\"\r\n size=\"small\"\r\n >\r\n </kv-button>\r\n </div>\r\n\r\n <div\r\n #menuFiltroDiv\r\n id=\"menuFiltroDiv\"\r\n [style.visibility]=\"'hidden'\"\r\n class=\"absolute z-4 bg-gray-200 menu-columns-filtro\"\r\n >\r\n <p-card styleClass=\"p-1\">\r\n <div\r\n class=\"flex flex-column text-medium w-15rem p-1\"\r\n *ngFor=\"let col of columnsFilter()\"\r\n >\r\n {{ checkMenuFiltro(col) }}\r\n <p-checkbox\r\n #filterColumns\r\n [label]=\"col.header\"\r\n [binary]=\"true\"\r\n class=\"checkbox-container\"\r\n (onChange)=\"dinamicColumnSet($event, col)\"\r\n [(ngModel)]=\"col.checked\"\r\n *ngIf=\"!dinamicDisableColumn(col)\"\r\n ></p-checkbox>\r\n </div>\r\n </p-card>\r\n </div>\r\n } @if(filterButton()) {\r\n <p-button\r\n styleClass=\"kv-button small tertiary text-xs font-medium\"\r\n label=\"Filtrar\"\r\n icon=\"pi pi-filter\"\r\n [badge]=\"filterButtonBadge()\"\r\n badgeClass=\"text-gray-800\"\r\n class=\"text-xs\"\r\n (onClick)=\"op.toggle($event)\"\r\n ></p-button>\r\n }\r\n\r\n <p-overlayPanel #op>\r\n <ng-content select=\"[filtro]\"> </ng-content>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n <div class=\"flex flex-row col-2 justify-content-end gap-2 p-0\">\r\n @for (action of config.actionsLote; track i; let i = $index) {\r\n <div class=\"flex align-items-center justify-content-center\">\r\n @if ((selectedItems.length > 0 || action.showAcoesLote) &&\r\n (getOrExecute(action.visible, selectedItems) ?? true)) {\r\n <kv-button\r\n (onClick)=\"action?.command(); activeItemLote(selectedItems)\"\r\n [pTooltip]=\"getOrExecute(action.tooltip, selectedItems)\"\r\n [tooltipPosition]=\"'left'\"\r\n [disabled]=\"getOrExecute(action.disabled, selectedItems) || false\"\r\n [icon]=\"getOrExecute(action.icon, selectedItems)\"\r\n [severity]=\"action.severity || 'tertiary'\"\r\n size=\"small\"\r\n [label]=\"getOrExecute(action.label, selectedItems) || ''\"\r\n [items]=\"action.items || []\"\r\n [popup]=\"(action.items && action.items.length > 0) || false\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n }\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n @if (config.enableSelect) {\r\n <th>\r\n <p-tableHeaderCheckbox\r\n (click)=\"activeItemLote(selectedItems)\"\r\n [disabled]=\"disabledHeaderCheckbox\"\r\n ></p-tableHeaderCheckbox>\r\n </th>\r\n } @for (col of columns; track $index) {\r\n <th\r\n [pSortableColumn]=\"col.field\"\r\n [pSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.width]=\"col.width\"\r\n >\r\n <div\r\n class=\"flex flex-row align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <span class=\"text-xs font-semibold\">{{ col.header }}</span>\r\n @if (col.sortable) {\r\n <p-sortIcon [field]=\"col.field\" class=\"pb-1\"></p-sortIcon>\r\n } @if (col.headerTooltip) {\r\n <span\r\n class=\"material-symbols-outlined flex align-items-center\"\r\n [pTooltip]=\"col.headerTooltip\"\r\n >info</span\r\n >\r\n }\r\n </div>\r\n </th>\r\n } @if (config.actions && config.actions.length > 0) {\r\n <th></th>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-rowData\r\n let-columns=\"columns\"\r\n let-rowgroup=\"rowgroup\"\r\n let-rowspan=\"rowspan\"\r\n let-rowIndex=\"rowIndex\"\r\n >\r\n <tr\r\n (dblclick)=\"doubleClick($event, rowData)\"\r\n [ngClass]=\"{\r\n capitalize: tableCaptalized,\r\n last: rowIndex === dataSource.length - 1\r\n }\"\r\n class=\"tr-td {{ isDisabledRow(rowData) ? 'disabled-row' : '' }}\"\r\n >\r\n @if (config.enableSelect) {\r\n <td style=\"width: 8px !important\">\r\n <p-tableCheckbox\r\n [value]=\"rowData\"\r\n [disabled]=\"isDisabledCheckbox(rowData)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n ></p-tableCheckbox>\r\n </td>\r\n } @for (col of columns; track $index) {\r\n <ng-container>\r\n @if (rowgroup && !col.template) {\r\n <td\r\n [attr.rowspan]=\"rowgroup && col.grouped ? rowspan : null\"\r\n [pTooltip]=\"returnTooltipRow(rowData, col)\"\r\n class=\"{{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }}\"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n\r\n <span\r\n *ngIf=\"!isBooleanField(rowData, col); else booleanField\"\r\n [class]=\"returnRowClass(rowData, col)\"\r\n >\r\n @if (!isChipField(col) && !col.iconField && !isImageField(col) &&\r\n !isEmptyDataSource()) {\r\n <span\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }} text-xs {{ ellipsisText() && 'ellipsis-text' }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n [style.max-width]=\"\r\n ellipsisText() && returnMaxWidth()(col.width)\r\n \"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n } \r\n <span class=\"text-xs {{ ellipsisText() && 'ellipsis-text' }}\">\r\n @if (col.icon) {\r\n <i [class]=\"col.icon + ' mr-2'\"></i>\r\n }\r\n {{ transformValue(rowData, col) }} \r\n </span> \r\n </span>\r\n } @if (isChipField(col) && !col.iconField) {\r\n <div>\r\n <span\r\n [class]=\"returnClassChip(rowData, col)\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n class=\"text-xs\"\r\n >{{ transformValue(rowData, col) }}</span\r\n >\r\n </div>\r\n } @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </span>\r\n\r\n @if (isImageField(col)) {\r\n <span>\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n } @if (col.iconField) {\r\n <i\r\n [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n >\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n }\r\n\r\n <ng-template #booleanField>\r\n @if (!col.iconField && !isSwitchField(col)) {\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n <i\r\n [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"\r\n ><span\r\n class=\"material-symbols-outlined text-lg font-semibold\"\r\n >\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n </div>\r\n\r\n } @if (isSwitchField(col)) {\r\n <span\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row align-items-center justify-content-center'\r\n \"\r\n style=\"height: 25px\"\r\n >\r\n @if(col.switchDisable){\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col.switchDisable(rowData, col)\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n } @else {\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n }\r\n </span>\r\n } @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </ng-template>\r\n </td>\r\n } @if (!rowgroup && !col.grouped && !col.template) {\r\n <td\r\n #tableCell\r\n class=\"rowTable {{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }} \"\r\n [pTooltip]=\"returnTooltipRow(rowData, col)\"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n\r\n @if(!isEmptyDataSource()) {\r\n\r\n <span\r\n *ngIf=\"!isBooleanField(rowData, col); else booleanField\"\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row gap-2 align-items-center ' +\r\n (col?.centralize && 'justify-content-center')\r\n \"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n [style.max-width]=\"ellipsisText() && returnMaxWidth()(col.width)\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"\r\n col.tooltipTag &&\r\n col.tooltipTag(rowData, col, rowData[col.field])\r\n \"\r\n [style.background-color]=\"\r\n col.tagColor(rowData, col, rowData[col.field])\r\n \"\r\n ></div>\r\n\r\n } @if (!isChipField(col) && !col.iconField && !isImageField(col)){\r\n <span class=\"text-xs {{ ellipsisText() && 'ellipsis-text' }}\">\r\n @if (col.icon) {\r\n <i [class]=\"col.icon + ' mr-2'\"></i>\r\n }\r\n {{ transformValue(rowData, col) }}\r\n </span>\r\n } @if (isChipField(col) && !col.iconField) {\r\n <div>\r\n <span\r\n [class]=\"returnClassChip(rowData, col)\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n class=\"text-xs\"\r\n >\r\n {{ transformValue(rowData, col) }}</span\r\n >\r\n </div>\r\n }\r\n </span>\r\n } @if (isImageField(col)) {\r\n <span>\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n } @if (col.iconField) {\r\n <i\r\n [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\"\r\n [pTooltip]=\"returnTooltipIcon(rowData, col)\"\r\n >\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n }\r\n\r\n <ng-template #booleanField>\r\n @if (!col.iconField && !isSwitchField(col)) {\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && 'justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n <i\r\n [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"\r\n ><span\r\n class=\"material-symbols-outlined text-lg font-semibold\"\r\n >\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n </div>\r\n } @if (isSwitchField(col)) {\r\n\r\n <span\r\n [class]=\"\r\n returnRowClass(rowData, col) +\r\n ' flex flex-row align-items-center justify-content-center'\r\n \"\r\n style=\"height: 25px\"\r\n >\r\n @if(col.switchDisable){\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col.switchDisable(rowData, col)\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n } @else {\r\n <kv-switch\r\n (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\"\r\n [switchValue]=\"transformValue(rowData, col)\"\r\n >\r\n </kv-switch>\r\n }\r\n </span>\r\n }\r\n </ng-template>\r\n\r\n @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <div class=\"w-full\">\r\n @if(!isSwitchField(col)) {\r\n <div\r\n class=\"w-full flex {{\r\n col.centralize && 'justify-content-center'\r\n }}\"\r\n >\r\n <div [style.width]=\"widthRandom()(col, rowIndex) + '%'\">\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n\r\n } @else {\r\n <div class=\"flex flex-row justify-content-center\">\r\n <div\r\n [style]=\"{\r\n height: '16.8px',\r\n width: '28.8px',\r\n 'border-radius': '30px'\r\n }\"\r\n >\r\n <p-skeleton styleClass=\"w-full\"></p-skeleton>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </td>\r\n } @if (col.template) {\r\n <td\r\n class=\"rowTable {{\r\n col.styleClass\r\n ? col.styleClass(rowData, col, rowData[col.field])\r\n : ''\r\n }} \"\r\n >\r\n <span class=\"p-column-title text-xs\">{{ col.header }}:</span>\r\n @if (getCustomTemplate(col.template.name)) {\r\n\r\n <div\r\n class=\"flex flex-row gap-2 align-items-center {{\r\n col?.centralize && ' justify-content-center'\r\n }}\"\r\n [pTooltip]=\"\r\n col.tooltip && col.tooltip(rowData, col, rowData[col.field])\r\n \"\r\n [tooltipPosition]=\"'bottom'\"\r\n >\r\n @if(col.tagColor) {\r\n <div\r\n class=\"tag\"\r\n [pTooltip]=\"col.tooltipTag && col.tooltipTag(rowData, col)\"\r\n [style.background-color]=\"col.tagColor(rowData, col)\"\r\n ></div>\r\n } @if(!isEmptyDataSource()) {\r\n\r\n <div class=\"w-full\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n @if(isEmptyDataSource() && this.isLoadingSkeleton()) {\r\n <p-skeleton\r\n [width]=\"widthRandom()(col, rowIndex) + '%'\"\r\n ></p-skeleton>\r\n } }\r\n </td>\r\n }\r\n </ng-container>\r\n } @if (config.actions && config.actions.length > 0) {\r\n <td>\r\n <div class=\"flex flex-row justify-content-end w-full\">\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n <!-- more_vert -->\r\n more_horiz\r\n </span>\r\n\r\n <p-tieredMenu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"tableActions[rowIndex - actionsOffset]\"\r\n appendTo=\"body\"\r\n >\r\n <ng-template let-item pTemplate=\"item\">\r\n <div\r\n [pTooltip]=\"item.tooltip\"\r\n tooltipPosition=\"left\"\r\n class=\"cursor-pointer\"\r\n >\r\n <span class=\"text-xs\">\r\n {{ item.label }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </p-tieredMenu>\r\n <!-- <span pTooltip=\"{{ tableActions[rowIndex - actionsOffset][0]?.tooltip }}\" tooltipPosition=\"top\">a</span> -->\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"emptymessage\" let-columns>\r\n <tr>\r\n <td\r\n [attr.colspan]=\"columns.length + 2\"\r\n style=\"text-align: center; border-radius: 10px !important\"\r\n >\r\n <p class=\"font-medium m-0 text-xs\">Nenhum registro encontrado</p>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n }\r\n</div>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://fonts.googleapis.com/icon?family=Material+Icons\"\r\n/>\r\n\r\n<link\r\n rel=\"stylesheet\"\r\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0\"\r\n/>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap\";@import\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\";::ng-deep :root{--kv-color-system: 10,58,120;--kv-color-system-cta: 76, 175, 80;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255;--kv-primary-color: 41, 185, 45;--kv-secondary-color: 0, 37, 66;--kv-tertiary-color: 165, 165, 165;--kv-danger-color: 220, 53, 69;--kv-success-color: 75, 181, 67;--kv-info-color: 58, 170, 208;--kv-warn-color: 241, 90, 36;--kv-contrast-color: 33, 37, 41}::ng-deep .padrao{--kv-color-system: 10,58,120;--kv-color-system-cta: 76, 175, 80;--kv-color-text: 0, 0, 0;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255}::ng-deep .theme-keevocenter{--kv-color-system: 88,25,153;--kv-color-system-cta: 0, 116, 217;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 248,250,253;--kv-background-card: 255,255,255}::ng-deep .theme-holos{--kv-color-system: 241,90,36;--kv-color-system-cta: 224, 168, 35;--kv-color-text: 0, 0, 0;--kv-color-text-inv: 255, 255, 165;--kv-background-system: 240,240,240;--kv-background-card: 2255,255,255}.system-color{color:rgb(var(--kv-color-system),1)}.bg-system-100{background:rgb(var(--kv-color-system),1)}.bg-system-75{background:rgb(var(--kv-color-system),.75)}.bg-system-50{background:rgb(var(--kv-color-system),.5)}.bg-system-25{background:rgb(var(--kv-color-system),.25)}.material-symbols-outlined{font-family:Material Symbols Outlined!important}*{font-family:Inter,Inter var,sans-serif!important}::ng-deep .p-accordion,::ng-deep .p-accordion-header,::ng-deep .p-accordion-content,::ng-deep .p-badge,::ng-deep .p-overlay-badge,::ng-deep .p-breadcrumb,::ng-deep .p-breadcrumb-item,::ng-deep .p-breadcrumb-link,::ng-deep .p-button,::ng-deep .p-calendar,::ng-deep .p-card,::ng-deep .p-card-title,::ng-deep .p-card-subtitle,::ng-deep .p-card-content,::ng-deep .p-checkbox,::ng-deep .p-chip,::ng-deep .p-confirm-dialog,::ng-deep .p-confirm-dialog-message,::ng-deep .p-contextmenu,::ng-deep .p-contextmenu-item,::ng-deep .p-dataview,::ng-deep .p-dataview-content,::ng-deep .p-dialog,::ng-deep .p-dialog-title,::ng-deep .p-dialog-content,::ng-deep .p-dropdown,::ng-deep .p-dropdown-label,::ng-deep .p-dropdown-item,::ng-deep .p-dynamic-dialog,::ng-deep .p-dynamic-dialog-title,::ng-deep .p-dynamic-dialog-content,::ng-deep .p-editor,::ng-deep .p-fieldset,::ng-deep .p-fieldset-legend,::ng-deep .p-fieldset-content,::ng-deep .p-fileupload,::ng-deep .p-inputmask,::ng-deep .p-inputnumber,::ng-deep .p-inputtextarea,::ng-deep .p-inputtext,::ng-deep .p-menu,::ng-deep .p-menuitem,::ng-deep .p-menuitem-text,::ng-deep .p-message,::ng-deep .p-messages,::ng-deep .p-multiselect,::ng-deep .p-multiselect-label,::ng-deep .p-multiselect-item,::ng-deep .p-panelmenu,::ng-deep .p-panelmenu-header,::ng-deep .p-panelmenu-content,::ng-deep .p-panel,::ng-deep .p-panel-header,::ng-deep .p-panel-content,::ng-deep .p-password,::ng-deep .p-picklist,::ng-deep .p-progressbar,::ng-deep .p-radiobutton,::ng-deep .p-rating,::ng-deep .p-sidebar,::ng-deep .p-splitbutton,::ng-deep .p-steps,::ng-deep .p-step,::ng-deep .p-table,::ng-deep .p-datatable,::ng-deep .p-tabview,::ng-deep .p-tabpanel,::ng-deep .p-tag,::ng-deep .p-toast,::ng-deep .p-toolbar,::ng-deep .p-tooltip,::ng-deep .p-tree,::ng-deep .p-treetable,::ng-deep .p-selectbutton,::ng-deep .p-stepper,::ng-deep .p-inputgroup,::ng-deep .p-inputgroup-addon,::ng-deep .p-text{font-family:Inter,Inter var,sans-serif!important}::ng-deep .p-icon,svg{height:.6rem}:host ::ng-deep .inputs{height:1.875rem}:host ::ng-deep .inputs,.p-inputtext,.p-inputtextarea{font-size:.875rem}::ng-deep .p-dialog .p-dialog-header{color:rgb(var(--kv-color-text))!important;background:linear-gradient(0deg,#00000005 .44%,#0000 49.5%),#fff!important;display:flex!important;flex-wrap:wrap;word-wrap:break-word;border-bottom:1px solid rgb(var(--kv-color-text),.15)}::ng-deep .p-dialog{min-width:320px}::ng-deep .p-dialog-content{overflow-x:hidden}::ng-deep .p-dialog-content::-webkit-scrollbar{width:8px}::ng-deep .p-dialog-content::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .p-dialog-content::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .p-dialog-content:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .p-dialog-content::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}::ng-deep .p-dialog-footer{display:flex;justify-content:flex-end;padding:10px;gap:10px}::ng-deep .p-dialog .p-dialog-header .p-dialog-header-icon{display:none}::ng-deep .p-tooltip{font-size:.825rem!important}::ng-deep p-tablecheckbox p-tableheadercheckbox .p-checkbox{display:flex!important;align-items:center!important;justify-content:right}::ng-deep .p-checkbox{display:flex!important;align-items:center!important;justify-content:center}::ng-deep .kv-button .p-button-loading-icon svg{width:100%;height:100%;display:block}::ng-deep .kv-button .p-button-loading-icon svg g{transform:translate(0)}::ng-deep .kv-button{white-space:nowrap;border:none;padding:.4rem;display:flex;flex-direction:row;align-items:center;justify-content:center;gap:.125rem}::ng-deep .kv-button .kv-button-label{font-weight:500}::ng-deep .small{height:1.625rem;min-width:1.625rem}::ng-deep .small .kv-button-label{font-size:.625rem}::ng-deep .small .kv-button-icon{font-size:.75rem}::ng-deep .small .p-button-loading-icon{width:.55rem;height:.55rem}::ng-deep .normal{height:1.875rem;min-width:1.875rem}::ng-deep .normal .kv-button-label{font-size:.825rem}::ng-deep .normal .kv-button-icon{font-size:1rem}::ng-deep .normal .p-button-loading-icon{width:.75rem;height:.75rem}::ng-deep .large{height:2.125rem;min-width:2.125rem}::ng-deep .large .kv-button-label{font-size:1rem}::ng-deep .large .kv-button-icon{font-size:1.25rem}::ng-deep .large .p-button-loading-icon{width:.875rem;height:.875rem}::ng-deep .primary{background-color:rgb(var(--kv-primary-color))}::ng-deep .primary:hover{background-color:rgba(var(--kv-primary-color),.8)}::ng-deep .primary:active{background-color:rgba(var(--kv-primary-color),.95)}.primary.outline{border:solid .5px rgb(var(--kv-primary-color));background-color:#fff;color:rgb(var(--kv-primary-color))}.primary.outline:hover{background-color:rgb(var(--kv-primary-color));color:#fff}.primary.outline:active{background-color:rgba(var(--kv-primary-color),.8)}.primary.text{opacity:.9;background-color:transparent;color:rgb(var(--kv-primary-color))}.primary.text:hover{background-color:rgba(var(--kv-primary-color),.1)}.primary.text:active{background-color:rgba(var(--kv-primary-color),.2)}::ng-deep .secondary{background-color:rgb(var(--kv-secondary-color))}::ng-deep .secondary:hover{background-color:rgba(var(--kv-secondary-color),.8)}::ng-deep .secondary:active{background-color:rgba(var(--kv-secondary-color),.95)}.secondary.outline{border:solid .5px rgb(var(--kv-secondary-color));background-color:#fff;color:rgb(var(--kv-secondary-color))}.secondary.outline:hover{background-color:rgb(var(--kv-secondary-color));color:#fff}.secondary.outline:active{background-color:rgba(var(--kv-secondary-color),.8)}.secondary.text{background-color:transparent;color:rgb(var(--kv-secondary-color))}.secondary.text:hover{background-color:rgba(var(--kv-secondary-color),.1)}.secondary.text:active{background-color:rgba(var(--kv-secondary-color),.2)}::ng-deep .tertiary{color:#212121;background-color:rgba(var(--kv-tertiary-color),.3)}::ng-deep .tertiary:hover{background-color:rgba(var(--kv-tertiary-color),.8)}::ng-deep .tertiary:active{background-color:rgba(var(--kv-tertiary-color),.95)}.tertiary.outline{border:solid .5px rgb(var(--kv-tertiary-color));background-color:#fff;color:rgb(var(--kv-tertiary-color))}.tertiary.outline:hover{background-color:rgb(var(--kv-tertiary-color));color:#fff}.tertiary.outline:active{background-color:rgba(var(--kv-tertiary-color),.8)}.tertiary.text{background-color:transparent;color:rgb(var(--kv-tertiary-color))}.tertiary.text:hover{background-color:rgba(var(--kv-tertiary-color),.1)}.tertiary.text:active{background-color:rgba(var(--kv-tertiary-color),.2)}::ng-deep .danger{background-color:rgb(var(--kv-danger-color))}::ng-deep .danger:hover{background-color:rgba(var(--kv-danger-color),.8)}::ng-deep .danger:active{background-color:rgba(var(--kv-danger-color),.95)}::ng-deep .danger.outline{border:solid .5px rgb(var(--kv-danger-color));background-color:#fff;color:rgb(var(--kv-danger-color))}::ng-deep .danger.outline:hover{background-color:rgb(var(--kv-danger-color));color:#fff}::ng-deep .danger.outline:active{background-color:rgba(var(--kv-danger-color),.8)}::ng-deep .danger.text{background-color:transparent;color:rgb(var(--kv-danger-color))}::ng-deep .danger.text:hover{background-color:rgba(var(--kv-danger-color),.1)}::ng-deep .danger.text:active{background-color:rgba(var(--kv-danger-color),.2)}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar{width:6px}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar:hover{background-color:#dededebf}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar-thumb{border-radius:4px;background-color:transparent}::ng-deep .p-datatable>.p-datatable-wrapper:hover::-webkit-scrollbar-thumb{border-left:2px solid white;background-color:#00000080}::ng-deep .p-datatable>.p-datatable-wrapper::-webkit-scrollbar-track{border-left:2px solid white;background-color:#dededebf}.tag{width:5px;height:20px;border-radius:.25rem}::ng-deep .p-panel .p-panel-header{border:none!important}:host ::ng-deep .p-datatable-header{padding:0!important;border-radius:5px!important;background-color:transparent;border:none}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th{padding:.15rem;background-color:rgba(var(--kv-color-system),.05);color:rgba(var(--kv-color-text),.6)}::ng-deep .p-datatable-table{border:1px solid rgba(var(--kv-color-system),.1);border-radius:.5rem;overflow:hidden;color:rgb(var(--kv-color-system))}.icon-more{font-weight:500;font-size:1.4rem!important;color:rgb(var(--kv-color-system),.75);transition:all .4s}.icon-more:hover,.icon-more:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}.tr-td{overflow-wrap:anywhere}.tr-td:hover{box-shadow:#3c40434d 0 1px 2px,#3c404326 0 2px 6px 2px;background-color:#fff;transition:color .3s,transform .3s;transform:scale(1)}.tr-td:hover.last{box-shadow:-1px -1px 9px -3px #000000bf;-webkit-box-shadow:-1px -1px 9px -3px rgba(0,0,0,.75);-moz-box-shadow:-1px -1px 9px -3px rgba(0,0,0,.75)}.disabled-row{pointer-events:none;opacity:.6;background-color:#dddddd8e}::ng-deep .p-tooltip{pointer-events:auto}.btn-table{background-color:#29b92d;padding:12px}.btn-table:hover{background-color:#249a29}.btn-table:active{background-color:#1c801f}.btn-table:disabled{background-color:#29b92d}::ng-deep svg.p-icon{width:.65rem;height:.65rem}::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:#004172;background:#004172}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:hover{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:active{background-color:#002542}::ng-deep .p-checkbox .p-checkbox-box.p-highlight:disabled{background-color:#002542;opacity:.4;cursor:auto}input{height:1.75rem}::ng-deep .p-checkbox .p-checkbox-box{width:1.125rem;height:1.125rem;border:1.5px solid #d1d5db}::ng-deep .p-checkbox{display:flex!important;align-items:center!important;justify-content:right;width:1.625rem!important;height:1.125rem}::ng-deep .p-checkbox-label{font-size:.875rem}::ng-deep .p-datatable .p-paginator-bottom{border:solid #ffffff;scale:.75}::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td{padding:.1rem}::ng-deep .p-dropdown-panel .p-dropdown-items .p-dropdown-item{padding:.25rem!important}::ng-deep .p-dropdown-panel .p-dropdown-items{padding:.5rem!important}::ng-deep .p-button-label{font-weight:500!important}::ng-deep .p-button .p-button-icon-left{margin-left:.25rem;margin-right:.25rem;font-size:.675rem!important}:host{height:100%}::ng-deep .kv-table-container,::ng-deep p-table{height:100%}::ng-deep p-table .p-datatable{display:flex;flex-direction:column;height:100%}::ng-deep .p-datatable .p-datatable-wrapper{flex:1 1 1}::ng-deep p-table .p-datatable .p-datatable-wrapper,::ng-deep p-table{height:100%}::ng-deep table{height:auto!important}.ellipsis-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;display:inline-block}::ng-deep .p-tieredmenu{padding:.5rem!important}:host ::ng-deep .p-disabled *{pointer-events:auto!important}::ng-deep p-tieredmenusub .p-disabled *:active{pointer-events:none!important;font-size:.75rem!important;padding:.5rem!important}::ng-deep .p-tieredmenu .p-tieredmenu-root-list{font-size:.75rem!important}::ng-deep .p-tieredmenu .p-menuitem>.p-menuitem-content{padding:.5rem}\n"] }]
590
590
  }], ctorParameters: () => [{ type: i1.DatePipe }, { type: i1.DecimalPipe }, { type: i2.CpfCnpjPipe }, { type: i3.TelefonePipe }, { type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { searchPlaceholder: [{
591
591
  type: Input
592
592
  }], templates: [{
@@ -677,4 +677,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImpor
677
677
  type: HostListener,
678
678
  args: ['document:click', ['$event']]
679
679
  }] } });
680
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtdGFibGUva3YtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtdGFibGUva3YtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxlQUFlLEVBR2YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUlOLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsS0FBSyxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUd0RCxPQUFPLEVBQ0wsWUFBWSxFQUVaLGFBQWEsR0FDZCxNQUFNLHdDQUF3QyxDQUFDO0FBS2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXJGLE1BQU0sVUFBVSxHQUNkLDBxUEFBMHFQLENBQUM7QUFPN3FQLE1BQU0sT0FBTyxnQkFBZ0I7SUFrRDNCLElBQXFCLFNBQVMsQ0FBQyxLQUFrQjtRQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUNuQixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJO1lBQ3hDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLEtBQUs7WUFDekMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSTtZQUN4QyxHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMs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RyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFLRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUVxQixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0EsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUNDLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkF3SnZCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBcVh6QyxXQUFXO3NCQURWLFlBQVk7dUJBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUW5ELFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlLCBEZWNpbWFsUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBEb0NoZWNrLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIGNvbXB1dGVkLFxyXG4gIGVmZmVjdCxcclxuICBpbnB1dCxcclxuICBtb2RlbCxcclxuICBzaWduYWwsXHJcbiAgdmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFRhYmxlLCBUYWJsZVBhZ2VFdmVudCB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5cclxuaW1wb3J0IHsgQ3BmQ25walBpcGUgfSBmcm9tICcuLi8uLi9hcGkvcGlwZXMvY3BmY25wai5waXBlJztcclxuaW1wb3J0IHtcclxuICBnZXRPckV4ZWN1dGUsXHJcbiAgVmFsdWVPckZuLFxyXG4gIG1hcFRvTWVudUl0ZW0sXHJcbn0gZnJvbSAnLi4vLi4vYXBpL2NvbXBvbmVudHMvdGFibGUva3YtbWVudWl0ZW0nO1xyXG5pbXBvcnQgeyBUYWJsZUNvbmZpZyB9IGZyb20gJy4uLy4uL2FwaS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbmZpZyc7XHJcbmltcG9ydCB7IFRhYmxlQ29uZmlnQ29sdW1uIH0gZnJvbSAnLi4vLi4vYXBpL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29uZmlnLmNvbHVtbic7XHJcbmltcG9ydCB7IFRhYmxlUGFnaW5hdGUgfSBmcm9tICcuLi8uLi9hcGkvY29tcG9uZW50cy90YWJsZS90YWJsZS5wYWdpbmF0ZSc7XHJcbmltcG9ydCB7IFRlbGVmb25lUGlwZSB9IGZyb20gJy4uLy4uL2FwaS9waXBlcy90ZWxlZm9uZS5waXBlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9hcGkvZGlyZWN0aXZlcy90ZW1wbGF0ZS90ZW1wbGF0ZS5kaXJlY3RpdmUnO1xyXG5cclxuY29uc3QgaW1nRGVmYXVsdCA9XHJcbiAgJy85ai80QUFRU2taSlJnQUJBUUlBZGdCMkFBRC80UUJpUlhocFpnQUFUVTBBS2dBQUFBZ0FCUUVTQUFNQUFBQUJBQUVBQUFFYUFBVUFBQUFCQUFBQVNnRWJBQVVBQUFBQkFBQUFVZ0VvQUFNQUFBQUJBQU1BQUFJVEFBTUFBQUFCQUFFQUFBQUFBQUFBQUFCMkFBQUFBUUFBQUhZQUFBQUIvOXNBUXdBREFnSUNBZ0lEQWdJQ0F3TURBd1FHQkFRRUJBUUlCZ1lGQmdrSUNnb0pDQWtKQ2d3UERBb0xEZ3NKQ1EwUkRRNFBFQkFSRUFvTUVoTVNFQk1QRUJBUS85c0FRd0VEQXdNRUF3UUlCQVFJRUFzSkN4QVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRLzhBQUVRZ0FrQUNRQXdFUkFBSVJBUU1SQWYvRUFCMEFBUUFCQkFNQkFBQUFBQUFBQUFBQUFBQUdBUUlIQ0FNRUNRWC94QUJCRUFBQ0FRUUFCUUlDQ0FRREJBc0FBQUFCQWdNQUJBVVJCZ2NTSVRFVFFRaFJDUlFWR1NKVmxkRXlZWUdSUWxKaUZpTTNPRk5qY1hOMWRwS1RzYk8wLzhRQUdnRUJBQUlEQVFBQUFBQUFBQUFBQUFBQUFBRUZBd1FHQXYvRUFESVJBQUlBQkFNRkNBRUZBUUVCQUFBQUFBQUJBZ01FRVNFeFVRVVNRWkh3RXhVeVlYR0JvYkhSSWpOQ3dlRTA4U1AvMmdBTUF3RUFBaEVERVFBL0FQS3FnRkFLQVVCZERETGNTcEJCRThrc2pCRVJGSlptSjBBQVBKSnFVbkU3SWh0UXE3eUo1dzl5ZHoyVmkrczVlNFhGUk11MFYwOVNVNzBSdEFSMGpSUGs5UUkwVjk2czVHeXBreFhtUGQrWC9uMzVGYk8ycEtsNFFmcWZ4eko5ak9VL0JtTzZXa3NaYjZSSkJJcjNVcE90YTBwVmVsU08zZ2c3MmQ3SGFyT1hzMm5nelYvWHBJcTQ5cFZNZkczb3Z6ZGttc01UaXNYMS9abU10TFAxZGRmb1FMSDFhM3JmU0J2V3ovZXR1Q1hCTHZ1SksrbUJweHpJNWx0OXQyMXhPM1dROENnT3BmNG5GWlRvKzA4WmFYbnBiNlByRUN5ZE85YjExQTYzb2YyckhITGdtZU5KK3FQY0V5T1hmY2JWOU1DTTVQbFB3WmtlcG83R1d4a2VReU05cktSdmU5cUZicVVMMzhBRFdoclE3VnFUTm0wOGVTdDZQLzFHNUJ0S29nNDM5VitMTWdQRVBKM1BZcUw2emlMaGNyR3E3ZEVUMDVSclpPa0pQVU5BZUQxRW5RWDNxc243S21TMXZTM3ZmRC8zNzhpMGs3VWxUSHV4cmRmeHovd2djME0xdk05dmNSUEZMRXhSMGRTckt3T2lDRDRJUHRWWTA0WFpsa21vbGRaRnRRU0tBVUFvQlFDZ0ZBU2pnL2w5bWVMWlJLRmV5c09rc2J1U0lsVzdrYVFkdXM3QkIwZERSMmQ2QjNhV2htVk9PVU92NDFOS3NyWWFWWVl4YWRYL0FOK1Ztemg3aEhBY01SQk1UWUlrcFhwZTRmOEFGSy9ZYjJ4OWowZzlJMHUvWVYwTWltbFU2dEFzZGVKenMycG16LzNJci9YU3kxMVo5bXM1Z0toVFVrWEs2RkJjYUZDTGpRb0xqUW9UY29WTkJjcFVFbnh1SWVFY0J4UkNVeTFnalNoZWxMaFB3eXAyT3RNTzVBNmllazdYZnRXQ2ZTeXFoZnJXT3ZFenlhaWJJZjhBODRyZVhEcDVYejBaaFBqSGwvbCtFWmZVSWE4c0NvSXU0NHlGVTdBMDQ3OUIyUnJaMGRqUjNzRG5hcWltVXJ1OFZyK2REb0tTdmwxS3RGYUdLK1Y4ODhzcjRLNzArU0wxcG0rS0FVQW9CUUU1NWRjdTVlSnBseXVXUjQ4VEczWWJLdGNzRDNWVDdLRDJMZjBIZlpXeW9hRjFEMzQvRDk5Y2VyVnRkWEtuWFp5L0Y5ZjdwMWZPTU1NVnZFbHZieEpIRkdvUkVSUUZWUU5BQUR3QVBhdWlTVUtzc2puVzNFN3Q0bklCODY5SGhzclFnclVBVUFvQlFDZ0ZBVXFRVUlvVGM0NW9ZcDRuZ25pU1NPUlNqbzZobFpTTkVFSHNRUjdWRFNpVm5rZWszQzdwNG1EZVluTHVYaGlWc3Jpa2VURlNOM0hjdGJNVDJWajdxVDRiK2g3NkxjNVhVTHAzMmt2dy9YK2VmVDZPaHJsVUxzNW5pKy85MTZ0QjZyU3lGQUtBbEhML0FJT2w0dXkrcENxMkZteVNYWkpPMlVudEdORUhiYUkzN0FFK2RBN2xGU3VxbVdlU3ovSHVhRmZWcW1sN3F2dlJYdDVlZVRXRjhubnBhNXNGREZGQkVrRUVTUnh4cUVSRVVCVlVEUUFBOEFEMnJxVWtsWkhNdHQ0czVRS2s4dGxhZ2dVQW9DZmNwdVJQTkxuYmtueC9MdmhhNHlFY0RCYm05Y2lLMXR0LzlKSzJsQjEzNlJ0aVBBTllaMVJMcDFlWXpQSXBwdFE3UzBiUDRUNkxianU0dEZrNGg1cVlLd3VTTm1LenNacnBBZmwxc1kvL0FJcXVpMnZBbittRmxsRHNlTnI5VVNJcnpCK2piNTI4SzJjdVI0U3llRzR0aWlCWTI5czdXMTJRUGNSeWZnUC9BR0NUWjlnYXlTdHF5WTNhSzZNVTNaTTZCWGdhWnF2bHNUbGNEa3JuRFp2RzNXUHY3T1F4WEZyZFJORkxFNDhxeU1BVlA4alZrbW9sZFpGWkZDNFhhTE02bFNRS0FVQmFSVTVrcG5ITkRGY1JQYjNFU1NSU0tVZEhVTXJLUm9nZytRYWhwTk5NOXd4T0Y3eXpOZmVZSEIwdkNPWUlqNlRZWGpQSmFFSHVxZ2phSFpKMnV3Tis0MGZPd09XcmFWMHN6RHd2TDhleDB0QlZxcGw3cjhVS1YvUHp5U3h0a3N1UkY2MHpmTG9ZWmJpVklJSW5rbGtZSWlJcExNeE9nQUI1Sk5TazRuWkVOcUZYZVJzcHduZ0l1R2VIN1REb0l6SkVuVk82QWY3eVZ1N0hZQUxEZllFamZTRkh0WFcwMGhVOHBTMTcrdlh3Y2hVVGUybXhUTWNYcS9UVjJ5eFN3dmQ1dG4yQUsyREF5Nm9JRkFLQXlwOE5YSXpKZkVCelFzdUM0SlpMWEZ3SWIzTDNpQWJndEVJRGRPKzNXeEtvdm51MnlDQWExNnFvVk5MY2ZIZ2JOSlRPcG1xRGh4UFluZ3pndmhmbDd3MVk4SWNIWWEzeG1KeDhZamd0NFYwQjgyWStXWW51V095U1NTU2E1V1pNaW14T0tOM1oxa3VYREtoVUVDc2o3ZGVEMktBMXkrTVQ0VzhOeno0TnV1SStIOGRGRHh6aHJkcGJDNGpVSzEvR2cyYldRLzR0amZRVC9DMnU0QmJlL1ExanA0OTJMd3Y0OHpRcnFOVk1HOUN2MUw1OGp5VmRIamRvNUZLc3BJWlNORUg1R3VtT1dLVUFvQlFGcEh2VWtvK054ZHc5RHhSZ0xyRXlCUks2OWR1N2FIUktQNFR2UjBOOWpvYjZTUjcxcjFVaFZFcHkzN2Vwc1UwM3NKc016VDYvdjM0MlpyWk5ETmJ6UGIzRVR4U3hNVWRIVXF5c0RvZ2crQ0Q3VnlUVGhkbWRjbW9sZFpFODVPOFBSWlhQeTVhNUN0RmlsVjFRNk81WDJFT2lEMkFWanZZSVlLYXN0bHlWTW03Ny9qOTlmSldiVXFITGxxV3Y1Y2ZKVysvcTVtK3VqT2RMcUhrclVBVUFvRDBpK2k3NFZzN1RscnhkeHI2Uy9XOGxtMXhwY2p1SXJlQkpBQjhnV3VXL3NQbFZEdGVOdVpEQm9yOWNqb05qd0pTNG85WDlmK202MVZCY0NnRkFLQThZL2kyNFZ0T0RQaVA0OHdWaEVzVnY5cC9Ya1JSb0lMbU5ManBBOWdQVzBCOHE2eWlqY3lSREU5UHJBNUd1Z1V1b2poV3YzaVlqclpOVVVBb0NsU0Myb1BSaERuRnc5RmlzL0ZsN2JvV1BLcXpzZzdhbFRRYzZBQTBReW5leVN4WW4ycm50cVNGTG1LWXY1ZmEvUDNjNlBaYzV6Slc0ODRmcmgvWlB1VStNK3p1RExhUmtsU1Mra2t1bldRYTFzOUtsUnIrRW9pa2VkNzM0SXF6MmJMM0tkUFc3NjlrVmUwbzkrb2ZsWmYzOXNtUUZiNW9NdXFEeUtBVUFvRDBiK2k2NHhzN25nUGpEZ0ZwVkYzajhzbVdWQ2U3UlR3cEVTUG1BMXVOL0xySHpxaDJ2TGFqaGo4ckhRYkhtSndSUWFPNXU3VlFYQW9CUUNnUEZ6NHFPTWJQano0aHVPdUpjZktzdHJKbEd0SUpGTzFranQwVzNWd2ZrUkVDUDVHdXNvNWJseUlZWHA5NG5JMXN4VEtpS0phL1dCaXF0azFSUUNnRkFXa1ZKS0lkell4bjJqd1hjeUtrenlXVWtkMGl4OS9CNldMRFI3QkhjKzJ0YjNvR3EvYVV0ektkMjRZOWN5dzJkTVV1b1YrT0hYdWtTWEVXSDJWaXJMR2VyNnYxTzNqZzYrbnA2dWhRdTliT3Q2OGJyY2x3ZG5Bb05GWTA1a2ZhUnVQVjM1bmRIaXNoalpXb0lGQUtBVUJrYmtCem96ZklYbVpqdVBjUkdiaUNNRzJ5Vm4xZEl1N055UFVqMzdIc3JLZlprVW5ZMkRncVpDcVpiZ1pzVTFSRlRURkdqMko1YmN6T0MrYlhDbHJ4bHdMbW9jampycFJ2cElFa0VtdG1LVlBLT045MVA4aU5nZ25sWnNxT1RGdVJyRTZ5Vk9nbnc3OER1aVUxak1nb0RWajQwdml6dzNLUGhlKzVlOEY1U080NDR5MEJnUG9QdjdKaGNhTXprZnd5bFQrQmZJSkRuc0FHc3FDaWM2SlRJMStsZkpXMTlhcEVMZ2dmNm44SGxkNXJvem1SUUNnRkFLQW8zaXBKUjBzdFlESzRxOHhabTlJWGx2SkI2blQxZEhXcFhldGpldCtOMWptUWRwQTROVTF6TWt1UHM0MUdsZXp1ZHVzaDRSY1BGRHl5dFFCUUNnRkFLQWxQTHptanpCNVVaci9hRGw1eFZmWVM5SUN5R0J3WTVsQjJGa2pZRkpGMzdNQ0t4elpNRTVic3hYTXNxZE1rUGVsdXhzbmhQcE51ZWVQdEZ0c3Z3MXdqbFpFR3ZyRDJzOE1qSDVzRWxDZjJVVlh4YkprdDROb3NJZHJ6a3NVbVJUbUQ5SUQ4UlBIVm5MamJMTTQ3aGExbUJWeGc3Wm9wbVgvdnBHZVJUL05DcHJMTDJiSWx1N1YvVXhUZHAxRXhXVHQ2R3VWemMzRjVjUzNkM1BKUFBNNWtrbGtZczdzVHNzeFBja24zTmI2VnNFVjdiZUxPT2dGQUtBVUFvQ2g4VklSYlE5Q2dSY1BGRHl5dFFCUUNnRkFTZmcvbGZ6SDVneWVud1B3TG5jNE9ycFo3R3drbGpRLzZuVWRLLzFJckhIT2x5dkhFa1pKY21aTjhFTFptREEvQUo4VCtiUlpadUJyWEZSdjNEWCtVdDFPdjVxanN3L3FCV3JGdEtuaC9sZjJOdUhabFRGL0czdVN1SDZNLzRoSlVEU1pmZ3VFLzVYeVU1SS84QVRBUldQdldSbyt2Y3lyWk0vVmRleDFiL0FPamIrSTJ6UXRidHdyZkVEK0czeWpnbi93QnlOUlVyYXNoNjhpSHNtb1duTXg5eFI4RzN4TDhKSTgyUjVUNVc2aVFiNjhZOFYvc2ZNTEF6dC9jVm5ncnFlUEtMK3Zzd1IwRlJCbkR5eCtqRU9UeGVUd3Q3SmpzeGpycXh1NFRxU0M1aGFLUkQvTldBSXJaVFVTdWpVY0xoZG1kYXBJRkFLQVVCUStLa0l0b2VqcVltL3dEdFRGV1dUOUwwdnJsdkhQMGRYVjA5YWh0YjBONjM1MVdPWEgya0NqMVNaN21RZG5HNEwzczdjanVqeFdReHNyVUVDZ01qOGtPUVBNUG43eEljRHdSamxGdmJkTFgrU3VkcmEyU0h3WFlBN1k2T2tVRmpvOXRBa1lLaXBsMDBPOUdiRlBUVEttTGRnNW5vOXliK0F2a2p5d2dndnVJc1d2R21jUUF2ZDVhSU5iSzMvVjJ1eWdIaitQcmI1RWVLb1orMFowN0NGN3E4dnlkQkkyYkprNHhMZWZuK0RZNjJ0YmF5dDQ3U3p0NG9JSWxDUnhSSUZSRkhnQURzQldnMjNpeXdTdGdqbHFBS0FVQW9DT2NhOHVPQXVZK09PSzQ3NFF4V2N0dEVLdDdiTEkwZS9kSEk2a1A4MUlOWkpjMk9VN3dPeGptU29KcXRHcm1rL1A3Nk51M2p0TG5pYmtIZlRlckdHa2ZoNi9tNnVzZkszbmJ2djVMSVR2OEF6anNEYjAyMWNkMmZ6L0pUMU95VmJla2N2d2FGWkhIWkRENUM1eFdXc3A3TzlzNVdndUxlZU1wSkZJcDB5TXA3Z2dnZ2cxZEpxSlhSU05PRjJlWjE2RUNnS0h4VWtvNldXdnhpc1ZlWlF3K3FMTzNrbjlQcTZldm9VdHJlanJldk9xeHpJK3pnY2VpYjVHU1hBNWthZ1R0ZDI1a2E1VDVNWkhndTFqWjVua3NaSkxWMmtPL0I2bENuWi9DRWRBUEd0YThBVnA3Tm1PWlRwUGhoMXpOemFNdnM2aDI0NDllNlpNUWFzQ3ZaZFVFSFp4bU91OHZrclRFMkVmcVhON1BIYndwdlhWSTdCVkg5eUtodFFxN0pTY1RzajIyNUw4cGVIT1NuTHZGY0JjT1c4WVd6aURYbHlGMDk1ZEVEMVozUGtsajQzNFVLbzdBVnlOUk9pcUpqamlPeHA1RU5QTFVFSk9hd21ZVUFvQlFDZ0ZBS0FVQm9WOUpmeVZ3OFdNeFhQSEMya2NGKzEwbUp6UHBycjZ3ckl4Z21iL1V2UVVKOGtNZzhMVjFzcW9kM0pmcWlrMnZUcXluTFBKbm41VjJVUW9DMG1wSlJEdWJHVCt6dUM3cU5YbVNTOWtqdFVhTTYxczlUQmpzZmhLSTQ5OTcxclJOViswcGpsMDd0eHc2NUcvczZXcGxRcjhNZXZkb2dISjNpQ0xGWitYRTNKVllzcXFvcm5RMU1teWcyU094RE1QQkpZcUtyTmx6MUxtN2p5aSsrQlo3VmtPWkxVeUgrUER5ZnR3NVd2NUdiNjZJNTR1cVR5U3psTC94VjRNLzh3WTcvQVBUSFdLZCsxRjZNeXlQM1lmVkh1YlhISFppZ0ZBS0FVQW9CUUNnRkFheS9TSi84cytTLzhWc1Avc3F3MlovMEwwWlhiVS81bjZvOG9hNlU1Z29lMVNDMm9QUmhEbkZ4RERsYzlGaWJib2FQRkt5TTQ3a3l2b3VOZ2thSFNvOEFodW9IMnJudHF6MU1tS1hEL0g3ZjQrN25SN0xrdVhLY2NXY1gxdy9zZ2NNMHR2S2s4RXJ4eXhzSFIwWWhsWUhZSUk4RUdxeE53dTZMSnBSS3p5TmxPRXMvSHhOdy9aNWRUR0pKVTZaMFVqOEVxOW1HZ1NWNzl3RDM2U3A5NjYybW5xb2xLTmUvcjE4SElWRXZzWjBVclQxeXpYREgxV0Y3ck5NK3dEN1ZzR0JuZndlWXZlSHMxajgvaldSYnZHWFVWNWJsMTZsRWtiaDFKSHVOZ2RxOHhRcUpPRjhSREU0V29sd05qdnZGUGlYL0FEbkJmcE1mNzFvZDJVK2o1bGgzclVhcmtQdkZQaVgvQURuQmZwTWY3MDdzcDlIekhldFJxdVErOFUrSmY4NXdYNlRIKzlPN0tmUjh4M3JVYXJrUHZGUGlYL09jRitreC92VHV5bjBmTWQ2MUdxNUQ3eFQ0bC96bkJmcE1mNzA3c3A5SHpIZXRScXVRKzhVK0pmOEFPY0Yra3gvdlR1eW4wZk1kNjFHcTVEN3hUNGwvem5CZnBNZjcwN3NwOUh6SGV0UnF1USs4VStKZjg1d1g2VEgrOU83S2ZSOHgzclVhcmtQdkZQaVgvT2NGK2t4L3ZUdXluMGZNZDYxR3E1RVA1cWZHQnpwNXljSVRjRDhiNUhGell1ZWFLNGRiZkhwRS9YR2RyK0lkL05aWk5ESmtSYjhHWmluVjA2b2czSThqQ2xiWnBscFB0VWtwSHhlTHVJWXVGOEJkWlp5aGxSZWkzUnY4Y3A3S05iR3g3blIzMGcxcjFNOVU4cHpIN2V2WHdiRlBLN2ViREwxK3Y2OThMMk5iWnBwYmlWNTU1WGtsa1l1N3V4TE14T3lTVDVKTmNrMjRuZDVuWEpLRldSYlVFa281ZjhZeThJNWNHVHBOaGVNa2QyQ0R0VkJPcEJvRTdYWk92Y0Vqem9qY29xcDBzekh3dlA4QVBzYUZmU0twbDd5dnZRM3Q1K1dPR05zK0d0cm13VU0wVnhFbHhieXBKRklvZEhSZ3lzcEd3UVI1QnJxVTdxNk9aYWF3WnlBMU9aNWFMcWdnVUFvQlFDZ0ZBS0FVQW9CUUZwTlRrU2tjYzAwVnZFOXhjU3BIRkdwZDNkZ3Fxb0d5U1Q0QXFHMGsyejNEQzRudXJNMTk1Z2NZeThYWmdtUHBGaFpzOGRvQU83S1NOeUhZQjIzU0RyMkdoNTJUeTFiVk9xbVhXU3kvSjB0QlNLbWw3ejhVU1YvTHl6YXd2bXMrUkY2MHpmRkFLQW5ITHZtSkx3eEt1S3lydkppcEc3SHV6V3pFOTJVZTZrK1YvcU8rdzFsUTF6cDMyY3p3L1grZVhUcmE2aFZRdCtYNHZ2cmgxYk9VTTBWeEVrOEVxU1JTS0hSMFlGV1VqWUlJOGdpdWpUVFYwem5HbW5abzVBZm5VbmxvclVFRmFBVUFvQlFDZ0ZBVTNxcEJRbjVVSlNPT2FhSzNpZTR1SlVqaWpVdTd1d0Nxb0d5U1Q0QUZRMmxpejBsZDJSZzNtSnpFbDRtbGJGWXAzanhVYmR6M0RYTEE5bVlleWoyWCtwNzZDODVYVnpxSHVRZUg3NjY4dWpvYUZVNjdTUHhmWFhYbkI2clN5RkFLQVVBb0NVOEg4dzgxd25Jc0pkNzdIaENnczVaU0ZUdVczR2UvUWVwaVRvYU96c2IwUnVVdGJNcG5iT0hUOGFGZlZiT2wxRjRvTFF4TjNidG5rc2NyNEt5ZkN5NFlHYmNCeFpnT0pvZzJJeU1jc2dRTzhEZmhsajdLVHRUM0lCWUFzTnJ2d1RYUlNhbVZVSzh0KzNIcjRPZm0wODZUKzVEYkYvZmxmUE5YeHRtazhENjlaekNWREdwSXNWNmhRV0d4ODZFV0d4ODZDdzZoUW14UXNhQ3hTb0pQa1ovaTNoL2htTXRsOGpIRklVTHBBdjRwWk96RWFVZHhzcVFHT2wzNUlyQlBxWlZPcnpIN2Nldmd6U3FlYlA4QTI0YjRwY01PZHNzM3h0a204RENQR1BNREw4WFMrbVMxbllCUUJhUnlrcXgyRHR6MjZ6c0RXeG9hR2h2WlBPMVZiTXFuWjRMVDg2blJVdEJMcGtuRmFLTFczcmxuYkIyZXZ3UmV0TTNoUUNnRkFLQVVBb0M2R2FXM2xTZUNWNDVZMkRvNk1ReXNEc0VFZUNEVXB1RjNSRFNpVm5rVHpoN25GbjhWRUxiTFFKbFlsWFNNNytuS093QTI0QjZoMlBrRmlUc21yS1R0U2JMVm8xdkw1NitmTXE1K3lwY3gzbHZkMTRyankrcksxaWY0em14d1hrZWxaTDZXeWtlVDAxUzZoSzc4YVlzdlVxanY1TERXanZRNzFaeTlwVTh4MnZiMTZaV3pOblZFdFh0ZjA2VCtDUzJHV3hXVkVoeGVTdGJ3UmE5VDBKbGs2TjcxdnBKMXZSL3NhM0lKa0V6d05QMGR6VGpseHk3S05OWDFPM1dROENnT3BmNWZFNHJvKzA4bmFXZnE3S2V2TXNmVnJ6cnFJMzVIOTZ4eHpJSmZqYVhxekpCTGptZUJOK2lJMWsrYS9CZU42bFMvbHZaRWxNYkpheEZ2RzlzR2JwUmw3ZVF4M3NhMk85YWN6YVZQTGRyMzlPbDhHMUwyZFVURmUxdlhwdGNpQWNRYzRzL2xZamJZbUJNVkV5NmRrZjFKVHNFSFRrQUtPNDhEcUJHdzFWay9hazJaaEIrbGZQTXRKR3lwY3Q3MHg3Mm5CY09mSHl4eTRrRG1tbXVKbnVMaVY1WlpXTHU3c1dabUoyU1NlNUpQdlZhMjRuZGxta29WWlpGdFFTS0FVQW9ELzlrPSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2t2LXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4va3YtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2t2LXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBLdlRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrLCBBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlQ29uZmlnID0gc2lnbmFsPFRhYmxlQ29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xyXG5cclxuICBnbG9iYWxGaWx0ZXJGaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHNlbGVjdGVkU2l6ZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIHdpZHRoUGFnZSA9IHNpZ25hbDxudW1iZXI+KDApO1xyXG5cclxuICBjaGVja2VkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgY29sdW1uczogVGFibGVDb25maWdDb2x1bW5bXSA9IFtdO1xyXG4gIGRlbGV0ZWRDb2x1bnM6IFRhYmxlQ29uZmlnQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBwcmVwb3NpdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oW1xyXG4gICAgJ2RlJywgJ2RhJywgJ2RvJywgJ2VtJywgJ25vJywgJ25hJywgJ3BhcmEnLCAncG9yJywgJ2NvbScsICdhJywgJ28nLCAnZSdcclxuICBdKTtcclxuXHJcbiAgcHJpdmF0ZSByb21hbk51bWVyYWxzID0gbmV3IFNldDxzdHJpbmc+KFtcclxuICAgICdJJywgJ0lJJywgJ0lJSScsICdJVicsICdWJywgJ1ZJJywgJ1ZJSScsICdWSUlJJywgJ0lYJywgJ1gnLCAnWEknLCAnWElJJywgJ1hJSUknLCAnWElWJywgJ1hWJyxcclxuICAgICdYVkknLCAnWFZJSScsICdYVklJSScsICdYSVgnLCAnWFgnXHJcbiAgXSk7XHJcblxyXG4gIHByaXZhdGUgc2lnbGFzID0gbmV3IFNldDxzdHJpbmc+KFtcclxuICAgICdVSScsICdVWCcsICdUSSdcclxuICBdKTtcclxuXHJcbiAgbWVudUZpbHRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNoZWNrYm94Q2xpY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1Blc3F1aXNhci4uLic7XHJcblxyXG4gIGNvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICB0YWJsZUFjdGlvbnM6IE1lbnVJdGVtW11bXSA9IFtdO1xyXG4gIGN1cnJEYXRhU291cmNlOiBhbnlbXSA9IFtdO1xyXG5cclxuICBtZW51SXRlbXMhOiBNZW51SXRlbVtdO1xyXG5cclxuICBhY3Rpb25zT2Zmc2V0OiBudW1iZXIgPSAwO1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlRGlyZWN0aXZlKSB0ZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8YW55PjtcclxuICBASW5wdXQoJ3RlbXBsYXRlcycpIF90ZW1wbGF0ZXMhOiBhbnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJywgeyBzdGF0aWM6IGZhbHNlIH0pIHRhYmxlITogVGFibGU7XHJcblxyXG4gIEBWaWV3Q2hpbGQoVGFibGUpIHB0YWJsZSE6IFRhYmxlO1xyXG5cclxuXHJcblxyXG4gIEBJbnB1dCgnY29uZmlnJykgc2V0IHNldENvbmZpZyh2YWx1ZTogVGFibGVDb25maWcpIHtcclxuICAgIHRoaXMudGFibGVDb25maWcuc2V0KHtcclxuICAgICAgZW5hYmxlQ2F0aW9uOiB2YWx1ZS5lbmFibGVDYXRpb24gfHwgdHJ1ZSxcclxuICAgICAgZW5hYmxlU2VsZWN0OiB2YWx1ZS5lbmFibGVTZWxlY3QgfHwgZmFsc2UsXHJcbiAgICAgIGVuYWJsZUZpbHRlcjogdmFsdWUuZW5hYmxlRmlsdGVyIHx8IHRydWUsXHJcbiAgICAgIC4uLnZhbHVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kZWZpbmlyQ29sdW5hc0NvbmZpZ3VyYXZlaXModGhpcy50YWJsZUNvbmZpZygpISk7XHJcbiAgfVxyXG5cclxuICBmaXJzdCA9IG1vZGVsPG51bWJlcj4oMCk7XHJcbiAgcm93cyA9IG1vZGVsPG51bWJlcj4oNSk7XHJcblxyXG4gIEBJbnB1dCgpIGRlZmF1bHRTb3J0RmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBkYXRhU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgdG90YWxSZWNvcmRzITogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHBhZ2luYXRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgcm93c1BlclBhZ2VPcHRpb25zITogbnVtYmVyW107XHJcbiAgQElucHV0KCkgdGFibGVTaXplITogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGZpbHRlckNvbHVtbnNCdG46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSByZXBsYWNlRW1wdHlWYWx1ZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGF1dG9Gb2N1c1NlYXJjaDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCBFc3NhIHByb3ByaWVkYWRlIG7Do28gc2Vyw6EgbWFpcyB1dGlsaXphZGEgcG9yIGVzc2UgY29tcG9uZW50ZSBuYXMgcHLDs3hpbWFzIHZlcnPDtWVzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGZpbHRyb3NBdmFuY2Fkb3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgc2Nyb2xsSGVpZ2h0OiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBpc1RhYmxlU2Nyb2xsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHRhYmxlQ2FwdGFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSByb3dUcmFja0J5OiAoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSA9PiBhbnkgPSAoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtO1xyXG5cclxuICBASW5wdXQoKSByZXNwb25zaXZlTGF5b3V0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgZGlzYWJsZWRIZWFkZXJDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYSBwcm9wcmllZGFkZSBcInRhZ0NvbG9yXCIgbmEgY29uZmlndXJhw6fDo28gZGEgY29sdW5hIHBhcmEgZXN0aWxpemFyIGEgdGFnXHJcbiAgICovXHJcbiAgQElucHV0KCkgYXBwbHlTdHlsZTogRnVuY3Rpb24gPSAocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKSA9PiAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgTyB2YWxvciBkZSBwYWdlTGlua3Mgw6kgYXRyaWJ1w61kbyBkZSBhY29yZG8gY29tIG8gdGFtYW5obyBkYSB0ZWxhLCBlc3NhIHByb3ByaWVkYWRlIG7Do28gZXN0w6Egc2VuZG8gdXRpbGl6YWRhXHJcbiAgICovXHJcbiAgQElucHV0KCkgcGFnZUxpbmtzT3B0aW9ucyE6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgQSBxdWFudGlkYWRlIGRlIHBhZ2luaXRvclBhZ2VJY29ucyDDqSBhdHJpYnXDrWRvIGRlIGFjb3JkbyBjb20gbyB0YW1hbmhvIGRhIHRlbGEsIGVzc2EgcHJvcHJpZWRhZGUgbsOjbyBlc3TDoSBzZW5kbyB1dGlsaXphZGFcclxuICAgKi9cclxuICBASW5wdXQoKSBzaG93Rmlyc3RMYXN0SWNvbiE6IGJvb2xlYW47XHJcblxyXG4gIEBPdXRwdXQoKSBvbkFjdGl2ZUl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvbkFjdGl2ZUl0ZW1Mb3RlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25QYWdpbmF0ZTogRXZlbnRFbWl0dGVyPFRhYmxlUGFnaW5hdGU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvblNlbGVjdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGRvdWJsZUNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJGaWVsZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uU3dpdGNoVGFibGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdtZW51RmlsdHJvRGl2JykgbWVudUZpbHRyb0RpdiE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnYm90YW9GaWx0cm8nKSBib3Rhb0ZpbHRybyE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnaW5wdXRGaWVsZCcpIGlucHV0RmllbGQhOiBFbGVtZW50UmVmO1xyXG5cclxuICB0YWJsZUNlbGwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ3RhYmxlQ2VsbCcpO1xyXG4gIGVsbGlwc2lzVGV4dCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBpc0xvYWRpbmdTa2VsZXRvbiA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgZmlsdGVyQnV0dG9uID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIGZpbHRlckJ1dHRvbkJhZGdlID0gaW5wdXQ8c3RyaW5nPignJyk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlY2ltYWxQaXBlOiBEZWNpbWFsUGlwZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3BmQ25walBpcGU6IENwZkNucGpQaXBlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZWxlZm9uZVBpcGU6IFRlbGVmb25lUGlwZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZlxyXG4gICkge1xyXG4gICAgdGhpcy5pc1Jvd1NlbGVjdGFibGUgPSB0aGlzLmlzUm93U2VsZWN0YWJsZS5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgY29uZmlndXJhY2FvRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMudGFibGVDb25maWcoKSE7XHJcbiAgICB0aGlzLmRlZmluaXJGaWx0cm9zR2xvYmFpcyhjb25maWcpO1xyXG4gICAgdGhpcy5kZWZpbmlyQ29sdW5hc0NvbmZpZ3VyYXZlaXMoY29uZmlnKTtcclxuICB9KTtcclxuXHJcbiAgZGF0YVNvdXJjZVNpZ25hbCA9IHNpZ25hbDxhbnlbXT4oW10pO1xyXG5cclxuICB3aWR0aFNrZWxldG9uczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgd2lkdGhSYW5kb20gPSBjb21wdXRlZCgoKSA9PiAoY29sOiBhbnksIHJvdzogYW55KSA9PiB7XHJcbiAgICBpZiAoIWNvbC50ZW1wbGF0ZSAmJiAhY29sLmljb24gJiYgIWNvbC5maWVsZFR5cGUgJiYgIWNvbC5ib29sZWFuICYmICFjb2wucGlwZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy53aWR0aFNrZWxldG9uc1tyb3ddICogMTAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIDEwMDtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGFTb3VyY2UpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRhU291cmNlKVxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlQWN0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuY3VyckRhdGFTb3VyY2UgPSBbLi4udGhpcy5kYXRhU291cmNlXTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBbLi4udGhpcy5kYXRhU291cmNlXTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2VTaWduYWwuc2V0KFsuLi50aGlzLmRhdGFTb3VyY2VdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF0YVNvdXJjZU1vY2s6IGFueVtdID0gW107XHJcblxyXG4gIGlzRW1wdHlEYXRhU291cmNlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YVNvdXJjZVNpZ25hbCgpKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhU291cmNlTW9jayk7XHJcbiAgfSlcclxuXHJcbiAgbG9hZGluZ1NrZWxldG9uVXRpbGl0aWVzKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPT09IDAgJiYgdGhpcy5pc0xvYWRpbmdTa2VsZXRvbigpKSB7XHJcbiAgICAgIGxldCByb3dJdGVtOiBhbnkgPSB7fTtcclxuICAgICAgdGhpcy50YWJsZUNvbmZpZygpPy5jb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xyXG4gICAgICAgIHJvd0l0ZW1bY29sLmZpZWxkXSA9ICcnO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZU1vY2sgPSBBcnJheSh0aGlzLnJvd3MoKSkuZmlsbCh7IC4uLnJvd0l0ZW0gfSk7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZGF0YVNvdXJjZU1vY2s7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93cygpOyBpKyspIHtcclxuICAgICAgICB0aGlzLndpZHRoU2tlbGV0b25zLnB1c2goTWF0aC5yYW5kb20oKSAqIDAuNyArIDAuMik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5sb2FkaW5nU2tlbGV0b25VdGlsaXRpZXMoKTtcclxuICAgIHRoaXMuYWRqdXN0VGFibGVTaXplKCk7XHJcbiAgICB0aGlzLndpZHRoUGFnZS5zZXQod2luZG93LmlubmVyV2lkdGgpO1xyXG4gICAgLy8gdGhpcy5jcmlhck1lbnVDb2x1bW5zKCk7XHJcbiAgICB0aGlzLmNvbmZpZy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgdGhpcy5jb2x1bW5zLnB1c2goY29sKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jaGVja0hpZGVDb2x1bW5zKCk7XHJcbiAgICBjb25zdCBkZWZhdWx0U29ydEZpZWxkID0gdGhpcy5kZWZhdWx0U29ydEZpZWxkO1xyXG4gICAgaWYgKGRlZmF1bHRTb3J0RmllbGQgJiYgdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdHlwZW9mIGFbZGVmYXVsdFNvcnRGaWVsZF0gPT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgICB0eXBlb2YgYltkZWZhdWx0U29ydEZpZWxkXSA9PT0gJ3N0cmluZydcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiAoYVtkZWZhdWx0U29ydEZpZWxkXSBhcyBzdHJpbmcpLmxvY2FsZUNvbXBhcmUoXHJcbiAgICAgICAgICAgIChiW2RlZmF1bHRTb3J0RmllbGRdIGFzIHN0cmluZylcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgIHR5cGVvZiBhW2RlZmF1bHRTb3J0RmllbGRdID09PSAnYm9vbGVhbicgJiZcclxuICAgICAgICAgIHR5cGVvZiBiW2RlZmF1bHRTb3J0RmllbGRdID09PSAnYm9vbGVhbidcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiBhW2RlZmF1bHRTb3J0RmllbGRdID09PSBiW2RlZmF1bHRTb3J0RmllbGRdXHJcbiAgICAgICAgICAgID8gMFxyXG4gICAgICAgICAgICA6IGFbZGVmYXVsdFNvcnRGaWVsZF1cclxuICAgICAgICAgICAgICA/IDFcclxuICAgICAgICAgICAgICA6IC0xO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICB0eXBlb2YgYVtkZWZhdWx0U29ydEZpZWxkXSA9PT0gJ251bWJlcicgJiZcclxuICAgICAgICAgIHR5cGVvZiBiW2RlZmF1bHRTb3J0RmllbGRdID09PSAnbnVtYmVyJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIChhW2RlZmF1bHRTb3J0RmllbGRdIGFzIG51bWJlcikgLSAoYltkZWZhdWx0U29ydEZpZWxkXSBhcyBudW1iZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gMDsgLy8gT3Ugb3V0cmEgbMOzZ2ljYSBkZXBlbmRlbmRvIGRvIGNhc29cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpc2FibGVkLXJvdycpLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJykuZm9yRWFjaChjZWxsID0+IHtcclxuICAgICAgICBjZWxsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgaWYgKCF0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCd0b29sdGlwJykpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWZpbmlyQ29sdW5hc0NvbmZpZ3VyYXZlaXMoY29uZmlnOiBUYWJsZUNvbmZpZykge1xyXG4gICAgdGhpcy5jb2x1bW5zLnNwbGljZSgwLCB0aGlzLmNvbHVtbnMubGVuZ3RoKTtcclxuXHJcbiAgICBjb25maWcuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRlZmluaXJGaWx0cm9zR2xvYmFpcyhjb25maWc6IFRhYmxlQ29uZmlnKSB7XHJcbiAgICBpZiAoY29uZmlnPy5lbmFibGVGaWx0ZXIpIHtcclxuXHJcbiAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyRmllbGRzLnNwbGljZSgwLCB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcy5sZW5ndGgpO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29uZmlnLmNvbHVtbnMpIHtcclxuICAgICAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcy5wdXNoKGNvbHVtbi5maWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0VGFibGUoKSB7XHJcbiAgICBpZiAodGhpcy5wdGFibGUpIHRoaXMucHRhYmxlLnJlc2V0KCk7XHJcbiAgICBpZiAodGhpcy5pbnB1dEZpZWxkKSB0aGlzLmlucHV0RmllbGQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgb25XaW5kb3dSZXNpemUoKSB7XHJcbiAgICB0aGlzLmFkanVzdFRhYmxlU2l6ZSgpO1xyXG4gICAgdGhpcy53aWR0aFBhZ2Uuc2V0KHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhY3RpdmVJdGVtKHJvd0RhdGE6IGFueSkge1xyXG4gICAgdGhpcy5vbkFjdGl2ZUl0ZW0uZW1pdChyb3dEYXRhKTtcclxuICB9XHJcblxyXG4gIGdldE9yRXhlY3V0ZTxUPihhY3Rpb246IFZhbHVlT3JGbjxUPiwgZGF0YTogYW55KTogVCB7XHJcbiAgICByZXR1cm4gZ2V0T3JFeGVjdXRlKGFjdGlvbiwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICBpc0Jvb2xlYW5GaWVsZChyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0eXBlb2Ygcm93RGF0YVtjb2wuZmllbGRdID09ICdib29sZWFuJztcclxuICB9XHJcblxyXG4gIGlzQ2hpcEZpZWxkKGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBjb2wuZmllbGRUeXBlID09ICdjaGlwJztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblBhZ2UoZXZlbnQ6IFRhYmxlUGFnZUV2ZW50KSB7XHJcbiAgICB0aGlzLmZpcnN0LnNldChldmVudC5maXJzdCk7XHJcbiAgICB0aGlzLnJvd3Muc2V0KGV2ZW50LnJvd3MpO1xyXG4gIH1cclxuXHJcbiAgaXNJbWFnZUZpZWxkKGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIGxldCByZXRvcm5vID0gY29sLmZpZWxkVHlwZSAmJiBjb2wuZmllbGRUeXBlID09PSAnaW1hZ2UnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgcmV0dXJuIHJldG9ybm87XHJcbiAgfVxyXG5cclxuICBpc1N3aXRjaEZpZWxkKGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIGxldCByZXRvcm5vID0gY29sLmZpZWxkVHlwZSAmJiBjb2wuZmllbGRUeXBlID09PSAnc3dpdGNoJyA/IHRydWUgOiBmYWxzZTtcclxuICAgIHJldHVybiByZXRvcm5vO1xyXG4gIH1cclxuXHJcbiAgaXNSb3dTZWxlY3RhYmxlKGV2ZW50OiBhbnkpIHtcclxuICAgIHJldHVybiAhdGhpcy5pc0Rpc2FibGVkQ2hlY2tib3goZXZlbnQuZGF0YSk7XHJcbiAgfVxyXG5cclxuICBpc0Rpc2FibGVkQ2hlY2tib3gocm93RGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGlzYWJsZUNvbnRyb2xDaGVja2JveEZ1bmN0aW9uXHJcbiAgICAgID8gdGhpcy5jb25maWcuZGlzYWJsZUNvbnRyb2xDaGVja2JveEZ1bmN0aW9uKHJvd0RhdGEpXHJcbiAgICAgIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc0Rpc2FibGVkUm93KHJvd0RhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRpc2FibGVSb3cgPyB0aGlzLmNvbmZpZy5kaXNhYmxlUm93KHJvd0RhdGEpIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBOw6NvIMOpIHV0aWxpemFkYVxyXG4gIHByaXZhdGUgZ2V0U3R5bGVDbGFzcyhyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnRVNUSUxPIC0+JywgY29sID8gY29sLnN0eWxlQ2xhc3MhKHJvd0RhdGEsIGNvbCwgZGF0YSkgOiAnJylcclxuICAgIHJldHVybiBjb2wgPyBjb2wuc3R5bGVDbGFzcyEocm93RGF0YSwgY29sLCBkYXRhKSA6ICcnXHJcbiAgfVxyXG5cclxuICB2ZXJpZmljYUN1cnNvcigpIHtcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXNhYmxlZC1yb3cnKS5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgIHJvdy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpLmZvckVhY2goY2VsbCA9PiB7XHJcbiAgICAgICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcclxuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgIGlmICghdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygndG9vbHRpcCcpKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gTsOjbyBlc3TDoSB2ZXJpZmljYW5kbyBzZSByb3dEYXRhW2NvbC5maWVsZF0gw6kgc3RyaW5nXHJcbiAgbG9hZEltYWdlKHJvd0RhdGE6IGFueSwgY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IHN0cmluZyB7XHJcbiAgICAvKlxyXG4gICAgICBOb3NzYSBjb2x1bmEgZGUgaW1hZ2VtIHRyYWJhbGhhIGNvbSBzdHJpbmdzIGRvIHRpcG86IGJhc2U2NCBvdSB1cmxcclxuICAgICovXHJcbiAgICBsZXQgcmV0b3JubyA9IGBkYXRhOiBpbWFnZSAvIGpwZzsgYmFzZTY0LCAke2ltZ0RlZmF1bHR9IGA7XHJcbiAgICBpZiAocm93RGF0YSAmJiBjb2wgJiYgcm93RGF0YVtjb2wuZmllbGRdICYmIHJvd0RhdGFbY29sLmZpZWxkXSAhPT0gJycpIHtcclxuICAgICAgaWYgKHJvd0RhdGFbY29sLmZpZWxkXS5pbmNsdWRlcygnaHR0cCcpKSByZXRvcm5vID0gcm93RGF0YVtjb2wuZmllbGRdO1xyXG4gICAgICBlbHNlIHJldG9ybm8gPSBgZGF0YTogaW1hZ2UgLyBqcGc7IGJhc2U2NCwgJHtyb3dEYXRhW2NvbC5maWVsZF19IGA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJldG9ybm87XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25HbG9iYWxGaWx0ZXIodGFibGU6IFRhYmxlLCBldmVudDogRXZlbnQpIHtcclxuICAgIHRoaXMuZmlsdGVyRmllbGQuZW1pdCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcclxuICAgIHRhYmxlLmZpbHRlckdsb2JhbCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlLCAnY29udGFpbnMnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwYWdpbmF0ZShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgbGV0IHBhZ2luYUluaWNpYWwgPVxyXG4gICAgICAgIChldmVudD8uZmlyc3QgPiAwID8gZXZlbnQuZmlyc3QgLyBldmVudC5yb3dzIDogZXZlbnQuZmlyc3QpICsgMTtcclxuICAgICAgbGV0IHRlcm1vUGVzcXVpc2EgPSAnJztcclxuICAgICAgbGV0IG9yZGVuYWNhbyA9ICcnO1xyXG5cclxuICAgICAgaWYgKGV2ZW50Lmdsb2JhbEZpbHRlcikgdGVybW9QZXNxdWlzYSA9IGV2ZW50Lmdsb2JhbEZpbHRlcjtcclxuXHJcbiAgICAgIGlmIChldmVudC5zb3J0RmllbGQpXHJcbiAgICAgICAgb3JkZW5hY2FvID0gYCR7ZXZlbnQuc29ydEZpZWxkfSAke2V2ZW50LnNvcnRPcmRlciA9PT0gMSA/ICdBU0MnIDogJ0RFU0MnfSBgO1xyXG5cclxuICAgICAgY29uc3Qgb2JqZXRvOiBUYWJsZVBhZ2luYXRlID0ge1xyXG4gICAgICAgIHBhZ2luYUluaWNpYWw6IHBhZ2luYUluaWNpYWwsXHJcbiAgICAgICAgdGFtYW5ob1BhZ2luYTogZXZlbnQucm93cyxcclxuICAgICAgICB0ZXJtb1Blc3F1aXNhOiB0ZXJtb1Blc3F1aXNhLFxyXG4gICAgICAgIG9yZGVuYWNhbzogb3JkZW5hY2FvLFxyXG4gICAgICAgIG9yZGVybmFjYW9Hcm91cDogeyBjb2x1bW46IGV2ZW50LnNvcnRGaWVsZCwgZGlyZWN0aW9uOiBldmVudC5zb3J0T3JkZXIgPT09IDEgPyAnQVNDJyA6ICdERVNDJyB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5vblBhZ2luYXRlLmVtaXQob2JqZXRvKTtcclxuXHJcbiAgICAgIHRoaXMuYWN0aW9uc09mZnNldCA9IGV2ZW50LmZpcnN0O1xyXG4gICAgICB0aGlzLmNyZWF0ZVRhYmxlQWN0aW9ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0aW9uQ2hhbmdlKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWN0aXZlSXRlbUxvdGUoc2VsZWN0ZWRJdGVtczogYW55KSB7XHJcbiAgICB0aGlzLm9uQWN0aXZlSXRlbUxvdGUuZW1pdChzZWxlY3RlZEl0ZW1zKTtcclxuICB9XHJcblxyXG4gIC8vIE7Do28gZXN0w6EgdmVyaWZpY2FuZG8gc2Ugcm93RGF0YVtjb2wuZmllbGRdIHBvZGUgc2VyIHBhc3NhZG8gcGFyYSBEYXRlXHJcbiAgcmV0dXJuUm93Q2xhc3Mocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKSB7XHJcbiAgICBsZXQgdmFsdWUgPSByb3dEYXRhW2NvbC5maWVsZF07XHJcbiAgICBsZXQgcm93Q2xhc3M6IHN0cmluZztcclxuXHJcbiAgICB0aGlzLnRhYmxlU2l6ZSA+IDgwMCA/IChyb3dDbGFzcyA9ICd0ZXh0LWJhc2UnKSA6IChyb3dDbGFzcyA9ICd0ZXh0LXNtJyk7XHJcblxyXG4gICAgaWYgKGNvbC5leHBpcmVkRGF0ZSA9PSB0cnVlKSB7XHJcbiAgICAgIG5ldyBEYXRlKHZhbHVlKSA8IG5ldyBEYXRlKClcclxuICAgICAgICA/IChyb3dDbGFzcyA9IHJvd0NsYXNzICsgJyB0ZXh0LXJlZC00MDAgZm9udC1zZW1pYm9sZCcpXHJcbiAgICAgICAgOiAnJztcclxuICAgIH1cclxuICAgIHJldHVybiByb3dDbGFzcztcclxuICB9XHJcblxyXG4gIC8vIE7Do28gw6kgdXNhZGFcclxuICBwcml2YXRlIGV4cGlyZWRGaWxlKHJvd0RhdGE6IGFueSwgY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHZhbHVlID0gcm93RGF0YVsnZGF0YXZlbmNpbWVudG8nXTtcclxuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSkgPCBuZXcgRGF0ZSgpICYmIGNvbC5maWVsZCA9PSAnYXJlYSc7XHJcbiAgfVxyXG5cclxuICB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pIHtcclxuICAgIGxldCB2YWx1ZSA9IHJvd0RhdGFbY29sLmZpZWxkXTtcclxuXHJcbiAgICBpZiAoY29sLnRyYW5zZm9ybSkge1xyXG4gICAgICByZXR1cm4gY29sLnRyYW5zZm9ybSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSAmJiB0aGlzLnJlcGxhY2VFbXB0eVZhbHVlcyAmJiB0aGlzLmlzTG9hZGluZ1NrZWxldG9uKCkpIHtcclxuICAgICAgcmV0dXJuICctJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICBpZiAoIWNvbC5waXBlKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGNvbC5waXBlKSB7XHJcbiAgICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUsICdkZC9NTS95eXl5JywgJ1VUQycpO1xyXG4gICAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJ2RkL01NL3l5eXkgSEg6bW0nKTtcclxuICAgICAgICBjYXNlICdkYXRlTW9udGhZZWFyJzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJ01NL3l5eXknKTtcclxuICAgICAgICBjYXNlICdkZWNpbWFsJzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmRlY2ltYWxQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJzEuMi0yJywgJ3B0LUJSJyk7XHJcbiAgICAgICAgY2FzZSAnY3BmY25waic6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5jcGZDbnBqUGlwZS50cmFuc2Zvcm0odmFsdWUpO1xyXG4gICAgICAgIGNhc2UgJ3RlbGVmb25lJzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLnRlbGVmb25lUGlwZS50cmFuc2Zvcm0odmFsdWUpO1xyXG4gICAgICAgIGNhc2UgJ2NhcGl0YWxpemUnOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtQ2FwaXRhbGl6ZSh2YWx1ZSk7XHJcbiAgICAgICAgY2FzZSAnbW9uZXknOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0YXJWYWxvcih2YWx1ZSk7XHJcbiAgICAgICAgY2FzZSAncGVyY2VudGFnZSc6XHJcbiAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9ICUgYDtcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyB0cmFuc2Zvcm1EYXRlKGRhdGU6IGFueSkge1xyXG4gIC8vICAgY29uc3QgZGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUoJ2VuLVVTJyk7XHJcbiAgLy8gICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoZGF0ZSk7XHJcblxyXG4gIC8vICAgLy8gQWp1c3RlIGEgZGF0YSBwYXJhIG8gZnVzbyBob3LDoXJpbyBsb2NhbFxyXG4gIC8vICAgY29uc3QgbG9jYWxEYXRlID0gbmV3IERhdGUodXRjRGF0ZS5nZXRUaW1lKCkgKyAodXRjRGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDApKTtcclxuXHJcbiAgLy8gICBjb25zb2xlLmxvZygnbG9jYWxEYXRlJywgbG9jYWxEYXRlLCBcImlucHV0IGRhdGVcIiwgZGF0ZSk7XHJcblxyXG4gIC8vICAgLy8gVHJhbnNmb3JtZSBhIGRhdGEgbG9jYWwgcGFyYSBvIGZvcm1hdG8gZGVzZWphZG9cclxuICAvLyAgIHJldHVybiBkYXRlUGlwZS50cmFuc2Zvcm0obG9jYWxEYXRlLCAnZGQvTU0veXl5eScpO1xyXG4gIC8vIH1cclxuXHJcbiAgdHJhbnNmb3JtQ2FwaXRhbGl6ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcclxuXHJcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoJyAnKS5tYXAoKHdvcmQsIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IHdvcmRVcHBlciA9IHdvcmQudG9VcHBlckNhc2UoKTtcclxuICAgICAgY29uc3Qgd29yZExvd2VyID0gd29yZC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgLy8gVmVyaWZpY2EgbnVtZXJhaXMgcm9tYW5vc1xyXG4gICAgICBpZiAodGhpcy5yb21hbk51bWVyYWxzLmhhcyh3b3JkVXBwZXIpKSB7XHJcbiAgICAgICAgcmV0dXJuIHdvcmQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFZlcmlmaWNhIHNpZ2xhc1xyXG4gICAgICBpZiAodGhpcy5zaWdsYXMuaGFzKHdvcmRVcHBlcikpIHtcclxuICAgICAgICByZXR1cm4gd29yZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVmVyaWZpY2EgcHJlcG9zacOnw7VlcywgbWFzIG7Do28gYWx0ZXJhIGEgcHJpbWVpcmEgcGFsYXZyYVxyXG4gICAgICBpZiAoaW5kZXggIT09IDAgJiYgdGhpcy5wcmVwb3NpdGlvbnMuaGFzKHdvcmRMb3dlcikpIHtcclxuICAgICAgICByZXR1cm4gd29yZExvd2VyO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDYXBpdGFsaXphIGEgcHJpbWVpcmEgbGV0cmEgZGFzIGRlbWFpcyBwYWxhdnJhc1xyXG4gICAgICByZXR1cm4gd29yZC5jaGFyQXQoMCkudG9Mb2NhbGVVcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgIH0pLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdGFyVmFsb3IodmFsb3I6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQoJ3B0LUJSJywge1xyXG4gICAgICBzdHlsZTogJ2N1cnJlbmN5JyxcclxuICAgICAgY3VycmVuY3k6ICdCUkwnLFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQodmFsb3IpO1xyXG4gIH1cclxuXHJcbiAgYWRqdXN0VGFibGVTaXplKCkge1xyXG4gICAgaWYgKHRoaXMudGFibGVTaXplIDwgODAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTaXplID0gJ3AtZGF0YXRhYmxlLXNtJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTaXplID0gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkb3VibGVDbGljayhlOiBhbnksIHJvd0RhdGE6IGFueSkge1xyXG4gICAgbGV0IGV2ZW50RG91YmxlQ2xpY2sgPSB7IGV2ZW50OiBlLCByb3dEYXRhOiByb3dEYXRhIH07XHJcblxyXG4gICAgbGV0IGFycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZS50YXJnZXQuY2xhc3NMaXN0LmZvckVhY2goKHg6IGFueSkgPT4gYXJyYXkucHVzaCh4KSk7XHJcblxyXG4gICAgdGhpcy5kb3VibGVDbGlja0V2ZW50LmVtaXQoZXZlbnREb3VibGVDbGljayk7XHJcbiAgfVxyXG5cclxuICAvLyBhbGlnbkNvbHVuYXMoY29sOiBhbnkpOiBzdHJpbmcge1xyXG4gIC8vICAgaWYgKGNvbC5hbGlnbikge1xyXG4gIC8vICAgICByZXR1cm4gYHRleHQgLSBhbGlnbjogJHsgY29sLmFsaWduIH0gYDtcclxuICAvLyAgIH0gZWxzZSByZXR1cm4gJyc7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhbGlnbkNvbHVuYXNIZWFkZXIoY29sOiBhbnkpOiBzdHJpbmcge1xyXG4gIC8vICAgaWYgKGNvbC5hbGlnbikge1xyXG4gIC8vICAgICBpZiAoY29sLmFsaWduID09ICdyaWdodCcpIHJldHVybiAnanVzdGlmeS1jb250ZW50OiBlbmQnO1xyXG4gIC8vICAgICBlbHNlIHJldHVybiAnJztcclxuICAvLyAgIH0gZWxzZSByZXR1cm4gJyc7XHJcbiAgLy8gfVxyXG5cclxuICByZXRvcm5hclJvdyhyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4sIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgX3Jvd2FjdGlvbiA9IHRoaXMuY29uZmlnLnJvd3MgPyB0aGlzLmNvbmZpZy5yb3dzW2NvbC5maWVsZF0gOiBudWxsO1xyXG4gICAgY29uc3QgX2ZpZWxkOiBzdHJpbmcgPVxyXG4gICAgICBfcm93YWN0aW9uICYmIF9yb3dhY3Rpb25bZmllbGRdXHJcbiAgICAgICAgPyBfcm93YWN0aW9uW2ZpZWxkXS5jb25zdHJ1Y3RvciA9PT0gRnVuY3Rpb25cclxuICAgICAgICAgID8gX3Jvd2FjdGlvbltmaWVsZF0uYXBwbHkodGhpcywgW3Jvd0RhdGFdKVxyXG4gICAgICAgICAgOiBfcm93YWN0aW9uW2ZpZWxkXVxyXG4gICAgICAgIDogbnVsbDtcclxuICAgIHJldHVybiBfZmllbGQ7XHJcbiAgfVxyXG5cclxuICAvLyBOw6NvIMOpIHVzYWRvXHJcbiAgcHJpdmF0ZSBleGliaXJDYW1wbyhmaWVsZDogYW55LCByb3dEYXRhOiBhbnkpIHtcclxuICAgIGxldCB2aXNpYmxlID0gZmllbGQudmlzaWJsZSA/IGZpZWxkLnZpc2libGUocm93RGF0YSkgOiB0cnVlO1xyXG5cclxuICAgIHJldHVybiB2aXNpYmxlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuQ2xhc3NDaGlwKHJvd0RhdGE6IGFueSwgY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYGNoaXAgLSBzdHlsZSB3IC0gYXV0byBib3JkZXIgLSByb3VuZCAtIDJ4bCBwIC0gMiB0ZXh0IC0gJHt0aGlzLnJldG9ybmFyUm93KFxyXG4gICAgICByb3dEYXRhLFxyXG4gICAgICBjb2wsXHJcbiAgICAgICdzdHlsZWNoaXAnXHJcbiAgICApXHJcbiAgICAgIH0gYm9yZGVyIC0gJHt0aGlzLnJldG9ybmFyUm93KHJvd0RhdGEsIGNvbCwgJ3N0eWxlY2hpcCcpfSBgO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuQ2xhc3NJY29uKHJvd0RhdGE6IGFueSwgY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXRvcm5hclJvdyhyb3dEYXRhLCBjb2wsICdpY29ucm93Jyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucmV0b3JuYXJSb3cocm93RGF0YSwgY29sLCAndG9vbHRpcGljb25yb3cnKTtcclxuICB9XHJcblxyXG4gIHJldHVyblRvb2x0aXBSb3cocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnJldG9ybmFyUm93KHJvd0RhdGEsIGNvbCwgJ3Rvb2x0aXByb3cnKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZUNvbHVtbihmaWVsZDogc3RyaW5nKSB7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlcjtcclxuXHJcbiAgICBsZXQgY29sdW1uOiBUYWJsZUNvbmZpZ0NvbHVtbiB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlnLmNvbHVtbnMuZmluZChcclxuICAgICAgeCA9PiB4LmZpZWxkID09IGZpZWxkXHJcbiAgICApO1xyXG4gICAgaWYgKGNvbHVtbikge1xyXG4gICAgICBpbmRleCA9IHRoaXMuY29uZmlnLmNvbHVtbnMuaW5kZXhPZihjb2x1bW4pO1xyXG4gICAgICB0aGlzLmNvbmZpZy5jb2x1bW5zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIHRoaXMuZGVsZXRlZENvbHVucy5wdXNoKGNvbHVtbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRDb2x1bW4oZmllbGQ6IHN0cmluZykge1xyXG4gICAgbGV0IGluZGV4OiBudW1iZXI7XHJcblxyXG4gICAgbGV0IGNvbHVtbjogVGFibGVDb25maWdDb2x1bW4gfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZy5jb2x1bW5zLmZpbmQoXHJcbiAgICAgICh4KSA9PiB4LmZpZWxkID09IGZpZWxkXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghY29sdW1uKSB7XHJcbiAgICAgIGxldCBkZWxldGVkQ29sdW1uOiBUYWJsZUNvbmZpZ0NvbHVtbiB8IHVuZGVmaW5lZCA9XHJcbiAgICAgICAgdGhpcy5kZWxldGVkQ29sdW5zLmZpbmQoKHgpID0+IHguZmllbGQgPT0gZmllbGQpO1xyXG5cclxuICAgICAgaWYgKGRlbGV0ZWRDb2x1bW4gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaW5kZXggPSB0aGlzLmRlbGV0ZWRDb2x1bnMuaW5kZXhPZihkZWxldGVkQ29sdW1uKTtcclxuICAgICAgICB0aGlzLmRlbGV0ZWRDb2x1bnMuc2xpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIHRoaXMuY29uZmlnLmNvbHVtbnMucHVzaChkZWxldGVkQ29sdW1uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGluYW1pY0NvbHVtblNldChlOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pIHtcclxuICAgIGNvbC5jaGVja2VkID0gZS5jaGVja2VkO1xyXG4gICAgaWYgKGUuY2hlY2tlZCkgdGhpcy5hZGRDb2x1bW4oY29sLmZpZWxkKTtcclxuICAgIGVsc2UgdGhpcy5kZWxldGVDb2x1bW4oY29sLmZpZWxkKTtcclxuXHJcbiAgICBpZiAoY29sLnBvc2l0aW9uKSB0aGlzLmNvbmZpZy5jb2x1bW5zLnNvcnQodGhpcy5zb3J0QnlQb3NpdGlvbigpKTtcclxuICB9XHJcblxyXG4gIGFicmlyTWVudUZpbHRybyhlOiBhbnkpIHtcclxuICAgIHRoaXMubWVudUZpbHRybyA9ICF0aGlzLm1lbnVGaWx0cm87XHJcbiAgICB0aGlzLmNoZWNrYm94Q2xpY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLndpZHRoUGFnZSgpIDwgNzAwKVxyXG4gICAgICB0aGlzLnN0eWxlU2V0dGVyKFxyXG4gICAgICAgICdsZWZ0JyxcclxuICAgICAgICB0aGlzLmJvdGFvRmlsdHJvLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCAtIDI4OCArICdweCdcclxuICAgICAgKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5zdHlsZVNldHRlcihcclxuICAgICAgICAnbGVmdCcsXHJcbiAgICAgICAgdGhpcy5ib3Rhb0ZpbHRyby5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQgKyA0MCArICdweCdcclxuICAgICAgKTtcclxuXHJcbiAgICB0aGlzLnN0eWxlU2V0dGVyKCd0b3AnLCB0aGlzLmJvdGFvRmlsdHJvLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wICsgJ3B4Jyk7XHJcbiAgICB0aGlzLnN0eWxlU2V0dGVyKCd2aXNpYmlsaXR5JywgdGhpcy5tZW51RmlsdHJvID8gJ3Zpc2libGUnIDogJ2hpZGRlbicpO1xyXG4gIH1cclxuXHJcbiAgZmVjaGFyTWVudUZpbHRybygpIHtcclxuICAgIHRoaXMubWVudUZpbHRybyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jaGVja2JveENsaWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLnN0eWxlU2V0dGVyKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnLCBbJyRldmVudCddKVxyXG4gIG9uRXNjYXBlS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJDb2x1bW5zQnRuID09IHRydWUgJiYgdGhpcy5tZW51RmlsdHJvID09IHRydWUpIHtcclxuICAgICAgdGhpcy5mZWNoYXJNZW51RmlsdHJvKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGlja0V2ZW50KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmZpbHRlckNvbHVtbnNCdG4gPT0gdHJ1ZSAmJiB0aGlzLm1lbnVGaWx0cm8gPT0gdHJ1ZSkge1xyXG4gICAgICBjb25zdCBjbGlja2VkRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgY29uc3QgbWVudUZpbHRyb0RpdiA9XHJcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI21lbnVGaWx0cm9EaXYnKTtcclxuICAgICAgY29uc3QgYm90YW9GaWx0cm8gPVxyXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNib3Rhb0ZpbHRybycpO1xyXG4gICAgICBjb25zdCBpc0NoZWNrYm94Q2xpY2tlZCA9XHJcbiAgICAgICAgY2xpY2tlZEVsZW1lbnQuY2xhc3NMaXN0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ3AtY2hlY2tib3gnKSB8fFxyXG4gICAgICAgIGV2ZW50LnRhcmdldC5jbGFzc0xpc3QudG9TdHJpbmcoKSA9PSAnJztcclxuICAgICAgY29uc3QgaXNJbnNpZGVNZW51ID1cclxuICAgICAgICBtZW51RmlsdHJvRGl2Py5jb250YWlucyhjbGlja2VkRWxlbWVudCkgfHxcclxuICAgICAgICBib3Rhb0ZpbHRybz8uY29udGFpbnMoY2xpY2tlZEVsZW1lbnQpIHx8XHJcbiAgICAgICAgaXNDaGVja2JveENsaWNrZWQ7XHJcblxyXG4gICAgICBpZiAoIWlzSW5zaWRlTWVudSkgdGhpcy5mZWNoYXJNZW51RmlsdHJvKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdHlsZVNldHRlcihzdHlsZTogc3RyaW5nLCBkYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucmVuZGVyZXI/LnNldFN0eWxlKHRoaXMubWVudUZpbHRyb0Rpdi5uYXRpdmVFbGVtZW50LCBzdHlsZSwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICBjaGVja01lbnVGaWx0cm8oY29sOiBUYWJsZUNvbmZpZ0NvbHVtbikge1xyXG4gICAgbGV0IGRlbGV0ZWRDb2x1bW4gPSB0aGlzLmRlbGV0ZWRDb2x1bnMuZmluZChcclxuICAgICAgeCA9PiB4LmZpZWxkID09IGNvbC5maWVsZFxyXG4gICAgKTtcclxuICAgIGlmIChkZWxldGVkQ29sdW1uKSBjb2wuY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgZWxzZSBjb2wuY2hlY2tlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzb3J0QnlQb3NpdGlvbigpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbTE6IGFueSwgZWxlbTI6IGFueSkge1xyXG4gICAgICBpZiAoZWxlbTEucG9zaXRpb24gPCBlbGVtMi5wb3NpdGlvbikge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgICAgfSBlbHNlIGlmIChlbGVtMS5wb3NpdGlvbiA+IGVsZW0yLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBkaW5hbWljRGlzYWJsZUNvbHVtbihjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoY29sLmZpeGVkQ29sdW1uKSByZXR1cm4gY29sLmZpeGVkQ29sdW1uO1xyXG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjaGVja0hpZGVDb2x1bW5zKCkge1xyXG4gICAgbGV0IGhpZGVDb2x1bW5zQ29uZmlnID0gdGhpcy5jb2x1bW5zLmZpbHRlcihcclxuICAgICAgY29sID0+IGNvbC5oaWRlQ29sdW1uID09IHRydWVcclxuICAgICk7XHJcbiAgICBoaWRlQ29sdW1uc0NvbmZpZy5mb3JFYWNoKGNvbCA9PiB0aGlzLmRlbGV0ZUNvbHVtbihjb2wuZmllbGQpKTtcclxuICB9XHJcblxyXG4gIGdldEN1c3RvbVRlbXBsYXRlKHRlbXBsYXRlbmFtZTogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVzW3RlbXBsYXRlbmFtZV07XHJcbiAgfVxyXG5cclxuICBvblN3aXRjaENoYW5nZShlc3RhZG86IGFueSwgcm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKSB7XHJcbiAgICB0aGlzLm9uU3dpdGNoVGFibGVDaGFuZ2UuZW1pdCh7XHJcbiAgICAgIGVzdGFkbzogZXN0YWRvLFxyXG4gICAgICByb3dEYXRhOiByb3dEYXRhLFxyXG4gICAgICBjb2w6IGNvbCxcclxuICAgIH0pO1xyXG5cclxuICAgIHJvd0RhdGFbY29sLmZpZWxkXSA9IGVzdGFkbztcclxuICB9XHJcblxyXG4gIGNyZWF0ZVRhYmxlQWN0aW9ucygpIHtcclxuICAgIHRoaXMudGFibGVBY3Rpb25zID0gdGhpcy5kYXRhU291cmNlPy5tYXAoKHgpID0+XHJcbiAgICAgIHRoaXMuY29uZmlnLmFjdGlvbnNcclxuICAgICAgICA/IHRoaXMuY29uZmlnLmFjdGlvbnMubWFwKCh5KSA9PiBtYXBUb01lbnVJdGVtKHksIHgpKVxyXG4gICAgICAgIDogW11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvblNvcnQoZTogYW55KSB7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBbLi4udGhpcy5kYXRhU291cmNlXTtcclxuICB9XHJcblxyXG4gIGdldCBjb25maWcoKTogVGFibGVDb25maWcge1xyXG4gICAgcmV0dXJuIHRoaXMudGFibGVDb25maWcoKSE7XHJcbiAgfVxyXG5cclxuICBjb2x1bW5zRmlsdGVyID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgZHluYW1pY0NvbHVtbnMgPSAodGhpcy50YWJsZUNvbmZpZygpPy5jb2x1bW5zID8/IFtdKS5maWx0ZXIoY29sID0+ICFjb2wuZml4ZWRDb2x1bW4pO1xyXG5cclxuICAgIHJldHVybiBbLi4uZHluYW1pY0NvbHVtbnMsIC4uLnRoaXMuZGVsZXRlZENvbHVuc107XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybk1heFdpZHRoID0gY29tcHV0ZWQoKCkgPT4gKHdpZHRoQ29sOiBzdHJpbmcpID0+IHtcclxuICAgIGxldCB3aWR0aFRhYmxlID0gdGhpcy50YWJsZUNlbGwoKT8ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgbGV0IHBlcmNlbnQgPSBOdW1iZXIod2lkdGhDb2wucmVwbGFjZSgnJScsICcnKSk7XHJcblxyXG4gICAgbGV0IHdpZHRoQ2FsYyA9IHdpZHRoVGFibGUgKiBwZXJjZW50IC8gMTAwO1xyXG5cclxuICAgIHJldHVybiBgJHt3aWR0aENhbGN9cHhgO1xyXG4gIH0pXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImt2LXRhYmxlLWNvbnRhaW5lclwiPlxyXG4gIEBpZiAoY29uZmlnKSB7XHJcbiAgPHAtdGFibGVcclxuICAgICNkdFxyXG4gICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXNtXCJcclxuICAgIFt2YWx1ZV09XCJkYXRhU291cmNlXCJcclxuICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZEl0ZW1zXCJcclxuICAgIFtyb3dTZWxlY3RhYmxlXT1cImlzUm93U2VsZWN0YWJsZVwiXHJcbiAgICBbY29sdW1uc109XCJjb25maWcuY29sdW1uc1wiXHJcbiAgICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cImdsb2JhbEZpbHRlckZpZWxkc1wiXHJcbiAgICBbcm93c109XCJyb3dzKClcIlxyXG4gICAgW3BhZ2luYXRvcl09XCJwYWdpbmF0b3JcIlxyXG4gICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJyb3dzUGVyUGFnZU9wdGlvbnNcIlxyXG4gICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcclxuICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IC0ge2xhc3R9IGRlIHt0b3RhbFJlY29yZHN9XCJcclxuICAgIFtyb3dIb3Zlcl09XCJ0cnVlXCJcclxuICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcclxuICAgIFtsYXp5XT1cImNvbmZpZy5sYXp5XCJcclxuICAgIFtmaXJzdF09XCJmaXJzdCgpXCJcclxuICAgIChvbkxhenlMb2FkKT1cInBhZ2luYXRlKCRldmVudClcIlxyXG4gICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAob25Tb3J0KT1cIm9uU29ydCgkZXZlbnQpXCJcclxuICAgIChvblBhZ2UpPVwib25QYWdlKCRldmVudClcIlxyXG4gICAgcm93R3JvdXBNb2RlPVwicm93c3BhblwiXHJcbiAgICBbZ3JvdXBSb3dzQnldPVwiY29uZmlnLmZpZWxkR3JvdXBcIlxyXG4gICAgW3Nob3dGaXJzdExhc3RJY29uXT1cIndpZHRoUGFnZSgpID4gOTYwID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgIFtwYWdlTGlua3NdPVwid2lkdGhQYWdlKCkgPiA5NjAgPyAyIDogMVwiXHJcbiAgICBbcmVzcG9uc2l2ZV09XCJ0cnVlXCJcclxuICAgIFtyZXNwb25zaXZlTGF5b3V0XT1cInJlc3BvbnNpdmVMYXlvdXQgPyAnc3RhY2snIDogJydcIlxyXG4gICAgW3Njcm9sbGFibGVdPVwiaXNUYWJsZVNjcm9sbGFibGVcIlxyXG4gICAgW3Njcm9sbEhlaWdodF09XCJzY3JvbGxIZWlnaHRcIlxyXG4gICAgW3Jvd1RyYWNrQnldPVwicm93VHJhY2tCeVwiXHJcbiAgPlxyXG4gICAgQGlmIChjb25maWc/LmVuYWJsZUNhdGlvbikge1xyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBmbGV4LXdyYXAganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ3JpZCBmb3JtZ3JpZCBwLWZsdWlkIGNvbC0xMiBtLTAgbWItMlwiXHJcbiAgICAgICAgW3N0eWxlLnBhZGRpbmcucmVtXT1cIjAuMVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGZsZXggZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgIEBpZiAoY29uZmlnLnRpdGxlKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBmb250LWJvbGQgbXktM1wiPlxyXG4gICAgICAgICAgICB7eyBjb25maWcudGl0bGUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfSBAaWYgKGNvbmZpZy5zdWJ0aXRsZSkge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gbWItNCBmb250LW1lZGl1bVwiPlxyXG4gICAgICAgICAgICB7eyBjb25maWcuc3VidGl0bGUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIG1kOmNvbC02IGxnOmNvbC00IHt7XHJcbiAgICAgICAgICAgIHdpZHRoUGFnZSgpIDwgNzY4ID8gJ2NvbC0xMCcgOiAnY29sLTEyJ1xyXG4gICAgICAgICAgfX0gIGdhcC0xIHAtMFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgQGlmIChjb25maWc/LmVuYWJsZUZpbHRlcikge1xyXG4gICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInAtaW5wdXQtaWNvbi1sZWZ0XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktc2VhcmNoIHRleHQtc21cIj48L2k+XHJcblxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XHJcbiAgICAgICAgICAgICAgcEF1dG9Gb2N1c1xyXG4gICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwid2lkdGhQYWdlKCkgPiA4MDBcIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25HbG9iYWxGaWx0ZXIoZHQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICAgICAgICAjaW5wdXRGaWVsZFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zbSBcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9zcGFuPiAtLT5cclxuICAgICAgICAgIEBpZihhdXRvRm9jdXNTZWFyY2gpIHtcclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgIHBBdXRvRm9jdXNcclxuICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cIndpZHRoUGFnZSgpID4gODAwXCJcclxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uR2xvYmFsRmlsdGVyKGR0LCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICAgI2lucHV0RmllbGRcclxuICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc20gY29sLTZcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfSBcclxuICAgICAgICAgIEBlbHNlIHs8aW5wdXRcclxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XHJcbiAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCJ3aWR0aFBhZ2UoKSA+IDgwMFwiXHJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbkdsb2JhbEZpbHRlcihkdCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgICNpbnB1dEZpZWxkXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtIGNvbC02XCJcclxuICAgICAgICAgICAgLz59XHJcblxyXG4gICAgICAgICAgfSBAaWYoZmlsdGVyQ29sdW1uc0J0bikge1xyXG4gICAgICAgICAgPGRpdiAjYm90YW9GaWx0cm8+XHJcbiAgICAgICAgICAgIDxrdi1idXR0b25cclxuICAgICAgICAgICAgICBpZD1cImJvdGFvRmlsdHJvXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCInYWxpZ25fdmVydGljYWxfdG9wJ1wiXHJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiYWJyaXJNZW51RmlsdHJvKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIHNldmVyaXR5PVwidGVydGlhcnlcIlxyXG4gICAgICAgICAgICAgIHBUb29sdGlwPVwiT2N1bHRhci9FeGliaXIgY29sdW5hc1wiXHJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2t2LWJ1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgI21lbnVGaWx0cm9EaXZcclxuICAgICAgICAgICAgaWQ9XCJtZW51RmlsdHJvRGl2XCJcclxuICAgICAgICAgICAgW3N0eWxlLnZpc2liaWxpdHldPVwiJ2hpZGRlbidcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIHotNCBiZy1ncmF5LTIwMCBtZW51LWNvbHVtbnMtZmlsdHJvXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHAtY2FyZCBzdHlsZUNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIHRleHQtbWVkaXVtIHctMTVyZW0gcC0xXCJcclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc0ZpbHRlcigpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBjaGVja01lbnVGaWx0cm8oY29sKSB9fVxyXG4gICAgICAgICAgICAgICAgPHAtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgI2ZpbHRlckNvbHVtbnNcclxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbC5oZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJkaW5hbWljQ29sdW1uU2V0KCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkaW5hbWljRGlzYWJsZUNvbHVtbihjb2wpXCJcclxuICAgICAgICAgICAgICAgID48L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvcC1jYXJkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9IEBpZihmaWx0ZXJCdXR0b24oKSkge1xyXG4gICAgICAgICAgPHAtYnV0dG9uXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJrdi1idXR0b24gc21hbGwgdGVydGlhcnkgdGV4dC14cyBmb250LW1lZGl1bVwiXHJcbiAgICAgICAgICAgIGxhYmVsPVwiRmlsdHJhclwiXHJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1maWx0ZXJcIlxyXG4gICAgICAgICAgICBbYmFkZ2VdPVwiZmlsdGVyQnV0dG9uQmFkZ2UoKVwiXHJcbiAgICAgICAgICAgIGJhZGdlQ2xhc3M9XCJ0ZXh0LWdyYXktODAwXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhzXCJcclxuICAgICAgICAgICAgKG9uQ2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgPjwvcC1idXR0b24+XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cclxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2ZpbHRyb11cIj4gPC9uZy1jb250ZW50PlxyXG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgY29sLTIganVzdGlmeS1jb250ZW50LWVuZCBnYXAtMiBwLTBcIj5cclxuICAgICAgICAgIEBmb3IgKGFjdGlvbiBvZiBjb25maWcuYWN0aW9uc0xvdGU7IHRyYWNrIGk7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICBAaWYgKChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgfHwgYWN0aW9uLnNob3dBY29lc0xvdGUpICYmXHJcbiAgICAgICAgICAgIChnZXRPckV4ZWN1dGUoYWN0aW9uLnZpc2libGUsIHNlbGVjdGVkSXRlbXMpID8/IHRydWUpKSB7XHJcbiAgICAgICAgICAgIDxrdi1idXR0b25cclxuICAgICAgICAgICAgICAob25DbGljayk9XCJhY3Rpb24/LmNvbW1hbmQoKTsgYWN0aXZlSXRlbUxvdGUoc2VsZWN0ZWRJdGVtcylcIlxyXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJnZXRPckV4ZWN1dGUoYWN0aW9uLnRvb2x0aXAsIHNlbGVjdGVkSXRlbXMpXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIidsZWZ0J1wiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldE9yRXhlY3V0ZShhY3Rpb24uZGlzYWJsZWQsIHNlbGVjdGVkSXRlbXMpIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJnZXRPckV4ZWN1dGUoYWN0aW9uLmljb24sIHNlbGVjdGVkSXRlbXMpXCJcclxuICAgICAgICAgICAgICBbc2V2ZXJpdHldPVwiYWN0aW9uLnNldmVyaXR5IHx8ICd0ZXJ0aWFyeSdcIlxyXG4gICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9yRXhlY3V0ZShhY3Rpb24ubGFiZWwsIHNlbGVjdGVkSXRlbXMpIHx8ICcnXCJcclxuICAgICAgICAgICAgICBbaXRlbXNdPVwiYWN0aW9uLml0ZW1zIHx8IFtdXCJcclxuICAgICAgICAgICAgICBbcG9wdXBdPVwiKGFjdGlvbi5pdGVtcyAmJiBhY3Rpb24uaXRlbXMubGVuZ3RoID4gMCkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgfVxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIEBpZiAoY29uZmlnLmVuYWJsZVNlbGVjdCkge1xyXG4gICAgICAgIDx0aD5cclxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3hcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2ZUl0ZW1Mb3RlKHNlbGVjdGVkSXRlbXMpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkSGVhZGVyQ2hlY2tib3hcIlxyXG4gICAgICAgICAgPjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgfSBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPHRoXHJcbiAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiY29sLnNvcnRhYmxlID09PSBmYWxzZVwiXHJcbiAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIge3tcclxuICAgICAgICAgICAgICBjb2w/LmNlbnRyYWxpemUgJiYgJ2p1c3RpZnktY29udGVudC1jZW50ZXInXHJcbiAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGRcIj57eyBjb2wuaGVhZGVyIH19PC9zcGFuPlxyXG4gICAgICAgICAgICBAaWYgKGNvbC5zb3J0YWJsZSkge1xyXG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBbZmllbGRdPVwiY29sLmZpZWxkXCIgY2xhc3M9XCJwYi0xXCI+PC9wLXNvcnRJY29uPlxyXG4gICAgICAgICAgICB9IEBpZiAoY29sLmhlYWRlclRvb2x0aXApIHtcclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJjb2wuaGVhZGVyVG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgPmluZm88L3NwYW5cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIH0gQGlmIChjb25maWcuYWN0aW9ucyAmJiBjb25maWcuYWN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L3RyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGVcclxuICAgICAgcFRlbXBsYXRlPVwiYm9keVwiXHJcbiAgICAgIGxldC1yb3dEYXRhXHJcbiAgICAgIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiXHJcbiAgICAgIGxldC1yb3dncm91cD1cInJvd2dyb3VwXCJcclxuICAgICAgbGV0LXJvd3NwYW49XCJyb3dzcGFuXCJcclxuICAgICAgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIlxyXG4gICAgPlxyXG4gICAgICA8dHJcclxuICAgICAgICAoZGJsY2xpY2spPVwiZG91YmxlQ2xpY2soJGV2ZW50LCByb3dEYXRhKVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgY2FwaXRhbGl6ZTogdGFibGVDYXB0YWxpemVkLFxyXG4gICAgICAgICAgbGFzdDogcm93SW5kZXggPT09IGRhdGFTb3VyY2UubGVuZ3RoIC0gMVxyXG4gICAgICAgIH1cIlxyXG4gICAgICAgIGNsYXNzPVwidHItdGQge3sgaXNEaXNhYmxlZFJvdyhyb3dEYXRhKSA/ICdkaXNhYmxlZC1yb3cnIDogJycgfX1cIlxyXG4gICAgICA+XHJcbiAgICAgICAgQGlmIChjb25maWcuZW5hYmxlU2VsZWN0KSB7XHJcbiAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDhweCAhaW1wb3J0YW50XCI+XHJcbiAgICAgICAgICA8cC10YWJsZUNoZWNrYm94XHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJyb3dEYXRhXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRDaGVja2JveChyb3dEYXRhKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVJdGVtTG90ZShzZWxlY3RlZEl0ZW1zKVwiXHJcbiAgICAgICAgICA+PC9wLXRhYmxlQ2hlY2tib3g+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICB9IEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgQGlmIChyb3dncm91cCAmJiAhY29sLnRlbXBsYXRlKSB7XHJcbiAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJyb3dncm91cCAmJiBjb2wuZ3JvdXBlZCA/IHJvd3NwYW4gOiBudWxsXCJcclxuICAgICAgICAgICAgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBSb3cocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwie3tcclxuICAgICAgICAgICAgICBjb2wuc3R5bGVDbGFzc1xyXG4gICAgICAgICAgICAgICAgPyBjb2wuc3R5bGVDbGFzcyhyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgIDogJydcclxuICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlIHRleHQteHNcIj57eyBjb2wuaGVhZGVyIH19Ojwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNCb29sZWFuRmllbGQocm93RGF0YSwgY29sKTsgZWxzZSBib29sZWFuRmllbGRcIlxyXG4gICAgICAgICAgICAgIFtjbGFzc109XCJyZXR1cm5Sb3dDbGFzcyhyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIEBpZiAoIWlzQ2hpcEZpZWxkKGNvbCkgJiYgIWNvbC5pY29uRmllbGQgJiYgIWlzSW1hZ2VGaWVsZChjb2wpICYmXHJcbiAgICAgICAgICAgICAgIWlzRW1wdHlEYXRhU291cmNlKCkpIHtcclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlciB7e1xyXG4gICAgICAgICAgICAgICAgICBjb2w/LmNlbnRyYWxpemUgJiYgJ2p1c3RpZnktY29udGVudC1jZW50ZXInXHJcbiAgICAgICAgICAgICAgICB9fSB0ZXh0LXhzIHt7IGVsbGlwc2lzVGV4dCgpICYmICdlbGxpcHNpcy10ZXh0JyB9fVwiXHJcbiAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50b29sdGlwICYmIGNvbC50b29sdGlwKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdKVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2JvdHRvbSdcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aF09XCJcclxuICAgICAgICAgICAgICAgICAgZWxsaXBzaXNUZXh0KCkgJiYgcmV0dXJuTWF4V2lkdGgoKShjb2wud2lkdGgpXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEBpZihjb2wudGFnQ29sb3IpIHtcclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWdcIlxyXG4gICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnRvb2x0aXBUYWcgJiZcclxuICAgICAgICAgICAgICAgICAgICBjb2wudG9vbHRpcFRhZyhyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnRhZ0NvbG9yKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdKVxyXG4gICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIH0gQGlmIChjb2wuaWNvbikge1xyXG4gICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cImNvbC5pY29uICsgJyBtci0yJ1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHt7IHRyYW5zZm9ybVZhbHVlKHJvd0RhdGEsIGNvbCkgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgfSBAaWYgKGlzQ2hpcEZpZWxkKGNvbCkgJiYgIWNvbC5pY29uRmllbGQpIHtcclxuICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cInJldHVybkNsYXNzQ2hpcChyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBJY29uKHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQteHNcIlxyXG4gICAgICAgICAgICAgICAgICA+e3sgdHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKSB9fTwvc3BhblxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH0gQGlmKGlzRW1wdHlEYXRhU291cmNlKCkgJiYgdGhpcy5pc0xvYWRpbmdTa2VsZXRvbigpKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgQGlmKCFpc1N3aXRjaEZpZWxkKGNvbCkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGZsZXgge3tcclxuICAgICAgICAgICAgICAgICAgICBjb2wuY2VudHJhbGl6ZSAmJiAnanVzdGlmeS1jb250ZW50LWNlbnRlcidcclxuICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IFtzdHlsZS53aWR0aF09XCJ3aWR0aFJhbmRvbSgpKGNvbCwgcm93SW5kZXgpICsgJyUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gc3R5bGVDbGFzcz1cInctZnVsbFwiPjwvcC1za2VsZXRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxNi44cHgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICcyOC44cHgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnMzBweCdcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXNrZWxldG9uIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIj48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICBAaWYgKGlzSW1hZ2VGaWVsZChjb2wpKSB7XHJcbiAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltYWdlXCIgW3NyY109XCJsb2FkSW1hZ2Uocm93RGF0YSwgY29sKVwiIC8+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIH0gQGlmIChjb2wuaWNvbkZpZWxkKSB7XHJcbiAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgJ21hdGVyaWFsLWljb25zJzogY29sLmluZEljb25NYXRlcmlhbCxcclxuICAgICAgICAgICAgICAgICdtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIG1yLTInOiAhY29sLmluZEljb25NYXRlcmlhbFxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IHJldHVybkNsYXNzSWNvbihyb3dEYXRhLCBjb2wpIH19XHJcbiAgICAgICAgICAgIDwvaT5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNib29sZWFuRmllbGQ+XHJcbiAgICAgICAgICAgICAgQGlmICghY29sLmljb25GaWVsZCAmJiAhaXNTd2l0Y2hGaWVsZChjb2wpKSB7XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlciB7e1xyXG4gICAgICAgICAgICAgICAgICBjb2w/LmNlbnRyYWxpemUgJiYgJ2p1c3RpZnktY29udGVudC1jZW50ZXInXHJcbiAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50b29sdGlwICYmIGNvbC50b29sdGlwKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdKVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2JvdHRvbSdcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHJvd0RhdGFbY29sLmZpZWxkXSA/ICd0ZXh0LWdyZWVuLTUwMCcgOiAndGV4dC1yZWQtNTAwJ1xyXG4gICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICA+PHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgdGV4dC1sZyBmb250LXNlbWlib2xkXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHJvd0RhdGFbY29sLmZpZWxkXSA/IFwiY2hlY2tcIiA6IFwiY2xvc2VcIiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2k+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIH0gQGlmIChpc1N3aXRjaEZpZWxkKGNvbCkpIHtcclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cIlxyXG4gICAgICAgICAgICAgICAgICByZXR1cm5Sb3dDbGFzcyhyb3dEYXRhLCBjb2wpICtcclxuICAgICAgICAgICAgICAgICAgJyBmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJ1xyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAyNXB4XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICBAaWYoY29sLnN3aXRjaERpc2FibGUpe1xyXG4gICAgICAgICAgICAgICAgPGt2LXN3aXRjaFxyXG4gICAgICAgICAgICAgICAgICAob25Td2l0Y2hDaGFuZ2UpPVwib25Td2l0Y2hDaGFuZ2UoJGV2ZW50LCByb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5zd2l0Y2hEaXNhYmxlKHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICBbc3dpdGNoVmFsdWVdPVwidHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L2t2LXN3aXRjaD5cclxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgPGt2LXN3aXRjaFxyXG4gICAgICAgICAgICAgICAgICAob25Td2l0Y2hDaGFuZ2UpPVwib25Td2l0Y2hDaGFuZ2UoJGV2ZW50LCByb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbD8ub25seVJlYWRGaWVsZCA/PyB0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW3N3aXRjaFZhbHVlXT1cInRyYW5zZm9ybVZhbHVlKHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9rdi1zd2l0Y2g+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIH0gQGlmKGlzRW1wdHlEYXRhU291cmNlKCkgJiYgdGhpcy5pc0xvYWRpbmdTa2VsZXRvbigpKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgQGlmKCFpc1N3aXRjaEZpZWxkKGNvbCkpIHtcclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgZmxleCB7e1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbC5jZW50cmFsaXplICYmICdqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJ1xyXG4gICAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoXT1cIndpZHRoUmFuZG9tKCkoY29sLCByb3dJbmRleCkgKyAnJSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cC1za2VsZXRvbiBzdHlsZUNsYXNzPVwidy1mdWxsXCI+PC9wLXNrZWxldG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzE2LjhweCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzI4LjhweCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAnYm9yZGVyLXJhZGl1cyc6ICczMHB4J1xyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gc3R5bGVDbGFzcz1cInctZnVsbFwiPjwvcC1za2VsZXRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgfSBAaWYgKCFyb3dncm91cCAmJiAhY29sLmdyb3VwZWQgJiYgIWNvbC50ZW1wbGF0ZSkge1xyXG4gICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICN0YWJsZUNlbGxcclxuICAgICAgICAgICAgY2xhc3M9XCJyb3dUYWJsZSB7e1xyXG4gICAgICAgICAgICAgIGNvbC5zdHlsZUNsYXNzXHJcbiAgICAgICAgICAgICAgICA/IGNvbC5zdHlsZUNsYXNzKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdKVxyXG4gICAgICAgICAgICAgICAgOiAnJ1xyXG4gICAgICAgICAgICB9fSBcIlxyXG4gICAgICAgICAgICBbcFRvb2x0aXBdPVwicmV0dXJuVG9vbHRpcFJvdyhyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZSB0ZXh0LXhzXCI+e3sgY29sLmhlYWRlciB9fTo8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICBAaWYoIWlzRW1wdHlEYXRhU291cmNlKCkpIHtcclxuXHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNCb29sZWFuRmllbGQocm93RGF0YSwgY29sKTsgZWxzZSBib29sZWFuRmllbGRcIlxyXG4gICAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAgIHJldHVyblJvd0NsYXNzKHJvd0RhdGEsIGNvbCkgK1xyXG4gICAgICAgICAgICAgICAgJyBmbGV4IGZsZXgtcm93IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlciAnICtcclxuICAgICAgICAgICAgICAgIChjb2w/LmNlbnRyYWxpemUgJiYgJ2p1c3RpZnktY29udGVudC1jZW50ZXInKVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIlxyXG4gICAgICAgICAgICAgICAgY29sLnRvb2x0aXAgJiYgY29sLnRvb2x0aXAocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0pXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIidib3R0b20nXCJcclxuICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoXT1cImVsbGlwc2lzVGV4dCgpICYmIHJldHVybk1heFdpZHRoKCkoY29sLndpZHRoKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICBAaWYoY29sLnRhZ0NvbG9yKSB7XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWdcIlxyXG4gICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIlxyXG4gICAgICAgICAgICAgICAgICBjb2wudG9vbHRpcFRhZyAmJlxyXG4gICAgICAgICAgICAgICAgICBjb2wudG9vbHRpcFRhZyhyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJcclxuICAgICAgICAgICAgICAgICAgY29sLnRhZ0NvbG9yKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdKVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIH0gQGlmICghaXNDaGlwRmllbGQoY29sKSAmJiAhY29sLmljb25GaWVsZCAmJiAhaXNJbWFnZUZpZWxkKGNvbCkpe1xyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC14cyB7eyBlbGxpcHNpc1RleHQoKSAmJiAnZWxsaXBzaXMtdGV4dCcgfX1cIj5cclxuICAgICAgICAgICAgICAgIEBpZiAoY29sLmljb24pIHtcclxuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJjb2wuaWNvbiArICcgbXItMidcIj48L2k+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB7eyB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIH0gQGlmIChpc0NoaXBGaWVsZChjb2wpICYmICFjb2wuaWNvbkZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyZXR1cm5DbGFzc0NoaXAocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhzXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAge3sgdHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKSB9fTwvc3BhblxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICB9IEBpZiAoaXNJbWFnZUZpZWxkKGNvbCkpIHtcclxuICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1hZ2VcIiBbc3JjXT1cImxvYWRJbWFnZShyb3dEYXRhLCBjb2wpXCIgLz5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgfSBAaWYgKGNvbC5pY29uRmllbGQpIHtcclxuICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAnbWF0ZXJpYWwtaWNvbnMnOiBjb2wuaW5kSWNvbk1hdGVyaWFsLFxyXG4gICAgICAgICAgICAgICAgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgbXItMic6ICFjb2wuaW5kSWNvbk1hdGVyaWFsXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBJY29uKHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgcmV0dXJuQ2xhc3NJY29uKHJvd0RhdGEsIGNvbCkgfX1cclxuICAgICAgICAgICAgPC9pPlxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Jvb2xlYW5GaWVsZD5cclxuICAgICAgICAgICAgICBAaWYgKCFjb2wuaWNvbkZpZWxkICYmICFpc1N3aXRjaEZpZWxkKGNvbCkpIHtcclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTIgYWxpZ24taXRlbXMtY2VudGVyIHt7XHJcbiAgICAgICAgICAgICAgICAgIGNvbD8uY2VudHJhbGl6ZSAmJiAnanVzdGlmeS1jb250ZW50LWNlbnRlcidcclxuICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJcclxuICAgICAgICAgICAgICAgICAgY29sLnRvb2x0aXAgJiYgY29sLnRvb2x0aXAocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0pXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCInYm90dG9tJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YVtjb2wuZmllbGRdID8gJ3RleHQtZ3JlZW4tNTAwJyA6ICd0ZXh0LXJlZC01MDAnXHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID48c3BhblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB0ZXh0LWxnIGZvbnQtc2VtaWJvbGRcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgcm93RGF0YVtjb2wuZmllbGRdID8gXCJjaGVja1wiIDogXCJjbG9zZVwiIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvaT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9IEBpZiAoaXNTd2l0Y2hGaWVsZChjb2wpKSB7XHJcblxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHJldHVyblJvd0NsYXNzKHJvd0RhdGEsIGNvbCkgK1xyXG4gICAgICAgICAgICAgICAgICAnIGZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXInXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDI1cHhcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEBpZihjb2wuc3dpdGNoRGlzYWJsZSl7XHJcbiAgICAgICAgICAgICAgICA8a3Ytc3dpdGNoXHJcbiAgICAgICAgICAgICAgICAgIChvblN3aXRjaENoYW5nZSk9XCJvblN3aXRjaENoYW5nZSgkZXZlbnQsIHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sLnN3aXRjaERpc2FibGUocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzd2l0Y2hWYWx1ZV09XCJ0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwva3Ytc3dpdGNoPlxyXG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICA8a3Ytc3dpdGNoXHJcbiAgICAgICAgICAgICAgICAgIChvblN3aXRjaENoYW5nZSk9XCJvblN3aXRjaENoYW5nZSgkZXZlbnQsIHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sPy5vbmx5UmVhZEZpZWxkID8/IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbc3dpdGNoVmFsdWVdPVwidHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L2t2LXN3aXRjaD5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgQGlmKGlzRW1wdHlEYXRhU291cmNlKCkgJiYgdGhpcy5pc0xvYWRpbmdTa2VsZXRvbigpKSB7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cclxuICAgICAgICAgICAgICBAaWYoIWlzU3dpdGNoRmllbGQoY29sKSkge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGZsZXgge3tcclxuICAgICAgICAgICAgICAgICAgY29sLmNlbnRyYWxpemUgJiYgJ2p1c3RpZnktY29udGVudC1jZW50ZXInXHJcbiAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGhdPVwid2lkdGhSYW5kb20oKShjb2wsIHJvd0luZGV4KSArICclJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8cC1za2VsZXRvbiBzdHlsZUNsYXNzPVwidy1mdWxsXCI+PC9wLXNrZWxldG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxNi44cHgnLFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMjguOHB4JyxcclxuICAgICAgICAgICAgICAgICAgICAnYm9yZGVyLXJhZGl1cyc6ICczMHB4J1xyXG4gICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gc3R5bGVDbGFzcz1cInctZnVsbFwiPjwvcC1za2VsZXRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICB9IEBpZiAoY29sLnRlbXBsYXRlKSB7XHJcbiAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgY2xhc3M9XCJyb3dUYWJsZSB7e1xyXG4gICAgICAgICAgICAgIGNvbC5zdHlsZUNsYXNzXHJcbiAgICAgICAgICAgICAgICA/IGNvbC5zdHlsZUNsYXNzKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdKVxyXG4gICAgICAgICAgICAgICAgOiAnJ1xyXG4gICAgICAgICAgICB9fSBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlIHRleHQteHNcIj57eyBjb2wuaGVhZGVyIH19Ojwvc3Bhbj5cclxuICAgICAgICAgICAgQGlmIChnZXRDdXN0b21UZW1wbGF0ZShjb2wudGVtcGxhdGUubmFtZSkpIHtcclxuXHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTIgYWxpZ24taXRlbXMtY2VudGVyIHt7XHJcbiAgICAgICAgICAgICAgICBjb2w/LmNlbnRyYWxpemUgJiYgJyBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJ1xyXG4gICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICBjb2wudG9vbHRpcCAmJiBjb2wudG9vbHRpcChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2JvdHRvbSdcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgQGlmKGNvbC50YWdDb2xvcikge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnXCJcclxuICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJjb2wudG9vbHRpcFRhZyAmJiBjb2wudG9vbHRpcFRhZyhyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImNvbC50YWdDb2xvcihyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgfSBAaWYoIWlzRW1wdHlEYXRhU291cmNlKCkpIHtcclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRDdXN0b21UZW1wbGF0ZShjb2wudGVtcGxhdGUubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvd0RhdGEgfVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICBAaWYoaXNFbXB0eURhdGFTb3VyY2UoKSAmJiB0aGlzLmlzTG9hZGluZ1NrZWxldG9uKCkpIHtcclxuICAgICAgICAgICAgPHAtc2tlbGV0b25cclxuICAgICAgICAgICAgICBbd2lkdGhdPVwid2lkdGhSYW5kb20oKShjb2wsIHJvd0luZGV4KSArICclJ1wiXHJcbiAgICAgICAgICAgID48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgICAgIH0gfVxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICB9IEBpZiAoY29uZmlnLmFjdGlvbnMgJiYgY29uZmlnLmFjdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIDx0ZD5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGN1cnNvci1wb2ludGVyIGljb24tbW9yZVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm1lbnUudG9nZ2xlKCRldmVudCk7IGFjdGl2ZUl0ZW0ocm93RGF0YSlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPCEtLSBtb3JlX3ZlcnQgLS0+XHJcbiAgICAgICAgICAgICAgbW9yZV9ob3JpelxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICA8cC10aWVyZWRNZW51XHJcbiAgICAgICAgICAgICAgI21lbnVcclxuICAgICAgICAgICAgICBbcG9wdXBdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW21vZGVsXT1cInRhYmxlQWN0aW9uc1tyb3dJbmRleCAtIGFjdGlvbnNPZmZzZXRdXCJcclxuICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIml0ZW0udG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3AtdGllcmVkTWVudT5cclxuICAgICAgICAgICAgPCEtLSA8c3BhbiBwVG9vbHRpcD1cInt7IHRhYmxlQWN0aW9uc1tyb3dJbmRleCAtIGFjdGlvbnNPZmZzZXRdWzBdPy50b29sdGlwIH19XCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+YTwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIH1cclxuICAgICAgPC90cj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiIGxldC1jb2x1bW5zPlxyXG4gICAgICA8dHI+XHJcbiAgICAgICAgPHRkXHJcbiAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoICsgMlwiXHJcbiAgICAgICAgICBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgYm9yZGVyLXJhZGl1czogMTBweCAhaW1wb3J0YW50XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtbWVkaXVtIG0tMCB0ZXh0LXhzXCI+TmVuaHVtIHJlZ2lzdHJvIGVuY29udHJhZG88L3A+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9wLXRhYmxlPlxyXG4gIH1cclxuPC9kaXY+XHJcblxyXG48bGlua1xyXG4gIHJlbD1cInN0eWxlc2hlZXRcIlxyXG4gIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zXCJcclxuLz5cclxuXHJcbjxsaW5rXHJcbiAgcmVsPVwic3R5bGVzaGVldFwiXHJcbiAgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpvcHN6LHdnaHQsRklMTCxHUkFEQDQ4LDQwMCwwLDBcIlxyXG4vPlxyXG4iXX0=
680
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtdGFibGUva3YtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtdGFibGUva3YtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxlQUFlLEVBR2YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUlOLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsS0FBSyxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUd0RCxPQUFPLEVBQ0wsWUFBWSxFQUVaLGFBQWEsR0FDZCxNQUFNLHdDQUF3QyxDQUFDO0FBS2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXJGLE1BQU0sVUFBVSxHQUNkLDBxUEFBMHFQLENBQUM7QUFPN3FQLE1BQU0sT0FBTyxnQkFBZ0I7SUFrRDNCLElBQXFCLFNBQVMsQ0FBQyxLQUFrQjtRQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUNuQixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJO1lBQ3hDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLEtBQUs7WUFDekMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSTtZQUN4QyxHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMs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RyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFLRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUVxQixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0EsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUNDLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkF3SnZCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBcVh6QyxXQUFXO3NCQURWLFlBQVk7dUJBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUW5ELFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlLCBEZWNpbWFsUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBEb0NoZWNrLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIGNvbXB1dGVkLFxyXG4gIGVmZmVjdCxcclxuICBpbnB1dCxcclxuICBtb2RlbCxcclxuICBzaWduYWwsXHJcbiAgdmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFRhYmxlLCBUYWJsZVBhZ2VFdmVudCB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5cclxuaW1wb3J0IHsgQ3BmQ25walBpcGUgfSBmcm9tICcuLi8uLi9hcGkvcGlwZXMvY3BmY25wai5waXBlJztcclxuaW1wb3J0IHtcclxuICBnZXRPckV4ZWN1dGUsXHJcbiAgVmFsdWVPckZuLFxyXG4gIG1hcFRvTWVudUl0ZW0sXHJcbn0gZnJvbSAnLi4vLi4vYXBpL2NvbXBvbmVudHMvdGFibGUva3YtbWVudWl0ZW0nO1xyXG5pbXBvcnQgeyBUYWJsZUNvbmZpZyB9IGZyb20gJy4uLy4uL2FwaS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbmZpZyc7XHJcbmltcG9ydCB7IFRhYmxlQ29uZmlnQ29sdW1uIH0gZnJvbSAnLi4vLi4vYXBpL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29uZmlnLmNvbHVtbic7XHJcbmltcG9ydCB7IFRhYmxlUGFnaW5hdGUgfSBmcm9tICcuLi8uLi9hcGkvY29tcG9uZW50cy90YWJsZS90YWJsZS5wYWdpbmF0ZSc7XHJcbmltcG9ydCB7IFRlbGVmb25lUGlwZSB9IGZyb20gJy4uLy4uL2FwaS9waXBlcy90ZWxlZm9uZS5waXBlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9hcGkvZGlyZWN0aXZlcy90ZW1wbGF0ZS90ZW1wbGF0ZS5kaXJlY3RpdmUnO1xyXG5cclxuY29uc3QgaW1nRGVmYXVsdCA9XHJcbiAgJy85ai80QUFRU2taSlJnQUJBUUlBZGdCMkFBRC80UUJpUlhocFpnQUFUVTBBS2dBQUFBZ0FCUUVTQUFNQUFBQUJBQUVBQUFFYUFBVUFBQUFCQUFBQVNnRWJBQVVBQUFBQkFBQUFVZ0VvQUFNQUFBQUJBQU1BQUFJVEFBTUFBQUFCQUFFQUFBQUFBQUFBQUFCMkFBQUFBUUFBQUhZQUFBQUIvOXNBUXdBREFnSUNBZ0lEQWdJQ0F3TURBd1FHQkFRRUJBUUlCZ1lGQmdrSUNnb0pDQWtKQ2d3UERBb0xEZ3NKQ1EwUkRRNFBFQkFSRUFvTUVoTVNFQk1QRUJBUS85c0FRd0VEQXdNRUF3UUlCQVFJRUFzSkN4QVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRLzhBQUVRZ0FrQUNRQXdFUkFBSVJBUU1SQWYvRUFCMEFBUUFCQkFNQkFBQUFBQUFBQUFBQUFBQUdBUUlIQ0FNRUNRWC94QUJCRUFBQ0FRUUFCUUlDQ0FRREJBc0FBQUFCQWdNQUJBVVJCZ2NTSVRFVFFRaFJDUlFWR1NKVmxkRXlZWUdSUWxKaUZpTTNPRk5qY1hOMWRwS1RzYk8wLzhRQUdnRUJBQUlEQVFBQUFBQUFBQUFBQUFBQUFBRUZBd1FHQXYvRUFESVJBQUlBQkFNRkNBRUZBUUVCQUFBQUFBQUJBZ01FRVNFeFVRVVNRWkh3RXhVeVlYR0JvYkhSSWpOQ3dlRTA4U1AvMmdBTUF3RUFBaEVERVFBL0FQS3FnRkFLQVVCZERETGNTcEJCRThrc2pCRVJGSlptSjBBQVBKSnFVbkU3SWh0UXE3eUo1dzl5ZHoyVmkrczVlNFhGUk11MFYwOVNVNzBSdEFSMGpSUGs5UUkwVjk2czVHeXBreFhtUGQrWC9uMzVGYk8ycEtsNFFmcWZ4eko5ak9VL0JtTzZXa3NaYjZSSkJJcjNVcE90YTBwVmVsU08zZ2c3MmQ3SGFyT1hzMm5nelYvWHBJcTQ5cFZNZkczb3Z6ZGttc01UaXNYMS9abU10TFAxZGRmb1FMSDFhM3JmU0J2V3ovZXR1Q1hCTHZ1SksrbUJweHpJNWx0OXQyMXhPM1dROENnT3BmNG5GWlRvKzA4WmFYbnBiNlByRUN5ZE85YjExQTYzb2YyckhITGdtZU5KK3FQY0V5T1hmY2JWOU1DTTVQbFB3WmtlcG83R1d4a2VReU05cktSdmU5cUZicVVMMzhBRFdoclE3VnFUTm0wOGVTdDZQLzFHNUJ0S29nNDM5VitMTWdQRVBKM1BZcUw2emlMaGNyR3E3ZEVUMDVSclpPa0pQVU5BZUQxRW5RWDNxc243S21TMXZTM3ZmRC8zNzhpMGs3VWxUSHV4cmRmeHovd2djME0xdk05dmNSUEZMRXhSMGRTckt3T2lDRDRJUHRWWTA0WFpsa21vbGRaRnRRU0tBVUFvQlFDZ0ZBU2pnL2w5bWVMWlJLRmV5c09rc2J1U0lsVzdrYVFkdXM3QkIwZERSMmQ2QjNhV2htVk9PVU92NDFOS3NyWWFWWVl4YWRYL0FOK1Ztemg3aEhBY01SQk1UWUlrcFhwZTRmOEFGSy9ZYjJ4OWowZzlJMHUvWVYwTWltbFU2dEFzZGVKenMycG16LzNJci9YU3kxMVo5bXM1Z0toVFVrWEs2RkJjYUZDTGpRb0xqUW9UY29WTkJjcFVFbnh1SWVFY0J4UkNVeTFnalNoZWxMaFB3eXAyT3RNTzVBNmllazdYZnRXQ2ZTeXFoZnJXT3ZFenlhaWJJZjhBODRyZVhEcDVYejBaaFBqSGwvbCtFWmZVSWE4c0NvSXU0NHlGVTdBMDQ3OUIyUnJaMGRqUjNzRG5hcWltVXJ1OFZyK2REb0tTdmwxS3RGYUdLK1Y4ODhzcjRLNzArU0wxcG0rS0FVQW9CUUU1NWRjdTVlSnBseXVXUjQ4VEczWWJLdGNzRDNWVDdLRDJMZjBIZlpXeW9hRjFEMzQvRDk5Y2VyVnRkWEtuWFp5L0Y5ZjdwMWZPTU1NVnZFbHZieEpIRkdvUkVSUUZWUU5BQUR3QVBhdWlTVUtzc2puVzNFN3Q0bklCODY5SGhzclFnclVBVUFvQlFDZ0ZBVXFRVUlvVGM0NW9ZcDRuZ25pU1NPUlNqbzZobFpTTkVFSHNRUjdWRFNpVm5rZWszQzdwNG1EZVluTHVYaGlWc3Jpa2VURlNOM0hjdGJNVDJWajdxVDRiK2g3NkxjNVhVTHAzMmt2dy9YK2VmVDZPaHJsVUxzNW5pKy85MTZ0QjZyU3lGQUtBbEhML0FJT2w0dXkrcENxMkZteVNYWkpPMlVudEdORUhiYUkzN0FFK2RBN2xGU3VxbVdlU3ovSHVhRmZWcW1sN3F2dlJYdDVlZVRXRjhubnBhNXNGREZGQkVrRUVTUnh4cUVSRVVCVlVEUUFBOEFEMnJxVWtsWkhNdHQ0czVRS2s4dGxhZ2dVQW9DZmNwdVJQTkxuYmtueC9MdmhhNHlFY0RCYm05Y2lLMXR0LzlKSzJsQjEzNlJ0aVBBTllaMVJMcDFlWXpQSXBwdFE3UzBiUDRUNkxianU0dEZrNGg1cVlLd3VTTm1LenNacnBBZmwxc1kvL0FJcXVpMnZBbittRmxsRHNlTnI5VVNJcnpCK2piNTI4SzJjdVI0U3llRzR0aWlCWTI5czdXMTJRUGNSeWZnUC9BR0NUWjlnYXlTdHF5WTNhSzZNVTNaTTZCWGdhWnF2bHNUbGNEa3JuRFp2RzNXUHY3T1F4WEZyZFJORkxFNDhxeU1BVlA4alZrbW9sZFpGWkZDNFhhTE02bFNRS0FVQmFSVTVrcG5ITkRGY1JQYjNFU1NSU0tVZEhVTXJLUm9nZytRYWhwTk5NOXd4T0Y3eXpOZmVZSEIwdkNPWUlqNlRZWGpQSmFFSHVxZ2phSFpKMnV3Tis0MGZPd09XcmFWMHN6RHd2TDhleDB0QlZxcGw3cjhVS1YvUHp5U3h0a3N1UkY2MHpmTG9ZWmJpVklJSW5rbGtZSWlJcExNeE9nQUI1Sk5TazRuWkVOcUZYZVJzcHduZ0l1R2VIN1REb0l6SkVuVk82QWY3eVZ1N0hZQUxEZllFamZTRkh0WFcwMGhVOHBTMTcrdlh3Y2hVVGUybXhUTWNYcS9UVjJ5eFN3dmQ1dG4yQUsyREF5Nm9JRkFLQXlwOE5YSXpKZkVCelFzdUM0SlpMWEZ3SWIzTDNpQWJndEVJRGRPKzNXeEtvdm51MnlDQWExNnFvVk5MY2ZIZ2JOSlRPcG1xRGh4UFluZ3pndmhmbDd3MVk4SWNIWWEzeG1KeDhZamd0NFYwQjgyWStXWW51V095U1NTU2E1V1pNaW14T0tOM1oxa3VYREtoVUVDc2o3ZGVEMktBMXkrTVQ0VzhOeno0TnV1SStIOGRGRHh6aHJkcGJDNGpVSzEvR2cyYldRLzR0amZRVC9DMnU0QmJlL1ExanA0OTJMd3Y0OHpRcnFOVk1HOUN2MUw1OGp5VmRIamRvNUZLc3BJWlNORUg1R3VtT1dLVUFvQlFGcEh2VWtvK054ZHc5RHhSZ0xyRXlCUks2OWR1N2FIUktQNFR2UjBOOWpvYjZTUjcxcjFVaFZFcHkzN2Vwc1UwM3NKc016VDYvdjM0MlpyWk5ETmJ6UGIzRVR4U3hNVWRIVXF5c0RvZ2crQ0Q3VnlUVGhkbWRjbW9sZFpFODVPOFBSWlhQeTVhNUN0RmlsVjFRNk81WDJFT2lEMkFWanZZSVlLYXN0bHlWTW03Ny9qOTlmSldiVXFITGxxV3Y1Y2ZKVysvcTVtK3VqT2RMcUhrclVBVUFvRDBpK2k3NFZzN1RscnhkeHI2Uy9XOGxtMXhwY2p1SXJlQkpBQjhnV3VXL3NQbFZEdGVOdVpEQm9yOWNqb05qd0pTNG85WDlmK202MVZCY0NnRkFLQThZL2kyNFZ0T0RQaVA0OHdWaEVzVnY5cC9Ya1JSb0lMbU5ManBBOWdQVzBCOHE2eWlqY3lSREU5UHJBNUd1Z1V1b2poV3YzaVlqclpOVVVBb0NsU0Myb1BSaERuRnc5RmlzL0ZsN2JvV1BLcXpzZzdhbFRRYzZBQTBReW5leVN4WW4ycm50cVNGTG1LWXY1ZmEvUDNjNlBaYzV6Slc0ODRmcmgvWlB1VStNK3p1RExhUmtsU1Mra2t1bldRYTFzOUtsUnIrRW9pa2VkNzM0SXF6MmJMM0tkUFc3NjlrVmUwbzkrb2ZsWmYzOXNtUUZiNW9NdXFEeUtBVUFvRDBiK2k2NHhzN25nUGpEZ0ZwVkYzajhzbVdWQ2U3UlR3cEVTUG1BMXVOL0xySHpxaDJ2TGFqaGo4ckhRYkhtSndSUWFPNXU3VlFYQW9CUUNnUEZ6NHFPTWJQano0aHVPdUpjZktzdHJKbEd0SUpGTzFranQwVzNWd2ZrUkVDUDVHdXNvNWJseUlZWHA5NG5JMXN4VEtpS0phL1dCaXF0azFSUUNnRkFXa1ZKS0lkell4bjJqd1hjeUtrenlXVWtkMGl4OS9CNldMRFI3QkhjKzJ0YjNvR3EvYVV0ektkMjRZOWN5dzJkTVV1b1YrT0hYdWtTWEVXSDJWaXJMR2VyNnYxTzNqZzYrbnA2dWhRdTliT3Q2OGJyY2x3ZG5Bb05GWTA1a2ZhUnVQVjM1bmRIaXNoalpXb0lGQUtBVUJrYmtCem96ZklYbVpqdVBjUkdiaUNNRzJ5Vm4xZEl1N055UFVqMzdIc3JLZlprVW5ZMkRncVpDcVpiZ1pzVTFSRlRURkdqMko1YmN6T0MrYlhDbHJ4bHdMbW9jampycFJ2cElFa0VtdG1LVlBLT045MVA4aU5nZ25sWnNxT1RGdVJyRTZ5Vk9nbnc3OER1aVUxak1nb0RWajQwdml6dzNLUGhlKzVlOEY1U080NDR5MEJnUG9QdjdKaGNhTXprZnd5bFQrQmZJSkRuc0FHc3FDaWM2SlRJMStsZkpXMTlhcEVMZ2dmNm44SGxkNXJvem1SUUNnRkFLQW8zaXBKUjBzdFlESzRxOHhabTlJWGx2SkI2blQxZEhXcFhldGpldCtOMWptUWRwQTROVTF6TWt1UHM0MUdsZXp1ZHVzaDRSY1BGRHl5dFFCUUNnRkFLQWxQTHptanpCNVVaci9hRGw1eFZmWVM5SUN5R0J3WTVsQjJGa2pZRkpGMzdNQ0t4elpNRTVic3hYTXNxZE1rUGVsdXhzbmhQcE51ZWVQdEZ0c3Z3MXdqbFpFR3ZyRDJzOE1qSDVzRWxDZjJVVlh4YkprdDROb3NJZHJ6a3NVbVJUbUQ5SUQ4UlBIVm5MamJMTTQ3aGExbUJWeGc3Wm9wbVgvdnBHZVJUL05DcHJMTDJiSWx1N1YvVXhUZHAxRXhXVHQ2R3VWemMzRjVjUzNkM1BKUFBNNWtrbGtZczdzVHNzeFBja24zTmI2VnNFVjdiZUxPT2dGQUtBVUFvQ2g4VklSYlE5Q2dSY1BGRHl5dFFCUUNnRkFTZmcvbGZ6SDVneWVud1B3TG5jNE9ycFo3R3drbGpRLzZuVWRLLzFJckhIT2x5dkhFa1pKY21aTjhFTFptREEvQUo4VCtiUlpadUJyWEZSdjNEWCtVdDFPdjVxanN3L3FCV3JGdEtuaC9sZjJOdUhabFRGL0czdVN1SDZNLzRoSlVEU1pmZ3VFLzVYeVU1SS84QVRBUldQdldSbyt2Y3lyWk0vVmRleDFiL0FPamIrSTJ6UXRidHdyZkVEK0czeWpnbi93QnlOUlVyYXNoNjhpSHNtb1duTXg5eFI4RzN4TDhKSTgyUjVUNVc2aVFiNjhZOFYvc2ZNTEF6dC9jVm5ncnFlUEtMK3Zzd1IwRlJCbkR5eCtqRU9UeGVUd3Q3SmpzeGpycXh1NFRxU0M1aGFLUkQvTldBSXJaVFVTdWpVY0xoZG1kYXBJRkFLQVVCUStLa0l0b2VqcVltL3dEdFRGV1dUOUwwdnJsdkhQMGRYVjA5YWh0YjBONjM1MVdPWEgya0NqMVNaN21RZG5HNEwzczdjanVqeFdReHNyVUVDZ01qOGtPUVBNUG43eEljRHdSamxGdmJkTFgrU3VkcmEyU0h3WFlBN1k2T2tVRmpvOXRBa1lLaXBsMDBPOUdiRlBUVEttTGRnNW5vOXliK0F2a2p5d2dndnVJc1d2R21jUUF2ZDVhSU5iSzMvVjJ1eWdIaitQcmI1RWVLb1orMFowN0NGN3E4dnlkQkkyYkprNHhMZWZuK0RZNjJ0YmF5dDQ3U3p0NG9JSWxDUnhSSUZSRkhnQURzQldnMjNpeXdTdGdqbHFBS0FVQW9DT2NhOHVPQXVZK09PSzQ3NFF4V2N0dEVLdDdiTEkwZS9kSEk2a1A4MUlOWkpjMk9VN3dPeGptU29KcXRHcm1rL1A3Nk51M2p0TG5pYmtIZlRlckdHa2ZoNi9tNnVzZkszbmJ2djVMSVR2OEF6anNEYjAyMWNkMmZ6L0pUMU95VmJla2N2d2FGWkhIWkRENUM1eFdXc3A3TzlzNVdndUxlZU1wSkZJcDB5TXA3Z2dnZ2cxZEpxSlhSU05PRjJlWjE2RUNnS0h4VWtvNldXdnhpc1ZlWlF3K3FMTzNrbjlQcTZldm9VdHJlanJldk9xeHpJK3pnY2VpYjVHU1hBNWthZ1R0ZDI1a2E1VDVNWkhndTFqWjVua3NaSkxWMmtPL0I2bENuWi9DRWRBUEd0YThBVnA3Tm1PWlRwUGhoMXpOemFNdnM2aDI0NDllNlpNUWFzQ3ZaZFVFSFp4bU91OHZrclRFMkVmcVhON1BIYndwdlhWSTdCVkg5eUtodFFxN0pTY1RzajIyNUw4cGVIT1NuTHZGY0JjT1c4WVd6aURYbHlGMDk1ZEVEMVozUGtsajQzNFVLbzdBVnlOUk9pcUpqamlPeHA1RU5QTFVFSk9hd21ZVUFvQlFDZ0ZBS0FVQm9WOUpmeVZ3OFdNeFhQSEMya2NGKzEwbUp6UHBycjZ3ckl4Z21iL1V2UVVKOGtNZzhMVjFzcW9kM0pmcWlrMnZUcXluTFBKbm41VjJVUW9DMG1wSlJEdWJHVCt6dUM3cU5YbVNTOWtqdFVhTTYxczlUQmpzZmhLSTQ5OTcxclJOViswcGpsMDd0eHc2NUcvczZXcGxRcjhNZXZkb2dISjNpQ0xGWitYRTNKVllzcXFvcm5RMU1teWcyU094RE1QQkpZcUtyTmx6MUxtN2p5aSsrQlo3VmtPWkxVeUgrUER5ZnR3NVd2NUdiNjZJNTR1cVR5U3psTC94VjRNLzh3WTcvQVBUSFdLZCsxRjZNeXlQM1lmVkh1YlhISFppZ0ZBS0FVQW9CUUNnRkFheS9TSi84cytTLzhWc1Avc3F3MlovMEwwWlhiVS81bjZvOG9hNlU1Z29lMVNDMm9QUmhEbkZ4RERsYzlGaWJib2FQRkt5TTQ3a3l2b3VOZ2thSFNvOEFodW9IMnJudHF6MU1tS1hEL0g3ZjQrN25SN0xrdVhLY2NXY1gxdy9zZ2NNMHR2S2s4RXJ4eXhzSFIwWWhsWUhZSUk4RUdxeE53dTZMSnBSS3p5TmxPRXMvSHhOdy9aNWRUR0pKVTZaMFVqOEVxOW1HZ1NWNzl3RDM2U3A5NjYybW5xb2xLTmUvcjE4SElWRXZzWjBVclQxeXpYREgxV0Y3ck5NK3dEN1ZzR0JuZndlWXZlSHMxajgvaldSYnZHWFVWNWJsMTZsRWtiaDFKSHVOZ2RxOHhRcUpPRjhSREU0V29sd05qdnZGUGlYL0FEbkJmcE1mNzFvZDJVK2o1bGgzclVhcmtQdkZQaVgvQURuQmZwTWY3MDdzcDlIekhldFJxdVErOFUrSmY4NXdYNlRIKzlPN0tmUjh4M3JVYXJrUHZGUGlYL09jRitreC92VHV5bjBmTWQ2MUdxNUQ3eFQ0bC96bkJmcE1mNzA3c3A5SHpIZXRScXVRKzhVK0pmOEFPY0Yra3gvdlR1eW4wZk1kNjFHcTVEN3hUNGwvem5CZnBNZjcwN3NwOUh6SGV0UnF1USs4VStKZjg1d1g2VEgrOU83S2ZSOHgzclVhcmtQdkZQaVgvT2NGK2t4L3ZUdXluMGZNZDYxR3E1RVA1cWZHQnpwNXljSVRjRDhiNUhGell1ZWFLNGRiZkhwRS9YR2RyK0lkL05aWk5ESmtSYjhHWmluVjA2b2czSThqQ2xiWnBscFB0VWtwSHhlTHVJWXVGOEJkWlp5aGxSZWkzUnY4Y3A3S05iR3g3blIzMGcxcjFNOVU4cHpIN2V2WHdiRlBLN2ViREwxK3Y2OThMMk5iWnBwYmlWNTU1WGtsa1l1N3V4TE14T3lTVDVKTmNrMjRuZDVuWEpLRldSYlVFa281ZjhZeThJNWNHVHBOaGVNa2QyQ0R0VkJPcEJvRTdYWk92Y0Vqem9qY29xcDBzekh3dlA4QVBzYUZmU0twbDd5dnZRM3Q1K1dPR05zK0d0cm13VU0wVnhFbHhieXBKRklvZEhSZ3lzcEd3UVI1QnJxVTdxNk9aYWF3WnlBMU9aNWFMcWdnVUFvQlFDZ0ZBS0FVQW9CUUZwTlRrU2tjYzAwVnZFOXhjU3BIRkdwZDNkZ3Fxb0d5U1Q0QXFHMGsyejNEQzRudXJNMTk1Z2NZeThYWmdtUHBGaFpzOGRvQU83S1NOeUhZQjIzU0RyMkdoNTJUeTFiVk9xbVhXU3kvSjB0QlNLbWw3ejhVU1YvTHl6YXd2bXMrUkY2MHpmRkFLQW5ITHZtSkx3eEt1S3lydkppcEc3SHV6V3pFOTJVZTZrK1YvcU8rdzFsUTF6cDMyY3p3L1grZVhUcmE2aFZRdCtYNHZ2cmgxYk9VTTBWeEVrOEVxU1JTS0hSMFlGV1VqWUlJOGdpdWpUVFYwem5HbW5abzVBZm5VbmxvclVFRmFBVUFvQlFDZ0ZBVTNxcEJRbjVVSlNPT2FhSzNpZTR1SlVqaWpVdTd1d0Nxb0d5U1Q0QUZRMmxpejBsZDJSZzNtSnpFbDRtbGJGWXAzanhVYmR6M0RYTEE5bVlleWoyWCtwNzZDODVYVnpxSHVRZUg3NjY4dWpvYUZVNjdTUHhmWFhYbkI2clN5RkFLQVVBb0NVOEg4dzgxd25Jc0pkNzdIaENnczVaU0ZUdVczR2UvUWVwaVRvYU96c2IwUnVVdGJNcG5iT0hUOGFGZlZiT2wxRjRvTFF4TjNidG5rc2NyNEt5ZkN5NFlHYmNCeFpnT0pvZzJJeU1jc2dRTzhEZmhsajdLVHRUM0lCWUFzTnJ2d1RYUlNhbVZVSzh0KzNIcjRPZm0wODZUKzVEYkYvZmxmUE5YeHRtazhENjlaekNWREdwSXNWNmhRV0d4ODZFV0d4ODZDdzZoUW14UXNhQ3hTb0pQa1ovaTNoL2htTXRsOGpIRklVTHBBdjRwWk96RWFVZHhzcVFHT2wzNUlyQlBxWlZPcnpIN2Nldmd6U3FlYlA4QTI0YjRwY01PZHNzM3h0a204RENQR1BNREw4WFMrbVMxbllCUUJhUnlrcXgyRHR6MjZ6c0RXeG9hR2h2WlBPMVZiTXFuWjRMVDg2blJVdEJMcGtuRmFLTFczcmxuYkIyZXZ3UmV0TTNoUUNnRkFLQVVBb0M2R2FXM2xTZUNWNDVZMkRvNk1ReXNEc0VFZUNEVXB1RjNSRFNpVm5rVHpoN25GbjhWRUxiTFFKbFlsWFNNNytuS093QTI0QjZoMlBrRmlUc21yS1R0U2JMVm8xdkw1NitmTXE1K3lwY3gzbHZkMTRyankrcksxaWY0em14d1hrZWxaTDZXeWtlVDAxUzZoSzc4YVlzdlVxanY1TERXanZRNzFaeTlwVTh4MnZiMTZaV3pOblZFdFh0ZjA2VCtDUzJHV3hXVkVoeGVTdGJ3UmE5VDBKbGs2TjcxdnBKMXZSL3NhM0lKa0V6d05QMGR6VGpseHk3S05OWDFPM1dROENnT3BmNWZFNHJvKzA4bmFXZnE3S2V2TXNmVnJ6cnFJMzVIOTZ4eHpJSmZqYVhxekpCTGptZUJOK2lJMWsrYS9CZU42bFMvbHZaRWxNYkpheEZ2RzlzR2JwUmw3ZVF4M3NhMk85YWN6YVZQTGRyMzlPbDhHMUwyZFVURmUxdlhwdGNpQWNRYzRzL2xZamJZbUJNVkV5NmRrZjFKVHNFSFRrQUtPNDhEcUJHdzFWay9hazJaaEIrbGZQTXRKR3lwY3Q3MHg3Mm5CY09mSHl4eTRrRG1tbXVKbnVMaVY1WlpXTHU3c1dabUoyU1NlNUpQdlZhMjRuZGxta29WWlpGdFFTS0FVQW9ELzlrPSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2t2LXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4va3YtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2t2LXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBLdlRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrLCBBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlQ29uZmlnID0gc2lnbmFsPFRhYmxlQ29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xyXG5cclxuICBnbG9iYWxGaWx0ZXJGaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHNlbGVjdGVkU2l6ZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIHdpZHRoUGFnZSA9IHNpZ25hbDxudW1iZXI+KDApO1xyXG5cclxuICBjaGVja2VkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgY29sdW1uczogVGFibGVDb25maWdDb2x1bW5bXSA9IFtdO1xyXG4gIGRlbGV0ZWRDb2x1bnM6IFRhYmxlQ29uZmlnQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBwcmVwb3NpdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oW1xyXG4gICAgJ2RlJywgJ2RhJywgJ2RvJywgJ2VtJywgJ25vJywgJ25hJywgJ3BhcmEnLCAncG9yJywgJ2NvbScsICdhJywgJ28nLCAnZSdcclxuICBdKTtcclxuXHJcbiAgcHJpdmF0ZSByb21hbk51bWVyYWxzID0gbmV3IFNldDxzdHJpbmc+KFtcclxuICAgICdJJywgJ0lJJywgJ0lJSScsICdJVicsICdWJywgJ1ZJJywgJ1ZJSScsICdWSUlJJywgJ0lYJywgJ1gnLCAnWEknLCAnWElJJywgJ1hJSUknLCAnWElWJywgJ1hWJyxcclxuICAgICdYVkknLCAnWFZJSScsICdYVklJSScsICdYSVgnLCAnWFgnXHJcbiAgXSk7XHJcblxyXG4gIHByaXZhdGUgc2lnbGFzID0gbmV3IFNldDxzdHJpbmc+KFtcclxuICAgICdVSScsICdVWCcsICdUSSdcclxuICBdKTtcclxuXHJcbiAgbWVudUZpbHRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNoZWNrYm94Q2xpY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1Blc3F1aXNhci4uLic7XHJcblxyXG4gIGNvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICB0YWJsZUFjdGlvbnM6IE1lbnVJdGVtW11bXSA9IFtdO1xyXG4gIGN1cnJEYXRhU291cmNlOiBhbnlbXSA9IFtdO1xyXG5cclxuICBtZW51SXRlbXMhOiBNZW51SXRlbVtdO1xyXG5cclxuICBhY3Rpb25zT2Zmc2V0OiBudW1iZXIgPSAwO1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlRGlyZWN0aXZlKSB0ZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8YW55PjtcclxuICBASW5wdXQoJ3RlbXBsYXRlcycpIF90ZW1wbGF0ZXMhOiBhbnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJywgeyBzdGF0aWM6IGZhbHNlIH0pIHRhYmxlITogVGFibGU7XHJcblxyXG4gIEBWaWV3Q2hpbGQoVGFibGUpIHB0YWJsZSE6IFRhYmxlO1xyXG5cclxuXHJcblxyXG4gIEBJbnB1dCgnY29uZmlnJykgc2V0IHNldENvbmZpZyh2YWx1ZTogVGFibGVDb25maWcpIHtcclxuICAgIHRoaXMudGFibGVDb25maWcuc2V0KHtcclxuICAgICAgZW5hYmxlQ2F0aW9uOiB2YWx1ZS5lbmFibGVDYXRpb24gfHwgdHJ1ZSxcclxuICAgICAgZW5hYmxlU2VsZWN0OiB2YWx1ZS5lbmFibGVTZWxlY3QgfHwgZmFsc2UsXHJcbiAgICAgIGVuYWJsZUZpbHRlcjogdmFsdWUuZW5hYmxlRmlsdGVyIHx8IHRydWUsXHJcbiAgICAgIC4uLnZhbHVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kZWZpbmlyQ29sdW5hc0NvbmZpZ3VyYXZlaXModGhpcy50YWJsZUNvbmZpZygpISk7XHJcbiAgfVxyXG5cclxuICBmaXJzdCA9IG1vZGVsPG51bWJlcj4oMCk7XHJcbiAgcm93cyA9IG1vZGVsPG51bWJlcj4oNSk7XHJcblxyXG4gIEBJbnB1dCgpIGRlZmF1bHRTb3J0RmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBkYXRhU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgdG90YWxSZWNvcmRzITogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHBhZ2luYXRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgcm93c1BlclBhZ2VPcHRpb25zITogbnVtYmVyW107XHJcbiAgQElucHV0KCkgdGFibGVTaXplITogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGZpbHRlckNvbHVtbnNCdG46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSByZXBsYWNlRW1wdHlWYWx1ZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGF1dG9Gb2N1c1NlYXJjaDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCBFc3NhIHByb3ByaWVkYWRlIG7Do28gc2Vyw6EgbWFpcyB1dGlsaXphZGEgcG9yIGVzc2UgY29tcG9uZW50ZSBuYXMgcHLDs3hpbWFzIHZlcnPDtWVzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGZpbHRyb3NBdmFuY2Fkb3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgc2Nyb2xsSGVpZ2h0OiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBpc1RhYmxlU2Nyb2xsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHRhYmxlQ2FwdGFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSByb3dUcmFja0J5OiAoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSA9PiBhbnkgPSAoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtO1xyXG5cclxuICBASW5wdXQoKSByZXNwb25zaXZlTGF5b3V0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgZGlzYWJsZWRIZWFkZXJDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYSBwcm9wcmllZGFkZSBcInRhZ0NvbG9yXCIgbmEgY29uZmlndXJhw6fDo28gZGEgY29sdW5hIHBhcmEgZXN0aWxpemFyIGEgdGFnXHJcbiAgICovXHJcbiAgQElucHV0KCkgYXBwbHlTdHlsZTogRnVuY3Rpb24gPSAocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKSA9PiAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgTyB2YWxvciBkZSBwYWdlTGlua3Mgw6kgYXRyaWJ1w61kbyBkZSBhY29yZG8gY29tIG8gdGFtYW5obyBkYSB0ZWxhLCBlc3NhIHByb3ByaWVkYWRlIG7Do28gZXN0w6Egc2VuZG8gdXRpbGl6YWRhXHJcbiAgICovXHJcbiAgQElucHV0KCkgcGFnZUxpbmtzT3B0aW9ucyE6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgQSBxdWFudGlkYWRlIGRlIHBhZ2luaXRvclBhZ2VJY29ucyDDqSBhdHJpYnXDrWRvIGRlIGFjb3JkbyBjb20gbyB0YW1hbmhvIGRhIHRlbGEsIGVzc2EgcHJvcHJpZWRhZGUgbsOjbyBlc3TDoSBzZW5kbyB1dGlsaXphZGFcclxuICAgKi9cclxuICBASW5wdXQoKSBzaG93Rmlyc3RMYXN0SWNvbiE6IGJvb2xlYW47XHJcblxyXG4gIEBPdXRwdXQoKSBvbkFjdGl2ZUl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvbkFjdGl2ZUl0ZW1Mb3RlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25QYWdpbmF0ZTogRXZlbnRFbWl0dGVyPFRhYmxlUGFnaW5hdGU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvblNlbGVjdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGRvdWJsZUNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJGaWVsZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uU3dpdGNoVGFibGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdtZW51RmlsdHJvRGl2JykgbWVudUZpbHRyb0RpdiE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnYm90YW9GaWx0cm8nKSBib3Rhb0ZpbHRybyE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnaW5wdXRGaWVsZCcpIGlucHV0RmllbGQhOiBFbGVtZW50UmVmO1xyXG5cclxuICB0YWJsZUNlbGwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ3RhYmxlQ2VsbCcpO1xyXG4gIGVsbGlwc2lzVGV4dCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBpc0xvYWRpbmdTa2VsZXRvbiA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgZmlsdGVyQnV0dG9uID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIGZpbHRlckJ1dHRvbkJhZGdlID0gaW5wdXQ8c3RyaW5nPignJyk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlY2ltYWxQaXBlOiBEZWNpbWFsUGlwZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3BmQ25walBpcGU6IENwZkNucGpQaXBlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZWxlZm9uZVBpcGU6IFRlbGVmb25lUGlwZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZlxyXG4gICkge1xyXG4gICAgdGhpcy5pc1Jvd1NlbGVjdGFibGUgPSB0aGlzLmlzUm93U2VsZWN0YWJsZS5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgY29uZmlndXJhY2FvRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMudGFibGVDb25maWcoKSE7XHJcbiAgICB0aGlzLmRlZmluaXJGaWx0cm9zR2xvYmFpcyhjb25maWcpO1xyXG4gICAgdGhpcy5kZWZpbmlyQ29sdW5hc0NvbmZpZ3VyYXZlaXMoY29uZmlnKTtcclxuICB9KTtcclxuXHJcbiAgZGF0YVNvdXJjZVNpZ25hbCA9IHNpZ25hbDxhbnlbXT4oW10pO1xyXG5cclxuICB3aWR0aFNrZWxldG9uczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgd2lkdGhSYW5kb20gPSBjb21wdXRlZCgoKSA9PiAoY29sOiBhbnksIHJvdzogYW55KSA9PiB7XHJcbiAgICBpZiAoIWNvbC50ZW1wbGF0ZSAmJiAhY29sLmljb24gJiYgIWNvbC5maWVsZFR5cGUgJiYgIWNvbC5ib29sZWFuICYmICFjb2wucGlwZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy53aWR0aFNrZWxldG9uc1tyb3ddICogMTAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIDEwMDtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGFTb3VyY2UpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRhU291cmNlKVxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlQWN0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuY3VyckRhdGFTb3VyY2UgPSBbLi4udGhpcy5kYXRhU291cmNlXTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBbLi4udGhpcy5kYXRhU291cmNlXTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2VTaWduYWwuc2V0KFsuLi50aGlzLmRhdGFTb3VyY2VdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF0YVNvdXJjZU1vY2s6IGFueVtdID0gW107XHJcblxyXG4gIGlzRW1wdHlEYXRhU291cmNlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YVNvdXJjZVNpZ25hbCgpKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhU291cmNlTW9jayk7XHJcbiAgfSlcclxuXHJcbiAgbG9hZGluZ1NrZWxldG9uVXRpbGl0aWVzKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPT09IDAgJiYgdGhpcy5pc0xvYWRpbmdTa2VsZXRvbigpKSB7XHJcbiAgICAgIGxldCByb3dJdGVtOiBhbnkgPSB7fTtcclxuICAgICAgdGhpcy50YWJsZUNvbmZpZygpPy5jb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xyXG4gICAgICAgIHJvd0l0ZW1bY29sLmZpZWxkXSA9ICcnO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZU1vY2sgPSBBcnJheSh0aGlzLnJvd3MoKSkuZmlsbCh7IC4uLnJvd0l0ZW0gfSk7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZGF0YVNvdXJjZU1vY2s7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93cygpOyBpKyspIHtcclxuICAgICAgICB0aGlzLndpZHRoU2tlbGV0b25zLnB1c2goTWF0aC5yYW5kb20oKSAqIDAuNyArIDAuMik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5sb2FkaW5nU2tlbGV0b25VdGlsaXRpZXMoKTtcclxuICAgIHRoaXMuYWRqdXN0VGFibGVTaXplKCk7XHJcbiAgICB0aGlzLndpZHRoUGFnZS5zZXQod2luZG93LmlubmVyV2lkdGgpO1xyXG4gICAgLy8gdGhpcy5jcmlhck1lbnVDb2x1bW5zKCk7XHJcbiAgICB0aGlzLmNvbmZpZy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgdGhpcy5jb2x1bW5zLnB1c2goY29sKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jaGVja0hpZGVDb2x1bW5zKCk7XHJcbiAgICBjb25zdCBkZWZhdWx0U29ydEZpZWxkID0gdGhpcy5kZWZhdWx0U29ydEZpZWxkO1xyXG4gICAgaWYgKGRlZmF1bHRTb3J0RmllbGQgJiYgdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdHlwZW9mIGFbZGVmYXVsdFNvcnRGaWVsZF0gPT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgICB0eXBlb2YgYltkZWZhdWx0U29ydEZpZWxkXSA9PT0gJ3N0cmluZydcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiAoYVtkZWZhdWx0U29ydEZpZWxkXSBhcyBzdHJpbmcpLmxvY2FsZUNvbXBhcmUoXHJcbiAgICAgICAgICAgIChiW2RlZmF1bHRTb3J0RmllbGRdIGFzIHN0cmluZylcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgIHR5cGVvZiBhW2RlZmF1bHRTb3J0RmllbGRdID09PSAnYm9vbGVhbicgJiZcclxuICAgICAgICAgIHR5cGVvZiBiW2RlZmF1bHRTb3J0RmllbGRdID09PSAnYm9vbGVhbidcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiBhW2RlZmF1bHRTb3J0RmllbGRdID09PSBiW2RlZmF1bHRTb3J0RmllbGRdXHJcbiAgICAgICAgICAgID8gMFxyXG4gICAgICAgICAgICA6IGFbZGVmYXVsdFNvcnRGaWVsZF1cclxuICAgICAgICAgICAgICA/IDFcclxuICAgICAgICAgICAgICA6IC0xO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICB0eXBlb2YgYVtkZWZhdWx0U29ydEZpZWxkXSA9PT0gJ251bWJlcicgJiZcclxuICAgICAgICAgIHR5cGVvZiBiW2RlZmF1bHRTb3J0RmllbGRdID09PSAnbnVtYmVyJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIChhW2RlZmF1bHRTb3J0RmllbGRdIGFzIG51bWJlcikgLSAoYltkZWZhdWx0U29ydEZpZWxkXSBhcyBudW1iZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gMDsgLy8gT3Ugb3V0cmEgbMOzZ2ljYSBkZXBlbmRlbmRvIGRvIGNhc29cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpc2FibGVkLXJvdycpLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJykuZm9yRWFjaChjZWxsID0+IHtcclxuICAgICAgICBjZWxsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgaWYgKCF0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCd0b29sdGlwJykpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWZpbmlyQ29sdW5hc0NvbmZpZ3VyYXZlaXMoY29uZmlnOiBUYWJsZUNvbmZpZykge1xyXG4gICAgdGhpcy5jb2x1bW5zLnNwbGljZSgwLCB0aGlzLmNvbHVtbnMubGVuZ3RoKTtcclxuXHJcbiAgICBjb25maWcuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRlZmluaXJGaWx0cm9zR2xvYmFpcyhjb25maWc6IFRhYmxlQ29uZmlnKSB7XHJcbiAgICBpZiAoY29uZmlnPy5lbmFibGVGaWx0ZXIpIHtcclxuXHJcbiAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyRmllbGRzLnNwbGljZSgwLCB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcy5sZW5ndGgpO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29uZmlnLmNvbHVtbnMpIHtcclxuICAgICAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcy5wdXNoKGNvbHVtbi5maWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0VGFibGUoKSB7XHJcbiAgICBpZiAodGhpcy5wdGFibGUpIHRoaXMucHRhYmxlLnJlc2V0KCk7XHJcbiAgICBpZiAodGhpcy5pbnB1dEZpZWxkKSB0aGlzLmlucHV0RmllbGQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgb25XaW5kb3dSZXNpemUoKSB7XHJcbiAgICB0aGlzLmFkanVzdFRhYmxlU2l6ZSgpO1xyXG4gICAgdGhpcy53aWR0aFBhZ2Uuc2V0KHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhY3RpdmVJdGVtKHJvd0RhdGE6IGFueSkge1xyXG4gICAgdGhpcy5vbkFjdGl2ZUl0ZW0uZW1pdChyb3dEYXRhKTtcclxuICB9XHJcblxyXG4gIGdldE9yRXhlY3V0ZTxUPihhY3Rpb246IFZhbHVlT3JGbjxUPiwgZGF0YTogYW55KTogVCB7XHJcbiAgICByZXR1cm4gZ2V0T3JFeGVjdXRlKGFjdGlvbiwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICBpc0Jvb2xlYW5GaWVsZChyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0eXBlb2Ygcm93RGF0YVtjb2wuZmllbGRdID09ICdib29sZWFuJztcclxuICB9XHJcblxyXG4gIGlzQ2hpcEZpZWxkKGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBjb2wuZmllbGRUeXBlID09ICdjaGlwJztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblBhZ2UoZXZlbnQ6IFRhYmxlUGFnZUV2ZW50KSB7XHJcbiAgICB0aGlzLmZpcnN0LnNldChldmVudC5maXJzdCk7XHJcbiAgICB0aGlzLnJvd3Muc2V0KGV2ZW50LnJvd3MpO1xyXG4gIH1cclxuXHJcbiAgaXNJbWFnZUZpZWxkKGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIGxldCByZXRvcm5vID0gY29sLmZpZWxkVHlwZSAmJiBjb2wuZmllbGRUeXBlID09PSAnaW1hZ2UnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgcmV0dXJuIHJldG9ybm87XHJcbiAgfVxyXG5cclxuICBpc1N3aXRjaEZpZWxkKGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIGxldCByZXRvcm5vID0gY29sLmZpZWxkVHlwZSAmJiBjb2wuZmllbGRUeXBlID09PSAnc3dpdGNoJyA/IHRydWUgOiBmYWxzZTtcclxuICAgIHJldHVybiByZXRvcm5vO1xyXG4gIH1cclxuXHJcbiAgaXNSb3dTZWxlY3RhYmxlKGV2ZW50OiBhbnkpIHtcclxuICAgIHJldHVybiAhdGhpcy5pc0Rpc2FibGVkQ2hlY2tib3goZXZlbnQuZGF0YSk7XHJcbiAgfVxyXG5cclxuICBpc0Rpc2FibGVkQ2hlY2tib3gocm93RGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGlzYWJsZUNvbnRyb2xDaGVja2JveEZ1bmN0aW9uXHJcbiAgICAgID8gdGhpcy5jb25maWcuZGlzYWJsZUNvbnRyb2xDaGVja2JveEZ1bmN0aW9uKHJvd0RhdGEpXHJcbiAgICAgIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc0Rpc2FibGVkUm93KHJvd0RhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRpc2FibGVSb3cgPyB0aGlzLmNvbmZpZy5kaXNhYmxlUm93KHJvd0RhdGEpIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBOw6NvIMOpIHV0aWxpemFkYVxyXG4gIHByaXZhdGUgZ2V0U3R5bGVDbGFzcyhyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnRVNUSUxPIC0+JywgY29sID8gY29sLnN0eWxlQ2xhc3MhKHJvd0RhdGEsIGNvbCwgZGF0YSkgOiAnJylcclxuICAgIHJldHVybiBjb2wgPyBjb2wuc3R5bGVDbGFzcyEocm93RGF0YSwgY29sLCBkYXRhKSA6ICcnXHJcbiAgfVxyXG5cclxuICB2ZXJpZmljYUN1cnNvcigpIHtcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXNhYmxlZC1yb3cnKS5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgIHJvdy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpLmZvckVhY2goY2VsbCA9PiB7XHJcbiAgICAgICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcclxuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgIGlmICghdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygndG9vbHRpcCcpKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gTsOjbyBlc3TDoSB2ZXJpZmljYW5kbyBzZSByb3dEYXRhW2NvbC5maWVsZF0gw6kgc3RyaW5nXHJcbiAgbG9hZEltYWdlKHJvd0RhdGE6IGFueSwgY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IHN0cmluZyB7XHJcbiAgICAvKlxyXG4gICAgICBOb3NzYSBjb2x1bmEgZGUgaW1hZ2VtIHRyYWJhbGhhIGNvbSBzdHJpbmdzIGRvIHRpcG86IGJhc2U2NCBvdSB1cmxcclxuICAgICovXHJcbiAgICBsZXQgcmV0b3JubyA9IGBkYXRhOiBpbWFnZSAvIGpwZzsgYmFzZTY0LCAke2ltZ0RlZmF1bHR9IGA7XHJcbiAgICBpZiAocm93RGF0YSAmJiBjb2wgJiYgcm93RGF0YVtjb2wuZmllbGRdICYmIHJvd0RhdGFbY29sLmZpZWxkXSAhPT0gJycpIHtcclxuICAgICAgaWYgKHJvd0RhdGFbY29sLmZpZWxkXS5pbmNsdWRlcygnaHR0cCcpKSByZXRvcm5vID0gcm93RGF0YVtjb2wuZmllbGRdO1xyXG4gICAgICBlbHNlIHJldG9ybm8gPSBgZGF0YTogaW1hZ2UgLyBqcGc7IGJhc2U2NCwgJHtyb3dEYXRhW2NvbC5maWVsZF19IGA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJldG9ybm87XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25HbG9iYWxGaWx0ZXIodGFibGU6IFRhYmxlLCBldmVudDogRXZlbnQpIHtcclxuICAgIHRoaXMuZmlsdGVyRmllbGQuZW1pdCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcclxuICAgIHRhYmxlLmZpbHRlckdsb2JhbCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlLCAnY29udGFpbnMnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwYWdpbmF0ZShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgbGV0IHBhZ2luYUluaWNpYWwgPVxyXG4gICAgICAgIChldmVudD8uZmlyc3QgPiAwID8gZXZlbnQuZmlyc3QgLyBldmVudC5yb3dzIDogZXZlbnQuZmlyc3QpICsgMTtcclxuICAgICAgbGV0IHRlcm1vUGVzcXVpc2EgPSAnJztcclxuICAgICAgbGV0IG9yZGVuYWNhbyA9ICcnO1xyXG5cclxuICAgICAgaWYgKGV2ZW50Lmdsb2JhbEZpbHRlcikgdGVybW9QZXNxdWlzYSA9IGV2ZW50Lmdsb2JhbEZpbHRlcjtcclxuXHJcbiAgICAgIGlmIChldmVudC5zb3J0RmllbGQpXHJcbiAgICAgICAgb3JkZW5hY2FvID0gYCR7ZXZlbnQuc29ydEZpZWxkfSAke2V2ZW50LnNvcnRPcmRlciA9PT0gMSA/ICdBU0MnIDogJ0RFU0MnfSBgO1xyXG5cclxuICAgICAgY29uc3Qgb2JqZXRvOiBUYWJsZVBhZ2luYXRlID0ge1xyXG4gICAgICAgIHBhZ2luYUluaWNpYWw6IHBhZ2luYUluaWNpYWwsXHJcbiAgICAgICAgdGFtYW5ob1BhZ2luYTogZXZlbnQucm93cyxcclxuICAgICAgICB0ZXJtb1Blc3F1aXNhOiB0ZXJtb1Blc3F1aXNhLFxyXG4gICAgICAgIG9yZGVuYWNhbzogb3JkZW5hY2FvLFxyXG4gICAgICAgIG9yZGVybmFjYW9Hcm91cDogeyBjb2x1bW46IGV2ZW50LnNvcnRGaWVsZCwgZGlyZWN0aW9uOiBldmVudC5zb3J0T3JkZXIgPT09IDEgPyAnQVNDJyA6ICdERVNDJyB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5vblBhZ2luYXRlLmVtaXQob2JqZXRvKTtcclxuXHJcbiAgICAgIHRoaXMuYWN0aW9uc09mZnNldCA9IGV2ZW50LmZpcnN0O1xyXG4gICAgICB0aGlzLmNyZWF0ZVRhYmxlQWN0aW9ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0aW9uQ2hhbmdlKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWN0aXZlSXRlbUxvdGUoc2VsZWN0ZWRJdGVtczogYW55KSB7XHJcbiAgICB0aGlzLm9uQWN0aXZlSXRlbUxvdGUuZW1pdChzZWxlY3RlZEl0ZW1zKTtcclxuICB9XHJcblxyXG4gIC8vIE7Do28gZXN0w6EgdmVyaWZpY2FuZG8gc2Ugcm93RGF0YVtjb2wuZmllbGRdIHBvZGUgc2VyIHBhc3NhZG8gcGFyYSBEYXRlXHJcbiAgcmV0dXJuUm93Q2xhc3Mocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKSB7XHJcbiAgICBsZXQgdmFsdWUgPSByb3dEYXRhW2NvbC5maWVsZF07XHJcbiAgICBsZXQgcm93Q2xhc3M6IHN0cmluZztcclxuXHJcbiAgICB0aGlzLnRhYmxlU2l6ZSA+IDgwMCA/IChyb3dDbGFzcyA9ICd0ZXh0LWJhc2UnKSA6IChyb3dDbGFzcyA9ICd0ZXh0LXNtJyk7XHJcblxyXG4gICAgaWYgKGNvbC5leHBpcmVkRGF0ZSA9PSB0cnVlKSB7XHJcbiAgICAgIG5ldyBEYXRlKHZhbHVlKSA8IG5ldyBEYXRlKClcclxuICAgICAgICA/IChyb3dDbGFzcyA9IHJvd0NsYXNzICsgJyB0ZXh0LXJlZC00MDAgZm9udC1zZW1pYm9sZCcpXHJcbiAgICAgICAgOiAnJztcclxuICAgIH1cclxuICAgIHJldHVybiByb3dDbGFzcztcclxuICB9XHJcblxyXG4gIC8vIE7Do28gw6kgdXNhZGFcclxuICBwcml2YXRlIGV4cGlyZWRGaWxlKHJvd0RhdGE6IGFueSwgY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHZhbHVlID0gcm93RGF0YVsnZGF0YXZlbmNpbWVudG8nXTtcclxuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSkgPCBuZXcgRGF0ZSgpICYmIGNvbC5maWVsZCA9PSAnYXJlYSc7XHJcbiAgfVxyXG5cclxuICB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pIHtcclxuICAgIGxldCB2YWx1ZSA9IHJvd0RhdGFbY29sLmZpZWxkXTtcclxuXHJcbiAgICBpZiAoY29sLnRyYW5zZm9ybSkge1xyXG4gICAgICByZXR1cm4gY29sLnRyYW5zZm9ybSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSAmJiB0aGlzLnJlcGxhY2VFbXB0eVZhbHVlcyAmJiB0aGlzLmlzTG9hZGluZ1NrZWxldG9uKCkpIHtcclxuICAgICAgcmV0dXJuICctJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICBpZiAoIWNvbC5waXBlKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGNvbC5waXBlKSB7XHJcbiAgICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUsICdkZC9NTS95eXl5JywgJ1VUQycpO1xyXG4gICAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJ2RkL01NL3l5eXkgSEg6bW0nKTtcclxuICAgICAgICBjYXNlICdkYXRlTW9udGhZZWFyJzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJ01NL3l5eXknKTtcclxuICAgICAgICBjYXNlICdkZWNpbWFsJzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmRlY2ltYWxQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJzEuMi0yJywgJ3B0LUJSJyk7XHJcbiAgICAgICAgY2FzZSAnY3BmY25waic6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5jcGZDbnBqUGlwZS50cmFuc2Zvcm0odmFsdWUpO1xyXG4gICAgICAgIGNhc2UgJ3RlbGVmb25lJzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLnRlbGVmb25lUGlwZS50cmFuc2Zvcm0odmFsdWUpO1xyXG4gICAgICAgIGNhc2UgJ2NhcGl0YWxpemUnOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtQ2FwaXRhbGl6ZSh2YWx1ZSk7XHJcbiAgICAgICAgY2FzZSAnbW9uZXknOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0YXJWYWxvcih2YWx1ZSk7XHJcbiAgICAgICAgY2FzZSAncGVyY2VudGFnZSc6XHJcbiAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9ICUgYDtcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyB0cmFuc2Zvcm1EYXRlKGRhdGU6IGFueSkge1xyXG4gIC8vICAgY29uc3QgZGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUoJ2VuLVVTJyk7XHJcbiAgLy8gICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoZGF0ZSk7XHJcblxyXG4gIC8vICAgLy8gQWp1c3RlIGEgZGF0YSBwYXJhIG8gZnVzbyBob3LDoXJpbyBsb2NhbFxyXG4gIC8vICAgY29uc3QgbG9jYWxEYXRlID0gbmV3IERhdGUodXRjRGF0ZS5nZXRUaW1lKCkgKyAodXRjRGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDApKTtcclxuXHJcbiAgLy8gICBjb25zb2xlLmxvZygnbG9jYWxEYXRlJywgbG9jYWxEYXRlLCBcImlucHV0IGRhdGVcIiwgZGF0ZSk7XHJcblxyXG4gIC8vICAgLy8gVHJhbnNmb3JtZSBhIGRhdGEgbG9jYWwgcGFyYSBvIGZvcm1hdG8gZGVzZWphZG9cclxuICAvLyAgIHJldHVybiBkYXRlUGlwZS50cmFuc2Zvcm0obG9jYWxEYXRlLCAnZGQvTU0veXl5eScpO1xyXG4gIC8vIH1cclxuXHJcbiAgdHJhbnNmb3JtQ2FwaXRhbGl6ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcclxuXHJcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoJyAnKS5tYXAoKHdvcmQsIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IHdvcmRVcHBlciA9IHdvcmQudG9VcHBlckNhc2UoKTtcclxuICAgICAgY29uc3Qgd29yZExvd2VyID0gd29yZC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgLy8gVmVyaWZpY2EgbnVtZXJhaXMgcm9tYW5vc1xyXG4gICAgICBpZiAodGhpcy5yb21hbk51bWVyYWxzLmhhcyh3b3JkVXBwZXIpKSB7XHJcbiAgICAgICAgcmV0dXJuIHdvcmQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFZlcmlmaWNhIHNpZ2xhc1xyXG4gICAgICBpZiAodGhpcy5zaWdsYXMuaGFzKHdvcmRVcHBlcikpIHtcclxuICAgICAgICByZXR1cm4gd29yZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVmVyaWZpY2EgcHJlcG9zacOnw7VlcywgbWFzIG7Do28gYWx0ZXJhIGEgcHJpbWVpcmEgcGFsYXZyYVxyXG4gICAgICBpZiAoaW5kZXggIT09IDAgJiYgdGhpcy5wcmVwb3NpdGlvbnMuaGFzKHdvcmRMb3dlcikpIHtcclxuICAgICAgICByZXR1cm4gd29yZExvd2VyO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDYXBpdGFsaXphIGEgcHJpbWVpcmEgbGV0cmEgZGFzIGRlbWFpcyBwYWxhdnJhc1xyXG4gICAgICByZXR1cm4gd29yZC5jaGFyQXQoMCkudG9Mb2NhbGVVcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgIH0pLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdGFyVmFsb3IodmFsb3I6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQoJ3B0LUJSJywge1xyXG4gICAgICBzdHlsZTogJ2N1cnJlbmN5JyxcclxuICAgICAgY3VycmVuY3k6ICdCUkwnLFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQodmFsb3IpO1xyXG4gIH1cclxuXHJcbiAgYWRqdXN0VGFibGVTaXplKCkge1xyXG4gICAgaWYgKHRoaXMudGFibGVTaXplIDwgODAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTaXplID0gJ3AtZGF0YXRhYmxlLXNtJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTaXplID0gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkb3VibGVDbGljayhlOiBhbnksIHJvd0RhdGE6IGFueSkge1xyXG4gICAgbGV0IGV2ZW50RG91YmxlQ2xpY2sgPSB7IGV2ZW50OiBlLCByb3dEYXRhOiByb3dEYXRhIH07XHJcblxyXG4gICAgbGV0IGFycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZS50YXJnZXQuY2xhc3NMaXN0LmZvckVhY2goKHg6IGFueSkgPT4gYXJyYXkucHVzaCh4KSk7XHJcblxyXG4gICAgdGhpcy5kb3VibGVDbGlja0V2ZW50LmVtaXQoZXZlbnREb3VibGVDbGljayk7XHJcbiAgfVxyXG5cclxuICAvLyBhbGlnbkNvbHVuYXMoY29sOiBhbnkpOiBzdHJpbmcge1xyXG4gIC8vICAgaWYgKGNvbC5hbGlnbikge1xyXG4gIC8vICAgICByZXR1cm4gYHRleHQgLSBhbGlnbjogJHsgY29sLmFsaWduIH0gYDtcclxuICAvLyAgIH0gZWxzZSByZXR1cm4gJyc7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhbGlnbkNvbHVuYXNIZWFkZXIoY29sOiBhbnkpOiBzdHJpbmcge1xyXG4gIC8vICAgaWYgKGNvbC5hbGlnbikge1xyXG4gIC8vICAgICBpZiAoY29sLmFsaWduID09ICdyaWdodCcpIHJldHVybiAnanVzdGlmeS1jb250ZW50OiBlbmQnO1xyXG4gIC8vICAgICBlbHNlIHJldHVybiAnJztcclxuICAvLyAgIH0gZWxzZSByZXR1cm4gJyc7XHJcbiAgLy8gfVxyXG5cclxuICByZXRvcm5hclJvdyhyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4sIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgX3Jvd2FjdGlvbiA9IHRoaXMuY29uZmlnLnJvd3MgPyB0aGlzLmNvbmZpZy5yb3dzW2NvbC5maWVsZF0gOiBudWxsO1xyXG4gICAgY29uc3QgX2ZpZWxkOiBzdHJpbmcgPVxyXG4gICAgICBfcm93YWN0aW9uICYmIF9yb3dhY3Rpb25bZmllbGRdXHJcbiAgICAgICAgPyBfcm93YWN0aW9uW2ZpZWxkXS5jb25zdHJ1Y3RvciA9PT0gRnVuY3Rpb25cclxuICAgICAgICAgID8gX3Jvd2FjdGlvbltmaWVsZF0uYXBwbHkodGhpcywgW3Jvd0RhdGFdKVxyXG4gICAgICAgICAgOiBfcm93YWN0aW9uW2ZpZWxkXVxyXG4gICAgICAgIDogbnVsbDtcclxuICAgIHJldHVybiBfZmllbGQ7XHJcbiAgfVxyXG5cclxuICAvLyBOw6NvIMOpIHVzYWRvXHJcbiAgcHJpdmF0ZSBleGliaXJDYW1wbyhmaWVsZDogYW55LCByb3dEYXRhOiBhbnkpIHtcclxuICAgIGxldCB2aXNpYmxlID0gZmllbGQudmlzaWJsZSA/IGZpZWxkLnZpc2libGUocm93RGF0YSkgOiB0cnVlO1xyXG5cclxuICAgIHJldHVybiB2aXNpYmxlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuQ2xhc3NDaGlwKHJvd0RhdGE6IGFueSwgY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYGNoaXAgLSBzdHlsZSB3IC0gYXV0byBib3JkZXIgLSByb3VuZCAtIDJ4bCBwIC0gMiB0ZXh0IC0gJHt0aGlzLnJldG9ybmFyUm93KFxyXG4gICAgICByb3dEYXRhLFxyXG4gICAgICBjb2wsXHJcbiAgICAgICdzdHlsZWNoaXAnXHJcbiAgICApXHJcbiAgICAgIH0gYm9yZGVyIC0gJHt0aGlzLnJldG9ybmFyUm93KHJvd0RhdGEsIGNvbCwgJ3N0eWxlY2hpcCcpfSBgO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuQ2xhc3NJY29uKHJvd0RhdGE6IGFueSwgY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXRvcm5hclJvdyhyb3dEYXRhLCBjb2wsICdpY29ucm93Jyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucmV0b3JuYXJSb3cocm93RGF0YSwgY29sLCAndG9vbHRpcGljb25yb3cnKTtcclxuICB9XHJcblxyXG4gIHJldHVyblRvb2x0aXBSb3cocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnJldG9ybmFyUm93KHJvd0RhdGEsIGNvbCwgJ3Rvb2x0aXByb3cnKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZUNvbHVtbihmaWVsZDogc3RyaW5nKSB7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlcjtcclxuXHJcbiAgICBsZXQgY29sdW1uOiBUYWJsZUNvbmZpZ0NvbHVtbiB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlnLmNvbHVtbnMuZmluZChcclxuICAgICAgeCA9PiB4LmZpZWxkID09IGZpZWxkXHJcbiAgICApO1xyXG4gICAgaWYgKGNvbHVtbikge1xyXG4gICAgICBpbmRleCA9IHRoaXMuY29uZmlnLmNvbHVtbnMuaW5kZXhPZihjb2x1bW4pO1xyXG4gICAgICB0aGlzLmNvbmZpZy5jb2x1bW5zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIHRoaXMuZGVsZXRlZENvbHVucy5wdXNoKGNvbHVtbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRDb2x1bW4oZmllbGQ6IHN0cmluZykge1xyXG4gICAgbGV0IGluZGV4OiBudW1iZXI7XHJcblxyXG4gICAgbGV0IGNvbHVtbjogVGFibGVDb25maWdDb2x1bW4gfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZy5jb2x1bW5zLmZpbmQoXHJcbiAgICAgICh4KSA9PiB4LmZpZWxkID09IGZpZWxkXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghY29sdW1uKSB7XHJcbiAgICAgIGxldCBkZWxldGVkQ29sdW1uOiBUYWJsZUNvbmZpZ0NvbHVtbiB8IHVuZGVmaW5lZCA9XHJcbiAgICAgICAgdGhpcy5kZWxldGVkQ29sdW5zLmZpbmQoKHgpID0+IHguZmllbGQgPT0gZmllbGQpO1xyXG5cclxuICAgICAgaWYgKGRlbGV0ZWRDb2x1bW4gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaW5kZXggPSB0aGlzLmRlbGV0ZWRDb2x1bnMuaW5kZXhPZihkZWxldGVkQ29sdW1uKTtcclxuICAgICAgICB0aGlzLmRlbGV0ZWRDb2x1bnMuc2xpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIHRoaXMuY29uZmlnLmNvbHVtbnMucHVzaChkZWxldGVkQ29sdW1uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGluYW1pY0NvbHVtblNldChlOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pIHtcclxuICAgIGNvbC5jaGVja2VkID0gZS5jaGVja2VkO1xyXG4gICAgaWYgKGUuY2hlY2tlZCkgdGhpcy5hZGRDb2x1bW4oY29sLmZpZWxkKTtcclxuICAgIGVsc2UgdGhpcy5kZWxldGVDb2x1bW4oY29sLmZpZWxkKTtcclxuXHJcbiAgICBpZiAoY29sLnBvc2l0aW9uKSB0aGlzLmNvbmZpZy5jb2x1bW5zLnNvcnQodGhpcy5zb3J0QnlQb3NpdGlvbigpKTtcclxuICB9XHJcblxyXG4gIGFicmlyTWVudUZpbHRybyhlOiBhbnkpIHtcclxuICAgIHRoaXMubWVudUZpbHRybyA9ICF0aGlzLm1lbnVGaWx0cm87XHJcbiAgICB0aGlzLmNoZWNrYm94Q2xpY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLndpZHRoUGFnZSgpIDwgNzAwKVxyXG4gICAgICB0aGlzLnN0eWxlU2V0dGVyKFxyXG4gICAgICAgICdsZWZ0JyxcclxuICAgICAgICB0aGlzLmJvdGFvRmlsdHJvLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCAtIDI4OCArICdweCdcclxuICAgICAgKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5zdHlsZVNldHRlcihcclxuICAgICAgICAnbGVmdCcsXHJcbiAgICAgICAgdGhpcy5ib3Rhb0ZpbHRyby5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQgKyA0MCArICdweCdcclxuICAgICAgKTtcclxuXHJcbiAgICB0aGlzLnN0eWxlU2V0dGVyKCd0b3AnLCB0aGlzLmJvdGFvRmlsdHJvLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wICsgJ3B4Jyk7XHJcbiAgICB0aGlzLnN0eWxlU2V0dGVyKCd2aXNpYmlsaXR5JywgdGhpcy5tZW51RmlsdHJvID8gJ3Zpc2libGUnIDogJ2hpZGRlbicpO1xyXG4gIH1cclxuXHJcbiAgZmVjaGFyTWVudUZpbHRybygpIHtcclxuICAgIHRoaXMubWVudUZpbHRybyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jaGVja2JveENsaWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLnN0eWxlU2V0dGVyKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnLCBbJyRldmVudCddKVxyXG4gIG9uRXNjYXBlS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJDb2x1bW5zQnRuID09IHRydWUgJiYgdGhpcy5tZW51RmlsdHJvID09IHRydWUpIHtcclxuICAgICAgdGhpcy5mZWNoYXJNZW51RmlsdHJvKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGlja0V2ZW50KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmZpbHRlckNvbHVtbnNCdG4gPT0gdHJ1ZSAmJiB0aGlzLm1lbnVGaWx0cm8gPT0gdHJ1ZSkge1xyXG4gICAgICBjb25zdCBjbGlja2VkRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgY29uc3QgbWVudUZpbHRyb0RpdiA9XHJcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI21lbnVGaWx0cm9EaXYnKTtcclxuICAgICAgY29uc3QgYm90YW9GaWx0cm8gPVxyXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNib3Rhb0ZpbHRybycpO1xyXG4gICAgICBjb25zdCBpc0NoZWNrYm94Q2xpY2tlZCA9XHJcbiAgICAgICAgY2xpY2tlZEVsZW1lbnQuY2xhc3NMaXN0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ3AtY2hlY2tib3gnKSB8fFxyXG4gICAgICAgIGV2ZW50LnRhcmdldC5jbGFzc0xpc3QudG9TdHJpbmcoKSA9PSAnJztcclxuICAgICAgY29uc3QgaXNJbnNpZGVNZW51ID1cclxuICAgICAgICBtZW51RmlsdHJvRGl2Py5jb250YWlucyhjbGlja2VkRWxlbWVudCkgfHxcclxuICAgICAgICBib3Rhb0ZpbHRybz8uY29udGFpbnMoY2xpY2tlZEVsZW1lbnQpIHx8XHJcbiAgICAgICAgaXNDaGVja2JveENsaWNrZWQ7XHJcblxyXG4gICAgICBpZiAoIWlzSW5zaWRlTWVudSkgdGhpcy5mZWNoYXJNZW51RmlsdHJvKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdHlsZVNldHRlcihzdHlsZTogc3RyaW5nLCBkYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucmVuZGVyZXI/LnNldFN0eWxlKHRoaXMubWVudUZpbHRyb0Rpdi5uYXRpdmVFbGVtZW50LCBzdHlsZSwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICBjaGVja01lbnVGaWx0cm8oY29sOiBUYWJsZUNvbmZpZ0NvbHVtbikge1xyXG4gICAgbGV0IGRlbGV0ZWRDb2x1bW4gPSB0aGlzLmRlbGV0ZWRDb2x1bnMuZmluZChcclxuICAgICAgeCA9PiB4LmZpZWxkID09IGNvbC5maWVsZFxyXG4gICAgKTtcclxuICAgIGlmIChkZWxldGVkQ29sdW1uKSBjb2wuY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgZWxzZSBjb2wuY2hlY2tlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzb3J0QnlQb3NpdGlvbigpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbTE6IGFueSwgZWxlbTI6IGFueSkge1xyXG4gICAgICBpZiAoZWxlbTEucG9zaXRpb24gPCBlbGVtMi5wb3NpdGlvbikge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgICAgfSBlbHNlIGlmIChlbGVtMS5wb3NpdGlvbiA+IGVsZW0yLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBkaW5hbWljRGlzYWJsZUNvbHVtbihjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoY29sLmZpeGVkQ29sdW1uKSByZXR1cm4gY29sLmZpeGVkQ29sdW1uO1xyXG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjaGVja0hpZGVDb2x1bW5zKCkge1xyXG4gICAgbGV0IGhpZGVDb2x1bW5zQ29uZmlnID0gdGhpcy5jb2x1bW5zLmZpbHRlcihcclxuICAgICAgY29sID0+IGNvbC5oaWRlQ29sdW1uID09IHRydWVcclxuICAgICk7XHJcbiAgICBoaWRlQ29sdW1uc0NvbmZpZy5mb3JFYWNoKGNvbCA9PiB0aGlzLmRlbGV0ZUNvbHVtbihjb2wuZmllbGQpKTtcclxuICB9XHJcblxyXG4gIGdldEN1c3RvbVRlbXBsYXRlKHRlbXBsYXRlbmFtZTogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVzW3RlbXBsYXRlbmFtZV07XHJcbiAgfVxyXG5cclxuICBvblN3aXRjaENoYW5nZShlc3RhZG86IGFueSwgcm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKSB7XHJcbiAgICB0aGlzLm9uU3dpdGNoVGFibGVDaGFuZ2UuZW1pdCh7XHJcbiAgICAgIGVzdGFkbzogZXN0YWRvLFxyXG4gICAgICByb3dEYXRhOiByb3dEYXRhLFxyXG4gICAgICBjb2w6IGNvbCxcclxuICAgIH0pO1xyXG5cclxuICAgIHJvd0RhdGFbY29sLmZpZWxkXSA9IGVzdGFkbztcclxuICB9XHJcblxyXG4gIGNyZWF0ZVRhYmxlQWN0aW9ucygpIHtcclxuICAgIHRoaXMudGFibGVBY3Rpb25zID0gdGhpcy5kYXRhU291cmNlPy5tYXAoKHgpID0+XHJcbiAgICAgIHRoaXMuY29uZmlnLmFjdGlvbnNcclxuICAgICAgICA/IHRoaXMuY29uZmlnLmFjdGlvbnMubWFwKCh5KSA9PiBtYXBUb01lbnVJdGVtKHksIHgpKVxyXG4gICAgICAgIDogW11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvblNvcnQoZTogYW55KSB7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBbLi4udGhpcy5kYXRhU291cmNlXTtcclxuICB9XHJcblxyXG4gIGdldCBjb25maWcoKTogVGFibGVDb25maWcge1xyXG4gICAgcmV0dXJuIHRoaXMudGFibGVDb25maWcoKSE7XHJcbiAgfVxyXG5cclxuICBjb2x1bW5zRmlsdGVyID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgZHluYW1pY0NvbHVtbnMgPSAodGhpcy50YWJsZUNvbmZpZygpPy5jb2x1bW5zID8/IFtdKS5maWx0ZXIoY29sID0+ICFjb2wuZml4ZWRDb2x1bW4pO1xyXG5cclxuICAgIHJldHVybiBbLi4uZHluYW1pY0NvbHVtbnMsIC4uLnRoaXMuZGVsZXRlZENvbHVuc107XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybk1heFdpZHRoID0gY29tcHV0ZWQoKCkgPT4gKHdpZHRoQ29sOiBzdHJpbmcpID0+IHtcclxuICAgIGxldCB3aWR0aFRhYmxlID0gdGhpcy50YWJsZUNlbGwoKT8ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgbGV0IHBlcmNlbnQgPSBOdW1iZXIod2lkdGhDb2wucmVwbGFjZSgnJScsICcnKSk7XHJcblxyXG4gICAgbGV0IHdpZHRoQ2FsYyA9IHdpZHRoVGFibGUgKiBwZXJjZW50IC8gMTAwO1xyXG5cclxuICAgIHJldHVybiBgJHt3aWR0aENhbGN9cHhgO1xyXG4gIH0pXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImt2LXRhYmxlLWNvbnRhaW5lclwiPlxyXG4gIEBpZiAoY29uZmlnKSB7XHJcbiAgPHAtdGFibGVcclxuICAgICNkdFxyXG4gICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXNtXCJcclxuICAgIFt2YWx1ZV09XCJkYXRhU291cmNlXCJcclxuICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZEl0ZW1zXCJcclxuICAgIFtyb3dTZWxlY3RhYmxlXT1cImlzUm93U2VsZWN0YWJsZVwiXHJcbiAgICBbY29sdW1uc109XCJjb25maWcuY29sdW1uc1wiXHJcbiAgICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cImdsb2JhbEZpbHRlckZpZWxkc1wiXHJcbiAgICBbcm93c109XCJyb3dzKClcIlxyXG4gICAgW3BhZ2luYXRvcl09XCJwYWdpbmF0b3JcIlxyXG4gICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJyb3dzUGVyUGFnZU9wdGlvbnNcIlxyXG4gICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcclxuICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IC0ge2xhc3R9IGRlIHt0b3RhbFJlY29yZHN9XCJcclxuICAgIFtyb3dIb3Zlcl09XCJ0cnVlXCJcclxuICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcclxuICAgIFtsYXp5XT1cImNvbmZpZy5sYXp5XCJcclxuICAgIFtmaXJzdF09XCJmaXJzdCgpXCJcclxuICAgIChvbkxhenlMb2FkKT1cInBhZ2luYXRlKCRldmVudClcIlxyXG4gICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAob25Tb3J0KT1cIm9uU29ydCgkZXZlbnQpXCJcclxuICAgIChvblBhZ2UpPVwib25QYWdlKCRldmVudClcIlxyXG4gICAgcm93R3JvdXBNb2RlPVwicm93c3BhblwiXHJcbiAgICBbZ3JvdXBSb3dzQnldPVwiY29uZmlnLmZpZWxkR3JvdXBcIlxyXG4gICAgW3Nob3dGaXJzdExhc3RJY29uXT1cIndpZHRoUGFnZSgpID4gOTYwID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgIFtwYWdlTGlua3NdPVwid2lkdGhQYWdlKCkgPiA5NjAgPyAyIDogMVwiXHJcbiAgICBbcmVzcG9uc2l2ZV09XCJ0cnVlXCJcclxuICAgIFtyZXNwb25zaXZlTGF5b3V0XT1cInJlc3BvbnNpdmVMYXlvdXQgPyAnc3RhY2snIDogJydcIlxyXG4gICAgW3Njcm9sbGFibGVdPVwiaXNUYWJsZVNjcm9sbGFibGVcIlxyXG4gICAgW3Njcm9sbEhlaWdodF09XCJzY3JvbGxIZWlnaHRcIlxyXG4gICAgW3Jvd1RyYWNrQnldPVwicm93VHJhY2tCeVwiXHJcbiAgPlxyXG4gICAgQGlmIChjb25maWc/LmVuYWJsZUNhdGlvbikge1xyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBmbGV4LXdyYXAganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ3JpZCBmb3JtZ3JpZCBwLWZsdWlkIGNvbC0xMiBtLTAgbWItMlwiXHJcbiAgICAgICAgW3N0eWxlLnBhZGRpbmcucmVtXT1cIjAuMVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGZsZXggZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgIEBpZiAoY29uZmlnLnRpdGxlKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBmb250LWJvbGQgbXktM1wiPlxyXG4gICAgICAgICAgICB7eyBjb25maWcudGl0bGUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfSBAaWYgKGNvbmZpZy5zdWJ0aXRsZSkge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gbWItNCBmb250LW1lZGl1bVwiPlxyXG4gICAgICAgICAgICB7eyBjb25maWcuc3VidGl0bGUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIG1kOmNvbC02IGxnOmNvbC00IHt7XHJcbiAgICAgICAgICAgIHdpZHRoUGFnZSgpIDwgNzY4ID8gJ2NvbC0xMCcgOiAnY29sLTEyJ1xyXG4gICAgICAgICAgfX0gIGdhcC0xIHAtMFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgQGlmIChjb25maWc/LmVuYWJsZUZpbHRlcikge1xyXG4gICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInAtaW5wdXQtaWNvbi1sZWZ0XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktc2VhcmNoIHRleHQtc21cIj48L2k+XHJcblxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XHJcbiAgICAgICAgICAgICAgcEF1dG9Gb2N1c1xyXG4gICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwid2lkdGhQYWdlKCkgPiA4MDBcIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25HbG9iYWxGaWx0ZXIoZHQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICAgICAgICAjaW5wdXRGaWVsZFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zbSBcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9zcGFuPiAtLT5cclxuICAgICAgICAgIEBpZihhdXRvRm9jdXNTZWFyY2gpIHtcclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgIHBBdXRvRm9jdXNcclxuICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cIndpZHRoUGFnZSgpID4gODAwXCJcclxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uR2xvYmFsRmlsdGVyKGR0LCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICAgI2lucHV0RmllbGRcclxuICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc20gY29sLTZcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfSBcclxuICAgICAgICAgIEBlbHNlIHs8aW5wdXRcclxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XHJcbiAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCJ3aWR0aFBhZ2UoKSA+IDgwMFwiXHJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbkdsb2JhbEZpbHRlcihkdCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgICNpbnB1dEZpZWxkXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtIGNvbC02XCJcclxuICAgICAgICAgICAgLz59XHJcblxyXG4gICAgICAgICAgfSBAaWYoZmlsdGVyQ29sdW1uc0J0bikge1xyXG4gICAgICAgICAgPGRpdiAjYm90YW9GaWx0cm8+XHJcbiAgICAgICAgICAgIDxrdi1idXR0b25cclxuICAgICAgICAgICAgICBpZD1cImJvdGFvRmlsdHJvXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCInYWxpZ25fdmVydGljYWxfdG9wJ1wiXHJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiYWJyaXJNZW51RmlsdHJvKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIHNldmVyaXR5PVwidGVydGlhcnlcIlxyXG4gICAgICAgICAgICAgIHBUb29sdGlwPVwiT2N1bHRhci9FeGliaXIgY29sdW5hc1wiXHJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2t2LWJ1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgI21lbnVGaWx0cm9EaXZcclxuICAgICAgICAgICAgaWQ9XCJtZW51RmlsdHJvRGl2XCJcclxuICAgICAgICAgICAgW3N0eWxlLnZpc2liaWxpdHldPVwiJ2hpZGRlbidcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIHotNCBiZy1ncmF5LTIwMCBtZW51LWNvbHVtbnMtZmlsdHJvXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHAtY2FyZCBzdHlsZUNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIHRleHQtbWVkaXVtIHctMTVyZW0gcC0xXCJcclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc0ZpbHRlcigpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBjaGVja01lbnVGaWx0cm8oY29sKSB9fVxyXG4gICAgICAgICAgICAgICAgPHAtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgI2ZpbHRlckNvbHVtbnNcclxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbC5oZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJkaW5hbWljQ29sdW1uU2V0KCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkaW5hbWljRGlzYWJsZUNvbHVtbihjb2wpXCJcclxuICAgICAgICAgICAgICAgID48L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvcC1jYXJkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9IEBpZihmaWx0ZXJCdXR0b24oKSkge1xyXG4gICAgICAgICAgPHAtYnV0dG9uXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJrdi1idXR0b24gc21hbGwgdGVydGlhcnkgdGV4dC14cyBmb250LW1lZGl1bVwiXHJcbiAgICAgICAgICAgIGxhYmVsPVwiRmlsdHJhclwiXHJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1maWx0ZXJcIlxyXG4gICAgICAgICAgICBbYmFkZ2VdPVwiZmlsdGVyQnV0dG9uQmFkZ2UoKVwiXHJcbiAgICAgICAgICAgIGJhZGdlQ2xhc3M9XCJ0ZXh0LWdyYXktODAwXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhzXCJcclxuICAgICAgICAgICAgKG9uQ2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgPjwvcC1idXR0b24+XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cclxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2ZpbHRyb11cIj4gPC9uZy1jb250ZW50PlxyXG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgY29sLTIganVzdGlmeS1jb250ZW50LWVuZCBnYXAtMiBwLTBcIj5cclxuICAgICAgICAgIEBmb3IgKGFjdGlvbiBvZiBjb25maWcuYWN0aW9uc0xvdGU7IHRyYWNrIGk7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICBAaWYgKChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgfHwgYWN0aW9uLnNob3dBY29lc0xvdGUpICYmXHJcbiAgICAgICAgICAgIChnZXRPckV4ZWN1dGUoYWN0aW9uLnZpc2libGUsIHNlbGVjdGVkSXRlbXMpID8/IHRydWUpKSB7XHJcbiAgICAgICAgICAgIDxrdi1idXR0b25cclxuICAgICAgICAgICAgICAob25DbGljayk9XCJhY3Rpb24/LmNvbW1hbmQoKTsgYWN0aXZlSXRlbUxvdGUoc2VsZWN0ZWRJdGVtcylcIlxyXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJnZXRPckV4ZWN1dGUoYWN0aW9uLnRvb2x0aXAsIHNlbGVjdGVkSXRlbXMpXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIidsZWZ0J1wiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldE9yRXhlY3V0ZShhY3Rpb24uZGlzYWJsZWQsIHNlbGVjdGVkSXRlbXMpIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJnZXRPckV4ZWN1dGUoYWN0aW9uLmljb24sIHNlbGVjdGVkSXRlbXMpXCJcclxuICAgICAgICAgICAgICBbc2V2ZXJpdHldPVwiYWN0aW9uLnNldmVyaXR5IHx8ICd0ZXJ0aWFyeSdcIlxyXG4gICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9yRXhlY3V0ZShhY3Rpb24ubGFiZWwsIHNlbGVjdGVkSXRlbXMpIHx8ICcnXCJcclxuICAgICAgICAgICAgICBbaXRlbXNdPVwiYWN0aW9uLml0ZW1zIHx8IFtdXCJcclxuICAgICAgICAgICAgICBbcG9wdXBdPVwiKGFjdGlvbi5pdGVtcyAmJiBhY3Rpb24uaXRlbXMubGVuZ3RoID4gMCkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgfVxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIEBpZiAoY29uZmlnLmVuYWJsZVNlbGVjdCkge1xyXG4gICAgICAgIDx0aD5cclxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3hcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2ZUl0ZW1Mb3RlKHNlbGVjdGVkSXRlbXMpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkSGVhZGVyQ2hlY2tib3hcIlxyXG4gICAgICAgICAgPjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgfSBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPHRoXHJcbiAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiY29sLnNvcnRhYmxlID09PSBmYWxzZVwiXHJcbiAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIge3tcclxuICAgICAgICAgICAgICBjb2w/LmNlbnRyYWxpemUgJiYgJ2p1c3RpZnktY29udGVudC1jZW50ZXInXHJcbiAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGRcIj57eyBjb2wuaGVhZGVyIH19PC9zcGFuPlxyXG4gICAgICAgICAgICBAaWYgKGNvbC5zb3J0YWJsZSkge1xyXG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBbZmllbGRdPVwiY29sLmZpZWxkXCIgY2xhc3M9XCJwYi0xXCI+PC9wLXNvcnRJY29uPlxyXG4gICAgICAgICAgICB9IEBpZiAoY29sLmhlYWRlclRvb2x0aXApIHtcclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJjb2wuaGVhZGVyVG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgPmluZm88L3NwYW5cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIH0gQGlmIChjb25maWcuYWN0aW9ucyAmJiBjb25maWcuYWN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L3RyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGVcclxuICAgICAgcFRlbXBsYXRlPVwiYm9keVwiXHJcbiAgICAgIGxldC1yb3dEYXRhXHJcbiAgICAgIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiXHJcbiAgICAgIGxldC1yb3dncm91cD1cInJvd2dyb3VwXCJcclxuICAgICAgbGV0LXJvd3NwYW49XCJyb3dzcGFuXCJcclxuICAgICAgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIlxyXG4gICAgPlxyXG4gICAgICA8dHJcclxuICAgICAgICAoZGJsY2xpY2spPVwiZG91YmxlQ2xpY2soJGV2ZW50LCByb3dEYXRhKVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgY2FwaXRhbGl6ZTogdGFibGVDYXB0YWxpemVkLFxyXG4gICAgICAgICAgbGFzdDogcm93SW5kZXggPT09IGRhdGFTb3VyY2UubGVuZ3RoIC0gMVxyXG4gICAgICAgIH1cIlxyXG4gICAgICAgIGNsYXNzPVwidHItdGQge3sgaXNEaXNhYmxlZFJvdyhyb3dEYXRhKSA/ICdkaXNhYmxlZC1yb3cnIDogJycgfX1cIlxyXG4gICAgICA+XHJcbiAgICAgICAgQGlmIChjb25maWcuZW5hYmxlU2VsZWN0KSB7XHJcbiAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDhweCAhaW1wb3J0YW50XCI+XHJcbiAgICAgICAgICA8cC10YWJsZUNoZWNrYm94XHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJyb3dEYXRhXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRDaGVja2JveChyb3dEYXRhKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVJdGVtTG90ZShzZWxlY3RlZEl0ZW1zKVwiXHJcbiAgICAgICAgICA+PC9wLXRhYmxlQ2hlY2tib3g+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICB9IEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgQGlmIChyb3dncm91cCAmJiAhY29sLnRlbXBsYXRlKSB7XHJcbiAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJyb3dncm91cCAmJiBjb2wuZ3JvdXBlZCA/IHJvd3NwYW4gOiBudWxsXCJcclxuICAgICAgICAgICAgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBSb3cocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwie3tcclxuICAgICAgICAgICAgICBjb2wuc3R5bGVDbGFzc1xyXG4gICAgICAgICAgICAgICAgPyBjb2wuc3R5bGVDbGFzcyhyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgIDogJydcclxuICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlIHRleHQteHNcIj57eyBjb2wuaGVhZGVyIH19Ojwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNCb29sZWFuRmllbGQocm93RGF0YSwgY29sKTsgZWxzZSBib29sZWFuRmllbGRcIlxyXG4gICAgICAgICAgICAgIFtjbGFzc109XCJyZXR1cm5Sb3dDbGFzcyhyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIEBpZiAoIWlzQ2hpcEZpZWxkKGNvbCkgJiYgIWNvbC5pY29uRmllbGQgJiYgIWlzSW1hZ2VGaWVsZChjb2wpICYmXHJcbiAgICAgICAgICAgICAgIWlzRW1wdHlEYXRhU291cmNlKCkpIHtcclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlciB7e1xyXG4gICAgICAgICAgICAgICAgICBjb2w/LmNlbnRyYWxpemUgJiYgJ2p1c3RpZnktY29udGVudC1jZW50ZXInXHJcbiAgICAgICAgICAgICAgICB9fSB0ZXh0LXhzIHt7IGVsbGlwc2lzVGV4dCgpICYmICdlbGxpcHNpcy10ZXh0JyB9fVwiXHJcbiAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50b29sdGlwICYmIGNvbC50b29sdGlwKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdKVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2JvdHRvbSdcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aF09XCJcclxuICAgICAgICAgICAgICAgICAgZWxsaXBzaXNUZXh0KCkgJiYgcmV0dXJuTWF4V2lkdGgoKShjb2wud2lkdGgpXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEBpZihjb2wudGFnQ29sb3IpIHtcclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWdcIlxyXG4gICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnRvb2x0aXBUYWcgJiZcclxuICAgICAgICAgICAgICAgICAgICBjb2wudG9vbHRpcFRhZyhyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnRhZ0NvbG9yKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdKVxyXG4gICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQteHMge3sgZWxsaXBzaXNUZXh0KCkgJiYgJ2VsbGlwc2lzLXRleHQnIH19XCI+XHJcbiAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmljb24pIHtcclxuICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cImNvbC5pY29uICsgJyBtci0yJ1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB7eyB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpIH19IFxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPiAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIH0gQGlmIChpc0NoaXBGaWVsZChjb2wpICYmICFjb2wuaWNvbkZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJyZXR1cm5DbGFzc0NoaXAocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhzXCJcclxuICAgICAgICAgICAgICAgICAgPnt7IHRyYW5zZm9ybVZhbHVlKHJvd0RhdGEsIGNvbCkgfX08L3NwYW5cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9IEBpZihpc0VtcHR5RGF0YVNvdXJjZSgpICYmIHRoaXMuaXNMb2FkaW5nU2tlbGV0b24oKSkge1xyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cclxuICAgICAgICAgICAgICAgIEBpZighaXNTd2l0Y2hGaWVsZChjb2wpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBmbGV4IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sLmNlbnRyYWxpemUgJiYgJ2p1c3RpZnktY29udGVudC1jZW50ZXInXHJcbiAgICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGhdPVwid2lkdGhSYW5kb20oKShjb2wsIHJvd0luZGV4KSArICclJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXNrZWxldG9uIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIj48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTYuOHB4JyxcclxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMjguOHB4JyxcclxuICAgICAgICAgICAgICAgICAgICAgICdib3JkZXItcmFkaXVzJzogJzMwcHgnXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8cC1za2VsZXRvbiBzdHlsZUNsYXNzPVwidy1mdWxsXCI+PC9wLXNrZWxldG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgQGlmIChpc0ltYWdlRmllbGQoY29sKSkge1xyXG4gICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWFnZVwiIFtzcmNdPVwibG9hZEltYWdlKHJvd0RhdGEsIGNvbClcIiAvPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICB9IEBpZiAoY29sLmljb25GaWVsZCkge1xyXG4gICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICdtYXRlcmlhbC1pY29ucyc6IGNvbC5pbmRJY29uTWF0ZXJpYWwsXHJcbiAgICAgICAgICAgICAgICAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtci0yJzogIWNvbC5pbmRJY29uTWF0ZXJpYWxcclxuICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicmV0dXJuVG9vbHRpcEljb24ocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyByZXR1cm5DbGFzc0ljb24ocm93RGF0YSwgY29sKSB9fVxyXG4gICAgICAgICAgICA8L2k+XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYm9vbGVhbkZpZWxkPlxyXG4gICAgICAgICAgICAgIEBpZiAoIWNvbC5pY29uRmllbGQgJiYgIWlzU3dpdGNoRmllbGQoY29sKSkge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMiBhbGlnbi1pdGVtcy1jZW50ZXIge3tcclxuICAgICAgICAgICAgICAgICAgY29sPy5jZW50cmFsaXplICYmICdqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJ1xyXG4gICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIlxyXG4gICAgICAgICAgICAgICAgICBjb2wudG9vbHRpcCAmJiBjb2wudG9vbHRpcChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIidib3R0b20nXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhW2NvbC5maWVsZF0gPyAndGV4dC1ncmVlbi01MDAnIDogJ3RleHQtcmVkLTUwMCdcclxuICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHRleHQtbGcgZm9udC1zZW1pYm9sZFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyByb3dEYXRhW2NvbC5maWVsZF0gPyBcImNoZWNrXCIgOiBcImNsb3NlXCIgfX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9pPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICB9IEBpZiAoaXNTd2l0Y2hGaWVsZChjb2wpKSB7XHJcbiAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuUm93Q2xhc3Mocm93RGF0YSwgY29sKSArXHJcbiAgICAgICAgICAgICAgICAgICcgZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlcidcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogMjVweFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgQGlmKGNvbC5zd2l0Y2hEaXNhYmxlKXtcclxuICAgICAgICAgICAgICAgIDxrdi1zd2l0Y2hcclxuICAgICAgICAgICAgICAgICAgKG9uU3dpdGNoQ2hhbmdlKT1cIm9uU3dpdGNoQ2hhbmdlKCRldmVudCwgcm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuc3dpdGNoRGlzYWJsZShyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW3N3aXRjaFZhbHVlXT1cInRyYW5zZm9ybVZhbHVlKHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9rdi1zd2l0Y2g+XHJcbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDxrdi1zd2l0Y2hcclxuICAgICAgICAgICAgICAgICAgKG9uU3dpdGNoQ2hhbmdlKT1cIm9uU3dpdGNoQ2hhbmdlKCRldmVudCwgcm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2w/Lm9ubHlSZWFkRmllbGQgPz8gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzd2l0Y2hWYWx1ZV09XCJ0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwva3Ytc3dpdGNoPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICB9IEBpZihpc0VtcHR5RGF0YVNvdXJjZSgpICYmIHRoaXMuaXNMb2FkaW5nU2tlbGV0b24oKSkge1xyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cclxuICAgICAgICAgICAgICAgIEBpZighaXNTd2l0Y2hGaWVsZChjb2wpKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGZsZXgge3tcclxuICAgICAgICAgICAgICAgICAgICBjb2wuY2VudHJhbGl6ZSAmJiAnanVzdGlmeS1jb250ZW50LWNlbnRlcidcclxuICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IFtzdHlsZS53aWR0aF09XCJ3aWR0aFJhbmRvbSgpKGNvbCwgcm93SW5kZXgpICsgJyUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gc3R5bGVDbGFzcz1cInctZnVsbFwiPjwvcC1za2VsZXRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxNi44cHgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICcyOC44cHgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnMzBweCdcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXNrZWxldG9uIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIj48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIH0gQGlmICghcm93Z3JvdXAgJiYgIWNvbC5ncm91cGVkICYmICFjb2wudGVtcGxhdGUpIHtcclxuICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAjdGFibGVDZWxsXHJcbiAgICAgICAgICAgIGNsYXNzPVwicm93VGFibGUge3tcclxuICAgICAgICAgICAgICBjb2wuc3R5bGVDbGFzc1xyXG4gICAgICAgICAgICAgICAgPyBjb2wuc3R5bGVDbGFzcyhyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgIDogJydcclxuICAgICAgICAgICAgfX0gXCJcclxuICAgICAgICAgICAgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBSb3cocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGUgdGV4dC14c1wiPnt7IGNvbC5oZWFkZXIgfX06PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgQGlmKCFpc0VtcHR5RGF0YVNvdXJjZSgpKSB7XHJcblxyXG4gICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzQm9vbGVhbkZpZWxkKHJvd0RhdGEsIGNvbCk7IGVsc2UgYm9vbGVhbkZpZWxkXCJcclxuICAgICAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgICByZXR1cm5Sb3dDbGFzcyhyb3dEYXRhLCBjb2wpICtcclxuICAgICAgICAgICAgICAgICcgZmxleCBmbGV4LXJvdyBnYXAtMiBhbGlnbi1pdGVtcy1jZW50ZXIgJyArXHJcbiAgICAgICAgICAgICAgICAoY29sPy5jZW50cmFsaXplICYmICdqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJylcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJcclxuICAgICAgICAgICAgICAgIGNvbC50b29sdGlwICYmIGNvbC50b29sdGlwKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdKVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCInYm90dG9tJ1wiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aF09XCJlbGxpcHNpc1RleHQoKSAmJiByZXR1cm5NYXhXaWR0aCgpKGNvbC53aWR0aClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgQGlmKGNvbC50YWdDb2xvcikge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnXCJcclxuICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJcclxuICAgICAgICAgICAgICAgICAgY29sLnRvb2x0aXBUYWcgJiZcclxuICAgICAgICAgICAgICAgICAgY29sLnRvb2x0aXBUYWcocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0pXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50YWdDb2xvcihyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICB9IEBpZiAoIWlzQ2hpcEZpZWxkKGNvbCkgJiYgIWNvbC5pY29uRmllbGQgJiYgIWlzSW1hZ2VGaWVsZChjb2wpKXtcclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQteHMge3sgZWxsaXBzaXNUZXh0KCkgJiYgJ2VsbGlwc2lzLXRleHQnIH19XCI+XHJcbiAgICAgICAgICAgICAgICBAaWYgKGNvbC5pY29uKSB7XHJcbiAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiY29sLmljb24gKyAnIG1yLTInXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAge3sgdHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKSB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICB9IEBpZiAoaXNDaGlwRmllbGQoY29sKSAmJiAhY29sLmljb25GaWVsZCkge1xyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwicmV0dXJuQ2xhc3NDaGlwKHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicmV0dXJuVG9vbHRpcEljb24ocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC14c1wiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHRyYW5zZm9ybVZhbHVlKHJvd0RhdGEsIGNvbCkgfX08L3NwYW5cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgfSBAaWYgKGlzSW1hZ2VGaWVsZChjb2wpKSB7XHJcbiAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltYWdlXCIgW3NyY109XCJsb2FkSW1hZ2Uocm93RGF0YSwgY29sKVwiIC8+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIH0gQGlmIChjb2wuaWNvbkZpZWxkKSB7XHJcbiAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgJ21hdGVyaWFsLWljb25zJzogY29sLmluZEljb25NYXRlcmlhbCxcclxuICAgICAgICAgICAgICAgICdtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIG1yLTInOiAhY29sLmluZEljb25NYXRlcmlhbFxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IHJldHVybkNsYXNzSWNvbihyb3dEYXRhLCBjb2wpIH19XHJcbiAgICAgICAgICAgIDwvaT5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNib29sZWFuRmllbGQ+XHJcbiAgICAgICAgICAgICAgQGlmICghY29sLmljb25GaWVsZCAmJiAhaXNTd2l0Y2hGaWVsZChjb2wpKSB7XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlciB7e1xyXG4gICAgICAgICAgICAgICAgICBjb2w/LmNlbnRyYWxpemUgJiYgJ2p1c3RpZnktY29udGVudC1jZW50ZXInXHJcbiAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50b29sdGlwICYmIGNvbC50b29sdGlwKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdKVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2JvdHRvbSdcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHJvd0RhdGFbY29sLmZpZWxkXSA/ICd0ZXh0LWdyZWVuLTUwMCcgOiAndGV4dC1yZWQtNTAwJ1xyXG4gICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICA+PHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgdGV4dC1sZyBmb250LXNlbWlib2xkXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHJvd0RhdGFbY29sLmZpZWxkXSA/IFwiY2hlY2tcIiA6IFwiY2xvc2VcIiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2k+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgfSBAaWYgKGlzU3dpdGNoRmllbGQoY29sKSkge1xyXG5cclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cIlxyXG4gICAgICAgICAgICAgICAgICByZXR1cm5Sb3dDbGFzcyhyb3dEYXRhLCBjb2wpICtcclxuICAgICAgICAgICAgICAgICAgJyBmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJ1xyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAyNXB4XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICBAaWYoY29sLnN3aXRjaERpc2FibGUpe1xyXG4gICAgICAgICAgICAgICAgPGt2LXN3aXRjaFxyXG4gICAgICAgICAgICAgICAgICAob25Td2l0Y2hDaGFuZ2UpPVwib25Td2l0Y2hDaGFuZ2UoJGV2ZW50LCByb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5zd2l0Y2hEaXNhYmxlKHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICBbc3dpdGNoVmFsdWVdPVwidHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L2t2LXN3aXRjaD5cclxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgPGt2LXN3aXRjaFxyXG4gICAgICAgICAgICAgICAgICAob25Td2l0Y2hDaGFuZ2UpPVwib25Td2l0Y2hDaGFuZ2UoJGV2ZW50LCByb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbD8ub25seVJlYWRGaWVsZCA/PyB0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW3N3aXRjaFZhbHVlXT1cInRyYW5zZm9ybVZhbHVlKHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9rdi1zd2l0Y2g+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIEBpZihpc0VtcHR5RGF0YVNvdXJjZSgpICYmIHRoaXMuaXNMb2FkaW5nU2tlbGV0b24oKSkge1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XHJcbiAgICAgICAgICAgICAgQGlmKCFpc1N3aXRjaEZpZWxkKGNvbCkpIHtcclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBmbGV4IHt7XHJcbiAgICAgICAgICAgICAgICAgIGNvbC5jZW50cmFsaXplICYmICdqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJ1xyXG4gICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoXT1cIndpZHRoUmFuZG9tKCkoY29sLCByb3dJbmRleCkgKyAnJSdcIj5cclxuICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gc3R5bGVDbGFzcz1cInctZnVsbFwiPjwvcC1za2VsZXRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTYuOHB4JyxcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzI4LjhweCcsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnMzBweCdcclxuICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxwLXNrZWxldG9uIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIj48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgfSBAaWYgKGNvbC50ZW1wbGF0ZSkge1xyXG4gICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgIGNsYXNzPVwicm93VGFibGUge3tcclxuICAgICAgICAgICAgICBjb2wuc3R5bGVDbGFzc1xyXG4gICAgICAgICAgICAgICAgPyBjb2wuc3R5bGVDbGFzcyhyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgICAgICAgIDogJydcclxuICAgICAgICAgICAgfX0gXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZSB0ZXh0LXhzXCI+e3sgY29sLmhlYWRlciB9fTo8L3NwYW4+XHJcbiAgICAgICAgICAgIEBpZiAoZ2V0Q3VzdG9tVGVtcGxhdGUoY29sLnRlbXBsYXRlLm5hbWUpKSB7XHJcblxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlciB7e1xyXG4gICAgICAgICAgICAgICAgY29sPy5jZW50cmFsaXplICYmICcganVzdGlmeS1jb250ZW50LWNlbnRlcidcclxuICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIlxyXG4gICAgICAgICAgICAgICAgY29sLnRvb2x0aXAgJiYgY29sLnRvb2x0aXAocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0pXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIidib3R0b20nXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIEBpZihjb2wudGFnQ29sb3IpIHtcclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRhZ1wiXHJcbiAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiY29sLnRvb2x0aXBUYWcgJiYgY29sLnRvb2x0aXBUYWcocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJjb2wudGFnQ29sb3Iocm93RGF0YSwgY29sKVwiXHJcbiAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgIH0gQGlmKCFpc0VtcHR5RGF0YVNvdXJjZSgpKSB7XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0Q3VzdG9tVGVtcGxhdGUoY29sLnRlbXBsYXRlLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3dEYXRhIH1cIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgQGlmKGlzRW1wdHlEYXRhU291cmNlKCkgJiYgdGhpcy5pc0xvYWRpbmdTa2VsZXRvbigpKSB7XHJcbiAgICAgICAgICAgIDxwLXNrZWxldG9uXHJcbiAgICAgICAgICAgICAgW3dpZHRoXT1cIndpZHRoUmFuZG9tKCkoY29sLCByb3dJbmRleCkgKyAnJSdcIlxyXG4gICAgICAgICAgICA+PC9wLXNrZWxldG9uPlxyXG4gICAgICAgICAgICB9IH1cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgfSBAaWYgKGNvbmZpZy5hY3Rpb25zICYmIGNvbmZpZy5hY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICA8dGQ+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtZW5kIHctZnVsbFwiPlxyXG4gICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjdXJzb3ItcG9pbnRlciBpY29uLW1vcmVcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJtZW51LnRvZ2dsZSgkZXZlbnQpOyBhY3RpdmVJdGVtKHJvd0RhdGEpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwhLS0gbW9yZV92ZXJ0IC0tPlxyXG4gICAgICAgICAgICAgIG1vcmVfaG9yaXpcclxuICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgPHAtdGllcmVkTWVudVxyXG4gICAgICAgICAgICAgICNtZW51XHJcbiAgICAgICAgICAgICAgW3BvcHVwXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIFttb2RlbF09XCJ0YWJsZUFjdGlvbnNbcm93SW5kZXggLSBhY3Rpb25zT2Zmc2V0XVwiXHJcbiAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJpdGVtLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC14c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9wLXRpZXJlZE1lbnU+XHJcbiAgICAgICAgICAgIDwhLS0gPHNwYW4gcFRvb2x0aXA9XCJ7eyB0YWJsZUFjdGlvbnNbcm93SW5kZXggLSBhY3Rpb25zT2Zmc2V0XVswXT8udG9vbHRpcCB9fVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPmE8L3NwYW4+IC0tPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICB9XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIiBsZXQtY29sdW1ucz5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIDx0ZFxyXG4gICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW5zLmxlbmd0aCArIDJcIlxyXG4gICAgICAgICAgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IGJvcmRlci1yYWRpdXM6IDEwcHggIWltcG9ydGFudFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJmb250LW1lZGl1bSBtLTAgdGV4dC14c1wiPk5lbmh1bSByZWdpc3RybyBlbmNvbnRyYWRvPC9wPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvcC10YWJsZT5cclxuICB9XHJcbjwvZGl2PlxyXG5cclxuPGxpbmtcclxuICByZWw9XCJzdHlsZXNoZWV0XCJcclxuICBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiXHJcbi8+XHJcblxyXG48bGlua1xyXG4gIHJlbD1cInN0eWxlc2hlZXRcIlxyXG4gIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PU1hdGVyaWFsK1N5bWJvbHMrT3V0bGluZWQ6b3Bzeix3Z2h0LEZJTEwsR1JBREA0OCw0MDAsMCwwXCJcclxuLz5cclxuIl19