@rivet-health/design-system 40.40.0 → 40.41.0

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.
@@ -36,6 +36,7 @@ export class TableColumnSettingsSideSheetComponent {
36
36
  this.draggedColumnIdx = null;
37
37
  this.draggedColumnKey = null;
38
38
  this.draggedOverColumnIdx = null;
39
+ this.unavailableFolderCollapsed = false;
39
40
  }
40
41
  ngOnInit() {
41
42
  this.columnList = combineLatest([
@@ -47,10 +48,17 @@ export class TableColumnSettingsSideSheetComponent {
47
48
  threshold: 0,
48
49
  includeMatches: true,
49
50
  });
50
- return { fuse, allColumns };
51
+ const unavailableColumns = TableColumnHelpers.createUnavailableColumns(s.display.unavailableColumnKeys);
52
+ const unavailableFolderTitle = s.display.unavailableFolderTitle;
53
+ return {
54
+ fuse,
55
+ allColumns,
56
+ unavailableColumns,
57
+ unavailableFolderTitle,
58
+ };
51
59
  })),
52
60
  this.filterQuery,
53
- ]).pipe(map(([{ fuse, allColumns }, filterQuery]) => {
61
+ ]).pipe(map(([{ fuse, allColumns, unavailableColumns, unavailableFolderTitle }, filterQuery,]) => {
54
62
  if (filterQuery) {
55
63
  const matches = fuse.search(filterQuery).map(match => {
56
64
  const firstmatch = match.matches?.find(result => result.key === 'resolvedName');
@@ -66,6 +74,8 @@ export class TableColumnSettingsSideSheetComponent {
66
74
  return {
67
75
  enabledColumns,
68
76
  disabledColumns,
77
+ unavailableColumns: unavailableColumns,
78
+ unavailableFolderTitle: unavailableFolderTitle,
69
79
  };
70
80
  }
71
81
  const allVisibleColumns = allColumns.map(column => ({
@@ -77,6 +87,8 @@ export class TableColumnSettingsSideSheetComponent {
77
87
  return {
78
88
  enabledColumns: enabledColumns,
79
89
  disabledColumns: disabledColumns,
90
+ unavailableColumns: unavailableColumns,
91
+ unavailableFolderTitle: unavailableFolderTitle,
80
92
  };
81
93
  }));
82
94
  document.addEventListener('dragover', this.handleDragOver);
@@ -188,16 +200,28 @@ export class TableColumnSettingsSideSheetComponent {
188
200
  disabledColumnsWithOffset(index) {
189
201
  return index;
190
202
  }
203
+ hasDisabledColumnsSection(columns) {
204
+ return columns.disabledColumns.length > 0;
205
+ }
206
+ hasEnabledColumnsSection(columns) {
207
+ return columns.enabledColumns.length > 0;
208
+ }
209
+ hasNoColumnsShownSection(columns, searching) {
210
+ return columns.enabledColumns.length === 0 && searching === false;
211
+ }
212
+ hasUnavailableColumnsSection(columns, searching) {
213
+ return columns.unavailableColumns.length > 0 && searching === false;
214
+ }
191
215
  }
192
216
  TableColumnSettingsSideSheetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableColumnSettingsSideSheetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
193
- TableColumnSettingsSideSheetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableColumnSettingsSideSheetComponent, selector: "riv-table-column-settings-side-sheet", inputs: { manager: "manager" }, viewQueries: [{ propertyName: "anchor", first: true, predicate: ["trigger"], descendants: true, read: ElementRef }], ngImport: i0, template: "<button type=\"button\" #trigger rivButton (click)=\"open.next(true)\">\n Columns\n</button>\n\n<ng-container *ngIf=\"columnList | async; let columns\">\n <ng-container *ngIf=\"open | async\">\n <riv-side-sheet\n [label]=\"'Columns'\"\n (close)=\"open.next(false); filterQuery.next('')\"\n >\n <div class=\"content\">\n <div class=\"title\">\n <span>Columns</span>\n <button\n type=\"button\"\n rivButton\n [variant]=\"'ghost'\"\n [icon]=\"'X'\"\n (click)=\"open.next(false); filterQuery.next('')\"\n ></button>\n </div>\n <riv-search\n [name]=\"'column-search'\"\n [value]=\"(filterQuery | async) || ''\"\n (valueChange)=\"filterQuery.next($event)\"\n ></riv-search>\n <riv-banner\n *ngIf=\"\n columns.disabledColumns.length > 0 &&\n disableEnablingColumns(columns)\n \"\n [iconTooltip]=\"iconLimitTooltip()\"\n >\n Column limit reached\n </riv-banner>\n <div class=\"columns\">\n <div *ngIf=\"columns.enabledColumns.length > 0\">\n <div\n class=\"column-header drop-zone\"\n (drop)=\"dropEnabledState(true, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <span class=\"column-header-label\">Shown in table</span>\n <button\n type=\"button\"\n *ngIf=\"(searching | async) === false\"\n rivButton\n [variant]=\"'ghost'\"\n [disabled]=\"allColumnsEnabled(columns)\"\n (click)=\"enableAllColumns(false)\"\n >\n Hide all\n </button>\n </div>\n\n <div class=\"options\">\n <ng-container\n *ngFor=\"let column of columns.enabledColumns; let i = index\"\n >\n <div\n class=\"option\"\n [attr.draggable]=\"\n (searching | async) === false && !column.alwaysPinned\n \"\n [attr.droppable]=\"\n (searching | async) === false && !column.alwaysPinned\n \"\n [class.drop-zone]=\"!column.alwaysPinned\"\n (dragstart)=\"dragStart(column.stateIndex, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"\n drop(\n i,\n column.stateIndex,\n true,\n columns.enabledColumns.length\n )\n \"\n [class.dragged-over-top]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i &&\n !column.alwaysPinned\n \"\n [class.dragged-over-bottom]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i &&\n !column.alwaysPinned\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnTemplate;\n context: { column, columns }\n \"\n ></ng-container>\n </div>\n <div\n *ngIf=\"\n column.isLastPinnedColumn && (searching | async) === false\n \"\n class=\"column scroll-padding\"\n >\n <div class=\"frozen\">\n <span class=\"pinned\">\n <riv-icon [name]=\"'PinInactive'\" [size]=\"20\"></riv-icon>\n </span>\n <span>Frozen through here</span>\n </div>\n\n <button\n type=\"button\"\n class=\"hidden\"\n rivButton\n [rivTooltip]=\"\n !column.alwaysPinned\n ? 'Un-freeze columns'\n : 'The above columns cannot be unfrozen'\n \"\n class=\"disable-override\"\n [class.disabled]=\"!column.enabled || column.alwaysPinned\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"'X'\"\n (click)=\"\n columnFreezeUpTo(\n false,\n column.stateIndex,\n 'freezeDivider'\n )\n \"\n ></button>\n </div>\n </ng-container>\n </div>\n </div>\n <div\n *ngIf=\"\n columns.enabledColumns.length === 0 &&\n (searching | async) === false\n \"\n class=\"column-header drop-zone\"\n (drop)=\"dropEnabledState(true, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <span>No columns shown</span>\n <button\n type=\"button\"\n rivButton\n [variant]=\"'ghost'\"\n (click)=\"resetToDefault()\"\n >\n Reset to default\n </button>\n </div>\n <div\n class=\"divider\"\n *ngIf=\"\n columns.disabledColumns.length > 0 &&\n ((searching | async) === false ||\n ((searching | async) && columns.enabledColumns.length > 0))\n \"\n ></div>\n <div\n *ngIf=\"columns.disabledColumns.length > 0\"\n (drop)=\"dropEnabledState(false, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <div class=\"column-header\">\n <span class=\"column-header-label\">Hidden from table</span>\n\n <button\n type=\"button\"\n *ngIf=\"\n (searching | async) === false &&\n showAllColumnsVisible(columns)\n \"\n rivButton\n [variant]=\"'ghost'\"\n [disabled]=\"allColumnsDisabled(columns)\"\n (click)=\"enableAllColumns(true)\"\n >\n Show all\n </button>\n </div>\n\n <div class=\"options\">\n <div\n *ngFor=\"let column of columns.disabledColumns; let i = index\"\n [attr.draggable]=\"\n (searching | async) === false &&\n !disableEnablingColumns(columns) &&\n !column.alwaysPinned\n \"\n [attr.droppable]=\"\n (searching | async) === false &&\n !disableEnablingColumns(columns) &&\n !column.alwaysPinned\n \"\n [class.drop-zone]=\"\n !disableEnablingColumns(columns) && !column.alwaysPinned\n \"\n (dragstart)=\"dragStart(column.stateIndex, column.key)\"\n (dragenter)=\"\n $event.preventDefault();\n dragOver(i + columns.enabledColumns.length)\n \"\n (drop)=\"\n drop(\n i + columns.enabledColumns.length,\n column.stateIndex,\n false,\n columns.enabledColumns.length\n )\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnTemplate;\n context: { column, columns }\n \"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </riv-side-sheet>\n </ng-container>\n</ng-container>\n\n<ng-template #columnTemplate let-column=\"column\" let-columns=\"columns\">\n <div\n class=\"column scroll-padding\"\n [class.disabled]=\"disableEnablingColumn(column, columns)\"\n >\n <div class=\"column\">\n <ng-container\n *ngTemplateOutlet=\"reorderIcon; context: { column, columns }\"\n ></ng-container>\n\n <riv-highlight\n [text]=\"column.resolvedName\"\n [indices]=\"column.highlightIndices\"\n ></riv-highlight>\n </div>\n <div>\n <riv-menu\n class=\"hidden\"\n *ngIf=\"\n (column.enabled || !disableEnablingColumns(columns)) &&\n !column.alwaysPinned\n \"\n >\n <button\n type=\"button\"\n *ngIf=\"column.enabled && !column.pinned\"\n riv-menu-item\n (click)=\"\n columnFreezeUpTo(true, column.stateIndex, 'optionsMenu', column.key)\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.enabled && column.pinned\"\n riv-menu-item\n (click)=\"columnFreezeUpTo(false, 0, 'optionsMenu', column.key)\"\n >\n Un-freeze columns\n </button>\n <button\n type=\"button\"\n riv-menu-item\n (click)=\"columnMoveTo(column, 'start')\"\n >\n Move to start\n </button>\n <button\n type=\"button\"\n riv-menu-item\n (click)=\"columnMoveTo(column, 'end')\"\n >\n Move to end\n </button>\n <button\n *ngIf=\"!column.alwaysVisible\"\n type=\"button\"\n riv-menu-item\n (click)=\"columnEnabledChange(column, !column.enabled, 'optionsMenu')\"\n >\n {{ column.enabled ? 'Hide column' : 'Show column' }}\n </button>\n </riv-menu>\n\n <ng-container\n *ngTemplateOutlet=\"enableIcon; context: { column, columns }\"\n ></ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #reorderIcon let-column=\"column\" let-columns=\"columns\">\n <ng-container *ngIf=\"(searching | async) === false\">\n <span\n *ngIf=\"!column.alwaysPinned\"\n class=\"reorder\"\n [class.disabled]=\"disableEnablingColumn(column, columns)\"\n [rivTooltip]=\"column.tooltipForReorderIcon\"\n >\n <riv-icon [name]=\"'Reorder'\" [size]=\"20\"></riv-icon>\n </span>\n\n <span\n *ngIf=\"column.alwaysPinned\"\n class=\"reorder-locked\"\n [class.disabled]=\"true\"\n [rivTooltip]=\"column.tooltipForReorderIcon\"\n >\n <riv-icon [name]=\"'Lock'\" [size]=\"20\"></riv-icon>\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #enableIcon let-column=\"column\" let-columns=\"columns\">\n <button\n *ngIf=\"!column.alwaysVisible && !column.alwaysPinned\"\n type=\"button\"\n rivButton\n [rivTooltip]=\"\n column.enabled\n ? 'Hide column'\n : disableEnablingColumns(columns)\n ? limitTooltip()\n : 'Show column'\n \"\n class=\"disable-override\"\n [class.disabled]=\"!column.enabled\"\n [disabled]=\"disableEnablingColumn(column, columns)\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"column.enabled ? 'Eye' : 'EyeOff'\"\n (click)=\"columnEnabledChange(column, !column.enabled, 'eyeIcon')\"\n ></button>\n\n <button\n *ngIf=\"column.alwaysVisible || column.alwaysPinned\"\n type=\"button\"\n rivButton\n [rivTooltip]=\"column.tooltipForHideIcon\"\n [disabled]=\"true\"\n [class.disabled]=\"true\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"'Lock'\"\n ></button>\n</ng-template>\n", styles: [".content{padding:var(--size-large);display:flex;flex-direction:column;gap:var(--size-medium);height:100%}.title{font:var(--title-02);display:flex;justify-content:space-between;align-items:center}.column-header{color:var(--type-light-low-contrast);display:flex;justify-content:space-between;align-items:center;font:var(--input-medium)}.column-header-label{padding:var(--size-small) 0}.column{display:flex;align-items:center;justify-content:space-between;position:relative;font:var(--input-medium)}.column:hover{background-color:var(--surface-light-1)}.column:hover .hidden{opacity:1}.column.disabled{color:var(--type-light-low-contrast)}.reorder{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch;color:var(--type-light-low-contrast);cursor:grab}.reorder.disabled{cursor:not-allowed}.reorder-locked{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch;color:var(--type-light-low-contrast);cursor:not-allowed}.pinned{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch}.frozen{display:flex;align-items:center;justify-content:space-between;position:relative;font:var(--input-medium);color:var(--type-light-low-contrast)}.disable-override.disabled:hover{cursor:pointer}.hidden{opacity:0}.columns{flex-grow:1;overflow-y:auto}.options{display:flex;flex-direction:column}.option{position:relative}.option.dragged-over-top:before,.option.dragged-over-bottom:before{content:\"\";position:absolute;left:0;right:0;height:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}.option.dragged-over-top:before{top:0}.option.dragged-over-bottom:before{bottom:0}.scroll-padding{padding-right:var(--base-grid-size)}.divider{border-top:var(--border-width) solid var(--border-light);margin-top:var(--size-medium);margin-bottom:var(--size-medium)}\n"], dependencies: [{ 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: "component", type: i2.BannerComponent, selector: "riv-banner", inputs: ["variant", "icon", "iconTooltip", "heading", "dismissable"], outputs: ["dismiss"] }, { kind: "component", type: i3.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i4.HighlightComponent, selector: "riv-highlight", inputs: ["text", "indices"] }, { kind: "component", type: i5.IconComponent, selector: "riv-icon", inputs: ["name", "fillColor", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i6.MenuComponent, selector: "riv-menu", inputs: ["preferredPosition", "disabled"] }, { kind: "component", type: i7.MenuItemComponent, selector: "[riv-menu-item]", inputs: ["locked", "disabled", "variant"] }, { kind: "component", type: i8.SearchComponent, selector: "riv-search", inputs: ["placeholder", "name", "labelTemplate"] }, { kind: "component", type: i9.SideSheetComponent, selector: "riv-side-sheet", inputs: ["topOffset", "width", "obscure", "label"], outputs: ["close"] }, { kind: "directive", type: i10.TooltipDirective, selector: "[rivTooltip]", inputs: ["rivTooltip", "rivTooltipTheme", "rivTooltipMaxWidth", "rivTooltipPreferredPosition", "rivTooltipAnchor", "rivTooltipCloseDelay", "rivTooltipOpenDelay", "rivTooltipGracePeriod"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
217
+ TableColumnSettingsSideSheetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableColumnSettingsSideSheetComponent, selector: "riv-table-column-settings-side-sheet", inputs: { manager: "manager" }, viewQueries: [{ propertyName: "anchor", first: true, predicate: ["trigger"], descendants: true, read: ElementRef }], ngImport: i0, template: "<button type=\"button\" #trigger rivButton (click)=\"open.next(true)\">\n Columns\n</button>\n\n<ng-container *ngIf=\"columnList | async; let columns\">\n <ng-container *ngIf=\"open | async\">\n <riv-side-sheet\n [label]=\"'Columns'\"\n (close)=\"open.next(false); filterQuery.next('')\"\n >\n <div class=\"content\">\n <div class=\"title\">\n <span>Columns</span>\n <button\n type=\"button\"\n rivButton\n [variant]=\"'ghost'\"\n [icon]=\"'X'\"\n (click)=\"open.next(false); filterQuery.next('')\"\n ></button>\n </div>\n <riv-search\n [name]=\"'column-search'\"\n [value]=\"(filterQuery | async) || ''\"\n (valueChange)=\"filterQuery.next($event)\"\n ></riv-search>\n <riv-banner\n *ngIf=\"\n columns.disabledColumns.length > 0 &&\n disableEnablingColumns(columns)\n \"\n [iconTooltip]=\"iconLimitTooltip()\"\n >\n Column limit reached\n </riv-banner>\n <div class=\"columns\">\n <div *ngIf=\"hasEnabledColumnsSection(columns)\">\n <div\n class=\"column-header drop-zone\"\n (drop)=\"dropEnabledState(true, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <span class=\"column-header-label\">Shown in table</span>\n <button\n type=\"button\"\n *ngIf=\"(searching | async) === false\"\n rivButton\n [variant]=\"'ghost'\"\n [disabled]=\"allColumnsEnabled(columns)\"\n (click)=\"enableAllColumns(false)\"\n >\n Hide all\n </button>\n </div>\n\n <div class=\"options\">\n <ng-container\n *ngFor=\"let column of columns.enabledColumns; let i = index\"\n >\n <div\n class=\"option\"\n [attr.draggable]=\"\n (searching | async) === false && !column.alwaysPinned\n \"\n [attr.droppable]=\"\n (searching | async) === false && !column.alwaysPinned\n \"\n [class.drop-zone]=\"!column.alwaysPinned\"\n (dragstart)=\"dragStart(column.stateIndex, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"\n drop(\n i,\n column.stateIndex,\n true,\n columns.enabledColumns.length\n )\n \"\n [class.dragged-over-top]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i &&\n !column.alwaysPinned\n \"\n [class.dragged-over-bottom]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i &&\n !column.alwaysPinned\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnTemplate;\n context: { column, columns }\n \"\n ></ng-container>\n </div>\n <div\n *ngIf=\"\n column.isLastPinnedColumn && (searching | async) === false\n \"\n class=\"column scroll-padding\"\n >\n <div class=\"frozen\">\n <span class=\"pinned\">\n <riv-icon [name]=\"'PinInactive'\" [size]=\"20\"></riv-icon>\n </span>\n <span>Frozen through here</span>\n </div>\n\n <button\n type=\"button\"\n class=\"hidden\"\n rivButton\n [rivTooltip]=\"\n !column.alwaysPinned\n ? 'Un-freeze columns'\n : 'The above columns cannot be unfrozen'\n \"\n class=\"disable-override\"\n [class.disabled]=\"!column.enabled || column.alwaysPinned\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"'X'\"\n (click)=\"\n columnFreezeUpTo(\n false,\n column.stateIndex,\n 'freezeDivider'\n )\n \"\n ></button>\n </div>\n </ng-container>\n </div>\n </div>\n <div\n *ngIf=\"\n hasNoColumnsShownSection(columns, (searching | async) ?? false)\n \"\n class=\"column-header drop-zone\"\n (drop)=\"dropEnabledState(true, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <span>No columns shown</span>\n <button\n type=\"button\"\n rivButton\n [variant]=\"'ghost'\"\n (click)=\"resetToDefault()\"\n >\n Reset to default\n </button>\n </div>\n <div\n class=\"divider\"\n *ngIf=\"\n hasDisabledColumnsSection(columns) &&\n (hasEnabledColumnsSection(columns) ||\n hasNoColumnsShownSection(columns, (searching | async) ?? false))\n \"\n ></div>\n <div\n *ngIf=\"hasDisabledColumnsSection(columns)\"\n (drop)=\"dropEnabledState(false, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <div class=\"column-header\">\n <span class=\"column-header-label\">Hidden from table</span>\n\n <button\n type=\"button\"\n *ngIf=\"\n (searching | async) === false &&\n showAllColumnsVisible(columns)\n \"\n rivButton\n [variant]=\"'ghost'\"\n [disabled]=\"allColumnsDisabled(columns)\"\n (click)=\"enableAllColumns(true)\"\n >\n Show all\n </button>\n </div>\n\n <div class=\"options\">\n <div\n *ngFor=\"let column of columns.disabledColumns; let i = index\"\n [attr.draggable]=\"\n (searching | async) === false &&\n !disableEnablingColumns(columns) &&\n !column.alwaysPinned\n \"\n [attr.droppable]=\"\n (searching | async) === false &&\n !disableEnablingColumns(columns) &&\n !column.alwaysPinned\n \"\n [class.drop-zone]=\"\n !disableEnablingColumns(columns) && !column.alwaysPinned\n \"\n (dragstart)=\"dragStart(column.stateIndex, column.key)\"\n (dragenter)=\"\n $event.preventDefault();\n dragOver(i + columns.enabledColumns.length)\n \"\n (drop)=\"\n drop(\n i + columns.enabledColumns.length,\n column.stateIndex,\n false,\n columns.enabledColumns.length\n )\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnTemplate;\n context: { column, columns }\n \"\n ></ng-container>\n </div>\n </div>\n </div>\n <div\n class=\"divider\"\n *ngIf=\"\n hasUnavailableColumnsSection(\n columns,\n (searching | async) ?? false\n ) &&\n (hasDisabledColumnsSection(columns) ||\n hasEnabledColumnsSection(columns) ||\n hasNoColumnsShownSection(columns, (searching | async) ?? false))\n \"\n ></div>\n <div\n *ngIf=\"\n hasUnavailableColumnsSection(\n columns,\n (searching | async) ?? false\n )\n \"\n >\n <div class=\"column-header\">\n <span class=\"column-header-label\">\n {{ columns.unavailableFolderTitle }}\n </span>\n\n <button\n type=\"button\"\n rivButton\n class=\"chevron\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"\n unavailableFolderCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n (click)=\"\n unavailableFolderCollapsed = !unavailableFolderCollapsed\n \"\n ></button>\n </div>\n\n <div *ngIf=\"!unavailableFolderCollapsed\" class=\"options\">\n <div\n *ngFor=\"let column of columns.unavailableColumns; let i = index\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnTemplate;\n context: { column, columns }\n \"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </riv-side-sheet>\n </ng-container>\n</ng-container>\n\n<ng-template #columnTemplate let-column=\"column\" let-columns=\"columns\">\n <div\n class=\"column scroll-padding\"\n [class.disabled]=\"disableEnablingColumn(column, columns)\"\n >\n <div class=\"column\" [class.unavailable]=\"column.isUnavailable\">\n <ng-container\n *ngTemplateOutlet=\"reorderIcon; context: { column, columns }\"\n ></ng-container>\n\n <riv-highlight\n [text]=\"column.resolvedName\"\n [indices]=\"column.highlightIndices\"\n ></riv-highlight>\n </div>\n <div>\n <riv-menu\n class=\"hidden\"\n *ngIf=\"\n (column.enabled || !disableEnablingColumns(columns)) &&\n !column.alwaysPinned &&\n !column.isUnavailable\n \"\n >\n <button\n type=\"button\"\n *ngIf=\"column.enabled && !column.pinned\"\n riv-menu-item\n (click)=\"\n columnFreezeUpTo(true, column.stateIndex, 'optionsMenu', column.key)\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.enabled && column.pinned\"\n riv-menu-item\n (click)=\"columnFreezeUpTo(false, 0, 'optionsMenu', column.key)\"\n >\n Un-freeze columns\n </button>\n <button\n type=\"button\"\n riv-menu-item\n (click)=\"columnMoveTo(column, 'start')\"\n >\n Move to start\n </button>\n <button\n type=\"button\"\n riv-menu-item\n (click)=\"columnMoveTo(column, 'end')\"\n >\n Move to end\n </button>\n <button\n *ngIf=\"!column.alwaysVisible\"\n type=\"button\"\n riv-menu-item\n (click)=\"columnEnabledChange(column, !column.enabled, 'optionsMenu')\"\n >\n {{ column.enabled ? 'Hide column' : 'Show column' }}\n </button>\n </riv-menu>\n\n <ng-container\n *ngTemplateOutlet=\"enableIcon; context: { column, columns }\"\n ></ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #reorderIcon let-column=\"column\" let-columns=\"columns\">\n <ng-container *ngIf=\"(searching | async) === false\">\n <span\n *ngIf=\"!column.alwaysPinned && !column.isUnavailable\"\n class=\"reorder\"\n [class.disabled]=\"disableEnablingColumn(column, columns)\"\n [rivTooltip]=\"column.tooltipForReorderIcon\"\n >\n <riv-icon [name]=\"'Reorder'\" [size]=\"20\"></riv-icon>\n </span>\n\n <span\n *ngIf=\"column.alwaysPinned || column.isUnavailable\"\n class=\"reorder-locked\"\n [class.disabled]=\"true\"\n [rivTooltip]=\"column.tooltipForReorderIcon\"\n >\n <riv-icon [name]=\"'Lock'\" [size]=\"20\"></riv-icon>\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #enableIcon let-column=\"column\" let-columns=\"columns\">\n <button\n *ngIf=\"\n !column.alwaysVisible && !column.alwaysPinned && !column.isUnavailable\n \"\n type=\"button\"\n rivButton\n [rivTooltip]=\"\n column.enabled\n ? 'Hide column'\n : disableEnablingColumns(columns)\n ? limitTooltip()\n : 'Show column'\n \"\n class=\"disable-override\"\n [class.disabled]=\"!column.enabled\"\n [disabled]=\"disableEnablingColumn(column, columns)\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"column.enabled ? 'Eye' : 'EyeOff'\"\n (click)=\"columnEnabledChange(column, !column.enabled, 'eyeIcon')\"\n ></button>\n\n <button\n *ngIf=\"column.alwaysVisible || column.alwaysPinned || column.isUnavailable\"\n type=\"button\"\n rivButton\n [rivTooltip]=\"column.tooltipForHideIcon\"\n [disabled]=\"true\"\n [class.disabled]=\"true\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"'Lock'\"\n ></button>\n</ng-template>\n", styles: [".content{padding:var(--size-large);display:flex;flex-direction:column;gap:var(--size-medium);height:100%}.title{font:var(--title-02);display:flex;justify-content:space-between;align-items:center}.column-header{color:var(--type-light-low-contrast);display:flex;justify-content:space-between;align-items:center;font:var(--input-medium)}.column-header-label{padding:var(--size-small) 0}.column{display:flex;align-items:center;justify-content:space-between;position:relative;font:var(--input-medium)}.column:hover{background-color:var(--surface-light-1)}.column:hover .hidden{opacity:1}.column.disabled,.column.unavailable{color:var(--type-light-low-contrast)}.reorder{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch;color:var(--type-light-low-contrast);cursor:grab}.reorder.disabled{cursor:not-allowed}.reorder-locked{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch;color:var(--type-light-low-contrast);cursor:not-allowed}.pinned{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch}.frozen{display:flex;align-items:center;justify-content:space-between;position:relative;font:var(--input-medium);color:var(--type-light-low-contrast)}.disable-override.disabled:hover{cursor:pointer}.hidden{opacity:0}.columns{flex-grow:1;overflow-y:auto}.options{display:flex;flex-direction:column}.option{position:relative}.option.dragged-over-top:before,.option.dragged-over-bottom:before{content:\"\";position:absolute;left:0;right:0;height:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}.option.dragged-over-top:before{top:0}.option.dragged-over-bottom:before{bottom:0}.scroll-padding{padding-right:var(--base-grid-size)}.divider{border-top:var(--border-width) solid var(--border-light);margin-top:var(--size-medium);margin-bottom:var(--size-medium)}.chevron{cursor:pointer}\n"], dependencies: [{ 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: "component", type: i2.BannerComponent, selector: "riv-banner", inputs: ["variant", "icon", "iconTooltip", "heading", "dismissable"], outputs: ["dismiss"] }, { kind: "component", type: i3.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i4.HighlightComponent, selector: "riv-highlight", inputs: ["text", "indices"] }, { kind: "component", type: i5.IconComponent, selector: "riv-icon", inputs: ["name", "fillColor", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i6.MenuComponent, selector: "riv-menu", inputs: ["preferredPosition", "disabled"] }, { kind: "component", type: i7.MenuItemComponent, selector: "[riv-menu-item]", inputs: ["locked", "disabled", "variant"] }, { kind: "component", type: i8.SearchComponent, selector: "riv-search", inputs: ["placeholder", "name", "labelTemplate"] }, { kind: "component", type: i9.SideSheetComponent, selector: "riv-side-sheet", inputs: ["topOffset", "width", "obscure", "label"], outputs: ["close"] }, { kind: "directive", type: i10.TooltipDirective, selector: "[rivTooltip]", inputs: ["rivTooltip", "rivTooltipTheme", "rivTooltipMaxWidth", "rivTooltipPreferredPosition", "rivTooltipAnchor", "rivTooltipCloseDelay", "rivTooltipOpenDelay", "rivTooltipGracePeriod"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
194
218
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableColumnSettingsSideSheetComponent, decorators: [{
195
219
  type: Component,
196
- args: [{ selector: 'riv-table-column-settings-side-sheet', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button type=\"button\" #trigger rivButton (click)=\"open.next(true)\">\n Columns\n</button>\n\n<ng-container *ngIf=\"columnList | async; let columns\">\n <ng-container *ngIf=\"open | async\">\n <riv-side-sheet\n [label]=\"'Columns'\"\n (close)=\"open.next(false); filterQuery.next('')\"\n >\n <div class=\"content\">\n <div class=\"title\">\n <span>Columns</span>\n <button\n type=\"button\"\n rivButton\n [variant]=\"'ghost'\"\n [icon]=\"'X'\"\n (click)=\"open.next(false); filterQuery.next('')\"\n ></button>\n </div>\n <riv-search\n [name]=\"'column-search'\"\n [value]=\"(filterQuery | async) || ''\"\n (valueChange)=\"filterQuery.next($event)\"\n ></riv-search>\n <riv-banner\n *ngIf=\"\n columns.disabledColumns.length > 0 &&\n disableEnablingColumns(columns)\n \"\n [iconTooltip]=\"iconLimitTooltip()\"\n >\n Column limit reached\n </riv-banner>\n <div class=\"columns\">\n <div *ngIf=\"columns.enabledColumns.length > 0\">\n <div\n class=\"column-header drop-zone\"\n (drop)=\"dropEnabledState(true, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <span class=\"column-header-label\">Shown in table</span>\n <button\n type=\"button\"\n *ngIf=\"(searching | async) === false\"\n rivButton\n [variant]=\"'ghost'\"\n [disabled]=\"allColumnsEnabled(columns)\"\n (click)=\"enableAllColumns(false)\"\n >\n Hide all\n </button>\n </div>\n\n <div class=\"options\">\n <ng-container\n *ngFor=\"let column of columns.enabledColumns; let i = index\"\n >\n <div\n class=\"option\"\n [attr.draggable]=\"\n (searching | async) === false && !column.alwaysPinned\n \"\n [attr.droppable]=\"\n (searching | async) === false && !column.alwaysPinned\n \"\n [class.drop-zone]=\"!column.alwaysPinned\"\n (dragstart)=\"dragStart(column.stateIndex, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"\n drop(\n i,\n column.stateIndex,\n true,\n columns.enabledColumns.length\n )\n \"\n [class.dragged-over-top]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i &&\n !column.alwaysPinned\n \"\n [class.dragged-over-bottom]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i &&\n !column.alwaysPinned\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnTemplate;\n context: { column, columns }\n \"\n ></ng-container>\n </div>\n <div\n *ngIf=\"\n column.isLastPinnedColumn && (searching | async) === false\n \"\n class=\"column scroll-padding\"\n >\n <div class=\"frozen\">\n <span class=\"pinned\">\n <riv-icon [name]=\"'PinInactive'\" [size]=\"20\"></riv-icon>\n </span>\n <span>Frozen through here</span>\n </div>\n\n <button\n type=\"button\"\n class=\"hidden\"\n rivButton\n [rivTooltip]=\"\n !column.alwaysPinned\n ? 'Un-freeze columns'\n : 'The above columns cannot be unfrozen'\n \"\n class=\"disable-override\"\n [class.disabled]=\"!column.enabled || column.alwaysPinned\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"'X'\"\n (click)=\"\n columnFreezeUpTo(\n false,\n column.stateIndex,\n 'freezeDivider'\n )\n \"\n ></button>\n </div>\n </ng-container>\n </div>\n </div>\n <div\n *ngIf=\"\n columns.enabledColumns.length === 0 &&\n (searching | async) === false\n \"\n class=\"column-header drop-zone\"\n (drop)=\"dropEnabledState(true, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <span>No columns shown</span>\n <button\n type=\"button\"\n rivButton\n [variant]=\"'ghost'\"\n (click)=\"resetToDefault()\"\n >\n Reset to default\n </button>\n </div>\n <div\n class=\"divider\"\n *ngIf=\"\n columns.disabledColumns.length > 0 &&\n ((searching | async) === false ||\n ((searching | async) && columns.enabledColumns.length > 0))\n \"\n ></div>\n <div\n *ngIf=\"columns.disabledColumns.length > 0\"\n (drop)=\"dropEnabledState(false, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <div class=\"column-header\">\n <span class=\"column-header-label\">Hidden from table</span>\n\n <button\n type=\"button\"\n *ngIf=\"\n (searching | async) === false &&\n showAllColumnsVisible(columns)\n \"\n rivButton\n [variant]=\"'ghost'\"\n [disabled]=\"allColumnsDisabled(columns)\"\n (click)=\"enableAllColumns(true)\"\n >\n Show all\n </button>\n </div>\n\n <div class=\"options\">\n <div\n *ngFor=\"let column of columns.disabledColumns; let i = index\"\n [attr.draggable]=\"\n (searching | async) === false &&\n !disableEnablingColumns(columns) &&\n !column.alwaysPinned\n \"\n [attr.droppable]=\"\n (searching | async) === false &&\n !disableEnablingColumns(columns) &&\n !column.alwaysPinned\n \"\n [class.drop-zone]=\"\n !disableEnablingColumns(columns) && !column.alwaysPinned\n \"\n (dragstart)=\"dragStart(column.stateIndex, column.key)\"\n (dragenter)=\"\n $event.preventDefault();\n dragOver(i + columns.enabledColumns.length)\n \"\n (drop)=\"\n drop(\n i + columns.enabledColumns.length,\n column.stateIndex,\n false,\n columns.enabledColumns.length\n )\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnTemplate;\n context: { column, columns }\n \"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </riv-side-sheet>\n </ng-container>\n</ng-container>\n\n<ng-template #columnTemplate let-column=\"column\" let-columns=\"columns\">\n <div\n class=\"column scroll-padding\"\n [class.disabled]=\"disableEnablingColumn(column, columns)\"\n >\n <div class=\"column\">\n <ng-container\n *ngTemplateOutlet=\"reorderIcon; context: { column, columns }\"\n ></ng-container>\n\n <riv-highlight\n [text]=\"column.resolvedName\"\n [indices]=\"column.highlightIndices\"\n ></riv-highlight>\n </div>\n <div>\n <riv-menu\n class=\"hidden\"\n *ngIf=\"\n (column.enabled || !disableEnablingColumns(columns)) &&\n !column.alwaysPinned\n \"\n >\n <button\n type=\"button\"\n *ngIf=\"column.enabled && !column.pinned\"\n riv-menu-item\n (click)=\"\n columnFreezeUpTo(true, column.stateIndex, 'optionsMenu', column.key)\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.enabled && column.pinned\"\n riv-menu-item\n (click)=\"columnFreezeUpTo(false, 0, 'optionsMenu', column.key)\"\n >\n Un-freeze columns\n </button>\n <button\n type=\"button\"\n riv-menu-item\n (click)=\"columnMoveTo(column, 'start')\"\n >\n Move to start\n </button>\n <button\n type=\"button\"\n riv-menu-item\n (click)=\"columnMoveTo(column, 'end')\"\n >\n Move to end\n </button>\n <button\n *ngIf=\"!column.alwaysVisible\"\n type=\"button\"\n riv-menu-item\n (click)=\"columnEnabledChange(column, !column.enabled, 'optionsMenu')\"\n >\n {{ column.enabled ? 'Hide column' : 'Show column' }}\n </button>\n </riv-menu>\n\n <ng-container\n *ngTemplateOutlet=\"enableIcon; context: { column, columns }\"\n ></ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #reorderIcon let-column=\"column\" let-columns=\"columns\">\n <ng-container *ngIf=\"(searching | async) === false\">\n <span\n *ngIf=\"!column.alwaysPinned\"\n class=\"reorder\"\n [class.disabled]=\"disableEnablingColumn(column, columns)\"\n [rivTooltip]=\"column.tooltipForReorderIcon\"\n >\n <riv-icon [name]=\"'Reorder'\" [size]=\"20\"></riv-icon>\n </span>\n\n <span\n *ngIf=\"column.alwaysPinned\"\n class=\"reorder-locked\"\n [class.disabled]=\"true\"\n [rivTooltip]=\"column.tooltipForReorderIcon\"\n >\n <riv-icon [name]=\"'Lock'\" [size]=\"20\"></riv-icon>\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #enableIcon let-column=\"column\" let-columns=\"columns\">\n <button\n *ngIf=\"!column.alwaysVisible && !column.alwaysPinned\"\n type=\"button\"\n rivButton\n [rivTooltip]=\"\n column.enabled\n ? 'Hide column'\n : disableEnablingColumns(columns)\n ? limitTooltip()\n : 'Show column'\n \"\n class=\"disable-override\"\n [class.disabled]=\"!column.enabled\"\n [disabled]=\"disableEnablingColumn(column, columns)\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"column.enabled ? 'Eye' : 'EyeOff'\"\n (click)=\"columnEnabledChange(column, !column.enabled, 'eyeIcon')\"\n ></button>\n\n <button\n *ngIf=\"column.alwaysVisible || column.alwaysPinned\"\n type=\"button\"\n rivButton\n [rivTooltip]=\"column.tooltipForHideIcon\"\n [disabled]=\"true\"\n [class.disabled]=\"true\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"'Lock'\"\n ></button>\n</ng-template>\n", styles: [".content{padding:var(--size-large);display:flex;flex-direction:column;gap:var(--size-medium);height:100%}.title{font:var(--title-02);display:flex;justify-content:space-between;align-items:center}.column-header{color:var(--type-light-low-contrast);display:flex;justify-content:space-between;align-items:center;font:var(--input-medium)}.column-header-label{padding:var(--size-small) 0}.column{display:flex;align-items:center;justify-content:space-between;position:relative;font:var(--input-medium)}.column:hover{background-color:var(--surface-light-1)}.column:hover .hidden{opacity:1}.column.disabled{color:var(--type-light-low-contrast)}.reorder{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch;color:var(--type-light-low-contrast);cursor:grab}.reorder.disabled{cursor:not-allowed}.reorder-locked{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch;color:var(--type-light-low-contrast);cursor:not-allowed}.pinned{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch}.frozen{display:flex;align-items:center;justify-content:space-between;position:relative;font:var(--input-medium);color:var(--type-light-low-contrast)}.disable-override.disabled:hover{cursor:pointer}.hidden{opacity:0}.columns{flex-grow:1;overflow-y:auto}.options{display:flex;flex-direction:column}.option{position:relative}.option.dragged-over-top:before,.option.dragged-over-bottom:before{content:\"\";position:absolute;left:0;right:0;height:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}.option.dragged-over-top:before{top:0}.option.dragged-over-bottom:before{bottom:0}.scroll-padding{padding-right:var(--base-grid-size)}.divider{border-top:var(--border-width) solid var(--border-light);margin-top:var(--size-medium);margin-bottom:var(--size-medium)}\n"] }]
220
+ args: [{ selector: 'riv-table-column-settings-side-sheet', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button type=\"button\" #trigger rivButton (click)=\"open.next(true)\">\n Columns\n</button>\n\n<ng-container *ngIf=\"columnList | async; let columns\">\n <ng-container *ngIf=\"open | async\">\n <riv-side-sheet\n [label]=\"'Columns'\"\n (close)=\"open.next(false); filterQuery.next('')\"\n >\n <div class=\"content\">\n <div class=\"title\">\n <span>Columns</span>\n <button\n type=\"button\"\n rivButton\n [variant]=\"'ghost'\"\n [icon]=\"'X'\"\n (click)=\"open.next(false); filterQuery.next('')\"\n ></button>\n </div>\n <riv-search\n [name]=\"'column-search'\"\n [value]=\"(filterQuery | async) || ''\"\n (valueChange)=\"filterQuery.next($event)\"\n ></riv-search>\n <riv-banner\n *ngIf=\"\n columns.disabledColumns.length > 0 &&\n disableEnablingColumns(columns)\n \"\n [iconTooltip]=\"iconLimitTooltip()\"\n >\n Column limit reached\n </riv-banner>\n <div class=\"columns\">\n <div *ngIf=\"hasEnabledColumnsSection(columns)\">\n <div\n class=\"column-header drop-zone\"\n (drop)=\"dropEnabledState(true, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <span class=\"column-header-label\">Shown in table</span>\n <button\n type=\"button\"\n *ngIf=\"(searching | async) === false\"\n rivButton\n [variant]=\"'ghost'\"\n [disabled]=\"allColumnsEnabled(columns)\"\n (click)=\"enableAllColumns(false)\"\n >\n Hide all\n </button>\n </div>\n\n <div class=\"options\">\n <ng-container\n *ngFor=\"let column of columns.enabledColumns; let i = index\"\n >\n <div\n class=\"option\"\n [attr.draggable]=\"\n (searching | async) === false && !column.alwaysPinned\n \"\n [attr.droppable]=\"\n (searching | async) === false && !column.alwaysPinned\n \"\n [class.drop-zone]=\"!column.alwaysPinned\"\n (dragstart)=\"dragStart(column.stateIndex, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"\n drop(\n i,\n column.stateIndex,\n true,\n columns.enabledColumns.length\n )\n \"\n [class.dragged-over-top]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i &&\n !column.alwaysPinned\n \"\n [class.dragged-over-bottom]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i &&\n !column.alwaysPinned\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnTemplate;\n context: { column, columns }\n \"\n ></ng-container>\n </div>\n <div\n *ngIf=\"\n column.isLastPinnedColumn && (searching | async) === false\n \"\n class=\"column scroll-padding\"\n >\n <div class=\"frozen\">\n <span class=\"pinned\">\n <riv-icon [name]=\"'PinInactive'\" [size]=\"20\"></riv-icon>\n </span>\n <span>Frozen through here</span>\n </div>\n\n <button\n type=\"button\"\n class=\"hidden\"\n rivButton\n [rivTooltip]=\"\n !column.alwaysPinned\n ? 'Un-freeze columns'\n : 'The above columns cannot be unfrozen'\n \"\n class=\"disable-override\"\n [class.disabled]=\"!column.enabled || column.alwaysPinned\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"'X'\"\n (click)=\"\n columnFreezeUpTo(\n false,\n column.stateIndex,\n 'freezeDivider'\n )\n \"\n ></button>\n </div>\n </ng-container>\n </div>\n </div>\n <div\n *ngIf=\"\n hasNoColumnsShownSection(columns, (searching | async) ?? false)\n \"\n class=\"column-header drop-zone\"\n (drop)=\"dropEnabledState(true, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <span>No columns shown</span>\n <button\n type=\"button\"\n rivButton\n [variant]=\"'ghost'\"\n (click)=\"resetToDefault()\"\n >\n Reset to default\n </button>\n </div>\n <div\n class=\"divider\"\n *ngIf=\"\n hasDisabledColumnsSection(columns) &&\n (hasEnabledColumnsSection(columns) ||\n hasNoColumnsShownSection(columns, (searching | async) ?? false))\n \"\n ></div>\n <div\n *ngIf=\"hasDisabledColumnsSection(columns)\"\n (drop)=\"dropEnabledState(false, columns.enabledColumns.length)\"\n (dragenter)=\"$event.preventDefault(); dragOver(-1)\"\n >\n <div class=\"column-header\">\n <span class=\"column-header-label\">Hidden from table</span>\n\n <button\n type=\"button\"\n *ngIf=\"\n (searching | async) === false &&\n showAllColumnsVisible(columns)\n \"\n rivButton\n [variant]=\"'ghost'\"\n [disabled]=\"allColumnsDisabled(columns)\"\n (click)=\"enableAllColumns(true)\"\n >\n Show all\n </button>\n </div>\n\n <div class=\"options\">\n <div\n *ngFor=\"let column of columns.disabledColumns; let i = index\"\n [attr.draggable]=\"\n (searching | async) === false &&\n !disableEnablingColumns(columns) &&\n !column.alwaysPinned\n \"\n [attr.droppable]=\"\n (searching | async) === false &&\n !disableEnablingColumns(columns) &&\n !column.alwaysPinned\n \"\n [class.drop-zone]=\"\n !disableEnablingColumns(columns) && !column.alwaysPinned\n \"\n (dragstart)=\"dragStart(column.stateIndex, column.key)\"\n (dragenter)=\"\n $event.preventDefault();\n dragOver(i + columns.enabledColumns.length)\n \"\n (drop)=\"\n drop(\n i + columns.enabledColumns.length,\n column.stateIndex,\n false,\n columns.enabledColumns.length\n )\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnTemplate;\n context: { column, columns }\n \"\n ></ng-container>\n </div>\n </div>\n </div>\n <div\n class=\"divider\"\n *ngIf=\"\n hasUnavailableColumnsSection(\n columns,\n (searching | async) ?? false\n ) &&\n (hasDisabledColumnsSection(columns) ||\n hasEnabledColumnsSection(columns) ||\n hasNoColumnsShownSection(columns, (searching | async) ?? false))\n \"\n ></div>\n <div\n *ngIf=\"\n hasUnavailableColumnsSection(\n columns,\n (searching | async) ?? false\n )\n \"\n >\n <div class=\"column-header\">\n <span class=\"column-header-label\">\n {{ columns.unavailableFolderTitle }}\n </span>\n\n <button\n type=\"button\"\n rivButton\n class=\"chevron\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"\n unavailableFolderCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n (click)=\"\n unavailableFolderCollapsed = !unavailableFolderCollapsed\n \"\n ></button>\n </div>\n\n <div *ngIf=\"!unavailableFolderCollapsed\" class=\"options\">\n <div\n *ngFor=\"let column of columns.unavailableColumns; let i = index\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnTemplate;\n context: { column, columns }\n \"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </riv-side-sheet>\n </ng-container>\n</ng-container>\n\n<ng-template #columnTemplate let-column=\"column\" let-columns=\"columns\">\n <div\n class=\"column scroll-padding\"\n [class.disabled]=\"disableEnablingColumn(column, columns)\"\n >\n <div class=\"column\" [class.unavailable]=\"column.isUnavailable\">\n <ng-container\n *ngTemplateOutlet=\"reorderIcon; context: { column, columns }\"\n ></ng-container>\n\n <riv-highlight\n [text]=\"column.resolvedName\"\n [indices]=\"column.highlightIndices\"\n ></riv-highlight>\n </div>\n <div>\n <riv-menu\n class=\"hidden\"\n *ngIf=\"\n (column.enabled || !disableEnablingColumns(columns)) &&\n !column.alwaysPinned &&\n !column.isUnavailable\n \"\n >\n <button\n type=\"button\"\n *ngIf=\"column.enabled && !column.pinned\"\n riv-menu-item\n (click)=\"\n columnFreezeUpTo(true, column.stateIndex, 'optionsMenu', column.key)\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.enabled && column.pinned\"\n riv-menu-item\n (click)=\"columnFreezeUpTo(false, 0, 'optionsMenu', column.key)\"\n >\n Un-freeze columns\n </button>\n <button\n type=\"button\"\n riv-menu-item\n (click)=\"columnMoveTo(column, 'start')\"\n >\n Move to start\n </button>\n <button\n type=\"button\"\n riv-menu-item\n (click)=\"columnMoveTo(column, 'end')\"\n >\n Move to end\n </button>\n <button\n *ngIf=\"!column.alwaysVisible\"\n type=\"button\"\n riv-menu-item\n (click)=\"columnEnabledChange(column, !column.enabled, 'optionsMenu')\"\n >\n {{ column.enabled ? 'Hide column' : 'Show column' }}\n </button>\n </riv-menu>\n\n <ng-container\n *ngTemplateOutlet=\"enableIcon; context: { column, columns }\"\n ></ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #reorderIcon let-column=\"column\" let-columns=\"columns\">\n <ng-container *ngIf=\"(searching | async) === false\">\n <span\n *ngIf=\"!column.alwaysPinned && !column.isUnavailable\"\n class=\"reorder\"\n [class.disabled]=\"disableEnablingColumn(column, columns)\"\n [rivTooltip]=\"column.tooltipForReorderIcon\"\n >\n <riv-icon [name]=\"'Reorder'\" [size]=\"20\"></riv-icon>\n </span>\n\n <span\n *ngIf=\"column.alwaysPinned || column.isUnavailable\"\n class=\"reorder-locked\"\n [class.disabled]=\"true\"\n [rivTooltip]=\"column.tooltipForReorderIcon\"\n >\n <riv-icon [name]=\"'Lock'\" [size]=\"20\"></riv-icon>\n </span>\n </ng-container>\n</ng-template>\n\n<ng-template #enableIcon let-column=\"column\" let-columns=\"columns\">\n <button\n *ngIf=\"\n !column.alwaysVisible && !column.alwaysPinned && !column.isUnavailable\n \"\n type=\"button\"\n rivButton\n [rivTooltip]=\"\n column.enabled\n ? 'Hide column'\n : disableEnablingColumns(columns)\n ? limitTooltip()\n : 'Show column'\n \"\n class=\"disable-override\"\n [class.disabled]=\"!column.enabled\"\n [disabled]=\"disableEnablingColumn(column, columns)\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"column.enabled ? 'Eye' : 'EyeOff'\"\n (click)=\"columnEnabledChange(column, !column.enabled, 'eyeIcon')\"\n ></button>\n\n <button\n *ngIf=\"column.alwaysVisible || column.alwaysPinned || column.isUnavailable\"\n type=\"button\"\n rivButton\n [rivTooltip]=\"column.tooltipForHideIcon\"\n [disabled]=\"true\"\n [class.disabled]=\"true\"\n [variant]=\"'ghost'\"\n [size]=\"'small'\"\n [icon]=\"'Lock'\"\n ></button>\n</ng-template>\n", styles: [".content{padding:var(--size-large);display:flex;flex-direction:column;gap:var(--size-medium);height:100%}.title{font:var(--title-02);display:flex;justify-content:space-between;align-items:center}.column-header{color:var(--type-light-low-contrast);display:flex;justify-content:space-between;align-items:center;font:var(--input-medium)}.column-header-label{padding:var(--size-small) 0}.column{display:flex;align-items:center;justify-content:space-between;position:relative;font:var(--input-medium)}.column:hover{background-color:var(--surface-light-1)}.column:hover .hidden{opacity:1}.column.disabled,.column.unavailable{color:var(--type-light-low-contrast)}.reorder{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch;color:var(--type-light-low-contrast);cursor:grab}.reorder.disabled{cursor:not-allowed}.reorder-locked{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch;color:var(--type-light-low-contrast);cursor:not-allowed}.pinned{padding-right:var(--size-medium);display:flex;justify-content:center;align-items:center;align-self:stretch}.frozen{display:flex;align-items:center;justify-content:space-between;position:relative;font:var(--input-medium);color:var(--type-light-low-contrast)}.disable-override.disabled:hover{cursor:pointer}.hidden{opacity:0}.columns{flex-grow:1;overflow-y:auto}.options{display:flex;flex-direction:column}.option{position:relative}.option.dragged-over-top:before,.option.dragged-over-bottom:before{content:\"\";position:absolute;left:0;right:0;height:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}.option.dragged-over-top:before{top:0}.option.dragged-over-bottom:before{bottom:0}.scroll-padding{padding-right:var(--base-grid-size)}.divider{border-top:var(--border-width) solid var(--border-light);margin-top:var(--size-medium);margin-bottom:var(--size-medium)}.chevron{cursor:pointer}\n"] }]
197
221
  }], propDecorators: { manager: [{
198
222
  type: Input
199
223
  }], anchor: [{
200
224
  type: ViewChild,
201
225
  args: ['trigger', { read: ElementRef }]
202
226
  }] } });
203
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29sdW1uLXNldHRpbmdzLXNpZGUtc2hlZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUtY29sdW1uLXNldHRpbmdzL3RhYmxlLWNvbHVtbi1zZXR0aW5ncy1zaWRlLXNoZWV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3RhYmxlL3RhYmxlL3RhYmxlLWNvbHVtbi1zZXR0aW5ncy90YWJsZS1jb2x1bW4tc2V0dGluZ3Mtc2lkZS1zaGVldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUdMLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLElBQUksTUFBTSxTQUFTLENBQUM7QUFDM0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFhckUsTUFBTSxPQUFPLHFDQUFxQztJQU5sRDtRQWtCVyxTQUFJLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEMsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV0QyxjQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FB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QUVELGdCQUFnQixDQUFDLE9BQWdCLEVBQUUsa0JBQTBCO1FBQzNELElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFO1lBQ3BFLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUM3RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDcEQsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUN6QixJQUFJLEVBQUUscUJBQXFCO29CQUMzQixNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtvQkFDN0IsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLE1BQU0sRUFBRSxVQUFVO2lCQUNuQixDQUFDLENBQUM7YUFDSjtZQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxLQUFhO1FBQ3JDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7bUlBM1BVLHFDQUFxQzt1SEFBckMscUNBQXFDLDBMQVNsQixVQUFVLDZCQ25DMUMsMDJYQXVXQTs0RkQ3VWEscUNBQXFDO2tCQU5qRCxTQUFTOytCQUNFLHNDQUFzQyxtQkFHL0IsdUJBQXVCLENBQUMsTUFBTTs4QkFTL0MsT0FBTztzQkFETixLQUFLO2dCQUlOLE1BQU07c0JBREwsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IEZ1c2UgZnJvbSAnZnVzZS5qcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIG1hcCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUml2U2VsZWN0IH0gZnJvbSAnLi4vLi4vLi4vaW5wdXQvc2VsZWN0L3N0YXRlJztcbmltcG9ydCB7IFJpdlRhYmxlIH0gZnJvbSAnLi4vc3RhdGUnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW5IZWxwZXJzIH0gZnJvbSAnLi4vc3RhdGUtaGVscGVycy9jb2x1bW4taGVscGVycyc7XG5cbnR5cGUgQ29sdW1uR3JvdXBzPEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4+ID0ge1xuICBlbmFibGVkQ29sdW1uczogVGFibGVDb2x1bW5IZWxwZXJzLkNvbHVtbkxpc3Q8Qz47XG4gIGRpc2FibGVkQ29sdW1uczogVGFibGVDb2x1bW5IZWxwZXJzLkNvbHVtbkxpc3Q8Qz47XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtdGFibGUtY29sdW1uLXNldHRpbmdzLXNpZGUtc2hlZXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtY29sdW1uLXNldHRpbmdzLXNpZGUtc2hlZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1jb2x1bW4tc2V0dGluZ3Mtc2lkZS1zaGVldC5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbHVtblNldHRpbmdzU2lkZVNoZWV0Q29tcG9uZW50PFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveVxue1xuICBASW5wdXQoKVxuICBtYW5hZ2VyPzogUml2VGFibGUuTWFuYWdlcjxSLCBDLCBGPjtcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIGFuY2hvcj86IEVsZW1lbnRSZWY7XG5cbiAgcmVhZG9ubHkgb3BlbiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIHJlYWRvbmx5IGZpbHRlclF1ZXJ5ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG5cbiAgcmVhZG9ubHkgc2VhcmNoaW5nID0gdGhpcy5maWx0ZXJRdWVyeS5waXBlKG1hcChxdWVyeSA9PiAhIXF1ZXJ5KSk7XG5cbiAgY29sdW1uTGlzdD86IE9ic2VydmFibGU8Q29sdW1uR3JvdXBzPEM+PjtcblxuICBtYXhFbmFibGVkQ29sdW1uczogbnVtYmVyID0gUml2VGFibGUuQ29sdW1uc01heFNob3duO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29sdW1uTGlzdCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5tYW5hZ2VyIS5zdGF0ZS5waXBlKFxuICAgICAgICBtYXAocyA9PiB7XG4gICAgICAgICAgY29uc3QgYWxsQ29sdW1uczogVGFibGVDb2x1bW5IZWxwZXJzLkNvbHVtbkxpc3Q8Qz4gPVxuICAgICAgICAgICAgVGFibGVDb2x1bW5IZWxwZXJzLmdldENvbHVtblNldHRpbmdzQ29sdW1uTGlzdChzKTtcblxuICAgICAgICAgIGNvbnN0IGZ1c2UgPSBuZXcgRnVzZShhbGxDb2x1bW5zLCB7XG4gICAgICAgICAgICBrZXlzOiBbJ3Jlc29sdmVkTmFtZSddLFxuICAgICAgICAgICAgaWdub3JlTG9jYXRpb246IHRydWUsXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IDAsXG4gICAgICAgICAgICBpbmNsdWRlTWF0Y2hlczogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBmdXNlLCBhbGxDb2x1bW5zIH07XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIHRoaXMuZmlsdGVyUXVlcnksXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3sgZnVzZSwgYWxsQ29sdW1ucyB9LCBmaWx0ZXJRdWVyeV0pID0+IHtcbiAgICAgICAgaWYgKGZpbHRlclF1ZXJ5KSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGZ1c2Uuc2VhcmNoKGZpbHRlclF1ZXJ5KS5tYXAobWF0Y2ggPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RtYXRjaCA9IG1hdGNoLm1hdGNoZXM/LmZpbmQoXG4gICAgICAgICAgICAgIHJlc3VsdCA9PiByZXN1bHQua2V5ID09PSAncmVzb2x2ZWROYW1lJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5tYXRjaC5pdGVtLFxuICAgICAgICAgICAgICBoaWdobGlnaHRJbmRpY2VzOiBbXG4gICAgICAgICAgICAgICAgLi4uKGZpcnN0bWF0Y2g/LmluZGljZXMgfHwgW10pLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIFJpdlNlbGVjdC5pc0Z1c2VNYXRjaEV4YWN0KGZpcnN0bWF0Y2ghLCBmaWx0ZXJRdWVyeSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgZW5hYmxlZENvbHVtbnMgPSBtYXRjaGVzLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmVuYWJsZWQpO1xuICAgICAgICAgIGNvbnN0IGRpc2FibGVkQ29sdW1ucyA9IG1hdGNoZXMuZmlsdGVyKGNvbHVtbiA9PiAhY29sdW1uLmVuYWJsZWQpO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVuYWJsZWRDb2x1bW5zLFxuICAgICAgICAgICAgZGlzYWJsZWRDb2x1bW5zLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhbGxWaXNpYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMubWFwKGNvbHVtbiA9PiAoe1xuICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICBoaWdobGlnaHRJbmRpY2VzOiBbXSxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnN0IGVuYWJsZWRDb2x1bW5zID0gYWxsVmlzaWJsZUNvbHVtbnMuZmlsdGVyKFxuICAgICAgICAgIGNvbHVtbiA9PiBjb2x1bW4uZW5hYmxlZCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGlzYWJsZWRDb2x1bW5zID0gYWxsVmlzaWJsZUNvbHVtbnMuZmlsdGVyKFxuICAgICAgICAgIGNvbHVtbiA9PiAhY29sdW1uLmVuYWJsZWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbmFibGVkQ29sdW1uczogZW5hYmxlZENvbHVtbnMsXG4gICAgICAgICAgZGlzYWJsZWRDb2x1bW5zOiBkaXNhYmxlZENvbHVtbnMsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZURyYWdPdmVyKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5oYW5kbGVEcmFnT3Zlcik7XG4gIH1cblxuICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgd2hlbiB3ZSBoYXZlIGVudGVyZWQgYSBkcm9wIHpvbmUgZm9yIGFwcGx5aW5nIG91ciB2aXN1YWxcbiAgLy8gdHJlYXRtZW50LiBIb3dldmVyLCBpbiBvcmRlciB0byB0cmlnZ2VyIHRoZSBkcm9wIGV2ZW50LCB5b3UgbXVzdCBjYWxsIHByZXZlbnREZWZhdWx0XG4gIC8vIG9uIHRoZSBkcmFnb3Zlci4gV2UgYXJlIGhhbmRsaW5nIHRoaXMgbmF0aXZlbHkgb24gdGhlIGRvY3VtZW50LCBvdXRzaWRlIG9mIGFuZ3VsYXJcbiAgLy8gYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uIElmIHdlIGhhdmUgYSBkcmFnZ2VkT3ZlckNvbHVtbklkeCBhbmQgd2UgZHJhZyBvdmVyIGFuXG4gIC8vIGVsZW1lbnQgd2l0aCBjbGFzcyBkcm9wLXpvbmUsIHdlIHdpbGwgYXNzdW1lIHlvdSB3YW50IHRvIHRoZSBkcm9wIGVsZW1lbnQgZW5hYmxlZFxuICAvLyBhbmQgd2Ugd2lsbCBwcmV2ZW50RGVmYXVsdC5cbiAgaGFuZGxlRHJhZ092ZXIgPSAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCAhPSBudWxsICYmIHRhcmdldC5jbG9zZXN0KCcuZHJvcC16b25lJykpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbHVtbkVuYWJsZWRDaGFuZ2UoXG4gICAgY29sdW1uOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPixcbiAgICBlbmFibGVkOiBib29sZWFuLFxuICAgIHNvdXJjZTogJ29wdGlvbnNNZW51JyB8ICdleWVJY29uJyxcbiAgKSB7XG4gICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgdHlwZTogJ2NvbHVtbkVuYWJsZWRDaGFuZ2UnLFxuICAgICAgY29sdW1uOiBjb2x1bW4ua2V5LFxuICAgICAgZW5hYmxlZCxcbiAgICAgIHNvdXJjZSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbHVtblBpbkNoYW5nZShjb2x1bW46IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+LCBwaW5uZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm1hbmFnZXI/LmFjdGlvbnMubmV4dCh7XG4gICAgICB0eXBlOiAnY29sdW1uUGluQ2hhbmdlJyxcbiAgICAgIGNvbHVtbjogY29sdW1uLmtleSxcbiAgICAgIHBpbm5lZCxcbiAgICB9KTtcbiAgfVxuICByZXNldFRvRGVmYXVsdCgpIHtcbiAgICB0aGlzLm1hbmFnZXI/LmFjdGlvbnMubmV4dCh7XG4gICAgICB0eXBlOiAncmVzZXRUb0RlZmF1bHRDb2x1bW5zJyxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbHVtbk1vdmVUbyhjb2x1bW46IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+LCBwb3NpdGlvbjogJ3N0YXJ0JyB8ICdlbmQnKSB7XG4gICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgdHlwZTogJ2NvbHVtbk1vdmVUb0NoYW5nZScsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIGNvbHVtbjogY29sdW1uLmtleSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbHVtbkZyZWV6ZVVwVG8oXG4gICAgZnJlZXplOiBib29sZWFuLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc291cmNlOiAnZnJlZXplRGl2aWRlcicgfCAnb3B0aW9uc01lbnUnLFxuICAgIGNvbHVtbj86IEMsXG4gICkge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICdjb2x1bW5zRnJlZXplVXBUb0NoYW5nZScsXG4gICAgICBmcmVlemUsXG4gICAgICBpbmRleCxcbiAgICAgIHNvdXJjZSxcbiAgICAgIGNvbHVtbixcbiAgICB9KTtcbiAgfVxuXG4gIGFsbENvbHVtbnNEaXNhYmxlZChjb2x1bW5zOiBDb2x1bW5Hcm91cHM8Qz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29sdW1ucy5kaXNhYmxlZENvbHVtbnMubGVuZ3RoID09IDAgJiYgY29sdW1ucy5lbmFibGVkQ29sdW1ucy5sZW5ndGggPiAwXG4gICAgKTtcbiAgfVxuXG4gIGFsbENvbHVtbnNFbmFibGVkKGNvbHVtbnM6IENvbHVtbkdyb3VwczxDPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb2x1bW5zLmVuYWJsZWRDb2x1bW5zLmxlbmd0aCA9PSAwICYmIGNvbHVtbnMuZGlzYWJsZWRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgc2hvd0FsbENvbHVtbnNWaXNpYmxlKGNvbHVtbnM6IENvbHVtbkdyb3VwczxDPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb2x1bW5zLmVuYWJsZWRDb2x1bW5zLmxlbmd0aCArIGNvbHVtbnMuZGlzYWJsZWRDb2x1bW5zLmxlbmd0aCA8PVxuICAgICAgdGhpcy5tYXhFbmFibGVkQ29sdW1uc1xuICAgICk7XG4gIH1cblxuICBkaXNhYmxlRW5hYmxpbmdDb2x1bW4oXG4gICAgY29sdW1uOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPixcbiAgICBjb2x1bW5zOiBDb2x1bW5Hcm91cHM8Qz4sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhY29sdW1uLmVuYWJsZWQgJiYgdGhpcy5kaXNhYmxlRW5hYmxpbmdDb2x1bW5zKGNvbHVtbnMpO1xuICB9XG5cbiAgZGlzYWJsZUVuYWJsaW5nQ29sdW1ucyhjb2x1bW5zOiBDb2x1bW5Hcm91cHM8Qz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sdW1ucy5lbmFibGVkQ29sdW1ucy5sZW5ndGggPj0gdGhpcy5tYXhFbmFibGVkQ29sdW1ucztcbiAgfVxuXG4gIGljb25MaW1pdFRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE91ciB0YWJsZXMgc3VwcG9ydCAke3RoaXMubWF4RW5hYmxlZENvbHVtbnN9IHZpc2libGUgY29sdW1ucy4gQ29uc2lkZXIgaGlkaW5nIHNvbWUgb2YgeW91ciBjdXJyZW50IGNvbHVtbnMgdG8gYWRkIGFueXRoaW5nIG5ldy5gO1xuICB9XG5cbiAgbGltaXRUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZb3XigJl2ZSByZWFjaGVkIHRoZSAke3RoaXMubWF4RW5hYmxlZENvbHVtbnN9LWNvbHVtbiBsaW1pdC4gSGlkZSBhIHZpc2libGUgY29sdW1uIHRvIHNob3cgdGhpcyBvbmUuYDtcbiAgfVxuXG4gIGVuYWJsZUFsbENvbHVtbnMoZW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICdlbmFibGVBbGxDb2x1bW5zQ2hhbmdlJyxcbiAgICAgIGVuYWJsZWQsXG4gICAgfSk7XG4gIH1cblxuICBkcmFnZ2VkQ29sdW1uSWR4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgZHJhZ2dlZENvbHVtbktleTogQyB8IG51bGwgPSBudWxsO1xuICBkcmFnZ2VkT3ZlckNvbHVtbklkeDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgZHJhZ1N0YXJ0KGlkeDogbnVtYmVyLCBrZXk6IEMpIHtcbiAgICB0aGlzLmRyYWdnZWRDb2x1bW5JZHggPSBpZHg7XG4gICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0ga2V5O1xuICB9XG5cbiAgZHJhZ092ZXIob250b0lkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCA9IG9udG9JZHg7XG4gIH1cblxuICBkcm9wKFxuICAgIG9udG9JZHg6IG51bWJlcixcbiAgICBzdGF0ZUluZGV4OiBudW1iZXIsXG4gICAgZW5hYmxlZDogYm9vbGVhbixcbiAgICBlbmFibGVkQ29sdW1uQ291bnQ6IG51bWJlcixcbiAgKSB7XG4gICAgaWYgKHRoaXMuZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICB0eXBlOiAnY29sdW1uT3JkZXJDaGFuZ2UnLFxuICAgICAgICBwcmV2aW91c0luZGV4OiB0aGlzLmRyYWdnZWRDb2x1bW5JZHgsXG4gICAgICAgIG5ld0luZGV4OiBzdGF0ZUluZGV4LFxuICAgICAgICBzb3VyY2U6ICdtZW51RHJhZycsXG4gICAgICAgIGNvbHVtbjogdGhpcy5kcmFnZ2VkQ29sdW1uS2V5IHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kcm9wRW5hYmxlZFN0YXRlKGVuYWJsZWQsIGVuYWJsZWRDb2x1bW5Db3VudCk7XG5cbiAgICAgIHRoaXMuZHJhZ2dlZE92ZXJDb2x1bW5JZHggPSBudWxsO1xuICAgICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBkcm9wRW5hYmxlZFN0YXRlKGVuYWJsZWQ6IGJvb2xlYW4sIGVuYWJsZWRDb2x1bW5Db3VudDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZHJhZ2dlZENvbHVtbktleSAhPT0gbnVsbCAmJiB0aGlzLmRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGlzRW5hYmxlZCA9IGVuYWJsZWRDb2x1bW5Db3VudCA+IHRoaXMuZHJhZ2dlZENvbHVtbklkeDtcbiAgICAgIGNvbnN0IHNob3VsZEZpcmUgPSBlbmFibGVkID8gIWlzRW5hYmxlZCA6IGlzRW5hYmxlZDtcbiAgICAgIGlmIChzaG91bGRGaXJlKSB7XG4gICAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgICAgICB0eXBlOiAnY29sdW1uRW5hYmxlZENoYW5nZScsXG4gICAgICAgICAgY29sdW1uOiB0aGlzLmRyYWdnZWRDb2x1bW5LZXksXG4gICAgICAgICAgZW5hYmxlZDogZW5hYmxlZCxcbiAgICAgICAgICBzb3VyY2U6ICdkcmFnRHJvcCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRyYWdnZWRPdmVyQ29sdW1uSWR4ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhZ2dlZENvbHVtbktleSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZWRDb2x1bW5zV2l0aE9mZnNldChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59XG4iLCI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAjdHJpZ2dlciByaXZCdXR0b24gKGNsaWNrKT1cIm9wZW4ubmV4dCh0cnVlKVwiPlxuICBDb2x1bW5zXG48L2J1dHRvbj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbkxpc3QgfCBhc3luYzsgbGV0IGNvbHVtbnNcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wZW4gfCBhc3luY1wiPlxuICAgIDxyaXYtc2lkZS1zaGVldFxuICAgICAgW2xhYmVsXT1cIidDb2x1bW5zJ1wiXG4gICAgICAoY2xvc2UpPVwib3Blbi5uZXh0KGZhbHNlKTsgZmlsdGVyUXVlcnkubmV4dCgnJylcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxuICAgICAgICAgIDxzcGFuPkNvbHVtbnM8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICByaXZCdXR0b25cbiAgICAgICAgICAgIFt2YXJpYW50XT1cIidnaG9zdCdcIlxuICAgICAgICAgICAgW2ljb25dPVwiJ1gnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcGVuLm5leHQoZmFsc2UpOyBmaWx0ZXJRdWVyeS5uZXh0KCcnKVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHJpdi1zZWFyY2hcbiAgICAgICAgICBbbmFtZV09XCInY29sdW1uLXNlYXJjaCdcIlxuICAgICAgICAgIFt2YWx1ZV09XCIoZmlsdGVyUXVlcnkgfCBhc3luYykgfHwgJydcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmaWx0ZXJRdWVyeS5uZXh0KCRldmVudClcIlxuICAgICAgICA+PC9yaXYtc2VhcmNoPlxuICAgICAgICA8cml2LWJhbm5lclxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICBjb2x1bW5zLmRpc2FibGVkQ29sdW1ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICBkaXNhYmxlRW5hYmxpbmdDb2x1bW5zKGNvbHVtbnMpXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbaWNvblRvb2x0aXBdPVwiaWNvbkxpbWl0VG9vbHRpcCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIENvbHVtbiBsaW1pdCByZWFjaGVkXG4gICAgICAgIDwvcml2LWJhbm5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnNcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1ucy5lbmFibGVkQ29sdW1ucy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiY29sdW1uLWhlYWRlciBkcm9wLXpvbmVcIlxuICAgICAgICAgICAgICAoZHJvcCk9XCJkcm9wRW5hYmxlZFN0YXRlKHRydWUsIGNvbHVtbnMuZW5hYmxlZENvbHVtbnMubGVuZ3RoKVwiXG4gICAgICAgICAgICAgIChkcmFnZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGRyYWdPdmVyKC0xKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uLWhlYWRlci1sYWJlbFwiPlNob3duIGluIHRhYmxlPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIoc2VhcmNoaW5nIHwgYXN5bmMpID09PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICAgICAgW3ZhcmlhbnRdPVwiJ2dob3N0J1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFsbENvbHVtbnNFbmFibGVkKGNvbHVtbnMpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW5hYmxlQWxsQ29sdW1ucyhmYWxzZSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgSGlkZSBhbGxcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1ucy5lbmFibGVkQ29sdW1uczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kcmFnZ2FibGVdPVwiXG4gICAgICAgICAgICAgICAgICAgIChzZWFyY2hpbmcgfCBhc3luYykgPT09IGZhbHNlICYmICFjb2x1bW4uYWx3YXlzUGlubmVkXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZHJvcHBhYmxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAoc2VhcmNoaW5nIHwgYXN5bmMpID09PSBmYWxzZSAmJiAhY29sdW1uLmFsd2F5c1Bpbm5lZFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5kcm9wLXpvbmVdPVwiIWNvbHVtbi5hbHdheXNQaW5uZWRcIlxuICAgICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJkcmFnU3RhcnQoY29sdW1uLnN0YXRlSW5kZXgsIGNvbHVtbi5rZXkpXCJcbiAgICAgICAgICAgICAgICAgIChkcmFnZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGRyYWdPdmVyKGkpXCJcbiAgICAgICAgICAgICAgICAgIChkcm9wKT1cIlxuICAgICAgICAgICAgICAgICAgICBkcm9wKFxuICAgICAgICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnN0YXRlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLmVuYWJsZWRDb2x1bW5zLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmRyYWdnZWQtb3Zlci10b3BdPVwiXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRPdmVyQ29sdW1uSWR4ID09PSBpICYmXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZENvbHVtbklkeCA+IGkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWNvbHVtbi5hbHdheXNQaW5uZWRcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZHJhZ2dlZC1vdmVyLWJvdHRvbV09XCJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZE92ZXJDb2x1bW5JZHggPT09IGkgJiZcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkQ29sdW1uSWR4IDwgaSAmJlxuICAgICAgICAgICAgICAgICAgICAhY29sdW1uLmFsd2F5c1Bpbm5lZFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW4sIGNvbHVtbnMgfVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5pc0xhc3RQaW5uZWRDb2x1bW4gJiYgKHNlYXJjaGluZyB8IGFzeW5jKSA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbiBzY3JvbGwtcGFkZGluZ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZyb3plblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpbm5lZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyaXYtaWNvbiBbbmFtZV09XCInUGluSW5hY3RpdmUnXCIgW3NpemVdPVwiMjBcIj48L3Jpdi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkZyb3plbiB0aHJvdWdoIGhlcmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICByaXZCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgW3JpdlRvb2x0aXBdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgIWNvbHVtbi5hbHdheXNQaW5uZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ1VuLWZyZWV6ZSBjb2x1bW5zJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnVGhlIGFib3ZlIGNvbHVtbnMgY2Fubm90IGJlIHVuZnJvemVuJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRpc2FibGUtb3ZlcnJpZGVcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWNvbHVtbi5lbmFibGVkIHx8IGNvbHVtbi5hbHdheXNQaW5uZWRcIlxuICAgICAgICAgICAgICAgICAgICBbdmFyaWFudF09XCInZ2hvc3QnXCJcbiAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cIidYJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5GcmVlemVVcFRvKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uc3RhdGVJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmcmVlemVEaXZpZGVyJ1xuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBjb2x1bW5zLmVuYWJsZWRDb2x1bW5zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAoc2VhcmNoaW5nIHwgYXN5bmMpID09PSBmYWxzZVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY29sdW1uLWhlYWRlciBkcm9wLXpvbmVcIlxuICAgICAgICAgICAgKGRyb3ApPVwiZHJvcEVuYWJsZWRTdGF0ZSh0cnVlLCBjb2x1bW5zLmVuYWJsZWRDb2x1bW5zLmxlbmd0aClcIlxuICAgICAgICAgICAgKGRyYWdlbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgZHJhZ092ZXIoLTEpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3Bhbj5ObyBjb2x1bW5zIHNob3duPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICAgIFt2YXJpYW50XT1cIidnaG9zdCdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwicmVzZXRUb0RlZmF1bHQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFJlc2V0IHRvIGRlZmF1bHRcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZGl2aWRlclwiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBjb2x1bW5zLmRpc2FibGVkQ29sdW1ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICgoc2VhcmNoaW5nIHwgYXN5bmMpID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgICAgICgoc2VhcmNoaW5nIHwgYXN5bmMpICYmIGNvbHVtbnMuZW5hYmxlZENvbHVtbnMubGVuZ3RoID4gMCkpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImNvbHVtbnMuZGlzYWJsZWRDb2x1bW5zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgKGRyb3ApPVwiZHJvcEVuYWJsZWRTdGF0ZShmYWxzZSwgY29sdW1ucy5lbmFibGVkQ29sdW1ucy5sZW5ndGgpXCJcbiAgICAgICAgICAgIChkcmFnZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGRyYWdPdmVyKC0xKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4taGVhZGVyLWxhYmVsXCI+SGlkZGVuIGZyb20gdGFibGU8L3NwYW4+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAoc2VhcmNoaW5nIHwgYXN5bmMpID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgICAgICAgc2hvd0FsbENvbHVtbnNWaXNpYmxlKGNvbHVtbnMpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICByaXZCdXR0b25cbiAgICAgICAgICAgICAgICBbdmFyaWFudF09XCInZ2hvc3QnXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWxsQ29sdW1uc0Rpc2FibGVkKGNvbHVtbnMpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW5hYmxlQWxsQ29sdW1ucyh0cnVlKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBTaG93IGFsbFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uc1wiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zLmRpc2FibGVkQ29sdW1uczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZHJhZ2dhYmxlXT1cIlxuICAgICAgICAgICAgICAgICAgKHNlYXJjaGluZyB8IGFzeW5jKSA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAgICFkaXNhYmxlRW5hYmxpbmdDb2x1bW5zKGNvbHVtbnMpICYmXG4gICAgICAgICAgICAgICAgICAhY29sdW1uLmFsd2F5c1Bpbm5lZFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZHJvcHBhYmxlXT1cIlxuICAgICAgICAgICAgICAgICAgKHNlYXJjaGluZyB8IGFzeW5jKSA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAgICFkaXNhYmxlRW5hYmxpbmdDb2x1bW5zKGNvbHVtbnMpICYmXG4gICAgICAgICAgICAgICAgICAhY29sdW1uLmFsd2F5c1Bpbm5lZFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRyb3Atem9uZV09XCJcbiAgICAgICAgICAgICAgICAgICFkaXNhYmxlRW5hYmxpbmdDb2x1bW5zKGNvbHVtbnMpICYmICFjb2x1bW4uYWx3YXlzUGlubmVkXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cImRyYWdTdGFydChjb2x1bW4uc3RhdGVJbmRleCwgY29sdW1uLmtleSlcIlxuICAgICAgICAgICAgICAgIChkcmFnZW50ZXIpPVwiXG4gICAgICAgICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgIGRyYWdPdmVyKGkgKyBjb2x1bW5zLmVuYWJsZWRDb2x1bW5zLmxlbmd0aClcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIChkcm9wKT1cIlxuICAgICAgICAgICAgICAgICAgZHJvcChcbiAgICAgICAgICAgICAgICAgICAgaSArIGNvbHVtbnMuZW5hYmxlZENvbHVtbnMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uc3RhdGVJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMuZW5hYmxlZENvbHVtbnMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtblRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IGNvbHVtbiwgY29sdW1ucyB9XG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3Jpdi1zaWRlLXNoZWV0PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2NvbHVtblRlbXBsYXRlIGxldC1jb2x1bW49XCJjb2x1bW5cIiBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY29sdW1uIHNjcm9sbC1wYWRkaW5nXCJcbiAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZUVuYWJsaW5nQ29sdW1uKGNvbHVtbiwgY29sdW1ucylcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInJlb3JkZXJJY29uOyBjb250ZXh0OiB7IGNvbHVtbiwgY29sdW1ucyB9XCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cblxuICAgICAgPHJpdi1oaWdobGlnaHRcbiAgICAgICAgW3RleHRdPVwiY29sdW1uLnJlc29sdmVkTmFtZVwiXG4gICAgICAgIFtpbmRpY2VzXT1cImNvbHVtbi5oaWdobGlnaHRJbmRpY2VzXCJcbiAgICAgID48L3Jpdi1oaWdobGlnaHQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxyaXYtbWVudVxuICAgICAgICBjbGFzcz1cImhpZGRlblwiXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgKGNvbHVtbi5lbmFibGVkIHx8ICFkaXNhYmxlRW5hYmxpbmdDb2x1bW5zKGNvbHVtbnMpKSAmJlxuICAgICAgICAgICFjb2x1bW4uYWx3YXlzUGlubmVkXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAqbmdJZj1cImNvbHVtbi5lbmFibGVkICYmICFjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICByaXYtbWVudS1pdGVtXG4gICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgY29sdW1uRnJlZXplVXBUbyh0cnVlLCBjb2x1bW4uc3RhdGVJbmRleCwgJ29wdGlvbnNNZW51JywgY29sdW1uLmtleSlcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgRnJlZXplIHVwIHRvIGNvbHVtblxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmVuYWJsZWQgJiYgY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgcml2LW1lbnUtaXRlbVxuICAgICAgICAgIChjbGljayk9XCJjb2x1bW5GcmVlemVVcFRvKGZhbHNlLCAwLCAnb3B0aW9uc01lbnUnLCBjb2x1bW4ua2V5KVwiXG4gICAgICAgID5cbiAgICAgICAgICBVbi1mcmVlemUgY29sdW1uc1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAoY2xpY2spPVwiY29sdW1uTW92ZVRvKGNvbHVtbiwgJ3N0YXJ0JylcIlxuICAgICAgICA+XG4gICAgICAgICAgTW92ZSB0byBzdGFydFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAoY2xpY2spPVwiY29sdW1uTW92ZVRvKGNvbHVtbiwgJ2VuZCcpXCJcbiAgICAgICAgPlxuICAgICAgICAgIE1vdmUgdG8gZW5kXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCIhY29sdW1uLmFsd2F5c1Zpc2libGVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAoY2xpY2spPVwiY29sdW1uRW5hYmxlZENoYW5nZShjb2x1bW4sICFjb2x1bW4uZW5hYmxlZCwgJ29wdGlvbnNNZW51JylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgY29sdW1uLmVuYWJsZWQgPyAnSGlkZSBjb2x1bW4nIDogJ1Nob3cgY29sdW1uJyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvcml2LW1lbnU+XG5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbmFibGVJY29uOyBjb250ZXh0OiB7IGNvbHVtbiwgY29sdW1ucyB9XCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Jlb3JkZXJJY29uIGxldC1jb2x1bW49XCJjb2x1bW5cIiBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihzZWFyY2hpbmcgfCBhc3luYykgPT09IGZhbHNlXCI+XG4gICAgPHNwYW5cbiAgICAgICpuZ0lmPVwiIWNvbHVtbi5hbHdheXNQaW5uZWRcIlxuICAgICAgY2xhc3M9XCJyZW9yZGVyXCJcbiAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkaXNhYmxlRW5hYmxpbmdDb2x1bW4oY29sdW1uLCBjb2x1bW5zKVwiXG4gICAgICBbcml2VG9vbHRpcF09XCJjb2x1bW4udG9vbHRpcEZvclJlb3JkZXJJY29uXCJcbiAgICA+XG4gICAgICA8cml2LWljb24gW25hbWVdPVwiJ1Jlb3JkZXInXCIgW3NpemVdPVwiMjBcIj48L3Jpdi1pY29uPlxuICAgIDwvc3Bhbj5cblxuICAgIDxzcGFuXG4gICAgICAqbmdJZj1cImNvbHVtbi5hbHdheXNQaW5uZWRcIlxuICAgICAgY2xhc3M9XCJyZW9yZGVyLWxvY2tlZFwiXG4gICAgICBbY2xhc3MuZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICBbcml2VG9vbHRpcF09XCJjb2x1bW4udG9vbHRpcEZvclJlb3JkZXJJY29uXCJcbiAgICA+XG4gICAgICA8cml2LWljb24gW25hbWVdPVwiJ0xvY2snXCIgW3NpemVdPVwiMjBcIj48L3Jpdi1pY29uPlxuICAgIDwvc3Bhbj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2VuYWJsZUljb24gbGV0LWNvbHVtbj1cImNvbHVtblwiIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCIhY29sdW1uLmFsd2F5c1Zpc2libGUgJiYgIWNvbHVtbi5hbHdheXNQaW5uZWRcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHJpdkJ1dHRvblxuICAgIFtyaXZUb29sdGlwXT1cIlxuICAgICAgY29sdW1uLmVuYWJsZWRcbiAgICAgICAgPyAnSGlkZSBjb2x1bW4nXG4gICAgICAgIDogZGlzYWJsZUVuYWJsaW5nQ29sdW1ucyhjb2x1bW5zKVxuICAgICAgICA/IGxpbWl0VG9vbHRpcCgpXG4gICAgICAgIDogJ1Nob3cgY29sdW1uJ1xuICAgIFwiXG4gICAgY2xhc3M9XCJkaXNhYmxlLW92ZXJyaWRlXCJcbiAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWNvbHVtbi5lbmFibGVkXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZUVuYWJsaW5nQ29sdW1uKGNvbHVtbiwgY29sdW1ucylcIlxuICAgIFt2YXJpYW50XT1cIidnaG9zdCdcIlxuICAgIFtzaXplXT1cIidzbWFsbCdcIlxuICAgIFtpY29uXT1cImNvbHVtbi5lbmFibGVkID8gJ0V5ZScgOiAnRXllT2ZmJ1wiXG4gICAgKGNsaWNrKT1cImNvbHVtbkVuYWJsZWRDaGFuZ2UoY29sdW1uLCAhY29sdW1uLmVuYWJsZWQsICdleWVJY29uJylcIlxuICA+PC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiY29sdW1uLmFsd2F5c1Zpc2libGUgfHwgY29sdW1uLmFsd2F5c1Bpbm5lZFwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgcml2QnV0dG9uXG4gICAgW3JpdlRvb2x0aXBdPVwiY29sdW1uLnRvb2x0aXBGb3JIaWRlSWNvblwiXG4gICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICAgIFtjbGFzcy5kaXNhYmxlZF09XCJ0cnVlXCJcbiAgICBbdmFyaWFudF09XCInZ2hvc3QnXCJcbiAgICBbc2l6ZV09XCInc21hbGwnXCJcbiAgICBbaWNvbl09XCInTG9jaydcIlxuICA+PC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuIl19
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29sdW1uLXNldHRpbmdzLXNpZGUtc2hlZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUtY29sdW1uLXNldHRpbmdzL3RhYmxlLWNvbHVtbi1zZXR0aW5ncy1zaWRlLXNoZWV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3RhYmxlL3RhYmxlL3RhYmxlLWNvbHVtbi1zZXR0aW5ncy90YWJsZS1jb2x1bW4tc2V0dGluZ3Mtc2lkZS1zaGVldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUdMLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLElBQUksTUFBTSxTQUFTLENBQUM7QUFDM0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFlckUsTUFBTSxPQUFPLHFDQUFxQztJQU5sRDtRQWtCVyxTQUFJLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEMsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV0QyxjQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FB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QUFDO0lBRUQseUJBQXlCLENBQUMsT0FBd0I7UUFDaEQsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELHdCQUF3QixDQUFDLE9BQXdCO1FBQy9DLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxPQUF3QixFQUFFLFNBQWtCO1FBQ25FLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFNBQVMsS0FBSyxLQUFLLENBQUM7SUFDcEUsQ0FBQztJQUVELDRCQUE0QixDQUFDLE9BQXdCLEVBQUUsU0FBa0I7UUFDdkUsT0FBTyxPQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLEtBQUssS0FBSyxDQUFDO0lBQ3RFLENBQUM7O21JQWpTVSxxQ0FBcUM7dUhBQXJDLHFDQUFxQywwTEFTbEIsVUFBVSw2QkNyQzFDLG93YkE4WkE7NEZEbFlhLHFDQUFxQztrQkFOakQsU0FBUzsrQkFDRSxzQ0FBc0MsbUJBRy9CLHVCQUF1QixDQUFDLE1BQU07OEJBUy9DLE9BQU87c0JBRE4sS0FBSztnQkFJTixNQUFNO3NCQURMLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBGdXNlIGZyb20gJ2Z1c2UuanMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJpdlNlbGVjdCB9IGZyb20gJy4uLy4uLy4uL2lucHV0L3NlbGVjdC9zdGF0ZSc7XG5pbXBvcnQgeyBSaXZUYWJsZSB9IGZyb20gJy4uL3N0YXRlJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uSGVscGVycyB9IGZyb20gJy4uL3N0YXRlLWhlbHBlcnMvY29sdW1uLWhlbHBlcnMnO1xuXG50eXBlIENvbHVtbkdyb3VwczxDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uPiA9IHtcbiAgZW5hYmxlZENvbHVtbnM6IFRhYmxlQ29sdW1uSGVscGVycy5Db2x1bW5MaXN0PEM+O1xuICBkaXNhYmxlZENvbHVtbnM6IFRhYmxlQ29sdW1uSGVscGVycy5Db2x1bW5MaXN0PEM+O1xuICB1bmF2YWlsYWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uSGVscGVycy5Db2x1bW5MaXN0PEM+O1xuICB1bmF2YWlsYWJsZUZvbGRlclRpdGxlOiBzdHJpbmc7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtdGFibGUtY29sdW1uLXNldHRpbmdzLXNpZGUtc2hlZXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtY29sdW1uLXNldHRpbmdzLXNpZGUtc2hlZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1jb2x1bW4tc2V0dGluZ3Mtc2lkZS1zaGVldC5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbHVtblNldHRpbmdzU2lkZVNoZWV0Q29tcG9uZW50PFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveVxue1xuICBASW5wdXQoKVxuICBtYW5hZ2VyPzogUml2VGFibGUuTWFuYWdlcjxSLCBDLCBGPjtcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIGFuY2hvcj86IEVsZW1lbnRSZWY7XG5cbiAgcmVhZG9ubHkgb3BlbiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIHJlYWRvbmx5IGZpbHRlclF1ZXJ5ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG5cbiAgcmVhZG9ubHkgc2VhcmNoaW5nID0gdGhpcy5maWx0ZXJRdWVyeS5waXBlKG1hcChxdWVyeSA9PiAhIXF1ZXJ5KSk7XG5cbiAgY29sdW1uTGlzdD86IE9ic2VydmFibGU8Q29sdW1uR3JvdXBzPEM+PjtcblxuICBtYXhFbmFibGVkQ29sdW1uczogbnVtYmVyID0gUml2VGFibGUuQ29sdW1uc01heFNob3duO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29sdW1uTGlzdCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5tYW5hZ2VyIS5zdGF0ZS5waXBlKFxuICAgICAgICBtYXAocyA9PiB7XG4gICAgICAgICAgY29uc3QgYWxsQ29sdW1uczogVGFibGVDb2x1bW5IZWxwZXJzLkNvbHVtbkxpc3Q8Qz4gPVxuICAgICAgICAgICAgVGFibGVDb2x1bW5IZWxwZXJzLmdldENvbHVtblNldHRpbmdzQ29sdW1uTGlzdChzKTtcblxuICAgICAgICAgIGNvbnN0IGZ1c2UgPSBuZXcgRnVzZShhbGxDb2x1bW5zLCB7XG4gICAgICAgICAgICBrZXlzOiBbJ3Jlc29sdmVkTmFtZSddLFxuICAgICAgICAgICAgaWdub3JlTG9jYXRpb246IHRydWUsXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IDAsXG4gICAgICAgICAgICBpbmNsdWRlTWF0Y2hlczogdHJ1ZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHVuYXZhaWxhYmxlQ29sdW1uczogVGFibGVDb2x1bW5IZWxwZXJzLkNvbHVtbkxpc3Q8Qz4gPVxuICAgICAgICAgICAgVGFibGVDb2x1bW5IZWxwZXJzLmNyZWF0ZVVuYXZhaWxhYmxlQ29sdW1ucyhcbiAgICAgICAgICAgICAgcy5kaXNwbGF5LnVuYXZhaWxhYmxlQ29sdW1uS2V5cyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgdW5hdmFpbGFibGVGb2xkZXJUaXRsZTogc3RyaW5nID1cbiAgICAgICAgICAgIHMuZGlzcGxheS51bmF2YWlsYWJsZUZvbGRlclRpdGxlO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZ1c2UsXG4gICAgICAgICAgICBhbGxDb2x1bW5zLFxuICAgICAgICAgICAgdW5hdmFpbGFibGVDb2x1bW5zLFxuICAgICAgICAgICAgdW5hdmFpbGFibGVGb2xkZXJUaXRsZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICB0aGlzLmZpbHRlclF1ZXJ5LFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbXG4gICAgICAgICAgeyBmdXNlLCBhbGxDb2x1bW5zLCB1bmF2YWlsYWJsZUNvbHVtbnMsIHVuYXZhaWxhYmxlRm9sZGVyVGl0bGUgfSxcbiAgICAgICAgICBmaWx0ZXJRdWVyeSxcbiAgICAgICAgXSkgPT4ge1xuICAgICAgICAgIGlmIChmaWx0ZXJRdWVyeSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGZ1c2Uuc2VhcmNoKGZpbHRlclF1ZXJ5KS5tYXAobWF0Y2ggPT4ge1xuICAgICAgICAgICAgICBjb25zdCBmaXJzdG1hdGNoID0gbWF0Y2gubWF0Y2hlcz8uZmluZChcbiAgICAgICAgICAgICAgICByZXN1bHQgPT4gcmVzdWx0LmtleSA9PT0gJ3Jlc29sdmVkTmFtZScsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ubWF0Y2guaXRlbSxcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRJbmRpY2VzOiBbXG4gICAgICAgICAgICAgICAgICAuLi4oZmlyc3RtYXRjaD8uaW5kaWNlcyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICBSaXZTZWxlY3QuaXNGdXNlTWF0Y2hFeGFjdChmaXJzdG1hdGNoISwgZmlsdGVyUXVlcnkpLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBlbmFibGVkQ29sdW1ucyA9IG1hdGNoZXMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uZW5hYmxlZCk7XG4gICAgICAgICAgICBjb25zdCBkaXNhYmxlZENvbHVtbnMgPSBtYXRjaGVzLmZpbHRlcihjb2x1bW4gPT4gIWNvbHVtbi5lbmFibGVkKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZW5hYmxlZENvbHVtbnMsXG4gICAgICAgICAgICAgIGRpc2FibGVkQ29sdW1ucyxcbiAgICAgICAgICAgICAgdW5hdmFpbGFibGVDb2x1bW5zOiB1bmF2YWlsYWJsZUNvbHVtbnMsXG4gICAgICAgICAgICAgIHVuYXZhaWxhYmxlRm9sZGVyVGl0bGU6IHVuYXZhaWxhYmxlRm9sZGVyVGl0bGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFsbFZpc2libGVDb2x1bW5zID0gYWxsQ29sdW1ucy5tYXAoY29sdW1uID0+ICh7XG4gICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICBoaWdobGlnaHRJbmRpY2VzOiBbXSxcbiAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBjb25zdCBlbmFibGVkQ29sdW1ucyA9IGFsbFZpc2libGVDb2x1bW5zLmZpbHRlcihcbiAgICAgICAgICAgIGNvbHVtbiA9PiBjb2x1bW4uZW5hYmxlZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGRpc2FibGVkQ29sdW1ucyA9IGFsbFZpc2libGVDb2x1bW5zLmZpbHRlcihcbiAgICAgICAgICAgIGNvbHVtbiA9PiAhY29sdW1uLmVuYWJsZWQsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbmFibGVkQ29sdW1uczogZW5hYmxlZENvbHVtbnMsXG4gICAgICAgICAgICBkaXNhYmxlZENvbHVtbnM6IGRpc2FibGVkQ29sdW1ucyxcbiAgICAgICAgICAgIHVuYXZhaWxhYmxlQ29sdW1uczogdW5hdmFpbGFibGVDb2x1bW5zLFxuICAgICAgICAgICAgdW5hdmFpbGFibGVGb2xkZXJUaXRsZTogdW5hdmFpbGFibGVGb2xkZXJUaXRsZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZURyYWdPdmVyKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5oYW5kbGVEcmFnT3Zlcik7XG4gIH1cblxuICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgd2hlbiB3ZSBoYXZlIGVudGVyZWQgYSBkcm9wIHpvbmUgZm9yIGFwcGx5aW5nIG91ciB2aXN1YWxcbiAgLy8gdHJlYXRtZW50LiBIb3dldmVyLCBpbiBvcmRlciB0byB0cmlnZ2VyIHRoZSBkcm9wIGV2ZW50LCB5b3UgbXVzdCBjYWxsIHByZXZlbnREZWZhdWx0XG4gIC8vIG9uIHRoZSBkcmFnb3Zlci4gV2UgYXJlIGhhbmRsaW5nIHRoaXMgbmF0aXZlbHkgb24gdGhlIGRvY3VtZW50LCBvdXRzaWRlIG9mIGFuZ3VsYXJcbiAgLy8gYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uIElmIHdlIGhhdmUgYSBkcmFnZ2VkT3ZlckNvbHVtbklkeCBhbmQgd2UgZHJhZyBvdmVyIGFuXG4gIC8vIGVsZW1lbnQgd2l0aCBjbGFzcyBkcm9wLXpvbmUsIHdlIHdpbGwgYXNzdW1lIHlvdSB3YW50IHRvIHRoZSBkcm9wIGVsZW1lbnQgZW5hYmxlZFxuICAvLyBhbmQgd2Ugd2lsbCBwcmV2ZW50RGVmYXVsdC5cbiAgaGFuZGxlRHJhZ092ZXIgPSAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCAhPSBudWxsICYmIHRhcmdldC5jbG9zZXN0KCcuZHJvcC16b25lJykpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbHVtbkVuYWJsZWRDaGFuZ2UoXG4gICAgY29sdW1uOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPixcbiAgICBlbmFibGVkOiBib29sZWFuLFxuICAgIHNvdXJjZTogJ29wdGlvbnNNZW51JyB8ICdleWVJY29uJyxcbiAgKSB7XG4gICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgdHlwZTogJ2NvbHVtbkVuYWJsZWRDaGFuZ2UnLFxuICAgICAgY29sdW1uOiBjb2x1bW4ua2V5LFxuICAgICAgZW5hYmxlZCxcbiAgICAgIHNvdXJjZSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbHVtblBpbkNoYW5nZShjb2x1bW46IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+LCBwaW5uZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm1hbmFnZXI/LmFjdGlvbnMubmV4dCh7XG4gICAgICB0eXBlOiAnY29sdW1uUGluQ2hhbmdlJyxcbiAgICAgIGNvbHVtbjogY29sdW1uLmtleSxcbiAgICAgIHBpbm5lZCxcbiAgICB9KTtcbiAgfVxuICByZXNldFRvRGVmYXVsdCgpIHtcbiAgICB0aGlzLm1hbmFnZXI/LmFjdGlvbnMubmV4dCh7XG4gICAgICB0eXBlOiAncmVzZXRUb0RlZmF1bHRDb2x1bW5zJyxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbHVtbk1vdmVUbyhjb2x1bW46IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+LCBwb3NpdGlvbjogJ3N0YXJ0JyB8ICdlbmQnKSB7XG4gICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgdHlwZTogJ2NvbHVtbk1vdmVUb0NoYW5nZScsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIGNvbHVtbjogY29sdW1uLmtleSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbHVtbkZyZWV6ZVVwVG8oXG4gICAgZnJlZXplOiBib29sZWFuLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc291cmNlOiAnZnJlZXplRGl2aWRlcicgfCAnb3B0aW9uc01lbnUnLFxuICAgIGNvbHVtbj86IEMsXG4gICkge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICdjb2x1bW5zRnJlZXplVXBUb0NoYW5nZScsXG4gICAgICBmcmVlemUsXG4gICAgICBpbmRleCxcbiAgICAgIHNvdXJjZSxcbiAgICAgIGNvbHVtbixcbiAgICB9KTtcbiAgfVxuXG4gIGFsbENvbHVtbnNEaXNhYmxlZChjb2x1bW5zOiBDb2x1bW5Hcm91cHM8Qz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29sdW1ucy5kaXNhYmxlZENvbHVtbnMubGVuZ3RoID09IDAgJiYgY29sdW1ucy5lbmFibGVkQ29sdW1ucy5sZW5ndGggPiAwXG4gICAgKTtcbiAgfVxuXG4gIGFsbENvbHVtbnNFbmFibGVkKGNvbHVtbnM6IENvbHVtbkdyb3VwczxDPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb2x1bW5zLmVuYWJsZWRDb2x1bW5zLmxlbmd0aCA9PSAwICYmIGNvbHVtbnMuZGlzYWJsZWRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgc2hvd0FsbENvbHVtbnNWaXNpYmxlKGNvbHVtbnM6IENvbHVtbkdyb3VwczxDPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb2x1bW5zLmVuYWJsZWRDb2x1bW5zLmxlbmd0aCArIGNvbHVtbnMuZGlzYWJsZWRDb2x1bW5zLmxlbmd0aCA8PVxuICAgICAgdGhpcy5tYXhFbmFibGVkQ29sdW1uc1xuICAgICk7XG4gIH1cblxuICBkaXNhYmxlRW5hYmxpbmdDb2x1bW4oXG4gICAgY29sdW1uOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPixcbiAgICBjb2x1bW5zOiBDb2x1bW5Hcm91cHM8Qz4sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhY29sdW1uLmVuYWJsZWQgJiYgdGhpcy5kaXNhYmxlRW5hYmxpbmdDb2x1bW5zKGNvbHVtbnMpO1xuICB9XG5cbiAgZGlzYWJsZUVuYWJsaW5nQ29sdW1ucyhjb2x1bW5zOiBDb2x1bW5Hcm91cHM8Qz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sdW1ucy5lbmFibGVkQ29sdW1ucy5sZW5ndGggPj0gdGhpcy5tYXhFbmFibGVkQ29sdW1ucztcbiAgfVxuXG4gIGljb25MaW1pdFRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE91ciB0YWJsZXMgc3VwcG9ydCAke3RoaXMubWF4RW5hYmxlZENvbHVtbnN9IHZpc2libGUgY29sdW1ucy4gQ29uc2lkZXIgaGlkaW5nIHNvbWUgb2YgeW91ciBjdXJyZW50IGNvbHVtbnMgdG8gYWRkIGFueXRoaW5nIG5ldy5gO1xuICB9XG5cbiAgbGltaXRUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZb3XigJl2ZSByZWFjaGVkIHRoZSAke3RoaXMubWF4RW5hYmxlZENvbHVtbnN9LWNvbHVtbiBsaW1pdC4gSGlkZSBhIHZpc2libGUgY29sdW1uIHRvIHNob3cgdGhpcyBvbmUuYDtcbiAgfVxuXG4gIGVuYWJsZUFsbENvbHVtbnMoZW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICdlbmFibGVBbGxDb2x1bW5zQ2hhbmdlJyxcbiAgICAgIGVuYWJsZWQsXG4gICAgfSk7XG4gIH1cblxuICBkcmFnZ2VkQ29sdW1uSWR4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgZHJhZ2dlZENvbHVtbktleTogQyB8IG51bGwgPSBudWxsO1xuICBkcmFnZ2VkT3ZlckNvbHVtbklkeDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgZHJhZ1N0YXJ0KGlkeDogbnVtYmVyLCBrZXk6IEMpIHtcbiAgICB0aGlzLmRyYWdnZWRDb2x1bW5JZHggPSBpZHg7XG4gICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0ga2V5O1xuICB9XG5cbiAgZHJhZ092ZXIob250b0lkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCA9IG9udG9JZHg7XG4gIH1cblxuICBkcm9wKFxuICAgIG9udG9JZHg6IG51bWJlcixcbiAgICBzdGF0ZUluZGV4OiBudW1iZXIsXG4gICAgZW5hYmxlZDogYm9vbGVhbixcbiAgICBlbmFibGVkQ29sdW1uQ291bnQ6IG51bWJlcixcbiAgKSB7XG4gICAgaWYgKHRoaXMuZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICB0eXBlOiAnY29sdW1uT3JkZXJDaGFuZ2UnLFxuICAgICAgICBwcmV2aW91c0luZGV4OiB0aGlzLmRyYWdnZWRDb2x1bW5JZHgsXG4gICAgICAgIG5ld0luZGV4OiBzdGF0ZUluZGV4LFxuICAgICAgICBzb3VyY2U6ICdtZW51RHJhZycsXG4gICAgICAgIGNvbHVtbjogdGhpcy5kcmFnZ2VkQ29sdW1uS2V5IHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kcm9wRW5hYmxlZFN0YXRlKGVuYWJsZWQsIGVuYWJsZWRDb2x1bW5Db3VudCk7XG5cbiAgICAgIHRoaXMuZHJhZ2dlZE92ZXJDb2x1bW5JZHggPSBudWxsO1xuICAgICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBkcm9wRW5hYmxlZFN0YXRlKGVuYWJsZWQ6IGJvb2xlYW4sIGVuYWJsZWRDb2x1bW5Db3VudDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZHJhZ2dlZENvbHVtbktleSAhPT0gbnVsbCAmJiB0aGlzLmRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGlzRW5hYmxlZCA9IGVuYWJsZWRDb2x1bW5Db3VudCA+IHRoaXMuZHJhZ2dlZENvbHVtbklkeDtcbiAgICAgIGNvbnN0IHNob3VsZEZpcmUgPSBlbmFibGVkID8gIWlzRW5hYmxlZCA6IGlzRW5hYmxlZDtcbiAgICAgIGlmIChzaG91bGRGaXJlKSB7XG4gICAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgICAgICB0eXBlOiAnY29sdW1uRW5hYmxlZENoYW5nZScsXG4gICAgICAgICAgY29sdW1uOiB0aGlzLmRyYWdnZWRDb2x1bW5LZXksXG4gICAgICAgICAgZW5hYmxlZDogZW5hYmxlZCxcbiAgICAgICAgICBzb3VyY2U6ICdkcmFnRHJvcCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRyYWdnZWRPdmVyQ29sdW1uSWR4ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhZ2dlZENvbHVtbktleSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZWRDb2x1bW5zV2l0aE9mZnNldChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgaGFzRGlzYWJsZWRDb2x1bW5zU2VjdGlvbihjb2x1bW5zOiBDb2x1bW5Hcm91cHM8Qz4pIHtcbiAgICByZXR1cm4gY29sdW1ucy5kaXNhYmxlZENvbHVtbnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGhhc0VuYWJsZWRDb2x1bW5zU2VjdGlvbihjb2x1bW5zOiBDb2x1bW5Hcm91cHM8Qz4pIHtcbiAgICByZXR1cm4gY29sdW1ucy5lbmFibGVkQ29sdW1ucy5sZW5ndGggPiAwO1xuICB9XG5cbiAgaGFzTm9Db2x1bW5zU2hvd25TZWN0aW9uKGNvbHVtbnM6IENvbHVtbkdyb3VwczxDPiwgc2VhcmNoaW5nOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIGNvbHVtbnMuZW5hYmxlZENvbHVtbnMubGVuZ3RoID09PSAwICYmIHNlYXJjaGluZyA9PT0gZmFsc2U7XG4gIH1cblxuICBoYXNVbmF2YWlsYWJsZUNvbHVtbnNTZWN0aW9uKGNvbHVtbnM6IENvbHVtbkdyb3VwczxDPiwgc2VhcmNoaW5nOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIGNvbHVtbnMudW5hdmFpbGFibGVDb2x1bW5zLmxlbmd0aCA+IDAgJiYgc2VhcmNoaW5nID09PSBmYWxzZTtcbiAgfVxuXG4gIHVuYXZhaWxhYmxlRm9sZGVyQ29sbGFwc2VkOiBib29sZWFuID0gZmFsc2U7XG59XG4iLCI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAjdHJpZ2dlciByaXZCdXR0b24gKGNsaWNrKT1cIm9wZW4ubmV4dCh0cnVlKVwiPlxuICBDb2x1bW5zXG48L2J1dHRvbj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbkxpc3QgfCBhc3luYzsgbGV0IGNvbHVtbnNcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wZW4gfCBhc3luY1wiPlxuICAgIDxyaXYtc2lkZS1zaGVldFxuICAgICAgW2xhYmVsXT1cIidDb2x1bW5zJ1wiXG4gICAgICAoY2xvc2UpPVwib3Blbi5uZXh0KGZhbHNlKTsgZmlsdGVyUXVlcnkubmV4dCgnJylcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxuICAgICAgICAgIDxzcGFuPkNvbHVtbnM8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICByaXZCdXR0b25cbiAgICAgICAgICAgIFt2YXJpYW50XT1cIidnaG9zdCdcIlxuICAgICAgICAgICAgW2ljb25dPVwiJ1gnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcGVuLm5leHQoZmFsc2UpOyBmaWx0ZXJRdWVyeS5uZXh0KCcnKVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHJpdi1zZWFyY2hcbiAgICAgICAgICBbbmFtZV09XCInY29sdW1uLXNlYXJjaCdcIlxuICAgICAgICAgIFt2YWx1ZV09XCIoZmlsdGVyUXVlcnkgfCBhc3luYykgfHwgJydcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmaWx0ZXJRdWVyeS5uZXh0KCRldmVudClcIlxuICAgICAgICA+PC9yaXYtc2VhcmNoPlxuICAgICAgICA8cml2LWJhbm5lclxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICBjb2x1bW5zLmRpc2FibGVkQ29sdW1ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICBkaXNhYmxlRW5hYmxpbmdDb2x1bW5zKGNvbHVtbnMpXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbaWNvblRvb2x0aXBdPVwiaWNvbkxpbWl0VG9vbHRpcCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIENvbHVtbiBsaW1pdCByZWFjaGVkXG4gICAgICAgIDwvcml2LWJhbm5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnNcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzRW5hYmxlZENvbHVtbnNTZWN0aW9uKGNvbHVtbnMpXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiY29sdW1uLWhlYWRlciBkcm9wLXpvbmVcIlxuICAgICAgICAgICAgICAoZHJvcCk9XCJkcm9wRW5hYmxlZFN0YXRlKHRydWUsIGNvbHVtbnMuZW5hYmxlZENvbHVtbnMubGVuZ3RoKVwiXG4gICAgICAgICAgICAgIChkcmFnZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGRyYWdPdmVyKC0xKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uLWhlYWRlci1sYWJlbFwiPlNob3duIGluIHRhYmxlPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIoc2VhcmNoaW5nIHwgYXN5bmMpID09PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICAgICAgW3ZhcmlhbnRdPVwiJ2dob3N0J1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFsbENvbHVtbnNFbmFibGVkKGNvbHVtbnMpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW5hYmxlQWxsQ29sdW1ucyhmYWxzZSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgSGlkZSBhbGxcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1ucy5lbmFibGVkQ29sdW1uczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kcmFnZ2FibGVdPVwiXG4gICAgICAgICAgICAgICAgICAgIChzZWFyY2hpbmcgfCBhc3luYykgPT09IGZhbHNlICYmICFjb2x1bW4uYWx3YXlzUGlubmVkXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZHJvcHBhYmxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAoc2VhcmNoaW5nIHwgYXN5bmMpID09PSBmYWxzZSAmJiAhY29sdW1uLmFsd2F5c1Bpbm5lZFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5kcm9wLXpvbmVdPVwiIWNvbHVtbi5hbHdheXNQaW5uZWRcIlxuICAgICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJkcmFnU3RhcnQoY29sdW1uLnN0YXRlSW5kZXgsIGNvbHVtbi5rZXkpXCJcbiAgICAgICAgICAgICAgICAgIChkcmFnZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGRyYWdPdmVyKGkpXCJcbiAgICAgICAgICAgICAgICAgIChkcm9wKT1cIlxuICAgICAgICAgICAgICAgICAgICBkcm9wKFxuICAgICAgICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnN0YXRlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLmVuYWJsZWRDb2x1bW5zLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmRyYWdnZWQtb3Zlci10b3BdPVwiXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRPdmVyQ29sdW1uSWR4ID09PSBpICYmXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZENvbHVtbklkeCA+IGkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWNvbHVtbi5hbHdheXNQaW5uZWRcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZHJhZ2dlZC1vdmVyLWJvdHRvbV09XCJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZE92ZXJDb2x1bW5JZHggPT09IGkgJiZcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkQ29sdW1uSWR4IDwgaSAmJlxuICAgICAgICAgICAgICAgICAgICAhY29sdW1uLmFsd2F5c1Bpbm5lZFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW4sIGNvbHVtbnMgfVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5pc0xhc3RQaW5uZWRDb2x1bW4gJiYgKHNlYXJjaGluZyB8IGFzeW5jKSA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbiBzY3JvbGwtcGFkZGluZ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZyb3plblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpbm5lZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyaXYtaWNvbiBbbmFtZV09XCInUGluSW5hY3RpdmUnXCIgW3NpemVdPVwiMjBcIj48L3Jpdi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkZyb3plbiB0aHJvdWdoIGhlcmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICByaXZCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgW3JpdlRvb2x0aXBdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgIWNvbHVtbi5hbHdheXNQaW5uZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ1VuLWZyZWV6ZSBjb2x1bW5zJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnVGhlIGFib3ZlIGNvbHVtbnMgY2Fubm90IGJlIHVuZnJvemVuJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRpc2FibGUtb3ZlcnJpZGVcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWNvbHVtbi5lbmFibGVkIHx8IGNvbHVtbi5hbHdheXNQaW5uZWRcIlxuICAgICAgICAgICAgICAgICAgICBbdmFyaWFudF09XCInZ2hvc3QnXCJcbiAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cIidYJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5GcmVlemVVcFRvKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uc3RhdGVJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmcmVlemVEaXZpZGVyJ1xuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBoYXNOb0NvbHVtbnNTaG93blNlY3Rpb24oY29sdW1ucywgKHNlYXJjaGluZyB8IGFzeW5jKSA/PyBmYWxzZSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cImNvbHVtbi1oZWFkZXIgZHJvcC16b25lXCJcbiAgICAgICAgICAgIChkcm9wKT1cImRyb3BFbmFibGVkU3RhdGUodHJ1ZSwgY29sdW1ucy5lbmFibGVkQ29sdW1ucy5sZW5ndGgpXCJcbiAgICAgICAgICAgIChkcmFnZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGRyYWdPdmVyKC0xKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+Tm8gY29sdW1ucyBzaG93bjwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHJpdkJ1dHRvblxuICAgICAgICAgICAgICBbdmFyaWFudF09XCInZ2hvc3QnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0VG9EZWZhdWx0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBSZXNldCB0byBkZWZhdWx0XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImRpdmlkZXJcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgaGFzRGlzYWJsZWRDb2x1bW5zU2VjdGlvbihjb2x1bW5zKSAmJlxuICAgICAgICAgICAgICAoaGFzRW5hYmxlZENvbHVtbnNTZWN0aW9uKGNvbHVtbnMpIHx8XG4gICAgICAgICAgICAgICAgaGFzTm9Db2x1bW5zU2hvd25TZWN0aW9uKGNvbHVtbnMsIChzZWFyY2hpbmcgfCBhc3luYykgPz8gZmFsc2UpKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJoYXNEaXNhYmxlZENvbHVtbnNTZWN0aW9uKGNvbHVtbnMpXCJcbiAgICAgICAgICAgIChkcm9wKT1cImRyb3BFbmFibGVkU3RhdGUoZmFsc2UsIGNvbHVtbnMuZW5hYmxlZENvbHVtbnMubGVuZ3RoKVwiXG4gICAgICAgICAgICAoZHJhZ2VudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBkcmFnT3ZlcigtMSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4taGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uLWhlYWRlci1sYWJlbFwiPkhpZGRlbiBmcm9tIHRhYmxlPC9zcGFuPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgKHNlYXJjaGluZyB8IGFzeW5jKSA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAgIHNob3dBbGxDb2x1bW5zVmlzaWJsZShjb2x1bW5zKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICAgICAgW3ZhcmlhbnRdPVwiJ2dob3N0J1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFsbENvbHVtbnNEaXNhYmxlZChjb2x1bW5zKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVuYWJsZUFsbENvbHVtbnModHJ1ZSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgU2hvdyBhbGxcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1ucy5kaXNhYmxlZENvbHVtbnM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRyYWdnYWJsZV09XCJcbiAgICAgICAgICAgICAgICAgIChzZWFyY2hpbmcgfCBhc3luYykgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgICAhZGlzYWJsZUVuYWJsaW5nQ29sdW1ucyhjb2x1bW5zKSAmJlxuICAgICAgICAgICAgICAgICAgIWNvbHVtbi5hbHdheXNQaW5uZWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRyb3BwYWJsZV09XCJcbiAgICAgICAgICAgICAgICAgIChzZWFyY2hpbmcgfCBhc3luYykgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgICAhZGlzYWJsZUVuYWJsaW5nQ29sdW1ucyhjb2x1bW5zKSAmJlxuICAgICAgICAgICAgICAgICAgIWNvbHVtbi5hbHdheXNQaW5uZWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kcm9wLXpvbmVdPVwiXG4gICAgICAgICAgICAgICAgICAhZGlzYWJsZUVuYWJsaW5nQ29sdW1ucyhjb2x1bW5zKSAmJiAhY29sdW1uLmFsd2F5c1Bpbm5lZFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJkcmFnU3RhcnQoY29sdW1uLnN0YXRlSW5kZXgsIGNvbHVtbi5rZXkpXCJcbiAgICAgICAgICAgICAgICAoZHJhZ2VudGVyKT1cIlxuICAgICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICBkcmFnT3ZlcihpICsgY29sdW1ucy5lbmFibGVkQ29sdW1ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAoZHJvcCk9XCJcbiAgICAgICAgICAgICAgICAgIGRyb3AoXG4gICAgICAgICAgICAgICAgICAgIGkgKyBjb2x1bW5zLmVuYWJsZWRDb2x1bW5zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLnN0YXRlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLmVuYWJsZWRDb2x1bW5zLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5UZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW4sIGNvbHVtbnMgfVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkaXZpZGVyXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIGhhc1VuYXZhaWxhYmxlQ29sdW1uc1NlY3Rpb24oXG4gICAgICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgICAgICAoc2VhcmNoaW5nIHwgYXN5bmMpID8/IGZhbHNlXG4gICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgKGhhc0Rpc2FibGVkQ29sdW1uc1NlY3Rpb24oY29sdW1ucykgfHxcbiAgICAgICAgICAgICAgICBoYXNFbmFibGVkQ29sdW1uc1NlY3Rpb24oY29sdW1ucykgfHxcbiAgICAgICAgICAgICAgICBoYXNOb0NvbHVtbnNTaG93blNlY3Rpb24oY29sdW1ucywgKHNlYXJjaGluZyB8IGFzeW5jKSA/PyBmYWxzZSkpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBoYXNVbmF2YWlsYWJsZUNvbHVtbnNTZWN0aW9uKFxuICAgICAgICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgICAgICAgKHNlYXJjaGluZyB8IGFzeW5jKSA/PyBmYWxzZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4taGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uLWhlYWRlci1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIHt7IGNvbHVtbnMudW5hdmFpbGFibGVGb2xkZXJUaXRsZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIHJpdkJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hldnJvblwiXG4gICAgICAgICAgICAgICAgW3ZhcmlhbnRdPVwiJ2dob3N0J1wiXG4gICAgICAgICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiXG4gICAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZUZvbGRlckNvbGxhcHNlZCA/ICdDaGV2cm9uRG93bicgOiAnQ2hldnJvblVwJ1xuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgdW5hdmFpbGFibGVGb2xkZXJDb2xsYXBzZWQgPSAhdW5hdmFpbGFibGVGb2xkZXJDb2xsYXBzZWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiF1bmF2YWlsYWJsZUZvbGRlckNvbGxhcHNlZFwiIGNsYXNzPVwib3B0aW9uc1wiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zLnVuYXZhaWxhYmxlQ29sdW1uczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5UZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW4sIGNvbHVtbnMgfVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9yaXYtc2lkZS1zaGVldD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNjb2x1bW5UZW1wbGF0ZSBsZXQtY29sdW1uPVwiY29sdW1uXCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNvbHVtbiBzY3JvbGwtcGFkZGluZ1wiXG4gICAgW2NsYXNzLmRpc2FibGVkXT1cImRpc2FibGVFbmFibGluZ0NvbHVtbihjb2x1bW4sIGNvbHVtbnMpXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIiBbY2xhc3MudW5hdmFpbGFibGVdPVwiY29sdW1uLmlzVW5hdmFpbGFibGVcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW9yZGVySWNvbjsgY29udGV4dDogeyBjb2x1bW4sIGNvbHVtbnMgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxyaXYtaGlnaGxpZ2h0XG4gICAgICAgIFt0ZXh0XT1cImNvbHVtbi5yZXNvbHZlZE5hbWVcIlxuICAgICAgICBbaW5kaWNlc109XCJjb2x1bW4uaGlnaGxpZ2h0SW5kaWNlc1wiXG4gICAgICA+PC9yaXYtaGlnaGxpZ2h0PlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8cml2LW1lbnVcbiAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIChjb2x1bW4uZW5hYmxlZCB8fCAhZGlzYWJsZUVuYWJsaW5nQ29sdW1ucyhjb2x1bW5zKSkgJiZcbiAgICAgICAgICAhY29sdW1uLmFsd2F5c1Bpbm5lZCAmJlxuICAgICAgICAgICFjb2x1bW4uaXNVbmF2YWlsYWJsZVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZW5hYmxlZCAmJiAhY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgcml2LW1lbnUtaXRlbVxuICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgIGNvbHVtbkZyZWV6ZVVwVG8odHJ1ZSwgY29sdW1uLnN0YXRlSW5kZXgsICdvcHRpb25zTWVudScsIGNvbHVtbi5rZXkpXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIEZyZWV6ZSB1cCB0byBjb2x1bW5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAqbmdJZj1cImNvbHVtbi5lbmFibGVkICYmIGNvbHVtbi5waW5uZWRcIlxuICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAoY2xpY2spPVwiY29sdW1uRnJlZXplVXBUbyhmYWxzZSwgMCwgJ29wdGlvbnNNZW51JywgY29sdW1uLmtleSlcIlxuICAgICAgICA+XG4gICAgICAgICAgVW4tZnJlZXplIGNvbHVtbnNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICByaXYtbWVudS1pdGVtXG4gICAgICAgICAgKGNsaWNrKT1cImNvbHVtbk1vdmVUbyhjb2x1bW4sICdzdGFydCcpXCJcbiAgICAgICAgPlxuICAgICAgICAgIE1vdmUgdG8gc3RhcnRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICByaXYtbWVudS1pdGVtXG4gICAgICAgICAgKGNsaWNrKT1cImNvbHVtbk1vdmVUbyhjb2x1bW4sICdlbmQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICBNb3ZlIHRvIGVuZFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiIWNvbHVtbi5hbHdheXNWaXNpYmxlXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICByaXYtbWVudS1pdGVtXG4gICAgICAgICAgKGNsaWNrKT1cImNvbHVtbkVuYWJsZWRDaGFuZ2UoY29sdW1uLCAhY29sdW1uLmVuYWJsZWQsICdvcHRpb25zTWVudScpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGNvbHVtbi5lbmFibGVkID8gJ0hpZGUgY29sdW1uJyA6ICdTaG93IGNvbHVtbicgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L3Jpdi1tZW51PlxuXG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW5hYmxlSWNvbjsgY29udGV4dDogeyBjb2x1bW4sIGNvbHVtbnMgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNyZW9yZGVySWNvbiBsZXQtY29sdW1uPVwiY29sdW1uXCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIoc2VhcmNoaW5nIHwgYXN5bmMpID09PSBmYWxzZVwiPlxuICAgIDxzcGFuXG4gICAgICAqbmdJZj1cIiFjb2x1bW4uYWx3YXlzUGlubmVkICYmICFjb2x1bW4uaXNVbmF2YWlsYWJsZVwiXG4gICAgICBjbGFzcz1cInJlb3JkZXJcIlxuICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRpc2FibGVFbmFibGluZ0NvbHVtbihjb2x1bW4sIGNvbHVtbnMpXCJcbiAgICAgIFtyaXZUb29sdGlwXT1cImNvbHVtbi50b29sdGlwRm9yUmVvcmRlckljb25cIlxuICAgID5cbiAgICAgIDxyaXYtaWNvbiBbbmFtZV09XCInUmVvcmRlcidcIiBbc2l6ZV09XCIyMFwiPjwvcml2LWljb24+XG4gICAgPC9zcGFuPlxuXG4gICAgPHNwYW5cbiAgICAgICpuZ0lmPVwiY29sdW1uLmFsd2F5c1Bpbm5lZCB8fCBjb2x1bW4uaXNVbmF2YWlsYWJsZVwiXG4gICAgICBjbGFzcz1cInJlb3JkZXItbG9ja2VkXCJcbiAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgIFtyaXZUb29sdGlwXT1cImNvbHVtbi50b29sdGlwRm9yUmVvcmRlckljb25cIlxuICAgID5cbiAgICAgIDxyaXYtaWNvbiBbbmFtZV09XCInTG9jaydcIiBbc2l6ZV09XCIyMFwiPjwvcml2LWljb24+XG4gICAgPC9zcGFuPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZW5hYmxlSWNvbiBsZXQtY29sdW1uPVwiY29sdW1uXCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCI+XG4gIDxidXR0b25cbiAgICAqbmdJZj1cIlxuICAgICAgIWNvbHVtbi5hbHdheXNWaXNpYmxlICYmICFjb2x1bW4uYWx3YXlzUGlubmVkICYmICFjb2x1bW4uaXNVbmF2YWlsYWJsZVxuICAgIFwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgcml2QnV0dG9uXG4gICAgW3JpdlRvb2x0aXBdPVwiXG4gICAgICBjb2x1bW4uZW5hYmxlZFxuICAgICAgICA/ICdIaWRlIGNvbHVtbidcbiAgICAgICAgOiBkaXNhYmxlRW5hYmxpbmdDb2x1bW5zKGNvbHVtbnMpXG4gICAgICAgID8gbGltaXRUb29sdGlwKClcbiAgICAgICAgOiAnU2hvdyBjb2x1bW4nXG4gICAgXCJcbiAgICBjbGFzcz1cImRpc2FibGUtb3ZlcnJpZGVcIlxuICAgIFtjbGFzcy5kaXNhYmxlZF09XCIhY29sdW1uLmVuYWJsZWRcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlRW5hYmxpbmdDb2x1bW4oY29sdW1uLCBjb2x1bW5zKVwiXG4gICAgW3ZhcmlhbnRdPVwiJ2dob3N0J1wiXG4gICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgW2ljb25dPVwiY29sdW1uLmVuYWJsZWQgPyAnRXllJyA6ICdFeWVPZmYnXCJcbiAgICAoY2xpY2spPVwiY29sdW1uRW5hYmxlZENoYW5nZShjb2x1bW4sICFjb2x1bW4uZW5hYmxlZCwgJ2V5ZUljb24nKVwiXG4gID48L2J1dHRvbj5cblxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCJjb2x1bW4uYWx3YXlzVmlzaWJsZSB8fCBjb2x1bW4uYWx3YXlzUGlubmVkIHx8IGNvbHVtbi5pc1VuYXZhaWxhYmxlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICByaXZCdXR0b25cbiAgICBbcml2VG9vbHRpcF09XCJjb2x1bW4udG9vbHRpcEZvckhpZGVJY29uXCJcbiAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgW2NsYXNzLmRpc2FibGVkXT1cInRydWVcIlxuICAgIFt2YXJpYW50XT1cIidnaG9zdCdcIlxuICAgIFtzaXplXT1cIidzbWFsbCdcIlxuICAgIFtpY29uXT1cIidMb2NrJ1wiXG4gID48L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=