@onecx/angular-accelerator 5.8.0 → 5.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/LICENSE +201 -0
  2. package/esm2022/lib/components/column-group-selection/column-group-selection.component.mjs +17 -2
  3. package/esm2022/lib/components/custom-group-column-selector/custom-group-column-selector.component.mjs +30 -4
  4. package/esm2022/lib/components/data-layout-selection/data-layout-selection.component.mjs +11 -2
  5. package/esm2022/lib/components/data-list-grid/data-list-grid.component.mjs +26 -3
  6. package/esm2022/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.mjs +17 -3
  7. package/esm2022/lib/components/data-table/data-table.component.mjs +45 -3
  8. package/esm2022/lib/components/data-view/data-view.component.mjs +33 -4
  9. package/esm2022/lib/components/diagram/diagram.component.mjs +8 -2
  10. package/esm2022/lib/components/group-by-count-diagram/group-by-count-diagram.component.mjs +8 -2
  11. package/esm2022/lib/components/interactive-data-view/interactive-data-view.component.mjs +76 -9
  12. package/esm2022/lib/components/search-header/search-header.component.mjs +11 -2
  13. package/esm2022/lib/utils/rxjs-utils.mjs +13 -0
  14. package/fesm2022/onecx-angular-accelerator.mjs +279 -22
  15. package/fesm2022/onecx-angular-accelerator.mjs.map +1 -1
  16. package/lib/components/column-group-selection/column-group-selection.component.d.ts +6 -1
  17. package/lib/components/custom-group-column-selector/custom-group-column-selector.component.d.ts +13 -3
  18. package/lib/components/data-layout-selection/data-layout-selection.component.d.ts +5 -1
  19. package/lib/components/data-list-grid/data-list-grid.component.d.ts +8 -1
  20. package/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.d.ts +12 -2
  21. package/lib/components/data-table/data-table.component.d.ts +11 -1
  22. package/lib/components/data-view/data-view.component.d.ts +10 -4
  23. package/lib/components/diagram/diagram.component.d.ts +5 -1
  24. package/lib/components/group-by-count-diagram/group-by-count-diagram.component.d.ts +5 -1
  25. package/lib/components/interactive-data-view/interactive-data-view.component.d.ts +27 -7
  26. package/lib/components/search-header/search-header.component.d.ts +6 -1
  27. package/lib/utils/rxjs-utils.d.ts +3 -0
  28. package/package.json +1 -1
@@ -4,7 +4,7 @@ import { TranslateService } from '@ngx-translate/core';
4
4
  import { isValidDate } from '@onecx/accelerator';
5
5
  import { UserService } from '@onecx/angular-integration-interface';
6
6
  import { PrimeTemplate } from 'primeng/api';
7
- import { BehaviorSubject, combineLatest, debounceTime, map, mergeMap, of } from 'rxjs';
7
+ import { BehaviorSubject, combineLatest, debounceTime, first, map, mergeMap, of } from 'rxjs';
8
8
  import { ColumnType } from '../../model/column-type.model';
9
9
  import { ObjectUtils } from '../../utils/objectutils';
10
10
  import { DataSortBase } from '../data-sort-base/data-sort-base';
@@ -193,6 +193,8 @@ export class DataTableComponent extends DataSortBase {
193
193
  this.deleteTableRow = new EventEmitter();
194
194
  this.selectionChanged = new EventEmitter();
195
195
  this.pageChanged = new EventEmitter();
196
+ this.pageSizeChanged = new EventEmitter();
197
+ this.componentStateChanged = new EventEmitter();
196
198
  this.currentFilterColumn$ = new BehaviorSubject(null);
197
199
  this.currentMenuRow$ = new BehaviorSubject(null);
198
200
  this.templates$ = new BehaviorSubject(undefined);
@@ -279,6 +281,22 @@ export class DataTableComponent extends DataSortBase {
279
281
  .map((filter) => filter.columnId)
280
282
  .map((columnId) => [columnId, filters.filter((filter) => filter.columnId === columnId).length])), map((amounts) => Object.fromEntries(amounts)));
281
283
  this.mapSelectionToRows();
284
+ this.emitComponentStateChanged();
285
+ }
286
+ emitComponentStateChanged(state = {}) {
287
+ combineLatest([this.displayedPageSize$, this._selection$]).pipe(first()).subscribe(([pageSize, selectedRows]) => {
288
+ this.componentStateChanged.emit({
289
+ filters: this.filters,
290
+ sorting: {
291
+ sortColumn: this.sortColumn,
292
+ sortDirection: this.sortDirection
293
+ },
294
+ pageSize,
295
+ activePage: this.page,
296
+ selectedRows,
297
+ ...state
298
+ });
299
+ });
282
300
  }
283
301
  ngAfterContentInit() {
284
302
  this.templates?.forEach((item) => {
@@ -333,6 +351,12 @@ export class DataTableComponent extends DataSortBase {
333
351
  this._sortColumn$.next(sortColumn);
334
352
  this._sortDirection$.next(newSortDirection);
335
353
  this.sorted.emit({ sortColumn: sortColumn, sortDirection: newSortDirection });
354
+ this.emitComponentStateChanged({
355
+ sorting: {
356
+ sortColumn: sortColumn,
357
+ sortDirection: newSortDirection
358
+ }
359
+ });
336
360
  }
337
361
  columnNextSortDirection(sortColumn) {
338
362
  return sortColumn !== this.sortColumn
@@ -362,6 +386,9 @@ export class DataTableComponent extends DataSortBase {
362
386
  this.filters = filters;
363
387
  }
364
388
  this.filtered.emit(filters);
389
+ this.emitComponentStateChanged({
390
+ filters
391
+ });
365
392
  this.resetPage();
366
393
  }
367
394
  getSelectedFilters(columnId) {
@@ -390,16 +417,27 @@ export class DataTableComponent extends DataSortBase {
390
417
  }));
391
418
  }
392
419
  onSelectionChange(event) {
420
+ this.selectedRows = event;
393
421
  this.selectionChanged.emit(event);
422
+ this.emitComponentStateChanged({
423
+ selectedRows: event
424
+ });
394
425
  }
395
426
  onPageChange(event) {
396
427
  const page = event.first / event.rows;
397
428
  this.page = page;
429
+ this.pageSize = event.rows;
398
430
  this.pageChanged.emit(page);
431
+ this.pageSizeChanged.emit(event.rows);
432
+ this.emitComponentStateChanged({
433
+ activePage: page,
434
+ pageSize: event.rows
435
+ });
399
436
  }
400
437
  resetPage() {
401
438
  this.page = 0;
402
439
  this.pageChanged.emit(this.page);
440
+ this.emitComponentStateChanged();
403
441
  }
404
442
  fieldIsTruthy(object, key) {
405
443
  return !!ObjectUtils.resolveFieldData(object, key);
@@ -506,7 +544,7 @@ export class DataTableComponent extends DataSortBase {
506
544
  };
507
545
  }
508
546
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: DataTableComponent, deps: [{ token: LOCALE_ID }, { token: i1.TranslateService }, { token: i2.Router }, { token: i0.Injector }, { token: i3.UserService }], target: i0.ɵɵFactoryTarget.Component }); }
509
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: DataTableComponent, selector: "ocx-data-table", inputs: { rows: "rows", selectedRows: "selectedRows", filters: "filters", sortDirection: "sortDirection", sortColumn: "sortColumn", columns: "columns", clientSideFiltering: "clientSideFiltering", clientSideSorting: "clientSideSorting", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", emptyResultsMessage: "emptyResultsMessage", name: "name", deletePermission: "deletePermission", viewPermission: "viewPermission", editPermission: "editPermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", selectionEnabledField: "selectionEnabledField", paginator: "paginator", page: "page", totalRecordsOnServer: "totalRecordsOnServer", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", stringCellTemplate: "stringCellTemplate", numberCellTemplate: "numberCellTemplate", customCellTemplate: "customCellTemplate", dateCellTemplate: "dateCellTemplate", relativeDateCellTemplate: "relativeDateCellTemplate", cellTemplate: "cellTemplate", translationKeyCellTemplate: "translationKeyCellTemplate", stringFilterCellTemplate: "stringFilterCellTemplate", numberFilterCellTemplate: "numberFilterCellTemplate", customFilterCellTemplate: "customFilterCellTemplate", dateFilterCellTemplate: "dateFilterCellTemplate", relativeDateFilterCellTemplate: "relativeDateFilterCellTemplate", filterCellTemplate: "filterCellTemplate", translationKeyFilterCellTemplate: "translationKeyFilterCellTemplate", additionalActions: "additionalActions", frozenActionColumn: "frozenActionColumn", actionColumnPosition: "actionColumnPosition", parentTemplates: "parentTemplates" }, outputs: { filtered: "filtered", sorted: "sorted", viewTableRow: "viewTableRow", editTableRow: "editTableRow", deleteTableRow: "deleteTableRow", selectionChanged: "selectionChanged", pageChanged: "pageChanged" }, queries: [{ propertyName: "stringCellChildTemplate", first: true, predicate: ["stringCell"], descendants: true }, { propertyName: "numberCellChildTemplate", first: true, predicate: ["numberCell"], descendants: true }, { propertyName: "customCellChildTemplate", first: true, predicate: ["customCell"], descendants: true }, { propertyName: "dateCellChildTemplate", first: true, predicate: ["dateCell"], descendants: true }, { propertyName: "relativeDateCellChildTemplate", first: true, predicate: ["relativeDateCell"], descendants: true }, { propertyName: "cellChildTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "translationKeyCellChildTemplate", first: true, predicate: ["translationKeyCell"], descendants: true }, { propertyName: "stringFilterCellChildTemplate", first: true, predicate: ["stringFilterCell"], descendants: true }, { propertyName: "numberFilterCellChildTemplate", first: true, predicate: ["numberFilterCell"], descendants: true }, { propertyName: "customFilterCellChildTemplate", first: true, predicate: ["customFilterCell"], descendants: true }, { propertyName: "dateFilterCellChildTemplate", first: true, predicate: ["dateFilterCell"], descendants: true }, { propertyName: "relativeDateFilterCellChildTemplate", first: true, predicate: ["relativeDateFilterCell"], descendants: true }, { propertyName: "filterCellChildTemplate", first: true, predicate: ["filterCell"], descendants: true }, { propertyName: "translationKeyFilterCellChildTemplate", first: true, predicate: ["translationKeyFilterCell"], descendants: true }, { propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "viewTemplates", predicate: PrimeTemplate, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<p-table\n *ngIf=\"displayedPageSize$ | async as displayedPageSize\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n paginatorDropdownAppendTo=\"body\"\n>\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div class=\"table-header-wrapper\">\n <span id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable\"\n [options]=\"(currentFilterOptions$ | async) || []\"\n [ngModel]=\"(currentSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onClick)=\"onFilterClick(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"getTemplate(column, TemplateType.FILTERCELL) | async as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)\"\n ></p-tableCheckbox>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: defaultCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n</p-table>\n\n<ng-template #defaultCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"getTemplate(column, TemplateType.CELL) | async as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)| date: 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i7.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i7.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i7.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i8.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i9.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i12.OcxTimeAgoPipe, name: "timeago" }] }); }
547
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: DataTableComponent, selector: "ocx-data-table", inputs: { rows: "rows", selectedRows: "selectedRows", filters: "filters", sortDirection: "sortDirection", sortColumn: "sortColumn", columns: "columns", clientSideFiltering: "clientSideFiltering", clientSideSorting: "clientSideSorting", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", emptyResultsMessage: "emptyResultsMessage", name: "name", deletePermission: "deletePermission", viewPermission: "viewPermission", editPermission: "editPermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", selectionEnabledField: "selectionEnabledField", paginator: "paginator", page: "page", totalRecordsOnServer: "totalRecordsOnServer", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", stringCellTemplate: "stringCellTemplate", numberCellTemplate: "numberCellTemplate", customCellTemplate: "customCellTemplate", dateCellTemplate: "dateCellTemplate", relativeDateCellTemplate: "relativeDateCellTemplate", cellTemplate: "cellTemplate", translationKeyCellTemplate: "translationKeyCellTemplate", stringFilterCellTemplate: "stringFilterCellTemplate", numberFilterCellTemplate: "numberFilterCellTemplate", customFilterCellTemplate: "customFilterCellTemplate", dateFilterCellTemplate: "dateFilterCellTemplate", relativeDateFilterCellTemplate: "relativeDateFilterCellTemplate", filterCellTemplate: "filterCellTemplate", translationKeyFilterCellTemplate: "translationKeyFilterCellTemplate", additionalActions: "additionalActions", frozenActionColumn: "frozenActionColumn", actionColumnPosition: "actionColumnPosition", parentTemplates: "parentTemplates" }, outputs: { filtered: "filtered", sorted: "sorted", viewTableRow: "viewTableRow", editTableRow: "editTableRow", deleteTableRow: "deleteTableRow", selectionChanged: "selectionChanged", pageChanged: "pageChanged", pageSizeChanged: "pageSizeChanged", componentStateChanged: "componentStateChanged" }, queries: [{ propertyName: "stringCellChildTemplate", first: true, predicate: ["stringCell"], descendants: true }, { propertyName: "numberCellChildTemplate", first: true, predicate: ["numberCell"], descendants: true }, { propertyName: "customCellChildTemplate", first: true, predicate: ["customCell"], descendants: true }, { propertyName: "dateCellChildTemplate", first: true, predicate: ["dateCell"], descendants: true }, { propertyName: "relativeDateCellChildTemplate", first: true, predicate: ["relativeDateCell"], descendants: true }, { propertyName: "cellChildTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "translationKeyCellChildTemplate", first: true, predicate: ["translationKeyCell"], descendants: true }, { propertyName: "stringFilterCellChildTemplate", first: true, predicate: ["stringFilterCell"], descendants: true }, { propertyName: "numberFilterCellChildTemplate", first: true, predicate: ["numberFilterCell"], descendants: true }, { propertyName: "customFilterCellChildTemplate", first: true, predicate: ["customFilterCell"], descendants: true }, { propertyName: "dateFilterCellChildTemplate", first: true, predicate: ["dateFilterCell"], descendants: true }, { propertyName: "relativeDateFilterCellChildTemplate", first: true, predicate: ["relativeDateFilterCell"], descendants: true }, { propertyName: "filterCellChildTemplate", first: true, predicate: ["filterCell"], descendants: true }, { propertyName: "translationKeyFilterCellChildTemplate", first: true, predicate: ["translationKeyFilterCell"], descendants: true }, { propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "viewTemplates", predicate: PrimeTemplate, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container\n *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container\n *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\"\n >\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of inlineActions$ | async\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(rowObject, action.actionVisibleField))\">\n <button\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(rowObject, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(rowObject) | async\">\n <p-menu #menu [model]=\"(overflowMenuItems$ | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"toggleOverflowMenu($event, menu, rowObject)\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container\n *ngIf=\"anyRowActionObserved || this.additionalActions.length > 0 || ((this.overflowActions$ | async) ?? []).length > 0\"\n >\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<p-table\n *ngIf=\"displayedPageSize$ | async as displayedPageSize\"\n [value]=\"(displayedRows$ | async) ?? []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) ?? []\"\n [scrollable]=\"true\"\n paginatorDropdownAppendTo=\"body\"\n>\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div class=\"table-header-wrapper\">\n <span id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton\"\n [class.pi-sort-alt]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable\"\n [options]=\"(currentFilterOptions$ | async) || []\"\n [ngModel]=\"(currentSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onClick)=\"onFilterClick(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container\n *ngIf=\"getTemplate(column, TemplateType.FILTERCELL) | async as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: getRowObjectFromMultiselectItem(value, column),\n column: column\n }\"\n >\n </ng-container>\n </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-tableCheckbox\n [value]=\"rowObject\"\n [disabled]=\"!!selectionEnabledField && !fieldIsTruthy(rowObject, selectionEnabledField)\"\n ></p-tableCheckbox>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: defaultCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved || this.additionalActions.length > 0) ? 1 : 0)\">\n {{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}\n </td>\n </tr>\n </ng-template>\n</p-table>\n\n<ng-template #defaultCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"getTemplate(column, TemplateType.CELL) | async as template\"\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultStringCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)}} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultNumberCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | number }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultCustomCell\" let-rowObject=\"rowObject\" let-column=\"column\"> </ng-template>\n\n<ng-template pTemplate=\"defaultDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id)| date: 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultRelativeDateCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container>\n {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ resolveFieldData(rowObject, column.id) | timeago }}\n </ng-container>\n</ng-template>\n\n<ng-template pTemplate=\"defaultTranslationKeyCell\" let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ resolveFieldData(rowObject, column.id) | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i7.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i7.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i7.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i8.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i9.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i12.OcxTimeAgoPipe, name: "timeago" }] }); }
510
548
  }
511
549
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: DataTableComponent, decorators: [{
512
550
  type: Component,
@@ -660,6 +698,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
660
698
  type: Output
661
699
  }], pageChanged: [{
662
700
  type: Output
701
+ }], pageSizeChanged: [{
702
+ type: Output
703
+ }], componentStateChanged: [{
704
+ type: Output
663
705
  }], templates: [{
664
706
  type: ContentChildren,
665
707
  args: [PrimeTemplate]
@@ -669,4 +711,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
669
711
  }], parentTemplates: [{
670
712
  type: Input
671
713
  }] } });
