@libs-ui/components-list 0.2.357-14 → 0.2.357-16
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.
- package/defines/list.define.d.ts +1 -1
- package/esm2022/highlight-key-search/highlight-key-search.directive.mjs +71 -7
- package/esm2022/interfaces/config-item.interface.mjs +1 -1
- package/esm2022/list.component.mjs +8 -6
- package/esm2022/templates/checkbox/checkbox.component.mjs +3 -7
- package/esm2022/templates/group/group.component.mjs +50 -21
- package/esm2022/templates/radio/radio.component.mjs +3 -7
- package/esm2022/templates/rows/rows.component.mjs +3 -3
- package/esm2022/templates/tag/tag.component.mjs +3 -3
- package/esm2022/templates/templates.component.abstract.mjs +21 -2
- package/esm2022/templates/text/text.component.mjs +5 -9
- package/fesm2022/libs-ui-components-list.mjs +154 -52
- package/fesm2022/libs-ui-components-list.mjs.map +1 -1
- package/highlight-key-search/highlight-key-search.directive.d.ts +10 -0
- package/interfaces/config-item.interface.d.ts +3 -1
- package/package.json +26 -26
- package/templates/group/group.component.d.ts +1 -0
- package/templates/templates.component.abstract.d.ts +7 -0
|
@@ -6,7 +6,7 @@ import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-butt
|
|
|
6
6
|
import { LibsUiComponentsInputsSearchComponent } from '@libs-ui/components-inputs-search';
|
|
7
7
|
import { LibsUiComponentsLabelComponent } from '@libs-ui/components-label';
|
|
8
8
|
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
9
|
-
import { LibsUiDynamicComponentService } from '@libs-ui/services-dynamic-component';
|
|
9
|
+
import { LibsUiDynamicComponentService, setInputs } from '@libs-ui/services-dynamic-component';
|
|
10
10
|
import { cloneDeep, ERROR_MESSAGE_EMPTY_VALID, isEmpty, isEqual, isNil } from '@libs-ui/utils';
|
|
11
11
|
import { TranslateModule } from '@ngx-translate/core';
|
|
12
12
|
import { Subject, timer } from 'rxjs';
|
|
@@ -302,8 +302,10 @@ export class LibsUiComponentsListComponent {
|
|
|
302
302
|
}
|
|
303
303
|
this.outSelectKey.emit(undefined);
|
|
304
304
|
this.outSelectMultiKey.emit(undefined);
|
|
305
|
-
this.componentRef
|
|
306
|
-
|
|
305
|
+
setInputs(this.componentRef, {
|
|
306
|
+
keySelected: '',
|
|
307
|
+
multiKeySelected: [],
|
|
308
|
+
}, false);
|
|
307
309
|
this.disableButtonUnSelectOption.set(true);
|
|
308
310
|
if (this.configData()?.type === 'group') {
|
|
309
311
|
this.onUpdateMultiKeySelectedGroup.next();
|
|
@@ -428,10 +430,10 @@ export class LibsUiComponentsListComponent {
|
|
|
428
430
|
this.isDestroyed.set(true);
|
|
429
431
|
}
|
|
430
432
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
431
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsListComponent, isStandalone: true, selector: "libs_ui-components-list", inputs: { hiddenInputSearch: { classPropertyName: "hiddenInputSearch", publicName: "hiddenInputSearch", isSignal: true, isRequired: false, transformFunction: null }, dropdownTabKeyActive: { classPropertyName: "dropdownTabKeyActive", publicName: "dropdownTabKeyActive", isSignal: true, isRequired: false, transformFunction: null }, keySearch: { classPropertyName: "keySearch", publicName: "keySearch", isSignal: true, isRequired: false, transformFunction: null }, paddingLeftItem: { classPropertyName: "paddingLeftItem", publicName: "paddingLeftItem", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, autoSelectedFirstItemCallOutsideBefore: { classPropertyName: "autoSelectedFirstItemCallOutsideBefore", publicName: "autoSelectedFirstItemCallOutsideBefore", isSignal: true, isRequired: false, transformFunction: null }, isSearchOnline: { classPropertyName: "isSearchOnline", publicName: "isSearchOnline", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, disableLabel: { classPropertyName: "disableLabel", publicName: "disableLabel", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, searchConfig: { classPropertyName: "searchConfig", publicName: "searchConfig", isSignal: true, isRequired: false, transformFunction: null }, searchPadding: { classPropertyName: "searchPadding", publicName: "searchPadding", isSignal: true, isRequired: false, transformFunction: null }, dividerClassInclude: { classPropertyName: "dividerClassInclude", publicName: "dividerClassInclude", isSignal: true, isRequired: false, transformFunction: null }, hasDivider: { classPropertyName: "hasDivider", publicName: "hasDivider", isSignal: true, isRequired: false, transformFunction: null }, buttonsOther: { classPropertyName: "buttonsOther", publicName: "buttonsOther", isSignal: true, isRequired: false, transformFunction: null }, hasButtonUnSelectOption: { classPropertyName: "hasButtonUnSelectOption", publicName: "hasButtonUnSelectOption", isSignal: true, isRequired: false, transformFunction: null }, clickExactly: { classPropertyName: "clickExactly", publicName: "clickExactly", isSignal: true, isRequired: false, transformFunction: null }, backgroundListCustom: { classPropertyName: "backgroundListCustom", publicName: "backgroundListCustom", isSignal: true, isRequired: false, transformFunction: null }, maxItemShow: { classPropertyName: "maxItemShow", publicName: "maxItemShow", isSignal: true, isRequired: false, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: false, transformFunction: null }, multiKeySelected: { classPropertyName: "multiKeySelected", publicName: "multiKeySelected", isSignal: true, isRequired: false, transformFunction: null }, keysDisableItem: { classPropertyName: "keysDisableItem", publicName: "keysDisableItem", isSignal: true, isRequired: false, transformFunction: null }, keysHiddenItem: { classPropertyName: "keysHiddenItem", publicName: "keysHiddenItem", isSignal: true, isRequired: false, transformFunction: null }, focusInputSearch: { classPropertyName: "focusInputSearch", publicName: "focusInputSearch", isSignal: true, isRequired: false, transformFunction: null }, skipFocusInputWhenKeySearchStoreUndefined: { classPropertyName: "skipFocusInputWhenKeySearchStoreUndefined", publicName: "skipFocusInputWhenKeySearchStoreUndefined", isSignal: true, isRequired: false, transformFunction: null }, functionGetItemsAutoAddList: { classPropertyName: "functionGetItemsAutoAddList", publicName: "functionGetItemsAutoAddList", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, showValidateBottom: { classPropertyName: "showValidateBottom", publicName: "showValidateBottom", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, loadingIconSize: { classPropertyName: "loadingIconSize", publicName: "loadingIconSize", isSignal: true, isRequired: false, transformFunction: null }, templateRefSearchNoData: { classPropertyName: "templateRefSearchNoData", publicName: "templateRefSearchNoData", isSignal: true, isRequired: false, transformFunction: null }, templateRefNotSearchNoData: { classPropertyName: "templateRefNotSearchNoData", publicName: "templateRefNotSearchNoData", isSignal: true, isRequired: false, transformFunction: null }, resetKeyWhenSelectAllKeyDropdown: { classPropertyName: "resetKeyWhenSelectAllKeyDropdown", publicName: "resetKeyWhenSelectAllKeyDropdown", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassDisableDefaultWhenUseKeysDisableItem: { classPropertyName: "ignoreClassDisableDefaultWhenUseKeysDisableItem", publicName: "ignoreClassDisableDefaultWhenUseKeysDisableItem", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outSelectKey: "outSelectKey", outSelectMultiKey: "outSelectMultiKey", outUnSelectMultiKey: "outUnSelectMultiKey", outClickButtonOther: "outClickButtonOther", outFieldKey: "outFieldKey", outChangeView: "outChangeView", outKeySearch: "outKeySearch", outLoading: "outLoading", outFunctionsControl: "outFunctionsControl", outChangStageFlagMousePopover: "outChangStageFlagMousePopover", outLoadItemsComplete: "outLoadItemsComplete" }, viewQueries: [{ propertyName: "listViewElementRef", first: true, predicate: ["listViewContainer"], descendants: true, isSignal: true }, { propertyName: "contentElementRef", first: true, predicate: ["contentContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #listViewContainer\n class=\"flex flex-col\"\n [class.w-full]=\"!maxItemShow()\"\n [class.h-full]=\"!maxItemShow() || maxItemShow() === -1\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [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()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || loading() || disable()\"\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\n @if (!showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\" />\n }\n @if (!hiddenInputSearch()) {\n <libs_ui-components-inputs-search\n [searchConfig]=\"searchConfig()\"\n [class.px-[12px]]=\"searchPadding()\"\n [class]=\"searchConfig().classCoverInputSearch\"\n [disable]=\"disable() || loading() || false\"\n (outSearch)=\"handlerSearch($event)\"\n (outFunctionsControl)=\"handlerFunctionControlInputSearch($event)\" />\n }\n @if (config()?.configDescriptionGroup?.(); as description) {\n <div [class]=\"description?.classInclude\">\n <libs_ui-components-popover [config]=\"description?.tooltipDescription()\">\n <div [class]=\"description?.classTextDescriptionInclude\">{{ description.textDescription }}</div>\n </libs_ui-components-popover>\n </div>\n }\n @if (!hiddenInputSearch() && hasDivider() && (!config()?.ignoreShowDataWhenNotSearch || keySearchStore())) {\n <div\n class=\"libs-ui-border-top-general {{ dividerClassInclude() ? dividerClassInclude() : '' }}\"\n [class.libs-ui-divider-default]=\"!!searchPadding() && !dividerClassInclude()\"></div>\n }\n <div class=\"flex flex-col {{ config()?.ignoreShowDataWhenNotSearch && keySearchStore() && !config()?.ignoreFixHeightShowDataWhenNotSearch ? 'h-[353px]' : 'h-full' }}\">\n <div\n #contentContainer\n class=\"w-full h-full {{ backgroundListCustom() }}\"\n [class.libs-ui-disable]=\"disable() && disableLabel()\"\n [class.pointer-events-none]=\"disable() && disableLabel()\"></div>\n\n @for (buttonOther of buttonsOther(); track $index) {\n <div\n class=\"bg-[#ffffff] libs-ui-border-top-general\"\n [class.rounded-b-[4px]]=\"$last && !hasButtonUnSelectOption()\">\n <libs_ui-components-buttons-button\n [type]=\"buttonOther.type || 'button-link-primary'\"\n [label]=\"buttonOther.label || ' '\"\n [classIconLeft]=\"(buttonOther.classIconLeft || '') + ' flex mr-[8px] text-[16px]'\"\n classInclude=\"w-full text-left rounded-0 {{ buttonOther.classInclude ? buttonOther.classInclude : '' }}\"\n classLabel=\"libs-ui-font-h5r whitespace-normal\"\n [disable]=\"buttonOther.disable || disable() || loading() || false\"\n (outClick)=\"handlerClickButtonOther(buttonOther)\" />\n </div>\n }\n @if (hasButtonUnSelectOption()) {\n <div class=\"bg-[#ffffff] rounded-b-[4px] libs-ui-border-top-general\">\n <libs_ui-components-buttons-button\n label=\"i18n_unselect_option\"\n type=\"button-link-danger-high\"\n classIconLeft=\"flex mr-[8px] libs-ui-icon-close\"\n classInclude=\"w-full text-left rounded-0\"\n classLabel=\"libs-ui-font-h5r whitespace-normal\"\n [disable]=\"disableButtonUnSelectOption() || disable() || loading() || false\"\n (outClick)=\"handlerRemoveKeySelected()\" />\n </div>\n }\n </div>\n @if (showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\" />\n }\n</div>\n\n<ng-template #templateValidate>\n @if (isErrorRequired()) {\n <div\n [class.mb-[8px]]=\"!showValidateBottom()\"\n [class.mt-[8px]]=\"showValidateBottom()\">\n @let constHtmlMessage = validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID;\n <span\n class=\"libs-ui-text-error libs-ui-font-h7r\"\n [innerHtml]=\"constHtmlMessage | translate: validRequired()?.interpolateParams\"></span>\n </div>\n }\n</ng-template>\n", styles: [":host{background-color:#fff}:host ::ng-deep .libs-ui-list-highlight-text-search{background-color:#ffdb80;border-radius:2px;display:inline-block;overflow:unset}.libs-ui-divider-default{width:calc(100% - 24px);margin:12px auto 0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { 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: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
433
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsListComponent, isStandalone: true, selector: "libs_ui-components-list", inputs: { hiddenInputSearch: { classPropertyName: "hiddenInputSearch", publicName: "hiddenInputSearch", isSignal: true, isRequired: false, transformFunction: null }, dropdownTabKeyActive: { classPropertyName: "dropdownTabKeyActive", publicName: "dropdownTabKeyActive", isSignal: true, isRequired: false, transformFunction: null }, keySearch: { classPropertyName: "keySearch", publicName: "keySearch", isSignal: true, isRequired: false, transformFunction: null }, paddingLeftItem: { classPropertyName: "paddingLeftItem", publicName: "paddingLeftItem", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, autoSelectedFirstItemCallOutsideBefore: { classPropertyName: "autoSelectedFirstItemCallOutsideBefore", publicName: "autoSelectedFirstItemCallOutsideBefore", isSignal: true, isRequired: false, transformFunction: null }, isSearchOnline: { classPropertyName: "isSearchOnline", publicName: "isSearchOnline", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, disableLabel: { classPropertyName: "disableLabel", publicName: "disableLabel", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, searchConfig: { classPropertyName: "searchConfig", publicName: "searchConfig", isSignal: true, isRequired: false, transformFunction: null }, searchPadding: { classPropertyName: "searchPadding", publicName: "searchPadding", isSignal: true, isRequired: false, transformFunction: null }, dividerClassInclude: { classPropertyName: "dividerClassInclude", publicName: "dividerClassInclude", isSignal: true, isRequired: false, transformFunction: null }, hasDivider: { classPropertyName: "hasDivider", publicName: "hasDivider", isSignal: true, isRequired: false, transformFunction: null }, buttonsOther: { classPropertyName: "buttonsOther", publicName: "buttonsOther", isSignal: true, isRequired: false, transformFunction: null }, hasButtonUnSelectOption: { classPropertyName: "hasButtonUnSelectOption", publicName: "hasButtonUnSelectOption", isSignal: true, isRequired: false, transformFunction: null }, clickExactly: { classPropertyName: "clickExactly", publicName: "clickExactly", isSignal: true, isRequired: false, transformFunction: null }, backgroundListCustom: { classPropertyName: "backgroundListCustom", publicName: "backgroundListCustom", isSignal: true, isRequired: false, transformFunction: null }, maxItemShow: { classPropertyName: "maxItemShow", publicName: "maxItemShow", isSignal: true, isRequired: false, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: false, transformFunction: null }, multiKeySelected: { classPropertyName: "multiKeySelected", publicName: "multiKeySelected", isSignal: true, isRequired: false, transformFunction: null }, keysDisableItem: { classPropertyName: "keysDisableItem", publicName: "keysDisableItem", isSignal: true, isRequired: false, transformFunction: null }, keysHiddenItem: { classPropertyName: "keysHiddenItem", publicName: "keysHiddenItem", isSignal: true, isRequired: false, transformFunction: null }, focusInputSearch: { classPropertyName: "focusInputSearch", publicName: "focusInputSearch", isSignal: true, isRequired: false, transformFunction: null }, skipFocusInputWhenKeySearchStoreUndefined: { classPropertyName: "skipFocusInputWhenKeySearchStoreUndefined", publicName: "skipFocusInputWhenKeySearchStoreUndefined", isSignal: true, isRequired: false, transformFunction: null }, functionGetItemsAutoAddList: { classPropertyName: "functionGetItemsAutoAddList", publicName: "functionGetItemsAutoAddList", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, showValidateBottom: { classPropertyName: "showValidateBottom", publicName: "showValidateBottom", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, loadingIconSize: { classPropertyName: "loadingIconSize", publicName: "loadingIconSize", isSignal: true, isRequired: false, transformFunction: null }, templateRefSearchNoData: { classPropertyName: "templateRefSearchNoData", publicName: "templateRefSearchNoData", isSignal: true, isRequired: false, transformFunction: null }, templateRefNotSearchNoData: { classPropertyName: "templateRefNotSearchNoData", publicName: "templateRefNotSearchNoData", isSignal: true, isRequired: false, transformFunction: null }, resetKeyWhenSelectAllKeyDropdown: { classPropertyName: "resetKeyWhenSelectAllKeyDropdown", publicName: "resetKeyWhenSelectAllKeyDropdown", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassDisableDefaultWhenUseKeysDisableItem: { classPropertyName: "ignoreClassDisableDefaultWhenUseKeysDisableItem", publicName: "ignoreClassDisableDefaultWhenUseKeysDisableItem", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outSelectKey: "outSelectKey", outSelectMultiKey: "outSelectMultiKey", outUnSelectMultiKey: "outUnSelectMultiKey", outClickButtonOther: "outClickButtonOther", outFieldKey: "outFieldKey", outChangeView: "outChangeView", outKeySearch: "outKeySearch", outLoading: "outLoading", outFunctionsControl: "outFunctionsControl", outChangStageFlagMousePopover: "outChangStageFlagMousePopover", outLoadItemsComplete: "outLoadItemsComplete" }, viewQueries: [{ propertyName: "listViewElementRef", first: true, predicate: ["listViewContainer"], descendants: true, isSignal: true }, { propertyName: "contentElementRef", first: true, predicate: ["contentContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #listViewContainer\n class=\"flex flex-col\"\n [class.w-full]=\"!maxItemShow()\"\n [class.h-full]=\"!maxItemShow() || maxItemShow() === -1\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [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()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || loading() || disable()\"\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\n @if (!showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\" />\n }\n @if (!hiddenInputSearch()) {\n <libs_ui-components-inputs-search\n [searchConfig]=\"searchConfig()\"\n [class.px-[12px]]=\"searchPadding()\"\n [class]=\"searchConfig().classCoverInputSearch\"\n [disable]=\"disable() || loading() || false\"\n (outSearch)=\"handlerSearch($event)\"\n (outFunctionsControl)=\"handlerFunctionControlInputSearch($event)\" />\n }\n @if (config()?.configDescriptionGroup?.(); as description) {\n <div [class]=\"description?.classInclude\">\n <libs_ui-components-popover [config]=\"description?.tooltipDescription()\">\n <div [class]=\"description?.classTextDescriptionInclude\">{{ description.textDescription }}</div>\n </libs_ui-components-popover>\n </div>\n }\n @if (!hiddenInputSearch() && hasDivider() && (!config()?.ignoreShowDataWhenNotSearch || keySearchStore())) {\n <div\n class=\"libs-ui-border-top-general {{ dividerClassInclude() ? dividerClassInclude() : '' }}\"\n [class.libs-ui-divider-default]=\"!!searchPadding() && !dividerClassInclude()\"></div>\n }\n <div class=\"flex flex-col {{ config()?.ignoreShowDataWhenNotSearch && keySearchStore() && !config()?.ignoreFixHeightShowDataWhenNotSearch ? 'h-[353px]' : 'h-full' }}\">\n <div\n #contentContainer\n class=\"w-full h-full {{ backgroundListCustom() }}\"\n [class.libs-ui-disable]=\"disable() && disableLabel()\"\n [class.pointer-events-none]=\"disable() && disableLabel()\"></div>\n\n @for (buttonOther of buttonsOther(); track buttonOther) {\n <div\n class=\"bg-[#ffffff] libs-ui-border-top-general\"\n [class.rounded-b-[4px]]=\"$last && !hasButtonUnSelectOption()\">\n <libs_ui-components-buttons-button\n [type]=\"buttonOther.type || 'button-link-primary'\"\n [label]=\"buttonOther.label || ' '\"\n [classIconLeft]=\"(buttonOther.classIconLeft || '') + ' flex mr-[8px] text-[16px]'\"\n classInclude=\"w-full text-left rounded-0 {{ buttonOther.classInclude ? buttonOther.classInclude : '' }}\"\n classLabel=\"libs-ui-font-h5ri whitespace-normal\"\n [disable]=\"buttonOther.disable || disable() || loading() || false\"\n (outClick)=\"handlerClickButtonOther(buttonOther)\" />\n </div>\n }\n @if (hasButtonUnSelectOption()) {\n <div class=\"bg-[#ffffff] rounded-b-[4px] libs-ui-border-top-general\">\n <libs_ui-components-buttons-button\n label=\"i18n_unselect_option\"\n type=\"button-link-danger-high\"\n classIconLeft=\"flex mr-[8px] libs-ui-icon-close\"\n classInclude=\"w-full text-left rounded-0\"\n classLabel=\"libs-ui-font-h5ri whitespace-normal\"\n [disable]=\"disableButtonUnSelectOption() || disable() || loading() || false\"\n (outClick)=\"handlerRemoveKeySelected()\" />\n </div>\n }\n </div>\n @if (showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\" />\n }\n</div>\n\n<ng-template #templateValidate>\n @if (isErrorRequired()) {\n <div\n [class.mb-[8px]]=\"!showValidateBottom()\"\n [class.mt-[8px]]=\"showValidateBottom()\">\n @let constHtmlMessage = validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID;\n <span\n class=\"libs-ui-text-error libs-ui-font-h7r\"\n [innerHtml]=\"constHtmlMessage | translate: validRequired()?.interpolateParams\"></span>\n </div>\n }\n</ng-template>\n", styles: [":host{background-color:#fff}:host ::ng-deep .libs-ui-list-highlight-text-search{background-color:#ffdb80;border-radius:2px;display:inline-block;overflow:unset}.libs-ui-divider-default{width:calc(100% - 24px);margin:12px auto 0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { 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: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
432
434
|
}
|
|
433
435
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsListComponent, decorators: [{
|
|
434
436
|
type: Component,
|
|
435
|
-
args: [{ selector: 'libs_ui-components-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, TranslateModule, LibsUiComponentsLabelComponent, LibsUiComponentsInputsSearchComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent], template: "<div\n #listViewContainer\n class=\"flex flex-col\"\n [class.w-full]=\"!maxItemShow()\"\n [class.h-full]=\"!maxItemShow() || maxItemShow() === -1\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [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()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || loading() || disable()\"\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\n @if (!showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\" />\n }\n @if (!hiddenInputSearch()) {\n <libs_ui-components-inputs-search\n [searchConfig]=\"searchConfig()\"\n [class.px-[12px]]=\"searchPadding()\"\n [class]=\"searchConfig().classCoverInputSearch\"\n [disable]=\"disable() || loading() || false\"\n (outSearch)=\"handlerSearch($event)\"\n (outFunctionsControl)=\"handlerFunctionControlInputSearch($event)\" />\n }\n @if (config()?.configDescriptionGroup?.(); as description) {\n <div [class]=\"description?.classInclude\">\n <libs_ui-components-popover [config]=\"description?.tooltipDescription()\">\n <div [class]=\"description?.classTextDescriptionInclude\">{{ description.textDescription }}</div>\n </libs_ui-components-popover>\n </div>\n }\n @if (!hiddenInputSearch() && hasDivider() && (!config()?.ignoreShowDataWhenNotSearch || keySearchStore())) {\n <div\n class=\"libs-ui-border-top-general {{ dividerClassInclude() ? dividerClassInclude() : '' }}\"\n [class.libs-ui-divider-default]=\"!!searchPadding() && !dividerClassInclude()\"></div>\n }\n <div class=\"flex flex-col {{ config()?.ignoreShowDataWhenNotSearch && keySearchStore() && !config()?.ignoreFixHeightShowDataWhenNotSearch ? 'h-[353px]' : 'h-full' }}\">\n <div\n #contentContainer\n class=\"w-full h-full {{ backgroundListCustom() }}\"\n [class.libs-ui-disable]=\"disable() && disableLabel()\"\n [class.pointer-events-none]=\"disable() && disableLabel()\"></div>\n\n @for (buttonOther of buttonsOther(); track
|
|
437
|
+
args: [{ selector: 'libs_ui-components-list', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, TranslateModule, LibsUiComponentsLabelComponent, LibsUiComponentsInputsSearchComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent], template: "<div\n #listViewContainer\n class=\"flex flex-col\"\n [class.w-full]=\"!maxItemShow()\"\n [class.h-full]=\"!maxItemShow() || maxItemShow() === -1\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [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()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || loading() || disable()\"\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\n @if (!showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\" />\n }\n @if (!hiddenInputSearch()) {\n <libs_ui-components-inputs-search\n [searchConfig]=\"searchConfig()\"\n [class.px-[12px]]=\"searchPadding()\"\n [class]=\"searchConfig().classCoverInputSearch\"\n [disable]=\"disable() || loading() || false\"\n (outSearch)=\"handlerSearch($event)\"\n (outFunctionsControl)=\"handlerFunctionControlInputSearch($event)\" />\n }\n @if (config()?.configDescriptionGroup?.(); as description) {\n <div [class]=\"description?.classInclude\">\n <libs_ui-components-popover [config]=\"description?.tooltipDescription()\">\n <div [class]=\"description?.classTextDescriptionInclude\">{{ description.textDescription }}</div>\n </libs_ui-components-popover>\n </div>\n }\n @if (!hiddenInputSearch() && hasDivider() && (!config()?.ignoreShowDataWhenNotSearch || keySearchStore())) {\n <div\n class=\"libs-ui-border-top-general {{ dividerClassInclude() ? dividerClassInclude() : '' }}\"\n [class.libs-ui-divider-default]=\"!!searchPadding() && !dividerClassInclude()\"></div>\n }\n <div class=\"flex flex-col {{ config()?.ignoreShowDataWhenNotSearch && keySearchStore() && !config()?.ignoreFixHeightShowDataWhenNotSearch ? 'h-[353px]' : 'h-full' }}\">\n <div\n #contentContainer\n class=\"w-full h-full {{ backgroundListCustom() }}\"\n [class.libs-ui-disable]=\"disable() && disableLabel()\"\n [class.pointer-events-none]=\"disable() && disableLabel()\"></div>\n\n @for (buttonOther of buttonsOther(); track buttonOther) {\n <div\n class=\"bg-[#ffffff] libs-ui-border-top-general\"\n [class.rounded-b-[4px]]=\"$last && !hasButtonUnSelectOption()\">\n <libs_ui-components-buttons-button\n [type]=\"buttonOther.type || 'button-link-primary'\"\n [label]=\"buttonOther.label || ' '\"\n [classIconLeft]=\"(buttonOther.classIconLeft || '') + ' flex mr-[8px] text-[16px]'\"\n classInclude=\"w-full text-left rounded-0 {{ buttonOther.classInclude ? buttonOther.classInclude : '' }}\"\n classLabel=\"libs-ui-font-h5ri whitespace-normal\"\n [disable]=\"buttonOther.disable || disable() || loading() || false\"\n (outClick)=\"handlerClickButtonOther(buttonOther)\" />\n </div>\n }\n @if (hasButtonUnSelectOption()) {\n <div class=\"bg-[#ffffff] rounded-b-[4px] libs-ui-border-top-general\">\n <libs_ui-components-buttons-button\n label=\"i18n_unselect_option\"\n type=\"button-link-danger-high\"\n classIconLeft=\"flex mr-[8px] libs-ui-icon-close\"\n classInclude=\"w-full text-left rounded-0\"\n classLabel=\"libs-ui-font-h5ri whitespace-normal\"\n [disable]=\"disableButtonUnSelectOption() || disable() || loading() || false\"\n (outClick)=\"handlerRemoveKeySelected()\" />\n </div>\n }\n </div>\n @if (showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\" />\n }\n</div>\n\n<ng-template #templateValidate>\n @if (isErrorRequired()) {\n <div\n [class.mb-[8px]]=\"!showValidateBottom()\"\n [class.mt-[8px]]=\"showValidateBottom()\">\n @let constHtmlMessage = validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID;\n <span\n class=\"libs-ui-text-error libs-ui-font-h7r\"\n [innerHtml]=\"constHtmlMessage | translate: validRequired()?.interpolateParams\"></span>\n </div>\n }\n</ng-template>\n", styles: [":host{background-color:#fff}:host ::ng-deep .libs-ui-list-highlight-text-search{background-color:#ffdb80;border-radius:2px;display:inline-block;overflow:unset}.libs-ui-divider-default{width:calc(100% - 24px);margin:12px auto 0}\n"] }]
|
|
436
438
|
}], ctorParameters: () => [] });
|
|
437
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBZ0IsVUFBVSxFQUFFLE1BQU0sRUFBeUIsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBZSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pOLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXJHLE9BQU8sRUFBc0IscUNBQXFDLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUU5RyxPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRixPQUFPLEVBQWMsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUzRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRixPQUFPLEVBQUUsU0FBUyxFQUFFLHlCQUF5QixFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUs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QUd2QixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsOEJBQThCLEVBQUUscUNBQXFDLEVBQUUsZ0NBQWdDLEVBQUUsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgRGVzdHJveVJlZiwgZWZmZWN0LCBFZmZlY3RSZWYsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYsIHVudHJhY2tlZCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBJQnV0dG9uLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1pbnB1dCc7XG5pbXBvcnQgeyBJSW5wdXRTZWFyY2hDb25maWcsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNTZWFyY2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1zZWFyY2gnO1xuaW1wb3J0IHsgSVZhbGlkUmVxdWlyZWQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy12YWxpZCc7XG5pbXBvcnQgeyBJTGFiZWwsIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGFiZWwnO1xuaW1wb3J0IHsgSUZsYWdNb3VzZSwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgSVBhZ2luZywgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaUR5bmFtaWNDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtZHluYW1pYy1jb21wb25lbnQnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElELCBpc0VtcHR5LCBpc0VxdWFsLCBpc05pbCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGdldENvbXBvbmVudEJ5VHlwZSwgaW5pdENvbmZpZyB9IGZyb20gJy4vZGVmaW5lcy9saXN0LmRlZmluZSc7XG5pbXBvcnQgeyBJRGF0YVVwZGF0ZVRvU3RvcmUsIElMaXN0Q29uZmlnSXRlbSwgSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJTGlzdERhdGFFbWl0S2V5LCBJTGlzdERhdGFFbWl0TXVsdGlLZXkgfSBmcm9tICcuL2ludGVyZmFjZXMvZGF0YS1lbWl0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzTGlzdFRlbXBsYXRlc0NvbXBvbmVudEFic3RyYWN0IH0gZnJvbSAnLi90ZW1wbGF0ZXMvdGVtcGxhdGVzLmNvbXBvbmVudC5hYnN0cmFjdCc7XG5cbi8qKlxuICogQ29tcG9uZW50IGhp4buDbiB0aOG7iyBkYW5oIHPDoWNoIMSRYSBuxINuZyBo4buXIHRy4bujIDUga2nhu4N1IHRlbXBsYXRlOiB0ZXh0LCByYWRpbywgY2hlY2tib3gsIHRhZywgZ3JvdXAvdHJlZS5cbiAqIFTDrWNoIGjhu6NwIHPhurVuIHTDrG0ga2nhur9tIG9ubGluZS9vZmZsaW5lLCBsYXp5LWxvYWRpbmcgcXVhIEhUVFAsIHZpcnR1YWwgc2Nyb2xsIHbDoCBBbmd1bGFyIFNpZ25hbHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxsaWJzX3VpLWNvbXBvbmVudHMtbGlzdFxuICogICBbY29uZmlnXT1cImxpc3RDb25maWdcIlxuICogICBba2V5U2VsZWN0ZWRdPVwic2VsZWN0ZWRLZXkoKVwiXG4gKiAgIChvdXRTZWxlY3RLZXkpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gKiAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cIm9uRnVuY3Rpb25zQ29udHJvbCgkZXZlbnQpXCI+XG4gKiA8L2xpYnNfdWktY29tcG9uZW50cy1saXN0PlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbTmdUZW1wbGF0ZU91dGxldCwgVHJhbnNsYXRlTW9kdWxlLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNTZWFyY2hDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByb3RlY3RlZCByZWFkb25seSBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEID0gRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRDtcbiAgcHJvdGVjdGVkIGRpc2FibGVCdXR0b25VblNlbGVjdE9wdGlvbiA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcHJvdGVjdGVkIGlzRXJyb3JSZXF1aXJlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBsb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGtleVNlYXJjaFN0b3JlID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uU2VhcmNoOiBTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uUmVmcmVzaDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25TZXRIaWRkZW5JdGVtQnlLZXk6IFN1YmplY3Q8QXJyYXk8dW5rbm93bj4+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwZGF0ZU11bHRpS2V5U2VsZWN0ZWRHcm91cDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25SZW1vdmVJdGVtczogU3ViamVjdDxBcnJheTx1bmtub3duPj4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uVXBkYXRlRGF0YTogU3ViamVjdDxJRGF0YVVwZGF0ZVRvU3RvcmU+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGVhblVwRWZmZWN0ITogRWZmZWN0UmVmO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzRGVzdHJveWVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcml2YXRlIGNvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxMaWJzVWlDb21wb25lbnRzTGlzdFRlbXBsYXRlc0NvbXBvbmVudEFic3RyYWN0PjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdEYXRhID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4oe1xuICAgIHR5cGU6ICd0ZXh0JyxcbiAgICBjb25maWdUZW1wbGF0ZVRleHQ6IHNpZ25hbCh7XG4gICAgICBmaWVsZEtleTogJ2lkJyxcbiAgICAgIGdldFZhbHVlOiAoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLmxhYmVsIHx8IGl0ZW0ubmFtZTtcbiAgICAgIH0sXG4gICAgfSksXG4gIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwTXVsdGlLZXlTZWxlY3RlZCA9IHNpZ25hbDxBcnJheTx1bmtub3duPj4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGZ1bmN0aW9uQ29udHJvbElucHV0U2VhcmNoID0gc2lnbmFsPElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8vICNyZWdpb24gSU5QVVRcbiAgcmVhZG9ubHkgaGlkZGVuSW5wdXRTZWFyY2ggPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duVGFiS2V5QWN0aXZlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBrZXlTZWFyY2ggPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHBhZGRpbmdMZWZ0SXRlbSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0PElMaXN0Q29uZmlnSXRlbSB8IHVuZGVmaW5lZCwgSUxpc3RDb25maWdJdGVtIHwgdW5kZWZpbmVkPih0aGlzLmNvbmZpZ0RhdGEoKSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gdGhpcy5jb25maWdEYXRhKCkgfSk7XG4gIHJlYWRvbmx5IGF1dG9TZWxlY3RlZEZpcnN0SXRlbUNhbGxPdXRzaWRlQmVmb3JlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHJlYWRvbmx5IGlzU2VhcmNoT25saW5lID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGVMYWJlbCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxhYmVsQ29uZmlnID0gaW5wdXQ8SUxhYmVsPigpO1xuICByZWFkb25seSBzZWFyY2hDb25maWcgPSBpbnB1dDxJSW5wdXRTZWFyY2hDb25maWcsIElJbnB1dFNlYXJjaENvbmZpZyB8IHVuZGVmaW5lZD4oe30sIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8IHt9IH0pO1xuICByZWFkb25seSBzZWFyY2hQYWRkaW5nID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGl2aWRlckNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaGFzRGl2aWRlciA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBidXR0b25zT3RoZXIgPSBpbnB1dDxBcnJheTxJQnV0dG9uPiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgaGFzQnV0dG9uVW5TZWxlY3RPcHRpb24gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGlja0V4YWN0bHkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBiYWNrZ3JvdW5kTGlzdEN1c3RvbSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignYmctWyNmZmZmZmZdJywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gJ2JnLVsjZmZmZmZmXScgfSk7XG4gIHJlYWRvbmx5IG1heEl0ZW1TaG93ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBrZXlTZWxlY3RlZCA9IGlucHV0PHVua25vd24+KCk7XG4gIHJlYWRvbmx5IG11bHRpS2V5U2VsZWN0ZWQgPSBpbnB1dDxBcnJheTx1bmtub3duPiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTsgLy8gbMawdSDDvSBraGkgc+G7rSBk4bulbmcgbGlzdHZpZXdcbiAgcmVhZG9ubHkga2V5c0Rpc2FibGVJdGVtID0gaW5wdXQ8QXJyYXk8dW5rbm93bj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7IC8vIGtow7RuZyBkw7luZyBnacOhIHRy4buLIG7DoHkga+G6v3QgaOG7o3AgduG7m2kgdGVtcGxhdGUgY2hlY2tib3ggY8OzIGNvbmZpZyBjaOG7qWEgY29uZmlnQ2hlY2tib3hDaGVja0FsbFxuICByZWFkb25seSBrZXlzSGlkZGVuSXRlbSA9IGlucHV0PEFycmF5PHVua25vd24+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpOyAvLyBraMO0bmcgZMO5bmcgZ2nDoSB0cuG7iyBuw6B5IGvhur90IGjhu6NwIHbhu5tpIHRlbXBsYXRlIGNoZWNrYm94IGPDsyBjb25maWcgY2jhu6lhIGNvbmZpZ0NoZWNrYm94Q2hlY2tBbGxcbiAgcmVhZG9ubHkgZm9jdXNJbnB1dFNlYXJjaCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHNraXBGb2N1c0lucHV0V2hlbktleVNlYXJjaFN0b3JlVW5kZWZpbmVkID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZnVuY3Rpb25HZXRJdGVtc0F1dG9BZGRMaXN0ID0gaW5wdXQ8KCgpID0+IEFycmF5PGFueT4pIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkUmVxdWlyZWQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IHNob3dWYWxpZGF0ZUJvdHRvbSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgbG9hZGluZ0ljb25TaXplID0gaW5wdXQ8J2xhcmdlJyB8ICdtZWRpdW0nIHwgJ3NtYWxsJyB8ICdzbWFsbGVyJyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVSZWZTZWFyY2hOb0RhdGEgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlUmVmTm90U2VhcmNoTm9EYXRhID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSByZXNldEtleVdoZW5TZWxlY3RBbGxLZXlEcm9wZG93biA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUNsYXNzRGlzYWJsZURlZmF1bHRXaGVuVXNlS2V5c0Rpc2FibGVJdGVtID0gaW5wdXQ8Ym9vbGVhbj4oKTsgLy8gYuG7jyBjaOG6vyDEkeG7mSBkaXNhYmxlIGl0ZW0gdHLDqm4gaHRtbCDEkeG7gyBkaXNhYmxlIHThu6tuZyBwaOG6p24gdHJvbmcgcm93c1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dFNlbGVjdEtleSA9IG91dHB1dDxJTGlzdERhdGFFbWl0S2V5IHwgdW5kZWZpbmVkPigpOyAvLyBz4butIGThu6VuZyBjaG8gdHlwZSBjaOG7jW4gMVxuICByZWFkb25seSBvdXRTZWxlY3RNdWx0aUtleSA9IG91dHB1dDxJTGlzdERhdGFFbWl0TXVsdGlLZXkgfCB1bmRlZmluZWQ+KCk7IC8vIHPhu60gZOG7pW5nIGNobyB0eXBlIGNobyBwaMOpcCBjaOG7jW4gbmhp4buBdS5cbiAgcmVhZG9ubHkgb3V0VW5TZWxlY3RNdWx0aUtleSA9IG91dHB1dDxBcnJheTx1bmtub3duPj4oKTsgLy8gc+G7rSBk4bulbmcgY2hvIHR5cGUgY2hvIHBow6lwIGNo4buNbiBuaGnhu4F1LlxuICByZWFkb25seSBvdXRDbGlja0J1dHRvbk90aGVyID0gb3V0cHV0PElCdXR0b24+KCk7XG4gIHJlYWRvbmx5IG91dEZpZWxkS2V5ID0gb3V0cHV0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVmlldyA9IG91dHB1dDxBcnJheTxhbnk+PigpO1xuICByZWFkb25seSBvdXRLZXlTZWFyY2ggPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRMb2FkaW5nID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIgPSBvdXRwdXQ8SUZsYWdNb3VzZT4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZEl0ZW1zQ29tcGxldGUgPSBvdXRwdXQ8eyBpdGVtczogQXJyYXk8YW55PjsgcGFnaW5nPzogSVBhZ2luZyB9PigpO1xuXG4gIC8qIFZJRVcgQ0hJTEQgKi9cbiAgcHJvdGVjdGVkIGxpc3RWaWV3RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignbGlzdFZpZXdDb250YWluZXInKTtcbiAgcHJvdGVjdGVkIGNvbnRlbnRFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdjb250ZW50Q29udGFpbmVyJyk7XG5cbiAgLy8gI3JlZ2lvbiBJTkpFQ1RcbiAgcHJpdmF0ZSByZWFkb25seSBkeW5hbWljQ29tcG9uZW50U2VydmljZSA9IGluamVjdChMaWJzVWlEeW5hbWljQ29tcG9uZW50U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jbGVhblVwRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5rZXlTZWFyY2goKTtcblxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMua2V5U2VhcmNoU3RvcmUoKSA9PT0gdGhpcy5rZXlTZWFyY2goKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleVNlYXJjaFN0b3JlLnNldCh2YWx1ZSk7XG4gICAgICAgIHRoaXMub25TZWFyY2gubmV4dCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBrZXlzRGlzYWJsZUl0ZW0gPSB0aGlzLmtleXNEaXNhYmxlSXRlbSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKCFpc05pbChrZXlzRGlzYWJsZUl0ZW0pKSB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZWY/LnNldElucHV0KCdrZXlzRGlzYWJsZUl0ZW0nLCBrZXlzRGlzYWJsZUl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBrZXlzSGlkZGVuSXRlbSA9IHRoaXMua2V5c0hpZGRlbkl0ZW0oKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICghaXNOaWwoa2V5c0hpZGRlbkl0ZW0pKSB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZWY/LnNldElucHV0KCdrZXlzSGlkZGVuSXRlbScsIGtleXNIaWRkZW5JdGVtKTtcbiAgICAgICAgICB0aGlzLm9uU2V0SGlkZGVuSXRlbUJ5S2V5Lm5leHQoa2V5c0hpZGRlbkl0ZW0hKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgZGlzYWJsZSA9IHRoaXMuZGlzYWJsZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKCFpc05pbChkaXNhYmxlKSkge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmPy5zZXRJbnB1dCgnZGlzYWJsZScsIGRpc2FibGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBrZXlTZWxlY3RlZCA9IHRoaXMua2V5U2VsZWN0ZWQoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICghaXNOaWwoa2V5U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZWY/LnNldElucHV0KCdrZXlTZWxlY3RlZCcsIGtleVNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBsZXQgb2xkTXVsdGlLZXlTZWxlY3RlZCA9IHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBtdWx0aUtleVNlbGVjdGVkID0gdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk7XG4gICAgICBpZiAoaXNFcXVhbChvbGRNdWx0aUtleVNlbGVjdGVkLCBtdWx0aUtleVNlbGVjdGVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvbGRNdWx0aUtleVNlbGVjdGVkID0gbXVsdGlLZXlTZWxlY3RlZDtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICghaXNOaWwobXVsdGlLZXlTZWxlY3RlZCkpIHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZj8uc2V0SW5wdXQoJ211bHRpS2V5U2VsZWN0ZWQnLCBtdWx0aUtleVNlbGVjdGVkKTtcbiAgICAgICAgICBpZiAodGhpcy5jb25maWdEYXRhKCk/LnR5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgICAgIHRoaXMub25VcGRhdGVNdWx0aUtleVNlbGVjdGVkR3JvdXAubmV4dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duVGFiS2V5QWN0aXZlKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuICAgIGlmICh0aGlzLmtleVNlYXJjaCgpKSB7XG4gICAgICB0aGlzLmtleVNlYXJjaFN0b3JlLnNldCh0aGlzLmtleVNlYXJjaCgpKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcoKTtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZ0RhdGEuc2V0KHRoaXMuY2xvbmVDb25maWcoY29uZmlnKSk7XG4gICAgfVxuICAgIGluaXRDb25maWcodGhpcy5jb25maWdEYXRhKCkpO1xuICAgIGNvbnN0IGNvbXBDbGFzcyA9IGdldENvbXBvbmVudEJ5VHlwZSh0aGlzLmNvbmZpZ0RhdGEoKS50eXBlKTtcblxuICAgIHRoaXMuY29tcG9uZW50UmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wQ2xhc3MpO1xuXG4gICAgdGltZXIoMClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuYWRkVG9FbGVtZW50KHRoaXMuY29tcG9uZW50UmVmLCB0aGlzLmNvbnRlbnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ29uU2V0SGlkZGVuSXRlbUJ5S2V5JywgdGhpcy5vblNldEhpZGRlbkl0ZW1CeUtleSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2NvbmZpZycsIHRoaXMuY29uZmlnRGF0YSgpKTtcblxuICAgIGlmICh0aGlzLnNlYXJjaENvbmZpZygpKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnc2VhcmNoQ29uZmlnJywgdGhpcy5zZWFyY2hDb25maWcoKSk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblNlYXJjaCcsIHRoaXMub25TZWFyY2gpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblJlZnJlc2gnLCB0aGlzLm9uUmVmcmVzaCk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ29uVXBkYXRlRGF0YScsIHRoaXMub25VcGRhdGVEYXRhKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgna2V5U2VhcmNoJywgdGhpcy5rZXlTZWFyY2hTdG9yZSgpID8/ICcnKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnZHJvcGRvd25UYWJLZXlBY3RpdmUnLCB0aGlzLmRyb3Bkb3duVGFiS2V5QWN0aXZlKCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdjbGlja0V4YWN0bHknLCB0aGlzLmNsaWNrRXhhY3RseSgpIHx8IGZhbHNlKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnZGlzYWJsZScsIHRoaXMuZGlzYWJsZSgpKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnYXV0b1NlbGVjdGVkRmlyc3RJdGVtQ2FsbE91dHNpZGVCZWZvcmUnLCB0aGlzLmF1dG9TZWxlY3RlZEZpcnN0SXRlbUNhbGxPdXRzaWRlQmVmb3JlKCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdwYWRkaW5nTGVmdEl0ZW0nLCB0aGlzLnBhZGRpbmdMZWZ0SXRlbSgpKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgncmVzZXRLZXlXaGVuU2VsZWN0QWxsS2V5RHJvcGRvd24nLCB0aGlzLnJlc2V0S2V5V2hlblNlbGVjdEFsbEtleURyb3Bkb3duKCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdpZ25vcmVDbGFzc0Rpc2FibGVEZWZhdWx0V2hlblVzZUtleXNEaXNhYmxlSXRlbScsIHRoaXMuaWdub3JlQ2xhc3NEaXNhYmxlRGVmYXVsdFdoZW5Vc2VLZXlzRGlzYWJsZUl0ZW0oKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2Z1bmN0aW9uR2V0SXRlbXNBdXRvQWRkTGlzdCcsIHRoaXMuZnVuY3Rpb25HZXRJdGVtc0F1dG9BZGRMaXN0KCkpO1xuICAgIGlmICh0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdtYXhJdGVtU2hvdycsIHRoaXMubWF4SXRlbVNob3coKSk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdrZXlTZWxlY3RlZCcsIHRoaXMua2V5U2VsZWN0ZWQoKSk7XG4gICAgaWYgKHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnbXVsdGlLZXlTZWxlY3RlZCcsIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpKTtcbiAgICB9XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2tleXNEaXNhYmxlSXRlbScsIHRoaXMua2V5c0Rpc2FibGVJdGVtKCkgfHwgW10pO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdrZXlzSGlkZGVuSXRlbScsIHRoaXMua2V5c0hpZGRlbkl0ZW0oKSB8fCBbXSk7XG4gICAgaWYgKCFpc05pbCh0aGlzLmtleVNlbGVjdGVkKCkpIHx8IHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUJ1dHRvblVuU2VsZWN0T3B0aW9uLnNldChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblVwZGF0ZU11bHRpS2V5U2VsZWN0ZWRHcm91cCcsIHRoaXMub25VcGRhdGVNdWx0aUtleVNlbGVjdGVkR3JvdXApO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblJlbW92ZUl0ZW1zJywgdGhpcy5vblJlbW92ZUl0ZW1zKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnekluZGV4JywgdGhpcy56SW5kZXgoKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2lzU2VhcmNoT25saW5lJywgdGhpcy5pc1NlYXJjaE9ubGluZSgpKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnZGlzYWJsZUxhYmVsJywgdGhpcy5kaXNhYmxlTGFiZWwoKSB8fCBmYWxzZSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2xvYWRpbmdJY29uU2l6ZScsIHRoaXMubG9hZGluZ0ljb25TaXplKCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCd0ZW1wbGF0ZVJlZlNlYXJjaE5vRGF0YScsIHRoaXMudGVtcGxhdGVSZWZTZWFyY2hOb0RhdGEoKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ3RlbXBsYXRlUmVmTm90U2VhcmNoTm9EYXRhJywgdGhpcy50ZW1wbGF0ZVJlZk5vdFNlYXJjaE5vRGF0YSgpKTtcbiAgICBsZXQga2V5U2VhcmNoID0gJyc7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlO1xuXG4gICAgaW5zdGFuY2Uub3V0Q2hhbmdlVmlldy5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMub3V0Q2hhbmdlVmlldy5lbWl0KGRhdGEpO1xuXG4gICAgICBpZiAodGhpcy5za2lwRm9jdXNJbnB1dFdoZW5LZXlTZWFyY2hTdG9yZVVuZGVmaW5lZCgpICYmIGlzTmlsKHRoaXMua2V5U2VhcmNoU3RvcmUoKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZm9jdXNJbnB1dFNlYXJjaCgpICYmIHRoaXMua2V5U2VhcmNoU3RvcmUoKSAhPT0ga2V5U2VhcmNoKSB7XG4gICAgICAgIGtleVNlYXJjaCA9IHRoaXMua2V5U2VhcmNoU3RvcmUoKSB8fCAnJztcbiAgICAgICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xJbnB1dFNlYXJjaCgpPy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGluc3RhbmNlLm91dFNlbGVjdEtleS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuZGlzYWJsZUJ1dHRvblVuU2VsZWN0T3B0aW9uLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dFNlbGVjdEtleS5lbWl0KGRhdGEpO1xuICAgICAgdGhpcy5jaGVja0lzVmFsaWQoKTtcbiAgICB9KTtcbiAgICBpbnN0YW5jZS5vdXRGaWVsZEtleS5zdWJzY3JpYmUoKGZpZWxkS2V5Pzogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLm91dEZpZWxkS2V5LmVtaXQoZmllbGRLZXkpO1xuICAgIH0pO1xuICAgIGluc3RhbmNlLm91dExvYWRpbmcuc3Vic2NyaWJlKChsb2FkaW5nOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGxvYWRpbmcpO1xuICAgICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQobG9hZGluZyk7XG4gICAgfSk7XG4gICAgaW5zdGFuY2Uub3V0TG9hZEl0ZW1zQ29tcGxldGUuc3Vic2NyaWJlKChldmVudDogeyBpdGVtczogQXJyYXk8YW55PjsgcGFnaW5nPzogSVBhZ2luZyB9KSA9PiB7XG4gICAgICB0aGlzLm91dExvYWRJdGVtc0NvbXBsZXRlLmVtaXQoZXZlbnQpO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZVRleHQ/LigpPy5hY3Rpb25Tb3J0KSB7XG4gICAgICBpbnN0YW5jZS5vdXRTb3J0U2luZ2xlU2VsZWN0LnN1YnNjcmliZSgoaXRlbVNvcnQpID0+IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcoKTtcbiAgICAgICAgaWYgKGNvbmZpZz8uY29uZmlnVGVtcGxhdGVUZXh0Py4oKT8uYWN0aW9uU29ydCkge1xuICAgICAgICAgIGNvbmZpZy5jb25maWdUZW1wbGF0ZVRleHQoKT8uaXRlbVNvcnQ/LnNldChpdGVtU29ydCk7XG4gICAgICAgICAgY29uZmlnLmNvbmZpZ1RlbXBsYXRlVGV4dCgpPy5hY3Rpb25Tb3J0Py4oaXRlbVNvcnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaW5zdGFuY2Uub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIuc3Vic2NyaWJlKChmbGFnOiBJRmxhZ01vdXNlKSA9PiB7XG4gICAgICB0aGlzLm91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyLmVtaXQoZmxhZyk7XG4gICAgfSk7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuY29uZmlnRGF0YSgpPy50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09ICd0ZXh0JyB8fCB0eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlLm91dFNlbGVjdE11bHRpS2V5LnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlQnV0dG9uVW5TZWxlY3RPcHRpb24uc2V0KGZhbHNlKTtcbiAgICAgIGlmICh0eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBNdWx0aUtleVNlbGVjdGVkLnNldChkYXRhLmtleXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KGRhdGEpO1xuICAgICAgdGhpcy5jaGVja0lzVmFsaWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrSXNWYWxpZDogdGhpcy5jaGVja0lzVmFsaWQuYmluZCh0aGlzKSxcbiAgICAgIHJlZnJlc2g6IHRoaXMucmVmcmVzaC5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRLZXlTZWxlY3RlZDogdGhpcy5oYW5kbGVyUmVtb3ZlS2V5U2VsZWN0ZWQuYmluZCh0aGlzKSxcbiAgICAgIGdldFJlY3RMaXN0VmlldzogYXN5bmMgKCkgPT4gdGhpcy5saXN0Vmlld0VsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHJlbW92ZUl0ZW1zOiBhc3luYyAoa2V5cykgPT4gdGhpcy5vblJlbW92ZUl0ZW1zLm5leHQoa2V5cyksXG4gICAgICB1cGRhdGVEYXRhOiBhc3luYyAoZGF0YSkgPT4gdGhpcy5vblVwZGF0ZURhdGEubmV4dChkYXRhKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWFyY2goa2V5U2VhcmNoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmtleVNlYXJjaFN0b3JlLnNldChrZXlTZWFyY2gpO1xuICAgIHRoaXMub25TZWFyY2gubmV4dChrZXlTZWFyY2gpO1xuICAgIHRoaXMub3V0S2V5U2VhcmNoLmVtaXQoa2V5U2VhcmNoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUmVtb3ZlS2V5U2VsZWN0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZiB8fCB0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRTZWxlY3RLZXkuZW1pdCh1bmRlZmluZWQpO1xuICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdCh1bmRlZmluZWQpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdrZXlTZWxlY3RlZCcsICcnKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnbXVsdGlLZXlTZWxlY3RlZCcsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5kaXNhYmxlQnV0dG9uVW5TZWxlY3RPcHRpb24uc2V0KHRydWUpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnRGF0YSgpPy50eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICB0aGlzLm9uVXBkYXRlTXVsdGlLZXlTZWxlY3RlZEdyb3VwLm5leHQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jaGVja0lzVmFsaWQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tCdXR0b25PdGhlcihidXR0b246IElCdXR0b24pIHtcbiAgICB0aGlzLm91dENsaWNrQnV0dG9uT3RoZXIuZW1pdChidXR0b24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xJbnB1dFNlYXJjaChldmVudDogSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbElucHV0U2VhcmNoLnNldChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrSXNWYWxpZCgpIHtcbiAgICBpZiAoIXRoaXMudmFsaWRSZXF1aXJlZCgpIHx8ICF0aGlzLmNvbmZpZygpPy50eXBlIHx8ICF0aGlzLmNvbXBvbmVudFJlZj8uaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuaXNFcnJvclJlcXVpcmVkLnNldChmYWxzZSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gdGhpcy5jb25maWcoKT8udHlwZTtcbiAgICBsZXQgaGFzS2V5ID0gIWlzRW1wdHkodGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UubXVsdGlLZXlTZWxlY3RlZCgpKTtcblxuICAgIGlmICh0eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICBoYXNLZXkgPSAhaXNFbXB0eSh0aGlzLmdyb3VwTXVsdGlLZXlTZWxlY3RlZCgpKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICd0ZXh0JyB8fCB0eXBlID09PSAncmFkaW8nKSB7XG4gICAgICBoYXNLZXkgPSAhaXNOaWwodGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2Uua2V5U2VsZWN0ZWQoKSk7XG4gICAgfVxuICAgIHRoaXMuaXNFcnJvclJlcXVpcmVkLnNldCghaGFzS2V5KTtcblxuICAgIHJldHVybiBoYXNLZXk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2goKSB7XG4gICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnKCk7XG4gICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmZpZ0RhdGEuc2V0KHRoaXMuY2xvbmVDb25maWcoY29uZmlnKSk7XG4gICAgICB0aGlzLm9uUmVmcmVzaC5uZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsb25lQ29uZmlnKGNvbmZpZ0lucHV0OiBJTGlzdENvbmZpZ0l0ZW0pOiBJTGlzdENvbmZpZ0l0ZW0ge1xuICAgIGlmICghY29uZmlnSW5wdXQpIHtcbiAgICAgIHJldHVybiB7fSBhcyBhbnk7XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdEluc3RhbmNlID0gY29uZmlnSW5wdXQuaHR0cFJlcXVlc3REYXRhPy4oKT8ub2JqZWN0SW5zdGFuY2U7XG4gICAgY29uc3Qgc2VydmljZUNsYXNzID0gY29uZmlnSW5wdXQuaHR0cFJlcXVlc3REYXRhPy4oKT8uc2VydmljZUNsYXNzO1xuICAgIGNvbnN0IG9iamVjdEluc3RhbmNlUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdCA9IGNvbmZpZ0lucHV0LmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3g/LigpPy5odHRwUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdD8uKCk/Lm9iamVjdEluc3RhbmNlO1xuICAgIGNvbnN0IHNlcnZpY2VDbGFzc1JlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3QgPSBjb25maWdJbnB1dC5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py4oKT8uaHR0cFJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3Q/LigpPy5zZXJ2aWNlQ2xhc3M7XG5cbiAgICBpZiAob2JqZWN0SW5zdGFuY2UpIHtcbiAgICAgIGNvbmZpZ0lucHV0Lmh0dHBSZXF1ZXN0RGF0YT8udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGRlbGV0ZSBjdXJyZW50Lm9iamVjdEluc3RhbmNlO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHNlcnZpY2VDbGFzcykge1xuICAgICAgY29uZmlnSW5wdXQuaHR0cFJlcXVlc3REYXRhPy51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgZGVsZXRlIGN1cnJlbnQuc2VydmljZUNsYXNzO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9iamVjdEluc3RhbmNlUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdCkge1xuICAgICAgY29uZmlnSW5wdXQuY29uZmlnVGVtcGxhdGVDaGVja2JveD8uKCk/Lmh0dHBSZXF1ZXN0QWxsSWRTZWxlY3RPclVuU2VsZWN0Py51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgZGVsZXRlIGN1cnJlbnQub2JqZWN0SW5zdGFuY2U7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc2VydmljZUNsYXNzUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdCkge1xuICAgICAgY29uZmlnSW5wdXQuY29uZmlnVGVtcGxhdGVDaGVja2JveD8uKCk/Lmh0dHBSZXF1ZXN0QWxsSWRTZWxlY3RPclVuU2VsZWN0Py51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgZGVsZXRlIGN1cnJlbnQuc2VydmljZUNsYXNzO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gY2xvbmVEZWVwKGNvbmZpZ0lucHV0KTtcblxuICAgIGlmIChvYmplY3RJbnN0YW5jZSAmJiBjb25maWcuaHR0cFJlcXVlc3REYXRhKSB7XG4gICAgICBjb25maWcuaHR0cFJlcXVlc3REYXRhLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50Lm9iamVjdEluc3RhbmNlID0gb2JqZWN0SW5zdGFuY2U7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgY29uZmlnSW5wdXQuaHR0cFJlcXVlc3REYXRhPy51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5vYmplY3RJbnN0YW5jZSA9IG9iamVjdEluc3RhbmNlO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHNlcnZpY2VDbGFzcyAmJiBjb25maWcuaHR0cFJlcXVlc3REYXRhKSB7XG4gICAgICBjb25maWcuaHR0cFJlcXVlc3REYXRhLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LnNlcnZpY2VDbGFzcyA9IHNlcnZpY2VDbGFzcztcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgY29uZmlnSW5wdXQuaHR0cFJlcXVlc3REYXRhPy51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5zZXJ2aWNlQ2xhc3MgPSBzZXJ2aWNlQ2xhc3M7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc2VydmljZUNsYXNzUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdCAmJiBjb25maWcuY29uZmlnVGVtcGxhdGVDaGVja2JveCkge1xuICAgICAgY29uZmlnLmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3g/LigpPy5odHRwUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdD8udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdDtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgY29uZmlnSW5wdXQuY29uZmlnVGVtcGxhdGVDaGVja2JveD8uKCk/Lmh0dHBSZXF1ZXN0QWxsSWRTZWxlY3RPclVuU2VsZWN0Py51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5zZXJ2aWNlQ2xhc3MgPSBzZXJ2aWNlQ2xhc3NSZXF1ZXN0QWxsSWRTZWxlY3RPclVuU2VsZWN0O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9iamVjdEluc3RhbmNlUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdCAmJiBjb25maWcuY29uZmlnVGVtcGxhdGVDaGVja2JveCkge1xuICAgICAgY29uZmlnLmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3g/LigpPy5odHRwUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdD8udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQub2JqZWN0SW5zdGFuY2UgPSBvYmplY3RJbnN0YW5jZVJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3Q7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGNvbmZpZ0lucHV0LmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3g/LigpPy5odHRwUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdD8udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQub2JqZWN0SW5zdGFuY2UgPSBvYmplY3RJbnN0YW5jZVJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3Q7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5jbGVhblVwRWZmZWN0LmRlc3Ryb3koKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdChmYWxzZSk7XG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZW1vdmUodGhpcy5jb21wb25lbnRSZWYpO1xuICAgIHRoaXMub25SZWZyZXNoLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5vblNlYXJjaC5jb21wbGV0ZSgpO1xuICAgIHRoaXMub25TZXRIaWRkZW5JdGVtQnlLZXkuY29tcGxldGUoKTtcbiAgICB0aGlzLm9uVXBkYXRlTXVsdGlLZXlTZWxlY3RlZEdyb3VwLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5pc0Rlc3Ryb3llZC5zZXQodHJ1ZSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgI2xpc3RWaWV3Q29udGFpbmVyXG4gIGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiXG4gIFtjbGFzcy53LWZ1bGxdPVwiIW1heEl0ZW1TaG93KClcIlxuICBbY2xhc3MuaC1mdWxsXT1cIiFtYXhJdGVtU2hvdygpIHx8IG1heEl0ZW1TaG93KCkgPT09IC0xXCI+XG4gIEBpZiAobGFiZWxDb25maWcoKTsgYXMgbGFiZWxDb25maWcpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cImxhYmVsQ29uZmlnLmNsYXNzSW5jbHVkZVwiXG4gICAgICBbbGFiZWxMZWZ0XT1cImxhYmVsQ29uZmlnLmxhYmVsTGVmdFwiXG4gICAgICBbbGFiZWxMZWZ0Q2xhc3NdPVwibGFiZWxDb25maWcubGFiZWxMZWZ0Q2xhc3NcIlxuICAgICAgW3JlcXVpcmVkXT1cImxhYmVsQ29uZmlnLnJlcXVpcmVkXCJcbiAgICAgIFtkZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5kZXNjcmlwdGlvblwiXG4gICAgICBbZGVzY3JpcHRpb25DbGFzc109XCJsYWJlbENvbmZpZy5kZXNjcmlwdGlvbkNsYXNzXCJcbiAgICAgIFtsYWJlbFJpZ2h0XT1cImxhYmVsQ29uZmlnLmxhYmVsUmlnaHRcIlxuICAgICAgW2xhYmVsUmlnaHRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0Q2xhc3NcIlxuICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICBbYnV0dG9uc0xlZnRdPVwibGFiZWxDb25maWcuYnV0dG9uc0xlZnRcIlxuICAgICAgW2J1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5idXR0b25zUmlnaHRcIlxuICAgICAgW2Rpc2FibGVCdXR0b25zTGVmdF09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0xlZnQgfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc1JpZ2h0XT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zUmlnaHQgfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtoYXNUb2dnbGVdPVwibGFiZWxDb25maWcuaGFzVG9nZ2xlXCJcbiAgICAgIFt0b2dnbGVBY3RpdmVdPVwibGFiZWxDb25maWcudG9nZ2xlQWN0aXZlXCJcbiAgICAgIFt0b2dnbGVEaXNhYmxlXT1cImxhYmVsQ29uZmlnLnRvZ2dsZURpc2FibGUgfHwgbG9hZGluZygpIHx8IGRpc2FibGUoKVwiXG4gICAgICBbcG9wb3Zlcl09XCJsYWJlbENvbmZpZy5wb3BvdmVyXCJcbiAgICAgIFtpY29uUG9wb3ZlckNsYXNzXT1cImxhYmVsQ29uZmlnLmljb25Qb3BvdmVyQ2xhc3NcIlxuICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICBbbGltaXRMZW5ndGhdPVwibGFiZWxDb25maWcubGltaXRMZW5ndGhcIlxuICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25cIlxuICAgICAgW2Rpc2FibGVCdXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbiB8fCBkaXNhYmxlKClcIlxuICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXCJcbiAgICAgIFtjb3VudF09XCJsYWJlbENvbmZpZy5jb3VudFwiIC8+XG4gIH1cblxuICBAaWYgKCFzaG93VmFsaWRhdGVCb3R0b20oKSkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVZhbGlkYXRlXCIgLz5cbiAgfVxuICBAaWYgKCFoaWRkZW5JbnB1dFNlYXJjaCgpKSB7XG4gICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtc2VhcmNoXG4gICAgICBbc2VhcmNoQ29uZmlnXT1cInNlYXJjaENvbmZpZygpXCJcbiAgICAgIFtjbGFzcy5weC1bMTJweF1dPVwic2VhcmNoUGFkZGluZygpXCJcbiAgICAgIFtjbGFzc109XCJzZWFyY2hDb25maWcoKS5jbGFzc0NvdmVySW5wdXRTZWFyY2hcIlxuICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmcoKSB8fCBmYWxzZVwiXG4gICAgICAob3V0U2VhcmNoKT1cImhhbmRsZXJTZWFyY2goJGV2ZW50KVwiXG4gICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sSW5wdXRTZWFyY2goJGV2ZW50KVwiIC8+XG4gIH1cbiAgQGlmIChjb25maWcoKT8uY29uZmlnRGVzY3JpcHRpb25Hcm91cD8uKCk7IGFzIGRlc2NyaXB0aW9uKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwiZGVzY3JpcHRpb24/LmNsYXNzSW5jbHVkZVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFtjb25maWddPVwiZGVzY3JpcHRpb24/LnRvb2x0aXBEZXNjcmlwdGlvbigpXCI+XG4gICAgICAgIDxkaXYgW2NsYXNzXT1cImRlc2NyaXB0aW9uPy5jbGFzc1RleHREZXNjcmlwdGlvbkluY2x1ZGVcIj57eyBkZXNjcmlwdGlvbi50ZXh0RGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmICghaGlkZGVuSW5wdXRTZWFyY2goKSAmJiBoYXNEaXZpZGVyKCkgJiYgKCFjb25maWcoKT8uaWdub3JlU2hvd0RhdGFXaGVuTm90U2VhcmNoIHx8IGtleVNlYXJjaFN0b3JlKCkpKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCB7eyBkaXZpZGVyQ2xhc3NJbmNsdWRlKCkgPyBkaXZpZGVyQ2xhc3NJbmNsdWRlKCkgOiAnJyB9fVwiXG4gICAgICBbY2xhc3MubGlicy11aS1kaXZpZGVyLWRlZmF1bHRdPVwiISFzZWFyY2hQYWRkaW5nKCkgJiYgIWRpdmlkZXJDbGFzc0luY2x1ZGUoKVwiPjwvZGl2PlxuICB9XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHt7IGNvbmZpZygpPy5pZ25vcmVTaG93RGF0YVdoZW5Ob3RTZWFyY2ggJiYga2V5U2VhcmNoU3RvcmUoKSAmJiAhY29uZmlnKCk/Lmlnbm9yZUZpeEhlaWdodFNob3dEYXRhV2hlbk5vdFNlYXJjaCA/ICdoLVszNTNweF0nIDogJ2gtZnVsbCcgfX1cIj5cbiAgICA8ZGl2XG4gICAgICAjY29udGVudENvbnRhaW5lclxuICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIHt7IGJhY2tncm91bmRMaXN0Q3VzdG9tKCkgfX1cIlxuICAgICAgW2NsYXNzLmxpYnMtdWktZGlzYWJsZV09XCJkaXNhYmxlKCkgJiYgZGlzYWJsZUxhYmVsKClcIlxuICAgICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwiZGlzYWJsZSgpICYmIGRpc2FibGVMYWJlbCgpXCI+PC9kaXY+XG5cbiAgICBAZm9yIChidXR0b25PdGhlciBvZiBidXR0b25zT3RoZXIoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiYmctWyNmZmZmZmZdIGxpYnMtdWktYm9yZGVyLXRvcC1nZW5lcmFsXCJcbiAgICAgICAgW2NsYXNzLnJvdW5kZWQtYi1bNHB4XV09XCIkbGFzdCAmJiAhaGFzQnV0dG9uVW5TZWxlY3RPcHRpb24oKVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiYnV0dG9uT3RoZXIudHlwZSB8fCAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgIFtsYWJlbF09XCJidXR0b25PdGhlci5sYWJlbCB8fCAnICdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIihidXR0b25PdGhlci5jbGFzc0ljb25MZWZ0IHx8ICcnKSArICcgZmxleCBtci1bOHB4XSB0ZXh0LVsxNnB4XSdcIlxuICAgICAgICAgIGNsYXNzSW5jbHVkZT1cInctZnVsbCB0ZXh0LWxlZnQgcm91bmRlZC0wIHt7IGJ1dHRvbk90aGVyLmNsYXNzSW5jbHVkZSA/IGJ1dHRvbk90aGVyLmNsYXNzSW5jbHVkZSA6ICcnIH19XCJcbiAgICAgICAgICBjbGFzc0xhYmVsPVwibGlicy11aS1mb250LWg1ciB3aGl0ZXNwYWNlLW5vcm1hbFwiXG4gICAgICAgICAgW2Rpc2FibGVdPVwiYnV0dG9uT3RoZXIuZGlzYWJsZSB8fCBkaXNhYmxlKCkgfHwgbG9hZGluZygpIHx8IGZhbHNlXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrQnV0dG9uT3RoZXIoYnV0dG9uT3RoZXIpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKGhhc0J1dHRvblVuU2VsZWN0T3B0aW9uKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJiZy1bI2ZmZmZmZl0gcm91bmRlZC1iLVs0cHhdIGxpYnMtdWktYm9yZGVyLXRvcC1nZW5lcmFsXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBsYWJlbD1cImkxOG5fdW5zZWxlY3Rfb3B0aW9uXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uLWxpbmstZGFuZ2VyLWhpZ2hcIlxuICAgICAgICAgIGNsYXNzSWNvbkxlZnQ9XCJmbGV4IG1yLVs4cHhdIGxpYnMtdWktaWNvbi1jbG9zZVwiXG4gICAgICAgICAgY2xhc3NJbmNsdWRlPVwidy1mdWxsIHRleHQtbGVmdCByb3VuZGVkLTBcIlxuICAgICAgICAgIGNsYXNzTGFiZWw9XCJsaWJzLXVpLWZvbnQtaDVyIHdoaXRlc3BhY2Utbm9ybWFsXCJcbiAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlQnV0dG9uVW5TZWxlY3RPcHRpb24oKSB8fCBkaXNhYmxlKCkgfHwgbG9hZGluZygpIHx8IGZhbHNlXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlclJlbW92ZUtleVNlbGVjdGVkKClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmIChzaG93VmFsaWRhdGVCb3R0b20oKSkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVZhbGlkYXRlXCIgLz5cbiAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVWYWxpZGF0ZT5cbiAgQGlmIChpc0Vycm9yUmVxdWlyZWQoKSkge1xuICAgIDxkaXZcbiAgICAgIFtjbGFzcy5tYi1bOHB4XV09XCIhc2hvd1ZhbGlkYXRlQm90dG9tKClcIlxuICAgICAgW2NsYXNzLm10LVs4cHhdXT1cInNob3dWYWxpZGF0ZUJvdHRvbSgpXCI+XG4gICAgICBAbGV0IGNvbnN0SHRtbE1lc3NhZ2UgPSB2YWxpZFJlcXVpcmVkKCk/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRDtcbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwibGlicy11aS10ZXh0LWVycm9yIGxpYnMtdWktZm9udC1oN3JcIlxuICAgICAgICBbaW5uZXJIdG1sXT1cImNvbnN0SHRtbE1lc3NhZ2UgfCB0cmFuc2xhdGU6IHZhbGlkUmVxdWlyZWQoKT8uaW50ZXJwb2xhdGVQYXJhbXNcIj48L3NwYW4+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
439
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBZ0IsVUFBVSxFQUFFLE1BQU0sRUFBeUIsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBZSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pOLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXJHLE9BQU8sRUFBc0IscUNBQXFDLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUU5RyxPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRixPQUFPLEVBQWMsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUzRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsU0FBUyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDL0YsT0FBTyxFQUFFLFNBQVMsRUFBRSx5QkFBeUIsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUs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bUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGdCQUFnQixFQUFFLGVBQWUsRUFBRSw4QkFBOEIsRUFBRSxxQ0FBcUMsRUFBRSxnQ0FBZ0MsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBEZXN0cm95UmVmLCBlZmZlY3QsIEVmZmVjdFJlZiwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCBUZW1wbGF0ZVJlZiwgdW50cmFja2VkLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLWlucHV0JztcbmltcG9ydCB7IElJbnB1dFNlYXJjaENvbmZpZywgTGlic1VpQ29tcG9uZW50c0lucHV0c1NlYXJjaENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXNlYXJjaCc7XG5pbXBvcnQgeyBJVmFsaWRSZXF1aXJlZCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXZhbGlkJztcbmltcG9ydCB7IElMYWJlbCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1sYWJlbCc7XG5pbXBvcnQgeyBJRmxhZ01vdXNlLCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBJUGFnaW5nLCBUWVBFX1RFTVBMQVRFX1JFRiB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsIHNldElucHV0cyB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWR5bmFtaWMtY29tcG9uZW50JztcbmltcG9ydCB7IGNsb25lRGVlcCwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCwgaXNFbXB0eSwgaXNFcXVhbCwgaXNOaWwgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBnZXRDb21wb25lbnRCeVR5cGUsIGluaXRDb25maWcgfSBmcm9tICcuL2RlZmluZXMvbGlzdC5kZWZpbmUnO1xuaW1wb3J0IHsgSURhdGFVcGRhdGVUb1N0b3JlLCBJTGlzdENvbmZpZ0l0ZW0sIElMaXN0RnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSUxpc3REYXRhRW1pdEtleSwgSUxpc3REYXRhRW1pdE11bHRpS2V5IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2RhdGEtZW1pdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpc3RUZW1wbGF0ZXNDb21wb25lbnRBYnN0cmFjdCB9IGZyb20gJy4vdGVtcGxhdGVzL3RlbXBsYXRlcy5jb21wb25lbnQuYWJzdHJhY3QnO1xuXG4vKipcbiAqIENvbXBvbmVudCBoaeG7g24gdGjhu4sgZGFuaCBzw6FjaCDEkWEgbsSDbmcgaOG7lyB0cuG7oyA1IGtp4buDdSB0ZW1wbGF0ZTogdGV4dCwgcmFkaW8sIGNoZWNrYm94LCB0YWcsIGdyb3VwL3RyZWUuXG4gKiBUw61jaCBo4bujcCBz4bq1biB0w6xtIGtp4bq/bSBvbmxpbmUvb2ZmbGluZSwgbGF6eS1sb2FkaW5nIHF1YSBIVFRQLCB2aXJ0dWFsIHNjcm9sbCB2w6AgQW5ndWxhciBTaWduYWxzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8bGlic191aS1jb21wb25lbnRzLWxpc3RcbiAqICAgW2NvbmZpZ109XCJsaXN0Q29uZmlnXCJcbiAqICAgW2tleVNlbGVjdGVkXT1cInNlbGVjdGVkS2V5KClcIlxuICogICAob3V0U2VsZWN0S2V5KT1cIm9uU2VsZWN0KCRldmVudClcIlxuICogICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJvbkZ1bmN0aW9uc0NvbnRyb2woJGV2ZW50KVwiPlxuICogPC9saWJzX3VpLWNvbXBvbmVudHMtbGlzdD5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW05nVGVtcGxhdGVPdXRsZXQsIFRyYW5zbGF0ZU1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzU2VhcmNoQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLy8gI3JlZ2lvbiBQUk9QRVJUWVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCA9IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQ7XG4gIHByb3RlY3RlZCBkaXNhYmxlQnV0dG9uVW5TZWxlY3RPcHRpb24gPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG4gIHByb3RlY3RlZCBpc0Vycm9yUmVxdWlyZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBrZXlTZWFyY2hTdG9yZSA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvblNlYXJjaDogU3ViamVjdDxzdHJpbmcgfCB1bmRlZmluZWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblJlZnJlc2g6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uU2V0SGlkZGVuSXRlbUJ5S2V5OiBTdWJqZWN0PEFycmF5PHVua25vd24+PiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25VcGRhdGVNdWx0aUtleVNlbGVjdGVkR3JvdXA6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uUmVtb3ZlSXRlbXM6IFN1YmplY3Q8QXJyYXk8dW5rbm93bj4+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwZGF0ZURhdGE6IFN1YmplY3Q8SURhdGFVcGRhdGVUb1N0b3JlPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xlYW5VcEVmZmVjdCE6IEVmZmVjdFJlZjtcbiAgcHJpdmF0ZSByZWFkb25seSBpc0Rlc3Ryb3llZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSBjb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8TGlic1VpQ29tcG9uZW50c0xpc3RUZW1wbGF0ZXNDb21wb25lbnRBYnN0cmFjdD47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnRGF0YSA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0+KHtcbiAgICB0eXBlOiAndGV4dCcsXG4gICAgY29uZmlnVGVtcGxhdGVUZXh0OiBzaWduYWwoe1xuICAgICAgZmllbGRLZXk6ICdpZCcsXG4gICAgICBnZXRWYWx1ZTogKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5sYWJlbCB8fCBpdGVtLm5hbWU7XG4gICAgICB9LFxuICAgIH0pLFxuICB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBncm91cE11bHRpS2V5U2VsZWN0ZWQgPSBzaWduYWw8QXJyYXk8dW5rbm93bj4+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmdW5jdGlvbkNvbnRyb2xJbnB1dFNlYXJjaCA9IHNpZ25hbDxJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGhpZGRlbklucHV0U2VhcmNoID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBkcm9wZG93blRhYktleUFjdGl2ZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkga2V5U2VhcmNoID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBwYWRkaW5nTGVmdEl0ZW0gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjb25maWcgPSBpbnB1dDxJTGlzdENvbmZpZ0l0ZW0gfCB1bmRlZmluZWQsIElMaXN0Q29uZmlnSXRlbSB8IHVuZGVmaW5lZD4odGhpcy5jb25maWdEYXRhKCksIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHRoaXMuY29uZmlnRGF0YSgpIH0pO1xuICByZWFkb25seSBhdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBpc1NlYXJjaE9ubGluZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkaXNhYmxlTGFiZWwgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsYWJlbENvbmZpZyA9IGlucHV0PElMYWJlbD4oKTtcbiAgcmVhZG9ubHkgc2VhcmNoQ29uZmlnID0gaW5wdXQ8SUlucHV0U2VhcmNoQ29uZmlnLCBJSW5wdXRTZWFyY2hDb25maWcgfCB1bmRlZmluZWQ+KHt9LCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSB8fCB7fSB9KTtcbiAgcmVhZG9ubHkgc2VhcmNoUGFkZGluZyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRpdmlkZXJDbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGhhc0RpdmlkZXIgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgYnV0dG9uc090aGVyID0gaW5wdXQ8QXJyYXk8SUJ1dHRvbj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGhhc0J1dHRvblVuU2VsZWN0T3B0aW9uID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xpY2tFeGFjdGx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYmFja2dyb3VuZExpc3RDdXN0b20gPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2JnLVsjZmZmZmZmXScsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/ICdiZy1bI2ZmZmZmZl0nIH0pO1xuICByZWFkb25seSBtYXhJdGVtU2hvdyA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkga2V5U2VsZWN0ZWQgPSBpbnB1dDx1bmtub3duPigpO1xuICByZWFkb25seSBtdWx0aUtleVNlbGVjdGVkID0gaW5wdXQ8QXJyYXk8dW5rbm93bj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7IC8vIGzGsHUgw70ga2hpIHPhu60gZOG7pW5nIGxpc3R2aWV3XG4gIHJlYWRvbmx5IGtleXNEaXNhYmxlSXRlbSA9IGlucHV0PEFycmF5PHVua25vd24+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpOyAvLyBraMO0bmcgZMO5bmcgZ2nDoSB0cuG7iyBuw6B5IGvhur90IGjhu6NwIHbhu5tpIHRlbXBsYXRlIGNoZWNrYm94IGPDsyBjb25maWcgY2jhu6lhIGNvbmZpZ0NoZWNrYm94Q2hlY2tBbGxcbiAgcmVhZG9ubHkga2V5c0hpZGRlbkl0ZW0gPSBpbnB1dDxBcnJheTx1bmtub3duPiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTsgLy8ga2jDtG5nIGTDuW5nIGdpw6EgdHLhu4sgbsOgeSBr4bq/dCBo4bujcCB24bubaSB0ZW1wbGF0ZSBjaGVja2JveCBjw7MgY29uZmlnIGNo4bupYSBjb25maWdDaGVja2JveENoZWNrQWxsXG4gIHJlYWRvbmx5IGZvY3VzSW5wdXRTZWFyY2ggPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBza2lwRm9jdXNJbnB1dFdoZW5LZXlTZWFyY2hTdG9yZVVuZGVmaW5lZCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGZ1bmN0aW9uR2V0SXRlbXNBdXRvQWRkTGlzdCA9IGlucHV0PCgoKSA9PiBBcnJheTxhbnk+KSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElWYWxpZFJlcXVpcmVkIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSBzaG93VmFsaWRhdGVCb3R0b20gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGxvYWRpbmdJY29uU2l6ZSA9IGlucHV0PCdsYXJnZScgfCAnbWVkaXVtJyB8ICdzbWFsbCcgfCAnc21hbGxlcicgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlUmVmU2VhcmNoTm9EYXRhID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSB0ZW1wbGF0ZVJlZk5vdFNlYXJjaE5vRGF0YSA9IGlucHV0PFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgcmVzZXRLZXlXaGVuU2VsZWN0QWxsS2V5RHJvcGRvd24gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVDbGFzc0Rpc2FibGVEZWZhdWx0V2hlblVzZUtleXNEaXNhYmxlSXRlbSA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIGLhu48gY2jhur8gxJHhu5kgZGlzYWJsZSBpdGVtIHRyw6puIGh0bWwgxJHhu4MgZGlzYWJsZSB04burbmcgcGjhuqduIHRyb25nIHJvd3NcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRTZWxlY3RLZXkgPSBvdXRwdXQ8SUxpc3REYXRhRW1pdEtleSB8IHVuZGVmaW5lZD4oKTsgLy8gc+G7rSBk4bulbmcgY2hvIHR5cGUgY2jhu41uIDFcbiAgcmVhZG9ubHkgb3V0U2VsZWN0TXVsdGlLZXkgPSBvdXRwdXQ8SUxpc3REYXRhRW1pdE11bHRpS2V5IHwgdW5kZWZpbmVkPigpOyAvLyBz4butIGThu6VuZyBjaG8gdHlwZSBjaG8gcGjDqXAgY2jhu41uIG5oaeG7gXUuXG4gIHJlYWRvbmx5IG91dFVuU2VsZWN0TXVsdGlLZXkgPSBvdXRwdXQ8QXJyYXk8dW5rbm93bj4+KCk7IC8vIHPhu60gZOG7pW5nIGNobyB0eXBlIGNobyBwaMOpcCBjaOG7jW4gbmhp4buBdS5cbiAgcmVhZG9ubHkgb3V0Q2xpY2tCdXR0b25PdGhlciA9IG91dHB1dDxJQnV0dG9uPigpO1xuICByZWFkb25seSBvdXRGaWVsZEtleSA9IG91dHB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nZVZpZXcgPSBvdXRwdXQ8QXJyYXk8YW55Pj4oKTtcbiAgcmVhZG9ubHkgb3V0S2V5U2VhcmNoID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZGluZyA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElMaXN0RnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyID0gb3V0cHV0PElGbGFnTW91c2U+KCk7XG4gIHJlYWRvbmx5IG91dExvYWRJdGVtc0NvbXBsZXRlID0gb3V0cHV0PHsgaXRlbXM6IEFycmF5PGFueT47IHBhZ2luZz86IElQYWdpbmcgfT4oKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHByb3RlY3RlZCBsaXN0Vmlld0VsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2xpc3RWaWV3Q29udGFpbmVyJyk7XG4gIHByb3RlY3RlZCBjb250ZW50RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignY29udGVudENvbnRhaW5lcicpO1xuXG4gIC8vICNyZWdpb24gSU5KRUNUXG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY0NvbXBvbmVudFNlcnZpY2UgPSBpbmplY3QoTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY2xlYW5VcEVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMua2V5U2VhcmNoKCk7XG5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmtleVNlYXJjaFN0b3JlKCkgPT09IHRoaXMua2V5U2VhcmNoKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5rZXlTZWFyY2hTdG9yZS5zZXQodmFsdWUpO1xuICAgICAgICB0aGlzLm9uU2VhcmNoLm5leHQodmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qga2V5c0Rpc2FibGVJdGVtID0gdGhpcy5rZXlzRGlzYWJsZUl0ZW0oKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICghaXNOaWwoa2V5c0Rpc2FibGVJdGVtKSkge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmPy5zZXRJbnB1dCgna2V5c0Rpc2FibGVJdGVtJywga2V5c0Rpc2FibGVJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qga2V5c0hpZGRlbkl0ZW0gPSB0aGlzLmtleXNIaWRkZW5JdGVtKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoIWlzTmlsKGtleXNIaWRkZW5JdGVtKSkge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmPy5zZXRJbnB1dCgna2V5c0hpZGRlbkl0ZW0nLCBrZXlzSGlkZGVuSXRlbSk7XG4gICAgICAgICAgdGhpcy5vblNldEhpZGRlbkl0ZW1CeUtleS5uZXh0KGtleXNIaWRkZW5JdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgZGlzYWJsZSA9IHRoaXMuZGlzYWJsZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKCFpc05pbChkaXNhYmxlKSkge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmPy5zZXRJbnB1dCgnZGlzYWJsZScsIGRpc2FibGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBrZXlTZWxlY3RlZCA9IHRoaXMua2V5U2VsZWN0ZWQoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICghaXNOaWwoa2V5U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZWY/LnNldElucHV0KCdrZXlTZWxlY3RlZCcsIGtleVNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBsZXQgb2xkTXVsdGlLZXlTZWxlY3RlZCA9IHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBtdWx0aUtleVNlbGVjdGVkID0gdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk7XG4gICAgICBpZiAoaXNFcXVhbChvbGRNdWx0aUtleVNlbGVjdGVkLCBtdWx0aUtleVNlbGVjdGVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvbGRNdWx0aUtleVNlbGVjdGVkID0gbXVsdGlLZXlTZWxlY3RlZDtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICghaXNOaWwobXVsdGlLZXlTZWxlY3RlZCkpIHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZj8uc2V0SW5wdXQoJ211bHRpS2V5U2VsZWN0ZWQnLCBtdWx0aUtleVNlbGVjdGVkKTtcbiAgICAgICAgICBpZiAodGhpcy5jb25maWdEYXRhKCk/LnR5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgICAgIHRoaXMub25VcGRhdGVNdWx0aUtleVNlbGVjdGVkR3JvdXAubmV4dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duVGFiS2V5QWN0aXZlKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuICAgIGlmICh0aGlzLmtleVNlYXJjaCgpKSB7XG4gICAgICB0aGlzLmtleVNlYXJjaFN0b3JlLnNldCh0aGlzLmtleVNlYXJjaCgpKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcoKTtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZ0RhdGEuc2V0KHRoaXMuY2xvbmVDb25maWcoY29uZmlnKSk7XG4gICAgfVxuICAgIGluaXRDb25maWcodGhpcy5jb25maWdEYXRhKCkpO1xuICAgIGNvbnN0IGNvbXBDbGFzcyA9IGdldENvbXBvbmVudEJ5VHlwZSh0aGlzLmNvbmZpZ0RhdGEoKS50eXBlKTtcblxuICAgIHRoaXMuY29tcG9uZW50UmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wQ2xhc3MpO1xuXG4gICAgdGltZXIoMClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuYWRkVG9FbGVtZW50KHRoaXMuY29tcG9uZW50UmVmLCB0aGlzLmNvbnRlbnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ29uU2V0SGlkZGVuSXRlbUJ5S2V5JywgdGhpcy5vblNldEhpZGRlbkl0ZW1CeUtleSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2NvbmZpZycsIHRoaXMuY29uZmlnRGF0YSgpKTtcblxuICAgIGlmICh0aGlzLnNlYXJjaENvbmZpZygpKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnc2VhcmNoQ29uZmlnJywgdGhpcy5zZWFyY2hDb25maWcoKSk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblNlYXJjaCcsIHRoaXMub25TZWFyY2gpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblJlZnJlc2gnLCB0aGlzLm9uUmVmcmVzaCk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ29uVXBkYXRlRGF0YScsIHRoaXMub25VcGRhdGVEYXRhKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgna2V5U2VhcmNoJywgdGhpcy5rZXlTZWFyY2hTdG9yZSgpID8/ICcnKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnZHJvcGRvd25UYWJLZXlBY3RpdmUnLCB0aGlzLmRyb3Bkb3duVGFiS2V5QWN0aXZlKCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdjbGlja0V4YWN0bHknLCB0aGlzLmNsaWNrRXhhY3RseSgpIHx8IGZhbHNlKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnZGlzYWJsZScsIHRoaXMuZGlzYWJsZSgpKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnYXV0b1NlbGVjdGVkRmlyc3RJdGVtQ2FsbE91dHNpZGVCZWZvcmUnLCB0aGlzLmF1dG9TZWxlY3RlZEZpcnN0SXRlbUNhbGxPdXRzaWRlQmVmb3JlKCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdwYWRkaW5nTGVmdEl0ZW0nLCB0aGlzLnBhZGRpbmdMZWZ0SXRlbSgpKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgncmVzZXRLZXlXaGVuU2VsZWN0QWxsS2V5RHJvcGRvd24nLCB0aGlzLnJlc2V0S2V5V2hlblNlbGVjdEFsbEtleURyb3Bkb3duKCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdpZ25vcmVDbGFzc0Rpc2FibGVEZWZhdWx0V2hlblVzZUtleXNEaXNhYmxlSXRlbScsIHRoaXMuaWdub3JlQ2xhc3NEaXNhYmxlRGVmYXVsdFdoZW5Vc2VLZXlzRGlzYWJsZUl0ZW0oKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2Z1bmN0aW9uR2V0SXRlbXNBdXRvQWRkTGlzdCcsIHRoaXMuZnVuY3Rpb25HZXRJdGVtc0F1dG9BZGRMaXN0KCkpO1xuICAgIGlmICh0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdtYXhJdGVtU2hvdycsIHRoaXMubWF4SXRlbVNob3coKSk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdrZXlTZWxlY3RlZCcsIHRoaXMua2V5U2VsZWN0ZWQoKSk7XG4gICAgaWYgKHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnbXVsdGlLZXlTZWxlY3RlZCcsIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpKTtcbiAgICB9XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2tleXNEaXNhYmxlSXRlbScsIHRoaXMua2V5c0Rpc2FibGVJdGVtKCkgfHwgW10pO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdrZXlzSGlkZGVuSXRlbScsIHRoaXMua2V5c0hpZGRlbkl0ZW0oKSB8fCBbXSk7XG4gICAgaWYgKCFpc05pbCh0aGlzLmtleVNlbGVjdGVkKCkpIHx8IHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUJ1dHRvblVuU2VsZWN0T3B0aW9uLnNldChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblVwZGF0ZU11bHRpS2V5U2VsZWN0ZWRHcm91cCcsIHRoaXMub25VcGRhdGVNdWx0aUtleVNlbGVjdGVkR3JvdXApO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCdvblJlbW92ZUl0ZW1zJywgdGhpcy5vblJlbW92ZUl0ZW1zKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnekluZGV4JywgdGhpcy56SW5kZXgoKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2lzU2VhcmNoT25saW5lJywgdGhpcy5pc1NlYXJjaE9ubGluZSgpKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dCgnZGlzYWJsZUxhYmVsJywgdGhpcy5kaXNhYmxlTGFiZWwoKSB8fCBmYWxzZSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2xvYWRpbmdJY29uU2l6ZScsIHRoaXMubG9hZGluZ0ljb25TaXplKCkpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KCd0ZW1wbGF0ZVJlZlNlYXJjaE5vRGF0YScsIHRoaXMudGVtcGxhdGVSZWZTZWFyY2hOb0RhdGEoKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuc2V0SW5wdXQoJ3RlbXBsYXRlUmVmTm90U2VhcmNoTm9EYXRhJywgdGhpcy50ZW1wbGF0ZVJlZk5vdFNlYXJjaE5vRGF0YSgpKTtcbiAgICBsZXQga2V5U2VhcmNoID0gJyc7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlO1xuXG4gICAgaW5zdGFuY2Uub3V0Q2hhbmdlVmlldy5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMub3V0Q2hhbmdlVmlldy5lbWl0KGRhdGEpO1xuXG4gICAgICBpZiAodGhpcy5za2lwRm9jdXNJbnB1dFdoZW5LZXlTZWFyY2hTdG9yZVVuZGVmaW5lZCgpICYmIGlzTmlsKHRoaXMua2V5U2VhcmNoU3RvcmUoKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZm9jdXNJbnB1dFNlYXJjaCgpICYmIHRoaXMua2V5U2VhcmNoU3RvcmUoKSAhPT0ga2V5U2VhcmNoKSB7XG4gICAgICAgIGtleVNlYXJjaCA9IHRoaXMua2V5U2VhcmNoU3RvcmUoKSB8fCAnJztcbiAgICAgICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xJbnB1dFNlYXJjaCgpPy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGluc3RhbmNlLm91dFNlbGVjdEtleS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuZGlzYWJsZUJ1dHRvblVuU2VsZWN0T3B0aW9uLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dFNlbGVjdEtleS5lbWl0KGRhdGEpO1xuICAgICAgdGhpcy5jaGVja0lzVmFsaWQoKTtcbiAgICB9KTtcbiAgICBpbnN0YW5jZS5vdXRGaWVsZEtleS5zdWJzY3JpYmUoKGZpZWxkS2V5Pzogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLm91dEZpZWxkS2V5LmVtaXQoZmllbGRLZXkpO1xuICAgIH0pO1xuICAgIGluc3RhbmNlLm91dExvYWRpbmcuc3Vic2NyaWJlKChsb2FkaW5nOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGxvYWRpbmcpO1xuICAgICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQobG9hZGluZyk7XG4gICAgfSk7XG4gICAgaW5zdGFuY2Uub3V0TG9hZEl0ZW1zQ29tcGxldGUuc3Vic2NyaWJlKChldmVudDogeyBpdGVtczogQXJyYXk8YW55PjsgcGFnaW5nPzogSVBhZ2luZyB9KSA9PiB7XG4gICAgICB0aGlzLm91dExvYWRJdGVtc0NvbXBsZXRlLmVtaXQoZXZlbnQpO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZVRleHQ/LigpPy5hY3Rpb25Tb3J0KSB7XG4gICAgICBpbnN0YW5jZS5vdXRTb3J0U2luZ2xlU2VsZWN0LnN1YnNjcmliZSgoaXRlbVNvcnQpID0+IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcoKTtcbiAgICAgICAgaWYgKGNvbmZpZz8uY29uZmlnVGVtcGxhdGVUZXh0Py4oKT8uYWN0aW9uU29ydCkge1xuICAgICAgICAgIGNvbmZpZy5jb25maWdUZW1wbGF0ZVRleHQoKT8uaXRlbVNvcnQ/LnNldChpdGVtU29ydCk7XG4gICAgICAgICAgY29uZmlnLmNvbmZpZ1RlbXBsYXRlVGV4dCgpPy5hY3Rpb25Tb3J0Py4oaXRlbVNvcnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaW5zdGFuY2Uub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIuc3Vic2NyaWJlKChmbGFnOiBJRmxhZ01vdXNlKSA9PiB7XG4gICAgICB0aGlzLm91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyLmVtaXQoZmxhZyk7XG4gICAgfSk7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuY29uZmlnRGF0YSgpPy50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09ICd0ZXh0JyB8fCB0eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlLm91dFNlbGVjdE11bHRpS2V5LnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlQnV0dG9uVW5TZWxlY3RPcHRpb24uc2V0KGZhbHNlKTtcbiAgICAgIGlmICh0eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBNdWx0aUtleVNlbGVjdGVkLnNldChkYXRhLmtleXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KGRhdGEpO1xuICAgICAgdGhpcy5jaGVja0lzVmFsaWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrSXNWYWxpZDogdGhpcy5jaGVja0lzVmFsaWQuYmluZCh0aGlzKSxcbiAgICAgIHJlZnJlc2g6IHRoaXMucmVmcmVzaC5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRLZXlTZWxlY3RlZDogdGhpcy5oYW5kbGVyUmVtb3ZlS2V5U2VsZWN0ZWQuYmluZCh0aGlzKSxcbiAgICAgIGdldFJlY3RMaXN0VmlldzogYXN5bmMgKCkgPT4gdGhpcy5saXN0Vmlld0VsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHJlbW92ZUl0ZW1zOiBhc3luYyAoa2V5cykgPT4gdGhpcy5vblJlbW92ZUl0ZW1zLm5leHQoa2V5cyksXG4gICAgICB1cGRhdGVEYXRhOiBhc3luYyAoZGF0YSkgPT4gdGhpcy5vblVwZGF0ZURhdGEubmV4dChkYXRhKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWFyY2goa2V5U2VhcmNoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmtleVNlYXJjaFN0b3JlLnNldChrZXlTZWFyY2gpO1xuICAgIHRoaXMub25TZWFyY2gubmV4dChrZXlTZWFyY2gpO1xuICAgIHRoaXMub3V0S2V5U2VhcmNoLmVtaXQoa2V5U2VhcmNoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUmVtb3ZlS2V5U2VsZWN0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZiB8fCB0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRTZWxlY3RLZXkuZW1pdCh1bmRlZmluZWQpO1xuICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdCh1bmRlZmluZWQpO1xuICAgIHNldElucHV0cyh0aGlzLmNvbXBvbmVudFJlZiwge1xuICAgICAga2V5U2VsZWN0ZWQ6ICcnLFxuICAgICAgbXVsdGlLZXlTZWxlY3RlZDogW10sXG4gICAgfSwgZmFsc2UpO1xuICAgIHRoaXMuZGlzYWJsZUJ1dHRvblVuU2VsZWN0T3B0aW9uLnNldCh0cnVlKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZ0RhdGEoKT8udHlwZSA9PT0gJ2dyb3VwJykge1xuICAgICAgdGhpcy5vblVwZGF0ZU11bHRpS2V5U2VsZWN0ZWRHcm91cC5uZXh0KCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2hlY2tJc1ZhbGlkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrQnV0dG9uT3RoZXIoYnV0dG9uOiBJQnV0dG9uKSB7XG4gICAgdGhpcy5vdXRDbGlja0J1dHRvbk90aGVyLmVtaXQoYnV0dG9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sSW5wdXRTZWFyY2goZXZlbnQ6IElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xJbnB1dFNlYXJjaC5zZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0lzVmFsaWQoKSB7XG4gICAgaWYgKCF0aGlzLnZhbGlkUmVxdWlyZWQoKSB8fCAhdGhpcy5jb25maWcoKT8udHlwZSB8fCAhdGhpcy5jb21wb25lbnRSZWY/Lmluc3RhbmNlKSB7XG4gICAgICB0aGlzLmlzRXJyb3JSZXF1aXJlZC5zZXQoZmFsc2UpO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuY29uZmlnKCk/LnR5cGU7XG4gICAgbGV0IGhhc0tleSA9ICFpc0VtcHR5KHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLm11bHRpS2V5U2VsZWN0ZWQoKSk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2dyb3VwJykge1xuICAgICAgaGFzS2V5ID0gIWlzRW1wdHkodGhpcy5ncm91cE11bHRpS2V5U2VsZWN0ZWQoKSk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAndGV4dCcgfHwgdHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgaGFzS2V5ID0gIWlzTmlsKHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmtleVNlbGVjdGVkKCkpO1xuICAgIH1cbiAgICB0aGlzLmlzRXJyb3JSZXF1aXJlZC5zZXQoIWhhc0tleSk7XG5cbiAgICByZXR1cm4gaGFzS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoKCkge1xuICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZygpO1xuICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25maWdEYXRhLnNldCh0aGlzLmNsb25lQ29uZmlnKGNvbmZpZykpO1xuICAgICAgdGhpcy5vblJlZnJlc2gubmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUNvbmZpZyhjb25maWdJbnB1dDogSUxpc3RDb25maWdJdGVtKTogSUxpc3RDb25maWdJdGVtIHtcbiAgICBpZiAoIWNvbmZpZ0lucHV0KSB7XG4gICAgICByZXR1cm4ge30gYXMgYW55O1xuICAgIH1cbiAgICBjb25zdCBvYmplY3RJbnN0YW5jZSA9IGNvbmZpZ0lucHV0Lmh0dHBSZXF1ZXN0RGF0YT8uKCk/Lm9iamVjdEluc3RhbmNlO1xuICAgIGNvbnN0IHNlcnZpY2VDbGFzcyA9IGNvbmZpZ0lucHV0Lmh0dHBSZXF1ZXN0RGF0YT8uKCk/LnNlcnZpY2VDbGFzcztcbiAgICBjb25zdCBvYmplY3RJbnN0YW5jZVJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3QgPSBjb25maWdJbnB1dC5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py4oKT8uaHR0cFJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3Q/LigpPy5vYmplY3RJbnN0YW5jZTtcbiAgICBjb25zdCBzZXJ2aWNlQ2xhc3NSZXF1ZXN0QWxsSWRTZWxlY3RPclVuU2VsZWN0ID0gY29uZmlnSW5wdXQuY29uZmlnVGVtcGxhdGVDaGVja2JveD8uKCk/Lmh0dHBSZXF1ZXN0QWxsSWRTZWxlY3RPclVuU2VsZWN0Py4oKT8uc2VydmljZUNsYXNzO1xuXG4gICAgaWYgKG9iamVjdEluc3RhbmNlKSB7XG4gICAgICBjb25maWdJbnB1dC5odHRwUmVxdWVzdERhdGE/LnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBkZWxldGUgY3VycmVudC5vYmplY3RJbnN0YW5jZTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzZXJ2aWNlQ2xhc3MpIHtcbiAgICAgIGNvbmZpZ0lucHV0Lmh0dHBSZXF1ZXN0RGF0YT8udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGRlbGV0ZSBjdXJyZW50LnNlcnZpY2VDbGFzcztcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvYmplY3RJbnN0YW5jZVJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3QpIHtcbiAgICAgIGNvbmZpZ0lucHV0LmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3g/LigpPy5odHRwUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdD8udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGRlbGV0ZSBjdXJyZW50Lm9iamVjdEluc3RhbmNlO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHNlcnZpY2VDbGFzc1JlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3QpIHtcbiAgICAgIGNvbmZpZ0lucHV0LmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3g/LigpPy5odHRwUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdD8udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGRlbGV0ZSBjdXJyZW50LnNlcnZpY2VDbGFzcztcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IGNsb25lRGVlcChjb25maWdJbnB1dCk7XG5cbiAgICBpZiAob2JqZWN0SW5zdGFuY2UgJiYgY29uZmlnLmh0dHBSZXF1ZXN0RGF0YSkge1xuICAgICAgY29uZmlnLmh0dHBSZXF1ZXN0RGF0YS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5vYmplY3RJbnN0YW5jZSA9IG9iamVjdEluc3RhbmNlO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIGNvbmZpZ0lucHV0Lmh0dHBSZXF1ZXN0RGF0YT8udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQub2JqZWN0SW5zdGFuY2UgPSBvYmplY3RJbnN0YW5jZTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzZXJ2aWNlQ2xhc3MgJiYgY29uZmlnLmh0dHBSZXF1ZXN0RGF0YSkge1xuICAgICAgY29uZmlnLmh0dHBSZXF1ZXN0RGF0YS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5zZXJ2aWNlQ2xhc3MgPSBzZXJ2aWNlQ2xhc3M7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGNvbmZpZ0lucHV0Lmh0dHBSZXF1ZXN0RGF0YT8udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHNlcnZpY2VDbGFzc1JlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3QgJiYgY29uZmlnLmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3gpIHtcbiAgICAgIGNvbmZpZy5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py4oKT8uaHR0cFJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3Q/LnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LnNlcnZpY2VDbGFzcyA9IHNlcnZpY2VDbGFzc1JlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3Q7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGNvbmZpZ0lucHV0LmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3g/LigpPy5odHRwUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdD8udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzUmVxdWVzdEFsbElkU2VsZWN0T3JVblNlbGVjdDtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvYmplY3RJbnN0YW5jZVJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3QgJiYgY29uZmlnLmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3gpIHtcbiAgICAgIGNvbmZpZy5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py4oKT8uaHR0cFJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3Q/LnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50Lm9iamVjdEluc3RhbmNlID0gb2JqZWN0SW5zdGFuY2VSZXF1ZXN0QWxsSWRTZWxlY3RPclVuU2VsZWN0O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBjb25maWdJbnB1dC5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py4oKT8uaHR0cFJlcXVlc3RBbGxJZFNlbGVjdE9yVW5TZWxlY3Q/LnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50Lm9iamVjdEluc3RhbmNlID0gb2JqZWN0SW5zdGFuY2VSZXF1ZXN0QWxsSWRTZWxlY3RPclVuU2VsZWN0O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY2xlYW5VcEVmZmVjdC5kZXN0cm95KCk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQoZmFsc2UpO1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMuY29tcG9uZW50UmVmKTtcbiAgICB0aGlzLm9uUmVmcmVzaC5jb21wbGV0ZSgpO1xuICAgIHRoaXMub25TZWFyY2guY29tcGxldGUoKTtcbiAgICB0aGlzLm9uU2V0SGlkZGVuSXRlbUJ5S2V5LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5vblVwZGF0ZU11bHRpS2V5U2VsZWN0ZWRHcm91cC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuaXNEZXN0cm95ZWQuc2V0KHRydWUpO1xuICB9XG59XG4iLCI8ZGl2XG4gICNsaXN0Vmlld0NvbnRhaW5lclxuICBjbGFzcz1cImZsZXggZmxleC1jb2xcIlxuICBbY2xhc3Mudy1mdWxsXT1cIiFtYXhJdGVtU2hvdygpXCJcbiAgW2NsYXNzLmgtZnVsbF09XCIhbWF4SXRlbVNob3coKSB8fCBtYXhJdGVtU2hvdygpID09PSAtMVwiPlxuICBAaWYgKGxhYmVsQ29uZmlnKCk7IGFzIGxhYmVsQ29uZmlnKSB7XG4gICAgPGxpYnNfdWktY29tcG9uZW50cy1sYWJlbFxuICAgICAgW2NsYXNzSW5jbHVkZV09XCJsYWJlbENvbmZpZy5jbGFzc0luY2x1ZGVcIlxuICAgICAgW2xhYmVsTGVmdF09XCJsYWJlbENvbmZpZy5sYWJlbExlZnRcIlxuICAgICAgW2xhYmVsTGVmdENsYXNzXT1cImxhYmVsQ29uZmlnLmxhYmVsTGVmdENsYXNzXCJcbiAgICAgIFtyZXF1aXJlZF09XCJsYWJlbENvbmZpZy5yZXF1aXJlZFwiXG4gICAgICBbZGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgW2Rlc2NyaXB0aW9uQ2xhc3NdPVwibGFiZWxDb25maWcuZGVzY3JpcHRpb25DbGFzc1wiXG4gICAgICBbbGFiZWxSaWdodF09XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0XCJcbiAgICAgIFtsYWJlbFJpZ2h0Q2xhc3NdPVwibGFiZWxDb25maWcubGFiZWxSaWdodENsYXNzXCJcbiAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgW2J1dHRvbnNMZWZ0XT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNMZWZ0XCJcbiAgICAgIFtidXR0b25zUmlnaHRdPVwibGFiZWxDb25maWcuYnV0dG9uc1JpZ2h0XCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc0xlZnRdPVwibGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNMZWZ0IHx8IGRpc2FibGUoKVwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc1JpZ2h0IHx8IGRpc2FibGUoKVwiXG4gICAgICBbaGFzVG9nZ2xlXT1cImxhYmVsQ29uZmlnLmhhc1RvZ2dsZVwiXG4gICAgICBbdG9nZ2xlQWN0aXZlXT1cImxhYmVsQ29uZmlnLnRvZ2dsZUFjdGl2ZVwiXG4gICAgICBbdG9nZ2xlRGlzYWJsZV09XCJsYWJlbENvbmZpZy50b2dnbGVEaXNhYmxlIHx8IGxvYWRpbmcoKSB8fCBkaXNhYmxlKClcIlxuICAgICAgW3BvcG92ZXJdPVwibGFiZWxDb25maWcucG9wb3ZlclwiXG4gICAgICBbaWNvblBvcG92ZXJDbGFzc109XCJsYWJlbENvbmZpZy5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgW2xpbWl0TGVuZ3RoXT1cImxhYmVsQ29uZmlnLmxpbWl0TGVuZ3RoXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zRGVzY3JpcHRpb24gfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc109XCJsYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc1wiXG4gICAgICBbY291bnRdPVwibGFiZWxDb25maWcuY291bnRcIiAvPlxuICB9XG5cbiAgQGlmICghc2hvd1ZhbGlkYXRlQm90dG9tKCkpIHtcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVWYWxpZGF0ZVwiIC8+XG4gIH1cbiAgQGlmICghaGlkZGVuSW5wdXRTZWFyY2goKSkge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXNlYXJjaFxuICAgICAgW3NlYXJjaENvbmZpZ109XCJzZWFyY2hDb25maWcoKVwiXG4gICAgICBbY2xhc3MucHgtWzEycHhdXT1cInNlYXJjaFBhZGRpbmcoKVwiXG4gICAgICBbY2xhc3NdPVwic2VhcmNoQ29uZmlnKCkuY2xhc3NDb3ZlcklucHV0U2VhcmNoXCJcbiAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCBsb2FkaW5nKCkgfHwgZmFsc2VcIlxuICAgICAgKG91dFNlYXJjaCk9XCJoYW5kbGVyU2VhcmNoKCRldmVudClcIlxuICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbElucHV0U2VhcmNoKCRldmVudClcIiAvPlxuICB9XG4gIEBpZiAoY29uZmlnKCk/LmNvbmZpZ0Rlc2NyaXB0aW9uR3JvdXA/LigpOyBhcyBkZXNjcmlwdGlvbikge1xuICAgIDxkaXYgW2NsYXNzXT1cImRlc2NyaXB0aW9uPy5jbGFzc0luY2x1ZGVcIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbY29uZmlnXT1cImRlc2NyaXB0aW9uPy50b29sdGlwRGVzY3JpcHRpb24oKVwiPlxuICAgICAgICA8ZGl2IFtjbGFzc109XCJkZXNjcmlwdGlvbj8uY2xhc3NUZXh0RGVzY3JpcHRpb25JbmNsdWRlXCI+e3sgZGVzY3JpcHRpb24udGV4dERlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAoIWhpZGRlbklucHV0U2VhcmNoKCkgJiYgaGFzRGl2aWRlcigpICYmICghY29uZmlnKCk/Lmlnbm9yZVNob3dEYXRhV2hlbk5vdFNlYXJjaCB8fCBrZXlTZWFyY2hTdG9yZSgpKSkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibGlicy11aS1ib3JkZXItdG9wLWdlbmVyYWwge3sgZGl2aWRlckNsYXNzSW5jbHVkZSgpID8gZGl2aWRlckNsYXNzSW5jbHVkZSgpIDogJycgfX1cIlxuICAgICAgW2NsYXNzLmxpYnMtdWktZGl2aWRlci1kZWZhdWx0XT1cIiEhc2VhcmNoUGFkZGluZygpICYmICFkaXZpZGVyQ2xhc3NJbmNsdWRlKClcIj48L2Rpdj5cbiAgfVxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB7eyBjb25maWcoKT8uaWdub3JlU2hvd0RhdGFXaGVuTm90U2VhcmNoICYmIGtleVNlYXJjaFN0b3JlKCkgJiYgIWNvbmZpZygpPy5pZ25vcmVGaXhIZWlnaHRTaG93RGF0YVdoZW5Ob3RTZWFyY2ggPyAnaC1bMzUzcHhdJyA6ICdoLWZ1bGwnIH19XCI+XG4gICAgPGRpdlxuICAgICAgI2NvbnRlbnRDb250YWluZXJcbiAgICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbCB7eyBiYWNrZ3JvdW5kTGlzdEN1c3RvbSgpIH19XCJcbiAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGVdPVwiZGlzYWJsZSgpICYmIGRpc2FibGVMYWJlbCgpXCJcbiAgICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1ub25lXT1cImRpc2FibGUoKSAmJiBkaXNhYmxlTGFiZWwoKVwiPjwvZGl2PlxuXG4gICAgQGZvciAoYnV0dG9uT3RoZXIgb2YgYnV0dG9uc090aGVyKCk7IHRyYWNrIGJ1dHRvbk90aGVyKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiYmctWyNmZmZmZmZdIGxpYnMtdWktYm9yZGVyLXRvcC1nZW5lcmFsXCJcbiAgICAgICAgW2NsYXNzLnJvdW5kZWQtYi1bNHB4XV09XCIkbGFzdCAmJiAhaGFzQnV0dG9uVW5TZWxlY3RPcHRpb24oKVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiYnV0dG9uT3RoZXIudHlwZSB8fCAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgIFtsYWJlbF09XCJidXR0b25PdGhlci5sYWJlbCB8fCAnICdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIihidXR0b25PdGhlci5jbGFzc0ljb25MZWZ0IHx8ICcnKSArICcgZmxleCBtci1bOHB4XSB0ZXh0LVsxNnB4XSdcIlxuICAgICAgICAgIGNsYXNzSW5jbHVkZT1cInctZnVsbCB0ZXh0LWxlZnQgcm91bmRlZC0wIHt7IGJ1dHRvbk90aGVyLmNsYXNzSW5jbHVkZSA/IGJ1dHRvbk90aGVyLmNsYXNzSW5jbHVkZSA6ICcnIH19XCJcbiAgICAgICAgICBjbGFzc0xhYmVsPVwibGlicy11aS1mb250LWg1cmkgd2hpdGVzcGFjZS1ub3JtYWxcIlxuICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbk90aGVyLmRpc2FibGUgfHwgZGlzYWJsZSgpIHx8IGxvYWRpbmcoKSB8fCBmYWxzZVwiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0J1dHRvbk90aGVyKGJ1dHRvbk90aGVyKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChoYXNCdXR0b25VblNlbGVjdE9wdGlvbigpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiYmctWyNmZmZmZmZdIHJvdW5kZWQtYi1bNHB4XSBsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbFwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgbGFiZWw9XCJpMThuX3Vuc2VsZWN0X29wdGlvblwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvbi1saW5rLWRhbmdlci1oaWdoXCJcbiAgICAgICAgICBjbGFzc0ljb25MZWZ0PVwiZmxleCBtci1bOHB4XSBsaWJzLXVpLWljb24tY2xvc2VcIlxuICAgICAgICAgIGNsYXNzSW5jbHVkZT1cInctZnVsbCB0ZXh0LWxlZnQgcm91bmRlZC0wXCJcbiAgICAgICAgICBjbGFzc0xhYmVsPVwibGlicy11aS1mb250LWg1cmkgd2hpdGVzcGFjZS1ub3JtYWxcIlxuICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGVCdXR0b25VblNlbGVjdE9wdGlvbigpIHx8IGRpc2FibGUoKSB8fCBsb2FkaW5nKCkgfHwgZmFsc2VcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyUmVtb3ZlS2V5U2VsZWN0ZWQoKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKHNob3dWYWxpZGF0ZUJvdHRvbSgpKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlVmFsaWRhdGVcIiAvPlxuICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZVZhbGlkYXRlPlxuICBAaWYgKGlzRXJyb3JSZXF1aXJlZCgpKSB7XG4gICAgPGRpdlxuICAgICAgW2NsYXNzLm1iLVs4cHhdXT1cIiFzaG93VmFsaWRhdGVCb3R0b20oKVwiXG4gICAgICBbY2xhc3MubXQtWzhweF1dPVwic2hvd1ZhbGlkYXRlQm90dG9tKClcIj5cbiAgICAgIEBsZXQgY29uc3RIdG1sTWVzc2FnZSA9IHZhbGlkUmVxdWlyZWQoKT8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEO1xuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJsaWJzLXVpLXRleHQtZXJyb3IgbGlicy11aS1mb250LWg3clwiXG4gICAgICAgIFtpbm5lckh0bWxdPVwiY29uc3RIdG1sTWVzc2FnZSB8IHRyYW5zbGF0ZTogdmFsaWRSZXF1aXJlZCgpPy5pbnRlcnBvbGF0ZVBhcmFtc1wiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|