UNPKG

bfend

Version:

Admin template base on ng-zorro-antd

294 lines 24.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { Subject, ReplaySubject } from 'rxjs'; import { distinct, filter, map, publishReplay, refCount, scan, tap } from 'rxjs/operators'; import { Injectable } from '@angular/core'; import { BfACLService } from './auth/acl.service'; import * as i0 from "@angular/core"; import * as i1 from "./auth/acl.service"; /** * @record */ export function Menu() { } if (false) { /** @type {?} */ Menu.prototype.text; /** @type {?|undefined} */ Menu.prototype.translate; /** @type {?|undefined} */ Menu.prototype.group; /** @type {?|undefined} */ Menu.prototype.link; /** @type {?|undefined} */ Menu.prototype.externalLink; /** @type {?|undefined} */ Menu.prototype.target; /** @type {?|undefined} */ Menu.prototype.icon; /** @type {?|undefined} */ Menu.prototype.badge; /** @type {?|undefined} */ Menu.prototype.badge_dot; /** @type {?|undefined} */ Menu.prototype.badge_status; /** @type {?|undefined} */ Menu.prototype.hide; /** @type {?|undefined} */ Menu.prototype.acl; /** @type {?|undefined} */ Menu.prototype.children; /** @type {?|undefined} */ Menu.prototype._type; /** @type {?|undefined} */ Menu.prototype._selected; /** @type {?|undefined} */ Menu.prototype._open; /** @type {?|undefined} */ Menu.prototype._depth; /* Skipping unhandled member: [key: string]: any;*/ } export class BfMenuService { /** * @param {?} aclService */ constructor(aclService) { this.aclService = aclService; this.data = []; this.updateSubject = new ReplaySubject(); this.setSubject = new Subject(); this.toggleOpenSubject = new Subject(); this.currentSubject = new Subject(); this.refreshSubject = new Subject(); // 最新的菜单数据 this.menus$ = this.updateSubject.pipe(scan((menus, mutation) => [...mutation(menus)], []), tap(menus => (this.data = menus)), publishReplay(1), refCount()); this.valid$ = this.menus$.pipe(map(menus => menus && menus.length > 0), filter(state => state), // select true distinct()); // 设置整个菜单数据结构 this.setSubject.pipe(map(this.setMutation.bind(this))) .subscribe(this.updateSubject); // 菜单的打开或关闭 this.toggleOpenSubject.pipe(map(this.toggleOpenMutation.bind(this))) .subscribe(this.updateSubject); // 当前菜单,一般是和 URL 关联起来的 this.currentSubject.pipe(map(this.setCurrentMutation.bind(this))) .subscribe(this.updateSubject); this.refreshSubject.pipe(map(this.refreshMutation.bind(this))) .subscribe(this.updateSubject); // 用户权限改变时,重新计算菜单权限 this.aclService.rules$.subscribe(this.refreshSubject); } /** * @param {?} menus * @param {?} callback * @return {?} */ walk(menus, callback) { /** @type {?} */ const _walk = (list, parentMenu, depth) => { for (const item of list) { callback(item, parentMenu, depth); if (item.children && item.children.length > 0) { _walk(item.children, item, depth + 1); } else { item.children = []; } } }; _walk(menus, null, 0); } /** * @param {?} menus * @return {?} */ prune(menus) { /** @type {?} */ const result = []; for (const item of menus) { if (item.hide) { continue; } if (item.children && item.children.length > 0) { item.children = this.prune(item.children); if ((item._type === 3 || item.group) && item.children.length === 0) { continue; // 父菜单和分组如果没有了孩子,自己也消失 } } result.push(item); } return result; } /** * @param {?} menus * @return {?} */ normalize(menus) { /** @type {?} */ let i = 1; this.walk(menus, (item, parent, depth) => { item.__id = i++; item.__parent = parent; item._depth = depth; // badge if (item.badge) { if (item.badge_dot !== true) { item.badge_dot = false; } if (!item.badge_status) { item.badge_status = 'error'; } } item.hide = item.acl && !this.aclService.can(item.acl); item._type = item.externalLink ? 2 : 1; if (item.children && item.children.length > 0) { item._type = 3; } }); return this.prune(menus); } /** * @param {?} items * @return {?} */ set(items) { this.setSubject.next(items); } /** * @param {?} menu * @return {?} */ setCurrent(menu) { this.currentSubject.next(menu); } /** * @param {?} url * @return {?} */ getByUrl(url) { /** @type {?} */ let findItem = null; this.walk(this.data, item => { item._open = false; if (!item.link) { return; } if (!findItem && new RegExp(`^${url}\\b`).test(item.link)) { findItem = item; } }); return findItem; } /** * @param {?} url * @return {?} */ getPathByUrl(url) { /** @type {?} */ let item = null; this.walk(this.data, (i, parent, depth) => { if (i.link === url) { item = i; } }); /** @type {?} */ const ret = []; if (!item) { return ret; } do { ret.splice(0, 0, item); item = item.__parent; } while (item); return ret; } /** * @param {?} item * @return {?} */ toggleOpen(item) { this.toggleOpenSubject.next(item); } /** * @param {?} menus * @return {?} */ setMutation(menus) { return () => { // 规范化,添加部分计算属性 return this.normalize(menus); }; } /** * @param {?} menu * @return {?} */ toggleOpenMutation(menu) { return menus => { this.walk(menus, m => { if (m.__id !== menu.__id) { m._open = false; return; } menu._open = !menu._open; }); return menus; }; } /** * @param {?} menu * @return {?} */ setCurrentMutation(menu) { return menus => { /** @type {?} */ let p = menu; if (p) { do { p._open = true; p = p.__parent; } while (p); } return menus; }; } /** * @return {?} */ refreshMutation() { return menus => { return this.normalize(menus); }; } } BfMenuService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] }, ]; BfMenuService.ctorParameters = () => [ { type: BfACLService } ]; /** @nocollapse */ BfMenuService.ngInjectableDef = i0.defineInjectable({ factory: function BfMenuService_Factory() { return new BfMenuService(i0.inject(i1.BfACLService)); }, token: BfMenuService, providedIn: "root" }); if (false) { /** @type {?} */ BfMenuService.prototype.menus$; /** @type {?} */ BfMenuService.prototype.data; /** @type {?} */ BfMenuService.prototype.updateSubject; /** @type {?} */ BfMenuService.prototype.setSubject; /** @type {?} */ BfMenuService.prototype.toggleOpenSubject; /** @type {?} */ BfMenuService.prototype.currentSubject; /** @type {?} */ BfMenuService.prototype.refreshSubject; /** @type {?} */ BfMenuService.prototype.valid$; /** @type {?} */ BfMenuService.prototype.aclService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYmZlbmQvIiwic291cmNlcyI6WyJsaWIvbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQWMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sb0JBQW9CLENBQUM7Ozs7OztBQUUzRCwwQkF1Q0M7OztJQXJDQyxvQkFBYTs7SUFFYix5QkFBbUI7O0lBRW5CLHFCQUFnQjs7SUFFaEIsb0JBQWM7O0lBRWQsNEJBQXNCOztJQUV0QixzQkFBaUQ7O0lBRWpELG9CQUFjOztJQUVkLHFCQUFlOztJQUVmLHlCQUFvQjs7SUFFcEIsNEJBQXNCOztJQUV0QixvQkFBZTs7SUFFZixtQkFBa0M7O0lBRWxDLHdCQUFrQjs7SUFLbEIscUJBQWU7O0lBRWYseUJBQW9COztJQUVwQixxQkFBZ0I7O0lBQ2hCLHNCQUFnQjs7O0FBVWxCLE1BQU07Ozs7SUFpQkosWUFBb0IsVUFBd0I7UUFBeEIsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQWRwQyxTQUFJLEdBQVcsRUFBRSxDQUFDO1FBRWxCLGtCQUFhLEdBQUcsSUFBSSxhQUFhLEVBQVksQ0FBQztRQUU5QyxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUVuQyxzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXhDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUVyQyxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFLckMsVUFBVTtRQUNWLElBQUks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QyxJQUFVO1FBQ25DLE9BQU8sS0FBSyxDQUFDLEVBQUU7O2dCQUNULENBQUMsR0FBRyxJQUFJO1lBRVosSUFBSSxDQUFDLEVBQUU7Z0JBQ0wsR0FBRztvQkFDRCxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztvQkFDZixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztpQkFDaEIsUUFBUSxDQUFDLEVBQUU7YUFDYjtZQUVELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7OztJQUVPLGVBQWU7UUFDckIsT0FBTyxLQUFLLENBQUMsRUFBRTtZQUNiLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUM7SUFDSixDQUFDOzs7WUFoTkYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUEvQ1EsWUFBWTs7Ozs7SUFpRG5CLCtCQUEyQjs7SUFFM0IsNkJBQTBCOztJQUUxQixzQ0FBc0Q7O0lBRXRELG1DQUEyQzs7SUFFM0MsMENBQWdEOztJQUVoRCx1Q0FBNkM7O0lBRTdDLHVDQUF1Qzs7SUFFdkMsK0JBQTRCOztJQUVoQixtQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdCwgZmlsdGVyLCBtYXAsIHB1Ymxpc2hSZXBsYXksIHJlZkNvdW50LCBzY2FuLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZkFDTFNlcnZpY2UsIEFDTFR5cGUgfSBmcm9tICcuL2F1dGgvYWNsLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1lbnUge1xuICAvLyDmlofmnKxcbiAgdGV4dDogc3RyaW5nO1xuICAvLyBpMThu5Li76ZSuXG4gIHRyYW5zbGF0ZT86IHN0cmluZztcbiAgLy8g5piv5ZCm6I+c5Y2V57uEXG4gIGdyb3VwPzogYm9vbGVhbjtcbiAgLy8gYW5ndWxhciDpk77mjqVcbiAgbGluaz86IHN0cmluZztcbiAgLy8g5aSW6YOo6ZO+5o6lXG4gIGV4dGVybmFsTGluaz86IHN0cmluZztcbiAgLy8g6ZO+5o6lIHRhcmdldFxuICB0YXJnZXQ/OiAnX2JsYW5rJyB8ICdfc2VsZicgfCAnX3BhcmVudCcgfCAnX3RvcCc7XG4gIC8vIOWbvuagh1xuICBpY29uPzogc3RyaW5nO1xuICAvLyDlvr3moIfmlbDvvIzlsZXnpLrnmoTmlbDlrZdcbiAgYmFkZ2U/OiBudW1iZXI7XG4gIC8vIOW+veagh+aVsO+8jOaYvuekuuWwj+e6oueCuVxuICBiYWRnZV9kb3Q/OiBib29sZWFuO1xuICAvLyDlvr3moIfmlbDvvIzorr7nva4gQmFkZ2Ug6aKc6ImyIO+8iOm7mOiupO+8mmVycm9y77yJXG4gIGJhZGdlX3N0YXR1cz86IHN0cmluZztcbiAgLy8g5piv5ZCm6ZqQ6JePXG4gIGhpZGU/OiBib29sZWFuO1xuICAvLyBBQ0zphY3nva5cbiAgYWNsPzogc3RyaW5nIHwgc3RyaW5nW10gfCBBQ0xUeXBlO1xuICAvLyDkuoznuqfoj5zljZVcbiAgY2hpbGRyZW4/OiBNZW51W107XG4gIC8vIOiPnOWNleexu+Wei++8jOaXoOmhu+aMh+WumueUsSBTZXJ2aWNlIOiHquWKqOivhuWIq1xuICAvLyAx77ya6ZO+5o6lXG4gIC8vIDLvvJrlpJbpg6jpk77mjqVcbiAgLy8gM++8mumTvuaOpe+8iOWtkOiPnOWNle+8iVxuICBfdHlwZT86IG51bWJlcjtcbiAgLy8g5piv5ZCm6YCJ5LitXG4gIF9zZWxlY3RlZD86IGJvb2xlYW47XG4gIC8vIOaYr+WQpuaJk+W8gFxuICBfb3Blbj86IGJvb2xlYW47XG4gIF9kZXB0aD86IG51bWJlcjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbnR5cGUgTXV0YXRpb24gPSAobWVudXM6IE1lbnVbXSkgPT4gTWVudVtdO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBCZk1lbnVTZXJ2aWNlIHtcbiAgbWVudXMkOiBPYnNlcnZhYmxlPE1lbnVbXT47XG5cbiAgcHJpdmF0ZSBkYXRhOiBNZW51W10gPSBbXTtcblxuICBwcml2YXRlIHVwZGF0ZVN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxNdXRhdGlvbj4oKTtcblxuICBwcml2YXRlIHNldFN1YmplY3QgPSBuZXcgU3ViamVjdDxNZW51W10+KCk7XG5cbiAgcHJpdmF0ZSB0b2dnbGVPcGVuU3ViamVjdCA9IG5ldyBTdWJqZWN0PE1lbnU+KCk7XG5cbiAgcHJpdmF0ZSBjdXJyZW50U3ViamVjdCA9IG5ldyBTdWJqZWN0PE1lbnU+KCk7XG5cbiAgcHJpdmF0ZSByZWZyZXNoU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgdmFsaWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWNsU2VydmljZTogQmZBQ0xTZXJ2aWNlKSB7XG4gICAgLy8g5pyA5paw55qE6I+c5Y2V5pWw5o2uXG4gICAgdGhpcy5tZW51cyQgPSB0aGlzLnVwZGF0ZVN1YmplY3QucGlwZShcbiAgICAgIHNjYW4oKG1lbnVzOiBNZW51W10sIG11dGF0aW9uOiBNdXRhdGlvbikgPT4gWy4uLm11dGF0aW9uKG1lbnVzKV0sIFtdKSxcbiAgICAgIHRhcChtZW51cyA9PiAodGhpcy5kYXRhID0gbWVudXMpKSxcbiAgICAgIHB1Ymxpc2hSZXBsYXkoMSksXG4gICAgICByZWZDb3VudCgpXG4gICAgKTtcblxuICAgIHRoaXMudmFsaWQkID0gdGhpcy5tZW51cyQucGlwZShcbiAgICAgIG1hcChtZW51cyA9PiBtZW51cyAmJiBtZW51cy5sZW5ndGggPiAwKSxcbiAgICAgIGZpbHRlcihzdGF0ZSA9PiBzdGF0ZSksIC8vIHNlbGVjdCB0cnVlXG4gICAgICBkaXN0aW5jdCgpXG4gICAgKTtcblxuICAgIC8vIOiuvue9ruaVtOS4quiPnOWNleaVsOaNrue7k+aehFxuICAgIHRoaXMuc2V0U3ViamVjdC5waXBlKG1hcCh0aGlzLnNldE11dGF0aW9uLmJpbmQodGhpcykpKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLnVwZGF0ZVN1YmplY3QpO1xuXG4gICAgLy8g6I+c5Y2V55qE5omT5byA5oiW5YWz6ZetXG4gICAgdGhpcy50b2dnbGVPcGVuU3ViamVjdC5waXBlKG1hcCh0aGlzLnRvZ2dsZU9wZW5NdXRhdGlvbi5iaW5kKHRoaXMpKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy51cGRhdGVTdWJqZWN0KTtcblxuICAgIC8vIOW9k+WJjeiPnOWNle+8jOS4gOiIrOaYr+WSjCBVUkwg5YWz6IGU6LW35p2l55qEXG4gICAgdGhpcy5jdXJyZW50U3ViamVjdC5waXBlKG1hcCh0aGlzLnNldEN1cnJlbnRNdXRhdGlvbi5iaW5kKHRoaXMpKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy51cGRhdGVTdWJqZWN0KTtcblxuICAgIHRoaXMucmVmcmVzaFN1YmplY3QucGlwZShtYXAodGhpcy5yZWZyZXNoTXV0YXRpb24uYmluZCh0aGlzKSkpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMudXBkYXRlU3ViamVjdCk7XG5cbiAgICAvLyDnlKjmiLfmnYPpmZDmlLnlj5jml7bvvIzph43mlrDorqHnrpfoj5zljZXmnYPpmZBcbiAgICB0aGlzLmFjbFNlcnZpY2UucnVsZXMkLnN1YnNjcmliZSh0aGlzLnJlZnJlc2hTdWJqZWN0KTtcbiAgfVxuXG4gIHByaXZhdGUgd2FsayhtZW51cywgY2FsbGJhY2s6IChpdGVtOiBNZW51LCBwYXJlbnRNZW51OiBNZW51LCBkZXB0aD86IG51bWJlcikgPT4gdm9pZCkge1xuICAgIGNvbnN0IF93YWxrID0gKGxpc3Q6IE1lbnVbXSwgcGFyZW50TWVudTogTWVudSwgZGVwdGg6IG51bWJlcikgPT4ge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgICAgY2FsbGJhY2soaXRlbSwgcGFyZW50TWVudSwgZGVwdGgpO1xuICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBfd2FsayhpdGVtLmNoaWxkcmVuLCBpdGVtLCBkZXB0aCArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBfd2FsayhtZW51cywgbnVsbCwgMCk7XG4gIH1cblxuICBwcml2YXRlIHBydW5lKG1lbnVzOiBNZW51W10pOiBNZW51W10ge1xuICAgIGNvbnN0IHJlc3VsdDogTWVudVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbWVudXMpIHtcbiAgICAgIGlmIChpdGVtLmhpZGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBpdGVtLmNoaWxkcmVuID0gdGhpcy5wcnVuZShpdGVtLmNoaWxkcmVuKTtcbiAgICAgICAgaWYgKChpdGVtLl90eXBlID09PSAzIHx8IGl0ZW0uZ3JvdXApICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7IC8vIOeItuiPnOWNleWSjOWIhue7hOWmguaenOayoeacieS6huWtqeWtkO+8jOiHquW3seS5n+a2iOWksVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZShtZW51czogTWVudVtdKTogTWVudVtdIHtcbiAgICBsZXQgaSA9IDE7XG5cbiAgICB0aGlzLndhbGsobWVudXMsIChpdGVtLCBwYXJlbnQsIGRlcHRoKSA9PiB7XG4gICAgICBpdGVtLl9faWQgPSBpKys7XG4gICAgICBpdGVtLl9fcGFyZW50ID0gcGFyZW50O1xuICAgICAgaXRlbS5fZGVwdGggPSBkZXB0aDtcblxuICAgICAgLy8gYmFkZ2VcbiAgICAgIGlmIChpdGVtLmJhZGdlKSB7XG4gICAgICAgIGlmIChpdGVtLmJhZGdlX2RvdCAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGl0ZW0uYmFkZ2VfZG90ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpdGVtLmJhZGdlX3N0YXR1cykge1xuICAgICAgICAgIGl0ZW0uYmFkZ2Vfc3RhdHVzID0gJ2Vycm9yJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpdGVtLmhpZGUgPSBpdGVtLmFjbCAmJiAhdGhpcy5hY2xTZXJ2aWNlLmNhbihpdGVtLmFjbCk7XG5cbiAgICAgIGl0ZW0uX3R5cGUgPSBpdGVtLmV4dGVybmFsTGluayA/IDIgOiAxO1xuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGl0ZW0uX3R5cGUgPSAzO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMucHJ1bmUobWVudXMpO1xuICB9XG5cbiAgc2V0KGl0ZW1zOiBNZW51W10pIHtcbiAgICB0aGlzLnNldFN1YmplY3QubmV4dChpdGVtcyk7XG4gIH1cblxuICBzZXRDdXJyZW50KG1lbnU6IE1lbnUpIHtcbiAgICB0aGlzLmN1cnJlbnRTdWJqZWN0Lm5leHQobWVudSk7XG4gIH1cblxuICBnZXRCeVVybCh1cmwpIHtcbiAgICBsZXQgZmluZEl0ZW06IE1lbnUgPSBudWxsO1xuICAgIHRoaXMud2Fsayh0aGlzLmRhdGEsIGl0ZW0gPT4ge1xuICAgICAgaXRlbS5fb3BlbiA9IGZhbHNlO1xuICAgICAgaWYgKCFpdGVtLmxpbmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFmaW5kSXRlbSAmJiBuZXcgUmVnRXhwKGBeJHt1cmx9XFxcXGJgKS50ZXN0KGl0ZW0ubGluaykpIHtcbiAgICAgICAgZmluZEl0ZW0gPSBpdGVtO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbmRJdGVtO1xuICB9XG5cbiAgZ2V0UGF0aEJ5VXJsKHVybCkge1xuICAgIGxldCBpdGVtOiBNZW51ID0gbnVsbDtcbiAgICB0aGlzLndhbGsodGhpcy5kYXRhLCAoaSwgcGFyZW50LCBkZXB0aCkgPT4ge1xuICAgICAgaWYgKGkubGluayA9PT0gdXJsKSB7XG4gICAgICAgIGl0ZW0gPSBpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmV0OiBNZW51W10gPSBbXTtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgZG8ge1xuICAgICAgcmV0LnNwbGljZSgwLCAwLCBpdGVtKTtcbiAgICAgIGl0ZW0gPSBpdGVtLl9fcGFyZW50O1xuICAgIH0gd2hpbGUgKGl0ZW0pO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHRvZ2dsZU9wZW4oaXRlbTogTWVudSkge1xuICAgIHRoaXMudG9nZ2xlT3BlblN1YmplY3QubmV4dChpdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TXV0YXRpb24obWVudXM6IE1lbnVbXSk6IE11dGF0aW9uIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8g6KeE6IyD5YyW77yM5re75Yqg6YOo5YiG6K6h566X5bGe5oCnXG4gICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUobWVudXMpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZU9wZW5NdXRhdGlvbihtZW51OiBNZW51KTogTXV0YXRpb24ge1xuICAgIHJldHVybiBtZW51cyA9PiB7XG4gICAgICB0aGlzLndhbGsobWVudXMsIG0gPT4ge1xuICAgICAgICBpZiAobS5fX2lkICE9PSBtZW51Ll9faWQpIHtcbiAgICAgICAgICBtLl9vcGVuID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVudS5fb3BlbiA9ICFtZW51Ll9vcGVuO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBtZW51cztcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDdXJyZW50TXV0YXRpb24obWVudTogTWVudSk6IE11dGF0aW9uIHtcbiAgICByZXR1cm4gbWVudXMgPT4ge1xuICAgICAgbGV0IHAgPSBtZW51O1xuXG4gICAgICBpZiAocCkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcC5fb3BlbiA9IHRydWU7XG4gICAgICAgICAgcCA9IHAuX19wYXJlbnQ7XG4gICAgICAgIH0gd2hpbGUgKHApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVudXM7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaE11dGF0aW9uKCk6IE11dGF0aW9uIHtcbiAgICByZXR1cm4gbWVudXMgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKG1lbnVzKTtcbiAgICB9O1xuICB9XG59XG4iXX0=