@libs-ui/components-table 0.2.346-5 → 0.2.346-7

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.
@@ -322,7 +322,7 @@ export class LibsUiComponentsTableComponent {
322
322
  checkExistItem(itemNew) {
323
323
  return this.items().find((item) => `${get(item, this.fieldKey())}` === `${get(itemNew, this.fieldKey())}`) ? true : false;
324
324
  }
325
- async removeItems(keys, ignoreReCallFooter) {
325
+ async removeItems(keys, ignoreReCallFooter, autoCountNewItem) {
326
326
  this.resetIndexHover();
327
327
  if (!this.items().length) {
328
328
  return;
@@ -344,6 +344,9 @@ export class LibsUiComponentsTableComponent {
344
344
  const newItems = items.filter((item) => {
345
345
  if (`${get(item, this.fieldKey())}` === `${key}`) {
346
346
  isUpdate = true;
347
+ if (autoCountNewItem) {
348
+ this.totalItemInBackend.update((value) => value - 1);
349
+ }
347
350
  return false;
348
351
  }
349
352
  return true;
@@ -730,4 +733,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
730
733
  LibsUiTableCheckItemHightLightPipe,
731
734
  ], 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 [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\">\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]=\"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 @let constHtmlIsHightLightItem = data | LibsUiTableCheckItemHightLightPipe: itemsHightLight();\n <div\n #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"constHtmlIsHightLightItem\"\n [class.libs-ui-border-top-1px-36d3d3]=\"constHtmlIsHightLightItem && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"constHtmlIsHightLightItem && !ignoreBorderItem()\"\n [ngClass]=\"\n constHtmlIsHightLightItem || ($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 && !constHtmlIsHightLightItem\"\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]=\"!constHtmlIsHightLightItem\"\n [class.bg-[#f3fcfc]]=\"constHtmlIsHightLightItem\">\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 && !constHtmlIsHightLightItem\"\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, constHtmlIsHightLightItem: constHtmlIsHightLightItem }\" />\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, constHtmlIsHightLightItem: constHtmlIsHightLightItem }\" />\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 @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"dataExpand\"\n [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"dataExpand\"\n [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\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 [numberPageDisplay]=\"paginationSetting()?.numberPageDisplay || 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 let-constHtmlIsHightLightItem=\"constHtmlIsHightLightItem\">\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 @let constHtmlIsHover = itemOfIndexHover === data && !constHtmlIsHightLightItem;\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [isHover]=\"constHtmlIsHover\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"header.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [isHover]=\"constHtmlIsHover\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\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 @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"footer.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\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 @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"footer.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n }\n </div>\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (keySearch() || onlyShowNoResult()) {\n @if (templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n } @else {\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 <ng-container *ngComponentOutlet=\"'no-result' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n @let constHtmlTextSearchNoData = noDataConfig().textSearchNoData || 'i18n_no_result';\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"noDataConfig().ngStyle || {}\"\n [ngClass]=\"noDataConfig().ngClass || {}\"\n [innerHtml]=\"constHtmlTextSearchNoData | translate\"></div>\n </div>\n </div>\n }\n } @else {\n @if (templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n } @else {\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 <ng-container *ngComponentOutlet=\"'no-data' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n @let constHtmlTextNoData = noDataConfig().textNoData || 'i18n_no_data_yet';\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"noDataConfig().ngStyle || {}\"\n [ngClass]=\"noDataConfig().ngClass || {}\"\n [innerHtml]=\"constHtmlTextNoData | translate\"></div>\n </div>\n </div>\n }\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"] }]
732
735
  }], ctorParameters: () => [] });
