@alauda-fe/common
Version:
Alauda frontend team common codes.
375 lines • 42.5 kB
JavaScript
import { BreadcrumbModule, IconComponent } from '@alauda/ui';
import { NgTemplateOutlet } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, isDevMode, signal, ViewChild, } from '@angular/core';
import { NavigationEnd, Router, RouterLink } from '@angular/router';
import { filter } from 'rxjs';
import { ImgHeaderPipe, PurePipe, SanitizePipe, } from '../../../core/public-api';
import { GridLayoutModule } from '../../../grid-layout/module';
import { TranslatePipe } from '../../../public-api';
import animDataMap from '../lottie-icons/animation-data';
import { NavLottieIconDirective } from '../public-api';
import { findNavPath } from '../utils';
import { BreadcrumbService, } from './breadcrumb.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "./breadcrumb.service";
import * as i3 from "@alauda/ui";
const _c0 = ["icon"];
const _forTrack0 = ($index, $item) => $item.key;
const _forTrack1 = ($index, $item) => $item.name;
const _c1 = a0 => ({ item: a0, inLink: true });
const _c2 = a0 => ({ item: a0, inLink: false });
const _c3 = a0 => ({ $implicit: a0 });
function BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Conditional_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Conditional_1_ng_container_0_Template, 1, 0, "ng-container", 4);
} if (rf & 2) {
const item_r1 = i0.ɵɵnextContext(2).$implicit;
i0.ɵɵnextContext(2);
const icon_r2 = i0.ɵɵreference(5);
i0.ɵɵproperty("ngTemplateOutlet", icon_r2)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c1, item_r1));
} }
function BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "a", 2);
i0.ɵɵtemplate(1, BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Conditional_1_Template, 1, 4, "ng-container");
i0.ɵɵelementStart(2, "span");
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "translate");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
const item_r1 = ctx_r2.$implicit;
const ɵ$index_4_r4 = ctx_r2.$index;
i0.ɵɵproperty("routerLink", item_r1.routerLink);
i0.ɵɵadvance();
i0.ɵɵconditional(ɵ$index_4_r4 === 0 ? 1 : -1);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(item_r1.label || i0.ɵɵpipeBind1(4, 3, item_r1.name));
} }
function BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Conditional_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Conditional_1_ng_container_0_Template, 1, 0, "ng-container", 4);
} if (rf & 2) {
const item_r1 = i0.ɵɵnextContext(2).$implicit;
i0.ɵɵnextContext(2);
const icon_r2 = i0.ɵɵreference(5);
i0.ɵɵproperty("ngTemplateOutlet", icon_r2)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c2, item_r1));
} }
function BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 3);
i0.ɵɵtemplate(1, BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Conditional_1_Template, 1, 4, "ng-container");
i0.ɵɵelementStart(2, "span");
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "translate");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
const item_r1 = ctx_r2.$implicit;
const ɵ$index_4_r4 = ctx_r2.$index;
i0.ɵɵadvance();
i0.ɵɵconditional(ɵ$index_4_r4 === 0 ? 1 : -1);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(item_r1.label || i0.ɵɵpipeBind1(4, 2, item_r1.name));
} }
function BreadcrumbComponent_Conditional_1_For_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-breadcrumb-item");
i0.ɵɵtemplate(1, BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Template, 5, 5, "a", 2)(2, BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Template, 5, 4, "span", 3);
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r1 = ctx.$implicit;
const ctx_r4 = i0.ɵɵnextContext(2);
i0.ɵɵadvance();
i0.ɵɵconditional(item_r1.routerLink && !ctx_r4.isSameUrl(item_r1.routerLink) ? 1 : 2);
} }
function BreadcrumbComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵrepeaterCreate(0, BreadcrumbComponent_Conditional_1_For_1_Template, 3, 1, "aui-breadcrumb-item", null, _forTrack0);
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵrepeater(ctx_r4.activatedPath);
} }
function BreadcrumbComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0, 1);
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵproperty("ngTemplateOutlet", ctx_r4.customTemplate)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c3, ctx_r4.rootPath()));
} }
function BreadcrumbComponent_Conditional_3_For_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "a", 5);
i0.ɵɵtext(1);
i0.ɵɵpipe(2, "translate");
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r6 = i0.ɵɵnextContext().$implicit;
i0.ɵɵproperty("routerLink", item_r6.routerLink);
i0.ɵɵadvance();
i0.ɵɵtextInterpolate(item_r6.translate ? i0.ɵɵpipeBind1(2, 2, item_r6.name) : item_r6.name);
} }
function BreadcrumbComponent_Conditional_3_For_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span");
i0.ɵɵtext(1);
i0.ɵɵpipe(2, "translate");
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r6 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance();
i0.ɵɵtextInterpolate(item_r6.translate ? i0.ɵɵpipeBind1(2, 1, item_r6.name) : item_r6.name);
} }
function BreadcrumbComponent_Conditional_3_For_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-breadcrumb-item");
i0.ɵɵtemplate(1, BreadcrumbComponent_Conditional_3_For_1_Conditional_1_Template, 3, 4, "a", 5)(2, BreadcrumbComponent_Conditional_3_For_1_Conditional_2_Template, 3, 3, "span");
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r6 = ctx.$implicit;
i0.ɵɵadvance();
i0.ɵɵconditional(item_r6.routerLink ? 1 : 2);
} }
function BreadcrumbComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵrepeaterCreate(0, BreadcrumbComponent_Conditional_3_For_1_Template, 3, 1, "aui-breadcrumb-item", null, _forTrack1);
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵrepeater(ctx_r4.subItems());
} }
function BreadcrumbComponent_ng_template_4_Conditional_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "acl-nav-lottie-icon", 6);
} if (rf & 2) {
const ctx_r6 = i0.ɵɵnextContext();
const item_r8 = ctx_r6.item;
const inLink_r9 = ctx_r6.inLink;
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵproperty("frame", inLink_r9 ? -1 : 0)("animData", ctx_r4.animDataMap[item_r8.icon]);
} }
function BreadcrumbComponent_ng_template_4_Conditional_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "acl-nav-lottie-icon", 6);
} if (rf & 2) {
const inLink_r9 = i0.ɵɵnextContext(2).inLink;
i0.ɵɵproperty("frame", inLink_r9 ? -1 : 0)("animData", ctx());
} }
function BreadcrumbComponent_ng_template_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, BreadcrumbComponent_ng_template_4_Conditional_1_Conditional_0_Template, 1, 2, "acl-nav-lottie-icon", 6);
i0.ɵɵpipe(1, "pure");
} if (rf & 2) {
let tmp_5_0;
const item_r8 = i0.ɵɵnextContext().item;
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵconditional((tmp_5_0 = i0.ɵɵpipeBind2(1, 1, item_r8.iconLottieJson, ctx_r4.loadLottieJson)) ? 0 : -1, tmp_5_0);
} }
function BreadcrumbComponent_ng_template_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "img", 7);
i0.ɵɵpipe(1, "aclSanitize");
} if (rf & 2) {
const item_r8 = i0.ɵɵnextContext().item;
i0.ɵɵproperty("src", i0.ɵɵpipeBind2(1, 1, item_r8.iconImgSrc, "url"), i0.ɵɵsanitizeUrl);
} }
function BreadcrumbComponent_ng_template_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "img", 7);
i0.ɵɵpipe(1, "aclImageHeader");
i0.ɵɵpipe(2, "aclSanitize");
} if (rf & 2) {
const item_r8 = i0.ɵɵnextContext().item;
i0.ɵɵproperty("src", i0.ɵɵpipeBind2(2, 3, i0.ɵɵpipeBind1(1, 1, item_r8.iconImgData || item_r8.iconData), "url"), i0.ɵɵsanitizeUrl);
} }
function BreadcrumbComponent_ng_template_4_Conditional_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "aui-icon", 8);
} if (rf & 2) {
const item_r8 = i0.ɵɵnextContext().item;
i0.ɵɵproperty("icon", item_r8.iconStatic);
} }
function BreadcrumbComponent_ng_template_4_Conditional_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "acl-nav-lottie-icon", 6);
} if (rf & 2) {
const inLink_r9 = i0.ɵɵnextContext().inLink;
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵproperty("frame", inLink_r9 ? -1 : 0)("animData", ctx_r4.animDataMap.product);
} }
function BreadcrumbComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, BreadcrumbComponent_ng_template_4_Conditional_0_Template, 1, 2, "acl-nav-lottie-icon", 6)(1, BreadcrumbComponent_ng_template_4_Conditional_1_Template, 2, 4)(2, BreadcrumbComponent_ng_template_4_Conditional_2_Template, 2, 4, "img", 7)(3, BreadcrumbComponent_ng_template_4_Conditional_3_Template, 3, 6, "img", 7)(4, BreadcrumbComponent_ng_template_4_Conditional_4_Template, 1, 1, "aui-icon", 8)(5, BreadcrumbComponent_ng_template_4_Conditional_5_Template, 1, 2, "acl-nav-lottie-icon", 6);
} if (rf & 2) {
const item_r8 = ctx.item;
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵconditional(item_r8.icon && ctx_r4.animDataMap[item_r8.icon] ? 0 : item_r8.iconLottieJson ? 1 : item_r8.iconImgSrc ? 2 : item_r8.iconImgData || item_r8.iconData ? 3 : item_r8.iconStatic ? 4 : 5);
} }
export class BreadcrumbComponent {
constructor(router, cdr, service) {
this.router = router;
this.cdr = cdr;
this.service = service;
this.animDataMap = animDataMap;
this.internalConfigs = [];
this.url = router.url;
this.router.events
.pipe(filter(event => event instanceof NavigationEnd))
.subscribe((event) => {
this.url = event.urlAfterRedirects;
this.cdr.markForCheck();
});
}
ngOnInit() {
this.service.templateState$.subscribe(state => {
this.customTemplateState = state;
this.customTemplate = this.service.template;
this.cdr.markForCheck();
});
}
ngOnChanges(changes) {
if (changes.configs || changes.groups) {
this.internalConfigs =
this.configs ??
this.groups?.reduce((acc, group) => acc.concat(group.items), []);
}
this.updateActivatedPath();
}
isSameUrl(link) {
const rest = this.restNode(link);
return rest.length === 0 || rest === 'list';
}
subItems() {
if (!this.activatedPath?.length) {
return;
}
const routerLink = this.activatedPath.at(-1).routerLink;
const rest = this.restNode(routerLink)
.split('/')
.filter(v => !!v);
if (this._subItems) {
const result = this._subItems(rest, routerLink);
if (result) {
return result;
}
}
if (rest.length === 0) {
return [];
}
if (rest.length === 1) {
if (rest[0] === 'list') {
return [];
}
if (rest[0] === 'create') {
return [{ name: 'create', translate: true }];
}
}
if (rest.length === 2 && rest[0] === 'update') {
return [
{
name: rest[1],
routerLink: routerLink.concat(['detail', rest[1]]),
},
{ name: 'update', translate: true },
];
}
if (rest.length === 2 && rest[0] === 'detail') {
return [{ name: rest[1] }];
}
if (isDevMode()) {
console.error("URL can't match any default breadcrumb:", this.url);
}
return [];
}
rootPath() {
return this.activatedPath?.at(-1)
? this.linkToUrl(this.activatedPath.at(-1).routerLink)
: '/';
}
loadLottieJson(icon) {
const data = signal(null);
fetch(icon)
.then(res => res.json())
.then(json => {
data.set(json);
});
return data;
}
updateActivatedPath() {
this.activatedPath =
this.activatedKey && this.internalConfigs
? findNavPath(item => item.key === this.activatedKey)(this.internalConfigs)
: [];
}
restNode(link) {
const url = this.linkToUrl(link);
if (!this.url.startsWith(url)) {
return '';
}
const endIndex = findIndex(c => c === '?' || c === '#', this.url);
return this.url.slice(url.length + 1, endIndex === -1 ? this.url.length : endIndex);
}
linkToUrl(link) {
return link.reduceRight((acc, curr) => {
if (typeof curr === 'object') {
return (';' +
Object.entries(curr)
.map(([key, value]) => `${key}=${value}`)
.join('') +
acc);
}
return curr.startsWith('/') ? curr + acc : '/' + curr + acc;
}, '');
}
static { this.ɵfac = function BreadcrumbComponent_Factory(t) { return new (t || BreadcrumbComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.BreadcrumbService)); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: BreadcrumbComponent, selectors: [["acl-breadcrumb"]], viewQuery: function BreadcrumbComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.iconRef = _t.first);
} }, inputs: { configs: "configs", groups: "groups", activatedKey: "activatedKey", _subItems: [0, "subItems", "_subItems"] }, standalone: true, features: [i0.ɵɵNgOnChangesFeature, i0.ɵɵStandaloneFeature], decls: 6, vars: 3, consts: [["icon", ""], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "item", 3, "routerLink"], [1, "item"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [3, "routerLink"], [3, "frame", "animData"], [3, "src"], [3, "icon"]], template: function BreadcrumbComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-breadcrumb");
i0.ɵɵtemplate(1, BreadcrumbComponent_Conditional_1_Template, 2, 0)(2, BreadcrumbComponent_Conditional_2_Template, 1, 4, "ng-container", 1)(3, BreadcrumbComponent_Conditional_3_Template, 2, 0);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(4, BreadcrumbComponent_ng_template_4_Template, 6, 1, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
} if (rf & 2) {
i0.ɵɵadvance();
i0.ɵɵconditional((ctx.activatedPath == null ? null : ctx.activatedPath.length) ? 1 : -1);
i0.ɵɵadvance();
i0.ɵɵconditional(ctx.customTemplateState === "ready" ? 2 : -1);
i0.ɵɵadvance();
i0.ɵɵconditional(ctx.customTemplateState !== "initialing" && !ctx.customTemplate ? 3 : -1);
} }, dependencies: [BreadcrumbModule, i3.BreadcrumbComponent, i3.BreadcrumbItemComponent, RouterLink,
NavLottieIconDirective,
NgTemplateOutlet,
TranslatePipe,
GridLayoutModule,
SanitizePipe,
ImgHeaderPipe,
IconComponent,
PurePipe], styles: [".item[_ngcontent-%COMP%]{display:inline-flex;align-items:center;vertical-align:bottom}.item[_ngcontent-%COMP%] > acl-nav-lottie-icon[_ngcontent-%COMP%], .item[_ngcontent-%COMP%] > img[_ngcontent-%COMP%]{margin-right:4px;width:var(--aui-icon-size-m);height:var(--aui-icon-size-m)}.item[_ngcontent-%COMP%] > aui-icon[_ngcontent-%COMP%]{margin-right:4px;font-size:var(--aui-icon-size-m)}"], changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BreadcrumbComponent, [{
type: Component,
args: [{ selector: 'acl-breadcrumb', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
BreadcrumbModule,
RouterLink,
NavLottieIconDirective,
NgTemplateOutlet,
TranslatePipe,
GridLayoutModule,
SanitizePipe,
ImgHeaderPipe,
IconComponent,
PurePipe,
], template: "<aui-breadcrumb>\n @if (activatedPath?.length) {\n @for (item of activatedPath; track item.key; let index = $index) {\n <aui-breadcrumb-item>\n @if (item.routerLink && !isSameUrl(item.routerLink)) {\n <a\n class=\"item\"\n [routerLink]=\"item.routerLink\"\n >\n @if (index === 0) {\n <ng-container\n *ngTemplateOutlet=\"icon; context: { item, inLink: true }\"\n ></ng-container>\n }\n <span>{{ item.label || (item.name | translate) }}</span>\n </a>\n } @else {\n <span class=\"item\">\n @if (index === 0) {\n <ng-container\n *ngTemplateOutlet=\"icon; context: { item, inLink: false }\"\n ></ng-container>\n }\n <span>{{ item.label || (item.name | translate) }}</span>\n </span>\n }\n </aui-breadcrumb-item>\n }\n }\n @if (customTemplateState === 'ready') {\n <ng-container\n [ngTemplateOutlet]=\"customTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: rootPath() }\"\n ></ng-container>\n }\n @if (customTemplateState !== 'initialing' && !customTemplate) {\n @for (item of subItems(); track item.name) {\n <aui-breadcrumb-item>\n @if (item.routerLink) {\n <a [routerLink]=\"item.routerLink\">{{\n item.translate ? (item.name | translate) : item.name\n }}</a>\n } @else {\n <span>{{\n item.translate ? (item.name | translate) : item.name\n }}</span>\n }\n </aui-breadcrumb-item>\n }\n }\n</aui-breadcrumb>\n\n<ng-template\n #icon\n let-item=\"item\"\n let-inLink=\"inLink\"\n>\n @if (item.icon && animDataMap[item.icon]) {\n <acl-nav-lottie-icon\n [frame]=\"inLink ? -1 : 0\"\n [animData]=\"animDataMap[item.icon]\"\n ></acl-nav-lottie-icon>\n } @else if (item.iconLottieJson) {\n @if (item.iconLottieJson | pure: loadLottieJson; as animData) {\n <acl-nav-lottie-icon\n [frame]=\"inLink ? -1 : 0\"\n [animData]=\"animData()\"\n ></acl-nav-lottie-icon>\n }\n } @else if (item.iconImgSrc) {\n <img [src]=\"item.iconImgSrc | aclSanitize: 'url'\" />\n } @else if (item.iconImgData || item.iconData) {\n <img\n [src]=\"\n item.iconImgData || item.iconData | aclImageHeader | aclSanitize: 'url'\n \"\n />\n } @else if (item.iconStatic) {\n <aui-icon [icon]=\"item.iconStatic\"></aui-icon>\n } @else {\n <acl-nav-lottie-icon\n [frame]=\"inLink ? -1 : 0\"\n [animData]=\"animDataMap.product\"\n ></acl-nav-lottie-icon>\n }\n</ng-template>\n", styles: [".item{display:inline-flex;align-items:center;vertical-align:bottom}.item>acl-nav-lottie-icon,.item>img{margin-right:4px;width:var(--aui-icon-size-m);height:var(--aui-icon-size-m)}.item>aui-icon{margin-right:4px;font-size:var(--aui-icon-size-m)}\n"] }]
}], () => [{ type: i1.Router }, { type: i0.ChangeDetectorRef }, { type: i2.BreadcrumbService }], { configs: [{
type: Input
}], groups: [{
type: Input
}], activatedKey: [{
type: Input
}], _subItems: [{
type: Input,
args: ['subItems']
}], iconRef: [{
type: ViewChild,
args: ['icon']
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(BreadcrumbComponent, { className: "BreadcrumbComponent" }); })();
function findIndex(compare, value) {
for (let i = 0; i < value.length; i++) {
if (compare(value.charAt(i))) {
return i;
}
}
return -1;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvcGFnZS1zY2FmZm9sZC9uYXZpZ2F0aW9uL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvcGFnZS1zY2FmZm9sZC9uYXZpZ2F0aW9uL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUdULE1BQU0sRUFHTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5QixPQUFPLEVBQ0wsYUFBYSxFQUNiLFFBQVEsRUFDUixZQUFZLEdBRWIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxXQUFXLE1BQU0sZ0NBQWdDLENBQUM7QUFFekQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFdkMsT0FBTyxFQUNMLGlC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InNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJyZWFkY3J1bWJNb2R1bGUsIEljb25Db21wb25lbnQgfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBpc0Rldk1vZGUsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBzaWduYWwsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJMaW5rIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBJbWdIZWFkZXJQaXBlLFxuICBQdXJlUGlwZSxcbiAgU2FuaXRpemVQaXBlLFxuICBTdHJpbmdNYXAsXG59IGZyb20gJy4uLy4uLy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBHcmlkTGF5b3V0TW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vZ3JpZC1sYXlvdXQvbW9kdWxlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9wdWJsaWMtYXBpJztcbmltcG9ydCBhbmltRGF0YU1hcCBmcm9tICcuLi9sb3R0aWUtaWNvbnMvYW5pbWF0aW9uLWRhdGEnO1xuaW1wb3J0IHsgTmF2R3JvdXBDb25maWcsIE5hdkl0ZW1Db25maWcgfSBmcm9tICcuLi9uYXYtbWVudS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IE5hdkxvdHRpZUljb25EaXJlY3RpdmUgfSBmcm9tICcuLi9wdWJsaWMtYXBpJztcbmltcG9ydCB7IGZpbmROYXZQYXRoIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5pbXBvcnQge1xuICBCcmVhZGNydW1iU2VydmljZSxcbiAgQnJlYWRjcnVtYlRlbXBsYXRlU3RhdGUsXG59IGZyb20gJy4vYnJlYWRjcnVtYi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWNsLWJyZWFkY3J1bWInLFxuICB0ZW1wbGF0ZVVybDogJy4vYnJlYWRjcnVtYi50ZW1wbGF0ZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYnJlYWRjcnVtYi5zdHlsZS5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQnJlYWRjcnVtYk1vZHVsZSxcbiAgICBSb3V0ZXJMaW5rLFxuICAgIE5hdkxvdHRpZUljb25EaXJlY3RpdmUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBUcmFuc2xhdGVQaXBlLFxuICAgIEdyaWRMYXlvdXRNb2R1bGUsXG4gICAgU2FuaXRpemVQaXBlLFxuICAgIEltZ0hlYWRlclBpcGUsXG4gICAgSWNvbkNvbXBvbmVudCxcbiAgICBQdXJlUGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgYW5pbURhdGFNYXAgPSBhbmltRGF0YU1hcDtcblxuICBASW5wdXQoKVxuICBjb25maWdzOiBOYXZJdGVtQ29uZmlnW107XG5cbiAgQElucHV0KClcbiAgZ3JvdXBzOiBOYXZHcm91cENvbmZpZ1tdO1xuXG4gIEBJbnB1dCgpXG4gIGFjdGl2YXRlZEtleTogc3RyaW5nO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gIEBJbnB1dCgnc3ViSXRlbXMnKVxuICBfc3ViSXRlbXM6IChcbiAgICByZXN0OiBzdHJpbmdbXSxcbiAgICBsYXN0Um91dGVMaW5rOiBBcnJheTxzdHJpbmcgfCBTdHJpbmdNYXA+LFxuICApID0+IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHJhbnNsYXRlPzogYm9vbGVhbjtcbiAgICByb3V0ZXJMaW5rPzogTmF2SXRlbUNvbmZpZ1sncm91dGVyTGluayddO1xuICB9PiB8IHZvaWQ7XG5cbiAgQFZpZXdDaGlsZCgnaWNvbicpXG4gIGljb25SZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIGFjdGl2YXRlZFBhdGg6IE5hdkl0ZW1Db25maWdbXTtcbiAgY3VzdG9tVGVtcGxhdGVTdGF0ZTogQnJlYWRjcnVtYlRlbXBsYXRlU3RhdGU7XG4gIGN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBwcml2YXRlIGludGVybmFsQ29uZmlnczogTmF2SXRlbUNvbmZpZ1tdID0gW107XG4gIHByaXZhdGUgdXJsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlOiBCcmVhZGNydW1iU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy51cmwgPSByb3V0ZXIudXJsO1xuICAgIHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogTmF2aWdhdGlvbkVuZCkgPT4ge1xuICAgICAgICB0aGlzLnVybCA9IGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLnRlbXBsYXRlU3RhdGUkLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlU3RhdGUgPSBzdGF0ZTtcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGUgPSB0aGlzLnNlcnZpY2UudGVtcGxhdGU7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5jb25maWdzIHx8IGNoYW5nZXMuZ3JvdXBzKSB7XG4gICAgICB0aGlzLmludGVybmFsQ29uZmlncyA9XG4gICAgICAgIHRoaXMuY29uZmlncyA/P1xuICAgICAgICB0aGlzLmdyb3Vwcz8ucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGdyb3VwKSA9PiBhY2MuY29uY2F0KGdyb3VwLml0ZW1zKSxcbiAgICAgICAgICBbXSBhcyBOYXZJdGVtQ29uZmlnW10sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVBY3RpdmF0ZWRQYXRoKCk7XG4gIH1cblxuICBpc1NhbWVVcmwobGluazogTmF2SXRlbUNvbmZpZ1sncm91dGVyTGluayddKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzdCA9IHRoaXMucmVzdE5vZGUobGluayk7XG4gICAgcmV0dXJuIHJlc3QubGVuZ3RoID09PSAwIHx8IHJlc3QgPT09ICdsaXN0JztcbiAgfVxuXG4gIHN1Ykl0ZW1zKCk6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHJhbnNsYXRlPzogYm9vbGVhbjtcbiAgICByb3V0ZXJMaW5rPzogTmF2SXRlbUNvbmZpZ1sncm91dGVyTGluayddO1xuICB9PiB7XG4gICAgaWYgKCF0aGlzLmFjdGl2YXRlZFBhdGg/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3V0ZXJMaW5rID0gdGhpcy5hY3RpdmF0ZWRQYXRoLmF0KC0xKS5yb3V0ZXJMaW5rO1xuXG4gICAgY29uc3QgcmVzdCA9IHRoaXMucmVzdE5vZGUocm91dGVyTGluaylcbiAgICAgIC5zcGxpdCgnLycpXG4gICAgICAuZmlsdGVyKHYgPT4gISF2KTtcblxuICAgIGlmICh0aGlzLl9zdWJJdGVtcykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3ViSXRlbXMocmVzdCwgcm91dGVyTGluayk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKHJlc3RbMF0gPT09ICdsaXN0Jykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAocmVzdFswXSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgcmV0dXJuIFt7IG5hbWU6ICdjcmVhdGUnLCB0cmFuc2xhdGU6IHRydWUgfV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAyICYmIHJlc3RbMF0gPT09ICd1cGRhdGUnKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcmVzdFsxXSxcbiAgICAgICAgICByb3V0ZXJMaW5rOiByb3V0ZXJMaW5rLmNvbmNhdChbJ2RldGFpbCcsIHJlc3RbMV1dKSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBuYW1lOiAndXBkYXRlJywgdHJhbnNsYXRlOiB0cnVlIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICBpZiAocmVzdC5sZW5ndGggPT09IDIgJiYgcmVzdFswXSA9PT0gJ2RldGFpbCcpIHtcbiAgICAgIHJldHVybiBbeyBuYW1lOiByZXN0WzFdIH1dO1xuICAgIH1cblxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVSTCBjYW4ndCBtYXRjaCBhbnkgZGVmYXVsdCBicmVhZGNydW1iOlwiLCB0aGlzLnVybCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcm9vdFBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVkUGF0aD8uYXQoLTEpXG4gICAgICA/IHRoaXMubGlua1RvVXJsKHRoaXMuYWN0aXZhdGVkUGF0aC5hdCgtMSkucm91dGVyTGluaylcbiAgICAgIDogJy8nO1xuICB9XG5cbiAgbG9hZExvdHRpZUpzb24oaWNvbjogc3RyaW5nKSB7XG4gICAgY29uc3QgZGF0YSA9IHNpZ25hbDx1bmtub3duPihudWxsKTtcblxuICAgIGZldGNoKGljb24pXG4gICAgICAudGhlbihyZXMgPT4gcmVzLmpzb24oKSlcbiAgICAgIC50aGVuKGpzb24gPT4ge1xuICAgICAgICBkYXRhLnNldChqc29uKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUFjdGl2YXRlZFBhdGgoKSB7XG4gICAgdGhpcy5hY3RpdmF0ZWRQYXRoID1cbiAgICAgIHRoaXMuYWN0aXZhdGVkS2V5ICYmIHRoaXMuaW50ZXJuYWxDb25maWdzXG4gICAgICAgID8gZmluZE5hdlBhdGg8TmF2SXRlbUNvbmZpZz4oaXRlbSA9PiBpdGVtLmtleSA9PT0gdGhpcy5hY3RpdmF0ZWRLZXkpKFxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbENvbmZpZ3MsXG4gICAgICAgICAgKVxuICAgICAgICA6IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0Tm9kZShsaW5rOiBOYXZJdGVtQ29uZmlnWydyb3V0ZXJMaW5rJ10pIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmxpbmtUb1VybChsaW5rKTtcbiAgICBpZiAoIXRoaXMudXJsLnN0YXJ0c1dpdGgodXJsKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBlbmRJbmRleCA9IGZpbmRJbmRleChjID0+IGMgPT09ICc/JyB8fCBjID09PSAnIycsIHRoaXMudXJsKTtcbiAgICByZXR1cm4gdGhpcy51cmwuc2xpY2UoXG4gICAgICB1cmwubGVuZ3RoICsgMSxcbiAgICAgIGVuZEluZGV4ID09PSAtMSA/IHRoaXMudXJsLmxlbmd0aCA6IGVuZEluZGV4LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxpbmtUb1VybChsaW5rOiBOYXZJdGVtQ29uZmlnWydyb3V0ZXJMaW5rJ10pOiBzdHJpbmcge1xuICAgIHJldHVybiBsaW5rLnJlZHVjZVJpZ2h0PHN0cmluZz4oKGFjYywgY3VycikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBjdXJyID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICc7JyArXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoY3VyciBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KVxuICAgICAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7dmFsdWV9YClcbiAgICAgICAgICAgIC5qb2luKCcnKSArXG4gICAgICAgICAgYWNjXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3Vyci5zdGFydHNXaXRoKCcvJykgPyBjdXJyICsgYWNjIDogJy8nICsgY3VyciArIGFjYztcbiAgICB9LCAnJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEluZGV4KGNvbXBhcmU6ICh2OiBzdHJpbmcpID0+IGJvb2xlYW4sIHZhbHVlOiBzdHJpbmcpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjb21wYXJlKHZhbHVlLmNoYXJBdChpKSkpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cbiIsIjxhdWktYnJlYWRjcnVtYj5cbiAgQGlmIChhY3RpdmF0ZWRQYXRoPy5sZW5ndGgpIHtcbiAgICBAZm9yIChpdGVtIG9mIGFjdGl2YXRlZFBhdGg7IHRyYWNrIGl0ZW0ua2V5OyBsZXQgaW5kZXggPSAkaW5kZXgpIHtcbiAgICAgIDxhdWktYnJlYWRjcnVtYi1pdGVtPlxuICAgICAgICBAaWYgKGl0ZW0ucm91dGVyTGluayAmJiAhaXNTYW1lVXJsKGl0ZW0ucm91dGVyTGluaykpIHtcbiAgICAgICAgICA8YVxuICAgICAgICAgICAgY2xhc3M9XCJpdGVtXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVyTGlua1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpY29uOyBjb250ZXh0OiB7IGl0ZW0sIGluTGluazogdHJ1ZSB9XCJcbiAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5sYWJlbCB8fCAoaXRlbS5uYW1lIHwgdHJhbnNsYXRlKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbVwiPlxuICAgICAgICAgICAgQGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpY29uOyBjb250ZXh0OiB7IGl0ZW0sIGluTGluazogZmFsc2UgfVwiXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0ubGFiZWwgfHwgKGl0ZW0ubmFtZSB8IHRyYW5zbGF0ZSkgfX08L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L2F1aS1icmVhZGNydW1iLWl0ZW0+XG4gICAgfVxuICB9XG4gIEBpZiAoY3VzdG9tVGVtcGxhdGVTdGF0ZSA9PT0gJ3JlYWR5Jykge1xuICAgIDxuZy1jb250YWluZXJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbVRlbXBsYXRlXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm9vdFBhdGgoKSB9XCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gIH1cbiAgQGlmIChjdXN0b21UZW1wbGF0ZVN0YXRlICE9PSAnaW5pdGlhbGluZycgJiYgIWN1c3RvbVRlbXBsYXRlKSB7XG4gICAgQGZvciAoaXRlbSBvZiBzdWJJdGVtcygpOyB0cmFjayBpdGVtLm5hbWUpIHtcbiAgICAgIDxhdWktYnJlYWRjcnVtYi1pdGVtPlxuICAgICAgICBAaWYgKGl0ZW0ucm91dGVyTGluaykge1xuICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVyTGlua1wiPnt7XG4gICAgICAgICAgICBpdGVtLnRyYW5zbGF0ZSA/IChpdGVtLm5hbWUgfCB0cmFuc2xhdGUpIDogaXRlbS5uYW1lXG4gICAgICAgICAgfX08L2E+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICBpdGVtLnRyYW5zbGF0ZSA/IChpdGVtLm5hbWUgfCB0cmFuc2xhdGUpIDogaXRlbS5uYW1lXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvYXVpLWJyZWFkY3J1bWItaXRlbT5cbiAgICB9XG4gIH1cbjwvYXVpLWJyZWFkY3J1bWI+XG5cbjxuZy10ZW1wbGF0ZVxuICAjaWNvblxuICBsZXQtaXRlbT1cIml0ZW1cIlxuICBsZXQtaW5MaW5rPVwiaW5MaW5rXCJcbj5cbiAgQGlmIChpdGVtLmljb24gJiYgYW5pbURhdGFNYXBbaXRlbS5pY29uXSkge1xuICAgIDxhY2wtbmF2LWxvdHRpZS1pY29uXG4gICAgICBbZnJhbWVdPVwiaW5MaW5rID8gLTEgOiAwXCJcbiAgICAgIFthbmltRGF0YV09XCJhbmltRGF0YU1hcFtpdGVtLmljb25dXCJcbiAgICA+PC9hY2wtbmF2LWxvdHRpZS1pY29uPlxuICB9IEBlbHNlIGlmIChpdGVtLmljb25Mb3R0aWVKc29uKSB7XG4gICAgQGlmIChpdGVtLmljb25Mb3R0aWVKc29uIHwgcHVyZTogbG9hZExvdHRpZUpzb247IGFzIGFuaW1EYXRhKSB7XG4gICAgICA8YWNsLW5hdi1sb3R0aWUtaWNvblxuICAgICAgICBbZnJhbWVdPVwiaW5MaW5rID8gLTEgOiAwXCJcbiAgICAgICAgW2FuaW1EYXRhXT1cImFuaW1EYXRhKClcIlxuICAgICAgPjwvYWNsLW5hdi1sb3R0aWUtaWNvbj5cbiAgICB9XG4gIH0gQGVsc2UgaWYgKGl0ZW0uaWNvbkltZ1NyYykge1xuICAgIDxpbWcgW3NyY109XCJpdGVtLmljb25JbWdTcmMgfCBhY2xTYW5pdGl6ZTogJ3VybCdcIiAvPlxuICB9IEBlbHNlIGlmIChpdGVtLmljb25JbWdEYXRhIHx8IGl0ZW0uaWNvbkRhdGEpIHtcbiAgICA8aW1nXG4gICAgICBbc3JjXT1cIlxuICAgICAgICBpdGVtLmljb25JbWdEYXRhIHx8IGl0ZW0uaWNvbkRhdGEgfCBhY2xJbWFnZUhlYWRlciB8IGFjbFNhbml0aXplOiAndXJsJ1xuICAgICAgXCJcbiAgICAvPlxuICB9IEBlbHNlIGlmIChpdGVtLmljb25TdGF0aWMpIHtcbiAgICA8YXVpLWljb24gW2ljb25dPVwiaXRlbS5pY29uU3RhdGljXCI+PC9hdWktaWNvbj5cbiAgfSBAZWxzZSB7XG4gICAgPGFjbC1uYXYtbG90dGllLWljb25cbiAgICAgIFtmcmFtZV09XCJpbkxpbmsgPyAtMSA6IDBcIlxuICAgICAgW2FuaW1EYXRhXT1cImFuaW1EYXRhTWFwLnByb2R1Y3RcIlxuICAgID48L2FjbC1uYXYtbG90dGllLWljb24+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=