@sumaris-net/ngx-components 2.4.135 → 2.4.137
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/public_api.mjs +2 -1
- package/esm2020/src/app/core/menu/menu.component.mjs +3 -3
- package/esm2020/src/app/core/menu/menu.model.mjs +20 -8
- package/esm2020/src/app/core/menu/menu.service.mjs +71 -31
- package/esm2020/src/app/core/menu/sub-menu-tab.directive.mjs +14 -13
- package/esm2020/src/app/core/services/model/entity.model.mjs +17 -34
- package/esm2020/src/app/core/services/model/tree-item-entity.model.mjs +197 -0
- package/esm2020/src/app/core/services/platform.service.mjs +2 -2
- package/fesm2015/sumaris-net.ngx-components.mjs +309 -86
- package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
- package/fesm2020/sumaris-net.ngx-components.mjs +313 -84
- package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/src/app/core/menu/menu.model.d.ts +16 -7
- package/src/app/core/menu/menu.service.d.ts +14 -7
- package/src/app/core/menu/sub-menu-tab.directive.d.ts +1 -1
- package/src/app/core/services/model/entity.model.d.ts +4 -8
- package/src/app/core/services/model/tree-item-entity.model.d.ts +53 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';
|
|
1
|
+
import { EventEmitter, Inject, Injectable, InjectionToken, Optional } from '@angular/core';
|
|
2
2
|
import { BehaviorSubject, combineLatest, from, merge, mergeMap, Subject } from 'rxjs';
|
|
3
3
|
import { MenuItem, MenuItems } from './menu.model';
|
|
4
4
|
import { NavigationEnd } from '@angular/router';
|
|
@@ -9,8 +9,9 @@ import { CORE_CONFIG_OPTIONS } from '../services/config/core.config';
|
|
|
9
9
|
import { isEmptyArray, isNil, isNotEmptyArray, isNotNil, isNotNilOrBlank } from '../../shared/functions';
|
|
10
10
|
import { StartableObservableService } from '../../shared/services/startable-observable-service.class';
|
|
11
11
|
import { firstNotNilPromise } from '../../shared/observables';
|
|
12
|
+
import { TreeItemEntityUtils } from '../services/model/tree-item-entity.model';
|
|
12
13
|
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "../services/
|
|
14
|
+
import * as i1 from "../services/local-settings.service";
|
|
14
15
|
import * as i2 from "../services/config.service";
|
|
15
16
|
import * as i3 from "../services/account.service";
|
|
16
17
|
import * as i4 from "@angular/router";
|
|
@@ -20,15 +21,16 @@ export const DEFAULT_MENU_SHOW_WHEN = 'lg';
|
|
|
20
21
|
export const APP_MENU_ITEMS = new InjectionToken('menuItems');
|
|
21
22
|
export const APP_MENU_OPTIONS = new InjectionToken('menuOptions');
|
|
22
23
|
export class MenuService extends StartableObservableService {
|
|
23
|
-
constructor(
|
|
24
|
-
super(
|
|
25
|
-
this.
|
|
24
|
+
constructor(settings, configService, accountService, router, environment, options, staticItems) {
|
|
25
|
+
super();
|
|
26
|
+
this.settings = settings;
|
|
26
27
|
this.configService = configService;
|
|
27
28
|
this.accountService = accountService;
|
|
28
29
|
this.router = router;
|
|
29
30
|
this.environment = environment;
|
|
30
31
|
this.options = options;
|
|
31
32
|
this.accountChanges = new BehaviorSubject(undefined);
|
|
33
|
+
this.pinnedEvent = new EventEmitter();
|
|
32
34
|
this._detachedSubItems = [];
|
|
33
35
|
this._itemCounter = 0;
|
|
34
36
|
this._logPrefix = '[menu-service] ';
|
|
@@ -36,14 +38,15 @@ export class MenuService extends StartableObservableService {
|
|
|
36
38
|
this._$splitPaneWhen = new BehaviorSubject(DEFAULT_MENU_SHOW_WHEN);
|
|
37
39
|
this._$enabled = new BehaviorSubject(true);
|
|
38
40
|
this._$listenRoute = new BehaviorSubject(false);
|
|
41
|
+
this.options = {
|
|
42
|
+
enableSubMenuIcon: true,
|
|
43
|
+
...options,
|
|
44
|
+
enableSubMenus: !this.settings.mobile && options.enableSubMenuIcon
|
|
45
|
+
};
|
|
46
|
+
this._$subMenuEnabled = new BehaviorSubject(this.options.enableSubMenus);
|
|
39
47
|
this._debug = !environment.production;
|
|
40
|
-
this._staticItems = (staticItems || []).map(source => {
|
|
41
|
-
|
|
42
|
-
target.id = this._computeNewId();
|
|
43
|
-
return target;
|
|
44
|
-
});
|
|
45
|
-
this._detachedSubItems = []; // TODO restore from settings ?
|
|
46
|
-
this._$subMenuEnabled = new BehaviorSubject(options?.enableSubMenus !== false);
|
|
48
|
+
this._staticItems = (staticItems || []).map(source => this.fromObject(source, { computeId: true, fillParent: true }));
|
|
49
|
+
this._detachedSubItems = [];
|
|
47
50
|
}
|
|
48
51
|
get opened() {
|
|
49
52
|
return this._$opened.asObservable();
|
|
@@ -58,7 +61,13 @@ export class MenuService extends StartableObservableService {
|
|
|
58
61
|
return this._$subMenuEnabled.value;
|
|
59
62
|
}
|
|
60
63
|
get subMenuIconEnabled() {
|
|
61
|
-
return this.options
|
|
64
|
+
return this.options.enableSubMenuIcon;
|
|
65
|
+
}
|
|
66
|
+
get subItems() {
|
|
67
|
+
return (this.data || []).reduce((res, rootElement) => res.concat(rootElement.children), []);
|
|
68
|
+
}
|
|
69
|
+
get _staticSubItems() {
|
|
70
|
+
return (this._staticItems || []).reduce((res, rootElement) => res.concat(rootElement.children), []);
|
|
62
71
|
}
|
|
63
72
|
enable(value) {
|
|
64
73
|
this._$enabled.next(value);
|
|
@@ -79,15 +88,26 @@ export class MenuService extends StartableObservableService {
|
|
|
79
88
|
this._$splitPaneWhen.next(DEFAULT_MENU_SHOW_WHEN);
|
|
80
89
|
}
|
|
81
90
|
}
|
|
82
|
-
fromObject(source) {
|
|
83
|
-
const target = MenuItem.fromObject(source);
|
|
84
|
-
//
|
|
91
|
+
fromObject(source, opts) {
|
|
92
|
+
const target = MenuItem.fromObject(source, { withChildren: false });
|
|
93
|
+
// Compute id if need
|
|
94
|
+
if (opts?.computeId && isNil(target.id))
|
|
95
|
+
target.id = this._computeNewId();
|
|
96
|
+
// Remove icon if not enabled
|
|
85
97
|
if (!this.subMenuIconEnabled) {
|
|
86
98
|
Object.assign(target, { icon: undefined, matIcon: undefined, matSvgIcon: undefined });
|
|
87
99
|
}
|
|
100
|
+
// Recursive
|
|
101
|
+
target.children = (source.children || []).map((json) => this.fromObject(json, { ...opts, fillParent: false }));
|
|
102
|
+
// Fill parent (once, when the full tree is ready)
|
|
103
|
+
if (opts?.fillParent) {
|
|
104
|
+
TreeItemEntityUtils.treeFillParent(target);
|
|
105
|
+
}
|
|
88
106
|
return target;
|
|
89
107
|
}
|
|
90
|
-
|
|
108
|
+
createSubMenu(source) {
|
|
109
|
+
if (!this.subMenuEnabled)
|
|
110
|
+
return null; // Skip if disabled
|
|
91
111
|
const target = this.fromObject(source);
|
|
92
112
|
// Check if exists
|
|
93
113
|
if (this.started) {
|
|
@@ -103,11 +123,15 @@ export class MenuService extends StartableObservableService {
|
|
|
103
123
|
async addSubMenuItems(sources, opts) {
|
|
104
124
|
if (!this.started)
|
|
105
125
|
await this.ready();
|
|
126
|
+
if (!this.subMenuEnabled)
|
|
127
|
+
return; // Skip
|
|
106
128
|
return sources.map(source => this._addSubMenuItem(this.fromObject(source), opts));
|
|
107
129
|
}
|
|
108
130
|
async addSubMenuItem(item, opts) {
|
|
109
131
|
if (!this.started)
|
|
110
132
|
await this.ready();
|
|
133
|
+
if (!this.subMenuEnabled)
|
|
134
|
+
return; // Skip
|
|
111
135
|
return this._addSubMenuItem(this.fromObject(item), opts);
|
|
112
136
|
}
|
|
113
137
|
async removeSubMenuItems(items) {
|
|
@@ -141,8 +165,8 @@ export class MenuService extends StartableObservableService {
|
|
|
141
165
|
// Pinned
|
|
142
166
|
else {
|
|
143
167
|
item.pinned = true;
|
|
144
|
-
// TODO: send an event to save pinned elements ?
|
|
145
168
|
}
|
|
169
|
+
this.pinnedEvent.next(item);
|
|
146
170
|
}
|
|
147
171
|
_markAsOpened() {
|
|
148
172
|
this._$opened.next(true);
|
|
@@ -152,6 +176,13 @@ export class MenuService extends StartableObservableService {
|
|
|
152
176
|
}
|
|
153
177
|
async ngOnStart() {
|
|
154
178
|
console.info(`${this._logPrefix}Starting...`);
|
|
179
|
+
// Restore sub items from settings
|
|
180
|
+
await this.settings.ready();
|
|
181
|
+
const settingsSubItems = this.settings.getPageSettings('menu', 'sub-items');
|
|
182
|
+
if (isNotEmptyArray(settingsSubItems)) {
|
|
183
|
+
console.debug(this._logPrefix + 'Restoring pinned items from settings...', settingsSubItems);
|
|
184
|
+
this._detachedSubItems = settingsSubItems.map(source => this.fromObject(source, { computeId: true, fillParent: true }));
|
|
185
|
+
}
|
|
155
186
|
const accountEvent$ = merge(from(this.accountService.ready()), this.accountService.onLogin, this.accountService.onLogout.pipe(map(_ => null))).pipe(map(account => isNotNil(account?.id) ? account : null), distinctUntilChanged((a1, a2) => DateUtils.isSame(a1?.updateDate, a2?.updateDate)));
|
|
156
187
|
this.registerSubscription(
|
|
157
188
|
// Combine config and account events
|
|
@@ -180,13 +211,22 @@ export class MenuService extends StartableObservableService {
|
|
|
180
211
|
console.debug(`${this._logPrefix}Newly detached items: `, detachedSubItems);
|
|
181
212
|
}
|
|
182
213
|
}));
|
|
214
|
+
// Save pinned items
|
|
215
|
+
this.registerSubscription(this.pinnedEvent
|
|
216
|
+
//.pipe(debounceTime(1000))
|
|
217
|
+
.subscribe(item => {
|
|
218
|
+
const pinnedItems = this.subItems.filter(i => i.isPinned())
|
|
219
|
+
.map(item => item.asObject({ withChildren: true, keepLocalId: false }));
|
|
220
|
+
console.debug(this._logPrefix + 'Saving pinned items to settings...', pinnedItems);
|
|
221
|
+
this.settings.savePageSetting('menu', pinnedItems, 'sub-items');
|
|
222
|
+
}));
|
|
183
223
|
return firstNotNilPromise(this.dataSubject);
|
|
184
224
|
}
|
|
185
225
|
_loadMenuItems(config, account) {
|
|
186
226
|
if (this._debug)
|
|
187
227
|
console.debug(`${this._logPrefix}Loading menu items...`);
|
|
188
228
|
// Save previous children of root items
|
|
189
|
-
const detachedSubItems = (this.
|
|
229
|
+
const detachedSubItems = (this.subItems || [])
|
|
190
230
|
.reduce((res, rootItem) => {
|
|
191
231
|
const children = rootItem.children;
|
|
192
232
|
if (isEmptyArray(children))
|
|
@@ -206,7 +246,7 @@ export class MenuService extends StartableObservableService {
|
|
|
206
246
|
const configItems = JSON.parse(configValue);
|
|
207
247
|
items = (configItems || []).reduce((res, source) => {
|
|
208
248
|
// Normalize the item
|
|
209
|
-
const item = this.fromObject(source);
|
|
249
|
+
const item = this.fromObject(source, { computeId: true });
|
|
210
250
|
// Skip is already loaded
|
|
211
251
|
if (res.find((i) => MenuItems.isSame(i, item)))
|
|
212
252
|
return res;
|
|
@@ -243,17 +283,16 @@ export class MenuService extends StartableObservableService {
|
|
|
243
283
|
items = items
|
|
244
284
|
.filter(item => MenuItems.checkIfVisible(item, account, config, opts))
|
|
245
285
|
.map(item => {
|
|
246
|
-
// Generate item's id (if need)
|
|
247
|
-
if (isNil(item.id))
|
|
248
|
-
item.id = this._computeNewId();
|
|
249
286
|
// Replace title using a config property
|
|
250
287
|
if (isNotNilOrBlank(item.titleProperty) && config) {
|
|
251
288
|
item.title = config.properties[item.titleProperty] || item.title;
|
|
252
289
|
}
|
|
253
290
|
return item;
|
|
254
291
|
});
|
|
292
|
+
if (this._debug)
|
|
293
|
+
console.debug(`${this._logPrefix}Found ${items.length} visible root items...`);
|
|
255
294
|
// Re-attach sub menu items
|
|
256
|
-
if (detachedSubItems.length) {
|
|
295
|
+
if (this.subMenuEnabled && detachedSubItems.length) {
|
|
257
296
|
if (account) {
|
|
258
297
|
this._addSubMenuItems(detachedSubItems, { skipIfExists: false, availableParents: detachedSubItems.concat(items) });
|
|
259
298
|
}
|
|
@@ -261,8 +300,9 @@ export class MenuService extends StartableObservableService {
|
|
|
261
300
|
this._detachedSubItems = detachedSubItems;
|
|
262
301
|
}
|
|
263
302
|
}
|
|
264
|
-
|
|
265
|
-
|
|
303
|
+
else {
|
|
304
|
+
this._detachedSubItems = [];
|
|
305
|
+
}
|
|
266
306
|
return items;
|
|
267
307
|
}
|
|
268
308
|
_addSubMenuItems(sources, opts) {
|
|
@@ -274,7 +314,7 @@ export class MenuService extends StartableObservableService {
|
|
|
274
314
|
...opts,
|
|
275
315
|
};
|
|
276
316
|
// Find if item already exists
|
|
277
|
-
const existingItem = this._findExistingItem(newItem);
|
|
317
|
+
const existingItem = this._findExistingItem(newItem, opts?.availableParents);
|
|
278
318
|
if (existingItem) {
|
|
279
319
|
// No changes
|
|
280
320
|
if (opts.skipIfExists && MenuItems.isSame(existingItem, newItem) && !existingItem.detached) {
|
|
@@ -364,7 +404,7 @@ export class MenuService extends StartableObservableService {
|
|
|
364
404
|
}
|
|
365
405
|
_detachSubMenuItems(currentPathParam, subItems) {
|
|
366
406
|
currentPathParam = currentPathParam ? currentPathParam : MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url.toString());
|
|
367
|
-
return (subItems || this.
|
|
407
|
+
return (subItems || this.subItems)
|
|
368
408
|
.reduce((res, subItem) => {
|
|
369
409
|
// Not visible => should be detach
|
|
370
410
|
if (!MenuItems.checkIfSubMenuVisible(subItem, currentPathParam)) {
|
|
@@ -449,14 +489,14 @@ export class MenuService extends StartableObservableService {
|
|
|
449
489
|
}
|
|
450
490
|
}
|
|
451
491
|
}
|
|
452
|
-
MenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, deps: [{ token: i1.
|
|
492
|
+
MenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, deps: [{ token: i1.LocalSettingsService }, { token: i2.ConfigService }, { token: i3.AccountService }, { token: i4.Router }, { token: ENVIRONMENT }, { token: APP_MENU_OPTIONS, optional: true }, { token: APP_MENU_ITEMS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
453
493
|
MenuService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, providedIn: 'root' });
|
|
454
494
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, decorators: [{
|
|
455
495
|
type: Injectable,
|
|
456
496
|
args: [{
|
|
457
497
|
providedIn: 'root'
|
|
458
498
|
}]
|
|
459
|
-
}], ctorParameters: function () { return [{ type: i1.
|
|
499
|
+
}], ctorParameters: function () { return [{ type: i1.LocalSettingsService }, { type: i2.ConfigService }, { type: i3.AccountService }, { type: i4.Router }, { type: i5.Environment, decorators: [{
|
|
460
500
|
type: Inject,
|
|
461
501
|
args: [ENVIRONMENT]
|
|
462
502
|
}] }, { type: i6.MenuOptions, decorators: [{
|
|
@@ -470,4 +510,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
470
510
|
type: Inject,
|
|
471
511
|
args: [APP_MENU_ITEMS]
|
|
472
512
|
}] }]; } });
|
|
473
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL21lbnUvbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xHLE9BQU8sRUFBYSxRQUFRLEVBQUUsU0FBUyxFQUFlLE1BQU0sY0FBYyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFbkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSWpGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDdEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7O0FBSTlELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFzQixJQUFJLENBQUM7QUFDOUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFjLFdBQVcsQ0FBQyxDQUFDO0FBQzNFLE1BQU0s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QUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFakcsMEJBQTBCO1FBQzFCLElBQUksYUFBYSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3hCLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDckMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDaEMsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2FBQ3ZCO1NBQ0Y7YUFDSTtZQUNILFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFckIsc0JBQXNCO1lBQ3RCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDdkI7SUFDSCxDQUFDOzt3R0F4Z0JVLFdBQVcsa0lBbUJaLFdBQVcsYUFDQyxnQkFBZ0IsNkJBQ2hCLGNBQWM7NEdBckJ6QixXQUFXLGNBRlYsTUFBTTsyRkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBb0JJLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDbkMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZnJvbSwgbWVyZ2UsIG1lcmdlTWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJTWVudUl0ZW0sIE1lbnVJdGVtLCBNZW51SXRlbXMsIE1lbnVPcHRpb25zIH0gZnJvbSAnLi9tZW51Lm1vZGVsJztcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgUGxhdGZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcGxhdGZvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2NvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBDT1JFX0NPTkZJR19PUFRJT05TIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnL2NvcmUuY29uZmlnJztcbmltcG9ydCB7IGlzRW1wdHlBcnJheSwgaXNOaWwsIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFuayB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQWNjb3VudCB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2FjY291bnQubW9kZWwnO1xuaW1wb3J0IHsgU3RhcnRhYmxlT2JzZXJ2YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLW9ic2VydmFibGUtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBmaXJzdE5vdE5pbFByb21pc2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHsgSWNvblJlZiB9IGZyb20gJy4uLy4uL3NoYXJlZC90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFNwbGl0UGFuZVNob3dXaGVuID0gYm9vbGVhbiB8ICdsZyc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9NRU5VX1NIT1dfV0hFTjogU3BsaXRQYW5lU2hvd1doZW4gPSAnbGcnO1xuZXhwb3J0IGNvbnN0IEFQUF9NRU5VX0lURU1TID0gbmV3IEluamVjdGlvblRva2VuPElNZW51SXRlbVtdPignbWVudUl0ZW1zJyk7XG5leHBvcnQgY29uc3QgQVBQX01FTlVfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxNZW51T3B0aW9ucz4oJ21lbnVPcHRpb25zJyk7XG5cblxuZXhwb3J0IGludGVyZmFjZSBNZW51UGF0aFBhcmFtIHtcbiAgcGF0aDogc3RyaW5nO1xuICBwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNZW51U2VydmljZSBleHRlbmRzIFN0YXJ0YWJsZU9ic2VydmFibGVTZXJ2aWNlPE1lbnVJdGVtW10+IHtcblxuICByZWFkb25seSBhY2NvdW50Q2hhbmdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QWNjb3VudD4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIF9zdGF0aWNJdGVtczogTWVudUl0ZW1bXTtcbiAgcHJpdmF0ZSBfZGV0YWNoZWRTdWJJdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuICBwcml2YXRlIF9pdGVtQ291bnRlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvZ1ByZWZpeCA9ICdbbWVudS1zZXJ2aWNlXSAnO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kb3BlbmVkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfJHNwbGl0UGFuZVdoZW4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNwbGl0UGFuZVNob3dXaGVuPihERUZBVUxUX01FTlVfU0hPV19XSEVOKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfJGVuYWJsZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kc3ViTWVudUVuYWJsZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgXyRsaXN0ZW5Sb3V0ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBwbGF0Zm9ybVNlcnZpY2U6IFBsYXRmb3JtU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX01FTlVfT1BUSU9OUykgcHJvdGVjdGVkIG9wdGlvbnM6IE1lbnVPcHRpb25zLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX01FTlVfSVRFTVMpIHN0YXRpY0l0ZW1zPzogSU1lbnVJdGVtW11cbiAgKSB7XG4gICAgc3VwZXIocGxhdGZvcm1TZXJ2aWNlKTtcbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIHRoaXMuX3N0YXRpY0l0ZW1zID0gKHN0YXRpY0l0ZW1zIHx8IFtdKS5tYXAoc291cmNlID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IE1lbnVJdGVtLmZyb21PYmplY3Qoc291cmNlKTtcbiAgICAgIHRhcmdldC5pZCA9IHRoaXMuX2NvbXB1dGVOZXdJZCgpO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9KTtcbiAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zID0gW107IC8vIFRPRE8gcmVzdG9yZSBmcm9tIHNldHRpbmdzID9cbiAgICB0aGlzLl8kc3ViTWVudUVuYWJsZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KG9wdGlvbnM/LmVuYWJsZVN1Yk1lbnVzICE9PSBmYWxzZSk7XG4gIH1cblxuICBnZXQgb3BlbmVkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl8kb3BlbmVkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IHNwbGl0UGFuZVdoZW4oKTogT2JzZXJ2YWJsZTxTcGxpdFBhbmVTaG93V2hlbj4ge1xuICAgIHJldHVybiB0aGlzLl8kc3BsaXRQYW5lV2hlbi5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCBlbmFibGVkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl8kZW5hYmxlZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCBzdWJNZW51RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fJHN1Yk1lbnVFbmFibGVkLnZhbHVlO1xuICB9XG5cbiAgZ2V0IHN1Yk1lbnVJY29uRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zPy5lbmFibGVTdWJNZW51SWNvbiAhPT0gZmFsc2U7XG4gIH1cblxuICBlbmFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl8kZW5hYmxlZC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIGVuYWJsZVN1Yk1lbnUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl8kc3ViTWVudUVuYWJsZWQubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBzZXRTcGxpdFBhbmVTaG93V2hlbih2YWx1ZTogU3BsaXRQYW5lU2hvd1doZW4pIHtcbiAgICBpZiAodGhpcy5fJHNwbGl0UGFuZVdoZW4udmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl8kc3BsaXRQYW5lV2hlbi5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTcGxpdFBhbmVXaGVuKCkge1xuICAgIGlmICh0aGlzLl8kc3BsaXRQYW5lV2hlbi52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuXyRzcGxpdFBhbmVXaGVuLm5leHQoZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuXyRzcGxpdFBhbmVXaGVuLm5leHQoREVGQVVMVF9NRU5VX1NIT1dfV0hFTik7XG4gICAgfVxuICB9XG5cbiAgZnJvbU9iamVjdChzb3VyY2U6IGFueSkge1xuICAgIGNvbnN0IHRhcmdldCA9IE1lbnVJdGVtLmZyb21PYmplY3Qoc291cmNlKTtcbiAgICAvLyBSZW1vdmUgaWNvbiBpZiBub3Qgc2V0XG4gICAgaWYgKCF0aGlzLnN1Yk1lbnVJY29uRW5hYmxlZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIDxJY29uUmVmPntpY29uOiB1bmRlZmluZWQsIG1hdEljb246IHVuZGVmaW5lZCwgbWF0U3ZnSWNvbjogdW5kZWZpbmVkfSlcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIGxvYWRPckNyZWF0ZShzb3VyY2U6IFBhcnRpYWw8SU1lbnVJdGVtPik6IE1lbnVJdGVtIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmZyb21PYmplY3Qoc291cmNlKTtcblxuICAgIC8vIENoZWNrIGlmIGV4aXN0c1xuICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSXRlbSA9IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0odGFyZ2V0KTtcbiAgICAgIGlmIChleGlzdGluZ0l0ZW0pIHJldHVybiBleGlzdGluZ0l0ZW07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlXG4gICAgaWYgKGlzTmlsKHRhcmdldC5pZCkpIHRhcmdldC5pZCA9IHRoaXMuX2NvbXB1dGVOZXdJZCgpO1xuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIGFzeW5jIGFkZFN1Yk1lbnVJdGVtcyhzb3VyY2VzOiBJTWVudUl0ZW1bXSwgb3B0cz86IHtza2lwSWZFeGlzdHM/OiBib29sZWFufSkge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgcmV0dXJuIHNvdXJjZXMubWFwKHNvdXJjZSA9PiB0aGlzLl9hZGRTdWJNZW51SXRlbSh0aGlzLmZyb21PYmplY3Qoc291cmNlKSwgb3B0cykpO1xuICB9XG5cbiAgYXN5bmMgYWRkU3ViTWVudUl0ZW0oaXRlbTogSU1lbnVJdGVtLCBvcHRzPzoge3NraXBJZkV4aXN0cz86IGJvb2xlYW59KSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIGF3YWl0IHRoaXMucmVhZHkoKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkU3ViTWVudUl0ZW0odGhpcy5mcm9tT2JqZWN0KGl0ZW0pLCBvcHRzKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVN1Yk1lbnVJdGVtcyhpdGVtczogSU1lbnVJdGVtW10pIHtcbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgIHJldHVybiAoaXRlbXMgfHwgW10pLm1hcChpdGVtID0+IHRoaXMuX3JlbW92ZVN1Yk1lbnVJdGVtKHRoaXMuZnJvbU9iamVjdChpdGVtKSkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlU3ViTWVudUl0ZW0oaXRlbTogSU1lbnVJdGVtKSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIGF3YWl0IHRoaXMucmVhZHkoKTtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3ZlU3ViTWVudUl0ZW0odGhpcy5mcm9tT2JqZWN0KGl0ZW0pKTtcbiAgfVxuXG4gIHRvZ2dsZVBpbm5lZChzb3VyY2U6IElNZW51SXRlbSkge1xuICAgIGNvbnN0IGl0ZW0gPSAoc291cmNlIGluc3RhbmNlb2YgTWVudUl0ZW0pID8gc291cmNlIDogdGhpcy5fZmluZEV4aXN0aW5nSXRlbSh0aGlzLmZyb21PYmplY3Qoc291cmNlKSk7XG5cbiAgICAvLyBTa2lwIGlmIG5vdCBmb3VuZFxuICAgIGlmICghaXRlbSkge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLndhcm4odGhpcy5fbG9nUHJlZml4ICsgYFN1YiBtZW51IHske3NvdXJjZS5wYXRofX0gY2Fubm90IGJlIGZvdW5kIC0gdW5hYmxlIHRvIHRvZ2dsZSBwaW5uZWQhYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVW5waW5uZWRcbiAgICBpZiAoaXRlbS5waW5uZWQpIHtcbiAgICAgIGl0ZW0ucGlubmVkID0gZmFsc2U7XG4gICAgICBpZiAoIWl0ZW0uZGV0YWNoZWQpIHtcblxuICAgICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zID0gW1xuICAgICAgICAgIC4uLnRoaXMuX2RldGFjaGVkU3ViSXRlbXMsXG4gICAgICAgICAgLi4udGhpcy5fZGV0YWNoU3ViTWVudUl0ZW1zKClcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQaW5uZWRcbiAgICBlbHNlIHtcbiAgICAgIGl0ZW0ucGlubmVkID0gdHJ1ZTtcbiAgICAgIC8vIFRPRE86IHNlbmQgYW4gZXZlbnQgdG8gc2F2ZSBwaW5uZWQgZWxlbWVudHMgP1xuICAgIH1cbiAgfVxuXG4gIF9tYXJrQXNPcGVuZWQoKSB7XG4gICAgdGhpcy5fJG9wZW5lZC5uZXh0KHRydWUpO1xuICB9XG5cbiAgX21hcmtBc0Nsb3NlZCgpIHtcbiAgICB0aGlzLl8kb3BlbmVkLm5leHQoZmFsc2UpO1xuICB9XG5cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCkge1xuICAgIGNvbnNvbGUuaW5mbyhgJHt0aGlzLl9sb2dQcmVmaXh9U3RhcnRpbmcuLi5gKTtcblxuICAgIGNvbnN0IGFjY291bnRFdmVudCQgPSBtZXJnZShcbiAgICAgIGZyb20odGhpcy5hY2NvdW50U2VydmljZS5yZWFkeSgpKSxcbiAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dpbixcbiAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dvdXQucGlwZShcbiAgICAgICAgbWFwKF8gPT4gbnVsbClcbiAgICAgIClcbiAgICApLnBpcGUoXG4gICAgICBtYXAoYWNjb3VudCA9PiBpc05vdE5pbChhY2NvdW50Py5pZCkgPyBhY2NvdW50IDogbnVsbCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYTEsIGEyKSA9PiBEYXRlVXRpbHMuaXNTYW1lKGExPy51cGRhdGVEYXRlLCBhMj8udXBkYXRlRGF0ZSkpXG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICAvLyBDb21iaW5lIGNvbmZpZyBhbmQgYWNjb3VudCBldmVudHNcbiAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLFxuICAgICAgICBhY2NvdW50RXZlbnQkXG4gICAgICBdKS5zdWJzY3JpYmUoKFtjb25maWcsIGFjY291bnRdKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9UmVjZWl2ZWQgY29uZmlnIG9yIGFjY291bnQgZXZlbnQuIFJlZnJlc2hpbmcgaXRlbXMuLi5gLCBhY2NvdW50KTtcblxuICAgICAgICAvLyBMb2FkIGFsbCBpdGVtc1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2xvYWRNZW51SXRlbXMoY29uZmlnLCBhY2NvdW50KTtcblxuICAgICAgICAvLyBFbWl0IG5ldyByb290IGl0ZW1zXG4gICAgICAgIHRoaXMuZGF0YVN1YmplY3QubmV4dChpdGVtcyk7XG5cbiAgICAgICAgLy8gRW1pdCBhY2NvdW50IGNoYW5nZXMgZXZlbnRcbiAgICAgICAgdGhpcy5hY2NvdW50Q2hhbmdlcy5uZXh0KGFjY291bnQpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIG1lcmdlKFxuICAgICAgICB0aGlzLmFjY291bnRDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgbWFwKCgpID0+IE1lbnVJdGVtcy5wYXJzZVBhdGhXaXRoUXVlcnkodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsKSlcbiAgICAgICAgKSxcbiAgICAgICAgdGhpcy5fJGxpc3RlblJvdXRlLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKGxpc3RlbiA9PiBsaXN0ZW4gPT09IHRydWUpLFxuICAgICAgICAgIG1lcmdlTWFwKF8gPT4gdGhpcy5yb3V0ZXIuZXZlbnRzKSxcbiAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcbiAgICAgICAgICBtYXAoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiBNZW51SXRlbXMucGFyc2VQYXRoV2l0aFF1ZXJ5KGV2ZW50LnVybCkpLFxuICAgICAgICApXG4gICAgICApLnBpcGUoXG4gICAgICAgIHRocm90dGxlVGltZSgyNTApLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gaXNOb3RFbXB0eUFycmF5KHRoaXMuZGF0YSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHBhdGhQYXJhbSA9PiB7XG4gICAgICAgIGNvbnN0IGRldGFjaGVkU3ViSXRlbXMgPSB0aGlzLl9kZXRhY2hTdWJNZW51SXRlbXMocGF0aFBhcmFtKTtcbiAgICAgICAgaWYgKGRldGFjaGVkU3ViSXRlbXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLFxuICAgICAgICAgICAgLi4uZGV0YWNoZWRTdWJJdGVtc1xuICAgICAgICAgIF07XG5cbiAgICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fU5ld2x5IGRldGFjaGVkIGl0ZW1zOiBgLCBkZXRhY2hlZFN1Ykl0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIGZpcnN0Tm90TmlsUHJvbWlzZSh0aGlzLmRhdGFTdWJqZWN0KTtcbiAgfVxuXG4gIHByaXZhdGUgX2xvYWRNZW51SXRlbXMoY29uZmlnOiBDb25maWd1cmF0aW9ufG51bGwsIGFjY291bnQ6IEFjY291bnR8bnVsbCkge1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9TG9hZGluZyBtZW51IGl0ZW1zLi4uYCk7XG5cbiAgICAvLyBTYXZlIHByZXZpb3VzIGNoaWxkcmVuIG9mIHJvb3QgaXRlbXNcbiAgICBjb25zdCBkZXRhY2hlZFN1Ykl0ZW1zID0gKHRoaXMuZGF0YSB8fCBbXSlcbiAgICAgIC5yZWR1Y2UoKHJlcywgcm9vdEl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSByb290SXRlbS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKGlzRW1wdHlBcnJheShjaGlsZHJlbikpIHJldHVybiByZXM7XG4gICAgICAgIC8vIERldGFjaCBhbGwgcm9vdCBjaGlsZHJlblxuICAgICAgICByb290SXRlbS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IGNoaWxkLnBhcmVudCA9IG51bGwpO1xuICAgICAgICAvLyBSZXR1cm4gcm9vdCBjaGlsZHJlblxuICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChjaGlsZHJlbik7XG4gICAgICB9LCB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zIHx8IFtdKTtcblxuICAgIC8vIFJlc2V0IGJhc2Ugcm9vdCBpdGVtcyAoY2xlYW4gaXRlbXMgYWRkZWQgYnkgY29uZmlnKVxuICAgIGxldCBpdGVtczogTWVudUl0ZW1bXSA9IHRoaXMuX3N0YXRpY0l0ZW1zLnNsaWNlKCk7XG5cbiAgICAvLyBDb25jYXQgY29uZmlnJ3MgaXRlbXNcbiAgICBjb25zdCBjb25maWdWYWx1ZTogc3RyaW5nID0gY29uZmlnPy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLk1FTlVfSVRFTVMpO1xuICAgIGlmIChpc05vdE5pbE9yQmxhbmsoY29uZmlnVmFsdWUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25maWdJdGVtcyA9IEpTT04ucGFyc2UoY29uZmlnVmFsdWUpIGFzIElNZW51SXRlbVtdO1xuICAgICAgICBpdGVtcyA9IChjb25maWdJdGVtcyB8fCBbXSkucmVkdWNlKChyZXM6IE1lbnVJdGVtW10sIHNvdXJjZSkgPT4ge1xuXG4gICAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBpdGVtXG4gICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZnJvbU9iamVjdChzb3VyY2UpO1xuXG4gICAgICAgICAgLy8gU2tpcCBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICAgIGlmIChyZXMuZmluZCgoaSkgPT4gTWVudUl0ZW1zLmlzU2FtZShpLCBpdGVtKSkpIHJldHVybiByZXM7XG5cbiAgICAgICAgICAvLyBSZXVzZSBleGlzdGluZyBpZCwgaWYgcG9zc2libGVcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0l0ZW0gPSB0aGlzLmRhdGE/LmZpbmQoKGkpID0+IE1lbnVJdGVtcy5pc1NhbWUoaSwgaXRlbSkpO1xuICAgICAgICAgIGlmIChleGlzdGluZ0l0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0uaWQgPSBleGlzdGluZ0l0ZW0uaWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGl0ZW0uYWZ0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmVzLmZpbmRJbmRleChpID0+IGkudGl0bGUgPT09IGl0ZW0uYWZ0ZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzLnNsaWNlKDAsIGluZGV4ICsgMSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KGl0ZW0pXG4gICAgICAgICAgICAgICAgLmNvbmNhdChyZXMuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGl0ZW0uYmVmb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHJlcy5maW5kSW5kZXgoaSA9PiBpLnRpdGxlID09PSBpdGVtLmJlZm9yZSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXMuc2xpY2UoMCwgaW5kZXgpXG4gICAgICAgICAgICAgICAgLmNvbmNhdChpdGVtKVxuICAgICAgICAgICAgICAgIC5jb25jYXQocmVzLnNsaWNlKGluZGV4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXMuY29uY2F0KGl0ZW0pO1xuICAgICAgICB9LCBpdGVtcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgJHt0aGlzLl9sb2dQcmVmaXh9SW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uICcke0NPUkVfQ09ORklHX09QVElPTlMuTUVOVV9JVEVNUy5rZXl9Jy4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgbWVudSBpdGVtYCwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgaXRlbSB1c2luZyBhY2NvdW50IHJpZ2h0c1xuICAgIGNvbnN0IG9wdHMgPSB7ZGVidWc6IHRoaXMuX2RlYnVnfTtcbiAgICBpdGVtcyA9IGl0ZW1zXG4gICAgICAuZmlsdGVyKGl0ZW0gPT4gTWVudUl0ZW1zLmNoZWNrSWZWaXNpYmxlKGl0ZW0sIGFjY291bnQsIGNvbmZpZywgb3B0cykpXG4gICAgICAubWFwKGl0ZW0gPT4ge1xuICAgICAgICAvLyBHZW5lcmF0ZSBpdGVtJ3MgaWQgKGlmIG5lZWQpXG4gICAgICAgIGlmIChpc05pbChpdGVtLmlkKSkgaXRlbS5pZCA9IHRoaXMuX2NvbXB1dGVOZXdJZCgpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgdGl0bGUgdXNpbmcgYSBjb25maWcgcHJvcGVydHlcbiAgICAgICAgaWYgKGlzTm90TmlsT3JCbGFuayhpdGVtLnRpdGxlUHJvcGVydHkpICYmIGNvbmZpZykge1xuICAgICAgICAgIGl0ZW0udGl0bGUgPSBjb25maWcucHJvcGVydGllc1tpdGVtLnRpdGxlUHJvcGVydHldIHx8IGl0ZW0udGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KTtcblxuICAgIC8vIFJlLWF0dGFjaCBzdWIgbWVudSBpdGVtc1xuICAgIGlmIChkZXRhY2hlZFN1Ykl0ZW1zLmxlbmd0aCkge1xuICAgICAgaWYgKGFjY291bnQpIHtcbiAgICAgICAgdGhpcy5fYWRkU3ViTWVudUl0ZW1zKGRldGFjaGVkU3ViSXRlbXMsIHtza2lwSWZFeGlzdHM6IGZhbHNlLCBhdmFpbGFibGVQYXJlbnRzOiBkZXRhY2hlZFN1Ykl0ZW1zLmNvbmNhdChpdGVtcyl9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zID0gZGV0YWNoZWRTdWJJdGVtcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUZvdW5kICR7aXRlbXMubGVuZ3RofSB2aXNpYmxlIGl0ZW1zLi4uYCk7XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIF9hZGRTdWJNZW51SXRlbXMoc291cmNlczogSU1lbnVJdGVtW10sIG9wdHM/OiB7c2tpcElmRXhpc3RzPzogYm9vbGVhbjsgYXZhaWxhYmxlUGFyZW50cz86IE1lbnVJdGVtW119KSB7XG4gICAgcmV0dXJuIHNvdXJjZXMubWFwKHNvdXJjZSA9PiB0aGlzLl9hZGRTdWJNZW51SXRlbSh0aGlzLmZyb21PYmplY3Qoc291cmNlKSwgb3B0cykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkU3ViTWVudUl0ZW0obmV3SXRlbTogTWVudUl0ZW0sIG9wdHM/OiB7c2tpcElmRXhpc3RzPzogYm9vbGVhbjsgYXZhaWxhYmxlUGFyZW50cz86IE1lbnVJdGVtW119KSB7XG4gICAgb3B0cyA9IHtcbiAgICAgIHNraXBJZkV4aXN0czogdHJ1ZSxcbiAgICAgIC4uLm9wdHMsXG4gICAgfTtcblxuICAgIC8vIEZpbmQgaWYgaXRlbSBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGV4aXN0aW5nSXRlbSA9IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0obmV3SXRlbSk7XG4gICAgaWYgKGV4aXN0aW5nSXRlbSkge1xuICAgICAgLy8gTm8gY2hhbmdlc1xuICAgICAgaWYgKG9wdHMuc2tpcElmRXhpc3RzICYmIE1lbnVJdGVtcy5pc1NhbWUoZXhpc3RpbmdJdGVtLCBuZXdJdGVtKSAmJiAhZXhpc3RpbmdJdGVtLmRldGFjaGVkKSB7XG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9U2tpcHBpbmcgc3ViIGl0ZW0gKHNhbWUgaXRlbSBhbHJlYWR5IGV4aXN0KWAsIG5ld0l0ZW0pO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdJdGVtO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fVVwZGF0aW5nIGV4aXN0aW5nIHN1YiBpdGVtICNgLCBleGlzdGluZ0l0ZW0uaWQpO1xuXG4gICAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIGl0ZW0sIGJ1dCBrZWVwIHRoZSBleGlzdGluZyBpZFxuICAgICAgaWYgKG5ld0l0ZW0gIT09IGV4aXN0aW5nSXRlbSkge1xuICAgICAgICBuZXdJdGVtLmlkID0gZXhpc3RpbmdJdGVtLmlkO1xuICAgICAgICBuZXdJdGVtLiRjaGlsZHJlbiA9IGV4aXN0aW5nSXRlbS4kY2hpbGRyZW47XG4gICAgICAgIG5ld0l0ZW0ucGlubmVkID0gZXhpc3RpbmdJdGVtLnBpbm5lZDtcbiAgICAgICAgaWYgKG5ld0l0ZW0ucGlubmVkKSB7XG4gICAgICAgICAgLy8gSWYgbG9hZGluZywga2VlcCBleGlzdGluZyB0aXRsZSBpZiBwaW5uZWQgKGF2b2lkIHRvIHNob3cgc2tlbGV0b24pXG4gICAgICAgICAgbmV3SXRlbS50aXRsZSA9IG5ld0l0ZW0udGl0bGUgfHwgZXhpc3RpbmdJdGVtLnRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIG5ld0l0ZW0udGl0bGUgPSBpc05vdE5pbChuZXdJdGVtLnRpdGxlKSA/IG5ld0l0ZW0udGl0bGUgOiBleGlzdGluZ0l0ZW0udGl0bGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBpdGVtJ3MgaWQgKGlmIG5lZWQpXG4gICAgZWxzZSBpZiAoaXNOaWwobmV3SXRlbS5pZCkpIHtcbiAgICAgIG5ld0l0ZW0uaWQgPSB0aGlzLl9jb21wdXRlTmV3SWQoKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHBhcmVudCB3aGVyZSB0byBhdHRhY2ggdGhlIGl0ZW1cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9maW5kUGFyZW50KG5ld0l0ZW0sIG9wdHM/LmF2YWlsYWJsZVBhcmVudHMpO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIC8vIEF0dGFjaCBpdGVtIHRvIHBhcmVudFxuICAgICAgdGhpcy5fYXR0YWNoTWVudVRvUGFyZW50KHBhcmVudCwgbmV3SXRlbSk7XG5cbiAgICAgIGNvbnN0IHBhdGhQYXJhbSA9IE1lbnVJdGVtcy5wYXJzZVBhdGhXaXRoUXVlcnkodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsKTtcblxuICAgICAgLy8gVXBkYXRlIGRldGFjaGVkIGl0ZW1zIDpcbiAgICAgIC8vIC0gZXhjbHVkZWQgbmV3IGl0ZW1cbiAgICAgIC8vIC0gYXR0YWNoIGFuZCBleGNsdWRlIHRob3NlIHRoYW4gY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBuZXcgaXRlbVxuICAgICAgLy8gU2VhcmNoIGluIGRldGFjaGVkIGl0ZW1zIG9uZSBoYXZlIG5ld0l0ZW0gYXMgcGFyZW50XG4gICAgICBjb25zdCBhbmNlc3RvciA9IG5ld0l0ZW0uYW5jZXN0b3I7XG4gICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zID0gdGhpcy5fZGV0YWNoZWRTdWJJdGVtcy5jb25jYXQoLi4ubmV3SXRlbS5jaGlsZHJlbilcbiAgICAgICAgLnJlZHVjZSgocmVzLCBpdGVtKSA9PiB7XG4gICAgICAgICAgLy8gRXhjbHVkZWQgbmV3bHkgYWRkIGl0ZW1cbiAgICAgICAgICBpZiAoaXRlbS5pZCA9PT0gbmV3SXRlbS5pZCkgcmV0dXJuIHJlcztcblxuICAgICAgICAgIC8vIElmIHNvbWUgZGV0YWNoZWQgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBuZXcgaXRlbTogZG8gaXRcbiAgICAgICAgICBpZiAoTWVudUl0ZW1zLmNoZWNrSWZTdWJNZW51VmlzaWJsZShpdGVtLCBwYXRoUGFyYW0pKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2ZpbmRQYXJlbnQoaXRlbSwgW2FuY2VzdG9yXSk7XG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSBpdGVtJ3MgY2hpbGRyZW5cbiAgICAgICAgICAgICAgY29uc3QgZGV0YWNoZWRDaGlsZHJlbiA9IHRoaXMuX2RldGFjaFN1Yk1lbnVJdGVtcyhwYXRoUGFyYW0sIGl0ZW0uY2hpbGRyZW4gfHwgW10pO1xuXG4gICAgICAgICAgICAgIC8vIEF0dGFjaCBpdGVtXG4gICAgICAgICAgICAgIHRoaXMuX2F0dGFjaE1lbnVUb1BhcmVudChwYXJlbnQsIGl0ZW0pO1xuXG4gICAgICAgICAgICAgIC8vIFJlbWVtYmVyIGRldGFjaGVkIGNoaWxkcmVuXG4gICAgICAgICAgICAgIHJldHVybiByZXMuY29uY2F0KC4uLmRldGFjaGVkQ2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERldGFjaCAoaWYgbmVlZClcbiAgICAgICAgICB0aGlzLl9kZXRhY2hUb1BhcmVudChpdGVtKTtcblxuICAgICAgICAgIC8vIEFkZCB0byBkZXRhY2hlZCBpdGVtc1xuICAgICAgICAgIHJldHVybiByZXMuY29uY2F0KGl0ZW0pO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyBBZGQgb3IgdXBkYXRlIGRldGFjaGVkIGl0ZW1cbiAgICAgIGNvbnN0IGRldGFjaGVkSW5kZXggPSBpc05vdE5pbChuZXdJdGVtLmlkKSA/IHRoaXMuX2RldGFjaGVkU3ViSXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pZCA9PT0gbmV3SXRlbS5pZCkgOiAtMTtcbiAgICAgIGlmIChkZXRhY2hlZEluZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zW2RldGFjaGVkSW5kZXhdID0gbmV3SXRlbTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLnB1c2gobmV3SXRlbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgbGlzdGVuaW5nIHJvdXRlXG4gICAgaWYgKCF0aGlzLl8kbGlzdGVuUm91dGUudmFsdWUpIHRoaXMuXyRsaXN0ZW5Sb3V0ZS5uZXh0KHRydWUpO1xuXG4gICAgcmV0dXJuIG5ld0l0ZW07XG4gIH1cblxuICBwcml2YXRlIF9jb21wdXRlTmV3SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1Db3VudGVyKys7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVTdWJNZW51SXRlbShpdGVtOiBNZW51SXRlbSkge1xuICAgIGNvbnN0IGV4aXN0aW5nSXRlbSA9IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0oaXRlbSk7XG4gICAgaWYgKGV4aXN0aW5nSXRlbSkge1xuICAgICAgdGhpcy5fZGV0YWNoVG9QYXJlbnQoZXhpc3RpbmdJdGVtKTtcbiAgICAgIHJldHVybiBleGlzdGluZ0l0ZW07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGV0YWNoU3ViTWVudUl0ZW1zKGN1cnJlbnRQYXRoUGFyYW0/OiBNZW51UGF0aFBhcmFtLCBzdWJJdGVtcz86IE1lbnVJdGVtW10pIHtcbiAgICBjdXJyZW50UGF0aFBhcmFtID0gY3VycmVudFBhdGhQYXJhbSA/IGN1cnJlbnRQYXRoUGFyYW0gOiBNZW51SXRlbXMucGFyc2VQYXRoV2l0aFF1ZXJ5KHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gKHN1Ykl0ZW1zIHx8IHRoaXMuZGF0YS5yZWR1Y2UoKHJlcywgcm9vdEVsZW1lbnQpID0+IHJlcy5jb25jYXQocm9vdEVsZW1lbnQuY2hpbGRyZW4pLCBbXSkpXG4gICAgICAucmVkdWNlKChyZXMsIHN1Ykl0ZW0pID0+IHtcblxuICAgICAgICAvLyBOb3QgdmlzaWJsZSA9PiBzaG91bGQgYmUgZGV0YWNoXG4gICAgICAgIGlmICghTWVudUl0ZW1zLmNoZWNrSWZTdWJNZW51VmlzaWJsZShzdWJJdGVtLCBjdXJyZW50UGF0aFBhcmFtKSkge1xuXG4gICAgICAgICAgdGhpcy5fZGV0YWNoVG9QYXJlbnQoc3ViSXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChzdWJJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWaXNpYmxlOiBjaGVjayBjaGlsZHJlblxuICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChcbiAgICAgICAgICB0aGlzLl9kZXRhY2hTdWJNZW51SXRlbXMoY3VycmVudFBhdGhQYXJhbSwgc3ViSXRlbS5jaGlsZHJlbilcbiAgICAgICAgKTtcbiAgICAgIH0sIFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RldGFjaFRvUGFyZW50KGl0ZW06IE1lbnVJdGVtKSB7XG4gICAgaWYgKCFpdGVtPy5wYXJlbnQpIHJldHVybjsgLy8gU2tpcCBpZiBhbHJlYWR5IGRldGFjaGVkXG4gICAgbGV0IGNoaWxkcmVuID0gaXRlbS5wYXJlbnQuY2hpbGRyZW4gfHwgW107XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBwYXJlbnQgY2hpbGRyZW5cbiAgICBjb25zdCBpbmRleEluUGFyZW50ID0gY2hpbGRyZW4uaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXhJblBhcmVudCAhPT0gLTEpIHtcbiAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uc2xpY2UoKTsgLy8gQ29weSBvcmlnaW5hbCBhcnJheSwgYmVjYXVzZSBpdCBjYW4gYmUgdXNlZCBpbiBhIGxvb3BcbiAgICAgIGNoaWxkcmVuLnNwbGljZShpbmRleEluUGFyZW50LCAxKTtcbiAgICAgIGl0ZW0ucGFyZW50LmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgfVxuXG4gICAgaXRlbS5wYXJlbnQgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZEV4aXN0aW5nSXRlbShzZWFyY2hJdGVtOiBJTWVudUl0ZW0sIGl0ZW1zPzogTWVudUl0ZW1bXSwgcmVjdXJzaXZlID0gdHJ1ZSk6IE1lbnVJdGVtIHtcbiAgICBpdGVtcyA9IGl0ZW1zIHx8IFsuLi50aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLCAuLi50aGlzLmRhdGFdO1xuICAgIGlmICghaXRlbXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkOyAvLyBOb3QgZm91bmRcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGlmIChNZW51SXRlbXMuaXNTYW1lSWRPclBhdGhBbmRQYXJhbXMoc2VhcmNoSXRlbSwgaXRlbSkpIHJldHVybiBpdGVtO1xuICAgICAgaWYgKHJlY3Vyc2l2ZSAmJiBpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5fZmluZEV4aXN0aW5nSXRlbShzZWFyY2hJdGVtLCBpdGVtLmNoaWxkcmVuKTtcbiAgICAgICAgaWYgKGNoaWxkKSByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZFBhcmVudChjaGlsZEl0ZW06IE1lbnVJdGVtLCBhdmFpbGFibGVQYXJlbnRzPzogTWVudUl0ZW1bXSk6IE1lbnVJdGVtIHtcbiAgICBpZiAoIWNoaWxkSXRlbT8ucGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoY2hpbGRJdGVtLnBhcmVudCkgcmV0dXJuIGNoaWxkSXRlbS5wYXJlbnQ7XG5cbiAgICBhdmFpbGFibGVQYXJlbnRzID0gYXZhaWxhYmxlUGFyZW50cyB8fCBbLi4udGhpcy5fZGV0YWNoZWRTdWJJdGVtcywgLi4udGhpcy5kYXRhXTtcblxuICAgIHJldHVybiBhdmFpbGFibGVQYXJlbnRzLnJlZHVjZSgocmVzLCBpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0/LnBhdGgpIHJldHVybiByZXM7XG5cbiAgICAgIC8vIEEgZm91bmQgaXRlbSBhbHJlYWR5IG1hdGNoIHdpdGggdGhlIG1lbnVJdGVtLnBhcmVudFBhdGggOiBrZWVwIGl0IGFzIGl0XG4gICAgICAvLyBUaGVyZSBpcyBhIGZvdW5kIGNhbmRpZGF0ZSB0aGF0IGFscmVhZHkgbWF0Y2ggdGhlIGN1cnJlbnQgY2FuZGlkYXRlIDoga2VlcCBpdFxuICAgICAgaWYgKE1lbnVJdGVtcy5pc1BhcmVudChjaGlsZEl0ZW0sIHJlcykpIHJldHVybiByZXM7XG5cbiAgICAgIC8vIElmIHRoZSBtZW51IGl0ZW0gaGFzIGV4cGxpY2l0IHBhcmVudFBhdGggYW5kIGl0cyBwYXRoIGFuZCBwYXRoIHBhcmFtIGFyZSB0aGUgc2FtZSBhcyB0aGUgY2FuZGlkYXRlICA6IHVzZSBpdCBhcyBwYXJlbnRcbiAgICAgIGlmIChNZW51SXRlbXMuaXNQYXJlbnQoY2hpbGRJdGVtLCBpdGVtKSkgcmV0dXJuIGl0ZW07XG5cbiAgICAgIGlmICghcmVzICYmIGl0ZW0uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmluZFBhcmVudChjaGlsZEl0ZW0sIGl0ZW0uY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sIHVuZGVmaW5lZCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBfYXR0YWNoTWVudVRvUGFyZW50KHBhcmVudDogTWVudUl0ZW0sIGNoaWxkOiBNZW51SXRlbSkge1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1BdHRhY2ggc3ViLW1lbnUgeyR7TWVudUl0ZW1zLmdldFVybChjaGlsZCl9fSB0byBwYXJlbnQgeyR7TWVudUl0ZW1zLmdldFVybChwYXJlbnQpfX1gKTtcblxuICAgIC8vIEF2b2lkIHRvIGtlZXAgaWRlbnRpY2FsIG1lbnUgaXRlbSAod2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgY2hpbGQgbWVudSBpdGVtKVxuICAgIC8vaWYgKCFwYXJlbnQ/LiRjaGlsZHJlbikgcGFyZW50LiRjaGlsZHJlbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVudUl0ZW1bXT4oW10pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuIHx8IFtdO1xuICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBjaGlsZHJlbi5maW5kSW5kZXgoaXRlbSA9PiBNZW51SXRlbXMuaXNTYW1lSWRPclBhdGhBbmRQYXJhbXMoaXRlbSwgY2hpbGQpKTtcblxuICAgIC8vIFVwZGF0ZSBleGlzdGluZyBlbGVtZW50XG4gICAgaWYgKGV4aXN0aW5nSW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAoY2hpbGRyZW5bZXhpc3RpbmdJbmRleF0gIT09IGNoaWxkKSB7XG4gICAgICAgIGNoaWxkcmVuW2V4aXN0aW5nSW5kZXhdID0gY2hpbGQ7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICBjaGlsZC5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cbiAgICAgIC8vIFNvcnQgYnkgdGFiIChvciBpZClcbiAgICAgIHBhcmVudC5jaGlsZHJlbiA9IGNoaWxkcmVuLnNvcnQoTWVudUl0ZW1zLnNvcnRCeVRhYk9ySWQpO1xuICAgICAgY2hpbGQucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgfVxuXG59XG4iXX0=
|
|
513
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL21lbnUvbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRyxPQUFPLEVBQWEsUUFBUSxFQUFFLFNBQVMsRUFBZSxNQUFNLGNBQWMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpHLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRzlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7OztBQUcvRSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBc0IsSUFBSSxDQUFDO0FBQzlELE1BQU0sQ0FBQyxN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IEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmcm9tLCBtZXJnZSwgbWVyZ2VNYXAsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW0sIE1lbnVJdGVtcywgTWVudU9wdGlvbnMgfSBmcm9tICcuL21lbnUubW9kZWwnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBEYXRlVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2NvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBDT1JFX0NPTkZJR19PUFRJT05TIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnL2NvcmUuY29uZmlnJztcbmltcG9ydCB7IGlzRW1wdHlBcnJheSwgaXNOaWwsIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFuayB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQWNjb3VudCB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2FjY291bnQubW9kZWwnO1xuaW1wb3J0IHsgU3RhcnRhYmxlT2JzZXJ2YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLW9ic2VydmFibGUtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBmaXJzdE5vdE5pbFByb21pc2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHsgSWNvblJlZiB9IGZyb20gJy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQgeyBMb2NhbFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJlZUl0ZW1FbnRpdHlVdGlscyB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL3RyZWUtaXRlbS1lbnRpdHkubW9kZWwnO1xuXG5leHBvcnQgdHlwZSBTcGxpdFBhbmVTaG93V2hlbiA9IGJvb2xlYW4gfCAnbGcnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUVOVV9TSE9XX1dIRU46IFNwbGl0UGFuZVNob3dXaGVuID0gJ2xnJztcbmV4cG9ydCBjb25zdCBBUFBfTUVOVV9JVEVNUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJTWVudUl0ZW1bXT4oJ21lbnVJdGVtcycpO1xuZXhwb3J0IGNvbnN0IEFQUF9NRU5VX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWVudU9wdGlvbnM+KCdtZW51T3B0aW9ucycpO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudVBhdGhQYXJhbSB7XG4gIHBhdGg6IHN0cmluZztcbiAgcGFyYW1zOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTWVudVNlcnZpY2UgZXh0ZW5kcyBTdGFydGFibGVPYnNlcnZhYmxlU2VydmljZTxNZW51SXRlbVtdPiB7XG5cbiAgcmVhZG9ubHkgYWNjb3VudENoYW5nZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFjY291bnQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IHBpbm5lZEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51SXRlbT4oKTtcblxuICBwcml2YXRlIF9zdGF0aWNJdGVtczogTWVudUl0ZW1bXTtcbiAgcHJpdmF0ZSBfZGV0YWNoZWRTdWJJdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuICBwcml2YXRlIF9pdGVtQ291bnRlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvZ1ByZWZpeCA9ICdbbWVudS1zZXJ2aWNlXSAnO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kb3BlbmVkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfJHNwbGl0UGFuZVdoZW4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNwbGl0UGFuZVNob3dXaGVuPihERUZBVUxUX01FTlVfU0hPV19XSEVOKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfJGVuYWJsZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF8kc3ViTWVudUVuYWJsZWQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfJGxpc3RlblJvdXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX01FTlVfT1BUSU9OUykgcHJvdGVjdGVkIG9wdGlvbnM/OiBNZW51T3B0aW9ucyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9NRU5VX0lURU1TKSBzdGF0aWNJdGVtcz86IElNZW51SXRlbVtdXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgZW5hYmxlU3ViTWVudUljb246IHRydWUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZW5hYmxlU3ViTWVudXM6ICF0aGlzLnNldHRpbmdzLm1vYmlsZSAmJiBvcHRpb25zLmVuYWJsZVN1Yk1lbnVJY29uXG4gICAgfVxuICAgIHRoaXMuXyRzdWJNZW51RW5hYmxlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odGhpcy5vcHRpb25zLmVuYWJsZVN1Yk1lbnVzKTtcbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuXG4gICAgdGhpcy5fc3RhdGljSXRlbXMgPSAoc3RhdGljSXRlbXMgfHwgW10pLm1hcChzb3VyY2UgPT4gdGhpcy5mcm9tT2JqZWN0KHNvdXJjZSwge2NvbXB1dGVJZDogdHJ1ZSwgZmlsbFBhcmVudDogdHJ1ZX0pKTtcblxuICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSBbXTtcbiAgfVxuXG4gIGdldCBvcGVuZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuXyRvcGVuZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgc3BsaXRQYW5lV2hlbigpOiBPYnNlcnZhYmxlPFNwbGl0UGFuZVNob3dXaGVuPiB7XG4gICAgcmV0dXJuIHRoaXMuXyRzcGxpdFBhbmVXaGVuLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGVuYWJsZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuXyRlbmFibGVkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IHN1Yk1lbnVFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl8kc3ViTWVudUVuYWJsZWQudmFsdWU7XG4gIH1cblxuICBnZXQgc3ViTWVudUljb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZW5hYmxlU3ViTWVudUljb247XG4gIH1cblxuICBnZXQgc3ViSXRlbXMoKTogTWVudUl0ZW1bXSB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGEgfHwgW10pLnJlZHVjZSgocmVzLCByb290RWxlbWVudCkgPT4gcmVzLmNvbmNhdChyb290RWxlbWVudC5jaGlsZHJlbiksIFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9zdGF0aWNTdWJJdGVtcygpOiBNZW51SXRlbVtdIHtcbiAgICByZXR1cm4gKHRoaXMuX3N0YXRpY0l0ZW1zIHx8IFtdKS5yZWR1Y2UoKHJlcywgcm9vdEVsZW1lbnQpID0+IHJlcy5jb25jYXQocm9vdEVsZW1lbnQuY2hpbGRyZW4pLCBbXSk7XG4gIH1cblxuICBlbmFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl8kZW5hYmxlZC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIGVuYWJsZVN1Yk1lbnUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl8kc3ViTWVudUVuYWJsZWQubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBzZXRTcGxpdFBhbmVTaG93V2hlbih2YWx1ZTogU3BsaXRQYW5lU2hvd1doZW4pIHtcbiAgICBpZiAodGhpcy5fJHNwbGl0UGFuZVdoZW4udmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl8kc3BsaXRQYW5lV2hlbi5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTcGxpdFBhbmVXaGVuKCkge1xuICAgIGlmICh0aGlzLl8kc3BsaXRQYW5lV2hlbi52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuXyRzcGxpdFBhbmVXaGVuLm5leHQoZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuXyRzcGxpdFBhbmVXaGVuLm5leHQoREVGQVVMVF9NRU5VX1NIT1dfV0hFTik7XG4gICAgfVxuICB9XG5cbiAgZnJvbU9iamVjdChzb3VyY2U6IGFueSwgb3B0cz86IHt3aXRoQ2hpbGRyZW4/OiBib29sZWFuOyBjb21wdXRlSWQ/OiBib29sZWFuOyBmaWxsUGFyZW50PzogYm9vbGVhbn0pOiBNZW51SXRlbSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gTWVudUl0ZW0uZnJvbU9iamVjdChzb3VyY2UsIHt3aXRoQ2hpbGRyZW46IGZhbHNlfSk7XG4gICAgLy8gQ29tcHV0ZSBpZCBpZiBuZWVkXG4gICAgaWYgKG9wdHM/LmNvbXB1dGVJZCAmJiBpc05pbCh0YXJnZXQuaWQpKSB0YXJnZXQuaWQgPSB0aGlzLl9jb21wdXRlTmV3SWQoKTtcblxuICAgIC8vIFJlbW92ZSBpY29uIGlmIG5vdCBlbmFibGVkXG4gICAgaWYgKCF0aGlzLnN1Yk1lbnVJY29uRW5hYmxlZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIDxJY29uUmVmPntpY29uOiB1bmRlZmluZWQsIG1hdEljb246IHVuZGVmaW5lZCwgbWF0U3ZnSWNvbjogdW5kZWZpbmVkfSlcbiAgICB9XG5cbiAgICAvLyBSZWN1cnNpdmVcbiAgICB0YXJnZXQuY2hpbGRyZW4gPSAoc291cmNlLmNoaWxkcmVuIHx8IFtdKS5tYXAoKGpzb246IGFueSkgPT4gdGhpcy5mcm9tT2JqZWN0KGpzb24sIHsuLi5vcHRzLCBmaWxsUGFyZW50OiBmYWxzZX0pKTtcblxuICAgIC8vIEZpbGwgcGFyZW50IChvbmNlLCB3aGVuIHRoZSBmdWxsIHRyZWUgaXMgcmVhZHkpXG4gICAgaWYgKG9wdHM/LmZpbGxQYXJlbnQpIHtcbiAgICAgIFRyZWVJdGVtRW50aXR5VXRpbHMudHJlZUZpbGxQYXJlbnQodGFyZ2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgY3JlYXRlU3ViTWVudShzb3VyY2U6IFBhcnRpYWw8SU1lbnVJdGVtPik6IE1lbnVJdGVtIHtcbiAgICBpZiAoIXRoaXMuc3ViTWVudUVuYWJsZWQpIHJldHVybiBudWxsOyAvLyBTa2lwIGlmIGRpc2FibGVkXG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmZyb21PYmplY3Qoc291cmNlKTtcblxuICAgIC8vIENoZWNrIGlmIGV4aXN0c1xuICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSXRlbSA9IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0odGFyZ2V0KTtcbiAgICAgIGlmIChleGlzdGluZ0l0ZW0pIHJldHVybiBleGlzdGluZ0l0ZW07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlXG4gICAgaWYgKGlzTmlsKHRhcmdldC5pZCkpIHRhcmdldC5pZCA9IHRoaXMuX2NvbXB1dGVOZXdJZCgpO1xuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIGFzeW5jIGFkZFN1Yk1lbnVJdGVtcyhzb3VyY2VzOiBJTWVudUl0ZW1bXSwgb3B0cz86IHtza2lwSWZFeGlzdHM/OiBib29sZWFufSkge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgaWYgKCF0aGlzLnN1Yk1lbnVFbmFibGVkKSByZXR1cm47IC8vIFNraXBcbiAgICByZXR1cm4gc291cmNlcy5tYXAoc291cmNlID0+IHRoaXMuX2FkZFN1Yk1lbnVJdGVtKHRoaXMuZnJvbU9iamVjdChzb3VyY2UpLCBvcHRzKSk7XG4gIH1cblxuICBhc3luYyBhZGRTdWJNZW51SXRlbShpdGVtOiBJTWVudUl0ZW0sIG9wdHM/OiB7c2tpcElmRXhpc3RzPzogYm9vbGVhbn0pIHtcbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgIGlmICghdGhpcy5zdWJNZW51RW5hYmxlZCkgcmV0dXJuOyAvLyBTa2lwXG4gICAgcmV0dXJuIHRoaXMuX2FkZFN1Yk1lbnVJdGVtKHRoaXMuZnJvbU9iamVjdChpdGVtKSwgb3B0cyk7XG4gIH1cblxuICBhc3luYyByZW1vdmVTdWJNZW51SXRlbXMoaXRlbXM6IElNZW51SXRlbVtdKSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIGF3YWl0IHRoaXMucmVhZHkoKTtcbiAgICByZXR1cm4gKGl0ZW1zIHx8IFtdKS5tYXAoaXRlbSA9PiB0aGlzLl9yZW1vdmVTdWJNZW51SXRlbSh0aGlzLmZyb21PYmplY3QoaXRlbSkpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVN1Yk1lbnVJdGVtKGl0ZW06IElNZW51SXRlbSkge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW92ZVN1Yk1lbnVJdGVtKHRoaXMuZnJvbU9iamVjdChpdGVtKSk7XG4gIH1cblxuICB0b2dnbGVQaW5uZWQoc291cmNlOiBJTWVudUl0ZW0pIHtcbiAgICBjb25zdCBpdGVtID0gKHNvdXJjZSBpbnN0YW5jZW9mIE1lbnVJdGVtKSA/IHNvdXJjZSA6IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0odGhpcy5mcm9tT2JqZWN0KHNvdXJjZSkpO1xuXG4gICAgLy8gU2tpcCBpZiBub3QgZm91bmRcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS53YXJuKHRoaXMuX2xvZ1ByZWZpeCArIGBTdWIgbWVudSB7JHtzb3VyY2UucGF0aH19IGNhbm5vdCBiZSBmb3VuZCAtIHVuYWJsZSB0byB0b2dnbGUgcGlubmVkIWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVucGlubmVkXG4gICAgaWYgKGl0ZW0ucGlubmVkKSB7XG4gICAgICBpdGVtLnBpbm5lZCA9IGZhbHNlO1xuICAgICAgaWYgKCFpdGVtLmRldGFjaGVkKSB7XG5cbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcyA9IFtcbiAgICAgICAgICAuLi50aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLFxuICAgICAgICAgIC4uLnRoaXMuX2RldGFjaFN1Yk1lbnVJdGVtcygpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGlubmVkXG4gICAgZWxzZSB7XG4gICAgICBpdGVtLnBpbm5lZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5waW5uZWRFdmVudC5uZXh0KGl0ZW0pO1xuICB9XG5cbiAgX21hcmtBc09wZW5lZCgpIHtcbiAgICB0aGlzLl8kb3BlbmVkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBfbWFya0FzQ2xvc2VkKCkge1xuICAgIHRoaXMuXyRvcGVuZWQubmV4dChmYWxzZSk7XG4gIH1cblxuXG4gIHByb3RlY3RlZCBhc3luYyBuZ09uU3RhcnQoKSB7XG4gICAgY29uc29sZS5pbmZvKGAke3RoaXMuX2xvZ1ByZWZpeH1TdGFydGluZy4uLmApO1xuXG4gICAgLy8gUmVzdG9yZSBzdWIgaXRlbXMgZnJvbSBzZXR0aW5nc1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MucmVhZHkoKTtcbiAgICBjb25zdCBzZXR0aW5nc1N1Ykl0ZW1zOiBJTWVudUl0ZW1bXSA9IHRoaXMuc2V0dGluZ3MuZ2V0UGFnZVNldHRpbmdzKCdtZW51JywgJ3N1Yi1pdGVtcycpO1xuICAgIGlmIChpc05vdEVtcHR5QXJyYXkoc2V0dGluZ3NTdWJJdGVtcykpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5fbG9nUHJlZml4ICsgJ1Jlc3RvcmluZyBwaW5uZWQgaXRlbXMgZnJvbSBzZXR0aW5ncy4uLicsIHNldHRpbmdzU3ViSXRlbXMpO1xuICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcyA9IHNldHRpbmdzU3ViSXRlbXMubWFwKHNvdXJjZSA9PiB0aGlzLmZyb21PYmplY3Qoc291cmNlLCB7Y29tcHV0ZUlkOiB0cnVlLCBmaWxsUGFyZW50OiB0cnVlfSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY291bnRFdmVudCQgPSBtZXJnZShcbiAgICAgIGZyb20odGhpcy5hY2NvdW50U2VydmljZS5yZWFkeSgpKSxcbiAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dpbixcbiAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dvdXQucGlwZShcbiAgICAgICAgbWFwKF8gPT4gbnVsbClcbiAgICAgIClcbiAgICApLnBpcGUoXG4gICAgICBtYXAoYWNjb3VudCA9PiBpc05vdE5pbChhY2NvdW50Py5pZCkgPyBhY2NvdW50IDogbnVsbCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYTEsIGEyKSA9PiBEYXRlVXRpbHMuaXNTYW1lKGExPy51cGRhdGVEYXRlLCBhMj8udXBkYXRlRGF0ZSkpXG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICAvLyBDb21iaW5lIGNvbmZpZyBhbmQgYWNjb3VudCBldmVudHNcbiAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLFxuICAgICAgICBhY2NvdW50RXZlbnQkXG4gICAgICBdKS5zdWJzY3JpYmUoKFtjb25maWcsIGFjY291bnRdKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9UmVjZWl2ZWQgY29uZmlnIG9yIGFjY291bnQgZXZlbnQuIFJlZnJlc2hpbmcgaXRlbXMuLi5gLCBhY2NvdW50KTtcblxuICAgICAgICAvLyBMb2FkIGFsbCBpdGVtc1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2xvYWRNZW51SXRlbXMoY29uZmlnLCBhY2NvdW50KTtcblxuICAgICAgICAvLyBFbWl0IG5ldyByb290IGl0ZW1zXG4gICAgICAgIHRoaXMuZGF0YVN1YmplY3QubmV4dChpdGVtcyk7XG5cbiAgICAgICAgLy8gRW1pdCBhY2NvdW50IGNoYW5nZXMgZXZlbnRcbiAgICAgICAgdGhpcy5hY2NvdW50Q2hhbmdlcy5uZXh0KGFjY291bnQpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIG1lcmdlKFxuICAgICAgICB0aGlzLmFjY291bnRDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgbWFwKCgpID0+IE1lbnVJdGVtcy5wYXJzZVBhdGhXaXRoUXVlcnkodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsKSlcbiAgICAgICAgKSxcbiAgICAgICAgdGhpcy5fJGxpc3RlblJvdXRlLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKGxpc3RlbiA9PiBsaXN0ZW4gPT09IHRydWUpLFxuICAgICAgICAgIG1lcmdlTWFwKF8gPT4gdGhpcy5yb3V0ZXIuZXZlbnRzKSxcbiAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcbiAgICAgICAgICBtYXAoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiBNZW51SXRlbXMucGFyc2VQYXRoV2l0aFF1ZXJ5KGV2ZW50LnVybCkpLFxuICAgICAgICApXG4gICAgICApLnBpcGUoXG4gICAgICAgIHRocm90dGxlVGltZSgyNTApLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gaXNOb3RFbXB0eUFycmF5KHRoaXMuZGF0YSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHBhdGhQYXJhbSA9PiB7XG4gICAgICAgIGNvbnN0IGRldGFjaGVkU3ViSXRlbXMgPSB0aGlzLl9kZXRhY2hTdWJNZW51SXRlbXMocGF0aFBhcmFtKTtcbiAgICAgICAgaWYgKGRldGFjaGVkU3ViSXRlbXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLFxuICAgICAgICAgICAgLi4uZGV0YWNoZWRTdWJJdGVtc1xuICAgICAgICAgIF07XG5cbiAgICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fU5ld2x5IGRldGFjaGVkIGl0ZW1zOiBgLCBkZXRhY2hlZFN1Ykl0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG5cbiAgICAvLyBTYXZlIHBpbm5lZCBpdGVtc1xuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLnBpbm5lZEV2ZW50XG4gICAgICAgIC8vLnBpcGUoZGVib3VuY2VUaW1lKDEwMDApKVxuICAgICAgICAuc3Vic2NyaWJlKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgY29uc3QgcGlubmVkSXRlbXMgPSB0aGlzLnN1Ykl0ZW1zLmZpbHRlcihpID0+IGkuaXNQaW5uZWQoKSlcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBpdGVtLmFzT2JqZWN0KHt3aXRoQ2hpbGRyZW46IHRydWUsIGtlZXBMb2NhbElkOiBmYWxzZX0pKTtcblxuICAgICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5fbG9nUHJlZml4ICsgJ1NhdmluZyBwaW5uZWQgaXRlbXMgdG8gc2V0dGluZ3MuLi4nLCBwaW5uZWRJdGVtcyk7XG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5zYXZlUGFnZVNldHRpbmcoJ21lbnUnLCBwaW5uZWRJdGVtcywgJ3N1Yi1pdGVtcycpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gZmlyc3ROb3ROaWxQcm9taXNlKHRoaXMuZGF0YVN1YmplY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZE1lbnVJdGVtcyhjb25maWc6IENvbmZpZ3VyYXRpb258bnVsbCwgYWNjb3VudDogQWNjb3VudHxudWxsKSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1Mb2FkaW5nIG1lbnUgaXRlbXMuLi5gKTtcblxuICAgIC8vIFNhdmUgcHJldmlvdXMgY2hpbGRyZW4gb2Ygcm9vdCBpdGVtc1xuICAgIGNvbnN0IGRldGFjaGVkU3ViSXRlbXMgPSAodGhpcy5zdWJJdGVtcyB8fCBbXSlcbiAgICAgIC5yZWR1Y2UoKHJlcywgcm9vdEl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSByb290SXRlbS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKGlzRW1wdHlBcnJheShjaGlsZHJlbikpIHJldHVybiByZXM7XG4gICAgICAgIC8vIERldGFjaCBhbGwgcm9vdCBjaGlsZHJlblxuICAgICAgICByb290SXRlbS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IGNoaWxkLnBhcmVudCA9IG51bGwpO1xuICAgICAgICAvLyBSZXR1cm4gcm9vdCBjaGlsZHJlblxuICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChjaGlsZHJlbik7XG4gICAgICB9LCB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zIHx8IFtdKTtcblxuICAgIC8vIFJlc2V0IGJhc2Ugcm9vdCBpdGVtcyAoY2xlYW4gaXRlbXMgYWRkZWQgYnkgY29uZmlnKVxuICAgIGxldCBpdGVtczogTWVudUl0ZW1bXSA9IHRoaXMuX3N0YXRpY0l0ZW1zLnNsaWNlKCk7XG5cbiAgICAvLyBDb25jYXQgY29uZmlnJ3MgaXRlbXNcbiAgICBjb25zdCBjb25maWdWYWx1ZTogc3RyaW5nID0gY29uZmlnPy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLk1FTlVfSVRFTVMpO1xuICAgIGlmIChpc05vdE5pbE9yQmxhbmsoY29uZmlnVmFsdWUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25maWdJdGVtcyA9IEpTT04ucGFyc2UoY29uZmlnVmFsdWUpIGFzIElNZW51SXRlbVtdO1xuICAgICAgICBpdGVtcyA9IChjb25maWdJdGVtcyB8fCBbXSkucmVkdWNlKChyZXM6IE1lbnVJdGVtW10sIHNvdXJjZSkgPT4ge1xuXG4gICAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBpdGVtXG4gICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZnJvbU9iamVjdChzb3VyY2UsIHtjb21wdXRlSWQ6IHRydWV9KTtcblxuICAgICAgICAgIC8vIFNraXAgaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgICBpZiAocmVzLmZpbmQoKGkpID0+IE1lbnVJdGVtcy5pc1NhbWUoaSwgaXRlbSkpKSByZXR1cm4gcmVzO1xuXG4gICAgICAgICAgLy8gUmV1c2UgZXhpc3RpbmcgaWQsIGlmIHBvc3NpYmxlXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJdGVtID0gdGhpcy5kYXRhPy5maW5kKChpKSA9PiBNZW51SXRlbXMuaXNTYW1lKGksIGl0ZW0pKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdJdGVtKSB7XG4gICAgICAgICAgICBpdGVtLmlkID0gZXhpc3RpbmdJdGVtLmlkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpdGVtLmFmdGVyKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHJlcy5maW5kSW5kZXgoaSA9PiBpLnRpdGxlID09PSBpdGVtLmFmdGVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcy5zbGljZSgwLCBpbmRleCArIDEpXG4gICAgICAgICAgICAgICAgLmNvbmNhdChpdGVtKVxuICAgICAgICAgICAgICAgIC5jb25jYXQocmVzLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpdGVtLmJlZm9yZSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSByZXMuZmluZEluZGV4KGkgPT4gaS50aXRsZSA9PT0gaXRlbS5iZWZvcmUpO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzLnNsaWNlKDAsIGluZGV4KVxuICAgICAgICAgICAgICAgIC5jb25jYXQoaXRlbSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KHJlcy5zbGljZShpbmRleCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChpdGVtKTtcbiAgICAgICAgfSwgaXRlbXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbG9nUHJlZml4fUludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiAnJHtDT1JFX0NPTkZJR19PUFRJT05TLk1FTlVfSVRFTVMua2V5fScuIEV4cGVjdGVkIGFuIGFycmF5IG9mIG1lbnUgaXRlbWAsIGVycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIGl0ZW0gdXNpbmcgYWNjb3VudCByaWdodHNcbiAgICBjb25zdCBvcHRzID0ge2RlYnVnOiB0aGlzLl9kZWJ1Z307XG4gICAgaXRlbXMgPSBpdGVtc1xuICAgICAgLmZpbHRlcihpdGVtID0+IE1lbnVJdGVtcy5jaGVja0lmVmlzaWJsZShpdGVtLCBhY2NvdW50LCBjb25maWcsIG9wdHMpKVxuICAgICAgLm1hcChpdGVtID0+IHtcbiAgICAgICAgLy8gUmVwbGFjZSB0aXRsZSB1c2luZyBhIGNvbmZpZyBwcm9wZXJ0eVxuICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGl0ZW0udGl0bGVQcm9wZXJ0eSkgJiYgY29uZmlnKSB7XG4gICAgICAgICAgaXRlbS50aXRsZSA9IGNvbmZpZy5wcm9wZXJ0aWVzW2l0ZW0udGl0bGVQcm9wZXJ0eV0gfHwgaXRlbS50aXRsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUZvdW5kICR7aXRlbXMubGVuZ3RofSB2aXNpYmxlIHJvb3QgaXRlbXMuLi5gKTtcblxuICAgIC8vIFJlLWF0dGFjaCBzdWIgbWVudSBpdGVtc1xuICAgIGlmICh0aGlzLnN1Yk1lbnVFbmFibGVkICYmIGRldGFjaGVkU3ViSXRlbXMubGVuZ3RoKSB7XG4gICAgICBpZiAoYWNjb3VudCkge1xuICAgICAgICB0aGlzLl9hZGRTdWJNZW51SXRlbXMoZGV0YWNoZWRTdWJJdGVtcywge3NraXBJZkV4aXN0czogZmFsc2UsIGF2YWlsYWJsZVBhcmVudHM6IGRldGFjaGVkU3ViSXRlbXMuY29uY2F0KGl0ZW1zKX0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSBkZXRhY2hlZFN1Ykl0ZW1zO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIF9hZGRTdWJNZW51SXRlbXMoc291cmNlczogSU1lbnVJdGVtW10sIG9wdHM/OiB7c2tpcElmRXhpc3RzPzogYm9vbGVhbjsgYXZhaWxhYmxlUGFyZW50cz86IE1lbnVJdGVtW119KSB7XG4gICAgcmV0dXJuIHNvdXJjZXMubWFwKHNvdXJjZSA9PiB0aGlzLl9hZGRTdWJNZW51SXRlbSh0aGlzLmZyb21PYmplY3Qoc291cmNlKSwgb3B0cykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkU3ViTWVudUl0ZW0obmV3SXRlbTogTWVudUl0ZW0sIG9wdHM/OiB7c2tpcElmRXhpc3RzPzogYm9vbGVhbjsgYXZhaWxhYmxlUGFyZW50cz86IE1lbnVJdGVtW119KSB7XG4gICAgb3B0cyA9IHtcbiAgICAgIHNraXBJZkV4aXN0czogdHJ1ZSxcbiAgICAgIC4uLm9wdHMsXG4gICAgfTtcblxuICAgIC8vIEZpbmQgaWYgaXRlbSBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGV4aXN0aW5nSXRlbSA9IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0obmV3SXRlbSwgb3B0cz8uYXZhaWxhYmxlUGFyZW50cyk7XG4gICAgaWYgKGV4aXN0aW5nSXRlbSkge1xuICAgICAgLy8gTm8gY2hhbmdlc1xuICAgICAgaWYgKG9wdHMuc2tpcElmRXhpc3RzICYmIE1lbnVJdGVtcy5pc1NhbWUoZXhpc3RpbmdJdGVtLCBuZXdJdGVtKSAmJiAhZXhpc3RpbmdJdGVtLmRldGFjaGVkKSB7XG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9U2tpcHBpbmcgc3ViIGl0ZW0gKHNhbWUgaXRlbSBhbHJlYWR5IGV4aXN0KWAsIG5ld0l0ZW0pO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdJdGVtO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fVVwZGF0aW5nIGV4aXN0aW5nIHN1YiBpdGVtICNgLCBleGlzdGluZ0l0ZW0uaWQpO1xuXG4gICAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIGl0ZW0sIGJ1dCBrZWVwIHRoZSBleGlzdGluZyBpZFxuICAgICAgaWYgKG5ld0l0ZW0gIT09IGV4aXN0aW5nSXRlbSkge1xuICAgICAgICBuZXdJdGVtLmlkID0gZXhpc3RpbmdJdGVtLmlkO1xuICAgICAgICBuZXdJdGVtLiRjaGlsZHJlbiA9IGV4aXN0aW5nSXRlbS4kY2hpbGRyZW47XG4gICAgICAgIG5ld0l0ZW0ucGlubmVkID0gZXhpc3RpbmdJdGVtLnBpbm5lZDtcbiAgICAgICAgaWYgKG5ld0l0ZW0ucGlubmVkKSB7XG4gICAgICAgICAgLy8gSWYgbG9hZGluZywga2VlcCBleGlzdGluZyB0aXRsZSBpZiBwaW5uZWQgKGF2b2lkIHRvIHNob3cgc2tlbGV0b24pXG4gICAgICAgICAgbmV3SXRlbS50aXRsZSA9IG5ld0l0ZW0udGl0bGUgfHwgZXhpc3RpbmdJdGVtLnRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIG5ld0l0ZW0udGl0bGUgPSBpc05vdE5pbChuZXdJdGVtLnRpdGxlKSA/IG5ld0l0ZW0udGl0bGUgOiBleGlzdGluZ0l0ZW0udGl0bGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBpdGVtJ3MgaWQgKGlmIG5lZWQpXG4gICAgZWxzZSBpZiAoaXNOaWwobmV3SXRlbS5pZCkpIHtcbiAgICAgIG5ld0l0ZW0uaWQgPSB0aGlzLl9jb21wdXRlTmV3SWQoKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHBhcmVudCB3aGVyZSB0byBhdHRhY2ggdGhlIGl0ZW1cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9maW5kUGFyZW50KG5ld0l0ZW0sIG9wdHM/LmF2YWlsYWJsZVBhcmVudHMpO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIC8vIEF0dGFjaCBpdGVtIHRvIHBhcmVudFxuICAgICAgdGhpcy5fYXR0YWNoTWVudVRvUGFyZW50KHBhcmVudCwgbmV3SXRlbSk7XG5cbiAgICAgIGNvbnN0IHBhdGhQYXJhbSA9IE1lbnVJdGVtcy5wYXJzZVBhdGhXaXRoUXVlcnkodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsKTtcblxuICAgICAgLy8gVXBkYXRlIGRldGFjaGVkIGl0ZW1zIDpcbiAgICAgIC8vIC0gZXhjbHVkZWQgbmV3IGl0ZW1cbiAgICAgIC8vIC0gYXR0YWNoIGFuZCBleGNsdWRlIHRob3NlIHRoYW4gY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBuZXcgaXRlbVxuICAgICAgLy8gU2VhcmNoIGluIGRldGFjaGVkIGl0ZW1zIG9uZSBoYXZlIG5ld0l0ZW0gYXMgcGFyZW50XG4gICAgICBjb25zdCBhbmNlc3RvciA9IG5ld0l0ZW0uYW5jZXN0b3I7XG4gICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zID0gdGhpcy5fZGV0YWNoZWRTdWJJdGVtcy5jb25jYXQoLi4ubmV3SXRlbS5jaGlsZHJlbilcbiAgICAgICAgLnJlZHVjZSgocmVzLCBpdGVtKSA9PiB7XG4gICAgICAgICAgLy8gRXhjbHVkZWQgbmV3bHkgYWRkIGl0ZW1cbiAgICAgICAgICBpZiAoaXRlbS5pZCA9PT0gbmV3SXRlbS5pZCkgcmV0dXJuIHJlcztcblxuICAgICAgICAgIC8vIElmIHNvbWUgZGV0YWNoZWQgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBuZXcgaXRlbTogZG8gaXRcbiAgICAgICAgICBpZiAoTWVudUl0ZW1zLmNoZWNrSWZTdWJNZW51VmlzaWJsZShpdGVtLCBwYXRoUGFyYW0pKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2ZpbmRQYXJlbnQoaXRlbSwgW2FuY2VzdG9yXSk7XG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSBpdGVtJ3MgY2hpbGRyZW5cbiAgICAgICAgICAgICAgY29uc3QgZGV0YWNoZWRDaGlsZHJlbiA9IHRoaXMuX2RldGFjaFN1Yk1lbnVJdGVtcyhwYXRoUGFyYW0sIGl0ZW0uY2hpbGRyZW4gfHwgW10pO1xuXG4gICAgICAgICAgICAgIC8vIEF0dGFjaCBpdGVtXG4gICAgICAgICAgICAgIHRoaXMuX2F0dGFjaE1lbnVUb1BhcmVudChwYXJlbnQsIGl0ZW0pO1xuXG4gICAgICAgICAgICAgIC8vIFJlbWVtYmVyIGRldGFjaGVkIGNoaWxkcmVuXG4gICAgICAgICAgICAgIHJldHVybiByZXMuY29uY2F0KC4uLmRldGFjaGVkQ2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERldGFjaCAoaWYgbmVlZClcbiAgICAgICAgICB0aGlzLl9kZXRhY2hUb1BhcmVudChpdGVtKTtcblxuICAgICAgICAgIC8vIEFkZCB0byBkZXRhY2hlZCBpdGVtc1xuICAgICAgICAgIHJldHVybiByZXMuY29uY2F0KGl0ZW0pO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyBBZGQgb3IgdXBkYXRlIGRldGFjaGVkIGl0ZW1cbiAgICAgIGNvbnN0IGRldGFjaGVkSW5kZXggPSBpc05vdE5pbChuZXdJdGVtLmlkKSA/IHRoaXMuX2RldGFjaGVkU3ViSXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pZCA9PT0gbmV3SXRlbS5pZCkgOiAtMTtcbiAgICAgIGlmIChkZXRhY2hlZEluZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zW2RldGFjaGVkSW5kZXhdID0gbmV3SXRlbTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLnB1c2gobmV3SXRlbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgbGlzdGVuaW5nIHJvdXRlXG4gICAgaWYgKCF0aGlzLl8kbGlzdGVuUm91dGUudmFsdWUpIHRoaXMuXyRsaXN0ZW5Sb3V0ZS5uZXh0KHRydWUpO1xuXG4gICAgcmV0dXJuIG5ld0l0ZW07XG4gIH1cblxuICBwcml2YXRlIF9jb21wdXRlTmV3SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1Db3VudGVyKys7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVTdWJNZW51SXRlbShpdGVtOiBNZW51SXRlbSkge1xuICAgIGNvbnN0IGV4aXN0aW5nSXRlbSA9IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0oaXRlbSk7XG4gICAgaWYgKGV4aXN0aW5nSXRlbSkge1xuICAgICAgdGhpcy5fZGV0YWNoVG9QYXJlbnQoZXhpc3RpbmdJdGVtKTtcbiAgICAgIHJldHVybiBleGlzdGluZ0l0ZW07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGV0YWNoU3ViTWVudUl0ZW1zKGN1cnJlbnRQYXRoUGFyYW0/OiBNZW51UGF0aFBhcmFtLCBzdWJJdGVtcz86IE1lbnVJdGVtW10pIHtcbiAgICBjdXJyZW50UGF0aFBhcmFtID0gY3VycmVudFBhdGhQYXJhbSA/IGN1cnJlbnRQYXRoUGFyYW0gOiBNZW51SXRlbXMucGFyc2VQYXRoV2l0aFF1ZXJ5KHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gKHN1Ykl0ZW1zIHx8IHRoaXMuc3ViSXRlbXMpXG4gICAgICAucmVkdWNlKChyZXMsIHN1Ykl0ZW0pID0+IHtcblxuICAgICAgICAvLyBOb3QgdmlzaWJsZSA9PiBzaG91bGQgYmUgZGV0YWNoXG4gICAgICAgIGlmICghTWVudUl0ZW1zLmNoZWNrSWZTdWJNZW51VmlzaWJsZShzdWJJdGVtLCBjdXJyZW50UGF0aFBhcmFtKSkge1xuXG4gICAgICAgICAgdGhpcy5fZGV0YWNoVG9QYXJlbnQoc3ViSXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChzdWJJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWaXNpYmxlOiBjaGVjayBjaGlsZHJlblxuICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChcbiAgICAgICAgICB0aGlzLl9kZXRhY2hTdWJNZW51SXRlbXMoY3VycmVudFBhdGhQYXJhbSwgc3ViSXRlbS5jaGlsZHJlbilcbiAgICAgICAgKTtcbiAgICAgIH0sIFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RldGFjaFRvUGFyZW50KGl0ZW06IE1lbnVJdGVtKSB7XG4gICAgaWYgKCFpdGVtPy5wYXJlbnQpIHJldHVybjsgLy8gU2tpcCBpZiBhbHJlYWR5IGRldGFjaGVkXG4gICAgbGV0IGNoaWxkcmVuID0gaXRlbS5wYXJlbnQuY2hpbGRyZW4gfHwgW107XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBwYXJlbnQgY2hpbGRyZW5cbiAgICBjb25zdCBpbmRleEluUGFyZW50ID0gY2hpbGRyZW4uaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXhJblBhcmVudCAhPT0gLTEpIHtcbiAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uc2xpY2UoKTsgLy8gQ29weSBvcmlnaW5hbCBhcnJheSwgYmVjYXVzZSBpdCBjYW4gYmUgdXNlZCBpbiBhIGxvb3BcbiAgICAgIGNoaWxkcmVuLnNwbGljZShpbmRleEluUGFyZW50LCAxKTtcbiAgICAgIGl0ZW0ucGFyZW50LmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgfVxuXG4gICAgaXRlbS5wYXJlbnQgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZEV4aXN0aW5nSXRlbShzZWFyY2hJdGVtOiBJTWVudUl0ZW0sIGl0ZW1zPzogTWVudUl0ZW1bXSwgcmVjdXJzaXZlID0gdHJ1ZSk6IE1lbnVJdGVtIHtcbiAgICBpdGVtcyA9IGl0ZW1zIHx8IFsuLi50aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLCAuLi50aGlzLmRhdGFdO1xuICAgIGlmICghaXRlbXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkOyAvLyBOb3QgZm91bmRcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGlmIChNZW51SXRlbXMuaXNTYW1lSWRPclBhdGhBbmRQYXJhbXMoc2VhcmNoSXRlbSwgaXRlbSkpIHJldHVybiBpdGVtO1xuICAgICAgaWYgKHJlY3Vyc2l2ZSAmJiBpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5fZmluZEV4aXN0aW5nSXRlbShzZWFyY2hJdGVtLCBpdGVtLmNoaWxkcmVuKTtcbiAgICAgICAgaWYgKGNoaWxkKSByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZFBhcmVudChjaGlsZEl0ZW06IE1lbnVJdGVtLCBhdmFpbGFibGVQYXJlbnRzPzogTWVudUl0ZW1bXSk6IE1lbnVJdGVtIHtcbiAgICBpZiAoIWNoaWxkSXRlbT8ucGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoY2hpbGRJdGVtLnBhcmVudCkgcmV0dXJuIGNoaWxkSXRlbS5wYXJlbnQ7XG5cbiAgICBhdmFpbGFibGVQYXJlbnRzID0gYXZhaWxhYmxlUGFyZW50cyB8fCBbLi4udGhpcy5fZGV0YWNoZWRTdWJJdGVtcywgLi4udGhpcy5kYXRhXTtcblxuICAgIHJldHVybiBhdmFpbGFibGVQYXJlbnRzLnJlZHVjZSgocmVzLCBpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0/LnBhdGgpIHJldHVybiByZXM7XG5cbiAgICAgIC8vIEEgZm91bmQgaXRlbSBhbHJlYWR5IG1hdGNoIHdpdGggdGhlIG1lbnVJdGVtLnBhcmVudFBhdGggOiBrZWVwIGl0IGFzIGl0XG4gICAgICAvLyBUaGVyZSBpcyBhIGZvdW5kIGNhbmRpZGF0ZSB0aGF0IGFscmVhZHkgbWF0Y2ggdGhlIGN1cnJlbnQgY2FuZGlkYXRlIDoga2VlcCBpdFxuICAgICAgaWYgKE1lbnVJdGVtcy5pc1BhcmVudChjaGlsZEl0ZW0sIHJlcykpIHJldHVybiByZXM7XG5cbiAgICAgIC8vIElmIHRoZSBtZW51IGl0ZW0gaGFzIGV4cGxpY2l0IHBhcmVudFBhdGggYW5kIGl0cyBwYXRoIGFuZCBwYXRoIHBhcmFtIGFyZSB0aGUgc2FtZSBhcyB0aGUgY2FuZGlkYXRlICA6IHVzZSBpdCBhcyBwYXJlbnRcbiAgICAgIGlmIChNZW51SXRlbXMuaXNQYXJlbnQoY2hpbGRJdGVtLCBpdGVtKSkgcmV0dXJuIGl0ZW07XG5cbiAgICAgIGlmICghcmVzICYmIGl0ZW0uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmluZFBhcmVudChjaGlsZEl0ZW0sIGl0ZW0uY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sIHVuZGVmaW5lZCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBfYXR0YWNoTWVudVRvUGFyZW50KHBhcmVudDogTWVudUl0ZW0sIGNoaWxkOiBNZW51SXRlbSkge1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1BdHRhY2ggc3ViLW1lbnUgeyR7TWVudUl0ZW1zLmdldFVybChjaGlsZCl9fSB0byBwYXJlbnQgeyR7TWVudUl0ZW1zLmdldFVybChwYXJlbnQpfX1gKTtcblxuICAgIC8vIEF2b2lkIHRvIGtlZXAgaWRlbnRpY2FsIG1lbnUgaXRlbSAod2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgY2hpbGQgbWVudSBpdGVtKVxuICAgIC8vaWYgKCFwYXJlbnQ/LiRjaGlsZHJlbikgcGFyZW50LiRjaGlsZHJlbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVudUl0ZW1bXT4oW10pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuIHx8IFtdO1xuICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBjaGlsZHJlbi5maW5kSW5kZXgoaXRlbSA9PiBNZW51SXRlbXMuaXNTYW1lSWRPclBhdGhBbmRQYXJhbXMoaXRlbSwgY2hpbGQpKTtcblxuICAgIC8vIFVwZGF0ZSBleGlzdGluZyBlbGVtZW50XG4gICAgaWYgKGV4aXN0aW5nSW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAoY2hpbGRyZW5bZXhpc3RpbmdJbmRleF0gIT09IGNoaWxkKSB7XG4gICAgICAgIGNoaWxkcmVuW2V4aXN0aW5nSW5kZXhdID0gY2hpbGQ7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICBjaGlsZC5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cbiAgICAgIC8vIFNvcnQgYnkgdGFiIChvciBpZClcbiAgICAgIHBhcmVudC5jaGlsZHJlbiA9IGNoaWxkcmVuLnNvcnQoTWVudUl0ZW1zLnNvcnRCeVRhYk9ySWQpO1xuICAgICAgY2hpbGQucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgfVxuXG59XG4iXX0=
|
|
@@ -12,14 +12,16 @@ export class SubMenuTabDirective {
|
|
|
12
12
|
this.tab = tab;
|
|
13
13
|
this.router = router;
|
|
14
14
|
this.subMenuIcon = null; // { icon: 'none' };
|
|
15
|
-
this._debug = true;
|
|
16
15
|
this.path = MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url).path;
|
|
16
|
+
this._enable = menuService.subMenuEnabled;
|
|
17
17
|
}
|
|
18
18
|
ngAfterViewInit() {
|
|
19
|
-
if (!this.tab.disabled)
|
|
19
|
+
if (this._enable && !this.tab.disabled)
|
|
20
20
|
this._addToMenu();
|
|
21
21
|
}
|
|
22
22
|
ngOnChanges(changes) {
|
|
23
|
+
if (!this._enable)
|
|
24
|
+
return; // Skip
|
|
23
25
|
if (changes.disabled || changes.label || changes.subMenuTitle || changes.parentPath || changes.path) {
|
|
24
26
|
if (this.disabled) {
|
|
25
27
|
this._removeToMenu();
|
|
@@ -36,13 +38,11 @@ export class SubMenuTabDirective {
|
|
|
36
38
|
}
|
|
37
39
|
}
|
|
38
40
|
async _addToMenu() {
|
|
39
|
-
if (!this.menuService.subMenuEnabled)
|
|
40
|
-
return; // skip
|
|
41
41
|
const menuItem = this.menuItem;
|
|
42
42
|
if (!menuItem?.parentPath)
|
|
43
43
|
return;
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
// DEBUG
|
|
45
|
+
//if (this._debug) console.debug(`[sub-menu-tab] Refreshing sub menu {${menuItem.path}?tab=${menuItem.pathParams?.tab || 0} on parent {${menuItem.parentPath}}`);
|
|
46
46
|
this._menuItem = await this.menuService.addSubMenuItem(menuItem, { skipIfExists: false });
|
|
47
47
|
}
|
|
48
48
|
get menuItem() {
|
|
@@ -53,11 +53,10 @@ export class SubMenuTabDirective {
|
|
|
53
53
|
const tabParams = index === 0 ? {} : { tab: index.toString() };
|
|
54
54
|
// Create or load
|
|
55
55
|
if (!this._menuItem) {
|
|
56
|
-
this._menuItem = this.menuService.
|
|
56
|
+
this._menuItem = this.menuService.createSubMenu({
|
|
57
57
|
path: this.path,
|
|
58
58
|
pathParams: tabParams,
|
|
59
59
|
parentPath,
|
|
60
|
-
//icon: 'none',
|
|
61
60
|
});
|
|
62
61
|
}
|
|
63
62
|
// Update existing
|
|
@@ -66,10 +65,12 @@ export class SubMenuTabDirective {
|
|
|
66
65
|
this._menuItem.path = path;
|
|
67
66
|
this._menuItem.pathParams = { ...params, ...tabParams };
|
|
68
67
|
}
|
|
69
|
-
// Update title and icon
|
|
70
|
-
this._menuItem
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
// Update item (title and icon)
|
|
69
|
+
if (this._menuItem) {
|
|
70
|
+
this._menuItem.title = this.title;
|
|
71
|
+
if (this.subMenuIcon) {
|
|
72
|
+
Object.assign(this._menuItem, this.subMenuIcon);
|
|
73
|
+
}
|
|
73
74
|
}
|
|
74
75
|
return this._menuItem;
|
|
75
76
|
}
|
|
@@ -97,4 +98,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
97
98
|
}], subMenuIcon: [{
|
|
98
99
|
type: Input
|
|
99
100
|
}] } });
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLW1lbnUtdGFiLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9tZW51L3N1Yi1tZW51LXRhYi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsS0FBSyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUkxRixPQUFPLEVBQVksU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7QUFNbEQsTUFBTSxPQUFPLG1CQUFtQjtJQVc5QixZQUFvQixXQUF3QixFQUFVLFFBQXFCLEVBQVUsR0FBVyxFQUFVLE1BQWM7UUFBcEcsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFML0csZ0JBQVcsR0FBWSxJQUFJLENBQUMsQ0FBQyxvQkFBb0I7UUFNeEQsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwRixJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUM7SUFDNUMsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLENBQUMsT0FBTztRQUVsQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUks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LG1CQUFtQjtrQkFIL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2lCQUM1QjtzS0FFVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIElucHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFRhYiwgTWF0VGFiR3JvdXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBNZW51U2VydmljZSB9IGZyb20gJy4vbWVudS5zZXJ2aWNlJztcbmltcG9ydCB7IE1lbnVJdGVtLCBNZW51SXRlbXMgfSBmcm9tICcuL21lbnUubW9kZWwnO1xuaW1wb3J0IHsgaXNOb3ROaWwgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IEljb25SZWYgfSBmcm9tICcuLi8uLi9zaGFyZWQvdHlwZXMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYXBwU3ViTWVudVRhYl0nLFxufSlcbmV4cG9ydCBjbGFzcyBTdWJNZW51VGFiRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHBhcmVudFBhdGg6IHN0cmluZztcbiAgQElucHV0KCkgcGF0aDogc3RyaW5nO1xuICBASW5wdXQoKSBzdWJNZW51VGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgc3ViTWVudUljb246IEljb25SZWYgPSBudWxsOyAvLyB7IGljb246ICdub25lJyB9O1xuXG4gIHByaXZhdGUgX21lbnVJdGVtOiBNZW51SXRlbTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZW5hYmxlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWVudVNlcnZpY2U6IE1lbnVTZXJ2aWNlLCBwcml2YXRlIHRhYkdyb3VwOiBNYXRUYWJHcm91cCwgcHJpdmF0ZSB0YWI6IE1hdFRhYiwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge1xuICAgIHRoaXMucGF0aCA9IE1lbnVJdGVtcy5wYXJzZVBhdGhXaXRoUXVlcnkodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsKS5wYXRoO1xuICAgIHRoaXMuX2VuYWJsZSA9IG1lbnVTZXJ2aWNlLnN1Yk1lbnVFbmFibGVkO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLl9lbmFibGUgJiYgIXRoaXMudGFiLmRpc2FibGVkKSB0aGlzLl9hZGRUb01lbnUoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2VuYWJsZSkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICBpZiAoY2hhbmdlcy5kaXNhYmxlZCB8fCBjaGFuZ2VzLmxhYmVsIHx8IGNoYW5nZXMuc3ViTWVudVRpdGxlIHx8IGNoYW5nZXMucGFyZW50UGF0aCB8fCBjaGFuZ2VzLnBhdGgpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZVRvTWVudSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fYWRkVG9NZW51KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVtb3ZlVG9NZW51KCkge1xuICAgIGNvbnN0IG1lbnVJdGVtID0gdGhpcy5tZW51SXRlbTtcbiAgICBpZiAobWVudUl0ZW0pIHtcbiAgICAgIGF3YWl0IHRoaXMubWVudVNlcnZpY2UucmVtb3ZlU3ViTWVudUl0ZW0obWVudUl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2FkZFRvTWVudSgpIHtcbiAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMubWVudUl0ZW07XG4gICAgaWYgKCFtZW51SXRlbT8ucGFyZW50UGF0aCkgcmV0dXJuO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2lmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3N1Yi1tZW51LXRhYl0gUmVmcmVzaGluZyBzdWIgbWVudSB7JHttZW51SXRlbS5wYXRofT90YWI9JHttZW51SXRlbS5wYXRoUGFyYW1zPy50YWIgfHwgMH0gb24gcGFyZW50IHske21lbnVJdGVtLnBhcmVudFBhdGh9fWApO1xuXG4gICAgdGhpcy5fbWVudUl0ZW0gPSBhd2FpdCB0aGlzLm1lbnVTZXJ2aWNlLmFkZFN1Yk1lbnVJdGVtKG1lbnVJdGVtLCB7IHNraXBJZkV4aXN0czogZmFsc2UgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBtZW51SXRlbSgpOiBNZW51SXRlbSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRhYkdyb3VwLnNlbGVjdGVkSW5kZXggKyB0aGlzLnRhYi5wb3NpdGlvbjtcbiAgICBjb25zdCBwYXJlbnRQYXRoID0gaW5kZXggPT09IDAgPyB0aGlzLnBhcmVudFBhdGggOiB0aGlzLnBhdGg7XG4gICAgaWYgKCFwYXJlbnRQYXRoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB0YWJQYXJhbXMgPSBpbmRleCA9PT0gMCA/IHt9IDogeyB0YWI6IGluZGV4LnRvU3RyaW5nKCkgfTtcblxuICAgIC8vIENyZWF0ZSBvciBsb2FkXG4gICAgaWYgKCF0aGlzLl9tZW51SXRlbSkge1xuICAgICAgdGhpcy5fbWVudUl0ZW0gPSB0aGlzLm1lbnVTZXJ2aWNlLmNyZWF0ZVN1Yk1lbnUoe1xuICAgICAgICBwYXRoOiB0aGlzLnBhdGgsXG4gICAgICAgIHBhdGhQYXJhbXM6IHRhYlBhcmFtcyxcbiAgICAgICAgcGFyZW50UGF0aCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBleGlzdGluZ1xuICAgIGVsc2Uge1xuICAgICAgY29uc3QgeyBwYXRoLCBwYXJhbXMgfSA9IE1lbnVJdGVtcy5wYXJzZVBhdGhXaXRoUXVlcnkodGhpcy5wYXRoKTtcbiAgICAgIHRoaXMuX21lbnVJdGVtLnBhdGggPSBwYXRoO1xuICAgICAgdGhpcy5fbWVudUl0ZW0ucGF0aFBhcmFtcyA9IHsgLi4ucGFyYW1zLCAuLi50YWJQYXJhbXMgfTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgaXRlbSAodGl0bGUgYW5kIGljb24pXG4gICAgaWYgKHRoaXMuX21lbnVJdGVtKSB7XG4gICAgICB0aGlzLl9tZW51SXRlbS50aXRsZSA9IHRoaXMudGl0bGU7XG4gICAgICBpZiAodGhpcy5zdWJNZW51SWNvbikge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX21lbnVJdGVtLCB0aGlzLnN1Yk1lbnVJY29uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fbWVudUl0ZW07XG4gIH1cblxuICBwcml2YXRlIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLnN1Yk1lbnVUaXRsZSkgPyB0aGlzLnN1Yk1lbnVUaXRsZSA6IHRoaXMubGFiZWw7XG4gIH1cbn1cbiJdfQ==
|