UNPKG

ng-devui

Version:

DevUI components based on Angular

203 lines 43.6 kB
import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay'; import { Component, ElementRef, EventEmitter, Input, Output, TemplateRef, ViewChild } from '@angular/core'; import { fadeInOut } from 'ng-devui/utils'; import { AutoCompleteConfig } from './auto-complete-config'; import * as i0 from "@angular/core"; import * as i1 from "./auto-complete-config"; import * as i2 from "@angular/common"; import * as i3 from "@angular/cdk/overlay"; import * as i4 from "ng-devui/utils"; import * as i5 from "ng-devui/loading"; export class AutoCompletePopupComponent { constructor(autoCompleteConfig, elementRef) { this.autoCompleteConfig = autoCompleteConfig; this.elementRef = elementRef; this.maxHeight = 300; this.disabled = false; this.customViewDirection = 'bottom'; this.isSearching = false; this.appendToBody = false; this.cdkOverlayOffsetY = 0; this.showAnimation = true; this.hoverItem = new EventEmitter(); this.activeIndex = 0; this.hoverIndex = 0; this.labelMinHeight = 20; // position.top小于20px时候,表示光标在第一行 this.showLoading = false; this.popPosition = 'bottom'; this.onChange = (_) => null; this.onTouched = () => null; this.formatter = this.autoCompleteConfig.autoComplete.formatter; } writeValue(obj) { this.value = obj; } setDisabledState(isDisabled) { this.disabled = isDisabled; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } onSelect(event, item) { if (this.disabledKey && item && item[this.disabledKey]) { event.preventDefault(); event.stopPropagation(); return; } if (this.overview === 'single') { // 单选场景和单行场景不需要冒泡 event.preventDefault(); event.stopPropagation(); } this.value = item; this.onTouched(); this.onChange({ type: 'select', value: this.value }); } selectCurrentItem(event) { this.activeIndex = this.hoverIndex; this.onSelect(event, this.source[this.hoverIndex]); } onActiveIndexChange(index) { this.activeIndex = index; } reset() { this.activeIndex = 0; this.hoverIndex = 0; } scrollToActive(index) { const that = this; setTimeout(() => { const scrollIndex = index === undefined ? this.activeIndex : index; const selectIndex = scrollIndex; const scrollPane = that.dropdownUl.nativeElement.children[selectIndex]; if (scrollPane.scrollIntoViewIfNeeded) { scrollPane.scrollIntoViewIfNeeded(false); } else { const containerInfo = that.dropdownUl.nativeElement.getBoundingClientRect(); const elementInfo = scrollPane.getBoundingClientRect(); if (elementInfo.bottom > containerInfo.bottom || elementInfo.top < containerInfo.top) { scrollPane.scrollIntoView(false); } } }); } next() { if (this.isOpen && this.source && this.source.length) { if (this.hoverIndex === this.source.length - 1) { this.hoverIndex = 0; this.scrollToActive(this.hoverIndex); return; } this.hoverIndex = this.hoverIndex + 1; this.scrollToActive(this.hoverIndex); } } prev() { if (this.isOpen && this.source && this.source.length) { if (this.hoverIndex === 0) { this.hoverIndex = this.source.length - 1; this.scrollToActive(this.hoverIndex); return; } this.hoverIndex = this.hoverIndex - 1; this.scrollToActive(this.hoverIndex); } } trackByFn(index, item) { return index; } animationEnd($event) { if (!this.isOpen && this.selectMenuElement) { const targetElement = this.selectMenuElement.nativeElement; setTimeout(() => { targetElement.style.display = 'none'; }); } } loadMoreEvent($event) { this.showLoading = true; this.onChange({ type: 'loadMore', value: this }); } loadFinish($event) { this.showLoading = false; } onPositionChange(position) { this.popPosition = position.connectionPair.originY; } onMouseOver(event, item) { this.hoverItem.emit(item); } hidePopup() { } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AutoCompletePopupComponent, deps: [{ token: i1.AutoCompleteConfig }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AutoCompletePopupComponent, selector: "d-auto-complete-popup", inputs: { width: "width", cssClass: "cssClass", maxHeight: "maxHeight", disabled: "disabled", disabledKey: "disabledKey", source: "source", position: "position", isOpen: "isOpen", term: "term", popTipsText: "popTipsText", overview: "overview", itemTemplate: "itemTemplate", noResultItemTemplate: "noResultItemTemplate", customViewTemplate: "customViewTemplate", customViewDirection: "customViewDirection", searchingTemplate: "searchingTemplate", isSearching: "isSearching", formatter: "formatter", dropdown: "dropdown", selectWidth: "selectWidth", enableLazyLoad: "enableLazyLoad", appendToBody: "appendToBody", cdkOverlayOffsetY: "cdkOverlayOffsetY", origin: "origin", showAnimation: "showAnimation" }, outputs: { hoverItem: "hoverItem" }, viewQueries: [{ propertyName: "selectMenuElement", first: true, predicate: ["selectMenuElement"], descendants: true }, { propertyName: "dropdownUl", first: true, predicate: ["dropdownUl"], descendants: true }, { propertyName: "connectedOverlay", first: true, predicate: CdkConnectedOverlay, descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"appendToBody\">\n <ng-template\n cdk-connected-overlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayWidth]=\"width\"\n [cdkConnectedOverlayOpen]=\"isOpen && !disabled\"\n [cdkConnectedOverlayOffsetY]=\"cdkOverlayOffsetY\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n (positionChange)=\"onPositionChange($event)\"\n (detach)=\"isOpen && hidePopup()\"\n >\n <ng-template [ngTemplateOutlet]=\"popTpl\"> </ng-template>\n </ng-template>\n</ng-container>\n\n<ng-container *ngIf=\"!appendToBody\">\n <ng-template [ngTemplateOutlet]=\"popTpl\"> </ng-template>\n</ng-container>\n\n<ng-template #popTpl>\n <div\n class=\"devui-dropdown-menu\"\n [ngClass]=\"{\n 'devui-dropdown-menu-cdk': appendToBody,\n 'devui-custom-right': customViewTemplate && customViewDirection === 'right',\n 'devui-custom-left': customViewTemplate && customViewDirection === 'left',\n 'devui-custom-top': customViewTemplate && customViewDirection === 'top'\n }\"\n [style.display]=\"isOpen && (source?.length || noResultItemTemplate) && !disabled ? 'inline-block' : 'none'\"\n [style.top]=\"overview === 'multiline' ? (position?.top < labelMinHeight ? '50%' : '100%') : '100%'\"\n [style.left]=\"overview === 'multiline' ? position?.left + 'px' : '0'\"\n [@fadeInOut]=\"isOpen && !disabled ? (appendToBody ? popPosition : 'bottom') : 'void'\"\n (@fadeInOut.done)=\"animationEnd($event)\"\n [@.disabled]=\"!showAnimation\"\n #selectMenuElement\n dLoading\n [showLoading]=\"showLoading\"\n [backdrop]=\"true\"\n >\n <ul\n class=\"devui-list-unstyled devui-scrollbar scroll-height devui-dropdown-menu-wrap devui-auto-complete-list\"\n [style.maxHeight]=\"maxHeight + 'px'\"\n dLazyLoad\n [enableLazyLoad]=\"enableLazyLoad\"\n (loadMore)=\"loadMoreEvent($event)\"\n #dropdownUl\n >\n <ng-container *ngIf=\"!isSearching || !searchingTemplate\">\n <li *ngIf=\"popTipsText && popTipsText.length > 0\" class=\"devui-popup-tips\">\n {{ popTipsText }}\n </li>\n <li\n *ngFor=\"let item of source; let $index = index; trackBy: trackByFn\"\n class=\"devui-dropdown-item\"\n [title]=\"formatter(item)\"\n [ngClass]=\"{\n selected: $index == activeIndex,\n 'devui-dropdown-bg': $index == hoverIndex,\n disabled: disabledKey && item[disabledKey]\n }\"\n (click)=\"onSelect($event, item)\"\n (mouseover)=\"onMouseOver($event, item)\"\n >\n <ng-template\n [ngTemplateOutlet]=\"itemTemplate || defaultItemTemplate\"\n [ngTemplateOutletContext]=\"{\n formatter: formatter,\n term: term,\n source: source,\n item: item,\n $index: $index\n }\"\n >\n </ng-template>\n </li>\n <div class=\"devui-no-data-tip\" *ngIf=\"!source?.length && noResultItemTemplate\">\n <ng-template [ngTemplateOutlet]=\"noResultItemTemplate\" [ngTemplateOutletContext]=\"{ term: term, source: source }\"> </ng-template>\n </div>\n </ng-container>\n <div class=\"devui-no-data-tip\" *ngIf=\"isSearching && searchingTemplate\">\n <ng-template [ngTemplateOutlet]=\"searchingTemplate\" [ngTemplateOutletContext]=\"{ term: term }\"> </ng-template>\n </div>\n </ul>\n <ng-container *ngIf=\"customViewTemplate\">\n <div class=\"devui-select-custom-area\">\n <ng-template [ngTemplateOutlet]=\"customViewTemplate\" [ngTemplateOutletContext]=\"{ $implicit: this }\"></ng-template>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #defaultItemTemplate let-item=\"item\" let-term=\"term\">\n <d-highlight [value]=\"formatter(item)\" [term]=\"term\"></d-highlight>\n</ng-template>\n", styles: [".devui-dropdown-menu{width:100%;display:block}.devui-dropdown-menu.devui-custom-right,.devui-dropdown-menu.devui-custom-left,.devui-dropdown-menu.devui-custom-top{min-width:400px;display:flex!important}.devui-dropdown-menu.devui-custom-right>.devui-dropdown-menu-wrap,.devui-dropdown-menu.devui-custom-left>.devui-dropdown-menu-wrap,.devui-dropdown-menu.devui-custom-top>.devui-dropdown-menu-wrap{display:inline-block}.devui-dropdown-menu.devui-custom-right>.devui-dropdown-menu-wrap>.devui-no-data-tip,.devui-dropdown-menu.devui-custom-left>.devui-dropdown-menu-wrap>.devui-no-data-tip,.devui-dropdown-menu.devui-custom-top>.devui-dropdown-menu-wrap>.devui-no-data-tip{padding:12px}.devui-dropdown-menu.devui-custom-right>.devui-select-custom-area,.devui-dropdown-menu.devui-custom-left>.devui-select-custom-area,.devui-dropdown-menu.devui-custom-top>.devui-select-custom-area{display:inline-block;overflow:auto}.devui-dropdown-menu.devui-custom-right:not(.devui-custom-top)>.devui-dropdown-menu-wrap,.devui-dropdown-menu.devui-custom-left:not(.devui-custom-top)>.devui-dropdown-menu-wrap,.devui-dropdown-menu.devui-custom-top:not(.devui-custom-top)>.devui-dropdown-menu-wrap{width:calc(50% - 1px)}.devui-dropdown-menu.devui-custom-right:not(.devui-custom-top)>.devui-select-custom-area,.devui-dropdown-menu.devui-custom-left:not(.devui-custom-top)>.devui-select-custom-area,.devui-dropdown-menu.devui-custom-top:not(.devui-custom-top)>.devui-select-custom-area{width:50%}.devui-dropdown-menu.devui-custom-right>.devui-select-custom-area:before,.devui-dropdown-menu.devui-custom-left>.devui-select-custom-area:before,.devui-dropdown-menu.devui-custom-top>.devui-select-custom-area:before{display:none}.devui-dropdown-menu.devui-custom-top{flex-direction:column-reverse}.devui-dropdown-menu.devui-custom-left>.devui-select-custom-area{border-right:1px solid var(--devui-dividing-line, #f0f0f0);order:-1}.devui-dropdown-menu.devui-custom-right>.devui-select-custom-area{border-left:1px solid var(--devui-dividing-line, #f0f0f0)}.devui-dropdown-menu.devui-custom-top>.devui-select-custom-area{border-bottom:1px solid var(--devui-dividing-line, #f0f0f0)}.devui-select-custom-area:before{display:block;content:\"\";width:calc(100% - 20px);margin:0 10px;height:1px;border-top:1px solid var(--devui-dividing-line, #f0f0f0)}.devui-dropdown-menu-cdk{position:static}ul.devui-list-unstyled{margin:0}.devui-popup-tips{color:var(--devui-text-weak, #333333);padding:4px 12px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.LazyLoadDirective, selector: "[dLazyLoad]", inputs: ["enableLazyLoad", "contentMode", "target", "imgLoadSrc", "direction"], outputs: ["loadMore"] }, { kind: "directive", type: i5.LoadingDirective, selector: "[dLoading]", inputs: ["backdrop", "message", "positionType", "showLoading", "view", "zIndex", "loading", "loadingStyle", "loadingTemplateRef"], exportAs: ["dLoading"] }, { kind: "component", type: i4.HighlightComponent, selector: "d-highlight", inputs: ["value", "term", "highlightClass"] }], animations: [fadeInOut] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AutoCompletePopupComponent, decorators: [{ type: Component, args: [{ selector: 'd-auto-complete-popup', animations: [fadeInOut], preserveWhitespaces: false, template: "<ng-container *ngIf=\"appendToBody\">\n <ng-template\n cdk-connected-overlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayWidth]=\"width\"\n [cdkConnectedOverlayOpen]=\"isOpen && !disabled\"\n [cdkConnectedOverlayOffsetY]=\"cdkOverlayOffsetY\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n (positionChange)=\"onPositionChange($event)\"\n (detach)=\"isOpen && hidePopup()\"\n >\n <ng-template [ngTemplateOutlet]=\"popTpl\"> </ng-template>\n </ng-template>\n</ng-container>\n\n<ng-container *ngIf=\"!appendToBody\">\n <ng-template [ngTemplateOutlet]=\"popTpl\"> </ng-template>\n</ng-container>\n\n<ng-template #popTpl>\n <div\n class=\"devui-dropdown-menu\"\n [ngClass]=\"{\n 'devui-dropdown-menu-cdk': appendToBody,\n 'devui-custom-right': customViewTemplate && customViewDirection === 'right',\n 'devui-custom-left': customViewTemplate && customViewDirection === 'left',\n 'devui-custom-top': customViewTemplate && customViewDirection === 'top'\n }\"\n [style.display]=\"isOpen && (source?.length || noResultItemTemplate) && !disabled ? 'inline-block' : 'none'\"\n [style.top]=\"overview === 'multiline' ? (position?.top < labelMinHeight ? '50%' : '100%') : '100%'\"\n [style.left]=\"overview === 'multiline' ? position?.left + 'px' : '0'\"\n [@fadeInOut]=\"isOpen && !disabled ? (appendToBody ? popPosition : 'bottom') : 'void'\"\n (@fadeInOut.done)=\"animationEnd($event)\"\n [@.disabled]=\"!showAnimation\"\n #selectMenuElement\n dLoading\n [showLoading]=\"showLoading\"\n [backdrop]=\"true\"\n >\n <ul\n class=\"devui-list-unstyled devui-scrollbar scroll-height devui-dropdown-menu-wrap devui-auto-complete-list\"\n [style.maxHeight]=\"maxHeight + 'px'\"\n dLazyLoad\n [enableLazyLoad]=\"enableLazyLoad\"\n (loadMore)=\"loadMoreEvent($event)\"\n #dropdownUl\n >\n <ng-container *ngIf=\"!isSearching || !searchingTemplate\">\n <li *ngIf=\"popTipsText && popTipsText.length > 0\" class=\"devui-popup-tips\">\n {{ popTipsText }}\n </li>\n <li\n *ngFor=\"let item of source; let $index = index; trackBy: trackByFn\"\n class=\"devui-dropdown-item\"\n [title]=\"formatter(item)\"\n [ngClass]=\"{\n selected: $index == activeIndex,\n 'devui-dropdown-bg': $index == hoverIndex,\n disabled: disabledKey && item[disabledKey]\n }\"\n (click)=\"onSelect($event, item)\"\n (mouseover)=\"onMouseOver($event, item)\"\n >\n <ng-template\n [ngTemplateOutlet]=\"itemTemplate || defaultItemTemplate\"\n [ngTemplateOutletContext]=\"{\n formatter: formatter,\n term: term,\n source: source,\n item: item,\n $index: $index\n }\"\n >\n </ng-template>\n </li>\n <div class=\"devui-no-data-tip\" *ngIf=\"!source?.length && noResultItemTemplate\">\n <ng-template [ngTemplateOutlet]=\"noResultItemTemplate\" [ngTemplateOutletContext]=\"{ term: term, source: source }\"> </ng-template>\n </div>\n </ng-container>\n <div class=\"devui-no-data-tip\" *ngIf=\"isSearching && searchingTemplate\">\n <ng-template [ngTemplateOutlet]=\"searchingTemplate\" [ngTemplateOutletContext]=\"{ term: term }\"> </ng-template>\n </div>\n </ul>\n <ng-container *ngIf=\"customViewTemplate\">\n <div class=\"devui-select-custom-area\">\n <ng-template [ngTemplateOutlet]=\"customViewTemplate\" [ngTemplateOutletContext]=\"{ $implicit: this }\"></ng-template>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #defaultItemTemplate let-item=\"item\" let-term=\"term\">\n <d-highlight [value]=\"formatter(item)\" [term]=\"term\"></d-highlight>\n</ng-template>\n", styles: [".devui-dropdown-menu{width:100%;display:block}.devui-dropdown-menu.devui-custom-right,.devui-dropdown-menu.devui-custom-left,.devui-dropdown-menu.devui-custom-top{min-width:400px;display:flex!important}.devui-dropdown-menu.devui-custom-right>.devui-dropdown-menu-wrap,.devui-dropdown-menu.devui-custom-left>.devui-dropdown-menu-wrap,.devui-dropdown-menu.devui-custom-top>.devui-dropdown-menu-wrap{display:inline-block}.devui-dropdown-menu.devui-custom-right>.devui-dropdown-menu-wrap>.devui-no-data-tip,.devui-dropdown-menu.devui-custom-left>.devui-dropdown-menu-wrap>.devui-no-data-tip,.devui-dropdown-menu.devui-custom-top>.devui-dropdown-menu-wrap>.devui-no-data-tip{padding:12px}.devui-dropdown-menu.devui-custom-right>.devui-select-custom-area,.devui-dropdown-menu.devui-custom-left>.devui-select-custom-area,.devui-dropdown-menu.devui-custom-top>.devui-select-custom-area{display:inline-block;overflow:auto}.devui-dropdown-menu.devui-custom-right:not(.devui-custom-top)>.devui-dropdown-menu-wrap,.devui-dropdown-menu.devui-custom-left:not(.devui-custom-top)>.devui-dropdown-menu-wrap,.devui-dropdown-menu.devui-custom-top:not(.devui-custom-top)>.devui-dropdown-menu-wrap{width:calc(50% - 1px)}.devui-dropdown-menu.devui-custom-right:not(.devui-custom-top)>.devui-select-custom-area,.devui-dropdown-menu.devui-custom-left:not(.devui-custom-top)>.devui-select-custom-area,.devui-dropdown-menu.devui-custom-top:not(.devui-custom-top)>.devui-select-custom-area{width:50%}.devui-dropdown-menu.devui-custom-right>.devui-select-custom-area:before,.devui-dropdown-menu.devui-custom-left>.devui-select-custom-area:before,.devui-dropdown-menu.devui-custom-top>.devui-select-custom-area:before{display:none}.devui-dropdown-menu.devui-custom-top{flex-direction:column-reverse}.devui-dropdown-menu.devui-custom-left>.devui-select-custom-area{border-right:1px solid var(--devui-dividing-line, #f0f0f0);order:-1}.devui-dropdown-menu.devui-custom-right>.devui-select-custom-area{border-left:1px solid var(--devui-dividing-line, #f0f0f0)}.devui-dropdown-menu.devui-custom-top>.devui-select-custom-area{border-bottom:1px solid var(--devui-dividing-line, #f0f0f0)}.devui-select-custom-area:before{display:block;content:\"\";width:calc(100% - 20px);margin:0 10px;height:1px;border-top:1px solid var(--devui-dividing-line, #f0f0f0)}.devui-dropdown-menu-cdk{position:static}ul.devui-list-unstyled{margin:0}.devui-popup-tips{color:var(--devui-text-weak, #333333);padding:4px 12px}\n"] }] }], ctorParameters: () => [{ type: i1.AutoCompleteConfig }, { type: i0.ElementRef }], propDecorators: { width: [{ type: Input }], cssClass: [{ type: Input }], maxHeight: [{ type: Input }], disabled: [{ type: Input }], disabledKey: [{ type: Input }], source: [{ type: Input }], position: [{ type: Input }], isOpen: [{ type: Input }], term: [{ type: Input }], popTipsText: [{ type: Input }], overview: [{ type: Input }], itemTemplate: [{ type: Input }], noResultItemTemplate: [{ type: Input }], customViewTemplate: [{ type: Input }], customViewDirection: [{ type: Input }], searchingTemplate: [{ type: Input }], isSearching: [{ type: Input }], formatter: [{ type: Input }], dropdown: [{ type: Input }], selectWidth: [{ type: Input }], enableLazyLoad: [{ type: Input }], appendToBody: [{ type: Input }], cdkOverlayOffsetY: [{ type: Input }], origin: [{ type: Input }], showAnimation: [{ type: Input }], hoverItem: [{ type: Output }], selectMenuElement: [{ type: ViewChild, args: ['selectMenuElement'] }], dropdownUl: [{ type: ViewChild, args: ['dropdownUl'] }], connectedOverlay: [{ type: ViewChild, args: [CdkConnectedOverlay] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS1wb3B1cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9hdXRvLWNvbXBsZXRlL2F1dG8tY29tcGxldGUtcG9wdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvYXV0by1jb21wbGV0ZS9hdXRvLWNvbXBsZXRlLXBvcHVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBS2pCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7QUFTNUQsTUFBTSxPQUFPLDBCQUEwQjtJQThDckMsWUFBb0Isa0JBQXNDLEVBQVMsVUFBc0I7UUFBckUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFTLGVBQVUsR0FBVixVQUFVLENBQVk7UUEzQ2hGLGNBQVMsR0FBRyxHQUFHLENBQUM7UUFDaEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQWNqQix3QkFBbUIsR0FBd0MsUUFBUSxDQUFDO1FBRXBFLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBS3BCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUV0QixrQkFBYSxHQUFHLElBQUksQ0FBQztRQUNwQixjQUFTLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFJNUQsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLG1CQUFjLEdBQUcsRUFB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cmxheU9yaWdpbixcbiAgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLFxuICBDb25uZWN0ZWRQb3NpdGlvbixcbiAgU2Nyb2xsU3RyYXRlZ3ksXG4gIFZlcnRpY2FsQ29ubmVjdGlvblBvc1xufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmYWRlSW5PdXQgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XG5pbXBvcnQgeyBBdXRvQ29tcGxldGVDb25maWcgfSBmcm9tICcuL2F1dG8tY29tcGxldGUtY29uZmlnJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZC1hdXRvLWNvbXBsZXRlLXBvcHVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG8tY29tcGxldGUtcG9wdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnYXV0by1jb21wbGV0ZS1wb3B1cC5jb21wb25lbnQuc2NzcyddLFxuICBhbmltYXRpb25zOiBbZmFkZUluT3V0XSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9Db21wbGV0ZVBvcHVwQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSBjc3NDbGFzczogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhIZWlnaHQgPSAzMDA7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVkS2V5OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNvdXJjZTogYW55W107XG4gIEBJbnB1dCgpIHBvc2l0aW9uOiBhbnk7XG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbjtcbiAgQElucHV0KCkgdGVybTogc3RyaW5nO1xuICBASW5wdXQoKSBwb3BUaXBzVGV4dDogc3RyaW5nO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIEBJbnB1dCgpIG92ZXJ2aWV3OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgbm9SZXN1bHRJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGN1c3RvbVZpZXdUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgY3VzdG9tVmlld0RpcmVjdGlvbjogJ2JvdHRvbScgfCAncmlnaHQnIHwgJ2xlZnQnIHwgJ3RvcCcgPSAnYm90dG9tJztcbiAgQElucHV0KCkgc2VhcmNoaW5nVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGlzU2VhcmNoaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZvcm1hdHRlcjogKGl0ZW06IGFueSkgPT4gc3RyaW5nO1xuICBASW5wdXQoKSBkcm9wZG93bjogYm9vbGVhbjtcbiAgQElucHV0KCkgc2VsZWN0V2lkdGg6IGFueTtcbiAgQElucHV0KCkgZW5hYmxlTGF6eUxvYWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFwcGVuZFRvQm9keSA9IGZhbHNlO1xuICBASW5wdXQoKSBjZGtPdmVybGF5T2Zmc2V0WSA9IDA7XG4gIEBJbnB1dCgpIG9yaWdpbjogQ2RrT3ZlcmxheU9yaWdpbiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgc2hvd0FuaW1hdGlvbiA9IHRydWU7XG4gIEBPdXRwdXQoKSBob3Zlckl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAVmlld0NoaWxkKCdzZWxlY3RNZW51RWxlbWVudCcpIHNlbGVjdE1lbnVFbGVtZW50OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdkcm9wZG93blVsJykgZHJvcGRvd25VbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZChDZGtDb25uZWN0ZWRPdmVybGF5KSBjb25uZWN0ZWRPdmVybGF5OiBDZGtDb25uZWN0ZWRPdmVybGF5O1xuICBhY3RpdmVJbmRleCA9IDA7XG4gIGhvdmVySW5kZXggPSAwO1xuICBsYWJlbE1pbkhlaWdodCA9IDIwOyAvLyBwb3NpdGlvbi50b3DlsI/kuo4yMHB45pe25YCZ77yM6KGo56S65YWJ5qCH5Zyo56ys5LiA6KGMXG4gIHNob3dMb2FkaW5nID0gZmFsc2U7XG4gIG92ZXJsYXlQb3NpdGlvbnM6IEFycmF5PENvbm5lY3RlZFBvc2l0aW9uPjtcbiAgcG9wUG9zaXRpb246IFZlcnRpY2FsQ29ubmVjdGlvblBvcyA9ICdib3R0b20nO1xuICBwb3BEaXJlY3Rpb246ICd0b3AnIHwgJ2JvdHRvbSc7XG4gIHNjcm9sbFN0cmF0ZWd5OiBTY3JvbGxTdHJhdGVneTtcblxuICBwcml2YXRlIHZhbHVlOiBhbnk7XG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiBudWxsO1xuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhdXRvQ29tcGxldGVDb25maWc6IEF1dG9Db21wbGV0ZUNvbmZpZywgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICB0aGlzLmZvcm1hdHRlciA9IHRoaXMuYXV0b0NvbXBsZXRlQ29uZmlnLmF1dG9Db21wbGV0ZS5mb3JtYXR0ZXI7XG4gIH1cblxuICB3cml0ZVZhbHVlKG9iaik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBvYmo7XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm4pOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbik6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBvblNlbGVjdChldmVudCwgaXRlbSkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkS2V5ICYmIGl0ZW0gJiYgaXRlbVt0aGlzLmRpc2FibGVkS2V5XSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5vdmVydmlldyA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIC8vIOWNlemAieWcuuaZr+WSjOWNleihjOWcuuaZr+S4jemcgOimgeWGkuazoVxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUgPSBpdGVtO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5vbkNoYW5nZSh7IHR5cGU6ICdzZWxlY3QnLCB2YWx1ZTogdGhpcy52YWx1ZSB9KTtcbiAgfVxuXG4gIHNlbGVjdEN1cnJlbnRJdGVtKGV2ZW50KSB7XG4gICAgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMuaG92ZXJJbmRleDtcbiAgICB0aGlzLm9uU2VsZWN0KGV2ZW50LCB0aGlzLnNvdXJjZVt0aGlzLmhvdmVySW5kZXhdKTtcbiAgfVxuXG4gIG9uQWN0aXZlSW5kZXhDaGFuZ2UoaW5kZXgpIHtcbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gaW5kZXg7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gMDtcbiAgICB0aGlzLmhvdmVySW5kZXggPSAwO1xuICB9XG5cbiAgc2Nyb2xsVG9BY3RpdmUoaW5kZXg/KTogdm9pZCB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBzY3JvbGxJbmRleCA9IGluZGV4ID09PSB1bmRlZmluZWQgPyB0aGlzLmFjdGl2ZUluZGV4IDogaW5kZXg7XG4gICAgICBjb25zdCBzZWxlY3RJbmRleCA9IHNjcm9sbEluZGV4O1xuICAgICAgY29uc3Qgc2Nyb2xsUGFuZTogYW55ID0gdGhhdC5kcm9wZG93blVsLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5bc2VsZWN0SW5kZXhdO1xuICAgICAgaWYgKHNjcm9sbFBhbmUuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCkge1xuICAgICAgICBzY3JvbGxQYW5lLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVySW5mbyA9IHRoYXQuZHJvcGRvd25VbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBlbGVtZW50SW5mbyA9IHNjcm9sbFBhbmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmIChlbGVtZW50SW5mby5ib3R0b20gPiBjb250YWluZXJJbmZvLmJvdHRvbSB8fCBlbGVtZW50SW5mby50b3AgPCBjb250YWluZXJJbmZvLnRvcCkge1xuICAgICAgICAgIHNjcm9sbFBhbmUuc2Nyb2xsSW50b1ZpZXcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZXh0KCkge1xuICAgIGlmICh0aGlzLmlzT3BlbiAmJiB0aGlzLnNvdXJjZSAmJiB0aGlzLnNvdXJjZS5sZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLmhvdmVySW5kZXggPT09IHRoaXMuc291cmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy5ob3ZlckluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0FjdGl2ZSh0aGlzLmhvdmVySW5kZXgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmhvdmVySW5kZXggPSB0aGlzLmhvdmVySW5kZXggKyAxO1xuICAgICAgdGhpcy5zY3JvbGxUb0FjdGl2ZSh0aGlzLmhvdmVySW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByZXYoKSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuICYmIHRoaXMuc291cmNlICYmIHRoaXMuc291cmNlLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuaG92ZXJJbmRleCA9PT0gMCkge1xuICAgICAgICB0aGlzLmhvdmVySW5kZXggPSB0aGlzLnNvdXJjZS5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLnNjcm9sbFRvQWN0aXZlKHRoaXMuaG92ZXJJbmRleCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaG92ZXJJbmRleCA9IHRoaXMuaG92ZXJJbmRleCAtIDE7XG4gICAgICB0aGlzLnNjcm9sbFRvQWN0aXZlKHRoaXMuaG92ZXJJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4LCBpdGVtKSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYW5pbWF0aW9uRW5kKCRldmVudCkge1xuICAgIGlmICghdGhpcy5pc09wZW4gJiYgdGhpcy5zZWxlY3RNZW51RWxlbWVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHRoaXMuc2VsZWN0TWVudUVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0YXJnZXRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBsb2FkTW9yZUV2ZW50KCRldmVudCkge1xuICAgIHRoaXMuc2hvd0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMub25DaGFuZ2UoeyB0eXBlOiAnbG9hZE1vcmUnLCB2YWx1ZTogdGhpcyB9KTtcbiAgfVxuXG4gIGxvYWRGaW5pc2goJGV2ZW50KSB7XG4gICAgdGhpcy5zaG93TG9hZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25Qb3NpdGlvbkNoYW5nZShwb3NpdGlvbjogQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlKSB7XG4gICAgdGhpcy5wb3BQb3NpdGlvbiA9IHBvc2l0aW9uLmNvbm5lY3Rpb25QYWlyLm9yaWdpblk7XG4gIH1cblxuICBvbk1vdXNlT3ZlcihldmVudDogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XG4gICAgdGhpcy5ob3Zlckl0ZW0uZW1pdChpdGVtKTtcbiAgfVxuXG4gIGhpZGVQb3B1cCgpIHt9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiYXBwZW5kVG9Cb2R5XCI+XG4gIDxuZy10ZW1wbGF0ZVxuICAgIGNkay1jb25uZWN0ZWQtb3ZlcmxheVxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cIm9yaWdpblwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlXaWR0aF09XCJ3aWR0aFwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImlzT3BlbiAmJiAhZGlzYWJsZWRcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WV09XCJjZGtPdmVybGF5T2Zmc2V0WVwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwib3ZlcmxheVBvc2l0aW9uc1wiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneV09XCJzY3JvbGxTdHJhdGVneVwiXG4gICAgKHBvc2l0aW9uQ2hhbmdlKT1cIm9uUG9zaXRpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGRldGFjaCk9XCJpc09wZW4gJiYgaGlkZVBvcHVwKClcIlxuICA+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBvcFRwbFwiPiA8L25nLXRlbXBsYXRlPlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhYXBwZW5kVG9Cb2R5XCI+XG4gIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJwb3BUcGxcIj4gPC9uZy10ZW1wbGF0ZT5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3BvcFRwbD5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZGV2dWktZHJvcGRvd24tbWVudVwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ2RldnVpLWRyb3Bkb3duLW1lbnUtY2RrJzogYXBwZW5kVG9Cb2R5LFxuICAgICAgJ2RldnVpLWN1c3RvbS1yaWdodCc6IGN1c3RvbVZpZXdUZW1wbGF0ZSAmJiBjdXN0b21WaWV3RGlyZWN0aW9uID09PSAncmlnaHQnLFxuICAgICAgJ2RldnVpLWN1c3RvbS1sZWZ0JzogY3VzdG9tVmlld1RlbXBsYXRlICYmIGN1c3RvbVZpZXdEaXJlY3Rpb24gPT09ICdsZWZ0JyxcbiAgICAgICdkZXZ1aS1jdXN0b20tdG9wJzogY3VzdG9tVmlld1RlbXBsYXRlICYmIGN1c3RvbVZpZXdEaXJlY3Rpb24gPT09ICd0b3AnXG4gICAgfVwiXG4gICAgW3N0eWxlLmRpc3BsYXldPVwiaXNPcGVuICYmIChzb3VyY2U/Lmxlbmd0aCB8fCBub1Jlc3VsdEl0ZW1UZW1wbGF0ZSkgJiYgIWRpc2FibGVkID8gJ2lubGluZS1ibG9jaycgOiAnbm9uZSdcIlxuICAgIFtzdHlsZS50b3BdPVwib3ZlcnZpZXcgPT09ICdtdWx0aWxpbmUnID8gKHBvc2l0aW9uPy50b3AgPCBsYWJlbE1pbkhlaWdodCA/ICc1MCUnIDogJzEwMCUnKSA6ICcxMDAlJ1wiXG4gICAgW3N0eWxlLmxlZnRdPVwib3ZlcnZpZXcgPT09ICdtdWx0aWxpbmUnID8gcG9zaXRpb24/LmxlZnQgKyAncHgnIDogJzAnXCJcbiAgICBbQGZhZGVJbk91dF09XCJpc09wZW4gJiYgIWRpc2FibGVkID8gKGFwcGVuZFRvQm9keSA/IHBvcFBvc2l0aW9uIDogJ2JvdHRvbScpIDogJ3ZvaWQnXCJcbiAgICAoQGZhZGVJbk91dC5kb25lKT1cImFuaW1hdGlvbkVuZCgkZXZlbnQpXCJcbiAgICBbQC5kaXNhYmxlZF09XCIhc2hvd0FuaW1hdGlvblwiXG4gICAgI3NlbGVjdE1lbnVFbGVtZW50XG4gICAgZExvYWRpbmdcbiAgICBbc2hvd0xvYWRpbmddPVwic2hvd0xvYWRpbmdcIlxuICAgIFtiYWNrZHJvcF09XCJ0cnVlXCJcbiAgPlxuICAgIDx1bFxuICAgICAgY2xhc3M9XCJkZXZ1aS1saXN0LXVuc3R5bGVkIGRldnVpLXNjcm9sbGJhciBzY3JvbGwtaGVpZ2h0IGRldnVpLWRyb3Bkb3duLW1lbnUtd3JhcCBkZXZ1aS1hdXRvLWNvbXBsZXRlLWxpc3RcIlxuICAgICAgW3N0eWxlLm1heEhlaWdodF09XCJtYXhIZWlnaHQgKyAncHgnXCJcbiAgICAgIGRMYXp5TG9hZFxuICAgICAgW2VuYWJsZUxhenlMb2FkXT1cImVuYWJsZUxhenlMb2FkXCJcbiAgICAgIChsb2FkTW9yZSk9XCJsb2FkTW9yZUV2ZW50KCRldmVudClcIlxuICAgICAgI2Ryb3Bkb3duVWxcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU2VhcmNoaW5nIHx8ICFzZWFyY2hpbmdUZW1wbGF0ZVwiPlxuICAgICAgICA8bGkgKm5nSWY9XCJwb3BUaXBzVGV4dCAmJiBwb3BUaXBzVGV4dC5sZW5ndGggPiAwXCIgY2xhc3M9XCJkZXZ1aS1wb3B1cC10aXBzXCI+XG4gICAgICAgICAge3sgcG9wVGlwc1RleHQgfX1cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc291cmNlOyBsZXQgJGluZGV4ID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgY2xhc3M9XCJkZXZ1aS1kcm9wZG93bi1pdGVtXCJcbiAgICAgICAgICBbdGl0bGVdPVwiZm9ybWF0dGVyKGl0ZW0pXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICBzZWxlY3RlZDogJGluZGV4ID09IGFjdGl2ZUluZGV4LFxuICAgICAgICAgICAgJ2RldnVpLWRyb3Bkb3duLWJnJzogJGluZGV4ID09IGhvdmVySW5kZXgsXG4gICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWRLZXkgJiYgaXRlbVtkaXNhYmxlZEtleV1cbiAgICAgICAgICB9XCJcbiAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3QoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgKG1vdXNlb3Zlcik9XCJvbk1vdXNlT3ZlcigkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVRlbXBsYXRlIHx8IGRlZmF1bHRJdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIsXG4gICAgICAgICAgICAgIHRlcm06IHRlcm0sXG4gICAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgICAgICAkaW5kZXg6ICRpbmRleFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZXZ1aS1uby1kYXRhLXRpcFwiICpuZ0lmPVwiIXNvdXJjZT8ubGVuZ3RoICYmIG5vUmVzdWx0SXRlbVRlbXBsYXRlXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vUmVzdWx0SXRlbVRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgdGVybTogdGVybSwgc291cmNlOiBzb3VyY2UgfVwiPiA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiBjbGFzcz1cImRldnVpLW5vLWRhdGEtdGlwXCIgKm5nSWY9XCJpc1NlYXJjaGluZyAmJiBzZWFyY2hpbmdUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VhcmNoaW5nVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB0ZXJtOiB0ZXJtIH1cIj4gPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvdWw+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1c3RvbVZpZXdUZW1wbGF0ZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRldnVpLXNlbGVjdC1jdXN0b20tYXJlYVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tVmlld1RlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiB0aGlzIH1cIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0SXRlbVRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiIGxldC10ZXJtPVwidGVybVwiPlxuICA8ZC1oaWdobGlnaHQgW3ZhbHVlXT1cImZvcm1hdHRlcihpdGVtKVwiIFt0ZXJtXT1cInRlcm1cIj48L2QtaGlnaGxpZ2h0PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==