UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

481 lines 66.5 kB
import { Overlay } from '@angular/cdk/overlay';
import { TemplatePortal } from '@angular/cdk/portal';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, Renderer2, signal, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation, } from '@angular/core';
import { combineLatest, ReplaySubject, Subject, map, tap } from 'rxjs';
import { noop, publishRef, sleep } from '../../../../core/public-api';
import animDataMap from '../../lottie-icons/animation-data';
import { NavMenuComponent } from '../nav-menu.component';
import * as i0 from "@angular/core";
import * as i1 from "../nav-menu.component";
import * as i2 from "@angular/cdk/overlay";
import * as i3 from "@angular/common";
import * as i4 from "@alauda/ui";
import * as i5 from "../../../../effect-directive/e2e-attribute-binding.directive";
import * as i6 from "@angular/router";
import * as i7 from "../../lottie-icons/lottie-icon.directive";
import * as i8 from "../nav-item-ul/nav-item-ul.component";
import * as i9 from "../../../../core/pipes/img-header.pipe";
import * as i10 from "../../../../core/pipes/sanitize.pipe";
import * as i11 from "../../../../core/pipes/pure.pipe";
const _c0 = ["main"];
const _c1 = a0 => ({ $implicit: a0 });
function NavItemLiComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementContainer(0);
} }
function NavItemLiComponent_ng_template_1_a_5_ng_container_4_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementContainer(0);
} }
function NavItemLiComponent_ng_template_1_a_5_Template(rf, ctx) { if (rf & 1) {
    const _r4 = i0.ɵɵgetCurrentView();
    i0.ɵɵelementStart(0, "a", 8);
    i0.ɵɵpipe(1, "async");
    i0.ɵɵpipe(2, "async");
    i0.ɵɵpipe(3, "async");
    i0.ɵɵlistener("click", function NavItemLiComponent_ng_template_1_a_5_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.handleContentClicked(false)); });
    i0.ɵɵtemplate(4, NavItemLiComponent_ng_template_1_a_5_ng_container_4_Template, 1, 0, "ng-container", 9);
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const fromTooltip_r2 = i0.ɵɵnextContext().$implicit;
    const ctx_r2 = i0.ɵɵnextContext();
    const navItem_r5 = i0.ɵɵreference(4);
    i0.ɵɵclassProp("isActive", i0.ɵɵpipeBind1(1, 9, ctx_r2.isActive$))("isLeaf", i0.ɵɵpipeBind1(2, 11, ctx_r2.depth$) === 1);
    i0.ɵɵproperty("routerLink", ctx_r2.item.routerLink)("queryParams", ctx_r2.item == null ? null : ctx_r2.item.queryParams);
    i0.ɵɵattribute("data-set-depth", i0.ɵɵpipeBind1(3, 13, ctx_r2.depth$));
    i0.ɵɵadvance(4);
    i0.ɵɵproperty("ngTemplateOutlet", navItem_r5)("ngTemplateOutletContext", i0.ɵɵpureFunction1(15, _c1, fromTooltip_r2));
} }
function NavItemLiComponent_ng_template_1_a_6_ng_container_4_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementContainer(0);
} }
function NavItemLiComponent_ng_template_1_a_6_Template(rf, ctx) { if (rf & 1) {
    const _r6 = i0.ɵɵgetCurrentView();
    i0.ɵɵelementStart(0, "a", 10);
    i0.ɵɵpipe(1, "async");
    i0.ɵɵpipe(2, "async");
    i0.ɵɵpipe(3, "async");
    i0.ɵɵlistener("click", function NavItemLiComponent_ng_template_1_a_6_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.handleContentClicked(false)); });
    i0.ɵɵtemplate(4, NavItemLiComponent_ng_template_1_a_6_ng_container_4_Template, 1, 0, "ng-container", 9);
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const fromTooltip_r2 = i0.ɵɵnextContext().$implicit;
    const ctx_r2 = i0.ɵɵnextContext();
    const navItem_r5 = i0.ɵɵreference(4);
    i0.ɵɵclassProp("isActive", i0.ɵɵpipeBind1(1, 8, ctx_r2.isActive$))("isLeaf", i0.ɵɵpipeBind1(2, 10, ctx_r2.depth$) === 1);
    i0.ɵɵproperty("href", ctx_r2.item.href, i0.ɵɵsanitizeUrl);
    i0.ɵɵattribute("data-set-depth", i0.ɵɵpipeBind1(3, 12, ctx_r2.depth$));
    i0.ɵɵadvance(4);
    i0.ɵɵproperty("ngTemplateOutlet", navItem_r5)("ngTemplateOutletContext", i0.ɵɵpureFunction1(14, _c1, fromTooltip_r2));
} }
function NavItemLiComponent_ng_template_1_div_7_ng_container_5_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementContainer(0);
} }
function NavItemLiComponent_ng_template_1_div_7_Template(rf, ctx) { if (rf & 1) {
    const _r7 = i0.ɵɵgetCurrentView();
    i0.ɵɵelementStart(0, "div", 11);
    i0.ɵɵpipe(1, "async");
    i0.ɵɵpipe(2, "async");
    i0.ɵɵpipe(3, "async");
    i0.ɵɵpipe(4, "async");
    i0.ɵɵlistener("click", function NavItemLiComponent_ng_template_1_div_7_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.handleContentClicked(false)); });
    i0.ɵɵtemplate(5, NavItemLiComponent_ng_template_1_div_7_ng_container_5_Template, 1, 0, "ng-container", 9);
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const fromTooltip_r2 = i0.ɵɵnextContext().$implicit;
    const ctx_r2 = i0.ɵɵnextContext();
    const navItem_r5 = i0.ɵɵreference(4);
    i0.ɵɵclassProp("isActive", i0.ɵɵpipeBind1(1, 11, ctx_r2.isActive$))("isExpanded", i0.ɵɵpipeBind1(2, 13, ctx_r2.isExpanded$))("hasSubItem", ctx_r2.hasSubItem)("isLeaf", i0.ɵɵpipeBind1(3, 15, ctx_r2.depth$) === 1);
    i0.ɵɵattribute("data-set-depth", i0.ɵɵpipeBind1(4, 17, ctx_r2.depth$));
    i0.ɵɵadvance(5);
    i0.ɵɵproperty("ngTemplateOutlet", navItem_r5)("ngTemplateOutletContext", i0.ɵɵpureFunction1(19, _c1, fromTooltip_r2));
} }
function NavItemLiComponent_ng_template_1_div_8_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "div", 12);
    i0.ɵɵelement(1, "acl-nav-item-ul", 13);
    i0.ɵɵpipe(2, "async");
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const ctx_r2 = i0.ɵɵnextContext(2);
    i0.ɵɵadvance();
    i0.ɵɵproperty("hidden", !i0.ɵɵpipeBind1(2, 2, ctx_r2.isExpanded$))("items", ctx_r2.item.children);
} }
function NavItemLiComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {
    const _r1 = i0.ɵɵgetCurrentView();
    i0.ɵɵelementStart(0, "div", 3);
    i0.ɵɵpipe(1, "async");
    i0.ɵɵpipe(2, "async");
    i0.ɵɵpipe(3, "async");
    i0.ɵɵpipe(4, "async");
    i0.ɵɵlistener("mouseenter", function NavItemLiComponent_ng_template_1_Template_div_mouseenter_0_listener($event) { const fromTooltip_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.handleIconAnim(true, $event, fromTooltip_r2)); })("mouseleave", function NavItemLiComponent_ng_template_1_Template_div_mouseleave_0_listener($event) { const fromTooltip_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.handleIconAnim(false, $event, fromTooltip_r2)); });
    i0.ɵɵtemplate(5, NavItemLiComponent_ng_template_1_a_5_Template, 5, 17, "a", 4)(6, NavItemLiComponent_ng_template_1_a_6_Template, 5, 16, "a", 5)(7, NavItemLiComponent_ng_template_1_div_7_Template, 6, 21, "div", 6)(8, NavItemLiComponent_ng_template_1_div_8_Template, 3, 4, "div", 7);
    i0.ɵɵpipe(9, "async");
    i0.ɵɵpipe(10, "async");
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const fromTooltip_r2 = ctx.$implicit;
    const ctx_r2 = i0.ɵɵnextContext();
    i0.ɵɵclassMap("acl-nav-item-li depth-" + i0.ɵɵpipeBind1(1, 16, ctx_r2.depth$));
    i0.ɵɵclassProp("isActive", i0.ɵɵpipeBind1(2, 18, ctx_r2.depth$) === 0 && i0.ɵɵpipeBind1(3, 20, ctx_r2.isActive$))("isExpanded", i0.ɵɵpipeBind1(4, 22, ctx_r2.isExpanded$))("hasDivider", ctx_r2.item.divider)("hasSubItem", ctx_r2.hasSubItem)("isFocused", ctx_r2.snapshot.isFocused);
    i0.ɵɵadvance(5);
    i0.ɵɵproperty("ngIf", ctx_r2.item.routerLink);
    i0.ɵɵadvance();
    i0.ɵɵproperty("ngIf", ctx_r2.item.href && !ctx_r2.item.routerLink);
    i0.ɵɵadvance();
    i0.ɵɵproperty("ngIf", !ctx_r2.item.href);
    i0.ɵɵadvance();
    i0.ɵɵproperty("ngIf", ctx_r2.hasSubItem && (!i0.ɵɵpipeBind1(9, 24, ctx_r2.navMenu.isCollapse$) || fromTooltip_r2 || i0.ɵɵpipeBind1(10, 26, ctx_r2.depth$) !== 0));
} }
function NavItemLiComponent_ng_template_3_ng_container_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
    const _r8 = i0.ɵɵgetCurrentView();
    i0.ɵɵelementStart(0, "acl-nav-lottie-icon", 19);
    i0.ɵɵlistener("aniInit", function NavItemLiComponent_ng_template_3_ng_container_1_Conditional_1_Template_acl_nav_lottie_icon_aniInit_0_listener($event) { i0.ɵɵrestoreView(_r8); const fromTooltip_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.aniInit($event, fromTooltip_r9)); });
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const ctx_r2 = i0.ɵɵnextContext(3);
    i0.ɵɵproperty("animData", ctx_r2.animDataMap[ctx_r2.item.icon]);
} }
function NavItemLiComponent_ng_template_3_ng_container_1_Conditional_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
    const _r10 = i0.ɵɵgetCurrentView();
    i0.ɵɵelementStart(0, "acl-nav-lottie-icon", 19);
    i0.ɵɵlistener("aniInit", function NavItemLiComponent_ng_template_3_ng_container_1_Conditional_2_Conditional_0_Template_acl_nav_lottie_icon_aniInit_0_listener($event) { i0.ɵɵrestoreView(_r10); const fromTooltip_r9 = i0.ɵɵnextContext(3).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.aniInit($event, fromTooltip_r9)); });
    i0.ɵɵelementEnd();
} if (rf & 2) {
    i0.ɵɵproperty("animData", ctx());
} }
function NavItemLiComponent_ng_template_3_ng_container_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵtemplate(0, NavItemLiComponent_ng_template_3_ng_container_1_Conditional_2_Conditional_0_Template, 1, 1, "acl-nav-lottie-icon", 17);
    i0.ɵɵpipe(1, "pure");
} if (rf & 2) {
    let tmp_6_0;
    const ctx_r2 = i0.ɵɵnextContext(3);
    i0.ɵɵconditional((tmp_6_0 = i0.ɵɵpipeBind2(1, 1, ctx_r2.item.iconLottieJson, ctx_r2.loadLottieJson)) ? 0 : -1, tmp_6_0);
} }
function NavItemLiComponent_ng_template_3_ng_container_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "div", 18);
    i0.ɵɵelement(1, "img", 20);
    i0.ɵɵpipe(2, "aclSanitize");
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const ctx_r2 = i0.ɵɵnextContext(3);
    i0.ɵɵadvance();
    i0.ɵɵproperty("src", i0.ɵɵpipeBind2(2, 1, ctx_r2.item.iconImgSrc, "url"), i0.ɵɵsanitizeUrl);
} }
function NavItemLiComponent_ng_template_3_ng_container_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "div", 18);
    i0.ɵɵelement(1, "img", 20);
    i0.ɵɵpipe(2, "aclImageHeader");
    i0.ɵɵpipe(3, "aclSanitize");
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const ctx_r2 = i0.ɵɵnextContext(3);
    i0.ɵɵadvance();
    i0.ɵɵproperty("src", i0.ɵɵpipeBind2(3, 3, i0.ɵɵpipeBind1(2, 1, ctx_r2.item.iconImgData || ctx_r2.item.iconData), "url"), i0.ɵɵsanitizeUrl);
} }
function NavItemLiComponent_ng_template_3_ng_container_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "div", 18);
    i0.ɵɵelement(1, "aui-icon", 21);
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const ctx_r2 = i0.ɵɵnextContext(3);
    i0.ɵɵadvance();
    i0.ɵɵproperty("icon", ctx_r2.item.iconStatic);
} }
function NavItemLiComponent_ng_template_3_ng_container_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
    const _r11 = i0.ɵɵgetCurrentView();
    i0.ɵɵelementStart(0, "acl-nav-lottie-icon", 19);
    i0.ɵɵlistener("aniInit", function NavItemLiComponent_ng_template_3_ng_container_1_Conditional_6_Template_acl_nav_lottie_icon_aniInit_0_listener($event) { i0.ɵɵrestoreView(_r11); const fromTooltip_r9 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.aniInit($event, fromTooltip_r9)); });
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const ctx_r2 = i0.ɵɵnextContext(3);
    i0.ɵɵproperty("animData", ctx_r2.animDataMap.product);
} }
function NavItemLiComponent_ng_template_3_ng_container_1_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementContainerStart(0);
    i0.ɵɵtemplate(1, NavItemLiComponent_ng_template_3_ng_container_1_Conditional_1_Template, 1, 1, "acl-nav-lottie-icon", 17)(2, NavItemLiComponent_ng_template_3_ng_container_1_Conditional_2_Template, 2, 4)(3, NavItemLiComponent_ng_template_3_ng_container_1_Conditional_3_Template, 3, 4, "div", 18)(4, NavItemLiComponent_ng_template_3_ng_container_1_Conditional_4_Template, 4, 6, "div", 18)(5, NavItemLiComponent_ng_template_3_ng_container_1_Conditional_5_Template, 2, 1, "div", 18)(6, NavItemLiComponent_ng_template_3_ng_container_1_Conditional_6_Template, 1, 1, "acl-nav-lottie-icon", 17);
    i0.ɵɵelementContainerEnd();
} if (rf & 2) {
    const ctx_r2 = i0.ɵɵnextContext(2);
    i0.ɵɵadvance();
    i0.ɵɵconditional(ctx_r2.item.icon && ctx_r2.animDataMap[ctx_r2.item.icon] ? 1 : ctx_r2.item.iconLottieJson ? 2 : ctx_r2.item.iconImgSrc ? 3 : ctx_r2.item.iconImgData || ctx_r2.item.iconData ? 4 : ctx_r2.item.iconStatic ? 5 : 6);
} }
function NavItemLiComponent_ng_template_3_ng_container_5_aui_icon_1_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelement(0, "aui-icon", 24);
} }
function NavItemLiComponent_ng_template_3_ng_container_5_aui_icon_2_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelement(0, "aui-icon", 25);
} }
function NavItemLiComponent_ng_template_3_ng_container_5_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementContainerStart(0);
    i0.ɵɵtemplate(1, NavItemLiComponent_ng_template_3_ng_container_5_aui_icon_1_Template, 1, 0, "aui-icon", 22)(2, NavItemLiComponent_ng_template_3_ng_container_5_aui_icon_2_Template, 1, 0, "aui-icon", 23);
    i0.ɵɵpipe(3, "pure");
    i0.ɵɵelementContainerEnd();
} if (rf & 2) {
    const ctx_r2 = i0.ɵɵnextContext(2);
    i0.ɵɵadvance();
    i0.ɵɵproperty("ngIf", ctx_r2.hasSubItem);
    i0.ɵɵadvance();
    i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(3, 2, ctx_r2.item.href, ctx_r2.isExternal));
} }
function NavItemLiComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "div", 14);
    i0.ɵɵtemplate(1, NavItemLiComponent_ng_template_3_ng_container_1_Template, 7, 1, "ng-container", 15);
    i0.ɵɵpipe(2, "async");
    i0.ɵɵelementStart(3, "div", 16);
    i0.ɵɵtext(4);
    i0.ɵɵelementEnd()();
    i0.ɵɵtemplate(5, NavItemLiComponent_ng_template_3_ng_container_5_Template, 4, 5, "ng-container", 15);
    i0.ɵɵpipe(6, "async");
    i0.ɵɵpipe(7, "async");
} if (rf & 2) {
    const ctx_r2 = i0.ɵɵnextContext();
    i0.ɵɵadvance();
    i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(2, 3, ctx_r2.depth$) === 0);
    i0.ɵɵadvance(3);
    i0.ɵɵtextInterpolate1(" ", ctx_r2.item.label, " ");
    i0.ɵɵadvance();
    i0.ɵɵproperty("ngIf", !i0.ɵɵpipeBind1(6, 5, ctx_r2.navMenu.isCollapse$) || i0.ɵɵpipeBind1(7, 7, ctx_r2.depth$) !== 0);
} }
let disposeCurrentOverlay = noop;
export class NavItemLiComponent {
    get item() {
        return this._item;
    }
    set item(val) {
        this._item = val;
        this.item$$.next(val);
    }
    get hasSubItem() {
        return !!this.item.children?.length;
    }
    constructor(navMenu, cdr, overlay, viewContainerRef, renderer) {
        this.navMenu = navMenu;
        this.cdr = cdr;
        this.overlay = overlay;
        this.viewContainerRef = viewContainerRef;
        this.renderer = renderer;
        this.item$$ = new ReplaySubject(1);
        this.paths = [];
        this.listeners = [];
        this.destroy$$ = new Subject();
        this.depth$ = this.navMenu.paths$.pipe(map(paths => {
            const path = paths.find(path => [...path].pop() === this.item.key);
            return path?.indexOf(this.item.key);
        }), tap(depth => (this.depth = depth)), publishRef());
        this.isActive$ = combineLatest([this.navMenu.activeKeys$, this.item$$]).pipe(map(([activeKeys, item]) => activeKeys?.includes(item.key)), tap(isActive => {
            this.snapshot.isActive = isActive;
            if (isActive && this.depth === 0) {
                this.navMenu.focusedRootKeyChange(this.item.key);
            }
        }), publishRef());
        this.isExpanded$ = combineLatest([this.navMenu.expandedKeys$, this.item$$]).pipe(map(([expandedKeys, item]) => item.children?.length && expandedKeys?.includes(item.key)), tap(isExpanded => {
            this.snapshot.isExpanded = isExpanded;
        }), publishRef());
        this.isFocusedRoot$ = combineLatest([
            this.item$$,
            this.navMenu.focusedRootKey$,
        ]).pipe(map(([item, activeRootKey]) => item.key === activeRootKey), publishRef());
        this.snapshot = {
            isActive: false,
            isExpanded: false,
            isFocused: false,
        };
        this.animDataMap = animDataMap;
    }
    ngOnInit() {
        this.navMenu.paths$.subscribe(paths => (this.paths = paths));
        combineLatest([this.isActive$, this.isFocusedRoot$]).subscribe(([isActive, isFocused]) => {
            if (!isActive && !isFocused) {
                this.snapshot.isFocused = false;
                this.resetIconAnim();
            }
            else if (this.iconAnim) {
                this.snapshot.isFocused = true;
                this.playIcon();
            }
            this.cdr.markForCheck();
        });
    }
    playIcon() {
        if (this.navMenu.disableAniIcon) {
            this.iconAnim.goToAndStop(this.iconAnim.totalFrames - 1, true);
        }
        else {
            this.iconAnim.play();
        }
    }
    isExternal(url) {
        return /^https?:\/\//.test(url);
    }
    // forceExpand 当折叠侧边栏时悬浮总是展开
    handleContentClicked(forceExpand) {
        if (forceExpand) {
            this.snapshot.isExpanded = false;
        }
        else if (this.navMenu.isCollapse && this.overlayTriggerHovered) {
            return;
        }
        if (this.hasSubItem) {
            this.navMenu.expandedKeyChanged(this.snapshot.isExpanded
                ? this.findParentKey(this.item.key)
                : this.item.key);
        }
        else {
            disposeCurrentOverlay();
        }
    }
    openTooltip(event) {
        if (this.overlayIns) {
            return;
        }
        disposeCurrentOverlay();
        const positionStrategy = this.overlay
            .position()
            .flexibleConnectedTo(event.target)
            .withPositions([
            {
                originX: 'end',
                originY: 'top',
                overlayX: 'start',
                overlayY: 'top',
                offsetX: 0,
                offsetY: -6,
            },
        ])
            .withViewportMargin(4);
        this.overlayIns = this.overlay.create({
            positionStrategy,
            panelClass: 'nav-menu-overlay-pane',
        });
        this.bindOverlayHover();
        this.overlayIns.attach(new TemplatePortal(this.main, this.viewContainerRef, { $implicit: true }));
        disposeCurrentOverlay = () => {
            this.disposeOverlay();
        };
        this.auiTooltipShowHandle();
    }
    bindOverlayHover() {
        const { overlayElement } = this.overlayIns;
        const handle = (hover) => {
            this.overlayHovered = hover;
            if (!hover) {
                this.disposeWithDelayCheck();
            }
        };
        this.clearListeners();
        this.listeners.push(
        // TODO 应该用 fromEvent 数据流的形式,保持风格一致,不过这里很快会被aui的tooltip替换
        this.renderer.listen(overlayElement, 'mouseenter', () => handle(true)), this.renderer.listen(overlayElement, 'mouseleave', () => handle(false)));
    }
    clearListeners() {
        this.listeners.forEach(unListen => {
            unListen();
        });
        this.listeners = [];
    }
    disposeOverlay() {
        if (!this.overlayIns) {
            return;
        }
        this.clearListeners();
        this.navMenu.focusedRootKeyChange(null);
        this.overlayIns?.dispose();
        this.overlayIns = null;
    }
    handleIconAnim(hover, $event, fromTooltip) {
        if (this.depth === 0) {
            if (this.navMenu.isCollapse && !fromTooltip) {
                this.overlayTriggerHovered = hover;
                if (hover) {
                    this.openTooltip($event);
                }
                else {
                    this.disposeWithDelayCheck();
                }
            }
            if (hover) {
                this.navMenu.focusedRootKeyChange(this.item.key);
            }
            else if (!this.navMenu.isCollapse) {
                this.navMenu.focusedRootKeyChange(null);
            }
        }
    }
    async disposeWithDelayCheck() {
        await sleep(150);
        if (!this.overlayHovered && !this.overlayTriggerHovered) {
            this.disposeOverlay();
        }
    }
    findParentKey(key) {
        const path = this.paths.find(path => new Set(path).has(key));
        return path.slice(0, path.indexOf(key)).pop();
    }
    ngOnDestroy() {
        this.destroy$$.next();
        this.destroy$$.complete();
    }
    aniInit(ins, fromTooltip) {
        if (fromTooltip) {
            ins.goToAndStop(ins.totalFrames - 1, true);
            return;
        }
        this.iconAnim = ins;
        if (this.snapshot.isActive || this.snapshot.isFocused) {
            this.playIcon();
        }
    }
    loadLottieJson(icon) {
        const data = signal(null);
        fetch(icon)
            .then(res => res.json())
            .then(json => {
            data.set(json);
        });
        return data;
    }
    resetIconAnim() {
        if (this.iconAnim) {
            this.iconAnim.goToAndStop(0);
        }
    }
    async auiTooltipShowHandle() {
        const overlayIns = this.overlayIns;
        if (overlayIns) {
            this.hasSubItem && this.handleContentClicked(true);
        }
        await sleep();
        if (overlayIns) {
            const { overlayElement } = overlayIns;
            const hasExactPosition = 
            // @ts-ignore
            overlayIns._positionStrategy._hasExactPosition();
            if (hasExactPosition && overlayElement) {
                // 如果弹出菜单因空间原因不能满足准确对齐,则不会设置固定的宽高,那如果再有展开菜单将不能滚动查看
                overlayElement.style.maxHeight =
                    overlayElement.getBoundingClientRect().height + 'px';
            }
        }
    }
    static { this.ɵfac = function NavItemLiComponent_Factory(t) { return new (t || NavItemLiComponent)(i0.ɵɵdirectiveInject(i1.NavMenuComponent), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.Overlay), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(i0.Renderer2)); }; }
    static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NavItemLiComponent, selectors: [["acl-nav-item-li"]], viewQuery: function NavItemLiComponent_Query(rf, ctx) { if (rf & 1) {
            i0.ɵɵviewQuery(_c0, 5);
        } if (rf & 2) {
            let _t;
            i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.main = _t.first);
        } }, inputs: { item: "item" }, decls: 5, vars: 1, consts: [["main", ""], ["navItem", ""], [4, "ngTemplateOutlet"], [3, "mouseenter", "mouseleave"], ["class", "acl-nav-item-li__content", 3, "isActive", "isLeaf", "routerLink", "queryParams", "click", 4, "ngIf"], ["class", "acl-nav-item-li__content", "target", "_blank", 3, "isActive", "isLeaf", "href", "click", 4, "ngIf"], ["class", "acl-nav-item-li__content no-link", 3, "isActive", "isExpanded", "hasSubItem", "isLeaf", "click", 4, "ngIf"], ["class", "acl-nav-item-li__sub-items", 4, "ngIf"], [1, "acl-nav-item-li__content", 3, "click", "routerLink", "queryParams"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], ["target", "_blank", 1, "acl-nav-item-li__content", 3, "click", "href"], [1, "acl-nav-item-li__content", "no-link", 3, "click"], [1, "acl-nav-item-li__sub-items"], [3, "hidden", "items"], [1, "acl-nav-item"], [4, "ngIf"], [1, "acl-nav-item__content"], [1, "acl-nav-item__icon", 3, "animData"], [1, "acl-nav-item__icon"], [1, "acl-nav-item__icon", 3, "aniInit", "animData"], [3, "src"], [3, "icon"], ["class", "acl-nav-item-li__expansion-indicator", "icon", "angle_right", 4, "ngIf"], ["class", "acl-nav-item-li__expansion-indicator", "icon", "jump", 4, "ngIf"], ["icon", "angle_right", 1, "acl-nav-item-li__expansion-indicator"], ["icon", "jump", 1, "acl-nav-item-li__expansion-indicator"]], template: function NavItemLiComponent_Template(rf, ctx) { if (rf & 1) {
            i0.ɵɵtemplate(0, NavItemLiComponent_ng_container_0_Template, 1, 0, "ng-container", 2)(1, NavItemLiComponent_ng_template_1_Template, 11, 28, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(3, NavItemLiComponent_ng_template_3_Template, 8, 9, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
        } if (rf & 2) {
            const main_r12 = i0.ɵɵreference(2);
            i0.ɵɵproperty("ngTemplateOutlet", main_r12);
        } }, dependencies: [i3.NgIf, i3.NgTemplateOutlet, i4.IconComponent, i5.E2eAttributeBindingDirective, i6.RouterLink, i7.NavLottieIconDirective, i8.NavItemUlComponent, i3.AsyncPipe, i9.ImgHeaderPipe, i10.SanitizePipe, i11.PurePipe], styles: [".acl-nav-item-li{position:relative}.acl-nav-item-li:hover>.acl-nav-item-li__content,.acl-nav-item-li.isFocused>.acl-nav-item-li__content{color:var(--acl-nav-active-text-color)}.acl-nav-item-li__content{padding:6px var(--aui-spacing-xxl);display:flex;justify-content:space-between;position:relative;cursor:pointer;border-radius:var(--aui-border-radius-m);color:rgb(var(--aui-color-n-3));align-items:center}.acl-nav-item-li__content:link,.acl-nav-item-li__content:visited{color:rgb(var(--aui-color-n-3))}.acl-nav-item-li__content:hover,.acl-nav-item-li__content:active,.acl-nav-item-li__content:focus{text-decoration:none}.acl-nav-item-li__content:hover,.acl-nav-item-li__content.isActive{color:var(--acl-nav-active-text-color);background-color:var(--acl-nav-active-background-color)}.acl-nav-item-li__content.isActive.hasSubItem{background-color:transparent}.acl-nav-item-li__content[data-set-depth=\"0\"]{padding:10px var(--aui-spacing-xxl);font-weight:500}.acl-nav-item-li__content[data-set-depth=\"1\"]{padding-left:48px}.acl-nav-item-li__content[data-set-depth=\"2\"]{padding-left:64px}.acl-nav-item-li__expansion-indicator,.acl-nav-item-li__more{width:var(--aui-icon-size-m);height:var(--aui-icon-size-m);line-height:var(--aui-icon-size-m);font-size:var(--aui-icon-size-m);display:inline-flex}.acl-nav-item-li__content.isExpanded .acl-nav-item-li__expansion-indicator{transform:rotate(90deg)}.acl-nav-item{display:flex;align-items:center}.acl-nav-item__icon{margin-right:var(--aui-spacing-l);width:var(--aui-icon-size-m);height:var(--aui-icon-size-m);line-height:var(--aui-icon-size-m);font-size:var(--aui-icon-size-m);display:inline-flex;display:block}.acl-nav-item__content{line-height:20px;width:120px;font-size:var(--aui-font-size-m)}.acl-nav-leaf__title{font-size:var(--aui-font-size-l);color:rgb(var(--aui-color-n-2));padding-bottom:var(--aui-spacing-l);border-bottom:1px solid rgb(var(--aui-color-n-9));margin-bottom:6px;font-weight:500}.acl-nav-leaf .acl-nav-item-li__content{padding:6px var(--aui-spacing-xl)}.acl-nav-leaf .acl-nav-item{min-width:116px}\n"], encapsulation: 2, changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NavItemLiComponent, [{
        type: Component,
        args: [{ selector: 'acl-nav-item-li', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, template: "<ng-container *ngTemplateOutlet=\"main\"></ng-container>\n\n<ng-template\n  #main\n  let-fromTooltip\n>\n  <div\n    [class]=\"'acl-nav-item-li depth-' + (depth$ | async)\"\n    [class.isActive]=\"(depth$ | async) === 0 && (isActive$ | async)\"\n    [class.isExpanded]=\"isExpanded$ | async\"\n    [class.hasDivider]=\"item.divider\"\n    [class.hasSubItem]=\"hasSubItem\"\n    [class.isFocused]=\"snapshot.isFocused\"\n    (mouseenter)=\"handleIconAnim(true, $event, fromTooltip)\"\n    (mouseleave)=\"handleIconAnim(false, $event, fromTooltip)\"\n  >\n    <!-- routerLink \u548C href \u662F\u51B2\u7A81\u7684\uFF0C\u5E76\u4E14\u4EA7\u54C1\u5E0C\u671B\u53EF\u4EE5\u53F3\u952E\u6253\u5F00\u94FE\u63A5\uFF0C\u6240\u4EE5\u8FD9\u4E24\u4E2Aa\u6807\u7B7E\u662F\u5F88\u6709\u5FC5\u8981\u7684 -->\n    <a\n      *ngIf=\"item.routerLink\"\n      class=\"acl-nav-item-li__content\"\n      [class.isActive]=\"isActive$ | async\"\n      [class.isLeaf]=\"(depth$ | async) === 1\"\n      [attr.data-set-depth]=\"depth$ | async\"\n      (click)=\"handleContentClicked(false)\"\n      [routerLink]=\"item.routerLink\"\n      [queryParams]=\"item?.queryParams\"\n    >\n      <ng-container\n        *ngTemplateOutlet=\"navItem; context: { $implicit: fromTooltip }\"\n      ></ng-container>\n    </a>\n    <a\n      *ngIf=\"item.href && !item.routerLink\"\n      class=\"acl-nav-item-li__content\"\n      [class.isActive]=\"isActive$ | async\"\n      [class.isLeaf]=\"(depth$ | async) === 1\"\n      [attr.data-set-depth]=\"depth$ | async\"\n      (click)=\"handleContentClicked(false)\"\n      [href]=\"item.href\"\n      target=\"_blank\"\n    >\n      <ng-container\n        *ngTemplateOutlet=\"navItem; context: { $implicit: fromTooltip }\"\n      ></ng-container>\n    </a>\n    <div\n      class=\"acl-nav-item-li__content no-link\"\n      [class.isActive]=\"isActive$ | async\"\n      [class.isExpanded]=\"isExpanded$ | async\"\n      [class.hasSubItem]=\"hasSubItem\"\n      [class.isLeaf]=\"(depth$ | async) === 1\"\n      [attr.data-set-depth]=\"depth$ | async\"\n      (click)=\"handleContentClicked(false)\"\n      *ngIf=\"!item.href\"\n    >\n      <ng-container\n        *ngTemplateOutlet=\"navItem; context: { $implicit: fromTooltip }\"\n      ></ng-container>\n    </div>\n\n    <div\n      *ngIf=\"\n        hasSubItem &&\n        (!(navMenu.isCollapse$ | async) ||\n          fromTooltip ||\n          (depth$ | async) !== 0)\n      \"\n      class=\"acl-nav-item-li__sub-items\"\n    >\n      <acl-nav-item-ul\n        [hidden]=\"!(isExpanded$ | async)\"\n        [items]=\"item.children\"\n      ></acl-nav-item-ul>\n    </div>\n  </div>\n</ng-template>\n\n<ng-template\n  #navItem\n  let-fromTooltip\n>\n  <div class=\"acl-nav-item\">\n    <ng-container *ngIf=\"(depth$ | async) === 0\">\n      @if (item.icon && animDataMap[item.icon]) {\n        <acl-nav-lottie-icon\n          class=\"acl-nav-item__icon\"\n          [animData]=\"animDataMap[item.icon]\"\n          (aniInit)=\"aniInit($event, fromTooltip)\"\n        ></acl-nav-lottie-icon>\n      } @else if (item.iconLottieJson) {\n        @if (item.iconLottieJson | pure: loadLottieJson; as animData) {\n          <acl-nav-lottie-icon\n            class=\"acl-nav-item__icon\"\n            [animData]=\"animData()\"\n            (aniInit)=\"aniInit($event, fromTooltip)\"\n          ></acl-nav-lottie-icon>\n        }\n      } @else if (item.iconImgSrc) {\n        <div class=\"acl-nav-item__icon\">\n          <img [src]=\"item.iconImgSrc | aclSanitize: 'url'\" />\n        </div>\n      } @else if (item.iconImgData || item.iconData) {\n        <div class=\"acl-nav-item__icon\">\n          <img\n            [src]=\"\n              item.iconImgData || item.iconData\n                | aclImageHeader\n                | aclSanitize: 'url'\n            \"\n          />\n        </div>\n      } @else if (item.iconStatic) {\n        <div class=\"acl-nav-item__icon\">\n          <aui-icon [icon]=\"item.iconStatic\"></aui-icon>\n        </div>\n      } @else {\n        <acl-nav-lottie-icon\n          class=\"acl-nav-item__icon\"\n          [animData]=\"animDataMap.product\"\n          (aniInit)=\"aniInit($event, fromTooltip)\"\n        ></acl-nav-lottie-icon>\n      }\n    </ng-container>\n\n    <div class=\"acl-nav-item__content\">\n      {{ item.label }}\n    </div>\n  </div>\n  <ng-container\n    *ngIf=\"!(navMenu.isCollapse$ | async) || (depth$ | async) !== 0\"\n  >\n    <aui-icon\n      *ngIf=\"hasSubItem\"\n      class=\"acl-nav-item-li__expansion-indicator\"\n      icon=\"angle_right\"\n    ></aui-icon>\n    <aui-icon\n      *ngIf=\"item.href | pure: isExternal\"\n      class=\"acl-nav-item-li__expansion-indicator\"\n      icon=\"jump\"\n    ></aui-icon>\n  </ng-container>\n</ng-template>\n", styles: [".acl-nav-item-li{position:relative}.acl-nav-item-li:hover>.acl-nav-item-li__content,.acl-nav-item-li.isFocused>.acl-nav-item-li__content{color:var(--acl-nav-active-text-color)}.acl-nav-item-li__content{padding:6px var(--aui-spacing-xxl);display:flex;justify-content:space-between;position:relative;cursor:pointer;border-radius:var(--aui-border-radius-m);color:rgb(var(--aui-color-n-3));align-items:center}.acl-nav-item-li__content:link,.acl-nav-item-li__content:visited{color:rgb(var(--aui-color-n-3))}.acl-nav-item-li__content:hover,.acl-nav-item-li__content:active,.acl-nav-item-li__content:focus{text-decoration:none}.acl-nav-item-li__content:hover,.acl-nav-item-li__content.isActive{color:var(--acl-nav-active-text-color);background-color:var(--acl-nav-active-background-color)}.acl-nav-item-li__content.isActive.hasSubItem{background-color:transparent}.acl-nav-item-li__content[data-set-depth=\"0\"]{padding:10px var(--aui-spacing-xxl);font-weight:500}.acl-nav-item-li__content[data-set-depth=\"1\"]{padding-left:48px}.acl-nav-item-li__content[data-set-depth=\"2\"]{padding-left:64px}.acl-nav-item-li__expansion-indicator,.acl-nav-item-li__more{width:var(--aui-icon-size-m);height:var(--aui-icon-size-m);line-height:var(--aui-icon-size-m);font-size:var(--aui-icon-size-m);display:inline-flex}.acl-nav-item-li__content.isExpanded .acl-nav-item-li__expansion-indicator{transform:rotate(90deg)}.acl-nav-item{display:flex;align-items:center}.acl-nav-item__icon{margin-right:var(--aui-spacing-l);width:var(--aui-icon-size-m);height:var(--aui-icon-size-m);line-height:var(--aui-icon-size-m);font-size:var(--aui-icon-size-m);display:inline-flex;display:block}.acl-nav-item__content{line-height:20px;width:120px;font-size:var(--aui-font-size-m)}.acl-nav-leaf__title{font-size:var(--aui-font-size-l);color:rgb(var(--aui-color-n-2));padding-bottom:var(--aui-spacing-l);border-bottom:1px solid rgb(var(--aui-color-n-9));margin-bottom:6px;font-weight:500}.acl-nav-leaf .acl-nav-item-li__content{padding:6px var(--aui-spacing-xl)}.acl-nav-leaf .acl-nav-item{min-width:116px}\n"] }]
    }], () => [{ type: i1.NavMenuComponent }, { type: i0.ChangeDetectorRef }, { type: i2.Overlay }, { type: i0.ViewContainerRef }, { type: i0.Renderer2 }], { item: [{
            type: Input
        }], main: [{
            type: ViewChild,
            args: ['main']
        }] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(NavItemLiComponent, { className: "NavItemLiComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LWl0ZW0tbGkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3BhZ2Utc2NhZmZvbGQvbmF2aWdhdGlvbi9uYXYtbWVudS9uYXYtaXRlbS1saS9uYXYtaXRlbS1saS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvcGFnZS1zY2FmZm9sZC9uYXZpZ2F0aW9uL25hdi1tZW51L25hdi1pdGVtLWxpL25hdi1pdGVtLWxpLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULEtBQUssRUFHTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2RSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLFdBQVcsTUFBTSxtQ0FBbUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztJQ3JCekQsd0JBQXNEOzs7SUEyQmhELHdCQUVnQjs7OztJQVpsQiw0QkFTQzs7OztJQUhDLHNMQUFTLDRCQUFxQixLQUFLLENBQUMsS0FBQztJQUlyQyx1R0FFQztJQUNILGlCQUFJOzs7OztJ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QjtZQUNwQixhQUFhO1lBRWIsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbkQsSUFBSSxnQkFBZ0IsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDdkMsa0RBQWtEO2dCQUNsRCxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVM7b0JBQzVCLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO21GQTNSVSxrQkFBa0I7b0VBQWxCLGtCQUFrQjs7Ozs7O1lDMEMvQixBQTNFQSxBQUZBLHFGQUF1Qyx5R0FLdEMsdUdBMkVBOzs7WUFoRmMsMkNBQXNCOzs7aUZEbUN4QixrQkFBa0I7Y0FSOUIsU0FBUzsyQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSx1QkFDaEIsS0FBSzs4SkFZdEIsSUFBSTtrQkFEUCxLQUFLO1lBV04sSUFBSTtrQkFESCxTQUFTO21CQUFDLE1BQU07O2tGQW5CTixrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMixcbiAgc2lnbmFsLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbmltYXRpb25JdGVtIH0gZnJvbSAnbG90dGllLXdlYic7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBtYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBub29wLCBwdWJsaXNoUmVmLCBzbGVlcCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQgYW5pbURhdGFNYXAgZnJvbSAnLi4vLi4vbG90dGllLWljb25zL2FuaW1hdGlvbi1kYXRhJztcbmltcG9ydCB7IE5hdk1lbnVDb21wb25lbnQgfSBmcm9tICcuLi9uYXYtbWVudS5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBOYXZJdGVtQ29uZmlnIH0gZnJvbSAnLi8uLi9uYXYtbWVudS50eXBlcyc7XG5cbmxldCBkaXNwb3NlQ3VycmVudE92ZXJsYXk6ICgpID0+IHZvaWQgPSBub29wO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhY2wtbmF2LWl0ZW0tbGknLFxuICB0ZW1wbGF0ZVVybDogJy4vbmF2LWl0ZW0tbGkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uYXYtaXRlbS1saS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG59KVxuZXhwb3J0IGNsYXNzIE5hdkl0ZW1MaUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfaXRlbTogTmF2SXRlbUNvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBpdGVtJCQgPSBuZXcgUmVwbGF5U3ViamVjdDxOYXZJdGVtQ29uZmlnPigxKTtcbiAgcHJpdmF0ZSBwYXRoczogc3RyaW5nW11bXSA9IFtdO1xuICBwcml2YXRlIG92ZXJsYXlJbnM6IE92ZXJsYXlSZWY7IC8vIOeuoeeQhuW9k+WJjW92ZXJsYXlJbnNcbiAgb3ZlcmxheUhvdmVyZWQ6IGJvb2xlYW47XG4gIG92ZXJsYXlUcmlnZ2VySG92ZXJlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsaXN0ZW5lcnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgQElucHV0KClcbiAgZ2V0IGl0ZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW07XG4gIH1cblxuICBzZXQgaXRlbSh2YWwpIHtcbiAgICB0aGlzLl9pdGVtID0gdmFsO1xuICAgIHRoaXMuaXRlbSQkLm5leHQodmFsKTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ21haW4nKVxuICBtYWluOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIGRlcHRoOiBudW1iZXI7XG5cbiAgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBkZXB0aCQgPSB0aGlzLm5hdk1lbnUucGF0aHMkLnBpcGUoXG4gICAgbWFwKHBhdGhzID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBwYXRocy5maW5kKHBhdGggPT4gWy4uLnBhdGhdLnBvcCgpID09PSB0aGlzLml0ZW0ua2V5KTtcbiAgICAgIHJldHVybiBwYXRoPy5pbmRleE9mKHRoaXMuaXRlbS5rZXkpO1xuICAgIH0pLFxuICAgIHRhcChkZXB0aCA9PiAodGhpcy5kZXB0aCA9IGRlcHRoKSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGlzQWN0aXZlJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMubmF2TWVudS5hY3RpdmVLZXlzJCwgdGhpcy5pdGVtJCRdKS5waXBlKFxuICAgIG1hcCgoW2FjdGl2ZUtleXMsIGl0ZW1dKSA9PiBhY3RpdmVLZXlzPy5pbmNsdWRlcyhpdGVtLmtleSkpLFxuICAgIHRhcChpc0FjdGl2ZSA9PiB7XG4gICAgICB0aGlzLnNuYXBzaG90LmlzQWN0aXZlID0gaXNBY3RpdmU7XG4gICAgICBpZiAoaXNBY3RpdmUgJiYgdGhpcy5kZXB0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLm5hdk1lbnUuZm9jdXNlZFJvb3RLZXlDaGFuZ2UodGhpcy5pdGVtLmtleSk7XG4gICAgICB9XG4gICAgfSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGlzRXhwYW5kZWQkID0gY29tYmluZUxhdGVzdChbdGhpcy5uYXZNZW51LmV4cGFuZGVkS2V5cyQsIHRoaXMuaXRlbSQkXSkucGlwZShcbiAgICBtYXAoXG4gICAgICAoW2V4cGFuZGVkS2V5cywgaXRlbV0pID0+XG4gICAgICAgIGl0ZW0uY2hpbGRyZW4/Lmxlbmd0aCAmJiBleHBhbmRlZEtleXM/LmluY2x1ZGVzKGl0ZW0ua2V5KSxcbiAgICApLFxuICAgIHRhcChpc0V4cGFuZGVkID0+IHtcbiAgICAgIHRoaXMuc25hcHNob3QuaXNFeHBhbmRlZCA9IGlzRXhwYW5kZWQ7XG4gICAgfSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGlzRm9jdXNlZFJvb3QkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pdGVtJCQsXG4gICAgdGhpcy5uYXZNZW51LmZvY3VzZWRSb290S2V5JCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpdGVtLCBhY3RpdmVSb290S2V5XSkgPT4gaXRlbS5rZXkgPT09IGFjdGl2ZVJvb3RLZXkpLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgaXNFeHBhbmRlZDogZmFsc2UsXG4gICAgaXNGb2N1c2VkOiBmYWxzZSxcbiAgfTtcblxuICBpY29uQW5pbTogQW5pbWF0aW9uSXRlbTtcblxuICBhbmltRGF0YU1hcCA9IGFuaW1EYXRhTWFwO1xuXG4gIGdldCBoYXNTdWJJdGVtKCkge1xuICAgIHJldHVybiAhIXRoaXMuaXRlbS5jaGlsZHJlbj8ubGVuZ3RoO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgbmF2TWVudTogTmF2TWVudUNvbXBvbmVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvdmVybGF5OiBPdmVybGF5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm5hdk1lbnUucGF0aHMkLnN1YnNjcmliZShwYXRocyA9PiAodGhpcy5wYXRocyA9IHBhdGhzKSk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmlzQWN0aXZlJCwgdGhpcy5pc0ZvY3VzZWRSb290JF0pLnN1YnNjcmliZShcbiAgICAgIChbaXNBY3RpdmUsIGlzRm9jdXNlZF0pID0+IHtcbiAgICAgICAgaWYgKCFpc0FjdGl2ZSAmJiAhaXNGb2N1c2VkKSB7XG4gICAgICAgICAgdGhpcy5zbmFwc2hvdC5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlc2V0SWNvbkFuaW0oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmljb25BbmltKSB7XG4gICAgICAgICAgdGhpcy5zbmFwc2hvdC5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucGxheUljb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHBsYXlJY29uKCkge1xuICAgIGlmICh0aGlzLm5hdk1lbnUuZGlzYWJsZUFuaUljb24pIHtcbiAgICAgIHRoaXMuaWNvbkFuaW0uZ29Ub0FuZFN0b3AodGhpcy5pY29uQW5pbS50b3RhbEZyYW1lcyAtIDEsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmljb25BbmltLnBsYXkoKTtcbiAgICB9XG4gIH1cblxuICBpc0V4dGVybmFsKHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIC9eaHR0cHM/OlxcL1xcLy8udGVzdCh1cmwpO1xuICB9XG5cbiAgLy8gZm9yY2VFeHBhbmQg5b2T5oqY5Y+g5L6n6L655qCP5pe25oKs5rWu5oC75piv5bGV5byAXG4gIGhhbmRsZUNvbnRlbnRDbGlja2VkKGZvcmNlRXhwYW5kOiBib29sZWFuKSB7XG4gICAgaWYgKGZvcmNlRXhwYW5kKSB7XG4gICAgICB0aGlzLnNuYXBzaG90LmlzRXhwYW5kZWQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubmF2TWVudS5pc0NvbGxhcHNlICYmIHRoaXMub3ZlcmxheVRyaWdnZXJIb3ZlcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc1N1Ykl0ZW0pIHtcbiAgICAgIHRoaXMubmF2TWVudS5leHBhbmRlZEtleUNoYW5nZWQoXG4gICAgICAgIHRoaXMuc25hcHNob3QuaXNFeHBhbmRlZFxuICAgICAgICAgID8gdGhpcy5maW5kUGFyZW50S2V5KHRoaXMuaXRlbS5rZXkpXG4gICAgICAgICAgOiB0aGlzLml0ZW0ua2V5LFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzcG9zZUN1cnJlbnRPdmVybGF5KCk7XG4gICAgfVxuICB9XG5cbiAgb3BlblRvb2x0aXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5vdmVybGF5SW5zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRpc3Bvc2VDdXJyZW50T3ZlcmxheSgpO1xuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlcbiAgICAgIC5wb3NpdGlvbigpXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyhldmVudC50YXJnZXQgYXMgRWxlbWVudClcbiAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgICBvZmZzZXRYOiAwLFxuICAgICAgICAgIG9mZnNldFk6IC02LFxuICAgICAgICB9LFxuICAgICAgXSlcbiAgICAgIC53aXRoVmlld3BvcnRNYXJnaW4oNCk7XG4gICAgdGhpcy5vdmVybGF5SW5zID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgcGFuZWxDbGFzczogJ25hdi1tZW51LW92ZXJsYXktcGFuZScsXG4gICAgfSk7XG4gICAgdGhpcy5iaW5kT3ZlcmxheUhvdmVyKCk7XG4gICAgdGhpcy5vdmVybGF5SW5zLmF0dGFjaChcbiAgICAgIG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLm1haW4sIHRoaXMudmlld0NvbnRhaW5lclJlZiwgeyAkaW1wbGljaXQ6IHRydWUgfSksXG4gICAgKTtcbiAgICBkaXNwb3NlQ3VycmVudE92ZXJsYXkgPSAoKSA9PiB7XG4gICAgICB0aGlzLmRpc3Bvc2VPdmVybGF5KCk7XG4gICAgfTtcbiAgICB0aGlzLmF1aVRvb2x0aXBTaG93SGFuZGxlKCk7XG4gIH1cblxuICBiaW5kT3ZlcmxheUhvdmVyKCkge1xuICAgIGNvbnN0IHsgb3ZlcmxheUVsZW1lbnQgfSA9IHRoaXMub3ZlcmxheUlucztcbiAgICBjb25zdCBoYW5kbGUgPSAoaG92ZXI6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMub3ZlcmxheUhvdmVyZWQgPSBob3ZlcjtcbiAgICAgIGlmICghaG92ZXIpIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlV2l0aERlbGF5Q2hlY2soKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmxpc3RlbmVycy5wdXNoKFxuICAgICAgLy8gVE9ETyDlupTor6XnlKggZnJvbUV2ZW50IOaVsOaNrua1geeahOW9ouW8j++8jOS/neaMgemjjuagvOS4gOiHtO+8jOS4jei/h+i/memHjOW+iOW/q+S8muiiq2F1aeeahHRvb2x0aXDmm7/mjaJcbiAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKG92ZXJsYXlFbGVtZW50LCAnbW91c2VlbnRlcicsICgpID0+IGhhbmRsZSh0cnVlKSksXG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihvdmVybGF5RWxlbWVudCwgJ21vdXNlbGVhdmUnLCAoKSA9PiBoYW5kbGUoZmFsc2UpKSxcbiAgICApO1xuICB9XG5cbiAgY2xlYXJMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCh1bkxpc3RlbiA9PiB7XG4gICAgICB1bkxpc3RlbigpO1xuICAgIH0pO1xuICAgIHRoaXMubGlzdGVuZXJzID0gW107XG4gIH1cblxuICBkaXNwb3NlT3ZlcmxheSgpIHtcbiAgICBpZiAoIXRoaXMub3ZlcmxheUlucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5uYXZNZW51LmZvY3VzZWRSb290S2V5Q2hhbmdlKG51bGwpO1xuICAgIHRoaXMub3ZlcmxheUlucz8uZGlzcG9zZSgpO1xuICAgIHRoaXMub3ZlcmxheUlucyA9IG51bGw7XG4gIH1cblxuICBoYW5kbGVJY29uQW5pbShob3ZlcjogYm9vbGVhbiwgJGV2ZW50OiBNb3VzZUV2ZW50LCBmcm9tVG9vbHRpcDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmRlcHRoID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5uYXZNZW51LmlzQ29sbGFwc2UgJiYgIWZyb21Ub29sdGlwKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVRyaWdnZXJIb3ZlcmVkID0gaG92ZXI7XG4gICAgICAgIGlmIChob3Zlcikge1xuICAgICAgICAgIHRoaXMub3BlblRvb2x0aXAoJGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRpc3Bvc2VXaXRoRGVsYXlDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaG92ZXIpIHtcbiAgICAgICAgdGhpcy5uYXZNZW51LmZvY3VzZWRSb290S2V5Q2hhbmdlKHRoaXMuaXRlbS5rZXkpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5uYXZNZW51LmlzQ29sbGFwc2UpIHtcbiAgICAgICAgdGhpcy5uYXZNZW51LmZvY3VzZWRSb290S2V5Q2hhbmdlKG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRpc3Bvc2VXaXRoRGVsYXlDaGVjaygpIHtcbiAgICBhd2FpdCBzbGVlcCgxNTApO1xuICAgIGlmICghdGhpcy5vdmVybGF5SG92ZXJlZCAmJiAhdGhpcy5vdmVybGF5VHJpZ2dlckhvdmVyZWQpIHtcbiAgICAgIHRoaXMuZGlzcG9zZU92ZXJsYXkoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmRQYXJlbnRLZXkoa2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5wYXRocy5maW5kKHBhdGggPT4gbmV3IFNldChwYXRoKS5oYXMoa2V5KSk7XG4gICAgcmV0dXJuIHBhdGguc2xpY2UoMCwgcGF0aC5pbmRleE9mKGtleSkpLnBvcCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBhbmlJbml0KGluczogQW5pbWF0aW9uSXRlbSwgZnJvbVRvb2x0aXA6IGJvb2xlYW4pIHtcbiAgICBpZiAoZnJvbVRvb2x0aXApIHtcbiAgICAgIGlucy5nb1RvQW5kU3RvcChpbnMudG90YWxGcmFtZXMgLSAxLCB0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pY29uQW5pbSA9IGlucztcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5pc0FjdGl2ZSB8fCB0aGlzLnNuYXBzaG90LmlzRm9jdXNlZCkge1xuICAgICAgdGhpcy5wbGF5SWNvbigpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRMb3R0aWVKc29uKGljb246IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGEgPSBzaWduYWw8dW5rbm93bj4obnVsbCk7XG5cbiAgICBmZXRjaChpY29uKVxuICAgICAgLnRoZW4ocmVzID0+IHJlcy5qc29uKCkpXG4gICAgICAudGhlbihqc29uID0+IHtcbiAgICAgICAgZGF0YS5zZXQoanNvbik7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEljb25BbmltKCkge1xuICAgIGlmICh0aGlzLmljb25BbmltKSB7XG4gICAgICB0aGlzLmljb25BbmltLmdvVG9BbmRTdG9wKDApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGF1aVRvb2x0aXBTaG93SGFuZGxlKCkge1xuICAgIGNvbnN0IG92ZXJsYXlJbnMgPSB0aGlzLm92ZXJsYXlJbnM7XG4gICAgaWYgKG92ZXJsYXlJbnMpIHtcbiAgICAgIHRoaXMuaGFzU3ViSXRlbSAmJiB0aGlzLmhhbmRsZUNvbnRlbnRDbGlja2VkKHRydWUpO1xuICAgIH1cblxuICAgIGF3YWl0IHNsZWVwKCk7XG4gICAgaWYgKG92ZXJsYXlJbnMpIHtcbiAgICAgIGNvbnN0IHsgb3ZlcmxheUVsZW1lbnQgfSA9IG92ZXJsYXlJbnM7XG4gICAgICBjb25zdCBoYXNFeGFjdFBvc2l0aW9uID1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuXG4gICAgICAgIG92ZXJsYXlJbnMuX3Bvc2l0aW9uU3RyYXRlZ3kuX2hhc0V4YWN0UG9zaXRpb24oKTtcbiAgICAgIGlmIChoYXNFeGFjdFBvc2l0aW9uICYmIG92ZXJsYXlFbGVtZW50KSB7XG4gICAgICAgIC8vIOWmguaenOW8ueWHuuiPnOWNleWboOepuumXtOWOn+WboOS4jeiDvea7oei2s+WHhuehruWvuem9kO+8jOWImeS4jeS8muiuvue9ruWbuuWumueahOWuvemrmO+8jOmCo+WmguaenOWGjeacieWxleW8gOiPnOWNleWwhuS4jeiDvea7muWKqOafpeeci1xuICAgICAgICBvdmVybGF5RWxlbWVudC5zdHlsZS5tYXhIZWlnaHQgPVxuICAgICAgICAgIG92ZXJsYXlFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCArICdweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWFpblwiPjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGVcbiAgI21haW5cbiAgbGV0LWZyb21Ub29sdGlwXG4+XG4gIDxkaXZcbiAgICBbY2xhc3NdPVwiJ2FjbC1uYXYtaXRlbS1saSBkZXB0aC0nICsgKGRlcHRoJCB8IGFzeW5jKVwiXG4gICAgW2NsYXNzLmlzQWN0aXZlXT1cIihkZXB0aCQgfCBhc3luYykgPT09IDAgJiYgKGlzQWN0aXZlJCB8IGFzeW5jKVwiXG4gICAgW2NsYXNzLmlzRXhwYW5kZWRdPVwiaXNFeHBhbmRlZCQgfCBhc3luY1wiXG4gICAgW2NsYXNzLmhhc0RpdmlkZXJdPVwiaXRlbS5kaXZpZGVyXCJcbiAgICBbY2xhc3MuaGFzU3ViSXRlbV09XCJoYXNTdWJJdGVtXCJcbiAgICBbY2xhc3MuaXNGb2N1c2VkXT1cInNuYXBzaG90LmlzRm9jdXNlZFwiXG4gICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlSWNvbkFuaW0odHJ1ZSwgJGV2ZW50LCBmcm9tVG9vbHRpcClcIlxuICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZUljb25BbmltKGZhbHNlLCAkZXZlbnQsIGZyb21Ub29sdGlwKVwiXG4gID5cbiAgICA8IS0tIHJvdXRlckxpbmsg5ZKMIGhyZWYg5piv5Yay56qB55qE77yM5bm25LiU5Lqn5ZOB5biM5pyb5Y+v5Lul5Y+z6ZSu5omT5byA6ZO+5o6l77yM5omA5Lul6L+Z5Lik5LiqYeagh+etvuaYr+W+iOacieW/heimgeeahCAtLT5cbiAgICA8YVxuICAgICAgKm5nSWY9XCJpdGVtLnJvdXRlckxpbmtcIlxuICAgICAgY2xhc3M9XCJhY2wtbmF2LWl0ZW0tbGlfX2NvbnRlbnRcIlxuICAgICAgW2NsYXNzLmlzQWN0aXZlXT1cImlzQWN0aXZlJCB8IGFzeW5jXCJcbiAgICAgIFtjbGFzcy5pc0xlYWZdPVwiKGRlcHRoJCB8IGFzeW5jKSA9PT0gMVwiXG4gICAgICBbYXR0ci5kYXRhLXNldC1kZXB0aF09XCJkZXB0aCQgfCBhc3luY1wiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlQ29udGVudENsaWNrZWQoZmFsc2UpXCJcbiAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVyTGlua1wiXG4gICAgICBbcXVlcnlQYXJhbXNdPVwiaXRlbT8ucXVlcnlQYXJhbXNcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJuYXZJdGVtOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZnJvbVRvb2x0aXAgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9hPlxuICAgIDxhXG4gICAgICAqbmdJZj1cIml0ZW0uaHJlZiAmJiAhaXRlbS5yb3V0ZXJMaW5rXCJcbiAgICAgIGNsYXNzPVwiYWNsLW5hdi1pdGVtLWxpX19jb250ZW50XCJcbiAgICAgIFtjbGFzcy5pc0FjdGl2ZV09XCJpc0FjdGl2ZSQgfCBhc3luY1wiXG4gICAgICBbY2xhc3MuaXNMZWFmXT1cIihkZXB0aCQgfCBhc3luYykgPT09IDFcIlxuICAgICAgW2F0dHIuZGF0YS1zZXQtZGVwdGhdPVwiZGVwdGgkIHwgYXN5bmNcIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZUNvbnRlbnRDbGlja2VkKGZhbHNlKVwiXG4gICAgICBbaHJlZl09XCJpdGVtLmhyZWZcIlxuICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwibmF2SXRlbTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGZyb21Ub29sdGlwIH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvYT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImFjbC1uYXYtaXRlbS1saV9fY29udGVudCBuby1saW5rXCJcbiAgICAgIFtjbGFzcy5pc0FjdGl2ZV09XCJpc0FjdGl2ZSQgfCBhc3luY1wiXG4gICAgICBbY2xhc3MuaXNFeHBhbmRlZF09XCJpc0V4cGFuZGVkJCB8IGFzeW5jXCJcbiAgICAgIFtjbGFzcy5oYXNTdWJJdGVtXT1cImhhc1N1Ykl0ZW1cIlxuICAgICAgW2NsYXNzLmlzTGVhZl09XCIoZGVwdGgkIHwgYXN5bmMpID09PSAxXCJcbiAgICAgIFthdHRyLmRhdGEtc2V0LWRlcHRoXT1cImRlcHRoJCB8IGFzeW5jXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVDb250ZW50Q2xpY2tlZChmYWxzZSlcIlxuICAgICAgKm5nSWY9XCIhaXRlbS5ocmVmXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwibmF2SXRlbTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGZyb21Ub29sdGlwIH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgaGFzU3ViSXRlbSAmJlxuICAgICAgICAoIShuYXZNZW51LmlzQ29sbGFwc2UkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgZnJvbVRvb2x0aXAgfHxcbiAgICAgICAgICAoZGVwdGgkIHwgYXN5bmMpICE9PSAwKVxuICAgICAgXCJcbiAgICAgIGNsYXNzPVwiYWNsLW5hdi1pdGVtLWxpX19zdWItaXRlbXNcIlxuICAgID5cbiAgICAgIDxhY2wtbmF2LWl0ZW0tdWxcbiAgICAgICAgW2hpZGRlbl09XCIhKGlzRXhwYW5kZWQkIHwgYXN5bmMpXCJcbiAgICAgICAgW2l0ZW1zXT1cIml0ZW0uY2hpbGRyZW5cIlxuICAgICAgPjwvYWNsLW5hdi1pdGVtLXVsPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjbmF2SXRlbVxuICBsZXQtZnJvbVRvb2x0aXBcbj5cbiAgPGRpdiBjbGFzcz1cImFjbC1uYXYtaXRlbVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoZGVwdGgkIHwgYXN5bmMpID09PSAwXCI+XG4gICAgICBAaWYgKGl0ZW0uaWNvbiAmJiBhbmltRGF0YU1hcFtpdGVtLmljb25dKSB7XG4gICAgICAgIDxhY2wtbmF2LWxvdHRpZS1pY29uXG4gICAgICAgICAgY2xhc3M9XCJhY2wtbmF2LWl0ZW1fX2ljb25cIlxuICAgICAgICAgIFthbmltRGF0YV09XCJhbmltRGF0YU1hcFtpdGVtLmljb25dXCJcbiAgICAgICAgICAoYW5pSW5pdCk9XCJhbmlJbml0KCRldmVudCwgZnJvbVRvb2x0aXApXCJcbiAgICAgICAgPjwvYWNsLW5hdi1sb3R0aWUtaWNvbj5cbiAgICAgIH0gQGVsc2UgaWYgKGl0ZW0uaWNvbkxvdHRpZUpzb24pIHtcbiAgICAgICAgQGlmIChpdGVtLmljb25Mb3R0aWVKc29uIHwgcHVyZTogbG9hZExvdHRpZUpzb247IGFzIGFuaW1EYXRhKSB7XG4gICAgICAgICAgPGFjbC1uYXYtbG90dGllLWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiYWNsLW5hdi1pdGVtX19pY29uXCJcbiAgICAgICAgICAgIFthbmltRGF0YV09XCJhbmltRGF0YSgpXCJcbiAgICAgICAgICAgIChhbmlJbml0KT1cImFuaUluaXQoJGV2ZW50LCBmcm9tVG9vbHRpcClcIlxuICAgICAgICAgID48L2FjbC1uYXYtbG90dGllLWljb24+XG4gICAgICAgIH1cbiAgICAgIH0gQGVsc2UgaWYgKGl0ZW0uaWNvbkltZ1NyYykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiYWNsLW5hdi1pdGVtX19pY29uXCI+XG4gICAgICAgICAgPGltZyBbc3JjXT1cIml0ZW0uaWNvbkltZ1NyYyB8IGFjbFNhbml0aXplOiAndXJsJ1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAoaXRlbS5pY29uSW1nRGF0YSB8fCBpdGVtLmljb25EYXRhKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY2wtbmF2LWl0ZW1fX2ljb25cIj5cbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICBbc3JjXT1cIlxuICAgICAgICAgICAgICBpdGVtLmljb25JbWdEYXRhIHx8IGl0ZW0uaWNvbkRhdGFcbiAgICAgICAgICAgICAgICB8IGFjbEltYWdlSGVhZGVyXG4gICAgICAgICAgICAgICAgfCBhY2xTYW5pdGl6ZTogJ3VybCdcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIGlmIChpdGVtLmljb25TdGF0aWMpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImFjbC1uYXYtaXRlbV9faWNvblwiPlxuICAgICAgICAgIDxhdWktaWNvbiBbaWNvbl09XCJpdGVtLmljb25TdGF0aWNcIj48L2F1aS1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8YWNsLW5hdi1sb3R0aWUtaWNvblxuICAgICAgICAgIGNsYXNzPVwiYWNsLW5hdi1pdGVtX19pY29uXCJcbiAgICAgICAgICBbYW5pbURhdGFdPVwiYW5pbURhdGFNYXAucHJvZHVjdFwiXG4gICAgICAgICAgKGFuaUluaXQpPVwiYW5pSW5pdCgkZXZlbnQsIGZyb21Ub29sdGlwKVwiXG4gICAgICAgID48L2FjbC1uYXYtbG90dGllLWljb24+XG4gICAgICB9XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWNsLW5hdi1pdGVtX19jb250ZW50XCI+XG4gICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCIhKG5hdk1lbnUuaXNDb2xsYXBzZSQgfCBhc3luYykgfHwgKGRlcHRoJCB8IGFzeW5jKSAhPT0gMFwiXG4gID5cbiAgICA8YXVpLWljb25cbiAgICAgICpuZ0lmPVwiaGFzU3ViSXRlbVwiXG4gICAgICBjbGFzcz1cImFjbC1uYXYtaXRlbS1saV9fZXhwYW5zaW9uLWluZGljYXRvclwiXG4gICAgICBpY29uPVwiYW5nbGVfcmlnaHRcIlxuICAgID48L2F1aS1pY29uPlxuICAgIDxhdWktaWNvblxuICAgICAgKm5nSWY9XCJpdGVtLmhyZWYgfCBwdXJlOiBpc0V4dGVybmFsXCJcbiAgICAgIGNsYXNzPVwiYWNsLW5hdi1pdGVtLWxpX19leHBhbnNpb24taW5kaWNhdG9yXCJcbiAgICAgIGljb249XCJqdW1wXCJcbiAgICA+PC9hdWktaWNvbj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19