ngx-dynamic-entity-builder 1.0.0 → 1.2.0
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/README.md +75 -54
- package/esm2022/lib/builder-store.service.mjs +166 -32
- package/esm2022/lib/clone.mjs +1 -1
- package/esm2022/lib/components/entity-builder-tree-node.component.mjs +21 -3
- package/esm2022/lib/components/entity-reference-config.component.mjs +301 -301
- package/esm2022/lib/components/field-inspector.component.mjs +3 -3
- package/esm2022/lib/components/field-palette.component.mjs +33 -33
- package/esm2022/lib/components/field-rules-list.component.mjs +157 -157
- package/esm2022/lib/components/referenced-field-config.component.mjs +8 -2
- package/esm2022/lib/components/rule-form.component.mjs +1 -1
- package/esm2022/lib/components/tab-manager.component.mjs +301 -288
- package/esm2022/lib/entity-builder.component.mjs +27 -4
- package/esm2022/public-api.mjs +1 -2
- package/fesm2022/ngx-dynamic-entity-builder.mjs +999 -926
- package/fesm2022/ngx-dynamic-entity-builder.mjs.map +1 -1
- package/lib/builder-store.service.d.ts +41 -0
- package/lib/components/referenced-field-config.component.d.ts +6 -0
- package/lib/components/tab-manager.component.d.ts +11 -2
- package/lib/entity-builder.component.d.ts +12 -1
- package/package.json +22 -13
- package/public-api.d.ts +0 -1
- package/esm2022/lib/components/connection-source-config.component.mjs +0 -121
- package/lib/components/connection-source-config.component.d.ts +0 -16
|
@@ -5,6 +5,14 @@ import { deepClone } from './clone';
|
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
const clone = deepClone;
|
|
7
7
|
const ID_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
8
|
+
/**
|
|
9
|
+
* The regex the builder used to write into `pattern` to mean "email".
|
|
10
|
+
*
|
|
11
|
+
* Retained only to recognise configs authored before `FieldValidators.email` existed, so
|
|
12
|
+
* they still show Email as ticked and do not leave a stray pattern behind when it is
|
|
13
|
+
* un-ticked. Nothing writes it any more.
|
|
14
|
+
*/
|
|
15
|
+
const LEGACY_EMAIL_PATTERN = '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';
|
|
8
16
|
export class BuilderStore {
|
|
9
17
|
_config = signal(this.emptyConfig());
|
|
10
18
|
_selectedFieldId = signal(null);
|
|
@@ -18,11 +26,19 @@ export class BuilderStore {
|
|
|
18
26
|
*/
|
|
19
27
|
manualIds = new Set();
|
|
20
28
|
_isDirty = signal(false);
|
|
29
|
+
/**
|
|
30
|
+
* Roles of the person using the builder — distinct from `availableRoles`, which is the
|
|
31
|
+
* vocabulary a schema may reference. Needed so the SYSTEM_DEFAULT_CAN_EDIT predicate can
|
|
32
|
+
* be asked a real question; it was previously called with a hardcoded empty array, which
|
|
33
|
+
* made any role-checking predicate answer false for everyone.
|
|
34
|
+
*/
|
|
35
|
+
_userRoles = signal([]);
|
|
21
36
|
config = this._config.asReadonly();
|
|
22
37
|
selectedFieldId = this._selectedFieldId.asReadonly();
|
|
23
38
|
activeLanguage = this._activeLanguage.asReadonly();
|
|
24
39
|
rules = this._rules.asReadonly();
|
|
25
40
|
isDirty = this._isDirty.asReadonly();
|
|
41
|
+
userRoles = this._userRoles.asReadonly();
|
|
26
42
|
tabs = computed(() => this._config().tabs ?? []);
|
|
27
43
|
fields = computed(() => {
|
|
28
44
|
return (this._config().tabs ?? []).flatMap(t => t.fields ?? []);
|
|
@@ -107,6 +123,10 @@ export class BuilderStore {
|
|
|
107
123
|
setActiveLanguage(language) {
|
|
108
124
|
this._activeLanguage.set(language);
|
|
109
125
|
}
|
|
126
|
+
/** Roles of the person using the builder, for SYSTEM_DEFAULT_CAN_EDIT. */
|
|
127
|
+
setUserRoles(roles) {
|
|
128
|
+
this._userRoles.set(roles ?? []);
|
|
129
|
+
}
|
|
110
130
|
// ─── Helper Traversal ───────────────────────────────────────────────────────
|
|
111
131
|
getAllFields(tabs = []) {
|
|
112
132
|
const list = [];
|
|
@@ -118,6 +138,44 @@ export class BuilderStore {
|
|
|
118
138
|
}
|
|
119
139
|
return list;
|
|
120
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Every tab in the tree, flattened.
|
|
143
|
+
*
|
|
144
|
+
* The structural operations below used to iterate `draft.tabs` directly, which is only
|
|
145
|
+
* the top level. A field on a sub-tab could be selected and edited but never removed,
|
|
146
|
+
* duplicated, moved or reordered — the builder could author nested configs it was then
|
|
147
|
+
* unable to restructure, which is the worst possible state for an authoring tool.
|
|
148
|
+
*/
|
|
149
|
+
flattenTabs(tabs = []) {
|
|
150
|
+
const list = [];
|
|
151
|
+
for (const t of tabs) {
|
|
152
|
+
list.push(t);
|
|
153
|
+
if (t.children)
|
|
154
|
+
list.push(...this.flattenTabs(t.children));
|
|
155
|
+
}
|
|
156
|
+
return list;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Every field id in the config, including `group`/`array` children.
|
|
160
|
+
*
|
|
161
|
+
* Id uniqueness is a whole-config invariant, not a per-tab one: rules, `showWhen`
|
|
162
|
+
* conditions and `autoPatch` mappings all address fields by bare id, so two fields
|
|
163
|
+
* sharing an id anywhere in the tree interfere with each other. Uniqueness checks must
|
|
164
|
+
* therefore see deeper than `fields()`, which stops at a tab's own fields.
|
|
165
|
+
*/
|
|
166
|
+
allFieldIds(tabs = []) {
|
|
167
|
+
const ids = new Set();
|
|
168
|
+
const walkFields = (fields) => {
|
|
169
|
+
for (const f of fields ?? []) {
|
|
170
|
+
ids.add(f.id);
|
|
171
|
+
if (f.children?.length)
|
|
172
|
+
walkFields(f.children);
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
for (const tab of this.flattenTabs(tabs))
|
|
176
|
+
walkFields(tab.fields);
|
|
177
|
+
return ids;
|
|
178
|
+
}
|
|
121
179
|
findFieldInTabs(tabs = [], id) {
|
|
122
180
|
for (const t of tabs) {
|
|
123
181
|
if (t.fields) {
|
|
@@ -137,12 +195,11 @@ export class BuilderStore {
|
|
|
137
195
|
addField(type, targetTabId) {
|
|
138
196
|
const meta = getFieldTypeMeta(type);
|
|
139
197
|
const prefix = meta?.idPrefix ?? 'field';
|
|
140
|
-
const
|
|
141
|
-
const id = this.uniqueId(prefix, allFields);
|
|
198
|
+
const id = this.uniqueId(prefix, this.allFieldIds(this._config().tabs));
|
|
142
199
|
this.mutate(draft => {
|
|
143
200
|
const field = createFieldConfig(type, id, draft.defaultLanguage ?? 'en');
|
|
144
201
|
const targetTab = targetTabId
|
|
145
|
-
? draft.tabs.find(t => t.id === targetTabId)
|
|
202
|
+
? this.flattenTabs(draft.tabs).find(t => t.id === targetTabId)
|
|
146
203
|
: draft.tabs[0];
|
|
147
204
|
if (targetTab) {
|
|
148
205
|
targetTab.fields = targetTab.fields ?? [];
|
|
@@ -172,7 +229,7 @@ export class BuilderStore {
|
|
|
172
229
|
const trimmed = newId.trim();
|
|
173
230
|
if (!trimmed || trimmed === oldId)
|
|
174
231
|
return;
|
|
175
|
-
if (this.
|
|
232
|
+
if (this.allFieldIds(this._config().tabs).has(trimmed))
|
|
176
233
|
return;
|
|
177
234
|
if (!this.findFieldInTabs(this._config().tabs, oldId))
|
|
178
235
|
return;
|
|
@@ -246,7 +303,7 @@ export class BuilderStore {
|
|
|
246
303
|
}
|
|
247
304
|
removeField(id) {
|
|
248
305
|
this.mutate(draft => {
|
|
249
|
-
for (const tab of draft.tabs) {
|
|
306
|
+
for (const tab of this.flattenTabs(draft.tabs)) {
|
|
250
307
|
if (tab.fields) {
|
|
251
308
|
tab.fields = tab.fields.filter(f => f.id !== id);
|
|
252
309
|
}
|
|
@@ -265,9 +322,9 @@ export class BuilderStore {
|
|
|
265
322
|
return null;
|
|
266
323
|
const meta = getFieldTypeMeta(source.type);
|
|
267
324
|
const prefix = meta?.idPrefix ?? 'field';
|
|
268
|
-
const newId = this.uniqueId(prefix, this.
|
|
325
|
+
const newId = this.uniqueId(prefix, this.allFieldIds(this._config().tabs));
|
|
269
326
|
this.mutate(draft => {
|
|
270
|
-
for (const tab of draft.tabs) {
|
|
327
|
+
for (const tab of this.flattenTabs(draft.tabs)) {
|
|
271
328
|
const index = (tab.fields ?? []).findIndex(f => f.id === id);
|
|
272
329
|
if (index !== -1) {
|
|
273
330
|
const copy = clone(source);
|
|
@@ -282,7 +339,7 @@ export class BuilderStore {
|
|
|
282
339
|
}
|
|
283
340
|
moveField(id, direction) {
|
|
284
341
|
this.mutate(draft => {
|
|
285
|
-
for (const tab of draft.tabs) {
|
|
342
|
+
for (const tab of this.flattenTabs(draft.tabs)) {
|
|
286
343
|
const fields = tab.fields ?? [];
|
|
287
344
|
const from = fields.findIndex(f => f.id === id);
|
|
288
345
|
if (from !== -1) {
|
|
@@ -300,7 +357,7 @@ export class BuilderStore {
|
|
|
300
357
|
reorderField(fromIndex, toIndex, tabId) {
|
|
301
358
|
this.mutate(draft => {
|
|
302
359
|
const targetTab = tabId
|
|
303
|
-
? draft.tabs.find(t => t.id === tabId)
|
|
360
|
+
? this.flattenTabs(draft.tabs).find(t => t.id === tabId)
|
|
304
361
|
: draft.tabs[0];
|
|
305
362
|
const fields = targetTab?.fields ?? [];
|
|
306
363
|
if (fromIndex < 0 ||
|
|
@@ -330,11 +387,8 @@ export class BuilderStore {
|
|
|
330
387
|
* anything.
|
|
331
388
|
*/
|
|
332
389
|
setFieldLabel(id, language, value) {
|
|
333
|
-
this
|
|
334
|
-
|
|
335
|
-
if (field)
|
|
336
|
-
field.label = { ...field.label, [language]: value };
|
|
337
|
-
});
|
|
390
|
+
// Bound to a keystroke event, so this uses the structural-sharing path.
|
|
391
|
+
this.mutateField(id, field => ({ ...field, label: { ...field.label, [language]: value } }));
|
|
338
392
|
if (language !== (this._config().defaultLanguage ?? 'en'))
|
|
339
393
|
return;
|
|
340
394
|
if (this.manualIds.has(id))
|
|
@@ -346,7 +400,7 @@ export class BuilderStore {
|
|
|
346
400
|
}
|
|
347
401
|
/** `derived`, or `derived_2`, `derived_3`… if another field already holds it. */
|
|
348
402
|
availableId(derived, currentId) {
|
|
349
|
-
const taken = new Set(this.
|
|
403
|
+
const taken = new Set([...this.allFieldIds(this._config().tabs)].filter(fid => fid !== currentId));
|
|
350
404
|
if (!taken.has(derived))
|
|
351
405
|
return derived;
|
|
352
406
|
let n = 2;
|
|
@@ -376,9 +430,15 @@ export class BuilderStore {
|
|
|
376
430
|
delete field.validators.required;
|
|
377
431
|
}
|
|
378
432
|
else if (validator === 'email') {
|
|
433
|
+
// Writes its own flag, not `pattern`. Sharing `pattern` meant a field could not have
|
|
434
|
+
// both an email check and a custom regex, setting a custom pattern made the Email box
|
|
435
|
+
// appear ticked, and un-ticking Email deleted whatever pattern the author had written.
|
|
379
436
|
if (on)
|
|
380
|
-
field.validators.
|
|
437
|
+
field.validators.email = true;
|
|
381
438
|
else
|
|
439
|
+
delete field.validators.email;
|
|
440
|
+
// Clear the legacy encoding either way, so a config touched here stops carrying both.
|
|
441
|
+
if (field.validators.pattern === LEGACY_EMAIL_PATTERN)
|
|
382
442
|
delete field.validators.pattern;
|
|
383
443
|
}
|
|
384
444
|
});
|
|
@@ -404,8 +464,12 @@ export class BuilderStore {
|
|
|
404
464
|
hasFlagValidator(field, validator) {
|
|
405
465
|
if (validator === 'required')
|
|
406
466
|
return !!field.validators?.required;
|
|
407
|
-
if (validator === 'email')
|
|
408
|
-
|
|
467
|
+
if (validator === 'email') {
|
|
468
|
+
// This used to report *any* pattern as email, so writing a custom regex silently
|
|
469
|
+
// ticked the box. The legacy encoding is still recognised so a config authored by the
|
|
470
|
+
// old builder keeps showing Email as ticked.
|
|
471
|
+
return !!field.validators?.email || field.validators?.pattern === LEGACY_EMAIL_PATTERN;
|
|
472
|
+
}
|
|
409
473
|
return false;
|
|
410
474
|
}
|
|
411
475
|
// ─── Options (dropdown / multiSelect / radio) ────────────────────────────────
|
|
@@ -578,12 +642,13 @@ export class BuilderStore {
|
|
|
578
642
|
* so this is the only way to edit one — there is no separate value to set.
|
|
579
643
|
*/
|
|
580
644
|
setOptionLabel(fieldId, index, language, value) {
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
const option = field
|
|
645
|
+
// Also keystroke-bound.
|
|
646
|
+
this.mutateField(fieldId, field => {
|
|
647
|
+
const option = field.options?.[index];
|
|
584
648
|
if (!option)
|
|
585
|
-
return;
|
|
586
|
-
field.options
|
|
649
|
+
return field;
|
|
650
|
+
const options = field.options.map((o, i) => (i === index ? { ...o, [language]: value } : o));
|
|
651
|
+
return { ...field, options };
|
|
587
652
|
});
|
|
588
653
|
}
|
|
589
654
|
removeOption(fieldId, index) {
|
|
@@ -711,7 +776,7 @@ export class BuilderStore {
|
|
|
711
776
|
this._rules.set(clone(rules));
|
|
712
777
|
}
|
|
713
778
|
addRule(rule) {
|
|
714
|
-
const id = rule.id?.trim() || this.uniqueId('rule', this._rules().map(r =>
|
|
779
|
+
const id = rule.id?.trim() || this.uniqueId('rule', new Set(this._rules().map(r => r.id ?? '')));
|
|
715
780
|
this._rules.update(rules => [...rules, { ...clone(rule), id }]);
|
|
716
781
|
return id;
|
|
717
782
|
}
|
|
@@ -747,7 +812,7 @@ export class BuilderStore {
|
|
|
747
812
|
// Must be unique across the whole tree, not just the top level: a tab id is the record
|
|
748
813
|
// storage path, so a new top-level tab colliding with an existing sub-tab would make two
|
|
749
814
|
// tabs write to the same key and break findTab/getTabPath.
|
|
750
|
-
const id = this.uniqueId('tab', this.allTabIds()
|
|
815
|
+
const id = this.uniqueId('tab', new Set(this.allTabIds()));
|
|
751
816
|
this.mutate(draft => {
|
|
752
817
|
const tabs = draft.tabs ?? (draft.tabs = []);
|
|
753
818
|
const lang = draft.defaultLanguage ?? 'en';
|
|
@@ -768,7 +833,7 @@ export class BuilderStore {
|
|
|
768
833
|
return ids;
|
|
769
834
|
}
|
|
770
835
|
addSubTab(parentId) {
|
|
771
|
-
const id = this.uniqueId('tab', this.allTabIds()
|
|
836
|
+
const id = this.uniqueId('tab', new Set(this.allTabIds()));
|
|
772
837
|
this.mutate(draft => {
|
|
773
838
|
const parent = findTab(draft.tabs, parentId);
|
|
774
839
|
if (parent) {
|
|
@@ -843,8 +908,64 @@ export class BuilderStore {
|
|
|
843
908
|
this._config.set(draft);
|
|
844
909
|
this._isDirty.set(true);
|
|
845
910
|
}
|
|
846
|
-
|
|
847
|
-
|
|
911
|
+
/**
|
|
912
|
+
* Replace one field, copying only the objects on the path to it.
|
|
913
|
+
*
|
|
914
|
+
* `mutate` deep-clones the entire config, which is right for a structural edit but wrong
|
|
915
|
+
* for the two setters bound to keystroke events: typing a label allocated a full copy of
|
|
916
|
+
* the config per character. Here every tab and field outside the target's chain is reused
|
|
917
|
+
* by reference, so the cost is proportional to nesting depth rather than config size —
|
|
918
|
+
* while the parts that did change are still fresh objects, so change detection and the
|
|
919
|
+
* signal both see a new identity.
|
|
920
|
+
*
|
|
921
|
+
* Returns without touching anything when the field is not found.
|
|
922
|
+
*/
|
|
923
|
+
mutateField(id, update) {
|
|
924
|
+
let found = false;
|
|
925
|
+
const visitFields = (fields) => {
|
|
926
|
+
if (!fields)
|
|
927
|
+
return fields;
|
|
928
|
+
let changed = false;
|
|
929
|
+
const next = fields.map(field => {
|
|
930
|
+
if (field.id === id) {
|
|
931
|
+
found = true;
|
|
932
|
+
changed = true;
|
|
933
|
+
return update(field);
|
|
934
|
+
}
|
|
935
|
+
const children = visitFields(field.children);
|
|
936
|
+
if (children !== field.children) {
|
|
937
|
+
changed = true;
|
|
938
|
+
return { ...field, children };
|
|
939
|
+
}
|
|
940
|
+
return field;
|
|
941
|
+
});
|
|
942
|
+
return changed ? next : fields;
|
|
943
|
+
};
|
|
944
|
+
const visitTabs = (tabs) => {
|
|
945
|
+
if (!tabs)
|
|
946
|
+
return tabs;
|
|
947
|
+
let changed = false;
|
|
948
|
+
const next = tabs.map(tab => {
|
|
949
|
+
const fields = visitFields(tab.fields);
|
|
950
|
+
const children = visitTabs(tab.children);
|
|
951
|
+
if (fields !== tab.fields || children !== tab.children) {
|
|
952
|
+
changed = true;
|
|
953
|
+
return { ...tab, fields, children };
|
|
954
|
+
}
|
|
955
|
+
return tab;
|
|
956
|
+
});
|
|
957
|
+
return changed ? next : tabs;
|
|
958
|
+
};
|
|
959
|
+
const current = this._config();
|
|
960
|
+
const tabs = visitTabs(current.tabs);
|
|
961
|
+
// `found` implies current.tabs existed and was walked, so tabs is defined here — the
|
|
962
|
+
// fallback below is for the type checker, not a reachable state.
|
|
963
|
+
if (!found || tabs === current.tabs)
|
|
964
|
+
return;
|
|
965
|
+
this._config.set({ ...current, tabs: tabs ?? [] });
|
|
966
|
+
this._isDirty.set(true);
|
|
967
|
+
}
|
|
968
|
+
uniqueId(prefix, taken) {
|
|
848
969
|
let n = 1;
|
|
849
970
|
let candidate = `${prefix}_${n}`;
|
|
850
971
|
while (taken.has(candidate)) {
|
|
@@ -868,9 +989,7 @@ export class BuilderStore {
|
|
|
868
989
|
if (allFields.length === 0) {
|
|
869
990
|
problems.push({ level: 'warning', message: 'This entity has no fields yet.' });
|
|
870
991
|
}
|
|
871
|
-
const seen = new Map();
|
|
872
992
|
for (const field of allFields) {
|
|
873
|
-
seen.set(field.id, (seen.get(field.id) ?? 0) + 1);
|
|
874
993
|
if (!field.id || !ID_PATTERN.test(field.id)) {
|
|
875
994
|
problems.push({
|
|
876
995
|
level: 'error',
|
|
@@ -907,7 +1026,22 @@ export class BuilderStore {
|
|
|
907
1026
|
});
|
|
908
1027
|
}
|
|
909
1028
|
}
|
|
910
|
-
|
|
1029
|
+
// Id uniqueness is a whole-config invariant, and it is counted over the entire field
|
|
1030
|
+
// tree rather than `allFields`, which stops at a tab's own fields. Two ids colliding
|
|
1031
|
+
// inside a group or array went unreported even though rules, showWhen conditions and
|
|
1032
|
+
// autoPatch mappings all address fields by bare id and would resolve to whichever one
|
|
1033
|
+
// the lookup happened to reach first.
|
|
1034
|
+
const idCounts = new Map();
|
|
1035
|
+
const countIds = (fields) => {
|
|
1036
|
+
for (const f of fields ?? []) {
|
|
1037
|
+
idCounts.set(f.id, (idCounts.get(f.id) ?? 0) + 1);
|
|
1038
|
+
if (f.children?.length)
|
|
1039
|
+
countIds(f.children);
|
|
1040
|
+
}
|
|
1041
|
+
};
|
|
1042
|
+
for (const tab of this.flattenTabs(config.tabs))
|
|
1043
|
+
countIds(tab.fields);
|
|
1044
|
+
for (const [id, count] of idCounts) {
|
|
911
1045
|
if (count > 1) {
|
|
912
1046
|
problems.push({ level: 'error', message: `Duplicate field id "${id}" (${count}×).`, fieldId: id });
|
|
913
1047
|
}
|
|
@@ -920,4 +1054,4 @@ export class BuilderStore {
|
|
|
920
1054
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BuilderStore, decorators: [{
|
|
921
1055
|
type: Injectable
|
|
922
1056
|
}] });
|
|
923
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9idWlsZGVyLXN0b3JlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBYTdELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUgsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsVUFBVSxHQUdYLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFRcEMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDO0FBRXhCLE1BQU0sVUFBVSxHQUFHLDBCQUEwQixDQUFDO0FBRzlDLE1BQU0sT0FBTyxZQUFZO0lBQ04sT0FBTyxHQUFHLE1BQU0sQ0FBbUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDdkQsZ0JBQWdCLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUMvQyxlQUFlLEdBQUcsTUFBTSxDQUFTLElBQUksQ0FBQyxDQUFDO0lBQ3hELGdHQUFnRztJQUMvRSxNQUFNLEdBQUcsTUFBTSxDQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ2pEOzs7O09BSUc7SUFDYyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU5QixRQUFRLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRTFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ25DLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDckQsY0FBYyxHQUFHLElBQUksQ0FB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Q0FBQyxJQUFJLHNCQUFzQjtvQkFDckUsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFO2lCQUNsQixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDZCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxLQUFLLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyRyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7d0dBcDdCVSxZQUFZOzRHQUFaLFlBQVk7OzRGQUFaLFlBQVk7a0JBRHhCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBjb21wdXRlZCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB0eXBlIHtcclxuICBBdXRvUGF0Y2hNYXBwaW5nLFxyXG4gIERyb3Bkb3duT3B0aW9uLFxyXG4gIEVudGl0eUZvcm1Db25maWcsXHJcbiAgRW50aXR5UGVybWlzc2lvbnMsXHJcbiAgRW50aXR5UmVmZXJlbmNlQ29uZmlnLFxyXG4gIEZvcm1SdWxlLFxyXG4gIE5lc3RlZEZpZWxkQ29uZmlnLFxyXG4gIE5lc3RlZFRhYkNvbmZpZyxcclxuICBQYXRjaE9uVHJ1ZU1hcHBpbmcsXHJcbiAgUmljaEZpZWxkVHlwZSxcclxufSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XHJcbmltcG9ydCB7IGZpbmRUYWIsIGxhYmVsVG9JZCwgbm9ybWFsaXplQ29uZmlnT3B0aW9ucywgY29tcHV0ZUZpZWxkRHJpZnQsIGNyZWF0ZUZpZWxkU25hcHNob3QgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgY3JlYXRlRmllbGRDb25maWcsXHJcbiAgZ2V0RmllbGRUeXBlTWV0YSxcclxuICBodW1hbml6ZUlkLFxyXG4gIHR5cGUgRmxhZ1ZhbGlkYXRvcixcclxuICB0eXBlIFBhcmFtVmFsaWRhdG9yLFxyXG59IGZyb20gJy4vZmllbGQtY2F0YWxvZyc7XHJcbmltcG9ydCB7IGRlZXBDbG9uZSB9IGZyb20gJy4vY2xvbmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBCdWlsZGVyUHJvYmxlbSB7XHJcbiAgbGV2ZWw6ICdlcnJvcicgfCAnd2FybmluZyc7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIGZpZWxkSWQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IGNsb25lID0gZGVlcENsb25lO1xyXG5cclxuY29uc3QgSURfUEFUVEVSTiA9IC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKiQvO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQnVpbGRlclN0b3JlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWcgPSBzaWduYWw8RW50aXR5Rm9ybUNvbmZpZz4odGhpcy5lbXB0eUNvbmZpZygpKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RlZEZpZWxkSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZlTGFuZ3VhZ2UgPSBzaWduYWw8c3RyaW5nPignZW4nKTtcclxuICAvKiogUnVsZXMgbGl2ZSBiZXNpZGUgdGhlIGNvbmZpZzogdGhleSBhcmUgcGVyc2lzdGVkIHBlciBmb3JtLCBub3QgaW5zaWRlIGBFbnRpdHlGb3JtQ29uZmlnYC4gKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IF9ydWxlcyA9IHNpZ25hbDxGb3JtUnVsZVtdPihbXSk7XHJcbiAgLyoqXHJcbiAgICogRmllbGQgaWRzIHRoZSBhdXRob3Igb3ducyDigJQgc2V0IGJ5IGFuIGV4cGxpY2l0IHJlbmFtZSwgb3IgYnkgbG9hZGluZyBhIHNhdmVkIGNvbmZpZ1xyXG4gICAqIHdob3NlIGlkcyBhcmUgYWxyZWFkeSBsaXZlIGRhdGEga2V5cy4gSWRzIG91dHNpZGUgdGhpcyBzZXQgYXJlIHN0aWxsIGRlcml2ZWQgZnJvbSB0aGVcclxuICAgKiBmaWVsZCdzIGxhYmVsLiBCdWlsZGVyLXNlc3Npb24gc3RhdGUsIGRlbGliZXJhdGVseSBub3QgcGFydCBvZiB0aGUgZXhwb3J0ZWQgY29uZmlnLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFudWFsSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzRGlydHkgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICByZWFkb25seSBjb25maWcgPSB0aGlzLl9jb25maWcuYXNSZWFkb25seSgpO1xyXG4gIHJlYWRvbmx5IHNlbGVjdGVkRmllbGRJZCA9IHRoaXMuX3NlbGVjdGVkRmllbGRJZC5hc1JlYWRvbmx5KCk7XHJcbiAgcmVhZG9ubHkgYWN0aXZlTGFuZ3VhZ2UgPSB0aGlzLl9hY3RpdmVMYW5ndWFnZS5hc1JlYWRvbmx5KCk7XHJcbiAgcmVhZG9ubHkgcnVsZXMgPSB0aGlzLl9ydWxlcy5hc1JlYWRvbmx5KCk7XHJcbiAgcmVhZG9ubHkgaXNEaXJ0eSA9IHRoaXMuX2lzRGlydHkuYXNSZWFkb25seSgpO1xyXG5cclxuICByZWFkb25seSB0YWJzID0gY29tcHV0ZWQ8TmVzdGVkVGFiQ29uZmlnW10+KCgpID0+IHRoaXMuX2NvbmZpZygpLnRhYnMgPz8gW10pO1xyXG5cclxuICByZWFkb25seSBmaWVsZHMgPSBjb21wdXRlZDxOZXN0ZWRGaWVsZENvbmZpZ1tdPigoKSA9PiB7XHJcbiAgICByZXR1cm4gKHRoaXMuX2NvbmZpZygpLnRhYnMgPz8gW10pLmZsYXRNYXAodCA9PiB0LmZpZWxkcyA/PyBbXSk7XHJcbiAgfSk7XHJcblxyXG4gIHJlYWRvbmx5IHNlbGVjdGVkRmllbGQgPSBjb21wdXRlZDxOZXN0ZWRGaWVsZENvbmZpZyB8IG51bGw+KCgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5fc2VsZWN0ZWRGaWVsZElkKCk7XHJcbiAgICBpZiAoIWlkKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLmZpbmRGaWVsZEluVGFicyh0aGlzLl9jb25maWcoKS50YWJzLCBpZCk7XHJcbiAgfSk7XHJcblxyXG4gIHJlYWRvbmx5IHByb2JsZW1zID0gY29tcHV0ZWQ8QnVpbGRlclByb2JsZW1bXT4oKCkgPT4gdGhpcy52YWxpZGF0ZSh0aGlzLl9jb25maWcoKSkpO1xyXG4gIHJlYWRvbmx5IGVycm9ycyA9IGNvbXB1dGVkPEJ1aWxkZXJQcm9ibGVtW10+KCgpID0+XHJcbiAgICB0aGlzLnByb2JsZW1zKCkuZmlsdGVyKHAgPT4gcC5sZXZlbCA9PT0gJ2Vycm9yJyksXHJcbiAgKTtcclxuICByZWFkb25seSBpc1ZhbGlkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5lcnJvcnMoKS5sZW5ndGggPT09IDApO1xyXG5cclxuICAvLyDilIDilIDilIAgSW5pdGlhbGlzYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIGxvYWQoY29uZmlnOiBFbnRpdHlGb3JtQ29uZmlnKTogdm9pZCB7XHJcbiAgICAvLyBDaGVjayBpZiBhbnkgZmllbGRzIGNhcnJ5IGJvdGggaW5saW5lIG9wdGlvbnMgYW5kIGxpc3ROYW1lIGJlZm9yZSBub3JtYWxpemluZyBvcHRpb25zXHJcbiAgICBjb25zdCBmaWVsZHNXaXRoQm90aCA9IHRoaXMuZ2V0QWxsRmllbGRzKGNvbmZpZy50YWJzID8/IFtdKS5maWx0ZXIoXHJcbiAgICAgIGYgPT4gQXJyYXkuaXNBcnJheShmLm9wdGlvbnMpICYmIGYub3B0aW9ucy5sZW5ndGggPiAwICYmIHR5cGVvZiBmLmxpc3ROYW1lID09PSAnc3RyaW5nJyAmJiBmLmxpc3ROYW1lLnRyaW0oKSAhPT0gJycsXHJcbiAgICApO1xyXG4gICAgZm9yIChjb25zdCBmIG9mIGZpZWxkc1dpdGhCb3RoKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgW0J1aWxkZXJTdG9yZV0gRmllbGQgXCIke2YuaWR9XCIgY2FycmllcyBib3RoIGlubGluZSBvcHRpb25zIGFuZCBsaXN0TmFtZSBcIiR7Zi5saXN0TmFtZX1cIi4gYCArXHJcbiAgICAgICAgICBgSW5saW5lIG9wdGlvbnMgd2luOyBsaXN0TmFtZSB3YXMgZHJvcHBlZC5gLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoZSBvdGhlciBib3VuZGFyeSB3aGVyZSBhIGNvbmZpZyBlbnRlcnMgdGhlIGxpYnJhcnkgKHRoZSByZW5kZXJlcidzIG5nT25DaGFuZ2VzIGlzXHJcbiAgICAvLyB0aGUgZmlyc3QpLiBBdXRob3JpbmcgbXVzdCBzdGFydCBmcm9tIHRoZSBjYW5vbmljYWwgb3B0aW9uIHNoYXBlLCBvciB0aGUgYnVpbGRlclxyXG4gICAgLy8gd291bGQgcm91bmQtdHJpcCBhIGxlZ2FjeSBjb25maWcgc3RyYWlnaHQgYmFjayBvdXQgdW5jaGFuZ2VkLlxyXG4gICAgY29uc3QgbmV4dCA9IGNsb25lKG5vcm1hbGl6ZUNvbmZpZ09wdGlvbnMoY29uZmlnKSk7XHJcbiAgICBuZXh0LnRhYnMgPSBuZXh0LnRhYnMgPz8gW107XHJcbiAgICBpZiAobmV4dC50YWJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBuZXh0LnRhYnMgPSBbeyBpZDogJ2RlZmF1bHQnLCBsYWJlbDogeyBlbjogJ0RlZmF1bHQnIH0sIGZpZWxkczogW10gfV07XHJcbiAgICB9XHJcbiAgICB0aGlzLl9jb25maWcuc2V0KG5leHQpO1xyXG4gICAgY29uc3QgZmlyc3RGaWVsZCA9IHRoaXMuZ2V0QWxsRmllbGRzKG5leHQudGFicylbMF07XHJcbiAgICB0aGlzLl9zZWxlY3RlZEZpZWxkSWQuc2V0KGZpcnN0RmllbGQ/LmlkID8/IG51bGwpO1xyXG4gICAgdGhpcy5fYWN0aXZlTGFuZ3VhZ2Uuc2V0KG5leHQuZGVmYXVsdExhbmd1YWdlID8/ICdlbicpO1xyXG5cclxuICAgIC8vIElkcyBpbiBhIHNhdmVkIGNvbmZpZyBhcmUgbGl2ZSBkYXRhIGtleXMg4oCUIHJlY29yZHMgYXJlIGFscmVhZHkgc3RvcmVkIHVuZGVyIHRoZW0uXHJcbiAgICAvLyBFZGl0aW5nIGEgbGFiZWwgbXVzdCBuZXZlciByZXdyaXRlIG9uZSwgc28gZnJlZXplIGV2ZXJ5IGlkIHRoZSBjb25maWcgYXJyaXZlZCB3aXRoLlxyXG4gICAgdGhpcy5tYW51YWxJZHMuY2xlYXIoKTtcclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5nZXRBbGxGaWVsZHMobmV4dC50YWJzKSkgdGhpcy5tYW51YWxJZHMuYWRkKGZpZWxkLmlkKTtcclxuICAgIHRoaXMuX2lzRGlydHkuc2V0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHJlc2V0KGVudGl0eSA9ICcnKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb25maWcuc2V0KHRoaXMuZW1wdHlDb25maWcoZW50aXR5KSk7XHJcbiAgICB0aGlzLl9zZWxlY3RlZEZpZWxkSWQuc2V0KG51bGwpO1xyXG4gICAgdGhpcy5fcnVsZXMuc2V0KFtdKTtcclxuICAgIHRoaXMubWFudWFsSWRzLmNsZWFyKCk7XHJcbiAgICB0aGlzLl9pc0RpcnR5LnNldChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICByZXNldERpcnR5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5faXNEaXJ0eS5zZXQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbXB0eUNvbmZpZyhlbnRpdHkgPSAnJyk6IEVudGl0eUZvcm1Db25maWcge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZW50aXR5LFxyXG4gICAgICB2ZXJzaW9uOiAxLFxyXG4gICAgICBkZWZhdWx0TGFuZ3VhZ2U6ICdlbicsXHJcbiAgICAgIHRhYnM6IFtdLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBFbnRpdHktbGV2ZWwgc2V0dGluZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHNldEVudGl0eU5hbWUoZW50aXR5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgZHJhZnQuZW50aXR5ID0gZW50aXR5LnRyaW0oKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0RGVmYXVsdExhbmd1YWdlKGxhbmd1YWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgZHJhZnQuZGVmYXVsdExhbmd1YWdlID0gbGFuZ3VhZ2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldE1hc2tEYXRhKG1hc2s6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgZHJhZnQubWFza0RhdGEgPSBtYXNrO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRQZXJtaXNzaW9uKGFjdGlvbjoga2V5b2YgRW50aXR5UGVybWlzc2lvbnMsIHJvbGVzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBwZXJtaXNzaW9uczogRW50aXR5UGVybWlzc2lvbnMgPSB7IC4uLihkcmFmdC5wZXJtaXNzaW9ucyA/PyB7fSkgfTtcclxuICAgICAgcGVybWlzc2lvbnNbYWN0aW9uXSA9IHJvbGVzO1xyXG4gICAgICBkcmFmdC5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRBY3RpdmVMYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmVMYW5ndWFnZS5zZXQobGFuZ3VhZ2UpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEhlbHBlciBUcmF2ZXJzYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgZ2V0QWxsRmllbGRzKHRhYnM6IE5lc3RlZFRhYkNvbmZpZ1tdID0gW10pOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHtcclxuICAgIGNvbnN0IGxpc3Q6IE5lc3RlZEZpZWxkQ29uZmlnW10gPSBbXTtcclxuICAgIGZvciAoY29uc3QgdCBvZiB0YWJzKSB7XHJcbiAgICAgIGlmICh0LmZpZWxkcykgbGlzdC5wdXNoKC4uLnQuZmllbGRzKTtcclxuICAgICAgaWYgKHQuY2hpbGRyZW4pIGxpc3QucHVzaCguLi50aGlzLmdldEFsbEZpZWxkcyh0LmNoaWxkcmVuKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGlzdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZEZpZWxkSW5UYWJzKHRhYnM6IE5lc3RlZFRhYkNvbmZpZ1tdID0gW10sIGlkOiBzdHJpbmcpOiBOZXN0ZWRGaWVsZENvbmZpZyB8IG51bGwge1xyXG4gICAgZm9yIChjb25zdCB0IG9mIHRhYnMpIHtcclxuICAgICAgaWYgKHQuZmllbGRzKSB7XHJcbiAgICAgICAgY29uc3QgZm91bmQgPSB0LmZpZWxkcy5maW5kKGYgPT4gZi5pZCA9PT0gaWQpO1xyXG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0LmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyh0LmNoaWxkcmVuLCBpZCk7XHJcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEZpZWxkIENSVUQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIGFkZEZpZWxkKHR5cGU6IFJpY2hGaWVsZFR5cGUsIHRhcmdldFRhYklkPzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1ldGEgPSBnZXRGaWVsZFR5cGVNZXRhKHR5cGUpO1xyXG4gICAgY29uc3QgcHJlZml4ID0gbWV0YT8uaWRQcmVmaXggPz8gJ2ZpZWxkJztcclxuICAgIGNvbnN0IGFsbEZpZWxkcyA9IHRoaXMuZmllbGRzKCk7XHJcbiAgICBjb25zdCBpZCA9IHRoaXMudW5pcXVlSWQocHJlZml4LCBhbGxGaWVsZHMpO1xyXG5cclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSBjcmVhdGVGaWVsZENvbmZpZyh0eXBlLCBpZCwgZHJhZnQuZGVmYXVsdExhbmd1YWdlID8/ICdlbicpO1xyXG4gICAgICBjb25zdCB0YXJnZXRUYWIgPSB0YXJnZXRUYWJJZFxyXG4gICAgICAgID8gZHJhZnQudGFicy5maW5kKHQgPT4gdC5pZCA9PT0gdGFyZ2V0VGFiSWQpXHJcbiAgICAgICAgOiBkcmFmdC50YWJzWzBdO1xyXG4gICAgICBpZiAodGFyZ2V0VGFiKSB7XHJcbiAgICAgICAgdGFyZ2V0VGFiLmZpZWxkcyA9IHRhcmdldFRhYi5maWVsZHMgPz8gW107XHJcbiAgICAgICAgdGFyZ2V0VGFiLmZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkcmFmdC50YWJzLnB1c2goeyBpZDogJ21haW4nLCBsYWJlbDogeyBlbjogJ01haW4nIH0sIGZpZWxkczogW2ZpZWxkXSB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9zZWxlY3RlZEZpZWxkSWQuc2V0KGlkKTtcclxuICAgIHJldHVybiBpZDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUZpZWxkKGlkOiBzdHJpbmcsIHBhdGNoOiBQYXJ0aWFsPE5lc3RlZEZpZWxkQ29uZmlnPik6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGlkKTtcclxuICAgICAgaWYgKGZpZWxkKSBPYmplY3QuYXNzaWduKGZpZWxkLCBwYXRjaCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbmFtZSBhIGZpZWxkIGV4cGxpY2l0bHksIHBpbm5pbmcgdGhlIGlkIHNvIGl0IGlzIG5vIGxvbmdlciBkZXJpdmVkIGZyb20gdGhlIGxhYmVsLlxyXG4gICAqXHJcbiAgICogTm90IHJlYWNoYWJsZSBmcm9tIHRoZSBpbnNwZWN0b3Ig4oCUIHRoZSBpZCBpbnB1dCBpcyByZWFkLW9ubHkgYnkgZGVzaWduLiBUaGlzIGV4aXN0cyBmb3JcclxuICAgKiBwcm9ncmFtbWF0aWMgY2FsbGVycyB0aGF0IG11c3QgbWF0Y2ggYW4gaWQgdG8gYW4gZXhpc3RpbmcgZGF0YSBrZXkuXHJcbiAgICovXHJcbiAgcmVuYW1lRmllbGQob2xkSWQ6IHN0cmluZywgbmV3SWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgdHJpbW1lZCA9IG5ld0lkLnRyaW0oKTtcclxuICAgIGlmICghdHJpbW1lZCB8fCB0cmltbWVkID09PSBvbGRJZCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMuZmllbGRzKCkuc29tZShmID0+IGYuaWQgPT09IHRyaW1tZWQpKSByZXR1cm47XHJcbiAgICBpZiAoIXRoaXMuZmluZEZpZWxkSW5UYWJzKHRoaXMuX2NvbmZpZygpLnRhYnMsIG9sZElkKSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuYXBwbHlSZW5hbWUob2xkSWQsIHRyaW1tZWQpO1xyXG4gICAgdGhpcy5tYW51YWxJZHMuZGVsZXRlKG9sZElkKTtcclxuICAgIHRoaXMubWFudWFsSWRzLmFkZCh0cmltbWVkKTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoaXMgZmllbGQncyBpZCBpcyBwaW5uZWQgKGxvYWRlZCBmcm9tIHN0b3JhZ2Ugb3IgZXhwbGljaXRseSByZW5hbWVkKS4gKi9cclxuICBoYXNNYW51YWxJZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYW51YWxJZHMuaGFzKGlkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vdmUgYSBmaWVsZCB0byBhIG5ldyBpZCBhbmQgcmVwb2ludCBldmVyeSBpZC1iYXNlZCByZWZlcmVuY2UgaW4gdGhlIGNvbmZpZyBhdCBpdC5cclxuICAgKlxyXG4gICAqIElkcyBhcmUgdGhlIHdpcmluZyBiZXR3ZWVuIGZpZWxkcyDigJQgcnVsZXMsIGNhc2NhZGVzLCBwYXRjaGVzIGFuZCBgc2hvd1doZW5gIGFsbCBhZGRyZXNzXHJcbiAgICogZmllbGRzIGJ5IGlkIOKAlCBzbyBhIHJlbmFtZSB0aGF0IG9ubHkgdG91Y2hlcyBgZmllbGQuaWRgIHNpbGVudGx5IGJyZWFrcyB0aGF0IHdpcmluZy5cclxuICAgKiBUaGF0IHdhcyBzdXJ2aXZhYmxlIHdoaWxlIHJlbmFtaW5nIHdhcyBhIHJhcmUgbWFudWFsIGFjdDsgbGFiZWwtZGVyaXZlZCBpZHMgbWFrZSBpdFxyXG4gICAqIHJvdXRpbmUsIHNvIHRoZSByZWZlcmVuY2VzIG1vdmUgd2l0aCBpdC5cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5UmVuYW1lKG9sZElkOiBzdHJpbmcsIG5ld0lkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBvbGRJZCk7XHJcbiAgICAgIGlmICghZmllbGQpIHJldHVybjtcclxuICAgICAgZmllbGQuaWQgPSBuZXdJZDtcclxuXHJcbiAgICAgIGNvbnN0IHdhbGtGaWVsZHMgPSAoZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIGZpZWxkcyA/PyBbXSkge1xyXG4gICAgICAgICAgaWYgKGYuc2hvd1doZW4gJiYgb2xkSWQgaW4gZi5zaG93V2hlbikge1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gICAgICAgICAgICAvLyBSZWJ1aWxkIGluIHBsYWNlIHNvIGNvbmRpdGlvbiBvcmRlciBzdXJ2aXZlcyB0aGUgcmVuYW1lLlxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmLnNob3dXaGVuKSkge1xyXG4gICAgICAgICAgICAgIG5leHRba2V5ID09PSBvbGRJZCA/IG5ld0lkIDoga2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGYuc2hvd1doZW4gPSBuZXh0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGYuZW50aXR5UmVmZXJlbmNlPy5wYXJlbnRGaWVsZCA9PT0gb2xkSWQpIHtcclxuICAgICAgICAgICAgZi5lbnRpdHlSZWZlcmVuY2UgPSB7IC4uLmYuZW50aXR5UmVmZXJlbmNlLCBwYXJlbnRGaWVsZDogbmV3SWQgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChmLmF1dG9QYXRjaCkge1xyXG4gICAgICAgICAgICAvLyBgc291cmNlYCBuYW1lcyBhIGZpZWxkIG9uIHRoZSAqbGlua2VkKiByZWNvcmQsIG5vdCB0aGlzIGNvbmZpZyDigJQgbGVhdmUgaXQuXHJcbiAgICAgICAgICAgIGYuYXV0b1BhdGNoID0ge1xyXG4gICAgICAgICAgICAgIC4uLmYuYXV0b1BhdGNoLFxyXG4gICAgICAgICAgICAgIG1hcHBpbmdzOiBmLmF1dG9QYXRjaC5tYXBwaW5ncy5tYXAobSA9PlxyXG4gICAgICAgICAgICAgICAgbS50YXJnZXQgPT09IG9sZElkID8geyAuLi5tLCB0YXJnZXQ6IG5ld0lkIH0gOiBtLFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZi5wYXRjaE9uVHJ1ZSkge1xyXG4gICAgICAgICAgICBmLnBhdGNoT25UcnVlID0gZi5wYXRjaE9uVHJ1ZS5tYXAobSA9PiAoe1xyXG4gICAgICAgICAgICAgIGZyb206IG0uZnJvbSA9PT0gb2xkSWQgPyBuZXdJZCA6IG0uZnJvbSxcclxuICAgICAgICAgICAgICB0bzogbS50byA9PT0gb2xkSWQgPyBuZXdJZCA6IG0udG8sXHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChmLmNoaWxkcmVuPy5sZW5ndGgpIHdhbGtGaWVsZHMoZi5jaGlsZHJlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCB3YWxrVGFicyA9ICh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSB8IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgdGFiIG9mIHRhYnMgPz8gW10pIHtcclxuICAgICAgICAgIHdhbGtGaWVsZHModGFiLmZpZWxkcyk7XHJcbiAgICAgICAgICB3YWxrVGFicyh0YWIuY2hpbGRyZW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgd2Fsa1RhYnMoZHJhZnQudGFicyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9ydWxlcy51cGRhdGUocnVsZXMgPT5cclxuICAgICAgcnVsZXMubWFwKHJ1bGUgPT4gKHtcclxuICAgICAgICAuLi5ydWxlLFxyXG4gICAgICAgIGZpZWxkSWQ6IHJ1bGUuZmllbGRJZCA9PT0gb2xkSWQgPyBuZXdJZCA6IHJ1bGUuZmllbGRJZCxcclxuICAgICAgICB0YXJnZXRzOiBydWxlLnRhcmdldHMubWFwKHQgPT5cclxuICAgICAgICAgIHQudHlwZSA9PT0gJ2ZpZWxkJyAmJiB0LmlkID09PSBvbGRJZCA/IHsgLi4udCwgaWQ6IG5ld0lkIH0gOiB0LFxyXG4gICAgICAgICksXHJcbiAgICAgIH0pKSxcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkRmllbGRJZCgpID09PSBvbGRJZCkgdGhpcy5fc2VsZWN0ZWRGaWVsZElkLnNldChuZXdJZCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVGaWVsZChpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XHJcbiAgICAgIGZvciAoY29uc3QgdGFiIG9mIGRyYWZ0LnRhYnMpIHtcclxuICAgICAgICBpZiAodGFiLmZpZWxkcykge1xyXG4gICAgICAgICAgdGFiLmZpZWxkcyA9IHRhYi5maWVsZHMuZmlsdGVyKGYgPT4gZi5pZCAhPT0gaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1hbnVhbElkcy5kZWxldGUoaWQpO1xyXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkRmllbGRJZCgpID09PSBpZCkgdGhpcy5fc2VsZWN0ZWRGaWVsZElkLnNldChudWxsKTtcclxuICB9XHJcblxyXG4gIGR1cGxpY2F0ZUZpZWxkKGlkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIC8vIExvb2sgdGhlIHNvdXJjZSB1cCBieSBpZCDigJQgbm90IGJ5IGN1cnJlbnQgc2VsZWN0aW9uLiBUaGUgaW5zZXJ0IGJlbG93IHNlYXJjaGVzIGJ5IGlkXHJcbiAgICAvLyB0b28sIHNvIGZhbGxpbmcgYmFjayB0byB0aGUgc2VsZWN0ZWQgZmllbGQgY291bGQgcmVwb3J0IGEgbmV3IGlkIHdoaWxlIGluc2VydGluZ1xyXG4gICAgLy8gbm90aGluZywgb3IgZHVwbGljYXRlIGEgZmllbGQgdGhlIGNhbGxlciBuZXZlciBuYW1lZC5cclxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKHRoaXMuX2NvbmZpZygpLnRhYnMsIGlkKTtcclxuICAgIGlmICghc291cmNlKSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IG1ldGEgPSBnZXRGaWVsZFR5cGVNZXRhKHNvdXJjZS50eXBlKTtcclxuICAgIGNvbnN0IHByZWZpeCA9IG1ldGE/LmlkUHJlZml4ID8/ICdmaWVsZCc7XHJcbiAgICBjb25zdCBuZXdJZCA9IHRoaXMudW5pcXVlSWQocHJlZml4LCB0aGlzLmZpZWxkcygpKTtcclxuXHJcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XHJcbiAgICAgIGZvciAoY29uc3QgdGFiIG9mIGRyYWZ0LnRhYnMpIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9ICh0YWIuZmllbGRzID8/IFtdKS5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBpZCk7XHJcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgY29uc3QgY29weSA9IGNsb25lKHNvdXJjZSk7XHJcbiAgICAgICAgICBjb3B5LmlkID0gbmV3SWQ7XHJcbiAgICAgICAgICB0YWIuZmllbGRzIS5zcGxpY2UoaW5kZXggKyAxLCAwLCBjb3B5KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9zZWxlY3RlZEZpZWxkSWQuc2V0KG5ld0lkKTtcclxuICAgIHJldHVybiBuZXdJZDtcclxuICB9XHJcblxyXG4gIG1vdmVGaWVsZChpZDogc3RyaW5nLCBkaXJlY3Rpb246IC0xIHwgMSk6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBmb3IgKGNvbnN0IHRhYiBvZiBkcmFmdC50YWJzKSB7XHJcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGFiLmZpZWxkcyA/PyBbXTtcclxuICAgICAgICBjb25zdCBmcm9tID0gZmllbGRzLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGlkKTtcclxuICAgICAgICBpZiAoZnJvbSAhPT0gLTEpIHtcclxuICAgICAgICAgIGNvbnN0IHRvID0gZnJvbSArIGRpcmVjdGlvbjtcclxuICAgICAgICAgIGlmICh0byA8IDAgfHwgdG8gPj0gZmllbGRzLmxlbmd0aCkgcmV0dXJuO1xyXG4gICAgICAgICAgY29uc3QgW2l0ZW1dID0gZmllbGRzLnNwbGljZShmcm9tLCAxKTtcclxuICAgICAgICAgIGZpZWxkcy5zcGxpY2UodG8sIDAsIGl0ZW0pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogU2FmZSByZW9yZGVyIGZvciBkcmFnICYgZHJvcCB3aXRoaW4gYWN0aXZlIHRhYiBvciBmbGF0IGxpc3QgKi9cclxuICByZW9yZGVyRmllbGQoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlciwgdGFiSWQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgdGFyZ2V0VGFiID0gdGFiSWRcclxuICAgICAgICA/IGRyYWZ0LnRhYnMuZmluZCh0ID0+IHQuaWQgPT09IHRhYklkKVxyXG4gICAgICAgIDogZHJhZnQudGFic1swXTtcclxuICAgICAgY29uc3QgZmllbGRzID0gdGFyZ2V0VGFiPy5maWVsZHMgPz8gW107XHJcbiAgICAgIGlmIChcclxuICAgICAgICBmcm9tSW5kZXggPCAwIHx8XHJcbiAgICAgICAgdG9JbmRleCA8IDAgfHxcclxuICAgICAgICBmcm9tSW5kZXggPj0gZmllbGRzLmxlbmd0aCB8fFxyXG4gICAgICAgIHRvSW5kZXggPj0gZmllbGRzLmxlbmd0aFxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgW2l0ZW1dID0gZmllbGRzLnNwbGljZShmcm9tSW5kZXgsIDEpO1xyXG4gICAgICBmaWVsZHMuc3BsaWNlKHRvSW5kZXgsIDAsIGl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RGaWVsZChpZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRGaWVsZElkLnNldChpZCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgTG9jYWxpc2VkIHRleHQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBhIGZpZWxkJ3MgbGFiZWwsIGFuZCBkZXJpdmUgdGhlIGZpZWxkJ3MgaWQgZnJvbSBpdDogdHlwZSBcIkVtcGxveWVlIENvdW50XCIsIGdldFxyXG4gICAqIGBlbXBsb3llZUNvdW50YC4gVGhlIGluc3BlY3RvciByZW5kZXJzIHRoZSBpZCByZWFkLW9ubHksIHNvIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGFcclxuICAgKiBuZXcgZmllbGQncyBpZCBpcyBzZXQuXHJcbiAgICpcclxuICAgKiBUd28gdGhpbmdzIHN0b3AgZGVyaXZhdGlvbjogYSBjb25maWcgbG9hZGVkIGZyb20gc3RvcmFnZSAoaXRzIGlkcyBhcmUgbGl2ZSBkYXRhIGtleXNcclxuICAgKiB0aGF0IHJlY29yZHMgYXJlIGFscmVhZHkgc3RvcmVkIHVuZGVyIOKAlCBzZWUgYGxvYWRgKSwgYW5kIGFuIGV4cGxpY2l0IGByZW5hbWVGaWVsZGBcclxuICAgKiBjYWxsLCB3aGljaCByZW1haW5zIGF2YWlsYWJsZSB0byBwcm9ncmFtbWF0aWMgY2FsbGVycy5cclxuICAgKlxyXG4gICAqIE9ubHkgdGhlIGNvbmZpZydzIGRlZmF1bHQgbGFuZ3VhZ2UgZHJpdmVzIHRoZSBpZDsgdHJhbnNsYXRpbmcgYSBsYWJlbCBtdXN0IG5vdCByZW5hbWVcclxuICAgKiBhbnl0aGluZy5cclxuICAgKi9cclxuICBzZXRGaWVsZExhYmVsKGlkOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBpZCk7XHJcbiAgICAgIGlmIChmaWVsZCkgZmllbGQubGFiZWwgPSB7IC4uLmZpZWxkLmxhYmVsLCBbbGFuZ3VhZ2VdOiB2YWx1ZSB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGxhbmd1YWdlICE9PSAodGhpcy5fY29uZmlnKCkuZGVmYXVsdExhbmd1YWdlID8/ICdlbicpKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy5tYW51YWxJZHMuaGFzKGlkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGRlcml2ZWQgPSBsYWJlbFRvSWQodmFsdWUpO1xyXG4gICAgaWYgKCFkZXJpdmVkIHx8IGRlcml2ZWQgPT09IGlkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5hcHBseVJlbmFtZShpZCwgdGhpcy5hdmFpbGFibGVJZChkZXJpdmVkLCBpZCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIGBkZXJpdmVkYCwgb3IgYGRlcml2ZWRfMmAsIGBkZXJpdmVkXzNg4oCmIGlmIGFub3RoZXIgZmllbGQgYWxyZWFkeSBob2xkcyBpdC4gKi9cclxuICBwcml2YXRlIGF2YWlsYWJsZUlkKGRlcml2ZWQ6IHN0cmluZywgY3VycmVudElkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGFrZW4gPSBuZXcgU2V0KHRoaXMuZmllbGRzKCkubWFwKGYgPT4gZi5pZCkuZmlsdGVyKGZpZCA9PiBmaWQgIT09IGN1cnJlbnRJZCkpO1xyXG4gICAgaWYgKCF0YWtlbi5oYXMoZGVyaXZlZCkpIHJldHVybiBkZXJpdmVkO1xyXG5cclxuICAgIGxldCBuID0gMjtcclxuICAgIHdoaWxlICh0YWtlbi5oYXMoYCR7ZGVyaXZlZH1fJHtufWApKSBuICs9IDE7XHJcbiAgICByZXR1cm4gYCR7ZGVyaXZlZH1fJHtufWA7XHJcbiAgfVxyXG5cclxuICBzZXRGaWVsZFBsYWNlaG9sZGVyKGlkOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBpZCk7XHJcbiAgICAgIGlmICghZmllbGQpIHJldHVybjtcclxuICAgICAgZmllbGQucGxhY2Vob2xkZXIgPSB7IC4uLihmaWVsZC5wbGFjZWhvbGRlciA/PyB7fSksIFtsYW5ndWFnZV06IHZhbHVlIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBWYWxpZGF0b3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICB0b2dnbGVGbGFnVmFsaWRhdG9yKGlkOiBzdHJpbmcsIHZhbGlkYXRvcjogRmxhZ1ZhbGlkYXRvciwgb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBpZCk7XHJcbiAgICAgIGlmICghZmllbGQpIHJldHVybjtcclxuICAgICAgZmllbGQudmFsaWRhdG9ycyA9IGZpZWxkLnZhbGlkYXRvcnMgPz8ge307XHJcbiAgICAgIGlmICh2YWxpZGF0b3IgPT09ICdyZXF1aXJlZCcpIHtcclxuICAgICAgICBpZiAob24pIGZpZWxkLnZhbGlkYXRvcnMucmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgICAgIGVsc2UgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMucmVxdWlyZWQ7XHJcbiAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yID09PSAnZW1haWwnKSB7XHJcbiAgICAgICAgaWYgKG9uKSBmaWVsZC52YWxpZGF0b3JzLnBhdHRlcm4gPSAnXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFxcXC5bYS16QS1aXXsyLH0kJztcclxuICAgICAgICBlbHNlIGRlbGV0ZSBmaWVsZC52YWxpZGF0b3JzLnBhdHRlcm47XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFyYW1WYWxpZGF0b3IoaWQ6IHN0cmluZywgdmFsaWRhdG9yOiBQYXJhbVZhbGlkYXRvciwgdmFsdWU6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBpZCk7XHJcbiAgICAgIGlmICghZmllbGQpIHJldHVybjtcclxuICAgICAgZmllbGQudmFsaWRhdG9ycyA9IGZpZWxkLnZhbGlkYXRvcnMgPz8ge307XHJcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IE51bWJlci5pc05hTih2YWx1ZSkpIHtcclxuICAgICAgICBkZWxldGUgZmllbGQudmFsaWRhdG9yc1t2YWxpZGF0b3JdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpZWxkLnZhbGlkYXRvcnNbdmFsaWRhdG9yXSA9IHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldFBhcmFtVmFsaWRhdG9yKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZywgdmFsaWRhdG9yOiBQYXJhbVZhbGlkYXRvcik6IG51bWJlciB8IG51bGwge1xyXG4gICAgY29uc3QgdmFsID0gZmllbGQudmFsaWRhdG9ycz8uW3ZhbGlkYXRvcl07XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgPyB2YWwgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgaGFzRmxhZ1ZhbGlkYXRvcihmaWVsZDogTmVzdGVkRmllbGRDb25maWcsIHZhbGlkYXRvcjogRmxhZ1ZhbGlkYXRvcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHZhbGlkYXRvciA9PT0gJ3JlcXVpcmVkJykgcmV0dXJuICEhZmllbGQudmFsaWRhdG9ycz8ucmVxdWlyZWQ7XHJcbiAgICBpZiAodmFsaWRhdG9yID09PSAnZW1haWwnKSByZXR1cm4gISFmaWVsZC52YWxpZGF0b3JzPy5wYXR0ZXJuO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIE9wdGlvbnMgKGRyb3Bkb3duIC8gbXVsdGlTZWxlY3QgLyByYWRpbykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXJlIGEgY2hvaWNlIGZpZWxkJ3Mgb3B0aW9ucyBjb21lIGZyb20uXHJcbiAgICpcclxuICAgKiBgZW50aXR5YCBpcyBhYnNlbnQgb24gcHVycG9zZTogaW4gdGhpcyBtb2RlbCBhbiBlbnRpdHkgcmVmZXJlbmNlIGlzIGEgZmllbGQgKnR5cGUqXHJcbiAgICogKGBlbnRpdHktcmVmYCksIG5vdCBhIGRhdGEgc291cmNlIGEgZHJvcGRvd24gY2FuIHN3aXRjaCB0bywgc28gb2ZmZXJpbmcgaXQgaGVyZSB3b3VsZCBtZWFuXHJcbiAgICogbXV0YXRpbmcgdGhlIGZpZWxkJ3MgdHlwZSDigJQgYW5kIHJlYnVpbGRpbmcgaXRzIGNvbnRyb2wg4oCUIGZyb20gYSBzb3VyY2UgcGlja2VyLiBUaGVcclxuICAgKiBleGNsdXNpb24gdGhhdCBtYXR0ZXJzIHdpdGhpbiBhIGNob2ljZSBmaWVsZCBpcyBpbmxpbmUgYG9wdGlvbnNgIHZzIGBsaXN0TmFtZWAuXHJcbiAgICovXHJcbiAgZmllbGREYXRhU291cmNlKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyB8IHVuZGVmaW5lZCk6ICdub25lJyB8ICdtYW51YWwnIHwgJ2xvb2t1cCcge1xyXG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuICdub25lJztcclxuICAgIC8vIFByZXNlbmNlLCBub3QgZW1wdGluZXNzOiBhIHNvdXJjZSB0aGUgYXV0aG9yIGhhcyBwaWNrZWQgYnV0IG5vdCBmaWxsZWQgaW4geWV0IOKAlCBub1xyXG4gICAgLy8gb3B0aW9ucyBhdXRob3JlZCwgbm8gbGlzdCBuYW1lIHR5cGVkIOKAlCBtdXN0IHN0aWxsIHJlYWQgYXMgdGhhdCBzb3VyY2UsIG9yIHRoZSBlZGl0b3JcclxuICAgIC8vIGZvciBpdCBkaXNhcHBlYXJzIHRoZSBtb21lbnQgdGhleSBzZWxlY3QgaXQuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZC5vcHRpb25zKSkgcmV0dXJuICdtYW51YWwnO1xyXG4gICAgaWYgKHR5cGVvZiBmaWVsZC5saXN0TmFtZSA9PT0gJ3N0cmluZycpIHJldHVybiAnbG9va3VwJztcclxuICAgIHJldHVybiAnbm9uZSc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTd2l0Y2ggYSBjaG9pY2UgZmllbGQncyBkYXRhIHNvdXJjZSwgY2xlYXJpbmcgdGhlIG9uZSBpdCBpcyBsZWF2aW5nLlxyXG4gICAqXHJcbiAgICogVGhlIHJlZmVyZW5jZSBtYWtlcyB0aGVzZSBtdXR1YWxseSBleGNsdXNpdmUgKGRvYyDCpzQuNCkgYW5kIGl0IGhhcyB0byBzdGF5IHRoYXQgd2F5IGhlcmU6XHJcbiAgICogYG9wdGlvbnNGb3JgIHJlc29sdmVzIGlubGluZSBvcHRpb25zIGZpcnN0LCBzbyBhIGZpZWxkIGxlZnQgaG9sZGluZyBib3RoIHdvdWxkIHNpbGVudGx5XHJcbiAgICogaWdub3JlIGl0cyBsaXN0LlxyXG4gICAqL1xyXG4gIHNldEZpZWxkRGF0YVNvdXJjZShmaWVsZElkOiBzdHJpbmcsIHNvdXJjZTogJ25vbmUnIHwgJ21hbnVhbCcgfCAnbG9va3VwJyk6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xyXG4gICAgICBpZiAoIWZpZWxkKSByZXR1cm47XHJcbiAgICAgIGlmIChzb3VyY2UgPT09ICdtYW51YWwnKSB7XHJcbiAgICAgICAgZGVsZXRlIGZpZWxkLmxpc3ROYW1lO1xyXG4gICAgICAgIGZpZWxkLm9wdGlvbnMgPSBmaWVsZC5vcHRpb25zPy5sZW5ndGggPyBmaWVsZC5vcHRpb25zIDogW107XHJcbiAgICAgIH0gZWxzZSBpZiAoc291cmNlID09PSAnbG9va3VwJykge1xyXG4gICAgICAgIGRlbGV0ZSBmaWVsZC5vcHRpb25zO1xyXG4gICAgICAgIGZpZWxkLmxpc3ROYW1lID0gZmllbGQubGlzdE5hbWUgPz8gJyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVsZXRlIGZpZWxkLm9wdGlvbnM7XHJcbiAgICAgICAgZGVsZXRlIGZpZWxkLmxpc3ROYW1lO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBTZXQgdGhlIG5hbWVkIGxpc3QgYSBjaG9pY2UgZmllbGQgcmVhZHMgaXRzIG9wdGlvbnMgZnJvbS4gKi9cclxuICBzZXRMaXN0TmFtZShmaWVsZElkOiBzdHJpbmcsIGxpc3ROYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcclxuICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xyXG4gICAgICBjb25zdCB0cmltbWVkID0gbGlzdE5hbWUudHJpbSgpO1xyXG4gICAgICBpZiAodHJpbW1lZCkge1xyXG4gICAgICAgIGZpZWxkLmxpc3ROYW1lID0gdHJpbW1lZDtcclxuICAgICAgICAvLyBCZWx0IGFuZCBicmFjZXM6IGlubGluZSBvcHRpb25zIHdvdWxkIHdpbiBvdmVyIHRoZSBsaXN0IGF0IHJlbmRlciB0aW1lLlxyXG4gICAgICAgIGRlbGV0ZSBmaWVsZC5vcHRpb25zO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpZWxkLmxpc3ROYW1lID0gJyc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIExpbmsgYSBmaWVsZCB0byBhIGZpZWxkIGRlZmluZWQgaW4gYW5vdGhlciBlbnRpdHkgY29uZmlndXJhdGlvbiAoUGhhc2UgOCkuICovXHJcbiAgbGlua1JlZmVyZW5jZWRGaWVsZChmaWVsZElkOiBzdHJpbmcsIHNvdXJjZUVudGl0eUtleTogc3RyaW5nLCBzb3VyY2VGaWVsZDogTmVzdGVkRmllbGRDb25maWcpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcclxuICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xyXG4gICAgICBmaWVsZC5pc1JlZmVyZW5jZWQgPSB0cnVlO1xyXG4gICAgICBmaWVsZC5yZWZlcmVuY2VkRW50aXR5S2V5ID0gc291cmNlRW50aXR5S2V5O1xyXG4gICAgICBmaWVsZC5yZWZlcmVuY2VkRmllbGRJZCA9IHNvdXJjZUZpZWxkLmlkO1xyXG4gICAgICBmaWVsZC5yZWZlcmVuY2VkU25hcHNob3QgPSBjcmVhdGVGaWVsZFNuYXBzaG90KHNvdXJjZUZpZWxkKTtcclxuICAgICAgZmllbGQuaGFzRHJpZnQgPSBmYWxzZTtcclxuICAgICAgLy8gQ29weSBsYWJlbCwgdHlwZSwgdmFsaWRhdG9ycywgb3B0aW9ucyBmcm9tIHNvdXJjZVxyXG4gICAgICBpZiAoc291cmNlRmllbGQubGFiZWwpIGZpZWxkLmxhYmVsID0gY2xvbmUoc291cmNlRmllbGQubGFiZWwpO1xyXG4gICAgICBpZiAoc291cmNlRmllbGQudHlwZSkgZmllbGQudHlwZSA9IHNvdXJjZUZpZWxkLnR5cGU7XHJcbiAgICAgIGlmIChzb3VyY2VGaWVsZC52YWxpZGF0b3JzKSBmaWVsZC52YWxpZGF0b3JzID0gY2xvbmUoc291cmNlRmllbGQudmFsaWRhdG9ycyk7XHJcbiAgICAgIGlmIChzb3VyY2VGaWVsZC5vcHRpb25zKSBmaWVsZC5vcHRpb25zID0gY2xvbmUoc291cmNlRmllbGQub3B0aW9ucyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBVbmxpbmsgYSByZWZlcmVuY2VkIGZpZWxkIGJhY2sgdG8gYW4gaW5kZXBlbmRlbnQgZmllbGQuICovXHJcbiAgdW5saW5rUmVmZXJlbmNlZEZpZWxkKGZpZWxkSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xyXG4gICAgICBpZiAoIWZpZWxkKSByZXR1cm47XHJcbiAgICAgIGRlbGV0ZSBmaWVsZC5pc1JlZmVyZW5jZWQ7XHJcbiAgICAgIGRlbGV0ZSBmaWVsZC5yZWZlcmVuY2VkRW50aXR5S2V5O1xyXG4gICAgICBkZWxldGUgZmllbGQucmVmZXJlbmNlZEZpZWxkSWQ7XHJcbiAgICAgIGRlbGV0ZSBmaWVsZC5yZWZlcmVuY2VkU25hcHNob3Q7XHJcbiAgICAgIGRlbGV0ZSBmaWVsZC5oYXNEcmlmdDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN5bmMgYSBkcmlmdGVkIHJlZmVyZW5jZWQgZmllbGQgd2l0aCB0aGUgdXBkYXRlZCBzb3VyY2UgZmllbGQgZGVmaW5pdGlvbi4gKi9cclxuICBzeW5jUmVmZXJlbmNlZEZpZWxkKGZpZWxkSWQ6IHN0cmluZywgY3VycmVudFNvdXJjZUZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xyXG4gICAgICBpZiAoIWZpZWxkIHx8ICFmaWVsZC5pc1JlZmVyZW5jZWQpIHJldHVybjtcclxuICAgICAgZmllbGQucmVmZXJlbmNlZFNuYXBzaG90ID0gY3JlYXRlRmllbGRTbmFwc2hvdChjdXJyZW50U291cmNlRmllbGQpO1xyXG4gICAgICBmaWVsZC5oYXNEcmlmdCA9IGZhbHNlO1xyXG4gICAgICBpZiAoY3VycmVudFNvdXJjZUZpZWxkLmxhYmVsKSBmaWVsZC5sYWJlbCA9IGNsb25lKGN1cnJlbnRTb3VyY2VGaWVsZC5sYWJlbCk7XHJcbiAgICAgIGlmIChjdXJyZW50U291cmNlRmllbGQudHlwZSkgZmllbGQudHlwZSA9IGN1cnJlbnRTb3VyY2VGaWVsZC50eXBlO1xyXG4gICAgICBpZiAoY3VycmVudFNvdXJjZUZpZWxkLnZhbGlkYXRvcnMpIGZpZWxkLnZhbGlkYXRvcnMgPSBjbG9uZShjdXJyZW50U291cmNlRmllbGQudmFsaWRhdG9ycyk7XHJcbiAgICAgIGlmIChjdXJyZW50U291cmNlRmllbGQub3B0aW9ucykgZmllbGQub3B0aW9ucyA9IGNsb25lKGN1cnJlbnRTb3VyY2VGaWVsZC5vcHRpb25zKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNjYW4gYWxsIHJlZmVyZW5jZWQgZmllbGRzIGluIHRoZSBjb25maWcgYW5kIHVwZGF0ZSB0aGVpciBoYXNEcmlmdCBzdGF0ZSBhZ2FpbnN0IGN1cnJlbnQgc291cmNlIGNvbmZpZ3MuICovXHJcbiAgY2hlY2tEcmlmdChzb3VyY2VDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBFbnRpdHlGb3JtQ29uZmlnPik6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBzY2FuRmllbGRzID0gKGZpZWxkczogTmVzdGVkRmllbGRDb25maWdbXSkgPT4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWVsZHMpIHtcclxuICAgICAgICAgIGlmIChmLmlzUmVmZXJlbmNlZCAmJiBmLnJlZmVyZW5jZWRFbnRpdHlLZXkgJiYgZi5yZWZlcmVuY2VkRmllbGRJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDb25maWcgPSBzb3VyY2VDb25maWdzW2YucmVmZXJlbmNlZEVudGl0eUtleV07XHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpZWxkID0gc291cmNlQ29uZmlnXHJcbiAgICAgICAgICAgICAgPyB0aGlzLmZpbmRGaWVsZEluVGFicyhzb3VyY2VDb25maWcudGFicyA/PyBbXSwgZi5yZWZlcmVuY2VkRmllbGRJZClcclxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgZi5oYXNEcmlmdCA9IGNvbXB1dGVGaWVsZERyaWZ0KGYsIHNvdXJjZUZpZWxkID8/IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZi5jaGlsZHJlbj8ubGVuZ3RoKSBzY2FuRmllbGRzKGYuY2hpbGRyZW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgdGFiIG9mIGRyYWZ0LnRhYnMgPz8gW10pIHtcclxuICAgICAgICBpZiAodGFiLmZpZWxkcz8ubGVuZ3RoKSBzY2FuRmllbGRzKHRhYi5maWVsZHMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFkZE9wdGlvbihmaWVsZElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcclxuICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gZmllbGQub3B0aW9ucyA/PyBbXTtcclxuICAgICAgY29uc3QgbiA9IG9wdGlvbnMubGVuZ3RoICsgMTtcclxuICAgICAgY29uc3QgbGFuZyA9IGRyYWZ0LmRlZmF1bHRMYW5ndWFnZSA/PyAnZW4nO1xyXG4gICAgICBvcHRpb25zLnB1c2goeyBbbGFuZ106IGBPcHRpb24gJHtufWAgfSk7XHJcbiAgICAgIGZpZWxkLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAvLyBBdXRob3JpbmcgYW4gaW5saW5lIG9wdGlvbiBtYWtlcyB0aGlzIGEgbWFudWFsIGZpZWxkIOKAlCBzZWUgYHNldEZpZWxkRGF0YVNvdXJjZWAuXHJcbiAgICAgIGRlbGV0ZSBmaWVsZC5saXN0TmFtZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1lcmdlIGxhbmd1YWdlIGtleXMgaW50byBhbiBvcHRpb24uIGBzZXRPcHRpb25MYWJlbGAgaXMgdGhlIHVzdWFsIHNpbmdsZS1sYW5ndWFnZSBwYXRoLiAqL1xyXG4gIHVwZGF0ZU9wdGlvbihmaWVsZElkOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIHBhdGNoOiBEcm9wZG93bk9wdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xyXG4gICAgICBjb25zdCBvcHRpb24gPSBmaWVsZD8ub3B0aW9ucz8uW2luZGV4XTtcclxuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcclxuICAgICAgZmllbGQub3B0aW9ucyFbaW5kZXhdID0geyAuLi5vcHRpb24sIC4uLnBhdGNoIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBhbiBvcHRpb24ncyB0ZXh0IGZvciBvbmUgbGFuZ3VhZ2UuXHJcbiAgICpcclxuICAgKiBBbiBvcHRpb24gaXMgYSBsYW5ndWFnZS1rZXllZCBvYmplY3QgYW5kIHRoZSBkaXNwbGF5ZWQgdGV4dCAqKmlzKiogdGhlIHN0b3JlZCB2YWx1ZSxcclxuICAgKiBzbyB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBlZGl0IG9uZSDigJQgdGhlcmUgaXMgbm8gc2VwYXJhdGUgdmFsdWUgdG8gc2V0LlxyXG4gICAqL1xyXG4gIHNldE9wdGlvbkxhYmVsKGZpZWxkSWQ6IHN0cmluZywgaW5kZXg6IG51bWJlciwgbGFuZ3VhZ2U6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xyXG4gICAgICBjb25zdCBvcHRpb24gPSBmaWVsZD8ub3B0aW9ucz8uW2luZGV4XTtcclxuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcclxuICAgICAgZmllbGQub3B0aW9ucyFbaW5kZXhdID0geyAuLi5vcHRpb24sIFtsYW5ndWFnZV06IHZhbHVlIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZU9wdGlvbihmaWVsZElkOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcclxuICAgICAgaWYgKCFmaWVsZD8ub3B0aW9ucykgcmV0dXJuO1xyXG4gICAgICBmaWVsZC5vcHRpb25zID0gZmllbGQub3B0aW9ucy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEVudGl0eSByZWZlcmVuY2UgLyBjYXNjYWRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogTWVyZ2UgYSBwYXRjaCBpbnRvIGEgZmllbGQncyBgZW50aXR5UmVmZXJlbmNlYCBibG9jaywga2VlcGluZyBpdCBlbmFibGVkLiAqL1xyXG4gIHVwZGF0ZUVudGl0eVJlZmVyZW5jZShmaWVsZElkOiBzdHJpbmcsIHBhdGNoOiBQYXJ0aWFsPEVudGl0eVJlZmVyZW5jZUNvbmZpZz4pOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcclxuICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xyXG4gICAgICBjb25zdCBuZXh0OiBFbnRpdHlSZWZlcmVuY2VDb25maWcgPSB7XHJcbiAgICAgICAgLi4uKGZpZWxkLmVudGl0eVJlZmVyZW5jZSA/PyB7IGVuYWJsZWQ6IHRydWUgfSksXHJcbiAgICAgICAgLi4ucGF0Y2gsXHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgfTtcclxuICAgICAgLy8gRHJvcCBrZXlzIGV4cGxpY2l0bHkgY2xlYXJlZCB0byBgdW5kZWZpbmVkYCBzbyBleHBvcnRlZCBjb25maWdzIHN0YXkgY2xlYW4uXHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhdGNoKSBhcyAoa2V5b2YgRW50aXR5UmVmZXJlbmNlQ29uZmlnKVtdKSB7XHJcbiAgICAgICAgaWYgKHBhdGNoW2tleV0gPT09IHVuZGVmaW5lZCkgZGVsZXRlIG5leHRba2V5XTtcclxuICAgICAgfVxyXG4gICAgICBmaWVsZC5lbnRpdHlSZWZlcmVuY2UgPSBuZXh0O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgYXV0b1BhdGNoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBhZGRBdXRvUGF0Y2hNYXBwaW5nKGZpZWxkSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xyXG4gICAgICBpZiAoIWZpZWxkKSByZXR1cm47XHJcbiAgICAgIGNvbnN0IHRhcmdldFRhYiA9IGZpZWxkLmF1dG9QYXRjaD8udGFyZ2V0VGFiID8/IGRyYWZ0LnRhYnNbMF0/LmlkID8/ICcnO1xyXG4gICAgICBjb25zdCBtYXBwaW5ncyA9IFsuLi4oZmllbGQuYXV0b1BhdGNoPy5tYXBwaW5ncyA/PyBbXSksIHsgc291cmNlOiAnJywgdGFyZ2V0OiAnJyB9XTtcclxuICAgICAgZmllbGQuYXV0b1BhdGNoID0geyB0YXJnZXRUYWIsIG1hcHBpbmdzIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldEF1dG9QYXRjaFRhcmdldFRhYihmaWVsZElkOiBzdHJpbmcsIHRhcmdldFRhYjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maW5kRmllbGRJblRhYnMoZHJhZnQudGFicywgZmllbGRJZCk7XHJcbiAgICAgIGlmICghZmllbGQ/LmF1dG9QYXRjaCkgcmV0dXJuO1xyXG4gICAgICBmaWVsZC5hdXRvUGF0Y2ggPSB7IC4uLmZpZWxkLmF1dG9QYXRjaCwgdGFyZ2V0VGFiIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUF1dG9QYXRjaE1hcHBpbmcoZmllbGRJZDogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBwYXRjaDogUGFydGlhbDxBdXRvUGF0Y2hNYXBwaW5nPik6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xyXG4gICAgICBpZiAoIWZpZWxkPy5hdXRvUGF0Y2g/Lm1hcHBpbmdzPy5baW5kZXhdKSByZXR1cm47XHJcbiAgICAgIGZpZWxkLmF1dG9QYXRjaCA9IHtcclxuICAgICAgICAuLi5maWVsZC5hdXRvUGF0Y2gsXHJcbiAgICAgICAgbWFwcGluZ3M6IGZpZWxkLmF1dG9QYXRjaC5tYXBwaW5ncy5tYXAoKG0sIGkpID0+IChpID09PSBpbmRleCA/IHsgLi4ubSwgLi4ucGF0Y2ggfSA6IG0pKSxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlbW92aW5nIHRoZSBsYXN0IG1hcHBpbmcgZHJvcHMgYGF1dG9QYXRjaGAgZW50aXJlbHkg4oCUIG5vIGVtcHR5IGNvbmZpZyBpbiB0aGUgZXhwb3J0LiAqL1xyXG4gIHJlbW92ZUF1dG9QYXRjaE1hcHBpbmcoZmllbGRJZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maW5kRmllbGRJblRhYnMoZHJhZnQudGFicywgZmllbGRJZCk7XHJcbiAgICAgIGlmICghZmllbGQ/LmF1dG9QYXRjaCkgcmV0dXJuO1xyXG4gICAgICBjb25zdCBtYXBwaW5ncyA9IGZpZWxkLmF1dG9QYXRjaC5tYXBwaW5ncy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcclxuICAgICAgaWYgKG1hcHBpbmdzLmxlbmd0aCA9PT0gMCkgZGVsZXRlIGZpZWxkLmF1dG9QYXRjaDtcclxuICAgICAgZWxzZSBmaWVsZC5hdXRvUGF0Y2ggPSB7IC4uLmZpZWxkLmF1dG9QYXRjaCwgbWFwcGluZ3MgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIHBhdGNoT25UcnVlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBhZGRQYXRjaE9uVHJ1ZU1hcHBpbmcoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maW5kRmllbGRJblRhYnMoZHJhZnQudGFicywgZmllbGRJZCk7XHJcbiAgICAgIGlmICghZmllbGQpIHJldHVybjtcclxuICAgICAgZmllbGQucGF0Y2hPblRydWUgPSBbLi4uKGZpZWxkLnBhdGNoT25UcnVlID8/IFtdKSwgeyBmcm9tOiAnJywgdG86ICcnIH1dO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQYXRjaE9uVHJ1ZU1hcHBpbmcoZmllbGRJZDogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBwYXRjaDogUGFydGlhbDxQYXRjaE9uVHJ1ZU1hcHBpbmc+KTogdm9pZCB7XHJcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maW5kRmllbGRJblRhYnMoZHJhZnQudGFicywgZmllbGRJZCk7XHJcbiAgICAgIGlmICghZmllbGQ/LnBhdGNoT25UcnVlPy5baW5kZXhdKSByZXR1cm47XHJcbiAgICAgIGZpZWxkLnBhdGNoT25UcnVlID0gZmllbGQucGF0Y2hPblRydWUubWFwKChtLCBpKSA9PiAoaSA9PT0gaW5kZXggPyB7IC4uLm0sIC4uLnBhdGNoIH0gOiBtKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVBhdGNoT25UcnVlTWFwcGluZyhmaWVsZElkOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcclxuICAgICAgaWYgKCFmaWVsZD8ucGF0Y2hPblRydWUpIHJldHVybjtcclxuICAgICAgY29uc3QgbWFwcGluZ3MgPSBmaWVsZC5wYXRjaE9uVHJ1ZS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcclxuICAgICAgaWYgKG1hcHBpbmdzLmxlbmd0aCA9PT0gMCkgZGVsZXRlIGZpZWxkLnBhdGNoT25UcnVlO1xyXG4gICAgICBlbHNlIGZpZWxkLnBhdGNoT25UcnVlID0gbWFwcGluZ3M7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBzaG93V2hlbiAoc3RhdGljIGNvbmRpdGlvbmFsIHZpc2liaWxpdHkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogUmVwbGFjZSBhIGZpZWxkJ3MgYHNob3dXaGVuYCBtYXA7IGFuIGVtcHR5IG1hcCByZW1vdmVzIHRoZSBjb25kaXRpb24uICovXHJcbiAgc2V0U2hvd1doZW4oZmllbGRJZDogc3RyaW5nLCBzaG93V2hlbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcclxuICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xyXG4gICAgICBpZiAoIXNob3dXaGVuIHx8IE9iamVjdC5rZXlzKHNob3dXaGVuKS5sZW5ndGggPT09IDApIGRlbGV0ZSBmaWVsZC5zaG93V2hlbjtcclxuICAgICAgZWxzZSBmaWVsZC5zaG93V2hlbiA9IHNob3dXaGVuO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgUnVsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKiBSdWxlcyBmb3IgdGhlIGZpZWxkIGN1cnJlbnRseSBzZWxlY3RlZCBpbiB0aGUgaW5zcGVjdG9yLiAqL1xyXG4gIHJlYWRvbmx5IHJ1bGVzRm9yU2VsZWN0ZWRGaWVsZCA9IGNvbXB1dGVkPEZvcm1SdWxlW10+KCgpID0+IHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5fc2VsZWN0ZWRGaWVsZElkKCk7XHJcbiAgICBpZiAoIWlkKSByZXR1cm4gW107XHJcbiAgICByZXR1cm4gdGhpcy5fcnVsZXMoKS5maWx0ZXIociA9PiByLmZpZWxkSWQgPT09IGlkIHx8IHIudGFyZ2V0cy5zb21lKHQgPT4gdC5pZCA9PT0gaWQpKTtcclxuICB9KTtcclxuXHJcbiAgbG9hZFJ1bGVzKHJ1bGVzOiBGb3JtUnVsZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ydWxlcy5zZXQoY2xvbmUocnVsZXMpKTtcclxuICB9XHJcblxyXG4gIGFkZFJ1bGUocnVsZTogRm9ybVJ1bGUpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWQgPSBydWxlLmlkPy50cmltKCkgfHwgdGhpcy51bmlxdWVJZCgncnVsZScsIHRoaXMuX3J1bGVzKCkubWFwKHIgPT4gKHsgaWQ6IHIuaWQgPz8gJycgfSkpKTtcclxuICAgIHRoaXMuX3J1bGVzLnVwZGF0ZShydWxlcyA9PiBbLi4ucnVsZXMsIHsgLi4uY2xvbmUocnVsZSksIGlkIH1dKTtcclxuICAgIHJldHVybiBpZDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVJ1bGUoaWQ6IHN0cmluZywgcGF0Y2g6IFBhcnRpYWw8Rm9ybVJ1bGU+KTogdm9pZCB7XHJcbiAgICB0aGlzLl9ydWxlcy51cGRhdGUocnVsZXMgPT4gcnVsZXMubWFwKHIgPT4gKHIuaWQgPT09IGlkID8geyAuLi5yLCAuLi5jbG9uZShwYXRjaCksIGlkIH0gOiByKSkpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUnVsZShpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ydWxlcy51cGRhdGUocnVsZXMgPT4gcnVsZXMuZmlsdGVyKHIgPT4gci5pZCAhPT0gaWQpKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVJ1bGUoaWQ6IHN0cmluZywgZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVSdWxlKGlkLCB7IGVuYWJsZWQgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogTW92ZSBhIHJ1bGUgaW4gcHJpb3JpdHkgb3JkZXIuIFByaW9yaXRpZXMgYXJlIHJlbnVtYmVyZWQgMS4ubiBzbyB0aGV5IHN0YXkgY29udGlndW91cy4gKi9cclxuICBtb3ZlUnVsZShpZDogc3RyaW5nLCBkaXJlY3Rpb246IC0xIHwgMSk6IHZvaWQge1xyXG4gICAgdGhpcy5fcnVsZXMudXBkYXRlKHJ1bGVzID0+IHtcclxuICAgICAgY29uc3QgbmV4dCA9IFsuLi5ydWxlc107XHJcbiAgICAgIGNvbnN0IGZyb20gPSBuZXh0LmZpbmRJbmRleChyID0+IHIuaWQgPT09IGlkKTtcclxuICAgICAgaWYgKGZyb20gPT09IC0xKSByZXR1cm4gcnVsZXM7XHJcbiAgICAgIGNvbnN0IHRvID0gZnJvbSArIGRpcmVjdGlvbjtcclxuICAgICAgaWYgKHRvIDwgMCB8fCB0byA+PSBuZXh0Lmxlbmd0aCkgcmV0dXJuIHJ1bGVzO1xyXG4gICAgICBjb25zdCBbaXRlbV0gPSBuZXh0LnNwbGljZShmcm9tLCAxKTtcclxuICAgICAgbmV4dC5zcGxpY2UodG8sIDAsIGl0ZW0pO1xyXG4gICAgICByZXR1cm4gbmV4dC5tYXAoKHIsIGkpID0+ICh7IC4uLnIsIHByaW9yaXR5OiBpICsgMSB9KSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGV4cG9ydFJ1bGVzKCk6IEZvcm1SdWxlW10ge1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMuX3J1bGVzKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIFRhYnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIGFkZFRhYigpOiBzdHJpbmcge1xyXG4gICAgLy8gTXVzdCBiZSB1bmlxdWUgYWNyb3NzIHRoZSB3aG9sZSB0cmVlLCBub3QganVzdCB0aGUgdG9wIGxldmVsOiBhIHRhYiBpZCBpcyB0aGUgcmVjb3JkXHJcbiAgICAvLyBzdG9yYWdlIHBhdGgsIHNvIGEgbmV3IHRvcC1sZXZlbCB0YWIgY29sbGlkaW5nIHdpdGggYW4gZXhpc3Rpbmcgc3ViLXRhYiB3b3VsZCBtYWtlIHR3b1xyXG4gICAgLy8gdGFicyB3cml0ZSB0byB0aGUgc2FtZSBrZXkgYW5kIGJyZWFrIGZpbmRUYWIvZ2V0VGFiUGF0aC5cclxuICAgIGNvbnN0IGlkID0gdGhpcy51bmlxdWVJZCgndGFiJywgdGhpcy5hbGxUYWJJZHMoKS5tYXAodGlkID0+ICh7IGlkOiB0aWQgfSkpKTtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgdGFicyA9IGRyYWZ0LnRhYnMgPz8gKGRyYWZ0LnRhYnMgPSBbXSk7XHJcbiAgICAgIGNvbnN0IGxhbmcgPSBkcmFmdC5kZWZhdWx0TGFuZ3VhZ2UgPz8gJ2VuJztcclxuICAgICAgdGFicy5wdXNoKHsgaWQsIGxhYmVsOiB7IFtsYW5nXTogaHVtYW5pemVJZChpZCkgfSwgZmllbGRzOiBbXSB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGlkO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV2ZXJ5IHRhYiBpZCBpbiB0aGUgdHJlZSwgYXQgYW55IGRlcHRoLiBUYWIgaWRzIG11c3QgYmUgZ2xvYmFsbHkgdW5pcXVlIOKAlCB0aGV5IGFyZSBwYXRocy4gKi9cclxuICBwcml2YXRlIGFsbFRhYklkcygpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBpZHM6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBjb2xsZWN0ID0gKHRhYnM6IE5lc3RlZFRhYkNvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0YWJzID8/IFtdKSB7XHJcbiAgICAgICAgaWRzLnB1c2godC5pZCk7XHJcbiAgICAgICAgY29sbGVjdCh0LmNoaWxkcmVuKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGNvbGxlY3QodGhpcy5fY29uZmlnKCkudGFicyk7XHJcbiAgICByZXR1cm4gaWRzO1xyXG4gIH1cclxuXHJcbiAgYWRkU3ViVGFiKHBhcmVudElkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLnVuaXF1ZUlkKCd0YWInLCB0aGlzLmFsbFRhYklkcygpLm1hcCh0aWQgPT4gKHsgaWQ6IHRpZCB9KSkpO1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBwYXJlbnQgPSBmaW5kVGFiKGRyYWZ0LnRhYnMsIHBhcmVudElkKTtcclxuICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgIHBhcmVudC5jaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbiA/PyBbXTtcclxuICAgICAgICBjb25zdCBsYW5nID0gZHJhZnQuZGVmYXVsdExhbmd1YWdlID8/ICdlbic7XHJcbiAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2goeyBpZCwgbGFiZWw6IHsgW2xhbmddOiBodW1hbml6ZUlkKGlkKSB9LCBmaWVsZHM6IFtdIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBpZDtcclxuICB9XHJcblxyXG4gIHNldFByaW1hcnlUYWIodGFiSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xyXG4gICAgICBjb25zdCBtYXJrUHJpbWFyeSA9ICh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSkgPT4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0YWJzKSB7XHJcbiAgICAgICAgICB0LmlzUHJpbWFyeVRhYiA9IHQuaWQgPT09IHRhYklkO1xyXG4gICAgICAgICAgaWYgKHQuY2hpbGRyZW4pIG1hcmtQcmltYXJ5KHQuY2hpbGRyZW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgbWFya1ByaW1hcnkoZHJhZnQudGFicyA/PyBbXSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVRhYihpZDogc3RyaW5nLCBwYXRjaDogUGFydGlhbDxOZXN0ZWRUYWJDb25maWc+KTogdm9pZCB7XHJcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XHJcbiAgICAgIGNvbnN0IHRhYiA9IGZpbmRUYWIoZHJhZnQudGFicywgaWQpO1xyXG4gICAgICBpZiAodGFiKSBPYmplY3QuYXNzaWduKHRhYiwgcGF0Y2gpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRUYWJMYWJlbChpZDogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XHJcbiAgICAgIGNvbnN0IHRhYiA9IGZpbmRUYWIoZHJhZnQudGFicywgaWQpO1xyXG4gICAgICBpZiAodGFiKSB0YWIubGFiZWwgPSB7IC4uLnRhYi5sYWJlbCwgW2xhbmd1YWdlXTogdmFsdWUgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVGFiKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgcmVtb3ZlUmVjdXJzaXZlID0gKHRhYnM6IE5lc3RlZFRhYkNvbmZpZ1tdKTogTmVzdGVkVGFiQ29uZmlnW10gPT4ge1xyXG4gICAgICAgIHJldHVybiB0YWJzXHJcbiAgICAgICAgICAuZmlsdGVyKHQgPT4gdC5pZCAhPT0gaWQpXHJcbiAgICAgICAgICAubWFwKHQgPT4gKHtcclxuICAgICAgICAgICAgLi4udCxcclxuICAgICAgICAgICAgY2hpbGRyZW46IHQuY2hpbGRyZW4gPyByZW1vdmVSZWN1cnNpdmUodC5jaGlsZHJlbikgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgIH07XHJcbiAgICAgIGRyYWZ0LnRhYnMgPSByZW1vdmVSZWN1cnNpdmUoZHJhZnQudGFicyA/PyBbXSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG1vdmVUYWIoaWQ6IHN0cmluZywgZGlyZWN0aW9uOiAtMSB8IDEpOiB2b2lkIHtcclxuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcclxuICAgICAgY29uc3QgdGFicyA9IGRyYWZ0LnRhYnMgPz8gW107XHJcbiAgICAgIGNvbnN0IGZyb20gPSB0YWJzLmZpbmRJbmRleCh0ID0+IHQuaWQgPT09IGlkKTtcclxuICAgICAgaWYgKGZyb20gPT09IC0xKSByZXR1cm47XHJcbiAgICAgIGNvbnN0IHRvID0gZnJvbSArIGRpcmVjdGlvbjtcclxuICAgICAgaWYgKHRvIDwgMCB8fCB0byA+PSB0YWJzLmxlbmd0aCkgcmV0dXJuO1xyXG4gICAgICBjb25zdCBbaXRlbV0gPSB0YWJzLnNwbGljZShmcm9tLCAxKTtcclxuICAgICAgdGFicy5zcGxpY2UodG8sIDAsIGl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgRXhwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBleHBvcnRDb25maWcoKTogRW50aXR5Rm9ybUNvbmZpZyB7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcy5fY29uZmlnKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBtdXRhdGUoZm46IChkcmFmdDogRW50aXR5Rm9ybUNvbmZpZykgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgY29uc3QgZHJhZnQgPSBjbG9uZSh0aGlzLl9jb25maWcoKSk7XHJcbiAgICBkcmFmdC50YWJzID0gZHJhZnQudGFicyA/PyBbXTtcclxuICAgIGZuKGRyYWZ0KTtcclxuICAgIHRoaXMuX2NvbmZpZy5zZXQoZHJhZnQpO1xyXG4gICAgdGhpcy5faXNEaXJ0eS5zZXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVuaXF1ZUlkKHByZWZpeDogc3RyaW5nLCBleGlzdGluZzogeyBpZDogc3RyaW5nIH1bXSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0YWtlbiA9IG5ldyBTZXQoZXhpc3RpbmcubWFwKGUgPT4gZS5pZCkpO1xyXG4gICAgbGV0IG4gPSAxO1xyXG4gICAgbGV0IGNhbmRpZGF0ZSA9IGAke3ByZWZpeH1fJHtufWA7XHJcbiAgICB3aGlsZSAodGFrZW4uaGFzKGNhbmRpZGF0ZSkpIHtcclxuICAgICAgbiArPSAxO1xyXG4gICAgICBjYW5kaWRhdGUgPSBgJHtwcmVmaXh9XyR7bn1gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNhbmRpZGF0ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGUoY29uZmlnOiBFbnRpdHlGb3JtQ29uZmlnKTogQnVpbGRlclByb2JsZW1bXSB7XHJcbiAgICBjb25zdCBwcm9ibGVtczogQnVpbGRlclByb2JsZW1bXSA9IFtdO1xyXG5cclxuICAgIGlmICghY29uZmlnLmVudGl0eSB8fCAhY29uZmlnLmVudGl0eS50cmltKCkpIHtcclxuICAgICAgcHJvYmxlbXMucHVzaCh7IGxldmVsOiAnZXJyb3InLCBtZXNzYWdlOiAnRW50aXR5IG5hbWUgaXMgcmVxdWlyZWQuJyB9KTtcclxuICAgIH0gZWxzZSBpZiAoIUlEX1BBVFRFUk4udGVzdChjb25maWcuZW50aXR5KSkge1xyXG4gICAgICBwcm9ibGVtcy5wdXNoKHtcclxuICAgICAgICBsZXZlbDogJ2Vycm9yJyxcclxuICAgICAgICBtZXNzYWdlOlxyXG4gICAgICAgICAgJ0VudGl0eSBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBvciB1bmRlcnNjb3JlIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgZGlnaXRzLCBhbmQgdW5kZXJzY29yZXMuJyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsRmllbGRzID0gdGhpcy5nZXRBbGxGaWVsZHMoY29uZmlnLnRhYnMpO1xyXG4gICAgaWYgKGFsbEZpZWxkcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcHJvYmxlbXMucHVzaCh7IGxldmVsOiAnd2FybmluZycsIG1lc3NhZ2U6ICdUaGlzIGVudGl0eSBoYXMgbm8gZmllbGRzIHlldC4nIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBhbGxGaWVsZHMpIHtcclxuICAgICAgc2Vlbi5zZXQoZmllbGQuaWQsIChzZWVuLmdldChmaWVsZC5pZCkgPz8gMCkgKyAxKTtcclxuXHJcbiAgICAgIGlmICghZmllbGQuaWQgfHwgIUlEX1BBVFRFUk4udGVzdChmaWVsZC5pZCkpIHtcclxuICAgICAgICBwcm9ibGVtcy5wdXNoKHtcclxuICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxyXG4gICAgICAgICAgbWVzc2FnZTogYEZpZWxkIGlkIFwiJHtmaWVsZC5pZH1cIiBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyLmAsXHJcbiAgICAgICAgICBmaWVsZElkOiBmaWVsZC5pZCxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbGFiZWxzID0gZmllbGQubGFiZWwgPz8ge307XHJcbiAgICAgIGNvbnN0IGhhc0xhYmVsID0gT2JqZWN0LnZhbHVlcyhsYWJlbHMpLnNvbWUodiA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi50cmltKCkpO1xyXG4gICAgICBpZiAoIWhhc0xhYmVsKSB7XHJcbiAgICAgICAgcHJvYmxlbXMucHVzaCh7XHJcbiAgICAgICAgICBsZXZlbDogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgbWVzc2FnZTogYEZpZWxkIFwiJHtmaWVsZC5pZH1cIiBoYXMgbm8gbGFiZWwuYCxcclxuICAgICAgICAgIGZpZWxkSWQ6IGZpZWxkLmlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtZXRhID0gZ2V0RmllbGRUeXBlTWV0YShmaWVsZC50eXBlKTtcclxuICAgICAgLy8gQSBmaWVsZCBvbiB0aGUgbG9va3VwIHNvdXJjZSBoYXMgbm8gaW5saW5lIG9wdGlvbnMgYnkgZGVzaWduIOKAlCBpdHMgb3B0aW9ucyBhcnJpdmUgZnJvbVxyXG4gICAgICAvLyB0aGUgcmVnaXN0cnkgYXQgcnVudGltZS4gV2FybiBvbmx5IGFib3V0IHRoZSBtaXNzaW5nIGxpc3QgbmFtZS5cclxuICAgICAgaWYgKG1ldGE/Lmhhc09wdGlvbnMgJiYgdHlwZW9mIGZpZWxkLmxpc3ROYW1lID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGlmICghZmllbGQubGlzdE5hbWUudHJpbSgpKSB7XHJcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgbGV2ZWw6ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgbWVzc2FnZTogYEZpZWxkIFwiJHtmaWVsZC5pZH1cIiByZWFkcyBvcHRpb25zIGZyb20gYSBuYW1lZCBsaXN0IGJ1dCBoYXMgbm8gbGlzdCBuYW1lLmAsXHJcbiAgICAgICAgICAgIGZpZWxkSWQ6IGZpZWxkLmlkLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKG1ldGE/Lmhhc09wdGlvbnMgJiYgKCFmaWVsZC5vcHRpb25zIHx8IGZpZWxkLm9wdGlvbnMubGVuZ3RoID09PSAwKSkge1xyXG4gICAgICAgIHByb2JsZW1zLnB1c2goe1xyXG4gICAgICAgICAgbGV2ZWw6ICd3YXJuaW5nJyxcclxuICAgICAgICAgIG1lc3NhZ2U6IGBGaWVsZCBcIiR7ZmllbGQuaWR9XCIgaXMgYSAke2ZpZWxkLnR5cGV9IGJ1dCBoYXMgbm8gb3B0aW9ucy5gLFxyXG4gICAgICAgICAgZmllbGRJZDogZmllbGQuaWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IFtpZCwgY291bnRdIG9mIHNlZW4pIHtcclxuICAgICAgaWYgKGNvdW50ID4gMSkge1xyXG4gICAgICAgIHByb2JsZW1zLnB1c2goeyBsZXZlbDogJ2Vycm9yJywgbWVzc2FnZTogYER1cGxpY2F0ZSBmaWVsZCBpZCBcIiR7aWR9XCIgKCR7Y291bnR9w5cpLmAsIGZpZWxkSWQ6IGlkIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHByb2JsZW1zO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1057
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9idWlsZGVyLXN0b3JlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBYTdELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUgsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsVUFBVSxHQUdYLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFRcEMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDO0FBRXhCLE1BQU0sVUFBVSxHQUFHLDBCQUEwQixDQUFDO0FBRTlDOzs7Ozs7R0FNRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsbURBQW1ELENBQUM7QUFHakYsTUFBTSxPQUFPLFlBQVk7SUFDTixPQUFPLEdBQUcsTUFBTSxDQUFtQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN2RCxnQkFBZ0IsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQy9DLGVBQWUsR0FBRyxNQUFNLENBQVMsSUFBSSxDQUFDLENBQUM7SUFDeEQsZ0dBQWdHO0lBQy9FLE1BQU0sR0FBRyxNQUFNLENBQWEsRUFBRSxDQUFDLENBQUM7SUFDakQ7Ozs7T0FJRztJQUNjLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTlCLFFBQVEsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFbkQ7Ozs7O09BS0c7SUFDYyxVQUFVLEdBQUcsTUFBTSxDQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRTFDLE1BQU0sR0FBRyxJQUFJLENB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d0dBcGpDVSxZQUFZOzRHQUFaLFlBQVk7OzRGQUFaLFlBQVk7a0JBRHhCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBjb21wdXRlZCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEF1dG9QYXRjaE1hcHBpbmcsXG4gIERyb3Bkb3duT3B0aW9uLFxuICBFbnRpdHlGb3JtQ29uZmlnLFxuICBFbnRpdHlQZXJtaXNzaW9ucyxcbiAgRW50aXR5UmVmZXJlbmNlQ29uZmlnLFxuICBGb3JtUnVsZSxcbiAgTmVzdGVkRmllbGRDb25maWcsXG4gIE5lc3RlZFRhYkNvbmZpZyxcbiAgUGF0Y2hPblRydWVNYXBwaW5nLFxuICBSaWNoRmllbGRUeXBlLFxufSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBmaW5kVGFiLCBsYWJlbFRvSWQsIG5vcm1hbGl6ZUNvbmZpZ09wdGlvbnMsIGNvbXB1dGVGaWVsZERyaWZ0LCBjcmVhdGVGaWVsZFNuYXBzaG90IH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmllbGRDb25maWcsXG4gIGdldEZpZWxkVHlwZU1ldGEsXG4gIGh1bWFuaXplSWQsXG4gIHR5cGUgRmxhZ1ZhbGlkYXRvcixcbiAgdHlwZSBQYXJhbVZhbGlkYXRvcixcbn0gZnJvbSAnLi9maWVsZC1jYXRhbG9nJztcbmltcG9ydCB7IGRlZXBDbG9uZSB9IGZyb20gJy4vY2xvbmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJQcm9ibGVtIHtcbiAgbGV2ZWw6ICdlcnJvcicgfCAnd2FybmluZyc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZmllbGRJZD86IHN0cmluZztcbn1cblxuY29uc3QgY2xvbmUgPSBkZWVwQ2xvbmU7XG5cbmNvbnN0IElEX1BBVFRFUk4gPSAvXltBLVphLXpfXVtBLVphLXowLTlfXSokLztcblxuLyoqXG4gKiBUaGUgcmVnZXggdGhlIGJ1aWxkZXIgdXNlZCB0byB3cml0ZSBpbnRvIGBwYXR0ZXJuYCB0byBtZWFuIFwiZW1haWxcIi5cbiAqXG4gKiBSZXRhaW5lZCBvbmx5IHRvIHJlY29nbmlzZSBjb25maWdzIGF1dGhvcmVkIGJlZm9yZSBgRmllbGRWYWxpZGF0b3JzLmVtYWlsYCBleGlzdGVkLCBzb1xuICogdGhleSBzdGlsbCBzaG93IEVtYWlsIGFzIHRpY2tlZCBhbmQgZG8gbm90IGxlYXZlIGEgc3RyYXkgcGF0dGVybiBiZWhpbmQgd2hlbiBpdCBpc1xuICogdW4tdGlja2VkLiBOb3RoaW5nIHdyaXRlcyBpdCBhbnkgbW9yZS5cbiAqL1xuY29uc3QgTEVHQUNZX0VNQUlMX1BBVFRFUk4gPSAnXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFxcXC5bYS16QS1aXXsyLH0kJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJ1aWxkZXJTdG9yZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZyA9IHNpZ25hbDxFbnRpdHlGb3JtQ29uZmlnPih0aGlzLmVtcHR5Q29uZmlnKCkpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RlZEZpZWxkSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FjdGl2ZUxhbmd1YWdlID0gc2lnbmFsPHN0cmluZz4oJ2VuJyk7XG4gIC8qKiBSdWxlcyBsaXZlIGJlc2lkZSB0aGUgY29uZmlnOiB0aGV5IGFyZSBwZXJzaXN0ZWQgcGVyIGZvcm0sIG5vdCBpbnNpZGUgYEVudGl0eUZvcm1Db25maWdgLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9ydWxlcyA9IHNpZ25hbDxGb3JtUnVsZVtdPihbXSk7XG4gIC8qKlxuICAgKiBGaWVsZCBpZHMgdGhlIGF1dGhvciBvd25zIOKAlCBzZXQgYnkgYW4gZXhwbGljaXQgcmVuYW1lLCBvciBieSBsb2FkaW5nIGEgc2F2ZWQgY29uZmlnXG4gICAqIHdob3NlIGlkcyBhcmUgYWxyZWFkeSBsaXZlIGRhdGEga2V5cy4gSWRzIG91dHNpZGUgdGhpcyBzZXQgYXJlIHN0aWxsIGRlcml2ZWQgZnJvbSB0aGVcbiAgICogZmllbGQncyBsYWJlbC4gQnVpbGRlci1zZXNzaW9uIHN0YXRlLCBkZWxpYmVyYXRlbHkgbm90IHBhcnQgb2YgdGhlIGV4cG9ydGVkIGNvbmZpZy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFudWFsSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaXNEaXJ0eSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgLyoqXG4gICAqIFJvbGVzIG9mIHRoZSBwZXJzb24gdXNpbmcgdGhlIGJ1aWxkZXIg4oCUIGRpc3RpbmN0IGZyb20gYGF2YWlsYWJsZVJvbGVzYCwgd2hpY2ggaXMgdGhlXG4gICAqIHZvY2FidWxhcnkgYSBzY2hlbWEgbWF5IHJlZmVyZW5jZS4gTmVlZGVkIHNvIHRoZSBTWVNURU1fREVGQVVMVF9DQU5fRURJVCBwcmVkaWNhdGUgY2FuXG4gICAqIGJlIGFza2VkIGEgcmVhbCBxdWVzdGlvbjsgaXQgd2FzIHByZXZpb3VzbHkgY2FsbGVkIHdpdGggYSBoYXJkY29kZWQgZW1wdHkgYXJyYXksIHdoaWNoXG4gICAqIG1hZGUgYW55IHJvbGUtY2hlY2tpbmcgcHJlZGljYXRlIGFuc3dlciBmYWxzZSBmb3IgZXZlcnlvbmUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF91c2VyUm9sZXMgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcblxuICByZWFkb25seSBjb25maWcgPSB0aGlzLl9jb25maWcuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBzZWxlY3RlZEZpZWxkSWQgPSB0aGlzLl9zZWxlY3RlZEZpZWxkSWQuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBhY3RpdmVMYW5ndWFnZSA9IHRoaXMuX2FjdGl2ZUxhbmd1YWdlLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgcnVsZXMgPSB0aGlzLl9ydWxlcy5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IGlzRGlydHkgPSB0aGlzLl9pc0RpcnR5LmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgdXNlclJvbGVzID0gdGhpcy5fdXNlclJvbGVzLmFzUmVhZG9ubHkoKTtcblxuICByZWFkb25seSB0YWJzID0gY29tcHV0ZWQ8TmVzdGVkVGFiQ29uZmlnW10+KCgpID0+IHRoaXMuX2NvbmZpZygpLnRhYnMgPz8gW10pO1xuXG4gIHJlYWRvbmx5IGZpZWxkcyA9IGNvbXB1dGVkPE5lc3RlZEZpZWxkQ29uZmlnW10+KCgpID0+IHtcbiAgICByZXR1cm4gKHRoaXMuX2NvbmZpZygpLnRhYnMgPz8gW10pLmZsYXRNYXAodCA9PiB0LmZpZWxkcyA/PyBbXSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkRmllbGQgPSBjb21wdXRlZDxOZXN0ZWRGaWVsZENvbmZpZyB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBpZCA9IHRoaXMuX3NlbGVjdGVkRmllbGRJZCgpO1xuICAgIGlmICghaWQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmZpbmRGaWVsZEluVGFicyh0aGlzLl9jb25maWcoKS50YWJzLCBpZCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHByb2JsZW1zID0gY29tcHV0ZWQ8QnVpbGRlclByb2JsZW1bXT4oKCkgPT4gdGhpcy52YWxpZGF0ZSh0aGlzLl9jb25maWcoKSkpO1xuICByZWFkb25seSBlcnJvcnMgPSBjb21wdXRlZDxCdWlsZGVyUHJvYmxlbVtdPigoKSA9PlxuICAgIHRoaXMucHJvYmxlbXMoKS5maWx0ZXIocCA9PiBwLmxldmVsID09PSAnZXJyb3InKSxcbiAgKTtcbiAgcmVhZG9ubHkgaXNWYWxpZCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMuZXJyb3JzKCkubGVuZ3RoID09PSAwKTtcblxuICAvLyDilIDilIDilIAgSW5pdGlhbGlzYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgbG9hZChjb25maWc6IEVudGl0eUZvcm1Db25maWcpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiBhbnkgZmllbGRzIGNhcnJ5IGJvdGggaW5saW5lIG9wdGlvbnMgYW5kIGxpc3ROYW1lIGJlZm9yZSBub3JtYWxpemluZyBvcHRpb25zXG4gICAgY29uc3QgZmllbGRzV2l0aEJvdGggPSB0aGlzLmdldEFsbEZpZWxkcyhjb25maWcudGFicyA/PyBbXSkuZmlsdGVyKFxuICAgICAgZiA9PiBBcnJheS5pc0FycmF5KGYub3B0aW9ucykgJiYgZi5vcHRpb25zLmxlbmd0aCA+IDAgJiYgdHlwZW9mIGYubGlzdE5hbWUgPT09ICdzdHJpbmcnICYmIGYubGlzdE5hbWUudHJpbSgpICE9PSAnJyxcbiAgICApO1xuICAgIGZvciAoY29uc3QgZiBvZiBmaWVsZHNXaXRoQm90aCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0J1aWxkZXJTdG9yZV0gRmllbGQgXCIke2YuaWR9XCIgY2FycmllcyBib3RoIGlubGluZSBvcHRpb25zIGFuZCBsaXN0TmFtZSBcIiR7Zi5saXN0TmFtZX1cIi4gYCArXG4gICAgICAgICAgYElubGluZSBvcHRpb25zIHdpbjsgbGlzdE5hbWUgd2FzIGRyb3BwZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVGhlIG90aGVyIGJvdW5kYXJ5IHdoZXJlIGEgY29uZmlnIGVudGVycyB0aGUgbGlicmFyeSAodGhlIHJlbmRlcmVyJ3MgbmdPbkNoYW5nZXMgaXNcbiAgICAvLyB0aGUgZmlyc3QpLiBBdXRob3JpbmcgbXVzdCBzdGFydCBmcm9tIHRoZSBjYW5vbmljYWwgb3B0aW9uIHNoYXBlLCBvciB0aGUgYnVpbGRlclxuICAgIC8vIHdvdWxkIHJvdW5kLXRyaXAgYSBsZWdhY3kgY29uZmlnIHN0cmFpZ2h0IGJhY2sgb3V0IHVuY2hhbmdlZC5cbiAgICBjb25zdCBuZXh0ID0gY2xvbmUobm9ybWFsaXplQ29uZmlnT3B0aW9ucyhjb25maWcpKTtcbiAgICBuZXh0LnRhYnMgPSBuZXh0LnRhYnMgPz8gW107XG4gICAgaWYgKG5leHQudGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgIG5leHQudGFicyA9IFt7IGlkOiAnZGVmYXVsdCcsIGxhYmVsOiB7IGVuOiAnRGVmYXVsdCcgfSwgZmllbGRzOiBbXSB9XTtcbiAgICB9XG4gICAgdGhpcy5fY29uZmlnLnNldChuZXh0KTtcbiAgICBjb25zdCBmaXJzdEZpZWxkID0gdGhpcy5nZXRBbGxGaWVsZHMobmV4dC50YWJzKVswXTtcbiAgICB0aGlzLl9zZWxlY3RlZEZpZWxkSWQuc2V0KGZpcnN0RmllbGQ/LmlkID8/IG51bGwpO1xuICAgIHRoaXMuX2FjdGl2ZUxhbmd1YWdlLnNldChuZXh0LmRlZmF1bHRMYW5ndWFnZSA/PyAnZW4nKTtcblxuICAgIC8vIElkcyBpbiBhIHNhdmVkIGNvbmZpZyBhcmUgbGl2ZSBkYXRhIGtleXMg4oCUIHJlY29yZHMgYXJlIGFscmVhZHkgc3RvcmVkIHVuZGVyIHRoZW0uXG4gICAgLy8gRWRpdGluZyBhIGxhYmVsIG11c3QgbmV2ZXIgcmV3cml0ZSBvbmUsIHNvIGZyZWV6ZSBldmVyeSBpZCB0aGUgY29uZmlnIGFycml2ZWQgd2l0aC5cbiAgICB0aGlzLm1hbnVhbElkcy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5nZXRBbGxGaWVsZHMobmV4dC50YWJzKSkgdGhpcy5tYW51YWxJZHMuYWRkKGZpZWxkLmlkKTtcbiAgICB0aGlzLl9pc0RpcnR5LnNldChmYWxzZSk7XG4gIH1cblxuICByZXNldChlbnRpdHkgPSAnJyk6IHZvaWQge1xuICAgIHRoaXMuX2NvbmZpZy5zZXQodGhpcy5lbXB0eUNvbmZpZyhlbnRpdHkpKTtcbiAgICB0aGlzLl9zZWxlY3RlZEZpZWxkSWQuc2V0KG51bGwpO1xuICAgIHRoaXMuX3J1bGVzLnNldChbXSk7XG4gICAgdGhpcy5tYW51YWxJZHMuY2xlYXIoKTtcbiAgICB0aGlzLl9pc0RpcnR5LnNldChmYWxzZSk7XG4gIH1cblxuICByZXNldERpcnR5KCk6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlydHkuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1wdHlDb25maWcoZW50aXR5ID0gJycpOiBFbnRpdHlGb3JtQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5LFxuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIGRlZmF1bHRMYW5ndWFnZTogJ2VuJyxcbiAgICAgIHRhYnM6IFtdLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIAgRW50aXR5LWxldmVsIHNldHRpbmdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHNldEVudGl0eU5hbWUoZW50aXR5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBkcmFmdC5lbnRpdHkgPSBlbnRpdHkudHJpbSgpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0RGVmYXVsdExhbmd1YWdlKGxhbmd1YWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBkcmFmdC5kZWZhdWx0TGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldE1hc2tEYXRhKG1hc2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBkcmFmdC5tYXNrRGF0YSA9IG1hc2s7XG4gICAgfSk7XG4gIH1cblxuICBzZXRQZXJtaXNzaW9uKGFjdGlvbjoga2V5b2YgRW50aXR5UGVybWlzc2lvbnMsIHJvbGVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcbiAgICAgIGNvbnN0IHBlcm1pc3Npb25zOiBFbnRpdHlQZXJtaXNzaW9ucyA9IHsgLi4uKGRyYWZ0LnBlcm1pc3Npb25zID8/IHt9KSB9O1xuICAgICAgcGVybWlzc2lvbnNbYWN0aW9uXSA9IHJvbGVzO1xuICAgICAgZHJhZnQucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICB9KTtcbiAgfVxuXG4gIHNldEFjdGl2ZUxhbmd1YWdlKGxhbmd1YWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3RpdmVMYW5ndWFnZS5zZXQobGFuZ3VhZ2UpO1xuICB9XG5cbiAgLyoqIFJvbGVzIG9mIHRoZSBwZXJzb24gdXNpbmcgdGhlIGJ1aWxkZXIsIGZvciBTWVNURU1fREVGQVVMVF9DQU5fRURJVC4gKi9cbiAgc2V0VXNlclJvbGVzKHJvbGVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX3VzZXJSb2xlcy5zZXQocm9sZXMgPz8gW10pO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEhlbHBlciBUcmF2ZXJzYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBnZXRBbGxGaWVsZHModGFiczogTmVzdGVkVGFiQ29uZmlnW10gPSBbXSk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xuICAgIGNvbnN0IGxpc3Q6IE5lc3RlZEZpZWxkQ29uZmlnW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGFicykge1xuICAgICAgaWYgKHQuZmllbGRzKSBsaXN0LnB1c2goLi4udC5maWVsZHMpO1xuICAgICAgaWYgKHQuY2hpbGRyZW4pIGxpc3QucHVzaCguLi50aGlzLmdldEFsbEZpZWxkcyh0LmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IHRhYiBpbiB0aGUgdHJlZSwgZmxhdHRlbmVkLlxuICAgKlxuICAgKiBUaGUgc3RydWN0dXJhbCBvcGVyYXRpb25zIGJlbG93IHVzZWQgdG8gaXRlcmF0ZSBgZHJhZnQudGFic2AgZGlyZWN0bHksIHdoaWNoIGlzIG9ubHlcbiAgICogdGhlIHRvcCBsZXZlbC4gQSBmaWVsZCBvbiBhIHN1Yi10YWIgY291bGQgYmUgc2VsZWN0ZWQgYW5kIGVkaXRlZCBidXQgbmV2ZXIgcmVtb3ZlZCxcbiAgICogZHVwbGljYXRlZCwgbW92ZWQgb3IgcmVvcmRlcmVkIOKAlCB0aGUgYnVpbGRlciBjb3VsZCBhdXRob3IgbmVzdGVkIGNvbmZpZ3MgaXQgd2FzIHRoZW5cbiAgICogdW5hYmxlIHRvIHJlc3RydWN0dXJlLCB3aGljaCBpcyB0aGUgd29yc3QgcG9zc2libGUgc3RhdGUgZm9yIGFuIGF1dGhvcmluZyB0b29sLlxuICAgKi9cbiAgcHJpdmF0ZSBmbGF0dGVuVGFicyh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSA9IFtdKTogTmVzdGVkVGFiQ29uZmlnW10ge1xuICAgIGNvbnN0IGxpc3Q6IE5lc3RlZFRhYkNvbmZpZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHRhYnMpIHtcbiAgICAgIGxpc3QucHVzaCh0KTtcbiAgICAgIGlmICh0LmNoaWxkcmVuKSBsaXN0LnB1c2goLi4udGhpcy5mbGF0dGVuVGFicyh0LmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGZpZWxkIGlkIGluIHRoZSBjb25maWcsIGluY2x1ZGluZyBgZ3JvdXBgL2BhcnJheWAgY2hpbGRyZW4uXG4gICAqXG4gICAqIElkIHVuaXF1ZW5lc3MgaXMgYSB3aG9sZS1jb25maWcgaW52YXJpYW50LCBub3QgYSBwZXItdGFiIG9uZTogcnVsZXMsIGBzaG93V2hlbmBcbiAgICogY29uZGl0aW9ucyBhbmQgYGF1dG9QYXRjaGAgbWFwcGluZ3MgYWxsIGFkZHJlc3MgZmllbGRzIGJ5IGJhcmUgaWQsIHNvIHR3byBmaWVsZHNcbiAgICogc2hhcmluZyBhbiBpZCBhbnl3aGVyZSBpbiB0aGUgdHJlZSBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLiBVbmlxdWVuZXNzIGNoZWNrcyBtdXN0XG4gICAqIHRoZXJlZm9yZSBzZWUgZGVlcGVyIHRoYW4gYGZpZWxkcygpYCwgd2hpY2ggc3RvcHMgYXQgYSB0YWIncyBvd24gZmllbGRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhbGxGaWVsZElkcyh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSA9IFtdKTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHdhbGtGaWVsZHMgPSAoZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzID8/IFtdKSB7XG4gICAgICAgIGlkcy5hZGQoZi5pZCk7XG4gICAgICAgIGlmIChmLmNoaWxkcmVuPy5sZW5ndGgpIHdhbGtGaWVsZHMoZi5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHRhYiBvZiB0aGlzLmZsYXR0ZW5UYWJzKHRhYnMpKSB3YWxrRmllbGRzKHRhYi5maWVsZHMpO1xuICAgIHJldHVybiBpZHM7XG4gIH1cblxuICBwcml2YXRlIGZpbmRGaWVsZEluVGFicyh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSA9IFtdLCBpZDogc3RyaW5nKTogTmVzdGVkRmllbGRDb25maWcgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGFicykge1xuICAgICAgaWYgKHQuZmllbGRzKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdC5maWVsZHMuZmluZChmID0+IGYuaWQgPT09IGlkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgICBpZiAodC5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKHQuY2hpbGRyZW4sIGlkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEZpZWxkIENSVUQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkRmllbGQodHlwZTogUmljaEZpZWxkVHlwZSwgdGFyZ2V0VGFiSWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRGaWVsZFR5cGVNZXRhKHR5cGUpO1xuICAgIGNvbnN0IHByZWZpeCA9IG1ldGE/LmlkUHJlZml4ID8/ICdmaWVsZCc7XG4gICAgY29uc3QgaWQgPSB0aGlzLnVuaXF1ZUlkKHByZWZpeCwgdGhpcy5hbGxGaWVsZElkcyh0aGlzLl9jb25maWcoKS50YWJzKSk7XG5cbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IGNyZWF0ZUZpZWxkQ29uZmlnKHR5cGUsIGlkLCBkcmFmdC5kZWZhdWx0TGFuZ3VhZ2UgPz8gJ2VuJyk7XG4gICAgICBjb25zdCB0YXJnZXRUYWIgPSB0YXJnZXRUYWJJZFxuICAgICAgICA/IHRoaXMuZmxhdHRlblRhYnMoZHJhZnQudGFicykuZmluZCh0ID0+IHQuaWQgPT09IHRhcmdldFRhYklkKVxuICAgICAgICA6IGRyYWZ0LnRhYnNbMF07XG4gICAgICBpZiAodGFyZ2V0VGFiKSB7XG4gICAgICAgIHRhcmdldFRhYi5maWVsZHMgPSB0YXJnZXRUYWIuZmllbGRzID8/IFtdO1xuICAgICAgICB0YXJnZXRUYWIuZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhZnQudGFicy5wdXNoKHsgaWQ6ICdtYWluJywgbGFiZWw6IHsgZW46ICdNYWluJyB9LCBmaWVsZHM6IFtmaWVsZF0gfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fc2VsZWN0ZWRGaWVsZElkLnNldChpZCk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgdXBkYXRlRmllbGQoaWQ6IHN0cmluZywgcGF0Y2g6IFBhcnRpYWw8TmVzdGVkRmllbGRDb25maWc+KTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBpZCk7XG4gICAgICBpZiAoZmllbGQpIE9iamVjdC5hc3NpZ24oZmllbGQsIHBhdGNoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5hbWUgYSBmaWVsZCBleHBsaWNpdGx5LCBwaW5uaW5nIHRoZSBpZCBzbyBpdCBpcyBubyBsb25nZXIgZGVyaXZlZCBmcm9tIHRoZSBsYWJlbC5cbiAgICpcbiAgICogTm90IHJlYWNoYWJsZSBmcm9tIHRoZSBpbnNwZWN0b3Ig4oCUIHRoZSBpZCBpbnB1dCBpcyByZWFkLW9ubHkgYnkgZGVzaWduLiBUaGlzIGV4aXN0cyBmb3JcbiAgICogcHJvZ3JhbW1hdGljIGNhbGxlcnMgdGhhdCBtdXN0IG1hdGNoIGFuIGlkIHRvIGFuIGV4aXN0aW5nIGRhdGEga2V5LlxuICAgKi9cbiAgcmVuYW1lRmllbGQob2xkSWQ6IHN0cmluZywgbmV3SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBuZXdJZC50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkIHx8IHRyaW1tZWQgPT09IG9sZElkKSByZXR1cm47XG4gICAgaWYgKHRoaXMuYWxsRmllbGRJZHModGhpcy5fY29uZmlnKCkudGFicykuaGFzKHRyaW1tZWQpKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmZpbmRGaWVsZEluVGFicyh0aGlzLl9jb25maWcoKS50YWJzLCBvbGRJZCkpIHJldHVybjtcblxuICAgIHRoaXMuYXBwbHlSZW5hbWUob2xkSWQsIHRyaW1tZWQpO1xuICAgIHRoaXMubWFudWFsSWRzLmRlbGV0ZShvbGRJZCk7XG4gICAgdGhpcy5tYW51YWxJZHMuYWRkKHRyaW1tZWQpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBmaWVsZCdzIGlkIGlzIHBpbm5lZCAobG9hZGVkIGZyb20gc3RvcmFnZSBvciBleHBsaWNpdGx5IHJlbmFtZWQpLiAqL1xuICBoYXNNYW51YWxJZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWFudWFsSWRzLmhhcyhpZCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhIGZpZWxkIHRvIGEgbmV3IGlkIGFuZCByZXBvaW50IGV2ZXJ5IGlkLWJhc2VkIHJlZmVyZW5jZSBpbiB0aGUgY29uZmlnIGF0IGl0LlxuICAgKlxuICAgKiBJZHMgYXJlIHRoZSB3aXJpbmcgYmV0d2VlbiBmaWVsZHMg4oCUIHJ1bGVzLCBjYXNjYWRlcywgcGF0Y2hlcyBhbmQgYHNob3dXaGVuYCBhbGwgYWRkcmVzc1xuICAgKiBmaWVsZHMgYnkgaWQg4oCUIHNvIGEgcmVuYW1lIHRoYXQgb25seSB0b3VjaGVzIGBmaWVsZC5pZGAgc2lsZW50bHkgYnJlYWtzIHRoYXQgd2lyaW5nLlxuICAgKiBUaGF0IHdhcyBzdXJ2aXZhYmxlIHdoaWxlIHJlbmFtaW5nIHdhcyBhIHJhcmUgbWFudWFsIGFjdDsgbGFiZWwtZGVyaXZlZCBpZHMgbWFrZSBpdFxuICAgKiByb3V0aW5lLCBzbyB0aGUgcmVmZXJlbmNlcyBtb3ZlIHdpdGggaXQuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5UmVuYW1lKG9sZElkOiBzdHJpbmcsIG5ld0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIG9sZElkKTtcbiAgICAgIGlmICghZmllbGQpIHJldHVybjtcbiAgICAgIGZpZWxkLmlkID0gbmV3SWQ7XG5cbiAgICAgIGNvbnN0IHdhbGtGaWVsZHMgPSAoZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWVsZHMgPz8gW10pIHtcbiAgICAgICAgICBpZiAoZi5zaG93V2hlbiAmJiBvbGRJZCBpbiBmLnNob3dXaGVuKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICAgICAgLy8gUmVidWlsZCBpbiBwbGFjZSBzbyBjb25kaXRpb24gb3JkZXIgc3Vydml2ZXMgdGhlIHJlbmFtZS5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGYuc2hvd1doZW4pKSB7XG4gICAgICAgICAgICAgIG5leHRba2V5ID09PSBvbGRJZCA/IG5ld0lkIDoga2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZi5zaG93V2hlbiA9IG5leHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmLmVudGl0eVJlZmVyZW5jZT8ucGFyZW50RmllbGQgPT09IG9sZElkKSB7XG4gICAgICAgICAgICBmLmVudGl0eVJlZmVyZW5jZSA9IHsgLi4uZi5lbnRpdHlSZWZlcmVuY2UsIHBhcmVudEZpZWxkOiBuZXdJZCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZi5hdXRvUGF0Y2gpIHtcbiAgICAgICAgICAgIC8vIGBzb3VyY2VgIG5hbWVzIGEgZmllbGQgb24gdGhlICpsaW5rZWQqIHJlY29yZCwgbm90IHRoaXMgY29uZmlnIOKAlCBsZWF2ZSBpdC5cbiAgICAgICAgICAgIGYuYXV0b1BhdGNoID0ge1xuICAgICAgICAgICAgICAuLi5mLmF1dG9QYXRjaCxcbiAgICAgICAgICAgICAgbWFwcGluZ3M6IGYuYXV0b1BhdGNoLm1hcHBpbmdzLm1hcChtID0+XG4gICAgICAgICAgICAgICAgbS50YXJnZXQgPT09IG9sZElkID8geyAuLi5tLCB0YXJnZXQ6IG5ld0lkIH0gOiBtLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGYucGF0Y2hPblRydWUpIHtcbiAgICAgICAgICAgIGYucGF0Y2hPblRydWUgPSBmLnBhdGNoT25UcnVlLm1hcChtID0+ICh7XG4gICAgICAgICAgICAgIGZyb206IG0uZnJvbSA9PT0gb2xkSWQgPyBuZXdJZCA6IG0uZnJvbSxcbiAgICAgICAgICAgICAgdG86IG0udG8gPT09IG9sZElkID8gbmV3SWQgOiBtLnRvLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZi5jaGlsZHJlbj8ubGVuZ3RoKSB3YWxrRmllbGRzKGYuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB0YWIgb2YgdGFicyA/PyBbXSkge1xuICAgICAgICAgIHdhbGtGaWVsZHModGFiLmZpZWxkcyk7XG4gICAgICAgICAgd2Fsa1RhYnModGFiLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHdhbGtUYWJzKGRyYWZ0LnRhYnMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fcnVsZXMudXBkYXRlKHJ1bGVzID0+XG4gICAgICBydWxlcy5tYXAocnVsZSA9PiAoe1xuICAgICAgICAuLi5ydWxlLFxuICAgICAgICBmaWVsZElkOiBydWxlLmZpZWxkSWQgPT09IG9sZElkID8gbmV3SWQgOiBydWxlLmZpZWxkSWQsXG4gICAgICAgIHRhcmdldHM6IHJ1bGUudGFyZ2V0cy5tYXAodCA9PlxuICAgICAgICAgIHQudHlwZSA9PT0gJ2ZpZWxkJyAmJiB0LmlkID09PSBvbGRJZCA/IHsgLi4udCwgaWQ6IG5ld0lkIH0gOiB0LFxuICAgICAgICApLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRGaWVsZElkKCkgPT09IG9sZElkKSB0aGlzLl9zZWxlY3RlZEZpZWxkSWQuc2V0KG5ld0lkKTtcbiAgfVxuXG4gIHJlbW92ZUZpZWxkKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHRhYiBvZiB0aGlzLmZsYXR0ZW5UYWJzKGRyYWZ0LnRhYnMpKSB7XG4gICAgICAgIGlmICh0YWIuZmllbGRzKSB7XG4gICAgICAgICAgdGFiLmZpZWxkcyA9IHRhYi5maWVsZHMuZmlsdGVyKGYgPT4gZi5pZCAhPT0gaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5tYW51YWxJZHMuZGVsZXRlKGlkKTtcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRGaWVsZElkKCkgPT09IGlkKSB0aGlzLl9zZWxlY3RlZEZpZWxkSWQuc2V0KG51bGwpO1xuICB9XG5cbiAgZHVwbGljYXRlRmllbGQoaWQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIExvb2sgdGhlIHNvdXJjZSB1cCBieSBpZCDigJQgbm90IGJ5IGN1cnJlbnQgc2VsZWN0aW9uLiBUaGUgaW5zZXJ0IGJlbG93IHNlYXJjaGVzIGJ5IGlkXG4gICAgLy8gdG9vLCBzbyBmYWxsaW5nIGJhY2sgdG8gdGhlIHNlbGVjdGVkIGZpZWxkIGNvdWxkIHJlcG9ydCBhIG5ldyBpZCB3aGlsZSBpbnNlcnRpbmdcbiAgICAvLyBub3RoaW5nLCBvciBkdXBsaWNhdGUgYSBmaWVsZCB0aGUgY2FsbGVyIG5ldmVyIG5hbWVkLlxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKHRoaXMuX2NvbmZpZygpLnRhYnMsIGlkKTtcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbWV0YSA9IGdldEZpZWxkVHlwZU1ldGEoc291cmNlLnR5cGUpO1xuICAgIGNvbnN0IHByZWZpeCA9IG1ldGE/LmlkUHJlZml4ID8/ICdmaWVsZCc7XG4gICAgY29uc3QgbmV3SWQgPSB0aGlzLnVuaXF1ZUlkKHByZWZpeCwgdGhpcy5hbGxGaWVsZElkcyh0aGlzLl9jb25maWcoKS50YWJzKSk7XG5cbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHRhYiBvZiB0aGlzLmZsYXR0ZW5UYWJzKGRyYWZ0LnRhYnMpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKHRhYi5maWVsZHMgPz8gW10pLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGlkKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IGNvcHkgPSBjbG9uZShzb3VyY2UpO1xuICAgICAgICAgIGNvcHkuaWQgPSBuZXdJZDtcbiAgICAgICAgICB0YWIuZmllbGRzIS5zcGxpY2UoaW5kZXggKyAxLCAwLCBjb3B5KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX3NlbGVjdGVkRmllbGRJZC5zZXQobmV3SWQpO1xuICAgIHJldHVybiBuZXdJZDtcbiAgfVxuXG4gIG1vdmVGaWVsZChpZDogc3RyaW5nLCBkaXJlY3Rpb246IC0xIHwgMSk6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcbiAgICAgIGZvciAoY29uc3QgdGFiIG9mIHRoaXMuZmxhdHRlblRhYnMoZHJhZnQudGFicykpIHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGFiLmZpZWxkcyA/PyBbXTtcbiAgICAgICAgY29uc3QgZnJvbSA9IGZpZWxkcy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBpZCk7XG4gICAgICAgIGlmIChmcm9tICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IHRvID0gZnJvbSArIGRpcmVjdGlvbjtcbiAgICAgICAgICBpZiAodG8gPCAwIHx8IHRvID49IGZpZWxkcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBbaXRlbV0gPSBmaWVsZHMuc3BsaWNlKGZyb20sIDEpO1xuICAgICAgICAgIGZpZWxkcy5zcGxpY2UodG8sIDAsIGl0ZW0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNhZmUgcmVvcmRlciBmb3IgZHJhZyAmIGRyb3Agd2l0aGluIGFjdGl2ZSB0YWIgb3IgZmxhdCBsaXN0ICovXG4gIHJlb3JkZXJGaWVsZChmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyLCB0YWJJZD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldFRhYiA9IHRhYklkXG4gICAgICAgID8gdGhpcy5mbGF0dGVuVGFicyhkcmFmdC50YWJzKS5maW5kKHQgPT4gdC5pZCA9PT0gdGFiSWQpXG4gICAgICAgIDogZHJhZnQudGFic1swXTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHRhcmdldFRhYj8uZmllbGRzID8/IFtdO1xuICAgICAgaWYgKFxuICAgICAgICBmcm9tSW5kZXggPCAwIHx8XG4gICAgICAgIHRvSW5kZXggPCAwIHx8XG4gICAgICAgIGZyb21JbmRleCA+PSBmaWVsZHMubGVuZ3RoIHx8XG4gICAgICAgIHRvSW5kZXggPj0gZmllbGRzLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IFtpdGVtXSA9IGZpZWxkcy5zcGxpY2UoZnJvbUluZGV4LCAxKTtcbiAgICAgIGZpZWxkcy5zcGxpY2UodG9JbmRleCwgMCwgaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RGaWVsZChpZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkRmllbGRJZC5zZXQoaWQpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIExvY2FsaXNlZCB0ZXh0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBTZXQgYSBmaWVsZCdzIGxhYmVsLCBhbmQgZGVyaXZlIHRoZSBmaWVsZCdzIGlkIGZyb20gaXQ6IHR5cGUgXCJFbXBsb3llZSBDb3VudFwiLCBnZXRcbiAgICogYGVtcGxveWVlQ291bnRgLiBUaGUgaW5zcGVjdG9yIHJlbmRlcnMgdGhlIGlkIHJlYWQtb25seSwgc28gdGhpcyBpcyB0aGUgb25seSB3YXkgYVxuICAgKiBuZXcgZmllbGQncyBpZCBpcyBzZXQuXG4gICAqXG4gICAqIFR3byB0aGluZ3Mgc3RvcCBkZXJpdmF0aW9uOiBhIGNvbmZpZyBsb2FkZWQgZnJvbSBzdG9yYWdlIChpdHMgaWRzIGFyZSBsaXZlIGRhdGEga2V5c1xuICAgKiB0aGF0IHJlY29yZHMgYXJlIGFscmVhZHkgc3RvcmVkIHVuZGVyIOKAlCBzZWUgYGxvYWRgKSwgYW5kIGFuIGV4cGxpY2l0IGByZW5hbWVGaWVsZGBcbiAgICogY2FsbCwgd2hpY2ggcmVtYWlucyBhdmFpbGFibGUgdG8gcHJvZ3JhbW1hdGljIGNhbGxlcnMuXG4gICAqXG4gICAqIE9ubHkgdGhlIGNvbmZpZydzIGRlZmF1bHQgbGFuZ3VhZ2UgZHJpdmVzIHRoZSBpZDsgdHJhbnNsYXRpbmcgYSBsYWJlbCBtdXN0IG5vdCByZW5hbWVcbiAgICogYW55dGhpbmcuXG4gICAqL1xuICBzZXRGaWVsZExhYmVsKGlkOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBCb3VuZCB0byBhIGtleXN0cm9rZSBldmVudCwgc28gdGhpcyB1c2VzIHRoZSBzdHJ1Y3R1cmFsLXNoYXJpbmcgcGF0aC5cbiAgICB0aGlzLm11dGF0ZUZpZWxkKGlkLCBmaWVsZCA9PiAoeyAuLi5maWVsZCwgbGFiZWw6IHsgLi4uZmllbGQubGFiZWwsIFtsYW5ndWFnZV06IHZhbHVlIH0gfSkpO1xuXG4gICAgaWYgKGxhbmd1YWdlICE9PSAodGhpcy5fY29uZmlnKCkuZGVmYXVsdExhbmd1YWdlID8/ICdlbicpKSByZXR1cm47XG4gICAgaWYgKHRoaXMubWFudWFsSWRzLmhhcyhpZCkpIHJldHVybjtcblxuICAgIGNvbnN0IGRlcml2ZWQgPSBsYWJlbFRvSWQodmFsdWUpO1xuICAgIGlmICghZGVyaXZlZCB8fCBkZXJpdmVkID09PSBpZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5hcHBseVJlbmFtZShpZCwgdGhpcy5hdmFpbGFibGVJZChkZXJpdmVkLCBpZCkpO1xuICB9XG5cbiAgLyoqIGBkZXJpdmVkYCwgb3IgYGRlcml2ZWRfMmAsIGBkZXJpdmVkXzNg4oCmIGlmIGFub3RoZXIgZmllbGQgYWxyZWFkeSBob2xkcyBpdC4gKi9cbiAgcHJpdmF0ZSBhdmFpbGFibGVJZChkZXJpdmVkOiBzdHJpbmcsIGN1cnJlbnRJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0YWtlbiA9IG5ldyBTZXQoWy4uLnRoaXMuYWxsRmllbGRJZHModGhpcy5fY29uZmlnKCkudGFicyldLmZpbHRlcihmaWQgPT4gZmlkICE9PSBjdXJyZW50SWQpKTtcbiAgICBpZiAoIXRha2VuLmhhcyhkZXJpdmVkKSkgcmV0dXJuIGRlcml2ZWQ7XG5cbiAgICBsZXQgbiA9IDI7XG4gICAgd2hpbGUgKHRha2VuLmhhcyhgJHtkZXJpdmVkfV8ke259YCkpIG4gKz0gMTtcbiAgICByZXR1cm4gYCR7ZGVyaXZlZH1fJHtufWA7XG4gIH1cblxuICBzZXRGaWVsZFBsYWNlaG9sZGVyKGlkOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGlkKTtcbiAgICAgIGlmICghZmllbGQpIHJldHVybjtcbiAgICAgIGZpZWxkLnBsYWNlaG9sZGVyID0geyAuLi4oZmllbGQucGxhY2Vob2xkZXIgPz8ge30pLCBbbGFuZ3VhZ2VdOiB2YWx1ZSB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFZhbGlkYXRvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgdG9nZ2xlRmxhZ1ZhbGlkYXRvcihpZDogc3RyaW5nLCB2YWxpZGF0b3I6IEZsYWdWYWxpZGF0b3IsIG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBpZCk7XG4gICAgICBpZiAoIWZpZWxkKSByZXR1cm47XG4gICAgICBmaWVsZC52YWxpZGF0b3JzID0gZmllbGQudmFsaWRhdG9ycyA/PyB7fTtcbiAgICAgIGlmICh2YWxpZGF0b3IgPT09ICdyZXF1aXJlZCcpIHtcbiAgICAgICAgaWYgKG9uKSBmaWVsZC52YWxpZGF0b3JzLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBkZWxldGUgZmllbGQudmFsaWRhdG9ycy5yZXF1aXJlZDtcbiAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yID09PSAnZW1haWwnKSB7XG4gICAgICAgIC8vIFdyaXRlcyBpdHMgb3duIGZsYWcsIG5vdCBgcGF0dGVybmAuIFNoYXJpbmcgYHBhdHRlcm5gIG1lYW50IGEgZmllbGQgY291bGQgbm90IGhhdmVcbiAgICAgICAgLy8gYm90aCBhbiBlbWFpbCBjaGVjayBhbmQgYSBjdXN0b20gcmVnZXgsIHNldHRpbmcgYSBjdXN0b20gcGF0dGVybiBtYWRlIHRoZSBFbWFpbCBib3hcbiAgICAgICAgLy8gYXBwZWFyIHRpY2tlZCwgYW5kIHVuLXRpY2tpbmcgRW1haWwgZGVsZXRlZCB3aGF0ZXZlciBwYXR0ZXJuIHRoZSBhdXRob3IgaGFkIHdyaXR0ZW4uXG4gICAgICAgIGlmIChvbikgZmllbGQudmFsaWRhdG9ycy5lbWFpbCA9IHRydWU7XG4gICAgICAgIGVsc2UgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMuZW1haWw7XG4gICAgICAgIC8vIENsZWFyIHRoZSBsZWdhY3kgZW5jb2RpbmcgZWl0aGVyIHdheSwgc28gYSBjb25maWcgdG91Y2hlZCBoZXJlIHN0b3BzIGNhcnJ5aW5nIGJvdGguXG4gICAgICAgIGlmIChmaWVsZC52YWxpZGF0b3JzLnBhdHRlcm4gPT09IExFR0FDWV9FTUFJTF9QQVRURVJOKSBkZWxldGUgZmllbGQudmFsaWRhdG9ycy5wYXR0ZXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0UGFyYW1WYWxpZGF0b3IoaWQ6IHN0cmluZywgdmFsaWRhdG9yOiBQYXJhbVZhbGlkYXRvciwgdmFsdWU6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGlkKTtcbiAgICAgIGlmICghZmllbGQpIHJldHVybjtcbiAgICAgIGZpZWxkLnZhbGlkYXRvcnMgPSBmaWVsZC52YWxpZGF0b3JzID8/IHt9O1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICBkZWxldGUgZmllbGQudmFsaWRhdG9yc1t2YWxpZGF0b3JdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGQudmFsaWRhdG9yc1t2YWxpZGF0b3JdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRQYXJhbVZhbGlkYXRvcihmaWVsZDogTmVzdGVkRmllbGRDb25maWcsIHZhbGlkYXRvcjogUGFyYW1WYWxpZGF0b3IpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCB2YWwgPSBmaWVsZC52YWxpZGF0b3JzPy5bdmFsaWRhdG9yXTtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgPyB2YWwgOiBudWxsO1xuICB9XG5cbiAgaGFzRmxhZ1ZhbGlkYXRvcihmaWVsZDogTmVzdGVkRmllbGRDb25maWcsIHZhbGlkYXRvcjogRmxhZ1ZhbGlkYXRvcik6IGJvb2xlYW4ge1xuICAgIGlmICh2YWxpZGF0b3IgPT09ICdyZXF1aXJlZCcpIHJldHVybiAhIWZpZWxkLnZhbGlkYXRvcnM/LnJlcXVpcmVkO1xuICAgIGlmICh2YWxpZGF0b3IgPT09ICdlbWFpbCcpIHtcbiAgICAgIC8vIFRoaXMgdXNlZCB0byByZXBvcnQgKmFueSogcGF0dGVybiBhcyBlbWFpbCwgc28gd3JpdGluZyBhIGN1c3RvbSByZWdleCBzaWxlbnRseVxuICAgICAgLy8gdGlja2VkIHRoZSBib3guIFRoZSBsZWdhY3kgZW5jb2RpbmcgaXMgc3RpbGwgcmVjb2duaXNlZCBzbyBhIGNvbmZpZyBhdXRob3JlZCBieSB0aGVcbiAgICAgIC8vIG9sZCBidWlsZGVyIGtlZXBzIHNob3dpbmcgRW1haWwgYXMgdGlja2VkLlxuICAgICAgcmV0dXJuICEhZmllbGQudmFsaWRhdG9ycz8uZW1haWwgfHwgZmllbGQudmFsaWRhdG9ycz8ucGF0dGVybiA9PT0gTEVHQUNZX0VNQUlMX1BBVFRFUk47XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBPcHRpb25zIChkcm9wZG93biAvIG11bHRpU2VsZWN0IC8gcmFkaW8pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBXaGVyZSBhIGNob2ljZSBmaWVsZCdzIG9wdGlvbnMgY29tZSBmcm9tLlxuICAgKlxuICAgKiBgZW50aXR5YCBpcyBhYnNlbnQgb24gcHVycG9zZTogaW4gdGhpcyBtb2RlbCBhbiBlbnRpdHkgcmVmZXJlbmNlIGlzIGEgZmllbGQgKnR5cGUqXG4gICAqIChgZW50aXR5LXJlZmApLCBub3QgYSBkYXRhIHNvdXJjZSBhIGRyb3Bkb3duIGNhbiBzd2l0Y2ggdG8sIHNvIG9mZmVyaW5nIGl0IGhlcmUgd291bGQgbWVhblxuICAgKiBtdXRhdGluZyB0aGUgZmllbGQncyB0eXBlIOKAlCBhbmQgcmVidWlsZGluZyBpdHMgY29udHJvbCDigJQgZnJvbSBhIHNvdXJjZSBwaWNrZXIuIFRoZVxuICAgKiBleGNsdXNpb24gdGhhdCBtYXR0ZXJzIHdpdGhpbiBhIGNob2ljZSBmaWVsZCBpcyBpbmxpbmUgYG9wdGlvbnNgIHZzIGBsaXN0TmFtZWAuXG4gICAqL1xuICBmaWVsZERhdGFTb3VyY2UoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnIHwgdW5kZWZpbmVkKTogJ25vbmUnIHwgJ21hbnVhbCcgfCAnbG9va3VwJyB7XG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuICdub25lJztcbiAgICAvLyBQcmVzZW5jZSwgbm90IGVtcHRpbmVzczogYSBzb3VyY2UgdGhlIGF1dGhvciBoYXMgcGlja2VkIGJ1dCBub3QgZmlsbGVkIGluIHlldCDigJQgbm9cbiAgICAvLyBvcHRpb25zIGF1dGhvcmVkLCBubyBsaXN0IG5hbWUgdHlwZWQg4oCUIG11c3Qgc3RpbGwgcmVhZCBhcyB0aGF0IHNvdXJjZSwgb3IgdGhlIGVkaXRvclxuICAgIC8vIGZvciBpdCBkaXNhcHBlYXJzIHRoZSBtb21lbnQgdGhleSBzZWxlY3QgaXQuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQub3B0aW9ucykpIHJldHVybiAnbWFudWFsJztcbiAgICBpZiAodHlwZW9mIGZpZWxkLmxpc3ROYW1lID09PSAnc3RyaW5nJykgcmV0dXJuICdsb29rdXAnO1xuICAgIHJldHVybiAnbm9uZSc7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoIGEgY2hvaWNlIGZpZWxkJ3MgZGF0YSBzb3VyY2UsIGNsZWFyaW5nIHRoZSBvbmUgaXQgaXMgbGVhdmluZy5cbiAgICpcbiAgICogVGhlIHJlZmVyZW5jZSBtYWtlcyB0aGVzZSBtdXR1YWxseSBleGNsdXNpdmUgKGRvYyDCpzQuNCkgYW5kIGl0IGhhcyB0byBzdGF5IHRoYXQgd2F5IGhlcmU6XG4gICAqIGBvcHRpb25zRm9yYCByZXNvbHZlcyBpbmxpbmUgb3B0aW9ucyBmaXJzdCwgc28gYSBmaWVsZCBsZWZ0IGhvbGRpbmcgYm90aCB3b3VsZCBzaWxlbnRseVxuICAgKiBpZ25vcmUgaXRzIGxpc3QuXG4gICAqL1xuICBzZXRGaWVsZERhdGFTb3VyY2UoZmllbGRJZDogc3RyaW5nLCBzb3VyY2U6ICdub25lJyB8ICdtYW51YWwnIHwgJ2xvb2t1cCcpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xuICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuICAgICAgaWYgKHNvdXJjZSA9PT0gJ21hbnVhbCcpIHtcbiAgICAgICAgZGVsZXRlIGZpZWxkLmxpc3ROYW1lO1xuICAgICAgICBmaWVsZC5vcHRpb25zID0gZmllbGQub3B0aW9ucz8ubGVuZ3RoID8gZmllbGQub3B0aW9ucyA6IFtdO1xuICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPT09ICdsb29rdXAnKSB7XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5vcHRpb25zO1xuICAgICAgICBmaWVsZC5saXN0TmFtZSA9IGZpZWxkLmxpc3ROYW1lID8/ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGZpZWxkLm9wdGlvbnM7XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5saXN0TmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIG5hbWVkIGxpc3QgYSBjaG9pY2UgZmllbGQgcmVhZHMgaXRzIG9wdGlvbnMgZnJvbS4gKi9cbiAgc2V0TGlzdE5hbWUoZmllbGRJZDogc3RyaW5nLCBsaXN0TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcbiAgICAgIGlmICghZmllbGQpIHJldHVybjtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaXN0TmFtZS50cmltKCk7XG4gICAgICBpZiAodHJpbW1lZCkge1xuICAgICAgICBmaWVsZC5saXN0TmFtZSA9IHRyaW1tZWQ7XG4gICAgICAgIC8vIEJlbHQgYW5kIGJyYWNlczogaW5saW5lIG9wdGlvbnMgd291bGQgd2luIG92ZXIgdGhlIGxpc3QgYXQgcmVuZGVyIHRpbWUuXG4gICAgICAgIGRlbGV0ZSBmaWVsZC5vcHRpb25zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGQubGlzdE5hbWUgPSAnJztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBMaW5rIGEgZmllbGQgdG8gYSBmaWVsZCBkZWZpbmVkIGluIGFub3RoZXIgZW50aXR5IGNvbmZpZ3VyYXRpb24gKFBoYXNlIDgpLiAqL1xuICBsaW5rUmVmZXJlbmNlZEZpZWxkKGZpZWxkSWQ6IHN0cmluZywgc291cmNlRW50aXR5S2V5OiBzdHJpbmcsIHNvdXJjZUZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maW5kRmllbGRJblRhYnMoZHJhZnQudGFicywgZmllbGRJZCk7XG4gICAgICBpZiAoIWZpZWxkKSByZXR1cm47XG4gICAgICBmaWVsZC5pc1JlZmVyZW5jZWQgPSB0cnVlO1xuICAgICAgZmllbGQucmVmZXJlbmNlZEVudGl0eUtleSA9IHNvdXJjZUVudGl0eUtleTtcbiAgICAgIGZpZWxkLnJlZmVyZW5jZWRGaWVsZElkID0gc291cmNlRmllbGQuaWQ7XG4gICAgICBmaWVsZC5yZWZlcmVuY2VkU25hcHNob3QgPSBjcmVhdGVGaWVsZFNuYXBzaG90KHNvdXJjZUZpZWxkKTtcbiAgICAgIGZpZWxkLmhhc0RyaWZ0ID0gZmFsc2U7XG4gICAgICAvLyBDb3B5IGxhYmVsLCB0eXBlLCB2YWxpZGF0b3JzLCBvcHRpb25zIGZyb20gc291cmNlXG4gICAgICBpZiAoc291cmNlRmllbGQubGFiZWwpIGZpZWxkLmxhYmVsID0gY2xvbmUoc291cmNlRmllbGQubGFiZWwpO1xuICAgICAgaWYgKHNvdXJjZUZpZWxkLnR5cGUpIGZpZWxkLnR5cGUgPSBzb3VyY2VGaWVsZC50eXBlO1xuICAgICAgaWYgKHNvdXJjZUZpZWxkLnZhbGlkYXRvcnMpIGZpZWxkLnZhbGlkYXRvcnMgPSBjbG9uZShzb3VyY2VGaWVsZC52YWxpZGF0b3JzKTtcbiAgICAgIGlmIChzb3VyY2VGaWVsZC5vcHRpb25zKSBmaWVsZC5vcHRpb25zID0gY2xvbmUoc291cmNlRmllbGQub3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogVW5saW5rIGEgcmVmZXJlbmNlZCBmaWVsZCBiYWNrIHRvIGFuIGluZGVwZW5kZW50IGZpZWxkLiAqL1xuICB1bmxpbmtSZWZlcmVuY2VkRmllbGQoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcbiAgICAgIGlmICghZmllbGQpIHJldHVybjtcbiAgICAgIGRlbGV0ZSBmaWVsZC5pc1JlZmVyZW5jZWQ7XG4gICAgICBkZWxldGUgZmllbGQucmVmZXJlbmNlZEVudGl0eUtleTtcbiAgICAgIGRlbGV0ZSBmaWVsZC5yZWZlcmVuY2VkRmllbGRJZDtcbiAgICAgIGRlbGV0ZSBmaWVsZC5yZWZlcmVuY2VkU25hcHNob3Q7XG4gICAgICBkZWxldGUgZmllbGQuaGFzRHJpZnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU3luYyBhIGRyaWZ0ZWQgcmVmZXJlbmNlZCBmaWVsZCB3aXRoIHRoZSB1cGRhdGVkIHNvdXJjZSBmaWVsZCBkZWZpbml0aW9uLiAqL1xuICBzeW5jUmVmZXJlbmNlZEZpZWxkKGZpZWxkSWQ6IHN0cmluZywgY3VycmVudFNvdXJjZUZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maW5kRmllbGRJblRhYnMoZHJhZnQudGFicywgZmllbGRJZCk7XG4gICAgICBpZiAoIWZpZWxkIHx8ICFmaWVsZC5pc1JlZmVyZW5jZWQpIHJldHVybjtcbiAgICAgIGZpZWxkLnJlZmVyZW5jZWRTbmFwc2hvdCA9IGNyZWF0ZUZpZWxkU25hcHNob3QoY3VycmVudFNvdXJjZUZpZWxkKTtcbiAgICAgIGZpZWxkLmhhc0RyaWZ0ID0gZmFsc2U7XG4gICAgICBpZiAoY3VycmVudFNvdXJjZUZpZWxkLmxhYmVsKSBmaWVsZC5sYWJlbCA9IGNsb25lKGN1cnJlbnRTb3VyY2VGaWVsZC5sYWJlbCk7XG4gICAgICBpZiAoY3VycmVudFNvdXJjZUZpZWxkLnR5cGUpIGZpZWxkLnR5cGUgPSBjdXJyZW50U291cmNlRmllbGQudHlwZTtcbiAgICAgIGlmIChjdXJyZW50U291cmNlRmllbGQudmFsaWRhdG9ycykgZmllbGQudmFsaWRhdG9ycyA9IGNsb25lKGN1cnJlbnRTb3VyY2VGaWVsZC52YWxpZGF0b3JzKTtcbiAgICAgIGlmIChjdXJyZW50U291cmNlRmllbGQub3B0aW9ucykgZmllbGQub3B0aW9ucyA9IGNsb25lKGN1cnJlbnRTb3VyY2VGaWVsZC5vcHRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTY2FuIGFsbCByZWZlcmVuY2VkIGZpZWxkcyBpbiB0aGUgY29uZmlnIGFuZCB1cGRhdGUgdGhlaXIgaGFzRHJpZnQgc3RhdGUgYWdhaW5zdCBjdXJyZW50IHNvdXJjZSBjb25maWdzLiAqL1xuICBjaGVja0RyaWZ0KHNvdXJjZUNvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIEVudGl0eUZvcm1Db25maWc+KTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xuICAgICAgY29uc3Qgc2NhbkZpZWxkcyA9IChmaWVsZHM6IE5lc3RlZEZpZWxkQ29uZmlnW10pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIGZpZWxkcykge1xuICAgICAgICAgIGlmIChmLmlzUmVmZXJlbmNlZCAmJiBmLnJlZmVyZW5jZWRFbnRpdHlLZXkgJiYgZi5yZWZlcmVuY2VkRmllbGRJZCkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ29uZmlnID0gc291cmNlQ29uZmlnc1tmLnJlZmVyZW5jZWRFbnRpdHlLZXldO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlRmllbGQgPSBzb3VyY2VDb25maWdcbiAgICAgICAgICAgICAgPyB0aGlzLmZpbmRGaWVsZEluVGFicyhzb3VyY2VDb25maWcudGFicyA/PyBbXSwgZi5yZWZlcmVuY2VkRmllbGRJZClcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBmLmhhc0RyaWZ0ID0gY29tcHV0ZUZpZWxkRHJpZnQoZiwgc291cmNlRmllbGQgPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGYuY2hpbGRyZW4/Lmxlbmd0aCkgc2NhbkZpZWxkcyhmLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yIChjb25zdCB0YWIgb2YgZHJhZnQudGFicyA/PyBbXSkge1xuICAgICAgICBpZiAodGFiLmZpZWxkcz8ubGVuZ3RoKSBzY2FuRmllbGRzKHRhYi5maWVsZHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWRkT3B0aW9uKGZpZWxkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maW5kRmllbGRJblRhYnMoZHJhZnQudGFicywgZmllbGRJZCk7XG4gICAgICBpZiAoIWZpZWxkKSByZXR1cm47XG4gICAgICBjb25zdCBvcHRpb25zID0gZmllbGQub3B0aW9ucyA/PyBbXTtcbiAgICAgIGNvbnN0IG4gPSBvcHRpb25zLmxlbmd0aCArIDE7XG4gICAgICBjb25zdCBsYW5nID0gZHJhZnQuZGVmYXVsdExhbmd1YWdlID8/ICdlbic7XG4gICAgICBvcHRpb25zLnB1c2goeyBbbGFuZ106IGBPcHRpb24gJHtufWAgfSk7XG4gICAgICBmaWVsZC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgIC8vIEF1dGhvcmluZyBhbiBpbmxpbmUgb3B0aW9uIG1ha2VzIHRoaXMgYSBtYW51YWwgZmllbGQg4oCUIHNlZSBgc2V0RmllbGREYXRhU291cmNlYC5cbiAgICAgIGRlbGV0ZSBmaWVsZC5saXN0TmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBNZXJnZSBsYW5ndWFnZSBrZXlzIGludG8gYW4gb3B0aW9uLiBgc2V0T3B0aW9uTGFiZWxgIGlzIHRoZSB1c3VhbCBzaW5nbGUtbGFuZ3VhZ2UgcGF0aC4gKi9cbiAgdXBkYXRlT3B0aW9uKGZpZWxkSWQ6IHN0cmluZywgaW5kZXg6IG51bWJlciwgcGF0Y2g6IERyb3Bkb3duT3B0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IGZpZWxkPy5vcHRpb25zPy5baW5kZXhdO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcbiAgICAgIGZpZWxkLm9wdGlvbnMhW2luZGV4XSA9IHsgLi4ub3B0aW9uLCAuLi5wYXRjaCB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBvcHRpb24ncyB0ZXh0IGZvciBvbmUgbGFuZ3VhZ2UuXG4gICAqXG4gICAqIEFuIG9wdGlvbiBpcyBhIGxhbmd1YWdlLWtleWVkIG9iamVjdCBhbmQgdGhlIGRpc3BsYXllZCB0ZXh0ICoqaXMqKiB0aGUgc3RvcmVkIHZhbHVlLFxuICAgKiBzbyB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBlZGl0IG9uZSDigJQgdGhlcmUgaXMgbm8gc2VwYXJhdGUgdmFsdWUgdG8gc2V0LlxuICAgKi9cbiAgc2V0T3B0aW9uTGFiZWwoZmllbGRJZDogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBsYW5ndWFnZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQWxzbyBrZXlzdHJva2UtYm91bmQuXG4gICAgdGhpcy5tdXRhdGVGaWVsZChmaWVsZElkLCBmaWVsZCA9PiB7XG4gICAgICBjb25zdCBvcHRpb24gPSBmaWVsZC5vcHRpb25zPy5baW5kZXhdO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybiBmaWVsZDtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBmaWVsZC5vcHRpb25zIS5tYXAoKG8sIGkpID0+IChpID09PSBpbmRleCA/IHsgLi4ubywgW2xhbmd1YWdlXTogdmFsdWUgfSA6IG8pKTtcbiAgICAgIHJldHVybiB7IC4uLmZpZWxkLCBvcHRpb25zIH07XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVPcHRpb24oZmllbGRJZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcbiAgICAgIGlmICghZmllbGQ/Lm9wdGlvbnMpIHJldHVybjtcbiAgICAgIGZpZWxkLm9wdGlvbnMgPSBmaWVsZC5vcHRpb25zLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEVudGl0eSByZWZlcmVuY2UgLyBjYXNjYWRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBNZXJnZSBhIHBhdGNoIGludG8gYSBmaWVsZCdzIGBlbnRpdHlSZWZlcmVuY2VgIGJsb2NrLCBrZWVwaW5nIGl0IGVuYWJsZWQuICovXG4gIHVwZGF0ZUVudGl0eVJlZmVyZW5jZShmaWVsZElkOiBzdHJpbmcsIHBhdGNoOiBQYXJ0aWFsPEVudGl0eVJlZmVyZW5jZUNvbmZpZz4pOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xuICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuICAgICAgY29uc3QgbmV4dDogRW50aXR5UmVmZXJlbmNlQ29uZmlnID0ge1xuICAgICAgICAuLi4oZmllbGQuZW50aXR5UmVmZXJlbmNlID8/IHsgZW5hYmxlZDogdHJ1ZSB9KSxcbiAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgLy8gRHJvcCBrZXlzIGV4cGxpY2l0bHkgY2xlYXJlZCB0byBgdW5kZWZpbmVkYCBzbyBleHBvcnRlZCBjb25maWdzIHN0YXkgY2xlYW4uXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXRjaCkgYXMgKGtleW9mIEVudGl0eVJlZmVyZW5jZUNvbmZpZylbXSkge1xuICAgICAgICBpZiAocGF0Y2hba2V5XSA9PT0gdW5kZWZpbmVkKSBkZWxldGUgbmV4dFtrZXldO1xuICAgICAgfVxuICAgICAgZmllbGQuZW50aXR5UmVmZXJlbmNlID0gbmV4dDtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBhdXRvUGF0Y2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkQXV0b1BhdGNoTWFwcGluZyhmaWVsZElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xuICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuICAgICAgY29uc3QgdGFyZ2V0VGFiID0gZmllbGQuYXV0b1BhdGNoPy50YXJnZXRUYWIgPz8gZHJhZnQudGFic1swXT8uaWQgPz8gJyc7XG4gICAgICBjb25zdCBtYXBwaW5ncyA9IFsuLi4oZmllbGQuYXV0b1BhdGNoPy5tYXBwaW5ncyA/PyBbXSksIHsgc291cmNlOiAnJywgdGFyZ2V0OiAnJyB9XTtcbiAgICAgIGZpZWxkLmF1dG9QYXRjaCA9IHsgdGFyZ2V0VGFiLCBtYXBwaW5ncyB9O1xuICAgIH0pO1xuICB9XG5cbiAgc2V0QXV0b1BhdGNoVGFyZ2V0VGFiKGZpZWxkSWQ6IHN0cmluZywgdGFyZ2V0VGFiOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xuICAgICAgaWYgKCFmaWVsZD8uYXV0b1BhdGNoKSByZXR1cm47XG4gICAgICBmaWVsZC5hdXRvUGF0Y2ggPSB7IC4uLmZpZWxkLmF1dG9QYXRjaCwgdGFyZ2V0VGFiIH07XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVBdXRvUGF0Y2hNYXBwaW5nKGZpZWxkSWQ6IHN0cmluZywgaW5kZXg6IG51bWJlciwgcGF0Y2g6IFBhcnRpYWw8QXV0b1BhdGNoTWFwcGluZz4pOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xuICAgICAgaWYgKCFmaWVsZD8uYXV0b1BhdGNoPy5tYXBwaW5ncz8uW2luZGV4XSkgcmV0dXJuO1xuICAgICAgZmllbGQuYXV0b1BhdGNoID0ge1xuICAgICAgICAuLi5maWVsZC5hdXRvUGF0Y2gsXG4gICAgICAgIG1hcHBpbmdzOiBmaWVsZC5hdXRvUGF0Y2gubWFwcGluZ3MubWFwKChtLCBpKSA9PiAoaSA9PT0gaW5kZXggPyB7IC4uLm0sIC4uLnBhdGNoIH0gOiBtKSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlbW92aW5nIHRoZSBsYXN0IG1hcHBpbmcgZHJvcHMgYGF1dG9QYXRjaGAgZW50aXJlbHkg4oCUIG5vIGVtcHR5IGNvbmZpZyBpbiB0aGUgZXhwb3J0LiAqL1xuICByZW1vdmVBdXRvUGF0Y2hNYXBwaW5nKGZpZWxkSWQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maW5kRmllbGRJblRhYnMoZHJhZnQudGFicywgZmllbGRJZCk7XG4gICAgICBpZiAoIWZpZWxkPy5hdXRvUGF0Y2gpIHJldHVybjtcbiAgICAgIGNvbnN0IG1hcHBpbmdzID0gZmllbGQuYXV0b1BhdGNoLm1hcHBpbmdzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgICAgaWYgKG1hcHBpbmdzLmxlbmd0aCA9PT0gMCkgZGVsZXRlIGZpZWxkLmF1dG9QYXRjaDtcbiAgICAgIGVsc2UgZmllbGQuYXV0b1BhdGNoID0geyAuLi5maWVsZC5hdXRvUGF0Y2gsIG1hcHBpbmdzIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIDilIAgcGF0Y2hPblRydWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkUGF0Y2hPblRydWVNYXBwaW5nKGZpZWxkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maW5kRmllbGRJblRhYnMoZHJhZnQudGFicywgZmllbGRJZCk7XG4gICAgICBpZiAoIWZpZWxkKSByZXR1cm47XG4gICAgICBmaWVsZC5wYXRjaE9uVHJ1ZSA9IFsuLi4oZmllbGQucGF0Y2hPblRydWUgPz8gW10pLCB7IGZyb206ICcnLCB0bzogJycgfV07XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVQYXRjaE9uVHJ1ZU1hcHBpbmcoZmllbGRJZDogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBwYXRjaDogUGFydGlhbDxQYXRjaE9uVHJ1ZU1hcHBpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZEluVGFicyhkcmFmdC50YWJzLCBmaWVsZElkKTtcbiAgICAgIGlmICghZmllbGQ/LnBhdGNoT25UcnVlPy5baW5kZXhdKSByZXR1cm47XG4gICAgICBmaWVsZC5wYXRjaE9uVHJ1ZSA9IGZpZWxkLnBhdGNoT25UcnVlLm1hcCgobSwgaSkgPT4gKGkgPT09IGluZGV4ID8geyAuLi5tLCAuLi5wYXRjaCB9IDogbSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlUGF0Y2hPblRydWVNYXBwaW5nKGZpZWxkSWQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maW5kRmllbGRJblRhYnMoZHJhZnQudGFicywgZmllbGRJZCk7XG4gICAgICBpZiAoIWZpZWxkPy5wYXRjaE9uVHJ1ZSkgcmV0dXJuO1xuICAgICAgY29uc3QgbWFwcGluZ3MgPSBmaWVsZC5wYXRjaE9uVHJ1ZS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgIGlmIChtYXBwaW5ncy5sZW5ndGggPT09IDApIGRlbGV0ZSBmaWVsZC5wYXRjaE9uVHJ1ZTtcbiAgICAgIGVsc2UgZmllbGQucGF0Y2hPblRydWUgPSBtYXBwaW5ncztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBzaG93V2hlbiAoc3RhdGljIGNvbmRpdGlvbmFsIHZpc2liaWxpdHkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZXBsYWNlIGEgZmllbGQncyBgc2hvd1doZW5gIG1hcDsgYW4gZW1wdHkgbWFwIHJlbW92ZXMgdGhlIGNvbmRpdGlvbi4gKi9cbiAgc2V0U2hvd1doZW4oZmllbGRJZDogc3RyaW5nLCBzaG93V2hlbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkSW5UYWJzKGRyYWZ0LnRhYnMsIGZpZWxkSWQpO1xuICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuICAgICAgaWYgKCFzaG93V2hlbiB8fCBPYmplY3Qua2V5cyhzaG93V2hlbikubGVuZ3RoID09PSAwKSBkZWxldGUgZmllbGQuc2hvd1doZW47XG4gICAgICBlbHNlIGZpZWxkLnNob3dXaGVuID0gc2hvd1doZW47XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIDilIAgUnVsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJ1bGVzIGZvciB0aGUgZmllbGQgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSBpbnNwZWN0b3IuICovXG4gIHJlYWRvbmx5IHJ1bGVzRm9yU2VsZWN0ZWRGaWVsZCA9IGNvbXB1dGVkPEZvcm1SdWxlW10+KCgpID0+IHtcbiAgICBjb25zdCBpZCA9IHRoaXMuX3NlbGVjdGVkRmllbGRJZCgpO1xuICAgIGlmICghaWQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5fcnVsZXMoKS5maWx0ZXIociA9PiByLmZpZWxkSWQgPT09IGlkIHx8IHIudGFyZ2V0cy5zb21lKHQgPT4gdC5pZCA9PT0gaWQpKTtcbiAgfSk7XG5cbiAgbG9hZFJ1bGVzKHJ1bGVzOiBGb3JtUnVsZVtdKTogdm9pZCB7XG4gICAgdGhpcy5fcnVsZXMuc2V0KGNsb25lKHJ1bGVzKSk7XG4gIH1cblxuICBhZGRSdWxlKHJ1bGU6IEZvcm1SdWxlKTogc3RyaW5nIHtcbiAgICBjb25zdCBpZCA9IHJ1bGUuaWQ/LnRyaW0oKSB8fCB0aGlzLnVuaXF1ZUlkKCdydWxlJywgbmV3IFNldCh0aGlzLl9ydWxlcygpLm1hcChyID0+IHIuaWQgPz8gJycpKSk7XG4gICAgdGhpcy5fcnVsZXMudXBkYXRlKHJ1bGVzID0+IFsuLi5ydWxlcywgeyAuLi5jbG9uZShydWxlKSwgaWQgfV0pO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIHVwZGF0ZVJ1bGUoaWQ6IHN0cmluZywgcGF0Y2g6IFBhcnRpYWw8Rm9ybVJ1bGU+KTogdm9pZCB7XG4gICAgdGhpcy5fcnVsZXMudXBkYXRlKHJ1bGVzID0+IHJ1bGVzLm1hcChyID0+IChyLmlkID09PSBpZCA/IHsgLi4uciwgLi4uY2xvbmUocGF0Y2gpLCBpZCB9IDogcikpKTtcbiAgfVxuXG4gIHJlbW92ZVJ1bGUoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3J1bGVzLnVwZGF0ZShydWxlcyA9PiBydWxlcy5maWx0ZXIociA9PiByLmlkICE9PSBpZCkpO1xuICB9XG5cbiAgdG9nZ2xlUnVsZShpZDogc3RyaW5nLCBlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVSdWxlKGlkLCB7IGVuYWJsZWQgfSk7XG4gIH1cblxuICAvKiogTW92ZSBhIHJ1bGUgaW4gcHJpb3JpdHkgb3JkZXIuIFByaW9yaXRpZXMgYXJlIHJlbnVtYmVyZWQgMS4ubiBzbyB0aGV5IHN0YXkgY29udGlndW91cy4gKi9cbiAgbW92ZVJ1bGUoaWQ6IHN0cmluZywgZGlyZWN0aW9uOiAtMSB8IDEpOiB2b2lkIHtcbiAgICB0aGlzLl9ydWxlcy51cGRhdGUocnVsZXMgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IFsuLi5ydWxlc107XG4gICAgICBjb25zdCBmcm9tID0gbmV4dC5maW5kSW5kZXgociA9PiByLmlkID09PSBpZCk7XG4gICAgICBpZiAoZnJvbSA9PT0gLTEpIHJldHVybiBydWxlcztcbiAgICAgIGNvbnN0IHRvID0gZnJvbSArIGRpcmVjdGlvbjtcbiAgICAgIGlmICh0byA8IDAgfHwgdG8gPj0gbmV4dC5sZW5ndGgpIHJldHVybiBydWxlcztcbiAgICAgIGNvbnN0IFtpdGVtXSA9IG5leHQuc3BsaWNlKGZyb20sIDEpO1xuICAgICAgbmV4dC5zcGxpY2UodG8sIDAsIGl0ZW0pO1xuICAgICAgcmV0dXJuIG5leHQubWFwKChyLCBpKSA9PiAoeyAuLi5yLCBwcmlvcml0eTogaSArIDEgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0UnVsZXMoKTogRm9ybVJ1bGVbXSB7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMuX3J1bGVzKCkpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFRhYnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkVGFiKCk6IHN0cmluZyB7XG4gICAgLy8gTXVzdCBiZSB1bmlxdWUgYWNyb3NzIHRoZSB3aG9sZSB0cmVlLCBub3QganVzdCB0aGUgdG9wIGxldmVsOiBhIHRhYiBpZCBpcyB0aGUgcmVjb3JkXG4gICAgLy8gc3RvcmFnZSBwYXRoLCBzbyBhIG5ldyB0b3AtbGV2ZWwgdGFiIGNvbGxpZGluZyB3aXRoIGFuIGV4aXN0aW5nIHN1Yi10YWIgd291bGQgbWFrZSB0d29cbiAgICAvLyB0YWJzIHdyaXRlIHRvIHRoZSBzYW1lIGtleSBhbmQgYnJlYWsgZmluZFRhYi9nZXRUYWJQYXRoLlxuICAgIGNvbnN0IGlkID0gdGhpcy51bmlxdWVJZCgndGFiJywgbmV3IFNldCh0aGlzLmFsbFRhYklkcygpKSk7XG4gICAgdGhpcy5tdXRhdGUoZHJhZnQgPT4ge1xuICAgICAgY29uc3QgdGFicyA9IGRyYWZ0LnRhYnMgPz8gKGRyYWZ0LnRhYnMgPSBbXSk7XG4gICAgICBjb25zdCBsYW5nID0gZHJhZnQuZGVmYXVsdExhbmd1YWdlID8/ICdlbic7XG4gICAgICB0YWJzLnB1c2goeyBpZCwgbGFiZWw6IHsgW2xhbmddOiBodW1hbml6ZUlkKGlkKSB9LCBmaWVsZHM6IFtdIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIC8qKiBFdmVyeSB0YWIgaWQgaW4gdGhlIHRyZWUsIGF0IGFueSBkZXB0aC4gVGFiIGlkcyBtdXN0IGJlIGdsb2JhbGx5IHVuaXF1ZSDigJQgdGhleSBhcmUgcGF0aHMuICovXG4gIHByaXZhdGUgYWxsVGFiSWRzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBpZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY29sbGVjdCA9ICh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB0IG9mIHRhYnMgPz8gW10pIHtcbiAgICAgICAgaWRzLnB1c2godC5pZCk7XG4gICAgICAgIGNvbGxlY3QodC5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb2xsZWN0KHRoaXMuX2NvbmZpZygpLnRhYnMpO1xuICAgIHJldHVybiBpZHM7XG4gIH1cblxuICBhZGRTdWJUYWIocGFyZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnVuaXF1ZUlkKCd0YWInLCBuZXcgU2V0KHRoaXMuYWxsVGFiSWRzKCkpKTtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBmaW5kVGFiKGRyYWZ0LnRhYnMsIHBhcmVudElkKTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcGFyZW50LmNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuID8/IFtdO1xuICAgICAgICBjb25zdCBsYW5nID0gZHJhZnQuZGVmYXVsdExhbmd1YWdlID8/ICdlbic7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHsgaWQsIGxhYmVsOiB7IFtsYW5nXTogaHVtYW5pemVJZChpZCkgfSwgZmllbGRzOiBbXSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICBzZXRQcmltYXJ5VGFiKHRhYklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCBtYXJrUHJpbWFyeSA9ICh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGFicykge1xuICAgICAgICAgIHQuaXNQcmltYXJ5VGFiID0gdC5pZCA9PT0gdGFiSWQ7XG4gICAgICAgICAgaWYgKHQuY2hpbGRyZW4pIG1hcmtQcmltYXJ5KHQuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbWFya1ByaW1hcnkoZHJhZnQudGFicyA/PyBbXSk7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVUYWIoaWQ6IHN0cmluZywgcGF0Y2g6IFBhcnRpYWw8TmVzdGVkVGFiQ29uZmlnPik6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcbiAgICAgIGNvbnN0IHRhYiA9IGZpbmRUYWIoZHJhZnQudGFicywgaWQpO1xuICAgICAgaWYgKHRhYikgT2JqZWN0LmFzc2lnbih0YWIsIHBhdGNoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFRhYkxhYmVsKGlkOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCB0YWIgPSBmaW5kVGFiKGRyYWZ0LnRhYnMsIGlkKTtcbiAgICAgIGlmICh0YWIpIHRhYi5sYWJlbCA9IHsgLi4udGFiLmxhYmVsLCBbbGFuZ3VhZ2VdOiB2YWx1ZSB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlVGFiKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZShkcmFmdCA9PiB7XG4gICAgICBjb25zdCByZW1vdmVSZWN1cnNpdmUgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10pOiBOZXN0ZWRUYWJDb25maWdbXSA9PiB7XG4gICAgICAgIHJldHVybiB0YWJzXG4gICAgICAgICAgLmZpbHRlcih0ID0+IHQuaWQgIT09IGlkKVxuICAgICAgICAgIC5tYXAodCA9PiAoe1xuICAgICAgICAgICAgLi4udCxcbiAgICAgICAgICAgIGNoaWxkcmVuOiB0LmNoaWxkcmVuID8gcmVtb3ZlUmVjdXJzaXZlKHQuY2hpbGRyZW4pIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0pKTtcbiAgICAgIH07XG4gICAgICBkcmFmdC50YWJzID0gcmVtb3ZlUmVjdXJzaXZlKGRyYWZ0LnRhYnMgPz8gW10pO1xuICAgIH0pO1xuICB9XG5cbiAgbW92ZVRhYihpZDogc3RyaW5nLCBkaXJlY3Rpb246IC0xIHwgMSk6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlKGRyYWZ0ID0+IHtcbiAgICAgIGNvbnN0IHRhYnMgPSBkcmFmdC50YWJzID8/IFtdO1xuICAgICAgY29uc3QgZnJvbSA9IHRhYnMuZmluZEluZGV4KHQgPT4gdC5pZCA9PT0gaWQpO1xuICAgICAgaWYgKGZyb20gPT09IC0xKSByZXR1cm47XG4gICAgICBjb25zdCB0byA9IGZyb20gKyBkaXJlY3Rpb247XG4gICAgICBpZiAodG8gPCAwIHx8IHRvID49IHRhYnMubGVuZ3RoKSByZXR1cm47XG4gICAgICBjb25zdCBbaXRlbV0gPSB0YWJzLnNwbGljZShmcm9tLCAxKTtcbiAgICAgIHRhYnMuc3BsaWNlKHRvLCAwLCBpdGVtKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBFeHBvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZXhwb3J0Q29uZmlnKCk6IEVudGl0eUZvcm1Db25maWcge1xuICAgIHJldHVybiBjbG9uZSh0aGlzLl9jb25maWcoKSk7XG4gIH1cblxuICAvLyDilIDilIDilIAgSW50ZXJuYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgbXV0YXRlKGZuOiAoZHJhZnQ6IEVudGl0eUZvcm1Db25maWcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCBkcmFmdCA9IGNsb25lKHRoaXMuX2NvbmZpZygpKTtcbiAgICBkcmFmdC50YWJzID0gZHJhZnQudGFicyA/PyBbXTtcbiAgICBmbihkcmFmdCk7XG4gICAgdGhpcy5fY29uZmlnLnNldChkcmFmdCk7XG4gICAgdGhpcy5faXNEaXJ0eS5zZXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBvbmUgZmllbGQsIGNvcHlpbmcgb25seSB0aGUgb2JqZWN0cyBvbiB0aGUgcGF0aCB0byBpdC5cbiAgICpcbiAgICogYG11dGF0ZWAgZGVlcC1jbG9uZXMgdGhlIGVudGlyZSBjb25maWcsIHdoaWNoIGlzIHJpZ2h0IGZvciBhIHN0cnVjdHVyYWwgZWRpdCBidXQgd3JvbmdcbiAgICogZm9yIHRoZSB0d28gc2V0dGVycyBib3VuZCB0byBrZXlzdHJva2UgZXZlbnRzOiB0eXBpbmcgYSBsYWJlbCBhbGxvY2F0ZWQgYSBmdWxsIGNvcHkgb2ZcbiAgICogdGhlIGNvbmZpZyBwZXIgY2hhcmFjdGVyLiBIZXJlIGV2ZXJ5IHRhYiBhbmQgZmllbGQgb3V0c2lkZSB0aGUgdGFyZ2V0J3MgY2hhaW4gaXMgcmV1c2VkXG4gICAqIGJ5IHJlZmVyZW5jZSwgc28gdGhlIGNvc3QgaXMgcHJvcG9ydGlvbmFsIHRvIG5lc3RpbmcgZGVwdGggcmF0aGVyIHRoYW4gY29uZmlnIHNpemUg4oCUXG4gICAqIHdoaWxlIHRoZSBwYXJ0cyB0aGF0IGRpZCBjaGFuZ2UgYXJlIHN0aWxsIGZyZXNoIG9iamVjdHMsIHNvIGNoYW5nZSBkZXRlY3Rpb24gYW5kIHRoZVxuICAgKiBzaWduYWwgYm90aCBzZWUgYSBuZXcgaWRlbnRpdHkuXG4gICAqXG4gICAqIFJldHVybnMgd2l0aG91dCB0b3VjaGluZyBhbnl0aGluZyB3aGVuIHRoZSBmaWVsZCBpcyBub3QgZm91bmQuXG4gICAqL1xuICBwcml2YXRlIG11dGF0ZUZpZWxkKGlkOiBzdHJpbmcsIHVwZGF0ZTogKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZykgPT4gTmVzdGVkRmllbGRDb25maWcpOiB2b2lkIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHZpc2l0RmllbGRzID0gKGZpZWxkczogTmVzdGVkRmllbGRDb25maWdbXSB8IHVuZGVmaW5lZCk6IE5lc3RlZEZpZWxkQ29uZmlnW10gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgaWYgKCFmaWVsZHMpIHJldHVybiBmaWVsZHM7XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbmV4dCA9IGZpZWxkcy5tYXAoZmllbGQgPT4ge1xuICAgICAgICBpZiAoZmllbGQuaWQgPT09IGlkKSB7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiB1cGRhdGUoZmllbGQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdmlzaXRGaWVsZHMoZmllbGQuY2hpbGRyZW4pO1xuICAgICAgICBpZiAoY2hpbGRyZW4gIT09IGZpZWxkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uZmllbGQsIGNoaWxkcmVuIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2hhbmdlZCA/IG5leHQgOiBmaWVsZHM7XG4gICAgfTtcblxuICAgIGNvbnN0IHZpc2l0VGFicyA9ICh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSB8IHVuZGVmaW5lZCk6IE5lc3RlZFRhYkNvbmZpZ1tdIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGlmICghdGFicykgcmV0dXJuIHRhYnM7XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbmV4dCA9IHRhYnMubWFwKHRhYiA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHZpc2l0RmllbGRzKHRhYi5maWVsZHMpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHZpc2l0VGFicyh0YWIuY2hpbGRyZW4pO1xuICAgICAgICBpZiAoZmllbGRzICE9PSB0YWIuZmllbGRzIHx8IGNoaWxkcmVuICE9PSB0YWIuY2hpbGRyZW4pIHtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4geyAuLi50YWIsIGZpZWxkcywgY2hpbGRyZW4gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFiO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2hhbmdlZCA/IG5leHQgOiB0YWJzO1xuICAgIH07XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fY29uZmlnKCk7XG4gICAgY29uc3QgdGFicyA9IHZpc2l0VGFicyhjdXJyZW50LnRhYnMpO1xuICAgIC8vIGBmb3VuZGAgaW1wbGllcyBjdXJyZW50LnRhYnMgZXhpc3RlZCBhbmQgd2FzIHdhbGtlZCwgc28gdGFicyBpcyBkZWZpbmVkIGhlcmUg4oCUIHRoZVxuICAgIC8vIGZhbGxiYWNrIGJlbG93IGlzIGZvciB0aGUgdHlwZSBjaGVja2VyLCBub3QgYSByZWFjaGFibGUgc3RhdGUuXG4gICAgaWYgKCFmb3VuZCB8fCB0YWJzID09PSBjdXJyZW50LnRhYnMpIHJldHVybjtcblxuICAgIHRoaXMuX2NvbmZpZy5zZXQoeyAuLi5jdXJyZW50LCB0YWJzOiB0YWJzID8/IFtdIH0pO1xuICAgIHRoaXMuX2lzRGlydHkuc2V0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmlxdWVJZChwcmVmaXg6IHN0cmluZywgdGFrZW46IFNldDxzdHJpbmc+KTogc3RyaW5nIHtcbiAgICBsZXQgbiA9IDE7XG4gICAgbGV0IGNhbmRpZGF0ZSA9IGAke3ByZWZpeH1fJHtufWA7XG4gICAgd2hpbGUgKHRha2VuLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICBuICs9IDE7XG4gICAgICBjYW5kaWRhdGUgPSBgJHtwcmVmaXh9XyR7bn1gO1xuICAgIH1cbiAgICByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZShjb25maWc6IEVudGl0eUZvcm1Db25maWcpOiBCdWlsZGVyUHJvYmxlbVtdIHtcbiAgICBjb25zdCBwcm9ibGVtczogQnVpbGRlclByb2JsZW1bXSA9IFtdO1xuXG4gICAgaWYgKCFjb25maWcuZW50aXR5IHx8ICFjb25maWcuZW50aXR5LnRyaW0oKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7IGxldmVsOiAnZXJyb3InLCBtZXNzYWdlOiAnRW50aXR5IG5hbWUgaXMgcmVxdWlyZWQuJyB9KTtcbiAgICB9IGVsc2UgaWYgKCFJRF9QQVRURVJOLnRlc3QoY29uZmlnLmVudGl0eSkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAnRW50aXR5IG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIG9yIHVuZGVyc2NvcmUgYW5kIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBkaWdpdHMsIGFuZCB1bmRlcnNjb3Jlcy4nLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsRmllbGRzID0gdGhpcy5nZXRBbGxGaWVsZHMoY29uZmlnLnRhYnMpO1xuICAgIGlmIChhbGxGaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHsgbGV2ZWw6ICd3YXJuaW5nJywgbWVzc2FnZTogJ1RoaXMgZW50aXR5IGhhcyBubyBmaWVsZHMgeWV0LicgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBhbGxGaWVsZHMpIHtcbiAgICAgIGlmICghZmllbGQuaWQgfHwgIUlEX1BBVFRFUk4udGVzdChmaWVsZC5pZCkpIHtcbiAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgbWVzc2FnZTogYEZpZWxkIGlkIFwiJHtmaWVsZC5pZH1cIiBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyLmAsXG4gICAgICAgICAgZmllbGRJZDogZmllbGQuaWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsYWJlbHMgPSBmaWVsZC5sYWJlbCA/PyB7fTtcbiAgICAgIGNvbnN0IGhhc0xhYmVsID0gT2JqZWN0LnZhbHVlcyhsYWJlbHMpLnNvbWUodiA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi50cmltKCkpO1xuICAgICAgaWYgKCFoYXNMYWJlbCkge1xuICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICBsZXZlbDogJ3dhcm5pbmcnLFxuICAgICAgICAgIG1lc3NhZ2U6IGBGaWVsZCBcIiR7ZmllbGQuaWR9XCIgaGFzIG5vIGxhYmVsLmAsXG4gICAgICAgICAgZmllbGRJZDogZmllbGQuaWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRhID0gZ2V0RmllbGRUeXBlTWV0YShmaWVsZC50eXBlKTtcbiAgICAgIC8vIEEgZmllbGQgb24gdGhlIGxvb2t1cCBzb3VyY2UgaGFzIG5vIGlubGluZSBvcHRpb25zIGJ5IGRlc2lnbiDigJQgaXRzIG9wdGlvbnMgYXJyaXZlIGZyb21cbiAgICAgIC8vIHRoZSByZWdpc3RyeSBhdCBydW50aW1lLiBXYXJuIG9ubHkgYWJvdXQgdGhlIG1pc3NpbmcgbGlzdCBuYW1lLlxuICAgICAgaWYgKG1ldGE/Lmhhc09wdGlvbnMgJiYgdHlwZW9mIGZpZWxkLmxpc3ROYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIWZpZWxkLmxpc3ROYW1lLnRyaW0oKSkge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgICAgbGV2ZWw6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBGaWVsZCBcIiR7ZmllbGQuaWR9XCIgcmVhZHMgb3B0aW9ucyBmcm9tIGEgbmFtZWQgbGlzdCBidXQgaGFzIG5vIGxpc3QgbmFtZS5gLFxuICAgICAgICAgICAgZmllbGRJZDogZmllbGQuaWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobWV0YT8uaGFzT3B0aW9ucyAmJiAoIWZpZWxkLm9wdGlvbnMgfHwgZmllbGQub3B0aW9ucy5sZW5ndGggPT09IDApKSB7XG4gICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgIGxldmVsOiAnd2FybmluZycsXG4gICAgICAgICAgbWVzc2FnZTogYEZpZWxkIFwiJHtmaWVsZC5pZH1cIiBpcyBhICR7ZmllbGQudHlwZX0gYnV0IGhhcyBubyBvcHRpb25zLmAsXG4gICAgICAgICAgZmllbGRJZDogZmllbGQuaWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElkIHVuaXF1ZW5lc3MgaXMgYSB3aG9sZS1jb25maWcgaW52YXJpYW50LCBhbmQgaXQgaXMgY291bnRlZCBvdmVyIHRoZSBlbnRpcmUgZmllbGRcbiAgICAvLyB0cmVlIHJhdGhlciB0aGFuIGBhbGxGaWVsZHNgLCB3aGljaCBzdG9wcyBhdCBhIHRhYidzIG93biBmaWVsZHMuIFR3byBpZHMgY29sbGlkaW5nXG4gICAgLy8gaW5zaWRlIGEgZ3JvdXAgb3IgYXJyYXkgd2VudCB1bnJlcG9ydGVkIGV2ZW4gdGhvdWdoIHJ1bGVzLCBzaG93V2hlbiBjb25kaXRpb25zIGFuZFxuICAgIC8vIGF1dG9QYXRjaCBtYXBwaW5ncyBhbGwgYWRkcmVzcyBmaWVsZHMgYnkgYmFyZSBpZCBhbmQgd291bGQgcmVzb2x2ZSB0byB3aGljaGV2ZXIgb25lXG4gICAgLy8gdGhlIGxvb2t1cCBoYXBwZW5lZCB0byByZWFjaCBmaXJzdC5cbiAgICBjb25zdCBpZENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgY29uc3QgY291bnRJZHMgPSAoZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzID8/IFtdKSB7XG4gICAgICAgIGlkQ291bnRzLnNldChmLmlkLCAoaWRDb3VudHMuZ2V0KGYuaWQpID8/IDApICsgMSk7XG4gICAgICAgIGlmIChmLmNoaWxkcmVuPy5sZW5ndGgpIGNvdW50SWRzKGYuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgZm9yIChjb25zdCB0YWIgb2YgdGhpcy5mbGF0dGVuVGFicyhjb25maWcudGFicykpIGNvdW50SWRzKHRhYi5maWVsZHMpO1xuXG4gICAgZm9yIChjb25zdCBbaWQsIGNvdW50XSBvZiBpZENvdW50cykge1xuICAgICAgaWYgKGNvdW50ID4gMSkge1xuICAgICAgICBwcm9ibGVtcy5wdXNoKHsgbGV2ZWw6ICdlcnJvcicsIG1lc3NhZ2U6IGBEdXBsaWNhdGUgZmllbGQgaWQgXCIke2lkfVwiICgke2NvdW50fcOXKS5gLCBmaWVsZElkOiBpZCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvYmxlbXM7XG4gIH1cbn1cbiJdfQ==
|