@unifylib/ui-lib 1.2.36 → 1.2.37

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.
@@ -91,6 +91,7 @@ export class BaseTableComponent extends BaseUtils {
91
91
  this.selectedColumn = new EventEmitter();
92
92
  this.listActionClicked = new EventEmitter();
93
93
  this.pendingViewModeChanged = new EventEmitter();
94
+ this.filtersApplied = new EventEmitter();
94
95
  this.showDialog = new EventEmitter();
95
96
  this.selectedRowIndex = -1;
96
97
  this.noDataFound = false;
@@ -581,6 +582,7 @@ export class BaseTableComponent extends BaseUtils {
581
582
  }
582
583
  applyPendingFilters() {
583
584
  this.advancedAppliedFilter = this.pendingFilters || [];
585
+ this.filtersApplied.emit(this.advancedAppliedFilter);
584
586
  this.resetPaginationForFilterChange();
585
587
  this.loadData();
586
588
  }
@@ -637,7 +639,7 @@ export class BaseTableComponent extends BaseUtils {
637
639
  return super.labelKeyByValue(column, row);
638
640
  }
639
641
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseTableComponent, deps: [{ token: i1.BackendService }, { token: i2.TranslateService }, { token: i3.ShareDataService }, { token: i4.BreakpointObserver }, { token: 'securityManager' }, { token: i5.Router }, { token: i6.LiveAnnouncer }], target: i0.ɵɵFactoryTarget.Component }); }
640
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BaseTableComponent, isStandalone: true, selector: "app-base-table", inputs: { filterFields: "filterFields", noDataFoundSvgPath: "noDataFoundSvgPath", noDataFoundTitle: "noDataFoundTitle", noDataFoundSubtitle: "noDataFoundSubtitle", noResultSvgPath: "noResultSvgPath", noResultTitle: "noResultTitle", noResultSubtitle: "noResultSubtitle", pageInfo: "pageInfo", enablePagination: "enablePagination", mobilePageSize: "mobilePageSize", mobileLoadMoreIncrement: "mobileLoadMoreIncrement", data: "data", listAction: "listAction", extraActions: "extraActions", buttonsDisplayMode: "buttonsDisplayMode", columns: "columns", filters: "filters", pathParam: "pathParam", extraButton: "extraButton", enforceRefresh: "enforceRefresh", isPending: "isPending", trigger: "trigger", reportRequest: "reportRequest", separateEndpointData: "separateEndpointData", manageablePages: "manageablePages", totalPagesCount: "totalPagesCount", currentPageIndex: "currentPageIndex", customizedData: "customizedData" }, outputs: { buttonClicked: "buttonClicked", pageChange: "pageChange", userAction: "userAction", hyperLinkAction: "hyperLinkAction", extraAction: "extraAction", selectedColumn: "selectedColumn", listActionClicked: "listActionClicked", pendingViewModeChanged: "pendingViewModeChanged", showDialog: "showDialog", clickRoutePage: "clickRoutePage" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex-column baseTable\">\n <div class=\"flex-row flex-100\" >\n <div class=\"flex-column align-start flex-100\" style=\"width: 100%;\">\n <app-title-bar\n [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\n [subTitle]=\"(pageInfo.hideTitle || pageInfo.hideSubtitle) ? '' : pageInfo.labelsSection+'.subtitle'\"\n [titleMode]=\"''\"\n [pageInfo]=\"pageInfo\"\n [newAction]=\"showAddNew()\"\n [showExtractButton]=\"!pageInfo.hideExtractButton\"\n [draftSupported]=\"pageInfo.draftSupported\"\n [isPending]=\"isPending\"\n [onViewModeChange]=\"switchViewMode.bind(this)\"\n [buttons]=\"extraActions\"\n [buttonsDisplayMode]=\"buttonsDisplayMode\"\n (newActionClicked)=\"onAddNewAction($event)\"\n (extractReport)=\"extractReport($event)\"\n (viewModeChanged)=\"onViewModeChangedReceived($event)\"\n (buttonClicked)=\"buttonClicked.emit($event)\"\n [totalElements]=\"pageInfo.hideTitle ? undefined : totalElements\">\n </app-title-bar>\n </div>\n </div>\n\n <div class=\"filter-row\" *ngIf=\"!pageInfo.hideAdvancedFilter\">\n <app-filter-builder\n *ngIf=\"!pageInfo.hideAdvancedFilter\"\n [pageInfo]=\"pageInfo\"\n [columns]=\"columns\"\n [filterFields]=\"filterFields\"\n [pendingFilters]=\"pendingFilters\"\n [showExportButton]=\"!pageInfo.hideExtractButton\"\n [exportDisabled]=\"noDataFound || !dataSource?.data?.length\"\n (filterInformation)=\"storePendingFilters($event)\"\n (isEmpty)=\"handleFilterEmpty($event)\"\n (applyFilter)=\"applyPendingFilters()\"\n (sortByClicked)=\"handleSortClick($event)\"\n (exportClicked)=\"extractReport($event)\">\n </app-filter-builder>\n\n <div class=\"button-group\" *ngIf=\"!pageInfo.hideExtractButton\">\n <button *ngIf=\"!pageInfo.hideExtractButton\"\n mat-flat-button\n type=\"button\"\n [matMenuTriggerFor]=\"exportMenu\"\n class=\"btn-export\"\n [disabled]=\"noDataFound || !dataSource?.data?.length\"\n [attr.aria-label]=\"'export' | translate\"\n [attr.aria-haspopup]=\"true\"\n >\n <div class=\"button-text\">\n <mat-icon>file_export</mat-icon>\n <span>{{ 'export' | translate }}</span>\n <mat-icon class=\"arrow-icon\">keyboard_arrow_down</mat-icon>\n </div>\n </button>\n\n <mat-menu #exportMenu=\"matMenu\">\n <button mat-menu-item (click)=\"extractReport('pdf')\">PDF</button>\n <button mat-menu-item (click)=\"extractReport('xlsx')\">Excel</button>\n <button mat-menu-item (click)=\"extractReport('csv')\">CSV</button>\n </mat-menu>\n\n </div>\n </div>\n\n\n <div class=\"flex-row flex-100 baseTable__detailsColumn\">\n <div class=\"flex-100\">\n <div class=\"flex-row flex-100 mainTable\">\n <div\n class=\"table-container\"\n role=\"table\"\n [attr.aria-label]=\"\n pageInfo.labelsSection && !pageInfo.hideTitle\n ? (pageInfo.labelsSection + '.list_title' | translate)\n : null\n \">\n <div class=\"table-header\" [attr.data-sort]=\"sortState\" role=\"row\">\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\n class=\"table-header-cell\"\n role=\"columnheader\"\n [attr.aria-sort]=\"getColumnAriaSort(columnProp)\"\n [attr.tabindex]=\"getColumn(columnProp)?.enableSorting ? 0 : null\"\n [class.sortable]=\"getColumn(columnProp)?.enableSorting\"\n [class.first-cell]=\"i === 0\"\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\n [class.has-width]=\"getColumn(columnProp)?.width\"\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\"\n (click)=\"getColumn(columnProp)?.enableSorting && handleSortClick(columnProp)\"\n (keydown)=\"onSortHeaderKeydown($event, columnProp)\">\n <div class=\"table-header-content\">\n <span class=\"table-header-label\">{{ labelKey(getColumn(columnProp)) | translate }}</span>\n <ng-container *ngIf=\"getColumn(columnProp)?.enableSorting\">\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'asc'\"\n class=\"sort-icon sort-asc\">arrow_drop_up</mat-icon>\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'desc'\"\n class=\"sort-icon sort-desc\">arrow_drop_down</mat-icon>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"table-body\" role=\"rowgroup\">\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\n class=\"table-row\"\n role=\"row\"\n [attr.tabindex]=\"-1\"\n [attr.id]=\"'table-row-' + (row?.id || row?.key || '')\"\n [ngClass]=\"{\n 'table-row--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\n 'table-row--dark-highlight': isDarkHighlight(row)\n }\"\n (auxclick)=\"openNewTab(row)\"\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\n class=\"table-cell\"\n role=\"cell\"\n [class.first-cell]=\"i === 0\"\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\n [class.has-width]=\"getColumn(columnProp)?.width\"\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\">\n <ng-container [ngSwitch]=\"getColumn(columnProp)?.type\">\n <ng-container *ngSwitchCase=\"'workflowStatus'\">\n <button mat-button type=\"button\" class=\"wfStatus {{ getStatusDescription(row)}}\" [attr.id]=\"'table-btn-wf-'+columnProp+'-'+(row.id || row.key || '')\" [attr.tabindex]=\"-1\">{{ getStatusDescription(row) }}</button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hyper-text'\">\n <span\n *ngIf=\"shouldRenderAsHyperLink(row); else plainHyperText\"\n class=\"mat-mdc-form-field-label hyper-link\"\n [attr.tabindex]=\"-1\"\n (click)=\"hyperLinkClicked(columnProp, row)\">\n {{ extractFieldName(row, columnProp) }}\n </span>\n <ng-template #plainHyperText>\n <span class=\"mat-mdc-form-field-label\">{{ extractFieldName(row, columnProp) }}</span>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'button'\">\n <button *ngIf=\"shouldShowButton(row)\" mat-button type=\"button\" class=\"primary\" (click)=\"$event.stopPropagation(); actionButtonClicked(columnProp, row)\" [attr.id]=\"'table-btn-action-'+columnProp\">\n {{ labelKey(getColumn(columnProp)) + '_title' | translate }}\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon [ngClass]=\"{\n 'mainTable__td__icon-green': row[columnProp] === 'pass',\n 'mainTable__td__icon-orange': row[columnProp] === 'warning',\n 'mainTable__td__icon-red': row[columnProp] === 'error'\n }\"\n [attr.aria-label]=\"getIconAriaLabelKey(row[columnProp]) | translate\">\n {{ getIcon(row[columnProp]) }}\n </mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <mat-checkbox class=\"primary\" [tabIndex]=\"-1\" [checked]=\"row[columnProp]\" (click)=\"$event.stopPropagation();actionCheckedClicked(columnProp,row)\"></mat-checkbox>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'stateType'\">\n <button mat-button type=\"button\" class=\"stateType {{ row[columnProp]}}\" [attr.id]=\"'table-btn-state-'+columnProp\" [attr.tabindex]=\"-1\">{{ labelKeyByValue(getColumn(columnProp), row) | translate}}</button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{ extractFieldName(row, columnProp) | date:'dd/MM/yyyy':'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'croppedText'\">\n {{ getCroppedText(extractFieldName(row, columnProp), row[getColumn(columnProp)?.width]) }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'download'\">\n <mat-icon class=\"mainTable__td__icon-blue\"\n [attr.aria-label]=\"'BASE_TABLE.downloadAction' | translate\">system_update_alt</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'onOff'\">\n <mat-icon *ngIf=\"row[columnProp] === null\" class=\"mainTable__td__icon-darkorange\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(null) | translate\">flag</mat-icon>\n <mat-icon *ngIf=\"row[columnProp] === false\" class=\"mainTable__td__icon-red\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(false) | translate\">flag</mat-icon>\n <mat-icon *ngIf=\"row[columnProp] === true\" class=\"mainTable__td__icon-green\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(true) | translate\">flag</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'status'\">\n <span *ngIf=\"row[columnProp] === null || row[columnProp] === false\">\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'InActive' | translate }}\n </span>\n <span *ngIf=\"row[columnProp] === true\">\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'Active' | translate }}\n </span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'info'\">\n <button\n mat-icon-button\n type=\"button\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"'BASE_TABLE.rowDetails' | translate\"\n (click)=\"$event.stopPropagation();emitEvent(row)\"\n [attr.id]=\"'table-btn-info-'+row.id\">\n <mat-icon aria-hidden=\"true\">info</mat-icon>\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'netAmount'\">\n <div class=\"mainTable__td__currency\" style=\"display:inline-block;\">{{ row[getColumn(columnProp)?.currency] }}</div>\n <span class=\"mainTable__td__property\" style=\"display:inline-block; margin-left:6px; margin-right:6px;\">\n {{ extractFieldName(row, columnProp) | currency:'':'' }}</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'localDateTime'\">\n {{ extractFieldName(row, columnProp) | date : extractFormat(getColumn(columnProp)):'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <small><sup class=\"mainTable__td__currency\">{{row[getColumn(columnProp)?.currency]}}</sup></small>\n {{ extractFieldName(row, columnProp) | number : (getColumn(columnProp)?.digitInfo || '1.3-5') }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'listAction'\">\n <app-button-actions\n [row]=\"row\"\n [buttonsAction]=\"getColumn(columnProp)?.viewType === 'buttonsAction'\"\n [listAction]=\"listAction\"\n [actions]=\"listAction\"\n (clickedButton)=\"actionListClicked($event,row)\">\n </app-button-actions>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ul class=\"mainTable__td__list\">\n <li *ngFor=\"let item of getListItems(row, columnProp)\">{{ item }}</li>\n </ul>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"getColumn(columnProp)?.translate; else noTranslate\">\n <span\n [attr.tabindex]=\"-1\"\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\">\n {{ pageInfo.labelsSection + \".\" + extractFieldName(row, columnProp) | translate }}\n </span>\n </ng-container>\n <ng-template #noTranslate>\n <span\n [attr.tabindex]=\"-1\"\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\"\n [innerText]='extractFieldName(row, columnProp)'></span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Mobile Card View -->\n <div class=\"mobile-cards-container\">\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\n class=\"mobile-card\"\n [attr.id]=\"'mobile-card-' + (row?.id || row?.key || '')\"\n [ngClass]=\"{\n 'mobile-card--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\n 'mobile-card--dark-highlight': isDarkHighlight(row)\n }\"\n (auxclick)=\"openNewTab(row)\"\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\n\n <!-- Mobile Card Header: ID/Name and Status -->\n <div class=\"mobile-card__header\">\n <div class=\"mobile-card__header-id\">\n <span class=\"mobile-card__id-text\">{{ extractFieldName(row, getMobileCardIdColumn()?.property || 'id') }}</span>\n </div>\n <div class=\"mobile-card__header-status\" *ngIf=\"getMobileCardStatusColumn()\">\n <button mat-button class=\"stateType {{ row[getMobileCardStatusColumn()?.property]}}\"\n [attr.id]=\"'mobile-btn-state-'+getMobileCardStatusColumn()?.property\">\n {{ labelKeyByValue(getMobileCardStatusColumn(), row) | translate}}\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"mobile-card__divider\"></div>\n\n <!-- Mobile Card Body: Other columns -->\n <div class=\"mobile-card__body\">\n <div *ngFor=\"let column of getMobileCardColumns()\" class=\"mobile-card__row\">\n <div class=\"mobile-card__row-label\">\n <span>{{ labelKey(column) | translate }} :</span>\n </div>\n <div class=\"mobile-card__row-value\">\n <ng-container [ngSwitch]=\"column.type\">\n <ng-container *ngSwitchCase=\"'stateType'\">\n <button mat-button class=\"stateType {{ row[column.property]}}\"\n [attr.id]=\"'mobile-btn-state-'+column.property\">\n {{ labelKeyByValue(column, row) | translate}}\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{ extractFieldName(row, column.property) | date:'dd/MM/yyyy':'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'netAmount'\">\n <span class=\"mobile-card__amount-currency\">{{ row[column.currency] }}</span>\n <span class=\"mobile-card__amount-value\">{{ extractFieldName(row, column.property) | currency:'':'' }}</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'localDateTime'\">\n {{ extractFieldName(row, column.property) | date : extractFormat(column):'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <small><sup class=\"mainTable__td__currency\">{{row[column.currency]}}</sup></small>\n {{ extractFieldName(row, column.property) | number : (column.digitInfo || '1.3-5') }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ul class=\"mainTable__td__list\">\n <li *ngFor=\"let item of getListItems(row, column.property)\">{{ item }}</li>\n </ul>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"column.translate; else noTranslate\">\n <span>{{ pageInfo.labelsSection + \".\" + extractFieldName(row, column.property) | translate }}</span>\n </ng-container>\n <ng-template #noTranslate>\n <span [innerText]='extractFieldName(row, column.property)'></span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <!-- Mobile Card Actions -->\n <div class=\"mobile-card__actions\" *ngIf=\"listAction && listAction.length > 0\">\n <app-button-actions\n [row]=\"row\"\n [buttonsAction]=\"true\"\n [listAction]=\"listAction\"\n [actions]=\"listAction\"\n (clickedButton)=\"actionListClicked($event,row)\">\n </app-button-actions>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"noDataFound\" class=\"dataNotFound flex-column\">\n <img *ngIf=\"getDisplaySvgPath()\" [src]=\"getDisplaySvgPath()\" class=\"dataNotFound__icon\" alt=\"No data found\" />\n <span class=\"dataNotFound__title\">{{ getDisplayTitle() | translate}}</span>\n <span class=\"dataNotFound__subtitle\">{{ getDisplaySubtitle() | translate}}</span>\n </div>\n\n\n <div *ngIf=\"(dataSource.data?.length > 0 || customizedData) && !pageInfo.hidePagination\" class=\"main-pagination flex-row\">\n <ng-container *ngIf=\"enablePagination\">\n <div class=\"flex-column flex-100\">\n <app-paginator\n [currentPage]=\"pageIndex\"\n [totalItems]=\"totalElements\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"[5, 10, 25, 50]\"\n [mobileLoadMoreIncrement]=\"mobileLoadMoreIncrement\"\n [displayedItems]=\"mobileDisplayedItems || dataSource.data.length\"\n (pageChange)=\"onPageChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n (loadMore)=\"onLoadMore($event)\">\n </app-paginator>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;max-width:100%;box-sizing:border-box;container-type:inline-size;container-name:base-table}.baseTable{width:100%!important;max-width:100%!important;box-sizing:border-box}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column;width:100%;max-width:100%;box-sizing:border-box}.flex-100{flex:1 1 100%}.flex-49{flex:0 0 49%}.flex-50{flex:0 0 50%}.align-start{justify-content:flex-start;align-items:flex-start}.align-center{justify-content:center;align-items:center}.align-end{justify-content:flex-end;align-items:flex-end}.gap-0{gap:0}.gap-5{gap:5px}.gap-10{gap:10px}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:auto;min-height:280px;text-align:center;margin-top:0;padding:40px 0}.dataNotFound__icon{height:auto;width:auto;max-width:200px;max-height:200px;margin-bottom:8px;object-fit:contain}.dataNotFound__title{color:#6a6a6a;font-size:20px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:20px;font-weight:400}@media (max-width: 960px){.flex-column-sm{flex-direction:column}.align-center-sm{justify-content:center;align-items:flex-start}}.filter-row{display:flex!important;flex-direction:row!important;align-items:center!important;width:100%!important;max-width:100%!important;gap:16px!important;box-sizing:border-box;margin-top:20px;margin-bottom:16px;padding:0;flex-wrap:nowrap!important;min-width:0!important;min-height:48px!important;overflow:visible!important}.filter-row app-filter-builder{flex:1 1 auto!important;min-width:0!important;max-width:none!important;width:auto!important;flex-shrink:1!important;display:flex!important;align-items:center!important;overflow:visible!important}@container base-table (min-width: 769px) and (max-width: 900px){.filter-row{align-items:flex-end!important}}.button-group{display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-end;gap:8px!important;flex-shrink:0!important;flex-grow:0!important;flex-basis:auto!important;height:46px!important;white-space:nowrap!important;z-index:1!important}.mainTable{margin-top:0!important}.btn-apply-filter{background:#fff!important;border:1px solid #3e627b!important;border-radius:8px!important;height:46px!important;min-width:120px!important;padding:0 16px!important;box-shadow:none!important}.btn-apply-filter .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-apply-filter mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-apply-filter span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-apply-filter:hover{background:#fafafa!important}.btn-export{background:#fff!important;border:1px solid #0d4261!important;border-radius:8px!important;height:46px!important;min-width:109px!important;padding:0 16px!important;box-shadow:none!important;margin-bottom:7px!important}.btn-export .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-export mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-export .arrow-icon{font-size:16px;width:16px;height:16px;margin-left:0}.btn-export span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-export:hover:not(:disabled){background:#fafafa!important}.btn-export:disabled,.btn-export.mat-mdc-button-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}@container base-table (min-width: 769px) and (max-width: 900px){.filter-row .btn-export{margin-bottom:0!important}}.arrow-icon{font-size:16px;width:16px;height:16px}@media (max-width: 1024px){.button-group{width:auto}}@media (max-width: 768px){.filter-row{flex-direction:column;align-items:stretch}.button-group{display:none!important}.btn-export{width:100%}}.table-container{width:100%;overflow:hidden;background:#f7f7f7;box-sizing:border-box;display:flex;flex-direction:column}.table-header{display:flex;align-items:center;background:#f7f7f7;border:1px solid #f0eeee;max-height:48px;height:48px;margin-bottom:16px;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-header-cell{display:flex;align-items:center;max-height:48px;height:48px;padding:8px 16px;flex:1;min-width:100px;position:sticky;top:0;background:none;z-index:10;box-sizing:border-box}.table-header-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-header-cell:last-child{border-right:none}.table-header-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-header-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-header-cell.actions-cell{justify-content:center;text-align:center}.table-header-cell.actions-cell .table-header-content{justify-content:center}.table-header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.table-header-cell.sortable:hover{background:#fafafa}.table-header-content{display:flex;align-items:center;gap:8px;width:100%}.table-header-label{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.sort-icon{font-size:18px;width:18px;height:18px;color:#5c5c5c;display:flex;align-items:center;justify-content:center;transition:color .2s}.sort-icon.sort-asc,.sort-icon.sort-desc{color:#0d4261}.table-body{display:flex;flex-direction:column;gap:8px;background:#f7f7f7}.table-row{display:flex;align-items:center;min-height:48px;background:#fff;border-bottom:1px solid #f0eeee;transition:background-color .2s;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-row:hover{background:#fafafa}.table-row--highlight{background:#f0f8ff}.table-row--dark-highlight{background:#e8f4f8}.table-row .table-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-row .table-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}:host-context([dir=rtl]) .table-row,:host-context(body.rtl) .table-row{overflow:visible;align-items:center}:host-context([dir=rtl]) .table-cell:not(.actions-cell),:host-context(body.rtl) .table-cell:not(.actions-cell){overflow:visible;align-items:center;line-height:1.7;padding-top:10px;padding-bottom:10px}:host-context([dir=rtl]) .table-cell:not(.actions-cell) span,:host-context(body.rtl) .table-cell:not(.actions-cell) span{display:inline;overflow:visible;line-height:1.7;-webkit-line-clamp:unset;line-clamp:unset}.table-cell{display:flex;align-items:center;min-height:48px;max-height:none;padding:8px 16px;flex:1;min-width:100px;font-family:Lusail,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#000;box-sizing:border-box}.table-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-cell:last-child{border-right:none}.table-cell.actions-cell{justify-content:center;text-align:center}.mobile-cards-container{display:none;flex-direction:column;gap:12px;width:100%;box-sizing:border-box}.mobile-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:12px 20px;display:flex;flex-direction:column;gap:4px;cursor:pointer;transition:background-color .2s;box-sizing:border-box;width:100%}.mobile-card:hover{background:#fafafa}.mobile-card--highlight{background:#f0f8ff}.mobile-card--dark-highlight{background:#e8f4f8}.mobile-card__header{display:flex;align-items:center;justify-content:space-between;height:48px;width:100%;box-sizing:border-box}.mobile-card__header-id{display:flex;flex-direction:column;justify-content:center;flex:1}.mobile-card__id-text{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;text-align:left;white-space:nowrap}.mobile-card__header-status{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0}.mobile-card__divider{height:.347px;width:100%;background:#f0eeee;margin:0;flex-shrink:0}.mobile-card__body{display:flex;flex-direction:column;gap:0;width:100%;box-sizing:border-box}.mobile-card__row{display:flex;align-items:center;justify-content:space-between;height:40px;width:100%;overflow:hidden;box-sizing:border-box}.mobile-card__row-label{display:flex;flex-direction:column;justify-content:center;flex-shrink:0}.mobile-card__row-label span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__row-value{display:flex;flex-direction:column;justify-content:center;flex-shrink:0;text-align:right}.mobile-card__row-value span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__amount-currency{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;display:inline-block}.mobile-card__amount-value{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;display:inline-block;margin-left:6px;margin-right:6px}.mobile-card__actions{border-top:1px solid #f0eeee;padding-top:8px;margin-top:4px;display:flex;align-items:center;justify-content:center;min-height:48px;max-height:48px;width:100%;box-sizing:border-box}@media (max-width: 768px){.table-container{display:none}.mobile-cards-container{display:flex}}@media (min-width: 769px){.mobile-cards-container{display:none}.table-container{display:flex}}:host ::ng-deep button.mat-mdc-button.stateType,:host ::ng-deep button.mdc-button.stateType{white-space:normal!important;height:auto!important;min-height:28px!important;max-width:100%!important;align-items:center!important;justify-content:center!important;cursor:default!important}:host ::ng-deep button.mat-mdc-button.stateType .mdc-button__label,:host ::ng-deep button.mdc-button.stateType .mdc-button__label{white-space:normal!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:2!important;line-clamp:2!important;overflow:hidden!important;word-break:break-word!important;line-height:1.25!important;max-width:100%!important;text-align:center!important}@media (max-width: 450px){.mobile-card__header{flex-direction:column;justify-content:flex-start;height:auto;width:100%;box-sizing:border-box;gap:8px}}.mainTable__td__list{margin:4px 0;padding:4px 8px 4px 1.25rem;list-style-type:disc}.mainTable__td__list li{word-break:break-word;line-height:1.35;padding:2px 0}.mainTable__td__list li+li{margin-top:2px}.table-cell:has(.mainTable__td__list){align-items:flex-start;padding-top:8px;padding-bottom:8px}.mobile-card__row-value:has(.mainTable__td__list){align-items:flex-start;padding:4px 0}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "ngmodule", type: NgxPaginationModule }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ButtonActionsComponent, selector: "app-button-actions", inputs: ["actions", "disabled", "buttonsAction", "listAction", "row"], outputs: ["clickedButton"] }, { kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "pageInfo", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons", "buttonsDisplayMode", "draftSupported", "isPending", "onViewModeChange"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked", "viewModeChanged"] }, { kind: "component", type: PaginatorComponent, selector: "app-paginator", inputs: ["currentPage", "totalItems", "pageSize", "pageSizeOptions", "mobileLoadMoreIncrement", "displayedItems"], outputs: ["pageChange", "pageSizeChange", "loadMore"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: FilterBuilderComponent, selector: "app-filter-builder", inputs: ["columns", "isChecked", "filterFields", "pageInfo", "pendingFilters", "showExportButton", "exportDisabled"], outputs: ["filterInformation", "isEmpty", "applyFilter", "sortByClicked", "exportClicked"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }], animations: [] }); }
642
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BaseTableComponent, isStandalone: true, selector: "app-base-table", inputs: { filterFields: "filterFields", noDataFoundSvgPath: "noDataFoundSvgPath", noDataFoundTitle: "noDataFoundTitle", noDataFoundSubtitle: "noDataFoundSubtitle", noResultSvgPath: "noResultSvgPath", noResultTitle: "noResultTitle", noResultSubtitle: "noResultSubtitle", pageInfo: "pageInfo", enablePagination: "enablePagination", mobilePageSize: "mobilePageSize", mobileLoadMoreIncrement: "mobileLoadMoreIncrement", data: "data", listAction: "listAction", extraActions: "extraActions", buttonsDisplayMode: "buttonsDisplayMode", columns: "columns", filters: "filters", pathParam: "pathParam", extraButton: "extraButton", enforceRefresh: "enforceRefresh", isPending: "isPending", trigger: "trigger", reportRequest: "reportRequest", separateEndpointData: "separateEndpointData", manageablePages: "manageablePages", totalPagesCount: "totalPagesCount", currentPageIndex: "currentPageIndex", customizedData: "customizedData" }, outputs: { buttonClicked: "buttonClicked", pageChange: "pageChange", userAction: "userAction", hyperLinkAction: "hyperLinkAction", extraAction: "extraAction", selectedColumn: "selectedColumn", listActionClicked: "listActionClicked", pendingViewModeChanged: "pendingViewModeChanged", filtersApplied: "filtersApplied", showDialog: "showDialog", clickRoutePage: "clickRoutePage" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex-column baseTable\">\n <div class=\"flex-row flex-100\" >\n <div class=\"flex-column align-start flex-100\" style=\"width: 100%;\">\n <app-title-bar\n [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\n [subTitle]=\"(pageInfo.hideTitle || pageInfo.hideSubtitle) ? '' : pageInfo.labelsSection+'.subtitle'\"\n [titleMode]=\"''\"\n [pageInfo]=\"pageInfo\"\n [newAction]=\"showAddNew()\"\n [showExtractButton]=\"!pageInfo.hideExtractButton\"\n [draftSupported]=\"pageInfo.draftSupported\"\n [isPending]=\"isPending\"\n [onViewModeChange]=\"switchViewMode.bind(this)\"\n [buttons]=\"extraActions\"\n [buttonsDisplayMode]=\"buttonsDisplayMode\"\n (newActionClicked)=\"onAddNewAction($event)\"\n (extractReport)=\"extractReport($event)\"\n (viewModeChanged)=\"onViewModeChangedReceived($event)\"\n (buttonClicked)=\"buttonClicked.emit($event)\"\n [totalElements]=\"pageInfo.hideTitle ? undefined : totalElements\">\n </app-title-bar>\n </div>\n </div>\n\n <div class=\"filter-row\" *ngIf=\"!pageInfo.hideAdvancedFilter\">\n <app-filter-builder\n *ngIf=\"!pageInfo.hideAdvancedFilter\"\n [pageInfo]=\"pageInfo\"\n [columns]=\"columns\"\n [filterFields]=\"filterFields\"\n [pendingFilters]=\"pendingFilters\"\n [showExportButton]=\"!pageInfo.hideExtractButton\"\n [exportDisabled]=\"noDataFound || !dataSource?.data?.length\"\n (filterInformation)=\"storePendingFilters($event)\"\n (isEmpty)=\"handleFilterEmpty($event)\"\n (applyFilter)=\"applyPendingFilters()\"\n (sortByClicked)=\"handleSortClick($event)\"\n (exportClicked)=\"extractReport($event)\">\n </app-filter-builder>\n\n <div class=\"button-group\" *ngIf=\"!pageInfo.hideExtractButton\">\n <button *ngIf=\"!pageInfo.hideExtractButton\"\n mat-flat-button\n type=\"button\"\n [matMenuTriggerFor]=\"exportMenu\"\n class=\"btn-export\"\n [disabled]=\"noDataFound || !dataSource?.data?.length\"\n [attr.aria-label]=\"'export' | translate\"\n [attr.aria-haspopup]=\"true\"\n >\n <div class=\"button-text\">\n <mat-icon>file_export</mat-icon>\n <span>{{ 'export' | translate }}</span>\n <mat-icon class=\"arrow-icon\">keyboard_arrow_down</mat-icon>\n </div>\n </button>\n\n <mat-menu #exportMenu=\"matMenu\">\n <button mat-menu-item (click)=\"extractReport('pdf')\">PDF</button>\n <button mat-menu-item (click)=\"extractReport('xlsx')\">Excel</button>\n <button mat-menu-item (click)=\"extractReport('csv')\">CSV</button>\n </mat-menu>\n\n </div>\n </div>\n\n\n <div class=\"flex-row flex-100 baseTable__detailsColumn\">\n <div class=\"flex-100\">\n <div class=\"flex-row flex-100 mainTable\">\n <div\n class=\"table-container\"\n role=\"table\"\n [attr.aria-label]=\"\n pageInfo.labelsSection && !pageInfo.hideTitle\n ? (pageInfo.labelsSection + '.list_title' | translate)\n : null\n \">\n <div class=\"table-header\" [attr.data-sort]=\"sortState\" role=\"row\">\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\n class=\"table-header-cell\"\n role=\"columnheader\"\n [attr.aria-sort]=\"getColumnAriaSort(columnProp)\"\n [attr.tabindex]=\"getColumn(columnProp)?.enableSorting ? 0 : null\"\n [class.sortable]=\"getColumn(columnProp)?.enableSorting\"\n [class.first-cell]=\"i === 0\"\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\n [class.has-width]=\"getColumn(columnProp)?.width\"\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\"\n (click)=\"getColumn(columnProp)?.enableSorting && handleSortClick(columnProp)\"\n (keydown)=\"onSortHeaderKeydown($event, columnProp)\">\n <div class=\"table-header-content\">\n <span class=\"table-header-label\">{{ labelKey(getColumn(columnProp)) | translate }}</span>\n <ng-container *ngIf=\"getColumn(columnProp)?.enableSorting\">\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'asc'\"\n class=\"sort-icon sort-asc\">arrow_drop_up</mat-icon>\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'desc'\"\n class=\"sort-icon sort-desc\">arrow_drop_down</mat-icon>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"table-body\" role=\"rowgroup\">\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\n class=\"table-row\"\n role=\"row\"\n [attr.tabindex]=\"-1\"\n [attr.id]=\"'table-row-' + (row?.id || row?.key || '')\"\n [ngClass]=\"{\n 'table-row--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\n 'table-row--dark-highlight': isDarkHighlight(row)\n }\"\n (auxclick)=\"openNewTab(row)\"\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\n class=\"table-cell\"\n role=\"cell\"\n [class.first-cell]=\"i === 0\"\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\n [class.has-width]=\"getColumn(columnProp)?.width\"\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\">\n <ng-container [ngSwitch]=\"getColumn(columnProp)?.type\">\n <ng-container *ngSwitchCase=\"'workflowStatus'\">\n <button mat-button type=\"button\" class=\"wfStatus {{ getStatusDescription(row)}}\" [attr.id]=\"'table-btn-wf-'+columnProp+'-'+(row.id || row.key || '')\" [attr.tabindex]=\"-1\">{{ getStatusDescription(row) }}</button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hyper-text'\">\n <span\n *ngIf=\"shouldRenderAsHyperLink(row); else plainHyperText\"\n class=\"mat-mdc-form-field-label hyper-link\"\n [attr.tabindex]=\"-1\"\n (click)=\"hyperLinkClicked(columnProp, row)\">\n {{ extractFieldName(row, columnProp) }}\n </span>\n <ng-template #plainHyperText>\n <span class=\"mat-mdc-form-field-label\">{{ extractFieldName(row, columnProp) }}</span>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'button'\">\n <button *ngIf=\"shouldShowButton(row)\" mat-button type=\"button\" class=\"primary\" (click)=\"$event.stopPropagation(); actionButtonClicked(columnProp, row)\" [attr.id]=\"'table-btn-action-'+columnProp\">\n {{ labelKey(getColumn(columnProp)) + '_title' | translate }}\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon [ngClass]=\"{\n 'mainTable__td__icon-green': row[columnProp] === 'pass',\n 'mainTable__td__icon-orange': row[columnProp] === 'warning',\n 'mainTable__td__icon-red': row[columnProp] === 'error'\n }\"\n [attr.aria-label]=\"getIconAriaLabelKey(row[columnProp]) | translate\">\n {{ getIcon(row[columnProp]) }}\n </mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <mat-checkbox class=\"primary\" [tabIndex]=\"-1\" [checked]=\"row[columnProp]\" (click)=\"$event.stopPropagation();actionCheckedClicked(columnProp,row)\"></mat-checkbox>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'stateType'\">\n <button mat-button type=\"button\" class=\"stateType {{ row[columnProp]}}\" [attr.id]=\"'table-btn-state-'+columnProp\" [attr.tabindex]=\"-1\">{{ labelKeyByValue(getColumn(columnProp), row) | translate}}</button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{ extractFieldName(row, columnProp) | date:'dd/MM/yyyy':'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'croppedText'\">\n {{ getCroppedText(extractFieldName(row, columnProp), row[getColumn(columnProp)?.width]) }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'download'\">\n <mat-icon class=\"mainTable__td__icon-blue\"\n [attr.aria-label]=\"'BASE_TABLE.downloadAction' | translate\">system_update_alt</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'onOff'\">\n <mat-icon *ngIf=\"row[columnProp] === null\" class=\"mainTable__td__icon-darkorange\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(null) | translate\">flag</mat-icon>\n <mat-icon *ngIf=\"row[columnProp] === false\" class=\"mainTable__td__icon-red\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(false) | translate\">flag</mat-icon>\n <mat-icon *ngIf=\"row[columnProp] === true\" class=\"mainTable__td__icon-green\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(true) | translate\">flag</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'status'\">\n <span *ngIf=\"row[columnProp] === null || row[columnProp] === false\">\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'InActive' | translate }}\n </span>\n <span *ngIf=\"row[columnProp] === true\">\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'Active' | translate }}\n </span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'info'\">\n <button\n mat-icon-button\n type=\"button\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"'BASE_TABLE.rowDetails' | translate\"\n (click)=\"$event.stopPropagation();emitEvent(row)\"\n [attr.id]=\"'table-btn-info-'+row.id\">\n <mat-icon aria-hidden=\"true\">info</mat-icon>\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'netAmount'\">\n <div class=\"mainTable__td__currency\" style=\"display:inline-block;\">{{ row[getColumn(columnProp)?.currency] }}</div>\n <span class=\"mainTable__td__property\" style=\"display:inline-block; margin-left:6px; margin-right:6px;\">\n {{ extractFieldName(row, columnProp) | currency:'':'' }}</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'localDateTime'\">\n {{ extractFieldName(row, columnProp) | date : extractFormat(getColumn(columnProp)):'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <small><sup class=\"mainTable__td__currency\">{{row[getColumn(columnProp)?.currency]}}</sup></small>\n {{ extractFieldName(row, columnProp) | number : (getColumn(columnProp)?.digitInfo || '1.3-5') }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'listAction'\">\n <app-button-actions\n [row]=\"row\"\n [buttonsAction]=\"getColumn(columnProp)?.viewType === 'buttonsAction'\"\n [listAction]=\"listAction\"\n [actions]=\"listAction\"\n (clickedButton)=\"actionListClicked($event,row)\">\n </app-button-actions>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ul class=\"mainTable__td__list\">\n <li *ngFor=\"let item of getListItems(row, columnProp)\">{{ item }}</li>\n </ul>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"getColumn(columnProp)?.translate; else noTranslate\">\n <span\n [attr.tabindex]=\"-1\"\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\">\n {{ pageInfo.labelsSection + \".\" + extractFieldName(row, columnProp) | translate }}\n </span>\n </ng-container>\n <ng-template #noTranslate>\n <span\n [attr.tabindex]=\"-1\"\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\"\n [innerText]='extractFieldName(row, columnProp)'></span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Mobile Card View -->\n <div class=\"mobile-cards-container\">\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\n class=\"mobile-card\"\n [attr.id]=\"'mobile-card-' + (row?.id || row?.key || '')\"\n [ngClass]=\"{\n 'mobile-card--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\n 'mobile-card--dark-highlight': isDarkHighlight(row)\n }\"\n (auxclick)=\"openNewTab(row)\"\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\n\n <!-- Mobile Card Header: ID/Name and Status -->\n <div class=\"mobile-card__header\">\n <div class=\"mobile-card__header-id\">\n <span class=\"mobile-card__id-text\">{{ extractFieldName(row, getMobileCardIdColumn()?.property || 'id') }}</span>\n </div>\n <div class=\"mobile-card__header-status\" *ngIf=\"getMobileCardStatusColumn()\">\n <button mat-button class=\"stateType {{ row[getMobileCardStatusColumn()?.property]}}\"\n [attr.id]=\"'mobile-btn-state-'+getMobileCardStatusColumn()?.property\">\n {{ labelKeyByValue(getMobileCardStatusColumn(), row) | translate}}\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"mobile-card__divider\"></div>\n\n <!-- Mobile Card Body: Other columns -->\n <div class=\"mobile-card__body\">\n <div *ngFor=\"let column of getMobileCardColumns()\" class=\"mobile-card__row\">\n <div class=\"mobile-card__row-label\">\n <span>{{ labelKey(column) | translate }} :</span>\n </div>\n <div class=\"mobile-card__row-value\">\n <ng-container [ngSwitch]=\"column.type\">\n <ng-container *ngSwitchCase=\"'stateType'\">\n <button mat-button class=\"stateType {{ row[column.property]}}\"\n [attr.id]=\"'mobile-btn-state-'+column.property\">\n {{ labelKeyByValue(column, row) | translate}}\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{ extractFieldName(row, column.property) | date:'dd/MM/yyyy':'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'netAmount'\">\n <span class=\"mobile-card__amount-currency\">{{ row[column.currency] }}</span>\n <span class=\"mobile-card__amount-value\">{{ extractFieldName(row, column.property) | currency:'':'' }}</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'localDateTime'\">\n {{ extractFieldName(row, column.property) | date : extractFormat(column):'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <small><sup class=\"mainTable__td__currency\">{{row[column.currency]}}</sup></small>\n {{ extractFieldName(row, column.property) | number : (column.digitInfo || '1.3-5') }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ul class=\"mainTable__td__list\">\n <li *ngFor=\"let item of getListItems(row, column.property)\">{{ item }}</li>\n </ul>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"column.translate; else noTranslate\">\n <span>{{ pageInfo.labelsSection + \".\" + extractFieldName(row, column.property) | translate }}</span>\n </ng-container>\n <ng-template #noTranslate>\n <span [innerText]='extractFieldName(row, column.property)'></span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <!-- Mobile Card Actions -->\n <div class=\"mobile-card__actions\" *ngIf=\"listAction && listAction.length > 0\">\n <app-button-actions\n [row]=\"row\"\n [buttonsAction]=\"true\"\n [listAction]=\"listAction\"\n [actions]=\"listAction\"\n (clickedButton)=\"actionListClicked($event,row)\">\n </app-button-actions>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"noDataFound\" class=\"dataNotFound flex-column\">\n <img *ngIf=\"getDisplaySvgPath()\" [src]=\"getDisplaySvgPath()\" class=\"dataNotFound__icon\" alt=\"No data found\" />\n <span class=\"dataNotFound__title\">{{ getDisplayTitle() | translate}}</span>\n <span class=\"dataNotFound__subtitle\">{{ getDisplaySubtitle() | translate}}</span>\n </div>\n\n\n <div *ngIf=\"(dataSource.data?.length > 0 || customizedData) && !pageInfo.hidePagination\" class=\"main-pagination flex-row\">\n <ng-container *ngIf=\"enablePagination\">\n <div class=\"flex-column flex-100\">\n <app-paginator\n [currentPage]=\"pageIndex\"\n [totalItems]=\"totalElements\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"[5, 10, 25, 50]\"\n [mobileLoadMoreIncrement]=\"mobileLoadMoreIncrement\"\n [displayedItems]=\"mobileDisplayedItems || dataSource.data.length\"\n (pageChange)=\"onPageChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n (loadMore)=\"onLoadMore($event)\">\n </app-paginator>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;max-width:100%;box-sizing:border-box;container-type:inline-size;container-name:base-table}.baseTable{width:100%!important;max-width:100%!important;box-sizing:border-box}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column;width:100%;max-width:100%;box-sizing:border-box}.flex-100{flex:1 1 100%}.flex-49{flex:0 0 49%}.flex-50{flex:0 0 50%}.align-start{justify-content:flex-start;align-items:flex-start}.align-center{justify-content:center;align-items:center}.align-end{justify-content:flex-end;align-items:flex-end}.gap-0{gap:0}.gap-5{gap:5px}.gap-10{gap:10px}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:auto;min-height:280px;text-align:center;margin-top:0;padding:40px 0}.dataNotFound__icon{height:auto;width:auto;max-width:200px;max-height:200px;margin-bottom:8px;object-fit:contain}.dataNotFound__title{color:#6a6a6a;font-size:20px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:20px;font-weight:400}@media (max-width: 960px){.flex-column-sm{flex-direction:column}.align-center-sm{justify-content:center;align-items:flex-start}}.filter-row{display:flex!important;flex-direction:row!important;align-items:center!important;width:100%!important;max-width:100%!important;gap:16px!important;box-sizing:border-box;margin-top:20px;margin-bottom:16px;padding:0;flex-wrap:nowrap!important;min-width:0!important;min-height:48px!important;overflow:visible!important}.filter-row app-filter-builder{flex:1 1 auto!important;min-width:0!important;max-width:none!important;width:auto!important;flex-shrink:1!important;display:flex!important;align-items:center!important;overflow:visible!important}@container base-table (min-width: 769px) and (max-width: 900px){.filter-row{align-items:flex-start!important}:host ::ng-deep app-filter-builder .main-filter-builder .filterForm__row{align-items:flex-start!important}}.button-group{display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-end;gap:8px!important;flex-shrink:0!important;flex-grow:0!important;flex-basis:auto!important;height:46px!important;white-space:nowrap!important;z-index:1!important}.mainTable{margin-top:0!important}.btn-apply-filter{background:#fff!important;border:1px solid #3e627b!important;border-radius:8px!important;height:46px!important;min-width:120px!important;padding:0 16px!important;box-shadow:none!important}.btn-apply-filter .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-apply-filter mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-apply-filter span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-apply-filter:hover{background:#fafafa!important}.btn-export{background:#fff!important;border:1px solid #0d4261!important;border-radius:8px!important;height:46px!important;min-width:109px!important;padding:0 16px!important;box-shadow:none!important;margin-bottom:7px!important}.btn-export .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-export mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-export .arrow-icon{font-size:16px;width:16px;height:16px;margin-left:0}.btn-export span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-export:hover:not(:disabled){background:#fafafa!important}.btn-export:disabled,.btn-export.mat-mdc-button-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}@container base-table (min-width: 769px) and (max-width: 900px){.filter-row .btn-export{margin-bottom:0!important}}.arrow-icon{font-size:16px;width:16px;height:16px}@media (max-width: 1024px){.button-group{width:auto}}@media (max-width: 768px){.filter-row{flex-direction:column;align-items:stretch}.button-group{display:none!important}.btn-export{width:100%}}.table-container{width:100%;overflow:hidden;background:#f7f7f7;box-sizing:border-box;display:flex;flex-direction:column}.table-header{display:flex;align-items:center;background:#f7f7f7;border:1px solid #f0eeee;max-height:48px;height:48px;margin-bottom:16px;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-header-cell{display:flex;align-items:center;max-height:48px;height:48px;padding:8px 16px;flex:1;min-width:100px;position:sticky;top:0;background:none;z-index:10;box-sizing:border-box}.table-header-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-header-cell:last-child{border-right:none}.table-header-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-header-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-header-cell.actions-cell{justify-content:center;text-align:center}.table-header-cell.actions-cell .table-header-content{justify-content:center}.table-header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.table-header-cell.sortable:hover{background:#fafafa}.table-header-content{display:flex;align-items:center;gap:8px;width:100%}.table-header-label{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.sort-icon{font-size:18px;width:18px;height:18px;color:#5c5c5c;display:flex;align-items:center;justify-content:center;transition:color .2s}.sort-icon.sort-asc,.sort-icon.sort-desc{color:#0d4261}.table-body{display:flex;flex-direction:column;gap:8px;background:#f7f7f7}.table-row{display:flex;align-items:center;min-height:48px;background:#fff;border-bottom:1px solid #f0eeee;transition:background-color .2s;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-row:hover{background:#fafafa}.table-row--highlight{background:#f0f8ff}.table-row--dark-highlight{background:#e8f4f8}.table-row .table-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-row .table-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}:host-context([dir=rtl]) .table-row,:host-context(body.rtl) .table-row{overflow:visible;align-items:center}:host-context([dir=rtl]) .table-cell:not(.actions-cell),:host-context(body.rtl) .table-cell:not(.actions-cell){overflow:visible;align-items:center;line-height:1.7;padding-top:10px;padding-bottom:10px}:host-context([dir=rtl]) .table-cell:not(.actions-cell) span,:host-context(body.rtl) .table-cell:not(.actions-cell) span{display:inline;overflow:visible;line-height:1.7;-webkit-line-clamp:unset;line-clamp:unset}.table-cell{display:flex;align-items:center;min-height:48px;max-height:none;padding:8px 16px;flex:1;min-width:100px;font-family:Lusail,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#000;box-sizing:border-box}.table-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-cell:last-child{border-right:none}.table-cell.actions-cell{justify-content:center;text-align:center}.mobile-cards-container{display:none;flex-direction:column;gap:12px;width:100%;box-sizing:border-box}.mobile-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:12px 20px;display:flex;flex-direction:column;gap:4px;cursor:pointer;transition:background-color .2s;box-sizing:border-box;width:100%}.mobile-card:hover{background:#fafafa}.mobile-card--highlight{background:#f0f8ff}.mobile-card--dark-highlight{background:#e8f4f8}.mobile-card__header{display:flex;align-items:center;justify-content:space-between;height:48px;width:100%;box-sizing:border-box}.mobile-card__header-id{display:flex;flex-direction:column;justify-content:center;flex:1}.mobile-card__id-text{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;text-align:left;white-space:nowrap}.mobile-card__header-status{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0}.mobile-card__divider{height:.347px;width:100%;background:#f0eeee;margin:0;flex-shrink:0}.mobile-card__body{display:flex;flex-direction:column;gap:0;width:100%;box-sizing:border-box}.mobile-card__row{display:flex;align-items:center;justify-content:space-between;height:40px;width:100%;overflow:hidden;box-sizing:border-box}.mobile-card__row-label{display:flex;flex-direction:column;justify-content:center;flex-shrink:0}.mobile-card__row-label span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__row-value{display:flex;flex-direction:column;justify-content:center;flex-shrink:0;text-align:right}.mobile-card__row-value span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__amount-currency{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;display:inline-block}.mobile-card__amount-value{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;display:inline-block;margin-left:6px;margin-right:6px}.mobile-card__actions{border-top:1px solid #f0eeee;padding-top:8px;margin-top:4px;display:flex;align-items:center;justify-content:center;min-height:48px;max-height:48px;width:100%;box-sizing:border-box}@media (max-width: 768px){.table-container{display:none}.mobile-cards-container{display:flex}}@media (min-width: 769px){.mobile-cards-container{display:none}.table-container{display:flex}}:host ::ng-deep button.mat-mdc-button.stateType,:host ::ng-deep button.mdc-button.stateType{white-space:normal!important;height:auto!important;min-height:28px!important;max-width:100%!important;align-items:center!important;justify-content:center!important;cursor:default!important}:host ::ng-deep button.mat-mdc-button.stateType .mdc-button__label,:host ::ng-deep button.mdc-button.stateType .mdc-button__label{white-space:normal!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:2!important;line-clamp:2!important;overflow:hidden!important;word-break:break-word!important;line-height:1.25!important;max-width:100%!important;text-align:center!important}@media (max-width: 450px){.mobile-card__header{flex-direction:column;justify-content:flex-start;height:auto;width:100%;box-sizing:border-box;gap:8px}}.mainTable__td__list{margin:4px 0;padding:4px 8px 4px 1.25rem;list-style-type:disc}.mainTable__td__list li{word-break:break-word;line-height:1.35;padding:2px 0}.mainTable__td__list li+li{margin-top:2px}.table-cell:has(.mainTable__td__list){align-items:flex-start;padding-top:8px;padding-bottom:8px}.mobile-card__row-value:has(.mainTable__td__list){align-items:flex-start;padding:4px 0}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "ngmodule", type: NgxPaginationModule }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ButtonActionsComponent, selector: "app-button-actions", inputs: ["actions", "disabled", "buttonsAction", "listAction", "row"], outputs: ["clickedButton"] }, { kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "pageInfo", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons", "buttonsDisplayMode", "draftSupported", "isPending", "onViewModeChange"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked", "viewModeChanged"] }, { kind: "component", type: PaginatorComponent, selector: "app-paginator", inputs: ["currentPage", "totalItems", "pageSize", "pageSizeOptions", "mobileLoadMoreIncrement", "displayedItems"], outputs: ["pageChange", "pageSizeChange", "loadMore"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: FilterBuilderComponent, selector: "app-filter-builder", inputs: ["columns", "isChecked", "filterFields", "pageInfo", "pendingFilters", "showExportButton", "exportDisabled"], outputs: ["filterInformation", "isEmpty", "applyFilter", "sortByClicked", "exportClicked"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }], animations: [] }); }
641
643
  }
642
644
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseTableComponent, decorators: [{
643
645
  type: Component,
@@ -667,7 +669,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
667
669
  MatMenuTrigger,
668
670
  MatMenu,
669
671
  MatMenuItem,
670
- ], template: "<div class=\"flex-column baseTable\">\n <div class=\"flex-row flex-100\" >\n <div class=\"flex-column align-start flex-100\" style=\"width: 100%;\">\n <app-title-bar\n [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\n [subTitle]=\"(pageInfo.hideTitle || pageInfo.hideSubtitle) ? '' : pageInfo.labelsSection+'.subtitle'\"\n [titleMode]=\"''\"\n [pageInfo]=\"pageInfo\"\n [newAction]=\"showAddNew()\"\n [showExtractButton]=\"!pageInfo.hideExtractButton\"\n [draftSupported]=\"pageInfo.draftSupported\"\n [isPending]=\"isPending\"\n [onViewModeChange]=\"switchViewMode.bind(this)\"\n [buttons]=\"extraActions\"\n [buttonsDisplayMode]=\"buttonsDisplayMode\"\n (newActionClicked)=\"onAddNewAction($event)\"\n (extractReport)=\"extractReport($event)\"\n (viewModeChanged)=\"onViewModeChangedReceived($event)\"\n (buttonClicked)=\"buttonClicked.emit($event)\"\n [totalElements]=\"pageInfo.hideTitle ? undefined : totalElements\">\n </app-title-bar>\n </div>\n </div>\n\n <div class=\"filter-row\" *ngIf=\"!pageInfo.hideAdvancedFilter\">\n <app-filter-builder\n *ngIf=\"!pageInfo.hideAdvancedFilter\"\n [pageInfo]=\"pageInfo\"\n [columns]=\"columns\"\n [filterFields]=\"filterFields\"\n [pendingFilters]=\"pendingFilters\"\n [showExportButton]=\"!pageInfo.hideExtractButton\"\n [exportDisabled]=\"noDataFound || !dataSource?.data?.length\"\n (filterInformation)=\"storePendingFilters($event)\"\n (isEmpty)=\"handleFilterEmpty($event)\"\n (applyFilter)=\"applyPendingFilters()\"\n (sortByClicked)=\"handleSortClick($event)\"\n (exportClicked)=\"extractReport($event)\">\n </app-filter-builder>\n\n <div class=\"button-group\" *ngIf=\"!pageInfo.hideExtractButton\">\n <button *ngIf=\"!pageInfo.hideExtractButton\"\n mat-flat-button\n type=\"button\"\n [matMenuTriggerFor]=\"exportMenu\"\n class=\"btn-export\"\n [disabled]=\"noDataFound || !dataSource?.data?.length\"\n [attr.aria-label]=\"'export' | translate\"\n [attr.aria-haspopup]=\"true\"\n >\n <div class=\"button-text\">\n <mat-icon>file_export</mat-icon>\n <span>{{ 'export' | translate }}</span>\n <mat-icon class=\"arrow-icon\">keyboard_arrow_down</mat-icon>\n </div>\n </button>\n\n <mat-menu #exportMenu=\"matMenu\">\n <button mat-menu-item (click)=\"extractReport('pdf')\">PDF</button>\n <button mat-menu-item (click)=\"extractReport('xlsx')\">Excel</button>\n <button mat-menu-item (click)=\"extractReport('csv')\">CSV</button>\n </mat-menu>\n\n </div>\n </div>\n\n\n <div class=\"flex-row flex-100 baseTable__detailsColumn\">\n <div class=\"flex-100\">\n <div class=\"flex-row flex-100 mainTable\">\n <div\n class=\"table-container\"\n role=\"table\"\n [attr.aria-label]=\"\n pageInfo.labelsSection && !pageInfo.hideTitle\n ? (pageInfo.labelsSection + '.list_title' | translate)\n : null\n \">\n <div class=\"table-header\" [attr.data-sort]=\"sortState\" role=\"row\">\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\n class=\"table-header-cell\"\n role=\"columnheader\"\n [attr.aria-sort]=\"getColumnAriaSort(columnProp)\"\n [attr.tabindex]=\"getColumn(columnProp)?.enableSorting ? 0 : null\"\n [class.sortable]=\"getColumn(columnProp)?.enableSorting\"\n [class.first-cell]=\"i === 0\"\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\n [class.has-width]=\"getColumn(columnProp)?.width\"\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\"\n (click)=\"getColumn(columnProp)?.enableSorting && handleSortClick(columnProp)\"\n (keydown)=\"onSortHeaderKeydown($event, columnProp)\">\n <div class=\"table-header-content\">\n <span class=\"table-header-label\">{{ labelKey(getColumn(columnProp)) | translate }}</span>\n <ng-container *ngIf=\"getColumn(columnProp)?.enableSorting\">\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'asc'\"\n class=\"sort-icon sort-asc\">arrow_drop_up</mat-icon>\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'desc'\"\n class=\"sort-icon sort-desc\">arrow_drop_down</mat-icon>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"table-body\" role=\"rowgroup\">\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\n class=\"table-row\"\n role=\"row\"\n [attr.tabindex]=\"-1\"\n [attr.id]=\"'table-row-' + (row?.id || row?.key || '')\"\n [ngClass]=\"{\n 'table-row--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\n 'table-row--dark-highlight': isDarkHighlight(row)\n }\"\n (auxclick)=\"openNewTab(row)\"\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\n class=\"table-cell\"\n role=\"cell\"\n [class.first-cell]=\"i === 0\"\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\n [class.has-width]=\"getColumn(columnProp)?.width\"\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\">\n <ng-container [ngSwitch]=\"getColumn(columnProp)?.type\">\n <ng-container *ngSwitchCase=\"'workflowStatus'\">\n <button mat-button type=\"button\" class=\"wfStatus {{ getStatusDescription(row)}}\" [attr.id]=\"'table-btn-wf-'+columnProp+'-'+(row.id || row.key || '')\" [attr.tabindex]=\"-1\">{{ getStatusDescription(row) }}</button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hyper-text'\">\n <span\n *ngIf=\"shouldRenderAsHyperLink(row); else plainHyperText\"\n class=\"mat-mdc-form-field-label hyper-link\"\n [attr.tabindex]=\"-1\"\n (click)=\"hyperLinkClicked(columnProp, row)\">\n {{ extractFieldName(row, columnProp) }}\n </span>\n <ng-template #plainHyperText>\n <span class=\"mat-mdc-form-field-label\">{{ extractFieldName(row, columnProp) }}</span>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'button'\">\n <button *ngIf=\"shouldShowButton(row)\" mat-button type=\"button\" class=\"primary\" (click)=\"$event.stopPropagation(); actionButtonClicked(columnProp, row)\" [attr.id]=\"'table-btn-action-'+columnProp\">\n {{ labelKey(getColumn(columnProp)) + '_title' | translate }}\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon [ngClass]=\"{\n 'mainTable__td__icon-green': row[columnProp] === 'pass',\n 'mainTable__td__icon-orange': row[columnProp] === 'warning',\n 'mainTable__td__icon-red': row[columnProp] === 'error'\n }\"\n [attr.aria-label]=\"getIconAriaLabelKey(row[columnProp]) | translate\">\n {{ getIcon(row[columnProp]) }}\n </mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <mat-checkbox class=\"primary\" [tabIndex]=\"-1\" [checked]=\"row[columnProp]\" (click)=\"$event.stopPropagation();actionCheckedClicked(columnProp,row)\"></mat-checkbox>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'stateType'\">\n <button mat-button type=\"button\" class=\"stateType {{ row[columnProp]}}\" [attr.id]=\"'table-btn-state-'+columnProp\" [attr.tabindex]=\"-1\">{{ labelKeyByValue(getColumn(columnProp), row) | translate}}</button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{ extractFieldName(row, columnProp) | date:'dd/MM/yyyy':'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'croppedText'\">\n {{ getCroppedText(extractFieldName(row, columnProp), row[getColumn(columnProp)?.width]) }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'download'\">\n <mat-icon class=\"mainTable__td__icon-blue\"\n [attr.aria-label]=\"'BASE_TABLE.downloadAction' | translate\">system_update_alt</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'onOff'\">\n <mat-icon *ngIf=\"row[columnProp] === null\" class=\"mainTable__td__icon-darkorange\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(null) | translate\">flag</mat-icon>\n <mat-icon *ngIf=\"row[columnProp] === false\" class=\"mainTable__td__icon-red\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(false) | translate\">flag</mat-icon>\n <mat-icon *ngIf=\"row[columnProp] === true\" class=\"mainTable__td__icon-green\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(true) | translate\">flag</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'status'\">\n <span *ngIf=\"row[columnProp] === null || row[columnProp] === false\">\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'InActive' | translate }}\n </span>\n <span *ngIf=\"row[columnProp] === true\">\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'Active' | translate }}\n </span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'info'\">\n <button\n mat-icon-button\n type=\"button\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"'BASE_TABLE.rowDetails' | translate\"\n (click)=\"$event.stopPropagation();emitEvent(row)\"\n [attr.id]=\"'table-btn-info-'+row.id\">\n <mat-icon aria-hidden=\"true\">info</mat-icon>\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'netAmount'\">\n <div class=\"mainTable__td__currency\" style=\"display:inline-block;\">{{ row[getColumn(columnProp)?.currency] }}</div>\n <span class=\"mainTable__td__property\" style=\"display:inline-block; margin-left:6px; margin-right:6px;\">\n {{ extractFieldName(row, columnProp) | currency:'':'' }}</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'localDateTime'\">\n {{ extractFieldName(row, columnProp) | date : extractFormat(getColumn(columnProp)):'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <small><sup class=\"mainTable__td__currency\">{{row[getColumn(columnProp)?.currency]}}</sup></small>\n {{ extractFieldName(row, columnProp) | number : (getColumn(columnProp)?.digitInfo || '1.3-5') }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'listAction'\">\n <app-button-actions\n [row]=\"row\"\n [buttonsAction]=\"getColumn(columnProp)?.viewType === 'buttonsAction'\"\n [listAction]=\"listAction\"\n [actions]=\"listAction\"\n (clickedButton)=\"actionListClicked($event,row)\">\n </app-button-actions>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ul class=\"mainTable__td__list\">\n <li *ngFor=\"let item of getListItems(row, columnProp)\">{{ item }}</li>\n </ul>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"getColumn(columnProp)?.translate; else noTranslate\">\n <span\n [attr.tabindex]=\"-1\"\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\">\n {{ pageInfo.labelsSection + \".\" + extractFieldName(row, columnProp) | translate }}\n </span>\n </ng-container>\n <ng-template #noTranslate>\n <span\n [attr.tabindex]=\"-1\"\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\"\n [innerText]='extractFieldName(row, columnProp)'></span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Mobile Card View -->\n <div class=\"mobile-cards-container\">\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\n class=\"mobile-card\"\n [attr.id]=\"'mobile-card-' + (row?.id || row?.key || '')\"\n [ngClass]=\"{\n 'mobile-card--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\n 'mobile-card--dark-highlight': isDarkHighlight(row)\n }\"\n (auxclick)=\"openNewTab(row)\"\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\n\n <!-- Mobile Card Header: ID/Name and Status -->\n <div class=\"mobile-card__header\">\n <div class=\"mobile-card__header-id\">\n <span class=\"mobile-card__id-text\">{{ extractFieldName(row, getMobileCardIdColumn()?.property || 'id') }}</span>\n </div>\n <div class=\"mobile-card__header-status\" *ngIf=\"getMobileCardStatusColumn()\">\n <button mat-button class=\"stateType {{ row[getMobileCardStatusColumn()?.property]}}\"\n [attr.id]=\"'mobile-btn-state-'+getMobileCardStatusColumn()?.property\">\n {{ labelKeyByValue(getMobileCardStatusColumn(), row) | translate}}\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"mobile-card__divider\"></div>\n\n <!-- Mobile Card Body: Other columns -->\n <div class=\"mobile-card__body\">\n <div *ngFor=\"let column of getMobileCardColumns()\" class=\"mobile-card__row\">\n <div class=\"mobile-card__row-label\">\n <span>{{ labelKey(column) | translate }} :</span>\n </div>\n <div class=\"mobile-card__row-value\">\n <ng-container [ngSwitch]=\"column.type\">\n <ng-container *ngSwitchCase=\"'stateType'\">\n <button mat-button class=\"stateType {{ row[column.property]}}\"\n [attr.id]=\"'mobile-btn-state-'+column.property\">\n {{ labelKeyByValue(column, row) | translate}}\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{ extractFieldName(row, column.property) | date:'dd/MM/yyyy':'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'netAmount'\">\n <span class=\"mobile-card__amount-currency\">{{ row[column.currency] }}</span>\n <span class=\"mobile-card__amount-value\">{{ extractFieldName(row, column.property) | currency:'':'' }}</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'localDateTime'\">\n {{ extractFieldName(row, column.property) | date : extractFormat(column):'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <small><sup class=\"mainTable__td__currency\">{{row[column.currency]}}</sup></small>\n {{ extractFieldName(row, column.property) | number : (column.digitInfo || '1.3-5') }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ul class=\"mainTable__td__list\">\n <li *ngFor=\"let item of getListItems(row, column.property)\">{{ item }}</li>\n </ul>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"column.translate; else noTranslate\">\n <span>{{ pageInfo.labelsSection + \".\" + extractFieldName(row, column.property) | translate }}</span>\n </ng-container>\n <ng-template #noTranslate>\n <span [innerText]='extractFieldName(row, column.property)'></span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <!-- Mobile Card Actions -->\n <div class=\"mobile-card__actions\" *ngIf=\"listAction && listAction.length > 0\">\n <app-button-actions\n [row]=\"row\"\n [buttonsAction]=\"true\"\n [listAction]=\"listAction\"\n [actions]=\"listAction\"\n (clickedButton)=\"actionListClicked($event,row)\">\n </app-button-actions>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"noDataFound\" class=\"dataNotFound flex-column\">\n <img *ngIf=\"getDisplaySvgPath()\" [src]=\"getDisplaySvgPath()\" class=\"dataNotFound__icon\" alt=\"No data found\" />\n <span class=\"dataNotFound__title\">{{ getDisplayTitle() | translate}}</span>\n <span class=\"dataNotFound__subtitle\">{{ getDisplaySubtitle() | translate}}</span>\n </div>\n\n\n <div *ngIf=\"(dataSource.data?.length > 0 || customizedData) && !pageInfo.hidePagination\" class=\"main-pagination flex-row\">\n <ng-container *ngIf=\"enablePagination\">\n <div class=\"flex-column flex-100\">\n <app-paginator\n [currentPage]=\"pageIndex\"\n [totalItems]=\"totalElements\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"[5, 10, 25, 50]\"\n [mobileLoadMoreIncrement]=\"mobileLoadMoreIncrement\"\n [displayedItems]=\"mobileDisplayedItems || dataSource.data.length\"\n (pageChange)=\"onPageChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n (loadMore)=\"onLoadMore($event)\">\n </app-paginator>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;max-width:100%;box-sizing:border-box;container-type:inline-size;container-name:base-table}.baseTable{width:100%!important;max-width:100%!important;box-sizing:border-box}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column;width:100%;max-width:100%;box-sizing:border-box}.flex-100{flex:1 1 100%}.flex-49{flex:0 0 49%}.flex-50{flex:0 0 50%}.align-start{justify-content:flex-start;align-items:flex-start}.align-center{justify-content:center;align-items:center}.align-end{justify-content:flex-end;align-items:flex-end}.gap-0{gap:0}.gap-5{gap:5px}.gap-10{gap:10px}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:auto;min-height:280px;text-align:center;margin-top:0;padding:40px 0}.dataNotFound__icon{height:auto;width:auto;max-width:200px;max-height:200px;margin-bottom:8px;object-fit:contain}.dataNotFound__title{color:#6a6a6a;font-size:20px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:20px;font-weight:400}@media (max-width: 960px){.flex-column-sm{flex-direction:column}.align-center-sm{justify-content:center;align-items:flex-start}}.filter-row{display:flex!important;flex-direction:row!important;align-items:center!important;width:100%!important;max-width:100%!important;gap:16px!important;box-sizing:border-box;margin-top:20px;margin-bottom:16px;padding:0;flex-wrap:nowrap!important;min-width:0!important;min-height:48px!important;overflow:visible!important}.filter-row app-filter-builder{flex:1 1 auto!important;min-width:0!important;max-width:none!important;width:auto!important;flex-shrink:1!important;display:flex!important;align-items:center!important;overflow:visible!important}@container base-table (min-width: 769px) and (max-width: 900px){.filter-row{align-items:flex-end!important}}.button-group{display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-end;gap:8px!important;flex-shrink:0!important;flex-grow:0!important;flex-basis:auto!important;height:46px!important;white-space:nowrap!important;z-index:1!important}.mainTable{margin-top:0!important}.btn-apply-filter{background:#fff!important;border:1px solid #3e627b!important;border-radius:8px!important;height:46px!important;min-width:120px!important;padding:0 16px!important;box-shadow:none!important}.btn-apply-filter .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-apply-filter mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-apply-filter span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-apply-filter:hover{background:#fafafa!important}.btn-export{background:#fff!important;border:1px solid #0d4261!important;border-radius:8px!important;height:46px!important;min-width:109px!important;padding:0 16px!important;box-shadow:none!important;margin-bottom:7px!important}.btn-export .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-export mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-export .arrow-icon{font-size:16px;width:16px;height:16px;margin-left:0}.btn-export span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-export:hover:not(:disabled){background:#fafafa!important}.btn-export:disabled,.btn-export.mat-mdc-button-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}@container base-table (min-width: 769px) and (max-width: 900px){.filter-row .btn-export{margin-bottom:0!important}}.arrow-icon{font-size:16px;width:16px;height:16px}@media (max-width: 1024px){.button-group{width:auto}}@media (max-width: 768px){.filter-row{flex-direction:column;align-items:stretch}.button-group{display:none!important}.btn-export{width:100%}}.table-container{width:100%;overflow:hidden;background:#f7f7f7;box-sizing:border-box;display:flex;flex-direction:column}.table-header{display:flex;align-items:center;background:#f7f7f7;border:1px solid #f0eeee;max-height:48px;height:48px;margin-bottom:16px;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-header-cell{display:flex;align-items:center;max-height:48px;height:48px;padding:8px 16px;flex:1;min-width:100px;position:sticky;top:0;background:none;z-index:10;box-sizing:border-box}.table-header-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-header-cell:last-child{border-right:none}.table-header-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-header-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-header-cell.actions-cell{justify-content:center;text-align:center}.table-header-cell.actions-cell .table-header-content{justify-content:center}.table-header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.table-header-cell.sortable:hover{background:#fafafa}.table-header-content{display:flex;align-items:center;gap:8px;width:100%}.table-header-label{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.sort-icon{font-size:18px;width:18px;height:18px;color:#5c5c5c;display:flex;align-items:center;justify-content:center;transition:color .2s}.sort-icon.sort-asc,.sort-icon.sort-desc{color:#0d4261}.table-body{display:flex;flex-direction:column;gap:8px;background:#f7f7f7}.table-row{display:flex;align-items:center;min-height:48px;background:#fff;border-bottom:1px solid #f0eeee;transition:background-color .2s;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-row:hover{background:#fafafa}.table-row--highlight{background:#f0f8ff}.table-row--dark-highlight{background:#e8f4f8}.table-row .table-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-row .table-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}:host-context([dir=rtl]) .table-row,:host-context(body.rtl) .table-row{overflow:visible;align-items:center}:host-context([dir=rtl]) .table-cell:not(.actions-cell),:host-context(body.rtl) .table-cell:not(.actions-cell){overflow:visible;align-items:center;line-height:1.7;padding-top:10px;padding-bottom:10px}:host-context([dir=rtl]) .table-cell:not(.actions-cell) span,:host-context(body.rtl) .table-cell:not(.actions-cell) span{display:inline;overflow:visible;line-height:1.7;-webkit-line-clamp:unset;line-clamp:unset}.table-cell{display:flex;align-items:center;min-height:48px;max-height:none;padding:8px 16px;flex:1;min-width:100px;font-family:Lusail,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#000;box-sizing:border-box}.table-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-cell:last-child{border-right:none}.table-cell.actions-cell{justify-content:center;text-align:center}.mobile-cards-container{display:none;flex-direction:column;gap:12px;width:100%;box-sizing:border-box}.mobile-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:12px 20px;display:flex;flex-direction:column;gap:4px;cursor:pointer;transition:background-color .2s;box-sizing:border-box;width:100%}.mobile-card:hover{background:#fafafa}.mobile-card--highlight{background:#f0f8ff}.mobile-card--dark-highlight{background:#e8f4f8}.mobile-card__header{display:flex;align-items:center;justify-content:space-between;height:48px;width:100%;box-sizing:border-box}.mobile-card__header-id{display:flex;flex-direction:column;justify-content:center;flex:1}.mobile-card__id-text{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;text-align:left;white-space:nowrap}.mobile-card__header-status{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0}.mobile-card__divider{height:.347px;width:100%;background:#f0eeee;margin:0;flex-shrink:0}.mobile-card__body{display:flex;flex-direction:column;gap:0;width:100%;box-sizing:border-box}.mobile-card__row{display:flex;align-items:center;justify-content:space-between;height:40px;width:100%;overflow:hidden;box-sizing:border-box}.mobile-card__row-label{display:flex;flex-direction:column;justify-content:center;flex-shrink:0}.mobile-card__row-label span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__row-value{display:flex;flex-direction:column;justify-content:center;flex-shrink:0;text-align:right}.mobile-card__row-value span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__amount-currency{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;display:inline-block}.mobile-card__amount-value{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;display:inline-block;margin-left:6px;margin-right:6px}.mobile-card__actions{border-top:1px solid #f0eeee;padding-top:8px;margin-top:4px;display:flex;align-items:center;justify-content:center;min-height:48px;max-height:48px;width:100%;box-sizing:border-box}@media (max-width: 768px){.table-container{display:none}.mobile-cards-container{display:flex}}@media (min-width: 769px){.mobile-cards-container{display:none}.table-container{display:flex}}:host ::ng-deep button.mat-mdc-button.stateType,:host ::ng-deep button.mdc-button.stateType{white-space:normal!important;height:auto!important;min-height:28px!important;max-width:100%!important;align-items:center!important;justify-content:center!important;cursor:default!important}:host ::ng-deep button.mat-mdc-button.stateType .mdc-button__label,:host ::ng-deep button.mdc-button.stateType .mdc-button__label{white-space:normal!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:2!important;line-clamp:2!important;overflow:hidden!important;word-break:break-word!important;line-height:1.25!important;max-width:100%!important;text-align:center!important}@media (max-width: 450px){.mobile-card__header{flex-direction:column;justify-content:flex-start;height:auto;width:100%;box-sizing:border-box;gap:8px}}.mainTable__td__list{margin:4px 0;padding:4px 8px 4px 1.25rem;list-style-type:disc}.mainTable__td__list li{word-break:break-word;line-height:1.35;padding:2px 0}.mainTable__td__list li+li{margin-top:2px}.table-cell:has(.mainTable__td__list){align-items:flex-start;padding-top:8px;padding-bottom:8px}.mobile-card__row-value:has(.mainTable__td__list){align-items:flex-start;padding:4px 0}\n"] }]
672
+ ], template: "<div class=\"flex-column baseTable\">\n <div class=\"flex-row flex-100\" >\n <div class=\"flex-column align-start flex-100\" style=\"width: 100%;\">\n <app-title-bar\n [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\n [subTitle]=\"(pageInfo.hideTitle || pageInfo.hideSubtitle) ? '' : pageInfo.labelsSection+'.subtitle'\"\n [titleMode]=\"''\"\n [pageInfo]=\"pageInfo\"\n [newAction]=\"showAddNew()\"\n [showExtractButton]=\"!pageInfo.hideExtractButton\"\n [draftSupported]=\"pageInfo.draftSupported\"\n [isPending]=\"isPending\"\n [onViewModeChange]=\"switchViewMode.bind(this)\"\n [buttons]=\"extraActions\"\n [buttonsDisplayMode]=\"buttonsDisplayMode\"\n (newActionClicked)=\"onAddNewAction($event)\"\n (extractReport)=\"extractReport($event)\"\n (viewModeChanged)=\"onViewModeChangedReceived($event)\"\n (buttonClicked)=\"buttonClicked.emit($event)\"\n [totalElements]=\"pageInfo.hideTitle ? undefined : totalElements\">\n </app-title-bar>\n </div>\n </div>\n\n <div class=\"filter-row\" *ngIf=\"!pageInfo.hideAdvancedFilter\">\n <app-filter-builder\n *ngIf=\"!pageInfo.hideAdvancedFilter\"\n [pageInfo]=\"pageInfo\"\n [columns]=\"columns\"\n [filterFields]=\"filterFields\"\n [pendingFilters]=\"pendingFilters\"\n [showExportButton]=\"!pageInfo.hideExtractButton\"\n [exportDisabled]=\"noDataFound || !dataSource?.data?.length\"\n (filterInformation)=\"storePendingFilters($event)\"\n (isEmpty)=\"handleFilterEmpty($event)\"\n (applyFilter)=\"applyPendingFilters()\"\n (sortByClicked)=\"handleSortClick($event)\"\n (exportClicked)=\"extractReport($event)\">\n </app-filter-builder>\n\n <div class=\"button-group\" *ngIf=\"!pageInfo.hideExtractButton\">\n <button *ngIf=\"!pageInfo.hideExtractButton\"\n mat-flat-button\n type=\"button\"\n [matMenuTriggerFor]=\"exportMenu\"\n class=\"btn-export\"\n [disabled]=\"noDataFound || !dataSource?.data?.length\"\n [attr.aria-label]=\"'export' | translate\"\n [attr.aria-haspopup]=\"true\"\n >\n <div class=\"button-text\">\n <mat-icon>file_export</mat-icon>\n <span>{{ 'export' | translate }}</span>\n <mat-icon class=\"arrow-icon\">keyboard_arrow_down</mat-icon>\n </div>\n </button>\n\n <mat-menu #exportMenu=\"matMenu\">\n <button mat-menu-item (click)=\"extractReport('pdf')\">PDF</button>\n <button mat-menu-item (click)=\"extractReport('xlsx')\">Excel</button>\n <button mat-menu-item (click)=\"extractReport('csv')\">CSV</button>\n </mat-menu>\n\n </div>\n </div>\n\n\n <div class=\"flex-row flex-100 baseTable__detailsColumn\">\n <div class=\"flex-100\">\n <div class=\"flex-row flex-100 mainTable\">\n <div\n class=\"table-container\"\n role=\"table\"\n [attr.aria-label]=\"\n pageInfo.labelsSection && !pageInfo.hideTitle\n ? (pageInfo.labelsSection + '.list_title' | translate)\n : null\n \">\n <div class=\"table-header\" [attr.data-sort]=\"sortState\" role=\"row\">\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\n class=\"table-header-cell\"\n role=\"columnheader\"\n [attr.aria-sort]=\"getColumnAriaSort(columnProp)\"\n [attr.tabindex]=\"getColumn(columnProp)?.enableSorting ? 0 : null\"\n [class.sortable]=\"getColumn(columnProp)?.enableSorting\"\n [class.first-cell]=\"i === 0\"\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\n [class.has-width]=\"getColumn(columnProp)?.width\"\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\"\n (click)=\"getColumn(columnProp)?.enableSorting && handleSortClick(columnProp)\"\n (keydown)=\"onSortHeaderKeydown($event, columnProp)\">\n <div class=\"table-header-content\">\n <span class=\"table-header-label\">{{ labelKey(getColumn(columnProp)) | translate }}</span>\n <ng-container *ngIf=\"getColumn(columnProp)?.enableSorting\">\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'asc'\"\n class=\"sort-icon sort-asc\">arrow_drop_up</mat-icon>\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'desc'\"\n class=\"sort-icon sort-desc\">arrow_drop_down</mat-icon>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"table-body\" role=\"rowgroup\">\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\n class=\"table-row\"\n role=\"row\"\n [attr.tabindex]=\"-1\"\n [attr.id]=\"'table-row-' + (row?.id || row?.key || '')\"\n [ngClass]=\"{\n 'table-row--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\n 'table-row--dark-highlight': isDarkHighlight(row)\n }\"\n (auxclick)=\"openNewTab(row)\"\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\n class=\"table-cell\"\n role=\"cell\"\n [class.first-cell]=\"i === 0\"\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\n [class.has-width]=\"getColumn(columnProp)?.width\"\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\">\n <ng-container [ngSwitch]=\"getColumn(columnProp)?.type\">\n <ng-container *ngSwitchCase=\"'workflowStatus'\">\n <button mat-button type=\"button\" class=\"wfStatus {{ getStatusDescription(row)}}\" [attr.id]=\"'table-btn-wf-'+columnProp+'-'+(row.id || row.key || '')\" [attr.tabindex]=\"-1\">{{ getStatusDescription(row) }}</button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hyper-text'\">\n <span\n *ngIf=\"shouldRenderAsHyperLink(row); else plainHyperText\"\n class=\"mat-mdc-form-field-label hyper-link\"\n [attr.tabindex]=\"-1\"\n (click)=\"hyperLinkClicked(columnProp, row)\">\n {{ extractFieldName(row, columnProp) }}\n </span>\n <ng-template #plainHyperText>\n <span class=\"mat-mdc-form-field-label\">{{ extractFieldName(row, columnProp) }}</span>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'button'\">\n <button *ngIf=\"shouldShowButton(row)\" mat-button type=\"button\" class=\"primary\" (click)=\"$event.stopPropagation(); actionButtonClicked(columnProp, row)\" [attr.id]=\"'table-btn-action-'+columnProp\">\n {{ labelKey(getColumn(columnProp)) + '_title' | translate }}\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon [ngClass]=\"{\n 'mainTable__td__icon-green': row[columnProp] === 'pass',\n 'mainTable__td__icon-orange': row[columnProp] === 'warning',\n 'mainTable__td__icon-red': row[columnProp] === 'error'\n }\"\n [attr.aria-label]=\"getIconAriaLabelKey(row[columnProp]) | translate\">\n {{ getIcon(row[columnProp]) }}\n </mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <mat-checkbox class=\"primary\" [tabIndex]=\"-1\" [checked]=\"row[columnProp]\" (click)=\"$event.stopPropagation();actionCheckedClicked(columnProp,row)\"></mat-checkbox>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'stateType'\">\n <button mat-button type=\"button\" class=\"stateType {{ row[columnProp]}}\" [attr.id]=\"'table-btn-state-'+columnProp\" [attr.tabindex]=\"-1\">{{ labelKeyByValue(getColumn(columnProp), row) | translate}}</button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{ extractFieldName(row, columnProp) | date:'dd/MM/yyyy':'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'croppedText'\">\n {{ getCroppedText(extractFieldName(row, columnProp), row[getColumn(columnProp)?.width]) }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'download'\">\n <mat-icon class=\"mainTable__td__icon-blue\"\n [attr.aria-label]=\"'BASE_TABLE.downloadAction' | translate\">system_update_alt</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'onOff'\">\n <mat-icon *ngIf=\"row[columnProp] === null\" class=\"mainTable__td__icon-darkorange\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(null) | translate\">flag</mat-icon>\n <mat-icon *ngIf=\"row[columnProp] === false\" class=\"mainTable__td__icon-red\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(false) | translate\">flag</mat-icon>\n <mat-icon *ngIf=\"row[columnProp] === true\" class=\"mainTable__td__icon-green\"\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(true) | translate\">flag</mat-icon>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'status'\">\n <span *ngIf=\"row[columnProp] === null || row[columnProp] === false\">\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'InActive' | translate }}\n </span>\n <span *ngIf=\"row[columnProp] === true\">\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'Active' | translate }}\n </span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'info'\">\n <button\n mat-icon-button\n type=\"button\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"'BASE_TABLE.rowDetails' | translate\"\n (click)=\"$event.stopPropagation();emitEvent(row)\"\n [attr.id]=\"'table-btn-info-'+row.id\">\n <mat-icon aria-hidden=\"true\">info</mat-icon>\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'netAmount'\">\n <div class=\"mainTable__td__currency\" style=\"display:inline-block;\">{{ row[getColumn(columnProp)?.currency] }}</div>\n <span class=\"mainTable__td__property\" style=\"display:inline-block; margin-left:6px; margin-right:6px;\">\n {{ extractFieldName(row, columnProp) | currency:'':'' }}</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'localDateTime'\">\n {{ extractFieldName(row, columnProp) | date : extractFormat(getColumn(columnProp)):'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <small><sup class=\"mainTable__td__currency\">{{row[getColumn(columnProp)?.currency]}}</sup></small>\n {{ extractFieldName(row, columnProp) | number : (getColumn(columnProp)?.digitInfo || '1.3-5') }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'listAction'\">\n <app-button-actions\n [row]=\"row\"\n [buttonsAction]=\"getColumn(columnProp)?.viewType === 'buttonsAction'\"\n [listAction]=\"listAction\"\n [actions]=\"listAction\"\n (clickedButton)=\"actionListClicked($event,row)\">\n </app-button-actions>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ul class=\"mainTable__td__list\">\n <li *ngFor=\"let item of getListItems(row, columnProp)\">{{ item }}</li>\n </ul>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"getColumn(columnProp)?.translate; else noTranslate\">\n <span\n [attr.tabindex]=\"-1\"\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\">\n {{ pageInfo.labelsSection + \".\" + extractFieldName(row, columnProp) | translate }}\n </span>\n </ng-container>\n <ng-template #noTranslate>\n <span\n [attr.tabindex]=\"-1\"\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\"\n [innerText]='extractFieldName(row, columnProp)'></span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Mobile Card View -->\n <div class=\"mobile-cards-container\">\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\n class=\"mobile-card\"\n [attr.id]=\"'mobile-card-' + (row?.id || row?.key || '')\"\n [ngClass]=\"{\n 'mobile-card--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\n 'mobile-card--dark-highlight': isDarkHighlight(row)\n }\"\n (auxclick)=\"openNewTab(row)\"\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\n\n <!-- Mobile Card Header: ID/Name and Status -->\n <div class=\"mobile-card__header\">\n <div class=\"mobile-card__header-id\">\n <span class=\"mobile-card__id-text\">{{ extractFieldName(row, getMobileCardIdColumn()?.property || 'id') }}</span>\n </div>\n <div class=\"mobile-card__header-status\" *ngIf=\"getMobileCardStatusColumn()\">\n <button mat-button class=\"stateType {{ row[getMobileCardStatusColumn()?.property]}}\"\n [attr.id]=\"'mobile-btn-state-'+getMobileCardStatusColumn()?.property\">\n {{ labelKeyByValue(getMobileCardStatusColumn(), row) | translate}}\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"mobile-card__divider\"></div>\n\n <!-- Mobile Card Body: Other columns -->\n <div class=\"mobile-card__body\">\n <div *ngFor=\"let column of getMobileCardColumns()\" class=\"mobile-card__row\">\n <div class=\"mobile-card__row-label\">\n <span>{{ labelKey(column) | translate }} :</span>\n </div>\n <div class=\"mobile-card__row-value\">\n <ng-container [ngSwitch]=\"column.type\">\n <ng-container *ngSwitchCase=\"'stateType'\">\n <button mat-button class=\"stateType {{ row[column.property]}}\"\n [attr.id]=\"'mobile-btn-state-'+column.property\">\n {{ labelKeyByValue(column, row) | translate}}\n </button>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{ extractFieldName(row, column.property) | date:'dd/MM/yyyy':'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'netAmount'\">\n <span class=\"mobile-card__amount-currency\">{{ row[column.currency] }}</span>\n <span class=\"mobile-card__amount-value\">{{ extractFieldName(row, column.property) | currency:'':'' }}</span>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'localDateTime'\">\n {{ extractFieldName(row, column.property) | date : extractFormat(column):'UTC' }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <small><sup class=\"mainTable__td__currency\">{{row[column.currency]}}</sup></small>\n {{ extractFieldName(row, column.property) | number : (column.digitInfo || '1.3-5') }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ul class=\"mainTable__td__list\">\n <li *ngFor=\"let item of getListItems(row, column.property)\">{{ item }}</li>\n </ul>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"column.translate; else noTranslate\">\n <span>{{ pageInfo.labelsSection + \".\" + extractFieldName(row, column.property) | translate }}</span>\n </ng-container>\n <ng-template #noTranslate>\n <span [innerText]='extractFieldName(row, column.property)'></span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <!-- Mobile Card Actions -->\n <div class=\"mobile-card__actions\" *ngIf=\"listAction && listAction.length > 0\">\n <app-button-actions\n [row]=\"row\"\n [buttonsAction]=\"true\"\n [listAction]=\"listAction\"\n [actions]=\"listAction\"\n (clickedButton)=\"actionListClicked($event,row)\">\n </app-button-actions>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"noDataFound\" class=\"dataNotFound flex-column\">\n <img *ngIf=\"getDisplaySvgPath()\" [src]=\"getDisplaySvgPath()\" class=\"dataNotFound__icon\" alt=\"No data found\" />\n <span class=\"dataNotFound__title\">{{ getDisplayTitle() | translate}}</span>\n <span class=\"dataNotFound__subtitle\">{{ getDisplaySubtitle() | translate}}</span>\n </div>\n\n\n <div *ngIf=\"(dataSource.data?.length > 0 || customizedData) && !pageInfo.hidePagination\" class=\"main-pagination flex-row\">\n <ng-container *ngIf=\"enablePagination\">\n <div class=\"flex-column flex-100\">\n <app-paginator\n [currentPage]=\"pageIndex\"\n [totalItems]=\"totalElements\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"[5, 10, 25, 50]\"\n [mobileLoadMoreIncrement]=\"mobileLoadMoreIncrement\"\n [displayedItems]=\"mobileDisplayedItems || dataSource.data.length\"\n (pageChange)=\"onPageChange($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n (loadMore)=\"onLoadMore($event)\">\n </app-paginator>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;max-width:100%;box-sizing:border-box;container-type:inline-size;container-name:base-table}.baseTable{width:100%!important;max-width:100%!important;box-sizing:border-box}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column;width:100%;max-width:100%;box-sizing:border-box}.flex-100{flex:1 1 100%}.flex-49{flex:0 0 49%}.flex-50{flex:0 0 50%}.align-start{justify-content:flex-start;align-items:flex-start}.align-center{justify-content:center;align-items:center}.align-end{justify-content:flex-end;align-items:flex-end}.gap-0{gap:0}.gap-5{gap:5px}.gap-10{gap:10px}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:auto;min-height:280px;text-align:center;margin-top:0;padding:40px 0}.dataNotFound__icon{height:auto;width:auto;max-width:200px;max-height:200px;margin-bottom:8px;object-fit:contain}.dataNotFound__title{color:#6a6a6a;font-size:20px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:20px;font-weight:400}@media (max-width: 960px){.flex-column-sm{flex-direction:column}.align-center-sm{justify-content:center;align-items:flex-start}}.filter-row{display:flex!important;flex-direction:row!important;align-items:center!important;width:100%!important;max-width:100%!important;gap:16px!important;box-sizing:border-box;margin-top:20px;margin-bottom:16px;padding:0;flex-wrap:nowrap!important;min-width:0!important;min-height:48px!important;overflow:visible!important}.filter-row app-filter-builder{flex:1 1 auto!important;min-width:0!important;max-width:none!important;width:auto!important;flex-shrink:1!important;display:flex!important;align-items:center!important;overflow:visible!important}@container base-table (min-width: 769px) and (max-width: 900px){.filter-row{align-items:flex-start!important}:host ::ng-deep app-filter-builder .main-filter-builder .filterForm__row{align-items:flex-start!important}}.button-group{display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-end;gap:8px!important;flex-shrink:0!important;flex-grow:0!important;flex-basis:auto!important;height:46px!important;white-space:nowrap!important;z-index:1!important}.mainTable{margin-top:0!important}.btn-apply-filter{background:#fff!important;border:1px solid #3e627b!important;border-radius:8px!important;height:46px!important;min-width:120px!important;padding:0 16px!important;box-shadow:none!important}.btn-apply-filter .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-apply-filter mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-apply-filter span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-apply-filter:hover{background:#fafafa!important}.btn-export{background:#fff!important;border:1px solid #0d4261!important;border-radius:8px!important;height:46px!important;min-width:109px!important;padding:0 16px!important;box-shadow:none!important;margin-bottom:7px!important}.btn-export .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-export mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-export .arrow-icon{font-size:16px;width:16px;height:16px;margin-left:0}.btn-export span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-export:hover:not(:disabled){background:#fafafa!important}.btn-export:disabled,.btn-export.mat-mdc-button-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}@container base-table (min-width: 769px) and (max-width: 900px){.filter-row .btn-export{margin-bottom:0!important}}.arrow-icon{font-size:16px;width:16px;height:16px}@media (max-width: 1024px){.button-group{width:auto}}@media (max-width: 768px){.filter-row{flex-direction:column;align-items:stretch}.button-group{display:none!important}.btn-export{width:100%}}.table-container{width:100%;overflow:hidden;background:#f7f7f7;box-sizing:border-box;display:flex;flex-direction:column}.table-header{display:flex;align-items:center;background:#f7f7f7;border:1px solid #f0eeee;max-height:48px;height:48px;margin-bottom:16px;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-header-cell{display:flex;align-items:center;max-height:48px;height:48px;padding:8px 16px;flex:1;min-width:100px;position:sticky;top:0;background:none;z-index:10;box-sizing:border-box}.table-header-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-header-cell:last-child{border-right:none}.table-header-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-header-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-header-cell.actions-cell{justify-content:center;text-align:center}.table-header-cell.actions-cell .table-header-content{justify-content:center}.table-header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.table-header-cell.sortable:hover{background:#fafafa}.table-header-content{display:flex;align-items:center;gap:8px;width:100%}.table-header-label{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.sort-icon{font-size:18px;width:18px;height:18px;color:#5c5c5c;display:flex;align-items:center;justify-content:center;transition:color .2s}.sort-icon.sort-asc,.sort-icon.sort-desc{color:#0d4261}.table-body{display:flex;flex-direction:column;gap:8px;background:#f7f7f7}.table-row{display:flex;align-items:center;min-height:48px;background:#fff;border-bottom:1px solid #f0eeee;transition:background-color .2s;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-row:hover{background:#fafafa}.table-row--highlight{background:#f0f8ff}.table-row--dark-highlight{background:#e8f4f8}.table-row .table-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-row .table-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}:host-context([dir=rtl]) .table-row,:host-context(body.rtl) .table-row{overflow:visible;align-items:center}:host-context([dir=rtl]) .table-cell:not(.actions-cell),:host-context(body.rtl) .table-cell:not(.actions-cell){overflow:visible;align-items:center;line-height:1.7;padding-top:10px;padding-bottom:10px}:host-context([dir=rtl]) .table-cell:not(.actions-cell) span,:host-context(body.rtl) .table-cell:not(.actions-cell) span{display:inline;overflow:visible;line-height:1.7;-webkit-line-clamp:unset;line-clamp:unset}.table-cell{display:flex;align-items:center;min-height:48px;max-height:none;padding:8px 16px;flex:1;min-width:100px;font-family:Lusail,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#000;box-sizing:border-box}.table-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-cell:last-child{border-right:none}.table-cell.actions-cell{justify-content:center;text-align:center}.mobile-cards-container{display:none;flex-direction:column;gap:12px;width:100%;box-sizing:border-box}.mobile-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:12px 20px;display:flex;flex-direction:column;gap:4px;cursor:pointer;transition:background-color .2s;box-sizing:border-box;width:100%}.mobile-card:hover{background:#fafafa}.mobile-card--highlight{background:#f0f8ff}.mobile-card--dark-highlight{background:#e8f4f8}.mobile-card__header{display:flex;align-items:center;justify-content:space-between;height:48px;width:100%;box-sizing:border-box}.mobile-card__header-id{display:flex;flex-direction:column;justify-content:center;flex:1}.mobile-card__id-text{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;text-align:left;white-space:nowrap}.mobile-card__header-status{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0}.mobile-card__divider{height:.347px;width:100%;background:#f0eeee;margin:0;flex-shrink:0}.mobile-card__body{display:flex;flex-direction:column;gap:0;width:100%;box-sizing:border-box}.mobile-card__row{display:flex;align-items:center;justify-content:space-between;height:40px;width:100%;overflow:hidden;box-sizing:border-box}.mobile-card__row-label{display:flex;flex-direction:column;justify-content:center;flex-shrink:0}.mobile-card__row-label span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__row-value{display:flex;flex-direction:column;justify-content:center;flex-shrink:0;text-align:right}.mobile-card__row-value span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__amount-currency{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;display:inline-block}.mobile-card__amount-value{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;display:inline-block;margin-left:6px;margin-right:6px}.mobile-card__actions{border-top:1px solid #f0eeee;padding-top:8px;margin-top:4px;display:flex;align-items:center;justify-content:center;min-height:48px;max-height:48px;width:100%;box-sizing:border-box}@media (max-width: 768px){.table-container{display:none}.mobile-cards-container{display:flex}}@media (min-width: 769px){.mobile-cards-container{display:none}.table-container{display:flex}}:host ::ng-deep button.mat-mdc-button.stateType,:host ::ng-deep button.mdc-button.stateType{white-space:normal!important;height:auto!important;min-height:28px!important;max-width:100%!important;align-items:center!important;justify-content:center!important;cursor:default!important}:host ::ng-deep button.mat-mdc-button.stateType .mdc-button__label,:host ::ng-deep button.mdc-button.stateType .mdc-button__label{white-space:normal!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:2!important;line-clamp:2!important;overflow:hidden!important;word-break:break-word!important;line-height:1.25!important;max-width:100%!important;text-align:center!important}@media (max-width: 450px){.mobile-card__header{flex-direction:column;justify-content:flex-start;height:auto;width:100%;box-sizing:border-box;gap:8px}}.mainTable__td__list{margin:4px 0;padding:4px 8px 4px 1.25rem;list-style-type:disc}.mainTable__td__list li{word-break:break-word;line-height:1.35;padding:2px 0}.mainTable__td__list li+li{margin-top:2px}.table-cell:has(.mainTable__td__list){align-items:flex-start;padding-top:8px;padding-bottom:8px}.mobile-card__row-value:has(.mainTable__td__list){align-items:flex-start;padding:4px 0}\n"] }]
671
673
  }], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.TranslateService }, { type: i3.ShareDataService }, { type: i4.BreakpointObserver }, { type: undefined, decorators: [{
672
674
  type: Inject,
673
675
  args: ['securityManager']
@@ -741,6 +743,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
741
743
  type: Output
742
744
  }], pendingViewModeChanged: [{
743
745
  type: Output
746
+ }], filtersApplied: [{
747
+ type: Output
744
748
  }], showDialog: [{
745
749
  type: Output
746
750
  }], customizedData: [{
@@ -748,4 +752,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
748
752
  }], clickRoutePage: [{
749
753
  type: Output
750
754
  }] } });
