@cqa-lib/cqa-ui 1.0.16 → 1.0.18

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.
Files changed (28) hide show
  1. package/esm2020/lib/column-visibility/column-visibility.component.mjs +3 -3
  2. package/esm2020/lib/dashboards/chart-card/chart-card.component.mjs +5 -3
  3. package/esm2020/lib/dashboards/dashboard-header/dashboard-header.component.mjs +22 -5
  4. package/esm2020/lib/dashboards/failed-test-cases-card/failed-test-cases-card.component.mjs +7 -3
  5. package/esm2020/lib/dashboards/heat-error-map-cell/heat-error-map-cell.component.mjs +5 -3
  6. package/esm2020/lib/dashboards/insight-card/insight-card.component.mjs +3 -3
  7. package/esm2020/lib/dashboards/test-distribution-card/test-distribution-card.component.mjs +3 -3
  8. package/esm2020/lib/dynamic-select/dynamic-select-field.component.mjs +82 -5
  9. package/esm2020/lib/filters/dynamic-filter/dynamic-filter.component.mjs +62 -13
  10. package/esm2020/lib/segment-control/segment-control.component.mjs +30 -11
  11. package/esm2020/lib/table/dynamic-table/dynamic-table.component.mjs +38 -9
  12. package/esm2020/lib/templates/table-template.component.mjs +7 -24
  13. package/esm2020/lib/ui-kit.module.mjs +7 -3
  14. package/fesm2015/cqa-lib-cqa-ui.mjs +259 -73
  15. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  16. package/fesm2020/cqa-lib-cqa-ui.mjs +254 -69
  17. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  18. package/lib/dashboards/chart-card/chart-card.component.d.ts +2 -1
  19. package/lib/dashboards/dashboard-header/dashboard-header.component.d.ts +6 -1
  20. package/lib/dashboards/failed-test-cases-card/failed-test-cases-card.component.d.ts +3 -1
  21. package/lib/dynamic-select/dynamic-select-field.component.d.ts +16 -4
  22. package/lib/filters/dynamic-filter/dynamic-filter.component.d.ts +14 -1
  23. package/lib/segment-control/segment-control.component.d.ts +8 -0
  24. package/lib/table/dynamic-table/dynamic-table.component.d.ts +18 -0
  25. package/lib/templates/table-template.component.d.ts +0 -2
  26. package/lib/ui-kit.module.d.ts +2 -0
  27. package/package.json +1 -1
  28. package/styles.css +1 -1
@@ -1,11 +1,13 @@
1
1
  import { Component, ContentChild, ContentChildren, Input, TemplateRef, EventEmitter, Output } from "@angular/core";
2
2
  import { DynamicCellTemplateDirective, DynamicHeaderTemplateDirective } from "./dynamic-cell.directive";
3
3
  import * as i0 from "@angular/core";