733
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3hOLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBNEIscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRyxPQUFPLEVBQVcsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRyxPQUFPLEVBQVMseUNBQXlDLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRyxPQUFPLEVBQWtCLHVDQUF1QyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUcsT0FBTyxFQUFpRCxpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWhJLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRyxPQUFPLEVB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QkFBcUIsdXRCQUNyQixzQ0FBc0MsaWpCQUN0QyxvQ0FBb0MsNkVBQ3BDLGlDQUFpQyxpMURBQ2pDLHlDQUF5QyxzUUFDekMsbUNBQW1DLHVXQUNuQyx1Q0FBdUMscXBCQUN2QywrQkFBK0Isd0VBQy9CLGdDQUFnQyxpR0FDaEMsZ0NBQWdDLG9nQkFDaEMsc0NBQXNDLHdTQUN0QywrQkFBK0IsbUVBQy9CLHFDQUFxQyx5RUFDckMsaUNBQWlDLHFFQUNqQyxrQ0FBa0MscUlBaEJsQyx1Q0FBdUMsVUFBdkMsdUNBQXVDLFVBQXZDLHVDQUF1QztnQkFJdkMsb0NBQW9DLFVBSnBDLHVDQUF1QztnQkFJdkMsb0NBQW9DOzs0RkFlM0IsOEJBQThCO2tCQWhDMUMsU0FBUzsrQkFFRSwwQkFBMEIsY0FHeEIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxTQUFTO3dCQUNULGdCQUFnQjt3QkFDaEIsaUJBQWlCO3dCQUNqQix1Q0FBdUM7d0JBQ3ZDLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQixzQ0FBc0M7d0JBQ3RDLG9DQUFvQzt3QkFDcEMsaUNBQWlDO3dCQUNqQyx5Q0FBeUM7d0JBQ3pDLG1DQUFtQzt3QkFDbkMsdUNBQXVDO3dCQUN2QywrQkFBK0I7d0JBQy9CLGdDQUFnQzt3QkFDaEMsZ0NBQWdDO3dCQUNoQyxzQ0FBc0M7d0JBQ3RDLCtCQUErQjt3QkFDL0IscUNBQXFDO3dCQUNyQyxpQ0FBaUM7d0JBQ2pDLGtDQUFrQztxQkFDbkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nQ29tcG9uZW50T3V0bGV0LCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgY29tcHV0ZWQsIERlc3Ryb3lSZWYsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQsIHZpZXdDaGlsZCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudCwgVmlydHVhbFNjcm9sbGVyTW9kdWxlIH0gZnJvbSAnQGloYXJiZWNrL25neC12aXJ0dWFsLXNjcm9sbGVyJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJU29ydCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTb3J0QXJyb3dDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtc29ydCc7XG5pbXBvcnQgeyBJQ2hlY2tib3hJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1ncm91cCc7XG5pbXBvcnQgeyBJQ2hlY2tib3hFdmVudCwgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUnO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcGFnaW5hdGlvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lcic7XG5pbXBvcnQgeyBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIH0gZnJvbSAnQGxpYnMtdWkvaWNvbnMnO1xuaW1wb3J0IHsgSUh0dHBSZXNwb25zZUVycm9yLCBJUGFnaW5nLCBUWVBFX09CSkVDVCwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNoZWNrLXNlbGVjdGVkLWJ5LWtleSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jb252ZXJ0LW9iamVjdC10by1zaWduYWwnO1xuaW1wb3J0IHsgSUh0dHBSZXF1ZXN0Q29uZmlnLCBMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UsIHJldHVybkxpc3RPYmplY3QgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3QnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjb252ZXJ0T2JqZWN0VG9TaWduYWwsIGRlbGV0ZVVuaWNvZGUsIGdldCwgc2V0LCB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgbGFzdFZhbHVlRnJvbSwgb2YsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBJQnV0dG9uQmFyRXZlbnQsXG4gIElDb25maWdTZWxlY3RNb3JlSXRlbSxcbiAgSUNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kLFxuICBJSG92ZXJCdXR0b25BY3Rpb25FdmVudCxcbiAgSUxvYWRNb3JlRXZlbnQsXG4gIElTb3J0RXZlbnQsXG4gIElUYWJlbEJ1dHRvbkFjdGlvbkV2ZW50LFxuICBJVGFibGVGb290ZXJDb25maWcsXG4gIElUYWJsZUhlYWRlckNvbmZpZyxcbiAgVFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSxcbiAgVFlQRV9EQVRBX1RBQkxFLFxuICBUWVBFX0lURU1fREFUQV9UQUJMRSxcbiAgVFlQRV9ORVdfREFUQV9UQUJMRSxcbiAgVFlQRV9UQUJMRV9GSUxURVIsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJVGFibGVGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLWV2ZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJVGFibGVOb0RhdGFDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvbm8tZGF0YS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGUgfSBmcm9tICcuL3BpcGVzL2NhbGN1bGF0b3ItY29sdW1uLnBpcGUnO1xuaW1wb3J0IHsgTGlic1VpVGFibGVDaGVja0l0ZW1IaWdodExpZ2h0UGlwZSB9IGZyb20gJy4vcGlwZXMvY2hlY2staXRlbS1oaWdodC1saWdodC5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNUYWJsZVRlbXBsYXRlc0NvbXBvbmVudCB9IGZyb20gJy4vdGVtcGxhdGVzL3RlbXBsYXRlcy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIE5nQ2xhc3MsXG4gICAgTmdTdHlsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBOZ0NvbXBvbmVudE91dGxldCxcbiAgICBMaWJzVWlDb21wb25lbnRzVGFibGVUZW1wbGF0ZXNDb21wb25lbnQsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIFZpcnR1YWxTY3JvbGxlck1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zU29ydEFycm93Q29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQYWdpbmF0aW9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNDaGVja2JveFNpbmdsZUNvbXBvbmVudCxcbiAgICBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlLFxuICAgIExpYnNVaUljb25zR2V0SWNvbkNvbXBvbmVudFBpcGUsXG4gICAgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSxcbiAgICBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGUsXG4gICAgTGlic1VpVGFibGVDaGVja0l0ZW1IaWdodExpZ2h0UGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogUFJPUEVSVFkgKi9cbiAgcHJvdGVjdGVkIGNsYXNzSGVhZGVyQ29udGFpbmVyID0gY29tcHV0ZWQoKCkgPT4gYGxpYnMtdWktdGFibGUtaGVhZGVyLWNvbnRhaW5lciB3LWZ1bGwgYWJzb2x1dGUgZmxleCBzaHJpbmstMCAke3RoaXMuaWdub3JlQ2xhc3NCZ0hlYWRlcigpID8gJycgOiAnYmctd2hpdGUnfSBvdmVyZmxvdy14LWhpZGRlbiB6LVsxXSBpdGVtcy1jZW50ZXIgJHt0aGlzLmNsYXNzSGVhZGVyQ29udGFpbmVySW5jbHVkZSgpIHx8ICcnfWApO1xuICBwcm90ZWN0ZWQgY2xhc3NIZWFkZXJMZWZ0Q29udGFpbmVyID0gY29tcHV0ZWQoKCkgPT4gYGgtZnVsbCBmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV0gJHt0aGlzLmlnbm9yZUNsYXNzQmdIZWFkZXIoKSA/ICcnIDogJ2JnLXdoaXRlJ30gJHt0aGlzLmNsYXNzSGVhZGVyTGVmdEluY2x1ZGUoKSB8fCAnJ31gKTtcblxuICBwcm90ZWN0ZWQga2V5c1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PGFueT4+KFtdKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgc3RvcmVzID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1zID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1Gb290ZXIgPSBzaWduYWw8VFlQRV9PQkpFQ1QgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBpdGVtT2ZJbmRleEhvdmVyPzogVFlQRV9JVEVNX0RBVEFfVEFCTEU7XG4gIHByb3RlY3RlZCBrZXlTZWFyY2ggPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCB0b3RhbEl0ZW1JbkJhY2tlbmQgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbURpc3BsYXkgPSBjb21wdXRlZCgoKSA9PiB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UodGhpcy50b3RhbEl0ZW0oKSA/PyB0aGlzLnRvdGFsSXRlbUluQmFja2VuZCgpLCBmYWxzZSkpO1xuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ01vcmVJdGVtID0gY29tcHV0ZWQ8SUxpc3RDb25maWdJdGVtPigoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIGNvbmZpZ1RlbXBsYXRlVGV4dDogc2lnbmFsKHtcbiAgICAgICAgZmllbGRLZXk6ICdrZXknLFxuICAgICAgICBpZ25vcmVJY29uU2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgIGdldFZhbHVlOiB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LmdldFZhbHVlLFxuICAgICAgICBjb25maWdMYWJlbFBvcG92ZXI6IHNpZ25hbCh7XG4gICAgICAgICAgekluZGV4OiAxMjAwLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgaHR0cFJlcXVlc3REYXRhOiBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnPih7XG4gICAgICAgIG9iamVjdEluc3RhbmNlOiByZXR1cm5MaXN0T2JqZWN0KHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8ubGlzdE9wdGlvbiksXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ2xpc3QnLFxuICAgICAgICBhcmd1bWVudHNWYWx1ZTogW10sXG4gICAgICB9KSxcbiAgICB9O1xuICB9KTtcbiAgcHJvdGVjdGVkIGl0ZW1zSGlnaHRMaWdodCA9IHNpZ25hbDxBcnJheTxUWVBFX0lURU1fREFUQV9UQUJMRT4+KFtdKTtcbiAgcHJvdGVjdGVkIGhhc0l0ZW1IaWdodExpZ2h0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pdGVtc0hpZ2h0TGlnaHQoKS5sZW5ndGggPiAwKTtcblxuICBwcml2YXRlIGhhc1Njcm9sbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaW5zdGFuY2VTb3J0ID0gc2lnbmFsPElTb3J0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBwYWdpbmdTdG9yZSA9IHNpZ25hbDxJUGFnaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGxvYWRlZExhc3RJdGVtID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzdG9yZVBhcmFtc0NhbGxBcGkgPSBzaWduYWw8VFlQRV9PQkpFQ1Q+KHt9KTtcbiAgcHJpdmF0ZSB0aW1lb3V0TGVhdmVJdGVtID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbT86IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50O1xuICBwcml2YXRlIG1vdXNlRW50ZXJIZWFkZXIgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKiBJTlBVVCAqL1xuICByZWFkb25seSBvcHRpbWl6ZVRhYmxlUmVuZGVyQnlPblZpZXdwb3J0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdGltZUhpZ2hsaWdoTmV3SXRlbSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigyMDAwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDIwMDAgfSk7XG4gIHJlYWRvbmx5IGhlYWRlckxlZnQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgaGVhZGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyID0gaW5wdXQ8e1xuICAgIGhlYWRlckxlZnQ/OiBib29sZWFuO1xuICAgIGhlYWRlclJpZ2h0PzogYm9vbGVhbjtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQgPSBpbnB1dDxJQ29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQ+KCk7XG4gIHJlYWRvbmx5IHNob3dGb290ZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJGb290ZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjdXN0b21Qb3NpdGlvbkZvb3RlciA9IGlucHV0PCd0b3AnIHwgJ2JvdHRvbScsICd0b3AnIHwgJ2JvdHRvbScgfCB1bmRlZmluZWQ+KCdib3R0b20nLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICdib3R0b20nIH0pO1xuICByZWFkb25seSBmb290ZXJMZWZ0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlRm9vdGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZm9vdGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVGb290ZXJDb25maWc+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBkaXNhYmxlQ2hlY2tib3ggPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgYnVmZmVyQW1vdW50ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDUsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiAodmFsID8gKHZhbCA+IDI1ID8gMjUgOiB2YWwpIDogNSkgfSk7XG4gIHJlYWRvbmx5IHRvdGFsSXRlbSA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgaXNEYXNoQm9yZGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NIZWFkZXJDb250YWluZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0hlYWRlckxlZnRJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0JvZHlJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc0Zvb3RlckluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzVGFibGVDb250YWluZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc0JhckluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCdqdXN0aWZ5LWJldHdlZW4gbWItWzE2cHhdJyk7XG5cbiAgcmVhZG9ubHkgZmllbGRLZXkgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2lkJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCB8fCAnaWQnIH0pOyAvLyB0w6puIGZpZWxkIMSR4buLbmggZGFuaCBpdGVtIGPhu6dhIGxpc3REYXRhc1xuICByZWFkb25seSBkZWZhdWx0S2V5c1NlbGVjdGVkID0gaW5wdXQ8QXJyYXk8YW55Pj4oKTtcbiAgcmVhZG9ubHkgbGFiZWxCYXJOb1NlbGVjdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KGBpMThuX3RvdGFsX3F1YW50aXR5YCk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBsYWJlbEJhckJ1dHRvbnMgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2kxOG5fbnVtYmVyX2l0ZW1fc2VsZWN0ZWQnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsIHx8ICdpMThuX251bWJlcl9pdGVtX3NlbGVjdGVkJyB9KTsgLy8gc+G7rSBk4bulbmcgxJHhu4MgaGnDqm4gdGjhu4sga2hpIHTDrWNoIGNo4buNbiBpdGVtXG4gIHJlYWRvbmx5IGNsYXNzTGFiZWxCYXJCdXR0b25zID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgYmFyQnV0dG9ucyA9IGlucHV0PEFycmF5PElCdXR0b24+PigpO1xuICByZWFkb25seSBzb3J0TG9jYWwgPSBpbnB1dDxib29sZWFuPigpOyAvLyB0csaw4budbmcgaOG7o3AgbuG6v3Ugc29ydExvY2FsIG7DoHkga2jDtG5nIMSRw6FwIOG7qW5nIMSRxrDhu6NjIG5naGnhu4dwIHbhu6UgdGjDrCBt4bubaSBjw6JuIG5o4bqvYyBz4butIGThu6VuZyBmaWx0ZXJMb2NhbFxuICByZWFkb25seSBmaWx0ZXJPclNvcnRMb2NhbCA9IGlucHV0PFRZUEVfVEFCTEVfRklMVEVSPigpO1xuICByZWFkb25seSBodHRwUmVxdWVzdERhdGEgPSBpbnB1dDxJSHR0cFJlcXVlc3RDb25maWc+KCk7XG4gIHJlYWRvbmx5IGh0dHBSZXF1ZXN0RGF0YUZvb3RlciA9IGlucHV0PElIdHRwUmVxdWVzdENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgbmV3RGF0YSA9IGlucHV0PFRZUEVfTkVXX0RBVEFfVEFCTEU+KCk7XG4gIHJlYWRvbmx5IGZpbHRlciA9IGlucHV0PFRZUEVfREFUQV9GSUxURVJfVEFCTEUsIFRZUEVfREFUQV9GSUxURVJfVEFCTEUgfCB1bmRlZmluZWQ+KHsgZmlsdGVyRGF0YToge30gfSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyB7IGZpbHRlckRhdGE6IHt9IH0gfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUJhciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUNsYXNzQmdIZWFkZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBub0RhdGFDb25maWcgPSBpbnB1dDxJVGFibGVOb0RhdGFDb25maWcsIElUYWJsZU5vRGF0YUNvbmZpZyB8IHVuZGVmaW5lZD4oXG4gICAgeyB0ZXh0Tm9EYXRhOiAnaTE4bl9ub19kYXRhX3lldCcsIHRleHRTZWFyY2hOb0RhdGE6ICdpMThuX25vX3Jlc3VsdCcgfSxcbiAgICB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsIHx8IHsgdGV4dE5vRGF0YTogJ2kxOG5fbm9fZGF0YV95ZXQnLCB0ZXh0U2VhcmNoTm9EYXRhOiAnaTE4bl9ub19yZXN1bHQnIH0gfVxuICApO1xuICByZWFkb25seSBzaG93U2Nyb2xsVGFibGVQaW5uZWRJZk5vRGF0YSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckl0ZW1MYXN0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbWF4SXRlbVNlbGVjdGVkID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMCwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAxMDAgfSk7XG4gIHJlYWRvbmx5IGNvbmZpZ1NlbGVjdE1vcmVJdGVtID0gaW5wdXQ8SUNvbmZpZ1NlbGVjdE1vcmVJdGVtPigpO1xuICByZWFkb25seSBvbmx5U2hvd05vUmVzdWx0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQm9yZGVySXRlbSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGFjdGl2aXR5TG9hZERhdGEgPSBpbnB1dDwnc2Nyb2xsLWluZmluaXR5JyB8ICdjbGljay1wYWdpbmF0aW9uJywgJ3Njcm9sbC1pbmZpbml0eScgfCAnY2xpY2stcGFnaW5hdGlvbicgfCB1bmRlZmluZWQ+KCdzY3JvbGwtaW5maW5pdHknLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICdzY3JvbGwtaW5maW5pdHknIH0pO1xuICByZWFkb25seSBwYWdpbmF0aW9uU2V0dGluZyA9IGlucHV0PHtcbiAgICBwb3NpdGlvbj86ICd0b3AnIHwgJ2JvdHRvbSc7XG4gICAgY2xhc3NJbmNsdWRlQ29udGFpbmVyPzogc3RyaW5nO1xuICAgIGNsYXNzSW5jbHVkZUl0ZW0/OiBzdHJpbmc7XG4gICAgZGlzYWJsZT86IGJvb2xlYW47XG4gICAgbnVtYmVyUGFnZURpc3BsYXk/OiBudW1iZXI7XG4gICAgc2hvd1RvdGFsUGFnZT86IGJvb2xlYW47XG4gICAgc2hvd0lucHV0R290b1BhZ2U/OiBib29sZWFuO1xuICAgIG1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2U/OiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JztcbiAgICBjbGFzc0Rpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZT86IHN0cmluZztcbiAgfT4oKTtcblxuICByZWFkb25seSB0ZW1wbGF0ZU5vRGF0YSA9IGlucHV0PFRZUEVfVEVNUExBVEVfUkVGPigpO1xuICByZWFkb25seSB0ZW1wbGF0ZU5vUmVzdWx0ID0gaW5wdXQ8VFlQRV9URU1QTEFURV9SRUY+KCk7XG5cbiAgLyoqIE9VVFBVVCAqL1xuXG4gIHJlYWRvbmx5IG91dExvYWRNb3JlID0gb3V0cHV0PElMb2FkTW9yZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxJc0dvbmUgPSBvdXRwdXQ8SUxvYWRNb3JlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExvYWRpbmcgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCdXR0b25BY3Rpb24gPSBvdXRwdXQ8SVRhYmVsQnV0dG9uQWN0aW9uRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFNvcnQgPSBvdXRwdXQ8SVNvcnRFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCYXJCdXR0b24gPSBvdXRwdXQ8SUJ1dHRvbkJhckV2ZW50PigpO1xuICByZWFkb25seSBvdXRIb3ZlckJ1dHRvbkFjdGlvbiA9IG91dHB1dDxJSG92ZXJCdXR0b25BY3Rpb25FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0S2V5c1NlbGVjdGVkID0gb3V0cHV0PHsga2V5czogQXJyYXk8YW55PiB9PigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRMb2FkRGF0YUNvbXBsZXRlID0gb3V0cHV0PFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+Pj4oKTtcbiAgcmVhZG9ubHkgb3V0VG90YWxJdGVtID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZERhdGFFcnJvciA9IG91dHB1dDxJSHR0cFJlc3BvbnNlRXJyb3I+KCk7XG5cbiAgLyoqVklFVyBDSElMRCAqL1xuICBwcm90ZWN0ZWQgaGVhZGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignaGVhZGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZm9vdGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyTGVmdEVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2Zvb3RlckxlZnRFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2JvZHlFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUNvbXBvbmVudFJlZiA9IHZpZXdDaGlsZDxWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ+KCdib2R5Q29tcG9uZW50UmVmJyk7XG5cbiAgLyoqSU5KRUNUICovXG4gIHByaXZhdGUgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0S2V5c1NlbGVjdGVkKCk/Lmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5rZXlzU2VsZWN0ZWQudXBkYXRlKChrZXlzKSA9PiBbLi4ua2V5cywgLi4uKHRoaXMuZGVmYXVsdEtleXNTZWxlY3RlZCgpIHx8IFtdKV0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2hvd0Zvb3RlcigpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmV3RGF0YSgpPy5kYXRhKCkubGVuZ3RoKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmFkZEl0ZW1zKHRoaXMubmV3RGF0YSgpPy5kYXRhIGFzIGFueSwgIXRoaXMubmV3RGF0YSgpPy5hZGRUb0xhc3RMaXN0KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEgfHwgdGhpcy5maWx0ZXIoKS5pZ25vcmVDYWxsQXBpQXV0bykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtleVNlYXJjaC5zZXQoZ2V0KHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSwgJ2tleVNlYXJjaCcsICcnKSk7XG4gICAgICAgIHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpLnNldChjbG9uZURlZXAodGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhKSk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcigpPy5maWx0ZXJEYXRhICYmICF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGFbJ2luc3RhbmNlU29ydCddICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSAmJiB0aGlzLnN0b3JlcygpLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKT8uKHNpZ25hbChbLi4udGhpcy5zdG9yZXMoKV0pLCB7IC4uLih0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEgfHwge30pLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkgfHwgW10pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG5cbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzZXQ6IHRoaXMucmVzZXQuYmluZCh0aGlzKSxcbiAgICAgIGNhbGxBcGlCeVNlcnZpY2U6IHRoaXMuY2FsbEFwaUJ5U2VydmljZS5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRTY3JvbGw6IHRoaXMucmVzZXRTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgIGFkZEl0ZW1zOiB0aGlzLmFkZEl0ZW1zLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVJdGVtczogdGhpcy5yZW1vdmVJdGVtcy5iaW5kKHRoaXMpLFxuICAgICAgZ2V0U2Nyb2xsQ29udGFpbmVyOiB0aGlzLmdldFNjcm9sbENvbnRhaW5lci5iaW5kKHRoaXMpLFxuICAgICAgaGlkZVRvb2xCYXJCb3R0b206ICgpID0+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSxcbiAgICAgIHJlc2V0S2V5U2VsZWN0ZWQ6ICgpID0+IHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSksXG4gICAgICBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCksXG4gICAgICBzZXRDb3VudFBhZ2luZ1N0b3JlOiAoY291bnQ6IG51bWJlcikgPT4gdGhpcy5odHRwUmVxdWVzdERhdGEoKSAmJiB0aGlzLnBhZ2luZ1N0b3JlKCkgJiYgdGhpcy5wYWdpbmdTdG9yZS51cGRhdGUoKHBhZ2luZykgPT4gKHsgLi4ucGFnaW5nLCB0b3RhbF9pdGVtczogY291bnQgfSkpLFxuICAgICAgZ2V0Q291bnQ6IHRoaXMuZ2V0Q291bnQuYmluZCh0aGlzKSxcbiAgICAgIGdldFN0b3JlOiAoKSA9PiB0aGlzLnN0b3JlcygpIHx8IFtdLFxuICAgICAgaGlnaHRMaWdodEl0ZW06IHRoaXMuaGlnaHRMaWdodEl0ZW0uYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEluZGV4Um93ID0gKGRhdGE6IHsgdmFsdWU6IFRZUEVfSVRFTV9EQVRBX1RBQkxFIH0pID0+IHtcbiAgICByZXR1cm4gb2YodGhpcy5pdGVtcygpLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbSA9PT0gZGF0YS52YWx1ZSkgKyAxKTtcbiAgfTtcblxuICBwcml2YXRlIGdldFNjcm9sbENvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5ib2R5Q29tcG9uZW50UmVmKCkgYXMgVmlydHVhbFNjcm9sbGVyQ29tcG9uZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxsQXBpQnlTZXJ2aWNlKGZpcnN0Q2FsbDogYm9vbGVhbiwgcmVzZXRBZnRlckNhbGxBcGk/OiBib29sZWFuKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChmaXJzdENhbGwpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIHx8IHRoaXMubG9hZGluZygpIHx8IHRoaXMubG9hZGVkTGFzdEl0ZW0oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgICAgdGhpcy5yZXNldEluZGV4SG92ZXIoKTtcbiAgICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSB0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIGFzIElIdHRwUmVxdWVzdENvbmZpZztcblxuICAgICAgaWYgKGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlICYmICFndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJCeSAmJiB0aGlzLmluc3RhbmNlU29ydCgpKSB7XG4gICAgICAgIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlckJ5ID0ge1xuICAgICAgICAgIGZpZWxkR2V0VmFsdWU6ICdzdG9yZVBhcmFtc0NhbGxBcGkuaW5zdGFuY2VTb3J0LmZpZWxkU29ydCcsXG4gICAgICAgICAgZmllbGRVcGRhdGU6ICdbMF0nLFxuICAgICAgICAgIHN1YkZpZWxkVXBkYXRlOiAnb3JkZXJfYnknLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlclR5cGUgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKSkge1xuICAgICAgICBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJUeXBlID0ge1xuICAgICAgICAgIGZpZWxkR2V0VmFsdWU6ICdzdG9yZVBhcmFtc0NhbGxBcGkuaW5zdGFuY2VTb3J0Lm1vZGUnLFxuICAgICAgICAgIGZpZWxkVXBkYXRlOiAnWzBdJyxcbiAgICAgICAgICBzdWJGaWVsZFVwZGF0ZTogJ29yZGVyX3R5cGUnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICBpZiAoIXJlc2V0QWZ0ZXJDYWxsQXBpKSB7XG4gICAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChcbiAgICAgICAgICB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4udGhpcy5mYWtlUmVzcG9uc2VBcGkoKSwgc3RvcmVQYXJhbXNDYWxsQXBpOiB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpIH0sIHRoaXMucGFnaW5nU3RvcmUoKSB8fCB7fSwgdGhpcy5rZXlTZWFyY2goKSwgdHJ1ZSwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmNhbGxBcGkodGhpcy5odHRwUmVxdWVzdERhdGEoKSBhcyBJSHR0cFJlcXVlc3RDb25maWcpO1xuXG4gICAgICBpZiAoZmlyc3RDYWxsICYmIHJlc2V0QWZ0ZXJDYWxsQXBpKSB7XG4gICAgICAgIHRoaXMuaGFzU2Nyb2xsLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFnaW5nU3RvcmUuc2V0KHJlc3VsdC5wYWdpbmcpO1xuICAgICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQuc2V0KHJlc3VsdC5wYWdpbmc/LnRvdGFsX2l0ZW1zIHx8IDApO1xuICAgICAgdGhpcy5vdXRUb3RhbEl0ZW0uZW1pdCh0aGlzLnRvdGFsSXRlbUluQmFja2VuZCgpKTtcbiAgICAgIGlmICghdGhpcy5wYWdpbmdTdG9yZSgpKSB7XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KHRydWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQoXG4gICAgICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi5yZXN1bHQsIHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCkgfHwge30sIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIHRoaXMubG9hZGVkTGFzdEl0ZW0oKSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5hZGRJdGVtcyhjb252ZXJ0T2JqZWN0VG9TaWduYWwocmVzdWx0LmRhdGEgfHwgW10pLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB0aGlzLm91dExvYWREYXRhQ29tcGxldGUuZW1pdCh0aGlzLnN0b3Jlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIHRoaXMub3V0TG9hZERhdGFFcnJvci5lbWl0KGVycm9yIGFzIElIdHRwUmVzcG9uc2VFcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmYWtlUmVzcG9uc2VBcGkoKTogVFlQRV9PQkpFQ1Qge1xuICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICBpZiAodGhpcy5hY3Rpdml0eUxvYWREYXRhKCkgPT09ICdzY3JvbGwtaW5maW5pdHknKSB7XG4gICAgICB0aGlzLnBhZ2luZ1N0b3JlLnNldCh7fSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmZha2VSZXNwb25zZVBhZ2luZ0FwaSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkge1xuICAgIGlmICghdGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSB8fCAhdGhpcy5zaG93Rm9vdGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCkgfHwge30sIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIGZhbHNlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICB0aGlzLml0ZW1Gb290ZXIuc2V0KGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRJdGVtcyhpdGVtczogVFlQRV9EQVRBX1RBQkxFLCBhZGRGaXJzdDogYm9vbGVhbiwgaWdub3JlSGlnaHRMaWdodD86IGJvb2xlYW4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4sIGF1dG9Db3VudE5ld0l0ZW0/OiBib29sZWFuKSB7XG4gICAgaWYgKCFpdGVtcygpIHx8ICFpdGVtcygpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc0FkZDogQXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+PiA9IFtdO1xuXG4gICAgaXRlbXMoKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY2hlY2tFeGlzdEl0ZW0oaXRlbSkpIHtcbiAgICAgICAgaXRlbXNBZGQucHVzaChpdGVtKTtcbiAgICAgICAgaWYgKGFkZEZpcnN0KSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoKGRhdGEpID0+IFtpdGVtLCAuLi5kYXRhXSk7XG4gICAgICAgICAgdGhpcy5zdG9yZXMudXBkYXRlKChkYXRhKSA9PiBbaXRlbSwgLi4uZGF0YV0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKChkYXRhKSA9PiBbLi4uZGF0YSwgaXRlbV0pO1xuICAgICAgICB0aGlzLnN0b3Jlcy51cGRhdGUoKGRhdGEpID0+IFsuLi5kYXRhLCBpdGVtXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGF1dG9Db3VudE5ld0l0ZW0gJiYgaXRlbXNBZGQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRvdGFsSXRlbUluQmFja2VuZC51cGRhdGUoKHZhbHVlKSA9PiB2YWx1ZSArIGl0ZW1zQWRkLmxlbmd0aCk7XG4gICAgfVxuICAgIGlmICghaWdub3JlSGlnaHRMaWdodCkge1xuICAgICAgdGhpcy5pdGVtc0hpZ2h0TGlnaHQudXBkYXRlKChpdGVtc0hpZ2h0TGlnaHQpID0+IFsuLi5pdGVtc0hpZ2h0TGlnaHQsIC4uLml0ZW1zQWRkXSk7XG4gICAgICB0aW1lcih0aGlzLnRpbWVIaWdobGlnaE5ld0l0ZW0oKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGl0ZW1zQWRkLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNIaWdodExpZ2h0LnVwZGF0ZSgoaXRlbXNIaWdodExpZ2h0KSA9PiBpdGVtc0hpZ2h0TGlnaHQuZmlsdGVyKChpdGVtSGlnaHRMaWdodCkgPT4gaXRlbUhpZ2h0TGlnaHQgIT09IGl0ZW0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2hlY2tTY3JvbGwoKTtcbiAgICBpZiAoIWlnbm9yZVJlQ2FsbEZvb3Rlcikge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0V4aXN0SXRlbShpdGVtTmV3OiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcygpLmZpbmQoKGl0ZW0pID0+IGAke2dldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWAgPT09IGAke2dldDx1bmtub3duPihpdGVtTmV3LCB0aGlzLmZpZWxkS2V5KCkpfWApID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVJdGVtcyhrZXlzOiBBcnJheTx1bmtub3duPiwgaWdub3JlUmVDYWxsRm9vdGVyPzogYm9vbGVhbikge1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKCk7XG4gICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICB0aGlzLml0ZW1zLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YCA9PT0gYCR7a2V5fWApIHtcbiAgICAgICAgICAgIGlzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1VwZGF0ZSA/IG5ld0l0ZW1zIDogaXRlbXM7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zdG9yZXMudXBkYXRlKChpdGVtcykgPT4ge1xuICAgICAgICBsZXQgaXNVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChgJHtnZXQ8dW5rbm93bj4oaXRlbSwgdGhpcy5maWVsZEtleSgpKX1gID09PSBgJHtrZXl9YCkge1xuICAgICAgICAgICAgaXNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGlzVXBkYXRlID8gbmV3SXRlbXMgOiBpdGVtcztcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXRoaXMua2V5c1NlbGVjdGVkKCkgfHwgIXRoaXMua2V5c1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnVwZGF0ZSgoa2V5cykgPT4ga2V5cy5maWx0ZXIoKGtleVNlbGVjdGVkKSA9PiBrZXlTZWxlY3RlZCAhPT0ga2V5KSk7XG4gICAgfSk7XG4gICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUgLSBrZXlzLmxlbmd0aCk7XG4gICAgYXdhaXQgdGhpcy5jaGVja1Njcm9sbCgpO1xuICAgIGlmICghaWdub3JlUmVDYWxsRm9vdGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKTtcbiAgICB9XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaHR0cFJlcXVlc3REYXRhKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZ2luZ1N0b3JlKCk/LnRvdGFsX2l0ZW1zIHx8IHRoaXMuaXRlbXMoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMoKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGxvYWRNb3JlU3VjY2VzcyhkYXRhOiBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+Pikge1xuICAgIHRoaXMuYWRkSXRlbXMoZGF0YSwgZmFsc2UpO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlQWxsQ2hlY2tlZCgpIHtcbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoW10pO1xuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VDaGVja2VkQWxsSXRlbXMoZXZlbnQ6IElDaGVja2JveEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChcbiAgICAgICAgdGhpcy5pdGVtcygpXG4gICAgICAgICAgLmZpbHRlcihhc3luYyAoaXRlbSkgPT4gIShhd2FpdCB0aGlzLmNoZWNrQ2FuY2VsQ29uZGl0aW9uQ2hlY2tlZEl0ZW0oaXRlbSkpKVxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGAke2dldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWApXG4gICAgICApO1xuICAgICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tDYW5jZWxDb25kaXRpb25DaGVja2VkSXRlbShpdGVtOiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pIHtcbiAgICBsZXQgaXNDYW5jZWxDaGVjayA9IGZhbHNlO1xuXG4gICAgaWYgKCFpc0NhbmNlbENoZWNrICYmIHRoaXMuaGVhZGVyTGVmdCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlckxlZnQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuKSB7XG4gICAgICBpc0NhbmNlbENoZWNrID0gKGF3YWl0IGxhc3RWYWx1ZUZyb20oKHRoaXMuaGVhZGVyTGVmdCgpWzBdLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gYXMgYW55KSh7IGl0ZW06IGl0ZW0oKSB9KSkpIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaXNDYW5jZWxDaGVjayAmJiB0aGlzLmhlYWRlclJpZ2h0KCkubGVuZ3RoICYmIHRoaXMuaGVhZGVyUmlnaHQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuKSB7XG4gICAgICBpc0NhbmNlbENoZWNrID0gKGF3YWl0IGxhc3RWYWx1ZUZyb20oKHRoaXMuaGVhZGVyUmlnaHQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIGFzIGFueSkoeyBpdGVtOiBpdGVtKCkgfSkpKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNDYW5jZWxDaGVjaztcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoZXZlbnQ6IElDaGVja2JveEl0ZW0sIGl0ZW06IFRZUEVfT0JKRUNUKSB7XG4gICAgY29uc3Qga2V5ID0gZ2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSk7XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQodGhpcy5rZXlzU2VsZWN0ZWQoKSk7XG5cbiAgICBrZXlzLmFkZChrZXkpO1xuICAgIGlmICghZXZlbnQuY2hlY2tlZCkge1xuICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KEFycmF5LmZyb20oa2V5cykpO1xuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDaGFuZ2VTb3J0KHNvcnQ6IElTb3J0KSB7XG4gICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHRoaXMuaGVhZGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgfHwgMDtcbiAgICBpZiAodGhpcy5pbnN0YW5jZVNvcnQgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKT8uZmllbGRTb3J0ICE9PSBzb3J0LmZpZWxkU29ydCkge1xuICAgICAgdGhpcy5pbnN0YW5jZVNvcnQoKT8ucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5pbnN0YW5jZVNvcnQuc2V0KHNvcnQpO1xuICAgIGlmICh0aGlzLnNvcnRMb2NhbCgpKSB7XG4gICAgICB0aGlzLmhhbmRsZXJTb3J0TG9jYWwoc29ydCwgc2Nyb2xsTGVmdCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkpO1xuICAgIHRoaXMub3V0U29ydC5lbWl0KHtcbiAgICAgIHNvcnQ6IHNvcnQsXG4gICAgICBvblNvcnRTdWNjZXNzOiAoKSA9PiB0aGlzLm9uU29ydFN1Y2Nlc3Moc2Nyb2xsTGVmdCksXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbEFwaUJ5U2VydmljZSh0cnVlKTtcbiAgICAgIHRoaXMub25Tb3J0U3VjY2VzcyhzY3JvbGxMZWZ0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclNvcnRMb2NhbChzb3J0OiBJU29ydCwgc2Nyb2xsTGVmdDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSAmJiB0aGlzLnN0b3JlcygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5pdGVtcy5zZXQodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpPy4oc2lnbmFsKFsuLi50aGlzLnN0b3JlcygpXSksIHsgLi4udGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSwgaW5zdGFuY2VTb3J0OiBzb3J0IH0pIHx8IFtdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGZpZWxkU29ydCwgbW9kZSB9ID0gc29ydDtcblxuICAgIHRoaXMuaXRlbXMudXBkYXRlKChpdGVtcykgPT4ge1xuICAgICAgaXRlbXMuc29ydCgoaXRlbUEsIGl0ZW1CKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZTEgPSBtb2RlID09PSAnYXNjJyA/IGl0ZW1BKClbZmllbGRTb3J0XSA6IGl0ZW1CKClbZmllbGRTb3J0XTtcbiAgICAgICAgbGV0IHZhbHVlMiA9IG1vZGUgPT09ICdhc2MnID8gaXRlbUIoKVtmaWVsZFNvcnRdIDogaXRlbUEoKVtmaWVsZFNvcnRdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUxID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHZhbHVlMSA9IGRlbGV0ZVVuaWNvZGUodmFsdWUxKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgIHZhbHVlMiA9IGRlbGV0ZVVuaWNvZGUodmFsdWUyKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlMSA9PT0gdmFsdWUyKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWUxID4gdmFsdWUyID8gMSA6IC0xO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgIH0pO1xuICAgIHRoaXMub25Tb3J0U3VjY2VzcyhzY3JvbGxMZWZ0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sTW9yZVNlbGVjdEl0ZW0oZnVuY3Rpb25Db250cm9sOiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0gPSBmdW5jdGlvbkNvbnRyb2w7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkTW9yZUl0ZW0oZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQua2V5IHx8ICF0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbFNlbGVjdE1vcmVJdGVtPy5yZXNldCgpO1xuXG4gICAgY29uc3QgcGVyUGFnZSA9IE51bWJlcihldmVudC5rZXkpLnZhbHVlT2YoKTtcbiAgICBjb25zdCBjdXJyZW50UGVyUGFnZSA9IE51bWJlcih0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShwZXJQYWdlKSkudmFsdWVPZigpO1xuICAgIGNvbnN0IGlzUGFnaW5nTnVtYmVyID0gdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5wYWdpbmdOdW1iZXI7XG5cbiAgICBpZiAoY3VycmVudFBlclBhZ2UgPiBwZXJQYWdlIHx8IHRoaXMuaXRlbXMubGVuZ3RoID49IHBlclBhZ2UpIHtcbiAgICAgIGlmICghaXNQYWdpbmdOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBlclBhZ2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFxuICAgICAgICB0aGlzLml0ZW1zKClcbiAgICAgICAgICAuc2xpY2UoMCwgcGVyUGFnZSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiBgJHtnZXQ8dW5rbm93bj4oaXRlbSwgdGhpcy5maWVsZEtleSgpKX1gKVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSh0cnVlLCB0cnVlKTtcbiAgICBjb25zdCBzdWIgPSB0aGlzLm91dExvYWREYXRhQ29tcGxldGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKCFpc1BhZ2luZ051bWJlcikge1xuICAgICAgICB0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShjdXJyZW50UGVyUGFnZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoXG4gICAgICAgIHRoaXMuaXRlbXMoKVxuICAgICAgICAgIC5zbGljZSgwLCBwZXJQYWdlKVxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGAke2dldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWApXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vdXRMb2FkRGF0YUVycm9yLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShjdXJyZW50UGVyUGFnZSk7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0ocGVyUGFnZTogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcmd1bWVudHNWYWx1ZSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhKCk/LmFyZ3VtZW50c1ZhbHVlO1xuXG4gICAgaWYgKCFhcmd1bWVudHNWYWx1ZSB8fCAhdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpKSB7XG4gICAgICByZXR1cm4gJy0xJztcbiAgICB9XG4gICAgY29uc3Qga2V5UGVyUGFnZSA9IHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8ua2V5UGVyUGFnZSB8fCAncGVyX3BhZ2UnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHNWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGFyZ3VtZW50ID0gYXJndW1lbnRzVmFsdWVbaV07XG5cbiAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIEh0dHBQYXJhbXMgJiYgYXJndW1lbnQuaGFzKGtleVBlclBhZ2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQZXJQYWdlID0gZ2V0PHVua25vd24+KGFyZ3VtZW50LCBrZXlQZXJQYWdlLCAnMjUnIGFzIGFueSk7XG5cbiAgICAgICAgYXJndW1lbnQgPSBhcmd1bWVudC5zZXQoa2V5UGVyUGFnZSwgcGVyUGFnZSk7XG4gICAgICAgIHNldChhcmd1bWVudHNWYWx1ZSwgYCR7aX1gIGFzIGFueSwgYXJndW1lbnQpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50UGVyUGFnZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgT2JqZWN0ICYmIE9iamVjdC5rZXlzKGFyZ3VtZW50KS5pbmNsdWRlcyhrZXlQZXJQYWdlKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50UGVyUGFnZSA9IGdldChhcmd1bWVudCwga2V5UGVyUGFnZSwgJzI1Jyk7XG5cbiAgICAgICAgc2V0KGFyZ3VtZW50LCBrZXlQZXJQYWdlLCBwZXJQYWdlKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudFBlclBhZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICctMSc7XG4gIH1cblxuICBwcml2YXRlIG9uU29ydFN1Y2Nlc3Moc2Nyb2xsTGVmdDogbnVtYmVyKSB7XG4gICAgdGhpcy5yZXNldFNjcm9sbChzY3JvbGxMZWZ0LCAwKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckJ1dHRvbkNsaWNrKHR5cGU6ICdidXR0b24nIHwgJ2J1dHRvbi1kcm9wZG93bicsIGJ1dHRvbkRyb3Bkb3duRGF0YTogYW55LCBidXR0b246IElCdXR0b24pIHtcbiAgICAvLyBidXR0b25PcmlnaW4gY2jhu4kgc+G7rSBk4bulbmcga2hpIGTDuW5nIGJ1dHRvbkFjdGlvbnMgY8OzIGJ1dHRvbi1kcm9wZG93blxuICAgIGlmICh0eXBlID09PSAnYnV0dG9uJykge1xuICAgICAgcmV0dXJuIHRoaXMub3V0Q2xpY2tCdXR0b25BY3Rpb24uZW1pdCh7IGl0ZW06IHRoaXMuaXRlbU9mSW5kZXhIb3ZlciwgYnV0dG9uOiBidXR0b24gfSk7XG4gICAgfVxuICAgIHRoaXMub3V0Q2xpY2tCdXR0b25BY3Rpb24uZW1pdCh7IGl0ZW06IHRoaXMuaXRlbU9mSW5kZXhIb3ZlciwgYnV0dG9uLCBidXR0b25Ecm9wZG93bkRhdGEgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckJhckJ1dHRvbkNsaWNrKGJ1dHRvbjogSUJ1dHRvbikge1xuICAgIGNvbnN0IGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+PiA9IFtdO1xuXG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQoKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zKCkuZmluZCgoaXRlbSkgPT4gYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YCA9PT0gYCR7a2V5fWApO1xuXG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMub3V0Q2xpY2tCYXJCdXR0b24uZW1pdCh7XG4gICAgICBidXR0b24sXG4gICAgICBpdGVtcyxcbiAgICAgIGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCksXG4gICAgICBoaWRkZW5CYXJCdXR0b25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckJ1dHRvbkRyb3Bkb3duRXZlbnQoZXZlbnROYW1lOiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICB0aGlzLmhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudC5zZXQodHJ1ZSk7XG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gJ3JlbW92ZScgfHwgZXZlbnROYW1lID09PSAnbW91c2VsZWF2ZS1jb250ZW50Jykge1xuICAgICAgdGhpcy5oYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0SW5kZXhIb3ZlcihlOiBFdmVudCwgaXRlbTogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMuaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtT2ZJbmRleEhvdmVyID0gaXRlbTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEluZGV4SG92ZXJXaGVuTW91c2VMZWF2ZShlPzogRXZlbnQpIHtcbiAgICBlPy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjdXJyZW50SW5kZXhJdGVtSG92ZXIgPSB0aGlzLml0ZW1PZkluZGV4SG92ZXI7XG5cbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0TGVhdmVJdGVtKCkpO1xuICAgIHRoaXMudGltZW91dExlYXZlSXRlbS5zZXQoXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXRlbU9mSW5kZXhIb3ZlciAmJiB0aGlzLml0ZW1PZkluZGV4SG92ZXIgIT09IGN1cnJlbnRJbmRleEl0ZW1Ib3Zlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEluZGV4SG92ZXIoZT86IEV2ZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuaGFzQWN0aW9uQnV0dG9uRHJvcGRvd25Db250ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtT2ZJbmRleEhvdmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUxlYXZlQ29udGFpbmVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VFbnRlckhlYWRlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm1vdXNlRW50ZXJIZWFkZXIuc2V0KHRydWUpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VMZWF2ZUhlYWRlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm1vdXNlRW50ZXJIZWFkZXIuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlRW50ZXJGb290ZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZXZlbnQpO1xuICAgIGlmICh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKSB7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUxlYXZlRm9vdGVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKSB7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCgnYmctWyNmOGY5ZmFdJyk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsSGVhZGVyKGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMubW91c2VFbnRlckhlYWRlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICh0aGlzLmJvZHlFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgaWYgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpKSB7XG4gICAgICAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb2R5KGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5tb3VzZUVudGVySGVhZGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuICAgIH1cbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm90dG9tKGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5sb2FkaW5nKCkgfHwgdGhpcy5hY3Rpdml0eUxvYWREYXRhKCkgIT09ICdzY3JvbGwtaW5maW5pdHknKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3V0TG9hZE1vcmUuZW1pdCh7IGxvYWRNb3JlU3VjY2VzczogdGhpcy5sb2FkTW9yZVN1Y2Nlc3MuYmluZCh0aGlzKSB9KTtcbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VQYWdlKHBhZ2U6IG51bWJlcikge1xuICAgIHRoaXMucGFnaW5nU3RvcmUudXBkYXRlKChkYXRhKSA9PiAoeyAuLi4oZGF0YSB8fCB7fSksIHBhZ2UgfSkpO1xuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRTY3JvbGwoc2Nyb2xsUG9zaXRpb25MZWZ0PzogbnVtYmVyLCBzY3JvbGxQb3NpdGlvblRvcD86IG51bWJlcikge1xuICAgIGlmICh0aGlzLmhlYWRlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb25MZWZ0IHx8IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLkJvZHlFbGVtZW50KSB7XG4gICAgICB0aGlzLkJvZHlFbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFBvc2l0aW9uVG9wIHx8IDA7XG4gICAgICB0aGlzLkJvZHlFbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxQb3NpdGlvbkxlZnQgfHwgMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpKSB7XG4gICAgICAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxQb3NpdGlvbkxlZnQgfHwgMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KGNsZWFyU29ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2xlYXJTb3J0KSB7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydCgpPy5yZXNldCgpO1xuICAgICAgdGhpcy5pbnN0YW5jZVNvcnQuc2V0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRoaXMuaGFzU2Nyb2xsLnNldChmYWxzZSk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgIHRoaXMuZmFrZVJlc3BvbnNlQXBpKCk7XG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1Njcm9sbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoYXNTY3JvbGwgPSB0aGlzLmhhc1Njcm9sbCgpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aW1lcig1MDApXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5Cb2R5RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gdGhpcy5Cb2R5RWxlbWVudC5vZmZzZXRIZWlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFzU2Nyb2xsICYmICF0aGlzLmhhc1Njcm9sbCgpKSB7XG4gICAgICAgICAgICB0aGlzLm91dFNjcm9sbElzR29uZS5lbWl0KHt9KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgQm9keUVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmJvZHlFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhpZ2h0TGlnaHRJdGVtKGl0ZW1zOiBBcnJheTxUWVBFX0lURU1fREFUQV9UQUJMRT4pIHtcbiAgICB0aGlzLml0ZW1zSGlnaHRMaWdodC51cGRhdGUoKGl0ZW1zSGlnaHRMaWdodCkgPT4gWy4uLml0ZW1zSGlnaHRMaWdodCwgLi4uaXRlbXNdKTtcblxuICAgIHRpbWVyKHRoaXMudGltZUhpZ2hsaWdoTmV3SXRlbSgpKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXRlbXNIaWdodExpZ2h0LnVwZGF0ZSgoaXRlbXNIaWdodExpZ2h0KSA9PiBpdGVtc0hpZ2h0TGlnaHQuZmlsdGVyKChpdGVtSGlnaHRMaWdodCkgPT4gaXRlbUhpZ2h0TGlnaHQgIT09IGl0ZW0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0oKSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGxcIj5cbiAgQGlmICghaWdub3JlQmFyKCkpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHJlbGF0aXZlIHotWzFdIGJvdHRvbS0wIGxlZnQtMCB3LWZ1bGwgYmctd2hpdGUgbGlicy11aS10YWJsZS1zaGFkb3ctYm90dG9tIHt7IGNsYXNzQmFySW5jbHVkZSgpIH19XCJcbiAgICAgIFtjbGFzcy5weC1bMTZweF1dPVwia2V5c1NlbGVjdGVkKCkubGVuZ3RoIHx8IGxhYmVsQmFyTm9TZWxlY3RJdGVtKClcIlxuICAgICAgW2NsYXNzLnB5LVs2cHhdXT1cImtleXNTZWxlY3RlZCgpLmxlbmd0aCB8fCBsYWJlbEJhck5vU2VsZWN0SXRlbSgpXCJcbiAgICAgIChtb3VzZWVudGVyKT1cInJlc2V0SW5kZXhIb3ZlcigkZXZlbnQpXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJkaXYubGlicy11aS10YWJsZS1iYXItbGVmdFwiPjwvbmctY29udGVudD5cbiAgICAgIEBpZiAoIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBsYWJlbEJhck5vU2VsZWN0SXRlbSgpKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInt7IGNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSA/PyAncHgtWzEycHhdIHB5LVs1cHhdJyB9fVwiXG4gICAgICAgICAgW2lubmVySHRtbF09XCJsYWJlbEJhck5vU2VsZWN0SXRlbSgpIHwgdHJhbnNsYXRlOiB7IHZhbHVlOiB0b3RhbEl0ZW1EaXNwbGF5KCkgfVwiPjwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChrZXlzU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHBsLVsxMnB4XVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBoLWZ1bGwgbXQtWy0ycHhdXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZVxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8IGRpc2FibGVDaGVja2JveCgpXCJcbiAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQWxsQ2hlY2tlZCgpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg1bSB0ZXh0LVsjMDcxNjMxXSBtci1bOHB4XSB7eyBjbGFzc0xhYmVsQmFyQnV0dG9ucygpIH19XCI+XG4gICAgICAgICAgICB7eyBsYWJlbEJhckJ1dHRvbnMoKSB8IHRyYW5zbGF0ZTogeyB2YWx1ZToga2V5c1NlbGVjdGVkKCkubGVuZ3RoIH0gfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7XG4gICAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaWdub3JlQXJyb3c6IHRydWUsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiAyMDQ4LFxuICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZTogJyF3LVsxMjFweF0nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBtb2RlOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdNb3JlSXRlbSgpXCJcbiAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCI1XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCIhdy1bMTZweF0gaC1bMTZweF0gbXItWzhweF1cIlxuICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZE1vcmVJdGVtKCRldmVudClcIlxuICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sTW9yZVNlbGVjdEl0ZW0oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wIG0tMCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidiZWZvcmU6IXRleHQtWzE2cHhdIGxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCBtci1bNnB4XSdcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cInsgY29uZmlnOiB7IGNvbnRlbnQ6ICdpMThuX21vcmVfc2VsZWN0JyB9IH1cIlxuICAgICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1bMTZweF0gbGlicy11aS1ib3JkZXItbGVmdC1nZW5lcmFsIG1sLVsxNnB4XVwiPjwvZGl2PlxuICAgICAgICAgIEBpZiAoYmFyQnV0dG9ucygpPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBiYXJCdXR0b25zKCk7IHRyYWNrIGJ1dHRvbikge1xuICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbExhYmVsID0gYnV0dG9uLmxhYmVsIHx8ICcgJztcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImJ1dHRvbi50eXBlIHx8ICdidXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiYnV0dG9uLmNsYXNzSWNvbkxlZnQgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbnN0SHRtbExhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckJhckJ1dHRvbkNsaWNrKGJ1dHRvbilcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJkaXYubGlicy11aS10YWJsZS1iYXItcmlnaHRcIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIH1cblxuICA8ZGl2XG4gICAgI3RhYmxlQ29udGFpbmVyRWxlbWVudFJlZlxuICAgIGNsYXNzPVwibGlicy11aS10YWJsZSBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgcmVsYXRpdmUge3sgY2xhc3NUYWJsZUNvbnRhaW5lckluY2x1ZGUoKSB9fVwiXG4gICAgW2NsYXNzLnB4LVsxNnB4XV09XCIhaWdub3JlQmFyKClcIlxuICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZXJNb3VzZUxlYXZlQ29udGFpbmVyKCRldmVudClcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJlbGF0aXZlIHctZnVsbCBzaHJpbmstMFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImhlYWRlckVsZW1lbnRSZWYub2Zmc2V0SGVpZ2h0XCJcbiAgICAgIFtjbGFzcy4haGlkZGVuXT1cIiFpdGVtcygpLmxlbmd0aCAmJiBpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKVwiPlxuICAgICAgPGRpdlxuICAgICAgICAjaGVhZGVyRWxlbWVudFJlZlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICBbb3B0aW9uc109XCJ7IHNjcm9sbGJhcldpZHRoOiAwIH1cIlxuICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLWRhc2hlZC1nZW5lcmFsXT1cIiFoYXNJdGVtSGlnaHRMaWdodCgpICYmIGlzRGFzaEJvcmRlcigpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsXT1cIiFoYXNJdGVtSGlnaHRMaWdodCgpICYmICFpc0Rhc2hCb3JkZXIoKVwiXG4gICAgICAgIFtjbGFzc109XCJjbGFzc0hlYWRlckNvbnRhaW5lcigpXCJcbiAgICAgICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsSGVhZGVyKCRldmVudClcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVyTW91c2VFbnRlckhlYWRlcigkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaGFuZGxlck1vdXNlTGVhdmVIZWFkZXIoJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICA8ZGl2IFtjbGFzc109XCJjbGFzc0hlYWRlckxlZnRDb250YWluZXIoKVwiPlxuICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlclJlZjsgY29udGV4dDogeyBoZWFkZXJJdGVtOiBoZWFkZXIsIGlzSGVhZGVyTGVmdDogdHJ1ZSB9XCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGhlYWRlclJpZ2h0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlclJpZ2h0KCk7IHRyYWNrIGhlYWRlcikge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmOyBjb250ZXh0OiB7IGhlYWRlckl0ZW06IGhlYWRlciwgaXNIZWFkZXJMZWZ0OiBmYWxzZSB9XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIEBpZiAoc2hvd0Zvb3RlcigpICYmIGl0ZW1Gb290ZXIoKSAmJiBjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAndG9wJykge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlRm9vdGVyUmVmXCIgLz5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCBvdmVyZmxvdy14LWhpZGRlbiBiZy13aGl0ZSB7eyBjbGFzc0JvZHlJbmNsdWRlKCkgfHwgJycgfX1cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgI2JvZHlFbGVtZW50UmVmXG4gICAgICAgIGNsYXNzPVwiZmxleCBoLWZ1bGwgdy1mdWxsIHJlbGF0aXZlXCJcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsQm9keSgkZXZlbnQpXCJcbiAgICAgICAgKG91dFNjcm9sbEJvdHRvbSk9XCJoYW5kbGVyU2Nyb2xsQm90dG9tKCRldmVudClcIj5cbiAgICAgICAgQGlmIChpdGVtcygpLmxlbmd0aCkge1xuICAgICAgICAgIDx2aXJ0dWFsLXNjcm9sbGVyXG4gICAgICAgICAgICAjYm9keUNvbXBvbmVudFJlZlxuICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW1zKClcIlxuICAgICAgICAgICAgW2VuYWJsZVVuZXF1YWxDaGlsZHJlblNpemVzXT1cImVuYWJsZVVuZXF1YWxDaGlsZHJlblNpemVzKClcIlxuICAgICAgICAgICAgY2xhc3M9XCJoLWZ1bGxcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGggPiAoYm9keUVsZW1lbnRSZWYgPyBib2R5RWxlbWVudFJlZi5zY3JvbGxXaWR0aCA6IDApID8gaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aCA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICBbcGFyZW50U2Nyb2xsXT1cImJvZHlFbGVtZW50UmVmXCJcbiAgICAgICAgICAgIFtidWZmZXJBbW91bnRdPVwiYnVmZmVyQW1vdW50KClcIj5cbiAgICAgICAgICAgIEBmb3IgKGRhdGEgb2YgYm9keUNvbXBvbmVudFJlZi52aWV3UG9ydEl0ZW1zOyB0cmFjayBkYXRhKCkpIHtcbiAgICAgICAgICAgICAgQGxldCBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtID0gZGF0YSB8IExpYnNVaVRhYmxlQ2hlY2tJdGVtSGlnaHRMaWdodFBpcGU6IGl0ZW1zSGlnaHRMaWdodCgpO1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgI2VsZW1lbnRIb3ZlclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJnLVsjZjNmY2ZjXV09XCJjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItdG9wLTFweC0zNmQzZDNdPVwiY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbSAmJiAkZmlyc3QgJiYgIWlnbm9yZUJvcmRlckl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWJvdHRvbS0xcHgtMzZkM2QzXT1cImNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW0gJiYgIWlnbm9yZUJvcmRlckl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtIHx8ICgkbGFzdCAmJiBpZ25vcmVCb3JkZXJJdGVtTGFzdCgpKVxuICAgICAgICAgICAgICAgICAgICA/ICdsaWJzLXVpLWJvcmRlci1yYWRpdXMtYm90dG9tLWxlZnQtNHB4IGxpYnMtdWktYm9yZGVyLXJhZGl1cy1ib3R0b20tcmlnaHQtNHB4J1xuICAgICAgICAgICAgICAgICAgICA6IGlnbm9yZUJvcmRlckl0ZW0oKVxuICAgICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgICA6IGlzRGFzaEJvcmRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZGFzaGVkLWdlbmVyYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCdcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmOGY5ZmFdXT1cIml0ZW1PZkluZGV4SG92ZXIgPT09IGRhdGEgJiYgIWNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW1cIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNldEluZGV4SG92ZXIoJGV2ZW50LCBkYXRhKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwicmVzZXRJbmRleEhvdmVyV2hlbk1vdXNlTGVhdmUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIEBpZiAoaGVhZGVyTGVmdCgpLmxlbmd0aCB8fCBoZWFkZXJSaWdodCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaGVhZGVyTGVmdCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggc3RpY2t5IHRvcC0wIGxlZnQtMCB6LVsxXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy13aGl0ZV09XCIhY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2YzZmNmY11dPVwiY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyTGVmdCgpOyB0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggcHgtWzEycHhdIHB5LVs4cHhdIHt7IGhlYWRlci5pZ25vcmVCb3JkZXJSaWdodCA/ICcnIDogJ2xpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwnIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2Y4ZjlmYV1dPVwiaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJMZWZ0IHx8IGZhbHNlIDogaGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aCA6IGhlYWRlckxlZnQoKSA6IGhlYWRlclJpZ2h0KCkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHsgd2lkdGg6ICc1MHB4JywgJ2ZsZXgtc2hpcmsnOiAnMCcsIHBhZGRpbmc6ICc4cHgnIH0gOiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlQm9keVJlZjsgY29udGV4dDogeyBoZWFkZXI6IGhlYWRlciwgZGF0YTogZGF0YSwgY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbTogY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbSB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGhlYWRlciBvZiBoZWFkZXJSaWdodCgpOyB0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCBweC1bMTJweF0gcHktWzhweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJSaWdodCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8geyB3aWR0aDogJzUwcHgnLCAnZmxleC1zaGlyayc6ICcwJywgcGFkZGluZzogJzhweCcgfSA6IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaGVhZGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmOyBjb250ZXh0OiB7IGhlYWRlcjogaGVhZGVyLCBkYXRhOiBkYXRhLCBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtOiBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCkgJiYgZGF0YSgpLnNwZWNpZmljRXhwYW5kICYmIGRhdGEoKVtjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5maWVsZEdldERhdGFFeHBhbmQgfHwgJ3NwZWNpZmljRGF0YUV4cGFuZCddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uY3NzV3JhcHBlciB8fCAnZmxleCB3LWZ1bGwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXRhRXhwYW5kIG9mIGRhdGEoKVtjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5maWVsZEdldERhdGFFeHBhbmQgfHwgJ3NwZWNpZmljRGF0YUV4cGFuZCddKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChvcHRpbWl6ZVRhYmxlUmVuZGVyQnlPblZpZXdwb3J0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBkZWZlciAob24gdmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJkYXRhRXhwYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8udGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQHBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8udGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAndy1mdWxsIGgtZnVsbCdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cImRhdGFFeHBhbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8udGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8udGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZW1wdHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgaC1bMTAwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlTm9kYXRhUmVmXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC92aXJ0dWFsLXNjcm9sbGVyPlxuICAgICAgICB9IEBlbHNlIGlmICghbG9hZGluZygpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0aWNreSBsZWZ0LTAgdG9wLTAgei1bMV0gaC1bY2FsYygxMDAlLTEwcHgpXSB3LWZ1bGxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChzaG93U2Nyb2xsVGFibGVQaW5uZWRJZk5vRGF0YSgpKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgaC1bMXB4XSBiZy10cmFuc3BhcmVudCB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aFwiPjwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoc2hvd0Zvb3RlcigpICYmIGl0ZW1Gb290ZXIoKSAmJiBjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAnYm90dG9tJykge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVGb290ZXJSZWZcIiAvPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgdy1mdWxsIGgtZnVsbCB6LVsyXSBmbGV4IGl0ZW1zLWNlbnRlciBjb250ZW50LWNlbnRlclwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc3Bpbm5lciAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoYWN0aXZpdHlMb2FkRGF0YSgpID09PSAnY2xpY2stcGFnaW5hdGlvbicpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBtdC1bMTJweF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wYWdpbmF0aW9uXG4gICAgICAgICAgW21vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2VdPVwicGFnaW5hdGlvblNldHRpbmcoKT8ubW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSB8fCAnYm90dG9tJ1wiXG4gICAgICAgICAgW2NsYXNzRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlXT1cInBhZ2luYXRpb25TZXR0aW5nKCk/LmNsYXNzRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlIHx8ICcnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlSXRlbV09XCJwYWdpbmF0aW9uU2V0dGluZygpPy5jbGFzc0luY2x1ZGVJdGVtIHx8ICcnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlQ29udGFpbmVyXT1cInBhZ2luYXRpb25TZXR0aW5nKCk/LmNsYXNzSW5jbHVkZUNvbnRhaW5lciB8fCAnIWl0ZW1zLWVuZCdcIlxuICAgICAgICAgIFtkaXNhYmxlXT1cInBhZ2luYXRpb25TZXR0aW5nKCk/LmRpc2FibGUgfHwgbG9hZGluZygpIHx8ICFpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgW251bWJlclBhZ2VEaXNwbGF5XT1cInBhZ2luYXRpb25TZXR0aW5nKCk/Lm51bWJlclBhZ2VEaXNwbGF5IHx8IDVcIlxuICAgICAgICAgIFtzaG93VG90YWxQYWdlXT1cInBhZ2luYXRpb25TZXR0aW5nKCk/LnNob3dUb3RhbFBhZ2UgfHwgZmFsc2VcIlxuICAgICAgICAgIFtzaG93SW5wdXRHb3RvUGFnZV09XCJwYWdpbmF0aW9uU2V0dGluZygpPy5zaG93SW5wdXRHb3RvUGFnZSB8fCBmYWxzZVwiXG4gICAgICAgICAgW3RvdGFsSXRlbXNdPVwicGFnaW5nU3RvcmUoKT8udG90YWxfaXRlbXMgfHwgKHBhZ2luZ1N0b3JlKCk/LnRvdGFsX3BhZ2VzIHx8IDApICogKHBhZ2luZ1N0b3JlKCk/LnBlcl9wYWdlIHx8IDApXCJcbiAgICAgICAgICBbcGVyUGFnZV09XCJwYWdpbmdTdG9yZSgpPy5wZXJfcGFnZSB8fCAwXCJcbiAgICAgICAgICBbY3VycmVudFBhZ2VdPVwicGFnaW5nU3RvcmUoKT8ucGFnZSB8fCAwXCJcbiAgICAgICAgICAob3V0UGFnZVNlbGVjdCk9XCJoYW5kbGVyQ2hhbmdlUGFnZSgkZXZlbnQpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICN0ZW1wbGF0ZUhlYWRlclJlZlxuICBsZXQtaGVhZGVyPVwiaGVhZGVySXRlbVwiXG4gIGxldC1pc0hlYWRlckxlZnQ9XCJpc0hlYWRlckxlZnRcIj5cbiAgPGRpdlxuICAgIFtjbGFzc109XCIncmVsYXRpdmUgZmxleCAnICsgKGhlYWRlci5wYWRkaW5nTGVmdFJpZ2h0SGVhZGVyQ29udGFpbmVyID8/ICcgcHgtWzEycHhdICcpICsgKGlzSGVhZGVyTGVmdCAmJiAhaGVhZGVyLmlnbm9yZUJvcmRlclJpZ2h0ID8gJyBsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsICcgOiAnICcpICsgJyBsaWJzLXVpLXRhYmxlLWhlYWRlci1jb2wgJ1wiXG4gICAgW2NsYXNzLmZsZXgtY29sXT1cImhlYWRlci5yb3dzQ29uZmlnXCJcbiAgICBbY2xhc3MucHktWzhweF1dPVwiIWhlYWRlci5pZ25vcmVQeURlZmF1bHRcIlxuICAgIFtuZ1N0eWxlXT1cIlxuICAgICAgKGhlYWRlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IChpc0hlYWRlckxlZnQgPyBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyTGVmdCB8fCBmYWxzZSA6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJSaWdodCB8fCBmYWxzZSkgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogaGVhZGVyTGVmdCgpIDogaGVhZGVyUmlnaHQoKSkgfHxcbiAgICAgIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHsgd2lkdGg6ICc1MHB4JywgJ2ZsZXgtc2hpcmsnOiAnMCcsIHBhZGRpbmc6ICc4cHgnIH0gOiB7fSlcbiAgICBcIlxuICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgQGlmICghaGVhZGVyLnJvd3NDb25maWcpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7IGNvbnRleHQ6IHsgaGVhZGVySXRlbTogaGVhZGVyLCBpc0NvbFJlbmRlcjogZmFsc2UsIGlzSGVhZGVyTGVmdDogaXNIZWFkZXJMZWZ0IH1cIiAvPlxuICAgIH1cbiAgICBAaWYgKGhlYWRlci5yb3dzQ29uZmlnOyBhcyByb3dzQ29uZmlnKSB7XG4gICAgICBAZm9yIChyb3cgb2Ygcm93c0NvbmZpZy5yb3dzOyB0cmFjayByb3cpIHtcbiAgICAgICAgPGRpdiBbY2xhc3NdPVwicm93LmNsYXNzUm93XCI+XG4gICAgICAgICAgQGZvciAoY29sIG9mIHJvdy5jb2xzOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7IGNvbnRleHQ6IHsgaGVhZGVySXRlbTogY29sLCBpc0NvbFJlbmRlcjogdHJ1ZSwgaXNIZWFkZXJMZWZ0OiBpc0hlYWRlckxlZnQgfVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICN0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWZcbiAgbGV0LWhlYWRlcj1cImhlYWRlckl0ZW1cIlxuICBsZXQtaXNDb2xSZW5kZXI9XCJpc0NvbFJlbmRlclwiXG4gIGxldC1pc0hlYWRlckxlZnQ9XCJpc0hlYWRlckxlZnRcIj5cbiAgPGRpdlxuICAgICNpdGVtSGVhZGVyUmVmXG4gICAgY2xhc3M9XCJmbGV4IGxpYnMtdWktZm9udC1oNm0gbWluLWgtWzE4cHhdIHRleHQtWyM2YTczODNdIG1heC13LWZ1bGxcIlxuICAgIFtjbGFzcy5pdGVtcy1jZW50ZXJdPVwiaGVhZGVyLmNvbnRlbnRIZWFkZXJBbGlnbkNlbnRlciA/PyB0cnVlXCJcbiAgICBbY2xhc3MuanVzdGlmeS1lbmRdPVwiaGVhZGVyLmNvbnRlbnRIZWFkZXJKdXN0aWZ5Q29udGVudEVuZFwiXG4gICAgW2NsYXNzLnctZnVsbF09XCJoZWFkZXIuaXNTaG93SW5kZXhPblJvd1wiXG4gICAgW25nU3R5bGVdPVwiXG4gICAgICBpc0NvbFJlbmRlclxuICAgICAgICA/IChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiAoaXNIZWFkZXJMZWZ0ID8gaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyKCk/LmhlYWRlckxlZnQgfHwgZmFsc2UgOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UpIDogaGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aCA6IGhlYWRlckxlZnQoKSA6IGhlYWRlclJpZ2h0KCkpIHx8XG4gICAgICAgICAgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8geyB3aWR0aDogJzUwcHgnLCAnZmxleC1zaGlyayc6ICcwJywgcGFkZGluZzogJzhweCcgfSA6IHt9KVxuICAgICAgICA6IHt9XG4gICAgXCJcbiAgICBbbmdDbGFzc109XCJpc0NvbFJlbmRlciA/IGhlYWRlci5uZ0NsYXNzIHx8IHt9IDoge31cIj5cbiAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveCkge1xuICAgICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3hBbGwpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBoLWZ1bGwge3sgaGVhZGVyLmNoZWNrYm94QWxsQ2xhc3NJbmNsdWRlIHx8ICdtci1bMTZweF0nIH19XCJcbiAgICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cImhlYWRlci5jaGVja2JveEFsaWduQ2VudGVyXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGVcbiAgICAgICAgICAgIFtrZXldPVwiJ2FsbCdcIlxuICAgICAgICAgICAgW3N0aWxsT3RoZXJPcHRpb25zXT1cIiEha2V5c1NlbGVjdGVkKCkubGVuZ3RoICYmIGtleXNTZWxlY3RlZCgpLmxlbmd0aCAhPT0gaXRlbXMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiISFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoID09PSBpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKClcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIuY2hlY2tib3hDbGFzc0luY2x1ZGVcIlxuICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZEFsbEl0ZW1zKCRldmVudClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBoLWZ1bGwgbWwtWzI0cHhdIHt7IGhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZSB9fVwiPjwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgICBAZm9yICh0b29sdGlwIG9mIGhlYWRlci50b29sdGlwc0xlZnQ7IHRyYWNrIHRvb2x0aXApIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtci1bNHB4XVwiPlxuICAgICAgICBAbGV0IGNvbnN0SHRtbFRvb2x0aXAgPSB0b29sdGlwLmRhdGFWaWV3IHx8ICcgJztcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgW3R5cGVdPVwidG9vbHRpcD8udHlwZSB8fCAnb3RoZXInXCJcbiAgICAgICAgICBbbW9kZV09XCJ0b29sdGlwPy5tb2RlIHx8ICdob3ZlcidcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwidG9vbHRpcC5jbGFzc0luY2x1ZGUgfHwgJ3RleHQtWyM2YTczODNdJ1wiXG4gICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cInRvb2x0aXAuaWdub3JlU2hvd1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgIFtjb25maWddPVwiXG4gICAgICAgICAgICB0b29sdGlwLmNvbmZpZyB8fCB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnN0SHRtbFRvb2x0aXAgfCB0cmFuc2xhdGUsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgbW9kZTogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsXG4gICAgICAgICAgICAgICAgYXV0b1VwZGF0ZVBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBlbmREaXN0YW5jZTogMTIsXG4gICAgICAgICAgICAgICAgICBzdGFydERpc3RhbmNlOiAtMTIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwidG9vbHRpcC5kYXRhVmlld1wiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB7eyBoZWFkZXIuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICB7eyBoZWFkZXIubGFiZWwgPz8gJyMnIH19XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBpZiAoaGVhZGVyLmxhYmVsIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogaGVhZGVyLnBhcnNlVmFsdWUgOiBoZWFkZXIgfCBhc3luYyB8IHRyYW5zbGF0ZTsgYXMgbGFiZWxIZWFkZXJDb2x1bW4pIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgW3R5cGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8udHlwZSB8fCAndGV4dCdcIlxuICAgICAgICAgIFttb2RlXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXI/LmxhYmVsQ29uZmlnPy5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJoZWFkZXI/LmxhYmVsQ29uZmlnPy5pZ25vcmVTaG93VG9vbHRpcCB8fCBmYWxzZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJoZWFkZXIubGFiZWxDb25maWc/LmNvbmZpZyB8fCB7IGNvbnRlbnQ6IGxhYmVsSGVhZGVyQ29sdW1uIH1cIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwibGFiZWxIZWFkZXJDb2x1bW5cIiAvPlxuICAgICAgfVxuICAgIH1cblxuICAgIEBmb3IgKHRvb2x0aXAgb2YgaGVhZGVyLnRvb2x0aXBzUmlnaHQ7IHRyYWNrIHRvb2x0aXApIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtbC1bNHB4XVwiPlxuICAgICAgICBAbGV0IGNvbnN0SHRtbFRvb2x0aXAgPSB0b29sdGlwLmRhdGFWaWV3IHx8ICcgJztcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgW3R5cGVdPVwidG9vbHRpcD8udHlwZSB8fCAnb3RoZXInXCJcbiAgICAgICAgICBbbW9kZV09XCJ0b29sdGlwPy5tb2RlIHx8ICdob3ZlcidcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwidG9vbHRpcC5jbGFzc0luY2x1ZGUgfHwgJ3RleHQtWyM2YTczODNdJ1wiXG4gICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cInRvb2x0aXAuaWdub3JlU2hvd1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgIFtjb25maWddPVwiXG4gICAgICAgICAgICB0b29sdGlwLmNvbmZpZyB8fCB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnN0SHRtbFRvb2x0aXAgfCB0cmFuc2xhdGUsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgbW9kZTogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsXG4gICAgICAgICAgICAgICAgYXV0b1VwZGF0ZVBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBlbmREaXN0YW5jZTogMTIsXG4gICAgICAgICAgICAgICAgICBzdGFydERpc3RhbmNlOiAtMTIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwidG9vbHRpcC5kYXRhVmlld1wiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5oYXNTb3J0ICYmIGhlYWRlci5vcmRlcmJ5KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWwtWzRweF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXNvcnQtYXJyb3dcbiAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgIWl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICBbZmllbGRTb3J0XT1cImhlYWRlci5vcmRlcmJ5XCJcbiAgICAgICAgICBbaWdub3JlUG9wb3ZlckNvbnRlbnRdPVwiaGVhZGVyLnNvcnRJZ25vcmVUb29sdGlwQ29udGVudCA/PyB0cnVlXCJcbiAgICAgICAgICBbcG9wb3ZlckNvbnRlbnRBc2NdPVwiaGVhZGVyLnNvcnRUb29sdGlwQ29udGVudEFzY1wiXG4gICAgICAgICAgW3BvcG92ZXJDb250ZW50RGVzY109XCJoZWFkZXIuc29ydFRvb2x0aXBDb250ZW50RGVzY1wiXG4gICAgICAgICAgW2RlZmF1bHRNb2RlXT1cImhlYWRlci5kZWZhdWx0TW9kZVwiXG4gICAgICAgICAgW3pJbmRleF09XCJoZWFkZXIuekluZGV4VG9vbHRpcFNvcnRcIlxuICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZVNvcnQoJGV2ZW50KVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKGhlYWRlci5sYWJlbERlc2NyaXB0aW9uKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiBoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jb250ZW50IHwgdHJhbnNsYXRlIH1cIlxuICAgICAgICBbaW5uZXJIVE1MXT1cImhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNvbnRlbnQgfCB0cmFuc2xhdGVcIiAvPlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3RlbXBsYXRlQm9keVJlZlxuICBsZXQtaGVhZGVyPVwiaGVhZGVyXCJcbiAgbGV0LWRhdGE9XCJkYXRhXCJcbiAgbGV0LWNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW09XCJjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtXCI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBoLWZ1bGxcIj5cbiAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZsZXggaC1mdWxsXCJcbiAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCJoZWFkZXIuY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiAmJiAoZGF0YSgpIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogaGVhZGVyLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gOiBkYXRhKCkgfCBhc3luYylcIlxuICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cImhlYWRlci5jaGVja2JveEFsaWduQ2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXG4gICAgICAgICAgW2tleV09XCJkYXRhKClbZmllbGRLZXkoKV1cIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiaGVhZGVyLmNoZWNrYm94Q2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICBbY2hlY2tlZF09XCJkYXRhKClbZmllbGRLZXkoKV0gfCBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGU6IGtleXNTZWxlY3RlZCgpIDoga2V5c1NlbGVjdGVkKCkubGVuZ3RoXCJcbiAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgZGlzYWJsZUNoZWNrYm94KCkgfHwgISEobWF4SXRlbVNlbGVjdGVkKCkgJiYgIShkYXRhKClbZmllbGRLZXkoKV0gfCBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGU6IGtleXNTZWxlY3RlZCgpIDoga2V5c1NlbGVjdGVkKCkubGVuZ3RoKSAmJiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggPj0gbWF4SXRlbVNlbGVjdGVkKCkpXCJcbiAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZCgkZXZlbnQsIGRhdGEoKSlcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdzsgYXMgY29uZmlnKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGxpYnMtdWktZm9udC1oNHJ7eyBjb25maWcuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgIFtjb25maWddPVwie31cIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwiZGF0YSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGdldEluZGV4Um93IHwgYXN5bmNcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICBAbGV0IGNvbnN0SHRtbElzSG92ZXIgPSBpdGVtT2ZJbmRleEhvdmVyID09PSBkYXRhICYmICFjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtO1xuICAgICAgQGlmIChvcHRpbWl6ZVRhYmxlUmVuZGVyQnlPblZpZXdwb3J0KCkpIHtcbiAgICAgICAgQGRlZmVyIChvbiB2aWV3cG9ydCkge1xuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICBbaXNIb3Zlcl09XCJjb25zdEh0bWxJc0hvdmVyXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJoZWFkZXIudGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAnJ1wiXG4gICAgICAgICAgICBbaXRlbV09XCJkYXRhXCJcbiAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICBbY29uZmlnc109XCJoZWFkZXIuY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICB9IEBwbGFjZWhvbGRlciB7XG4gICAgICAgICAgPGRpdiBbY2xhc3NdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJ3ctZnVsbCBoLWZ1bGwnXCI+PC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgIFtpc0hvdmVyXT1cImNvbnN0SHRtbElzSG92ZXJcIlxuICAgICAgICAgIFtjbGFzc109XCJoZWFkZXIudGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAnJ1wiXG4gICAgICAgICAgW2l0ZW1dPVwiZGF0YVwiXG4gICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJoZWFkZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICBbY29uZmlnc109XCJoZWFkZXIuY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlRm9vdGVyUmVmPlxuICBAaWYgKCFpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKSB8fCAoaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhKCkgJiYgaXRlbXMoKS5sZW5ndGgpKSB7XG4gICAgPGRpdlxuICAgICAgI2Zvb3RlckVsZW1lbnRSZWZcbiAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgYmctWyNmOGY5ZmFdIG92ZXJmbG93LXgtaGlkZGVuIHotWzFdIHt7IGlnbm9yZUJvcmRlckZvb3RlcigpID8gJycgOiBjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAndG9wJyA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCcgOiAnbGlicy11aS10YWJsZS1zaGFkb3ctdG9wIGxpYnMtdWktYm9yZGVyLXRvcC1nZW5lcmFsJyB9fSBtaW4taC1bMzVweF1cIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlck1vdXNlRW50ZXJGb290ZXIoJGV2ZW50KVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVyTW91c2VMZWF2ZUZvb3RlcigkZXZlbnQpXCI+XG4gICAgICBAaWYgKGZvb3RlckxlZnQoKSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgI2Zvb3RlckxlZnRFbGVtZW50UmVmXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV0gYmctWyNmOGY5ZmFdXCI+XG4gICAgICAgICAgQGZvciAoZm9vdGVyIG9mIGZvb3RlckxlZnQoKTsgdHJhY2sgZm9vdGVyKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzEycHhdIHB5LVs4cHhdIHt7IGZvb3Rlci5pZ25vcmVCb3JkZXJSaWdodCA/ICcnIDogJ2xpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwnIH19XCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwiKGZvb3RlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJMZWZ0IHx8IGZhbHNlIDogaGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aCA6IGZvb3RlckxlZnQoKSA6IGZvb3RlclJpZ2h0KCkpIHx8IHt9XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgQGlmIChmb290ZXIuY29sVGVtcGxhdGVDb25maWcgJiYgaXRlbUZvb3RlcigpKSB7XG4gICAgICAgICAgICAgICAgQGlmIChvcHRpbWl6ZVRhYmxlUmVuZGVyQnlPblZpZXdwb3J0KCkpIHtcbiAgICAgICAgICAgICAgICAgIEBkZWZlciAob24gdmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtRm9vdGVyIHwgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICAgIH0gQHBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJ3ctZnVsbCBoLWZ1bGwnXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtRm9vdGVyIHwgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGZvb3RlclJpZ2h0KCkpIHtcbiAgICAgICAgQGZvciAoZm9vdGVyIG9mIGZvb3RlclJpZ2h0KCk7IHRyYWNrIGZvb3Rlcikge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihmb290ZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogZm9vdGVyTGVmdCgpIDogZm9vdGVyUmlnaHQoKSkgfHwge31cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgIEBpZiAoZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnICYmIGl0ZW1Gb290ZXIoKSkge1xuICAgICAgICAgICAgICBAaWYgKG9wdGltaXplVGFibGVSZW5kZXJCeU9uVmlld3BvcnQoKSkge1xuICAgICAgICAgICAgICAgIEBkZWZlciAob24gdmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1Gb290ZXIgfCBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGVcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJmb290ZXIuY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICAgICAgICAgIH0gQHBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICd3LWZ1bGwgaC1mdWxsJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1Gb290ZXIgfCBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGVcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJmb290ZXIuY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZU5vZGF0YVJlZj5cbiAgQGlmIChrZXlTZWFyY2goKSB8fCBvbmx5U2hvd05vUmVzdWx0KCkpIHtcbiAgICBAaWYgKHRlbXBsYXRlTm9SZXN1bHQoKTsgYXMgdGVtcGxhdGVOb1Jlc3VsdCkge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlTm9SZXN1bHRcIiAvPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgYWJzb2x1dGUgbGVmdC0wIHRvcC0wIHotWzFdXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIHNocmluay0wXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCInbm8tcmVzdWx0JyB8IExpYnNVaUljb25zR2V0SWNvbkNvbXBvbmVudFBpcGUgfCBhc3luYzsgaW5wdXRzOiB7IHNpemU6IDY0IH1cIiAvPlxuICAgICAgICAgIEBsZXQgY29uc3RIdG1sVGV4dFNlYXJjaE5vRGF0YSA9IG5vRGF0YUNvbmZpZygpLnRleHRTZWFyY2hOb0RhdGEgfHwgJ2kxOG5fbm9fcmVzdWx0JztcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktdGFibGUtbm8tZGF0YS1jb25maWctdGV4dFwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJub0RhdGFDb25maWcoKS5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm5vRGF0YUNvbmZpZygpLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJjb25zdEh0bWxUZXh0U2VhcmNoTm9EYXRhIHwgdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9IEBlbHNlIHtcbiAgICBAaWYgKHRlbXBsYXRlTm9EYXRhKCk7IGFzIHRlbXBsYXRlTm9EYXRhKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb0RhdGFcIiAvPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgYWJzb2x1dGUgbGVmdC0wIHRvcC0wIHotWzFdXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIHNocmluay0wXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCInbm8tZGF0YScgfCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIHwgYXN5bmM7IGlucHV0czogeyBzaXplOiA2NCB9XCIgLz5cbiAgICAgICAgICBAbGV0IGNvbnN0SHRtbFRleHROb0RhdGEgPSBub0RhdGFDb25maWcoKS50ZXh0Tm9EYXRhIHx8ICdpMThuX25vX2RhdGFfeWV0JztcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktdGFibGUtbm8tZGF0YS1jb25maWctdGV4dFwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJub0RhdGFDb25maWcoKS5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm5vRGF0YUNvbmZpZygpLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJjb25zdEh0bWxUZXh0Tm9EYXRhIHwgdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
736
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3hOLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBNEIscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRyxPQUFPLEVBQVcsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRyxPQUFPLEVBQVMseUNBQXlDLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRyxPQUFPLEVBQWtCLHVDQUF1QyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUcsT0FBTyxFQUFpRCxpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWhJLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRyxPQUFPLEVB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cHlCVSw4QkFBOEI7NEZBQTlCLDhCQUE4Qiw4bFJDL0UzQywwLzNCQTBqQkEsbXBCRG5nQkksT0FBTyxvRkFDUCxPQUFPLHNFQUNQLFNBQVMsOENBQ1QsZ0JBQWdCLG9KQUNoQixpQkFBaUIsb1BBQ2pCLHVDQUF1Qyw0SUFDdkMsZUFBZSwyRkFDZixxQkFBcUIsdXRCQUNyQixzQ0FBc0MsaWpCQUN0QyxvQ0FBb0MsNkVBQ3BDLGlDQUFpQyxpMURBQ2pDLHlDQUF5QyxzUUFDekMsbUNBQW1DLHVXQUNuQyx1Q0FBdUMscXBCQUN2QywrQkFBK0Isd0VBQy9CLGdDQUFnQyxpR0FDaEMsZ0NBQWdDLG9nQkFDaEMsc0NBQXNDLHdTQUN0QywrQkFBK0IsbUVBQy9CLHFDQUFxQyx5RUFDckMsaUNBQWlDLHFFQUNqQyxrQ0FBa0MscUlBaEJsQyx1Q0FBdUMsVUFBdkMsdUNBQXVDLFVBQXZDLHVDQUF1QztnQkFJdkMsb0NBQW9DLFVBSnBDLHVDQUF1QztnQkFJdkMsb0NBQW9DOzs0RkFlM0IsOEJBQThCO2tCQWhDMUMsU0FBUzsrQkFFRSwwQkFBMEIsY0FHeEIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxTQUFTO3dCQUNULGdCQUFnQjt3QkFDaEIsaUJBQWlCO3dCQUNqQix1Q0FBdUM7d0JBQ3ZDLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQixzQ0FBc0M7d0JBQ3RDLG9DQUFvQzt3QkFDcEMsaUNBQWlDO3dCQUNqQyx5Q0FBeUM7d0JBQ3pDLG1DQUFtQzt3QkFDbkMsdUNBQXVDO3dCQUN2QywrQkFBK0I7d0JBQy9CLGdDQUFnQzt3QkFDaEMsZ0NBQWdDO3dCQUNoQyxzQ0FBc0M7d0JBQ3RDLCtCQUErQjt3QkFDL0IscUNBQXFDO3dCQUNyQyxpQ0FBaUM7d0JBQ2pDLGtDQUFrQztxQkFDbkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nQ29tcG9uZW50T3V0bGV0LCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgY29tcHV0ZWQsIERlc3Ryb3lSZWYsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQsIHZpZXdDaGlsZCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudCwgVmlydHVhbFNjcm9sbGVyTW9kdWxlIH0gZnJvbSAnQGloYXJiZWNrL25neC12aXJ0dWFsLXNjcm9sbGVyJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJU29ydCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTb3J0QXJyb3dDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtc29ydCc7XG5pbXBvcnQgeyBJQ2hlY2tib3hJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1ncm91cCc7XG5pbXBvcnQgeyBJQ2hlY2tib3hFdmVudCwgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUnO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcGFnaW5hdGlvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lcic7XG5pbXBvcnQgeyBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIH0gZnJvbSAnQGxpYnMtdWkvaWNvbnMnO1xuaW1wb3J0IHsgSUh0dHBSZXNwb25zZUVycm9yLCBJUGFnaW5nLCBUWVBFX09CSkVDVCwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNoZWNrLXNlbGVjdGVkLWJ5LWtleSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jb252ZXJ0LW9iamVjdC10by1zaWduYWwnO1xuaW1wb3J0IHsgSUh0dHBSZXF1ZXN0Q29uZmlnLCBMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UsIHJldHVybkxpc3RPYmplY3QgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3QnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjb252ZXJ0T2JqZWN0VG9TaWduYWwsIGRlbGV0ZVVuaWNvZGUsIGdldCwgc2V0LCB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgbGFzdFZhbHVlRnJvbSwgb2YsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBJQnV0dG9uQmFyRXZlbnQsXG4gIElDb25maWdTZWxlY3RNb3JlSXRlbSxcbiAgSUNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kLFxuICBJSG92ZXJCdXR0b25BY3Rpb25FdmVudCxcbiAgSUxvYWRNb3JlRXZlbnQsXG4gIElTb3J0RXZlbnQsXG4gIElUYWJlbEJ1dHRvbkFjdGlvbkV2ZW50LFxuICBJVGFibGVGb290ZXJDb25maWcsXG4gIElUYWJsZUhlYWRlckNvbmZpZyxcbiAgVFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSxcbiAgVFlQRV9EQVRBX1RBQkxFLFxuICBUWVBFX0lURU1fREFUQV9UQUJMRSxcbiAgVFlQRV9ORVdfREFUQV9UQUJMRSxcbiAgVFlQRV9UQUJMRV9GSUxURVIsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJVGFibGVGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLWV2ZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJVGFibGVOb0RhdGFDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvbm8tZGF0YS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGUgfSBmcm9tICcuL3BpcGVzL2NhbGN1bGF0b3ItY29sdW1uLnBpcGUnO1xuaW1wb3J0IHsgTGlic1VpVGFibGVDaGVja0l0ZW1IaWdodExpZ2h0UGlwZSB9IGZyb20gJy4vcGlwZXMvY2hlY2staXRlbS1oaWdodC1saWdodC5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNUYWJsZVRlbXBsYXRlc0NvbXBvbmVudCB9IGZyb20gJy4vdGVtcGxhdGVzL3RlbXBsYXRlcy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIE5nQ2xhc3MsXG4gICAgTmdTdHlsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBOZ0NvbXBvbmVudE91dGxldCxcbiAgICBMaWJzVWlDb21wb25lbnRzVGFibGVUZW1wbGF0ZXNDb21wb25lbnQsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIFZpcnR1YWxTY3JvbGxlck1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zU29ydEFycm93Q29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQYWdpbmF0aW9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNDaGVja2JveFNpbmdsZUNvbXBvbmVudCxcbiAgICBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlLFxuICAgIExpYnNVaUljb25zR2V0SWNvbkNvbXBvbmVudFBpcGUsXG4gICAgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSxcbiAgICBMaWJzVWlQaXBlc0NoZWNrU2VsZWN0ZWRCeUtleVBpcGUsXG4gICAgTGlic1VpVGFibGVDaGVja0l0ZW1IaWdodExpZ2h0UGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogUFJPUEVSVFkgKi9cbiAgcHJvdGVjdGVkIGNsYXNzSGVhZGVyQ29udGFpbmVyID0gY29tcHV0ZWQoKCkgPT4gYGxpYnMtdWktdGFibGUtaGVhZGVyLWNvbnRhaW5lciB3LWZ1bGwgYWJzb2x1dGUgZmxleCBzaHJpbmstMCAke3RoaXMuaWdub3JlQ2xhc3NCZ0hlYWRlcigpID8gJycgOiAnYmctd2hpdGUnfSBvdmVyZmxvdy14LWhpZGRlbiB6LVsxXSBpdGVtcy1jZW50ZXIgJHt0aGlzLmNsYXNzSGVhZGVyQ29udGFpbmVySW5jbHVkZSgpIHx8ICcnfWApO1xuICBwcm90ZWN0ZWQgY2xhc3NIZWFkZXJMZWZ0Q29udGFpbmVyID0gY29tcHV0ZWQoKCkgPT4gYGgtZnVsbCBmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV0gJHt0aGlzLmlnbm9yZUNsYXNzQmdIZWFkZXIoKSA/ICcnIDogJ2JnLXdoaXRlJ30gJHt0aGlzLmNsYXNzSGVhZGVyTGVmdEluY2x1ZGUoKSB8fCAnJ31gKTtcblxuICBwcm90ZWN0ZWQga2V5c1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PGFueT4+KFtdKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgc3RvcmVzID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1zID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1Gb290ZXIgPSBzaWduYWw8VFlQRV9PQkpFQ1QgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBpdGVtT2ZJbmRleEhvdmVyPzogVFlQRV9JVEVNX0RBVEFfVEFCTEU7XG4gIHByb3RlY3RlZCBrZXlTZWFyY2ggPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCB0b3RhbEl0ZW1JbkJhY2tlbmQgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbURpc3BsYXkgPSBjb21wdXRlZCgoKSA9PiB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UodGhpcy50b3RhbEl0ZW0oKSA/PyB0aGlzLnRvdGFsSXRlbUluQmFja2VuZCgpLCBmYWxzZSkpO1xuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ01vcmVJdGVtID0gY29tcHV0ZWQ8SUxpc3RDb25maWdJdGVtPigoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIGNvbmZpZ1RlbXBsYXRlVGV4dDogc2lnbmFsKHtcbiAgICAgICAgZmllbGRLZXk6ICdrZXknLFxuICAgICAgICBpZ25vcmVJY29uU2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgIGdldFZhbHVlOiB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LmdldFZhbHVlLFxuICAgICAgICBjb25maWdMYWJlbFBvcG92ZXI6IHNpZ25hbCh7XG4gICAgICAgICAgekluZGV4OiAxMjAwLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgaHR0cFJlcXVlc3REYXRhOiBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnPih7XG4gICAgICAgIG9iamVjdEluc3RhbmNlOiByZXR1cm5MaXN0T2JqZWN0KHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8ubGlzdE9wdGlvbiksXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ2xpc3QnLFxuICAgICAgICBhcmd1bWVudHNWYWx1ZTogW10sXG4gICAgICB9KSxcbiAgICB9O1xuICB9KTtcbiAgcHJvdGVjdGVkIGl0ZW1zSGlnaHRMaWdodCA9IHNpZ25hbDxBcnJheTxUWVBFX0lURU1fREFUQV9UQUJMRT4+KFtdKTtcbiAgcHJvdGVjdGVkIGhhc0l0ZW1IaWdodExpZ2h0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pdGVtc0hpZ2h0TGlnaHQoKS5sZW5ndGggPiAwKTtcblxuICBwcml2YXRlIGhhc1Njcm9sbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaW5zdGFuY2VTb3J0ID0gc2lnbmFsPElTb3J0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBwYWdpbmdTdG9yZSA9IHNpZ25hbDxJUGFnaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGxvYWRlZExhc3RJdGVtID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzdG9yZVBhcmFtc0NhbGxBcGkgPSBzaWduYWw8VFlQRV9PQkpFQ1Q+KHt9KTtcbiAgcHJpdmF0ZSB0aW1lb3V0TGVhdmVJdGVtID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbT86IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50O1xuICBwcml2YXRlIG1vdXNlRW50ZXJIZWFkZXIgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKiBJTlBVVCAqL1xuICByZWFkb25seSBvcHRpbWl6ZVRhYmxlUmVuZGVyQnlPblZpZXdwb3J0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdGltZUhpZ2hsaWdoTmV3SXRlbSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigyMDAwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDIwMDAgfSk7XG4gIHJlYWRvbmx5IGhlYWRlckxlZnQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgaGVhZGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyID0gaW5wdXQ8e1xuICAgIGhlYWRlckxlZnQ/OiBib29sZWFuO1xuICAgIGhlYWRlclJpZ2h0PzogYm9vbGVhbjtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQgPSBpbnB1dDxJQ29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQ+KCk7XG4gIHJlYWRvbmx5IHNob3dGb290ZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJGb290ZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjdXN0b21Qb3NpdGlvbkZvb3RlciA9IGlucHV0PCd0b3AnIHwgJ2JvdHRvbScsICd0b3AnIHwgJ2JvdHRvbScgfCB1bmRlZmluZWQ+KCdib3R0b20nLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICdib3R0b20nIH0pO1xuICByZWFkb25seSBmb290ZXJMZWZ0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlRm9vdGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZm9vdGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVGb290ZXJDb25maWc+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBkaXNhYmxlQ2hlY2tib3ggPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgYnVmZmVyQW1vdW50ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDUsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiAodmFsID8gKHZhbCA+IDI1ID8gMjUgOiB2YWwpIDogNSkgfSk7XG4gIHJlYWRvbmx5IHRvdGFsSXRlbSA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgaXNEYXNoQm9yZGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NIZWFkZXJDb250YWluZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0hlYWRlckxlZnRJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0JvZHlJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc0Zvb3RlckluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzVGFibGVDb250YWluZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc0JhckluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCdqdXN0aWZ5LWJldHdlZW4gbWItWzE2cHhdJyk7XG5cbiAgcmVhZG9ubHkgZmllbGRLZXkgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2lkJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCB8fCAnaWQnIH0pOyAvLyB0w6puIGZpZWxkIMSR4buLbmggZGFuaCBpdGVtIGPhu6dhIGxpc3REYXRhc1xuICByZWFkb25seSBkZWZhdWx0S2V5c1NlbGVjdGVkID0gaW5wdXQ8QXJyYXk8YW55Pj4oKTtcbiAgcmVhZG9ubHkgbGFiZWxCYXJOb1NlbGVjdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KGBpMThuX3RvdGFsX3F1YW50aXR5YCk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBsYWJlbEJhckJ1dHRvbnMgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2kxOG5fbnVtYmVyX2l0ZW1fc2VsZWN0ZWQnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsIHx8ICdpMThuX251bWJlcl9pdGVtX3NlbGVjdGVkJyB9KTsgLy8gc+G7rSBk4bulbmcgxJHhu4MgaGnDqm4gdGjhu4sga2hpIHTDrWNoIGNo4buNbiBpdGVtXG4gIHJlYWRvbmx5IGNsYXNzTGFiZWxCYXJCdXR0b25zID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgYmFyQnV0dG9ucyA9IGlucHV0PEFycmF5PElCdXR0b24+PigpO1xuICByZWFkb25seSBzb3J0TG9jYWwgPSBpbnB1dDxib29sZWFuPigpOyAvLyB0csaw4budbmcgaOG7o3AgbuG6v3Ugc29ydExvY2FsIG7DoHkga2jDtG5nIMSRw6FwIOG7qW5nIMSRxrDhu6NjIG5naGnhu4dwIHbhu6UgdGjDrCBt4bubaSBjw6JuIG5o4bqvYyBz4butIGThu6VuZyBmaWx0ZXJMb2NhbFxuICByZWFkb25seSBmaWx0ZXJPclNvcnRMb2NhbCA9IGlucHV0PFRZUEVfVEFCTEVfRklMVEVSPigpO1xuICByZWFkb25seSBodHRwUmVxdWVzdERhdGEgPSBpbnB1dDxJSHR0cFJlcXVlc3RDb25maWc+KCk7XG4gIHJlYWRvbmx5IGh0dHBSZXF1ZXN0RGF0YUZvb3RlciA9IGlucHV0PElIdHRwUmVxdWVzdENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgbmV3RGF0YSA9IGlucHV0PFRZUEVfTkVXX0RBVEFfVEFCTEU+KCk7XG4gIHJlYWRvbmx5IGZpbHRlciA9IGlucHV0PFRZUEVfREFUQV9GSUxURVJfVEFCTEUsIFRZUEVfREFUQV9GSUxURVJfVEFCTEUgfCB1bmRlZmluZWQ+KHsgZmlsdGVyRGF0YToge30gfSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyB7IGZpbHRlckRhdGE6IHt9IH0gfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUJhciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUNsYXNzQmdIZWFkZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBub0RhdGFDb25maWcgPSBpbnB1dDxJVGFibGVOb0RhdGFDb25maWcsIElUYWJsZU5vRGF0YUNvbmZpZyB8IHVuZGVmaW5lZD4oXG4gICAgeyB0ZXh0Tm9EYXRhOiAnaTE4bl9ub19kYXRhX3lldCcsIHRleHRTZWFyY2hOb0RhdGE6ICdpMThuX25vX3Jlc3VsdCcgfSxcbiAgICB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsIHx8IHsgdGV4dE5vRGF0YTogJ2kxOG5fbm9fZGF0YV95ZXQnLCB0ZXh0U2VhcmNoTm9EYXRhOiAnaTE4bl9ub19yZXN1bHQnIH0gfVxuICApO1xuICByZWFkb25seSBzaG93U2Nyb2xsVGFibGVQaW5uZWRJZk5vRGF0YSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckl0ZW1MYXN0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbWF4SXRlbVNlbGVjdGVkID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMCwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAxMDAgfSk7XG4gIHJlYWRvbmx5IGNvbmZpZ1NlbGVjdE1vcmVJdGVtID0gaW5wdXQ8SUNvbmZpZ1NlbGVjdE1vcmVJdGVtPigpO1xuICByZWFkb25seSBvbmx5U2hvd05vUmVzdWx0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQm9yZGVySXRlbSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGFjdGl2aXR5TG9hZERhdGEgPSBpbnB1dDwnc2Nyb2xsLWluZmluaXR5JyB8ICdjbGljay1wYWdpbmF0aW9uJywgJ3Njcm9sbC1pbmZpbml0eScgfCAnY2xpY2stcGFnaW5hdGlvbicgfCB1bmRlZmluZWQ+KCdzY3JvbGwtaW5maW5pdHknLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICdzY3JvbGwtaW5maW5pdHknIH0pO1xuICByZWFkb25seSBwYWdpbmF0aW9uU2V0dGluZyA9IGlucHV0PHtcbiAgICBwb3NpdGlvbj86ICd0b3AnIHwgJ2JvdHRvbSc7XG4gICAgY2xhc3NJbmNsdWRlQ29udGFpbmVyPzogc3RyaW5nO1xuICAgIGNsYXNzSW5jbHVkZUl0ZW0/OiBzdHJpbmc7XG4gICAgZGlzYWJsZT86IGJvb2xlYW47XG4gICAgbnVtYmVyUGFnZURpc3BsYXk/OiBudW1iZXI7XG4gICAgc2hvd1RvdGFsUGFnZT86IGJvb2xlYW47XG4gICAgc2hvd0lucHV0R290b1BhZ2U/OiBib29sZWFuO1xuICAgIG1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2U/OiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JztcbiAgICBjbGFzc0Rpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZT86IHN0cmluZztcbiAgfT4oKTtcblxuICByZWFkb25seSB0ZW1wbGF0ZU5vRGF0YSA9IGlucHV0PFRZUEVfVEVNUExBVEVfUkVGPigpO1xuICByZWFkb25seSB0ZW1wbGF0ZU5vUmVzdWx0ID0gaW5wdXQ8VFlQRV9URU1QTEFURV9SRUY+KCk7XG5cbiAgLyoqIE9VVFBVVCAqL1xuXG4gIHJlYWRvbmx5IG91dExvYWRNb3JlID0gb3V0cHV0PElMb2FkTW9yZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxJc0dvbmUgPSBvdXRwdXQ8SUxvYWRNb3JlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExvYWRpbmcgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCdXR0b25BY3Rpb24gPSBvdXRwdXQ8SVRhYmVsQnV0dG9uQWN0aW9uRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFNvcnQgPSBvdXRwdXQ8SVNvcnRFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCYXJCdXR0b24gPSBvdXRwdXQ8SUJ1dHRvbkJhckV2ZW50PigpO1xuICByZWFkb25seSBvdXRIb3ZlckJ1dHRvbkFjdGlvbiA9IG91dHB1dDxJSG92ZXJCdXR0b25BY3Rpb25FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0S2V5c1NlbGVjdGVkID0gb3V0cHV0PHsga2V5czogQXJyYXk8YW55PiB9PigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRMb2FkRGF0YUNvbXBsZXRlID0gb3V0cHV0PFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+Pj4oKTtcbiAgcmVhZG9ubHkgb3V0VG90YWxJdGVtID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZERhdGFFcnJvciA9IG91dHB1dDxJSHR0cFJlc3BvbnNlRXJyb3I+KCk7XG5cbiAgLyoqVklFVyBDSElMRCAqL1xuICBwcm90ZWN0ZWQgaGVhZGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignaGVhZGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZm9vdGVyRWxlbWVudFJlZicpO1xuICBwcm90ZWN0ZWQgZm9vdGVyTGVmdEVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2Zvb3RlckxlZnRFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2JvZHlFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgYm9keUNvbXBvbmVudFJlZiA9IHZpZXdDaGlsZDxWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ+KCdib2R5Q29tcG9uZW50UmVmJyk7XG5cbiAgLyoqSU5KRUNUICovXG4gIHByaXZhdGUgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0S2V5c1NlbGVjdGVkKCk/Lmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5rZXlzU2VsZWN0ZWQudXBkYXRlKChrZXlzKSA9PiBbLi4ua2V5cywgLi4uKHRoaXMuZGVmYXVsdEtleXNTZWxlY3RlZCgpIHx8IFtdKV0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2hvd0Zvb3RlcigpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmV3RGF0YSgpPy5kYXRhKCkubGVuZ3RoKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmFkZEl0ZW1zKHRoaXMubmV3RGF0YSgpPy5kYXRhIGFzIGFueSwgIXRoaXMubmV3RGF0YSgpPy5hZGRUb0xhc3RMaXN0KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEgfHwgdGhpcy5maWx0ZXIoKS5pZ25vcmVDYWxsQXBpQXV0bykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtleVNlYXJjaC5zZXQoZ2V0KHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSwgJ2tleVNlYXJjaCcsICcnKSk7XG4gICAgICAgIHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpLnNldChjbG9uZURlZXAodGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhKSk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcigpPy5maWx0ZXJEYXRhICYmICF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGFbJ2luc3RhbmNlU29ydCddICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSAmJiB0aGlzLnN0b3JlcygpLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKT8uKHNpZ25hbChbLi4udGhpcy5zdG9yZXMoKV0pLCB7IC4uLih0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEgfHwge30pLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkgfHwgW10pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG5cbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzZXQ6IHRoaXMucmVzZXQuYmluZCh0aGlzKSxcbiAgICAgIGNhbGxBcGlCeVNlcnZpY2U6IHRoaXMuY2FsbEFwaUJ5U2VydmljZS5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRTY3JvbGw6IHRoaXMucmVzZXRTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgIGFkZEl0ZW1zOiB0aGlzLmFkZEl0ZW1zLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVJdGVtczogdGhpcy5yZW1vdmVJdGVtcy5iaW5kKHRoaXMpLFxuICAgICAgZ2V0U2Nyb2xsQ29udGFpbmVyOiB0aGlzLmdldFNjcm9sbENvbnRhaW5lci5iaW5kKHRoaXMpLFxuICAgICAgaGlkZVRvb2xCYXJCb3R0b206ICgpID0+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSxcbiAgICAgIHJlc2V0S2V5U2VsZWN0ZWQ6ICgpID0+IHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSksXG4gICAgICBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCksXG4gICAgICBzZXRDb3VudFBhZ2luZ1N0b3JlOiAoY291bnQ6IG51bWJlcikgPT4gdGhpcy5odHRwUmVxdWVzdERhdGEoKSAmJiB0aGlzLnBhZ2luZ1N0b3JlKCkgJiYgdGhpcy5wYWdpbmdTdG9yZS51cGRhdGUoKHBhZ2luZykgPT4gKHsgLi4ucGFnaW5nLCB0b3RhbF9pdGVtczogY291bnQgfSkpLFxuICAgICAgZ2V0Q291bnQ6IHRoaXMuZ2V0Q291bnQuYmluZCh0aGlzKSxcbiAgICAgIGdldFN0b3JlOiAoKSA9PiB0aGlzLnN0b3JlcygpIHx8IFtdLFxuICAgICAgaGlnaHRMaWdodEl0ZW06IHRoaXMuaGlnaHRMaWdodEl0ZW0uYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEluZGV4Um93ID0gKGRhdGE6IHsgdmFsdWU6IFRZUEVfSVRFTV9EQVRBX1RBQkxFIH0pID0+IHtcbiAgICByZXR1cm4gb2YodGhpcy5pdGVtcygpLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbSA9PT0gZGF0YS52YWx1ZSkgKyAxKTtcbiAgfTtcblxuICBwcml2YXRlIGdldFNjcm9sbENvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5ib2R5Q29tcG9uZW50UmVmKCkgYXMgVmlydHVhbFNjcm9sbGVyQ29tcG9uZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxsQXBpQnlTZXJ2aWNlKGZpcnN0Q2FsbDogYm9vbGVhbiwgcmVzZXRBZnRlckNhbGxBcGk/OiBib29sZWFuKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChmaXJzdENhbGwpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIHx8IHRoaXMubG9hZGluZygpIHx8IHRoaXMubG9hZGVkTGFzdEl0ZW0oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgICAgdGhpcy5yZXNldEluZGV4SG92ZXIoKTtcbiAgICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSB0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIGFzIElIdHRwUmVxdWVzdENvbmZpZztcblxuICAgICAgaWYgKGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlICYmICFndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJCeSAmJiB0aGlzLmluc3RhbmNlU29ydCgpKSB7XG4gICAgICAgIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlckJ5ID0ge1xuICAgICAgICAgIGZpZWxkR2V0VmFsdWU6ICdzdG9yZVBhcmFtc0NhbGxBcGkuaW5zdGFuY2VTb3J0LmZpZWxkU29ydCcsXG4gICAgICAgICAgZmllbGRVcGRhdGU6ICdbMF0nLFxuICAgICAgICAgIHN1YkZpZWxkVXBkYXRlOiAnb3JkZXJfYnknLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlclR5cGUgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKSkge1xuICAgICAgICBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJUeXBlID0ge1xuICAgICAgICAgIGZpZWxkR2V0VmFsdWU6ICdzdG9yZVBhcmFtc0NhbGxBcGkuaW5zdGFuY2VTb3J0Lm1vZGUnLFxuICAgICAgICAgIGZpZWxkVXBkYXRlOiAnWzBdJyxcbiAgICAgICAgICBzdWJGaWVsZFVwZGF0ZTogJ29yZGVyX3R5cGUnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICBpZiAoIXJlc2V0QWZ0ZXJDYWxsQXBpKSB7XG4gICAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChcbiAgICAgICAgICB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4udGhpcy5mYWtlUmVzcG9uc2VBcGkoKSwgc3RvcmVQYXJhbXNDYWxsQXBpOiB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpIH0sIHRoaXMucGFnaW5nU3RvcmUoKSB8fCB7fSwgdGhpcy5rZXlTZWFyY2goKSwgdHJ1ZSwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmNhbGxBcGkodGhpcy5odHRwUmVxdWVzdERhdGEoKSBhcyBJSHR0cFJlcXVlc3RDb25maWcpO1xuXG4gICAgICBpZiAoZmlyc3RDYWxsICYmIHJlc2V0QWZ0ZXJDYWxsQXBpKSB7XG4gICAgICAgIHRoaXMuaGFzU2Nyb2xsLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFnaW5nU3RvcmUuc2V0KHJlc3VsdC5wYWdpbmcpO1xuICAgICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQuc2V0KHJlc3VsdC5wYWdpbmc/LnRvdGFsX2l0ZW1zIHx8IDApO1xuICAgICAgdGhpcy5vdXRUb3RhbEl0ZW0uZW1pdCh0aGlzLnRvdGFsSXRlbUluQmFja2VuZCgpKTtcbiAgICAgIGlmICghdGhpcy5wYWdpbmdTdG9yZSgpKSB7XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KHRydWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQoXG4gICAgICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi5yZXN1bHQsIHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCkgfHwge30sIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIHRoaXMubG9hZGVkTGFzdEl0ZW0oKSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5hZGRJdGVtcyhjb252ZXJ0T2JqZWN0VG9TaWduYWwocmVzdWx0LmRhdGEgfHwgW10pLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB0aGlzLm91dExvYWREYXRhQ29tcGxldGUuZW1pdCh0aGlzLnN0b3Jlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIHRoaXMub3V0TG9hZERhdGFFcnJvci5lbWl0KGVycm9yIGFzIElIdHRwUmVzcG9uc2VFcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmYWtlUmVzcG9uc2VBcGkoKTogVFlQRV9PQkpFQ1Qge1xuICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICBpZiAodGhpcy5hY3Rpdml0eUxvYWREYXRhKCkgPT09ICdzY3JvbGwtaW5maW5pdHknKSB7XG4gICAgICB0aGlzLnBhZ2luZ1N0b3JlLnNldCh7fSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmZha2VSZXNwb25zZVBhZ2luZ0FwaSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkge1xuICAgIGlmICghdGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSB8fCAhdGhpcy5zaG93Rm9vdGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCkgfHwge30sIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIGZhbHNlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICB0aGlzLml0ZW1Gb290ZXIuc2V0KGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRJdGVtcyhpdGVtczogVFlQRV9EQVRBX1RBQkxFLCBhZGRGaXJzdDogYm9vbGVhbiwgaWdub3JlSGlnaHRMaWdodD86IGJvb2xlYW4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4sIGF1dG9Db3VudE5ld0l0ZW0/OiBib29sZWFuKSB7XG4gICAgaWYgKCFpdGVtcygpIHx8ICFpdGVtcygpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc0FkZDogQXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+PiA9IFtdO1xuXG4gICAgaXRlbXMoKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY2hlY2tFeGlzdEl0ZW0oaXRlbSkpIHtcbiAgICAgICAgaXRlbXNBZGQucHVzaChpdGVtKTtcbiAgICAgICAgaWYgKGFkZEZpcnN0KSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoKGRhdGEpID0+IFtpdGVtLCAuLi5kYXRhXSk7XG4gICAgICAgICAgdGhpcy5zdG9yZXMudXBkYXRlKChkYXRhKSA9PiBbaXRlbSwgLi4uZGF0YV0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKChkYXRhKSA9PiBbLi4uZGF0YSwgaXRlbV0pO1xuICAgICAgICB0aGlzLnN0b3Jlcy51cGRhdGUoKGRhdGEpID0+IFsuLi5kYXRhLCBpdGVtXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGF1dG9Db3VudE5ld0l0ZW0gJiYgaXRlbXNBZGQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRvdGFsSXRlbUluQmFja2VuZC51cGRhdGUoKHZhbHVlKSA9PiB2YWx1ZSArIGl0ZW1zQWRkLmxlbmd0aCk7XG4gICAgfVxuICAgIGlmICghaWdub3JlSGlnaHRMaWdodCkge1xuICAgICAgdGhpcy5pdGVtc0hpZ2h0TGlnaHQudXBkYXRlKChpdGVtc0hpZ2h0TGlnaHQpID0+IFsuLi5pdGVtc0hpZ2h0TGlnaHQsIC4uLml0ZW1zQWRkXSk7XG4gICAgICB0aW1lcih0aGlzLnRpbWVIaWdobGlnaE5ld0l0ZW0oKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGl0ZW1zQWRkLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNIaWdodExpZ2h0LnVwZGF0ZSgoaXRlbXNIaWdodExpZ2h0KSA9PiBpdGVtc0hpZ2h0TGlnaHQuZmlsdGVyKChpdGVtSGlnaHRMaWdodCkgPT4gaXRlbUhpZ2h0TGlnaHQgIT09IGl0ZW0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2hlY2tTY3JvbGwoKTtcbiAgICBpZiAoIWlnbm9yZVJlQ2FsbEZvb3Rlcikge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0V4aXN0SXRlbShpdGVtTmV3OiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcygpLmZpbmQoKGl0ZW0pID0+IGAke2dldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWAgPT09IGAke2dldDx1bmtub3duPihpdGVtTmV3LCB0aGlzLmZpZWxkS2V5KCkpfWApID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVJdGVtcyhrZXlzOiBBcnJheTx1bmtub3duPiwgaWdub3JlUmVDYWxsRm9vdGVyPzogYm9vbGVhbixhdXRvQ291bnROZXdJdGVtPzogYm9vbGVhbikge1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKCk7XG4gICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICB0aGlzLml0ZW1zLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YCA9PT0gYCR7a2V5fWApIHtcbiAgICAgICAgICAgIGlzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1VwZGF0ZSA/IG5ld0l0ZW1zIDogaXRlbXM7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zdG9yZXMudXBkYXRlKChpdGVtcykgPT4ge1xuICAgICAgICBsZXQgaXNVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChgJHtnZXQ8dW5rbm93bj4oaXRlbSwgdGhpcy5maWVsZEtleSgpKX1gID09PSBgJHtrZXl9YCkge1xuICAgICAgICAgICAgaXNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGF1dG9Db3VudE5ld0l0ZW0pIHtcbiAgICAgICAgICAgICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1VwZGF0ZSA/IG5ld0l0ZW1zIDogaXRlbXM7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCF0aGlzLmtleXNTZWxlY3RlZCgpIHx8ICF0aGlzLmtleXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC51cGRhdGUoKGtleXMpID0+IGtleXMuZmlsdGVyKChrZXlTZWxlY3RlZCkgPT4ga2V5U2VsZWN0ZWQgIT09IGtleSkpO1xuICAgIH0pO1xuICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnVwZGF0ZSgodmFsdWUpID0+IHZhbHVlIC0ga2V5cy5sZW5ndGgpO1xuICAgIGF3YWl0IHRoaXMuY2hlY2tTY3JvbGwoKTtcbiAgICBpZiAoIWlnbm9yZVJlQ2FsbEZvb3Rlcikge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCk7XG4gICAgfVxuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3VudCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYWdpbmdTdG9yZSgpPy50b3RhbF9pdGVtcyB8fCB0aGlzLml0ZW1zKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLml0ZW1zKCkubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTW9yZVN1Y2Nlc3MoZGF0YTogV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4pIHtcbiAgICB0aGlzLmFkZEl0ZW1zKGRhdGEsIGZhbHNlKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUFsbENoZWNrZWQoKSB7XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlQ2hlY2tlZEFsbEl0ZW1zKGV2ZW50OiBJQ2hlY2tib3hFdmVudCkge1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoXG4gICAgICAgIHRoaXMuaXRlbXMoKVxuICAgICAgICAgIC5maWx0ZXIoYXN5bmMgKGl0ZW0pID0+ICEoYXdhaXQgdGhpcy5jaGVja0NhbmNlbENvbmRpdGlvbkNoZWNrZWRJdGVtKGl0ZW0pKSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiBgJHtnZXQ8dW5rbm93bj4oaXRlbSwgdGhpcy5maWVsZEtleSgpKX1gKVxuICAgICAgKTtcbiAgICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrQ2FuY2VsQ29uZGl0aW9uQ2hlY2tlZEl0ZW0oaXRlbTogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KSB7XG4gICAgbGV0IGlzQ2FuY2VsQ2hlY2sgPSBmYWxzZTtcblxuICAgIGlmICghaXNDYW5jZWxDaGVjayAmJiB0aGlzLmhlYWRlckxlZnQoKS5sZW5ndGggJiYgdGhpcy5oZWFkZXJMZWZ0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbikge1xuICAgICAgaXNDYW5jZWxDaGVjayA9IChhd2FpdCBsYXN0VmFsdWVGcm9tKCh0aGlzLmhlYWRlckxlZnQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIGFzIGFueSkoeyBpdGVtOiBpdGVtKCkgfSkpKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ2FuY2VsQ2hlY2sgJiYgdGhpcy5oZWFkZXJSaWdodCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlclJpZ2h0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbikge1xuICAgICAgaXNDYW5jZWxDaGVjayA9IChhd2FpdCBsYXN0VmFsdWVGcm9tKCh0aGlzLmhlYWRlclJpZ2h0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiBhcyBhbnkpKHsgaXRlbTogaXRlbSgpIH0pKSkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzQ2FuY2VsQ2hlY2s7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUl0ZW1DaGVja2VkKGV2ZW50OiBJQ2hlY2tib3hJdGVtLCBpdGVtOiBUWVBFX09CSkVDVCkge1xuICAgIGNvbnN0IGtleSA9IGdldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpO1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KHRoaXMua2V5c1NlbGVjdGVkKCkpO1xuXG4gICAga2V5cy5hZGQoa2V5KTtcbiAgICBpZiAoIWV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIGtleXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChBcnJheS5mcm9tKGtleXMpKTtcbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ2hhbmdlU29ydChzb3J0OiBJU29ydCkge1xuICAgIGNvbnN0IHNjcm9sbExlZnQgPSB0aGlzLmhlYWRlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0IHx8IDA7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2VTb3J0ICYmIHRoaXMuaW5zdGFuY2VTb3J0KCk/LmZpZWxkU29ydCAhPT0gc29ydC5maWVsZFNvcnQpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VTb3J0KCk/LnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMuaW5zdGFuY2VTb3J0LnNldChzb3J0KTtcbiAgICBpZiAodGhpcy5zb3J0TG9jYWwoKSkge1xuICAgICAgdGhpcy5oYW5kbGVyU29ydExvY2FsKHNvcnQsIHNjcm9sbExlZnQpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgaW5zdGFuY2VTb3J0OiB0aGlzLmluc3RhbmNlU29ydCgpIH0pKTtcbiAgICB0aGlzLm91dFNvcnQuZW1pdCh7XG4gICAgICBzb3J0OiBzb3J0LFxuICAgICAgb25Tb3J0U3VjY2VzczogKCkgPT4gdGhpcy5vblNvcnRTdWNjZXNzKHNjcm9sbExlZnQpLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICB0aGlzLm9uU29ydFN1Y2Nlc3Moc2Nyb2xsTGVmdCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZXJTb3J0TG9jYWwoc29ydDogSVNvcnQsIHNjcm9sbExlZnQ6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmZpbHRlck9yU29ydExvY2FsKCkgJiYgdGhpcy5zdG9yZXMoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaXRlbXMuc2V0KHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKT8uKHNpZ25hbChbLi4udGhpcy5zdG9yZXMoKV0pLCB7IC4uLnRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCksIGluc3RhbmNlU29ydDogc29ydCB9KSB8fCBbXSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBmaWVsZFNvcnQsIG1vZGUgfSA9IHNvcnQ7XG5cbiAgICB0aGlzLml0ZW1zLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgIGl0ZW1zLnNvcnQoKGl0ZW1BLCBpdGVtQikgPT4ge1xuICAgICAgICBsZXQgdmFsdWUxID0gbW9kZSA9PT0gJ2FzYycgPyBpdGVtQSgpW2ZpZWxkU29ydF0gOiBpdGVtQigpW2ZpZWxkU29ydF07XG4gICAgICAgIGxldCB2YWx1ZTIgPSBtb2RlID09PSAnYXNjJyA/IGl0ZW1CKClbZmllbGRTb3J0XSA6IGl0ZW1BKClbZmllbGRTb3J0XTtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlMSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlMiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZTEgPSBkZWxldGVVbmljb2RlKHZhbHVlMSkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICB2YWx1ZTIgPSBkZWxldGVVbmljb2RlKHZhbHVlMikudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZTEgPT09IHZhbHVlMikge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlMSA+IHZhbHVlMiA/IDEgOiAtMTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICB9KTtcbiAgICB0aGlzLm9uU29ydFN1Y2Nlc3Moc2Nyb2xsTGVmdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZ1bmN0aW9uQ29udHJvbE1vcmVTZWxlY3RJdGVtKGZ1bmN0aW9uQ29udHJvbDogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbFNlbGVjdE1vcmVJdGVtID0gZnVuY3Rpb25Db250cm9sO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZE1vcmVJdGVtKGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LmtleSB8fCAhdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbT8ucmVzZXQoKTtcblxuICAgIGNvbnN0IHBlclBhZ2UgPSBOdW1iZXIoZXZlbnQua2V5KS52YWx1ZU9mKCk7XG4gICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBOdW1iZXIodGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0ocGVyUGFnZSkpLnZhbHVlT2YoKTtcbiAgICBjb25zdCBpc1BhZ2luZ051bWJlciA9IHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8ucGFnaW5nTnVtYmVyO1xuXG4gICAgaWYgKGN1cnJlbnRQZXJQYWdlID4gcGVyUGFnZSB8fCB0aGlzLml0ZW1zLmxlbmd0aCA+PSBwZXJQYWdlKSB7XG4gICAgICBpZiAoIWlzUGFnaW5nTnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQZXJQYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChcbiAgICAgICAgdGhpcy5pdGVtcygpXG4gICAgICAgICAgLnNsaWNlKDAsIHBlclBhZ2UpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YClcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSwgdHJ1ZSk7XG4gICAgY29uc3Qgc3ViID0gdGhpcy5vdXRMb2FkRGF0YUNvbXBsZXRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIGlmICghaXNQYWdpbmdOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBlclBhZ2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFxuICAgICAgICB0aGlzLml0ZW1zKClcbiAgICAgICAgICAuc2xpY2UoMCwgcGVyUGFnZSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiBgJHtnZXQ8dW5rbm93bj4oaXRlbSwgdGhpcy5maWVsZEtleSgpKX1gKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRoaXMub3V0TG9hZERhdGFFcnJvci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBlclBhZ2UpO1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKHBlclBhZ2U6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgYXJndW1lbnRzVmFsdWUgPSB0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpPy5hcmd1bWVudHNWYWx1ZTtcblxuICAgIGlmICghYXJndW1lbnRzVmFsdWUgfHwgIXRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgcmV0dXJuICctMSc7XG4gICAgfVxuICAgIGNvbnN0IGtleVBlclBhZ2UgPSB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LmtleVBlclBhZ2UgfHwgJ3Blcl9wYWdlJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhcmd1bWVudCA9IGFyZ3VtZW50c1ZhbHVlW2ldO1xuXG4gICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBIdHRwUGFyYW1zICYmIGFyZ3VtZW50LmhhcyhrZXlQZXJQYWdlKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50UGVyUGFnZSA9IGdldDx1bmtub3duPihhcmd1bWVudCwga2V5UGVyUGFnZSwgJzI1JyBhcyBhbnkpO1xuXG4gICAgICAgIGFyZ3VtZW50ID0gYXJndW1lbnQuc2V0KGtleVBlclBhZ2UsIHBlclBhZ2UpO1xuICAgICAgICBzZXQoYXJndW1lbnRzVmFsdWUsIGAke2l9YCBhcyBhbnksIGFyZ3VtZW50KTtcblxuICAgICAgICByZXR1cm4gY3VycmVudFBlclBhZ2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIE9iamVjdCAmJiBPYmplY3Qua2V5cyhhcmd1bWVudCkuaW5jbHVkZXMoa2V5UGVyUGFnZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBnZXQoYXJndW1lbnQsIGtleVBlclBhZ2UsICcyNScpO1xuXG4gICAgICAgIHNldChhcmd1bWVudCwga2V5UGVyUGFnZSwgcGVyUGFnZSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQZXJQYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnLTEnO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNvcnRTdWNjZXNzKHNjcm9sbExlZnQ6IG51bWJlcikge1xuICAgIHRoaXMucmVzZXRTY3JvbGwoc2Nyb2xsTGVmdCwgMCk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCdXR0b25DbGljayh0eXBlOiAnYnV0dG9uJyB8ICdidXR0b24tZHJvcGRvd24nLCBidXR0b25Ecm9wZG93bkRhdGE6IGFueSwgYnV0dG9uOiBJQnV0dG9uKSB7XG4gICAgLy8gYnV0dG9uT3JpZ2luIGNo4buJIHPhu60gZOG7pW5nIGtoaSBkw7luZyBidXR0b25BY3Rpb25zIGPDsyBidXR0b24tZHJvcGRvd25cbiAgICBpZiAodHlwZSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLm91dENsaWNrQnV0dG9uQWN0aW9uLmVtaXQoeyBpdGVtOiB0aGlzLml0ZW1PZkluZGV4SG92ZXIsIGJ1dHRvbjogYnV0dG9uIH0pO1xuICAgIH1cbiAgICB0aGlzLm91dENsaWNrQnV0dG9uQWN0aW9uLmVtaXQoeyBpdGVtOiB0aGlzLml0ZW1PZkluZGV4SG92ZXIsIGJ1dHRvbiwgYnV0dG9uRHJvcGRvd25EYXRhIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCYXJCdXR0b25DbGljayhidXR0b246IElCdXR0b24pIHtcbiAgICBjb25zdCBpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4gPSBbXTtcblxuICAgIHRoaXMua2V5c1NlbGVjdGVkKCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtcygpLmZpbmQoKGl0ZW0pID0+IGAke2dldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWAgPT09IGAke2tleX1gKTtcblxuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLm91dENsaWNrQmFyQnV0dG9uLmVtaXQoe1xuICAgICAgYnV0dG9uLFxuICAgICAgaXRlbXMsXG4gICAgICBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpLFxuICAgICAgaGlkZGVuQmFyQnV0dG9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm47XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCdXR0b25Ecm9wZG93bkV2ZW50KGV2ZW50TmFtZTogVFlQRV9QT1BPVkVSX0VWRU5UKSB7XG4gICAgdGhpcy5oYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQuc2V0KHRydWUpO1xuICAgIGlmIChldmVudE5hbWUgPT09ICdyZW1vdmUnIHx8IGV2ZW50TmFtZSA9PT0gJ21vdXNlbGVhdmUtY29udGVudCcpIHtcbiAgICAgIHRoaXMuaGFzQWN0aW9uQnV0dG9uRHJvcGRvd25Db250ZW50LnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldEluZGV4SG92ZXIoZTogRXZlbnQsIGl0ZW06IFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciA9IGl0ZW07XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRJbmRleEhvdmVyV2hlbk1vdXNlTGVhdmUoZT86IEV2ZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY3VycmVudEluZGV4SXRlbUhvdmVyID0gdGhpcy5pdGVtT2ZJbmRleEhvdmVyO1xuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dExlYXZlSXRlbSgpKTtcbiAgICB0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0uc2V0KFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1PZkluZGV4SG92ZXIgJiYgdGhpcy5pdGVtT2ZJbmRleEhvdmVyICE9PSBjdXJyZW50SW5kZXhJdGVtSG92ZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRJbmRleEhvdmVyKGU/OiBFdmVudCkge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VMZWF2ZUNvbnRhaW5lcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlRW50ZXJIZWFkZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5tb3VzZUVudGVySGVhZGVyLnNldCh0cnVlKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlTGVhdmVIZWFkZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5tb3VzZUVudGVySGVhZGVyLnNldChmYWxzZSk7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUVudGVyRm9vdGVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgICBpZiAodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSkge1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VMZWF2ZUZvb3RlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSkge1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQoJ2JnLVsjZjhmOWZhXScpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaGFuZGxlclNjcm9sbEhlYWRlcihlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLm1vdXNlRW50ZXJIZWFkZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAodGhpcy5ib2R5RWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuICAgIH1cbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm9keShlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMubW91c2VFbnRlckhlYWRlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICh0aGlzLmhlYWRlckVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsTGVmdDtcbiAgICBpZiAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkpIHtcbiAgICAgICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNjcm9sbEJvdHRvbShlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMubG9hZGluZygpIHx8IHRoaXMuYWN0aXZpdHlMb2FkRGF0YSgpICE9PSAnc2Nyb2xsLWluZmluaXR5Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dExvYWRNb3JlLmVtaXQoeyBsb2FkTW9yZVN1Y2Nlc3M6IHRoaXMubG9hZE1vcmVTdWNjZXNzLmJpbmQodGhpcykgfSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlUGFnZShwYWdlOiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2luZ1N0b3JlLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uKGRhdGEgfHwge30pLCBwYWdlIH0pKTtcbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0U2Nyb2xsKHNjcm9sbFBvc2l0aW9uTGVmdD86IG51bWJlciwgc2Nyb2xsUG9zaXRpb25Ub3A/OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5oZWFkZXJFbGVtZW50UmVmKCkpIHtcbiAgICAgICh0aGlzLmhlYWRlckVsZW1lbnRSZWYoKSBhcyBhbnkpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbFBvc2l0aW9uTGVmdCB8fCAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5Cb2R5RWxlbWVudCkge1xuICAgICAgdGhpcy5Cb2R5RWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxQb3NpdGlvblRvcCB8fCAwO1xuICAgICAgdGhpcy5Cb2R5RWxlbWVudC5zY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb25MZWZ0IHx8IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb25MZWZ0IHx8IDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldChjbGVhclNvcnQ/OiBib29sZWFuKSB7XG4gICAgaWYgKGNsZWFyU29ydCkge1xuICAgICAgdGhpcy5pbnN0YW5jZVNvcnQoKT8ucmVzZXQoKTtcbiAgICAgIHRoaXMuaW5zdGFuY2VTb3J0LnNldCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB0aGlzLml0ZW1zLnNldChbXSk7XG4gICAgdGhpcy5zdG9yZXMuc2V0KFtdKTtcbiAgICB0aGlzLmZha2VSZXNwb25zZUFwaSgpO1xuICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tTY3JvbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFzU2Nyb2xsID0gdGhpcy5oYXNTY3JvbGwoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGltZXIoNTAwKVxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuQm9keUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzU2Nyb2xsLnNldCh0aGlzLkJvZHlFbGVtZW50LnNjcm9sbEhlaWdodCA+IHRoaXMuQm9keUVsZW1lbnQub2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhc1Njcm9sbCAmJiAhdGhpcy5oYXNTY3JvbGwoKSkge1xuICAgICAgICAgICAgdGhpcy5vdXRTY3JvbGxJc0dvbmUuZW1pdCh7fSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSkge1xuICAgICAgICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IEJvZHlFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ib2R5RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoaWdodExpZ2h0SXRlbShpdGVtczogQXJyYXk8VFlQRV9JVEVNX0RBVEFfVEFCTEU+KSB7XG4gICAgdGhpcy5pdGVtc0hpZ2h0TGlnaHQudXBkYXRlKChpdGVtc0hpZ2h0TGlnaHQpID0+IFsuLi5pdGVtc0hpZ2h0TGlnaHQsIC4uLml0ZW1zXSk7XG5cbiAgICB0aW1lcih0aGlzLnRpbWVIaWdobGlnaE5ld0l0ZW0oKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICB0aGlzLml0ZW1zSGlnaHRMaWdodC51cGRhdGUoKGl0ZW1zSGlnaHRMaWdodCkgPT4gaXRlbXNIaWdodExpZ2h0LmZpbHRlcigoaXRlbUhpZ2h0TGlnaHQpID0+IGl0ZW1IaWdodExpZ2h0ICE9PSBpdGVtKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0TGVhdmVJdGVtKCkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsXCI+XG4gIEBpZiAoIWlnbm9yZUJhcigpKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciByZWxhdGl2ZSB6LVsxXSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGJnLXdoaXRlIGxpYnMtdWktdGFibGUtc2hhZG93LWJvdHRvbSB7eyBjbGFzc0JhckluY2x1ZGUoKSB9fVwiXG4gICAgICBbY2xhc3MucHgtWzE2cHhdXT1cImtleXNTZWxlY3RlZCgpLmxlbmd0aCB8fCBsYWJlbEJhck5vU2VsZWN0SXRlbSgpXCJcbiAgICAgIFtjbGFzcy5weS1bNnB4XV09XCJrZXlzU2VsZWN0ZWQoKS5sZW5ndGggfHwgbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKVwiXG4gICAgICAobW91c2VlbnRlcik9XCJyZXNldEluZGV4SG92ZXIoJGV2ZW50KVwiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiZGl2LmxpYnMtdWktdGFibGUtYmFyLWxlZnRcIj48L25nLWNvbnRlbnQ+XG4gICAgICBAaWYgKCFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYgbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ7eyBjbGFzc0xhYmVsQmFyTm9TZWxlY3RJdGVtKCkgPz8gJ3B4LVsxMnB4XSBweS1bNXB4XScgfX1cIlxuICAgICAgICAgIFtpbm5lckh0bWxdPVwibGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSB8IHRyYW5zbGF0ZTogeyB2YWx1ZTogdG90YWxJdGVtRGlzcGxheSgpIH1cIj48L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoa2V5c1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBwbC1bMTJweF1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgaC1mdWxsIG10LVstMnB4XVwiPlxuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGVcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlXT1cImxvYWRpbmcoKSB8fCBkaXNhYmxlQ2hlY2tib3goKVwiXG4gICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUFsbENoZWNrZWQoKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNW0gdGV4dC1bIzA3MTYzMV0gbXItWzhweF0ge3sgY2xhc3NMYWJlbEJhckJ1dHRvbnMoKSB9fVwiPlxuICAgICAgICAgICAge3sgbGFiZWxCYXJCdXR0b25zKCkgfCB0cmFuc2xhdGU6IHsgdmFsdWU6IGtleXNTZWxlY3RlZCgpLmxlbmd0aCB9IH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChjb25maWdTZWxlY3RNb3JlSXRlbSgpKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwie1xuICAgICAgICAgICAgICAgIHdpZHRoQnlQYXJlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlnbm9yZUFycm93OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogMjA0OCxcbiAgICAgICAgICAgICAgICBjbGFzc0luY2x1ZGU6ICchdy1bMTIxcHhdJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgbW9kZTogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0Q29uZmlnTW9yZUl0ZW0oKVwiXG4gICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiNVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiIXctWzE2cHhdIGgtWzE2cHhdIG1yLVs4cHhdXCJcbiAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWRNb3JlSXRlbSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbE1vcmVTZWxlY3RJdGVtKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCBtLTAnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInYmVmb3JlOiF0ZXh0LVsxNnB4XSBsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAgbXItWzZweF0nXCJcbiAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7IGNvbmZpZzogeyBjb250ZW50OiAnaTE4bl9tb3JlX3NlbGVjdCcgfSB9XCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImgtWzE2cHhdIGxpYnMtdWktYm9yZGVyLWxlZnQtZ2VuZXJhbCBtbC1bMTZweF1cIj48L2Rpdj5cbiAgICAgICAgICBAaWYgKGJhckJ1dHRvbnMoKT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBAZm9yIChidXR0b24gb2YgYmFyQnV0dG9ucygpOyB0cmFjayBidXR0b24pIHtcbiAgICAgICAgICAgICAgQGxldCBjb25zdEh0bWxMYWJlbCA9IGJ1dHRvbi5sYWJlbCB8fCAnICc7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbdHlwZV09XCJidXR0b24udHlwZSB8fCAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImJ1dHRvbi5jbGFzc0ljb25MZWZ0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25zdEh0bWxMYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJCYXJCdXR0b25DbGljayhidXR0b24pXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiZGl2LmxpYnMtdWktdGFibGUtYmFyLXJpZ2h0XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPGRpdlxuICAgICN0YWJsZUNvbnRhaW5lckVsZW1lbnRSZWZcbiAgICBjbGFzcz1cImxpYnMtdWktdGFibGUgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsIHJlbGF0aXZlIHt7IGNsYXNzVGFibGVDb250YWluZXJJbmNsdWRlKCkgfX1cIlxuICAgIFtjbGFzcy5weC1bMTZweF1dPVwiIWlnbm9yZUJhcigpXCJcbiAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVyTW91c2VMZWF2ZUNvbnRhaW5lcigkZXZlbnQpXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGwgc2hyaW5rLTBcIlxuICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJoZWFkZXJFbGVtZW50UmVmLm9mZnNldEhlaWdodFwiXG4gICAgICBbY2xhc3MuIWhpZGRlbl09XCIhaXRlbXMoKS5sZW5ndGggJiYgaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhKClcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgI2hlYWRlckVsZW1lbnRSZWZcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgICAgW29wdGlvbnNdPVwieyBzY3JvbGxiYXJXaWR0aDogMCB9XCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWJvdHRvbS1kYXNoZWQtZ2VuZXJhbF09XCIhaGFzSXRlbUhpZ2h0TGlnaHQoKSAmJiBpc0Rhc2hCb3JkZXIoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbF09XCIhaGFzSXRlbUhpZ2h0TGlnaHQoKSAmJiAhaXNEYXNoQm9yZGVyKClcIlxuICAgICAgICBbY2xhc3NdPVwiY2xhc3NIZWFkZXJDb250YWluZXIoKVwiXG4gICAgICAgIChvdXRTY3JvbGwpPVwiaGFuZGxlclNjcm9sbEhlYWRlcigkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlck1vdXNlRW50ZXJIZWFkZXIoJGV2ZW50KVwiXG4gICAgICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZXJNb3VzZUxlYXZlSGVhZGVyKCRldmVudClcIj5cbiAgICAgICAgQGlmIChoZWFkZXJMZWZ0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgPGRpdiBbY2xhc3NdPVwiY2xhc3NIZWFkZXJMZWZ0Q29udGFpbmVyKClcIj5cbiAgICAgICAgICAgIEBmb3IgKGhlYWRlciBvZiBoZWFkZXJMZWZ0KCk7IHRyYWNrIGhlYWRlcikge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJSZWY7IGNvbnRleHQ6IHsgaGVhZGVySXRlbTogaGVhZGVyLCBpc0hlYWRlckxlZnQ6IHRydWUgfVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChoZWFkZXJSaWdodCgpLmxlbmd0aCkge1xuICAgICAgICAgIEBmb3IgKGhlYWRlciBvZiBoZWFkZXJSaWdodCgpOyB0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlclJlZjsgY29udGV4dDogeyBoZWFkZXJJdGVtOiBoZWFkZXIsIGlzSGVhZGVyTGVmdDogZmFsc2UgfVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKHNob3dGb290ZXIoKSAmJiBpdGVtRm9vdGVyKCkgJiYgY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ3RvcCcpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUZvb3RlclJlZlwiIC8+XG4gICAgfVxuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgb3ZlcmZsb3cteC1oaWRkZW4gYmctd2hpdGUge3sgY2xhc3NCb2R5SW5jbHVkZSgpIHx8ICcnIH19XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNib2R5RWxlbWVudFJlZlxuICAgICAgICBjbGFzcz1cImZsZXggaC1mdWxsIHctZnVsbCByZWxhdGl2ZVwiXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIChvdXRTY3JvbGwpPVwiaGFuZGxlclNjcm9sbEJvZHkoJGV2ZW50KVwiXG4gICAgICAgIChvdXRTY3JvbGxCb3R0b20pPVwiaGFuZGxlclNjcm9sbEJvdHRvbSgkZXZlbnQpXCI+XG4gICAgICAgIEBpZiAoaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICA8dmlydHVhbC1zY3JvbGxlclxuICAgICAgICAgICAgI2JvZHlDb21wb25lbnRSZWZcbiAgICAgICAgICAgIFtpdGVtc109XCJpdGVtcygpXCJcbiAgICAgICAgICAgIFtlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplc109XCJlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcygpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoID4gKGJvZHlFbGVtZW50UmVmID8gYm9keUVsZW1lbnRSZWYuc2Nyb2xsV2lkdGggOiAwKSA/IGhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGggOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW3BhcmVudFNjcm9sbF09XCJib2R5RWxlbWVudFJlZlwiXG4gICAgICAgICAgICBbYnVmZmVyQW1vdW50XT1cImJ1ZmZlckFtb3VudCgpXCI+XG4gICAgICAgICAgICBAZm9yIChkYXRhIG9mIGJvZHlDb21wb25lbnRSZWYudmlld1BvcnRJdGVtczsgdHJhY2sgZGF0YSgpKSB7XG4gICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbSA9IGRhdGEgfCBMaWJzVWlUYWJsZUNoZWNrSXRlbUhpZ2h0TGlnaHRQaXBlOiBpdGVtc0hpZ2h0TGlnaHQoKTtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICNlbGVtZW50SG92ZXJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2YzZmNmY11dPVwiY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLXRvcC0xcHgtMzZkM2QzXT1cImNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW0gJiYgJGZpcnN0ICYmICFpZ25vcmVCb3JkZXJJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1ib3R0b20tMXB4LTM2ZDNkM109XCJjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtICYmICFpZ25vcmVCb3JkZXJJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbSB8fCAoJGxhc3QgJiYgaWdub3JlQm9yZGVySXRlbUxhc3QoKSlcbiAgICAgICAgICAgICAgICAgICAgPyAnbGlicy11aS1ib3JkZXItcmFkaXVzLWJvdHRvbS1sZWZ0LTRweCBsaWJzLXVpLWJvcmRlci1yYWRpdXMtYm90dG9tLXJpZ2h0LTRweCdcbiAgICAgICAgICAgICAgICAgICAgOiBpZ25vcmVCb3JkZXJJdGVtKClcbiAgICAgICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgOiBpc0Rhc2hCb3JkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnbGlicy11aS1ib3JkZXItYm90dG9tLWRhc2hlZC1nZW5lcmFsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJnLVsjZjhmOWZhXV09XCJpdGVtT2ZJbmRleEhvdmVyID09PSBkYXRhICYmICFjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRJbmRleEhvdmVyKCRldmVudCwgZGF0YSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGggfHwgaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctd2hpdGVdPVwiIWNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHB4LVsxMnB4XSBweS1bOHB4XSB7eyBoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnJyA6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmOGY5ZmFdXT1cIml0ZW1PZkluZGV4SG92ZXIgPT09IGRhdGEgJiYgIWNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyTGVmdCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7IHdpZHRoOiAnNTBweCcsICdmbGV4LXNoaXJrJzogJzAnLCBwYWRkaW5nOiAnOHB4JyB9IDoge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaGVhZGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUJvZHlSZWY7IGNvbnRleHQ6IHsgaGVhZGVyOiBoZWFkZXIsIGRhdGE6IGRhdGEsIGNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW06IGNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW0gfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlclJpZ2h0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogaGVhZGVyTGVmdCgpIDogaGVhZGVyUmlnaHQoKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHsgd2lkdGg6ICc1MHB4JywgJ2ZsZXgtc2hpcmsnOiAnMCcsIHBhZGRpbmc6ICc4cHgnIH0gOiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlQm9keVJlZjsgY29udGV4dDogeyBoZWFkZXI6IGhlYWRlciwgZGF0YTogZGF0YSwgY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbTogY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbSB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpICYmIGRhdGEoKS5zcGVjaWZpY0V4cGFuZCAmJiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNzc1dyYXBwZXIgfHwgJ2ZsZXggdy1mdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUV4cGFuZCBvZiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5jb2xUZW1wbGF0ZUNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAob3B0aW1pemVUYWJsZVJlbmRlckJ5T25WaWV3cG9ydCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZGVmZXIgKG9uIHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiZGF0YUV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8udGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBwbGFjZWhvbGRlciB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJ3ctZnVsbCBoLWZ1bGwnXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJkYXRhRXhwYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGgtWzEwMHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdmlydHVhbC1zY3JvbGxlcj5cbiAgICAgICAgfSBAZWxzZSBpZiAoIWxvYWRpbmcoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGlja3kgbGVmdC0wIHRvcC0wIHotWzFdIGgtW2NhbGMoMTAwJS0xMHB4KV0gdy1mdWxsXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb2RhdGFSZWZcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAoc2hvd1Njcm9sbFRhYmxlUGlubmVkSWZOb0RhdGEoKSkge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGgtWzFweF0gYmctdHJhbnNwYXJlbnQgdG9wLTAgbGVmdC0wIHotWzFdXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGhcIj48L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKHNob3dGb290ZXIoKSAmJiBpdGVtRm9vdGVyKCkgJiYgY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlRm9vdGVyUmVmXCIgLz5cbiAgICAgIH1cblxuICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIHctZnVsbCBoLWZ1bGwgei1bMl0gZmxleCBpdGVtcy1jZW50ZXIgY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXNwaW5uZXIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGFjdGl2aXR5TG9hZERhdGEoKSA9PT0gJ2NsaWNrLXBhZ2luYXRpb24nKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgbXQtWzEycHhdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcGFnaW5hdGlvblxuICAgICAgICAgIFttb2RlRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlXT1cInBhZ2luYXRpb25TZXR0aW5nKCk/Lm1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UgfHwgJ2JvdHRvbSdcIlxuICAgICAgICAgIFtjbGFzc0Rpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZV09XCJwYWdpbmF0aW9uU2V0dGluZygpPy5jbGFzc0Rpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSB8fCAnJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZUl0ZW1dPVwicGFnaW5hdGlvblNldHRpbmcoKT8uY2xhc3NJbmNsdWRlSXRlbSB8fCAnJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZUNvbnRhaW5lcl09XCJwYWdpbmF0aW9uU2V0dGluZygpPy5jbGFzc0luY2x1ZGVDb250YWluZXIgfHwgJyFpdGVtcy1lbmQnXCJcbiAgICAgICAgICBbZGlzYWJsZV09XCJwYWdpbmF0aW9uU2V0dGluZygpPy5kaXNhYmxlIHx8IGxvYWRpbmcoKSB8fCAhaXRlbXMoKS5sZW5ndGhcIlxuICAgICAgICAgIFtudW1iZXJQYWdlRGlzcGxheV09XCJwYWdpbmF0aW9uU2V0dGluZygpPy5udW1iZXJQYWdlRGlzcGxheSB8fCA1XCJcbiAgICAgICAgICBbc2hvd1RvdGFsUGFnZV09XCJwYWdpbmF0aW9uU2V0dGluZygpPy5zaG93VG90YWxQYWdlIHx8IGZhbHNlXCJcbiAgICAgICAgICBbc2hvd0lucHV0R290b1BhZ2VdPVwicGFnaW5hdGlvblNldHRpbmcoKT8uc2hvd0lucHV0R290b1BhZ2UgfHwgZmFsc2VcIlxuICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInBhZ2luZ1N0b3JlKCk/LnRvdGFsX2l0ZW1zIHx8IChwYWdpbmdTdG9yZSgpPy50b3RhbF9wYWdlcyB8fCAwKSAqIChwYWdpbmdTdG9yZSgpPy5wZXJfcGFnZSB8fCAwKVwiXG4gICAgICAgICAgW3BlclBhZ2VdPVwicGFnaW5nU3RvcmUoKT8ucGVyX3BhZ2UgfHwgMFwiXG4gICAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2luZ1N0b3JlKCk/LnBhZ2UgfHwgMFwiXG4gICAgICAgICAgKG91dFBhZ2VTZWxlY3QpPVwiaGFuZGxlckNoYW5nZVBhZ2UoJGV2ZW50KVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAjdGVtcGxhdGVIZWFkZXJSZWZcbiAgbGV0LWhlYWRlcj1cImhlYWRlckl0ZW1cIlxuICBsZXQtaXNIZWFkZXJMZWZ0PVwiaXNIZWFkZXJMZWZ0XCI+XG4gIDxkaXZcbiAgICBbY2xhc3NdPVwiJ3JlbGF0aXZlIGZsZXggJyArIChoZWFkZXIucGFkZGluZ0xlZnRSaWdodEhlYWRlckNvbnRhaW5lciA/PyAnIHB4LVsxMnB4XSAnKSArIChpc0hlYWRlckxlZnQgJiYgIWhlYWRlci5pZ25vcmVCb3JkZXJSaWdodCA/ICcgbGlicy11aS1ib3JkZXItcmlnaHQtZ2VuZXJhbCAnIDogJyAnKSArICcgbGlicy11aS10YWJsZS1oZWFkZXItY29sICdcIlxuICAgIFtjbGFzcy5mbGV4LWNvbF09XCJoZWFkZXIucm93c0NvbmZpZ1wiXG4gICAgW2NsYXNzLnB5LVs4cHhdXT1cIiFoZWFkZXIuaWdub3JlUHlEZWZhdWx0XCJcbiAgICBbbmdTdHlsZV09XCJcbiAgICAgIChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiAoaXNIZWFkZXJMZWZ0ID8gaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyKCk/LmhlYWRlckxlZnQgfHwgZmFsc2UgOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UpIDogaGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aCA6IGhlYWRlckxlZnQoKSA6IGhlYWRlclJpZ2h0KCkpIHx8XG4gICAgICAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7IHdpZHRoOiAnNTBweCcsICdmbGV4LXNoaXJrJzogJzAnLCBwYWRkaW5nOiAnOHB4JyB9IDoge30pXG4gICAgXCJcbiAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgIEBpZiAoIWhlYWRlci5yb3dzQ29uZmlnKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJDb250ZW50UmVmOyBjb250ZXh0OiB7IGhlYWRlckl0ZW06IGhlYWRlciwgaXNDb2xSZW5kZXI6IGZhbHNlLCBpc0hlYWRlckxlZnQ6IGlzSGVhZGVyTGVmdCB9XCIgLz5cbiAgICB9XG4gICAgQGlmIChoZWFkZXIucm93c0NvbmZpZzsgYXMgcm93c0NvbmZpZykge1xuICAgICAgQGZvciAocm93IG9mIHJvd3NDb25maWcucm93czsgdHJhY2sgcm93KSB7XG4gICAgICAgIDxkaXYgW2NsYXNzXT1cInJvdy5jbGFzc1Jvd1wiPlxuICAgICAgICAgIEBmb3IgKGNvbCBvZiByb3cuY29sczsgdHJhY2sgY29sKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJDb250ZW50UmVmOyBjb250ZXh0OiB7IGhlYWRlckl0ZW06IGNvbCwgaXNDb2xSZW5kZXI6IHRydWUsIGlzSGVhZGVyTGVmdDogaXNIZWFkZXJMZWZ0IH1cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgfVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjdGVtcGxhdGVIZWFkZXJDb250ZW50UmVmXG4gIGxldC1oZWFkZXI9XCJoZWFkZXJJdGVtXCJcbiAgbGV0LWlzQ29sUmVuZGVyPVwiaXNDb2xSZW5kZXJcIlxuICBsZXQtaXNIZWFkZXJMZWZ0PVwiaXNIZWFkZXJMZWZ0XCI+XG4gIDxkaXZcbiAgICAjaXRlbUhlYWRlclJlZlxuICAgIGNsYXNzPVwiZmxleCBsaWJzLXVpLWZvbnQtaDZtIG1pbi1oLVsxOHB4XSB0ZXh0LVsjNmE3MzgzXSBtYXgtdy1mdWxsXCJcbiAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cImhlYWRlci5jb250ZW50SGVhZGVyQWxpZ25DZW50ZXIgPz8gdHJ1ZVwiXG4gICAgW2NsYXNzLmp1c3RpZnktZW5kXT1cImhlYWRlci5jb250ZW50SGVhZGVySnVzdGlmeUNvbnRlbnRFbmRcIlxuICAgIFtjbGFzcy53LWZ1bGxdPVwiaGVhZGVyLmlzU2hvd0luZGV4T25Sb3dcIlxuICAgIFtuZ1N0eWxlXT1cIlxuICAgICAgaXNDb2xSZW5kZXJcbiAgICAgICAgPyAoaGVhZGVyIHwgTGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTogKGlzSGVhZGVyTGVmdCA/IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJMZWZ0IHx8IGZhbHNlIDogaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyKCk/LmhlYWRlclJpZ2h0IHx8IGZhbHNlKSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgICAgIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHsgd2lkdGg6ICc1MHB4JywgJ2ZsZXgtc2hpcmsnOiAnMCcsIHBhZGRpbmc6ICc4cHgnIH0gOiB7fSlcbiAgICAgICAgOiB7fVxuICAgIFwiXG4gICAgW25nQ2xhc3NdPVwiaXNDb2xSZW5kZXIgPyBoZWFkZXIubmdDbGFzcyB8fCB7fSA6IHt9XCI+XG4gICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3gpIHtcbiAgICAgIEBpZiAoaGVhZGVyLmhhc0NoZWNrYm94QWxsKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImZsZXggaC1mdWxsIHt7IGhlYWRlci5jaGVja2JveEFsbENsYXNzSW5jbHVkZSB8fCAnbXItWzE2cHhdJyB9fVwiXG4gICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY2hlY2tib3hBbGlnbkNlbnRlclwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXG4gICAgICAgICAgICBba2V5XT1cIidhbGwnXCJcbiAgICAgICAgICAgIFtzdGlsbE90aGVyT3B0aW9uc109XCIhIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggIT09IGl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cIiEha2V5c1NlbGVjdGVkKCkubGVuZ3RoICYmIGtleXNTZWxlY3RlZCgpLmxlbmd0aCA9PT0gaXRlbXMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiaGVhZGVyLmNoZWNrYm94Q2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUNoZWNrZWRBbGxJdGVtcygkZXZlbnQpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIG1sLVsyNHB4XSB7eyBoZWFkZXIuY2hlY2tib3hDbGFzc0luY2x1ZGUgfX1cIj48L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gICAgQGZvciAodG9vbHRpcCBvZiBoZWFkZXIudG9vbHRpcHNMZWZ0OyB0cmFjayB0b29sdGlwKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibXItWzRweF1cIj5cbiAgICAgICAgQGxldCBjb25zdEh0bWxUb29sdGlwID0gdG9vbHRpcC5kYXRhVmlldyB8fCAnICc7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIFt0eXBlXT1cInRvb2x0aXA/LnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgW21vZGVdPVwidG9vbHRpcD8ubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cInRvb2x0aXAuY2xhc3NJbmNsdWRlIHx8ICd0ZXh0LVsjNmE3MzgzXSdcIlxuICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0b29sdGlwLmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cIlxuICAgICAgICAgICAgdG9vbHRpcC5jb25maWcgfHwge1xuICAgICAgICAgICAgICBjb250ZW50OiBjb25zdEh0bWxUb29sdGlwIHwgdHJhbnNsYXRlLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIG1vZGU6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgICAgICAgIGF1dG9VcGRhdGVQb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgZW5kRGlzdGFuY2U6IDEyLFxuICAgICAgICAgICAgICAgICAgc3RhcnREaXN0YW5jZTogLTEyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvb2x0aXAuZGF0YVZpZXdcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdykge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGgtZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIge3sgaGVhZGVyLmNsYXNzSW5jbHVkZUluZGV4T25Sb3cgfHwgJycgfX1cIj5cbiAgICAgICAge3sgaGVhZGVyLmxhYmVsID8/ICcjJyB9fVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICBAaWYgKGhlYWRlci5sYWJlbCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGhlYWRlci5wYXJzZVZhbHVlIDogaGVhZGVyIHwgYXN5bmMgfCB0cmFuc2xhdGU7IGFzIGxhYmVsSGVhZGVyQ29sdW1uKSB7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIFt0eXBlXT1cImhlYWRlcj8ubGFiZWxDb25maWc/LnR5cGUgfHwgJ3RleHQnXCJcbiAgICAgICAgICBbbW9kZV09XCJoZWFkZXI/LmxhYmVsQ29uZmlnPy5tb2RlIHx8ICdob3ZlcidcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8uaWdub3JlU2hvd1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgIFtjb25maWddPVwiaGVhZGVyLmxhYmVsQ29uZmlnPy5jb25maWcgfHwgeyBjb250ZW50OiBsYWJlbEhlYWRlckNvbHVtbiB9XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImxhYmVsSGVhZGVyQ29sdW1uXCIgLz5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAZm9yICh0b29sdGlwIG9mIGhlYWRlci50b29sdGlwc1JpZ2h0OyB0cmFjayB0b29sdGlwKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWwtWzRweF1cIj5cbiAgICAgICAgQGxldCBjb25zdEh0bWxUb29sdGlwID0gdG9vbHRpcC5kYXRhVmlldyB8fCAnICc7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIFt0eXBlXT1cInRvb2x0aXA/LnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgW21vZGVdPVwidG9vbHRpcD8ubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cInRvb2x0aXAuY2xhc3NJbmNsdWRlIHx8ICd0ZXh0LVsjNmE3MzgzXSdcIlxuICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0b29sdGlwLmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cIlxuICAgICAgICAgICAgdG9vbHRpcC5jb25maWcgfHwge1xuICAgICAgICAgICAgICBjb250ZW50OiBjb25zdEh0bWxUb29sdGlwIHwgdHJhbnNsYXRlLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIG1vZGU6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgICAgICAgIGF1dG9VcGRhdGVQb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgZW5kRGlzdGFuY2U6IDEyLFxuICAgICAgICAgICAgICAgICAgc3RhcnREaXN0YW5jZTogLTEyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvb2x0aXAuZGF0YVZpZXdcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaGFzU29ydCAmJiBoZWFkZXIub3JkZXJieSkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1sLVs0cHhdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1zb3J0LWFycm93XG4gICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8ICFpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgW2ZpZWxkU29ydF09XCJoZWFkZXIub3JkZXJieVwiXG4gICAgICAgICAgW2lnbm9yZVBvcG92ZXJDb250ZW50XT1cImhlYWRlci5zb3J0SWdub3JlVG9vbHRpcENvbnRlbnQgPz8gdHJ1ZVwiXG4gICAgICAgICAgW3BvcG92ZXJDb250ZW50QXNjXT1cImhlYWRlci5zb3J0VG9vbHRpcENvbnRlbnRBc2NcIlxuICAgICAgICAgIFtwb3BvdmVyQ29udGVudERlc2NdPVwiaGVhZGVyLnNvcnRUb29sdGlwQ29udGVudERlc2NcIlxuICAgICAgICAgIFtkZWZhdWx0TW9kZV09XCJoZWFkZXIuZGVmYXVsdE1vZGVcIlxuICAgICAgICAgIFt6SW5kZXhdPVwiaGVhZGVyLnpJbmRleFRvb2x0aXBTb3J0XCJcbiAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VTb3J0KCRldmVudClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmIChoZWFkZXIubGFiZWxEZXNjcmlwdGlvbikge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogaGVhZGVyLmxhYmVsRGVzY3JpcHRpb24uY29udGVudCB8IHRyYW5zbGF0ZSB9XCJcbiAgICAgICAgW2lubmVySFRNTF09XCJoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jb250ZW50IHwgdHJhbnNsYXRlXCIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICN0ZW1wbGF0ZUJvZHlSZWZcbiAgbGV0LWhlYWRlcj1cImhlYWRlclwiXG4gIGxldC1kYXRhPVwiZGF0YVwiXG4gIGxldC1jb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtPVwiY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsXCI+XG4gICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3gpIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbFwiXG4gICAgICAgIFtjbGFzcy5pbnZpc2libGVdPVwiaGVhZGVyLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gJiYgKGRhdGEoKSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGhlYWRlci5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIDogZGF0YSgpIHwgYXN5bmMpXCJcbiAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY2hlY2tib3hBbGlnbkNlbnRlclwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZVxuICAgICAgICAgIFtrZXldPVwiZGF0YSgpW2ZpZWxkS2V5KCldXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOiBrZXlzU2VsZWN0ZWQoKSA6IGtleXNTZWxlY3RlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8IGRpc2FibGVDaGVja2JveCgpIHx8ICEhKG1heEl0ZW1TZWxlY3RlZCgpICYmICEoZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOiBrZXlzU2VsZWN0ZWQoKSA6IGtleXNTZWxlY3RlZCgpLmxlbmd0aCkgJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoID49IG1heEl0ZW1TZWxlY3RlZCgpKVwiXG4gICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoJGV2ZW50LCBkYXRhKCkpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3c7IGFzIGNvbmZpZykge1xuICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBsaWJzLXVpLWZvbnQtaDRye3sgY29uZmlnLmNsYXNzSW5jbHVkZUluZGV4T25Sb3cgfHwgJycgfX1cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICBbY29uZmlnXT1cInt9XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImRhdGEgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBnZXRJbmRleFJvdyB8IGFzeW5jXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5jb2xUZW1wbGF0ZUNvbmZpZykge1xuICAgICAgQGxldCBjb25zdEh0bWxJc0hvdmVyID0gaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbTtcbiAgICAgIEBpZiAob3B0aW1pemVUYWJsZVJlbmRlckJ5T25WaWV3cG9ydCgpKSB7XG4gICAgICAgIEBkZWZlciAob24gdmlld3BvcnQpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgW2lzSG92ZXJdPVwiY29uc3RIdG1sSXNIb3ZlclwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgICAgW2l0ZW1dPVwiZGF0YVwiXG4gICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImhlYWRlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgW2NvbmZpZ3NdPVwiaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgfSBAcGxhY2Vob2xkZXIge1xuICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImhlYWRlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICd3LWZ1bGwgaC1mdWxsJ1wiPjwvZGl2PlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICBbaXNIb3Zlcl09XCJjb25zdEh0bWxJc0hvdmVyXCJcbiAgICAgICAgICBbY2xhc3NdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgIFtpdGVtXT1cImRhdGFcIlxuICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgW2NvbmZpZ3NdPVwiaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUZvb3RlclJlZj5cbiAgQGlmICghaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhKCkgfHwgKGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpICYmIGl0ZW1zKCkubGVuZ3RoKSkge1xuICAgIDxkaXZcbiAgICAgICNmb290ZXJFbGVtZW50UmVmXG4gICAgICBjbGFzcz1cImZsZXggdy1mdWxsIGJnLVsjZjhmOWZhXSBvdmVyZmxvdy14LWhpZGRlbiB6LVsxXSB7eyBpZ25vcmVCb3JkZXJGb290ZXIoKSA/ICcnIDogY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ3RvcCcgPyAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnIDogJ2xpYnMtdWktdGFibGUtc2hhZG93LXRvcCBsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCcgfX0gbWluLWgtWzM1cHhdXCJcbiAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJNb3VzZUVudGVyRm9vdGVyKCRldmVudClcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwiaGFuZGxlck1vdXNlTGVhdmVGb290ZXIoJGV2ZW50KVwiPlxuICAgICAgQGlmIChmb290ZXJMZWZ0KCkpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICNmb290ZXJMZWZ0RWxlbWVudFJlZlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBzdGlja3kgdG9wLTAgbGVmdC0wIHotWzFdIGJnLVsjZjhmOWZhXVwiPlxuICAgICAgICAgIEBmb3IgKGZvb3RlciBvZiBmb290ZXJMZWZ0KCk7IHRyYWNrIGZvb3Rlcikge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB4LVsxMnB4XSBweS1bOHB4XSB7eyBmb290ZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnJyA6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihmb290ZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyTGVmdCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBmb290ZXJMZWZ0KCkgOiBmb290ZXJSaWdodCgpKSB8fCB7fVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvb3Rlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgIEBpZiAoZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnICYmIGl0ZW1Gb290ZXIoKSkge1xuICAgICAgICAgICAgICAgIEBpZiAob3B0aW1pemVUYWJsZVJlbmRlckJ5T25WaWV3cG9ydCgpKSB7XG4gICAgICAgICAgICAgICAgICBAZGVmZXIgKG9uIHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICB9IEBwbGFjZWhvbGRlciB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICd3LWZ1bGwgaC1mdWxsJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChmb290ZXJSaWdodCgpKSB7XG4gICAgICAgIEBmb3IgKGZvb3RlciBvZiBmb290ZXJSaWdodCgpOyB0cmFjayBmb290ZXIpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB4LVsxMnB4XSBweS1bOHB4XVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCIoZm9vdGVyIHwgTGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTogaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyKCk/LmhlYWRlclJpZ2h0IHx8IGZhbHNlIDogaGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aCA6IGZvb3RlckxlZnQoKSA6IGZvb3RlclJpZ2h0KCkpIHx8IHt9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvb3Rlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICBAaWYgKGZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZyAmJiBpdGVtRm9vdGVyKCkpIHtcbiAgICAgICAgICAgICAgQGlmIChvcHRpbWl6ZVRhYmxlUmVuZGVyQnlPblZpZXdwb3J0KCkpIHtcbiAgICAgICAgICAgICAgICBAZGVmZXIgKG9uIHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtRm9vdGVyIHwgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICB9IEBwbGFjZWhvbGRlciB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAndy1mdWxsIGgtZnVsbCdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtRm9vdGVyIHwgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVOb2RhdGFSZWY+XG4gIEBpZiAoa2V5U2VhcmNoKCkgfHwgb25seVNob3dOb1Jlc3VsdCgpKSB7XG4gICAgQGlmICh0ZW1wbGF0ZU5vUmVzdWx0KCk7IGFzIHRlbXBsYXRlTm9SZXN1bHQpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vUmVzdWx0XCIgLz5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIGFic29sdXRlIGxlZnQtMCB0b3AtMCB6LVsxXVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBzaHJpbmstMFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiJ25vLXJlc3VsdCcgfCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIHwgYXN5bmM7IGlucHV0czogeyBzaXplOiA2NCB9XCIgLz5cbiAgICAgICAgICBAbGV0IGNvbnN0SHRtbFRleHRTZWFyY2hOb0RhdGEgPSBub0RhdGFDb25maWcoKS50ZXh0U2VhcmNoTm9EYXRhIHx8ICdpMThuX25vX3Jlc3VsdCc7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLXRhYmxlLW5vLWRhdGEtY29uZmlnLXRleHRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwibm9EYXRhQ29uZmlnKCkubmdTdHlsZSB8fCB7fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJub0RhdGFDb25maWcoKS5uZ0NsYXNzIHx8IHt9XCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uc3RIdG1sVGV4dFNlYXJjaE5vRGF0YSB8IHRyYW5zbGF0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfSBAZWxzZSB7XG4gICAgQGlmICh0ZW1wbGF0ZU5vRGF0YSgpOyBhcyB0ZW1wbGF0ZU5vRGF0YSkge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlTm9EYXRhXCIgLz5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIGFic29sdXRlIGxlZnQtMCB0b3AtMCB6LVsxXVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBzaHJpbmstMFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiJ25vLWRhdGEnIHwgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB8IGFzeW5jOyBpbnB1dHM6IHsgc2l6ZTogNjQgfVwiIC8+XG4gICAgICAgICAgQGxldCBjb25zdEh0bWxUZXh0Tm9EYXRhID0gbm9EYXRhQ29uZmlnKCkudGV4dE5vRGF0YSB8fCAnaTE4bl9ub19kYXRhX3lldCc7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLXRhYmxlLW5vLWRhdGEtY29uZmlnLXRleHRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwibm9EYXRhQ29uZmlnKCkubmdTdHlsZSB8fCB7fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJub0RhdGFDb25maWcoKS5uZ0NsYXNzIHx8IHt9XCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uc3RIdG1sVGV4dE5vRGF0YSB8IHRyYW5zbGF0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==