@c8y/ngx-components 1017.0.335 → 1017.0.336

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.
@@ -918,7 +918,7 @@ DataGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
918
918
  provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
919
919
  useExisting: forwardRef(() => DataGridComponent)
920
920
  }
921
- ], queries: [{ propertyName: "columnRenderers", predicate: ColumnDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scroll"], descendants: true, static: true }, { propertyName: "infiniteScrollContainer", first: true, predicate: ["infiniteScrollContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "thRefs", predicate: CdkHeaderCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n #scroll\n class=\"table-data-grid-scroll\"\n [ngClass]=\"{ 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent }\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-progress-bar [message]=\"loadingItemsLabel\"></c8y-progress-bar>\n </div>\n </div>\n\n <div *ngIf=\"displayOptions.gridHeader\" class=\"table-data-grid-header separator large-padding\">\n <div class=\"h4\" [ngClass]=\"{ 'm-r-16': !!title }\">{{ title | translate }}</div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <span class=\"label label-default m-r-4\" translate>No filters</span>\n <small\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n class=\"m-r-4\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n </span>\n <span *ngIf=\"filteringApplied\">\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small ngNonBindable translate [translateParams]=\"filteringLabelsParams\">\n of {{ allItemsCount }} items\n </small>\n </ng-container>\n <button\n title=\"{{ 'Clear filters' | translate }}\"\n class=\"btn btn-sm btn-default m-l-8 m-r-4\"\n (click)=\"clearFilters()\"\n >\n {{ 'Clear filters' | translate }}\n </button>\n </span>\n\n <span class=\"hidden-xs hidden-sm\" *ngIf=\"displayOptions.filter\">\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n popover=\"{{ 'Click the column headers to apply filters.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n [attr.aria-label]=\"'Click the column headers to apply filters.' | translate\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </span>\n\n <span class=\"hidden-xs hidden-sm\" *ngIf=\"showCounterWarning\">\n <button\n class=\"btn-clean text-primary\"\n popover=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n aria-label=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </span>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container *ngFor=\"let headerActionControl of headerActionControls\">\n <ng-container *ngIf=\"headerActionControl | isControlVisible\">\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n title=\"{{ headerActionControl.text | translate }}\"\n class=\"btnbar-btn btn-link\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i [c8yIcon]=\"headerActionControl.icon\" class=\"m-r-4\"></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </ng-container>\n\n <div\n *ngIf=\"configureColumnsEnabled\"\n class=\"dropdown\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n placement=\"bottom left\"\n >\n <button\n title=\"{{ 'Configure columns' | translate }}\"\n data-cy=\"data-grid--custom-column-btn\"\n class=\"btnbar-btn\"\n dropdownToggle\n aria-haspopup=\"true\"\n >\n <i c8yIcon=\"columns\" class=\"m-r-4\"></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul *dropdownMenu class=\"dropdown-menu data-grid__dropdown\" (click)=\"$event.stopPropagation()\">\n <li class=\"bg-level-0\">\n <div cdkDropList (cdkDropListDropped)=\"onColumnDrop($event)\" class=\"list-group m-0\">\n <div *ngFor=\"let column of columns\" cdkDrag cdkDragLockAxis=\"y\">\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n class=\"c8y-checkbox p-l-16\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n *ngIf=\"column.custom\"\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n placement=\"left\"\n container=\"body\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n >\n <c8y-popover-confirm\n [placement]=\"'left'\"\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n #poConfirm\n ></c8y-popover-confirm>\n <i c8yIcon=\"minus-circle\" data-cy=\"data-grid--custom-column-remove-btn\"></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li *ngIf=\"isConfigContextKnown\" class=\"p-8 sticky-bottom separator-top\">\n <button\n title=\"{{ 'Add custom column' | translate }}\"\n class=\"btn btn-default btn-block\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n title=\"{{ 'Reload' | translate }}\"\n data-cy=\"data-grid--reload-btn\"\n class=\"btnbar-btn btn-link\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i c8yIcon=\"refresh\" class=\"m-r-4\"></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n *ngIf=\"!serverSideDataCallback || showSearch\"\n class=\"input-group input-group-search m-l-sm-16\"\n >\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n [ngModel]=\"searchText\"\n (input)=\"searchText$.emit($event.target.value)\"\n />\n <div class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"searchText.length === 0\"></i>\n <i\n c8yIcon=\"times\"\n class=\"pointer\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <span ngNonBindable translate [translateParams]=\"{ count: selectedItemIds.length }\">\n {{ count }} selected item(s).\n </span>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n (click)=\"setAllItemsSelected(true)\"\n class=\"interact\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container *ngFor=\"let bulkActionControl of bulkActionControls\">\n <ng-container\n *ngIf=\"bulkActionControl | isControlVisible: selectedItemIds\"\n [ngSwitch]=\"bulkActionControl.type\"\n >\n <button\n title=\"{{ 'Export' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Export\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n title=\"{{ 'Delete' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n title=\"{{ bulkActionControl.text | translate }}\"\n *ngSwitchDefault\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n >\n <i c8yIcon=\"{{ bulkActionControl.icon }}\"></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btnbar-btn\"\n (click)=\"cancel()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-hover table-filtered-sorted table-data-grid large-padding\"\n cdk-table\n [dataSource]=\"dataSource\"\n [trackBy]=\"trackByName\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\">\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td cdk-cell *cdkCellDef=\"let row\" data-type=\"icon\">\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\">\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td cdk-cell *cdkCellDef=\"let row\" data-type=\"icon\">\n <ng-container *ngIf=\"actionControls.length <= 2\">\n <ng-container *ngFor=\"let actionControl of actionControls\">\n <ng-container\n *ngIf=\"actionControl | isControlVisible: row\"\n [ngSwitch]=\"actionControl.type\"\n >\n <button\n *ngSwitchCase=\"builtInActionType.Edit\"\n class=\"btn btn-dot\"\n tooltip=\"{{ 'Edit' | translate }}\"\n [attr.aria-label]=\"'Edit' | translate\"\n [delay]=\"500\"\n container=\"body\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n tooltip=\"{{ 'Delete' | translate }}\"\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n [attr.aria-label]=\"'Delete' | translate\"\n [delay]=\"500\"\n container=\"body\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n type=\"button\"\n *ngSwitchDefault\n class=\"btn btn-dot\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n container=\"body\"\n [delay]=\"500\"\n >\n <i *ngIf=\"actionControl.icon\" c8yIcon=\"{{ actionControl.icon }}\"></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div [ngClass]=\"{ 'm-l-auto overflow-visible': actionControls.length > 2 }\">\n <div\n *ngIf=\"actionControls.length > 2\"\n class=\"dropdown\"\n dropdown\n container=\"body\"\n placement=\"bottom right\"\n >\n <button\n title=\"{{ 'Actions' | translate }}\"\n type=\"button\"\n class=\"dropdown-toggle c8y-dropdown\"\n dropdownToggle\n aria-haspopup=\"true\"\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul class=\"dropdown-menu dropdown-menu-right\" *dropdownMenu>\n <li *ngFor=\"let actionControl of actionControls\">\n <ng-container\n *ngIf=\"actionControl | isControlVisible: row\"\n [ngSwitch]=\"actionControl.type\"\n >\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i c8yIcon=\"{{ actionControl.icon }}\"></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n >\n <div *ngIf=\"!column.filterable\" [title]=\"(column.header | translate) || column.name\">\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n *ngIf=\"column.filterable\"\n class=\"dropdown\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n [insideClick]=\"true\"\n >\n <button\n type=\"button\"\n class=\"btn-header\"\n dropdownToggle\n [title]=\"(column.header | translate) || column.name\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n aria-haspopup=\"true\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n <i c8yIcon=\"filter\" title=\"{{ 'Filter' | translate }}\"></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n *dropdownMenu\n class=\"dropdown-menu\"\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec:this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n [spec]=\"filteringFormRendererSpec\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n *ngIf=\"column.sortable\"\n class=\"btn-sort\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i *ngSwitchCase=\"'asc'\" c8yIcon=\"long-arrow-up\"></i>\n <i *ngSwitchCase=\"'desc'\" c8yIcon=\"long-arrow-down\"></i>\n <i *ngSwitchDefault c8yIcon=\"exchange\"></i>\n </ng-container>\n </button>\n\n <span\n *ngIf=\"column.resizable\"\n class=\"resize-handle\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cell-title]=\"column.header | translate\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n [class.hidden]=\"!column.visible\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td cdk-footer-cell *cdkFooterCellDef [style.grid-column]=\"styles.gridInfiniteScrollColumn\">\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr cdk-header-row *cdkHeaderRowDef=\"columnNames\"></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"rowClick.emit(row)\"\n ></tr>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"!(dataSource.loading$ | async) && (dataSource.stats$ | async).filteredSize === 0\"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n </div>\n </div>\n\n <div *ngIf=\"pagination && !infiniteScroll\" class=\"table-data-grid-footer separator large-padding\">\n <div class=\"col-sm-4 no-gutter\">\n <div\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n class=\"counter p-t-8 p-b-8\"\n data-cy=\"data-grid--counter\"\n >\n <span class=\"text-muted\" ngNonBindable translate [translateParams]=\"paginationLabelParams\">\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n class=\"form-group form-inline p-t-8 p-b-8\"\n >\n <label class=\"m-r-4\" for=\"filteredSize\">{{ 'Items per page' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option *ngFor=\"let pageSize of possiblePageSizes\" [ngValue]=\"pageSize\">\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [class.hidden]=\"hidePagination$ | async\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n class=\"p-t-8 p-b-8\"\n ></pagination>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i7.CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: i7.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i7.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i7.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i7.CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: i7.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["sticky", "cdkColumnDef", "stickyEnd"] }, { kind: "directive", type: i7.CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: i7.CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: i7.CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: i7.CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "component", type: i7.CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: i7.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i7.CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "directive", type: i7.CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i9.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i9.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i10.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i11.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i12.ProgressBarComponent, selector: "c8y-progress-bar", inputs: ["message", "progress"] }, { kind: "component", type: i13.PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick"] }, { kind: "directive", type: i14.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i14.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i14.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i15.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i16.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i17.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i18.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit"] }, { kind: "directive", type: i19.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i20.CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: i21.FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i22.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i23.MapFunctionPipe, name: "map" }, { kind: "pipe", type: i24.IsControlVisiblePipe, name: "isControlVisible" }] });
921
+ ], queries: [{ propertyName: "columnRenderers", predicate: ColumnDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scroll"], descendants: true, static: true }, { propertyName: "infiniteScrollContainer", first: true, predicate: ["infiniteScrollContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "thRefs", predicate: CdkHeaderCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n #scroll\n class=\"table-data-grid-scroll\"\n [ngClass]=\"{ 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent }\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-progress-bar [message]=\"loadingItemsLabel\"></c8y-progress-bar>\n </div>\n </div>\n\n <div *ngIf=\"displayOptions.gridHeader\" class=\"table-data-grid-header separator large-padding\">\n <div class=\"h4\" [ngClass]=\"{ 'm-r-16': !!title }\">{{ title | translate }}</div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <span class=\"label label-default m-r-4\" translate>No filters</span>\n <small\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n class=\"m-r-4\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n </span>\n <span *ngIf=\"filteringApplied\">\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small ngNonBindable translate [translateParams]=\"filteringLabelsParams\">\n of {{ allItemsCount }} items\n </small>\n </ng-container>\n <button\n title=\"{{ 'Clear filters' | translate }}\"\n class=\"btn btn-sm btn-default m-l-8 m-r-4\"\n (click)=\"clearFilters()\"\n >\n {{ 'Clear filters' | translate }}\n </button>\n </span>\n\n <span class=\"hidden-xs hidden-sm\" *ngIf=\"displayOptions.filter\">\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n popover=\"{{ 'Click the column headers to apply filters.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n [attr.aria-label]=\"'Click the column headers to apply filters.' | translate\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </span>\n\n <span class=\"hidden-xs hidden-sm\" *ngIf=\"showCounterWarning\">\n <button\n class=\"btn-clean text-primary\"\n popover=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n aria-label=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </span>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container *ngFor=\"let headerActionControl of headerActionControls\">\n <ng-container *ngIf=\"headerActionControl | isControlVisible\">\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n title=\"{{ headerActionControl.text | translate }}\"\n class=\"btnbar-btn btn-link\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i [c8yIcon]=\"headerActionControl.icon\" class=\"m-r-4\"></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </ng-container>\n\n <div\n *ngIf=\"configureColumnsEnabled\"\n class=\"dropdown\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n placement=\"bottom left\"\n >\n <button\n title=\"{{ 'Configure columns' | translate }}\"\n data-cy=\"data-grid--custom-column-btn\"\n class=\"btnbar-btn\"\n dropdownToggle\n aria-haspopup=\"true\"\n >\n <i c8yIcon=\"columns\" class=\"m-r-4\"></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"bg-level-0\">\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n class=\"c8y-checkbox p-l-16\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n *ngIf=\"column.custom\"\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n placement=\"left\"\n container=\"body\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n >\n <c8y-popover-confirm\n [placement]=\"'left'\"\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n #poConfirm\n ></c8y-popover-confirm>\n <i c8yIcon=\"minus-circle\" data-cy=\"data-grid--custom-column-remove-btn\"></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li *ngIf=\"isConfigContextKnown\" class=\"p-8 sticky-bottom separator-top\">\n <button\n title=\"{{ 'Add custom column' | translate }}\"\n class=\"btn btn-default btn-block\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n title=\"{{ 'Reload' | translate }}\"\n data-cy=\"data-grid--reload-btn\"\n class=\"btnbar-btn btn-link\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i c8yIcon=\"refresh\" class=\"m-r-4\"></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n *ngIf=\"!serverSideDataCallback || showSearch\"\n class=\"input-group input-group-search m-l-sm-16\"\n >\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n [ngModel]=\"searchText\"\n (input)=\"searchText$.emit($event.target.value)\"\n />\n <div class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"searchText.length === 0\"></i>\n <i\n c8yIcon=\"times\"\n class=\"pointer\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <span ngNonBindable translate [translateParams]=\"{ count: selectedItemIds.length }\">\n {{ count }} selected item(s).\n </span>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n (click)=\"setAllItemsSelected(true)\"\n class=\"interact\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container *ngFor=\"let bulkActionControl of bulkActionControls\">\n <ng-container\n *ngIf=\"bulkActionControl | isControlVisible: selectedItemIds\"\n [ngSwitch]=\"bulkActionControl.type\"\n >\n <button\n title=\"{{ 'Export' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Export\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n title=\"{{ 'Delete' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n title=\"{{ bulkActionControl.text | translate }}\"\n *ngSwitchDefault\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n >\n <i c8yIcon=\"{{ bulkActionControl.icon }}\"></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btnbar-btn\"\n (click)=\"cancel()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-hover table-filtered-sorted table-data-grid large-padding\"\n cdk-table\n [dataSource]=\"dataSource\"\n [trackBy]=\"trackByName\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\">\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td cdk-cell *cdkCellDef=\"let row\" data-type=\"icon\">\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\">\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td cdk-cell *cdkCellDef=\"let row\" data-type=\"icon\">\n <ng-container *ngIf=\"actionControls.length <= 2\">\n <ng-container *ngFor=\"let actionControl of actionControls\">\n <ng-container\n *ngIf=\"actionControl | isControlVisible: row\"\n [ngSwitch]=\"actionControl.type\"\n >\n <button\n *ngSwitchCase=\"builtInActionType.Edit\"\n class=\"btn btn-dot\"\n tooltip=\"{{ 'Edit' | translate }}\"\n [attr.aria-label]=\"'Edit' | translate\"\n [delay]=\"500\"\n container=\"body\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n tooltip=\"{{ 'Delete' | translate }}\"\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n [attr.aria-label]=\"'Delete' | translate\"\n [delay]=\"500\"\n container=\"body\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n type=\"button\"\n *ngSwitchDefault\n class=\"btn btn-dot\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n container=\"body\"\n [delay]=\"500\"\n >\n <i *ngIf=\"actionControl.icon\" c8yIcon=\"{{ actionControl.icon }}\"></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div [ngClass]=\"{ 'm-l-auto overflow-visible': actionControls.length > 2 }\">\n <div\n *ngIf=\"actionControls.length > 2\"\n class=\"dropdown\"\n dropdown\n container=\"body\"\n placement=\"bottom right\"\n >\n <button\n title=\"{{ 'Actions' | translate }}\"\n type=\"button\"\n class=\"dropdown-toggle c8y-dropdown\"\n dropdownToggle\n aria-haspopup=\"true\"\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul class=\"dropdown-menu dropdown-menu-right\" *dropdownMenu>\n <li *ngFor=\"let actionControl of actionControls\">\n <ng-container\n *ngIf=\"actionControl | isControlVisible: row\"\n [ngSwitch]=\"actionControl.type\"\n >\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i c8yIcon=\"{{ actionControl.icon }}\"></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n >\n <div *ngIf=\"!column.filterable\" [title]=\"(column.header | translate) || column.name\">\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n *ngIf=\"column.filterable\"\n class=\"dropdown\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n [insideClick]=\"true\"\n >\n <button\n type=\"button\"\n class=\"btn-header\"\n dropdownToggle\n [title]=\"(column.header | translate) || column.name\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n aria-haspopup=\"true\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n <i c8yIcon=\"filter\" title=\"{{ 'Filter' | translate }}\"></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n *dropdownMenu\n class=\"dropdown-menu\"\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec:this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n [spec]=\"filteringFormRendererSpec\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n *ngIf=\"column.sortable\"\n class=\"btn-sort\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i *ngSwitchCase=\"'asc'\" c8yIcon=\"long-arrow-up\"></i>\n <i *ngSwitchCase=\"'desc'\" c8yIcon=\"long-arrow-down\"></i>\n <i *ngSwitchDefault c8yIcon=\"exchange\"></i>\n </ng-container>\n </button>\n\n <span\n *ngIf=\"column.resizable\"\n class=\"resize-handle\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cell-title]=\"column.header | translate\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n [class.hidden]=\"!column.visible\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td cdk-footer-cell *cdkFooterCellDef [style.grid-column]=\"styles.gridInfiniteScrollColumn\">\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr cdk-header-row *cdkHeaderRowDef=\"columnNames\"></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"rowClick.emit(row)\"\n ></tr>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"!(dataSource.loading$ | async) && (dataSource.stats$ | async).filteredSize === 0\"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n </div>\n </div>\n\n <div *ngIf=\"pagination && !infiniteScroll\" class=\"table-data-grid-footer separator large-padding\">\n <div class=\"col-sm-4 no-gutter\">\n <div\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n class=\"counter p-t-8 p-b-8\"\n data-cy=\"data-grid--counter\"\n >\n <span class=\"text-muted\" ngNonBindable translate [translateParams]=\"paginationLabelParams\">\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n class=\"form-group form-inline p-t-8 p-b-8\"\n >\n <label class=\"m-r-4\" for=\"filteredSize\">{{ 'Items per page' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option *ngFor=\"let pageSize of possiblePageSizes\" [ngValue]=\"pageSize\">\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [class.hidden]=\"hidePagination$ | async\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n class=\"p-t-8 p-b-8\"\n ></pagination>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i7.CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: i7.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i7.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i7.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i7.CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: i7.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["sticky", "cdkColumnDef", "stickyEnd"] }, { kind: "directive", type: i7.CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: i7.CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: i7.CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: i7.CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "component", type: i7.CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: i7.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i7.CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "directive", type: i7.CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i9.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i9.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i10.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i11.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i12.ProgressBarComponent, selector: "c8y-progress-bar", inputs: ["message", "progress"] }, { kind: "component", type: i13.PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick"] }, { kind: "directive", type: i14.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i14.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i14.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i15.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i16.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i17.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i18.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit"] }, { kind: "directive", type: i19.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i20.CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: i21.FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i22.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i23.MapFunctionPipe, name: "map" }, { kind: "pipe", type: i24.IsControlVisiblePipe, name: "isControlVisible" }] });
922
922
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DataGridComponent, decorators: [{
923
923
  type: Component,
924
924
  args: [{ selector: 'c8y-data-grid', host: { class: 'd-contents' }, providers: [
@@ -926,7 +926,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
926
926
  provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
927
927
  useExisting: forwardRef(() => DataGridComponent)
928
928
  }
929
- ], template: "<div\n #scroll\n class=\"table-data-grid-scroll\"\n [ngClass]=\"{ 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent }\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-progress-bar [message]=\"loadingItemsLabel\"></c8y-progress-bar>\n </div>\n </div>\n\n <div *ngIf=\"displayOptions.gridHeader\" class=\"table-data-grid-header separator large-padding\">\n <div class=\"h4\" [ngClass]=\"{ 'm-r-16': !!title }\">{{ title | translate }}</div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <span class=\"label label-default m-r-4\" translate>No filters</span>\n <small\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n class=\"m-r-4\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n </span>\n <span *ngIf=\"filteringApplied\">\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small ngNonBindable translate [translateParams]=\"filteringLabelsParams\">\n of {{ allItemsCount }} items\n </small>\n </ng-container>\n <button\n title=\"{{ 'Clear filters' | translate }}\"\n class=\"btn btn-sm btn-default m-l-8 m-r-4\"\n (click)=\"clearFilters()\"\n >\n {{ 'Clear filters' | translate }}\n </button>\n </span>\n\n <span class=\"hidden-xs hidden-sm\" *ngIf=\"displayOptions.filter\">\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n popover=\"{{ 'Click the column headers to apply filters.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n [attr.aria-label]=\"'Click the column headers to apply filters.' | translate\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </span>\n\n <span class=\"hidden-xs hidden-sm\" *ngIf=\"showCounterWarning\">\n <button\n class=\"btn-clean text-primary\"\n popover=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n aria-label=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </span>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container *ngFor=\"let headerActionControl of headerActionControls\">\n <ng-container *ngIf=\"headerActionControl | isControlVisible\">\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n title=\"{{ headerActionControl.text | translate }}\"\n class=\"btnbar-btn btn-link\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i [c8yIcon]=\"headerActionControl.icon\" class=\"m-r-4\"></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </ng-container>\n\n <div\n *ngIf=\"configureColumnsEnabled\"\n class=\"dropdown\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n placement=\"bottom left\"\n >\n <button\n title=\"{{ 'Configure columns' | translate }}\"\n data-cy=\"data-grid--custom-column-btn\"\n class=\"btnbar-btn\"\n dropdownToggle\n aria-haspopup=\"true\"\n >\n <i c8yIcon=\"columns\" class=\"m-r-4\"></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul *dropdownMenu class=\"dropdown-menu data-grid__dropdown\" (click)=\"$event.stopPropagation()\">\n <li class=\"bg-level-0\">\n <div cdkDropList (cdkDropListDropped)=\"onColumnDrop($event)\" class=\"list-group m-0\">\n <div *ngFor=\"let column of columns\" cdkDrag cdkDragLockAxis=\"y\">\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n class=\"c8y-checkbox p-l-16\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n *ngIf=\"column.custom\"\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n placement=\"left\"\n container=\"body\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n >\n <c8y-popover-confirm\n [placement]=\"'left'\"\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n #poConfirm\n ></c8y-popover-confirm>\n <i c8yIcon=\"minus-circle\" data-cy=\"data-grid--custom-column-remove-btn\"></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li *ngIf=\"isConfigContextKnown\" class=\"p-8 sticky-bottom separator-top\">\n <button\n title=\"{{ 'Add custom column' | translate }}\"\n class=\"btn btn-default btn-block\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n title=\"{{ 'Reload' | translate }}\"\n data-cy=\"data-grid--reload-btn\"\n class=\"btnbar-btn btn-link\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i c8yIcon=\"refresh\" class=\"m-r-4\"></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n *ngIf=\"!serverSideDataCallback || showSearch\"\n class=\"input-group input-group-search m-l-sm-16\"\n >\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n [ngModel]=\"searchText\"\n (input)=\"searchText$.emit($event.target.value)\"\n />\n <div class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"searchText.length === 0\"></i>\n <i\n c8yIcon=\"times\"\n class=\"pointer\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <span ngNonBindable translate [translateParams]=\"{ count: selectedItemIds.length }\">\n {{ count }} selected item(s).\n </span>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n (click)=\"setAllItemsSelected(true)\"\n class=\"interact\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container *ngFor=\"let bulkActionControl of bulkActionControls\">\n <ng-container\n *ngIf=\"bulkActionControl | isControlVisible: selectedItemIds\"\n [ngSwitch]=\"bulkActionControl.type\"\n >\n <button\n title=\"{{ 'Export' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Export\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n title=\"{{ 'Delete' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n title=\"{{ bulkActionControl.text | translate }}\"\n *ngSwitchDefault\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n >\n <i c8yIcon=\"{{ bulkActionControl.icon }}\"></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btnbar-btn\"\n (click)=\"cancel()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-hover table-filtered-sorted table-data-grid large-padding\"\n cdk-table\n [dataSource]=\"dataSource\"\n [trackBy]=\"trackByName\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\">\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td cdk-cell *cdkCellDef=\"let row\" data-type=\"icon\">\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\">\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td cdk-cell *cdkCellDef=\"let row\" data-type=\"icon\">\n <ng-container *ngIf=\"actionControls.length <= 2\">\n <ng-container *ngFor=\"let actionControl of actionControls\">\n <ng-container\n *ngIf=\"actionControl | isControlVisible: row\"\n [ngSwitch]=\"actionControl.type\"\n >\n <button\n *ngSwitchCase=\"builtInActionType.Edit\"\n class=\"btn btn-dot\"\n tooltip=\"{{ 'Edit' | translate }}\"\n [attr.aria-label]=\"'Edit' | translate\"\n [delay]=\"500\"\n container=\"body\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n tooltip=\"{{ 'Delete' | translate }}\"\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n [attr.aria-label]=\"'Delete' | translate\"\n [delay]=\"500\"\n container=\"body\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n type=\"button\"\n *ngSwitchDefault\n class=\"btn btn-dot\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n container=\"body\"\n [delay]=\"500\"\n >\n <i *ngIf=\"actionControl.icon\" c8yIcon=\"{{ actionControl.icon }}\"></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div [ngClass]=\"{ 'm-l-auto overflow-visible': actionControls.length > 2 }\">\n <div\n *ngIf=\"actionControls.length > 2\"\n class=\"dropdown\"\n dropdown\n container=\"body\"\n placement=\"bottom right\"\n >\n <button\n title=\"{{ 'Actions' | translate }}\"\n type=\"button\"\n class=\"dropdown-toggle c8y-dropdown\"\n dropdownToggle\n aria-haspopup=\"true\"\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul class=\"dropdown-menu dropdown-menu-right\" *dropdownMenu>\n <li *ngFor=\"let actionControl of actionControls\">\n <ng-container\n *ngIf=\"actionControl | isControlVisible: row\"\n [ngSwitch]=\"actionControl.type\"\n >\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i c8yIcon=\"{{ actionControl.icon }}\"></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n >\n <div *ngIf=\"!column.filterable\" [title]=\"(column.header | translate) || column.name\">\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n *ngIf=\"column.filterable\"\n class=\"dropdown\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n [insideClick]=\"true\"\n >\n <button\n type=\"button\"\n class=\"btn-header\"\n dropdownToggle\n [title]=\"(column.header | translate) || column.name\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n aria-haspopup=\"true\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n <i c8yIcon=\"filter\" title=\"{{ 'Filter' | translate }}\"></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n *dropdownMenu\n class=\"dropdown-menu\"\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec:this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n [spec]=\"filteringFormRendererSpec\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n *ngIf=\"column.sortable\"\n class=\"btn-sort\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i *ngSwitchCase=\"'asc'\" c8yIcon=\"long-arrow-up\"></i>\n <i *ngSwitchCase=\"'desc'\" c8yIcon=\"long-arrow-down\"></i>\n <i *ngSwitchDefault c8yIcon=\"exchange\"></i>\n </ng-container>\n </button>\n\n <span\n *ngIf=\"column.resizable\"\n class=\"resize-handle\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cell-title]=\"column.header | translate\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n [class.hidden]=\"!column.visible\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td cdk-footer-cell *cdkFooterCellDef [style.grid-column]=\"styles.gridInfiniteScrollColumn\">\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr cdk-header-row *cdkHeaderRowDef=\"columnNames\"></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"rowClick.emit(row)\"\n ></tr>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"!(dataSource.loading$ | async) && (dataSource.stats$ | async).filteredSize === 0\"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n </div>\n </div>\n\n <div *ngIf=\"pagination && !infiniteScroll\" class=\"table-data-grid-footer separator large-padding\">\n <div class=\"col-sm-4 no-gutter\">\n <div\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n class=\"counter p-t-8 p-b-8\"\n data-cy=\"data-grid--counter\"\n >\n <span class=\"text-muted\" ngNonBindable translate [translateParams]=\"paginationLabelParams\">\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n class=\"form-group form-inline p-t-8 p-b-8\"\n >\n <label class=\"m-r-4\" for=\"filteredSize\">{{ 'Items per page' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option *ngFor=\"let pageSize of possiblePageSizes\" [ngValue]=\"pageSize\">\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [class.hidden]=\"hidePagination$ | async\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n class=\"p-t-8 p-b-8\"\n ></pagination>\n </div>\n </div>\n</div>\n" }]
929
+ ], template: "<div\n #scroll\n class=\"table-data-grid-scroll\"\n [ngClass]=\"{ 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent }\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-progress-bar [message]=\"loadingItemsLabel\"></c8y-progress-bar>\n </div>\n </div>\n\n <div *ngIf=\"displayOptions.gridHeader\" class=\"table-data-grid-header separator large-padding\">\n <div class=\"h4\" [ngClass]=\"{ 'm-r-16': !!title }\">{{ title | translate }}</div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <span class=\"label label-default m-r-4\" translate>No filters</span>\n <small\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n class=\"m-r-4\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n </span>\n <span *ngIf=\"filteringApplied\">\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small ngNonBindable translate [translateParams]=\"filteringLabelsParams\">\n of {{ allItemsCount }} items\n </small>\n </ng-container>\n <button\n title=\"{{ 'Clear filters' | translate }}\"\n class=\"btn btn-sm btn-default m-l-8 m-r-4\"\n (click)=\"clearFilters()\"\n >\n {{ 'Clear filters' | translate }}\n </button>\n </span>\n\n <span class=\"hidden-xs hidden-sm\" *ngIf=\"displayOptions.filter\">\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n popover=\"{{ 'Click the column headers to apply filters.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n [attr.aria-label]=\"'Click the column headers to apply filters.' | translate\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </span>\n\n <span class=\"hidden-xs hidden-sm\" *ngIf=\"showCounterWarning\">\n <button\n class=\"btn-clean text-primary\"\n popover=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n aria-label=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </span>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container *ngFor=\"let headerActionControl of headerActionControls\">\n <ng-container *ngIf=\"headerActionControl | isControlVisible\">\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n title=\"{{ headerActionControl.text | translate }}\"\n class=\"btnbar-btn btn-link\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i [c8yIcon]=\"headerActionControl.icon\" class=\"m-r-4\"></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </ng-container>\n\n <div\n *ngIf=\"configureColumnsEnabled\"\n class=\"dropdown\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n placement=\"bottom left\"\n >\n <button\n title=\"{{ 'Configure columns' | translate }}\"\n data-cy=\"data-grid--custom-column-btn\"\n class=\"btnbar-btn\"\n dropdownToggle\n aria-haspopup=\"true\"\n >\n <i c8yIcon=\"columns\" class=\"m-r-4\"></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"bg-level-0\">\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n class=\"c8y-checkbox p-l-16\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n *ngIf=\"column.custom\"\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n placement=\"left\"\n container=\"body\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n >\n <c8y-popover-confirm\n [placement]=\"'left'\"\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n #poConfirm\n ></c8y-popover-confirm>\n <i c8yIcon=\"minus-circle\" data-cy=\"data-grid--custom-column-remove-btn\"></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li *ngIf=\"isConfigContextKnown\" class=\"p-8 sticky-bottom separator-top\">\n <button\n title=\"{{ 'Add custom column' | translate }}\"\n class=\"btn btn-default btn-block\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i c8yIcon=\"plus-circle\" class=\"m-r-4\"></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n title=\"{{ 'Reload' | translate }}\"\n data-cy=\"data-grid--reload-btn\"\n class=\"btnbar-btn btn-link\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i c8yIcon=\"refresh\" class=\"m-r-4\"></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n *ngIf=\"!serverSideDataCallback || showSearch\"\n class=\"input-group input-group-search m-l-sm-16\"\n >\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n [ngModel]=\"searchText\"\n (input)=\"searchText$.emit($event.target.value)\"\n />\n <div class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"searchText.length === 0\"></i>\n <i\n c8yIcon=\"times\"\n class=\"pointer\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <span ngNonBindable translate [translateParams]=\"{ count: selectedItemIds.length }\">\n {{ count }} selected item(s).\n </span>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n (click)=\"setAllItemsSelected(true)\"\n class=\"interact\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container *ngFor=\"let bulkActionControl of bulkActionControls\">\n <ng-container\n *ngIf=\"bulkActionControl | isControlVisible: selectedItemIds\"\n [ngSwitch]=\"bulkActionControl.type\"\n >\n <button\n title=\"{{ 'Export' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Export\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n title=\"{{ 'Delete' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n title=\"{{ bulkActionControl.text | translate }}\"\n *ngSwitchDefault\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n >\n <i c8yIcon=\"{{ bulkActionControl.icon }}\"></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btnbar-btn\"\n (click)=\"cancel()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-hover table-filtered-sorted table-data-grid large-padding\"\n cdk-table\n [dataSource]=\"dataSource\"\n [trackBy]=\"trackByName\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\">\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td cdk-cell *cdkCellDef=\"let row\" data-type=\"icon\">\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\">\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td cdk-cell *cdkCellDef=\"let row\" data-type=\"icon\">\n <ng-container *ngIf=\"actionControls.length <= 2\">\n <ng-container *ngFor=\"let actionControl of actionControls\">\n <ng-container\n *ngIf=\"actionControl | isControlVisible: row\"\n [ngSwitch]=\"actionControl.type\"\n >\n <button\n *ngSwitchCase=\"builtInActionType.Edit\"\n class=\"btn btn-dot\"\n tooltip=\"{{ 'Edit' | translate }}\"\n [attr.aria-label]=\"'Edit' | translate\"\n [delay]=\"500\"\n container=\"body\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n tooltip=\"{{ 'Delete' | translate }}\"\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n [attr.aria-label]=\"'Delete' | translate\"\n [delay]=\"500\"\n container=\"body\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n type=\"button\"\n *ngSwitchDefault\n class=\"btn btn-dot\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n container=\"body\"\n [delay]=\"500\"\n >\n <i *ngIf=\"actionControl.icon\" c8yIcon=\"{{ actionControl.icon }}\"></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div [ngClass]=\"{ 'm-l-auto overflow-visible': actionControls.length > 2 }\">\n <div\n *ngIf=\"actionControls.length > 2\"\n class=\"dropdown\"\n dropdown\n container=\"body\"\n placement=\"bottom right\"\n >\n <button\n title=\"{{ 'Actions' | translate }}\"\n type=\"button\"\n class=\"dropdown-toggle c8y-dropdown\"\n dropdownToggle\n aria-haspopup=\"true\"\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul class=\"dropdown-menu dropdown-menu-right\" *dropdownMenu>\n <li *ngFor=\"let actionControl of actionControls\">\n <ng-container\n *ngIf=\"actionControl | isControlVisible: row\"\n [ngSwitch]=\"actionControl.type\"\n >\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i c8yIcon=\"{{ actionControl.icon }}\"></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n >\n <div *ngIf=\"!column.filterable\" [title]=\"(column.header | translate) || column.name\">\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n *ngIf=\"column.filterable\"\n class=\"dropdown\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n [insideClick]=\"true\"\n >\n <button\n type=\"button\"\n class=\"btn-header\"\n dropdownToggle\n [title]=\"(column.header | translate) || column.name\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n aria-haspopup=\"true\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n <i c8yIcon=\"filter\" title=\"{{ 'Filter' | translate }}\"></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n *dropdownMenu\n class=\"dropdown-menu\"\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec:this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n [spec]=\"filteringFormRendererSpec\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n *ngIf=\"column.sortable\"\n class=\"btn-sort\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i *ngSwitchCase=\"'asc'\" c8yIcon=\"long-arrow-up\"></i>\n <i *ngSwitchCase=\"'desc'\" c8yIcon=\"long-arrow-down\"></i>\n <i *ngSwitchDefault c8yIcon=\"exchange\"></i>\n </ng-container>\n </button>\n\n <span\n *ngIf=\"column.resizable\"\n class=\"resize-handle\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cell-title]=\"column.header | translate\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n [class.hidden]=\"!column.visible\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec:this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td cdk-footer-cell *cdkFooterCellDef [style.grid-column]=\"styles.gridInfiniteScrollColumn\">\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr cdk-header-row *cdkHeaderRowDef=\"columnNames\"></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"rowClick.emit(row)\"\n ></tr>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"!(dataSource.loading$ | async) && (dataSource.stats$ | async).filteredSize === 0\"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n </div>\n </div>\n\n <div *ngIf=\"pagination && !infiniteScroll\" class=\"table-data-grid-footer separator large-padding\">\n <div class=\"col-sm-4 no-gutter\">\n <div\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n class=\"counter p-t-8 p-b-8\"\n data-cy=\"data-grid--counter\"\n >\n <span class=\"text-muted\" ngNonBindable translate [translateParams]=\"paginationLabelParams\">\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n class=\"form-group form-inline p-t-8 p-b-8\"\n >\n <label class=\"m-r-4\" for=\"filteredSize\">{{ 'Items per page' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option *ngFor=\"let pageSize of possiblePageSizes\" [ngValue]=\"pageSize\">\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [class.hidden]=\"hidePagination$ | async\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n class=\"p-t-8 p-b-8\"\n ></pagination>\n </div>\n </div>\n</div>\n" }]
930
930
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
931
931
  type: Optional
932
932
  }, {
@@ -1026,4 +1026,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
1026
1026
  type: ViewChildren,
1027
1027
  args: [CdkHeaderCell, { read: ElementRef }]
1028
1028
  }] } });
