UNPKG

lamb-web-lib

Version:

LambWebLib. Es un proyecto angular de tipo Librería. que contiene una Suit de componentes reutilizables para el proyecto [Lamb Financial](https://lamb.upeu.edu.pe).

222 lines 23 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** * @license * Copyright Lamb Team. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { EventEmitter, Component, Input, Output, ViewChildren, ElementRef, QueryList, } from '@angular/core'; import { LambMenuItem } from './menu-item'; import { LambMenuService } from './menu.service'; import { takeWhile } from 'rxjs/operators'; import { getElementHeight } from './helpers'; /** * @param {?} item * @return {?} */ function sumSubmenuHeight(item) { return item.expanded ? (item.subMenuHeight || 0) + item.children.filter(c => c.children).reduce((acc, c) => acc + sumSubmenuHeight(c), 0) : 0; } export class LambMenuItemComponent { /** * @param {?} lambMenuService */ constructor(lambMenuService) { this.lambMenuService = lambMenuService; this.lambMenuItem = (/** @type {?} */ (null)); this.hoverItem = new EventEmitter(); this.toggleSubMenu = new EventEmitter(); this.selectItem = new EventEmitter(); this.itemClick = new EventEmitter(); this.alive = true; this.maxHeight = 0; } // @Input() lambMenuItemm = <LambMenuItem>null; /** * @param {?} lambMenuItem * @return {?} */ set lambMenuItemm(lambMenuItem) { if (lambMenuItem) { lambMenuItem.icon = (lambMenuItem.icon && (lambMenuItem.icon !== 'icmn-books') && (lambMenuItem.icon !== 'icmb-books') && lambMenuItem.icon) || this.randonIcon(); lambMenuItem.link = (lambMenuItem.link && !lambMenuItem.url && !(lambMenuItem.children && lambMenuItem.children.length) && !lambMenuItem.group && !lambMenuItem.hidden) && '/' + lambMenuItem.link; // setTimeout(() => { this.lambMenuItem = lambMenuItem; // }, 0) } } /** * @return {?} */ ngAfterViewInit() { // this.lambMenuItem.children.length this.subMenu.changes .pipe(takeWhile(() => this.alive)) .subscribe(() => { this.updateSubmenuHeight(); this.updateMaxHeight(); }); this.lambMenuService.onSubmenuToggle$() .pipe(takeWhile(() => this.alive)) .subscribe(() => { this.updateMaxHeight(); }); this.updateSubmenuHeight(); this.updateMaxHeight(); } /** * @return {?} */ ngOnDestroy() { this.alive = false; } /** * @return {?} */ get icons() { return [ 'fa fa-adn', 'fa fa-code', 'fa fa-bullhorn', 'fa fa-ambulance', 'fa fa-android', 'fa fa-angellist', 'fa fa-apple', 'fa fa-at', 'fa fa-chrome', 'fa fa-child', ]; } /** * @return {?} */ randonIcon() { return this.icons[Math.floor(Math.random() * this.icons.length)]; } /** * @return {?} */ updateSubmenuHeight() { this.lambMenuItem.subMenuHeight = this.subMenu.reduce((acc, c) => acc + getElementHeight(c.nativeElement), 0); } /** * @return {?} */ updateMaxHeight() { setTimeout(() => { this.maxHeight = sumSubmenuHeight(this.lambMenuItem); }, 0); } /** * @param {?} item * @return {?} */ onHoverItem(item) { this.hoverItem.emit(item); } /** * @param {?} item * @return {?} */ onToggleSubMenu(item) { this.toggleSubMenu.emit(item); } /** * @param {?} item * @return {?} */ onItemClick(item) { this.itemClick.emit(item); } /** * @param {?} item * @return {?} */ onSelectItem(item) { this.selectItem.emit(item); } } LambMenuItemComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: '[lambMenuItem]', template: `<span *ngIf="lambMenuItem.group && !lambMenuItem.hidden"> <i class="lamb-menu-icon {{ lambMenuItem.icon }}" *ngIf="lambMenuItem.icon"></i> {{ lambMenuItem.title }} 1 </span> <a *ngIf="lambMenuItem.link && !lambMenuItem.url && !(lambMenuItem.children && lambMenuItem.children.length) && !lambMenuItem.group && !lambMenuItem.hidden" [routerLink]="lambMenuItem.link" [fragment]="lambMenuItem.fragment" [attr.target]="lambMenuItem.target" [attr.title]="lambMenuItem.title" [class.active]="lambMenuItem.selected" (mouseenter)="onHoverItem(lambMenuItem)"> <i class="lamb-menu-icon {{ lambMenuItem.icon }}" *ngIf="lambMenuItem.icon"></i> <span class="lamb-menu-title">{{ lambMenuItem.title }}</span> </a> <a *ngIf="lambMenuItem.url && !(lambMenuItem.children && lambMenuItem.children.length) && !lambMenuItem.link && !lambMenuItem.group && !lambMenuItem.hidden" [attr.href]="lambMenuItem.url" [attr.target]="lambMenuItem.target" [attr.title]="lambMenuItem.title" [class.active]="lambMenuItem.selected" (mouseenter)="onHoverItem(lambMenuItem)" (click)="onSelectItem(lambMenuItem)"> <i class="lamb-menu-icon {{ lambMenuItem.icon }}" *ngIf="lambMenuItem.icon"></i> <span class="lamb-menu-title">{{ lambMenuItem.title }}</span> </a> <a *ngIf="!(lambMenuItem.children && lambMenuItem.children.length) && !lambMenuItem.link && !lambMenuItem.url && !lambMenuItem.group && !lambMenuItem.hidden" [attr.target]="lambMenuItem.target" [attr.title]="lambMenuItem.title" [class.active]="lambMenuItem.selected" (mouseenter)="onHoverItem(lambMenuItem)" (click)="$event.preventDefault(); onItemClick(lambMenuItem);"> <i class="lamb-menu-icon {{ lambMenuItem.icon }}" *ngIf="lambMenuItem.icon"></i> <span class="lamb-menu-title">{{ lambMenuItem.title }}</span> </a> <a *ngIf="(lambMenuItem.children && lambMenuItem.children.length) && !lambMenuItem.hidden" (click)="$event.preventDefault(); onToggleSubMenu(lambMenuItem);" [attr.target]="lambMenuItem.target" [attr.title]="lambMenuItem.title" [class.active]="lambMenuItem.selected" (mouseenter)="onHoverItem(lambMenuItem)" href="#"> <i class="lamb-menu-icon {{ lambMenuItem.icon }}" *ngIf="lambMenuItem.icon"></i> <span class="lamb-menu-title">{{ lambMenuItem.title }}</span> <!-- <i class="ion chevron" [class.ion-chevron-up]="!lambMenuItem.expanded" [class.ion-chevron-down]="lambMenuItem.expanded"></i> --> <i class="fa chevron" [class.fa-chevron-up]="!lambMenuItem.expanded" [class.fa-chevron-down]="lambMenuItem.expanded"></i> </a> <ul *ngIf="(lambMenuItem.children && lambMenuItem.children.length) && !lambMenuItem.hidden" [class.collapsed]="!(lambMenuItem.children && lambMenuItem.expanded)" [class.expanded]="lambMenuItem.expanded" class="lamb-menu-items" [style.max-height.px]="maxHeight"> <li lambMenuItem *ngFor="let item of lambMenuItem.children" [lambMenuItemm]="item" [class.lamb-menu-group]="item.group" (hoverItem)="onHoverItem($event)" (toggleSubMenu)="onToggleSubMenu($event)" (selectItem)="onSelectItem($event)" (itemClick)="onItemClick($event)" class="lamb-menu-item"></li> </ul>`, },] }, ]; LambMenuItemComponent.ctorParameters = () => [ { type: LambMenuService } ]; LambMenuItemComponent.propDecorators = { lambMenuItemm: [{ type: Input }], hoverItem: [{ type: Output }], toggleSubMenu: [{ type: Output }], selectItem: [{ type: Output }], itemClick: [{ type: Output }], subMenu: [{ type: ViewChildren, args: [LambMenuItemComponent, { read: ElementRef },] }] }; if (false) { /** @type {?} */ LambMenuItemComponent.prototype.lambMenuItem; /** @type {?} */ LambMenuItemComponent.prototype.hoverItem; /** @type {?} */ LambMenuItemComponent.prototype.toggleSubMenu; /** @type {?} */ LambMenuItemComponent.prototype.selectItem; /** @type {?} */ LambMenuItemComponent.prototype.itemClick; /** @type {?} */ LambMenuItemComponent.prototype.alive; /** @type {?} */ LambMenuItemComponent.prototype.subMenu; /** @type {?} */ LambMenuItemComponent.prototype.maxHeight; /** @type {?} */ LambMenuItemComponent.prototype.lambMenuService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2xhbWItd2ViLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL21lbnUvbWVudS1pdGVtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFPQSxPQUFPLEVBQ0wsWUFBWSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFpQixZQUFZLEVBQ25FLFVBQVUsRUFBRSxTQUFTLEdBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7O0FBRzdDLDBCQUEwQixJQUFrQjtJQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xILENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUixDQUFDO0FBMENELE1BQU07Ozs7SUErQkosWUFBb0IsZUFBZ0M7UUFBaEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBOUI3QyxpQkFBWSxHQUFHLG1CQUFjLElBQUksRUFBQSxDQUFDO1FBb0IvQixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNwQyxrQkFB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LENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7Ozs7SUFFTSxXQUFXLENBQUMsSUFBa0I7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQzs7Ozs7SUFFTSxlQUFlLENBQUMsSUFBa0I7UUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQzs7Ozs7SUFFTSxXQUFXLENBQUMsSUFBa0I7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQzs7Ozs7SUFFTSxZQUFZLENBQUMsSUFBa0I7UUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQzs7O1lBM0lGLFNBQVMsU0FBQzs7Z0JBRVQsUUFBUSxFQUFFLGdCQUFnQjtnQkFDMUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQW1DTjthQUNMOzs7WUFsRFEsZUFBZTs7OzRCQXNEckIsS0FBSzt3QkFrQkwsTUFBTTs0QkFDTixNQUFNO3lCQUNOLE1BQU07d0JBQ04sTUFBTTtzQkFJTixZQUFZLFNBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFOzs7O0lBM0J6RCw2Q0FBeUM7O0lBb0J6QywwQ0FBOEM7O0lBQzlDLDhDQUFrRDs7SUFDbEQsMkNBQStDOztJQUMvQywwQ0FBOEM7O0lBRTlDLHNDQUFxQjs7SUFFckIsd0NBQTBGOztJQUMxRiwwQ0FBYzs7SUFFRixnREFBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBMYW1iIFRlYW0uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtcclxuICBFdmVudEVtaXR0ZXIsIENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgQWZ0ZXJWaWV3SW5pdCwgVmlld0NoaWxkcmVuLFxyXG4gIEVsZW1lbnRSZWYsIFF1ZXJ5TGlzdCwgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMYW1iTWVudUl0ZW0gfSBmcm9tICcuL21lbnUtaXRlbSc7XHJcbmltcG9ydCB7IExhbWJNZW51U2VydmljZSB9IGZyb20gJy4vbWVudS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgdGFrZVdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBnZXRFbGVtZW50SGVpZ2h0IH0gZnJvbSAnLi9oZWxwZXJzJztcclxuXHJcblxyXG5mdW5jdGlvbiBzdW1TdWJtZW51SGVpZ2h0KGl0ZW06IExhbWJNZW51SXRlbSkge1xyXG4gIHJldHVybiBpdGVtLmV4cGFuZGVkID9cclxuICAgIChpdGVtLnN1Yk1lbnVIZWlnaHQgfHwgMCkgKyBpdGVtLmNoaWxkcmVuLmZpbHRlcihjID0+IGMuY2hpbGRyZW4pLnJlZHVjZSgoYWNjLCBjKSA9PiBhY2MgKyBzdW1TdWJtZW51SGVpZ2h0KGMpLCAwKVxyXG4gICAgOiAwO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdbbGFtYk1lbnVJdGVtXScsXHJcbiAgdGVtcGxhdGU6IGA8c3BhbiAqbmdJZj1cImxhbWJNZW51SXRlbS5ncm91cCAmJiAhbGFtYk1lbnVJdGVtLmhpZGRlblwiPlxyXG4gICAgPGkgY2xhc3M9XCJsYW1iLW1lbnUtaWNvbiB7eyBsYW1iTWVudUl0ZW0uaWNvbiB9fVwiICpuZ0lmPVwibGFtYk1lbnVJdGVtLmljb25cIj48L2k+XHJcbiAgICB7eyBsYW1iTWVudUl0ZW0udGl0bGUgfX0gMVxyXG48L3NwYW4+XHJcbjxhICpuZ0lmPVwibGFtYk1lbnVJdGVtLmxpbmsgJiYgIWxhbWJNZW51SXRlbS51cmxcclxuICAmJiAhKGxhbWJNZW51SXRlbS5jaGlsZHJlbiAmJiBsYW1iTWVudUl0ZW0uY2hpbGRyZW4ubGVuZ3RoKSAmJiAhbGFtYk1lbnVJdGVtLmdyb3VwICYmICFsYW1iTWVudUl0ZW0uaGlkZGVuXCIgW3JvdXRlckxpbmtdPVwibGFtYk1lbnVJdGVtLmxpbmtcIlxyXG4gICAgW2ZyYWdtZW50XT1cImxhbWJNZW51SXRlbS5mcmFnbWVudFwiIFthdHRyLnRhcmdldF09XCJsYW1iTWVudUl0ZW0udGFyZ2V0XCIgW2F0dHIudGl0bGVdPVwibGFtYk1lbnVJdGVtLnRpdGxlXCIgW2NsYXNzLmFjdGl2ZV09XCJsYW1iTWVudUl0ZW0uc2VsZWN0ZWRcIlxyXG4gICAgKG1vdXNlZW50ZXIpPVwib25Ib3Zlckl0ZW0obGFtYk1lbnVJdGVtKVwiPlxyXG4gICAgPGkgY2xhc3M9XCJsYW1iLW1lbnUtaWNvbiB7eyBsYW1iTWVudUl0ZW0uaWNvbiB9fVwiICpuZ0lmPVwibGFtYk1lbnVJdGVtLmljb25cIj48L2k+XHJcbiAgICA8c3BhbiBjbGFzcz1cImxhbWItbWVudS10aXRsZVwiPnt7IGxhbWJNZW51SXRlbS50aXRsZSB9fTwvc3Bhbj5cclxuPC9hPlxyXG48YSAqbmdJZj1cImxhbWJNZW51SXRlbS51cmwgJiYgIShsYW1iTWVudUl0ZW0uY2hpbGRyZW4gJiYgbGFtYk1lbnVJdGVtLmNoaWxkcmVuLmxlbmd0aClcclxuICAmJiAhbGFtYk1lbnVJdGVtLmxpbmsgJiYgIWxhbWJNZW51SXRlbS5ncm91cCAmJiAhbGFtYk1lbnVJdGVtLmhpZGRlblwiIFthdHRyLmhyZWZdPVwibGFtYk1lbnVJdGVtLnVybFwiIFthdHRyLnRhcmdldF09XCJsYW1iTWVudUl0ZW0udGFyZ2V0XCJcclxuICAgIFthdHRyLnRpdGxlXT1cImxhbWJNZW51SXRlbS50aXRsZVwiIFtjbGFzcy5hY3RpdmVdPVwibGFtYk1lbnVJdGVtLnNlbGVjdGVkXCIgKG1vdXNlZW50ZXIpPVwib25Ib3Zlckl0ZW0obGFtYk1lbnVJdGVtKVwiIChjbGljayk9XCJvblNlbGVjdEl0ZW0obGFtYk1lbnVJdGVtKVwiPlxyXG4gICAgPGkgY2xhc3M9XCJsYW1iLW1lbnUtaWNvbiB7eyBsYW1iTWVudUl0ZW0uaWNvbiB9fVwiICpuZ0lmPVwibGFtYk1lbnVJdGVtLmljb25cIj48L2k+XHJcbiAgICA8c3BhbiBjbGFzcz1cImxhbWItbWVudS10aXRsZVwiPnt7IGxhbWJNZW51SXRlbS50aXRsZSB9fTwvc3Bhbj5cclxuPC9hPlxyXG48YSAqbmdJZj1cIiEobGFtYk1lbnVJdGVtLmNoaWxkcmVuICYmIGxhbWJNZW51SXRlbS5jaGlsZHJlbi5sZW5ndGgpICYmICFsYW1iTWVudUl0ZW0ubGlua1xyXG4gICYmICFsYW1iTWVudUl0ZW0udXJsICYmICFsYW1iTWVudUl0ZW0uZ3JvdXAgJiYgIWxhbWJNZW51SXRlbS5oaWRkZW5cIiBbYXR0ci50YXJnZXRdPVwibGFtYk1lbnVJdGVtLnRhcmdldFwiIFthdHRyLnRpdGxlXT1cImxhbWJNZW51SXRlbS50aXRsZVwiXHJcbiAgICBbY2xhc3MuYWN0aXZlXT1cImxhbWJNZW51SXRlbS5zZWxlY3RlZFwiIChtb3VzZWVudGVyKT1cIm9uSG92ZXJJdGVtKGxhbWJNZW51SXRlbSlcIiAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IG9uSXRlbUNsaWNrKGxhbWJNZW51SXRlbSk7XCI+XHJcbiAgICA8aSBjbGFzcz1cImxhbWItbWVudS1pY29uIHt7IGxhbWJNZW51SXRlbS5pY29uIH19XCIgKm5nSWY9XCJsYW1iTWVudUl0ZW0uaWNvblwiPjwvaT5cclxuICAgIDxzcGFuIGNsYXNzPVwibGFtYi1tZW51LXRpdGxlXCI+e3sgbGFtYk1lbnVJdGVtLnRpdGxlIH19PC9zcGFuPlxyXG48L2E+XHJcbjxhICpuZ0lmPVwiKGxhbWJNZW51SXRlbS5jaGlsZHJlbiAmJiBsYW1iTWVudUl0ZW0uY2hpbGRyZW4ubGVuZ3RoKSAmJiAhbGFtYk1lbnVJdGVtLmhpZGRlblwiIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgb25Ub2dnbGVTdWJNZW51KGxhbWJNZW51SXRlbSk7XCJcclxuICAgIFthdHRyLnRhcmdldF09XCJsYW1iTWVudUl0ZW0udGFyZ2V0XCIgW2F0dHIudGl0bGVdPVwibGFtYk1lbnVJdGVtLnRpdGxlXCIgW2NsYXNzLmFjdGl2ZV09XCJsYW1iTWVudUl0ZW0uc2VsZWN0ZWRcIiAobW91c2VlbnRlcik9XCJvbkhvdmVySXRlbShsYW1iTWVudUl0ZW0pXCJcclxuICAgIGhyZWY9XCIjXCI+XHJcbiAgICA8aSBjbGFzcz1cImxhbWItbWVudS1pY29uIHt7IGxhbWJNZW51SXRlbS5pY29uIH19XCIgKm5nSWY9XCJsYW1iTWVudUl0ZW0uaWNvblwiPjwvaT5cclxuICAgIDxzcGFuIGNsYXNzPVwibGFtYi1tZW51LXRpdGxlXCI+e3sgbGFtYk1lbnVJdGVtLnRpdGxlIH19PC9zcGFuPlxyXG4gICAgPCEtLSA8aSBjbGFzcz1cImlvbiBjaGV2cm9uXCIgW2NsYXNzLmlvbi1jaGV2cm9uLXVwXT1cIiFsYW1iTWVudUl0ZW0uZXhwYW5kZWRcIiBbY2xhc3MuaW9uLWNoZXZyb24tZG93bl09XCJsYW1iTWVudUl0ZW0uZXhwYW5kZWRcIj48L2k+IC0tPlxyXG4gICAgPGkgY2xhc3M9XCJmYSBjaGV2cm9uXCIgW2NsYXNzLmZhLWNoZXZyb24tdXBdPVwiIWxhbWJNZW51SXRlbS5leHBhbmRlZFwiIFtjbGFzcy5mYS1jaGV2cm9uLWRvd25dPVwibGFtYk1lbnVJdGVtLmV4cGFuZGVkXCI+PC9pPlxyXG48L2E+XHJcbjx1bCAqbmdJZj1cIihsYW1iTWVudUl0ZW0uY2hpbGRyZW4gJiYgbGFtYk1lbnVJdGVtLmNoaWxkcmVuLmxlbmd0aCkgJiYgIWxhbWJNZW51SXRlbS5oaWRkZW5cIiBbY2xhc3MuY29sbGFwc2VkXT1cIiEobGFtYk1lbnVJdGVtLmNoaWxkcmVuICYmIGxhbWJNZW51SXRlbS5leHBhbmRlZClcIlxyXG4gICAgW2NsYXNzLmV4cGFuZGVkXT1cImxhbWJNZW51SXRlbS5leHBhbmRlZFwiIGNsYXNzPVwibGFtYi1tZW51LWl0ZW1zXCIgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwibWF4SGVpZ2h0XCI+XHJcbiAgICA8bGkgbGFtYk1lbnVJdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxhbWJNZW51SXRlbS5jaGlsZHJlblwiIFtsYW1iTWVudUl0ZW1tXT1cIml0ZW1cIiBbY2xhc3MubGFtYi1tZW51LWdyb3VwXT1cIml0ZW0uZ3JvdXBcIiAoaG92ZXJJdGVtKT1cIm9uSG92ZXJJdGVtKCRldmVudClcIlxyXG4gICAgICAgICh0b2dnbGVTdWJNZW51KT1cIm9uVG9nZ2xlU3ViTWVudSgkZXZlbnQpXCIgKHNlbGVjdEl0ZW0pPVwib25TZWxlY3RJdGVtKCRldmVudClcIiAoaXRlbUNsaWNrKT1cIm9uSXRlbUNsaWNrKCRldmVudClcIiBjbGFzcz1cImxhbWItbWVudS1pdGVtXCI+PC9saT5cclxuPC91bD5gLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGFtYk1lbnVJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBwdWJsaWMgbGFtYk1lbnVJdGVtID0gPExhbWJNZW51SXRlbT5udWxsO1xyXG4gIC8vIEBJbnB1dCgpIGxhbWJNZW51SXRlbW0gPSA8TGFtYk1lbnVJdGVtPm51bGw7XHJcbiAgQElucHV0KClcclxuICBzZXQgbGFtYk1lbnVJdGVtbShsYW1iTWVudUl0ZW06IExhbWJNZW51SXRlbSkge1xyXG4gICAgaWYgKGxhbWJNZW51SXRlbSkge1xyXG4gICAgICBsYW1iTWVudUl0ZW0uaWNvbiA9IChsYW1iTWVudUl0ZW0uaWNvbiAmJlxyXG4gICAgICAgIChsYW1iTWVudUl0ZW0uaWNvbiAhPT0gJ2ljbW4tYm9va3MnKSAmJlxyXG4gICAgICAgIChsYW1iTWVudUl0ZW0uaWNvbiAhPT0gJ2ljbWItYm9va3MnKSAmJlxyXG4gICAgICAgIGxhbWJNZW51SXRlbS5pY29uKVxyXG4gICAgICAgIHx8IHRoaXMucmFuZG9uSWNvbigpO1xyXG4gICAgICBsYW1iTWVudUl0ZW0ubGluayA9IChsYW1iTWVudUl0ZW0ubGluayAmJiAhbGFtYk1lbnVJdGVtLnVybFxyXG4gICAgICAgICYmICEobGFtYk1lbnVJdGVtLmNoaWxkcmVuICYmIGxhbWJNZW51SXRlbS5jaGlsZHJlbi5sZW5ndGgpXHJcbiAgICAgICAgJiYgIWxhbWJNZW51SXRlbS5ncm91cCAmJiAhbGFtYk1lbnVJdGVtLmhpZGRlbikgJiYgJy8nICsgbGFtYk1lbnVJdGVtLmxpbms7XHJcblxyXG4gICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5sYW1iTWVudUl0ZW0gPSBsYW1iTWVudUl0ZW07XHJcbiAgICAgIC8vIH0sIDApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgaG92ZXJJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHRvZ2dsZVN1Yk1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2VsZWN0SXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBhbGl2ZSA9IHRydWU7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oTGFtYk1lbnVJdGVtQ29tcG9uZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgc3ViTWVudTogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG4gIG1heEhlaWdodCA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbGFtYk1lbnVTZXJ2aWNlOiBMYW1iTWVudVNlcnZpY2UpIHsgfVxyXG5cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgLy8gdGhpcy5sYW1iTWVudUl0ZW0uY2hpbGRyZW4ubGVuZ3RoXHJcbiAgICB0aGlzLnN1Yk1lbnUuY2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU3VibWVudUhlaWdodCgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTWF4SGVpZ2h0KCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMubGFtYk1lbnVTZXJ2aWNlLm9uU3VibWVudVRvZ2dsZSQoKVxyXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlTWF4SGVpZ2h0KCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMudXBkYXRlU3VibWVudUhlaWdodCgpO1xyXG4gICAgdGhpcy51cGRhdGVNYXhIZWlnaHQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldCBpY29ucygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdmYSBmYS1hZG4nLFxyXG4gICAgICAnZmEgZmEtY29kZScsXHJcbiAgICAgICdmYSBmYS1idWxsaG9ybicsXHJcbiAgICAgICdmYSBmYS1hbWJ1bGFuY2UnLFxyXG4gICAgICAnZmEgZmEtYW5kcm9pZCcsXHJcbiAgICAgICdmYSBmYS1hbmdlbGxpc3QnLFxyXG4gICAgICAnZmEgZmEtYXBwbGUnLFxyXG4gICAgICAnZmEgZmEtYXQnLFxyXG4gICAgICAnZmEgZmEtY2hyb21lJyxcclxuICAgICAgJ2ZhIGZhLWNoaWxkJyxcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJhbmRvbkljb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pY29uc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLmljb25zLmxlbmd0aCldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTdWJtZW51SGVpZ2h0KCkge1xyXG4gICAgdGhpcy5sYW1iTWVudUl0ZW0uc3ViTWVudUhlaWdodCA9IHRoaXMuc3ViTWVudS5yZWR1Y2UoKGFjYywgYykgPT4gYWNjICsgZ2V0RWxlbWVudEhlaWdodChjLm5hdGl2ZUVsZW1lbnQpLCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTWF4SGVpZ2h0KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubWF4SGVpZ2h0ID0gc3VtU3VibWVudUhlaWdodCh0aGlzLmxhbWJNZW51SXRlbSk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkhvdmVySXRlbShpdGVtOiBMYW1iTWVudUl0ZW0pIHtcclxuICAgIHRoaXMuaG92ZXJJdGVtLmVtaXQoaXRlbSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Ub2dnbGVTdWJNZW51KGl0ZW06IExhbWJNZW51SXRlbSkge1xyXG4gICAgdGhpcy50b2dnbGVTdWJNZW51LmVtaXQoaXRlbSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25JdGVtQ2xpY2soaXRlbTogTGFtYk1lbnVJdGVtKSB7XHJcbiAgICB0aGlzLml0ZW1DbGljay5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uU2VsZWN0SXRlbShpdGVtOiBMYW1iTWVudUl0ZW0pIHtcclxuICAgIHRoaXMuc2VsZWN0SXRlbS5lbWl0KGl0ZW0pO1xyXG4gIH1cclxufVxyXG4iXX0=