@libs-ui/components-tags 0.2.159 → 0.2.160

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.
@@ -25,7 +25,6 @@ export class LibsUiComponentsTagsComponent {
25
25
  positionList = signal(undefined);
26
26
  keysSelected = signal([]);
27
27
  disableWhenMaxItem = signal(false);
28
- itemChangeUnSelect = signal(undefined);
29
28
  focus = signal(false);
30
29
  error = signal(undefined);
31
30
  fieldKey = signal('id');
@@ -278,10 +277,15 @@ export class LibsUiComponentsTagsComponent {
278
277
  event.stopPropagation();
279
278
  this.flagMouse.set({ isMouseEnter: true, isMouseEnterContent: true });
280
279
  this.timeOutFlag.set(setTimeout(() => this.flagMouse.set({ isMouseEnter: false, isMouseEnterContent: false }), 250));
281
- this.itemsSelected.update(items => items.filter(item => ((isNil(get(itemRemove, this.fieldKey())) || isNil(get(item, this.fieldKey()))) && get(itemRemove, 'fieldLabel').trim() !== item.fieldLabel.trim() || (!isNil(get(itemRemove, this.fieldKey())) && !isNil(get(item, this.fieldKey())) && get(itemRemove, this.fieldKey()) !== get(item, this.fieldKey())))));
282
- this.itemChangeUnSelect.set(itemRemove);
280
+ this.itemsSelected.update(items => items.filter(item => {
281
+ const keyRemove = get(itemRemove, this.fieldKey());
282
+ const keyItem = get(item, this.fieldKey());
283
+ const labelRemove = get(itemRemove, 'fieldLabel').trim();
284
+ const labelItem = get(item, 'fieldLabel').trim();
285
+ return (isNil(keyRemove) || isNil(keyItem)) && labelRemove !== labelItem || (!isNil(keyRemove) && !isNil(keyItem) && keyRemove !== keyItem);
286
+ }));
283
287
  if (itemRemove && !isNil(get(itemRemove, this.fieldKey())) && `${get(itemRemove, this.fieldKey())}`.search(this.fakeId()) >= 0) {
284
- this.keysHiddenItem.update(items => ([...items || [], get(itemRemove, this.fieldKey())]));
288
+ this.keysHiddenItem.update(items => (Array.from(new Set([...items || [], get(itemRemove, this.fieldKey())]))));
285
289
  }
286
290
  this.keysSelected.set(Array.from(new Set(this.itemsSelected().map(item => get(item, `ref.${this.fieldKey()}`)))));
287
291
  this.disableWhenMaxItem.set(false);
@@ -360,7 +364,6 @@ export class LibsUiComponentsTagsComponent {
360
364
  this.listFunctionControl()?.updateData({ newData: signal([signal(newItem)]), functionCustomAddDataToStore: (newData, store) => store.update(value => ([...newData(), ...value])) });
361
365
  }
362
366
  this.processData([newItem]);
363
- this.itemChangeUnSelect.set(newItem);
364
367
  this.handlerValueChangeSearch('');
365
368
  }
366
369
  return;
@@ -369,7 +372,6 @@ export class LibsUiComponentsTagsComponent {
369
372
  return;
370
373
  }
371
374
  this.processData([itemExits.item]);
372
- this.itemChangeUnSelect.set(itemExits.item);
373
375
  this.handlerValueChangeSearch('');
374
376
  }
