ngx-histaff-alpha 1.6.6 → 1.6.8

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.
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUF1dGhEYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWhpc3RhZmYtYWxwaGEvc3JjL2xpYi9hcHAvaW50ZXJmYWNlcy9JQXV0aERhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IElPcmdUcmVlTGluZXJJdGVtIH0gZnJvbSBcIi4uL2xpYnJhcmllcy9jb3JlLW9yZy10cmVlL2NvcmUtb3JnLXRyZWUvSU9yZ1RyZWVJdGVtXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQZXJtaXNzaW9uQWN0aW9uIHtcclxuXHJcbiAgICAvLyBUSEUgQ09SRSBUV09cclxuICAgIGZ1bmN0aW9uSWQ6IG51bWJlcjtcclxuICAgIGFsbG93ZWRBY3Rpb25JZHM6IG51bWJlcltdO1xyXG5cclxuICAgIC8vIFRIRSBPVEhFUlNcclxuICAgIG1vZHVsZUNvZGU6IHN0cmluZztcclxuICAgIGZ1bmN0aW9uQ29kZTogc3RyaW5nO1xyXG4gICAgZnVuY3Rpb25Vcmw6IHN0cmluZztcclxuICAgIGFsbG93ZWRBY3Rpb25Db2Rlczogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUF1dGhEYXRhIHtcclxuICAgIGF2YXRhcjogc3RyaW5nO1xyXG4gICAgZW1wbG95ZWVJZD86IG51bWJlcjtcclxuICAgIGZ1bGxOYW1lOiBzdHJpbmc7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgaXNBZG1pbjogYm9vbGVhbjtcclxuICAgIGlzUm9vdDogYm9vbGVhbjtcclxuICAgIGlzTG9vazogYm9vbGVhbjtcclxuICAgIGlzRmlyc3RMb2dpbjogYW55O1xyXG4gICAgcGVybWlzc2lvblBhcmFtczogYW55O1xyXG4gICAgcmVmcmVzaFRva2VuOiBhbnk7XHJcbiAgICB0ZW5hbnRJZDogbnVtYmVyO1xyXG4gICAgdG9rZW46IHN0cmluZztcclxuICAgIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgICBsb2dpblRpbWU6IG51bWJlcjtcclxuICAgIG9yZ0lkczogSU9yZ1RyZWVMaW5lckl0ZW1bXTtcclxuICAgIG9yZ1Blcm1pc3Npb25DaGFuZ2VGbGFnJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xyXG4gICAgcGVybWlzc2lvbkFjdGlvbnM6IElQZXJtaXNzaW9uQWN0aW9uW107XHJcbn0iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUF1dGhEYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWhpc3RhZmYtYWxwaGEvc3JjL2xpYi9hcHAvaW50ZXJmYWNlcy9JQXV0aERhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IElPcmdUcmVlTGluZXJJdGVtIH0gZnJvbSBcIi4uL2xpYnJhcmllcy9jb3JlLW9yZy10cmVlL2NvcmUtb3JnLXRyZWUvSU9yZ1RyZWVJdGVtXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQZXJtaXNzaW9uQWN0aW9uIHtcclxuXHJcbiAgICAvLyBUSEUgQ09SRSBUV09cclxuICAgIGZ1bmN0aW9uSWQ6IG51bWJlcjtcclxuICAgIGFsbG93ZWRBY3Rpb25JZHM6IG51bWJlcltdO1xyXG5cclxuICAgIC8vIFRIRSBPVEhFUlNcclxuICAgIG1vZHVsZUNvZGU6IHN0cmluZztcclxuICAgIGZ1bmN0aW9uQ29kZTogc3RyaW5nO1xyXG4gICAgZnVuY3Rpb25Vcmw6IHN0cmluZztcclxuICAgIGFsbG93ZWRBY3Rpb25Db2Rlczogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUF1dGhEYXRhIHtcclxuICAgIGF2YXRhcjogc3RyaW5nO1xyXG4gICAgZW1wbG95ZWVJZD86IG51bWJlcjtcclxuICAgIGZ1bGxOYW1lOiBzdHJpbmc7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgaXNBZG1pbjogYm9vbGVhbjtcclxuICAgIGlzUm9vdDogYm9vbGVhbjtcclxuICAgIGlzTG9vazogYm9vbGVhbjtcclxuICAgIGlzRmlyc3RMb2dpbjogYW55O1xyXG4gICAgcGVybWlzc2lvblBhcmFtczogYW55O1xyXG4gICAgcmVmcmVzaFRva2VuOiBhbnk7XHJcbiAgICB0ZW5hbnRJZDogbnVtYmVyO1xyXG4gICAgdG9rZW46IHN0cmluZztcclxuICAgIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgICBncm91cElkPzogbnVtYmVyLCBcclxuICAgIGxvZ2luVGltZTogbnVtYmVyO1xyXG4gICAgb3JnSWRzOiBJT3JnVHJlZUxpbmVySXRlbVtdO1xyXG4gICAgb3JnUGVybWlzc2lvbkNoYW5nZUZsYWckOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XHJcbiAgICBwZXJtaXNzaW9uQWN0aW9uczogSVBlcm1pc3Npb25BY3Rpb25bXTtcclxufSJdfQ==
@@ -0,0 +1,452 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild, isDevMode } from '@angular/core';
2
+ import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { CoreLoadingSurfaceComponent } from '../core-loading-surface/core-loading-surface/core-loading-surface.component';
4
+ import { CoreReducerIconComponent } from '../core-reducer-icon/core-reducer-icon/core-reducer-icon.component';
5
+ import { TranslatePipe } from '../../app-pipes/translate.pipe';
6
+ import { TooltipDirective } from '../tooltip/tooltip.directive';
7
+ import { CoreFormControlBaseComponent } from '../core-form-control-base/core-form-control-base.component';
8
+ import { BehaviorSubject, Subject, debounceTime, distinctUntilChanged, filter, switchMap } from 'rxjs';
9
+ import { CommonModule, NgTemplateOutlet } from '@angular/common';
10
+ import { EnumTranslateKey } from 'alpha-global-constants';
11
+ import { liner_to_nested_array_script } from '../../../assets/js/rescusive_wk';
12
+ import { CoreCheckboxComponent } from '../core-checkbox/core-checkbox/core-checkbox.component';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../../services/auth.service";
15
+ import * as i2 from "../services/recursive.service";
16
+ import * as i3 from "../../services/multi-language.service";
17
+ import * as i4 from "../../services/layout.service";
18
+ import * as i5 from "../../services/topic-tree.service";
19
+ import * as i6 from "../alert/alert.service";
20
+ import * as i7 from "@angular/common";
21
+ import * as i8 from "@angular/forms";
22
+ export var EnumCoreArticleCategoryTreeaAccessorMode;
23
+ (function (EnumCoreArticleCategoryTreeaAccessorMode) {
24
+ EnumCoreArticleCategoryTreeaAccessorMode["ACTIVATED_SINGLE"] = "ACTIVATED_SINGLE";
25
+ EnumCoreArticleCategoryTreeaAccessorMode["ACTIVATED_INHERITANCE"] = "ACTIVATED_INHERITANCE";
26
+ EnumCoreArticleCategoryTreeaAccessorMode["CHECKED"] = "CHECKED";
27
+ })(EnumCoreArticleCategoryTreeaAccessorMode || (EnumCoreArticleCategoryTreeaAccessorMode = {}));
28
+ export class CoreTopicTreeComponent extends CoreFormControlBaseComponent {
29
+ writeValue(obj) {
30
+ this.value = obj;
31
+ switch (this.accessorMode) {
32
+ case EnumCoreArticleCategoryTreeaAccessorMode.CHECKED:
33
+ if (!!obj) {
34
+ const checkedKeys = [];
35
+ this.checkedIds = obj; // <=== 24/10/2023
36
+ obj.map(x => checkedKeys.push(x.toString()));
37
+ this.loading = true;
38
+ this.recursiveService.writeValueChecked(checkedKeys, this.data, this.disabledLoopExpand).subscribe(_ => {
39
+ this.loading = false;
40
+ if (!!this.data && !!this.data?.length)
41
+ this.data[0].tree$Expanded = true;
42
+ });
43
+ }
44
+ break;
45
+ case EnumCoreArticleCategoryTreeaAccessorMode.ACTIVATED_SINGLE:
46
+ case EnumCoreArticleCategoryTreeaAccessorMode.ACTIVATED_INHERITANCE:
47
+ if (!!obj) {
48
+ const activatedKeys = [];
49
+ obj.map(x => activatedKeys.push(x.toString()));
50
+ this.loading = true;
51
+ this.recursiveService.writeValueActivated(activatedKeys, this.data, this.disabledLoopExpand).subscribe(_ => {
52
+ this.loading = false;
53
+ if (!!this.data && !!this.data?.length)
54
+ this.data[0].tree$Expanded = true;
55
+ });
56
+ }
57
+ break;
58
+ default:
59
+ break;
60
+ }
61
+ if (this.accessorMode === EnumCoreArticleCategoryTreeaAccessorMode.CHECKED) {
62
+ }
63
+ else /* EnumCoreOrgTreeaAccessorMode.ACTIVATED_SINGLE or EnumCoreOrgTreeaAccessorMode.ACTIVATED_INHERITANCE */ {
64
+ }
65
+ }
66
+ setDisabledState(disabled) {
67
+ this.disabled = disabled;
68
+ }
69
+ constructor(
70
+ //public override injector: Injector,
71
+ authService, recursiveService, mls, layoutService, topicTreeService, alertService) {
72
+ super( /*injector*/);
73
+ this.authService = authService;
74
+ this.recursiveService = recursiveService;
75
+ this.mls = mls;
76
+ this.layoutService = layoutService;
77
+ this.topicTreeService = topicTreeService;
78
+ this.alertService = alertService;
79
+ this.lineColor = 'transparent';
80
+ this.itemDoubleClick = new EventEmitter();
81
+ this.itemClick = new EventEmitter();
82
+ this.activeIds = [];
83
+ this.checkedIds = [];
84
+ this.subscriptions = [];
85
+ this.search$ = new Subject();
86
+ this.searchPlaceholder = EnumTranslateKey.UI_COMMON_PLACE_HOLDER_SEARCH_HERE;
87
+ this.checkInheritance = true; // default value is true
88
+ this.showDissolved = true; // default value is false
89
+ this.initializing = true;
90
+ // this.reduced$ = this.coreOrgTreeState.coreOrgTreeReduced$;
91
+ this.initializing = false;
92
+ }
93
+ ngOnChanges(changes) {
94
+ if (changes['height']) {
95
+ this.resizeHeight();
96
+ }
97
+ }
98
+ ngOnInit() {
99
+ this.instanceNumber = new Date().getTime();
100
+ const newInstance = {
101
+ instanceNumber: this.instanceNumber,
102
+ selectedKey$: new BehaviorSubject(undefined),
103
+ activeKeys$: new BehaviorSubject([]),
104
+ checkedKeys$: new BehaviorSubject([]),
105
+ expandedKeys$: new BehaviorSubject([]),
106
+ checkInheritance$: new BehaviorSubject(true)
107
+ };
108
+ this.topicTreeService.instances.push(newInstance);
109
+ // Check xem chiều cao height có được truyền vào hay không
110
+ if (this.height === undefined) {
111
+ if (isDevMode()) {
112
+ //this.alertService.warn("CoreOrgTree không nhận được chiều cao (height) truyền vào từ lớp ngoài. Chiều cao mặc định sẽ được tính toán dựa vào bố cục chính.", alertOptions);
113
+ }
114
+ this.subscriptions.push(this.layoutService.contentContainerHeight$.subscribe(x => {
115
+ // basicSpacing là paddingBottom của lớp content-container
116
+ this.height = x - this.layoutService.corePageHeaderHeight - this.layoutService.basicSpacing;
117
+ }));
118
+ }
119
+ this.subscriptions.push(this.topicTreeService.linearData$.subscribe((x) => {
120
+ this.linearArticleCategoryArray = x;
121
+ }));
122
+ this.subscriptions.push(this.topicTreeService.status$.subscribe((x) => {
123
+ console.log("this.TopicTreeService.status$ changes", x);
124
+ const newActiveIds = [];
125
+ x.activeKeys.map((k) => {
126
+ newActiveIds.push(Number(k));
127
+ });
128
+ this.activeIds = newActiveIds;
129
+ if (this.accessorMode !== EnumCoreArticleCategoryTreeaAccessorMode.CHECKED) {
130
+ this.value = this.activeIds;
131
+ this.onChange(this.activeIds);
132
+ }
133
+ this.selectedKey = x.selectedKey;
134
+ }));
135
+ this.subscriptions.push(this.search$
136
+ .pipe(filter((x) => x !== null), debounceTime(500), distinctUntilChanged(), switchMap((text) => {
137
+ console.log('switchMap works');
138
+ this.loading = true;
139
+ return this.recursiveService.findItem(text, this.data);
140
+ }))
141
+ .subscribe((x) => {
142
+ this.loading = false;
143
+ }));
144
+ this.subscriptions.push(this.topicTreeService.status$
145
+ .pipe(filter((value) => !!!this.initializing && !!value))
146
+ .subscribe((x) => {
147
+ if (!!localStorage) {
148
+ localStorage.setItem('coreOrgTreeStatus', JSON.stringify(x));
149
+ }
150
+ }));
151
+ this.subscriptions.push(this.mls.lang$.subscribe((x) => (this.lang = x)));
152
+ }
153
+ resizeHeight() {
154
+ // height is not given and the tree resize as standard
155
+ if (!!!this.height) {
156
+ const sizeHeaderHeight = Number(getComputedStyle(document.documentElement)
157
+ .getPropertyValue('--size-header-height')
158
+ .replace('px', ''));
159
+ const sizeCorePageHeaderHeight = Number(getComputedStyle(document.documentElement)
160
+ .getPropertyValue('--size-core-page-header-height')
161
+ .replace('px', ''));
162
+ const containerHeight = window.innerHeight - sizeHeaderHeight - sizeCorePageHeaderHeight;
163
+ const pageHeaderHeight = Number(getComputedStyle(document.documentElement)
164
+ .getPropertyValue('--size-core-page-header-height')
165
+ .replace('px', ''));
166
+ const paginationHeight = Number(getComputedStyle(document.documentElement)
167
+ .getPropertyValue('--size-core-pagination-height')
168
+ .replace('px', ''));
169
+ const sizeMarginCorePaginationFull = Number(getComputedStyle(document.documentElement)
170
+ .getPropertyValue('--size-margin-core-pagination')
171
+ .replace('px', ''));
172
+ const height = containerHeight - pageHeaderHeight - paginationHeight + sizeMarginCorePaginationFull;
173
+ console.log(height);
174
+ this.container?.nativeElement.style.setProperty('--height', height + 'px');
175
+ }
176
+ else {
177
+ this.container?.nativeElement.style.setProperty('--height', this.height + 'px');
178
+ }
179
+ }
180
+ ngAfterViewInit() {
181
+ setTimeout(() => {
182
+ this.subscriptions.push(this.topicTreeService.articleCategoryTreeData$.subscribe((x) => {
183
+ this.data = x;
184
+ console.log("new Data coming", this.data, new Date().getTime());
185
+ if (!!this.data) {
186
+ if (!!this.data.length)
187
+ this.data[0].tree$Expanded = true;
188
+ }
189
+ }));
190
+ });
191
+ }
192
+ onItemClickLocal(e) {
193
+ this.linearArticleCategoryArray.map((x) => (x.active = false));
194
+ setTimeout(() => this.buildTreeData());
195
+ }
196
+ onToggleItem(e) {
197
+ const cloneCopy = JSON.parse(JSON.stringify(this.linearArticleCategoryArray));
198
+ const filter = cloneCopy.filter((x) => x.id === e.id);
199
+ if (filter.length === 1) {
200
+ filter[0].expanded = !!!e.expanded;
201
+ }
202
+ this.linearArticleCategoryArray = cloneCopy;
203
+ setTimeout(() => this.buildTreeData());
204
+ }
205
+ buildTreeData() {
206
+ this.loading = true;
207
+ const cloneCopy = JSON.parse(JSON.stringify(this.linearArticleCategoryArray));
208
+ if (typeof Worker !== 'undefined') {
209
+ // Create a new
210
+ console.log("🟢🟢 Worker works");
211
+ const worker = new Worker(liner_to_nested_array_script);
212
+ worker.addEventListener('message', ({ data }) => {
213
+ this.data = data.list;
214
+ if (!!this.data && !!this.data?.length)
215
+ this.data[0].tree$Expanded = true;
216
+ this.loading = false;
217
+ });
218
+ worker.postMessage({
219
+ list: cloneCopy,
220
+ keyField: 'id',
221
+ titleField: 'name',
222
+ parentField: 'parentId',
223
+ activeField: 'active',
224
+ //inheritantActiveField: 'inheritantActive',
225
+ checkedField: 'checked',
226
+ expandedField: 'expand',
227
+ });
228
+ }
229
+ else {
230
+ // Web workers are not supported in this environment.
231
+ // You should add a fallback so that your program still executes correctly.
232
+ const status = this.topicTreeService.status$.value;
233
+ this.subscriptions.push(this.recursiveService
234
+ .linerArrayToNestedArray(cloneCopy, 'id', 'name', 'parentId', 'active', 'checked', 'expand')
235
+ .subscribe((obj) => {
236
+ this.data = obj.list;
237
+ if (!!this.data && !!this.data?.length)
238
+ this.data[0].tree$Expanded = true;
239
+ this.loading = false;
240
+ }));
241
+ }
242
+ }
243
+ onExpandTogglerClick(e, event) {
244
+ event.stopPropagation();
245
+ const newValue = !e.tree$Expanded;
246
+ e.tree$Expanded = newValue;
247
+ // updating status with newValue
248
+ const currentExpandedIds = this.topicTreeService.status$.value?.expandedKeys;
249
+ let newExpandedIds = currentExpandedIds?.filter((_) => !!!currentExpandedIds.includes(e.id.toString()));
250
+ if (newValue) {
251
+ newExpandedIds?.push(e.id.toString());
252
+ }
253
+ newExpandedIds?.sort();
254
+ const newExpandedKeys = [];
255
+ newExpandedIds.map((x) => newExpandedKeys.push(x.toString()));
256
+ this.topicTreeService.status$.next({
257
+ ...this.topicTreeService.status$.value,
258
+ expandedKeys: newExpandedKeys,
259
+ });
260
+ }
261
+ onItemCheck(e, newValue) {
262
+ this.itemClick?.emit(e);
263
+ if (this.accessorMode !== EnumCoreArticleCategoryTreeaAccessorMode.CHECKED)
264
+ return;
265
+ // We have this var to hold nodes that are being changed
266
+ let toggledIds;
267
+ // We should calculate a new state into this var:
268
+ const newCheckedIds = JSON.parse(JSON.stringify(this.checkedIds));
269
+ // We will call this function after toggledIds changed
270
+ const changeValue = () => {
271
+ // If newValue === true, we will disctintly push changed ids to the state
272
+ // Otherwise we will remove them from the state
273
+ if (!!newValue) {
274
+ toggledIds.map(x => {
275
+ if (!!!newCheckedIds.includes(x)) {
276
+ newCheckedIds.push(x);
277
+ }
278
+ });
279
+ // Then asign the state to the newCheckedIds
280
+ this.checkedIds = newCheckedIds;
281
+ }
282
+ else {
283
+ const filter = newCheckedIds.filter(x => !!!toggledIds.includes(x));
284
+ // Then asign the state to the filter
285
+ this.checkedIds = filter;
286
+ }
287
+ // After the cases of if/else, make the control change with onChange
288
+ this.value = this.checkedIds;
289
+ this.onChange(this.checkedIds);
290
+ this.markAsTouched();
291
+ };
292
+ /* start: THIS CODE SCOPE calculates toggledIds */
293
+ if (this.checkInheritance) {
294
+ // If true, all the nested items will be checked/unchecked
295
+ this.recursiveService
296
+ .nestedToggleCheck(e, newValue)
297
+ .then((x) => {
298
+ // The ids have been changed
299
+ toggledIds = x;
300
+ // Now toggledIds were set. We call the function we declared
301
+ changeValue();
302
+ })
303
+ .catch((x) => {
304
+ console.error(x);
305
+ });
306
+ }
307
+ else {
308
+ // Otherwise we simply toggle check for current item only
309
+ toggledIds = [e.id];
310
+ // Now toggledIds were set. We call the function we declared
311
+ changeValue();
312
+ }
313
+ /* end: THIS CODE SCOPE calculates toggledIds */
314
+ // That is. Happy debugging!
315
+ }
316
+ onCheckIncludeDissolvedChange(value) {
317
+ console.log("onCheckIncludeDissolvedChange", value);
318
+ }
319
+ onCheckInheritanceChange(value) {
320
+ this.topicTreeService.status$.next({
321
+ ...this.topicTreeService.status$.value,
322
+ checkInheritance: value,
323
+ });
324
+ }
325
+ onObjectClick(e, event) {
326
+ // remove highlight class
327
+ // TO DO
328
+ if (!!e.protected)
329
+ return;
330
+ this.itemClick?.emit(e);
331
+ if (this.accessorMode === EnumCoreArticleCategoryTreeaAccessorMode.CHECKED)
332
+ return;
333
+ let activeIds = [];
334
+ this.recursiveService.nestedResetActive(this.data, false).then(falseAll => {
335
+ console.log("falseAll", falseAll);
336
+ if (this.accessorMode ===
337
+ EnumCoreArticleCategoryTreeaAccessorMode.ACTIVATED_INHERITANCE || !this.accessorMode) {
338
+ // If true, all the nested items will be active, the others are inactive
339
+ this.recursiveService
340
+ .nestedResetActive(e, true)
341
+ .then((x) => {
342
+ activeIds = x;
343
+ activeIds.sort();
344
+ const newActiveKeys = [];
345
+ activeIds.map((x) => newActiveKeys.push(x.toString()));
346
+ this.topicTreeService.status$.next({
347
+ ...this.topicTreeService.status$.value,
348
+ activeKeys: newActiveKeys,
349
+ selectedKey: e.id.toString()
350
+ });
351
+ this.activeIds = activeIds;
352
+ console.log(this.activeIds);
353
+ this.onChange(activeIds);
354
+ })
355
+ .catch((x) => {
356
+ console.error(x);
357
+ });
358
+ }
359
+ else {
360
+ // ACTIVATED_SINGLE
361
+ // Otherwise we simply set current item to be active only
362
+ activeIds = [e.id];
363
+ this.activeIds = activeIds;
364
+ this.topicTreeService.status$.next({
365
+ ...this.topicTreeService.status$.value,
366
+ activeKeys: [e.id.toString()],
367
+ selectedKey: e.id.toString(),
368
+ });
369
+ this.onChange(activeIds);
370
+ }
371
+ });
372
+ const { detail } = event;
373
+ if (detail === 2) {
374
+ console.log('This was a dblclick');
375
+ this.itemDoubleClick.emit(e);
376
+ }
377
+ this.selectedItem = e;
378
+ }
379
+ onSearchChange(text) {
380
+ this.search$.next(text);
381
+ }
382
+ ngAfterContentInit() {
383
+ console.log("ngAfterContentInit");
384
+ }
385
+ ngOnDestroy() {
386
+ this.subscriptions.map((x) => x?.unsubscribe());
387
+ if (!!this.instanceNumber) {
388
+ const tryToFind = this.topicTreeService.instances.filter((x) => x.instanceNumber === this.instanceNumber);
389
+ if (!!tryToFind.length) {
390
+ const newInstances = this.topicTreeService.instances.filter((x) => x.instanceNumber !== this.instanceNumber);
391
+ this.topicTreeService.instances = newInstances;
392
+ }
393
+ }
394
+ }
395
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CoreTopicTreeComponent, deps: [{ token: i1.AuthService }, { token: i2.RecursiveService }, { token: i3.MultiLanguageService }, { token: i4.LayoutService }, { token: i5.TopicTreeService }, { token: i6.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
396
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.3", type: CoreTopicTreeComponent, isStandalone: true, selector: "core-topic-tree", inputs: { lineColor: "lineColor", fullWidthMode: "fullWidthMode", accessorMode: "accessorMode", fullRendering: "fullRendering", height: "height", disabledLoopExpand: "disabledLoopExpand", showCheckInheritance: "showCheckInheritance", inlineExtraTemplateRef: "inlineExtraTemplateRef" }, outputs: { itemDoubleClick: "itemDoubleClick", itemClick: "itemClick" }, providers: [
397
+ {
398
+ provide: NG_VALUE_ACCESSOR,
399
+ multi: true,
400
+ useExisting: CoreTopicTreeComponent,
401
+ },
402
+ ], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "displayContent", first: true, predicate: ["displayContent"], descendants: true }, { propertyName: "reducedIconWrapper", first: true, predicate: ["reducedIconWrapper"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div #container class=\"core-topic-tree-container\" [class.full-width]=\"!!fullWidthMode\" *ngIf=\"!!data\"\n [ngStyle]=\"{\n position : 'relative',\n width: '100%',\n height: height + 'px'\n }\">\n <div #displayContent class=\"custom-org-tree\">\n <div class=\"core-org-tree-header d-flex-between\">\n <div>\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"search\" (ngModelChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchPlaceholder | translate: lang\" [class.full-width]=\"!!fullWidthMode\">\n </div>\n </div>\n\n <ng-container>\n\n <div class=\"scroll-container\" [ngStyle]=\"{\n height: height - layoutService.coreOrgTreeTopHeight - layoutService.coreOrgTreeBottomHeight + 'px'\n }\">\n <core-loading-surface [loading]=\"loading\" [height]=\"scrollContainerHeight\"></core-loading-surface>\n @for (root of data; track $index) {\n <ul class=\"root\" [class.collapsed]=\"!!!root.tree$Expanded\">\n <ng-container *ngTemplateOutlet=\"item; context: { context: root }\"></ng-container>\n </ul>\n }\n </div>\n\n\n <div [ngStyle]=\"{\n display: 'block',\n position: 'absolute',\n bottom: '0px',\n left: '0px',\n right: '0px',\n height: layoutService.corePaginationHeight + 'px',\n paddingLeft: layoutService.basicSpacing + 'px',\n paddingRight: layoutService.basicSpacing + 'px',\n lineHeight: layoutService.corePaginationHeight + 'px',\n overflow: 'hidden'\n }\">\n <div [ngStyle]=\"{\n height: layoutService.corePaginationHeight + 'px',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n }\">\n <!-- <div>\n <core-checkbox [(ngModel)]=\"showDissolved\"\n (ngModelChange)=\"onCheckIncludeDissolvedChange($event)\"\n [text]=\"'UI.CORE_ORG_TREE.SHOW_OUTDATED_UNITS_ABBREVIATED'\"\n [tooltip]=\"'UI.CORE_ORG_TREE.SHOW_OUTDATED_UNITS'\" tooltipPosition=\"above\"></core-checkbox>\n </div> -->\n <div class=\"check-inheritance-wrapper\" *ngIf=\"accessorMode === 'CHECKED'\">\n <core-checkbox *ngIf=\"showCheckInheritance\" [(ngModel)]=\"checkInheritance\"\n (ngModelChange)=\"onCheckInheritanceChange($event)\"\n [text]=\"'UI.CORE_ORG_TREE.CHECK_INHERITANCE'\"></core-checkbox>\n </div>\n </div>\n </div>\n\n <ng-template #item let-context=\"context\" let-id=\"context.id\" let-title=\"context.tree$Title\"\n let-highlighted=\"context.tree$Highlighted\" let-hasChildren=\"context.tree$HasChildren\"\n let-hasActiveChildren=\"context.tree$HasActiveChildren\" let-children=\"context.tree$Children\"\n let-expanded=\"context.tree$Expanded\" let-isActive=\"context.isActive\" let-active=\"context.tree$Active\"\n let-checked=\"context.tree$Checked\" let-protected=\"context.protected\">\n\n @if ((!showDissolved && !!isActive) || (!!showDissolved)) {\n <li [class.has-children]=\"!!hasChildren\" [class.collapsed]=\"!!hasChildren && !!!expanded\">\n <span (click)=\"onObjectClick(context, $event)\">\n @if ((!!showDissolved && !!hasChildren) || (!showDissolved && !!hasActiveChildren)) {\n <i class=\"expand-toggler feather-chevron-down\"\n (click)=\"onExpandTogglerClick(context, $event)\"></i>\n }\n @if (accessorMode === 'CHECKED' && !!!protected) {\n <core-checkbox (onClick)=\"onItemCheck(context, $event)\" [inputValue]=\"checked\"\n [disabled]=\"disabled\"></core-checkbox>\n }\n <object [class.active]=\"activeIds.includes(id)\" [class.highlighted]=\"highlighted\"\n [class.dissolved]=\"!isActive\" [class.protected]=\"protected\"\n [appTooltip]=\"title\">\n {{ title | translate: lang }}\n </object>\n\n @if (!!inlineExtraTemplateRef) {\n <ng-container *ngTemplateOutlet=\"inlineExtraTemplateRef; context: { context: context }\">\n </ng-container>\n }\n\n </span>\n @if (children.length) {\n <ul [class.collapsed]=\" !!!expanded\">\n @for (child of children; track $index) {\n @if (!!expanded || !!fullRendering) {\n <ng-container *ngTemplateOutlet=\"item; context: { context: child }\"></ng-container>\n }\n }\n </ul>\n }\n </li>\n }\n\n </ng-template>\n\n </ng-container>\n </div>\n\n\n</div>", styles: [".core-topic-tree-container{--background: var(--color-bg-core-org-tree);--height: 545px;border-radius:5px;--item-height: 50px;--ul-padding: 20px;--display: \"block\";--square-color: darkgray;--square-size: 30px;--line-color: \"transparent\";--active-item-color: var(--color-bg-pagination-button);--line-size: 1px;--reduced-icon-wrapper-height: 50px;--reduced-panel-height: calc(var(--height) - var(--reduced-icon-wrapper-height));--scroll-container-height: calc(var(--height) - var(--size-core-reducer-icon-wrapper-height) - var(--size-pagination-height));color:#000;background-color:var(--color-bg-core-org-tree)!important;height:var(--height);background:var(--background);width:var(--size-core-org-tree-width);transition:width .5s ease-out}@keyframes reducedPanelOn{0%{opacity:0;transform:rotate(-90deg)}to{opacity:1;transform:rotate(0)}}.core-topic-tree-container .custom-org-tree{display:var(--display)}.core-topic-tree-container .core-org-tree-header{height:var(--size-core-org-tree-header-height)}.core-topic-tree-container .core-org-tree-header input{width:calc(var(--size-core-org-tree-width) - var(--size-layout-block-cell-spacing) * 2 - var(--size-scrollbar-width) + 6px)}.core-topic-tree-container .core-org-tree-header input.full-width{width:calc(var(--size-core-org-tree-width) - var(--size-layout-block-cell-spacing) * 2)}.core-topic-tree-container .check-inheritance-wrapper{padding:15px}.core-topic-tree-container .form-control{border:none}.core-topic-tree-container .core-reducer-icon-wrapper{height:var(--size-core-reducer-icon-wrapper-height);padding:var(--size-layout-block-cell-spacing)}.core-topic-tree-container .scroll-container{background:var(--background);height:var(--scroll-container-height);overflow-y:auto;overflow-x:auto;position:relative;width:100%;border-radius:5px}.core-topic-tree-container .scroll-container *{box-sizing:border-box;padding:0;margin:0}@media (max-width: 575px){.core-topic-tree-container .scroll-container ::-webkit-slider-runnable-track{width:0px}}.core-topic-tree-container .scroll-container ul{display:table;vertical-align:top;padding-left:var(--ul-padding);transition:all .5s ease-out;width:100%}.core-topic-tree-container .scroll-container ul>li>span:hover{background-color:#fff;width:100%}.core-topic-tree-container .scroll-container ul>li>span:active{background-color:#f1f1f1}.core-topic-tree-container .scroll-container ul>li>span>object.active{color:var(--active-item-color)}.core-topic-tree-container .scroll-container ul .highlighted{color:var(--color-core-org-tree-highlighted);font-weight:700}.core-topic-tree-container .scroll-container ul .dissolved{color:#848484;text-decoration:line-through dashed}.core-topic-tree-container .scroll-container ul .dissolved.active{color:#c9252b!important}.core-topic-tree-container .scroll-container ul>li{display:block;position:relative}.core-topic-tree-container .scroll-container ul>li:before{content:\"\";display:block;position:absolute;width:var(--ul-padding);left:calc(var(--ul-padding) * -1);top:calc(var(--item-height) / 2);height:calc(var(--item-height) / 2);border-top:solid var(--line-size) var(--line-color);border-right:none;border-bottom:none;border-left:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul>li>span{display:flex;align-items:center;height:var(--item-height);white-space:nowrap;padding-left:8px;cursor:pointer}.core-topic-tree-container .scroll-container ul>li>span>i{color:var(--square-color);cursor:pointer;font-size:var(--square-size);width:var(--square-size);height:var(--square-size)}.core-topic-tree-container .scroll-container ul>li>span>.expand-toggler{position:absolute;z-index:1;transform:translate(-100%) rotate(0);transition:.5s ease-out;display:flex;align-items:center;justify-content:center}.core-topic-tree-container .scroll-container ul>li>span>.check-toggler{margin-left:5px;margin-right:5px}.core-topic-tree-container .scroll-container ul>li>ul>li>span:before{content:\"\";display:block;position:absolute;width:var(--ul-padding);left:calc(var(--ul-padding) * -2);top:calc(var(--item-height) / 2);height:var(--line-size);border-top:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul>li.collapsed>span>.expand-toggler{transform:translate(-100%) rotate(-90deg);transition:.5s ease-out}.core-topic-tree-container .scroll-container ul>li.collapsed:before{border-left:none}.core-topic-tree-container .scroll-container ul>li:not(.collapsed):not(.has-children):before{border-left:none}.core-topic-tree-container .scroll-container ul:not(.root):before{content:\"\";display:block;position:absolute;width:var(--line-size);left:calc(var(--ul-padding) * -1);height:calc(100% - var(--item-height) * 1.5);border-left:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul:not(.root)>li:last-child:not(.collapsed).has-children:after{content:\"\";display:block;position:absolute;height:calc(100% - var(--item-height));width:calc(var(--ul-padding) / 2);left:calc(var(--ul-padding) * -2);top:calc(var(--item-height) / 2);border-left:solid var(--line-size) var(--background);z-index:0}.core-topic-tree-container .scroll-container ul.collapsed:not(.root){display:none}.core-topic-tree-container .collapsed>li:before{display:none!important}.core-org-tree-container.full-width .scroll-container{width:auto}.core-org-tree-container.reduced{width:50px;padding:0;transition:width .5s ease-out}.core-org-tree-container.reduced .scroll-container{overflow:hidden}.core-org-tree-container.reduced .scroll-container>ul.root{display:none}.core-org-tree-container.reduced .scroll-container>.reduced-panel{color:var(--active-item-color);width:50px;height:var(--reduced-panel-height);writing-mode:vertical-rl;text-orientation:mixed;display:flex;align-items:center;justify-content:center;font-weight:700;animation:reducedPanelOn .5s ease-out}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CoreLoadingSurfaceComponent, selector: "core-loading-surface", inputs: ["loading", "height"] }, { kind: "component", type: CoreCheckboxComponent, selector: "core-checkbox", inputs: ["text", "tooltipPosition", "tooltip", "inputValue", "disabled"], outputs: ["onClick"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["appTooltip", "showAnyway", "position"] }] }); }
403
+ }
404
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CoreTopicTreeComponent, decorators: [{
405
+ type: Component,
406
+ args: [{ selector: 'core-topic-tree', standalone: true, imports: [
407
+ CommonModule,
408
+ FormsModule,
409
+ CoreLoadingSurfaceComponent,
410
+ CoreReducerIconComponent,
411
+ CoreCheckboxComponent,
412
+ TranslatePipe,
413
+ TooltipDirective,
414
+ NgTemplateOutlet
415
+ ], providers: [
416
+ {
417
+ provide: NG_VALUE_ACCESSOR,
418
+ multi: true,
419
+ useExisting: CoreTopicTreeComponent,
420
+ },
421
+ ], template: "<div #container class=\"core-topic-tree-container\" [class.full-width]=\"!!fullWidthMode\" *ngIf=\"!!data\"\n [ngStyle]=\"{\n position : 'relative',\n width: '100%',\n height: height + 'px'\n }\">\n <div #displayContent class=\"custom-org-tree\">\n <div class=\"core-org-tree-header d-flex-between\">\n <div>\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"search\" (ngModelChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchPlaceholder | translate: lang\" [class.full-width]=\"!!fullWidthMode\">\n </div>\n </div>\n\n <ng-container>\n\n <div class=\"scroll-container\" [ngStyle]=\"{\n height: height - layoutService.coreOrgTreeTopHeight - layoutService.coreOrgTreeBottomHeight + 'px'\n }\">\n <core-loading-surface [loading]=\"loading\" [height]=\"scrollContainerHeight\"></core-loading-surface>\n @for (root of data; track $index) {\n <ul class=\"root\" [class.collapsed]=\"!!!root.tree$Expanded\">\n <ng-container *ngTemplateOutlet=\"item; context: { context: root }\"></ng-container>\n </ul>\n }\n </div>\n\n\n <div [ngStyle]=\"{\n display: 'block',\n position: 'absolute',\n bottom: '0px',\n left: '0px',\n right: '0px',\n height: layoutService.corePaginationHeight + 'px',\n paddingLeft: layoutService.basicSpacing + 'px',\n paddingRight: layoutService.basicSpacing + 'px',\n lineHeight: layoutService.corePaginationHeight + 'px',\n overflow: 'hidden'\n }\">\n <div [ngStyle]=\"{\n height: layoutService.corePaginationHeight + 'px',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n }\">\n <!-- <div>\n <core-checkbox [(ngModel)]=\"showDissolved\"\n (ngModelChange)=\"onCheckIncludeDissolvedChange($event)\"\n [text]=\"'UI.CORE_ORG_TREE.SHOW_OUTDATED_UNITS_ABBREVIATED'\"\n [tooltip]=\"'UI.CORE_ORG_TREE.SHOW_OUTDATED_UNITS'\" tooltipPosition=\"above\"></core-checkbox>\n </div> -->\n <div class=\"check-inheritance-wrapper\" *ngIf=\"accessorMode === 'CHECKED'\">\n <core-checkbox *ngIf=\"showCheckInheritance\" [(ngModel)]=\"checkInheritance\"\n (ngModelChange)=\"onCheckInheritanceChange($event)\"\n [text]=\"'UI.CORE_ORG_TREE.CHECK_INHERITANCE'\"></core-checkbox>\n </div>\n </div>\n </div>\n\n <ng-template #item let-context=\"context\" let-id=\"context.id\" let-title=\"context.tree$Title\"\n let-highlighted=\"context.tree$Highlighted\" let-hasChildren=\"context.tree$HasChildren\"\n let-hasActiveChildren=\"context.tree$HasActiveChildren\" let-children=\"context.tree$Children\"\n let-expanded=\"context.tree$Expanded\" let-isActive=\"context.isActive\" let-active=\"context.tree$Active\"\n let-checked=\"context.tree$Checked\" let-protected=\"context.protected\">\n\n @if ((!showDissolved && !!isActive) || (!!showDissolved)) {\n <li [class.has-children]=\"!!hasChildren\" [class.collapsed]=\"!!hasChildren && !!!expanded\">\n <span (click)=\"onObjectClick(context, $event)\">\n @if ((!!showDissolved && !!hasChildren) || (!showDissolved && !!hasActiveChildren)) {\n <i class=\"expand-toggler feather-chevron-down\"\n (click)=\"onExpandTogglerClick(context, $event)\"></i>\n }\n @if (accessorMode === 'CHECKED' && !!!protected) {\n <core-checkbox (onClick)=\"onItemCheck(context, $event)\" [inputValue]=\"checked\"\n [disabled]=\"disabled\"></core-checkbox>\n }\n <object [class.active]=\"activeIds.includes(id)\" [class.highlighted]=\"highlighted\"\n [class.dissolved]=\"!isActive\" [class.protected]=\"protected\"\n [appTooltip]=\"title\">\n {{ title | translate: lang }}\n </object>\n\n @if (!!inlineExtraTemplateRef) {\n <ng-container *ngTemplateOutlet=\"inlineExtraTemplateRef; context: { context: context }\">\n </ng-container>\n }\n\n </span>\n @if (children.length) {\n <ul [class.collapsed]=\" !!!expanded\">\n @for (child of children; track $index) {\n @if (!!expanded || !!fullRendering) {\n <ng-container *ngTemplateOutlet=\"item; context: { context: child }\"></ng-container>\n }\n }\n </ul>\n }\n </li>\n }\n\n </ng-template>\n\n </ng-container>\n </div>\n\n\n</div>", styles: [".core-topic-tree-container{--background: var(--color-bg-core-org-tree);--height: 545px;border-radius:5px;--item-height: 50px;--ul-padding: 20px;--display: \"block\";--square-color: darkgray;--square-size: 30px;--line-color: \"transparent\";--active-item-color: var(--color-bg-pagination-button);--line-size: 1px;--reduced-icon-wrapper-height: 50px;--reduced-panel-height: calc(var(--height) - var(--reduced-icon-wrapper-height));--scroll-container-height: calc(var(--height) - var(--size-core-reducer-icon-wrapper-height) - var(--size-pagination-height));color:#000;background-color:var(--color-bg-core-org-tree)!important;height:var(--height);background:var(--background);width:var(--size-core-org-tree-width);transition:width .5s ease-out}@keyframes reducedPanelOn{0%{opacity:0;transform:rotate(-90deg)}to{opacity:1;transform:rotate(0)}}.core-topic-tree-container .custom-org-tree{display:var(--display)}.core-topic-tree-container .core-org-tree-header{height:var(--size-core-org-tree-header-height)}.core-topic-tree-container .core-org-tree-header input{width:calc(var(--size-core-org-tree-width) - var(--size-layout-block-cell-spacing) * 2 - var(--size-scrollbar-width) + 6px)}.core-topic-tree-container .core-org-tree-header input.full-width{width:calc(var(--size-core-org-tree-width) - var(--size-layout-block-cell-spacing) * 2)}.core-topic-tree-container .check-inheritance-wrapper{padding:15px}.core-topic-tree-container .form-control{border:none}.core-topic-tree-container .core-reducer-icon-wrapper{height:var(--size-core-reducer-icon-wrapper-height);padding:var(--size-layout-block-cell-spacing)}.core-topic-tree-container .scroll-container{background:var(--background);height:var(--scroll-container-height);overflow-y:auto;overflow-x:auto;position:relative;width:100%;border-radius:5px}.core-topic-tree-container .scroll-container *{box-sizing:border-box;padding:0;margin:0}@media (max-width: 575px){.core-topic-tree-container .scroll-container ::-webkit-slider-runnable-track{width:0px}}.core-topic-tree-container .scroll-container ul{display:table;vertical-align:top;padding-left:var(--ul-padding);transition:all .5s ease-out;width:100%}.core-topic-tree-container .scroll-container ul>li>span:hover{background-color:#fff;width:100%}.core-topic-tree-container .scroll-container ul>li>span:active{background-color:#f1f1f1}.core-topic-tree-container .scroll-container ul>li>span>object.active{color:var(--active-item-color)}.core-topic-tree-container .scroll-container ul .highlighted{color:var(--color-core-org-tree-highlighted);font-weight:700}.core-topic-tree-container .scroll-container ul .dissolved{color:#848484;text-decoration:line-through dashed}.core-topic-tree-container .scroll-container ul .dissolved.active{color:#c9252b!important}.core-topic-tree-container .scroll-container ul>li{display:block;position:relative}.core-topic-tree-container .scroll-container ul>li:before{content:\"\";display:block;position:absolute;width:var(--ul-padding);left:calc(var(--ul-padding) * -1);top:calc(var(--item-height) / 2);height:calc(var(--item-height) / 2);border-top:solid var(--line-size) var(--line-color);border-right:none;border-bottom:none;border-left:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul>li>span{display:flex;align-items:center;height:var(--item-height);white-space:nowrap;padding-left:8px;cursor:pointer}.core-topic-tree-container .scroll-container ul>li>span>i{color:var(--square-color);cursor:pointer;font-size:var(--square-size);width:var(--square-size);height:var(--square-size)}.core-topic-tree-container .scroll-container ul>li>span>.expand-toggler{position:absolute;z-index:1;transform:translate(-100%) rotate(0);transition:.5s ease-out;display:flex;align-items:center;justify-content:center}.core-topic-tree-container .scroll-container ul>li>span>.check-toggler{margin-left:5px;margin-right:5px}.core-topic-tree-container .scroll-container ul>li>ul>li>span:before{content:\"\";display:block;position:absolute;width:var(--ul-padding);left:calc(var(--ul-padding) * -2);top:calc(var(--item-height) / 2);height:var(--line-size);border-top:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul>li.collapsed>span>.expand-toggler{transform:translate(-100%) rotate(-90deg);transition:.5s ease-out}.core-topic-tree-container .scroll-container ul>li.collapsed:before{border-left:none}.core-topic-tree-container .scroll-container ul>li:not(.collapsed):not(.has-children):before{border-left:none}.core-topic-tree-container .scroll-container ul:not(.root):before{content:\"\";display:block;position:absolute;width:var(--line-size);left:calc(var(--ul-padding) * -1);height:calc(100% - var(--item-height) * 1.5);border-left:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul:not(.root)>li:last-child:not(.collapsed).has-children:after{content:\"\";display:block;position:absolute;height:calc(100% - var(--item-height));width:calc(var(--ul-padding) / 2);left:calc(var(--ul-padding) * -2);top:calc(var(--item-height) / 2);border-left:solid var(--line-size) var(--background);z-index:0}.core-topic-tree-container .scroll-container ul.collapsed:not(.root){display:none}.core-topic-tree-container .collapsed>li:before{display:none!important}.core-org-tree-container.full-width .scroll-container{width:auto}.core-org-tree-container.reduced{width:50px;padding:0;transition:width .5s ease-out}.core-org-tree-container.reduced .scroll-container{overflow:hidden}.core-org-tree-container.reduced .scroll-container>ul.root{display:none}.core-org-tree-container.reduced .scroll-container>.reduced-panel{color:var(--active-item-color);width:50px;height:var(--reduced-panel-height);writing-mode:vertical-rl;text-orientation:mixed;display:flex;align-items:center;justify-content:center;font-weight:700;animation:reducedPanelOn .5s ease-out}\n"] }]
422
+ }], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.RecursiveService }, { type: i3.MultiLanguageService }, { type: i4.LayoutService }, { type: i5.TopicTreeService }, { type: i6.AlertService }], propDecorators: { lineColor: [{
423
+ type: Input
424
+ }], fullWidthMode: [{
425
+ type: Input
426
+ }], accessorMode: [{
427
+ type: Input
428
+ }], fullRendering: [{
429
+ type: Input
430
+ }], height: [{
431
+ type: Input
432
+ }], disabledLoopExpand: [{
433
+ type: Input
434
+ }], showCheckInheritance: [{
435
+ type: Input
436
+ }], inlineExtraTemplateRef: [{
437
+ type: Input
438
+ }], itemDoubleClick: [{
439
+ type: Output
440
+ }], itemClick: [{
441
+ type: Output
442
+ }], container: [{
443
+ type: ViewChild,
444
+ args: ['container']
445
+ }], displayContent: [{
446
+ type: ViewChild,
447
+ args: ['displayContent']
448
+ }], reducedIconWrapper: [{
449
+ type: ViewChild,
450
+ args: ['reducedIconWrapper']
451
+ }] } });
452
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS10b3BpYy10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLXRvcGljLXRyZWUvY29yZS10b3BpYy10cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLXRvcGljLXRyZWUvY29yZS10b3BpYy10cmVlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUMsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBOEIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwTSxPQUFPLEVBQXdCLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZFQUE2RSxDQUFDO0FBQzFILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUUxRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBZ0IsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFckgsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixD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QVM7c0JBQWxCLE1BQU07Z0JBRWlCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDTyxjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDTSxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvcmVMb2FkaW5nU3VyZmFjZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvcmUtbG9hZGluZy1zdXJmYWNlL2NvcmUtbG9hZGluZy1zdXJmYWNlL2NvcmUtbG9hZGluZy1zdXJmYWNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3JlUmVkdWNlckljb25Db21wb25lbnQgfSBmcm9tICcuLi9jb3JlLXJlZHVjZXItaWNvbi9jb3JlLXJlZHVjZXItaWNvbi9jb3JlLXJlZHVjZXItaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uL2FwcC1waXBlcy90cmFuc2xhdGUucGlwZSc7XG5pbXBvcnQgeyBUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnLi4vdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb3JlRm9ybUNvbnRyb2xCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS1mb3JtLWNvbnRyb2wtYmFzZS9jb3JlLWZvcm0tY29udHJvbC1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb3BpY1RyZWVTZXJ2aWNlLCBJVG9waWNUcmVlSW5zdGFuY2UsIElBcnRpY2xlQ2F0ZWdvcnlUcmVlSXRlbSwgSVRvcGljVHJlZUxpbmVhckl0ZW0gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90b3BpYy10cmVlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBSZWN1cnNpdmVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcmVjdXJzaXZlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTXVsdGlMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tdWx0aS1sYW5ndWFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IExheW91dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYXlvdXQuc2VydmljZSc7XG5pbXBvcnQgeyBFbnVtVHJhbnNsYXRlS2V5IH0gZnJvbSAnYWxwaGEtZ2xvYmFsLWNvbnN0YW50cyc7XG5pbXBvcnQgeyBsaW5lcl90b19uZXN0ZWRfYXJyYXlfc2NyaXB0IH0gZnJvbSAnLi4vLi4vLi4vYXNzZXRzL2pzL3Jlc2N1c2l2ZV93ayc7XG5pbXBvcnQgeyBDb3JlQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi9jb3JlLWNoZWNrYm94L2NvcmUtY2hlY2tib3gvY29yZS1jaGVja2JveC5jb21wb25lbnQnO1xuXG5leHBvcnQgZW51bSBFbnVtQ29yZUFydGljbGVDYXRlZ29yeVRyZWVhQWNjZXNzb3JNb2RlIHtcbiAgQUNUSVZBVEVEX1NJTkdMRSA9ICdBQ1RJVkFURURfU0lOR0xFJyxcbiAgQUNUSVZBVEVEX0lOSEVSSVRBTkNFID0gJ0FDVElWQVRFRF9JTkhFUklUQU5DRScsXG4gIENIRUNLRUQgPSAnQ0hFQ0tFRCcsXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcmUtdG9waWMtdHJlZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgQ29yZUxvYWRpbmdTdXJmYWNlQ29tcG9uZW50LFxuICAgIENvcmVSZWR1Y2VySWNvbkNvbXBvbmVudCxcbiAgICBDb3JlQ2hlY2tib3hDb21wb25lbnQsXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBUb29sdGlwRGlyZWN0aXZlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXRcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvcmUtdG9waWMtdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jb3JlLXRvcGljLXRyZWUuY29tcG9uZW50LnNjc3MnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IENvcmVUb3BpY1RyZWVDb21wb25lbnQsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29yZVRvcGljVHJlZUNvbXBvbmVudCBleHRlbmRzIENvcmVGb3JtQ29udHJvbEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIGxpbmVDb2xvcjogc3RyaW5nID0gJ3RyYW5zcGFyZW50JztcbiAgQElucHV0KCkgZnVsbFdpZHRoTW9kZSE6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFjY2Vzc29yTW9kZSE6IEVudW1Db3JlQXJ0aWNsZUNhdGVnb3J5VHJlZWFBY2Nlc3Nvck1vZGU7XG4gIEBJbnB1dCgpIGZ1bGxSZW5kZXJpbmchOiBib29sZWFuO1xuICBASW5wdXQoKSBoZWlnaHQhOiBudW1iZXI7IC8vIENoaeG7gXUgY2FvIGPhu6dhIENvcmVPcmdUcmVlIGPhuqduIMSRxrDhu6NjIHRydXnhu4FuIHbDoG8hXG4gIEBJbnB1dCgpIGRpc2FibGVkTG9vcEV4cGFuZCE6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNob3dDaGVja0luaGVyaXRhbmNlITogYm9vbGVhbjtcblxuICBASW5wdXQoKSBpbmxpbmVFeHRyYVRlbXBsYXRlUmVmITogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAT3V0cHV0KCkgaXRlbURvdWJsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaXRlbUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Rpc3BsYXlDb250ZW50JykgZGlzcGxheUNvbnRlbnQhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdyZWR1Y2VkSWNvbldyYXBwZXInKSByZWR1Y2VkSWNvbldyYXBwZXIhOiBFbGVtZW50UmVmO1xuXG4gIG92ZXJyaWRlIHZhbHVlITogbnVtYmVyW107XG5cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZShvYmo6IG51bWJlcltdKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IG9iajtcblxuICAgIHN3aXRjaCAodGhpcy5hY2Nlc3Nvck1vZGUpIHtcbiAgICAgIGNhc2UgRW51bUNvcmVBcnRpY2xlQ2F0ZWdvcnlUcmVlYUFjY2Vzc29yTW9kZS5DSEVDS0VEOlxuICAgICAgICBpZiAoISFvYmopIHtcbiAgICAgICAgICBjb25zdCBjaGVja2VkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICB0aGlzLmNoZWNrZWRJZHMgPSBvYmo7IC8vIDw9PT0gMjQvMTAvMjAyM1xuICAgICAgICAgIG9iai5tYXAoeCA9PiBjaGVja2VkS2V5cy5wdXNoKHgudG9TdHJpbmcoKSkpO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5yZWN1cnNpdmVTZXJ2aWNlLndyaXRlVmFsdWVDaGVja2VkKGNoZWNrZWRLZXlzLCB0aGlzLmRhdGEsIHRoaXMuZGlzYWJsZWRMb29wRXhwYW5kKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghIXRoaXMuZGF0YSAmJiAhIXRoaXMuZGF0YT8ubGVuZ3RoKSB0aGlzLmRhdGFbMF0udHJlZSRFeHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVudW1Db3JlQXJ0aWNsZUNhdGVnb3J5VHJlZWFBY2Nlc3Nvck1vZGUuQUNUSVZBVEVEX1NJTkdMRTpcbiAgICAgIGNhc2UgRW51bUNvcmVBcnRpY2xlQ2F0ZWdvcnlUcmVlYUFjY2Vzc29yTW9kZS5BQ1RJVkFURURfSU5IRVJJVEFOQ0U6XG4gICAgICAgIGlmICghIW9iaikge1xuICAgICAgICAgIGNvbnN0IGFjdGl2YXRlZEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgb2JqLm1hcCh4ID0+IGFjdGl2YXRlZEtleXMucHVzaCh4LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucmVjdXJzaXZlU2VydmljZS53cml0ZVZhbHVlQWN0aXZhdGVkKGFjdGl2YXRlZEtleXMsIHRoaXMuZGF0YSwgdGhpcy5kaXNhYmxlZExvb3BFeHBhbmQpLnN1YnNjcmliZShfID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCEhdGhpcy5kYXRhICYmICEhdGhpcy5kYXRhPy5sZW5ndGgpIHRoaXMuZGF0YVswXS50cmVlJEV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuXG4gICAgaWYgKHRoaXMuYWNjZXNzb3JNb2RlID09PSBFbnVtQ29yZUFydGljbGVDYXRlZ29yeVRyZWVhQWNjZXNzb3JNb2RlLkNIRUNLRUQpIHtcblxuICAgIH0gZWxzZSAvKiBFbnVtQ29yZU9yZ1RyZWVhQWNjZXNzb3JNb2RlLkFDVElWQVRFRF9TSU5HTEUgb3IgRW51bUNvcmVPcmdUcmVlYUFjY2Vzc29yTW9kZS5BQ1RJVkFURURfSU5IRVJJVEFOQ0UgKi8ge1xuXG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuXG4gIGFjdGl2ZUlkczogbnVtYmVyW10gPSBbXTtcblxuICBjaGVja2VkSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8vIGZvciBkZWJ1Z2dpbmdcbiAgLy8gYWN0aXZlSWRzU3RyaW5nITogc3RyaW5nOyAgXG4gIGRhdGEhOiBJQXJ0aWNsZUNhdGVnb3J5VHJlZUl0ZW1bXTtcbiAgbG9hZGluZyE6IGJvb2xlYW47XG4gIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIGxpbmVhckFydGljbGVDYXRlZ29yeUFycmF5ITogSVRvcGljVHJlZUxpbmVhckl0ZW1bXTtcbiAgc2VhcmNoITogc3RyaW5nO1xuICBzZWFyY2gkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICByZWR1Y2VkITogYm9vbGVhbjtcbiAgc2VhcmNoUGxhY2Vob2xkZXIgPSBFbnVtVHJhbnNsYXRlS2V5LlVJX0NPTU1PTl9QTEFDRV9IT0xERVJfU0VBUkNIX0hFUkU7XG5cbiAgaW5pdGlhbGl6aW5nITogYm9vbGVhbjtcbiAgY2hlY2tJbmhlcml0YW5jZTogYm9vbGVhbiA9IHRydWU7IC8vIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZVxuICBzaG93RGlzc29sdmVkOiBib29sZWFuID0gdHJ1ZTsgLy8gZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZVxuICBzZWxlY3RlZEtleSE6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgc2VsZWN0ZWRJdGVtITogSVRvcGljVHJlZUxpbmVhckl0ZW07XG4gIGxhbmchOiBzdHJpbmc7XG4gIC8vcmVkdWNlZCQhOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG5cbiAgaW5zdGFuY2VOdW1iZXIhOiBudW1iZXI7XG4gIHNjcm9sbENvbnRhaW5lckhlaWdodCE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAvL3B1YmxpYyBvdmVycmlkZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWN1cnNpdmVTZXJ2aWNlOiBSZWN1cnNpdmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWxzOiBNdWx0aUxhbmd1YWdlU2VydmljZSxcbiAgICBwdWJsaWMgbGF5b3V0U2VydmljZTogTGF5b3V0U2VydmljZSxcbiAgICBwcml2YXRlIHRvcGljVHJlZVNlcnZpY2U6IFRvcGljVHJlZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoLyppbmplY3RvciovKTtcbiAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7XG5cbiAgICAvLyB0aGlzLnJlZHVjZWQkID0gdGhpcy5jb3JlT3JnVHJlZVN0YXRlLmNvcmVPcmdUcmVlUmVkdWNlZCQ7XG5cbiAgICB0aGlzLmluaXRpYWxpemluZyA9IGZhbHNlO1xuXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2hlaWdodCddKSB7XG4gICAgICB0aGlzLnJlc2l6ZUhlaWdodCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgdGhpcy5pbnN0YW5jZU51bWJlciA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGNvbnN0IG5ld0luc3RhbmNlOiBJVG9waWNUcmVlSW5zdGFuY2UgPSB7XG4gICAgICBpbnN0YW5jZU51bWJlcjogdGhpcy5pbnN0YW5jZU51bWJlcixcbiAgICAgIHNlbGVjdGVkS2V5JDogbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCksXG4gICAgICBhY3RpdmVLZXlzJDogbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pLFxuICAgICAgY2hlY2tlZEtleXMkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZ1tdPihbXSksXG4gICAgICBleHBhbmRlZEtleXMkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZ1tdPihbXSksXG4gICAgICBjaGVja0luaGVyaXRhbmNlJDogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKVxuICAgIH1cbiAgICB0aGlzLnRvcGljVHJlZVNlcnZpY2UuaW5zdGFuY2VzLnB1c2gobmV3SW5zdGFuY2UpXG5cbiAgICAvLyBDaGVjayB4ZW0gY2hp4buBdSBjYW8gaGVpZ2h0IGPDsyDEkcaw4bujYyB0cnV54buBbiB2w6BvIGhheSBraMO0bmdcbiAgICBpZiAodGhpcy5oZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIC8vdGhpcy5hbGVydFNlcnZpY2Uud2FybihcIkNvcmVPcmdUcmVlIGtow7RuZyBuaOG6rW4gxJHGsOG7o2MgY2hp4buBdSBjYW8gKGhlaWdodCkgdHJ1eeG7gW4gdsOgbyB04burIGzhu5twIG5nb8OgaS4gQ2hp4buBdSBjYW8gbeG6t2MgxJHhu4tuaCBz4bq9IMSRxrDhu6NjIHTDrW5oIHRvw6FuIGThu7FhIHbDoG8gYuG7kSBj4bulYyBjaMOtbmguXCIsIGFsZXJ0T3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgdGhpcy5sYXlvdXRTZXJ2aWNlLmNvbnRlbnRDb250YWluZXJIZWlnaHQkLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAvLyBiYXNpY1NwYWNpbmcgbMOgIHBhZGRpbmdCb3R0b20gY+G7p2EgbOG7m3AgY29udGVudC1jb250YWluZXJcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IHggLSB0aGlzLmxheW91dFNlcnZpY2UuY29yZVBhZ2VIZWFkZXJIZWlnaHQgLSB0aGlzLmxheW91dFNlcnZpY2UuYmFzaWNTcGFjaW5nO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLmxpbmVhckRhdGEkLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgICB0aGlzLmxpbmVhckFydGljbGVDYXRlZ29yeUFycmF5ID0geDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLnN0YXR1cyQuc3Vic2NyaWJlKCh4KSA9PiB7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzLlRvcGljVHJlZVNlcnZpY2Uuc3RhdHVzJCBjaGFuZ2VzXCIsIHgpXG5cbiAgICAgICAgY29uc3QgbmV3QWN0aXZlSWRzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICB4LmFjdGl2ZUtleXMubWFwKChrKSA9PiB7XG4gICAgICAgICAgbmV3QWN0aXZlSWRzLnB1c2goTnVtYmVyKGspKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZlSWRzID0gbmV3QWN0aXZlSWRzO1xuICAgICAgICBpZiAodGhpcy5hY2Nlc3Nvck1vZGUgIT09IEVudW1Db3JlQXJ0aWNsZUNhdGVnb3J5VHJlZWFBY2Nlc3Nvck1vZGUuQ0hFQ0tFRCkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmFjdGl2ZUlkcztcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuYWN0aXZlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkS2V5ID0geC5zZWxlY3RlZEtleTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zZWFyY2gkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoeCkgPT4geCAhPT0gbnVsbCksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKHRleHQpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzd2l0Y2hNYXAgd29ya3MnKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWN1cnNpdmVTZXJ2aWNlLmZpbmRJdGVtKHRleHQsIHRoaXMuZGF0YSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudG9waWNUcmVlU2VydmljZS5zdGF0dXMkXG4gICAgICAgIC5waXBlKGZpbHRlcigodmFsdWUpID0+ICEhIXRoaXMuaW5pdGlhbGl6aW5nICYmICEhdmFsdWUpKVxuICAgICAgICAuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICAgICAgaWYgKCEhbG9jYWxTdG9yYWdlKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY29yZU9yZ1RyZWVTdGF0dXMnLCBKU09OLnN0cmluZ2lmeSh4KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5tbHMubGFuZyQuc3Vic2NyaWJlKCh4KSA9PiAodGhpcy5sYW5nID0geCkpKTtcblxuICB9XG5cbiAgcHJpdmF0ZSByZXNpemVIZWlnaHQoKTogdm9pZCB7XG5cbiAgICAvLyBoZWlnaHQgaXMgbm90IGdpdmVuIGFuZCB0aGUgdHJlZSByZXNpemUgYXMgc3RhbmRhcmRcbiAgICBpZiAoISEhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGNvbnN0IHNpemVIZWFkZXJIZWlnaHQgPSBOdW1iZXIoXG4gICAgICAgIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKCctLXNpemUtaGVhZGVyLWhlaWdodCcpXG4gICAgICAgICAgLnJlcGxhY2UoJ3B4JywgJycpXG4gICAgICApO1xuICAgICAgY29uc3Qgc2l6ZUNvcmVQYWdlSGVhZGVySGVpZ2h0ID0gTnVtYmVyKFxuICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaXplLWNvcmUtcGFnZS1oZWFkZXItaGVpZ2h0JylcbiAgICAgICAgICAucmVwbGFjZSgncHgnLCAnJylcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHNpemVIZWFkZXJIZWlnaHQgLSBzaXplQ29yZVBhZ2VIZWFkZXJIZWlnaHQ7XG5cbiAgICAgIGNvbnN0IHBhZ2VIZWFkZXJIZWlnaHQgPSBOdW1iZXIoXG4gICAgICAgIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKCctLXNpemUtY29yZS1wYWdlLWhlYWRlci1oZWlnaHQnKVxuICAgICAgICAgIC5yZXBsYWNlKCdweCcsICcnKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFnaW5hdGlvbkhlaWdodCA9IE51bWJlcihcbiAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoJy0tc2l6ZS1jb3JlLXBhZ2luYXRpb24taGVpZ2h0JylcbiAgICAgICAgICAucmVwbGFjZSgncHgnLCAnJylcbiAgICAgICk7XG4gICAgICBjb25zdCBzaXplTWFyZ2luQ29yZVBhZ2luYXRpb25GdWxsID0gTnVtYmVyKFxuICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaXplLW1hcmdpbi1jb3JlLXBhZ2luYXRpb24nKVxuICAgICAgICAgIC5yZXBsYWNlKCdweCcsICcnKVxuICAgICAgKTtcblxuXG4gICAgICBjb25zdCBoZWlnaHQgPSBjb250YWluZXJIZWlnaHQgLSBwYWdlSGVhZGVySGVpZ2h0IC0gcGFnaW5hdGlvbkhlaWdodCArIHNpemVNYXJnaW5Db3JlUGFnaW5hdGlvbkZ1bGw7XG4gICAgICBjb25zb2xlLmxvZyhoZWlnaHQpO1xuXG4gICAgICB0aGlzLmNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgJy0taGVpZ2h0JywgaGVpZ2h0ICsgJ3B4J1xuICAgICAgKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgJy0taGVpZ2h0JywgdGhpcy5oZWlnaHQgKyAncHgnXG4gICAgICApO1xuICAgIH1cblxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICB0aGlzLnRvcGljVHJlZVNlcnZpY2UuYXJ0aWNsZUNhdGVnb3J5VHJlZURhdGEkLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGF0YSA9IHg7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJuZXcgRGF0YSBjb21pbmdcIiwgdGhpcy5kYXRhLCBuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICAgICAgICBpZiAoISF0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIGlmICghIXRoaXMuZGF0YS5sZW5ndGgpIHRoaXMuZGF0YVswXS50cmVlJEV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pXG4gIH1cblxuICBvbkl0ZW1DbGlja0xvY2FsKGU6IElBcnRpY2xlQ2F0ZWdvcnlUcmVlSXRlbSk6IHZvaWQge1xuICAgIHRoaXMubGluZWFyQXJ0aWNsZUNhdGVnb3J5QXJyYXkgLm1hcCgoeCkgPT4gKHguYWN0aXZlID0gZmFsc2UpKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYnVpbGRUcmVlRGF0YSgpKTtcbiAgfVxuXG4gIG9uVG9nZ2xlSXRlbShlOiBJQXJ0aWNsZUNhdGVnb3J5VHJlZUl0ZW0pIHtcbiAgICBjb25zdCBjbG9uZUNvcHk6IElBcnRpY2xlQ2F0ZWdvcnlUcmVlSXRlbVtdID0gSlNPTi5wYXJzZShcbiAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMubGluZWFyQXJ0aWNsZUNhdGVnb3J5QXJyYXkpXG4gICAgKTtcbiAgICBjb25zdCBmaWx0ZXIgPSBjbG9uZUNvcHkuZmlsdGVyKCh4KSA9PiB4LmlkID09PSBlLmlkKTtcblxuICAgIGlmIChmaWx0ZXIubGVuZ3RoID09PSAxKSB7XG4gICAgICBmaWx0ZXJbMF0uZXhwYW5kZWQgPSAhISFlLmV4cGFuZGVkO1xuICAgIH1cbiAgICB0aGlzLmxpbmVhckFydGljbGVDYXRlZ29yeUFycmF5ID0gY2xvbmVDb3B5O1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5idWlsZFRyZWVEYXRhKCkpO1xuICB9XG5cbiAgYnVpbGRUcmVlRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgY29uc3QgY2xvbmVDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmxpbmVhckFydGljbGVDYXRlZ29yeUFycmF5KSk7XG5cbiAgICBpZiAodHlwZW9mIFdvcmtlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ld1xuXG4gICAgICBjb25zb2xlLmxvZyhcIvCfn6Lwn5+iIFdvcmtlciB3b3Jrc1wiKTtcblxuICAgICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcihsaW5lcl90b19uZXN0ZWRfYXJyYXlfc2NyaXB0KTtcbiAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGEubGlzdDtcbiAgICAgICAgaWYgKCEhdGhpcy5kYXRhICYmICEhdGhpcy5kYXRhPy5sZW5ndGgpIHRoaXMuZGF0YVswXS50cmVlJEV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgbGlzdDogY2xvbmVDb3B5LFxuICAgICAgICBrZXlGaWVsZDogJ2lkJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ25hbWUnLFxuICAgICAgICBwYXJlbnRGaWVsZDogJ3BhcmVudElkJyxcbiAgICAgICAgYWN0aXZlRmllbGQ6ICdhY3RpdmUnLFxuICAgICAgICAvL2luaGVyaXRhbnRBY3RpdmVGaWVsZDogJ2luaGVyaXRhbnRBY3RpdmUnLFxuICAgICAgICBjaGVja2VkRmllbGQ6ICdjaGVja2VkJyxcbiAgICAgICAgZXhwYW5kZWRGaWVsZDogJ2V4cGFuZCcsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2ViIHdvcmtlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudC5cbiAgICAgIC8vIFlvdSBzaG91bGQgYWRkIGEgZmFsbGJhY2sgc28gdGhhdCB5b3VyIHByb2dyYW0gc3RpbGwgZXhlY3V0ZXMgY29ycmVjdGx5LlxuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy50b3BpY1RyZWVTZXJ2aWNlLnN0YXR1cyQudmFsdWU7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgdGhpcy5yZWN1cnNpdmVTZXJ2aWNlXG4gICAgICAgICAgLmxpbmVyQXJyYXlUb05lc3RlZEFycmF5KFxuICAgICAgICAgICAgY2xvbmVDb3B5LFxuICAgICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICAgICdwYXJlbnRJZCcsXG4gICAgICAgICAgICAnYWN0aXZlJyxcbiAgICAgICAgICAgICdjaGVja2VkJyxcbiAgICAgICAgICAgICdleHBhbmQnLFxuICAgICAgICAgICAgLy9zdGF0dXNcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgob2JqKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBvYmoubGlzdDtcbiAgICAgICAgICAgIGlmICghIXRoaXMuZGF0YSAmJiAhIXRoaXMuZGF0YT8ubGVuZ3RoKSB0aGlzLmRhdGFbMF0udHJlZSRFeHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvbkV4cGFuZFRvZ2dsZXJDbGljayhlOiBJQXJ0aWNsZUNhdGVnb3J5VHJlZUl0ZW0sIGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgbmV3VmFsdWUgPSAhZS50cmVlJEV4cGFuZGVkO1xuICAgIGUudHJlZSRFeHBhbmRlZCA9IG5ld1ZhbHVlO1xuXG4gICAgLy8gdXBkYXRpbmcgc3RhdHVzIHdpdGggbmV3VmFsdWVcbiAgICBjb25zdCBjdXJyZW50RXhwYW5kZWRJZHMgPVxuICAgICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLnN0YXR1cyQudmFsdWU/LmV4cGFuZGVkS2V5cztcbiAgICBsZXQgbmV3RXhwYW5kZWRJZHMgPSBjdXJyZW50RXhwYW5kZWRJZHM/LmZpbHRlcihcbiAgICAgIChfKSA9PiAhISFjdXJyZW50RXhwYW5kZWRJZHMuaW5jbHVkZXMoZS5pZC50b1N0cmluZygpKVxuICAgICk7XG5cbiAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgIG5ld0V4cGFuZGVkSWRzPy5wdXNoKGUuaWQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgbmV3RXhwYW5kZWRJZHM/LnNvcnQoKTtcblxuICAgIGNvbnN0IG5ld0V4cGFuZGVkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBuZXdFeHBhbmRlZElkcy5tYXAoKHgpID0+IG5ld0V4cGFuZGVkS2V5cy5wdXNoKHgudG9TdHJpbmcoKSkpO1xuXG4gICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLnN0YXR1cyQubmV4dCh7XG4gICAgICAuLi50aGlzLnRvcGljVHJlZVNlcnZpY2Uuc3RhdHVzJC52YWx1ZSEsXG4gICAgICBleHBhbmRlZEtleXM6IG5ld0V4cGFuZGVkS2V5cyxcbiAgICB9KTtcbiAgfVxuXG4gIG9uSXRlbUNoZWNrKGU6IElBcnRpY2xlQ2F0ZWdvcnlUcmVlSXRlbSwgbmV3VmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1DbGljaz8uZW1pdChlKTtcbiAgICBpZiAodGhpcy5hY2Nlc3Nvck1vZGUgIT09IEVudW1Db3JlQXJ0aWNsZUNhdGVnb3J5VHJlZWFBY2Nlc3Nvck1vZGUuQ0hFQ0tFRCkgcmV0dXJuO1xuXG4gICAgLy8gV2UgaGF2ZSB0aGlzIHZhciB0byBob2xkIG5vZGVzIHRoYXQgYXJlIGJlaW5nIGNoYW5nZWRcbiAgICBsZXQgdG9nZ2xlZElkczogbnVtYmVyW107XG4gICAgLy8gV2Ugc2hvdWxkIGNhbGN1bGF0ZSBhIG5ldyBzdGF0ZSBpbnRvIHRoaXMgdmFyOiBcbiAgICBjb25zdCBuZXdDaGVja2VkSWRzOiBudW1iZXJbXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jaGVja2VkSWRzKSk7XG5cbiAgICAvLyBXZSB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciB0b2dnbGVkSWRzIGNoYW5nZWRcbiAgICBjb25zdCBjaGFuZ2VWYWx1ZSA9ICgpID0+IHtcblxuICAgICAgLy8gSWYgbmV3VmFsdWUgPT09IHRydWUsIHdlIHdpbGwgZGlzY3RpbnRseSBwdXNoIGNoYW5nZWQgaWRzIHRvIHRoZSBzdGF0ZVxuICAgICAgLy8gT3RoZXJ3aXNlIHdlIHdpbGwgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc3RhdGVcbiAgICAgIGlmICghIW5ld1ZhbHVlKSB7XG4gICAgICAgIHRvZ2dsZWRJZHMubWFwKHggPT4ge1xuICAgICAgICAgIGlmICghISFuZXdDaGVja2VkSWRzLmluY2x1ZGVzKHgpKSB7XG4gICAgICAgICAgICBuZXdDaGVja2VkSWRzLnB1c2goeCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAvLyBUaGVuIGFzaWduIHRoZSBzdGF0ZSB0byB0aGUgbmV3Q2hlY2tlZElkc1xuICAgICAgICB0aGlzLmNoZWNrZWRJZHMgPSBuZXdDaGVja2VkSWRzO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBuZXdDaGVja2VkSWRzLmZpbHRlcih4ID0+ICEhIXRvZ2dsZWRJZHMuaW5jbHVkZXMoeCkpXG4gICAgICAgIC8vIFRoZW4gYXNpZ24gdGhlIHN0YXRlIHRvIHRoZSBmaWx0ZXJcbiAgICAgICAgdGhpcy5jaGVja2VkSWRzID0gZmlsdGVyO1xuICAgICAgfVxuXG4gICAgICAvLyBBZnRlciB0aGUgY2FzZXMgb2YgaWYvZWxzZSwgbWFrZSB0aGUgY29udHJvbCBjaGFuZ2Ugd2l0aCBvbkNoYW5nZVxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY2hlY2tlZElkcztcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5jaGVja2VkSWRzKTtcbiAgICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIC8qIHN0YXJ0OiBUSElTIENPREUgU0NPUEUgY2FsY3VsYXRlcyB0b2dnbGVkSWRzICovXG4gICAgaWYgKHRoaXMuY2hlY2tJbmhlcml0YW5jZSkge1xuICAgICAgLy8gSWYgdHJ1ZSwgYWxsIHRoZSBuZXN0ZWQgaXRlbXMgd2lsbCBiZSBjaGVja2VkL3VuY2hlY2tlZFxuICAgICAgdGhpcy5yZWN1cnNpdmVTZXJ2aWNlXG4gICAgICAgIC5uZXN0ZWRUb2dnbGVDaGVjayhlLCBuZXdWYWx1ZSlcbiAgICAgICAgLnRoZW4oKHgpID0+IHtcblxuICAgICAgICAgIC8vIFRoZSBpZHMgaGF2ZSBiZWVuIGNoYW5nZWRcbiAgICAgICAgICB0b2dnbGVkSWRzID0geDtcblxuICAgICAgICAgIC8vIE5vdyB0b2dnbGVkSWRzIHdlcmUgc2V0LiBXZSBjYWxsIHRoZSBmdW5jdGlvbiB3ZSBkZWNsYXJlZFxuICAgICAgICAgIGNoYW5nZVZhbHVlKCk7XG5cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHgpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIHdlIHNpbXBseSB0b2dnbGUgY2hlY2sgZm9yIGN1cnJlbnQgaXRlbSBvbmx5XG4gICAgICB0b2dnbGVkSWRzID0gW2UuaWRdO1xuXG4gICAgICAvLyBOb3cgdG9nZ2xlZElkcyB3ZXJlIHNldC4gV2UgY2FsbCB0aGUgZnVuY3Rpb24gd2UgZGVjbGFyZWRcbiAgICAgIGNoYW5nZVZhbHVlKCk7XG5cbiAgICB9XG4gICAgLyogZW5kOiBUSElTIENPREUgU0NPUEUgY2FsY3VsYXRlcyB0b2dnbGVkSWRzICovXG5cbiAgICAvLyBUaGF0IGlzLiBIYXBweSBkZWJ1Z2dpbmchXG5cbiAgfVxuXG4gIG9uQ2hlY2tJbmNsdWRlRGlzc29sdmVkQ2hhbmdlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc29sZS5sb2coXCJvbkNoZWNrSW5jbHVkZURpc3NvbHZlZENoYW5nZVwiLCB2YWx1ZSk7XG4gIH1cblxuICBvbkNoZWNrSW5oZXJpdGFuY2VDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRvcGljVHJlZVNlcnZpY2Uuc3RhdHVzJC5uZXh0KHtcbiAgICAgIC4uLnRoaXMudG9waWNUcmVlU2VydmljZS5zdGF0dXMkLnZhbHVlISxcbiAgICAgIGNoZWNrSW5oZXJpdGFuY2U6IHZhbHVlLFxuICAgIH0pO1xuICB9XG5cbiAgb25PYmplY3RDbGljayhlOiBJQXJ0aWNsZUNhdGVnb3J5VHJlZUl0ZW0sIGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICAgIC8vIHJlbW92ZSBoaWdobGlnaHQgY2xhc3NcbiAgICAvLyBUTyBET1xuXG4gICAgaWYgKCEhZS5wcm90ZWN0ZWQpIHJldHVybjtcblxuICAgIHRoaXMuaXRlbUNsaWNrPy5lbWl0KGUpO1xuXG4gICAgaWYgKHRoaXMuYWNjZXNzb3JNb2RlID09PSBFbnVtQ29yZUFydGljbGVDYXRlZ29yeVRyZWVhQWNjZXNzb3JNb2RlLkNIRUNLRUQpIHJldHVybjtcbiAgICBsZXQgYWN0aXZlSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgdGhpcy5yZWN1cnNpdmVTZXJ2aWNlLm5lc3RlZFJlc2V0QWN0aXZlKHRoaXMuZGF0YSwgZmFsc2UpLnRoZW4oZmFsc2VBbGwgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJmYWxzZUFsbFwiLCBmYWxzZUFsbClcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5hY2Nlc3Nvck1vZGUgPT09XG4gICAgICAgIEVudW1Db3JlQXJ0aWNsZUNhdGVnb3J5VHJlZWFBY2Nlc3Nvck1vZGUuQUNUSVZBVEVEX0lOSEVSSVRBTkNFIHx8ICF0aGlzLmFjY2Vzc29yTW9kZVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHRydWUsIGFsbCB0aGUgbmVzdGVkIGl0ZW1zIHdpbGwgYmUgYWN0aXZlLCB0aGUgb3RoZXJzIGFyZSBpbmFjdGl2ZVxuICAgICAgICB0aGlzLnJlY3Vyc2l2ZVNlcnZpY2VcbiAgICAgICAgICAubmVzdGVkUmVzZXRBY3RpdmUoZSwgdHJ1ZSlcbiAgICAgICAgICAudGhlbigoeCkgPT4ge1xuICAgICAgICAgICAgYWN0aXZlSWRzID0geDtcbiAgICAgICAgICAgIGFjdGl2ZUlkcy5zb3J0KCk7XG4gICAgICAgICAgICBjb25zdCBuZXdBY3RpdmVLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgYWN0aXZlSWRzLm1hcCgoeCkgPT4gbmV3QWN0aXZlS2V5cy5wdXNoKHgudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLnN0YXR1cyQubmV4dCh7XG4gICAgICAgICAgICAgIC4uLnRoaXMudG9waWNUcmVlU2VydmljZS5zdGF0dXMkLnZhbHVlISxcbiAgICAgICAgICAgICAgYWN0aXZlS2V5czogbmV3QWN0aXZlS2V5cyxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRLZXk6IGUuaWQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUlkcyA9IGFjdGl2ZUlkcztcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuYWN0aXZlSWRzKTtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoYWN0aXZlSWRzKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoeDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHgpO1xuICAgICAgICAgIH0pO1xuICBcbiAgXG4gICAgICB9IGVsc2Uge1xuICBcbiAgICAgICAgLy8gQUNUSVZBVEVEX1NJTkdMRVxuICAgICAgICAvLyBPdGhlcndpc2Ugd2Ugc2ltcGx5IHNldCBjdXJyZW50IGl0ZW0gdG8gYmUgYWN0aXZlIG9ubHlcbiAgICAgICAgYWN0aXZlSWRzID0gW2UuaWRdO1xuICAgICAgICB0aGlzLmFjdGl2ZUlkcyA9IGFjdGl2ZUlkcztcbiAgXG4gICAgICAgIHRoaXMudG9waWNUcmVlU2VydmljZS5zdGF0dXMkLm5leHQoe1xuICAgICAgICAgIC4uLnRoaXMudG9waWNUcmVlU2VydmljZS5zdGF0dXMkLnZhbHVlISxcbiAgICAgICAgICBhY3RpdmVLZXlzOiBbZS5pZC50b1N0cmluZygpXSxcbiAgICAgICAgICBzZWxlY3RlZEtleTogZS5pZC50b1N0cmluZygpLFxuICAgICAgICB9KTtcbiAgXG4gICAgICAgIHRoaXMub25DaGFuZ2UoYWN0aXZlSWRzKTtcbiAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBkZXRhaWwgfSA9IGV2ZW50O1xuXG4gICAgaWYgKGRldGFpbCA9PT0gMikge1xuICAgICAgY29uc29sZS5sb2coJ1RoaXMgd2FzIGEgZGJsY2xpY2snKTtcbiAgICAgIHRoaXMuaXRlbURvdWJsZUNsaWNrLmVtaXQoZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBlO1xuXG4gIH1cblxuICBvblNlYXJjaENoYW5nZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaCQubmV4dCh0ZXh0KTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcIm5nQWZ0ZXJDb250ZW50SW5pdFwiKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLm1hcCgoeCkgPT4geD8udW5zdWJzY3JpYmUoKSk7XG5cbiAgICBpZiAoISF0aGlzLmluc3RhbmNlTnVtYmVyKSB7XG4gICAgICBjb25zdCB0cnlUb0ZpbmQgPSB0aGlzLnRvcGljVHJlZVNlcnZpY2UuaW5zdGFuY2VzLmZpbHRlcihcbiAgICAgICAgKHgpID0+IHguaW5zdGFuY2VOdW1iZXIgPT09IHRoaXMuaW5zdGFuY2VOdW1iZXJcbiAgICAgICk7XG5cbiAgICAgIGlmICghIXRyeVRvRmluZC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2VzID0gdGhpcy50b3BpY1RyZWVTZXJ2aWNlLmluc3RhbmNlcy5maWx0ZXIoXG4gICAgICAgICAgKHgpID0+IHguaW5zdGFuY2VOdW1iZXIgIT09IHRoaXMuaW5zdGFuY2VOdW1iZXJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLmluc3RhbmNlcyA9IG5ld0luc3RhbmNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgI2NvbnRhaW5lciBjbGFzcz1cImNvcmUtdG9waWMtdHJlZS1jb250YWluZXJcIiBbY2xhc3MuZnVsbC13aWR0aF09XCIhIWZ1bGxXaWR0aE1vZGVcIiAqbmdJZj1cIiEhZGF0YVwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgICBwb3NpdGlvbiA6ICdyZWxhdGl2ZScsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0ICsgJ3B4J1xuICAgIH1cIj5cbiAgICA8ZGl2ICNkaXNwbGF5Q29udGVudCBjbGFzcz1cImN1c3RvbS1vcmctdHJlZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29yZS1vcmctdHJlZS1oZWFkZXIgZC1mbGV4LWJldHdlZW5cIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGU6IGxhbmdcIiBbY2xhc3MuZnVsbC13aWR0aF09XCIhIWZ1bGxXaWR0aE1vZGVcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGxheW91dFNlcnZpY2UuY29yZU9yZ1RyZWVUb3BIZWlnaHQgLSBsYXlvdXRTZXJ2aWNlLmNvcmVPcmdUcmVlQm90dG9tSGVpZ2h0ICsgJ3B4J1xuICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8Y29yZS1sb2FkaW5nLXN1cmZhY2UgW2xvYWRpbmddPVwibG9hZGluZ1wiIFtoZWlnaHRdPVwic2Nyb2xsQ29udGFpbmVySGVpZ2h0XCI+PC9jb3JlLWxvYWRpbmctc3VyZmFjZT5cbiAgICAgICAgICAgICAgICBAZm9yIChyb290IG9mIGRhdGE7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInJvb3RcIiBbY2xhc3MuY29sbGFwc2VkXT1cIiEhIXJvb3QudHJlZSRFeHBhbmRlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbTsgY29udGV4dDogeyBjb250ZXh0OiByb290IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAnMHB4JyxcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMHB4JyxcbiAgICAgICAgICAgICAgICByaWdodDogJzBweCcsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBsYXlvdXRTZXJ2aWNlLmNvcmVQYWdpbmF0aW9uSGVpZ2h0ICsgJ3B4JyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogbGF5b3V0U2VydmljZS5iYXNpY1NwYWNpbmcgKyAncHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogbGF5b3V0U2VydmljZS5iYXNpY1NwYWNpbmcgKyAncHgnLFxuICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IGxheW91dFNlcnZpY2UuY29yZVBhZ2luYXRpb25IZWlnaHQgKyAncHgnLFxuICAgICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGxheW91dFNlcnZpY2UuY29yZVBhZ2luYXRpb25IZWlnaHQgKyAncHgnLFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJ1xuICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvcmUtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJzaG93RGlzc29sdmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoZWNrSW5jbHVkZURpc3NvbHZlZENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCInVUkuQ09SRV9PUkdfVFJFRS5TSE9XX09VVERBVEVEX1VOSVRTX0FCQlJFVklBVEVEJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1VJLkNPUkVfT1JHX1RSRUUuU0hPV19PVVREQVRFRF9VTklUUydcIiB0b29sdGlwUG9zaXRpb249XCJhYm92ZVwiPjwvY29yZS1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2staW5oZXJpdGFuY2Utd3JhcHBlclwiICpuZ0lmPVwiYWNjZXNzb3JNb2RlID09PSAnQ0hFQ0tFRCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb3JlLWNoZWNrYm94ICpuZ0lmPVwic2hvd0NoZWNrSW5oZXJpdGFuY2VcIiBbKG5nTW9kZWwpXT1cImNoZWNrSW5oZXJpdGFuY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hlY2tJbmhlcml0YW5jZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCInVUkuQ09SRV9PUkdfVFJFRS5DSEVDS19JTkhFUklUQU5DRSdcIj48L2NvcmUtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaXRlbSBsZXQtY29udGV4dD1cImNvbnRleHRcIiBsZXQtaWQ9XCJjb250ZXh0LmlkXCIgbGV0LXRpdGxlPVwiY29udGV4dC50cmVlJFRpdGxlXCJcbiAgICAgICAgICAgICAgICBsZXQtaGlnaGxpZ2h0ZWQ9XCJjb250ZXh0LnRyZWUkSGlnaGxpZ2h0ZWRcIiBsZXQtaGFzQ2hpbGRyZW49XCJjb250ZXh0LnRyZWUkSGFzQ2hpbGRyZW5cIlxuICAgICAgICAgICAgICAgIGxldC1oYXNBY3RpdmVDaGlsZHJlbj1cImNvbnRleHQudHJlZSRIYXNBY3RpdmVDaGlsZHJlblwiIGxldC1jaGlsZHJlbj1cImNvbnRleHQudHJlZSRDaGlsZHJlblwiXG4gICAgICAgICAgICAgICAgbGV0LWV4cGFuZGVkPVwiY29udGV4dC50cmVlJEV4cGFuZGVkXCIgbGV0LWlzQWN0aXZlPVwiY29udGV4dC5pc0FjdGl2ZVwiIGxldC1hY3RpdmU9XCJjb250ZXh0LnRyZWUkQWN0aXZlXCJcbiAgICAgICAgICAgICAgICBsZXQtY2hlY2tlZD1cImNvbnRleHQudHJlZSRDaGVja2VkXCIgbGV0LXByb3RlY3RlZD1cImNvbnRleHQucHJvdGVjdGVkXCI+XG5cbiAgICAgICAgICAgICAgICBAaWYgKCghc2hvd0Rpc3NvbHZlZCAmJiAhIWlzQWN0aXZlKSB8fCAoISFzaG93RGlzc29sdmVkKSkge1xuICAgICAgICAgICAgICAgIDxsaSBbY2xhc3MuaGFzLWNoaWxkcmVuXT1cIiEhaGFzQ2hpbGRyZW5cIiBbY2xhc3MuY29sbGFwc2VkXT1cIiEhaGFzQ2hpbGRyZW4gJiYgISEhZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cIm9uT2JqZWN0Q2xpY2soY29udGV4dCwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgoISFzaG93RGlzc29sdmVkICYmICEhaGFzQ2hpbGRyZW4pIHx8ICghc2hvd0Rpc3NvbHZlZCAmJiAhIWhhc0FjdGl2ZUNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJleHBhbmQtdG9nZ2xlciBmZWF0aGVyLWNoZXZyb24tZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRXhwYW5kVG9nZ2xlckNsaWNrKGNvbnRleHQsICRldmVudClcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGFjY2Vzc29yTW9kZSA9PT0gJ0NIRUNLRUQnICYmICEhIXByb3RlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGNvcmUtY2hlY2tib3ggKG9uQ2xpY2spPVwib25JdGVtQ2hlY2soY29udGV4dCwgJGV2ZW50KVwiIFtpbnB1dFZhbHVlXT1cImNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPjwvY29yZS1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvYmplY3QgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVJZHMuaW5jbHVkZXMoaWQpXCIgW2NsYXNzLmhpZ2hsaWdodGVkXT1cImhpZ2hsaWdodGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzc29sdmVkXT1cIiFpc0FjdGl2ZVwiIFtjbGFzcy5wcm90ZWN0ZWRdPVwicHJvdGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwVG9vbHRpcF09XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRpdGxlIHwgdHJhbnNsYXRlOiBsYW5nIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29iamVjdD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghIWlubGluZUV4dHJhVGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbmxpbmVFeHRyYVRlbXBsYXRlUmVmOyBjb250ZXh0OiB7IGNvbnRleHQ6IGNvbnRleHQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICA8dWwgW2NsYXNzLmNvbGxhcHNlZF09XCIgISEhZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIGNoaWxkcmVuOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoISFleHBhbmRlZCB8fCAhIWZ1bGxSZW5kZXJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtOyBjb250ZXh0OiB7IGNvbnRleHQ6IGNoaWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG5cbjwvZGl2PiJdfQ==