@libs-ui/components-table 0.2.213 → 0.2.215

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.
@@ -94,7 +94,7 @@ export class LibsUiComponentsTableTemplatesComponent {
94
94
  this.functionControls.clear();
95
95
  }
96
96
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTableTemplatesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
97
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsTableTemplatesComponent, isStandalone: true, selector: "libs_ui-components-table-templates", inputs: { isHover: { classPropertyName: "isHover", publicName: "isHover", isSignal: true, isRequired: false, transformFunction: null }, configs: { classPropertyName: "configs", publicName: "configs", isSignal: true, isRequired: false, transformFunction: null }, templateCssWrapper: { classPropertyName: "templateCssWrapper", publicName: "templateCssWrapper", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if (configs(); as configs) {\n @if (item(); as item) {\n <div class=\"libs-ui-table-template {{ templateCssWrapper() || '' }}\">\n @for (config of configs; track $index) {\n @if (config.fieldsConfig) {\n <div [class]=\"config.cssWrapper\">\n @for (fieldConfig of config.fieldsConfig; track index;let index = $index;) {\n\n @if (!fieldConfig.rows && !fieldConfig.getComponentOutlet) {\n @switch (fieldConfig.instance) {\n @case (\"tooltip\") {\n @if ((fieldConfig.tooltip || {}); as tooltip) {\n <span LibsUiComponentsPopoverDirective\n [type]=\"tooltip.type || 'text'\"\n [mode]=\"tooltip.mode || 'hover'\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [classInclude]=\"tooltip.classInclude || ' '\"\n [ignoreShowPopover]=\"tooltip.ignoreShowPopover || false\"\n [config]=\"(fieldConfig.getTooltipConfig ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getTooltipConfig:item() | async) : (tooltip.config | LibsUiPipesCloneObjectPipe)) | translate\"\n [innerHTML]=\" (fieldConfig.field ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true ) : tooltip.dataView) | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async | translate\"\n (outEvent)=\"handlerItemClick($event,fieldConfig)\">\n </span>\n }\n }\n @case (\"image\") {\n @if (((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getImageSrc:item():isImageError) | async); as linkImage) {\n @if (linkImage !== ' ') {\n <img [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [src]=\"linkImage\"\n (error)=\"handlerImageError($event)\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n }\n }\n\n @case (\"avatar\") {\n @if ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getAvatarConfig:item()) | async ; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\"\n [getLastTextAfterSpace]=\"avatarConfig.getLastTextAfterSpace\" />\n }\n }\n\n @case (\"buttons\") {\n @if ((fieldConfig.buttons && fieldConfig.buttons.length) || fieldConfig.getButtonsByItem) {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.invisible]=\"!isHover() && fieldConfig.showButtonHoverMode\">\n @for (button of (fieldConfig.buttons || (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getButtonsByItem:item() | async)); track $index) {\n\n <libs_ui-components-buttons-button [type]=\"button().type || 'button-primary'\"\n [sizeButton]=\"button().sizeButton || 'smaller'\"\n [disable]=\"button().disable ?? fieldConfig.getDisable ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item() | async): false\"\n [label]=\"button().label || ' '\"\n [classIconLeft]=\"button().classIconLeft || ''\"\n [classIconRight]=\"button().classIconRight || ''\"\n [popover]=\"button().popover || {}\"\n [classInclude]=\"button().classInclude || ''\"\n [ignorePointerEvent]=\"button().ignorePointerEvent\"\n [iconOnlyType]=\"button().iconOnlyType\"\n (outClick)=\"clickButtonAction(button())\" />\n }\n </div>\n }\n }\n\n @case (\"button-status\") {\n <libs_ui-components-buttons-status\n [config]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n\n @case (\"switch\") {\n <libs_ui-components-switch\n [active]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getActiveValueSwitch:item() | async\"\n [disable]=\"fieldConfig.getDisableValueSwitch ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisableValueSwitch:item() | async): false\"\n (outSwitch)=\"handlerSwitch($event,fieldConfig)\" />\n }\n\n\n @case ((fieldConfig.instance === 'other-action-show-popup' || fieldConfig.instance === 'badge' || fieldConfig.instance === 'button-action-show-popup') ? fieldConfig.instance : '') {\n @if ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) !== ' ') {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.ml-[8px]]=\"!fieldConfig.ignoreClassMarginLeft\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: fieldConfig.dropdownConfig?.ignoreArrow || false,\n maxHeight: fieldConfig.dropdownConfig?.maxHeight || 2048,\n paddingLeftItem:fieldConfig.dropdownConfig?.paddingLeftItem ?? true,\n classInclude:fieldConfig.dropdownConfig?.classIncludePopup || 'w-[250px]',\n position: fieldConfig.dropdownConfig?.position || {\n mode:'center',\n distance:0\n }\n }\"\n [zIndex]=\"fieldConfig.dropdownConfig?.zIndex\"\n [listConfig]=\"fieldConfig.dropdownConfig?.getListConfig ? ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.dropdownConfig?.getListConfig:item()) | async):fieldConfig.dropdownConfig?.listConfig\"\n [listBackgroundCustom]=\"fieldConfig.dropdownConfig?.listBackgroundListCustom\"\n [listMaxItemShow]=\"fieldConfig.dropdownConfig?.listMaxItemShow || 5\"\n [listKeysDisable]=\"fieldConfig.dropdownConfig?.listKeysDisableItem\"\n [listHiddenInputSearch]=\"fieldConfig.dropdownConfig?.listHiddenInputSearch\"\n (outFunctionsControl)=\"handlerFunctionControl($event, index)\"\n (outSelectKey)=\"handlerSelectItemDropdown(fieldConfig, index,$event)\"\n (outSelectMultiKey)=\"handlerSelectItemsDropdown(fieldConfig, index,$event)\">\n @if (fieldConfig.instance === 'other-action-show-popup') {\n <div\n [innerHtml]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate\">\n </div>\n }\n @if (fieldConfig.instance === 'badge' && (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) > 0) {\n <libs_ui-components-badge [active]=\"true\"\n [ignoreMarginDefault]=\"true\"\n mode=\"+x\"\n [count]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n [maxCount]=\"99\" />\n }\n @if (fieldConfig.instance === 'button-action-show-popup') {\n <libs_ui-components-buttons-button\n [type]=\"fieldConfig?.dropdownConfig?.button()?.type || 'button-primary'\"\n [sizeButton]=\"fieldConfig?.dropdownConfig?.button()?.sizeButton || 'smaller'\"\n [disable]=\"fieldConfig?.dropdownConfig?.button()?.disable ?? fieldConfig.getDisable ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item() | async): false\"\n [label]=\"fieldConfig?.dropdownConfig?.button()?.label || ' '\"\n [classIconLeft]=\"fieldConfig?.dropdownConfig?.button()?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [classIconRight]=\"fieldConfig?.dropdownConfig?.button()?.classIconRight || ''\"\n [popover]=\"fieldConfig?.dropdownConfig?.button()?.popover || {}\"\n [classInclude]=\"fieldConfig?.dropdownConfig?.button()?.classInclude || ''\"\n [ignoreStopPropagationEvent]=\"true\" />\n }\n\n </libs_ui-components-dropdown>\n </div>\n }\n }\n\n @case (\"line-clamp\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\">\n @if (fieldConfig.lineClampConfig; as lineClampConfig) {\n <libs_ui-components-line_clamp\n [ignoreShowButtonCollapseExpand]=\"lineClampConfig.ignoreShowButtonCollapseExpand ?? true\"\n [showTooltip]=\"lineClampConfig.showTooltip ?? true\"\n [maxHeight]=\"lineClampConfig.maxHeight || 36\"\n [maxWidthTooltip]=\"lineClampConfig.maxWidthTooltip || 200\"\n [maxHeightTooltip]=\"lineClampConfig.maxHeightTooltip || 100\"\n [ngClassObject]=\"lineClampConfig.ngClassObject ?? { 'libs-ui-line-clamp-content libs-ui-font-h5r': true }\"\n [isInnerText]=\"lineClampConfig.isInnerText || false\"\n [ignoreStopPropagationTooltipEvent]=\"true\"\n [content]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n </div>\n }\n\n @case (\"shape-style\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate | LibsUiPipesSecurityTrustPipe:'html':true | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\">\n </div>\n }\n @default {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async | translate | LibsUiPipesSecurityTrustPipe:'html':true|async\"\n (click)=\"handlerItemClick($event,fieldConfig)\">\n </div>\n }\n }\n } @else {\n @if (fieldConfig.rows) {\n <div class=\"w-full flex relative {{ fieldConfig.rowsTemplateCssWrapper }}\"\n [style.height.px]=\"rowRef.clientHeight\">\n <div #rowRef\n class=\"w-full flex absolute {{ fieldConfig.rowsTemplateCssWrapper }}\">\n <libs_ui-components-table-templates class=\"flex w-full\"\n [item]=\"item\"\n [configs]=\"fieldConfig.rows\" />\n </div>\n </div>\n }\n @else {\n <ng-container\n *ngComponentOutlet=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getComponentOutlet:item()) | async; inputs:(undefined | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDataComponentOutlet:item():fieldConfig.field:{valueIsEmpty:{item:item()}}) | async\" />\n }\n }\n }\n </div>\n }\n }\n </div>\n }\n}\n", styles: [":host{width:100%;height:100%}:host .libs-ui-table-template{color:#071631;font-size:12px;font-weight:400;width:100%;height:inherit}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "pipe", type: LibsUiPipesGetValueOfObjectPipe, name: "LibsUiPipesGetValueOfObjectPipe" }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["getLastTextAfterSpace", "typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "idGenColor", "textAvatar", "classImageInclude"], outputs: ["outAvatarError"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesSecurityTrustPipe, name: "LibsUiPipesSecurityTrustPipe" }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsStatusComponent, selector: "libs_ui-components-buttons-status", inputs: ["config"] }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { kind: "pipe", type: LibsUiPipesCloneObjectPipe, name: "LibsUiPipesCloneObjectPipe" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsLineClampComponent, selector: "libs_ui-components-line_clamp", inputs: ["content", "lengthLimitDisplay", "maxHeight", "ignoreShowButtonCollapseExpand", "ignoreShowButtonCollapse", "showTooltip", "timeHidePopoverOnMouseout", "maxWidthTooltip", "maxHeightTooltip", "zIndexPopover", "isInnerText", "classClassLabelButtonCollapseExpand", "classClassIncludeButtonCollapseExpand", "ignoreStopPropagationTooltipEvent", "ngClassObject", "hasBackgroundGradient", "labelButtonViewMore", "labelButtonCollapse", "directionTooltip", "useXssFilter", "defaultIsCollapse"], outputs: ["outDisplayLineClamp", "outAction", "outClick", "outFunctionControl"] }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsBadgeComponent, selector: "libs_ui-components-badge", inputs: ["popoverConfig", "active", "count", "mode", "maxCount", "ignoreMarginDefault", "classCircle", "ignoreStopPropagationEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
97
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsTableTemplatesComponent, isStandalone: true, selector: "libs_ui-components-table-templates", inputs: { isHover: { classPropertyName: "isHover", publicName: "isHover", isSignal: true, isRequired: false, transformFunction: null }, configs: { classPropertyName: "configs", publicName: "configs", isSignal: true, isRequired: false, transformFunction: null }, templateCssWrapper: { classPropertyName: "templateCssWrapper", publicName: "templateCssWrapper", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if (configs(); as configs) {\n @if (item(); as item) {\n <div class=\"libs-ui-table-template {{ templateCssWrapper() || '' }}\">\n @for (config of configs; track config) {\n @if (config.fieldsConfig) {\n <div [class]=\"config.cssWrapper\">\n @for (fieldConfig of config.fieldsConfig; track fieldConfig;let index = $index;) {\n\n @if (!fieldConfig.rows && !fieldConfig.getComponentOutlet) {\n @switch (fieldConfig.instance) {\n @case (\"tooltip\") {\n @if ((fieldConfig.tooltip || {}); as tooltip) {\n <span LibsUiComponentsPopoverDirective\n [type]=\"tooltip.type || 'text'\"\n [mode]=\"tooltip.mode || 'hover'\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [classInclude]=\"tooltip.classInclude || ' '\"\n [ignoreShowPopover]=\"tooltip.ignoreShowPopover || false\"\n [config]=\"(fieldConfig.getTooltipConfig ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getTooltipConfig:item() | async) : (tooltip.config | LibsUiPipesCloneObjectPipe)) | translate\"\n [innerHTML]=\" (fieldConfig.field ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true ) : tooltip.dataView) | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async | translate\"\n (outEvent)=\"handlerItemClick($event,fieldConfig)\">\n </span>\n }\n }\n @case (\"image\") {\n @if (((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getImageSrc:item():isImageError) | async); as linkImage) {\n @if (linkImage !== ' ') {\n <img [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [src]=\"linkImage\"\n (error)=\"handlerImageError($event)\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n }\n }\n\n @case (\"avatar\") {\n @if ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getAvatarConfig:item()) | async ; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\"\n [getLastTextAfterSpace]=\"avatarConfig.getLastTextAfterSpace\" />\n }\n }\n\n @case (\"buttons\") {\n @if ((fieldConfig.buttons && fieldConfig.buttons.length) || fieldConfig.getButtonsByItem) {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.invisible]=\"!isHover() && fieldConfig.showButtonHoverMode\">\n @for (button of (fieldConfig.buttons || (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getButtonsByItem:item() | async)); track button) {\n\n <libs_ui-components-buttons-button [type]=\"button().type || 'button-primary'\"\n [sizeButton]=\"button().sizeButton || 'smaller'\"\n [disable]=\"button().disable ?? fieldConfig.getDisable ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item() | async): false\"\n [label]=\"button().label || ' '\"\n [classIconLeft]=\"button().classIconLeft || ''\"\n [classIconRight]=\"button().classIconRight || ''\"\n [popover]=\"button().popover || {}\"\n [classInclude]=\"button().classInclude || ''\"\n [ignorePointerEvent]=\"button().ignorePointerEvent\"\n [iconOnlyType]=\"button().iconOnlyType\"\n (outClick)=\"clickButtonAction(button())\" />\n }\n </div>\n }\n }\n\n @case (\"button-status\") {\n <libs_ui-components-buttons-status\n [config]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n\n @case (\"switch\") {\n <libs_ui-components-switch\n [active]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getActiveValueSwitch:item() | async\"\n [disable]=\"fieldConfig.getDisableValueSwitch ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisableValueSwitch:item() | async): false\"\n (outSwitch)=\"handlerSwitch($event,fieldConfig)\" />\n }\n\n\n @case ((fieldConfig.instance === 'other-action-show-popup' || fieldConfig.instance === 'badge' || fieldConfig.instance === 'button-action-show-popup') ? fieldConfig.instance : '') {\n @if ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) !== ' ') {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.ml-[8px]]=\"!fieldConfig.ignoreClassMarginLeft\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: fieldConfig.dropdownConfig?.ignoreArrow || false,\n maxHeight: fieldConfig.dropdownConfig?.maxHeight || 2048,\n paddingLeftItem:fieldConfig.dropdownConfig?.paddingLeftItem ?? true,\n classInclude:fieldConfig.dropdownConfig?.classIncludePopup || 'w-[250px]',\n position: fieldConfig.dropdownConfig?.position || {\n mode:'center',\n distance:0\n }\n }\"\n [zIndex]=\"fieldConfig.dropdownConfig?.zIndex\"\n [listConfig]=\"fieldConfig.dropdownConfig?.getListConfig ? ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.dropdownConfig?.getListConfig:item()) | async):fieldConfig.dropdownConfig?.listConfig\"\n [listBackgroundCustom]=\"fieldConfig.dropdownConfig?.listBackgroundListCustom\"\n [listMaxItemShow]=\"fieldConfig.dropdownConfig?.listMaxItemShow || 5\"\n [listKeysDisable]=\"fieldConfig.dropdownConfig?.listKeysDisableItem\"\n [listHiddenInputSearch]=\"fieldConfig.dropdownConfig?.listHiddenInputSearch\"\n (outFunctionsControl)=\"handlerFunctionControl($event, index)\"\n (outSelectKey)=\"handlerSelectItemDropdown(fieldConfig, index,$event)\"\n (outSelectMultiKey)=\"handlerSelectItemsDropdown(fieldConfig, index,$event)\">\n @if (fieldConfig.instance === 'other-action-show-popup') {\n <div\n [innerHtml]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate\">\n </div>\n }\n @if (fieldConfig.instance === 'badge' && (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) > 0) {\n <libs_ui-components-badge [active]=\"true\"\n [ignoreMarginDefault]=\"true\"\n mode=\"+x\"\n [count]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n [maxCount]=\"99\" />\n }\n @if (fieldConfig.instance === 'button-action-show-popup') {\n <libs_ui-components-buttons-button\n [type]=\"fieldConfig?.dropdownConfig?.button()?.type || 'button-primary'\"\n [sizeButton]=\"fieldConfig?.dropdownConfig?.button()?.sizeButton || 'smaller'\"\n [disable]=\"fieldConfig?.dropdownConfig?.button()?.disable ?? fieldConfig.getDisable ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item() | async): false\"\n [label]=\"fieldConfig?.dropdownConfig?.button()?.label || ' '\"\n [classIconLeft]=\"fieldConfig?.dropdownConfig?.button()?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [classIconRight]=\"fieldConfig?.dropdownConfig?.button()?.classIconRight || ''\"\n [popover]=\"fieldConfig?.dropdownConfig?.button()?.popover || {}\"\n [classInclude]=\"fieldConfig?.dropdownConfig?.button()?.classInclude || ''\"\n [ignoreStopPropagationEvent]=\"true\" />\n }\n\n </libs_ui-components-dropdown>\n </div>\n }\n }\n\n @case (\"line-clamp\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\">\n @if (fieldConfig.lineClampConfig; as lineClampConfig) {\n <libs_ui-components-line_clamp\n [ignoreShowButtonCollapseExpand]=\"lineClampConfig.ignoreShowButtonCollapseExpand ?? true\"\n [showTooltip]=\"lineClampConfig.showTooltip ?? true\"\n [maxHeight]=\"lineClampConfig.maxHeight || 36\"\n [maxWidthTooltip]=\"lineClampConfig.maxWidthTooltip || 200\"\n [maxHeightTooltip]=\"lineClampConfig.maxHeightTooltip || 100\"\n [ngClassObject]=\"lineClampConfig.ngClassObject ?? { 'libs-ui-line-clamp-content libs-ui-font-h5r': true }\"\n [isInnerText]=\"lineClampConfig.isInnerText || false\"\n [ignoreStopPropagationTooltipEvent]=\"true\"\n [content]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n </div>\n }\n\n @case (\"shape-style\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate | LibsUiPipesSecurityTrustPipe:'html':true | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\">\n </div>\n }\n @default {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async | translate | LibsUiPipesSecurityTrustPipe:'html':true|async\"\n (click)=\"handlerItemClick($event,fieldConfig)\">\n </div>\n }\n }\n } @else {\n @if (fieldConfig.rows) {\n <div class=\"w-full flex relative {{ fieldConfig.rowsTemplateCssWrapper }}\"\n [style.height.px]=\"rowRef.clientHeight\">\n <div #rowRef\n class=\"w-full flex absolute {{ fieldConfig.rowsTemplateCssWrapper }}\">\n <libs_ui-components-table-templates class=\"flex w-full\"\n [item]=\"item\"\n [configs]=\"fieldConfig.rows\" />\n </div>\n </div>\n }\n @else {\n <ng-container\n *ngComponentOutlet=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getComponentOutlet:item()) | async; inputs:(undefined | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDataComponentOutlet:item():fieldConfig.field:{valueIsEmpty:{item:item()}}) | async\" />\n }\n }\n }\n </div>\n }\n }\n </div>\n }\n}\n", styles: [":host{width:100%;height:100%}:host .libs-ui-table-template{color:#071631;font-size:12px;font-weight:400;width:100%;height:inherit}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "pipe", type: LibsUiPipesGetValueOfObjectPipe, name: "LibsUiPipesGetValueOfObjectPipe" }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["getLastTextAfterSpace", "typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "idGenColor", "textAvatar", "classImageInclude"], outputs: ["outAvatarError"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesSecurityTrustPipe, name: "LibsUiPipesSecurityTrustPipe" }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsStatusComponent, selector: "libs_ui-components-buttons-status", inputs: ["config"] }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { kind: "pipe", type: LibsUiPipesCloneObjectPipe, name: "LibsUiPipesCloneObjectPipe" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsLineClampComponent, selector: "libs_ui-components-line_clamp", inputs: ["content", "lengthLimitDisplay", "maxHeight", "ignoreShowButtonCollapseExpand", "ignoreShowButtonCollapse", "showTooltip", "timeHidePopoverOnMouseout", "maxWidthTooltip", "maxHeightTooltip", "zIndexPopover", "isInnerText", "classClassLabelButtonCollapseExpand", "classClassIncludeButtonCollapseExpand", "ignoreStopPropagationTooltipEvent", "ngClassObject", "hasBackgroundGradient", "labelButtonViewMore", "labelButtonCollapse", "directionTooltip", "useXssFilter", "defaultIsCollapse"], outputs: ["outDisplayLineClamp", "outAction", "outClick", "outFunctionControl"] }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsBadgeComponent, selector: "libs_ui-components-badge", inputs: ["popoverConfig", "active", "count", "mode", "maxCount", "ignoreMarginDefault", "classCircle", "ignoreStopPropagationEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
98
98
  }
99
99
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTableTemplatesComponent, decorators: [{
100
100
  type: Component,
@@ -106,6 +106,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
106
106
  LibsUiPipesCloneObjectPipe, LibsUiComponentsButtonsButtonComponent,
107
107
  LibsUiComponentsLineClampComponent, LibsUiComponentsDropdownComponent,
108
108
  LibsUiComponentsBadgeComponent
109
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (configs(); as configs) {\n @if (item(); as item) {\n <div class=\"libs-ui-table-template {{ templateCssWrapper() || '' }}\">\n @for (config of configs; track $index) {\n @if (config.fieldsConfig) {\n <div [class]=\"config.cssWrapper\">\n @for (fieldConfig of config.fieldsConfig; track index;let index = $index;) {\n\n @if (!fieldConfig.rows && !fieldConfig.getComponentOutlet) {\n @switch (fieldConfig.instance) {\n @case (\"tooltip\") {\n @if ((fieldConfig.tooltip || {}); as tooltip) {\n <span LibsUiComponentsPopoverDirective\n [type]=\"tooltip.type || 'text'\"\n [mode]=\"tooltip.mode || 'hover'\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [classInclude]=\"tooltip.classInclude || ' '\"\n [ignoreShowPopover]=\"tooltip.ignoreShowPopover || false\"\n [config]=\"(fieldConfig.getTooltipConfig ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getTooltipConfig:item() | async) : (tooltip.config | LibsUiPipesCloneObjectPipe)) | translate\"\n [innerHTML]=\" (fieldConfig.field ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true ) : tooltip.dataView) | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async | translate\"\n (outEvent)=\"handlerItemClick($event,fieldConfig)\">\n </span>\n }\n }\n @case (\"image\") {\n @if (((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getImageSrc:item():isImageError) | async); as linkImage) {\n @if (linkImage !== ' ') {\n <img [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [src]=\"linkImage\"\n (error)=\"handlerImageError($event)\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n }\n }\n\n @case (\"avatar\") {\n @if ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getAvatarConfig:item()) | async ; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\"\n [getLastTextAfterSpace]=\"avatarConfig.getLastTextAfterSpace\" />\n }\n }\n\n @case (\"buttons\") {\n @if ((fieldConfig.buttons && fieldConfig.buttons.length) || fieldConfig.getButtonsByItem) {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.invisible]=\"!isHover() && fieldConfig.showButtonHoverMode\">\n @for (button of (fieldConfig.buttons || (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getButtonsByItem:item() | async)); track $index) {\n\n <libs_ui-components-buttons-button [type]=\"button().type || 'button-primary'\"\n [sizeButton]=\"button().sizeButton || 'smaller'\"\n [disable]=\"button().disable ?? fieldConfig.getDisable ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item() | async): false\"\n [label]=\"button().label || ' '\"\n [classIconLeft]=\"button().classIconLeft || ''\"\n [classIconRight]=\"button().classIconRight || ''\"\n [popover]=\"button().popover || {}\"\n [classInclude]=\"button().classInclude || ''\"\n [ignorePointerEvent]=\"button().ignorePointerEvent\"\n [iconOnlyType]=\"button().iconOnlyType\"\n (outClick)=\"clickButtonAction(button())\" />\n }\n </div>\n }\n }\n\n @case (\"button-status\") {\n <libs_ui-components-buttons-status\n [config]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n\n @case (\"switch\") {\n <libs_ui-components-switch\n [active]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getActiveValueSwitch:item() | async\"\n [disable]=\"fieldConfig.getDisableValueSwitch ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisableValueSwitch:item() | async): false\"\n (outSwitch)=\"handlerSwitch($event,fieldConfig)\" />\n }\n\n\n @case ((fieldConfig.instance === 'other-action-show-popup' || fieldConfig.instance === 'badge' || fieldConfig.instance === 'button-action-show-popup') ? fieldConfig.instance : '') {\n @if ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) !== ' ') {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.ml-[8px]]=\"!fieldConfig.ignoreClassMarginLeft\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: fieldConfig.dropdownConfig?.ignoreArrow || false,\n maxHeight: fieldConfig.dropdownConfig?.maxHeight || 2048,\n paddingLeftItem:fieldConfig.dropdownConfig?.paddingLeftItem ?? true,\n classInclude:fieldConfig.dropdownConfig?.classIncludePopup || 'w-[250px]',\n position: fieldConfig.dropdownConfig?.position || {\n mode:'center',\n distance:0\n }\n }\"\n [zIndex]=\"fieldConfig.dropdownConfig?.zIndex\"\n [listConfig]=\"fieldConfig.dropdownConfig?.getListConfig ? ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.dropdownConfig?.getListConfig:item()) | async):fieldConfig.dropdownConfig?.listConfig\"\n [listBackgroundCustom]=\"fieldConfig.dropdownConfig?.listBackgroundListCustom\"\n [listMaxItemShow]=\"fieldConfig.dropdownConfig?.listMaxItemShow || 5\"\n [listKeysDisable]=\"fieldConfig.dropdownConfig?.listKeysDisableItem\"\n [listHiddenInputSearch]=\"fieldConfig.dropdownConfig?.listHiddenInputSearch\"\n (outFunctionsControl)=\"handlerFunctionControl($event, index)\"\n (outSelectKey)=\"handlerSelectItemDropdown(fieldConfig, index,$event)\"\n (outSelectMultiKey)=\"handlerSelectItemsDropdown(fieldConfig, index,$event)\">\n @if (fieldConfig.instance === 'other-action-show-popup') {\n <div\n [innerHtml]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate\">\n </div>\n }\n @if (fieldConfig.instance === 'badge' && (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) > 0) {\n <libs_ui-components-badge [active]=\"true\"\n [ignoreMarginDefault]=\"true\"\n mode=\"+x\"\n [count]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n [maxCount]=\"99\" />\n }\n @if (fieldConfig.instance === 'button-action-show-popup') {\n <libs_ui-components-buttons-button\n [type]=\"fieldConfig?.dropdownConfig?.button()?.type || 'button-primary'\"\n [sizeButton]=\"fieldConfig?.dropdownConfig?.button()?.sizeButton || 'smaller'\"\n [disable]=\"fieldConfig?.dropdownConfig?.button()?.disable ?? fieldConfig.getDisable ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item() | async): false\"\n [label]=\"fieldConfig?.dropdownConfig?.button()?.label || ' '\"\n [classIconLeft]=\"fieldConfig?.dropdownConfig?.button()?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [classIconRight]=\"fieldConfig?.dropdownConfig?.button()?.classIconRight || ''\"\n [popover]=\"fieldConfig?.dropdownConfig?.button()?.popover || {}\"\n [classInclude]=\"fieldConfig?.dropdownConfig?.button()?.classInclude || ''\"\n [ignoreStopPropagationEvent]=\"true\" />\n }\n\n </libs_ui-components-dropdown>\n </div>\n }\n }\n\n @case (\"line-clamp\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\">\n @if (fieldConfig.lineClampConfig; as lineClampConfig) {\n <libs_ui-components-line_clamp\n [ignoreShowButtonCollapseExpand]=\"lineClampConfig.ignoreShowButtonCollapseExpand ?? true\"\n [showTooltip]=\"lineClampConfig.showTooltip ?? true\"\n [maxHeight]=\"lineClampConfig.maxHeight || 36\"\n [maxWidthTooltip]=\"lineClampConfig.maxWidthTooltip || 200\"\n [maxHeightTooltip]=\"lineClampConfig.maxHeightTooltip || 100\"\n [ngClassObject]=\"lineClampConfig.ngClassObject ?? { 'libs-ui-line-clamp-content libs-ui-font-h5r': true }\"\n [isInnerText]=\"lineClampConfig.isInnerText || false\"\n [ignoreStopPropagationTooltipEvent]=\"true\"\n [content]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n </div>\n }\n\n @case (\"shape-style\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate | LibsUiPipesSecurityTrustPipe:'html':true | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\">\n </div>\n }\n @default {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async | translate | LibsUiPipesSecurityTrustPipe:'html':true|async\"\n (click)=\"handlerItemClick($event,fieldConfig)\">\n </div>\n }\n }\n } @else {\n @if (fieldConfig.rows) {\n <div class=\"w-full flex relative {{ fieldConfig.rowsTemplateCssWrapper }}\"\n [style.height.px]=\"rowRef.clientHeight\">\n <div #rowRef\n class=\"w-full flex absolute {{ fieldConfig.rowsTemplateCssWrapper }}\">\n <libs_ui-components-table-templates class=\"flex w-full\"\n [item]=\"item\"\n [configs]=\"fieldConfig.rows\" />\n </div>\n </div>\n }\n @else {\n <ng-container\n *ngComponentOutlet=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getComponentOutlet:item()) | async; inputs:(undefined | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDataComponentOutlet:item():fieldConfig.field:{valueIsEmpty:{item:item()}}) | async\" />\n }\n }\n }\n </div>\n }\n }\n </div>\n }\n}\n", styles: [":host{width:100%;height:100%}:host .libs-ui-table-template{color:#071631;font-size:12px;font-weight:400;width:100%;height:inherit}\n"] }]
109
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (configs(); as configs) {\n @if (item(); as item) {\n <div class=\"libs-ui-table-template {{ templateCssWrapper() || '' }}\">\n @for (config of configs; track config) {\n @if (config.fieldsConfig) {\n <div [class]=\"config.cssWrapper\">\n @for (fieldConfig of config.fieldsConfig; track fieldConfig;let index = $index;) {\n\n @if (!fieldConfig.rows && !fieldConfig.getComponentOutlet) {\n @switch (fieldConfig.instance) {\n @case (\"tooltip\") {\n @if ((fieldConfig.tooltip || {}); as tooltip) {\n <span LibsUiComponentsPopoverDirective\n [type]=\"tooltip.type || 'text'\"\n [mode]=\"tooltip.mode || 'hover'\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [classInclude]=\"tooltip.classInclude || ' '\"\n [ignoreShowPopover]=\"tooltip.ignoreShowPopover || false\"\n [config]=\"(fieldConfig.getTooltipConfig ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getTooltipConfig:item() | async) : (tooltip.config | LibsUiPipesCloneObjectPipe)) | translate\"\n [innerHTML]=\" (fieldConfig.field ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true ) : tooltip.dataView) | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async | translate\"\n (outEvent)=\"handlerItemClick($event,fieldConfig)\">\n </span>\n }\n }\n @case (\"image\") {\n @if (((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getImageSrc:item():isImageError) | async); as linkImage) {\n @if (linkImage !== ' ') {\n <img [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [src]=\"linkImage\"\n (error)=\"handlerImageError($event)\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n }\n }\n\n @case (\"avatar\") {\n @if ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getAvatarConfig:item()) | async ; as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape || 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [size]='avatarConfig.size || 32'\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\"\n [getLastTextAfterSpace]=\"avatarConfig.getLastTextAfterSpace\" />\n }\n }\n\n @case (\"buttons\") {\n @if ((fieldConfig.buttons && fieldConfig.buttons.length) || fieldConfig.getButtonsByItem) {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.invisible]=\"!isHover() && fieldConfig.showButtonHoverMode\">\n @for (button of (fieldConfig.buttons || (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getButtonsByItem:item() | async)); track button) {\n\n <libs_ui-components-buttons-button [type]=\"button().type || 'button-primary'\"\n [sizeButton]=\"button().sizeButton || 'smaller'\"\n [disable]=\"button().disable ?? fieldConfig.getDisable ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item() | async): false\"\n [label]=\"button().label || ' '\"\n [classIconLeft]=\"button().classIconLeft || ''\"\n [classIconRight]=\"button().classIconRight || ''\"\n [popover]=\"button().popover || {}\"\n [classInclude]=\"button().classInclude || ''\"\n [ignorePointerEvent]=\"button().ignorePointerEvent\"\n [iconOnlyType]=\"button().iconOnlyType\"\n (outClick)=\"clickButtonAction(button())\" />\n }\n </div>\n }\n }\n\n @case (\"button-status\") {\n <libs_ui-components-buttons-status\n [config]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n\n @case (\"switch\") {\n <libs_ui-components-switch\n [active]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getActiveValueSwitch:item() | async\"\n [disable]=\"fieldConfig.getDisableValueSwitch ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisableValueSwitch:item() | async): false\"\n (outSwitch)=\"handlerSwitch($event,fieldConfig)\" />\n }\n\n\n @case ((fieldConfig.instance === 'other-action-show-popup' || fieldConfig.instance === 'badge' || fieldConfig.instance === 'button-action-show-popup') ? fieldConfig.instance : '') {\n @if ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) !== ' ') {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [class.ml-[8px]]=\"!fieldConfig.ignoreClassMarginLeft\">\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: fieldConfig.dropdownConfig?.ignoreArrow || false,\n maxHeight: fieldConfig.dropdownConfig?.maxHeight || 2048,\n paddingLeftItem:fieldConfig.dropdownConfig?.paddingLeftItem ?? true,\n classInclude:fieldConfig.dropdownConfig?.classIncludePopup || 'w-[250px]',\n position: fieldConfig.dropdownConfig?.position || {\n mode:'center',\n distance:0\n }\n }\"\n [zIndex]=\"fieldConfig.dropdownConfig?.zIndex\"\n [listConfig]=\"fieldConfig.dropdownConfig?.getListConfig ? ((item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.dropdownConfig?.getListConfig:item()) | async):fieldConfig.dropdownConfig?.listConfig\"\n [listBackgroundCustom]=\"fieldConfig.dropdownConfig?.listBackgroundListCustom\"\n [listMaxItemShow]=\"fieldConfig.dropdownConfig?.listMaxItemShow || 5\"\n [listKeysDisable]=\"fieldConfig.dropdownConfig?.listKeysDisableItem\"\n [listHiddenInputSearch]=\"fieldConfig.dropdownConfig?.listHiddenInputSearch\"\n (outFunctionsControl)=\"handlerFunctionControl($event, index)\"\n (outSelectKey)=\"handlerSelectItemDropdown(fieldConfig, index,$event)\"\n (outSelectMultiKey)=\"handlerSelectItemsDropdown(fieldConfig, index,$event)\">\n @if (fieldConfig.instance === 'other-action-show-popup') {\n <div\n [innerHtml]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate\">\n </div>\n }\n @if (fieldConfig.instance === 'badge' && (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async) > 0) {\n <libs_ui-components-badge [active]=\"true\"\n [ignoreMarginDefault]=\"true\"\n mode=\"+x\"\n [count]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n [maxCount]=\"99\" />\n }\n @if (fieldConfig.instance === 'button-action-show-popup') {\n <libs_ui-components-buttons-button\n [type]=\"fieldConfig?.dropdownConfig?.button()?.type || 'button-primary'\"\n [sizeButton]=\"fieldConfig?.dropdownConfig?.button()?.sizeButton || 'smaller'\"\n [disable]=\"fieldConfig?.dropdownConfig?.button()?.disable ?? fieldConfig.getDisable ? (item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDisable:item() | async): false\"\n [label]=\"fieldConfig?.dropdownConfig?.button()?.label || ' '\"\n [classIconLeft]=\"fieldConfig?.dropdownConfig?.button()?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [classIconRight]=\"fieldConfig?.dropdownConfig?.button()?.classIconRight || ''\"\n [popover]=\"fieldConfig?.dropdownConfig?.button()?.popover || {}\"\n [classInclude]=\"fieldConfig?.dropdownConfig?.button()?.classInclude || ''\"\n [ignoreStopPropagationEvent]=\"true\" />\n }\n\n </libs_ui-components-dropdown>\n </div>\n }\n }\n\n @case (\"line-clamp\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\">\n @if (fieldConfig.lineClampConfig; as lineClampConfig) {\n <libs_ui-components-line_clamp\n [ignoreShowButtonCollapseExpand]=\"lineClampConfig.ignoreShowButtonCollapseExpand ?? true\"\n [showTooltip]=\"lineClampConfig.showTooltip ?? true\"\n [maxHeight]=\"lineClampConfig.maxHeight || 36\"\n [maxWidthTooltip]=\"lineClampConfig.maxWidthTooltip || 200\"\n [maxHeightTooltip]=\"lineClampConfig.maxHeightTooltip || 100\"\n [ngClassObject]=\"lineClampConfig.ngClassObject ?? { 'libs-ui-line-clamp-content libs-ui-font-h5r': true }\"\n [isInnerText]=\"lineClampConfig.isInnerText || false\"\n [ignoreStopPropagationTooltipEvent]=\"true\"\n [content]=\"item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item() | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\" />\n }\n </div>\n }\n\n @case (\"shape-style\") {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item())| async | translate | LibsUiPipesSecurityTrustPipe:'html':true | async\"\n (click)=\"handlerItemClick($event,fieldConfig)\">\n </div>\n }\n @default {\n <div [ngStyle]=\"fieldConfig.ngStyle || {}\"\n [ngClass]=\"fieldConfig.ngClass || {}\"\n [innerHTML]=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.parseValue:item()) | async | translate | LibsUiPipesSecurityTrustPipe:'html':true|async\"\n (click)=\"handlerItemClick($event,fieldConfig)\">\n </div>\n }\n }\n } @else {\n @if (fieldConfig.rows) {\n <div class=\"w-full flex relative {{ fieldConfig.rowsTemplateCssWrapper }}\"\n [style.height.px]=\"rowRef.clientHeight\">\n <div #rowRef\n class=\"w-full flex absolute {{ fieldConfig.rowsTemplateCssWrapper }}\">\n <libs_ui-components-table-templates class=\"flex w-full\"\n [item]=\"item\"\n [configs]=\"fieldConfig.rows\" />\n </div>\n </div>\n }\n @else {\n <ng-container\n *ngComponentOutlet=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldConfig.field:undefined:true | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getComponentOutlet:item()) | async; inputs:(undefined | LibsUiPipesCallFunctionInTemplatePipe:fieldConfig.getDataComponentOutlet:item():fieldConfig.field:{valueIsEmpty:{item:item()}}) | async\" />\n }\n }\n }\n </div>\n }\n }\n </div>\n }\n}\n", styles: [":host{width:100%;height:100%}:host .libs-ui-table-template{color:#071631;font-size:12px;font-weight:400;width:100%;height:inherit}\n"] }]
110
110
  }] });
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy90YWJsZS9zcmMvdGVtcGxhdGVzL3RlbXBsYXRlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RlbXBsYXRlcy90ZW1wbGF0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBc0IsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNFLE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBZ0UsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvSSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0NBQWdDLEVBQXNCLE1BQU0sNkJBQTZCLENBQUM7QUFDbkcsT0FBTyxFQUFnQiwrQkFBK0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNGLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FB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QXZDLHVDQUF1Qyx5bkJDbkNwRCw0NmNBMk1BLDhMRHhLYSx1Q0FBdUMsNklBVmhELE9BQU8sMkVBQUUsT0FBTyxtRkFBRSxlQUFlLHVGQUFFLFNBQVMsOENBQUUsaUJBQWlCLCtPQUFFLCtCQUErQix3RUFDaEcsK0JBQStCLHdQQUFFLHFDQUFxQyx5RUFDdEUsNEJBQTRCLHFFQUFFLGdDQUFnQyxxZUFDOUQsc0NBQXNDLGtHQUFFLCtCQUErQixnSkFDdkUsMEJBQTBCLG1FQUFFLHNDQUFzQyxzakJBQ2xFLGtDQUFrQywwb0JBQUUsaUNBQWlDLGkxREFDckUsOEJBQThCOzs0RkFJckIsdUNBQXVDO2tCQWpCbkQsU0FBUzsrQkFFRSxvQ0FBb0MsY0FHbEMsSUFBSSxXQUNQO3dCQUNQLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSwrQkFBK0I7d0JBQ2hHLCtCQUErQixFQUFFLHFDQUFxQzt3QkFDdEUsNEJBQTRCLEVBQUUsZ0NBQWdDO3dCQUM5RCxzQ0FBc0MsRUFBRSwrQkFBK0I7d0JBQ3ZFLDBCQUEwQixFQUFFLHNDQUFzQzt3QkFDbEUsa0NBQWtDLEVBQUUsaUNBQWlDO3dCQUNyRSw4QkFBOEI7cUJBQy9CLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0NvbXBvbmVudE91dGxldCwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNBdmF0YXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWF2YXRhcic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQmFkZ2VDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJhZGdlJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1N0YXR1c0NvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1zdGF0dXMnO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0TXVsdGlLZXksIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaW5lQ2xhbXBDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxpbmUtY2xhbXAnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBJU3dpdGNoRXZlbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0Nsb25lT2JqZWN0UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNsb25lLW9iamVjdCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZ2V0LXZhbHVlLW9mLW9iamVjdCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtc2VjdXJpdHktdHJ1c3QnO1xuaW1wb3J0IHsgY29udmVydE9iamVjdFRvU2lnbmFsLCBnZXQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRZUEVfSVRFTV9EQVRBX1RBQkxFIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJVGFibGVGaWVsZFRlbXBsYXRlQ29uZmlnLCBJVGFibGVUZW1wbGF0ZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvdGVtcGxhdGUtY29uZmlnLmludGVyZmFjZSc7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RlbXBsYXRlcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RlbXBsYXRlcy5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdTdHlsZSwgTmdDbGFzcywgVHJhbnNsYXRlTW9kdWxlLCBBc3luY1BpcGUsIE5nQ29tcG9uZW50T3V0bGV0LCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNBdmF0YXJDb21wb25lbnQsIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsXG4gICAgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTdGF0dXNDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDbG9uZU9iamVjdFBpcGUsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNMaW5lQ2xhbXBDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQmFkZ2VDb21wb25lbnRcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBsb2NrQ2xpY2shOiBib29sZWFuO1xuICBwcml2YXRlIGZ1bmN0aW9uQ29udHJvbHMgPSBuZXcgTWFwPG51bWJlciwgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHByb3RlY3RlZCBpc0ltYWdlRXJyb3I6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgaXNIb3ZlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZ3MgPSBpbnB1dDxBcnJheTxJVGFibGVUZW1wbGF0ZUNvbmZpZz4+KCk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlQ3NzV3JhcHBlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaXRlbSA9IGlucHV0LnJlcXVpcmVkPFRZUEVfSVRFTV9EQVRBX1RBQkxFPigpO1xuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVySXRlbUNsaWNrKGV2ZW50OiBFdmVudCB8IFRZUEVfUE9QT1ZFUl9FVkVOVCB8IHVuZGVmaW5lZCwgY29uZmlnOiBJVGFibGVGaWVsZFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycgJiYgZXZlbnQgIT09ICdjbGljaycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVMb2NrQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuYWN0aW9uKSB7XG4gICAgICAgIGNvbmZpZy5hY3Rpb24oZ2V0KHRoaXMuaXRlbSgpLCBjb25maWcuZmllbGQpLCB0aGlzLml0ZW0oKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2xpY2tCdXR0b25BY3Rpb24oYnV0dG9uOiBJQnV0dG9uKSB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVMb2NrQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgYnV0dG9uLmFjdGlvbj8uKHsgaXRlbTogdGhpcy5pdGVtKCkgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclN3aXRjaChzd2l0Y2hJdGVtOiBJU3dpdGNoRXZlbnQsIGNvbmZpZzogSVRhYmxlRmllbGRUZW1wbGF0ZUNvbmZpZykge1xuICAgIGF3YWl0IHRoaXMuaGFuZGxlTG9ja0NsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbmZpZz8uc3dpdGNoQWN0aW9uPy4oc3dpdGNoSXRlbSwgdGhpcy5pdGVtKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWxlY3RJdGVtRHJvcGRvd24oZmllbGRDb25maWc6IElUYWJsZUZpZWxkVGVtcGxhdGVDb25maWcsIGluZGV4OiBudW1iZXIsIGRhdGE/OiBJRW1pdFNlbGVjdEtleSkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmhhbmRsZUxvY2tDbGljayhhc3luYyAoKSA9PiB7XG4gICAgICBmaWVsZENvbmZpZz8uYWN0aW9uPy4oZGF0YS5rZXksIGRhdGEuaXRlbSwgdGhpcy5pdGVtKCkpO1xuICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scz8uZ2V0KGluZGV4KSBhcyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCk/LnJlc2V0KCk7XG4gICAgICAodGhpcy5mdW5jdGlvbkNvbnRyb2xzPy5nZXQoaW5kZXgpIGFzIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KT8ucmVtb3ZlTGlzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWxlY3RJdGVtc0Ryb3Bkb3duKGZpZWxkQ29uZmlnOiBJVGFibGVGaWVsZFRlbXBsYXRlQ29uZmlnLCBpbmRleDogbnVtYmVyLCBkYXRhPzogSUVtaXRNdWx0aUtleSkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmhhbmRsZUxvY2tDbGljayhhc3luYyAoKSA9PiB7XG4gICAgICBmaWVsZENvbmZpZz8uYWN0aW9uPy4oZGF0YS5rZXlzLCBjb252ZXJ0T2JqZWN0VG9TaWduYWwoZGF0YS5tYXBLZXlzLCBmYWxzZSksIHRoaXMuaXRlbSgpKTtcbiAgICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHM/LmdldChpbmRleCkgYXMgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQpPy5yZXNldCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJJbWFnZUVycm9yKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNJbWFnZUVycm9yID0gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRnVuY3Rpb25Db250cm9sKGV2ZW50OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9scy5zZXQoaW5kZXgsIGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlTG9ja0NsaWNrKGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgaWYgKHRoaXMubG9ja0NsaWNrKSByZXR1cm47XG4gICAgdGhpcy5sb2NrQ2xpY2sgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYWxsYmFjaygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9ja0NsaWNrID0gZmFsc2U7XG4gICAgICB9LCAyNTApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9scy5jbGVhcigpO1xuICB9XG5cbn1cbiIsIkBpZiAoY29uZmlncygpOyBhcyBjb25maWdzKSB7XG4gIEBpZiAoaXRlbSgpOyBhcyBpdGVtKSB7XG4gICAgPGRpdiBjbGFzcz1cImxpYnMtdWktdGFibGUtdGVtcGxhdGUge3sgdGVtcGxhdGVDc3NXcmFwcGVyKCkgfHwgJycgfX1cIj5cbiAgICAgIEBmb3IgKGNvbmZpZyBvZiBjb25maWdzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgQGlmIChjb25maWcuZmllbGRzQ29uZmlnKSB7XG4gICAgICAgICAgPGRpdiBbY2xhc3NdPVwiY29uZmlnLmNzc1dyYXBwZXJcIj5cbiAgICAgICAgICAgIEBmb3IgKGZpZWxkQ29uZmlnIG9mIGNvbmZpZy5maWVsZHNDb25maWc7IHRyYWNrIGluZGV4O2xldCBpbmRleCA9ICRpbmRleDspIHtcblxuICAgICAgICAgICAgICBAaWYgKCFmaWVsZENvbmZpZy5yb3dzICYmICFmaWVsZENvbmZpZy5nZXRDb21wb25lbnRPdXRsZXQpIHtcbiAgICAgICAgICAgICAgICBAc3dpdGNoIChmaWVsZENvbmZpZy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgQGNhc2UgKFwidG9vbHRpcFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoKGZpZWxkQ29uZmlnLnRvb2x0aXAgfHwge30pOyBhcyB0b29sdGlwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cInRvb2x0aXAudHlwZSB8fCAndGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwidG9vbHRpcC5tb2RlIHx8ICdob3ZlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZmllbGRDb25maWcubmdTdHlsZSB8fCB7fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmaWVsZENvbmZpZy5uZ0NsYXNzIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwidG9vbHRpcC5jbGFzc0luY2x1ZGUgfHwgJyAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0b29sdGlwLmlnbm9yZVNob3dQb3BvdmVyIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiKGZpZWxkQ29uZmlnLmdldFRvb2x0aXBDb25maWcgPyAoaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5nZXRUb29sdGlwQ29uZmlnOml0ZW0oKSB8IGFzeW5jKSA6ICh0b29sdGlwLmNvbmZpZyB8IExpYnNVaVBpcGVzQ2xvbmVPYmplY3RQaXBlKSkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCIgKGZpZWxkQ29uZmlnLmZpZWxkID8gKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlICkgOiB0b29sdGlwLmRhdGFWaWV3KSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcucGFyc2VWYWx1ZTppdGVtKCkgfCBhc3luYyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0RXZlbnQpPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsZmllbGRDb25maWcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoKChpdGVtKCl8TGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTpmaWVsZENvbmZpZy5maWVsZDp1bmRlZmluZWQ6dHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcuZ2V0SW1hZ2VTcmM6aXRlbSgpOmlzSW1hZ2VFcnJvcikgfCBhc3luYyk7IGFzIGxpbmtJbWFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgIEBpZiAobGlua0ltYWdlICE9PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW25nU3R5bGVdPVwiZmllbGRDb25maWcubmdTdHlsZSB8fCB7fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImxpbmtJbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJoYW5kbGVySW1hZ2VFcnJvcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LGZpZWxkQ29uZmlnKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlIChcImF2YXRhclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5nZXRBdmF0YXJDb25maWc6aXRlbSgpKSB8IGFzeW5jIDsgYXMgYXZhdGFyQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1hdmF0YXIgW3R5cGVTaGFwZV09XCJhdmF0YXJDb25maWcudHlwZVNoYXBlIHx8ICdjaXJjbGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYXZhdGFyQ29uZmlnLmNsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJmaWVsZENvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPSdhdmF0YXJDb25maWcuc2l6ZSB8fCAzMidcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5rQXZhdGFyXT1cImF2YXRhckNvbmZpZy5saW5rQXZhdGFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5rQXZhdGFyRXJyb3JdPVwiYXZhdGFyQ29uZmlnLmxpbmtBdmF0YXJFcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRHZW5Db2xvcl09XCJhdmF0YXJDb25maWcuaWRHZW5Db2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEF2YXRhcl09XCJhdmF0YXJDb25maWcudGV4dEF2YXRhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ2V0TGFzdFRleHRBZnRlclNwYWNlXT1cImF2YXRhckNvbmZpZy5nZXRMYXN0VGV4dEFmdGVyU3BhY2VcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlIChcImJ1dHRvbnNcIikge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKChmaWVsZENvbmZpZy5idXR0b25zICYmIGZpZWxkQ29uZmlnLmJ1dHRvbnMubGVuZ3RoKSB8fCBmaWVsZENvbmZpZy5nZXRCdXR0b25zQnlJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJmaWVsZENvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCIhaXNIb3ZlcigpICYmIGZpZWxkQ29uZmlnLnNob3dCdXR0b25Ib3Zlck1vZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiAoZmllbGRDb25maWcuYnV0dG9ucyB8fCAoaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmZpZWxkQ29uZmlnLmdldEJ1dHRvbnNCeUl0ZW06aXRlbSgpIHwgYXN5bmMpKTsgdHJhY2sgJGluZGV4KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCJidXR0b24oKS50eXBlIHx8ICdidXR0b24tcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplQnV0dG9uXT1cImJ1dHRvbigpLnNpemVCdXR0b24gfHwgJ3NtYWxsZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJidXR0b24oKS5kaXNhYmxlID8/IGZpZWxkQ29uZmlnLmdldERpc2FibGUgPyAoaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmZpZWxkQ29uZmlnLmdldERpc2FibGU6aXRlbSgpIHwgYXN5bmMpOiBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImJ1dHRvbigpLmxhYmVsIHx8ICcgJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiYnV0dG9uKCkuY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImJ1dHRvbigpLmNsYXNzSWNvblJpZ2h0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJidXR0b24oKS5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbigpLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZVBvaW50ZXJFdmVudF09XCJidXR0b24oKS5pZ25vcmVQb2ludGVyRXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwiYnV0dG9uKCkuaWNvbk9ubHlUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiY2xpY2tCdXR0b25BY3Rpb24oYnV0dG9uKCkpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJidXR0b24tc3RhdHVzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlICB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcucGFyc2VWYWx1ZTppdGVtKCkpIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVySXRlbUNsaWNrKCRldmVudCxmaWVsZENvbmZpZylcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJzd2l0Y2hcIikge1xuICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5nZXRBY3RpdmVWYWx1ZVN3aXRjaDppdGVtKCkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZmllbGRDb25maWcuZ2V0RGlzYWJsZVZhbHVlU3dpdGNoID8gKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5nZXREaXNhYmxlVmFsdWVTd2l0Y2g6aXRlbSgpIHwgYXN5bmMpOiBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG91dFN3aXRjaCk9XCJoYW5kbGVyU3dpdGNoKCRldmVudCxmaWVsZENvbmZpZylcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgoZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdvdGhlci1hY3Rpb24tc2hvdy1wb3B1cCcgfHwgZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdiYWRnZScgfHwgZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdidXR0b24tYWN0aW9uLXNob3ctcG9wdXAnKSA/IGZpZWxkQ29uZmlnLmluc3RhbmNlIDogJycpIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmICgoaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5wYXJzZVZhbHVlOml0ZW0oKSB8IGFzeW5jKSAhPT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJmaWVsZENvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVs4cHhdXT1cIiFmaWVsZENvbmZpZy5pZ25vcmVDbGFzc01hcmdpbkxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7XG4gICAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDpmYWxzZSxcbiAgICAgICAgICAgICAgICBpZ25vcmVBcnJvdzogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/Lmlnbm9yZUFycm93IHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/Lm1heEhlaWdodCB8fCAyMDQ4LFxuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0SXRlbTpmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8ucGFkZGluZ0xlZnRJdGVtID8/IHRydWUsXG4gICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlOmZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5jbGFzc0luY2x1ZGVQb3B1cCB8fCAndy1bMjUwcHhdJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LnBvc2l0aW9uIHx8IHtcbiAgICAgICAgICAgICAgICAgIG1vZGU6J2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICBkaXN0YW5jZTowXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8uekluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwiZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LmdldExpc3RDb25maWcgPyAoKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8uZ2V0TGlzdENvbmZpZzppdGVtKCkpIHwgYXN5bmMpOmZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RCYWNrZ3JvdW5kQ3VzdG9tXT1cImZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0QmFja2dyb3VuZExpc3RDdXN0b21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cImZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0TWF4SXRlbVNob3cgfHwgNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0S2V5c0Rpc2FibGVdPVwiZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/Lmxpc3RLZXlzRGlzYWJsZUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cImZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0SGlkZGVuSW5wdXRTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0SXRlbURyb3Bkb3duKGZpZWxkQ29uZmlnLCBpbmRleCwkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdE11bHRpS2V5KT1cImhhbmRsZXJTZWxlY3RJdGVtc0Ryb3Bkb3duKGZpZWxkQ29uZmlnLCBpbmRleCwkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdvdGhlci1hY3Rpb24tc2hvdy1wb3B1cCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cIihpdGVtKCl8TGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTpmaWVsZENvbmZpZy5maWVsZDp1bmRlZmluZWQ6dHJ1ZSAgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmZpZWxkQ29uZmlnLnBhcnNlVmFsdWU6aXRlbSgpKXwgYXN5bmMgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZpZWxkQ29uZmlnLmluc3RhbmNlID09PSAnYmFkZ2UnICYmIChpdGVtKCl8TGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTpmaWVsZENvbmZpZy5maWVsZDp1bmRlZmluZWQ6dHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcucGFyc2VWYWx1ZTppdGVtKCkgfCBhc3luYykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1iYWRnZSBbYWN0aXZlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZU1hcmdpbkRlZmF1bHRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPVwiK3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvdW50XT1cIml0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlICB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcucGFyc2VWYWx1ZTppdGVtKCkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4Q291bnRdPVwiOTlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdidXR0b24tYWN0aW9uLXNob3ctcG9wdXAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8udHlwZSB8fCAnYnV0dG9uLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplQnV0dG9uXT1cImZpZWxkQ29uZmlnPy5kcm9wZG93bkNvbmZpZz8uYnV0dG9uKCk/LnNpemVCdXR0b24gfHwgJ3NtYWxsZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImZpZWxkQ29uZmlnPy5kcm9wZG93bkNvbmZpZz8uYnV0dG9uKCk/LmRpc2FibGUgPz8gZmllbGRDb25maWcuZ2V0RGlzYWJsZSA/IChpdGVtKCl8TGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTpmaWVsZENvbmZpZy5maWVsZDp1bmRlZmluZWQ6dHJ1ZSAgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmZpZWxkQ29uZmlnLmdldERpc2FibGU6aXRlbSgpIHwgYXN5bmMpOiBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8ubGFiZWwgfHwgJyAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImZpZWxkQ29uZmlnPy5kcm9wZG93bkNvbmZpZz8uYnV0dG9uKCk/LmNsYXNzSWNvbkxlZnQgfHwgJ2xpYnMtdWktaWNvbi1tb3JlLXZlcnRpY2FsIHJvdGF0ZS1bOTBkZWddIG1yLTAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJmaWVsZENvbmZpZz8uZHJvcGRvd25Db25maWc/LmJ1dHRvbigpPy5jbGFzc0ljb25SaWdodCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJmaWVsZENvbmZpZz8uZHJvcGRvd25Db25maWc/LmJ1dHRvbigpPy5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJsaW5lLWNsYW1wXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJmaWVsZENvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmaWVsZENvbmZpZy5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChmaWVsZENvbmZpZy5saW5lQ2xhbXBDb25maWc7IGFzIGxpbmVDbGFtcENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1saW5lX2NsYW1wXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVTaG93QnV0dG9uQ29sbGFwc2VFeHBhbmRdPVwibGluZUNsYW1wQ29uZmlnLmlnbm9yZVNob3dCdXR0b25Db2xsYXBzZUV4cGFuZCA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUb29sdGlwXT1cImxpbmVDbGFtcENvbmZpZy5zaG93VG9vbHRpcCA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW21heEhlaWdodF09XCJsaW5lQ2xhbXBDb25maWcubWF4SGVpZ2h0IHx8IDM2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW21heFdpZHRoVG9vbHRpcF09XCJsaW5lQ2xhbXBDb25maWcubWF4V2lkdGhUb29sdGlwIHx8IDIwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhIZWlnaHRUb29sdGlwXT1cImxpbmVDbGFtcENvbmZpZy5tYXhIZWlnaHRUb29sdGlwIHx8IDEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzT2JqZWN0XT1cImxpbmVDbGFtcENvbmZpZy5uZ0NsYXNzT2JqZWN0ID8/IHsgJ2xpYnMtdWktbGluZS1jbGFtcC1jb250ZW50IGxpYnMtdWktZm9udC1oNXInOiB0cnVlIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNJbm5lclRleHRdPVwibGluZUNsYW1wQ29uZmlnLmlzSW5uZXJUZXh0IHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvblRvb2x0aXBFdmVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRdPVwiaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5wYXJzZVZhbHVlOml0ZW0oKSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LGZpZWxkQ29uZmlnKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgQGNhc2UgKFwic2hhcGUtc3R5bGVcIikge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cImZpZWxkQ29uZmlnLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5wYXJzZVZhbHVlOml0ZW0oKSl8IGFzeW5jIHwgdHJhbnNsYXRlIHwgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZTonaHRtbCc6dHJ1ZSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsZmllbGRDb25maWcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cImZpZWxkQ29uZmlnLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5wYXJzZVZhbHVlOml0ZW0oKSkgfCBhc3luYyB8IHRyYW5zbGF0ZSB8IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGU6J2h0bWwnOnRydWV8YXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVySXRlbUNsaWNrKCRldmVudCxmaWVsZENvbmZpZylcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkQ29uZmlnLnJvd3MpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCByZWxhdGl2ZSB7eyBmaWVsZENvbmZpZy5yb3dzVGVtcGxhdGVDc3NXcmFwcGVyIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJyb3dSZWYuY2xpZW50SGVpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgI3Jvd1JlZlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGZsZXggYWJzb2x1dGUgIHt7IGZpZWxkQ29uZmlnLnJvd3NUZW1wbGF0ZUNzc1dyYXBwZXIgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlcyBjbGFzcz1cImZsZXggdy1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZmllbGRDb25maWcucm93c1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nQ29tcG9uZW50T3V0bGV0PVwiKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5nZXRDb21wb25lbnRPdXRsZXQ6aXRlbSgpKSB8IGFzeW5jOyBpbnB1dHM6KHVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcuZ2V0RGF0YUNvbXBvbmVudE91dGxldDppdGVtKCk6ZmllbGRDb25maWcuZmllbGQ6e3ZhbHVlSXNFbXB0eTp7aXRlbTppdGVtKCl9fSkgfCBhc3luY1wiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxufVxuIl19
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy90YWJsZS9zcmMvdGVtcGxhdGVzL3RlbXBsYXRlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RlbXBsYXRlcy90ZW1wbGF0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBc0IsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNFLE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBZ0UsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvSSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0NBQWdDLEVBQXNCLE1BQU0sNkJBQTZCLENBQUM7QUFDbkcsT0FBTyxFQUFnQiwrQkFBK0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNGLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FB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QXZDLHVDQUF1Qyx5bkJDbkNwRCxrN2NBMk1BLDhMRHhLYSx1Q0FBdUMsNklBVmhELE9BQU8sMkVBQUUsT0FBTyxtRkFBRSxlQUFlLHVGQUFFLFNBQVMsOENBQUUsaUJBQWlCLCtPQUFFLCtCQUErQix3RUFDaEcsK0JBQStCLHdQQUFFLHFDQUFxQyx5RUFDdEUsNEJBQTRCLHFFQUFFLGdDQUFnQyxxZUFDOUQsc0NBQXNDLGtHQUFFLCtCQUErQixnSkFDdkUsMEJBQTBCLG1FQUFFLHNDQUFzQyxzakJBQ2xFLGtDQUFrQywwb0JBQUUsaUNBQWlDLGkxREFDckUsOEJBQThCOzs0RkFJckIsdUNBQXVDO2tCQWpCbkQsU0FBUzsrQkFFRSxvQ0FBb0MsY0FHbEMsSUFBSSxXQUNQO3dCQUNQLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSwrQkFBK0I7d0JBQ2hHLCtCQUErQixFQUFFLHFDQUFxQzt3QkFDdEUsNEJBQTRCLEVBQUUsZ0NBQWdDO3dCQUM5RCxzQ0FBc0MsRUFBRSwrQkFBK0I7d0JBQ3ZFLDBCQUEwQixFQUFFLHNDQUFzQzt3QkFDbEUsa0NBQWtDLEVBQUUsaUNBQWlDO3dCQUNyRSw4QkFBOEI7cUJBQy9CLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0NvbXBvbmVudE91dGxldCwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNBdmF0YXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWF2YXRhcic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQmFkZ2VDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJhZGdlJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1N0YXR1c0NvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1zdGF0dXMnO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0TXVsdGlLZXksIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaW5lQ2xhbXBDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxpbmUtY2xhbXAnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBJU3dpdGNoRXZlbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0Nsb25lT2JqZWN0UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNsb25lLW9iamVjdCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZ2V0LXZhbHVlLW9mLW9iamVjdCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtc2VjdXJpdHktdHJ1c3QnO1xuaW1wb3J0IHsgY29udmVydE9iamVjdFRvU2lnbmFsLCBnZXQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRZUEVfSVRFTV9EQVRBX1RBQkxFIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJVGFibGVGaWVsZFRlbXBsYXRlQ29uZmlnLCBJVGFibGVUZW1wbGF0ZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvdGVtcGxhdGUtY29uZmlnLmludGVyZmFjZSc7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RlbXBsYXRlcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RlbXBsYXRlcy5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdTdHlsZSwgTmdDbGFzcywgVHJhbnNsYXRlTW9kdWxlLCBBc3luY1BpcGUsIE5nQ29tcG9uZW50T3V0bGV0LCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNBdmF0YXJDb21wb25lbnQsIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsXG4gICAgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTdGF0dXNDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDbG9uZU9iamVjdFBpcGUsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNMaW5lQ2xhbXBDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQmFkZ2VDb21wb25lbnRcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBsb2NrQ2xpY2shOiBib29sZWFuO1xuICBwcml2YXRlIGZ1bmN0aW9uQ29udHJvbHMgPSBuZXcgTWFwPG51bWJlciwgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHByb3RlY3RlZCBpc0ltYWdlRXJyb3I6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgaXNIb3ZlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZ3MgPSBpbnB1dDxBcnJheTxJVGFibGVUZW1wbGF0ZUNvbmZpZz4+KCk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlQ3NzV3JhcHBlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaXRlbSA9IGlucHV0LnJlcXVpcmVkPFRZUEVfSVRFTV9EQVRBX1RBQkxFPigpO1xuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVySXRlbUNsaWNrKGV2ZW50OiBFdmVudCB8IFRZUEVfUE9QT1ZFUl9FVkVOVCB8IHVuZGVmaW5lZCwgY29uZmlnOiBJVGFibGVGaWVsZFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycgJiYgZXZlbnQgIT09ICdjbGljaycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVMb2NrQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuYWN0aW9uKSB7XG4gICAgICAgIGNvbmZpZy5hY3Rpb24oZ2V0KHRoaXMuaXRlbSgpLCBjb25maWcuZmllbGQpLCB0aGlzLml0ZW0oKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2xpY2tCdXR0b25BY3Rpb24oYnV0dG9uOiBJQnV0dG9uKSB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVMb2NrQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgYnV0dG9uLmFjdGlvbj8uKHsgaXRlbTogdGhpcy5pdGVtKCkgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclN3aXRjaChzd2l0Y2hJdGVtOiBJU3dpdGNoRXZlbnQsIGNvbmZpZzogSVRhYmxlRmllbGRUZW1wbGF0ZUNvbmZpZykge1xuICAgIGF3YWl0IHRoaXMuaGFuZGxlTG9ja0NsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbmZpZz8uc3dpdGNoQWN0aW9uPy4oc3dpdGNoSXRlbSwgdGhpcy5pdGVtKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWxlY3RJdGVtRHJvcGRvd24oZmllbGRDb25maWc6IElUYWJsZUZpZWxkVGVtcGxhdGVDb25maWcsIGluZGV4OiBudW1iZXIsIGRhdGE/OiBJRW1pdFNlbGVjdEtleSkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmhhbmRsZUxvY2tDbGljayhhc3luYyAoKSA9PiB7XG4gICAgICBmaWVsZENvbmZpZz8uYWN0aW9uPy4oZGF0YS5rZXksIGRhdGEuaXRlbSwgdGhpcy5pdGVtKCkpO1xuICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scz8uZ2V0KGluZGV4KSBhcyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCk/LnJlc2V0KCk7XG4gICAgICAodGhpcy5mdW5jdGlvbkNvbnRyb2xzPy5nZXQoaW5kZXgpIGFzIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KT8ucmVtb3ZlTGlzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWxlY3RJdGVtc0Ryb3Bkb3duKGZpZWxkQ29uZmlnOiBJVGFibGVGaWVsZFRlbXBsYXRlQ29uZmlnLCBpbmRleDogbnVtYmVyLCBkYXRhPzogSUVtaXRNdWx0aUtleSkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmhhbmRsZUxvY2tDbGljayhhc3luYyAoKSA9PiB7XG4gICAgICBmaWVsZENvbmZpZz8uYWN0aW9uPy4oZGF0YS5rZXlzLCBjb252ZXJ0T2JqZWN0VG9TaWduYWwoZGF0YS5tYXBLZXlzLCBmYWxzZSksIHRoaXMuaXRlbSgpKTtcbiAgICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHM/LmdldChpbmRleCkgYXMgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQpPy5yZXNldCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJJbWFnZUVycm9yKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNJbWFnZUVycm9yID0gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRnVuY3Rpb25Db250cm9sKGV2ZW50OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9scy5zZXQoaW5kZXgsIGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlTG9ja0NsaWNrKGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgaWYgKHRoaXMubG9ja0NsaWNrKSByZXR1cm47XG4gICAgdGhpcy5sb2NrQ2xpY2sgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYWxsYmFjaygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9ja0NsaWNrID0gZmFsc2U7XG4gICAgICB9LCAyNTApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9scy5jbGVhcigpO1xuICB9XG5cbn1cbiIsIkBpZiAoY29uZmlncygpOyBhcyBjb25maWdzKSB7XG4gIEBpZiAoaXRlbSgpOyBhcyBpdGVtKSB7XG4gICAgPGRpdiBjbGFzcz1cImxpYnMtdWktdGFibGUtdGVtcGxhdGUge3sgdGVtcGxhdGVDc3NXcmFwcGVyKCkgfHwgJycgfX1cIj5cbiAgICAgIEBmb3IgKGNvbmZpZyBvZiBjb25maWdzOyB0cmFjayBjb25maWcpIHtcbiAgICAgICAgQGlmIChjb25maWcuZmllbGRzQ29uZmlnKSB7XG4gICAgICAgICAgPGRpdiBbY2xhc3NdPVwiY29uZmlnLmNzc1dyYXBwZXJcIj5cbiAgICAgICAgICAgIEBmb3IgKGZpZWxkQ29uZmlnIG9mIGNvbmZpZy5maWVsZHNDb25maWc7IHRyYWNrIGZpZWxkQ29uZmlnO2xldCBpbmRleCA9ICRpbmRleDspIHtcblxuICAgICAgICAgICAgICBAaWYgKCFmaWVsZENvbmZpZy5yb3dzICYmICFmaWVsZENvbmZpZy5nZXRDb21wb25lbnRPdXRsZXQpIHtcbiAgICAgICAgICAgICAgICBAc3dpdGNoIChmaWVsZENvbmZpZy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgQGNhc2UgKFwidG9vbHRpcFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoKGZpZWxkQ29uZmlnLnRvb2x0aXAgfHwge30pOyBhcyB0b29sdGlwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cInRvb2x0aXAudHlwZSB8fCAndGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwidG9vbHRpcC5tb2RlIHx8ICdob3ZlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZmllbGRDb25maWcubmdTdHlsZSB8fCB7fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmaWVsZENvbmZpZy5uZ0NsYXNzIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwidG9vbHRpcC5jbGFzc0luY2x1ZGUgfHwgJyAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0b29sdGlwLmlnbm9yZVNob3dQb3BvdmVyIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiKGZpZWxkQ29uZmlnLmdldFRvb2x0aXBDb25maWcgPyAoaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5nZXRUb29sdGlwQ29uZmlnOml0ZW0oKSB8IGFzeW5jKSA6ICh0b29sdGlwLmNvbmZpZyB8IExpYnNVaVBpcGVzQ2xvbmVPYmplY3RQaXBlKSkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCIgKGZpZWxkQ29uZmlnLmZpZWxkID8gKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlICkgOiB0b29sdGlwLmRhdGFWaWV3KSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcucGFyc2VWYWx1ZTppdGVtKCkgfCBhc3luYyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0RXZlbnQpPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsZmllbGRDb25maWcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoKChpdGVtKCl8TGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTpmaWVsZENvbmZpZy5maWVsZDp1bmRlZmluZWQ6dHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcuZ2V0SW1hZ2VTcmM6aXRlbSgpOmlzSW1hZ2VFcnJvcikgfCBhc3luYyk7IGFzIGxpbmtJbWFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgIEBpZiAobGlua0ltYWdlICE9PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW25nU3R5bGVdPVwiZmllbGRDb25maWcubmdTdHlsZSB8fCB7fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImxpbmtJbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJoYW5kbGVySW1hZ2VFcnJvcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LGZpZWxkQ29uZmlnKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlIChcImF2YXRhclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5nZXRBdmF0YXJDb25maWc6aXRlbSgpKSB8IGFzeW5jIDsgYXMgYXZhdGFyQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1hdmF0YXIgW3R5cGVTaGFwZV09XCJhdmF0YXJDb25maWcudHlwZVNoYXBlIHx8ICdjaXJjbGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYXZhdGFyQ29uZmlnLmNsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJmaWVsZENvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPSdhdmF0YXJDb25maWcuc2l6ZSB8fCAzMidcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5rQXZhdGFyXT1cImF2YXRhckNvbmZpZy5saW5rQXZhdGFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5rQXZhdGFyRXJyb3JdPVwiYXZhdGFyQ29uZmlnLmxpbmtBdmF0YXJFcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRHZW5Db2xvcl09XCJhdmF0YXJDb25maWcuaWRHZW5Db2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEF2YXRhcl09XCJhdmF0YXJDb25maWcudGV4dEF2YXRhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ2V0TGFzdFRleHRBZnRlclNwYWNlXT1cImF2YXRhckNvbmZpZy5nZXRMYXN0VGV4dEFmdGVyU3BhY2VcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlIChcImJ1dHRvbnNcIikge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKChmaWVsZENvbmZpZy5idXR0b25zICYmIGZpZWxkQ29uZmlnLmJ1dHRvbnMubGVuZ3RoKSB8fCBmaWVsZENvbmZpZy5nZXRCdXR0b25zQnlJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJmaWVsZENvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCIhaXNIb3ZlcigpICYmIGZpZWxkQ29uZmlnLnNob3dCdXR0b25Ib3Zlck1vZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiAoZmllbGRDb25maWcuYnV0dG9ucyB8fCAoaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmZpZWxkQ29uZmlnLmdldEJ1dHRvbnNCeUl0ZW06aXRlbSgpIHwgYXN5bmMpKTsgdHJhY2sgYnV0dG9uKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCJidXR0b24oKS50eXBlIHx8ICdidXR0b24tcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplQnV0dG9uXT1cImJ1dHRvbigpLnNpemVCdXR0b24gfHwgJ3NtYWxsZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJidXR0b24oKS5kaXNhYmxlID8/IGZpZWxkQ29uZmlnLmdldERpc2FibGUgPyAoaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmZpZWxkQ29uZmlnLmdldERpc2FibGU6aXRlbSgpIHwgYXN5bmMpOiBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImJ1dHRvbigpLmxhYmVsIHx8ICcgJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiYnV0dG9uKCkuY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImJ1dHRvbigpLmNsYXNzSWNvblJpZ2h0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJidXR0b24oKS5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImJ1dHRvbigpLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZVBvaW50ZXJFdmVudF09XCJidXR0b24oKS5pZ25vcmVQb2ludGVyRXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwiYnV0dG9uKCkuaWNvbk9ubHlUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiY2xpY2tCdXR0b25BY3Rpb24oYnV0dG9uKCkpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJidXR0b24tc3RhdHVzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlICB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcucGFyc2VWYWx1ZTppdGVtKCkpIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVySXRlbUNsaWNrKCRldmVudCxmaWVsZENvbmZpZylcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJzd2l0Y2hcIikge1xuICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5nZXRBY3RpdmVWYWx1ZVN3aXRjaDppdGVtKCkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZmllbGRDb25maWcuZ2V0RGlzYWJsZVZhbHVlU3dpdGNoID8gKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5nZXREaXNhYmxlVmFsdWVTd2l0Y2g6aXRlbSgpIHwgYXN5bmMpOiBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG91dFN3aXRjaCk9XCJoYW5kbGVyU3dpdGNoKCRldmVudCxmaWVsZENvbmZpZylcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgoZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdvdGhlci1hY3Rpb24tc2hvdy1wb3B1cCcgfHwgZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdiYWRnZScgfHwgZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdidXR0b24tYWN0aW9uLXNob3ctcG9wdXAnKSA/IGZpZWxkQ29uZmlnLmluc3RhbmNlIDogJycpIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmICgoaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5wYXJzZVZhbHVlOml0ZW0oKSB8IGFzeW5jKSAhPT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJmaWVsZENvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVs4cHhdXT1cIiFmaWVsZENvbmZpZy5pZ25vcmVDbGFzc01hcmdpbkxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7XG4gICAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDpmYWxzZSxcbiAgICAgICAgICAgICAgICBpZ25vcmVBcnJvdzogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/Lmlnbm9yZUFycm93IHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/Lm1heEhlaWdodCB8fCAyMDQ4LFxuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0SXRlbTpmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8ucGFkZGluZ0xlZnRJdGVtID8/IHRydWUsXG4gICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlOmZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5jbGFzc0luY2x1ZGVQb3B1cCB8fCAndy1bMjUwcHhdJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LnBvc2l0aW9uIHx8IHtcbiAgICAgICAgICAgICAgICAgIG1vZGU6J2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICBkaXN0YW5jZTowXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8uekluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwiZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LmdldExpc3RDb25maWcgPyAoKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8uZ2V0TGlzdENvbmZpZzppdGVtKCkpIHwgYXN5bmMpOmZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RCYWNrZ3JvdW5kQ3VzdG9tXT1cImZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0QmFja2dyb3VuZExpc3RDdXN0b21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cImZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0TWF4SXRlbVNob3cgfHwgNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0S2V5c0Rpc2FibGVdPVwiZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/Lmxpc3RLZXlzRGlzYWJsZUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cImZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0SGlkZGVuSW5wdXRTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0SXRlbURyb3Bkb3duKGZpZWxkQ29uZmlnLCBpbmRleCwkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdE11bHRpS2V5KT1cImhhbmRsZXJTZWxlY3RJdGVtc0Ryb3Bkb3duKGZpZWxkQ29uZmlnLCBpbmRleCwkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdvdGhlci1hY3Rpb24tc2hvdy1wb3B1cCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cIihpdGVtKCl8TGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTpmaWVsZENvbmZpZy5maWVsZDp1bmRlZmluZWQ6dHJ1ZSAgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmZpZWxkQ29uZmlnLnBhcnNlVmFsdWU6aXRlbSgpKXwgYXN5bmMgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZpZWxkQ29uZmlnLmluc3RhbmNlID09PSAnYmFkZ2UnICYmIChpdGVtKCl8TGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTpmaWVsZENvbmZpZy5maWVsZDp1bmRlZmluZWQ6dHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcucGFyc2VWYWx1ZTppdGVtKCkgfCBhc3luYykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1iYWRnZSBbYWN0aXZlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZU1hcmdpbkRlZmF1bHRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPVwiK3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvdW50XT1cIml0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlICB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcucGFyc2VWYWx1ZTppdGVtKCkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4Q291bnRdPVwiOTlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdidXR0b24tYWN0aW9uLXNob3ctcG9wdXAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8udHlwZSB8fCAnYnV0dG9uLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplQnV0dG9uXT1cImZpZWxkQ29uZmlnPy5kcm9wZG93bkNvbmZpZz8uYnV0dG9uKCk/LnNpemVCdXR0b24gfHwgJ3NtYWxsZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImZpZWxkQ29uZmlnPy5kcm9wZG93bkNvbmZpZz8uYnV0dG9uKCk/LmRpc2FibGUgPz8gZmllbGRDb25maWcuZ2V0RGlzYWJsZSA/IChpdGVtKCl8TGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTpmaWVsZENvbmZpZy5maWVsZDp1bmRlZmluZWQ6dHJ1ZSAgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmZpZWxkQ29uZmlnLmdldERpc2FibGU6aXRlbSgpIHwgYXN5bmMpOiBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8ubGFiZWwgfHwgJyAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImZpZWxkQ29uZmlnPy5kcm9wZG93bkNvbmZpZz8uYnV0dG9uKCk/LmNsYXNzSWNvbkxlZnQgfHwgJ2xpYnMtdWktaWNvbi1tb3JlLXZlcnRpY2FsIHJvdGF0ZS1bOTBkZWddIG1yLTAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJmaWVsZENvbmZpZz8uZHJvcGRvd25Db25maWc/LmJ1dHRvbigpPy5jbGFzc0ljb25SaWdodCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJmaWVsZENvbmZpZz8uZHJvcGRvd25Db25maWc/LmJ1dHRvbigpPy5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoXCJsaW5lLWNsYW1wXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJmaWVsZENvbmZpZy5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmaWVsZENvbmZpZy5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChmaWVsZENvbmZpZy5saW5lQ2xhbXBDb25maWc7IGFzIGxpbmVDbGFtcENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1saW5lX2NsYW1wXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVTaG93QnV0dG9uQ29sbGFwc2VFeHBhbmRdPVwibGluZUNsYW1wQ29uZmlnLmlnbm9yZVNob3dCdXR0b25Db2xsYXBzZUV4cGFuZCA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUb29sdGlwXT1cImxpbmVDbGFtcENvbmZpZy5zaG93VG9vbHRpcCA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW21heEhlaWdodF09XCJsaW5lQ2xhbXBDb25maWcubWF4SGVpZ2h0IHx8IDM2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW21heFdpZHRoVG9vbHRpcF09XCJsaW5lQ2xhbXBDb25maWcubWF4V2lkdGhUb29sdGlwIHx8IDIwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhIZWlnaHRUb29sdGlwXT1cImxpbmVDbGFtcENvbmZpZy5tYXhIZWlnaHRUb29sdGlwIHx8IDEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzT2JqZWN0XT1cImxpbmVDbGFtcENvbmZpZy5uZ0NsYXNzT2JqZWN0ID8/IHsgJ2xpYnMtdWktbGluZS1jbGFtcC1jb250ZW50IGxpYnMtdWktZm9udC1oNXInOiB0cnVlIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNJbm5lclRleHRdPVwibGluZUNsYW1wQ29uZmlnLmlzSW5uZXJUZXh0IHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvblRvb2x0aXBFdmVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRdPVwiaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRDb25maWcuZmllbGQ6dW5kZWZpbmVkOnRydWUgIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5wYXJzZVZhbHVlOml0ZW0oKSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LGZpZWxkQ29uZmlnKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgQGNhc2UgKFwic2hhcGUtc3R5bGVcIikge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cImZpZWxkQ29uZmlnLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5wYXJzZVZhbHVlOml0ZW0oKSl8IGFzeW5jIHwgdHJhbnNsYXRlIHwgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZTonaHRtbCc6dHJ1ZSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsZmllbGRDb25maWcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cImZpZWxkQ29uZmlnLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5wYXJzZVZhbHVlOml0ZW0oKSkgfCBhc3luYyB8IHRyYW5zbGF0ZSB8IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGU6J2h0bWwnOnRydWV8YXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVySXRlbUNsaWNrKCRldmVudCxmaWVsZENvbmZpZylcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkQ29uZmlnLnJvd3MpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCByZWxhdGl2ZSB7eyBmaWVsZENvbmZpZy5yb3dzVGVtcGxhdGVDc3NXcmFwcGVyIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJyb3dSZWYuY2xpZW50SGVpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgI3Jvd1JlZlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGZsZXggYWJzb2x1dGUgIHt7IGZpZWxkQ29uZmlnLnJvd3NUZW1wbGF0ZUNzc1dyYXBwZXIgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlcyBjbGFzcz1cImZsZXggdy1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZmllbGRDb25maWcucm93c1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nQ29tcG9uZW50T3V0bGV0PVwiKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkQ29uZmlnLmZpZWxkOnVuZGVmaW5lZDp0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpmaWVsZENvbmZpZy5nZXRDb21wb25lbnRPdXRsZXQ6aXRlbSgpKSB8IGFzeW5jOyBpbnB1dHM6KHVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6ZmllbGRDb25maWcuZ2V0RGF0YUNvbXBvbmVudE91dGxldDppdGVtKCk6ZmllbGRDb25maWcuZmllbGQ6e3ZhbHVlSXNFbXB0eTp7aXRlbTppdGVtKCl9fSkgfCBhc3luY1wiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxufVxuIl19