angular-three 2.0.0-beta.7 → 2.0.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +4 -147
  2. package/esm2022/angular-three.mjs +1 -1
  3. package/esm2022/index.mjs +10 -9
  4. package/esm2022/lib/before-render.mjs +13 -0
  5. package/esm2022/lib/canvas.mjs +129 -161
  6. package/esm2022/lib/directives/args.mjs +14 -12
  7. package/esm2022/lib/directives/common.mjs +28 -27
  8. package/esm2022/lib/directives/key.mjs +29 -0
  9. package/esm2022/lib/directives/parent.mjs +13 -11
  10. package/esm2022/lib/directives/repeat.mjs +5 -6
  11. package/esm2022/lib/dom/events.mjs +6 -1
  12. package/esm2022/lib/events.mjs +75 -58
  13. package/esm2022/lib/instance.mjs +65 -0
  14. package/esm2022/lib/loader.mjs +17 -20
  15. package/esm2022/lib/loop.mjs +6 -3
  16. package/esm2022/lib/portal.mjs +103 -112
  17. package/esm2022/lib/ref.mjs +48 -0
  18. package/esm2022/lib/renderer/catalogue.mjs +7 -0
  19. package/esm2022/lib/renderer/constants.mjs +21 -0
  20. package/esm2022/lib/renderer/index.mjs +409 -0
  21. package/esm2022/lib/renderer/store.mjs +62 -39
  22. package/esm2022/lib/renderer/utils.mjs +26 -43
  23. package/esm2022/lib/roots.mjs +249 -0
  24. package/esm2022/lib/routed-scene.mjs +6 -7
  25. package/esm2022/lib/store.mjs +207 -0
  26. package/esm2022/lib/three-types.mjs +1 -1
  27. package/esm2022/lib/types.mjs +1 -1
  28. package/esm2022/lib/utils/apply-props.mjs +14 -8
  29. package/esm2022/lib/utils/assert-injection-context.mjs +14 -0
  30. package/esm2022/lib/utils/attach.mjs +2 -2
  31. package/esm2022/lib/utils/create-injection-token.mjs +47 -0
  32. package/esm2022/lib/utils/is.mjs +1 -1
  33. package/esm2022/lib/utils/make.mjs +1 -1
  34. package/esm2022/lib/utils/safe-detect-changes.mjs +15 -13
  35. package/esm2022/lib/utils/signal-store.mjs +91 -0
  36. package/esm2022/lib/utils/update.mjs +1 -1
  37. package/fesm2022/angular-three.mjs +1580 -1430
  38. package/fesm2022/angular-three.mjs.map +1 -1
  39. package/index.d.ts +10 -8
  40. package/lib/{di/before-render.d.ts → before-render.d.ts} +1 -1
  41. package/lib/canvas.d.ts +81 -11
  42. package/lib/directives/args.d.ts +2 -2
  43. package/lib/directives/common.d.ts +5 -1
  44. package/lib/directives/key.d.ts +10 -0
  45. package/lib/directives/parent.d.ts +5 -5
  46. package/lib/dom/events.d.ts +3 -2
  47. package/lib/events.d.ts +78 -2
  48. package/lib/instance.d.ts +36 -0
  49. package/lib/loader.d.ts +13 -2
  50. package/lib/loop.d.ts +64 -6
  51. package/lib/portal.d.ts +21 -12
  52. package/lib/{di/ref.d.ts → ref.d.ts} +3 -2
  53. package/lib/renderer/catalogue.d.ts +9 -0
  54. package/lib/renderer/constants.d.ts +20 -0
  55. package/lib/renderer/index.d.ts +5 -0
  56. package/lib/renderer/store.d.ts +21 -15
  57. package/lib/renderer/utils.d.ts +29 -19
  58. package/lib/roots.d.ts +11 -0
  59. package/lib/routed-scene.d.ts +1 -1
  60. package/lib/store.d.ts +143 -0
  61. package/lib/three-types.d.ts +5 -5
  62. package/lib/types.d.ts +1 -310
  63. package/lib/utils/apply-props.d.ts +4 -2
  64. package/lib/utils/attach.d.ts +4 -2
  65. package/lib/utils/create-injection-token.d.ts +27 -0
  66. package/lib/utils/is.d.ts +3 -2
  67. package/lib/utils/make.d.ts +12 -1
  68. package/lib/utils/safe-detect-changes.d.ts +2 -2
  69. package/lib/utils/signal-store.d.ts +17 -0
  70. package/lib/utils/update.d.ts +1 -1
  71. package/metadata.json +1 -0
  72. package/package.json +4 -4
  73. package/plugin/README.md +11 -0
  74. package/plugin/generators.json +39 -0
  75. package/plugin/package.json +6 -0
  76. package/plugin/src/generators/init/compat.d.ts +2 -0
  77. package/plugin/src/generators/init/compat.js +6 -0
  78. package/plugin/src/generators/init/compat.js.map +1 -0
  79. package/plugin/src/generators/init/generator.d.ts +2 -0
  80. package/plugin/src/generators/init/generator.js +48 -0
  81. package/plugin/src/generators/init/generator.js.map +1 -0
  82. package/plugin/src/generators/init/schema.json +6 -0
  83. package/plugin/src/generators/init-postprocessing/compat.d.ts +2 -0
  84. package/plugin/src/generators/init-postprocessing/compat.js +6 -0
  85. package/plugin/src/generators/init-postprocessing/compat.js.map +1 -0
  86. package/plugin/src/generators/init-postprocessing/generator.d.ts +2 -0
  87. package/plugin/src/generators/init-postprocessing/generator.js +20 -0
  88. package/plugin/src/generators/init-postprocessing/generator.js.map +1 -0
  89. package/plugin/src/generators/init-postprocessing/schema.json +6 -0
  90. package/plugin/src/generators/init-soba/compat.d.ts +2 -0
  91. package/plugin/src/generators/init-soba/compat.js +6 -0
  92. package/plugin/src/generators/init-soba/compat.js.map +1 -0
  93. package/plugin/src/generators/init-soba/generator.d.ts +2 -0
  94. package/plugin/src/generators/init-soba/generator.js +24 -0
  95. package/plugin/src/generators/init-soba/generator.js.map +1 -0
  96. package/plugin/src/generators/init-soba/schema.json +6 -0
  97. package/plugin/src/generators/versions.d.ts +9 -0
  98. package/plugin/src/generators/versions.js +13 -0
  99. package/plugin/src/generators/versions.js.map +1 -0
  100. package/plugin/src/index.d.ts +3 -0
  101. package/plugin/src/index.js +10 -0
  102. package/plugin/src/index.js.map +1 -0
  103. package/web-types.json +1 -0
  104. package/esm2022/lib/di/before-render.mjs +0 -13
  105. package/esm2022/lib/di/catalogue.mjs +0 -7
  106. package/esm2022/lib/di/ref.mjs +0 -54
  107. package/esm2022/lib/renderer/di.mjs +0 -3
  108. package/esm2022/lib/renderer/enums.mjs +0 -2
  109. package/esm2022/lib/renderer/provider.mjs +0 -18
  110. package/esm2022/lib/renderer/renderer.mjs +0 -368
  111. package/esm2022/lib/stores/signal.store.mjs +0 -78
  112. package/esm2022/lib/stores/store.mjs +0 -420
  113. package/esm2022/lib/utils/assert-in-injection-context.mjs +0 -14
  114. package/esm2022/lib/utils/instance.mjs +0 -67
  115. package/esm2022/lib/utils/timing.mjs +0 -9
  116. package/lib/di/catalogue.d.ts +0 -3
  117. package/lib/renderer/di.d.ts +0 -2
  118. package/lib/renderer/enums.d.ts +0 -26
  119. package/lib/renderer/provider.d.ts +0 -8
  120. package/lib/renderer/renderer.d.ts +0 -49
  121. package/lib/stores/signal.store.d.ts +0 -21
  122. package/lib/stores/store.d.ts +0 -13
  123. package/lib/utils/instance.d.ts +0 -4
  124. package/lib/utils/timing.d.ts +0 -2
  125. /package/lib/utils/{assert-in-injection-context.d.ts → assert-injection-context.d.ts} +0 -0
@@ -1,15 +1,17 @@
1
- import { getDebugNode, untracked } from '@angular/core';
1
+ import { InjectionToken, getDebugNode, untracked } from '@angular/core';
2
2
  import { NgtArgs } from '../directives/args';
3
3
  import { NgtParent } from '../directives/parent';
4
- import { NgtStore } from '../stores/store';
4
+ import { getLocalState } from '../instance';
5
+ import { NGT_STORE } from '../store';
5
6
  import { applyProps } from '../utils/apply-props';
6
- import { getLocalState } from '../utils/instance';
7
7
  import { is } from '../utils/is';
