UNPKG

ad-custom-lib

Version:

This is an UI custom library based on Adminlte library with purpose for personal use, if you need a full template of Primeng please visit https://github.com/mledour/angular-admin-lte

687 lines 63 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, NgZone, QueryList, Renderer2, ViewChild, ViewChildren } from '@angular/core'; import { NavigationEnd, PRIMARY_OUTLET, Router, ActivatedRoute } from '@angular/router'; import { removeListeners, removeSubscriptions } from '../../helpers'; import { RoutingService } from '../../services/routing.service'; import { HeaderService } from '../header/header.service'; import { LayoutStore } from '../layout.store'; import { WrapperService } from '../wrapper/wrapper.service'; import { SidebarLeftToggleDirective } from './sidebar-left.directive'; /** * @record */ export function Item() { } if (false) { /** @type {?} */ Item.prototype.id; /** @type {?} */ Item.prototype.parentId; /** @type {?} */ Item.prototype.label; /** @type {?|undefined} */ Item.prototype.route; /** @type {?|undefined} */ Item.prototype.iconClasses; /** @type {?|undefined} */ Item.prototype.children; /** @type {?|undefined} */ Item.prototype.isActive; /** @type {?|undefined} */ Item.prototype.isCollapsed; /** @type {?|undefined} */ Item.prototype.disableCollapse; } export class SidebarLeftComponent { /** * \@method constructor * @param {?} changeDetectorRef [description] * @param {?} layoutStore [description] * @param {?} ngZone [description] * @param {?} renderer2 [description] * @param {?} router [description] * @param {?} routingService [description] * @param {?} wrapperService [description] * @param {?} headerService [description] * @param {?} activatedRoute */ constructor(changeDetectorRef, layoutStore, ngZone, renderer2, router, routingService, wrapperService, headerService, activatedRoute) { this.changeDetectorRef = changeDetectorRef; this.layoutStore = layoutStore; this.ngZone = ngZone; this.renderer2 = renderer2; this.router = router; this.routingService = routingService; this.wrapperService = wrapperService; this.headerService = headerService; this.activatedRoute = activatedRoute; this.collapsedItems = []; this.activatedItems = []; this.toggleListeners = []; this.listeners = []; this.itemsByIds = {}; this.runningAnimations = 0; this.subscriptions = []; } /** * \@method ngOnInit * @return {?} */ ngOnInit() { this.subscriptions.push(this.layoutStore.sidebarLeftMenu.subscribe((/** * @param {?} value * @return {?} */ value => { this.menu = value; this.monkeyPatchMenu(this.menu); if (this.initialized) { this.setMenuListeners(this.activeUrl); this.setSidebarListeners(); this.setMenuTogglesListeners(); } this.initialized = true; }))); this.subscriptions.push(this.layoutStore.sidebarLeftMenuActiveUrl.subscribe((/** * @param {?} value * @return {?} */ value => { this.activeUrl = value; this.setMenuListeners(value); }))); this.subscriptions.push(this.routingService.events.subscribe((/** * @param {?} event * @return {?} */ (event) => { /** @type {?} */ let url; if (event instanceof NavigationEnd) { url = event.url; } else { url = this.router.url; } this.activeUrl = url; this.setMenuListeners(url); // console.log(url) }))); this.setSidebarListeners(); } /** * \@method ngAfterViewInit * @return {?} */ ngAfterViewInit() { this.setMenuTogglesListeners(); this.checkMenuWithoutChildren(); } /** * \@method ngOnDestroy * @return {?} */ ngOnDestroy() { this.subscriptions = removeSubscriptions(this.subscriptions); this.listeners = removeListeners(this.listeners); this.toggleListeners = removeListeners(this.toggleListeners); } /** * [setSidebarListeners description] * \@method setSidebarListeners * @return {?} */ setSidebarListeners() { this.subscriptions.push(this.layoutStore.layout.subscribe((/** * @param {?} value * @return {?} */ (value) => { this.layout = value; this.setSidebarHeight(); }))); this.subscriptions.push(this.layoutStore.windowInnerHeight.subscribe((/** * @param {?} value * @return {?} */ (value) => { this.windowInnerHeight = value; this.setSidebarHeight(); }))); this.subscriptions.push(this.layoutStore.sidebarLeftMenu.subscribe((/** * @return {?} */ () => { this.changeDetectorRef.detectChanges(); }))); this.ngZone.runOutsideAngular((/** * @return {?} */ () => { this.listeners.push(this.renderer2.listen(this.sidebarElement.nativeElement, 'mouseenter', (/** * @return {?} */ () => { this.layoutStore.sidebarLeftMouseOver(true); }))); this.listeners.push(this.renderer2.listen(this.sidebarElement.nativeElement, 'mouseleave', (/** * @return {?} */ () => { this.layoutStore.sidebarLeftMouseOver(false); }))); })); this.subscriptions.push(this.layoutStore.windowInnerWidth.subscribe((/** * @param {?} value * @return {?} */ (value) => { this.windowInnerWidth = value; if (!this.isSidebarLeftCollapsed && this.windowInnerWidth <= 767) { this.layoutStore.sidebarLeftCollapsed(true); } else if (this.windowInnerWidth > 767 && this.isSidebarLeftCollapsed && !this.isSidebarLeftExpandOnOver) { this.layoutStore.sidebarLeftCollapsed(false); } }))); this.subscriptions.push(this.layoutStore.isSidebarLeftMouseOver.subscribe((/** * @param {?} value * @return {?} */ (value) => { this.isSidebarLeftMouseOver = value; if (this.isSidebarLeftExpandOnOver) { this.layoutStore.sidebarLeftCollapsed(!value); } }))); this.subscriptions.push(this.layoutStore.isSidebarLeftExpandOnOver.subscribe((/** * @param {?} value * @return {?} */ (value) => { this.isSidebarLeftExpandOnOver = value; if (this.windowInnerWidth > 767 && this.isSidebarLeftCollapsed !== undefined) { this.layoutStore.sidebarLeftCollapsed(value); } }))); this.subscriptions.push(this.layoutStore.isSidebarLeftCollapsed.subscribe((/** * @param {?} value * @return {?} */ (value) => { this.isSidebarLeftCollapsed = value; if (this.windowInnerWidth <= 767) { if (value) { this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-open'); } else { this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-open'); } } else { if (this.isSidebarLeftExpandOnOver && !this.isSidebarLeftMouseOver && !value) { this.layoutStore.sidebarLeftExpandOnOver(false); } if (value) { this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-collapse'); if (this.isSidebarLeftExpandOnOver) { this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-expanded-on-hover'); } } else { this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-collapse'); if (this.isSidebarLeftExpandOnOver) { this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-expanded-on-hover'); } } } }))); this.subscriptions.push(this.layoutStore.isSidebarLeftMini.subscribe((/** * @param {?} value * @return {?} */ (value) => { if (value) { this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-mini'); } else { this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-mini'); } }))); } /** * [setMenuListeners description] * \@method setMenuListeners * @param {?} url * @return {?} */ setMenuListeners(url) { if (url === '/') { this.activeItems(url); this.changeDetectorRef.detectChanges(); } else { /** @type {?} */ const primaryOutlet = this.router.parseUrl(url).root.children[PRIMARY_OUTLET]; if (primaryOutlet) { // console.log(primaryOutlet) // this.activeItems('/' + primaryOutlet.toString()); this.activeItems(primaryOutlet.toString()); this.changeDetectorRef.detectChanges(); } } if (this.windowInnerWidth <= 767 || this.isSidebarLeftExpandOnOver) { this.layoutStore.sidebarLeftCollapsed(true); } } /** * [getIconClasses description] * \@method getIconClasses * @param {?} item [description] * @return {?} [description] */ getIconClasses(item) { if (item.iconClasses || item.iconClasses === '') { return item.iconClasses; } else { return 'fa fa-dot-circle-o'; } } /** * [visibilityStateStart description] * \@method visibilityStateStart * @param {?} event [description] * @return {?} */ visibilityStateStart(event) { this.runningAnimations++; this.ngZone.runOutsideAngular((/** * @return {?} */ () => { setTimeout((/** * @return {?} */ () => { this.runningAnimations--; if (!this.runningAnimations) { this.layoutStore.setSidebarLeftElementHeight(this.sidebarElement.nativeElement.offsetHeight); } }), event.totalTime); })); } /** * [uncollapseItemParents description] * \@method uncollapseItemParents * @private * @param {?} item [description] * @param {?=} isActive [description] * @return {?} */ uncollapseItemParents(item, isActive = false) { if (isActive) { item.isActive = true; this.activatedItems.push(item); } // console.log(item) // console.log(isActive) item.isCollapsed = false; this.collapsedItems.push(item); if (item.parentId) { this.uncollapseItemParents(this.itemsByIds[item.parentId], isActive); } } /** * [findItemsByUrl description] * \@method findItemsByUrl * @private * @param {?} url [description] * @param {?} items [description] * @param {?=} returnItems [description] * @return {?} [description] */ findItemsByUrl(url, items, returnItems = []) { items.forEach((/** * @param {?} item * @return {?} */ (item) => { if (item.route === url) { returnItems.push(item); } else if (item.children) { this.findItemsByUrl(url, item.children, returnItems); } else if (url.includes(item.route) && item.route != '/') { returnItems.push(item); } })); return returnItems; } /** * [activeItems description] * \@method activeItems * @private * @param {?} url [description] * @return {?} */ activeItems(url) { this.activatedItems.forEach((/** * @param {?} item * @return {?} */ (item) => { item.isActive = false; })); this.activatedItems = []; this.collapsedItems.forEach((/** * @param {?} item * @return {?} */ (item) => { item.isActive = false; item.isCollapsed = true; })); this.collapsedItems = []; // console.log(url) /** @type {?} */ const items = this.findItemsByUrl(url, this.menu); items.forEach((/** * @param {?} item * @return {?} */ item => { item.isActive = true; this.uncollapseItemParents(item, true); this.activatedItems.push(item); })); } /** * [monkeyPatchMenu description] * \@method monkeyPatchMenu * @private * @param {?} items [description] * @param {?=} parentId [description] * @return {?} */ monkeyPatchMenu(items, parentId) { items.forEach((/** * @param {?} item * @param {?} index * @return {?} */ (item, index) => { item.id = parentId ? Number(parentId + '' + (index + 1)) : index + 1; if (parentId) { item.parentId = parentId; } if (!item.disableCollapse) { item.isCollapsed = true; } item.isActive = false; if (parentId || item.children) { this.itemsByIds[item.id] = item; } if (item.children) { this.monkeyPatchMenu(item.children, item.id); } })); } /** * [setMenuTogglesListeners description] * \@method setMenuTogglesListeners * @private * @return {?} */ setMenuTogglesListeners() { this.toggleListeners = removeListeners(this.toggleListeners); this.ngZone.runOutsideAngular((/** * @return {?} */ () => { this.sidebarLeftToggleDirectives.forEach((/** * @param {?} menuToggle * @return {?} */ (menuToggle) => { this.toggleListeners.push(this.renderer2.listen(menuToggle.elementRef.nativeElement, 'click', (/** * @param {?} event * @return {?} */ (event) => { event.preventDefault(); if (menuToggle.item.isCollapsed) { this.collapsedItems.forEach((/** * @param {?} item * @return {?} */ (item) => { if (!item.disableCollapse) { item.isCollapsed = true; } })); this.collapsedItems = []; this.uncollapseItemParents(menuToggle.item); } else { menuToggle.item.isCollapsed = !menuToggle.item.isCollapsed; } this.changeDetectorRef.detectChanges(); }))); })); })); } /** * [checkMenuWithoutChildren description] * \@method checkMenuWithoutChildren * @private * @return {?} */ checkMenuWithoutChildren() { /** @type {?} */ let menuHaveChildren; this.menu.forEach((/** * @param {?} item * @return {?} */ (item) => { if (item.children) { return menuHaveChildren = true; } })); if (!menuHaveChildren) { this.ngZone.runOutsideAngular((/** * @return {?} */ () => { setTimeout((/** * @return {?} */ () => { this.layoutStore.setSidebarLeftElementHeight(this.sidebarElement.nativeElement.offsetHeight); })); })); } } /** * [setSidebarHeight description] * \@method setSidebarHeight * @private * @return {?} */ setSidebarHeight() { if (this.layout === 'fixed') { /** @type {?} */ const height = this.windowInnerHeight - this.headerService.offsetHeight; if (height && height !== this.sidebarHeight) { this.sidebarHeight = height; this.sidebarOverflow = 'auto'; this.changeDetectorRef.detectChanges(); } } else if (this.sidebarHeight) { this.sidebarOverflow = this.sidebarHeight = null; this.changeDetectorRef.detectChanges(); } } } SidebarLeftComponent.decorators = [ { type: Component, args: [{ selector: 'mk-layout-sidebar-left', template: "<aside class=\"main-sidebar\">\r\n <section class=\"sidebar\" #sidebarElement [style.height.px]=\"sidebarHeight\" [style.overflow]=\"sidebarOverflow\">\r\n <ng-content></ng-content>\r\n <ul class=\"sidebar-menu\">\r\n <ng-container *ngFor=\"let item of menu\">\r\n <ng-container *ngTemplateOutlet=\"sidebarInner; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n </section>\r\n</aside>\r\n\r\n<ng-template #sidebarInner let-item=\"item\">\r\n <li [class.active]=\"item.isActive\" [class.header]=\"item.separator\" [class.menu-open]=\"!item.isCollapsed\">\r\n <span *ngIf=\"item.separator\">{{item.label}}</span>\r\n <a *ngIf=\"!item.separator && item.route\" [routerLink]=\"item.route\">\r\n <i [class]=\"getIconClasses(item)\"></i><span>{{item.label}}</span>\r\n <span *ngIf=\"item.children || item.pullRights\" class=\"pull-right-container\">\r\n <span *ngFor=\"let rightItem of item.pullRights\"\r\n class=\"pull-right {{rightItem.classes}}\">{{rightItem.text}}</span>\r\n <i *ngIf=\"!item.pullRights\" class=\"fa fa-angle-left pull-right\"></i>\r\n </span>\r\n </a>\r\n <a *ngIf=\"!item.separator && !item.route\" href=\"#\" [mkMenuToggle]=\"item\">\r\n <i [class]=\"getIconClasses(item)\"></i><span>{{item.label}}</span>\r\n <span *ngIf=\"item.children || item.pullRights\" class=\"pull-right-container\">\r\n <span *ngFor=\"let rightItem of item.pullRights\"\r\n class=\"pull-right {{rightItem.classes}}\">{{rightItem.text}}</span>\r\n <i *ngIf=\"!item.pullRights\" class=\"fa fa-angle-left pull-right\"></i>\r\n </span>\r\n </a>\r\n <ul *ngIf=\"item.children\" [mkCollapseAnimation]=\"item.isCollapsed\"\r\n (mkCollapseAnimation.start)=\"visibilityStateStart($event)\" class=\"treeview-menu\">\r\n <ng-container *ngFor=\"let item of item.children\">\r\n <ng-container *ngTemplateOutlet=\"sidebarInner; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n </li>\r\n</ng-template>", changeDetection: ChangeDetectionStrategy.OnPush, styles: [".treeview-menu.collapse{display:none}.treeview-menu,.treeview-menu.collapse.in{display:block}"] }] } ]; /** @nocollapse */ SidebarLeftComponent.ctorParameters = () => [ { type: ChangeDetectorRef }, { type: LayoutStore }, { type: NgZone }, { type: Renderer2 }, { type: Router }, { type: RoutingService }, { type: WrapperService }, { type: HeaderService }, { type: ActivatedRoute } ]; SidebarLeftComponent.propDecorators = { sidebarElement: [{ type: ViewChild, args: ['sidebarElement', { static: true },] }], sidebarLeftToggleDirectives: [{ type: ViewChildren, args: [SidebarLeftToggleDirective,] }] }; if (false) { /** @type {?} */ SidebarLeftComponent.prototype.menu; /** @type {?} */ SidebarLeftComponent.prototype.sidebarHeight; /** @type {?} */ SidebarLeftComponent.prototype.sidebarOverflow; /** * @type {?} * @private */ SidebarLeftComponent.prototype.layout; /** * @type {?} * @private */ SidebarLeftComponent.prototype.isSidebarLeftCollapsed; /** * @type {?} * @private */ SidebarLeftComponent.prototype.isSidebarLeftExpandOnOver; /** * @type {?} * @private */ SidebarLeftComponent.prototype.isSidebarLeftMouseOver; /** * @type {?} * @private */ SidebarLeftComponent.prototype.windowInnerWidth; /** * @type {?} * @private */ SidebarLeftComponent.prototype.windowInnerHeight; /** * @type {?} * @private */ SidebarLeftComponent.prototype.collapsedItems; /** * @type {?} * @private */ SidebarLeftComponent.prototype.activatedItems; /** * @type {?} * @private */ SidebarLeftComponent.prototype.toggleListeners; /** * @type {?} * @private */ SidebarLeftComponent.prototype.listeners; /** * @type {?} * @private */ SidebarLeftComponent.prototype.itemsByIds; /** * @type {?} * @private */ SidebarLeftComponent.prototype.runningAnimations; /** * @type {?} * @private */ SidebarLeftComponent.prototype.subscriptions; /** * @type {?} * @private */ SidebarLeftComponent.prototype.activeUrl; /** * @type {?} * @private */ SidebarLeftComponent.prototype.initialized; /** @type {?} */ SidebarLeftComponent.prototype.sidebarElement; /** @type {?} */ SidebarLeftComponent.prototype.sidebarLeftToggleDirectives; /** * @type {?} * @private */ SidebarLeftComponent.prototype.changeDetectorRef; /** * @type {?} * @private */ SidebarLeftComponent.prototype.layoutStore; /** * @type {?} * @private */ SidebarLeftComponent.prototype.ngZone; /** * @type {?} * @private */ SidebarLeftComponent.prototype.renderer2; /** * @type {?} * @private */ SidebarLeftComponent.prototype.router; /** * @type {?} * @private */ SidebarLeftComponent.prototype.routingService; /** * @type {?} * @private */ SidebarLeftComponent.prototype.wrapperService; /** * @type {?} * @private */ SidebarLeftComponent.prototype.headerService; /** * @type {?} * @private */ SidebarLeftComponent.prototype.activatedRoute; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci1sZWZ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FkLWN1c3RvbS1saWIvIiwic291cmNlcyI6WyJsaWIvbGF5b3V0L3NpZGViYXItbGVmdC9zaWRlYmFyLWxlZnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ1ksdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQ3JFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFDbkUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc5RyxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQUV0RSwwQkFVQzs7O0lBVEcsa0JBQVc7O0lBQ1gsd0JBQWlCOztJQUNqQixxQkFBYzs7SUFDZCxxQkFBZTs7SUFDZiwyQkFBcUI7O0lBQ3JCLHdCQUF1Qjs7SUFDdkIsd0JBQW1COztJQUNuQiwyQkFBc0I7O0lBQ3RCLCtCQUEwQjs7QUFXOUIsTUFBTSxPQUFPLG9CQUFvQjs7Ozs7Ozs7Ozs7OztJQXFDN0IsWUFDWSxpQkFBb0MsRUFDcEMsV0FBd0IsRUFDeEIsTUFBYyxFQUNkLFNBQW9CLEVBQ3BCLE1BQWMsRUFDZCxjQUE4QixFQUM5QixjQUE4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MENBQXFEOzs7OztJQUNyRCxpREFBOEI7Ozs7O0lBQzlCLDZDQUEyQjs7Ozs7SUFDM0IseUNBQTBCOzs7OztJQUMxQiwyQ0FBNkI7O0lBRTdCLDhDQUFpRjs7SUFFakYsMkRBQW9IOzs7OztJQWNoSCxpREFBNEM7Ozs7O0lBQzVDLDJDQUFnQzs7Ozs7SUFDaEMsc0NBQXNCOzs7OztJQUN0Qix5Q0FBNEI7Ozs7O0lBQzVCLHNDQUFzQjs7Ozs7SUFDdEIsOENBQXNDOzs7OztJQUN0Qyw4Q0FBc0M7Ozs7O0lBQ3RDLDZDQUFvQzs7Ozs7SUFDcEMsOENBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBOZ1pvbmUsXHJcbiAgICBPbkRlc3Ryb3ksIE9uSW5pdCwgUXVlcnlMaXN0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEV2ZW50IGFzIFJvdXRlckV2ZW50LCBOYXZpZ2F0aW9uRW5kLCBQUklNQVJZX09VVExFVCwgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBBbmltYXRpb25FdmVudCB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvYW5pbWF0aW9ucy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyByZW1vdmVMaXN0ZW5lcnMsIHJlbW92ZVN1YnNjcmlwdGlvbnMgfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcclxuaW1wb3J0IHsgUm91dGluZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yb3V0aW5nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIZWFkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vaGVhZGVyL2hlYWRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5b3V0U3RvcmUgfSBmcm9tICcuLi9sYXlvdXQuc3RvcmUnO1xyXG5pbXBvcnQgeyBXcmFwcGVyU2VydmljZSB9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2lkZWJhckxlZnRUb2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuL3NpZGViYXItbGVmdC5kaXJlY3RpdmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJdGVtIHtcclxuICAgIGlkOiBudW1iZXI7XHJcbiAgICBwYXJlbnRJZDogbnVtYmVyO1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHJvdXRlPzogc3RyaW5nO1xyXG4gICAgaWNvbkNsYXNzZXM/OiBzdHJpbmc7XHJcbiAgICBjaGlsZHJlbj86IEFycmF5PEl0ZW0+O1xyXG4gICAgaXNBY3RpdmU/OiBib29sZWFuO1xyXG4gICAgaXNDb2xsYXBzZWQ/OiBib29sZWFuO1xyXG4gICAgZGlzYWJsZUNvbGxhcHNlPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSXRlbXMgPSBBcnJheTxJdGVtPjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdtay1sYXlvdXQtc2lkZWJhci1sZWZ0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9zaWRlYmFyLWxlZnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vc2lkZWJhci1sZWZ0LmNvbXBvbmVudC5jc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaWRlYmFyTGVmdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgICBwdWJsaWMgbWVudTogQXJyYXk8YW55PjtcclxuICAgIHB1YmxpYyBzaWRlYmFySGVpZ2h0OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgc2lkZWJhck92ZXJmbG93OiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBsYXlvdXQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgaXNTaWRlYmFyTGVmdENvbGxhcHNlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3ZlcjogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgaXNTaWRlYmFyTGVmdE1vdXNlT3ZlcjogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgd2luZG93SW5uZXJXaWR0aDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSB3aW5kb3dJbm5lckhlaWdodDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBjb2xsYXBzZWRJdGVtczogSXRlbXMgPSBbXTtcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkSXRlbXM6IEl0ZW1zID0gW107XHJcbiAgICBwcml2YXRlIHRvZ2dsZUxpc3RlbmVyczogQXJyYXk8RnVuY3Rpb24+ID0gW107XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyczogQXJyYXk8RnVuY3Rpb24+ID0gW107XHJcbiAgICBwcml2YXRlIGl0ZW1zQnlJZHM6IHsgW3Byb3BLZXk6IG51bWJlcl06IEl0ZW0gfSA9IHt9O1xyXG4gICAgcHJpdmF0ZSBydW5uaW5nQW5pbWF0aW9ucyA9IDA7XHJcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBbXTtcclxuICAgIHByaXZhdGUgYWN0aXZlVXJsOiBTdHJpbmc7XHJcbiAgICBwcml2YXRlIGluaXRpYWxpemVkOiBib29sZWFuO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3NpZGViYXJFbGVtZW50JywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHNpZGViYXJFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGRyZW4oU2lkZWJhckxlZnRUb2dnbGVEaXJlY3RpdmUpIHB1YmxpYyBzaWRlYmFyTGVmdFRvZ2dsZURpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxTaWRlYmFyTGVmdFRvZ2dsZURpcmVjdGl2ZT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEBtZXRob2QgY29uc3RydWN0b3JcclxuICAgICogQHBhcmFtICBjaGFuZ2VEZXRlY3RvclJlZiAgW2Rlc2NyaXB0aW9uXVxyXG4gICAgKiBAcGFyYW0gIGxheW91dFN0b3JlICAgICAgICBbZGVzY3JpcHRpb25dXHJcbiAgICAqIEBwYXJhbSAgbmdab25lICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cclxuICAgICogQHBhcmFtICByZW5kZXJlcjIgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAgKiBAcGFyYW0gIHJvdXRlciAgICAgICAgICAgICBbZGVzY3JpcHRpb25dXHJcbiAgICAqIEBwYXJhbSAgcm91dGluZ1NlcnZpY2UgICAgIFtkZXNjcmlwdGlvbl1cclxuICAgICogQHBhcmFtICB3cmFwcGVyU2VydmljZSAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAgKiBAcGFyYW0gIGhlYWRlclNlcnZpY2UgICAgICBbZGVzY3JpcHRpb25dXHJcbiAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBsYXlvdXRTdG9yZTogTGF5b3V0U3RvcmUsXHJcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxyXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB3cmFwcGVyU2VydmljZTogV3JhcHBlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBoZWFkZXJTZXJ2aWNlOiBIZWFkZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXHJcbiAgICApIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAgKiBAbWV0aG9kIG5nT25Jbml0XHJcbiAgICAgICAqL1xyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdE1lbnUuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tZW51ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMubW9ua2V5UGF0Y2hNZW51KHRoaXMubWVudSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldE1lbnVMaXN0ZW5lcnModGhpcy5hY3RpdmVVcmwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTaWRlYmFyTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldE1lbnVUb2dnbGVzTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNZW51QWN0aXZlVXJsLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlVXJsID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TWVudUxpc3RlbmVycyh2YWx1ZSk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMucm91dGluZ1NlcnZpY2UuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB1cmw7XHJcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICAgICAgICAgIHVybCA9IGV2ZW50LnVybDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHVybCA9IHRoaXMucm91dGVyLnVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVVybCA9IHVybDtcclxuICAgICAgICAgICAgdGhpcy5zZXRNZW51TGlzdGVuZXJzKHVybCk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHVybClcclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0U2lkZWJhckxpc3RlbmVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQG1ldGhvZCBuZ0FmdGVyVmlld0luaXRcclxuICAgICAqL1xyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMuc2V0TWVudVRvZ2dsZXNMaXN0ZW5lcnMoKTtcclxuICAgICAgICB0aGlzLmNoZWNrTWVudVdpdGhvdXRDaGlsZHJlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQG1ldGhvZCBuZ09uRGVzdHJveVxyXG4gICAgICovXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSByZW1vdmVTdWJzY3JpcHRpb25zKHRoaXMuc3Vic2NyaXB0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSByZW1vdmVMaXN0ZW5lcnModGhpcy5saXN0ZW5lcnMpO1xyXG4gICAgICAgIHRoaXMudG9nZ2xlTGlzdGVuZXJzID0gcmVtb3ZlTGlzdGVuZXJzKHRoaXMudG9nZ2xlTGlzdGVuZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtzZXRTaWRlYmFyTGlzdGVuZXJzIGRlc2NyaXB0aW9uXVxyXG4gICAgICogQG1ldGhvZCBzZXRTaWRlYmFyTGlzdGVuZXJzXHJcbiAgICAgKi9cclxuICAgIHNldFNpZGViYXJMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5sYXlvdXQuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2lkZWJhckhlaWdodCgpO1xyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS53aW5kb3dJbm5lckhlaWdodC5zdWJzY3JpYmUoKHZhbHVlOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy53aW5kb3dJbm5lckhlaWdodCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNpZGViYXJIZWlnaHQoKTtcclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNZW51LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHRoaXMucmVuZGVyZXIyLmxpc3Rlbih0aGlzLnNpZGViYXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdtb3VzZWVudGVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdE1vdXNlT3Zlcih0cnVlKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHRoaXMucmVuZGVyZXIyLmxpc3Rlbih0aGlzLnNpZGViYXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdE1vdXNlT3ZlcihmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS53aW5kb3dJbm5lcldpZHRoLnN1YnNjcmliZSgodmFsdWU6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLndpbmRvd0lubmVyV2lkdGggPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQgJiYgdGhpcy53aW5kb3dJbm5lcldpZHRoIDw9IDc2Nykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdENvbGxhcHNlZCh0cnVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLndpbmRvd0lubmVyV2lkdGggPiA3NjcgJiYgdGhpcy5pc1NpZGViYXJMZWZ0Q29sbGFwc2VkICYmICF0aGlzLmlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRDb2xsYXBzZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLmlzU2lkZWJhckxlZnRNb3VzZU92ZXIuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzU2lkZWJhckxlZnRNb3VzZU92ZXIgPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3Zlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdENvbGxhcHNlZCghdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLmlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXIuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXIgPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMud2luZG93SW5uZXJXaWR0aCA+IDc2NyAmJiB0aGlzLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQgIT09IHVuZGVmaW5lZCkge1xy