@coreui/angular-pro 4.2.42 → 4.2.43

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.
@@ -54,6 +54,7 @@ export class SmartTableComponent {
54
54
  this.tableFilterValueChange = new EventEmitter();
55
55
  this.templates = { tableDetails: null, tableData: null };
56
56
  this.columnFilterTemplates = {};
57
+ this.columnLabelTemplates = {};
57
58
  this.summaryRowTemplate = null;
58
59
  this._columnFiltered = [];
59
60
  this.itemsDiffer = this.iterableDiffers.find(this.items).create();
@@ -188,6 +189,10 @@ export class SmartTableComponent {
188
189
  this.columnFilterTemplates[child.id] = child.templateRef;
189
190
  return;
190
191
  }
192
+ if (child.id.startsWith('columnLabel_')) {
193
+ this.columnLabelTemplates[child.id] = child.templateRef;
194
+ return;
195
+ }
191
196
  if (child.id === 'tableSummaryRow') {
192
197
  this.summaryRowTemplate = child.templateRef;
193
198
  return;
@@ -195,6 +200,7 @@ export class SmartTableComponent {
195
200
  this.templates[child.id] = child.templateRef;
196
201
  });
197
202
  this.columnFilterTemplates = { ...this.columnFilterTemplates };
203
+ this.columnLabelTemplates = { ...this.columnLabelTemplates };
198
204
  }
199
205
  get selectedAll() {
200
206
  const selected = this.items.some((item) => item._selected === true);
@@ -459,10 +465,10 @@ export class SmartTableComponent {
459
465
  }
460
466
  }
461
467
  SmartTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SmartTableComponent, deps: [{ token: i0.IterableDiffers }, { token: i0.KeyValueDiffers }], target: i0.ɵɵFactoryTarget.Component });