8
- import { SPECIAL_INTERNAL_ADD_COMMENT, SPECIAL_PROPERTIES, attachThreeChild, removeThreeChild } from './utils';
8
+ import { SPECIAL_INTERNAL_ADD_COMMENT, SPECIAL_PROPERTIES } from './constants';
9
+ import { attachThreeChild, removeThreeChild } from './utils';
10
+ export const NGT_COMPOUND_PREFIXES = new InjectionToken('NgtCompoundPrefixes');
9
11
  export class NgtRendererStore {
10
- #comments = [];
11
12
  constructor(root) {
12
13
  this.root = root;
14
+ this.comments = [];
13
15
  }
14
16
  createNode(type, node) {
15
17
  const state = [
@@ -30,10 +32,10 @@ export class NgtRendererStore {
30
32
  undefined,
31
33
  ];
32
34
  const rendererNode = Object.assign(node, { __ngt_renderer__: state });
33
- // assign ownerDocument to node so we can use HostListener in Component
35
+ // NOTE: assign ownerDocument to node so we can use HostListener in Component
34
36
  if (!rendererNode['ownerDocument'])
35
37
  rendererNode['ownerDocument'] = this.root.document;
36
- // assign injectorFactory on non-three type since
38
+ // NOTE: assign injectorFactory on non-three type since
37
39
  // rendererNode is an instance of DOM Node
38
40
  if (state[0 /* NgtRendererClassId.type */] !== 'three') {
39
41
  state[14 /* NgtRendererClassId.injectorFactory */] = () => getDebugNode(rendererNode).injector;
@@ -47,7 +49,7 @@ export class NgtRendererStore {
47
49
  this.portals.push(node);
48
50
  }
49
51
  else {
50
- this.#comments.push(rendererNode);
52
+ this.comments.push(rendererNode);
51
53
  }
52
54
  };
53
55
  return rendererNode;
@@ -71,12 +73,21 @@ export class NgtRendererStore {
71
73
  }
72
74
  }
73
75
  removeChild(node, child) {
74
- const index = node.__ngt_renderer__[3 /* NgtRendererClassId.children */].findIndex((c) => child === c);
76
+ const index = node.__ngt_renderer__?.[3 /* NgtRendererClassId.children */].findIndex((c) => child === c);
75
77
  if (index >= 0) {
76
78
  node.__ngt_renderer__[3 /* NgtRendererClassId.children */].splice(index, 1);
77
79
  }
78
80
  }
79
81
  setCompound(compound, instance) {
82
+ const instanceRS = instance.__ngt_renderer__;
83
+ if (instanceRS && instanceRS[1 /* NgtRendererClassId.parent */]) {
84
+ const parentRS = instanceRS[1 /* NgtRendererClassId.parent */].__ngt_renderer__;
85
+ // NOTE: if instance is already compounded by its parent. skip
86
+ if (parentRS[0 /* NgtRendererClassId.type */] === 'compound' &&
87
+ parentRS[7 /* NgtRendererClassId.compounded */] === instance) {
88
+ return;
89
+ }
90
+ }
80
91
  const rS = compound.__ngt_renderer__;
81
92
  rS[7 /* NgtRendererClassId.compounded */] = instance;
82
93
  const attributes = Object.keys(rS[9 /* NgtRendererClassId.attributes */]);
@@ -108,7 +119,7 @@ export class NgtRendererStore {
108
119
  const injector = injectorFactory?.();
109
120
  if (!injector)
110
121
  return;
111
- const portalStore = injector.get(NgtStore, null);
122
+ const portalStore = injector.get(NGT_STORE, null);
112
123
  if (!portalStore)
113
124
  return;
114
125
  const portalContainer = portalStore.get('scene');
@@ -121,8 +132,8 @@ export class NgtRendererStore {
121
132
  if (rS[4 /* NgtRendererClassId.destroyed */])
122
133
  return;
123
134
  if (name === SPECIAL_PROPERTIES.RENDER_PRIORITY) {
124
- // priority needs to be set as an attribute string so that they can be set as early as possible
125
- // we convert that string to a number. if it's invalid, 0
135
+ // NOTE: priority needs to be set as an attribute string so that they can be set as early as possible
136
+ // we convert that string to a number. if it's invalid, default 0
126
137
  let priority = Number(value);
127
138
  if (isNaN(priority)) {
128
139
  priority = 0;
@@ -131,19 +142,19 @@ export class NgtRendererStore {
131
142
  getLocalState(node).priority = priority;
132
143
  }
133
144
  if (name === SPECIAL_PROPERTIES.COMPOUND) {
134
- // we set the compound property on instance node now so we know that this instance is being compounded
145
+ // NOTE: we set the compound property on instance node now so we know that this instance is being compounded
135
146
  rS[5 /* NgtRendererClassId.compound */] = [value === '' || value === 'first', {}];
136
147
  return;
137
148
  }
138
149
  if (name === SPECIAL_PROPERTIES.ATTACH) {
139
- // handle attach as tring
150
+ // NOTE: handle attach as tring
140
151
  const paths = value.split('.');
141
152
  if (paths.length)
142
153
  getLocalState(node).attach = paths;
143
154
  return;
144
155
  }
145
156
  if (name === SPECIAL_PROPERTIES.VALUE) {
146
- // coercion
157
+ // NOTE: coercion
147
158
  let maybeCoerced = value;
148
159
  if (maybeCoerced === '' || maybeCoerced === 'true' || maybeCoerced === 'false') {
149
160
  maybeCoerced = maybeCoerced === 'true' || maybeCoerced === '';
@@ -155,7 +166,7 @@ export class NgtRendererStore {
155
166
  return;
156
167
  }
157
168
  applyProps(node, { [name]: value });
158
- this.#updateNativeProps(node, name, value);
169
+ this.updateNativeProps(node, name, value);
159
170
  }
160
171
  applyProperty(node, name, value) {
161
172
  const rS = node.__ngt_renderer__;
@@ -167,7 +178,7 @@ export class NgtRendererStore {
167
178
  value.nativeElement = node;
168
179
  return;
169
180
  }
170
- const parent = getLocalState(node).parent?.value || rS[1 /* NgtRendererClassId.parent */];
181
+ const parent = getLocalState(node).parent() || rS[1 /* NgtRendererClassId.parent */];
171
182
  // [rawValue]
172
183
  if (getLocalState(node).isRaw && name === SPECIAL_PROPERTIES.VALUE) {
173
184
  rS[11 /* NgtRendererClassId.rawValue */] = value;
@@ -189,7 +200,7 @@ export class NgtRendererStore {
189
200
  value = compound[1 /* NgtCompoundClassId.props */][name];
190
201
  }
191
202
  applyProps(node, { [name]: value });
192
- this.#updateNativeProps(node, name, value);
203
+ this.updateNativeProps(node, name, value);
193
204
  }
194
205
  isCompound(name) {
195
206
  return this.root.compoundPrefixes.some((prefix) => name.startsWith(prefix));
@@ -243,14 +254,14 @@ export class NgtRendererStore {
243
254
  return null;
244
255
  }
245
256
  getCreationState() {
246
- const injectedArgs = this.#firstNonInjectedDirective(NgtArgs)?.args || [];
247
- const injectedParent = this.#firstNonInjectedDirective(NgtParent)?.parent || null;
248
- const store = this.#tryGetPortalStore();
257
+ const injectedArgs = this.firstNonInjectedDirective(NgtArgs)?.args || [];
258
+ const injectedParent = this.firstNonInjectedDirective(NgtParent)?.parent || null;
259
+ const store = this.tryGetPortalStore();
249
260
  return { injectedArgs, injectedParent, store };
250
261
  }
251
262
  destroy(node, parent) {
252
263
  const rS = node.__ngt_renderer__;
253
- if (rS[4 /* NgtRendererClassId.destroyed */])
264
+ if (!rS || rS[4 /* NgtRendererClassId.destroyed */])
254
265
  return;
255
266
  if (rS[0 /* NgtRendererClassId.type */] === 'three') {
256
267
  rS[5 /* NgtRendererClassId.compound */] = undefined;
@@ -282,9 +293,9 @@ export class NgtRendererStore {
282
293
  if (rS[0 /* NgtRendererClassId.type */] === 'comment') {
283
294
  rS[14 /* NgtRendererClassId.injectorFactory */] = null;
284
295
  delete node[SPECIAL_INTERNAL_ADD_COMMENT];
285
- const index = this.#comments.findIndex((comment) => comment === node);
296
+ const index = this.comments.findIndex((comment) => comment === node);
286
297
  if (index > -1) {
287
- this.#comments.splice(index, 1);
298
+ this.comments.splice(index, 1);
288
299
  }
289
300
  }
290
301
  if (rS[0 /* NgtRendererClassId.type */] === 'portal') {
@@ -304,13 +315,17 @@ export class NgtRendererStore {
304
315
  }
305
316
  if (rS[12 /* NgtRendererClassId.ref */]) {
306
317
  // nullify ref
307
- rS[12 /* NgtRendererClassId.ref */].nativeElement = null;
308
- rS[12 /* NgtRendererClassId.ref */] = undefined;
318
+ // but we do it later so that it doesn't hinder render
319
+ // TODO: will this cause memory leak?
320
+ requestAnimationFrame(() => {
321
+ rS[12 /* NgtRendererClassId.ref */].nativeElement = null;
322
+ rS[12 /* NgtRendererClassId.ref */] = undefined;
323
+ });
309
324
  }
310
325
  // nullify parent
311
326
  rS[1 /* NgtRendererClassId.parent */] = null;
312
327
  for (const renderChild of rS[3 /* NgtRendererClassId.children */] || []) {
313
- if (renderChild.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three' && parent) {
328
+ if (renderChild.__ngt_renderer__?.[0 /* NgtRendererClassId.type */] === 'three' && parent) {
314
329
  removeThreeChild(parent, renderChild, true);
315
330
  }
316
331
  this.destroy(renderChild, parent);
@@ -321,20 +336,20 @@ export class NgtRendererStore {
321
336
  this.removeChild(parent, node);
322
337
  }
323
338
  }
324
- #updateNativeProps(node, name, value) {
339
+ updateNativeProps(node, key, value) {
325
340
  const localState = getLocalState(node);
326
341
  if (!localState || !localState.nativeProps)
327
342
  return;
328
- queueMicrotask(() => {
329
- localState.nativeProps.set({ [name]: value });
330
- });
343
+ localState.nativeProps.set({ [key]: value });
331
344
  }
332
- #firstNonInjectedDirective(dir) {
345
+ firstNonInjectedDirective(dir) {
333
346
  let directive;
334
- let i = this.#comments.length - 1;
347
+ const destroyed = [];
348
+ let i = this.comments.length - 1;
335
349
  while (i >= 0) {
336
- const comment = this.#comments[i];
350
+ const comment = this.comments[i];
337
351
  if (comment.__ngt_renderer__[4 /* NgtRendererClassId.destroyed */]) {
352
+ destroyed.push(i);
338
353
  i--;
339
354
  continue;
340
355
  }
@@ -350,16 +365,21 @@ export class NgtRendererStore {
350
365
  }
351
366
  i--;
352
367
  }
368
+ destroyed.forEach((index) => {
369
+ this.comments.splice(index, 1);
370
+ });
353
371
  return directive;
354
372
  }
355
- #tryGetPortalStore() {
373
+ tryGetPortalStore() {
356
374
  let store;
375
+ const destroyed = [];
357
376
  // we only care about the portal states because NgtStore only differs per Portal
358
377
  let i = this.portals.length - 1;
359
378
  while (i >= 0) {
360
379
  // loop through the portal state backwards to find the closest NgtStore
361
380
  const portal = this.portals[i];
362
381
  if (portal.__ngt_renderer__[4 /* NgtRendererClassId.destroyed */]) {
382
+ destroyed.push(i);
363
383
  i--;
364
384
  continue;
365
385
  }
@@ -368,15 +388,18 @@ export class NgtRendererStore {
368
388
  i--;
369
389
  continue;
370
390
  }
371
- const instance = injector.get(NgtStore, null);
372
- // only the instance with previousStore should pass
373
- if (instance && instance.get('previousStore')) {
391
+ const instance = injector.get(NGT_STORE, null);
392
+ // only the instance with previousRoot should pass
393
+ if (instance && instance.get('previousRoot')) {
374
394
  store = instance;
375
395
  break;
376
396
  }
377
397
  i--;
378
398
  }
399
+ destroyed.forEach((index) => {
400
+ this.portals.splice(index, 1);
401
+ });
379
402
  return store || this.root.store;
380
403
  }
381
404
  }
382
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi9yZW5kZXJlci9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFFbEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQWlDL0csTUFBTSxPQUFPLGdCQUFnQjtJQUNoQixTQUFTLEdBQUcsRUFBNEIsQ0FBQztJQUVsRCxZQUE2QixJQUEwQjtRQUExQixTQUFJLEdBQUosSUFBSSxDQUFzQjtJQUFHLENBQUM7SUFFM0QsVUFBVSxDQUFDLElBQStDLEVBQUUsSUFBa0I7UUFDMUUsTUFBTSxLQUFLLEdBQUc7WUFDVixJQUFJO1lBQ0osSUFBSTtZQUNKLElBQUk7WUFDSixFQUFFO1lBQ0YsS0FBSztZQUNMLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7U0FDTyxDQUFDO1FBRXRCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxF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Q0FBQyxFQUFFLENBQUM7Z0JBQ0osU0FBUzthQUNaO1lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGdCQUFnQiw2Q0FBb0MsRUFBRSxDQUFDO1lBQy9FLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ1gsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osU0FBUzthQUNaO1lBQ0QsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUMsbURBQW1EO1lBQ25ELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQzNDLEtBQUssR0FBRyxRQUFRLENBQUM7Z0JBQ2pCLE1BQU07YUFDVDtZQUNELENBQUMsRUFBRSxDQUFDO1NBQ1A7UUFDRCxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSyxDQUFDLEtBQUssQ0FBQztJQUNyQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXREZWJ1Z05vZGUsIHVudHJhY2tlZCwgdHlwZSBJbmplY3RvciwgdHlwZSBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IE5ndEluamVjdGVkUmVmIH0gZnJvbSAnLi4vZGkvcmVmJztcbmltcG9ydCB7IE5ndEFyZ3MgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2FyZ3MnO1xuaW1wb3J0IHR5cGUgeyBOZ3RDb21tb25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NvbW1vbic7XG5pbXBvcnQgeyBOZ3RQYXJlbnQgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3BhcmVudCc7XG5pbXBvcnQgeyBOZ3RTdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy9zdG9yZSc7XG5pbXBvcnQgdHlwZSB7IE5ndEFueVJlY29yZCwgTmd0SW5zdGFuY2VOb2RlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgYXBwbHlQcm9wcyB9IGZyb20gJy4uL3V0aWxzL2FwcGx5LXByb3BzJztcbmltcG9ydCB7IGdldExvY2FsU3RhdGUgfSBmcm9tICcuLi91dGlscy9pbnN0YW5jZSc7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4uL3V0aWxzL2lzJztcbmltcG9ydCB7IE5ndENvbXBvdW5kQ2xhc3NJZCwgTmd0UXVldWVPcENsYXNzSWQsIE5ndFJlbmRlcmVyQ2xhc3NJZCB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVCwgU1BFQ0lBTF9QUk9QRVJUSUVTLCBhdHRhY2hUaHJlZUNoaWxkLCByZW1vdmVUaHJlZUNoaWxkIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlcmVyUm9vdFN0YXRlID0ge1xuICAgIHN0b3JlOiBOZ3RTdG9yZTtcbiAgICBjb21wb3VuZFByZWZpeGVzOiBzdHJpbmdbXTtcbiAgICBkb2N1bWVudDogRG9jdW1lbnQ7XG4gICAgcG9ydGFsczogQXJyYXk8Tmd0UmVuZGVyZXJOb2RlPjtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndFF1ZXVlT3AgPSBbdHlwZTogJ29wJyB8ICdjbGVhblVwJywgb3A6ICgpID0+IHZvaWQsIGRvbmU/OiB0cnVlXTtcblxuZXhwb3J0IHR5cGUgTmd0UmVuZGVyZXJTdGF0ZSA9IFtcbiAgICB0eXBlOiAndGhyZWUnIHwgJ2NvbXBvdW5kJyB8ICdwb3J0YWwnIHwgJ2NvbW1lbnQnIHwgJ2RvbScsXG4gICAgcGFyZW50OiBOZ3RSZW5kZXJlck5vZGUgfCBudWxsLFxuICAgIGluamVjdGVkUGFyZW50OiBOZ3RSZW5kZXJlck5vZGUgfCBOZ3RJbmplY3RlZFJlZjxOZ3RSZW5kZXJlck5vZGU+IHwgbnVsbCxcbiAgICBjaGlsZHJlbjogTmd0UmVuZGVyZXJOb2RlW10sXG4gICAgZGVzdHJveWVkOiBib29sZWFuLFxuICAgIGNvbXBvdW5kOiBbYXBwbHlGaXJzdDogYm9vbGVhbiwgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT5dLFxuICAgIGNvbXBvdW5kUGFyZW50OiBOZ3RSZW5kZXJlck5vZGUsXG4gICAgY29tcG91bmRlZDogTmd0UmVuZGVyZXJOb2RlLFxuICAgIHF1ZXVlT3BzOiBTZXQ8Tmd0UXVldWVPcD4sXG4gICAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHJhd1ZhbHVlOiBhbnksXG4gICAgcmVmOiBhbnksXG4gICAgcG9ydGFsQ29udGFpbmVyOiBOZ3RSZW5kZXJlck5vZGUsXG4gICAgaW5qZWN0b3JGYWN0b3J5OiAoKSA9PiBJbmplY3RvclxuXTtcblxuZXhwb3J0IHR5cGUgTmd0UmVuZGVyZXJOb2RlID0ge1xuICAgIF9fbmd0X3JlbmRlcmVyX186IE5ndFJlbmRlcmVyU3RhdGU7XG59O1xuXG5leHBvcnQgY2xhc3MgTmd0UmVuZGVyZXJTdG9yZSB7XG4gICAgcmVhZG9ubHkgI2NvbW1lbnRzID0gW10gYXMgQXJyYXk8Tmd0UmVuZGVyZXJOb2RlPjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcm9vdDogTmd0UmVuZGVyZXJSb290U3RhdGUpIHt9XG5cbiAgICBjcmVhdGVOb2RlKHR5cGU6IE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdLCBub2RlOiBOZ3RBbnlSZWNvcmQpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBbXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgdW5kZWZpbmVkISxcbiAgICAgICAgICAgIHVuZGVmaW5lZCEsXG4gICAgICAgICAgICB1bmRlZmluZWQhLFxuICAgICAgICAgICAgdW5kZWZpbmVkISxcbiAgICAgICAgICAgIHVuZGVmaW5lZCEsXG4gICAgICAgICAgICB1bmRlZmluZWQhLFxuICAgICAgICAgICAgdW5kZWZpbmVkISxcbiAgICAgICAgICAgIHVuZGVmaW5lZCEsXG4gICAgICAgICAgICB1bmRlZmluZWQhLFxuICAgICAgICAgICAgdW5kZWZpbmVkISxcbiAgICAgICAgXSBhcyBOZ3RSZW5kZXJlclN0YXRlO1xuXG4gICAgICAgIGNvbnN0IHJlbmRlcmVyTm9kZSA9IE9iamVjdC5hc3NpZ24obm9kZSwgeyBfX25ndF9yZW5kZXJlcl9fOiBzdGF0ZSB9KTtcblxuICAgICAgICAvLyBhc3NpZ24gb3duZXJEb2N1bWVudCB0byBub2RlIHNvIHdlIGNhbiB1c2UgSG9zdExpc3RlbmVyIGluIENvbXBvbmVudFxuICAgICAgICBpZiAoIXJlbmRlcmVyTm9kZVsnb3duZXJEb2N1bWVudCddKSByZW5kZXJlck5vZGVbJ293bmVyRG9jdW1lbnQnXSA9IHRoaXMucm9vdC5kb2N1bWVudDtcblxuICAgICAgICAvLyBhc3NpZ24gaW5qZWN0b3JGYWN0b3J5IG9uIG5vbi10aHJlZSB0eXBlIHNpbmNlXG4gICAgICAgIC8vIHJlbmRlcmVyTm9kZSBpcyBhbiBpbnN0YW5jZSBvZiBET00gTm9kZVxuICAgICAgICBpZiAoc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdICE9PSAndGhyZWUnKSB7XG4gICAgICAgICAgICBzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9ICgpID0+IGdldERlYnVnTm9kZShyZW5kZXJlck5vZGUpIS5pbmplY3RvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21tZW50Jykge1xuICAgICAgICAgICAgLy8gTk9URTogd2UgYXR0YWNoIGFuIGFycm93IGZ1bmN0aW9uIHRvIHRoZSBDb21tZW50IG5vZGVcbiAgICAgICAgICAgIC8vIEluIG91ciBkaXJlY3RpdmVzLCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHRoZW4gc3RhcnQgdHJhY2tpbmcgdGhlIFJlbmRlcmVyTm9kZVxuICAgICAgICAgICAgLy8gdGhpcyBpcyBkb25lIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgTm9kZXMgd2UgbmVlZCB0byBwcm9jZXNzIGZvciBnZXRDcmVhdGlvblN0YXRlXG4gICAgICAgICAgICByZW5kZXJlck5vZGVbU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVF0gPSAobm9kZT86IE5ndFJlbmRlcmVyTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChub2RlICYmIG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9ydGFscy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2NvbW1lbnRzLnB1c2gocmVuZGVyZXJOb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyTm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcpIHtcbiAgICAgICAgICAgIHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10gPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc10gPSB7fTtcbiAgICAgICAgICAgIHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXSA9IHt9O1xuICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyTm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW5kZXJlck5vZGU7XG4gICAgfVxuXG4gICAgc2V0UGFyZW50KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgcGFyZW50OiBOZ3RSZW5kZXJlck5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0pIHtcbiAgICAgICAgICAgIG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZENoaWxkKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgY2hpbGQ6IE5ndFJlbmRlcmVyTm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLmluY2x1ZGVzKGNoaWxkKSkge1xuICAgICAgICAgICAgbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0ucHVzaChjaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVDaGlsZChub2RlOiBOZ3RSZW5kZXJlck5vZGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXS5maW5kSW5kZXgoKGMpID0+IGNoaWxkID09PSBjKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDb21wb3VuZChjb21wb3VuZDogTmd0UmVuZGVyZXJOb2RlLCBpbnN0YW5jZTogTmd0UmVuZGVyZXJOb2RlKSB7XG4gICAgICAgIGNvbnN0IHJTID0gY29tcG91bmQuX19uZ3RfcmVuZGVyZXJfXztcbiAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdID0gaW5zdGFuY2U7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3Qua2V5cyhyU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc10pO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5QXR0cmlidXRlKGluc3RhbmNlLCBrZXksIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXVtrZXldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlQcm9wZXJ0eShpbnN0YW5jZSwga2V5LCByU1tOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc11ba2V5XSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oY29tcG91bmQpO1xuICAgIH1cblxuICAgIHF1ZXVlT3BlcmF0aW9uKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgb3A6IE5ndFF1ZXVlT3ApIHtcbiAgICAgICAgbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uYWRkKG9wKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4ZWN1dGVPcGVyYXRpb24obm9kZTogTmd0UmVuZGVyZXJOb2RlLCB0eXBlOiBOZ3RRdWV1ZU9wW05ndFF1ZXVlT3BDbGFzc0lkLnR5cGVdID0gJ29wJykge1xuICAgICAgICBjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcbiAgICAgICAgaWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10/LnNpemUpIHtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uZm9yRWFjaCgob3ApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob3BbTmd0UXVldWVPcENsYXNzSWQudHlwZV0gPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgb3BbTmd0UXVldWVPcENsYXNzSWQub3BdKCk7XG4gICAgICAgICAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uZGVsZXRlKG9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3NQb3J0YWxDb250YWluZXIocG9ydGFsOiBOZ3RSZW5kZXJlck5vZGUpIHtcbiAgICAgICAgY29uc3QgaW5qZWN0b3JGYWN0b3J5ID0gcG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV07XG4gICAgICAgIGNvbnN0IGluamVjdG9yID0gaW5qZWN0b3JGYWN0b3J5Py4oKTtcbiAgICAgICAgaWYgKCFpbmplY3RvcikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBvcnRhbFN0b3JlID0gaW5qZWN0b3IuZ2V0KE5ndFN0b3JlLCBudWxsKTtcbiAgICAgICAgaWYgKCFwb3J0YWxTdG9yZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBvcnRhbENvbnRhaW5lciA9IHBvcnRhbFN0b3JlLmdldCgnc2NlbmUnKTtcbiAgICAgICAgaWYgKCFwb3J0YWxDb250YWluZXIpIHJldHVybjtcblxuICAgICAgICBwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXSA9IHRoaXMuY3JlYXRlTm9kZSgndGhyZWUnLCBwb3J0YWxDb250YWluZXIpO1xuICAgIH1cblxuICAgIGFwcGx5QXR0cmlidXRlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcbiAgICAgICAgaWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5SRU5ERVJfUFJJT1JJVFkpIHtcbiAgICAgICAgICAgIC8vIHByaW9yaXR5IG5lZWRzIHRvIGJlIHNldCBhcyBhbiBhdHRyaWJ1dGUgc3RyaW5nIHNvIHRoYXQgdGhleSBjYW4gYmUgc2V0IGFzIGVhcmx5IGFzIHBvc3NpYmxlXG4gICAgICAgICAgICAvLyB3ZSBjb252ZXJ0IHRoYXQgc3RyaW5nIHRvIGEgbnVtYmVyLiBpZiBpdCdzIGludmFsaWQsIDBcbiAgICAgICAgICAgIGxldCBwcmlvcml0eSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4ocHJpb3JpdHkpKSB7XG4gICAgICAgICAgICAgICAgcHJpb3JpdHkgPSAwO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgW05HVF0gXCJwcmlvcml0eVwiIGlzIGFuIGludmFsaWQgbnVtYmVyLCBkZWZhdWx0IHRvIDBgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdldExvY2FsU3RhdGUobm9kZSkucHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuQ09NUE9VTkQpIHtcbiAgICAgICAgICAgIC8vIHdlIHNldCB0aGUgY29tcG91bmQgcHJvcGVydHkgb24gaW5zdGFuY2Ugbm9kZSBub3cgc28gd2Uga25vdyB0aGF0IHRoaXMgaW5zdGFuY2UgaXMgYmVpbmcgY29tcG91bmRlZFxuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXSA9IFt2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09ICdmaXJzdCcsIHt9XTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuQVRUQUNIKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgYXR0YWNoIGFzIHRyaW5nXG4gICAgICAgICAgICBjb25zdCBwYXRocyA9IHZhbHVlLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBpZiAocGF0aHMubGVuZ3RoKSBnZXRMb2NhbFN0YXRlKG5vZGUpLmF0dGFjaCA9IHBhdGhzO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5WQUxVRSkge1xuICAgICAgICAgICAgLy8gY29lcmNpb25cbiAgICAgICAgICAgIGxldCBtYXliZUNvZXJjZWQ6IGFueSA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKG1heWJlQ29lcmNlZCA9PT0gJycgfHwgbWF5YmVDb2VyY2VkID09PSAndHJ1ZScgfHwgbWF5YmVDb2VyY2VkID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgICAgbWF5YmVDb2VyY2VkID0gbWF5YmVDb2VyY2VkID09PSAndHJ1ZScgfHwgbWF5YmVDb2VyY2VkID09PSAnJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTmFOKE51bWJlcihtYXliZUNvZXJjZWQpKSkge1xuICAgICAgICAgICAgICAgIG1heWJlQ29lcmNlZCA9IE51bWJlcihtYXliZUNvZXJjZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSA9IG1heWJlQ29lcmNlZDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcGx5UHJvcHMobm9kZSwgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgICB0aGlzLiN1cGRhdGVOYXRpdmVQcm9wcyhub2RlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgYXBwbHlQcm9wZXJ0eShub2RlOiBOZ3RSZW5kZXJlck5vZGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcbiAgICAgICAgaWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSByZXR1cm47XG5cbiAgICAgICAgLy8gW3JlZl1cbiAgICAgICAgaWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5SRUYgJiYgaXMucmVmKHZhbHVlKSkge1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHZhbHVlLm5hdGl2ZUVsZW1lbnQgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50ID0gZ2V0TG9jYWxTdGF0ZShub2RlKS5wYXJlbnQ/LnZhbHVlIHx8IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXG4gICAgICAgIC8vIFtyYXdWYWx1ZV1cbiAgICAgICAgaWYgKGdldExvY2FsU3RhdGUobm9kZSkuaXNSYXcgJiYgbmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlZBTFVFKSB7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucmF3VmFsdWVdID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAocGFyZW50KSBhdHRhY2hUaHJlZUNoaWxkKHBhcmVudCwgbm9kZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBbYXR0YWNoXVxuICAgICAgICBpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLkFUVEFDSCkge1xuICAgICAgICAgICAgZ2V0TG9jYWxTdGF0ZShub2RlKS5hdHRhY2ggPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcCgodikgPT4gdi50b1N0cmluZygpKSA6IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHBhcmVudCkgYXR0YWNoVGhyZWVDaGlsZChwYXJlbnQsIG5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcG91bmQgPSByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb21wb3VuZD8uW05ndENvbXBvdW5kQ2xhc3NJZC5wcm9wc10gJiZcbiAgICAgICAgICAgIG5hbWUgaW4gY29tcG91bmRbTmd0Q29tcG91bmRDbGFzc0lkLnByb3BzXSAmJlxuICAgICAgICAgICAgIWNvbXBvdW5kW05ndENvbXBvdW5kQ2xhc3NJZC5hcHBseUZpcnN0XVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29tcG91bmRbTmd0Q29tcG91bmRDbGFzc0lkLnByb3BzXVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBhcHBseVByb3BzKG5vZGUsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgICAgICAgdGhpcy4jdXBkYXRlTmF0aXZlUHJvcHMobm9kZSwgbmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGlzQ29tcG91bmQobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QuY29tcG91bmRQcmVmaXhlcy5zb21lKChwcmVmaXgpID0+IG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKTtcbiAgICB9XG5cbiAgICBpc0RPTShub2RlOiBOZ3RBbnlSZWNvcmQpIHtcbiAgICAgICAgY29uc3QgclMgPSBub2RlWydfX25ndF9yZW5kZXJlcl9fJ107XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhclMgfHxcbiAgICAgICAgICAgIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICdjb21wb3VuZCcgJiZcbiAgICAgICAgICAgICAgICAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIERvY3VtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBXaW5kb3cpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCByb290U2NlbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3Quc3RvcmUuZ2V0KCdzY2VuZScpO1xuICAgIH1cblxuICAgIGdldCBwb3J0YWxzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290LnBvcnRhbHM7XG4gICAgfVxuXG4gICAgZ2V0Q2xvc2VzdFBhcmVudFdpdGhJbnN0YW5jZShub2RlOiBOZ3RSZW5kZXJlck5vZGUpOiBOZ3RSZW5kZXJlck5vZGUgfCBudWxsIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICd0aHJlZScpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXVxuICAgICAgICAgICAgICAgIDogcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIGdldENsb3Nlc3RQYXJlbnRXaXRoQ29tcG91bmQobm9kZTogTmd0UmVuZGVyZXJOb2RlKSB7XG4gICAgICAgIGlmIChub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyZW50ICYmXG4gICAgICAgICAgICBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiZcbiAgICAgICAgICAgICFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF1cbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgcGFyZW50ICYmXG4gICAgICAgICAgICAocGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnIHx8XG4gICAgICAgICAgICAgICAgIXBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0gfHxcbiAgICAgICAgICAgICAgICBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICdjb21wb3VuZCcpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJlxuICAgICAgICAgICAgcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0pIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRDcmVhdGlvblN0YXRlKCkge1xuICAgICAgICBjb25zdCBpbmplY3RlZEFyZ3MgPSB0aGlzLiNmaXJzdE5vbkluamVjdGVkRGlyZWN0aXZlKE5ndEFyZ3MpPy5hcmdzIHx8IFtdO1xuICAgICAgICBjb25zdCBpbmplY3RlZFBhcmVudCA9IHRoaXMuI2ZpcnN0Tm9uSW5qZWN0ZWREaXJlY3RpdmUoTmd0UGFyZW50KT8ucGFyZW50IHx8IG51bGw7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy4jdHJ5R2V0UG9ydGFsU3RvcmUoKTtcbiAgICAgICAgcmV0dXJuIHsgaW5qZWN0ZWRBcmdzLCBpbmplY3RlZFBhcmVudCwgc3RvcmUgfTtcbiAgICB9XG5cbiAgICBkZXN0cm95KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgcGFyZW50PzogTmd0UmVuZGVyZXJOb2RlKSB7XG4gICAgICAgIGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcbiAgICAgICAgaWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXSA9IHVuZGVmaW5lZCE7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdID0gdW5kZWZpbmVkITtcblxuICAgICAgICAgICAgY29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUobm9kZSk7XG4gICAgICAgICAgICBpZiAobG9jYWxTdGF0ZS5vYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgdW50cmFja2VkKGxvY2FsU3RhdGUub2JqZWN0cykuZm9yRWFjaCgob2JqKSA9PiB0aGlzLmRlc3Ryb3kob2JqLCBwYXJlbnQpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxvY2FsU3RhdGUubm9uT2JqZWN0cykge1xuICAgICAgICAgICAgICAgIHVudHJhY2tlZChsb2NhbFN0YXRlLm5vbk9iamVjdHMpLmZvckVhY2goKG9iaikgPT4gdGhpcy5kZXN0cm95KG9iaiwgcGFyZW50KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsb2NhbFN0YXRlLmFmdGVyVXBkYXRlKSBsb2NhbFN0YXRlLmFmdGVyVXBkYXRlLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICBpZiAobG9jYWxTdGF0ZS5hZnRlckF0dGFjaCkgbG9jYWxTdGF0ZS5hZnRlckF0dGFjaC5jb21wbGV0ZSgpO1xuXG4gICAgICAgICAgICBkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnb2JqZWN0cyddO1xuICAgICAgICAgICAgZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ25vbk9iamVjdHMnXTtcbiAgICAgICAgICAgIGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWyduYXRpdmVQcm9wcyddO1xuICAgICAgICAgICAgZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FkZCddO1xuICAgICAgICAgICAgZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ3JlbW92ZSddO1xuICAgICAgICAgICAgZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FmdGVyVXBkYXRlJ107XG4gICAgICAgICAgICBkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnYWZ0ZXJBdHRhY2gnXTtcbiAgICAgICAgICAgIGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydzdG9yZSddO1xuICAgICAgICAgICAgZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2hhbmRsZXJzJ107XG5cbiAgICAgICAgICAgIGlmICghbG9jYWxTdGF0ZS5wcmltaXRpdmUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgKG5vZGUgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfXyddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbW1lbnQnKSB7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9IG51bGwhO1xuICAgICAgICAgICAgZGVsZXRlIChub2RlIGFzIE5ndEFueVJlY29yZClbU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVF07XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2NvbW1lbnRzLmZpbmRJbmRleCgoY29tbWVudCkgPT4gY29tbWVudCA9PT0gbm9kZSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NvbW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAncG9ydGFsJykge1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0gPSBudWxsITtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wb3J0YWxzLmZpbmRJbmRleCgocG9ydGFsKSA9PiBwb3J0YWwgPT09IG5vZGUpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcnRhbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcpIHtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSA9IHVuZGVmaW5lZCE7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc10gPSBudWxsITtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXSA9IG51bGwhO1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlT3BlcmF0aW9uKG5vZGUsICdjbGVhblVwJyk7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmNsZWFyKCk7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdID0gbnVsbCE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0pIHtcbiAgICAgICAgICAgIC8vIG51bGxpZnkgcmVmXG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucmVmXS5uYXRpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yZWZdID0gdW5kZWZpbmVkITtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG51bGxpZnkgcGFyZW50XG4gICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCByZW5kZXJDaGlsZCBvZiByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAocmVuZGVyQ2hpbGQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgJiYgcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlVGhyZWVDaGlsZChwYXJlbnQsIHJlbmRlckNoaWxkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVzdHJveShyZW5kZXJDaGlsZCwgcGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0gPSBbXTtcbiAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0gPSB0cnVlO1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKHBhcmVudCwgbm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjdXBkYXRlTmF0aXZlUHJvcHMobm9kZTogTmd0SW5zdGFuY2VOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUobm9kZSk7XG4gICAgICAgIGlmICghbG9jYWxTdGF0ZSB8fCAhbG9jYWxTdGF0ZS5uYXRpdmVQcm9wcykgcmV0dXJuO1xuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICBsb2NhbFN0YXRlLm5hdGl2ZVByb3BzLnNldCh7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgICNmaXJzdE5vbkluamVjdGVkRGlyZWN0aXZlPFQgZXh0ZW5kcyBOZ3RDb21tb25EaXJlY3RpdmU+KGRpcjogVHlwZTxUPikge1xuICAgICAgICBsZXQgZGlyZWN0aXZlOiBUIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBpID0gdGhpcy4jY29tbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgd2hpbGUgKGkgPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuI2NvbW1lbnRzW2ldO1xuICAgICAgICAgICAgaWYgKGNvbW1lbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkge1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGluamVjdG9yID0gY29tbWVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldKCk7XG4gICAgICAgICAgICBpZiAoIWluamVjdG9yKSB7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBpbmplY3Rvci5nZXQoZGlyLCBudWxsKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS52YWxpZGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlID0gaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfVxuXG4gICAgI3RyeUdldFBvcnRhbFN0b3JlKCkge1xuICAgICAgICBsZXQgc3RvcmU6IE5ndFN0b3JlIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIHBvcnRhbCBzdGF0ZXMgYmVjYXVzZSBOZ3RTdG9yZSBvbmx5IGRpZmZlcnMgcGVyIFBvcnRhbFxuICAgICAgICBsZXQgaSA9IHRoaXMucG9ydGFscy5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAoaSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIHBvcnRhbCBzdGF0ZSBiYWNrd2FyZHMgdG8gZmluZCB0aGUgY2xvc2VzdCBOZ3RTdG9yZVxuICAgICAgICAgICAgY29uc3QgcG9ydGFsID0gdGhpcy5wb3J0YWxzW2ldO1xuICAgICAgICAgICAgaWYgKHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSB7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbmplY3RvciA9IHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldKCk7XG4gICAgICAgICAgICBpZiAoIWluamVjdG9yKSB7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBpbmplY3Rvci5nZXQoTmd0U3RvcmUsIG51bGwpO1xuICAgICAgICAgICAgLy8gb25seSB0aGUgaW5zdGFuY2Ugd2l0aCBwcmV2aW91c1N0b3JlIHNob3VsZCBwYXNzXG4gICAgICAgICAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuZ2V0KCdwcmV2aW91c1N0b3JlJykpIHtcbiAgICAgICAgICAgICAgICBzdG9yZSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdG9yZSB8fCB0aGlzLnJvb3QhLnN0b3JlO1xuICAgIH1cbn1cbiJdfQ==
405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFrQixZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBd0IsTUFBTSxhQUFhLENBQUM7QUFFbEUsT0FBTyxFQUFFLFNBQVMsRUFBaUIsTUFBTSxVQUFVLENBQUM7QUFFcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9FLE9BQU8sRUFBNkQsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFeEgsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQVcscUJBQXFCLENBQUMsQ0FBQztBQWdDekYsTUFBTSxPQUFPLGdCQUFnQjtJQUc1QixZQUFvQixJQUEwQjtRQUExQixTQUFJLEdBQUosSUFBSSxDQUFzQjtRQUZ0QyxhQUFRLEdBQUcsRUFBNEIsQ0FBQztJQUVDLENBQUM7SUFFbEQsVUFBVSxDQUFDLElBQStDLEVBQUUsSUFBa0I7UUFDN0UsTUFBTSxLQUFLLEdBQUc7WUFDYixJQUFJO1lBQ0osSUFBSTtZQUNKLElBQUk7WUFDSixFQUFFO1lBQ0YsS0FBSztZQUNMLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZ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QUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUM3QyxLQUFLLEdBQUcsUUFBUSxDQUFDO2dCQUNqQixNQUFNO2FBQ047WUFDRCxDQUFDLEVBQUUsQ0FBQztTQUNKO1FBRUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFLLENBQUMsS0FBSyxDQUFDO0lBQ2xDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuLCBJbmplY3RvciwgVHlwZSwgZ2V0RGVidWdOb2RlLCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ndEFyZ3MgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2FyZ3MnO1xuaW1wb3J0IHR5cGUgeyBOZ3RDb21tb25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NvbW1vbic7XG5pbXBvcnQgeyBOZ3RQYXJlbnQgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3BhcmVudCc7XG5pbXBvcnQgeyBnZXRMb2NhbFN0YXRlLCB0eXBlIE5ndEluc3RhbmNlTm9kZSB9IGZyb20gJy4uL2luc3RhbmNlJztcbmltcG9ydCB0eXBlIHsgTmd0UmVmIH0gZnJvbSAnLi4vcmVmJztcbmltcG9ydCB7IE5HVF9TVE9SRSwgdHlwZSBOZ3RTdGF0ZSB9IGZyb20gJy4uL3N0b3JlJztcbmltcG9ydCB0eXBlIHsgTmd0QW55UmVjb3JkIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgYXBwbHlQcm9wcyB9IGZyb20gJy4uL3V0aWxzL2FwcGx5LXByb3BzJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi4vdXRpbHMvaXMnO1xuaW1wb3J0IHR5cGUgeyBOZ3RTaWduYWxTdG9yZSB9IGZyb20gJy4uL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyBTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5ULCBTUEVDSUFMX1BST1BFUlRJRVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBOZ3RDb21wb3VuZENsYXNzSWQsIE5ndFF1ZXVlT3BDbGFzc0lkLCBOZ3RSZW5kZXJlckNsYXNzSWQsIGF0dGFjaFRocmVlQ2hpbGQsIHJlbW92ZVRocmVlQ2hpbGQgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IE5HVF9DT01QT1VORF9QUkVGSVhFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmdbXT4oJ05ndENvbXBvdW5kUHJlZml4ZXMnKTtcblxudHlwZSBOZ3RSZW5kZXJlclJvb3RTdGF0ZSA9IHtcblx0c3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPjtcblx0Y29tcG91bmRQcmVmaXhlczogc3RyaW5nW107XG5cdGRvY3VtZW50OiBEb2N1bWVudDtcblx0cG9ydGFsczogQXJyYXk8Tmd0UmVuZGVyZXJOb2RlPjtcbn07XG5cbnR5cGUgTmd0UXVldWVPcCA9IFt0eXBlOiAnb3AnIHwgJ2NsZWFuVXAnLCBvcDogKCkgPT4gdm9pZCwgZG9uZT86IHRydWVdO1xuXG5leHBvcnQgdHlwZSBOZ3RSZW5kZXJlclN0YXRlID0gW1xuXHR0eXBlOiAndGhyZWUnIHwgJ2NvbXBvdW5kJyB8ICdwb3J0YWwnIHwgJ2NvbW1lbnQnIHwgJ2RvbScsXG5cdHBhcmVudDogTmd0UmVuZGVyZXJOb2RlIHwgbnVsbCxcblx0aW5qZWN0ZWRQYXJlbnQ6IE5ndFJlZjxOZ3RSZW5kZXJlck5vZGU+IHwgbnVsbCxcblx0Y2hpbGRyZW46IE5ndFJlbmRlcmVyTm9kZVtdLFxuXHRkZXN0cm95ZWQ6IGJvb2xlYW4sXG5cdGNvbXBvdW5kOiBbYXBwbHlGaXJzdDogYm9vbGVhbiwgcHJvcHM6IE5ndEFueVJlY29yZF0sXG5cdGNvbXBvdW5kUGFyZW50OiBOZ3RSZW5kZXJlck5vZGUsXG5cdGNvbXBvdW5kZWQ6IE5ndFJlbmRlcmVyTm9kZSxcblx0cXVldWVPcHM6IFNldDxOZ3RRdWV1ZU9wPixcblx0YXR0cmlidXRlczogTmd0QW55UmVjb3JkLFxuXHRwcm9wZXJ0aWVzOiBOZ3RBbnlSZWNvcmQsXG5cdHJhd1ZhbHVlOiBhbnksXG5cdHJlZjogYW55LFxuXHRwb3J0YWxDb250YWluZXI6IE5ndFJlbmRlcmVyTm9kZSxcblx0aW5qZWN0b3JGYWN0b3J5OiAoKSA9PiBJbmplY3Rvcixcbl07XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlcmVyTm9kZSA9IHtcblx0X19uZ3RfcmVuZGVyZXJfXzogTmd0UmVuZGVyZXJTdGF0ZTtcbn07XG5leHBvcnQgY2xhc3MgTmd0UmVuZGVyZXJTdG9yZSB7XG5cdHByaXZhdGUgY29tbWVudHMgPSBbXSBhcyBBcnJheTxOZ3RSZW5kZXJlck5vZGU+O1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgcm9vdDogTmd0UmVuZGVyZXJSb290U3RhdGUpIHt9XG5cblx0Y3JlYXRlTm9kZSh0eXBlOiBOZ3RSZW5kZXJlclN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSwgbm9kZTogTmd0QW55UmVjb3JkKSB7XG5cdFx0Y29uc3Qgc3RhdGUgPSBbXG5cdFx0XHR0eXBlLFxuXHRcdFx0bnVsbCxcblx0XHRcdG51bGwsXG5cdFx0XHRbXSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRdIGFzIE5ndFJlbmRlcmVyU3RhdGU7XG5cblx0XHRjb25zdCByZW5kZXJlck5vZGUgPSBPYmplY3QuYXNzaWduKG5vZGUsIHsgX19uZ3RfcmVuZGVyZXJfXzogc3RhdGUgfSk7XG5cblx0XHQvLyBOT1RFOiBhc3NpZ24gb3duZXJEb2N1bWVudCB0byBub2RlIHNvIHdlIGNhbiB1c2UgSG9zdExpc3RlbmVyIGluIENvbXBvbmVudFxuXHRcdGlmICghcmVuZGVyZXJOb2RlWydvd25lckRvY3VtZW50J10pIHJlbmRlcmVyTm9kZVsnb3duZXJEb2N1bWVudCddID0gdGhpcy5yb290LmRvY3VtZW50O1xuXG5cdFx0Ly8gTk9URTogYXNzaWduIGluamVjdG9yRmFjdG9yeSBvbiBub24tdGhyZWUgdHlwZSBzaW5jZVxuXHRcdC8vIHJlbmRlcmVyTm9kZSBpcyBhbiBpbnN0YW5jZSBvZiBET00gTm9kZVxuXHRcdGlmIChzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICd0aHJlZScpIHtcblx0XHRcdHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldID0gKCkgPT4gZ2V0RGVidWdOb2RlKHJlbmRlcmVyTm9kZSkhLmluamVjdG9yO1xuXHRcdH1cblxuXHRcdGlmIChzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21tZW50Jykge1xuXHRcdFx0Ly8gTk9URTogd2UgYXR0YWNoIGFuIGFycm93IGZ1bmN0aW9uIHRvIHRoZSBDb21tZW50IG5vZGVcblx0XHRcdC8vIEluIG91ciBkaXJlY3RpdmVzLCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHRoZW4gc3RhcnQgdHJhY2tpbmcgdGhlIFJlbmRlcmVyTm9kZVxuXHRcdFx0Ly8gdGhpcyBpcyBkb25lIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgTm9kZXMgd2UgbmVlZCB0byBwcm9jZXNzIGZvciBnZXRDcmVhdGlvblN0YXRlXG5cdFx0XHRyZW5kZXJlck5vZGVbU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVF0gPSAobm9kZT86IE5ndFJlbmRlcmVyTm9kZSkgPT4ge1xuXHRcdFx0XHRpZiAobm9kZSAmJiBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAncG9ydGFsJykge1xuXHRcdFx0XHRcdHRoaXMucG9ydGFscy5wdXNoKG5vZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuY29tbWVudHMucHVzaChyZW5kZXJlck5vZGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHJlbmRlcmVyTm9kZTtcblx0XHR9XG5cblx0XHRpZiAoc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnKSB7XG5cdFx0XHRzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdID0gbmV3IFNldCgpO1xuXHRcdFx0c3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmF0dHJpYnV0ZXNdID0ge307XG5cdFx0XHRzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc10gPSB7fTtcblx0XHRcdHJldHVybiByZW5kZXJlck5vZGU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlbmRlcmVyTm9kZTtcblx0fVxuXG5cdHNldFBhcmVudChub2RlOiBOZ3RSZW5kZXJlck5vZGUsIHBhcmVudDogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0aWYgKCFub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0pIHtcblx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSA9IHBhcmVudDtcblx0XHR9XG5cdH1cblxuXHRhZGRDaGlsZChub2RlOiBOZ3RSZW5kZXJlck5vZGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRpZiAoIW5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLmluY2x1ZGVzKGNoaWxkKSkge1xuXHRcdFx0bm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0ucHVzaChjaGlsZCk7XG5cdFx0fVxuXHR9XG5cblx0cmVtb3ZlQ2hpbGQobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBjaGlsZDogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0Y29uc3QgaW5kZXggPSBub2RlLl9fbmd0X3JlbmRlcmVyX18/LltOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLmZpbmRJbmRleCgoYykgPT4gY2hpbGQgPT09IGMpO1xuXHRcdGlmIChpbmRleCA+PSAwKSB7XG5cdFx0XHRub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXS5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH1cblx0fVxuXG5cdHNldENvbXBvdW5kKGNvbXBvdW5kOiBOZ3RSZW5kZXJlck5vZGUsIGluc3RhbmNlOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBpbnN0YW5jZVJTID0gaW5zdGFuY2UuX19uZ3RfcmVuZGVyZXJfXztcblxuXHRcdGlmIChpbnN0YW5jZVJTICYmIGluc3RhbmNlUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0pIHtcblx0XHRcdGNvbnN0IHBhcmVudFJTID0gaW5zdGFuY2VSU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdFx0Ly8gTk9URTogaWYgaW5zdGFuY2UgaXMgYWxyZWFkeSBjb21wb3VuZGVkIGJ5IGl0cyBwYXJlbnQuIHNraXBcblx0XHRcdGlmIChcblx0XHRcdFx0cGFyZW50UlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnICYmXG5cdFx0XHRcdHBhcmVudFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSA9PT0gaW5zdGFuY2Vcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgclMgPSBjb21wb3VuZC5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSA9IGluc3RhbmNlO1xuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3Qua2V5cyhyU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc10pO1xuXHRcdGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhyU1tOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc10pO1xuXG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgYXR0cmlidXRlcykge1xuXHRcdFx0dGhpcy5hcHBseUF0dHJpYnV0ZShpbnN0YW5jZSwga2V5LCByU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc11ba2V5XSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgcHJvcGVydGllcykge1xuXHRcdFx0dGhpcy5hcHBseVByb3BlcnR5KGluc3RhbmNlLCBrZXksIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXVtrZXldKTtcblx0XHR9XG5cblx0XHR0aGlzLmV4ZWN1dGVPcGVyYXRpb24oY29tcG91bmQpO1xuXHR9XG5cblx0cXVldWVPcGVyYXRpb24obm9kZTogTmd0UmVuZGVyZXJOb2RlLCBvcDogTmd0UXVldWVPcCkge1xuXHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmFkZChvcCk7XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVPcGVyYXRpb24obm9kZTogTmd0UmVuZGVyZXJOb2RlLCB0eXBlOiBOZ3RRdWV1ZU9wW05ndFF1ZXVlT3BDbGFzc0lkLnR5cGVdID0gJ29wJykge1xuXHRcdGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdPy5zaXplKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmZvckVhY2goKG9wKSA9PiB7XG5cdFx0XHRcdGlmIChvcFtOZ3RRdWV1ZU9wQ2xhc3NJZC50eXBlXSA9PT0gdHlwZSkge1xuXHRcdFx0XHRcdG9wW05ndFF1ZXVlT3BDbGFzc0lkLm9wXSgpO1xuXHRcdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uZGVsZXRlKG9wKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0cHJvY2Vzc1BvcnRhbENvbnRhaW5lcihwb3J0YWw6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IGluamVjdG9yRmFjdG9yeSA9IHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldO1xuXHRcdGNvbnN0IGluamVjdG9yID0gaW5qZWN0b3JGYWN0b3J5Py4oKTtcblx0XHRpZiAoIWluamVjdG9yKSByZXR1cm47XG5cblx0XHRjb25zdCBwb3J0YWxTdG9yZSA9IGluamVjdG9yLmdldChOR1RfU1RPUkUsIG51bGwpO1xuXHRcdGlmICghcG9ydGFsU3RvcmUpIHJldHVybjtcblxuXHRcdGNvbnN0IHBvcnRhbENvbnRhaW5lciA9IHBvcnRhbFN0b3JlLmdldCgnc2NlbmUnKTtcblx0XHRpZiAoIXBvcnRhbENvbnRhaW5lcikgcmV0dXJuO1xuXG5cdFx0cG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0gPSB0aGlzLmNyZWF0ZU5vZGUoJ3RocmVlJywgcG9ydGFsQ29udGFpbmVyKTtcblx0fVxuXG5cdGFwcGx5QXR0cmlidXRlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSByZXR1cm47XG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5SRU5ERVJfUFJJT1JJVFkpIHtcblx0XHRcdC8vIE5PVEU6IHByaW9yaXR5IG5lZWRzIHRvIGJlIHNldCBhcyBhbiBhdHRyaWJ1dGUgc3RyaW5nIHNvIHRoYXQgdGhleSBjYW4gYmUgc2V0IGFzIGVhcmx5IGFzIHBvc3NpYmxlXG5cdFx0XHQvLyB3ZSBjb252ZXJ0IHRoYXQgc3RyaW5nIHRvIGEgbnVtYmVyLiBpZiBpdCdzIGludmFsaWQsIGRlZmF1bHQgMFxuXHRcdFx0bGV0IHByaW9yaXR5ID0gTnVtYmVyKHZhbHVlKTtcblx0XHRcdGlmIChpc05hTihwcmlvcml0eSkpIHtcblx0XHRcdFx0cHJpb3JpdHkgPSAwO1xuXHRcdFx0XHRjb25zb2xlLndhcm4oYFtOR1RdIFwicHJpb3JpdHlcIiBpcyBhbiBpbnZhbGlkIG51bWJlciwgZGVmYXVsdCB0byAwYCk7XG5cdFx0XHR9XG5cdFx0XHRnZXRMb2NhbFN0YXRlKG5vZGUpLnByaW9yaXR5ID0gcHJpb3JpdHk7XG5cdFx0fVxuXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5DT01QT1VORCkge1xuXHRcdFx0Ly8gTk9URTogd2Ugc2V0IHRoZSBjb21wb3VuZCBwcm9wZXJ0eSBvbiBpbnN0YW5jZSBub2RlIG5vdyBzbyB3ZSBrbm93IHRoYXQgdGhpcyBpbnN0YW5jZSBpcyBiZWluZyBjb21wb3VuZGVkXG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdID0gW3ZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ2ZpcnN0Jywge31dO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuQVRUQUNIKSB7XG5cdFx0XHQvLyBOT1RFOiBoYW5kbGUgYXR0YWNoIGFzIHRyaW5nXG5cdFx0XHRjb25zdCBwYXRocyA9IHZhbHVlLnNwbGl0KCcuJyk7XG5cdFx0XHRpZiAocGF0aHMubGVuZ3RoKSBnZXRMb2NhbFN0YXRlKG5vZGUpLmF0dGFjaCA9IHBhdGhzO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuVkFMVUUpIHtcblx0XHRcdC8vIE5PVEU6IGNvZXJjaW9uXG5cdFx0XHRsZXQgbWF5YmVDb2VyY2VkOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuID0gdmFsdWU7XG5cdFx0XHRpZiAobWF5YmVDb2VyY2VkID09PSAnJyB8fCBtYXliZUNvZXJjZWQgPT09ICd0cnVlJyB8fCBtYXliZUNvZXJjZWQgPT09ICdmYWxzZScpIHtcblx0XHRcdFx0bWF5YmVDb2VyY2VkID0gbWF5YmVDb2VyY2VkID09PSAndHJ1ZScgfHwgbWF5YmVDb2VyY2VkID09PSAnJztcblx0XHRcdH0gZWxzZSBpZiAoIWlzTmFOKE51bWJlcihtYXliZUNvZXJjZWQpKSkge1xuXHRcdFx0XHRtYXliZUNvZXJjZWQgPSBOdW1iZXIobWF5YmVDb2VyY2VkKTtcblx0XHRcdH1cblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yYXdWYWx1ZV0gPSBtYXliZUNvZXJjZWQ7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0YXBwbHlQcm9wcyhub2RlLCB7IFtuYW1lXTogdmFsdWUgfSk7XG5cdFx0dGhpcy51cGRhdGVOYXRpdmVQcm9wcyhub2RlLCBuYW1lLCB2YWx1ZSk7XG5cdH1cblxuXHRhcHBseVByb3BlcnR5KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSByZXR1cm47XG5cblx0XHQvLyBbcmVmXVxuXHRcdGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuUkVGICYmIGlzLnJlZih2YWx1ZSkpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yZWZdID0gdmFsdWU7XG5cdFx0XHR2YWx1ZS5uYXRpdmVFbGVtZW50ID0gbm9kZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnQgPSBnZXRMb2NhbFN0YXRlKG5vZGUpLnBhcmVudCgpIHx8IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXG5cdFx0Ly8gW3Jhd1ZhbHVlXVxuXHRcdGlmIChnZXRMb2NhbFN0YXRlKG5vZGUpLmlzUmF3ICYmIG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5WQUxVRSkge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSA9IHZhbHVlO1xuXHRcdFx0aWYgKHBhcmVudCkgYXR0YWNoVGhyZWVDaGlsZChwYXJlbnQsIG5vZGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFthdHRhY2hdXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5BVFRBQ0gpIHtcblx0XHRcdGdldExvY2FsU3RhdGUobm9kZSkuYXR0YWNoID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoKHYpID0+IHYudG9TdHJpbmcoKSkgOiB2YWx1ZTtcblx0XHRcdGlmIChwYXJlbnQpIGF0dGFjaFRocmVlQ2hpbGQocGFyZW50LCBub2RlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBjb21wb3VuZCA9IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF07XG5cdFx0aWYgKFxuXHRcdFx0Y29tcG91bmQ/LltOZ3RDb21wb3VuZENsYXNzSWQucHJvcHNdICYmXG5cdFx0XHRuYW1lIGluIGNvbXBvdW5kW05ndENvbXBvdW5kQ2xhc3NJZC5wcm9wc10gJiZcblx0XHRcdCFjb21wb3VuZFtOZ3RDb21wb3VuZENsYXNzSWQuYXBwbHlGaXJzdF1cblx0XHQpIHtcblx0XHRcdHZhbHVlID0gY29tcG91bmRbTmd0Q29tcG91bmRDbGFzc0lkLnByb3BzXVtuYW1lXTtcblx0XHR9XG5cdFx0YXBwbHlQcm9wcyhub2RlLCB7IFtuYW1lXTogdmFsdWUgfSk7XG5cdFx0dGhpcy51cGRhdGVOYXRpdmVQcm9wcyhub2RlLCBuYW1lLCB2YWx1ZSk7XG5cdH1cblxuXHRpc0NvbXBvdW5kKG5hbWU6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLnJvb3QuY29tcG91bmRQcmVmaXhlcy5zb21lKChwcmVmaXgpID0+IG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKTtcblx0fVxuXG5cdGlzRE9NKG5vZGU6IE5ndEFueVJlY29yZCkge1xuXHRcdGNvbnN0IHJTID0gbm9kZVsnX19uZ3RfcmVuZGVyZXJfXyddO1xuXHRcdHJldHVybiAoXG5cdFx0XHQhclMgfHxcblx0XHRcdChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICdjb21wb3VuZCcgJiZcblx0XHRcdFx0KG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBub2RlIGluc3RhbmNlb2YgV2luZG93KSlcblx0XHQpO1xuXHR9XG5cblx0Z2V0IHJvb3RTY2VuZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5yb290LnN0b3JlLmdldCgnc2NlbmUnKTtcblx0fVxuXG5cdGdldCBwb3J0YWxzKCkge1xuXHRcdHJldHVybiB0aGlzLnJvb3QucG9ydGFscztcblx0fVxuXG5cdGdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2Uobm9kZTogTmd0UmVuZGVyZXJOb2RlKTogTmd0UmVuZGVyZXJOb2RlIHwgbnVsbCB7XG5cdFx0bGV0IHBhcmVudCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcblx0XHR3aGlsZSAocGFyZW50ICYmIHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ3RocmVlJykge1xuXHRcdFx0cGFyZW50ID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl1cblx0XHRcdFx0PyBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXVxuXHRcdFx0XHQ6IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXHRcdH1cblxuXHRcdHJldHVybiBwYXJlbnQ7XG5cdH1cblxuXHRnZXRDbG9zZXN0UGFyZW50V2l0aENvbXBvdW5kKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGlmIChub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSkge1xuXHRcdFx0cmV0dXJuIG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdO1xuXHRcdH1cblxuXHRcdGxldCBwYXJlbnQgPSBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0aWYgKFxuXHRcdFx0cGFyZW50ICYmXG5cdFx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiZcblx0XHRcdCFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF1cblx0XHQpIHtcblx0XHRcdHJldHVybiBwYXJlbnQ7XG5cdFx0fVxuXG5cdFx0d2hpbGUgKFxuXHRcdFx0cGFyZW50ICYmXG5cdFx0XHQocGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnIHx8XG5cdFx0XHRcdCFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdIHx8XG5cdFx0XHRcdHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ2NvbXBvdW5kJylcblx0XHQpIHtcblx0XHRcdHBhcmVudCA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXHRcdH1cblxuXHRcdGlmICghcGFyZW50KSByZXR1cm47XG5cblx0XHRpZiAoXG5cdFx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgJiZcblx0XHRcdHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF1cblx0XHQpIHtcblx0XHRcdHJldHVybiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdO1xuXHRcdH1cblxuXHRcdGlmICghcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdKSB7XG5cdFx0XHRyZXR1cm4gcGFyZW50O1xuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Z2V0Q3JlYXRpb25TdGF0ZSgpIHtcblx0XHRjb25zdCBpbmplY3RlZEFyZ3MgPSB0aGlzLmZpcnN0Tm9uSW5qZWN0ZWREaXJlY3RpdmUoTmd0QXJncyk/LmFyZ3MgfHwgW107XG5cdFx0Y29uc3QgaW5qZWN0ZWRQYXJlbnQgPSB0aGlzLmZpcnN0Tm9uSW5qZWN0ZWREaXJlY3RpdmUoTmd0UGFyZW50KT8ucGFyZW50IHx8IG51bGw7XG5cdFx0Y29uc3Qgc3RvcmUgPSB0aGlzLnRyeUdldFBvcnRhbFN0b3JlKCk7XG5cdFx0cmV0dXJuIHsgaW5qZWN0ZWRBcmdzLCBpbmplY3RlZFBhcmVudCwgc3RvcmUgfTtcblx0fVxuXG5cdGRlc3Ryb3kobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBwYXJlbnQ/OiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcblx0XHRpZiAoIXJTIHx8IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSByZXR1cm47XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXSA9IHVuZGVmaW5lZCE7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdID0gdW5kZWZpbmVkITtcblxuXHRcdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUobm9kZSk7XG5cdFx0XHRpZiAobG9jYWxTdGF0ZS5vYmplY3RzKSB7XG5cdFx0XHRcdHVudHJhY2tlZChsb2NhbFN0YXRlLm9iamVjdHMpLmZvckVhY2goKG9iaikgPT4gdGhpcy5kZXN0cm95KG9iaiwgcGFyZW50KSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsb2NhbFN0YXRlLm5vbk9iamVjdHMpIHtcblx0XHRcdFx0dW50cmFja2VkKGxvY2FsU3RhdGUubm9uT2JqZWN0cykuZm9yRWFjaCgob2JqKSA9PiB0aGlzLmRlc3Ryb3kob2JqLCBwYXJlbnQpKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGxvY2FsU3RhdGUuYWZ0ZXJVcGRhdGUpIGxvY2FsU3RhdGUuYWZ0ZXJVcGRhdGUuY29tcGxldGUoKTtcblx0XHRcdGlmIChsb2NhbFN0YXRlLmFmdGVyQXR0YWNoKSBsb2NhbFN0YXRlLmFmdGVyQXR0YWNoLmNvbXBsZXRlKCk7XG5cblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydvYmplY3RzJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnbm9uT2JqZWN0cyddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ25hdGl2ZVByb3BzJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnYWRkJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsncmVtb3ZlJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnYWZ0ZXJVcGRhdGUnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydhZnRlckF0dGFjaCddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ3N0b3JlJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnaGFuZGxlcnMnXTtcblxuXHRcdFx0aWYgKCFsb2NhbFN0YXRlLnByaW1pdGl2ZSkge1xuXHRcdFx0XHRkZWxldGUgKG5vZGUgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfXyddO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21tZW50Jykge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0gPSBudWxsITtcblx0XHRcdGRlbGV0ZSAobm9kZSBhcyBOZ3RBbnlSZWNvcmQpW1NQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlRdO1xuXHRcdFx0Y29uc3QgaW5kZXggPSB0aGlzLmNvbW1lbnRzLmZpbmRJbmRleCgoY29tbWVudCkgPT4gY29tbWVudCA9PT0gbm9kZSk7XG5cdFx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0XHR0aGlzLmNvbW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3BvcnRhbCcpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldID0gbnVsbCE7XG5cdFx0XHRjb25zdCBpbmRleCA9IHRoaXMucG9ydGFscy5maW5kSW5kZXgoKHBvcnRhbCkgPT4gcG9ydGFsID09PSBub2RlKTtcblx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdHRoaXMucG9ydGFscy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSA9IHVuZGVmaW5lZCE7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc10gPSBudWxsITtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXSA9IG51bGwhO1xuXHRcdFx0dGhpcy5leGVjdXRlT3BlcmF0aW9uKG5vZGUsICdjbGVhblVwJyk7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmNsZWFyKCk7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdID0gbnVsbCE7XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yZWZdKSB7XG5cdFx0XHQvLyBudWxsaWZ5IHJlZlxuXHRcdFx0Ly8gYnV0IHdlIGRvIGl0IGxhdGVyIHNvIHRoYXQgaXQgZG9lc24ndCBoaW5kZXIgcmVuZGVyXG5cdFx0XHQvLyBUT0RPOiB3aWxsIHRoaXMgY2F1c2UgbWVtb3J5IGxlYWs/XG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHRcdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmVmXS5uYXRpdmVFbGVtZW50ID0gbnVsbDtcblx0XHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0gPSB1bmRlZmluZWQhO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gbnVsbGlmeSBwYXJlbnRcblx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSA9IG51bGw7XG5cdFx0Zm9yIChjb25zdCByZW5kZXJDaGlsZCBvZiByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dIHx8IFtdKSB7XG5cdFx0XHRpZiAocmVuZGVyQ2hpbGQuX19uZ3RfcmVuZGVyZXJfXz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJiBwYXJlbnQpIHtcblx0XHRcdFx0cmVtb3ZlVGhyZWVDaGlsZChwYXJlbnQsIHJlbmRlckNoaWxkLCB0cnVlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZGVzdHJveShyZW5kZXJDaGlsZCwgcGFyZW50KTtcblx0XHR9XG5cblx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dID0gW107XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0gPSB0cnVlO1xuXHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdHRoaXMucmVtb3ZlQ2hpbGQocGFyZW50LCBub2RlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZU5hdGl2ZVByb3BzKG5vZGU6IE5ndEluc3RhbmNlTm9kZSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcblx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShub2RlKTtcblx0XHRpZiAoIWxvY2FsU3RhdGUgfHwgIWxvY2FsU3RhdGUubmF0aXZlUHJvcHMpIHJldHVybjtcblx0XHRsb2NhbFN0YXRlLm5hdGl2ZVByb3BzLnNldCh7IFtrZXldOiB2YWx1ZSB9KTtcblx0fVxuXG5cdHByaXZhdGUgZmlyc3ROb25JbmplY3RlZERpcmVjdGl2ZTxUIGV4dGVuZHMgTmd0Q29tbW9uRGlyZWN0aXZlPihkaXI6IFR5cGU8VD4pIHtcblx0XHRsZXQgZGlyZWN0aXZlOiBUIHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgZGVzdHJveWVkID0gW107XG5cblx0XHRsZXQgaSA9IHRoaXMuY29tbWVudHMubGVuZ3RoIC0gMTtcblx0XHR3aGlsZSAoaSA+PSAwKSB7XG5cdFx0XHRjb25zdCBjb21tZW50ID0gdGhpcy5jb21tZW50c1tpXTtcblx0XHRcdGlmIChjb21tZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHtcblx0XHRcdFx0ZGVzdHJveWVkLnB1c2goaSk7XG5cdFx0XHRcdGktLTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpbmplY3RvciA9IGNvbW1lbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSgpO1xuXHRcdFx0aWYgKCFpbmplY3Rvcikge1xuXHRcdFx0XHRpLS07XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBpbmplY3Rvci5nZXQoZGlyLCBudWxsKTtcblx0XHRcdGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS52YWxpZGF0ZSgpKSB7XG5cdFx0XHRcdGRpcmVjdGl2ZSA9IGluc3RhbmNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0aS0tO1xuXHRcdH1cblxuXHRcdGRlc3Ryb3llZC5mb3JFYWNoKChpbmRleCkgPT4ge1xuXHRcdFx0dGhpcy5jb21tZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGRpcmVjdGl2ZTtcblx0fVxuXG5cdHByaXZhdGUgdHJ5R2V0UG9ydGFsU3RvcmUoKSB7XG5cdFx0bGV0IHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4gfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgZGVzdHJveWVkID0gW107XG5cdFx0Ly8gd2Ugb25seSBjYXJlIGFib3V0IHRoZSBwb3J0YWwgc3RhdGVzIGJlY2F1c2UgTmd0U3RvcmUgb25seSBkaWZmZXJzIHBlciBQb3J0YWxcblx0XHRsZXQgaSA9IHRoaXMucG9ydGFscy5sZW5ndGggLSAxO1xuXHRcdHdoaWxlIChpID49IDApIHtcblx0XHRcdC8vIGxvb3AgdGhyb3VnaCB0aGUgcG9ydGFsIHN0YXRlIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBjbG9zZXN0IE5ndFN0b3JlXG5cdFx0XHRjb25zdCBwb3J0YWwgPSB0aGlzLnBvcnRhbHNbaV07XG5cdFx0XHRpZiAocG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHtcblx0XHRcdFx0ZGVzdHJveWVkLnB1c2goaSk7XG5cdFx0XHRcdGktLTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGluamVjdG9yID0gcG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0oKTtcblx0XHRcdGlmICghaW5qZWN0b3IpIHtcblx0XHRcdFx0aS0tO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGluc3RhbmNlID0gaW5qZWN0b3IuZ2V0KE5HVF9TVE9SRSwgbnVsbCk7XG5cdFx0XHQvLyBvbmx5IHRoZSBpbnN0YW5jZSB3aXRoIHByZXZpb3VzUm9vdCBzaG91bGQgcGFzc1xuXHRcdFx0aWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmdldCgncHJldmlvdXNSb290JykpIHtcblx0XHRcdFx0c3RvcmUgPSBpbnN0YW5jZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpLS07XG5cdFx0fVxuXG5cdFx0ZGVzdHJveWVkLmZvckVhY2goKGluZGV4KSA9PiB7XG5cdFx0XHR0aGlzLnBvcnRhbHMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBzdG9yZSB8fCB0aGlzLnJvb3QhLnN0b3JlO1xuXHR9XG59XG4iXX0=