UNPKG

ng-devui

Version:

DevUI components based on Angular

206 lines 35.4 kB
import { __decorate, __metadata } from "tslib"; import { Component, EventEmitter, forwardRef, Input, Output, TemplateRef, } from '@angular/core'; import { I18nService } from 'ng-devui/i18n'; import { DevConfigService, WithConfig } from 'ng-devui/utils'; import { ACCORDION } from './accordion-token'; import * as i0 from "@angular/core"; import * as i1 from "ng-devui/i18n"; import * as i2 from "ng-devui/utils"; import * as i3 from "@angular/common"; import * as i4 from "./accordion-list.component"; export class AccordionComponent { constructor(i18n, devConfigService) { this.i18n = i18n; this.devConfigService = devConfigService; /* Key值定义, 用于自定义数据结构 */ this.titleKey = 'title'; // 标题的key,item[titleKey]类型为string,为标题显示内容 this.loadingKey = 'loading'; // 子菜单动态加载item[loadingKey]类型为boolean this.childrenKey = 'children'; // 子菜单Key this.disabledKey = 'disabled'; // 是否禁用Key this.activeKey = 'active'; // 菜单是否激活/选中 this.openKey = 'open'; // 菜单是否打开 this.menuToggle = new EventEmitter(); // 可展开菜单展开事件 this.itemClick = new EventEmitter(); // 可点击菜单点击事件 this.activeItemChange = new EventEmitter(); /** 高级选项和模板 */ this.restrictOneOpen = false; // 限制一级菜单同时只能打开一个 this.autoOpenActiveMenu = false; // 自动展开活跃菜单 this.showNoContent = true; // 没有内容的时候是否显示没有数据 /* 内置路由/链接/动态判断路由或链接类型 */ this.linkType = ''; this.linkTypeKey = 'linkType'; // linkType为'dependOnLinkTypeKey'时指定对象linkType定义区 this.linkKey = 'link'; // 链接内容的key this.linkTargetKey = 'target'; // 链接目标窗口的key this.linkDefaultTarget = '_self'; // 不设置target的时候target默认值 this.accordionType = 'normal'; this.showAnimation = true; // 点击了可点击菜单 this.itemClickFn = (itemEvent) => { const prevActiveItem = this.activeItem; this.activeItemFn(itemEvent.item); this.itemClick.emit({ ...itemEvent, prevActiveItem: prevActiveItem }); }; this.linkItemClickFn = (itemEvent) => { const prevActiveItem = this.activeItem; this.activeItem = itemEvent.item; this.itemClick.emit({ ...itemEvent, prevActiveItem: prevActiveItem }); }; // 打开或关闭可折叠菜单 this.menuToggleFn = (menuEvent) => { this.openMenuFn(menuEvent.item, menuEvent.open); this.menuToggle.emit(menuEvent); }; } ngOnChanges(changes) { const { data, autoOpenActiveMenu } = changes; if (data) { this.initActiveItem(); } if (autoOpenActiveMenu) { if (this.autoOpenActiveMenu && autoOpenActiveMenu.previousValue === false) { this.cleanOpenData(); } } } ngOnInit() { if (this.data) { this.initActiveItem(); } this.i18nCommonText = this.i18n.getI18nText().common; this.i18nSubscription = this.i18n.langChange().subscribe((data) => { this.i18nCommonText = data.common; }); } ngOnDestroy() { if (this.i18nSubscription) { this.i18nSubscription.unsubscribe(); } } flatten(arr, childrenKey = 'children', includeParent = false, includeLeaf = true) { return arr.reduce((acc, cur) => { const children = cur[childrenKey]; if (children === undefined) { if (includeLeaf) { acc.push(cur); } } else { if (includeParent) { acc.push(cur); } if (Array.isArray(children)) { acc.push(...this.flatten(children, childrenKey, includeParent)); } } return acc; }, []); } cleanOpenData() { this.flatten(this.data, this.childrenKey, true, false).forEach((item) => { item[this.openKey] = undefined; }); } // 默认激活 initActiveItem() { const activeItem = this.flatten(this.data, this.childrenKey) .filter((item) => item[this.activeKey]) .pop(); if (activeItem) { if (!this.activeItem) { this.activeItemFn(activeItem); } } else { this.activeItem = undefined; } } // 激活子菜单项并去掉其他子菜单的激活 activeItemFn(item) { if (this.activeItem && this.activeItem[this.activeKey]) { this.activeItem[this.activeKey] = false; } item[this.activeKey] = true; this.activeItem = item; this.activeItemChange.emit(this.activeItem); } // 打开或关闭一级菜单,如果有限制只能展开一项则关闭其他一级菜单 openMenuFn(item, open) { if (open && this.restrictOneOpen) { this.data.forEach((itemtemp) => { itemtemp[this.openKey] = false; }); } item[this.openKey] = open; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AccordionComponent, deps: [{ token: i1.I18nService }, { token: i2.DevConfigService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AccordionComponent, selector: "d-accordion", inputs: { data: "data", titleKey: "titleKey", loadingKey: "loadingKey", childrenKey: "childrenKey", disabledKey: "disabledKey", activeKey: "activeKey", openKey: "openKey", menuItemTemplate: "menuItemTemplate", itemTemplate: "itemTemplate", restrictOneOpen: "restrictOneOpen", autoOpenActiveMenu: "autoOpenActiveMenu", showNoContent: "showNoContent", noContentTemplate: "noContentTemplate", loadingTemplate: "loadingTemplate", innerListTemplate: "innerListTemplate", linkType: "linkType", linkTypeKey: "linkTypeKey", linkKey: "linkKey", linkTargetKey: "linkTargetKey", linkDefaultTarget: "linkDefaultTarget", accordionType: "accordionType", showAnimation: "showAnimation" }, outputs: { menuToggle: "menuToggle", itemClick: "itemClick", activeItemChange: "activeItemChange" }, providers: [ { provide: ACCORDION, useExisting: forwardRef(() => AccordionComponent), }, ], usesOnChanges: true, ngImport: i0, template: "<d-accordion-list\n class=\"devui-accordion-menu devui-scrollbar\"\n [ngClass]=\"{ 'devui-accordion-menu-normal': accordionType === 'normal' }\"\n [data]=\"data\"\n [deepth]=\"0\"\n [parent]=\"null\"\n>\n</d-accordion-list>\n", styles: ["@charset \"UTF-8\";:host{display:block}:host ::ng-deep d-accordion-menu,:host ::ng-deep d-accordion-item,:host ::ng-deep d-accordion-item-hreflink,:host ::ng-deep d-accordion-item-routerlink,:host ::ng-deep d-accordion-list{display:block}:host ::ng-deep .devui-accordion-menu{display:block;background:var(--devui-base-bg, #ffffff);width:100%;overflow-y:auto;border-radius:var(--devui-border-radius, 2px);height:100%}:host ::ng-deep .devui-accordion-menu.devui-accordion-menu-normal{box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) var(--devui-shadow, rgba(0, 0, 0, .16))}:host ::ng-deep .devui-accordion-menu>.devui-accordion-list{padding:8px 0}:host ::ng-deep .devui-accordion-menu .devui-over-flow-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .devui-accordion-submenu{background:var(--devui-base-bg, #ffffff);width:100%}:host ::ng-deep .devui-accordion-item-title{display:block;height:40px;width:calc(100% - 24px);margin:0 12px;padding:0 8px;font-weight:400;line-height:40px;color:var(--devui-text-weak, #333333);border-radius:var(--devui-border-radius, 2px);background:transparent;cursor:pointer}:host ::ng-deep .devui-accordion-item-title.disabled{color:var(--devui-disabled-text, #c2c2c2);cursor:not-allowed}:host ::ng-deep .devui-accordion-item-title.disabled>a{color:var(--devui-disabled-text, #c2c2c2)}:host ::ng-deep .devui-accordion-item-title:not(.disabled):hover{background:var(--devui-list-item-hover-bg, #f2f2f3);color:var(--devui-list-item-hover-text, #000000)}:host ::ng-deep .devui-accordion-item-title:not(.disabled).devui-router-active,:host ::ng-deep .devui-accordion-item-title:not(.disabled).active:not(.open){color:var(--devui-brand-active, #0950de);font-weight:700}:host ::ng-deep .devui-accordion-item-title:not(.disabled).devui-router-active>a,:host ::ng-deep .devui-accordion-item-title:not(.disabled).active:not(.open)>a{color:var(--devui-brand-active, #0950de)}:host ::ng-deep .devui-accordion-item-title>a{text-decoration:none;display:block;width:100%;color:var(--devui-text-weak, #333333)}:host ::ng-deep .devui-accordion-item-title>a:hover{color:inherit;text-decoration:none}:host ::ng-deep d-accordion-item-hreflink.devui-accordion-item-title,:host ::ng-deep d-accordion-item-routerlink.devui-accordion-item-title{padding:0}:host ::ng-deep d-accordion-item-hreflink.devui-accordion-item-title>a,:host ::ng-deep d-accordion-item-routerlink.devui-accordion-item-title>a{padding:0 12px 0 20px}:host ::ng-deep .devui-accordion-menu-item{overflow-y:hidden}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title{position:relative}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title>.devui-accordion-open-icon{display:inline-block;text-indent:0;pointer-events:none;position:absolute;right:10px;top:12px;width:16px;height:16px;line-height:16px;transform:rotate(-90deg);transform-origin:center;transition:transform var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1))}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title>.devui-accordion-open-icon>svg{width:16px;height:16px}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title>.devui-accordion-open-icon>svg path{fill:var(--devui-icon-fill, #595959)}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title:not(.open).active svg path{fill:var(--devui-icon-fill-active, #191919)}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title.open>.devui-accordion-open-icon{transform:none}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title.disabled>.devui-accordion-open-icon{color:var(--devui-disabled-text, #c2c2c2)}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title.disabled>.devui-accordion-open-icon svg path{fill:var(--devui-disabled-text, #c2c2c2)}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title{padding-right:28px}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title.active:not(.open){color:var(--devui-brand-active, #0950de);background:transparent}:host ::ng-deep .devui-accordion-item-title{position:relative}:host ::ng-deep .devui-accordion-show-animate .devui-accordion-item-title{transition:font-weight var(--devui-animation-duration-fast, .1s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1)),background-color var(--devui-animation-duration-fast, .1s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1))}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i4.AccordionListComponent, selector: "d-accordion-list", inputs: ["data", "deepth", "parent"] }] }); } } __decorate([ WithConfig(), __metadata("design:type", Object) ], AccordionComponent.prototype, "showAnimation", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AccordionComponent, decorators: [{ type: Component, args: [{ selector: 'd-accordion', preserveWhitespaces: false, providers: [ { provide: ACCORDION, useExisting: forwardRef(() => AccordionComponent), }, ], template: "<d-accordion-list\n class=\"devui-accordion-menu devui-scrollbar\"\n [ngClass]=\"{ 'devui-accordion-menu-normal': accordionType === 'normal' }\"\n [data]=\"data\"\n [deepth]=\"0\"\n [parent]=\"null\"\n>\n</d-accordion-list>\n", styles: ["@charset \"UTF-8\";:host{display:block}:host ::ng-deep d-accordion-menu,:host ::ng-deep d-accordion-item,:host ::ng-deep d-accordion-item-hreflink,:host ::ng-deep d-accordion-item-routerlink,:host ::ng-deep d-accordion-list{display:block}:host ::ng-deep .devui-accordion-menu{display:block;background:var(--devui-base-bg, #ffffff);width:100%;overflow-y:auto;border-radius:var(--devui-border-radius, 2px);height:100%}:host ::ng-deep .devui-accordion-menu.devui-accordion-menu-normal{box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) var(--devui-shadow, rgba(0, 0, 0, .16))}:host ::ng-deep .devui-accordion-menu>.devui-accordion-list{padding:8px 0}:host ::ng-deep .devui-accordion-menu .devui-over-flow-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .devui-accordion-submenu{background:var(--devui-base-bg, #ffffff);width:100%}:host ::ng-deep .devui-accordion-item-title{display:block;height:40px;width:calc(100% - 24px);margin:0 12px;padding:0 8px;font-weight:400;line-height:40px;color:var(--devui-text-weak, #333333);border-radius:var(--devui-border-radius, 2px);background:transparent;cursor:pointer}:host ::ng-deep .devui-accordion-item-title.disabled{color:var(--devui-disabled-text, #c2c2c2);cursor:not-allowed}:host ::ng-deep .devui-accordion-item-title.disabled>a{color:var(--devui-disabled-text, #c2c2c2)}:host ::ng-deep .devui-accordion-item-title:not(.disabled):hover{background:var(--devui-list-item-hover-bg, #f2f2f3);color:var(--devui-list-item-hover-text, #000000)}:host ::ng-deep .devui-accordion-item-title:not(.disabled).devui-router-active,:host ::ng-deep .devui-accordion-item-title:not(.disabled).active:not(.open){color:var(--devui-brand-active, #0950de);font-weight:700}:host ::ng-deep .devui-accordion-item-title:not(.disabled).devui-router-active>a,:host ::ng-deep .devui-accordion-item-title:not(.disabled).active:not(.open)>a{color:var(--devui-brand-active, #0950de)}:host ::ng-deep .devui-accordion-item-title>a{text-decoration:none;display:block;width:100%;color:var(--devui-text-weak, #333333)}:host ::ng-deep .devui-accordion-item-title>a:hover{color:inherit;text-decoration:none}:host ::ng-deep d-accordion-item-hreflink.devui-accordion-item-title,:host ::ng-deep d-accordion-item-routerlink.devui-accordion-item-title{padding:0}:host ::ng-deep d-accordion-item-hreflink.devui-accordion-item-title>a,:host ::ng-deep d-accordion-item-routerlink.devui-accordion-item-title>a{padding:0 12px 0 20px}:host ::ng-deep .devui-accordion-menu-item{overflow-y:hidden}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title{position:relative}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title>.devui-accordion-open-icon{display:inline-block;text-indent:0;pointer-events:none;position:absolute;right:10px;top:12px;width:16px;height:16px;line-height:16px;transform:rotate(-90deg);transform-origin:center;transition:transform var(--devui-animation-duration-slow, .3s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1))}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title>.devui-accordion-open-icon>svg{width:16px;height:16px}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title>.devui-accordion-open-icon>svg path{fill:var(--devui-icon-fill, #595959)}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title:not(.open).active svg path{fill:var(--devui-icon-fill-active, #191919)}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title.open>.devui-accordion-open-icon{transform:none}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title.disabled>.devui-accordion-open-icon{color:var(--devui-disabled-text, #c2c2c2)}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title.disabled>.devui-accordion-open-icon svg path{fill:var(--devui-disabled-text, #c2c2c2)}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title{padding-right:28px}:host ::ng-deep .devui-accordion-menu-item>.devui-accordion-item-title.active:not(.open){color:var(--devui-brand-active, #0950de);background:transparent}:host ::ng-deep .devui-accordion-item-title{position:relative}:host ::ng-deep .devui-accordion-show-animate .devui-accordion-item-title{transition:font-weight var(--devui-animation-duration-fast, .1s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1)),background-color var(--devui-animation-duration-fast, .1s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1))}\n"] }] }], ctorParameters: () => [{ type: i1.I18nService }, { type: i2.DevConfigService }], propDecorators: { data: [{ type: Input }], titleKey: [{ type: Input }], loadingKey: [{ type: Input }], childrenKey: [{ type: Input }], disabledKey: [{ type: Input }], activeKey: [{ type: Input }], openKey: [{ type: Input }], menuItemTemplate: [{ type: Input }], itemTemplate: [{ type: Input }], menuToggle: [{ type: Output }], itemClick: [{ type: Output }], activeItemChange: [{ type: Output }], restrictOneOpen: [{ type: Input }], autoOpenActiveMenu: [{ type: Input }], showNoContent: [{ type: Input }], noContentTemplate: [{ type: Input }], loadingTemplate: [{ type: Input }], innerListTemplate: [{ type: Input }], linkType: [{ type: Input }], linkTypeKey: [{ type: Input }], linkKey: [{ type: Input }], linkTargetKey: [{ type: Input }], linkDefaultTarget: [{ type: Input }], accordionType: [{ type: Input }], showAnimation: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL2FjY29yZGlvbi9hY2NvcmRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvYWNjb3JkaW9uL2FjY29yZGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFJTCxNQUFNLEVBRU4sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBaUIsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7OztBQWM5QyxNQUFNLE9BQU8sa0JBQWtCO0lBd0M3QixZQUFvQixJQUFpQixFQUFVLGdCQUFrQztRQUE3RCxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQVUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQXRDakYsdUJBQXVCO1FBQ2QsYUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLHlDQUF5QztRQUM3RCxlQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsb0NBQW9DO1FBQzVELGdCQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsU0FBUztRQUNuQyxnQkFBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLFVBQVU7UUFDcEMsY0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLFlBQVk7UUFDbEMsWUFBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLFNBQVM7UUFNMUIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDLENBQUMsWUFBWTtRQUN2RSxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQTJCLENBQUMsQ0FBQyxZQUFZO1FBQ3JFLHFCQUFnQixHQUFHLElBQUksWUFB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QkFBekIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNpQixhQUFhO3NCQUFuQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEkxOG5JbnRlcmZhY2UsIEkxOG5TZXJ2aWNlIH0gZnJvbSAnbmctZGV2dWkvaTE4bic7XHJcbmltcG9ydCB7IERldkNvbmZpZ1NlcnZpY2UsIFdpdGhDb25maWcgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBQ0NPUkRJT04gfSBmcm9tICcuL2FjY29yZGlvbi10b2tlbic7XHJcbmltcG9ydCB7IEFjY29yZGlvbkl0ZW1DbGlja0V2ZW50LCBBY2NvcmRpb25NZW51VG9nZ2xlRXZlbnQsIEFjY29yZGlvbk1lbnVUeXBlLCBBY2NvcmRpb25PcHRpb25zIH0gZnJvbSAnLi9hY2NvcmRpb24udHlwZSc7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZC1hY2NvcmRpb24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hY2NvcmRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FjY29yZGlvbi5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBBQ0NPUkRJT04sXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFjY29yZGlvbkNvbXBvbmVudCksXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY2NvcmRpb25Db21wb25lbnQgaW1wbGVtZW50cyBBY2NvcmRpb25PcHRpb25zLCBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBkYXRhOiBBcnJheTxhbnk+IHwgQWNjb3JkaW9uTWVudVR5cGU7XHJcbiAgLyogS2V55YC85a6a5LmJLCDnlKjkuo7oh6rlrprkuYnmlbDmja7nu5PmnoQgKi9cclxuICBASW5wdXQoKSB0aXRsZUtleSA9ICd0aXRsZSc7IC8vIOagh+mimOeahGtlee+8jGl0ZW1bdGl0bGVLZXld57G75Z6L5Li6c3RyaW5n77yM5Li65qCH6aKY5pi+56S65YaF5a65XHJcbiAgQElucHV0KCkgbG9hZGluZ0tleSA9ICdsb2FkaW5nJzsgLy8g5a2Q6I+c5Y2V5Yqo5oCB5Yqg6L29aXRlbVtsb2FkaW5nS2V5Xeexu+Wei+S4umJvb2xlYW5cclxuICBASW5wdXQoKSBjaGlsZHJlbktleSA9ICdjaGlsZHJlbic7IC8vIOWtkOiPnOWNlUtleVxyXG4gIEBJbnB1dCgpIGRpc2FibGVkS2V5ID0gJ2Rpc2FibGVkJzsgLy8g5piv5ZCm56aB55SoS2V5XHJcbiAgQElucHV0KCkgYWN0aXZlS2V5ID0gJ2FjdGl2ZSc7IC8vIOiPnOWNleaYr+WQpua/gOa0uy/pgInkuK1cclxuICBASW5wdXQoKSBvcGVuS2V5ID0gJ29wZW4nOyAvLyDoj5zljZXmmK/lkKbmiZPlvIBcclxuXHJcbiAgLyog6I+c5Y2V5qih5p2/ICovXHJcbiAgQElucHV0KCkgbWVudUl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjsgLy8g5Y+v5bGV5byA6I+c5Y2V5YaF5a655p2h5qih5p2/XHJcbiAgQElucHV0KCkgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+OyAvLyDlj6/ngrnlh7voj5zljZXlhoXlrrnmnaHmqKHmnb9cclxuXHJcbiAgQE91dHB1dCgpIG1lbnVUb2dnbGUgPSBuZXcgRXZlbnRFbWl0dGVyPEFjY29yZGlvbk1lbnVUb2dnbGVFdmVudD4oKTsgLy8g5Y+v5bGV5byA6I+c5Y2V5bGV5byA5LqL5Lu2XHJcbiAgQE91dHB1dCgpIGl0ZW1DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8QWNjb3JkaW9uSXRlbUNsaWNrRXZlbnQ+KCk7IC8vIOWPr+eCueWHu+iPnOWNleeCueWHu+S6i+S7tlxyXG4gIEBPdXRwdXQoKSBhY3RpdmVJdGVtQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8qKiDpq5jnuqfpgInpobnlkozmqKHmnb8gKi9cclxuICBASW5wdXQoKSByZXN0cmljdE9uZU9wZW4gPSBmYWxzZTsgLy8g6ZmQ5Yi25LiA57qn6I+c5Y2V5ZCM5pe25Y+q6IO95omT5byA5LiA5LiqXHJcbiAgQElucHV0KCkgYXV0b09wZW5BY3RpdmVNZW51ID0gZmFsc2U7IC8vIOiHquWKqOWxleW8gOa0u+i3g+iPnOWNlVxyXG4gIEBJbnB1dCgpIHNob3dOb0NvbnRlbnQgPSB0cnVlOyAvLyDmsqHmnInlhoXlrrnnmoTml7blgJnmmK/lkKbmmL7npLrmsqHmnInmlbDmja5cclxuICBASW5wdXQoKSBub0NvbnRlbnRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjsgLy8g5rKh5pyJ5YaF5a6555qE5pe25YCZ5L2/55So6Ieq5a6a5LmJ5qih5p2/XHJcbiAgQElucHV0KCkgbG9hZGluZ1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+OyAvLyDliqDovb3kuK3kvb/nlKjoh6rlrprkuYnmqKHmnb9cclxuICBASW5wdXQoKSBpbm5lckxpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjsgLy8g5Y+v5oqY5Y+g6I+c5Y2V5YaF5a655a6M5YWo6Ieq5a6a5LmJ77yM55So5YGa5oqY5Y+g6Z2i5p2/XHJcblxyXG4gIC8qIOWGhee9rui3r+eUsS/pk77mjqUv5Yqo5oCB5Yik5pat6Lev55Sx5oiW6ZO+5o6l57G75Z6LICovXHJcbiAgQElucHV0KCkgbGlua1R5cGU6ICdyb3V0ZXJMaW5rJyB8ICdocmVmTGluaycgfCAnZGVwZW5kT25MaW5rVHlwZUtleScgfCAnJyB8IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGxpbmtUeXBlS2V5ID0gJ2xpbmtUeXBlJzsgLy8gbGlua1R5cGXkuLonZGVwZW5kT25MaW5rVHlwZUtleSfml7bmjIflrprlr7nosaFsaW5rVHlwZeWumuS5ieWMulxyXG4gIEBJbnB1dCgpIGxpbmtLZXkgPSAnbGluayc7IC8vIOmTvuaOpeWGheWuueeahGtleVxyXG4gIEBJbnB1dCgpIGxpbmtUYXJnZXRLZXkgPSAndGFyZ2V0JzsgLy8g6ZO+5o6l55uu5qCH56qX5Y+j55qEa2V5XHJcbiAgQElucHV0KCkgbGlua0RlZmF1bHRUYXJnZXQgPSAnX3NlbGYnOyAvLyDkuI3orr7nva50YXJnZXTnmoTml7blgJl0YXJnZXTpu5jorqTlgLxcclxuXHJcbiAgQElucHV0KCkgYWNjb3JkaW9uVHlwZTogJ25vcm1hbCcgfCAnZW1iZWQnID0gJ25vcm1hbCc7XHJcbiAgQElucHV0KCkgQFdpdGhDb25maWcoKSBzaG93QW5pbWF0aW9uID0gdHJ1ZTtcclxuXHJcbiAgYWN0aXZlSXRlbTsgLy8g6K6w5b2V55So5oi354K55Ye755qE5r+A5rS76I+c5Y2V6aG5XHJcbiAgaTE4bkNvbW1vblRleHQ6IEkxOG5JbnRlcmZhY2VbJ2NvbW1vbiddO1xyXG4gIGkxOG5TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpMThuOiBJMThuU2VydmljZSwgcHJpdmF0ZSBkZXZDb25maWdTZXJ2aWNlOiBEZXZDb25maWdTZXJ2aWNlKSB7fVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBjb25zdCB7IGRhdGEsIGF1dG9PcGVuQWN0aXZlTWVudSB9ID0gY2hhbmdlcztcclxuICAgIGlmIChkYXRhKSB7XHJcbiAgICAgIHRoaXMuaW5pdEFjdGl2ZUl0ZW0oKTtcclxuICAgIH1cclxuICAgIGlmIChhdXRvT3BlbkFjdGl2ZU1lbnUpIHtcclxuICAgICAgaWYgKHRoaXMuYXV0b09wZW5BY3RpdmVNZW51ICYmIGF1dG9PcGVuQWN0aXZlTWVudS5wcmV2aW91c1ZhbHVlID09PSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuY2xlYW5PcGVuRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmRhdGEpIHtcclxuICAgICAgdGhpcy5pbml0QWN0aXZlSXRlbSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pMThuQ29tbW9uVGV4dCA9IHRoaXMuaTE4bi5nZXRJMThuVGV4dCgpLmNvbW1vbjtcclxuICAgIHRoaXMuaTE4blN1YnNjcmlwdGlvbiA9IHRoaXMuaTE4bi5sYW5nQ2hhbmdlKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuaTE4bkNvbW1vblRleHQgPSBkYXRhLmNvbW1vbjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5pMThuU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuaTE4blN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmbGF0dGVuKGFycjogQXJyYXk8YW55PiwgY2hpbGRyZW5LZXkgPSAnY2hpbGRyZW4nLCBpbmNsdWRlUGFyZW50ID0gZmFsc2UsIGluY2x1ZGVMZWFmID0gdHJ1ZSkge1xyXG4gICAgcmV0dXJuIGFyci5yZWR1Y2UoKGFjYywgY3VyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gY3VyW2NoaWxkcmVuS2V5XTtcclxuICAgICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAoaW5jbHVkZUxlYWYpIHtcclxuICAgICAgICAgIGFjYy5wdXNoKGN1cik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChpbmNsdWRlUGFyZW50KSB7XHJcbiAgICAgICAgICBhY2MucHVzaChjdXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcclxuICAgICAgICAgIGFjYy5wdXNoKC4uLnRoaXMuZmxhdHRlbihjaGlsZHJlbiwgY2hpbGRyZW5LZXksIGluY2x1ZGVQYXJlbnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIFtdKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYW5PcGVuRGF0YSgpIHtcclxuICAgIHRoaXMuZmxhdHRlbih0aGlzLmRhdGEsIHRoaXMuY2hpbGRyZW5LZXksIHRydWUsIGZhbHNlKS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW1bdGhpcy5vcGVuS2V5XSA9IHVuZGVmaW5lZDtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyDpu5jorqTmv4DmtLtcclxuICBpbml0QWN0aXZlSXRlbSgpIHtcclxuICAgIGNvbnN0IGFjdGl2ZUl0ZW0gPSB0aGlzLmZsYXR0ZW4odGhpcy5kYXRhLCB0aGlzLmNoaWxkcmVuS2V5KVxyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtW3RoaXMuYWN0aXZlS2V5XSlcclxuICAgICAgLnBvcCgpO1xyXG4gICAgaWYgKGFjdGl2ZUl0ZW0pIHtcclxuICAgICAgaWYgKCF0aGlzLmFjdGl2ZUl0ZW0pIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZUl0ZW1GbihhY3RpdmVJdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVJdGVtID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g54K55Ye75LqG5Y+v54K55Ye76I+c5Y2VXHJcbiAgcHVibGljIGl0ZW1DbGlja0ZuID0gKGl0ZW1FdmVudDogQWNjb3JkaW9uSXRlbUNsaWNrRXZlbnQpID0+IHtcclxuICAgIGNvbnN0IHByZXZBY3RpdmVJdGVtID0gdGhpcy5hY3RpdmVJdGVtO1xyXG4gICAgdGhpcy5hY3RpdmVJdGVtRm4oaXRlbUV2ZW50Lml0ZW0pO1xyXG4gICAgdGhpcy5pdGVtQ2xpY2suZW1pdCh7IC4uLml0ZW1FdmVudCwgcHJldkFjdGl2ZUl0ZW06IHByZXZBY3RpdmVJdGVtIH0pO1xyXG4gIH07XHJcblxyXG4gIGxpbmtJdGVtQ2xpY2tGbiA9IChpdGVtRXZlbnQ6IEFjY29yZGlvbkl0ZW1DbGlja0V2ZW50KSA9PiB7XHJcbiAgICBjb25zdCBwcmV2QWN0aXZlSXRlbSA9IHRoaXMuYWN0aXZlSXRlbTtcclxuICAgIHRoaXMuYWN0aXZlSXRlbSA9IGl0ZW1FdmVudC5pdGVtO1xyXG4gICAgdGhpcy5pdGVtQ2xpY2suZW1pdCh7IC4uLml0ZW1FdmVudCwgcHJldkFjdGl2ZUl0ZW06IHByZXZBY3RpdmVJdGVtIH0pO1xyXG4gIH07XHJcblxyXG4gIC8vIOaJk+W8gOaIluWFs+mXreWPr+aKmOWPoOiPnOWNlVxyXG4gIHB1YmxpYyBtZW51VG9nZ2xlRm4gPSAobWVudUV2ZW50OiBBY2NvcmRpb25NZW51VG9nZ2xlRXZlbnQpID0+IHtcclxuICAgIHRoaXMub3Blbk1lbnVGbihtZW51RXZlbnQuaXRlbSwgbWVudUV2ZW50Lm9wZW4pO1xyXG4gICAgdGhpcy5tZW51VG9nZ2xlLmVtaXQobWVudUV2ZW50KTtcclxuICB9O1xyXG5cclxuICAvLyDmv4DmtLvlrZDoj5zljZXpobnlubbljrvmjonlhbbku5blrZDoj5zljZXnmoTmv4DmtLtcclxuICBhY3RpdmVJdGVtRm4oaXRlbSkge1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlSXRlbSAmJiB0aGlzLmFjdGl2ZUl0ZW1bdGhpcy5hY3RpdmVLZXldKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlSXRlbVt0aGlzLmFjdGl2ZUtleV0gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGl0ZW1bdGhpcy5hY3RpdmVLZXldID0gdHJ1ZTtcclxuICAgIHRoaXMuYWN0aXZlSXRlbSA9IGl0ZW07XHJcbiAgICB0aGlzLmFjdGl2ZUl0ZW1DaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZUl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgLy8g5omT5byA5oiW5YWz6Zet5LiA57qn6I+c5Y2V77yM5aaC5p6c5pyJ6ZmQ5Yi25Y+q6IO95bGV5byA5LiA6aG55YiZ5YWz6Zet5YW25LuW5LiA57qn6I+c5Y2VXHJcbiAgb3Blbk1lbnVGbihpdGVtLCBvcGVuKSB7XHJcbiAgICBpZiAob3BlbiAmJiB0aGlzLnJlc3RyaWN0T25lT3Blbikge1xyXG4gICAgICAodGhpcy5kYXRhIGFzIGFueVtdKS5mb3JFYWNoKChpdGVtdGVtcCkgPT4ge1xyXG4gICAgICAgIGl0ZW10ZW1wW3RoaXMub3BlbktleV0gPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpdGVtW3RoaXMub3BlbktleV0gPSBvcGVuO1xyXG4gIH1cclxufVxyXG4iLCI8ZC1hY2NvcmRpb24tbGlzdFxuICBjbGFzcz1cImRldnVpLWFjY29yZGlvbi1tZW51IGRldnVpLXNjcm9sbGJhclwiXG4gIFtuZ0NsYXNzXT1cInsgJ2RldnVpLWFjY29yZGlvbi1tZW51LW5vcm1hbCc6IGFjY29yZGlvblR5cGUgPT09ICdub3JtYWwnIH1cIlxuICBbZGF0YV09XCJkYXRhXCJcbiAgW2RlZXB0aF09XCIwXCJcbiAgW3BhcmVudF09XCJudWxsXCJcbj5cbjwvZC1hY2NvcmRpb24tbGlzdD5cbiJdfQ==