1029
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFFTCxTQUFTLEVBRVQsd0JBQXdCLEVBQ3hCLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQ0wsSUFBSSxFQUNKLEdBQUcsRUFDSCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFVBQVUsRUFDVixLQUFLLEVBQ0wsUUFBUSxJQUFJLFNBQVMsRUFDckIsS0FBSyxFQUNMLE1BQU0sRUFDTixPQUFPLEVBQ1IsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLFlBQVksRUFDWixLQUFLLEVBRUwsRUFBRSxFQUNGLElBQUksRUFDSixPQUFPLEVBRVIsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixLQUFLLEVBQ0wsR0FBRyxFQUNILFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxHQUFHLEVBQ0osTUFBTSxnQkFBZ0Is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RUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsUUFBUTtzQkFBakIsTUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUUyQixlQUFlO3NCQUFoRCxlQUFlO3VCQUFDLGVBQWU7Z0JBRU8sZUFBZTtzQkFBckQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkE2RHBCLE1BQU07c0JBQWhFLFlBQVk7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0hlYWRlckNlbGwgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRGYWN0b3J5LFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IElSZXN1bHRMaXN0LCBQYWdpbmcgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBmbG93LFxuICBnZXQsXG4gIGluZGV4T2YsXG4gIGlzRW1wdHksXG4gIGlzRnVuY3Rpb24sXG4gIGlzTmlsLFxuICBwYXJzZUludCBhcyBfcGFyc2VJbnQsXG4gIHVuaW9uLFxuICB1bmlxQnksXG4gIHdpdGhvdXRcbn0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Ryb3Bkb3duJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGlzT2JzZXJ2YWJsZSxcbiAgbWVyZ2UsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBwaXBlLFxuICBTdWJqZWN0LFxuICBVbmFyeUZ1bmN0aW9uXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY29uY2F0TWFwLFxuICBkZWJvdW5jZVRpbWUsXG4gIGRlbGF5LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgbWFwLFxuICBtZXJnZU1hcCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRhcFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gJy4uL2NvbW1vbi9leHRlbnNpb24taG9va3MnO1xuaW1wb3J0IHsgTG9hZE1vcmVDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vbG9hZC1tb3JlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2FkTW9yZU1vZGUgfSBmcm9tICcuLi9jb21tb24vbG9hZC1tb3JlLm1vZGVsJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICcuLi9pMThuL2dldHRleHQnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbmZpcm1CdXR0b25zLCBQb3BvdmVyQ29uZmlybUNvbXBvbmVudCB9IGZyb20gJy4uL21vZGFsL3BvcG92ZXItY29uZmlybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FpbnNpZ2h0U2VydmljZSB9IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZSc7XG5pbXBvcnQge1xuICBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50LFxuICBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlLFxuICBQUk9EVUNUX0VYUEVSSUVOQ0VfRVZFTlRfU09VUkNFXG59IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS9wcm9kdWN0LWV4cGVyaWVuY2UubW9kZWwnO1xuaW1wb3J0IHsgQ2VsbFJlbmRlcmVyU3BlYyB9IGZyb20gJy4vY29sdW1uL2NlbGwtcmVuZGVyZXInO1xuaW1wb3J0IHsgQ29sdW1uRGlyZWN0aXZlIH0gZnJvbSAnLi9jb2x1bW4vY29sdW1uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDdXN0b21Db2x1bW4gfSBmcm9tICcuL2NvbHVtbi9jdXN0b20uY29sdW1uJztcbmltcG9ydCB7IEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWMsIEZpbHRlcmluZ01vZGlmaWVyIH0gZnJvbSAnLi9jb2x1bW4vZmlsdGVyaW5nLWZvcm0tcmVuZGVyZXInO1xuaW1wb3J0IHsgQ29uZmlndXJlQ3VzdG9tQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9jb25maWd1cmUtY3VzdG9tLWNvbHVtbic7XG5pbXBvcnQge1xuICBEYXRhR3JpZENvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgREFUQV9HUklEX0NPTkZJR1VSQVRJT05fU1RSQVRFR1ksXG4gIEdyaWRDb25maWdQYXJ0LFxuICBHcmlkRXZlbnRUeXBlXG59IGZyb20gJy4vZGF0YS1ncmlkLWNvbmZpZ3VyYXRpb24ubW9kZWwnO1xuaW1wb3J0IHtcbiAgQWN0aW9uQ29udHJvbCxcbiAgQnVpbHRJbkFjdGlvblR5cGUsXG4gIEJ1bGtBY3Rpb25Db250cm9sLFxuICBDb2x1bW4sXG4gIENvbHVtbkNvbmZpZyxcbiAgQ29sdW1uRGF0YVR5cGUsXG4gIEN1c3RvbUNvbHVtbkNvbmZpZyxcbiAgRGF0YUdyaWQsXG4gIERhdGFTb3VyY2VTdGF0cyxcbiAgRGlzcGxheU9wdGlvbnMsXG4gIEZpbHRlcmluZ0FjdGlvblR5cGUsXG4gIEdyaWRDb25maWcsXG4gIEhlYWRlckFjdGlvbkNvbnRyb2wsXG4gIG1pbkNvbHVtbkdyaWRUcmFja1NpemUsXG4gIFBhZ2luYXRpb24sXG4gIHJhdGlvc0J5Q29sdW1uVHlwZXMsXG4gIFJvdyxcbiAgU2VydmVyU2lkZURhdGFDYWxsYmFjayxcbiAgU29ydE9yZGVyLFxuICBTcGVjaWFsQ29sdW1uTmFtZVxufSBmcm9tICcuL2RhdGEtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhR3JpZFNlcnZpY2UgfSBmcm9tICcuL2RhdGEtZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWREYXRhU291cmNlIH0gZnJvbSAnLi9ncmlkLWRhdGEtc291cmNlJztcbmltcG9ydCB7IFBYX0FDVElPTlMsIFBYX0VWRU5UX05BTUUgfSBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5jb25zdGFudHMnO1xuXG5lbnVtIFNvcnRpbmdPcmRlciB7XG4gIEFTQyA9ICdhc2MnLFxuICBERVNDID0gJ2Rlc2MnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtY29udGVudHMnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRhR3JpZENvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUdyaWRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBEYXRhR3JpZCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlXG57XG4gIC8qKiBUaGUgdGl0bGUgZm9yIHRoZSBkYXRhIGdyaWQsIGl0J3MgZGlzcGxheWVkIGluIHRoZSBncmlkJ3MgaGVhZGVyLiAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gZ2V0dGV4dCgnSXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZCBtb3JlIGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgbG9hZE1vcmVJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkIG1vcmUgaXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZGluZyBpbmRpY2F0b3IuICovXG4gIEBJbnB1dCgpIGxvYWRpbmdJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkaW5nIGl0ZW1z4oCmJyk7XG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGV4dCBzZWFyY2ggaW5wdXQgaXMgc2hvd24gaW4gdGhlIGdyaWQncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIHNob3dTZWFyY2ggPSBmYWxzZTtcbiAgLyoqIFRha2VzIGFuIGV2ZW50IGVtaXR0ZXIuIFdoZW4gYW4gZXZlbnQgaXMgZW1pdHRlZCwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZC4gKi9cbiAgQElucHV0KCkgcmVmcmVzaDogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgY29sdW1uczogQ29sdW1uW10gPSBbXTtcbiAgLyoqIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBncmlkLiAqL1xuICBASW5wdXQoJ2NvbHVtbnMnKVxuICBwcml2YXRlIF9jb2x1bW5zOiBDb2x1bW5bXTtcblxuICBkYXRhU291cmNlID0gbmV3IEdyaWREYXRhU291cmNlKCk7XG4gIHJvd3M6IFJvd1tdO1xuICAvKiogVGhlIGxpc3Qgb2Ygcm93cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGdyaWQgKHVzZWQgZm9yIGNsaWVudCBzaWRlIGRhdGEpLiAqL1xuICBASW5wdXQoJ3Jvd3MnKVxuICBzZXQgX3Jvd3Mocm93czogUm93W10pIHtcbiAgICB0aGlzLnJvd3MgPSByb3dzIHx8IFtdO1xuICB9XG5cbiAgZmlsdGVyaW5nTGFiZWxzUGFyYW1zID0ge1xuICAgIGZpbHRlcmVkSXRlbXNDb3VudDogMCxcbiAgICBhbGxJdGVtc0NvdW50OiAwXG4gIH07XG5cbiAgcGFnaW5hdGlvbjogUGFnaW5hdGlvbjtcbiAgcGFnaW5hdGlvbkxhYmVsUGFyYW1zID0ge1xuICAgIHBhZ2VGaXJzdEl0ZW1JZHg6IDAsXG4gICAgcGFnZUxhc3RJdGVtSWR4OiAwLFxuICAgIGl0ZW1zVG90YWw6IDBcbiAgfTtcbiAgcmVhZG9ubHkgcG9zc2libGVQYWdlU2l6ZXM6IG51bWJlcltdID0gWzI1LCA1MCwgMTAwXTtcbiAgcmVhZG9ubHkgbWluUG9zc2libGVQYWdlU2l6ZSA9IE1hdGgubWluKC4uLnRoaXMucG9zc2libGVQYWdlU2l6ZXMpO1xuICAvKiogUGFnaW5hdGlvbiBzZXR0aW5ncywgZS5nLiBhbGxvd3MgZm9yIHNldHRpbmcgY3VycmVudCBwYWdlIG9yIHBhZ2Ugc2l6ZS4gKi9cbiAgQElucHV0KCdwYWdpbmF0aW9uJylcbiAgc2V0IF9wYWdpbmF0aW9uKHBhZ2luYXRpb246IFBhZ2luYXRpb24pIHtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSBwYWdpbmF0aW9uO1xuICB9XG5cbiAgaW5maW5pdGVTY3JvbGw6IExvYWRNb3JlTW9kZTtcbiAgLyoqIFNldHMgbG9hZCBtb3JlIG1vZGUuICovXG4gIEBJbnB1dCgnaW5maW5pdGVTY3JvbGwnKVxuICBzZXQgX2luZmluaXRlU2Nyb2xsKGluZmluaXRlU2Nyb2xsOiBMb2FkTW9yZU1vZGUpIHtcbiAgICB0aGlzLmluZmluaXRlU2Nyb2xsID0gaW5maW5pdGVTY3JvbGw7XG4gIH1cblxuICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrOiBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrO1xuICAvKipcbiAgICogU2V0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBkYXRhIG5lZWRzIHRvIGJlIGxvYWRlZCBmcm9tIHNlcnZlci5cbiAgICogVGhlIGZ1bmN0aW9uIHNob3VsZCB0YWtlIFtbRGF0YVNvdXJjZU1vZGlmaWVyXV0gYW5kIHJldHVybiBbW1NlcnZlclNpZGVEYXRhUmVzdWx0XV0uXG4gICAqL1xuICBASW5wdXQoJ3NlcnZlclNpZGVEYXRhQ2FsbGJhY2snKVxuICBzZXQgX3NlcnZlclNpZGVEYXRhQ2FsbGJhY2soc2VydmVyU2lkZURhdGFDYWxsYmFjazogU2VydmVyU2lkZURhdGFDYWxsYmFjaykge1xuICAgIHRoaXMuc2VydmVyU2lkZURhdGFDYWxsYmFjayA9IHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s7XG4gIH1cblxuICBzZWxlY3RhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgaXRlbXMgY2FuIGJlIHNlbGVjdGVkIGJ5IGNsaWNraW5nIGEgY2hlY2tib3ggaW4gdGhlIGZpcnN0IGNvbHVtbi4gKi9cbiAgQElucHV0KCdzZWxlY3RhYmxlJylcbiAgc2V0IF9zZWxlY3RhYmxlKHNlbGVjdGFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNlbGVjdGFibGUgPSBzZWxlY3RhYmxlO1xuICB9XG5cbiAgc2VsZWN0aW9uUHJpbWFyeUtleTogc3RyaW5nID0gJ2lkJztcbiAgLyoqIERldGVybWluZXMgd2hpY2ggaXRlbSdzIHByb3BlcnR5IHdpbGwgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBzZWxlY3Rpb24gc3RhdHVzLiAqL1xuICBASW5wdXQoJ3NlbGVjdGlvblByaW1hcnlLZXknKVxuICBzZXQgX3NlbGVjdGlvblByaW1hcnlLZXkoc2VsZWN0aW9uUHJpbWFyeUtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5ID0gc2VsZWN0aW9uUHJpbWFyeUtleTtcbiAgfVxuXG4gIGRpc3BsYXlPcHRpb25zOiBEaXNwbGF5T3B0aW9ucyA9IHtcbiAgICBzdHJpcGVkOiB0cnVlLFxuICAgIGJvcmRlcmVkOiBmYWxzZSxcbiAgICBncmlkSGVhZGVyOiB0cnVlLFxuICAgIGZpbHRlcjogdHJ1ZVxuICB9O1xuICAvKiogU2V0cyBkaXNwbGF5IG9wdGlvbnMuICovXG4gIEBJbnB1dCgnZGlzcGxheU9wdGlvbnMnKVxuICBzZXQgX2Rpc3BsYXlPcHRpb25zKGRpc3BsYXlPcHRpb25zOiBEaXNwbGF5T3B0aW9ucykge1xuICAgIHRoaXMuZGlzcGxheU9wdGlvbnMgPSB7IC4uLnRoaXMuZGlzcGxheU9wdGlvbnMsIC4uLmRpc3BsYXlPcHRpb25zIH07XG4gIH1cblxuICBhY3Rpb25Db250cm9sczogQWN0aW9uQ29udHJvbFtdO1xuICAvKiogU2V0cyBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGl0ZW1zKS4gKi9cbiAgQElucHV0KCdhY3Rpb25Db250cm9scycpXG4gIHNldCBfYWN0aW9uQ29udHJvbHMoYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSkge1xuICAgIHRoaXMuYWN0aW9uQ29udHJvbHMgPSBhY3Rpb25Db250cm9scyB8fCBbXTtcbiAgfVxuXG4gIGJ1bGtBY3Rpb25Db250cm9sczogQnVsa0FjdGlvbkNvbnRyb2xbXTtcbiAgLyoqIFNldHMgYnVsayBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpdGVtcyBzZWxlY3RlZCBieSB1c2VyKS4gKi9cbiAgQElucHV0KCdidWxrQWN0aW9uQ29udHJvbHMnKVxuICBzZXQgX2J1bGtBY3Rpb25Db250cm9scyhidWxrQWN0aW9uQ29udHJvbHM6IEJ1bGtBY3Rpb25Db250cm9sW10pIHtcbiAgICB0aGlzLmJ1bGtBY3Rpb25Db250cm9scyA9IGJ1bGtBY3Rpb25Db250cm9scyB8fCBbXTtcbiAgfVxuXG4gIGhlYWRlckFjdGlvbkNvbnRyb2xzOiBIZWFkZXJBY3Rpb25Db250cm9sW107XG4gIC8qKiBTZXRzIGhlYWRlciBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZyb20gZGF0YSBncmlkIGhlYWRlcikuICovXG4gIEBJbnB1dCgnaGVhZGVyQWN0aW9uQ29udHJvbHMnKVxuICBzZXQgX2hlYWRlckFjdGlvbkNvbnRyb2xzKGhlYWRlckFjdGlvbkNvbnRyb2xzOiBIZWFkZXJBY3Rpb25Db250cm9sW10pIHtcbiAgICB0aGlzLmhlYWRlckFjdGlvbkNvbnRyb2xzID0gaGVhZGVyQWN0aW9uQ29udHJvbHMgfHwgW107XG4gIH1cblxuICAvKiogU2V0cyBpbml0aWFsIHNlYXJjaCB0ZXh0LiAqL1xuICBASW5wdXQoKVxuICBzZWFyY2hUZXh0OiBzdHJpbmcgPSAnJztcblxuICAvKiogRGV0ZXJtaW5lcyBpZiBjdXN0b20gY29sdW1ucyBidXR0b24gd2lsbCBiZSBlbmFibGVkLiAqL1xuICBASW5wdXQoKVxuICBjb25maWd1cmVDb2x1bW5zRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqIFNob3dzIHRoZSB3YXJuaW5nIGZvciB0aGUgc3ViLWFzc2V0cyBjb3VudGVyICovXG4gIEBJbnB1dCgpXG4gIHNob3dDb3VudGVyV2FybmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIG1vdXNlIGlzIG92ZXIgYSByb3cuICovXG4gIEBPdXRwdXQoKSByb3dNb3VzZU92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gbW91c2UgbGVhdmVzIGEgcm93LiAqL1xuICBAT3V0cHV0KCkgcm93TW91c2VMZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIHJvdyBpcyBjbGlja2VkLiAqL1xuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gZ3JpZCdzIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZC4gKi9cbiAgQE91dHB1dCgpIG9uQ29uZmlnQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYmVmb3JlIHRoZSBmaWx0ZXIgaXMgYXBwbGllZC4gKi9cbiAgQE91dHB1dCgpIG9uQmVmb3JlRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCBiZWZvcmUgdGhlIHNlYXJjaCBpcyBwZXJmb3JtZWQuICovXG4gIEBPdXRwdXQoKSBvbkJlZm9yZVNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGZpbHRlciBpcyBhcHBsaWVkIGluIGEgY29sdW1uLiAqL1xuICBAT3V0cHV0KCkgb25GaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBjb2x1bW5OYW1lPzogc3RyaW5nO1xuICAgIGRyb3Bkb3duPzogYW55O1xuICAgIGZpbHRlcmluZ01vZGlmaWVyPzogYW55O1xuICB9PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBpdGVtcyBzZWxlY3Rpb24gY2hhbmdlcy4gVGhlIGFycmF5IGNvbnRhaW5zIGtleXMgb2Ygc2VsZWN0ZWQgaXRlbXMgKGtleSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGJ5IGBzZWxlY3Rpb25QcmltYXJ5S2V5YCkuICovXG4gIEBPdXRwdXQoKSBpdGVtc1NlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIHJlbG9hZCBidXR0b24gaXMgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIG9uUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGN1c3RvbSBjb2x1bW4gaXMgYWRkZWQgKi9cbiAgQE91dHB1dCgpIG9uQWRkQ3VzdG9tQ29sdW1uID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21Db2x1bW5Db25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGEgY3VzdG9tIGNvbHVtbiBpcyByZW1vdmVkICovXG4gIEBPdXRwdXQoKSBvblJlbW92ZUN1c3RvbUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYWZ0ZXIgdGhlIGNvbHVtbiBmaWx0ZXIgaGFzIGJlZW4gcmVzZXQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uRmlsdGVyUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbj4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIHNvcnRpbmcgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25Tb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBwYWdlIHNpemUgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25QYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIG9yZGVyIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uUmVvcmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBjb2x1bW4gb3JkZXIgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQ29sdW1uRGlyZWN0aXZlKSBjb2x1bW5SZW5kZXJlcnM6IFF1ZXJ5TGlzdDxDb2x1bW5EaXJlY3RpdmU+O1xuXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbCcsIHsgc3RhdGljOiB0cnVlIH0pIHNjcm9sbENvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdpbmZpbml0ZVNjcm9sbENvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBpbmZpbml0ZVNjcm9sbENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcblxuICBsb2FkTW9yZUNvbXBvbmVudDogTG9hZE1vcmVDb21wb25lbnQ7XG5cbiAgY29sdW1uTmFtZXMgPSBbXTtcblxuICBzdHlsZXMgPSB7XG4gICAgdGFibGVDdXJzb3I6ICdhdXRvJyxcbiAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiB1bmRlZmluZWQsXG4gICAgZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uOiB1bmRlZmluZWRcbiAgfTtcblxuICBzZWFyY2hUZXh0JCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBmaWx0ZXJpbmdBcHBsaWVkID0gZmFsc2U7XG5cbiAgdG90YWxQYWdlc0NvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihJbmZpbml0eSk7XG4gIGhpZGVQYWdpbmF0aW9uJCA9IHRoaXMudG90YWxQYWdlc0NvdW50JC5waXBlKFxuICAgIG1hcCh0b3RhbFBhZ2VzQ291bnQgPT4gdG90YWxQYWdlc0NvdW50IDw9IDEpLFxuICAgIGRlbGF5KDApIC8vIHByZXZlbnRzIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgKTtcblxuICBzZWxlY3RlZEl0ZW1JZHM6IHN0cmluZ1tdID0gW107XG4gIGN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgYWxsU2VsZWN0ZWQ6IGZhbHNlLFxuICAgIGFsbERlc2VsZWN0ZWQ6IHRydWVcbiAgfTtcblxuICBidWlsdEluQWN0aW9uVHlwZSA9IHtcbiAgICBFZGl0OiBCdWlsdEluQWN0aW9uVHlwZS5FZGl0LFxuICAgIERlbGV0ZTogQnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlLFxuICAgIEV4cG9ydDogQnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XG4gIH07XG5cbiAgY29uZmlybVJlbW92ZUNvbHVtbkJ1dHRvbnM6IFBvcG92ZXJDb25maXJtQnV0dG9uc1tdID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBnZXR0ZXh0KCdDYW5jZWwnKSxcbiAgICAgIGFjdGlvbjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ1JlbW92ZWBjb2x1bW4sdmVyYmAnKSxcbiAgICAgIHN0YXR1czogJ2RhbmdlcicsXG4gICAgICBhY3Rpb246ICgpID0+IFByb21pc2UucmVzb2x2ZSh0cnVlKVxuICAgIH1cbiAgXTtcblxuICBpc0NvbmZpZ0NvbnRleHRLbm93biA9IGZhbHNlO1xuXG4gIC8qKiBQcm9kdWN0IGV4cGVyaWVuY2UgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyAqL1xuICBwcm9kdWN0RXhwZXJpZW5jZUV2ZW50OiBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50ID0geyBldmVudE5hbWU6IFBYX0VWRU5UX05BTUUgfTtcbiAgUFhfQUNUSU9OUyA9IFBYX0FDVElPTlM7XG5cbiAgcmVhZG9ubHkgc29ydENvbHVtblRpdGxlID0gZ2V0dGV4dCgnU29ydCBjb2x1bW4gXCJ7eyBuYW1lIH19XCInKTtcblxuICByZXNpemVIYW5kbGVNb3VzZURvd24kID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIHJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcHJpdmF0ZSBoZWFkZXJCZWluZ1Jlc2l6ZWQ6IHtcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmc7XG4gICAgZWw6IEhUTUxFbGVtZW50O1xuICB9O1xuICBAVmlld0NoaWxkcmVuKENka0hlYWRlckNlbGwsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwcml2YXRlIHRoUmVmczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBwcml2YXRlIHRoRWxzOiBIVE1MRWxlbWVudFtdO1xuXG4gIHByaXZhdGUgcmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudDogYm9vbGVhbjtcblxuICBwcml2YXRlIGNvbHVtbnNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZGVmYXVsdENvbHVtbnM6IENvbHVtbltdID0gW107XG5cbiAgcHJpdmF0ZSByZWxvYWRDb25maWd1cmF0aW9uJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBTRUFSQ0hfREVCT1VOQ0VfVElNRSA9IDUwMDtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlciwgdGFraW5nIGJvb2xlYW4gdmFsdWVzIHVzZWQgZm9yIGxvYWRpbmcgZGF0YSBncmlkIGRhdGEgd2l0aCBkZWJvdW5jZS5cbiAgICogRGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UuIFNldCB0byB0cnVlIGlmIGRhdGEgZ3JpZCBpcyB1c2luZyBpbmZpbml0ZSBzY3JvbGwgYW5kIHBhZ2Ugc2hvdWxkIGJlIHJlbG9hZGVkLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIG11bHRpcGxlIHRoaXMubG9hZERhdGEoKSBmdW5jdGlvbiBjYWxscy5cbiAgICovXG4gIHByaXZhdGUgdHJpZ2dlckxvYWREYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSlcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvblN0cmF0ZWd5OiBEYXRhR3JpZENvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgICBwcml2YXRlIGRhdGFHcmlkU2VydmljZTogRGF0YUdyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBic01vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZVxuICApIHtcbiAgICB0aGlzLnRyaWdnZXJMb2FkRGF0YS5waXBlKGRlYm91bmNlVGltZSgxKSwgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKHJlbG9hZCA9PiB7XG4gICAgICB0aGlzLmxvYWREYXRhKHJlbG9hZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb24kXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb25maWckKCkgPz8gb2YobnVsbCkpLFxuICAgICAgICB0YXAoY29uZmlnID0+IHtcbiAgICAgICAgICB0aGlzLnNldENvbHVtbnMoY29uZmlnKTtcbiAgICAgICAgICB0aGlzLnNldFBhZ2VTaXplKGNvbmZpZyk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdCghIXRoaXMuaW5maW5pdGVTY3JvbGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZGF0YVNvdXJjZS5zdGF0cyQpLFxuICAgICAgICB0YXAoc3RhdHMgPT4ge1xuICAgICAgICAgIHRoaXMuY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nTGFiZWxzUGFyYW1zKHN0YXRzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25MYWJlbFBhcmFtcyhzdGF0cyk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmlzQ29uZmlnQ29udGV4dEtub3duID0gISF0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneT8uaXNDb250ZXh0S25vd24oKTtcblxuICAgIHRoaXMuc2VhcmNoVGV4dCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5TRUFSQ0hfREVCT1VOQ0VfVElNRSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRhcChzZWFyY2hUZXh0ID0+IHtcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xuICAgICAgICAgIHRoaXMub25CZWZvcmVTZWFyY2guZW1pdCh0aGlzLnNlYXJjaFRleHQpO1xuICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5TRUFSQ0gsXG4gICAgICAgICAgICBzZWFyY2hJbnB1dDogc2VhcmNoVGV4dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgIGNvbWJpbmVMYXRlc3QodGhpcy5kYXRhU291cmNlLmRhdGEkLCB0aGlzLml0ZW1zU2VsZWN0LmFzT2JzZXJ2YWJsZSgpKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuICAgICAgICAuc3Vic2NyaWJlKChbZGF0YV0pID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZUVtcHR5ID0gZGF0YS5sZW5ndGggPT09IDA7XG5cbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgICAgICAgICBhbGxTZWxlY3RlZDogY3VycmVudFBhZ2VFbXB0eSA/IGZhbHNlIDogZGF0YS5ldmVyeShpdGVtID0+IHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSkpLFxuICAgICAgICAgICAgYWxsRGVzZWxlY3RlZDogY3VycmVudFBhZ2VFbXB0eSA/IHRydWUgOiBkYXRhLmV2ZXJ5KGl0ZW0gPT4gIXRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSkpXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uJC5uZXh0KCk7XG5cbiAgICBpZiAodGhpcy5yZWZyZXNoKSB7XG4gICAgICB0aGlzLnJlZnJlc2gucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9jZXNzQW5kUGVyc2lzdENvbmZpZ0NoYW5nZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoZXZlbnQpIHtcbiAgICBpZiAoXG4gICAgICAoKCFldmVudC5fYWN0aW9uQ29udHJvbHMgJiYgIWV2ZW50LnNlYXJjaFRleHQpIHx8IGV2ZW50Ll9hY3Rpb25Db250cm9scz8uZmlyc3RDaGFuZ2UpICYmXG4gICAgICB0aGlzLmNvbHVtbnNJbml0aWFsaXplZFxuICAgICkge1xuICAgICAgY29uc3QgcmVsb2FkID0gISFldmVudC5faW5maW5pdGVTY3JvbGw/LmN1cnJlbnRWYWx1ZSAmJiAhZXZlbnQuX2luZmluaXRlU2Nyb2xsPy5maXJzdENoYW5nZTtcbiAgICAgIHRoaXMudHJpZ2dlckxvYWREYXRhLmVtaXQocmVsb2FkKTtcbiAgICB9XG4gICAgaWYgKCEhZXZlbnQuX2NvbHVtbnMgJiYgIWV2ZW50Ll9jb2x1bW5zLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb24kLm5leHQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgICB0aGlzLnVwZGF0ZVRoRWxzKCk7XG4gICAgdGhpcy5zZXR1cFJlc2l6ZUhhbmRsZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBzZXRDb2x1bW5zKGNvbmZpZzogR3JpZENvbmZpZykge1xuICAgIGlmICghIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5ICYmICFpc0VtcHR5KHRoaXMuX2NvbHVtbnMpKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRhdGFHcmlkU2VydmljZS5hcHBseUNvbmZpZ1RvQ29sdW1ucyhjb25maWcsIHRoaXMuX2NvbHVtbnMpO1xuICAgICAgdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLl9jb2x1bW5zIHx8IFtdO1xuICAgICAgdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgPSB0aGlzLmNvbHVtbnNJbml0aWFsaXplZCB8fCAhIXRoaXMuX2NvbHVtbnM7XG4gICAgfVxuXG4gICAgdGhpcy5kZWZhdWx0Q29sdW1ucyA9IHRoaXMuY29sdW1ucyB8fCBbXTtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIHNldFBhZ2VTaXplKGNvbmZpZzogR3JpZENvbmZpZykge1xuICAgIGlmICghIWNvbmZpZz8ucGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0ge1xuICAgICAgICAuLi50aGlzLnBhZ2luYXRpb24sXG4gICAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IGdldCh0aGlzLnBhZ2luYXRpb24sICdwYWdlU2l6ZScpO1xuICAgIGlmIChcbiAgICAgIHRoaXMucGFnaW5hdGlvbiAmJlxuICAgICAgIXRoaXMucG9zc2libGVQYWdlU2l6ZXMuZmluZChwb3NzaWJsZVBhZ2VTaXplID0+IHBvc3NpYmxlUGFnZVNpemUgPT09IHBhZ2VTaXplKVxuICAgICkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIHBhZ2VTaXplOiB0aGlzLm1pblBvc3NpYmxlUGFnZVNpemUgfTtcbiAgICB9XG4gIH1cblxuICBvcGVuQ3VzdG9tQ29sdW1uTW9kYWwoKTogdm9pZCB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coQ29uZmlndXJlQ3VzdG9tQ29sdW1uQ29tcG9uZW50LCB7XG4gICAgICBjbGFzczogJ21vZGFsLXNtJyxcbiAgICAgIGFyaWFEZXNjcmliZWRieTogJ21vZGFsLWJvZHknLFxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdtb2RhbC10aXRsZScsXG4gICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlLFxuICAgICAgaW5pdGlhbFN0YXRlOiB7XG4gICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1uc1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbW9kYWxSZWYuY29udGVudC5vbkFkZEN1c3RvbUNvbHVtblxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoY3VzdG9tQ29sdW1uQ29uZmlnOiBDdXN0b21Db2x1bW5Db25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA9IHRoaXMuY29sdW1ucy5pbmRleE9mKFxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5wb3NpdGlvbkZpeGVkKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZShcbiAgICAgICAgICAgIGZpcnN0Rml4ZWRDb2x1bVBvc2l0aW9uID4gLTEgPyBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA6IHRoaXMuY29sdW1ucy5sZW5ndGgsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgbmV3IEN1c3RvbUNvbHVtbihjdXN0b21Db2x1bW5Db25maWcpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQUREX0NVU1RPTV9DT0xVTU4sXG4gICAgICAgICAgICBjb2x1bW46IGN1c3RvbUNvbHVtbkNvbmZpZy5oZWFkZXIgfHwgY3VzdG9tQ29sdW1uQ29uZmlnLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbChtb2RhbFJlZi5vbkhpZGRlbilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5vbkFkZEN1c3RvbUNvbHVtbi5lbWl0KGV2ZW50KSk7XG4gIH1cblxuICBhc3luYyByZW1vdmVDdXN0b21Db2x1bW4oXG4gICAgcG9Db25maXJtOiBQb3BvdmVyQ29uZmlybUNvbXBvbmVudCxcbiAgICBjb2x1bW46IENvbHVtbixcbiAgICBkZENvbmZpZ3VyZUNvbHVtbnM6IEJzRHJvcGRvd25EaXJlY3RpdmVcbiAgKSB7XG4gICAgZGRDb25maWd1cmVDb2x1bW5zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICAgIHBvQ29uZmlybS5tZXNzYWdlID0gZ2V0dGV4dCgnRG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgY29sdW1uPycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW1vdmU6IGJvb2xlYW4gPSBhd2FpdCBwb0NvbmZpcm0uc2hvdyh0aGlzLmNvbmZpcm1SZW1vdmVDb2x1bW5CdXR0b25zKTtcbiAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sPy5uYW1lICE9PSBjb2x1bW4/Lm5hbWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5vblJlbW92ZUN1c3RvbUNvbHVtbi5lbWl0KGNvbHVtbik7XG4gICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuUkVNT1ZFX0NVU1RPTV9DT0xVTU4sXG4gICAgICAgICAgY29sdW1uOiBjb2x1bW4uaGVhZGVyIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiAoZGRDb25maWd1cmVDb2x1bW5zLmF1dG9DbG9zZSA9IHRydWUpLCAwKTtcbiAgfVxuXG4gIHRyYWNrQnlOYW1lKGluZGV4LCBpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0ubmFtZTtcbiAgfVxuXG4gIHJlc29sdmVDZWxsVmFsdWUocm93LCBwYXRoKSB7XG4gICAgcmV0dXJuIGZsb3coW1xuICAgICAgeCA9PiB0aGlzLmRhdGFTb3VyY2UucmVzb2x2ZVZhbHVlKHgsIHBhdGgpLFxuICAgICAgdGhpcy5kYXRhU291cmNlLnJlc29sdmVGdW5jdGlvbixcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5ub3JtYWxpemVOaWxcbiAgICBdKShyb3cpO1xuICB9XG5cbiAgY2hhbmdlU29ydE9yZGVyKGNvbHVtbk5hbWUpIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IGNvbHVtbk5hbWUpO1xuXG4gICAgaWYgKGNvbHVtbikge1xuICAgICAgY29uc3QgeyBzb3J0T3JkZXIgfSA9IGNvbHVtbjtcblxuICAgICAgaWYgKCFzb3J0T3JkZXIpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgU29ydGluZ09yZGVyLkFTQyk7XG4gICAgICB9IGVsc2UgaWYgKHNvcnRPcmRlciA9PT0gU29ydGluZ09yZGVyLkFTQykge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnRpbmcoW2NvbHVtbk5hbWVdLCBTb3J0aW5nT3JkZXIuREVTQyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnRpbmcoW2NvbHVtbk5hbWVdLCAnJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlU29ydGluZyhjb2x1bW5OYW1lczogc3RyaW5nW10sIHNvcnRPcmRlcjogU29ydE9yZGVyKSB7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9TT1JUSU5HX09SREVSLFxuICAgICAgY29sdW1uczogY29sdW1uTmFtZXMsXG4gICAgICBzb3J0T3JkZXI6IHNvcnRPcmRlciA9PT0gJycgPyAnbm9uZScgOiBzb3J0T3JkZXJcbiAgICB9KTtcblxuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbik6IENvbHVtbiA9PiB7XG4gICAgICBpZiAoY29sdW1uTmFtZXMuaW5jbHVkZXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmNvbHVtbiwgc29ydE9yZGVyIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfSk7XG4gICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlKCdzb3J0Jyk7XG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyKGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllcikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5BUFBMWV9GSUxURVIsXG4gICAgICBjb2x1bW46IGNvbHVtbk5hbWUsXG4gICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgIH0pO1xuICAgIHRoaXMub25CZWZvcmVGaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllciB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHtcbiAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXIsXG4gICAgICBwYXlsb2FkOiB7IGZpbHRlcmluZ01vZGlmaWVyIH1cbiAgICB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24sIGZpbHRlcmluZ01vZGlmaWVyIH0pO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXIoY29sdW1uTmFtZSwgZHJvcGRvd24pIHtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5SRVNFVF9GSUxURVIsIGNvbHVtbjogY29sdW1uTmFtZSB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHsgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlciB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24gfSk7XG4gIH1cblxuICBjbGVhckZpbHRlcnMocmVsb2FkID0gdHJ1ZSkge1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFxuICAgICAgdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpLFxuICAgICAge1xuICAgICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLlJlc2V0RmlsdGVyXG4gICAgICB9LFxuICAgICAgcmVsb2FkXG4gICAgKTtcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoe30pO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLkNMRUFSX0ZJTFRFUiB9KTtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcmluZyhcbiAgICBjb2x1bW5OYW1lczogc3RyaW5nW10sXG4gICAgYWN0aW9uOiB7XG4gICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlO1xuICAgICAgcGF5bG9hZD86IHsgZmlsdGVyaW5nTW9kaWZpZXI6IEZpbHRlcmluZ01vZGlmaWVyIH07XG4gICAgfSxcbiAgICByZWxvYWQgPSB0cnVlXG4gICkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgIGlmIChjb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgLi4uKGFjdGlvbi50eXBlID09PSBGaWx0ZXJpbmdBY3Rpb25UeXBlLkFwcGx5RmlsdGVyXG4gICAgICAgICAgICA/IGFjdGlvbi5wYXlsb2FkLmZpbHRlcmluZ01vZGlmaWVyXG4gICAgICAgICAgICA6IHRoaXMub25SZXNldEZpbHRlckFjdGlvbihjb2x1bW4pKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpO1xuICAgIGlmIChyZWxvYWQpIHtcbiAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpIHtcbiAgICB0aGlzLmZpbHRlcmluZ0FwcGxpZWQgPSB0aGlzLmNvbHVtbnMuc29tZSh0aGlzLmlzQ29sdW1uRmlsdGVyaW5nQXBwbGllZCk7XG4gIH1cblxuICBpc0NvbHVtbkZpbHRlcmluZ0FwcGxpZWQoY29sdW1uOiBDb2x1bW4pOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGZpbHRlcmFibGUsIGZpbHRlclByZWRpY2F0ZSwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9ID0gY29sdW1uO1xuXG4gICAgcmV0dXJuICEhKGZpbHRlcmFibGUgJiYgKGZpbHRlclByZWRpY2F0ZSB8fCBleHRlcm5hbEZpbHRlclF1ZXJ5KSk7XG4gIH1cblxuICB1cGRhdGVQYWdpbmF0aW9uKHsgaXRlbXNQZXJQYWdlLCBwYWdlIH0pIHtcbiAgICBjb25zdCBjb25maWdDaGFuZ2VkID0gdGhpcy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSAhPT0gaXRlbXNQZXJQYWdlO1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBwYWdlU2l6ZTogaXRlbXNQZXJQYWdlLCBjdXJyZW50UGFnZTogcGFnZSB9O1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICBpZiAoY29uZmlnQ2hhbmdlZCkge1xuICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlKCdwYWdpbmF0aW9uJyk7XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9QQUdJTkFUSU9OLCBpdGVtc1BlclBhZ2UsIHBhZ2UgfSk7XG4gIH1cblxuICBjbGlja1JlbG9hZCgpIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLnJlbG9hZCgpO1xuICAgIHRoaXMub25SZWxvYWQubmV4dCgpO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLlJFTE9BRCB9KTtcbiAgfVxuXG4gIHJlbG9hZCgpIHtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgY3VycmVudFBhZ2U6IDEgfTtcbiAgICB0aGlzLnJlY3JlYXRlTG9hZE1vcmVDb21wb25lbnQgPSB0cnVlO1xuICAgIHRoaXMubG9hZERhdGEodHJ1ZSk7XG4gICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICB9XG5cbiAgbG9hZE5leHRQYWdlKCk6IFByb21pc2U8SVJlc3VsdExpc3Q8b2JqZWN0Pj4ge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBjdXJyZW50UGFnZTogdGhpcy5wYWdpbmF0aW9uLm5leHRQYWdlIH07XG5cbiAgICB0aGlzLmxvYWREYXRhKCk7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLnJlc3VsdExpc3QkXG4gICAgICAucGlwZSh0YWtlKDEpKSAvLyBpbiBvcmRlciBmb3IgYHRvUHJvbWlzZWAgdG8gd29yaywgdGhlIG9ic2VydmFibGUgbmVlZHMgdG8gY29tcGxldGVcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgcGFnaW5nOiB7XG4gICAgICAgICAgICAuLi5yZXN1bHQucGFnaW5nLFxuICAgICAgICAgICAgbmV4dDogdGhpcy5sb2FkTmV4dFBhZ2UuYmluZCh0aGlzKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJUmVzdWx0TGlzdDxvYmplY3Q+O1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRDZWxsUmVuZGVyZXJTcGVjKHsgdmFsdWUsIHJvdywgY29sdW1uTmFtZSB9KTogQ2VsbFJlbmRlcmVyU3BlYyB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENlbGxSZW5kZXJlclNwZWMoeyB0eXBlOiAnQ0VMTCcsIHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk7XG4gIH1cblxuICBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjKHsgdmFsdWUsIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIHJldHVybiB0aGlzLl9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZTogJ0hFQURFUicsIHZhbHVlLCByb3c6IHVuZGVmaW5lZCwgY29sdW1uTmFtZSB9KTtcbiAgfVxuXG4gIGdldEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWMoeyBjb2x1bW4sIGRyb3Bkb3duIH0pOiBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVuZGVyZXI6XG4gICAgICAgIGdldCh0aGlzLmdldENvbHVtblJlbmRlcmVyKGNvbHVtbiksICdmaWx0ZXJpbmdGb3JtUmVuZGVyZXJEZWYudGVtcGxhdGUnKSB8fFxuICAgICAgICBjb2x1bW4uZmlsdGVyaW5nRm9ybVJlbmRlcmVyQ29tcG9uZW50LFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBwcm9wZXJ0eTogY29sdW1uLFxuICAgICAgICBhcHBseUZpbHRlcjogdGhpcy5hcHBseUZpbHRlci5iaW5kKHRoaXMsIGNvbHVtbi5uYW1lLCBkcm9wZG93biksXG4gICAgICAgIHJlc2V0RmlsdGVyOiB0aGlzLnJlc2V0RmlsdGVyLmJpbmQodGhpcywgY29sdW1uLm5hbWUsIGRyb3Bkb3duKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXRBbGxJdGVtc1NlbGVjdGVkKHNlbGVjdGVkKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnNlbGVjdGlvbiRcbiAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZpbHRlcmVkRGF0YUlkcyB9KSA9PiB0aGlzLnNldEl0ZW1zU2VsZWN0ZWQoZmlsdGVyZWREYXRhSWRzLCBzZWxlY3RlZCkpO1xuICB9XG5cbiAgc2V0QWxsSXRlbXNJbkN1cnJlbnRQYWdlU2VsZWN0ZWQoc2VsZWN0ZWQpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnNldEl0ZW1zU2VsZWN0ZWQoZGF0YSwgc2VsZWN0ZWQpKTtcbiAgfVxuXG4gIHNldEl0ZW1zU2VsZWN0ZWQoaXRlbXM6IGFueVtdLCBzZWxlY3RlZCkge1xuICAgIGNvbnN0IGl0ZW1JZHMgPSBpdGVtcy5tYXAoKGl0ZW06IG9iamVjdCB8IHN0cmluZykgPT5cbiAgICAgIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyA/IGl0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XSA6IGl0ZW1cbiAgICApO1xuXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1JZHMgPSBzZWxlY3RlZFxuICAgICAgPyB1bmlvbih0aGlzLnNlbGVjdGVkSXRlbUlkcywgaXRlbUlkcylcbiAgICAgIDogd2l0aG91dCh0aGlzLnNlbGVjdGVkSXRlbUlkcywgLi4uaXRlbUlkcyk7XG4gICAgdGhpcy5pdGVtc1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzKTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IFtdO1xuICAgIHRoaXMuaXRlbXNTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbUlkcyk7XG4gIH1cblxuICBpc0l0ZW1TZWxlY3RlZChpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtSWRzLmluY2x1ZGVzKGl0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XSk7XG4gIH1cblxuICBvbkNvbHVtbkRyb3AoeyBwcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXggfSkge1xuICAgIGNvbnN0IGRpZmZlcmVudEluZGV4ID0gcHJldmlvdXNJbmRleCAhPT0gY3VycmVudEluZGV4O1xuXG4gICAgaWYgKGRpZmZlcmVudEluZGV4KSB7XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU9SREVSX0NPTFVNTlMsXG4gICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW5OYW1lc1twcmV2aW91c0luZGV4XVxuICAgICAgfSk7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuc3BsaWNlKHByZXZpb3VzSW5kZXgsIDEpO1xuICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZShjdXJyZW50SW5kZXgsIDAsIGNvbHVtblswXSk7XG4gICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoJ3Jlb3JkZXJDb2x1bW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKCk7XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpIHtcbiAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxuICAgICAgICB0aGlzLmNvbHVtbnNcbiAgICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4udmlzaWJsZSlcbiAgICAgICAgICAubWFwKCh7IGdyaWRUcmFja1NpemUgfSkgPT4gZ3JpZFRyYWNrU2l6ZSlcbiAgICAgICAgICAuam9pbignICcpXG4gICAgICApLFxuICAgICAgZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uOiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXG4gICAgICAgIGAxIC8gc3BhbiAke3RoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5sZW5ndGh9YFxuICAgICAgKVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVUaEVscygpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGhFbHMgPSB0aGlzLnRoUmVmc1xuICAgICAgICA/IHRoaXMudGhSZWZzLnRvQXJyYXkoKS5tYXAoKHsgbmF0aXZlRWxlbWVudCB9KSA9PiBuYXRpdmVFbGVtZW50KVxuICAgICAgICA6IFtdO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8gVG8gYmUgcmVtb3ZlZCB3aGVuIGNvbHVtbnMgYXJlIHRyYW5zZm9ybWVkIHRvIG9ic2VydmFibGVzLlxuICBpc0Ryb3BEb3duUGxhY2VkUmlnaHQoY29sdW1uOiBDb2x1bW4pIHtcbiAgICByZXR1cm4gKFxuICAgICAgaW5kZXhPZihcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSksXG4gICAgICAgIGNvbHVtblxuICAgICAgKSA+XG4gICAgICB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlKS5sZW5ndGggLyAyXG4gICAgKTtcbiAgfVxuXG4gIGVtaXRDb25maWdDaGFuZ2UoZXZlbnRUeXBlPzogR3JpZEV2ZW50VHlwZSkge1xuICAgIGlmICh0aGlzLmNvbHVtbnNJbml0aWFsaXplZCkge1xuICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAodGhpcy5tYXBDb2x1bW5Ub0NvbmZpZy5iaW5kKHRoaXMpKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHsgY29sdW1ucywgcGFnaW5hdGlvbjogdGhpcy5wYWdpbmF0aW9uIH07XG4gICAgICB0aGlzLm9uQ29uZmlnQ2hhbmdlLmVtaXQoY29uZmlnKTtcbiAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3NvcnQnOlxuICAgICAgICAgIHRoaXMub25Tb3J0LmVtaXQoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGFnaW5hdGlvbic6XG4gICAgICAgICAgdGhpcy5vblBhZ2VTaXplQ2hhbmdlLmVtaXQoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVvcmRlckNvbHVtbic6XG4gICAgICAgICAgdGhpcy5vbkNvbHVtblJlb3JkZXJlZC5lbWl0KGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NoYW5nZUNvbHVtblZpc2liaWxpdHknOlxuICAgICAgICAgIHRoaXMub25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlLmVtaXQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyRXZlbnQoZXZlbnREYXRhKSB7XG4gICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudCh0aGlzLnByb2R1Y3RFeHBlcmllbmNlRXZlbnQ/LmV2ZW50TmFtZSB8fCBQWF9FVkVOVF9OQU1FLCB7XG4gICAgICAuLi50aGlzLnByb2R1Y3RFeHBlcmllbmNlRXZlbnQ/LmRhdGEsXG4gICAgICAuLi5ldmVudERhdGFcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZXNldEZpbHRlckFjdGlvbihjb2x1bW46IENvbHVtbikge1xuICAgIHRoaXMub25Db2x1bW5GaWx0ZXJSZXNldC5lbWl0KGNvbHVtbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlclByZWRpY2F0ZTogdW5kZWZpbmVkLFxuICAgICAgZXh0ZXJuYWxGaWx0ZXJRdWVyeTogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwQ29sdW1uVG9Db25maWcoY29sdW1uOiBDb2x1bW4pOiBDb2x1bW5Db25maWcgfCBDdXN0b21Db2x1bW5Db25maWcge1xuICAgIGxldCBjb25maWc7XG4gICAgaWYgKGNvbHVtbi5jdXN0b20pIHtcbiAgICAgIGNvbnN0IHsgdmlzaWJsZSwgc29ydE9yZGVyLCBuYW1lLCBleHRlcm5hbEZpbHRlclF1ZXJ5LCBoZWFkZXIsIHBhdGggfSA9IGNvbHVtbjtcbiAgICAgIGNvbmZpZyA9IHtcbiAgICAgICAgdmlzaWJsZSxcbiAgICAgICAgc29ydE9yZGVyLFxuICAgICAgICBuYW1lLFxuICAgICAgICBmaWx0ZXI6IHsgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9LFxuICAgICAgICBoZWFkZXIsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGN1c3RvbTogdHJ1ZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyB2aXNpYmxlLCBzb3J0T3JkZXIsIG5hbWUsIGV4dGVybmFsRmlsdGVyUXVlcnkgfSA9IGNvbHVtbjtcbiAgICAgIGNvbmZpZyA9IHsgdmlzaWJsZSwgc29ydE9yZGVyLCBuYW1lLCBmaWx0ZXI6IHsgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9IH07XG4gICAgfVxuXG4gICAgaWYgKGlzRW1wdHkoY29uZmlnPy5maWx0ZXI/LmV4dGVybmFsRmlsdGVyUXVlcnkpKSB7XG4gICAgICBkZWxldGUgY29uZmlnLmZpbHRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGF0YShyZWxvYWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJvd3MsXG4gICAgICBjb2x1bW5zLFxuICAgICAgcGFnaW5hdGlvbixcbiAgICAgIHNlYXJjaFRleHQsXG4gICAgICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICAgICAgc2VsZWN0YWJsZSxcbiAgICAgIHNlbGVjdGlvblByaW1hcnlLZXksXG4gICAgICBpbmZpbml0ZVNjcm9sbFxuICAgIH0gPSB0aGlzO1xuXG4gICAgdGhpcy5kYXRhU291cmNlLmxvYWREYXRhKHtcbiAgICAgIHJvd3MsXG4gICAgICBjb2x1bW5zLFxuICAgICAgcGFnaW5hdGlvbixcbiAgICAgIHNlYXJjaFRleHQsXG4gICAgICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICAgICAgc2VsZWN0YWJsZSxcbiAgICAgIHNlbGVjdGlvblByaW1hcnlLZXksXG4gICAgICBpbmZpbml0ZVNjcm9sbCxcbiAgICAgIHJlbG9hZFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zKCkge1xuICAgIGNvbnN0IHNwZWNpYWxDb2x1bW4gPSB7XG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwb3NpdGlvbkZpeGVkOiB0cnVlXG4gICAgfTtcbiAgICBjb25zdCBjaGVja2JveENvbHVtbiA9IHRoaXMuc2VsZWN0YWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3BlY2lhbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBTcGVjaWFsQ29sdW1uTmFtZS5DaGVja2JveCxcbiAgICAgICAgICBncmlkVHJhY2tTaXplOiAnMzJweCdcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWN0aW9uc0NvbHVtbiA9XG4gICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzPy5sZW5ndGggPiAwXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uc3BlY2lhbENvbHVtbixcbiAgICAgICAgICAgIG5hbWU6IFNwZWNpYWxDb2x1bW5OYW1lLkFjdGlvbnMsXG4gICAgICAgICAgICBncmlkVHJhY2tTaXplOiB0aGlzLmFjdGlvbkNvbnRyb2xzLmxlbmd0aCA+IDIgPyAnNTZweCcgOiAnbWlubWF4KDQwcHgsIGF1dG8pJ1xuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjb2x1bW5zID0gW2NoZWNrYm94Q29sdW1uLCAuLi50aGlzLmNvbHVtbnMsIGFjdGlvbnNDb2x1bW5dXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKHRoaXMud2l0aENvbHVtbkRlZmF1bHRzKTtcblxuICAgIHRoaXMuY29sdW1ucyA9IHVuaXFCeShjb2x1bW5zLCAnbmFtZScpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uTmFtZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgIHRoaXMudXBkYXRlVGhFbHMoKTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZ0FwcGxpZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aENvbHVtbkRlZmF1bHRzKGNvbHVtbik6IENvbHVtbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSBjb2x1bW4uZGF0YVR5cGUgfHwgQ29sdW1uRGF0YVR5cGUuVGV4dFNob3J0O1xuICAgIGNvbnN0IHsgaGVhZGVyQ1NTQ2xhc3NOYW1lLCBjZWxsQ1NTQ2xhc3NOYW1lIH0gPSBjb2x1bW47XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0T3JkZXI6ICcnLFxuICAgICAgZmlsdGVyYWJsZTogZmFsc2UsXG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBkYXRhVHlwZSxcbiAgICAgIGdyaWRUcmFja1NpemU6XG4gICAgICAgIGNvbHVtbi5ncmlkVHJhY2tTaXplIHx8XG4gICAgICAgIGBtaW5tYXgoJHttaW5Db2x1bW5HcmlkVHJhY2tTaXplfXB4LCAke3JhdGlvc0J5Q29sdW1uVHlwZXNbZGF0YVR5cGVdfWZyKWAsXG4gICAgICBoZWFkZXJDU1NDbGFzc05hbWU6XG4gICAgICAgICh0eXBlb2YgaGVhZGVyQ1NTQ2xhc3NOYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gaGVhZGVyQ1NTQ2xhc3NOYW1lLnNwbGl0KCcgJylcbiAgICAgICAgICA6IGhlYWRlckNTU0NsYXNzTmFtZSkgfHwgW10sXG4gICAgICBjZWxsQ1NTQ2xhc3NOYW1lOlxuICAgICAgICAodHlwZW9mIGNlbGxDU1NDbGFzc05hbWUgPT09ICdzdHJpbmcnID8gY2VsbENTU0NsYXNzTmFtZS5zcGxpdCgnICcpIDogY2VsbENTU0NsYXNzTmFtZSkgfHxcbiAgICAgICAgW11cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5OYW1lcygpIHtcbiAgICB0aGlzLmNvbHVtbk5hbWVzID0gdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJlc2l6ZUhhbmRsZSgpIHtcbiAgICBjb25zdCByZXNpemVIYW5kbGVEcmFnJCA9IHRoaXMucmVzaXplSGFuZGxlTW91c2VEb3duJC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmNsZWFyTW91c2VIaWdobGlnaHRzKCkpLFxuICAgICAgbWVyZ2VNYXAoKHsgZXZlbnQsIHRhcmdldENvbHVtbk5hbWUgfSkgPT4ge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbi5uYW1lID09PSB0YXJnZXRDb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTogdW5pb24oY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZSwgWydoZWFkZXItLWJlaW5nLXJlc2l6ZWQnXSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgPSB7XG4gICAgICAgICAgY29sdW1uTmFtZTogdGFyZ2V0Q29sdW1uTmFtZSxcbiAgICAgICAgICBlbDogZXZlbnQudGFyZ2V0Py5wYXJlbnROb2RlXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7XG4gICAgICAgICAgLi4udGhpcy5zdHlsZXMsXG4gICAgICAgICAgdGFibGVDdXJzb3I6ICdjb2wtcmVzaXplJ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5jbGVhck1vdXNlSGlnaGxpZ2h0cygpKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5yZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJClcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJlc2l6ZUhhbmRsZURyYWckLnN1YnNjcmliZSgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbiwgaSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmhlYWRlckJlaW5nUmVzaXplZCAmJiBjb2x1bW4ubmFtZSA9PT0gdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQuY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyRGl2OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgc2Nyb2xsQ29udGFpbmVyRWwncyBvZmZzZXQgbGVmdCByZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQuXG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsT2Zmc2V0ID0gc2Nyb2xsQ29udGFpbmVyRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cbiAgICAgICAgICAgIC8vIEFkanVzdCB3aXRoIHRoZSBzY3JvbGxDb250YWluZXJFbCBob3Jpem9udGFsIHNjcm9sbCBwb3NpdGlvbi5cbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxTY3JvbGxPZmZzZXQgPSBzY3JvbGxDb250YWluZXJEaXYuc2Nyb2xsTGVmdCAtIGhvcml6b250YWxPZmZzZXQ7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgbGVmdCBvZmZzZXQgb2YgdGhlIHJlc2l6ZWQgaGVhZGVyLlxuICAgICAgICAgICAgY29uc3QgaGVhZGVyT2Zmc2V0TGVmdCA9IHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkLmVsLm9mZnNldExlZnQgfHwgMDtcblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXNpcmVkIHdpZHRoLlxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0ICsgZXZlbnQuY2xpZW50WCAtIGhlYWRlck9mZnNldExlZnQ7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb2x1bW4gb2JqZWN0IHdpdGggdGhlIG5ldyBzaXplIHZhbHVlLCBlbmZvcmNlIG91ciBtaW5pbXVtIHNpemUuXG4gICAgICAgICAgICAgIGdyaWRUcmFja1NpemU6IGAke01hdGgubWF4KG1pbkNvbHVtbkdyaWRUcmFja1NpemUsIHdpZHRoKX1weGBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm9yIHRoZSBvdGhlciBoZWFkZXJzIHdoaWNoIGRvbid0IGhhdmUgYSBzZXQgd2lkdGgsIGZpeCBpdCB0byB0aGVpciBjb21wdXRlZCB3aWR0aC5cbiAgICAgICAgICBpZiAoY29sdW1uLmdyaWRUcmFja1NpemUuc3RhcnRzV2l0aCgnbWlubWF4JykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgLy8gaXNuJ3QgZml4ZWQgeWV0IChpdCB3b3VsZCBiZSBhIHB4IHZhbHVlKVxuICAgICAgICAgICAgICBncmlkVHJhY2tTaXplOiBgJHtfcGFyc2VJbnQodGhpcy50aEVsc1tpXS5jbGllbnRXaWR0aCl9cHhgXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgY29sdW1uIHNpemVzLlxuICAgICAgICAgKiBOb3RlOiBncmlkLXRlbXBsYXRlLWNvbHVtbnMgc2V0cyB0aGUgd2lkdGggZm9yIGFsbCBjb2x1bW5zIGluIG9uZSB2YWx1ZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXBkYXRlR3JpZENvbHVtbnNTaXplKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uLm5hbWUgPT09IHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkLmNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgaGVhZGVyQ1NTQ2xhc3NOYW1lOiB3aXRob3V0KGNvbHVtbi5oZWFkZXJDU1NDbGFzc05hbWUsICdoZWFkZXItLWJlaW5nLXJlc2l6ZWQnKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7XG4gICAgICAgICAgLi4udGhpcy5zdHlsZXMsXG4gICAgICAgICAgdGFibGVDdXJzb3I6ICdhdXRvJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhck1vdXNlSGlnaGxpZ2h0cygpIHtcbiAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldENlbGxSZW5kZXJlclNwZWMoeyB0eXBlLCB2YWx1ZSwgcm93LCBjb2x1bW5OYW1lIH0pOiBDZWxsUmVuZGVyZXJTcGVjIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIGNvbnN0IGNvbHVtblJlbmRlcmVyID0gdGhpcy5nZXRDb2x1bW5SZW5kZXJlcihjb2x1bW4pO1xuICAgIGNvbnN0IHJlbmRlcmVyVGVtcGxhdGUgPSBnZXQoXG4gICAgICBjb2x1bW5SZW5kZXJlcixcbiAgICAgIGAke3R5cGUgPT09ICdIRUFERVInID8gJ2hlYWRlckNlbGxSZW5kZXJlckRlZicgOiAnY2VsbFJlbmRlcmVyRGVmJ30udGVtcGxhdGVgXG4gICAgKTtcblxuICAgIGNvbnN0IHsgY2VsbFJlbmRlcmVyQ29tcG9uZW50LCBoZWFkZXJDZWxsUmVuZGVyZXJDb21wb25lbnQgfSA9IGNvbHVtbjtcbiAgICBjb25zdCByZW5kZXJlckNvbXBvbmVudCA9XG4gICAgICB0eXBlID09PSAnSEVBREVSJyA/IGhlYWRlckNlbGxSZW5kZXJlckNvbXBvbmVudCA6IGNlbGxSZW5kZXJlckNvbXBvbmVudDtcblxuICAgIHJldHVybiB7XG4gICAgICByZW5kZXJlcjogcmVuZGVyZXJUZW1wbGF0ZSB8fCByZW5kZXJlckNvbXBvbmVudCxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGl0ZW06IHJvdyxcbiAgICAgICAgcHJvcGVydHk6IGNvbHVtblxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtblJlbmRlcmVyKGNvbHVtbik6IENvbHVtbkRpcmVjdGl2ZSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uUmVuZGVyZXJzLnRvQXJyYXkoKS5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gY29sdW1uLm5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJpbmdMYWJlbHNQYXJhbXMoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIHRoaXMuZmlsdGVyaW5nTGFiZWxzUGFyYW1zID0ge1xuICAgICAgZmlsdGVyZWRJdGVtc0NvdW50OiBzdGF0cy5maWx0ZXJlZFNpemUsXG4gICAgICBhbGxJdGVtc0NvdW50OiBzdGF0cy5zaXplXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnaW5hdGlvbkxhYmVsUGFyYW1zKHN0YXRzOiBEYXRhU291cmNlU3RhdHMpIHtcbiAgICBpZiAoc3RhdHMubmV4dFBhZ2UpIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBuZXh0UGFnZTogc3RhdHMubmV4dFBhZ2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlRmlyc3RJdGVtSWR4ID0gKHN0YXRzLmN1cnJlbnRQYWdlIC0gMSkgKiBzdGF0cy5maXJzdFBhZ2VTaXplICsgMTtcbiAgICB0aGlzLnBhZ2luYXRpb25MYWJlbFBhcmFtcyA9IHtcbiAgICAgIHBhZ2VGaXJzdEl0ZW1JZHgsXG4gICAgICBwYWdlTGFzdEl0ZW1JZHg6IHBhZ2VGaXJzdEl0ZW1JZHggKyAoc3RhdHMuY3VycmVudFBhZ2VTaXplIC0gMSksXG4gICAgICBpdGVtc1RvdGFsOiBzdGF0cy5maWx0ZXJlZFNpemVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2FkTW9yZUNvbXBvbmVudChzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbCAmJlxuICAgICAgc3RhdHMgJiZcbiAgICAgIHN0YXRzLm5leHRQYWdlICYmXG4gICAgICAoIXRoaXMubG9hZE1vcmVDb21wb25lbnQgfHwgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50KVxuICAgICkge1xuICAgICAgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50ID0gZmFsc2U7XG4gICAgICB0aGlzLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5PGFueT4gPVxuICAgICAgICB0aGlzLmNmci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMb2FkTW9yZUNvbXBvbmVudCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIExvYWRNb3JlQ29tcG9uZW50O1xuICAgICAgaW5zdGFuY2UudXNlSW50ZXJzZWN0aW9uID0gdGhpcy5pbmZpbml0ZVNjcm9sbCA9PT0gJ2F1dG8nIHx8IHRoaXMuaW5maW5pdGVTY3JvbGwgPT09ICdoaWRkZW4nO1xuICAgICAgaW5zdGFuY2UuaGlkZGVuID0gdGhpcy5pbmZpbml0ZVNjcm9sbCA9PT0gJ2hpZGRlbic7XG4gICAgICBpbnN0YW5jZS5wYWdpbmcgPSB7XG4gICAgICAgIG5leHRQYWdlOiBzdGF0cy5uZXh0UGFnZSxcbiAgICAgICAgbmV4dDogdGhpcy5sb2FkTmV4dFBhZ2UuYmluZCh0aGlzKVxuICAgICAgfSBhcyBQYWdpbmc8YW55PjtcbiAgICAgIGluc3RhbmNlLmxvYWROZXh0TGFiZWwgPSB0aGlzLmxvYWRNb3JlSXRlbXNMYWJlbDtcbiAgICAgIGluc3RhbmNlLmxvYWRpbmdMYWJlbCA9IHRoaXMubG9hZGluZ0l0ZW1zTGFiZWw7XG4gICAgICB0aGlzLmxvYWRNb3JlQ29tcG9uZW50ID0gaW5zdGFuY2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvYWRNb3JlQ29tcG9uZW50ICYmICFzdGF0cy5uZXh0UGFnZSkge1xuICAgICAgdGhpcy5sb2FkTW9yZUNvbXBvbmVudC5wYWdpbmcgPSB7XG4gICAgICAgIG5leHRQYWdlOiBudWxsXG4gICAgICB9IGFzIFBhZ2luZzxhbnk+O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgaWYgKHRoaXMuaW5maW5pdGVTY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCkge1xuICAgIG1lcmdlKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMub25Tb3J0LFxuICAgICAgICB0aGlzLm9uUGFnZVNpemVDaGFuZ2UsXG4gICAgICAgIHRoaXMub25Db2x1bW5SZW9yZGVyZWQsXG4gICAgICAgIHRoaXMub25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlXG4gICAgICApLnBpcGUobWFwKGNvbmZpZyA9PiBjb25maWcuY29sdW1ucykpLFxuICAgICAgbWVyZ2UodGhpcy5vbkFkZEN1c3RvbUNvbHVtbiwgdGhpcy5vblJlbW92ZUN1c3RvbUNvbHVtbikucGlwZShcbiAgICAgICAgbWFwKCgpID0+ICh0aGlzLmNvbHVtbnMgfHwgW10pLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpKVxuICAgICAgKSxcbiAgICAgIHRoaXMub25GaWx0ZXIucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbHVtbk5hbWUsIGZpbHRlcmluZ01vZGlmaWVyIH0pID0+XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpLm1hcCgoY29sdW1uOiBDb2x1bW5Db25maWcpID0+IHtcbiAgICAgICAgICAgIGlmIChpc05pbChjb2x1bW5OYW1lKSkge1xuICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZpbHRlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLm5hbWUgPT09IGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKGlzRW1wdHkoZmlsdGVyaW5nTW9kaWZpZXIpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5maWx0ZXI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlciA9IGZpbHRlcmluZ01vZGlmaWVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGNvbHVtbnM6IEFycmF5PENvbHVtbkNvbmZpZyB8IEN1c3RvbUNvbHVtbkNvbmZpZz4pID0+ICh7XG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgfVxuICAgICAgICB9KSksXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5KSxcbiAgICAgICAgdGhpcy50cmltRmlsdGVyQ29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1Tb3J0Q29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uT3JkZXJQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKSxcbiAgICAgICAgY29uY2F0TWFwKChjb25maWc6IEdyaWRDb25maWcpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LnNhdmVDb25maWckKGNvbmZpZykpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1GaWx0ZXJDb25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnZmlsdGVyJywgY29uZmlnID0+IHtcbiAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChjb2wgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBjb2wuZmlsdGVyO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1Tb3J0Q29uZmlnUGlwZSgpOiBVbmFyeUZ1bmN0aW9uPE9ic2VydmFibGU8R3JpZENvbmZpZz4sIE9ic2VydmFibGU8R3JpZENvbmZpZz4+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ3NvcnQnLCBjb25maWcgPT4ge1xuICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGNvbCA9PiB7XG4gICAgICAgICAgY29sLnNvcnRPcmRlciA9ICcnO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248XG4gICAgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPixcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+XG4gID4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnY3VzdG9tQ29sdW1ucycsIGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbmZpZy5jb2x1bW5zID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoKGNvbDogQ3VzdG9tQ29sdW1uQ29uZmlnKSA9PiAhY29sLmN1c3RvbSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uT3JkZXJQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnb3JkZXInLCBjb25maWcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29uZmlnJCgpLnBpcGUoXG4gICAgICAgICAgbWFwKG9sZENvbmZpZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRDb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgIG9sZENvbmZpZz8uY29sdW1ucyB8fCAodGhpcy5kZWZhdWx0Q29sdW1ucyBhcyBDb2x1bW5Db25maWdbXSk7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjdXN0b20gY29sdW1ucyBoYXZlIGJlZW4gYWRkZWRcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnNBZGRlZCA9IChjb25maWcuY29sdW1ucyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAgICAgICBjb2wgPT4gIW9sZENvbHVtbnMuZmluZChvbGQgPT4gb2xkLm5hbWUgPT09IGNvbC5uYW1lKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSBbXG4gICAgICAgICAgICAgIC4uLm9sZENvbHVtbnMubWFwKG9sZENvbCA9PlxuICAgICAgICAgICAgICAgIChjb25maWcuY29sdW1ucyB8fCBbXSkuZmluZChuZXdDb2wgPT4gbmV3Q29sLm5hbWUgPT09IG9sZENvbC5uYW1lKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5jb2x1bW5zQWRkZWRcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKTogVW5hcnlGdW5jdGlvbjxcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+LFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCd2aXNpYmlsaXR5JywgY29uZmlnID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbmZpZyQoKS5waXBlKFxuICAgICAgICAgIG1hcChvbGRDb25maWcgPT4ge1xuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChuZXdDb2wgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgICAgb2xkQ29uZmlnPy5jb2x1bW5zIHx8ICh0aGlzLmRlZmF1bHRDb2x1bW5zIGFzIENvbHVtbkNvbmZpZ1tdKTtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkQ29sID0gY29sdW1ucy5maW5kKChjb2w6IGFueSkgPT4gbmV3Q29sLm5hbWUgPT09IGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgbmV3Q29sLnZpc2libGUgPSBvbGRDb2w/LnZpc2libGUgPz8gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRXZlbnRQaXBlKFxuICAgIGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0LFxuICAgIHRyaW1FdmVudERhdGFGbjogKGNvbmZpZzogR3JpZENvbmZpZykgPT4gR3JpZENvbmZpZyB8IE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICBjb25jYXRNYXAoKGNvbmZpZzogR3JpZENvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ29uZmlnRmlsdGVyXG4gICAgICAgICAgLmNhbGwodGhpcywgY29uZmlnUGFydClcbiAgICAgICAgICAucGlwZShtYXAoa2VlcEV2ZW50RGF0YSA9PiAoeyBjb25maWcsIGtlZXBFdmVudERhdGEgfSkpKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKCh7IGNvbmZpZywga2VlcEV2ZW50RGF0YSB9KSA9PlxuICAgICAgICBrZWVwRXZlbnREYXRhID8gY29uZmlnIDogdHJpbUV2ZW50RGF0YUZuLmNhbGwodGhpcywgY29uZmlnKVxuICAgICAgKSxcbiAgICAgIGNvbmNhdE1hcChjb25maWcgPT4gKGlzT2JzZXJ2YWJsZShjb25maWcpID8gY29uZmlnIDogb2YoY29uZmlnKSkgYXMgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ29uZmlnRmlsdGVyKGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRvT2JzZXJ2YWJsZShcbiAgICAgIChpc0Z1bmN0aW9uKHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbnRleHQoKT8uY29uZmlnRmlsdGVyPy5bY29uZmlnUGFydF0pXG4gICAgICAgID8gKHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbnRleHQoKT8uY29uZmlnRmlsdGVyPy5bY29uZmlnUGFydF0gYXMgRnVuY3Rpb24pKClcbiAgICAgICAgOiB0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneS5nZXRDb250ZXh0KCk/LmNvbmZpZ0ZpbHRlcj8uW2NvbmZpZ1BhcnRdKSA/PyB0cnVlXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdlxuICAjc2Nyb2xsXG4gIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLXNjcm9sbFwiXG4gIFtuZ0NsYXNzXT1cInsgJ3RhYmxlLWRhdGEtZ3JpZF9fb3ZlcmxheSc6IChkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmMpICYmICFsb2FkTW9yZUNvbXBvbmVudCB9XCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkX19sb2FkaW5nLS13cmFwcGVyXCJcbiAgICAqbmdJZj1cIihkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmMpICYmICFsb2FkTW9yZUNvbXBvbmVudFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtZGF0YS1ncmlkX19sb2FkaW5nLS1sb2FkZXJcIj5cbiAgICAgIDxjOHktcHJvZ3Jlc3MtYmFyIFttZXNzYWdlXT1cImxvYWRpbmdJdGVtc0xhYmVsXCI+PC9jOHktcHJvZ3Jlc3MtYmFyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiZGlzcGxheU9wdGlvbnMuZ3JpZEhlYWRlclwiIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWhlYWRlciBzZXBhcmF0b3IgbGFyZ2UtcGFkZGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJoNFwiIFtuZ0NsYXNzXT1cInsgJ20tci0xNic6ICEhdGl0bGUgfVwiPnt7IHRpdGxlIHwgdHJhbnNsYXRlIH19PC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheU9wdGlvbnMuZmlsdGVyXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFmaWx0ZXJpbmdBcHBsaWVkXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtZGVmYXVsdCBtLXItNFwiIHRyYW5zbGF0ZT5ObyBmaWx0ZXJzPC9zcGFuPlxuICAgICAgICA8c21hbGxcbiAgICAgICAgICAqbmdJZj1cIiEhZmlsdGVyaW5nTGFiZWxzUGFyYW1zLmFsbEl0ZW1zQ291bnRcIlxuICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cImZpbHRlcmluZ0xhYmVsc1BhcmFtc1wiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBmaWx0ZXJlZEl0ZW1zQ291bnQgfX0gb2Yge3sgYWxsSXRlbXNDb3VudCB9fSBpdGVtc1xuICAgICAgICA8L3NtYWxsPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJmaWx0ZXJpbmdBcHBsaWVkXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIWZpbHRlcmluZ0xhYmVsc1BhcmFtcy5hbGxJdGVtc0NvdW50XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1pbmZvIG0tci00XCI+XG4gICAgICAgICAgICB7eyAoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzbWFsbCBuZ05vbkJpbmRhYmxlIHRyYW5zbGF0ZSBbdHJhbnNsYXRlUGFyYW1zXT1cImZpbHRlcmluZ0xhYmVsc1BhcmFtc1wiPlxuICAgICAgICAgICAgb2Yge3sgYWxsSXRlbXNDb3VudCB9fSBpdGVtc1xuICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnQ2xlYXIgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGVmYXVsdCBtLWwtOCBtLXItNFwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsdGVycygpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7ICdDbGVhciBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPHNwYW4gY2xhc3M9XCJoaWRkZW4teHMgaGlkZGVuLXNtXCIgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5maWx0ZXJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBwb3BvdmVyPVwie3sgJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidDbGljayB0aGUgY29sdW1uIGhlYWRlcnMgdG8gYXBwbHkgZmlsdGVycy4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1oZWxwLWZpbHRlcnNcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgYzh5SWNvbj1cInF1ZXN0aW9uLWNpcmNsZS1vXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPHNwYW4gY2xhc3M9XCJoaWRkZW4teHMgaGlkZGVuLXNtXCIgKm5nSWY9XCJzaG93Q291bnRlcldhcm5pbmdcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIHRleHQtcHJpbWFyeVwiXG4gICAgICAgICAgcG9wb3Zlcj1cInt7XG4gICAgICAgICAgICAnVGhlIGNvdW50ZXIgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgbWlnaHQgYmUgaW5hY2N1cmF0ZS4nIHwgdHJhbnNsYXRlXG4gICAgICAgICAgfX1cIlxuICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwie3tcbiAgICAgICAgICAgICdUaGUgY291bnRlciBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBtaWdodCBiZSBpbmFjY3VyYXRlLicgfCB0cmFuc2xhdGVcbiAgICAgICAgICB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwid2FybmluZ1wiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwibS1sLWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJidG5iYXIgZC1mbGV4IGEtaS1jZW50ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGVhZGVyQWN0aW9uQ29udHJvbCBvZiBoZWFkZXJBY3Rpb25Db250cm9sc1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkZXJBY3Rpb25Db250cm9sIHwgaXNDb250cm9sVmlzaWJsZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoZWFkZXJBY3Rpb25Db250cm9sLnRlbXBsYXRlOyBlbHNlIGN1c3RvbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGhlYWRlckFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGVhZGVyQWN0aW9uQ29udHJvbC5jYWxsYmFjaygpXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTixcbiAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGhlYWRlckFjdGlvbkNvbnRyb2wudGV4dCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IGhlYWRlckFjdGlvbkNvbnRyb2wudHlwZVxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgW2M4eUljb25dPVwiaGVhZGVyQWN0aW9uQ29udHJvbC5pY29uXCIgY2xhc3M9XCJtLXItNFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBoZWFkZXJBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1c3RvbVRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgIGhlYWRlckFjdGlvbkNvbnRyb2wudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IGhlYWRlckFjdGlvbkNvbnRyb2w6IGhlYWRlckFjdGlvbkNvbnRyb2wgfVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cImNvbmZpZ3VyZUNvbHVtbnNFbmFibGVkXCJcbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICBkcm9wZG93blxuICAgICAgICAgICNkZENvbmZpZ3VyZUNvbHVtbnM9XCJicy1kcm9wZG93blwiXG4gICAgICAgICAgW2Nka1RyYXBGb2N1c109XCJkZENvbmZpZ3VyZUNvbHVtbnMuaXNPcGVuXCJcbiAgICAgICAgICBbaW5zaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ29uZmlndXJlIGNvbHVtbnMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWN1c3RvbS1jb2x1bW4tYnRuXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGM4eUljb249XCJjb2x1bW5zXCIgY2xhc3M9XCJtLXItNFwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdDb25maWd1cmUgY29sdW1ucycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8dWwgKmRyb3Bkb3duTWVudSBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZGF0YS1ncmlkX19kcm9wZG93blwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImJnLWxldmVsLTBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uQ29sdW1uRHJvcCgkZXZlbnQpXCIgY2xhc3M9XCJsaXN0LWdyb3VwIG0tMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCIgY2RrRHJhZyBjZGtEcmFnTG9ja0F4aXM9XCJ5XCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbi5wb3NpdGlvbkZpeGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZHJhZ2dhYmxlLWFmdGVyIHAtMCBhLWktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidkYXRhLWdyaWQtLWN1c3RvbS1jb2x1bW4taGVhZGVyLScgKyBjb2x1bW4uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94IHAtbC0xNlwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uLnZpc2libGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpOyBlbWl0Q29uZmlnQ2hhbmdlKCdjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9WSVNJQklMSVRZLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogIWNvbHVtbi52aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmN1c3RvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90IHNob3dPbkhvdmVyIG1heC13aWR0aC1maXQgYS1pLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ1JlbW92ZWBjb2x1bW4sdmVyYmAnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZWBjb2x1bW4sdmVyYmAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ3VzdG9tQ29sdW1uKHBvQ29uZmlybSwgY29sdW1uLCBkZENvbmZpZ3VyZUNvbHVtbnMpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Yzh5LXBvcG92ZXItY29uZmlybVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2VtZW50XT1cIidsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQ29uZmlybSByZW1vdmFsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAjcG9Db25maXJtXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9jOHktcG9wb3Zlci1jb25maXJtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cIm1pbnVzLWNpcmNsZVwiIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWN1c3RvbS1jb2x1bW4tcmVtb3ZlLWJ0blwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpICpuZ0lmPVwiaXNDb25maWdDb250ZXh0S25vd25cIiBjbGFzcz1cInAtOCBzdGlja3ktYm90dG9tIHNlcGFyYXRvci10b3BcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCBjdXN0b20gY29sdW1uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1hZGQtY3VzdG9tLWNvbHVtblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5DdXN0b21Db2x1bW5Nb2RhbCgpOyBkZENvbmZpZ3VyZUNvbHVtbnMuaGlkZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJwbHVzLWNpcmNsZVwiIGNsYXNzPVwibS1yLTRcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0FkZCBjdXN0b20gY29sdW1uJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1yZWxvYWQtYnRuXCJcbiAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG4gYnRuLWxpbmtcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmNcIlxuICAgICAgICAgIChjbGljayk9XCJjbGlja1JlbG9hZCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGM4eUljb249XCJyZWZyZXNoXCIgY2xhc3M9XCJtLXItNFwiPjwvaT5cbiAgICAgICAgICA8c3Bhbj57eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiIXNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgfHwgc2hvd1NlYXJjaFwiXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zZWFyY2ggbS1sLXNtLTE2XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdTZWFyY2jigKYnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgKGlucHV0KT1cInNlYXJjaFRleHQkLmVtaXQoJGV2ZW50LnRhcmdldC52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwic2VhcmNoXCIgKm5nSWY9XCJzZWFyY2hUZXh0Lmxlbmd0aCA9PT0gMFwiPjwvaT5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGM4eUljb249XCJ0aW1lc1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwicG9pbnRlclwiXG4gICAgICAgICAgICAgICpuZ0lmPVwic2VhcmNoVGV4dC5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaFRleHQgPSAnJzsgc2VhcmNoVGV4dCQuZW1pdCgnJylcIlxuICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLkNMRUFSX1NFQVJDSCB9XCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWQtaGVhZGVyLWJ1bGstYWN0aW9ucyBhbmltYXRlZCBzbGlkZUluRG93biBmYXN0XCJcbiAgICAgICpuZ0lmPVwic2VsZWN0ZWRJdGVtSWRzLmxlbmd0aCAhPT0gMFwiXG4gICAgPlxuICAgICAgPGg0PlxuICAgICAgICA8c3BhbiBuZ05vbkJpbmRhYmxlIHRyYW5zbGF0ZSBbdHJhbnNsYXRlUGFyYW1zXT1cInsgY291bnQ6IHNlbGVjdGVkSXRlbUlkcy5sZW5ndGggfVwiPlxuICAgICAgICAgIHt7IGNvdW50IH19IHNlbGVjdGVkIGl0ZW0ocykuXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGJyIGNsYXNzPVwidmlzaWJsZS14c1wiIC8+XG4gICAgICAgIDxzbWFsbCAqbmdJZj1cIiFzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrICYmIHNlbGVjdGVkSXRlbUlkcy5sZW5ndGggPj0gcGFnaW5hdGlvbi5wYWdlU2l6ZVwiPlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0QWxsSXRlbXNTZWxlY3RlZCh0cnVlKVwiXG4gICAgICAgICAgICBjbGFzcz1cImludGVyYWN0XCJcbiAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5TRUxFQ1RfQUxMX0lURU1TIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBjb3VudDogKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgU2VsZWN0IGFsbCB7eyBjb3VudCB9fSBpdGVtc1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9zbWFsbD5cbiAgICAgIDwvaDQ+XG4gICAgICA8ZGl2IGNsYXNzPVwibS1sLWF1dG9cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bmJhciBkLWZsZXhcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidWxrQWN0aW9uQ29udHJvbCBvZiBidWxrQWN0aW9uQ29udHJvbHNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCJidWxrQWN0aW9uQ29udHJvbCB8IGlzQ29udHJvbFZpc2libGU6IHNlbGVjdGVkSXRlbUlkc1wiXG4gICAgICAgICAgICAgIFtuZ1N3aXRjaF09XCJidWxrQWN0aW9uQ29udHJvbC50eXBlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5FeHBvcnRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtBY3Rpb25Db250cm9sLmNhbGxiYWNrKHNlbGVjdGVkSXRlbUlkcywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0VYUE9SVCB9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJzaWduLW91dFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnRXhwb3J0JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5EZWxldGVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtBY3Rpb25Db250cm9sLmNhbGxiYWNrKHNlbGVjdGVkSXRlbUlkcywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0RFTEVURSB9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGJ1bGtBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkJVTEtfQ1VTVE9NX0FDVElPTixcbiAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGJ1bGtBY3Rpb25Db250cm9sLnRleHRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJ7eyBidWxrQWN0aW9uQ29udHJvbC5pY29uIH19XCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGJ1bGtBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxuICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkJVTEtfQ0FOQ0VMXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwidGltZXNcIj48L2k+XG4gICAgICAgICAgICA8c3Bhbj57eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPHRhYmxlXG4gICAgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ob3ZlciB0YWJsZS1maWx0ZXJlZC1zb3J0ZWQgdGFibGUtZGF0YS1ncmlkIGxhcmdlLXBhZGRpbmdcIlxuICAgIGNkay10YWJsZVxuICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgIFt0cmFja0J5XT1cInRyYWNrQnlOYW1lXCJcbiAgICBbY2xhc3MudGFibGUtc3RyaXBlZF09XCJkaXNwbGF5T3B0aW9ucy5zdHJpcGVkXCJcbiAgICBbY2xhc3MudGFibGUtYm9yZGVyZWRdPVwiZGlzcGxheU9wdGlvbnMuYm9yZGVyZWRcIlxuICAgIFtjbGFzcy50YWJsZS1kYXRhLWdyaWQtd2l0aC1jaGVja2JveGVzXT1cInNlbGVjdGFibGVcIlxuICAgIFtjbGFzcy50YWJsZS1kYXRhLWdyaWQtd2l0aC1hY3Rpb25zXT1cImFjdGlvbkNvbnRyb2xzLmxlbmd0aCA+IDBcIlxuICAgIFtzdHlsZS5ncmlkLXRlbXBsYXRlLWNvbHVtbnNdPVwic3R5bGVzLmdyaWRUZW1wbGF0ZUNvbHVtbnNcIlxuICAgIChtb3VzZW1vdmUpPVwicmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VNb3ZlJC5lbWl0KCRldmVudClcIlxuICAgIChtb3VzZXVwKT1cInJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkLmVtaXQoJGV2ZW50KVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlOYW1lXCJcbiAgICAgIFtjZGtDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWVcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi5uYW1lXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICA8dGggY2RrLWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmIGRhdGEtdHlwZT1cImljb25cIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZWN0ZWQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlLmFsbFNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIlxuICAgICAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUuYWxsU2VsZWN0ZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlLmFsbERlc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0QWxsSXRlbXNJbkN1cnJlbnRQYWdlU2VsZWN0ZWQoJGV2ZW50LnRhcmdldC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0FMTF9JVEVNUyB9XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGQgY2RrLWNlbGwgKmNka0NlbGxEZWY9XCJsZXQgcm93XCIgZGF0YS10eXBlPVwiaWNvblwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEl0ZW1zU2VsZWN0ZWQoW3Jvd10sICRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5TRUxFQ1RfSVRFTSxcbiAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWN0aW9ucydcIj5cbiAgICAgICAgICA8dGggY2RrLWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmIGRhdGEtdHlwZT1cImljb25cIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1tZWRpdW0gc3Itb25seVwiPnt7ICdBY3Rpb25zJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgPHRkIGNkay1jZWxsICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiIGRhdGEtdHlwZT1cImljb25cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25Db250cm9scy5sZW5ndGggPD0gMlwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb25Db250cm9sIG9mIGFjdGlvbkNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY3Rpb25Db250cm9sIHwgaXNDb250cm9sVmlzaWJsZTogcm93XCJcbiAgICAgICAgICAgICAgICAgIFtuZ1N3aXRjaF09XCJhY3Rpb25Db250cm9sLnR5cGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkVkaXRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90XCJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0VkaXQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5FRElUX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInBlbmNpbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBidG4tZG90LS1kYW5nZXIgc2hvd09uSG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcmVtb3ZlLWJ1dHRvbi1pbi1yb3dcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5ERUxFVEVfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNVU1RPTV9BQ1RJT05fSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBhY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7IChhY3Rpb25Db250cm9sLmljb24gPyBhY3Rpb25Db250cm9sLnRleHQgOiAnJykgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihhY3Rpb25Db250cm9sLmljb24gPyBhY3Rpb25Db250cm9sLnRleHQgOiAnJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiYWN0aW9uQ29udHJvbC5pY29uXCIgYzh5SWNvbj1cInt7IGFjdGlvbkNvbnRyb2wuaWNvbiB9fVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYWN0aW9uQ29udHJvbC5pY29uXCI+e3sgYWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyAnbS1sLWF1dG8gb3ZlcmZsb3ctdmlzaWJsZSc6IGFjdGlvbkNvbnRyb2xzLmxlbmd0aCA+IDIgfVwiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJhY3Rpb25Db250cm9scy5sZW5ndGggPiAyXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICBkcm9wZG93blxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbSByaWdodFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBY3Rpb25zJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlIGM4eS1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJlbGxpcHNpcy12XCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1yaWdodFwiICpkcm9wZG93bk1lbnU+XG4gICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGFjdGlvbkNvbnRyb2wgb2YgYWN0aW9uQ29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYWN0aW9uQ29udHJvbCB8IGlzQ29udHJvbFZpc2libGU6IHJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nU3dpdGNoXT1cImFjdGlvbkNvbnRyb2wudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5FZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5FRElUX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJwZW5jaWxcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuREVMRVRFX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5FWFBPUlRfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRvd25sb2FkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DVVNUT01fQUNUSU9OX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGFjdGlvbkNvbnRyb2wudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInt7IGFjdGlvbkNvbnRyb2wuaWNvbiB9fVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uaGVhZGVyQ1NTQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdHlwZV09XCJjb2x1bW4uZGF0YVR5cGVcIlxuICAgICAgICAgICAgW2NsYXNzLnNvcnRlZF09XCJjb2x1bW4uc29ydE9yZGVyXCJcbiAgICAgICAgICAgIFtjbGFzcy5maWx0ZXJlZF09XCJjb2x1bW4gfCBtYXA6IGlzQ29sdW1uRmlsdGVyaW5nQXBwbGllZFwiXG4gICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiFjb2x1bW4udmlzaWJsZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4uZmlsdGVyYWJsZVwiIFt0aXRsZV09XCIoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEhlYWRlckNlbGxSZW5kZXJlclNwZWM6dGhpcyBhcyBjZWxsUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjOHktY2VsbC1yZW5kZXJlciBbc3BlY109XCJjZWxsUmVuZGVyZXJTcGVjXCI+PC9jOHktY2VsbC1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBpc0Ryb3BEb3duUGxhY2VkUmlnaHQgdG8gYmUgcmVtb3ZlZCB3aGVuIGNvbHVtbnMgYXJlIHRyYW5zZm9ybWVkIHRvIG9ic2VydmFibGVzLiAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd25cIlxuICAgICAgICAgICAgICBkcm9wZG93blxuICAgICAgICAgICAgICAjZ3JpZEhlYWRlckRyb3Bkb3duPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cImdyaWRIZWFkZXJEcm9wZG93bi5pc09wZW5cIlxuICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20ge3sgaXNEcm9wRG93blBsYWNlZFJpZ2h0KGNvbHVtbikgPyAncmlnaHQnIDogJ2xlZnQnIH19XCJcbiAgICAgICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVhZGVyXCJcbiAgICAgICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2RhdGEtZ3JpZC0taGVhZGVyLWJ0bi0tJyArIGNvbHVtbi5oZWFkZXJcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEhlYWRlckNlbGxSZW5kZXJlclNwZWM6dGhpcyBhcyBjZWxsUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxjOHktY2VsbC1yZW5kZXJlciBbc3BlY109XCJjZWxsUmVuZGVyZXJTcGVjXCI+PC9jOHktY2VsbC1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZmlsdGVyXCIgdGl0bGU9XCJ7eyAnRmlsdGVyJyB8IHRyYW5zbGF0ZSB9fVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPCEtLSBpc0Ryb3BEb3duUGxhY2VkUmlnaHQgdG8gYmUgcmVtb3ZlZCB3aGVuIGNvbHVtbnMgYXJlIHRyYW5zZm9ybWVkIHRvIG9ic2VydmFibGVzLiAtLT5cbiAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnZHJvcGRvd24tbWVudS1yaWdodC1ncmlkJzogaXNEcm9wRG93blBsYWNlZFJpZ2h0KGNvbHVtbikgfVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkYXRhLWdyaWRfX2Ryb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd246IGdyaWRIZWFkZXJEcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWM6dGhpcyBhcyBmaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktZmlsdGVyaW5nLWZvcm0tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICBbc3BlY109XCJmaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LWZpbHRlcmluZy1mb3JtLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4tc29ydFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJzb3J0Q29sdW1uVGl0bGUgfCB0cmFuc2xhdGU6IHsgbmFtZTogY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSB9XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VTb3J0T3JkZXIoY29sdW1uLm5hbWUpXCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cImNoYW5nZS1zb3J0LW9yZGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnNvcnRPcmRlclwiPlxuICAgICAgICAgICAgICAgIDxpICpuZ1N3aXRjaENhc2U9XCInYXNjJ1wiIGM4eUljb249XCJsb25nLWFycm93LXVwXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxpICpuZ1N3aXRjaENhc2U9XCInZGVzYydcIiBjOHlJY29uPVwibG9uZy1hcnJvdy1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxpICpuZ1N3aXRjaERlZmF1bHQgYzh5SWNvbj1cImV4Y2hhbmdlXCI+PC9pPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5yZXNpemFibGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIlxuICAgICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZU1vdXNlRG93biQuZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHRhcmdldENvbHVtbk5hbWU6IGNvbHVtbi5uYW1lIH0pXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGNkay1jZWxsXG4gICAgICAgICAgICAqY2RrQ2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmNlbGxDU1NDbGFzc05hbWVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1jZWxsLXRpdGxlXT1cImNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInZGF0YS1ncmlkLS0nICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXR5cGVdPVwiY29sdW1uLmRhdGFUeXBlXCJcbiAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiIWNvbHVtbi52aXNpYmxlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzb2x2ZUNlbGxWYWx1ZShyb3csIGNvbHVtbi5wYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSB8IG1hcDogZ2V0Q2VsbFJlbmRlcmVyU3BlYzp0aGlzIGFzIGNlbGxSZW5kZXJlclNwZWNcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGM4eS1jZWxsLXJlbmRlcmVyIFtzcGVjXT1cImNlbGxSZW5kZXJlclNwZWNcIj48L2M4eS1jZWxsLXJlbmRlcmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgY2RrQ29sdW1uRGVmPVwiaW5maW5pdGVTY3JvbGxGb290ZXJcIj5cbiAgICAgIDx0ZCBjZGstZm9vdGVyLWNlbGwgKmNka0Zvb3RlckNlbGxEZWYgW3N0eWxlLmdyaWQtY29sdW1uXT1cInN0eWxlcy5ncmlkSW5maW5pdGVTY3JvbGxDb2x1bW5cIj5cbiAgICAgICAgPHRlbXBsYXRlICNpbmZpbml0ZVNjcm9sbENvbnRhaW5lcj48L3RlbXBsYXRlPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0ciBjZGstaGVhZGVyLXJvdyAqY2RrSGVhZGVyUm93RGVmPVwiY29sdW1uTmFtZXNcIj48L3RyPlxuXG4gICAgPHRyXG4gICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcm93LWluLWRhdGEtZ3JpZFwiXG4gICAgICBjZGstcm93XG4gICAgICAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uTmFtZXNcIlxuICAgICAgKG1vdXNlb3Zlcik9XCJyb3dNb3VzZU92ZXIuZW1pdChyb3cpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cInJvd01vdXNlTGVhdmUuZW1pdChyb3cpXCJcbiAgICAgIChjbGljayk9XCJyb3dDbGljay5lbWl0KHJvdylcIlxuICAgID48L3RyPlxuXG4gICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgIDx0clxuICAgICAgICBbbmdDbGFzc109XCJ7IGhpZGRlbjogIWluZmluaXRlU2Nyb2xsIH1cIlxuICAgICAgICBjZGstZm9vdGVyLXJvd1xuICAgICAgICAqY2RrRm9vdGVyUm93RGVmPVwiWydpbmZpbml0ZVNjcm9sbEZvb3RlciddXCJcbiAgICAgID48L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3RhYmxlPlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cImQtZmxleCBtLTAgcC10LTQwIHAtYi00MFwiXG4gICAgKm5nSWY9XCIhKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiYgKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSA9PT0gMFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTMgY29sLXNtLTQgbS1sLWF1dG8gbS1yLWF1dG9cIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImM4eS11aS1lbXB0eS1zdGF0ZSwgLmM4eS1lbXB0eS1zdGF0ZVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cInBhZ2luYXRpb24gJiYgIWluZmluaXRlU2Nyb2xsXCIgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWQtZm9vdGVyIHNlcGFyYXRvciBsYXJnZS1wYWRkaW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IG5vLWd1dHRlclwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIihkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5jdXJyZW50UGFnZVNpemUgPiAwXCJcbiAgICAgICAgY2xhc3M9XCJjb3VudGVyIHAtdC04IHAtYi04XCJcbiAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tY291bnRlclwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZFwiIG5nTm9uQmluZGFibGUgdHJhbnNsYXRlIFt0cmFuc2xhdGVQYXJhbXNdPVwicGFnaW5hdGlvbkxhYmVsUGFyYW1zXCI+XG4gICAgICAgICAge3sgcGFnZUZpcnN0SXRlbUlkeCB9fSAtIHt7IHBhZ2VMYXN0SXRlbUlkeCB9fSBvZiB7eyBpdGVtc1RvdGFsIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IG5vLWd1dHRlciB0ZXh0LWNlbnRlclwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIihkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgPiBtaW5Qb3NzaWJsZVBhZ2VTaXplXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0taW5saW5lIHAtdC04IHAtYi04XCJcbiAgICAgID5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibS1yLTRcIiBmb3I9XCJmaWx0ZXJlZFNpemVcIj57eyAnSXRlbXMgcGVyIHBhZ2UnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIGlkPVwiZmlsdGVyZWRTaXplXCJcbiAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLXBhZ2VzaXplLW9wdGlvbnNcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwicGFnaW5hdGlvbi5wYWdlU2l6ZVwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJcbiAgICAgICAgICAgICAgdXBkYXRlUGFnaW5hdGlvbih7IGl0ZW1zUGVyUGFnZTogJGV2ZW50LCBwYWdlOiBwYWdpbmF0aW9uLmN1cnJlbnRQYWdlIH0pXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHBhZ2VTaXplIG9mIHBvc3NpYmxlUGFnZVNpemVzXCIgW25nVmFsdWVdPVwicGFnZVNpemVcIj5cbiAgICAgICAgICAgICAge3sgcGFnZVNpemUgfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IG5vLWd1dHRlciB0ZXh0LXJpZ2h0XCI+XG4gICAgICA8cGFnaW5hdGlvblxuICAgICAgICAqbmdJZj1cIihkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgPiAwXCJcbiAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJoaWRlUGFnaW5hdGlvbiQgfCBhc3luY1wiXG4gICAgICAgIFtuZ01vZGVsXT1cInBhZ2luYXRpb24uY3VycmVudFBhZ2VcIlxuICAgICAgICAocGFnZUNoYW5nZWQpPVwidXBkYXRlUGFnaW5hdGlvbigkZXZlbnQpXCJcbiAgICAgICAgW3RvdGFsSXRlbXNdPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZVwiXG4gICAgICAgIFtpdGVtc1BlclBhZ2VdPVwicGFnaW5hdGlvbi5wYWdlU2l6ZVwiXG4gICAgICAgIChudW1QYWdlcyk9XCJ0b3RhbFBhZ2VzQ291bnQkLm5leHQoJGV2ZW50KVwiXG4gICAgICAgIFttYXhTaXplXT1cIjVcIlxuICAgICAgICBbYm91bmRhcnlMaW5rc109XCJmYWxzZVwiXG4gICAgICAgIHByZXZpb3VzVGV4dD1cIlByZXZpb3VzXCJcbiAgICAgICAgbmV4dFRleHQ9XCJOZXh0XCJcbiAgICAgICAgY2xhc3M9XCJwLXQtOCBwLWItOFwiXG4gICAgICA+PC9wYWdpbmF0aW9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
1029
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFFTCxTQUFTLEVBRVQsd0JBQXdCLEVBQ3hCLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQ0wsSUFBSSxFQUNKLEdBQUcsRUFDSCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFVBQVUsRUFDVixLQUFLLEVBQ0wsUUFBUSxJQUFJLFNBQVMsRUFDckIsS0FBSyxFQUNMLE1BQU0sRUFDTixPQUFPLEVBQ1IsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLFlBQVksRUFDWixLQUFLLEVBRUwsRUFBRSxFQUNGLElBQUksRUFDSixPQUFPLEVBRVIsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixLQUFLLEVBQ0wsR0FBRyxFQUNILFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxHQUFHLEVBQ0osTUFBTSxnQkFBZ0Is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RUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsUUFBUTtzQkFBakIsTUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUUyQixlQUFlO3NCQUFoRCxlQUFlO3VCQUFDLGVBQWU7Z0JBRU8sZUFBZTtzQkFBckQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkE2RHBCLE1BQU07c0JBQWhFLFlBQVk7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0hlYWRlckNlbGwgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRGYWN0b3J5LFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IElSZXN1bHRMaXN0LCBQYWdpbmcgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBmbG93LFxuICBnZXQsXG4gIGluZGV4T2YsXG4gIGlzRW1wdHksXG4gIGlzRnVuY3Rpb24sXG4gIGlzTmlsLFxuICBwYXJzZUludCBhcyBfcGFyc2VJbnQsXG4gIHVuaW9uLFxuICB1bmlxQnksXG4gIHdpdGhvdXRcbn0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Ryb3Bkb3duJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGlzT2JzZXJ2YWJsZSxcbiAgbWVyZ2UsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBwaXBlLFxuICBTdWJqZWN0LFxuICBVbmFyeUZ1bmN0aW9uXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY29uY2F0TWFwLFxuICBkZWJvdW5jZVRpbWUsXG4gIGRlbGF5LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgbWFwLFxuICBtZXJnZU1hcCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRhcFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gJy4uL2NvbW1vbi9leHRlbnNpb24taG9va3MnO1xuaW1wb3J0IHsgTG9hZE1vcmVDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vbG9hZC1tb3JlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2FkTW9yZU1vZGUgfSBmcm9tICcuLi9jb21tb24vbG9hZC1tb3JlLm1vZGVsJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICcuLi9pMThuL2dldHRleHQnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbmZpcm1CdXR0b25zLCBQb3BvdmVyQ29uZmlybUNvbXBvbmVudCB9IGZyb20gJy4uL21vZGFsL3BvcG92ZXItY29uZmlybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FpbnNpZ2h0U2VydmljZSB9IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZSc7XG5pbXBvcnQge1xuICBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50LFxuICBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlLFxuICBQUk9EVUNUX0VYUEVSSUVOQ0VfRVZFTlRfU09VUkNFXG59IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS9wcm9kdWN0LWV4cGVyaWVuY2UubW9kZWwnO1xuaW1wb3J0IHsgQ2VsbFJlbmRlcmVyU3BlYyB9IGZyb20gJy4vY29sdW1uL2NlbGwtcmVuZGVyZXInO1xuaW1wb3J0IHsgQ29sdW1uRGlyZWN0aXZlIH0gZnJvbSAnLi9jb2x1bW4vY29sdW1uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDdXN0b21Db2x1bW4gfSBmcm9tICcuL2NvbHVtbi9jdXN0b20uY29sdW1uJztcbmltcG9ydCB7IEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWMsIEZpbHRlcmluZ01vZGlmaWVyIH0gZnJvbSAnLi9jb2x1bW4vZmlsdGVyaW5nLWZvcm0tcmVuZGVyZXInO1xuaW1wb3J0IHsgQ29uZmlndXJlQ3VzdG9tQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9jb25maWd1cmUtY3VzdG9tLWNvbHVtbic7XG5pbXBvcnQge1xuICBEYXRhR3JpZENvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgREFUQV9HUklEX0NPTkZJR1VSQVRJT05fU1RSQVRFR1ksXG4gIEdyaWRDb25maWdQYXJ0LFxuICBHcmlkRXZlbnRUeXBlXG59IGZyb20gJy4vZGF0YS1ncmlkLWNvbmZpZ3VyYXRpb24ubW9kZWwnO1xuaW1wb3J0IHtcbiAgQWN0aW9uQ29udHJvbCxcbiAgQnVpbHRJbkFjdGlvblR5cGUsXG4gIEJ1bGtBY3Rpb25Db250cm9sLFxuICBDb2x1bW4sXG4gIENvbHVtbkNvbmZpZyxcbiAgQ29sdW1uRGF0YVR5cGUsXG4gIEN1c3RvbUNvbHVtbkNvbmZpZyxcbiAgRGF0YUdyaWQsXG4gIERhdGFTb3VyY2VTdGF0cyxcbiAgRGlzcGxheU9wdGlvbnMsXG4gIEZpbHRlcmluZ0FjdGlvblR5cGUsXG4gIEdyaWRDb25maWcsXG4gIEhlYWRlckFjdGlvbkNvbnRyb2wsXG4gIG1pbkNvbHVtbkdyaWRUcmFja1NpemUsXG4gIFBhZ2luYXRpb24sXG4gIHJhdGlvc0J5Q29sdW1uVHlwZXMsXG4gIFJvdyxcbiAgU2VydmVyU2lkZURhdGFDYWxsYmFjayxcbiAgU29ydE9yZGVyLFxuICBTcGVjaWFsQ29sdW1uTmFtZVxufSBmcm9tICcuL2RhdGEtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhR3JpZFNlcnZpY2UgfSBmcm9tICcuL2RhdGEtZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWREYXRhU291cmNlIH0gZnJvbSAnLi9ncmlkLWRhdGEtc291cmNlJztcbmltcG9ydCB7IFBYX0FDVElPTlMsIFBYX0VWRU5UX05BTUUgfSBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5jb25zdGFudHMnO1xuXG5lbnVtIFNvcnRpbmdPcmRlciB7XG4gIEFTQyA9ICdhc2MnLFxuICBERVNDID0gJ2Rlc2MnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtY29udGVudHMnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRhR3JpZENvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUdyaWRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBEYXRhR3JpZCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlXG57XG4gIC8qKiBUaGUgdGl0bGUgZm9yIHRoZSBkYXRhIGdyaWQsIGl0J3MgZGlzcGxheWVkIGluIHRoZSBncmlkJ3MgaGVhZGVyLiAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gZ2V0dGV4dCgnSXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZCBtb3JlIGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgbG9hZE1vcmVJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkIG1vcmUgaXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZGluZyBpbmRpY2F0b3IuICovXG4gIEBJbnB1dCgpIGxvYWRpbmdJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkaW5nIGl0ZW1z4oCmJyk7XG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGV4dCBzZWFyY2ggaW5wdXQgaXMgc2hvd24gaW4gdGhlIGdyaWQncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIHNob3dTZWFyY2ggPSBmYWxzZTtcbiAgLyoqIFRha2VzIGFuIGV2ZW50IGVtaXR0ZXIuIFdoZW4gYW4gZXZlbnQgaXMgZW1pdHRlZCwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZC4gKi9cbiAgQElucHV0KCkgcmVmcmVzaDogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgY29sdW1uczogQ29sdW1uW10gPSBbXTtcbiAgLyoqIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBncmlkLiAqL1xuICBASW5wdXQoJ2NvbHVtbnMnKVxuICBwcml2YXRlIF9jb2x1bW5zOiBDb2x1bW5bXTtcblxuICBkYXRhU291cmNlID0gbmV3IEdyaWREYXRhU291cmNlKCk7XG4gIHJvd3M6IFJvd1tdO1xuICAvKiogVGhlIGxpc3Qgb2Ygcm93cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGdyaWQgKHVzZWQgZm9yIGNsaWVudCBzaWRlIGRhdGEpLiAqL1xuICBASW5wdXQoJ3Jvd3MnKVxuICBzZXQgX3Jvd3Mocm93czogUm93W10pIHtcbiAgICB0aGlzLnJvd3MgPSByb3dzIHx8IFtdO1xuICB9XG5cbiAgZmlsdGVyaW5nTGFiZWxzUGFyYW1zID0ge1xuICAgIGZpbHRlcmVkSXRlbXNDb3VudDogMCxcbiAgICBhbGxJdGVtc0NvdW50OiAwXG4gIH07XG5cbiAgcGFnaW5hdGlvbjogUGFnaW5hdGlvbjtcbiAgcGFnaW5hdGlvbkxhYmVsUGFyYW1zID0ge1xuICAgIHBhZ2VGaXJzdEl0ZW1JZHg6IDAsXG4gICAgcGFnZUxhc3RJdGVtSWR4OiAwLFxuICAgIGl0ZW1zVG90YWw6IDBcbiAgfTtcbiAgcmVhZG9ubHkgcG9zc2libGVQYWdlU2l6ZXM6IG51bWJlcltdID0gWzI1LCA1MCwgMTAwXTtcbiAgcmVhZG9ubHkgbWluUG9zc2libGVQYWdlU2l6ZSA9IE1hdGgubWluKC4uLnRoaXMucG9zc2libGVQYWdlU2l6ZXMpO1xuICAvKiogUGFnaW5hdGlvbiBzZXR0aW5ncywgZS5nLiBhbGxvd3MgZm9yIHNldHRpbmcgY3VycmVudCBwYWdlIG9yIHBhZ2Ugc2l6ZS4gKi9cbiAgQElucHV0KCdwYWdpbmF0aW9uJylcbiAgc2V0IF9wYWdpbmF0aW9uKHBhZ2luYXRpb246IFBhZ2luYXRpb24pIHtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSBwYWdpbmF0aW9uO1xuICB9XG5cbiAgaW5maW5pdGVTY3JvbGw6IExvYWRNb3JlTW9kZTtcbiAgLyoqIFNldHMgbG9hZCBtb3JlIG1vZGUuICovXG4gIEBJbnB1dCgnaW5maW5pdGVTY3JvbGwnKVxuICBzZXQgX2luZmluaXRlU2Nyb2xsKGluZmluaXRlU2Nyb2xsOiBMb2FkTW9yZU1vZGUpIHtcbiAgICB0aGlzLmluZmluaXRlU2Nyb2xsID0gaW5maW5pdGVTY3JvbGw7XG4gIH1cblxuICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrOiBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrO1xuICAvKipcbiAgICogU2V0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBkYXRhIG5lZWRzIHRvIGJlIGxvYWRlZCBmcm9tIHNlcnZlci5cbiAgICogVGhlIGZ1bmN0aW9uIHNob3VsZCB0YWtlIFtbRGF0YVNvdXJjZU1vZGlmaWVyXV0gYW5kIHJldHVybiBbW1NlcnZlclNpZGVEYXRhUmVzdWx0XV0uXG4gICAqL1xuICBASW5wdXQoJ3NlcnZlclNpZGVEYXRhQ2FsbGJhY2snKVxuICBzZXQgX3NlcnZlclNpZGVEYXRhQ2FsbGJhY2soc2VydmVyU2lkZURhdGFDYWxsYmFjazogU2VydmVyU2lkZURhdGFDYWxsYmFjaykge1xuICAgIHRoaXMuc2VydmVyU2lkZURhdGFDYWxsYmFjayA9IHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s7XG4gIH1cblxuICBzZWxlY3RhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgaXRlbXMgY2FuIGJlIHNlbGVjdGVkIGJ5IGNsaWNraW5nIGEgY2hlY2tib3ggaW4gdGhlIGZpcnN0IGNvbHVtbi4gKi9cbiAgQElucHV0KCdzZWxlY3RhYmxlJylcbiAgc2V0IF9zZWxlY3RhYmxlKHNlbGVjdGFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNlbGVjdGFibGUgPSBzZWxlY3RhYmxlO1xuICB9XG5cbiAgc2VsZWN0aW9uUHJpbWFyeUtleTogc3RyaW5nID0gJ2lkJztcbiAgLyoqIERldGVybWluZXMgd2hpY2ggaXRlbSdzIHByb3BlcnR5IHdpbGwgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBzZWxlY3Rpb24gc3RhdHVzLiAqL1xuICBASW5wdXQoJ3NlbGVjdGlvblByaW1hcnlLZXknKVxuICBzZXQgX3NlbGVjdGlvblByaW1hcnlLZXkoc2VsZWN0aW9uUHJpbWFyeUtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5ID0gc2VsZWN0aW9uUHJpbWFyeUtleTtcbiAgfVxuXG4gIGRpc3BsYXlPcHRpb25zOiBEaXNwbGF5T3B0aW9ucyA9IHtcbiAgICBzdHJpcGVkOiB0cnVlLFxuICAgIGJvcmRlcmVkOiBmYWxzZSxcbiAgICBncmlkSGVhZGVyOiB0cnVlLFxuICAgIGZpbHRlcjogdHJ1ZVxuICB9O1xuICAvKiogU2V0cyBkaXNwbGF5IG9wdGlvbnMuICovXG4gIEBJbnB1dCgnZGlzcGxheU9wdGlvbnMnKVxuICBzZXQgX2Rpc3BsYXlPcHRpb25zKGRpc3BsYXlPcHRpb25zOiBEaXNwbGF5T3B0aW9ucykge1xuICAgIHRoaXMuZGlzcGxheU9wdGlvbnMgPSB7IC4uLnRoaXMuZGlzcGxheU9wdGlvbnMsIC4uLmRpc3BsYXlPcHRpb25zIH07XG4gIH1cblxuICBhY3Rpb25Db250cm9sczogQWN0aW9uQ29udHJvbFtdO1xuICAvKiogU2V0cyBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGl0ZW1zKS4gKi9cbiAgQElucHV0KCdhY3Rpb25Db250cm9scycpXG4gIHNldCBfYWN0aW9uQ29udHJvbHMoYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSkge1xuICAgIHRoaXMuYWN0aW9uQ29udHJvbHMgPSBhY3Rpb25Db250cm9scyB8fCBbXTtcbiAgfVxuXG4gIGJ1bGtBY3Rpb25Db250cm9sczogQnVsa0FjdGlvbkNvbnRyb2xbXTtcbiAgLyoqIFNldHMgYnVsayBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpdGVtcyBzZWxlY3RlZCBieSB1c2VyKS4gKi9cbiAgQElucHV0KCdidWxrQWN0aW9uQ29udHJvbHMnKVxuICBzZXQgX2J1bGtBY3Rpb25Db250cm9scyhidWxrQWN0aW9uQ29udHJvbHM6IEJ1bGtBY3Rpb25Db250cm9sW10pIHtcbiAgICB0aGlzLmJ1bGtBY3Rpb25Db250cm9scyA9IGJ1bGtBY3Rpb25Db250cm9scyB8fCBbXTtcbiAgfVxuXG4gIGhlYWRlckFjdGlvbkNvbnRyb2xzOiBIZWFkZXJBY3Rpb25Db250cm9sW107XG4gIC8qKiBTZXRzIGhlYWRlciBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZyb20gZGF0YSBncmlkIGhlYWRlcikuICovXG4gIEBJbnB1dCgnaGVhZGVyQWN0aW9uQ29udHJvbHMnKVxuICBzZXQgX2hlYWRlckFjdGlvbkNvbnRyb2xzKGhlYWRlckFjdGlvbkNvbnRyb2xzOiBIZWFkZXJBY3Rpb25Db250cm9sW10pIHtcbiAgICB0aGlzLmhlYWRlckFjdGlvbkNvbnRyb2xzID0gaGVhZGVyQWN0aW9uQ29udHJvbHMgfHwgW107XG4gIH1cblxuICAvKiogU2V0cyBpbml0aWFsIHNlYXJjaCB0ZXh0LiAqL1xuICBASW5wdXQoKVxuICBzZWFyY2hUZXh0OiBzdHJpbmcgPSAnJztcblxuICAvKiogRGV0ZXJtaW5lcyBpZiBjdXN0b20gY29sdW1ucyBidXR0b24gd2lsbCBiZSBlbmFibGVkLiAqL1xuICBASW5wdXQoKVxuICBjb25maWd1cmVDb2x1bW5zRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqIFNob3dzIHRoZSB3YXJuaW5nIGZvciB0aGUgc3ViLWFzc2V0cyBjb3VudGVyICovXG4gIEBJbnB1dCgpXG4gIHNob3dDb3VudGVyV2FybmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIG1vdXNlIGlzIG92ZXIgYSByb3cuICovXG4gIEBPdXRwdXQoKSByb3dNb3VzZU92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gbW91c2UgbGVhdmVzIGEgcm93LiAqL1xuICBAT3V0cHV0KCkgcm93TW91c2VMZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIHJvdyBpcyBjbGlja2VkLiAqL1xuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gZ3JpZCdzIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZC4gKi9cbiAgQE91dHB1dCgpIG9uQ29uZmlnQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYmVmb3JlIHRoZSBmaWx0ZXIgaXMgYXBwbGllZC4gKi9cbiAgQE91dHB1dCgpIG9uQmVmb3JlRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCBiZWZvcmUgdGhlIHNlYXJjaCBpcyBwZXJmb3JtZWQuICovXG4gIEBPdXRwdXQoKSBvbkJlZm9yZVNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGZpbHRlciBpcyBhcHBsaWVkIGluIGEgY29sdW1uLiAqL1xuICBAT3V0cHV0KCkgb25GaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBjb2x1bW5OYW1lPzogc3RyaW5nO1xuICAgIGRyb3Bkb3duPzogYW55O1xuICAgIGZpbHRlcmluZ01vZGlmaWVyPzogYW55O1xuICB9PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBpdGVtcyBzZWxlY3Rpb24gY2hhbmdlcy4gVGhlIGFycmF5IGNvbnRhaW5zIGtleXMgb2Ygc2VsZWN0ZWQgaXRlbXMgKGtleSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGJ5IGBzZWxlY3Rpb25QcmltYXJ5S2V5YCkuICovXG4gIEBPdXRwdXQoKSBpdGVtc1NlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIHJlbG9hZCBidXR0b24gaXMgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIG9uUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGN1c3RvbSBjb2x1bW4gaXMgYWRkZWQgKi9cbiAgQE91dHB1dCgpIG9uQWRkQ3VzdG9tQ29sdW1uID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21Db2x1bW5Db25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGEgY3VzdG9tIGNvbHVtbiBpcyByZW1vdmVkICovXG4gIEBPdXRwdXQoKSBvblJlbW92ZUN1c3RvbUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYWZ0ZXIgdGhlIGNvbHVtbiBmaWx0ZXIgaGFzIGJlZW4gcmVzZXQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uRmlsdGVyUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbj4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIHNvcnRpbmcgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25Tb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBwYWdlIHNpemUgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25QYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIG9yZGVyIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uUmVvcmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBjb2x1bW4gb3JkZXIgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQ29sdW1uRGlyZWN0aXZlKSBjb2x1bW5SZW5kZXJlcnM6IFF1ZXJ5TGlzdDxDb2x1bW5EaXJlY3RpdmU+O1xuXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbCcsIHsgc3RhdGljOiB0cnVlIH0pIHNjcm9sbENvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdpbmZpbml0ZVNjcm9sbENvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBpbmZpbml0ZVNjcm9sbENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcblxuICBsb2FkTW9yZUNvbXBvbmVudDogTG9hZE1vcmVDb21wb25lbnQ7XG5cbiAgY29sdW1uTmFtZXMgPSBbXTtcblxuICBzdHlsZXMgPSB7XG4gICAgdGFibGVDdXJzb3I6ICdhdXRvJyxcbiAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiB1bmRlZmluZWQsXG4gICAgZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uOiB1bmRlZmluZWRcbiAgfTtcblxuICBzZWFyY2hUZXh0JCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBmaWx0ZXJpbmdBcHBsaWVkID0gZmFsc2U7XG5cbiAgdG90YWxQYWdlc0NvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihJbmZpbml0eSk7XG4gIGhpZGVQYWdpbmF0aW9uJCA9IHRoaXMudG90YWxQYWdlc0NvdW50JC5waXBlKFxuICAgIG1hcCh0b3RhbFBhZ2VzQ291bnQgPT4gdG90YWxQYWdlc0NvdW50IDw9IDEpLFxuICAgIGRlbGF5KDApIC8vIHByZXZlbnRzIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgKTtcblxuICBzZWxlY3RlZEl0ZW1JZHM6IHN0cmluZ1tdID0gW107XG4gIGN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgYWxsU2VsZWN0ZWQ6IGZhbHNlLFxuICAgIGFsbERlc2VsZWN0ZWQ6IHRydWVcbiAgfTtcblxuICBidWlsdEluQWN0aW9uVHlwZSA9IHtcbiAgICBFZGl0OiBCdWlsdEluQWN0aW9uVHlwZS5FZGl0LFxuICAgIERlbGV0ZTogQnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlLFxuICAgIEV4cG9ydDogQnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XG4gIH07XG5cbiAgY29uZmlybVJlbW92ZUNvbHVtbkJ1dHRvbnM6IFBvcG92ZXJDb25maXJtQnV0dG9uc1tdID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBnZXR0ZXh0KCdDYW5jZWwnKSxcbiAgICAgIGFjdGlvbjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ1JlbW92ZWBjb2x1bW4sdmVyYmAnKSxcbiAgICAgIHN0YXR1czogJ2RhbmdlcicsXG4gICAgICBhY3Rpb246ICgpID0+IFByb21pc2UucmVzb2x2ZSh0cnVlKVxuICAgIH1cbiAgXTtcblxuICBpc0NvbmZpZ0NvbnRleHRLbm93biA9IGZhbHNlO1xuXG4gIC8qKiBQcm9kdWN0IGV4cGVyaWVuY2UgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyAqL1xuICBwcm9kdWN0RXhwZXJpZW5jZUV2ZW50OiBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50ID0geyBldmVudE5hbWU6IFBYX0VWRU5UX05BTUUgfTtcbiAgUFhfQUNUSU9OUyA9IFBYX0FDVElPTlM7XG5cbiAgcmVhZG9ubHkgc29ydENvbHVtblRpdGxlID0gZ2V0dGV4dCgnU29ydCBjb2x1bW4gXCJ7eyBuYW1lIH19XCInKTtcblxuICByZXNpemVIYW5kbGVNb3VzZURvd24kID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIHJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcHJpdmF0ZSBoZWFkZXJCZWluZ1Jlc2l6ZWQ6IHtcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmc7XG4gICAgZWw6IEhUTUxFbGVtZW50O1xuICB9O1xuICBAVmlld0NoaWxkcmVuKENka0hlYWRlckNlbGwsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwcml2YXRlIHRoUmVmczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBwcml2YXRlIHRoRWxzOiBIVE1MRWxlbWVudFtdO1xuXG4gIHByaXZhdGUgcmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudDogYm9vbGVhbjtcblxuICBwcml2YXRlIGNvbHVtbnNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZGVmYXVsdENvbHVtbnM6IENvbHVtbltdID0gW107XG5cbiAgcHJpdmF0ZSByZWxvYWRDb25maWd1cmF0aW9uJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBTRUFSQ0hfREVCT1VOQ0VfVElNRSA9IDUwMDtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlciwgdGFraW5nIGJvb2xlYW4gdmFsdWVzIHVzZWQgZm9yIGxvYWRpbmcgZGF0YSBncmlkIGRhdGEgd2l0aCBkZWJvdW5jZS5cbiAgICogRGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UuIFNldCB0byB0cnVlIGlmIGRhdGEgZ3JpZCBpcyB1c2luZyBpbmZpbml0ZSBzY3JvbGwgYW5kIHBhZ2Ugc2hvdWxkIGJlIHJlbG9hZGVkLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIG11bHRpcGxlIHRoaXMubG9hZERhdGEoKSBmdW5jdGlvbiBjYWxscy5cbiAgICovXG4gIHByaXZhdGUgdHJpZ2dlckxvYWREYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSlcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvblN0cmF0ZWd5OiBEYXRhR3JpZENvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgICBwcml2YXRlIGRhdGFHcmlkU2VydmljZTogRGF0YUdyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBic01vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZVxuICApIHtcbiAgICB0aGlzLnRyaWdnZXJMb2FkRGF0YS5waXBlKGRlYm91bmNlVGltZSgxKSwgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKHJlbG9hZCA9PiB7XG4gICAgICB0aGlzLmxvYWREYXRhKHJlbG9hZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb24kXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb25maWckKCkgPz8gb2YobnVsbCkpLFxuICAgICAgICB0YXAoY29uZmlnID0+IHtcbiAgICAgICAgICB0aGlzLnNldENvbHVtbnMoY29uZmlnKTtcbiAgICAgICAgICB0aGlzLnNldFBhZ2VTaXplKGNvbmZpZyk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdCghIXRoaXMuaW5maW5pdGVTY3JvbGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZGF0YVNvdXJjZS5zdGF0cyQpLFxuICAgICAgICB0YXAoc3RhdHMgPT4ge1xuICAgICAgICAgIHRoaXMuY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nTGFiZWxzUGFyYW1zKHN0YXRzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25MYWJlbFBhcmFtcyhzdGF0cyk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmlzQ29uZmlnQ29udGV4dEtub3duID0gISF0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneT8uaXNDb250ZXh0S25vd24oKTtcblxuICAgIHRoaXMuc2VhcmNoVGV4dCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5TRUFSQ0hfREVCT1VOQ0VfVElNRSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRhcChzZWFyY2hUZXh0ID0+IHtcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xuICAgICAgICAgIHRoaXMub25CZWZvcmVTZWFyY2guZW1pdCh0aGlzLnNlYXJjaFRleHQpO1xuICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5TRUFSQ0gsXG4gICAgICAgICAgICBzZWFyY2hJbnB1dDogc2VhcmNoVGV4dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgIGNvbWJpbmVMYXRlc3QodGhpcy5kYXRhU291cmNlLmRhdGEkLCB0aGlzLml0ZW1zU2VsZWN0LmFzT2JzZXJ2YWJsZSgpKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuICAgICAgICAuc3Vic2NyaWJlKChbZGF0YV0pID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZUVtcHR5ID0gZGF0YS5sZW5ndGggPT09IDA7XG5cbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgICAgICAgICBhbGxTZWxlY3RlZDogY3VycmVudFBhZ2VFbXB0eSA/IGZhbHNlIDogZGF0YS5ldmVyeShpdGVtID0+IHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSkpLFxuICAgICAgICAgICAgYWxsRGVzZWxlY3RlZDogY3VycmVudFBhZ2VFbXB0eSA/IHRydWUgOiBkYXRhLmV2ZXJ5KGl0ZW0gPT4gIXRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSkpXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uJC5uZXh0KCk7XG5cbiAgICBpZiAodGhpcy5yZWZyZXNoKSB7XG4gICAgICB0aGlzLnJlZnJlc2gucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9jZXNzQW5kUGVyc2lzdENvbmZpZ0NoYW5nZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoZXZlbnQpIHtcbiAgICBpZiAoXG4gICAgICAoKCFldmVudC5fYWN0aW9uQ29udHJvbHMgJiYgIWV2ZW50LnNlYXJjaFRleHQpIHx8IGV2ZW50Ll9hY3Rpb25Db250cm9scz8uZmlyc3RDaGFuZ2UpICYmXG4gICAgICB0aGlzLmNvbHVtbnNJbml0aWFsaXplZFxuICAgICkge1xuICAgICAgY29uc3QgcmVsb2FkID0gISFldmVudC5faW5maW5pdGVTY3JvbGw/LmN1cnJlbnRWYWx1ZSAmJiAhZXZlbnQuX2luZmluaXRlU2Nyb2xsPy5maXJzdENoYW5nZTtcbiAgICAgIHRoaXMudHJpZ2dlckxvYWREYXRhLmVtaXQocmVsb2FkKTtcbiAgICB9XG4gICAgaWYgKCEhZXZlbnQuX2NvbHVtbnMgJiYgIWV2ZW50Ll9jb2x1bW5zLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb24kLm5leHQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgICB0aGlzLnVwZGF0ZVRoRWxzKCk7XG4gICAgdGhpcy5zZXR1cFJlc2l6ZUhhbmRsZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBzZXRDb2x1bW5zKGNvbmZpZzogR3JpZENvbmZpZykge1xuICAgIGlmICghIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5ICYmICFpc0VtcHR5KHRoaXMuX2NvbHVtbnMpKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRhdGFHcmlkU2VydmljZS5hcHBseUNvbmZpZ1RvQ29sdW1ucyhjb25maWcsIHRoaXMuX2NvbHVtbnMpO1xuICAgICAgdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLl9jb2x1bW5zIHx8IFtdO1xuICAgICAgdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgPSB0aGlzLmNvbHVtbnNJbml0aWFsaXplZCB8fCAhIXRoaXMuX2NvbHVtbnM7XG4gICAgfVxuXG4gICAgdGhpcy5kZWZhdWx0Q29sdW1ucyA9IHRoaXMuY29sdW1ucyB8fCBbXTtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIHNldFBhZ2VTaXplKGNvbmZpZzogR3JpZENvbmZpZykge1xuICAgIGlmICghIWNvbmZpZz8ucGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0ge1xuICAgICAgICAuLi50aGlzLnBhZ2luYXRpb24sXG4gICAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IGdldCh0aGlzLnBhZ2luYXRpb24sICdwYWdlU2l6ZScpO1xuICAgIGlmIChcbiAgICAgIHRoaXMucGFnaW5hdGlvbiAmJlxuICAgICAgIXRoaXMucG9zc2libGVQYWdlU2l6ZXMuZmluZChwb3NzaWJsZVBhZ2VTaXplID0+IHBvc3NpYmxlUGFnZVNpemUgPT09IHBhZ2VTaXplKVxuICAgICkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIHBhZ2VTaXplOiB0aGlzLm1pblBvc3NpYmxlUGFnZVNpemUgfTtcbiAgICB9XG4gIH1cblxuICBvcGVuQ3VzdG9tQ29sdW1uTW9kYWwoKTogdm9pZCB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coQ29uZmlndXJlQ3VzdG9tQ29sdW1uQ29tcG9uZW50LCB7XG4gICAgICBjbGFzczogJ21vZGFsLXNtJyxcbiAgICAgIGFyaWFEZXNjcmliZWRieTogJ21vZGFsLWJvZHknLFxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdtb2RhbC10aXRsZScsXG4gICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlLFxuICAgICAgaW5pdGlhbFN0YXRlOiB7XG4gICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1uc1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbW9kYWxSZWYuY29udGVudC5vbkFkZEN1c3RvbUNvbHVtblxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoY3VzdG9tQ29sdW1uQ29uZmlnOiBDdXN0b21Db2x1bW5Db25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA9IHRoaXMuY29sdW1ucy5pbmRleE9mKFxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5wb3NpdGlvbkZpeGVkKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZShcbiAgICAgICAgICAgIGZpcnN0Rml4ZWRDb2x1bVBvc2l0aW9uID4gLTEgPyBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA6IHRoaXMuY29sdW1ucy5sZW5ndGgsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgbmV3IEN1c3RvbUNvbHVtbihjdXN0b21Db2x1bW5Db25maWcpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQUREX0NVU1RPTV9DT0xVTU4sXG4gICAgICAgICAgICBjb2x1bW46IGN1c3RvbUNvbHVtbkNvbmZpZy5oZWFkZXIgfHwgY3VzdG9tQ29sdW1uQ29uZmlnLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbChtb2RhbFJlZi5vbkhpZGRlbilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5vbkFkZEN1c3RvbUNvbHVtbi5lbWl0KGV2ZW50KSk7XG4gIH1cblxuICBhc3luYyByZW1vdmVDdXN0b21Db2x1bW4oXG4gICAgcG9Db25maXJtOiBQb3BvdmVyQ29uZmlybUNvbXBvbmVudCxcbiAgICBjb2x1bW46IENvbHVtbixcbiAgICBkZENvbmZpZ3VyZUNvbHVtbnM6IEJzRHJvcGRvd25EaXJlY3RpdmVcbiAgKSB7XG4gICAgZGRDb25maWd1cmVDb2x1bW5zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICAgIHBvQ29uZmlybS5tZXNzYWdlID0gZ2V0dGV4dCgnRG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgY29sdW1uPycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW1vdmU6IGJvb2xlYW4gPSBhd2FpdCBwb0NvbmZpcm0uc2hvdyh0aGlzLmNvbmZpcm1SZW1vdmVDb2x1bW5CdXR0b25zKTtcbiAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sPy5uYW1lICE9PSBjb2x1bW4/Lm5hbWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5vblJlbW92ZUN1c3RvbUNvbHVtbi5lbWl0KGNvbHVtbik7XG4gICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuUkVNT1ZFX0NVU1RPTV9DT0xVTU4sXG4gICAgICAgICAgY29sdW1uOiBjb2x1bW4uaGVhZGVyIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiAoZGRDb25maWd1cmVDb2x1bW5zLmF1dG9DbG9zZSA9IHRydWUpLCAwKTtcbiAgfVxuXG4gIHRyYWNrQnlOYW1lKGluZGV4LCBpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0ubmFtZTtcbiAgfVxuXG4gIHJlc29sdmVDZWxsVmFsdWUocm93LCBwYXRoKSB7XG4gICAgcmV0dXJuIGZsb3coW1xuICAgICAgeCA9PiB0aGlzLmRhdGFTb3VyY2UucmVzb2x2ZVZhbHVlKHgsIHBhdGgpLFxuICAgICAgdGhpcy5kYXRhU291cmNlLnJlc29sdmVGdW5jdGlvbixcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5ub3JtYWxpemVOaWxcbiAgICBdKShyb3cpO1xuICB9XG5cbiAgY2hhbmdlU29ydE9yZGVyKGNvbHVtbk5hbWUpIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IGNvbHVtbk5hbWUpO1xuXG4gICAgaWYgKGNvbHVtbikge1xuICAgICAgY29uc3QgeyBzb3J0T3JkZXIgfSA9IGNvbHVtbjtcblxuICAgICAgaWYgKCFzb3J0T3JkZXIpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgU29ydGluZ09yZGVyLkFTQyk7XG4gICAgICB9IGVsc2UgaWYgKHNvcnRPcmRlciA9PT0gU29ydGluZ09yZGVyLkFTQykge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnRpbmcoW2NvbHVtbk5hbWVdLCBTb3J0aW5nT3JkZXIuREVTQyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnRpbmcoW2NvbHVtbk5hbWVdLCAnJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlU29ydGluZyhjb2x1bW5OYW1lczogc3RyaW5nW10sIHNvcnRPcmRlcjogU29ydE9yZGVyKSB7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9TT1JUSU5HX09SREVSLFxuICAgICAgY29sdW1uczogY29sdW1uTmFtZXMsXG4gICAgICBzb3J0T3JkZXI6IHNvcnRPcmRlciA9PT0gJycgPyAnbm9uZScgOiBzb3J0T3JkZXJcbiAgICB9KTtcblxuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbik6IENvbHVtbiA9PiB7XG4gICAgICBpZiAoY29sdW1uTmFtZXMuaW5jbHVkZXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmNvbHVtbiwgc29ydE9yZGVyIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfSk7XG4gICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlKCdzb3J0Jyk7XG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyKGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllcikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5BUFBMWV9GSUxURVIsXG4gICAgICBjb2x1bW46IGNvbHVtbk5hbWUsXG4gICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgIH0pO1xuICAgIHRoaXMub25CZWZvcmVGaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllciB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHtcbiAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXIsXG4gICAgICBwYXlsb2FkOiB7IGZpbHRlcmluZ01vZGlmaWVyIH1cbiAgICB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24sIGZpbHRlcmluZ01vZGlmaWVyIH0pO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXIoY29sdW1uTmFtZSwgZHJvcGRvd24pIHtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5SRVNFVF9GSUxURVIsIGNvbHVtbjogY29sdW1uTmFtZSB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHsgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlciB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24gfSk7XG4gIH1cblxuICBjbGVhckZpbHRlcnMocmVsb2FkID0gdHJ1ZSkge1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFxuICAgICAgdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpLFxuICAgICAge1xuICAgICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLlJlc2V0RmlsdGVyXG4gICAgICB9LFxuICAgICAgcmVsb2FkXG4gICAgKTtcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoe30pO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLkNMRUFSX0ZJTFRFUiB9KTtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcmluZyhcbiAgICBjb2x1bW5OYW1lczogc3RyaW5nW10sXG4gICAgYWN0aW9uOiB7XG4gICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlO1xuICAgICAgcGF5bG9hZD86IHsgZmlsdGVyaW5nTW9kaWZpZXI6IEZpbHRlcmluZ01vZGlmaWVyIH07XG4gICAgfSxcbiAgICByZWxvYWQgPSB0cnVlXG4gICkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgIGlmIChjb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgLi4uKGFjdGlvbi50eXBlID09PSBGaWx0ZXJpbmdBY3Rpb25UeXBlLkFwcGx5RmlsdGVyXG4gICAgICAgICAgICA/IGFjdGlvbi5wYXlsb2FkLmZpbHRlcmluZ01vZGlmaWVyXG4gICAgICAgICAgICA6IHRoaXMub25SZXNldEZpbHRlckFjdGlvbihjb2x1bW4pKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpO1xuICAgIGlmIChyZWxvYWQpIHtcbiAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpIHtcbiAgICB0aGlzLmZpbHRlcmluZ0FwcGxpZWQgPSB0aGlzLmNvbHVtbnMuc29tZSh0aGlzLmlzQ29sdW1uRmlsdGVyaW5nQXBwbGllZCk7XG4gIH1cblxuICBpc0NvbHVtbkZpbHRlcmluZ0FwcGxpZWQoY29sdW1uOiBDb2x1bW4pOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGZpbHRlcmFibGUsIGZpbHRlclByZWRpY2F0ZSwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9ID0gY29sdW1uO1xuXG4gICAgcmV0dXJuICEhKGZpbHRlcmFibGUgJiYgKGZpbHRlclByZWRpY2F0ZSB8fCBleHRlcm5hbEZpbHRlclF1ZXJ5KSk7XG4gIH1cblxuICB1cGRhdGVQYWdpbmF0aW9uKHsgaXRlbXNQZXJQYWdlLCBwYWdlIH0pIHtcbiAgICBjb25zdCBjb25maWdDaGFuZ2VkID0gdGhpcy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSAhPT0gaXRlbXNQZXJQYWdlO1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBwYWdlU2l6ZTogaXRlbXNQZXJQYWdlLCBjdXJyZW50UGFnZTogcGFnZSB9O1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICBpZiAoY29uZmlnQ2hhbmdlZCkge1xuICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlKCdwYWdpbmF0aW9uJyk7XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9QQUdJTkFUSU9OLCBpdGVtc1BlclBhZ2UsIHBhZ2UgfSk7XG4gIH1cblxuICBjbGlja1JlbG9hZCgpIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLnJlbG9hZCgpO1xuICAgIHRoaXMub25SZWxvYWQubmV4dCgpO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLlJFTE9BRCB9KTtcbiAgfVxuXG4gIHJlbG9hZCgpIHtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgY3VycmVudFBhZ2U6IDEgfTtcbiAgICB0aGlzLnJlY3JlYXRlTG9hZE1vcmVDb21wb25lbnQgPSB0cnVlO1xuICAgIHRoaXMubG9hZERhdGEodHJ1ZSk7XG4gICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICB9XG5cbiAgbG9hZE5leHRQYWdlKCk6IFByb21pc2U8SVJlc3VsdExpc3Q8b2JqZWN0Pj4ge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBjdXJyZW50UGFnZTogdGhpcy5wYWdpbmF0aW9uLm5leHRQYWdlIH07XG5cbiAgICB0aGlzLmxvYWREYXRhKCk7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLnJlc3VsdExpc3QkXG4gICAgICAucGlwZSh0YWtlKDEpKSAvLyBpbiBvcmRlciBmb3IgYHRvUHJvbWlzZWAgdG8gd29yaywgdGhlIG9ic2VydmFibGUgbmVlZHMgdG8gY29tcGxldGVcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgcGFnaW5nOiB7XG4gICAgICAgICAgICAuLi5yZXN1bHQucGFnaW5nLFxuICAgICAgICAgICAgbmV4dDogdGhpcy5sb2FkTmV4dFBhZ2UuYmluZCh0aGlzKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJUmVzdWx0TGlzdDxvYmplY3Q+O1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRDZWxsUmVuZGVyZXJTcGVjKHsgdmFsdWUsIHJvdywgY29sdW1uTmFtZSB9KTogQ2VsbFJlbmRlcmVyU3BlYyB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENlbGxSZW5kZXJlclNwZWMoeyB0eXBlOiAnQ0VMTCcsIHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk7XG4gIH1cblxuICBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjKHsgdmFsdWUsIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIHJldHVybiB0aGlzLl9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZTogJ0hFQURFUicsIHZhbHVlLCByb3c6IHVuZGVmaW5lZCwgY29sdW1uTmFtZSB9KTtcbiAgfVxuXG4gIGdldEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWMoeyBjb2x1bW4sIGRyb3Bkb3duIH0pOiBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVuZGVyZXI6XG4gICAgICAgIGdldCh0aGlzLmdldENvbHVtblJlbmRlcmVyKGNvbHVtbiksICdmaWx0ZXJpbmdGb3JtUmVuZGVyZXJEZWYudGVtcGxhdGUnKSB8fFxuICAgICAgICBjb2x1bW4uZmlsdGVyaW5nRm9ybVJlbmRlcmVyQ29tcG9uZW50LFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBwcm9wZXJ0eTogY29sdW1uLFxuICAgICAgICBhcHBseUZpbHRlcjogdGhpcy5hcHBseUZpbHRlci5iaW5kKHRoaXMsIGNvbHVtbi5uYW1lLCBkcm9wZG93biksXG4gICAgICAgIHJlc2V0RmlsdGVyOiB0aGlzLnJlc2V0RmlsdGVyLmJpbmQodGhpcywgY29sdW1uLm5hbWUsIGRyb3Bkb3duKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXRBbGxJdGVtc1NlbGVjdGVkKHNlbGVjdGVkKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnNlbGVjdGlvbiRcbiAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZpbHRlcmVkRGF0YUlkcyB9KSA9PiB0aGlzLnNldEl0ZW1zU2VsZWN0ZWQoZmlsdGVyZWREYXRhSWRzLCBzZWxlY3RlZCkpO1xuICB9XG5cbiAgc2V0QWxsSXRlbXNJbkN1cnJlbnRQYWdlU2VsZWN0ZWQoc2VsZWN0ZWQpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnNldEl0ZW1zU2VsZWN0ZWQoZGF0YSwgc2VsZWN0ZWQpKTtcbiAgfVxuXG4gIHNldEl0ZW1zU2VsZWN0ZWQoaXRlbXM6IGFueVtdLCBzZWxlY3RlZCkge1xuICAgIGNvbnN0IGl0ZW1JZHMgPSBpdGVtcy5tYXAoKGl0ZW06IG9iamVjdCB8IHN0cmluZykgPT5cbiAgICAgIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyA/IGl0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XSA6IGl0ZW1cbiAgICApO1xuXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1JZHMgPSBzZWxlY3RlZFxuICAgICAgPyB1bmlvbih0aGlzLnNlbGVjdGVkSXRlbUlkcywgaXRlbUlkcylcbiAgICAgIDogd2l0aG91dCh0aGlzLnNlbGVjdGVkSXRlbUlkcywgLi4uaXRlbUlkcyk7XG4gICAgdGhpcy5pdGVtc1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzKTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IFtdO1xuICAgIHRoaXMuaXRlbXNTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbUlkcyk7XG4gIH1cblxuICBpc0l0ZW1TZWxlY3RlZChpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtSWRzLmluY2x1ZGVzKGl0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XSk7XG4gIH1cblxuICBvbkNvbHVtbkRyb3AoeyBwcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXggfSkge1xuICAgIGNvbnN0IGRpZmZlcmVudEluZGV4ID0gcHJldmlvdXNJbmRleCAhPT0gY3VycmVudEluZGV4O1xuXG4gICAgaWYgKGRpZmZlcmVudEluZGV4KSB7XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU9SREVSX0NPTFVNTlMsXG4gICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW5OYW1lc1twcmV2aW91c0luZGV4XVxuICAgICAgfSk7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuc3BsaWNlKHByZXZpb3VzSW5kZXgsIDEpO1xuICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZShjdXJyZW50SW5kZXgsIDAsIGNvbHVtblswXSk7XG4gICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoJ3Jlb3JkZXJDb2x1bW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKCk7XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpIHtcbiAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxuICAgICAgICB0aGlzLmNvbHVtbnNcbiAgICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4udmlzaWJsZSlcbiAgICAgICAgICAubWFwKCh7IGdyaWRUcmFja1NpemUgfSkgPT4gZ3JpZFRyYWNrU2l6ZSlcbiAgICAgICAgICAuam9pbignICcpXG4gICAgICApLFxuICAgICAgZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uOiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXG4gICAgICAgIGAxIC8gc3BhbiAke3RoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5sZW5ndGh9YFxuICAgICAgKVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVUaEVscygpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGhFbHMgPSB0aGlzLnRoUmVmc1xuICAgICAgICA/IHRoaXMudGhSZWZzLnRvQXJyYXkoKS5tYXAoKHsgbmF0aXZlRWxlbWVudCB9KSA9PiBuYXRpdmVFbGVtZW50KVxuICAgICAgICA6IFtdO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8gVG8gYmUgcmVtb3ZlZCB3aGVuIGNvbHVtbnMgYXJlIHRyYW5zZm9ybWVkIHRvIG9ic2VydmFibGVzLlxuICBpc0Ryb3BEb3duUGxhY2VkUmlnaHQoY29sdW1uOiBDb2x1bW4pIHtcbiAgICByZXR1cm4gKFxuICAgICAgaW5kZXhPZihcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSksXG4gICAgICAgIGNvbHVtblxuICAgICAgKSA+XG4gICAgICB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlKS5sZW5ndGggLyAyXG4gICAgKTtcbiAgfVxuXG4gIGVtaXRDb25maWdDaGFuZ2UoZXZlbnRUeXBlPzogR3JpZEV2ZW50VHlwZSkge1xuICAgIGlmICh0aGlzLmNvbHVtbnNJbml0aWFsaXplZCkge1xuICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAodGhpcy5tYXBDb2x1bW5Ub0NvbmZpZy5iaW5kKHRoaXMpKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHsgY29sdW1ucywgcGFnaW5hdGlvbjogdGhpcy5wYWdpbmF0aW9uIH07XG4gICAgICB0aGlzLm9uQ29uZmlnQ2hhbmdlLmVtaXQoY29uZmlnKTtcbiAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3NvcnQnOlxuICAgICAgICAgIHRoaXMub25Tb3J0LmVtaXQoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGFnaW5hdGlvbic6XG4gICAgICAgICAgdGhpcy5vblBhZ2VTaXplQ2hhbmdlLmVtaXQoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVvcmRlckNvbHVtbic6XG4gICAgICAgICAgdGhpcy5vbkNvbHVtblJlb3JkZXJlZC5lbWl0KGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NoYW5nZUNvbHVtblZpc2liaWxpdHknOlxuICAgICAgICAgIHRoaXMub25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlLmVtaXQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyRXZlbnQoZXZlbnREYXRhKSB7XG4gICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudCh0aGlzLnByb2R1Y3RFeHBlcmllbmNlRXZlbnQ/LmV2ZW50TmFtZSB8fCBQWF9FVkVOVF9OQU1FLCB7XG4gICAgICAuLi50aGlzLnByb2R1Y3RFeHBlcmllbmNlRXZlbnQ/LmRhdGEsXG4gICAgICAuLi5ldmVudERhdGFcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZXNldEZpbHRlckFjdGlvbihjb2x1bW46IENvbHVtbikge1xuICAgIHRoaXMub25Db2x1bW5GaWx0ZXJSZXNldC5lbWl0KGNvbHVtbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlclByZWRpY2F0ZTogdW5kZWZpbmVkLFxuICAgICAgZXh0ZXJuYWxGaWx0ZXJRdWVyeTogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwQ29sdW1uVG9Db25maWcoY29sdW1uOiBDb2x1bW4pOiBDb2x1bW5Db25maWcgfCBDdXN0b21Db2x1bW5Db25maWcge1xuICAgIGxldCBjb25maWc7XG4gICAgaWYgKGNvbHVtbi5jdXN0b20pIHtcbiAgICAgIGNvbnN0IHsgdmlzaWJsZSwgc29ydE9yZGVyLCBuYW1lLCBleHRlcm5hbEZpbHRlclF1ZXJ5LCBoZWFkZXIsIHBhdGggfSA9IGNvbHVtbjtcbiAgICAgIGNvbmZpZyA9IHtcbiAgICAgICAgdmlzaWJsZSxcbiAgICAgICAgc29ydE9yZGVyLFxuICAgICAgICBuYW1lLFxuICAgICAgICBmaWx0ZXI6IHsgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9LFxuICAgICAgICBoZWFkZXIsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGN1c3RvbTogdHJ1ZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyB2aXNpYmxlLCBzb3J0T3JkZXIsIG5hbWUsIGV4dGVybmFsRmlsdGVyUXVlcnkgfSA9IGNvbHVtbjtcbiAgICAgIGNvbmZpZyA9IHsgdmlzaWJsZSwgc29ydE9yZGVyLCBuYW1lLCBmaWx0ZXI6IHsgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9IH07XG4gICAgfVxuXG4gICAgaWYgKGlzRW1wdHkoY29uZmlnPy5maWx0ZXI/LmV4dGVybmFsRmlsdGVyUXVlcnkpKSB7XG4gICAgICBkZWxldGUgY29uZmlnLmZpbHRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGF0YShyZWxvYWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJvd3MsXG4gICAgICBjb2x1bW5zLFxuICAgICAgcGFnaW5hdGlvbixcbiAgICAgIHNlYXJjaFRleHQsXG4gICAgICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICAgICAgc2VsZWN0YWJsZSxcbiAgICAgIHNlbGVjdGlvblByaW1hcnlLZXksXG4gICAgICBpbmZpbml0ZVNjcm9sbFxuICAgIH0gPSB0aGlzO1xuXG4gICAgdGhpcy5kYXRhU291cmNlLmxvYWREYXRhKHtcbiAgICAgIHJvd3MsXG4gICAgICBjb2x1bW5zLFxuICAgICAgcGFnaW5hdGlvbixcbiAgICAgIHNlYXJjaFRleHQsXG4gICAgICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICAgICAgc2VsZWN0YWJsZSxcbiAgICAgIHNlbGVjdGlvblByaW1hcnlLZXksXG4gICAgICBpbmZpbml0ZVNjcm9sbCxcbiAgICAgIHJlbG9hZFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zKCkge1xuICAgIGNvbnN0IHNwZWNpYWxDb2x1bW4gPSB7XG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwb3NpdGlvbkZpeGVkOiB0cnVlXG4gICAgfTtcbiAgICBjb25zdCBjaGVja2JveENvbHVtbiA9IHRoaXMuc2VsZWN0YWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3BlY2lhbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBTcGVjaWFsQ29sdW1uTmFtZS5DaGVja2JveCxcbiAgICAgICAgICBncmlkVHJhY2tTaXplOiAnMzJweCdcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWN0aW9uc0NvbHVtbiA9XG4gICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzPy5sZW5ndGggPiAwXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uc3BlY2lhbENvbHVtbixcbiAgICAgICAgICAgIG5hbWU6IFNwZWNpYWxDb2x1bW5OYW1lLkFjdGlvbnMsXG4gICAgICAgICAgICBncmlkVHJhY2tTaXplOiB0aGlzLmFjdGlvbkNvbnRyb2xzLmxlbmd0aCA+IDIgPyAnNTZweCcgOiAnbWlubWF4KDQwcHgsIGF1dG8pJ1xuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjb2x1bW5zID0gW2NoZWNrYm94Q29sdW1uLCAuLi50aGlzLmNvbHVtbnMsIGFjdGlvbnNDb2x1bW5dXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKHRoaXMud2l0aENvbHVtbkRlZmF1bHRzKTtcblxuICAgIHRoaXMuY29sdW1ucyA9IHVuaXFCeShjb2x1bW5zLCAnbmFtZScpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uTmFtZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgIHRoaXMudXBkYXRlVGhFbHMoKTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZ0FwcGxpZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aENvbHVtbkRlZmF1bHRzKGNvbHVtbik6IENvbHVtbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSBjb2x1bW4uZGF0YVR5cGUgfHwgQ29sdW1uRGF0YVR5cGUuVGV4dFNob3J0O1xuICAgIGNvbnN0IHsgaGVhZGVyQ1NTQ2xhc3NOYW1lLCBjZWxsQ1NTQ2xhc3NOYW1lIH0gPSBjb2x1bW47XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0T3JkZXI6ICcnLFxuICAgICAgZmlsdGVyYWJsZTogZmFsc2UsXG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBkYXRhVHlwZSxcbiAgICAgIGdyaWRUcmFja1NpemU6XG4gICAgICAgIGNvbHVtbi5ncmlkVHJhY2tTaXplIHx8XG4gICAgICAgIGBtaW5tYXgoJHttaW5Db2x1bW5HcmlkVHJhY2tTaXplfXB4LCAke3JhdGlvc0J5Q29sdW1uVHlwZXNbZGF0YVR5cGVdfWZyKWAsXG4gICAgICBoZWFkZXJDU1NDbGFzc05hbWU6XG4gICAgICAgICh0eXBlb2YgaGVhZGVyQ1NTQ2xhc3NOYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gaGVhZGVyQ1NTQ2xhc3NOYW1lLnNwbGl0KCcgJylcbiAgICAgICAgICA6IGhlYWRlckNTU0NsYXNzTmFtZSkgfHwgW10sXG4gICAgICBjZWxsQ1NTQ2xhc3NOYW1lOlxuICAgICAgICAodHlwZW9mIGNlbGxDU1NDbGFzc05hbWUgPT09ICdzdHJpbmcnID8gY2VsbENTU0NsYXNzTmFtZS5zcGxpdCgnICcpIDogY2VsbENTU0NsYXNzTmFtZSkgfHxcbiAgICAgICAgW11cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5OYW1lcygpIHtcbiAgICB0aGlzLmNvbHVtbk5hbWVzID0gdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJlc2l6ZUhhbmRsZSgpIHtcbiAgICBjb25zdCByZXNpemVIYW5kbGVEcmFnJCA9IHRoaXMucmVzaXplSGFuZGxlTW91c2VEb3duJC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmNsZWFyTW91c2VIaWdobGlnaHRzKCkpLFxuICAgICAgbWVyZ2VNYXAoKHsgZXZlbnQsIHRhcmdldENvbHVtbk5hbWUgfSkgPT4ge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbi5uYW1lID09PSB0YXJnZXRDb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTogdW5pb24oY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZSwgWydoZWFkZXItLWJlaW5nLXJlc2l6ZWQnXSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgPSB7XG4gICAgICAgICAgY29sdW1uTmFtZTogdGFyZ2V0Q29sdW1uTmFtZSxcbiAgICAgICAgICBlbDogZXZlbnQudGFyZ2V0Py5wYXJlbnROb2RlXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7XG4gICAgICAgICAgLi4udGhpcy5zdHlsZXMsXG4gICAgICAgICAgdGFibGVDdXJzb3I6ICdjb2wtcmVzaXplJ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5jbGVhck1vdXNlSGlnaGxpZ2h0cygpKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5yZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJClcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJlc2l6ZUhhbmRsZURyYWckLnN1YnNjcmliZSgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbiwgaSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmhlYWRlckJlaW5nUmVzaXplZCAmJiBjb2x1bW4ubmFtZSA9PT0gdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQuY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyRGl2OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgc2Nyb2xsQ29udGFpbmVyRWwncyBvZmZzZXQgbGVmdCByZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQuXG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsT2Zmc2V0ID0gc2Nyb2xsQ29udGFpbmVyRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cbiAgICAgICAgICAgIC8vIEFkanVzdCB3aXRoIHRoZSBzY3JvbGxDb250YWluZXJFbCBob3Jpem9udGFsIHNjcm9sbCBwb3NpdGlvbi5cbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxTY3JvbGxPZmZzZXQgPSBzY3JvbGxDb250YWluZXJEaXYuc2Nyb2xsTGVmdCAtIGhvcml6b250YWxPZmZzZXQ7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgbGVmdCBvZmZzZXQgb2YgdGhlIHJlc2l6ZWQgaGVhZGVyLlxuICAgICAgICAgICAgY29uc3QgaGVhZGVyT2Zmc2V0TGVmdCA9IHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkLmVsLm9mZnNldExlZnQgfHwgMDtcblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXNpcmVkIHdpZHRoLlxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0ICsgZXZlbnQuY2xpZW50WCAtIGhlYWRlck9mZnNldExlZnQ7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb2x1bW4gb2JqZWN0IHdpdGggdGhlIG5ldyBzaXplIHZhbHVlLCBlbmZvcmNlIG91ciBtaW5pbXVtIHNpemUuXG4gICAgICAgICAgICAgIGdyaWRUcmFja1NpemU6IGAke01hdGgubWF4KG1pbkNvbHVtbkdyaWRUcmFja1NpemUsIHdpZHRoKX1weGBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm9yIHRoZSBvdGhlciBoZWFkZXJzIHdoaWNoIGRvbid0IGhhdmUgYSBzZXQgd2lkdGgsIGZpeCBpdCB0byB0aGVpciBjb21wdXRlZCB3aWR0aC5cbiAgICAgICAgICBpZiAoY29sdW1uLmdyaWRUcmFja1NpemUuc3RhcnRzV2l0aCgnbWlubWF4JykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgLy8gaXNuJ3QgZml4ZWQgeWV0IChpdCB3b3VsZCBiZSBhIHB4IHZhbHVlKVxuICAgICAgICAgICAgICBncmlkVHJhY2tTaXplOiBgJHtfcGFyc2VJbnQodGhpcy50aEVsc1tpXS5jbGllbnRXaWR0aCl9cHhgXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgY29sdW1uIHNpemVzLlxuICAgICAgICAgKiBOb3RlOiBncmlkLXRlbXBsYXRlLWNvbHVtbnMgc2V0cyB0aGUgd2lkdGggZm9yIGFsbCBjb2x1bW5zIGluIG9uZSB2YWx1ZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXBkYXRlR3JpZENvbHVtbnNTaXplKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uLm5hbWUgPT09IHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkLmNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgaGVhZGVyQ1NTQ2xhc3NOYW1lOiB3aXRob3V0KGNvbHVtbi5oZWFkZXJDU1NDbGFzc05hbWUsICdoZWFkZXItLWJlaW5nLXJlc2l6ZWQnKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7XG4gICAgICAgICAgLi4udGhpcy5zdHlsZXMsXG4gICAgICAgICAgdGFibGVDdXJzb3I6ICdhdXRvJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhck1vdXNlSGlnaGxpZ2h0cygpIHtcbiAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldENlbGxSZW5kZXJlclNwZWMoeyB0eXBlLCB2YWx1ZSwgcm93LCBjb2x1bW5OYW1lIH0pOiBDZWxsUmVuZGVyZXJTcGVjIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIGNvbnN0IGNvbHVtblJlbmRlcmVyID0gdGhpcy5nZXRDb2x1bW5SZW5kZXJlcihjb2x1bW4pO1xuICAgIGNvbnN0IHJlbmRlcmVyVGVtcGxhdGUgPSBnZXQoXG4gICAgICBjb2x1bW5SZW5kZXJlcixcbiAgICAgIGAke3R5cGUgPT09ICdIRUFERVInID8gJ2hlYWRlckNlbGxSZW5kZXJlckRlZicgOiAnY2VsbFJlbmRlcmVyRGVmJ30udGVtcGxhdGVgXG4gICAgKTtcblxuICAgIGNvbnN0IHsgY2VsbFJlbmRlcmVyQ29tcG9uZW50LCBoZWFkZXJDZWxsUmVuZGVyZXJDb21wb25lbnQgfSA9IGNvbHVtbjtcbiAgICBjb25zdCByZW5kZXJlckNvbXBvbmVudCA9XG4gICAgICB0eXBlID09PSAnSEVBREVSJyA/IGhlYWRlckNlbGxSZW5kZXJlckNvbXBvbmVudCA6IGNlbGxSZW5kZXJlckNvbXBvbmVudDtcblxuICAgIHJldHVybiB7XG4gICAgICByZW5kZXJlcjogcmVuZGVyZXJUZW1wbGF0ZSB8fCByZW5kZXJlckNvbXBvbmVudCxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGl0ZW06IHJvdyxcbiAgICAgICAgcHJvcGVydHk6IGNvbHVtblxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtblJlbmRlcmVyKGNvbHVtbik6IENvbHVtbkRpcmVjdGl2ZSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uUmVuZGVyZXJzLnRvQXJyYXkoKS5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gY29sdW1uLm5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJpbmdMYWJlbHNQYXJhbXMoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIHRoaXMuZmlsdGVyaW5nTGFiZWxzUGFyYW1zID0ge1xuICAgICAgZmlsdGVyZWRJdGVtc0NvdW50OiBzdGF0cy5maWx0ZXJlZFNpemUsXG4gICAgICBhbGxJdGVtc0NvdW50OiBzdGF0cy5zaXplXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnaW5hdGlvbkxhYmVsUGFyYW1zKHN0YXRzOiBEYXRhU291cmNlU3RhdHMpIHtcbiAgICBpZiAoc3RhdHMubmV4dFBhZ2UpIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBuZXh0UGFnZTogc3RhdHMubmV4dFBhZ2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlRmlyc3RJdGVtSWR4ID0gKHN0YXRzLmN1cnJlbnRQYWdlIC0gMSkgKiBzdGF0cy5maXJzdFBhZ2VTaXplICsgMTtcbiAgICB0aGlzLnBhZ2luYXRpb25MYWJlbFBhcmFtcyA9IHtcbiAgICAgIHBhZ2VGaXJzdEl0ZW1JZHgsXG4gICAgICBwYWdlTGFzdEl0ZW1JZHg6IHBhZ2VGaXJzdEl0ZW1JZHggKyAoc3RhdHMuY3VycmVudFBhZ2VTaXplIC0gMSksXG4gICAgICBpdGVtc1RvdGFsOiBzdGF0cy5maWx0ZXJlZFNpemVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2FkTW9yZUNvbXBvbmVudChzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbCAmJlxuICAgICAgc3RhdHMgJiZcbiAgICAgIHN0YXRzLm5leHRQYWdlICYmXG4gICAgICAoIXRoaXMubG9hZE1vcmVDb21wb25lbnQgfHwgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50KVxuICAgICkge1xuICAgICAgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50ID0gZmFsc2U7XG4gICAgICB0aGlzLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5PGFueT4gPVxuICAgICAgICB0aGlzLmNmci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMb2FkTW9yZUNvbXBvbmVudCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIExvYWRNb3JlQ29tcG9uZW50O1xuICAgICAgaW5zdGFuY2UudXNlSW50ZXJzZWN0aW9uID0gdGhpcy5pbmZpbml0ZVNjcm9sbCA9PT0gJ2F1dG8nIHx8IHRoaXMuaW5maW5pdGVTY3JvbGwgPT09ICdoaWRkZW4nO1xuICAgICAgaW5zdGFuY2UuaGlkZGVuID0gdGhpcy5pbmZpbml0ZVNjcm9sbCA9PT0gJ2hpZGRlbic7XG4gICAgICBpbnN0YW5jZS5wYWdpbmcgPSB7XG4gICAgICAgIG5leHRQYWdlOiBzdGF0cy5uZXh0UGFnZSxcbiAgICAgICAgbmV4dDogdGhpcy5sb2FkTmV4dFBhZ2UuYmluZCh0aGlzKVxuICAgICAgfSBhcyBQYWdpbmc8YW55PjtcbiAgICAgIGluc3RhbmNlLmxvYWROZXh0TGFiZWwgPSB0aGlzLmxvYWRNb3JlSXRlbXNMYWJlbDtcbiAgICAgIGluc3RhbmNlLmxvYWRpbmdMYWJlbCA9IHRoaXMubG9hZGluZ0l0ZW1zTGFiZWw7XG4gICAgICB0aGlzLmxvYWRNb3JlQ29tcG9uZW50ID0gaW5zdGFuY2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvYWRNb3JlQ29tcG9uZW50ICYmICFzdGF0cy5uZXh0UGFnZSkge1xuICAgICAgdGhpcy5sb2FkTW9yZUNvbXBvbmVudC5wYWdpbmcgPSB7XG4gICAgICAgIG5leHRQYWdlOiBudWxsXG4gICAgICB9IGFzIFBhZ2luZzxhbnk+O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgaWYgKHRoaXMuaW5maW5pdGVTY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCkge1xuICAgIG1lcmdlKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMub25Tb3J0LFxuICAgICAgICB0aGlzLm9uUGFnZVNpemVDaGFuZ2UsXG4gICAgICAgIHRoaXMub25Db2x1bW5SZW9yZGVyZWQsXG4gICAgICAgIHRoaXMub25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlXG4gICAgICApLnBpcGUobWFwKGNvbmZpZyA9PiBjb25maWcuY29sdW1ucykpLFxuICAgICAgbWVyZ2UodGhpcy5vbkFkZEN1c3RvbUNvbHVtbiwgdGhpcy5vblJlbW92ZUN1c3RvbUNvbHVtbikucGlwZShcbiAgICAgICAgbWFwKCgpID0+ICh0aGlzLmNvbHVtbnMgfHwgW10pLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpKVxuICAgICAgKSxcbiAgICAgIHRoaXMub25GaWx0ZXIucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbHVtbk5hbWUsIGZpbHRlcmluZ01vZGlmaWVyIH0pID0+XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpLm1hcCgoY29sdW1uOiBDb2x1bW5Db25maWcpID0+IHtcbiAgICAgICAgICAgIGlmIChpc05pbChjb2x1bW5OYW1lKSkge1xuICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZpbHRlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLm5hbWUgPT09IGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKGlzRW1wdHkoZmlsdGVyaW5nTW9kaWZpZXIpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5maWx0ZXI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlciA9IGZpbHRlcmluZ01vZGlmaWVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGNvbHVtbnM6IEFycmF5PENvbHVtbkNvbmZpZyB8IEN1c3RvbUNvbHVtbkNvbmZpZz4pID0+ICh7XG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgfVxuICAgICAgICB9KSksXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5KSxcbiAgICAgICAgdGhpcy50cmltRmlsdGVyQ29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1Tb3J0Q29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uT3JkZXJQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKSxcbiAgICAgICAgY29uY2F0TWFwKChjb25maWc6IEdyaWRDb25maWcpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LnNhdmVDb25maWckKGNvbmZpZykpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1GaWx0ZXJDb25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnZmlsdGVyJywgY29uZmlnID0+IHtcbiAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChjb2wgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBjb2wuZmlsdGVyO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1Tb3J0Q29uZmlnUGlwZSgpOiBVbmFyeUZ1bmN0aW9uPE9ic2VydmFibGU8R3JpZENvbmZpZz4sIE9ic2VydmFibGU8R3JpZENvbmZpZz4+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ3NvcnQnLCBjb25maWcgPT4ge1xuICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGNvbCA9PiB7XG4gICAgICAgICAgY29sLnNvcnRPcmRlciA9ICcnO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248XG4gICAgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPixcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+XG4gID4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnY3VzdG9tQ29sdW1ucycsIGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbmZpZy5jb2x1bW5zID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoKGNvbDogQ3VzdG9tQ29sdW1uQ29uZmlnKSA9PiAhY29sLmN1c3RvbSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uT3JkZXJQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnb3JkZXInLCBjb25maWcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29uZmlnJCgpLnBpcGUoXG4gICAgICAgICAgbWFwKG9sZENvbmZpZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRDb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgIG9sZENvbmZpZz8uY29sdW1ucyB8fCAodGhpcy5kZWZhdWx0Q29sdW1ucyBhcyBDb2x1bW5Db25maWdbXSk7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjdXN0b20gY29sdW1ucyBoYXZlIGJlZW4gYWRkZWRcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnNBZGRlZCA9IChjb25maWcuY29sdW1ucyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAgICAgICBjb2wgPT4gIW9sZENvbHVtbnMuZmluZChvbGQgPT4gb2xkLm5hbWUgPT09IGNvbC5uYW1lKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSBbXG4gICAgICAgICAgICAgIC4uLm9sZENvbHVtbnMubWFwKG9sZENvbCA9PlxuICAgICAgICAgICAgICAgIChjb25maWcuY29sdW1ucyB8fCBbXSkuZmluZChuZXdDb2wgPT4gbmV3Q29sLm5hbWUgPT09IG9sZENvbC5uYW1lKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5jb2x1bW5zQWRkZWRcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKTogVW5hcnlGdW5jdGlvbjxcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+LFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCd2aXNpYmlsaXR5JywgY29uZmlnID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbmZpZyQoKS5waXBlKFxuICAgICAgICAgIG1hcChvbGRDb25maWcgPT4ge1xuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChuZXdDb2wgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgICAgb2xkQ29uZmlnPy5jb2x1bW5zIHx8ICh0aGlzLmRlZmF1bHRDb2x1bW5zIGFzIENvbHVtbkNvbmZpZ1tdKTtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkQ29sID0gY29sdW1ucy5maW5kKChjb2w6IGFueSkgPT4gbmV3Q29sLm5hbWUgPT09IGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgbmV3Q29sLnZpc2libGUgPSBvbGRDb2w/LnZpc2libGUgPz8gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRXZlbnRQaXBlKFxuICAgIGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0LFxuICAgIHRyaW1FdmVudERhdGFGbjogKGNvbmZpZzogR3JpZENvbmZpZykgPT4gR3JpZENvbmZpZyB8IE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICBjb25jYXRNYXAoKGNvbmZpZzogR3JpZENvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ29uZmlnRmlsdGVyXG4gICAgICAgICAgLmNhbGwodGhpcywgY29uZmlnUGFydClcbiAgICAgICAgICAucGlwZShtYXAoa2VlcEV2ZW50RGF0YSA9PiAoeyBjb25maWcsIGtlZXBFdmVudERhdGEgfSkpKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKCh7IGNvbmZpZywga2VlcEV2ZW50RGF0YSB9KSA9PlxuICAgICAgICBrZWVwRXZlbnREYXRhID8gY29uZmlnIDogdHJpbUV2ZW50RGF0YUZuLmNhbGwodGhpcywgY29uZmlnKVxuICAgICAgKSxcbiAgICAgIGNvbmNhdE1hcChjb25maWcgPT4gKGlzT2JzZXJ2YWJsZShjb25maWcpID8gY29uZmlnIDogb2YoY29uZmlnKSkgYXMgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ29uZmlnRmlsdGVyKGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRvT2JzZXJ2YWJsZShcbiAgICAgIChpc0Z1bmN0aW9uKHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbnRleHQoKT8uY29uZmlnRmlsdGVyPy5bY29uZmlnUGFydF0pXG4gICAgICAgID8gKHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbnRleHQoKT8uY29uZmlnRmlsdGVyPy5bY29uZmlnUGFydF0gYXMgRnVuY3Rpb24pKClcbiAgICAgICAgOiB0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneS5nZXRDb250ZXh0KCk/LmNvbmZpZ0ZpbHRlcj8uW2NvbmZpZ1BhcnRdKSA/PyB0cnVlXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdlxuICAjc2Nyb2xsXG4gIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLXNjcm9sbFwiXG4gIFtuZ0NsYXNzXT1cInsgJ3RhYmxlLWRhdGEtZ3JpZF9fb3ZlcmxheSc6IChkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmMpICYmICFsb2FkTW9yZUNvbXBvbmVudCB9XCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkX19sb2FkaW5nLS13cmFwcGVyXCJcbiAgICAqbmdJZj1cIihkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmMpICYmICFsb2FkTW9yZUNvbXBvbmVudFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtZGF0YS1ncmlkX19sb2FkaW5nLS1sb2FkZXJcIj5cbiAgICAgIDxjOHktcHJvZ3Jlc3MtYmFyIFttZXNzYWdlXT1cImxvYWRpbmdJdGVtc0xhYmVsXCI+PC9jOHktcHJvZ3Jlc3MtYmFyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiZGlzcGxheU9wdGlvbnMuZ3JpZEhlYWRlclwiIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWhlYWRlciBzZXBhcmF0b3IgbGFyZ2UtcGFkZGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJoNFwiIFtuZ0NsYXNzXT1cInsgJ20tci0xNic6ICEhdGl0bGUgfVwiPnt7IHRpdGxlIHwgdHJhbnNsYXRlIH19PC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheU9wdGlvbnMuZmlsdGVyXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFmaWx0ZXJpbmdBcHBsaWVkXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtZGVmYXVsdCBtLXItNFwiIHRyYW5zbGF0ZT5ObyBmaWx0ZXJzPC9zcGFuPlxuICAgICAgICA8c21hbGxcbiAgICAgICAgICAqbmdJZj1cIiEhZmlsdGVyaW5nTGFiZWxzUGFyYW1zLmFsbEl0ZW1zQ291bnRcIlxuICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cImZpbHRlcmluZ0xhYmVsc1BhcmFtc1wiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBmaWx0ZXJlZEl0ZW1zQ291bnQgfX0gb2Yge3sgYWxsSXRlbXNDb3VudCB9fSBpdGVtc1xuICAgICAgICA8L3NtYWxsPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJmaWx0ZXJpbmdBcHBsaWVkXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIWZpbHRlcmluZ0xhYmVsc1BhcmFtcy5hbGxJdGVtc0NvdW50XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1pbmZvIG0tci00XCI+XG4gICAgICAgICAgICB7eyAoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzbWFsbCBuZ05vbkJpbmRhYmxlIHRyYW5zbGF0ZSBbdHJhbnNsYXRlUGFyYW1zXT1cImZpbHRlcmluZ0xhYmVsc1BhcmFtc1wiPlxuICAgICAgICAgICAgb2Yge3sgYWxsSXRlbXNDb3VudCB9fSBpdGVtc1xuICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnQ2xlYXIgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGVmYXVsdCBtLWwtOCBtLXItNFwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsdGVycygpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7ICdDbGVhciBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPHNwYW4gY2xhc3M9XCJoaWRkZW4teHMgaGlkZGVuLXNtXCIgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5maWx0ZXJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBwb3BvdmVyPVwie3sgJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidDbGljayB0aGUgY29sdW1uIGhlYWRlcnMgdG8gYXBwbHkgZmlsdGVycy4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1oZWxwLWZpbHRlcnNcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgYzh5SWNvbj1cInF1ZXN0aW9uLWNpcmNsZS1vXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPHNwYW4gY2xhc3M9XCJoaWRkZW4teHMgaGlkZGVuLXNtXCIgKm5nSWY9XCJzaG93Q291bnRlcldhcm5pbmdcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIHRleHQtcHJpbWFyeVwiXG4gICAgICAgICAgcG9wb3Zlcj1cInt7XG4gICAgICAgICAgICAnVGhlIGNvdW50ZXIgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgbWlnaHQgYmUgaW5hY2N1cmF0ZS4nIHwgdHJhbnNsYXRlXG4gICAgICAgICAgfX1cIlxuICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwie3tcbiAgICAgICAgICAgICdUaGUgY291bnRlciBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBtaWdodCBiZSBpbmFjY3VyYXRlLicgfCB0cmFuc2xhdGVcbiAgICAgICAgICB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwid2FybmluZ1wiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwibS1sLWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJidG5iYXIgZC1mbGV4IGEtaS1jZW50ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGVhZGVyQWN0aW9uQ29udHJvbCBvZiBoZWFkZXJBY3Rpb25Db250cm9sc1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkZXJBY3Rpb25Db250cm9sIHwgaXNDb250cm9sVmlzaWJsZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoZWFkZXJBY3Rpb25Db250cm9sLnRlbXBsYXRlOyBlbHNlIGN1c3RvbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGhlYWRlckFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGVhZGVyQWN0aW9uQ29udHJvbC5jYWxsYmFjaygpXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTixcbiAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGhlYWRlckFjdGlvbkNvbnRyb2wudGV4dCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IGhlYWRlckFjdGlvbkNvbnRyb2wudHlwZVxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgW2M4eUljb25dPVwiaGVhZGVyQWN0aW9uQ29udHJvbC5pY29uXCIgY2xhc3M9XCJtLXItNFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBoZWFkZXJBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1c3RvbVRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgIGhlYWRlckFjdGlvbkNvbnRyb2wudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IGhlYWRlckFjdGlvbkNvbnRyb2w6IGhlYWRlckFjdGlvbkNvbnRyb2wgfVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cImNvbmZpZ3VyZUNvbHVtbnNFbmFibGVkXCJcbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICBkcm9wZG93blxuICAgICAgICAgICNkZENvbmZpZ3VyZUNvbHVtbnM9XCJicy1kcm9wZG93blwiXG4gICAgICAgICAgW2Nka1RyYXBGb2N1c109XCJkZENvbmZpZ3VyZUNvbHVtbnMuaXNPcGVuXCJcbiAgICAgICAgICBbaW5zaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ29uZmlndXJlIGNvbHVtbnMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWN1c3RvbS1jb2x1bW4tYnRuXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGM4eUljb249XCJjb2x1bW5zXCIgY2xhc3M9XCJtLXItNFwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdDb25maWd1cmUgY29sdW1ucycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8dWxcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkYXRhLWdyaWRfX2Ryb3Bkb3duXCJcbiAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImJnLWxldmVsLTBcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdC1ncm91cCBtLTBcIlxuICAgICAgICAgICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkNvbHVtbkRyb3AoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICAgICAgY2RrRHJhZ0xvY2tBeGlzPVwieVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2x1bW4ucG9zaXRpb25GaXhlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGRyYWdnYWJsZS1hZnRlciBwLTAgYS1pLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInZGF0YS1ncmlkLS1jdXN0b20tY29sdW1uLWhlYWRlci0nICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveCBwLWwtMTZcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbi52aXNpYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVHcmlkQ29sdW1uc1NpemUoKTsgZW1pdENvbmZpZ0NoYW5nZSgnY2hhbmdlQ29sdW1uVmlzaWJpbGl0eScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DSEFOR0VfVklTSUJJTElUWSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU6ICFjb2x1bW4udmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5jdXN0b21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBzaG93T25Ib3ZlciBtYXgtd2lkdGgtZml0IGEtaS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdSZW1vdmVgY29sdW1uLHZlcmJgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmVgY29sdW1uLHZlcmJgJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUN1c3RvbUNvbHVtbihwb0NvbmZpcm0sIGNvbHVtbiwgZGRDb25maWd1cmVDb2x1bW5zKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGM4eS1wb3BvdmVyLWNvbmZpcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlbWVudF09XCInbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NvbmZpcm0gcmVtb3ZhbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgI3BvQ29uZmlybVxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYzh5LXBvcG92ZXItY29uZmlybT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJtaW51cy1jaXJjbGVcIiBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jdXN0b20tY29sdW1uLXJlbW92ZS1idG5cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaSAqbmdJZj1cImlzQ29uZmlnQ29udGV4dEtub3duXCIgY2xhc3M9XCJwLTggc3RpY2t5LWJvdHRvbSBzZXBhcmF0b3ItdG9wXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBZGQgY3VzdG9tIGNvbHVtbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tYWRkLWN1c3RvbS1jb2x1bW5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ3VzdG9tQ29sdW1uTW9kYWwoKTsgZGRDb25maWd1cmVDb2x1bW5zLmhpZGUoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwicGx1cy1jaXJjbGVcIiBjbGFzcz1cIm0tci00XCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdBZGQgY3VzdG9tIGNvbHVtbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tcmVsb2FkLWJ0blwiXG4gICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGF0YVNvdXJjZS5sb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xpY2tSZWxvYWQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwicmVmcmVzaFwiIGNsYXNzPVwibS1yLTRcIj48L2k+XG4gICAgICAgICAgPHNwYW4+e3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIiFzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrIHx8IHNob3dTZWFyY2hcIlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc2VhcmNoIG0tbC1zbS0xNlwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnU2VhcmNo4oCmJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJzZWFyY2hUZXh0JC5lbWl0KCRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiPlxuICAgICAgICAgICAgPGkgYzh5SWNvbj1cInNlYXJjaFwiICpuZ0lmPVwic2VhcmNoVGV4dC5sZW5ndGggPT09IDBcIj48L2k+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjOHlJY29uPVwidGltZXNcIlxuICAgICAgICAgICAgICBjbGFzcz1cInBvaW50ZXJcIlxuICAgICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2hUZXh0ID0gJyc7IHNlYXJjaFRleHQkLmVtaXQoJycpXCJcbiAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5DTEVBUl9TRUFSQ0ggfVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWhlYWRlci1idWxrLWFjdGlvbnMgYW5pbWF0ZWQgc2xpZGVJbkRvd24gZmFzdFwiXG4gICAgICAqbmdJZj1cInNlbGVjdGVkSXRlbUlkcy5sZW5ndGggIT09IDBcIlxuICAgID5cbiAgICAgIDxoND5cbiAgICAgICAgPHNwYW4gbmdOb25CaW5kYWJsZSB0cmFuc2xhdGUgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGNvdW50OiBzZWxlY3RlZEl0ZW1JZHMubGVuZ3RoIH1cIj5cbiAgICAgICAgICB7eyBjb3VudCB9fSBzZWxlY3RlZCBpdGVtKHMpLlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxiciBjbGFzcz1cInZpc2libGUteHNcIiAvPlxuICAgICAgICA8c21hbGwgKm5nSWY9XCIhc2VydmVyU2lkZURhdGFDYWxsYmFjayAmJiBzZWxlY3RlZEl0ZW1JZHMubGVuZ3RoID49IHBhZ2luYXRpb24ucGFnZVNpemVcIj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgKGNsaWNrKT1cInNldEFsbEl0ZW1zU2VsZWN0ZWQodHJ1ZSlcIlxuICAgICAgICAgICAgY2xhc3M9XCJpbnRlcmFjdFwiXG4gICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0FMTF9JVEVNUyB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInsgY291bnQ6IChkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFNlbGVjdCBhbGwge3sgY291bnQgfX0gaXRlbXNcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvc21hbGw+XG4gICAgICA8L2g0PlxuICAgICAgPGRpdiBjbGFzcz1cIm0tbC1hdXRvXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG5iYXIgZC1mbGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnVsa0FjdGlvbkNvbnRyb2wgb2YgYnVsa0FjdGlvbkNvbnRyb2xzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiYnVsa0FjdGlvbkNvbnRyb2wgfCBpc0NvbnRyb2xWaXNpYmxlOiBzZWxlY3RlZEl0ZW1JZHNcIlxuICAgICAgICAgICAgICBbbmdTd2l0Y2hdPVwiYnVsa0FjdGlvbkNvbnRyb2wudHlwZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdFeHBvcnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuQlVMS19FWFBPUlQgfVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwic2lnbi1vdXRcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuQlVMS19ERUxFVEUgfVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBidWxrQWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYnVsa0FjdGlvbkNvbnRyb2wuY2FsbGJhY2soc2VsZWN0ZWRJdGVtSWRzLCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0NVU1RPTV9BQ1RJT04sXG4gICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBidWxrQWN0aW9uQ29udHJvbC50ZXh0XG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwie3sgYnVsa0FjdGlvbkNvbnRyb2wuaWNvbiB9fVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBidWxrQWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCJcbiAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0NBTkNFTFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgYzh5SWNvbj1cInRpbWVzXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDx0YWJsZVxuICAgIGNsYXNzPVwidGFibGUgdGFibGUtaG92ZXIgdGFibGUtZmlsdGVyZWQtc29ydGVkIHRhYmxlLWRhdGEtZ3JpZCBsYXJnZS1wYWRkaW5nXCJcbiAgICBjZGstdGFibGVcbiAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgICBbdHJhY2tCeV09XCJ0cmFja0J5TmFtZVwiXG4gICAgW2NsYXNzLnRhYmxlLXN0cmlwZWRdPVwiZGlzcGxheU9wdGlvbnMuc3RyaXBlZFwiXG4gICAgW2NsYXNzLnRhYmxlLWJvcmRlcmVkXT1cImRpc3BsYXlPcHRpb25zLmJvcmRlcmVkXCJcbiAgICBbY2xhc3MudGFibGUtZGF0YS1ncmlkLXdpdGgtY2hlY2tib3hlc109XCJzZWxlY3RhYmxlXCJcbiAgICBbY2xhc3MudGFibGUtZGF0YS1ncmlkLXdpdGgtYWN0aW9uc109XCJhY3Rpb25Db250cm9scy5sZW5ndGggPiAwXCJcbiAgICBbc3R5bGUuZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zXT1cInN0eWxlcy5ncmlkVGVtcGxhdGVDb2x1bW5zXCJcbiAgICAobW91c2Vtb3ZlKT1cInJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQuZW1pdCgkZXZlbnQpXCJcbiAgICAobW91c2V1cCk9XCJyZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJC5lbWl0KCRldmVudClcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5TmFtZVwiXG4gICAgICBbY2RrQ29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4ubmFtZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XG4gICAgICAgICAgPHRoIGNkay1oZWFkZXItY2VsbCAqY2RrSGVhZGVyQ2VsbERlZiBkYXRhLXR5cGU9XCJpY29uXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZS5hbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlLmFsbFNlbGVjdGVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZS5hbGxEZXNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEFsbEl0ZW1zSW5DdXJyZW50UGFnZVNlbGVjdGVkKCRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9BTExfSVRFTVMgfVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgPHRkIGNkay1jZWxsICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiIGRhdGEtdHlwZT1cImljb25cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3RlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRJdGVtc1NlbGVjdGVkKFtyb3ddLCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0lURU0sXG4gICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2FjdGlvbnMnXCI+XG4gICAgICAgICAgPHRoIGNkay1oZWFkZXItY2VsbCAqY2RrSGVhZGVyQ2VsbERlZiBkYXRhLXR5cGU9XCJpY29uXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbWVkaXVtIHNyLW9ubHlcIj57eyAnQWN0aW9ucycgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgPC90aD5cblxuICAgICAgICAgIDx0ZCBjZGstY2VsbCAqY2RrQ2VsbERlZj1cImxldCByb3dcIiBkYXRhLXR5cGU9XCJpY29uXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29udHJvbHMubGVuZ3RoIDw9IDJcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uQ29udHJvbCBvZiBhY3Rpb25Db250cm9sc1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYWN0aW9uQ29udHJvbCB8IGlzQ29udHJvbFZpc2libGU6IHJvd1wiXG4gICAgICAgICAgICAgICAgICBbbmdTd2l0Y2hdPVwiYWN0aW9uQ29udHJvbC50eXBlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5FZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdFwiXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidFZGl0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuRURJVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJwZW5jaWxcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgYnRuLWRvdC0tZGFuZ2VyIHNob3dPbkhvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJlbW92ZS1idXR0b24taW4tcm93XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGVsZXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuREVMRVRFX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3RcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DVVNUT01fQUNUSU9OX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgY3VzdG9tQWN0aW9uTmFtZTogYWN0aW9uQ29udHJvbC50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAoYWN0aW9uQ29udHJvbC5pY29uID8gYWN0aW9uQ29udHJvbC50ZXh0IDogJycpIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoYWN0aW9uQ29udHJvbC5pY29uID8gYWN0aW9uQ29udHJvbC50ZXh0IDogJycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cImFjdGlvbkNvbnRyb2wuaWNvblwiIGM4eUljb249XCJ7eyBhY3Rpb25Db250cm9sLmljb24gfX1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWFjdGlvbkNvbnRyb2wuaWNvblwiPnt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsgJ20tbC1hdXRvIG92ZXJmbG93LXZpc2libGUnOiBhY3Rpb25Db250cm9scy5sZW5ndGggPiAyIH1cIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWN0aW9uQ29udHJvbHMubGVuZ3RoID4gMlwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93blwiXG4gICAgICAgICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gcmlnaHRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWN0aW9ucycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBjOHktZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZWxsaXBzaXMtdlwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtcmlnaHRcIiAqZHJvcGRvd25NZW51PlxuICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBhY3Rpb25Db250cm9sIG9mIGFjdGlvbkNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFjdGlvbkNvbnRyb2wgfCBpc0NvbnRyb2xWaXNpYmxlOiByb3dcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1N3aXRjaF09XCJhY3Rpb25Db250cm9sLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuRURJVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0VkaXQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5EZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkRFTEVURV9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdFeHBvcnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkV4cG9ydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuRVhQT1JUX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkb3dubG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdFeHBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBhY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTl9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBhY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJ7eyBhY3Rpb25Db250cm9sLmljb24gfX1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBhY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgY2RrLWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqY2RrSGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXR5cGVdPVwiY29sdW1uLmRhdGFUeXBlXCJcbiAgICAgICAgICAgIFtjbGFzcy5zb3J0ZWRdPVwiY29sdW1uLnNvcnRPcmRlclwiXG4gICAgICAgICAgICBbY2xhc3MuZmlsdGVyZWRdPVwiY29sdW1uIHwgbWFwOiBpc0NvbHVtbkZpbHRlcmluZ0FwcGxpZWRcIlxuICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCIhY29sdW1uLnZpc2libGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY29sdW1uLmZpbHRlcmFibGVcIiBbdGl0bGVdPVwiKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjOnRoaXMgYXMgY2VsbFJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Yzh5LWNlbGwtcmVuZGVyZXIgW3NwZWNdPVwiY2VsbFJlbmRlcmVyU3BlY1wiPjwvYzh5LWNlbGwtcmVuZGVyZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gaXNEcm9wRG93blBsYWNlZFJpZ2h0IHRvIGJlIHJlbW92ZWQgd2hlbiBjb2x1bW5zIGFyZSB0cmFuc2Zvcm1lZCB0byBvYnNlcnZhYmxlcy4gLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmZpbHRlcmFibGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAgICAgI2dyaWRIZWFkZXJEcm9wZG93bj1cImJzLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgW2Nka1RyYXBGb2N1c109XCJncmlkSGVhZGVyRHJvcGRvd24uaXNPcGVuXCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIHt7IGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW4pID8gJ3JpZ2h0JyA6ICdsZWZ0JyB9fVwiXG4gICAgICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidkYXRhLWdyaWQtLWhlYWRlci1idG4tLScgKyBjb2x1bW4uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjOnRoaXMgYXMgY2VsbFJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWNlbGwtcmVuZGVyZXIgW3NwZWNdPVwiY2VsbFJlbmRlcmVyU3BlY1wiPjwvYzh5LWNlbGwtcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImZpbHRlclwiIHRpdGxlPVwie3sgJ0ZpbHRlcicgfCB0cmFuc2xhdGUgfX1cIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDwhLS0gaXNEcm9wRG93blBsYWNlZFJpZ2h0IHRvIGJlIHJlbW92ZWQgd2hlbiBjb2x1bW5zIGFyZSB0cmFuc2Zvcm1lZCB0byBvYnNlcnZhYmxlcy4gLS0+XG4gICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQtZ3JpZCc6IGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW4pIH1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZGF0YS1ncmlkX19kcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duOiBncmlkSGVhZGVyRHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjOnRoaXMgYXMgZmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Yzh5LWZpbHRlcmluZy1mb3JtLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgW3NwZWNdPVwiZmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlY1wiXG4gICAgICAgICAgICAgICAgICAgID48L2M4eS1maWx0ZXJpbmctZm9ybS1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLXNvcnRcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwic29ydENvbHVtblRpdGxlIHwgdHJhbnNsYXRlOiB7IG5hbWU6IGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUgfVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU29ydE9yZGVyKGNvbHVtbi5uYW1lKVwiXG4gICAgICAgICAgICAgIGRhdGEtY3k9XCJjaGFuZ2Utc29ydC1vcmRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi5zb3J0T3JkZXJcIj5cbiAgICAgICAgICAgICAgICA8aSAqbmdTd2l0Y2hDYXNlPVwiJ2FzYydcIiBjOHlJY29uPVwibG9uZy1hcnJvdy11cFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8aSAqbmdTd2l0Y2hDYXNlPVwiJ2Rlc2MnXCIgYzh5SWNvbj1cImxvbmctYXJyb3ctZG93blwiPjwvaT5cbiAgICAgICAgICAgICAgICA8aSAqbmdTd2l0Y2hEZWZhdWx0IGM4eUljb249XCJleGNoYW5nZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4ucmVzaXphYmxlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJyZXNpemUtaGFuZGxlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJcbiAgICAgICAgICAgICAgICByZXNpemVIYW5kbGVNb3VzZURvd24kLmVtaXQoeyBldmVudDogJGV2ZW50LCB0YXJnZXRDb2x1bW5OYW1lOiBjb2x1bW4ubmFtZSB9KVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBjZGstY2VsbFxuICAgICAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbi5jZWxsQ1NTQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtY2VsbC10aXRsZV09XCJjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2RhdGEtZ3JpZC0tJyArIGNvbHVtbi5oZWFkZXJcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10eXBlXT1cImNvbHVtbi5kYXRhVHlwZVwiXG4gICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiFjb2x1bW4udmlzaWJsZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc29sdmVDZWxsVmFsdWUocm93LCBjb2x1bW4ucGF0aCksXG4gICAgICAgICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBjb2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldENlbGxSZW5kZXJlclNwZWM6dGhpcyBhcyBjZWxsUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxjOHktY2VsbC1yZW5kZXJlciBbc3BlY109XCJjZWxsUmVuZGVyZXJTcGVjXCI+PC9jOHktY2VsbC1yZW5kZXJlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImluZmluaXRlU2Nyb2xsRm9vdGVyXCI+XG4gICAgICA8dGQgY2RrLWZvb3Rlci1jZWxsICpjZGtGb290ZXJDZWxsRGVmIFtzdHlsZS5ncmlkLWNvbHVtbl09XCJzdHlsZXMuZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uXCI+XG4gICAgICAgIDx0ZW1wbGF0ZSAjaW5maW5pdGVTY3JvbGxDb250YWluZXI+PC90ZW1wbGF0ZT5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHIgY2RrLWhlYWRlci1yb3cgKmNka0hlYWRlclJvd0RlZj1cImNvbHVtbk5hbWVzXCI+PC90cj5cblxuICAgIDx0clxuICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJvdy1pbi1kYXRhLWdyaWRcIlxuICAgICAgY2RrLXJvd1xuICAgICAgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbk5hbWVzXCJcbiAgICAgIChtb3VzZW92ZXIpPVwicm93TW91c2VPdmVyLmVtaXQocm93KVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJyb3dNb3VzZUxlYXZlLmVtaXQocm93KVwiXG4gICAgICAoY2xpY2spPVwicm93Q2xpY2suZW1pdChyb3cpXCJcbiAgICA+PC90cj5cblxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8dHJcbiAgICAgICAgW25nQ2xhc3NdPVwieyBoaWRkZW46ICFpbmZpbml0ZVNjcm9sbCB9XCJcbiAgICAgICAgY2RrLWZvb3Rlci1yb3dcbiAgICAgICAgKmNka0Zvb3RlclJvd0RlZj1cIlsnaW5maW5pdGVTY3JvbGxGb290ZXInXVwiXG4gICAgICA+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC90YWJsZT5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJkLWZsZXggbS0wIHAtdC00MCBwLWItNDBcIlxuICAgICpuZ0lmPVwiIShkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmMpICYmIChkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgPT09IDBcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1sZy0zIGNvbC1zbS00IG0tbC1hdXRvIG0tci1hdXRvXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjOHktdWktZW1wdHktc3RhdGUsIC5jOHktZW1wdHktc3RhdGVcIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJwYWdpbmF0aW9uICYmICFpbmZpbml0ZVNjcm9sbFwiIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWZvb3RlciBzZXBhcmF0b3IgbGFyZ2UtcGFkZGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuY3VycmVudFBhZ2VTaXplID4gMFwiXG4gICAgICAgIGNsYXNzPVwiY291bnRlciBwLXQtOCBwLWItOFwiXG4gICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWNvdW50ZXJcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIiBuZ05vbkJpbmRhYmxlIHRyYW5zbGF0ZSBbdHJhbnNsYXRlUGFyYW1zXT1cInBhZ2luYXRpb25MYWJlbFBhcmFtc1wiPlxuICAgICAgICAgIHt7IHBhZ2VGaXJzdEl0ZW1JZHggfX0gLSB7eyBwYWdlTGFzdEl0ZW1JZHggfX0gb2Yge3sgaXRlbXNUb3RhbCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplID4gbWluUG9zc2libGVQYWdlU2l6ZVwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWlubGluZSBwLXQtOCBwLWItOFwiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm0tci00XCIgZm9yPVwiZmlsdGVyZWRTaXplXCI+e3sgJ0l0ZW1zIHBlciBwYWdlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBpZD1cImZpbHRlcmVkU2l6ZVwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1wYWdlc2l6ZS1vcHRpb25zXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInBhZ2luYXRpb24ucGFnZVNpemVcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgIHVwZGF0ZVBhZ2luYXRpb24oeyBpdGVtc1BlclBhZ2U6ICRldmVudCwgcGFnZTogcGFnaW5hdGlvbi5jdXJyZW50UGFnZSB9KVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBwYWdlU2l6ZSBvZiBwb3NzaWJsZVBhZ2VTaXplc1wiIFtuZ1ZhbHVlXT1cInBhZ2VTaXplXCI+XG4gICAgICAgICAgICAgIHt7IHBhZ2VTaXplIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXIgdGV4dC1yaWdodFwiPlxuICAgICAgPHBhZ2luYXRpb25cbiAgICAgICAgKm5nSWY9XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplID4gMFwiXG4gICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiaGlkZVBhZ2luYXRpb24kIHwgYXN5bmNcIlxuICAgICAgICBbbmdNb2RlbF09XCJwYWdpbmF0aW9uLmN1cnJlbnRQYWdlXCJcbiAgICAgICAgKHBhZ2VDaGFuZ2VkKT1cInVwZGF0ZVBhZ2luYXRpb24oJGV2ZW50KVwiXG4gICAgICAgIFt0b3RhbEl0ZW1zXT1cIihkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemVcIlxuICAgICAgICBbaXRlbXNQZXJQYWdlXT1cInBhZ2luYXRpb24ucGFnZVNpemVcIlxuICAgICAgICAobnVtUGFnZXMpPVwidG90YWxQYWdlc0NvdW50JC5uZXh0KCRldmVudClcIlxuICAgICAgICBbbWF4U2l6ZV09XCI1XCJcbiAgICAgICAgW2JvdW5kYXJ5TGlua3NdPVwiZmFsc2VcIlxuICAgICAgICBwcmV2aW91c1RleHQ9XCJQcmV2aW91c1wiXG4gICAgICAgIG5leHRUZXh0PVwiTmV4dFwiXG4gICAgICAgIGNsYXNzPVwicC10LTggcC1iLThcIlxuICAgICAgPjwvcGFnaW5hdGlvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==