751
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsZUFBZSxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxhQUFhLEVBQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFFBQVEsRUFDUixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxJQUFJLEVBQ0osT0FBTyxFQUNQLFFBQVEsRUFDUixZQUFZLEVBQ1osZUFBZSxFQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUVsRixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFHakQsT0FBTyxF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cG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtNYXRUYWJsZURhdGFTb3VyY2V9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90YWJsZVwiO1xuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge01hdFNvcnRNb2R1bGUsIFNvcnR9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XG5pbXBvcnQge1xuICBDdXJyZW5jeVBpcGUsXG4gIERhdGVQaXBlLFxuICBEZWNpbWFsUGlwZSxcbiAgTmdDbGFzcyxcbiAgTmdGb3JPZixcbiAgTmdJZixcbiAgTmdTdHlsZSxcbiAgTmdTd2l0Y2gsXG4gIE5nU3dpdGNoQ2FzZSxcbiAgTmdTd2l0Y2hEZWZhdWx0XG59IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7TWF0SWNvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcbmltcG9ydCB7TWF0QnV0dG9uLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25CdXR0b259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcbmltcG9ydCB7Tmd4UGFnaW5hdGlvbk1vZHVsZX0gZnJvbSBcIm5neC1wYWdpbmF0aW9uXCI7XG5pbXBvcnQge0J1dHRvbkFjdGlvbnNDb21wb25lbnR9IGZyb20gXCIuLi9idXR0b24tYWN0aW9ucy9idXR0b24tYWN0aW9ucy5jb21wb25lbnRcIjtcbmltcG9ydCB7U2hhcmVEYXRhU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3RyaWdnZXItZm9ybS5zZXJ2aWNlXCI7XG5pbXBvcnQge0Jhc2VVdGlsc30gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcbmltcG9ydCB7QmFja2VuZFNlcnZpY2V9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9iYWNrZW5kLXNlcnZpY2VcIjtcbmltcG9ydCB7RmlsdGVyfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWx0ZXIubW9kZWxcIjtcbmltcG9ydCB7RmlsdGVyUmVxdWVzdH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZmlsdGVyLXJlcXVlc3RcIjtcbmltcG9ydCB7XG4gIEJ1dHRvbkFjdGlvblNldHRpbmdzLFxuICBFTVBUWV9QQUdFX0lORk8sXG4gIEZpZWxkSW5mbyxcbiAgRlJPTlRfRU5EX0NPTFVNTl9UWVBFUyxcbiAgUGFnZUluZm8sXG4gIFRBQkxFX1JFQ09SRF9BQ1RJT04sXG4gIFRhYmxlQ29sdW1uXG59IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsXCI7XG5pbXBvcnQge1JlcG9ydFJlcXVlc3R9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3JlcG9ydC1yZXF1ZXN0Lm1vZGVsXCI7XG5pbXBvcnQge1RhYmxlUGFnZVVzZXJBY3Rpb259IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3RhYmxlLXBhZ2UtdXNlci1hY3Rpb24uaW50ZXJmYWNlXCI7XG5pbXBvcnQge1dvcmtmbG93fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC93b3JrZmxvdy93b3JrZmxvdy5tb2RlbFwiO1xuaW1wb3J0IHtSZXNwb25zZUVudmVsb3B9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3Jlc3BvbnNlLWVudmVsb3AubW9kZWxcIjtcbmltcG9ydCB7Um91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQge0xpdmVBbm5vdW5jZXJ9IGZyb20gXCJAYW5ndWxhci9jZGsvYTExeVwiO1xuaW1wb3J0IHtUaXRsZUJhckNvbXBvbmVudH0gZnJvbSBcIi4uL3RpdGxlLWJhci90aXRsZS1iYXIuY29tcG9uZW50XCI7XG5pbXBvcnQge1BhZ2luYXRvckNvbXBvbmVudH0gZnJvbSBcIi4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50XCI7XG5pbXBvcnQge01hdENoZWNrYm94fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3hcIjtcbmltcG9ydCB7RmlsdGVyQnVpbGRlckNvbXBvbmVudH0gZnJvbSBcIi4uL2FkdmFuY2VkLWZpbHRlci9maWx0ZXItYnVpbGRlci9maWx0ZXItYnVpbGRlci5jb21wb25lbnRcIjtcbmltcG9ydCB7RmllbGRGaWx0ZXJ9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL2ZpZWxkLWZpbHRlci5tb2RlbFwiO1xuaW1wb3J0IHtNYXRNZW51LCBNYXRNZW51SXRlbSwgTWF0TWVudVRyaWdnZXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9tZW51XCI7XG5pbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludHN9IGZyb20gXCJAYW5ndWxhci9jZGsvbGF5b3V0XCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1iYXNlLXRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2UtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9iYXNlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtdLFxuICBpbXBvcnRzOiBbXG4gICAgTmdTdHlsZSxcbiAgICBOZ0NsYXNzLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBNYXRJY29uLFxuICAgIE1hdFNvcnRNb2R1bGUsXG4gICAgTmdJZixcbiAgICBOZ1N3aXRjaCxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgRGF0ZVBpcGUsXG4gICAgQ3VycmVuY3lQaXBlLFxuICAgIE5neFBhZ2luYXRpb25Nb2R1bGUsXG4gICAgTmdTd2l0Y2hDYXNlLFxuICAgIE5nU3dpdGNoRGVmYXVsdCxcbiAgICBNYXRJY29uQnV0dG9uLFxuICAgIE5nRm9yT2YsXG4gICAgTWF0QnV0dG9uLFxuICAgIEJ1dHRvbkFjdGlvbnNDb21wb25lbnQsXG4gICAgVGl0bGVCYXJDb21wb25lbnQsXG4gICAgUGFnaW5hdG9yQ29tcG9uZW50LFxuICAgIERlY2ltYWxQaXBlLFxuICAgIE1hdENoZWNrYm94LFxuICAgIEZpbHRlckJ1aWxkZXJDb21wb25lbnQsXG4gICAgTWF0TWVudVRyaWdnZXIsXG4gICAgTWF0TWVudSxcbiAgICBNYXRNZW51SXRlbSxcblxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEJhc2VUYWJsZUNvbXBvbmVudCBleHRlbmRzIEJhc2VVdGlscyBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICB0eXBlczogc3RyaW5nW10gPSBbXCJwZGZcIiwgXCJjc3ZcIiwgXCJ4bHN4XCJdXG4gIGNvbGxlY3Rpb24gPSB7Y291bnQ6IDYwLCBkYXRhOiBbXX07XG4gIGNvbmZpZyA9IHtcbiAgICBpdGVtc1BlclBhZ2U6IDEwLFxuICAgIGN1cnJlbnRQYWdlOiAxLFxuICAgIHRvdGFsSXRlbXM6IHRoaXMuY29sbGVjdGlvbi5jb3VudFxuICB9O1xuICBwdWJsaWMgbWF4U2l6ZTogbnVtYmVyID0gNztcbiAgcHVibGljIGRpcmVjdGlvbkxpbmtzOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGF1dG9IaWRlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyByZXNwb25zaXZlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGxhYmVsczogYW55ID0ge1xuICAgIHByZXZpb3VzTGFiZWw6ICc8JyxcbiAgICBuZXh0TGFiZWw6ICc+JyxcbiAgICBzY3JlZW5SZWFkZXJQYWdpbmF0aW9uTGFiZWw6ICdQYWdpbmF0aW9uJyxcbiAgICBzY3JlZW5SZWFkZXJQYWdlTGFiZWw6ICdwYWdlJyxcbiAgICBzY3JlZW5SZWFkZXJDdXJyZW50TGFiZWw6IGBZb3UncmUgb24gcGFnZWBcbiAgfTtcblxuICBASW5wdXQoKVxuICBmaWx0ZXJGaWVsZHM6IEZpZWxkSW5mb1tdO1xuICBASW5wdXQoKSBub0RhdGFGb3VuZFN2Z1BhdGg6IHN0cmluZztcbiAgQElucHV0KCkgbm9EYXRhRm91bmRUaXRsZSA9ICdub0RhdGFGb3VuZFRpdGxlJztcbiAgQElucHV0KCkgbm9EYXRhRm91bmRTdWJ0aXRsZSA9ICdub0RhdGFGb3VuZFN1YnRpdGxlJztcbiAgQElucHV0KCkgbm9SZXN1bHRTdmdQYXRoOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG5vUmVzdWx0VGl0bGUgPSAnbm9SZXN1bHRUaXRsZSc7XG4gIEBJbnB1dCgpIG5vUmVzdWx0U3VidGl0bGUgPSAnbm9SZXN1bHRTdWJ0aXRsZSc7XG4gIHRvdGFsRWxlbWVudHMgPSAwO1xuICBwYWdlc0NvdW50ID0gMDtcbiAgcGFnZUluZGV4ID0gMTtcbiAgcGFnZVNpemUgPSAxMDtcbiAgbW9iaWxlRGlzcGxheWVkSXRlbXMgPSAwO1xuICBwcml2YXRlIHNlbGVjdGVkU3RhdHVzRmlsdGVyOiBGaWx0ZXJbXSA9IFtdO1xuICBhZHZhbmNlZEFwcGxpZWRGaWx0ZXI6IGFueVtdID0gW107XG4gIHBlbmRpbmdGaWx0ZXJzOiBhbnlbXSA9IFtdO1xuICBzZWFyY2hTdHI6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIGZpbHRlclJlcXVlc3Q6IEZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCgpO1xuICBwcml2YXRlIHRpbWVyOiBhbnk7XG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHBhZ2VJbmZvOiBQYWdlSW5mbyA9IEVNUFRZX1BBR0VfSU5GTztcblxuICBASW5wdXQoKVxuICBlbmFibGVQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBtb2JpbGVQYWdlU2l6ZTogbnVtYmVyID0gMjtcblxuICBASW5wdXQoKVxuICBtb2JpbGVMb2FkTW9yZUluY3JlbWVudDogbnVtYmVyID0gMjtcblxuICBASW5wdXQoKSBkYXRhPzogTWF0VGFibGVEYXRhU291cmNlPGFueT47XG4gIEBJbnB1dCgpXG4gIGxpc3RBY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBleHRyYUFjdGlvbnM6IEJ1dHRvbkFjdGlvblNldHRpbmdzW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBidXR0b25zRGlzcGxheU1vZGU6ICdkcm9wZG93bicgfCAnbGlzdCcgPSAnZHJvcGRvd24nO1xuXG4gIEBJbnB1dCgpXG4gIGNvbHVtbnM6IFRhYmxlQ29sdW1uPGFueT5bXTtcblxuICBASW5wdXQoKVxuICBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxuICBwYXRoUGFyYW06IG51bWJlcjtcblxuICBASW5wdXQoKVxuICBleHRyYUJ1dHRvbjogIEJ1dHRvbkFjdGlvblNldHRpbmdzW10gPSBbXTtcblxuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QnV0dG9uQWN0aW9uU2V0dGluZ3M+KCk7XG5cbiAgQElucHV0KCkgLy9AdHMtaWdub3JlXG4gIGVuZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgaXNQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgdHJpZ2dlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHJlcG9ydFJlcXVlc3Q6IFJlcG9ydFJlcXVlc3QgPSBuZXcgUmVwb3J0UmVxdWVzdCh7fSk7XG5cbiAgQElucHV0KClcbiAgc2VwYXJhdGVFbmRwb2ludERhdGE6IGFueTtcbiAgQElucHV0KClcbiAgbWFuYWdlYWJsZVBhZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHRvdGFsUGFnZXNDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KClcbiAgY3VycmVudFBhZ2VJbmRleDogbnVtYmVyID0gMDtcblxuICBAT3V0cHV0KClcbiAgcGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblxuICBAT3V0cHV0KClcbiAgdXNlckFjdGlvbjogRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZVBhZ2VVc2VyQWN0aW9uPigpO1xuICBAT3V0cHV0KClcbiAgaHlwZXJMaW5rQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGV4dHJhQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHNlbGVjdGVkQ29sdW1uOiBFdmVudEVtaXR0ZXI8U29ydD4gPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGxpc3RBY3Rpb25DbGlja2VkOiBFdmVudEVtaXR0ZXI8eyBhY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzLCByb3c6IGFueSAsIGlzUGVuZGluZzogYm9vbGVhbn0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgYWN0aW9uOiBCdXR0b25BY3Rpb25TZXR0aW5ncyxcbiAgICByb3c6IGFueSxcbiAgICBpc1BlbmRpbmc6IGJvb2xlYW5cbiAgfT4oKTtcblxuICBAT3V0cHV0KClcbiAgcGVuZGluZ1ZpZXdNb2RlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBAT3V0cHV0KClcbiAgc2hvd0RpYWxvZzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICB1c2VkV29ya2Zsb3chOiBXb3JrZmxvdztcblxuICBtb2RlOmFueTtcblxuICBASW5wdXQoKVxuICBjdXN0b21pemVkRGF0YT86IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xuICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcbiAgc2VsZWN0ZWRSb3dJbmRleCA9IC0xO1xuICBub0RhdGFGb3VuZCA9IGZhbHNlO1xuICB0b3RhbFJlcXVpcmVkQ291bnRJdGVtID0gMDtcblxuXG4gIEBPdXRwdXQoKVxuICBjbGlja1JvdXRlUGFnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgYmFja2VuZFNlcnZpY2U6IEJhY2tlbmRTZXJ2aWNlLFxuICAgICAgcHVibGljIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICBwdWJsaWMgc2hhcmVEYXRhU2VydmljZTogU2hhcmVEYXRhU2VydmljZSxcbiAgICAgIHByaXZhdGUgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIsXG4gICAgICBASW5qZWN0KCdzZWN1cml0eU1hbmFnZXInKSBwcml2YXRlIHNlY3VyaXR5TWFuYWdlcjogYW55LFxuICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgbGl2ZUFubm91bmNlcjogTGl2ZUFubm91bmNlcixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKCk7XG4gICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0ID0gbmV3IEZpbHRlclJlcXVlc3QoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5iYWNrZW5kU2VydmljZS5pc0VtcHR5SXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPD0gMDtcbiAgICBpZiAodGhpcy5jdXN0b21pemVkRGF0YSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlID0gdGhpcy5jdXN0b21pemVkRGF0YTtcbiAgICB9XG4gICAgaWYodGhpcy5tYW5hZ2VhYmxlUGFnZXMpIHtcbiAgICAgIHRoaXMucGFnZXNDb3VudCA9IHRoaXMudG90YWxQYWdlc0NvdW50O1xuICAgICAgdGhpcy5wYWdlSW5kZXggPSB0aGlzLmN1cnJlbnRQYWdlSW5kZXg7XG4gICAgfVxuXG4gICAgdGhpcy5tb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IHRoaXMucGFnZVNpemU7XG5cbiAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlclxuICAgICAgLm9ic2VydmUoWycobWF4LXdpZHRoOiA3NjhweCknXSlcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5tYXRjaGVzKSB7XG4gICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDI7XG4gICAgICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDEwO1xuICAgICAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQ7XG4gICAgdGhpcy5nZXROZXh0KHRoaXMucGFnZUluZGV4IC0gMSk7XG4gICAgaWYgKHRoaXMubWFuYWdlYWJsZVBhZ2VzKSB7XG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnBhZ2VJbmRleCk7XG4gICAgfVxuICB9XG5cblxuICBleHRyYWN0RmllbGROYW1lKGVsZW1lbnQ6IGFueSwgcHJvcGVydHk6IHN0cmluZykge1xuICAgIGlmIChwcm9wZXJ0eT8uaW5jbHVkZXMoJy4nKSkge1xuICAgICAgcmV0dXJuIHByb3BlcnR5LnNwbGl0KCcuJykucmVkdWNlKChhY2MsIHBhcnQpID0+IGFjYyAmJiBhY2NbcGFydF0sIGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5jb2x1bW5zLmZpbmQoYyA9PiBjLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50W3Byb3BlcnR5XSkgJiYgYz8uYXJyYXlTdWJQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlcyA9IGVsZW1lbnRbcHJvcGVydHldLm1hcChmID0+IGZbYy5hcnJheVN1YlByb3BlcnR5XSk7XG4gICAgICAgIHJldHVybiBmaWVsZFZhbHVlcy5qb2luKCcsICcpO1xuICAgICAgfVxuICAgICAgaWYgKGM/LnR5cGUgPT09ICdsaXN0JyAmJiBBcnJheS5pc0FycmF5KGVsZW1lbnRbcHJvcGVydHldKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMaXN0SXRlbXMoZWxlbWVudCwgcHJvcGVydHkpLmpvaW4oJyDigKIgJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudFtwcm9wZXJ0eV07XG4gICAgfVxuICB9XG5cbiAgZ2V0TGlzdEl0ZW1zKGVsZW1lbnQ6IGFueSwgcHJvcGVydHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWx1ZSA9IHByb3BlcnR5Py5pbmNsdWRlcygnLicpXG4gICAgICA/IHByb3BlcnR5LnNwbGl0KCcuJykucmVkdWNlKChhY2MsIHBhcnQpID0+IGFjYyAmJiBhY2NbcGFydF0sIGVsZW1lbnQpXG4gICAgICA6IGVsZW1lbnQ/Lltwcm9wZXJ0eV07XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgICAgIC5tYXAoaXRlbSA9PiAoaXRlbSA9PSBudWxsID8gJycgOiBTdHJpbmcoaXRlbSkpKVxuICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0ubGVuZ3RoID4gMCk7XG4gIH1cblxuICBnZXQgdmlzaWJsZUNvbHVtbnMoKSB7XG4gICAgdGhpcy5idWlsZEdyb3VwcygpXG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5wcm9wZXJ0eSk7XG4gIH1cblxuICBnZXQgdmlzaWJsZUNvbHVtbnNBcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgfVxuXG4gIGdldENvbHVtbihwcm9wZXJ0eTogc3RyaW5nKTogVGFibGVDb2x1bW48YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICB9XG5cbiAgZ2V0U29ydERpcmVjdGlvbihwcm9wZXJ0eTogc3RyaW5nKTogJ2FzYycgfCAnZGVzYycgfCAnJyB7XG4gICAgY29uc3Qgc29ydEtleSA9IHRoaXMucmVwb3J0UmVxdWVzdD8uZmlsdGVyUmVxdWVzdD8uc29ydEtleTtcbiAgICBpZiAoIXNvcnRLZXkgfHwgIXRoaXMuaXNTb3J0ZWRDb2x1bW4ocHJvcGVydHksIHNvcnRLZXkpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5zb3J0RGlyZWN0aW9uID09PSAnQVNDJyA/ICdhc2MnIDogJ2Rlc2MnO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NvcnRlZENvbHVtbihwcm9wZXJ0eTogc3RyaW5nLCBzb3J0S2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbihwcm9wZXJ0eSk7XG4gICAgY29uc3QgY29sdW1uU29ydEtleSA9IGNvbHVtbj8uc29ydEtleSA/PyBwcm9wZXJ0eTtcbiAgICByZXR1cm4gc29ydEtleSA9PT0gY29sdW1uU29ydEtleSB8fCBzb3J0S2V5ID09PSBwcm9wZXJ0eTtcbiAgfVxuXG4gIGhhbmRsZVNvcnRDbGljayhwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgQ09MVU1OID0gdGhpcy5nZXRDb2x1bW4ocHJvcGVydHkpO1xuICAgIGlmICghQ09MVU1OIHx8ICFDT0xVTU4uZW5hYmxlU29ydGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IENVUlJFTlRfRElSRUNUSU9OID0gdGhpcy5nZXRTb3J0RGlyZWN0aW9uKHByb3BlcnR5KTtcbiAgICBsZXQgTkVXX0RJUkVDVElPTjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcblxuICAgIGlmIChDVVJSRU5UX0RJUkVDVElPTiA9PT0gJ2FzYycpIHtcbiAgICAgIE5FV19ESVJFQ1RJT04gPSAnZGVzYyc7XG4gICAgfVxuXG4gICAgdGhpcy5vblNvcnRBY3Rpb24oe1xuICAgICAgYWN0aXZlOiBwcm9wZXJ0eSxcbiAgICAgIGRpcmVjdGlvbjogTkVXX0RJUkVDVElPTlxuICAgIH0pO1xuICB9XG5cbiAgb25Tb3J0SGVhZGVyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgY29sdW1uUHJvcDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmdldENvbHVtbihjb2x1bW5Qcm9wKT8uZW5hYmxlU29ydGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5oYW5kbGVTb3J0Q2xpY2soY29sdW1uUHJvcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIGFyaWEtc29ydCBvbiBzb3J0YWJsZSBjb2x1bW4gaGVhZGVycyAoV0NBRyB0YWJsZSBzZW1hbnRpY3MpLiAqL1xuICBnZXRDb2x1bW5BcmlhU29ydChjb2x1bW5Qcm9wOiBzdHJpbmcpOiAnYXNjZW5kaW5nJyB8ICdkZXNjZW5kaW5nJyB8ICdub25lJyB8IG51bGwge1xuICAgIGlmICghdGhpcy5nZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBkID0gdGhpcy5nZXRTb3J0RGlyZWN0aW9uKGNvbHVtblByb3ApO1xuICAgIGlmIChkID09PSAnYXNjJykge1xuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xuICAgIH1cbiAgICBpZiAoZCA9PT0gJ2Rlc2MnKSB7XG4gICAgICByZXR1cm4gJ2Rlc2NlbmRpbmcnO1xuICAgIH1cbiAgICByZXR1cm4gJ25vbmUnO1xuICB9XG5cbiAgc29ydFN0YXRlOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBpbml0aWFsRGF0YUxvYWRTY2hlZHVsZWQgPSBmYWxzZTtcblxuICBnZXROZXh0KHBhZ2VJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gIH1cbiAgb25QYWdlU2l6ZUNoYW5nZShldmVudDogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50O1xuICAgIHRoaXMucGFnZUluZGV4ID0gMTsgLy8gcmVzZXQgdG8gZmlyc3QgcGFnZSBvbiBwYWdlIHNpemUgY2hhbmdlXG4gICAgdGhpcy5tb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IDA7XG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMuZ2V0TmV4dCgwKTtcbiAgfVxuXG4gIG9uTG9hZE1vcmUoaXRlbXNUb0xvYWQ6IG51bWJlcikge1xuICAgIGNvbnN0IGN1cnJlbnREaXNwbGF5ZWQgPSB0aGlzLm1vYmlsZURpc3BsYXllZEl0ZW1zIHx8IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCB8fCB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMucGFnZVNpemUgPSBNYXRoLm1pbihjdXJyZW50RGlzcGxheWVkICsgaXRlbXNUb0xvYWQsIHRoaXMudG90YWxFbGVtZW50cyk7XG4gICAgdGhpcy5tb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IHRoaXMucGFnZVNpemU7XG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCA9IDA7XG4gICAgdGhpcy5wYWdlSW5kZXggPSAxO1xuICAgIHRoaXMubG9hZERhdGEodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWREYXRhKHNraXBNb2JpbGVSZXNldDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuXG4gICAgaWYgKCFza2lwTW9iaWxlUmVzZXQpIHtcbiAgICAgIC8vIHRoaXMuaW5pdGlhbGl6ZU1vYmlsZVBhZ2VTaXplKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdCkge1xuICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCh0aGlzLnBhZ2VTaXplIHx8IHRoaXMucGFnZUluZm8ucGFnZVNpemUpO1xuICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc2VhcmNoU3RyID0gdGhpcy5zZWFyY2hTdHI7XG4gICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5maWx0ZXJzID0gW1xuICAgICAgICAuLi4odGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgfHwgW10pLFxuICAgICAgICAuLi4odGhpcy5maWx0ZXJzIHx8IFtdKS5maWx0ZXIoZiA9PlxuICAgICAgICAgICEodGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgfHwgW10pLnNvbWUoYSA9PiBhLmZpZWxkID09PSBmLmZpZWxkTmFtZSlcbiAgICAgICAgKVxuICAgICAgXTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG4gICAgaWYgKHRoaXMubWFuYWdlYWJsZVBhZ2VzKSB7XG4gICAgICB0aGlzLnN5bmNDbGllbnREYXRhU291cmNlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNlcGFyYXRlRW5kcG9pbnREYXRhIHx8ICF0aGlzLnBhZ2VJbmZvLmFwaVVyaSB8fCB0aGlzLnBhZ2VJbmZvLmFwaVVyaS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuc3luY0NsaWVudERhdGFTb3VyY2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYodGhpcy5yZXBvcnRSZXF1ZXN0ID09IHVuZGVmaW5lZCl7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKCF0aGlzLm1hbmFnZWFibGVQYWdlcykgIHtcbiAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QuY29sdW1ucyA9IHRoaXMuY29sdW1ucz8uZmlsdGVyKGMgPT4gRlJPTlRfRU5EX0NPTFVNTl9UWVBFUy5pbmRleE9mKGMudHlwZSkgPCAwICkubWFwKGMgPT4gYy5wcm9wZXJ0eSkgfHwgW107XG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGVuZGluZ1BhZ2UgPSB0aGlzLmlzUGVuZGluZztcbiAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5zZWFyY2hTdHIgPSB0aGlzLnNlYXJjaFN0cjtcbiAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5maWx0ZXJzID0gW1xuICAgICAgICAgICAgLi4uKHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLih0aGlzLmZpbHRlcnMgfHwgW10pLmZpbHRlcihmID0+XG4gICAgICAgICAgICAgICEodGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgfHwgW10pLnNvbWUoYSA9PiBhLmZpZWxkID09PSBmLmZpZWxkTmFtZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICBdO1xuICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5nZXRJdGVtc0J5RmlsdGVyKHRoaXMucmVwb3J0UmVxdWVzdD8uZmlsdGVyUmVxdWVzdCwgdGhpcy5wYWdlSW5mby5hcGlVcmkpLnN1YnNjcmliZShyZXNwID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VFbnZlbG9wZSA9IG5ldyBSZXNwb25zZUVudmVsb3AocmVzcCk7XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZUVudmVsb3BlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbFJlcXVpcmVkQ291bnRJdGVtID0gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemVcbiAgICAgICAgICAgICAgICB0aGlzLm5vRGF0YUZvdW5kID0gcmVzcG9uc2VFbnZlbG9wZS5ib2R5Lmxlbmd0aCA8IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSByZXNwb25zZUVudmVsb3BlLmJvZHk7XG4gICAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5pc0VtcHR5SXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPD0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSByZXNwb25zZUVudmVsb3BlLnRvdGFsU2l6ZSB8fCAwO1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZXNDb3VudCA9IE1hdGguY2VpbCh0aGlzLnRvdGFsRWxlbWVudHMgLyB0aGlzLnBhZ2VTaXplKSB8fCAxO1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gKHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcudG90YWxJdGVtcyA9IHJlc3BvbnNlRW52ZWxvcGUudG90YWxTaXplIHx8IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmFubm91bmNlVGFibGVSZXN1bHRzKCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLCAzMDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0NsaWVudERhdGFTb3VyY2UoKTogdm9pZCB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuY3VzdG9taXplZERhdGE/LmRhdGEgPz8gdGhpcy5zZXBhcmF0ZUVuZHBvaW50RGF0YSA/PyBbXTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHJvd3M7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5hbm5vdW5jZVRhYmxlUmVzdWx0cygpKTtcbiAgfVxuXG4gIHByaXZhdGUgYW5ub3VuY2VUYWJsZVJlc3VsdHMoKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoID8/IDA7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRWxlbWVudHMgPz8gdmlzaWJsZTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0JBU0VfVEFCTEUucmVzdWx0c0Fubm91bmNlbWVudCcsIHtcbiAgICAgIHZpc2libGUsXG4gICAgICB0b3RhbCxcbiAgICB9KTtcbiAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShtZXNzYWdlLCAncG9saXRlJyk7XG4gIH1cblxuICBnZXRTdGF0dXNEZXNjcmlwdGlvbihlbGVtZW50OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5iYWNrZW5kU2VydmljZS5nZXRTdGF0dXNEZXNjcmlwdGlvbihlbGVtZW50LCB0aGlzLnVzZWRXb3JrZmxvdyk7XG4gIH1cblxuICBnZXRTdGF0ZVR5cGUoZWxlbWVudDogYW55KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuc3RhdGVUeXBlXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbXCJjdXN0b21pemVkRGF0YVwiXSkge1xuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IGNoYW5nZXNbXCJjdXN0b21pemVkRGF0YVwiXS5jdXJyZW50VmFsdWUgYXMgTWF0VGFibGVEYXRhU291cmNlPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZGF0YVNvdXJjZSkge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xuICAgICAgfVxuICAgICAgdGhpcy5zeW5jQ2xpZW50RGF0YVNvdXJjZSgpO1xuICAgICAgaWYgKCFjaGFuZ2VzW1wiY3VzdG9taXplZERhdGFcIl0uaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICAgIHRoaXMucGFnZXNDb3VudCA9IHRoaXMudG90YWxQYWdlc0NvdW50O1xuICAgICAgICB0aGlzLnBhZ2VJbmRleCA9IHRoaXMuY3VycmVudFBhZ2VJbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJlbmZvcmNlUmVmcmVzaFwiXSAmJiAhY2hhbmdlc1tcImVuZm9yY2VSZWZyZXNoXCJdLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcImlzUGVuZGluZ1wiXSAmJiAhY2hhbmdlc1tcImlzUGVuZGluZ1wiXS5pc0ZpcnN0Q2hhbmdlKCkpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3BhZ2VJbmZvJ10gfHwgY2hhbmdlc1snY29sdW1ucyddKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlSW5pdGlhbExvYWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlSW5pdGlhbExvYWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbERhdGFMb2FkU2NoZWR1bGVkIHx8IHRoaXMubWFuYWdlYWJsZVBhZ2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnBhZ2VJbmZvLmxhenlMb2FkRGF0YSA9PT0gdHJ1ZSAmJiB0aGlzLmVuZm9yY2VSZWZyZXNoICE9PSB0cnVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5wYWdlSW5mbz8uYXBpVXJpICYmICF0aGlzLnNlcGFyYXRlRW5kcG9pbnREYXRhICYmICF0aGlzLmN1c3RvbWl6ZWREYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbERhdGFMb2FkU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmxvYWREYXRhKCkpO1xuICB9XG4gIGdldENyb3BwZWRUZXh0KGVsZW1lbnRWYWx1ZTogYW55LCBzdWJXaWR0aDogbnVtYmVyID0gMjApIHtcbiAgICByZXR1cm4gZWxlbWVudFZhbHVlICYmIGVsZW1lbnRWYWx1ZS5sZW5ndGggPiBzdWJXaWR0aCA/IGVsZW1lbnRWYWx1ZS5zdWJzdHJpbmcoMCwgc3ViV2lkdGgpICsgXCIuLi5cIiA6IGVsZW1lbnRWYWx1ZTtcbiAgfVxuXG4gIGVtaXRFdmVudChlbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLnNob3dEaWFsb2cuZW1pdChlbGVtZW50KTtcbiAgfVxuXG4gIGV4dHJhY3RGb3JtYXQoY29sdW1uOiBUYWJsZUNvbHVtbjxhbnk+KSB7XG4gICAgcmV0dXJuIGNvbHVtbj8uZm9ybWF0IHx8ICdkL00veXl5eSwgaDptbSBhJztcbiAgfVxuXG4gIGFjdGlvbkxpc3RDbGlja2VkKGxpc3RBY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzLCBlbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLmxpc3RBY3Rpb25DbGlja2VkLmVtaXQoe2FjdGlvbjpsaXN0QWN0aW9uLCByb3c6IGVsZW1lbnQsIGlzUGVuZGluZzogdGhpcy5pc1BlbmRpbmd9KTtcbiAgfVxuXG4gIGh5cGVyTGlua0NsaWNrZWQoYWN0aW9uTmFtZTogc3RyaW5nLCBlbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBUQUJMRV9SRUNPUkRfQUNUSU9OO1xuICAgIGFjdGlvbi5hY3Rpb25LZXkgPSBhY3Rpb25OYW1lO1xuICAgIGFjdGlvbi5pdGVtID0gZWxlbWVudDtcbiAgICBhY3Rpb24ucGFnZUluZm8gPSB0aGlzLnBhZ2VJbmZvO1xuICAgIHRoaXMuaHlwZXJMaW5rQWN0aW9uLmVtaXQoYWN0aW9uKVxuICB9XG5cblxuICBlbWl0Um91dGVQYWdlKGVsZW1lbnQ6IGFueSl7XG4gICAgdGhpcy5jbGlja1JvdXRlUGFnZS5lbWl0KGVsZW1lbnQpO1xuICB9XG5cbiAgb25TZWxlY3RJdGVtKHJvdzogYW55KSB7XG4gICAgaWYgKHRoaXMucGFnZUluZm8uc2VsZlJvdXRpbmcpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmlzUGVuZGluZyA/ICdwZW5kaW5nJyA6ICd2aWV3JztcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aCB8fCB0aGlzLnJvdXRlci51cmx9L3ZpZXdgO1xuXG4gICAgICBjb25zdCBlbmNyeXB0ZWRJZCA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChTdHJpbmcocm93LmlkKSk7XG4gICAgICBjb25zdCBlbmNyeXB0ZWRNb2RlID0gdGhpcy5iYWNrZW5kU2VydmljZS5lbmNyeXB0KG1vZGUpO1xuXG4gICAgICBjb25zdCBlbmNyeXB0ZWRSb3cgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoSlNPTi5zdHJpbmdpZnkocm93KSk7XG5cbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdLCB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiB7IHRva2VuOiBlbmNyeXB0ZWRJZCwgbW9kZTogZW5jcnlwdGVkTW9kZSB9LFxuICAgICAgICBzdGF0ZTogeyByYXc6IGVuY3J5cHRlZFJvdyB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGNvbnN0IGFjdGlvbiA9IFNFTEVDVF9SRUNPUkRfQUNUSU9OO1xuICAgIC8vIGFjdGlvbi5pZCA9IHJvdz8uaWQ7XG4gICAgLy8gYWN0aW9uLml0ZW0gPSByb3c7XG4gICAgLy8gdGhpcy51c2VyQWN0aW9uLmVtaXQoYWN0aW9uKVxuICB9XG5cbiAgb3Blbk5ld1RhYihyb3cpIHtcbiAgICBpZiAoIXRoaXMucGFnZUluZm8uZW1iZWRlZFRhYmxlT25seSkge1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuaXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJ3ZpZXcnO1xuICAgICAgd2luZG93Lm9wZW4oYCR7dGhpcy5wYWdlSW5mby5saXN0Um91dGVQYXRofS8ke21vZGV9YCArICcvJyArIHJvdz8uaWQpO1xuICAgIH1cbiAgfVxuXG4gIG9uVmlld01vZGVDaGFuZ2VkUmVjZWl2ZWQoaXNQZW5kaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5wZW5kaW5nVmlld01vZGVDaGFuZ2VkLmVtaXQoaXNQZW5kaW5nKTtcbiAgICB0aGlzLnN3aXRjaFZpZXdNb2RlKGlzUGVuZGluZyk7XG4gIH1cblxuICBzd2l0Y2hWaWV3TW9kZShpc1BlbmRpbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzUGVuZGluZyA9IGlzUGVuZGluZztcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gIH1cblxuICBvbkFkZE5ld0FjdGlvbigkZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aCB8fCB0aGlzLnJvdXRlci51cmx9L3ZpZXdgO1xuICAgIGNvbnN0IGVuY3J5cHRlZElkID0gdGhpcy5iYWNrZW5kU2VydmljZS5lbmNyeXB0KFwiLTFcIik7XG4gICAgY29uc3QgZW5jcnlwdGVkTW9kZSA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChcInBlbmRpbmdcIik7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3VybH1gXSxcbiAgICAgIHsgcXVlcnlQYXJhbXM6IHsgdG9rZW46IGVuY3J5cHRlZElkICwgbW9kZSA6IGVuY3J5cHRlZE1vZGUgfSB9KTtcblxuICAgIC8vIGNvbnN0IGFjdGlvbiA9IFNFTEVDVF9SRUNPUkRfQUNUSU9OO1xuICAgIC8vIGFjdGlvbi5pZCA9IHJvdz8uaWQ7XG4gICAgLy8gYWN0aW9uLml0ZW0gPSByb3c7XG4gICAgLy8gdGhpcy51c2VyQWN0aW9uLmVtaXQoYWN0aW9uKVxuICB9XG5cbiAgc2hvd0FkZE5ldygpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlSW5mby5oYXNBZGRCdXR0b24gO1xuICB9XG5cbiAgb25FeHRyYUJ1dHRpb25BY3Rpb24oJGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmV4dHJhQWN0aW9uLmVtaXQoJGV2ZW50KTtcblxuICB9XG5cbiAgaGFzR3JvdXBzKCkge1xuICAgIGxldCBiID0gdGhpcy5jb2x1bW5zLmZpbmRJbmRleChwID0+IHAuZ3JvdXApO1xuICAgIHJldHVybiBiID49IDA7XG4gIH1cbiAgZ3JvdXBOYW1lczogYW55ID0gW11cbiAgZ3JvdXBTcGFuczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcblxuICBidWlsZEdyb3Vwcygpe1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgdGhpcy5ncm91cE5hbWVzID0gW107XG4gICAgdGhpcy5ncm91cFNwYW5zLmNsZWFyKCk7XG4gICAgaWYodGhpcy5oYXNHcm91cHMoKSA9PT0gZmFsc2Upe1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvbHVtbnNcbiAgICAgIC5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlID09PSB0cnVlKVxuICAgICAgLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmdyb3VwID09PSBcIi1cIikge1xuICAgICAgICAgIHRoaXMuZ3JvdXBOYW1lcy5wdXNoKGNvdW50LnRvU3RyaW5nKCkpO1xuICAgICAgICAgIHRoaXMuaW5zZXJ0SW5NYXAoY291bnQpO1xuICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdyb3VwTmFtZXMuaW5jbHVkZXMoY29sdW1uLmdyb3VwKSkge1xuICAgICAgICAgIHRoaXMuZ3JvdXBOYW1lcy5wdXNoKGNvbHVtbi5ncm91cCk7XG4gICAgICAgICAgdGhpcy5pbnNlcnRJbk1hcChjb2x1bW4uZ3JvdXApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluc2VydEluTWFwKGNvbHVtbi5ncm91cCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGluc2VydEluTWFwKGtleSl7XG4gICAgaWYodGhpcy5ncm91cFNwYW5zLmhhcyhrZXkpKXtcbiAgICAgIHRoaXMuZ3JvdXBTcGFucy5zZXQoa2V5LnRvU3RyaW5nKCksIHRoaXMuZ3JvdXBTcGFucy5nZXQoa2V5KSArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdyb3VwU3BhbnMuc2V0KGtleS50b1N0cmluZygpLCAxKTtcbiAgICB9XG4gIH1cblxuICBpc0h1bWFuTWFkZShzdHIpe1xuICAgIHJldHVybiBpc05hTihzdHIpO1xuICB9XG5cbiAgYWN0aW9uQnV0dG9uQ2xpY2tlZChhY3Rpb25LZXk6IHN0cmluZywgaXRlbTogYW55KTogdm9pZCB7XG4gICAgaWYgKGFjdGlvbktleSA9PT0gJ25hdmlnYXRlJykge1xuICAgICAgdGhpcy5oYW5kbGVOYXZpZ2F0ZUFjdGlvbihpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXRUYWJsZUFjdGlvbihhY3Rpb25LZXksIGl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOYXZpZ2F0ZUFjdGlvbihpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RlID0gdGhpcy5pc1BlbmRpbmcgPyAncGVuZGluZycgOiAndmlldyc7XG4gICAgY29uc3QgYmFzZVBhdGggPSB0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGggfHwgdGhpcy5yb3V0ZXIudXJsO1xuICAgIGNvbnN0IHVybCA9IGAke2Jhc2VQYXRofS92aWV3YDtcblxuICAgIGNvbnN0IGVuY3J5cHRlZElkID0gdGhpcy5iYWNrZW5kU2VydmljZS5lbmNyeXB0KGl0ZW0uaWQudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgZW5jcnlwdGVkTW9kZSA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChtb2RlKTtcblxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdLCB7XG4gICAgICBxdWVyeVBhcmFtczogeyB0b2tlbjogZW5jcnlwdGVkSWQsIG1vZGU6IGVuY3J5cHRlZE1vZGUgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VGFibGVBY3Rpb24oYWN0aW9uS2V5OiBzdHJpbmcsIGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGlvbiA9IFRBQkxFX1JFQ09SRF9BQ1RJT047XG4gICAgYWN0aW9uLmFjdGlvbktleSA9IGFjdGlvbktleTtcbiAgICBhY3Rpb24uaXRlbSA9IGl0ZW07XG4gICAgYWN0aW9uLnBhZ2VJbmZvID0gdGhpcy5wYWdlSW5mbztcbiAgICB0aGlzLnVzZXJBY3Rpb24uZW1pdChhY3Rpb24pO1xuICB9XG5cbiAgZXh0cmFjdFJlcG9ydChyZXBvcnRUeXBlOiBhbnkpIHtcbiAgICBjb25zdCBteUZpbHRlcnMgPSB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdDtcbiAgICBjb25zdCByZXBvcnRSZXF1ZXN0ID0gdGhpcy5iYWNrZW5kU2VydmljZS5idWlsZFJlcG9ydFJlcXVlc3QodGhpcy5jb2x1bW5zLCB0aGlzLnBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLmxpc3RfdGl0bGUnLFxuICAgICAgbXlGaWx0ZXJzLCByZXBvcnRUeXBlLCB0aGlzLnBhZ2VJbmZvLCB0aGlzLnNlYXJjaFN0ciwgJ0xBTkRTQ0FQRScpO1xuICAgIHRoaXMuYmFja2VuZFNlcnZpY2UuZG93bmxvYWRSZXBvcnQocmVwb3J0UmVxdWVzdCwgdGhpcy5wYWdlSW5mby5hcGlVcmkpO1xuICB9XG5cbiAgZ2V0SWNvbihzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ3Bhc3MnOiByZXR1cm4gJ2NoZWNrX2NpcmNsZSc7XG4gICAgICBjYXNlICd3YXJuaW5nJzogcmV0dXJuICd3YXJuaW5nJztcbiAgICAgIGNhc2UgJ2Vycm9yJzogcmV0dXJuICdlcnJvcic7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ2hlbHAnO1xuICAgIH1cbiAgfVxuXG4gIGdldEljb25BcmlhTGFiZWxLZXkoc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICBjYXNlICdwYXNzJzpcbiAgICAgICAgcmV0dXJuICdCQVNFX1RBQkxFLnN0YXR1c0ljb25QYXNzJztcbiAgICAgIGNhc2UgJ3dhcm5pbmcnOlxuICAgICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzSWNvbldhcm5pbmcnO1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzSWNvbkVycm9yJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNJY29uVW5rbm93bic7XG4gICAgfVxuICB9XG5cbiAgZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzRmxhZ0FjdGl2ZSc7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNGbGFnSW5hY3RpdmUnO1xuICAgIH1cbiAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzRmxhZ1BlbmRpbmcnO1xuICB9XG5cbiAgYWN0aW9uQ2hlY2tlZENsaWNrZWQocHJvcGVydHk6IHN0cmluZywgZWxlbWVudCkge1xuICAgIGVsZW1lbnRbcHJvcGVydHldPSAhZWxlbWVudFtwcm9wZXJ0eV07XG4gICAgdGhpcy5hY3Rpb25CdXR0b25DbGlja2VkKHByb3BlcnR5LCBlbGVtZW50KTtcbiAgfVxuXG5cbiAgaXNEYXJrSGlnaGxpZ2h0KHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ3JvdXBCeVByb3AgPSB0aGlzLnBhZ2VJbmZvPy5ncm91cEJ5UHJvcGVydHk7XG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcblxuICAgIGlmICghZ3JvdXBCeVByb3AgfHwgIWdyb3VwQnlWYWx1ZXMgfHwgIXJvd1tncm91cEJ5UHJvcF0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjZWxsVmFsdWUgPSByb3dbZ3JvdXBCeVByb3BdLnRvU3RyaW5nKCk7XG5cbiAgICByZXR1cm4gZ3JvdXBCeVZhbHVlcy5zb21lKHZhbCA9PlxuICAgICAgY2VsbFZhbHVlLmluY2x1ZGVzKHZhbCkgJiYgY2VsbFZhbHVlLmxlbmd0aCA+IHZhbC5sZW5ndGhcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkUmVuZGVyQXNIeXBlckxpbmsoZWxlbWVudDogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ3JvdXBCeVByb3AgPSB0aGlzLnBhZ2VJbmZvPy5ncm91cEJ5UHJvcGVydHk7XG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcblxuICAgIGlmICghZ3JvdXBCeVByb3AgfHwgIWdyb3VwQnlWYWx1ZXMgfHwgIWVsZW1lbnRbZ3JvdXBCeVByb3BdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBlbGVtZW50W2dyb3VwQnlQcm9wXS50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuICFncm91cEJ5VmFsdWVzLnNvbWUodiA9PiB2YWx1ZS5pbmNsdWRlcyh2KSAmJiB2YWx1ZS5sZW5ndGggPj0gdi5sZW5ndGgpO1xuICB9XG5cblxuICBvblNvcnRBY3Rpb24oJGV2ZW50OiBTb3J0KSB7XG4gICAgY29uc3QgY29sID0gdGhpcy5jb2x1bW5zLmZpbmQoYyA9PiBjLnByb3BlcnR5ID09PSAkZXZlbnQuYWN0aXZlKTtcblxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnNvcnRLZXkgPVxuICAgICAgJGV2ZW50LmFjdGl2ZSAmJiAkZXZlbnQuZGlyZWN0aW9uXG4gICAgICAgID8gKGNvbD8uc29ydEtleSA/PyAkZXZlbnQuYWN0aXZlKVxuICAgICAgICA6ICdpZCc7XG5cbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5zb3J0RGlyZWN0aW9uID0gJGV2ZW50LmRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnQVNDJyA6ICdERVNDJztcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggPSAwO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW4uZW1pdCgkZXZlbnQpO1xuICAgIGlmICh0aGlzLm1hbmFnZWFibGVQYWdlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gIH1cblxuICBzaG91bGRTaG93QnV0dG9uKGVsZW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xuICAgIGNvbnN0IGdyb3VwQnlWYWx1ZXMgPSB0aGlzLnBhZ2VJbmZvPy5ncm91cEJ5VmFsdWU7XG5cbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFlbGVtZW50W2dyb3VwQnlQcm9wXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBlbGVtZW50W2dyb3VwQnlQcm9wXS50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuICFncm91cEJ5VmFsdWVzLnNvbWUodiA9PiB2YWx1ZS5pbmNsdWRlcyh2KSAmJiB2YWx1ZS5sZW5ndGggPj0gdi5sZW5ndGgpO1xuICB9XG5cbiAgc3RvcmVQZW5kaW5nRmlsdGVycygkZXZlbnQ6IHsgZmlsdGVyczogRmllbGRGaWx0ZXJbXSwgc2VhcmNoU3RyOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMucGVuZGluZ0ZpbHRlcnMgPSAkZXZlbnQuZmlsdGVycyB8fCBbXTtcbiAgICAgIHRoaXMuc2VhcmNoU3RyID0gJGV2ZW50LnNlYXJjaFN0cjtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRQYWdpbmF0aW9uRm9yRmlsdGVyQ2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QpIHtcbiAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0ID0gbmV3IEZpbHRlclJlcXVlc3QodGhpcy5wYWdlU2l6ZSB8fCB0aGlzLnBhZ2VJbmZvLnBhZ2VTaXplKTtcbiAgICB9XG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDE7XG4gICAgaWYgKHRoaXMubWFuYWdlYWJsZVBhZ2VzKSB7XG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnBhZ2VJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgYXBwbHlQZW5kaW5nRmlsdGVycygpOiB2b2lkIHtcbiAgICB0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciA9IHRoaXMucGVuZGluZ0ZpbHRlcnMgfHwgW107XG4gICAgdGhpcy5yZXNldFBhZ2luYXRpb25Gb3JGaWx0ZXJDaGFuZ2UoKTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gIH1cblxuICBoYW5kbGVGaWx0ZXJFbXB0eSgkZXZlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoJGV2ZW50KSB7XG4gICAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gW107XG4gICAgICB0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciA9IFtdO1xuICAgICAgdGhpcy5zZWFyY2hTdHIgPSAnJztcbiAgICAgIHRoaXMucmVzZXRQYWdpbmF0aW9uRm9yRmlsdGVyQ2hhbmdlKCk7XG4gICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXREYXRhKCRldmVudDogYm9vbGVhbikge1xuICAgIGlmICgkZXZlbnQpIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyID0gW107XG4gICAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gW107XG4gICAgICB0aGlzLnJlc2V0UGFnaW5hdGlvbkZvckZpbHRlckNoYW5nZSgpO1xuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgLy8gdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgaGFzRmlsdGVyc0FwcGxpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciAmJiB0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlci5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAodGhpcy5wZW5kaW5nRmlsdGVycyAmJiB0aGlzLnBlbmRpbmdGaWx0ZXJzLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgZ2V0RGlzcGxheVN2Z1BhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5oYXNGaWx0ZXJzQXBwbGllZCgpICYmIHRoaXMubm9SZXN1bHRTdmdQYXRoID8gdGhpcy5ub1Jlc3VsdFN2Z1BhdGggOiB0aGlzLm5vRGF0YUZvdW5kU3ZnUGF0aDtcbiAgfVxuXG4gIGdldERpc3BsYXlUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmhhc0ZpbHRlcnNBcHBsaWVkKCkgJiYgdGhpcy5ub1Jlc3VsdFN2Z1BhdGggPyB0aGlzLm5vUmVzdWx0VGl0bGUgOiB0aGlzLm5vRGF0YUZvdW5kVGl0bGU7XG4gIH1cblxuICBnZXREaXNwbGF5U3VidGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5oYXNGaWx0ZXJzQXBwbGllZCgpICYmIHRoaXMubm9SZXN1bHRTdmdQYXRoID8gdGhpcy5ub1Jlc3VsdFN1YnRpdGxlIDogdGhpcy5ub0RhdGFGb3VuZFN1YnRpdGxlO1xuICB9XG5cbiAgYnV0dG9uQ2xpY2tlZEV2ZW50KCRldmVudDogQnV0dG9uQWN0aW9uU2V0dGluZ3MpIHtcblxuICB9XG5cbiAgZ2V0TW9iaWxlQ2FyZElkQ29sdW1uKCk6IFRhYmxlQ29sdW1uPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMudmlzaWJsZSAmJiBjLm1vYmlsZUNhcmRJZCA9PT0gdHJ1ZSk7XG4gIH1cblxuICBnZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKCk6IFRhYmxlQ29sdW1uPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMudmlzaWJsZSAmJiBjLm1vYmlsZUNhcmRTdGF0dXMgPT09IHRydWUpO1xuICB9XG5cbiAgZ2V0TW9iaWxlQ2FyZENvbHVtbnMoKTogVGFibGVDb2x1bW48YW55PltdIHtcbiAgICBjb25zdCBpZENvbCA9IHRoaXMuZ2V0TW9iaWxlQ2FyZElkQ29sdW1uKCk7XG4gICAgY29uc3Qgc3RhdHVzQ29sID0gdGhpcy5nZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKCk7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+XG4gICAgICBjLnZpc2libGUgJiZcbiAgICAgIGMucHJvcGVydHkgIT09ICdhY3Rpb25zJyAmJlxuICAgICAgYyAhPT0gaWRDb2wgJiZcbiAgICAgIGMgIT09IHN0YXR1c0NvbFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBsYWJlbEtleUJ5VmFsdWUoY29sdW1uOiBUYWJsZUNvbHVtbjxhbnk+IHwgdW5kZWZpbmVkLCByb3c6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFjb2x1bW4gfHwgIWNvbHVtbi5wcm9wZXJ0eSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBzdXBlci5sYWJlbEtleUJ5VmFsdWUoY29sdW1uLCByb3cpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleC1jb2x1bW4gYmFzZVRhYmxlXCI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMFwiID5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2x1bW4gYWxpZ24tc3RhcnQgZmxleC0xMDBcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxuICAgICAgPGFwcC10aXRsZS1iYXJcbiAgICAgICAgW3BhZ2VUaXRsZV09XCJwYWdlSW5mby5oaWRlVGl0bGUgPyAnJyA6IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24rJy5saXN0X3RpdGxlJ1wiXG4gICAgICAgIFtzdWJUaXRsZV09XCIocGFnZUluZm8uaGlkZVRpdGxlIHx8IHBhZ2VJbmZvLmhpZGVTdWJ0aXRsZSkgPyAnJyA6IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24rJy5zdWJ0aXRsZSdcIlxuICAgICAgICBbdGl0bGVNb2RlXT1cIicnXCJcbiAgICAgICAgW3BhZ2VJbmZvXT1cInBhZ2VJbmZvXCJcbiAgICAgICAgW25ld0FjdGlvbl09XCJzaG93QWRkTmV3KClcIlxuICAgICAgICBbc2hvd0V4dHJhY3RCdXR0b25dPVwiIXBhZ2VJbmZvLmhpZGVFeHRyYWN0QnV0dG9uXCJcbiAgICAgICAgW2RyYWZ0U3VwcG9ydGVkXT1cInBhZ2VJbmZvLmRyYWZ0U3VwcG9ydGVkXCJcbiAgICAgICAgW2lzUGVuZGluZ109XCJpc1BlbmRpbmdcIlxuICAgICAgICBbb25WaWV3TW9kZUNoYW5nZV09XCJzd2l0Y2hWaWV3TW9kZS5iaW5kKHRoaXMpXCJcbiAgICAgICAgW2J1dHRvbnNdPVwiZXh0cmFBY3Rpb25zXCJcbiAgICAgICAgW2J1dHRvbnNEaXNwbGF5TW9kZV09XCJidXR0b25zRGlzcGxheU1vZGVcIlxuICAgICAgICAobmV3QWN0aW9uQ2xpY2tlZCk9XCJvbkFkZE5ld0FjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgKGV4dHJhY3RSZXBvcnQpPVwiZXh0cmFjdFJlcG9ydCgkZXZlbnQpXCJcbiAgICAgICAgKHZpZXdNb2RlQ2hhbmdlZCk9XCJvblZpZXdNb2RlQ2hhbmdlZFJlY2VpdmVkKCRldmVudClcIlxuICAgICAgICAoYnV0dG9uQ2xpY2tlZCk9XCJidXR0b25DbGlja2VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIFt0b3RhbEVsZW1lbnRzXT1cInBhZ2VJbmZvLmhpZGVUaXRsZSA/IHVuZGVmaW5lZCA6IHRvdGFsRWxlbWVudHNcIj5cbiAgICAgIDwvYXBwLXRpdGxlLWJhcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImZpbHRlci1yb3dcIiAqbmdJZj1cIiFwYWdlSW5mby5oaWRlQWR2YW5jZWRGaWx0ZXJcIj5cbiAgICA8YXBwLWZpbHRlci1idWlsZGVyXG4gICAgICAqbmdJZj1cIiFwYWdlSW5mby5oaWRlQWR2YW5jZWRGaWx0ZXJcIlxuICAgICAgW3BhZ2VJbmZvXT1cInBhZ2VJbmZvXCJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgICAgW2ZpbHRlckZpZWxkc109XCJmaWx0ZXJGaWVsZHNcIlxuICAgICAgW3BlbmRpbmdGaWx0ZXJzXT1cInBlbmRpbmdGaWx0ZXJzXCJcbiAgICAgIFtzaG93RXhwb3J0QnV0dG9uXT1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiXG4gICAgICBbZXhwb3J0RGlzYWJsZWRdPVwibm9EYXRhRm91bmQgfHwgIWRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aFwiXG4gICAgICAoZmlsdGVySW5mb3JtYXRpb24pPVwic3RvcmVQZW5kaW5nRmlsdGVycygkZXZlbnQpXCJcbiAgICAgIChpc0VtcHR5KT1cImhhbmRsZUZpbHRlckVtcHR5KCRldmVudClcIlxuICAgICAgKGFwcGx5RmlsdGVyKT1cImFwcGx5UGVuZGluZ0ZpbHRlcnMoKVwiXG4gICAgICAoc29ydEJ5Q2xpY2tlZCk9XCJoYW5kbGVTb3J0Q2xpY2soJGV2ZW50KVwiXG4gICAgICAoZXhwb3J0Q2xpY2tlZCk9XCJleHRyYWN0UmVwb3J0KCRldmVudClcIj5cbiAgICA8L2FwcC1maWx0ZXItYnVpbGRlcj5cblxuICAgIDxkaXYgY2xhc3M9XCJidXR0b24tZ3JvdXBcIiAqbmdJZj1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiPlxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiXG4gICAgICAgIG1hdC1mbGF0LWJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImV4cG9ydE1lbnVcIlxuICAgICAgICBjbGFzcz1cImJ0bi1leHBvcnRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibm9EYXRhRm91bmQgfHwgIWRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2V4cG9ydCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cInRydWVcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXRleHRcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZmlsZV9leHBvcnQ8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7ICdleHBvcnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFycm93LWljb25cIj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPG1hdC1tZW51ICNleHBvcnRNZW51PVwibWF0TWVudVwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImV4dHJhY3RSZXBvcnQoJ3BkZicpXCI+UERGPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZXh0cmFjdFJlcG9ydCgneGxzeCcpXCI+RXhjZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJleHRyYWN0UmVwb3J0KCdjc3YnKVwiPkNTVjwvYnV0dG9uPlxuICAgICAgPC9tYXQtbWVudT5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuXG4gIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMCBiYXNlVGFibGVfX2RldGFpbHNDb2x1bW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleC0xMDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMCBtYWluVGFibGVcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidGFibGUtY29udGFpbmVyXCJcbiAgICAgICAgICByb2xlPVwidGFibGVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICYmICFwYWdlSW5mby5oaWRlVGl0bGVcbiAgICAgICAgICAgICAgPyAocGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcubGlzdF90aXRsZScgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgIFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIiBbYXR0ci5kYXRhLXNvcnRdPVwic29ydFN0YXRlXCIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uUHJvcCBvZiB2aXNpYmxlQ29sdW1uc0FycmF5OyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWJsZS1oZWFkZXItY2VsbFwiXG4gICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0Q29sdW1uQXJpYVNvcnQoY29sdW1uUHJvcClcIlxuICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmcgPyAwIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5zb3J0YWJsZV09XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmdcIlxuICAgICAgICAgICAgICAgICBbY2xhc3MuZmlyc3QtY2VsbF09XCJpID09PSAwXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmxhc3QtY2VsbF09XCJpID09PSB2aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aW9ucy1jZWxsXT1cImkgPT09IHZpc2libGVDb2x1bW5zQXJyYXkubGVuZ3RoIC0gMSAmJiBjb2x1bW5Qcm9wID09PSAnYWN0aW9ucydcIlxuICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXdpZHRoXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGhcIlxuICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoID8geyd3aWR0aCc6IGdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGggKyAnJScsICdmbGV4LWJhc2lzJzogZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aCArICclJ30gOiB7fVwiXG4gICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmcgJiYgaGFuZGxlU29ydENsaWNrKGNvbHVtblByb3ApXCJcbiAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25Tb3J0SGVhZGVyS2V5ZG93bigkZXZlbnQsIGNvbHVtblByb3ApXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFibGUtaGVhZGVyLWxhYmVsXCI+e3sgbGFiZWxLZXkoZ2V0Q29sdW1uKGNvbHVtblByb3ApKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5lbmFibGVTb3J0aW5nXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJnZXRTb3J0RGlyZWN0aW9uKGNvbHVtblByb3ApID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNvcnQtaWNvbiBzb3J0LWFzY1wiPmFycm93X2Ryb3BfdXA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZ2V0U29ydERpcmVjdGlvbihjb2x1bW5Qcm9wKSA9PT0gJ2Rlc2MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic29ydC1pY29uIHNvcnQtZGVzY1wiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9keVwiIHJvbGU9XCJyb3dncm91cFwiPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGRhdGFTb3VyY2UuZGF0YTsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLXJvd1wiXG4gICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIid0YWJsZS1yb3ctJyArIChyb3c/LmlkIHx8IHJvdz8ua2V5IHx8ICcnKVwiXG4gICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAndGFibGUtcm93LS1oaWdobGlnaHQnOiBzZWxlY3RlZFJvd0luZGV4ID09IHJvdy5pZCB8fCAocGFnZUluZm8uZ3JvdXBCeVByb3BlcnR5ICYmIHBhZ2VJbmZvLmdyb3VwQnlWYWx1ZT8uaW5jbHVkZXMocm93W3BhZ2VJbmZvLmdyb3VwQnlQcm9wZXJ0eV0pKSxcbiAgICAgICAgICAgICAgICAgICAndGFibGUtcm93LS1kYXJrLWhpZ2hsaWdodCc6IGlzRGFya0hpZ2hsaWdodChyb3cpXG4gICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAoYXV4Y2xpY2spPVwib3Blbk5ld1RhYihyb3cpXCJcbiAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgb25TZWxlY3RJdGVtKHJvdylcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uUHJvcCBvZiB2aXNpYmxlQ29sdW1uc0FycmF5OyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLWNlbGxcIlxuICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmlyc3QtY2VsbF09XCJpID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MubGFzdC1jZWxsXT1cImkgPT09IHZpc2libGVDb2x1bW5zQXJyYXkubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGlvbnMtY2VsbF09XCJpID09PSB2aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aCAtIDEgJiYgY29sdW1uUHJvcCA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXdpZHRoXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGggPyB7J3dpZHRoJzogZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aCArICclJywgJ2ZsZXgtYmFzaXMnOiBnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoICsgJyUnfSA6IHt9XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy50eXBlXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInd29ya2Zsb3dTdGF0dXMnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ3ZlN0YXR1cyB7eyBnZXRTdGF0dXNEZXNjcmlwdGlvbihyb3cpfX1cIiBbYXR0ci5pZF09XCIndGFibGUtYnRuLXdmLScrY29sdW1uUHJvcCsnLScrKHJvdy5pZCB8fCByb3cua2V5IHx8ICcnKVwiIFthdHRyLnRhYmluZGV4XT1cIi0xXCI+e3sgZ2V0U3RhdHVzRGVzY3JpcHRpb24ocm93KSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidoeXBlci10ZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvdWxkUmVuZGVyQXNIeXBlckxpbmsocm93KTsgZWxzZSBwbGFpbkh5cGVyVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtbGFiZWwgaHlwZXItbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoeXBlckxpbmtDbGlja2VkKGNvbHVtblByb3AsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluSHlwZXJUZXh0PlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtblByb3ApIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIididXR0b24nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG91bGRTaG93QnV0dG9uKHJvdylcIiBtYXQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByaW1hcnlcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBhY3Rpb25CdXR0b25DbGlja2VkKGNvbHVtblByb3AsIHJvdylcIiBbYXR0ci5pZF09XCIndGFibGUtYnRuLWFjdGlvbi0nK2NvbHVtblByb3BcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbEtleShnZXRDb2x1bW4oY29sdW1uUHJvcCkpICsgJ190aXRsZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ljb24nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgJ21haW5UYWJsZV9fdGRfX2ljb24tZ3JlZW4nOiByb3dbY29sdW1uUHJvcF0gPT09ICdwYXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAnbWFpblRhYmxlX190ZF9faWNvbi1vcmFuZ2UnOiByb3dbY29sdW1uUHJvcF0gPT09ICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAnbWFpblRhYmxlX190ZF9faWNvbi1yZWQnOiByb3dbY29sdW1uUHJvcF0gPT09ICdlcnJvcidcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdldEljb25BcmlhTGFiZWxLZXkocm93W2NvbHVtblByb3BdKSB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEljb24ocm93W2NvbHVtblByb3BdKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cInByaW1hcnlcIiBbdGFiSW5kZXhdPVwiLTFcIiBbY2hlY2tlZF09XCJyb3dbY29sdW1uUHJvcF1cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2FjdGlvbkNoZWNrZWRDbGlja2VkKGNvbHVtblByb3Ascm93KVwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdGF0ZVR5cGUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzdGF0ZVR5cGUge3sgcm93W2NvbHVtblByb3BdfX1cIiBbYXR0ci5pZF09XCIndGFibGUtYnRuLXN0YXRlLScrY29sdW1uUHJvcFwiIFthdHRyLnRhYmluZGV4XT1cIi0xXCI+e3sgbGFiZWxLZXlCeVZhbHVlKGdldENvbHVtbihjb2x1bW5Qcm9wKSwgcm93KSB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB8IGRhdGU6J2RkL01NL3l5eXknOidVVEMnIH19XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Nyb3BwZWRUZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRDcm9wcGVkVGV4dChleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCksIHJvd1tnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoXSkgfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZG93bmxvYWQnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2ljb24tYmx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidCQVNFX1RBQkxFLmRvd25sb2FkQWN0aW9uJyB8IHRyYW5zbGF0ZVwiPnN5c3RlbV91cGRhdGVfYWx0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInb25PZmYnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gbnVsbFwiIGNsYXNzPVwibWFpblRhYmxlX190ZF9faWNvbi1kYXJrb3JhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KG51bGwpIHwgdHJhbnNsYXRlXCI+ZmxhZzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gZmFsc2VcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2ljb24tcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KGZhbHNlKSB8IHRyYW5zbGF0ZVwiPmZsYWc8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJyb3dbY29sdW1uUHJvcF0gPT09IHRydWVcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2ljb24tZ3JlZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRPbk9mZkZsYWdBcmlhTGFiZWxLZXkodHJ1ZSkgfCB0cmFuc2xhdGVcIj5mbGFnPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3RhdHVzJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gbnVsbCB8fCByb3dbY29sdW1uUHJvcF0gPT09IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgcGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcuJyArIGdldENvbHVtbihjb2x1bW5Qcm9wKT8ubGFiZWwgKyAnSW5BY3RpdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dbY29sdW1uUHJvcF0gPT09IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5sYWJlbCArICdBY3RpdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5mbydcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidCQVNFX1RBQkxFLnJvd0RldGFpbHMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2VtaXRFdmVudChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCIndGFibGUtYnRuLWluZm8tJytyb3cuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIiduZXRBbW91bnQnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYWluVGFibGVfX3RkX19jdXJyZW5jeVwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7XCI+e3sgcm93W2dldENvbHVtbihjb2x1bW5Qcm9wKT8uY3VycmVuY3ldIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFpblRhYmxlX190ZF9fcHJvcGVydHlcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrOyBtYXJnaW4tbGVmdDo2cHg7IG1hcmdpbi1yaWdodDo2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtblByb3ApIHwgY3VycmVuY3k6Jyc6JycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xvY2FsRGF0ZVRpbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB8IGRhdGUgOiBleHRyYWN0Rm9ybWF0KGdldENvbHVtbihjb2x1bW5Qcm9wKSk6J1VUQycgfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYmlnZGVjaW1hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsPjxzdXAgY2xhc3M9XCJtYWluVGFibGVfX3RkX19jdXJyZW5jeVwiPnt7cm93W2dldENvbHVtbihjb2x1bW5Qcm9wKT8uY3VycmVuY3ldfX08L3N1cD48L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCkgfCBudW1iZXIgOiAoZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5kaWdpdEluZm8gfHwgJzEuMy01JykgfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbGlzdEFjdGlvbidcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1idXR0b24tYWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYnV0dG9uc0FjdGlvbl09XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LnZpZXdUeXBlID09PSAnYnV0dG9uc0FjdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsaXN0QWN0aW9uXT1cImxpc3RBY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zXT1cImxpc3RBY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGlja2VkQnV0dG9uKT1cImFjdGlvbkxpc3RDbGlja2VkKCRldmVudCxyb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLWJ1dHRvbi1hY3Rpb25zPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXN0J1wiPlxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJtYWluVGFibGVfX3RkX19saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldExpc3RJdGVtcyhyb3csIGNvbHVtblByb3ApXCI+e3sgaXRlbSB9fTwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy50cmFuc2xhdGU7IGVsc2Ugbm9UcmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZW1pdFJvdXRlUGFnZShyb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgXCIuXCIgKyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vVHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBlbWl0Um91dGVQYWdlKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVyVGV4dF09J2V4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTW9iaWxlIENhcmQgVmlldyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtY2FyZHMtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBkYXRhU291cmNlLmRhdGE7IGxldCByb3dJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICBjbGFzcz1cIm1vYmlsZS1jYXJkXCJcbiAgICAgICAgICAgICBbYXR0ci5pZF09XCInbW9iaWxlLWNhcmQtJyArIChyb3c/LmlkIHx8IHJvdz8ua2V5IHx8ICcnKVwiXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgJ21vYmlsZS1jYXJkLS1oaWdobGlnaHQnOiBzZWxlY3RlZFJvd0luZGV4ID09IHJvdy5pZCB8fCAocGFnZUluZm8uZ3JvdXBCeVByb3BlcnR5ICYmIHBhZ2VJbmZvLmdyb3VwQnlWYWx1ZT8uaW5jbHVkZXMocm93W3BhZ2VJbmZvLmdyb3VwQnlQcm9wZXJ0eV0pKSxcbiAgICAgICAgICAgICAgICdtb2JpbGUtY2FyZC0tZGFyay1oaWdobGlnaHQnOiBpc0RhcmtIaWdobGlnaHQocm93KVxuICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgIChhdXhjbGljayk9XCJvcGVuTmV3VGFiKHJvdylcIlxuICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IG9uU2VsZWN0SXRlbShyb3cpXCI+XG5cbiAgICAgICAgICA8IS0tIE1vYmlsZSBDYXJkIEhlYWRlcjogSUQvTmFtZSBhbmQgU3RhdHVzIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtY2FyZF9faGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX2hlYWRlci1pZFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vYmlsZS1jYXJkX19pZC10ZXh0XCI+e3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGdldE1vYmlsZUNhcmRJZENvbHVtbigpPy5wcm9wZXJ0eSB8fCAnaWQnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19oZWFkZXItc3RhdHVzXCIgKm5nSWY9XCJnZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKClcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwic3RhdGVUeXBlIHt7IHJvd1tnZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKCk/LnByb3BlcnR5XX19XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInbW9iaWxlLWJ0bi1zdGF0ZS0nK2dldE1vYmlsZUNhcmRTdGF0dXNDb2x1bW4oKT8ucHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICB7eyBsYWJlbEtleUJ5VmFsdWUoZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpLCByb3cpIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRGl2aWRlciAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX2RpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgIDwhLS0gTW9iaWxlIENhcmQgQm9keTogT3RoZXIgY29sdW1ucyAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX2JvZHlcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBnZXRNb2JpbGVDYXJkQ29sdW1ucygpXCIgY2xhc3M9XCJtb2JpbGUtY2FyZF9fcm93XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtY2FyZF9fcm93LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fSA6PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19yb3ctdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4udHlwZVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXRlVHlwZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwic3RhdGVUeXBlIHt7IHJvd1tjb2x1bW4ucHJvcGVydHldfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidtb2JpbGUtYnRuLXN0YXRlLScrY29sdW1uLnByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXlCeVZhbHVlKGNvbHVtbiwgcm93KSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSB8IGRhdGU6J2RkL01NL3l5eXknOidVVEMnIH19XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ25ldEFtb3VudCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2JpbGUtY2FyZF9fYW1vdW50LWN1cnJlbmN5XCI+e3sgcm93W2NvbHVtbi5jdXJyZW5jeV0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9iaWxlLWNhcmRfX2Ftb3VudC12YWx1ZVwiPnt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW4ucHJvcGVydHkpIHwgY3VycmVuY3k6Jyc6JycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xvY2FsRGF0ZVRpbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW4ucHJvcGVydHkpIHwgZGF0ZSA6IGV4dHJhY3RGb3JtYXQoY29sdW1uKTonVVRDJyB9fVxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidiaWdkZWNpbWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGw+PHN1cCBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2N1cnJlbmN5XCI+e3tyb3dbY29sdW1uLmN1cnJlbmN5XX19PC9zdXA+PC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtbi5wcm9wZXJ0eSkgfCBudW1iZXIgOiAoY29sdW1uLmRpZ2l0SW5mbyB8fCAnMS4zLTUnKSB9fVxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXN0J1wiPlxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJtYWluVGFibGVfX3RkX19saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldExpc3RJdGVtcyhyb3csIGNvbHVtbi5wcm9wZXJ0eSlcIj57eyBpdGVtIH19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHJhbnNsYXRlOyBlbHNlIG5vVHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcGFnZUluZm8ubGFiZWxzU2VjdGlvbiArIFwiLlwiICsgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtbi5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vVHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lclRleHRdPSdleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIE1vYmlsZSBDYXJkIEFjdGlvbnMgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19hY3Rpb25zXCIgKm5nSWY9XCJsaXN0QWN0aW9uICYmIGxpc3RBY3Rpb24ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPGFwcC1idXR0b24tYWN0aW9uc1xuICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgIFtidXR0b25zQWN0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgICBbbGlzdEFjdGlvbl09XCJsaXN0QWN0aW9uXCJcbiAgICAgICAgICAgICAgW2FjdGlvbnNdPVwibGlzdEFjdGlvblwiXG4gICAgICAgICAgICAgIChjbGlja2VkQnV0dG9uKT1cImFjdGlvbkxpc3RDbGlja2VkKCRldmVudCxyb3cpXCI+XG4gICAgICAgICAgICA8L2FwcC1idXR0b24tYWN0aW9ucz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cIm5vRGF0YUZvdW5kXCIgY2xhc3M9XCJkYXRhTm90Rm91bmQgZmxleC1jb2x1bW5cIj5cbiAgICAgICAgPGltZyAqbmdJZj1cImdldERpc3BsYXlTdmdQYXRoKClcIiBbc3JjXT1cImdldERpc3BsYXlTdmdQYXRoKClcIiBjbGFzcz1cImRhdGFOb3RGb3VuZF9faWNvblwiIGFsdD1cIk5vIGRhdGEgZm91bmRcIiAvPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fdGl0bGVcIj57eyBnZXREaXNwbGF5VGl0bGUoKSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fc3VidGl0bGVcIj57eyBnZXREaXNwbGF5U3VidGl0bGUoKSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cblxuICAgICAgPGRpdiAgKm5nSWY9XCIoZGF0YVNvdXJjZS5kYXRhPy5sZW5ndGggPiAwIHx8IGN1c3RvbWl6ZWREYXRhKSAmJiAhcGFnZUluZm8uaGlkZVBhZ2luYXRpb25cIiBjbGFzcz1cIm1haW4tcGFnaW5hdGlvbiBmbGV4LXJvd1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlUGFnaW5hdGlvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtbiBmbGV4LTEwMFwiPlxuICAgICAgICAgICAgPGFwcC1wYWdpbmF0b3JcbiAgICAgICAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2VJbmRleFwiXG4gICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsRWxlbWVudHNcIlxuICAgICAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjUsIDUwXVwiXG4gICAgICAgICAgICAgIFttb2JpbGVMb2FkTW9yZUluY3JlbWVudF09XCJtb2JpbGVMb2FkTW9yZUluY3JlbWVudFwiXG4gICAgICAgICAgICAgIFtkaXNwbGF5ZWRJdGVtc109XCJtb2JpbGVEaXNwbGF5ZWRJdGVtcyB8fCBkYXRhU291cmNlLmRhdGEubGVuZ3RoXCJcbiAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uTG9hZE1vcmUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9hcHAtcGFnaW5hdG9yPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
755
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsZUFBZSxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxhQUFhLEVBQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFFBQVEsRUFDUixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxJQUFJLEVBQ0osT0FBTyxFQUNQLFFBQVEsRUFDUixZQUFZLEVBQ1osZUFBZSxFQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUVsRixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFHakQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sRUFFTCxlQUFlLEVBRWYsc0JBQXNCLEVBRXRCLG1CQUFtQixFQUVwQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUdwRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFHeEUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDREQUE0RCxDQUFDO0FBRWxHLE9BQU8sRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7QUFzQzVFLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxTQUFTO0lBOEkvQyxZQUNZLGNBQThCLEVBQy9CLGdCQUFrQyxFQUNsQyxnQkFBa0MsRUFDakMsa0JBQXNDLEVBQ1gsZUFBb0IsRUFDL0MsTUFBYyxFQUNMLGFBQTRCO1FBRS9DLEtBQUssRUFBRSxDQUFDO1FBUkUsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNqQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ1gsb0JBQWUsR0FBZixlQUFlLENBQUs7UUFDL0MsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNMLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBcEpqRCxVQUFLLEdBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3hDLGVBQVUsR0FBRyxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFDO1FBQ25DLFdBQU0sR0FBRztZQUNQLFlBQVksRUFBRSxFQUFFO1lBQ2hCLFdBQVcsRUFBRSxDQUFDO1lBQ2QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSztTQUNsQyxDQUFDO1FBQ0ssWUFBTyxHQUFXLENBQUMsQ0FBQztRQUNwQixtQkFBYyxHQUFZLElBQUksQ0FBQztRQUMvQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDM0IsV0FBTSxHQUFRO1lBQ25CLGFBQWEsRUFBRSxHQUFHO1lBQ2xCLFNBQVMsRUFBRSxHQUFHO1lBQ2QsMkJBQTJCLEVBQUUsWUFBWTtZQUN6QyxxQkFBcUIsRUFBRSxNQUFNO1lBQzdCLHdCQUF3QixFQUFFLGdCQUFnQjtTQUMzQyxDQUFDO1FBS08scUJBQWdCLEdBQUcsa0JBQWtCLENBQUM7UUFDdEMsd0JBQW1CLEdBQUcscUJBQXFCLENBQUM7UUFFNUMsa0JBQWEsR0FBRyxlQUFlLENBQUM7UUFDaEMscUJBQWdCLEdBQUcsa0JBQWtCLENBQUM7UUFDL0Msa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QseUJBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLHlCQUFvQixHQUFhLEVBQUUsQ0FBQztRQUM1QywwQkFBcUIsR0FBVSxFQUFFLENBQUM7UUFDbEMsbUJBQWMsR0FBVSxFQUFFLENBQUM7UUFDM0IsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUNmLGtCQUFhLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7UUFHbEQsYUFBUSxHQUFhLGVBQWUsQ0FBQztRQUc5QyxxQkFBZ0IsR0FBWSxJQUFJLENBQUM7UUFHakMsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFHM0IsNEJBQXVCLEdBQVcsQ0FBQyxDQUFDO1FBSXBDLGVBQVUsR0FBMkIsRUFBRSxDQUFDO1FBR3hDLGlCQUFZLEdBQTJCLEVBQUUsQ0FBQztRQUcxQyx1QkFBa0IsR0FBd0IsVUFBVSxDQUFDO1FBTXJELFlBQU8sR0FBYSxFQUFFLENBQUM7UUFNdkIsZ0JBQVcsR0FBNEIsRUFBRSxDQUFDO1FBRWhDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXdCLENBQUM7UUFHbkUsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFHaEMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUczQixZQUFPLEdBQVksS0FBSyxDQUFDO1FBR3pCLGtCQUFhLEdBQWtCLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBS3JELG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBRWpDLG9CQUFlLEdBQVcsQ0FBQyxDQUFDO1FBRTVCLHFCQUFnQixHQUFXLENBQUMsQ0FBQztRQUc3QixlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFJbkQsZUFBVSxHQUFzQyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUV4RixvQkFBZSxHQUFzQyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUc3RixnQkFBVyxHQUFzQyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUd6RixtQkFBYyxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBRzlELHNCQUFpQixHQUFpRixJQUFJLFlBQVksRUFJOUcsQ0FBQztRQUdMLDJCQUFzQixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFHckQsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUduRCxlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFTeEQscUJBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsMkJBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBSTNCLG1CQUFjLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUF5SjVELGNBQVMsR0FBUSxFQUFFLENBQUM7UUFDWiw2QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFrUHpDLGVBQVUsR0FBUSxFQUFFLENBQUE7UUFDcEIsZUFBVSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBalkxQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVELFdBQVc7SUFDWCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDcEUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDekMsQ0FBQztRQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRTFDLElBQUksQ0FBQyxrQkFBa0I7YUFDcEIsT0FBTyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQzthQUMvQixTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbEIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsQ0FBQztpQkFBSyxDQUFDO2dCQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFhO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFHRCxnQkFBZ0IsQ0FBQyxPQUFZLEVBQUUsUUFBZ0I7UUFDN0MsSUFBSSxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUIsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUM7WUFDMUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM1RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLEVBQUUsSUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFZLEVBQUUsUUFBZ0I7UUFDekMsTUFBTSxLQUFLLEdBQUcsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbkMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUM7WUFDdEUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxLQUFLO2FBQ1QsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDbEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsU0FBUyxDQUFDLFFBQWdCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUM7UUFDM0QsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDeEQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuRixDQUFDO0lBRU8sY0FBYyxDQUFDLFFBQWdCLEVBQUUsT0FBZTtRQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sYUFBYSxHQUFHLE1BQU0sRUFBRSxPQUFPLElBQUksUUFBUSxDQUFDO1FBQ2xELE9BQU8sT0FBTyxLQUFLLGFBQWEsSUFBSSxPQUFPLEtBQUssUUFBUSxDQUFDO0lBQzNELENBQUM7SUFFRCxlQUFlLENBQUMsUUFBZ0I7UUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUQsSUFBSSxhQUFhLEdBQW1CLEtBQUssQ0FBQztRQUUxQyxJQUFJLGlCQUFpQixLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2hDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUM7WUFDaEIsTUFBTSxFQUFFLFFBQVE7WUFDaEIsU0FBUyxFQUFFLGFBQWE7U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1CQUFtQixDQUFDLEtBQW9CLEVBQUUsVUFBa0I7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDL0MsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDL0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsaUJBQWlCLENBQUMsVUFBa0I7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNqQixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUtELE9BQU8sQ0FBQyxTQUFpQjtRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLDBDQUEwQztRQUM5RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxXQUFtQjtRQUM1QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNuRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVPLFFBQVEsQ0FBQyxrQkFBMkIsS0FBSztRQUMvQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXpCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyQixtQ0FBbUM7UUFDckMsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5RixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUc7Z0JBQ3pDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksRUFBRSxDQUFDO2dCQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FDdkU7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzFELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUYsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDNUIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFHLElBQUksQ0FBQyxhQUFhLElBQUksU0FBUyxFQUFDLENBQUM7WUFDbEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDN0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQzlELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUc7b0JBQ3pDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksRUFBRSxDQUFDO29CQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FDdkU7aUJBQ0YsQ0FBQztnQkFDQSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUM3RyxNQUFNLGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuRCxJQUFJLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUMzQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFBO3dCQUN2RSxJQUFJLENBQUMsV0FBVyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dCQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7d0JBQzdDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7d0JBQ3BFLElBQUksQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQzt3QkFDckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDckUsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7d0JBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO3dCQUM3QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3dCQUN4RCxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztvQkFDcEQsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsRUFDQyxHQUFHLENBQUMsQ0FBQztRQUNiLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7UUFDMUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQzVCLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNuRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQztRQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxFQUFFO1lBQzlFLE9BQU87WUFDUCxLQUFLO1NBQ04sQ0FBQyxDQUFDO1FBQ0gsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELG9CQUFvQixDQUFDLE9BQVk7UUFDL0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFZO1FBQ3ZCLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQTtJQUMxQixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFtRCxDQUFDO1lBQ2pHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDL0IsQ0FBQztZQUNELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ3pDLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDNUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsd0JBQXdCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFELE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN4RSxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNqRixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDckMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxjQUFjLENBQUMsWUFBaUIsRUFBRSxXQUFtQixFQUFFO1FBQ3JELE9BQU8sWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNySCxDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQVk7UUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUF3QjtRQUNwQyxPQUFPLE1BQU0sRUFBRSxNQUFNLElBQUksa0JBQWtCLENBQUM7SUFDOUMsQ0FBQztJQUVELGlCQUFpQixDQUFDLFVBQWdDLEVBQUUsT0FBWTtRQUM5RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBa0IsRUFBRSxPQUFZO1FBQy9DLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDO1FBQ25DLE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBR0QsYUFBYSxDQUFDLE9BQVk7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFRO1FBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNqRCxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUM7WUFFckUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXhELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV0RSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQixXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUU7Z0JBQ3hELEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUU7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gsT0FBTztRQUNULENBQUM7UUFDRCx1Q0FBdUM7UUFDdkMsdUJBQXVCO1FBQ3ZCLHFCQUFxQjtRQUNyQiwrQkFBK0I7SUFDakMsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFHO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUVELHlCQUF5QixDQUFDLFNBQWtCO1FBQzFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsY0FBYyxDQUFDLFNBQWtCO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQVc7UUFDeEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ3JFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUM3QixFQUFFLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUcsSUFBSSxFQUFHLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVsRSx1Q0FBdUM7UUFDdkMsdUJBQXVCO1FBQ3ZCLHFCQUFxQjtRQUNyQiwrQkFBK0I7SUFDakMsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFFO0lBQ3JDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxNQUFXO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWhDLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFJRCxXQUFXO1FBQ1QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixJQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxLQUFLLEVBQUMsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPO2FBQ1QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUM7YUFDekMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEIsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEIsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsT0FBTztZQUNULENBQUM7aUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFHO1FBQ2IsSUFBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwRSxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFHO1FBQ2IsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELG1CQUFtQixDQUFDLFNBQWlCLEVBQUUsSUFBUztRQUM5QyxJQUFJLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU8sb0JBQW9CLENBQUMsSUFBUztRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNqRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNoRSxNQUFNLEdBQUcsR0FBRyxHQUFHLFFBQVEsT0FBTyxDQUFDO1FBRS9CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNwRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRTtTQUN6RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sZUFBZSxDQUFDLFNBQWlCLEVBQUUsSUFBUztRQUNsRCxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQztRQUNuQyxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUM3QixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNuQixNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFlO1FBQzNCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxhQUFhLEVBQ3BILFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBYztRQUNwQixRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNLENBQUMsQ0FBQyxPQUFPLGNBQWMsQ0FBQztZQUNuQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDO1lBQ2pDLEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUM7WUFDN0IsT0FBTyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFjO1FBQ2hDLFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDZixLQUFLLE1BQU07Z0JBQ1QsT0FBTywyQkFBMkIsQ0FBQztZQUNyQyxLQUFLLFNBQVM7Z0JBQ1osT0FBTyw4QkFBOEIsQ0FBQztZQUN4QyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyw0QkFBNEIsQ0FBQztZQUN0QztnQkFDRSxPQUFPLDhCQUE4QixDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsS0FBaUM7UUFDeEQsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkIsT0FBTyw2QkFBNkIsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDcEIsT0FBTywrQkFBK0IsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsT0FBTyw4QkFBOEIsQ0FBQztJQUN4QyxDQUFDO0lBRUQsb0JBQW9CLENBQUMsUUFBZ0IsRUFBRSxPQUFPO1FBQzVDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFHRCxlQUFlLENBQUMsR0FBUTtRQUN0QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQztRQUNuRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQztRQUVsRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTlDLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUM5QixTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FDekQsQ0FBQztJQUNKLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxPQUFZO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDO1FBRWxELElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFOUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFHRCxZQUFZLENBQUMsTUFBWTtRQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU87WUFDdEMsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUztnQkFDL0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRVgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUM3RixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxPQUFZO1FBQzNCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDO1FBRWxELElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFOUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFxRDtRQUN2RSxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUN0QyxDQUFDO0lBRU8sOEJBQThCO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBZTtRQUMvQixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsTUFBZTtRQUN2QixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsOEJBQThCO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNyRSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQzNHLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDdkcsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQzdHLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxNQUE0QjtJQUUvQyxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELHlCQUF5QjtRQUN2QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUVuRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzdCLENBQUMsQ0FBQyxPQUFPO1lBQ1QsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTO1lBQ3hCLENBQUMsS0FBSyxLQUFLO1lBQ1gsQ0FBQyxLQUFLLFNBQVMsQ0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFUSxlQUFlLENBQUMsTUFBb0MsRUFBRSxHQUFRO1FBQ3JFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzNDLE9BQU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUMsQ0FBQzsrR0E1eEJVLGtCQUFrQixrSkFtSmpCLGlCQUFpQjttR0FuSmxCLGtCQUFrQiwyNENDN0YvQixnN25CQStYQSxvZ1ZEOVRJLE9BQU8sMkVBQ1AsT0FBTyxtRkFDUCxlQUFlLDRGQUNmLE9BQU8sMElBQ1AsYUFBYSwrQkFDYixJQUFJLDZGQUNKLFFBQVEsNEVBQ1IsZUFBZSxvVUFDZixRQUFRLHdDQUNSLFlBQVksZ0RBQ1osbUJBQW1CLCtCQUNuQixZQUFZLHFGQUNaLGVBQWUsOERBRWYsT0FBTyxtSEFFUCxzQkFBc0Isa0tBQ3RCLGlCQUFpQixxZUFDakIsa0JBQWtCLCtOQUNsQixXQUFXLCtDQUNYLFdBQVcsaVVBQ1gsc0JBQXNCLGlSQUN0QixjQUFjLHFTQUNkLE9BQU8sMlFBQ1AsV0FBVyx3SEExQkQsRUFBRTs7NEZBOEJILGtCQUFrQjtrQkFuQzlCLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxjQUdKLEVBQUUsV0FDTDt3QkFDUCxPQUFPO3dCQUNQLE9BQU87d0JBQ1AsZUFBZTt3QkFDZixPQUFPO3dCQUNQLGFBQWE7d0JBQ2IsSUFBSTt3QkFDSixRQUFRO3dCQUNSLGVBQWU7d0JBQ2YsUUFBUTt3QkFDUixZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsT0FBTzt3QkFDUCxTQUFTO3dCQUNULHNCQUFzQjt3QkFDdEIsaUJBQWlCO3dCQUNqQixrQkFBa0I7d0JBQ2xCLFdBQVc7d0JBQ1gsV0FBVzt3QkFDWCxzQkFBc0I7d0JBQ3RCLGNBQWM7d0JBQ2QsT0FBTzt3QkFDUCxXQUFXO3FCQUVaOzswQkFxSkksTUFBTTsyQkFBQyxpQkFBaUI7MEZBOUg3QixZQUFZO3NCQURYLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFhRyxRQUFRO3NCQURoQixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLGNBQWM7c0JBRGIsS0FBSztnQkFJTix1QkFBdUI7c0JBRHRCLEtBQUs7Z0JBR0csSUFBSTtzQkFBWixLQUFLO2dCQUVOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixZQUFZO3NCQURYLEtBQUs7Z0JBSU4sa0JBQWtCO3NCQURqQixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLFdBQVc7c0JBRFYsS0FBSztnQkFHSSxhQUFhO3NCQUF0QixNQUFNO2dCQUdQLGNBQWM7c0JBRGIsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUlOLGFBQWE7c0JBRFosS0FBSztnQkFJTixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBR04sZUFBZTtzQkFEZCxLQUFLO2dCQUdOLGVBQWU7c0JBRGQsS0FBSztnQkFHTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixVQUFVO3NCQURULE1BQU07Z0JBS1AsVUFBVTtzQkFEVCxNQUFNO2dCQUdQLGVBQWU7c0JBRGQsTUFBTTtnQkFJUCxXQUFXO3NCQURWLE1BQU07Z0JBSVAsY0FBYztzQkFEYixNQUFNO2dCQUlQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFRUCxzQkFBc0I7c0JBRHJCLE1BQU07Z0JBSVAsY0FBYztzQkFEYixNQUFNO2dCQUlQLFVBQVU7c0JBRFQsTUFBTTtnQkFRUCxjQUFjO3NCQURiLEtBQUs7Z0JBU04sY0FBYztzQkFEYixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtNYXRUYWJsZURhdGFTb3VyY2V9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90YWJsZVwiO1xuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge01hdFNvcnRNb2R1bGUsIFNvcnR9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XG5pbXBvcnQge1xuICBDdXJyZW5jeVBpcGUsXG4gIERhdGVQaXBlLFxuICBEZWNpbWFsUGlwZSxcbiAgTmdDbGFzcyxcbiAgTmdGb3JPZixcbiAgTmdJZixcbiAgTmdTdHlsZSxcbiAgTmdTd2l0Y2gsXG4gIE5nU3dpdGNoQ2FzZSxcbiAgTmdTd2l0Y2hEZWZhdWx0XG59IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7TWF0SWNvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcbmltcG9ydCB7TWF0QnV0dG9uLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25CdXR0b259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcbmltcG9ydCB7Tmd4UGFnaW5hdGlvbk1vZHVsZX0gZnJvbSBcIm5neC1wYWdpbmF0aW9uXCI7XG5pbXBvcnQge0J1dHRvbkFjdGlvbnNDb21wb25lbnR9IGZyb20gXCIuLi9idXR0b24tYWN0aW9ucy9idXR0b24tYWN0aW9ucy5jb21wb25lbnRcIjtcbmltcG9ydCB7U2hhcmVEYXRhU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3RyaWdnZXItZm9ybS5zZXJ2aWNlXCI7XG5pbXBvcnQge0Jhc2VVdGlsc30gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcbmltcG9ydCB7QmFja2VuZFNlcnZpY2V9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9iYWNrZW5kLXNlcnZpY2VcIjtcbmltcG9ydCB7RmlsdGVyfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWx0ZXIubW9kZWxcIjtcbmltcG9ydCB7RmlsdGVyUmVxdWVzdH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZmlsdGVyLXJlcXVlc3RcIjtcbmltcG9ydCB7XG4gIEJ1dHRvbkFjdGlvblNldHRpbmdzLFxuICBFTVBUWV9QQUdFX0lORk8sXG4gIEZpZWxkSW5mbyxcbiAgRlJPTlRfRU5EX0NPTFVNTl9UWVBFUyxcbiAgUGFnZUluZm8sXG4gIFRBQkxFX1JFQ09SRF9BQ1RJT04sXG4gIFRhYmxlQ29sdW1uXG59IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsXCI7XG5pbXBvcnQge1JlcG9ydFJlcXVlc3R9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3JlcG9ydC1yZXF1ZXN0Lm1vZGVsXCI7XG5pbXBvcnQge1RhYmxlUGFnZVVzZXJBY3Rpb259IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3RhYmxlLXBhZ2UtdXNlci1hY3Rpb24uaW50ZXJmYWNlXCI7XG5pbXBvcnQge1dvcmtmbG93fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC93b3JrZmxvdy93b3JrZmxvdy5tb2RlbFwiO1xuaW1wb3J0IHtSZXNwb25zZUVudmVsb3B9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3Jlc3BvbnNlLWVudmVsb3AubW9kZWxcIjtcbmltcG9ydCB7Um91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQge0xpdmVBbm5vdW5jZXJ9IGZyb20gXCJAYW5ndWxhci9jZGsvYTExeVwiO1xuaW1wb3J0IHtUaXRsZUJhckNvbXBvbmVudH0gZnJvbSBcIi4uL3RpdGxlLWJhci90aXRsZS1iYXIuY29tcG9uZW50XCI7XG5pbXBvcnQge1BhZ2luYXRvckNvbXBvbmVudH0gZnJvbSBcIi4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50XCI7XG5pbXBvcnQge01hdENoZWNrYm94fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3hcIjtcbmltcG9ydCB7RmlsdGVyQnVpbGRlckNvbXBvbmVudH0gZnJvbSBcIi4uL2FkdmFuY2VkLWZpbHRlci9maWx0ZXItYnVpbGRlci9maWx0ZXItYnVpbGRlci5jb21wb25lbnRcIjtcbmltcG9ydCB7RmllbGRGaWx0ZXJ9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL2ZpZWxkLWZpbHRlci5tb2RlbFwiO1xuaW1wb3J0IHtNYXRNZW51LCBNYXRNZW51SXRlbSwgTWF0TWVudVRyaWdnZXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9tZW51XCI7XG5pbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludHN9IGZyb20gXCJAYW5ndWxhci9jZGsvbGF5b3V0XCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1iYXNlLXRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2UtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9iYXNlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtdLFxuICBpbXBvcnRzOiBbXG4gICAgTmdTdHlsZSxcbiAgICBOZ0NsYXNzLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBNYXRJY29uLFxuICAgIE1hdFNvcnRNb2R1bGUsXG4gICAgTmdJZixcbiAgICBOZ1N3aXRjaCxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgRGF0ZVBpcGUsXG4gICAgQ3VycmVuY3lQaXBlLFxuICAgIE5neFBhZ2luYXRpb25Nb2R1bGUsXG4gICAgTmdTd2l0Y2hDYXNlLFxuICAgIE5nU3dpdGNoRGVmYXVsdCxcbiAgICBNYXRJY29uQnV0dG9uLFxuICAgIE5nRm9yT2YsXG4gICAgTWF0QnV0dG9uLFxuICAgIEJ1dHRvbkFjdGlvbnNDb21wb25lbnQsXG4gICAgVGl0bGVCYXJDb21wb25lbnQsXG4gICAgUGFnaW5hdG9yQ29tcG9uZW50LFxuICAgIERlY2ltYWxQaXBlLFxuICAgIE1hdENoZWNrYm94LFxuICAgIEZpbHRlckJ1aWxkZXJDb21wb25lbnQsXG4gICAgTWF0TWVudVRyaWdnZXIsXG4gICAgTWF0TWVudSxcbiAgICBNYXRNZW51SXRlbSxcblxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEJhc2VUYWJsZUNvbXBvbmVudCBleHRlbmRzIEJhc2VVdGlscyBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICB0eXBlczogc3RyaW5nW10gPSBbXCJwZGZcIiwgXCJjc3ZcIiwgXCJ4bHN4XCJdXG4gIGNvbGxlY3Rpb24gPSB7Y291bnQ6IDYwLCBkYXRhOiBbXX07XG4gIGNvbmZpZyA9IHtcbiAgICBpdGVtc1BlclBhZ2U6IDEwLFxuICAgIGN1cnJlbnRQYWdlOiAxLFxuICAgIHRvdGFsSXRlbXM6IHRoaXMuY29sbGVjdGlvbi5jb3VudFxuICB9O1xuICBwdWJsaWMgbWF4U2l6ZTogbnVtYmVyID0gNztcbiAgcHVibGljIGRpcmVjdGlvbkxpbmtzOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGF1dG9IaWRlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyByZXNwb25zaXZlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGxhYmVsczogYW55ID0ge1xuICAgIHByZXZpb3VzTGFiZWw6ICc8JyxcbiAgICBuZXh0TGFiZWw6ICc+JyxcbiAgICBzY3JlZW5SZWFkZXJQYWdpbmF0aW9uTGFiZWw6ICdQYWdpbmF0aW9uJyxcbiAgICBzY3JlZW5SZWFkZXJQYWdlTGFiZWw6ICdwYWdlJyxcbiAgICBzY3JlZW5SZWFkZXJDdXJyZW50TGFiZWw6IGBZb3UncmUgb24gcGFnZWBcbiAgfTtcblxuICBASW5wdXQoKVxuICBmaWx0ZXJGaWVsZHM6IEZpZWxkSW5mb1tdO1xuICBASW5wdXQoKSBub0RhdGFGb3VuZFN2Z1BhdGg6IHN0cmluZztcbiAgQElucHV0KCkgbm9EYXRhRm91bmRUaXRsZSA9ICdub0RhdGFGb3VuZFRpdGxlJztcbiAgQElucHV0KCkgbm9EYXRhRm91bmRTdWJ0aXRsZSA9ICdub0RhdGFGb3VuZFN1YnRpdGxlJztcbiAgQElucHV0KCkgbm9SZXN1bHRTdmdQYXRoOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG5vUmVzdWx0VGl0bGUgPSAnbm9SZXN1bHRUaXRsZSc7XG4gIEBJbnB1dCgpIG5vUmVzdWx0U3VidGl0bGUgPSAnbm9SZXN1bHRTdWJ0aXRsZSc7XG4gIHRvdGFsRWxlbWVudHMgPSAwO1xuICBwYWdlc0NvdW50ID0gMDtcbiAgcGFnZUluZGV4ID0gMTtcbiAgcGFnZVNpemUgPSAxMDtcbiAgbW9iaWxlRGlzcGxheWVkSXRlbXMgPSAwO1xuICBwcml2YXRlIHNlbGVjdGVkU3RhdHVzRmlsdGVyOiBGaWx0ZXJbXSA9IFtdO1xuICBhZHZhbmNlZEFwcGxpZWRGaWx0ZXI6IGFueVtdID0gW107XG4gIHBlbmRpbmdGaWx0ZXJzOiBhbnlbXSA9IFtdO1xuICBzZWFyY2hTdHI6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIGZpbHRlclJlcXVlc3Q6IEZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCgpO1xuICBwcml2YXRlIHRpbWVyOiBhbnk7XG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHBhZ2VJbmZvOiBQYWdlSW5mbyA9IEVNUFRZX1BBR0VfSU5GTztcblxuICBASW5wdXQoKVxuICBlbmFibGVQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBtb2JpbGVQYWdlU2l6ZTogbnVtYmVyID0gMjtcblxuICBASW5wdXQoKVxuICBtb2JpbGVMb2FkTW9yZUluY3JlbWVudDogbnVtYmVyID0gMjtcblxuICBASW5wdXQoKSBkYXRhPzogTWF0VGFibGVEYXRhU291cmNlPGFueT47XG4gIEBJbnB1dCgpXG4gIGxpc3RBY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBleHRyYUFjdGlvbnM6IEJ1dHRvbkFjdGlvblNldHRpbmdzW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBidXR0b25zRGlzcGxheU1vZGU6ICdkcm9wZG93bicgfCAnbGlzdCcgPSAnZHJvcGRvd24nO1xuXG4gIEBJbnB1dCgpXG4gIGNvbHVtbnM6IFRhYmxlQ29sdW1uPGFueT5bXTtcblxuICBASW5wdXQoKVxuICBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxuICBwYXRoUGFyYW06IG51bWJlcjtcblxuICBASW5wdXQoKVxuICBleHRyYUJ1dHRvbjogIEJ1dHRvbkFjdGlvblNldHRpbmdzW10gPSBbXTtcblxuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QnV0dG9uQWN0aW9uU2V0dGluZ3M+KCk7XG5cbiAgQElucHV0KCkgLy9AdHMtaWdub3JlXG4gIGVuZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgaXNQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgdHJpZ2dlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHJlcG9ydFJlcXVlc3Q6IFJlcG9ydFJlcXVlc3QgPSBuZXcgUmVwb3J0UmVxdWVzdCh7fSk7XG5cbiAgQElucHV0KClcbiAgc2VwYXJhdGVFbmRwb2ludERhdGE6IGFueTtcbiAgQElucHV0KClcbiAgbWFuYWdlYWJsZVBhZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHRvdGFsUGFnZXNDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KClcbiAgY3VycmVudFBhZ2VJbmRleDogbnVtYmVyID0gMDtcblxuICBAT3V0cHV0KClcbiAgcGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblxuICBAT3V0cHV0KClcbiAgdXNlckFjdGlvbjogRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZVBhZ2VVc2VyQWN0aW9uPigpO1xuICBAT3V0cHV0KClcbiAgaHlwZXJMaW5rQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGV4dHJhQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHNlbGVjdGVkQ29sdW1uOiBFdmVudEVtaXR0ZXI8U29ydD4gPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGxpc3RBY3Rpb25DbGlja2VkOiBFdmVudEVtaXR0ZXI8eyBhY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzLCByb3c6IGFueSAsIGlzUGVuZGluZzogYm9vbGVhbn0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgYWN0aW9uOiBCdXR0b25BY3Rpb25TZXR0aW5ncyxcbiAgICByb3c6IGFueSxcbiAgICBpc1BlbmRpbmc6IGJvb2xlYW5cbiAgfT4oKTtcblxuICBAT3V0cHV0KClcbiAgcGVuZGluZ1ZpZXdNb2RlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBAT3V0cHV0KClcbiAgZmlsdGVyc0FwcGxpZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpZWxkRmlsdGVyW10+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHNob3dEaWFsb2c6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgdXNlZFdvcmtmbG93ITogV29ya2Zsb3c7XG5cbiAgbW9kZTphbnk7XG5cbiAgQElucHV0KClcbiAgY3VzdG9taXplZERhdGE/OiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcbiAgZGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPGFueT47XG4gIHNlbGVjdGVkUm93SW5kZXggPSAtMTtcbiAgbm9EYXRhRm91bmQgPSBmYWxzZTtcbiAgdG90YWxSZXF1aXJlZENvdW50SXRlbSA9IDA7XG5cblxuICBAT3V0cHV0KClcbiAgY2xpY2tSb3V0ZVBhZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIGJhY2tlbmRTZXJ2aWNlOiBCYWNrZW5kU2VydmljZSxcbiAgICAgIHB1YmxpYyB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgcHVibGljIHNoYXJlRGF0YVNlcnZpY2U6IFNoYXJlRGF0YVNlcnZpY2UsXG4gICAgICBwcml2YXRlIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyLFxuICAgICAgQEluamVjdCgnc2VjdXJpdHlNYW5hZ2VyJykgcHJpdmF0ZSBzZWN1cml0eU1hbmFnZXI6IGFueSxcbiAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IGxpdmVBbm5vdW5jZXI6IExpdmVBbm5vdW5jZXIsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSgpO1xuICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyUmVxdWVzdCA9IG5ldyBGaWx0ZXJSZXF1ZXN0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYmFja2VuZFNlcnZpY2UuaXNFbXB0eUl0ZW1zID0gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoIDw9IDA7XG4gICAgaWYgKHRoaXMuY3VzdG9taXplZERhdGEpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuY3VzdG9taXplZERhdGE7XG4gICAgfVxuICAgIGlmKHRoaXMubWFuYWdlYWJsZVBhZ2VzKSB7XG4gICAgICB0aGlzLnBhZ2VzQ291bnQgPSB0aGlzLnRvdGFsUGFnZXNDb3VudDtcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gdGhpcy5jdXJyZW50UGFnZUluZGV4O1xuICAgIH1cblxuICAgIHRoaXMubW9iaWxlRGlzcGxheWVkSXRlbXMgPSB0aGlzLnBhZ2VTaXplO1xuXG4gICAgdGhpcy5icmVha3BvaW50T2JzZXJ2ZXJcbiAgICAgIC5vYnNlcnZlKFsnKG1heC13aWR0aDogNzY4cHgpJ10pXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQubWF0Y2hlcykge1xuICAgICAgICAgIHRoaXMucGFnZVNpemUgPSAyO1xuICAgICAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICAgICAgfWVsc2Uge1xuICAgICAgICAgIHRoaXMucGFnZVNpemUgPSAxMDtcbiAgICAgICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGV2ZW50O1xuICAgIHRoaXMuZ2V0TmV4dCh0aGlzLnBhZ2VJbmRleCAtIDEpO1xuICAgIGlmICh0aGlzLm1hbmFnZWFibGVQYWdlcykge1xuICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5wYWdlSW5kZXgpO1xuICAgIH1cbiAgfVxuXG5cbiAgZXh0cmFjdEZpZWxkTmFtZShlbGVtZW50OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvcGVydHk/LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgIHJldHVybiBwcm9wZXJ0eS5zcGxpdCgnLicpLnJlZHVjZSgoYWNjLCBwYXJ0KSA9PiBhY2MgJiYgYWNjW3BhcnRdLCBlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudFtwcm9wZXJ0eV0pICYmIGM/LmFycmF5U3ViUHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZXMgPSBlbGVtZW50W3Byb3BlcnR5XS5tYXAoZiA9PiBmW2MuYXJyYXlTdWJQcm9wZXJ0eV0pO1xuICAgICAgICByZXR1cm4gZmllbGRWYWx1ZXMuam9pbignLCAnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjPy50eXBlID09PSAnbGlzdCcgJiYgQXJyYXkuaXNBcnJheShlbGVtZW50W3Byb3BlcnR5XSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEl0ZW1zKGVsZW1lbnQsIHByb3BlcnR5KS5qb2luKCcg4oCiICcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnRbcHJvcGVydHldO1xuICAgIH1cbiAgfVxuXG4gIGdldExpc3RJdGVtcyhlbGVtZW50OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmFsdWUgPSBwcm9wZXJ0eT8uaW5jbHVkZXMoJy4nKVxuICAgICAgPyBwcm9wZXJ0eS5zcGxpdCgnLicpLnJlZHVjZSgoYWNjLCBwYXJ0KSA9PiBhY2MgJiYgYWNjW3BhcnRdLCBlbGVtZW50KVxuICAgICAgOiBlbGVtZW50Py5bcHJvcGVydHldO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gICAgICAubWFwKGl0ZW0gPT4gKGl0ZW0gPT0gbnVsbCA/ICcnIDogU3RyaW5nKGl0ZW0pKSlcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgZ2V0IHZpc2libGVDb2x1bW5zKCkge1xuICAgIHRoaXMuYnVpbGRHcm91cHMoKVxuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4udmlzaWJsZSkubWFwKGNvbHVtbiA9PiBjb2x1bW4ucHJvcGVydHkpO1xuICB9XG5cbiAgZ2V0IHZpc2libGVDb2x1bW5zQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUNvbHVtbnM7XG4gIH1cblxuICBnZXRDb2x1bW4ocHJvcGVydHk6IHN0cmluZyk6IFRhYmxlQ29sdW1uPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgfVxuXG4gIGdldFNvcnREaXJlY3Rpb24ocHJvcGVydHk6IHN0cmluZyk6ICdhc2MnIHwgJ2Rlc2MnIHwgJycge1xuICAgIGNvbnN0IHNvcnRLZXkgPSB0aGlzLnJlcG9ydFJlcXVlc3Q/LmZpbHRlclJlcXVlc3Q/LnNvcnRLZXk7XG4gICAgaWYgKCFzb3J0S2V5IHx8ICF0aGlzLmlzU29ydGVkQ29sdW1uKHByb3BlcnR5LCBzb3J0S2V5KSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc29ydERpcmVjdGlvbiA9PT0gJ0FTQycgPyAnYXNjJyA6ICdkZXNjJztcbiAgfVxuXG4gIHByaXZhdGUgaXNTb3J0ZWRDb2x1bW4ocHJvcGVydHk6IHN0cmluZywgc29ydEtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW4ocHJvcGVydHkpO1xuICAgIGNvbnN0IGNvbHVtblNvcnRLZXkgPSBjb2x1bW4/LnNvcnRLZXkgPz8gcHJvcGVydHk7XG4gICAgcmV0dXJuIHNvcnRLZXkgPT09IGNvbHVtblNvcnRLZXkgfHwgc29ydEtleSA9PT0gcHJvcGVydHk7XG4gIH1cblxuICBoYW5kbGVTb3J0Q2xpY2socHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IENPTFVNTiA9IHRoaXMuZ2V0Q29sdW1uKHByb3BlcnR5KTtcbiAgICBpZiAoIUNPTFVNTiB8fCAhQ09MVU1OLmVuYWJsZVNvcnRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBDVVJSRU5UX0RJUkVDVElPTiA9IHRoaXMuZ2V0U29ydERpcmVjdGlvbihwcm9wZXJ0eSk7XG4gICAgbGV0IE5FV19ESVJFQ1RJT046ICdhc2MnIHwgJ2Rlc2MnID0gJ2FzYyc7XG5cbiAgICBpZiAoQ1VSUkVOVF9ESVJFQ1RJT04gPT09ICdhc2MnKSB7XG4gICAgICBORVdfRElSRUNUSU9OID0gJ2Rlc2MnO1xuICAgIH1cblxuICAgIHRoaXMub25Tb3J0QWN0aW9uKHtcbiAgICAgIGFjdGl2ZTogcHJvcGVydHksXG4gICAgICBkaXJlY3Rpb246IE5FV19ESVJFQ1RJT05cbiAgICB9KTtcbiAgfVxuXG4gIG9uU29ydEhlYWRlcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGNvbHVtblByb3A6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5nZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuaGFuZGxlU29ydENsaWNrKGNvbHVtblByb3ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBhcmlhLXNvcnQgb24gc29ydGFibGUgY29sdW1uIGhlYWRlcnMgKFdDQUcgdGFibGUgc2VtYW50aWNzKS4gKi9cbiAgZ2V0Q29sdW1uQXJpYVNvcnQoY29sdW1uUHJvcDogc3RyaW5nKTogJ2FzY2VuZGluZycgfCAnZGVzY2VuZGluZycgfCAnbm9uZScgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5lbmFibGVTb3J0aW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZCA9IHRoaXMuZ2V0U29ydERpcmVjdGlvbihjb2x1bW5Qcm9wKTtcbiAgICBpZiAoZCA9PT0gJ2FzYycpIHtcbiAgICAgIHJldHVybiAnYXNjZW5kaW5nJztcbiAgICB9XG4gICAgaWYgKGQgPT09ICdkZXNjJykge1xuICAgICAgcmV0dXJuICdkZXNjZW5kaW5nJztcbiAgICB9XG4gICAgcmV0dXJuICdub25lJztcbiAgfVxuXG4gIHNvcnRTdGF0ZTogYW55ID0ge307XG4gIHByaXZhdGUgaW5pdGlhbERhdGFMb2FkU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgZ2V0TmV4dChwYWdlSW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG4gIG9uUGFnZVNpemVDaGFuZ2UoZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMucGFnZVNpemUgPSBldmVudDtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDE7IC8vIHJlc2V0IHRvIGZpcnN0IHBhZ2Ugb24gcGFnZSBzaXplIGNoYW5nZVxuICAgIHRoaXMubW9iaWxlRGlzcGxheWVkSXRlbXMgPSAwO1xuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcbiAgICB0aGlzLmdldE5leHQoMCk7XG4gIH1cblxuICBvbkxvYWRNb3JlKGl0ZW1zVG9Mb2FkOiBudW1iZXIpIHtcbiAgICBjb25zdCBjdXJyZW50RGlzcGxheWVkID0gdGhpcy5tb2JpbGVEaXNwbGF5ZWRJdGVtcyB8fCB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggfHwgdGhpcy5wYWdlU2l6ZTtcbiAgICB0aGlzLnBhZ2VTaXplID0gTWF0aC5taW4oY3VycmVudERpc3BsYXllZCArIGl0ZW1zVG9Mb2FkLCB0aGlzLnRvdGFsRWxlbWVudHMpO1xuICAgIHRoaXMubW9iaWxlRGlzcGxheWVkSXRlbXMgPSB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggPSAwO1xuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcbiAgICB0aGlzLmxvYWREYXRhKHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGF0YShza2lwTW9iaWxlUmVzZXQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcblxuICAgIGlmICghc2tpcE1vYmlsZVJlc2V0KSB7XG4gICAgICAvLyB0aGlzLmluaXRpYWxpemVNb2JpbGVQYWdlU2l6ZSgpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QpIHtcbiAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0ID0gbmV3IEZpbHRlclJlcXVlc3QodGhpcy5wYWdlU2l6ZSB8fCB0aGlzLnBhZ2VJbmZvLnBhZ2VTaXplKTtcbiAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnNlYXJjaFN0ciA9IHRoaXMuc2VhcmNoU3RyO1xuICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QuZmlsdGVycyA9IFtcbiAgICAgICAgLi4uKHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyIHx8IFtdKSxcbiAgICAgICAgLi4uKHRoaXMuZmlsdGVycyB8fCBbXSkuZmlsdGVyKGYgPT5cbiAgICAgICAgICAhKHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyIHx8IFtdKS5zb21lKGEgPT4gYS5maWVsZCA9PT0gZi5maWVsZE5hbWUpXG4gICAgICAgIClcbiAgICAgIF07XG4gICAgfVxuXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuICAgIGlmICh0aGlzLm1hbmFnZWFibGVQYWdlcykge1xuICAgICAgdGhpcy5zeW5jQ2xpZW50RGF0YVNvdXJjZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXBhcmF0ZUVuZHBvaW50RGF0YSB8fCAhdGhpcy5wYWdlSW5mby5hcGlVcmkgfHwgdGhpcy5wYWdlSW5mby5hcGlVcmkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnN5bmNDbGllbnREYXRhU291cmNlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKHRoaXMucmVwb3J0UmVxdWVzdCA9PSB1bmRlZmluZWQpe1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZighdGhpcy5tYW5hZ2VhYmxlUGFnZXMpICB7XG4gICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuICAgICAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LmNvbHVtbnMgPSB0aGlzLmNvbHVtbnM/LmZpbHRlcihjID0+IEZST05UX0VORF9DT0xVTU5fVFlQRVMuaW5kZXhPZihjLnR5cGUpIDwgMCApLm1hcChjID0+IGMucHJvcGVydHkpIHx8IFtdO1xuICAgICAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBlbmRpbmdQYWdlID0gdGhpcy5pc1BlbmRpbmc7XG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc2VhcmNoU3RyID0gdGhpcy5zZWFyY2hTdHI7XG4gICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QuZmlsdGVycyA9IFtcbiAgICAgICAgICAgIC4uLih0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciB8fCBbXSksXG4gICAgICAgICAgICAuLi4odGhpcy5maWx0ZXJzIHx8IFtdKS5maWx0ZXIoZiA9PlxuICAgICAgICAgICAgICAhKHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyIHx8IFtdKS5zb21lKGEgPT4gYS5maWVsZCA9PT0gZi5maWVsZE5hbWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgXTtcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UuZ2V0SXRlbXNCeUZpbHRlcih0aGlzLnJlcG9ydFJlcXVlc3Q/LmZpbHRlclJlcXVlc3QsIHRoaXMucGFnZUluZm8uYXBpVXJpKS5zdWJzY3JpYmUocmVzcCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRW52ZWxvcGUgPSBuZXcgUmVzcG9uc2VFbnZlbG9wKHJlc3ApO1xuICAgICAgICAgICAgICBpZiAocmVzcG9uc2VFbnZlbG9wZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWxSZXF1aXJlZENvdW50SXRlbSA9IHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VTaXplXG4gICAgICAgICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IHJlc3BvbnNlRW52ZWxvcGUuYm9keS5sZW5ndGggPCAxO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gcmVzcG9uc2VFbnZlbG9wZS5ib2R5O1xuICAgICAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UuaXNFbXB0eUl0ZW1zID0gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoIDw9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbEVsZW1lbnRzID0gcmVzcG9uc2VFbnZlbG9wZS50b3RhbFNpemUgfHwgMDtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VzQ291bnQgPSBNYXRoLmNlaWwodGhpcy50b3RhbEVsZW1lbnRzIC8gdGhpcy5wYWdlU2l6ZSkgfHwgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VJbmRleCA9ICh0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnRvdGFsSXRlbXMgPSByZXNwb25zZUVudmVsb3BlLnRvdGFsU2l6ZSB8fCAwO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlSW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMubW9iaWxlRGlzcGxheWVkSXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5hbm5vdW5jZVRhYmxlUmVzdWx0cygpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgICwgMzAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN5bmNDbGllbnREYXRhU291cmNlKCk6IHZvaWQge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmN1c3RvbWl6ZWREYXRhPy5kYXRhID8/IHRoaXMuc2VwYXJhdGVFbmRwb2ludERhdGEgPz8gW107XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSByb3dzO1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuYW5ub3VuY2VUYWJsZVJlc3VsdHMoKSk7XG4gIH1cblxuICBwcml2YXRlIGFubm91bmNlVGFibGVSZXN1bHRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aCA/PyAwO1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbEVsZW1lbnRzID8/IHZpc2libGU7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdCQVNFX1RBQkxFLnJlc3VsdHNBbm5vdW5jZW1lbnQnLCB7XG4gICAgICB2aXNpYmxlLFxuICAgICAgdG90YWwsXG4gICAgfSk7XG4gICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UobWVzc2FnZSwgJ3BvbGl0ZScpO1xuICB9XG5cbiAgZ2V0U3RhdHVzRGVzY3JpcHRpb24oZWxlbWVudDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuYmFja2VuZFNlcnZpY2UuZ2V0U3RhdHVzRGVzY3JpcHRpb24oZWxlbWVudCwgdGhpcy51c2VkV29ya2Zsb3cpO1xuICB9XG5cbiAgZ2V0U3RhdGVUeXBlKGVsZW1lbnQ6IGFueSkge1xuICAgIHJldHVybiBlbGVtZW50LnN0YXRlVHlwZVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzW1wiY3VzdG9taXplZERhdGFcIl0pIHtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBjaGFuZ2VzW1wiY3VzdG9taXplZERhdGFcIl0uY3VycmVudFZhbHVlIGFzIE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGRhdGFTb3VyY2UpIHtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3luY0NsaWVudERhdGFTb3VyY2UoKTtcbiAgICAgIGlmICghY2hhbmdlc1tcImN1c3RvbWl6ZWREYXRhXCJdLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgICB0aGlzLnBhZ2VzQ291bnQgPSB0aGlzLnRvdGFsUGFnZXNDb3VudDtcbiAgICAgICAgdGhpcy5wYWdlSW5kZXggPSB0aGlzLmN1cnJlbnRQYWdlSW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzW1wiZW5mb3JjZVJlZnJlc2hcIl0gJiYgIWNoYW5nZXNbXCJlbmZvcmNlUmVmcmVzaFwiXS5pc0ZpcnN0Q2hhbmdlKCkpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJpc1BlbmRpbmdcIl0gJiYgIWNoYW5nZXNbXCJpc1BlbmRpbmdcIl0uaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydwYWdlSW5mbyddIHx8IGNoYW5nZXNbJ2NvbHVtbnMnXSkge1xuICAgICAgdGhpcy5zY2hlZHVsZUluaXRpYWxMb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZUluaXRpYWxMb2FkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluaXRpYWxEYXRhTG9hZFNjaGVkdWxlZCB8fCB0aGlzLm1hbmFnZWFibGVQYWdlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYWdlSW5mby5sYXp5TG9hZERhdGEgPT09IHRydWUgJiYgdGhpcy5lbmZvcmNlUmVmcmVzaCAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucGFnZUluZm8/LmFwaVVyaSAmJiAhdGhpcy5zZXBhcmF0ZUVuZHBvaW50RGF0YSAmJiAhdGhpcy5jdXN0b21pemVkRGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxEYXRhTG9hZFNjaGVkdWxlZCA9IHRydWU7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5sb2FkRGF0YSgpKTtcbiAgfVxuICBnZXRDcm9wcGVkVGV4dChlbGVtZW50VmFsdWU6IGFueSwgc3ViV2lkdGg6IG51bWJlciA9IDIwKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRWYWx1ZSAmJiBlbGVtZW50VmFsdWUubGVuZ3RoID4gc3ViV2lkdGggPyBlbGVtZW50VmFsdWUuc3Vic3RyaW5nKDAsIHN1YldpZHRoKSArIFwiLi4uXCIgOiBlbGVtZW50VmFsdWU7XG4gIH1cblxuICBlbWl0RXZlbnQoZWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5zaG93RGlhbG9nLmVtaXQoZWxlbWVudCk7XG4gIH1cblxuICBleHRyYWN0Rm9ybWF0KGNvbHVtbjogVGFibGVDb2x1bW48YW55Pikge1xuICAgIHJldHVybiBjb2x1bW4/LmZvcm1hdCB8fCAnZC9NL3l5eXksIGg6bW0gYSc7XG4gIH1cblxuICBhY3Rpb25MaXN0Q2xpY2tlZChsaXN0QWN0aW9uOiBCdXR0b25BY3Rpb25TZXR0aW5ncywgZWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5saXN0QWN0aW9uQ2xpY2tlZC5lbWl0KHthY3Rpb246bGlzdEFjdGlvbiwgcm93OiBlbGVtZW50LCBpc1BlbmRpbmc6IHRoaXMuaXNQZW5kaW5nfSk7XG4gIH1cblxuICBoeXBlckxpbmtDbGlja2VkKGFjdGlvbk5hbWU6IHN0cmluZywgZWxlbWVudDogYW55KSB7XG4gICAgY29uc3QgYWN0aW9uID0gVEFCTEVfUkVDT1JEX0FDVElPTjtcbiAgICBhY3Rpb24uYWN0aW9uS2V5ID0gYWN0aW9uTmFtZTtcbiAgICBhY3Rpb24uaXRlbSA9IGVsZW1lbnQ7XG4gICAgYWN0aW9uLnBhZ2VJbmZvID0gdGhpcy5wYWdlSW5mbztcbiAgICB0aGlzLmh5cGVyTGlua0FjdGlvbi5lbWl0KGFjdGlvbilcbiAgfVxuXG5cbiAgZW1pdFJvdXRlUGFnZShlbGVtZW50OiBhbnkpe1xuICAgIHRoaXMuY2xpY2tSb3V0ZVBhZ2UuZW1pdChlbGVtZW50KTtcbiAgfVxuXG4gIG9uU2VsZWN0SXRlbShyb3c6IGFueSkge1xuICAgIGlmICh0aGlzLnBhZ2VJbmZvLnNlbGZSb3V0aW5nKSB7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5pc1BlbmRpbmcgPyAncGVuZGluZycgOiAndmlldyc7XG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGggfHwgdGhpcy5yb3V0ZXIudXJsfS92aWV3YDtcblxuICAgICAgY29uc3QgZW5jcnlwdGVkSWQgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoU3RyaW5nKHJvdy5pZCkpO1xuICAgICAgY29uc3QgZW5jcnlwdGVkTW9kZSA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChtb2RlKTtcblxuICAgICAgY29uc3QgZW5jcnlwdGVkUm93ID0gdGhpcy5iYWNrZW5kU2VydmljZS5lbmNyeXB0KEpTT04uc3RyaW5naWZ5KHJvdykpO1xuXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSwge1xuICAgICAgICBxdWVyeVBhcmFtczogeyB0b2tlbjogZW5jcnlwdGVkSWQsIG1vZGU6IGVuY3J5cHRlZE1vZGUgfSxcbiAgICAgICAgc3RhdGU6IHsgcmF3OiBlbmNyeXB0ZWRSb3cgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBjb25zdCBhY3Rpb24gPSBTRUxFQ1RfUkVDT1JEX0FDVElPTjtcbiAgICAvLyBhY3Rpb24uaWQgPSByb3c/LmlkO1xuICAgIC8vIGFjdGlvbi5pdGVtID0gcm93O1xuICAgIC8vIHRoaXMudXNlckFjdGlvbi5lbWl0KGFjdGlvbilcbiAgfVxuXG4gIG9wZW5OZXdUYWIocm93KSB7XG4gICAgaWYgKCF0aGlzLnBhZ2VJbmZvLmVtYmVkZWRUYWJsZU9ubHkpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmlzUGVuZGluZyA/ICdwZW5kaW5nJyA6ICd2aWV3JztcbiAgICAgIHdpbmRvdy5vcGVuKGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aH0vJHttb2RlfWAgKyAnLycgKyByb3c/LmlkKTtcbiAgICB9XG4gIH1cblxuICBvblZpZXdNb2RlQ2hhbmdlZFJlY2VpdmVkKGlzUGVuZGluZzogYm9vbGVhbikge1xuICAgIHRoaXMucGVuZGluZ1ZpZXdNb2RlQ2hhbmdlZC5lbWl0KGlzUGVuZGluZyk7XG4gICAgdGhpcy5zd2l0Y2hWaWV3TW9kZShpc1BlbmRpbmcpO1xuICB9XG5cbiAgc3dpdGNoVmlld01vZGUoaXNQZW5kaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1BlbmRpbmcgPSBpc1BlbmRpbmc7XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG5cbiAgb25BZGROZXdBY3Rpb24oJGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGggfHwgdGhpcy5yb3V0ZXIudXJsfS92aWV3YDtcbiAgICBjb25zdCBlbmNyeXB0ZWRJZCA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChcIi0xXCIpO1xuICAgIGNvbnN0IGVuY3J5cHRlZE1vZGUgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoXCJwZW5kaW5nXCIpO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHt1cmx9YF0sXG4gICAgICB7IHF1ZXJ5UGFyYW1zOiB7IHRva2VuOiBlbmNyeXB0ZWRJZCAsIG1vZGUgOiBlbmNyeXB0ZWRNb2RlIH0gfSk7XG5cbiAgICAvLyBjb25zdCBhY3Rpb24gPSBTRUxFQ1RfUkVDT1JEX0FDVElPTjtcbiAgICAvLyBhY3Rpb24uaWQgPSByb3c/LmlkO1xuICAgIC8vIGFjdGlvbi5pdGVtID0gcm93O1xuICAgIC8vIHRoaXMudXNlckFjdGlvbi5lbWl0KGFjdGlvbilcbiAgfVxuXG4gIHNob3dBZGROZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFnZUluZm8uaGFzQWRkQnV0dG9uIDtcbiAgfVxuXG4gIG9uRXh0cmFCdXR0aW9uQWN0aW9uKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5leHRyYUFjdGlvbi5lbWl0KCRldmVudCk7XG5cbiAgfVxuXG4gIGhhc0dyb3VwcygpIHtcbiAgICBsZXQgYiA9IHRoaXMuY29sdW1ucy5maW5kSW5kZXgocCA9PiBwLmdyb3VwKTtcbiAgICByZXR1cm4gYiA+PSAwO1xuICB9XG4gIGdyb3VwTmFtZXM6IGFueSA9IFtdXG4gIGdyb3VwU3BhbnM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgYnVpbGRHcm91cHMoKXtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIHRoaXMuZ3JvdXBOYW1lcyA9IFtdO1xuICAgIHRoaXMuZ3JvdXBTcGFucy5jbGVhcigpO1xuICAgIGlmKHRoaXMuaGFzR3JvdXBzKCkgPT09IGZhbHNlKXtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4udmlzaWJsZSA9PT0gdHJ1ZSlcbiAgICAgIC5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi5ncm91cCA9PT0gXCItXCIpIHtcbiAgICAgICAgICB0aGlzLmdyb3VwTmFtZXMucHVzaChjb3VudC50b1N0cmluZygpKTtcbiAgICAgICAgICB0aGlzLmluc2VydEluTWFwKGNvdW50KTtcbiAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5ncm91cE5hbWVzLmluY2x1ZGVzKGNvbHVtbi5ncm91cCkpIHtcbiAgICAgICAgICB0aGlzLmdyb3VwTmFtZXMucHVzaChjb2x1bW4uZ3JvdXApO1xuICAgICAgICAgIHRoaXMuaW5zZXJ0SW5NYXAoY29sdW1uLmdyb3VwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNlcnRJbk1hcChjb2x1bW4uZ3JvdXApO1xuICAgICAgfSk7XG4gIH1cblxuICBpbnNlcnRJbk1hcChrZXkpe1xuICAgIGlmKHRoaXMuZ3JvdXBTcGFucy5oYXMoa2V5KSl7XG4gICAgICB0aGlzLmdyb3VwU3BhbnMuc2V0KGtleS50b1N0cmluZygpLCB0aGlzLmdyb3VwU3BhbnMuZ2V0KGtleSkgKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncm91cFNwYW5zLnNldChrZXkudG9TdHJpbmcoKSwgMSk7XG4gICAgfVxuICB9XG5cbiAgaXNIdW1hbk1hZGUoc3RyKXtcbiAgICByZXR1cm4gaXNOYU4oc3RyKTtcbiAgfVxuXG4gIGFjdGlvbkJ1dHRvbkNsaWNrZWQoYWN0aW9uS2V5OiBzdHJpbmcsIGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmIChhY3Rpb25LZXkgPT09ICduYXZpZ2F0ZScpIHtcbiAgICAgIHRoaXMuaGFuZGxlTmF2aWdhdGVBY3Rpb24oaXRlbSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0VGFibGVBY3Rpb24oYWN0aW9uS2V5LCBpdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTmF2aWdhdGVBY3Rpb24oaXRlbTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgbW9kZSA9IHRoaXMuaXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJ3ZpZXcnO1xuICAgIGNvbnN0IGJhc2VQYXRoID0gdGhpcy5wYWdlSW5mby5saXN0Um91dGVQYXRoIHx8IHRoaXMucm91dGVyLnVybDtcbiAgICBjb25zdCB1cmwgPSBgJHtiYXNlUGF0aH0vdmlld2A7XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRJZCA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChpdGVtLmlkLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IGVuY3J5cHRlZE1vZGUgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQobW9kZSk7XG5cbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSwge1xuICAgICAgcXVlcnlQYXJhbXM6IHsgdG9rZW46IGVuY3J5cHRlZElkLCBtb2RlOiBlbmNyeXB0ZWRNb2RlIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFRhYmxlQWN0aW9uKGFjdGlvbktleTogc3RyaW5nLCBpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBhY3Rpb24gPSBUQUJMRV9SRUNPUkRfQUNUSU9OO1xuICAgIGFjdGlvbi5hY3Rpb25LZXkgPSBhY3Rpb25LZXk7XG4gICAgYWN0aW9uLml0ZW0gPSBpdGVtO1xuICAgIGFjdGlvbi5wYWdlSW5mbyA9IHRoaXMucGFnZUluZm87XG4gICAgdGhpcy51c2VyQWN0aW9uLmVtaXQoYWN0aW9uKTtcbiAgfVxuXG4gIGV4dHJhY3RSZXBvcnQocmVwb3J0VHlwZTogYW55KSB7XG4gICAgY29uc3QgbXlGaWx0ZXJzID0gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Q7XG4gICAgY29uc3QgcmVwb3J0UmVxdWVzdCA9IHRoaXMuYmFja2VuZFNlcnZpY2UuYnVpbGRSZXBvcnRSZXF1ZXN0KHRoaXMuY29sdW1ucywgdGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy5saXN0X3RpdGxlJyxcbiAgICAgIG15RmlsdGVycywgcmVwb3J0VHlwZSwgdGhpcy5wYWdlSW5mbywgdGhpcy5zZWFyY2hTdHIsICdMQU5EU0NBUEUnKTtcbiAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRvd25sb2FkUmVwb3J0KHJlcG9ydFJlcXVlc3QsIHRoaXMucGFnZUluZm8uYXBpVXJpKTtcbiAgfVxuXG4gIGdldEljb24oc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICBjYXNlICdwYXNzJzogcmV0dXJuICdjaGVja19jaXJjbGUnO1xuICAgICAgY2FzZSAnd2FybmluZyc6IHJldHVybiAnd2FybmluZyc7XG4gICAgICBjYXNlICdlcnJvcic6IHJldHVybiAnZXJyb3InO1xuICAgICAgZGVmYXVsdDogcmV0dXJuICdoZWxwJztcbiAgICB9XG4gIH1cblxuICBnZXRJY29uQXJpYUxhYmVsS2V5KHN0YXR1czogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSAncGFzcyc6XG4gICAgICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNJY29uUGFzcyc7XG4gICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgcmV0dXJuICdCQVNFX1RBQkxFLnN0YXR1c0ljb25XYXJuaW5nJztcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuICdCQVNFX1RBQkxFLnN0YXR1c0ljb25FcnJvcic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzSWNvblVua25vd24nO1xuICAgIH1cbiAgfVxuXG4gIGdldE9uT2ZmRmxhZ0FyaWFMYWJlbEtleSh2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuICdCQVNFX1RBQkxFLnN0YXR1c0ZsYWdBY3RpdmUnO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzRmxhZ0luYWN0aXZlJztcbiAgICB9XG4gICAgcmV0dXJuICdCQVNFX1RBQkxFLnN0YXR1c0ZsYWdQZW5kaW5nJztcbiAgfVxuXG4gIGFjdGlvbkNoZWNrZWRDbGlja2VkKHByb3BlcnR5OiBzdHJpbmcsIGVsZW1lbnQpIHtcbiAgICBlbGVtZW50W3Byb3BlcnR5XT0gIWVsZW1lbnRbcHJvcGVydHldO1xuICAgIHRoaXMuYWN0aW9uQnV0dG9uQ2xpY2tlZChwcm9wZXJ0eSwgZWxlbWVudCk7XG4gIH1cblxuXG4gIGlzRGFya0hpZ2hsaWdodChyb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xuICAgIGNvbnN0IGdyb3VwQnlWYWx1ZXMgPSB0aGlzLnBhZ2VJbmZvPy5ncm91cEJ5VmFsdWU7XG5cbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFyb3dbZ3JvdXBCeVByb3BdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgY2VsbFZhbHVlID0gcm93W2dyb3VwQnlQcm9wXS50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuIGdyb3VwQnlWYWx1ZXMuc29tZSh2YWwgPT5cbiAgICAgIGNlbGxWYWx1ZS5pbmNsdWRlcyh2YWwpICYmIGNlbGxWYWx1ZS5sZW5ndGggPiB2YWwubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIHNob3VsZFJlbmRlckFzSHlwZXJMaW5rKGVsZW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xuICAgIGNvbnN0IGdyb3VwQnlWYWx1ZXMgPSB0aGlzLnBhZ2VJbmZvPy5ncm91cEJ5VmFsdWU7XG5cbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFlbGVtZW50W2dyb3VwQnlQcm9wXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudFtncm91cEJ5UHJvcF0udG9TdHJpbmcoKTtcblxuICAgIHJldHVybiAhZ3JvdXBCeVZhbHVlcy5zb21lKHYgPT4gdmFsdWUuaW5jbHVkZXModikgJiYgdmFsdWUubGVuZ3RoID49IHYubGVuZ3RoKTtcbiAgfVxuXG5cbiAgb25Tb3J0QWN0aW9uKCRldmVudDogU29ydCkge1xuICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5wcm9wZXJ0eSA9PT0gJGV2ZW50LmFjdGl2ZSk7XG5cbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5zb3J0S2V5ID1cbiAgICAgICRldmVudC5hY3RpdmUgJiYgJGV2ZW50LmRpcmVjdGlvblxuICAgICAgICA/IChjb2w/LnNvcnRLZXkgPz8gJGV2ZW50LmFjdGl2ZSlcbiAgICAgICAgOiAnaWQnO1xuXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc29ydERpcmVjdGlvbiA9ICRldmVudC5kaXJlY3Rpb24gPT09ICdhc2MnID8gJ0FTQycgOiAnREVTQyc7XG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uLmVtaXQoJGV2ZW50KTtcbiAgICBpZiAodGhpcy5tYW5hZ2VhYmxlUGFnZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG5cbiAgc2hvdWxkU2hvd0J1dHRvbihlbGVtZW50OiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBncm91cEJ5UHJvcCA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlQcm9wZXJ0eTtcbiAgICBjb25zdCBncm91cEJ5VmFsdWVzID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVZhbHVlO1xuXG4gICAgaWYgKCFncm91cEJ5UHJvcCB8fCAhZ3JvdXBCeVZhbHVlcyB8fCAhZWxlbWVudFtncm91cEJ5UHJvcF0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudFtncm91cEJ5UHJvcF0udG9TdHJpbmcoKTtcblxuICAgIHJldHVybiAhZ3JvdXBCeVZhbHVlcy5zb21lKHYgPT4gdmFsdWUuaW5jbHVkZXModikgJiYgdmFsdWUubGVuZ3RoID49IHYubGVuZ3RoKTtcbiAgfVxuXG4gIHN0b3JlUGVuZGluZ0ZpbHRlcnMoJGV2ZW50OiB7IGZpbHRlcnM6IEZpZWxkRmlsdGVyW10sIHNlYXJjaFN0cjogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gJGV2ZW50LmZpbHRlcnMgfHwgW107XG4gICAgICB0aGlzLnNlYXJjaFN0ciA9ICRldmVudC5zZWFyY2hTdHI7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0UGFnaW5hdGlvbkZvckZpbHRlckNoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0KSB7XG4gICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdCA9IG5ldyBGaWx0ZXJSZXF1ZXN0KHRoaXMucGFnZVNpemUgfHwgdGhpcy5wYWdlSW5mby5wYWdlU2l6ZSk7XG4gICAgfVxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCA9IDA7XG4gICAgdGhpcy5wYWdlSW5kZXggPSAxO1xuICAgIGlmICh0aGlzLm1hbmFnZWFibGVQYWdlcykge1xuICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5wYWdlSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5UGVuZGluZ0ZpbHRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgPSB0aGlzLnBlbmRpbmdGaWx0ZXJzIHx8IFtdO1xuICAgIHRoaXMuZmlsdGVyc0FwcGxpZWQuZW1pdCh0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlcik7XG4gICAgdGhpcy5yZXNldFBhZ2luYXRpb25Gb3JGaWx0ZXJDaGFuZ2UoKTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gIH1cblxuICBoYW5kbGVGaWx0ZXJFbXB0eSgkZXZlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoJGV2ZW50KSB7XG4gICAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gW107XG4gICAgICB0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciA9IFtdO1xuICAgICAgdGhpcy5zZWFyY2hTdHIgPSAnJztcbiAgICAgIHRoaXMucmVzZXRQYWdpbmF0aW9uRm9yRmlsdGVyQ2hhbmdlKCk7XG4gICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXREYXRhKCRldmVudDogYm9vbGVhbikge1xuICAgIGlmICgkZXZlbnQpIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyID0gW107XG4gICAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gW107XG4gICAgICB0aGlzLnJlc2V0UGFnaW5hdGlvbkZvckZpbHRlckNoYW5nZSgpO1xuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgLy8gdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgaGFzRmlsdGVyc0FwcGxpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciAmJiB0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlci5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAodGhpcy5wZW5kaW5nRmlsdGVycyAmJiB0aGlzLnBlbmRpbmdGaWx0ZXJzLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgZ2V0RGlzcGxheVN2Z1BhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5oYXNGaWx0ZXJzQXBwbGllZCgpICYmIHRoaXMubm9SZXN1bHRTdmdQYXRoID8gdGhpcy5ub1Jlc3VsdFN2Z1BhdGggOiB0aGlzLm5vRGF0YUZvdW5kU3ZnUGF0aDtcbiAgfVxuXG4gIGdldERpc3BsYXlUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmhhc0ZpbHRlcnNBcHBsaWVkKCkgJiYgdGhpcy5ub1Jlc3VsdFN2Z1BhdGggPyB0aGlzLm5vUmVzdWx0VGl0bGUgOiB0aGlzLm5vRGF0YUZvdW5kVGl0bGU7XG4gIH1cblxuICBnZXREaXNwbGF5U3VidGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5oYXNGaWx0ZXJzQXBwbGllZCgpICYmIHRoaXMubm9SZXN1bHRTdmdQYXRoID8gdGhpcy5ub1Jlc3VsdFN1YnRpdGxlIDogdGhpcy5ub0RhdGFGb3VuZFN1YnRpdGxlO1xuICB9XG5cbiAgYnV0dG9uQ2xpY2tlZEV2ZW50KCRldmVudDogQnV0dG9uQWN0aW9uU2V0dGluZ3MpIHtcblxuICB9XG5cbiAgZ2V0TW9iaWxlQ2FyZElkQ29sdW1uKCk6IFRhYmxlQ29sdW1uPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMudmlzaWJsZSAmJiBjLm1vYmlsZUNhcmRJZCA9PT0gdHJ1ZSk7XG4gIH1cblxuICBnZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKCk6IFRhYmxlQ29sdW1uPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMudmlzaWJsZSAmJiBjLm1vYmlsZUNhcmRTdGF0dXMgPT09IHRydWUpO1xuICB9XG5cbiAgZ2V0TW9iaWxlQ2FyZENvbHVtbnMoKTogVGFibGVDb2x1bW48YW55PltdIHtcbiAgICBjb25zdCBpZENvbCA9IHRoaXMuZ2V0TW9iaWxlQ2FyZElkQ29sdW1uKCk7XG4gICAgY29uc3Qgc3RhdHVzQ29sID0gdGhpcy5nZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKCk7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+XG4gICAgICBjLnZpc2libGUgJiZcbiAgICAgIGMucHJvcGVydHkgIT09ICdhY3Rpb25zJyAmJlxuICAgICAgYyAhPT0gaWRDb2wgJiZcbiAgICAgIGMgIT09IHN0YXR1c0NvbFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBsYWJlbEtleUJ5VmFsdWUoY29sdW1uOiBUYWJsZUNvbHVtbjxhbnk+IHwgdW5kZWZpbmVkLCByb3c6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFjb2x1bW4gfHwgIWNvbHVtbi5wcm9wZXJ0eSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBzdXBlci5sYWJlbEtleUJ5VmFsdWUoY29sdW1uLCByb3cpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleC1jb2x1bW4gYmFzZVRhYmxlXCI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMFwiID5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2x1bW4gYWxpZ24tc3RhcnQgZmxleC0xMDBcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxuICAgICAgPGFwcC10aXRsZS1iYXJcbiAgICAgICAgW3BhZ2VUaXRsZV09XCJwYWdlSW5mby5oaWRlVGl0bGUgPyAnJyA6IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24rJy5saXN0X3RpdGxlJ1wiXG4gICAgICAgIFtzdWJUaXRsZV09XCIocGFnZUluZm8uaGlkZVRpdGxlIHx8IHBhZ2VJbmZvLmhpZGVTdWJ0aXRsZSkgPyAnJyA6IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24rJy5zdWJ0aXRsZSdcIlxuICAgICAgICBbdGl0bGVNb2RlXT1cIicnXCJcbiAgICAgICAgW3BhZ2VJbmZvXT1cInBhZ2VJbmZvXCJcbiAgICAgICAgW25ld0FjdGlvbl09XCJzaG93QWRkTmV3KClcIlxuICAgICAgICBbc2hvd0V4dHJhY3RCdXR0b25dPVwiIXBhZ2VJbmZvLmhpZGVFeHRyYWN0QnV0dG9uXCJcbiAgICAgICAgW2RyYWZ0U3VwcG9ydGVkXT1cInBhZ2VJbmZvLmRyYWZ0U3VwcG9ydGVkXCJcbiAgICAgICAgW2lzUGVuZGluZ109XCJpc1BlbmRpbmdcIlxuICAgICAgICBbb25WaWV3TW9kZUNoYW5nZV09XCJzd2l0Y2hWaWV3TW9kZS5iaW5kKHRoaXMpXCJcbiAgICAgICAgW2J1dHRvbnNdPVwiZXh0cmFBY3Rpb25zXCJcbiAgICAgICAgW2J1dHRvbnNEaXNwbGF5TW9kZV09XCJidXR0b25zRGlzcGxheU1vZGVcIlxuICAgICAgICAobmV3QWN0aW9uQ2xpY2tlZCk9XCJvbkFkZE5ld0FjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgKGV4dHJhY3RSZXBvcnQpPVwiZXh0cmFjdFJlcG9ydCgkZXZlbnQpXCJcbiAgICAgICAgKHZpZXdNb2RlQ2hhbmdlZCk9XCJvblZpZXdNb2RlQ2hhbmdlZFJlY2VpdmVkKCRldmVudClcIlxuICAgICAgICAoYnV0dG9uQ2xpY2tlZCk9XCJidXR0b25DbGlja2VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIFt0b3RhbEVsZW1lbnRzXT1cInBhZ2VJbmZvLmhpZGVUaXRsZSA/IHVuZGVmaW5lZCA6IHRvdGFsRWxlbWVudHNcIj5cbiAgICAgIDwvYXBwLXRpdGxlLWJhcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImZpbHRlci1yb3dcIiAqbmdJZj1cIiFwYWdlSW5mby5oaWRlQWR2YW5jZWRGaWx0ZXJcIj5cbiAgICA8YXBwLWZpbHRlci1idWlsZGVyXG4gICAgICAqbmdJZj1cIiFwYWdlSW5mby5oaWRlQWR2YW5jZWRGaWx0ZXJcIlxuICAgICAgW3BhZ2VJbmZvXT1cInBhZ2VJbmZvXCJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgICAgW2ZpbHRlckZpZWxkc109XCJmaWx0ZXJGaWVsZHNcIlxuICAgICAgW3BlbmRpbmdGaWx0ZXJzXT1cInBlbmRpbmdGaWx0ZXJzXCJcbiAgICAgIFtzaG93RXhwb3J0QnV0dG9uXT1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiXG4gICAgICBbZXhwb3J0RGlzYWJsZWRdPVwibm9EYXRhRm91bmQgfHwgIWRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aFwiXG4gICAgICAoZmlsdGVySW5mb3JtYXRpb24pPVwic3RvcmVQZW5kaW5nRmlsdGVycygkZXZlbnQpXCJcbiAgICAgIChpc0VtcHR5KT1cImhhbmRsZUZpbHRlckVtcHR5KCRldmVudClcIlxuICAgICAgKGFwcGx5RmlsdGVyKT1cImFwcGx5UGVuZGluZ0ZpbHRlcnMoKVwiXG4gICAgICAoc29ydEJ5Q2xpY2tlZCk9XCJoYW5kbGVTb3J0Q2xpY2soJGV2ZW50KVwiXG4gICAgICAoZXhwb3J0Q2xpY2tlZCk9XCJleHRyYWN0UmVwb3J0KCRldmVudClcIj5cbiAgICA8L2FwcC1maWx0ZXItYnVpbGRlcj5cblxuICAgIDxkaXYgY2xhc3M9XCJidXR0b24tZ3JvdXBcIiAqbmdJZj1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiPlxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiXG4gICAgICAgIG1hdC1mbGF0LWJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImV4cG9ydE1lbnVcIlxuICAgICAgICBjbGFzcz1cImJ0bi1leHBvcnRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibm9EYXRhRm91bmQgfHwgIWRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2V4cG9ydCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cInRydWVcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXRleHRcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZmlsZV9leHBvcnQ8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7ICdleHBvcnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFycm93LWljb25cIj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPG1hdC1tZW51ICNleHBvcnRNZW51PVwibWF0TWVudVwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImV4dHJhY3RSZXBvcnQoJ3BkZicpXCI+UERGPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZXh0cmFjdFJlcG9ydCgneGxzeCcpXCI+RXhjZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJleHRyYWN0UmVwb3J0KCdjc3YnKVwiPkNTVjwvYnV0dG9uPlxuICAgICAgPC9tYXQtbWVudT5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuXG4gIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMCBiYXNlVGFibGVfX2RldGFpbHNDb2x1bW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleC0xMDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMCBtYWluVGFibGVcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidGFibGUtY29udGFpbmVyXCJcbiAgICAgICAgICByb2xlPVwidGFibGVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICYmICFwYWdlSW5mby5oaWRlVGl0bGVcbiAgICAgICAgICAgICAgPyAocGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcubGlzdF90aXRsZScgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgIFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIiBbYXR0ci5kYXRhLXNvcnRdPVwic29ydFN0YXRlXCIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uUHJvcCBvZiB2aXNpYmxlQ29sdW1uc0FycmF5OyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWJsZS1oZWFkZXItY2VsbFwiXG4gICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiZ2V0Q29sdW1uQXJpYVNvcnQoY29sdW1uUHJvcClcIlxuICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmcgPyAwIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5zb3J0YWJsZV09XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmdcIlxuICAgICAgICAgICAgICAgICBbY2xhc3MuZmlyc3QtY2VsbF09XCJpID09PSAwXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmxhc3QtY2VsbF09XCJpID09PSB2aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aW9ucy1jZWxsXT1cImkgPT09IHZpc2libGVDb2x1bW5zQXJyYXkubGVuZ3RoIC0gMSAmJiBjb2x1bW5Qcm9wID09PSAnYWN0aW9ucydcIlxuICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXdpZHRoXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGhcIlxuICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoID8geyd3aWR0aCc6IGdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGggKyAnJScsICdmbGV4LWJhc2lzJzogZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aCArICclJ30gOiB7fVwiXG4gICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmcgJiYgaGFuZGxlU29ydENsaWNrKGNvbHVtblByb3ApXCJcbiAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25Tb3J0SGVhZGVyS2V5ZG93bigkZXZlbnQsIGNvbHVtblByb3ApXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFibGUtaGVhZGVyLWxhYmVsXCI+e3sgbGFiZWxLZXkoZ2V0Q29sdW1uKGNvbHVtblByb3ApKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5lbmFibGVTb3J0aW5nXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJnZXRTb3J0RGlyZWN0aW9uKGNvbHVtblByb3ApID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNvcnQtaWNvbiBzb3J0LWFzY1wiPmFycm93X2Ryb3BfdXA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZ2V0U29ydERpcmVjdGlvbihjb2x1bW5Qcm9wKSA9PT0gJ2Rlc2MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic29ydC1pY29uIHNvcnQtZGVzY1wiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9keVwiIHJvbGU9XCJyb3dncm91cFwiPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGRhdGFTb3VyY2UuZGF0YTsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLXJvd1wiXG4gICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIid0YWJsZS1yb3ctJyArIChyb3c/LmlkIHx8IHJvdz8ua2V5IHx8ICcnKVwiXG4gICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAndGFibGUtcm93LS1oaWdobGlnaHQnOiBzZWxlY3RlZFJvd0luZGV4ID09IHJvdy5pZCB8fCAocGFnZUluZm8uZ3JvdXBCeVByb3BlcnR5ICYmIHBhZ2VJbmZvLmdyb3VwQnlWYWx1ZT8uaW5jbHVkZXMocm93W3BhZ2VJbmZvLmdyb3VwQnlQcm9wZXJ0eV0pKSxcbiAgICAgICAgICAgICAgICAgICAndGFibGUtcm93LS1kYXJrLWhpZ2hsaWdodCc6IGlzRGFya0hpZ2hsaWdodChyb3cpXG4gICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAoYXV4Y2xpY2spPVwib3Blbk5ld1RhYihyb3cpXCJcbiAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgb25TZWxlY3RJdGVtKHJvdylcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uUHJvcCBvZiB2aXNpYmxlQ29sdW1uc0FycmF5OyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLWNlbGxcIlxuICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmlyc3QtY2VsbF09XCJpID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MubGFzdC1jZWxsXT1cImkgPT09IHZpc2libGVDb2x1bW5zQXJyYXkubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGlvbnMtY2VsbF09XCJpID09PSB2aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aCAtIDEgJiYgY29sdW1uUHJvcCA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXdpZHRoXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGggPyB7J3dpZHRoJzogZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aCArICclJywgJ2ZsZXgtYmFzaXMnOiBnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoICsgJyUnfSA6IHt9XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy50eXBlXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInd29ya2Zsb3dTdGF0dXMnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ3ZlN0YXR1cyB7eyBnZXRTdGF0dXNEZXNjcmlwdGlvbihyb3cpfX1cIiBbYXR0ci5pZF09XCIndGFibGUtYnRuLXdmLScrY29sdW1uUHJvcCsnLScrKHJvdy5pZCB8fCByb3cua2V5IHx8ICcnKVwiIFthdHRyLnRhYmluZGV4XT1cIi0xXCI+e3sgZ2V0U3RhdHVzRGVzY3JpcHRpb24ocm93KSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidoeXBlci10ZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvdWxkUmVuZGVyQXNIeXBlckxpbmsocm93KTsgZWxzZSBwbGFpbkh5cGVyVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtbGFiZWwgaHlwZXItbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoeXBlckxpbmtDbGlja2VkKGNvbHVtblByb3AsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluSHlwZXJUZXh0PlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtblByb3ApIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIididXR0b24nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG91bGRTaG93QnV0dG9uKHJvdylcIiBtYXQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByaW1hcnlcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBhY3Rpb25CdXR0b25DbGlja2VkKGNvbHVtblByb3AsIHJvdylcIiBbYXR0ci5pZF09XCIndGFibGUtYnRuLWFjdGlvbi0nK2NvbHVtblByb3BcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbEtleShnZXRDb2x1bW4oY29sdW1uUHJvcCkpICsgJ190aXRsZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ljb24nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgJ21haW5UYWJsZV9fdGRfX2ljb24tZ3JlZW4nOiByb3dbY29sdW1uUHJvcF0gPT09ICdwYXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAnbWFpblRhYmxlX190ZF9faWNvbi1vcmFuZ2UnOiByb3dbY29sdW1uUHJvcF0gPT09ICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAnbWFpblRhYmxlX190ZF9faWNvbi1yZWQnOiByb3dbY29sdW1uUHJvcF0gPT09ICdlcnJvcidcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdldEljb25BcmlhTGFiZWxLZXkocm93W2NvbHVtblByb3BdKSB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEljb24ocm93W2NvbHVtblByb3BdKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cInByaW1hcnlcIiBbdGFiSW5kZXhdPVwiLTFcIiBbY2hlY2tlZF09XCJyb3dbY29sdW1uUHJvcF1cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2FjdGlvbkNoZWNrZWRDbGlja2VkKGNvbHVtblByb3Ascm93KVwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdGF0ZVR5cGUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzdGF0ZVR5cGUge3sgcm93W2NvbHVtblByb3BdfX1cIiBbYXR0ci5pZF09XCIndGFibGUtYnRuLXN0YXRlLScrY29sdW1uUHJvcFwiIFthdHRyLnRhYmluZGV4XT1cIi0xXCI+e3sgbGFiZWxLZXlCeVZhbHVlKGdldENvbHVtbihjb2x1bW5Qcm9wKSwgcm93KSB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB8IGRhdGU6J2RkL01NL3l5eXknOidVVEMnIH19XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Nyb3BwZWRUZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRDcm9wcGVkVGV4dChleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCksIHJvd1tnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoXSkgfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZG93bmxvYWQnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2ljb24tYmx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidCQVNFX1RBQkxFLmRvd25sb2FkQWN0aW9uJyB8IHRyYW5zbGF0ZVwiPnN5c3RlbV91cGRhdGVfYWx0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInb25PZmYnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gbnVsbFwiIGNsYXNzPVwibWFpblRhYmxlX190ZF9faWNvbi1kYXJrb3JhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KG51bGwpIHwgdHJhbnNsYXRlXCI+ZmxhZzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gZmFsc2VcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2ljb24tcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KGZhbHNlKSB8IHRyYW5zbGF0ZVwiPmZsYWc8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJyb3dbY29sdW1uUHJvcF0gPT09IHRydWVcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2ljb24tZ3JlZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRPbk9mZkZsYWdBcmlhTGFiZWxLZXkodHJ1ZSkgfCB0cmFuc2xhdGVcIj5mbGFnPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3RhdHVzJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd1tjb2x1bW5Qcm9wXSA9PT0gbnVsbCB8fCByb3dbY29sdW1uUHJvcF0gPT09IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgcGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcuJyArIGdldENvbHVtbihjb2x1bW5Qcm9wKT8ubGFiZWwgKyAnSW5BY3RpdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dbY29sdW1uUHJvcF0gPT09IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5sYWJlbCArICdBY3RpdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5mbydcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidCQVNFX1RBQkxFLnJvd0RldGFpbHMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2VtaXRFdmVudChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCIndGFibGUtYnRuLWluZm8tJytyb3cuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIiduZXRBbW91bnQnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYWluVGFibGVfX3RkX19jdXJyZW5jeVwiIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7XCI+e3sgcm93W2dldENvbHVtbihjb2x1bW5Qcm9wKT8uY3VycmVuY3ldIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFpblRhYmxlX190ZF9fcHJvcGVydHlcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrOyBtYXJnaW4tbGVmdDo2cHg7IG1hcmdpbi1yaWdodDo2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtblByb3ApIHwgY3VycmVuY3k6Jyc6JycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xvY2FsRGF0ZVRpbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB8IGRhdGUgOiBleHRyYWN0Rm9ybWF0KGdldENvbHVtbihjb2x1bW5Qcm9wKSk6J1VUQycgfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYmlnZGVjaW1hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsPjxzdXAgY2xhc3M9XCJtYWluVGFibGVfX3RkX19jdXJyZW5jeVwiPnt7cm93W2dldENvbHVtbihjb2x1bW5Qcm9wKT8uY3VycmVuY3ldfX08L3N1cD48L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCkgfCBudW1iZXIgOiAoZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5kaWdpdEluZm8gfHwgJzEuMy01JykgfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbGlzdEFjdGlvbidcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1idXR0b24tYWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYnV0dG9uc0FjdGlvbl09XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LnZpZXdUeXBlID09PSAnYnV0dG9uc0FjdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsaXN0QWN0aW9uXT1cImxpc3RBY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zXT1cImxpc3RBY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGlja2VkQnV0dG9uKT1cImFjdGlvbkxpc3RDbGlja2VkKCRldmVudCxyb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLWJ1dHRvbi1hY3Rpb25zPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXN0J1wiPlxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJtYWluVGFibGVfX3RkX19saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldExpc3RJdGVtcyhyb3csIGNvbHVtblByb3ApXCI+e3sgaXRlbSB9fTwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy50cmFuc2xhdGU7IGVsc2Ugbm9UcmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZW1pdFJvdXRlUGFnZShyb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgXCIuXCIgKyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vVHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBlbWl0Um91dGVQYWdlKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVyVGV4dF09J2V4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTW9iaWxlIENhcmQgVmlldyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtY2FyZHMtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBkYXRhU291cmNlLmRhdGE7IGxldCByb3dJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICBjbGFzcz1cIm1vYmlsZS1jYXJkXCJcbiAgICAgICAgICAgICBbYXR0ci5pZF09XCInbW9iaWxlLWNhcmQtJyArIChyb3c/LmlkIHx8IHJvdz8ua2V5IHx8ICcnKVwiXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgJ21vYmlsZS1jYXJkLS1oaWdobGlnaHQnOiBzZWxlY3RlZFJvd0luZGV4ID09IHJvdy5pZCB8fCAocGFnZUluZm8uZ3JvdXBCeVByb3BlcnR5ICYmIHBhZ2VJbmZvLmdyb3VwQnlWYWx1ZT8uaW5jbHVkZXMocm93W3BhZ2VJbmZvLmdyb3VwQnlQcm9wZXJ0eV0pKSxcbiAgICAgICAgICAgICAgICdtb2JpbGUtY2FyZC0tZGFyay1oaWdobGlnaHQnOiBpc0RhcmtIaWdobGlnaHQocm93KVxuICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgIChhdXhjbGljayk9XCJvcGVuTmV3VGFiKHJvdylcIlxuICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IG9uU2VsZWN0SXRlbShyb3cpXCI+XG5cbiAgICAgICAgICA8IS0tIE1vYmlsZSBDYXJkIEhlYWRlcjogSUQvTmFtZSBhbmQgU3RhdHVzIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtY2FyZF9faGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX2hlYWRlci1pZFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vYmlsZS1jYXJkX19pZC10ZXh0XCI+e3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGdldE1vYmlsZUNhcmRJZENvbHVtbigpPy5wcm9wZXJ0eSB8fCAnaWQnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19oZWFkZXItc3RhdHVzXCIgKm5nSWY9XCJnZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKClcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwic3RhdGVUeXBlIHt7IHJvd1tnZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKCk/LnByb3BlcnR5XX19XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInbW9iaWxlLWJ0bi1zdGF0ZS0nK2dldE1vYmlsZUNhcmRTdGF0dXNDb2x1bW4oKT8ucHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICB7eyBsYWJlbEtleUJ5VmFsdWUoZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpLCByb3cpIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRGl2aWRlciAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX2RpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgIDwhLS0gTW9iaWxlIENhcmQgQm9keTogT3RoZXIgY29sdW1ucyAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX2JvZHlcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBnZXRNb2JpbGVDYXJkQ29sdW1ucygpXCIgY2xhc3M9XCJtb2JpbGUtY2FyZF9fcm93XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtY2FyZF9fcm93LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fSA6PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19yb3ctdmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4udHlwZVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXRlVHlwZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwic3RhdGVUeXBlIHt7IHJvd1tjb2x1bW4ucHJvcGVydHldfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidtb2JpbGUtYnRuLXN0YXRlLScrY29sdW1uLnByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXlCeVZhbHVlKGNvbHVtbiwgcm93KSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSB8IGRhdGU6J2RkL01NL3l5eXknOidVVEMnIH19XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ25ldEFtb3VudCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2JpbGUtY2FyZF9fYW1vdW50LWN1cnJlbmN5XCI+e3sgcm93W2NvbHVtbi5jdXJyZW5jeV0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9iaWxlLWNhcmRfX2Ftb3VudC12YWx1ZVwiPnt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW4ucHJvcGVydHkpIHwgY3VycmVuY3k6Jyc6JycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xvY2FsRGF0ZVRpbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW4ucHJvcGVydHkpIHwgZGF0ZSA6IGV4dHJhY3RGb3JtYXQoY29sdW1uKTonVVRDJyB9fVxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidiaWdkZWNpbWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGw+PHN1cCBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2N1cnJlbmN5XCI+e3tyb3dbY29sdW1uLmN1cnJlbmN5XX19PC9zdXA+PC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtbi5wcm9wZXJ0eSkgfCBudW1iZXIgOiAoY29sdW1uLmRpZ2l0SW5mbyB8fCAnMS4zLTUnKSB9fVxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXN0J1wiPlxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJtYWluVGFibGVfX3RkX19saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldExpc3RJdGVtcyhyb3csIGNvbHVtbi5wcm9wZXJ0eSlcIj57eyBpdGVtIH19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHJhbnNsYXRlOyBlbHNlIG5vVHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcGFnZUluZm8ubGFiZWxzU2VjdGlvbiArIFwiLlwiICsgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtbi5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vVHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lclRleHRdPSdleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIE1vYmlsZSBDYXJkIEFjdGlvbnMgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19hY3Rpb25zXCIgKm5nSWY9XCJsaXN0QWN0aW9uICYmIGxpc3RBY3Rpb24ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPGFwcC1idXR0b24tYWN0aW9uc1xuICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgIFtidXR0b25zQWN0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgICBbbGlzdEFjdGlvbl09XCJsaXN0QWN0aW9uXCJcbiAgICAgICAgICAgICAgW2FjdGlvbnNdPVwibGlzdEFjdGlvblwiXG4gICAgICAgICAgICAgIChjbGlja2VkQnV0dG9uKT1cImFjdGlvbkxpc3RDbGlja2VkKCRldmVudCxyb3cpXCI+XG4gICAgICAgICAgICA8L2FwcC1idXR0b24tYWN0aW9ucz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cIm5vRGF0YUZvdW5kXCIgY2xhc3M9XCJkYXRhTm90Rm91bmQgZmxleC1jb2x1bW5cIj5cbiAgICAgICAgPGltZyAqbmdJZj1cImdldERpc3BsYXlTdmdQYXRoKClcIiBbc3JjXT1cImdldERpc3BsYXlTdmdQYXRoKClcIiBjbGFzcz1cImRhdGFOb3RGb3VuZF9faWNvblwiIGFsdD1cIk5vIGRhdGEgZm91bmRcIiAvPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fdGl0bGVcIj57eyBnZXREaXNwbGF5VGl0bGUoKSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fc3VidGl0bGVcIj57eyBnZXREaXNwbGF5U3VidGl0bGUoKSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cblxuICAgICAgPGRpdiAgKm5nSWY9XCIoZGF0YVNvdXJjZS5kYXRhPy5sZW5ndGggPiAwIHx8IGN1c3RvbWl6ZWREYXRhKSAmJiAhcGFnZUluZm8uaGlkZVBhZ2luYXRpb25cIiBjbGFzcz1cIm1haW4tcGFnaW5hdGlvbiBmbGV4LXJvd1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlUGFnaW5hdGlvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtbiBmbGV4LTEwMFwiPlxuICAgICAgICAgICAgPGFwcC1wYWdpbmF0b3JcbiAgICAgICAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2VJbmRleFwiXG4gICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsRWxlbWVudHNcIlxuICAgICAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjUsIDUwXVwiXG4gICAgICAgICAgICAgIFttb2JpbGVMb2FkTW9yZUluY3JlbWVudF09XCJtb2JpbGVMb2FkTW9yZUluY3JlbWVudFwiXG4gICAgICAgICAgICAgIFtkaXNwbGF5ZWRJdGVtc109XCJtb2JpbGVEaXNwbGF5ZWRJdGVtcyB8fCBkYXRhU291cmNlLmRhdGEubGVuZ3RoXCJcbiAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uTG9hZE1vcmUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9hcHAtcGFnaW5hdG9yPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19