375
377
  async handlerValueChangeSearch(value) {
@@ -711,7 +713,7 @@ export class LibsUiComponentsTagsComponent {
711
713
  this.keySearchChangeSub()?.unsubscribe();
712
714
  }
713
715
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTagsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
714
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsTagsComponent, isStandalone: true, selector: "libs_ui-components-tags", inputs: { classIncludePopover: { classPropertyName: "classIncludePopover", publicName: "classIncludePopover", isSignal: true, isRequired: false, transformFunction: null }, enterAutoAddTagToList: { classPropertyName: "enterAutoAddTagToList", publicName: "enterAutoAddTagToList", isSignal: true, isRequired: false, transformFunction: null }, checkExitIsLabelInclude: { classPropertyName: "checkExitIsLabelInclude", publicName: "checkExitIsLabelInclude", isSignal: true, isRequired: false, transformFunction: null }, checkExitByFields: { classPropertyName: "checkExitByFields", publicName: "checkExitByFields", isSignal: true, isRequired: false, transformFunction: null }, parentBorderWidth: { classPropertyName: "parentBorderWidth", publicName: "parentBorderWidth", isSignal: true, isRequired: false, transformFunction: null }, functionCheckPermissionCreateTag: { classPropertyName: "functionCheckPermissionCreateTag", publicName: "functionCheckPermissionCreateTag", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDetailItemByIds: { classPropertyName: "httpRequestDetailItemByIds", publicName: "httpRequestDetailItemByIds", isSignal: true, isRequired: false, transformFunction: null }, fieldLabel: { classPropertyName: "fieldLabel", publicName: "fieldLabel", isSignal: true, isRequired: false, transformFunction: null }, maxItemInput: { classPropertyName: "maxItemInput", publicName: "maxItemInput", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, defaultItemsSelected: { classPropertyName: "defaultItemsSelected", publicName: "defaultItemsSelected", isSignal: true, isRequired: false, transformFunction: null }, defaultKeysSelected: { classPropertyName: "defaultKeysSelected", publicName: "defaultKeysSelected", isSignal: true, isRequired: false, transformFunction: null }, listSearchConfig: { classPropertyName: "listSearchConfig", publicName: "listSearchConfig", isSignal: true, isRequired: false, transformFunction: null }, isSearchOnline: { classPropertyName: "isSearchOnline", publicName: "isSearchOnline", isSignal: true, isRequired: false, transformFunction: null }, listSearchPadding: { classPropertyName: "listSearchPadding", publicName: "listSearchPadding", isSignal: true, isRequired: false, transformFunction: null }, listDividerClassInclude: { classPropertyName: "listDividerClassInclude", publicName: "listDividerClassInclude", isSignal: true, isRequired: false, transformFunction: null }, listConfig: { classPropertyName: "listConfig", publicName: "listConfig", isSignal: true, isRequired: false, transformFunction: null }, listButtonsOther: { classPropertyName: "listButtonsOther", publicName: "listButtonsOther", isSignal: true, isRequired: false, transformFunction: null }, listClickExactly: { classPropertyName: "listClickExactly", publicName: "listClickExactly", isSignal: true, isRequired: false, transformFunction: null }, listBackgroundListCustom: { classPropertyName: "listBackgroundListCustom", publicName: "listBackgroundListCustom", isSignal: true, isRequired: false, transformFunction: null }, listMaxItemShow: { classPropertyName: "listMaxItemShow", publicName: "listMaxItemShow", isSignal: true, isRequired: false, transformFunction: null }, listHiddenInputSearchWhenHasSearchConfig: { classPropertyName: "listHiddenInputSearchWhenHasSearchConfig", publicName: "listHiddenInputSearchWhenHasSearchConfig", isSignal: true, isRequired: false, transformFunction: null }, removeTextSearchWhenBlurInput: { classPropertyName: "removeTextSearchWhenBlurInput", publicName: "removeTextSearchWhenBlurInput", isSignal: true, isRequired: false, transformFunction: null }, keysHiddenItem: { classPropertyName: "keysHiddenItem", publicName: "keysHiddenItem", isSignal: true, isRequired: false, transformFunction: null }, keysDisableItem: { classPropertyName: "keysDisableItem", publicName: "keysDisableItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreEmitWhenSameDataSelected: { classPropertyName: "ignoreEmitWhenSameDataSelected", publicName: "ignoreEmitWhenSameDataSelected", isSignal: true, isRequired: false, transformFunction: null }, singleSelected: { classPropertyName: "singleSelected", publicName: "singleSelected", isSignal: true, isRequired: false, transformFunction: null }, classIncludeTagItem: { classPropertyName: "classIncludeTagItem", publicName: "classIncludeTagItem", isSignal: true, isRequired: false, transformFunction: null }, classIconRemoveTagItem: { classPropertyName: "classIconRemoveTagItem", publicName: "classIconRemoveTagItem", isSignal: true, isRequired: false, transformFunction: null }, showBorderActiveWhenFocusInput: { classPropertyName: "showBorderActiveWhenFocusInput", publicName: "showBorderActiveWhenFocusInput", isSignal: true, isRequired: false, transformFunction: null }, fieldGetImage: { classPropertyName: "fieldGetImage", publicName: "fieldGetImage", isSignal: true, isRequired: false, transformFunction: null }, imageSize: { classPropertyName: "imageSize", publicName: "imageSize", isSignal: true, isRequired: false, transformFunction: null }, fieldGetTextAvatar: { classPropertyName: "fieldGetTextAvatar", publicName: "fieldGetTextAvatar", isSignal: true, isRequired: false, transformFunction: null }, classAvatarInclude: { classPropertyName: "classAvatarInclude", publicName: "classAvatarInclude", isSignal: true, isRequired: false, transformFunction: null }, getLastTextAfterSpace: { classPropertyName: "getLastTextAfterSpace", publicName: "getLastTextAfterSpace", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMaxItemSelected: { classPropertyName: "validMaxItemSelected", publicName: "validMaxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null }, showListBellow: { classPropertyName: "showListBellow", publicName: "showListBellow", isSignal: true, isRequired: false, transformFunction: null }, hiddenInputWhenReadonly: { classPropertyName: "hiddenInputWhenReadonly", publicName: "hiddenInputWhenReadonly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keysHiddenItem: "keysHiddenItemChange", outSelectMultiItem: "outSelectMultiItem", outValidEvent: "outValidEvent", outFunctionsControl: "outFunctionsControl", outClickButtonOther: "outClickButtonOther", outShowListEvent: "outShowListEvent", outChangStageFlagMouse: "outChangStageFlagMouse", outLoadingGetDetailSelected: "outLoadingGetDetailSelected" }, viewQueries: [{ propertyName: "tagsEl", first: true, predicate: ["tagsEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable() || loading() || loadingDetail()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || loading() || loadingDetail()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleActive]=\"labelConfig.toggleDisable || disable() || loading() || loadingDetail()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n <libs_ui-components-popover class=\"w-full h-full\"\n [ignoreShowPopover]=\"disable() || readonly() || !!config()?.ignoreShowList || false\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [elementRefCustom]=\"tagsEl\"\n [mode]=\"!config()?.ignoreInput ? 'click' : 'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [flagMouse]=\"flagMouse()\"\n [config]=\"{\n animationConfig: config()?.animationConfig || {},\n zIndex: zIndex() || 1000,\n widthByParent: true,\n parentBorderWidth: parentBorderWidth() ?? 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: config()?.directionList || 'bottom',\n directionDistance: 2,\n template: !showListBellow() ? listViewEl : undefined,\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: 'rounded-[4px] ' + classIncludePopover() + ((!listConfig()?.ignoreShowDataWhenNotSearch || keySearch()) ? ' libs-ui-border-general' : ''),\n position: { mode: 'start', distance: 0 }\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outEventPopoverContent)=\"handlerPopoverContentEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n <div class=\"relative\"\n [class.cursor-pointer]=\"!disable() && !readonly()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.libs-ui-disable]=\"disable()\"\n [class.libs-ui-disable-background]=\"disable()\">\n @if (config()?.uiLikeDropdown) {\n <i class=\"flex text-[16px] absolute right-[16px] top-[8px] libs-ui-icon-move-right rotate-90 z-[1]\"\n [class.text-[#6a7383]]=\"!readonly() && !disable()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-disable]=\"disable()\">\n </i>\n }\n <div #tagsEl\n [class]=\"'libs-ui-tags ' + (config()?.classInclude || '') + (readonly() ? (config()?.classCustomWhenReadOnly || ' libs-ui-readonly') : '')\"\n [class.libs-ui-tags-not-popup]=\"(!showList() && !showBorderActiveWhenFocusInput()) || (!focus() && showBorderActiveWhenFocusInput())\"\n [class.libs-ui-tags-error]=\"!!error() && !config()?.ignoreShowError\"\n [class.!pr-[32px]]=\"config()?.uiLikeDropdown\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.libs-ui-disable-background]=\"disable()\"\n [class.libs-ui-border-primary-general]=\"focus() && showBorderActiveWhenFocusInput()\"\n LibsUiComponentsClickOutsideDirective\n (outOutside)=\"handlerClickOutside($event)\">\n @for (item of itemsSelected(); track item[fieldKey()]) {\n <div [ngStyle]=\"item?.bullet || item?.ngStyles\"\n [class]=\"classIncludeTagItem() || ''\"\n [class.libs-ui-tags-readonly]=\"item.disableItem\"\n [class.libs-ui-tags-item]=\"!item.disableItem\"\n [class.cursor-default]=\"disable() || readonly()\">\n @if (fieldGetImage(); as fieldGetImage) {\n <div class=\"flex items-center justify-center h-full\">\n <libs_ui-components-avatar [classInclude]=\"classAvatarInclude() || 'mr-[8px]'\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"item[fieldGetImage]\"\n [linkAvatarError]=\"config()?.linkImageError\"\n [idGenColor]=\"item[fieldGetTextAvatar()]\"\n [textAvatar]=\"item[fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\" />\n </div>\n }\n <span class=\"libs-ui-font-h6r\"\n [innerHtml]=\"(item.fieldLabel || ' ') | translate\">\n </span>\n @if (!disable() && !item.disableItem && !readonly()) {\n <div class=\"flex items-center justify-center ml-[8px]\">\n <i #iconCloseEl\n [attr.specificStyle]=\"!!(item?.bullet || item?.ngStyles)\"\n [class]=\"'flex text-[16px] ' + (classIconRemoveTagItem() || 'libs-ui-icon-close')\"\n [class.cursor-pointer]=\"!disable() && !loading() && !loadingDetail()\"\n [class.pointer-events-none]=\"disable() || loading() || loadingDetail()\"\n [ngStyle]=\"(item?.bullet || item?.ngStyles) | LibsUiComponentsTagsGetColorPipe:iconCloseEl\"\n (click)=\"handlerRemoveItemSelected($event,item)\"></i>\n </div>\n }\n </div>\n }\n @if (!singleSelected() || (singleSelected() && !itemsSelected().length)) {\n @if (!config()?.ignoreInput && !config()?.uiLikeDropdown && (!hiddenInputWhenReadonly() || (hiddenInputWhenReadonly() && !readonly()))) {\n <libs_ui-components-inputs-input class=\"grow\"\n [class.mb-[4px]]=\"itemsSelected().length\"\n [classInclude]=\"'w-full bg-transparent ' + (config()?.classInputInclude || 'px-[4px] min-w-[30px]')\"\n [defaultHeight]=\"24\"\n [placeholder]=\"readonly() ? '' : (placeholder() || 'i18n_import_content')\"\n [noBorder]=\"true\"\n [(value)]=\"valueInput\"\n [disable]=\"disable() || loading() || loadingDetail() || disableWhenMaxItem()\"\n [readonly]=\"readonly()\"\n (outEnterEvent)=\"handlerEnterEvent()\"\n (valueChange)=\"handlerValueChangeSearch($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurEvent($event)\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event)\" />\n }\n @if (config()?.ignoreInput && config()?.uiLikeDropdown && !itemsSelected().length) {\n <div class=\"flex items-center pb-[4px] pt-[2px] ml-[11px] libs-ui-font-h5r\"\n [class.text-[#9ca2ad]]=\"disable()\">\n {{ (placeholder() || 'i18n_select_value') | translate }}\n </div>\n }\n }\n </div>\n @if (error() && !config()?.ignoreShowError) {\n <div class=\"text-[#ee2d41] libs-ui-font-h7r mt-[8px]\">{{ (error()?.message || ' ') | translate:(error()?.interpolateParams || {}) }}</div>\n }\n </div>\n </libs_ui-components-popover>\n</div>\n@if (showListBellow()) {\n <ng-container *ngTemplateOutlet=\"listViewEl\"></ng-container>\n}\n<ng-template #listViewEl>\n @if (listConfig(); as listConfig) {\n <libs_ui-components-list [searchConfig]=\"listSearchConfig() || {classInclude: 'hidden', iconLeftClass: 'hidden'}\"\n [isSearchOnline]=\"isSearchOnline()\"\n [zIndex]=\"zIndex()\"\n [keySearch]=\"keySearch()\"\n [config]=\"listConfig\"\n [disable]=\"disable() || loadingDetail() || disableWhenMaxItem()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"listMaxItemShow() || 6\"\n [multiKeySelected]=\"keysSelected()\"\n [clickExactly]=\"false\"\n [keysHiddenItem]=\"keysHiddenItem()\"\n [keysDisableItem]=\"keysDisableItem()\"\n [dividerClassInclude]=\"listDividerClassInclude() ?? 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundListCustom()\"\n [itemChangeUnSelect]=\"itemChangeUnSelect()\"\n [functionGetItemsAutoAddList]=\"functionGetItemAutoAddList()\"\n [hiddenInputSearch]=\"listHiddenInputSearchWhenHasSearchConfig()\"\n (outFunctionsControl)=\"handlerFunctionControlList($event)\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoading($event)\" />\n }\n</ng-template>\n", styles: [".libs-ui-tags{position:relative;display:flex;flex-wrap:wrap;border:1px solid var(--libs-ui-color-default, #226FF5);max-height:100px;overflow:auto;border-radius:4px;padding:3px 0 0 4px;min-height:32px}.libs-ui-tags-not-popup{border:1px solid #E6E7EA}.libs-ui-tags-error{border-color:#ff5454}.libs-ui-tags .libs-ui-tags-item{display:flex;align-items:center;margin:0 4px 3px 0;padding:4px 8px;color:var(--libs-ui-color-default, #226FF5);border-radius:20px;background-color:var(--libs-ui-color-light-2, #E9F1FE);word-break:break-word!important;overflow-wrap:break-word!important;cursor:default}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-color-default, #226FF5)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:hover:before{background:var(--libs-ui-color-light-6, #D3E2FD)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:active:before{background:var(--libs-ui-color-light-5, #BDD4FC)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-tags-item-icon-default)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:hover:before{color:var(--libs-ui-tags-item-icon-hover);background:var(--libs-ui-tags-item-icon-background-hover)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:active:before{color:var(--libs-ui-tags-item-icon-active);background:var(--libs-ui-tags-item-icon-background-active)}.libs-ui-tags-disable{background:#f8f9fa;color:#9ca2ad}.libs-ui-tags-readonly{background:#f1ebfd;color:#7239ea;display:flex;align-items:center;margin:0 4px 4px 0;padding:4px 8px;border-radius:20px;word-break:break-word!important;overflow-wrap:break-word!important}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: LibsUiComponentsClickOutsideDirective, selector: "[LibsUiComponentsClickOutsideDirective]", outputs: ["outOutside", "outInSide"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "typeInput", "modeInput", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iframeTextareaCustomStyle", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["getLastTextAfterSpace", "typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "idGenColor", "textAvatar", "classImageInclude"], outputs: ["outAvatarError"] }, { kind: "component", type: LibsUiComponentsListComponent, selector: "libs_ui-components-list", inputs: ["hiddenInputSearch", "dropdownTabKeyActive", "keySearch", "itemChangeUnSelect", "paddingLeftItem", "config", "autoSelectedFirstItemCallOutsideBefore", "isSearchOnline", "disable", "disableLabel", "labelConfig", "searchConfig", "searchPadding", "dividerClassInclude", "hasDivider", "buttonsOther", "hasButtonUnSelectOption", "clickExactly", "backgroundListCustom", "maxItemShow", "keySelected", "multiKeySelected", "keysDisableItem", "keysHiddenItem", "focusInputSearch", "skipFocusInputWhenKeySearchStoreUndefined", "functionGetItemsAutoAddList", "validRequired", "showValidateBottom", "zIndex", "loadingIconSize", "templateRefSearchNoData", "resetKeyWhenSelectAllKeyDropdown", "ignoreClassDisableDefaultWhenUseKeysDisableItem"], outputs: ["outSelectKey", "outSelectMultiKey", "outUnSelectMultiKey", "outClickButtonOther", "outFieldKey", "outChangeView", "outKeySearch", "outLoading", "outFunctionsControl", "outChangStageFlagMousePopover", "outLoadItemsComplete"] }, { kind: "pipe", type: LibsUiComponentsTagsGetColorPipe, name: "LibsUiComponentsTagsGetColorPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
716
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsTagsComponent, isStandalone: true, selector: "libs_ui-components-tags", inputs: { classIncludePopover: { classPropertyName: "classIncludePopover", publicName: "classIncludePopover", isSignal: true, isRequired: false, transformFunction: null }, enterAutoAddTagToList: { classPropertyName: "enterAutoAddTagToList", publicName: "enterAutoAddTagToList", isSignal: true, isRequired: false, transformFunction: null }, checkExitIsLabelInclude: { classPropertyName: "checkExitIsLabelInclude", publicName: "checkExitIsLabelInclude", isSignal: true, isRequired: false, transformFunction: null }, checkExitByFields: { classPropertyName: "checkExitByFields", publicName: "checkExitByFields", isSignal: true, isRequired: false, transformFunction: null }, parentBorderWidth: { classPropertyName: "parentBorderWidth", publicName: "parentBorderWidth", isSignal: true, isRequired: false, transformFunction: null }, functionCheckPermissionCreateTag: { classPropertyName: "functionCheckPermissionCreateTag", publicName: "functionCheckPermissionCreateTag", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDetailItemByIds: { classPropertyName: "httpRequestDetailItemByIds", publicName: "httpRequestDetailItemByIds", isSignal: true, isRequired: false, transformFunction: null }, fieldLabel: { classPropertyName: "fieldLabel", publicName: "fieldLabel", isSignal: true, isRequired: false, transformFunction: null }, maxItemInput: { classPropertyName: "maxItemInput", publicName: "maxItemInput", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, defaultItemsSelected: { classPropertyName: "defaultItemsSelected", publicName: "defaultItemsSelected", isSignal: true, isRequired: false, transformFunction: null }, defaultKeysSelected: { classPropertyName: "defaultKeysSelected", publicName: "defaultKeysSelected", isSignal: true, isRequired: false, transformFunction: null }, listSearchConfig: { classPropertyName: "listSearchConfig", publicName: "listSearchConfig", isSignal: true, isRequired: false, transformFunction: null }, isSearchOnline: { classPropertyName: "isSearchOnline", publicName: "isSearchOnline", isSignal: true, isRequired: false, transformFunction: null }, listSearchPadding: { classPropertyName: "listSearchPadding", publicName: "listSearchPadding", isSignal: true, isRequired: false, transformFunction: null }, listDividerClassInclude: { classPropertyName: "listDividerClassInclude", publicName: "listDividerClassInclude", isSignal: true, isRequired: false, transformFunction: null }, listConfig: { classPropertyName: "listConfig", publicName: "listConfig", isSignal: true, isRequired: false, transformFunction: null }, listButtonsOther: { classPropertyName: "listButtonsOther", publicName: "listButtonsOther", isSignal: true, isRequired: false, transformFunction: null }, listClickExactly: { classPropertyName: "listClickExactly", publicName: "listClickExactly", isSignal: true, isRequired: false, transformFunction: null }, listBackgroundListCustom: { classPropertyName: "listBackgroundListCustom", publicName: "listBackgroundListCustom", isSignal: true, isRequired: false, transformFunction: null }, listMaxItemShow: { classPropertyName: "listMaxItemShow", publicName: "listMaxItemShow", isSignal: true, isRequired: false, transformFunction: null }, listHiddenInputSearchWhenHasSearchConfig: { classPropertyName: "listHiddenInputSearchWhenHasSearchConfig", publicName: "listHiddenInputSearchWhenHasSearchConfig", isSignal: true, isRequired: false, transformFunction: null }, removeTextSearchWhenBlurInput: { classPropertyName: "removeTextSearchWhenBlurInput", publicName: "removeTextSearchWhenBlurInput", isSignal: true, isRequired: false, transformFunction: null }, keysHiddenItem: { classPropertyName: "keysHiddenItem", publicName: "keysHiddenItem", isSignal: true, isRequired: false, transformFunction: null }, keysDisableItem: { classPropertyName: "keysDisableItem", publicName: "keysDisableItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreEmitWhenSameDataSelected: { classPropertyName: "ignoreEmitWhenSameDataSelected", publicName: "ignoreEmitWhenSameDataSelected", isSignal: true, isRequired: false, transformFunction: null }, singleSelected: { classPropertyName: "singleSelected", publicName: "singleSelected", isSignal: true, isRequired: false, transformFunction: null }, classIncludeTagItem: { classPropertyName: "classIncludeTagItem", publicName: "classIncludeTagItem", isSignal: true, isRequired: false, transformFunction: null }, classIconRemoveTagItem: { classPropertyName: "classIconRemoveTagItem", publicName: "classIconRemoveTagItem", isSignal: true, isRequired: false, transformFunction: null }, showBorderActiveWhenFocusInput: { classPropertyName: "showBorderActiveWhenFocusInput", publicName: "showBorderActiveWhenFocusInput", isSignal: true, isRequired: false, transformFunction: null }, fieldGetImage: { classPropertyName: "fieldGetImage", publicName: "fieldGetImage", isSignal: true, isRequired: false, transformFunction: null }, imageSize: { classPropertyName: "imageSize", publicName: "imageSize", isSignal: true, isRequired: false, transformFunction: null }, fieldGetTextAvatar: { classPropertyName: "fieldGetTextAvatar", publicName: "fieldGetTextAvatar", isSignal: true, isRequired: false, transformFunction: null }, classAvatarInclude: { classPropertyName: "classAvatarInclude", publicName: "classAvatarInclude", isSignal: true, isRequired: false, transformFunction: null }, getLastTextAfterSpace: { classPropertyName: "getLastTextAfterSpace", publicName: "getLastTextAfterSpace", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMaxItemSelected: { classPropertyName: "validMaxItemSelected", publicName: "validMaxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null }, showListBellow: { classPropertyName: "showListBellow", publicName: "showListBellow", isSignal: true, isRequired: false, transformFunction: null }, hiddenInputWhenReadonly: { classPropertyName: "hiddenInputWhenReadonly", publicName: "hiddenInputWhenReadonly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keysHiddenItem: "keysHiddenItemChange", outSelectMultiItem: "outSelectMultiItem", outValidEvent: "outValidEvent", outFunctionsControl: "outFunctionsControl", outClickButtonOther: "outClickButtonOther", outShowListEvent: "outShowListEvent", outChangStageFlagMouse: "outChangStageFlagMouse", outLoadingGetDetailSelected: "outLoadingGetDetailSelected" }, viewQueries: [{ propertyName: "tagsEl", first: true, predicate: ["tagsEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable() || loading() || loadingDetail()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || loading() || loadingDetail()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleActive]=\"labelConfig.toggleDisable || disable() || loading() || loadingDetail()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n <libs_ui-components-popover class=\"w-full h-full\"\n [ignoreShowPopover]=\"disable() || readonly() || !!config()?.ignoreShowList || false\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [elementRefCustom]=\"tagsEl\"\n [mode]=\"!config()?.ignoreInput ? 'click' : 'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [flagMouse]=\"flagMouse()\"\n [config]=\"{\n animationConfig: config()?.animationConfig || {},\n zIndex: zIndex() || 1000,\n widthByParent: true,\n parentBorderWidth: parentBorderWidth() ?? 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: config()?.directionList || 'bottom',\n directionDistance: 2,\n template: !showListBellow() ? listViewEl : undefined,\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: 'rounded-[4px] ' + classIncludePopover() + ((!listConfig()?.ignoreShowDataWhenNotSearch || keySearch()) ? ' libs-ui-border-general' : ''),\n position: { mode: 'start', distance: 0 }\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outEventPopoverContent)=\"handlerPopoverContentEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n <div class=\"relative\"\n [class.cursor-pointer]=\"!disable() && !readonly()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.libs-ui-disable]=\"disable()\"\n [class.libs-ui-disable-background]=\"disable()\">\n @if (config()?.uiLikeDropdown) {\n <i class=\"flex text-[16px] absolute right-[16px] top-[8px] libs-ui-icon-move-right rotate-90 z-[1]\"\n [class.text-[#6a7383]]=\"!readonly() && !disable()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-disable]=\"disable()\">\n </i>\n }\n <div #tagsEl\n [class]=\"'libs-ui-tags ' + (config()?.classInclude || '') + (readonly() ? (config()?.classCustomWhenReadOnly || ' libs-ui-readonly') : '')\"\n [class.libs-ui-tags-not-popup]=\"(!showList() && !showBorderActiveWhenFocusInput()) || (!focus() && showBorderActiveWhenFocusInput())\"\n [class.libs-ui-tags-error]=\"!!error() && !config()?.ignoreShowError\"\n [class.!pr-[32px]]=\"config()?.uiLikeDropdown\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.libs-ui-disable-background]=\"disable()\"\n [class.libs-ui-border-primary-general]=\"focus() && showBorderActiveWhenFocusInput()\"\n LibsUiComponentsClickOutsideDirective\n (outOutside)=\"handlerClickOutside($event)\">\n @for (item of itemsSelected(); track item[fieldKey()]) {\n <div [ngStyle]=\"item?.bullet || item?.ngStyles\"\n [class]=\"classIncludeTagItem() || ''\"\n [class.libs-ui-tags-readonly]=\"item.disableItem\"\n [class.libs-ui-tags-item]=\"!item.disableItem\"\n [class.cursor-default]=\"disable() || readonly()\">\n @if (fieldGetImage(); as fieldGetImage) {\n <div class=\"flex items-center justify-center h-full\">\n <libs_ui-components-avatar [classInclude]=\"classAvatarInclude() || 'mr-[8px]'\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"item[fieldGetImage]\"\n [linkAvatarError]=\"config()?.linkImageError\"\n [idGenColor]=\"item[fieldGetTextAvatar()]\"\n [textAvatar]=\"item[fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\" />\n </div>\n }\n <span class=\"libs-ui-font-h6r\"\n [innerHtml]=\"(item.fieldLabel || ' ') | translate\">\n </span>\n @if (!disable() && !item.disableItem && !readonly()) {\n <div class=\"flex items-center justify-center ml-[8px]\">\n <i #iconCloseEl\n [attr.specificStyle]=\"!!(item?.bullet || item?.ngStyles)\"\n [class]=\"'flex text-[16px] ' + (classIconRemoveTagItem() || 'libs-ui-icon-close')\"\n [class.cursor-pointer]=\"!disable() && !loading() && !loadingDetail()\"\n [class.pointer-events-none]=\"disable() || loading() || loadingDetail()\"\n [ngStyle]=\"(item?.bullet || item?.ngStyles) | LibsUiComponentsTagsGetColorPipe:iconCloseEl\"\n (click)=\"handlerRemoveItemSelected($event,item)\"></i>\n </div>\n }\n </div>\n }\n @if (!singleSelected() || (singleSelected() && !itemsSelected().length)) {\n @if (!config()?.ignoreInput && !config()?.uiLikeDropdown && (!hiddenInputWhenReadonly() || (hiddenInputWhenReadonly() && !readonly()))) {\n <libs_ui-components-inputs-input class=\"grow\"\n [class.mb-[4px]]=\"itemsSelected().length\"\n [classInclude]=\"'w-full bg-transparent ' + (config()?.classInputInclude || 'px-[4px] min-w-[30px]')\"\n [defaultHeight]=\"24\"\n [placeholder]=\"readonly() ? '' : (placeholder() || 'i18n_import_content')\"\n [noBorder]=\"true\"\n [(value)]=\"valueInput\"\n [disable]=\"disable() || loading() || loadingDetail() || disableWhenMaxItem()\"\n [readonly]=\"readonly()\"\n (outEnterEvent)=\"handlerEnterEvent()\"\n (valueChange)=\"handlerValueChangeSearch($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurEvent($event)\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event)\" />\n }\n @if (config()?.ignoreInput && config()?.uiLikeDropdown && !itemsSelected().length) {\n <div class=\"flex items-center pb-[4px] pt-[2px] ml-[11px] libs-ui-font-h5r\"\n [class.text-[#9ca2ad]]=\"disable()\">\n {{ (placeholder() || 'i18n_select_value') | translate }}\n </div>\n }\n }\n </div>\n @if (error() && !config()?.ignoreShowError) {\n <div class=\"text-[#ee2d41] libs-ui-font-h7r mt-[8px]\">{{ (error()?.message || ' ') | translate:(error()?.interpolateParams || {}) }}</div>\n }\n </div>\n </libs_ui-components-popover>\n</div>\n@if (showListBellow()) {\n <ng-container *ngTemplateOutlet=\"listViewEl\"></ng-container>\n}\n<ng-template #listViewEl>\n @if (listConfig(); as listConfig) {\n <libs_ui-components-list [searchConfig]=\"listSearchConfig() || {classInclude: 'hidden', iconLeftClass: 'hidden'}\"\n [isSearchOnline]=\"isSearchOnline()\"\n [zIndex]=\"zIndex()\"\n [keySearch]=\"keySearch()\"\n [config]=\"listConfig\"\n [disable]=\"disable() || loadingDetail() || disableWhenMaxItem()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"listMaxItemShow() || 6\"\n [multiKeySelected]=\"keysSelected()\"\n [clickExactly]=\"false\"\n [keysHiddenItem]=\"keysHiddenItem()\"\n [keysDisableItem]=\"keysDisableItem()\"\n [dividerClassInclude]=\"listDividerClassInclude() ?? 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundListCustom()\"\n [functionGetItemsAutoAddList]=\"functionGetItemAutoAddList()\"\n [hiddenInputSearch]=\"listHiddenInputSearchWhenHasSearchConfig()\"\n (outFunctionsControl)=\"handlerFunctionControlList($event)\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoading($event)\" />\n }\n</ng-template>\n", styles: [".libs-ui-tags{position:relative;display:flex;flex-wrap:wrap;border:1px solid var(--libs-ui-color-default, #226FF5);max-height:100px;overflow:auto;border-radius:4px;padding:3px 0 0 4px;min-height:32px}.libs-ui-tags-not-popup{border:1px solid #E6E7EA}.libs-ui-tags-error{border-color:#ff5454}.libs-ui-tags .libs-ui-tags-item{display:flex;align-items:center;margin:0 4px 3px 0;padding:4px 8px;color:var(--libs-ui-color-default, #226FF5);border-radius:20px;background-color:var(--libs-ui-color-light-2, #E9F1FE);word-break:break-word!important;overflow-wrap:break-word!important;cursor:default}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-color-default, #226FF5)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:hover:before{background:var(--libs-ui-color-light-6, #D3E2FD)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:active:before{background:var(--libs-ui-color-light-5, #BDD4FC)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-tags-item-icon-default)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:hover:before{color:var(--libs-ui-tags-item-icon-hover);background:var(--libs-ui-tags-item-icon-background-hover)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:active:before{color:var(--libs-ui-tags-item-icon-active);background:var(--libs-ui-tags-item-icon-background-active)}.libs-ui-tags-disable{background:#f8f9fa;color:#9ca2ad}.libs-ui-tags-readonly{background:#f1ebfd;color:#7239ea;display:flex;align-items:center;margin:0 4px 4px 0;padding:4px 8px;border-radius:20px;word-break:break-word!important;overflow-wrap:break-word!important}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: LibsUiComponentsClickOutsideDirective, selector: "[LibsUiComponentsClickOutsideDirective]", outputs: ["outOutside", "outInSide"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "typeInput", "modeInput", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iframeTextareaCustomStyle", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["getLastTextAfterSpace", "typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "idGenColor", "textAvatar", "classImageInclude"], outputs: ["outAvatarError"] }, { kind: "component", type: LibsUiComponentsListComponent, selector: "libs_ui-components-list", inputs: ["hiddenInputSearch", "dropdownTabKeyActive", "keySearch", "paddingLeftItem", "config", "autoSelectedFirstItemCallOutsideBefore", "isSearchOnline", "disable", "disableLabel", "labelConfig", "searchConfig", "searchPadding", "dividerClassInclude", "hasDivider", "buttonsOther", "hasButtonUnSelectOption", "clickExactly", "backgroundListCustom", "maxItemShow", "keySelected", "multiKeySelected", "keysDisableItem", "keysHiddenItem", "focusInputSearch", "skipFocusInputWhenKeySearchStoreUndefined", "functionGetItemsAutoAddList", "validRequired", "showValidateBottom", "zIndex", "loadingIconSize", "templateRefSearchNoData", "resetKeyWhenSelectAllKeyDropdown", "ignoreClassDisableDefaultWhenUseKeysDisableItem"], outputs: ["outSelectKey", "outSelectMultiKey", "outUnSelectMultiKey", "outClickButtonOther", "outFieldKey", "outChangeView", "outKeySearch", "outLoading", "outFunctionsControl", "outChangStageFlagMousePopover", "outLoadItemsComplete"] }, { kind: "pipe", type: LibsUiComponentsTagsGetColorPipe, name: "LibsUiComponentsTagsGetColorPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
715
717
  }
716
718
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTagsComponent, decorators: [{
717
719
  type: Component,
@@ -720,6 +722,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
720
722
  LibsUiComponentsLabelComponent, LibsUiComponentsPopoverComponent,
721
723
  LibsUiComponentsInputsInputComponent, LibsUiComponentsAvatarComponent,
722
724
  LibsUiComponentsListComponent, LibsUiComponentsTagsGetColorPipe
723
- ], template: "<div class=\"flex flex-col w-full h-full\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable() || loading() || loadingDetail()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || loading() || loadingDetail()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleActive]=\"labelConfig.toggleDisable || disable() || loading() || loadingDetail()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n <libs_ui-components-popover class=\"w-full h-full\"\n [ignoreShowPopover]=\"disable() || readonly() || !!config()?.ignoreShowList || false\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [elementRefCustom]=\"tagsEl\"\n [mode]=\"!config()?.ignoreInput ? 'click' : 'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [flagMouse]=\"flagMouse()\"\n [config]=\"{\n animationConfig: config()?.animationConfig || {},\n zIndex: zIndex() || 1000,\n widthByParent: true,\n parentBorderWidth: parentBorderWidth() ?? 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: config()?.directionList || 'bottom',\n directionDistance: 2,\n template: !showListBellow() ? listViewEl : undefined,\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: 'rounded-[4px] ' + classIncludePopover() + ((!listConfig()?.ignoreShowDataWhenNotSearch || keySearch()) ? ' libs-ui-border-general' : ''),\n position: { mode: 'start', distance: 0 }\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outEventPopoverContent)=\"handlerPopoverContentEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n <div class=\"relative\"\n [class.cursor-pointer]=\"!disable() && !readonly()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.libs-ui-disable]=\"disable()\"\n [class.libs-ui-disable-background]=\"disable()\">\n @if (config()?.uiLikeDropdown) {\n <i class=\"flex text-[16px] absolute right-[16px] top-[8px] libs-ui-icon-move-right rotate-90 z-[1]\"\n [class.text-[#6a7383]]=\"!readonly() && !disable()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-disable]=\"disable()\">\n </i>\n }\n <div #tagsEl\n [class]=\"'libs-ui-tags ' + (config()?.classInclude || '') + (readonly() ? (config()?.classCustomWhenReadOnly || ' libs-ui-readonly') : '')\"\n [class.libs-ui-tags-not-popup]=\"(!showList() && !showBorderActiveWhenFocusInput()) || (!focus() && showBorderActiveWhenFocusInput())\"\n [class.libs-ui-tags-error]=\"!!error() && !config()?.ignoreShowError\"\n [class.!pr-[32px]]=\"config()?.uiLikeDropdown\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.libs-ui-disable-background]=\"disable()\"\n [class.libs-ui-border-primary-general]=\"focus() && showBorderActiveWhenFocusInput()\"\n LibsUiComponentsClickOutsideDirective\n (outOutside)=\"handlerClickOutside($event)\">\n @for (item of itemsSelected(); track item[fieldKey()]) {\n <div [ngStyle]=\"item?.bullet || item?.ngStyles\"\n [class]=\"classIncludeTagItem() || ''\"\n [class.libs-ui-tags-readonly]=\"item.disableItem\"\n [class.libs-ui-tags-item]=\"!item.disableItem\"\n [class.cursor-default]=\"disable() || readonly()\">\n @if (fieldGetImage(); as fieldGetImage) {\n <div class=\"flex items-center justify-center h-full\">\n <libs_ui-components-avatar [classInclude]=\"classAvatarInclude() || 'mr-[8px]'\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"item[fieldGetImage]\"\n [linkAvatarError]=\"config()?.linkImageError\"\n [idGenColor]=\"item[fieldGetTextAvatar()]\"\n [textAvatar]=\"item[fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\" />\n </div>\n }\n <span class=\"libs-ui-font-h6r\"\n [innerHtml]=\"(item.fieldLabel || ' ') | translate\">\n </span>\n @if (!disable() && !item.disableItem && !readonly()) {\n <div class=\"flex items-center justify-center ml-[8px]\">\n <i #iconCloseEl\n [attr.specificStyle]=\"!!(item?.bullet || item?.ngStyles)\"\n [class]=\"'flex text-[16px] ' + (classIconRemoveTagItem() || 'libs-ui-icon-close')\"\n [class.cursor-pointer]=\"!disable() && !loading() && !loadingDetail()\"\n [class.pointer-events-none]=\"disable() || loading() || loadingDetail()\"\n [ngStyle]=\"(item?.bullet || item?.ngStyles) | LibsUiComponentsTagsGetColorPipe:iconCloseEl\"\n (click)=\"handlerRemoveItemSelected($event,item)\"></i>\n </div>\n }\n </div>\n }\n @if (!singleSelected() || (singleSelected() && !itemsSelected().length)) {\n @if (!config()?.ignoreInput && !config()?.uiLikeDropdown && (!hiddenInputWhenReadonly() || (hiddenInputWhenReadonly() && !readonly()))) {\n <libs_ui-components-inputs-input class=\"grow\"\n [class.mb-[4px]]=\"itemsSelected().length\"\n [classInclude]=\"'w-full bg-transparent ' + (config()?.classInputInclude || 'px-[4px] min-w-[30px]')\"\n [defaultHeight]=\"24\"\n [placeholder]=\"readonly() ? '' : (placeholder() || 'i18n_import_content')\"\n [noBorder]=\"true\"\n [(value)]=\"valueInput\"\n [disable]=\"disable() || loading() || loadingDetail() || disableWhenMaxItem()\"\n [readonly]=\"readonly()\"\n (outEnterEvent)=\"handlerEnterEvent()\"\n (valueChange)=\"handlerValueChangeSearch($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurEvent($event)\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event)\" />\n }\n @if (config()?.ignoreInput && config()?.uiLikeDropdown && !itemsSelected().length) {\n <div class=\"flex items-center pb-[4px] pt-[2px] ml-[11px] libs-ui-font-h5r\"\n [class.text-[#9ca2ad]]=\"disable()\">\n {{ (placeholder() || 'i18n_select_value') | translate }}\n </div>\n }\n }\n </div>\n @if (error() && !config()?.ignoreShowError) {\n <div class=\"text-[#ee2d41] libs-ui-font-h7r mt-[8px]\">{{ (error()?.message || ' ') | translate:(error()?.interpolateParams || {}) }}</div>\n }\n </div>\n </libs_ui-components-popover>\n</div>\n@if (showListBellow()) {\n <ng-container *ngTemplateOutlet=\"listViewEl\"></ng-container>\n}\n<ng-template #listViewEl>\n @if (listConfig(); as listConfig) {\n <libs_ui-components-list [searchConfig]=\"listSearchConfig() || {classInclude: 'hidden', iconLeftClass: 'hidden'}\"\n [isSearchOnline]=\"isSearchOnline()\"\n [zIndex]=\"zIndex()\"\n [keySearch]=\"keySearch()\"\n [config]=\"listConfig\"\n [disable]=\"disable() || loadingDetail() || disableWhenMaxItem()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"listMaxItemShow() || 6\"\n [multiKeySelected]=\"keysSelected()\"\n [clickExactly]=\"false\"\n [keysHiddenItem]=\"keysHiddenItem()\"\n [keysDisableItem]=\"keysDisableItem()\"\n [dividerClassInclude]=\"listDividerClassInclude() ?? 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundListCustom()\"\n [itemChangeUnSelect]=\"itemChangeUnSelect()\"\n [functionGetItemsAutoAddList]=\"functionGetItemAutoAddList()\"\n [hiddenInputSearch]=\"listHiddenInputSearchWhenHasSearchConfig()\"\n (outFunctionsControl)=\"handlerFunctionControlList($event)\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoading($event)\" />\n }\n</ng-template>\n", styles: [".libs-ui-tags{position:relative;display:flex;flex-wrap:wrap;border:1px solid var(--libs-ui-color-default, #226FF5);max-height:100px;overflow:auto;border-radius:4px;padding:3px 0 0 4px;min-height:32px}.libs-ui-tags-not-popup{border:1px solid #E6E7EA}.libs-ui-tags-error{border-color:#ff5454}.libs-ui-tags .libs-ui-tags-item{display:flex;align-items:center;margin:0 4px 3px 0;padding:4px 8px;color:var(--libs-ui-color-default, #226FF5);border-radius:20px;background-color:var(--libs-ui-color-light-2, #E9F1FE);word-break:break-word!important;overflow-wrap:break-word!important;cursor:default}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-color-default, #226FF5)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:hover:before{background:var(--libs-ui-color-light-6, #D3E2FD)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:active:before{background:var(--libs-ui-color-light-5, #BDD4FC)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-tags-item-icon-default)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:hover:before{color:var(--libs-ui-tags-item-icon-hover);background:var(--libs-ui-tags-item-icon-background-hover)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:active:before{color:var(--libs-ui-tags-item-icon-active);background:var(--libs-ui-tags-item-icon-background-active)}.libs-ui-tags-disable{background:#f8f9fa;color:#9ca2ad}.libs-ui-tags-readonly{background:#f1ebfd;color:#7239ea;display:flex;align-items:center;margin:0 4px 4px 0;padding:4px 8px;border-radius:20px;word-break:break-word!important;overflow-wrap:break-word!important}\n"] }]
725
+ ], template: "<div class=\"flex flex-col w-full h-full\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable() || loading() || loadingDetail()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || loading() || loadingDetail()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleActive]=\"labelConfig.toggleDisable || disable() || loading() || loadingDetail()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n <libs_ui-components-popover class=\"w-full h-full\"\n [ignoreShowPopover]=\"disable() || readonly() || !!config()?.ignoreShowList || false\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [elementRefCustom]=\"tagsEl\"\n [mode]=\"!config()?.ignoreInput ? 'click' : 'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [flagMouse]=\"flagMouse()\"\n [config]=\"{\n animationConfig: config()?.animationConfig || {},\n zIndex: zIndex() || 1000,\n widthByParent: true,\n parentBorderWidth: parentBorderWidth() ?? 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: config()?.directionList || 'bottom',\n directionDistance: 2,\n template: !showListBellow() ? listViewEl : undefined,\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: 'rounded-[4px] ' + classIncludePopover() + ((!listConfig()?.ignoreShowDataWhenNotSearch || keySearch()) ? ' libs-ui-border-general' : ''),\n position: { mode: 'start', distance: 0 }\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outEventPopoverContent)=\"handlerPopoverContentEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n <div class=\"relative\"\n [class.cursor-pointer]=\"!disable() && !readonly()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.libs-ui-disable]=\"disable()\"\n [class.libs-ui-disable-background]=\"disable()\">\n @if (config()?.uiLikeDropdown) {\n <i class=\"flex text-[16px] absolute right-[16px] top-[8px] libs-ui-icon-move-right rotate-90 z-[1]\"\n [class.text-[#6a7383]]=\"!readonly() && !disable()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-disable]=\"disable()\">\n </i>\n }\n <div #tagsEl\n [class]=\"'libs-ui-tags ' + (config()?.classInclude || '') + (readonly() ? (config()?.classCustomWhenReadOnly || ' libs-ui-readonly') : '')\"\n [class.libs-ui-tags-not-popup]=\"(!showList() && !showBorderActiveWhenFocusInput()) || (!focus() && showBorderActiveWhenFocusInput())\"\n [class.libs-ui-tags-error]=\"!!error() && !config()?.ignoreShowError\"\n [class.!pr-[32px]]=\"config()?.uiLikeDropdown\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.libs-ui-disable-background]=\"disable()\"\n [class.libs-ui-border-primary-general]=\"focus() && showBorderActiveWhenFocusInput()\"\n LibsUiComponentsClickOutsideDirective\n (outOutside)=\"handlerClickOutside($event)\">\n @for (item of itemsSelected(); track item[fieldKey()]) {\n <div [ngStyle]=\"item?.bullet || item?.ngStyles\"\n [class]=\"classIncludeTagItem() || ''\"\n [class.libs-ui-tags-readonly]=\"item.disableItem\"\n [class.libs-ui-tags-item]=\"!item.disableItem\"\n [class.cursor-default]=\"disable() || readonly()\">\n @if (fieldGetImage(); as fieldGetImage) {\n <div class=\"flex items-center justify-center h-full\">\n <libs_ui-components-avatar [classInclude]=\"classAvatarInclude() || 'mr-[8px]'\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"item[fieldGetImage]\"\n [linkAvatarError]=\"config()?.linkImageError\"\n [idGenColor]=\"item[fieldGetTextAvatar()]\"\n [textAvatar]=\"item[fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\" />\n </div>\n }\n <span class=\"libs-ui-font-h6r\"\n [innerHtml]=\"(item.fieldLabel || ' ') | translate\">\n </span>\n @if (!disable() && !item.disableItem && !readonly()) {\n <div class=\"flex items-center justify-center ml-[8px]\">\n <i #iconCloseEl\n [attr.specificStyle]=\"!!(item?.bullet || item?.ngStyles)\"\n [class]=\"'flex text-[16px] ' + (classIconRemoveTagItem() || 'libs-ui-icon-close')\"\n [class.cursor-pointer]=\"!disable() && !loading() && !loadingDetail()\"\n [class.pointer-events-none]=\"disable() || loading() || loadingDetail()\"\n [ngStyle]=\"(item?.bullet || item?.ngStyles) | LibsUiComponentsTagsGetColorPipe:iconCloseEl\"\n (click)=\"handlerRemoveItemSelected($event,item)\"></i>\n </div>\n }\n </div>\n }\n @if (!singleSelected() || (singleSelected() && !itemsSelected().length)) {\n @if (!config()?.ignoreInput && !config()?.uiLikeDropdown && (!hiddenInputWhenReadonly() || (hiddenInputWhenReadonly() && !readonly()))) {\n <libs_ui-components-inputs-input class=\"grow\"\n [class.mb-[4px]]=\"itemsSelected().length\"\n [classInclude]=\"'w-full bg-transparent ' + (config()?.classInputInclude || 'px-[4px] min-w-[30px]')\"\n [defaultHeight]=\"24\"\n [placeholder]=\"readonly() ? '' : (placeholder() || 'i18n_import_content')\"\n [noBorder]=\"true\"\n [(value)]=\"valueInput\"\n [disable]=\"disable() || loading() || loadingDetail() || disableWhenMaxItem()\"\n [readonly]=\"readonly()\"\n (outEnterEvent)=\"handlerEnterEvent()\"\n (valueChange)=\"handlerValueChangeSearch($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurEvent($event)\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event)\" />\n }\n @if (config()?.ignoreInput && config()?.uiLikeDropdown && !itemsSelected().length) {\n <div class=\"flex items-center pb-[4px] pt-[2px] ml-[11px] libs-ui-font-h5r\"\n [class.text-[#9ca2ad]]=\"disable()\">\n {{ (placeholder() || 'i18n_select_value') | translate }}\n </div>\n }\n }\n </div>\n @if (error() && !config()?.ignoreShowError) {\n <div class=\"text-[#ee2d41] libs-ui-font-h7r mt-[8px]\">{{ (error()?.message || ' ') | translate:(error()?.interpolateParams || {}) }}</div>\n }\n </div>\n </libs_ui-components-popover>\n</div>\n@if (showListBellow()) {\n <ng-container *ngTemplateOutlet=\"listViewEl\"></ng-container>\n}\n<ng-template #listViewEl>\n @if (listConfig(); as listConfig) {\n <libs_ui-components-list [searchConfig]=\"listSearchConfig() || {classInclude: 'hidden', iconLeftClass: 'hidden'}\"\n [isSearchOnline]=\"isSearchOnline()\"\n [zIndex]=\"zIndex()\"\n [keySearch]=\"keySearch()\"\n [config]=\"listConfig\"\n [disable]=\"disable() || loadingDetail() || disableWhenMaxItem()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"listMaxItemShow() || 6\"\n [multiKeySelected]=\"keysSelected()\"\n [clickExactly]=\"false\"\n [keysHiddenItem]=\"keysHiddenItem()\"\n [keysDisableItem]=\"keysDisableItem()\"\n [dividerClassInclude]=\"listDividerClassInclude() ?? 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundListCustom()\"\n [functionGetItemsAutoAddList]=\"functionGetItemAutoAddList()\"\n [hiddenInputSearch]=\"listHiddenInputSearchWhenHasSearchConfig()\"\n (outFunctionsControl)=\"handlerFunctionControlList($event)\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoading($event)\" />\n }\n</ng-template>\n", styles: [".libs-ui-tags{position:relative;display:flex;flex-wrap:wrap;border:1px solid var(--libs-ui-color-default, #226FF5);max-height:100px;overflow:auto;border-radius:4px;padding:3px 0 0 4px;min-height:32px}.libs-ui-tags-not-popup{border:1px solid #E6E7EA}.libs-ui-tags-error{border-color:#ff5454}.libs-ui-tags .libs-ui-tags-item{display:flex;align-items:center;margin:0 4px 3px 0;padding:4px 8px;color:var(--libs-ui-color-default, #226FF5);border-radius:20px;background-color:var(--libs-ui-color-light-2, #E9F1FE);word-break:break-word!important;overflow-wrap:break-word!important;cursor:default}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-color-default, #226FF5)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:hover:before{background:var(--libs-ui-color-light-6, #D3E2FD)}.libs-ui-tags .libs-ui-tags-item i[class*=libs-ui-icon-]:active:before{background:var(--libs-ui-color-light-5, #BDD4FC)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]{border-radius:50%}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:before{border-radius:50%;font-size:16px;color:var(--libs-ui-tags-item-icon-default)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:hover:before{color:var(--libs-ui-tags-item-icon-hover);background:var(--libs-ui-tags-item-icon-background-hover)}.libs-ui-tags .libs-ui-tags-item [specificStyle=true] i[class*=libs-ui-icon-]:active:before{color:var(--libs-ui-tags-item-icon-active);background:var(--libs-ui-tags-item-icon-background-active)}.libs-ui-tags-disable{background:#f8f9fa;color:#9ca2ad}.libs-ui-tags-readonly{background:#f1ebfd;color:#7239ea;display:flex;align-items:center;margin:0 4px 4px 0;padding:4px 8px;border-radius:20px;word-break:break-word!important;overflow-wrap:break-word!important}\n"] }]
724
726
  }], ctorParameters: () => [] });
725
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFncy9zcmMvdGFncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFncy9zcmMvdGFncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEwsT0FBTyxFQUFFLCtCQUErQixFQUEyQixNQUFNLDRCQUE0QixDQUFDO0FBR3RHLE9BQU8sRUFBa0Qsb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUd4SSxPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQXVGLDZCQUE2QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDakwsT0FBTyxFQUE0QyxnQ0FBZ0MsRUFBOEMsTUFBTSw2QkFBNkIsQ0FBQztBQUVySyxPQUFPLEVBQXNCLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUYsT0FBTyxFQUFFLFNBQVMsRUFBRSx5QkFBeUIsRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEIsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUosT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVB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QUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyVyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENB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R0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsS0FBSyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNlLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbkQsQ0FBQztRQUNELFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFLENB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QkFDUCxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLHFDQUFxQzt3QkFDakYsOEJBQThCLEVBQUUsZ0NBQWdDO3dCQUNoRSxvQ0FBb0MsRUFBRSwrQkFBK0I7d0JBQ3JFLDZCQUE2QixFQUFFLGdDQUFnQztxQkFDaEUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LCBUWVBFX1NJWkVfQVZBVEFSX0NPTkZJRyB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYXZhdGFyJztcbmltcG9ydCB7IElCdXR0b24gfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElWYWxpZE1heEl0ZW1TZWxlY3RlZCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUZvY3VzQW5kQmx1ckV2ZW50LCBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c0lucHV0c0lucHV0Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtaW5wdXQnO1xuaW1wb3J0IHsgSUlucHV0U2VhcmNoQ29uZmlnIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtc2VhcmNoJztcbmltcG9ydCB7IElWYWxpZCwgSVZhbGlkUGF0dGVybiB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXZhbGlkJztcbmltcG9ydCB7IElMYWJlbCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1sYWJlbCc7XG5pbXBvcnQgeyBnZXRGaWVsZEtleUJ5VHlwZSwgSUxpc3RDb25maWdJdGVtLCBJTGlzdERhdGFFbWl0S2V5LCBJTGlzdERhdGFFbWl0TXVsdGlLZXksIElMaXN0RnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNMaXN0Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElGbGFnTW91c2UsIElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBUWVBFX1BPUE9WRVJfRElSRUNUSU9OLCBUWVBFX1BPUE9WRVJfRVZFTlQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgSUh0dHBSZXNwb25zZSB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgSUh0dHBSZXF1ZXN0Q29uZmlnLCBMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3QnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElELCBFUlJPUl9NRVNTQUdFX01BWF9WQUxJRCwgRVJST1JfTUVTU0FHRV9QQVRURU5fVkFMSUQsIGVzY2FwZUh0bWwsIGdldCwgaXNOaWwsIHNldCwgdXVpZCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSVRhZ3NDb25maWcsIElUYWdzRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvdGFncy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1RhZ3NHZXRDb2xvclBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1jb2xvci5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNDbGlja091dHNpZGVEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWNsaWNrLW91dHNpZGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtdGFncycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3RhZ3MuY29tcG9uZW50LnNjc3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCwgTmdTdHlsZSwgTGlic1VpQ29tcG9uZW50c0NsaWNrT3V0c2lkZURpcmVjdGl2ZSxcbiAgICBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNJbnB1dENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0F2YXRhckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1RhZ3NHZXRDb2xvclBpcGVcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1RhZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLy8gI3JlZ2lvbiBQUk9QRVJUWVxuICBwcm90ZWN0ZWQgZmxhZ01vdXNlID0gc2lnbmFsPElGbGFnTW91c2U+KHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UgfSk7XG4gIHByb3RlY3RlZCBsb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmdEZXRhaWwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQga2V5U2VhcmNoID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgdmFsdWVJbnB1dCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJvdGVjdGVkIGl0ZW1zU2VsZWN0ZWQgPSBzaWduYWw8QXJyYXk8YW55Pj4oW10pO1xuICBwcm90ZWN0ZWQgc2hvd0xpc3QgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgcG9zaXRpb25MaXN0ID0gc2lnbmFsPFRZUEVfUE9QT1ZFUl9ESVJFQ1RJT04gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBrZXlzU2VsZWN0ZWQgPSBzaWduYWw8QXJyYXk8dW5rbm93bj4+KFtdKTtcbiAgcHJvdGVjdGVkIGRpc2FibGVXaGVuTWF4SXRlbSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBpdGVtQ2hhbmdlVW5TZWxlY3QgPSBzaWduYWw8dW5rbm93biB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGZvY3VzID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGVycm9yID0gc2lnbmFsPElWYWxpZCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGZpZWxkS2V5ID0gc2lnbmFsPHN0cmluZz4oJ2lkJyk7XG4gIHByb3RlY3RlZCBmdW5jdGlvbkdldEl0ZW1BdXRvQWRkTGlzdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZW50ZXJBdXRvQWRkVGFnVG9MaXN0KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHRoaXMuaXRlbXNTZWxlY3RlZCgpLmZpbHRlcihpdGVtID0+IGAke2dldChpdGVtLCB0aGlzLmZpZWxkS2V5KCksICcnKX1gLnNlYXJjaCh0aGlzLmZha2VJZCgpKSA9PT0gMCkucmV2ZXJzZSgpO1xuICB9KTtcblxuICBwcml2YXRlIGZha2VJZCA9IHNpZ25hbDxzdHJpbmc+KHV1aWQoKSk7XG4gIHByaXZhdGUgdGltZU91dEZsYWcgPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHRpbWVPdXRDaGFuZ2VTZWFyY2ggPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHRpbWVPdXRDaGVja1ZpZXdDaGFuZ2UgPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHRpbWVvdXRDbGlja091dHNpZGUgPSBzaWduYWw8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGNsaWVudEhlaWdodCA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgaXRlbXNPZkxpc3QgPSBzaWduYWw8QXJyYXk8dW5rbm93bj4+KFtdKTtcbiAgcHJpdmF0ZSBrZXlTZWFyY2hDaGFuZ2UgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByaXZhdGUga2V5U2VhcmNoQ2hhbmdlU3ViID0gc2lnbmFsPFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSB0ZW1wSWdub3JlRW1pdCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcG9wb3ZlckZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGlucHV0RnVuY3Rpb25Db250cm9sID0gc2lnbmFsPElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHR5cGVQb3BvdmVyID0gc2lnbmFsPFRZUEVfUE9QT1ZFUl9FVkVOVCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBsaXN0RnVuY3Rpb25Db250cm9sID0gc2lnbmFsPElMaXN0RnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgZGVmYXVsdEl0ZW1zU2VsZWN0ZWRDdXJyZW50ID0gc2lnbmFsPEFycmF5PHVua25vd24+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSBjbGFzc0luY2x1ZGVQb3BvdmVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBlbnRlckF1dG9BZGRUYWdUb0xpc3QgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGNoZWNrRXhpdElzTGFiZWxJbmNsdWRlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2hlY2tFeGl0QnlGaWVsZHMgPSBpbnB1dDxBcnJheTxzdHJpbmc+PigpO1xuICByZWFkb25seSBwYXJlbnRCb3JkZXJXaWR0aCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgZnVuY3Rpb25DaGVja1Blcm1pc3Npb25DcmVhdGVUYWcgPSBpbnB1dDwoKSA9PiBib29sZWFuPigoKSA9PiB0cnVlKTtcbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBmaWVsZExhYmVsID0gaW5wdXQ8c3RyaW5nPignbGFiZWwnKTtcbiAgcmVhZG9ubHkgbWF4SXRlbUlucHV0ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0PElUYWdzQ29uZmlnPigpO1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsYWJlbENvbmZpZyA9IGlucHV0PElMYWJlbD4oKTtcbiAgcmVhZG9ubHkgZGVmYXVsdEl0ZW1zU2VsZWN0ZWQgPSBpbnB1dDxBcnJheTx1bmtub3duPj4oKTtcbiAgcmVhZG9ubHkgZGVmYXVsdEtleXNTZWxlY3RlZCA9IGlucHV0PEFycmF5PHVua25vd24+PigpO1xuICByZWFkb25seSBsaXN0U2VhcmNoQ29uZmlnID0gaW5wdXQ8SUlucHV0U2VhcmNoQ29uZmlnPigpO1xuICByZWFkb25seSBpc1NlYXJjaE9ubGluZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbGlzdFNlYXJjaFBhZGRpbmcgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0RGl2aWRlckNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGlzdENvbmZpZyA9IGlucHV0PElMaXN0Q29uZmlnSXRlbT4oKTtcbiAgcmVhZG9ubHkgbGlzdEJ1dHRvbnNPdGhlciA9IGlucHV0PEFycmF5PElCdXR0b24+PigpO1xuICByZWFkb25seSBsaXN0Q2xpY2tFeGFjdGx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdEJhY2tncm91bmRMaXN0Q3VzdG9tID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsaXN0TWF4SXRlbVNob3cgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGxpc3RIaWRkZW5JbnB1dFNlYXJjaFdoZW5IYXNTZWFyY2hDb25maWcgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSByZW1vdmVUZXh0U2VhcmNoV2hlbkJsdXJJbnB1dCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBrZXlzSGlkZGVuSXRlbSA9IG1vZGVsPEFycmF5PHVua25vd24+PigpXG4gIHJlYWRvbmx5IGtleXNEaXNhYmxlSXRlbSA9IGlucHV0PEFycmF5PHVua25vd24+PigpXG4gIHJlYWRvbmx5IGlnbm9yZUVtaXRXaGVuU2FtZURhdGFTZWxlY3RlZCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHNpbmdsZVNlbGVjdGVkID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlVGFnSXRlbSA9IGlucHV0PHN0cmluZz4oKVxuICByZWFkb25seSBjbGFzc0ljb25SZW1vdmVUYWdJdGVtID0gaW5wdXQ8c3RyaW5nPigpXG4gIHJlYWRvbmx5IHNob3dCb3JkZXJBY3RpdmVXaGVuRm9jdXNJbnB1dCA9IGlucHV0PGJvb2xlYW4+KClcbiAgcmVhZG9ubHkgZmllbGRHZXRJbWFnZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaW1hZ2VTaXplID0gaW5wdXQ8VFlQRV9TSVpFX0FWQVRBUl9DT05GSUc+KDE2KTtcbiAgcmVhZG9ubHkgZmllbGRHZXRUZXh0QXZhdGFyID0gaW5wdXQ8c3RyaW5nPigndXNlcicpO1xuICByZWFkb25seSBjbGFzc0F2YXRhckluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGdldExhc3RUZXh0QWZ0ZXJTcGFjZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHZhbGlkUmVxdWlyZWQgPSBpbnB1dDxJVmFsaWQ+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWF4SXRlbVNlbGVjdGVkID0gaW5wdXQ8SVZhbGlkTWF4SXRlbVNlbGVjdGVkPigpO1xuICByZWFkb25seSB2YWxpZFBhdHRlcm4gPSBpbnB1dDxBcnJheTxJVmFsaWRQYXR0ZXJuPj4oKTtcbiAgcmVhZG9ubHkgc2hvd0xpc3RCZWxsb3cgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBoaWRkZW5JbnB1dFdoZW5SZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0U2VsZWN0TXVsdGlJdGVtID0gb3V0cHV0PEFycmF5PHVua25vd24+PigpO1xuICByZWFkb25seSBvdXRWYWxpZEV2ZW50ID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SVRhZ3NGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tCdXR0b25PdGhlciA9IG91dHB1dDxJQnV0dG9uPigpO1xuICByZWFkb25seSBvdXRTaG93TGlzdEV2ZW50ID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nU3RhZ2VGbGFnTW91c2UgPSBvdXRwdXQ8SUZsYWdNb3VzZT4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZGluZ0dldERldGFpbFNlbGVjdGVkID0gb3V0cHV0PGJvb2xlYW4+KCk7XG5cbiAgLyogVklFVyBDSElMRCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRhZ3NFbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPigndGFnc0VsJyk7XG5cbiAgLyogSU5KRUNUKi9cbiAgcHJpdmF0ZSBodHRwUmVxdWVzdFNlcnZpY2UgPSBpbmplY3QoTGlic1VpSHR0cFJlcXVlc3RTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgbWF4SXRlbUlucHV0ID0gdGhpcy5tYXhJdGVtSW5wdXQoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzYWJsZVdoZW5NYXhJdGVtLnNldChmYWxzZSk7XG4gICAgICAgIGlmIChtYXhJdGVtSW5wdXQgJiYgbWF4SXRlbUlucHV0IDw9IHRoaXMuaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZVdoZW5NYXhJdGVtLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBsaXN0Q29uZmlnID0gdGhpcy5saXN0Q29uZmlnKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAobGlzdENvbmZpZykge1xuICAgICAgICAgIHRoaXMuZmllbGRLZXkuc2V0KGdldEZpZWxkS2V5QnlUeXBlKGxpc3RDb25maWcsICdpZCcpKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJdGVtcyA9IHRoaXMuZGVmYXVsdEl0ZW1zU2VsZWN0ZWQoKSB8fCBbXTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbXMgPSB0aGlzLmRlZmF1bHRJdGVtc1NlbGVjdGVkQ3VycmVudCgpIHx8IFtdO1xuICAgICAgICB0aGlzLmRlZmF1bHRJdGVtc1NlbGVjdGVkQ3VycmVudC5zZXQodGhpcy5kZWZhdWx0SXRlbXNTZWxlY3RlZCgpKTtcbiAgICAgICAgaWYgKHByZXZpb3VzSXRlbXMubGVuZ3RoICE9PSBjdXJyZW50SXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJdGVtc1NlbGVjdGVkKGN1cnJlbnRJdGVtcyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcHJldkl0ZW0gb2YgcHJldmlvdXNJdGVtcykge1xuICAgICAgICAgIGlmICghY3VycmVudEl0ZW1zLnNvbWUoaXRlbSA9PiBnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpKSA9PT0gZ2V0KHByZXZJdGVtLCB0aGlzLmZpZWxkS2V5KCkpKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtc1NlbGVjdGVkKGN1cnJlbnRJdGVtcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5kZWZhdWx0S2V5c1NlbGVjdGVkKCkgfHwgW107XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5rZXlzU2VsZWN0ZWQoKSB8fCBbXTtcbiAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUubGVuZ3RoICE9PSBjdXJyZW50VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5nZXREZXRhaWxCeUlkcyhjdXJyZW50VmFsdWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlzTmV3ID0gY3VycmVudFZhbHVlLmZpbHRlcihrZXkgPT4gIXRoaXMuaXRlbXNTZWxlY3RlZCgpLnNvbWUoaXRlbSA9PiBnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpLCAnJykgPT09IGtleSkpO1xuICAgICAgICBpZiAoa2V5c05ldy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmdldERldGFpbEJ5SWRzKGtleXNOZXcpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMgPSB0aGlzLmh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzKCk7XG4gICAgaWYgKGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzICYmICghaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMuZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfHwgIWh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzLmd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlPy5kZXRhaWxCeUlkKSkge1xuICAgICAgdGhyb3cgJ0NvbmZpZyBnZXREZXRhaWxCeUlkcyB5w6p1IGPhuqd1IHThu5FpIHRoaeG7g3UgY8OhYyB0aGFtIHPhu5EgIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLCBkZXRhaWxCeUlkJztcbiAgICB9XG4gICAgY29uc3QgcHJlcHJvY2Vzc29yID0gKGtleXM6IEFycmF5PHVua25vd24+KSA9PiB7XG4gICAgICBpZiAoIWtleXMgfHwgIShrZXlzIGluc3RhbmNlb2YgQXJyYXkpIHx8ICFrZXlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5cy5qb2luKCc7Jyk7XG4gICAgfTtcbiAgICBpZiAoaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHM/Lmd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlPy5kZXRhaWxCeUlkKSB7XG4gICAgICBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcy5ndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5kZXRhaWxCeUlkLmZpZWxkR2V0VmFsdWUgPSBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcy5ndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5kZXRhaWxCeUlkLmZpZWxkR2V0VmFsdWUgPz8gJ2tleXMnO1xuICAgICAgaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMuZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuZGV0YWlsQnlJZC5wcmVwcm9jZXNzb3IgPSBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcy5ndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5kZXRhaWxCeUlkLnByZXByb2Nlc3NvciA/PyBwcmVwcm9jZXNzb3I7XG4gICAgfVxuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHtcbiAgICAgIGNoZWNrSXNWYWxpZDogdGhpcy5jaGVja1ZhbGlkLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVMaXN0OiBhc3luYyAoKSA9PiB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8ucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKSxcbiAgICAgIHVwZGF0ZUxhYmVsOiB0aGlzLnVwZGF0ZUxhYmVsLmJpbmQodGhpcyksXG4gICAgICBjbGVhckl0ZW1TZWxlY3RlZDogdGhpcy5jbGVhckl0ZW1TZWxlY3RlZC5iaW5kKHRoaXMpLFxuICAgICAgY2xlYXJLZXlTZWFyY2g6ICgpID0+IHRoaXMuaGFuZGxlclZhbHVlQ2hhbmdlU2VhcmNoKCcnKSxcbiAgICAgIGZvY3VzSW5wdXQ6ICgpID0+IHRoaXMuZm9jdXNJbnB1dCgpLFxuICAgICAgZ2V0RmFrZUlkOiBhc3luYyAoKSA9PiB0aGlzLmZha2VJZCgpLFxuICAgICAgY3JlYXRlVGFnOiB0aGlzLmhhbmRsZXJFbnRlckV2ZW50LmJpbmQodGhpcyksXG4gICAgICByZW1vdmVJdGVtU2VsZWN0ZWQ6IHRoaXMuaGFuZGxlclJlbW92ZUl0ZW1TZWxlY3RlZC5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRFcnJvcjogdGhpcy5yZXNldEVycm9yLmJpbmQodGhpcyksXG4gICAgICByZXNldFRvRGVmYXVsdERhdGFTZWxlY3RlZDogdGhpcy5yZXNldFRvRGVmYXVsdERhdGFTZWxlY3RlZC5iaW5kKHRoaXMpLFxuICAgICAgdXBkYXRlSXRlbVNlbGVjdGVkRGlzYWJsZTogdGhpcy51cGRhdGVJdGVtU2VsZWN0ZWREaXNhYmxlLmJpbmQodGhpcyksXG4gICAgICByZWZyZXNoTGlzdERhdGE6IHRoaXMucmVmcmVzaExpc3REYXRhLmJpbmQodGhpcyksXG4gICAgICBzZXRFcnJvcjogdGhpcy5zZXRFcnJvci5iaW5kKHRoaXMpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldEVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHRoaXMuZXJyb3Iuc2V0KHsgbWVzc2FnZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KGV2ZW50OiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sLnNldChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUxhYmVsKCkge1xuICAgIGlmICghdGhpcy5pdGVtc1NlbGVjdGVkKCkgfHwgIXRoaXMuaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB0aGlzLnVwZGF0ZUZpZWxkTGFiZWwoaXRlbSkpO1xuICAgICAgcmV0dXJuIFsuLi5pdGVtc11cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmllbGRMYWJlbChpdGVtOiB1bmtub3duKSB7XG4gICAgY29uc3QgcmVmID0gZ2V0KGl0ZW0sICdyZWYnKSB8fCBpdGVtO1xuICAgIGNvbnN0IGdldFZhbHVlID0gdGhpcy5jb25maWcoKT8uZ2V0VmFsdWU7XG4gICAgc2V0KGl0ZW0sICdmaWVsZExhYmVsJywgYCR7Z2V0KHJlZiwgdGhpcy5maWVsZExhYmVsKCkpIHx8IHJlZi5sYWJlbCB8fCByZWYubmFtZSB8fCAnICd9YCk7XG4gICAgaWYgKGdldFZhbHVlKSB7XG4gICAgICBzZXQoaXRlbSwgJ2ZpZWxkTGFiZWwnLCBnZXRWYWx1ZShyZWYpIHx8ICcgJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbGVhckl0ZW1TZWxlY3RlZChpZ25vcmVWYWxpZCA9IGZhbHNlKSB7XG4gICAgaWYgKCF0aGlzLml0ZW1zU2VsZWN0ZWQoKSB8fCAhdGhpcy5pdGVtc1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCAtIDE7XG4gICAgdGhpcy50ZW1wSWdub3JlRW1pdC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5pdGVtc1NlbGVjdGVkKCkuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMudGVtcElnbm9yZUVtaXQuc2V0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlclJlbW92ZUl0ZW1TZWxlY3RlZCh7IHN0b3BQcm9wYWdhdGlvbjogKCkgPT4geyByZXR1cm4gfSB9IGFzIEV2ZW50LCBpdGVtLCBpZ25vcmVWYWxpZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUl0ZW1zU2VsZWN0ZWQoaXRlbXNTZWxlY3RlZDogQXJyYXk8dW5rbm93bj4sIGlnbm9yZVZhbGlkYXRlID0gdHJ1ZSwgaWdub3JlRW1pdEtleVNlbGVjdGVkV2hlbkl0ZW1zTm90RXhpdHNFbXB0eT86IGJvb2xlYW4pIHtcbiAgICBpZiAoIWl0ZW1zU2VsZWN0ZWQgfHwgIWl0ZW1zU2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zTm90RXhpdHM6IEFycmF5PHVua25vd24+ID0gW107XG4gICAgaXRlbXNTZWxlY3RlZC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBmaWVsZExhYmVsID0gYCR7Z2V0KGl0ZW0sIHRoaXMuZmllbGRMYWJlbCgpKSB8fCBnZXQoaXRlbSwgJ2xhYmVsJykgfHwgZ2V0KGl0ZW0sICduYW1lJykgfHwgJyAnfWA7XG4gICAgICBjb25zdCBnZXRWYWx1ZSA9IHRoaXMuY29uZmlnKCk/LmdldFZhbHVlO1xuICAgICAgaWYgKGdldFZhbHVlKSB7XG4gICAgICAgIGZpZWxkTGFiZWwgPSBnZXRWYWx1ZShpdGVtKSB8fCAnICc7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtRXhpdHMgPSB0aGlzLmNoZWNrRXhpdHMoZmllbGRMYWJlbCwgZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpO1xuICAgICAgaWYgKGl0ZW1FeGl0cz8uaXNJdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihpdGVtRXhpdHMuaXRlbSwgaXRlbSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGl0ZW1zTm90RXhpdHMucHVzaChpdGVtKTtcbiAgICB9KTtcbiAgICB0aGlzLnByb2Nlc3NEYXRhKGl0ZW1zTm90RXhpdHMsIGlnbm9yZVZhbGlkYXRlLCBpZ25vcmVFbWl0S2V5U2VsZWN0ZWRXaGVuSXRlbXNOb3RFeGl0c0VtcHR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyUG9wb3ZlckV2ZW50KHR5cGU6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIHRoaXMudHlwZVBvcG92ZXIuc2V0KHR5cGUpO1xuICAgIGlmICh0eXBlID09PSAnY2xpY2snKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAncmVtb3ZlJykge1xuICAgICAgdGhpcy5zaG93TGlzdC5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5vdXRTaG93TGlzdEV2ZW50LmVtaXQoZmFsc2UpO1xuICAgICAgdGhpcy5pbnB1dEZ1bmN0aW9uQ29udHJvbCgpPy5ibHVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2hvd0xpc3Quc2V0KHRydWUpO1xuICAgIHRoaXMub3V0U2hvd0xpc3RFdmVudC5lbWl0KHRydWUpO1xuICAgIHRoaXMuaW5wdXRGdW5jdGlvbkNvbnRyb2woKT8uZm9jdXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyUG9wb3ZlckNvbnRlbnRFdmVudChwb3NpdGlvbjogVFlQRV9QT1BPVkVSX0RJUkVDVElPTikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uTGlzdCgpID09PSBwb3NpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBvc2l0aW9uTGlzdC5zZXQocG9zaXRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJSZW1vdmVJdGVtU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50LCBpdGVtUmVtb3ZlOiB1bmtub3duLCBpZ25vcmVWYWxpZD86IGJvb2xlYW4pIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmZsYWdNb3VzZS5zZXQoeyBpc01vdXNlRW50ZXI6IHRydWUsIGlzTW91c2VFbnRlckNvbnRlbnQ6IHRydWUgfSk7XG4gICAgdGhpcy50aW1lT3V0RmxhZy5zZXQoc2V0VGltZW91dCgoKSA9PiB0aGlzLmZsYWdNb3VzZS5zZXQoeyBpc01vdXNlRW50ZXI6IGZhbHNlLCBpc01vdXNlRW50ZXJDb250ZW50OiBmYWxzZSB9KSwgMjUwKSk7XG4gICAgdGhpcy5pdGVtc1NlbGVjdGVkLnVwZGF0ZShpdGVtcyA9PiBpdGVtcy5maWx0ZXIoaXRlbSA9PiAoKGlzTmlsKGdldChpdGVtUmVtb3ZlLCB0aGlzLmZpZWxkS2V5KCkpKSB8fCBpc05pbChnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpKSkpICYmIGdldChpdGVtUmVtb3ZlLCAnZmllbGRMYWJlbCcpLnRyaW0oKSAhPT0gaXRlbS5maWVsZExhYmVsLnRyaW0oKSB8fCAoIWlzTmlsKGdldChpdGVtUmVtb3ZlLCB0aGlzLmZpZWxkS2V5KCkpKSAmJiAhaXNOaWwoZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpICYmIGdldChpdGVtUmVtb3ZlLCB0aGlzLmZpZWxkS2V5KCkpICE9PSBnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpKSkpKSk7XG4gICAgdGhpcy5pdGVtQ2hhbmdlVW5TZWxlY3Quc2V0KGl0ZW1SZW1vdmUpO1xuICAgIGlmIChpdGVtUmVtb3ZlICYmICFpc05pbChnZXQoaXRlbVJlbW92ZSwgdGhpcy5maWVsZEtleSgpKSkgJiYgYCR7Z2V0KGl0ZW1SZW1vdmUsIHRoaXMuZmllbGRLZXkoKSl9YC5zZWFyY2godGhpcy5mYWtlSWQoKSkgPj0gMCkge1xuICAgICAgdGhpcy5rZXlzSGlkZGVuSXRlbS51cGRhdGUoaXRlbXMgPT4gKFsuLi5pdGVtcyB8fCBbXSwgZ2V0KGl0ZW1SZW1vdmUsIHRoaXMuZmllbGRLZXkoKSldKSk7XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5pdGVtc1NlbGVjdGVkKCkubWFwKGl0ZW0gPT4gZ2V0KGl0ZW0sIGByZWYuJHt0aGlzLmZpZWxkS2V5KCl9YCkpKSkpO1xuICAgIHRoaXMuZGlzYWJsZVdoZW5NYXhJdGVtLnNldChmYWxzZSk7XG4gICAgY29uc3QgbWF4SXRlbUlucHV0ID0gdGhpcy5tYXhJdGVtSW5wdXQoKTtcbiAgICBpZiAobWF4SXRlbUlucHV0ICYmIG1heEl0ZW1JbnB1dCA8PSB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZGlzYWJsZVdoZW5NYXhJdGVtLnNldCh0cnVlKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNob3dMaXN0KCkpIHtcbiAgICAgIHRoaXMub3V0U2VsZWN0TXVsdGlJdGVtLmVtaXQodGhpcy5nZXRJdGVtU2VsZWN0ZWQoKSk7XG4gICAgICB0aGlzLmNoZWNrVmlld0NoYW5nZSh0cnVlLCBpZ25vcmVWYWxpZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dMaXN0KCkpIHtcbiAgICAgIHRoaXMudGVtcElnbm9yZUVtaXQuc2V0KHRydWUpO1xuICAgIH1cbiAgICBpZiAoIWlnbm9yZVZhbGlkKSB7XG4gICAgICB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgICB9XG4gICAgdGhpcy50ZW1wSWdub3JlRW1pdC5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJJbnB1dEZ1bmN0aW9uQ29udHJvbChldmVudDogSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sLnNldChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZvY3VzQW5kQmx1ckV2ZW50KGV2ZW50OiBJRm9jdXNBbmRCbHVyRXZlbnQpIHtcbiAgICB0aGlzLmZvY3VzLnNldChmYWxzZSk7XG4gICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdmb2N1cycpIHtcbiAgICAgIHRoaXMuZm9jdXMuc2V0KHRydWUpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQubmFtZSA9PT0gJ2JsdXInICYmIHRoaXMudHlwZVBvcG92ZXIoKT8uaW5jbHVkZXMoJ21vdXNlbGVhdmUnKSAmJiB0aGlzLnZhbGlkUmVxdWlyZWQoKSAmJiAoIXRoaXMuaXRlbXNTZWxlY3RlZCgpIHx8ICF0aGlzLml0ZW1zU2VsZWN0ZWQoKS5sZW5ndGgpKSB7XG4gICAgICB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrT3V0c2lkZShldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0Q2xpY2tPdXRzaWRlKCkpO1xuICAgIHRoaXMudGltZW91dENsaWNrT3V0c2lkZS5zZXQoc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zaG93TGlzdCgpIHx8ICF0aGlzLnJlbW92ZVRleHRTZWFyY2hXaGVuQmx1cklucHV0KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy52YWx1ZUlucHV0LnNldCgnJyk7XG4gICAgICB0aGlzLmtleVNlYXJjaC5zZXQoJycpO1xuICAgICAgdGhpcy5pbnB1dEZ1bmN0aW9uQ29udHJvbCgpPy5yZXNldFZhbHVlKCk7XG4gICAgfSwgMjUwKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckVudGVyRXZlbnQoKSB7XG4gICAgaWYgKCF0aGlzLnZhbHVlSW5wdXQoKSB8fCAhYCR7dGhpcy52YWx1ZUlucHV0KCl9YC50cmltKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnKCk/Lmlnbm9yZUVudGVyQ3JlYXRlTmV3SXRlbSkge1xuICAgICAgY29uc3QgaXRlbUV4aXRzID0gdGhpcy5jaGVja0V4aXRzKCk7XG4gICAgICBpZiAoIWl0ZW1FeGl0cyB8fCBpdGVtRXhpdHMuaXNJdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5wcm9jZXNzRGF0YShbaXRlbUV4aXRzLml0ZW1dKTtcbiAgICAgIHRoaXMuaGFuZGxlclZhbHVlQ2hhbmdlU2VhcmNoKCcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmZ1bmN0aW9uQ2hlY2tQZXJtaXNzaW9uQ3JlYXRlVGFnKCkoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtRXhpdHMgPSB0aGlzLmNoZWNrRXhpdHMoKTtcbiAgICBjb25zdCB2YWx1ZUlucHV0ID0gYCR7dGhpcy52YWx1ZUlucHV0KCl9YC50cmltKCk7XG4gICAgY29uc3QgbmV3SXRlbSA9IHsgW3RoaXMuZmllbGRMYWJlbCgpXTogdmFsdWVJbnB1dCB9O1xuICAgIGlmICh0aGlzLmZpZWxkS2V5KCkpIHtcbiAgICAgIHNldChuZXdJdGVtLCB0aGlzLmZpZWxkS2V5KCksIGAke3RoaXMuZmFrZUlkKCl9JHt2YWx1ZUlucHV0fSR7dXVpZCgpfWApO1xuICAgIH1cbiAgICBpZiAoIWl0ZW1FeGl0cykge1xuICAgICAgaWYgKHRoaXMuY2hlY2tQYXR0ZXJuKFtuZXdJdGVtXSkpIHtcbiAgICAgICAgY29uc3QgaXRlbUJ1aWxkVmFsdWUgPSB7IC4uLm5ld0l0ZW0gfTtcbiAgICAgICAgY29uc3QgYnVpbGRWYWx1ZSA9IHRoaXMuY29uZmlnKCk/LmJ1aWxkVmFsdWU7XG4gICAgICAgIGlmIChidWlsZFZhbHVlKSB7XG4gICAgICAgICAgYnVpbGRWYWx1ZShpdGVtQnVpbGRWYWx1ZSwgbmV3SXRlbVt0aGlzLmZpZWxkTGFiZWwoKV0pO1xuICAgICAgICB9XG4gICAgICAgIG5ld0l0ZW1bdGhpcy5maWVsZExhYmVsKCldID0gaXRlbUJ1aWxkVmFsdWVbdGhpcy5maWVsZExhYmVsKCldO1xuICAgICAgICBpZiAodGhpcy5lbnRlckF1dG9BZGRUYWdUb0xpc3QoKSkge1xuICAgICAgICAgIHRoaXMubGlzdEZ1bmN0aW9uQ29udHJvbCgpPy51cGRhdGVEYXRhKHsgbmV3RGF0YTogc2lnbmFsKFtzaWduYWwobmV3SXRlbSldKSwgZnVuY3Rpb25DdXN0b21BZGREYXRhVG9TdG9yZTogKG5ld0RhdGEsIHN0b3JlKSA9PiBzdG9yZS51cGRhdGUodmFsdWUgPT4gKFsuLi5uZXdEYXRhKCksIC4uLnZhbHVlXSkpIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9jZXNzRGF0YShbbmV3SXRlbV0pO1xuICAgICAgICB0aGlzLml0ZW1DaGFuZ2VVblNlbGVjdC5zZXQobmV3SXRlbSk7XG4gICAgICAgIHRoaXMuaGFuZGxlclZhbHVlQ2hhbmdlU2VhcmNoKCcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGl0ZW1FeGl0cy5pc0l0ZW1TZWxlY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByb2Nlc3NEYXRhKFtpdGVtRXhpdHMuaXRlbV0pO1xuICAgIHRoaXMuaXRlbUNoYW5nZVVuU2VsZWN0LnNldChpdGVtRXhpdHMuaXRlbSk7XG4gICAgdGhpcy5oYW5kbGVyVmFsdWVDaGFuZ2VTZWFyY2goJycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJWYWx1ZUNoYW5nZVNlYXJjaCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy52YWx1ZUlucHV0LnNldChgJHt2YWx1ZX1gKTtcbiAgICBpZiAoIWAke3ZhbHVlIHx8ICcnfWAudHJpbSgpKSB7XG4gICAgICB0aGlzLmtleVNlYXJjaENoYW5nZVN1YigpPy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5rZXlTZWFyY2hDaGFuZ2VTdWIuc2V0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLnRpbWVPdXRDaGFuZ2VTZWFyY2guc2V0KHNldFRpbWVvdXQoKCkgPT4gdGhpcy5rZXlTZWFyY2guc2V0KCcnKSkpO1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZygpPy5pZ25vcmVFbnRlckNyZWF0ZU5ld0l0ZW0pIHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZygpPy5pZ25vcmVJbnB1dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMua2V5U2VhcmNoQ2hhbmdlU3ViKCkpIHtcbiAgICAgIHRoaXMuc2V0RXZlbnRLZXlTZWFyY2goKTtcbiAgICB9XG4gICAgdGhpcy5rZXlTZWFyY2hDaGFuZ2UubmV4dChgJHsodmFsdWUgfHwgJycpfWAudHJpbSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RXZlbnRLZXlTZWFyY2goKSB7XG4gICAgaWYgKHRoaXMua2V5U2VhcmNoQ2hhbmdlU3ViKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5rZXlTZWFyY2hDaGFuZ2VTdWIuc2V0KHRoaXMua2V5U2VhcmNoQ2hhbmdlLnBpcGUoZGVib3VuY2VUaW1lKDE1MDApLCB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy5rZXlTZWFyY2guc2V0KGAkeyh2YWx1ZSB8fCAnJyl9YC50cmltKCkpKSk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NEYXRhKGl0ZW1zOiBBcnJheTx1bmtub3duPiwgaWdub3JlVmFsaWRhdGUgPSBmYWxzZSwgaWdub3JlRW1pdEtleVNlbGVjdGVkV2hlbkl0ZW1zTm90RXhpdHNFbXB0eT86IGJvb2xlYW4pIHtcbiAgICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGl0ZW1zU2VsZWN0ZWQgPSB0aGlzLmdldEl0ZW1TZWxlY3RlZCgpO1xuICAgICAgaWYgKCFpZ25vcmVFbWl0S2V5U2VsZWN0ZWRXaGVuSXRlbXNOb3RFeGl0c0VtcHR5KSB7XG4gICAgICAgIHRoaXMub3V0U2VsZWN0TXVsdGlJdGVtLmVtaXQoaXRlbXNTZWxlY3RlZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoQXJyYXkuZnJvbShuZXcgU2V0KGl0ZW1zU2VsZWN0ZWQ/Lm1hcChpdGVtID0+IGdldChpdGVtLCBgcmVmLiR7dGhpcy5maWVsZEtleSgpfWApKSkpKTtcbiAgICAgIHRoaXMuY2hlY2tWaWV3Q2hhbmdlKGZhbHNlLCBpZ25vcmVWYWxpZGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zTWFwcGluZyA9IGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgIGNvbnN0IHJlZiA9IGdldChpdGVtLCAncmVmJykgfHwgaXRlbTtcbiAgICAgIGl0ZW0gPSBjbG9uZURlZXAocmVmKTtcbiAgICAgIHNldChpdGVtLCAncmVmJywgcmVmKTtcbiAgICAgIHRoaXMudXBkYXRlRmllbGRMYWJlbChpdGVtKTtcbiAgICAgIGNvbnN0IGdldERpc2FibGVJdGVtID0gdGhpcy5jb25maWcoKT8uZ2V0RGlzYWJsZUl0ZW07XG4gICAgICBjb25zdCBnZXRTdHlsZXMgPSB0aGlzLmNvbmZpZygpPy5nZXRTdHlsZXM7XG4gICAgICBjb25zdCBnZXRTdHlsZXNUYWdTcGVjaWZpYyA9IHRoaXMuY29uZmlnKCk/LmdldFN0eWxlc1RhZ1NwZWNpZmljO1xuICAgICAgaWYgKGdldERpc2FibGVJdGVtKSB7XG4gICAgICAgIHNldChpdGVtLCAnZGlzYWJsZUl0ZW0nLCBnZXREaXNhYmxlSXRlbShpdGVtKSk7XG4gICAgICB9XG4gICAgICBpZiAoZ2V0U3R5bGVzKSB7XG4gICAgICAgIHNldChpdGVtLCAnbmdTdHlsZXMnLCBnZXRTdHlsZXMoaXRlbSkpO1xuICAgICAgfVxuICAgICAgaWYgKGdldFN0eWxlc1RhZ1NwZWNpZmljKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRTdHlsZXNUYWdTcGVjaWZpYyhpdGVtKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzcGVjaWZpY192aW9sZXRfY29sb3InKSB7XG4gICAgICAgICAgc2V0KGl0ZW0sICduZ1N0eWxlcycsIHsgY29sb3I6ICcjNzIzOUVBJywgYmFja2dyb3VuZENvbG9yOiAnI0YxRUJGRCcgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC51cGRhdGUoaXRlbXMgPT4gWy4uLml0ZW1zLCAuLi5pdGVtc01hcHBpbmddKTtcbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuaXRlbXNTZWxlY3RlZCgpLm1hcChpdGVtID0+IGdldChpdGVtLCBgcmVmLiR7dGhpcy5maWVsZEtleSgpfWApKSkpKTtcbiAgICB0aGlzLm91dFNlbGVjdE11bHRpSXRlbS5lbWl0KHRoaXMuZ2V0SXRlbVNlbGVjdGVkKCkpO1xuICAgIHRoaXMuY2hlY2tWaWV3Q2hhbmdlKGZhbHNlLCBpZ25vcmVWYWxpZGF0ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckRhdGFDaGFuZ2UoaXRlbXM6IEFycmF5PHVua25vd24+KSB7XG4gICAgdGhpcy5pdGVtc09mTGlzdC5zZXQoaXRlbXMpO1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy51cGRhdGVQb3BvdmVyT3ZlcmxheVBvc2l0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmNvbmZpZygpPy5pZ25vcmVJbnB1dCkge1xuICAgICAgdGhpcy5pbnB1dEZ1bmN0aW9uQ29udHJvbCgpPy5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTG9hZGluZyhldmVudDogYm9vbGVhbikge1xuICAgIHRoaXMubG9hZGluZy5zZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1ZpZXdDaGFuZ2UoaWdub3JlU2Nyb2xsQm90dG9tOiBib29sZWFuLCBpZ25vcmVWYWxpZGF0ZSA9IGZhbHNlKSB7XG4gICAgdGhpcy5kaXNhYmxlV2hlbk1heEl0ZW0uc2V0KGZhbHNlKTtcbiAgICBjb25zdCBtYXhJdGVtSW5wdXQgPSB0aGlzLm1heEl0ZW1JbnB1dCgpO1xuICAgIGlmIChtYXhJdGVtSW5wdXQgJiYgbWF4SXRlbUlucHV0IDw9IHRoaXMuaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgdGhpcy5kaXNhYmxlV2hlbk1heEl0ZW0uc2V0KHRydWUpO1xuICAgIH1cbiAgICB0aGlzLnRpbWVPdXRDaGVja1ZpZXdDaGFuZ2Uuc2V0KChzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHNjcm9sbEhlaWdodCA9IHRoaXMudGFnc0VsKCk/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgaWYgKCFpc05pbChzY3JvbGxIZWlnaHQpICYmIHRoaXMuY2xpZW50SGVpZ2h0KCkgIT09IHNjcm9sbEhlaWdodCAmJiB0aGlzLnBvc2l0aW9uTGlzdCgpICE9PSAndG9wJykge1xuICAgICAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8udXBkYXRlUG9wb3Zlck92ZXJsYXlQb3NpdGlvbigpO1xuICAgICAgfVxuICAgICAgaWYgKCFpZ25vcmVTY3JvbGxCb3R0b20gJiYgdGhpcy50YWdzRWwoKSAmJiB0aGlzLnRhZ3NFbCgpLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy50YWdzRWwoKS5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgICAgdGhpcy5jbGllbnRIZWlnaHQuc2V0KHNjcm9sbEhlaWdodCk7XG4gICAgfSwgMjUwKSkpO1xuICAgIGlmICghaWdub3JlVmFsaWRhdGUpIHtcbiAgICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tFeGl0cyhsYWJlbD86IHN0cmluZywgaWQ/OiBzdHJpbmcpIHtcbiAgICBsZXQgaXRlbUV4aXRzO1xuICAgIGlmICghaXNOaWwoaWQpICYmICFgJHtpZH1gLmluY2x1ZGVzKHRoaXMuZmFrZUlkKCkpICYmIHRoaXMuZmllbGRLZXkoKSkge1xuICAgICAgaXRlbUV4aXRzID0gdGhpcy5pdGVtc1NlbGVjdGVkKCkuZmluZChpdGVtID0+ICFpc05pbChnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpKSkgJiYgYCR7Z2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YC50cmltKCkgPT09IGAke2lkfWApO1xuICAgICAgaWYgKGl0ZW1FeGl0cykge1xuICAgICAgICByZXR1cm4geyBpdGVtOiBpdGVtRXhpdHMsIGlzSXRlbVNlbGVjdGVkOiAhIWl0ZW1FeGl0cyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWxhYmVsKSB7XG4gICAgICBsYWJlbCA9IGAkeyh0aGlzLnZhbHVlSW5wdXQoKSB8fCAnJyl9YC50cmltKCk7XG4gICAgfVxuICAgIGl0ZW1FeGl0cyA9IHRoaXMuaXRlbXNTZWxlY3RlZCgpLmZpbmQoaXRlbSA9PiAhaXNOaWwoZ2V0KGl0ZW0sICdmaWVsZExhYmVsJykpICYmIChnZXQoaXRlbSwgJ2ZpZWxkTGFiZWwnKS50cmltKCkgPT09IGxhYmVsPy50cmltKCkpIHx8ICh0aGlzLmNoZWNrRXhpdElzTGFiZWxJbmNsdWRlKCkgJiYgZ2V0KGl0ZW0sICdmaWVsZExhYmVsJykudHJpbSgpLmluY2x1ZGVzKGxhYmVsPy50cmltKCkpKSB8fCAodGhpcy5jaGVja0V4aXRCeUZpZWxkcygpICYmIHRoaXMuY2hlY2tFeGl0QnlGaWVsZHMoKT8uc29tZShmaWVsZCA9PiBnZXQoaXRlbSwgZmllbGQpPy50cmltKCkgPT09IGxhYmVsPy50cmltKCkgfHwgZ2V0KGl0ZW0sIGZpZWxkKT8udHJpbSgpID09PSBlc2NhcGVIdG1sKGxhYmVsPy50cmltKCkgfHwgJycpIHx8IGVzY2FwZUh0bWwoZ2V0KGl0ZW0sIGZpZWxkKT8udHJpbSgpIHx8ICcgJykgPT09IGVzY2FwZUh0bWwobGFiZWw/LnRyaW0oKSB8fCAnJykpKSk7XG4gICAgaWYgKGl0ZW1FeGl0cykge1xuICAgICAgcmV0dXJuIHsgaXRlbTogaXRlbUV4aXRzLCBpc0l0ZW1TZWxlY3RlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICBpdGVtRXhpdHMgPSB0aGlzLml0ZW1zT2ZMaXN0KCkuZmluZChpdGVtID0+ICFpc05pbChnZXQoaXRlbSwgJ2ZpZWxkTGFiZWwnKSkgJiYgKGdldChpdGVtLCAnZmllbGRMYWJlbCcpLnRyaW0oKS5pbmNsdWRlcygpID09PSBsYWJlbD8udHJpbSgpKSB8fCAodGhpcy5jaGVja0V4aXRJc0xhYmVsSW5jbHVkZSgpICYmIGdldChpdGVtLCAnZmllbGRMYWJlbCcpLnRyaW0oKS5pbmNsdWRlcyhsYWJlbD8udHJpbSgpKSkgfHwgKHRoaXMuY2hlY2tFeGl0QnlGaWVsZHMoKSAmJiB0aGlzLmNoZWNrRXhpdEJ5RmllbGRzKCk/LnNvbWUoZmllbGQgPT4gZ2V0KGl0ZW0sIGZpZWxkKT8udHJpbSgpID09PSBsYWJlbD8udHJpbSgpIHx8IGVzY2FwZUh0bWwoZ2V0KGl0ZW0sIGZpZWxkKT8udHJpbSgpIHx8ICcgJykgPT09IGVzY2FwZUh0bWwobGFiZWw/LnRyaW0oKSB8fCAnJykgfHwgZ2V0KGl0ZW0sIGZpZWxkKT8udHJpbSgpID09PSBlc2NhcGVIdG1sKGxhYmVsPy50cmltKCkgfHwgJycpKSkpO1xuICAgIGlmIChpdGVtRXhpdHMpIHtcbiAgICAgIHJldHVybiB7IGl0ZW06IGl0ZW1FeGl0cywgaXNJdGVtU2VsZWN0ZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWRLZXkoZXZlbnQ6IElMaXN0RGF0YUVtaXRLZXkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5pdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNOaWwoZXZlbnQ/LmtleSkpIHtcbiAgICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pdGVtc1NlbGVjdGVkKClbMF0pIHtcbiAgICAgIHRoaXMudGVtcElnbm9yZUVtaXQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5oYW5kbGVyUmVtb3ZlSXRlbVNlbGVjdGVkKHsgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7IHJldHVybiB9IH0gYXMgRXZlbnQsIHRoaXMuaXRlbXNTZWxlY3RlZCgpWzBdLCB0aGlzLml0ZW1zU2VsZWN0ZWQoKVswXS5kaXNhYmxlSXRlbSk7XG4gICAgICB0aGlzLnRlbXBJZ25vcmVFbWl0LnNldChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlSXRlbXNTZWxlY3RlZChbZXZlbnQuaXRlbV0sICEhdGhpcy5pdGVtc1NlbGVjdGVkKClbMF0pOyAvLyBCdWcgIzM2MDc1XG4gIH1cblxuICBwcml2YXRlIGdldEZsYWdFbWl0U2VsZWN0ZWRJdGVtKGtleXM6IEFycmF5PHVua25vd24+KSB7XG4gICAgaWYgKCF0aGlzLmlnbm9yZUVtaXRXaGVuU2FtZURhdGFTZWxlY3RlZCgpIHx8IGtleXMubGVuZ3RoICE9PSB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCF0aGlzLml0ZW1zU2VsZWN0ZWQoKS5zb21lKGl0ZW0gPT4gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkgPT09IGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0TXVsdGlLZXkoZXZlbnQ6IElMaXN0RGF0YUVtaXRNdWx0aUtleSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IFtdO1xuICAgIGNvbnN0IGl0ZW1zOiBBcnJheTx1bmtub3duPiA9IFtdO1xuICAgIGlmIChldmVudC5rZXlzICYmIGV2ZW50LmtleXMubGVuZ3RoICYmICghZXZlbnQubWFwS2V5cyB8fCAhZXZlbnQubWFwS2V5cy5sZW5ndGgpKSB7XG4gICAgICBrZXlzLnB1c2goLi4uZXZlbnQua2V5cyk7XG4gICAgfVxuICAgIGNvbnN0IGlnbm9yZUVtaXRLZXlTZWxlY3RlZFdoZW5JdGVtc05vdEV4aXRzRW1wdHkgPSB0aGlzLmdldEZsYWdFbWl0U2VsZWN0ZWRJdGVtKGNsb25lRGVlcChldmVudC5rZXlzID8/IFtdKSk7XG4gICAgZXZlbnQubWFwS2V5cy5mb3JFYWNoKG1hcEtleSA9PiB7XG4gICAgICBpZiAoaXNOaWwobWFwS2V5LmtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKG1hcEtleS5pdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtcy5wdXNoKG1hcEtleS5pdGVtKTtcbiAgICAgIH1cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLml0ZW1zU2VsZWN0ZWQoKSkpIHtcbiAgICAgICAgcmV0dXJuIGtleXMucHVzaChtYXBLZXkua2V5KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5maW5kKGl0ZW0gPT4gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkgPT09IG1hcEtleS5rZXkpO1xuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5cy5wdXNoKG1hcEtleS5rZXkpO1xuICAgIH0pO1xuICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgY29uc3QgcmVzdWx0RGF0YTogQXJyYXk8dW5rbm93bj4gPSBhd2FpdCB0aGlzLmdldERldGFpbEJ5SWRzKGtleXMsIHRydWUpO1xuICAgICAgaXRlbXMucHVzaCguLi5yZXN1bHREYXRhKTtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZUVtcHR5ID0gdGhpcy52YWxpZFJlcXVpcmVkKCk/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRDtcbiAgICBsZXQgaWdub3JlVmFsaWRhdGUgPSB0cnVlO1xuICAgIGlmIChtZXNzYWdlRW1wdHkgPT09IHRoaXMuZXJyb3IoKT8ubWVzc2FnZSkge1xuICAgICAgaWdub3JlVmFsaWRhdGUgPSBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaXRlbVJlbW92ZSA9IHRoaXMuaXRlbXNTZWxlY3RlZCgpLmZpbmQoaXRlbVNlbGVjdGVkID0+IGdldChpdGVtU2VsZWN0ZWQsIHRoaXMuZmllbGRLZXkoKSkgJiYgIShpdGVtcy5zb21lKGl0ZW0gPT4gZ2V0KGl0ZW1TZWxlY3RlZCwgdGhpcy5maWVsZEtleSgpKSA9PT0gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpKSk7XG4gICAgdGhpcy5pdGVtc1NlbGVjdGVkLnVwZGF0ZShpdGVtc1NlbGVjdGVkID0+IGl0ZW1zU2VsZWN0ZWQuZmlsdGVyKGl0ZW1TZWxlY3RlZCA9PiAhZ2V0KGl0ZW1TZWxlY3RlZCwgdGhpcy5maWVsZEtleSgpKSB8fCAoZXZlbnQua2V5cy5sZW5ndGggJiYgaXRlbXMuc29tZShpdGVtID0+IGdldChpdGVtU2VsZWN0ZWQsIHRoaXMuZmllbGRLZXkoKSkgPT09IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpKSkpKTtcbiAgICBpZiAoaXRlbVJlbW92ZSkge1xuICAgICAgaWYgKHRoaXMuZW50ZXJBdXRvQWRkVGFnVG9MaXN0KCkgJiYgIWlzTmlsKGdldChpdGVtUmVtb3ZlLCB0aGlzLmZpZWxkS2V5KCkpKSAmJiBgJHtnZXQoaXRlbVJlbW92ZSwgdGhpcy5maWVsZEtleSgpKX1gLnNlYXJjaCh0aGlzLmZha2VJZCgpKSA+PSAwKSB7XG4gICAgICAgIHRoaXMua2V5c0hpZGRlbkl0ZW0udXBkYXRlKGl0ZW1zID0+IFsuLi4oaXRlbXMgfHwgW10pLCBnZXQoaXRlbVJlbW92ZSwgdGhpcy5maWVsZEtleSgpKV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWV2ZW50LmtleXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5pdGVtc1NlbGVjdGVkKCk/Lm1hcChpdGVtID0+IGdldChpdGVtLCBgcmVmLiR7dGhpcy5maWVsZEtleSgpfWApKSkpKTtcbiAgICAgIHRoaXMub3V0U2VsZWN0TXVsdGlJdGVtLmVtaXQodGhpcy5nZXRJdGVtU2VsZWN0ZWQoKSk7XG4gICAgICB0aGlzLmNoZWNrVmlld0NoYW5nZShmYWxzZSwgaWdub3JlVmFsaWRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUl0ZW1zU2VsZWN0ZWQoaXRlbXMsIGlnbm9yZVZhbGlkYXRlLCBpZ25vcmVFbWl0S2V5U2VsZWN0ZWRXaGVuSXRlbXNOb3RFeGl0c0VtcHR5KTtcbiAgICB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0RGV0YWlsQnlJZHMoa2V5czogQXJyYXk8dW5rbm93bj4sIGlzUmVzcG9uc2VEYXRhPzogYm9vbGVhbik6IFByb21pc2U8QXJyYXk8dW5rbm93bj4+IHtcbiAgICBjb25zdCBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcyA9IHRoaXMuaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMoKTtcbiAgICBpZiAoIWh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzIHx8IHRoaXMubG9hZGluZ0RldGFpbCgpIHx8ICEoa2V5cyBpbnN0YW5jZW9mIEFycmF5KSB8fCAha2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVMb2FkaW5nRGV0YWlsKHRydWUpO1xuICAgIGNvbnN0IGNsb25lSHR0cERldGFpbENvbmZpZyA9IGNsb25lRGVlcChodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSBjbG9uZUh0dHBEZXRhaWxDb25maWc7XG4gICAgICBpZiAoIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIHx8ICFndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5kZXRhaWxCeUlkKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLmRldGFpbEJ5SWQuZmllbGRHZXRWYWx1ZSA9ICdrZXlzJztcbiAgICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyBrZXlzOiBrZXlzIH0sIHt9LCAnJywgZmFsc2UsIGZhbHNlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaShjbG9uZUh0dHBEZXRhaWxDb25maWcpKSBhcyBJSHR0cFJlc3BvbnNlPEFycmF5PHVua25vd24+PjtcbiAgICAgIGlmICghaXNSZXNwb25zZURhdGEpIHtcbiAgICAgICAgdGhpcy51cGRhdGVJdGVtc1NlbGVjdGVkKHJlc3VsdC5kYXRhIHx8IFtdKTtcbiAgICAgICAgdGhpcy51cGRhdGVMb2FkaW5nRGV0YWlsKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVMb2FkaW5nRGV0YWlsKGZhbHNlKTtcbiAgICAgIHJldHVybiByZXN1bHQuZGF0YSB8fCBbXTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgdGhpcy51cGRhdGVMb2FkaW5nRGV0YWlsKGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1ZhbGlkKCkge1xuICAgIGNvbnN0IHZhbGlkID0gdGhpcy5pdGVtc1NlbGVjdGVkKCkgJiYgdGhpcy5pdGVtc1NlbGVjdGVkKCkubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlO1xuICAgIGNvbnN0IHN0YXRlRXJyb3IgPSAhIXRoaXMuZXJyb3IoKTtcbiAgICB0aGlzLmVycm9yLnNldCh1bmRlZmluZWQpO1xuICAgIGlmICh0aGlzLnZhbGlkUmVxdWlyZWQoKSAmJiAhdmFsaWQpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHsgLi4udGhpcy52YWxpZFJlcXVpcmVkKCksIG1lc3NhZ2U6IHRoaXMudmFsaWRSZXF1aXJlZCgpPy5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQgfSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5lcnJvcigpKSB7XG4gICAgICB0aGlzLmNoZWNrUGF0dGVybih0aGlzLml0ZW1zU2VsZWN0ZWQoKSk7XG4gICAgICB0aGlzLmNoZWNrTWF4SXRlbVNlbGVjdGVkVmFsaWQoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRlbXBJZ25vcmVFbWl0KCkpIHtcbiAgICAgIHRoaXMub3V0VmFsaWRFdmVudC5lbWl0KCF0aGlzLmVycm9yKCkpO1xuICAgIH1cbiAgICBpZiAoc3RhdGVFcnJvciAhPT0gISF0aGlzLmVycm9yKCkpIHtcbiAgICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy51cGRhdGVQb3BvdmVyT3ZlcmxheVBvc2l0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiAhdGhpcy5lcnJvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja01heEl0ZW1TZWxlY3RlZFZhbGlkKCkge1xuICAgIGNvbnN0IHZhbGlkTWF4SXRlbVNlbGVjdGVkID0gdGhpcy52YWxpZE1heEl0ZW1TZWxlY3RlZCgpO1xuICAgIGlmICh2YWxpZE1heEl0ZW1TZWxlY3RlZCAmJiB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5sZW5ndGggPiB2YWxpZE1heEl0ZW1TZWxlY3RlZC52YWx1ZSkge1xuICAgICAgdGhpcy5lcnJvci5zZXQoeyAuLi52YWxpZE1heEl0ZW1TZWxlY3RlZCwgbWVzc2FnZTogdmFsaWRNYXhJdGVtU2VsZWN0ZWQubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01BWF9WQUxJRCwgaW50ZXJwb2xhdGVQYXJhbXM6IHsgdmFsdWU6IHZhbGlkTWF4SXRlbVNlbGVjdGVkLnZhbHVlIH0gfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1BhdHRlcm4oaXRlbXM6IEFycmF5PHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsaWRQYXR0ZXJuID0gdGhpcy52YWxpZFBhdHRlcm4oKTtcbiAgICBpZiAoIXZhbGlkUGF0dGVybiB8fCAhdmFsaWRQYXR0ZXJuLmxlbmd0aCB8fCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsaWQgb2YgdmFsaWRQYXR0ZXJuKSB7XG4gICAgICBpZiAodmFsaWQucGF0dGVybiAmJiBpdGVtcy5zb21lKGl0ZW0gPT4gIXZhbGlkLnBhdHRlcm4udGVzdChnZXQoaXRlbSwgdGhpcy5maWVsZExhYmVsKCkpKSkpIHtcbiAgICAgICAgdGhpcy5lcnJvci5zZXQoeyAuLi52YWxpZCwgbWVzc2FnZTogdmFsaWQubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX1BBVFRFTl9WQUxJRCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tCdXR0b25PdGhlcihldmVudDogSUJ1dHRvbikge1xuICAgIHRoaXMub3V0Q2xpY2tCdXR0b25PdGhlci5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SXRlbVNlbGVjdGVkKCk6IEFycmF5PHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1NlbGVjdGVkKCkubWFwKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgaXRlbU1hcCA9IHsgLi4uaXRlbSB9O1xuICAgICAgaWYgKCFpc05pbChnZXQoaXRlbU1hcCwgdGhpcy5maWVsZEtleSgpKSkgJiYgYCR7Z2V0KGl0ZW1NYXAsIHRoaXMuZmllbGRLZXkoKSl9YC5zZWFyY2godGhpcy5mYWtlSWQoKSkgPT09IDApIHtcbiAgICAgICAgc2V0KGl0ZW1NYXAsIHRoaXMuZmllbGRLZXkoKSwgJycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW1NYXA7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVzZXRUb0RlZmF1bHREYXRhU2VsZWN0ZWQoaXRlbVNlbGVjdGVkPzogQXJyYXk8dW5rbm93bj4pIHtcbiAgICBpZiAoaXRlbVNlbGVjdGVkICYmIEFycmF5LmlzQXJyYXkoaXRlbVNlbGVjdGVkKSkge1xuICAgICAgdGhpcy5pdGVtc1NlbGVjdGVkLnNldChbXSk7XG4gICAgICB0aGlzLnVwZGF0ZUl0ZW1zU2VsZWN0ZWQoaXRlbVNlbGVjdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbVNlbGVjdGVkID0gbmV3IEFycmF5PHVua25vd24+KCk7XG4gICAgaWYgKCF0aGlzLmZpZWxkS2V5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVmYXVsdEtleXNTZWxlY3RlZCA9IHRoaXMuZGVmYXVsdEtleXNTZWxlY3RlZCgpO1xuICAgIGlmIChkZWZhdWx0S2V5c1NlbGVjdGVkICYmIEFycmF5LmlzQXJyYXkoZGVmYXVsdEtleXNTZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoW10pO1xuICAgICAgdGhpcy5nZXREZXRhaWxCeUlkcyhkZWZhdWx0S2V5c1NlbGVjdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVmYXVsdEl0ZW1zU2VsZWN0ZWQgPSB0aGlzLmRlZmF1bHRJdGVtc1NlbGVjdGVkKCk7XG4gICAgaWYgKGRlZmF1bHRJdGVtc1NlbGVjdGVkICYmIEFycmF5LmlzQXJyYXkoZGVmYXVsdEl0ZW1zU2VsZWN0ZWQpKSB7XG4gICAgICB0aGlzLml0ZW1zU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICAgIHRoaXMudXBkYXRlSXRlbXNTZWxlY3RlZChkZWZhdWx0SXRlbXNTZWxlY3RlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xMaXN0KGV2ZW50OiBJTGlzdEZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5saXN0RnVuY3Rpb25Db250cm9sLnNldChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZm9jdXNJbnB1dCgpIHtcbiAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCk/LmZvY3VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUZsYWdNb3VzZShldmVudDogSUZsYWdNb3VzZSkge1xuICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZShmbGFnOiBJRmxhZ01vdXNlKSB7XG4gICAgdGhpcy5mbGFnTW91c2Uuc2V0KGZsYWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNldEVycm9yKCkge1xuICAgIHRoaXMuZXJyb3Iuc2V0KHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUxvYWRpbmdEZXRhaWwoZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KGV2ZW50KTtcbiAgICB0aGlzLm91dExvYWRpbmdHZXREZXRhaWxTZWxlY3RlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlSXRlbVNlbGVjdGVkRGlzYWJsZSgpIHtcbiAgICBjb25zdCBnZXREaXNhYmxlSXRlbSA9IHRoaXMuY29uZmlnKCk/LmdldERpc2FibGVJdGVtO1xuICAgIGlmICghZ2V0RGlzYWJsZUl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtc1NlbGVjdGVkLnVwZGF0ZShpdGVtc1NlbGVjdGVkID0+IGl0ZW1zU2VsZWN0ZWQubWFwKGl0ZW0gPT4gKHsgLi4uaXRlbSwgZGlzYWJsZUl0ZW06IGdldERpc2FibGVJdGVtKGl0ZW0pIH0pKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hMaXN0RGF0YSgpIHtcbiAgICB0aGlzLmxpc3RGdW5jdGlvbkNvbnRyb2woKT8ucmVmcmVzaCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG5cbiAgICBpZiAodGhpcy50aW1lT3V0RmxhZygpKSBjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0RmxhZygpKTtcbiAgICBpZiAodGhpcy50aW1lT3V0Q2hhbmdlU2VhcmNoKCkpIGNsZWFyVGltZW91dCh0aGlzLnRpbWVPdXRDaGFuZ2VTZWFyY2goKSk7XG4gICAgaWYgKHRoaXMudGltZU91dENoZWNrVmlld0NoYW5nZSgpKSBjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0Q2hlY2tWaWV3Q2hhbmdlKCkpO1xuICAgIGlmICh0aGlzLnRpbWVvdXRDbGlja091dHNpZGUoKSkgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dENsaWNrT3V0c2lkZSgpKTtcblxuICAgIGlmICh0aGlzLmtleVNlYXJjaENoYW5nZVN1YigpKSB0aGlzLmtleVNlYXJjaENoYW5nZVN1YigpPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGxcIj5cbiAgQGlmIChsYWJlbENvbmZpZygpOyBhcyBsYWJlbENvbmZpZykge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWwgW2NsYXNzSW5jbHVkZV09XCJsYWJlbENvbmZpZy5jbGFzc0luY2x1ZGVcIlxuICAgICAgW2xhYmVsTGVmdF09XCJsYWJlbENvbmZpZy5sYWJlbExlZnRcIlxuICAgICAgW2xhYmVsTGVmdENsYXNzXT1cImxhYmVsQ29uZmlnLmxhYmVsTGVmdENsYXNzXCJcbiAgICAgIFtyZXF1aXJlZF09XCJsYWJlbENvbmZpZy5yZXF1aXJlZFwiXG4gICAgICBbZGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgW2Rlc2NyaXB0aW9uQ2xhc3NdPVwibGFiZWxDb25maWcuZGVzY3JpcHRpb25DbGFzc1wiXG4gICAgICBbbGFiZWxSaWdodF09XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0XCJcbiAgICAgIFtsYWJlbFJpZ2h0Q2xhc3NdPVwibGFiZWxDb25maWcubGFiZWxSaWdodENsYXNzXCJcbiAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgW2J1dHRvbnNMZWZ0XT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNMZWZ0XCJcbiAgICAgIFtidXR0b25zUmlnaHRdPVwibGFiZWxDb25maWcuYnV0dG9uc1JpZ2h0XCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc0xlZnRdPVwibGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNMZWZ0IHx8IGRpc2FibGUoKSB8fCBsb2FkaW5nKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc1JpZ2h0XT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zUmlnaHQgfHwgZGlzYWJsZSgpIHx8IGxvYWRpbmcoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgW2hhc1RvZ2dsZV09XCJsYWJlbENvbmZpZy5oYXNUb2dnbGVcIlxuICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJsYWJlbENvbmZpZy50b2dnbGVBY3RpdmVcIlxuICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJsYWJlbENvbmZpZy50b2dnbGVEaXNhYmxlIHx8IGRpc2FibGUoKSB8fCBsb2FkaW5nKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgIFtwb3BvdmVyXT1cImxhYmVsQ29uZmlnLnBvcG92ZXJcIlxuICAgICAgW2ljb25Qb3BvdmVyQ2xhc3NdPVwibGFiZWxDb25maWcuaWNvblBvcG92ZXJDbGFzc1wiXG4gICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgIFtsaW1pdExlbmd0aF09XCJsYWJlbENvbmZpZy5saW1pdExlbmd0aFwiXG4gICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uIHx8IGRpc2FibGUoKVwiXG4gICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NdPVwibGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NcIlxuICAgICAgW2NvdW50XT1cImxhYmVsQ29uZmlnLmNvdW50XCIgLz5cbiAgfVxuICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsXCJcbiAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwiZGlzYWJsZSgpIHx8IHJlYWRvbmx5KCkgfHwgISFjb25maWcoKT8uaWdub3JlU2hvd0xpc3QgfHwgZmFsc2VcIlxuICAgIFtpZ25vcmVDdXJzb3JQb2ludGVyTW9kZUxpa2VDbGlja109XCJ0cnVlXCJcbiAgICBbZWxlbWVudFJlZkN1c3RvbV09XCJ0YWdzRWxcIlxuICAgIFttb2RlXT1cIiFjb25maWcoKT8uaWdub3JlSW5wdXQgPyAnY2xpY2snIDogJ2NsaWNrLXRvZ2dsZSdcIlxuICAgIFtpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlXT1cInRydWVcIlxuICAgIFtmbGFnTW91c2VdPVwiZmxhZ01vdXNlKClcIlxuICAgIFtjb25maWddPVwie1xuICAgICAgYW5pbWF0aW9uQ29uZmlnOiBjb25maWcoKT8uYW5pbWF0aW9uQ29uZmlnIHx8IHt9LFxuICAgICAgekluZGV4OiB6SW5kZXgoKSB8fCAxMDAwLFxuICAgICAgd2lkdGhCeVBhcmVudDogdHJ1ZSxcbiAgICAgIHBhcmVudEJvcmRlcldpZHRoOiBwYXJlbnRCb3JkZXJXaWR0aCgpID8/IDAsXG4gICAgICBtYXhIZWlnaHQ6IDIwNDgsXG4gICAgICBtYXhXaWR0aDogMjA0OCxcbiAgICAgIGRpcmVjdGlvbjogY29uZmlnKCk/LmRpcmVjdGlvbkxpc3QgfHwgJ2JvdHRvbScsXG4gICAgICBkaXJlY3Rpb25EaXN0YW5jZTogMixcbiAgICAgIHRlbXBsYXRlOiAhc2hvd0xpc3RCZWxsb3coKSA/IGxpc3RWaWV3RWwgOiB1bmRlZmluZWQsXG4gICAgICB3aGl0ZVRoZW1lOiB0cnVlLFxuICAgICAgaWdub3JlQXJyb3c6IHRydWUsXG4gICAgICBjbGFzc0luY2x1ZGU6ICdyb3VuZGVkLVs0cHhdICcgKyBjbGFzc0luY2x1ZGVQb3BvdmVyKCkgKyAoKCFsaXN0Q29uZmlnKCk/Lmlnbm9yZVNob3dEYXRhV2hlbk5vdFNlYXJjaCB8fCBrZXlTZWFyY2goKSkgPyAnIGxpYnMtdWktYm9yZGVyLWdlbmVyYWwnIDogJycpLFxuICAgICAgcG9zaXRpb246IHsgbW9kZTogJ3N0YXJ0JywgZGlzdGFuY2U6IDAgfVxuICAgIH1cIlxuICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQoJGV2ZW50KVwiXG4gICAgKG91dEV2ZW50KT1cImhhbmRsZXJQb3BvdmVyRXZlbnQoJGV2ZW50KVwiXG4gICAgKG91dEV2ZW50UG9wb3ZlckNvbnRlbnQpPVwiaGFuZGxlclBvcG92ZXJDb250ZW50RXZlbnQoJGV2ZW50KVwiXG4gICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckNoYW5nZUZsYWdNb3VzZSgkZXZlbnQpXCI+XG4gICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlXCJcbiAgICAgIFtjbGFzcy5jdXJzb3ItcG9pbnRlcl09XCIhZGlzYWJsZSgpICYmICFyZWFkb25seSgpXCJcbiAgICAgIFtjbGFzcy5saWJzLXVpLXJlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgW2NsYXNzLmxpYnMtdWktcmVhZG9ubHktYmFja2dyb3VuZF09XCJyZWFkb25seSgpXCJcbiAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGUtYmFja2dyb3VuZF09XCJkaXNhYmxlKClcIj5cbiAgICAgIEBpZiAoY29uZmlnKCk/LnVpTGlrZURyb3Bkb3duKSB7XG4gICAgICAgIDxpIGNsYXNzPVwiZmxleCB0ZXh0LVsxNnB4XSBhYnNvbHV0ZSByaWdodC1bMTZweF0gdG9wLVs4cHhdIGxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCB6LVsxXVwiXG4gICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFyZWFkb25seSgpICYmICFkaXNhYmxlKClcIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLXJlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGVdPVwiZGlzYWJsZSgpXCI+XG4gICAgICAgIDwvaT5cbiAgICAgIH1cbiAgICAgIDxkaXYgI3RhZ3NFbFxuICAgICAgICBbY2xhc3NdPVwiJ2xpYnMtdWktdGFncyAnICsgKGNvbmZpZygpPy5jbGFzc0luY2x1ZGUgfHwgJycpICsgKHJlYWRvbmx5KCkgPyAoY29uZmlnKCk/LmNsYXNzQ3VzdG9tV2hlblJlYWRPbmx5IHx8ICcgbGlicy11aS1yZWFkb25seScpIDogJycpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktdGFncy1ub3QtcG9wdXBdPVwiKCFzaG93TGlzdCgpICYmICFzaG93Qm9yZGVyQWN0aXZlV2hlbkZvY3VzSW5wdXQoKSkgfHwgKCFmb2N1cygpICYmIHNob3dCb3JkZXJBY3RpdmVXaGVuRm9jdXNJbnB1dCgpKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLXRhZ3MtZXJyb3JdPVwiISFlcnJvcigpICYmICFjb25maWcoKT8uaWdub3JlU2hvd0Vycm9yXCJcbiAgICAgICAgW2NsYXNzLiFwci1bMzJweF1dPVwiY29uZmlnKCk/LnVpTGlrZURyb3Bkb3duXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktcmVhZG9ubHktYmFja2dyb3VuZF09XCJyZWFkb25seSgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktZGlzYWJsZS1iYWNrZ3JvdW5kXT1cImRpc2FibGUoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1wcmltYXJ5LWdlbmVyYWxdPVwiZm9jdXMoKSAmJiBzaG93Qm9yZGVyQWN0aXZlV2hlbkZvY3VzSW5wdXQoKVwiXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNDbGlja091dHNpZGVEaXJlY3RpdmVcbiAgICAgICAgKG91dE91dHNpZGUpPVwiaGFuZGxlckNsaWNrT3V0c2lkZSgkZXZlbnQpXCI+XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXNTZWxlY3RlZCgpOyB0cmFjayBpdGVtW2ZpZWxkS2V5KCldKSB7XG4gICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJpdGVtPy5idWxsZXQgfHwgaXRlbT8ubmdTdHlsZXNcIlxuICAgICAgICAgICAgW2NsYXNzXT1cImNsYXNzSW5jbHVkZVRhZ0l0ZW0oKSB8fCAnJ1wiXG4gICAgICAgICAgICBbY2xhc3MubGlicy11aS10YWdzLXJlYWRvbmx5XT1cIml0ZW0uZGlzYWJsZUl0ZW1cIlxuICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktdGFncy1pdGVtXT1cIiFpdGVtLmRpc2FibGVJdGVtXCJcbiAgICAgICAgICAgIFtjbGFzcy5jdXJzb3ItZGVmYXVsdF09XCJkaXNhYmxlKCkgfHwgcmVhZG9ubHkoKVwiPlxuICAgICAgICAgICAgQGlmIChmaWVsZEdldEltYWdlKCk7IGFzIGZpZWxkR2V0SW1hZ2UpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYXZhdGFyIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NBdmF0YXJJbmNsdWRlKCkgfHwgJ21yLVs4cHhdJ1wiXG4gICAgICAgICAgICAgICAgICBbc2l6ZV09XCJpbWFnZVNpemUoKVwiXG4gICAgICAgICAgICAgICAgICBbbGlua0F2YXRhcl09XCJpdGVtW2ZpZWxkR2V0SW1hZ2VdXCJcbiAgICAgICAgICAgICAgICAgIFtsaW5rQXZhdGFyRXJyb3JdPVwiY29uZmlnKCk/LmxpbmtJbWFnZUVycm9yXCJcbiAgICAgICAgICAgICAgICAgIFtpZEdlbkNvbG9yXT1cIml0ZW1bZmllbGRHZXRUZXh0QXZhdGFyKCldXCJcbiAgICAgICAgICAgICAgICAgIFt0ZXh0QXZhdGFyXT1cIml0ZW1bZmllbGRHZXRUZXh0QXZhdGFyKCldXCJcbiAgICAgICAgICAgICAgICAgIFtnZXRMYXN0VGV4dEFmdGVyU3BhY2VdPVwiZ2V0TGFzdFRleHRBZnRlclNwYWNlKClcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWg2clwiXG4gICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiKGl0ZW0uZmllbGRMYWJlbCB8fCAnICcpIHwgdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICBAaWYgKCFkaXNhYmxlKCkgJiYgIWl0ZW0uZGlzYWJsZUl0ZW0gJiYgIXJlYWRvbmx5KCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1sLVs4cHhdXCI+XG4gICAgICAgICAgICAgICAgPGkgI2ljb25DbG9zZUVsXG4gICAgICAgICAgICAgICAgICBbYXR0ci5zcGVjaWZpY1N0eWxlXT1cIiEhKGl0ZW0/LmJ1bGxldCB8fCBpdGVtPy5uZ1N0eWxlcylcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidmbGV4IHRleHQtWzE2cHhdICcgKyAoY2xhc3NJY29uUmVtb3ZlVGFnSXRlbSgpIHx8ICdsaWJzLXVpLWljb24tY2xvc2UnKVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIWRpc2FibGUoKSAmJiAhbG9hZGluZygpICYmICFsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmcoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiKGl0ZW0/LmJ1bGxldCB8fCBpdGVtPy5uZ1N0eWxlcykgfCBMaWJzVWlDb21wb25lbnRzVGFnc0dldENvbG9yUGlwZTppY29uQ2xvc2VFbFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclJlbW92ZUl0ZW1TZWxlY3RlZCgkZXZlbnQsaXRlbSlcIj48L2k+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoIXNpbmdsZVNlbGVjdGVkKCkgfHwgKHNpbmdsZVNlbGVjdGVkKCkgJiYgIWl0ZW1zU2VsZWN0ZWQoKS5sZW5ndGgpKSB7XG4gICAgICAgICAgQGlmICghY29uZmlnKCk/Lmlnbm9yZUlucHV0ICYmICFjb25maWcoKT8udWlMaWtlRHJvcGRvd24gJiYgKCFoaWRkZW5JbnB1dFdoZW5SZWFkb25seSgpIHx8IChoaWRkZW5JbnB1dFdoZW5SZWFkb25seSgpICYmICFyZWFkb25seSgpKSkpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLWlucHV0IGNsYXNzPVwiZ3Jvd1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5tYi1bNHB4XV09XCJpdGVtc1NlbGVjdGVkKCkubGVuZ3RoXCJcbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIndy1mdWxsIGJnLXRyYW5zcGFyZW50ICcgKyAoY29uZmlnKCk/LmNsYXNzSW5wdXRJbmNsdWRlIHx8ICdweC1bNHB4XSBtaW4tdy1bMzBweF0nKVwiXG4gICAgICAgICAgICAgIFtkZWZhdWx0SGVpZ2h0XT1cIjI0XCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInJlYWRvbmx5KCkgPyAnJyA6IChwbGFjZWhvbGRlcigpIHx8ICdpMThuX2ltcG9ydF9jb250ZW50JylcIlxuICAgICAgICAgICAgICBbbm9Cb3JkZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFsodmFsdWUpXT1cInZhbHVlSW5wdXRcIlxuICAgICAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgbG9hZGluZygpIHx8IGxvYWRpbmdEZXRhaWwoKSB8fCBkaXNhYmxlV2hlbk1heEl0ZW0oKVwiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgKG91dEVudGVyRXZlbnQpPVwiaGFuZGxlckVudGVyRXZlbnQoKVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVyVmFsdWVDaGFuZ2VTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvdXRGb2N1c0FuZEJsdXJFdmVudCk9XCJoYW5kbGVyRm9jdXNBbmRCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJJbnB1dEZ1bmN0aW9uQ29udHJvbCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChjb25maWcoKT8uaWdub3JlSW5wdXQgJiYgY29uZmlnKCk/LnVpTGlrZURyb3Bkb3duICYmICFpdGVtc1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcGItWzRweF0gcHQtWzJweF0gbWwtWzExcHhdIGxpYnMtdWktZm9udC1oNXJcIlxuICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiZGlzYWJsZSgpXCI+XG4gICAgICAgICAgICAgIHt7IChwbGFjZWhvbGRlcigpIHx8ICdpMThuX3NlbGVjdF92YWx1ZScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmIChlcnJvcigpICYmICFjb25maWcoKT8uaWdub3JlU2hvd0Vycm9yKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LVsjZWUyZDQxXSBsaWJzLXVpLWZvbnQtaDdyIG10LVs4cHhdXCI+e3sgKGVycm9yKCk/Lm1lc3NhZ2UgfHwgJyAnKSB8IHRyYW5zbGF0ZTooZXJyb3IoKT8uaW50ZXJwb2xhdGVQYXJhbXMgfHwge30pIH19PC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG48L2Rpdj5cbkBpZiAoc2hvd0xpc3RCZWxsb3coKSkge1xuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdFZpZXdFbFwiPjwvbmctY29udGFpbmVyPlxufVxuPG5nLXRlbXBsYXRlICNsaXN0Vmlld0VsPlxuICBAaWYgKGxpc3RDb25maWcoKTsgYXMgbGlzdENvbmZpZykge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGlzdCBbc2VhcmNoQ29uZmlnXT1cImxpc3RTZWFyY2hDb25maWcoKSB8fCB7Y2xhc3NJbmNsdWRlOiAnaGlkZGVuJywgaWNvbkxlZnRDbGFzczogJ2hpZGRlbid9XCJcbiAgICAgIFtpc1NlYXJjaE9ubGluZV09XCJpc1NlYXJjaE9ubGluZSgpXCJcbiAgICAgIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgICAgW2tleVNlYXJjaF09XCJrZXlTZWFyY2goKVwiXG4gICAgICBbY29uZmlnXT1cImxpc3RDb25maWdcIlxuICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKSB8fCBkaXNhYmxlV2hlbk1heEl0ZW0oKVwiXG4gICAgICBbc2VhcmNoUGFkZGluZ109XCJsaXN0U2VhcmNoUGFkZGluZygpXCJcbiAgICAgIFttYXhJdGVtU2hvd109XCJsaXN0TWF4SXRlbVNob3coKSB8fCA2XCJcbiAgICAgIFttdWx0aUtleVNlbGVjdGVkXT1cImtleXNTZWxlY3RlZCgpXCJcbiAgICAgIFtjbGlja0V4YWN0bHldPVwiZmFsc2VcIlxuICAgICAgW2tleXNIaWRkZW5JdGVtXT1cImtleXNIaWRkZW5JdGVtKClcIlxuICAgICAgW2tleXNEaXNhYmxlSXRlbV09XCJrZXlzRGlzYWJsZUl0ZW0oKVwiXG4gICAgICBbZGl2aWRlckNsYXNzSW5jbHVkZV09XCJsaXN0RGl2aWRlckNsYXNzSW5jbHVkZSgpID8/ICdoaWRkZW4nXCJcbiAgICAgIFtidXR0b25zT3RoZXJdPVwibGlzdEJ1dHRvbnNPdGhlcigpXCJcbiAgICAgIFtiYWNrZ3JvdW5kTGlzdEN1c3RvbV09XCJsaXN0QmFja2dyb3VuZExpc3RDdXN0b20oKVwiXG4gICAgICBbaXRlbUNoYW5nZVVuU2VsZWN0XT1cIml0ZW1DaGFuZ2VVblNlbGVjdCgpXCJcbiAgICAgIFtmdW5jdGlvbkdldEl0ZW1zQXV0b0FkZExpc3RdPVwiZnVuY3Rpb25HZXRJdGVtQXV0b0FkZExpc3QoKVwiXG4gICAgICBbaGlkZGVuSW5wdXRTZWFyY2hdPVwibGlzdEhpZGRlbklucHV0U2VhcmNoV2hlbkhhc1NlYXJjaENvbmZpZygpXCJcbiAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2xMaXN0KCRldmVudClcIlxuICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWRLZXkoJGV2ZW50KVwiXG4gICAgICAob3V0U2VsZWN0TXVsdGlLZXkpPVwiaGFuZGxlclNlbGVjdE11bHRpS2V5KCRldmVudClcIlxuICAgICAgKG91dENoYW5nZVZpZXcpPVwiaGFuZGxlckRhdGFDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAob3V0Q2xpY2tCdXR0b25PdGhlcik9XCJoYW5kbGVyQ2xpY2tCdXR0b25PdGhlcigkZXZlbnQpXCJcbiAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9XCJoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgIChvdXRMb2FkaW5nKT1cImhhbmRsZXJMb2FkaW5nKCRldmVudClcIiAvPlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
727
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFncy9zcmMvdGFncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFncy9zcmMvdGFncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEwsT0FBTyxFQUFFLCtCQUErQixFQUEyQixNQUFNLDRCQUE0QixDQUFDO0FBR3RHLE9BQU8sRUFBa0Qsb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUd4SSxPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQXVGLDZCQUE2QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDakwsT0FBTyxFQUE0QyxnQ0FBZ0MsRUFBOEMsTUFBTSw2QkFBNkIsQ0FBQztBQUVySyxPQUFPLEVBQXNCLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUYsT0FBTyxFQUFFLFNBQVMsRUFBRSx5QkFBeUIsRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEIsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUosT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVB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SUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDeEksSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFELENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEQsQ0FBQztRQUNELFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzZSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFDRCxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVB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dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBtb2RlbCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0F2YXRhckNvbXBvbmVudCwgVFlQRV9TSVpFX0FWQVRBUl9DT05GSUcgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWF2YXRhcic7XG5pbXBvcnQgeyBJQnV0dG9uIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJVmFsaWRNYXhJdGVtU2VsZWN0ZWQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElGb2N1c0FuZEJsdXJFdmVudCwgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNJbnB1dENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLWlucHV0JztcbmltcG9ydCB7IElJbnB1dFNlYXJjaENvbmZpZyB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXNlYXJjaCc7XG5pbXBvcnQgeyBJVmFsaWQsIElWYWxpZFBhdHRlcm4gfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy12YWxpZCc7XG5pbXBvcnQgeyBJTGFiZWwsIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGFiZWwnO1xuaW1wb3J0IHsgZ2V0RmllbGRLZXlCeVR5cGUsIElMaXN0Q29uZmlnSXRlbSwgSUxpc3REYXRhRW1pdEtleSwgSUxpc3REYXRhRW1pdE11bHRpS2V5LCBJTGlzdEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBJRmxhZ01vdXNlLCBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0RJUkVDVElPTiwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IElIdHRwUmVzcG9uc2UgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IElIdHRwUmVxdWVzdENvbmZpZywgTGlic1VpSHR0cFJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtaHR0cC1yZXF1ZXN0JztcbmltcG9ydCB7IGNsb25lRGVlcCwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCwgRVJST1JfTUVTU0FHRV9NQVhfVkFMSUQsIEVSUk9SX01FU1NBR0VfUEFUVEVOX1ZBTElELCBlc2NhcGVIdG1sLCBnZXQsIGlzTmlsLCBzZXQsIHV1aWQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElUYWdzQ29uZmlnLCBJVGFnc0Z1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3RhZ3MuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNUYWdzR2V0Q29sb3JQaXBlIH0gZnJvbSAnLi9waXBlcy9nZXQtY29sb3IucGlwZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQ2xpY2tPdXRzaWRlRGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jbGljay1vdXRzaWRlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXRhZ3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFncy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi90YWdzLmNvbXBvbmVudC5zY3NzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBUcmFuc2xhdGVNb2R1bGUsIE5nVGVtcGxhdGVPdXRsZXQsIE5nU3R5bGUsIExpYnNVaUNvbXBvbmVudHNDbGlja091dHNpZGVEaXJlY3RpdmUsXG4gICAgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzSW5wdXRDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNBdmF0YXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0xpc3RDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNUYWdzR2V0Q29sb3JQaXBlXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNUYWdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGZsYWdNb3VzZSA9IHNpZ25hbDxJRmxhZ01vdXNlPih7IGlzTW91c2VFbnRlcjogZmFsc2UsIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlIH0pO1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBsb2FkaW5nRGV0YWlsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGtleVNlYXJjaCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJvdGVjdGVkIHZhbHVlSW5wdXQgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCBpdGVtc1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PGFueT4+KFtdKTtcbiAgcHJvdGVjdGVkIHNob3dMaXN0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIHBvc2l0aW9uTGlzdCA9IHNpZ25hbDxUWVBFX1BPUE9WRVJfRElSRUNUSU9OIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQga2V5c1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PHVua25vd24+PihbXSk7XG4gIHByb3RlY3RlZCBkaXNhYmxlV2hlbk1heEl0ZW0gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgZm9jdXMgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgZXJyb3IgPSBzaWduYWw8SVZhbGlkIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgZmllbGRLZXkgPSBzaWduYWw8c3RyaW5nPignaWQnKTtcbiAgcHJvdGVjdGVkIGZ1bmN0aW9uR2V0SXRlbUF1dG9BZGRMaXN0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICghdGhpcy5lbnRlckF1dG9BZGRUYWdUb0xpc3QoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gKCkgPT4gdGhpcy5pdGVtc1NlbGVjdGVkKCkuZmlsdGVyKGl0ZW0gPT4gYCR7Z2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSwgJycpfWAuc2VhcmNoKHRoaXMuZmFrZUlkKCkpID09PSAwKS5yZXZlcnNlKCk7XG4gIH0pO1xuXG4gIHByaXZhdGUgZmFrZUlkID0gc2lnbmFsPHN0cmluZz4odXVpZCgpKTtcbiAgcHJpdmF0ZSB0aW1lT3V0RmxhZyA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgdGltZU91dENoYW5nZVNlYXJjaCA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgdGltZU91dENoZWNrVmlld0NoYW5nZSA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgdGltZW91dENsaWNrT3V0c2lkZSA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgY2xpZW50SGVpZ2h0ID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBpdGVtc09mTGlzdCA9IHNpZ25hbDxBcnJheTx1bmtub3duPj4oW10pO1xuICBwcml2YXRlIGtleVNlYXJjaENoYW5nZSA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBrZXlTZWFyY2hDaGFuZ2VTdWIgPSBzaWduYWw8U3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHRlbXBJZ25vcmVFbWl0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBwb3BvdmVyRnVuY3Rpb25Db250cm9sID0gc2lnbmFsPElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgaW5wdXRGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8SUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgdHlwZVBvcG92ZXIgPSBzaWduYWw8VFlQRV9QT1BPVkVSX0VWRU5UIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGxpc3RGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8SUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBkZWZhdWx0SXRlbXNTZWxlY3RlZEN1cnJlbnQgPSBzaWduYWw8QXJyYXk8dW5rbm93bj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZVBvcG92ZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGVudGVyQXV0b0FkZFRhZ1RvTGlzdCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgY2hlY2tFeGl0SXNMYWJlbEluY2x1ZGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjaGVja0V4aXRCeUZpZWxkcyA9IGlucHV0PEFycmF5PHN0cmluZz4+KCk7XG4gIHJlYWRvbmx5IHBhcmVudEJvcmRlcldpZHRoID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBmdW5jdGlvbkNoZWNrUGVybWlzc2lvbkNyZWF0ZVRhZyA9IGlucHV0PCgpID0+IGJvb2xlYW4+KCgpID0+IHRydWUpO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMgPSBpbnB1dDxJSHR0cFJlcXVlc3RDb25maWc+KCk7XG4gIHJlYWRvbmx5IGZpZWxkTGFiZWwgPSBpbnB1dDxzdHJpbmc+KCdsYWJlbCcpO1xuICByZWFkb25seSBtYXhJdGVtSW5wdXQgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnID0gaW5wdXQ8SVRhZ3NDb25maWc+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxhYmVsQ29uZmlnID0gaW5wdXQ8SUxhYmVsPigpO1xuICByZWFkb25seSBkZWZhdWx0SXRlbXNTZWxlY3RlZCA9IGlucHV0PEFycmF5PHVua25vd24+PigpO1xuICByZWFkb25seSBkZWZhdWx0S2V5c1NlbGVjdGVkID0gaW5wdXQ8QXJyYXk8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IGxpc3RTZWFyY2hDb25maWcgPSBpbnB1dDxJSW5wdXRTZWFyY2hDb25maWc+KCk7XG4gIHJlYWRvbmx5IGlzU2VhcmNoT25saW5lID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBsaXN0U2VhcmNoUGFkZGluZyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpc3REaXZpZGVyQ2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsaXN0Q29uZmlnID0gaW5wdXQ8SUxpc3RDb25maWdJdGVtPigpO1xuICByZWFkb25seSBsaXN0QnV0dG9uc090aGVyID0gaW5wdXQ8QXJyYXk8SUJ1dHRvbj4+KCk7XG4gIHJlYWRvbmx5IGxpc3RDbGlja0V4YWN0bHkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0QmFja2dyb3VuZExpc3RDdXN0b20gPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxpc3RNYXhJdGVtU2hvdyA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgbGlzdEhpZGRlbklucHV0U2VhcmNoV2hlbkhhc1NlYXJjaENvbmZpZyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHJlbW92ZVRleHRTZWFyY2hXaGVuQmx1cklucHV0ID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGtleXNIaWRkZW5JdGVtID0gbW9kZWw8QXJyYXk8dW5rbm93bj4+KClcbiAgcmVhZG9ubHkga2V5c0Rpc2FibGVJdGVtID0gaW5wdXQ8QXJyYXk8dW5rbm93bj4+KClcbiAgcmVhZG9ubHkgaWdub3JlRW1pdFdoZW5TYW1lRGF0YVNlbGVjdGVkID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgc2luZ2xlU2VsZWN0ZWQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVUYWdJdGVtID0gaW5wdXQ8c3RyaW5nPigpXG4gIHJlYWRvbmx5IGNsYXNzSWNvblJlbW92ZVRhZ0l0ZW0gPSBpbnB1dDxzdHJpbmc+KClcbiAgcmVhZG9ubHkgc2hvd0JvcmRlckFjdGl2ZVdoZW5Gb2N1c0lucHV0ID0gaW5wdXQ8Ym9vbGVhbj4oKVxuICByZWFkb25seSBmaWVsZEdldEltYWdlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpbWFnZVNpemUgPSBpbnB1dDxUWVBFX1NJWkVfQVZBVEFSX0NPTkZJRz4oMTYpO1xuICByZWFkb25seSBmaWVsZEdldFRleHRBdmF0YXIgPSBpbnB1dDxzdHJpbmc+KCd1c2VyJyk7XG4gIHJlYWRvbmx5IGNsYXNzQXZhdGFySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZ2V0TGFzdFRleHRBZnRlclNwYWNlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElWYWxpZD4oKTtcbiAgcmVhZG9ubHkgdmFsaWRNYXhJdGVtU2VsZWN0ZWQgPSBpbnB1dDxJVmFsaWRNYXhJdGVtU2VsZWN0ZWQ+KCk7XG4gIHJlYWRvbmx5IHZhbGlkUGF0dGVybiA9IGlucHV0PEFycmF5PElWYWxpZFBhdHRlcm4+PigpO1xuICByZWFkb25seSBzaG93TGlzdEJlbGxvdyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGhpZGRlbklucHV0V2hlblJlYWRvbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRTZWxlY3RNdWx0aUl0ZW0gPSBvdXRwdXQ8QXJyYXk8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IG91dFZhbGlkRXZlbnQgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJVGFnc0Z1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRDbGlja0J1dHRvbk90aGVyID0gb3V0cHV0PElCdXR0b24+KCk7XG4gIHJlYWRvbmx5IG91dFNob3dMaXN0RXZlbnQgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSA9IG91dHB1dDxJRmxhZ01vdXNlPigpO1xuICByZWFkb25seSBvdXRMb2FkaW5nR2V0RGV0YWlsU2VsZWN0ZWQgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFnc0VsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY+KCd0YWdzRWwnKTtcblxuICAvKiBJTkpFQ1QqL1xuICBwcml2YXRlIGh0dHBSZXF1ZXN0U2VydmljZSA9IGluamVjdChMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBtYXhJdGVtSW5wdXQgPSB0aGlzLm1heEl0ZW1JbnB1dCgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5kaXNhYmxlV2hlbk1heEl0ZW0uc2V0KGZhbHNlKTtcbiAgICAgICAgaWYgKG1heEl0ZW1JbnB1dCAmJiBtYXhJdGVtSW5wdXQgPD0gdGhpcy5pdGVtc1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlV2hlbk1heEl0ZW0uc2V0KHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGxpc3RDb25maWcgPSB0aGlzLmxpc3RDb25maWcoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmIChsaXN0Q29uZmlnKSB7XG4gICAgICAgICAgdGhpcy5maWVsZEtleS5zZXQoZ2V0RmllbGRLZXlCeVR5cGUobGlzdENvbmZpZywgJ2lkJykpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEl0ZW1zID0gdGhpcy5kZWZhdWx0SXRlbXNTZWxlY3RlZCgpIHx8IFtdO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtcyA9IHRoaXMuZGVmYXVsdEl0ZW1zU2VsZWN0ZWRDdXJyZW50KCkgfHwgW107XG4gICAgICAgIHRoaXMuZGVmYXVsdEl0ZW1zU2VsZWN0ZWRDdXJyZW50LnNldCh0aGlzLmRlZmF1bHRJdGVtc1NlbGVjdGVkKCkpO1xuICAgICAgICBpZiAocHJldmlvdXNJdGVtcy5sZW5ndGggIT09IGN1cnJlbnRJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1zU2VsZWN0ZWQoY3VycmVudEl0ZW1zKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwcmV2SXRlbSBvZiBwcmV2aW91c0l0ZW1zKSB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50SXRlbXMuc29tZShpdGVtID0+IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpID09PSBnZXQocHJldkl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1zU2VsZWN0ZWQoY3VycmVudEl0ZW1zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmRlZmF1bHRLZXlzU2VsZWN0ZWQoKSB8fCBbXTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLmtleXNTZWxlY3RlZCgpIHx8IFtdO1xuICAgICAgICBpZiAocHJldmlvdXNWYWx1ZS5sZW5ndGggIT09IGN1cnJlbnRWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmdldERldGFpbEJ5SWRzKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleXNOZXcgPSBjdXJyZW50VmFsdWUuZmlsdGVyKGtleSA9PiAhdGhpcy5pdGVtc1NlbGVjdGVkKCkuc29tZShpdGVtID0+IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCksICcnKSA9PT0ga2V5KSk7XG4gICAgICAgIGlmIChrZXlzTmV3Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZ2V0RGV0YWlsQnlJZHMoa2V5c05ldyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5jb25maWcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcyA9IHRoaXMuaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMoKTtcbiAgICBpZiAoaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMgJiYgKCFodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcy5ndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSB8fCAhaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMuZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWU/LmRldGFpbEJ5SWQpKSB7XG4gICAgICB0aHJvdyAnQ29uZmlnIGdldERldGFpbEJ5SWRzIHnDqnUgY+G6p3UgdOG7kWkgdGhp4buDdSBjw6FjIHRoYW0gc+G7kSAgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUsIGRldGFpbEJ5SWQnO1xuICAgIH1cbiAgICBjb25zdCBwcmVwcm9jZXNzb3IgPSAoa2V5czogQXJyYXk8dW5rbm93bj4pID0+IHtcbiAgICAgIGlmICgha2V5cyB8fCAhKGtleXMgaW5zdGFuY2VvZiBBcnJheSkgfHwgIWtleXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXlzLmpvaW4oJzsnKTtcbiAgICB9O1xuICAgIGlmIChodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcz8uZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWU/LmRldGFpbEJ5SWQpIHtcbiAgICAgIGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzLmd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLmRldGFpbEJ5SWQuZmllbGRHZXRWYWx1ZSA9IGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzLmd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLmRldGFpbEJ5SWQuZmllbGRHZXRWYWx1ZSA/PyAna2V5cyc7XG4gICAgICBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcy5ndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5kZXRhaWxCeUlkLnByZXByb2Nlc3NvciA9IGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzLmd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLmRldGFpbEJ5SWQucHJlcHJvY2Vzc29yID8/IHByZXByb2Nlc3NvcjtcbiAgICB9XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLmNoZWNrVmFsaWQuYmluZCh0aGlzKSxcbiAgICAgIHJlbW92ZUxpc3Q6IGFzeW5jICgpID0+IHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpLFxuICAgICAgdXBkYXRlTGFiZWw6IHRoaXMudXBkYXRlTGFiZWwuYmluZCh0aGlzKSxcbiAgICAgIGNsZWFySXRlbVNlbGVjdGVkOiB0aGlzLmNsZWFySXRlbVNlbGVjdGVkLmJpbmQodGhpcyksXG4gICAgICBjbGVhcktleVNlYXJjaDogKCkgPT4gdGhpcy5oYW5kbGVyVmFsdWVDaGFuZ2VTZWFyY2goJycpLFxuICAgICAgZm9jdXNJbnB1dDogKCkgPT4gdGhpcy5mb2N1c0lucHV0KCksXG4gICAgICBnZXRGYWtlSWQ6IGFzeW5jICgpID0+IHRoaXMuZmFrZUlkKCksXG4gICAgICBjcmVhdGVUYWc6IHRoaXMuaGFuZGxlckVudGVyRXZlbnQuYmluZCh0aGlzKSxcbiAgICAgIHJlbW92ZUl0ZW1TZWxlY3RlZDogdGhpcy5oYW5kbGVyUmVtb3ZlSXRlbVNlbGVjdGVkLmJpbmQodGhpcyksXG4gICAgICByZXNldEVycm9yOiB0aGlzLnJlc2V0RXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIHJlc2V0VG9EZWZhdWx0RGF0YVNlbGVjdGVkOiB0aGlzLnJlc2V0VG9EZWZhdWx0RGF0YVNlbGVjdGVkLmJpbmQodGhpcyksXG4gICAgICB1cGRhdGVJdGVtU2VsZWN0ZWREaXNhYmxlOiB0aGlzLnVwZGF0ZUl0ZW1TZWxlY3RlZERpc2FibGUuYmluZCh0aGlzKSxcbiAgICAgIHJlZnJlc2hMaXN0RGF0YTogdGhpcy5yZWZyZXNoTGlzdERhdGEuYmluZCh0aGlzKSxcbiAgICAgIHNldEVycm9yOiB0aGlzLnNldEVycm9yLmJpbmQodGhpcylcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0RXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lcnJvci5zZXQoeyBtZXNzYWdlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQoZXZlbnQ6IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2wuc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlTGFiZWwoKSB7XG4gICAgaWYgKCF0aGlzLml0ZW1zU2VsZWN0ZWQoKSB8fCAhdGhpcy5pdGVtc1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHRoaXMudXBkYXRlRmllbGRMYWJlbChpdGVtKSk7XG4gICAgICByZXR1cm4gWy4uLml0ZW1zXVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWVsZExhYmVsKGl0ZW06IHVua25vd24pIHtcbiAgICBjb25zdCByZWYgPSBnZXQoaXRlbSwgJ3JlZicpIHx8IGl0ZW07XG4gICAgY29uc3QgZ2V0VmFsdWUgPSB0aGlzLmNvbmZpZygpPy5nZXRWYWx1ZTtcbiAgICBzZXQoaXRlbSwgJ2ZpZWxkTGFiZWwnLCBgJHtnZXQocmVmLCB0aGlzLmZpZWxkTGFiZWwoKSkgfHwgcmVmLmxhYmVsIHx8IHJlZi5uYW1lIHx8ICcgJ31gKTtcbiAgICBpZiAoZ2V0VmFsdWUpIHtcbiAgICAgIHNldChpdGVtLCAnZmllbGRMYWJlbCcsIGdldFZhbHVlKHJlZikgfHwgJyAnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsZWFySXRlbVNlbGVjdGVkKGlnbm9yZVZhbGlkID0gZmFsc2UpIHtcbiAgICBpZiAoIXRoaXMuaXRlbXNTZWxlY3RlZCgpIHx8ICF0aGlzLml0ZW1zU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5pdGVtc1NlbGVjdGVkKCkubGVuZ3RoIC0gMTtcbiAgICB0aGlzLnRlbXBJZ25vcmVFbWl0LnNldCh0cnVlKTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgICAgdGhpcy50ZW1wSWdub3JlRW1pdC5zZXQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVyUmVtb3ZlSXRlbVNlbGVjdGVkKHsgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7IHJldHVybiB9IH0gYXMgRXZlbnQsIGl0ZW0sIGlnbm9yZVZhbGlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSXRlbXNTZWxlY3RlZChpdGVtc1NlbGVjdGVkOiBBcnJheTx1bmtub3duPiwgaWdub3JlVmFsaWRhdGUgPSB0cnVlLCBpZ25vcmVFbWl0S2V5U2VsZWN0ZWRXaGVuSXRlbXNOb3RFeGl0c0VtcHR5PzogYm9vbGVhbikge1xuICAgIGlmICghaXRlbXNTZWxlY3RlZCB8fCAhaXRlbXNTZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNOb3RFeGl0czogQXJyYXk8dW5rbm93bj4gPSBbXTtcbiAgICBpdGVtc1NlbGVjdGVkLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGZpZWxkTGFiZWwgPSBgJHtnZXQoaXRlbSwgdGhpcy5maWVsZExhYmVsKCkpIHx8IGdldChpdGVtLCAnbGFiZWwnKSB8fCBnZXQoaXRlbSwgJ25hbWUnKSB8fCAnICd9YDtcbiAgICAgIGNvbnN0IGdldFZhbHVlID0gdGhpcy5jb25maWcoKT8uZ2V0VmFsdWU7XG4gICAgICBpZiAoZ2V0VmFsdWUpIHtcbiAgICAgICAgZmllbGRMYWJlbCA9IGdldFZhbHVlKGl0ZW0pIHx8ICcgJztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1FeGl0cyA9IHRoaXMuY2hlY2tFeGl0cyhmaWVsZExhYmVsLCBnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpKSk7XG4gICAgICBpZiAoaXRlbUV4aXRzPy5pc0l0ZW1TZWxlY3RlZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGl0ZW1FeGl0cy5pdGVtLCBpdGVtKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXRlbXNOb3RFeGl0cy5wdXNoKGl0ZW0pO1xuICAgIH0pO1xuICAgIHRoaXMucHJvY2Vzc0RhdGEoaXRlbXNOb3RFeGl0cywgaWdub3JlVmFsaWRhdGUsIGlnbm9yZUVtaXRLZXlTZWxlY3RlZFdoZW5JdGVtc05vdEV4aXRzRW1wdHkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJQb3BvdmVyRXZlbnQodHlwZTogVFlQRV9QT1BPVkVSX0VWRU5UKSB7XG4gICAgdGhpcy50eXBlUG9wb3Zlci5zZXQodHlwZSk7XG4gICAgaWYgKHR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdyZW1vdmUnKSB7XG4gICAgICB0aGlzLnNob3dMaXN0LnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dFNob3dMaXN0RXZlbnQuZW1pdChmYWxzZSk7XG4gICAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCk/LmJsdXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaG93TGlzdC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5vdXRTaG93TGlzdEV2ZW50LmVtaXQodHJ1ZSk7XG4gICAgdGhpcy5pbnB1dEZ1bmN0aW9uQ29udHJvbCgpPy5mb2N1cygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJQb3BvdmVyQ29udGVudEV2ZW50KHBvc2l0aW9uOiBUWVBFX1BPUE9WRVJfRElSRUNUSU9OKSB7XG4gICAgaWYgKHRoaXMucG9zaXRpb25MaXN0KCkgPT09IHBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucG9zaXRpb25MaXN0LnNldChwb3NpdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclJlbW92ZUl0ZW1TZWxlY3RlZChldmVudDogRXZlbnQsIGl0ZW1SZW1vdmU6IHVua25vd24sIGlnbm9yZVZhbGlkPzogYm9vbGVhbikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZmxhZ01vdXNlLnNldCh7IGlzTW91c2VFbnRlcjogdHJ1ZSwgaXNNb3VzZUVudGVyQ29udGVudDogdHJ1ZSB9KTtcbiAgICB0aGlzLnRpbWVPdXRGbGFnLnNldChzZXRUaW1lb3V0KCgpID0+IHRoaXMuZmxhZ01vdXNlLnNldCh7IGlzTW91c2VFbnRlcjogZmFsc2UsIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlIH0pLCAyNTApKTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQudXBkYXRlKGl0ZW1zID0+IGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IGtleVJlbW92ZSA9IGdldChpdGVtUmVtb3ZlLCB0aGlzLmZpZWxkS2V5KCkpO1xuICAgICAgY29uc3Qga2V5SXRlbSA9IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpO1xuICAgICAgY29uc3QgbGFiZWxSZW1vdmUgPSBnZXQoaXRlbVJlbW92ZSwgJ2ZpZWxkTGFiZWwnKS50cmltKCk7XG4gICAgICBjb25zdCBsYWJlbEl0ZW0gPSBnZXQoaXRlbSwgJ2ZpZWxkTGFiZWwnKS50cmltKCk7XG5cbiAgICAgIHJldHVybiAoaXNOaWwoa2V5UmVtb3ZlKSB8fCBpc05pbChrZXlJdGVtKSkgJiYgbGFiZWxSZW1vdmUgIT09IGxhYmVsSXRlbSB8fCAoIWlzTmlsKGtleVJlbW92ZSkgJiYgIWlzTmlsKGtleUl0ZW0pICYmIGtleVJlbW92ZSAhPT0ga2V5SXRlbSlcbiAgICB9KSk7XG4gICAgaWYgKGl0ZW1SZW1vdmUgJiYgIWlzTmlsKGdldChpdGVtUmVtb3ZlLCB0aGlzLmZpZWxkS2V5KCkpKSAmJiBgJHtnZXQoaXRlbVJlbW92ZSwgdGhpcy5maWVsZEtleSgpKX1gLnNlYXJjaCh0aGlzLmZha2VJZCgpKSA+PSAwKSB7XG4gICAgICB0aGlzLmtleXNIaWRkZW5JdGVtLnVwZGF0ZShpdGVtcyA9PiAoQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5pdGVtcyB8fCBbXSwgZ2V0KGl0ZW1SZW1vdmUsIHRoaXMuZmllbGRLZXkoKSldKSkpKTtcbiAgICB9XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KEFycmF5LmZyb20obmV3IFNldCh0aGlzLml0ZW1zU2VsZWN0ZWQoKS5tYXAoaXRlbSA9PiBnZXQoaXRlbSwgYHJlZi4ke3RoaXMuZmllbGRLZXkoKX1gKSkpKSk7XG4gICAgdGhpcy5kaXNhYmxlV2hlbk1heEl0ZW0uc2V0KGZhbHNlKTtcbiAgICBjb25zdCBtYXhJdGVtSW5wdXQgPSB0aGlzLm1heEl0ZW1JbnB1dCgpO1xuICAgIGlmIChtYXhJdGVtSW5wdXQgJiYgbWF4SXRlbUlucHV0IDw9IHRoaXMuaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgdGhpcy5kaXNhYmxlV2hlbk1heEl0ZW0uc2V0KHRydWUpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2hvd0xpc3QoKSkge1xuICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUl0ZW0uZW1pdCh0aGlzLmdldEl0ZW1TZWxlY3RlZCgpKTtcbiAgICAgIHRoaXMuY2hlY2tWaWV3Q2hhbmdlKHRydWUsIGlnbm9yZVZhbGlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd0xpc3QoKSkge1xuICAgICAgdGhpcy50ZW1wSWdub3JlRW1pdC5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIGlmICghaWdub3JlVmFsaWQpIHtcbiAgICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICAgIH1cbiAgICB0aGlzLnRlbXBJZ25vcmVFbWl0LnNldChmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlcklucHV0RnVuY3Rpb25Db250cm9sKGV2ZW50OiBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMuaW5wdXRGdW5jdGlvbkNvbnRyb2wuc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRm9jdXNBbmRCbHVyRXZlbnQoZXZlbnQ6IElGb2N1c0FuZEJsdXJFdmVudCkge1xuICAgIHRoaXMuZm9jdXMuc2V0KGZhbHNlKTtcbiAgICBpZiAoZXZlbnQubmFtZSA9PT0gJ2ZvY3VzJykge1xuICAgICAgdGhpcy5mb2N1cy5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIGlmIChldmVudC5uYW1lID09PSAnYmx1cicgJiYgdGhpcy50eXBlUG9wb3ZlcigpPy5pbmNsdWRlcygnbW91c2VsZWF2ZScpICYmIHRoaXMudmFsaWRSZXF1aXJlZCgpICYmICghdGhpcy5pdGVtc1NlbGVjdGVkKCkgfHwgIXRoaXMuaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCkpIHtcbiAgICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tPdXRzaWRlKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRDbGlja091dHNpZGUoKSk7XG4gICAgdGhpcy50aW1lb3V0Q2xpY2tPdXRzaWRlLnNldChzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3dMaXN0KCkgfHwgIXRoaXMucmVtb3ZlVGV4dFNlYXJjaFdoZW5CbHVySW5wdXQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlSW5wdXQuc2V0KCcnKTtcbiAgICAgIHRoaXMua2V5U2VhcmNoLnNldCgnJyk7XG4gICAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCk/LnJlc2V0VmFsdWUoKTtcbiAgICB9LCAyNTApKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRW50ZXJFdmVudCgpIHtcbiAgICBpZiAoIXRoaXMudmFsdWVJbnB1dCgpIHx8ICFgJHt0aGlzLnZhbHVlSW5wdXQoKX1gLnRyaW0oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcoKT8uaWdub3JlRW50ZXJDcmVhdGVOZXdJdGVtKSB7XG4gICAgICBjb25zdCBpdGVtRXhpdHMgPSB0aGlzLmNoZWNrRXhpdHMoKTtcbiAgICAgIGlmICghaXRlbUV4aXRzIHx8IGl0ZW1FeGl0cy5pc0l0ZW1TZWxlY3RlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnByb2Nlc3NEYXRhKFtpdGVtRXhpdHMuaXRlbV0pO1xuICAgICAgdGhpcy5oYW5kbGVyVmFsdWVDaGFuZ2VTZWFyY2goJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZnVuY3Rpb25DaGVja1Blcm1pc3Npb25DcmVhdGVUYWcoKSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1FeGl0cyA9IHRoaXMuY2hlY2tFeGl0cygpO1xuICAgIGNvbnN0IHZhbHVlSW5wdXQgPSBgJHt0aGlzLnZhbHVlSW5wdXQoKX1gLnRyaW0oKTtcbiAgICBjb25zdCBuZXdJdGVtID0geyBbdGhpcy5maWVsZExhYmVsKCldOiB2YWx1ZUlucHV0IH07XG4gICAgaWYgKHRoaXMuZmllbGRLZXkoKSkge1xuICAgICAgc2V0KG5ld0l0ZW0sIHRoaXMuZmllbGRLZXkoKSwgYCR7dGhpcy5mYWtlSWQoKX0ke3ZhbHVlSW5wdXR9JHt1dWlkKCl9YCk7XG4gICAgfVxuICAgIGlmICghaXRlbUV4aXRzKSB7XG4gICAgICBpZiAodGhpcy5jaGVja1BhdHRlcm4oW25ld0l0ZW1dKSkge1xuICAgICAgICBjb25zdCBpdGVtQnVpbGRWYWx1ZSA9IHsgLi4ubmV3SXRlbSB9O1xuICAgICAgICBjb25zdCBidWlsZFZhbHVlID0gdGhpcy5jb25maWcoKT8uYnVpbGRWYWx1ZTtcbiAgICAgICAgaWYgKGJ1aWxkVmFsdWUpIHtcbiAgICAgICAgICBidWlsZFZhbHVlKGl0ZW1CdWlsZFZhbHVlLCBuZXdJdGVtW3RoaXMuZmllbGRMYWJlbCgpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3SXRlbVt0aGlzLmZpZWxkTGFiZWwoKV0gPSBpdGVtQnVpbGRWYWx1ZVt0aGlzLmZpZWxkTGFiZWwoKV07XG4gICAgICAgIGlmICh0aGlzLmVudGVyQXV0b0FkZFRhZ1RvTGlzdCgpKSB7XG4gICAgICAgICAgdGhpcy5saXN0RnVuY3Rpb25Db250cm9sKCk/LnVwZGF0ZURhdGEoeyBuZXdEYXRhOiBzaWduYWwoW3NpZ25hbChuZXdJdGVtKV0pLCBmdW5jdGlvbkN1c3RvbUFkZERhdGFUb1N0b3JlOiAobmV3RGF0YSwgc3RvcmUpID0+IHN0b3JlLnVwZGF0ZSh2YWx1ZSA9PiAoWy4uLm5ld0RhdGEoKSwgLi4udmFsdWVdKSkgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2Nlc3NEYXRhKFtuZXdJdGVtXSk7XG4gICAgICAgIHRoaXMuaGFuZGxlclZhbHVlQ2hhbmdlU2VhcmNoKCcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGl0ZW1FeGl0cy5pc0l0ZW1TZWxlY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByb2Nlc3NEYXRhKFtpdGVtRXhpdHMuaXRlbV0pO1xuICAgIHRoaXMuaGFuZGxlclZhbHVlQ2hhbmdlU2VhcmNoKCcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyVmFsdWVDaGFuZ2VTZWFyY2godmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHRoaXMudmFsdWVJbnB1dC5zZXQoYCR7dmFsdWV9YCk7XG4gICAgaWYgKCFgJHt2YWx1ZSB8fCAnJ31gLnRyaW0oKSkge1xuICAgICAgdGhpcy5rZXlTZWFyY2hDaGFuZ2VTdWIoKT8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMua2V5U2VhcmNoQ2hhbmdlU3ViLnNldCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy50aW1lT3V0Q2hhbmdlU2VhcmNoLnNldChzZXRUaW1lb3V0KCgpID0+IHRoaXMua2V5U2VhcmNoLnNldCgnJykpKTtcbiAgICAgIGlmICghdGhpcy5jb25maWcoKT8uaWdub3JlRW50ZXJDcmVhdGVOZXdJdGVtKSB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcoKT8uaWdub3JlSW5wdXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmtleVNlYXJjaENoYW5nZVN1YigpKSB7XG4gICAgICB0aGlzLnNldEV2ZW50S2V5U2VhcmNoKCk7XG4gICAgfVxuICAgIHRoaXMua2V5U2VhcmNoQ2hhbmdlLm5leHQoYCR7KHZhbHVlIHx8ICcnKX1gLnRyaW0oKSk7XG4gIH1cblxuICBwcml2YXRlIHNldEV2ZW50S2V5U2VhcmNoKCkge1xuICAgIGlmICh0aGlzLmtleVNlYXJjaENoYW5nZVN1YigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMua2V5U2VhcmNoQ2hhbmdlU3ViLnNldCh0aGlzLmtleVNlYXJjaENoYW5nZS5waXBlKGRlYm91bmNlVGltZSgxNTAwKSwgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMua2V5U2VhcmNoLnNldChgJHsodmFsdWUgfHwgJycpfWAudHJpbSgpKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRGF0YShpdGVtczogQXJyYXk8dW5rbm93bj4sIGlnbm9yZVZhbGlkYXRlID0gZmFsc2UsIGlnbm9yZUVtaXRLZXlTZWxlY3RlZFdoZW5JdGVtc05vdEV4aXRzRW1wdHk/OiBib29sZWFuKSB7XG4gICAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpdGVtc1NlbGVjdGVkID0gdGhpcy5nZXRJdGVtU2VsZWN0ZWQoKTtcbiAgICAgIGlmICghaWdub3JlRW1pdEtleVNlbGVjdGVkV2hlbkl0ZW1zTm90RXhpdHNFbXB0eSkge1xuICAgICAgICB0aGlzLm91dFNlbGVjdE11bHRpSXRlbS5lbWl0KGl0ZW1zU2VsZWN0ZWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KEFycmF5LmZyb20obmV3IFNldChpdGVtc1NlbGVjdGVkPy5tYXAoaXRlbSA9PiBnZXQoaXRlbSwgYHJlZi4ke3RoaXMuZmllbGRLZXkoKX1gKSkpKSk7XG4gICAgICB0aGlzLmNoZWNrVmlld0NoYW5nZShmYWxzZSwgaWdub3JlVmFsaWRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc01hcHBpbmcgPSBpdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICBjb25zdCByZWYgPSBnZXQoaXRlbSwgJ3JlZicpIHx8IGl0ZW07XG4gICAgICBpdGVtID0gY2xvbmVEZWVwKHJlZik7XG4gICAgICBzZXQoaXRlbSwgJ3JlZicsIHJlZik7XG4gICAgICB0aGlzLnVwZGF0ZUZpZWxkTGFiZWwoaXRlbSk7XG4gICAgICBjb25zdCBnZXREaXNhYmxlSXRlbSA9IHRoaXMuY29uZmlnKCk/LmdldERpc2FibGVJdGVtO1xuICAgICAgY29uc3QgZ2V0U3R5bGVzID0gdGhpcy5jb25maWcoKT8uZ2V0U3R5bGVzO1xuICAgICAgY29uc3QgZ2V0U3R5bGVzVGFnU3BlY2lmaWMgPSB0aGlzLmNvbmZpZygpPy5nZXRTdHlsZXNUYWdTcGVjaWZpYztcbiAgICAgIGlmIChnZXREaXNhYmxlSXRlbSkge1xuICAgICAgICBzZXQoaXRlbSwgJ2Rpc2FibGVJdGVtJywgZ2V0RGlzYWJsZUl0ZW0oaXRlbSkpO1xuICAgICAgfVxuICAgICAgaWYgKGdldFN0eWxlcykge1xuICAgICAgICBzZXQoaXRlbSwgJ25nU3R5bGVzJywgZ2V0U3R5bGVzKGl0ZW0pKTtcbiAgICAgIH1cbiAgICAgIGlmIChnZXRTdHlsZXNUYWdTcGVjaWZpYykge1xuICAgICAgICBjb25zdCB0eXBlID0gZ2V0U3R5bGVzVGFnU3BlY2lmaWMoaXRlbSk7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3BlY2lmaWNfdmlvbGV0X2NvbG9yJykge1xuICAgICAgICAgIHNldChpdGVtLCAnbmdTdHlsZXMnLCB7IGNvbG9yOiAnIzcyMzlFQScsIGJhY2tncm91bmRDb2xvcjogJyNGMUVCRkQnIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQudXBkYXRlKGl0ZW1zID0+IFsuLi5pdGVtcywgLi4uaXRlbXNNYXBwaW5nXSk7XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KEFycmF5LmZyb20obmV3IFNldCh0aGlzLml0ZW1zU2VsZWN0ZWQoKS5tYXAoaXRlbSA9PiBnZXQoaXRlbSwgYHJlZi4ke3RoaXMuZmllbGRLZXkoKX1gKSkpKSk7XG4gICAgdGhpcy5vdXRTZWxlY3RNdWx0aUl0ZW0uZW1pdCh0aGlzLmdldEl0ZW1TZWxlY3RlZCgpKTtcbiAgICB0aGlzLmNoZWNrVmlld0NoYW5nZShmYWxzZSwgaWdub3JlVmFsaWRhdGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEYXRhQ2hhbmdlKGl0ZW1zOiBBcnJheTx1bmtub3duPikge1xuICAgIHRoaXMuaXRlbXNPZkxpc3Quc2V0KGl0ZW1zKTtcbiAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8udXBkYXRlUG9wb3Zlck92ZXJsYXlQb3NpdGlvbigpO1xuICAgIGlmICghdGhpcy5jb25maWcoKT8uaWdub3JlSW5wdXQpIHtcbiAgICAgIHRoaXMuaW5wdXRGdW5jdGlvbkNvbnRyb2woKT8uZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckxvYWRpbmcoZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tWaWV3Q2hhbmdlKGlnbm9yZVNjcm9sbEJvdHRvbTogYm9vbGVhbiwgaWdub3JlVmFsaWRhdGUgPSBmYWxzZSkge1xuICAgIHRoaXMuZGlzYWJsZVdoZW5NYXhJdGVtLnNldChmYWxzZSk7XG4gICAgY29uc3QgbWF4SXRlbUlucHV0ID0gdGhpcy5tYXhJdGVtSW5wdXQoKTtcbiAgICBpZiAobWF4SXRlbUlucHV0ICYmIG1heEl0ZW1JbnB1dCA8PSB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZGlzYWJsZVdoZW5NYXhJdGVtLnNldCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy50aW1lT3V0Q2hlY2tWaWV3Q2hhbmdlLnNldCgoc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBzY3JvbGxIZWlnaHQgPSB0aGlzLnRhZ3NFbCgpPy5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIGlmICghaXNOaWwoc2Nyb2xsSGVpZ2h0KSAmJiB0aGlzLmNsaWVudEhlaWdodCgpICE9PSBzY3JvbGxIZWlnaHQgJiYgdGhpcy5wb3NpdGlvbkxpc3QoKSAhPT0gJ3RvcCcpIHtcbiAgICAgICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnVwZGF0ZVBvcG92ZXJPdmVybGF5UG9zaXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGlmICghaWdub3JlU2Nyb2xsQm90dG9tICYmIHRoaXMudGFnc0VsKCkgJiYgdGhpcy50YWdzRWwoKS5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMudGFnc0VsKCkubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xpZW50SGVpZ2h0LnNldChzY3JvbGxIZWlnaHQpO1xuICAgIH0sIDI1MCkpKTtcbiAgICBpZiAoIWlnbm9yZVZhbGlkYXRlKSB7XG4gICAgICB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRXhpdHMobGFiZWw/OiBzdHJpbmcsIGlkPzogc3RyaW5nKSB7XG4gICAgbGV0IGl0ZW1FeGl0cztcbiAgICBpZiAoIWlzTmlsKGlkKSAmJiAhYCR7aWR9YC5pbmNsdWRlcyh0aGlzLmZha2VJZCgpKSAmJiB0aGlzLmZpZWxkS2V5KCkpIHtcbiAgICAgIGl0ZW1FeGl0cyA9IHRoaXMuaXRlbXNTZWxlY3RlZCgpLmZpbmQoaXRlbSA9PiAhaXNOaWwoZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSkpICYmIGAke2dldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWAudHJpbSgpID09PSBgJHtpZH1gKTtcbiAgICAgIGlmIChpdGVtRXhpdHMpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbTogaXRlbUV4aXRzLCBpc0l0ZW1TZWxlY3RlZDogISFpdGVtRXhpdHMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFsYWJlbCkge1xuICAgICAgbGFiZWwgPSBgJHsodGhpcy52YWx1ZUlucHV0KCkgfHwgJycpfWAudHJpbSgpO1xuICAgIH1cbiAgICBpdGVtRXhpdHMgPSB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5maW5kKGl0ZW0gPT4gIWlzTmlsKGdldChpdGVtLCAnZmllbGRMYWJlbCcpKSAmJiAoZ2V0KGl0ZW0sICdmaWVsZExhYmVsJykudHJpbSgpID09PSBsYWJlbD8udHJpbSgpKSB8fCAodGhpcy5jaGVja0V4aXRJc0xhYmVsSW5jbHVkZSgpICYmIGdldChpdGVtLCAnZmllbGRMYWJlbCcpLnRyaW0oKS5pbmNsdWRlcyhsYWJlbD8udHJpbSgpKSkgfHwgKHRoaXMuY2hlY2tFeGl0QnlGaWVsZHMoKSAmJiB0aGlzLmNoZWNrRXhpdEJ5RmllbGRzKCk/LnNvbWUoZmllbGQgPT4gZ2V0KGl0ZW0sIGZpZWxkKT8udHJpbSgpID09PSBsYWJlbD8udHJpbSgpIHx8IGdldChpdGVtLCBmaWVsZCk/LnRyaW0oKSA9PT0gZXNjYXBlSHRtbChsYWJlbD8udHJpbSgpIHx8ICcnKSB8fCBlc2NhcGVIdG1sKGdldChpdGVtLCBmaWVsZCk/LnRyaW0oKSB8fCAnICcpID09PSBlc2NhcGVIdG1sKGxhYmVsPy50cmltKCkgfHwgJycpKSkpO1xuICAgIGlmIChpdGVtRXhpdHMpIHtcbiAgICAgIHJldHVybiB7IGl0ZW06IGl0ZW1FeGl0cywgaXNJdGVtU2VsZWN0ZWQ6IHRydWUgfTtcbiAgICB9XG4gICAgaXRlbUV4aXRzID0gdGhpcy5pdGVtc09mTGlzdCgpLmZpbmQoaXRlbSA9PiAhaXNOaWwoZ2V0KGl0ZW0sICdmaWVsZExhYmVsJykpICYmIChnZXQoaXRlbSwgJ2ZpZWxkTGFiZWwnKS50cmltKCkuaW5jbHVkZXMoKSA9PT0gbGFiZWw/LnRyaW0oKSkgfHwgKHRoaXMuY2hlY2tFeGl0SXNMYWJlbEluY2x1ZGUoKSAmJiBnZXQoaXRlbSwgJ2ZpZWxkTGFiZWwnKS50cmltKCkuaW5jbHVkZXMobGFiZWw/LnRyaW0oKSkpIHx8ICh0aGlzLmNoZWNrRXhpdEJ5RmllbGRzKCkgJiYgdGhpcy5jaGVja0V4aXRCeUZpZWxkcygpPy5zb21lKGZpZWxkID0+IGdldChpdGVtLCBmaWVsZCk/LnRyaW0oKSA9PT0gbGFiZWw/LnRyaW0oKSB8fCBlc2NhcGVIdG1sKGdldChpdGVtLCBmaWVsZCk/LnRyaW0oKSB8fCAnICcpID09PSBlc2NhcGVIdG1sKGxhYmVsPy50cmltKCkgfHwgJycpIHx8IGdldChpdGVtLCBmaWVsZCk/LnRyaW0oKSA9PT0gZXNjYXBlSHRtbChsYWJlbD8udHJpbSgpIHx8ICcnKSkpKTtcbiAgICBpZiAoaXRlbUV4aXRzKSB7XG4gICAgICByZXR1cm4geyBpdGVtOiBpdGVtRXhpdHMsIGlzSXRlbVNlbGVjdGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkS2V5KGV2ZW50OiBJTGlzdERhdGFFbWl0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQuaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlzTmlsKGV2ZW50Py5rZXkpKSB7XG4gICAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8ucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXRlbXNTZWxlY3RlZCgpWzBdKSB7XG4gICAgICB0aGlzLnRlbXBJZ25vcmVFbWl0LnNldCh0cnVlKTtcbiAgICAgIHRoaXMuaGFuZGxlclJlbW92ZUl0ZW1TZWxlY3RlZCh7IHN0b3BQcm9wYWdhdGlvbjogKCkgPT4geyByZXR1cm4gfSB9IGFzIEV2ZW50LCB0aGlzLml0ZW1zU2VsZWN0ZWQoKVswXSwgdGhpcy5pdGVtc1NlbGVjdGVkKClbMF0uZGlzYWJsZUl0ZW0pO1xuICAgICAgdGhpcy50ZW1wSWdub3JlRW1pdC5zZXQoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUl0ZW1zU2VsZWN0ZWQoW2V2ZW50Lml0ZW1dLCAhIXRoaXMuaXRlbXNTZWxlY3RlZCgpWzBdKTsgLy8gQnVnICMzNjA3NVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRGbGFnRW1pdFNlbGVjdGVkSXRlbShrZXlzOiBBcnJheTx1bmtub3duPikge1xuICAgIGlmICghdGhpcy5pZ25vcmVFbWl0V2hlblNhbWVEYXRhU2VsZWN0ZWQoKSB8fCBrZXlzLmxlbmd0aCAhPT0gdGhpcy5pdGVtc1NlbGVjdGVkKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmICghdGhpcy5pdGVtc1NlbGVjdGVkKCkuc29tZShpdGVtID0+IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpID09PSBrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdE11bHRpS2V5KGV2ZW50OiBJTGlzdERhdGFFbWl0TXVsdGlLZXkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICBjb25zdCBpdGVtczogQXJyYXk8dW5rbm93bj4gPSBbXTtcbiAgICBpZiAoZXZlbnQua2V5cyAmJiBldmVudC5rZXlzLmxlbmd0aCAmJiAoIWV2ZW50Lm1hcEtleXMgfHwgIWV2ZW50Lm1hcEtleXMubGVuZ3RoKSkge1xuICAgICAga2V5cy5wdXNoKC4uLmV2ZW50LmtleXMpO1xuICAgIH1cbiAgICBjb25zdCBpZ25vcmVFbWl0S2V5U2VsZWN0ZWRXaGVuSXRlbXNOb3RFeGl0c0VtcHR5ID0gdGhpcy5nZXRGbGFnRW1pdFNlbGVjdGVkSXRlbShjbG9uZURlZXAoZXZlbnQua2V5cyA/PyBbXSkpO1xuICAgIGV2ZW50Lm1hcEtleXMuZm9yRWFjaChtYXBLZXkgPT4ge1xuICAgICAgaWYgKGlzTmlsKG1hcEtleS5rZXkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChtYXBLZXkuaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbXMucHVzaChtYXBLZXkuaXRlbSk7XG4gICAgICB9XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5pdGVtc1NlbGVjdGVkKCkpKSB7XG4gICAgICAgIHJldHVybiBrZXlzLnB1c2gobWFwS2V5LmtleSk7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1NlbGVjdGVkKCkuZmluZChpdGVtID0+IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpID09PSBtYXBLZXkua2V5KTtcbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleXMucHVzaChtYXBLZXkua2V5KTtcbiAgICB9KTtcbiAgICBpZiAoa2V5cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdERhdGE6IEFycmF5PHVua25vd24+ID0gYXdhaXQgdGhpcy5nZXREZXRhaWxCeUlkcyhrZXlzLCB0cnVlKTtcbiAgICAgIGl0ZW1zLnB1c2goLi4ucmVzdWx0RGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VFbXB0eSA9IHRoaXMudmFsaWRSZXF1aXJlZCgpPy5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQ7XG4gICAgbGV0IGlnbm9yZVZhbGlkYXRlID0gdHJ1ZTtcbiAgICBpZiAobWVzc2FnZUVtcHR5ID09PSB0aGlzLmVycm9yKCk/Lm1lc3NhZ2UpIHtcbiAgICAgIGlnbm9yZVZhbGlkYXRlID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1SZW1vdmUgPSB0aGlzLml0ZW1zU2VsZWN0ZWQoKS5maW5kKGl0ZW1TZWxlY3RlZCA9PiBnZXQoaXRlbVNlbGVjdGVkLCB0aGlzLmZpZWxkS2V5KCkpICYmICEoaXRlbXMuc29tZShpdGVtID0+IGdldChpdGVtU2VsZWN0ZWQsIHRoaXMuZmllbGRLZXkoKSkgPT09IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpKSkpO1xuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC51cGRhdGUoaXRlbXNTZWxlY3RlZCA9PiBpdGVtc1NlbGVjdGVkLmZpbHRlcihpdGVtU2VsZWN0ZWQgPT4gIWdldChpdGVtU2VsZWN0ZWQsIHRoaXMuZmllbGRLZXkoKSkgfHwgKGV2ZW50LmtleXMubGVuZ3RoICYmIGl0ZW1zLnNvbWUoaXRlbSA9PiBnZXQoaXRlbVNlbGVjdGVkLCB0aGlzLmZpZWxkS2V5KCkpID09PSBnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpKSkpKSk7XG4gICAgaWYgKGl0ZW1SZW1vdmUpIHtcbiAgICAgIGlmICh0aGlzLmVudGVyQXV0b0FkZFRhZ1RvTGlzdCgpICYmICFpc05pbChnZXQoaXRlbVJlbW92ZSwgdGhpcy5maWVsZEtleSgpKSkgJiYgYCR7Z2V0KGl0ZW1SZW1vdmUsIHRoaXMuZmllbGRLZXkoKSl9YC5zZWFyY2godGhpcy5mYWtlSWQoKSkgPj0gMCkge1xuICAgICAgICB0aGlzLmtleXNIaWRkZW5JdGVtLnVwZGF0ZShpdGVtcyA9PiBbLi4uKGl0ZW1zIHx8IFtdKSwgZ2V0KGl0ZW1SZW1vdmUsIHRoaXMuZmllbGRLZXkoKSldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFldmVudC5rZXlzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuaXRlbXNTZWxlY3RlZCgpPy5tYXAoaXRlbSA9PiBnZXQoaXRlbSwgYHJlZi4ke3RoaXMuZmllbGRLZXkoKX1gKSkpKSk7XG4gICAgICB0aGlzLm91dFNlbGVjdE11bHRpSXRlbS5lbWl0KHRoaXMuZ2V0SXRlbVNlbGVjdGVkKCkpO1xuICAgICAgdGhpcy5jaGVja1ZpZXdDaGFuZ2UoZmFsc2UsIGlnbm9yZVZhbGlkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVJdGVtc1NlbGVjdGVkKGl0ZW1zLCBpZ25vcmVWYWxpZGF0ZSwgaWdub3JlRW1pdEtleVNlbGVjdGVkV2hlbkl0ZW1zTm90RXhpdHNFbXB0eSk7XG4gICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldERldGFpbEJ5SWRzKGtleXM6IEFycmF5PHVua25vd24+LCBpc1Jlc3BvbnNlRGF0YT86IGJvb2xlYW4pOiBQcm9taXNlPEFycmF5PHVua25vd24+PiB7XG4gICAgY29uc3QgaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMgPSB0aGlzLmh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRzKCk7XG4gICAgaWYgKCFodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkcyB8fCB0aGlzLmxvYWRpbmdEZXRhaWwoKSB8fCAhKGtleXMgaW5zdGFuY2VvZiBBcnJheSkgfHwgIWtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRoaXMudXBkYXRlTG9hZGluZ0RldGFpbCh0cnVlKTtcbiAgICBjb25zdCBjbG9uZUh0dHBEZXRhaWxDb25maWcgPSBjbG9uZURlZXAoaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZHMpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFyZ3VtZW50c1ZhbHVlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSB9ID0gY2xvbmVIdHRwRGV0YWlsQ29uZmlnO1xuICAgICAgaWYgKCFndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSB8fCAhZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuZGV0YWlsQnlJZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5kZXRhaWxCeUlkLmZpZWxkR2V0VmFsdWUgPSAna2V5cyc7XG4gICAgICB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsga2V5czoga2V5cyB9LCB7fSwgJycsIGZhbHNlLCBmYWxzZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmNhbGxBcGkoY2xvbmVIdHRwRGV0YWlsQ29uZmlnKSkgYXMgSUh0dHBSZXNwb25zZTxBcnJheTx1bmtub3duPj47XG4gICAgICBpZiAoIWlzUmVzcG9uc2VEYXRhKSB7XG4gICAgICAgIHRoaXMudXBkYXRlSXRlbXNTZWxlY3RlZChyZXN1bHQuZGF0YSB8fCBbXSk7XG4gICAgICAgIHRoaXMudXBkYXRlTG9hZGluZ0RldGFpbChmYWxzZSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlTG9hZGluZ0RldGFpbChmYWxzZSk7XG4gICAgICByZXR1cm4gcmVzdWx0LmRhdGEgfHwgW107XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIHRoaXMudXBkYXRlTG9hZGluZ0RldGFpbChmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tWYWxpZCgpIHtcbiAgICBjb25zdCB2YWxpZCA9IHRoaXMuaXRlbXNTZWxlY3RlZCgpICYmIHRoaXMuaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcbiAgICBjb25zdCBzdGF0ZUVycm9yID0gISF0aGlzLmVycm9yKCk7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgICBpZiAodGhpcy52YWxpZFJlcXVpcmVkKCkgJiYgIXZhbGlkKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh7IC4uLnRoaXMudmFsaWRSZXF1aXJlZCgpLCBtZXNzYWdlOiB0aGlzLnZhbGlkUmVxdWlyZWQoKT8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEIH0pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZXJyb3IoKSkge1xuICAgICAgdGhpcy5jaGVja1BhdHRlcm4odGhpcy5pdGVtc1NlbGVjdGVkKCkpO1xuICAgICAgdGhpcy5jaGVja01heEl0ZW1TZWxlY3RlZFZhbGlkKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy50ZW1wSWdub3JlRW1pdCgpKSB7XG4gICAgICB0aGlzLm91dFZhbGlkRXZlbnQuZW1pdCghdGhpcy5lcnJvcigpKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlRXJyb3IgIT09ICEhdGhpcy5lcnJvcigpKSB7XG4gICAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8udXBkYXRlUG9wb3Zlck92ZXJsYXlQb3NpdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuZXJyb3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNYXhJdGVtU2VsZWN0ZWRWYWxpZCgpIHtcbiAgICBjb25zdCB2YWxpZE1heEl0ZW1TZWxlY3RlZCA9IHRoaXMudmFsaWRNYXhJdGVtU2VsZWN0ZWQoKTtcbiAgICBpZiAodmFsaWRNYXhJdGVtU2VsZWN0ZWQgJiYgdGhpcy5pdGVtc1NlbGVjdGVkKCkubGVuZ3RoID4gdmFsaWRNYXhJdGVtU2VsZWN0ZWQudmFsdWUpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHsgLi4udmFsaWRNYXhJdGVtU2VsZWN0ZWQsIG1lc3NhZ2U6IHZhbGlkTWF4SXRlbVNlbGVjdGVkLm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9NQVhfVkFMSUQsIGludGVycG9sYXRlUGFyYW1zOiB7IHZhbHVlOiB2YWxpZE1heEl0ZW1TZWxlY3RlZC52YWx1ZSB9IH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tQYXR0ZXJuKGl0ZW1zOiBBcnJheTx1bmtub3duPik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbGlkUGF0dGVybiA9IHRoaXMudmFsaWRQYXR0ZXJuKCk7XG4gICAgaWYgKCF2YWxpZFBhdHRlcm4gfHwgIXZhbGlkUGF0dGVybi5sZW5ndGggfHwgIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbGlkIG9mIHZhbGlkUGF0dGVybikge1xuICAgICAgaWYgKHZhbGlkLnBhdHRlcm4gJiYgaXRlbXMuc29tZShpdGVtID0+ICF2YWxpZC5wYXR0ZXJuLnRlc3QoZ2V0KGl0ZW0sIHRoaXMuZmllbGRMYWJlbCgpKSkpKSB7XG4gICAgICAgIHRoaXMuZXJyb3Iuc2V0KHsgLi4udmFsaWQsIG1lc3NhZ2U6IHZhbGlkLm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9QQVRURU5fVkFMSUQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrQnV0dG9uT3RoZXIoZXZlbnQ6IElCdXR0b24pIHtcbiAgICB0aGlzLm91dENsaWNrQnV0dG9uT3RoZXIuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldEl0ZW1TZWxlY3RlZCgpOiBBcnJheTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNTZWxlY3RlZCgpLm1hcChpdGVtID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1NYXAgPSB7IC4uLml0ZW0gfTtcbiAgICAgIGlmICghaXNOaWwoZ2V0KGl0ZW1NYXAsIHRoaXMuZmllbGRLZXkoKSkpICYmIGAke2dldChpdGVtTWFwLCB0aGlzLmZpZWxkS2V5KCkpfWAuc2VhcmNoKHRoaXMuZmFrZUlkKCkpID09PSAwKSB7XG4gICAgICAgIHNldChpdGVtTWFwLCB0aGlzLmZpZWxkS2V5KCksICcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtTWFwO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc2V0VG9EZWZhdWx0RGF0YVNlbGVjdGVkKGl0ZW1TZWxlY3RlZD86IEFycmF5PHVua25vd24+KSB7XG4gICAgaWYgKGl0ZW1TZWxlY3RlZCAmJiBBcnJheS5pc0FycmF5KGl0ZW1TZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoW10pO1xuICAgICAgdGhpcy51cGRhdGVJdGVtc1NlbGVjdGVkKGl0ZW1TZWxlY3RlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1TZWxlY3RlZCA9IG5ldyBBcnJheTx1bmtub3duPigpO1xuICAgIGlmICghdGhpcy5maWVsZEtleSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRLZXlzU2VsZWN0ZWQgPSB0aGlzLmRlZmF1bHRLZXlzU2VsZWN0ZWQoKTtcbiAgICBpZiAoZGVmYXVsdEtleXNTZWxlY3RlZCAmJiBBcnJheS5pc0FycmF5KGRlZmF1bHRLZXlzU2VsZWN0ZWQpKSB7XG4gICAgICB0aGlzLml0ZW1zU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICAgIHRoaXMuZ2V0RGV0YWlsQnlJZHMoZGVmYXVsdEtleXNTZWxlY3RlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRJdGVtc1NlbGVjdGVkID0gdGhpcy5kZWZhdWx0SXRlbXNTZWxlY3RlZCgpO1xuICAgIGlmIChkZWZhdWx0SXRlbXNTZWxlY3RlZCAmJiBBcnJheS5pc0FycmF5KGRlZmF1bHRJdGVtc1NlbGVjdGVkKSkge1xuICAgICAgdGhpcy5pdGVtc1NlbGVjdGVkLnNldChbXSk7XG4gICAgICB0aGlzLnVwZGF0ZUl0ZW1zU2VsZWN0ZWQoZGVmYXVsdEl0ZW1zU2VsZWN0ZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sTGlzdChldmVudDogSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMubGlzdEZ1bmN0aW9uQ29udHJvbC5zZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGZvY3VzSW5wdXQoKSB7XG4gICAgdGhpcy5pbnB1dEZ1bmN0aW9uQ29udHJvbCgpPy5mb2N1cygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoZXZlbnQ6IElGbGFnTW91c2UpIHtcbiAgICB0aGlzLm91dENoYW5nU3RhZ2VGbGFnTW91c2UuZW1pdChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoZmxhZzogSUZsYWdNb3VzZSkge1xuICAgIHRoaXMuZmxhZ01vdXNlLnNldChmbGFnKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzZXRFcnJvcigpIHtcbiAgICB0aGlzLmVycm9yLnNldCh1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVMb2FkaW5nRGV0YWlsKGV2ZW50OiBib29sZWFuKSB7XG4gICAgdGhpcy5sb2FkaW5nRGV0YWlsLnNldChldmVudCk7XG4gICAgdGhpcy5vdXRMb2FkaW5nR2V0RGV0YWlsU2VsZWN0ZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUl0ZW1TZWxlY3RlZERpc2FibGUoKSB7XG4gICAgY29uc3QgZ2V0RGlzYWJsZUl0ZW0gPSB0aGlzLmNvbmZpZygpPy5nZXREaXNhYmxlSXRlbTtcbiAgICBpZiAoIWdldERpc2FibGVJdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC51cGRhdGUoaXRlbXNTZWxlY3RlZCA9PiBpdGVtc1NlbGVjdGVkLm1hcChpdGVtID0+ICh7IC4uLml0ZW0sIGRpc2FibGVJdGVtOiBnZXREaXNhYmxlSXRlbShpdGVtKSB9KSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTGlzdERhdGEoKSB7XG4gICAgdGhpcy5saXN0RnVuY3Rpb25Db250cm9sKCk/LnJlZnJlc2goKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuXG4gICAgaWYgKHRoaXMudGltZU91dEZsYWcoKSkgY2xlYXJUaW1lb3V0KHRoaXMudGltZU91dEZsYWcoKSk7XG4gICAgaWYgKHRoaXMudGltZU91dENoYW5nZVNlYXJjaCgpKSBjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0Q2hhbmdlU2VhcmNoKCkpO1xuICAgIGlmICh0aGlzLnRpbWVPdXRDaGVja1ZpZXdDaGFuZ2UoKSkgY2xlYXJUaW1lb3V0KHRoaXMudGltZU91dENoZWNrVmlld0NoYW5nZSgpKTtcbiAgICBpZiAodGhpcy50aW1lb3V0Q2xpY2tPdXRzaWRlKCkpIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRDbGlja091dHNpZGUoKSk7XG5cbiAgICBpZiAodGhpcy5rZXlTZWFyY2hDaGFuZ2VTdWIoKSkgdGhpcy5rZXlTZWFyY2hDaGFuZ2VTdWIoKT8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsXCI+XG4gIEBpZiAobGFiZWxDb25maWcoKTsgYXMgbGFiZWxDb25maWcpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsIFtjbGFzc0luY2x1ZGVdPVwibGFiZWxDb25maWcuY2xhc3NJbmNsdWRlXCJcbiAgICAgIFtsYWJlbExlZnRdPVwibGFiZWxDb25maWcubGFiZWxMZWZ0XCJcbiAgICAgIFtsYWJlbExlZnRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICBbcmVxdWlyZWRdPVwibGFiZWxDb25maWcucmVxdWlyZWRcIlxuICAgICAgW2Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmRlc2NyaXB0aW9uXCJcbiAgICAgIFtkZXNjcmlwdGlvbkNsYXNzXT1cImxhYmVsQ29uZmlnLmRlc2NyaXB0aW9uQ2xhc3NcIlxuICAgICAgW2xhYmVsUmlnaHRdPVwibGFiZWxDb25maWcubGFiZWxSaWdodFwiXG4gICAgICBbbGFiZWxSaWdodENsYXNzXT1cImxhYmVsQ29uZmlnLmxhYmVsUmlnaHRDbGFzc1wiXG4gICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgIFtidXR0b25zTGVmdF09XCJsYWJlbENvbmZpZy5idXR0b25zTGVmdFwiXG4gICAgICBbYnV0dG9uc1JpZ2h0XT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNSaWdodFwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNMZWZ0XT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zTGVmdCB8fCBkaXNhYmxlKCkgfHwgbG9hZGluZygpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc1JpZ2h0IHx8IGRpc2FibGUoKSB8fCBsb2FkaW5nKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgIFtoYXNUb2dnbGVdPVwibGFiZWxDb25maWcuaGFzVG9nZ2xlXCJcbiAgICAgIFt0b2dnbGVBY3RpdmVdPVwibGFiZWxDb25maWcudG9nZ2xlQWN0aXZlXCJcbiAgICAgIFt0b2dnbGVBY3RpdmVdPVwibGFiZWxDb25maWcudG9nZ2xlRGlzYWJsZSB8fCBkaXNhYmxlKCkgfHwgbG9hZGluZygpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICBbcG9wb3Zlcl09XCJsYWJlbENvbmZpZy5wb3BvdmVyXCJcbiAgICAgIFtpY29uUG9wb3ZlckNsYXNzXT1cImxhYmVsQ29uZmlnLmljb25Qb3BvdmVyQ2xhc3NcIlxuICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICBbbGltaXRMZW5ndGhdPVwibGFiZWxDb25maWcubGltaXRMZW5ndGhcIlxuICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25cIlxuICAgICAgW2Rpc2FibGVCdXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbiB8fCBkaXNhYmxlKClcIlxuICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXCJcbiAgICAgIFtjb3VudF09XCJsYWJlbENvbmZpZy5jb3VudFwiIC8+XG4gIH1cbiAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIGNsYXNzPVwidy1mdWxsIGgtZnVsbFwiXG4gICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cImRpc2FibGUoKSB8fCByZWFkb25seSgpIHx8ICEhY29uZmlnKCk/Lmlnbm9yZVNob3dMaXN0IHx8IGZhbHNlXCJcbiAgICBbaWdub3JlQ3Vyc29yUG9pbnRlck1vZGVMaWtlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgW2VsZW1lbnRSZWZDdXN0b21dPVwidGFnc0VsXCJcbiAgICBbbW9kZV09XCIhY29uZmlnKCk/Lmlnbm9yZUlucHV0ID8gJ2NsaWNrJyA6ICdjbGljay10b2dnbGUnXCJcbiAgICBbaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZV09XCJ0cnVlXCJcbiAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICBbY29uZmlnXT1cIntcbiAgICAgIGFuaW1hdGlvbkNvbmZpZzogY29uZmlnKCk/LmFuaW1hdGlvbkNvbmZpZyB8fCB7fSxcbiAgICAgIHpJbmRleDogekluZGV4KCkgfHwgMTAwMCxcbiAgICAgIHdpZHRoQnlQYXJlbnQ6IHRydWUsXG4gICAgICBwYXJlbnRCb3JkZXJXaWR0aDogcGFyZW50Qm9yZGVyV2lkdGgoKSA/PyAwLFxuICAgICAgbWF4SGVpZ2h0OiAyMDQ4LFxuICAgICAgbWF4V2lkdGg6IDIwNDgsXG4gICAgICBkaXJlY3Rpb246IGNvbmZpZygpPy5kaXJlY3Rpb25MaXN0IHx8ICdib3R0b20nLFxuICAgICAgZGlyZWN0aW9uRGlzdGFuY2U6IDIsXG4gICAgICB0ZW1wbGF0ZTogIXNob3dMaXN0QmVsbG93KCkgPyBsaXN0Vmlld0VsIDogdW5kZWZpbmVkLFxuICAgICAgd2hpdGVUaGVtZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUFycm93OiB0cnVlLFxuICAgICAgY2xhc3NJbmNsdWRlOiAncm91bmRlZC1bNHB4XSAnICsgY2xhc3NJbmNsdWRlUG9wb3ZlcigpICsgKCghbGlzdENvbmZpZygpPy5pZ25vcmVTaG93RGF0YVdoZW5Ob3RTZWFyY2ggfHwga2V5U2VhcmNoKCkpID8gJyBsaWJzLXVpLWJvcmRlci1nZW5lcmFsJyA6ICcnKSxcbiAgICAgIHBvc2l0aW9uOiB7IG1vZGU6ICdzdGFydCcsIGRpc3RhbmNlOiAwIH1cbiAgICB9XCJcbiAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KCRldmVudClcIlxuICAgIChvdXRFdmVudCk9XCJoYW5kbGVyUG9wb3ZlckV2ZW50KCRldmVudClcIlxuICAgIChvdXRFdmVudFBvcG92ZXJDb250ZW50KT1cImhhbmRsZXJQb3BvdmVyQ29udGVudEV2ZW50KCRldmVudClcIlxuICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiXG4gICAgICBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIWRpc2FibGUoKSAmJiAhcmVhZG9ubHkoKVwiXG4gICAgICBbY2xhc3MubGlicy11aS1yZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgIFtjbGFzcy5saWJzLXVpLXJlYWRvbmx5LWJhY2tncm91bmRdPVwicmVhZG9ubHkoKVwiXG4gICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cImRpc2FibGUoKVwiXG4gICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlLWJhY2tncm91bmRdPVwiZGlzYWJsZSgpXCI+XG4gICAgICBAaWYgKGNvbmZpZygpPy51aUxpa2VEcm9wZG93bikge1xuICAgICAgICA8aSBjbGFzcz1cImZsZXggdGV4dC1bMTZweF0gYWJzb2x1dGUgcmlnaHQtWzE2cHhdIHRvcC1bOHB4XSBsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAgei1bMV1cIlxuICAgICAgICAgIFtjbGFzcy50ZXh0LVsjNmE3MzgzXV09XCIhcmVhZG9ubHkoKSAmJiAhZGlzYWJsZSgpXCJcbiAgICAgICAgICBbY2xhc3MubGlicy11aS1yZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cImRpc2FibGUoKVwiPlxuICAgICAgICA8L2k+XG4gICAgICB9XG4gICAgICA8ZGl2ICN0YWdzRWxcbiAgICAgICAgW2NsYXNzXT1cIidsaWJzLXVpLXRhZ3MgJyArIChjb25maWcoKT8uY2xhc3NJbmNsdWRlIHx8ICcnKSArIChyZWFkb25seSgpID8gKGNvbmZpZygpPy5jbGFzc0N1c3RvbVdoZW5SZWFkT25seSB8fCAnIGxpYnMtdWktcmVhZG9ubHknKSA6ICcnKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLXRhZ3Mtbm90LXBvcHVwXT1cIighc2hvd0xpc3QoKSAmJiAhc2hvd0JvcmRlckFjdGl2ZVdoZW5Gb2N1c0lucHV0KCkpIHx8ICghZm9jdXMoKSAmJiBzaG93Qm9yZGVyQWN0aXZlV2hlbkZvY3VzSW5wdXQoKSlcIlxuICAgICAgICBbY2xhc3MubGlicy11aS10YWdzLWVycm9yXT1cIiEhZXJyb3IoKSAmJiAhY29uZmlnKCk/Lmlnbm9yZVNob3dFcnJvclwiXG4gICAgICAgIFtjbGFzcy4hcHItWzMycHhdXT1cImNvbmZpZygpPy51aUxpa2VEcm9wZG93blwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLXJlYWRvbmx5LWJhY2tncm91bmRdPVwicmVhZG9ubHkoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGUtYmFja2dyb3VuZF09XCJkaXNhYmxlKClcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItcHJpbWFyeS1nZW5lcmFsXT1cImZvY3VzKCkgJiYgc2hvd0JvcmRlckFjdGl2ZVdoZW5Gb2N1c0lucHV0KClcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzQ2xpY2tPdXRzaWRlRGlyZWN0aXZlXG4gICAgICAgIChvdXRPdXRzaWRlKT1cImhhbmRsZXJDbGlja091dHNpZGUoJGV2ZW50KVwiPlxuICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zU2VsZWN0ZWQoKTsgdHJhY2sgaXRlbVtmaWVsZEtleSgpXSkge1xuICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwiaXRlbT8uYnVsbGV0IHx8IGl0ZW0/Lm5nU3R5bGVzXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJjbGFzc0luY2x1ZGVUYWdJdGVtKCkgfHwgJydcIlxuICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktdGFncy1yZWFkb25seV09XCJpdGVtLmRpc2FibGVJdGVtXCJcbiAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLXRhZ3MtaXRlbV09XCIhaXRlbS5kaXNhYmxlSXRlbVwiXG4gICAgICAgICAgICBbY2xhc3MuY3Vyc29yLWRlZmF1bHRdPVwiZGlzYWJsZSgpIHx8IHJlYWRvbmx5KClcIj5cbiAgICAgICAgICAgIEBpZiAoZmllbGRHZXRJbWFnZSgpOyBhcyBmaWVsZEdldEltYWdlKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBoLWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWF2YXRhciBbY2xhc3NJbmNsdWRlXT1cImNsYXNzQXZhdGFySW5jbHVkZSgpIHx8ICdtci1bOHB4XSdcIlxuICAgICAgICAgICAgICAgICAgW3NpemVdPVwiaW1hZ2VTaXplKClcIlxuICAgICAgICAgICAgICAgICAgW2xpbmtBdmF0YXJdPVwiaXRlbVtmaWVsZEdldEltYWdlXVwiXG4gICAgICAgICAgICAgICAgICBbbGlua0F2YXRhckVycm9yXT1cImNvbmZpZygpPy5saW5rSW1hZ2VFcnJvclwiXG4gICAgICAgICAgICAgICAgICBbaWRHZW5Db2xvcl09XCJpdGVtW2ZpZWxkR2V0VGV4dEF2YXRhcigpXVwiXG4gICAgICAgICAgICAgICAgICBbdGV4dEF2YXRhcl09XCJpdGVtW2ZpZWxkR2V0VGV4dEF2YXRhcigpXVwiXG4gICAgICAgICAgICAgICAgICBbZ2V0TGFzdFRleHRBZnRlclNwYWNlXT1cImdldExhc3RUZXh0QWZ0ZXJTcGFjZSgpXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oNnJcIlxuICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cIihpdGVtLmZpZWxkTGFiZWwgfHwgJyAnKSB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgQGlmICghZGlzYWJsZSgpICYmICFpdGVtLmRpc2FibGVJdGVtICYmICFyZWFkb25seSgpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtbC1bOHB4XVwiPlxuICAgICAgICAgICAgICAgIDxpICNpY29uQ2xvc2VFbFxuICAgICAgICAgICAgICAgICAgW2F0dHIuc3BlY2lmaWNTdHlsZV09XCIhIShpdGVtPy5idWxsZXQgfHwgaXRlbT8ubmdTdHlsZXMpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCInZmxleCB0ZXh0LVsxNnB4XSAnICsgKGNsYXNzSWNvblJlbW92ZVRhZ0l0ZW0oKSB8fCAnbGlicy11aS1pY29uLWNsb3NlJylcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiFkaXNhYmxlKCkgJiYgIWxvYWRpbmcoKSAmJiAhbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1ub25lXT1cImRpc2FibGUoKSB8fCBsb2FkaW5nKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihpdGVtPy5idWxsZXQgfHwgaXRlbT8ubmdTdHlsZXMpIHwgTGlic1VpQ29tcG9uZW50c1RhZ3NHZXRDb2xvclBpcGU6aWNvbkNsb3NlRWxcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJSZW1vdmVJdGVtU2VsZWN0ZWQoJGV2ZW50LGl0ZW0pXCI+PC9pPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKCFzaW5nbGVTZWxlY3RlZCgpIHx8IChzaW5nbGVTZWxlY3RlZCgpICYmICFpdGVtc1NlbGVjdGVkKCkubGVuZ3RoKSkge1xuICAgICAgICAgIEBpZiAoIWNvbmZpZygpPy5pZ25vcmVJbnB1dCAmJiAhY29uZmlnKCk/LnVpTGlrZURyb3Bkb3duICYmICghaGlkZGVuSW5wdXRXaGVuUmVhZG9ubHkoKSB8fCAoaGlkZGVuSW5wdXRXaGVuUmVhZG9ubHkoKSAmJiAhcmVhZG9ubHkoKSkpKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1pbnB1dCBjbGFzcz1cImdyb3dcIlxuICAgICAgICAgICAgICBbY2xhc3MubWItWzRweF1dPVwiaXRlbXNTZWxlY3RlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ3ctZnVsbCBiZy10cmFuc3BhcmVudCAnICsgKGNvbmZpZygpPy5jbGFzc0lucHV0SW5jbHVkZSB8fCAncHgtWzRweF0gbWluLXctWzMwcHhdJylcIlxuICAgICAgICAgICAgICBbZGVmYXVsdEhlaWdodF09XCIyNFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJyZWFkb25seSgpID8gJycgOiAocGxhY2Vob2xkZXIoKSB8fCAnaTE4bl9pbXBvcnRfY29udGVudCcpXCJcbiAgICAgICAgICAgICAgW25vQm9yZGVyXT1cInRydWVcIlxuICAgICAgICAgICAgICBbKHZhbHVlKV09XCJ2YWx1ZUlucHV0XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmcoKSB8fCBsb2FkaW5nRGV0YWlsKCkgfHwgZGlzYWJsZVdoZW5NYXhJdGVtKClcIlxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgICAgICAgIChvdXRFbnRlckV2ZW50KT1cImhhbmRsZXJFbnRlckV2ZW50KClcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlclZhbHVlQ2hhbmdlU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAob3V0Rm9jdXNBbmRCbHVyRXZlbnQpPVwiaGFuZGxlckZvY3VzQW5kQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVySW5wdXRGdW5jdGlvbkNvbnRyb2woJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29uZmlnKCk/Lmlnbm9yZUlucHV0ICYmIGNvbmZpZygpPy51aUxpa2VEcm9wZG93biAmJiAhaXRlbXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHBiLVs0cHhdIHB0LVsycHhdIG1sLVsxMXB4XSBsaWJzLXVpLWZvbnQtaDVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM5Y2EyYWRdXT1cImRpc2FibGUoKVwiPlxuICAgICAgICAgICAgICB7eyAocGxhY2Vob2xkZXIoKSB8fCAnaTE4bl9zZWxlY3RfdmFsdWUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAoZXJyb3IoKSAmJiAhY29uZmlnKCk/Lmlnbm9yZVNob3dFcnJvcikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1bI2VlMmQ0MV0gbGlicy11aS1mb250LWg3ciBtdC1bOHB4XVwiPnt7IChlcnJvcigpPy5tZXNzYWdlIHx8ICcgJykgfCB0cmFuc2xhdGU6KGVycm9yKCk/LmludGVycG9sYXRlUGFyYW1zIHx8IHt9KSB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuPC9kaXY+XG5AaWYgKHNob3dMaXN0QmVsbG93KCkpIHtcbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3RWaWV3RWxcIj48L25nLWNvbnRhaW5lcj5cbn1cbjxuZy10ZW1wbGF0ZSAjbGlzdFZpZXdFbD5cbiAgQGlmIChsaXN0Q29uZmlnKCk7IGFzIGxpc3RDb25maWcpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWxpc3QgW3NlYXJjaENvbmZpZ109XCJsaXN0U2VhcmNoQ29uZmlnKCkgfHwge2NsYXNzSW5jbHVkZTogJ2hpZGRlbicsIGljb25MZWZ0Q2xhc3M6ICdoaWRkZW4nfVwiXG4gICAgICBbaXNTZWFyY2hPbmxpbmVdPVwiaXNTZWFyY2hPbmxpbmUoKVwiXG4gICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgIFtrZXlTZWFyY2hdPVwia2V5U2VhcmNoKClcIlxuICAgICAgW2NvbmZpZ109XCJsaXN0Q29uZmlnXCJcbiAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKCkgfHwgZGlzYWJsZVdoZW5NYXhJdGVtKClcIlxuICAgICAgW3NlYXJjaFBhZGRpbmddPVwibGlzdFNlYXJjaFBhZGRpbmcoKVwiXG4gICAgICBbbWF4SXRlbVNob3ddPVwibGlzdE1heEl0ZW1TaG93KCkgfHwgNlwiXG4gICAgICBbbXVsdGlLZXlTZWxlY3RlZF09XCJrZXlzU2VsZWN0ZWQoKVwiXG4gICAgICBbY2xpY2tFeGFjdGx5XT1cImZhbHNlXCJcbiAgICAgIFtrZXlzSGlkZGVuSXRlbV09XCJrZXlzSGlkZGVuSXRlbSgpXCJcbiAgICAgIFtrZXlzRGlzYWJsZUl0ZW1dPVwia2V5c0Rpc2FibGVJdGVtKClcIlxuICAgICAgW2RpdmlkZXJDbGFzc0luY2x1ZGVdPVwibGlzdERpdmlkZXJDbGFzc0luY2x1ZGUoKSA/PyAnaGlkZGVuJ1wiXG4gICAgICBbYnV0dG9uc090aGVyXT1cImxpc3RCdXR0b25zT3RoZXIoKVwiXG4gICAgICBbYmFja2dyb3VuZExpc3RDdXN0b21dPVwibGlzdEJhY2tncm91bmRMaXN0Q3VzdG9tKClcIlxuICAgICAgW2Z1bmN0aW9uR2V0SXRlbXNBdXRvQWRkTGlzdF09XCJmdW5jdGlvbkdldEl0ZW1BdXRvQWRkTGlzdCgpXCJcbiAgICAgIFtoaWRkZW5JbnB1dFNlYXJjaF09XCJsaXN0SGlkZGVuSW5wdXRTZWFyY2hXaGVuSGFzU2VhcmNoQ29uZmlnKClcIlxuICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbExpc3QoJGV2ZW50KVwiXG4gICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZEtleSgkZXZlbnQpXCJcbiAgICAgIChvdXRTZWxlY3RNdWx0aUtleSk9XCJoYW5kbGVyU2VsZWN0TXVsdGlLZXkoJGV2ZW50KVwiXG4gICAgICAob3V0Q2hhbmdlVmlldyk9XCJoYW5kbGVyRGF0YUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChvdXRDbGlja0J1dHRvbk90aGVyKT1cImhhbmRsZXJDbGlja0J1dHRvbk90aGVyKCRldmVudClcIlxuICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyKT1cImhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudClcIlxuICAgICAgKG91dExvYWRpbmcpPVwiaGFuZGxlckxvYWRpbmcoJGV2ZW50KVwiIC8+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=