@libs-ui/components-table 0.2.122 → 0.2.123
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.
|
@@ -14,7 +14,7 @@ import { LibsUiIconsGetIconComponentPipe } from "@libs-ui/icons";
|
|
|
14
14
|
import { LibsUiPipesCallFunctionInTemplatePipe } from "@libs-ui/pipes-call-function-in-template";
|
|
15
15
|
import { LibsUiPipesCheckSelectedByKeyPipe } from '@libs-ui/pipes-check-selected-by-key';
|
|
16
16
|
import { LibsUiHttpRequestService, returnListObject } from "@libs-ui/services-http-request";
|
|
17
|
-
import { convertObjectToSignal, deleteUnicode, get, set, viewDataNumberByLanguage } from "@libs-ui/utils";
|
|
17
|
+
import { cloneDeep, convertObjectToSignal, deleteUnicode, get, set, viewDataNumberByLanguage } from "@libs-ui/utils";
|
|
18
18
|
import { TranslateModule } from "@ngx-translate/core";
|
|
19
19
|
import { fromEvent, lastValueFrom, of, Subject, takeUntil, timer } from "rxjs";
|
|
20
20
|
import { LibsUiComponentsTableTemplatesComponent } from "./templates/templates.component";
|
|
@@ -147,7 +147,7 @@ export class LibsUiComponentsTableComponent {
|
|
|
147
147
|
}
|
|
148
148
|
untracked(() => {
|
|
149
149
|
this.keySearch.set(get(this.filter().filterData, 'keySearch', ''));
|
|
150
|
-
this.storeParamsCallApi.set(this.filter());
|
|
150
|
+
this.storeParamsCallApi.set(cloneDeep(this.filter().filterData));
|
|
151
151
|
if (this.filter()?.filterData && !this.filter().filterData['instanceSort'] && this.instanceSort()) {
|
|
152
152
|
this.storeParamsCallApi.update(data => ({ ...data, instanceSort: this.instanceSort() }));
|
|
153
153
|
}
|
|
@@ -632,4 +632,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
632
632
|
LibsUiPipesCallFunctionInTemplatePipe, LibsUiPipesCheckSelectedByKeyPipe
|
|
633
633
|
], template: "<div class='flex flex-col w-full h-full'>\n @if (!ignoreBar()) {\n <div class=\"flex items-center justify-between relative z-[1] bottom-0 left-0 w-full bg-white mb-[16px] libs-ui-table-shadow-bottom\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]='labelBarNoSelectItem() | translate:{value:totalItemDisplay()}'>\n </div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate:{ value:keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude:'!w-[121px]',\n position: {\n mode:'start',\n distance:0\n }\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{config:{content:'i18n_more_select'}}\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons();track button) {\n <libs_ui-components-buttons-button [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"(button.label || ' ') | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select='div.libs-ui-table-bar-right'></ng-content>\n </div>\n }\n\n <div #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]='!ignoreBar()'\n (mouseleave)=\"resetIndexHover($event)\">\n <div #headerElementRef\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\"\n [class]=\"classHeaderContainer()\"\n (mouseenter)=\"resetIndexHover($event)\">\n @if (headerLeft().length) {\n <div class=\"h-full flex sticky top-0 left-0 z-[1] {{ classHeaderInclude() }}\">\n @for (header of headerLeft();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:true}\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:false}\" />\n }\n }\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n @if (items().length) {\n <div #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollX: (!headerLeft().length || !headerRight()) ? 'hidden':'scroll'}\"\n (outScroll)=\"handlerScroll($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n <virtual-scroller #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth: undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems;track data()) {\n <div #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\"\n [class.libs-ui-border-top-1px-36d3d3]=\"data().specificHightLight && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"data().specificHightLight && !ignoreBorderItem()\"\n [ngClass]=\"(data().specificHightLight || ($last && ignoreBorderItemLast())) ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px' : ignoreBorderItem() ? '' : isDashBorder() ? 'libs-ui-border-bottom-dashed-general' : 'libs-ui-border-bottom-general'\"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n (mouseenter)=\"setIndexHover($event,data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!data().specificHightLight\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\">\n @for (header of headerLeft();track header) {\n <div class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <div class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']();track $index) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"dataExpand\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n\n @if ((!items().length) && !loading() && noDataConfig()) {\n <div class=\"h-full\"\n [style.flex]=\"'0 0 '+headerElementRef.scrollWidth+'px'\">\n </div>\n }\n </div>\n }\n @if ((!items().length) && !loading()) {\n <div class=\"relative h-full w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #templateHeaderRef\n let-header='headerItem'\n let-isHeaderLeft='isHeaderLeft'>\n <div [class]=\"'relative flex '+ (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ')+ ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]='!header.ignorePyDefault'\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:header,isColRender:false}\" />\n }\n @if (header.rowsConfig;as rowsConfig) {\n @for (row of rowsConfig.rows;track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols ; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:col,isColRender:true}\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateHeaderContentRef\n let-header='headerItem'\n let-isColRender='isColRender'>\n <div class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]='header.contentHeaderAlignCenter ?? true'\n [class.justify-end]='header.contentHeaderJustifyContentEnd'\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"isColRender ? (header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})) : {}\"\n [ngClass]=\"isColRender ? (header.ngClass || {}) : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\">\n </div>\n }\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if ((header.label | LibsUiPipesCallFunctionInTemplatePipe:header.parseValue:header) | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"(header?.labelConfig?.classInclude || '')\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || {content:labelHeaderColumn}\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @if (header.tooltipOther; as tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{content: header.labelDescription.content | translate}\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template #templateBodyRef\n let-header='header'\n let-data='data'>\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden &&( data() | LibsUiPipesCallFunctionInTemplatePipe:header.checkConditionCheckBoxHidden:data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event,data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe:getIndexRow | async\">\n </div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates [isHover]=\"itemOfIndexHover === data && !data.specificHightLight\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '': (customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general':'libs-ui-table-shadow-top libs-ui-border-top-general') }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnter($event)\"\n (mouseleave)=\"handlerMouseLeave($event)\">\n @if (footerLeft()) {\n <div #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"footer.ngStyle || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"itemFooter\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n </div>\n }\n @if (footerRight()) {\n @for (footer of footerRight();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"footer.ngStyle || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"itemFooter\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (noDataConfig(); as config) {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\"\n LibsUiComponentsScrollOverlayDirective>\n @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\" ('no-data' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\">\n </div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"('no-result' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\">\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"] }]
|
|
634
634
|
}], ctorParameters: () => [] });
|
|
635
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDNU0sT0FBTyxFQUE0QixxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pHLE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBUyx5Q0FBeUMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBHLE9BQU8sRUFBa0IsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RyxPQUFPLEVBQWlELGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEksT0FBTyxFQUFFLGdDQUFnQyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQ25HLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSwrQkFBK0Is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c0MseVFBQUUsK0JBQStCLG1FQUN2RSxxQ0FBcUMseUVBQUUsaUNBQWlDOzs0RkFHL0QsOEJBQThCO2tCQWpCMUMsU0FBUzsrQkFFRSwwQkFBMEIsY0FHeEIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLHVDQUF1Qzt3QkFDekcsZUFBZSxFQUFFLHFCQUFxQixFQUFFLHNDQUFzQzt3QkFDOUUsaUNBQWlDLEVBQUUseUNBQXlDO3dCQUM1RSx1Q0FBdUM7d0JBQ3ZDLGdDQUFnQyxFQUFFLGdDQUFnQzt3QkFDbEUsc0NBQXNDLEVBQUUsK0JBQStCO3dCQUN2RSxxQ0FBcUMsRUFBRSxpQ0FBaUM7cUJBQ3pFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0NvbXBvbmVudE91dGxldCwgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQsIFZpcnR1YWxTY3JvbGxlck1vZHVsZSB9IGZyb20gJ0BpaGFyYmVjay9uZ3gtdmlydHVhbC1zY3JvbGxlcic7XG5pbXBvcnQgeyBJQnV0dG9uLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSVNvcnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zU29ydEFycm93Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLXNvcnQnO1xuaW1wb3J0IHsgSUNoZWNrYm94SXRlbSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LWdyb3VwXCI7XG5pbXBvcnQgeyBJQ2hlY2tib3hFdmVudCwgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXCI7XG5pbXBvcnQgeyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXJcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtc2Nyb2xsLW92ZXJsYXlcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lclwiO1xuaW1wb3J0IHsgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB9IGZyb20gXCJAbGlicy11aS9pY29uc1wiO1xuaW1wb3J0IHsgSUh0dHBSZXNwb25zZUVycm9yLCBJUGFnaW5nLCBUWVBFX09CSkVDVCB9IGZyb20gXCJAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzXCI7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSBcIkBsaWJzLXVpL3BpcGVzLWNhbGwtZnVuY3Rpb24taW4tdGVtcGxhdGVcIjtcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNoZWNrLXNlbGVjdGVkLWJ5LWtleSc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcsIExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSwgcmV0dXJuTGlzdE9iamVjdCB9IGZyb20gXCJAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3RcIjtcbmltcG9ydCB7IGNvbnZlcnRPYmplY3RUb1NpZ25hbCwgZGVsZXRlVW5pY29kZSwgZ2V0LCBzZXQsIHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZSB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCB7IGZyb21FdmVudCwgbGFzdFZhbHVlRnJvbSwgb2YsIFN1YmplY3QsIHRha2VVbnRpbCwgdGltZXIgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgSUJ1dHRvbkJhckV2ZW50LCBJQ29uZmlnU2VsZWN0TW9yZUl0ZW0sIElDb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCwgSUhvdmVyQnV0dG9uQWN0aW9uRXZlbnQsIElMb2FkTW9yZUV2ZW50LCBJU29ydEV2ZW50LCBJVGFiZWxCdXR0b25BY3Rpb25FdmVudCwgSVRhYmxlRm9vdGVyQ29uZmlnLCBJVGFibGVIZWFkZXJDb25maWcsIFRZUEVfREFUQV9GSUxURVJfVEFCTEUsIFRZUEVfREFUQV9UQUJMRSwgVFlQRV9JVEVNX0RBVEFfVEFCTEUsIFRZUEVfTkVXX0RBVEFfVEFCTEUsIFRZUEVfVEFCTEVfRklMVEVSIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgSVRhYmxlRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2Z1bmN0aW9uLWNvbnRyb2wtZXZlbnQuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBJVGFibGVOb0RhdGFDb25maWcgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL25vLWRhdGEtY29uZmlnLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50IH0gZnJvbSBcIi4vdGVtcGxhdGVzL3RlbXBsYXRlcy5jb21wb25lbnRcIjtcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWxpc3RcIjtcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBOZ0NsYXNzLCBOZ1N0eWxlLCBBc3luY1BpcGUsIE5nVGVtcGxhdGVPdXRsZXQsIE5nQ29tcG9uZW50T3V0bGV0LCBMaWJzVWlDb21wb25lbnRzVGFibGVUZW1wbGF0ZXNDb21wb25lbnQsXG4gICAgVHJhbnNsYXRlTW9kdWxlLCBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTb3J0QXJyb3dDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSwgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSxcbiAgICBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlLCBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgY2xhc3NIZWFkZXJDb250YWluZXIgPSBjb21wdXRlZCgoKSA9PiBgbGlicy11aS10YWJsZS1oZWFkZXItY29udGFpbmVyIHctZnVsbCBmbGV4ICR7dGhpcy5pZ25vcmVDbGFzc0JnSGVhZGVyKCkgPyAnJyA6ICdiZy13aGl0ZSd9IG92ZXJmbG93LXgtaGlkZGVuIHotWzFdIGl0ZW1zLWNlbnRlciAke3RoaXMuY2xhc3NIZWFkZXJJbmNsdWRlKCkgfHwgJyd9YClcbiAgcHJvdGVjdGVkIGtleXNTZWxlY3RlZCA9IHNpZ25hbDxBcnJheTxhbnk+PihbXSk7XG4gIHByb3RlY3RlZCBsb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIHN0b3JlcyA9IHNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+PihbXSk7XG4gIHByb3RlY3RlZCBpdGVtcyA9IHNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+PihbXSk7XG4gIHByb3RlY3RlZCBpdGVtRm9vdGVyID0gc2lnbmFsPFRZUEVfT0JKRUNUPih7fSk7XG4gIHByb3RlY3RlZCBpdGVtT2ZJbmRleEhvdmVyPzogVFlQRV9JVEVNX0RBVEFfVEFCTEU7XG4gIHByb3RlY3RlZCBrZXlTZWFyY2ggPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCB0b3RhbEl0ZW1JbkJhY2tlbmQgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJvdGVjdGVkIGhhc0l0ZW1IaWdodExpZ2h0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbURpc3BsYXkgPSBjb21wdXRlZCgoKSA9PiB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UoKHRoaXMudG90YWxJdGVtKCkgPz8gdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQoKSksIGZhbHNlKSk7XG4gIHByb3RlY3RlZCBsaXN0Q29uZmlnTW9yZUl0ZW0gPSBjb21wdXRlZDxJTGlzdENvbmZpZ0l0ZW0+KCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgY29uZmlnVGVtcGxhdGVUZXh0OiBzaWduYWwoe1xuICAgICAgICBmaWVsZEtleTogJ2tleScsXG4gICAgICAgIGlnbm9yZUljb25TZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgZ2V0VmFsdWU6IHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8uZ2V0VmFsdWUsXG4gICAgICAgIGNvbmZpZ0xhYmVsUG9wb3Zlcjogc2lnbmFsKHtcbiAgICAgICAgICB6SW5kZXg6IDEyMDBcbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgICAgaHR0cFJlcXVlc3REYXRhOiBzaWduYWwoe1xuICAgICAgICBzZXJ2aWNlT3RoZXI6IHJldHVybkxpc3RPYmplY3QodGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5saXN0T3B0aW9uKSxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAnbGlzdCcsXG4gICAgICAgIGFyZ3VtZW50c1ZhbHVlOiBbXVxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgcHJpdmF0ZSBoYXNTY3JvbGwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGluc3RhbmNlU29ydCA9IHNpZ25hbDxJU29ydCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBoYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHBhZ2luZ1N0b3JlID0gc2lnbmFsPElQYWdpbmc+KHt9KTtcbiAgcHJpdmF0ZSBsb2FkZWRMYXN0SXRlbSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgc3RvcmVQYXJhbXNDYWxsQXBpID0gc2lnbmFsPFRZUEVfT0JKRUNUPih7fSk7XG4gIHByaXZhdGUgdGltZW91dExlYXZlSXRlbSA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0/OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudDtcbiAgcHJpdmF0ZSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBJTlBVVCAqL1xuICByZWFkb25seSB0aW1lSGlnaGxpZ2hOZXdJdGVtID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDIwMDAsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDIwMDAgfSk7XG4gIHJlYWRvbmx5IGhlYWRlckxlZnQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gW10gfSk7XG4gIHJlYWRvbmx5IGhlYWRlclJpZ2h0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlSGVhZGVyQ29uZmlnPiwgQXJyYXk8SVRhYmxlSGVhZGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oW10sIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IFtdIH0pO1xuICByZWFkb25seSBjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCA9IGlucHV0PElDb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZD4oKTtcbiAgcmVhZG9ubHkgc2hvd0Zvb3RlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckZvb3RlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGN1c3RvbVBvc2l0aW9uRm9vdGVyID0gaW5wdXQ8J3RvcCcgfCAnYm90dG9tJywgJ3RvcCcgfCAnYm90dG9tJyB8IHVuZGVmaW5lZD4oJ2JvdHRvbScsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICdib3R0b20nIH0pO1xuICByZWFkb25seSBmb290ZXJMZWZ0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlRm9vdGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZm9vdGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVGb290ZXJDb25maWc+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBkaXNhYmxlQ2hlY2tib3ggPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGVuYWJsZVVuZXF1YWxDaGlsZHJlblNpemVzID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBidWZmZXJBbW91bnQgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oNSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPyAodmFsID4gMjUgPyAyNSA6IHZhbCkgOiA1IH0pXG4gIHJlYWRvbmx5IHRvdGFsSXRlbSA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgaXNEYXNoQm9yZGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NIZWFkZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0JvZHlJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NGb290ZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NUYWJsZUNvbnRhaW5lckluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICcnIH0pO1xuXG4gIHJlYWRvbmx5IGZpZWxkS2V5ID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpZCcsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsIHx8ICdpZCcgfSk7IC8vIHTDqm4gZmllbGQgxJHhu4tuaCBkYW5oIGl0ZW0gY+G7p2EgbGlzdERhdGFzXG4gIHJlYWRvbmx5IGRlZmF1bHRLZXlzU2VsZWN0ZWQgPSBpbnB1dDxBcnJheTxhbnk+PigpO1xuICByZWFkb25seSBsYWJlbEJhck5vU2VsZWN0SXRlbSA9IGlucHV0PHN0cmluZz4oYGkxOG5fdG90YWxfcXVhbnRpdHlgKTsgLy8gc+G7rSBk4bulbmcgxJHhu4MgaGnDqm4gdGjhu4sga2hpIHTDrWNoIGNo4buNbiBpdGVtXG4gIHJlYWRvbmx5IGxhYmVsQmFyQnV0dG9ucyA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaTE4bl9udW1iZXJfaXRlbV9zZWxlY3RlZCcsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsIHx8ICdpMThuX251bWJlcl9pdGVtX3NlbGVjdGVkJyB9KTsgLy8gc+G7rSBk4bulbmcgxJHhu4MgaGnDqm4gdGjhu4sga2hpIHTDrWNoIGNo4buNbiBpdGVtXG4gIHJlYWRvbmx5IGNsYXNzTGFiZWxCYXJCdXR0b25zID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAnJyB9KTsgLy8gc+G7rSBk4bulbmcgxJHhu4MgaGnDqm4gdGjhu4sga2hpIHTDrWNoIGNo4buNbiBpdGVtXG4gIHJlYWRvbmx5IGJhckJ1dHRvbnMgPSBpbnB1dDxBcnJheTxJQnV0dG9uPj4oKTtcbiAgcmVhZG9ubHkgc29ydExvY2FsID0gaW5wdXQ8Ym9vbGVhbj4oKTsgLy8gdHLGsOG7nW5nIGjhu6NwIG7hur91IHNvcnRMb2NhbCBuw6B5IGtow7RuZyDEkcOhcCDhu6luZyDEkcaw4bujYyBuZ2hp4buHcCB24bulIHRow6wgbeG7m2kgY8OibiBuaOG6r2Mgc+G7rSBk4bulbmcgZmlsdGVyTG9jYWxcbiAgcmVhZG9ubHkgZmlsdGVyT3JTb3J0TG9jYWwgPSBpbnB1dDxUWVBFX1RBQkxFX0ZJTFRFUj4oKTtcbiAgcmVhZG9ubHkgaHR0cFJlcXVlc3REYXRhID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBodHRwUmVxdWVzdERhdGFGb290ZXIgPSBpbnB1dDxJSHR0cFJlcXVlc3RDb25maWc+KCk7XG4gIHJlYWRvbmx5IG5ld0RhdGEgPSBpbnB1dDxUWVBFX05FV19EQVRBX1RBQkxFPigpO1xuICByZWFkb25seSBmaWx0ZXIgPSBpbnB1dDxUWVBFX0RBVEFfRklMVEVSX1RBQkxFLCBUWVBFX0RBVEFfRklMVEVSX1RBQkxFIHwgdW5kZWZpbmVkPih7IGZpbHRlckRhdGE6IHt9IH0sIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IHsgZmlsdGVyRGF0YToge30gfSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQmFyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NMYWJlbEJhck5vU2VsZWN0SXRlbSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQ2xhc3NCZ0hlYWRlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG5vRGF0YUNvbmZpZyA9IGlucHV0PElUYWJsZU5vRGF0YUNvbmZpZz4oeyB0ZXh0Tm9EYXRhOiAnaTE4bl9ub19kYXRhX3lldCcsIHRleHRTZWFyY2hOb0RhdGE6ICdpMThuX25vX3Jlc3VsdCcgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckl0ZW1MYXN0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbWF4SXRlbVNlbGVjdGVkID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMCwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gMTAwIH0pO1xuICByZWFkb25seSBjb25maWdTZWxlY3RNb3JlSXRlbSA9IGlucHV0PElDb25maWdTZWxlY3RNb3JlSXRlbT4oKTtcbiAgcmVhZG9ubHkgb25seVNob3dOb1Jlc3VsdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckl0ZW0gPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIC8qKiBPVVRQVVQgKi9cblxuICByZWFkb25seSBvdXRMb2FkTW9yZSA9IG91dHB1dDxJTG9hZE1vcmVFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U2Nyb2xsSXNHb25lID0gb3V0cHV0PElMb2FkTW9yZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRMb2FkaW5nID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dENsaWNrQnV0dG9uQWN0aW9uID0gb3V0cHV0PElUYWJlbEJ1dHRvbkFjdGlvbkV2ZW50PigpO1xuICByZWFkb25seSBvdXRTb3J0ID0gb3V0cHV0PElTb3J0RXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dENsaWNrQmFyQnV0dG9uID0gb3V0cHV0PElCdXR0b25CYXJFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0SG92ZXJCdXR0b25BY3Rpb24gPSBvdXRwdXQ8SUhvdmVyQnV0dG9uQWN0aW9uRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dEtleXNTZWxlY3RlZCA9IG91dHB1dDx7IGtleXM6IEFycmF5PGFueT4gfT4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJVGFibGVGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZERhdGFDb21wbGV0ZSA9IG91dHB1dDxXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj4+KCk7XG4gIHJlYWRvbmx5IG91dFRvdGFsSXRlbSA9IG91dHB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG91dExvYWREYXRhRXJyb3IgPSBvdXRwdXQ8SUh0dHBSZXNwb25zZUVycm9yPigpO1xuXG4gIC8qKlZJRVcgQ0hJTEQgKi9cbiAgcHJvdGVjdGVkIGhlYWRlckVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2hlYWRlckVsZW1lbnRSZWYnKTtcbiAgcHJvdGVjdGVkIGZvb3RlckVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2Zvb3RlckVsZW1lbnRSZWYnKTtcbiAgcHJvdGVjdGVkIGZvb3RlckxlZnRFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdmb290ZXJMZWZ0RWxlbWVudFJlZicpO1xuICBwcml2YXRlIGJvZHlFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdib2R5RWxlbWVudFJlZicpO1xuICBwcml2YXRlIGJvZHlDb21wb25lbnRSZWYgPSB2aWV3Q2hpbGQ8VmlydHVhbFNjcm9sbGVyQ29tcG9uZW50PignYm9keUNvbXBvbmVudFJlZicpOztcblxuICAvKipJTkpFQ1QgKi9cbiAgcHJpdmF0ZSBodHRwUmVxdWVzdFNlcnZpY2UgPSBpbmplY3QoTGlic1VpSHR0cFJlcXVlc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0S2V5c1NlbGVjdGVkKCk/Lmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5rZXlzU2VsZWN0ZWQudXBkYXRlKGtleXMgPT4gKFsuLi5rZXlzLCAuLi4odGhpcy5kZWZhdWx0S2V5c1NlbGVjdGVkKCkgfHwgW10pXSkpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2hvd0Zvb3RlcigpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmV3RGF0YSgpPy5kYXRhKCkubGVuZ3RoKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmFkZEl0ZW1zKHRoaXMubmV3RGF0YSgpPy5kYXRhIGFzIGFueSwgIXRoaXMubmV3RGF0YSgpPy5hZGRUb0xhc3RMaXN0KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEgfHwgdGhpcy5maWx0ZXIoKS5pZ25vcmVDYWxsQXBpQXV0bykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtleVNlYXJjaC5zZXQoZ2V0PGFueT4odGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhLCAna2V5U2VhcmNoJywgJycpKTtcbiAgICAgICAgdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkuc2V0KHRoaXMuZmlsdGVyKCkpO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXIoKT8uZmlsdGVyRGF0YSAmJiAhdGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhWydpbnN0YW5jZVNvcnQnXSAmJiB0aGlzLmluc3RhbmNlU29ydCgpKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkudXBkYXRlKGRhdGEgPT4gKHsgLi4uZGF0YSwgaW5zdGFuY2VTb3J0OiB0aGlzLmluc3RhbmNlU29ydCgpIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpICYmIHRoaXMuc3RvcmVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpPy4oc2lnbmFsKFsuLi50aGlzLnN0b3JlcygpXSksIHsgLi4uKHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSB8fCB7fSksIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSB8fCBbXSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgcmVzZXQ6IHRoaXMucmVzZXQuYmluZCh0aGlzKSxcbiAgICAgIGNhbGxBcGlCeVNlcnZpY2U6IHRoaXMuY2FsbEFwaUJ5U2VydmljZS5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRTY3JvbGw6IHRoaXMucmVzZXRTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgIGFkZEl0ZW1zOiB0aGlzLmFkZEl0ZW1zLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVJdGVtczogdGhpcy5yZW1vdmVJdGVtcy5iaW5kKHRoaXMpLFxuICAgICAgZ2V0Q291bnQ6IHRoaXMuZ2V0Q291bnQuYmluZCh0aGlzKSxcbiAgICAgIGdldFNjcm9sbENvbnRhaW5lcjogdGhpcy5nZXRTY3JvbGxDb250YWluZXIuYmluZCh0aGlzKSxcbiAgICAgIGhpZGVUb29sQmFyQm90dG9tOiAoKSA9PiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0sXG4gICAgICByZXNldEtleVNlbGVjdGVkOiAoKSA9PiB0aGlzLmtleXNTZWxlY3RlZC5zZXQoW10pLFxuICAgICAgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXG4gICAgfSk7XG5cbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJykucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEluZGV4Um93ID0gKGRhdGE6IHsgdmFsdWU6IFRZUEVfSVRFTV9EQVRBX1RBQkxFIH0pID0+IHtcbiAgICByZXR1cm4gb2YodGhpcy5pdGVtcygpLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbSA9PT0gZGF0YS52YWx1ZSkgKyAxKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmJvZHlDb21wb25lbnRSZWYoKSBhcyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGxBcGlCeVNlcnZpY2UoZmlyc3RDYWxsOiBib29sZWFuLCByZXNldEFmdGVyQ2FsbEFwaT86IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaHR0cFJlcXVlc3REYXRhKCkgfHwgdGhpcy5sb2FkaW5nKCkgfHwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuICAgICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlckJ5ICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyQnkgPSB7XG4gICAgICAgICAgZmllbGRHZXRWYWx1ZTogJ3N0b3JlUGFyYW1zQ2FsbEFwaS5pbnN0YW5jZVNvcnQuZmllbGRTb3J0JyxcbiAgICAgICAgICBmaWVsZFVwZGF0ZTogJ1swXScsXG4gICAgICAgICAgc3ViRmllbGRVcGRhdGU6ICdvcmRlcl9ieSdcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlICYmICFndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJUeXBlICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyVHlwZSA9IHtcbiAgICAgICAgICBmaWVsZEdldFZhbHVlOiAnc3RvcmVQYXJhbXNDYWxsQXBpLmluc3RhbmNlU29ydC5tb2RlJyxcbiAgICAgICAgICBmaWVsZFVwZGF0ZTogJ1swXScsXG4gICAgICAgICAgc3ViRmllbGRVcGRhdGU6ICdvcmRlcl90eXBlJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICBpZiAoIXJlc2V0QWZ0ZXJDYWxsQXBpKSB7XG4gICAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldCh0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4udGhpcy5mYWtlUmVzcG9uc2VBcGkoKSwgc3RvcmVQYXJhbXNDYWxsQXBpOiB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpIH0sIHRoaXMucGFnaW5nU3RvcmUoKSwgdGhpcy5rZXlTZWFyY2goKSwgdHJ1ZSwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICAgIGlmIChmaXJzdENhbGwgJiYgcmVzZXRBZnRlckNhbGxBcGkpIHtcbiAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zdG9yZXMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgfVxuICAgICAgdGhpcy5wYWdpbmdTdG9yZS5zZXQocmVzdWx0LnBhZ2luZyk7XG4gICAgICB0aGlzLnRvdGFsSXRlbUluQmFja2VuZC5zZXQocmVzdWx0LnBhZ2luZz8udG90YWxfaXRlbXMgfHwgMCk7XG4gICAgICB0aGlzLm91dFRvdGFsSXRlbS5lbWl0KHRoaXMudG90YWxJdGVtSW5CYWNrZW5kKCkpO1xuICAgICAgaWYgKCF0aGlzLnBhZ2luZ1N0b3JlKCkpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldCh0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4ucmVzdWx0LCBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpLCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCB0aGlzLmxvYWRlZExhc3RJdGVtKCksIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKSk7XG4gICAgICBhd2FpdCB0aGlzLmFkZEl0ZW1zKGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSB8fCBbXSksIGZhbHNlLCB0cnVlKTtcbiAgICAgIHRoaXMub3V0TG9hZERhdGFDb21wbGV0ZS5lbWl0KHRoaXMuc3RvcmVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgdGhpcy5vdXRMb2FkRGF0YUVycm9yLmVtaXQoZXJyb3IgYXMgSUh0dHBSZXNwb25zZUVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZha2VSZXNwb25zZUFwaSgpOiBUWVBFX09CSkVDVCB7XG4gICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQoZmFsc2UpO1xuICAgIHRoaXMucGFnaW5nU3RvcmUuc2V0KHt9KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5mYWtlUmVzcG9uc2VQYWdpbmdBcGkoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpIHtcbiAgICBpZiAoIXRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgfHwgIXRoaXMuc2hvd0Zvb3RlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSB0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIGFzIElIdHRwUmVxdWVzdENvbmZpZztcblxuICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpLCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCBmYWxzZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmNhbGxBcGkodGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSBhcyBJSHR0cFJlcXVlc3RDb25maWcpO1xuXG4gICAgdGhpcy5pdGVtRm9vdGVyLnNldChjb252ZXJ0T2JqZWN0VG9TaWduYWwocmVzdWx0LmRhdGEpKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRJdGVtcyhpdGVtczogVFlQRV9EQVRBX1RBQkxFLCBhZGRGaXJzdDogYm9vbGVhbiwgaWdub3JlSGlnaHRMaWdodD86IGJvb2xlYW4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4sIGF1dG9Db3VudE5ld0l0ZW0/OiBib29sZWFuKSB7XG4gICAgaWYgKCFpdGVtcygpIHx8ICFpdGVtcygpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc0FkZDogQXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+PiA9IFtdO1xuXG4gICAgaXRlbXMoKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKCF0aGlzLmNoZWNrRXhpc3RJdGVtKGl0ZW0pKSB7XG4gICAgICAgIGl0ZW1zQWRkLnB1c2goaXRlbSk7XG4gICAgICAgIGlmICghaWdub3JlSGlnaHRMaWdodCkge1xuICAgICAgICAgIHRoaXMuaGFzSXRlbUhpZ2h0TGlnaHQuc2V0KHRydWUpO1xuICAgICAgICAgIGl0ZW0udXBkYXRlKGRhdGEgPT4gKHsgLi4uZGF0YSwgc3BlY2lmaWNIaWdodExpZ2h0OiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkRmlyc3QpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZShkYXRhID0+IFtpdGVtLCAuLi5kYXRhXSk7XG4gICAgICAgICAgdGhpcy5zdG9yZXMudXBkYXRlKGRhdGEgPT4gW2l0ZW0sIC4uLmRhdGFdKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZShkYXRhID0+IFsuLi5kYXRhLCBpdGVtXSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZShkYXRhID0+IFsuLi5kYXRhLCBpdGVtXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGF1dG9Db3VudE5ld0l0ZW0gJiYgaXRlbXNBZGQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRvdGFsSXRlbUluQmFja2VuZC51cGRhdGUodmFsdWUgPT4gdmFsdWUgKyBpdGVtc0FkZC5sZW5ndGgpO1xuICAgIH1cbiAgICBpZiAoIWlnbm9yZUhpZ2h0TGlnaHQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpdGVtc0FkZC5mb3JFYWNoKGl0ZW0gPT4gaXRlbS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBzcGVjaWZpY0hpZ2h0TGlnaHQ6IGZhbHNlIH0pKSk7XG4gICAgICAgIHRoaXMuaGFzSXRlbUhpZ2h0TGlnaHQuc2V0KGZhbHNlKTtcbiAgICAgIH0sIHRoaXMudGltZUhpZ2hsaWdoTmV3SXRlbSgpKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jaGVja1Njcm9sbCgpO1xuICAgIGlmICghaWdub3JlUmVDYWxsRm9vdGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRXhpc3RJdGVtKGl0ZW1OZXc6IFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zKCkuZmluZChpdGVtID0+IGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWAgPT09IGAke2l0ZW1OZXcoKVt0aGlzLmZpZWxkS2V5KCldfWApID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVJdGVtcyhrZXlzOiBBcnJheTx1bmtub3duPiwgaWdub3JlUmVDYWxsRm9vdGVyPzogYm9vbGVhbikge1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKCk7XG4gICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICBsZXQgaXNVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICBpZiAoYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCA9PT0gYCR7a2V5fWApIHtcbiAgICAgICAgICAgIGlzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1VwZGF0ZSA/IG5ld0l0ZW1zIDogaXRlbXM7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zdG9yZXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWAgPT09IGAke2tleX1gKSB7XG4gICAgICAgICAgICBpc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXNVcGRhdGUgPyBuZXdJdGVtcyA6IGl0ZW1zO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghdGhpcy5rZXlzU2VsZWN0ZWQoKSB8fCAhdGhpcy5rZXlzU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQudXBkYXRlKGtleXMgPT4ga2V5cy5maWx0ZXIoa2V5U2VsZWN0ZWQgPT4ga2V5U2VsZWN0ZWQgIT09IGtleSkpO1xuICAgIH0pO1xuICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnVwZGF0ZSh2YWx1ZSA9PiB2YWx1ZSAtIGtleXMubGVuZ3RoKTtcbiAgICBhd2FpdCB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gICAgaWYgKCFpZ25vcmVSZUNhbGxGb290ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpO1xuICAgIH1cbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5odHRwUmVxdWVzdERhdGEoKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFnaW5nU3RvcmUoKT8udG90YWxfaXRlbXMgfHwgdGhpcy5pdGVtcygpLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pdGVtcygpLmxlbmd0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsKGU6IGFueSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gZS50YXJnZXQuc2Nyb2xsTGVmdDtcbiAgICBpZiAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkpIHtcbiAgICAgICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IGUudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb3R0b20oZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMubG9hZE1vcmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZE1vcmUoKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3V0TG9hZE1vcmUuZW1pdCh7IGxvYWRNb3JlU3VjY2VzczogdGhpcy5sb2FkTW9yZVN1Y2Nlc3MuYmluZCh0aGlzKSB9KTtcbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTW9yZVN1Y2Nlc3MoZGF0YTogV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4pIHtcbiAgICB0aGlzLmFkZEl0ZW1zKGRhdGEsIGZhbHNlKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUFsbENoZWNrZWQoKSB7XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlQ2hlY2tlZEFsbEl0ZW1zKGV2ZW50OiBJQ2hlY2tib3hFdmVudCkge1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQodGhpcy5pdGVtcygpLmZpbHRlcihhc3luYyAoaXRlbSkgPT4gIShhd2FpdCB0aGlzLmNoZWNrQ2FuY2VsQ29uZGl0aW9uQ2hlY2tlZEl0ZW0oaXRlbSkpKS5tYXAoaXRlbSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gKSk7XG4gICAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoW10pO1xuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0NhbmNlbENvbmRpdGlvbkNoZWNrZWRJdGVtKGl0ZW06IFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPikge1xuICAgIGxldCBpc0NhbmNlbENoZWNrID0gZmFsc2U7XG5cbiAgICBpZiAoIWlzQ2FuY2VsQ2hlY2sgJiYgdGhpcy5oZWFkZXJMZWZ0KCkubGVuZ3RoICYmIHRoaXMuaGVhZGVyTGVmdCgpWzBdLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4pIHtcbiAgICAgIGlzQ2FuY2VsQ2hlY2sgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKCh0aGlzLmhlYWRlckxlZnQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIGFzIGFueSkoeyBpdGVtOiBpdGVtKCkgfSkpIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaXNDYW5jZWxDaGVjayAmJiB0aGlzLmhlYWRlclJpZ2h0KCkubGVuZ3RoICYmIHRoaXMuaGVhZGVyUmlnaHQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuKSB7XG4gICAgICBpc0NhbmNlbENoZWNrID0gYXdhaXQgbGFzdFZhbHVlRnJvbSgodGhpcy5oZWFkZXJSaWdodCgpWzBdLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gYXMgYW55KSh7IGl0ZW06IGl0ZW0oKSB9KSkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzQ2FuY2VsQ2hlY2s7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUl0ZW1DaGVja2VkKGV2ZW50OiBJQ2hlY2tib3hJdGVtLCBpdGVtOiBUWVBFX09CSkVDVCkge1xuICAgIGNvbnN0IGtleSA9IGl0ZW1bdGhpcy5maWVsZEtleSgpXTtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldCh0aGlzLmtleXNTZWxlY3RlZCgpKTtcblxuICAgIGtleXMuYWRkKGtleSk7XG4gICAgaWYgKCFldmVudC5jaGVja2VkKSB7XG4gICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoQXJyYXkuZnJvbShrZXlzKSk7XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVNvcnQoc29ydDogSVNvcnQpIHtcbiAgICBpZiAodGhpcy5pbnN0YW5jZVNvcnQgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKT8uZmllbGRTb3J0ICE9PSBzb3J0LmZpZWxkU29ydCkge1xuICAgICAgdGhpcy5pbnN0YW5jZVNvcnQoKT8ucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5pbnN0YW5jZVNvcnQuc2V0KHNvcnQpO1xuICAgIGlmICh0aGlzLnNvcnRMb2NhbCgpKSB7XG4gICAgICB0aGlzLmhhbmRsZXJTb3J0TG9jYWwoc29ydCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkudXBkYXRlKGRhdGEgPT4gKHsgLi4uZGF0YSwgaW5zdGFuY2VTb3J0OiB0aGlzLmluc3RhbmNlU29ydCgpIH0pKTtcbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgdGhpcy5vdXRTb3J0LmVtaXQoe1xuICAgICAgc29ydDogc29ydCxcbiAgICAgIG9uU29ydFN1Y2Nlc3M6IHRoaXMub25Tb3J0U3VjY2Vzcy5iaW5kKHRoaXMpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZXJTb3J0TG9jYWwoc29ydDogSVNvcnQpIHtcbiAgICBpZiAodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpICYmIHRoaXMuc3RvcmVzKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLml0ZW1zLnNldCh0aGlzLmZpbHRlck9yU29ydExvY2FsKCk/LihzaWduYWwoWy4uLnRoaXMuc3RvcmVzKCldKSwgeyAuLi50aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpLCBpbnN0YW5jZVNvcnQ6IHNvcnQgfSkgfHwgW10pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgZmllbGRTb3J0LCBtb2RlIH0gPSBzb3J0O1xuXG4gICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgaXRlbXMuc29ydCgoaXRlbUEsIGl0ZW1CKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZTEgPSBtb2RlID09PSAnYXNjJyA/IGl0ZW1BKClbZmllbGRTb3J0XSA6IGl0ZW1CKClbZmllbGRTb3J0XTtcbiAgICAgICAgbGV0IHZhbHVlMiA9IG1vZGUgPT09ICdhc2MnID8gaXRlbUIoKVtmaWVsZFNvcnRdIDogaXRlbUEoKVtmaWVsZFNvcnRdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUxID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHZhbHVlMSA9IGRlbGV0ZVVuaWNvZGUodmFsdWUxKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgIHZhbHVlMiA9IGRlbGV0ZVVuaWNvZGUodmFsdWUyKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlMSA9PT0gdmFsdWUyKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWUxID4gdmFsdWUyID8gMSA6IC0xO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgIH0pO1xuICAgIHRoaXMub25Tb3J0U3VjY2VzcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xNb3JlU2VsZWN0SXRlbShmdW5jdGlvbkNvbnRyb2w6IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbSA9IGZ1bmN0aW9uQ29udHJvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWRNb3JlSXRlbShldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5rZXkgfHwgIXRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0/LnJlc2V0KCk7XG5cbiAgICBjb25zdCBwZXJQYWdlID0gTnVtYmVyKGV2ZW50LmtleSkudmFsdWVPZigpO1xuICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gTnVtYmVyKHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKHBlclBhZ2UpKS52YWx1ZU9mKCk7XG4gICAgY29uc3QgaXNQYWdpbmdOdW1iZXIgPSB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LnBhZ2luZ051bWJlcjtcblxuICAgIGlmIChjdXJyZW50UGFnZSA+IHBlclBhZ2UgfHwgdGhpcy5pdGVtcy5sZW5ndGggPj0gcGVyUGFnZSkge1xuICAgICAgaWYgKCFpc1BhZ2luZ051bWJlcikge1xuICAgICAgICB0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShjdXJyZW50UGFnZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQodGhpcy5pdGVtcygpLnNsaWNlKDAsIHBlclBhZ2UpLm1hcChpdGVtID0+IGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWApKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSh0cnVlLCB0cnVlKTtcbiAgICBjb25zdCBzdWIgPSB0aGlzLm91dExvYWREYXRhQ29tcGxldGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKCFpc1BhZ2luZ051bWJlcikge1xuICAgICAgICB0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShjdXJyZW50UGFnZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQodGhpcy5pdGVtcygpLnNsaWNlKDAsIHBlclBhZ2UpLm1hcChpdGVtID0+IGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWApKTtcbiAgICB9KTtcblxuICAgIHRoaXMub3V0TG9hZERhdGFFcnJvci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBhZ2UpO1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKHBlclBhZ2U6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgYXJndW1lbnRzVmFsdWUgPSB0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpPy5hcmd1bWVudHNWYWx1ZTtcblxuICAgIGlmICghYXJndW1lbnRzVmFsdWUgfHwgIXRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgcmV0dXJuICctMSc7XG4gICAgfVxuICAgIGNvbnN0IGtleVBlclBhZ2UgPSB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LmtleVBlclBhZ2UgfHwgJ3Blcl9wYWdlJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhcmd1bWVudCA9IGFyZ3VtZW50c1ZhbHVlW2ldO1xuXG4gICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBIdHRwUGFyYW1zICYmIGFyZ3VtZW50LmhhcyhrZXlQZXJQYWdlKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50UGVyUGFnZSA9IGFyZ3VtZW50LmdldChrZXlQZXJQYWdlKSB8fCAnMjUnO1xuXG4gICAgICAgIGFyZ3VtZW50ID0gYXJndW1lbnQuc2V0KGtleVBlclBhZ2UsIHBlclBhZ2UpO1xuICAgICAgICBzZXQoYXJndW1lbnRzVmFsdWUsIGAke2l9YCwgYXJndW1lbnQpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50UGVyUGFnZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgT2JqZWN0ICYmIE9iamVjdC5rZXlzKGFyZ3VtZW50KS5pbmNsdWRlcyhrZXlQZXJQYWdlKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50UGVyUGFnZSA9IGFyZ3VtZW50LmdldChrZXlQZXJQYWdlKSB8fCAnMjUnO1xuXG4gICAgICAgIHNldChhcmd1bWVudCwga2V5UGVyUGFnZSwgcGVyUGFnZSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQZXJQYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnLTEnO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNvcnRTdWNjZXNzKCkge1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB0aGlzLnJlc2V0U2Nyb2xsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckJ1dHRvbkNsaWNrKHR5cGU6ICdidXR0b24nIHwgJ2J1dHRvbi1kcm9wZG93bicsIGJ1dHRvbkRyb3Bkb3duRGF0YTogYW55LCBidXR0b246IElCdXR0b24pIHsgLy8gYnV0dG9uT3JpZ2luIGNo4buJIHPhu60gZOG7pW5nIGtoaSBkw7luZyBidXR0b25BY3Rpb25zIGPDsyBidXR0b24tZHJvcGRvd25cbiAgICBpZiAodHlwZSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLm91dENsaWNrQnV0dG9uQWN0aW9uLmVtaXQoeyBpdGVtOiB0aGlzLml0ZW1PZkluZGV4SG92ZXIsIGJ1dHRvbjogYnV0dG9uIH0pO1xuICAgIH1cbiAgICB0aGlzLm91dENsaWNrQnV0dG9uQWN0aW9uLmVtaXQoeyBpdGVtOiB0aGlzLml0ZW1PZkluZGV4SG92ZXIsIGJ1dHRvbiwgYnV0dG9uRHJvcGRvd25EYXRhIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCYXJCdXR0b25DbGljayhidXR0b246IElCdXR0b24pIHtcbiAgICBjb25zdCBpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4gPSBbXTtcblxuICAgIHRoaXMua2V5c1NlbGVjdGVkKCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXMoKS5maW5kKGl0ZW0gPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCA9PT0gYCR7a2V5fWApO1xuXG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMub3V0Q2xpY2tCYXJCdXR0b24uZW1pdCh7XG4gICAgICBidXR0b24sXG4gICAgICBpdGVtcyxcbiAgICAgIGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCksXG4gICAgICBoaWRkZW5CYXJCdXR0b25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQnV0dG9uRHJvcGRvd25FdmVudChldmVudE5hbWU6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIHRoaXMuaGFzQWN0aW9uQnV0dG9uRHJvcGRvd25Db250ZW50LnNldCh0cnVlKTtcbiAgICBpZiAoZXZlbnROYW1lID09PSAncmVtb3ZlJyB8fCBldmVudE5hbWUgPT09ICdtb3VzZWxlYXZlLWNvbnRlbnQnKSB7XG4gICAgICB0aGlzLmhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudC5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRJbmRleEhvdmVyKGU6IEV2ZW50LCBpdGVtOiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghdGhpcy5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5yZXNldEluZGV4SG92ZXIoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1PZkluZGV4SG92ZXIgPSBpdGVtO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKGU/OiBFdmVudCkge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleEl0ZW1Ib3ZlciA9IHRoaXMuaXRlbU9mSW5kZXhIb3ZlcjtcblxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0oKSk7XG4gICAgdGhpcy50aW1lb3V0TGVhdmVJdGVtLnNldChzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLml0ZW1PZkluZGV4SG92ZXIgJiYgdGhpcy5pdGVtT2ZJbmRleEhvdmVyICE9PSBjdXJyZW50SW5kZXhJdGVtSG92ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZSk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0SW5kZXhIb3ZlcihlPzogRXZlbnQpIHtcbiAgICBlPy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5oYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1PZkluZGV4SG92ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlRW50ZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZXZlbnQpO1xuICAgIGlmICh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKSB7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUxlYXZlKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKSB7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCgnYmctWyNmOGY5ZmFdJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldFNjcm9sbCgpIHtcbiAgICBpZiAodGhpcy5oZWFkZXJFbGVtZW50UmVmKCkpIHtcbiAgICAgICh0aGlzLmhlYWRlckVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLkJvZHlFbGVtZW50KSB7XG4gICAgICB0aGlzLkJvZHlFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICB0aGlzLkJvZHlFbGVtZW50LnNjcm9sbExlZnQgPSAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkpIHtcbiAgICAgICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldChjbGVhclNvcnQ/OiBib29sZWFuKSB7XG4gICAgaWYgKGNsZWFyU29ydCkge1xuICAgICAgdGhpcy5pbnN0YW5jZVNvcnQoKT8ucmVzZXQoKTtcbiAgICAgIHRoaXMuaW5zdGFuY2VTb3J0LnNldCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB0aGlzLml0ZW1zLnNldChbXSk7XG4gICAgdGhpcy5zdG9yZXMuc2V0KFtdKTtcbiAgICB0aGlzLmZha2VSZXNwb25zZUFwaSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1Njcm9sbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoYXNTY3JvbGwgPSB0aGlzLmhhc1Njcm9sbCgpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGltZXIoNTAwKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLkJvZHlFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gdGhpcy5Cb2R5RWxlbWVudC5vZmZzZXRIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNTY3JvbGwgJiYgIXRoaXMuaGFzU2Nyb2xsKCkpIHtcbiAgICAgICAgICB0aGlzLm91dFNjcm9sbElzR29uZS5lbWl0KHt9KTtcbiAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSkge1xuICAgICAgICAgICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgQm9keUVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmJvZHlFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0TGVhdmVJdGVtKCkpO1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9J2ZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCc+XG4gIEBpZiAoIWlnbm9yZUJhcigpKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiByZWxhdGl2ZSB6LVsxXSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGJnLXdoaXRlIG1iLVsxNnB4XSBsaWJzLXVpLXRhYmxlLXNoYWRvdy1ib3R0b21cIlxuICAgICAgW2NsYXNzLnB4LVsxNnB4XV09XCJrZXlzU2VsZWN0ZWQoKS5sZW5ndGggfHwgbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKVwiXG4gICAgICBbY2xhc3MucHktWzZweF1dPVwia2V5c1NlbGVjdGVkKCkubGVuZ3RoIHx8IGxhYmVsQmFyTm9TZWxlY3RJdGVtKClcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwicmVzZXRJbmRleEhvdmVyKCRldmVudClcIj5cbiAgICAgIEBpZiAoIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBsYWJlbEJhck5vU2VsZWN0SXRlbSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ7eyBjbGFzc0xhYmVsQmFyTm9TZWxlY3RJdGVtKCkgPz8gJ3B4LVsxMnB4XSBweS1bNXB4XScgfX1cIlxuICAgICAgICAgIFtpbm5lckh0bWxdPSdsYWJlbEJhck5vU2VsZWN0SXRlbSgpIHwgdHJhbnNsYXRlOnt2YWx1ZTp0b3RhbEl0ZW1EaXNwbGF5KCl9Jz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGtleXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcGwtWzEycHhdXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGgtZnVsbCBtdC1bLTJweF1cIj5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtjaGVja2VkXT1cInRydWVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgZGlzYWJsZUNoZWNrYm94KClcIlxuICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VBbGxDaGVja2VkKClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVtIHRleHQtWyMwNzE2MzFdIG1yLVs4cHhdIHt7IGNsYXNzTGFiZWxCYXJCdXR0b25zKCkgfX1cIj5cbiAgICAgICAgICAgIHt7IGxhYmVsQmFyQnV0dG9ucygpIHwgdHJhbnNsYXRlOnsgdmFsdWU6a2V5c1NlbGVjdGVkKCkubGVuZ3RoIH0gfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7XG4gICAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDpmYWxzZSxcbiAgICAgICAgICAgICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6ICAyMDQ4LFxuICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZTonIXctWzEyMXB4XScsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIG1vZGU6J3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOjBcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdENvbmZpZ01vcmVJdGVtKClcIlxuICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjVcIlxuICAgICAgICAgICAgICBjbGFzcz1cIiF3LVsxNnB4XSBoLVsxNnB4XSBtci1bOHB4XVwiXG4gICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkTW9yZUl0ZW0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2xNb3JlU2VsZWN0SXRlbSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wIG0tMCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidiZWZvcmU6IXRleHQtWzE2cHhdIGxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCBtci1bNnB4XSdcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cIntjb25maWc6e2NvbnRlbnQ6J2kxOG5fbW9yZV9zZWxlY3QnfX1cIlxuICAgICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1bMTZweF0gbGlicy11aS1ib3JkZXItbGVmdC1nZW5lcmFsIG1sLVsxNnB4XVwiPjwvZGl2PlxuICAgICAgICAgIEBpZiAoYmFyQnV0dG9ucygpPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBiYXJCdXR0b25zKCk7dHJhY2sgYnV0dG9uKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiYnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b24uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiKGJ1dHRvbi5sYWJlbCB8fCAnICcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckJhckJ1dHRvbkNsaWNrKGJ1dHRvbilcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9J2Rpdi5saWJzLXVpLXRhYmxlLWJhci1yaWdodCc+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPGRpdiAjdGFibGVDb250YWluZXJFbGVtZW50UmVmXG4gICAgY2xhc3M9XCJsaWJzLXVpLXRhYmxlIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCByZWxhdGl2ZSB7eyBjbGFzc1RhYmxlQ29udGFpbmVySW5jbHVkZSgpIH19XCJcbiAgICBbY2xhc3MucHgtWzE2cHhdXT0nIWlnbm9yZUJhcigpJ1xuICAgIChtb3VzZWxlYXZlKT1cInJlc2V0SW5kZXhIb3ZlcigkZXZlbnQpXCI+XG4gICAgPGRpdiAjaGVhZGVyRWxlbWVudFJlZlxuICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWJvdHRvbS1kYXNoZWQtZ2VuZXJhbF09XCIhaGFzSXRlbUhpZ2h0TGlnaHQoKSAmJiBpc0Rhc2hCb3JkZXIoKVwiXG4gICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWxdPVwiIWhhc0l0ZW1IaWdodExpZ2h0KCkgJiYgIWlzRGFzaEJvcmRlcigpXCJcbiAgICAgIFtjbGFzcy4haGlkZGVuXT1cIiFpdGVtcygpLmxlbmd0aCAmJiBpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKVwiXG4gICAgICBbY2xhc3NdPVwiY2xhc3NIZWFkZXJDb250YWluZXIoKVwiXG4gICAgICAobW91c2VlbnRlcik9XCJyZXNldEluZGV4SG92ZXIoJGV2ZW50KVwiPlxuICAgICAgQGlmIChoZWFkZXJMZWZ0KCkubGVuZ3RoKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgZmxleCBzdGlja3kgdG9wLTAgbGVmdC0wIHotWzFdIHt7IGNsYXNzSGVhZGVySW5jbHVkZSgpIH19XCI+XG4gICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlclJlZjtjb250ZXh0OntoZWFkZXJJdGVtOmhlYWRlcixpc0hlYWRlckxlZnQ6dHJ1ZX1cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGhlYWRlclJpZ2h0KCkubGVuZ3RoKSB7XG4gICAgICAgIEBmb3IgKGhlYWRlciBvZiBoZWFkZXJSaWdodCgpO3RyYWNrIGhlYWRlcikge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlclJlZjtjb250ZXh0OntoZWFkZXJJdGVtOmhlYWRlcixpc0hlYWRlckxlZnQ6ZmFsc2V9XCIgLz5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIEBpZiAoc2hvd0Zvb3RlcigpICYmIGl0ZW1Gb290ZXIoKSAmJiBjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAndG9wJykge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD0ndGVtcGxhdGVGb290ZXJSZWYnIC8+XG4gICAgfVxuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgb3ZlcmZsb3cteC1oaWRkZW4gYmctd2hpdGUge3sgY2xhc3NCb2R5SW5jbHVkZSgpIHx8ICcnIH19XCI+XG4gICAgICBAaWYgKGl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICAgIDxkaXYgI2JvZHlFbGVtZW50UmVmXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LWZ1bGwgcmVsYXRpdmVcIlxuICAgICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgICAgW29wdGlvbnNdPVwie3Njcm9sbFg6ICghaGVhZGVyTGVmdCgpLmxlbmd0aCB8fCAhaGVhZGVyUmlnaHQoKSkgPyAnaGlkZGVuJzonc2Nyb2xsJ31cIlxuICAgICAgICAgIChvdXRTY3JvbGwpPVwiaGFuZGxlclNjcm9sbCgkZXZlbnQpXCJcbiAgICAgICAgICAob3V0U2Nyb2xsQm90dG9tKT1cImhhbmRsZXJTY3JvbGxCb3R0b20oJGV2ZW50KVwiPlxuICAgICAgICAgIDx2aXJ0dWFsLXNjcm9sbGVyICNib2R5Q29tcG9uZW50UmVmXG4gICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXMoKVwiXG4gICAgICAgICAgICBbZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXNdPVwiZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImgtZnVsbFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aCA+IChib2R5RWxlbWVudFJlZiA/IGJvZHlFbGVtZW50UmVmLnNjcm9sbFdpZHRoIDogMCkgPyBoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW3BhcmVudFNjcm9sbF09XCJib2R5RWxlbWVudFJlZlwiXG4gICAgICAgICAgICBbYnVmZmVyQW1vdW50XT1cImJ1ZmZlckFtb3VudCgpXCI+XG4gICAgICAgICAgICBAZm9yIChkYXRhIG9mIGJvZHlDb21wb25lbnRSZWYudmlld1BvcnRJdGVtczt0cmFjayBkYXRhKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiAjZWxlbWVudEhvdmVyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci10b3AtMXB4LTM2ZDNkM109XCJkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0ICYmICRmaXJzdCAmJiAhaWdub3JlQm9yZGVySXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLTFweC0zNmQzZDNdPVwiZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCAmJiAhaWdub3JlQm9yZGVySXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIoZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCB8fCAoJGxhc3QgJiYgaWdub3JlQm9yZGVySXRlbUxhc3QoKSkpID8gJ2xpYnMtdWktYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdC00cHggbGlicy11aS1ib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodC00cHgnIDogaWdub3JlQm9yZGVySXRlbSgpID8gJycgOiBpc0Rhc2hCb3JkZXIoKSA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZGFzaGVkLWdlbmVyYWwnIDogJ2xpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsJ1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2Y4ZjlmYV1dPVwiaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2V0SW5kZXhIb3ZlcigkZXZlbnQsZGF0YSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGggfHwgaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctd2hpdGVdPVwiIWRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBweC1bMTJweF0gcHktWzhweF0ge3sgaGVhZGVyLmlnbm9yZUJvcmRlclJpZ2h0ID8gJyc6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmOGY5ZmFdXT1cIml0ZW1PZkluZGV4SG92ZXIgPT09IGRhdGEgJiYgIWRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaGVhZGVyLm5nU3R5bGUgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8ICB7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlQm9keVJlZjtjb250ZXh0OntoZWFkZXI6aGVhZGVyLGRhdGE6ZGF0YX1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChoZWFkZXJSaWdodCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlclJpZ2h0KCk7dHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHB4LVsxMnB4XSBweS1bOHB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaGVhZGVyLm5nU3R5bGUgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUJvZHlSZWY7Y29udGV4dDp7aGVhZGVyOmhlYWRlcixkYXRhOmRhdGF9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpICYmIGRhdGEoKS5zcGVjaWZpY0V4cGFuZCAmJiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNzc1dyYXBwZXIgfHwgJ2ZsZXggdy1mdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUV4cGFuZCBvZiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSgpO3RyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXMgW2l0ZW1dPVwiZGF0YUV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGgtWzEwMHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdmlydHVhbC1zY3JvbGxlcj5cblxuICAgICAgICAgIEBpZiAoKCFpdGVtcygpLmxlbmd0aCkgJiYgIWxvYWRpbmcoKSAmJiBub0RhdGFDb25maWcoKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtZnVsbFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5mbGV4XT1cIicwIDAgJytoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoKydweCdcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKCghaXRlbXMoKS5sZW5ndGgpICYmICFsb2FkaW5nKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGgtZnVsbCB3LWZ1bGxcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb2RhdGFSZWZcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmIChzaG93Rm9vdGVyKCkgJiYgaXRlbUZvb3RlcigpICYmIGN1c3RvbVBvc2l0aW9uRm9vdGVyKCkgPT09ICdib3R0b20nKSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9J3RlbXBsYXRlRm9vdGVyUmVmJyAvPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgdy1mdWxsIGgtZnVsbCB6LVsyXSBmbGV4IGl0ZW1zLWNlbnRlciBjb250ZW50LWNlbnRlclwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc3Bpbm5lciAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUhlYWRlclJlZlxuICBsZXQtaGVhZGVyPSdoZWFkZXJJdGVtJ1xuICBsZXQtaXNIZWFkZXJMZWZ0PSdpc0hlYWRlckxlZnQnPlxuICA8ZGl2IFtjbGFzc109XCIncmVsYXRpdmUgZmxleCAnKyAoaGVhZGVyLnBhZGRpbmdMZWZ0UmlnaHRIZWFkZXJDb250YWluZXIgPz8gJyBweC1bMTJweF0gJykgKyAoaXNIZWFkZXJMZWZ0ICYmICFoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnIGxpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwgJyA6ICcgJykrICcgbGlicy11aS10YWJsZS1oZWFkZXItY29sICdcIlxuICAgIFtjbGFzcy5mbGV4LWNvbF09XCJoZWFkZXIucm93c0NvbmZpZ1wiXG4gICAgW2NsYXNzLnB5LVs4cHhdXT0nIWhlYWRlci5pZ25vcmVQeURlZmF1bHQnXG4gICAgW25nU3R5bGVdPVwiaGVhZGVyLm5nU3R5bGUgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pXCJcbiAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgIEBpZiAoIWhlYWRlci5yb3dzQ29uZmlnKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJDb250ZW50UmVmO2NvbnRleHQ6e2hlYWRlckl0ZW06aGVhZGVyLGlzQ29sUmVuZGVyOmZhbHNlfVwiIC8+XG4gICAgfVxuICAgIEBpZiAoaGVhZGVyLnJvd3NDb25maWc7YXMgcm93c0NvbmZpZykge1xuICAgICAgQGZvciAocm93IG9mIHJvd3NDb25maWcucm93czt0cmFjayByb3cpIHtcbiAgICAgICAgPGRpdiBbY2xhc3NdPVwicm93LmNsYXNzUm93XCI+XG4gICAgICAgICAgQGZvciAoY29sIG9mIHJvdy5jb2xzIDsgdHJhY2sgY29sKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJDb250ZW50UmVmO2NvbnRleHQ6e2hlYWRlckl0ZW06Y29sLGlzQ29sUmVuZGVyOnRydWV9XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlSGVhZGVyQ29udGVudFJlZlxuICBsZXQtaGVhZGVyPSdoZWFkZXJJdGVtJ1xuICBsZXQtaXNDb2xSZW5kZXI9J2lzQ29sUmVuZGVyJz5cbiAgPGRpdiBjbGFzcz1cImZsZXggbGlicy11aS1mb250LWg2bSBtaW4taC1bMThweF0gdGV4dC1bIzZhNzM4M10gbWF4LXctZnVsbFwiXG4gICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09J2hlYWRlci5jb250ZW50SGVhZGVyQWxpZ25DZW50ZXIgPz8gdHJ1ZSdcbiAgICBbY2xhc3MuanVzdGlmeS1lbmRdPSdoZWFkZXIuY29udGVudEhlYWRlckp1c3RpZnlDb250ZW50RW5kJ1xuICAgIFtjbGFzcy53LWZ1bGxdPVwiaGVhZGVyLmlzU2hvd0luZGV4T25Sb3dcIlxuICAgIFtuZ1N0eWxlXT1cImlzQ29sUmVuZGVyID8gKGhlYWRlci5uZ1N0eWxlIHx8IChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHt3aWR0aDonNTBweCcsJ2ZsZXgtc2hpcmsnOicwJyxwYWRkaW5nOic4cHgnfSA6IHt9KSkgOiB7fVwiXG4gICAgW25nQ2xhc3NdPVwiaXNDb2xSZW5kZXIgPyAoaGVhZGVyLm5nQ2xhc3MgfHwge30pIDoge31cIj5cbiAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveCkge1xuICAgICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3hBbGwpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIHt7IGhlYWRlci5jaGVja2JveEFsbENsYXNzSW5jbHVkZSB8fCAnbXItWzE2cHhdJyB9fVwiXG4gICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY2hlY2tib3hBbGlnbkNlbnRlclwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtrZXldPVwiJ2FsbCdcIlxuICAgICAgICAgICAgW3N0aWxsT3RoZXJPcHRpb25zXT1cIiEha2V5c1NlbGVjdGVkKCkubGVuZ3RoICYmIGtleXNTZWxlY3RlZCgpLmxlbmd0aCAhPT0gaXRlbXMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiISFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoID09PSBpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKClcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIuY2hlY2tib3hDbGFzc0luY2x1ZGVcIlxuICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZEFsbEl0ZW1zKCRldmVudClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBoLWZ1bGwgbWwtWzI0cHhdIHt7IGhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZSB9fVwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB7eyBoZWFkZXIuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICB7eyBoZWFkZXIubGFiZWwgPz8gJyMnIH19XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBpZiAoKGhlYWRlci5sYWJlbCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6aGVhZGVyLnBhcnNlVmFsdWU6aGVhZGVyKSB8IGFzeW5jIHwgdHJhbnNsYXRlOyBhcyBsYWJlbEhlYWRlckNvbHVtbikge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8udHlwZSB8fCAndGV4dCdcIlxuICAgICAgICAgIFttb2RlXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIoaGVhZGVyPy5sYWJlbENvbmZpZz8uY2xhc3NJbmNsdWRlIHx8ICcnKVwiXG4gICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cImhlYWRlci5sYWJlbENvbmZpZz8uY29uZmlnIHx8IHtjb250ZW50OmxhYmVsSGVhZGVyQ29sdW1ufVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJsYWJlbEhlYWRlckNvbHVtblwiIC8+XG4gICAgICB9XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIudG9vbHRpcE90aGVyOyBhcyB0b29sdGlwKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWwtWzRweF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cInRvb2x0aXA/LnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgW21vZGVdPVwidG9vbHRpcD8ubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cInRvb2x0aXAuY2xhc3NJbmNsdWRlIHx8ICd0ZXh0LVsjNmE3MzgzXSdcIlxuICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0b29sdGlwLmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cInRvb2x0aXAuY29uZmlnIHx8IHtjb250ZW50Oih0b29sdGlwLmRhdGFWaWV3IHx8ICcgJykgfCB0cmFuc2xhdGUsIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIG1vZGU6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICAgICAgYXV0b1VwZGF0ZVBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgZW5kRGlzdGFuY2U6IDEyLFxuICAgICAgICAgICAgICAgIHN0YXJ0RGlzdGFuY2U6IC0xMlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJ0b29sdGlwLmRhdGFWaWV3XCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmhhc1NvcnQgJiYgaGVhZGVyLm9yZGVyYnkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtbC1bNHB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc29ydC1hcnJvdyBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgIWl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICBbZmllbGRTb3J0XT1cImhlYWRlci5vcmRlcmJ5XCJcbiAgICAgICAgICBbaWdub3JlUG9wb3ZlckNvbnRlbnRdPVwiaGVhZGVyLnNvcnRJZ25vcmVUb29sdGlwQ29udGVudCA/PyB0cnVlXCJcbiAgICAgICAgICBbcG9wb3ZlckNvbnRlbnRBc2NdPVwiaGVhZGVyLnNvcnRUb29sdGlwQ29udGVudEFzY1wiXG4gICAgICAgICAgW3BvcG92ZXJDb250ZW50RGVzY109XCJoZWFkZXIuc29ydFRvb2x0aXBDb250ZW50RGVzY1wiXG4gICAgICAgICAgW2RlZmF1bHRNb2RlXT1cImhlYWRlci5kZWZhdWx0TW9kZVwiXG4gICAgICAgICAgW3pJbmRleF09XCJoZWFkZXIuekluZGV4VG9vbHRpcFNvcnRcIlxuICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZVNvcnQoJGV2ZW50KVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKGhlYWRlci5sYWJlbERlc2NyaXB0aW9uKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6IGhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNvbnRlbnQgfCB0cmFuc2xhdGV9XCJcbiAgICAgICAgW2lubmVySFRNTF09XCJoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jb250ZW50IHwgdHJhbnNsYXRlXCIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUJvZHlSZWZcbiAgbGV0LWhlYWRlcj0naGVhZGVyJ1xuICBsZXQtZGF0YT0nZGF0YSc+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBoLWZ1bGxcIj5cbiAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveCkge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsXCJcbiAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCJoZWFkZXIuY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiAmJiggZGF0YSgpIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpoZWFkZXIuY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbjpkYXRhKCkgfCBhc3luYylcIlxuICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cImhlYWRlci5jaGVja2JveEFsaWduQ2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtrZXldPVwiZGF0YSgpW2ZpZWxkS2V5KCldXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNTZWxlY3RlZCgpOmtleXNTZWxlY3RlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8IGRpc2FibGVDaGVja2JveCgpIHx8ICEhKG1heEl0ZW1TZWxlY3RlZCgpICYmICEoZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNTZWxlY3RlZCgpOmtleXNTZWxlY3RlZCgpLmxlbmd0aCkgJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoID49IG1heEl0ZW1TZWxlY3RlZCgpKVwiXG4gICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoJGV2ZW50LGRhdGEoKSlcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdzsgYXMgY29uZmlnKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGxpYnMtdWktZm9udC1oNHJ7eyBjb25maWcuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICA8ZGl2IExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICBbY29uZmlnXT1cInt9XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImRhdGEgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmdldEluZGV4Um93IHwgYXN5bmNcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5jb2xUZW1wbGF0ZUNvbmZpZykge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXMgW2lzSG92ZXJdPVwiaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhZGF0YS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICBbY2xhc3NdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICBbaXRlbV09XCJkYXRhXCJcbiAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJoZWFkZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgW2NvbmZpZ3NdPVwiaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUZvb3RlclJlZj5cbiAgQGlmICghaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhKCkgfHwgKGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpICYmIGl0ZW1zKCkubGVuZ3RoKSkge1xuICAgIDxkaXYgI2Zvb3RlckVsZW1lbnRSZWZcbiAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgYmctWyNmOGY5ZmFdIG92ZXJmbG93LXgtaGlkZGVuIHotWzFdIHt7IGlnbm9yZUJvcmRlckZvb3RlcigpID8gJyc6IChjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAndG9wJyA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCc6J2xpYnMtdWktdGFibGUtc2hhZG93LXRvcCBsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCcpIH19IG1pbi1oLVszNXB4XVwiXG4gICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVyTW91c2VFbnRlcigkZXZlbnQpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZXJNb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgIEBpZiAoZm9vdGVyTGVmdCgpKSB7XG4gICAgICAgIDxkaXYgI2Zvb3RlckxlZnRFbGVtZW50UmVmXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV0gYmctWyNmOGY5ZmFdXCI+XG4gICAgICAgICAgQGZvciAoZm9vdGVyIG9mIGZvb3RlckxlZnQoKTt0cmFjayBmb290ZXIpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTJweF0gcHktWzhweF0ge3sgZm9vdGVyLmlnbm9yZUJvcmRlclJpZ2h0ID8gJyc6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImZvb3Rlci5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgQGlmIChmb290ZXIuY29sVGVtcGxhdGVDb25maWcpIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlcyBbaXRlbV09XCJpdGVtRm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJmb290ZXIuY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChmb290ZXJSaWdodCgpKSB7XG4gICAgICAgIEBmb3IgKGZvb3RlciBvZiBmb290ZXJSaWdodCgpO3RyYWNrIGZvb3Rlcikge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTJweF0gcHktWzhweF1cIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZm9vdGVyLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgIEBpZiAoZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzIFtpdGVtXT1cIml0ZW1Gb290ZXJcIlxuICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVOb2RhdGFSZWY+XG4gIEBpZiAobm9EYXRhQ29uZmlnKCk7IGFzIGNvbmZpZykge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIGFic29sdXRlIGxlZnQtMCB0b3AtMCB6LVsxXVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgc2hyaW5rLTBcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZT5cbiAgICAgICAgQGlmICgha2V5U2VhcmNoKCkgJiYgIW9ubHlTaG93Tm9SZXN1bHQoKSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiICgnbm8tZGF0YScgfCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIHwgYXN5bmMpO2lucHV0czp7c2l6ZTo2NH1cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLXRhYmxlLW5vLWRhdGEtY29uZmlnLXRleHRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiY29uZmlnLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJjb25maWcudGV4dE5vRGF0YSB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoa2V5U2VhcmNoKCkgfHwgb25seVNob3dOb1Jlc3VsdCgpKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCIoJ25vLXJlc3VsdCcgfCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIHwgYXN5bmMpO2lucHV0czp7c2l6ZTo2NH1cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLXRhYmxlLW5vLWRhdGEtY29uZmlnLXRleHRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiY29uZmlnLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJjb25maWcudGV4dFNlYXJjaE5vRGF0YSB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
635
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDNU0sT0FBTyxFQUE0QixxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pHLE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBUyx5Q0FBeUMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBHLE9BQU8sRUFBa0IsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RyxPQUFPLEVBQWlELGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEksT0FBTyxFQUFFLGdDQUFnQyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQ25HLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSwrQkFBK0Is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Q3ZDLGdDQUFnQyxpR0FBRSxnQ0FBZ0MscWVBQ2xFLHNDQUFzQyx5UUFBRSwrQkFBK0IsbUVBQ3ZFLHFDQUFxQyx5RUFBRSxpQ0FBaUM7OzRGQUcvRCw4QkFBOEI7a0JBakIxQyxTQUFTOytCQUVFLDBCQUEwQixjQUd4QixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsdUNBQXVDO3dCQUN6RyxlQUFlLEVBQUUscUJBQXFCLEVBQUUsc0NBQXNDO3dCQUM5RSxpQ0FBaUMsRUFBRSx5Q0FBeUM7d0JBQzVFLHVDQUF1Qzt3QkFDdkMsZ0NBQWdDLEVBQUUsZ0NBQWdDO3dCQUNsRSxzQ0FBc0MsRUFBRSwrQkFBK0I7d0JBQ3ZFLHFDQUFxQyxFQUFFLGlDQUFpQztxQkFDekUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nQ29tcG9uZW50T3V0bGV0LCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGQsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudCwgVmlydHVhbFNjcm9sbGVyTW9kdWxlIH0gZnJvbSAnQGloYXJiZWNrL25neC12aXJ0dWFsLXNjcm9sbGVyJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJU29ydCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTb3J0QXJyb3dDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtc29ydCc7XG5pbXBvcnQgeyBJQ2hlY2tib3hJdGVtIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtY2hlY2tib3gtZ3JvdXBcIjtcbmltcG9ydCB7IElDaGVja2JveEV2ZW50LCBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGVcIjtcbmltcG9ydCB7IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3ZlclwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheVwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1NwaW5uZXJDb21wb25lbnQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1zcGlubmVyXCI7XG5pbXBvcnQgeyBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIH0gZnJvbSBcIkBsaWJzLXVpL2ljb25zXCI7XG5pbXBvcnQgeyBJSHR0cFJlc3BvbnNlRXJyb3IsIElQYWdpbmcsIFRZUEVfT0JKRUNUIH0gZnJvbSBcIkBsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXNcIjtcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tIFwiQGxpYnMtdWkvcGlwZXMtY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2hlY2stc2VsZWN0ZWQtYnkta2V5JztcbmltcG9ydCB7IElIdHRwUmVxdWVzdENvbmZpZywgTGlic1VpSHR0cFJlcXVlc3RTZXJ2aWNlLCByZXR1cm5MaXN0T2JqZWN0IH0gZnJvbSBcIkBsaWJzLXVpL3NlcnZpY2VzLWh0dHAtcmVxdWVzdFwiO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjb252ZXJ0T2JqZWN0VG9TaWduYWwsIGRlbGV0ZVVuaWNvZGUsIGdldCwgc2V0LCB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UgfSBmcm9tIFwiQGxpYnMtdWkvdXRpbHNcIjtcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIGxhc3RWYWx1ZUZyb20sIG9mLCBTdWJqZWN0LCB0YWtlVW50aWwsIHRpbWVyIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IElCdXR0b25CYXJFdmVudCwgSUNvbmZpZ1NlbGVjdE1vcmVJdGVtLCBJQ29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQsIElIb3ZlckJ1dHRvbkFjdGlvbkV2ZW50LCBJTG9hZE1vcmVFdmVudCwgSVNvcnRFdmVudCwgSVRhYmVsQnV0dG9uQWN0aW9uRXZlbnQsIElUYWJsZUZvb3RlckNvbmZpZywgSVRhYmxlSGVhZGVyQ29uZmlnLCBUWVBFX0RBVEFfRklMVEVSX1RBQkxFLCBUWVBFX0RBVEFfVEFCTEUsIFRZUEVfSVRFTV9EQVRBX1RBQkxFLCBUWVBFX05FV19EQVRBX1RBQkxFLCBUWVBFX1RBQkxFX0ZJTFRFUiB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLWV2ZW50LmludGVyZmFjZVwiO1xuaW1wb3J0IHsgSVRhYmxlTm9EYXRhQ29uZmlnIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9uby1kYXRhLWNvbmZpZy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNUYWJsZVRlbXBsYXRlc0NvbXBvbmVudCB9IGZyb20gXCIuL3RlbXBsYXRlcy90ZW1wbGF0ZXMuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJTGlzdENvbmZpZ0l0ZW0gfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1saXN0XCI7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDbGFzcywgTmdTdHlsZSwgQXN5bmNQaXBlLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NvbXBvbmVudE91dGxldCwgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSwgVmlydHVhbFNjcm9sbGVyTW9kdWxlLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zU29ydEFycm93Q29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNDaGVja2JveFNpbmdsZUNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsIExpYnNVaUljb25zR2V0SWNvbkNvbXBvbmVudFBpcGUsXG4gICAgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogUFJPUEVSVFkgKi9cbiAgcHJvdGVjdGVkIGNsYXNzSGVhZGVyQ29udGFpbmVyID0gY29tcHV0ZWQoKCkgPT4gYGxpYnMtdWktdGFibGUtaGVhZGVyLWNvbnRhaW5lciB3LWZ1bGwgZmxleCAke3RoaXMuaWdub3JlQ2xhc3NCZ0hlYWRlcigpID8gJycgOiAnYmctd2hpdGUnfSBvdmVyZmxvdy14LWhpZGRlbiB6LVsxXSBpdGVtcy1jZW50ZXIgJHt0aGlzLmNsYXNzSGVhZGVySW5jbHVkZSgpIHx8ICcnfWApXG4gIHByb3RlY3RlZCBrZXlzU2VsZWN0ZWQgPSBzaWduYWw8QXJyYXk8YW55Pj4oW10pO1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBzdG9yZXMgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4oW10pO1xuICBwcm90ZWN0ZWQgaXRlbXMgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4oW10pO1xuICBwcm90ZWN0ZWQgaXRlbUZvb3RlciA9IHNpZ25hbDxUWVBFX09CSkVDVD4oe30pO1xuICBwcm90ZWN0ZWQgaXRlbU9mSW5kZXhIb3Zlcj86IFRZUEVfSVRFTV9EQVRBX1RBQkxFO1xuICBwcm90ZWN0ZWQga2V5U2VhcmNoID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgdG90YWxJdGVtSW5CYWNrZW5kID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCBoYXNJdGVtSGlnaHRMaWdodCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCB0b3RhbEl0ZW1EaXNwbGF5ID0gY29tcHV0ZWQoKCkgPT4gdmlld0RhdGFOdW1iZXJCeUxhbmd1YWdlKCh0aGlzLnRvdGFsSXRlbSgpID8/IHRoaXMudG90YWxJdGVtSW5CYWNrZW5kKCkpLCBmYWxzZSkpO1xuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ01vcmVJdGVtID0gY29tcHV0ZWQ8SUxpc3RDb25maWdJdGVtPigoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIGNvbmZpZ1RlbXBsYXRlVGV4dDogc2lnbmFsKHtcbiAgICAgICAgZmllbGRLZXk6ICdrZXknLFxuICAgICAgICBpZ25vcmVJY29uU2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgIGdldFZhbHVlOiB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LmdldFZhbHVlLFxuICAgICAgICBjb25maWdMYWJlbFBvcG92ZXI6IHNpZ25hbCh7XG4gICAgICAgICAgekluZGV4OiAxMjAwXG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIGh0dHBSZXF1ZXN0RGF0YTogc2lnbmFsKHtcbiAgICAgICAgc2VydmljZU90aGVyOiByZXR1cm5MaXN0T2JqZWN0KHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8ubGlzdE9wdGlvbiksXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ2xpc3QnLFxuICAgICAgICBhcmd1bWVudHNWYWx1ZTogW11cbiAgICAgIH0pXG4gICAgfVxuICB9KVxuXG4gIHByaXZhdGUgaGFzU2Nyb2xsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBpbnN0YW5jZVNvcnQgPSBzaWduYWw8SVNvcnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgaGFzQWN0aW9uQnV0dG9uRHJvcGRvd25Db250ZW50ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBwYWdpbmdTdG9yZSA9IHNpZ25hbDxJUGFnaW5nPih7fSk7XG4gIHByaXZhdGUgbG9hZGVkTGFzdEl0ZW0gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHN0b3JlUGFyYW1zQ2FsbEFwaSA9IHNpZ25hbDxUWVBFX09CSkVDVD4oe30pO1xuICBwcml2YXRlIHRpbWVvdXRMZWF2ZUl0ZW0gPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGZ1bmN0aW9uQ29udHJvbFNlbGVjdE1vcmVJdGVtPzogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQ7XG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiogSU5QVVQgKi9cbiAgcmVhZG9ubHkgdGltZUhpZ2hsaWdoTmV3SXRlbSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigyMDAwLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAyMDAwIH0pO1xuICByZWFkb25seSBoZWFkZXJMZWZ0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlSGVhZGVyQ29uZmlnPiwgQXJyYXk8SVRhYmxlSGVhZGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oW10sIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IFtdIH0pO1xuICByZWFkb25seSBoZWFkZXJSaWdodCA9IGlucHV0PEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4sIEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4gfCB1bmRlZmluZWQ+KFtdLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQgPSBpbnB1dDxJQ29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQ+KCk7XG4gIHJlYWRvbmx5IHNob3dGb290ZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJGb290ZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjdXN0b21Qb3NpdGlvbkZvb3RlciA9IGlucHV0PCd0b3AnIHwgJ2JvdHRvbScsICd0b3AnIHwgJ2JvdHRvbScgfCB1bmRlZmluZWQ+KCdib3R0b20nLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAnYm90dG9tJyB9KTtcbiAgcmVhZG9ubHkgZm9vdGVyTGVmdCA9IGlucHV0PEFycmF5PElUYWJsZUZvb3RlckNvbmZpZz4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGZvb3RlclJpZ2h0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlRm9vdGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZUNoZWNrYm94ID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcyA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgYnVmZmVyQW1vdW50ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDUsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8gKHZhbCA+IDI1ID8gMjUgOiB2YWwpIDogNSB9KVxuICByZWFkb25seSB0b3RhbEl0ZW0gPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGlzRGFzaEJvcmRlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSGVhZGVySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NCb2R5SW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzRm9vdGVySW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzVGFibGVDb250YWluZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAnJyB9KTtcblxuICByZWFkb25seSBmaWVsZEtleSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaWQnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaWQnIH0pOyAvLyB0w6puIGZpZWxkIMSR4buLbmggZGFuaCBpdGVtIGPhu6dhIGxpc3REYXRhc1xuICByZWFkb25seSBkZWZhdWx0S2V5c1NlbGVjdGVkID0gaW5wdXQ8QXJyYXk8YW55Pj4oKTtcbiAgcmVhZG9ubHkgbGFiZWxCYXJOb1NlbGVjdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KGBpMThuX3RvdGFsX3F1YW50aXR5YCk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBsYWJlbEJhckJ1dHRvbnMgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2kxOG5fbnVtYmVyX2l0ZW1fc2VsZWN0ZWQnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaTE4bl9udW1iZXJfaXRlbV9zZWxlY3RlZCcgfSk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBjbGFzc0xhYmVsQmFyQnV0dG9ucyA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gJycgfSk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBiYXJCdXR0b25zID0gaW5wdXQ8QXJyYXk8SUJ1dHRvbj4+KCk7XG4gIHJlYWRvbmx5IHNvcnRMb2NhbCA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIHRyxrDhu51uZyBo4bujcCBu4bq/dSBzb3J0TG9jYWwgbsOgeSBraMO0bmcgxJHDoXAg4bupbmcgxJHGsOG7o2MgbmdoaeG7h3AgduG7pSB0aMOsIG3hu5tpIGPDom4gbmjhuq9jIHPhu60gZOG7pW5nIGZpbHRlckxvY2FsXG4gIHJlYWRvbmx5IGZpbHRlck9yU29ydExvY2FsID0gaW5wdXQ8VFlQRV9UQUJMRV9GSUxURVI+KCk7XG4gIHJlYWRvbmx5IGh0dHBSZXF1ZXN0RGF0YSA9IGlucHV0PElIdHRwUmVxdWVzdENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgaHR0cFJlcXVlc3REYXRhRm9vdGVyID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBuZXdEYXRhID0gaW5wdXQ8VFlQRV9ORVdfREFUQV9UQUJMRT4oKTtcbiAgcmVhZG9ubHkgZmlsdGVyID0gaW5wdXQ8VFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSwgVFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSB8IHVuZGVmaW5lZD4oeyBmaWx0ZXJEYXRhOiB7fSB9LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyB7IGZpbHRlckRhdGE6IHt9IH0gfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUJhciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUNsYXNzQmdIZWFkZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBub0RhdGFDb25maWcgPSBpbnB1dDxJVGFibGVOb0RhdGFDb25maWc+KHsgdGV4dE5vRGF0YTogJ2kxOG5fbm9fZGF0YV95ZXQnLCB0ZXh0U2VhcmNoTm9EYXRhOiAnaTE4bl9ub19yZXN1bHQnIH0pO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtTGFzdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMDAsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEwMCB9KTtcbiAgcmVhZG9ubHkgY29uZmlnU2VsZWN0TW9yZUl0ZW0gPSBpbnB1dDxJQ29uZmlnU2VsZWN0TW9yZUl0ZW0+KCk7XG4gIHJlYWRvbmx5IG9ubHlTaG93Tm9SZXN1bHQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiogT1VUUFVUICovXG5cbiAgcmVhZG9ubHkgb3V0TG9hZE1vcmUgPSBvdXRwdXQ8SUxvYWRNb3JlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFNjcm9sbElzR29uZSA9IG91dHB1dDxJTG9hZE1vcmVFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZGluZyA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRDbGlja0J1dHRvbkFjdGlvbiA9IG91dHB1dDxJVGFiZWxCdXR0b25BY3Rpb25FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U29ydCA9IG91dHB1dDxJU29ydEV2ZW50PigpO1xuICByZWFkb25seSBvdXRDbGlja0JhckJ1dHRvbiA9IG91dHB1dDxJQnV0dG9uQmFyRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dEhvdmVyQnV0dG9uQWN0aW9uID0gb3V0cHV0PElIb3ZlckJ1dHRvbkFjdGlvbkV2ZW50PigpO1xuICByZWFkb25seSBvdXRLZXlzU2VsZWN0ZWQgPSBvdXRwdXQ8eyBrZXlzOiBBcnJheTxhbnk+IH0+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SVRhYmxlRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExvYWREYXRhQ29tcGxldGUgPSBvdXRwdXQ8V3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+PigpO1xuICByZWFkb25seSBvdXRUb3RhbEl0ZW0gPSBvdXRwdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBvdXRMb2FkRGF0YUVycm9yID0gb3V0cHV0PElIdHRwUmVzcG9uc2VFcnJvcj4oKTtcblxuICAvKipWSUVXIENISUxEICovXG4gIHByb3RlY3RlZCBoZWFkZXJFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdoZWFkZXJFbGVtZW50UmVmJyk7XG4gIHByb3RlY3RlZCBmb290ZXJFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdmb290ZXJFbGVtZW50UmVmJyk7XG4gIHByb3RlY3RlZCBmb290ZXJMZWZ0RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZm9vdGVyTGVmdEVsZW1lbnRSZWYnKTtcbiAgcHJpdmF0ZSBib2R5RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignYm9keUVsZW1lbnRSZWYnKTtcbiAgcHJpdmF0ZSBib2R5Q29tcG9uZW50UmVmID0gdmlld0NoaWxkPFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudD4oJ2JvZHlDb21wb25lbnRSZWYnKTs7XG5cbiAgLyoqSU5KRUNUICovXG4gIHByaXZhdGUgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVmYXVsdEtleXNTZWxlY3RlZCgpPy5sZW5ndGgpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMua2V5c1NlbGVjdGVkLnVwZGF0ZShrZXlzID0+IChbLi4ua2V5cywgLi4uKHRoaXMuZGVmYXVsdEtleXNTZWxlY3RlZCgpIHx8IFtdKV0pKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3dGb290ZXIoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm5ld0RhdGEoKT8uZGF0YSgpLmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5hZGRJdGVtcyh0aGlzLm5ld0RhdGEoKT8uZGF0YSBhcyBhbnksICF0aGlzLm5ld0RhdGEoKT8uYWRkVG9MYXN0TGlzdCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhIHx8IHRoaXMuZmlsdGVyKCkuaWdub3JlQ2FsbEFwaUF1dG8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rZXlTZWFyY2guc2V0KGdldDxhbnk+KHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSwgJ2tleVNlYXJjaCcsICcnKSk7XG4gICAgICAgIHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpLnNldChjbG9uZURlZXAodGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhKSk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcigpPy5maWx0ZXJEYXRhICYmICF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGFbJ2luc3RhbmNlU29ydCddICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlck9yU29ydExvY2FsKCkgJiYgdGhpcy5zdG9yZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnNldCh0aGlzLmZpbHRlck9yU29ydExvY2FsKCk/LihzaWduYWwoWy4uLnRoaXMuc3RvcmVzKCldKSwgeyAuLi4odGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhIHx8IHt9KSwgaW5zdGFuY2VTb3J0OiB0aGlzLmluc3RhbmNlU29ydCgpIH0pIHx8IFtdKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh7XG4gICAgICByZXNldDogdGhpcy5yZXNldC5iaW5kKHRoaXMpLFxuICAgICAgY2FsbEFwaUJ5U2VydmljZTogdGhpcy5jYWxsQXBpQnlTZXJ2aWNlLmJpbmQodGhpcyksXG4gICAgICByZXNldFNjcm9sbDogdGhpcy5yZXNldFNjcm9sbC5iaW5kKHRoaXMpLFxuICAgICAgYWRkSXRlbXM6IHRoaXMuYWRkSXRlbXMuYmluZCh0aGlzKSxcbiAgICAgIHJlbW92ZUl0ZW1zOiB0aGlzLnJlbW92ZUl0ZW1zLmJpbmQodGhpcyksXG4gICAgICBnZXRDb3VudDogdGhpcy5nZXRDb3VudC5iaW5kKHRoaXMpLFxuICAgICAgZ2V0U2Nyb2xsQ29udGFpbmVyOiB0aGlzLmdldFNjcm9sbENvbnRhaW5lci5iaW5kKHRoaXMpLFxuICAgICAgaGlkZVRvb2xCYXJCb3R0b206ICgpID0+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSxcbiAgICAgIHJlc2V0S2V5U2VsZWN0ZWQ6ICgpID0+IHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSksXG4gICAgICBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcbiAgICB9KTtcblxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SW5kZXhSb3cgPSAoZGF0YTogeyB2YWx1ZTogVFlQRV9JVEVNX0RBVEFfVEFCTEUgfSkgPT4ge1xuICAgIHJldHVybiBvZih0aGlzLml0ZW1zKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBkYXRhLnZhbHVlKSArIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY3JvbGxDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYm9keUNvbXBvbmVudFJlZigpIGFzIFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2FsbEFwaUJ5U2VydmljZShmaXJzdENhbGw6IGJvb2xlYW4sIHJlc2V0QWZ0ZXJDYWxsQXBpPzogYm9vbGVhbikge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZmlyc3RDYWxsKSB7XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5odHRwUmVxdWVzdERhdGEoKSB8fCB0aGlzLmxvYWRpbmcoKSB8fCB0aGlzLmxvYWRlZExhc3RJdGVtKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKCk7XG4gICAgICBjb25zdCB7IGFyZ3VtZW50c1ZhbHVlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSB9ID0gdGhpcy5odHRwUmVxdWVzdERhdGEoKSBhcyBJSHR0cFJlcXVlc3RDb25maWc7XG5cbiAgICAgIGlmIChndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSAmJiAhZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyQnkgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKSkge1xuICAgICAgICBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJCeSA9IHtcbiAgICAgICAgICBmaWVsZEdldFZhbHVlOiAnc3RvcmVQYXJhbXNDYWxsQXBpLmluc3RhbmNlU29ydC5maWVsZFNvcnQnLFxuICAgICAgICAgIGZpZWxkVXBkYXRlOiAnWzBdJyxcbiAgICAgICAgICBzdWJGaWVsZFVwZGF0ZTogJ29yZGVyX2J5J1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlclR5cGUgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKSkge1xuICAgICAgICBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJUeXBlID0ge1xuICAgICAgICAgIGZpZWxkR2V0VmFsdWU6ICdzdG9yZVBhcmFtc0NhbGxBcGkuaW5zdGFuY2VTb3J0Lm1vZGUnLFxuICAgICAgICAgIGZpZWxkVXBkYXRlOiAnWzBdJyxcbiAgICAgICAgICBzdWJGaWVsZFVwZGF0ZTogJ29yZGVyX3R5cGUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZmlyc3RDYWxsKSB7XG4gICAgICAgIGlmICghcmVzZXRBZnRlckNhbGxBcGkpIHtcbiAgICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi50aGlzLmZha2VSZXNwb25zZUFwaSgpLCBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpLCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCB0aGlzLmxvYWRlZExhc3RJdGVtKCksIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5jYWxsQXBpKHRoaXMuaHR0cFJlcXVlc3REYXRhKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnKTtcblxuICAgICAgaWYgKGZpcnN0Q2FsbCAmJiByZXNldEFmdGVyQ2FsbEFwaSkge1xuICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgICAgICB0aGlzLml0ZW1zLnNldChbXSk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhZ2luZ1N0b3JlLnNldChyZXN1bHQucGFnaW5nKTtcbiAgICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnNldChyZXN1bHQucGFnaW5nPy50b3RhbF9pdGVtcyB8fCAwKTtcbiAgICAgIHRoaXMub3V0VG90YWxJdGVtLmVtaXQodGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQoKSk7XG4gICAgICBpZiAoIXRoaXMucGFnaW5nU3RvcmUoKSkge1xuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi5yZXN1bHQsIHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCksIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIHRoaXMubG9hZGVkTGFzdEl0ZW0oKSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRkSXRlbXMoY29udmVydE9iamVjdFRvU2lnbmFsKHJlc3VsdC5kYXRhIHx8IFtdKSwgZmFsc2UsIHRydWUpO1xuICAgICAgdGhpcy5vdXRMb2FkRGF0YUNvbXBsZXRlLmVtaXQodGhpcy5zdG9yZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB0aGlzLm91dExvYWREYXRhRXJyb3IuZW1pdChlcnJvciBhcyBJSHR0cFJlc3BvbnNlRXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZmFrZVJlc3BvbnNlQXBpKCk6IFRZUEVfT0JKRUNUIHtcbiAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChmYWxzZSk7XG4gICAgdGhpcy5wYWdpbmdTdG9yZS5zZXQoe30pO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmZha2VSZXNwb25zZVBhZ2luZ0FwaSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkge1xuICAgIGlmICghdGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSB8fCAhdGhpcy5zaG93Rm9vdGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCksIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIGZhbHNlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICB0aGlzLml0ZW1Gb290ZXIuc2V0KGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSkoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEl0ZW1zKGl0ZW1zOiBUWVBFX0RBVEFfVEFCTEUsIGFkZEZpcnN0OiBib29sZWFuLCBpZ25vcmVIaWdodExpZ2h0PzogYm9vbGVhbiwgaWdub3JlUmVDYWxsRm9vdGVyPzogYm9vbGVhbiwgYXV0b0NvdW50TmV3SXRlbT86IGJvb2xlYW4pIHtcbiAgICBpZiAoIWl0ZW1zKCkgfHwgIWl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zQWRkOiBBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+ID0gW107XG5cbiAgICBpdGVtcygpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY2hlY2tFeGlzdEl0ZW0oaXRlbSkpIHtcbiAgICAgICAgaXRlbXNBZGQucHVzaChpdGVtKTtcbiAgICAgICAgaWYgKCFpZ25vcmVIaWdodExpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5oYXNJdGVtSGlnaHRMaWdodC5zZXQodHJ1ZSk7XG4gICAgICAgICAgaXRlbS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBzcGVjaWZpY0hpZ2h0TGlnaHQ6IHRydWUgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhZGRGaXJzdCkge1xuICAgICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGRhdGEgPT4gW2l0ZW0sIC4uLmRhdGFdKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy51cGRhdGUoZGF0YSA9PiBbaXRlbSwgLi4uZGF0YV0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGRhdGEgPT4gWy4uLmRhdGEsIGl0ZW1dKTtcbiAgICAgICAgdGhpcy5zdG9yZXMudXBkYXRlKGRhdGEgPT4gWy4uLmRhdGEsIGl0ZW1dKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoYXV0b0NvdW50TmV3SXRlbSAmJiBpdGVtc0FkZC5sZW5ndGgpIHtcbiAgICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnVwZGF0ZSh2YWx1ZSA9PiB2YWx1ZSArIGl0ZW1zQWRkLmxlbmd0aCk7XG4gICAgfVxuICAgIGlmICghaWdub3JlSGlnaHRMaWdodCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGl0ZW1zQWRkLmZvckVhY2goaXRlbSA9PiBpdGVtLnVwZGF0ZShkYXRhID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljSGlnaHRMaWdodDogZmFsc2UgfSkpKTtcbiAgICAgICAgdGhpcy5oYXNJdGVtSGlnaHRMaWdodC5zZXQoZmFsc2UpO1xuICAgICAgfSwgdGhpcy50aW1lSGlnaGxpZ2hOZXdJdGVtKCkpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gICAgaWYgKCFpZ25vcmVSZUNhbGxGb290ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tFeGlzdEl0ZW0oaXRlbU5ldzogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMoKS5maW5kKGl0ZW0gPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCA9PT0gYCR7aXRlbU5ldygpW3RoaXMuZmllbGRLZXkoKV19YCkgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbW92ZUl0ZW1zKGtleXM6IEFycmF5PHVua25vd24+LCBpZ25vcmVSZUNhbGxGb290ZXI/OiBib29sZWFuKSB7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoKTtcbiAgICBpZiAoIXRoaXMuaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgIGxldCBpc1VwZGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgIGlmIChgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtrZXl9YCkge1xuICAgICAgICAgICAgaXNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGlzVXBkYXRlID8gbmV3SXRlbXMgOiBpdGVtcztcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN0b3Jlcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICBsZXQgaXNVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICBpZiAoYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCA9PT0gYCR7a2V5fWApIHtcbiAgICAgICAgICAgIGlzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1VwZGF0ZSA/IG5ld0l0ZW1zIDogaXRlbXM7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCF0aGlzLmtleXNTZWxlY3RlZCgpIHx8ICF0aGlzLmtleXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC51cGRhdGUoa2V5cyA9PiBrZXlzLmZpbHRlcihrZXlTZWxlY3RlZCA9PiBrZXlTZWxlY3RlZCAhPT0ga2V5KSk7XG4gICAgfSk7XG4gICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKHZhbHVlID0+IHZhbHVlIC0ga2V5cy5sZW5ndGgpO1xuICAgIGF3YWl0IHRoaXMuY2hlY2tTY3JvbGwoKTtcbiAgICBpZiAoIWlnbm9yZVJlQ2FsbEZvb3Rlcikge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCk7XG4gICAgfVxuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3VudCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYWdpbmdTdG9yZSgpPy50b3RhbF9pdGVtcyB8fCB0aGlzLml0ZW1zKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLml0ZW1zKCkubGVuZ3RoO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGwoZTogYW55KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAodGhpcy5oZWFkZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSBlLnRhcmdldC5zY3JvbGxMZWZ0O1xuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gZS50YXJnZXQuc2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNjcm9sbEJvdHRvbShlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5sb2FkTW9yZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTW9yZSgpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRMb2FkTW9yZS5lbWl0KHsgbG9hZE1vcmVTdWNjZXNzOiB0aGlzLmxvYWRNb3JlU3VjY2Vzcy5iaW5kKHRoaXMpIH0pO1xuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZShmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRNb3JlU3VjY2VzcyhkYXRhOiBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+Pikge1xuICAgIHRoaXMuYWRkSXRlbXMoZGF0YSwgZmFsc2UpO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlQWxsQ2hlY2tlZCgpIHtcbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoW10pO1xuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VDaGVja2VkQWxsSXRlbXMoZXZlbnQ6IElDaGVja2JveEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldCh0aGlzLml0ZW1zKCkuZmlsdGVyKGFzeW5jIChpdGVtKSA9PiAhKGF3YWl0IHRoaXMuY2hlY2tDYW5jZWxDb25kaXRpb25DaGVja2VkSXRlbShpdGVtKSkpLm1hcChpdGVtID0+IGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWApKTtcbiAgICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrQ2FuY2VsQ29uZGl0aW9uQ2hlY2tlZEl0ZW0oaXRlbTogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KSB7XG4gICAgbGV0IGlzQ2FuY2VsQ2hlY2sgPSBmYWxzZTtcblxuICAgIGlmICghaXNDYW5jZWxDaGVjayAmJiB0aGlzLmhlYWRlckxlZnQoKS5sZW5ndGggJiYgdGhpcy5oZWFkZXJMZWZ0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbikge1xuICAgICAgaXNDYW5jZWxDaGVjayA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oKHRoaXMuaGVhZGVyTGVmdCgpWzBdLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gYXMgYW55KSh7IGl0ZW06IGl0ZW0oKSB9KSkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NhbmNlbENoZWNrICYmIHRoaXMuaGVhZGVyUmlnaHQoKS5sZW5ndGggJiYgdGhpcy5oZWFkZXJSaWdodCgpWzBdLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4pIHtcbiAgICAgIGlzQ2FuY2VsQ2hlY2sgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKCh0aGlzLmhlYWRlclJpZ2h0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiBhcyBhbnkpKHsgaXRlbTogaXRlbSgpIH0pKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNDYW5jZWxDaGVjaztcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoZXZlbnQ6IElDaGVja2JveEl0ZW0sIGl0ZW06IFRZUEVfT0JKRUNUKSB7XG4gICAgY29uc3Qga2V5ID0gaXRlbVt0aGlzLmZpZWxkS2V5KCldO1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KHRoaXMua2V5c1NlbGVjdGVkKCkpO1xuXG4gICAga2V5cy5hZGQoa2V5KTtcbiAgICBpZiAoIWV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIGtleXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChBcnJheS5mcm9tKGtleXMpKTtcbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlU29ydChzb3J0OiBJU29ydCkge1xuICAgIGlmICh0aGlzLmluc3RhbmNlU29ydCAmJiB0aGlzLmluc3RhbmNlU29ydCgpPy5maWVsZFNvcnQgIT09IHNvcnQuZmllbGRTb3J0KSB7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydCgpPy5yZXNldCgpO1xuICAgIH1cbiAgICB0aGlzLmluc3RhbmNlU29ydC5zZXQoc29ydCk7XG4gICAgaWYgKHRoaXMuc29ydExvY2FsKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlclNvcnRMb2NhbChzb3J0KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkpO1xuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSh0cnVlKTtcbiAgICB0aGlzLm91dFNvcnQuZW1pdCh7XG4gICAgICBzb3J0OiBzb3J0LFxuICAgICAgb25Tb3J0U3VjY2VzczogdGhpcy5vblNvcnRTdWNjZXNzLmJpbmQodGhpcylcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclNvcnRMb2NhbChzb3J0OiBJU29ydCkge1xuICAgIGlmICh0aGlzLmZpbHRlck9yU29ydExvY2FsKCkgJiYgdGhpcy5zdG9yZXMoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaXRlbXMuc2V0KHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKT8uKHNpZ25hbChbLi4udGhpcy5zdG9yZXMoKV0pLCB7IC4uLnRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCksIGluc3RhbmNlU29ydDogc29ydCB9KSB8fCBbXSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBmaWVsZFNvcnQsIG1vZGUgfSA9IHNvcnQ7XG5cbiAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICBpdGVtcy5zb3J0KChpdGVtQSwgaXRlbUIpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlMSA9IG1vZGUgPT09ICdhc2MnID8gaXRlbUEoKVtmaWVsZFNvcnRdIDogaXRlbUIoKVtmaWVsZFNvcnRdO1xuICAgICAgICBsZXQgdmFsdWUyID0gbW9kZSA9PT0gJ2FzYycgPyBpdGVtQigpW2ZpZWxkU29ydF0gOiBpdGVtQSgpW2ZpZWxkU29ydF07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZTEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZTIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmFsdWUxID0gZGVsZXRlVW5pY29kZSh2YWx1ZTEpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgdmFsdWUyID0gZGVsZXRlVW5pY29kZSh2YWx1ZTIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUxID09PSB2YWx1ZTIpIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTEgPiB2YWx1ZTIgPyAxIDogLTE7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgfSk7XG4gICAgdGhpcy5vblNvcnRTdWNjZXNzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZ1bmN0aW9uQ29udHJvbE1vcmVTZWxlY3RJdGVtKGZ1bmN0aW9uQ29udHJvbDogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbFNlbGVjdE1vcmVJdGVtID0gZnVuY3Rpb25Db250cm9sO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZE1vcmVJdGVtKGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LmtleSB8fCAhdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbT8ucmVzZXQoKTtcblxuICAgIGNvbnN0IHBlclBhZ2UgPSBOdW1iZXIoZXZlbnQua2V5KS52YWx1ZU9mKCk7XG4gICAgY29uc3QgY3VycmVudFBhZ2UgPSBOdW1iZXIodGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0ocGVyUGFnZSkpLnZhbHVlT2YoKTtcbiAgICBjb25zdCBpc1BhZ2luZ051bWJlciA9IHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8ucGFnaW5nTnVtYmVyO1xuXG4gICAgaWYgKGN1cnJlbnRQYWdlID4gcGVyUGFnZSB8fCB0aGlzLml0ZW1zLmxlbmd0aCA+PSBwZXJQYWdlKSB7XG4gICAgICBpZiAoIWlzUGFnaW5nTnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldCh0aGlzLml0ZW1zKCkuc2xpY2UoMCwgcGVyUGFnZSkubWFwKGl0ZW0gPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUsIHRydWUpO1xuICAgIGNvbnN0IHN1YiA9IHRoaXMub3V0TG9hZERhdGFDb21wbGV0ZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAoIWlzUGFnaW5nTnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldCh0aGlzLml0ZW1zKCkuc2xpY2UoMCwgcGVyUGFnZSkubWFwKGl0ZW0gPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vdXRMb2FkRGF0YUVycm9yLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShjdXJyZW50UGFnZSk7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0ocGVyUGFnZTogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcmd1bWVudHNWYWx1ZSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhKCk/LmFyZ3VtZW50c1ZhbHVlO1xuXG4gICAgaWYgKCFhcmd1bWVudHNWYWx1ZSB8fCAhdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpKSB7XG4gICAgICByZXR1cm4gJy0xJztcbiAgICB9XG4gICAgY29uc3Qga2V5UGVyUGFnZSA9IHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8ua2V5UGVyUGFnZSB8fCAncGVyX3BhZ2UnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHNWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGFyZ3VtZW50ID0gYXJndW1lbnRzVmFsdWVbaV07XG5cbiAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIEh0dHBQYXJhbXMgJiYgYXJndW1lbnQuaGFzKGtleVBlclBhZ2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQZXJQYWdlID0gYXJndW1lbnQuZ2V0KGtleVBlclBhZ2UpIHx8ICcyNSc7XG5cbiAgICAgICAgYXJndW1lbnQgPSBhcmd1bWVudC5zZXQoa2V5UGVyUGFnZSwgcGVyUGFnZSk7XG4gICAgICAgIHNldChhcmd1bWVudHNWYWx1ZSwgYCR7aX1gLCBhcmd1bWVudCk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQZXJQYWdlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3QgJiYgT2JqZWN0LmtleXMoYXJndW1lbnQpLmluY2x1ZGVzKGtleVBlclBhZ2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQZXJQYWdlID0gYXJndW1lbnQuZ2V0KGtleVBlclBhZ2UpIHx8ICcyNSc7XG5cbiAgICAgICAgc2V0KGFyZ3VtZW50LCBrZXlQZXJQYWdlLCBwZXJQYWdlKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudFBlclBhZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICctMSc7XG4gIH1cblxuICBwcml2YXRlIG9uU29ydFN1Y2Nlc3MoKSB7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQnV0dG9uQ2xpY2sodHlwZTogJ2J1dHRvbicgfCAnYnV0dG9uLWRyb3Bkb3duJywgYnV0dG9uRHJvcGRvd25EYXRhOiBhbnksIGJ1dHRvbjogSUJ1dHRvbikgeyAvLyBidXR0b25PcmlnaW4gY2jhu4kgc+G7rSBk4bulbmcga2hpIGTDuW5nIGJ1dHRvbkFjdGlvbnMgY8OzIGJ1dHRvbi1kcm9wZG93blxuICAgIGlmICh0eXBlID09PSAnYnV0dG9uJykge1xuICAgICAgcmV0dXJuIHRoaXMub3V0Q2xpY2tCdXR0b25BY3Rpb24uZW1pdCh7IGl0ZW06IHRoaXMuaXRlbU9mSW5kZXhIb3ZlciwgYnV0dG9uOiBidXR0b24gfSk7XG4gICAgfVxuICAgIHRoaXMub3V0Q2xpY2tCdXR0b25BY3Rpb24uZW1pdCh7IGl0ZW06IHRoaXMuaXRlbU9mSW5kZXhIb3ZlciwgYnV0dG9uLCBidXR0b25Ecm9wZG93bkRhdGEgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckJhckJ1dHRvbkNsaWNrKGJ1dHRvbjogSUJ1dHRvbikge1xuICAgIGNvbnN0IGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+PiA9IFtdO1xuXG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQoKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtcygpLmZpbmQoaXRlbSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtrZXl9YCk7XG5cbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5vdXRDbGlja0JhckJ1dHRvbi5lbWl0KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGl0ZW1zLFxuICAgICAga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSxcbiAgICAgIGhpZGRlbkJhckJ1dHRvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCdXR0b25Ecm9wZG93bkV2ZW50KGV2ZW50TmFtZTogVFlQRV9QT1BPVkVSX0VWRU5UKSB7XG4gICAgdGhpcy5oYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQuc2V0KHRydWUpO1xuICAgIGlmIChldmVudE5hbWUgPT09ICdyZW1vdmUnIHx8IGV2ZW50TmFtZSA9PT0gJ21vdXNlbGVhdmUtY29udGVudCcpIHtcbiAgICAgIHRoaXMuaGFzQWN0aW9uQnV0dG9uRHJvcGRvd25Db250ZW50LnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldEluZGV4SG92ZXIoZTogRXZlbnQsIGl0ZW06IFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciA9IGl0ZW07XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRJbmRleEhvdmVyV2hlbk1vdXNlTGVhdmUoZT86IEV2ZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY3VycmVudEluZGV4SXRlbUhvdmVyID0gdGhpcy5pdGVtT2ZJbmRleEhvdmVyO1xuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dExlYXZlSXRlbSgpKTtcbiAgICB0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0uc2V0KHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXRlbU9mSW5kZXhIb3ZlciAmJiB0aGlzLml0ZW1PZkluZGV4SG92ZXIgIT09IGN1cnJlbnRJbmRleEl0ZW1Ib3Zlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihlKTtcbiAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRJbmRleEhvdmVyKGU/OiBFdmVudCkge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VFbnRlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gICAgaWYgKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpIHtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlTGVhdmUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpIHtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0U2Nyb2xsKCkge1xuICAgIGlmICh0aGlzLmhlYWRlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuQm9keUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KGNsZWFyU29ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2xlYXJTb3J0KSB7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydCgpPy5yZXNldCgpO1xuICAgICAgdGhpcy5pbnN0YW5jZVNvcnQuc2V0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRoaXMuaGFzU2Nyb2xsLnNldChmYWxzZSk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgIHRoaXMuZmFrZVJlc3BvbnNlQXBpKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrU2Nyb2xsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhc1Njcm9sbCA9IHRoaXMuaGFzU2Nyb2xsKCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aW1lcig1MDApLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuQm9keUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQodGhpcy5Cb2R5RWxlbWVudC5zY3JvbGxIZWlnaHQgPiB0aGlzLkJvZHlFbGVtZW50Lm9mZnNldEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1Njcm9sbCAmJiAhdGhpcy5oYXNTY3JvbGwoKSkge1xuICAgICAgICAgIHRoaXMub3V0U2Nyb2xsSXNHb25lLmVtaXQoe30pO1xuICAgICAgICAgIGlmICghdGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBCb2R5RWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYm9keUVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0oKSk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz0nZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsJz5cbiAgQGlmICghaWdub3JlQmFyKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHJlbGF0aXZlIHotWzFdIGJvdHRvbS0wIGxlZnQtMCB3LWZ1bGwgYmctd2hpdGUgbWItWzE2cHhdIGxpYnMtdWktdGFibGUtc2hhZG93LWJvdHRvbVwiXG4gICAgICBbY2xhc3MucHgtWzE2cHhdXT1cImtleXNTZWxlY3RlZCgpLmxlbmd0aCB8fCBsYWJlbEJhck5vU2VsZWN0SXRlbSgpXCJcbiAgICAgIFtjbGFzcy5weS1bNnB4XV09XCJrZXlzU2VsZWN0ZWQoKS5sZW5ndGggfHwgbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKVwiXG4gICAgICAobW91c2VlbnRlcik9XCJyZXNldEluZGV4SG92ZXIoJGV2ZW50KVwiPlxuICAgICAgQGlmICgha2V5c1NlbGVjdGVkKCkubGVuZ3RoICYmIGxhYmVsQmFyTm9TZWxlY3RJdGVtKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInt7IGNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSA/PyAncHgtWzEycHhdIHB5LVs1cHhdJyB9fVwiXG4gICAgICAgICAgW2lubmVySHRtbF09J2xhYmVsQmFyTm9TZWxlY3RJdGVtKCkgfCB0cmFuc2xhdGU6e3ZhbHVlOnRvdGFsSXRlbURpc3BsYXkoKX0nPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoa2V5c1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBwbC1bMTJweF1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgaC1mdWxsIG10LVstMnB4XVwiPlxuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUgW2NoZWNrZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKSB8fCBkaXNhYmxlQ2hlY2tib3goKVwiXG4gICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUFsbENoZWNrZWQoKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNW0gdGV4dC1bIzA3MTYzMV0gbXItWzhweF0ge3sgY2xhc3NMYWJlbEJhckJ1dHRvbnMoKSB9fVwiPlxuICAgICAgICAgICAge3sgbGFiZWxCYXJCdXR0b25zKCkgfCB0cmFuc2xhdGU6eyB2YWx1ZTprZXlzU2VsZWN0ZWQoKS5sZW5ndGggfSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAoY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93biBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cIntcbiAgICAgICAgICAgICAgICB3aWR0aEJ5UGFyZW50OmZhbHNlLFxuICAgICAgICAgICAgICAgIGlnbm9yZUFycm93OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogIDIwNDgsXG4gICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlOichdy1bMTIxcHhdJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgbW9kZTonc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgZGlzdGFuY2U6MFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0Q29uZmlnTW9yZUl0ZW0oKVwiXG4gICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiNVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiIXctWzE2cHhdIGgtWzE2cHhdIG1yLVs4cHhdXCJcbiAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWRNb3JlSXRlbSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbE1vcmVTZWxlY3RJdGVtKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLTAgbS0wJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2JlZm9yZTohdGV4dC1bMTZweF0gbGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwIG1yLVs2cHhdJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwie2NvbmZpZzp7Y29udGVudDonaTE4bl9tb3JlX3NlbGVjdCd9fVwiXG4gICAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLVsxNnB4XSBsaWJzLXVpLWJvcmRlci1sZWZ0LWdlbmVyYWwgbWwtWzE2cHhdXCI+PC9kaXY+XG4gICAgICAgICAgQGlmIChiYXJCdXR0b25zKCk/Lmxlbmd0aCkge1xuICAgICAgICAgICAgQGZvciAoYnV0dG9uIG9mIGJhckJ1dHRvbnMoKTt0cmFjayBidXR0b24pIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCJidXR0b24udHlwZSB8fCAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImJ1dHRvbi5jbGFzc0ljb25MZWZ0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCIoYnV0dG9uLmxhYmVsIHx8ICcgJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQmFyQnV0dG9uQ2xpY2soYnV0dG9uKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD0nZGl2LmxpYnMtdWktdGFibGUtYmFyLXJpZ2h0Jz48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIH1cblxuICA8ZGl2ICN0YWJsZUNvbnRhaW5lckVsZW1lbnRSZWZcbiAgICBjbGFzcz1cImxpYnMtdWktdGFibGUgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsIHJlbGF0aXZlIHt7IGNsYXNzVGFibGVDb250YWluZXJJbmNsdWRlKCkgfX1cIlxuICAgIFtjbGFzcy5weC1bMTZweF1dPSchaWdub3JlQmFyKCknXG4gICAgKG1vdXNlbGVhdmUpPVwicmVzZXRJbmRleEhvdmVyKCRldmVudClcIj5cbiAgICA8ZGl2ICNoZWFkZXJFbGVtZW50UmVmXG4gICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLWRhc2hlZC1nZW5lcmFsXT1cIiFoYXNJdGVtSGlnaHRMaWdodCgpICYmIGlzRGFzaEJvcmRlcigpXCJcbiAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbF09XCIhaGFzSXRlbUhpZ2h0TGlnaHQoKSAmJiAhaXNEYXNoQm9yZGVyKClcIlxuICAgICAgW2NsYXNzLiFoaWRkZW5dPVwiIWl0ZW1zKCkubGVuZ3RoICYmIGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpXCJcbiAgICAgIFtjbGFzc109XCJjbGFzc0hlYWRlckNvbnRhaW5lcigpXCJcbiAgICAgIChtb3VzZWVudGVyKT1cInJlc2V0SW5kZXhIb3ZlcigkZXZlbnQpXCI+XG4gICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImgtZnVsbCBmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV0ge3sgY2xhc3NIZWFkZXJJbmNsdWRlKCkgfX1cIj5cbiAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyTGVmdCgpO3RyYWNrIGhlYWRlcikge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmO2NvbnRleHQ6e2hlYWRlckl0ZW06aGVhZGVyLGlzSGVhZGVyTGVmdDp0cnVlfVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlclJpZ2h0KCk7dHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmO2NvbnRleHQ6e2hlYWRlckl0ZW06aGVhZGVyLGlzSGVhZGVyTGVmdDpmYWxzZX1cIiAvPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgQGlmIChzaG93Rm9vdGVyKCkgJiYgaXRlbUZvb3RlcigpICYmIGN1c3RvbVBvc2l0aW9uRm9vdGVyKCkgPT09ICd0b3AnKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PSd0ZW1wbGF0ZUZvb3RlclJlZicgLz5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCBvdmVyZmxvdy14LWhpZGRlbiBiZy13aGl0ZSB7eyBjbGFzc0JvZHlJbmNsdWRlKCkgfHwgJycgfX1cIj5cbiAgICAgIEBpZiAoaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiAjYm9keUVsZW1lbnRSZWZcbiAgICAgICAgICBjbGFzcz1cImZsZXggaC1mdWxsIHctZnVsbCByZWxhdGl2ZVwiXG4gICAgICAgICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgICAgICBbb3B0aW9uc109XCJ7c2Nyb2xsWDogKCFoZWFkZXJMZWZ0KCkubGVuZ3RoIHx8ICFoZWFkZXJSaWdodCgpKSA/ICdoaWRkZW4nOidzY3JvbGwnfVwiXG4gICAgICAgICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsKCRldmVudClcIlxuICAgICAgICAgIChvdXRTY3JvbGxCb3R0b20pPVwiaGFuZGxlclNjcm9sbEJvdHRvbSgkZXZlbnQpXCI+XG4gICAgICAgICAgPHZpcnR1YWwtc2Nyb2xsZXIgI2JvZHlDb21wb25lbnRSZWZcbiAgICAgICAgICAgIFtpdGVtc109XCJpdGVtcygpXCJcbiAgICAgICAgICAgIFtlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplc109XCJlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcygpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoID4gKGJvZHlFbGVtZW50UmVmID8gYm9keUVsZW1lbnRSZWYuc2Nyb2xsV2lkdGggOiAwKSA/IGhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGg6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICBbcGFyZW50U2Nyb2xsXT1cImJvZHlFbGVtZW50UmVmXCJcbiAgICAgICAgICAgIFtidWZmZXJBbW91bnRdPVwiYnVmZmVyQW1vdW50KClcIj5cbiAgICAgICAgICAgIEBmb3IgKGRhdGEgb2YgYm9keUNvbXBvbmVudFJlZi52aWV3UG9ydEl0ZW1zO3RyYWNrIGRhdGEoKSkge1xuICAgICAgICAgICAgICA8ZGl2ICNlbGVtZW50SG92ZXJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2YzZmNmY11dPVwiZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLXRvcC0xcHgtMzZkM2QzXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHQgJiYgJGZpcnN0ICYmICFpZ25vcmVCb3JkZXJJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1ib3R0b20tMXB4LTM2ZDNkM109XCJkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0ICYmICFpZ25vcmVCb3JkZXJJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0IHx8ICgkbGFzdCAmJiBpZ25vcmVCb3JkZXJJdGVtTGFzdCgpKSkgPyAnbGlicy11aS1ib3JkZXItcmFkaXVzLWJvdHRvbS1sZWZ0LTRweCBsaWJzLXVpLWJvcmRlci1yYWRpdXMtYm90dG9tLXJpZ2h0LTRweCcgOiBpZ25vcmVCb3JkZXJJdGVtKCkgPyAnJyA6IGlzRGFzaEJvcmRlcigpID8gJ2xpYnMtdWktYm9yZGVyLWJvdHRvbS1kYXNoZWQtZ2VuZXJhbCcgOiAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJnLVsjZjhmOWZhXV09XCJpdGVtT2ZJbmRleEhvdmVyID09PSBkYXRhICYmICFkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0XCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRJbmRleEhvdmVyKCRldmVudCxkYXRhKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwicmVzZXRJbmRleEhvdmVyV2hlbk1vdXNlTGVhdmUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIEBpZiAoaGVhZGVyTGVmdCgpLmxlbmd0aCB8fCBoZWFkZXJSaWdodCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaGVhZGVyTGVmdCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggc3RpY2t5IHRvcC0wIGxlZnQtMCB6LVsxXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy13aGl0ZV09XCIhZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2YzZmNmY11dPVwiZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyTGVmdCgpO3RyYWNrIGhlYWRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHB4LVsxMnB4XSBweS1bOHB4XSB7eyBoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnJzogJ2xpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwnIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2Y4ZjlmYV1dPVwiaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJoZWFkZXIubmdTdHlsZSB8fCAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7d2lkdGg6JzUwcHgnLCdmbGV4LXNoaXJrJzonMCcscGFkZGluZzonOHB4J30gOiB7fSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaGVhZGVyLm5nQ2xhc3MgfHwgIHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmO2NvbnRleHQ6e2hlYWRlcjpoZWFkZXIsZGF0YTpkYXRhfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlclJpZ2h0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJoZWFkZXIubmdTdHlsZSB8fCAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7d2lkdGg6JzUwcHgnLCdmbGV4LXNoaXJrJzonMCcscGFkZGluZzonOHB4J30gOiB7fSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlQm9keVJlZjtjb250ZXh0OntoZWFkZXI6aGVhZGVyLGRhdGE6ZGF0YX1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCkgJiYgZGF0YSgpLnNwZWNpZmljRXhwYW5kICYmIGRhdGEoKVtjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5maWVsZEdldERhdGFFeHBhbmQgfHwgJ3NwZWNpZmljRGF0YUV4cGFuZCddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uY3NzV3JhcHBlciB8fCAnZmxleCB3LWZ1bGwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXRhRXhwYW5kIG9mIGRhdGEoKVtjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5maWVsZEdldERhdGFFeHBhbmQgfHwgJ3NwZWNpZmljRGF0YUV4cGFuZCddKCk7dHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uY29sVGVtcGxhdGVDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlcyBbaXRlbV09XCJkYXRhRXhwYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8udGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZW1wdHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgaC1bMTAwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlTm9kYXRhUmVmXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC92aXJ0dWFsLXNjcm9sbGVyPlxuXG4gICAgICAgICAgQGlmICgoIWl0ZW1zKCkubGVuZ3RoKSAmJiAhbG9hZGluZygpICYmIG5vRGF0YUNvbmZpZygpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmZsZXhdPVwiJzAgMCAnK2hlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGgrJ3B4J1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoKCFpdGVtcygpLmxlbmd0aCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgaC1mdWxsIHctZnVsbFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKHNob3dGb290ZXIoKSAmJiBpdGVtRm9vdGVyKCkgJiYgY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD0ndGVtcGxhdGVGb290ZXJSZWYnIC8+XG4gICAgICB9XG5cbiAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSB3LWZ1bGwgaC1mdWxsIHotWzJdIGZsZXggaXRlbXMtY2VudGVyIGNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zcGlubmVyIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlSGVhZGVyUmVmXG4gIGxldC1oZWFkZXI9J2hlYWRlckl0ZW0nXG4gIGxldC1pc0hlYWRlckxlZnQ9J2lzSGVhZGVyTGVmdCc+XG4gIDxkaXYgW2NsYXNzXT1cIidyZWxhdGl2ZSBmbGV4ICcrIChoZWFkZXIucGFkZGluZ0xlZnRSaWdodEhlYWRlckNvbnRhaW5lciA/PyAnIHB4LVsxMnB4XSAnKSArIChpc0hlYWRlckxlZnQgJiYgIWhlYWRlci5pZ25vcmVCb3JkZXJSaWdodCA/ICcgbGlicy11aS1ib3JkZXItcmlnaHQtZ2VuZXJhbCAnIDogJyAnKSsgJyBsaWJzLXVpLXRhYmxlLWhlYWRlci1jb2wgJ1wiXG4gICAgW2NsYXNzLmZsZXgtY29sXT1cImhlYWRlci5yb3dzQ29uZmlnXCJcbiAgICBbY2xhc3MucHktWzhweF1dPSchaGVhZGVyLmlnbm9yZVB5RGVmYXVsdCdcbiAgICBbbmdTdHlsZV09XCJoZWFkZXIubmdTdHlsZSB8fCAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7d2lkdGg6JzUwcHgnLCdmbGV4LXNoaXJrJzonMCcscGFkZGluZzonOHB4J30gOiB7fSlcIlxuICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgQGlmICghaGVhZGVyLnJvd3NDb25maWcpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7Y29udGV4dDp7aGVhZGVySXRlbTpoZWFkZXIsaXNDb2xSZW5kZXI6ZmFsc2V9XCIgLz5cbiAgICB9XG4gICAgQGlmIChoZWFkZXIucm93c0NvbmZpZzthcyByb3dzQ29uZmlnKSB7XG4gICAgICBAZm9yIChyb3cgb2Ygcm93c0NvbmZpZy5yb3dzO3RyYWNrIHJvdykge1xuICAgICAgICA8ZGl2IFtjbGFzc109XCJyb3cuY2xhc3NSb3dcIj5cbiAgICAgICAgICBAZm9yIChjb2wgb2Ygcm93LmNvbHMgOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7Y29udGV4dDp7aGVhZGVySXRlbTpjb2wsaXNDb2xSZW5kZXI6dHJ1ZX1cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgfVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVIZWFkZXJDb250ZW50UmVmXG4gIGxldC1oZWFkZXI9J2hlYWRlckl0ZW0nXG4gIGxldC1pc0NvbFJlbmRlcj0naXNDb2xSZW5kZXInPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBsaWJzLXVpLWZvbnQtaDZtIG1pbi1oLVsxOHB4XSB0ZXh0LVsjNmE3MzgzXSBtYXgtdy1mdWxsXCJcbiAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT0naGVhZGVyLmNvbnRlbnRIZWFkZXJBbGlnbkNlbnRlciA/PyB0cnVlJ1xuICAgIFtjbGFzcy5qdXN0aWZ5LWVuZF09J2hlYWRlci5jb250ZW50SGVhZGVySnVzdGlmeUNvbnRlbnRFbmQnXG4gICAgW2NsYXNzLnctZnVsbF09XCJoZWFkZXIuaXNTaG93SW5kZXhPblJvd1wiXG4gICAgW25nU3R5bGVdPVwiaXNDb2xSZW5kZXIgPyAoaGVhZGVyLm5nU3R5bGUgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pKSA6IHt9XCJcbiAgICBbbmdDbGFzc109XCJpc0NvbFJlbmRlciA/IChoZWFkZXIubmdDbGFzcyB8fCB7fSkgOiB7fVwiPlxuICAgIEBpZiAoaGVhZGVyLmhhc0NoZWNrYm94KSB7XG4gICAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveEFsbCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBoLWZ1bGwge3sgaGVhZGVyLmNoZWNrYm94QWxsQ2xhc3NJbmNsdWRlIHx8ICdtci1bMTZweF0nIH19XCJcbiAgICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cImhlYWRlci5jaGVja2JveEFsaWduQ2VudGVyXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUgW2tleV09XCInYWxsJ1wiXG4gICAgICAgICAgICBbc3RpbGxPdGhlck9wdGlvbnNdPVwiISFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoICE9PSBpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCIhIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggPT09IGl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKVwiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VDaGVja2VkQWxsSXRlbXMoJGV2ZW50KVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGgtZnVsbCBtbC1bMjRweF0ge3sgaGVhZGVyLmNoZWNrYm94Q2xhc3NJbmNsdWRlIH19XCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBoLWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHt7IGhlYWRlci5jbGFzc0luY2x1ZGVJbmRleE9uUm93IHx8ICcnIH19XCI+XG4gICAgICAgIHt7IGhlYWRlci5sYWJlbCA/PyAnIycgfX1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgQGlmICgoaGVhZGVyLmxhYmVsIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpoZWFkZXIucGFyc2VWYWx1ZTpoZWFkZXIpIHwgYXN5bmMgfCB0cmFuc2xhdGU7IGFzIGxhYmVsSGVhZGVyQ29sdW1uKSB7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbdHlwZV09XCJoZWFkZXI/LmxhYmVsQ29uZmlnPy50eXBlIHx8ICd0ZXh0J1wiXG4gICAgICAgICAgW21vZGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8ubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIihoZWFkZXI/LmxhYmVsQ29uZmlnPy5jbGFzc0luY2x1ZGUgfHwgJycpXCJcbiAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8uaWdub3JlU2hvd1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgIFtjb25maWddPVwiaGVhZGVyLmxhYmVsQ29uZmlnPy5jb25maWcgfHwge2NvbnRlbnQ6bGFiZWxIZWFkZXJDb2x1bW59XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImxhYmVsSGVhZGVyQ29sdW1uXCIgLz5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci50b29sdGlwT3RoZXI7IGFzIHRvb2x0aXApIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtbC1bNHB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwidG9vbHRpcD8udHlwZSB8fCAnb3RoZXInXCJcbiAgICAgICAgICBbbW9kZV09XCJ0b29sdGlwPy5tb2RlIHx8ICdob3ZlcidcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwidG9vbHRpcC5jbGFzc0luY2x1ZGUgfHwgJ3RleHQtWyM2YTczODNdJ1wiXG4gICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cInRvb2x0aXAuaWdub3JlU2hvd1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgIFtjb25maWddPVwidG9vbHRpcC5jb25maWcgfHwge2NvbnRlbnQ6KHRvb2x0aXAuZGF0YVZpZXcgfHwgJyAnKSB8IHRyYW5zbGF0ZSwgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgbW9kZTogJ2NlbnRlcicsXG4gICAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgICAgICBhdXRvVXBkYXRlUG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICBlbmREaXN0YW5jZTogMTIsXG4gICAgICAgICAgICAgICAgc3RhcnREaXN0YW5jZTogLTEyXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH19XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvb2x0aXAuZGF0YVZpZXdcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaGFzU29ydCAmJiBoZWFkZXIub3JkZXJieSkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1sLVs0cHhdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1zb3J0LWFycm93IFtkaXNhYmxlXT1cImxvYWRpbmcoKSB8fCAhaXRlbXMoKS5sZW5ndGhcIlxuICAgICAgICAgIFtmaWVsZFNvcnRdPVwiaGVhZGVyLm9yZGVyYnlcIlxuICAgICAgICAgIFtpZ25vcmVQb3BvdmVyQ29udGVudF09XCJoZWFkZXIuc29ydElnbm9yZVRvb2x0aXBDb250ZW50ID8/IHRydWVcIlxuICAgICAgICAgIFtwb3BvdmVyQ29udGVudEFzY109XCJoZWFkZXIuc29ydFRvb2x0aXBDb250ZW50QXNjXCJcbiAgICAgICAgICBbcG9wb3ZlckNvbnRlbnREZXNjXT1cImhlYWRlci5zb3J0VG9vbHRpcENvbnRlbnREZXNjXCJcbiAgICAgICAgICBbZGVmYXVsdE1vZGVdPVwiaGVhZGVyLmRlZmF1bHRNb2RlXCJcbiAgICAgICAgICBbekluZGV4XT1cImhlYWRlci56SW5kZXhUb29sdGlwU29ydFwiXG4gICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlU29ydCgkZXZlbnQpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoaGVhZGVyLmxhYmVsRGVzY3JpcHRpb24pIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiaGVhZGVyLmxhYmVsRGVzY3JpcHRpb24uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDogaGVhZGVyLmxhYmVsRGVzY3JpcHRpb24uY29udGVudCB8IHRyYW5zbGF0ZX1cIlxuICAgICAgICBbaW5uZXJIVE1MXT1cImhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNvbnRlbnQgfCB0cmFuc2xhdGVcIiAvPlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlQm9keVJlZlxuICBsZXQtaGVhZGVyPSdoZWFkZXInXG4gIGxldC1kYXRhPSdkYXRhJz5cbiAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGgtZnVsbFwiPlxuICAgIEBpZiAoaGVhZGVyLmhhc0NoZWNrYm94KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBoLWZ1bGxcIlxuICAgICAgICBbY2xhc3MuaW52aXNpYmxlXT1cImhlYWRlci5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuICYmKCBkYXRhKCkgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmhlYWRlci5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuOmRhdGEoKSB8IGFzeW5jKVwiXG4gICAgICAgIFtjbGFzcy5pdGVtcy1jZW50ZXJdPVwiaGVhZGVyLmNoZWNrYm94QWxpZ25DZW50ZXJcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUgW2tleV09XCJkYXRhKClbZmllbGRLZXkoKV1cIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiaGVhZGVyLmNoZWNrYm94Q2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICBbY2hlY2tlZF09XCJkYXRhKClbZmllbGRLZXkoKV0gfCBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c1NlbGVjdGVkKCk6a2V5c1NlbGVjdGVkKCkubGVuZ3RoXCJcbiAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgZGlzYWJsZUNoZWNrYm94KCkgfHwgISEobWF4SXRlbVNlbGVjdGVkKCkgJiYgIShkYXRhKClbZmllbGRLZXkoKV0gfCBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c1NlbGVjdGVkKCk6a2V5c1NlbGVjdGVkKCkubGVuZ3RoKSAmJiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggPj0gbWF4SXRlbVNlbGVjdGVkKCkpXCJcbiAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZCgkZXZlbnQsZGF0YSgpKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93OyBhcyBjb25maWcpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbGlicy11aS1mb250LWg0cnt7IGNvbmZpZy5jbGFzc0luY2x1ZGVJbmRleE9uUm93IHx8ICcnIH19XCI+XG4gICAgICAgIDxkaXYgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgIFtjb25maWddPVwie31cIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwiZGF0YSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Z2V0SW5kZXhSb3cgfCBhc3luY1wiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlcyBbaXNIb3Zlcl09XCJpdGVtT2ZJbmRleEhvdmVyID09PSBkYXRhICYmICFkYXRhLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgIFtjbGFzc109XCJoZWFkZXIudGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAnJ1wiXG4gICAgICAgIFtpdGVtXT1cImRhdGFcIlxuICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImhlYWRlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICBbY29uZmlnc109XCJoZWFkZXIuY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlRm9vdGVyUmVmPlxuICBAaWYgKCFpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKSB8fCAoaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhKCkgJiYgaXRlbXMoKS5sZW5ndGgpKSB7XG4gICAgPGRpdiAjZm9vdGVyRWxlbWVudFJlZlxuICAgICAgY2xhc3M9XCJmbGV4IHctZnVsbCBiZy1bI2Y4ZjlmYV0gb3ZlcmZsb3cteC1oaWRkZW4gei1bMV0ge3sgaWdub3JlQm9yZGVyRm9vdGVyKCkgPyAnJzogKGN1c3RvbVBvc2l0aW9uRm9vdGVyKCkgPT09ICd0b3AnID8gJ2xpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsJzonbGlicy11aS10YWJsZS1zaGFkb3ctdG9wIGxpYnMtdWktYm9yZGVyLXRvcC1nZW5lcmFsJykgfX0gbWluLWgtWzM1cHhdXCJcbiAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJNb3VzZUVudGVyKCRldmVudClcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwiaGFuZGxlck1vdXNlTGVhdmUoJGV2ZW50KVwiPlxuICAgICAgQGlmIChmb290ZXJMZWZ0KCkpIHtcbiAgICAgICAgPGRpdiAjZm9vdGVyTGVmdEVsZW1lbnRSZWZcbiAgICAgICAgICBjbGFzcz1cImZsZXggc3RpY2t5IHRvcC0wIGxlZnQtMCB6LVsxXSBiZy1bI2Y4ZjlmYV1cIj5cbiAgICAgICAgICBAZm9yIChmb290ZXIgb2YgZm9vdGVyTGVmdCgpO3RyYWNrIGZvb3Rlcikge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB4LVsxMnB4XSBweS1bOHB4XSB7eyBmb290ZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnJzogJ2xpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwnIH19XCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZm9vdGVyLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb290ZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICBAaWYgKGZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZykge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzIFtpdGVtXT1cIml0ZW1Gb290ZXJcIlxuICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGZvb3RlclJpZ2h0KCkpIHtcbiAgICAgICAgQGZvciAoZm9vdGVyIG9mIGZvb3RlclJpZ2h0KCk7dHJhY2sgZm9vdGVyKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB4LVsxMnB4XSBweS1bOHB4XVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJmb290ZXIubmdTdHlsZSB8fCB7fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJmb290ZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgQGlmIChmb290ZXIuY29sVGVtcGxhdGVDb25maWcpIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXMgW2l0ZW1dPVwiaXRlbUZvb3RlclwiXG4gICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICBbY29uZmlnc109XCJmb290ZXIuY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZU5vZGF0YVJlZj5cbiAgQGlmIChub0RhdGFDb25maWcoKTsgYXMgY29uZmlnKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgYWJzb2x1dGUgbGVmdC0wIHRvcC0wIHotWzFdXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBzaHJpbmstMFwiXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlPlxuICAgICAgICBAaWYgKCFrZXlTZWFyY2goKSAmJiAhb25seVNob3dOb1Jlc3VsdCgpKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCIgKCduby1kYXRhJyB8IExpYnNVaUljb25zR2V0SWNvbkNvbXBvbmVudFBpcGUgfCBhc3luYyk7aW5wdXRzOntzaXplOjY0fVwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktdGFibGUtbm8tZGF0YS1jb25maWctdGV4dFwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJjb25maWcubmdTdHlsZSB8fCB7fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb25maWcubmdDbGFzcyB8fCB7fVwiXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cImNvbmZpZy50ZXh0Tm9EYXRhIHwgdHJhbnNsYXRlXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChrZXlTZWFyY2goKSB8fCBvbmx5U2hvd05vUmVzdWx0KCkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cIignbm8tcmVzdWx0JyB8IExpYnNVaUljb25zR2V0SWNvbkNvbXBvbmVudFBpcGUgfCBhc3luYyk7aW5wdXRzOntzaXplOjY0fVwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktdGFibGUtbm8tZGF0YS1jb25maWctdGV4dFwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJjb25maWcubmdTdHlsZSB8fCB7fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb25maWcubmdDbGFzcyB8fCB7fVwiXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cImNvbmZpZy50ZXh0U2VhcmNoTm9EYXRhIHwgdHJhbnNsYXRlXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -15,7 +15,7 @@ import { LibsUiIconsGetIconComponentPipe } from '@libs-ui/icons';
|
|
|
15
15
|
import { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';
|
|
16
16
|
import { LibsUiPipesCheckSelectedByKeyPipe } from '@libs-ui/pipes-check-selected-by-key';
|
|
17
17
|
import { returnListObject, LibsUiHttpRequestService } from '@libs-ui/services-http-request';
|
|
18
|
-
import { convertObjectToSignal, viewDataNumberByLanguage, get, deleteUnicode, set } from '@libs-ui/utils';
|
|
18
|
+
import { convertObjectToSignal, viewDataNumberByLanguage, get, cloneDeep, deleteUnicode, set } from '@libs-ui/utils';
|
|
19
19
|
import * as i1 from '@ngx-translate/core';
|
|
20
20
|
import { TranslateModule } from '@ngx-translate/core';
|
|
21
21
|
import { Subject, fromEvent, takeUntil, of, lastValueFrom, timer } from 'rxjs';
|
|
@@ -248,7 +248,7 @@ class LibsUiComponentsTableComponent {
|
|
|
248
248
|
}
|
|
249
249
|
untracked(() => {
|
|
250
250
|
this.keySearch.set(get(this.filter().filterData, 'keySearch', ''));
|
|
251
|
-
this.storeParamsCallApi.set(this.filter());
|
|
251
|
+
this.storeParamsCallApi.set(cloneDeep(this.filter().filterData));
|
|
252
252
|
if (this.filter()?.filterData && !this.filter().filterData['instanceSort'] && this.instanceSort()) {
|
|
253
253
|
this.storeParamsCallApi.update(data => ({ ...data, instanceSort: this.instanceSort() }));
|
|
254
254
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-table.mjs","sources":["../../../../../libs-ui/components/table/src/templates/templates.component.ts","../../../../../libs-ui/components/table/src/templates/templates.component.html","../../../../../libs-ui/components/table/src/table.component.ts","../../../../../libs-ui/components/table/src/table.component.html","../../../../../libs-ui/components/table/src/interfaces/button-action-event.interface.ts","../../../../../libs-ui/components/table/src/interfaces/button-bar-event.interface.ts","../../../../../libs-ui/components/table/src/interfaces/template-config.interface.ts","../../../../../libs-ui/components/table/src/templates/template.abstract.component.ts","../../../../../libs-ui/components/table/src/libs-ui-components-table.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AsyncPipe, NgClass, NgComponentOutlet, NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { LibsUiComponentsAvatarComponent } from '@libs-ui/components-avatar';\nimport { IButton, LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsButtonsStatusComponent } from '@libs-ui/components-buttons-status';\nimport { IDropdownFunctionControlEvent, IEmitMultiKey, IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { LibsUiComponentsLineClampComponent } from '@libs-ui/components-line-clamp';\nimport { LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { ISwitchEvent, LibsUiComponentsSwitchComponent } from '@libs-ui/components-switch';\nimport { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';\nimport { LibsUiPipesCloneObjectPipe } from '@libs-ui/pipes-clone-object';\nimport { LibsUiPipesSecurityTrustPipe } from '@libs-ui/pipes-security-trust';\nimport { convertObjectToSignal } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { TYPE_ITEM_DATA_TABLE } from '../interfaces';\nimport { ITableFieldTemplateConfig, ITableTemplateConfig } from '../interfaces/template-config.interface';\nimport { LibsUiComponentsBadgeComponent } from '@libs-ui/components-badge';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-table-templates',\n templateUrl: './templates.component.html',\n styleUrls: ['./templates.component.scss'],\n standalone: true,\n imports: [\n NgStyle, NgClass, TranslateModule, AsyncPipe, NgComponentOutlet,\n LibsUiComponentsAvatarComponent, LibsUiPipesCallFunctionInTemplatePipe,\n LibsUiPipesSecurityTrustPipe, LibsUiComponentsPopoverComponent,\n LibsUiComponentsButtonsStatusComponent, LibsUiComponentsSwitchComponent,\n LibsUiPipesCloneObjectPipe, LibsUiComponentsButtonsButtonComponent,\n LibsUiComponentsLineClampComponent, LibsUiComponentsDropdownComponent,\n LibsUiComponentsBadgeComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LibsUiComponentsTableTemplatesComponent {\n private lockClick!: boolean;\n private functionControls = new Map<number, IDropdownFunctionControlEvent>();\n protected isImageError: boolean | undefined;\n\n readonly isHover = input<boolean>();\n readonly configs = input<Array<ITableTemplateConfig>>();\n readonly templateCssWrapper = input<string>();\n readonly item = input.required<TYPE_ITEM_DATA_TABLE>();\n\n\n protected async handlerItemClick(event: Event | TYPE_POPOVER_EVENT | undefined, config: ITableFieldTemplateConfig, dataField: any) {\n if (event instanceof Event) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (typeof event === 'string' && event !== 'click') {\n return;\n }\n if (this.lockClick) {\n return;\n }\n this.lockClick = true;\n setTimeout(() => {\n this.lockClick = false;\n }, 250);\n if (config && config.action) {\n config.action(dataField, this.item());\n }\n }\n\n protected async clickButtonAction(button: IButton) {\n if (this.lockClick) {\n return;\n }\n this.lockClick = true;\n setTimeout(() => {\n this.lockClick = false;\n }, 250);\n button.action?.({ item: this.item() });\n }\n\n protected async handlerSwitch(switchItem: ISwitchEvent, config: ITableFieldTemplateConfig) {\n if (this.lockClick) {\n return;\n }\n this.lockClick = true;\n setTimeout(() => {\n this.lockClick = false;\n }, 250);\n config?.switchAction?.(switchItem, this.item());\n }\n\n protected async handlerSelectItemDropdown(fieldConfig: ITableFieldTemplateConfig, index: number, data?: IEmitSelectKey) {\n if (this.lockClick || !data) {\n return;\n }\n this.lockClick = true;\n setTimeout(() => {\n this.lockClick = false;\n }, 250);\n fieldConfig?.action?.(data.key, data.item, this.item());\n (this.functionControls?.get(index) as IDropdownFunctionControlEvent)?.reset();\n (this.functionControls?.get(index) as IDropdownFunctionControlEvent)?.removeList();\n }\n\n protected async handlerSelectItemsDropdown(fieldConfig: ITableFieldTemplateConfig, index: number, data?: IEmitMultiKey) {\n if (this.lockClick || !data) {\n return;\n }\n this.lockClick = true;\n setTimeout(() => {\n this.lockClick = false;\n }, 250);\n fieldConfig?.action?.(data.keys, convertObjectToSignal(data.mapKeys, false), this.item());\n (this.functionControls?.get(index) as IDropdownFunctionControlEvent)?.reset();\n }\n\n protected async handlerImageError(event: Event) {\n event.stopPropagation();\n this.isImageError = true;\n }\n\n protected async handlerFunctionControl(event: IDropdownFunctionControlEvent, index: number) {\n this.functionControls.set(index, event);\n }\n\n}\n","@if (configs(); as configs) {\n @if (item(); as item) {\n <div class=\"mo-lib-table-template {{ templateCssWrapper() || '' }}\">\n @for (config of configs; track $index) {\n @if (config.fieldsConfig) {\n <div [class]=\"config.cssWrapper\">\n @for (fieldConfig of config.fieldsConfig; track index;let index = $index;) {\n\n @if (!fieldConfig.rows && !fieldConfig.getComponentOutlet) {\n @switch (fieldConfig.instance) {\n @case (\"tooltip\") {\n @if ((fieldConfig.tooltip || {}); as tooltip) {\n <span LibsUiComponentsPopoverDirective\n [type]=\"tooltip.type || 'text'\"\n [mode]=\"tooltip.mode || 'hover'\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [classInclude]=\"tooltip.classInclude || ' '\"\n [ignoreShowPopover]=\"tooltip.ignoreShowPopover || false\"\n [config]=\"(fieldConfig.getTooltipConfig ? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getTooltipConfig:item() | async) : (tooltip.config | LibsUiPipesCloneObjectPipe)) | translate\"\n [innerHTML]=\" (fieldConfig.field ? item()[fieldConfig.field] : tooltip.dataView) | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async | translate\"\n (outEvent)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\">\n </span>\n }\n }\n @case (\"image\") {\n @if (((item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getImageSrc:item():isImageError) | async); as linkImage) {\n @if (linkImage !== ' ') {\n <img [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [src]=\"linkImage\"\n (error)=\"handlerImageError($event)\"\n (click)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\" />\n }\n }\n }\n\n @case (\"avatar\") {\n @if ((item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getAvatarConfig:item()) | async ; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\"\n [getLastTextAfterSpace]=\"avatarConfig.getLastTextAfterSpace\" />\n }\n }\n\n @case (\"buttons\") {\n @if ((fieldConfig.buttons && fieldConfig.buttons.length) || fieldConfig.getButtonsByItem) {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.invisible]=\"!isHover() && fieldConfig.showButtonHoverMode\">\n @for (button of (fieldConfig.buttons || (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getButtonsByItem:item() | async)); track $index) {\n\n <libs_ui-components-buttons-button [type]=\"button().type || 'button-primary'\"\n [sizeButton]=\"button().sizeButton || 'smaller'\"\n [disable]=\"button().disable ?? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item())\"\n [label]=\"button().label || ' '\"\n [classIconLeft]=\"button().classIconLeft || ''\"\n [classIconRight]=\"button().classIconRight || ''\"\n [popover]=\"button().popover || {}\"\n [classInclude]=\"button().classInclude || ''\"\n [ignorePointerEvent]=\"button().ignorePointerEvent\"\n (outClick)=\"clickButtonAction(button())\" />\n }\n </div>\n }\n }\n\n @case (\"button-status\") {\n <libs_ui-components-buttons-status [config]=\"(item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async\"\n (click)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\" />\n }\n\n @case (\"switch\") {\n <libs_ui-components-switch [active]=\"item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getActiveValueSwitch:item() | async\"\n [disable]=\"item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisableValueSwitch:item() | async\"\n (outSwitch)=\"handlerSwitch($event,fieldConfig)\" />\n }\n\n\n @case ((fieldConfig.instance === 'other-action-show-popup' || fieldConfig.instance === 'badge' || fieldConfig.instance === 'button-action-show-popup') ? fieldConfig.instance : '') {\n @if ((item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) !== ' ') {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.ml-[8px]]=\"!fieldConfig.ignoreClassMarginLeft\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: fieldConfig.dropdownConfig?.ignoreArrow || false,\n maxHeight: fieldConfig.dropdownConfig?.maxHeight || 2048,\n paddingLeftItem:fieldConfig.dropdownConfig?.paddingLeftItem ?? true,\n classInclude:fieldConfig.dropdownConfig?.classIncludePopup || 'w-[250px]',\n position: fieldConfig.dropdownConfig?.position || {\n mode:'center',\n distance:0\n }\n }\"\n [zIndex]=\"fieldConfig.dropdownConfig?.zIndex\"\n [listConfig]=\"fieldConfig.dropdownConfig?.getListViewConfig ? ((item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.dropdownConfig?.getListViewConfig:item()) | async):fieldConfig.dropdownConfig?.listViewConfig\"\n [listBackgroundCustom]=\"fieldConfig.dropdownConfig?.listViewBackgroundListCustom\"\n [listMaxItemShow]=\"fieldConfig.dropdownConfig?.listViewMaxItemShow || 5\"\n [listKeysDisable]=\"fieldConfig.dropdownConfig?.listViewKeysDisableItem\"\n [listHiddenInputSearch]=\"fieldConfig.dropdownConfig?.listViewHiddenInputSearch\"\n (outFunctionsControl)=\"handlerFunctionControl($event, index)\"\n (outSelectKey)=\"handlerSelectItemDropdown(fieldConfig, index,$event)\"\n (outSelectMultiKey)=\"handlerSelectItemsDropdown(fieldConfig, index,$event)\">\n @if (fieldConfig.instance === 'other-action-show-popup') {\n <div [innerHtml]=\"(item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate\">\n </div>\n }\n @if (fieldConfig.instance === 'badge' && (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) > 0) {\n <libs_ui-components-badge [active]=\"true\"\n [ignoreMarginDefault]=\"true\"\n mode=\"+x\"\n [count]=\"item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n [maxCount]=\"99\" />\n }\n @if (fieldConfig.instance === 'button-action-show-popup') {\n <libs_ui-components-buttons-button [type]=\"fieldConfig?.buttonDropDown()?.type || 'button-primary'\"\n [sizeButton]=\"fieldConfig?.buttonDropDown()?.sizeButton || 'smaller'\"\n [disable]=\"fieldConfig?.buttonDropDown()?.disable ?? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item() | async)\"\n [label]=\"fieldConfig?.buttonDropDown()?.label || ' '\"\n [classIconLeft]=\"fieldConfig?.buttonDropDown()?.classIconLeft || ''\"\n [classIconRight]=\"fieldConfig?.buttonDropDown()?.classIconRight || ''\"\n [popover]=\"fieldConfig?.buttonDropDown()?.popover || {}\"\n [classInclude]=\"fieldConfig?.buttonDropDown()?.classInclude || ''\"\n [ignoreStopPropagationEvent]=\"true\" />\n }\n\n </libs_ui-components-dropdown>\n </div>\n }\n }\n\n @case (\"line-clamp\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\">\n @if (fieldConfig.lineClampConfig; as lineClampConfig) {\n <libs_ui-components-line_clamp [ignoreShowButtonCollapseExpand]=\"lineClampConfig.ignoreShowButtonCollapseExpand ?? true\"\n [showTooltip]=\"lineClampConfig.showTooltip ?? true\"\n [maxHeight]=\"lineClampConfig.maxHeight || 36\"\n [maxWidthTooltip]=\"lineClampConfig.maxWidthTooltip || 200\"\n [maxHeightTooltip]=\"lineClampConfig.maxHeightTooltip || 100\"\n [ngClassObject]=\"lineClampConfig.ngClassObject ?? { 'libs-ui-line-clamp-content mo-lib-font-head-5': true }\"\n [isInnerText]=\"lineClampConfig.isInnerText || false\"\n [ignoreStopPropagationTooltipEvent]=\"true\"\n [content]=\"item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n (click)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\" />\n }\n </div>\n }\n\n @case (\"shape-style\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"(item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate | LibsUiPipesSecurityTrustPipe:'html':true | async\"\n (click)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\">\n </div>\n }\n @default {\n @if (((item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async | translate); as value) {\n @if (value !==' ') {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"value | LibsUiPipesSecurityTrustPipe:'html':true|async\"\n (click)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\">\n </div>\n }\n }\n }\n }\n } @else {\n @if (fieldConfig.rows) {\n <div class=\"w-full flex relative {{ fieldConfig.rowsTemplateCssWrapper }}\">\n <div class=\"w-full flex absolute {{ fieldConfig.rowsTemplateCssWrapper }}\">\n <libs_ui-components-table-templates class=\"flex w-full\"\n [item]=\"item\"\n [configs]=\"fieldConfig.rows\" />\n </div>\n </div>\n }\n @else {\n <ng-container *ngComponentOutlet=\"(item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getComponentOutlet) | async; inputs:{item}\" />\n }\n }\n\n }\n </div>\n }\n }\n </div>\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AsyncPipe, NgClass, NgComponentOutlet, NgStyle, NgTemplateOutlet } from \"@angular/common\";\nimport { HttpParams } from \"@angular/common/http\";\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, ElementRef, inject, input, OnDestroy, OnInit, output, signal, untracked, viewChild, WritableSignal } from \"@angular/core\";\nimport { VirtualScrollerComponent, VirtualScrollerModule } from '@iharbeck/ngx-virtual-scroller';\nimport { IButton, LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { ISort, LibsUiComponentsButtonsSortArrowComponent } from '@libs-ui/components-buttons-sort';\nimport { ICheckboxItem } from \"@libs-ui/components-checkbox-group\";\nimport { ICheckboxEvent, LibsUiComponentsCheckboxSingleComponent } from \"@libs-ui/components-checkbox-single\";\nimport { IDropdownFunctionControlEvent, IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT } from \"@libs-ui/components-popover\";\nimport { LibsUiComponentsScrollOverlayDirective } from \"@libs-ui/components-scroll-overlay\";\nimport { LibsUiComponentsSpinnerComponent } from \"@libs-ui/components-spinner\";\nimport { LibsUiIconsGetIconComponentPipe } from \"@libs-ui/icons\";\nimport { IHttpResponseError, IPaging, TYPE_OBJECT } from \"@libs-ui/interfaces-types\";\nimport { LibsUiPipesCallFunctionInTemplatePipe } from \"@libs-ui/pipes-call-function-in-template\";\nimport { LibsUiPipesCheckSelectedByKeyPipe } from '@libs-ui/pipes-check-selected-by-key';\nimport { IHttpRequestConfig, LibsUiHttpRequestService, returnListObject } from \"@libs-ui/services-http-request\";\nimport { convertObjectToSignal, deleteUnicode, get, set, viewDataNumberByLanguage } from \"@libs-ui/utils\";\nimport { TranslateModule } from \"@ngx-translate/core\";\nimport { fromEvent, lastValueFrom, of, Subject, takeUntil, timer } from \"rxjs\";\nimport { IButtonBarEvent, IConfigSelectMoreItem, IConfigTemplateItemCollapseExpand, IHoverButtonActionEvent, ILoadMoreEvent, ISortEvent, ITabelButtonActionEvent, ITableFooterConfig, ITableHeaderConfig, TYPE_DATA_FILTER_TABLE, TYPE_DATA_TABLE, TYPE_ITEM_DATA_TABLE, TYPE_NEW_DATA_TABLE, TYPE_TABLE_FILTER } from \"./interfaces\";\nimport { ITableFunctionControlEvent } from \"./interfaces/function-control-event.interface\";\nimport { ITableNoDataConfig } from \"./interfaces/no-data-config.interface\";\nimport { LibsUiComponentsTableTemplatesComponent } from \"./templates/templates.component\";\nimport { IListConfigItem } from \"@libs-ui/components-list\";\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-table',\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass, NgStyle, AsyncPipe, NgTemplateOutlet, NgComponentOutlet, LibsUiComponentsTableTemplatesComponent,\n TranslateModule, VirtualScrollerModule, LibsUiComponentsButtonsButtonComponent,\n LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsSortArrowComponent,\n LibsUiComponentsCheckboxSingleComponent,\n LibsUiComponentsSpinnerComponent, LibsUiComponentsPopoverComponent,\n LibsUiComponentsScrollOverlayDirective, LibsUiIconsGetIconComponentPipe,\n LibsUiPipesCallFunctionInTemplatePipe, LibsUiPipesCheckSelectedByKeyPipe\n ]\n})\nexport class LibsUiComponentsTableComponent implements OnInit, OnDestroy {\n /** PROPERTY */\n protected classHeaderContainer = computed(() => `libs-ui-table-header-container w-full flex ${this.ignoreClassBgHeader() ? '' : 'bg-white'} overflow-x-hidden z-[1] items-center ${this.classHeaderInclude() || ''}`)\n protected keysSelected = signal<Array<any>>([]);\n protected loading = signal<boolean>(false);\n protected stores = signal<Array<WritableSignal<TYPE_OBJECT>>>([]);\n protected items = signal<Array<WritableSignal<TYPE_OBJECT>>>([]);\n protected itemFooter = signal<TYPE_OBJECT>({});\n protected itemOfIndexHover?: TYPE_ITEM_DATA_TABLE;\n protected keySearch = signal<string>('');\n protected totalItemInBackend = signal<number>(0);\n protected hasItemHightLight = signal<boolean>(false);\n protected totalItemDisplay = computed(() => viewDataNumberByLanguage((this.totalItem() ?? this.totalItemInBackend()), false));\n protected listConfigMoreItem = computed<IListConfigItem>(() => {\n return {\n type: 'text',\n configTemplateText: signal({\n fieldKey: 'key',\n ignoreIconSelected: true,\n getValue: this.configSelectMoreItem()?.getValue,\n configLabelPopover: signal({\n zIndex: 1200\n })\n }),\n httpRequestData: signal({\n serviceOther: returnListObject(this.configSelectMoreItem()?.listOption),\n functionName: 'list',\n argumentsValue: []\n })\n }\n })\n\n private hasScroll = signal<boolean>(false);\n private instanceSort = signal<ISort | undefined>(undefined);\n private hasActionButtonDropdownContent = signal<boolean>(false);\n private pagingStore = signal<IPaging>({});\n private loadedLastItem = signal<boolean>(false);\n private storeParamsCallApi = signal<TYPE_OBJECT>({});\n private timeoutLeaveItem = signal<number | undefined>(undefined);\n private functionControlSelectMoreItem?: IDropdownFunctionControlEvent;\n private onDestroy = new Subject<void>();\n\n /** INPUT */\n readonly timeHighlighNewItem = input<number, number | undefined>(2000, { transform: val => val ?? 2000 });\n readonly headerLeft = input<Array<ITableHeaderConfig>, Array<ITableHeaderConfig> | undefined>([], { transform: val => val ?? [] });\n readonly headerRight = input<Array<ITableHeaderConfig>, Array<ITableHeaderConfig> | undefined>([], { transform: val => val ?? [] });\n readonly configTemplateItemCollapseExpand = input<IConfigTemplateItemCollapseExpand>();\n readonly showFooter = input<boolean>();\n readonly ignoreBorderFooter = input<boolean>();\n readonly customPositionFooter = input<'top' | 'bottom', 'top' | 'bottom' | undefined>('bottom', { transform: val => val ?? 'bottom' });\n readonly footerLeft = input<Array<ITableFooterConfig> | undefined>();\n readonly footerRight = input<Array<ITableFooterConfig> | undefined>();\n readonly disableCheckbox = input<boolean, boolean | undefined>(false, { transform: val => val ?? false });\n readonly enableUnequalChildrenSizes = input<boolean, boolean | undefined>(false, { transform: val => val ?? false });\n readonly bufferAmount = input<number, number | undefined>(5, { transform: val => val ? (val > 25 ? 25 : val) : 5 })\n readonly totalItem = input<number>();\n readonly isDashBorder = input<boolean>();\n readonly classHeaderInclude = input<string>();\n readonly classBodyInclude = input<string, string | undefined>('', { transform: val => val ?? '' });\n readonly classFooterInclude = input<string, string | undefined>('', { transform: val => val ?? '' });\n readonly classTableContainerInclude = input<string, string | undefined>('', { transform: val => val ?? '' });\n\n readonly fieldKey = input<string, string | undefined>('id', { transform: val => val || 'id' }); // tên field định danh item của listDatas\n readonly defaultKeysSelected = input<Array<any>>();\n readonly labelBarNoSelectItem = input<string>(`i18n_total_quantity`); // sử dụng để hiên thị khi tích chọn item\n readonly labelBarButtons = input<string, string | undefined>('i18n_number_item_selected', { transform: val => val || 'i18n_number_item_selected' }); // sử dụng để hiên thị khi tích chọn item\n readonly classLabelBarButtons = input<string, string | undefined>('', { transform: val => val ?? '' }); // sử dụng để hiên thị khi tích chọn item\n readonly barButtons = input<Array<IButton>>();\n readonly sortLocal = input<boolean>(); // trường hợp nếu sortLocal này không đáp ứng được nghiệp vụ thì mới cân nhắc sử dụng filterLocal\n readonly filterOrSortLocal = input<TYPE_TABLE_FILTER>();\n readonly httpRequestData = input<IHttpRequestConfig>();\n readonly httpRequestDataFooter = input<IHttpRequestConfig>();\n readonly newData = input<TYPE_NEW_DATA_TABLE>();\n readonly filter = input<TYPE_DATA_FILTER_TABLE, TYPE_DATA_FILTER_TABLE | undefined>({ filterData: {} }, { transform: val => val ?? { filterData: {} } });\n readonly ignoreBar = input<boolean>();\n readonly classLabelBarNoSelectItem = input<string>();\n readonly ignoreClassBgHeader = input<boolean>();\n readonly noDataConfig = input<ITableNoDataConfig>({ textNoData: 'i18n_no_data_yet', textSearchNoData: 'i18n_no_result' });\n readonly ignoreBorderItemLast = input<boolean>();\n readonly isHiddenHeaderWhenNodata = input<boolean>();\n readonly maxItemSelected = input<number, number | undefined>(100, { transform: val => val ?? 100 });\n readonly configSelectMoreItem = input<IConfigSelectMoreItem>();\n readonly onlyShowNoResult = input<boolean>();\n readonly ignoreBorderItem = input<boolean>();\n\n /** OUTPUT */\n\n readonly outLoadMore = output<ILoadMoreEvent>();\n readonly outScrollIsGone = output<ILoadMoreEvent>();\n readonly outLoading = output<boolean>();\n readonly outClickButtonAction = output<ITabelButtonActionEvent>();\n readonly outSort = output<ISortEvent>();\n readonly outClickBarButton = output<IButtonBarEvent>();\n readonly outHoverButtonAction = output<IHoverButtonActionEvent>();\n readonly outKeysSelected = output<{ keys: Array<any> }>();\n readonly outFunctionsControl = output<ITableFunctionControlEvent>();\n readonly outLoadDataComplete = output<WritableSignal<Array<WritableSignal<any>>>>();\n readonly outTotalItem = output<number>();\n readonly outLoadDataError = output<IHttpResponseError>();\n\n /**VIEW CHILD */\n protected headerElementRef = viewChild<ElementRef>('headerElementRef');\n protected footerElementRef = viewChild<ElementRef>('footerElementRef');\n protected footerLeftElementRef = viewChild<ElementRef>('footerLeftElementRef');\n private bodyElementRef = viewChild<ElementRef>('bodyElementRef');\n private bodyComponentRef = viewChild<VirtualScrollerComponent>('bodyComponentRef');;\n\n /**INJECT */\n private httpRequestService = inject(LibsUiHttpRequestService);\n private cdr = inject(ChangeDetectorRef);\n\n constructor() {\n effect(() => {\n if (this.defaultKeysSelected()?.length) {\n untracked(() => this.keysSelected.update(keys => ([...keys, ...(this.defaultKeysSelected() || [])])));\n }\n });\n effect(() => {\n if (this.showFooter()) {\n untracked(() => this.callApiByServiceFooter());\n }\n });\n\n effect(() => {\n if (this.newData()?.data().length) {\n untracked(() => this.addItems(this.newData()?.data as any, !this.newData()?.addToLastList));\n }\n });\n\n effect(() => {\n if (!this.filter().filterData || this.filter().ignoreCallApiAuto) {\n return;\n }\n untracked(() => {\n this.keySearch.set(get<any>(this.filter().filterData, 'keySearch', ''));\n this.storeParamsCallApi.set(this.filter());\n if (this.filter()?.filterData && !this.filter().filterData['instanceSort'] && this.instanceSort()) {\n this.storeParamsCallApi.update(data => ({ ...data, instanceSort: this.instanceSort() }));\n }\n if (this.filterOrSortLocal() && this.stores().length) {\n this.items.set(this.filterOrSortLocal()?.(signal([...this.stores()]), { ...(this.filter().filterData || {}), instanceSort: this.instanceSort() }) || []);\n\n return;\n }\n\n this.callApiByService(true);\n });\n\n });\n }\n\n ngOnInit() {\n this.outFunctionsControl.emit({\n reset: this.reset.bind(this),\n callApiByService: this.callApiByService.bind(this),\n resetScroll: this.resetScroll.bind(this),\n addItems: this.addItems.bind(this),\n removeItems: this.removeItems.bind(this),\n getCount: this.getCount.bind(this),\n getScrollContainer: this.getScrollContainer.bind(this),\n hideToolBarBottom: () => {\n return;\n },\n resetKeySelected: () => this.keysSelected.set([]),\n detectChanges: () => this.cdr.detectChanges()\n });\n\n fromEvent(window, 'resize').pipe(takeUntil(this.onDestroy)).subscribe(() => {\n this.cdr.detectChanges();\n });\n }\n\n protected getIndexRow = (data: { value: TYPE_ITEM_DATA_TABLE }) => {\n return of(this.items().findIndex((item) => item === data.value) + 1);\n }\n\n private getScrollContainer() {\n return this.bodyComponentRef() as VirtualScrollerComponent;\n }\n\n private async callApiByService(firstCall: boolean, resetAfterCallApi?: boolean) {\n try {\n if (firstCall) {\n this.loadedLastItem.set(false);\n }\n if (!this.httpRequestData() || this.loading() || this.loadedLastItem()) {\n return;\n }\n this.loading.set(true);\n this.outLoading.emit(this.loading());\n this.resetIndexHover();\n const { argumentsValue, guideAutoUpdateArgumentsValue } = this.httpRequestData() as IHttpRequestConfig;\n\n if (guideAutoUpdateArgumentsValue && !guideAutoUpdateArgumentsValue.sortOrderBy && this.instanceSort()) {\n guideAutoUpdateArgumentsValue.sortOrderBy = {\n fieldGetValue: 'storeParamsCallApi.instanceSort.fieldSort',\n fieldUpdate: '[0]',\n subFieldUpdate: 'order_by'\n };\n }\n\n if (guideAutoUpdateArgumentsValue && !guideAutoUpdateArgumentsValue.sortOrderType && this.instanceSort()) {\n guideAutoUpdateArgumentsValue.sortOrderType = {\n fieldGetValue: 'storeParamsCallApi.instanceSort.mode',\n fieldUpdate: '[0]',\n subFieldUpdate: 'order_type'\n };\n }\n if (firstCall) {\n if (!resetAfterCallApi) {\n this.hasScroll.set(false);\n this.stores.set([]);\n this.items.set([]);\n }\n this.loadedLastItem.set(this.httpRequestService.updateArguments(argumentsValue, { ...this.fakeResponseApi(), storeParamsCallApi: this.storeParamsCallApi() }, this.pagingStore(), this.keySearch(), true, this.loadedLastItem(), guideAutoUpdateArgumentsValue));\n }\n const result = await this.httpRequestService.callApi(this.httpRequestData() as IHttpRequestConfig);\n\n if (firstCall && resetAfterCallApi) {\n this.hasScroll.set(false);\n this.stores.set([]);\n this.items.set([]);\n }\n this.pagingStore.set(result.paging);\n this.totalItemInBackend.set(result.paging?.total_items || 0);\n this.outTotalItem.emit(this.totalItemInBackend());\n if (!this.pagingStore()) {\n this.loadedLastItem.set(true);\n }\n this.loadedLastItem.set(this.httpRequestService.updateArguments(argumentsValue, { ...result, storeParamsCallApi: this.storeParamsCallApi() }, this.pagingStore(), this.keySearch(), true, this.loadedLastItem(), guideAutoUpdateArgumentsValue));\n await this.addItems(convertObjectToSignal(result.data || []), false, true);\n this.outLoadDataComplete.emit(this.stores);\n } catch (error) {\n console.log(error);\n this.outLoadDataError.emit(error as IHttpResponseError);\n } finally {\n this.loading.set(false);\n this.outLoading.emit(this.loading());\n }\n }\n\n protected fakeResponseApi(): TYPE_OBJECT {\n this.loadedLastItem.set(false);\n this.pagingStore.set({});\n\n return this.httpRequestService.fakeResponsePagingApi();\n }\n\n private async callApiByServiceFooter() {\n if (!this.httpRequestDataFooter() || !this.showFooter()) {\n return;\n }\n const { argumentsValue, guideAutoUpdateArgumentsValue } = this.httpRequestDataFooter() as IHttpRequestConfig;\n\n this.httpRequestService.updateArguments(argumentsValue, { storeParamsCallApi: this.storeParamsCallApi() }, this.pagingStore(), this.keySearch(), true, false, guideAutoUpdateArgumentsValue);\n const result = await this.httpRequestService.callApi(this.httpRequestDataFooter() as IHttpRequestConfig);\n\n this.itemFooter.set(convertObjectToSignal(result.data)());\n }\n\n private async addItems(items: TYPE_DATA_TABLE, addFirst: boolean, ignoreHightLight?: boolean, ignoreReCallFooter?: boolean, autoCountNewItem?: boolean) {\n if (!items() || !items().length) {\n return;\n }\n const itemsAdd: Array<WritableSignal<TYPE_OBJECT>> = [];\n\n items().forEach(item => {\n if (!this.checkExistItem(item)) {\n itemsAdd.push(item);\n if (!ignoreHightLight) {\n this.hasItemHightLight.set(true);\n item.update(data => ({ ...data, specificHightLight: true }));\n }\n if (addFirst) {\n this.items.update(data => [item, ...data]);\n this.stores.update(data => [item, ...data]);\n\n return;\n }\n this.items.update(data => [...data, item]);\n this.stores.update(data => [...data, item]);\n }\n });\n if (autoCountNewItem && itemsAdd.length) {\n this.totalItemInBackend.update(value => value + itemsAdd.length);\n }\n if (!ignoreHightLight) {\n setTimeout(() => {\n itemsAdd.forEach(item => item.update(data => ({ ...data, specificHightLight: false })));\n this.hasItemHightLight.set(false);\n }, this.timeHighlighNewItem());\n }\n await this.checkScroll();\n if (!ignoreReCallFooter) {\n await this.callApiByServiceFooter();\n }\n }\n\n private checkExistItem(itemNew: WritableSignal<TYPE_OBJECT>): boolean {\n return this.items().find(item => `${item()[this.fieldKey()]}` === `${itemNew()[this.fieldKey()]}`) ? true : false;\n }\n\n private async removeItems(keys: Array<unknown>, ignoreReCallFooter?: boolean) {\n this.resetIndexHover();\n if (!this.items().length) {\n return;\n }\n keys.forEach(key => {\n this.items.update(items => {\n let isUpdate = false;\n\n const newItems = items.filter(item => {\n if (`${item()[this.fieldKey()]}` === `${key}`) {\n isUpdate = true;\n return false;\n }\n return true;\n });\n\n return isUpdate ? newItems : items;\n });\n\n this.stores.update(items => {\n let isUpdate = false;\n\n const newItems = items.filter(item => {\n if (`${item()[this.fieldKey()]}` === `${key}`) {\n isUpdate = true;\n return false;\n }\n return true;\n });\n\n return isUpdate ? newItems : items;\n });\n\n if (!this.keysSelected() || !this.keysSelected().length) {\n return;\n }\n this.keysSelected.update(keys => keys.filter(keySelected => keySelected !== key));\n });\n this.totalItemInBackend.update(value => value - keys.length);\n await this.checkScroll();\n if (!ignoreReCallFooter) {\n await this.callApiByServiceFooter();\n }\n this.outKeysSelected.emit({ keys: this.keysSelected() });\n }\n\n private getCount(): number {\n if (this.httpRequestData()) {\n return this.pagingStore()?.total_items || this.items().length;\n }\n\n return this.items().length;\n }\n\n protected handlerScroll(e: any) {\n e.stopPropagation();\n (this.headerElementRef() as any).nativeElement.scrollLeft = e.target.scrollLeft;\n if (this.footerElementRef()) {\n (this.footerElementRef() as any).nativeElement.scrollLeft = e.target.scrollLeft;\n }\n this.resetIndexHover(e);\n }\n\n protected handlerScrollBottom(e: Event) {\n e.stopPropagation();\n this.loadMore();\n }\n\n private loadMore() {\n if (this.loading()) {\n return;\n }\n this.outLoadMore.emit({ loadMoreSuccess: this.loadMoreSuccess.bind(this) });\n this.callApiByService(false);\n }\n\n private loadMoreSuccess(data: WritableSignal<Array<WritableSignal<TYPE_OBJECT>>>) {\n this.addItems(data, false);\n this.loading.set(false);\n this.outLoading.emit(this.loading());\n }\n\n protected handlerChangeAllChecked() {\n this.keysSelected.set([]);\n this.outKeysSelected.emit({ keys: this.keysSelected() });\n }\n\n protected handlerChangeCheckedAllItems(event: ICheckboxEvent) {\n if (event.checked) {\n this.keysSelected.set(this.items().filter(async (item) => !(await this.checkCancelConditionCheckedItem(item))).map(item => `${item()[this.fieldKey()]}`));\n this.outKeysSelected.emit({ keys: this.keysSelected() });\n\n return;\n }\n this.keysSelected.set([]);\n this.outKeysSelected.emit({ keys: this.keysSelected() });\n }\n\n private async checkCancelConditionCheckedItem(item: WritableSignal<TYPE_OBJECT>) {\n let isCancelCheck = false;\n\n if (!isCancelCheck && this.headerLeft().length && this.headerLeft()[0].checkConditionCheckBoxHidden) {\n isCancelCheck = await lastValueFrom((this.headerLeft()[0].checkConditionCheckBoxHidden as any)({ item: item() })) || false;\n }\n\n if (!isCancelCheck && this.headerRight().length && this.headerRight()[0].checkConditionCheckBoxHidden) {\n isCancelCheck = await lastValueFrom((this.headerRight()[0].checkConditionCheckBoxHidden as any)({ item: item() })) || false;\n }\n\n return isCancelCheck;\n }\n\n protected handlerChangeItemChecked(event: ICheckboxItem, item: TYPE_OBJECT) {\n const key = item[this.fieldKey()];\n const keys = new Set(this.keysSelected());\n\n keys.add(key);\n if (!event.checked) {\n keys.delete(key);\n }\n this.keysSelected.set(Array.from(keys));\n this.outKeysSelected.emit({ keys: this.keysSelected() });\n }\n\n protected handlerChangeSort(sort: ISort) {\n if (this.instanceSort && this.instanceSort()?.fieldSort !== sort.fieldSort) {\n this.instanceSort()?.reset();\n }\n this.instanceSort.set(sort);\n if (this.sortLocal()) {\n this.handlerSortLocal(sort);\n\n return;\n }\n this.storeParamsCallApi.update(data => ({ ...data, instanceSort: this.instanceSort() }));\n this.callApiByService(true);\n this.outSort.emit({\n sort: sort,\n onSortSuccess: this.onSortSuccess.bind(this)\n });\n }\n\n private handlerSortLocal(sort: ISort) {\n if (this.filterOrSortLocal() && this.stores().length) {\n this.items.set(this.filterOrSortLocal()?.(signal([...this.stores()]), { ...this.storeParamsCallApi(), instanceSort: sort }) || []);\n\n return;\n }\n const { fieldSort, mode } = sort;\n\n this.items.update(items => {\n items.sort((itemA, itemB) => {\n let value1 = mode === 'asc' ? itemA()[fieldSort] : itemB()[fieldSort];\n let value2 = mode === 'asc' ? itemB()[fieldSort] : itemA()[fieldSort];\n\n if (typeof value1 === 'string' && typeof value2 === 'string') {\n value1 = deleteUnicode(value1).toLocaleLowerCase();\n value2 = deleteUnicode(value2).toLocaleLowerCase();\n }\n\n if (value1 === value2) {\n return 0;\n }\n\n return value1 > value2 ? 1 : -1;\n });\n\n return [...items];\n });\n this.onSortSuccess();\n }\n\n protected handlerFunctionControlMoreSelectItem(functionControl: IDropdownFunctionControlEvent) {\n this.functionControlSelectMoreItem = functionControl;\n }\n\n protected handlerSelectedMoreItem(event: IEmitSelectKey | undefined) {\n if (!event || !event.key || !this.configSelectMoreItem()) {\n return;\n }\n\n this.functionControlSelectMoreItem?.reset();\n\n const perPage = Number(event.key).valueOf();\n const currentPage = Number(this.setPerPageSelectMoreItem(perPage)).valueOf();\n const isPagingNumber = this.configSelectMoreItem()?.pagingNumber;\n\n if (currentPage > perPage || this.items.length >= perPage) {\n if (!isPagingNumber) {\n this.setPerPageSelectMoreItem(currentPage);\n }\n this.keysSelected.set(this.items().slice(0, perPage).map(item => `${item()[this.fieldKey()]}`));\n\n return;\n }\n\n this.callApiByService(true, true);\n const sub = this.outLoadDataComplete.subscribe(() => {\n sub.unsubscribe();\n if (!isPagingNumber) {\n this.setPerPageSelectMoreItem(currentPage);\n }\n this.keysSelected.set(this.items().slice(0, perPage).map(item => `${item()[this.fieldKey()]}`));\n });\n\n this.outLoadDataError.subscribe(() => {\n this.setPerPageSelectMoreItem(currentPage);\n });\n }\n private setPerPageSelectMoreItem(perPage: string | number): string {\n const argumentsValue = this.httpRequestData()?.argumentsValue;\n\n if (!argumentsValue || !this.configSelectMoreItem()) {\n return '-1';\n }\n const keyPerPage = this.configSelectMoreItem()?.keyPerPage || 'per_page';\n\n for (let i = 0; i < argumentsValue.length; i++) {\n let argument = argumentsValue[i];\n\n if (argument instanceof HttpParams && argument.has(keyPerPage)) {\n const currentPerPage = argument.get(keyPerPage) || '25';\n\n argument = argument.set(keyPerPage, perPage);\n set(argumentsValue, `${i}`, argument);\n\n return currentPerPage;\n }\n\n if (argument instanceof Object && Object.keys(argument).includes(keyPerPage)) {\n const currentPerPage = argument.get(keyPerPage) || '25';\n\n set(argument, keyPerPage, perPage);\n\n return currentPerPage;\n }\n }\n\n return '-1';\n }\n\n private onSortSuccess() {\n this.loading.set(false);\n this.outLoading.emit(this.loading());\n this.resetScroll();\n }\n\n protected handlerButtonClick(type: 'button' | 'button-dropdown', buttonDropdownData: any, button: IButton) { // buttonOrigin chỉ sử dụng khi dùng buttonActions có button-dropdown\n if (type === 'button') {\n return this.outClickButtonAction.emit({ item: this.itemOfIndexHover, button: button });\n }\n this.outClickButtonAction.emit({ item: this.itemOfIndexHover, button, buttonDropdownData });\n }\n\n protected handlerBarButtonClick(button: IButton) {\n const items: Array<WritableSignal<any>> = [];\n\n this.keysSelected().forEach(key => {\n const item = this.items().find(item => `${item()[this.fieldKey()]}` === `${key}`);\n\n if (item) {\n items.push(item);\n }\n });\n\n return this.outClickBarButton.emit({\n button,\n items,\n keys: this.keysSelected(),\n hiddenBarButtons: () => {\n return;\n }\n });\n }\n\n protected handlerButtonDropdownEvent(eventName: TYPE_POPOVER_EVENT) {\n this.hasActionButtonDropdownContent.set(true);\n if (eventName === 'remove' || eventName === 'mouseleave-content') {\n this.hasActionButtonDropdownContent.set(false);\n }\n }\n\n protected setIndexHover(e: Event, item: WritableSignal<TYPE_OBJECT>) {\n e.stopPropagation();\n if (!this.items().length) {\n this.resetIndexHover();\n\n return;\n }\n this.itemOfIndexHover = item;\n }\n\n protected resetIndexHoverWhenMouseLeave(e?: Event) {\n e?.stopPropagation();\n const currentIndexItemHover = this.itemOfIndexHover;\n\n clearTimeout(this.timeoutLeaveItem());\n this.timeoutLeaveItem.set(setTimeout(() => {\n if (this.itemOfIndexHover && this.itemOfIndexHover !== currentIndexItemHover) {\n return;\n }\n this.resetIndexHover(e);\n }));\n }\n\n protected resetIndexHover(e?: Event) {\n e?.stopPropagation();\n if (this.hasActionButtonDropdownContent()) {\n return;\n }\n this.itemOfIndexHover = undefined;\n }\n\n protected handlerMouseEnter(event: Event) {\n event.stopPropagation();\n this.resetIndexHover(event);\n if (this.classFooterInclude()) {\n this.footerElementRef()?.nativeElement?.classList.remove('bg-[#f8f9fa]');\n this.footerLeftElementRef()?.nativeElement?.classList.remove('bg-[#f8f9fa]');\n this.footerElementRef()?.nativeElement?.classList.add(this.classFooterInclude());\n this.footerLeftElementRef()?.nativeElement?.classList.add(this.classFooterInclude());\n }\n }\n\n protected handlerMouseLeave(event: Event) {\n event.stopPropagation();\n if (this.classFooterInclude()) {\n this.footerElementRef()?.nativeElement?.classList.remove(this.classFooterInclude());\n this.footerLeftElementRef()?.nativeElement?.classList.remove(this.classFooterInclude());\n this.footerElementRef()?.nativeElement?.classList.add('bg-[#f8f9fa]');\n this.footerLeftElementRef()?.nativeElement?.classList.add('bg-[#f8f9fa]');\n }\n }\n\n private resetScroll() {\n if (this.headerElementRef()) {\n (this.headerElementRef() as any).nativeElement.scrollLeft = 0;\n }\n if (this.BodyElement) {\n this.BodyElement.scrollTop = 0;\n this.BodyElement.scrollLeft = 0;\n }\n if (this.footerElementRef()) {\n (this.footerElementRef() as any).nativeElement.scrollLeft = 0;\n }\n }\n\n private reset(clearSort?: boolean) {\n if (clearSort) {\n this.instanceSort()?.reset();\n this.instanceSort.set(undefined);\n }\n this.hasScroll.set(false);\n this.loading.set(false);\n this.outLoading.emit(this.loading());\n this.items.set([]);\n this.stores.set([]);\n this.fakeResponseApi();\n }\n\n private async checkScroll(): Promise<void> {\n const hasScroll = this.hasScroll();\n\n return new Promise(resolve => {\n timer(500).pipe(takeUntil(this.onDestroy)).subscribe(() => {\n if (this.BodyElement) {\n this.hasScroll.set(this.BodyElement.scrollHeight > this.BodyElement.offsetHeight);\n }\n if (hasScroll && !this.hasScroll()) {\n this.outScrollIsGone.emit({});\n if (!this.filterOrSortLocal()) {\n this.callApiByService(true);\n }\n }\n resolve();\n });\n });\n }\n\n protected get BodyElement(): HTMLElement | undefined {\n return this.bodyElementRef()?.nativeElement;\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n clearTimeout(this.timeoutLeaveItem());\n }\n\n}\n","<div class='flex flex-col w-full h-full'>\n @if (!ignoreBar()) {\n <div class=\"flex items-center justify-between relative z-[1] bottom-0 left-0 w-full bg-white mb-[16px] libs-ui-table-shadow-bottom\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]='labelBarNoSelectItem() | translate:{value:totalItemDisplay()}'>\n </div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate:{ value:keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude:'!w-[121px]',\n position: {\n mode:'start',\n distance:0\n }\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{config:{content:'i18n_more_select'}}\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons();track button) {\n <libs_ui-components-buttons-button [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"(button.label || ' ') | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select='div.libs-ui-table-bar-right'></ng-content>\n </div>\n }\n\n <div #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]='!ignoreBar()'\n (mouseleave)=\"resetIndexHover($event)\">\n <div #headerElementRef\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\"\n [class]=\"classHeaderContainer()\"\n (mouseenter)=\"resetIndexHover($event)\">\n @if (headerLeft().length) {\n <div class=\"h-full flex sticky top-0 left-0 z-[1] {{ classHeaderInclude() }}\">\n @for (header of headerLeft();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:true}\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:false}\" />\n }\n }\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n @if (items().length) {\n <div #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollX: (!headerLeft().length || !headerRight()) ? 'hidden':'scroll'}\"\n (outScroll)=\"handlerScroll($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n <virtual-scroller #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth: undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems;track data()) {\n <div #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\"\n [class.libs-ui-border-top-1px-36d3d3]=\"data().specificHightLight && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"data().specificHightLight && !ignoreBorderItem()\"\n [ngClass]=\"(data().specificHightLight || ($last && ignoreBorderItemLast())) ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px' : ignoreBorderItem() ? '' : isDashBorder() ? 'libs-ui-border-bottom-dashed-general' : 'libs-ui-border-bottom-general'\"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n (mouseenter)=\"setIndexHover($event,data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!data().specificHightLight\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\">\n @for (header of headerLeft();track header) {\n <div class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <div class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']();track $index) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"dataExpand\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n\n @if ((!items().length) && !loading() && noDataConfig()) {\n <div class=\"h-full\"\n [style.flex]=\"'0 0 '+headerElementRef.scrollWidth+'px'\">\n </div>\n }\n </div>\n }\n @if ((!items().length) && !loading()) {\n <div class=\"relative h-full w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #templateHeaderRef\n let-header='headerItem'\n let-isHeaderLeft='isHeaderLeft'>\n <div [class]=\"'relative flex '+ (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ')+ ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]='!header.ignorePyDefault'\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:header,isColRender:false}\" />\n }\n @if (header.rowsConfig;as rowsConfig) {\n @for (row of rowsConfig.rows;track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols ; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:col,isColRender:true}\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateHeaderContentRef\n let-header='headerItem'\n let-isColRender='isColRender'>\n <div class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]='header.contentHeaderAlignCenter ?? true'\n [class.justify-end]='header.contentHeaderJustifyContentEnd'\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"isColRender ? (header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})) : {}\"\n [ngClass]=\"isColRender ? (header.ngClass || {}) : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\">\n </div>\n }\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if ((header.label | LibsUiPipesCallFunctionInTemplatePipe:header.parseValue:header) | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"(header?.labelConfig?.classInclude || '')\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || {content:labelHeaderColumn}\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @if (header.tooltipOther; as tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{content: header.labelDescription.content | translate}\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template #templateBodyRef\n let-header='header'\n let-data='data'>\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden &&( data() | LibsUiPipesCallFunctionInTemplatePipe:header.checkConditionCheckBoxHidden:data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event,data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe:getIndexRow | async\">\n </div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates [isHover]=\"itemOfIndexHover === data && !data.specificHightLight\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '': (customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general':'libs-ui-table-shadow-top libs-ui-border-top-general') }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnter($event)\"\n (mouseleave)=\"handlerMouseLeave($event)\">\n @if (footerLeft()) {\n <div #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"footer.ngStyle || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"itemFooter\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n </div>\n }\n @if (footerRight()) {\n @for (footer of footerRight();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"footer.ngStyle || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"itemFooter\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (noDataConfig(); as config) {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\"\n LibsUiComponentsScrollOverlayDirective>\n @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\" ('no-data' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\">\n </div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"('no-result' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\">\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IButton } from \"@libs-ui/components-buttons-button\";\n\nexport interface ITabelButtonActionEvent {\n button: IButton;\n item: any;\n buttonDropdownData?: any;\n}\n\nexport interface ITableIButtonAction {\n ignoreAlignCenter?: boolean;\n marginTop?: number;\n marginLeft?: number;\n startOfColum?: number;\n\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IButton } from \"@libs-ui/components-buttons-button\";\n\nexport interface IButtonBarEvent {\n button: IButton;\n keys: Array<any>;\n items: Array<any>;\n hiddenBarButtons: () => void;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IAvatarConfig } from \"@libs-ui/components-avatar\";\nimport { IButton } from \"@libs-ui/components-buttons-button\";\nimport { IDropdown } from \"@libs-ui/components-dropdown\";\nimport { IListConfigItem } from \"@libs-ui/components-list\";\nimport { IPopover } from \"@libs-ui/components-popover\";\nimport { ISwitchEvent } from \"@libs-ui/components-switch\";\nimport { TYPE_FUNCTION, TYPE_OBJECT } from \"@libs-ui/interfaces-types\";\nimport { IHttpRequestConfig } from \"@libs-ui/services-http-request\";\nimport { Observable } from \"rxjs\";\nimport { LibsUiComponentsTableTemplateAbstractComponent } from \"../templates/template.abstract.component\";\nimport { TYPE_ITEM_DATA_TABLE } from \"./table.type\";\nimport { WritableSignal } from \"@angular/core\";\nimport { ILineClampConfig } from \"@libs-ui/components-line-clamp\";\n\nexport interface ITableTemplateConfig {\n cssWrapper: string;\n fieldsConfig: Array<ITableFieldTemplateConfig>;\n}\n\nexport interface ITableFieldTemplateConfig {\n instance?: 'tooltip' | 'line-clamp' | 'buttons' | 'button-status' | 'switch' | 'badge' | 'other-action-show-popup' | 'shape-style' | 'image' | 'avatar' | 'button-action-show-popup';\n instanceTooltipSpanInnerHtml?: boolean;\n field: string;\n parseValue?: TYPE_FUNCTION;\n httpDetailByValue?: IHttpRequestConfig;\n hasCallHttpDetailInContentTooltip?: boolean;\n getTooltipIconClass?: TYPE_FUNCTION; // Sử dụng dùng iconClass tooltip cho type tooltip.\n getTooltipConfig?: TYPE_FUNCTION;\n action?: (dataField: any, item: TYPE_ITEM_DATA_TABLE, itemTableSelected?: TYPE_ITEM_DATA_TABLE) => any;\n tooltip?: IPopover; // nếu muốn sử dụng mo-libs-shared-components-tooltip. yêu cầu để type bằng tooltip\n ngStyle?: TYPE_OBJECT;\n getNgStyle?: TYPE_FUNCTION;\n ngClass?: TYPE_OBJECT;\n ignoreClassMarginLeft?: boolean; // sử dụng khi muốn bỏ class margin cho type other-action-show-popup, badge\n\n lineClampConfig?: ILineClampConfig;\n maxWidthTooltip?: number; // sử dụng khi dùng mo-share-tooltip-ellipsis\n maxHeightTooltip?: number; // sử dụng khi dùng mo-share-tooltip-ellipsis\n\n getDisableValueSwitch?: TYPE_FUNCTION; // sử dụng khi muốn điểu chỉnh chế độ enable hay disable cho toggle\n getActiveValueSwitch?: TYPE_FUNCTION; // sử dụng khi muốn điểu chỉnh chế độ active hay deactive cho toggle\n switchAction?: (switchData: ISwitchEvent, item: TYPE_ITEM_DATA_TABLE) => void; // Bắt buộc khi sử dụng type = switch\n buttons?: Array<WritableSignal<IButton>>;\n buttonDropDown?: WritableSignal<IButton>;\n getButtonsByItem?: TYPE_FUNCTION<Array<WritableSignal<IButton>>>;\n showButtonHoverMode?: boolean;\n getDisable?: TYPE_FUNCTION; // Sử dụng để disable input, button, qr-code\n dropdownConfig?: ITableFieldTemplateConfigDropdown;\n\n getAvatarConfig?: TYPE_FUNCTION<IAvatarConfig>;\n\n getImageSrc?: (value: any, item?: TYPE_OBJECT, lang?: string, isError?: boolean) => Observable<string>;\n rows?: Array<ITableTemplateConfig>;\n rowsTemplateCssWrapper?: string;\n getComponentOutlet?: () => Observable<LibsUiComponentsTableTemplateAbstractComponent | any>;\n}\n\nexport interface ITableFieldTemplateConfigDropdown extends IDropdown {\n getListViewConfig?: TYPE_FUNCTION<IListConfigItem>;\n listViewKeysDisableItem?: Array<string>;\n listViewHiddenInputSearch?: boolean;\n maxHeight?: number;\n ignoreArrow?: boolean;\n position?: {\n mode: 'start' | 'center' | 'end',\n distance: number\n }\n}","import { Component, input } from \"@angular/core\";\nimport { TYPE_ITEM_DATA_TABLE } from \"../interfaces\";\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-table-templates_abstract',\n template: ``\n})\nexport class LibsUiComponentsTableTemplateAbstractComponent {\n readonly item = input.required<TYPE_ITEM_DATA_TABLE>();\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-table.mjs","sources":["../../../../../libs-ui/components/table/src/templates/templates.component.ts","../../../../../libs-ui/components/table/src/templates/templates.component.html","../../../../../libs-ui/components/table/src/table.component.ts","../../../../../libs-ui/components/table/src/table.component.html","../../../../../libs-ui/components/table/src/interfaces/button-action-event.interface.ts","../../../../../libs-ui/components/table/src/interfaces/button-bar-event.interface.ts","../../../../../libs-ui/components/table/src/interfaces/template-config.interface.ts","../../../../../libs-ui/components/table/src/templates/template.abstract.component.ts","../../../../../libs-ui/components/table/src/libs-ui-components-table.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AsyncPipe, NgClass, NgComponentOutlet, NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { LibsUiComponentsAvatarComponent } from '@libs-ui/components-avatar';\nimport { IButton, LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsButtonsStatusComponent } from '@libs-ui/components-buttons-status';\nimport { IDropdownFunctionControlEvent, IEmitMultiKey, IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { LibsUiComponentsLineClampComponent } from '@libs-ui/components-line-clamp';\nimport { LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { ISwitchEvent, LibsUiComponentsSwitchComponent } from '@libs-ui/components-switch';\nimport { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';\nimport { LibsUiPipesCloneObjectPipe } from '@libs-ui/pipes-clone-object';\nimport { LibsUiPipesSecurityTrustPipe } from '@libs-ui/pipes-security-trust';\nimport { convertObjectToSignal } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { TYPE_ITEM_DATA_TABLE } from '../interfaces';\nimport { ITableFieldTemplateConfig, ITableTemplateConfig } from '../interfaces/template-config.interface';\nimport { LibsUiComponentsBadgeComponent } from '@libs-ui/components-badge';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-table-templates',\n templateUrl: './templates.component.html',\n styleUrls: ['./templates.component.scss'],\n standalone: true,\n imports: [\n NgStyle, NgClass, TranslateModule, AsyncPipe, NgComponentOutlet,\n LibsUiComponentsAvatarComponent, LibsUiPipesCallFunctionInTemplatePipe,\n LibsUiPipesSecurityTrustPipe, LibsUiComponentsPopoverComponent,\n LibsUiComponentsButtonsStatusComponent, LibsUiComponentsSwitchComponent,\n LibsUiPipesCloneObjectPipe, LibsUiComponentsButtonsButtonComponent,\n LibsUiComponentsLineClampComponent, LibsUiComponentsDropdownComponent,\n LibsUiComponentsBadgeComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LibsUiComponentsTableTemplatesComponent {\n private lockClick!: boolean;\n private functionControls = new Map<number, IDropdownFunctionControlEvent>();\n protected isImageError: boolean | undefined;\n\n readonly isHover = input<boolean>();\n readonly configs = input<Array<ITableTemplateConfig>>();\n readonly templateCssWrapper = input<string>();\n readonly item = input.required<TYPE_ITEM_DATA_TABLE>();\n\n\n protected async handlerItemClick(event: Event | TYPE_POPOVER_EVENT | undefined, config: ITableFieldTemplateConfig, dataField: any) {\n if (event instanceof Event) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (typeof event === 'string' && event !== 'click') {\n return;\n }\n if (this.lockClick) {\n return;\n }\n this.lockClick = true;\n setTimeout(() => {\n this.lockClick = false;\n }, 250);\n if (config && config.action) {\n config.action(dataField, this.item());\n }\n }\n\n protected async clickButtonAction(button: IButton) {\n if (this.lockClick) {\n return;\n }\n this.lockClick = true;\n setTimeout(() => {\n this.lockClick = false;\n }, 250);\n button.action?.({ item: this.item() });\n }\n\n protected async handlerSwitch(switchItem: ISwitchEvent, config: ITableFieldTemplateConfig) {\n if (this.lockClick) {\n return;\n }\n this.lockClick = true;\n setTimeout(() => {\n this.lockClick = false;\n }, 250);\n config?.switchAction?.(switchItem, this.item());\n }\n\n protected async handlerSelectItemDropdown(fieldConfig: ITableFieldTemplateConfig, index: number, data?: IEmitSelectKey) {\n if (this.lockClick || !data) {\n return;\n }\n this.lockClick = true;\n setTimeout(() => {\n this.lockClick = false;\n }, 250);\n fieldConfig?.action?.(data.key, data.item, this.item());\n (this.functionControls?.get(index) as IDropdownFunctionControlEvent)?.reset();\n (this.functionControls?.get(index) as IDropdownFunctionControlEvent)?.removeList();\n }\n\n protected async handlerSelectItemsDropdown(fieldConfig: ITableFieldTemplateConfig, index: number, data?: IEmitMultiKey) {\n if (this.lockClick || !data) {\n return;\n }\n this.lockClick = true;\n setTimeout(() => {\n this.lockClick = false;\n }, 250);\n fieldConfig?.action?.(data.keys, convertObjectToSignal(data.mapKeys, false), this.item());\n (this.functionControls?.get(index) as IDropdownFunctionControlEvent)?.reset();\n }\n\n protected async handlerImageError(event: Event) {\n event.stopPropagation();\n this.isImageError = true;\n }\n\n protected async handlerFunctionControl(event: IDropdownFunctionControlEvent, index: number) {\n this.functionControls.set(index, event);\n }\n\n}\n","@if (configs(); as configs) {\n @if (item(); as item) {\n <div class=\"mo-lib-table-template {{ templateCssWrapper() || '' }}\">\n @for (config of configs; track $index) {\n @if (config.fieldsConfig) {\n <div [class]=\"config.cssWrapper\">\n @for (fieldConfig of config.fieldsConfig; track index;let index = $index;) {\n\n @if (!fieldConfig.rows && !fieldConfig.getComponentOutlet) {\n @switch (fieldConfig.instance) {\n @case (\"tooltip\") {\n @if ((fieldConfig.tooltip || {}); as tooltip) {\n <span LibsUiComponentsPopoverDirective\n [type]=\"tooltip.type || 'text'\"\n [mode]=\"tooltip.mode || 'hover'\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [classInclude]=\"tooltip.classInclude || ' '\"\n [ignoreShowPopover]=\"tooltip.ignoreShowPopover || false\"\n [config]=\"(fieldConfig.getTooltipConfig ? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getTooltipConfig:item() | async) : (tooltip.config | LibsUiPipesCloneObjectPipe)) | translate\"\n [innerHTML]=\" (fieldConfig.field ? item()[fieldConfig.field] : tooltip.dataView) | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async | translate\"\n (outEvent)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\">\n </span>\n }\n }\n @case (\"image\") {\n @if (((item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getImageSrc:item():isImageError) | async); as linkImage) {\n @if (linkImage !== ' ') {\n <img [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [src]=\"linkImage\"\n (error)=\"handlerImageError($event)\"\n (click)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\" />\n }\n }\n }\n\n @case (\"avatar\") {\n @if ((item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getAvatarConfig:item()) | async ; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\"\n [getLastTextAfterSpace]=\"avatarConfig.getLastTextAfterSpace\" />\n }\n }\n\n @case (\"buttons\") {\n @if ((fieldConfig.buttons && fieldConfig.buttons.length) || fieldConfig.getButtonsByItem) {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.invisible]=\"!isHover() && fieldConfig.showButtonHoverMode\">\n @for (button of (fieldConfig.buttons || (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getButtonsByItem:item() | async)); track $index) {\n\n <libs_ui-components-buttons-button [type]=\"button().type || 'button-primary'\"\n [sizeButton]=\"button().sizeButton || 'smaller'\"\n [disable]=\"button().disable ?? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item())\"\n [label]=\"button().label || ' '\"\n [classIconLeft]=\"button().classIconLeft || ''\"\n [classIconRight]=\"button().classIconRight || ''\"\n [popover]=\"button().popover || {}\"\n [classInclude]=\"button().classInclude || ''\"\n [ignorePointerEvent]=\"button().ignorePointerEvent\"\n (outClick)=\"clickButtonAction(button())\" />\n }\n </div>\n }\n }\n\n @case (\"button-status\") {\n <libs_ui-components-buttons-status [config]=\"(item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async\"\n (click)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\" />\n }\n\n @case (\"switch\") {\n <libs_ui-components-switch [active]=\"item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getActiveValueSwitch:item() | async\"\n [disable]=\"item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisableValueSwitch:item() | async\"\n (outSwitch)=\"handlerSwitch($event,fieldConfig)\" />\n }\n\n\n @case ((fieldConfig.instance === 'other-action-show-popup' || fieldConfig.instance === 'badge' || fieldConfig.instance === 'button-action-show-popup') ? fieldConfig.instance : '') {\n @if ((item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) !== ' ') {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.ml-[8px]]=\"!fieldConfig.ignoreClassMarginLeft\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: fieldConfig.dropdownConfig?.ignoreArrow || false,\n maxHeight: fieldConfig.dropdownConfig?.maxHeight || 2048,\n paddingLeftItem:fieldConfig.dropdownConfig?.paddingLeftItem ?? true,\n classInclude:fieldConfig.dropdownConfig?.classIncludePopup || 'w-[250px]',\n position: fieldConfig.dropdownConfig?.position || {\n mode:'center',\n distance:0\n }\n }\"\n [zIndex]=\"fieldConfig.dropdownConfig?.zIndex\"\n [listConfig]=\"fieldConfig.dropdownConfig?.getListViewConfig ? ((item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.dropdownConfig?.getListViewConfig:item()) | async):fieldConfig.dropdownConfig?.listViewConfig\"\n [listBackgroundCustom]=\"fieldConfig.dropdownConfig?.listViewBackgroundListCustom\"\n [listMaxItemShow]=\"fieldConfig.dropdownConfig?.listViewMaxItemShow || 5\"\n [listKeysDisable]=\"fieldConfig.dropdownConfig?.listViewKeysDisableItem\"\n [listHiddenInputSearch]=\"fieldConfig.dropdownConfig?.listViewHiddenInputSearch\"\n (outFunctionsControl)=\"handlerFunctionControl($event, index)\"\n (outSelectKey)=\"handlerSelectItemDropdown(fieldConfig, index,$event)\"\n (outSelectMultiKey)=\"handlerSelectItemsDropdown(fieldConfig, index,$event)\">\n @if (fieldConfig.instance === 'other-action-show-popup') {\n <div [innerHtml]=\"(item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate\">\n </div>\n }\n @if (fieldConfig.instance === 'badge' && (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) > 0) {\n <libs_ui-components-badge [active]=\"true\"\n [ignoreMarginDefault]=\"true\"\n mode=\"+x\"\n [count]=\"item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n [maxCount]=\"99\" />\n }\n @if (fieldConfig.instance === 'button-action-show-popup') {\n <libs_ui-components-buttons-button [type]=\"fieldConfig?.buttonDropDown()?.type || 'button-primary'\"\n [sizeButton]=\"fieldConfig?.buttonDropDown()?.sizeButton || 'smaller'\"\n [disable]=\"fieldConfig?.buttonDropDown()?.disable ?? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item() | async)\"\n [label]=\"fieldConfig?.buttonDropDown()?.label || ' '\"\n [classIconLeft]=\"fieldConfig?.buttonDropDown()?.classIconLeft || ''\"\n [classIconRight]=\"fieldConfig?.buttonDropDown()?.classIconRight || ''\"\n [popover]=\"fieldConfig?.buttonDropDown()?.popover || {}\"\n [classInclude]=\"fieldConfig?.buttonDropDown()?.classInclude || ''\"\n [ignoreStopPropagationEvent]=\"true\" />\n }\n\n </libs_ui-components-dropdown>\n </div>\n }\n }\n\n @case (\"line-clamp\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\">\n @if (fieldConfig.lineClampConfig; as lineClampConfig) {\n <libs_ui-components-line_clamp [ignoreShowButtonCollapseExpand]=\"lineClampConfig.ignoreShowButtonCollapseExpand ?? true\"\n [showTooltip]=\"lineClampConfig.showTooltip ?? true\"\n [maxHeight]=\"lineClampConfig.maxHeight || 36\"\n [maxWidthTooltip]=\"lineClampConfig.maxWidthTooltip || 200\"\n [maxHeightTooltip]=\"lineClampConfig.maxHeightTooltip || 100\"\n [ngClassObject]=\"lineClampConfig.ngClassObject ?? { 'libs-ui-line-clamp-content mo-lib-font-head-5': true }\"\n [isInnerText]=\"lineClampConfig.isInnerText || false\"\n [ignoreStopPropagationTooltipEvent]=\"true\"\n [content]=\"item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n (click)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\" />\n }\n </div>\n }\n\n @case (\"shape-style\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"(item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate | LibsUiPipesSecurityTrustPipe:'html':true | async\"\n (click)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\">\n </div>\n }\n @default {\n @if (((item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async | translate); as value) {\n @if (value !==' ') {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"value | LibsUiPipesSecurityTrustPipe:'html':true|async\"\n (click)=\"handlerItemClick($event,fieldConfig,item()[fieldConfig.field])\">\n </div>\n }\n }\n }\n }\n } @else {\n @if (fieldConfig.rows) {\n <div class=\"w-full flex relative {{ fieldConfig.rowsTemplateCssWrapper }}\">\n <div class=\"w-full flex absolute {{ fieldConfig.rowsTemplateCssWrapper }}\">\n <libs_ui-components-table-templates class=\"flex w-full\"\n [item]=\"item\"\n [configs]=\"fieldConfig.rows\" />\n </div>\n </div>\n }\n @else {\n <ng-container *ngComponentOutlet=\"(item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getComponentOutlet) | async; inputs:{item}\" />\n }\n }\n\n }\n </div>\n }\n }\n </div>\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AsyncPipe, NgClass, NgComponentOutlet, NgStyle, NgTemplateOutlet } from \"@angular/common\";\nimport { HttpParams } from \"@angular/common/http\";\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, ElementRef, inject, input, OnDestroy, OnInit, output, signal, untracked, viewChild, WritableSignal } from \"@angular/core\";\nimport { VirtualScrollerComponent, VirtualScrollerModule } from '@iharbeck/ngx-virtual-scroller';\nimport { IButton, LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { ISort, LibsUiComponentsButtonsSortArrowComponent } from '@libs-ui/components-buttons-sort';\nimport { ICheckboxItem } from \"@libs-ui/components-checkbox-group\";\nimport { ICheckboxEvent, LibsUiComponentsCheckboxSingleComponent } from \"@libs-ui/components-checkbox-single\";\nimport { IDropdownFunctionControlEvent, IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT } from \"@libs-ui/components-popover\";\nimport { LibsUiComponentsScrollOverlayDirective } from \"@libs-ui/components-scroll-overlay\";\nimport { LibsUiComponentsSpinnerComponent } from \"@libs-ui/components-spinner\";\nimport { LibsUiIconsGetIconComponentPipe } from \"@libs-ui/icons\";\nimport { IHttpResponseError, IPaging, TYPE_OBJECT } from \"@libs-ui/interfaces-types\";\nimport { LibsUiPipesCallFunctionInTemplatePipe } from \"@libs-ui/pipes-call-function-in-template\";\nimport { LibsUiPipesCheckSelectedByKeyPipe } from '@libs-ui/pipes-check-selected-by-key';\nimport { IHttpRequestConfig, LibsUiHttpRequestService, returnListObject } from \"@libs-ui/services-http-request\";\nimport { cloneDeep, convertObjectToSignal, deleteUnicode, get, set, viewDataNumberByLanguage } from \"@libs-ui/utils\";\nimport { TranslateModule } from \"@ngx-translate/core\";\nimport { fromEvent, lastValueFrom, of, Subject, takeUntil, timer } from \"rxjs\";\nimport { IButtonBarEvent, IConfigSelectMoreItem, IConfigTemplateItemCollapseExpand, IHoverButtonActionEvent, ILoadMoreEvent, ISortEvent, ITabelButtonActionEvent, ITableFooterConfig, ITableHeaderConfig, TYPE_DATA_FILTER_TABLE, TYPE_DATA_TABLE, TYPE_ITEM_DATA_TABLE, TYPE_NEW_DATA_TABLE, TYPE_TABLE_FILTER } from \"./interfaces\";\nimport { ITableFunctionControlEvent } from \"./interfaces/function-control-event.interface\";\nimport { ITableNoDataConfig } from \"./interfaces/no-data-config.interface\";\nimport { LibsUiComponentsTableTemplatesComponent } from \"./templates/templates.component\";\nimport { IListConfigItem } from \"@libs-ui/components-list\";\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-table',\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass, NgStyle, AsyncPipe, NgTemplateOutlet, NgComponentOutlet, LibsUiComponentsTableTemplatesComponent,\n TranslateModule, VirtualScrollerModule, LibsUiComponentsButtonsButtonComponent,\n LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsSortArrowComponent,\n LibsUiComponentsCheckboxSingleComponent,\n LibsUiComponentsSpinnerComponent, LibsUiComponentsPopoverComponent,\n LibsUiComponentsScrollOverlayDirective, LibsUiIconsGetIconComponentPipe,\n LibsUiPipesCallFunctionInTemplatePipe, LibsUiPipesCheckSelectedByKeyPipe\n ]\n})\nexport class LibsUiComponentsTableComponent implements OnInit, OnDestroy {\n /** PROPERTY */\n protected classHeaderContainer = computed(() => `libs-ui-table-header-container w-full flex ${this.ignoreClassBgHeader() ? '' : 'bg-white'} overflow-x-hidden z-[1] items-center ${this.classHeaderInclude() || ''}`)\n protected keysSelected = signal<Array<any>>([]);\n protected loading = signal<boolean>(false);\n protected stores = signal<Array<WritableSignal<TYPE_OBJECT>>>([]);\n protected items = signal<Array<WritableSignal<TYPE_OBJECT>>>([]);\n protected itemFooter = signal<TYPE_OBJECT>({});\n protected itemOfIndexHover?: TYPE_ITEM_DATA_TABLE;\n protected keySearch = signal<string>('');\n protected totalItemInBackend = signal<number>(0);\n protected hasItemHightLight = signal<boolean>(false);\n protected totalItemDisplay = computed(() => viewDataNumberByLanguage((this.totalItem() ?? this.totalItemInBackend()), false));\n protected listConfigMoreItem = computed<IListConfigItem>(() => {\n return {\n type: 'text',\n configTemplateText: signal({\n fieldKey: 'key',\n ignoreIconSelected: true,\n getValue: this.configSelectMoreItem()?.getValue,\n configLabelPopover: signal({\n zIndex: 1200\n })\n }),\n httpRequestData: signal({\n serviceOther: returnListObject(this.configSelectMoreItem()?.listOption),\n functionName: 'list',\n argumentsValue: []\n })\n }\n })\n\n private hasScroll = signal<boolean>(false);\n private instanceSort = signal<ISort | undefined>(undefined);\n private hasActionButtonDropdownContent = signal<boolean>(false);\n private pagingStore = signal<IPaging>({});\n private loadedLastItem = signal<boolean>(false);\n private storeParamsCallApi = signal<TYPE_OBJECT>({});\n private timeoutLeaveItem = signal<number | undefined>(undefined);\n private functionControlSelectMoreItem?: IDropdownFunctionControlEvent;\n private onDestroy = new Subject<void>();\n\n /** INPUT */\n readonly timeHighlighNewItem = input<number, number | undefined>(2000, { transform: val => val ?? 2000 });\n readonly headerLeft = input<Array<ITableHeaderConfig>, Array<ITableHeaderConfig> | undefined>([], { transform: val => val ?? [] });\n readonly headerRight = input<Array<ITableHeaderConfig>, Array<ITableHeaderConfig> | undefined>([], { transform: val => val ?? [] });\n readonly configTemplateItemCollapseExpand = input<IConfigTemplateItemCollapseExpand>();\n readonly showFooter = input<boolean>();\n readonly ignoreBorderFooter = input<boolean>();\n readonly customPositionFooter = input<'top' | 'bottom', 'top' | 'bottom' | undefined>('bottom', { transform: val => val ?? 'bottom' });\n readonly footerLeft = input<Array<ITableFooterConfig> | undefined>();\n readonly footerRight = input<Array<ITableFooterConfig> | undefined>();\n readonly disableCheckbox = input<boolean, boolean | undefined>(false, { transform: val => val ?? false });\n readonly enableUnequalChildrenSizes = input<boolean, boolean | undefined>(false, { transform: val => val ?? false });\n readonly bufferAmount = input<number, number | undefined>(5, { transform: val => val ? (val > 25 ? 25 : val) : 5 })\n readonly totalItem = input<number>();\n readonly isDashBorder = input<boolean>();\n readonly classHeaderInclude = input<string>();\n readonly classBodyInclude = input<string, string | undefined>('', { transform: val => val ?? '' });\n readonly classFooterInclude = input<string, string | undefined>('', { transform: val => val ?? '' });\n readonly classTableContainerInclude = input<string, string | undefined>('', { transform: val => val ?? '' });\n\n readonly fieldKey = input<string, string | undefined>('id', { transform: val => val || 'id' }); // tên field định danh item của listDatas\n readonly defaultKeysSelected = input<Array<any>>();\n readonly labelBarNoSelectItem = input<string>(`i18n_total_quantity`); // sử dụng để hiên thị khi tích chọn item\n readonly labelBarButtons = input<string, string | undefined>('i18n_number_item_selected', { transform: val => val || 'i18n_number_item_selected' }); // sử dụng để hiên thị khi tích chọn item\n readonly classLabelBarButtons = input<string, string | undefined>('', { transform: val => val ?? '' }); // sử dụng để hiên thị khi tích chọn item\n readonly barButtons = input<Array<IButton>>();\n readonly sortLocal = input<boolean>(); // trường hợp nếu sortLocal này không đáp ứng được nghiệp vụ thì mới cân nhắc sử dụng filterLocal\n readonly filterOrSortLocal = input<TYPE_TABLE_FILTER>();\n readonly httpRequestData = input<IHttpRequestConfig>();\n readonly httpRequestDataFooter = input<IHttpRequestConfig>();\n readonly newData = input<TYPE_NEW_DATA_TABLE>();\n readonly filter = input<TYPE_DATA_FILTER_TABLE, TYPE_DATA_FILTER_TABLE | undefined>({ filterData: {} }, { transform: val => val ?? { filterData: {} } });\n readonly ignoreBar = input<boolean>();\n readonly classLabelBarNoSelectItem = input<string>();\n readonly ignoreClassBgHeader = input<boolean>();\n readonly noDataConfig = input<ITableNoDataConfig>({ textNoData: 'i18n_no_data_yet', textSearchNoData: 'i18n_no_result' });\n readonly ignoreBorderItemLast = input<boolean>();\n readonly isHiddenHeaderWhenNodata = input<boolean>();\n readonly maxItemSelected = input<number, number | undefined>(100, { transform: val => val ?? 100 });\n readonly configSelectMoreItem = input<IConfigSelectMoreItem>();\n readonly onlyShowNoResult = input<boolean>();\n readonly ignoreBorderItem = input<boolean>();\n\n /** OUTPUT */\n\n readonly outLoadMore = output<ILoadMoreEvent>();\n readonly outScrollIsGone = output<ILoadMoreEvent>();\n readonly outLoading = output<boolean>();\n readonly outClickButtonAction = output<ITabelButtonActionEvent>();\n readonly outSort = output<ISortEvent>();\n readonly outClickBarButton = output<IButtonBarEvent>();\n readonly outHoverButtonAction = output<IHoverButtonActionEvent>();\n readonly outKeysSelected = output<{ keys: Array<any> }>();\n readonly outFunctionsControl = output<ITableFunctionControlEvent>();\n readonly outLoadDataComplete = output<WritableSignal<Array<WritableSignal<any>>>>();\n readonly outTotalItem = output<number>();\n readonly outLoadDataError = output<IHttpResponseError>();\n\n /**VIEW CHILD */\n protected headerElementRef = viewChild<ElementRef>('headerElementRef');\n protected footerElementRef = viewChild<ElementRef>('footerElementRef');\n protected footerLeftElementRef = viewChild<ElementRef>('footerLeftElementRef');\n private bodyElementRef = viewChild<ElementRef>('bodyElementRef');\n private bodyComponentRef = viewChild<VirtualScrollerComponent>('bodyComponentRef');;\n\n /**INJECT */\n private httpRequestService = inject(LibsUiHttpRequestService);\n private cdr = inject(ChangeDetectorRef);\n\n constructor() {\n effect(() => {\n if (this.defaultKeysSelected()?.length) {\n untracked(() => this.keysSelected.update(keys => ([...keys, ...(this.defaultKeysSelected() || [])])));\n }\n });\n effect(() => {\n if (this.showFooter()) {\n untracked(() => this.callApiByServiceFooter());\n }\n });\n\n effect(() => {\n if (this.newData()?.data().length) {\n untracked(() => this.addItems(this.newData()?.data as any, !this.newData()?.addToLastList));\n }\n });\n\n effect(() => {\n if (!this.filter().filterData || this.filter().ignoreCallApiAuto) {\n return;\n }\n untracked(() => {\n this.keySearch.set(get<any>(this.filter().filterData, 'keySearch', ''));\n this.storeParamsCallApi.set(cloneDeep(this.filter().filterData));\n if (this.filter()?.filterData && !this.filter().filterData['instanceSort'] && this.instanceSort()) {\n this.storeParamsCallApi.update(data => ({ ...data, instanceSort: this.instanceSort() }));\n }\n if (this.filterOrSortLocal() && this.stores().length) {\n this.items.set(this.filterOrSortLocal()?.(signal([...this.stores()]), { ...(this.filter().filterData || {}), instanceSort: this.instanceSort() }) || []);\n\n return;\n }\n\n this.callApiByService(true);\n });\n\n });\n }\n\n ngOnInit() {\n this.outFunctionsControl.emit({\n reset: this.reset.bind(this),\n callApiByService: this.callApiByService.bind(this),\n resetScroll: this.resetScroll.bind(this),\n addItems: this.addItems.bind(this),\n removeItems: this.removeItems.bind(this),\n getCount: this.getCount.bind(this),\n getScrollContainer: this.getScrollContainer.bind(this),\n hideToolBarBottom: () => {\n return;\n },\n resetKeySelected: () => this.keysSelected.set([]),\n detectChanges: () => this.cdr.detectChanges()\n });\n\n fromEvent(window, 'resize').pipe(takeUntil(this.onDestroy)).subscribe(() => {\n this.cdr.detectChanges();\n });\n }\n\n protected getIndexRow = (data: { value: TYPE_ITEM_DATA_TABLE }) => {\n return of(this.items().findIndex((item) => item === data.value) + 1);\n }\n\n private getScrollContainer() {\n return this.bodyComponentRef() as VirtualScrollerComponent;\n }\n\n private async callApiByService(firstCall: boolean, resetAfterCallApi?: boolean) {\n try {\n if (firstCall) {\n this.loadedLastItem.set(false);\n }\n if (!this.httpRequestData() || this.loading() || this.loadedLastItem()) {\n return;\n }\n this.loading.set(true);\n this.outLoading.emit(this.loading());\n this.resetIndexHover();\n const { argumentsValue, guideAutoUpdateArgumentsValue } = this.httpRequestData() as IHttpRequestConfig;\n\n if (guideAutoUpdateArgumentsValue && !guideAutoUpdateArgumentsValue.sortOrderBy && this.instanceSort()) {\n guideAutoUpdateArgumentsValue.sortOrderBy = {\n fieldGetValue: 'storeParamsCallApi.instanceSort.fieldSort',\n fieldUpdate: '[0]',\n subFieldUpdate: 'order_by'\n };\n }\n\n if (guideAutoUpdateArgumentsValue && !guideAutoUpdateArgumentsValue.sortOrderType && this.instanceSort()) {\n guideAutoUpdateArgumentsValue.sortOrderType = {\n fieldGetValue: 'storeParamsCallApi.instanceSort.mode',\n fieldUpdate: '[0]',\n subFieldUpdate: 'order_type'\n };\n }\n if (firstCall) {\n if (!resetAfterCallApi) {\n this.hasScroll.set(false);\n this.stores.set([]);\n this.items.set([]);\n }\n this.loadedLastItem.set(this.httpRequestService.updateArguments(argumentsValue, { ...this.fakeResponseApi(), storeParamsCallApi: this.storeParamsCallApi() }, this.pagingStore(), this.keySearch(), true, this.loadedLastItem(), guideAutoUpdateArgumentsValue));\n }\n const result = await this.httpRequestService.callApi(this.httpRequestData() as IHttpRequestConfig);\n\n if (firstCall && resetAfterCallApi) {\n this.hasScroll.set(false);\n this.stores.set([]);\n this.items.set([]);\n }\n this.pagingStore.set(result.paging);\n this.totalItemInBackend.set(result.paging?.total_items || 0);\n this.outTotalItem.emit(this.totalItemInBackend());\n if (!this.pagingStore()) {\n this.loadedLastItem.set(true);\n }\n this.loadedLastItem.set(this.httpRequestService.updateArguments(argumentsValue, { ...result, storeParamsCallApi: this.storeParamsCallApi() }, this.pagingStore(), this.keySearch(), true, this.loadedLastItem(), guideAutoUpdateArgumentsValue));\n await this.addItems(convertObjectToSignal(result.data || []), false, true);\n this.outLoadDataComplete.emit(this.stores);\n } catch (error) {\n console.log(error);\n this.outLoadDataError.emit(error as IHttpResponseError);\n } finally {\n this.loading.set(false);\n this.outLoading.emit(this.loading());\n }\n }\n\n protected fakeResponseApi(): TYPE_OBJECT {\n this.loadedLastItem.set(false);\n this.pagingStore.set({});\n\n return this.httpRequestService.fakeResponsePagingApi();\n }\n\n private async callApiByServiceFooter() {\n if (!this.httpRequestDataFooter() || !this.showFooter()) {\n return;\n }\n const { argumentsValue, guideAutoUpdateArgumentsValue } = this.httpRequestDataFooter() as IHttpRequestConfig;\n\n this.httpRequestService.updateArguments(argumentsValue, { storeParamsCallApi: this.storeParamsCallApi() }, this.pagingStore(), this.keySearch(), true, false, guideAutoUpdateArgumentsValue);\n const result = await this.httpRequestService.callApi(this.httpRequestDataFooter() as IHttpRequestConfig);\n\n this.itemFooter.set(convertObjectToSignal(result.data)());\n }\n\n private async addItems(items: TYPE_DATA_TABLE, addFirst: boolean, ignoreHightLight?: boolean, ignoreReCallFooter?: boolean, autoCountNewItem?: boolean) {\n if (!items() || !items().length) {\n return;\n }\n const itemsAdd: Array<WritableSignal<TYPE_OBJECT>> = [];\n\n items().forEach(item => {\n if (!this.checkExistItem(item)) {\n itemsAdd.push(item);\n if (!ignoreHightLight) {\n this.hasItemHightLight.set(true);\n item.update(data => ({ ...data, specificHightLight: true }));\n }\n if (addFirst) {\n this.items.update(data => [item, ...data]);\n this.stores.update(data => [item, ...data]);\n\n return;\n }\n this.items.update(data => [...data, item]);\n this.stores.update(data => [...data, item]);\n }\n });\n if (autoCountNewItem && itemsAdd.length) {\n this.totalItemInBackend.update(value => value + itemsAdd.length);\n }\n if (!ignoreHightLight) {\n setTimeout(() => {\n itemsAdd.forEach(item => item.update(data => ({ ...data, specificHightLight: false })));\n this.hasItemHightLight.set(false);\n }, this.timeHighlighNewItem());\n }\n await this.checkScroll();\n if (!ignoreReCallFooter) {\n await this.callApiByServiceFooter();\n }\n }\n\n private checkExistItem(itemNew: WritableSignal<TYPE_OBJECT>): boolean {\n return this.items().find(item => `${item()[this.fieldKey()]}` === `${itemNew()[this.fieldKey()]}`) ? true : false;\n }\n\n private async removeItems(keys: Array<unknown>, ignoreReCallFooter?: boolean) {\n this.resetIndexHover();\n if (!this.items().length) {\n return;\n }\n keys.forEach(key => {\n this.items.update(items => {\n let isUpdate = false;\n\n const newItems = items.filter(item => {\n if (`${item()[this.fieldKey()]}` === `${key}`) {\n isUpdate = true;\n return false;\n }\n return true;\n });\n\n return isUpdate ? newItems : items;\n });\n\n this.stores.update(items => {\n let isUpdate = false;\n\n const newItems = items.filter(item => {\n if (`${item()[this.fieldKey()]}` === `${key}`) {\n isUpdate = true;\n return false;\n }\n return true;\n });\n\n return isUpdate ? newItems : items;\n });\n\n if (!this.keysSelected() || !this.keysSelected().length) {\n return;\n }\n this.keysSelected.update(keys => keys.filter(keySelected => keySelected !== key));\n });\n this.totalItemInBackend.update(value => value - keys.length);\n await this.checkScroll();\n if (!ignoreReCallFooter) {\n await this.callApiByServiceFooter();\n }\n this.outKeysSelected.emit({ keys: this.keysSelected() });\n }\n\n private getCount(): number {\n if (this.httpRequestData()) {\n return this.pagingStore()?.total_items || this.items().length;\n }\n\n return this.items().length;\n }\n\n protected handlerScroll(e: any) {\n e.stopPropagation();\n (this.headerElementRef() as any).nativeElement.scrollLeft = e.target.scrollLeft;\n if (this.footerElementRef()) {\n (this.footerElementRef() as any).nativeElement.scrollLeft = e.target.scrollLeft;\n }\n this.resetIndexHover(e);\n }\n\n protected handlerScrollBottom(e: Event) {\n e.stopPropagation();\n this.loadMore();\n }\n\n private loadMore() {\n if (this.loading()) {\n return;\n }\n this.outLoadMore.emit({ loadMoreSuccess: this.loadMoreSuccess.bind(this) });\n this.callApiByService(false);\n }\n\n private loadMoreSuccess(data: WritableSignal<Array<WritableSignal<TYPE_OBJECT>>>) {\n this.addItems(data, false);\n this.loading.set(false);\n this.outLoading.emit(this.loading());\n }\n\n protected handlerChangeAllChecked() {\n this.keysSelected.set([]);\n this.outKeysSelected.emit({ keys: this.keysSelected() });\n }\n\n protected handlerChangeCheckedAllItems(event: ICheckboxEvent) {\n if (event.checked) {\n this.keysSelected.set(this.items().filter(async (item) => !(await this.checkCancelConditionCheckedItem(item))).map(item => `${item()[this.fieldKey()]}`));\n this.outKeysSelected.emit({ keys: this.keysSelected() });\n\n return;\n }\n this.keysSelected.set([]);\n this.outKeysSelected.emit({ keys: this.keysSelected() });\n }\n\n private async checkCancelConditionCheckedItem(item: WritableSignal<TYPE_OBJECT>) {\n let isCancelCheck = false;\n\n if (!isCancelCheck && this.headerLeft().length && this.headerLeft()[0].checkConditionCheckBoxHidden) {\n isCancelCheck = await lastValueFrom((this.headerLeft()[0].checkConditionCheckBoxHidden as any)({ item: item() })) || false;\n }\n\n if (!isCancelCheck && this.headerRight().length && this.headerRight()[0].checkConditionCheckBoxHidden) {\n isCancelCheck = await lastValueFrom((this.headerRight()[0].checkConditionCheckBoxHidden as any)({ item: item() })) || false;\n }\n\n return isCancelCheck;\n }\n\n protected handlerChangeItemChecked(event: ICheckboxItem, item: TYPE_OBJECT) {\n const key = item[this.fieldKey()];\n const keys = new Set(this.keysSelected());\n\n keys.add(key);\n if (!event.checked) {\n keys.delete(key);\n }\n this.keysSelected.set(Array.from(keys));\n this.outKeysSelected.emit({ keys: this.keysSelected() });\n }\n\n protected handlerChangeSort(sort: ISort) {\n if (this.instanceSort && this.instanceSort()?.fieldSort !== sort.fieldSort) {\n this.instanceSort()?.reset();\n }\n this.instanceSort.set(sort);\n if (this.sortLocal()) {\n this.handlerSortLocal(sort);\n\n return;\n }\n this.storeParamsCallApi.update(data => ({ ...data, instanceSort: this.instanceSort() }));\n this.callApiByService(true);\n this.outSort.emit({\n sort: sort,\n onSortSuccess: this.onSortSuccess.bind(this)\n });\n }\n\n private handlerSortLocal(sort: ISort) {\n if (this.filterOrSortLocal() && this.stores().length) {\n this.items.set(this.filterOrSortLocal()?.(signal([...this.stores()]), { ...this.storeParamsCallApi(), instanceSort: sort }) || []);\n\n return;\n }\n const { fieldSort, mode } = sort;\n\n this.items.update(items => {\n items.sort((itemA, itemB) => {\n let value1 = mode === 'asc' ? itemA()[fieldSort] : itemB()[fieldSort];\n let value2 = mode === 'asc' ? itemB()[fieldSort] : itemA()[fieldSort];\n\n if (typeof value1 === 'string' && typeof value2 === 'string') {\n value1 = deleteUnicode(value1).toLocaleLowerCase();\n value2 = deleteUnicode(value2).toLocaleLowerCase();\n }\n\n if (value1 === value2) {\n return 0;\n }\n\n return value1 > value2 ? 1 : -1;\n });\n\n return [...items];\n });\n this.onSortSuccess();\n }\n\n protected handlerFunctionControlMoreSelectItem(functionControl: IDropdownFunctionControlEvent) {\n this.functionControlSelectMoreItem = functionControl;\n }\n\n protected handlerSelectedMoreItem(event: IEmitSelectKey | undefined) {\n if (!event || !event.key || !this.configSelectMoreItem()) {\n return;\n }\n\n this.functionControlSelectMoreItem?.reset();\n\n const perPage = Number(event.key).valueOf();\n const currentPage = Number(this.setPerPageSelectMoreItem(perPage)).valueOf();\n const isPagingNumber = this.configSelectMoreItem()?.pagingNumber;\n\n if (currentPage > perPage || this.items.length >= perPage) {\n if (!isPagingNumber) {\n this.setPerPageSelectMoreItem(currentPage);\n }\n this.keysSelected.set(this.items().slice(0, perPage).map(item => `${item()[this.fieldKey()]}`));\n\n return;\n }\n\n this.callApiByService(true, true);\n const sub = this.outLoadDataComplete.subscribe(() => {\n sub.unsubscribe();\n if (!isPagingNumber) {\n this.setPerPageSelectMoreItem(currentPage);\n }\n this.keysSelected.set(this.items().slice(0, perPage).map(item => `${item()[this.fieldKey()]}`));\n });\n\n this.outLoadDataError.subscribe(() => {\n this.setPerPageSelectMoreItem(currentPage);\n });\n }\n private setPerPageSelectMoreItem(perPage: string | number): string {\n const argumentsValue = this.httpRequestData()?.argumentsValue;\n\n if (!argumentsValue || !this.configSelectMoreItem()) {\n return '-1';\n }\n const keyPerPage = this.configSelectMoreItem()?.keyPerPage || 'per_page';\n\n for (let i = 0; i < argumentsValue.length; i++) {\n let argument = argumentsValue[i];\n\n if (argument instanceof HttpParams && argument.has(keyPerPage)) {\n const currentPerPage = argument.get(keyPerPage) || '25';\n\n argument = argument.set(keyPerPage, perPage);\n set(argumentsValue, `${i}`, argument);\n\n return currentPerPage;\n }\n\n if (argument instanceof Object && Object.keys(argument).includes(keyPerPage)) {\n const currentPerPage = argument.get(keyPerPage) || '25';\n\n set(argument, keyPerPage, perPage);\n\n return currentPerPage;\n }\n }\n\n return '-1';\n }\n\n private onSortSuccess() {\n this.loading.set(false);\n this.outLoading.emit(this.loading());\n this.resetScroll();\n }\n\n protected handlerButtonClick(type: 'button' | 'button-dropdown', buttonDropdownData: any, button: IButton) { // buttonOrigin chỉ sử dụng khi dùng buttonActions có button-dropdown\n if (type === 'button') {\n return this.outClickButtonAction.emit({ item: this.itemOfIndexHover, button: button });\n }\n this.outClickButtonAction.emit({ item: this.itemOfIndexHover, button, buttonDropdownData });\n }\n\n protected handlerBarButtonClick(button: IButton) {\n const items: Array<WritableSignal<any>> = [];\n\n this.keysSelected().forEach(key => {\n const item = this.items().find(item => `${item()[this.fieldKey()]}` === `${key}`);\n\n if (item) {\n items.push(item);\n }\n });\n\n return this.outClickBarButton.emit({\n button,\n items,\n keys: this.keysSelected(),\n hiddenBarButtons: () => {\n return;\n }\n });\n }\n\n protected handlerButtonDropdownEvent(eventName: TYPE_POPOVER_EVENT) {\n this.hasActionButtonDropdownContent.set(true);\n if (eventName === 'remove' || eventName === 'mouseleave-content') {\n this.hasActionButtonDropdownContent.set(false);\n }\n }\n\n protected setIndexHover(e: Event, item: WritableSignal<TYPE_OBJECT>) {\n e.stopPropagation();\n if (!this.items().length) {\n this.resetIndexHover();\n\n return;\n }\n this.itemOfIndexHover = item;\n }\n\n protected resetIndexHoverWhenMouseLeave(e?: Event) {\n e?.stopPropagation();\n const currentIndexItemHover = this.itemOfIndexHover;\n\n clearTimeout(this.timeoutLeaveItem());\n this.timeoutLeaveItem.set(setTimeout(() => {\n if (this.itemOfIndexHover && this.itemOfIndexHover !== currentIndexItemHover) {\n return;\n }\n this.resetIndexHover(e);\n }));\n }\n\n protected resetIndexHover(e?: Event) {\n e?.stopPropagation();\n if (this.hasActionButtonDropdownContent()) {\n return;\n }\n this.itemOfIndexHover = undefined;\n }\n\n protected handlerMouseEnter(event: Event) {\n event.stopPropagation();\n this.resetIndexHover(event);\n if (this.classFooterInclude()) {\n this.footerElementRef()?.nativeElement?.classList.remove('bg-[#f8f9fa]');\n this.footerLeftElementRef()?.nativeElement?.classList.remove('bg-[#f8f9fa]');\n this.footerElementRef()?.nativeElement?.classList.add(this.classFooterInclude());\n this.footerLeftElementRef()?.nativeElement?.classList.add(this.classFooterInclude());\n }\n }\n\n protected handlerMouseLeave(event: Event) {\n event.stopPropagation();\n if (this.classFooterInclude()) {\n this.footerElementRef()?.nativeElement?.classList.remove(this.classFooterInclude());\n this.footerLeftElementRef()?.nativeElement?.classList.remove(this.classFooterInclude());\n this.footerElementRef()?.nativeElement?.classList.add('bg-[#f8f9fa]');\n this.footerLeftElementRef()?.nativeElement?.classList.add('bg-[#f8f9fa]');\n }\n }\n\n private resetScroll() {\n if (this.headerElementRef()) {\n (this.headerElementRef() as any).nativeElement.scrollLeft = 0;\n }\n if (this.BodyElement) {\n this.BodyElement.scrollTop = 0;\n this.BodyElement.scrollLeft = 0;\n }\n if (this.footerElementRef()) {\n (this.footerElementRef() as any).nativeElement.scrollLeft = 0;\n }\n }\n\n private reset(clearSort?: boolean) {\n if (clearSort) {\n this.instanceSort()?.reset();\n this.instanceSort.set(undefined);\n }\n this.hasScroll.set(false);\n this.loading.set(false);\n this.outLoading.emit(this.loading());\n this.items.set([]);\n this.stores.set([]);\n this.fakeResponseApi();\n }\n\n private async checkScroll(): Promise<void> {\n const hasScroll = this.hasScroll();\n\n return new Promise(resolve => {\n timer(500).pipe(takeUntil(this.onDestroy)).subscribe(() => {\n if (this.BodyElement) {\n this.hasScroll.set(this.BodyElement.scrollHeight > this.BodyElement.offsetHeight);\n }\n if (hasScroll && !this.hasScroll()) {\n this.outScrollIsGone.emit({});\n if (!this.filterOrSortLocal()) {\n this.callApiByService(true);\n }\n }\n resolve();\n });\n });\n }\n\n protected get BodyElement(): HTMLElement | undefined {\n return this.bodyElementRef()?.nativeElement;\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n clearTimeout(this.timeoutLeaveItem());\n }\n\n}\n","<div class='flex flex-col w-full h-full'>\n @if (!ignoreBar()) {\n <div class=\"flex items-center justify-between relative z-[1] bottom-0 left-0 w-full bg-white mb-[16px] libs-ui-table-shadow-bottom\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]='labelBarNoSelectItem() | translate:{value:totalItemDisplay()}'>\n </div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate:{ value:keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude:'!w-[121px]',\n position: {\n mode:'start',\n distance:0\n }\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{config:{content:'i18n_more_select'}}\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons();track button) {\n <libs_ui-components-buttons-button [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"(button.label || ' ') | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select='div.libs-ui-table-bar-right'></ng-content>\n </div>\n }\n\n <div #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]='!ignoreBar()'\n (mouseleave)=\"resetIndexHover($event)\">\n <div #headerElementRef\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\"\n [class]=\"classHeaderContainer()\"\n (mouseenter)=\"resetIndexHover($event)\">\n @if (headerLeft().length) {\n <div class=\"h-full flex sticky top-0 left-0 z-[1] {{ classHeaderInclude() }}\">\n @for (header of headerLeft();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:true}\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:false}\" />\n }\n }\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n @if (items().length) {\n <div #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollX: (!headerLeft().length || !headerRight()) ? 'hidden':'scroll'}\"\n (outScroll)=\"handlerScroll($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n <virtual-scroller #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth: undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems;track data()) {\n <div #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\"\n [class.libs-ui-border-top-1px-36d3d3]=\"data().specificHightLight && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"data().specificHightLight && !ignoreBorderItem()\"\n [ngClass]=\"(data().specificHightLight || ($last && ignoreBorderItemLast())) ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px' : ignoreBorderItem() ? '' : isDashBorder() ? 'libs-ui-border-bottom-dashed-general' : 'libs-ui-border-bottom-general'\"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n (mouseenter)=\"setIndexHover($event,data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!data().specificHightLight\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\">\n @for (header of headerLeft();track header) {\n <div class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <div class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']();track $index) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"dataExpand\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n\n @if ((!items().length) && !loading() && noDataConfig()) {\n <div class=\"h-full\"\n [style.flex]=\"'0 0 '+headerElementRef.scrollWidth+'px'\">\n </div>\n }\n </div>\n }\n @if ((!items().length) && !loading()) {\n <div class=\"relative h-full w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #templateHeaderRef\n let-header='headerItem'\n let-isHeaderLeft='isHeaderLeft'>\n <div [class]=\"'relative flex '+ (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ')+ ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]='!header.ignorePyDefault'\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:header,isColRender:false}\" />\n }\n @if (header.rowsConfig;as rowsConfig) {\n @for (row of rowsConfig.rows;track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols ; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:col,isColRender:true}\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateHeaderContentRef\n let-header='headerItem'\n let-isColRender='isColRender'>\n <div class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]='header.contentHeaderAlignCenter ?? true'\n [class.justify-end]='header.contentHeaderJustifyContentEnd'\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"isColRender ? (header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})) : {}\"\n [ngClass]=\"isColRender ? (header.ngClass || {}) : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\">\n </div>\n }\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if ((header.label | LibsUiPipesCallFunctionInTemplatePipe:header.parseValue:header) | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"(header?.labelConfig?.classInclude || '')\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || {content:labelHeaderColumn}\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @if (header.tooltipOther; as tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{content: header.labelDescription.content | translate}\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template #templateBodyRef\n let-header='header'\n let-data='data'>\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden &&( data() | LibsUiPipesCallFunctionInTemplatePipe:header.checkConditionCheckBoxHidden:data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event,data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe:getIndexRow | async\">\n </div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates [isHover]=\"itemOfIndexHover === data && !data.specificHightLight\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '': (customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general':'libs-ui-table-shadow-top libs-ui-border-top-general') }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnter($event)\"\n (mouseleave)=\"handlerMouseLeave($event)\">\n @if (footerLeft()) {\n <div #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"footer.ngStyle || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"itemFooter\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n </div>\n }\n @if (footerRight()) {\n @for (footer of footerRight();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"footer.ngStyle || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"itemFooter\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (noDataConfig(); as config) {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\"\n LibsUiComponentsScrollOverlayDirective>\n @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\" ('no-data' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\">\n </div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"('no-result' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\">\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IButton } from \"@libs-ui/components-buttons-button\";\n\nexport interface ITabelButtonActionEvent {\n button: IButton;\n item: any;\n buttonDropdownData?: any;\n}\n\nexport interface ITableIButtonAction {\n ignoreAlignCenter?: boolean;\n marginTop?: number;\n marginLeft?: number;\n startOfColum?: number;\n\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IButton } from \"@libs-ui/components-buttons-button\";\n\nexport interface IButtonBarEvent {\n button: IButton;\n keys: Array<any>;\n items: Array<any>;\n hiddenBarButtons: () => void;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IAvatarConfig } from \"@libs-ui/components-avatar\";\nimport { IButton } from \"@libs-ui/components-buttons-button\";\nimport { IDropdown } from \"@libs-ui/components-dropdown\";\nimport { IListConfigItem } from \"@libs-ui/components-list\";\nimport { IPopover } from \"@libs-ui/components-popover\";\nimport { ISwitchEvent } from \"@libs-ui/components-switch\";\nimport { TYPE_FUNCTION, TYPE_OBJECT } from \"@libs-ui/interfaces-types\";\nimport { IHttpRequestConfig } from \"@libs-ui/services-http-request\";\nimport { Observable } from \"rxjs\";\nimport { LibsUiComponentsTableTemplateAbstractComponent } from \"../templates/template.abstract.component\";\nimport { TYPE_ITEM_DATA_TABLE } from \"./table.type\";\nimport { WritableSignal } from \"@angular/core\";\nimport { ILineClampConfig } from \"@libs-ui/components-line-clamp\";\n\nexport interface ITableTemplateConfig {\n cssWrapper: string;\n fieldsConfig: Array<ITableFieldTemplateConfig>;\n}\n\nexport interface ITableFieldTemplateConfig {\n instance?: 'tooltip' | 'line-clamp' | 'buttons' | 'button-status' | 'switch' | 'badge' | 'other-action-show-popup' | 'shape-style' | 'image' | 'avatar' | 'button-action-show-popup';\n instanceTooltipSpanInnerHtml?: boolean;\n field: string;\n parseValue?: TYPE_FUNCTION;\n httpDetailByValue?: IHttpRequestConfig;\n hasCallHttpDetailInContentTooltip?: boolean;\n getTooltipIconClass?: TYPE_FUNCTION; // Sử dụng dùng iconClass tooltip cho type tooltip.\n getTooltipConfig?: TYPE_FUNCTION;\n action?: (dataField: any, item: TYPE_ITEM_DATA_TABLE, itemTableSelected?: TYPE_ITEM_DATA_TABLE) => any;\n tooltip?: IPopover; // nếu muốn sử dụng mo-libs-shared-components-tooltip. yêu cầu để type bằng tooltip\n ngStyle?: TYPE_OBJECT;\n getNgStyle?: TYPE_FUNCTION;\n ngClass?: TYPE_OBJECT;\n ignoreClassMarginLeft?: boolean; // sử dụng khi muốn bỏ class margin cho type other-action-show-popup, badge\n\n lineClampConfig?: ILineClampConfig;\n maxWidthTooltip?: number; // sử dụng khi dùng mo-share-tooltip-ellipsis\n maxHeightTooltip?: number; // sử dụng khi dùng mo-share-tooltip-ellipsis\n\n getDisableValueSwitch?: TYPE_FUNCTION; // sử dụng khi muốn điểu chỉnh chế độ enable hay disable cho toggle\n getActiveValueSwitch?: TYPE_FUNCTION; // sử dụng khi muốn điểu chỉnh chế độ active hay deactive cho toggle\n switchAction?: (switchData: ISwitchEvent, item: TYPE_ITEM_DATA_TABLE) => void; // Bắt buộc khi sử dụng type = switch\n buttons?: Array<WritableSignal<IButton>>;\n buttonDropDown?: WritableSignal<IButton>;\n getButtonsByItem?: TYPE_FUNCTION<Array<WritableSignal<IButton>>>;\n showButtonHoverMode?: boolean;\n getDisable?: TYPE_FUNCTION; // Sử dụng để disable input, button, qr-code\n dropdownConfig?: ITableFieldTemplateConfigDropdown;\n\n getAvatarConfig?: TYPE_FUNCTION<IAvatarConfig>;\n\n getImageSrc?: (value: any, item?: TYPE_OBJECT, lang?: string, isError?: boolean) => Observable<string>;\n rows?: Array<ITableTemplateConfig>;\n rowsTemplateCssWrapper?: string;\n getComponentOutlet?: () => Observable<LibsUiComponentsTableTemplateAbstractComponent | any>;\n}\n\nexport interface ITableFieldTemplateConfigDropdown extends IDropdown {\n getListViewConfig?: TYPE_FUNCTION<IListConfigItem>;\n listViewKeysDisableItem?: Array<string>;\n listViewHiddenInputSearch?: boolean;\n maxHeight?: number;\n ignoreArrow?: boolean;\n position?: {\n mode: 'start' | 'center' | 'end',\n distance: number\n }\n}","import { Component, input } from \"@angular/core\";\nimport { TYPE_ITEM_DATA_TABLE } from \"../interfaces\";\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-table-templates_abstract',\n template: ``\n})\nexport class LibsUiComponentsTableTemplateAbstractComponent {\n readonly item = input.required<TYPE_ITEM_DATA_TABLE>();\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|