@libs-ui/components-table 0.2.319-0 → 0.2.321-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -683,7 +683,7 @@ export class LibsUiComponentsTableComponent {
683
683
  clearTimeout(this.timeoutLeaveItem());
684
684
  }
685
685
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
686
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsTableComponent, isStandalone: true, selector: "libs_ui-components-table", inputs: { timeHighlighNewItem: { classPropertyName: "timeHighlighNewItem", publicName: "timeHighlighNewItem", isSignal: true, isRequired: false, transformFunction: null }, headerLeft: { classPropertyName: "headerLeft", publicName: "headerLeft", isSignal: true, isRequired: false, transformFunction: null }, headerRight: { classPropertyName: "headerRight", publicName: "headerRight", isSignal: true, isRequired: false, transformFunction: null }, ignoreCalculatorWidthHeader: { classPropertyName: "ignoreCalculatorWidthHeader", publicName: "ignoreCalculatorWidthHeader", isSignal: true, isRequired: false, transformFunction: null }, configTemplateItemCollapseExpand: { classPropertyName: "configTemplateItemCollapseExpand", publicName: "configTemplateItemCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, showFooter: { classPropertyName: "showFooter", publicName: "showFooter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderFooter: { classPropertyName: "ignoreBorderFooter", publicName: "ignoreBorderFooter", isSignal: true, isRequired: false, transformFunction: null }, customPositionFooter: { classPropertyName: "customPositionFooter", publicName: "customPositionFooter", isSignal: true, isRequired: false, transformFunction: null }, footerLeft: { classPropertyName: "footerLeft", publicName: "footerLeft", isSignal: true, isRequired: false, transformFunction: null }, footerRight: { classPropertyName: "footerRight", publicName: "footerRight", isSignal: true, isRequired: false, transformFunction: null }, disableCheckbox: { classPropertyName: "disableCheckbox", publicName: "disableCheckbox", isSignal: true, isRequired: false, transformFunction: null }, enableUnequalChildrenSizes: { classPropertyName: "enableUnequalChildrenSizes", publicName: "enableUnequalChildrenSizes", isSignal: true, isRequired: false, transformFunction: null }, bufferAmount: { classPropertyName: "bufferAmount", publicName: "bufferAmount", isSignal: true, isRequired: false, transformFunction: null }, totalItem: { classPropertyName: "totalItem", publicName: "totalItem", isSignal: true, isRequired: false, transformFunction: null }, isDashBorder: { classPropertyName: "isDashBorder", publicName: "isDashBorder", isSignal: true, isRequired: false, transformFunction: null }, classHeaderContainerInclude: { classPropertyName: "classHeaderContainerInclude", publicName: "classHeaderContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classHeaderLeftInclude: { classPropertyName: "classHeaderLeftInclude", publicName: "classHeaderLeftInclude", isSignal: true, isRequired: false, transformFunction: null }, classBodyInclude: { classPropertyName: "classBodyInclude", publicName: "classBodyInclude", isSignal: true, isRequired: false, transformFunction: null }, classFooterInclude: { classPropertyName: "classFooterInclude", publicName: "classFooterInclude", isSignal: true, isRequired: false, transformFunction: null }, classTableContainerInclude: { classPropertyName: "classTableContainerInclude", publicName: "classTableContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classBarInclude: { classPropertyName: "classBarInclude", publicName: "classBarInclude", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, defaultKeysSelected: { classPropertyName: "defaultKeysSelected", publicName: "defaultKeysSelected", isSignal: true, isRequired: false, transformFunction: null }, labelBarNoSelectItem: { classPropertyName: "labelBarNoSelectItem", publicName: "labelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, labelBarButtons: { classPropertyName: "labelBarButtons", publicName: "labelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarButtons: { classPropertyName: "classLabelBarButtons", publicName: "classLabelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, barButtons: { classPropertyName: "barButtons", publicName: "barButtons", isSignal: true, isRequired: false, transformFunction: null }, sortLocal: { classPropertyName: "sortLocal", publicName: "sortLocal", isSignal: true, isRequired: false, transformFunction: null }, filterOrSortLocal: { classPropertyName: "filterOrSortLocal", publicName: "filterOrSortLocal", isSignal: true, isRequired: false, transformFunction: null }, httpRequestData: { classPropertyName: "httpRequestData", publicName: "httpRequestData", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDataFooter: { classPropertyName: "httpRequestDataFooter", publicName: "httpRequestDataFooter", isSignal: true, isRequired: false, transformFunction: null }, newData: { classPropertyName: "newData", publicName: "newData", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBar: { classPropertyName: "ignoreBar", publicName: "ignoreBar", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarNoSelectItem: { classPropertyName: "classLabelBarNoSelectItem", publicName: "classLabelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassBgHeader: { classPropertyName: "ignoreClassBgHeader", publicName: "ignoreClassBgHeader", isSignal: true, isRequired: false, transformFunction: null }, noDataConfig: { classPropertyName: "noDataConfig", publicName: "noDataConfig", isSignal: true, isRequired: false, transformFunction: null }, showScrollTablePinnedIfNoData: { classPropertyName: "showScrollTablePinnedIfNoData", publicName: "showScrollTablePinnedIfNoData", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItemLast: { classPropertyName: "ignoreBorderItemLast", publicName: "ignoreBorderItemLast", isSignal: true, isRequired: false, transformFunction: null }, isHiddenHeaderWhenNodata: { classPropertyName: "isHiddenHeaderWhenNodata", publicName: "isHiddenHeaderWhenNodata", isSignal: true, isRequired: false, transformFunction: null }, maxItemSelected: { classPropertyName: "maxItemSelected", publicName: "maxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, configSelectMoreItem: { classPropertyName: "configSelectMoreItem", publicName: "configSelectMoreItem", isSignal: true, isRequired: false, transformFunction: null }, onlyShowNoResult: { classPropertyName: "onlyShowNoResult", publicName: "onlyShowNoResult", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItem: { classPropertyName: "ignoreBorderItem", publicName: "ignoreBorderItem", isSignal: true, isRequired: false, transformFunction: null }, activityLoadData: { classPropertyName: "activityLoadData", publicName: "activityLoadData", isSignal: true, isRequired: false, transformFunction: null }, paginationSetting: { classPropertyName: "paginationSetting", publicName: "paginationSetting", isSignal: true, isRequired: false, transformFunction: null }, templateNoData: { classPropertyName: "templateNoData", publicName: "templateNoData", isSignal: true, isRequired: false, transformFunction: null }, templateNoResult: { classPropertyName: "templateNoResult", publicName: "templateNoResult", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outLoadMore: "outLoadMore", outScrollIsGone: "outScrollIsGone", outLoading: "outLoading", outClickButtonAction: "outClickButtonAction", outSort: "outSort", outClickBarButton: "outClickBarButton", outHoverButtonAction: "outHoverButtonAction", outKeysSelected: "outKeysSelected", outFunctionsControl: "outFunctionsControl", outLoadDataComplete: "outLoadDataComplete", outTotalItem: "outTotalItem", outLoadDataError: "outLoadDataError" }, viewQueries: [{ propertyName: "headerElementRef", first: true, predicate: ["headerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerElementRef", first: true, predicate: ["footerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerLeftElementRef", first: true, predicate: ["footerLeftElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyElementRef", first: true, predicate: ["bodyElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyComponentRef", first: true, predicate: ["bodyComponentRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select=\"div.libs-ui-table-bar-left\"></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div\n class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]=\"labelBarNoSelectItem() | translate: { value: totalItemDisplay() }\"></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\n [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\n [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\n [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\n [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\n #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]=\"!ignoreBar()\"\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div\n class=\"relative w-full shrink-0\"\n [style.height.px]=\"headerElementRef.offsetHeight\">\n <div\n #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{ scrollbarWidth: 0 }\"\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 (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\"\n (mouseleave)=\"handlerMouseLeaveHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\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 </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 <div\n #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n @if (items().length) {\n <virtual-scroller\n #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\n #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]=\"\n data().specificHightLight || ($last && ignoreBorderItemLast())\n ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px'\n : ignoreBorderItem()\n ? ''\n : isDashBorder()\n ? 'libs-ui-border-bottom-dashed-general'\n : 'libs-ui-border-bottom-general'\n \"\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\n 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\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\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\n class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\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\n [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 } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-[calc(100%-10px)] w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n @if (showScrollTablePinnedIfNoData()) {\n <div\n class=\"absolute h-[1px] bg-transparent top-0 left-0 z-[1]\"\n [style.width.px]=\"headerElementRef.scrollWidth\"></div>\n }\n }\n </div>\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\n @if (activityLoadData() === 'click-pagination') {\n <div class=\"flex w-full mt-[12px]\">\n <libs_ui-components-pagination\n [modeDisplayTotalPageAndGotoPage]=\"paginationSetting()?.modeDisplayTotalPageAndGotoPage || 'bottom'\"\n [classDisplayTotalPageAndGotoPage]=\"paginationSetting()?.classDisplayTotalPageAndGotoPage || ''\"\n [classIncludeItem]=\"paginationSetting()?.classIncludeItem || ''\"\n [classIncludeContainer]=\"paginationSetting()?.classIncludeContainer || '!items-end'\"\n [disable]=\"paginationSetting()?.disable || loading() || !items().length\"\n [numberPageDispaly]=\"paginationSetting()?.numberPageDispaly || 5\"\n [showTotalPage]=\"paginationSetting()?.showTotalPage || false\"\n [showInputGotoPage]=\"paginationSetting()?.showInputGotoPage || false\"\n [totalItems]=\"pagingStore()?.total_items || (pagingStore()?.total_pages || 0) * (pagingStore()?.per_page || 0)\"\n [perPage]=\"pagingStore()?.per_page || 0\"\n [currentPage]=\"pagingStore()?.page || 0\"\n (outPageSelect)=\"handlerChangePage($event)\" />\n </div>\n }\n </div>\n</div>\n\n<ng-template\n #templateHeaderRef\n let-header=\"headerItem\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n [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]=\"\n (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef; context: { headerItem: header, isColRender: false, isHeaderLeft: isHeaderLeft }\" />\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, isHeaderLeft: isHeaderLeft }\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template\n #templateHeaderContentRef\n let-header=\"headerItem\"\n let-isColRender=\"isColRender\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n #itemHeaderRef\n 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]=\"\n isColRender\n ? (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n : {}\n \"\n [ngClass]=\"isColRender ? header.ngClass || {} : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div\n class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single\n [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 }}\"></div>\n }\n }\n @for (tooltip of header.tooltipsLeft; track tooltip) {\n <div class=\"mr-[4px]\">\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: tooltip.dataView || ' ' | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\n }\n \"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\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\n [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 @for (tooltip of header.tooltipsRight; track tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: tooltip.dataView || ' ' | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\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\n [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\n [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\n #templateBodyRef\n let-header=\"header\"\n let-data=\"data\">\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div\n 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\n [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\n LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe: getIndexRow | async\"></div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates\n [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\n #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)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div\n #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft(); track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : footerLeft() : footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\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\n class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : footerLeft() : footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (!keySearch() && templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n }\n @if (keySearch() && templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n }\n @if (!templateNoData() && !templateNoResult() && 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 @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"'no-data' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\"></div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"'no-result' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\"></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"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: VirtualScrollerModule }, { kind: "component", type: i2.VirtualScrollerComponent, selector: "virtual-scroller,[virtualScroller]", inputs: ["executeRefreshOutsideAngularZone", "enableUnequalChildrenSizes", "RTL", "useMarginInsteadOfTranslate", "modifyOverflowStyleOfParentScroll", "stripedTable", "scrollbarWidth", "scrollbarHeight", "childWidth", "childHeight", "ssrChildWidth", "ssrChildHeight", "ssrViewportWidth", "ssrViewportHeight", "bufferAmount", "scrollAnimationTime", "resizeBypassRefreshThreshold", "scrollThrottlingTime", "scrollDebounceTime", "checkResizeInterval", "items", "compareItems", "horizontal", "parentScroll"], outputs: ["vsUpdate", "vsChange", "vsStart", "vsEnd"], exportAs: ["virtualScroller"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiPipesConvertObjectToSignalPipe, name: "LibsUiPipesConvertObjectToSignalPipe" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsSortArrowComponent, selector: "libs_ui-components-buttons-sort-arrow", inputs: ["size", "mode", "fieldSort", "disable", "ignorePopoverContent", "popoverContentAsc", "popoverContentDesc", "defaultMode", "zIndex"], outputs: ["modeChange", "outChange"] }, { kind: "component", type: LibsUiComponentsPaginationComponent, selector: "libs_ui-components-pagination", inputs: ["showTotalPage", "showInputGotoPage", "modeDisplayTotalPageAndGotoPage", "classDisplayTotalPageAndGotoPage", "classIncludeContainer", "classIncludeItem", "disable", "numberPageDispaly", "totalItems", "perPage", "currentPage"], outputs: ["currentPageChange", "outPageSelect"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder", "dataComponentOutlet", "componentOutlet"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "pipe", type: LibsUiTableCalculatorColumnPipe, name: "LibsUiTableCalculatorColumnPipe" }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiIconsGetIconComponentPipe, name: "LibsUiIconsGetIconComponentPipe" }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesCheckSelectedByKeyPipe, name: "LibsUiPipesCheckSelectedByKeyPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
686
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsTableComponent, isStandalone: true, selector: "libs_ui-components-table", inputs: { timeHighlighNewItem: { classPropertyName: "timeHighlighNewItem", publicName: "timeHighlighNewItem", isSignal: true, isRequired: false, transformFunction: null }, headerLeft: { classPropertyName: "headerLeft", publicName: "headerLeft", isSignal: true, isRequired: false, transformFunction: null }, headerRight: { classPropertyName: "headerRight", publicName: "headerRight", isSignal: true, isRequired: false, transformFunction: null }, ignoreCalculatorWidthHeader: { classPropertyName: "ignoreCalculatorWidthHeader", publicName: "ignoreCalculatorWidthHeader", isSignal: true, isRequired: false, transformFunction: null }, configTemplateItemCollapseExpand: { classPropertyName: "configTemplateItemCollapseExpand", publicName: "configTemplateItemCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, showFooter: { classPropertyName: "showFooter", publicName: "showFooter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderFooter: { classPropertyName: "ignoreBorderFooter", publicName: "ignoreBorderFooter", isSignal: true, isRequired: false, transformFunction: null }, customPositionFooter: { classPropertyName: "customPositionFooter", publicName: "customPositionFooter", isSignal: true, isRequired: false, transformFunction: null }, footerLeft: { classPropertyName: "footerLeft", publicName: "footerLeft", isSignal: true, isRequired: false, transformFunction: null }, footerRight: { classPropertyName: "footerRight", publicName: "footerRight", isSignal: true, isRequired: false, transformFunction: null }, disableCheckbox: { classPropertyName: "disableCheckbox", publicName: "disableCheckbox", isSignal: true, isRequired: false, transformFunction: null }, enableUnequalChildrenSizes: { classPropertyName: "enableUnequalChildrenSizes", publicName: "enableUnequalChildrenSizes", isSignal: true, isRequired: false, transformFunction: null }, bufferAmount: { classPropertyName: "bufferAmount", publicName: "bufferAmount", isSignal: true, isRequired: false, transformFunction: null }, totalItem: { classPropertyName: "totalItem", publicName: "totalItem", isSignal: true, isRequired: false, transformFunction: null }, isDashBorder: { classPropertyName: "isDashBorder", publicName: "isDashBorder", isSignal: true, isRequired: false, transformFunction: null }, classHeaderContainerInclude: { classPropertyName: "classHeaderContainerInclude", publicName: "classHeaderContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classHeaderLeftInclude: { classPropertyName: "classHeaderLeftInclude", publicName: "classHeaderLeftInclude", isSignal: true, isRequired: false, transformFunction: null }, classBodyInclude: { classPropertyName: "classBodyInclude", publicName: "classBodyInclude", isSignal: true, isRequired: false, transformFunction: null }, classFooterInclude: { classPropertyName: "classFooterInclude", publicName: "classFooterInclude", isSignal: true, isRequired: false, transformFunction: null }, classTableContainerInclude: { classPropertyName: "classTableContainerInclude", publicName: "classTableContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classBarInclude: { classPropertyName: "classBarInclude", publicName: "classBarInclude", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, defaultKeysSelected: { classPropertyName: "defaultKeysSelected", publicName: "defaultKeysSelected", isSignal: true, isRequired: false, transformFunction: null }, labelBarNoSelectItem: { classPropertyName: "labelBarNoSelectItem", publicName: "labelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, labelBarButtons: { classPropertyName: "labelBarButtons", publicName: "labelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarButtons: { classPropertyName: "classLabelBarButtons", publicName: "classLabelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, barButtons: { classPropertyName: "barButtons", publicName: "barButtons", isSignal: true, isRequired: false, transformFunction: null }, sortLocal: { classPropertyName: "sortLocal", publicName: "sortLocal", isSignal: true, isRequired: false, transformFunction: null }, filterOrSortLocal: { classPropertyName: "filterOrSortLocal", publicName: "filterOrSortLocal", isSignal: true, isRequired: false, transformFunction: null }, httpRequestData: { classPropertyName: "httpRequestData", publicName: "httpRequestData", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDataFooter: { classPropertyName: "httpRequestDataFooter", publicName: "httpRequestDataFooter", isSignal: true, isRequired: false, transformFunction: null }, newData: { classPropertyName: "newData", publicName: "newData", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBar: { classPropertyName: "ignoreBar", publicName: "ignoreBar", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarNoSelectItem: { classPropertyName: "classLabelBarNoSelectItem", publicName: "classLabelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassBgHeader: { classPropertyName: "ignoreClassBgHeader", publicName: "ignoreClassBgHeader", isSignal: true, isRequired: false, transformFunction: null }, noDataConfig: { classPropertyName: "noDataConfig", publicName: "noDataConfig", isSignal: true, isRequired: false, transformFunction: null }, showScrollTablePinnedIfNoData: { classPropertyName: "showScrollTablePinnedIfNoData", publicName: "showScrollTablePinnedIfNoData", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItemLast: { classPropertyName: "ignoreBorderItemLast", publicName: "ignoreBorderItemLast", isSignal: true, isRequired: false, transformFunction: null }, isHiddenHeaderWhenNodata: { classPropertyName: "isHiddenHeaderWhenNodata", publicName: "isHiddenHeaderWhenNodata", isSignal: true, isRequired: false, transformFunction: null }, maxItemSelected: { classPropertyName: "maxItemSelected", publicName: "maxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, configSelectMoreItem: { classPropertyName: "configSelectMoreItem", publicName: "configSelectMoreItem", isSignal: true, isRequired: false, transformFunction: null }, onlyShowNoResult: { classPropertyName: "onlyShowNoResult", publicName: "onlyShowNoResult", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItem: { classPropertyName: "ignoreBorderItem", publicName: "ignoreBorderItem", isSignal: true, isRequired: false, transformFunction: null }, activityLoadData: { classPropertyName: "activityLoadData", publicName: "activityLoadData", isSignal: true, isRequired: false, transformFunction: null }, paginationSetting: { classPropertyName: "paginationSetting", publicName: "paginationSetting", isSignal: true, isRequired: false, transformFunction: null }, templateNoData: { classPropertyName: "templateNoData", publicName: "templateNoData", isSignal: true, isRequired: false, transformFunction: null }, templateNoResult: { classPropertyName: "templateNoResult", publicName: "templateNoResult", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outLoadMore: "outLoadMore", outScrollIsGone: "outScrollIsGone", outLoading: "outLoading", outClickButtonAction: "outClickButtonAction", outSort: "outSort", outClickBarButton: "outClickBarButton", outHoverButtonAction: "outHoverButtonAction", outKeysSelected: "outKeysSelected", outFunctionsControl: "outFunctionsControl", outLoadDataComplete: "outLoadDataComplete", outTotalItem: "outTotalItem", outLoadDataError: "outLoadDataError" }, viewQueries: [{ propertyName: "headerElementRef", first: true, predicate: ["headerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerElementRef", first: true, predicate: ["footerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerLeftElementRef", first: true, predicate: ["footerLeftElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyElementRef", first: true, predicate: ["bodyElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyComponentRef", first: true, predicate: ["bodyComponentRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select=\"div.libs-ui-table-bar-left\"></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div\n class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]=\"labelBarNoSelectItem() | translate: { value: totalItemDisplay() }\"></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\n [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\n [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\n [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 @let constHtmlLabel = button.label || ' ';\n <libs_ui-components-buttons-button\n [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"constHtmlLabel | 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\n #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]=\"!ignoreBar()\"\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div\n class=\"relative w-full shrink-0\"\n [style.height.px]=\"headerElementRef.offsetHeight\">\n <div\n #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{ scrollbarWidth: 0 }\"\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 (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\"\n (mouseleave)=\"handlerMouseLeaveHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\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 </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 <div\n #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n @if (items().length) {\n <virtual-scroller\n #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\n #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]=\"\n data().specificHightLight || ($last && ignoreBorderItemLast())\n ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px'\n : ignoreBorderItem()\n ? ''\n : isDashBorder()\n ? 'libs-ui-border-bottom-dashed-general'\n : 'libs-ui-border-bottom-general'\n \"\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\n 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\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\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\n class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\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\n [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 } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-[calc(100%-10px)] w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n @if (showScrollTablePinnedIfNoData()) {\n <div\n class=\"absolute h-[1px] bg-transparent top-0 left-0 z-[1]\"\n [style.width.px]=\"headerElementRef.scrollWidth\"></div>\n }\n }\n </div>\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\n @if (activityLoadData() === 'click-pagination') {\n <div class=\"flex w-full mt-[12px]\">\n <libs_ui-components-pagination\n [modeDisplayTotalPageAndGotoPage]=\"paginationSetting()?.modeDisplayTotalPageAndGotoPage || 'bottom'\"\n [classDisplayTotalPageAndGotoPage]=\"paginationSetting()?.classDisplayTotalPageAndGotoPage || ''\"\n [classIncludeItem]=\"paginationSetting()?.classIncludeItem || ''\"\n [classIncludeContainer]=\"paginationSetting()?.classIncludeContainer || '!items-end'\"\n [disable]=\"paginationSetting()?.disable || loading() || !items().length\"\n [numberPageDispaly]=\"paginationSetting()?.numberPageDispaly || 5\"\n [showTotalPage]=\"paginationSetting()?.showTotalPage || false\"\n [showInputGotoPage]=\"paginationSetting()?.showInputGotoPage || false\"\n [totalItems]=\"pagingStore()?.total_items || (pagingStore()?.total_pages || 0) * (pagingStore()?.per_page || 0)\"\n [perPage]=\"pagingStore()?.per_page || 0\"\n [currentPage]=\"pagingStore()?.page || 0\"\n (outPageSelect)=\"handlerChangePage($event)\" />\n </div>\n }\n </div>\n</div>\n\n<ng-template\n #templateHeaderRef\n let-header=\"headerItem\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n [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]=\"\n (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef; context: { headerItem: header, isColRender: false, isHeaderLeft: isHeaderLeft }\" />\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, isHeaderLeft: isHeaderLeft }\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template\n #templateHeaderContentRef\n let-header=\"headerItem\"\n let-isColRender=\"isColRender\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n #itemHeaderRef\n 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]=\"\n isColRender\n ? (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n : {}\n \"\n [ngClass]=\"isColRender ? header.ngClass || {} : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div\n class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single\n [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 }}\"></div>\n }\n }\n @for (tooltip of header.tooltipsLeft; track tooltip) {\n <div class=\"mr-[4px]\">\n @let constHtmlTooltip = tooltip.dataView || ' ';\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: constHtmlTooltip | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\n }\n \"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\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\n [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 @for (tooltip of header.tooltipsRight; track tooltip) {\n <div class=\"ml-[4px]\">\n @let constHtmlTooltip = tooltip.dataView || ' ';\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: constHtmlTooltip | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\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\n [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\n [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\n #templateBodyRef\n let-header=\"header\"\n let-data=\"data\">\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div\n 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\n [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\n LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe: getIndexRow | async\"></div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates\n [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\n #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)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div\n #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft(); track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : footerLeft() : footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\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\n class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : footerLeft() : footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (!keySearch() && templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n }\n @if (keySearch() && templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n }\n @if (!templateNoData() && !templateNoResult() && 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 @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"'no-data' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\"></div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"'no-result' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\"></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"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: VirtualScrollerModule }, { kind: "component", type: i2.VirtualScrollerComponent, selector: "virtual-scroller,[virtualScroller]", inputs: ["executeRefreshOutsideAngularZone", "enableUnequalChildrenSizes", "RTL", "useMarginInsteadOfTranslate", "modifyOverflowStyleOfParentScroll", "stripedTable", "scrollbarWidth", "scrollbarHeight", "childWidth", "childHeight", "ssrChildWidth", "ssrChildHeight", "ssrViewportWidth", "ssrViewportHeight", "bufferAmount", "scrollAnimationTime", "resizeBypassRefreshThreshold", "scrollThrottlingTime", "scrollDebounceTime", "checkResizeInterval", "items", "compareItems", "horizontal", "parentScroll"], outputs: ["vsUpdate", "vsChange", "vsStart", "vsEnd"], exportAs: ["virtualScroller"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiPipesConvertObjectToSignalPipe, name: "LibsUiPipesConvertObjectToSignalPipe" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsSortArrowComponent, selector: "libs_ui-components-buttons-sort-arrow", inputs: ["size", "mode", "fieldSort", "disable", "ignorePopoverContent", "popoverContentAsc", "popoverContentDesc", "defaultMode", "zIndex"], outputs: ["modeChange", "outChange"] }, { kind: "component", type: LibsUiComponentsPaginationComponent, selector: "libs_ui-components-pagination", inputs: ["showTotalPage", "showInputGotoPage", "modeDisplayTotalPageAndGotoPage", "classDisplayTotalPageAndGotoPage", "classIncludeContainer", "classIncludeItem", "disable", "numberPageDispaly", "totalItems", "perPage", "currentPage"], outputs: ["currentPageChange", "outPageSelect"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder", "dataComponentOutlet", "componentOutlet"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "pipe", type: LibsUiTableCalculatorColumnPipe, name: "LibsUiTableCalculatorColumnPipe" }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiIconsGetIconComponentPipe, name: "LibsUiIconsGetIconComponentPipe" }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesCheckSelectedByKeyPipe, name: "LibsUiPipesCheckSelectedByKeyPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
687
687
  }
688
688
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTableComponent, decorators: [{
689
689
  type: Component,
@@ -709,6 +709,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
709
709
  LibsUiIconsGetIconComponentPipe,
710
710
  LibsUiPipesCallFunctionInTemplatePipe,
711
711
  LibsUiPipesCheckSelectedByKeyPipe,
712
- ], template: "<div class=\"flex flex-col w-full h-full\">\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select=\"div.libs-ui-table-bar-left\"></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div\n class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]=\"labelBarNoSelectItem() | translate: { value: totalItemDisplay() }\"></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\n [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\n [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\n [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\n [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\n #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]=\"!ignoreBar()\"\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div\n class=\"relative w-full shrink-0\"\n [style.height.px]=\"headerElementRef.offsetHeight\">\n <div\n #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{ scrollbarWidth: 0 }\"\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 (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\"\n (mouseleave)=\"handlerMouseLeaveHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\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 </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 <div\n #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n @if (items().length) {\n <virtual-scroller\n #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\n #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]=\"\n data().specificHightLight || ($last && ignoreBorderItemLast())\n ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px'\n : ignoreBorderItem()\n ? ''\n : isDashBorder()\n ? 'libs-ui-border-bottom-dashed-general'\n : 'libs-ui-border-bottom-general'\n \"\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\n 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\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\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\n class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\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\n [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 } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-[calc(100%-10px)] w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n @if (showScrollTablePinnedIfNoData()) {\n <div\n class=\"absolute h-[1px] bg-transparent top-0 left-0 z-[1]\"\n [style.width.px]=\"headerElementRef.scrollWidth\"></div>\n }\n }\n </div>\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\n @if (activityLoadData() === 'click-pagination') {\n <div class=\"flex w-full mt-[12px]\">\n <libs_ui-components-pagination\n [modeDisplayTotalPageAndGotoPage]=\"paginationSetting()?.modeDisplayTotalPageAndGotoPage || 'bottom'\"\n [classDisplayTotalPageAndGotoPage]=\"paginationSetting()?.classDisplayTotalPageAndGotoPage || ''\"\n [classIncludeItem]=\"paginationSetting()?.classIncludeItem || ''\"\n [classIncludeContainer]=\"paginationSetting()?.classIncludeContainer || '!items-end'\"\n [disable]=\"paginationSetting()?.disable || loading() || !items().length\"\n [numberPageDispaly]=\"paginationSetting()?.numberPageDispaly || 5\"\n [showTotalPage]=\"paginationSetting()?.showTotalPage || false\"\n [showInputGotoPage]=\"paginationSetting()?.showInputGotoPage || false\"\n [totalItems]=\"pagingStore()?.total_items || (pagingStore()?.total_pages || 0) * (pagingStore()?.per_page || 0)\"\n [perPage]=\"pagingStore()?.per_page || 0\"\n [currentPage]=\"pagingStore()?.page || 0\"\n (outPageSelect)=\"handlerChangePage($event)\" />\n </div>\n }\n </div>\n</div>\n\n<ng-template\n #templateHeaderRef\n let-header=\"headerItem\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n [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]=\"\n (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef; context: { headerItem: header, isColRender: false, isHeaderLeft: isHeaderLeft }\" />\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, isHeaderLeft: isHeaderLeft }\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template\n #templateHeaderContentRef\n let-header=\"headerItem\"\n let-isColRender=\"isColRender\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n #itemHeaderRef\n 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]=\"\n isColRender\n ? (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n : {}\n \"\n [ngClass]=\"isColRender ? header.ngClass || {} : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div\n class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single\n [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 }}\"></div>\n }\n }\n @for (tooltip of header.tooltipsLeft; track tooltip) {\n <div class=\"mr-[4px]\">\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: tooltip.dataView || ' ' | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\n }\n \"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\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\n [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 @for (tooltip of header.tooltipsRight; track tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: tooltip.dataView || ' ' | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\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\n [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\n [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\n #templateBodyRef\n let-header=\"header\"\n let-data=\"data\">\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div\n 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\n [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\n LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe: getIndexRow | async\"></div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates\n [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\n #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)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div\n #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft(); track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : footerLeft() : footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\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\n class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : footerLeft() : footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (!keySearch() && templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n }\n @if (keySearch() && templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n }\n @if (!templateNoData() && !templateNoResult() && 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 @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"'no-data' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\"></div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"'no-result' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\"></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"] }]
712
+ ], template: "<div class=\"flex flex-col w-full h-full\">\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select=\"div.libs-ui-table-bar-left\"></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div\n class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]=\"labelBarNoSelectItem() | translate: { value: totalItemDisplay() }\"></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\n [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\n [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\n [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 @let constHtmlLabel = button.label || ' ';\n <libs_ui-components-buttons-button\n [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"constHtmlLabel | 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\n #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]=\"!ignoreBar()\"\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div\n class=\"relative w-full shrink-0\"\n [style.height.px]=\"headerElementRef.offsetHeight\">\n <div\n #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{ scrollbarWidth: 0 }\"\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 (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\"\n (mouseleave)=\"handlerMouseLeaveHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\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 </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 <div\n #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n @if (items().length) {\n <virtual-scroller\n #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\n #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]=\"\n data().specificHightLight || ($last && ignoreBorderItemLast())\n ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px'\n : ignoreBorderItem()\n ? ''\n : isDashBorder()\n ? 'libs-ui-border-bottom-dashed-general'\n : 'libs-ui-border-bottom-general'\n \"\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\n 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\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\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\n class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\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\n [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 } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-[calc(100%-10px)] w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n @if (showScrollTablePinnedIfNoData()) {\n <div\n class=\"absolute h-[1px] bg-transparent top-0 left-0 z-[1]\"\n [style.width.px]=\"headerElementRef.scrollWidth\"></div>\n }\n }\n </div>\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\n @if (activityLoadData() === 'click-pagination') {\n <div class=\"flex w-full mt-[12px]\">\n <libs_ui-components-pagination\n [modeDisplayTotalPageAndGotoPage]=\"paginationSetting()?.modeDisplayTotalPageAndGotoPage || 'bottom'\"\n [classDisplayTotalPageAndGotoPage]=\"paginationSetting()?.classDisplayTotalPageAndGotoPage || ''\"\n [classIncludeItem]=\"paginationSetting()?.classIncludeItem || ''\"\n [classIncludeContainer]=\"paginationSetting()?.classIncludeContainer || '!items-end'\"\n [disable]=\"paginationSetting()?.disable || loading() || !items().length\"\n [numberPageDispaly]=\"paginationSetting()?.numberPageDispaly || 5\"\n [showTotalPage]=\"paginationSetting()?.showTotalPage || false\"\n [showInputGotoPage]=\"paginationSetting()?.showInputGotoPage || false\"\n [totalItems]=\"pagingStore()?.total_items || (pagingStore()?.total_pages || 0) * (pagingStore()?.per_page || 0)\"\n [perPage]=\"pagingStore()?.per_page || 0\"\n [currentPage]=\"pagingStore()?.page || 0\"\n (outPageSelect)=\"handlerChangePage($event)\" />\n </div>\n }\n </div>\n</div>\n\n<ng-template\n #templateHeaderRef\n let-header=\"headerItem\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n [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]=\"\n (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef; context: { headerItem: header, isColRender: false, isHeaderLeft: isHeaderLeft }\" />\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, isHeaderLeft: isHeaderLeft }\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template\n #templateHeaderContentRef\n let-header=\"headerItem\"\n let-isColRender=\"isColRender\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n #itemHeaderRef\n 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]=\"\n isColRender\n ? (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shirk': '0', padding: '8px' } : {})\n : {}\n \"\n [ngClass]=\"isColRender ? header.ngClass || {} : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div\n class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single\n [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 }}\"></div>\n }\n }\n @for (tooltip of header.tooltipsLeft; track tooltip) {\n <div class=\"mr-[4px]\">\n @let constHtmlTooltip = tooltip.dataView || ' ';\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: constHtmlTooltip | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\n }\n \"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\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\n [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 @for (tooltip of header.tooltipsRight; track tooltip) {\n <div class=\"ml-[4px]\">\n @let constHtmlTooltip = tooltip.dataView || ' ';\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: constHtmlTooltip | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\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\n [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\n [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\n #templateBodyRef\n let-header=\"header\"\n let-data=\"data\">\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div\n 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\n [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\n LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe: getIndexRow | async\"></div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates\n [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\n #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)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div\n #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft(); track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : footerLeft() : footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\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\n class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : footerLeft() : footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (!keySearch() && templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n }\n @if (keySearch() && templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n }\n @if (!templateNoData() && !templateNoResult() && 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 @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"'no-data' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\"></div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"'no-result' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\"></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"] }]
713
713
  }], ctorParameters: () => [] });
714
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3hOLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBNEIscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRyxPQUFPLEVBQVcsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRyxPQUFPLEVBQVMseUNBQXlDLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRyxPQUFPLEVBQWtCLHVDQUF1QyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUcsT0FBTyxFQUFpRCxpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWhJLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRyxPQUFPLEVB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R3hCLDhCQUE4QjtrQkEvQjFDLFNBQVM7K0JBRUUsMEJBQTBCLGNBR3hCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDUCxPQUFPO3dCQUNQLE9BQU87d0JBQ1AsU0FBUzt3QkFDVCxnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsdUNBQXVDO3dCQUN2QyxlQUFlO3dCQUNmLHFCQUFxQjt3QkFDckIsc0NBQXNDO3dCQUN0QyxvQ0FBb0M7d0JBQ3BDLGlDQUFpQzt3QkFDakMseUNBQXlDO3dCQUN6QyxtQ0FBbUM7d0JBQ25DLHVDQUF1Qzt3QkFDdkMsK0JBQStCO3dCQUMvQixnQ0FBZ0M7d0JBQ2hDLGdDQUFnQzt3QkFDaEMsc0NBQXNDO3dCQUN0QywrQkFBK0I7d0JBQy9CLHFDQUFxQzt3QkFDckMsaUNBQWlDO3FCQUNsQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcywgTmdDb21wb25lbnRPdXRsZXQsIE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBjb21wdXRlZCwgRGVzdHJveVJlZiwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbGVyQ29tcG9uZW50LCBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUgfSBmcm9tICdAaWhhcmJlY2svbmd4LXZpcnR1YWwtc2Nyb2xsZXInO1xuaW1wb3J0IHsgSUJ1dHRvbiwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElTb3J0LCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1NvcnRBcnJvd0NvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1zb3J0JztcbmltcG9ydCB7IElDaGVja2JveEl0ZW0gfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LWdyb3VwJztcbmltcG9ydCB7IElDaGVja2JveEV2ZW50LCBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZSc7XG5pbXBvcnQgeyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wYWdpbmF0aW9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBUWVBFX1BPUE9WRVJfRVZFTlQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zcGlubmVyJztcbmltcG9ydCB7IExpYnNVaUljb25zR2V0SWNvbkNvbXBvbmVudFBpcGUgfSBmcm9tICdAbGlicy11aS9pY29ucyc7XG5pbXBvcnQgeyBJSHR0cFJlc3BvbnNlRXJyb3IsIElQYWdpbmcsIFRZUEVfT0JKRUNULCBUWVBFX1RFTVBMQVRFX1JFRiB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNhbGwtZnVuY3Rpb24taW4tdGVtcGxhdGUnO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2hlY2stc2VsZWN0ZWQtYnkta2V5JztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNvbnZlcnQtb2JqZWN0LXRvLXNpZ25hbCc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcsIExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSwgcmV0dXJuTGlzdE9iamVjdCB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWh0dHAtcmVxdWVzdCc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGNvbnZlcnRPYmplY3RUb1NpZ25hbCwgZGVsZXRlVW5pY29kZSwgZ2V0LCBzZXQsIHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZSB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBsYXN0VmFsdWVGcm9tLCBvZiwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIElCdXR0b25CYXJFdmVudCxcbiAgSUNvbmZpZ1NlbGVjdE1vcmVJdGVtLFxuICBJQ29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQsXG4gIElIb3ZlckJ1dHRvbkFjdGlvbkV2ZW50LFxuICBJTG9hZE1vcmVFdmVudCxcbiAgSVNvcnRFdmVudCxcbiAgSVRhYmVsQnV0dG9uQWN0aW9uRXZlbnQsXG4gIElUYWJsZUZvb3RlckNvbmZpZyxcbiAgSVRhYmxlSGVhZGVyQ29uZmlnLFxuICBUWVBFX0RBVEFfRklMVEVSX1RBQkxFLFxuICBUWVBFX0RBVEFfVEFCTEUsXG4gIFRZUEVfSVRFTV9EQVRBX1RBQkxFLFxuICBUWVBFX05FV19EQVRBX1RBQkxFLFxuICBUWVBFX1RBQkxFX0ZJTFRFUixcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Z1bmN0aW9uLWNvbnRyb2wtZXZlbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElUYWJsZU5vRGF0YUNvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9uby1kYXRhLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZSB9IGZyb20gJy4vcGlwZXMvY2FsY3VsYXRvci1jb2x1bW4ucGlwZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzVGFibGVUZW1wbGF0ZXNDb21wb25lbnQgfSBmcm9tICcuL3RlbXBsYXRlcy90ZW1wbGF0ZXMuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBOZ0NsYXNzLFxuICAgIE5nU3R5bGUsXG4gICAgQXN5bmNQaXBlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgTmdDb21wb25lbnRPdXRsZXQsXG4gICAgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1NvcnRBcnJvd0NvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUGFnaW5hdGlvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnQsXG4gICAgTGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSxcbiAgICBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlLFxuICAgIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsXG4gICAgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgY2xhc3NIZWFkZXJDb250YWluZXIgPSBjb21wdXRlZCgoKSA9PiBgbGlicy11aS10YWJsZS1oZWFkZXItY29udGFpbmVyIHctZnVsbCBhYnNvbHV0ZSBmbGV4IHNocmluay0wICR7dGhpcy5pZ25vcmVDbGFzc0JnSGVhZGVyKCkgPyAnJyA6ICdiZy13aGl0ZSd9IG92ZXJmbG93LXgtaGlkZGVuIHotWzFdIGl0ZW1zLWNlbnRlciAke3RoaXMuY2xhc3NIZWFkZXJDb250YWluZXJJbmNsdWRlKCkgfHwgJyd9YCk7XG4gIHByb3RlY3RlZCBjbGFzc0hlYWRlckxlZnRDb250YWluZXIgPSBjb21wdXRlZCgoKSA9PiBgaC1mdWxsIGZsZXggc3RpY2t5IHRvcC0wIGxlZnQtMCB6LVsxXSAke3RoaXMuaWdub3JlQ2xhc3NCZ0hlYWRlcigpID8gJycgOiAnYmctd2hpdGUnfSAke3RoaXMuY2xhc3NIZWFkZXJMZWZ0SW5jbHVkZSgpIHx8ICcnfWApO1xuXG4gIHByb3RlY3RlZCBrZXlzU2VsZWN0ZWQgPSBzaWduYWw8QXJyYXk8YW55Pj4oW10pO1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBzdG9yZXMgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4oW10pO1xuICBwcm90ZWN0ZWQgaXRlbXMgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4oW10pO1xuICBwcm90ZWN0ZWQgaXRlbUZvb3RlciA9IHNpZ25hbDxUWVBFX09CSkVDVCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGl0ZW1PZkluZGV4SG92ZXI/OiBUWVBFX0lURU1fREFUQV9UQUJMRTtcbiAgcHJvdGVjdGVkIGtleVNlYXJjaCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbUluQmFja2VuZCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgaGFzSXRlbUhpZ2h0TGlnaHQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgdG90YWxJdGVtRGlzcGxheSA9IGNvbXB1dGVkKCgpID0+IHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZSh0aGlzLnRvdGFsSXRlbSgpID8/IHRoaXMudG90YWxJdGVtSW5CYWNrZW5kKCksIGZhbHNlKSk7XG4gIHByb3RlY3RlZCBsaXN0Q29uZmlnTW9yZUl0ZW0gPSBjb21wdXRlZDxJTGlzdENvbmZpZ0l0ZW0+KCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgY29uZmlnVGVtcGxhdGVUZXh0OiBzaWduYWwoe1xuICAgICAgICBmaWVsZEtleTogJ2tleScsXG4gICAgICAgIGlnbm9yZUljb25TZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgZ2V0VmFsdWU6IHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8uZ2V0VmFsdWUsXG4gICAgICAgIGNvbmZpZ0xhYmVsUG9wb3Zlcjogc2lnbmFsKHtcbiAgICAgICAgICB6SW5kZXg6IDEyMDAsXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgICBodHRwUmVxdWVzdERhdGE6IHNpZ25hbCh7XG4gICAgICAgIG9iamVjdEluc3RhbmNlOiByZXR1cm5MaXN0T2JqZWN0KHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8ubGlzdE9wdGlvbiksXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ2xpc3QnLFxuICAgICAgICBhcmd1bWVudHNWYWx1ZTogW10sXG4gICAgICB9KSxcbiAgICB9O1xuICB9KTtcblxuICBwcml2YXRlIGhhc1Njcm9sbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaW5zdGFuY2VTb3J0ID0gc2lnbmFsPElTb3J0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBwYWdpbmdTdG9yZSA9IHNpZ25hbDxJUGFnaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGxvYWRlZExhc3RJdGVtID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzdG9yZVBhcmFtc0NhbGxBcGkgPSBzaWduYWw8VFlQRV9PQkpFQ1Q+KHt9KTtcbiAgcHJpdmF0ZSB0aW1lb3V0TGVhdmVJdGVtID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbT86IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50O1xuICBwcml2YXRlIG1vdXNlRW50ZXJIZWFkZXIgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKiBJTlBVVCAqL1xuICByZWFkb25seSB0aW1lSGlnaGxpZ2hOZXdJdGVtID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDIwMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMjAwMCB9KTtcbiAgcmVhZG9ubHkgaGVhZGVyTGVmdCA9IGlucHV0PEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4sIEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4gfCB1bmRlZmluZWQ+KFtdLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IFtdIH0pO1xuICByZWFkb25seSBoZWFkZXJSaWdodCA9IGlucHV0PEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4sIEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4gfCB1bmRlZmluZWQ+KFtdLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IFtdIH0pO1xuICByZWFkb25seSBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIgPSBpbnB1dDx7XG4gICAgaGVhZGVyTGVmdD86IGJvb2xlYW47XG4gICAgaGVhZGVyUmlnaHQ/OiBib29sZWFuO1xuICB9PigpO1xuICByZWFkb25seSBjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCA9IGlucHV0PElDb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZD4oKTtcbiAgcmVhZG9ubHkgc2hvd0Zvb3RlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckZvb3RlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGN1c3RvbVBvc2l0aW9uRm9vdGVyID0gaW5wdXQ8J3RvcCcgfCAnYm90dG9tJywgJ3RvcCcgfCAnYm90dG9tJyB8IHVuZGVmaW5lZD4oJ2JvdHRvbScsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ2JvdHRvbScgfSk7XG4gIHJlYWRvbmx5IGZvb3RlckxlZnQgPSBpbnB1dDxBcnJheTxJVGFibGVGb290ZXJDb25maWc+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBmb290ZXJSaWdodCA9IGlucHV0PEFycmF5PElUYWJsZUZvb3RlckNvbmZpZz4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGVDaGVja2JveCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcyA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBidWZmZXJBbW91bnQgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oNSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+ICh2YWwgPyAodmFsID4gMjUgPyAyNSA6IHZhbCkgOiA1KSB9KTtcbiAgcmVhZG9ubHkgdG90YWxJdGVtID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBpc0Rhc2hCb3JkZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0hlYWRlckNvbnRhaW5lckluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSGVhZGVyTGVmdEluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGNsYXNzQm9keUluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzRm9vdGVySW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NUYWJsZUNvbnRhaW5lckluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzQmFySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oJ2p1c3RpZnktYmV0d2VlbiBtYi1bMTZweF0nKTtcblxuICByZWFkb25seSBmaWVsZEtleSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaWQnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsIHx8ICdpZCcgfSk7IC8vIHTDqm4gZmllbGQgxJHhu4tuaCBkYW5oIGl0ZW0gY+G7p2EgbGlzdERhdGFzXG4gIHJlYWRvbmx5IGRlZmF1bHRLZXlzU2VsZWN0ZWQgPSBpbnB1dDxBcnJheTxhbnk+PigpO1xuICByZWFkb25seSBsYWJlbEJhck5vU2VsZWN0SXRlbSA9IGlucHV0PHN0cmluZz4oYGkxOG5fdG90YWxfcXVhbnRpdHlgKTsgLy8gc+G7rSBk4bulbmcgxJHhu4MgaGnDqm4gdGjhu4sga2hpIHTDrWNoIGNo4buNbiBpdGVtXG4gIHJlYWRvbmx5IGxhYmVsQmFyQnV0dG9ucyA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaTE4bl9udW1iZXJfaXRlbV9zZWxlY3RlZCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgfHwgJ2kxOG5fbnVtYmVyX2l0ZW1fc2VsZWN0ZWQnIH0pOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgY2xhc3NMYWJlbEJhckJ1dHRvbnMgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJycgfSk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBiYXJCdXR0b25zID0gaW5wdXQ8QXJyYXk8SUJ1dHRvbj4+KCk7XG4gIHJlYWRvbmx5IHNvcnRMb2NhbCA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIHRyxrDhu51uZyBo4bujcCBu4bq/dSBzb3J0TG9jYWwgbsOgeSBraMO0bmcgxJHDoXAg4bupbmcgxJHGsOG7o2MgbmdoaeG7h3AgduG7pSB0aMOsIG3hu5tpIGPDom4gbmjhuq9jIHPhu60gZOG7pW5nIGZpbHRlckxvY2FsXG4gIHJlYWRvbmx5IGZpbHRlck9yU29ydExvY2FsID0gaW5wdXQ8VFlQRV9UQUJMRV9GSUxURVI+KCk7XG4gIHJlYWRvbmx5IGh0dHBSZXF1ZXN0RGF0YSA9IGlucHV0PElIdHRwUmVxdWVzdENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgaHR0cFJlcXVlc3REYXRhRm9vdGVyID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBuZXdEYXRhID0gaW5wdXQ8VFlQRV9ORVdfREFUQV9UQUJMRT4oKTtcbiAgcmVhZG9ubHkgZmlsdGVyID0gaW5wdXQ8VFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSwgVFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSB8IHVuZGVmaW5lZD4oeyBmaWx0ZXJEYXRhOiB7fSB9LCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IHsgZmlsdGVyRGF0YToge30gfSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQmFyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NMYWJlbEJhck5vU2VsZWN0SXRlbSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQ2xhc3NCZ0hlYWRlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG5vRGF0YUNvbmZpZyA9IGlucHV0PElUYWJsZU5vRGF0YUNvbmZpZz4oeyB0ZXh0Tm9EYXRhOiAnaTE4bl9ub19kYXRhX3lldCcsIHRleHRTZWFyY2hOb0RhdGE6ICdpMThuX25vX3Jlc3VsdCcgfSk7XG4gIHJlYWRvbmx5IHNob3dTY3JvbGxUYWJsZVBpbm5lZElmTm9EYXRhID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQm9yZGVySXRlbUxhc3QgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBtYXhJdGVtU2VsZWN0ZWQgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMTAwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDEwMCB9KTtcbiAgcmVhZG9ubHkgY29uZmlnU2VsZWN0TW9yZUl0ZW0gPSBpbnB1dDxJQ29uZmlnU2VsZWN0TW9yZUl0ZW0+KCk7XG4gIHJlYWRvbmx5IG9ubHlTaG93Tm9SZXN1bHQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYWN0aXZpdHlMb2FkRGF0YSA9IGlucHV0PCdzY3JvbGwtaW5maW5pdHknIHwgJ2NsaWNrLXBhZ2luYXRpb24nLCAnc2Nyb2xsLWluZmluaXR5JyB8ICdjbGljay1wYWdpbmF0aW9uJyB8IHVuZGVmaW5lZD4oJ3Njcm9sbC1pbmZpbml0eScsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ3Njcm9sbC1pbmZpbml0eScgfSk7XG4gIHJlYWRvbmx5IHBhZ2luYXRpb25TZXR0aW5nID0gaW5wdXQ8e1xuICAgIHBvc2l0aW9uPzogJ3RvcCcgfCAnYm90dG9tJztcbiAgICBjbGFzc0luY2x1ZGVDb250YWluZXI/OiBzdHJpbmc7XG4gICAgY2xhc3NJbmNsdWRlSXRlbT86IHN0cmluZztcbiAgICBkaXNhYmxlPzogYm9vbGVhbjtcbiAgICBudW1iZXJQYWdlRGlzcGFseT86IG51bWJlcjtcbiAgICBzaG93VG90YWxQYWdlPzogYm9vbGVhbjtcbiAgICBzaG93SW5wdXRHb3RvUGFnZT86IGJvb2xlYW47XG4gICAgbW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZT86ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnO1xuICAgIGNsYXNzRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlPzogc3RyaW5nO1xuICB9PigpO1xuICByZWFkb25seSB0ZW1wbGF0ZU5vRGF0YSA9IGlucHV0PFRZUEVfVEVNUExBVEVfUkVGPigpO1xuICByZWFkb25seSB0ZW1wbGF0ZU5vUmVzdWx0ID0gaW5wdXQ8VFlQRV9URU1QTEFURV9SRUY+KCk7XG5cbiAgLyoqIE9VVFBVVCAqL1xuXG4gIHJlYWRvbmx5IG91dExvYWRNb3JlID0gb3V0cHV0PElMb2FkTW9yZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxJc0dvbmUgPSBvdXRwdXQ8SUxvYWRNb3JlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExvYWRpbmcgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCdXR0b25BY3Rpb24gPSBvdXRwdXQ8SVRhYmVsQnV0dG9uQWN0aW9uRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFNvcnQgPSBvdXRwdXQ8SVNvcnRFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCYXJCdXR0b24gPSBvdXRwdXQ8SUJ1dHRvbkJhckV2ZW50PigpO1xuICByZWFkb25seSBvdXRIb3ZlckJ1dHRvbkFjdGlvbiA9IG91dHB1dDxJSG92ZXJCdXR0b25BY3Rpb25FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0S2V5c1NlbGVjdGVkID0gb3V0cHV0PHsga2V5czogQXJyYXk8YW55PiB9PigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRMb2FkRGF0YUNvbXBsZXRlID0gb3V0cHV0PFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+Pj4oKTtcbiAgcmVhZG9ubHkgb3V0VG90YWxJdGVtID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZERhdGFFcnJvciA9IG91dHB1dDxJSHR0cFJlc3BvbnNlRXJyb3I+KCk7XG5cbiAgLyoqVklFVyBDSElMRCAqL1xuICBwcm90ZWN0ZWQgaGVhZGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignaGVhZGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZm9vdGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyTGVmdEVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2Zvb3RlckxlZnRFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2JvZHlFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUNvbXBvbmVudFJlZiA9IHZpZXdDaGlsZDxWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ+KCdib2R5Q29tcG9uZW50UmVmJyk7XG5cbiAgLyoqSU5KRUNUICovXG4gIHByaXZhdGUgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0S2V5c1NlbGVjdGVkKCk/Lmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5rZXlzU2VsZWN0ZWQudXBkYXRlKChrZXlzKSA9PiBbLi4ua2V5cywgLi4uKHRoaXMuZGVmYXVsdEtleXNTZWxlY3RlZCgpIHx8IFtdKV0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2hvd0Zvb3RlcigpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmV3RGF0YSgpPy5kYXRhKCkubGVuZ3RoKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmFkZEl0ZW1zKHRoaXMubmV3RGF0YSgpPy5kYXRhIGFzIGFueSwgIXRoaXMubmV3RGF0YSgpPy5hZGRUb0xhc3RMaXN0KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEgfHwgdGhpcy5maWx0ZXIoKS5pZ25vcmVDYWxsQXBpQXV0bykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtleVNlYXJjaC5zZXQoZ2V0KHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSwgJ2tleVNlYXJjaCcsICcnKSk7XG4gICAgICAgIHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpLnNldChjbG9uZURlZXAodGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhKSk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcigpPy5maWx0ZXJEYXRhICYmICF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGFbJ2luc3RhbmNlU29ydCddICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSAmJiB0aGlzLnN0b3JlcygpLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKT8uKHNpZ25hbChbLi4udGhpcy5zdG9yZXMoKV0pLCB7IC4uLih0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEgfHwge30pLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkgfHwgW10pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG5cbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzZXQ6IHRoaXMucmVzZXQuYmluZCh0aGlzKSxcbiAgICAgIGNhbGxBcGlCeVNlcnZpY2U6IHRoaXMuY2FsbEFwaUJ5U2VydmljZS5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRTY3JvbGw6IHRoaXMucmVzZXRTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgIGFkZEl0ZW1zOiB0aGlzLmFkZEl0ZW1zLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVJdGVtczogdGhpcy5yZW1vdmVJdGVtcy5iaW5kKHRoaXMpLFxuICAgICAgZ2V0Q291bnQ6IHRoaXMuZ2V0Q291bnQuYmluZCh0aGlzKSxcbiAgICAgIGdldFNjcm9sbENvbnRhaW5lcjogdGhpcy5nZXRTY3JvbGxDb250YWluZXIuYmluZCh0aGlzKSxcbiAgICAgIGhpZGVUb29sQmFyQm90dG9tOiAoKSA9PiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0sXG4gICAgICByZXNldEtleVNlbGVjdGVkOiAoKSA9PiB0aGlzLmtleXNTZWxlY3RlZC5zZXQoW10pLFxuICAgICAgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SW5kZXhSb3cgPSAoZGF0YTogeyB2YWx1ZTogVFlQRV9JVEVNX0RBVEFfVEFCTEUgfSkgPT4ge1xuICAgIHJldHVybiBvZih0aGlzLml0ZW1zKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBkYXRhLnZhbHVlKSArIDEpO1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmJvZHlDb21wb25lbnRSZWYoKSBhcyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGxBcGlCeVNlcnZpY2UoZmlyc3RDYWxsOiBib29sZWFuLCByZXNldEFmdGVyQ2FsbEFwaT86IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaHR0cFJlcXVlc3REYXRhKCkgfHwgdGhpcy5sb2FkaW5nKCkgfHwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuICAgICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlckJ5ICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyQnkgPSB7XG4gICAgICAgICAgZmllbGRHZXRWYWx1ZTogJ3N0b3JlUGFyYW1zQ2FsbEFwaS5pbnN0YW5jZVNvcnQuZmllbGRTb3J0JyxcbiAgICAgICAgICBmaWVsZFVwZGF0ZTogJ1swXScsXG4gICAgICAgICAgc3ViRmllbGRVcGRhdGU6ICdvcmRlcl9ieScsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSAmJiAhZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyVHlwZSAmJiB0aGlzLmluc3RhbmNlU29ydCgpKSB7XG4gICAgICAgIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlclR5cGUgPSB7XG4gICAgICAgICAgZmllbGRHZXRWYWx1ZTogJ3N0b3JlUGFyYW1zQ2FsbEFwaS5pbnN0YW5jZVNvcnQubW9kZScsXG4gICAgICAgICAgZmllbGRVcGRhdGU6ICdbMF0nLFxuICAgICAgICAgIHN1YkZpZWxkVXBkYXRlOiAnb3JkZXJfdHlwZScsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZmlyc3RDYWxsKSB7XG4gICAgICAgIGlmICghcmVzZXRBZnRlckNhbGxBcGkpIHtcbiAgICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KFxuICAgICAgICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi50aGlzLmZha2VSZXNwb25zZUFwaSgpLCBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpIHx8IHt9LCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCB0aGlzLmxvYWRlZExhc3RJdGVtKCksIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICAgIGlmIChmaXJzdENhbGwgJiYgcmVzZXRBZnRlckNhbGxBcGkpIHtcbiAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zdG9yZXMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgfVxuICAgICAgdGhpcy5wYWdpbmdTdG9yZS5zZXQocmVzdWx0LnBhZ2luZyk7XG4gICAgICB0aGlzLnRvdGFsSXRlbUluQmFja2VuZC5zZXQocmVzdWx0LnBhZ2luZz8udG90YWxfaXRlbXMgfHwgMCk7XG4gICAgICB0aGlzLm91dFRvdGFsSXRlbS5lbWl0KHRoaXMudG90YWxJdGVtSW5CYWNrZW5kKCkpO1xuICAgICAgaWYgKCF0aGlzLnBhZ2luZ1N0b3JlKCkpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChcbiAgICAgICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IC4uLnJlc3VsdCwgc3RvcmVQYXJhbXNDYWxsQXBpOiB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpIH0sIHRoaXMucGFnaW5nU3RvcmUoKSB8fCB7fSwgdGhpcy5rZXlTZWFyY2goKSwgdHJ1ZSwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSlcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmFkZEl0ZW1zKGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSB8fCBbXSksIGZhbHNlLCB0cnVlKTtcbiAgICAgIHRoaXMub3V0TG9hZERhdGFDb21wbGV0ZS5lbWl0KHRoaXMuc3RvcmVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgdGhpcy5vdXRMb2FkRGF0YUVycm9yLmVtaXQoZXJyb3IgYXMgSUh0dHBSZXNwb25zZUVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZha2VSZXNwb25zZUFwaSgpOiBUWVBFX09CSkVDVCB7XG4gICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQoZmFsc2UpO1xuICAgIGlmICh0aGlzLmFjdGl2aXR5TG9hZERhdGEoKSA9PT0gJ3Njcm9sbC1pbmZpbml0eScpIHtcbiAgICAgIHRoaXMucGFnaW5nU3RvcmUuc2V0KHt9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuZmFrZVJlc3BvbnNlUGFnaW5nQXBpKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKSB7XG4gICAgaWYgKCF0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIHx8ICF0aGlzLnNob3dGb290ZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGFyZ3VtZW50c1ZhbHVlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSB9ID0gdGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSBhcyBJSHR0cFJlcXVlc3RDb25maWc7XG5cbiAgICB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgc3RvcmVQYXJhbXNDYWxsQXBpOiB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpIH0sIHRoaXMucGFnaW5nU3RvcmUoKSB8fCB7fSwgdGhpcy5rZXlTZWFyY2goKSwgdHJ1ZSwgZmFsc2UsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5jYWxsQXBpKHRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnKTtcblxuICAgIHRoaXMuaXRlbUZvb3Rlci5zZXQoY29udmVydE9iamVjdFRvU2lnbmFsKHJlc3VsdC5kYXRhKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEl0ZW1zKGl0ZW1zOiBUWVBFX0RBVEFfVEFCTEUsIGFkZEZpcnN0OiBib29sZWFuLCBpZ25vcmVIaWdodExpZ2h0PzogYm9vbGVhbiwgaWdub3JlUmVDYWxsRm9vdGVyPzogYm9vbGVhbiwgYXV0b0NvdW50TmV3SXRlbT86IGJvb2xlYW4pIHtcbiAgICBpZiAoIWl0ZW1zKCkgfHwgIWl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zQWRkOiBBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+ID0gW107XG5cbiAgICBpdGVtcygpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmICghdGhpcy5jaGVja0V4aXN0SXRlbShpdGVtKSkge1xuICAgICAgICBpdGVtc0FkZC5wdXNoKGl0ZW0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhpZ2h0TGlnaHQpIHtcbiAgICAgICAgICB0aGlzLmhhc0l0ZW1IaWdodExpZ2h0LnNldCh0cnVlKTtcbiAgICAgICAgICBpdGVtLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgc3BlY2lmaWNIaWdodExpZ2h0OiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkRmlyc3QpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZSgoZGF0YSkgPT4gW2l0ZW0sIC4uLmRhdGFdKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy51cGRhdGUoKGRhdGEpID0+IFtpdGVtLCAuLi5kYXRhXSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoKGRhdGEpID0+IFsuLi5kYXRhLCBpdGVtXSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZSgoZGF0YSkgPT4gWy4uLmRhdGEsIGl0ZW1dKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoYXV0b0NvdW50TmV3SXRlbSAmJiBpdGVtc0FkZC5sZW5ndGgpIHtcbiAgICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnVwZGF0ZSgodmFsdWUpID0+IHZhbHVlICsgaXRlbXNBZGQubGVuZ3RoKTtcbiAgICB9XG4gICAgaWYgKCFpZ25vcmVIaWdodExpZ2h0KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaXRlbXNBZGQuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljSGlnaHRMaWdodDogZmFsc2UgfSkpKTtcbiAgICAgICAgdGhpcy5oYXNJdGVtSGlnaHRMaWdodC5zZXQoZmFsc2UpO1xuICAgICAgfSwgdGhpcy50aW1lSGlnaGxpZ2hOZXdJdGVtKCkpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gICAgaWYgKCFpZ25vcmVSZUNhbGxGb290ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tFeGlzdEl0ZW0oaXRlbU5ldzogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMoKS5maW5kKChpdGVtKSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtpdGVtTmV3KClbdGhpcy5maWVsZEtleSgpXX1gKSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlSXRlbXMoa2V5czogQXJyYXk8dW5rbm93bj4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuICAgIGlmICghdGhpcy5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdGhpcy5pdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICAgIGxldCBpc1VwZGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWAgPT09IGAke2tleX1gKSB7XG4gICAgICAgICAgICBpc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXNVcGRhdGUgPyBuZXdJdGVtcyA6IGl0ZW1zO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCA9PT0gYCR7a2V5fWApIHtcbiAgICAgICAgICAgIGlzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1VwZGF0ZSA/IG5ld0l0ZW1zIDogaXRlbXM7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCF0aGlzLmtleXNTZWxlY3RlZCgpIHx8ICF0aGlzLmtleXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC51cGRhdGUoKGtleXMpID0+IGtleXMuZmlsdGVyKChrZXlTZWxlY3RlZCkgPT4ga2V5U2VsZWN0ZWQgIT09IGtleSkpO1xuICAgIH0pO1xuICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnVwZGF0ZSgodmFsdWUpID0+IHZhbHVlIC0ga2V5cy5sZW5ndGgpO1xuICAgIGF3YWl0IHRoaXMuY2hlY2tTY3JvbGwoKTtcbiAgICBpZiAoIWlnbm9yZVJlQ2FsbEZvb3Rlcikge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCk7XG4gICAgfVxuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3VudCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYWdpbmdTdG9yZSgpPy50b3RhbF9pdGVtcyB8fCB0aGlzLml0ZW1zKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLml0ZW1zKCkubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTW9yZVN1Y2Nlc3MoZGF0YTogV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4pIHtcbiAgICB0aGlzLmFkZEl0ZW1zKGRhdGEsIGZhbHNlKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUFsbENoZWNrZWQoKSB7XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlQ2hlY2tlZEFsbEl0ZW1zKGV2ZW50OiBJQ2hlY2tib3hFdmVudCkge1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoXG4gICAgICAgIHRoaXMuaXRlbXMoKVxuICAgICAgICAgIC5maWx0ZXIoYXN5bmMgKGl0ZW0pID0+ICEoYXdhaXQgdGhpcy5jaGVja0NhbmNlbENvbmRpdGlvbkNoZWNrZWRJdGVtKGl0ZW0pKSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gKVxuICAgICAgKTtcbiAgICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrQ2FuY2VsQ29uZGl0aW9uQ2hlY2tlZEl0ZW0oaXRlbTogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KSB7XG4gICAgbGV0IGlzQ2FuY2VsQ2hlY2sgPSBmYWxzZTtcblxuICAgIGlmICghaXNDYW5jZWxDaGVjayAmJiB0aGlzLmhlYWRlckxlZnQoKS5sZW5ndGggJiYgdGhpcy5oZWFkZXJMZWZ0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbikge1xuICAgICAgaXNDYW5jZWxDaGVjayA9IChhd2FpdCBsYXN0VmFsdWVGcm9tKCh0aGlzLmhlYWRlckxlZnQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIGFzIGFueSkoeyBpdGVtOiBpdGVtKCkgfSkpKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ2FuY2VsQ2hlY2sgJiYgdGhpcy5oZWFkZXJSaWdodCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlclJpZ2h0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbikge1xuICAgICAgaXNDYW5jZWxDaGVjayA9IChhd2FpdCBsYXN0VmFsdWVGcm9tKCh0aGlzLmhlYWRlclJpZ2h0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiBhcyBhbnkpKHsgaXRlbTogaXRlbSgpIH0pKSkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzQ2FuY2VsQ2hlY2s7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUl0ZW1DaGVja2VkKGV2ZW50OiBJQ2hlY2tib3hJdGVtLCBpdGVtOiBUWVBFX09CSkVDVCkge1xuICAgIGNvbnN0IGtleSA9IGl0ZW1bdGhpcy5maWVsZEtleSgpXTtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldCh0aGlzLmtleXNTZWxlY3RlZCgpKTtcblxuICAgIGtleXMuYWRkKGtleSk7XG4gICAgaWYgKCFldmVudC5jaGVja2VkKSB7XG4gICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoQXJyYXkuZnJvbShrZXlzKSk7XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckNoYW5nZVNvcnQoc29ydDogSVNvcnQpIHtcbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gdGhpcy5oZWFkZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwO1xuICAgIGlmICh0aGlzLmluc3RhbmNlU29ydCAmJiB0aGlzLmluc3RhbmNlU29ydCgpPy5maWVsZFNvcnQgIT09IHNvcnQuZmllbGRTb3J0KSB7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydCgpPy5yZXNldCgpO1xuICAgIH1cbiAgICB0aGlzLmluc3RhbmNlU29ydC5zZXQoc29ydCk7XG4gICAgaWYgKHRoaXMuc29ydExvY2FsKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlclNvcnRMb2NhbChzb3J0LCBzY3JvbGxMZWZ0KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSk7XG4gICAgdGhpcy5vdXRTb3J0LmVtaXQoe1xuICAgICAgc29ydDogc29ydCxcbiAgICAgIG9uU29ydFN1Y2Nlc3M6ICgpID0+IHRoaXMub25Tb3J0U3VjY2VzcyhzY3JvbGxMZWZ0KSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgICAgdGhpcy5vblNvcnRTdWNjZXNzKHNjcm9sbExlZnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVyU29ydExvY2FsKHNvcnQ6IElTb3J0LCBzY3JvbGxMZWZ0OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpICYmIHRoaXMuc3RvcmVzKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLml0ZW1zLnNldCh0aGlzLmZpbHRlck9yU29ydExvY2FsKCk/LihzaWduYWwoWy4uLnRoaXMuc3RvcmVzKCldKSwgeyAuLi50aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpLCBpbnN0YW5jZVNvcnQ6IHNvcnQgfSkgfHwgW10pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgZmllbGRTb3J0LCBtb2RlIH0gPSBzb3J0O1xuXG4gICAgdGhpcy5pdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICBpdGVtcy5zb3J0KChpdGVtQSwgaXRlbUIpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlMSA9IG1vZGUgPT09ICdhc2MnID8gaXRlbUEoKVtmaWVsZFNvcnRdIDogaXRlbUIoKVtmaWVsZFNvcnRdO1xuICAgICAgICBsZXQgdmFsdWUyID0gbW9kZSA9PT0gJ2FzYycgPyBpdGVtQigpW2ZpZWxkU29ydF0gOiBpdGVtQSgpW2ZpZWxkU29ydF07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZTEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZTIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmFsdWUxID0gZGVsZXRlVW5pY29kZSh2YWx1ZTEpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgdmFsdWUyID0gZGVsZXRlVW5pY29kZSh2YWx1ZTIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUxID09PSB2YWx1ZTIpIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTEgPiB2YWx1ZTIgPyAxIDogLTE7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgfSk7XG4gICAgdGhpcy5vblNvcnRTdWNjZXNzKHNjcm9sbExlZnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xNb3JlU2VsZWN0SXRlbShmdW5jdGlvbkNvbnRyb2w6IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbSA9IGZ1bmN0aW9uQ29udHJvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWRNb3JlSXRlbShldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5rZXkgfHwgIXRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0/LnJlc2V0KCk7XG5cbiAgICBjb25zdCBwZXJQYWdlID0gTnVtYmVyKGV2ZW50LmtleSkudmFsdWVPZigpO1xuICAgIGNvbnN0IGN1cnJlbnRQZXJQYWdlID0gTnVtYmVyKHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKHBlclBhZ2UpKS52YWx1ZU9mKCk7XG4gICAgY29uc3QgaXNQYWdpbmdOdW1iZXIgPSB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LnBhZ2luZ051bWJlcjtcblxuICAgIGlmIChjdXJyZW50UGVyUGFnZSA+IHBlclBhZ2UgfHwgdGhpcy5pdGVtcy5sZW5ndGggPj0gcGVyUGFnZSkge1xuICAgICAgaWYgKCFpc1BhZ2luZ051bWJlcikge1xuICAgICAgICB0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShjdXJyZW50UGVyUGFnZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoXG4gICAgICAgIHRoaXMuaXRlbXMoKVxuICAgICAgICAgIC5zbGljZSgwLCBwZXJQYWdlKVxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWApXG4gICAgICApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUsIHRydWUpO1xuICAgIGNvbnN0IHN1YiA9IHRoaXMub3V0TG9hZERhdGFDb21wbGV0ZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAoIWlzUGFnaW5nTnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQZXJQYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChcbiAgICAgICAgdGhpcy5pdGVtcygpXG4gICAgICAgICAgLnNsaWNlKDAsIHBlclBhZ2UpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm91dExvYWREYXRhRXJyb3Iuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQZXJQYWdlKTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShwZXJQYWdlOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFyZ3VtZW50c1ZhbHVlID0gdGhpcy5odHRwUmVxdWVzdERhdGEoKT8uYXJndW1lbnRzVmFsdWU7XG5cbiAgICBpZiAoIWFyZ3VtZW50c1ZhbHVlIHx8ICF0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgIHJldHVybiAnLTEnO1xuICAgIH1cbiAgICBjb25zdCBrZXlQZXJQYWdlID0gdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5rZXlQZXJQYWdlIHx8ICdwZXJfcGFnZSc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50c1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYXJndW1lbnQgPSBhcmd1bWVudHNWYWx1ZVtpXTtcblxuICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgSHR0cFBhcmFtcyAmJiBhcmd1bWVudC5oYXMoa2V5UGVyUGFnZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBnZXQ8dW5rbm93bj4oYXJndW1lbnQsIGtleVBlclBhZ2UsICcyNScgYXMgYW55KTtcblxuICAgICAgICBhcmd1bWVudCA9IGFyZ3VtZW50LnNldChrZXlQZXJQYWdlLCBwZXJQYWdlKTtcbiAgICAgICAgc2V0KGFyZ3VtZW50c1ZhbHVlLCBgJHtpfWAgYXMgYW55LCBhcmd1bWVudCk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQZXJQYWdlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3QgJiYgT2JqZWN0LmtleXMoYXJndW1lbnQpLmluY2x1ZGVzKGtleVBlclBhZ2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQZXJQYWdlID0gZ2V0KGFyZ3VtZW50LCBrZXlQZXJQYWdlLCAnMjUnKTtcblxuICAgICAgICBzZXQoYXJndW1lbnQsIGtleVBlclBhZ2UsIHBlclBhZ2UpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50UGVyUGFnZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJy0xJztcbiAgfVxuXG4gIHByaXZhdGUgb25Tb3J0U3VjY2VzcyhzY3JvbGxMZWZ0OiBudW1iZXIpIHtcbiAgICB0aGlzLnJlc2V0U2Nyb2xsKHNjcm9sbExlZnQsIDApO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQnV0dG9uQ2xpY2sodHlwZTogJ2J1dHRvbicgfCAnYnV0dG9uLWRyb3Bkb3duJywgYnV0dG9uRHJvcGRvd25EYXRhOiBhbnksIGJ1dHRvbjogSUJ1dHRvbikge1xuICAgIC8vIGJ1dHRvbk9yaWdpbiBjaOG7iSBz4butIGThu6VuZyBraGkgZMO5bmcgYnV0dG9uQWN0aW9ucyBjw7MgYnV0dG9uLWRyb3Bkb3duXG4gICAgaWYgKHR5cGUgPT09ICdidXR0b24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRDbGlja0J1dHRvbkFjdGlvbi5lbWl0KHsgaXRlbTogdGhpcy5pdGVtT2ZJbmRleEhvdmVyLCBidXR0b246IGJ1dHRvbiB9KTtcbiAgICB9XG4gICAgdGhpcy5vdXRDbGlja0J1dHRvbkFjdGlvbi5lbWl0KHsgaXRlbTogdGhpcy5pdGVtT2ZJbmRleEhvdmVyLCBidXR0b24sIGJ1dHRvbkRyb3Bkb3duRGF0YSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQmFyQnV0dG9uQ2xpY2soYnV0dG9uOiBJQnV0dG9uKSB7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+ID0gW107XG5cbiAgICB0aGlzLmtleXNTZWxlY3RlZCgpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXMoKS5maW5kKChpdGVtKSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtrZXl9YCk7XG5cbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5vdXRDbGlja0JhckJ1dHRvbi5lbWl0KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGl0ZW1zLFxuICAgICAga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSxcbiAgICAgIGhpZGRlbkJhckJ1dHRvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQnV0dG9uRHJvcGRvd25FdmVudChldmVudE5hbWU6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIHRoaXMuaGFzQWN0aW9uQnV0dG9uRHJvcGRvd25Db250ZW50LnNldCh0cnVlKTtcbiAgICBpZiAoZXZlbnROYW1lID09PSAncmVtb3ZlJyB8fCBldmVudE5hbWUgPT09ICdtb3VzZWxlYXZlLWNvbnRlbnQnKSB7XG4gICAgICB0aGlzLmhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudC5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRJbmRleEhvdmVyKGU6IEV2ZW50LCBpdGVtOiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghdGhpcy5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5yZXNldEluZGV4SG92ZXIoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1PZkluZGV4SG92ZXIgPSBpdGVtO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKGU/OiBFdmVudCkge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleEl0ZW1Ib3ZlciA9IHRoaXMuaXRlbU9mSW5kZXhIb3ZlcjtcblxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0oKSk7XG4gICAgdGhpcy50aW1lb3V0TGVhdmVJdGVtLnNldChcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pdGVtT2ZJbmRleEhvdmVyICYmIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciAhPT0gY3VycmVudEluZGV4SXRlbUhvdmVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0SW5kZXhIb3ZlcihlPzogRXZlbnQpIHtcbiAgICBlPy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5oYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1PZkluZGV4SG92ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlTGVhdmVDb250YWluZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUVudGVySGVhZGVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMubW91c2VFbnRlckhlYWRlci5zZXQodHJ1ZSk7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUxlYXZlSGVhZGVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMubW91c2VFbnRlckhlYWRlci5zZXQoZmFsc2UpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VFbnRlckZvb3RlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gICAgaWYgKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpIHtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlTGVhdmVGb290ZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpIHtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxIZWFkZXIoZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghdGhpcy5tb3VzZUVudGVySGVhZGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKHRoaXMuYm9keUVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsTGVmdDtcbiAgICBpZiAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkpIHtcbiAgICAgICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNjcm9sbEJvZHkoZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLm1vdXNlRW50ZXJIZWFkZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAodGhpcy5oZWFkZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgaWYgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpKSB7XG4gICAgICAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb3R0b20oZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmxvYWRpbmcoKSB8fCB0aGlzLmFjdGl2aXR5TG9hZERhdGEoKSAhPT0gJ3Njcm9sbC1pbmZpbml0eScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRMb2FkTW9yZS5lbWl0KHsgbG9hZE1vcmVTdWNjZXNzOiB0aGlzLmxvYWRNb3JlU3VjY2Vzcy5iaW5kKHRoaXMpIH0pO1xuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZShmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdpbmdTdG9yZS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLihkYXRhIHx8IHt9KSwgcGFnZSB9KSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFNjcm9sbChzY3JvbGxQb3NpdGlvbkxlZnQ/OiBudW1iZXIsIHNjcm9sbFBvc2l0aW9uVG9wPzogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpKSB7XG4gICAgICAodGhpcy5oZWFkZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxQb3NpdGlvbkxlZnQgfHwgMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuQm9keUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsUG9zaXRpb25Ub3AgfHwgMDtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbFBvc2l0aW9uTGVmdCB8fCAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkpIHtcbiAgICAgICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbFBvc2l0aW9uTGVmdCB8fCAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXQoY2xlYXJTb3J0PzogYm9vbGVhbikge1xuICAgIGlmIChjbGVhclNvcnQpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VTb3J0KCk/LnJlc2V0KCk7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydC5zZXQodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgdGhpcy5mYWtlUmVzcG9uc2VBcGkoKTtcbiAgICB0aGlzLnJlc2V0U2Nyb2xsKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrU2Nyb2xsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhc1Njcm9sbCA9IHRoaXMuaGFzU2Nyb2xsKCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRpbWVyKDUwMClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLkJvZHlFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQodGhpcy5Cb2R5RWxlbWVudC5zY3JvbGxIZWlnaHQgPiB0aGlzLkJvZHlFbGVtZW50Lm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYXNTY3JvbGwgJiYgIXRoaXMuaGFzU2Nyb2xsKCkpIHtcbiAgICAgICAgICAgIHRoaXMub3V0U2Nyb2xsSXNHb25lLmVtaXQoe30pO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbHRlck9yU29ydExvY2FsKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBCb2R5RWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYm9keUVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0oKSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGxcIj5cbiAgQGlmICghaWdub3JlQmFyKCkpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHJlbGF0aXZlIHotWzFdIGJvdHRvbS0wIGxlZnQtMCB3LWZ1bGwgYmctd2hpdGUgbGlicy11aS10YWJsZS1zaGFkb3ctYm90dG9tIHt7IGNsYXNzQmFySW5jbHVkZSgpIH19XCJcbiAgICAgIFtjbGFzcy5weC1bMTZweF1dPVwia2V5c1NlbGVjdGVkKCkubGVuZ3RoIHx8IGxhYmVsQmFyTm9TZWxlY3RJdGVtKClcIlxuICAgICAgW2NsYXNzLnB5LVs2cHhdXT1cImtleXNTZWxlY3RlZCgpLmxlbmd0aCB8fCBsYWJlbEJhck5vU2VsZWN0SXRlbSgpXCJcbiAgICAgIChtb3VzZWVudGVyKT1cInJlc2V0SW5kZXhIb3ZlcigkZXZlbnQpXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJkaXYubGlicy11aS10YWJsZS1iYXItbGVmdFwiPjwvbmctY29udGVudD5cbiAgICAgIEBpZiAoIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBsYWJlbEJhck5vU2VsZWN0SXRlbSgpKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInt7IGNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSA/PyAncHgtWzEycHhdIHB5LVs1cHhdJyB9fVwiXG4gICAgICAgICAgW2lubmVySHRtbF09XCJsYWJlbEJhck5vU2VsZWN0SXRlbSgpIHwgdHJhbnNsYXRlOiB7IHZhbHVlOiB0b3RhbEl0ZW1EaXNwbGF5KCkgfVwiPjwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChrZXlzU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHBsLVsxMnB4XVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBoLWZ1bGwgbXQtWy0ycHhdXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZVxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8IGRpc2FibGVDaGVja2JveCgpXCJcbiAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQWxsQ2hlY2tlZCgpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg1bSB0ZXh0LVsjMDcxNjMxXSBtci1bOHB4XSB7eyBjbGFzc0xhYmVsQmFyQnV0dG9ucygpIH19XCI+XG4gICAgICAgICAgICB7eyBsYWJlbEJhckJ1dHRvbnMoKSB8IHRyYW5zbGF0ZTogeyB2YWx1ZToga2V5c1NlbGVjdGVkKCkubGVuZ3RoIH0gfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7XG4gICAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaWdub3JlQXJyb3c6IHRydWUsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiAyMDQ4LFxuICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZTogJyF3LVsxMjFweF0nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBtb2RlOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdNb3JlSXRlbSgpXCJcbiAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCI1XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCIhdy1bMTZweF0gaC1bMTZweF0gbXItWzhweF1cIlxuICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZE1vcmVJdGVtKCRldmVudClcIlxuICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sTW9yZVNlbGVjdEl0ZW0oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wIG0tMCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidiZWZvcmU6IXRleHQtWzE2cHhdIGxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCBtci1bNnB4XSdcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cInsgY29uZmlnOiB7IGNvbnRlbnQ6ICdpMThuX21vcmVfc2VsZWN0JyB9IH1cIlxuICAgICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1bMTZweF0gbGlicy11aS1ib3JkZXItbGVmdC1nZW5lcmFsIG1sLVsxNnB4XVwiPjwvZGl2PlxuICAgICAgICAgIEBpZiAoYmFyQnV0dG9ucygpPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBiYXJCdXR0b25zKCk7IHRyYWNrIGJ1dHRvbikge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiYnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b24uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uLmxhYmVsIHx8ICcgJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJCYXJCdXR0b25DbGljayhidXR0b24pXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiZGl2LmxpYnMtdWktdGFibGUtYmFyLXJpZ2h0XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPGRpdlxuICAgICN0YWJsZUNvbnRhaW5lckVsZW1lbnRSZWZcbiAgICBjbGFzcz1cImxpYnMtdWktdGFibGUgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsIHJlbGF0aXZlIHt7IGNsYXNzVGFibGVDb250YWluZXJJbmNsdWRlKCkgfX1cIlxuICAgIFtjbGFzcy5weC1bMTZweF1dPVwiIWlnbm9yZUJhcigpXCJcbiAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVyTW91c2VMZWF2ZUNvbnRhaW5lcigkZXZlbnQpXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGwgc2hyaW5rLTBcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJoZWFkZXJFbGVtZW50UmVmLm9mZnNldEhlaWdodFwiPlxuICAgICAgPGRpdlxuICAgICAgICAjaGVhZGVyRWxlbWVudFJlZlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICBbb3B0aW9uc109XCJ7IHNjcm9sbGJhcldpZHRoOiAwIH1cIlxuICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLWRhc2hlZC1nZW5lcmFsXT1cIiFoYXNJdGVtSGlnaHRMaWdodCgpICYmIGlzRGFzaEJvcmRlcigpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsXT1cIiFoYXNJdGVtSGlnaHRMaWdodCgpICYmICFpc0Rhc2hCb3JkZXIoKVwiXG4gICAgICAgIFtjbGFzcy4haGlkZGVuXT1cIiFpdGVtcygpLmxlbmd0aCAmJiBpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKVwiXG4gICAgICAgIFtjbGFzc109XCJjbGFzc0hlYWRlckNvbnRhaW5lcigpXCJcbiAgICAgICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsSGVhZGVyKCRldmVudClcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVyTW91c2VFbnRlckhlYWRlcigkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaGFuZGxlck1vdXNlTGVhdmVIZWFkZXIoJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICA8ZGl2IFtjbGFzc109XCJjbGFzc0hlYWRlckxlZnRDb250YWluZXIoKVwiPlxuICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlclJlZjsgY29udGV4dDogeyBoZWFkZXJJdGVtOiBoZWFkZXIsIGlzSGVhZGVyTGVmdDogdHJ1ZSB9XCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGhlYWRlclJpZ2h0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlclJpZ2h0KCk7IHRyYWNrIGhlYWRlcikge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmOyBjb250ZXh0OiB7IGhlYWRlckl0ZW06IGhlYWRlciwgaXNIZWFkZXJMZWZ0OiBmYWxzZSB9XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIEBpZiAoc2hvd0Zvb3RlcigpICYmIGl0ZW1Gb290ZXIoKSAmJiBjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAndG9wJykge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlRm9vdGVyUmVmXCIgLz5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCBvdmVyZmxvdy14LWhpZGRlbiBiZy13aGl0ZSB7eyBjbGFzc0JvZHlJbmNsdWRlKCkgfHwgJycgfX1cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgI2JvZHlFbGVtZW50UmVmXG4gICAgICAgIGNsYXNzPVwiZmxleCBoLWZ1bGwgdy1mdWxsIHJlbGF0aXZlXCJcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsQm9keSgkZXZlbnQpXCJcbiAgICAgICAgKG91dFNjcm9sbEJvdHRvbSk9XCJoYW5kbGVyU2Nyb2xsQm90dG9tKCRldmVudClcIj5cbiAgICAgICAgQGlmIChpdGVtcygpLmxlbmd0aCkge1xuICAgICAgICAgIDx2aXJ0dWFsLXNjcm9sbGVyXG4gICAgICAgICAgICAjYm9keUNvbXBvbmVudFJlZlxuICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW1zKClcIlxuICAgICAgICAgICAgW2VuYWJsZVVuZXF1YWxDaGlsZHJlblNpemVzXT1cImVuYWJsZVVuZXF1YWxDaGlsZHJlblNpemVzKClcIlxuICAgICAgICAgICAgY2xhc3M9XCJoLWZ1bGxcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGggPiAoYm9keUVsZW1lbnRSZWYgPyBib2R5RWxlbWVudFJlZi5zY3JvbGxXaWR0aCA6IDApID8gaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aCA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICBbcGFyZW50U2Nyb2xsXT1cImJvZHlFbGVtZW50UmVmXCJcbiAgICAgICAgICAgIFtidWZmZXJBbW91bnRdPVwiYnVmZmVyQW1vdW50KClcIj5cbiAgICAgICAgICAgIEBmb3IgKGRhdGEgb2YgYm9keUNvbXBvbmVudFJlZi52aWV3UG9ydEl0ZW1zOyB0cmFjayBkYXRhKCkpIHtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICNlbGVtZW50SG92ZXJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2YzZmNmY11dPVwiZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLXRvcC0xcHgtMzZkM2QzXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHQgJiYgJGZpcnN0ICYmICFpZ25vcmVCb3JkZXJJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1ib3R0b20tMXB4LTM2ZDNkM109XCJkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0ICYmICFpZ25vcmVCb3JkZXJJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCB8fCAoJGxhc3QgJiYgaWdub3JlQm9yZGVySXRlbUxhc3QoKSlcbiAgICAgICAgICAgICAgICAgICAgPyAnbGlicy11aS1ib3JkZXItcmFkaXVzLWJvdHRvbS1sZWZ0LTRweCBsaWJzLXVpLWJvcmRlci1yYWRpdXMtYm90dG9tLXJpZ2h0LTRweCdcbiAgICAgICAgICAgICAgICAgICAgOiBpZ25vcmVCb3JkZXJJdGVtKClcbiAgICAgICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgOiBpc0Rhc2hCb3JkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnbGlicy11aS1ib3JkZXItYm90dG9tLWRhc2hlZC1nZW5lcmFsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJnLVsjZjhmOWZhXV09XCJpdGVtT2ZJbmRleEhvdmVyID09PSBkYXRhICYmICFkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0XCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRJbmRleEhvdmVyKCRldmVudCwgZGF0YSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGggfHwgaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctd2hpdGVdPVwiIWRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHB4LVsxMnB4XSBweS1bOHB4XSB7eyBoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnJyA6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmOGY5ZmFdXT1cIml0ZW1PZkluZGV4SG92ZXIgPT09IGRhdGEgJiYgIWRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyTGVmdCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7IHdpZHRoOiAnNTBweCcsICdmbGV4LXNoaXJrJzogJzAnLCBwYWRkaW5nOiAnOHB4JyB9IDoge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaGVhZGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUJvZHlSZWY7IGNvbnRleHQ6IHsgaGVhZGVyOiBoZWFkZXIsIGRhdGE6IGRhdGEgfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlclJpZ2h0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogaGVhZGVyTGVmdCgpIDogaGVhZGVyUmlnaHQoKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHsgd2lkdGg6ICc1MHB4JywgJ2ZsZXgtc2hpcmsnOiAnMCcsIHBhZGRpbmc6ICc4cHgnIH0gOiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlQm9keVJlZjsgY29udGV4dDogeyBoZWFkZXI6IGhlYWRlciwgZGF0YTogZGF0YSB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpICYmIGRhdGEoKS5zcGVjaWZpY0V4cGFuZCAmJiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNzc1dyYXBwZXIgfHwgJ2ZsZXggdy1mdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUV4cGFuZCBvZiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5jb2xUZW1wbGF0ZUNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJkYXRhRXhwYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8udGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZW1wdHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgaC1bMTAwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlTm9kYXRhUmVmXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC92aXJ0dWFsLXNjcm9sbGVyPlxuICAgICAgICB9IEBlbHNlIGlmICghbG9hZGluZygpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0aWNreSBsZWZ0LTAgdG9wLTAgei1bMV0gaC1bY2FsYygxMDAlLTEwcHgpXSB3LWZ1bGxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChzaG93U2Nyb2xsVGFibGVQaW5uZWRJZk5vRGF0YSgpKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgaC1bMXB4XSBiZy10cmFuc3BhcmVudCB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aFwiPjwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoc2hvd0Zvb3RlcigpICYmIGl0ZW1Gb290ZXIoKSAmJiBjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAnYm90dG9tJykge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVGb290ZXJSZWZcIiAvPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgdy1mdWxsIGgtZnVsbCB6LVsyXSBmbGV4IGl0ZW1zLWNlbnRlciBjb250ZW50LWNlbnRlclwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc3Bpbm5lciAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoYWN0aXZpdHlMb2FkRGF0YSgpID09PSAnY2xpY2stcGFnaW5hdGlvbicpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBtdC1bMTJweF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wYWdpbmF0aW9uXG4gICAgICAgICAgW21vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2VdPVwicGFnaW5hdGlvblNldHRpbmcoKT8ubW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSB8fCAnYm90dG9tJ1wiXG4gICAgICAgICAgW2NsYXNzRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlXT1cInBhZ2luYXRpb25TZXR0aW5nKCk/LmNsYXNzRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlIHx8ICcnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlSXRlbV09XCJwYWdpbmF0aW9uU2V0dGluZygpPy5jbGFzc0luY2x1ZGVJdGVtIHx8ICcnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlQ29udGFpbmVyXT1cInBhZ2luYXRpb25TZXR0aW5nKCk/LmNsYXNzSW5jbHVkZUNvbnRhaW5lciB8fCAnIWl0ZW1zLWVuZCdcIlxuICAgICAgICAgIFtkaXNhYmxlXT1cInBhZ2luYXRpb25TZXR0aW5nKCk/LmRpc2FibGUgfHwgbG9hZGluZygpIHx8ICFpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgW251bWJlclBhZ2VEaXNwYWx5XT1cInBhZ2luYXRpb25TZXR0aW5nKCk/Lm51bWJlclBhZ2VEaXNwYWx5IHx8IDVcIlxuICAgICAgICAgIFtzaG93VG90YWxQYWdlXT1cInBhZ2luYXRpb25TZXR0aW5nKCk/LnNob3dUb3RhbFBhZ2UgfHwgZmFsc2VcIlxuICAgICAgICAgIFtzaG93SW5wdXRHb3RvUGFnZV09XCJwYWdpbmF0aW9uU2V0dGluZygpPy5zaG93SW5wdXRHb3RvUGFnZSB8fCBmYWxzZVwiXG4gICAgICAgICAgW3RvdGFsSXRlbXNdPVwicGFnaW5nU3RvcmUoKT8udG90YWxfaXRlbXMgfHwgKHBhZ2luZ1N0b3JlKCk/LnRvdGFsX3BhZ2VzIHx8IDApICogKHBhZ2luZ1N0b3JlKCk/LnBlcl9wYWdlIHx8IDApXCJcbiAgICAgICAgICBbcGVyUGFnZV09XCJwYWdpbmdTdG9yZSgpPy5wZXJfcGFnZSB8fCAwXCJcbiAgICAgICAgICBbY3VycmVudFBhZ2VdPVwicGFnaW5nU3RvcmUoKT8ucGFnZSB8fCAwXCJcbiAgICAgICAgICAob3V0UGFnZVNlbGVjdCk9XCJoYW5kbGVyQ2hhbmdlUGFnZSgkZXZlbnQpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICN0ZW1wbGF0ZUhlYWRlclJlZlxuICBsZXQtaGVhZGVyPVwiaGVhZGVySXRlbVwiXG4gIGxldC1pc0hlYWRlckxlZnQ9XCJpc0hlYWRlckxlZnRcIj5cbiAgPGRpdlxuICAgIFtjbGFzc109XCIncmVsYXRpdmUgZmxleCAnICsgKGhlYWRlci5wYWRkaW5nTGVmdFJpZ2h0SGVhZGVyQ29udGFpbmVyID8/ICcgcHgtWzEycHhdICcpICsgKGlzSGVhZGVyTGVmdCAmJiAhaGVhZGVyLmlnbm9yZUJvcmRlclJpZ2h0ID8gJyBsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsICcgOiAnICcpICsgJyBsaWJzLXVpLXRhYmxlLWhlYWRlci1jb2wgJ1wiXG4gICAgW2NsYXNzLmZsZXgtY29sXT1cImhlYWRlci5yb3dzQ29uZmlnXCJcbiAgICBbY2xhc3MucHktWzhweF1dPVwiIWhlYWRlci5pZ25vcmVQeURlZmF1bHRcIlxuICAgIFtuZ1N0eWxlXT1cIlxuICAgICAgKGhlYWRlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IChpc0hlYWRlckxlZnQgPyBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyTGVmdCB8fCBmYWxzZSA6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJSaWdodCB8fCBmYWxzZSkgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogaGVhZGVyTGVmdCgpIDogaGVhZGVyUmlnaHQoKSkgfHxcbiAgICAgIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHsgd2lkdGg6ICc1MHB4JywgJ2ZsZXgtc2hpcmsnOiAnMCcsIHBhZGRpbmc6ICc4cHgnIH0gOiB7fSlcbiAgICBcIlxuICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgQGlmICghaGVhZGVyLnJvd3NDb25maWcpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7IGNvbnRleHQ6IHsgaGVhZGVySXRlbTogaGVhZGVyLCBpc0NvbFJlbmRlcjogZmFsc2UsIGlzSGVhZGVyTGVmdDogaXNIZWFkZXJMZWZ0IH1cIiAvPlxuICAgIH1cbiAgICBAaWYgKGhlYWRlci5yb3dzQ29uZmlnOyBhcyByb3dzQ29uZmlnKSB7XG4gICAgICBAZm9yIChyb3cgb2Ygcm93c0NvbmZpZy5yb3dzOyB0cmFjayByb3cpIHtcbiAgICAgICAgPGRpdiBbY2xhc3NdPVwicm93LmNsYXNzUm93XCI+XG4gICAgICAgICAgQGZvciAoY29sIG9mIHJvdy5jb2xzOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7IGNvbnRleHQ6IHsgaGVhZGVySXRlbTogY29sLCBpc0NvbFJlbmRlcjogdHJ1ZSwgaXNIZWFkZXJMZWZ0OiBpc0hlYWRlckxlZnQgfVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICN0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWZcbiAgbGV0LWhlYWRlcj1cImhlYWRlckl0ZW1cIlxuICBsZXQtaXNDb2xSZW5kZXI9XCJpc0NvbFJlbmRlclwiXG4gIGxldC1pc0hlYWRlckxlZnQ9XCJpc0hlYWRlckxlZnRcIj5cbiAgPGRpdlxuICAgICNpdGVtSGVhZGVyUmVmXG4gICAgY2xhc3M9XCJmbGV4IGxpYnMtdWktZm9udC1oNm0gbWluLWgtWzE4cHhdIHRleHQtWyM2YTczODNdIG1heC13LWZ1bGxcIlxuICAgIFtjbGFzcy5pdGVtcy1jZW50ZXJdPVwiaGVhZGVyLmNvbnRlbnRIZWFkZXJBbGlnbkNlbnRlciA/PyB0cnVlXCJcbiAgICBbY2xhc3MuanVzdGlmeS1lbmRdPVwiaGVhZGVyLmNvbnRlbnRIZWFkZXJKdXN0aWZ5Q29udGVudEVuZFwiXG4gICAgW2NsYXNzLnctZnVsbF09XCJoZWFkZXIuaXNTaG93SW5kZXhPblJvd1wiXG4gICAgW25nU3R5bGVdPVwiXG4gICAgICBpc0NvbFJlbmRlclxuICAgICAgICA/IChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiAoaXNIZWFkZXJMZWZ0ID8gaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyKCk/LmhlYWRlckxlZnQgfHwgZmFsc2UgOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UpIDogaGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aCA6IGhlYWRlckxlZnQoKSA6IGhlYWRlclJpZ2h0KCkpIHx8XG4gICAgICAgICAgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8geyB3aWR0aDogJzUwcHgnLCAnZmxleC1zaGlyayc6ICcwJywgcGFkZGluZzogJzhweCcgfSA6IHt9KVxuICAgICAgICA6IHt9XG4gICAgXCJcbiAgICBbbmdDbGFzc109XCJpc0NvbFJlbmRlciA/IGhlYWRlci5uZ0NsYXNzIHx8IHt9IDoge31cIj5cbiAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveCkge1xuICAgICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3hBbGwpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBoLWZ1bGwge3sgaGVhZGVyLmNoZWNrYm94QWxsQ2xhc3NJbmNsdWRlIHx8ICdtci1bMTZweF0nIH19XCJcbiAgICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cImhlYWRlci5jaGVja2JveEFsaWduQ2VudGVyXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGVcbiAgICAgICAgICAgIFtrZXldPVwiJ2FsbCdcIlxuICAgICAgICAgICAgW3N0aWxsT3RoZXJPcHRpb25zXT1cIiEha2V5c1NlbGVjdGVkKCkubGVuZ3RoICYmIGtleXNTZWxlY3RlZCgpLmxlbmd0aCAhPT0gaXRlbXMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiISFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoID09PSBpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKClcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIuY2hlY2tib3hDbGFzc0luY2x1ZGVcIlxuICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZEFsbEl0ZW1zKCRldmVudClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBoLWZ1bGwgbWwtWzI0cHhdIHt7IGhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZSB9fVwiPjwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgICBAZm9yICh0b29sdGlwIG9mIGhlYWRlci50b29sdGlwc0xlZnQ7IHRyYWNrIHRvb2x0aXApIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtci1bNHB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICBbdHlwZV09XCJ0b29sdGlwPy50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgIFttb2RlXT1cInRvb2x0aXA/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJ0b29sdGlwLmNsYXNzSW5jbHVkZSB8fCAndGV4dC1bIzZhNzM4M10nXCJcbiAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwidG9vbHRpcC5pZ25vcmVTaG93VG9vbHRpcCB8fCBmYWxzZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJcbiAgICAgICAgICAgIHRvb2x0aXAuY29uZmlnIHx8IHtcbiAgICAgICAgICAgICAgY29udGVudDogdG9vbHRpcC5kYXRhVmlldyB8fCAnICcgfCB0cmFuc2xhdGUsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgbW9kZTogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsXG4gICAgICAgICAgICAgICAgYXV0b1VwZGF0ZVBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBlbmREaXN0YW5jZTogMTIsXG4gICAgICAgICAgICAgICAgICBzdGFydERpc3RhbmNlOiAtMTIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwidG9vbHRpcC5kYXRhVmlld1wiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB7eyBoZWFkZXIuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICB7eyBoZWFkZXIubGFiZWwgPz8gJyMnIH19XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBpZiAoaGVhZGVyLmxhYmVsIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogaGVhZGVyLnBhcnNlVmFsdWUgOiBoZWFkZXIgfCBhc3luYyB8IHRyYW5zbGF0ZTsgYXMgbGFiZWxIZWFkZXJDb2x1bW4pIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgW3R5cGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8udHlwZSB8fCAndGV4dCdcIlxuICAgICAgICAgIFttb2RlXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXI/LmxhYmVsQ29uZmlnPy5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJoZWFkZXI/LmxhYmVsQ29uZmlnPy5pZ25vcmVTaG93VG9vbHRpcCB8fCBmYWxzZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJoZWFkZXIubGFiZWxDb25maWc/LmNvbmZpZyB8fCB7IGNvbnRlbnQ6IGxhYmVsSGVhZGVyQ29sdW1uIH1cIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwibGFiZWxIZWFkZXJDb2x1bW5cIiAvPlxuICAgICAgfVxuICAgIH1cblxuICAgIEBmb3IgKHRvb2x0aXAgb2YgaGVhZGVyLnRvb2x0aXBzUmlnaHQ7IHRyYWNrIHRvb2x0aXApIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtbC1bNHB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICBbdHlwZV09XCJ0b29sdGlwPy50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgIFttb2RlXT1cInRvb2x0aXA/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJ0b29sdGlwLmNsYXNzSW5jbHVkZSB8fCAndGV4dC1bIzZhNzM4M10nXCJcbiAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwidG9vbHRpcC5pZ25vcmVTaG93VG9vbHRpcCB8fCBmYWxzZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJcbiAgICAgICAgICAgIHRvb2x0aXAuY29uZmlnIHx8IHtcbiAgICAgICAgICAgICAgY29udGVudDogdG9vbHRpcC5kYXRhVmlldyB8fCAnICcgfCB0cmFuc2xhdGUsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgbW9kZTogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsXG4gICAgICAgICAgICAgICAgYXV0b1VwZGF0ZVBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBlbmREaXN0YW5jZTogMTIsXG4gICAgICAgICAgICAgICAgICBzdGFydERpc3RhbmNlOiAtMTIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwidG9vbHRpcC5kYXRhVmlld1wiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5oYXNTb3J0ICYmIGhlYWRlci5vcmRlcmJ5KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWwtWzRweF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXNvcnQtYXJyb3dcbiAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgIWl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICBbZmllbGRTb3J0XT1cImhlYWRlci5vcmRlcmJ5XCJcbiAgICAgICAgICBbaWdub3JlUG9wb3ZlckNvbnRlbnRdPVwiaGVhZGVyLnNvcnRJZ25vcmVUb29sdGlwQ29udGVudCA/PyB0cnVlXCJcbiAgICAgICAgICBbcG9wb3ZlckNvbnRlbnRBc2NdPVwiaGVhZGVyLnNvcnRUb29sdGlwQ29udGVudEFzY1wiXG4gICAgICAgICAgW3BvcG92ZXJDb250ZW50RGVzY109XCJoZWFkZXIuc29ydFRvb2x0aXBDb250ZW50RGVzY1wiXG4gICAgICAgICAgW2RlZmF1bHRNb2RlXT1cImhlYWRlci5kZWZhdWx0TW9kZVwiXG4gICAgICAgICAgW3pJbmRleF09XCJoZWFkZXIuekluZGV4VG9vbHRpcFNvcnRcIlxuICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZVNvcnQoJGV2ZW50KVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKGhlYWRlci5sYWJlbERlc2NyaXB0aW9uKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiBoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jb250ZW50IHwgdHJhbnNsYXRlIH1cIlxuICAgICAgICBbaW5uZXJIVE1MXT1cImhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNvbnRlbnQgfCB0cmFuc2xhdGVcIiAvPlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3RlbXBsYXRlQm9keVJlZlxuICBsZXQtaGVhZGVyPVwiaGVhZGVyXCJcbiAgbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBoLWZ1bGxcIj5cbiAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZsZXggaC1mdWxsXCJcbiAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCJoZWFkZXIuY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiAmJiAoZGF0YSgpIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogaGVhZGVyLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gOiBkYXRhKCkgfCBhc3luYylcIlxuICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cImhlYWRlci5jaGVja2JveEFsaWduQ2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXG4gICAgICAgICAgW2tleV09XCJkYXRhKClbZmllbGRLZXkoKV1cIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiaGVhZGVyLmNoZWNrYm94Q2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICBbY2hlY2tlZF09XCJkYXRhKClbZmllbGRLZXkoKV0gfCBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGU6IGtleXNTZWxlY3RlZCgpIDoga2V5c1NlbGVjdGVkKCkubGVuZ3RoXCJcbiAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgZGlzYWJsZUNoZWNrYm94KCkgfHwgISEobWF4SXRlbVNlbGVjdGVkKCkgJiYgIShkYXRhKClbZmllbGRLZXkoKV0gfCBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGU6IGtleXNTZWxlY3RlZCgpIDoga2V5c1NlbGVjdGVkKCkubGVuZ3RoKSAmJiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggPj0gbWF4SXRlbVNlbGVjdGVkKCkpXCJcbiAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZCgkZXZlbnQsIGRhdGEoKSlcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdzsgYXMgY29uZmlnKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGxpYnMtdWktZm9udC1oNHJ7eyBjb25maWcuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgIFtjb25maWddPVwie31cIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwiZGF0YSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGdldEluZGV4Um93IHwgYXN5bmNcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICBbaXNIb3Zlcl09XCJpdGVtT2ZJbmRleEhvdmVyID09PSBkYXRhICYmICFkYXRhLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgIFtjbGFzc109XCJoZWFkZXIudGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAnJ1wiXG4gICAgICAgIFtpdGVtXT1cImRhdGFcIlxuICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImhlYWRlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICBbY29uZmlnc109XCJoZWFkZXIuY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlRm9vdGVyUmVmPlxuICBAaWYgKCFpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKSB8fCAoaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhKCkgJiYgaXRlbXMoKS5sZW5ndGgpKSB7XG4gICAgPGRpdlxuICAgICAgI2Zvb3RlckVsZW1lbnRSZWZcbiAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgYmctWyNmOGY5ZmFdIG92ZXJmbG93LXgtaGlkZGVuIHotWzFdIHt7IGlnbm9yZUJvcmRlckZvb3RlcigpID8gJycgOiBjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAndG9wJyA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCcgOiAnbGlicy11aS10YWJsZS1zaGFkb3ctdG9wIGxpYnMtdWktYm9yZGVyLXRvcC1nZW5lcmFsJyB9fSBtaW4taC1bMzVweF1cIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlck1vdXNlRW50ZXJGb290ZXIoJGV2ZW50KVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVyTW91c2VMZWF2ZUZvb3RlcigkZXZlbnQpXCI+XG4gICAgICBAaWYgKGZvb3RlckxlZnQoKSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgI2Zvb3RlckxlZnRFbGVtZW50UmVmXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV0gYmctWyNmOGY5ZmFdXCI+XG4gICAgICAgICAgQGZvciAoZm9vdGVyIG9mIGZvb3RlckxlZnQoKTsgdHJhY2sgZm9vdGVyKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzEycHhdIHB5LVs4cHhdIHt7IGZvb3Rlci5pZ25vcmVCb3JkZXJSaWdodCA/ICcnIDogJ2xpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwnIH19XCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwiKGZvb3RlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJMZWZ0IHx8IGZhbHNlIDogaGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aCA6IGZvb3RlckxlZnQoKSA6IGZvb3RlclJpZ2h0KCkpIHx8IHt9XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgQGlmIChmb290ZXIuY29sVGVtcGxhdGVDb25maWcgJiYgaXRlbUZvb3RlcigpKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1Gb290ZXIgfCBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGVcIlxuICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGZvb3RlclJpZ2h0KCkpIHtcbiAgICAgICAgQGZvciAoZm9vdGVyIG9mIGZvb3RlclJpZ2h0KCk7IHRyYWNrIGZvb3Rlcikge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihmb290ZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogZm9vdGVyTGVmdCgpIDogZm9vdGVyUmlnaHQoKSkgfHwge31cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgIEBpZiAoZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnICYmIGl0ZW1Gb290ZXIoKSkge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1Gb290ZXIgfCBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGVcIlxuICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlTm9kYXRhUmVmPlxuICBAaWYgKCFrZXlTZWFyY2goKSAmJiB0ZW1wbGF0ZU5vRGF0YSgpOyBhcyB0ZW1wbGF0ZU5vRGF0YSkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vRGF0YVwiIC8+XG4gIH1cbiAgQGlmIChrZXlTZWFyY2goKSAmJiB0ZW1wbGF0ZU5vUmVzdWx0KCk7IGFzIHRlbXBsYXRlTm9SZXN1bHQpIHtcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb1Jlc3VsdFwiIC8+XG4gIH1cbiAgQGlmICghdGVtcGxhdGVOb0RhdGEoKSAmJiAhdGVtcGxhdGVOb1Jlc3VsdCgpICYmIG5vRGF0YUNvbmZpZygpOyBhcyBjb25maWcpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBhYnNvbHV0ZSBsZWZ0LTAgdG9wLTAgei1bMV1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIHNocmluay0wXCI+XG4gICAgICAgIEBpZiAoIWtleVNlYXJjaCgpICYmICFvbmx5U2hvd05vUmVzdWx0KCkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cIiduby1kYXRhJyB8IExpYnNVaUljb25zR2V0SWNvbkNvbXBvbmVudFBpcGUgfCBhc3luYzsgaW5wdXRzOiB7IHNpemU6IDY0IH1cIiAvPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS10YWJsZS1uby1kYXRhLWNvbmZpZy10ZXh0XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbmZpZy5uZ0NsYXNzIHx8IHt9XCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnLnRleHROb0RhdGEgfCB0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGtleVNlYXJjaCgpIHx8IG9ubHlTaG93Tm9SZXN1bHQoKSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiJ25vLXJlc3VsdCcgfCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIHwgYXN5bmM7IGlucHV0czogeyBzaXplOiA2NCB9XCIgLz5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktdGFibGUtbm8tZGF0YS1jb25maWctdGV4dFwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJjb25maWcubmdTdHlsZSB8fCB7fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb25maWcubmdDbGFzcyB8fCB7fVwiXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cImNvbmZpZy50ZXh0U2VhcmNoTm9EYXRhIHwgdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
714
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3hOLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBNEIscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRyxPQUFPLEVBQVcsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRyxPQUFPLEVBQVMseUNBQXlDLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRyxPQUFPLEVBQWtCLHVDQUF1QyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUcsT0FBTyxFQUFpRCxpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWhJLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRyxPQUFPLEVB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QUd4Qiw4QkFBOEI7a0JBL0IxQyxTQUFTOytCQUVFLDBCQUEwQixjQUd4QixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsT0FBTzt3QkFDUCxPQUFPO3dCQUNQLFNBQVM7d0JBQ1QsZ0JBQWdCO3dCQUNoQixpQkFBaUI7d0JBQ2pCLHVDQUF1Qzt3QkFDdkMsZUFBZTt3QkFDZixxQkFBcUI7d0JBQ3JCLHNDQUFzQzt3QkFDdEMsb0NBQW9DO3dCQUNwQyxpQ0FBaUM7d0JBQ2pDLHlDQUF5Qzt3QkFDekMsbUNBQW1DO3dCQUNuQyx1Q0FBdUM7d0JBQ3ZDLCtCQUErQjt3QkFDL0IsZ0NBQWdDO3dCQUNoQyxnQ0FBZ0M7d0JBQ2hDLHNDQUFzQzt3QkFDdEMsK0JBQStCO3dCQUMvQixxQ0FBcUM7d0JBQ3JDLGlDQUFpQztxQkFDbEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nQ29tcG9uZW50T3V0bGV0LCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgY29tcHV0ZWQsIERlc3Ryb3lSZWYsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQsIHZpZXdDaGlsZCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudCwgVmlydHVhbFNjcm9sbGVyTW9kdWxlIH0gZnJvbSAnQGloYXJiZWNrL25neC12aXJ0dWFsLXNjcm9sbGVyJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJU29ydCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTb3J0QXJyb3dDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtc29ydCc7XG5pbXBvcnQgeyBJQ2hlY2tib3hJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1ncm91cCc7XG5pbXBvcnQgeyBJQ2hlY2tib3hFdmVudCwgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUnO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcGFnaW5hdGlvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lcic7XG5pbXBvcnQgeyBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIH0gZnJvbSAnQGxpYnMtdWkvaWNvbnMnO1xuaW1wb3J0IHsgSUh0dHBSZXNwb25zZUVycm9yLCBJUGFnaW5nLCBUWVBFX09CSkVDVCwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNoZWNrLXNlbGVjdGVkLWJ5LWtleSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jb252ZXJ0LW9iamVjdC10by1zaWduYWwnO1xuaW1wb3J0IHsgSUh0dHBSZXF1ZXN0Q29uZmlnLCBMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UsIHJldHVybkxpc3RPYmplY3QgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3QnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjb252ZXJ0T2JqZWN0VG9TaWduYWwsIGRlbGV0ZVVuaWNvZGUsIGdldCwgc2V0LCB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgbGFzdFZhbHVlRnJvbSwgb2YsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBJQnV0dG9uQmFyRXZlbnQsXG4gIElDb25maWdTZWxlY3RNb3JlSXRlbSxcbiAgSUNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kLFxuICBJSG92ZXJCdXR0b25BY3Rpb25FdmVudCxcbiAgSUxvYWRNb3JlRXZlbnQsXG4gIElTb3J0RXZlbnQsXG4gIElUYWJlbEJ1dHRvbkFjdGlvbkV2ZW50LFxuICBJVGFibGVGb290ZXJDb25maWcsXG4gIElUYWJsZUhlYWRlckNvbmZpZyxcbiAgVFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSxcbiAgVFlQRV9EQVRBX1RBQkxFLFxuICBUWVBFX0lURU1fREFUQV9UQUJMRSxcbiAgVFlQRV9ORVdfREFUQV9UQUJMRSxcbiAgVFlQRV9UQUJMRV9GSUxURVIsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJVGFibGVGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLWV2ZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJVGFibGVOb0RhdGFDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvbm8tZGF0YS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGUgfSBmcm9tICcuL3BpcGVzL2NhbGN1bGF0b3ItY29sdW1uLnBpcGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50IH0gZnJvbSAnLi90ZW1wbGF0ZXMvdGVtcGxhdGVzLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDbGFzcyxcbiAgICBOZ1N0eWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE5nQ29tcG9uZW50T3V0bGV0LFxuICAgIExpYnNVaUNvbXBvbmVudHNUYWJsZVRlbXBsYXRlc0NvbXBvbmVudCxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgVmlydHVhbFNjcm9sbGVyTW9kdWxlLFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTb3J0QXJyb3dDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1BhZ2luYXRpb25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50LFxuICAgIExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c1NwaW5uZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsXG4gICAgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSxcbiAgICBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlLFxuICAgIExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogUFJPUEVSVFkgKi9cbiAgcHJvdGVjdGVkIGNsYXNzSGVhZGVyQ29udGFpbmVyID0gY29tcHV0ZWQoKCkgPT4gYGxpYnMtdWktdGFibGUtaGVhZGVyLWNvbnRhaW5lciB3LWZ1bGwgYWJzb2x1dGUgZmxleCBzaHJpbmstMCAke3RoaXMuaWdub3JlQ2xhc3NCZ0hlYWRlcigpID8gJycgOiAnYmctd2hpdGUnfSBvdmVyZmxvdy14LWhpZGRlbiB6LVsxXSBpdGVtcy1jZW50ZXIgJHt0aGlzLmNsYXNzSGVhZGVyQ29udGFpbmVySW5jbHVkZSgpIHx8ICcnfWApO1xuICBwcm90ZWN0ZWQgY2xhc3NIZWFkZXJMZWZ0Q29udGFpbmVyID0gY29tcHV0ZWQoKCkgPT4gYGgtZnVsbCBmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV0gJHt0aGlzLmlnbm9yZUNsYXNzQmdIZWFkZXIoKSA/ICcnIDogJ2JnLXdoaXRlJ30gJHt0aGlzLmNsYXNzSGVhZGVyTGVmdEluY2x1ZGUoKSB8fCAnJ31gKTtcblxuICBwcm90ZWN0ZWQga2V5c1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PGFueT4+KFtdKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgc3RvcmVzID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1zID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1Gb290ZXIgPSBzaWduYWw8VFlQRV9PQkpFQ1QgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBpdGVtT2ZJbmRleEhvdmVyPzogVFlQRV9JVEVNX0RBVEFfVEFCTEU7XG4gIHByb3RlY3RlZCBrZXlTZWFyY2ggPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCB0b3RhbEl0ZW1JbkJhY2tlbmQgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJvdGVjdGVkIGhhc0l0ZW1IaWdodExpZ2h0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbURpc3BsYXkgPSBjb21wdXRlZCgoKSA9PiB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UodGhpcy50b3RhbEl0ZW0oKSA/PyB0aGlzLnRvdGFsSXRlbUluQmFja2VuZCgpLCBmYWxzZSkpO1xuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ01vcmVJdGVtID0gY29tcHV0ZWQ8SUxpc3RDb25maWdJdGVtPigoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIGNvbmZpZ1RlbXBsYXRlVGV4dDogc2lnbmFsKHtcbiAgICAgICAgZmllbGRLZXk6ICdrZXknLFxuICAgICAgICBpZ25vcmVJY29uU2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgIGdldFZhbHVlOiB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LmdldFZhbHVlLFxuICAgICAgICBjb25maWdMYWJlbFBvcG92ZXI6IHNpZ25hbCh7XG4gICAgICAgICAgekluZGV4OiAxMjAwLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgaHR0cFJlcXVlc3REYXRhOiBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnPih7XG4gICAgICAgIG9iamVjdEluc3RhbmNlOiByZXR1cm5MaXN0T2JqZWN0KHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8ubGlzdE9wdGlvbiksXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ2xpc3QnLFxuICAgICAgICBhcmd1bWVudHNWYWx1ZTogW10sXG4gICAgICB9KSxcbiAgICB9O1xuICB9KTtcblxuICBwcml2YXRlIGhhc1Njcm9sbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaW5zdGFuY2VTb3J0ID0gc2lnbmFsPElTb3J0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBwYWdpbmdTdG9yZSA9IHNpZ25hbDxJUGFnaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGxvYWRlZExhc3RJdGVtID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzdG9yZVBhcmFtc0NhbGxBcGkgPSBzaWduYWw8VFlQRV9PQkpFQ1Q+KHt9KTtcbiAgcHJpdmF0ZSB0aW1lb3V0TGVhdmVJdGVtID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbT86IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50O1xuICBwcml2YXRlIG1vdXNlRW50ZXJIZWFkZXIgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKiBJTlBVVCAqL1xuICByZWFkb25seSB0aW1lSGlnaGxpZ2hOZXdJdGVtID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDIwMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMjAwMCB9KTtcbiAgcmVhZG9ubHkgaGVhZGVyTGVmdCA9IGlucHV0PEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4sIEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4gfCB1bmRlZmluZWQ+KFtdLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IFtdIH0pO1xuICByZWFkb25seSBoZWFkZXJSaWdodCA9IGlucHV0PEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4sIEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4gfCB1bmRlZmluZWQ+KFtdLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IFtdIH0pO1xuICByZWFkb25seSBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIgPSBpbnB1dDx7XG4gICAgaGVhZGVyTGVmdD86IGJvb2xlYW47XG4gICAgaGVhZGVyUmlnaHQ/OiBib29sZWFuO1xuICB9PigpO1xuICByZWFkb25seSBjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCA9IGlucHV0PElDb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZD4oKTtcbiAgcmVhZG9ubHkgc2hvd0Zvb3RlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckZvb3RlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGN1c3RvbVBvc2l0aW9uRm9vdGVyID0gaW5wdXQ8J3RvcCcgfCAnYm90dG9tJywgJ3RvcCcgfCAnYm90dG9tJyB8IHVuZGVmaW5lZD4oJ2JvdHRvbScsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ2JvdHRvbScgfSk7XG4gIHJlYWRvbmx5IGZvb3RlckxlZnQgPSBpbnB1dDxBcnJheTxJVGFibGVGb290ZXJDb25maWc+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBmb290ZXJSaWdodCA9IGlucHV0PEFycmF5PElUYWJsZUZvb3RlckNvbmZpZz4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGVDaGVja2JveCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcyA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBidWZmZXJBbW91bnQgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oNSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+ICh2YWwgPyAodmFsID4gMjUgPyAyNSA6IHZhbCkgOiA1KSB9KTtcbiAgcmVhZG9ubHkgdG90YWxJdGVtID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBpc0Rhc2hCb3JkZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0hlYWRlckNvbnRhaW5lckluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSGVhZGVyTGVmdEluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGNsYXNzQm9keUluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzRm9vdGVySW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NUYWJsZUNvbnRhaW5lckluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzQmFySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oJ2p1c3RpZnktYmV0d2VlbiBtYi1bMTZweF0nKTtcblxuICByZWFkb25seSBmaWVsZEtleSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaWQnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsIHx8ICdpZCcgfSk7IC8vIHTDqm4gZmllbGQgxJHhu4tuaCBkYW5oIGl0ZW0gY+G7p2EgbGlzdERhdGFzXG4gIHJlYWRvbmx5IGRlZmF1bHRLZXlzU2VsZWN0ZWQgPSBpbnB1dDxBcnJheTxhbnk+PigpO1xuICByZWFkb25seSBsYWJlbEJhck5vU2VsZWN0SXRlbSA9IGlucHV0PHN0cmluZz4oYGkxOG5fdG90YWxfcXVhbnRpdHlgKTsgLy8gc+G7rSBk4bulbmcgxJHhu4MgaGnDqm4gdGjhu4sga2hpIHTDrWNoIGNo4buNbiBpdGVtXG4gIHJlYWRvbmx5IGxhYmVsQmFyQnV0dG9ucyA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaTE4bl9udW1iZXJfaXRlbV9zZWxlY3RlZCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgfHwgJ2kxOG5fbnVtYmVyX2l0ZW1fc2VsZWN0ZWQnIH0pOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgY2xhc3NMYWJlbEJhckJ1dHRvbnMgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJycgfSk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBiYXJCdXR0b25zID0gaW5wdXQ8QXJyYXk8SUJ1dHRvbj4+KCk7XG4gIHJlYWRvbmx5IHNvcnRMb2NhbCA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIHRyxrDhu51uZyBo4bujcCBu4bq/dSBzb3J0TG9jYWwgbsOgeSBraMO0bmcgxJHDoXAg4bupbmcgxJHGsOG7o2MgbmdoaeG7h3AgduG7pSB0aMOsIG3hu5tpIGPDom4gbmjhuq9jIHPhu60gZOG7pW5nIGZpbHRlckxvY2FsXG4gIHJlYWRvbmx5IGZpbHRlck9yU29ydExvY2FsID0gaW5wdXQ8VFlQRV9UQUJMRV9GSUxURVI+KCk7XG4gIHJlYWRvbmx5IGh0dHBSZXF1ZXN0RGF0YSA9IGlucHV0PElIdHRwUmVxdWVzdENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgaHR0cFJlcXVlc3REYXRhRm9vdGVyID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBuZXdEYXRhID0gaW5wdXQ8VFlQRV9ORVdfREFUQV9UQUJMRT4oKTtcbiAgcmVhZG9ubHkgZmlsdGVyID0gaW5wdXQ8VFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSwgVFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSB8IHVuZGVmaW5lZD4oeyBmaWx0ZXJEYXRhOiB7fSB9LCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IHsgZmlsdGVyRGF0YToge30gfSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQmFyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NMYWJlbEJhck5vU2VsZWN0SXRlbSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQ2xhc3NCZ0hlYWRlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG5vRGF0YUNvbmZpZyA9IGlucHV0PElUYWJsZU5vRGF0YUNvbmZpZz4oeyB0ZXh0Tm9EYXRhOiAnaTE4bl9ub19kYXRhX3lldCcsIHRleHRTZWFyY2hOb0RhdGE6ICdpMThuX25vX3Jlc3VsdCcgfSk7XG4gIHJlYWRvbmx5IHNob3dTY3JvbGxUYWJsZVBpbm5lZElmTm9EYXRhID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQm9yZGVySXRlbUxhc3QgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBtYXhJdGVtU2VsZWN0ZWQgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMTAwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDEwMCB9KTtcbiAgcmVhZG9ubHkgY29uZmlnU2VsZWN0TW9yZUl0ZW0gPSBpbnB1dDxJQ29uZmlnU2VsZWN0TW9yZUl0ZW0+KCk7XG4gIHJlYWRvbmx5IG9ubHlTaG93Tm9SZXN1bHQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYWN0aXZpdHlMb2FkRGF0YSA9IGlucHV0PCdzY3JvbGwtaW5maW5pdHknIHwgJ2NsaWNrLXBhZ2luYXRpb24nLCAnc2Nyb2xsLWluZmluaXR5JyB8ICdjbGljay1wYWdpbmF0aW9uJyB8IHVuZGVmaW5lZD4oJ3Njcm9sbC1pbmZpbml0eScsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ3Njcm9sbC1pbmZpbml0eScgfSk7XG4gIHJlYWRvbmx5IHBhZ2luYXRpb25TZXR0aW5nID0gaW5wdXQ8e1xuICAgIHBvc2l0aW9uPzogJ3RvcCcgfCAnYm90dG9tJztcbiAgICBjbGFzc0luY2x1ZGVDb250YWluZXI/OiBzdHJpbmc7XG4gICAgY2xhc3NJbmNsdWRlSXRlbT86IHN0cmluZztcbiAgICBkaXNhYmxlPzogYm9vbGVhbjtcbiAgICBudW1iZXJQYWdlRGlzcGFseT86IG51bWJlcjtcbiAgICBzaG93VG90YWxQYWdlPzogYm9vbGVhbjtcbiAgICBzaG93SW5wdXRHb3RvUGFnZT86IGJvb2xlYW47XG4gICAgbW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZT86ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnO1xuICAgIGNsYXNzRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlPzogc3RyaW5nO1xuICB9PigpO1xuICByZWFkb25seSB0ZW1wbGF0ZU5vRGF0YSA9IGlucHV0PFRZUEVfVEVNUExBVEVfUkVGPigpO1xuICByZWFkb25seSB0ZW1wbGF0ZU5vUmVzdWx0ID0gaW5wdXQ8VFlQRV9URU1QTEFURV9SRUY+KCk7XG5cbiAgLyoqIE9VVFBVVCAqL1xuXG4gIHJlYWRvbmx5IG91dExvYWRNb3JlID0gb3V0cHV0PElMb2FkTW9yZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxJc0dvbmUgPSBvdXRwdXQ8SUxvYWRNb3JlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExvYWRpbmcgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCdXR0b25BY3Rpb24gPSBvdXRwdXQ8SVRhYmVsQnV0dG9uQWN0aW9uRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFNvcnQgPSBvdXRwdXQ8SVNvcnRFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCYXJCdXR0b24gPSBvdXRwdXQ8SUJ1dHRvbkJhckV2ZW50PigpO1xuICByZWFkb25seSBvdXRIb3ZlckJ1dHRvbkFjdGlvbiA9IG91dHB1dDxJSG92ZXJCdXR0b25BY3Rpb25FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0S2V5c1NlbGVjdGVkID0gb3V0cHV0PHsga2V5czogQXJyYXk8YW55PiB9PigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRMb2FkRGF0YUNvbXBsZXRlID0gb3V0cHV0PFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+Pj4oKTtcbiAgcmVhZG9ubHkgb3V0VG90YWxJdGVtID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZERhdGFFcnJvciA9IG91dHB1dDxJSHR0cFJlc3BvbnNlRXJyb3I+KCk7XG5cbiAgLyoqVklFVyBDSElMRCAqL1xuICBwcm90ZWN0ZWQgaGVhZGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignaGVhZGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZm9vdGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyTGVmdEVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2Zvb3RlckxlZnRFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2JvZHlFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUNvbXBvbmVudFJlZiA9IHZpZXdDaGlsZDxWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ+KCdib2R5Q29tcG9uZW50UmVmJyk7XG5cbiAgLyoqSU5KRUNUICovXG4gIHByaXZhdGUgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0S2V5c1NlbGVjdGVkKCk/Lmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5rZXlzU2VsZWN0ZWQudXBkYXRlKChrZXlzKSA9PiBbLi4ua2V5cywgLi4uKHRoaXMuZGVmYXVsdEtleXNTZWxlY3RlZCgpIHx8IFtdKV0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2hvd0Zvb3RlcigpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmV3RGF0YSgpPy5kYXRhKCkubGVuZ3RoKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmFkZEl0ZW1zKHRoaXMubmV3RGF0YSgpPy5kYXRhIGFzIGFueSwgIXRoaXMubmV3RGF0YSgpPy5hZGRUb0xhc3RMaXN0KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEgfHwgdGhpcy5maWx0ZXIoKS5pZ25vcmVDYWxsQXBpQXV0bykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtleVNlYXJjaC5zZXQoZ2V0KHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSwgJ2tleVNlYXJjaCcsICcnKSk7XG4gICAgICAgIHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpLnNldChjbG9uZURlZXAodGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhKSk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcigpPy5maWx0ZXJEYXRhICYmICF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGFbJ2luc3RhbmNlU29ydCddICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSAmJiB0aGlzLnN0b3JlcygpLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKT8uKHNpZ25hbChbLi4udGhpcy5zdG9yZXMoKV0pLCB7IC4uLih0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEgfHwge30pLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkgfHwgW10pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG5cbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzZXQ6IHRoaXMucmVzZXQuYmluZCh0aGlzKSxcbiAgICAgIGNhbGxBcGlCeVNlcnZpY2U6IHRoaXMuY2FsbEFwaUJ5U2VydmljZS5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRTY3JvbGw6IHRoaXMucmVzZXRTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgIGFkZEl0ZW1zOiB0aGlzLmFkZEl0ZW1zLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVJdGVtczogdGhpcy5yZW1vdmVJdGVtcy5iaW5kKHRoaXMpLFxuICAgICAgZ2V0Q291bnQ6IHRoaXMuZ2V0Q291bnQuYmluZCh0aGlzKSxcbiAgICAgIGdldFNjcm9sbENvbnRhaW5lcjogdGhpcy5nZXRTY3JvbGxDb250YWluZXIuYmluZCh0aGlzKSxcbiAgICAgIGhpZGVUb29sQmFyQm90dG9tOiAoKSA9PiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0sXG4gICAgICByZXNldEtleVNlbGVjdGVkOiAoKSA9PiB0aGlzLmtleXNTZWxlY3RlZC5zZXQoW10pLFxuICAgICAgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SW5kZXhSb3cgPSAoZGF0YTogeyB2YWx1ZTogVFlQRV9JVEVNX0RBVEFfVEFCTEUgfSkgPT4ge1xuICAgIHJldHVybiBvZih0aGlzLml0ZW1zKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBkYXRhLnZhbHVlKSArIDEpO1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmJvZHlDb21wb25lbnRSZWYoKSBhcyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGxBcGlCeVNlcnZpY2UoZmlyc3RDYWxsOiBib29sZWFuLCByZXNldEFmdGVyQ2FsbEFwaT86IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaHR0cFJlcXVlc3REYXRhKCkgfHwgdGhpcy5sb2FkaW5nKCkgfHwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuICAgICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlckJ5ICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyQnkgPSB7XG4gICAgICAgICAgZmllbGRHZXRWYWx1ZTogJ3N0b3JlUGFyYW1zQ2FsbEFwaS5pbnN0YW5jZVNvcnQuZmllbGRTb3J0JyxcbiAgICAgICAgICBmaWVsZFVwZGF0ZTogJ1swXScsXG4gICAgICAgICAgc3ViRmllbGRVcGRhdGU6ICdvcmRlcl9ieScsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSAmJiAhZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyVHlwZSAmJiB0aGlzLmluc3RhbmNlU29ydCgpKSB7XG4gICAgICAgIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlclR5cGUgPSB7XG4gICAgICAgICAgZmllbGRHZXRWYWx1ZTogJ3N0b3JlUGFyYW1zQ2FsbEFwaS5pbnN0YW5jZVNvcnQubW9kZScsXG4gICAgICAgICAgZmllbGRVcGRhdGU6ICdbMF0nLFxuICAgICAgICAgIHN1YkZpZWxkVXBkYXRlOiAnb3JkZXJfdHlwZScsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZmlyc3RDYWxsKSB7XG4gICAgICAgIGlmICghcmVzZXRBZnRlckNhbGxBcGkpIHtcbiAgICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KFxuICAgICAgICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi50aGlzLmZha2VSZXNwb25zZUFwaSgpLCBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpIHx8IHt9LCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCB0aGlzLmxvYWRlZExhc3RJdGVtKCksIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICAgIGlmIChmaXJzdENhbGwgJiYgcmVzZXRBZnRlckNhbGxBcGkpIHtcbiAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zdG9yZXMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgfVxuICAgICAgdGhpcy5wYWdpbmdTdG9yZS5zZXQocmVzdWx0LnBhZ2luZyk7XG4gICAgICB0aGlzLnRvdGFsSXRlbUluQmFja2VuZC5zZXQocmVzdWx0LnBhZ2luZz8udG90YWxfaXRlbXMgfHwgMCk7XG4gICAgICB0aGlzLm91dFRvdGFsSXRlbS5lbWl0KHRoaXMudG90YWxJdGVtSW5CYWNrZW5kKCkpO1xuICAgICAgaWYgKCF0aGlzLnBhZ2luZ1N0b3JlKCkpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChcbiAgICAgICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IC4uLnJlc3VsdCwgc3RvcmVQYXJhbXNDYWxsQXBpOiB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpIH0sIHRoaXMucGFnaW5nU3RvcmUoKSB8fCB7fSwgdGhpcy5rZXlTZWFyY2goKSwgdHJ1ZSwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSlcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmFkZEl0ZW1zKGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSB8fCBbXSksIGZhbHNlLCB0cnVlKTtcbiAgICAgIHRoaXMub3V0TG9hZERhdGFDb21wbGV0ZS5lbWl0KHRoaXMuc3RvcmVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgdGhpcy5vdXRMb2FkRGF0YUVycm9yLmVtaXQoZXJyb3IgYXMgSUh0dHBSZXNwb25zZUVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZha2VSZXNwb25zZUFwaSgpOiBUWVBFX09CSkVDVCB7XG4gICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQoZmFsc2UpO1xuICAgIGlmICh0aGlzLmFjdGl2aXR5TG9hZERhdGEoKSA9PT0gJ3Njcm9sbC1pbmZpbml0eScpIHtcbiAgICAgIHRoaXMucGFnaW5nU3RvcmUuc2V0KHt9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuZmFrZVJlc3BvbnNlUGFnaW5nQXBpKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKSB7XG4gICAgaWYgKCF0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIHx8ICF0aGlzLnNob3dGb290ZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGFyZ3VtZW50c1ZhbHVlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSB9ID0gdGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSBhcyBJSHR0cFJlcXVlc3RDb25maWc7XG5cbiAgICB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgc3RvcmVQYXJhbXNDYWxsQXBpOiB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpIH0sIHRoaXMucGFnaW5nU3RvcmUoKSB8fCB7fSwgdGhpcy5rZXlTZWFyY2goKSwgdHJ1ZSwgZmFsc2UsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5jYWxsQXBpKHRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnKTtcblxuICAgIHRoaXMuaXRlbUZvb3Rlci5zZXQoY29udmVydE9iamVjdFRvU2lnbmFsKHJlc3VsdC5kYXRhKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEl0ZW1zKGl0ZW1zOiBUWVBFX0RBVEFfVEFCTEUsIGFkZEZpcnN0OiBib29sZWFuLCBpZ25vcmVIaWdodExpZ2h0PzogYm9vbGVhbiwgaWdub3JlUmVDYWxsRm9vdGVyPzogYm9vbGVhbiwgYXV0b0NvdW50TmV3SXRlbT86IGJvb2xlYW4pIHtcbiAgICBpZiAoIWl0ZW1zKCkgfHwgIWl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zQWRkOiBBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+ID0gW107XG5cbiAgICBpdGVtcygpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmICghdGhpcy5jaGVja0V4aXN0SXRlbShpdGVtKSkge1xuICAgICAgICBpdGVtc0FkZC5wdXNoKGl0ZW0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhpZ2h0TGlnaHQpIHtcbiAgICAgICAgICB0aGlzLmhhc0l0ZW1IaWdodExpZ2h0LnNldCh0cnVlKTtcbiAgICAgICAgICBpdGVtLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgc3BlY2lmaWNIaWdodExpZ2h0OiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkRmlyc3QpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZSgoZGF0YSkgPT4gW2l0ZW0sIC4uLmRhdGFdKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy51cGRhdGUoKGRhdGEpID0+IFtpdGVtLCAuLi5kYXRhXSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoKGRhdGEpID0+IFsuLi5kYXRhLCBpdGVtXSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZSgoZGF0YSkgPT4gWy4uLmRhdGEsIGl0ZW1dKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoYXV0b0NvdW50TmV3SXRlbSAmJiBpdGVtc0FkZC5sZW5ndGgpIHtcbiAgICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnVwZGF0ZSgodmFsdWUpID0+IHZhbHVlICsgaXRlbXNBZGQubGVuZ3RoKTtcbiAgICB9XG4gICAgaWYgKCFpZ25vcmVIaWdodExpZ2h0KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaXRlbXNBZGQuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljSGlnaHRMaWdodDogZmFsc2UgfSkpKTtcbiAgICAgICAgdGhpcy5oYXNJdGVtSGlnaHRMaWdodC5zZXQoZmFsc2UpO1xuICAgICAgfSwgdGhpcy50aW1lSGlnaGxpZ2hOZXdJdGVtKCkpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gICAgaWYgKCFpZ25vcmVSZUNhbGxGb290ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tFeGlzdEl0ZW0oaXRlbU5ldzogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMoKS5maW5kKChpdGVtKSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtpdGVtTmV3KClbdGhpcy5maWVsZEtleSgpXX1gKSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlSXRlbXMoa2V5czogQXJyYXk8dW5rbm93bj4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuICAgIGlmICghdGhpcy5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdGhpcy5pdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICAgIGxldCBpc1VwZGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWAgPT09IGAke2tleX1gKSB7XG4gICAgICAgICAgICBpc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXNVcGRhdGUgPyBuZXdJdGVtcyA6IGl0ZW1zO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCA9PT0gYCR7a2V5fWApIHtcbiAgICAgICAgICAgIGlzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1VwZGF0ZSA/IG5ld0l0ZW1zIDogaXRlbXM7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCF0aGlzLmtleXNTZWxlY3RlZCgpIHx8ICF0aGlzLmtleXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC51cGRhdGUoKGtleXMpID0+IGtleXMuZmlsdGVyKChrZXlTZWxlY3RlZCkgPT4ga2V5U2VsZWN0ZWQgIT09IGtleSkpO1xuICAgIH0pO1xuICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnVwZGF0ZSgodmFsdWUpID0+IHZhbHVlIC0ga2V5cy5sZW5ndGgpO1xuICAgIGF3YWl0IHRoaXMuY2hlY2tTY3JvbGwoKTtcbiAgICBpZiAoIWlnbm9yZVJlQ2FsbEZvb3Rlcikge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCk7XG4gICAgfVxuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3VudCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYWdpbmdTdG9yZSgpPy50b3RhbF9pdGVtcyB8fCB0aGlzLml0ZW1zKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLml0ZW1zKCkubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTW9yZVN1Y2Nlc3MoZGF0YTogV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4pIHtcbiAgICB0aGlzLmFkZEl0ZW1zKGRhdGEsIGZhbHNlKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUFsbENoZWNrZWQoKSB7XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlQ2hlY2tlZEFsbEl0ZW1zKGV2ZW50OiBJQ2hlY2tib3hFdmVudCkge1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoXG4gICAgICAgIHRoaXMuaXRlbXMoKVxuICAgICAgICAgIC5maWx0ZXIoYXN5bmMgKGl0ZW0pID0+ICEoYXdhaXQgdGhpcy5jaGVja0NhbmNlbENvbmRpdGlvbkNoZWNrZWRJdGVtKGl0ZW0pKSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gKVxuICAgICAgKTtcbiAgICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrQ2FuY2VsQ29uZGl0aW9uQ2hlY2tlZEl0ZW0oaXRlbTogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KSB7XG4gICAgbGV0IGlzQ2FuY2VsQ2hlY2sgPSBmYWxzZTtcblxuICAgIGlmICghaXNDYW5jZWxDaGVjayAmJiB0aGlzLmhlYWRlckxlZnQoKS5sZW5ndGggJiYgdGhpcy5oZWFkZXJMZWZ0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbikge1xuICAgICAgaXNDYW5jZWxDaGVjayA9IChhd2FpdCBsYXN0VmFsdWVGcm9tKCh0aGlzLmhlYWRlckxlZnQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIGFzIGFueSkoeyBpdGVtOiBpdGVtKCkgfSkpKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ2FuY2VsQ2hlY2sgJiYgdGhpcy5oZWFkZXJSaWdodCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlclJpZ2h0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbikge1xuICAgICAgaXNDYW5jZWxDaGVjayA9IChhd2FpdCBsYXN0VmFsdWVGcm9tKCh0aGlzLmhlYWRlclJpZ2h0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiBhcyBhbnkpKHsgaXRlbTogaXRlbSgpIH0pKSkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzQ2FuY2VsQ2hlY2s7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUl0ZW1DaGVja2VkKGV2ZW50OiBJQ2hlY2tib3hJdGVtLCBpdGVtOiBUWVBFX09CSkVDVCkge1xuICAgIGNvbnN0IGtleSA9IGl0ZW1bdGhpcy5maWVsZEtleSgpXTtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldCh0aGlzLmtleXNTZWxlY3RlZCgpKTtcblxuICAgIGtleXMuYWRkKGtleSk7XG4gICAgaWYgKCFldmVudC5jaGVja2VkKSB7XG4gICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoQXJyYXkuZnJvbShrZXlzKSk7XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckNoYW5nZVNvcnQoc29ydDogSVNvcnQpIHtcbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gdGhpcy5oZWFkZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwO1xuICAgIGlmICh0aGlzLmluc3RhbmNlU29ydCAmJiB0aGlzLmluc3RhbmNlU29ydCgpPy5maWVsZFNvcnQgIT09IHNvcnQuZmllbGRTb3J0KSB7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydCgpPy5yZXNldCgpO1xuICAgIH1cbiAgICB0aGlzLmluc3RhbmNlU29ydC5zZXQoc29ydCk7XG4gICAgaWYgKHRoaXMuc29ydExvY2FsKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlclNvcnRMb2NhbChzb3J0LCBzY3JvbGxMZWZ0KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSk7XG4gICAgdGhpcy5vdXRTb3J0LmVtaXQoe1xuICAgICAgc29ydDogc29ydCxcbiAgICAgIG9uU29ydFN1Y2Nlc3M6ICgpID0+IHRoaXMub25Tb3J0U3VjY2VzcyhzY3JvbGxMZWZ0KSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgICAgdGhpcy5vblNvcnRTdWNjZXNzKHNjcm9sbExlZnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVyU29ydExvY2FsKHNvcnQ6IElTb3J0LCBzY3JvbGxMZWZ0OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpICYmIHRoaXMuc3RvcmVzKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLml0ZW1zLnNldCh0aGlzLmZpbHRlck9yU29ydExvY2FsKCk/LihzaWduYWwoWy4uLnRoaXMuc3RvcmVzKCldKSwgeyAuLi50aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpLCBpbnN0YW5jZVNvcnQ6IHNvcnQgfSkgfHwgW10pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgZmllbGRTb3J0LCBtb2RlIH0gPSBzb3J0O1xuXG4gICAgdGhpcy5pdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICBpdGVtcy5zb3J0KChpdGVtQSwgaXRlbUIpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlMSA9IG1vZGUgPT09ICdhc2MnID8gaXRlbUEoKVtmaWVsZFNvcnRdIDogaXRlbUIoKVtmaWVsZFNvcnRdO1xuICAgICAgICBsZXQgdmFsdWUyID0gbW9kZSA9PT0gJ2FzYycgPyBpdGVtQigpW2ZpZWxkU29ydF0gOiBpdGVtQSgpW2ZpZWxkU29ydF07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZTEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZTIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmFsdWUxID0gZGVsZXRlVW5pY29kZSh2YWx1ZTEpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgdmFsdWUyID0gZGVsZXRlVW5pY29kZSh2YWx1ZTIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUxID09PSB2YWx1ZTIpIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTEgPiB2YWx1ZTIgPyAxIDogLTE7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgfSk7XG4gICAgdGhpcy5vblNvcnRTdWNjZXNzKHNjcm9sbExlZnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xNb3JlU2VsZWN0SXRlbShmdW5jdGlvbkNvbnRyb2w6IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbSA9IGZ1bmN0aW9uQ29udHJvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWRNb3JlSXRlbShldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5rZXkgfHwgIXRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0/LnJlc2V0KCk7XG5cbiAgICBjb25zdCBwZXJQYWdlID0gTnVtYmVyKGV2ZW50LmtleSkudmFsdWVPZigpO1xuICAgIGNvbnN0IGN1cnJlbnRQZXJQYWdlID0gTnVtYmVyKHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKHBlclBhZ2UpKS52YWx1ZU9mKCk7XG4gICAgY29uc3QgaXNQYWdpbmdOdW1iZXIgPSB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LnBhZ2luZ051bWJlcjtcblxuICAgIGlmIChjdXJyZW50UGVyUGFnZSA+IHBlclBhZ2UgfHwgdGhpcy5pdGVtcy5sZW5ndGggPj0gcGVyUGFnZSkge1xuICAgICAgaWYgKCFpc1BhZ2luZ051bWJlcikge1xuICAgICAgICB0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShjdXJyZW50UGVyUGFnZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoXG4gICAgICAgIHRoaXMuaXRlbXMoKVxuICAgICAgICAgIC5zbGljZSgwLCBwZXJQYWdlKVxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWApXG4gICAgICApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUsIHRydWUpO1xuICAgIGNvbnN0IHN1YiA9IHRoaXMub3V0TG9hZERhdGFDb21wbGV0ZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAoIWlzUGFnaW5nTnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQZXJQYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChcbiAgICAgICAgdGhpcy5pdGVtcygpXG4gICAgICAgICAgLnNsaWNlKDAsIHBlclBhZ2UpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm91dExvYWREYXRhRXJyb3Iuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQZXJQYWdlKTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShwZXJQYWdlOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFyZ3VtZW50c1ZhbHVlID0gdGhpcy5odHRwUmVxdWVzdERhdGEoKT8uYXJndW1lbnRzVmFsdWU7XG5cbiAgICBpZiAoIWFyZ3VtZW50c1ZhbHVlIHx8ICF0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgIHJldHVybiAnLTEnO1xuICAgIH1cbiAgICBjb25zdCBrZXlQZXJQYWdlID0gdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5rZXlQZXJQYWdlIHx8ICdwZXJfcGFnZSc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50c1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYXJndW1lbnQgPSBhcmd1bWVudHNWYWx1ZVtpXTtcblxuICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgSHR0cFBhcmFtcyAmJiBhcmd1bWVudC5oYXMoa2V5UGVyUGFnZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBnZXQ8dW5rbm93bj4oYXJndW1lbnQsIGtleVBlclBhZ2UsICcyNScgYXMgYW55KTtcblxuICAgICAgICBhcmd1bWVudCA9IGFyZ3VtZW50LnNldChrZXlQZXJQYWdlLCBwZXJQYWdlKTtcbiAgICAgICAgc2V0KGFyZ3VtZW50c1ZhbHVlLCBgJHtpfWAgYXMgYW55LCBhcmd1bWVudCk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQZXJQYWdlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3QgJiYgT2JqZWN0LmtleXMoYXJndW1lbnQpLmluY2x1ZGVzKGtleVBlclBhZ2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQZXJQYWdlID0gZ2V0KGFyZ3VtZW50LCBrZXlQZXJQYWdlLCAnMjUnKTtcblxuICAgICAgICBzZXQoYXJndW1lbnQsIGtleVBlclBhZ2UsIHBlclBhZ2UpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50UGVyUGFnZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJy0xJztcbiAgfVxuXG4gIHByaXZhdGUgb25Tb3J0U3VjY2VzcyhzY3JvbGxMZWZ0OiBudW1iZXIpIHtcbiAgICB0aGlzLnJlc2V0U2Nyb2xsKHNjcm9sbExlZnQsIDApO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQnV0dG9uQ2xpY2sodHlwZTogJ2J1dHRvbicgfCAnYnV0dG9uLWRyb3Bkb3duJywgYnV0dG9uRHJvcGRvd25EYXRhOiBhbnksIGJ1dHRvbjogSUJ1dHRvbikge1xuICAgIC8vIGJ1dHRvbk9yaWdpbiBjaOG7iSBz4butIGThu6VuZyBraGkgZMO5bmcgYnV0dG9uQWN0aW9ucyBjw7MgYnV0dG9uLWRyb3Bkb3duXG4gICAgaWYgKHR5cGUgPT09ICdidXR0b24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRDbGlja0J1dHRvbkFjdGlvbi5lbWl0KHsgaXRlbTogdGhpcy5pdGVtT2ZJbmRleEhvdmVyLCBidXR0b246IGJ1dHRvbiB9KTtcbiAgICB9XG4gICAgdGhpcy5vdXRDbGlja0J1dHRvbkFjdGlvbi5lbWl0KHsgaXRlbTogdGhpcy5pdGVtT2ZJbmRleEhvdmVyLCBidXR0b24sIGJ1dHRvbkRyb3Bkb3duRGF0YSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQmFyQnV0dG9uQ2xpY2soYnV0dG9uOiBJQnV0dG9uKSB7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+ID0gW107XG5cbiAgICB0aGlzLmtleXNTZWxlY3RlZCgpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXMoKS5maW5kKChpdGVtKSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtrZXl9YCk7XG5cbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5vdXRDbGlja0JhckJ1dHRvbi5lbWl0KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGl0ZW1zLFxuICAgICAga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSxcbiAgICAgIGhpZGRlbkJhckJ1dHRvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQnV0dG9uRHJvcGRvd25FdmVudChldmVudE5hbWU6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIHRoaXMuaGFzQWN0aW9uQnV0dG9uRHJvcGRvd25Db250ZW50LnNldCh0cnVlKTtcbiAgICBpZiAoZXZlbnROYW1lID09PSAncmVtb3ZlJyB8fCBldmVudE5hbWUgPT09ICdtb3VzZWxlYXZlLWNvbnRlbnQnKSB7XG4gICAgICB0aGlzLmhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudC5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRJbmRleEhvdmVyKGU6IEV2ZW50LCBpdGVtOiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghdGhpcy5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5yZXNldEluZGV4SG92ZXIoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1PZkluZGV4SG92ZXIgPSBpdGVtO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKGU/OiBFdmVudCkge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleEl0ZW1Ib3ZlciA9IHRoaXMuaXRlbU9mSW5kZXhIb3ZlcjtcblxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0oKSk7XG4gICAgdGhpcy50aW1lb3V0TGVhdmVJdGVtLnNldChcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pdGVtT2ZJbmRleEhvdmVyICYmIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciAhPT0gY3VycmVudEluZGV4SXRlbUhvdmVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0SW5kZXhIb3ZlcihlPzogRXZlbnQpIHtcbiAgICBlPy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5oYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1PZkluZGV4SG92ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlTGVhdmVDb250YWluZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUVudGVySGVhZGVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMubW91c2VFbnRlckhlYWRlci5zZXQodHJ1ZSk7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUxlYXZlSGVhZGVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMubW91c2VFbnRlckhlYWRlci5zZXQoZmFsc2UpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VFbnRlckZvb3RlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gICAgaWYgKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpIHtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlTGVhdmVGb290ZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpIHtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxIZWFkZXIoZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghdGhpcy5tb3VzZUVudGVySGVhZGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKHRoaXMuYm9keUVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsTGVmdDtcbiAgICBpZiAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkpIHtcbiAgICAgICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNjcm9sbEJvZHkoZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLm1vdXNlRW50ZXJIZWFkZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAodGhpcy5oZWFkZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgaWYgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpKSB7XG4gICAgICAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb3R0b20oZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmxvYWRpbmcoKSB8fCB0aGlzLmFjdGl2aXR5TG9hZERhdGEoKSAhPT0gJ3Njcm9sbC1pbmZpbml0eScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRMb2FkTW9yZS5lbWl0KHsgbG9hZE1vcmVTdWNjZXNzOiB0aGlzLmxvYWRNb3JlU3VjY2Vzcy5iaW5kKHRoaXMpIH0pO1xuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZShmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdpbmdTdG9yZS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLihkYXRhIHx8IHt9KSwgcGFnZSB9KSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFNjcm9sbChzY3JvbGxQb3NpdGlvbkxlZnQ/OiBudW1iZXIsIHNjcm9sbFBvc2l0aW9uVG9wPzogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpKSB7XG4gICAgICAodGhpcy5oZWFkZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxQb3NpdGlvbkxlZnQgfHwgMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuQm9keUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsUG9zaXRpb25Ub3AgfHwgMDtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbFBvc2l0aW9uTGVmdCB8fCAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkpIHtcbiAgICAgICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbFBvc2l0aW9uTGVmdCB8fCAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXQoY2xlYXJTb3J0PzogYm9vbGVhbikge1xuICAgIGlmIChjbGVhclNvcnQpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VTb3J0KCk/LnJlc2V0KCk7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydC5zZXQodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgdGhpcy5mYWtlUmVzcG9uc2VBcGkoKTtcbiAgICB0aGlzLnJlc2V0U2Nyb2xsKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrU2Nyb2xsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhc1Njcm9sbCA9IHRoaXMuaGFzU2Nyb2xsKCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRpbWVyKDUwMClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLkJvZHlFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQodGhpcy5Cb2R5RWxlbWVudC5zY3JvbGxIZWlnaHQgPiB0aGlzLkJvZHlFbGVtZW50Lm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYXNTY3JvbGwgJiYgIXRoaXMuaGFzU2Nyb2xsKCkpIHtcbiAgICAgICAgICAgIHRoaXMub3V0U2Nyb2xsSXNHb25lLmVtaXQoe30pO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbHRlck9yU29ydExvY2FsKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBCb2R5RWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYm9keUVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0oKSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGxcIj5cbiAgQGlmICghaWdub3JlQmFyKCkpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHJlbGF0aXZlIHotWzFdIGJvdHRvbS0wIGxlZnQtMCB3LWZ1bGwgYmctd2hpdGUgbGlicy11aS10YWJsZS1zaGFkb3ctYm90dG9tIHt7IGNsYXNzQmFySW5jbHVkZSgpIH19XCJcbiAgICAgIFtjbGFzcy5weC1bMTZweF1dPVwia2V5c1NlbGVjdGVkKCkubGVuZ3RoIHx8IGxhYmVsQmFyTm9TZWxlY3RJdGVtKClcIlxuICAgICAgW2NsYXNzLnB5LVs2cHhdXT1cImtleXNTZWxlY3RlZCgpLmxlbmd0aCB8fCBsYWJlbEJhck5vU2VsZWN0SXRlbSgpXCJcbiAgICAgIChtb3VzZWVudGVyKT1cInJlc2V0SW5kZXhIb3ZlcigkZXZlbnQpXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJkaXYubGlicy11aS10YWJsZS1iYXItbGVmdFwiPjwvbmctY29udGVudD5cbiAgICAgIEBpZiAoIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBsYWJlbEJhck5vU2VsZWN0SXRlbSgpKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInt7IGNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSA/PyAncHgtWzEycHhdIHB5LVs1cHhdJyB9fVwiXG4gICAgICAgICAgW2lubmVySHRtbF09XCJsYWJlbEJhck5vU2VsZWN0SXRlbSgpIHwgdHJhbnNsYXRlOiB7IHZhbHVlOiB0b3RhbEl0ZW1EaXNwbGF5KCkgfVwiPjwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChrZXlzU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHBsLVsxMnB4XVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBoLWZ1bGwgbXQtWy0ycHhdXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZVxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8IGRpc2FibGVDaGVja2JveCgpXCJcbiAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQWxsQ2hlY2tlZCgpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg1bSB0ZXh0LVsjMDcxNjMxXSBtci1bOHB4XSB7eyBjbGFzc0xhYmVsQmFyQnV0dG9ucygpIH19XCI+XG4gICAgICAgICAgICB7eyBsYWJlbEJhckJ1dHRvbnMoKSB8IHRyYW5zbGF0ZTogeyB2YWx1ZToga2V5c1NlbGVjdGVkKCkubGVuZ3RoIH0gfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7XG4gICAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaWdub3JlQXJyb3c6IHRydWUsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiAyMDQ4LFxuICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZTogJyF3LVsxMjFweF0nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBtb2RlOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdNb3JlSXRlbSgpXCJcbiAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCI1XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCIhdy1bMTZweF0gaC1bMTZweF0gbXItWzhweF1cIlxuICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZE1vcmVJdGVtKCRldmVudClcIlxuICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sTW9yZVNlbGVjdEl0ZW0oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wIG0tMCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidiZWZvcmU6IXRleHQtWzE2cHhdIGxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCBtci1bNnB4XSdcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cInsgY29uZmlnOiB7IGNvbnRlbnQ6ICdpMThuX21vcmVfc2VsZWN0JyB9IH1cIlxuICAgICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1bMTZweF0gbGlicy11aS1ib3JkZXItbGVmdC1nZW5lcmFsIG1sLVsxNnB4XVwiPjwvZGl2PlxuICAgICAgICAgIEBpZiAoYmFyQnV0dG9ucygpPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBiYXJCdXR0b25zKCk7IHRyYWNrIGJ1dHRvbikge1xuICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbExhYmVsID0gYnV0dG9uLmxhYmVsIHx8ICcgJztcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImJ1dHRvbi50eXBlIHx8ICdidXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiYnV0dG9uLmNsYXNzSWNvbkxlZnQgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbnN0SHRtbExhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckJhckJ1dHRvbkNsaWNrKGJ1dHRvbilcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJkaXYubGlicy11aS10YWJsZS1iYXItcmlnaHRcIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIH1cblxuICA8ZGl2XG4gICAgI3RhYmxlQ29udGFpbmVyRWxlbWVudFJlZlxuICAgIGNsYXNzPVwibGlicy11aS10YWJsZSBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgcmVsYXRpdmUge3sgY2xhc3NUYWJsZUNvbnRhaW5lckluY2x1ZGUoKSB9fVwiXG4gICAgW2NsYXNzLnB4LVsxNnB4XV09XCIhaWdub3JlQmFyKClcIlxuICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZXJNb3VzZUxlYXZlQ29udGFpbmVyKCRldmVudClcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJlbGF0aXZlIHctZnVsbCBzaHJpbmstMFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImhlYWRlckVsZW1lbnRSZWYub2Zmc2V0SGVpZ2h0XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNoZWFkZXJFbGVtZW50UmVmXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIFtvcHRpb25zXT1cInsgc2Nyb2xsYmFyV2lkdGg6IDAgfVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1ib3R0b20tZGFzaGVkLWdlbmVyYWxdPVwiIWhhc0l0ZW1IaWdodExpZ2h0KCkgJiYgaXNEYXNoQm9yZGVyKClcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWxdPVwiIWhhc0l0ZW1IaWdodExpZ2h0KCkgJiYgIWlzRGFzaEJvcmRlcigpXCJcbiAgICAgICAgW2NsYXNzLiFoaWRkZW5dPVwiIWl0ZW1zKCkubGVuZ3RoICYmIGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpXCJcbiAgICAgICAgW2NsYXNzXT1cImNsYXNzSGVhZGVyQ29udGFpbmVyKClcIlxuICAgICAgICAob3V0U2Nyb2xsKT1cImhhbmRsZXJTY3JvbGxIZWFkZXIoJGV2ZW50KVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJNb3VzZUVudGVySGVhZGVyKCRldmVudClcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVyTW91c2VMZWF2ZUhlYWRlcigkZXZlbnQpXCI+XG4gICAgICAgIEBpZiAoaGVhZGVyTGVmdCgpLmxlbmd0aCkge1xuICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNsYXNzSGVhZGVyTGVmdENvbnRhaW5lcigpXCI+XG4gICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyTGVmdCgpOyB0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmOyBjb250ZXh0OiB7IGhlYWRlckl0ZW06IGhlYWRlciwgaXNIZWFkZXJMZWZ0OiB0cnVlIH1cIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJSZWY7IGNvbnRleHQ6IHsgaGVhZGVySXRlbTogaGVhZGVyLCBpc0hlYWRlckxlZnQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgQGlmIChzaG93Rm9vdGVyKCkgJiYgaXRlbUZvb3RlcigpICYmIGN1c3RvbVBvc2l0aW9uRm9vdGVyKCkgPT09ICd0b3AnKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVGb290ZXJSZWZcIiAvPlxuICAgIH1cbiAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsIG92ZXJmbG93LXgtaGlkZGVuIGJnLXdoaXRlIHt7IGNsYXNzQm9keUluY2x1ZGUoKSB8fCAnJyB9fVwiPlxuICAgICAgPGRpdlxuICAgICAgICAjYm9keUVsZW1lbnRSZWZcbiAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LWZ1bGwgcmVsYXRpdmVcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICAob3V0U2Nyb2xsKT1cImhhbmRsZXJTY3JvbGxCb2R5KCRldmVudClcIlxuICAgICAgICAob3V0U2Nyb2xsQm90dG9tKT1cImhhbmRsZXJTY3JvbGxCb3R0b20oJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKGl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICAgICAgPHZpcnR1YWwtc2Nyb2xsZXJcbiAgICAgICAgICAgICNib2R5Q29tcG9uZW50UmVmXG4gICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXMoKVwiXG4gICAgICAgICAgICBbZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXNdPVwiZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImgtZnVsbFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aCA+IChib2R5RWxlbWVudFJlZiA/IGJvZHlFbGVtZW50UmVmLnNjcm9sbFdpZHRoIDogMCkgPyBoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgIFtwYXJlbnRTY3JvbGxdPVwiYm9keUVsZW1lbnRSZWZcIlxuICAgICAgICAgICAgW2J1ZmZlckFtb3VudF09XCJidWZmZXJBbW91bnQoKVwiPlxuICAgICAgICAgICAgQGZvciAoZGF0YSBvZiBib2R5Q29tcG9uZW50UmVmLnZpZXdQb3J0SXRlbXM7IHRyYWNrIGRhdGEoKSkge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgI2VsZW1lbnRIb3ZlclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJnLVsjZjNmY2ZjXV09XCJkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItdG9wLTFweC0zNmQzZDNdPVwiZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCAmJiAkZmlyc3QgJiYgIWlnbm9yZUJvcmRlckl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWJvdHRvbS0xcHgtMzZkM2QzXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHQgJiYgIWlnbm9yZUJvcmRlckl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICBkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0IHx8ICgkbGFzdCAmJiBpZ25vcmVCb3JkZXJJdGVtTGFzdCgpKVxuICAgICAgICAgICAgICAgICAgICA/ICdsaWJzLXVpLWJvcmRlci1yYWRpdXMtYm90dG9tLWxlZnQtNHB4IGxpYnMtdWktYm9yZGVyLXJhZGl1cy1ib3R0b20tcmlnaHQtNHB4J1xuICAgICAgICAgICAgICAgICAgICA6IGlnbm9yZUJvcmRlckl0ZW0oKVxuICAgICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgICA6IGlzRGFzaEJvcmRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZGFzaGVkLWdlbmVyYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCdcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmOGY5ZmFdXT1cIml0ZW1PZkluZGV4SG92ZXIgPT09IGRhdGEgJiYgIWRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNldEluZGV4SG92ZXIoJGV2ZW50LCBkYXRhKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwicmVzZXRJbmRleEhvdmVyV2hlbk1vdXNlTGVhdmUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIEBpZiAoaGVhZGVyTGVmdCgpLmxlbmd0aCB8fCBoZWFkZXJSaWdodCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaGVhZGVyTGVmdCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggc3RpY2t5IHRvcC0wIGxlZnQtMCB6LVsxXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy13aGl0ZV09XCIhZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2YzZmNmY11dPVwiZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyTGVmdCgpOyB0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggcHgtWzEycHhdIHB5LVs4cHhdIHt7IGhlYWRlci5pZ25vcmVCb3JkZXJSaWdodCA/ICcnIDogJ2xpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwnIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2Y4ZjlmYV1dPVwiaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJMZWZ0IHx8IGZhbHNlIDogaGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aCA6IGhlYWRlckxlZnQoKSA6IGhlYWRlclJpZ2h0KCkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHsgd2lkdGg6ICc1MHB4JywgJ2ZsZXgtc2hpcmsnOiAnMCcsIHBhZGRpbmc6ICc4cHgnIH0gOiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlQm9keVJlZjsgY29udGV4dDogeyBoZWFkZXI6IGhlYWRlciwgZGF0YTogZGF0YSB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGhlYWRlciBvZiBoZWFkZXJSaWdodCgpOyB0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCBweC1bMTJweF0gcHktWzhweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJSaWdodCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8geyB3aWR0aDogJzUwcHgnLCAnZmxleC1zaGlyayc6ICcwJywgcGFkZGluZzogJzhweCcgfSA6IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaGVhZGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmOyBjb250ZXh0OiB7IGhlYWRlcjogaGVhZGVyLCBkYXRhOiBkYXRhIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCkgJiYgZGF0YSgpLnNwZWNpZmljRXhwYW5kICYmIGRhdGEoKVtjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5maWVsZEdldERhdGFFeHBhbmQgfHwgJ3NwZWNpZmljRGF0YUV4cGFuZCddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uY3NzV3JhcHBlciB8fCAnZmxleCB3LWZ1bGwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXRhRXhwYW5kIG9mIGRhdGEoKVtjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5maWVsZEdldERhdGFFeHBhbmQgfHwgJ3NwZWNpZmljRGF0YUV4cGFuZCddKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cImRhdGFFeHBhbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBoLVsxMDBweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb2RhdGFSZWZcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3ZpcnR1YWwtc2Nyb2xsZXI+XG4gICAgICAgIH0gQGVsc2UgaWYgKCFsb2FkaW5nKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RpY2t5IGxlZnQtMCB0b3AtMCB6LVsxXSBoLVtjYWxjKDEwMCUtMTBweCldIHctZnVsbFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlTm9kYXRhUmVmXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKHNob3dTY3JvbGxUYWJsZVBpbm5lZElmTm9EYXRhKCkpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBoLVsxcHhdIGJnLXRyYW5zcGFyZW50IHRvcC0wIGxlZnQtMCB6LVsxXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoXCI+PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGlmIChzaG93Rm9vdGVyKCkgJiYgaXRlbUZvb3RlcigpICYmIGN1c3RvbVBvc2l0aW9uRm9vdGVyKCkgPT09ICdib3R0b20nKSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUZvb3RlclJlZlwiIC8+XG4gICAgICB9XG5cbiAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSB3LWZ1bGwgaC1mdWxsIHotWzJdIGZsZXggaXRlbXMtY2VudGVyIGNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zcGlubmVyIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChhY3Rpdml0eUxvYWREYXRhKCkgPT09ICdjbGljay1wYWdpbmF0aW9uJykge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIG10LVsxMnB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBhZ2luYXRpb25cbiAgICAgICAgICBbbW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZV09XCJwYWdpbmF0aW9uU2V0dGluZygpPy5tb2RlRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlIHx8ICdib3R0b20nXCJcbiAgICAgICAgICBbY2xhc3NEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2VdPVwicGFnaW5hdGlvblNldHRpbmcoKT8uY2xhc3NEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UgfHwgJydcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVJdGVtXT1cInBhZ2luYXRpb25TZXR0aW5nKCk/LmNsYXNzSW5jbHVkZUl0ZW0gfHwgJydcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVDb250YWluZXJdPVwicGFnaW5hdGlvblNldHRpbmcoKT8uY2xhc3NJbmNsdWRlQ29udGFpbmVyIHx8ICchaXRlbXMtZW5kJ1wiXG4gICAgICAgICAgW2Rpc2FibGVdPVwicGFnaW5hdGlvblNldHRpbmcoKT8uZGlzYWJsZSB8fCBsb2FkaW5nKCkgfHwgIWl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICBbbnVtYmVyUGFnZURpc3BhbHldPVwicGFnaW5hdGlvblNldHRpbmcoKT8ubnVtYmVyUGFnZURpc3BhbHkgfHwgNVwiXG4gICAgICAgICAgW3Nob3dUb3RhbFBhZ2VdPVwicGFnaW5hdGlvblNldHRpbmcoKT8uc2hvd1RvdGFsUGFnZSB8fCBmYWxzZVwiXG4gICAgICAgICAgW3Nob3dJbnB1dEdvdG9QYWdlXT1cInBhZ2luYXRpb25TZXR0aW5nKCk/LnNob3dJbnB1dEdvdG9QYWdlIHx8IGZhbHNlXCJcbiAgICAgICAgICBbdG90YWxJdGVtc109XCJwYWdpbmdTdG9yZSgpPy50b3RhbF9pdGVtcyB8fCAocGFnaW5nU3RvcmUoKT8udG90YWxfcGFnZXMgfHwgMCkgKiAocGFnaW5nU3RvcmUoKT8ucGVyX3BhZ2UgfHwgMClcIlxuICAgICAgICAgIFtwZXJQYWdlXT1cInBhZ2luZ1N0b3JlKCk/LnBlcl9wYWdlIHx8IDBcIlxuICAgICAgICAgIFtjdXJyZW50UGFnZV09XCJwYWdpbmdTdG9yZSgpPy5wYWdlIHx8IDBcIlxuICAgICAgICAgIChvdXRQYWdlU2VsZWN0KT1cImhhbmRsZXJDaGFuZ2VQYWdlKCRldmVudClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgI3RlbXBsYXRlSGVhZGVyUmVmXG4gIGxldC1oZWFkZXI9XCJoZWFkZXJJdGVtXCJcbiAgbGV0LWlzSGVhZGVyTGVmdD1cImlzSGVhZGVyTGVmdFwiPlxuICA8ZGl2XG4gICAgW2NsYXNzXT1cIidyZWxhdGl2ZSBmbGV4ICcgKyAoaGVhZGVyLnBhZGRpbmdMZWZ0UmlnaHRIZWFkZXJDb250YWluZXIgPz8gJyBweC1bMTJweF0gJykgKyAoaXNIZWFkZXJMZWZ0ICYmICFoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnIGxpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwgJyA6ICcgJykgKyAnIGxpYnMtdWktdGFibGUtaGVhZGVyLWNvbCAnXCJcbiAgICBbY2xhc3MuZmxleC1jb2xdPVwiaGVhZGVyLnJvd3NDb25maWdcIlxuICAgIFtjbGFzcy5weS1bOHB4XV09XCIhaGVhZGVyLmlnbm9yZVB5RGVmYXVsdFwiXG4gICAgW25nU3R5bGVdPVwiXG4gICAgICAoaGVhZGVyIHwgTGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTogKGlzSGVhZGVyTGVmdCA/IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJMZWZ0IHx8IGZhbHNlIDogaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyKCk/LmhlYWRlclJpZ2h0IHx8IGZhbHNlKSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8geyB3aWR0aDogJzUwcHgnLCAnZmxleC1zaGlyayc6ICcwJywgcGFkZGluZzogJzhweCcgfSA6IHt9KVxuICAgIFwiXG4gICAgW25nQ2xhc3NdPVwiaGVhZGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICBAaWYgKCFoZWFkZXIucm93c0NvbmZpZykge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyQ29udGVudFJlZjsgY29udGV4dDogeyBoZWFkZXJJdGVtOiBoZWFkZXIsIGlzQ29sUmVuZGVyOiBmYWxzZSwgaXNIZWFkZXJMZWZ0OiBpc0hlYWRlckxlZnQgfVwiIC8+XG4gICAgfVxuICAgIEBpZiAoaGVhZGVyLnJvd3NDb25maWc7IGFzIHJvd3NDb25maWcpIHtcbiAgICAgIEBmb3IgKHJvdyBvZiByb3dzQ29uZmlnLnJvd3M7IHRyYWNrIHJvdykge1xuICAgICAgICA8ZGl2IFtjbGFzc109XCJyb3cuY2xhc3NSb3dcIj5cbiAgICAgICAgICBAZm9yIChjb2wgb2Ygcm93LmNvbHM7IHRyYWNrIGNvbCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyQ29udGVudFJlZjsgY29udGV4dDogeyBoZWFkZXJJdGVtOiBjb2wsIGlzQ29sUmVuZGVyOiB0cnVlLCBpc0hlYWRlckxlZnQ6IGlzSGVhZGVyTGVmdCB9XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3RlbXBsYXRlSGVhZGVyQ29udGVudFJlZlxuICBsZXQtaGVhZGVyPVwiaGVhZGVySXRlbVwiXG4gIGxldC1pc0NvbFJlbmRlcj1cImlzQ29sUmVuZGVyXCJcbiAgbGV0LWlzSGVhZGVyTGVmdD1cImlzSGVhZGVyTGVmdFwiPlxuICA8ZGl2XG4gICAgI2l0ZW1IZWFkZXJSZWZcbiAgICBjbGFzcz1cImZsZXggbGlicy11aS1mb250LWg2bSBtaW4taC1bMThweF0gdGV4dC1bIzZhNzM4M10gbWF4LXctZnVsbFwiXG4gICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY29udGVudEhlYWRlckFsaWduQ2VudGVyID8/IHRydWVcIlxuICAgIFtjbGFzcy5qdXN0aWZ5LWVuZF09XCJoZWFkZXIuY29udGVudEhlYWRlckp1c3RpZnlDb250ZW50RW5kXCJcbiAgICBbY2xhc3Mudy1mdWxsXT1cImhlYWRlci5pc1Nob3dJbmRleE9uUm93XCJcbiAgICBbbmdTdHlsZV09XCJcbiAgICAgIGlzQ29sUmVuZGVyXG4gICAgICAgID8gKGhlYWRlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IChpc0hlYWRlckxlZnQgPyBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyTGVmdCB8fCBmYWxzZSA6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJSaWdodCB8fCBmYWxzZSkgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogaGVhZGVyTGVmdCgpIDogaGVhZGVyUmlnaHQoKSkgfHxcbiAgICAgICAgICAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7IHdpZHRoOiAnNTBweCcsICdmbGV4LXNoaXJrJzogJzAnLCBwYWRkaW5nOiAnOHB4JyB9IDoge30pXG4gICAgICAgIDoge31cbiAgICBcIlxuICAgIFtuZ0NsYXNzXT1cImlzQ29sUmVuZGVyID8gaGVhZGVyLm5nQ2xhc3MgfHwge30gOiB7fVwiPlxuICAgIEBpZiAoaGVhZGVyLmhhc0NoZWNrYm94KSB7XG4gICAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveEFsbCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB7eyBoZWFkZXIuY2hlY2tib3hBbGxDbGFzc0luY2x1ZGUgfHwgJ21yLVsxNnB4XScgfX1cIlxuICAgICAgICAgIFtjbGFzcy5pdGVtcy1jZW50ZXJdPVwiaGVhZGVyLmNoZWNrYm94QWxpZ25DZW50ZXJcIj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZVxuICAgICAgICAgICAgW2tleV09XCInYWxsJ1wiXG4gICAgICAgICAgICBbc3RpbGxPdGhlck9wdGlvbnNdPVwiISFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoICE9PSBpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCIhIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggPT09IGl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKVwiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VDaGVja2VkQWxsSXRlbXMoJGV2ZW50KVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGgtZnVsbCBtbC1bMjRweF0ge3sgaGVhZGVyLmNoZWNrYm94Q2xhc3NJbmNsdWRlIH19XCI+PC9kaXY+XG4gICAgICB9XG4gICAgfVxuICAgIEBmb3IgKHRvb2x0aXAgb2YgaGVhZGVyLnRvb2x0aXBzTGVmdDsgdHJhY2sgdG9vbHRpcCkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1yLVs0cHhdXCI+XG4gICAgICAgIEBsZXQgY29uc3RIdG1sVG9vbHRpcCA9IHRvb2x0aXAuZGF0YVZpZXcgfHwgJyAnO1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICBbdHlwZV09XCJ0b29sdGlwPy50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgIFttb2RlXT1cInRvb2x0aXA/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJ0b29sdGlwLmNsYXNzSW5jbHVkZSB8fCAndGV4dC1bIzZhNzM4M10nXCJcbiAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwidG9vbHRpcC5pZ25vcmVTaG93VG9vbHRpcCB8fCBmYWxzZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJcbiAgICAgICAgICAgIHRvb2x0aXAuY29uZmlnIHx8IHtcbiAgICAgICAgICAgICAgY29udGVudDogY29uc3RIdG1sVG9vbHRpcCB8IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICBtb2RlOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICAgICAgICBhdXRvVXBkYXRlUG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIGVuZERpc3RhbmNlOiAxMixcbiAgICAgICAgICAgICAgICAgIHN0YXJ0RGlzdGFuY2U6IC0xMixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJ0b29sdGlwLmRhdGFWaWV3XCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBoLWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHt7IGhlYWRlci5jbGFzc0luY2x1ZGVJbmRleE9uUm93IHx8ICcnIH19XCI+XG4gICAgICAgIHt7IGhlYWRlci5sYWJlbCA/PyAnIycgfX1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgQGlmIChoZWFkZXIubGFiZWwgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBoZWFkZXIucGFyc2VWYWx1ZSA6IGhlYWRlciB8IGFzeW5jIHwgdHJhbnNsYXRlOyBhcyBsYWJlbEhlYWRlckNvbHVtbikge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICBbdHlwZV09XCJoZWFkZXI/LmxhYmVsQ29uZmlnPy50eXBlIHx8ICd0ZXh0J1wiXG4gICAgICAgICAgW21vZGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8ubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlcj8ubGFiZWxDb25maWc/LmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cImhlYWRlci5sYWJlbENvbmZpZz8uY29uZmlnIHx8IHsgY29udGVudDogbGFiZWxIZWFkZXJDb2x1bW4gfVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJsYWJlbEhlYWRlckNvbHVtblwiIC8+XG4gICAgICB9XG4gICAgfVxuXG4gICAgQGZvciAodG9vbHRpcCBvZiBoZWFkZXIudG9vbHRpcHNSaWdodDsgdHJhY2sgdG9vbHRpcCkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1sLVs0cHhdXCI+XG4gICAgICAgIEBsZXQgY29uc3RIdG1sVG9vbHRpcCA9IHRvb2x0aXAuZGF0YVZpZXcgfHwgJyAnO1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICBbdHlwZV09XCJ0b29sdGlwPy50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgIFttb2RlXT1cInRvb2x0aXA/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJ0b29sdGlwLmNsYXNzSW5jbHVkZSB8fCAndGV4dC1bIzZhNzM4M10nXCJcbiAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwidG9vbHRpcC5pZ25vcmVTaG93VG9vbHRpcCB8fCBmYWxzZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJcbiAgICAgICAgICAgIHRvb2x0aXAuY29uZmlnIHx8IHtcbiAgICAgICAgICAgICAgY29udGVudDogY29uc3RIdG1sVG9vbHRpcCB8IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICBtb2RlOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICAgICAgICBhdXRvVXBkYXRlUG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIGVuZERpc3RhbmNlOiAxMixcbiAgICAgICAgICAgICAgICAgIHN0YXJ0RGlzdGFuY2U6IC0xMixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJ0b29sdGlwLmRhdGFWaWV3XCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmhhc1NvcnQgJiYgaGVhZGVyLm9yZGVyYnkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtbC1bNHB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc29ydC1hcnJvd1xuICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKSB8fCAhaXRlbXMoKS5sZW5ndGhcIlxuICAgICAgICAgIFtmaWVsZFNvcnRdPVwiaGVhZGVyLm9yZGVyYnlcIlxuICAgICAgICAgIFtpZ25vcmVQb3BvdmVyQ29udGVudF09XCJoZWFkZXIuc29ydElnbm9yZVRvb2x0aXBDb250ZW50ID8/IHRydWVcIlxuICAgICAgICAgIFtwb3BvdmVyQ29udGVudEFzY109XCJoZWFkZXIuc29ydFRvb2x0aXBDb250ZW50QXNjXCJcbiAgICAgICAgICBbcG9wb3ZlckNvbnRlbnREZXNjXT1cImhlYWRlci5zb3J0VG9vbHRpcENvbnRlbnREZXNjXCJcbiAgICAgICAgICBbZGVmYXVsdE1vZGVdPVwiaGVhZGVyLmRlZmF1bHRNb2RlXCJcbiAgICAgICAgICBbekluZGV4XT1cImhlYWRlci56SW5kZXhUb29sdGlwU29ydFwiXG4gICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlU29ydCgkZXZlbnQpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoaGVhZGVyLmxhYmVsRGVzY3JpcHRpb24pIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiaGVhZGVyLmxhYmVsRGVzY3JpcHRpb24uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6IGhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNvbnRlbnQgfCB0cmFuc2xhdGUgfVwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwiaGVhZGVyLmxhYmVsRGVzY3JpcHRpb24uY29udGVudCB8IHRyYW5zbGF0ZVwiIC8+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjdGVtcGxhdGVCb2R5UmVmXG4gIGxldC1oZWFkZXI9XCJoZWFkZXJcIlxuICBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGgtZnVsbFwiPlxuICAgIEBpZiAoaGVhZGVyLmhhc0NoZWNrYm94KSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmxleCBoLWZ1bGxcIlxuICAgICAgICBbY2xhc3MuaW52aXNpYmxlXT1cImhlYWRlci5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuICYmIChkYXRhKCkgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBoZWFkZXIuY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiA6IGRhdGEoKSB8IGFzeW5jKVwiXG4gICAgICAgIFtjbGFzcy5pdGVtcy1jZW50ZXJdPVwiaGVhZGVyLmNoZWNrYm94QWxpZ25DZW50ZXJcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGVcbiAgICAgICAgICBba2V5XT1cImRhdGEoKVtmaWVsZEtleSgpXVwiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIuY2hlY2tib3hDbGFzc0luY2x1ZGVcIlxuICAgICAgICAgIFtjaGVja2VkXT1cImRhdGEoKVtmaWVsZEtleSgpXSB8IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZToga2V5c1NlbGVjdGVkKCkgOiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGhcIlxuICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKSB8fCBkaXNhYmxlQ2hlY2tib3goKSB8fCAhIShtYXhJdGVtU2VsZWN0ZWQoKSAmJiAhKGRhdGEoKVtmaWVsZEtleSgpXSB8IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZToga2V5c1NlbGVjdGVkKCkgOiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGgpICYmIGtleXNTZWxlY3RlZCgpLmxlbmd0aCA+PSBtYXhJdGVtU2VsZWN0ZWQoKSlcIlxuICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUl0ZW1DaGVja2VkKCRldmVudCwgZGF0YSgpKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93OyBhcyBjb25maWcpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbGlicy11aS1mb250LWg0cnt7IGNvbmZpZy5jbGFzc0luY2x1ZGVJbmRleE9uUm93IHx8ICcnIH19XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgW2NvbmZpZ109XCJ7fVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJkYXRhIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZ2V0SW5kZXhSb3cgfCBhc3luY1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuY29sVGVtcGxhdGVDb25maWcpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgIFtpc0hvdmVyXT1cIml0ZW1PZkluZGV4SG92ZXIgPT09IGRhdGEgJiYgIWRhdGEuc3BlY2lmaWNIaWdodExpZ2h0XCJcbiAgICAgICAgW2NsYXNzXT1cImhlYWRlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgW2l0ZW1dPVwiZGF0YVwiXG4gICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgIFtjb25maWdzXT1cImhlYWRlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgfVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVGb290ZXJSZWY+XG4gIEBpZiAoIWlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpIHx8IChpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKSAmJiBpdGVtcygpLmxlbmd0aCkpIHtcbiAgICA8ZGl2XG4gICAgICAjZm9vdGVyRWxlbWVudFJlZlxuICAgICAgY2xhc3M9XCJmbGV4IHctZnVsbCBiZy1bI2Y4ZjlmYV0gb3ZlcmZsb3cteC1oaWRkZW4gei1bMV0ge3sgaWdub3JlQm9yZGVyRm9vdGVyKCkgPyAnJyA6IGN1c3RvbVBvc2l0aW9uRm9vdGVyKCkgPT09ICd0b3AnID8gJ2xpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsJyA6ICdsaWJzLXVpLXRhYmxlLXNoYWRvdy10b3AgbGlicy11aS1ib3JkZXItdG9wLWdlbmVyYWwnIH19IG1pbi1oLVszNXB4XVwiXG4gICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVyTW91c2VFbnRlckZvb3RlcigkZXZlbnQpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZXJNb3VzZUxlYXZlRm9vdGVyKCRldmVudClcIj5cbiAgICAgIEBpZiAoZm9vdGVyTGVmdCgpKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAjZm9vdGVyTGVmdEVsZW1lbnRSZWZcbiAgICAgICAgICBjbGFzcz1cImZsZXggc3RpY2t5IHRvcC0wIGxlZnQtMCB6LVsxXSBiZy1bI2Y4ZjlmYV1cIj5cbiAgICAgICAgICBAZm9yIChmb290ZXIgb2YgZm9vdGVyTGVmdCgpOyB0cmFjayBmb290ZXIpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTJweF0gcHktWzhweF0ge3sgZm9vdGVyLmlnbm9yZUJvcmRlclJpZ2h0ID8gJycgOiAnbGlicy11aS1ib3JkZXItcmlnaHQtZ2VuZXJhbCcgfX1cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCIoZm9vdGVyIHwgTGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTogaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyKCk/LmhlYWRlckxlZnQgfHwgZmFsc2UgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogZm9vdGVyTGVmdCgpIDogZm9vdGVyUmlnaHQoKSkgfHwge31cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb290ZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICBAaWYgKGZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZyAmJiBpdGVtRm9vdGVyKCkpIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoZm9vdGVyUmlnaHQoKSkge1xuICAgICAgICBAZm9yIChmb290ZXIgb2YgZm9vdGVyUmlnaHQoKTsgdHJhY2sgZm9vdGVyKSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTJweF0gcHktWzhweF1cIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiKGZvb3RlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJSaWdodCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBmb290ZXJMZWZ0KCkgOiBmb290ZXJSaWdodCgpKSB8fCB7fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJmb290ZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgQGlmIChmb290ZXIuY29sVGVtcGxhdGVDb25maWcgJiYgaXRlbUZvb3RlcigpKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICBbY29uZmlnc109XCJmb290ZXIuY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVOb2RhdGFSZWY+XG4gIEBpZiAoIWtleVNlYXJjaCgpICYmIHRlbXBsYXRlTm9EYXRhKCk7IGFzIHRlbXBsYXRlTm9EYXRhKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlTm9EYXRhXCIgLz5cbiAgfVxuICBAaWYgKGtleVNlYXJjaCgpICYmIHRlbXBsYXRlTm9SZXN1bHQoKTsgYXMgdGVtcGxhdGVOb1Jlc3VsdCkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vUmVzdWx0XCIgLz5cbiAgfVxuICBAaWYgKCF0ZW1wbGF0ZU5vRGF0YSgpICYmICF0ZW1wbGF0ZU5vUmVzdWx0KCkgJiYgbm9EYXRhQ29uZmlnKCk7IGFzIGNvbmZpZykge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIGFic29sdXRlIGxlZnQtMCB0b3AtMCB6LVsxXVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgc2hyaW5rLTBcIj5cbiAgICAgICAgQGlmICgha2V5U2VhcmNoKCkgJiYgIW9ubHlTaG93Tm9SZXN1bHQoKSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiJ25vLWRhdGEnIHwgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB8IGFzeW5jOyBpbnB1dHM6IHsgc2l6ZTogNjQgfVwiIC8+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLXRhYmxlLW5vLWRhdGEtY29uZmlnLXRleHRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiY29uZmlnLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJjb25maWcudGV4dE5vRGF0YSB8IHRyYW5zbGF0ZVwiPjwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoa2V5U2VhcmNoKCkgfHwgb25seVNob3dOb1Jlc3VsdCgpKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCInbm8tcmVzdWx0JyB8IExpYnNVaUljb25zR2V0SWNvbkNvbXBvbmVudFBpcGUgfCBhc3luYzsgaW5wdXRzOiB7IHNpemU6IDY0IH1cIiAvPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS10YWJsZS1uby1kYXRhLWNvbmZpZy10ZXh0XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbmZpZy5uZ0NsYXNzIHx8IHt9XCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnLnRleHRTZWFyY2hOb0RhdGEgfCB0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=