UNPKG

ontimize-web-ngx

Version:
310 lines 45.5 kB
import { Location } from '@angular/common'; import { EventEmitter, Injectable, Injector } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; import { BehaviorSubject, ReplaySubject } from 'rxjs'; import { filter, map } from 'rxjs/operators'; import { ObservableWrapper } from '../util/async'; import { Codes } from '../util/codes'; import { Util } from '../util/util'; import { LocalStorageService } from './local-storage.service'; import { OBreadcrumbService } from './o-breadcrumb.service'; import * as i0 from "@angular/core"; export class ONavigationItem { constructor(value) { this.url = value.url ? value.url : ''; this.queryParams = value[Codes.QUERY_PARAMS] ? value[Codes.QUERY_PARAMS] : {}; this.formRoutes = value.formRoutes; this.formLayoutRoutes = value.formLayoutRoutes; this.activeFormMode = value.activeFormMode; this.keysValues = value.keysValues; this.queryConfiguration = value.queryConfiguration; } getActiveModePath() { let result; if (Util.isDefined(this.activeFormMode)) { result = (this.formRoutes || {})[this.activeFormMode]; } return result; } isInsertFormRoute() { return this.activeFormMode === 'insertFormRoute'; } getInsertFormRoute() { const routes = this.formRoutes; return routes ? (routes.insertFormRoute || Codes.DEFAULT_INSERT_ROUTE) : Codes.DEFAULT_INSERT_ROUTE; } getEditFormRoute() { const routes = this.formRoutes; return routes ? (routes.editFormRoute || Codes.DEFAULT_EDIT_ROUTE) : Codes.DEFAULT_EDIT_ROUTE; } getDetailFormRoute() { const routes = this.formRoutes; return routes ? (routes.detailFormRoute || Codes.DEFAULT_DETAIL_ROUTE) : Codes.DEFAULT_DETAIL_ROUTE; } isMainFormLayoutManagerComponent() { return Util.isDefined(this.formLayoutRoutes); } isMainNavigationComponent() { return Util.isDefined(this.formRoutes) && this.formRoutes.isMainNavigationComponent; } getFormRoutes() { return this.formRoutes; } setFormRoutes(arg) { if (arg && arg.mainFormLayoutManagerComponent) { this.formLayoutRoutes = arg; } else { this.formRoutes = arg; } } deleteActiveFormMode() { this.activeFormMode = undefined; } } const MAXIMIUM_NAVIGATION_HEAP_SIZE = 15; export class NavigationService { constructor(injector) { this.injector = injector; this.currentTitle = null; this.visible = true; this.navigationItems = []; this.allNavigationItems = []; this.navigationEvents$ = new ReplaySubject(1); this._titleEmitter = new EventEmitter(); this._visibleEmitter = new EventEmitter(); this._sidenavEmitter = new EventEmitter(); this.isNavigationSubject = new BehaviorSubject(false); this.isNavigation$ = this.isNavigationSubject.asObservable(); this.router = this.injector.get(Router); this.oBreadcrumbService = this.injector.get(OBreadcrumbService); this.localStorageService = this.injector.get(LocalStorageService); this.location = this.injector.get(Location); this.location.subscribe(val => { const previousRoute = this.getPreviousRouteData(); const qParams = Object.keys(previousRoute.queryParams); const arr = []; qParams.forEach((p) => { arr.push(`${p}=${previousRoute.queryParams[p]}`); }); let fullUrl = `/${previousRoute.url}`; if (arr.length > 0) { fullUrl = `/${previousRoute.url}?${arr.join('&')}`; } if (fullUrl === val.url) { this.navigationItems.pop(); } }); } set isNavigating(value) { this.isNavigationSubject.next(value); } get isNavigating() { return this.isNavigationSubject.getValue(); } initialize() { this.router.events.pipe(filter(event => event instanceof NavigationEnd), map(() => this.router.routerState.root), map(route => { while (route.firstChild) { route = route.firstChild; } return route; }), filter(route => route.outlet === 'primary')).subscribe(this.parseNavigationItems.bind(this)); } buildBreadcrumbsForRoute(activatedRoute) { const breadcrumbs = []; let url = ''; let route = activatedRoute.firstChild; while (route.firstChild) { if (route.url.length) { const pRoute = this.parseRoute(url, route); breadcrumbs.push(pRoute); url = pRoute.route; } route = route.firstChild; } const parsedRoute = this.parseRoute(url, route); breadcrumbs.push(parsedRoute); this.oBreadcrumbService.breadcrumbs$.next(breadcrumbs); } parseRoute(route, activatedRoute) { let label = ''; for (let i = 0, len = activatedRoute.url.length; i < len; i++) { const segment = activatedRoute.url[i]; if (label.length === 0) { label = label.length > 0 ? ('/' + segment.path) : segment.path; route += '/' + segment.path; } } return { route, label, queryParams: activatedRoute.queryParams }; } parseNavigationItems() { const storedNavigation = this.getStoredData(); const route = this.router.routerState.root.snapshot; const url = this.router.routerState.snapshot.url.split('?')[0]; this.buildBreadcrumbsForRoute(route); const lastStored = storedNavigation[storedNavigation.length - 1]; if (!lastStored || lastStored.url !== url) { const navigationItem = new ONavigationItem({ url, queryParams: route.queryParams }); this.navigationItems.push(navigationItem); this.setNavigationItems(this.navigationItems); } else { this.navigationItems = storedNavigation; } } setNavigationItems(navigationItems) { this.navigationItems = navigationItems; this.storeNavigation(); this.navigationEvents$.next(navigationItems); } getDataToStore() { return this.navigationItems; } getComponentKey() { return NavigationService.NAVIGATION_STORAGE_KEY; } storeNavigation() { if (this.localStorageService) { this.localStorageService.updateComponentStorage(this); } } setTitle(title) { this.currentTitle = title; this._emitTitleChanged(this.currentTitle); } setVisible(visible) { this.visible = visible; this._emitVisibleChanged(this.visible); } openSidenav() { this._emitOpenSidenav(); } closeSidenav() { this._emitCloseSidenav(); } onTitleChange(onNext) { return ObservableWrapper.subscribe(this._titleEmitter, onNext); } onVisibleChange(onNext) { return ObservableWrapper.subscribe(this._visibleEmitter, onNext); } onSidenavChange(onNext) { return ObservableWrapper.subscribe(this._sidenavEmitter, onNext); } _emitTitleChanged(title) { ObservableWrapper.callEmit(this._titleEmitter, title); } _emitVisibleChanged(visible) { ObservableWrapper.callEmit(this._visibleEmitter, visible); } _emitOpenSidenav() { ObservableWrapper.callEmit(this._sidenavEmitter, 'open'); } _emitCloseSidenav() { ObservableWrapper.callEmit(this._sidenavEmitter, 'close'); } storeFormRoutes(routes, activeMode, queryConf) { if (this.navigationItems.length > 0) { this.navigationItems[this.navigationItems.length - 1].setFormRoutes(routes); this.navigationItems[this.navigationItems.length - 1].activeFormMode = activeMode; if (queryConf) { this.navigationItems[this.navigationItems.length - 1].keysValues = queryConf.keysValues; delete queryConf.keysValues; this.navigationItems[this.navigationItems.length - 1].queryConfiguration = Object.keys(queryConf).length > 0 ? queryConf : null; } this.storeNavigation(); } } getStoredData() { const storageData = this.localStorageService.getComponentStorage(this); const result = []; Object.keys(storageData).forEach(key => result.push(new ONavigationItem(storageData[key]))); return result; } getPreviousRouteData() { let result; const len = this.navigationItems.length; if (len >= 2) { result = this.navigationItems[len - 2]; if (result && result.formRoutes && result.formRoutes.mainFormLayoutManagerComponent && this.navigationItems[len - 3]) { const parent = this.navigationItems[len - 3]; if (parent.isMainFormLayoutManagerComponent()) { result = parent; } } } return result; } getLastMainNavigationRouteData() { const routeMatches = []; const items = this.navigationItems.slice().reverse() .map((item, i) => { let currentLocation = this.location.path().substr(1); if (currentLocation.includes('?')) { currentLocation = currentLocation.substring(0, currentLocation.indexOf('?')); } const arr1 = item.url.substr(1).split('/'); const arr2 = currentLocation.split('/'); let result = 0; let index = -1; while (++index <= arr1.length && index <= arr2.length) { routeMatches[i] = (arr1[index] === arr2[index]) ? result++ : result; } return item; }); if (!routeMatches.length) { return void 0; } let maxMatches = routeMatches.reduce((a, b) => Math.max(a, b)); const lastNavItem = this.navigationItems[this.navigationItems.length - 1]; if (!lastNavItem.isMainNavigationComponent() && !lastNavItem.isMainFormLayoutManagerComponent()) { maxMatches--; } let itemResult = void 0; while (!itemResult && maxMatches >= 0) { itemResult = items.find((item, i) => (item.isMainNavigationComponent() || item.isMainFormLayoutManagerComponent()) && routeMatches[i] === maxMatches); maxMatches--; } return itemResult; } removeLastItem() { this.navigationItems.pop(); this.storeNavigation(); } removeLastItemsUntilMain() { const lastMain = this.getLastMainNavigationRouteData(); if (!Util.isDefined(lastMain)) { return false; } const index = this.navigationItems.indexOf(lastMain); this.navigationItems = this.navigationItems.slice(0, index + 1); this.storeNavigation(); return true; } isCurrentRoute(route) { let currentRoute = this.router.routerState.snapshot.url; currentRoute = currentRoute.split('?')[0]; return route === currentRoute; } getLastItem() { let result; if (this.navigationItems.length > 0) { result = this.navigationItems[this.navigationItems.length - 1]; } return result; } deleteActiveFormMode(arg) { arg.deleteActiveFormMode(); this.storeNavigation(); } } NavigationService.NAVIGATION_STORAGE_KEY = 'nav_service'; NavigationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NavigationService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); NavigationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NavigationService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NavigationService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL3NlcnZpY2VzL25hdmlnYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBMEIsYUFBYSxFQUFFLE1BQU0sRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJN0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFVNUQsTUFBTSxPQUFPLGVBQWU7SUFTMUIsWUFBWSxLQUFVO1FBQ3BCLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMs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bXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIsIFVybFNlZ21lbnQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgSUxvY2FsU3RvcmFnZUNvbXBvbmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvbG9jYWwtc3RvcmFnZS1jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9CcmVhZGNydW1iIH0gZnJvbSAnLi4vdHlwZXMvby1icmVhZGNydW1iLWl0ZW0udHlwZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlV3JhcHBlciB9IGZyb20gJy4uL3V0aWwvYXN5bmMnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi91dGlsL2NvZGVzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vbG9jYWwtc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9CcmVhZGNydW1iU2VydmljZSB9IGZyb20gJy4vby1icmVhZGNydW1iLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBPTmF2aWdhdGlvblJvdXRlcyA9IHtcbiAgbWFpbkZvcm1MYXlvdXRNYW5hZ2VyQ29tcG9uZW50PzogYm9vbGVhbjtcbiAgaXNNYWluTmF2aWdhdGlvbkNvbXBvbmVudD86IGJvb2xlYW47XG4gIGRldGFpbEZvcm1Sb3V0ZTogc3RyaW5nO1xuICBlZGl0Rm9ybVJvdXRlOiBzdHJpbmc7XG4gIGluc2VydEZvcm1Sb3V0ZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIE9OYXZpZ2F0aW9uSXRlbSB7XG4gIHVybDogc3RyaW5nO1xuICBxdWVyeVBhcmFtczogb2JqZWN0O1xuICBhY3RpdmVGb3JtTW9kZTogc3RyaW5nO1xuICBmb3JtUm91dGVzOiBPTmF2aWdhdGlvblJvdXRlcztcbiAgZm9ybUxheW91dFJvdXRlczogT05hdmlnYXRpb25Sb3V0ZXM7XG4gIGtleXNWYWx1ZXM6IGFueTtcbiAgcXVlcnlDb25maWd1cmF0aW9uOiBhbnk7XG5cbiAgY29uc3RydWN0b3IodmFsdWU6IGFueSkge1xuICAgIHRoaXMudXJsID0gdmFsdWUudXJsID8gdmFsdWUudXJsIDogJyc7XG4gICAgdGhpcy5xdWVyeVBhcmFtcyA9IHZhbHVlW0NvZGVzLlFVRVJZX1BBUkFNU10gPyB2YWx1ZVtDb2Rlcy5RVUVSWV9QQVJBTVNdIDoge307XG4gICAgdGhpcy5mb3JtUm91dGVzID0gdmFsdWUuZm9ybVJvdXRlcztcbiAgICB0aGlzLmZvcm1MYXlvdXRSb3V0ZXMgPSB2YWx1ZS5mb3JtTGF5b3V0Um91dGVzO1xuICAgIHRoaXMuYWN0aXZlRm9ybU1vZGUgPSB2YWx1ZS5hY3RpdmVGb3JtTW9kZTtcbiAgICB0aGlzLmtleXNWYWx1ZXMgPSB2YWx1ZS5rZXlzVmFsdWVzO1xuICAgIHRoaXMucXVlcnlDb25maWd1cmF0aW9uID0gdmFsdWUucXVlcnlDb25maWd1cmF0aW9uO1xuICB9XG5cbiAgZ2V0QWN0aXZlTW9kZVBhdGgoKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmFjdGl2ZUZvcm1Nb2RlKSkge1xuICAgICAgcmVzdWx0ID0gKHRoaXMuZm9ybVJvdXRlcyB8fCB7fSlbdGhpcy5hY3RpdmVGb3JtTW9kZV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpc0luc2VydEZvcm1Sb3V0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVGb3JtTW9kZSA9PT0gJ2luc2VydEZvcm1Sb3V0ZSc7XG4gIH1cblxuICBnZXRJbnNlcnRGb3JtUm91dGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCByb3V0ZXMgPSB0aGlzLmZvcm1Sb3V0ZXM7XG4gICAgcmV0dXJuIHJvdXRlcyA/IChyb3V0ZXMuaW5zZXJ0Rm9ybVJvdXRlIHx8IENvZGVzLkRFRkFVTFRfSU5TRVJUX1JPVVRFKSA6IENvZGVzLkRFRkFVTFRfSU5TRVJUX1JPVVRFO1xuICB9XG5cbiAgZ2V0RWRpdEZvcm1Sb3V0ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJvdXRlcyA9IHRoaXMuZm9ybVJvdXRlcztcbiAgICByZXR1cm4gcm91dGVzID8gKHJvdXRlcy5lZGl0Rm9ybVJvdXRlIHx8IENvZGVzLkRFRkFVTFRfRURJVF9ST1VURSkgOiBDb2Rlcy5ERUZBVUxUX0VESVRfUk9VVEU7XG4gIH1cblxuICBnZXREZXRhaWxGb3JtUm91dGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCByb3V0ZXMgPSB0aGlzLmZvcm1Sb3V0ZXM7XG4gICAgcmV0dXJuIHJvdXRlcyA/IChyb3V0ZXMuZGV0YWlsRm9ybVJvdXRlIHx8IENvZGVzLkRFRkFVTFRfREVUQUlMX1JPVVRFKSA6IENvZGVzLkRFRkFVTFRfREVUQUlMX1JPVVRFO1xuICB9XG5cbiAgaXNNYWluRm9ybUxheW91dE1hbmFnZXJDb21wb25lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKHRoaXMuZm9ybUxheW91dFJvdXRlcyk7XG4gIH1cblxuICBpc01haW5OYXZpZ2F0aW9uQ29tcG9uZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLmZvcm1Sb3V0ZXMpICYmIHRoaXMuZm9ybVJvdXRlcy5pc01haW5OYXZpZ2F0aW9uQ29tcG9uZW50O1xuICB9XG5cbiAgZ2V0Rm9ybVJvdXRlcygpOiBPTmF2aWdhdGlvblJvdXRlcyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVJvdXRlcztcbiAgfVxuXG4gIHNldEZvcm1Sb3V0ZXMoYXJnOiBPTmF2aWdhdGlvblJvdXRlcykge1xuICAgIGlmIChhcmcgJiYgYXJnLm1haW5Gb3JtTGF5b3V0TWFuYWdlckNvbXBvbmVudCkge1xuICAgICAgdGhpcy5mb3JtTGF5b3V0Um91dGVzID0gYXJnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1Sb3V0ZXMgPSBhcmc7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlQWN0aXZlRm9ybU1vZGUoKSB7XG4gICAgdGhpcy5hY3RpdmVGb3JtTW9kZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5jb25zdCBNQVhJTUlVTV9OQVZJR0FUSU9OX0hFQVBfU0laRSA9IDE1O1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uU2VydmljZSBpbXBsZW1lbnRzIElMb2NhbFN0b3JhZ2VDb21wb25lbnQge1xuXG4gIHB1YmxpYyBzdGF0aWMgTkFWSUdBVElPTl9TVE9SQUdFX0tFWTogc3RyaW5nID0gJ25hdl9zZXJ2aWNlJztcblxuICBwdWJsaWMgY3VycmVudFRpdGxlOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgdmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJvdGVjdGVkIG5hdmlnYXRpb25JdGVtczogQXJyYXk8T05hdmlnYXRpb25JdGVtPiA9IFtdO1xuICBwcm90ZWN0ZWQgYWxsTmF2aWdhdGlvbkl0ZW1zOiBPTmF2aWdhdGlvbkl0ZW1bXSA9IFtdO1xuXG4gIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcjtcblxuICBwcm90ZWN0ZWQgb0JyZWFkY3J1bWJTZXJ2aWNlOiBPQnJlYWRjcnVtYlNlcnZpY2U7XG4gIHByb3RlY3RlZCBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgbG9jYXRpb246IExvY2F0aW9uO1xuXG4gIHB1YmxpYyBuYXZpZ2F0aW9uRXZlbnRzJDogUmVwbGF5U3ViamVjdDxBcnJheTxPTmF2aWdhdGlvbkl0ZW0+PiA9IG5ldyBSZXBsYXlTdWJqZWN0PEFycmF5PE9OYXZpZ2F0aW9uSXRlbT4+KDEpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RpdGxlRW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Zpc2libGVFbWl0dGVyOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NpZGVuYXZFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXG4gIHByb3RlY3RlZCBpc05hdmlnYXRpb25TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHVibGljIGlzTmF2aWdhdGlvbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmlzTmF2aWdhdGlvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvclxuICApIHtcbiAgICB0aGlzLnJvdXRlciA9IHRoaXMuaW5qZWN0b3IuZ2V0KFJvdXRlcik7XG4gICAgdGhpcy5vQnJlYWRjcnVtYlNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChPQnJlYWRjcnVtYlNlcnZpY2UpO1xuICAgIHRoaXMubG9jYWxTdG9yYWdlU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KExvY2FsU3RvcmFnZVNlcnZpY2UpO1xuICAgIHRoaXMubG9jYXRpb24gPSB0aGlzLmluamVjdG9yLmdldChMb2NhdGlvbik7XG4gICAgdGhpcy5sb2NhdGlvbi5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgIGNvbnN0IHByZXZpb3VzUm91dGUgPSB0aGlzLmdldFByZXZpb3VzUm91dGVEYXRhKCk7XG4gICAgICBjb25zdCBxUGFyYW1zID0gT2JqZWN0LmtleXMocHJldmlvdXNSb3V0ZS5xdWVyeVBhcmFtcyk7XG4gICAgICBjb25zdCBhcnIgPSBbXTtcbiAgICAgIHFQYXJhbXMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICBhcnIucHVzaChgJHtwfT0ke3ByZXZpb3VzUm91dGUucXVlcnlQYXJhbXNbcF19YCk7XG4gICAgICB9KTtcbiAgICAgIGxldCBmdWxsVXJsID0gYC8ke3ByZXZpb3VzUm91dGUudXJsfWA7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZnVsbFVybCA9IGAvJHtwcmV2aW91c1JvdXRlLnVybH0/JHthcnIuam9pbignJicpfWA7XG4gICAgICB9XG4gICAgICBpZiAoZnVsbFVybCA9PT0gdmFsLnVybCkge1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25JdGVtcy5wb3AoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldCBpc05hdmlnYXRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTmF2aWdhdGlvblN1YmplY3QubmV4dCh2YWx1ZSk7XG4gIH1cbiAgZ2V0IGlzTmF2aWdhdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc05hdmlnYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XG4gIH1cblxuXG4gIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoXG4gICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcbiAgICAgIG1hcCgoKSA9PiB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5yb290KSxcbiAgICAgIG1hcChyb3V0ZSA9PiB7XG4gICAgICAgIHdoaWxlIChyb3V0ZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgcm91dGUgPSByb3V0ZS5maXJzdENoaWxkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3V0ZTtcbiAgICAgIH0pLFxuICAgICAgZmlsdGVyKHJvdXRlID0+IHJvdXRlLm91dGxldCA9PT0gJ3ByaW1hcnknKVxuICAgICkuc3Vic2NyaWJlKHRoaXMucGFyc2VOYXZpZ2F0aW9uSXRlbXMuYmluZCh0aGlzKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRCcmVhZGNydW1ic0ZvclJvdXRlKGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KSB7XG4gICAgY29uc3QgYnJlYWRjcnVtYnM6IE9CcmVhZGNydW1iW10gPSBbXTtcbiAgICBsZXQgdXJsID0gJyc7XG4gICAgbGV0IHJvdXRlID0gYWN0aXZhdGVkUm91dGUuZmlyc3RDaGlsZDtcbiAgICB3aGlsZSAocm91dGUuZmlyc3RDaGlsZCkge1xuICAgICAgaWYgKHJvdXRlLnVybC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcFJvdXRlID0gdGhpcy5wYXJzZVJvdXRlKHVybCwgcm91dGUpO1xuICAgICAgICBicmVhZGNydW1icy5wdXNoKHBSb3V0ZSk7XG4gICAgICAgIHVybCA9IHBSb3V0ZS5yb3V0ZTtcbiAgICAgIH1cbiAgICAgIHJvdXRlID0gcm91dGUuZmlyc3RDaGlsZDtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkUm91dGUgPSB0aGlzLnBhcnNlUm91dGUodXJsLCByb3V0ZSk7XG4gICAgYnJlYWRjcnVtYnMucHVzaChwYXJzZWRSb3V0ZSk7XG5cbiAgICB0aGlzLm9CcmVhZGNydW1iU2VydmljZS5icmVhZGNydW1icyQubmV4dChicmVhZGNydW1icyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VSb3V0ZShyb3V0ZTogc3RyaW5nLCBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IE9CcmVhZGNydW1iIHtcbiAgICBsZXQgbGFiZWwgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYWN0aXZhdGVkUm91dGUudXJsLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBzZWdtZW50OiBVcmxTZWdtZW50ID0gYWN0aXZhdGVkUm91dGUudXJsW2ldO1xuICAgICAgaWYgKGxhYmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsYWJlbCA9IGxhYmVsLmxlbmd0aCA+IDAgPyAoJy8nICsgc2VnbWVudC5wYXRoKSA6IHNlZ21lbnQucGF0aDtcbiAgICAgICAgcm91dGUgKz0gJy8nICsgc2VnbWVudC5wYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByb3V0ZSwgbGFiZWwsIHF1ZXJ5UGFyYW1zOiBhY3RpdmF0ZWRSb3V0ZS5xdWVyeVBhcmFtcyB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlTmF2aWdhdGlvbkl0ZW1zKCkge1xuICAgIGNvbnN0IHN0b3JlZE5hdmlnYXRpb246IE9OYXZpZ2F0aW9uSXRlbVtdID0gdGhpcy5nZXRTdG9yZWREYXRhKCk7XG4gICAgY29uc3Qgcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgPSB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5yb290LnNuYXBzaG90O1xuICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybC5zcGxpdCgnPycpWzBdO1xuICAgIHRoaXMuYnVpbGRCcmVhZGNydW1ic0ZvclJvdXRlKHJvdXRlKTtcbiAgICBjb25zdCBsYXN0U3RvcmVkOiBhbnkgPSBzdG9yZWROYXZpZ2F0aW9uW3N0b3JlZE5hdmlnYXRpb24ubGVuZ3RoIC0gMV07XG4gICAgaWYgKCFsYXN0U3RvcmVkIHx8IGxhc3RTdG9yZWQudXJsICE9PSB1cmwpIHtcbiAgICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtID0gbmV3IE9OYXZpZ2F0aW9uSXRlbSh7IHVybCwgcXVlcnlQYXJhbXM6IHJvdXRlLnF1ZXJ5UGFyYW1zIH0pO1xuXG4gICAgICB0aGlzLm5hdmlnYXRpb25JdGVtcy5wdXNoKG5hdmlnYXRpb25JdGVtKTtcbiAgICAgIHRoaXMuc2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMubmF2aWdhdGlvbkl0ZW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9pZiBsYXN0U3RvcmVkLnVybCA9PSB1cmwsIGl0IGlzIGJlY2F1c2UgdGhlIHBhZ2UgaXMgcmVsb2FkZWRcbiAgICAgIHRoaXMubmF2aWdhdGlvbkl0ZW1zID0gc3RvcmVkTmF2aWdhdGlvbjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0TmF2aWdhdGlvbkl0ZW1zKG5hdmlnYXRpb25JdGVtczogT05hdmlnYXRpb25JdGVtW10pIHtcbiAgICB0aGlzLm5hdmlnYXRpb25JdGVtcyA9IG5hdmlnYXRpb25JdGVtcztcbiAgICB0aGlzLnN0b3JlTmF2aWdhdGlvbigpO1xuICAgIHRoaXMubmF2aWdhdGlvbkV2ZW50cyQubmV4dChuYXZpZ2F0aW9uSXRlbXMpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFUb1N0b3JlKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvbkl0ZW1zO1xuICB9XG5cbiAgcHVibGljIGdldENvbXBvbmVudEtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBOYXZpZ2F0aW9uU2VydmljZS5OQVZJR0FUSU9OX1NUT1JBR0VfS0VZO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0b3JlTmF2aWdhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UudXBkYXRlQ29tcG9uZW50U3RvcmFnZSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFRpdGxlID0gdGl0bGU7XG4gICAgdGhpcy5fZW1pdFRpdGxlQ2hhbmdlZCh0aGlzLmN1cnJlbnRUaXRsZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0VmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZTtcbiAgICB0aGlzLl9lbWl0VmlzaWJsZUNoYW5nZWQodGhpcy52aXNpYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuU2lkZW5hdigpIHtcbiAgICB0aGlzLl9lbWl0T3BlblNpZGVuYXYoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZVNpZGVuYXYoKSB7XG4gICAgdGhpcy5fZW1pdENsb3NlU2lkZW5hdigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aXRsZSB1cGRhdGVzXG4gICAqL1xuICBwdWJsaWMgb25UaXRsZUNoYW5nZShvbk5leHQ6ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogb2JqZWN0IHtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlKHRoaXMuX3RpdGxlRW1pdHRlciwgb25OZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBvblZpc2libGVDaGFuZ2Uob25OZXh0OiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQpOiBvYmplY3Qge1xuICAgIHJldHVybiBPYnNlcnZhYmxlV3JhcHBlci5zdWJzY3JpYmUodGhpcy5fdmlzaWJsZUVtaXR0ZXIsIG9uTmV4dCk7XG4gIH1cblxuICBwdWJsaWMgb25TaWRlbmF2Q2hhbmdlKG9uTmV4dDogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiBvYmplY3Qge1xuICAgIHJldHVybiBPYnNlcnZhYmxlV3JhcHBlci5zdWJzY3JpYmUodGhpcy5fc2lkZW5hdkVtaXR0ZXIsIG9uTmV4dCk7XG4gIH1cblxuICBwcml2YXRlIF9lbWl0VGl0bGVDaGFuZ2VkKHRpdGxlKTogdm9pZCB7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fdGl0bGVFbWl0dGVyLCB0aXRsZSk7XG4gIH1cblxuICBwcml2YXRlIF9lbWl0VmlzaWJsZUNoYW5nZWQodmlzaWJsZSk6IHZvaWQge1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMuX3Zpc2libGVFbWl0dGVyLCB2aXNpYmxlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXRPcGVuU2lkZW5hdigpIHtcbiAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLl9zaWRlbmF2RW1pdHRlciwgJ29wZW4nKTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXRDbG9zZVNpZGVuYXYoKSB7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fc2lkZW5hdkVtaXR0ZXIsICdjbG9zZScpO1xuICB9XG5cbiAgc3RvcmVGb3JtUm91dGVzKHJvdXRlczogT05hdmlnYXRpb25Sb3V0ZXMsIGFjdGl2ZU1vZGU6IHN0cmluZywgcXVlcnlDb25mPzogYW55KSB7XG4gICAgaWYgKHRoaXMubmF2aWdhdGlvbkl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubmF2aWdhdGlvbkl0ZW1zW3RoaXMubmF2aWdhdGlvbkl0ZW1zLmxlbmd0aCAtIDFdLnNldEZvcm1Sb3V0ZXMocm91dGVzKTtcbiAgICAgIHRoaXMubmF2aWdhdGlvbkl0ZW1zW3RoaXMubmF2aWdhdGlvbkl0ZW1zLmxlbmd0aCAtIDFdLmFjdGl2ZUZvcm1Nb2RlID0gYWN0aXZlTW9kZTtcbiAgICAgIGlmIChxdWVyeUNvbmYpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uSXRlbXNbdGhpcy5uYXZpZ2F0aW9uSXRlbXMubGVuZ3RoIC0gMV0ua2V5c1ZhbHVlcyA9IHF1ZXJ5Q29uZi5rZXlzVmFsdWVzO1xuICAgICAgICBkZWxldGUgcXVlcnlDb25mLmtleXNWYWx1ZXM7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkl0ZW1zW3RoaXMubmF2aWdhdGlvbkl0ZW1zLmxlbmd0aCAtIDFdLnF1ZXJ5Q29uZmlndXJhdGlvbiA9IE9iamVjdC5rZXlzKHF1ZXJ5Q29uZikubGVuZ3RoID4gMCA/IHF1ZXJ5Q29uZiA6IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLnN0b3JlTmF2aWdhdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTdG9yZWREYXRhKCk6IGFueVtdIHtcbiAgICBjb25zdCBzdG9yYWdlRGF0YTogYW55ID0gdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldENvbXBvbmVudFN0b3JhZ2UodGhpcyk7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgT2JqZWN0LmtleXMoc3RvcmFnZURhdGEpLmZvckVhY2goa2V5ID0+IHJlc3VsdC5wdXNoKG5ldyBPTmF2aWdhdGlvbkl0ZW0oc3RvcmFnZURhdGFba2V5XSkpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0UHJldmlvdXNSb3V0ZURhdGEoKTogT05hdmlnYXRpb25JdGVtIHtcbiAgICBsZXQgcmVzdWx0OiBPTmF2aWdhdGlvbkl0ZW07XG4gICAgY29uc3QgbGVuID0gdGhpcy5uYXZpZ2F0aW9uSXRlbXMubGVuZ3RoO1xuICAgIGlmIChsZW4gPj0gMikge1xuICAgICAgcmVzdWx0ID0gdGhpcy5uYXZpZ2F0aW9uSXRlbXNbbGVuIC0gMl07XG4gICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5mb3JtUm91dGVzICYmIHJlc3VsdC5mb3JtUm91dGVzLm1haW5Gb3JtTGF5b3V0TWFuYWdlckNvbXBvbmVudCAmJiB0aGlzLm5hdmlnYXRpb25JdGVtc1tsZW4gLSAzXSkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLm5hdmlnYXRpb25JdGVtc1tsZW4gLSAzXTtcbiAgICAgICAgaWYgKHBhcmVudC5pc01haW5Gb3JtTGF5b3V0TWFuYWdlckNvbXBvbmVudCgpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBtYWluIG5hdmlnYXRpb24gcm91dGUgZGF0YSB0aGF0IG1hdGNoZXMgdGhlIG1vc3Qgd2l0aCB0aGUgY3VycmVudCByb3V0ZVxuICAgKi9cbiAgZ2V0TGFzdE1haW5OYXZpZ2F0aW9uUm91dGVEYXRhKCk6IE9OYXZpZ2F0aW9uSXRlbSB7XG4gICAgY29uc3Qgcm91dGVNYXRjaGVzID0gW107XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLm5hdmlnYXRpb25JdGVtcy5zbGljZSgpLnJldmVyc2UoKVxuICAgICAgLm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICBsZXQgY3VycmVudExvY2F0aW9uID0gdGhpcy5sb2NhdGlvbi5wYXRoKCkuc3Vic3RyKDEpO1xuICAgICAgICBpZiAoY3VycmVudExvY2F0aW9uLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgICAgICBjdXJyZW50TG9jYXRpb24gPSBjdXJyZW50TG9jYXRpb24uc3Vic3RyaW5nKDAsIGN1cnJlbnRMb2NhdGlvbi5pbmRleE9mKCc/JykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcGFyZSBjdXJyZW50IHJvdXRlIHdpdGggaXRlbSByb3V0ZSBhbmQgY291bnQgc2VnbWVudCBtYXRjaGVzXG4gICAgICAgIGNvbnN0IGFycjEgPSBpdGVtLnVybC5zdWJzdHIoMSkuc3BsaXQoJy8nKTtcbiAgICAgICAgY29uc3QgYXJyMiA9IGN1cnJlbnRMb2NhdGlvbi5zcGxpdCgnLycpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDw9IGFycjEubGVuZ3RoICYmIGluZGV4IDw9IGFycjIubGVuZ3RoKSB7XG4gICAgICAgICAgcm91dGVNYXRjaGVzW2ldID0gKGFycjFbaW5kZXhdID09PSBhcnIyW2luZGV4XSkgPyByZXN1bHQrKyA6IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG5cbiAgICBpZiAoIXJvdXRlTWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGxldCBtYXhNYXRjaGVzID0gcm91dGVNYXRjaGVzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5tYXgoYSwgYikpO1xuICAgIGNvbnN0IGxhc3ROYXZJdGVtID0gdGhpcy5uYXZpZ2F0aW9uSXRlbXNbdGhpcy5uYXZpZ2F0aW9uSXRlbXMubGVuZ3RoIC0gMV07XG4gICAgaWYgKCFsYXN0TmF2SXRlbS5pc01haW5OYXZpZ2F0aW9uQ29tcG9uZW50KCkgJiYgIWxhc3ROYXZJdGVtLmlzTWFpbkZvcm1MYXlvdXRNYW5hZ2VyQ29tcG9uZW50KCkpIHtcbiAgICAgIG1heE1hdGNoZXMtLTtcbiAgICB9XG4gICAgbGV0IGl0ZW1SZXN1bHQgPSB2b2lkIDA7XG4gICAgd2hpbGUgKCFpdGVtUmVzdWx0ICYmIG1heE1hdGNoZXMgPj0gMCkge1xuICAgICAgaXRlbVJlc3VsdCA9IGl0ZW1zLmZpbmQoKGl0ZW0sIGkpID0+IChpdGVtLmlzTWFpbk5hdmlnYXRpb25Db21wb25lbnQoKSB8fCBpdGVtLmlzTWFpbkZvcm1MYXlvdXRNYW5hZ2VyQ29tcG9uZW50KCkpICYmIHJvdXRlTWF0Y2hlc1tpXSA9PT0gbWF4TWF0Y2hlcyk7XG4gICAgICBtYXhNYXRjaGVzLS07XG4gICAgfVxuICAgIHJldHVybiBpdGVtUmVzdWx0O1xuICB9XG5cbiAgcmVtb3ZlTGFzdEl0ZW0oKSB7XG4gICAgdGhpcy5uYXZpZ2F0aW9uSXRlbXMucG9wKCk7XG4gICAgdGhpcy5zdG9yZU5hdmlnYXRpb24oKTtcbiAgfVxuXG4gIHJlbW92ZUxhc3RJdGVtc1VudGlsTWFpbigpIHtcbiAgICBjb25zdCBsYXN0TWFpbiA9IHRoaXMuZ2V0TGFzdE1haW5OYXZpZ2F0aW9uUm91dGVEYXRhKCk7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChsYXN0TWFpbikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm5hdmlnYXRpb25JdGVtcy5pbmRleE9mKGxhc3RNYWluKTtcbiAgICB0aGlzLm5hdmlnYXRpb25JdGVtcyA9IHRoaXMubmF2aWdhdGlvbkl0ZW1zLnNsaWNlKDAsIGluZGV4ICsgMSk7XG4gICAgdGhpcy5zdG9yZU5hdmlnYXRpb24oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzQ3VycmVudFJvdXRlKHJvdXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgY3VycmVudFJvdXRlID0gdGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsO1xuICAgIGN1cnJlbnRSb3V0ZSA9IGN1cnJlbnRSb3V0ZS5zcGxpdCgnPycpWzBdO1xuICAgIHJldHVybiByb3V0ZSA9PT0gY3VycmVudFJvdXRlO1xuICB9XG5cbiAgZ2V0TGFzdEl0ZW0oKTogT05hdmlnYXRpb25JdGVtIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0aGlzLm5hdmlnYXRpb25JdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLm5hdmlnYXRpb25JdGVtc1t0aGlzLm5hdmlnYXRpb25JdGVtcy5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGRlbGV0ZUFjdGl2ZUZvcm1Nb2RlKGFyZzogT05hdmlnYXRpb25JdGVtKSB7XG4gICAgYXJnLmRlbGV0ZUFjdGl2ZUZvcm1Nb2RlKCk7XG4gICAgdGhpcy5zdG9yZU5hdmlnYXRpb24oKTtcbiAgfVxuXG59XG4iXX0=