672
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLFNBQVMsRUFFVCxNQUFNLEVBR04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ2xFLE9BQU8sRUFBWSxhQUFhLEVBQWMsTUFBTSxhQUFhLENBQUE7QUFFakUsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ2xHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUkxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFBOzs7Ozs7Ozs7Ozs7OztBQVMvRCxNQUFNLENBQU4sSUFB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a0JBQWtCO2dCQUl2QixzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQzBCLDJCQUEyQjtzQkFBMUQsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBSXJCLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFDa0MsbUNBQW1DO3NCQUExRSxZQUFZO3VCQUFDLHdCQUF3QjtnQkFJN0Isa0JBQWtCO3NCQUExQixLQUFLO2dCQUNzQix1QkFBdUI7c0JBQWxELFlBQVk7dUJBQUMsWUFBWTtnQkFJakIsZ0NBQWdDO3NCQUF4QyxLQUFLO2dCQUNvQyxxQ0FBcUM7c0JBQTlFLFlBQVk7dUJBQUMsMEJBQTBCO2dCQU9wQyxpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBT0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFtQkgsU0FBUztzQkFEWixlQUFlO3VCQUFDLGFBQWE7Z0JBUzFCLGFBQWE7c0JBRGhCLFlBQVk7dUJBQUMsYUFBYTtnQkFTdkIsZUFBZTtzQkFEbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIExPQ0FMRV9JRCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJ1xuaW1wb3J0IHsgaXNWYWxpZERhdGUgfSBmcm9tICdAb25lY3gvYWNjZWxlcmF0b3InXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ0BvbmVjeC9hbmd1bGFyLWludGVncmF0aW9uLWludGVyZmFjZSdcbmltcG9ydCB7IE1lbnVJdGVtLCBQcmltZVRlbXBsYXRlLCBTZWxlY3RJdGVtIH0gZnJvbSAncHJpbWVuZy9hcGknXG5pbXBvcnQgeyBNZW51IH0gZnJvbSAncHJpbWVuZy9tZW51J1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBkZWJvdW5jZVRpbWUsIG1hcCwgbWVyZ2VNYXAsIG9mIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IENvbHVtblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9jb2x1bW4tdHlwZS5tb2RlbCdcbmltcG9ydCB7IERhdGFBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLWFjdGlvbidcbmltcG9ydCB7IERhdGFTb3J0RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS1zb3J0LWRpcmVjdGlvbidcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtdGFibGUtY29sdW1uLm1vZGVsJ1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tICcuLi8uLi91dGlscy9vYmplY3R1dGlscydcbmltcG9ydCB7IERhdGFTb3J0QmFzZSB9IGZyb20gJy4uL2RhdGEtc29ydC1iYXNlL2RhdGEtc29ydC1iYXNlJ1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RJdGVtIH0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCdcblxudHlwZSBQcmltaXRpdmUgPSBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgYmlnaW50IHwgRGF0ZVxuZXhwb3J0IHR5cGUgUm93ID0ge1xuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gIFtjb2x1bW5JZDogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgZW51bSBUZW1wbGF0ZVR5cGUge1xuICBDRUxMID0gJ0NFTEwnLFxuICBGSUxURVJDRUxMID0gJ0ZJTFRFUkNFTEwnLFxufVxuXG5pbnRlcmZhY2UgVGVtcGxhdGVzRGF0YSB7XG4gIHRlbXBsYXRlc09ic2VydmFibGVzOiBSZWNvcmQ8c3RyaW5nLCBPYnNlcnZhYmxlPFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPj5cbiAgaWRTdWZmaXg6IEFycmF5PHN0cmluZz5cbiAgdGVtcGxhdGVOYW1lczogUmVjb3JkPENvbHVtblR5cGUsIEFycmF5PHN0cmluZz4+XG59XG5cbmV4cG9ydCB0eXBlIEZpbHRlciA9IHsgY29sdW1uSWQ6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9XG5leHBvcnQgdHlwZSBTb3J0ID0geyBzb3J0Q29sdW1uOiBzdHJpbmc7IHNvcnREaXJlY3Rpb246IERhdGFTb3J0RGlyZWN0aW9uIH1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2N4LWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGV4dGVuZHMgRGF0YVNvcnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgVGVtcGxhdGVUeXBlID0gVGVtcGxhdGVUeXBlXG5cbiAgX3Jvd3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSb3dbXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCByb3dzKCk6IFJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcm93cyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCByb3dzKHZhbHVlOiBSb3dbXSkge1xuICAgICF0aGlzLl9yb3dzJC5nZXRWYWx1ZSgpLmxlbmd0aCA/PyB0aGlzLnJlc2V0UGFnZSgpXG4gICAgdGhpcy5fcm93cyQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc2VsZWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Um93W10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0ZWRSb3dzKCk6IFJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNlbGVjdGVkUm93cyh2YWx1ZTogUm93W10pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQodmFsdWUpXG4gIH1cbiAgX2ZpbHRlcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJbXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBmaWx0ZXJzKCk6IEZpbHRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVycyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBmaWx0ZXJzKHZhbHVlOiBGaWx0ZXJbXSkge1xuICAgICF0aGlzLl9maWx0ZXJzJC5nZXRWYWx1ZSgpLmxlbmd0aCA/PyB0aGlzLnJlc2V0UGFnZSgpXG4gICAgdGhpcy5fZmlsdGVycyQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc29ydERpcmVjdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFTb3J0RGlyZWN0aW9uPihEYXRhU29ydERpcmVjdGlvbi5OT05FKVxuICBASW5wdXQoKVxuICBnZXQgc29ydERpcmVjdGlvbigpOiBEYXRhU29ydERpcmVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnREaXJlY3Rpb24kLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydERpcmVjdGlvbih2YWx1ZTogRGF0YVNvcnREaXJlY3Rpb24pIHtcbiAgICB0aGlzLl9zb3J0RGlyZWN0aW9uJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zb3J0Q29sdW1uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcbiAgQElucHV0KClcbiAgZ2V0IHNvcnRDb2x1bW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcz8uX3NvcnRDb2x1bW4kLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydENvbHVtbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcz8uX3NvcnRDb2x1bW4kLm5leHQodmFsdWUpXG4gIH1cbiAgQElucHV0KCkgY29sdW1uczogRGF0YVRhYmxlQ29sdW1uW10gPSBbXVxuICBASW5wdXQoKSBjbGllbnRTaWRlRmlsdGVyaW5nID0gdHJ1ZVxuICBASW5wdXQoKSBjbGllbnRTaWRlU29ydGluZyA9IHRydWVcbiAgQElucHV0KCkgc29ydFN0YXRlczogRGF0YVNvcnREaXJlY3Rpb25bXSA9IFtEYXRhU29ydERpcmVjdGlvbi5BU0NFTkRJTkcsIERhdGFTb3J0RGlyZWN0aW9uLkRFU0NFTkRJTkddXG5cbiAgZGlzcGxheWVkUGFnZVNpemVzJDogT2JzZXJ2YWJsZTwobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXT5cbiAgX3BhZ2VTaXplcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdPihbMTAsIDI1LCA1MF0pXG4gIEBJbnB1dCgpXG4gIGdldCBwYWdlU2l6ZXMoKTogKG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10ge1xuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZXMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgcGFnZVNpemVzKHZhbHVlOiAobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXSkge1xuICAgIHRoaXMuX3BhZ2VTaXplcyQubmV4dCh2YWx1ZSlcbiAgfVxuICBkaXNwbGF5ZWRQYWdlU2l6ZSQ6IE9ic2VydmFibGU8bnVtYmVyPlxuICBfcGFnZVNpemUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiAgQElucHV0KClcbiAgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wYWdlU2l6ZSQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIEBJbnB1dCgpIGVtcHR5UmVzdWx0c01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBuYW1lID0gJydcbiAgQElucHV0KCkgZGVsZXRlUGVybWlzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdQZXJtaXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdFBlcm1pc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBkZWxldGVBY3Rpb25WaXNpYmxlRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBkZWxldGVBY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3QWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgdmlld0FjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGVkaXRBY3Rpb25WaXNpYmxlRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBlZGl0QWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgc2VsZWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgcGFnaW5hdG9yID0gdHJ1ZVxuICBASW5wdXQoKSBwYWdlID0gMFxuICBASW5wdXQoKVxuICBnZXQgdG90YWxSZWNvcmRzT25TZXJ2ZXIoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXNbJ3RvdGFsUmVjb3Jkc09uU2VydmVyJ10gPyBOdW1iZXIodGhpcy5wYXJhbXNbJ3RvdGFsUmVjb3Jkc09uU2VydmVyJ10pIDogdW5kZWZpbmVkXG4gIH1cbiAgc2V0IHRvdGFsUmVjb3Jkc09uU2VydmVyKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnBhcmFtc1sndG90YWxSZWNvcmRzT25TZXJ2ZXInXSA9IHZhbHVlPy50b1N0cmluZygpID8/ICcwJ1xuICB9XG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlU2hvd2luZ0tleSA9ICdPQ1hfREFUQV9UQUJMRS5TSE9XSU5HJ1xuICBASW5wdXQoKSBjdXJyZW50UGFnZVNob3dpbmdXaXRoVG90YWxPblNlcnZlcktleSA9ICdPQ1hfREFUQV9UQUJMRS5TSE9XSU5HX1dJVEhfVE9UQUxfT05fU0VSVkVSJ1xuICBwYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgY3VycmVudFBhZ2U6ICd7Y3VycmVudFBhZ2V9JyxcbiAgICB0b3RhbFBhZ2VzOiAne3RvdGFsUGFnZXN9JyxcbiAgICByb3dzOiAne3Jvd3N9JyxcbiAgICBmaXJzdDogJ3tmaXJzdH0nLFxuICAgIGxhc3Q6ICd7bGFzdH0nLFxuICAgIHRvdGFsUmVjb3JkczogJ3t0b3RhbFJlY29yZHN9JyxcbiAgfVxuXG4gIEBJbnB1dCgpIHN0cmluZ0NlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdzdHJpbmdDZWxsJykgc3RyaW5nQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9zdHJpbmdDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0cmluZ0NlbGxUZW1wbGF0ZSB8fCB0aGlzLnN0cmluZ0NlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBudW1iZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbnVtYmVyQ2VsbCcpIG51bWJlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfbnVtYmVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5udW1iZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5udW1iZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkQ2VsbFxuICAgKiBlLmcuIGZvciBhIGNvbHVtbiB3aXRoIHRoZSBpZCAnc3RhdHVzJyB1c2UgcFRlbXBsYXRlPVwic3RhdHVzSWRDZWxsXCJcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICAgIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgYW5kIGluc3RlYWQgdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBvZiBhIHNwZWNpZmljIGNvbHVtblxuICAgKiB1c2UgdGhlIG5ldyBhcHByb2FjaCBpbnN0ZWFkIGJ5IGZvbGxvd2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gY29sdW1uIGlkICsgSWRDZWxsXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZENlbGxcIlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZCgnY3VzdG9tQ2VsbCcpIGN1c3RvbUNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY3VzdG9tQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21DZWxsVGVtcGxhdGUgfHwgdGhpcy5jdXN0b21DZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgZGF0ZUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdkYXRlQ2VsbCcpIGRhdGVDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2RhdGVDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGVDZWxsVGVtcGxhdGUgfHwgdGhpcy5kYXRlQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIHJlbGF0aXZlRGF0ZUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdyZWxhdGl2ZURhdGVDZWxsJykgcmVsYXRpdmVEYXRlQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9yZWxhdGl2ZURhdGVDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlbGF0aXZlRGF0ZUNlbGxUZW1wbGF0ZSB8fCB0aGlzLnJlbGF0aXZlRGF0ZUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBjZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnY2VsbCcpIGNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jZWxsVGVtcGxhdGUgfHwgdGhpcy5jZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5Q2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3RyYW5zbGF0aW9uS2V5Q2VsbCcpIHRyYW5zbGF0aW9uS2V5Q2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF90cmFuc2xhdGlvbktleUNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25LZXlDZWxsVGVtcGxhdGUgfHwgdGhpcy50cmFuc2xhdGlvbktleUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgc3RyaW5nRmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3N0cmluZ0ZpbHRlckNlbGwnKSBzdHJpbmdGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3N0cmluZ0ZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nRmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMuc3RyaW5nRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSBudW1iZXJGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbnVtYmVyRmlsdGVyQ2VsbCcpIG51bWJlckZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfbnVtYmVyRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5udW1iZXJGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5udW1iZXJGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgYW5kIGluc3RlYWQgdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBvZiBhIHNwZWNpZmljIGNvbHVtbiBmaWx0ZXJcbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkRmlsdGVyQ2VsbFxuICAgKiBlLmcuIGZvciBhIGNvbHVtbiB3aXRoIHRoZSBpZCAnc3RhdHVzJyB1c2UgcFRlbXBsYXRlPVwic3RhdHVzSWRGaWx0ZXJDZWxsXCJcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbUZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW4gZmlsdGVyXG4gICAqIHVzZSB0aGUgbmV3IGFwcHJvYWNoIGluc3RlYWQgYnkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiBjb2x1bW4gaWQgKyBJZEZpbHRlckNlbGxcbiAgICogZS5nLiBmb3IgYSBjb2x1bW4gd2l0aCB0aGUgaWQgJ3N0YXR1cycgdXNlIHBUZW1wbGF0ZT1cInN0YXR1c0lkRmlsdGVyQ2VsbFwiXG4gICAqL1xuICBAQ29udGVudENoaWxkKCdjdXN0b21GaWx0ZXJDZWxsJykgY3VzdG9tRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9jdXN0b21GaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbUZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLmN1c3RvbUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgZGF0ZUZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdkYXRlRmlsdGVyQ2VsbCcpIGRhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2RhdGVGaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGVGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5kYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSByZWxhdGl2ZURhdGVGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgncmVsYXRpdmVEYXRlRmlsdGVyQ2VsbCcpIHJlbGF0aXZlRGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfcmVsYXRpdmVEYXRlRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIGZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdmaWx0ZXJDZWxsJykgZmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9maWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLmZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgdHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgndHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsJykgdHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbktleUZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLnRyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIF9hZGRpdGlvbmFsQWN0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFBY3Rpb25bXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBhZGRpdGlvbmFsQWN0aW9ucygpOiBEYXRhQWN0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBhZGRpdGlvbmFsQWN0aW9ucyh2YWx1ZTogRGF0YUFjdGlvbltdKSB7XG4gICAgdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLm5leHQodmFsdWUpXG4gIH1cbiAgQElucHV0KCkgZnJvemVuQWN0aW9uQ29sdW1uID0gZmFsc2VcbiAgQElucHV0KCkgYWN0aW9uQ29sdW1uUG9zaXRpb246ICdsZWZ0JyB8ICdyaWdodCcgPSAncmlnaHQnXG5cbiAgQE91dHB1dCgpIGZpbHRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJbXT4oKVxuICBAT3V0cHV0KCkgc29ydGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb3J0PigpXG4gIEBPdXRwdXQoKSB2aWV3VGFibGVSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFJvdz4oKVxuICBAT3V0cHV0KCkgZWRpdFRhYmxlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3c+KClcbiAgQE91dHB1dCgpIGRlbGV0ZVRhYmxlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3c+KClcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJvd1tdPigpXG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpXG5cbiAgZGlzcGxheWVkUm93cyQ6IE9ic2VydmFibGU8dW5rbm93bltdPiB8IHVuZGVmaW5lZFxuICBzZWxlY3RlZFJvd3MkOiBPYnNlcnZhYmxlPHVua25vd25bXT4gfCB1bmRlZmluZWRcblxuICBjdXJyZW50RmlsdGVyQ29sdW1uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0YVRhYmxlQ29sdW1uIHwgbnVsbD4obnVsbClcbiAgY3VycmVudEZpbHRlck9wdGlvbnMkOiBPYnNlcnZhYmxlPFNlbGVjdEl0ZW1bXT4gfCB1bmRlZmluZWRcbiAgY3VycmVudFNlbGVjdGVkRmlsdGVycyQ6IE9ic2VydmFibGU8c3RyaW5nW10+IHwgdW5kZWZpbmVkXG4gIGZpbHRlckFtb3VudHMkOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHwgdW5kZWZpbmVkXG5cbiAgb3ZlcmZsb3dBY3Rpb25zJDogT2JzZXJ2YWJsZTxEYXRhQWN0aW9uW10+XG4gIGlubGluZUFjdGlvbnMkOiBPYnNlcnZhYmxlPERhdGFBY3Rpb25bXT5cbiAgb3ZlcmZsb3dNZW51SXRlbXMkOiBPYnNlcnZhYmxlPE1lbnVJdGVtW10+XG4gIGN1cnJlbnRNZW51Um93JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Um93IHwgbnVsbD4obnVsbClcblxuICB0ZW1wbGF0ZXMkOiBCZWhhdmlvclN1YmplY3Q8UXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKVxuICBAQ29udGVudENoaWxkcmVuKFByaW1lVGVtcGxhdGUpXG4gIHNldCB0ZW1wbGF0ZXModmFsdWU6IFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMudGVtcGxhdGVzJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgdmlld1RlbXBsYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpXG4gIEBWaWV3Q2hpbGRyZW4oUHJpbWVUZW1wbGF0ZSlcbiAgc2V0IHZpZXdUZW1wbGF0ZXModmFsdWU6IFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMudmlld1RlbXBsYXRlcyQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIHBhcmVudFRlbXBsYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZClcbiAgQElucHV0KClcbiAgc2V0IHBhcmVudFRlbXBsYXRlcyh2YWx1ZTogUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucGFyZW50VGVtcGxhdGVzJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgZ2V0IHZpZXdUYWJsZVJvd09ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LnZpZXdJdGVtT2JzZXJ2ZWQgfHwgZHY/LnZpZXdJdGVtLm9ic2VydmVkIHx8IHRoaXMudmlld1RhYmxlUm93Lm9ic2VydmVkXG4gIH1cbiAgZ2V0IGVkaXRUYWJsZVJvd09ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LmVkaXRJdGVtT2JzZXJ2ZWQgfHwgZHY/LmVkaXRJdGVtLm9ic2VydmVkIHx8IHRoaXMuZWRpdFRhYmxlUm93Lm9ic2VydmVkXG4gIH1cbiAgZ2V0IGRlbGV0ZVRhYmxlUm93T2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uZGVsZXRlSXRlbU9ic2VydmVkIHx8IGR2Py5kZWxldGVJdGVtLm9ic2VydmVkIHx8IHRoaXMuZGVsZXRlVGFibGVSb3cub2JzZXJ2ZWRcbiAgfVxuICBnZXQgYW55Um93QWN0aW9uT2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlld1RhYmxlUm93T2JzZXJ2ZWQgfHwgdGhpcy5lZGl0VGFibGVSb3dPYnNlcnZlZCB8fCB0aGlzLmRlbGV0ZVRhYmxlUm93T2JzZXJ2ZWRcbiAgfVxuXG4gIGdldCBzZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uc2VsZWN0aW9uQ2hhbmdlZE9ic2VydmVkIHx8IGR2Py5zZWxlY3Rpb25DaGFuZ2VkLm9ic2VydmVkIHx8IHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5vYnNlcnZlZFxuICB9XG5cbiAgdGVtcGxhdGVzT2JzZXJ2YWJsZXM6IFJlY29yZDxzdHJpbmcsIE9ic2VydmFibGU8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+PiA9IHt9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChMT0NBTEVfSUQpIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZVxuICApIHtcbiAgICBzdXBlcihsb2NhbGUsIHRyYW5zbGF0ZVNlcnZpY2UpXG4gICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lIHx8IHRoaXMucm91dGVyLnVybC5yZXBsYWNlKC9bXkEtWmEtejAtOV0vLCAnXycpXG4gICAgdGhpcy5kaXNwbGF5ZWRQYWdlU2l6ZXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fcGFnZVNpemVzJCwgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCgnT0NYX0RBVEFfVEFCTEUuQUxMJyldKS5waXBlKFxuICAgICAgbWFwKChbcGFnZVNpemVzLCB0cmFuc2xhdGlvbl0pID0+IHBhZ2VTaXplcy5jb25jYXQoeyBzaG93QWxsOiB0cmFuc2xhdGlvbiB9KSlcbiAgICApXG4gICAgdGhpcy5kaXNwbGF5ZWRQYWdlU2l6ZSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9wYWdlU2l6ZSQsIHRoaXMuX3BhZ2VTaXplcyRdKS5waXBlKFxuICAgICAgbWFwKChbcGFnZVNpemUsIHBhZ2VTaXplc10pID0+IHBhZ2VTaXplID8/IHBhZ2VTaXplcy5maW5kKCh2YWwpOiB2YWwgaXMgbnVtYmVyID0+IHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSA/PyA1MClcbiAgICApXG4gICAgdGhpcy5vdmVyZmxvd0FjdGlvbnMkID0gdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKGFjdGlvbnMpID0+IGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbi5zaG93QXNPdmVyZmxvdykpXG4gICAgKVxuICAgIHRoaXMuaW5saW5lQWN0aW9ucyQgPSB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQucGlwZShcbiAgICAgIG1hcCgoYWN0aW9ucykgPT4gYWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gIWFjdGlvbi5zaG93QXNPdmVyZmxvdykpXG4gICAgKVxuICAgIHRoaXMub3ZlcmZsb3dNZW51SXRlbXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5vdmVyZmxvd0FjdGlvbnMkLCB0aGlzLmN1cnJlbnRNZW51Um93JF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW2FjdGlvbnMsIHJvd10pID0+XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoWy4uLmFjdGlvbnMubWFwKChhKSA9PiBhLmxhYmVsS2V5IHx8ICcnKV0pLnBpcGUoXG4gICAgICAgICAgbWFwKCh0cmFuc2xhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb25zXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGEpID0+IHRoaXMudXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbihhLnBlcm1pc3Npb24pKVxuICAgICAgICAgICAgICAubWFwKChhKSA9PiAoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiB0cmFuc2xhdGlvbnNbYS5sYWJlbEtleSB8fCAnJ10sXG4gICAgICAgICAgICAgICAgaWNvbjogYS5pY29uLFxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M6IChhLmNsYXNzZXMgfHwgW10pLmpvaW4oJyAnKSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogYS5kaXNhYmxlZCB8fCAoISFhLmFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhdGhpcy5maWVsZElzVHJ1dGh5KHJvdywgYS5hY3Rpb25FbmFibGVkRmllbGQpKSxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAhYS5hY3Rpb25WaXNpYmxlRmllbGQgfHwgdGhpcy5maWVsZElzVHJ1dGh5KHJvdywgYS5hY3Rpb25WaXNpYmxlRmllbGQpLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IGEuY2FsbGJhY2socm93KSxcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkUm93cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yb3dzJCwgdGhpcy5fZmlsdGVycyQsIHRoaXMuX3NvcnRDb2x1bW4kLCB0aGlzLl9zb3J0RGlyZWN0aW9uJF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgocGFyYW1zKSA9PiB0aGlzLnRyYW5zbGF0ZUl0ZW1zKHBhcmFtcywgdGhpcy5jb2x1bW5zLCB0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgocGFyYW1zKSA9PiB0aGlzLmZpbHRlckl0ZW1zKHBhcmFtcywgdGhpcy5jbGllbnRTaWRlRmlsdGVyaW5nKSksXG4gICAgICBtYXAoKHBhcmFtcykgPT4gdGhpcy5zb3J0SXRlbXMocGFyYW1zLCB0aGlzLmNvbHVtbnMsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgoW3Jvd3NdKSA9PiB0aGlzLmZsYXR0ZW5JdGVtcyhyb3dzKSlcbiAgICApXG4gICAgdGhpcy5jdXJyZW50U2VsZWN0ZWRGaWx0ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2ZpbHRlcnMkLCB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kXSkucGlwZShcbiAgICAgIG1hcCgoW2ZpbHRlcnMsIGN1cnJlbnRGaWx0ZXJDb2x1bW5dKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgPT09IGN1cnJlbnRGaWx0ZXJDb2x1bW4/LmlkKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLnZhbHVlKVxuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5jdXJyZW50RmlsdGVyT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yb3dzJCwgdGhpcy5jdXJyZW50RmlsdGVyQ29sdW1uJCwgdGhpcy5fZmlsdGVycyRdKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKFtyb3dzLCBjdXJyZW50RmlsdGVyQ29sdW1uLCBmaWx0ZXJzXSkgPT4ge1xuICAgICAgICBpZiAoIWN1cnJlbnRGaWx0ZXJDb2x1bW4/LmlkKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKFtdKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXJzID0gZmlsdGVyc1xuICAgICAgICAgIC5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkID09PSBjdXJyZW50RmlsdGVyQ29sdW1uPy5pZClcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcblxuICAgICAgICBjb25zdCBjb2x1bW5WYWx1ZXMgPSByb3dzLm1hcCgocm93KSA9PiByb3dbY3VycmVudEZpbHRlckNvbHVtbj8uaWRdKVxuICAgICAgICBjb25zdCB0cmFuc2xhdGVPYnNlcnZhYmxlID1cbiAgICAgICAgICB0aGlzLmNvbHVtbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gY3VycmVudEZpbHRlckNvbHVtbj8uaWQpPy5jb2x1bW5UeXBlID09PSBDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWVxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KGNvbHVtblZhbHVlcyBhcyBzdHJpbmdbXSlcbiAgICAgICAgICAgIDogb2YoT2JqZWN0LmZyb21FbnRyaWVzKGNvbHVtblZhbHVlcy5tYXAoKGN2KSA9PiBbY3YsIGN2XSkpKVxuICAgICAgICByZXR1cm4gdHJhbnNsYXRlT2JzZXJ2YWJsZS5waXBlKFxuICAgICAgICAgIG1hcCgodHJhbnNsYXRlZFZhbHVlcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModHJhbnNsYXRlZFZhbHVlcylcbiAgICAgICAgICAgICAgLmNvbmNhdChjdXJyZW50RmlsdGVycylcbiAgICAgICAgICAgICAgLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleCAmJiB2YWx1ZSAhPSBudWxsKVxuICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIChmaWx0ZXJPcHRpb24pID0+XG4gICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZmlsdGVyT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgfSkgYXMgU2VsZWN0SXRlbVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5maWx0ZXJBbW91bnRzJCA9IHRoaXMuX2ZpbHRlcnMkLnBpcGUoXG4gICAgICBtYXAoKGZpbHRlcnMpID0+XG4gICAgICAgIGZpbHRlcnNcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZClcbiAgICAgICAgICAubWFwKChjb2x1bW5JZCkgPT4gW2NvbHVtbklkLCBmaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgPT09IGNvbHVtbklkKS5sZW5ndGhdKVxuICAgICAgKSxcbiAgICAgIG1hcCgoYW1vdW50cykgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGFtb3VudHMpKVxuICAgIClcbiAgICB0aGlzLm1hcFNlbGVjdGlvblRvUm93cygpXG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZXM/LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHN3aXRjaCAoaXRlbS5nZXRUeXBlKCkpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nQ2VsbCc6XG4gICAgICAgICAgdGhpcy5zdHJpbmdDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdudW1iZXJDZWxsJzpcbiAgICAgICAgICB0aGlzLm51bWJlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2N1c3RvbUNlbGwnOlxuICAgICAgICAgIHRoaXMuY3VzdG9tQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZGF0ZUNlbGwnOlxuICAgICAgICAgIHRoaXMuZGF0ZUNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JlbGF0aXZlRGF0ZUNlbGwnOlxuICAgICAgICAgIHRoaXMucmVsYXRpdmVEYXRlQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnY2VsbFRlbXBsYXRlJzpcbiAgICAgICAgICB0aGlzLmNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3RyYW5zbGF0aW9uS2V5Q2VsbCc6XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGlvbktleUNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3N0cmluZ0ZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMuc3RyaW5nRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnbnVtYmVyRmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy5udW1iZXJGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdjdXN0b21GaWx0ZXJDZWxsJzpcbiAgICAgICAgICB0aGlzLmN1c3RvbUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2RhdGVGaWx0ZXJDZWxsJzpcbiAgICAgICAgICB0aGlzLmRhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdyZWxhdGl2ZURhdGVGaWx0ZXJDZWxsJzpcbiAgICAgICAgICB0aGlzLnJlbGF0aXZlRGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2ZpbHRlckNlbGxUZW1wbGF0ZSc6XG4gICAgICAgICAgdGhpcy5maWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICd0cmFuc2xhdGlvbktleUZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBvblNvcnRDb2x1bW5DbGljayhzb3J0Q29sdW1uOiBzdHJpbmcpIHtcbiAgICBjb25zdCBuZXdTb3J0RGlyZWN0aW9uID0gdGhpcy5jb2x1bW5OZXh0U29ydERpcmVjdGlvbihzb3J0Q29sdW1uKVxuXG4gICAgdGhpcy5fc29ydENvbHVtbiQubmV4dChzb3J0Q29sdW1uKVxuICAgIHRoaXMuX3NvcnREaXJlY3Rpb24kLm5leHQobmV3U29ydERpcmVjdGlvbilcblxuICAgIHRoaXMuc29ydGVkLmVtaXQoeyBzb3J0Q29sdW1uOiBzb3J0Q29sdW1uLCBzb3J0RGlyZWN0aW9uOiBuZXdTb3J0RGlyZWN0aW9uIH0pXG4gIH1cblxuICBjb2x1bW5OZXh0U29ydERpcmVjdGlvbihzb3J0Q29sdW1uOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc29ydENvbHVtbiAhPT0gdGhpcy5zb3J0Q29sdW1uXG4gICAgICA/IHRoaXMuc29ydFN0YXRlc1swXVxuICAgICAgOiB0aGlzLnNvcnRTdGF0ZXNbKHRoaXMuc29ydFN0YXRlcy5pbmRleE9mKHRoaXMuc29ydERpcmVjdGlvbikgKyAxKSAlIHRoaXMuc29ydFN0YXRlcy5sZW5ndGhdXG4gIH1cblxuICBvbkRlbGV0ZVJvdyhzZWxlY3RlZFRhYmxlUm93OiBSb3cpIHtcbiAgICB0aGlzLmRlbGV0ZVRhYmxlUm93LmVtaXQoc2VsZWN0ZWRUYWJsZVJvdylcbiAgfVxuXG4gIG9uVmlld1JvdyhzZWxlY3RlZFRhYmxlUm93OiBSb3cpIHtcbiAgICB0aGlzLnZpZXdUYWJsZVJvdy5lbWl0KHNlbGVjdGVkVGFibGVSb3cpXG4gIH1cblxuICBvbkVkaXRSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy5lZGl0VGFibGVSb3cuZW1pdChzZWxlY3RlZFRhYmxlUm93KVxuICB9XG5cbiAgb25GaWx0ZXJDbGljayhjb2x1bW46IERhdGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMuY3VycmVudEZpbHRlckNvbHVtbiQubmV4dChjb2x1bW4pXG4gIH1cblxuICBvbkZpbHRlckNoYW5nZShjb2x1bW46IERhdGFUYWJsZUNvbHVtbiwgZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLmZpbHRlcnNcbiAgICAgIC5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkICE9PSBjb2x1bW4uaWQpXG4gICAgICAuY29uY2F0KFxuICAgICAgICBldmVudC52YWx1ZS5tYXAoKHZhbHVlOiBQcmltaXRpdmUpID0+ICh7XG4gICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbi5pZCxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfSkpXG4gICAgICApXG4gICAgaWYgKHRoaXMuY2xpZW50U2lkZUZpbHRlcmluZykge1xuICAgICAgdGhpcy5maWx0ZXJzID0gZmlsdGVyc1xuICAgIH1cbiAgICB0aGlzLmZpbHRlcmVkLmVtaXQoZmlsdGVycylcbiAgICB0aGlzLnJlc2V0UGFnZSgpXG4gIH1cblxuICBnZXRTZWxlY3RlZEZpbHRlcnMoY29sdW1uSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgPT09IGNvbHVtbklkKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLnZhbHVlKVxuICB9XG5cbiAgc29ydEljb25UaXRsZShzb3J0Q29sdW1uOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uVG9UaXRsZShcbiAgICAgIHNvcnRDb2x1bW4gIT09IHRoaXMuc29ydERpcmVjdGlvblxuICAgICAgICA/IERhdGFTb3J0RGlyZWN0aW9uLk5PTkVcbiAgICAgICAgOiB0aGlzLnNvcnRTdGF0ZXNbdGhpcy5zb3J0U3RhdGVzLmluZGV4T2YodGhpcy5zb3J0RGlyZWN0aW9uKSAlIHRoaXMuc29ydFN0YXRlcy5sZW5ndGhdXG4gICAgKVxuICB9XG5cbiAgc29ydERpcmVjdGlvblRvVGl0bGUoc29ydERpcmVjdGlvbjogRGF0YVNvcnREaXJlY3Rpb24pIHtcbiAgICBzd2l0Y2ggKHNvcnREaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgRGF0YVNvcnREaXJlY3Rpb24uQVNDRU5ESU5HOlxuICAgICAgICByZXR1cm4gJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uQVNDRU5ESU5HX1RJVExFJ1xuICAgICAgY2FzZSBEYXRhU29ydERpcmVjdGlvbi5ERVNDRU5ESU5HOlxuICAgICAgICByZXR1cm4gJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uREVTQ0VORElOR19USVRMRSdcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnT0NYX0RBVEFfVEFCTEUuVE9HR0xFX0JVVFRPTi5ERUZBVUxUX1RJVExFJ1xuICAgIH1cbiAgfVxuXG4gIG1hcFNlbGVjdGlvblRvUm93cygpIHtcbiAgICB0aGlzLnNlbGVjdGVkUm93cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9zZWxlY3Rpb24kLCB0aGlzLl9yb3dzJF0pLnBpcGUoXG4gICAgICBtYXAoKFtzZWxlY3RlZFJvd3MsIHJvd3NdKSA9PiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZFJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgICByZXR1cm4gcm93cy5maW5kKChyKSA9PiByLmlkID09PSByb3cuaWQpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBSb3dbXSkge1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KGV2ZW50KVxuICB9XG5cbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBwYWdlID0gZXZlbnQuZmlyc3QgLyBldmVudC5yb3dzXG4gICAgdGhpcy5wYWdlID0gcGFnZVxuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdChwYWdlKVxuICB9XG5cbiAgcmVzZXRQYWdlKCkge1xuICAgIHRoaXMucGFnZSA9IDBcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQodGhpcy5wYWdlKVxuICB9XG5cbiAgZmllbGRJc1RydXRoeShvYmplY3Q6IGFueSwga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gISFPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKG9iamVjdCwga2V5KVxuICB9XG5cbiAgdG9nZ2xlT3ZlcmZsb3dNZW51KGV2ZW50OiBNb3VzZUV2ZW50LCBtZW51OiBNZW51LCByb3c6IFJvdykge1xuICAgIHRoaXMuY3VycmVudE1lbnVSb3ckLm5leHQocm93KVxuICAgIG1lbnUudG9nZ2xlKGV2ZW50KVxuICB9XG5cbiAgaGFzVmlzaWJsZU92ZXJmbG93TWVudUl0ZW1zKHJvdzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMub3ZlcmZsb3dBY3Rpb25zJC5waXBlKFxuICAgICAgbWFwKChhY3Rpb25zKSA9PlxuICAgICAgICBhY3Rpb25zLnNvbWUoXG4gICAgICAgICAgKGEpID0+XG4gICAgICAgICAgICAhYS5hY3Rpb25WaXNpYmxlRmllbGQgfHxcbiAgICAgICAgICAgICh0aGlzLmZpZWxkSXNUcnV0aHkocm93LCBhLmFjdGlvblZpc2libGVGaWVsZCkgJiYgdGhpcy51c2VyU2VydmljZS5oYXNQZXJtaXNzaW9uKGEucGVybWlzc2lvbikpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIH1cblxuICBpc0RhdGUodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCBkID0gbmV3IERhdGUodmFsdWUpXG4gICAgcmV0dXJuIGlzVmFsaWREYXRlKGQpXG4gIH1cblxuICBjZWxsVGVtcGxhdGVzRGF0YTogVGVtcGxhdGVzRGF0YSA9IHtcbiAgICB0ZW1wbGF0ZXNPYnNlcnZhYmxlczoge30sXG4gICAgaWRTdWZmaXg6IFsnSWRUYWJsZUNlbGwnLCAnSWRDZWxsJ10sXG4gICAgdGVtcGxhdGVOYW1lczoge1xuICAgICAgW0NvbHVtblR5cGUuREFURV06IFsnZGF0ZUNlbGwnLCAnZGF0ZVRhYmxlQ2VsbCcsICdkZWZhdWx0RGF0ZUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLk5VTUJFUl06IFsnbnVtYmVyQ2VsbCcsICdudW1iZXJUYWJsZUNlbGwnLCAnZGVmYXVsdE51bWJlckNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEVdOiBbJ3JlbGF0aXZlRGF0ZUNlbGwnLCAncmVsYXRpdmVEYXRlVGFibGVDZWxsJywgJ2RlZmF1bHRSZWxhdGl2ZURhdGVDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVldOiBbJ3RyYW5zbGF0aW9uS2V5Q2VsbCcsICd0cmFuc2xhdGlvbktleVRhYmxlQ2VsbCcsICdkZWZhdWx0VHJhbnNsYXRpb25LZXlDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5DVVNUT01dOiBbJ2N1c3RvbUNlbGwnLCAnY3VzdG9tVGFibGVDZWxsJywgJ2RlZmF1bHRDdXN0b21DZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5TVFJJTkddOiBbJ3N0cmluZ0NlbGwnLCAnc3RyaW5nVGFibGVDZWxsJywgJ2RlZmF1bHRTdHJpbmdDZWxsJ10sXG4gICAgfSxcbiAgfVxuXG4gIGZpbHRlclRlbXBsYXRlc0RhdGE6IFRlbXBsYXRlc0RhdGEgPSB7XG4gICAgdGVtcGxhdGVzT2JzZXJ2YWJsZXM6IHt9LFxuICAgIGlkU3VmZml4OiBbJ0lkVGFibGVGaWx0ZXJDZWxsJywgJ0lkRmlsdGVyQ2VsbCddLFxuICAgIHRlbXBsYXRlTmFtZXM6IHtcbiAgICAgIFtDb2x1bW5UeXBlLkRBVEVdOiBbJ2RhdGVGaWx0ZXJDZWxsJywgJ2RhdGVUYWJsZUZpbHRlckNlbGwnLCAnZGVmYXVsdERhdGVDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5OVU1CRVJdOiBbJ251bWJlckZpbHRlckNlbGwnLCAnbnVtYmVyVGFibGVGaWx0ZXJDZWxsJywgJ2RlZmF1bHROdW1iZXJDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5SRUxBVElWRV9EQVRFXTogWydyZWxhdGl2ZURhdGVGaWx0ZXJDZWxsJywgJ3JlbGF0aXZlRGF0ZVRhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0UmVsYXRpdmVEYXRlQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZXTogW1xuICAgICAgICAndHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsJyxcbiAgICAgICAgJ3RyYW5zbGF0aW9uS2V5VGFibGVGaWx0ZXJDZWxsJyxcbiAgICAgICAgJ2RlZmF1bHRUcmFuc2xhdGlvbktleUNlbGwnLFxuICAgICAgXSxcbiAgICAgIFtDb2x1bW5UeXBlLkNVU1RPTV06IFsnY3VzdG9tRmlsdGVyQ2VsbCcsICdjdXN0b21UYWJsZUZpbHRlckNlbGwnLCAnZGVmYXVsdEN1c3RvbUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlNUUklOR106IFsnc3RyaW5nRmlsdGVyQ2VsbCcsICdzdHJpbmdUYWJsZUZpbHRlckNlbGwnLCAnZGVmYXVsdFN0cmluZ0NlbGwnXSxcbiAgICB9LFxuICB9XG5cbiAgdGVtcGxhdGVzRGF0YU1hcDogUmVjb3JkPFRlbXBsYXRlVHlwZSwgVGVtcGxhdGVzRGF0YT4gPSB7XG4gICAgW1RlbXBsYXRlVHlwZS5DRUxMXTogdGhpcy5jZWxsVGVtcGxhdGVzRGF0YSxcbiAgICBbVGVtcGxhdGVUeXBlLkZJTFRFUkNFTExdOiB0aGlzLmZpbHRlclRlbXBsYXRlc0RhdGEsXG4gIH1cblxuICBmaW5kVGVtcGxhdGUodGVtcGxhdGVzOiBQcmltZVRlbXBsYXRlW10sIG5hbWVzOiBzdHJpbmdbXSk6IFByaW1lVGVtcGxhdGUgfCB1bmRlZmluZWQge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBuYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBuYW1lc1tpbmRleF1cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVzLmZpbmQoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5uYW1lID09PSBuYW1lKVxuICAgICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBnZXRDb2x1bW5UeXBlVGVtcGxhdGUodGVtcGxhdGVzOiBQcmltZVRlbXBsYXRlW10sIGNvbHVtblR5cGU6IENvbHVtblR5cGUsIHRlbXBsYXRlVHlwZTogVGVtcGxhdGVUeXBlKSB7XG4gICAgbGV0IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG5cbiAgICBzd2l0Y2ggKHRlbXBsYXRlVHlwZSkge1xuICAgICAgY2FzZSBUZW1wbGF0ZVR5cGUuQ0VMTDpcbiAgICAgICAgc3dpdGNoIChjb2x1bW5UeXBlKSB7XG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLkRBVEU6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX2RhdGVDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5OVU1CRVI6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX251bWJlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEU6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3JlbGF0aXZlRGF0ZUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fdHJhbnNsYXRpb25LZXlDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5DVVNUT006XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX2N1c3RvbUNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fc3RyaW5nQ2VsbFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFRlbXBsYXRlVHlwZS5GSUxURVJDRUxMOlxuICAgICAgICBzd2l0Y2ggKGNvbHVtblR5cGUpIHtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fZGF0ZUZpbHRlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLk5VTUJFUjpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fbnVtYmVyRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuUkVMQVRJVkVfREFURTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fcmVsYXRpdmVEYXRlRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl90cmFuc2xhdGlvbktleUZpbHRlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLkNVU1RPTTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fY3VzdG9tRmlsdGVyQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9zdHJpbmdGaWx0ZXJDZWxsXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGVtcGxhdGUgPz9cbiAgICAgIHRoaXMuZmluZFRlbXBsYXRlKHRlbXBsYXRlcywgdGhpcy50ZW1wbGF0ZXNEYXRhTWFwW3RlbXBsYXRlVHlwZV0udGVtcGxhdGVOYW1lc1tjb2x1bW5UeXBlXSk/LnRlbXBsYXRlID8/XG4gICAgICBudWxsXG4gICAgKVxuICB9XG5cbiAgZ2V0VGVtcGxhdGUoY29sdW1uOiBEYXRhVGFibGVDb2x1bW4sIHRlbXBsYXRlVHlwZTogVGVtcGxhdGVUeXBlKTogT2JzZXJ2YWJsZTxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRlbXBsYXRlc0RhdGEgPSB0aGlzLnRlbXBsYXRlc0RhdGFNYXBbdGVtcGxhdGVUeXBlXVxuXG4gICAgaWYgKCF0ZW1wbGF0ZXNEYXRhLnRlbXBsYXRlc09ic2VydmFibGVzW2NvbHVtbi5pZF0pIHtcbiAgICAgIHRlbXBsYXRlc0RhdGEudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXSA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLnRlbXBsYXRlcyQsXG4gICAgICAgIHRoaXMudmlld1RlbXBsYXRlcyQsXG4gICAgICAgIHRoaXMucGFyZW50VGVtcGxhdGVzJCxcbiAgICAgIF0pLnBpcGUoXG4gICAgICAgIG1hcCgoW3QsIHZ0LCBwdF0pID0+IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBbLi4uKHQgPz8gW10pLCAuLi4odnQgPz8gW10pLCAuLi4ocHQgPz8gW10pXVxuICAgICAgICAgIGNvbnN0IGNvbHVtblRlbXBsYXRlID0gdGhpcy5maW5kVGVtcGxhdGUoXG4gICAgICAgICAgICB0ZW1wbGF0ZXMsXG4gICAgICAgICAgICB0ZW1wbGF0ZXNEYXRhLmlkU3VmZml4Lm1hcCgoc3VmZml4KSA9PiBjb2x1bW4uaWQgKyBzdWZmaXgpXG4gICAgICAgICAgKT8udGVtcGxhdGVcbiAgICAgICAgICBpZiAoY29sdW1uVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2x1bW5UZW1wbGF0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5UeXBlVGVtcGxhdGUodGVtcGxhdGVzLCBjb2x1bW4uY29sdW1uVHlwZSwgdGVtcGxhdGVUeXBlKVxuICAgICAgICB9KSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwKVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGVzRGF0YS50ZW1wbGF0ZXNPYnNlcnZhYmxlc1tjb2x1bW4uaWRdXG4gIH1cblxuICByZXNvbHZlRmllbGREYXRhKG9iamVjdDogYW55LCBrZXk6IGFueSkge1xuICAgIHJldHVybiBPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKG9iamVjdCwga2V5KVxuICB9XG5cbiAgZ2V0Um93T2JqZWN0RnJvbU11bHRpc2VsZWN0SXRlbSh2YWx1ZTogTXVsdGlTZWxlY3RJdGVtLCBjb2x1bW46IERhdGFUYWJsZUNvbHVtbikge1xuICAgIHJldHVybiB7XG4gICAgICBbY29sdW1uLmlkXTogdmFsdWUubGFiZWwsXG4gICAgfVxuICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI2FjdGlvbkNvbHVtbiBsZXQtcm93T2JqZWN0PVwibG9jYWxSb3dPYmplY3RcIj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiYW55Um93QWN0aW9uT2JzZXJ2ZWQgfHwgdGhpcy5hZGRpdGlvbmFsQWN0aW9ucy5sZW5ndGggPiAwIHx8ICgodGhpcy5vdmVyZmxvd0FjdGlvbnMkIHwgYXN5bmMpID8/IFtdKS5sZW5ndGggPiAwXCJcbiAgPlxuICAgIDx0ZFxuICAgICAgY2xhc3M9XCJhY3Rpb25zXCJcbiAgICAgIHBGcm96ZW5Db2x1bW5cbiAgICAgIFtmcm96ZW5dPVwiZnJvemVuQWN0aW9uQ29sdW1uXCJcbiAgICAgIFthbGlnbkZyb3plbl09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvblwiXG4gICAgICBbYXR0ci5uYW1lXT1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcgPyAnYWN0aW9uLWNvbHVtbi1sZWZ0JyA6ICdhY3Rpb24tY29sdW1uLXJpZ2h0J1wiXG4gICAgICBbbmdDbGFzc109XCIoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcpID8gJ2JvcmRlci1yaWdodC0xJyA6IChmcm96ZW5BY3Rpb25Db2x1bW4gJiYgYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCcpID8gJ2JvcmRlci1sZWZ0LTEnIDogJydcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWJ1dHRvbi1yb3ctd3JhcHBlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJ2aWV3VGFibGVSb3dPYnNlcnZlZCAmJiAoIXZpZXdBY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShyb3dPYmplY3QsIHZpZXdBY3Rpb25WaXNpYmxlRmllbGQpKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwidmlld1Blcm1pc3Npb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhdmlld0FjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIHZpZXdBY3Rpb25FbmFibGVkRmllbGQpXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHZpZXdUYWJsZVJvd0J1dHRvblwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLlZJRVcnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuVklFVycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLWV5ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25WaWV3Um93KHJvd09iamVjdClcIlxuICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS10YWJsZS1hY3Rpb24tYnV0dG9uJ1wiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiZWRpdFRhYmxlUm93T2JzZXJ2ZWQgJiYgKCFlZGl0QWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBlZGl0QWN0aW9uVmlzaWJsZUZpZWxkKSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm9jeElmUGVybWlzc2lvbj1cImVkaXRQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIWVkaXRBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBlZGl0QWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBlZGl0VGFibGVSb3dCdXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5FRElUJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkVESVQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1wZW5jaWxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdFJvdyhyb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtdGFibGUtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImRlbGV0ZVRhYmxlUm93T2JzZXJ2ZWQgJiYgKCFkZWxldGVBY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGRlbGV0ZUFjdGlvblZpc2libGVGaWVsZCkpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJkZWxldGVQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIWRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIGRlbGV0ZVRhYmxlUm93QnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuREVMRVRFJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkRFTEVURScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZVJvdyhyb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtdGFibGUtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBpbmxpbmVBY3Rpb25zJCB8IGFzeW5jXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIighYWN0aW9uLmFjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgYWN0aW9uLmFjdGlvblZpc2libGVGaWVsZCkpXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJhY3Rpb24ucGVybWlzc2lvblwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3Rpb24uY2xhc3Nlc1wiXG4gICAgICAgICAgICAgIFtpY29uXT1cImFjdGlvbi5pY29uIHx8ICcnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbi5jYWxsYmFjayhyb3dPYmplY3QpXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImFjdGlvbi5sYWJlbEtleSA/IChhY3Rpb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFjdGlvbi5sYWJlbEtleSA/IChhY3Rpb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWN0aW9uLmRpc2FibGVkIHx8ICghIWFjdGlvbi5hY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBhY3Rpb24uYWN0aW9uRW5hYmxlZEZpZWxkKSlcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1Zpc2libGVPdmVyZmxvd01lbnVJdGVtcyhyb3dPYmplY3QpIHwgYXN5bmNcIj5cbiAgICAgICAgICA8cC1tZW51ICNtZW51IFttb2RlbF09XCIob3ZlcmZsb3dNZW51SXRlbXMkIHwgYXN5bmMpIHx8IFtdXCIgW3BvcHVwXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIj48L3AtbWVudT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICBbaWNvbl09XCIncGkgcGktZWxsaXBzaXMtdidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU92ZXJmbG93TWVudSgkZXZlbnQsIG1lbnUsIHJvd09iamVjdClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuTU9SRV9BQ1RJT05TJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ09DWF9EQVRBX1RBQkxFLk1PUkVfQUNUSU9OUycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RkPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYWN0aW9uQ29sdW1uSGVhZGVyPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJhbnlSb3dBY3Rpb25PYnNlcnZlZCB8fCB0aGlzLmFkZGl0aW9uYWxBY3Rpb25zLmxlbmd0aCA+IDAgIHx8ICgodGhpcy5vdmVyZmxvd0FjdGlvbnMkIHwgYXN5bmMpID8/IFtdKS5sZW5ndGggPiAwXCJcbiAgPlxuICAgIDx0aFxuICAgICAgcEZyb3plbkNvbHVtblxuICAgICAgW2Zyb3plbl09XCJmcm96ZW5BY3Rpb25Db2x1bW5cIlxuICAgICAgW2FsaWduRnJvemVuXT1cImFjdGlvbkNvbHVtblBvc2l0aW9uXCJcbiAgICAgIFtuZ0NsYXNzXT1cIihmcm96ZW5BY3Rpb25Db2x1bW4gJiYgYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JykgPyAnYm9yZGVyLXJpZ2h0LTEnIDogKGZyb3plbkFjdGlvbkNvbHVtbiAmJiBhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ3JpZ2h0JykgPyAnYm9yZGVyLWxlZnQtMScgOiAnJ1wiXG4gICAgICBbYXR0ci5uYW1lXT1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcgPyAnYWN0aW9uLWNvbHVtbi1oZWFkZXItbGVmdCcgOiAnYWN0aW9uLWNvbHVtbi1oZWFkZXItcmlnaHQnXCJcbiAgICA+XG4gICAgICB7eyAnT0NYX0RBVEFfVEFCTEUuQUNUSU9OU19DT0xVTU5fTkFNRScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3RoPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxwLXRhYmxlXG4gICpuZ0lmPVwiZGlzcGxheWVkUGFnZVNpemUkIHwgYXN5bmMgYXMgZGlzcGxheWVkUGFnZVNpemVcIlxuICBbdmFsdWVdPVwiKGRpc3BsYXllZFJvd3MkIHwgYXN5bmMpID8/IFtdXCJcbiAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXG4gIFtwYWdpbmF0b3JdPVwicGFnaW5hdG9yXCJcbiAgW2ZpcnN0XT1cInBhZ2UgKiBkaXNwbGF5ZWRQYWdlU2l6ZVwiXG4gIChvblBhZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICBbcm93c109XCJkaXNwbGF5ZWRQYWdlU2l6ZVwiXG4gIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7eyAodG90YWxSZWNvcmRzT25TZXJ2ZXIgPyBjdXJyZW50UGFnZVNob3dpbmdXaXRoVG90YWxPblNlcnZlcktleSA6IGN1cnJlbnRQYWdlU2hvd2luZ0tleSkgfCB0cmFuc2xhdGU6cGFyYW1zIH19XCJcbiAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCIoZGlzcGxheWVkUGFnZVNpemVzJCB8IGFzeW5jKSA/PyBbXVwiXG4gIGlkPVwiZGF0YVRhYmxlX3t7bmFtZX19XCJcbiAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgW3NlbGVjdGlvbl09XCIoc2VsZWN0ZWRSb3dzJCB8IGFzeW5jKSA/PyBbXVwiXG4gIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICBwYWdpbmF0b3JEcm9wZG93bkFwcGVuZFRvPVwiYm9keVwiXG4+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICA8dHI+XG4gICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNHJlbVwiIHNjb3BlPVwiY29sXCIgKm5nSWY9XCJzZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWRcIj5cbiAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgIDwvdGg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JztcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdGlvbkNvbHVtbkhlYWRlclwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiPlxuICAgICAgICA8dGggKm5nSWY9XCJjb2x1bW4uc29ydGFibGUgfHwgY29sdW1uLmZpbHRlcmFibGU7IGVsc2Ugc2ltcGxlSGVhZGVyXCIgc2NvcGU9XCJjb2xcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwie3tjb2x1bW4uaWR9fS1oZWFkZXItbmFtZVwiPnt7IGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWJ1dHRvbi1oZWFkZXItd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uc29ydGFibGVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicGkgc29ydEJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnBpLXNvcnQtYWx0XT1cIihjb2x1bW4/LmlkID09PSBzb3J0Q29sdW1uICYmIHNvcnREaXJlY3Rpb24gPT09ICdOT05FJykgfHwgY29sdW1uPy5pZCAhPT0gc29ydENvbHVtblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnBpLXNvcnQtYW1vdW50LXVwXT1cImNvbHVtbj8uaWQgPT09IHNvcnRDb2x1bW4gJiYgc29ydERpcmVjdGlvbiA9PT0gJ0FTQ0VORElORydcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5waS1zb3J0LWFtb3VudC1kb3duXT1cImNvbHVtbj8uaWQgPT09IHNvcnRDb2x1bW4gJiYgc29ydERpcmVjdGlvbiA9PT0gJ0RFU0NFTkRJTkcnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Tb3J0Q29sdW1uQ2xpY2soY29sdW1uLmlkKVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIihzb3J0SWNvblRpdGxlKGNvbHVtbi5pZCkgfCB0cmFuc2xhdGUpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIignT0NYX0RBVEFfVEFCTEUuVE9HR0xFX0JVVFRPTi5BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZTogeyBjb2x1bW46IChjb2x1bW4ubmFtZUtleSB8IHRyYW5zbGF0ZSksIGRpcmVjdGlvbjogKHNvcnREaXJlY3Rpb25Ub1RpdGxlKGNvbHVtbk5leHRTb3J0RGlyZWN0aW9uKGNvbHVtbi5pZCkpIHwgdHJhbnNsYXRlKX0pXCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmlsdGVyTXVsdGlTZWxlY3RcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmZpbHRlcmFibGVcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIihjdXJyZW50RmlsdGVyT3B0aW9ucyQgfCBhc3luYykgfHwgW11cIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIihjdXJyZW50U2VsZWN0ZWRGaWx0ZXJzJCB8IGFzeW5jKSB8fCBbXVwiXG4gICAgICAgICAgICAgICAgW3Nob3dUb2dnbGVBbGxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkVNUFRZX0ZJTFRFUl9NRVNTQUdFJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlTZWxlY3RlZExhYmVsXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbcmVzZXRGaWx0ZXJPbkhpZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRmlsdGVyQ2hhbmdlKGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJJY29uXCJcbiAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uRmlsdGVyQ2xpY2soY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidPQ1hfREFUQV9UQUJMRS5GSUxURVJfVElUTEUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIignT0NYX0RBVEFfVEFCTEUuRklMVEVSX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlOiB7IGNvbHVtbjogY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGV9KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwic2VsZWN0ZWRJdGVtc1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwaVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5waS1maWx0ZXJdPVwiISgoZmlsdGVyQW1vdW50cyQgfCBhc3luYykgfHwge30pW2NvbHVtbi5pZF1cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MucGktZmlsdGVyLWZpbGxdPVwiKChmaWx0ZXJBbW91bnRzJCB8IGFzeW5jKSB8fCB7fSlbY29sdW1uLmlkXSA+IDBcIlxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIml0ZW1cIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0VGVtcGxhdGUoY29sdW1uLCBUZW1wbGF0ZVR5cGUuRklMVEVSQ0VMTCkgfCBhc3luYyBhcyB0ZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgcm93T2JqZWN0OiBnZXRSb3dPYmplY3RGcm9tTXVsdGlzZWxlY3RJdGVtKHZhbHVlLCBjb2x1bW4pLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3NpbXBsZUhlYWRlcj5cbiAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eyBjb2x1bW4ubmFtZUtleSB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ3JpZ2h0JztcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdGlvbkNvbHVtbkhlYWRlclwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90cj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93T2JqZWN0PlxuICAgIDx0cj5cbiAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGlvbkNoYW5nZWRPYnNlcnZlZFwiPlxuICAgICAgICA8cC10YWJsZUNoZWNrYm94XG4gICAgICAgICAgW3ZhbHVlXT1cInJvd09iamVjdFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiEhc2VsZWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgc2VsZWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgID48L3AtdGFibGVDaGVja2JveD5cbiAgICAgIDwvdGQ+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdsZWZ0JztcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdGlvbkNvbHVtbjsgY29udGV4dDoge2xvY2FsUm93T2JqZWN0OiByb3dPYmplY3R9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIlxuICAgICAgICAgICAgX2NlbGwgPyBfY2VsbDogZGVmYXVsdENlbGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICByb3dPYmplY3Q6IHJvd09iamVjdCxcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdGQ+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCc7XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW47IGNvbnRleHQ6IHtsb2NhbFJvd09iamVjdDogcm93T2JqZWN0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90cj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgIDx0cj5cbiAgICAgIDx0ZCBbY29sU3Bhbl09XCJjb2x1bW5zLmxlbmd0aCArICgoYW55Um93QWN0aW9uT2JzZXJ2ZWQgfHwgdGhpcy5hZGRpdGlvbmFsQWN0aW9ucy5sZW5ndGggPiAwKSA/IDEgOiAwKVwiPlxuICAgICAgICB7eyBlbXB0eVJlc3VsdHNNZXNzYWdlIHx8IChcIk9DWF9EQVRBX1RBQkxFLkVNUFRZX1JFU1VMVFwiIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLXRhYmxlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRDZWxsIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cImdldFRlbXBsYXRlKGNvbHVtbiwgVGVtcGxhdGVUeXBlLkNFTEwpIHwgYXN5bmMgYXMgdGVtcGxhdGVcIlxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgIHJvd09iamVjdDogcm93T2JqZWN0LFxuICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICB9XCJcbiAgPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0U3RyaW5nQ2VsbFwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdE51bWJlckNlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPiB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKSB8IG51bWJlciB9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0Q3VzdG9tQ2VsbFwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+IDwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0RGF0ZUNlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPiB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKXwgZGF0ZTogJ21lZGl1bScgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdFJlbGF0aXZlRGF0ZUNlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPlxuICAgIHt7ICdPQ1hfREFUQV9UQUJMRS5FRElURUQnIHwgdHJhbnNsYXRlIH19IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgdGltZWFnbyB9fVxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJkZWZhdWx0VHJhbnNsYXRpb25LZXlDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCB0cmFuc2xhdGUgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
714
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLFNBQVMsRUFFVCxNQUFNLEVBR04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ2xFLE9BQU8sRUFBWSxhQUFhLEVBQWMsTUFBTSxhQUFhLENBQUE7QUFFakUsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUN6RyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFJMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7QUFTL0QsTUFB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QyxLQUFLO2dCQUM0Qiw2QkFBNkI7c0JBQTlELFlBQVk7dUJBQUMsa0JBQWtCO2dCQUl2Qix3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQzRCLDZCQUE2QjtzQkFBOUQsWUFBWTt1QkFBQyxrQkFBa0I7Z0JBU3ZCLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFNNEIsNkJBQTZCO3NCQUE5RCxZQUFZO3VCQUFDLGtCQUFrQjtnQkFJdkIsc0JBQXNCO3NCQUE5QixLQUFLO2dCQUMwQiwyQkFBMkI7c0JBQTFELFlBQVk7dUJBQUMsZ0JBQWdCO2dCQUlyQiw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBQ2tDLG1DQUFtQztzQkFBMUUsWUFBWTt1QkFBQyx3QkFBd0I7Z0JBSTdCLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDc0IsdUJBQXVCO3NCQUFsRCxZQUFZO3VCQUFDLFlBQVk7Z0JBSWpCLGdDQUFnQztzQkFBeEMsS0FBSztnQkFDb0MscUNBQXFDO3NCQUE5RSxZQUFZO3VCQUFDLDBCQUEwQjtnQkFPcEMsaUJBQWlCO3NCQURwQixLQUFLO2dCQU9HLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBRUksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBbUJILFNBQVM7c0JBRFosZUFBZTt1QkFBQyxhQUFhO2dCQVMxQixhQUFhO3NCQURoQixZQUFZO3VCQUFDLGFBQWE7Z0JBU3ZCLGVBQWU7c0JBRGxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBMT0NBTEVfSUQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcbmltcG9ydCB7IGlzVmFsaWREYXRlIH0gZnJvbSAnQG9uZWN4L2FjY2VsZXJhdG9yJ1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdAb25lY3gvYW5ndWxhci1pbnRlZ3JhdGlvbi1pbnRlcmZhY2UnXG5pbXBvcnQgeyBNZW51SXRlbSwgUHJpbWVUZW1wbGF0ZSwgU2VsZWN0SXRlbSB9IGZyb20gJ3ByaW1lbmcvYXBpJ1xuaW1wb3J0IHsgTWVudSB9IGZyb20gJ3ByaW1lbmcvbWVudSdcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCwgZGVib3VuY2VUaW1lLCBmaXJzdCwgbWFwLCBtZXJnZU1hcCwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL2NvbHVtbi10eXBlLm1vZGVsJ1xuaW1wb3J0IHsgRGF0YUFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtYWN0aW9uJ1xuaW1wb3J0IHsgRGF0YVNvcnREaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLXNvcnQtZGlyZWN0aW9uJ1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS10YWJsZS1jb2x1bW4ubW9kZWwnXG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gJy4uLy4uL3V0aWxzL29iamVjdHV0aWxzJ1xuaW1wb3J0IHsgRGF0YVNvcnRCYXNlIH0gZnJvbSAnLi4vZGF0YS1zb3J0LWJhc2UvZGF0YS1zb3J0LWJhc2UnXG5pbXBvcnQgeyBNdWx0aVNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0J1xuXG50eXBlIFByaW1pdGl2ZSA9IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBiaWdpbnQgfCBEYXRlXG5leHBvcnQgdHlwZSBSb3cgPSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgW2NvbHVtbklkOiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBlbnVtIFRlbXBsYXRlVHlwZSB7XG4gIENFTEwgPSAnQ0VMTCcsXG4gIEZJTFRFUkNFTEwgPSAnRklMVEVSQ0VMTCcsXG59XG5cbmludGVyZmFjZSBUZW1wbGF0ZXNEYXRhIHtcbiAgdGVtcGxhdGVzT2JzZXJ2YWJsZXM6IFJlY29yZDxzdHJpbmcsIE9ic2VydmFibGU8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+PlxuICBpZFN1ZmZpeDogQXJyYXk8c3RyaW5nPlxuICB0ZW1wbGF0ZU5hbWVzOiBSZWNvcmQ8Q29sdW1uVHlwZSwgQXJyYXk8c3RyaW5nPj5cbn1cblxuZXhwb3J0IHR5cGUgRmlsdGVyID0geyBjb2x1bW5JZDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1cbmV4cG9ydCB0eXBlIFNvcnQgPSB7IHNvcnRDb2x1bW46IHN0cmluZzsgc29ydERpcmVjdGlvbjogRGF0YVNvcnREaXJlY3Rpb24gfVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFUYWJsZUNvbXBvbmVudFN0YXRlIHtcbiAgZmlsdGVycz86IEZpbHRlcltdXG4gIHNvcnRpbmc/OiBTb3J0XG4gIHNlbGVjdGVkUm93cz86IFJvd1tdXG4gIGFjdGl2ZVBhZ2U/OiBudW1iZXJcbiAgcGFnZVNpemU/OiBudW1iZXJcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2N4LWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGV4dGVuZHMgRGF0YVNvcnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgVGVtcGxhdGVUeXBlID0gVGVtcGxhdGVUeXBlXG5cbiAgX3Jvd3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSb3dbXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCByb3dzKCk6IFJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcm93cyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCByb3dzKHZhbHVlOiBSb3dbXSkge1xuICAgICF0aGlzLl9yb3dzJC5nZXRWYWx1ZSgpLmxlbmd0aCA/PyB0aGlzLnJlc2V0UGFnZSgpXG4gICAgdGhpcy5fcm93cyQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc2VsZWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Um93W10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0ZWRSb3dzKCk6IFJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNlbGVjdGVkUm93cyh2YWx1ZTogUm93W10pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQodmFsdWUpXG4gIH1cbiAgX2ZpbHRlcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJbXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBmaWx0ZXJzKCk6IEZpbHRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVycyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBmaWx0ZXJzKHZhbHVlOiBGaWx0ZXJbXSkge1xuICAgICF0aGlzLl9maWx0ZXJzJC5nZXRWYWx1ZSgpLmxlbmd0aCA/PyB0aGlzLnJlc2V0UGFnZSgpXG4gICAgdGhpcy5fZmlsdGVycyQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc29ydERpcmVjdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFTb3J0RGlyZWN0aW9uPihEYXRhU29ydERpcmVjdGlvbi5OT05FKVxuICBASW5wdXQoKVxuICBnZXQgc29ydERpcmVjdGlvbigpOiBEYXRhU29ydERpcmVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnREaXJlY3Rpb24kLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydERpcmVjdGlvbih2YWx1ZTogRGF0YVNvcnREaXJlY3Rpb24pIHtcbiAgICB0aGlzLl9zb3J0RGlyZWN0aW9uJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zb3J0Q29sdW1uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcbiAgQElucHV0KClcbiAgZ2V0IHNvcnRDb2x1bW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcz8uX3NvcnRDb2x1bW4kLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydENvbHVtbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcz8uX3NvcnRDb2x1bW4kLm5leHQodmFsdWUpXG4gIH1cbiAgQElucHV0KCkgY29sdW1uczogRGF0YVRhYmxlQ29sdW1uW10gPSBbXVxuICBASW5wdXQoKSBjbGllbnRTaWRlRmlsdGVyaW5nID0gdHJ1ZVxuICBASW5wdXQoKSBjbGllbnRTaWRlU29ydGluZyA9IHRydWVcbiAgQElucHV0KCkgc29ydFN0YXRlczogRGF0YVNvcnREaXJlY3Rpb25bXSA9IFtEYXRhU29ydERpcmVjdGlvbi5BU0NFTkRJTkcsIERhdGFTb3J0RGlyZWN0aW9uLkRFU0NFTkRJTkddXG5cbiAgZGlzcGxheWVkUGFnZVNpemVzJDogT2JzZXJ2YWJsZTwobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXT5cbiAgX3BhZ2VTaXplcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdPihbMTAsIDI1LCA1MF0pXG4gIEBJbnB1dCgpXG4gIGdldCBwYWdlU2l6ZXMoKTogKG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10ge1xuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZXMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgcGFnZVNpemVzKHZhbHVlOiAobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXSkge1xuICAgIHRoaXMuX3BhZ2VTaXplcyQubmV4dCh2YWx1ZSlcbiAgfVxuICBkaXNwbGF5ZWRQYWdlU2l6ZSQ6IE9ic2VydmFibGU8bnVtYmVyPlxuICBfcGFnZVNpemUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiAgQElucHV0KClcbiAgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wYWdlU2l6ZSQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIEBJbnB1dCgpIGVtcHR5UmVzdWx0c01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBuYW1lID0gJydcbiAgQElucHV0KCkgZGVsZXRlUGVybWlzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdQZXJtaXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdFBlcm1pc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBkZWxldGVBY3Rpb25WaXNpYmxlRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBkZWxldGVBY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3QWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgdmlld0FjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGVkaXRBY3Rpb25WaXNpYmxlRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBlZGl0QWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgc2VsZWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgcGFnaW5hdG9yID0gdHJ1ZVxuICBASW5wdXQoKSBwYWdlID0gMFxuICBASW5wdXQoKVxuICBnZXQgdG90YWxSZWNvcmRzT25TZXJ2ZXIoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXNbJ3RvdGFsUmVjb3Jkc09uU2VydmVyJ10gPyBOdW1iZXIodGhpcy5wYXJhbXNbJ3RvdGFsUmVjb3Jkc09uU2VydmVyJ10pIDogdW5kZWZpbmVkXG4gIH1cbiAgc2V0IHRvdGFsUmVjb3Jkc09uU2VydmVyKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnBhcmFtc1sndG90YWxSZWNvcmRzT25TZXJ2ZXInXSA9IHZhbHVlPy50b1N0cmluZygpID8/ICcwJ1xuICB9XG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlU2hvd2luZ0tleSA9ICdPQ1hfREFUQV9UQUJMRS5TSE9XSU5HJ1xuICBASW5wdXQoKSBjdXJyZW50UGFnZVNob3dpbmdXaXRoVG90YWxPblNlcnZlcktleSA9ICdPQ1hfREFUQV9UQUJMRS5TSE9XSU5HX1dJVEhfVE9UQUxfT05fU0VSVkVSJ1xuICBwYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgY3VycmVudFBhZ2U6ICd7Y3VycmVudFBhZ2V9JyxcbiAgICB0b3RhbFBhZ2VzOiAne3RvdGFsUGFnZXN9JyxcbiAgICByb3dzOiAne3Jvd3N9JyxcbiAgICBmaXJzdDogJ3tmaXJzdH0nLFxuICAgIGxhc3Q6ICd7bGFzdH0nLFxuICAgIHRvdGFsUmVjb3JkczogJ3t0b3RhbFJlY29yZHN9JyxcbiAgfVxuXG4gIEBJbnB1dCgpIHN0cmluZ0NlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdzdHJpbmdDZWxsJykgc3RyaW5nQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9zdHJpbmdDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0cmluZ0NlbGxUZW1wbGF0ZSB8fCB0aGlzLnN0cmluZ0NlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBudW1iZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbnVtYmVyQ2VsbCcpIG51bWJlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfbnVtYmVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5udW1iZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5udW1iZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkQ2VsbFxuICAgKiBlLmcuIGZvciBhIGNvbHVtbiB3aXRoIHRoZSBpZCAnc3RhdHVzJyB1c2UgcFRlbXBsYXRlPVwic3RhdHVzSWRDZWxsXCJcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICAgIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgYW5kIGluc3RlYWQgdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBvZiBhIHNwZWNpZmljIGNvbHVtblxuICAgKiB1c2UgdGhlIG5ldyBhcHByb2FjaCBpbnN0ZWFkIGJ5IGZvbGxvd2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gY29sdW1uIGlkICsgSWRDZWxsXG4gICAqIGUuZy4gZm9yIGEgY29sdW1uIHdpdGggdGhlIGlkICdzdGF0dXMnIHVzZSBwVGVtcGxhdGU9XCJzdGF0dXNJZENlbGxcIlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZCgnY3VzdG9tQ2VsbCcpIGN1c3RvbUNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY3VzdG9tQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21DZWxsVGVtcGxhdGUgfHwgdGhpcy5jdXN0b21DZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgZGF0ZUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdkYXRlQ2VsbCcpIGRhdGVDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2RhdGVDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGVDZWxsVGVtcGxhdGUgfHwgdGhpcy5kYXRlQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIHJlbGF0aXZlRGF0ZUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdyZWxhdGl2ZURhdGVDZWxsJykgcmVsYXRpdmVEYXRlQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9yZWxhdGl2ZURhdGVDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlbGF0aXZlRGF0ZUNlbGxUZW1wbGF0ZSB8fCB0aGlzLnJlbGF0aXZlRGF0ZUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBjZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnY2VsbCcpIGNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfY2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jZWxsVGVtcGxhdGUgfHwgdGhpcy5jZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5Q2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3RyYW5zbGF0aW9uS2V5Q2VsbCcpIHRyYW5zbGF0aW9uS2V5Q2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF90cmFuc2xhdGlvbktleUNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25LZXlDZWxsVGVtcGxhdGUgfHwgdGhpcy50cmFuc2xhdGlvbktleUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgc3RyaW5nRmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ3N0cmluZ0ZpbHRlckNlbGwnKSBzdHJpbmdGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3N0cmluZ0ZpbHRlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nRmlsdGVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMuc3RyaW5nRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSBudW1iZXJGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbnVtYmVyRmlsdGVyQ2VsbCcpIG51bWJlckZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfbnVtYmVyRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5udW1iZXJGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5udW1iZXJGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgYW5kIGluc3RlYWQgdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBvZiBhIHNwZWNpZmljIGNvbHVtbiBmaWx0ZXJcbiAgICogdXNlIHRoZSBuZXcgYXBwcm9hY2ggaW5zdGVhZCBieSBmb2xsb3dpbmcgdGhlIG5hbWluZyBjb252ZW50aW9uIGNvbHVtbiBpZCArIElkRmlsdGVyQ2VsbFxuICAgKiBlLmcuIGZvciBhIGNvbHVtbiB3aXRoIHRoZSBpZCAnc3RhdHVzJyB1c2UgcFRlbXBsYXRlPVwic3RhdHVzSWRGaWx0ZXJDZWxsXCJcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbUZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGFuZCBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgb2YgYSBzcGVjaWZpYyBjb2x1bW4gZmlsdGVyXG4gICAqIHVzZSB0aGUgbmV3IGFwcHJvYWNoIGluc3RlYWQgYnkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiBjb2x1bW4gaWQgKyBJZEZpbHRlckNlbGxcbiAgICogZS5nLiBmb3IgYSBjb2x1bW4gd2l0aCB0aGUgaWQgJ3N0YXR1cycgdXNlIHBUZW1wbGF0ZT1cInN0YXR1c0lkRmlsdGVyQ2VsbFwiXG4gICAqL1xuICBAQ29udGVudENoaWxkKCdjdXN0b21GaWx0ZXJDZWxsJykgY3VzdG9tRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9jdXN0b21GaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbUZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLmN1c3RvbUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgZGF0ZUZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdkYXRlRmlsdGVyQ2VsbCcpIGRhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2RhdGVGaWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGVGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5kYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSByZWxhdGl2ZURhdGVGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgncmVsYXRpdmVEYXRlRmlsdGVyQ2VsbCcpIHJlbGF0aXZlRGF0ZUZpbHRlckNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfcmVsYXRpdmVEYXRlRmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsVGVtcGxhdGUgfHwgdGhpcy5yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG4gIEBJbnB1dCgpIGZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdmaWx0ZXJDZWxsJykgZmlsdGVyQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9maWx0ZXJDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLmZpbHRlckNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cbiAgQElucHV0KCkgdHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgndHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsJykgdHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbktleUZpbHRlckNlbGxUZW1wbGF0ZSB8fCB0aGlzLnRyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIF9hZGRpdGlvbmFsQWN0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFBY3Rpb25bXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBhZGRpdGlvbmFsQWN0aW9ucygpOiBEYXRhQWN0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbmFsQWN0aW9ucyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBhZGRpdGlvbmFsQWN0aW9ucyh2YWx1ZTogRGF0YUFjdGlvbltdKSB7XG4gICAgdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLm5leHQodmFsdWUpXG4gIH1cbiAgQElucHV0KCkgZnJvemVuQWN0aW9uQ29sdW1uID0gZmFsc2VcbiAgQElucHV0KCkgYWN0aW9uQ29sdW1uUG9zaXRpb246ICdsZWZ0JyB8ICdyaWdodCcgPSAncmlnaHQnXG5cbiAgQE91dHB1dCgpIGZpbHRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJbXT4oKVxuICBAT3V0cHV0KCkgc29ydGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb3J0PigpXG4gIEBPdXRwdXQoKSB2aWV3VGFibGVSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFJvdz4oKVxuICBAT3V0cHV0KCkgZWRpdFRhYmxlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3c+KClcbiAgQE91dHB1dCgpIGRlbGV0ZVRhYmxlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3c+KClcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJvd1tdPigpXG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpXG4gIEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxuICBAT3V0cHV0KCkgY29tcG9uZW50U3RhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVDb21wb25lbnRTdGF0ZT4oKVxuXG4gIGRpc3BsYXllZFJvd3MkOiBPYnNlcnZhYmxlPHVua25vd25bXT4gfCB1bmRlZmluZWRcbiAgc2VsZWN0ZWRSb3dzJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG5cbiAgY3VycmVudEZpbHRlckNvbHVtbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFUYWJsZUNvbHVtbiB8IG51bGw+KG51bGwpXG4gIGN1cnJlbnRGaWx0ZXJPcHRpb25zJDogT2JzZXJ2YWJsZTxTZWxlY3RJdGVtW10+IHwgdW5kZWZpbmVkXG4gIGN1cnJlbnRTZWxlY3RlZEZpbHRlcnMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB8IHVuZGVmaW5lZFxuICBmaWx0ZXJBbW91bnRzJDogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB8IHVuZGVmaW5lZFxuXG4gIG92ZXJmbG93QWN0aW9ucyQ6IE9ic2VydmFibGU8RGF0YUFjdGlvbltdPlxuICBpbmxpbmVBY3Rpb25zJDogT2JzZXJ2YWJsZTxEYXRhQWN0aW9uW10+XG4gIG92ZXJmbG93TWVudUl0ZW1zJDogT2JzZXJ2YWJsZTxNZW51SXRlbVtdPlxuICBjdXJyZW50TWVudVJvdyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJvdyB8IG51bGw+KG51bGwpXG5cbiAgdGVtcGxhdGVzJDogQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZClcbiAgQENvbnRlbnRDaGlsZHJlbihQcmltZVRlbXBsYXRlKVxuICBzZXQgdGVtcGxhdGVzKHZhbHVlOiBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnRlbXBsYXRlcyQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIHZpZXdUZW1wbGF0ZXMkOiBCZWhhdmlvclN1YmplY3Q8UXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgUXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgdW5kZWZpbmVkXG4gID4odW5kZWZpbmVkKVxuICBAVmlld0NoaWxkcmVuKFByaW1lVGVtcGxhdGUpXG4gIHNldCB2aWV3VGVtcGxhdGVzKHZhbHVlOiBRdWVyeUxpc3Q8UHJpbWVUZW1wbGF0ZT4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnZpZXdUZW1wbGF0ZXMkLm5leHQodmFsdWUpXG4gIH1cblxuICBwYXJlbnRUZW1wbGF0ZXMkOiBCZWhhdmlvclN1YmplY3Q8UXVlcnlMaXN0PFByaW1lVGVtcGxhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IG51bGwgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpXG4gIEBJbnB1dCgpXG4gIHNldCBwYXJlbnRUZW1wbGF0ZXModmFsdWU6IFF1ZXJ5TGlzdDxQcmltZVRlbXBsYXRlPiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnBhcmVudFRlbXBsYXRlcyQubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIGdldCB2aWV3VGFibGVSb3dPYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py52aWV3SXRlbU9ic2VydmVkIHx8IGR2Py52aWV3SXRlbS5vYnNlcnZlZCB8fCB0aGlzLnZpZXdUYWJsZVJvdy5vYnNlcnZlZFxuICB9XG4gIGdldCBlZGl0VGFibGVSb3dPYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py5lZGl0SXRlbU9ic2VydmVkIHx8IGR2Py5lZGl0SXRlbS5vYnNlcnZlZCB8fCB0aGlzLmVkaXRUYWJsZVJvdy5vYnNlcnZlZFxuICB9XG4gIGdldCBkZWxldGVUYWJsZVJvd09ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LmRlbGV0ZUl0ZW1PYnNlcnZlZCB8fCBkdj8uZGVsZXRlSXRlbS5vYnNlcnZlZCB8fCB0aGlzLmRlbGV0ZVRhYmxlUm93Lm9ic2VydmVkXG4gIH1cbiAgZ2V0IGFueVJvd0FjdGlvbk9ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdUYWJsZVJvd09ic2VydmVkIHx8IHRoaXMuZWRpdFRhYmxlUm93T2JzZXJ2ZWQgfHwgdGhpcy5kZWxldGVUYWJsZVJvd09ic2VydmVkXG4gIH1cblxuICBnZXQgc2VsZWN0aW9uQ2hhbmdlZE9ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LnNlbGVjdGlvbkNoYW5nZWRPYnNlcnZlZCB8fCBkdj8uc2VsZWN0aW9uQ2hhbmdlZC5vYnNlcnZlZCB8fCB0aGlzLnNlbGVjdGlvbkNoYW5nZWQub2JzZXJ2ZWRcbiAgfVxuXG4gIHRlbXBsYXRlc09ic2VydmFibGVzOiBSZWNvcmQ8c3RyaW5nLCBPYnNlcnZhYmxlPFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPj4gPSB7fVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTE9DQUxFX0lEKSBsb2NhbGU6IHN0cmluZyxcbiAgICB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIobG9jYWxlLCB0cmFuc2xhdGVTZXJ2aWNlKVxuICAgIHRoaXMubmFtZSA9IHRoaXMubmFtZSB8fCB0aGlzLnJvdXRlci51cmwucmVwbGFjZSgvW15BLVphLXowLTldLywgJ18nKVxuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemVzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3BhZ2VTaXplcyQsIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoJ09DWF9EQVRBX1RBQkxFLkFMTCcpXSkucGlwZShcbiAgICAgIG1hcCgoW3BhZ2VTaXplcywgdHJhbnNsYXRpb25dKSA9PiBwYWdlU2l6ZXMuY29uY2F0KHsgc2hvd0FsbDogdHJhbnNsYXRpb24gfSkpXG4gICAgKVxuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemUkID0gY29tYmluZUxhdGVzdChbdGhpcy5fcGFnZVNpemUkLCB0aGlzLl9wYWdlU2l6ZXMkXSkucGlwZShcbiAgICAgIG1hcCgoW3BhZ2VTaXplLCBwYWdlU2l6ZXNdKSA9PiBwYWdlU2l6ZSA/PyBwYWdlU2l6ZXMuZmluZCgodmFsKTogdmFsIGlzIG51bWJlciA9PiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgPz8gNTApXG4gICAgKVxuICAgIHRoaXMub3ZlcmZsb3dBY3Rpb25zJCA9IHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zJC5waXBlKFxuICAgICAgbWFwKChhY3Rpb25zKSA9PiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uc2hvd0FzT3ZlcmZsb3cpKVxuICAgIClcbiAgICB0aGlzLmlubGluZUFjdGlvbnMkID0gdGhpcy5fYWRkaXRpb25hbEFjdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKGFjdGlvbnMpID0+IGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+ICFhY3Rpb24uc2hvd0FzT3ZlcmZsb3cpKVxuICAgIClcbiAgICB0aGlzLm92ZXJmbG93TWVudUl0ZW1zJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMub3ZlcmZsb3dBY3Rpb25zJCwgdGhpcy5jdXJyZW50TWVudVJvdyRdKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKFthY3Rpb25zLCByb3ddKSA9PlxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFsuLi5hY3Rpb25zLm1hcCgoYSkgPT4gYS5sYWJlbEtleSB8fCAnJyldKS5waXBlKFxuICAgICAgICAgIG1hcCgodHJhbnNsYXRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uc1xuICAgICAgICAgICAgICAuZmlsdGVyKChhKSA9PiB0aGlzLnVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24oYS5wZXJtaXNzaW9uKSlcbiAgICAgICAgICAgICAgLm1hcCgoYSkgPT4gKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogdHJhbnNsYXRpb25zW2EubGFiZWxLZXkgfHwgJyddLFxuICAgICAgICAgICAgICAgIGljb246IGEuaWNvbixcbiAgICAgICAgICAgICAgICBzdHlsZUNsYXNzOiAoYS5jbGFzc2VzIHx8IFtdKS5qb2luKCcgJyksXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGEuZGlzYWJsZWQgfHwgKCEhYS5hY3Rpb25FbmFibGVkRmllbGQgJiYgIXRoaXMuZmllbGRJc1RydXRoeShyb3csIGEuYWN0aW9uRW5hYmxlZEZpZWxkKSksXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogIWEuYWN0aW9uVmlzaWJsZUZpZWxkIHx8IHRoaXMuZmllbGRJc1RydXRoeShyb3csIGEuYWN0aW9uVmlzaWJsZUZpZWxkKSxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiBhLmNhbGxiYWNrKHJvdyksXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXllZFJvd3MkID0gY29tYmluZUxhdGVzdChbdGhpcy5fcm93cyQsIHRoaXMuX2ZpbHRlcnMkLCB0aGlzLl9zb3J0Q29sdW1uJCwgdGhpcy5fc29ydERpcmVjdGlvbiRdKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKHBhcmFtcykgPT4gdGhpcy50cmFuc2xhdGVJdGVtcyhwYXJhbXMsIHRoaXMuY29sdW1ucywgdGhpcy5jbGllbnRTaWRlRmlsdGVyaW5nLCB0aGlzLmNsaWVudFNpZGVTb3J0aW5nKSksXG4gICAgICBtYXAoKHBhcmFtcykgPT4gdGhpcy5maWx0ZXJJdGVtcyhwYXJhbXMsIHRoaXMuY2xpZW50U2lkZUZpbHRlcmluZykpLFxuICAgICAgbWFwKChwYXJhbXMpID0+IHRoaXMuc29ydEl0ZW1zKHBhcmFtcywgdGhpcy5jb2x1bW5zLCB0aGlzLmNsaWVudFNpZGVTb3J0aW5nKSksXG4gICAgICBtYXAoKFtyb3dzXSkgPT4gdGhpcy5mbGF0dGVuSXRlbXMocm93cykpXG4gICAgKVxuICAgIHRoaXMuY3VycmVudFNlbGVjdGVkRmlsdGVycyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9maWx0ZXJzJCwgdGhpcy5jdXJyZW50RmlsdGVyQ29sdW1uJF0pLnBpcGUoXG4gICAgICBtYXAoKFtmaWx0ZXJzLCBjdXJyZW50RmlsdGVyQ29sdW1uXSkgPT4ge1xuICAgICAgICByZXR1cm4gZmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkID09PSBjdXJyZW50RmlsdGVyQ29sdW1uPy5pZCkubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcbiAgICAgIH0pXG4gICAgKVxuICAgIHRoaXMuY3VycmVudEZpbHRlck9wdGlvbnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fcm93cyQsIHRoaXMuY3VycmVudEZpbHRlckNvbHVtbiQsIHRoaXMuX2ZpbHRlcnMkXSkucGlwZShcbiAgICAgIG1lcmdlTWFwKChbcm93cywgY3VycmVudEZpbHRlckNvbHVtbiwgZmlsdGVyc10pID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50RmlsdGVyQ29sdW1uPy5pZCkge1xuICAgICAgICAgIHJldHVybiBvZihbXSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IGZpbHRlcnNcbiAgICAgICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCA9PT0gY3VycmVudEZpbHRlckNvbHVtbj8uaWQpXG4gICAgICAgICAgLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIudmFsdWUpXG5cbiAgICAgICAgY29uc3QgY29sdW1uVmFsdWVzID0gcm93cy5tYXAoKHJvdykgPT4gcm93W2N1cnJlbnRGaWx0ZXJDb2x1bW4/LmlkXSlcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlT2JzZXJ2YWJsZSA9XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoKGMpID0+IGMuaWQgPT09IGN1cnJlbnRGaWx0ZXJDb2x1bW4/LmlkKT8uY29sdW1uVHlwZSA9PT0gQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVlcbiAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChjb2x1bW5WYWx1ZXMgYXMgc3RyaW5nW10pXG4gICAgICAgICAgICA6IG9mKE9iamVjdC5mcm9tRW50cmllcyhjb2x1bW5WYWx1ZXMubWFwKChjdikgPT4gW2N2LCBjdl0pKSlcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZU9ic2VydmFibGUucGlwZShcbiAgICAgICAgICBtYXAoKHRyYW5zbGF0ZWRWYWx1ZXMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRyYW5zbGF0ZWRWYWx1ZXMpXG4gICAgICAgICAgICAgIC5jb25jYXQoY3VycmVudEZpbHRlcnMpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXggJiYgdmFsdWUgIT0gbnVsbClcbiAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoZmlsdGVyT3B0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGZpbHRlck9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlck9wdGlvbixcbiAgICAgICAgICAgICAgICAgIH0pIGFzIFNlbGVjdEl0ZW1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgKVxuICAgIHRoaXMuZmlsdGVyQW1vdW50cyQgPSB0aGlzLl9maWx0ZXJzJC5waXBlKFxuICAgICAgbWFwKChmaWx0ZXJzKSA9PlxuICAgICAgICBmaWx0ZXJzXG4gICAgICAgICAgLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQpXG4gICAgICAgICAgLm1hcCgoY29sdW1uSWQpID0+IFtjb2x1bW5JZCwgZmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkID09PSBjb2x1bW5JZCkubGVuZ3RoXSlcbiAgICAgICksXG4gICAgICBtYXAoKGFtb3VudHMpID0+IE9iamVjdC5mcm9tRW50cmllcyhhbW91bnRzKSlcbiAgICApXG4gICAgdGhpcy5tYXBTZWxlY3Rpb25Ub1Jvd3MoKVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCgpXG4gIH1cblxuICBlbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKHN0YXRlOiBEYXRhVGFibGVDb21wb25lbnRTdGF0ZSA9IHt9KSB7XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5kaXNwbGF5ZWRQYWdlU2l6ZSQsIHRoaXMuX3NlbGVjdGlvbiRdKS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoW3BhZ2VTaXplLCBzZWxlY3RlZFJvd3NdKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRTdGF0ZUNoYW5nZWQuZW1pdCh7XG4gICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICBzb3J0aW5nOiB7XG4gICAgICAgIHNvcnRDb2x1bW46IHRoaXMuc29ydENvbHVtbixcbiAgICAgICAgc29ydERpcmVjdGlvbjogdGhpcy5zb3J0RGlyZWN0aW9uXG4gICAgICB9LFxuICAgICAgcGFnZVNpemUsXG4gICAgICBhY3RpdmVQYWdlOiB0aGlzLnBhZ2UsXG4gICAgICBzZWxlY3RlZFJvd3MsXG4gICAgICAuLi5zdGF0ZVxuICAgIH0pXG4gICAgfSlcblxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMudGVtcGxhdGVzPy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBzd2l0Y2ggKGl0ZW0uZ2V0VHlwZSgpKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZ0NlbGwnOlxuICAgICAgICAgIHRoaXMuc3RyaW5nQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnbnVtYmVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy5udW1iZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdjdXN0b21DZWxsJzpcbiAgICAgICAgICB0aGlzLmN1c3RvbUNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2RhdGVDZWxsJzpcbiAgICAgICAgICB0aGlzLmRhdGVDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdyZWxhdGl2ZURhdGVDZWxsJzpcbiAgICAgICAgICB0aGlzLnJlbGF0aXZlRGF0ZUNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2NlbGxUZW1wbGF0ZSc6XG4gICAgICAgICAgdGhpcy5jZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICd0cmFuc2xhdGlvbktleUNlbGwnOlxuICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25LZXlDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzdHJpbmdGaWx0ZXJDZWxsJzpcbiAgICAgICAgICB0aGlzLnN0cmluZ0ZpbHRlckNlbGxDaGlsZFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ251bWJlckZpbHRlckNlbGwnOlxuICAgICAgICAgIHRoaXMubnVtYmVyRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnY3VzdG9tRmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy5jdXN0b21GaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdkYXRlRmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy5kYXRlRmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAncmVsYXRpdmVEYXRlRmlsdGVyQ2VsbCc6XG4gICAgICAgICAgdGhpcy5yZWxhdGl2ZURhdGVGaWx0ZXJDZWxsQ2hpbGRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdmaWx0ZXJDZWxsVGVtcGxhdGUnOlxuICAgICAgICAgIHRoaXMuZmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAndHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsJzpcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbENoaWxkVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Tb3J0Q29sdW1uQ2xpY2soc29ydENvbHVtbjogc3RyaW5nKSB7XG4gICAgY29uc3QgbmV3U29ydERpcmVjdGlvbiA9IHRoaXMuY29sdW1uTmV4dFNvcnREaXJlY3Rpb24oc29ydENvbHVtbilcblxuICAgIHRoaXMuX3NvcnRDb2x1bW4kLm5leHQoc29ydENvbHVtbilcbiAgICB0aGlzLl9zb3J0RGlyZWN0aW9uJC5uZXh0KG5ld1NvcnREaXJlY3Rpb24pXG5cbiAgICB0aGlzLnNvcnRlZC5lbWl0KHsgc29ydENvbHVtbjogc29ydENvbHVtbiwgc29ydERpcmVjdGlvbjogbmV3U29ydERpcmVjdGlvbiB9KVxuICAgIHRoaXMuZW1pdENvbXBvbmVudFN0YXRlQ2hhbmdlZCh7XG4gICAgICBzb3J0aW5nOiB7XG4gICAgICAgIHNvcnRDb2x1bW46IHNvcnRDb2x1bW4sXG4gICAgICAgIHNvcnREaXJlY3Rpb246IG5ld1NvcnREaXJlY3Rpb25cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY29sdW1uTmV4dFNvcnREaXJlY3Rpb24oc29ydENvbHVtbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNvcnRDb2x1bW4gIT09IHRoaXMuc29ydENvbHVtblxuICAgICAgPyB0aGlzLnNvcnRTdGF0ZXNbMF1cbiAgICAgIDogdGhpcy5zb3J0U3RhdGVzWyh0aGlzLnNvcnRTdGF0ZXMuaW5kZXhPZih0aGlzLnNvcnREaXJlY3Rpb24pICsgMSkgJSB0aGlzLnNvcnRTdGF0ZXMubGVuZ3RoXVxuICB9XG5cbiAgb25EZWxldGVSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy5kZWxldGVUYWJsZVJvdy5lbWl0KHNlbGVjdGVkVGFibGVSb3cpXG4gIH1cblxuICBvblZpZXdSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy52aWV3VGFibGVSb3cuZW1pdChzZWxlY3RlZFRhYmxlUm93KVxuICB9XG5cbiAgb25FZGl0Um93KHNlbGVjdGVkVGFibGVSb3c6IFJvdykge1xuICAgIHRoaXMuZWRpdFRhYmxlUm93LmVtaXQoc2VsZWN0ZWRUYWJsZVJvdylcbiAgfVxuXG4gIG9uRmlsdGVyQ2xpY2soY29sdW1uOiBEYXRhVGFibGVDb2x1bW4pIHtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kLm5leHQoY29sdW1uKVxuICB9XG5cbiAgb25GaWx0ZXJDaGFuZ2UoY29sdW1uOiBEYXRhVGFibGVDb2x1bW4sIGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5maWx0ZXJzXG4gICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCAhPT0gY29sdW1uLmlkKVxuICAgICAgLmNvbmNhdChcbiAgICAgICAgZXZlbnQudmFsdWUubWFwKCh2YWx1ZTogUHJpbWl0aXZlKSA9PiAoe1xuICAgICAgICAgIGNvbHVtbklkOiBjb2x1bW4uaWQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pKVxuICAgICAgKVxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcpIHtcbiAgICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnNcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJlZC5lbWl0KGZpbHRlcnMpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKHtcbiAgICAgIGZpbHRlcnNcbiAgICB9KVxuICAgIHRoaXMucmVzZXRQYWdlKClcbiAgfVxuXG4gIGdldFNlbGVjdGVkRmlsdGVycyhjb2x1bW5JZDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnMuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCA9PT0gY29sdW1uSWQpLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIudmFsdWUpXG4gIH1cblxuICBzb3J0SWNvblRpdGxlKHNvcnRDb2x1bW46IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNvcnREaXJlY3Rpb25Ub1RpdGxlKFxuICAgICAgc29ydENvbHVtbiAhPT0gdGhpcy5zb3J0RGlyZWN0aW9uXG4gICAgICAgID8gRGF0YVNvcnREaXJlY3Rpb24uTk9ORVxuICAgICAgICA6IHRoaXMuc29ydFN0YXRlc1t0aGlzLnNvcnRTdGF0ZXMuaW5kZXhPZih0aGlzLnNvcnREaXJlY3Rpb24pICUgdGhpcy5zb3J0U3RhdGVzLmxlbmd0aF1cbiAgICApXG4gIH1cblxuICBzb3J0RGlyZWN0aW9uVG9UaXRsZShzb3J0RGlyZWN0aW9uOiBEYXRhU29ydERpcmVjdGlvbikge1xuICAgIHN3aXRjaCAoc29ydERpcmVjdGlvbikge1xuICAgICAgY2FzZSBEYXRhU29ydERpcmVjdGlvbi5BU0NFTkRJTkc6XG4gICAgICAgIHJldHVybiAnT0NYX0RBVEFfVEFCTEUuVE9HR0xFX0JVVFRPTi5BU0NFTkRJTkdfVElUTEUnXG4gICAgICBjYXNlIERhdGFTb3J0RGlyZWN0aW9uLkRFU0NFTkRJTkc6XG4gICAgICAgIHJldHVybiAnT0NYX0RBVEFfVEFCTEUuVE9HR0xFX0JVVFRPTi5ERVNDRU5ESU5HX1RJVExFJ1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkRFRkFVTFRfVElUTEUnXG4gICAgfVxuICB9XG5cbiAgbWFwU2VsZWN0aW9uVG9Sb3dzKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRSb3dzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3NlbGVjdGlvbiQsIHRoaXMuX3Jvd3MkXSkucGlwZShcbiAgICAgIG1hcCgoW3NlbGVjdGVkUm93cywgcm93c10pID0+IHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkUm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICAgIHJldHVybiByb3dzLmZpbmQoKHIpID0+IHIuaWQgPT09IHJvdy5pZClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IFJvd1tdKSB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBldmVudDtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQuZW1pdChldmVudClcbiAgICB0aGlzLmVtaXRDb21wb25lbnRTdGF0ZUNoYW5nZWQoe1xuICAgICAgc2VsZWN0ZWRSb3dzOiBldmVudFxuICAgIH0pXG4gIH1cblxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHBhZ2UgPSBldmVudC5maXJzdCAvIGV2ZW50LnJvd3NcbiAgICB0aGlzLnBhZ2UgPSBwYWdlXG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50LnJvd3NcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQocGFnZSlcbiAgICB0aGlzLnBhZ2VTaXplQ2hhbmdlZC5lbWl0KGV2ZW50LnJvd3MpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKHtcbiAgICAgIGFjdGl2ZVBhZ2U6IHBhZ2UsXG4gICAgICBwYWdlU2l6ZTogZXZlbnQucm93c1xuICAgIH0pXG4gIH1cblxuICByZXNldFBhZ2UoKSB7XG4gICAgdGhpcy5wYWdlID0gMFxuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdCh0aGlzLnBhZ2UpXG4gICAgdGhpcy5lbWl0Q29tcG9uZW50U3RhdGVDaGFuZ2VkKClcbiAgfVxuXG4gIGZpZWxkSXNUcnV0aHkob2JqZWN0OiBhbnksIGtleTogYW55KSB7XG4gICAgcmV0dXJuICEhT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShvYmplY3QsIGtleSlcbiAgfVxuXG4gIHRvZ2dsZU92ZXJmbG93TWVudShldmVudDogTW91c2VFdmVudCwgbWVudTogTWVudSwgcm93OiBSb3cpIHtcbiAgICB0aGlzLmN1cnJlbnRNZW51Um93JC5uZXh0KHJvdylcbiAgICBtZW51LnRvZ2dsZShldmVudClcbiAgfVxuXG4gIGhhc1Zpc2libGVPdmVyZmxvd01lbnVJdGVtcyhyb3c6IGFueSkge1xuICAgIHJldHVybiB0aGlzLm92ZXJmbG93QWN0aW9ucyQucGlwZShcbiAgICAgIG1hcCgoYWN0aW9ucykgPT5cbiAgICAgICAgYWN0aW9ucy5zb21lKFxuICAgICAgICAgIChhKSA9PlxuICAgICAgICAgICAgIWEuYWN0aW9uVmlzaWJsZUZpZWxkIHx8XG4gICAgICAgICAgICAodGhpcy5maWVsZElzVHJ1dGh5KHJvdywgYS5hY3Rpb25WaXNpYmxlRmllbGQpICYmIHRoaXMudXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbihhLnBlcm1pc3Npb24pKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgaXNEYXRlKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKHZhbHVlKVxuICAgIHJldHVybiBpc1ZhbGlkRGF0ZShkKVxuICB9XG5cbiAgY2VsbFRlbXBsYXRlc0RhdGE6IFRlbXBsYXRlc0RhdGEgPSB7XG4gICAgdGVtcGxhdGVzT2JzZXJ2YWJsZXM6IHt9LFxuICAgIGlkU3VmZml4OiBbJ0lkVGFibGVDZWxsJywgJ0lkQ2VsbCddLFxuICAgIHRlbXBsYXRlTmFtZXM6IHtcbiAgICAgIFtDb2x1bW5UeXBlLkRBVEVdOiBbJ2RhdGVDZWxsJywgJ2RhdGVUYWJsZUNlbGwnLCAnZGVmYXVsdERhdGVDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5OVU1CRVJdOiBbJ251bWJlckNlbGwnLCAnbnVtYmVyVGFibGVDZWxsJywgJ2RlZmF1bHROdW1iZXJDZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5SRUxBVElWRV9EQVRFXTogWydyZWxhdGl2ZURhdGVDZWxsJywgJ3JlbGF0aXZlRGF0ZVRhYmxlQ2VsbCcsICdkZWZhdWx0UmVsYXRpdmVEYXRlQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuVFJBTlNMQVRJT05fS0VZXTogWyd0cmFuc2xhdGlvbktleUNlbGwnLCAndHJhbnNsYXRpb25LZXlUYWJsZUNlbGwnLCAnZGVmYXVsdFRyYW5zbGF0aW9uS2V5Q2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuQ1VTVE9NXTogWydjdXN0b21DZWxsJywgJ2N1c3RvbVRhYmxlQ2VsbCcsICdkZWZhdWx0Q3VzdG9tQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuU1RSSU5HXTogWydzdHJpbmdDZWxsJywgJ3N0cmluZ1RhYmxlQ2VsbCcsICdkZWZhdWx0U3RyaW5nQ2VsbCddLFxuICAgIH0sXG4gIH1cblxuICBmaWx0ZXJUZW1wbGF0ZXNEYXRhOiBUZW1wbGF0ZXNEYXRhID0ge1xuICAgIHRlbXBsYXRlc09ic2VydmFibGVzOiB7fSxcbiAgICBpZFN1ZmZpeDogWydJZFRhYmxlRmlsdGVyQ2VsbCcsICdJZEZpbHRlckNlbGwnXSxcbiAgICB0ZW1wbGF0ZU5hbWVzOiB7XG4gICAgICBbQ29sdW1uVHlwZS5EQVRFXTogWydkYXRlRmlsdGVyQ2VsbCcsICdkYXRlVGFibGVGaWx0ZXJDZWxsJywgJ2RlZmF1bHREYXRlQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuTlVNQkVSXTogWydudW1iZXJGaWx0ZXJDZWxsJywgJ251bWJlclRhYmxlRmlsdGVyQ2VsbCcsICdkZWZhdWx0TnVtYmVyQ2VsbCddLFxuICAgICAgW0NvbHVtblR5cGUuUkVMQVRJVkVfREFURV06IFsncmVsYXRpdmVEYXRlRmlsdGVyQ2VsbCcsICdyZWxhdGl2ZURhdGVUYWJsZUZpbHRlckNlbGwnLCAnZGVmYXVsdFJlbGF0aXZlRGF0ZUNlbGwnXSxcbiAgICAgIFtDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWV06IFtcbiAgICAgICAgJ3RyYW5zbGF0aW9uS2V5RmlsdGVyQ2VsbCcsXG4gICAgICAgICd0cmFuc2xhdGlvbktleVRhYmxlRmlsdGVyQ2VsbCcsXG4gICAgICAgICdkZWZhdWx0VHJhbnNsYXRpb25LZXlDZWxsJyxcbiAgICAgIF0sXG4gICAgICBbQ29sdW1uVHlwZS5DVVNUT01dOiBbJ2N1c3RvbUZpbHRlckNlbGwnLCAnY3VzdG9tVGFibGVGaWx0ZXJDZWxsJywgJ2RlZmF1bHRDdXN0b21DZWxsJ10sXG4gICAgICBbQ29sdW1uVHlwZS5TVFJJTkddOiBbJ3N0cmluZ0ZpbHRlckNlbGwnLCAnc3RyaW5nVGFibGVGaWx0ZXJDZWxsJywgJ2RlZmF1bHRTdHJpbmdDZWxsJ10sXG4gICAgfSxcbiAgfVxuXG4gIHRlbXBsYXRlc0RhdGFNYXA6IFJlY29yZDxUZW1wbGF0ZVR5cGUsIFRlbXBsYXRlc0RhdGE+ID0ge1xuICAgIFtUZW1wbGF0ZVR5cGUuQ0VMTF06IHRoaXMuY2VsbFRlbXBsYXRlc0RhdGEsXG4gICAgW1RlbXBsYXRlVHlwZS5GSUxURVJDRUxMXTogdGhpcy5maWx0ZXJUZW1wbGF0ZXNEYXRhLFxuICB9XG5cbiAgZmluZFRlbXBsYXRlKHRlbXBsYXRlczogUHJpbWVUZW1wbGF0ZVtdLCBuYW1lczogc3RyaW5nW10pOiBQcmltZVRlbXBsYXRlIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gbmFtZXNbaW5kZXhdXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRlbXBsYXRlcy5maW5kKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUubmFtZSA9PT0gbmFtZSlcbiAgICAgIGlmICh0ZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm4gdGVtcGxhdGVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0Q29sdW1uVHlwZVRlbXBsYXRlKHRlbXBsYXRlczogUHJpbWVUZW1wbGF0ZVtdLCBjb2x1bW5UeXBlOiBDb2x1bW5UeXBlLCB0ZW1wbGF0ZVR5cGU6IFRlbXBsYXRlVHlwZSkge1xuICAgIGxldCB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuXG4gICAgc3dpdGNoICh0ZW1wbGF0ZVR5cGUpIHtcbiAgICAgIGNhc2UgVGVtcGxhdGVUeXBlLkNFTEw6XG4gICAgICAgIHN3aXRjaCAoY29sdW1uVHlwZSkge1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5EQVRFOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9kYXRlQ2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuTlVNQkVSOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9udW1iZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5SRUxBVElWRV9EQVRFOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9yZWxhdGl2ZURhdGVDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5UUkFOU0xBVElPTl9LRVk6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3RyYW5zbGF0aW9uS2V5Q2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIENvbHVtblR5cGUuQ1VTVE9NOlxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9jdXN0b21DZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3N0cmluZ0NlbGxcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBUZW1wbGF0ZVR5cGUuRklMVEVSQ0VMTDpcbiAgICAgICAgc3dpdGNoIChjb2x1bW5UeXBlKSB7XG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLkRBVEU6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX2RhdGVGaWx0ZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5OVU1CRVI6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX251bWJlckZpbHRlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlJFTEFUSVZFX0RBVEU6XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX3JlbGF0aXZlRGF0ZUZpbHRlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWTpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fdHJhbnNsYXRpb25LZXlGaWx0ZXJDZWxsXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgQ29sdW1uVHlwZS5DVVNUT006XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMuX2N1c3RvbUZpbHRlckNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5fc3RyaW5nRmlsdGVyQ2VsbFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHRlbXBsYXRlID8/XG4gICAgICB0aGlzLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZXMsIHRoaXMudGVtcGxhdGVzRGF0YU1hcFt0ZW1wbGF0ZVR5cGVdLnRlbXBsYXRlTmFtZXNbY29sdW1uVHlwZV0pPy50ZW1wbGF0ZSA/P1xuICAgICAgbnVsbFxuICAgIClcbiAgfVxuXG4gIGdldFRlbXBsYXRlKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uLCB0ZW1wbGF0ZVR5cGU6IFRlbXBsYXRlVHlwZSk6IE9ic2VydmFibGU8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZXNEYXRhID0gdGhpcy50ZW1wbGF0ZXNEYXRhTWFwW3RlbXBsYXRlVHlwZV1cblxuICAgIGlmICghdGVtcGxhdGVzRGF0YS50ZW1wbGF0ZXNPYnNlcnZhYmxlc1tjb2x1bW4uaWRdKSB7XG4gICAgICB0ZW1wbGF0ZXNEYXRhLnRlbXBsYXRlc09ic2VydmFibGVzW2NvbHVtbi5pZF0gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXMkLFxuICAgICAgICB0aGlzLnZpZXdUZW1wbGF0ZXMkLFxuICAgICAgICB0aGlzLnBhcmVudFRlbXBsYXRlcyQsXG4gICAgICBdKS5waXBlKFxuICAgICAgICBtYXAoKFt0LCB2dCwgcHRdKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gWy4uLih0ID8/IFtdKSwgLi4uKHZ0ID8/IFtdKSwgLi4uKHB0ID8/IFtdKV1cbiAgICAgICAgICBjb25zdCBjb2x1bW5UZW1wbGF0ZSA9IHRoaXMuZmluZFRlbXBsYXRlKFxuICAgICAgICAgICAgdGVtcGxhdGVzLFxuICAgICAgICAgICAgdGVtcGxhdGVzRGF0YS5pZFN1ZmZpeC5tYXAoKHN1ZmZpeCkgPT4gY29sdW1uLmlkICsgc3VmZml4KVxuICAgICAgICAgICk/LnRlbXBsYXRlXG4gICAgICAgICAgaWYgKGNvbHVtblRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uVGVtcGxhdGVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29sdW1uVHlwZVRlbXBsYXRlKHRlbXBsYXRlcywgY29sdW1uLmNvbHVtblR5cGUsIHRlbXBsYXRlVHlwZSlcbiAgICAgICAgfSksXG4gICAgICAgIGRlYm91bmNlVGltZSg1MClcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlc0RhdGEudGVtcGxhdGVzT2JzZXJ2YWJsZXNbY29sdW1uLmlkXVxuICB9XG5cbiAgcmVzb2x2ZUZpZWxkRGF0YShvYmplY3Q6IGFueSwga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShvYmplY3QsIGtleSlcbiAgfVxuXG4gIGdldFJvd09iamVjdEZyb21NdWx0aXNlbGVjdEl0ZW0odmFsdWU6IE11bHRpU2VsZWN0SXRlbSwgY29sdW1uOiBEYXRhVGFibGVDb2x1bW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgW2NvbHVtbi5pZF06IHZhbHVlLmxhYmVsLFxuICAgIH1cbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNhY3Rpb25Db2x1bW4gbGV0LXJvd09iamVjdD1cImxvY2FsUm93T2JqZWN0XCI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cImFueVJvd0FjdGlvbk9ic2VydmVkIHx8IHRoaXMuYWRkaXRpb25hbEFjdGlvbnMubGVuZ3RoID4gMCB8fCAoKHRoaXMub3ZlcmZsb3dBY3Rpb25zJCB8IGFzeW5jKSA/PyBbXSkubGVuZ3RoID4gMFwiXG4gID5cbiAgICA8dGRcbiAgICAgIGNsYXNzPVwiYWN0aW9uc1wiXG4gICAgICBwRnJvemVuQ29sdW1uXG4gICAgICBbZnJvemVuXT1cImZyb3plbkFjdGlvbkNvbHVtblwiXG4gICAgICBbYWxpZ25Gcm96ZW5dPVwiYWN0aW9uQ29sdW1uUG9zaXRpb25cIlxuICAgICAgW2F0dHIubmFtZV09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ2FjdGlvbi1jb2x1bW4tbGVmdCcgOiAnYWN0aW9uLWNvbHVtbi1yaWdodCdcIlxuICAgICAgW25nQ2xhc3NdPVwiKGZyb3plbkFjdGlvbkNvbHVtbiAmJiBhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnKSA/ICdib3JkZXItcmlnaHQtMScgOiAoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAncmlnaHQnKSA/ICdib3JkZXItbGVmdC0xJyA6ICcnXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1idXR0b24tcm93LXdyYXBwZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwidmlld1RhYmxlUm93T2JzZXJ2ZWQgJiYgKCF2aWV3QWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCB2aWV3QWN0aW9uVmlzaWJsZUZpZWxkKSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm9jeElmUGVybWlzc2lvbj1cInZpZXdQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXZpZXdBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCB2aWV3QWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCB2aWV3VGFibGVSb3dCdXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5WSUVXJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLlZJRVcnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1leWVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlld1Jvdyhyb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtdGFibGUtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImVkaXRUYWJsZVJvd09ic2VydmVkICYmICghZWRpdEFjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgZWRpdEFjdGlvblZpc2libGVGaWVsZCkpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJlZGl0UGVybWlzc2lvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFlZGl0QWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgZWRpdEFjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgZWRpdFRhYmxlUm93QnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuRURJVCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5FRElUJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktcGVuY2lsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXRSb3cocm93T2JqZWN0KVwiXG4gICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLXRhYmxlLWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJkZWxldGVUYWJsZVJvd09ic2VydmVkICYmICghZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBkZWxldGVBY3Rpb25WaXNpYmxlRmllbGQpKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiZGVsZXRlUGVybWlzc2lvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFkZWxldGVBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBkZWxldGVBY3Rpb25FbmFibGVkRmllbGQpXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciBkZWxldGVUYWJsZVJvd0J1dHRvblwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkRFTEVURScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5ERUxFVEUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVSb3cocm93T2JqZWN0KVwiXG4gICAgICAgICAgICBbYXR0ci5uYW1lXT1cIidkYXRhLXRhYmxlLWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgaW5saW5lQWN0aW9ucyQgfCBhc3luY1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWFjdGlvbi5hY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGFjdGlvbi5hY3Rpb25WaXNpYmxlRmllbGQpKVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiYWN0aW9uLnBlcm1pc3Npb25cIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aW9uLmNsYXNzZXNcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJhY3Rpb24uaWNvbiB8fCAnJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb24uY2FsbGJhY2socm93T2JqZWN0KVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZCB8fCAoISFhY3Rpb24uYWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgYWN0aW9uLmFjdGlvbkVuYWJsZWRGaWVsZCkpXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNWaXNpYmxlT3ZlcmZsb3dNZW51SXRlbXMocm93T2JqZWN0KSB8IGFzeW5jXCI+XG4gICAgICAgICAgPHAtbWVudSAjbWVudSBbbW9kZWxdPVwiKG92ZXJmbG93TWVudUl0ZW1zJCB8IGFzeW5jKSB8fCBbXVwiIFtwb3B1cF09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLW1lbnU+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgW2ljb25dPVwiJ3BpIHBpLWVsbGlwc2lzLXYnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPdmVyZmxvd01lbnUoJGV2ZW50LCBtZW51LCByb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLk1PUkVfQUNUSU9OUycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidPQ1hfREFUQV9UQUJMRS5NT1JFX0FDVElPTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC90ZD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2FjdGlvbkNvbHVtbkhlYWRlcj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiYW55Um93QWN0aW9uT2JzZXJ2ZWQgfHwgdGhpcy5hZGRpdGlvbmFsQWN0aW9ucy5sZW5ndGggPiAwICB8fCAoKHRoaXMub3ZlcmZsb3dBY3Rpb25zJCB8IGFzeW5jKSA/PyBbXSkubGVuZ3RoID4gMFwiXG4gID5cbiAgICA8dGhcbiAgICAgIHBGcm96ZW5Db2x1bW5cbiAgICAgIFtmcm96ZW5dPVwiZnJvemVuQWN0aW9uQ29sdW1uXCJcbiAgICAgIFthbGlnbkZyb3plbl09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvblwiXG4gICAgICBbbmdDbGFzc109XCIoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcpID8gJ2JvcmRlci1yaWdodC0xJyA6IChmcm96ZW5BY3Rpb25Db2x1bW4gJiYgYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCcpID8gJ2JvcmRlci1sZWZ0LTEnIDogJydcIlxuICAgICAgW2F0dHIubmFtZV09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ2FjdGlvbi1jb2x1bW4taGVhZGVyLWxlZnQnIDogJ2FjdGlvbi1jb2x1bW4taGVhZGVyLXJpZ2h0J1wiXG4gICAgPlxuICAgICAge3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlNfQ09MVU1OX05BTUUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC90aD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48cC10YWJsZVxuICAqbmdJZj1cImRpc3BsYXllZFBhZ2VTaXplJCB8IGFzeW5jIGFzIGRpc3BsYXllZFBhZ2VTaXplXCJcbiAgW3ZhbHVlXT1cIihkaXNwbGF5ZWRSb3dzJCB8IGFzeW5jKSA/PyBbXVwiXG4gIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxuICBbcGFnaW5hdG9yXT1cInBhZ2luYXRvclwiXG4gIFtmaXJzdF09XCJwYWdlICogZGlzcGxheWVkUGFnZVNpemVcIlxuICAob25QYWdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgW3Jvd3NdPVwiZGlzcGxheWVkUGFnZVNpemVcIlxuICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIlxuICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie3sgKHRvdGFsUmVjb3Jkc09uU2VydmVyID8gY3VycmVudFBhZ2VTaG93aW5nV2l0aFRvdGFsT25TZXJ2ZXJLZXkgOiBjdXJyZW50UGFnZVNob3dpbmdLZXkpIHwgdHJhbnNsYXRlOnBhcmFtcyB9fVwiXG4gIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiKGRpc3BsYXllZFBhZ2VTaXplcyQgfCBhc3luYykgPz8gW11cIlxuICBpZD1cImRhdGFUYWJsZV97e25hbWV9fVwiXG4gIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gIFtzZWxlY3Rpb25dPVwiKHNlbGVjdGVkUm93cyQgfCBhc3luYykgPz8gW11cIlxuICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgcGFnaW5hdG9yRHJvcGRvd25BcHBlbmRUbz1cImJvZHlcIlxuPlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgPHRyPlxuICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDRyZW1cIiBzY29wZT1cImNvbFwiICpuZ0lmPVwic2VsZWN0aW9uQ2hhbmdlZE9ic2VydmVkXCI+XG4gICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3g+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XG4gICAgICA8L3RoPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCc7XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW5IZWFkZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIj5cbiAgICAgICAgPHRoICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlIHx8IGNvbHVtbi5maWx0ZXJhYmxlOyBlbHNlIHNpbXBsZUhlYWRlclwiIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBpZD1cInt7Y29sdW1uLmlkfX0taGVhZGVyLW5hbWVcIj57eyBjb2x1bW4ubmFtZUtleSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1idXR0b24taGVhZGVyLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInBpIHNvcnRCdXR0b25cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5waS1zb3J0LWFsdF09XCIoY29sdW1uPy5pZCA9PT0gc29ydENvbHVtbiAmJiBzb3J0RGlyZWN0aW9uID09PSAnTk9ORScpIHx8IGNvbHVtbj8uaWQgIT09IHNvcnRDb2x1bW5cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5waS1zb3J0LWFtb3VudC11cF09XCJjb2x1bW4/LmlkID09PSBzb3J0Q29sdW1uICYmIHNvcnREaXJlY3Rpb24gPT09ICdBU0NFTkRJTkcnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MucGktc29ydC1hbW91bnQtZG93bl09XCJjb2x1bW4/LmlkID09PSBzb3J0Q29sdW1uICYmIHNvcnREaXJlY3Rpb24gPT09ICdERVNDRU5ESU5HJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU29ydENvbHVtbkNsaWNrKGNvbHVtbi5pZClcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoc29ydEljb25UaXRsZShjb2x1bW4uaWQpIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsgY29sdW1uOiAoY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGUpLCBkaXJlY3Rpb246IChzb3J0RGlyZWN0aW9uVG9UaXRsZShjb2x1bW5OZXh0U29ydERpcmVjdGlvbihjb2x1bW4uaWQpKSB8IHRyYW5zbGF0ZSl9KVwiXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlck11bHRpU2VsZWN0XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJhYmxlXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCIoY3VycmVudEZpbHRlck9wdGlvbnMkIHwgYXN5bmMpIHx8IFtdXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoY3VycmVudFNlbGVjdGVkRmlsdGVycyQgfCBhc3luYykgfHwgW11cIlxuICAgICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIGVtcHR5RmlsdGVyTWVzc2FnZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5FTVBUWV9GSUxURVJfTUVTU0FHRScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5U2VsZWN0ZWRMYWJlbF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Jlc2V0RmlsdGVyT25IaWRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkZpbHRlckNoYW5nZShjb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSWNvblwiXG4gICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkZpbHRlckNsaWNrKGNvbHVtbilcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInT0NYX0RBVEFfVEFCTEUuRklMVEVSX1RJVExFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoJ09DWF9EQVRBX1RBQkxFLkZJTFRFUl9BUklBX0xBQkVMJyB8IHRyYW5zbGF0ZTogeyBjb2x1bW46IGNvbHVtbi5uYW1lS2V5IHwgdHJhbnNsYXRlfSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInNlbGVjdGVkSXRlbXNcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGlcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MucGktZmlsdGVyXT1cIiEoKGZpbHRlckFtb3VudHMkIHwgYXN5bmMpIHx8IHt9KVtjb2x1bW4uaWRdXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLWZpbHRlci1maWxsXT1cIigoZmlsdGVyQW1vdW50cyQgfCBhc3luYykgfHwge30pW2NvbHVtbi5pZF0gPiAwXCJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldFRlbXBsYXRlKGNvbHVtbiwgVGVtcGxhdGVUeXBlLkZJTFRFUkNFTEwpIHwgYXN5bmMgYXMgdGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgIHJvd09iamVjdDogZ2V0Um93T2JqZWN0RnJvbU11bHRpc2VsZWN0SXRlbSh2YWx1ZSwgY29sdW1uKSxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzaW1wbGVIZWFkZXI+XG4gICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3sgY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCc7XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW5IZWFkZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdHI+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvd09iamVjdD5cbiAgICA8dHI+XG4gICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWRcIj5cbiAgICAgICAgPHAtdGFibGVDaGVja2JveFxuICAgICAgICAgIFt2YWx1ZV09XCJyb3dPYmplY3RcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXNlbGVjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIHNlbGVjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICA+PC9wLXRhYmxlQ2hlY2tib3g+XG4gICAgICA8L3RkPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCc7XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW47IGNvbnRleHQ6IHtsb2NhbFJvd09iamVjdDogcm93T2JqZWN0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgICAgIF9jZWxsID8gX2NlbGw6IGRlZmF1bHRDZWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgcm93T2JqZWN0OiByb3dPYmplY3QsXG4gICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAncmlnaHQnO1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQ29sdW1uOyBjb250ZXh0OiB7bG9jYWxSb3dPYmplY3Q6IHJvd09iamVjdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdHI+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICA8dHI+XG4gICAgICA8dGQgW2NvbFNwYW5dPVwiY29sdW1ucy5sZW5ndGggKyAoKGFueVJvd0FjdGlvbk9ic2VydmVkIHx8IHRoaXMuYWRkaXRpb25hbEFjdGlvbnMubGVuZ3RoID4gMCkgPyAxIDogMClcIj5cbiAgICAgICAge3sgZW1wdHlSZXN1bHRzTWVzc2FnZSB8fCAoXCJPQ1hfREFUQV9UQUJMRS5FTVBUWV9SRVNVTFRcIiB8IHRyYW5zbGF0ZSkgfX1cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC10YWJsZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbCBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJnZXRUZW1wbGF0ZShjb2x1bW4sIFRlbXBsYXRlVHlwZS5DRUxMKSB8IGFzeW5jIGFzIHRlbXBsYXRlXCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiXG4gICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICByb3dPYmplY3Q6IHJvd09iamVjdCxcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgfVwiXG4gID5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdFN0cmluZ0NlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8bmctY29udGFpbmVyPiB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKX19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHROdW1iZXJDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCkgfCBudW1iZXIgfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdEN1c3RvbUNlbGxcIiBsZXQtcm93T2JqZWN0PVwicm93T2JqZWN0XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPiA8L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdERhdGVDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcmVzb2x2ZUZpZWxkRGF0YShyb3dPYmplY3QsIGNvbHVtbi5pZCl8IGRhdGU6ICdtZWRpdW0nIH19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImRlZmF1bHRSZWxhdGl2ZURhdGVDZWxsXCIgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj5cbiAgICB7eyAnT0NYX0RBVEFfVEFCTEUuRURJVEVEJyB8IHRyYW5zbGF0ZSB9fSB7eyByZXNvbHZlRmllbGREYXRhKHJvd09iamVjdCwgY29sdW1uLmlkKSB8IHRpbWVhZ28gfX1cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZGVmYXVsdFRyYW5zbGF0aW9uS2V5Q2VsbFwiIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJlc29sdmVGaWVsZERhdGEocm93T2JqZWN0LCBjb2x1bW4uaWQpIHwgdHJhbnNsYXRlIH19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==