4
- import * as i1 from "../../full-table-loader/full-table-loader.component";
5
- import * as i2 from "../../table-data-loader/table-data-loader.component";
6
- import * as i3 from "@angular/common";
4
+ import * as i1 from "@angular/platform-browser";
5
+ import * as i2 from "../../full-table-loader/full-table-loader.component";
6
+ import * as i3 from "../../table-data-loader/table-data-loader.component";
7
+ import * as i4 from "@angular/common";
7
8
  export class DynamicTableComponent {
8
- constructor() {
9
+ constructor(sanitizer) {
10
+ this.sanitizer = sanitizer;
9
11
  this.data = [];
10
12
  this.columns = [];
11
13
  // Enable built-in select-all behavior for a 'checkbox' column
@@ -49,6 +51,33 @@ export class DynamicTableComponent {
49
51
  const tpl = this.cellTemplates?.find(t => t.name === colId);
50
52
  return tpl ? tpl.template : null;
51
53
  }
54
+ getRenderedValue(row, column) {
55
+ if (column?.render && typeof column.render === 'function') {
56
+ try {
57
+ return column.render(row, column);
58
+ }
59
+ catch (err) {
60
+ console.warn('DynamicTable render function threw an error for column', column?.fieldId, err);
61
+ return '';
62
+ }
63
+ }
64
+ return this.getCellValue(row, column?.fieldValue);
65
+ }
66
+ /**
67
+ * Checks if the rendered value is an HTML string that should be rendered with innerHTML
68
+ */
69
+ isHtmlString(value) {
70
+ if (typeof value !== 'string')
71
+ return false;
72
+ // Simple check: if it contains HTML tags
73
+ return /<[a-z][\s\S]*>/i.test(value);
74
+ }
75
+ /**
76
+ * Sanitizes HTML string for safe rendering
77
+ */
78
+ getSanitizedHtml(value) {
79
+ return this.sanitizer.bypassSecurityTrustHtml(value);
80
+ }
52
81
  getCellValue(row, path) {
53
82
  if (!row || !path)
54
83
  return "";
@@ -220,12 +249,12 @@ export class DynamicTableComponent {
220
249
  return sa.localeCompare(sb, undefined, { sensitivity: 'base', numeric: true });
221
250
  }
222
251
  }
223
- DynamicTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
224
- DynamicTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicTableComponent, selector: "app-dynamic-table", inputs: { data: "data", columns: "columns", emptyState: "emptyState", gridTemplateColumns: "gridTemplateColumns", screenWidth: "screenWidth", enableSelectAll: "enableSelectAll", enableLocalSort: "enableLocalSort", isTableLoading: "isTableLoading", isTableDataLoading: "isTableDataLoading" }, outputs: { sortChange: "sortChange" }, queries: [{ propertyName: "emptyTableTpl", first: true, predicate: ["emptyTableTpl"], descendants: true, read: TemplateRef }, { propertyName: "cellTemplates", predicate: DynamicCellTemplateDirective }, { propertyName: "headerTemplates", predicate: DynamicHeaderTemplateDirective }], ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-relative\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\" [class.is-loading]=\"true\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-left cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\" [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\">{{ getCellValue(row, col.fieldValue) }}</span>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", components: [{ type: i1.FullTableLoaderComponent, selector: "cqa-full-table-loader", inputs: ["label"] }, { type: i2.TableDataLoaderComponent, selector: "cqa-table-data-loader", inputs: ["label", "size"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
252
+ DynamicTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicTableComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
253
+ DynamicTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicTableComponent, selector: "app-dynamic-table", inputs: { data: "data", columns: "columns", emptyState: "emptyState", gridTemplateColumns: "gridTemplateColumns", screenWidth: "screenWidth", enableSelectAll: "enableSelectAll", enableLocalSort: "enableLocalSort", isTableLoading: "isTableLoading", isTableDataLoading: "isTableDataLoading" }, outputs: { sortChange: "sortChange" }, queries: [{ propertyName: "emptyTableTpl", first: true, predicate: ["emptyTableTpl"], descendants: true, read: TemplateRef }, { propertyName: "cellTemplates", predicate: DynamicCellTemplateDirective }, { propertyName: "headerTemplates", predicate: DynamicHeaderTemplateDirective }], ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-relative\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\" [class.is-loading]=\"true\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-left cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\" [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <ng-container *ngIf=\"getRenderedValue(row, col) as renderedValue\">\n <ng-container *ngIf=\"isHtmlString(renderedValue); else textCell\">\n <div class=\"cqa-text-xs cqa-leading-[17px]\" [innerHTML]=\"getSanitizedHtml(renderedValue)\"></div>\n </ng-container>\n <ng-template #textCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\">{{ renderedValue }}</span>\n </ng-template>\n </ng-container>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", components: [{ type: i2.FullTableLoaderComponent, selector: "cqa-full-table-loader", inputs: ["label"] }, { type: i3.TableDataLoaderComponent, selector: "cqa-table-data-loader", inputs: ["label", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
225
254
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicTableComponent, decorators: [{
226
255
  type: Component,
227
- args: [{ selector: "app-dynamic-table", template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-relative\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\" [class.is-loading]=\"true\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-left cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\" [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\">{{ getCellValue(row, col.fieldValue) }}</span>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", styles: [] }]
228
- }], propDecorators: { data: [{
256
+ args: [{ selector: "app-dynamic-table", template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-relative\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\" [class.is-loading]=\"true\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-left cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\" [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <ng-container *ngIf=\"getRenderedValue(row, col) as renderedValue\">\n <ng-container *ngIf=\"isHtmlString(renderedValue); else textCell\">\n <div class=\"cqa-text-xs cqa-leading-[17px]\" [innerHTML]=\"getSanitizedHtml(renderedValue)\"></div>\n </ng-container>\n <ng-template #textCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\">{{ renderedValue }}</span>\n </ng-template>\n </ng-container>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", styles: [] }]
257
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { data: [{
229
258
  type: Input
230
259
  }], columns: [{
231
260
  type: Input
@@ -255,4 +284,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
255
284
  type: ContentChild,
256
285
  args: ['emptyTableTpl', { read: TemplateRef }]
257
286
  }] } });
258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFhLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlILE9BQU8sRUFBRSw0QkFBNEIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQW9CeEcsTUFBTSxPQUFPLHFCQUFxQjtJQUxsQztRQU1XLFNBQUksR0FBVSxFQUFFLENBQUM7UUFDakIsWUFBTyxHQUF5QixFQUFFLENBQUM7UUFTNUMsOERBQThEO1FBQ3JELG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ3pDLHNGQUFzRjtRQUM3RSxvQkFBZSxHQUFZLElBQUksQ0FBQztRQU96QyxzRUFBc0U7UUFDNUQsZUFBVSxHQUFHLElBQUksWUFBWSxFQUE4RSxDQUFDO1FBZ0k5RyxtQkFBYyxHQUEwQixJQUFJLENBQUM7S0F5RnREO0lBak5DLElBQVksSUFBSTtRQUNkLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUNoRCxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUNELElBQVksSUFBSTtRQUNkLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUNoRCxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUNE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V0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIENvbnRlbnRDaGlsZHJlbiwgSW5wdXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIEV2ZW50RW1pdHRlciwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IER5bmFtaWNDZWxsVGVtcGxhdGVEaXJlY3RpdmUsIER5bmFtaWNIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gXCIuL2R5bmFtaWMtY2VsbC5kaXJlY3RpdmVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljVGFibGVDb2x1bW4ge1xuICBmaWVsZElkOiBzdHJpbmc7XG4gIGZpZWxkTmFtZT86IHN0cmluZztcbiAgZmllbGRWYWx1ZT86IHN0cmluZztcbiAgaXNEZWZhdWx0PzogYm9vbGVhbjtcbiAgc29ydGFibGU/OiBib29sZWFuO1xuICBpc1Nob3c/OiBib29sZWFuO1xuICAvLyBOZXcgY29uZmlndXJhdGlvbiBmaWVsZHMgdG8gdW5pZnkgbGF5b3V0IGxvZ2ljXG4gIHdlaWdodD86IG51bWJlcjsgLy8gcmVsYXRpdmUgd2VpZ2h0IGZvciBkeW5hbWljIHNoYXJlXG4gIGZpeGVkUHg/OiBudW1iZXI7IC8vIGZpeGVkIHdpZHRoIGluIHB4IChlLmcuIGNoZWNrYm94L2FjdGlvbnMpXG4gIHJlc3BvbnNpdmU/OiB7IHhzPzogYm9vbGVhbjsgc20/OiBib29sZWFuOyBtZD86IGJvb2xlYW4gfTsgLy8gaGlkZSBhdCBzcGVjaWZpYyBicmVha3BvaW50c1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYXBwLWR5bmFtaWMtdGFibGVcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9keW5hbWljLXRhYmxlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY1RhYmxlQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZGF0YTogYW55W10gPSBbXTtcbiAgQElucHV0KCkgY29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgd2hlbiBubyBjdXN0b20gZW1wdHkgdGVtcGxhdGUgaXMgcHJvdmlkZWQuXG4gICAqL1xuICBASW5wdXQoKSBlbXB0eVN0YXRlPzogeyB0aXRsZT86IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IGltYWdlVXJsPzogc3RyaW5nOyBhY3Rpb25zPzogYW55W10gfTtcbiAgLy8gT3B0aW9uYWwgb3ZlcnJpZGU7IGlmIG9taXR0ZWQgd2UgY29tcHV0ZSBmcm9tIGNvbHVtbnNcbiAgQElucHV0KCkgZ3JpZFRlbXBsYXRlQ29sdW1ucz86IHN0cmluZztcbiAgLy8gQnJlYWtwb2ludC1hd2FyZSBzaXppbmc7IHByb3ZpZGUgZnJvbSBwYXJlbnQgdG8gYXZvaWQgZXh0cmEgbGlzdGVuZXJzXG4gIEBJbnB1dCgpIHNjcmVlbldpZHRoPzogbnVtYmVyO1xuICAvLyBFbmFibGUgYnVpbHQtaW4gc2VsZWN0LWFsbCBiZWhhdmlvciBmb3IgYSAnY2hlY2tib3gnIGNvbHVtblxuICBASW5wdXQoKSBlbmFibGVTZWxlY3RBbGw6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBFbmFibGUgc2ltcGxlIGNsaWVudC1zaWRlIHNvcnRpbmcgd2hlbiBjbGlja2luZyBzb3J0YWJsZSBoZWFkZXJzIChubyBjdXN0b20gaGVhZGVyKVxuICBASW5wdXQoKSBlbmFibGVMb2NhbFNvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBCYWNrd2FyZC1jb21wYXQgbG9hZGluZyBmbGFnIChhcHBsaWVzIHRvIGJvdGggbG9hZGVycyBpZiBzcGVjaWZpYyBmbGFncyBub3QgcHJvdmlkZWQpXG4gIFxuICAvLyBOZXc6IGNvbnRyb2xzIHRoZSBmdWxsIHRhYmxlIG92ZXJsYXkgbG9hZGVyXG4gIEBJbnB1dCgpIGlzVGFibGVMb2FkaW5nPzogYm9vbGVhbjtcbiAgLy8gTmV3OiBjb250cm9scyB0aGUgaW5saW5lIGRhdGEgbG9hZGVyIGFib3ZlIHRoZSB0YWJsZVxuICBASW5wdXQoKSBpc1RhYmxlRGF0YUxvYWRpbmc/OiBib29sZWFuO1xuICAvLyBFbWl0IHNvcnQgY2hhbmdlcyBzbyBwYXJlbnQgY2FuIHBlcmZvcm0gc2VydmVyLXNpZGUgc29ydCBpZiBkZXNpcmVkXG4gIEBPdXRwdXQoKSBzb3J0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGZpZWxkSWQ6IHN0cmluZzsgZmllbGRWYWx1ZT86IHN0cmluZzsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwgfT4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKER5bmFtaWNDZWxsVGVtcGxhdGVEaXJlY3RpdmUpIGNlbGxUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8RHluYW1pY0NlbGxUZW1wbGF0ZURpcmVjdGl2ZT47XG4gIEBDb250ZW50Q2hpbGRyZW4oRHluYW1pY0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlKSBoZWFkZXJUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8RHluYW1pY0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlPjtcbiAgLy8gQWxsb3cgY29uc3VtZXJzIHRvIHByb2plY3QgYSBjdXN0b20gZW1wdHktc3RhdGUgdGVtcGxhdGUgdXNpbmcgYSB0ZW1wbGF0ZSByZWYgbmFtZVxuICAvLyBlLmcuIDxuZy10ZW1wbGF0ZSAjZW1wdHlUYWJsZVRwbD5DdXN0b20gZW1wdHkgVUk8L25nLXRlbXBsYXRlPlxuICBAQ29udGVudENoaWxkKCdlbXB0eVRhYmxlVHBsJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBlbXB0eVRhYmxlVHBsPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwcml2YXRlIGdldCBpc1hzKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHcgPSB0aGlzLnNjcmVlbldpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIHJldHVybiB3IDw9IDQ4MDtcbiAgfVxuICBwcml2YXRlIGdldCBpc1NtKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHcgPSB0aGlzLnNjcmVlbldpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIHJldHVybiB3IDw9IDc2ODtcbiAgfVxuICBwcml2YXRlIGdldCBpc01kKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHcgPSB0aGlzLnNjcmVlbldpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIHJldHVybiB3IDw9IDk5MjtcbiAgfVxuXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpOiBEeW5hbWljVGFibGVDb2x1bW5bXSB7XG4gICAgY29uc3QgcmVzcG9uc2l2ZUZpbHRlciA9IChjOiBEeW5hbWljVGFibGVDb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IHIgPSBjPy5yZXNwb25zaXZlIHx8IHt9O1xuICAgICAgaWYgKHIueHMgJiYgdGhpcy5pc1hzKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoci5zbSAmJiB0aGlzLmlzU20pIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChyLm1kICYmIHRoaXMuaXNNZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gKHRoaXMuY29sdW1ucyB8fCBbXSkuZmlsdGVyKGMgPT4gYy5pc1Nob3cgIT09IGZhbHNlKS5maWx0ZXIocmVzcG9uc2l2ZUZpbHRlcik7XG4gIH1cblxuICBnZXRIZWFkZXJUZW1wbGF0ZShjb2xJZDogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xuICAgIGNvbnN0IHRwbCA9IHRoaXMuaGVhZGVyVGVtcGxhdGVzPy5maW5kKHQgPT4gdC5uYW1lID09PSBjb2xJZCk7XG4gICAgcmV0dXJuIHRwbCA/IHRwbC50ZW1wbGF0ZSA6IG51bGw7XG4gIH1cblxuICBnZXRDZWxsVGVtcGxhdGUoY29sSWQ6IHN0cmluZyk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICBjb25zdCB0cGwgPSB0aGlzLmNlbGxUZW1wbGF0ZXM/LmZpbmQodCA9PiB0Lm5hbWUgPT09IGNvbElkKTtcbiAgICByZXR1cm4gdHBsID8gdHBsLnRlbXBsYXRlIDogbnVsbDtcbiAgfVxuXG4gIGdldENlbGxWYWx1ZShyb3c6IGFueSwgcGF0aD86IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFyb3cgfHwgIXBhdGgpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgbGV0IGN1cnJlbnQgPSByb3c7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudCA/PyBcIlwiO1xuICB9XG5cbiAgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8vIENvbXB1dGUgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIHN0cmluZyBmcm9tIGNvbHVtbiBjb25maWdcbiAgZ2V0IGNvbXB1dGVkR3JpZFRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZ3JpZFRlbXBsYXRlQ29sdW1ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZ3JpZFRlbXBsYXRlQ29sdW1ucztcbiAgICB9XG4gICAgY29uc3QgY29scyA9IHRoaXMudmlzaWJsZUNvbHVtbnM7XG4gICAgaWYgKCFjb2xzPy5sZW5ndGgpIHJldHVybiAnJztcbiAgICBjb25zdCBmaXhlZFB4ID0gY29scy5yZWR1Y2UoKHN1bSwgYykgPT4gc3VtICsgKGMuZml4ZWRQeCB8fCAwKSwgMCk7XG4gICAgY29uc3QgZHluYW1pY0NvbHMgPSBjb2xzLmZpbHRlcihjID0+ICFjLmZpeGVkUHgpO1xuICAgIGNvbnN0IHRvdGFsV2VpZ2h0ID0gZHluYW1pY0NvbHMucmVkdWNlKChzdW0sIGMpID0+IHN1bSArIChjLndlaWdodCB8fCAxKSwgMCkgfHwgMTtcbiAgICBjb25zdCBwYXJ0cyA9IGNvbHMubWFwKGMgPT4ge1xuICAgICAgaWYgKGMuZml4ZWRQeCAmJiBjLmZpeGVkUHggPiAwKSB7XG4gICAgICAgIHJldHVybiBgJHtjLmZpeGVkUHh9cHhgO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2hhcmUgPSAoYy53ZWlnaHQgfHwgMSkgLyB0b3RhbFdlaWdodDtcbiAgICAgIHJldHVybiBgY2FsYygoMTAwJSAtICR7Zml4ZWRQeH1weCkgKiAke3NoYXJlLnRvRml4ZWQoNCl9KWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8vIENvbXB1dGUgcGVyLWNvbHVtbiB3aWR0aHMgZm9yIHVzZSB3aXRoIDxjb2xncm91cD5cbiAgZ2V0IGNvbXB1dGVkQ29sdW1uV2lkdGhzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb2xzID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICBpZiAoIWNvbHM/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGZpeGVkUHggPSBjb2xzLnJlZHVjZSgoc3VtLCBjKSA9PiBzdW0gKyAoYy5maXhlZFB4IHx8IDApLCAwKTtcbiAgICBjb25zdCBkeW5hbWljQ29scyA9IGNvbHMuZmlsdGVyKGMgPT4gIWMuZml4ZWRQeCk7XG4gICAgY29uc3QgdG90YWxXZWlnaHQgPSBkeW5hbWljQ29scy5yZWR1Y2UoKHN1bSwgYykgPT4gc3VtICsgKGMud2VpZ2h0IHx8IDEpLCAwKSB8fCAxO1xuICAgIHJldHVybiBjb2xzLm1hcChjID0+IHtcbiAgICAgIGlmIChjLmZpeGVkUHggJiYgYy5maXhlZFB4ID4gMCkge1xuICAgICAgICByZXR1cm4gYCR7Yy5maXhlZFB4fXB4YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNoYXJlID0gKGMud2VpZ2h0IHx8IDEpIC8gdG90YWxXZWlnaHQ7XG4gICAgICByZXR1cm4gYGNhbGMoKDEwMCUgLSAke2ZpeGVkUHh9cHgpICogJHtzaGFyZS50b0ZpeGVkKDQpfSlgO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU2VsZWN0aW9uIGhlbHBlcnNcbiAgZ2V0IGFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmRhdGEgfHwgW107XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiByb3dzLmV2ZXJ5KHIgPT4gISFyPy5pc1NlbGVjdGVkKTtcbiAgfVxuXG4gIGdldCBzb21lU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBpZiAoIXJvd3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYW55U2VsZWN0ZWQgPSByb3dzLnNvbWUociA9PiAhIXI/LmlzU2VsZWN0ZWQpO1xuICAgIHJldHVybiBhbnlTZWxlY3RlZCAmJiAhdGhpcy5hbGxTZWxlY3RlZDtcbiAgfVxuXG4gIG9uU2VsZWN0QWxsQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMudG9nZ2xlU2VsZWN0QWxsKHRhcmdldC5jaGVja2VkKTtcbiAgfVxuXG4gIG9uUm93U2VsZWN0Q2hhbmdlKGV2ZW50OiBFdmVudCwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICByb3cuaXNTZWxlY3RlZCA9IHRhcmdldC5jaGVja2VkO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0QWxsKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5kYXRhIHx8IFtdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgcm93LmlzU2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IFNvcnRpbmcgc3VwcG9ydCA9PT09PVxuICBwcml2YXRlIF9zb3J0QWN0aXZlPzogc3RyaW5nO1xuICBwcml2YXRlIF9zb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwgPSBudWxsO1xuXG4gIGdldCBjb21wdXRlZERhdGEoKTogYW55W10ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBpZiAoIXRoaXMuZW5hYmxlTG9jYWxTb3J0IHx8ICF0aGlzLl9zb3J0QWN0aXZlIHx8ICF0aGlzLl9zb3J0RGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgICBjb25zdCBjb2wgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkSWQgPT09IHRoaXMuX3NvcnRBY3RpdmUpO1xuICAgIGlmICghY29sIHx8ICFjb2wuZmllbGRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9XG4gICAgY29uc3QgZGlyID0gdGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAxIDogLTE7XG4gICAgY29uc3QgZmllbGRQYXRoID0gY29sLmZpZWxkVmFsdWU7XG4gICAgY29uc3Qgb3V0ID0gWy4uLnNvdXJjZV07XG4gICAgb3V0LnNvcnQoKGEsIGIpID0+IGRpciAqIHRoaXMuY29tcGFyZVZhbHVlcyh0aGlzLmdldENlbGxWYWx1ZShhLCBmaWVsZFBhdGgpLCB0aGlzLmdldENlbGxWYWx1ZShiLCBmaWVsZFBhdGgpKSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8vIENvbXB1dGVkIGxvYWRpbmcgZmxhZ3MgdG8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGdldCBzaG93VGFibGVMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVMb2FkaW5nID8/IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHNob3dUYWJsZURhdGFMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVEYXRhTG9hZGluZyA/PyBmYWxzZTtcbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0YWJsZSBoYXMgbm8gZGF0YSBhbmQgaXMgbm90IGN1cnJlbnRseSBsb2FkaW5nIOKAlCB1c2VkIHRvIHNob3cgYW4gZW1wdHkgc3RhdGVcbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYW55TG9hZGluZyA9IHRoaXMuc2hvd1RhYmxlTG9hZGluZyB8fCB0aGlzLnNob3dUYWJsZURhdGFMb2FkaW5nO1xuICAgIHJldHVybiAhYW55TG9hZGluZyAmJiAoISh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmxlbmd0aCkgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCk7XG4gIH1cblxuICBpc1NvcnRlZEFzYyhjb2xJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRBY3RpdmUgPT09IGNvbElkICYmIHRoaXMuX3NvcnREaXJlY3Rpb24gPT09ICdhc2MnO1xuICB9XG5cbiAgaXNTb3J0ZWREZXNjKGNvbElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydEFjdGl2ZSA9PT0gY29sSWQgJiYgdGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2Rlc2MnO1xuICB9XG5cbiAgdG9nZ2xlU29ydChjb2w6IER5bmFtaWNUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIGlmICghY29sPy5zb3J0YWJsZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbElkID0gY29sLmZpZWxkSWQ7XG4gICAgaWYgKHRoaXMuX3NvcnRBY3RpdmUgIT09IGNvbElkKSB7XG4gICAgICB0aGlzLl9zb3J0QWN0aXZlID0gY29sSWQ7XG4gICAgICB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGN5Y2xlIGFzYyAtPiBkZXNjIC0+IG51bGwgLT4gYXNjXG4gICAgICBpZiAodGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2FzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSAnZGVzYyc7XG4gICAgICBlbHNlIGlmICh0aGlzLl9zb3J0RGlyZWN0aW9uID09PSAnZGVzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSBudWxsO1xuICAgICAgZWxzZSB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfVxuICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHsgZmllbGRJZDogdGhpcy5fc29ydEFjdGl2ZSwgZmllbGRWYWx1ZTogY29sLmZpZWxkVmFsdWUsIGRpcmVjdGlvbjogdGhpcy5fc29ydERpcmVjdGlvbiB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGFyZVZhbHVlcyhhOiBhbnksIGI6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpIHJldHVybiAwO1xuICAgIGlmIChhID09IG51bGwpIHJldHVybiAxOyAvLyBudWxscyBsYXN0IGluIGFzYyAoaGFuZGxlZCBieSBkaXIgbXVsdGlwbGllcilcbiAgICBpZiAoYiA9PSBudWxsKSByZXR1cm4gLTE7XG5cbiAgICBjb25zdCBudW1BID0gdHlwZW9mIGEgPT09ICdudW1iZXInID8gYSA6IE51bWJlcihhKTtcbiAgICBjb25zdCBudW1CID0gdHlwZW9mIGIgPT09ICdudW1iZXInID8gYiA6IE51bWJlcihiKTtcbiAgICBjb25zdCBhSXNOdW0gPSAhaXNOYU4obnVtQSkgJiYgYSAhPT0gJycgJiYgYSAhPT0gbnVsbCAmJiBhICE9PSBmYWxzZTtcbiAgICBjb25zdCBiSXNOdW0gPSAhaXNOYU4obnVtQikgJiYgYiAhPT0gJycgJiYgYiAhPT0gbnVsbCAmJiBiICE9PSBmYWxzZTtcbiAgICBpZiAoYUlzTnVtICYmIGJJc051bSkge1xuICAgICAgaWYgKG51bUEgPCBudW1CKSByZXR1cm4gLTE7XG4gICAgICBpZiAobnVtQSA+IG51bUIpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gRGF0ZSBkZXRlY3Rpb246IGF0dGVtcHQgcGFyc2Ugd2hlbiBib3RoIHZhbHVlcyBhcmUgc3RyaW5ncyBhbmQgcGFyc2VhYmxlXG4gICAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRzQSA9IERhdGUucGFyc2UoYSk7XG4gICAgICBjb25zdCB0c0IgPSBEYXRlLnBhcnNlKGIpO1xuICAgICAgaWYgKCFpc05hTih0c0EpICYmICFpc05hTih0c0IpKSB7XG4gICAgICAgIGlmICh0c0EgPCB0c0IpIHJldHVybiAtMTtcbiAgICAgICAgaWYgKHRzQSA+IHRzQikgcmV0dXJuIDE7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgLy8gbG9jYWxlQ29tcGFyZSwgY2FzZS1pbnNlbnNpdGl2ZVxuICAgICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiLCB1bmRlZmluZWQsIHsgc2Vuc2l0aXZpdHk6ICdiYXNlJywgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBzdHJpbmcgY29tcGFyaXNvblxuICAgIGNvbnN0IHNhID0gU3RyaW5nKGEpO1xuICAgIGNvbnN0IHNiID0gU3RyaW5nKGIpO1xuICAgIHJldHVybiBzYS5sb2NhbGVDb21wYXJlKHNiLCB1bmRlZmluZWQsIHsgc2Vuc2l0aXZpdHk6ICdiYXNlJywgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgfVxufVxuXG5cbiIsIjxkaXYgaWQ9XCJjcWEtdWktcm9vdFwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlXCI+XG4gICAgPGNxYS1mdWxsLXRhYmxlLWxvYWRlciAqbmdJZj1cInNob3dUYWJsZUxvYWRpbmdcIj48L2NxYS1mdWxsLXRhYmxlLWxvYWRlcj5cbiAgICA8Y3FhLXRhYmxlLWRhdGEtbG9hZGVyICpuZ0lmPVwic2hvd1RhYmxlRGF0YUxvYWRpbmdcIj48L2NxYS10YWJsZS1kYXRhLWxvYWRlcj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZS1pbm5lciBjcWEtdy1mdWxsIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLWdyYXktMjAwXCIgW2NsYXNzLmlzLWxvYWRpbmddPVwidHJ1ZVwiPlxuICAgICAgPGNvbGdyb3VwPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3aWR0aCBvZiBjb21wdXRlZENvbHVtbldpZHRoczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgPGNvbCBbc3R5bGUud2lkdGhdPVwid2lkdGhcIiAvPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvY29sZ3JvdXA+XG5cbiAgICAgIDx0aGVhZCAqbmdJZj1cImRhdGE/Lmxlbmd0aFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJ0YWJsZS1oZWFkZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiB2aXNpYmxlQ29sdW1uczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItY2VsbCBjcWEtcHktWzEzLjI1cHhdIGNxYS1weC1bMTAuNXB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1sZWZ0IGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYmctWyNlZmYwZjddXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sLmZpZWxkSWQgKyAnLWNlbGwnXCI+XG4gICAgICAgICAgICAgIDwhLS0gQnVpbHQtaW4gc2VsZWN0LWFsbCBmb3IgY2hlY2tib3ggY29sdW1uIHdoZW4gZW5hYmxlZCBhbmQgbm8gY3VzdG9tIGhlYWRlciB0ZW1wbGF0ZSAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmZpZWxkSWQgPT09ICdjaGVja2JveCcgJiYgZW5hYmxlU2VsZWN0QWxsICYmICFnZXRIZWFkZXJUZW1wbGF0ZShjb2wuZmllbGRJZCk7IGVsc2UgaGVhZGVyVHBsT3JEZWZhdWx0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiY2hlY2tib3hcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGFsbCByb3dzXCIgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZVNlbGVjdGVkXCIgKGNoYW5nZSk9XCJvblNlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCIgY2xhc3M9XCJoaWRkZW4tY2hlY2tib3hcIiAvPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXN0b20tY2hlY2tib3gtbGFiZWxcIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNoZWFkZXJUcGxPckRlZmF1bHQ+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEhlYWRlclRlbXBsYXRlKGNvbC5maWVsZElkKSBhcyBoZWFkZXJUcGw7IGVsc2UgZGVmYXVsdEhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclRwbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuc29ydGFibGU7IGVsc2UgcGxhaW5IZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJoZWFkZXItdGV4dCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTb3J0KGNvbClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidTb3J0IGJ5ICcgKyAoY29sLmZpZWxkTmFtZSB8fCBjb2wuZmllbGRJZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMi4zcHhdIGNxYS1sZWFkaW5nLVsxNy41cHhdIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtZm9udC1tZWRpdW1cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmZpZWxkTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU29ydGVkQXNjKGNvbC5maWVsZElkKVwiPuKWsjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU29ydGVkRGVzYyhjb2wuZmllbGRJZClcIj7ilrw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluSGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10ZXh0XCI+e3sgY29sLmZpZWxkTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuXG4gICAgICA8dGJvZHkgY2xhc3M9XCJ0YWJsZS1ib2R5IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwidGFibGUtcm93IGNxYS1iZy1zdXJmYWNlLWRlZmF1bHQgaG92ZXI6Y3FhLWJnLXN1cmZhY2UtaG92ZXJcIiAqbmdGb3I9XCJsZXQgcm93IG9mIGNvbXB1dGVkRGF0YTsgbGV0IHJvd0luZGV4ID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInJvdz8uaXNTZWxlY3RlZFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiB2aXNpYmxlQ29sdW1uczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjZWxsIGNxYS1weC1bMTAuNXB4XSBjcWEtcHktWzExcHhdXCIgW25nQ2xhc3NdPVwiY29sLmZpZWxkSWQgKyAnLWNlbGwnXCI+XG4gICAgICAgICAgICAgIDwhLS0gQnVpbHQtaW4gY2hlY2tib3ggY2VsbCB3aGVuIG5vIGN1c3RvbSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5maWVsZElkID09PSAnY2hlY2tib3gnICYmICFnZXRDZWxsVGVtcGxhdGUoY29sLmZpZWxkSWQpOyBlbHNlIHJlZ3VsYXJDZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ3Jvdy1jaGVja2JveC0nICsgcm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VsZWN0IHJvd1wiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvdz8uaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Sb3dTZWxlY3RDaGFuZ2UoJGV2ZW50LCByb3cpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmZvcl09XCIncm93LWNoZWNrYm94LScgKyByb3dJbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVndWxhckNlbGw+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENlbGxUZW1wbGF0ZShjb2wuZmllbGRJZCkgYXMgY2VsbFRwbDsgZWxzZSBkZWZhdWx0Q2VsbFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxUcGw7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHJvdywgcm93OiByb3csIHZhbHVlOiBnZXRDZWxsVmFsdWUocm93LCBjb2wuZmllbGRWYWx1ZSl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmZpZWxkVmFsdWUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFhLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTlILE9BQU8sRUFBRSw0QkFBNEIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7QUEwQnhHLE1BQU0sT0FBTyxxQkFBcUI7SUE4QmhDLFlBQW9CLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUE3QmxDLFNBQUksR0FBVSxFQUFFLENBQUM7UUFDakIsWUFBTyxHQUF5QixFQUFFLENBQUM7UUFTNUMsOERBQThEO1FBQ3JELG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ3pDLHNGQUFzRjtRQUM3RSxvQkFBZSxHQUFZLElBQUksQ0FBQztRQU96QyxzRUFBc0U7UUFDNUQsZUFBVSxHQUFHLElBQUksWUFBWSxFQUE4RSxDQUFDO1FBOEo5RyxtQkFBYyxHQUEwQixJQUFJLENBQUM7SUF0SlAsQ0FBQztJQUUvQyxJQUFZLElBQUk7UUFDZCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDaEQsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFDRCxJQUFZLElBQUk7UUFDZCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUM7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QUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakYsQ0FBQzs7a0hBNVFVLHFCQUFxQjtzR0FBckIscUJBQXFCLDJkQTRCTyxXQUFXLGdEQUpqQyw0QkFBNEIsa0RBQzVCLDhCQUE4Qiw2QkNyRGpELHNzS0E2Rk07MkZEakVPLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7bUdBS3BCLElBQUk7c0JBQVosS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBSUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBSUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFFd0MsYUFBYTtzQkFBM0QsZUFBZTt1QkFBQyw0QkFBNEI7Z0JBQ0ksZUFBZTtzQkFBL0QsZUFBZTt1QkFBQyw4QkFBOEI7Z0JBR08sYUFBYTtzQkFBbEUsWUFBWTt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIENvbnRlbnRDaGlsZHJlbiwgSW5wdXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIEV2ZW50RW1pdHRlciwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xuaW1wb3J0IHsgRHluYW1pY0NlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgRHluYW1pY0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSBcIi4vZHluYW1pYy1jZWxsLmRpcmVjdGl2ZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNUYWJsZUNvbHVtbiB7XG4gIGZpZWxkSWQ6IHN0cmluZztcbiAgZmllbGROYW1lPzogc3RyaW5nO1xuICBmaWVsZFZhbHVlPzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgY3VzdG9tIHJlbmRlcmVyIGludm9rZWQgd2hlbiBubyBwcm9qZWN0ZWQgY2VsbCB0ZW1wbGF0ZSBpcyBwcm92aWRlZC5cbiAgICogUmV0dXJucyB0aGUgc3RyaW5nL251bWJlci9IVE1MIHN0cmluZyB0byBkaXNwbGF5IGZvciB0aGUgZ2l2ZW4gcm93LlxuICAgKiBIVE1MIHN0cmluZ3Mgd2lsbCBiZSBzYW5pdGl6ZWQgYW5kIHJlbmRlcmVkIHNhZmVseS5cbiAgICovXG4gIHJlbmRlcj86IChyb3c6IGFueSwgY29sdW1uOiBEeW5hbWljVGFibGVDb2x1bW4pID0+IHN0cmluZyB8IG51bWJlciB8IFNhZmVIdG1sO1xuICBpc0RlZmF1bHQ/OiBib29sZWFuO1xuICBzb3J0YWJsZT86IGJvb2xlYW47XG4gIGlzU2hvdz86IGJvb2xlYW47XG4gIC8vIE5ldyBjb25maWd1cmF0aW9uIGZpZWxkcyB0byB1bmlmeSBsYXlvdXQgbG9naWNcbiAgd2VpZ2h0PzogbnVtYmVyOyAvLyByZWxhdGl2ZSB3ZWlnaHQgZm9yIGR5bmFtaWMgc2hhcmVcbiAgZml4ZWRQeD86IG51bWJlcjsgLy8gZml4ZWQgd2lkdGggaW4gcHggKGUuZy4gY2hlY2tib3gvYWN0aW9ucylcbiAgcmVzcG9uc2l2ZT86IHsgeHM/OiBib29sZWFuOyBzbT86IGJvb2xlYW47IG1kPzogYm9vbGVhbiB9OyAvLyBoaWRlIGF0IHNwZWNpZmljIGJyZWFrcG9pbnRzXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhcHAtZHluYW1pYy10YWJsZVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2R5bmFtaWMtdGFibGUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljVGFibGVDb21wb25lbnQge1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBjb2x1bW5zOiBEeW5hbWljVGFibGVDb2x1bW5bXSA9IFtdO1xuICAvKipcbiAgICogT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QgdXNlZCB3aGVuIG5vIGN1c3RvbSBlbXB0eSB0ZW1wbGF0ZSBpcyBwcm92aWRlZC5cbiAgICovXG4gIEBJbnB1dCgpIGVtcHR5U3RhdGU/OiB7IHRpdGxlPzogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZzsgaW1hZ2VVcmw/OiBzdHJpbmc7IGFjdGlvbnM/OiBhbnlbXSB9O1xuICAvLyBPcHRpb25hbCBvdmVycmlkZTsgaWYgb21pdHRlZCB3ZSBjb21wdXRlIGZyb20gY29sdW1uc1xuICBASW5wdXQoKSBncmlkVGVtcGxhdGVDb2x1bW5zPzogc3RyaW5nO1xuICAvLyBCcmVha3BvaW50LWF3YXJlIHNpemluZzsgcHJvdmlkZSBmcm9tIHBhcmVudCB0byBhdm9pZCBleHRyYSBsaXN0ZW5lcnNcbiAgQElucHV0KCkgc2NyZWVuV2lkdGg/OiBudW1iZXI7XG4gIC8vIEVuYWJsZSBidWlsdC1pbiBzZWxlY3QtYWxsIGJlaGF2aW9yIGZvciBhICdjaGVja2JveCcgY29sdW1uXG4gIEBJbnB1dCgpIGVuYWJsZVNlbGVjdEFsbDogYm9vbGVhbiA9IHRydWU7XG4gIC8vIEVuYWJsZSBzaW1wbGUgY2xpZW50LXNpZGUgc29ydGluZyB3aGVuIGNsaWNraW5nIHNvcnRhYmxlIGhlYWRlcnMgKG5vIGN1c3RvbSBoZWFkZXIpXG4gIEBJbnB1dCgpIGVuYWJsZUxvY2FsU29ydDogYm9vbGVhbiA9IHRydWU7XG4gIC8vIEJhY2t3YXJkLWNvbXBhdCBsb2FkaW5nIGZsYWcgKGFwcGxpZXMgdG8gYm90aCBsb2FkZXJzIGlmIHNwZWNpZmljIGZsYWdzIG5vdCBwcm92aWRlZClcbiAgXG4gIC8vIE5ldzogY29udHJvbHMgdGhlIGZ1bGwgdGFibGUgb3ZlcmxheSBsb2FkZXJcbiAgQElucHV0KCkgaXNUYWJsZUxvYWRpbmc/OiBib29sZWFuO1xuICAvLyBOZXc6IGNvbnRyb2xzIHRoZSBpbmxpbmUgZGF0YSBsb2FkZXIgYWJvdmUgdGhlIHRhYmxlXG4gIEBJbnB1dCgpIGlzVGFibGVEYXRhTG9hZGluZz86IGJvb2xlYW47XG4gIC8vIEVtaXQgc29ydCBjaGFuZ2VzIHNvIHBhcmVudCBjYW4gcGVyZm9ybSBzZXJ2ZXItc2lkZSBzb3J0IGlmIGRlc2lyZWRcbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmllbGRJZDogc3RyaW5nOyBmaWVsZFZhbHVlPzogc3RyaW5nOyBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgbnVsbCB9PigpO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oRHluYW1pY0NlbGxUZW1wbGF0ZURpcmVjdGl2ZSkgY2VsbFRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxEeW5hbWljQ2VsbFRlbXBsYXRlRGlyZWN0aXZlPjtcbiAgQENvbnRlbnRDaGlsZHJlbihEeW5hbWljSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpIGhlYWRlclRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxEeW5hbWljSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmU+O1xuICAvLyBBbGxvdyBjb25zdW1lcnMgdG8gcHJvamVjdCBhIGN1c3RvbSBlbXB0eS1zdGF0ZSB0ZW1wbGF0ZSB1c2luZyBhIHRlbXBsYXRlIHJlZiBuYW1lXG4gIC8vIGUuZy4gPG5nLXRlbXBsYXRlICNlbXB0eVRhYmxlVHBsPkN1c3RvbSBlbXB0eSBVSTwvbmctdGVtcGxhdGU+XG4gIEBDb250ZW50Q2hpbGQoJ2VtcHR5VGFibGVUcGwnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIGVtcHR5VGFibGVUcGw/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHt9XG5cbiAgcHJpdmF0ZSBnZXQgaXNYcygpOiBib29sZWFuIHtcbiAgICBjb25zdCB3ID0gdGhpcy5zY3JlZW5XaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICByZXR1cm4gdyA8PSA0ODA7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNTbSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB3ID0gdGhpcy5zY3JlZW5XaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICByZXR1cm4gdyA8PSA3Njg7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNNZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB3ID0gdGhpcy5zY3JlZW5XaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICByZXR1cm4gdyA8PSA5OTI7XG4gIH1cblxuICBnZXQgdmlzaWJsZUNvbHVtbnMoKTogRHluYW1pY1RhYmxlQ29sdW1uW10ge1xuICAgIGNvbnN0IHJlc3BvbnNpdmVGaWx0ZXIgPSAoYzogRHluYW1pY1RhYmxlQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCByID0gYz8ucmVzcG9uc2l2ZSB8fCB7fTtcbiAgICAgIGlmIChyLnhzICYmIHRoaXMuaXNYcykgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHIuc20gJiYgdGhpcy5pc1NtKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoci5tZCAmJiB0aGlzLmlzTWQpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgcmV0dXJuICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbHRlcihjID0+IGMuaXNTaG93ICE9PSBmYWxzZSkuZmlsdGVyKHJlc3BvbnNpdmVGaWx0ZXIpO1xuICB9XG5cbiAgZ2V0SGVhZGVyVGVtcGxhdGUoY29sSWQ6IHN0cmluZyk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICBjb25zdCB0cGwgPSB0aGlzLmhlYWRlclRlbXBsYXRlcz8uZmluZCh0ID0+IHQubmFtZSA9PT0gY29sSWQpO1xuICAgIHJldHVybiB0cGwgPyB0cGwudGVtcGxhdGUgOiBudWxsO1xuICB9XG5cbiAgZ2V0Q2VsbFRlbXBsYXRlKGNvbElkOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XG4gICAgY29uc3QgdHBsID0gdGhpcy5jZWxsVGVtcGxhdGVzPy5maW5kKHQgPT4gdC5uYW1lID09PSBjb2xJZCk7XG4gICAgcmV0dXJuIHRwbCA/IHRwbC50ZW1wbGF0ZSA6IG51bGw7XG4gIH1cblxuICBnZXRSZW5kZXJlZFZhbHVlKHJvdzogYW55LCBjb2x1bW46IER5bmFtaWNUYWJsZUNvbHVtbik6IGFueSB7XG4gICAgaWYgKGNvbHVtbj8ucmVuZGVyICYmIHR5cGVvZiBjb2x1bW4ucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY29sdW1uLnJlbmRlcihyb3csIGNvbHVtbik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdEeW5hbWljVGFibGUgcmVuZGVyIGZ1bmN0aW9uIHRocmV3IGFuIGVycm9yIGZvciBjb2x1bW4nLCBjb2x1bW4/LmZpZWxkSWQsIGVycik7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2VsbFZhbHVlKHJvdywgY29sdW1uPy5maWVsZFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHJlbmRlcmVkIHZhbHVlIGlzIGFuIEhUTUwgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGggaW5uZXJIVE1MXG4gICAqL1xuICBpc0h0bWxTdHJpbmcodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gU2ltcGxlIGNoZWNrOiBpZiBpdCBjb250YWlucyBIVE1MIHRhZ3NcbiAgICByZXR1cm4gLzxbYS16XVtcXHNcXFNdKj4vaS50ZXN0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZXMgSFRNTCBzdHJpbmcgZm9yIHNhZmUgcmVuZGVyaW5nXG4gICAqL1xuICBnZXRTYW5pdGl6ZWRIdG1sKHZhbHVlOiBzdHJpbmcpOiBTYWZlSHRtbCB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHZhbHVlKTtcbiAgfVxuXG4gIGdldENlbGxWYWx1ZShyb3c6IGFueSwgcGF0aD86IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFyb3cgfHwgIXBhdGgpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgbGV0IGN1cnJlbnQgPSByb3c7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudCA/PyBcIlwiO1xuICB9XG5cbiAgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8vIENvbXB1dGUgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIHN0cmluZyBmcm9tIGNvbHVtbiBjb25maWdcbiAgZ2V0IGNvbXB1dGVkR3JpZFRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZ3JpZFRlbXBsYXRlQ29sdW1ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZ3JpZFRlbXBsYXRlQ29sdW1ucztcbiAgICB9XG4gICAgY29uc3QgY29scyA9IHRoaXMudmlzaWJsZUNvbHVtbnM7XG4gICAgaWYgKCFjb2xzPy5sZW5ndGgpIHJldHVybiAnJztcbiAgICBjb25zdCBmaXhlZFB4ID0gY29scy5yZWR1Y2UoKHN1bSwgYykgPT4gc3VtICsgKGMuZml4ZWRQeCB8fCAwKSwgMCk7XG4gICAgY29uc3QgZHluYW1pY0NvbHMgPSBjb2xzLmZpbHRlcihjID0+ICFjLmZpeGVkUHgpO1xuICAgIGNvbnN0IHRvdGFsV2VpZ2h0ID0gZHluYW1pY0NvbHMucmVkdWNlKChzdW0sIGMpID0+IHN1bSArIChjLndlaWdodCB8fCAxKSwgMCkgfHwgMTtcbiAgICBjb25zdCBwYXJ0cyA9IGNvbHMubWFwKGMgPT4ge1xuICAgICAgaWYgKGMuZml4ZWRQeCAmJiBjLmZpeGVkUHggPiAwKSB7XG4gICAgICAgIHJldHVybiBgJHtjLmZpeGVkUHh9cHhgO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2hhcmUgPSAoYy53ZWlnaHQgfHwgMSkgLyB0b3RhbFdlaWdodDtcbiAgICAgIHJldHVybiBgY2FsYygoMTAwJSAtICR7Zml4ZWRQeH1weCkgKiAke3NoYXJlLnRvRml4ZWQoNCl9KWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8vIENvbXB1dGUgcGVyLWNvbHVtbiB3aWR0aHMgZm9yIHVzZSB3aXRoIDxjb2xncm91cD5cbiAgZ2V0IGNvbXB1dGVkQ29sdW1uV2lkdGhzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb2xzID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICBpZiAoIWNvbHM/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGZpeGVkUHggPSBjb2xzLnJlZHVjZSgoc3VtLCBjKSA9PiBzdW0gKyAoYy5maXhlZFB4IHx8IDApLCAwKTtcbiAgICBjb25zdCBkeW5hbWljQ29scyA9IGNvbHMuZmlsdGVyKGMgPT4gIWMuZml4ZWRQeCk7XG4gICAgY29uc3QgdG90YWxXZWlnaHQgPSBkeW5hbWljQ29scy5yZWR1Y2UoKHN1bSwgYykgPT4gc3VtICsgKGMud2VpZ2h0IHx8IDEpLCAwKSB8fCAxO1xuICAgIHJldHVybiBjb2xzLm1hcChjID0+IHtcbiAgICAgIGlmIChjLmZpeGVkUHggJiYgYy5maXhlZFB4ID4gMCkge1xuICAgICAgICByZXR1cm4gYCR7Yy5maXhlZFB4fXB4YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNoYXJlID0gKGMud2VpZ2h0IHx8IDEpIC8gdG90YWxXZWlnaHQ7XG4gICAgICByZXR1cm4gYGNhbGMoKDEwMCUgLSAke2ZpeGVkUHh9cHgpICogJHtzaGFyZS50b0ZpeGVkKDQpfSlgO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU2VsZWN0aW9uIGhlbHBlcnNcbiAgZ2V0IGFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmRhdGEgfHwgW107XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiByb3dzLmV2ZXJ5KHIgPT4gISFyPy5pc1NlbGVjdGVkKTtcbiAgfVxuXG4gIGdldCBzb21lU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBpZiAoIXJvd3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYW55U2VsZWN0ZWQgPSByb3dzLnNvbWUociA9PiAhIXI/LmlzU2VsZWN0ZWQpO1xuICAgIHJldHVybiBhbnlTZWxlY3RlZCAmJiAhdGhpcy5hbGxTZWxlY3RlZDtcbiAgfVxuXG4gIG9uU2VsZWN0QWxsQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMudG9nZ2xlU2VsZWN0QWxsKHRhcmdldC5jaGVja2VkKTtcbiAgfVxuXG4gIG9uUm93U2VsZWN0Q2hhbmdlKGV2ZW50OiBFdmVudCwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICByb3cuaXNTZWxlY3RlZCA9IHRhcmdldC5jaGVja2VkO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0QWxsKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5kYXRhIHx8IFtdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgcm93LmlzU2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IFNvcnRpbmcgc3VwcG9ydCA9PT09PVxuICBwcml2YXRlIF9zb3J0QWN0aXZlPzogc3RyaW5nO1xuICBwcml2YXRlIF9zb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwgPSBudWxsO1xuXG4gIGdldCBjb21wdXRlZERhdGEoKTogYW55W10ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBpZiAoIXRoaXMuZW5hYmxlTG9jYWxTb3J0IHx8ICF0aGlzLl9zb3J0QWN0aXZlIHx8ICF0aGlzLl9zb3J0RGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgICBjb25zdCBjb2wgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkSWQgPT09IHRoaXMuX3NvcnRBY3RpdmUpO1xuICAgIGlmICghY29sIHx8ICFjb2wuZmllbGRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9XG4gICAgY29uc3QgZGlyID0gdGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAxIDogLTE7XG4gICAgY29uc3QgZmllbGRQYXRoID0gY29sLmZpZWxkVmFsdWU7XG4gICAgY29uc3Qgb3V0ID0gWy4uLnNvdXJjZV07XG4gICAgb3V0LnNvcnQoKGEsIGIpID0+IGRpciAqIHRoaXMuY29tcGFyZVZhbHVlcyh0aGlzLmdldENlbGxWYWx1ZShhLCBmaWVsZFBhdGgpLCB0aGlzLmdldENlbGxWYWx1ZShiLCBmaWVsZFBhdGgpKSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8vIENvbXB1dGVkIGxvYWRpbmcgZmxhZ3MgdG8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGdldCBzaG93VGFibGVMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVMb2FkaW5nID8/IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHNob3dUYWJsZURhdGFMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVEYXRhTG9hZGluZyA/PyBmYWxzZTtcbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0YWJsZSBoYXMgbm8gZGF0YSBhbmQgaXMgbm90IGN1cnJlbnRseSBsb2FkaW5nIOKAlCB1c2VkIHRvIHNob3cgYW4gZW1wdHkgc3RhdGVcbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYW55TG9hZGluZyA9IHRoaXMuc2hvd1RhYmxlTG9hZGluZyB8fCB0aGlzLnNob3dUYWJsZURhdGFMb2FkaW5nO1xuICAgIHJldHVybiAhYW55TG9hZGluZyAmJiAoISh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmxlbmd0aCkgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCk7XG4gIH1cblxuICBpc1NvcnRlZEFzYyhjb2xJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRBY3RpdmUgPT09IGNvbElkICYmIHRoaXMuX3NvcnREaXJlY3Rpb24gPT09ICdhc2MnO1xuICB9XG5cbiAgaXNTb3J0ZWREZXNjKGNvbElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydEFjdGl2ZSA9PT0gY29sSWQgJiYgdGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2Rlc2MnO1xuICB9XG5cbiAgdG9nZ2xlU29ydChjb2w6IER5bmFtaWNUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIGlmICghY29sPy5zb3J0YWJsZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbElkID0gY29sLmZpZWxkSWQ7XG4gICAgaWYgKHRoaXMuX3NvcnRBY3RpdmUgIT09IGNvbElkKSB7XG4gICAgICB0aGlzLl9zb3J0QWN0aXZlID0gY29sSWQ7XG4gICAgICB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGN5Y2xlIGFzYyAtPiBkZXNjIC0+IG51bGwgLT4gYXNjXG4gICAgICBpZiAodGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2FzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSAnZGVzYyc7XG4gICAgICBlbHNlIGlmICh0aGlzLl9zb3J0RGlyZWN0aW9uID09PSAnZGVzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSBudWxsO1xuICAgICAgZWxzZSB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfVxuICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHsgZmllbGRJZDogdGhpcy5fc29ydEFjdGl2ZSwgZmllbGRWYWx1ZTogY29sLmZpZWxkVmFsdWUsIGRpcmVjdGlvbjogdGhpcy5fc29ydERpcmVjdGlvbiB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGFyZVZhbHVlcyhhOiBhbnksIGI6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpIHJldHVybiAwO1xuICAgIGlmIChhID09IG51bGwpIHJldHVybiAxOyAvLyBudWxscyBsYXN0IGluIGFzYyAoaGFuZGxlZCBieSBkaXIgbXVsdGlwbGllcilcbiAgICBpZiAoYiA9PSBudWxsKSByZXR1cm4gLTE7XG5cbiAgICBjb25zdCBudW1BID0gdHlwZW9mIGEgPT09ICdudW1iZXInID8gYSA6IE51bWJlcihhKTtcbiAgICBjb25zdCBudW1CID0gdHlwZW9mIGIgPT09ICdudW1iZXInID8gYiA6IE51bWJlcihiKTtcbiAgICBjb25zdCBhSXNOdW0gPSAhaXNOYU4obnVtQSkgJiYgYSAhPT0gJycgJiYgYSAhPT0gbnVsbCAmJiBhICE9PSBmYWxzZTtcbiAgICBjb25zdCBiSXNOdW0gPSAhaXNOYU4obnVtQikgJiYgYiAhPT0gJycgJiYgYiAhPT0gbnVsbCAmJiBiICE9PSBmYWxzZTtcbiAgICBpZiAoYUlzTnVtICYmIGJJc051bSkge1xuICAgICAgaWYgKG51bUEgPCBudW1CKSByZXR1cm4gLTE7XG4gICAgICBpZiAobnVtQSA+IG51bUIpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gRGF0ZSBkZXRlY3Rpb246IGF0dGVtcHQgcGFyc2Ugd2hlbiBib3RoIHZhbHVlcyBhcmUgc3RyaW5ncyBhbmQgcGFyc2VhYmxlXG4gICAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRzQSA9IERhdGUucGFyc2UoYSk7XG4gICAgICBjb25zdCB0c0IgPSBEYXRlLnBhcnNlKGIpO1xuICAgICAgaWYgKCFpc05hTih0c0EpICYmICFpc05hTih0c0IpKSB7XG4gICAgICAgIGlmICh0c0EgPCB0c0IpIHJldHVybiAtMTtcbiAgICAgICAgaWYgKHRzQSA+IHRzQikgcmV0dXJuIDE7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgLy8gbG9jYWxlQ29tcGFyZSwgY2FzZS1pbnNlbnNpdGl2ZVxuICAgICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiLCB1bmRlZmluZWQsIHsgc2Vuc2l0aXZpdHk6ICdiYXNlJywgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBzdHJpbmcgY29tcGFyaXNvblxuICAgIGNvbnN0IHNhID0gU3RyaW5nKGEpO1xuICAgIGNvbnN0IHNiID0gU3RyaW5nKGIpO1xuICAgIHJldHVybiBzYS5sb2NhbGVDb21wYXJlKHNiLCB1bmRlZmluZWQsIHsgc2Vuc2l0aXZpdHk6ICdiYXNlJywgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgfVxufVxuXG5cbiIsIjxkaXYgaWQ9XCJjcWEtdWktcm9vdFwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlXCI+XG4gICAgPGNxYS1mdWxsLXRhYmxlLWxvYWRlciAqbmdJZj1cInNob3dUYWJsZUxvYWRpbmdcIj48L2NxYS1mdWxsLXRhYmxlLWxvYWRlcj5cbiAgICA8Y3FhLXRhYmxlLWRhdGEtbG9hZGVyICpuZ0lmPVwic2hvd1RhYmxlRGF0YUxvYWRpbmdcIj48L2NxYS10YWJsZS1kYXRhLWxvYWRlcj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZS1pbm5lciBjcWEtdy1mdWxsIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLWdyYXktMjAwXCIgW2NsYXNzLmlzLWxvYWRpbmddPVwidHJ1ZVwiPlxuICAgICAgPGNvbGdyb3VwPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3aWR0aCBvZiBjb21wdXRlZENvbHVtbldpZHRoczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgPGNvbCBbc3R5bGUud2lkdGhdPVwid2lkdGhcIiAvPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvY29sZ3JvdXA+XG5cbiAgICAgIDx0aGVhZCAqbmdJZj1cImRhdGE/Lmxlbmd0aFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJ0YWJsZS1oZWFkZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiB2aXNpYmxlQ29sdW1uczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItY2VsbCBjcWEtcHktWzEzLjI1cHhdIGNxYS1weC1bMTAuNXB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1sZWZ0IGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYmctWyNlZmYwZjddXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sLmZpZWxkSWQgKyAnLWNlbGwnXCI+XG4gICAgICAgICAgICAgIDwhLS0gQnVpbHQtaW4gc2VsZWN0LWFsbCBmb3IgY2hlY2tib3ggY29sdW1uIHdoZW4gZW5hYmxlZCBhbmQgbm8gY3VzdG9tIGhlYWRlciB0ZW1wbGF0ZSAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmZpZWxkSWQgPT09ICdjaGVja2JveCcgJiYgZW5hYmxlU2VsZWN0QWxsICYmICFnZXRIZWFkZXJUZW1wbGF0ZShjb2wuZmllbGRJZCk7IGVsc2UgaGVhZGVyVHBsT3JEZWZhdWx0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiY2hlY2tib3hcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGFsbCByb3dzXCIgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZVNlbGVjdGVkXCIgKGNoYW5nZSk9XCJvblNlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCIgY2xhc3M9XCJoaWRkZW4tY2hlY2tib3hcIiAvPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXN0b20tY2hlY2tib3gtbGFiZWxcIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNoZWFkZXJUcGxPckRlZmF1bHQ+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEhlYWRlclRlbXBsYXRlKGNvbC5maWVsZElkKSBhcyBoZWFkZXJUcGw7IGVsc2UgZGVmYXVsdEhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclRwbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuc29ydGFibGU7IGVsc2UgcGxhaW5IZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJoZWFkZXItdGV4dCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTb3J0KGNvbClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidTb3J0IGJ5ICcgKyAoY29sLmZpZWxkTmFtZSB8fCBjb2wuZmllbGRJZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMi4zcHhdIGNxYS1sZWFkaW5nLVsxNy41cHhdIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtZm9udC1tZWRpdW1cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmZpZWxkTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU29ydGVkQXNjKGNvbC5maWVsZElkKVwiPuKWsjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU29ydGVkRGVzYyhjb2wuZmllbGRJZClcIj7ilrw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluSGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10ZXh0XCI+e3sgY29sLmZpZWxkTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuXG4gICAgICA8dGJvZHkgY2xhc3M9XCJ0YWJsZS1ib2R5IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwidGFibGUtcm93IGNxYS1iZy1zdXJmYWNlLWRlZmF1bHQgaG92ZXI6Y3FhLWJnLXN1cmZhY2UtaG92ZXJcIiAqbmdGb3I9XCJsZXQgcm93IG9mIGNvbXB1dGVkRGF0YTsgbGV0IHJvd0luZGV4ID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInJvdz8uaXNTZWxlY3RlZFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiB2aXNpYmxlQ29sdW1uczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjZWxsIGNxYS1weC1bMTAuNXB4XSBjcWEtcHktWzExcHhdXCIgW25nQ2xhc3NdPVwiY29sLmZpZWxkSWQgKyAnLWNlbGwnXCI+XG4gICAgICAgICAgICAgIDwhLS0gQnVpbHQtaW4gY2hlY2tib3ggY2VsbCB3aGVuIG5vIGN1c3RvbSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5maWVsZElkID09PSAnY2hlY2tib3gnICYmICFnZXRDZWxsVGVtcGxhdGUoY29sLmZpZWxkSWQpOyBlbHNlIHJlZ3VsYXJDZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ3Jvdy1jaGVja2JveC0nICsgcm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VsZWN0IHJvd1wiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvdz8uaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Sb3dTZWxlY3RDaGFuZ2UoJGV2ZW50LCByb3cpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmZvcl09XCIncm93LWNoZWNrYm94LScgKyByb3dJbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVndWxhckNlbGw+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENlbGxUZW1wbGF0ZShjb2wuZmllbGRJZCkgYXMgY2VsbFRwbDsgZWxzZSBkZWZhdWx0Q2VsbFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxUcGw7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHJvdywgcm93OiByb3csIHZhbHVlOiBnZXRDZWxsVmFsdWUocm93LCBjb2wuZmllbGRWYWx1ZSl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbD5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRSZW5kZXJlZFZhbHVlKHJvdywgY29sKSBhcyByZW5kZXJlZFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0h0bWxTdHJpbmcocmVuZGVyZWRWYWx1ZSk7IGVsc2UgdGV4dENlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLWxlYWRpbmctWzE3cHhdXCIgW2lubmVySFRNTF09XCJnZXRTYW5pdGl6ZWRIdG1sKHJlbmRlcmVkVmFsdWUpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RleHRDZWxsPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgcmVuZGVyZWRWYWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==