462
- SmartTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SmartTableComponent, selector: "c-smart-table", inputs: { activePage: "activePage", cleaner: "cleaner", clickableRows: "clickableRows", columns: "columns", columnFilter: "columnFilter", columnFilterValue: "columnFilterValue", columnSorter: "columnSorter", footer: "footer", header: "header", items: "items", itemsPerPage: "itemsPerPage", itemsPerPageLabel: "itemsPerPageLabel", itemsPerPageOptions: "itemsPerPageOptions", itemsPerPageSelect: "itemsPerPageSelect", loading: "loading", noItemsLabel: "noItemsLabel", pagination: "pagination", selectable: "selectable", selectAll: "selectAll", sorterValue: "sorterValue", tableFilter: "tableFilter", tableFilterLabel: "tableFilterLabel", tableFilterPlaceholder: "tableFilterPlaceholder", tableFilterValue: "tableFilterValue", tableBodyProps: "tableBodyProps", tableFootProps: "tableFootProps", tableHeadProps: "tableHeadProps", tableProps: "tableProps" }, outputs: { selectedItemsChange: "selectedItemsChange", sorterValueChange: "sorterValueChange", activePageChange: "activePageChange", itemsPerPageChange: "itemsPerPageChange", rowClick: "rowClick", columnFilterValueChange: "columnFilterValueChange", filteredItemsChange: "filteredItemsChange", tableFilterValueChange: "tableFilterValueChange" }, queries: [{ propertyName: "columnTemplates", predicate: TemplateIdDirective }], exportAs: ["cSmartTable"], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"itemsPerPageSelect || tableFilter || cleaner || templates['tableCustomHeader']\" class=\"row my-2 mx-0\">\n <div class=\"col-auto p-0\" *ngIf=\"tableFilter\">\n <ng-container *ngTemplateOutlet=\"tableFilterTemplate\"></ng-container>\n </div>\n <div class=\"col-auto p-0\" *ngIf=\"cleaner\">\n <ng-container *ngTemplateOutlet=\"tableCleanerTemplate\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"templates['tableCustomHeader'] || tableCustomHeaderTemplate\"></ng-container>\n\n <ng-template #tableFilterTemplate>\n <c-smart-table-filter\n (valueChange)=\"handleTableFilterChange($event)\"\n *ngIf=\"tableFilter\"\n [delay]=\"300\"\n [filterLabel]=\"tableFilterLabel\"\n [filterPlaceholder]=\"tableFilterPlaceholder\"\n [onEvent]=\"tableFilterEvent\"\n [value]=\"tableFilterState\"\n cFilterInput\n >\n </c-smart-table-filter>\n </ng-template>\n\n <ng-template #tableCleanerTemplate>\n <button\n (click)=\"clean($event)\"\n *ngIf=\"cleaner\"\n [disabled]=\"!isFiltered\"\n [ngClass]=\"{'ms-1': tableFilter}\"\n [tabindex]=\"0\"\n cButton\n variant=\"ghost\"\n color=\"transparent\"\n >\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\"></ng-container>\n </button>\n </ng-template>\n\n <ng-template #tableCustomHeaderTemplate>\n <div class=\"col-auto p-0 ms-auto\">\n <ng-content select=\"[customHeader]\"></ng-content>\n </div>\n </ng-template>\n</div>\n<div class=\"position-relative\">\n <table [align]=\"tableProps?.align\"\n [borderColor]=\"tableProps?.borderColor\"\n [bordered]=\"tableProps?.bordered ?? undefined\"\n [borderless]=\"tableProps?.borderless ?? undefined\"\n [caption]=\"tableProps?.caption\"\n [color]=\"tableProps?.color\"\n [hover]=\"tableProps?.hover ?? undefined\"\n [responsive]=\"tableProps?.responsive\"\n [small]=\"tableProps?.small ?? undefined\"\n [striped]=\"tableProps?.striped ?? undefined\"\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\n [cTableColor]=\"tableProps?.color\"\n cTable\n >\n <c-smart-table-head\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"header\"\n [columnFilterState]=\"columnFilterState\"\n [columnFilter]=\"columnFilter\"\n [columns]=\"columns\"\n [selectAll]=\"selectAll\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [selectable]=\"selectable\"\n [columnSorter]=\"columnSorter\"\n [sorterValue]=\"sorterValue\"\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\n [cTableColor]=\"tableHeadProps?.color\"\n [cAlign]=\"tableHeadProps?.align\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n ></c-smart-table-head>\n\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\"></ng-container>\n\n <tfoot *ngIf=\"summaryRowTemplate && !footer\">\n <ng-container *ngTemplateOutlet=\"summaryRowTemplate\"></ng-container>\n </tfoot>\n\n <c-smart-table-head\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"footer\"\n [columns]=\"columns\"\n [selectAll]=\"selectAll\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [selectable]=\"selectable\"\n [columnSorter]=\"columnSorter\"\n [sorterValue]=\"sorterValue\"\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\n [cTableColor]=\"tableFootProps?.color\"\n [cAlign]=\"tableFootProps?.align\"\n component=\"tfoot\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [summaryRowTemplate]=\"summaryRowTemplate\"\n ></c-smart-table-head>\n\n </table>\n <c-element-cover\n *ngIf=\"loading\"\n [boundaries]=\"[\n { sides: ['top'], query: 'td' },\n { sides: ['bottom'], query: 'tbody' }\n ]\"\n ></c-element-cover>\n</div>\n<ng-template [ngIf]=\"pagination || itemsPerPageSelect\">\n <div class=\"row\">\n <div class=\"col\">\n <c-smart-pagination\n (activePageChange)=\"setActivePage($event)\"\n *ngIf=\"pagination && numberOfPages > 1\"\n [activePage]=\"activePage\"\n [pages]=\"numberOfPages\">\n </c-smart-pagination>\n </div>\n <div class=\"col-auto ms-auto\">\n <c-smart-table-items-per-page-selector\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\n *ngIf=\"itemsPerPageSelect\"\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\n [itemsPerPage]=\"itemsPerPage\"\n >\n </c-smart-table-items-per-page-selector>\n </div>\n </div>\n</ng-template>\n\n<ng-template #tbodyDefaultTemplate>\n <tbody [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\n [cTableColor]=\"tableBodyProps?.color\"\n [cAlign]=\"tableBodyProps?.align\"\n >\n <ng-template ngFor let-item [ngForOf]=\"currentItems\" let-cnt=\"count\" let-i=\"index\" let-isEven=\"even\" let-isOdd=\"odd\">\n <tr [tabindex]=\"clickableRows ? 0 : -1\"\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\n (click)=\"handleRowClick({$event, item, i})\"\n [cTableActive]=\"item._props?.active ?? undefined\"\n [cTableColor]=\"item._props?.color\"\n [cAlign]=\"item._props?.align\"\n >\n <td *ngIf=\"selectable\"\n [cTableActive]=\"item?.['_cellProps']?._all?.active ?? undefined\"\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\n [cAlign]=\"item?.['_cellProps']?._all?.align\"\n >\n <input (change)=\"handleRowChecked($event, item)\"\n [checked]=\"item._selected ?? false\"\n cFormCheckInput\n [disabled]=\"(item?._selectable === false) ?? false\"\n autocomplete=\"off\"\n >\n </td>\n <ng-template ngFor let-columnName [ngForOf]=\"rawColumnNames\" let-i=\"index\">\n <ng-container\n *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {item, columnName, tdContent: item[columnName] }\">\n </ng-container>\n </ng-template>\n </tr>\n <ng-template [ngIf]=\"templates['tableDetails']\">\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\n <tr>\n <td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td>\n </tr>\n <tr class=\"p-0\">\n <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\"></ng-container>\n </td>\n </tr>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\"></ng-container>\n </tbody>\n</ng-template>\n\n<ng-template #columnDefaultTemplate let-item=\"item\" let-columnName=\"columnName\" let-tdContent=\"tdContent\">\n <td\n [cTableActive]=\"tableDataCellProps(item, columnName)?.['active']\"\n [cTableColor]=\"tableDataCellProps(item, columnName)?.color\"\n [cAlign]=\"tableDataCellProps(item, columnName)?.align\"\n [ngClass]=\"tableDataCellClasses(item, columnName)\"\n [cHtmlAttr]=\"tableDataCellProps(item, columnName)?.['_attributes'] ?? undefined\"\n >\n {{tdContent}}\n </td>\n</ng-template>\n\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\n<!-- <tr class=\"p-0\">-->\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!--</ng-template>-->\n\n<ng-template #noItemsDefaultTemplate>\n <tr *ngIf=\"!currentItems.length\">\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{noItemsLabel}}</td>\n </tr>\n</ng-template>\n\n<!--todo: filterIconCustomTemplate-->\n<ng-template #filterIconTemplate>\n <svg viewBox=\"0 0 512 512\" xmlns=\"http://www.w3.org/2000/svg\" pointer-events=\"none\" role=\"img\"\n class=\"icon icon-custom-size\" width=\"18\">\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\"\n class=\"ci-primary\">\n </polygon>\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\"\n class=\"ci-primary\">\n </polygon>\n </svg>\n</ng-template>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.ElementCoverComponent, selector: "c-element-cover, [cElementCover]", inputs: ["boundaries", "opacity"] }, { kind: "directive", type: i3.TableDirective, selector: "table[cTable]", inputs: ["align", "borderColor", "bordered", "borderless", "caption", "color", "hover", "responsive", "small", "striped", "stripedColumns"] }, { kind: "directive", type: i4.TableColorDirective, selector: "[cTableColor]", inputs: ["cTableColor"] }, { kind: "directive", type: i5.TableActiveDirective, selector: "[cTableActive]", inputs: ["cTableActive"] }, { kind: "component", type: i6.SmartPaginationComponent, selector: "c-smart-pagination", inputs: ["activePage", "arrows", "doubleArrows", "dots", "limit", "pages", "firstButton", "lastButton", "nextButton", "previousButton", "align", "size", "role"], outputs: ["activePageChange"], exportAs: ["cSmartPagination"] }, { kind: "directive", type: i7.FormCheckInputDirective, selector: "input[cFormCheckInput]", inputs: ["type", "indeterminate", "valid", "checked"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[cButton]", inputs: ["active", "color", "disabled", "shape", "size", "type", "variant"], exportAs: ["cButton"] }, { kind: "directive", type: i9.HtmlAttributesDirective, selector: "[cHtmlAttr]", inputs: ["cHtmlAttr"], exportAs: ["cHtmlAttr"] }, { kind: "directive", type: i10.AlignDirective, selector: "[cAlign]", inputs: ["cAlign"] }, { kind: "component", type: i11.SmartTableFilterComponent, selector: "c-smart-table-filter", inputs: ["filterLabel", "filterPlaceholder", "sizing"] }, { kind: "component", type: i12.SmartTableItemsPerPageSelectorComponent, selector: "c-smart-table-items-per-page-selector", inputs: ["itemsPerPage", "itemsPerPageLabel", "itemsPerPageOptions"], outputs: ["itemsPerPageChange"] }, { kind: "component", type: i13.SmartTableHeadComponent, selector: "c-smart-table-head", inputs: ["columnFilter", "columnFilterState", "columnSorter", "component", "columns", "selectable", "selectAll", "selectedAll", "sorterValue", "columnFilterTemplates", "summaryRowTemplate"], outputs: ["columnFilterStateChange", "sorterStateChange", "selectAllChange"] }, { kind: "directive", type: i14.FilterInputDirective, selector: "[cFilterInput]", inputs: ["delay", "onEvent", "value"], outputs: ["valueChange"], exportAs: ["cFilterInput"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
468
+ SmartTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SmartTableComponent, selector: "c-smart-table", inputs: { activePage: "activePage", cleaner: "cleaner", clickableRows: "clickableRows", columns: "columns", columnFilter: "columnFilter", columnFilterValue: "columnFilterValue", columnSorter: "columnSorter", footer: "footer", header: "header", items: "items", itemsPerPage: "itemsPerPage", itemsPerPageLabel: "itemsPerPageLabel", itemsPerPageOptions: "itemsPerPageOptions", itemsPerPageSelect: "itemsPerPageSelect", loading: "loading", noItemsLabel: "noItemsLabel", pagination: "pagination", selectable: "selectable", selectAll: "selectAll", sorterValue: "sorterValue", tableFilter: "tableFilter", tableFilterLabel: "tableFilterLabel", tableFilterPlaceholder: "tableFilterPlaceholder", tableFilterValue: "tableFilterValue", tableBodyProps: "tableBodyProps", tableFootProps: "tableFootProps", tableHeadProps: "tableHeadProps", tableProps: "tableProps" }, outputs: { selectedItemsChange: "selectedItemsChange", sorterValueChange: "sorterValueChange", activePageChange: "activePageChange", itemsPerPageChange: "itemsPerPageChange", rowClick: "rowClick", columnFilterValueChange: "columnFilterValueChange", filteredItemsChange: "filteredItemsChange", tableFilterValueChange: "tableFilterValueChange" }, queries: [{ propertyName: "columnTemplates", predicate: TemplateIdDirective }], exportAs: ["cSmartTable"], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"itemsPerPageSelect || tableFilter || cleaner || templates['tableCustomHeader']\" class=\"row my-2 mx-0\">\n <div class=\"col-auto p-0\" *ngIf=\"tableFilter\">\n <ng-container *ngTemplateOutlet=\"tableFilterTemplate\"></ng-container>\n </div>\n <div class=\"col-auto p-0\" *ngIf=\"cleaner\">\n <ng-container *ngTemplateOutlet=\"tableCleanerTemplate\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"templates['tableCustomHeader'] || tableCustomHeaderTemplate\"></ng-container>\n\n <ng-template #tableFilterTemplate>\n <c-smart-table-filter\n (valueChange)=\"handleTableFilterChange($event)\"\n *ngIf=\"tableFilter\"\n [delay]=\"300\"\n [filterLabel]=\"tableFilterLabel\"\n [filterPlaceholder]=\"tableFilterPlaceholder\"\n [onEvent]=\"tableFilterEvent\"\n [value]=\"tableFilterState\"\n cFilterInput\n >\n </c-smart-table-filter>\n </ng-template>\n\n <ng-template #tableCleanerTemplate>\n <button\n (click)=\"clean($event)\"\n *ngIf=\"cleaner\"\n [disabled]=\"!isFiltered\"\n [ngClass]=\"{'ms-1': tableFilter}\"\n [tabindex]=\"0\"\n cButton\n variant=\"ghost\"\n color=\"transparent\"\n >\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\"></ng-container>\n </button>\n </ng-template>\n\n <ng-template #tableCustomHeaderTemplate>\n <div class=\"col-auto p-0 ms-auto\">\n <ng-content select=\"[customHeader]\"></ng-content>\n </div>\n </ng-template>\n</div>\n<div class=\"position-relative\">\n <table [align]=\"tableProps?.align\"\n [borderColor]=\"tableProps?.borderColor\"\n [bordered]=\"tableProps?.bordered ?? undefined\"\n [borderless]=\"tableProps?.borderless ?? undefined\"\n [caption]=\"tableProps?.caption\"\n [color]=\"tableProps?.color\"\n [hover]=\"tableProps?.hover ?? undefined\"\n [responsive]=\"tableProps?.responsive\"\n [small]=\"tableProps?.small ?? undefined\"\n [striped]=\"tableProps?.striped ?? undefined\"\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\n [cTableColor]=\"tableProps?.color\"\n cTable\n >\n <c-smart-table-head\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"header\"\n [columnFilterState]=\"columnFilterState\"\n [columnFilter]=\"columnFilter\"\n [columns]=\"columns\"\n [selectAll]=\"selectAll\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [selectable]=\"selectable\"\n [columnSorter]=\"columnSorter\"\n [sorterValue]=\"sorterValue\"\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\n [cTableColor]=\"tableHeadProps?.color\"\n [cAlign]=\"tableHeadProps?.align\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n ></c-smart-table-head>\n\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\"></ng-container>\n\n <tfoot *ngIf=\"summaryRowTemplate && !footer\">\n <ng-container *ngTemplateOutlet=\"summaryRowTemplate\"></ng-container>\n </tfoot>\n\n <c-smart-table-head\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"footer\"\n [columns]=\"columns\"\n [selectAll]=\"selectAll\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [selectable]=\"selectable\"\n [columnSorter]=\"columnSorter\"\n [sorterValue]=\"sorterValue\"\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\n [cTableColor]=\"tableFootProps?.color\"\n [cAlign]=\"tableFootProps?.align\"\n component=\"tfoot\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [summaryRowTemplate]=\"summaryRowTemplate\"\n ></c-smart-table-head>\n\n </table>\n <c-element-cover\n *ngIf=\"loading\"\n [boundaries]=\"[\n { sides: ['top'], query: 'td' },\n { sides: ['bottom'], query: 'tbody' }\n ]\"\n ></c-element-cover>\n</div>\n<ng-template [ngIf]=\"pagination || itemsPerPageSelect\">\n <div class=\"row\">\n <div class=\"col\">\n <c-smart-pagination\n (activePageChange)=\"setActivePage($event)\"\n *ngIf=\"pagination && numberOfPages > 1\"\n [activePage]=\"activePage\"\n [pages]=\"numberOfPages\">\n </c-smart-pagination>\n </div>\n <div class=\"col-auto ms-auto\">\n <c-smart-table-items-per-page-selector\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\n *ngIf=\"itemsPerPageSelect\"\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\n [itemsPerPage]=\"itemsPerPage\"\n >\n </c-smart-table-items-per-page-selector>\n </div>\n </div>\n</ng-template>\n\n<ng-template #tbodyDefaultTemplate>\n <tbody [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\n [cTableColor]=\"tableBodyProps?.color\"\n [cAlign]=\"tableBodyProps?.align\"\n >\n <ng-template ngFor let-item [ngForOf]=\"currentItems\" let-cnt=\"count\" let-i=\"index\" let-isEven=\"even\" let-isOdd=\"odd\">\n <tr [tabindex]=\"clickableRows ? 0 : -1\"\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\n (click)=\"handleRowClick({$event, item, i})\"\n [cTableActive]=\"item._props?.active ?? undefined\"\n [cTableColor]=\"item._props?.color\"\n [cAlign]=\"item._props?.align\"\n >\n <td *ngIf=\"selectable\"\n [cTableActive]=\"item?.['_cellProps']?._all?.active ?? undefined\"\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\n [cAlign]=\"item?.['_cellProps']?._all?.align\"\n >\n <input (change)=\"handleRowChecked($event, item)\"\n [checked]=\"item._selected ?? false\"\n cFormCheckInput\n [disabled]=\"(item?._selectable === false) ?? false\"\n autocomplete=\"off\"\n >\n </td>\n <ng-template ngFor let-columnName [ngForOf]=\"rawColumnNames\" let-i=\"index\">\n <ng-container\n *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {item, columnName, tdContent: item[columnName] }\">\n </ng-container>\n </ng-template>\n </tr>\n <ng-template [ngIf]=\"templates['tableDetails']\">\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\n <tr>\n <td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td>\n </tr>\n <tr class=\"p-0\">\n <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\"></ng-container>\n </td>\n </tr>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\"></ng-container>\n </tbody>\n</ng-template>\n\n<ng-template #columnDefaultTemplate let-item=\"item\" let-columnName=\"columnName\" let-tdContent=\"tdContent\">\n <td\n [cTableActive]=\"tableDataCellProps(item, columnName)?.['active']\"\n [cTableColor]=\"tableDataCellProps(item, columnName)?.color\"\n [cAlign]=\"tableDataCellProps(item, columnName)?.align\"\n [ngClass]=\"tableDataCellClasses(item, columnName)\"\n [cHtmlAttr]=\"tableDataCellProps(item, columnName)?.['_attributes'] ?? undefined\"\n >\n {{tdContent}}\n </td>\n</ng-template>\n\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\n<!-- <tr class=\"p-0\">-->\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!--</ng-template>-->\n\n<ng-template #noItemsDefaultTemplate>\n <tr *ngIf=\"!currentItems.length\">\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{noItemsLabel}}</td>\n </tr>\n</ng-template>\n\n<!--todo: filterIconCustomTemplate-->\n<ng-template #filterIconTemplate>\n <svg viewBox=\"0 0 512 512\" xmlns=\"http://www.w3.org/2000/svg\" pointer-events=\"none\" role=\"img\"\n class=\"icon icon-custom-size\" width=\"18\">\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\"\n class=\"ci-primary\">\n </polygon>\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\"\n class=\"ci-primary\">\n </polygon>\n </svg>\n</ng-template>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.ElementCoverComponent, selector: "c-element-cover, [cElementCover]", inputs: ["boundaries", "opacity"] }, { kind: "directive", type: i3.TableDirective, selector: "table[cTable]", inputs: ["align", "borderColor", "bordered", "borderless", "caption", "color", "hover", "responsive", "small", "striped", "stripedColumns"] }, { kind: "directive", type: i4.TableColorDirective, selector: "[cTableColor]", inputs: ["cTableColor"] }, { kind: "directive", type: i5.TableActiveDirective, selector: "[cTableActive]", inputs: ["cTableActive"] }, { kind: "component", type: i6.SmartPaginationComponent, selector: "c-smart-pagination", inputs: ["activePage", "arrows", "doubleArrows", "dots", "limit", "pages", "firstButton", "lastButton", "nextButton", "previousButton", "align", "size", "role"], outputs: ["activePageChange"], exportAs: ["cSmartPagination"] }, { kind: "directive", type: i7.FormCheckInputDirective, selector: "input[cFormCheckInput]", inputs: ["type", "indeterminate", "valid", "checked"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[cButton]", inputs: ["active", "color", "disabled", "shape", "size", "type", "variant"], exportAs: ["cButton"] }, { kind: "directive", type: i9.HtmlAttributesDirective, selector: "[cHtmlAttr]", inputs: ["cHtmlAttr"], exportAs: ["cHtmlAttr"] }, { kind: "directive", type: i10.AlignDirective, selector: "[cAlign]", inputs: ["cAlign"] }, { kind: "component", type: i11.SmartTableFilterComponent, selector: "c-smart-table-filter", inputs: ["filterLabel", "filterPlaceholder", "sizing"] }, { kind: "component", type: i12.SmartTableItemsPerPageSelectorComponent, selector: "c-smart-table-items-per-page-selector", inputs: ["itemsPerPage", "itemsPerPageLabel", "itemsPerPageOptions"], outputs: ["itemsPerPageChange"] }, { kind: "component", type: i13.SmartTableHeadComponent, selector: "c-smart-table-head", inputs: ["columnFilter", "columnFilterState", "columnSorter", "component", "columns", "selectable", "selectAll", "selectedAll", "sorterValue", "columnFilterTemplates", "columnLabelTemplates", "summaryRowTemplate"], outputs: ["columnFilterStateChange", "sorterStateChange", "selectAllChange"] }, { kind: "directive", type: i14.FilterInputDirective, selector: "[cFilterInput]", inputs: ["delay", "onEvent", "value"], outputs: ["valueChange"], exportAs: ["cFilterInput"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
463
469
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SmartTableComponent, decorators: [{
464
470
  type: Component,
465
- args: [{ selector: 'c-smart-table', exportAs: 'cSmartTable', template: "<div *ngIf=\"itemsPerPageSelect || tableFilter || cleaner || templates['tableCustomHeader']\" class=\"row my-2 mx-0\">\n <div class=\"col-auto p-0\" *ngIf=\"tableFilter\">\n <ng-container *ngTemplateOutlet=\"tableFilterTemplate\"></ng-container>\n </div>\n <div class=\"col-auto p-0\" *ngIf=\"cleaner\">\n <ng-container *ngTemplateOutlet=\"tableCleanerTemplate\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"templates['tableCustomHeader'] || tableCustomHeaderTemplate\"></ng-container>\n\n <ng-template #tableFilterTemplate>\n <c-smart-table-filter\n (valueChange)=\"handleTableFilterChange($event)\"\n *ngIf=\"tableFilter\"\n [delay]=\"300\"\n [filterLabel]=\"tableFilterLabel\"\n [filterPlaceholder]=\"tableFilterPlaceholder\"\n [onEvent]=\"tableFilterEvent\"\n [value]=\"tableFilterState\"\n cFilterInput\n >\n </c-smart-table-filter>\n </ng-template>\n\n <ng-template #tableCleanerTemplate>\n <button\n (click)=\"clean($event)\"\n *ngIf=\"cleaner\"\n [disabled]=\"!isFiltered\"\n [ngClass]=\"{'ms-1': tableFilter}\"\n [tabindex]=\"0\"\n cButton\n variant=\"ghost\"\n color=\"transparent\"\n >\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\"></ng-container>\n </button>\n </ng-template>\n\n <ng-template #tableCustomHeaderTemplate>\n <div class=\"col-auto p-0 ms-auto\">\n <ng-content select=\"[customHeader]\"></ng-content>\n </div>\n </ng-template>\n</div>\n<div class=\"position-relative\">\n <table [align]=\"tableProps?.align\"\n [borderColor]=\"tableProps?.borderColor\"\n [bordered]=\"tableProps?.bordered ?? undefined\"\n [borderless]=\"tableProps?.borderless ?? undefined\"\n [caption]=\"tableProps?.caption\"\n [color]=\"tableProps?.color\"\n [hover]=\"tableProps?.hover ?? undefined\"\n [responsive]=\"tableProps?.responsive\"\n [small]=\"tableProps?.small ?? undefined\"\n [striped]=\"tableProps?.striped ?? undefined\"\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\n [cTableColor]=\"tableProps?.color\"\n cTable\n >\n <c-smart-table-head\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"header\"\n [columnFilterState]=\"columnFilterState\"\n [columnFilter]=\"columnFilter\"\n [columns]=\"columns\"\n [selectAll]=\"selectAll\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [selectable]=\"selectable\"\n [columnSorter]=\"columnSorter\"\n [sorterValue]=\"sorterValue\"\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\n [cTableColor]=\"tableHeadProps?.color\"\n [cAlign]=\"tableHeadProps?.align\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n ></c-smart-table-head>\n\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\"></ng-container>\n\n <tfoot *ngIf=\"summaryRowTemplate && !footer\">\n <ng-container *ngTemplateOutlet=\"summaryRowTemplate\"></ng-container>\n </tfoot>\n\n <c-smart-table-head\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"footer\"\n [columns]=\"columns\"\n [selectAll]=\"selectAll\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [selectable]=\"selectable\"\n [columnSorter]=\"columnSorter\"\n [sorterValue]=\"sorterValue\"\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\n [cTableColor]=\"tableFootProps?.color\"\n [cAlign]=\"tableFootProps?.align\"\n component=\"tfoot\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [summaryRowTemplate]=\"summaryRowTemplate\"\n ></c-smart-table-head>\n\n </table>\n <c-element-cover\n *ngIf=\"loading\"\n [boundaries]=\"[\n { sides: ['top'], query: 'td' },\n { sides: ['bottom'], query: 'tbody' }\n ]\"\n ></c-element-cover>\n</div>\n<ng-template [ngIf]=\"pagination || itemsPerPageSelect\">\n <div class=\"row\">\n <div class=\"col\">\n <c-smart-pagination\n (activePageChange)=\"setActivePage($event)\"\n *ngIf=\"pagination && numberOfPages > 1\"\n [activePage]=\"activePage\"\n [pages]=\"numberOfPages\">\n </c-smart-pagination>\n </div>\n <div class=\"col-auto ms-auto\">\n <c-smart-table-items-per-page-selector\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\n *ngIf=\"itemsPerPageSelect\"\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\n [itemsPerPage]=\"itemsPerPage\"\n >\n </c-smart-table-items-per-page-selector>\n </div>\n </div>\n</ng-template>\n\n<ng-template #tbodyDefaultTemplate>\n <tbody [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\n [cTableColor]=\"tableBodyProps?.color\"\n [cAlign]=\"tableBodyProps?.align\"\n >\n <ng-template ngFor let-item [ngForOf]=\"currentItems\" let-cnt=\"count\" let-i=\"index\" let-isEven=\"even\" let-isOdd=\"odd\">\n <tr [tabindex]=\"clickableRows ? 0 : -1\"\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\n (click)=\"handleRowClick({$event, item, i})\"\n [cTableActive]=\"item._props?.active ?? undefined\"\n [cTableColor]=\"item._props?.color\"\n [cAlign]=\"item._props?.align\"\n >\n <td *ngIf=\"selectable\"\n [cTableActive]=\"item?.['_cellProps']?._all?.active ?? undefined\"\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\n [cAlign]=\"item?.['_cellProps']?._all?.align\"\n >\n <input (change)=\"handleRowChecked($event, item)\"\n [checked]=\"item._selected ?? false\"\n cFormCheckInput\n [disabled]=\"(item?._selectable === false) ?? false\"\n autocomplete=\"off\"\n >\n </td>\n <ng-template ngFor let-columnName [ngForOf]=\"rawColumnNames\" let-i=\"index\">\n <ng-container\n *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {item, columnName, tdContent: item[columnName] }\">\n </ng-container>\n </ng-template>\n </tr>\n <ng-template [ngIf]=\"templates['tableDetails']\">\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\n <tr>\n <td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td>\n </tr>\n <tr class=\"p-0\">\n <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\"></ng-container>\n </td>\n </tr>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\"></ng-container>\n </tbody>\n</ng-template>\n\n<ng-template #columnDefaultTemplate let-item=\"item\" let-columnName=\"columnName\" let-tdContent=\"tdContent\">\n <td\n [cTableActive]=\"tableDataCellProps(item, columnName)?.['active']\"\n [cTableColor]=\"tableDataCellProps(item, columnName)?.color\"\n [cAlign]=\"tableDataCellProps(item, columnName)?.align\"\n [ngClass]=\"tableDataCellClasses(item, columnName)\"\n [cHtmlAttr]=\"tableDataCellProps(item, columnName)?.['_attributes'] ?? undefined\"\n >\n {{tdContent}}\n </td>\n</ng-template>\n\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\n<!-- <tr class=\"p-0\">-->\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!--</ng-template>-->\n\n<ng-template #noItemsDefaultTemplate>\n <tr *ngIf=\"!currentItems.length\">\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{noItemsLabel}}</td>\n </tr>\n</ng-template>\n\n<!--todo: filterIconCustomTemplate-->\n<ng-template #filterIconTemplate>\n <svg viewBox=\"0 0 512 512\" xmlns=\"http://www.w3.org/2000/svg\" pointer-events=\"none\" role=\"img\"\n class=\"icon icon-custom-size\" width=\"18\">\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\"\n class=\"ci-primary\">\n </polygon>\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\"\n class=\"ci-primary\">\n </polygon>\n </svg>\n</ng-template>\n", styles: [":host{display:block}\n"] }]
471
+ args: [{ selector: 'c-smart-table', exportAs: 'cSmartTable', template: "<div *ngIf=\"itemsPerPageSelect || tableFilter || cleaner || templates['tableCustomHeader']\" class=\"row my-2 mx-0\">\n <div class=\"col-auto p-0\" *ngIf=\"tableFilter\">\n <ng-container *ngTemplateOutlet=\"tableFilterTemplate\"></ng-container>\n </div>\n <div class=\"col-auto p-0\" *ngIf=\"cleaner\">\n <ng-container *ngTemplateOutlet=\"tableCleanerTemplate\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"templates['tableCustomHeader'] || tableCustomHeaderTemplate\"></ng-container>\n\n <ng-template #tableFilterTemplate>\n <c-smart-table-filter\n (valueChange)=\"handleTableFilterChange($event)\"\n *ngIf=\"tableFilter\"\n [delay]=\"300\"\n [filterLabel]=\"tableFilterLabel\"\n [filterPlaceholder]=\"tableFilterPlaceholder\"\n [onEvent]=\"tableFilterEvent\"\n [value]=\"tableFilterState\"\n cFilterInput\n >\n </c-smart-table-filter>\n </ng-template>\n\n <ng-template #tableCleanerTemplate>\n <button\n (click)=\"clean($event)\"\n *ngIf=\"cleaner\"\n [disabled]=\"!isFiltered\"\n [ngClass]=\"{'ms-1': tableFilter}\"\n [tabindex]=\"0\"\n cButton\n variant=\"ghost\"\n color=\"transparent\"\n >\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\"></ng-container>\n </button>\n </ng-template>\n\n <ng-template #tableCustomHeaderTemplate>\n <div class=\"col-auto p-0 ms-auto\">\n <ng-content select=\"[customHeader]\"></ng-content>\n </div>\n </ng-template>\n</div>\n<div class=\"position-relative\">\n <table [align]=\"tableProps?.align\"\n [borderColor]=\"tableProps?.borderColor\"\n [bordered]=\"tableProps?.bordered ?? undefined\"\n [borderless]=\"tableProps?.borderless ?? undefined\"\n [caption]=\"tableProps?.caption\"\n [color]=\"tableProps?.color\"\n [hover]=\"tableProps?.hover ?? undefined\"\n [responsive]=\"tableProps?.responsive\"\n [small]=\"tableProps?.small ?? undefined\"\n [striped]=\"tableProps?.striped ?? undefined\"\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\n [cTableColor]=\"tableProps?.color\"\n cTable\n >\n <c-smart-table-head\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"header\"\n [columnFilterState]=\"columnFilterState\"\n [columnFilter]=\"columnFilter\"\n [columns]=\"columns\"\n [selectAll]=\"selectAll\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [selectable]=\"selectable\"\n [columnSorter]=\"columnSorter\"\n [sorterValue]=\"sorterValue\"\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\n [cTableColor]=\"tableHeadProps?.color\"\n [cAlign]=\"tableHeadProps?.align\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n ></c-smart-table-head>\n\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\"></ng-container>\n\n <tfoot *ngIf=\"summaryRowTemplate && !footer\">\n <ng-container *ngTemplateOutlet=\"summaryRowTemplate\"></ng-container>\n </tfoot>\n\n <c-smart-table-head\n (selectAllChange)=\"handleSelectAllChange($event)\"\n (sorterStateChange)=\"handleSortChange($event)\"\n *ngIf=\"footer\"\n [columns]=\"columns\"\n [selectAll]=\"selectAll\"\n [selectedAll]=\"(selectedAllSubject | async) ?? false\"\n [selectable]=\"selectable\"\n [columnSorter]=\"columnSorter\"\n [sorterValue]=\"sorterValue\"\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\n [cTableColor]=\"tableFootProps?.color\"\n [cAlign]=\"tableFootProps?.align\"\n component=\"tfoot\"\n [columnFilterTemplates]=\"columnFilterTemplates\"\n [columnLabelTemplates]=\"columnLabelTemplates\"\n [summaryRowTemplate]=\"summaryRowTemplate\"\n ></c-smart-table-head>\n\n </table>\n <c-element-cover\n *ngIf=\"loading\"\n [boundaries]=\"[\n { sides: ['top'], query: 'td' },\n { sides: ['bottom'], query: 'tbody' }\n ]\"\n ></c-element-cover>\n</div>\n<ng-template [ngIf]=\"pagination || itemsPerPageSelect\">\n <div class=\"row\">\n <div class=\"col\">\n <c-smart-pagination\n (activePageChange)=\"setActivePage($event)\"\n *ngIf=\"pagination && numberOfPages > 1\"\n [activePage]=\"activePage\"\n [pages]=\"numberOfPages\">\n </c-smart-pagination>\n </div>\n <div class=\"col-auto ms-auto\">\n <c-smart-table-items-per-page-selector\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\n *ngIf=\"itemsPerPageSelect\"\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\n [itemsPerPage]=\"itemsPerPage\"\n >\n </c-smart-table-items-per-page-selector>\n </div>\n </div>\n</ng-template>\n\n<ng-template #tbodyDefaultTemplate>\n <tbody [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\n [cTableColor]=\"tableBodyProps?.color\"\n [cAlign]=\"tableBodyProps?.align\"\n >\n <ng-template ngFor let-item [ngForOf]=\"currentItems\" let-cnt=\"count\" let-i=\"index\" let-isEven=\"even\" let-isOdd=\"odd\">\n <tr [tabindex]=\"clickableRows ? 0 : -1\"\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\n (click)=\"handleRowClick({$event, item, i})\"\n [cTableActive]=\"item._props?.active ?? undefined\"\n [cTableColor]=\"item._props?.color\"\n [cAlign]=\"item._props?.align\"\n >\n <td *ngIf=\"selectable\"\n [cTableActive]=\"item?.['_cellProps']?._all?.active ?? undefined\"\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\n [cAlign]=\"item?.['_cellProps']?._all?.align\"\n >\n <input (change)=\"handleRowChecked($event, item)\"\n [checked]=\"item._selected ?? false\"\n cFormCheckInput\n [disabled]=\"(item?._selectable === false) ?? false\"\n autocomplete=\"off\"\n >\n </td>\n <ng-template ngFor let-columnName [ngForOf]=\"rawColumnNames\" let-i=\"index\">\n <ng-container\n *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {item, columnName, tdContent: item[columnName] }\">\n </ng-container>\n </ng-template>\n </tr>\n <ng-template [ngIf]=\"templates['tableDetails']\">\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\n <tr>\n <td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td>\n </tr>\n <tr class=\"p-0\">\n <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\"></ng-container>\n </td>\n </tr>\n </ng-template>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\"></ng-container>\n </tbody>\n</ng-template>\n\n<ng-template #columnDefaultTemplate let-item=\"item\" let-columnName=\"columnName\" let-tdContent=\"tdContent\">\n <td\n [cTableActive]=\"tableDataCellProps(item, columnName)?.['active']\"\n [cTableColor]=\"tableDataCellProps(item, columnName)?.color\"\n [cAlign]=\"tableDataCellProps(item, columnName)?.align\"\n [ngClass]=\"tableDataCellClasses(item, columnName)\"\n [cHtmlAttr]=\"tableDataCellProps(item, columnName)?.['_attributes'] ?? undefined\"\n >\n {{tdContent}}\n </td>\n</ng-template>\n\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\n<!-- <tr class=\"p-0\">-->\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!--</ng-template>-->\n\n<ng-template #noItemsDefaultTemplate>\n <tr *ngIf=\"!currentItems.length\">\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{noItemsLabel}}</td>\n </tr>\n</ng-template>\n\n<!--todo: filterIconCustomTemplate-->\n<ng-template #filterIconTemplate>\n <svg viewBox=\"0 0 512 512\" xmlns=\"http://www.w3.org/2000/svg\" pointer-events=\"none\" role=\"img\"\n class=\"icon icon-custom-size\" width=\"18\">\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\"\n class=\"ci-primary\">\n </polygon>\n <polygon\n fill=\"var(--ci-primary-color, currentColor)\"\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\"\n class=\"ci-primary\">\n </polygon>\n </svg>\n</ng-template>\n", styles: [":host{display:block}\n"] }]
466
472
  }], ctorParameters: function () { return [{ type: i0.IterableDiffers }, { type: i0.KeyValueDiffers }]; }, propDecorators: { activePage: [{
467
473
  type: Input
468
474
  }], cleaner: [{
@@ -539,4 +545,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
539
545
  type: ContentChildren,
540
546
  args: [TemplateIdDirective]
541
547
  }] } });
542
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9zbWFydC10YWJsZS9zbWFydC10YWJsZS9zbWFydC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBTUwsTUFBTSxFQUtQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsb0JBQW9CLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBZ0J2QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRbkQsTUFBTSxPQUFPLG1CQUFtQjtJQVc5QixZQUNVLGVBQWdDLEVBQ2hDLGVBQWdDO1FBRGhDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFZakMsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQTRCLEtBQUssQ0FBQyxDQUFDO1FBaUI1RSxnQkFBVyxHQUFHLENBQUMsQ0FBQztRQVdoQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBVzFCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBK0JoQyx1QkFBa0IsR0FBdUIsRUFBRSxDQUFDO1FBYTVDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFXekIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQWdCekIsV0FBTSxHQUFvQixFQUFnQyxDQUFDO1FBVzNELGtCQUFh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LE1BQU07Z0JBQ1ksc0JBQXNCO3NCQUF4QyxNQUFNO2dCQUUrQixlQUFlO3NCQUFwRCxlQUFlO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBJdGVyYWJsZURpZmZlcixcbiAgSXRlcmFibGVEaWZmZXJzLFxuICBLZXlWYWx1ZURpZmZlcixcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSwgTnVtYmVySW5wdXQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElUYWJsZSB9IGZyb20gJy4uLy4uL3RhYmxlL3RhYmxlLnR5cGUnO1xuaW1wb3J0IHtcbiAgSUNvbHVtbixcbiAgSUNvbHVtbkZpbHRlcixcbiAgSUNvbHVtbkZpbHRlclZhbHVlLFxuICBJSXRlbSxcbiAgSUl0ZW1JbnRlcm5hbCxcbiAgSVNtYXJ0VGFibGUsXG4gIElTb3J0ZXIsXG4gIElTb3J0ZXJWYWx1ZSxcbiAgSVRhYmxlRmlsdGVyLFxuICBJVGFibGVHcm91cFByb3BzLFxuICBJdGVtc1BlclBhZ2VTZWxlY3Rcbn0gZnJvbSAnLi4vc21hcnQtdGFibGUudHlwZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZUlkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYy1zbWFydC10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zbWFydC10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGV4cG9ydEFzOiAnY1NtYXJ0VGFibGUnXG59KVxuZXhwb3J0IGNsYXNzIFNtYXJ0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBJU21hcnRUYWJsZSwgQWZ0ZXJDb250ZW50SW5pdCwgT25DaGFuZ2VzIHtcblxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfYWN0aXZlUGFnZTogTnVtYmVySW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9jbGVhbmVyOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9jbGlja2FibGVSb3dzOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9mb290ZXI6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2hlYWRlcjogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfaXRlbXNQZXJQYWdlOiBOdW1iZXJJbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3BhZ2luYXRpb246IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3NlbGVjdGFibGU6IEJvb2xlYW5JbnB1dDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGl0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzLFxuICAgIHByaXZhdGUga2V5VmFsdWVEaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnNcbiAgKSB7XG4gICAgdGhpcy5pdGVtc0RpZmZlciA9IHRoaXMuaXRlcmFibGVEaWZmZXJzLmZpbmQodGhpcy5pdGVtcykuY3JlYXRlKCk7XG4gICAgdGhpcy5pdGVtc0ZpbHRlcmVkRGlmZmVyID0gdGhpcy5pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLl9jb2x1bW5GaWx0ZXJlZCkuY3JlYXRlKCk7XG4gICAgdGhpcy5jb2x1bUZpbHRlclZhbHVlRGlmZmVyID0gdGhpcy5rZXlWYWx1ZURpZmZlcnMuZmluZCh0aGlzLmNvbHVtbkZpbHRlclZhbHVlKS5jcmVhdGUoKTtcbiAgICB0aGlzLnNvcnRlclZhbHVlRGlmZmVyID0gdGhpcy5rZXlWYWx1ZURpZmZlcnMuZmluZCh0aGlzLnNvcnRlclZhbHVlKS5jcmVhdGUoKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZEFsbFN1YmplY3QubmV4dCh0aGlzLnNlbGVjdGVkQWxsKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHJlYWRvbmx5IHNlbGVjdGVkQWxsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbiB8ICdpbmRldGVybWluYXRlJz4oZmFsc2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXRlbXNEaWZmZXI6IEl0ZXJhYmxlRGlmZmVyPGFueT4gfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1zRmlsdGVyZWREaWZmZXI6IEl0ZXJhYmxlRGlmZmVyPGFueT4gfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbHVtRmlsdGVyVmFsdWVEaWZmZXI6IEtleVZhbHVlRGlmZmVyPGFueSwgYW55PiB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc29ydGVyVmFsdWVEaWZmZXI6IEtleVZhbHVlRGlmZmVyPGFueSwgYW55PiB8IG51bGw7XG5cbiAgQElucHV0KClcbiAgc2V0IGFjdGl2ZVBhZ2UodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2FjdGl2ZVBhZ2UgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSkgfHwgMTtcbiAgICB0aGlzLmFjdGl2ZVBhZ2VDaGFuZ2UuZW1pdCh0aGlzLl9hY3RpdmVQYWdlKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVBhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9hY3RpdmVQYWdlID0gMTtcblxuICBASW5wdXQoKVxuICBzZXQgY2xlYW5lcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2NsZWFuZXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGNsZWFuZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsZWFuZXI7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbmVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGNsaWNrYWJsZVJvd3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9jbGlja2FibGVSb3dzID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBjbGlja2FibGVSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jbGlja2FibGVSb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xpY2thYmxlUm93czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBjb2x1bW5zKHZhbHVlOiAoc3RyaW5nIHwgSUNvbHVtbilbXSkge1xuICAgIHRoaXMuX2NvbHVtbnMgPSB2YWx1ZS5tYXAoY29sdW1uID0+IHR5cGVvZiBjb2x1bW4gPT09ICdzdHJpbmcnID8geyBrZXk6IGNvbHVtbiB9IDogeyAuLi5jb2x1bW4gfSk7XG4gIH1cblxuICBnZXQgY29sdW1ucygpOiAoc3RyaW5nIHwgSUNvbHVtbilbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMgfHwgdGhpcy5yYXdDb2x1bW5OYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgX2NvbHVtbnM/OiAoc3RyaW5nIHwgSUNvbHVtbilbXTtcblxuICBASW5wdXQoKSBjb2x1bW5GaWx0ZXI/OiBib29sZWFuIHwgSUNvbHVtbkZpbHRlcjtcblxuICBASW5wdXQoKVxuICBzZXQgY29sdW1uRmlsdGVyVmFsdWUodmFsdWU6IElDb2x1bW5GaWx0ZXJWYWx1ZSkge1xuICAgIGlmICh0aGlzLmNvbHVtRmlsdGVyVmFsdWVEaWZmZXIpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmNvbHVtRmlsdGVyVmFsdWVEaWZmZXIuZGlmZih2YWx1ZSk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICB0aGlzLl9jb2x1bW5GaWx0ZXJWYWx1ZSA9IHsgLi4udmFsdWUgfTtcbiAgICAgICAgdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KHsgLi4udGhpcy5fY29sdW1uRmlsdGVyVmFsdWUgfSk7XG4gICAgICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy8gZW1pdHMgdGFibGVGaWx0ZXJlZCBjaGFuZ2VcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY29sdW1uRmlsdGVyVmFsdWUoKTogSUNvbHVtbkZpbHRlclZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRmlsdGVyVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9jb2x1bW5GaWx0ZXJWYWx1ZTogSUNvbHVtbkZpbHRlclZhbHVlID0ge307XG5cbiAgQElucHV0KCkgY29sdW1uU29ydGVyPzogYm9vbGVhbiB8IElTb3J0ZXI7XG5cbiAgQElucHV0KClcbiAgc2V0IGZvb3Rlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Zvb3RlciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgZm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mb290ZXI7XG4gIH1cblxuICBwcml2YXRlIF9mb290ZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgaGVhZGVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGVhZGVyID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBoZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcjtcbiAgfVxuXG4gIHByaXZhdGUgX2hlYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBpdGVtcyh2YWx1ZTogSUl0ZW1bXSkge1xuICAgIGlmICh0aGlzLml0ZW1zRGlmZmVyKSB7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtc0RpZmZlci5kaWZmKHZhbHVlKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gdGhpcy5zZXRJdGVtcyh2YWx1ZSkgYXMgQXJyYXk8VHlwZTxJSXRlbUludGVybmFsPj47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgX2l0ZW1zOiBJSXRlbUludGVybmFsW10gPSBbXSBhcyBBcnJheTxUeXBlPElJdGVtSW50ZXJuYWw+PjtcblxuICBASW5wdXQoKVxuICBzZXQgaXRlbXNQZXJQYWdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9pdGVtc1BlclBhZ2UgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgaXRlbXNQZXJQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zUGVyUGFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX2l0ZW1zUGVyUGFnZTogbnVtYmVyID0gMTA7XG5cbiAgQElucHV0KCkgaXRlbXNQZXJQYWdlTGFiZWw6IHN0cmluZyA9ICdJdGVtcyBwZXIgcGFnZTonO1xuICBASW5wdXQoKSBpdGVtc1BlclBhZ2VPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMjAsIDUwXTtcbiAgQElucHV0KCkgaXRlbXNQZXJQYWdlU2VsZWN0PzogYm9vbGVhbiB8IEl0ZW1zUGVyUGFnZVNlbGVjdDtcbiAgQElucHV0KCkgbG9hZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIG5vSXRlbXNMYWJlbDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiA9ICdObyBpdGVtcyBmb3VuZCc7XG5cbiAgQElucHV0KClcbiAgc2V0IHBhZ2luYXRpb24odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9wYWdpbmF0aW9uID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBwYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wYWdpbmF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBzZWxlY3RhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VsZWN0YWJsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2VsZWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0YWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgc2VsZWN0QWxsKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VsZWN0QWxsID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RBbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdEFsbDtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdEFsbDogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2V0IHNvcnRlclZhbHVlKHZhbHVlOiBJU29ydGVyVmFsdWUpIHtcbiAgICBpZiAodGhpcy5zb3J0ZXJWYWx1ZURpZmZlcikge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuc29ydGVyVmFsdWVEaWZmZXIuZGlmZih2YWx1ZSk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICB0aGlzLl9zb3J0ZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNvcnRlclZhbHVlQ2hhbmdlLmVtaXQoeyAuLi52YWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgc29ydGVyVmFsdWUoKTogSVNvcnRlclZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydGVyVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9zb3J0ZXJWYWx1ZTogSVNvcnRlclZhbHVlID0ge307XG5cbiAgQElucHV0KClcbiAgc2V0IHRhYmxlRmlsdGVyKGZpbHRlcikge1xuICAgIHRoaXMuX3RhYmxlRmlsdGVyID0gZmlsdGVyO1xuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy50YWJsZUZpbHRlckxhYmVsID0gdHlwZW9mIGZpbHRlci5sYWJlbCA9PT0gJ3N0cmluZycgPyBmaWx0ZXIubGFiZWwgOiB0aGlzLnRhYmxlRmlsdGVyTGFiZWw7XG4gICAgICB0aGlzLnRhYmxlRmlsdGVyUGxhY2Vob2xkZXIgPSB0eXBlb2YgZmlsdGVyLnBsYWNlaG9sZGVyID09PSAnc3RyaW5nJyA/IGZpbHRlci5wbGFjZWhvbGRlciA6IHRoaXMudGFibGVGaWx0ZXJQbGFjZWhvbGRlcjtcbiAgICAgIHRoaXMudGFibGVGaWx0ZXJWYWx1ZSA9IHR5cGVvZiBmaWx0ZXIudmFsdWUgPT09ICdzdHJpbmcnID8gZmlsdGVyLnZhbHVlIDogdGhpcy50YWJsZUZpbHRlclZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJsZUZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVGaWx0ZXI7XG4gIH1cblxuICBwcml2YXRlIF90YWJsZUZpbHRlcj86IGJvb2xlYW4gfCBJVGFibGVGaWx0ZXI7XG5cbiAgQElucHV0KCkgdGFibGVGaWx0ZXJMYWJlbCA9ICdGaWx0ZXI6JztcbiAgQElucHV0KCkgdGFibGVGaWx0ZXJQbGFjZWhvbGRlciA9ICd0eXBlIHN0cmluZy4uLic7XG5cbiAgQElucHV0KClcbiAgc2V0IHRhYmxlRmlsdGVyVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl90YWJsZUZpbHRlclZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdGFibGVGaWx0ZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy50YWJsZUZpbHRlclZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgdGhpcy50YWJsZUZpbHRlcmVkOyAvLyBlbWl0cyB0YWJsZUZpbHRlcmVkIGNoYW5nZVxuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJsZUZpbHRlclZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlRmlsdGVyVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF90YWJsZUZpbHRlclZhbHVlOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKSB0YWJsZUJvZHlQcm9wcz86IElUYWJsZUdyb3VwUHJvcHMgPSB7fTtcbiAgQElucHV0KCkgdGFibGVGb290UHJvcHM/OiBJVGFibGVHcm91cFByb3BzID0ge307XG4gIEBJbnB1dCgpIHRhYmxlSGVhZFByb3BzPzogSVRhYmxlR3JvdXBQcm9wcyA9IHt9O1xuICBASW5wdXQoKSB0YWJsZVByb3BzPzogSVRhYmxlID0ge307XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkSXRlbXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJSXRlbVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUl0ZW1bXT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNvcnRlclZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SVNvcnRlclZhbHVlPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRlclZhbHVlPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgYWN0aXZlUGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGl0ZW1zUGVyUGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHJvd0NsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgY29sdW1uRmlsdGVyVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJQ29sdW1uRmlsdGVyVmFsdWU+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uRmlsdGVyVmFsdWU+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBmaWx0ZXJlZEl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SUl0ZW1JbnRlcm5hbFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUl0ZW1JbnRlcm5hbFtdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgdGFibGVGaWx0ZXJWYWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlSWREaXJlY3RpdmUpIGNvbHVtblRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZUlkRGlyZWN0aXZlPjtcbiAgdGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IChUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCkgfSA9IHsgdGFibGVEZXRhaWxzOiBudWxsLCB0YWJsZURhdGE6IG51bGwgfTtcbiAgY29sdW1uRmlsdGVyVGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IChUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCkgfSA9IHt9O1xuICBzdW1tYXJ5Um93VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29sdW1uVGVtcGxhdGVzLmZvckVhY2goKGNoaWxkOiBUZW1wbGF0ZUlkRGlyZWN0aXZlKSA9PiB7XG4gICAgICBpZiAoY2hpbGQuaWQuc3RhcnRzV2l0aCgnY29sdW1uRmlsdGVyXycpKSB7XG4gICAgICAgIHRoaXMuY29sdW1uRmlsdGVyVGVtcGxhdGVzW2NoaWxkLmlkXSA9IGNoaWxkLnRlbXBsYXRlUmVmO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQuaWQgPT09ICd0YWJsZVN1bW1hcnlSb3cnKSB7XG4gICAgICAgIHRoaXMuc3VtbWFyeVJvd1RlbXBsYXRlID0gY2hpbGQudGVtcGxhdGVSZWY7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMudGVtcGxhdGVzW2NoaWxkLmlkXSA9IGNoaWxkLnRlbXBsYXRlUmVmO1xuICAgIH0pO1xuICAgIHRoaXMuY29sdW1uRmlsdGVyVGVtcGxhdGVzID0geyAuLi50aGlzLmNvbHVtbkZpbHRlclRlbXBsYXRlcyB9O1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkQWxsKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pdGVtcy5zb21lKChpdGVtKSA9PiBpdGVtLl9zZWxlY3RlZCA9PT0gdHJ1ZSk7XG4gICAgY29uc3QgdW5zZWxlY3RlZCA9IHRoaXMuaXRlbXMuc29tZSgoaXRlbSkgPT4gaXRlbS5fc2VsZWN0ZWQgPT09IGZhbHNlKTtcbiAgICByZXR1cm4gc2VsZWN0ZWQgJiYgdW5zZWxlY3RlZCA/ICdpbmRldGVybWluYXRlJyA6IHNlbGVjdGVkO1xuICB9XG5cbiAgZ2V0IHRhYmxlRmlsdGVyU3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVGaWx0ZXJWYWx1ZSA/IHRoaXMudGFibGVGaWx0ZXJWYWx1ZSA6ICcnO1xuICB9XG5cbiAgZ2V0IGNvbHVtbkZpbHRlclN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbkZpbHRlclZhbHVlID8gdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSA6IHt9O1xuICB9XG5cbiAgZ2V0IG51bWJlck9mUGFnZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXNQZXJQYWdlID8gTWF0aC5jZWlsKHRoaXMuc29ydGVkSXRlbXMubGVuZ3RoIC8gdGhpcy5faXRlbXNQZXJQYWdlKSA6IDE7XG4gIH1cblxuICBnZXQgY29sc3BhbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RhYmxlID8gdGhpcy5yYXdDb2x1bW5OYW1lcy5sZW5ndGggKyAxIDogdGhpcy5yYXdDb2x1bW5OYW1lcy5sZW5ndGg7XG4gIH1cblxuICBnZXQgZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlUGFnZSA/ICh0aGlzLl9hY3RpdmVQYWdlIC0gMSkgKiB0aGlzLl9pdGVtc1BlclBhZ2UgOiAwO1xuICB9XG5cbiAgZ2V0IGl0ZW1zT25BY3RpdmVQYWdlKCk6IElJdGVtSW50ZXJuYWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydGVkSXRlbXMuc2xpY2UoXG4gICAgICB0aGlzLmZpcnN0SXRlbU9uQWN0aXZlUGFnZUluZGV4LFxuICAgICAgdGhpcy5maXJzdEl0ZW1PbkFjdGl2ZVBhZ2VJbmRleCArIHRoaXMuX2l0ZW1zUGVyUGFnZVxuICAgICk7XG4gIH1cblxuICBnZXQgY3VycmVudEl0ZW1zKCk6IElJdGVtSW50ZXJuYWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVBhZ2UgPyB0aGlzLml0ZW1zT25BY3RpdmVQYWdlIDogdGhpcy5zb3J0ZWRJdGVtcyA/PyBbXTtcbiAgICAvLyByZXR1cm4gdGhpcy5pdGVtcyA/PyBbXTtcbiAgfVxuXG4gIGdldCBnZW5Db2xzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9pdGVtcy5sZW5ndGggPyB0aGlzLl9pdGVtc1swXSA/PyB7fSA6IHt9KS5maWx0ZXIoKGVsKSA9PiBlbC5jaGFyQXQoMCkgIT09ICdfJyk7XG4gIH1cblxuICBnZXQgcmF3Q29sdW1uTmFtZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMgPyB0aGlzLl9jb2x1bW5zLm1hcChjb2x1bW4gPT4gdHlwZW9mIGNvbHVtbiA9PT0gJ29iamVjdCcgPyBjb2x1bW4ua2V5IDogY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5nZW5Db2xzO1xuICB9XG5cbiAgZ2V0IGl0ZW1zRGF0YUNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3Q29sdW1uTmFtZXMuZmlsdGVyKChuYW1lKSA9PiB0aGlzLmdlbkNvbHMuaW5jbHVkZXMobmFtZSkpO1xuICB9XG5cbiAgZ2V0IHNvcnRlZEl0ZW1zKCk6IElJdGVtSW50ZXJuYWxbXSB7XG4gICAgY29uc3QgY29sdW1uS2V5ID0gdGhpcy5zb3J0ZXJWYWx1ZS5jb2x1bW47XG4gICAgaWYgKFxuICAgICAgIWNvbHVtbktleSB8fFxuICAgICAgIXRoaXMuaXRlbXNEYXRhQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW5LZXkpIHx8XG4gICAgICAodGhpcy5jb2x1bW5Tb3J0ZXIgJiZcbiAgICAgICAgdHlwZW9mIHRoaXMuY29sdW1uU29ydGVyID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0aGlzLmNvbHVtblNvcnRlci5leHRlcm5hbClcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlRmlsdGVyZWQ7XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlRmlsdGVyZWQgPSBbLi4udGhpcy50YWJsZUZpbHRlcmVkXTtcblxuICAgIC8vIGlmIHZhbHVlcyBpbiBjb2x1bW4gYXJlIHRvIGJlIHNvcnRlZCBieSBudW1lcmljIHZhbHVlIHRoZXkgYWxsIGhhdmUgdG8gYmUgYSB0eXBlIG9mIG51bWJlclxuICAgIGNvbnN0IGZsaXAgPSB0aGlzLnNvcnRlclZhbHVlLnN0YXRlID09PSAnYXNjJyA/IDEgOiB0aGlzLnNvcnRlclZhbHVlLnN0YXRlID09PSAnZGVzYycgPyAtMSA6IDA7XG5cbiAgICBpZiAoZmxpcCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRhYmxlRmlsdGVyZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW4pID0+IHR5cGVvZiBjb2x1bW4gPT09ICdvYmplY3QnICYmIGNvbHVtbi5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50Q29sdW1uID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY3VycmVudENvbHVtbi5zb3J0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHNvcnRlZCA9IHRhYmxlRmlsdGVyZWQuc2xpY2UoKS5zb3J0KGN1cnJlbnRDb2x1bW4uc29ydGVyKTtcbiAgICAgIHJldHVybiBmbGlwIDwgMCA/IHNvcnRlZC5yZXZlcnNlKCkgOiBzb3J0ZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGFyZUZuID0gKGl0ZW0xOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0sIGl0ZW0yOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IGl0ZW0xW2NvbHVtbktleV07XG4gICAgICBjb25zdCB2YWx1ZTIgPSBpdGVtMltjb2x1bW5LZXldO1xuICAgICAgY29uc3QgYSA9IHR5cGVvZiB2YWx1ZTEgPT09ICdudW1iZXInID8gdmFsdWUxIDogU3RyaW5nKHZhbHVlMSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGIgPSB0eXBlb2YgdmFsdWUyID09PSAnbnVtYmVyJyA/IHZhbHVlMiA6IFN0cmluZyh2YWx1ZTIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gYSA+IGIgPyAxICogZmxpcCA6IGIgPiBhID8gLTEgKiBmbGlwIDogMDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRhYmxlRmlsdGVyZWQuc2xpY2UoKS5zb3J0KGNvbXBhcmVGbik7XG4gIH1cblxuICBnZXQgdGFibGVGaWx0ZXJFdmVudCgpOiAnY2hhbmdlJyB8ICdpbnB1dCcge1xuICAgIHJldHVybiAodHlwZW9mIHRoaXMudGFibGVGaWx0ZXIgPT09ICdvYmplY3QnICYmIHRoaXMudGFibGVGaWx0ZXIubGF6eSkgPyAnY2hhbmdlJyA6ICdpbnB1dCc7XG4gIH07XG5cbiAgcHJpdmF0ZSBfY29sdW1uRmlsdGVyZWQ6IElJdGVtSW50ZXJuYWxbXSA9IFtdO1xuXG4gIGdldCBjb2x1bW5GaWx0ZXJlZCgpOiBJSXRlbUludGVybmFsW10ge1xuICAgIGxldCBfaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbHVtbkZpbHRlciAmJlxuICAgICAgdHlwZW9mIHRoaXMuY29sdW1uRmlsdGVyID09PSAnb2JqZWN0JyAmJlxuICAgICAgdGhpcy5jb2x1bW5GaWx0ZXIuZXh0ZXJuYWxcbiAgICApIHtcbiAgICAgIHRoaXMuX2NvbHVtbkZpbHRlcmVkID0gX2l0ZW1zO1xuICAgICAgcmV0dXJuIF9pdGVtcztcbiAgICB9XG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5jb2x1bW5GaWx0ZXJTdGF0ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG5cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgIF9pdGVtcyA9IF9pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHZhbHVlKGl0ZW1ba2V5XSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2x1bW4gPT4gdHlwZW9mIGNvbHVtbiA9PT0gJ29iamVjdCcgJiYgY29sdW1uLmtleSA9PT0ga2V5KTtcbiAgICAgIGlmICh0eXBlb2YgY3VycmVudENvbHVtbiA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGN1cnJlbnRDb2x1bW4uZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIF9pdGVtcyA9IF9pdGVtcy5maWx0ZXIoKGl0ZW0pID0+ICh0eXBlb2YgY3VycmVudENvbHVtbi5maWx0ZXIgPT09ICdmdW5jdGlvbicgJiYgY3VycmVudENvbHVtbi5maWx0ZXIoaXRlbSwgdmFsdWUpKSA/PyAhdmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbHVtbkZpbHRlciA9IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChjb2x1bW5GaWx0ZXIgJiYgdGhpcy5pdGVtc0RhdGFDb2x1bW5zLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgX2l0ZW1zID0gX2l0ZW1zLmZpbHRlcigoaXRlbSkgPT4gU3RyaW5nKGl0ZW1ba2V5XSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhjb2x1bW5GaWx0ZXIpKTtcbiAgICAgIH1cblxuICAgIH0pO1xuICAgIHRoaXMuX2NvbHVtbkZpbHRlcmVkID0gX2l0ZW1zO1xuICAgIHJldHVybiBfaXRlbXM7XG4gIH1cblxuICBnZXQgdGFibGVGaWx0ZXJlZCgpOiBJSXRlbUludGVybmFsW10ge1xuICAgIGxldCBpdGVtcyA9IHRoaXMuY29sdW1uRmlsdGVyZWQ7XG4gICAgaWYgKFxuICAgICAgIXRoaXMudGFibGVGaWx0ZXJTdGF0ZSB8fFxuICAgICAgKHRoaXMudGFibGVGaWx0ZXIgJiYgdHlwZW9mIHRoaXMudGFibGVGaWx0ZXIgPT09ICdvYmplY3QnICYmIHRoaXMudGFibGVGaWx0ZXIuZXh0ZXJuYWwpXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc0ZpbHRlcmVkRGlmZmVyKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLml0ZW1zRmlsdGVyZWREaWZmZXIuZGlmZihpdGVtcyk7XG4gICAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zQ2hhbmdlLmVtaXQoaXRlbXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMudGFibGVGaWx0ZXJTdGF0ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHZhbHVlQ29udGFpbkZpbHRlciA9ICh2YWw6IGFueSkgPT4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbTogeyBbeDogc3RyaW5nXTogYW55OyB9KSA9PiB7XG4gICAgICByZXR1cm4gISF0aGlzLml0ZW1zRGF0YUNvbHVtbnMuZmluZCgoa2V5KSA9PiB2YWx1ZUNvbnRhaW5GaWx0ZXIoaXRlbVtrZXldKSk7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuaXRlbXNGaWx0ZXJlZERpZmZlcikge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuaXRlbXNGaWx0ZXJlZERpZmZlci5kaWZmKGl0ZW1zKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtc0NoYW5nZS5lbWl0KGl0ZW1zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgZ2V0IGlzRmlsdGVyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVGaWx0ZXJTdGF0ZSB8fCB0aGlzLnNvcnRlclZhbHVlPy5jb2x1bW4gfHwgT2JqZWN0LnZhbHVlcyh0aGlzLmNvbHVtbkZpbHRlclN0YXRlKS5qb2luKCcnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SXRlbXMoaXRlbXM6IElJdGVtW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW06IElJdGVtLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiB7IC4uLml0ZW0sIF9pZDogaW5kZXggfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gPElJdGVtSW50ZXJuYWw+W107XG4gIH1cblxuICBoYW5kbGVTb3J0Q2hhbmdlKCRldmVudDogeyBjb2x1bW5LZXk6IHN0cmluZzsgaW5kZXg6IG51bWJlcjsgfSkge1xuICAgIHRoaXMuaGFuZGxlU29ydGVyQ2hhbmdlKCRldmVudC5jb2x1bW5LZXksICRldmVudC5pbmRleCk7XG4gIH1cblxuICBpc1NvcnRhYmxlKGk6IG51bWJlcik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzRGF0YUNvbHVtbiA9IHRoaXMuaXRlbXNEYXRhQ29sdW1ucy5pbmNsdWRlcyh0aGlzLnJhd0NvbHVtbk5hbWVzW2ldKTtcbiAgICBsZXQgY29sdW1uO1xuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29sdW1uU29ydGVyICYmXG4gICAgICAoIXRoaXMuY29sdW1ucyB8fFxuICAgICAgICB0eXBlb2YgY29sdW1uICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICAodHlwZW9mIGNvbHVtbiA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiBjb2x1bW4uc29ydGVyID09PSAndW5kZWZpbmVkJyB8fCBjb2x1bW4uc29ydGVyKSlcbiAgICAgICkgJiYgaXNEYXRhQ29sdW1uXG4gICAgKTtcbiAgfVxuXG4gIGhhbmRsZVNvcnRlckNoYW5nZShjb2x1bW46IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1NvcnRhYmxlKGluZGV4KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvL2lmIGNvbHVtbiBjaGFuZ2VkIG9yIHNvcnQgd2FzIGRlc2NlbmRpbmcgY2hhbmdlIGFzYyB0byB0cnVlXG4gICAgY29uc3Qgc3RhdGUgPSB7IC4uLnRoaXMuc29ydGVyVmFsdWUgfTtcblxuICAgIGlmIChzdGF0ZS5jb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgaWYgKHN0YXRlLnN0YXRlID09PSAwKSB7XG4gICAgICAgIHN0YXRlLnN0YXRlID0gJ2FzYyc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLnN0YXRlID09PSAnYXNjJykge1xuICAgICAgICBzdGF0ZS5zdGF0ZSA9ICdkZXNjJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb2x1bW5Tb3J0ZXIgPT09ICdvYmplY3QnICYmICF0aGlzLmNvbHVtblNvcnRlci5yZXNldGFibGUpIHtcbiAgICAgICAgICBzdGF0ZS5zdGF0ZSA9ICdhc2MnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLnN0YXRlID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb2x1bW4gPSBjb2x1bW47XG4gICAgICBzdGF0ZS5zdGF0ZSA9ICdhc2MnO1xuICAgIH1cbiAgICB0aGlzLnNvcnRlclZhbHVlID0geyAuLi5zdGF0ZSB9O1xuICB9XG5cbiAgc2V0QWN0aXZlUGFnZSgkZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlUGFnZSA9ICRldmVudDtcbiAgfVxuXG4gIGhhbmRsZUNvbHVtbkZpbHRlckNoYW5nZSgkZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHsgY29sdW1uLCB2YWx1ZSwgdHlwZSB9ID0gJGV2ZW50O1xuICAgIHRoaXMuc2V0QWN0aXZlUGFnZSgxKTtcbiAgICB0aGlzLmNvbHVtbkZpbHRlclZhbHVlID0geyAuLi50aGlzLmNvbHVtbkZpbHRlclZhbHVlLCBbYCR7Y29sdW1ufWBdOiB2YWx1ZSB9O1xuICB9XG5cbiAgaGFuZGxlVGFibGVGaWx0ZXJDaGFuZ2UoJGV2ZW50OiB7IHZhbHVlOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgfSkge1xuICAgIGNvbnN0IHsgdmFsdWUsIHR5cGUgfSA9ICRldmVudDtcbiAgICBjb25zdCBpc0xhenkgPSB0eXBlb2YgdGhpcy50YWJsZUZpbHRlciA9PT0gJ29iamVjdCcgJiYgdGhpcy50YWJsZUZpbHRlci5sYXp5ID09PSB0cnVlO1xuICAgIGlmICgoKGlzTGF6eSAmJiB0eXBlID09PSAnaW5wdXQnKSB8fCAoIWlzTGF6eSAmJiB0eXBlID09PSAnY2hhbmdlJykpICYmIHZhbHVlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XG4gICAgdGhpcy50YWJsZUZpbHRlclZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBjbGVhbigkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmNvbHVtbkZpbHRlclZhbHVlID0ge307XG4gICAgdGhpcy50YWJsZUZpbHRlclZhbHVlID0gJyc7XG4gICAgdGhpcy5zb3J0ZXJWYWx1ZSA9IHt9O1xuICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy9lbWl0cyB0YWJsZUZpbHRlcmVkIGNoYW5nZVxuICB9XG5cbiAgaGFuZGxlSXRlbXNQZXJQYWdlQ2hhbmdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX2l0ZW1zUGVyUGFnZSkge1xuICAgICAgdGhpcy5zZXRBY3RpdmVQYWdlKDEpO1xuICAgICAgdGhpcy5faXRlbXNQZXJQYWdlID0gdmFsdWU7XG4gICAgICB0aGlzLml0ZW1zUGVyUGFnZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVSb3dDaGVja2VkKCRldmVudDogRXZlbnQsIGl0ZW06IElJdGVtSW50ZXJuYWwpIHtcbiAgICBpdGVtLl9zZWxlY3RlZCA9IGl0ZW0uX3NlbGVjdGFibGUgIT09IGZhbHNlICYmICgkZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQodGhpcy5pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uX3NlbGVjdGVkID09PSB0cnVlKSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkQWxsU3ViamVjdC5uZXh0KHRoaXMuc2VsZWN0ZWRBbGwpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5faXRlbXMgPSB0aGlzLml0ZW1zLm1hcCgoaXRlbTogSUl0ZW1JbnRlcm5hbCkgPT4ge1xuICAgICAgcmV0dXJuIHsgLi4uaXRlbSwgX3NlbGVjdGVkOiAoaXRlbS5fc2VsZWN0YWJsZSAhPT0gZmFsc2UgPyAkZXZlbnQgOiAhIWl0ZW0uX3NlbGVjdGVkKSB9O1xuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0ZWRBbGxTdWJqZWN0Lm5leHQoJGV2ZW50KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHRoaXMuaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLl9zZWxlY3RlZCA9PT0gdHJ1ZSkpO1xuICAgICAgdGhpcy5zZWxlY3RlZEFsbFN1YmplY3QubmV4dCh0aGlzLnNlbGVjdGVkQWxsKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHRhYmxlRGF0YUNlbGxQcm9wcyhpdGVtOiBJSXRlbSwgY29sTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvcHMgPSBpdGVtWydfY2VsbFByb3BzJ10gJiYge1xuICAgICAgLi4uKGl0ZW1bJ19jZWxsUHJvcHMnXVsnX2FsbCddICYmIHsgLi4uaXRlbVsnX2NlbGxQcm9wcyddWydfYWxsJ10gfSksXG4gICAgICAuLi4oaXRlbVsnX2NlbGxQcm9wcyddW2NvbE5hbWVdICYmIHsgLi4uaXRlbVsnX2NlbGxQcm9wcyddW2NvbE5hbWVdIH0pXG4gICAgfTtcbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cblxuICB0YWJsZURhdGFDZWxsQ2xhc3NlcyhpdGVtOiBJSXRlbSwgY29sTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJyA/IGNvbHVtbiA9PT0gY29sTmFtZSA6IGNvbHVtblsna2V5J10gPT09IGNvbE5hbWUpO1xuICAgIHJldHVybiBjb2x1bW5bMF0gJiYgdHlwZW9mIGNvbHVtblswXSA9PT0gJ29iamVjdCcgPyBjb2x1bW5bMF0uX2NsYXNzZXMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRDb2x1bW5OYW1lKCRldmVudDogTW91c2VFdmVudCk6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0ID0gJGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICAgIGNvbnN0IGNsb3Nlc3QgPSB0YXJnZXQuY2xvc2VzdCgndHInKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNsb3Nlc3QgPyBBcnJheS5mcm9tKGNsb3Nlc3QuY2hpbGRyZW4pIDogW107XG4gICAgY29uc3QgY2xpY2tlZENlbGwgPSBjaGlsZHJlbi5maWx0ZXIoKGNoaWxkKSA9PiBjaGlsZC5jb250YWlucyh0YXJnZXQpKVswXTtcbiAgICByZXR1cm4gdGhpcy5yYXdDb2x1bW5OYW1lc1tjaGlsZHJlbi5pbmRleE9mKGNsaWNrZWRDZWxsKSAtICh0aGlzLl9zZWxlY3RhYmxlID8gMSA6IDApXTtcbiAgfVxuXG4gIGhhbmRsZVJvd0NsaWNrKHBhcmFtOiB7ICRldmVudDogTW91c2VFdmVudDsgaXRlbTogSUl0ZW1JbnRlcm5hbDsgaTogbnVtYmVyIH0pIHtcbiAgICBjb25zdCB7ICRldmVudCwgaXRlbSwgaSB9ID0geyAuLi5wYXJhbSB9O1xuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLmdldENvbHVtbk5hbWUocGFyYW0uJGV2ZW50KTtcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQoeyBpdGVtOiBpdGVtLCBpbmRleDogaSArIHRoaXMuZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXgsIGNvbHVtbk5hbWUsIGV2ZW50OiAkZXZlbnQgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbHVtbkZpbHRlclZhbHVlJ10pIHtcbiAgICAgIGNvbnN0IGNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlID0gY2hhbmdlc1snY29sdW1uRmlsdGVyVmFsdWUnXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgY3VycmVudFZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhjdXJyZW50VmFsdWUgPz8ge30pLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0YWJsZUZpbHRlclZhbHVlJ10pIHtcbiAgICAgIGNvbnN0IHRhYmxlRmlsdGVyVmFsdWVDaGFuZ2UgPSBjaGFuZ2VzWyd0YWJsZUZpbHRlclZhbHVlJ107XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0YWJsZUZpbHRlclZhbHVlQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlUGFnZSgxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJpdGVtc1BlclBhZ2VTZWxlY3QgfHwgdGFibGVGaWx0ZXIgfHwgY2xlYW5lciB8fCB0ZW1wbGF0ZXNbJ3RhYmxlQ3VzdG9tSGVhZGVyJ11cIiBjbGFzcz1cInJvdyBteS0yIG14LTBcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIHAtMFwiICpuZ0lmPVwidGFibGVGaWx0ZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVGaWx0ZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIHAtMFwiICpuZ0lmPVwiY2xlYW5lclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZUNsZWFuZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1sndGFibGVDdXN0b21IZWFkZXInXSB8fCB0YWJsZUN1c3RvbUhlYWRlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlICN0YWJsZUZpbHRlclRlbXBsYXRlPlxuICAgIDxjLXNtYXJ0LXRhYmxlLWZpbHRlclxuICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZVRhYmxlRmlsdGVyQ2hhbmdlKCRldmVudClcIlxuICAgICAgKm5nSWY9XCJ0YWJsZUZpbHRlclwiXG4gICAgICBbZGVsYXldPVwiMzAwXCJcbiAgICAgIFtmaWx0ZXJMYWJlbF09XCJ0YWJsZUZpbHRlckxhYmVsXCJcbiAgICAgIFtmaWx0ZXJQbGFjZWhvbGRlcl09XCJ0YWJsZUZpbHRlclBsYWNlaG9sZGVyXCJcbiAgICAgIFtvbkV2ZW50XT1cInRhYmxlRmlsdGVyRXZlbnRcIlxuICAgICAgW3ZhbHVlXT1cInRhYmxlRmlsdGVyU3RhdGVcIlxuICAgICAgY0ZpbHRlcklucHV0XG4gICAgPlxuICAgIDwvYy1zbWFydC10YWJsZS1maWx0ZXI+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlICN0YWJsZUNsZWFuZXJUZW1wbGF0ZT5cbiAgICA8YnV0dG9uXG4gICAgICAoY2xpY2spPVwiY2xlYW4oJGV2ZW50KVwiXG4gICAgICAqbmdJZj1cImNsZWFuZXJcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFpc0ZpbHRlcmVkXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnbXMtMSc6IHRhYmxlRmlsdGVyfVwiXG4gICAgICBbdGFiaW5kZXhdPVwiMFwiXG4gICAgICBjQnV0dG9uXG4gICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgY29sb3I9XCJ0cmFuc3BhcmVudFwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpbHRlckljb25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSAjdGFibGVDdXN0b21IZWFkZXJUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcC0wIG1zLWF1dG9cIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltjdXN0b21IZWFkZXJdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgPHRhYmxlIFthbGlnbl09XCJ0YWJsZVByb3BzPy5hbGlnblwiXG4gICAgICAgICBbYm9yZGVyQ29sb3JdPVwidGFibGVQcm9wcz8uYm9yZGVyQ29sb3JcIlxuICAgICAgICAgW2JvcmRlcmVkXT1cInRhYmxlUHJvcHM/LmJvcmRlcmVkID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbYm9yZGVybGVzc109XCJ0YWJsZVByb3BzPy5ib3JkZXJsZXNzID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbY2FwdGlvbl09XCJ0YWJsZVByb3BzPy5jYXB0aW9uXCJcbiAgICAgICAgIFtjb2xvcl09XCJ0YWJsZVByb3BzPy5jb2xvclwiXG4gICAgICAgICBbaG92ZXJdPVwidGFibGVQcm9wcz8uaG92ZXIgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgIFtyZXNwb25zaXZlXT1cInRhYmxlUHJvcHM/LnJlc3BvbnNpdmVcIlxuICAgICAgICAgW3NtYWxsXT1cInRhYmxlUHJvcHM/LnNtYWxsID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbc3RyaXBlZF09XCJ0YWJsZVByb3BzPy5zdHJpcGVkID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbY0h0bWxBdHRyXT1cInRhYmxlUHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxuICAgICAgICAgW2NUYWJsZUNvbG9yXT1cInRhYmxlUHJvcHM/LmNvbG9yXCJcbiAgICAgICAgIGNUYWJsZVxuICA+XG4gICAgPGMtc21hcnQtdGFibGUtaGVhZFxuICAgICAgKGNvbHVtbkZpbHRlclN0YXRlQ2hhbmdlKT1cImhhbmRsZUNvbHVtbkZpbHRlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChzZWxlY3RBbGxDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxuICAgICAgKHNvcnRlclN0YXRlQ2hhbmdlKT1cImhhbmRsZVNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAqbmdJZj1cImhlYWRlclwiXG4gICAgICBbY29sdW1uRmlsdGVyU3RhdGVdPVwiY29sdW1uRmlsdGVyU3RhdGVcIlxuICAgICAgW2NvbHVtbkZpbHRlcl09XCJjb2x1bW5GaWx0ZXJcIlxuICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gICAgICBbc2VsZWN0QWxsXT1cInNlbGVjdEFsbFwiXG4gICAgICBbc2VsZWN0ZWRBbGxdPVwiKHNlbGVjdGVkQWxsU3ViamVjdCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICBbc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCJcbiAgICAgIFtjb2x1bW5Tb3J0ZXJdPVwiY29sdW1uU29ydGVyXCJcbiAgICAgIFtzb3J0ZXJWYWx1ZV09XCJzb3J0ZXJWYWx1ZVwiXG4gICAgICBbY0h0bWxBdHRyXT1cInRhYmxlSGVhZFByb3BzPy5hdHRyaWJ1dGVzID8/IHt9XCJcbiAgICAgIFtjVGFibGVDb2xvcl09XCJ0YWJsZUhlYWRQcm9wcz8uY29sb3JcIlxuICAgICAgW2NBbGlnbl09XCJ0YWJsZUhlYWRQcm9wcz8uYWxpZ25cIlxuICAgICAgW2NvbHVtbkZpbHRlclRlbXBsYXRlc109XCJjb2x1bW5GaWx0ZXJUZW1wbGF0ZXNcIlxuICAgID48L2Mtc21hcnQtdGFibGUtaGVhZD5cblxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0Ym9keURlZmF1bHRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgPHRmb290ICpuZ0lmPVwic3VtbWFyeVJvd1RlbXBsYXRlICYmICFmb290ZXJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdW1tYXJ5Um93VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L3Rmb290PlxuXG4gICAgPGMtc21hcnQtdGFibGUtaGVhZFxuICAgICAgKHNlbGVjdEFsbENoYW5nZSk9XCJoYW5kbGVTZWxlY3RBbGxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoc29ydGVyU3RhdGVDaGFuZ2UpPVwiaGFuZGxlU29ydENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICpuZ0lmPVwiZm9vdGVyXCJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgICAgW3NlbGVjdEFsbF09XCJzZWxlY3RBbGxcIlxuICAgICAgW3NlbGVjdGVkQWxsXT1cIihzZWxlY3RlZEFsbFN1YmplY3QgfCBhc3luYykgPz8gZmFsc2VcIlxuICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gICAgICBbY29sdW1uU29ydGVyXT1cImNvbHVtblNvcnRlclwiXG4gICAgICBbc29ydGVyVmFsdWVdPVwic29ydGVyVmFsdWVcIlxuICAgICAgW2NIdG1sQXR0cl09XCJ0YWJsZUZvb3RQcm9wcz8uYXR0cmlidXRlcyA/PyB7fVwiXG4gICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVGb290UHJvcHM/LmNvbG9yXCJcbiAgICAgIFtjQWxpZ25dPVwidGFibGVGb290UHJvcHM/LmFsaWduXCJcbiAgICAgIGNvbXBvbmVudD1cInRmb290XCJcbiAgICAgIFtjb2x1bW5GaWx0ZXJUZW1wbGF0ZXNdPVwiY29sdW1uRmlsdGVyVGVtcGxhdGVzXCJcbiAgICAgIFtzdW1tYXJ5Um93VGVtcGxhdGVdPVwic3VtbWFyeVJvd1RlbXBsYXRlXCJcbiAgICA+PC9jLXNtYXJ0LXRhYmxlLWhlYWQ+XG5cbiAgPC90YWJsZT5cbiAgPGMtZWxlbWVudC1jb3ZlclxuICAgICpuZ0lmPVwibG9hZGluZ1wiXG4gICAgW2JvdW5kYXJpZXNdPVwiW1xuICAgICAgeyBzaWRlczogWyd0b3AnXSwgcXVlcnk6ICd0ZCcgfSxcbiAgICAgIHsgc2lkZXM6IFsnYm90dG9tJ10sIHF1ZXJ5OiAndGJvZHknIH1cbiAgICBdXCJcbiAgPjwvYy1lbGVtZW50LWNvdmVyPlxuPC9kaXY+XG48bmctdGVtcGxhdGUgW25nSWZdPVwicGFnaW5hdGlvbiB8fCBpdGVtc1BlclBhZ2VTZWxlY3RcIj5cbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgIDxjLXNtYXJ0LXBhZ2luYXRpb25cbiAgICAgICAgKGFjdGl2ZVBhZ2VDaGFuZ2UpPVwic2V0QWN0aXZlUGFnZSgkZXZlbnQpXCJcbiAgICAgICAgKm5nSWY9XCJwYWdpbmF0aW9uICYmIG51bWJlck9mUGFnZXMgPiAxXCJcbiAgICAgICAgW2FjdGl2ZVBhZ2VdPVwiYWN0aXZlUGFnZVwiXG4gICAgICAgIFtwYWdlc109XCJudW1iZXJPZlBhZ2VzXCI+XG4gICAgICA8L2Mtc21hcnQtcGFnaW5hdGlvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gbXMtYXV0b1wiPlxuICAgICAgPGMtc21hcnQtdGFibGUtaXRlbXMtcGVyLXBhZ2Utc2VsZWN0b3JcbiAgICAgICAgKGl0ZW1zUGVyUGFnZUNoYW5nZSk9XCJoYW5kbGVJdGVtc1BlclBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICpuZ0lmPVwiaXRlbXNQZXJQYWdlU2VsZWN0XCJcbiAgICAgICAgW2l0ZW1zUGVyUGFnZUxhYmVsXT1cIml0ZW1zUGVyUGFnZUxhYmVsXCJcbiAgICAgICAgW2l0ZW1zUGVyUGFnZU9wdGlvbnNdPVwiaXRlbXNQZXJQYWdlT3B0aW9uc1wiXG4gICAgICAgIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCJcbiAgICAgID5cbiAgICAgIDwvYy1zbWFydC10YWJsZS1pdGVtcy1wZXItcGFnZS1zZWxlY3Rvcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Rib2R5RGVmYXVsdFRlbXBsYXRlPlxuICA8dGJvZHkgW2NIdG1sQXR0cl09XCJ0YWJsZUJvZHlQcm9wcz8uYXR0cmlidXRlcyA/PyB7fVwiXG4gICAgICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVCb2R5UHJvcHM/LmNvbG9yXCJcbiAgICAgICAgIFtjQWxpZ25dPVwidGFibGVCb2R5UHJvcHM/LmFsaWduXCJcbiAgPlxuICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWl0ZW0gW25nRm9yT2ZdPVwiY3VycmVudEl0ZW1zXCIgbGV0LWNudD1cImNvdW50XCIgbGV0LWk9XCJpbmRleFwiIGxldC1pc0V2ZW49XCJldmVuXCIgbGV0LWlzT2RkPVwib2RkXCI+XG4gICAgPHRyIFt0YWJpbmRleF09XCJjbGlja2FibGVSb3dzID8gMCA6IC0xXCJcbiAgICAgICAgW25nU3R5bGVdPVwie2N1cnNvcjogY2xpY2thYmxlUm93cyA/ICdwb2ludGVyJyA6ICdhdXRvJ31cIlxuICAgICAgICAoY2xpY2spPVwiaGFuZGxlUm93Q2xpY2soeyRldmVudCwgaXRlbSwgaX0pXCJcbiAgICAgICAgW2NUYWJsZUFjdGl2ZV09XCJpdGVtLl9wcm9wcz8uYWN0aXZlID8/IHVuZGVmaW5lZFwiXG4gICAgICAgIFtjVGFibGVDb2xvcl09XCJpdGVtLl9wcm9wcz8uY29sb3JcIlxuICAgICAgICBbY0FsaWduXT1cIml0ZW0uX3Byb3BzPy5hbGlnblwiXG4gICAgPlxuICAgICAgPHRkICpuZ0lmPVwic2VsZWN0YWJsZVwiXG4gICAgICAgICAgW2NUYWJsZUFjdGl2ZV09XCJpdGVtPy5bJ19jZWxsUHJvcHMnXT8uX2FsbD8uYWN0aXZlID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICAgW2NUYWJsZUNvbG9yXT1cIml0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5jb2xvclwiXG4gICAgICAgICAgW2NBbGlnbl09XCJpdGVtPy5bJ19jZWxsUHJvcHMnXT8uX2FsbD8uYWxpZ25cIlxuICAgICAgPlxuICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJoYW5kbGVSb3dDaGVja2VkKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXRlbS5fc2VsZWN0ZWQgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgY0Zvcm1DaGVja0lucHV0XG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiKGl0ZW0/Ll9zZWxlY3RhYmxlID09PSBmYWxzZSkgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgPlxuICAgICAgPC90ZD5cbiAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtY29sdW1uTmFtZSBbbmdGb3JPZl09XCJyYXdDb2x1bW5OYW1lc1wiIGxldC1pPVwiaW5kZXhcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVzWyd0YWJsZURhdGEnXSB8fCBjb2x1bW5EZWZhdWx0VGVtcGxhdGU7IGNvbnRleHQ6IHtpdGVtLCBjb2x1bW5OYW1lLCB0ZENvbnRlbnQ6IGl0ZW1bY29sdW1uTmFtZV0gfVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC90cj5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidGVtcGxhdGVzWyd0YWJsZURldGFpbHMnXVwiPlxuICAgICAgPCEtLSAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dEZXRhaWxzRGVmYXVsdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+LS0+XG4gICAgICA8dHI+XG4gICAgICAgIDx0ZCBbY29sU3Bhbl09XCJjb2xzcGFuXCIgY2xhc3M9XCJwLTBcIiB0YWJpbmRleD1cIi0xXCIgW25nU3R5bGVdPVwie2JvcmRlckJvdHRvbVdpZHRoOiAwfVwiPjwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwicC0wXCI+XG4gICAgICAgIDx0ZCBbY29sU3Bhbl09XCJjb2xzcGFuXCIgY2xhc3M9XCJwLTBcIiBbbmdTdHlsZV09XCJ7Ym9yZGVyOiAwfVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZXNbJ3RhYmxlRGV0YWlscyddOyBjb250ZXh0OiB7aXRlbSwgaW5kZXg6IGl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub0l0ZW1zRGVmYXVsdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvdGJvZHk+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbHVtbkRlZmF1bHRUZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtY29sdW1uTmFtZT1cImNvbHVtbk5hbWVcIiBsZXQtdGRDb250ZW50PVwidGRDb250ZW50XCI+XG4gIDx0ZFxuICAgIFtjVGFibGVBY3RpdmVdPVwidGFibGVEYXRhQ2VsbFByb3BzKGl0ZW0sIGNvbHVtbk5hbWUpPy5bJ2FjdGl2ZSddXCJcbiAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVEYXRhQ2VsbFByb3BzKGl0ZW0sIGNvbHVtbk5hbWUpPy5jb2xvclwiXG4gICAgW2NBbGlnbl09XCJ0YWJsZURhdGFDZWxsUHJvcHMoaXRlbSwgY29sdW1uTmFtZSk/LmFsaWduXCJcbiAgICBbbmdDbGFzc109XCJ0YWJsZURhdGFDZWxsQ2xhc3NlcyhpdGVtLCBjb2x1bW5OYW1lKVwiXG4gICAgW2NIdG1sQXR0cl09XCJ0YWJsZURhdGFDZWxsUHJvcHMoaXRlbSwgY29sdW1uTmFtZSk/LlsnX2F0dHJpYnV0ZXMnXSA/PyB1bmRlZmluZWRcIlxuICA+XG4gICAge3t0ZENvbnRlbnR9fVxuICA8L3RkPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLTxuZy10ZW1wbGF0ZSAjcm93RGV0YWlsc0RlZmF1bHRUZW1wbGF0ZSBsZXQtaXRlbSBsZXQtaW5kZXg+LS0+XG48IS0tICA8dHI+PHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIHRhYmluZGV4PVwiLTFcIiBbbmdTdHlsZV09XCJ7Ym9yZGVyQm90dG9tV2lkdGg6IDB9XCI+PC90ZD48L3RyPi0tPlxuPCEtLSAgPHRyIGNsYXNzPVwicC0wXCI+LS0+XG48IS0tICAgIDx0ZCBbY29sU3Bhbl09XCJjb2xzcGFuXCIgY2xhc3M9XCJwLTBcIiBbbmdTdHlsZV09XCJ7Ym9yZGVyOiAwfVwiPi0tPlxuPCEtLSAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZXM/LnRhYmxlRGV0YWlsc1wiPjwvbmctY29udGFpbmVyPi0tPlxuPCEtLSAgICA8L3RkPi0tPlxuPCEtLSAgPC90cj4tLT5cbjwhLS08L25nLXRlbXBsYXRlPi0tPlxuXG48bmctdGVtcGxhdGUgI25vSXRlbXNEZWZhdWx0VGVtcGxhdGU+XG4gIDx0ciAqbmdJZj1cIiFjdXJyZW50SXRlbXMubGVuZ3RoXCI+XG4gICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cImp1c3RpZnktY29udGVudC1jZW50ZXJcIj57e25vSXRlbXNMYWJlbH19PC90ZD5cbiAgPC90cj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS10b2RvOiBmaWx0ZXJJY29uQ3VzdG9tVGVtcGxhdGUtLT5cbjxuZy10ZW1wbGF0ZSAjZmlsdGVySWNvblRlbXBsYXRlPlxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgNTEyIDUxMlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwb2ludGVyLWV2ZW50cz1cIm5vbmVcIiByb2xlPVwiaW1nXCJcbiAgICAgICBjbGFzcz1cImljb24gaWNvbi1jdXN0b20tc2l6ZVwiIHdpZHRoPVwiMThcIj5cbiAgICA8cG9seWdvblxuICAgICAgZmlsbD1cInZhcigtLWNpLXByaW1hcnktY29sb3IsIGN1cnJlbnRDb2xvcilcIlxuICAgICAgcG9pbnRzPVwiNDAgMTYgNDAgNTMuODI4IDEwOS4wMjQgMTM2IDE1MC44MTUgMTM2IDc2Ljg5NiA0OCA0NTkuNTEgNDggMzA0IDI0Mi4zODggMzA0IDQwMS4zNzMgMjQxLjM3MyA0NjQgMjQwIDQ2NCAyNDAgMzY4IDIwOCAzNjggMjA4IDQ5NiAyNTQuNjI3IDQ5NiAzMzYgNDE0LjYyNyAzMzYgMjUzLjYxMiA0OTYgNTMuNjEyIDQ5NiAxNiA0MCAxNlwiXG4gICAgICBjbGFzcz1cImNpLXByaW1hcnlcIj5cbiAgICA8L3BvbHlnb24+XG4gICAgPHBvbHlnb25cbiAgICAgIGZpbGw9XCJ2YXIoLS1jaS1wcmltYXJ5LWNvbG9yLCBjdXJyZW50Q29sb3IpXCJcbiAgICAgIHBvaW50cz1cIjE2Ni40MDMgMjQ4LjIyNSAyMjYuODY0IDE4Ny43NjMgMjA0LjIzNyAxNjUuMTM1IDE0My43NzUgMjI1LjU5NyA4My4zMTMgMTY1LjEzNSA2MC42ODcgMTg3Ljc2MyAxMjEuMTQ4IDI0OC4yMjUgNjAuNjg3IDMwOC42ODcgODMuMzEzIDMzMS4zMTQgMTQzLjc3NSAyNzAuODUyIDIwNC4yMzcgMzMxLjMxNCAyMjYuODY0IDMwOC42ODcgMTY2LjQwMyAyNDguMjI1XCJcbiAgICAgIGNsYXNzPVwiY2ktcHJpbWFyeVwiPlxuICAgIDwvcG9seWdvbj5cbiAgPC9zdmc+XG48L25nLXRlbXBsYXRlPlxuIl19
548
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9zbWFydC10YWJsZS9zbWFydC10YWJsZS9zbWFydC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBTUwsTUFBTSxFQUtQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsb0JBQW9CLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBZ0J2QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRbkQsTUFBTSxPQUFPLG1CQUFtQjtJQVc5QixZQUNVLGVBQWdDLEVBQ2hDLGVBQWdDO1FBRGhDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFZakMsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQTRCLEtBQUssQ0FBQyxDQUFDO1FBaUI1RSxnQkFBVyxHQUFHLENBQUMsQ0FBQztRQVdoQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBVzFCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBK0JoQyx1QkFBa0IsR0FBdUIsRUFBRSxDQUFDO1FBYTVDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFXekIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQWdCekIsV0FBTSxHQUFvQixFQUFnQyxDQUFDO1FBVzNELGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBRTFCLHNCQUFpQixHQUFXLGlCQUFpQixDQUFDO1FBQzlDLHdCQUFtQixHQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFHaEQsaUJBQVksR0FBOEIsZ0JBQWdCLENBQUM7UUFXNUQsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFXN0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFXN0IsZUFBVSxHQUFZLElBQUksQ0FBQztRQWlCM0IsaUJBQVksR0FBaUIsRUFBRSxDQUFDO1FBa0IvQixxQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFDN0IsMkJBQXNCLEdBQUcsZ0JBQWdCLENBQUM7UUFlM0Msc0JBQWlCLEdBQVcsRUFBRSxDQUFDO1FBRTlCLG1CQUFjLEdBQXNCLEVBQUUsQ0FBQztRQUN2QyxtQkFBYyxHQUFzQixFQUFFLENBQUM7UUFDdkMsbUJBQWMsR0FBc0IsRUFBRSxDQUFDO1FBQ3ZDLGVBQVUsR0FBWSxFQUFFLENBQUM7UUFFZix3QkFBbUIsR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUN6RSxzQkFBaUIsR0FBK0IsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFDakYscUJBQWdCLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFDcEUsdUJBQWtCLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFDdEUsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3RELDRCQUF1QixHQUFxQyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUNuRyx3QkFBbUIsR0FBa0MsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFDekYsMkJBQXNCLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFHN0YsY0FBUyxHQUFpRCxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2xHLDBCQUFxQixHQUFpRCxFQUFFLENBQUM7UUFDekUseUJBQW9CLEdBQWlELEVBQUUsQ0FBQztRQUN4RSx1QkFBa0IsR0FBZ0MsSUFBSSxDQUFDO1FBa0gvQyxvQkFBZSxHQUFvQixFQUFFLENBQUM7UUFuVzVDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEYsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFOUUsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFTRCxJQUNJLFVBQVUsQ0FBQyxLQUFhO1FBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUlELElBQ0ksT0FBTyxDQUFDLEtBQWM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFJRCxJQUNJLGFBQWEsQ0FBQyxLQUFjO1FBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBSUQsSUFDSSxPQUFPLENBQUMsS0FBMkI7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzlDLENBQUM7SUFNRCxJQUNJLGlCQUFpQixDQUFDLEtBQXlCO1FBQzdDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEQsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLDZCQUE2QjthQUNsRDtTQUNGO0lBQ0gsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFNRCxJQUNJLE1BQU0sQ0FBQyxLQUFjO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBSUQsSUFDSSxNQUFNLENBQUMsS0FBYztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUlELElBQ0ksS0FBSyxDQUFDLEtBQWM7UUFDdEIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdDLElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQStCLENBQUM7YUFDbEU7U0FDRjtJQUNILENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUlELElBQ0ksWUFBWSxDQUFDLEtBQWE7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFVRCxJQUNJLFVBQVUsQ0FBQyxLQUFjO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBSUQsSUFDSSxVQUFVLENBQUMsS0FBYztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUlELElBQ0ksU0FBUyxDQUFDLEtBQWM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFJRCxJQUNJLFdBQVcsQ0FBQyxLQUFtQjtRQUNqQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25ELElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQzNDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFJRCxJQUNJLFdBQVcsQ0FBQyxNQUFNO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQzNCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDaEcsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9BQU8sTUFBTSxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztZQUN4SCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1NBQ2pHO0lBQ0gsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBT0QsSUFDSSxnQkFBZ0IsQ0FBQyxLQUFhO1FBQ2hDLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLEtBQUssRUFBRTtZQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLDZCQUE2QjtTQUNsRDtJQUNILENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBd0JELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQTBCLEVBQUUsRUFBRTtZQUMxRCxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7Z0JBQ3pELE9BQU87YUFDUjtZQUNELElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztnQkFDeEQsT0FBTzthQUNSO1lBQ0QsSUFBSSxLQUFLLENBQUMsRUFBRSxLQUFLLGlCQUFpQixFQUFFO2dCQUNsQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztnQkFDNUMsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDcEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDdkUsT0FBTyxRQUFRLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO0lBQ3hGLENBQUM7SUFFRCxJQUFJLDBCQUEwQjtRQUM1QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQzNCLElBQUksQ0FBQywwQkFBMEIsRUFDL0IsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQ3JELENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQzFFLDJCQUEyQjtJQUM3QixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQy9FLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUMxQyxJQUNFLENBQUMsU0FBUztZQUNWLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDMUMsQ0FBQyxJQUFJLENBQUMsWUFBWTtnQkFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVE7Z0JBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQzdCO1lBQ0EsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQzNCO1FBQ0QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU5Qyw2RkFBNkY7UUFDN0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUvRixJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7WUFDZCxPQUFPLGFBQWEsQ0FBQztTQUN0QjtRQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQztRQUM1RyxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsSUFBSSxPQUFPLGFBQWEsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO1lBQ25GLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDN0M7UUFFRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQTRCLEVBQUUsS0FBNEIsRUFBRSxFQUFFO1lBQy9FLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDLEdBQUcsT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3RSxNQUFNLENBQUMsR0FBRyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzdFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDO1FBRUYsT0FBTyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM5RixDQUFDO0lBQUEsQ0FBQztJQUlGLElBQUksY0FBYztRQUNoQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLElBQ0UsSUFBSSxDQUFDLFlBQVk7WUFDakIsT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVE7WUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQzFCO1lBQ0EsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUM7WUFDOUIsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUU5RCxJQUFJLEtBQUssWUFBWSxRQUFRLEVBQUU7Z0JBQzdCLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkQsT0FBTzthQUNSO1lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNwRyxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsSUFBSSxPQUFPLGFBQWEsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO2dCQUNuRixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLGFBQWEsQ0FBQyxNQUFNLEtBQUssVUFBVSxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUgsT0FBTzthQUNSO1lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pELElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZELE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7YUFDMUY7UUFFSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO1FBQzlCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ2hDLElBQ0UsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3RCLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQ3ZGO1lBQ0EsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JELElBQUksT0FBTyxFQUFFO29CQUNYLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3RDO2FBQ0Y7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25ELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEYsYUFBYTtRQUNiLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBMkIsRUFBRSxFQUFFO1lBQ25ELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEM7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFTyxRQUFRLENBQUMsS0FBYztRQUM3QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBVyxFQUFFLEtBQWEsRUFBRSxFQUFFO2dCQUM5QyxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFzQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGdCQUFnQixDQUFDLE1BQTZDO1FBQzVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsVUFBVSxDQUFDLENBQVM7UUFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxNQUFNLENBQUM7UUFDWCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLENBQ0wsSUFBSSxDQUFDLFlBQVk7WUFDakIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPO2dCQUNaLE9BQU8sTUFBTSxLQUFLLFFBQVE7Z0JBQzFCLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUMsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDeEYsSUFBSSxZQUFZLENBQ2xCLENBQUM7SUFDSixDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBYyxFQUFFLEtBQWE7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0IsT0FBTztTQUNSO1FBQ0QsNkRBQTZEO1FBQzdELE1BQU0sS0FBSyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFdEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRTtZQUMzQixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO2dCQUNyQixLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzthQUNyQjtpQkFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO2dCQUNoQyxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQzthQUN0QjtpQkFBTTtnQkFDTCxJQUFJLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRTtvQkFDekUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7aUJBQ3JCO3FCQUFNO29CQUNMLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2lCQUNqQjthQUNGO1NBQ0Y7YUFBTTtZQUNMLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3RCLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3JCO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFjO1FBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO0lBQzNCLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxNQUFXO1FBQ2xDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUN2QyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQy9FLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxNQUF3QztRQUM5RCxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLE1BQU0sR0FBRyxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQztRQUN0RixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUYsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBa0I7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyw0QkFBNEI7SUFDbEQsQ0FBQztJQUVELHdCQUF3QixDQUFDLEtBQWE7UUFDcEMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBYSxFQUFFLElBQW1CO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLElBQUssTUFBTSxDQUFDLE1BQTJCLENBQUMsT0FBTyxDQUFDO1FBQzNGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwRixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQVc7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQW1CLEVBQUUsRUFBRTtZQUNuRCxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzFGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFXLEVBQUUsT0FBZTtRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUk7WUFDbEMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDcEUsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7U0FDdkUsQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQVcsRUFBRSxPQUFlO1FBQy9DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQztRQUM1SCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNyRixDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQWtCO1FBQzlCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUE2QixDQUFDO1FBQ3BELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQTZEO1FBQzFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNoQyxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzdELE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDLFlBQVksQ0FBQztZQUMxRCxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7Z0JBQzlFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkI7U0FDRjtRQUNELElBQUksT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7WUFDL0IsTUFBTSxzQkFBc0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMzRCxNQUFNLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxZQUFZLENBQUM7WUFDekQsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFO2dCQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZCO1NBQ0Y7SUFDSCxDQUFDOztnSEE1a0JVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLG93Q0E0UGIsbUJBQW1CLDZFQ3RTdEMsd2hTQWtPQTsyRkR4TGEsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGVBQWUsWUFHZixhQUFhO29JQW1DbkIsVUFBVTtzQkFEYixLQUFLO2dCQWFGLE9BQU87c0JBRFYsS0FBSztnQkFZRixhQUFhO3NCQURoQixLQUFLO2dCQVlGLE9BQU87c0JBRFYsS0FBSztnQkFXRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFrQkcsWUFBWTtzQkFBcEIsS0FBSztnQkFHRixNQUFNO3NCQURULEtBQUs7Z0JBWUYsTUFBTTtzQkFEVCxLQUFLO2dCQVlGLEtBQUs7c0JBRFIsS0FBSztnQkFpQkYsWUFBWTtzQkFEZixLQUFLO2dCQVdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdGLFVBQVU7c0JBRGIsS0FBSztnQkFZRixVQUFVO3NCQURiLEtBQUs7Z0JBWUYsU0FBUztzQkFEWixLQUFLO2dCQVlGLFdBQVc7c0JBRGQsS0FBSztnQkFrQkYsV0FBVztzQkFEZCxLQUFLO2dCQWdCRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUdGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkFlRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVhLG1CQUFtQjtzQkFBckMsTUFBTTtnQkFDWSxpQkFBaUI7c0JBQW5DLE1BQU07Z0JBQ1ksZ0JBQWdCO3NCQUFsQyxNQUFNO2dCQUNZLGtCQUFrQjtzQkFBcEMsTUFBTTtnQkFDWSxRQUFRO3NCQUExQixNQUFNO2dCQUNZLHVCQUF1QjtzQkFBekMsTUFBTTtnQkFDWSxtQkFBbUI7c0JBQXJDLE1BQU07Z0JBQ1ksc0JBQXNCO3NCQUF4QyxNQUFNO2dCQUUrQixlQUFlO3NCQUFwRCxlQUFlO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBJdGVyYWJsZURpZmZlcixcbiAgSXRlcmFibGVEaWZmZXJzLFxuICBLZXlWYWx1ZURpZmZlcixcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSwgTnVtYmVySW5wdXQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElUYWJsZSB9IGZyb20gJy4uLy4uL3RhYmxlL3RhYmxlLnR5cGUnO1xuaW1wb3J0IHtcbiAgSUNvbHVtbixcbiAgSUNvbHVtbkZpbHRlcixcbiAgSUNvbHVtbkZpbHRlclZhbHVlLFxuICBJSXRlbSxcbiAgSUl0ZW1JbnRlcm5hbCxcbiAgSVNtYXJ0VGFibGUsXG4gIElTb3J0ZXIsXG4gIElTb3J0ZXJWYWx1ZSxcbiAgSVRhYmxlRmlsdGVyLFxuICBJVGFibGVHcm91cFByb3BzLFxuICBJdGVtc1BlclBhZ2VTZWxlY3Rcbn0gZnJvbSAnLi4vc21hcnQtdGFibGUudHlwZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZUlkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYy1zbWFydC10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zbWFydC10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGV4cG9ydEFzOiAnY1NtYXJ0VGFibGUnXG59KVxuZXhwb3J0IGNsYXNzIFNtYXJ0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBJU21hcnRUYWJsZSwgQWZ0ZXJDb250ZW50SW5pdCwgT25DaGFuZ2VzIHtcblxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfYWN0aXZlUGFnZTogTnVtYmVySW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9jbGVhbmVyOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9jbGlja2FibGVSb3dzOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9mb290ZXI6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2hlYWRlcjogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfaXRlbXNQZXJQYWdlOiBOdW1iZXJJbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3BhZ2luYXRpb246IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3NlbGVjdGFibGU6IEJvb2xlYW5JbnB1dDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGl0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzLFxuICAgIHByaXZhdGUga2V5VmFsdWVEaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnNcbiAgKSB7XG4gICAgdGhpcy5pdGVtc0RpZmZlciA9IHRoaXMuaXRlcmFibGVEaWZmZXJzLmZpbmQodGhpcy5pdGVtcykuY3JlYXRlKCk7XG4gICAgdGhpcy5pdGVtc0ZpbHRlcmVkRGlmZmVyID0gdGhpcy5pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLl9jb2x1bW5GaWx0ZXJlZCkuY3JlYXRlKCk7XG4gICAgdGhpcy5jb2x1bUZpbHRlclZhbHVlRGlmZmVyID0gdGhpcy5rZXlWYWx1ZURpZmZlcnMuZmluZCh0aGlzLmNvbHVtbkZpbHRlclZhbHVlKS5jcmVhdGUoKTtcbiAgICB0aGlzLnNvcnRlclZhbHVlRGlmZmVyID0gdGhpcy5rZXlWYWx1ZURpZmZlcnMuZmluZCh0aGlzLnNvcnRlclZhbHVlKS5jcmVhdGUoKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZEFsbFN1YmplY3QubmV4dCh0aGlzLnNlbGVjdGVkQWxsKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHJlYWRvbmx5IHNlbGVjdGVkQWxsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbiB8ICdpbmRldGVybWluYXRlJz4oZmFsc2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXRlbXNEaWZmZXI6IEl0ZXJhYmxlRGlmZmVyPGFueT4gfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1zRmlsdGVyZWREaWZmZXI6IEl0ZXJhYmxlRGlmZmVyPGFueT4gfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbHVtRmlsdGVyVmFsdWVEaWZmZXI6IEtleVZhbHVlRGlmZmVyPGFueSwgYW55PiB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc29ydGVyVmFsdWVEaWZmZXI6IEtleVZhbHVlRGlmZmVyPGFueSwgYW55PiB8IG51bGw7XG5cbiAgQElucHV0KClcbiAgc2V0IGFjdGl2ZVBhZ2UodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2FjdGl2ZVBhZ2UgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSkgfHwgMTtcbiAgICB0aGlzLmFjdGl2ZVBhZ2VDaGFuZ2UuZW1pdCh0aGlzLl9hY3RpdmVQYWdlKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVBhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9hY3RpdmVQYWdlID0gMTtcblxuICBASW5wdXQoKVxuICBzZXQgY2xlYW5lcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2NsZWFuZXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGNsZWFuZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsZWFuZXI7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbmVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGNsaWNrYWJsZVJvd3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9jbGlja2FibGVSb3dzID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBjbGlja2FibGVSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jbGlja2FibGVSb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xpY2thYmxlUm93czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBjb2x1bW5zKHZhbHVlOiAoc3RyaW5nIHwgSUNvbHVtbilbXSkge1xuICAgIHRoaXMuX2NvbHVtbnMgPSB2YWx1ZS5tYXAoY29sdW1uID0+IHR5cGVvZiBjb2x1bW4gPT09ICdzdHJpbmcnID8geyBrZXk6IGNvbHVtbiB9IDogeyAuLi5jb2x1bW4gfSk7XG4gIH1cblxuICBnZXQgY29sdW1ucygpOiAoc3RyaW5nIHwgSUNvbHVtbilbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMgfHwgdGhpcy5yYXdDb2x1bW5OYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgX2NvbHVtbnM/OiAoc3RyaW5nIHwgSUNvbHVtbilbXTtcblxuICBASW5wdXQoKSBjb2x1bW5GaWx0ZXI/OiBib29sZWFuIHwgSUNvbHVtbkZpbHRlcjtcblxuICBASW5wdXQoKVxuICBzZXQgY29sdW1uRmlsdGVyVmFsdWUodmFsdWU6IElDb2x1bW5GaWx0ZXJWYWx1ZSkge1xuICAgIGlmICh0aGlzLmNvbHVtRmlsdGVyVmFsdWVEaWZmZXIpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmNvbHVtRmlsdGVyVmFsdWVEaWZmZXIuZGlmZih2YWx1ZSk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICB0aGlzLl9jb2x1bW5GaWx0ZXJWYWx1ZSA9IHsgLi4udmFsdWUgfTtcbiAgICAgICAgdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KHsgLi4udGhpcy5fY29sdW1uRmlsdGVyVmFsdWUgfSk7XG4gICAgICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy8gZW1pdHMgdGFibGVGaWx0ZXJlZCBjaGFuZ2VcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY29sdW1uRmlsdGVyVmFsdWUoKTogSUNvbHVtbkZpbHRlclZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRmlsdGVyVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9jb2x1bW5GaWx0ZXJWYWx1ZTogSUNvbHVtbkZpbHRlclZhbHVlID0ge307XG5cbiAgQElucHV0KCkgY29sdW1uU29ydGVyPzogYm9vbGVhbiB8IElTb3J0ZXI7XG5cbiAgQElucHV0KClcbiAgc2V0IGZvb3Rlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Zvb3RlciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgZm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mb290ZXI7XG4gIH1cblxuICBwcml2YXRlIF9mb290ZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgaGVhZGVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGVhZGVyID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBoZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcjtcbiAgfVxuXG4gIHByaXZhdGUgX2hlYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBpdGVtcyh2YWx1ZTogSUl0ZW1bXSkge1xuICAgIGlmICh0aGlzLml0ZW1zRGlmZmVyKSB7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtc0RpZmZlci5kaWZmKHZhbHVlKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gdGhpcy5zZXRJdGVtcyh2YWx1ZSkgYXMgQXJyYXk8VHlwZTxJSXRlbUludGVybmFsPj47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgX2l0ZW1zOiBJSXRlbUludGVybmFsW10gPSBbXSBhcyBBcnJheTxUeXBlPElJdGVtSW50ZXJuYWw+PjtcblxuICBASW5wdXQoKVxuICBzZXQgaXRlbXNQZXJQYWdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9pdGVtc1BlclBhZ2UgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgaXRlbXNQZXJQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zUGVyUGFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX2l0ZW1zUGVyUGFnZTogbnVtYmVyID0gMTA7XG5cbiAgQElucHV0KCkgaXRlbXNQZXJQYWdlTGFiZWw6IHN0cmluZyA9ICdJdGVtcyBwZXIgcGFnZTonO1xuICBASW5wdXQoKSBpdGVtc1BlclBhZ2VPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMjAsIDUwXTtcbiAgQElucHV0KCkgaXRlbXNQZXJQYWdlU2VsZWN0PzogYm9vbGVhbiB8IEl0ZW1zUGVyUGFnZVNlbGVjdDtcbiAgQElucHV0KCkgbG9hZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIG5vSXRlbXNMYWJlbDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiA9ICdObyBpdGVtcyBmb3VuZCc7XG5cbiAgQElucHV0KClcbiAgc2V0IHBhZ2luYXRpb24odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9wYWdpbmF0aW9uID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBwYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wYWdpbmF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBzZWxlY3RhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VsZWN0YWJsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2VsZWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0YWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgc2VsZWN0QWxsKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VsZWN0QWxsID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RBbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdEFsbDtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdEFsbDogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2V0IHNvcnRlclZhbHVlKHZhbHVlOiBJU29ydGVyVmFsdWUpIHtcbiAgICBpZiAodGhpcy5zb3J0ZXJWYWx1ZURpZmZlcikge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuc29ydGVyVmFsdWVEaWZmZXIuZGlmZih2YWx1ZSk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICB0aGlzLl9zb3J0ZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNvcnRlclZhbHVlQ2hhbmdlLmVtaXQoeyAuLi52YWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgc29ydGVyVmFsdWUoKTogSVNvcnRlclZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydGVyVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9zb3J0ZXJWYWx1ZTogSVNvcnRlclZhbHVlID0ge307XG5cbiAgQElucHV0KClcbiAgc2V0IHRhYmxlRmlsdGVyKGZpbHRlcikge1xuICAgIHRoaXMuX3RhYmxlRmlsdGVyID0gZmlsdGVyO1xuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy50YWJsZUZpbHRlckxhYmVsID0gdHlwZW9mIGZpbHRlci5sYWJlbCA9PT0gJ3N0cmluZycgPyBmaWx0ZXIubGFiZWwgOiB0aGlzLnRhYmxlRmlsdGVyTGFiZWw7XG4gICAgICB0aGlzLnRhYmxlRmlsdGVyUGxhY2Vob2xkZXIgPSB0eXBlb2YgZmlsdGVyLnBsYWNlaG9sZGVyID09PSAnc3RyaW5nJyA/IGZpbHRlci5wbGFjZWhvbGRlciA6IHRoaXMudGFibGVGaWx0ZXJQbGFjZWhvbGRlcjtcbiAgICAgIHRoaXMudGFibGVGaWx0ZXJWYWx1ZSA9IHR5cGVvZiBmaWx0ZXIudmFsdWUgPT09ICdzdHJpbmcnID8gZmlsdGVyLnZhbHVlIDogdGhpcy50YWJsZUZpbHRlclZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJsZUZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVGaWx0ZXI7XG4gIH1cblxuICBwcml2YXRlIF90YWJsZUZpbHRlcj86IGJvb2xlYW4gfCBJVGFibGVGaWx0ZXI7XG5cbiAgQElucHV0KCkgdGFibGVGaWx0ZXJMYWJlbCA9ICdGaWx0ZXI6JztcbiAgQElucHV0KCkgdGFibGVGaWx0ZXJQbGFjZWhvbGRlciA9ICd0eXBlIHN0cmluZy4uLic7XG5cbiAgQElucHV0KClcbiAgc2V0IHRhYmxlRmlsdGVyVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl90YWJsZUZpbHRlclZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdGFibGVGaWx0ZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy50YWJsZUZpbHRlclZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgdGhpcy50YWJsZUZpbHRlcmVkOyAvLyBlbWl0cyB0YWJsZUZpbHRlcmVkIGNoYW5nZVxuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJsZUZpbHRlclZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlRmlsdGVyVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF90YWJsZUZpbHRlclZhbHVlOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKSB0YWJsZUJvZHlQcm9wcz86IElUYWJsZUdyb3VwUHJvcHMgPSB7fTtcbiAgQElucHV0KCkgdGFibGVGb290UHJvcHM/OiBJVGFibGVHcm91cFByb3BzID0ge307XG4gIEBJbnB1dCgpIHRhYmxlSGVhZFByb3BzPzogSVRhYmxlR3JvdXBQcm9wcyA9IHt9O1xuICBASW5wdXQoKSB0YWJsZVByb3BzPzogSVRhYmxlID0ge307XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkSXRlbXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJSXRlbVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUl0ZW1bXT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNvcnRlclZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SVNvcnRlclZhbHVlPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRlclZhbHVlPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgYWN0aXZlUGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGl0ZW1zUGVyUGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHJvd0NsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgY29sdW1uRmlsdGVyVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJQ29sdW1uRmlsdGVyVmFsdWU+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uRmlsdGVyVmFsdWU+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBmaWx0ZXJlZEl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SUl0ZW1JbnRlcm5hbFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUl0ZW1JbnRlcm5hbFtdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgdGFibGVGaWx0ZXJWYWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlSWREaXJlY3RpdmUpIGNvbHVtblRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZUlkRGlyZWN0aXZlPjtcbiAgdGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IChUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCkgfSA9IHsgdGFibGVEZXRhaWxzOiBudWxsLCB0YWJsZURhdGE6IG51bGwgfTtcbiAgY29sdW1uRmlsdGVyVGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IChUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCkgfSA9IHt9O1xuICBjb2x1bW5MYWJlbFRlbXBsYXRlczogeyBba2V5OiBzdHJpbmddOiAoVGVtcGxhdGVSZWY8YW55PiB8IG51bGwpIH0gPSB7fTtcbiAgc3VtbWFyeVJvd1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtblRlbXBsYXRlcy5mb3JFYWNoKChjaGlsZDogVGVtcGxhdGVJZERpcmVjdGl2ZSkgPT4ge1xuICAgICAgaWYgKGNoaWxkLmlkLnN0YXJ0c1dpdGgoJ2NvbHVtbkZpbHRlcl8nKSkge1xuICAgICAgICB0aGlzLmNvbHVtbkZpbHRlclRlbXBsYXRlc1tjaGlsZC5pZF0gPSBjaGlsZC50ZW1wbGF0ZVJlZjtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkLmlkLnN0YXJ0c1dpdGgoJ2NvbHVtbkxhYmVsXycpKSB7XG4gICAgICAgIHRoaXMuY29sdW1uTGFiZWxUZW1wbGF0ZXNbY2hpbGQuaWRdID0gY2hpbGQudGVtcGxhdGVSZWY7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZC5pZCA9PT0gJ3RhYmxlU3VtbWFyeVJvdycpIHtcbiAgICAgICAgdGhpcy5zdW1tYXJ5Um93VGVtcGxhdGUgPSBjaGlsZC50ZW1wbGF0ZVJlZjtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy50ZW1wbGF0ZXNbY2hpbGQuaWRdID0gY2hpbGQudGVtcGxhdGVSZWY7XG4gICAgfSk7XG4gICAgdGhpcy5jb2x1bW5GaWx0ZXJUZW1wbGF0ZXMgPSB7IC4uLnRoaXMuY29sdW1uRmlsdGVyVGVtcGxhdGVzIH07XG4gICAgdGhpcy5jb2x1bW5MYWJlbFRlbXBsYXRlcyA9IHsgLi4udGhpcy5jb2x1bW5MYWJlbFRlbXBsYXRlcyB9O1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkQWxsKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pdGVtcy5zb21lKChpdGVtKSA9PiBpdGVtLl9zZWxlY3RlZCA9PT0gdHJ1ZSk7XG4gICAgY29uc3QgdW5zZWxlY3RlZCA9IHRoaXMuaXRlbXMuc29tZSgoaXRlbSkgPT4gaXRlbS5fc2VsZWN0ZWQgPT09IGZhbHNlKTtcbiAgICByZXR1cm4gc2VsZWN0ZWQgJiYgdW5zZWxlY3RlZCA/ICdpbmRldGVybWluYXRlJyA6IHNlbGVjdGVkO1xuICB9XG5cbiAgZ2V0IHRhYmxlRmlsdGVyU3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVGaWx0ZXJWYWx1ZSA/IHRoaXMudGFibGVGaWx0ZXJWYWx1ZSA6ICcnO1xuICB9XG5cbiAgZ2V0IGNvbHVtbkZpbHRlclN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbkZpbHRlclZhbHVlID8gdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSA6IHt9O1xuICB9XG5cbiAgZ2V0IG51bWJlck9mUGFnZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXNQZXJQYWdlID8gTWF0aC5jZWlsKHRoaXMuc29ydGVkSXRlbXMubGVuZ3RoIC8gdGhpcy5faXRlbXNQZXJQYWdlKSA6IDE7XG4gIH1cblxuICBnZXQgY29sc3BhbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RhYmxlID8gdGhpcy5yYXdDb2x1bW5OYW1lcy5sZW5ndGggKyAxIDogdGhpcy5yYXdDb2x1bW5OYW1lcy5sZW5ndGg7XG4gIH1cblxuICBnZXQgZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlUGFnZSA/ICh0aGlzLl9hY3RpdmVQYWdlIC0gMSkgKiB0aGlzLl9pdGVtc1BlclBhZ2UgOiAwO1xuICB9XG5cbiAgZ2V0IGl0ZW1zT25BY3RpdmVQYWdlKCk6IElJdGVtSW50ZXJuYWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydGVkSXRlbXMuc2xpY2UoXG4gICAgICB0aGlzLmZpcnN0SXRlbU9uQWN0aXZlUGFnZUluZGV4LFxuICAgICAgdGhpcy5maXJzdEl0ZW1PbkFjdGl2ZVBhZ2VJbmRleCArIHRoaXMuX2l0ZW1zUGVyUGFnZVxuICAgICk7XG4gIH1cblxuICBnZXQgY3VycmVudEl0ZW1zKCk6IElJdGVtSW50ZXJuYWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVBhZ2UgPyB0aGlzLml0ZW1zT25BY3RpdmVQYWdlIDogdGhpcy5zb3J0ZWRJdGVtcyA/PyBbXTtcbiAgICAvLyByZXR1cm4gdGhpcy5pdGVtcyA/PyBbXTtcbiAgfVxuXG4gIGdldCBnZW5Db2xzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9pdGVtcy5sZW5ndGggPyB0aGlzLl9pdGVtc1swXSA/PyB7fSA6IHt9KS5maWx0ZXIoKGVsKSA9PiBlbC5jaGFyQXQoMCkgIT09ICdfJyk7XG4gIH1cblxuICBnZXQgcmF3Q29sdW1uTmFtZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMgPyB0aGlzLl9jb2x1bW5zLm1hcChjb2x1bW4gPT4gdHlwZW9mIGNvbHVtbiA9PT0gJ29iamVjdCcgPyBjb2x1bW4ua2V5IDogY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5nZW5Db2xzO1xuICB9XG5cbiAgZ2V0IGl0ZW1zRGF0YUNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3Q29sdW1uTmFtZXMuZmlsdGVyKChuYW1lKSA9PiB0aGlzLmdlbkNvbHMuaW5jbHVkZXMobmFtZSkpO1xuICB9XG5cbiAgZ2V0IHNvcnRlZEl0ZW1zKCk6IElJdGVtSW50ZXJuYWxbXSB7XG4gICAgY29uc3QgY29sdW1uS2V5ID0gdGhpcy5zb3J0ZXJWYWx1ZS5jb2x1bW47XG4gICAgaWYgKFxuICAgICAgIWNvbHVtbktleSB8fFxuICAgICAgIXRoaXMuaXRlbXNEYXRhQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW5LZXkpIHx8XG4gICAgICAodGhpcy5jb2x1bW5Tb3J0ZXIgJiZcbiAgICAgICAgdHlwZW9mIHRoaXMuY29sdW1uU29ydGVyID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0aGlzLmNvbHVtblNvcnRlci5leHRlcm5hbClcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlRmlsdGVyZWQ7XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlRmlsdGVyZWQgPSBbLi4udGhpcy50YWJsZUZpbHRlcmVkXTtcblxuICAgIC8vIGlmIHZhbHVlcyBpbiBjb2x1bW4gYXJlIHRvIGJlIHNvcnRlZCBieSBudW1lcmljIHZhbHVlIHRoZXkgYWxsIGhhdmUgdG8gYmUgYSB0eXBlIG9mIG51bWJlclxuICAgIGNvbnN0IGZsaXAgPSB0aGlzLnNvcnRlclZhbHVlLnN0YXRlID09PSAnYXNjJyA/IDEgOiB0aGlzLnNvcnRlclZhbHVlLnN0YXRlID09PSAnZGVzYycgPyAtMSA6IDA7XG5cbiAgICBpZiAoZmxpcCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRhYmxlRmlsdGVyZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW4pID0+IHR5cGVvZiBjb2x1bW4gPT09ICdvYmplY3QnICYmIGNvbHVtbi5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50Q29sdW1uID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY3VycmVudENvbHVtbi5zb3J0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHNvcnRlZCA9IHRhYmxlRmlsdGVyZWQuc2xpY2UoKS5zb3J0KGN1cnJlbnRDb2x1bW4uc29ydGVyKTtcbiAgICAgIHJldHVybiBmbGlwIDwgMCA/IHNvcnRlZC5yZXZlcnNlKCkgOiBzb3J0ZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGFyZUZuID0gKGl0ZW0xOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0sIGl0ZW0yOiB7IFt4OiBzdHJpbmddOiBhbnk7IH0pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IGl0ZW0xW2NvbHVtbktleV07XG4gICAgICBjb25zdCB2YWx1ZTIgPSBpdGVtMltjb2x1bW5LZXldO1xuICAgICAgY29uc3QgYSA9IHR5cGVvZiB2YWx1ZTEgPT09ICdudW1iZXInID8gdmFsdWUxIDogU3RyaW5nKHZhbHVlMSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGIgPSB0eXBlb2YgdmFsdWUyID09PSAnbnVtYmVyJyA/IHZhbHVlMiA6IFN0cmluZyh2YWx1ZTIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gYSA+IGIgPyAxICogZmxpcCA6IGIgPiBhID8gLTEgKiBmbGlwIDogMDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRhYmxlRmlsdGVyZWQuc2xpY2UoKS5zb3J0KGNvbXBhcmVGbik7XG4gIH1cblxuICBnZXQgdGFibGVGaWx0ZXJFdmVudCgpOiAnY2hhbmdlJyB8ICdpbnB1dCcge1xuICAgIHJldHVybiAodHlwZW9mIHRoaXMudGFibGVGaWx0ZXIgPT09ICdvYmplY3QnICYmIHRoaXMudGFibGVGaWx0ZXIubGF6eSkgPyAnY2hhbmdlJyA6ICdpbnB1dCc7XG4gIH07XG5cbiAgcHJpdmF0ZSBfY29sdW1uRmlsdGVyZWQ6IElJdGVtSW50ZXJuYWxbXSA9IFtdO1xuXG4gIGdldCBjb2x1bW5GaWx0ZXJlZCgpOiBJSXRlbUludGVybmFsW10ge1xuICAgIGxldCBfaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbHVtbkZpbHRlciAmJlxuICAgICAgdHlwZW9mIHRoaXMuY29sdW1uRmlsdGVyID09PSAnb2JqZWN0JyAmJlxuICAgICAgdGhpcy5jb2x1bW5GaWx0ZXIuZXh0ZXJuYWxcbiAgICApIHtcbiAgICAgIHRoaXMuX2NvbHVtbkZpbHRlcmVkID0gX2l0ZW1zO1xuICAgICAgcmV0dXJuIF9pdGVtcztcbiAgICB9XG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5jb2x1bW5GaWx0ZXJTdGF0ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG5cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgIF9pdGVtcyA9IF9pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHZhbHVlKGl0ZW1ba2V5XSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2x1bW4gPT4gdHlwZW9mIGNvbHVtbiA9PT0gJ29iamVjdCcgJiYgY29sdW1uLmtleSA9PT0ga2V5KTtcbiAgICAgIGlmICh0eXBlb2YgY3VycmVudENvbHVtbiA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGN1cnJlbnRDb2x1bW4uZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIF9pdGVtcyA9IF9pdGVtcy5maWx0ZXIoKGl0ZW0pID0+ICh0eXBlb2YgY3VycmVudENvbHVtbi5maWx0ZXIgPT09ICdmdW5jdGlvbicgJiYgY3VycmVudENvbHVtbi5maWx0ZXIoaXRlbSwgdmFsdWUpKSA/PyAhdmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbHVtbkZpbHRlciA9IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChjb2x1bW5GaWx0ZXIgJiYgdGhpcy5pdGVtc0RhdGFDb2x1bW5zLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgX2l0ZW1zID0gX2l0ZW1zLmZpbHRlcigoaXRlbSkgPT4gU3RyaW5nKGl0ZW1ba2V5XSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhjb2x1bW5GaWx0ZXIpKTtcbiAgICAgIH1cblxuICAgIH0pO1xuICAgIHRoaXMuX2NvbHVtbkZpbHRlcmVkID0gX2l0ZW1zO1xuICAgIHJldHVybiBfaXRlbXM7XG4gIH1cblxuICBnZXQgdGFibGVGaWx0ZXJlZCgpOiBJSXRlbUludGVybmFsW10ge1xuICAgIGxldCBpdGVtcyA9IHRoaXMuY29sdW1uRmlsdGVyZWQ7XG4gICAgaWYgKFxuICAgICAgIXRoaXMudGFibGVGaWx0ZXJTdGF0ZSB8fFxuICAgICAgKHRoaXMudGFibGVGaWx0ZXIgJiYgdHlwZW9mIHRoaXMudGFibGVGaWx0ZXIgPT09ICdvYmplY3QnICYmIHRoaXMudGFibGVGaWx0ZXIuZXh0ZXJuYWwpXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc0ZpbHRlcmVkRGlmZmVyKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLml0ZW1zRmlsdGVyZWREaWZmZXIuZGlmZihpdGVtcyk7XG4gICAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zQ2hhbmdlLmVtaXQoaXRlbXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMudGFibGVGaWx0ZXJTdGF0ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHZhbHVlQ29udGFpbkZpbHRlciA9ICh2YWw6IGFueSkgPT4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbTogeyBbeDogc3RyaW5nXTogYW55OyB9KSA9PiB7XG4gICAgICByZXR1cm4gISF0aGlzLml0ZW1zRGF0YUNvbHVtbnMuZmluZCgoa2V5KSA9PiB2YWx1ZUNvbnRhaW5GaWx0ZXIoaXRlbVtrZXldKSk7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuaXRlbXNGaWx0ZXJlZERpZmZlcikge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuaXRlbXNGaWx0ZXJlZERpZmZlci5kaWZmKGl0ZW1zKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtc0NoYW5nZS5lbWl0KGl0ZW1zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgZ2V0IGlzRmlsdGVyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVGaWx0ZXJTdGF0ZSB8fCB0aGlzLnNvcnRlclZhbHVlPy5jb2x1bW4gfHwgT2JqZWN0LnZhbHVlcyh0aGlzLmNvbHVtbkZpbHRlclN0YXRlKS5qb2luKCcnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SXRlbXMoaXRlbXM6IElJdGVtW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW06IElJdGVtLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiB7IC4uLml0ZW0sIF9pZDogaW5kZXggfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gPElJdGVtSW50ZXJuYWw+W107XG4gIH1cblxuICBoYW5kbGVTb3J0Q2hhbmdlKCRldmVudDogeyBjb2x1bW5LZXk6IHN0cmluZzsgaW5kZXg6IG51bWJlcjsgfSkge1xuICAgIHRoaXMuaGFuZGxlU29ydGVyQ2hhbmdlKCRldmVudC5jb2x1bW5LZXksICRldmVudC5pbmRleCk7XG4gIH1cblxuICBpc1NvcnRhYmxlKGk6IG51bWJlcik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzRGF0YUNvbHVtbiA9IHRoaXMuaXRlbXNEYXRhQ29sdW1ucy5pbmNsdWRlcyh0aGlzLnJhd0NvbHVtbk5hbWVzW2ldKTtcbiAgICBsZXQgY29sdW1uO1xuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29sdW1uU29ydGVyICYmXG4gICAgICAoIXRoaXMuY29sdW1ucyB8fFxuICAgICAgICB0eXBlb2YgY29sdW1uICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICAodHlwZW9mIGNvbHVtbiA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiBjb2x1bW4uc29ydGVyID09PSAndW5kZWZpbmVkJyB8fCBjb2x1bW4uc29ydGVyKSlcbiAgICAgICkgJiYgaXNEYXRhQ29sdW1uXG4gICAgKTtcbiAgfVxuXG4gIGhhbmRsZVNvcnRlckNoYW5nZShjb2x1bW46IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1NvcnRhYmxlKGluZGV4KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvL2lmIGNvbHVtbiBjaGFuZ2VkIG9yIHNvcnQgd2FzIGRlc2NlbmRpbmcgY2hhbmdlIGFzYyB0byB0cnVlXG4gICAgY29uc3Qgc3RhdGUgPSB7IC4uLnRoaXMuc29ydGVyVmFsdWUgfTtcblxuICAgIGlmIChzdGF0ZS5jb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgaWYgKHN0YXRlLnN0YXRlID09PSAwKSB7XG4gICAgICAgIHN0YXRlLnN0YXRlID0gJ2FzYyc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLnN0YXRlID09PSAnYXNjJykge1xuICAgICAgICBzdGF0ZS5zdGF0ZSA9ICdkZXNjJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb2x1bW5Tb3J0ZXIgPT09ICdvYmplY3QnICYmICF0aGlzLmNvbHVtblNvcnRlci5yZXNldGFibGUpIHtcbiAgICAgICAgICBzdGF0ZS5zdGF0ZSA9ICdhc2MnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLnN0YXRlID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb2x1bW4gPSBjb2x1bW47XG4gICAgICBzdGF0ZS5zdGF0ZSA9ICdhc2MnO1xuICAgIH1cbiAgICB0aGlzLnNvcnRlclZhbHVlID0geyAuLi5zdGF0ZSB9O1xuICB9XG5cbiAgc2V0QWN0aXZlUGFnZSgkZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlUGFnZSA9ICRldmVudDtcbiAgfVxuXG4gIGhhbmRsZUNvbHVtbkZpbHRlckNoYW5nZSgkZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHsgY29sdW1uLCB2YWx1ZSwgdHlwZSB9ID0gJGV2ZW50O1xuICAgIHRoaXMuc2V0QWN0aXZlUGFnZSgxKTtcbiAgICB0aGlzLmNvbHVtbkZpbHRlclZhbHVlID0geyAuLi50aGlzLmNvbHVtbkZpbHRlclZhbHVlLCBbYCR7Y29sdW1ufWBdOiB2YWx1ZSB9O1xuICB9XG5cbiAgaGFuZGxlVGFibGVGaWx0ZXJDaGFuZ2UoJGV2ZW50OiB7IHZhbHVlOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgfSkge1xuICAgIGNvbnN0IHsgdmFsdWUsIHR5cGUgfSA9ICRldmVudDtcbiAgICBjb25zdCBpc0xhenkgPSB0eXBlb2YgdGhpcy50YWJsZUZpbHRlciA9PT0gJ29iamVjdCcgJiYgdGhpcy50YWJsZUZpbHRlci5sYXp5ID09PSB0cnVlO1xuICAgIGlmICgoKGlzTGF6eSAmJiB0eXBlID09PSAnaW5wdXQnKSB8fCAoIWlzTGF6eSAmJiB0eXBlID09PSAnY2hhbmdlJykpICYmIHZhbHVlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XG4gICAgdGhpcy50YWJsZUZpbHRlclZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBjbGVhbigkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmNvbHVtbkZpbHRlclZhbHVlID0ge307XG4gICAgdGhpcy50YWJsZUZpbHRlclZhbHVlID0gJyc7XG4gICAgdGhpcy5zb3J0ZXJWYWx1ZSA9IHt9O1xuICAgIHRoaXMudGFibGVGaWx0ZXJlZDsgLy9lbWl0cyB0YWJsZUZpbHRlcmVkIGNoYW5nZVxuICB9XG5cbiAgaGFuZGxlSXRlbXNQZXJQYWdlQ2hhbmdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX2l0ZW1zUGVyUGFnZSkge1xuICAgICAgdGhpcy5zZXRBY3RpdmVQYWdlKDEpO1xuICAgICAgdGhpcy5faXRlbXNQZXJQYWdlID0gdmFsdWU7XG4gICAgICB0aGlzLml0ZW1zUGVyUGFnZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVSb3dDaGVja2VkKCRldmVudDogRXZlbnQsIGl0ZW06IElJdGVtSW50ZXJuYWwpIHtcbiAgICBpdGVtLl9zZWxlY3RlZCA9IGl0ZW0uX3NlbGVjdGFibGUgIT09IGZhbHNlICYmICgkZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQodGhpcy5pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uX3NlbGVjdGVkID09PSB0cnVlKSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkQWxsU3ViamVjdC5uZXh0KHRoaXMuc2VsZWN0ZWRBbGwpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5faXRlbXMgPSB0aGlzLml0ZW1zLm1hcCgoaXRlbTogSUl0ZW1JbnRlcm5hbCkgPT4ge1xuICAgICAgcmV0dXJuIHsgLi4uaXRlbSwgX3NlbGVjdGVkOiAoaXRlbS5fc2VsZWN0YWJsZSAhPT0gZmFsc2UgPyAkZXZlbnQgOiAhIWl0ZW0uX3NlbGVjdGVkKSB9O1xuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0ZWRBbGxTdWJqZWN0Lm5leHQoJGV2ZW50KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHRoaXMuaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLl9zZWxlY3RlZCA9PT0gdHJ1ZSkpO1xuICAgICAgdGhpcy5zZWxlY3RlZEFsbFN1YmplY3QubmV4dCh0aGlzLnNlbGVjdGVkQWxsKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHRhYmxlRGF0YUNlbGxQcm9wcyhpdGVtOiBJSXRlbSwgY29sTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvcHMgPSBpdGVtWydfY2VsbFByb3BzJ10gJiYge1xuICAgICAgLi4uKGl0ZW1bJ19jZWxsUHJvcHMnXVsnX2FsbCddICYmIHsgLi4uaXRlbVsnX2NlbGxQcm9wcyddWydfYWxsJ10gfSksXG4gICAgICAuLi4oaXRlbVsnX2NlbGxQcm9wcyddW2NvbE5hbWVdICYmIHsgLi4uaXRlbVsnX2NlbGxQcm9wcyddW2NvbE5hbWVdIH0pXG4gICAgfTtcbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cblxuICB0YWJsZURhdGFDZWxsQ2xhc3NlcyhpdGVtOiBJSXRlbSwgY29sTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJyA/IGNvbHVtbiA9PT0gY29sTmFtZSA6IGNvbHVtblsna2V5J10gPT09IGNvbE5hbWUpO1xuICAgIHJldHVybiBjb2x1bW5bMF0gJiYgdHlwZW9mIGNvbHVtblswXSA9PT0gJ29iamVjdCcgPyBjb2x1bW5bMF0uX2NsYXNzZXMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRDb2x1bW5OYW1lKCRldmVudDogTW91c2VFdmVudCk6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0ID0gJGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICAgIGNvbnN0IGNsb3Nlc3QgPSB0YXJnZXQuY2xvc2VzdCgndHInKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNsb3Nlc3QgPyBBcnJheS5mcm9tKGNsb3Nlc3QuY2hpbGRyZW4pIDogW107XG4gICAgY29uc3QgY2xpY2tlZENlbGwgPSBjaGlsZHJlbi5maWx0ZXIoKGNoaWxkKSA9PiBjaGlsZC5jb250YWlucyh0YXJnZXQpKVswXTtcbiAgICByZXR1cm4gdGhpcy5yYXdDb2x1bW5OYW1lc1tjaGlsZHJlbi5pbmRleE9mKGNsaWNrZWRDZWxsKSAtICh0aGlzLl9zZWxlY3RhYmxlID8gMSA6IDApXTtcbiAgfVxuXG4gIGhhbmRsZVJvd0NsaWNrKHBhcmFtOiB7ICRldmVudDogTW91c2VFdmVudDsgaXRlbTogSUl0ZW1JbnRlcm5hbDsgaTogbnVtYmVyIH0pIHtcbiAgICBjb25zdCB7ICRldmVudCwgaXRlbSwgaSB9ID0geyAuLi5wYXJhbSB9O1xuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLmdldENvbHVtbk5hbWUocGFyYW0uJGV2ZW50KTtcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQoeyBpdGVtOiBpdGVtLCBpbmRleDogaSArIHRoaXMuZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXgsIGNvbHVtbk5hbWUsIGV2ZW50OiAkZXZlbnQgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbHVtbkZpbHRlclZhbHVlJ10pIHtcbiAgICAgIGNvbnN0IGNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlID0gY2hhbmdlc1snY29sdW1uRmlsdGVyVmFsdWUnXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbHVtbkZpbHRlclZhbHVlQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgY3VycmVudFZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhjdXJyZW50VmFsdWUgPz8ge30pLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0YWJsZUZpbHRlclZhbHVlJ10pIHtcbiAgICAgIGNvbnN0IHRhYmxlRmlsdGVyVmFsdWVDaGFuZ2UgPSBjaGFuZ2VzWyd0YWJsZUZpbHRlclZhbHVlJ107XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0YWJsZUZpbHRlclZhbHVlQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlUGFnZSgxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJpdGVtc1BlclBhZ2VTZWxlY3QgfHwgdGFibGVGaWx0ZXIgfHwgY2xlYW5lciB8fCB0ZW1wbGF0ZXNbJ3RhYmxlQ3VzdG9tSGVhZGVyJ11cIiBjbGFzcz1cInJvdyBteS0yIG14LTBcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIHAtMFwiICpuZ0lmPVwidGFibGVGaWx0ZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVGaWx0ZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIHAtMFwiICpuZ0lmPVwiY2xlYW5lclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZUNsZWFuZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1sndGFibGVDdXN0b21IZWFkZXInXSB8fCB0YWJsZUN1c3RvbUhlYWRlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlICN0YWJsZUZpbHRlclRlbXBsYXRlPlxuICAgIDxjLXNtYXJ0LXRhYmxlLWZpbHRlclxuICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZVRhYmxlRmlsdGVyQ2hhbmdlKCRldmVudClcIlxuICAgICAgKm5nSWY9XCJ0YWJsZUZpbHRlclwiXG4gICAgICBbZGVsYXldPVwiMzAwXCJcbiAgICAgIFtmaWx0ZXJMYWJlbF09XCJ0YWJsZUZpbHRlckxhYmVsXCJcbiAgICAgIFtmaWx0ZXJQbGFjZWhvbGRlcl09XCJ0YWJsZUZpbHRlclBsYWNlaG9sZGVyXCJcbiAgICAgIFtvbkV2ZW50XT1cInRhYmxlRmlsdGVyRXZlbnRcIlxuICAgICAgW3ZhbHVlXT1cInRhYmxlRmlsdGVyU3RhdGVcIlxuICAgICAgY0ZpbHRlcklucHV0XG4gICAgPlxuICAgIDwvYy1zbWFydC10YWJsZS1maWx0ZXI+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlICN0YWJsZUNsZWFuZXJUZW1wbGF0ZT5cbiAgICA8YnV0dG9uXG4gICAgICAoY2xpY2spPVwiY2xlYW4oJGV2ZW50KVwiXG4gICAgICAqbmdJZj1cImNsZWFuZXJcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFpc0ZpbHRlcmVkXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnbXMtMSc6IHRhYmxlRmlsdGVyfVwiXG4gICAgICBbdGFiaW5kZXhdPVwiMFwiXG4gICAgICBjQnV0dG9uXG4gICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgY29sb3I9XCJ0cmFuc3BhcmVudFwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpbHRlckljb25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSAjdGFibGVDdXN0b21IZWFkZXJUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcC0wIG1zLWF1dG9cIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltjdXN0b21IZWFkZXJdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgPHRhYmxlIFthbGlnbl09XCJ0YWJsZVByb3BzPy5hbGlnblwiXG4gICAgICAgICBbYm9yZGVyQ29sb3JdPVwidGFibGVQcm9wcz8uYm9yZGVyQ29sb3JcIlxuICAgICAgICAgW2JvcmRlcmVkXT1cInRhYmxlUHJvcHM/LmJvcmRlcmVkID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbYm9yZGVybGVzc109XCJ0YWJsZVByb3BzPy5ib3JkZXJsZXNzID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbY2FwdGlvbl09XCJ0YWJsZVByb3BzPy5jYXB0aW9uXCJcbiAgICAgICAgIFtjb2xvcl09XCJ0YWJsZVByb3BzPy5jb2xvclwiXG4gICAgICAgICBbaG92ZXJdPVwidGFibGVQcm9wcz8uaG92ZXIgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgIFtyZXNwb25zaXZlXT1cInRhYmxlUHJvcHM/LnJlc3BvbnNpdmVcIlxuICAgICAgICAgW3NtYWxsXT1cInRhYmxlUHJvcHM/LnNtYWxsID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbc3RyaXBlZF09XCJ0YWJsZVByb3BzPy5zdHJpcGVkID8/IHVuZGVmaW5lZFwiXG4gICAgICAgICBbY0h0bWxBdHRyXT1cInRhYmxlUHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxuICAgICAgICAgW2NUYWJsZUNvbG9yXT1cInRhYmxlUHJvcHM/LmNvbG9yXCJcbiAgICAgICAgIGNUYWJsZVxuICA+XG4gICAgPGMtc21hcnQtdGFibGUtaGVhZFxuICAgICAgKGNvbHVtbkZpbHRlclN0YXRlQ2hhbmdlKT1cImhhbmRsZUNvbHVtbkZpbHRlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChzZWxlY3RBbGxDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxuICAgICAgKHNvcnRlclN0YXRlQ2hhbmdlKT1cImhhbmRsZVNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAqbmdJZj1cImhlYWRlclwiXG4gICAgICBbY29sdW1uRmlsdGVyU3RhdGVdPVwiY29sdW1uRmlsdGVyU3RhdGVcIlxuICAgICAgW2NvbHVtbkZpbHRlcl09XCJjb2x1bW5GaWx0ZXJcIlxuICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gICAgICBbc2VsZWN0QWxsXT1cInNlbGVjdEFsbFwiXG4gICAgICBbc2VsZWN0ZWRBbGxdPVwiKHNlbGVjdGVkQWxsU3ViamVjdCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICBbc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCJcbiAgICAgIFtjb2x1bW5Tb3J0ZXJdPVwiY29sdW1uU29ydGVyXCJcbiAgICAgIFtzb3J0ZXJWYWx1ZV09XCJzb3J0ZXJWYWx1ZVwiXG4gICAgICBbY0h0bWxBdHRyXT1cInRhYmxlSGVhZFByb3BzPy5hdHRyaWJ1dGVzID8/IHt9XCJcbiAgICAgIFtjVGFibGVDb2xvcl09XCJ0YWJsZUhlYWRQcm9wcz8uY29sb3JcIlxuICAgICAgW2NBbGlnbl09XCJ0YWJsZUhlYWRQcm9wcz8uYWxpZ25cIlxuICAgICAgW2NvbHVtbkZpbHRlclRlbXBsYXRlc109XCJjb2x1bW5GaWx0ZXJUZW1wbGF0ZXNcIlxuICAgICAgW2NvbHVtbkxhYmVsVGVtcGxhdGVzXT1cImNvbHVtbkxhYmVsVGVtcGxhdGVzXCJcbiAgICA+PC9jLXNtYXJ0LXRhYmxlLWhlYWQ+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGJvZHlEZWZhdWx0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cblxuICAgIDx0Zm9vdCAqbmdJZj1cInN1bW1hcnlSb3dUZW1wbGF0ZSAmJiAhZm9vdGVyXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3VtbWFyeVJvd1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC90Zm9vdD5cblxuICAgIDxjLXNtYXJ0LXRhYmxlLWhlYWRcbiAgICAgIChzZWxlY3RBbGxDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxuICAgICAgKHNvcnRlclN0YXRlQ2hhbmdlKT1cImhhbmRsZVNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAqbmdJZj1cImZvb3RlclwiXG4gICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcbiAgICAgIFtzZWxlY3RBbGxdPVwic2VsZWN0QWxsXCJcbiAgICAgIFtzZWxlY3RlZEFsbF09XCIoc2VsZWN0ZWRBbGxTdWJqZWN0IHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgIFtzZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIlxuICAgICAgW2NvbHVtblNvcnRlcl09XCJjb2x1bW5Tb3J0ZXJcIlxuICAgICAgW3NvcnRlclZhbHVlXT1cInNvcnRlclZhbHVlXCJcbiAgICAgIFtjSHRtbEF0dHJdPVwidGFibGVGb290UHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxuICAgICAgW2NUYWJsZUNvbG9yXT1cInRhYmxlRm9vdFByb3BzPy5jb2xvclwiXG4gICAgICBbY0FsaWduXT1cInRhYmxlRm9vdFByb3BzPy5hbGlnblwiXG4gICAgICBjb21wb25lbnQ9XCJ0Zm9vdFwiXG4gICAgICBbY29sdW1uRmlsdGVyVGVtcGxhdGVzXT1cImNvbHVtbkZpbHRlclRlbXBsYXRlc1wiXG4gICAgICBbY29sdW1uTGFiZWxUZW1wbGF0ZXNdPVwiY29sdW1uTGFiZWxUZW1wbGF0ZXNcIlxuICAgICAgW3N1bW1hcnlSb3dUZW1wbGF0ZV09XCJzdW1tYXJ5Um93VGVtcGxhdGVcIlxuICAgID48L2Mtc21hcnQtdGFibGUtaGVhZD5cblxuICA8L3RhYmxlPlxuICA8Yy1lbGVtZW50LWNvdmVyXG4gICAgKm5nSWY9XCJsb2FkaW5nXCJcbiAgICBbYm91bmRhcmllc109XCJbXG4gICAgICB7IHNpZGVzOiBbJ3RvcCddLCBxdWVyeTogJ3RkJyB9LFxuICAgICAgeyBzaWRlczogWydib3R0b20nXSwgcXVlcnk6ICd0Ym9keScgfVxuICAgIF1cIlxuICA+PC9jLWVsZW1lbnQtY292ZXI+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSBbbmdJZl09XCJwYWdpbmF0aW9uIHx8IGl0ZW1zUGVyUGFnZVNlbGVjdFwiPlxuICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgPGMtc21hcnQtcGFnaW5hdGlvblxuICAgICAgICAoYWN0aXZlUGFnZUNoYW5nZSk9XCJzZXRBY3RpdmVQYWdlKCRldmVudClcIlxuICAgICAgICAqbmdJZj1cInBhZ2luYXRpb24gJiYgbnVtYmVyT2ZQYWdlcyA+IDFcIlxuICAgICAgICBbYWN0aXZlUGFnZV09XCJhY3RpdmVQYWdlXCJcbiAgICAgICAgW3BhZ2VzXT1cIm51bWJlck9mUGFnZXNcIj5cbiAgICAgIDwvYy1zbWFydC1wYWdpbmF0aW9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBtcy1hdXRvXCI+XG4gICAgICA8Yy1zbWFydC10YWJsZS1pdGVtcy1wZXItcGFnZS1zZWxlY3RvclxuICAgICAgICAoaXRlbXNQZXJQYWdlQ2hhbmdlKT1cImhhbmRsZUl0ZW1zUGVyUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKm5nSWY9XCJpdGVtc1BlclBhZ2VTZWxlY3RcIlxuICAgICAgICBbaXRlbXNQZXJQYWdlTGFiZWxdPVwiaXRlbXNQZXJQYWdlTGFiZWxcIlxuICAgICAgICBbaXRlbXNQZXJQYWdlT3B0aW9uc109XCJpdGVtc1BlclBhZ2VPcHRpb25zXCJcbiAgICAgICAgW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIlxuICAgICAgPlxuICAgICAgPC9jLXNtYXJ0LXRhYmxlLWl0ZW1zLXBlci1wYWdlLXNlbGVjdG9yPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGJvZHlEZWZhdWx0VGVtcGxhdGU+XG4gIDx0Ym9keSBbY0h0bWxBdHRyXT1cInRhYmxlQm9keVByb3BzPy5hdHRyaWJ1dGVzID8/IHt9XCJcbiAgICAgICAgIFtjVGFibGVDb2xvcl09XCJ0YWJsZUJvZHlQcm9wcz8uY29sb3JcIlxuICAgICAgICAgW2NBbGlnbl09XCJ0YWJsZUJvZHlQcm9wcz8uYWxpZ25cIlxuICA+XG4gIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtaXRlbSBbbmdGb3JPZl09XCJjdXJyZW50SXRlbXNcIiBsZXQtY250PVwiY291bnRcIiBsZXQtaT1cImluZGV4XCIgbGV0LWlzRXZlbj1cImV2ZW5cIiBsZXQtaXNPZGQ9XCJvZGRcIj5cbiAgICA8dHIgW3RhYmluZGV4XT1cImNsaWNrYWJsZVJvd3MgPyAwIDogLTFcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7Y3Vyc29yOiBjbGlja2FibGVSb3dzID8gJ3BvaW50ZXInIDogJ2F1dG8nfVwiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVSb3dDbGljayh7JGV2ZW50LCBpdGVtLCBpfSlcIlxuICAgICAgICBbY1RhYmxlQWN0aXZlXT1cIml0ZW0uX3Byb3BzPy5hY3RpdmUgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgW2NUYWJsZUNvbG9yXT1cIml0ZW0uX3Byb3BzPy5jb2xvclwiXG4gICAgICAgIFtjQWxpZ25dPVwiaXRlbS5fcHJvcHM/LmFsaWduXCJcbiAgICA+XG4gICAgICA8dGQgKm5nSWY9XCJzZWxlY3RhYmxlXCJcbiAgICAgICAgICBbY1RhYmxlQWN0aXZlXT1cIml0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5hY3RpdmUgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgICBbY1RhYmxlQ29sb3JdPVwiaXRlbT8uWydfY2VsbFByb3BzJ10/Ll9hbGw/LmNvbG9yXCJcbiAgICAgICAgICBbY0FsaWduXT1cIml0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5hbGlnblwiXG4gICAgICA+XG4gICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cImhhbmRsZVJvd0NoZWNrZWQoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpdGVtLl9zZWxlY3RlZCA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICBjRm9ybUNoZWNrSW5wdXRcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIoaXRlbT8uX3NlbGVjdGFibGUgPT09IGZhbHNlKSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICA+XG4gICAgICA8L3RkPlxuICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1jb2x1bW5OYW1lIFtuZ0Zvck9mXT1cInJhd0NvbHVtbk5hbWVzXCIgbGV0LWk9XCJpbmRleFwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZXNbJ3RhYmxlRGF0YSddIHx8IGNvbHVtbkRlZmF1bHRUZW1wbGF0ZTsgY29udGV4dDoge2l0ZW0sIGNvbHVtbk5hbWUsIHRkQ29udGVudDogaXRlbVtjb2x1bW5OYW1lXSB9XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3RyPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ0ZW1wbGF0ZXNbJ3RhYmxlRGV0YWlscyddXCI+XG4gICAgICA8IS0tICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0RldGFpbHNEZWZhdWx0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj4tLT5cbiAgICAgIDx0cj5cbiAgICAgICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIHRhYmluZGV4PVwiLTFcIiBbbmdTdHlsZV09XCJ7Ym9yZGVyQm90dG9tV2lkdGg6IDB9XCI+PC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICA8dHIgY2xhc3M9XCJwLTBcIj5cbiAgICAgICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIFtuZ1N0eWxlXT1cIntib3JkZXI6IDB9XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1sndGFibGVEZXRhaWxzJ107IGNvbnRleHQ6IHtpdGVtLCBpbmRleDogaX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vSXRlbXNEZWZhdWx0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgPC90Ym9keT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29sdW1uRGVmYXVsdFRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiIGxldC1jb2x1bW5OYW1lPVwiY29sdW1uTmFtZVwiIGxldC10ZENvbnRlbnQ9XCJ0ZENvbnRlbnRcIj5cbiAgPHRkXG4gICAgW2NUYWJsZUFjdGl2ZV09XCJ0YWJsZURhdGFDZWxsUHJvcHMoaXRlbSwgY29sdW1uTmFtZSk/LlsnYWN0aXZlJ11cIlxuICAgIFtjVGFibGVDb2xvcl09XCJ0YWJsZURhdGFDZWxsUHJvcHMoaXRlbSwgY29sdW1uTmFtZSk/LmNvbG9yXCJcbiAgICBbY0FsaWduXT1cInRhYmxlRGF0YUNlbGxQcm9wcyhpdGVtLCBjb2x1bW5OYW1lKT8uYWxpZ25cIlxuICAgIFtuZ0NsYXNzXT1cInRhYmxlRGF0YUNlbGxDbGFzc2VzKGl0ZW0sIGNvbHVtbk5hbWUpXCJcbiAgICBbY0h0bWxBdHRyXT1cInRhYmxlRGF0YUNlbGxQcm9wcyhpdGVtLCBjb2x1bW5OYW1lKT8uWydfYXR0cmlidXRlcyddID8/IHVuZGVmaW5lZFwiXG4gID5cbiAgICB7e3RkQ29udGVudH19XG4gIDwvdGQ+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tPG5nLXRlbXBsYXRlICNyb3dEZXRhaWxzRGVmYXVsdFRlbXBsYXRlIGxldC1pdGVtIGxldC1pbmRleD4tLT5cbjwhLS0gIDx0cj48dGQgW2NvbFNwYW5dPVwiY29sc3BhblwiIGNsYXNzPVwicC0wXCIgdGFiaW5kZXg9XCItMVwiIFtuZ1N0eWxlXT1cIntib3JkZXJCb3R0b21XaWR0aDogMH1cIj48L3RkPjwvdHI+LS0+XG48IS0tICA8dHIgY2xhc3M9XCJwLTBcIj4tLT5cbjwhLS0gICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIFtuZ1N0eWxlXT1cIntib3JkZXI6IDB9XCI+LS0+XG48IS0tICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlcz8udGFibGVEZXRhaWxzXCI+PC9uZy1jb250YWluZXI+LS0+XG48IS0tICAgIDwvdGQ+LS0+XG48IS0tICA8L3RyPi0tPlxuPCEtLTwvbmctdGVtcGxhdGU+LS0+XG5cbjxuZy10ZW1wbGF0ZSAjbm9JdGVtc0RlZmF1bHRUZW1wbGF0ZT5cbiAgPHRyICpuZ0lmPVwiIWN1cnJlbnRJdGVtcy5sZW5ndGhcIj5cbiAgICA8dGQgW2NvbFNwYW5dPVwiY29sc3BhblwiIGNsYXNzPVwianVzdGlmeS1jb250ZW50LWNlbnRlclwiPnt7bm9JdGVtc0xhYmVsfX08L3RkPlxuICA8L3RyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLXRvZG86IGZpbHRlckljb25DdXN0b21UZW1wbGF0ZS0tPlxuPG5nLXRlbXBsYXRlICNmaWx0ZXJJY29uVGVtcGxhdGU+XG4gIDxzdmcgdmlld0JveD1cIjAgMCA1MTIgNTEyXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHBvaW50ZXItZXZlbnRzPVwibm9uZVwiIHJvbGU9XCJpbWdcIlxuICAgICAgIGNsYXNzPVwiaWNvbiBpY29uLWN1c3RvbS1zaXplXCIgd2lkdGg9XCIxOFwiPlxuICAgIDxwb2x5Z29uXG4gICAgICBmaWxsPVwidmFyKC0tY2ktcHJpbWFyeS1jb2xvciwgY3VycmVudENvbG9yKVwiXG4gICAgICBwb2ludHM9XCI0MCAxNiA0MCA1My44MjggMTA5LjAyNCAxMzYgMTUwLjgxNSAxMzYgNzYuODk2IDQ4IDQ1OS41MSA0OCAzMDQgMjQyLjM4OCAzMDQgNDAxLjM3MyAyNDEuMzczIDQ2NCAyNDAgNDY0IDI0MCAzNjggMjA4IDM2OCAyMDggNDk2IDI1NC42MjcgNDk2IDMzNiA0MTQuNjI3IDMzNiAyNTMuNjEyIDQ5NiA1My42MTIgNDk2IDE2IDQwIDE2XCJcbiAgICAgIGNsYXNzPVwiY2ktcHJpbWFyeVwiPlxuICAgIDwvcG9seWdvbj5cbiAgICA8cG9seWdvblxuICAgICAgZmlsbD1cInZhcigtLWNpLXByaW1hcnktY29sb3IsIGN1cnJlbnRDb2xvcilcIlxuICAgICAgcG9pbnRzPVwiMTY2LjQwMyAyNDguMjI1IDIyNi44NjQgMTg3Ljc2MyAyMDQuMjM3IDE2NS4xMzUgMTQzLjc3NSAyMjUuNTk3IDgzLjMxMyAxNjUuMTM1IDYwLjY4NyAxODcuNzYzIDEyMS4xNDggMjQ4LjIyNSA2MC42ODcgMzA4LjY4NyA4My4zMTMgMzMxLjMxNCAxNDMuNzc1IDI3MC44NTIgMjA0LjIzNyAzMzEuMzE0IDIyNi44NjQgMzA4LjY4NyAxNjYuNDAzIDI0OC4yMjVcIlxuICAgICAgY2xhc3M9XCJjaS1wcmltYXJ5XCI+XG4gICAgPC9wb2x5Z29uPlxuICA8L3N2Zz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=