botframework-webchat 4.14.1 → 4.15.2-main.20220413.af6e8a3

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 (108) hide show
  1. package/.eslintrc.yml +5 -109
  2. package/.prettierrc.yml +1 -1
  3. package/README.md +1 -1
  4. package/lib/AddFullBundle.d.ts.map +1 -1
  5. package/lib/AddFullBundle.js +1 -2
  6. package/lib/FullComposer.d.ts.map +1 -1
  7. package/lib/FullComposer.js +3 -3
  8. package/lib/FullReactWebChat.js +2 -2
  9. package/lib/adaptiveCards/Attachment/AdaptiveCardAttachment.d.ts +1 -1
  10. package/lib/adaptiveCards/Attachment/AdaptiveCardAttachment.d.ts.map +1 -1
  11. package/lib/adaptiveCards/Attachment/AdaptiveCardAttachment.js +3 -1
  12. package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.d.ts +1 -1
  13. package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.d.ts.map +1 -1
  14. package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.js +10 -3
  15. package/lib/adaptiveCards/Attachment/AdaptiveCardContent.js +2 -2
  16. package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.d.ts +3 -2
  17. package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.d.ts.map +1 -1
  18. package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.js +138 -74
  19. package/lib/adaptiveCards/Attachment/AnimationCardContent.d.ts +1 -1
  20. package/lib/adaptiveCards/Attachment/AnimationCardContent.d.ts.map +1 -1
  21. package/lib/adaptiveCards/Attachment/AnimationCardContent.js +3 -1
  22. package/lib/adaptiveCards/Attachment/AudioCardContent.d.ts +1 -1
  23. package/lib/adaptiveCards/Attachment/AudioCardContent.d.ts.map +1 -1
  24. package/lib/adaptiveCards/Attachment/AudioCardContent.js +3 -1
  25. package/lib/adaptiveCards/Attachment/HeroCardContent.d.ts +1 -1
  26. package/lib/adaptiveCards/Attachment/HeroCardContent.d.ts.map +1 -1
  27. package/lib/adaptiveCards/Attachment/HeroCardContent.js +4 -2
  28. package/lib/adaptiveCards/Attachment/OAuthCardContent.d.ts +1 -1
  29. package/lib/adaptiveCards/Attachment/OAuthCardContent.d.ts.map +1 -1
  30. package/lib/adaptiveCards/Attachment/OAuthCardContent.js +3 -1
  31. package/lib/adaptiveCards/Attachment/ReceiptCardContent.d.ts +1 -1
  32. package/lib/adaptiveCards/Attachment/ReceiptCardContent.d.ts.map +1 -1
  33. package/lib/adaptiveCards/Attachment/ReceiptCardContent.js +3 -1
  34. package/lib/adaptiveCards/Attachment/SignInCardContent.d.ts +1 -1
  35. package/lib/adaptiveCards/Attachment/SignInCardContent.d.ts.map +1 -1
  36. package/lib/adaptiveCards/Attachment/SignInCardContent.js +1 -1
  37. package/lib/adaptiveCards/Attachment/ThumbnailCardContent.d.ts +1 -1
  38. package/lib/adaptiveCards/Attachment/ThumbnailCardContent.d.ts.map +1 -1
  39. package/lib/adaptiveCards/Attachment/ThumbnailCardContent.js +3 -1
  40. package/lib/adaptiveCards/Attachment/VideoCardContent.d.ts +1 -1
  41. package/lib/adaptiveCards/Attachment/VideoCardContent.d.ts.map +1 -1
  42. package/lib/adaptiveCards/Attachment/VideoCardContent.js +5 -3
  43. package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.d.ts +3 -0
  44. package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.d.ts.map +1 -1
  45. package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.js +8 -1
  46. package/lib/adaptiveCards/Styles/adaptiveCardHostConfig.js +2 -2
  47. package/lib/adaptiveCards/Styles/createAdaptiveCardsStyleSet.js +2 -2
  48. package/lib/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.d.ts.map +1 -1
  49. package/lib/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.js +26 -29
  50. package/lib/adaptiveCards/normalizeStyleOptions.js +2 -2
  51. package/lib/addVersion.js +2 -2
  52. package/lib/createDirectLineSpeechAdapters.d.ts +1 -1
  53. package/lib/createDirectLineSpeechAdapters.d.ts.map +1 -1
  54. package/lib/createDirectLineSpeechAdapters.js +1 -1
  55. package/lib/createFullStyleSet.d.ts +325 -56
  56. package/lib/createFullStyleSet.d.ts.map +1 -1
  57. package/lib/createFullStyleSet.js +2 -2
  58. package/lib/fullBundleDefaultStyleOptions.js +2 -2
  59. package/lib/index-es5.d.ts +1 -21
  60. package/lib/index-es5.d.ts.map +1 -1
  61. package/lib/index-es5.js +4 -44
  62. package/lib/index-minimal.js +22 -20
  63. package/lib/index.d.ts +30 -8
  64. package/lib/index.d.ts.map +1 -1
  65. package/lib/index.js +11 -8
  66. package/lib/polyfill.d.ts +23 -0
  67. package/lib/polyfill.d.ts.map +1 -0
  68. package/lib/polyfill.js +46 -0
  69. package/lib/renderMarkdown.d.ts.map +1 -1
  70. package/lib/renderMarkdown.js +34 -6
  71. package/lib/speech/CustomAudioInputStream.d.ts.map +1 -1
  72. package/lib/speech/CustomAudioInputStream.js +40 -15
  73. package/lib/speech/bytesPerSample.d.ts.map +1 -1
  74. package/lib/speech/bytesPerSample.js +3 -1
  75. package/lib/speech/createAudioConfig.d.ts.map +1 -1
  76. package/lib/speech/createAudioConfig.js +9 -3
  77. package/lib/speech/createMicrophoneAudioConfigAndAudioContext.d.ts.map +1 -1
  78. package/lib/speech/createMicrophoneAudioConfigAndAudioContext.js +3 -1
  79. package/lib/speech/getUserMedia.d.ts.map +1 -1
  80. package/lib/speech/getUserMedia.js +5 -2
  81. package/package.json +43 -43
  82. package/src/AddFullBundle.tsx +0 -1
  83. package/src/FullComposer.tsx +2 -0
  84. package/src/adaptiveCards/Attachment/AdaptiveCardAttachment.tsx +3 -1
  85. package/src/adaptiveCards/Attachment/AdaptiveCardBuilder.ts +8 -3
  86. package/src/adaptiveCards/Attachment/AdaptiveCardRenderer.tsx +183 -89
  87. package/src/adaptiveCards/Attachment/AnimationCardContent.tsx +3 -1
  88. package/src/adaptiveCards/Attachment/AudioCardContent.tsx +3 -1
  89. package/src/adaptiveCards/Attachment/HeroCardContent.tsx +4 -2
  90. package/src/adaptiveCards/Attachment/OAuthCardContent.tsx +3 -1
  91. package/src/adaptiveCards/Attachment/ReceiptCardContent.tsx +28 -48
  92. package/src/adaptiveCards/Attachment/SignInCardContent.tsx +1 -1
  93. package/src/adaptiveCards/Attachment/ThumbnailCardContent.tsx +3 -1
  94. package/src/adaptiveCards/Attachment/VideoCardContent.tsx +5 -3
  95. package/src/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.ts +8 -0
  96. package/src/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.tsx +0 -1
  97. package/src/createCognitiveServicesSpeechServicesPonyfillFactory.spec.js +2 -3
  98. package/src/createDirectLineSpeechAdapters.ts +1 -1
  99. package/src/index-es5.ts +3 -26
  100. package/src/polyfill.ts +29 -0
  101. package/src/renderMarkdown.ts +40 -4
  102. package/src/speech/CustomAudioInputStream.ts +38 -7
  103. package/src/speech/bytesPerSample.ts +2 -0
  104. package/src/speech/createAudioConfig.spec.js +1 -1
  105. package/src/speech/createAudioConfig.ts +7 -0
  106. package/src/speech/createMicrophoneAudioConfigAndAudioContext.ts +2 -0
  107. package/src/speech/getUserMedia.ts +4 -1
  108. package/.eslintignore +0 -1
@@ -36,23 +36,45 @@ var useDisabled = _botframeworkWebchatComponent.hooks.useDisabled,
36
36
  usePerformCardAction = _botframeworkWebchatComponent.hooks.usePerformCardAction,
37
37
  useRenderMarkdownAsHTML = _botframeworkWebchatComponent.hooks.useRenderMarkdownAsHTML,
38
38
  useScrollToEnd = _botframeworkWebchatComponent.hooks.useScrollToEnd,
39
- useStyleSet = _botframeworkWebchatComponent.hooks.useStyleSet; // eslint-disable-next-line no-undef
40
-
39
+ useStyleSet = _botframeworkWebchatComponent.hooks.useStyleSet;
41
40
  var node_env = undefined || "production";
42
41
 
42
+ function bunchUndos() {
43
+ for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {
44
+ fns[_key] = arguments[_key];
45
+ }
46
+
47
+ return function () {
48
+ return fns.forEach(function (fn) {
49
+ return fn === null || fn === void 0 ? void 0 : fn();
50
+ });
51
+ };
52
+ }
53
+ /**
54
+ * Adds a class to the `HTMLElement`. Returns `true` if the class is added, otherwise, `undefined`.
55
+ */
56
+
57
+
43
58
  function addClass(element, className) {
44
- var classNames = new Set(element.className.split(' '));
59
+ var classList = element.classList;
45
60
 
46
- if (!classNames.has(className)) {
47
- classNames.add(className);
48
- element.className = Array.from(classNames).join(' ');
61
+ if (!classList.contains(className)) {
62
+ classList.add(className);
49
63
  return true;
50
64
  }
51
-
52
- return false;
53
65
  }
66
+ /**
67
+ * Adds a class to the `HTMLElement` and re-add on mutations.
68
+ *
69
+ * @returns {function} A function, when called, will restore to previous state.
70
+ */
71
+
54
72
 
55
73
  function addPersistentClassWithUndo(element, className) {
74
+ if (!element) {
75
+ return;
76
+ }
77
+
56
78
  if (addClass(element, className)) {
57
79
  // After we add the class, keep observing the element to make sure the class is not removed.
58
80
  var observer = new MutationObserver(function () {
@@ -70,12 +92,26 @@ function addPersistentClassWithUndo(element, className) {
70
92
  };
71
93
  }
72
94
  }
95
+ /**
96
+ * Returns `true`, if the object is a plain object and not a class, otherwise, `false`.
97
+ */
98
+
73
99
 
74
100
  function isPlainObject(obj) {
75
101
  return Object.getPrototypeOf(obj) === Object.prototype;
76
102
  }
103
+ /**
104
+ * Sets an attribute.
105
+ *
106
+ * @returns {function} A function, when called, will restore to previous state.
107
+ */
108
+
77
109
 
78
110
  function setAttributeWithUndo(element, qualifiedName, nextValue) {
111
+ if (!element) {
112
+ return;
113
+ }
114
+
79
115
  var value = element.getAttribute(qualifiedName);
80
116
 
81
117
  if (value !== nextValue) {
@@ -85,15 +121,28 @@ function setAttributeWithUndo(element, qualifiedName, nextValue) {
85
121
  };
86
122
  }
87
123
  }
124
+ /**
125
+ * An event handler for disabling event bubbling and propagation.
126
+ */
127
+
88
128
 
89
129
  var disabledHandler = function disabledHandler(event) {
90
130
  event.preventDefault();
91
131
  event.stopImmediatePropagation();
92
132
  event.stopPropagation();
93
133
  };
134
+ /**
135
+ * Listens to event once. Returns a function, when called, will stop listening.
136
+ */
137
+
94
138
 
95
139
  function addEventListenerOnceWithUndo(element, name, handler) {
140
+ if (!element) {
141
+ return;
142
+ }
96
143
  /* eslint-disable-next-line prefer-const */
144
+
145
+
97
146
  var detach;
98
147
 
99
148
  var detachingHandler = function detachingHandler(event) {
@@ -114,15 +163,33 @@ function addEventListenerOnceWithUndo(element, name, handler) {
114
163
  });
115
164
  return detach;
116
165
  }
166
+ /**
167
+ * Listens to event. Returns a function, when called, will stop listening.
168
+ */
169
+
117
170
 
118
171
  function addEventListenerWithUndo(element, name, handler) {
172
+ if (!element) {
173
+ return;
174
+ }
175
+
119
176
  element.addEventListener(name, handler);
120
177
  return function () {
121
178
  return element.removeEventListener(name, handler);
122
179
  };
123
180
  }
181
+ /**
182
+ * Disables an element with undo function.
183
+ *
184
+ * @returns {function} A function, when called, will restore to previous state.
185
+ */
186
+
124
187
 
125
188
  function disableElementWithUndo(element) {
189
+ if (!element) {
190
+ return;
191
+ }
192
+
126
193
  var undoStack = [];
127
194
  var isActive = element === document.activeElement;
128
195
  var tag = element.nodeName.toLowerCase();
@@ -155,15 +222,25 @@ function disableElementWithUndo(element) {
155
222
  break;
156
223
  }
157
224
 
158
- return function () {
159
- return undoStack.forEach(function (undo) {
160
- return undo && undo();
161
- });
162
- };
225
+ return bunchUndos.apply(void 0, undoStack);
163
226
  }
227
+ /**
228
+ * Disables all inputtable descendants.
229
+ *
230
+ * @param {HTMLElement | undefined} element Container element to start looking for inputtable descendants.
231
+ * @param {boolean} observeSubtree `true` to applies to all future inputtable descendants, otherwise, `false`.
232
+ *
233
+ * @returns {function} A function, when called, will restore to previous state.
234
+ */
235
+
164
236
 
165
237
  function disableInputElementsWithUndo(element) {
166
238
  var observeSubtree = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
239
+
240
+ if (!element) {
241
+ return;
242
+ }
243
+
167
244
  var undoStack = [].map.call(element.querySelectorAll('button, input, select, textarea'), function (element) {
168
245
  return disableElementWithUndo(element);
169
246
  });
@@ -189,23 +266,7 @@ function disableInputElementsWithUndo(element) {
189
266
  });
190
267
  }
191
268
 
192
- return function () {
193
- return undoStack.forEach(function (undo) {
194
- return undo && undo();
195
- });
196
- };
197
- }
198
- /**
199
- * Checks if an element contains a class.
200
- *
201
- * @param {HTMLElement} element - The element to check for the class.
202
- * @param {string} className - The name of the class to check for.
203
- * @returns {boolean} `true` if the element contains the class, otherwise, `false`.
204
- */
205
-
206
-
207
- function containsClassName(element, className) {
208
- return (element.className || '').split(' ').includes(className);
269
+ return bunchUndos.apply(void 0, (0, _toConsumableArray2.default)(undoStack));
209
270
  }
210
271
  /**
211
272
  * Gets the value of an attribute from an element.
@@ -215,7 +276,7 @@ function containsClassName(element, className) {
215
276
 
216
277
 
217
278
  function getAttribute(element, qualifiedName) {
218
- return element.hasAttribute(qualifiedName) && element.getAttribute(qualifiedName);
279
+ return !!element && element.hasAttribute(qualifiedName) && (element.getAttribute(qualifiedName) || '');
219
280
  }
220
281
  /**
221
282
  * Sets or removes an attribute from an element.
@@ -228,9 +289,9 @@ function getAttribute(element, qualifiedName) {
228
289
 
229
290
  function setOrRemoveAttribute(element, qualifiedName, value) {
230
291
  if (value === false) {
231
- element.removeAttribute(qualifiedName);
292
+ element === null || element === void 0 ? void 0 : element.removeAttribute(qualifiedName);
232
293
  } else {
233
- element.setAttribute(qualifiedName, value);
294
+ element === null || element === void 0 ? void 0 : element.setAttribute(qualifiedName, value);
234
295
  }
235
296
  }
236
297
  /**
@@ -245,6 +306,10 @@ function setOrRemoveAttribute(element, qualifiedName, value) {
245
306
 
246
307
 
247
308
  function setOrRemoveAttributeWithUndo(element, qualifiedName, value) {
309
+ if (!element) {
310
+ return;
311
+ }
312
+
248
313
  var prevValue = getAttribute(element, qualifiedName);
249
314
  setOrRemoveAttribute(element, qualifiedName, value);
250
315
  return function () {
@@ -262,14 +327,12 @@ function setOrRemoveAttributeWithUndo(element, qualifiedName, value) {
262
327
 
263
328
 
264
329
  function findAncestor(element, predicate) {
265
- var current = element.parentElement;
330
+ var current = element;
266
331
 
267
- while (current) {
332
+ while (current = current.parentElement) {
268
333
  if (predicate.call(element, current)) {
269
334
  return current;
270
335
  }
271
-
272
- current = current.parentElement;
273
336
  }
274
337
  }
275
338
  /**
@@ -286,13 +349,13 @@ function findAncestor(element, predicate) {
286
349
 
287
350
 
288
351
  function indicateActionSelectionWithUndo(selectedActionElements, actionPerformedClassName) {
289
- if (!selectedActionElements.length) {
352
+ if (!(selectedActionElements !== null && selectedActionElements !== void 0 && selectedActionElements.length)) {
290
353
  return;
291
354
  } // Verify all input elements are "ac-pushButton", could belongs to ActionSet or "card actions".
292
355
 
293
356
 
294
357
  if (selectedActionElements.some(function (actionElement) {
295
- return !containsClassName(actionElement, 'ac-pushButton');
358
+ return !actionElement.classList.contains('ac-pushButton');
296
359
  })) {
297
360
  console.warn('botframework-webchat: Cannot mark selected action in the card, some elements are not an "ac-pushButton".');
298
361
  return;
@@ -326,11 +389,7 @@ function indicateActionSelectionWithUndo(selectedActionElements, actionPerformed
326
389
  }
327
390
  });
328
391
  });
329
- return function () {
330
- return undoStack.forEach(function (undo) {
331
- return undo();
332
- });
333
- };
392
+ return bunchUndos.apply(void 0, undoStack);
334
393
  }
335
394
  /**
336
395
  * Fixes accessibility issues from Adaptive Card, with undo.
@@ -340,15 +399,18 @@ function indicateActionSelectionWithUndo(selectedActionElements, actionPerformed
340
399
 
341
400
 
342
401
  function fixAccessibilityIssuesWithUndo(element) {
343
- // These hacks should be done in Adaptive Cards library instead.
344
- var undoStack = []; // Related to #3949: All action buttons inside role="menubar" should be role="menuitem".
402
+ if (!element) {
403
+ return;
404
+ } // These hacks should be done in Adaptive Cards library instead.
405
+ // Related to #3949: All action buttons inside role="menubar" should be role="menuitem".
406
+
345
407
 
346
- undoStack.push.apply(undoStack, (0, _toConsumableArray2.default)(Array.from(element.querySelectorAll('.ac-actionSet[role="menubar"] [role="button"]')).map(function (actionButton) {
408
+ var undoStack = Array.from(element.querySelectorAll('.ac-actionSet[role="menubar"] [role="button"]')).map(function (actionButton) {
347
409
  return setAttributeWithUndo(actionButton, 'role', 'menuitem');
348
- })));
410
+ });
349
411
  return function () {
350
412
  return undoStack.forEach(function (undo) {
351
- return undo();
413
+ return undo === null || undo === void 0 ? void 0 : undo();
352
414
  });
353
415
  };
354
416
  }
@@ -361,8 +423,9 @@ function getFocusableElements(element) {
361
423
  }
362
424
 
363
425
  function restoreActiveElementIndex(element, activeElementIndex) {
364
- var focusable = getFocusableElements(element)[activeElementIndex];
365
- focusable && focusable.focus();
426
+ var _getFocusableElements;
427
+
428
+ (_getFocusableElements = getFocusableElements(element)[+activeElementIndex]) === null || _getFocusableElements === void 0 ? void 0 : _getFocusableElements.focus();
366
429
  }
367
430
 
368
431
  function saveActiveElementIndex(element) {
@@ -372,15 +435,17 @@ function saveActiveElementIndex(element) {
372
435
  function restoreInputValues(element, inputValues) {
373
436
  var inputs = element.querySelectorAll('input, select, textarea');
374
437
  [].forEach.call(inputs, function (input, index) {
375
- var value = inputValues[index];
438
+ var value = inputValues[+index];
376
439
 
377
440
  if (typeof value !== 'undefined') {
378
441
  var tagName = input.tagName,
379
442
  type = input.type;
380
443
 
381
444
  if (tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
382
- input.checked = value;
383
- } else {
445
+ if (typeof value === 'boolean') {
446
+ input.checked = value;
447
+ }
448
+ } else if (typeof value === 'string') {
384
449
  input.value = value;
385
450
  }
386
451
  }
@@ -389,25 +454,22 @@ function restoreInputValues(element, inputValues) {
389
454
 
390
455
  function saveInputValues(element) {
391
456
  var inputs = element.querySelectorAll('input, select, textarea');
392
- return [].map.call(inputs, function (_ref2) {
393
- var checked = _ref2.checked,
394
- tagName = _ref2.tagName,
395
- type = _ref2.type,
396
- value = _ref2.value;
397
-
398
- if (tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
399
- return checked;
457
+ return [].map.call(inputs, function (input) {
458
+ var type = input.type;
459
+
460
+ if (input.tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
461
+ return input.checked;
400
462
  }
401
463
 
402
- return value;
464
+ return input.value;
403
465
  });
404
466
  }
405
467
 
406
- var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
407
- var actionPerformedClassName = _ref3.actionPerformedClassName,
408
- adaptiveCard = _ref3.adaptiveCard,
409
- disabledFromProps = _ref3.disabled,
410
- tapAction = _ref3.tapAction;
468
+ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
469
+ var actionPerformedClassName = _ref2.actionPerformedClassName,
470
+ adaptiveCard = _ref2.adaptiveCard,
471
+ disabledFromProps = _ref2.disabled,
472
+ tapAction = _ref2.tapAction;
411
473
 
412
474
  var _useStyleSet = useStyleSet(),
413
475
  _useStyleSet2 = (0, _slicedToArray2.default)(_useStyleSet, 1),
@@ -454,9 +516,10 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
454
516
  // The null check for "tapAction" is in "handleClickAndKeyPressForTapAction".
455
517
 
456
518
  var handleClickAndKeyPress = (0, _react.useCallback)(function (event) {
457
- var key = event.key,
458
- target = event.target,
459
- type = event.type; // Some items, e.g. tappable text, cannot be disabled thru DOM attributes
519
+ var _ref3 = event,
520
+ key = _ref3.key,
521
+ type = _ref3.type;
522
+ var target = event.target; // Some items, e.g. tappable text, cannot be disabled thru DOM attributes
460
523
 
461
524
  var current = contentRef.current;
462
525
  var adaptiveCardRoot = current.querySelector('.ac-adaptiveCard[tabindex="0"]');
@@ -555,9 +618,11 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
555
618
  // TODO: [P3] Checks if we could make the "renderMarkdownAsHTML" per card
556
619
  // This could be limitations from Adaptive Cards package (not supported as of 1.2.5)
557
620
  // Because there could be timing difference between .parse and .render, we could be using wrong Markdown engine
621
+ // "onProcessMarkdown" is a static function but we are trying to scope it to the current object instead.
622
+ // eslint-disable-next-line dot-notation
558
623
 
559
624
 
560
- adaptiveCard.constructor.onProcessMarkdown = function (text, result) {
625
+ adaptiveCard.constructor['onProcessMarkdown'] = function (text, result) {
561
626
  if (renderMarkdownAsHTML) {
562
627
  result.outputHtml = renderMarkdownAsHTML(text);
563
628
  result.didProcess = true;
@@ -656,7 +721,6 @@ AdaptiveCardRenderer.propTypes = {
656
721
  adaptiveCard: _propTypes.default.any.isRequired,
657
722
  disabled: _propTypes.default.bool,
658
723
  // TypeScript class is not mappable to PropTypes.func
659
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
660
724
  // @ts-ignore
661
725
  tapAction: _propTypes.default.shape({
662
726
  image: _propTypes.default.string,
@@ -667,4 +731,4 @@ AdaptiveCardRenderer.propTypes = {
667
731
  };
668
732
  var _default = AdaptiveCardRenderer;
669
733
  exports.default = _default;
670
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGl2ZUNhcmRzL0F0dGFjaG1lbnQvQWRhcHRpdmVDYXJkUmVuZGVyZXIudHN4Il0sIm5hbWVzIjpbIkVycm9yQm94IiwiQ29tcG9uZW50cyIsInVzZURpc2FibGVkIiwiaG9va3MiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VQZXJmb3JtQ2FyZEFjdGlvbiIsInVzZVJlbmRlck1hcmtkb3duQXNIVE1MIiwidXNlU2Nyb2xsVG9FbmQiLCJ1c2VTdHlsZVNldCIsIm5vZGVfZW52IiwiYWRkQ2xhc3MiLCJlbGVtZW50IiwiY2xhc3NOYW1lIiwiY2xhc3NOYW1lcyIsIlNldCIsInNwbGl0IiwiaGFzIiwiYWRkIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsImFkZFBlcnNpc3RlbnRDbGFzc1dpdGhVbmRvIiwib2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwib2JzZXJ2ZSIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVGaWx0ZXIiLCJkZWxldGUiLCJkaXNjb25uZWN0IiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwicHJvdG90eXBlIiwic2V0QXR0cmlidXRlV2l0aFVuZG8iLCJxdWFsaWZpZWROYW1lIiwibmV4dFZhbHVlIiwidmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJkaXNhYmxlZEhhbmRsZXIiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyIsIm5hbWUiLCJoYW5kbGVyIiwiZGV0YWNoIiwiZGV0YWNoaW5nSGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsImFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyIsImRpc2FibGVFbGVtZW50V2l0aFVuZG8iLCJ1bmRvU3RhY2siLCJpc0FjdGl2ZSIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsInRhZyIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwibWFwIiwiY2FsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvcHRpb24iLCJmb3JFYWNoIiwidW5kbyIsImRpc2FibGVJbnB1dEVsZW1lbnRzV2l0aFVuZG8iLCJvYnNlcnZlU3VidHJlZSIsIm11dGF0aW9ucyIsImFkZGVkTm9kZXMiLCJhZGRlZE5vZGUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwiY29udGFpbnNDbGFzc05hbWUiLCJpbmNsdWRlcyIsImhhc0F0dHJpYnV0ZSIsInNldE9yUmVtb3ZlQXR0cmlidXRlIiwic2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyIsInByZXZWYWx1ZSIsImZpbmRBbmNlc3RvciIsInByZWRpY2F0ZSIsImN1cnJlbnQiLCJwYXJlbnRFbGVtZW50IiwiaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyIsInNlbGVjdGVkQWN0aW9uRWxlbWVudHMiLCJhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUiLCJsZW5ndGgiLCJzb21lIiwiYWN0aW9uRWxlbWVudCIsImNvbnNvbGUiLCJ3YXJuIiwiYWN0aW9uU2V0RWxlbWVudHMiLCJzZWxlY3RlZEFjdGlvbkVsZW1lbnQiLCJhY3Rpb25TZXRFbGVtZW50IiwiYW5jZXN0b3IiLCJmaXhBY2Nlc3NpYmlsaXR5SXNzdWVzV2l0aFVuZG8iLCJhY3Rpb25CdXR0b24iLCJnZXRGb2N1c2FibGVFbGVtZW50cyIsImZpbHRlciIsInRhYkluZGV4IiwicmVzdG9yZUFjdGl2ZUVsZW1lbnRJbmRleCIsImFjdGl2ZUVsZW1lbnRJbmRleCIsImZvY3VzYWJsZSIsImZvY3VzIiwic2F2ZUFjdGl2ZUVsZW1lbnRJbmRleCIsImluZGV4T2YiLCJyZXN0b3JlSW5wdXRWYWx1ZXMiLCJpbnB1dFZhbHVlcyIsImlucHV0cyIsImlucHV0IiwiaW5kZXgiLCJ0YWdOYW1lIiwidHlwZSIsImNoZWNrZWQiLCJzYXZlSW5wdXRWYWx1ZXMiLCJBZGFwdGl2ZUNhcmRSZW5kZXJlciIsImFkYXB0aXZlQ2FyZCIsImRpc2FibGVkRnJvbVByb3BzIiwiZGlzYWJsZWQiLCJ0YXBBY3Rpb24iLCJhZGFwdGl2ZUNhcmRSZW5kZXJlclN0eWxlU2V0IiwiYWRhcHRpdmVDYXJkUmVuZGVyZXIiLCJHbG9iYWxTZXR0aW5ncyIsIkhvc3RDb25maWciLCJhY3Rpb25zUGVyZm9ybWVkIiwic2V0QWN0aW9uc1BlcmZvcm1lZCIsImFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIiwiZGlzYWJsZWRGcm9tQ29tcG9zZXIiLCJlcnJvcnMiLCJzZXRFcnJvcnMiLCJsYXN0UmVuZGVyIiwic2V0TGFzdFJlbmRlciIsImFjdGl2ZUVsZW1lbnRJbmRleFJlZiIsImFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYiLCJjb250ZW50UmVmIiwiaW5wdXRWYWx1ZXNSZWYiLCJsb2NhbGl6ZSIsInBlcmZvcm1DYXJkQWN0aW9uIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJzY3JvbGxUb0VuZCIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3MiLCJrZXkiLCJ0YXJnZXQiLCJhZGFwdGl2ZUNhcmRSb290IiwicXVlcnlTZWxlY3RvciIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24iLCJ1bmRlZmluZWQiLCJhZGRBY3Rpb25zUGVyZm9ybWVkIiwiYWN0aW9uIiwiaGFuZGxlRXhlY3V0ZUFjdGlvbiIsImFjdGlvblR5cGVOYW1lIiwiZ2V0SnNvblR5cGVOYW1lIiwiaW1hZ2UiLCJpY29uVXJsIiwidGl0bGUiLCJ1cmwiLCJkYXRhIiwiX19pc0JvdEZyYW1ld29ya0NhcmRBY3Rpb24iLCJjYXJkQWN0aW9uIiwiZXJyb3IiLCJjb25zdHJ1Y3RvciIsIm9uUHJvY2Vzc01hcmtkb3duIiwidGV4dCIsInJlc3VsdCIsIm91dHB1dEh0bWwiLCJkaWRQcm9jZXNzIiwiaG9zdENvbmZpZyIsInNldFRhYkluZGV4QXRDYXJkUm9vdCIsInZhbGlkYXRlUHJvcGVydGllcyIsInZhbGlkYXRpb25FdmVudHMiLCJyZWR1Y2UiLCJpdGVtcyIsIm1lc3NhZ2UiLCJFcnJvciIsInJlbmRlciIsImFwcGVuZENoaWxkIiwiRGF0ZSIsIm5vdyIsInJlbW92ZUNoaWxkIiwib25FeGVjdXRlQWN0aW9uIiwicmVuZGVyZWRFbGVtZW50IiwiZGVmYXVsdFByb3BzIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic3RyaW5nIiwiYW55IiwiaXNSZXF1aXJlZCIsImJvb2wiLCJzaGFwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBR0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7OztBQVZBO0FBYUEsSUFBUUEsUUFBUixHQUFxQkMsd0NBQXJCLENBQVFELFFBQVI7QUFDQSxJQUFRRSxXQUFSLEdBQWtIQyxtQ0FBbEgsQ0FBUUQsV0FBUjtBQUFBLElBQXFCRSxZQUFyQixHQUFrSEQsbUNBQWxILENBQXFCQyxZQUFyQjtBQUFBLElBQW1DQyxvQkFBbkMsR0FBa0hGLG1DQUFsSCxDQUFtQ0Usb0JBQW5DO0FBQUEsSUFBeURDLHVCQUF6RCxHQUFrSEgsbUNBQWxILENBQXlERyx1QkFBekQ7QUFBQSxJQUFrRkMsY0FBbEYsR0FBa0hKLG1DQUFsSCxDQUFrRkksY0FBbEY7QUFBQSxJQUFrR0MsV0FBbEcsR0FBa0hMLG1DQUFsSCxDQUFrR0ssV0FBbEcsQyxDQUVBOztBQUNBLElBQU1DLFFBQVEsR0FBRyx5QkFBakI7O0FBRUEsU0FBU0MsUUFBVCxDQUFrQkMsT0FBbEIsRUFBMkJDLFNBQTNCLEVBQXNDO0FBQ3BDLE1BQU1DLFVBQVUsR0FBRyxJQUFJQyxHQUFKLENBQVFILE9BQU8sQ0FBQ0MsU0FBUixDQUFrQkcsS0FBbEIsQ0FBd0IsR0FBeEIsQ0FBUixDQUFuQjs7QUFFQSxNQUFJLENBQUNGLFVBQVUsQ0FBQ0csR0FBWCxDQUFlSixTQUFmLENBQUwsRUFBZ0M7QUFDOUJDLElBQUFBLFVBQVUsQ0FBQ0ksR0FBWCxDQUFlTCxTQUFmO0FBRUFELElBQUFB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LE1BRlE7QUFHekJ4RSxJQUFBQSxJQUFJLEVBQUV1RSxtQkFBVUMsTUFBVixDQUFpQkUsVUFIRTtBQUl6QnpKLElBQUFBLEtBQUssRUFBRXNKLG1CQUFVQztBQUpRLEdBQWhCO0FBUm9CLENBQWpDO2VBZ0JlckUsb0IiLCJzb3VyY2VSb290IjoiYnVuZGxlOi8vLyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBuby1tYWdpYy1udW1iZXJzOiBbXCJlcnJvclwiLCB7IFwiaWdub3JlXCI6IFstMSwgMCwgMl0gfV0gKi9cblxuaW1wb3J0IHsgQWN0aW9uLCBPcGVuVXJsQWN0aW9uLCBTdWJtaXRBY3Rpb24gfSBmcm9tICdhZGFwdGl2ZWNhcmRzJztcbmltcG9ydCB7IENvbXBvbmVudHMsIGdldFRhYkluZGV4LCBob29rcyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaXJlY3RMaW5lQ2FyZEFjdGlvbiB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWNvcmUnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSwgVkZDIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcgZnJvbSAnLi4vaG9va3MvdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcnO1xuaW1wb3J0IHVzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlIGZyb20gJy4uL2hvb2tzL3VzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlJztcbmltcG9ydCB7IEJvdEZyYW1ld29ya0NhcmRBY3Rpb24gfSBmcm9tICcuL0FkYXB0aXZlQ2FyZEJ1aWxkZXInO1xuXG5jb25zdCB7IEVycm9yQm94IH0gPSBDb21wb25lbnRzO1xuY29uc3QgeyB1c2VEaXNhYmxlZCwgdXNlTG9jYWxpemVyLCB1c2VQZXJmb3JtQ2FyZEFjdGlvbiwgdXNlUmVuZGVyTWFya2Rvd25Bc0hUTUwsIHVzZVNjcm9sbFRvRW5kLCB1c2VTdHlsZVNldCB9ID0gaG9va3M7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuY29uc3Qgbm9kZV9lbnYgPSBwcm9jZXNzLmVudi5ub2RlX2VudiB8fCBwcm9jZXNzLmVudi5OT0RFX0VOVjtcblxuZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gIGNvbnN0IGNsYXNzTmFtZXMgPSBuZXcgU2V0KGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykpO1xuXG4gIGlmICghY2xhc3NOYW1lcy5oYXMoY2xhc3NOYW1lKSkge1xuICAgIGNsYXNzTmFtZXMuYWRkKGNsYXNzTmFtZSk7XG5cbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IEFycmF5LmZyb20oY2xhc3NOYW1lcykuam9pbignICcpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFkZFBlcnNpc3RlbnRDbGFzc1dpdGhVbmRvKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSkge1xuICAgIC8vIEFmdGVyIHdlIGFkZCB0aGUgY2xhc3MsIGtlZXAgb2JzZXJ2aW5nIHRoZSBlbGVtZW50IHRvIG1ha2Ugc3VyZSB0aGUgY2xhc3MgaXMgbm90IHJlbW92ZWQuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnY2xhc3MnXSB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjbGFzc05hbWVzID0gbmV3IFNldChlbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpKTtcblxuICAgICAgY2xhc3NOYW1lcy5kZWxldGUoY2xhc3NOYW1lKTtcblxuICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBBcnJheS5mcm9tKGNsYXNzTmFtZXMpLmpvaW4oJyAnKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cblxuZnVuY3Rpb24gc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgcXVhbGlmaWVkTmFtZSwgbmV4dFZhbHVlKSB7XG4gIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7XG5cbiAgaWYgKHZhbHVlICE9PSBuZXh0VmFsdWUpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lLCBuZXh0VmFsdWUpO1xuXG4gICAgcmV0dXJuICgpID0+ICh2YWx1ZSA/IGVsZW1lbnQuc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIHZhbHVlKSA6IGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpKTtcbiAgfVxufVxuXG5jb25zdCBkaXNhYmxlZEhhbmRsZXIgPSBldmVudCA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbn07XG5cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJPbmNlV2l0aFVuZG8oZWxlbWVudCwgbmFtZSwgaGFuZGxlcikge1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0ICovXG4gIGxldCBkZXRhY2g7XG4gIGNvbnN0IGRldGFjaGluZ0hhbmRsZXIgPSBldmVudCA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGhhbmRsZXIoZXZlbnQpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBJRTExIGRvZXMgbm90IHN1cHBvcnQgeyBvbmNlOiB0cnVlIH0sIHNvIHdlIG5lZWQgdG8gZGV0YWNoIG1hbnVhbGx5LlxuICAgICAgZGV0YWNoKCk7XG4gICAgfVxuICB9O1xuXG4gIGRldGFjaCA9ICgpID0+IGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBkZXRhY2hpbmdIYW5kbGVyKTtcblxuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZGV0YWNoaW5nSGFuZGxlciwgeyBvbmNlOiB0cnVlIH0pO1xuXG4gIHJldHVybiBkZXRhY2g7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyhlbGVtZW50LCBuYW1lLCBoYW5kbGVyKSB7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyKTtcblxuICByZXR1cm4gKCkgPT4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIpO1xufVxuXG5mdW5jdGlvbiBkaXNhYmxlRWxlbWVudFdpdGhVbmRvKGVsZW1lbnQpIHtcbiAgY29uc3QgdW5kb1N0YWNrID0gW107XG4gIGNvbnN0IGlzQWN0aXZlID0gZWxlbWVudCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgY29uc3QgdGFnID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2UgKi9cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdidXR0b24nOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHVuZG9TdGFjay5wdXNoKHNldEF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQsICdhcmlhLWRpc2FibGVkJywgJ3RydWUnKSk7XG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChcbiAgICAgICAgICBhZGRFdmVudExpc3RlbmVyT25jZVdpdGhVbmRvKGVsZW1lbnQsICdibHVyJywgKCkgPT5cbiAgICAgICAgICAgIHVuZG9TdGFjay5wdXNoKHNldEF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQsICdkaXNhYmxlZCcsICdkaXNhYmxlZCcpKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKHNldEF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQsICdkaXNhYmxlZCcsICdkaXNhYmxlZCcpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYScpIHtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goYWRkRXZlbnRMaXN0ZW5lcldpdGhVbmRvKGVsZW1lbnQsICdjbGljaycsIGRpc2FibGVkSGFuZGxlcikpO1xuICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCAncmVhZG9ubHknLCAncmVhZG9ubHknKSk7XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goXG4gICAgICAgICAgLi4uW10ubWFwLmNhbGwoZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb24nKSwgb3B0aW9uID0+XG4gICAgICAgICAgICBzZXRBdHRyaWJ1dGVXaXRoVW5kbyhvcHRpb24sICdkaXNhYmxlZCcsICdkaXNhYmxlZCcpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiAoKSA9PiB1bmRvU3RhY2suZm9yRWFjaCh1bmRvID0+IHVuZG8gJiYgdW5kbygpKTtcbn1cblxuZnVuY3Rpb24gZGlzYWJsZUlucHV0RWxlbWVudHNXaXRoVW5kbyhlbGVtZW50OiBIVE1MRWxlbWVudCwgb2JzZXJ2ZVN1YnRyZWUgPSB0cnVlKSB7XG4gIGNvbnN0IHVuZG9TdGFjayA9IFtdLm1hcC5jYWxsKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpLCBlbGVtZW50ID0+XG4gICAgZGlzYWJsZUVsZW1lbnRXaXRoVW5kbyhlbGVtZW50KVxuICApO1xuXG4gIGNvbnN0IHRhZyA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyBPbmx5IHNldCB0YWJpbmRleD1cIi0xXCIgb24gZm9jdXNhYmxlIGVsZW1lbnQuIE90aGVyd2lzZSwgd2Ugd2lsbCBtYWtlIDxkaXY+IGZvY3VzYWJsZSBieSBtb3VzZS5cbiAgKHRhZyA9PT0gJ2EnIHx8IHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSAmJlxuICAgIHVuZG9TdGFjay5wdXNoKHNldEF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQsICd0YWJpbmRleCcsICctMScpKTtcblxuICBpZiAob2JzZXJ2ZVN1YnRyZWUpIHtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PlxuICAgICAgbXV0YXRpb25zLmZvckVhY2goKHsgYWRkZWROb2RlcyB9KSA9PlxuICAgICAgICB1bmRvU3RhY2sucHVzaCguLi5bXS5tYXAuY2FsbChhZGRlZE5vZGVzLCBhZGRlZE5vZGUgPT4gZGlzYWJsZUlucHV0RWxlbWVudHNXaXRoVW5kbyhhZGRlZE5vZGUsIGZhbHNlKSkpXG4gICAgICApXG4gICAgKTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICB1bmRvU3RhY2sucHVzaCgoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KCkpO1xuICB9XG5cbiAgcmV0dXJuICgpID0+IHVuZG9TdGFjay5mb3JFYWNoKHVuZG8gPT4gdW5kbyAmJiB1bmRvKCkpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGNvbnRhaW5zIGEgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGNoZWNrIGZvciB0aGUgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGNoZWNrIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgdGhlIGNsYXNzLCBvdGhlcndpc2UsIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zQ2xhc3NOYW1lKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGVsZW1lbnQuY2xhc3NOYW1lIHx8ICcnKS5zcGxpdCgnICcpLmluY2x1ZGVzKGNsYXNzTmFtZSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIGZyb20gYW4gZWxlbWVudC5cbiAqXG4gKiBAcmV0dXJucyB7ZmFsc2UgfCBzdHJpbmd9IFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBgZmFsc2VgIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQuXG4gKi9cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZShlbGVtZW50OiBIVE1MRWxlbWVudCwgcXVhbGlmaWVkTmFtZTogc3RyaW5nKTogZmFsc2UgfCBzdHJpbmcge1xuICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7XG59XG5cbi8qKlxuICogU2V0cyBvciByZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHNldCBvciByZW1vdmUgYXR0cmlidXRlIGZyb20uXG4gKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge2ZhbHNlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBXaGVuIHBhc3NpbmcgYGZhbHNlYCwgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUuXG4gKi9cbmZ1bmN0aW9uIHNldE9yUmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBxdWFsaWZpZWROYW1lOiBzdHJpbmcsIHZhbHVlOiBmYWxzZSB8IHN0cmluZyk6IHZvaWQge1xuICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogU2V0cyBvciByZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQgd2l0aCBhbiB1bmRvIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzZXQgb3IgcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tLlxuICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICogQHBhcmFtIHtmYWxzZSB8IHN0cmluZ30gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gV2hlbiBwYXNzaW5nIGBmYWxzZWAsIHJlbW92ZSB0aGUgYXR0cmlidXRlLlxuICpcbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSBUaGUgdW5kbyBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgdW5kbyBhbGwgbWFuaXB1bGF0aW9ucyBieSByZXN0b3JpbmcgdmFsdWVzIHJlY29yZGVkIGF0IHRoZSB0aW1lIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxuICovXG5mdW5jdGlvbiBzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBxdWFsaWZpZWROYW1lOiBzdHJpbmcsIHZhbHVlOiBmYWxzZSB8IHN0cmluZyk6ICgpID0+IHZvaWQge1xuICBjb25zdCBwcmV2VmFsdWUgPSBnZXRBdHRyaWJ1dGUoZWxlbWVudCwgcXVhbGlmaWVkTmFtZSk7XG5cbiAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgcXVhbGlmaWVkTmFtZSwgdmFsdWUpO1xuXG4gIHJldHVybiAoKSA9PiBzZXRPclJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lLCBwcmV2VmFsdWUpO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCBhbmNlc3RvciB0aGF0IGZ1bGZpbGwgdGhlIHByZWRpY2F0ZS5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIHN0YXJ0aW5nIGVsZW1lbnQuIFRoaXMgZWxlbWVudCB3aWxsIG5vdCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIHByZWRpY2F0ZS5cbiAqIEBwYXJhbSB7KGFuY2VzdG9yOiBIVE1MRWxlbWVudCkgPT4gYm9vbGVhbn0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSB0byBmdWxmaWxsLlxuICpcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IHVuZGVmaW5lZH0gVGhlIGZpcnN0IGFuY2VzdG9yIHRoYXQgZnVsZmlsbCB0aGUgcHJlZGljYXRlLCBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBmaW5kQW5jZXN0b3IoZWxlbWVudDogSFRNTEVsZW1lbnQsIHByZWRpY2F0ZTogKGFuY2VzdG9yOiBIVE1MRWxlbWVudCkgPT4gYm9vbGVhbik6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBpZiAocHJlZGljYXRlLmNhbGwoZWxlbWVudCwgY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cblxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhlIGFjdGlvbiBzZWxlY3RlZCBieSBwZXJmb3JtaW5nIGEgc2VyaWVzIG9mIG1hbmlwdWxhdGlvbnMsIHdpdGggdW5kbzpcbiAqXG4gKiAtIEFjY2Vzc2liaWxpdHk6IHNldCBgYXJpYS1wcmVzc2VkYCB0byBgdHJ1ZWBcbiAqIC0gQXBwbGllcyBgc3R5bGVPcHRpb25zLmFjdGlvblBlcmZvcm1lZENsYXNzTmFtZWBcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50W119IHNlbGVjdGVkQWN0aW9uRWxlbWVudHMgLSBBbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSByZXByZXNlbnRpbmcgdGhlIGFjdGlvbiBhbmQgaXMgc2VsZWN0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZz99IGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBhcHBseSB0byBhbGwgZWxlbWVudHMuXG4gKlxuICogQHJldHVybnMgeygpID0+IHZvaWR9IFRoZSB1bmRvIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCB1bmRvIGFsbCBtYW5pcHVsYXRpb25zIGJ5IHJlc3RvcmluZyB2YWx1ZXMgcmVjb3JkZWQgYXQgdGhlIHRpbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGluZGljYXRlQWN0aW9uU2VsZWN0aW9uV2l0aFVuZG8oXG4gIHNlbGVjdGVkQWN0aW9uRWxlbWVudHM6IEhUTUxFbGVtZW50W10sXG4gIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZT86IHN0cmluZ1xuKTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFZlcmlmeSBhbGwgaW5wdXQgZWxlbWVudHMgYXJlIFwiYWMtcHVzaEJ1dHRvblwiLCBjb3VsZCBiZWxvbmdzIHRvIEFjdGlvblNldCBvciBcImNhcmQgYWN0aW9uc1wiLlxuICBpZiAoc2VsZWN0ZWRBY3Rpb25FbGVtZW50cy5zb21lKGFjdGlvbkVsZW1lbnQgPT4gIWNvbnRhaW5zQ2xhc3NOYW1lKGFjdGlvbkVsZW1lbnQsICdhYy1wdXNoQnV0dG9uJykpKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ2JvdGZyYW1ld29yay13ZWJjaGF0OiBDYW5ub3QgbWFyayBzZWxlY3RlZCBhY3Rpb24gaW4gdGhlIGNhcmQsIHNvbWUgZWxlbWVudHMgYXJlIG5vdCBhbiBcImFjLXB1c2hCdXR0b25cIi4nXG4gICAgKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEEgZGlzdGluY3Qgc2V0IG9mIGFjdGlvbiBzZXQgY29udGFpbmVycyB3aGljaCBoYXMgc2VsZWN0aW9ucywgZXhjbHVkaW5nIGNvbnRhaW5lcnMgd2l0aG91dCBhY3Rpb25zLlxuICAvLyBNdWx0aXBsZSBzdWJtaXNzaW9uIGluIGFuIEFkYXB0aXZlIENhcmQgaXMgc3RpbGwgYSB2YWd1ZSBhcmVhIGFuZCBUQkQuXG4gIC8vIFdlIG1pZ2h0IHdhbnQgdG8gZGlzYWJsZSB0aGUgd2hvbGUgY2FyZCwganVzdCBidXR0b25zIGluIHNhbWUgY29udGFpbmVyLCBvciBkbyBub3RoaW5nICh0b2RheSkuXG4gIGNvbnN0IGFjdGlvblNldEVsZW1lbnRzID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcblxuICBzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLmZvckVhY2goc2VsZWN0ZWRBY3Rpb25FbGVtZW50ID0+IHtcbiAgICBjb25zdCBhY3Rpb25TZXRFbGVtZW50ID0gZmluZEFuY2VzdG9yKFxuICAgICAgc2VsZWN0ZWRBY3Rpb25FbGVtZW50LFxuICAgICAgYW5jZXN0b3IgPT4gYW5jZXN0b3IuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdtZW51YmFyJ1xuICAgICk7XG5cbiAgICBhY3Rpb25TZXRFbGVtZW50ICYmIGFjdGlvblNldEVsZW1lbnRzLmFkZChhY3Rpb25TZXRFbGVtZW50KTtcbiAgfSk7XG5cbiAgY29uc3QgdW5kb1N0YWNrOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIGFjdGlvblNldEVsZW1lbnRzLmZvckVhY2goYWN0aW9uU2V0RWxlbWVudCA9PiB7XG4gICAgLy8gUmVtb3ZlIFwicm9sZVwiIGZyb20gZXZlcnkgXCJhYy1hY3Rpb25TZXRcIiBjb250YWluZXIuXG4gICAgdW5kb1N0YWNrLnB1c2goc2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyhhY3Rpb25TZXRFbGVtZW50LCAncm9sZScsIGZhbHNlKSk7XG5cbiAgICAvLyBNb2RpZnkgXCJyb2xlXCIgb2YgZXZlcnkgYWN0aW9ucyBpbiB0aGUgY29udGFpbmVyLlxuICAgIEFycmF5LmZyb20oYWN0aW9uU2V0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWMtcHVzaEJ1dHRvbicpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+KS5mb3JFYWNoKFxuICAgICAgYWN0aW9uRWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLmluY2x1ZGVzKGFjdGlvbkVsZW1lbnQpKSB7XG4gICAgICAgICAgLy8gQWRkIFwiYXJpYS1wcmVzc2VkXCIgYW5kIHNldCBcInJvbGVcIiBhdHRyaWJ1dGUgdG8gXCJidXR0b25cIiAod2hpY2ggaXMgcmVxdWlyZWQgYnkgXCJhcmlhLXByZXNzZWRcIikuXG4gICAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyhhY3Rpb25FbGVtZW50LCAnYXJpYS1wcmVzc2VkJywgJ3RydWUnKSk7XG4gICAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyhhY3Rpb25FbGVtZW50LCAncm9sZScsICdidXR0b24nKSk7XG5cbiAgICAgICAgICAvLyBIaWdobGlnaHQgYWN0aW9ucyBieSBhcHBseWluZyBgc3R5bGVPcHRpb25zLmFjdGlvblBlcmZvcm1lZENsYXNzTmFtZWAuXG4gICAgICAgICAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lICYmXG4gICAgICAgICAgICB1bmRvU3RhY2sucHVzaChhZGRQZXJzaXN0ZW50Q2xhc3NXaXRoVW5kbyhhY3Rpb25FbGVtZW50LCBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSByZW1vdmVkIFwicm9sZT1tZW51YmFyXCIgZnJvbSB0aGUgY29udGFpbmVyLCB3ZSBtdXN0IHJlbW92ZSBcInJvbGU9bWVudWl0ZW1cIiBmcm9tIHVuc2VsZWN0ZWQgYWN0aW9ucy5cbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdyb2xlJywgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiAoKSA9PiB1bmRvU3RhY2suZm9yRWFjaCh1bmRvID0+IHVuZG8oKSk7XG59XG5cbi8qKlxuICogRml4ZXMgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgZnJvbSBBZGFwdGl2ZSBDYXJkLCB3aXRoIHVuZG8uXG4gKlxuICogQHJldHVybnMgeygpID0+IHZvaWR9IFRoZSB1bmRvIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCB1bmRvIGFsbCBtYW5pcHVsYXRpb25zIGJ5IHJlc3RvcmluZyB2YWx1ZXMgcmVjb3JkZWQgYXQgdGhlIHRpbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyhlbGVtZW50OiBIVE1MRWxlbWVudCk6ICgpID0+IHZvaWQge1xuICAvLyBUaGVzZSBoYWNrcyBzaG91bGQgYmUgZG9uZSBpbiBBZGFwdGl2ZSBDYXJkcyBsaWJyYXJ5IGluc3RlYWQuXG4gIGNvbnN0IHVuZG9TdGFjazogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAvLyBSZWxhdGVkIHRvICMzOTQ5OiBBbGwgYWN0aW9uIGJ1dHRvbnMgaW5zaWRlIHJvbGU9XCJtZW51YmFyXCIgc2hvdWxkIGJlIHJvbGU9XCJtZW51aXRlbVwiLlxuICB1bmRvU3RhY2sucHVzaChcbiAgICAuLi5BcnJheS5mcm9tKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFjLWFjdGlvblNldFtyb2xlPVwibWVudWJhclwiXSBbcm9sZT1cImJ1dHRvblwiXScpKS5tYXAoYWN0aW9uQnV0dG9uID0+XG4gICAgICBzZXRBdHRyaWJ1dGVXaXRoVW5kbyhhY3Rpb25CdXR0b24sICdyb2xlJywgJ21lbnVpdGVtJylcbiAgICApXG4gICk7XG5cbiAgcmV0dXJuICgpID0+IHVuZG9TdGFjay5mb3JFYWNoKHVuZG8gPT4gdW5kbygpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoZWxlbWVudCkge1xuICByZXR1cm4gW10uZmlsdGVyLmNhbGwoXG4gICAgZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgW1xuICAgICAgICAnYScsXG4gICAgICAgICdib2R5JyxcbiAgICAgICAgJ2J1dHRvbicsXG4gICAgICAgICdmcmFtZScsXG4gICAgICAgICdpZnJhbWUnLFxuICAgICAgICAnaW1nJyxcbiAgICAgICAgJ2lucHV0JyxcbiAgICAgICAgJ2lzaW5kZXgnLFxuICAgICAgICAnb2JqZWN0JyxcbiAgICAgICAgJ3NlbGVjdCcsXG4gICAgICAgICd0ZXh0YXJlYScsXG4gICAgICAgICdbdGFiaW5kZXhdJ1xuICAgICAgXS5qb2luKCcsICcpXG4gICAgKSxcbiAgICBlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHRhYkluZGV4ID0gZ2V0VGFiSW5kZXgoZWxlbWVudCk7XG5cbiAgICAgIHJldHVybiB0eXBlb2YgdGFiSW5kZXggPT09ICdudW1iZXInICYmIHRhYkluZGV4ID49IDA7XG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQsIGFjdGl2ZUVsZW1lbnRJbmRleCkge1xuICBjb25zdCBmb2N1c2FibGUgPSBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50KVthY3RpdmVFbGVtZW50SW5kZXhdO1xuXG4gIGZvY3VzYWJsZSAmJiBmb2N1c2FibGUuZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gc2F2ZUFjdGl2ZUVsZW1lbnRJbmRleChlbGVtZW50KSB7XG4gIHJldHVybiBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50KS5pbmRleE9mKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlSW5wdXRWYWx1ZXMoZWxlbWVudCwgaW5wdXRWYWx1ZXMpIHtcbiAgY29uc3QgaW5wdXRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuXG4gIFtdLmZvckVhY2guY2FsbChpbnB1dHMsIChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGlucHV0VmFsdWVzW2luZGV4XTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCB7IHRhZ05hbWUsIHR5cGUgfSA9IGlucHV0O1xuXG4gICAgICBpZiAodGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKSkge1xuICAgICAgICBpbnB1dC5jaGVja2VkID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNhdmVJbnB1dFZhbHVlcyhlbGVtZW50KSB7XG4gIGNvbnN0IGlucHV0cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcblxuICByZXR1cm4gW10ubWFwLmNhbGwoaW5wdXRzLCAoeyBjaGVja2VkLCB0YWdOYW1lLCB0eXBlLCB2YWx1ZSB9KSA9PiB7XG4gICAgaWYgKHRhZ05hbWUgPT09ICdJTlBVVCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJykpIHtcbiAgICAgIHJldHVybiBjaGVja2VkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSk7XG59XG5cbnR5cGUgQWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lPzogc3RyaW5nO1xuICBhZGFwdGl2ZUNhcmQ6IGFueTtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0YXBBY3Rpb24/OiBEaXJlY3RMaW5lQ2FyZEFjdGlvbjtcbn07XG5cbmNvbnN0IEFkYXB0aXZlQ2FyZFJlbmRlcmVyOiBWRkM8QWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcz4gPSAoe1xuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsXG4gIGFkYXB0aXZlQ2FyZCxcbiAgZGlzYWJsZWQ6IGRpc2FibGVkRnJvbVByb3BzLFxuICB0YXBBY3Rpb25cbn0pID0+IHtcbiAgY29uc3QgW3sgYWRhcHRpdmVDYXJkUmVuZGVyZXI6IGFkYXB0aXZlQ2FyZFJlbmRlcmVyU3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbeyBHbG9iYWxTZXR0aW5ncywgSG9zdENvbmZpZyB9XSA9IHVzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlKCk7XG4gIGNvbnN0IFthY3Rpb25zUGVyZm9ybWVkLCBzZXRBY3Rpb25zUGVyZm9ybWVkXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2FkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnXSA9IHVzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKCk7XG4gIGNvbnN0IFtkaXNhYmxlZEZyb21Db21wb3Nlcl0gPSB1c2VEaXNhYmxlZCgpO1xuICBjb25zdCBbZXJyb3JzLCBzZXRFcnJvcnNdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbbGFzdFJlbmRlciwgc2V0TGFzdFJlbmRlcl0gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3QgYWN0aXZlRWxlbWVudEluZGV4UmVmID0gdXNlUmVmKC0xKTtcbiAgY29uc3QgYWRhcHRpdmVDYXJkRWxlbWVudFJlZiA9IHVzZVJlZjxIVE1MRWxlbWVudD4oKTtcbiAgY29uc3QgY29udGVudFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcbiAgY29uc3QgaW5wdXRWYWx1ZXNSZWYgPSB1c2VSZWYoW10pO1xuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCBwZXJmb3JtQ2FyZEFjdGlvbiA9IHVzZVBlcmZvcm1DYXJkQWN0aW9uKCk7XG4gIGNvbnN0IHJlbmRlck1hcmtkb3duQXNIVE1MID0gdXNlUmVuZGVyTWFya2Rvd25Bc0hUTUwoKTtcbiAgY29uc3Qgc2Nyb2xsVG9FbmQgPSB1c2VTY3JvbGxUb0VuZCgpO1xuXG4gIGNvbnN0IGRpc2FibGVkID0gZGlzYWJsZWRGcm9tQ29tcG9zZXIgfHwgZGlzYWJsZWRGcm9tUHJvcHM7XG5cbiAgLy8gVE9ETzogW1AyXSAjMzE5OSBXZSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYGFkYXB0aXZlQ2FyZC5zZWxlY3RBY3Rpb25gIGluc3RlYWQuXG4gIC8vIFRoZSBudWxsIGNoZWNrIGZvciBcInRhcEFjdGlvblwiIGlzIGluIFwiaGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvblwiLlxuICBjb25zdCBoYW5kbGVDbGlja0FuZEtleVByZXNzID0gdXNlQ2FsbGJhY2soXG4gICAgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyBrZXksIHRhcmdldCwgdHlwZSB9ID0gZXZlbnQ7XG5cbiAgICAgIC8vIFNvbWUgaXRlbXMsIGUuZy4gdGFwcGFibGUgdGV4dCwgY2Fubm90IGJlIGRpc2FibGVkIHRocnUgRE9NIGF0dHJpYnV0ZXNcbiAgICAgIGNvbnN0IHsgY3VycmVudCB9ID0gY29udGVudFJlZjtcbiAgICAgIGNvbnN0IGFkYXB0aXZlQ2FyZFJvb3QgPSBjdXJyZW50LnF1ZXJ5U2VsZWN0b3IoJy5hYy1hZGFwdGl2ZUNhcmRbdGFiaW5kZXg9XCIwXCJdJyk7XG5cbiAgICAgIGlmICghYWRhcHRpdmVDYXJkUm9vdCkge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKFxuICAgICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm8gQWRhcHRpdmUgQ2FyZCByb290IGNvbnRhaW5lciBjYW4gYmUgZm91bmQ7IHRoZSBjYXJkIGlzIHByb2JhYmx5IG9uIGFuIHVuc3VwcG9ydGVkIEFkYXB0aXZlIENhcmQgdmVyc2lvbi4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBcImtleXByZXNzXCIgZXZlbnQsIHdlIG9ubHkgbGlzdGVuIHRvIEVOVEVSIGFuZCBTUEFDRUJBUiBrZXkuXG4gICAgICBpZiAodHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgICBpZiAoa2V5ICE9PSAnRW50ZXInICYmIGtleSAhPT0gJyAnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2Ugd2lsbCBjYWxsIHBlcmZvcm1DYXJkQWN0aW9uIGlmIGVpdGhlcjpcbiAgICAgIC8vIDEuIFdlIGFyZSBvbiB0aGUgdGFyZ2V0LCBvclxuICAgICAgLy8gMi4gVGhlIGV2ZW50LWRpc3BhdGNoaW5nIGVsZW1lbnQgaXMgbm90IGludGVyYWN0aXZlXG4gICAgICBpZiAodGFyZ2V0ICE9PSBhZGFwdGl2ZUNhcmRSb290KSB7XG4gICAgICAgIGNvbnN0IHRhYkluZGV4ID0gZ2V0VGFiSW5kZXgodGFyZ2V0KTtcblxuICAgICAgICAvLyBJZiB0aGUgdXNlciBpcyBjbGlja2luZyBvbiBzb21ldGhpbmcgdGhhdCBpcyBhbHJlYWR5IGNsaWNrYWJsZSwgZG8gbm90IGFsbG93IHRoZW0gdG8gY2xpY2sgdGhlIGNhcmQuXG4gICAgICAgIC8vIEUuZy4gYSBoZXJvIGNhcmQgY2FuIGJlIHRhcHBhYmxlLCBhbmQgaW1hZ2UgYW5kIGJ1dHRvbnMgaW5zaWRlIHRoZSBoZXJvIGNhcmQgY2FuIGFsc28gYmUgdGFwcGFibGUuXG4gICAgICAgIGlmICh0eXBlb2YgdGFiSW5kZXggPT09ICdudW1iZXInICYmIHRhYkluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGVyZm9ybUNhcmRBY3Rpb24odGFwQWN0aW9uKTtcbiAgICAgIHNjcm9sbFRvRW5kKCk7XG4gICAgfSxcbiAgICBbY29udGVudFJlZiwgcGVyZm9ybUNhcmRBY3Rpb24sIHNjcm9sbFRvRW5kLCB0YXBBY3Rpb25dXG4gICk7XG5cbiAgLy8gT25seSBsaXN0ZW4gdG8gZXZlbnQgaWYgaXQgaXMgbm90IGRpc2FibGVkIGFuZCBoYXZlIFwidGFwQWN0aW9uXCIgcHJvcC5cbiAgY29uc3QgaGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvbiA9ICFkaXNhYmxlZCAmJiB0YXBBY3Rpb24gPyBoYW5kbGVDbGlja0FuZEtleVByZXNzIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFkZEFjdGlvbnNQZXJmb3JtZWQgPSB1c2VDYWxsYmFjayhcbiAgICBhY3Rpb24gPT4gIX5hY3Rpb25zUGVyZm9ybWVkLmluZGV4T2YoYWN0aW9uKSAmJiBzZXRBY3Rpb25zUGVyZm9ybWVkKFsuLi5hY3Rpb25zUGVyZm9ybWVkLCBhY3Rpb25dKSxcbiAgICBbYWN0aW9uc1BlcmZvcm1lZCwgc2V0QWN0aW9uc1BlcmZvcm1lZF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVFeGVjdXRlQWN0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKGFjdGlvbjogQWN0aW9uKSA9PiB7XG4gICAgICAvLyBTb21lIGl0ZW1zLCBlLmcuIHRhcHBhYmxlIGltYWdlLCBjYW5ub3QgYmUgZGlzYWJsZWQgdGhydSBET00gYXR0cmlidXRlc1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYWRkQWN0aW9uc1BlcmZvcm1lZChhY3Rpb24pO1xuXG4gICAgICBjb25zdCBhY3Rpb25UeXBlTmFtZSA9IGFjdGlvbi5nZXRKc29uVHlwZU5hbWUoKTtcbiAgICAgIGNvbnN0IHsgaWNvblVybDogaW1hZ2UsIHRpdGxlIH0gPSBhY3Rpb247XG5cbiAgICAgIC8vIFdlIGNhbm5vdCB1c2UgXCJpbnN0YW5jZW9mXCIgY2hlY2sgaGVyZSwgYmVjYXVzZSB3ZWIgZGV2cyBtYXkgYnJpbmcgdGhlaXIgb3duIHZlcnNpb24gb2YgQWRhcHRpdmUgQ2FyZHMgcGFja2FnZS5cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgdXNpbmcgXCJnZXRKc29uVHlwZU5hbWUoKVwiIGluc3RlYWQuXG4gICAgICBpZiAoYWN0aW9uVHlwZU5hbWUgPT09ICdBY3Rpb24uT3BlblVybCcpIHtcbiAgICAgICAgY29uc3QgeyB1cmw6IHZhbHVlIH0gPSBhY3Rpb24gYXMgT3BlblVybEFjdGlvbjtcblxuICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbih7XG4gICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgdHlwZTogJ29wZW5VcmwnLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChhY3Rpb25UeXBlTmFtZSA9PT0gJ0FjdGlvbi5TdWJtaXQnKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYWN0aW9uIGFzIFN1Ym1pdEFjdGlvbiBhcyB7XG4gICAgICAgICAgZGF0YTogc3RyaW5nIHwgQm90RnJhbWV3b3JrQ2FyZEFjdGlvbjtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oe1xuICAgICAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIHR5cGU6ICdpbUJhY2snLFxuICAgICAgICAgICAgICB2YWx1ZTogZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhLl9faXNCb3RGcmFtZXdvcmtDYXJkQWN0aW9uKSB7XG4gICAgICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbihkYXRhLmNhcmRBY3Rpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbih7XG4gICAgICAgICAgICAgIGltYWdlLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgdHlwZTogJ3Bvc3RCYWNrJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNjcm9sbFRvRW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBXZWIgQ2hhdDogcmVjZWl2ZWQgdW5rbm93biBhY3Rpb24gZnJvbSBBZGFwdGl2ZSBDYXJkc2ApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGFjdGlvbik7XG4gICAgICB9XG4gICAgfSxcbiAgICBbYWRkQWN0aW9uc1BlcmZvcm1lZCwgZGlzYWJsZWQsIHBlcmZvcm1DYXJkQWN0aW9uLCBzY3JvbGxUb0VuZF1cbiAgKTtcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHsgY3VycmVudCB9ID0gY29udGVudFJlZjtcblxuICAgIGlmICghY3VycmVudCB8fCAhYWRhcHRpdmVDYXJkKSB7XG4gICAgICBhY3RpdmVFbGVtZW50SW5kZXhSZWYuY3VycmVudCA9IC0xO1xuICAgICAgaW5wdXRWYWx1ZXNSZWYuY3VycmVudCA9IFtdO1xuICAgIH1cblxuICAgIC8vIEN1cnJlbnRseSwgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgTWFya2Rvd24gZW5naW5lIGlzIHRvIHNldCBpdCB0aHJ1IHN0YXRpYyBtZW1iZXIgb2YgQWRhcHRpdmVDYXJkIGNsYXNzXG5cbiAgICAvLyBUT0RPOiBbUDNdIENoZWNrcyBpZiB3ZSBjb3VsZCBtYWtlIHRoZSBcInJlbmRlck1hcmtkb3duQXNIVE1MXCIgcGVyIGNhcmRcbiAgICAvLyAgICAgICBUaGlzIGNvdWxkIGJlIGxpbWl0YXRpb25zIGZyb20gQWRhcHRpdmUgQ2FyZHMgcGFja2FnZSAobm90IHN1cHBvcnRlZCBhcyBvZiAxLjIuNSlcbiAgICAvLyAgICAgICBCZWNhdXNlIHRoZXJlIGNvdWxkIGJlIHRpbWluZyBkaWZmZXJlbmNlIGJldHdlZW4gLnBhcnNlIGFuZCAucmVuZGVyLCB3ZSBjb3VsZCBiZSB1c2luZyB3cm9uZyBNYXJrZG93biBlbmdpbmVcblxuICAgIGFkYXB0aXZlQ2FyZC5jb25zdHJ1Y3Rvci5vblByb2Nlc3NNYXJrZG93biA9ICh0ZXh0LCByZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZW5kZXJNYXJrZG93bkFzSFRNTCkge1xuICAgICAgICByZXN1bHQub3V0cHV0SHRtbCA9IHJlbmRlck1hcmtkb3duQXNIVE1MKHRleHQpO1xuICAgICAgICByZXN1bHQuZGlkUHJvY2VzcyA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZykge1xuICAgICAgYWRhcHRpdmVDYXJkLmhvc3RDb25maWcgPSBpc1BsYWluT2JqZWN0KGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKVxuICAgICAgICA/IG5ldyBIb3N0Q29uZmlnKGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKVxuICAgICAgICA6IGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnO1xuICAgIH1cblxuICAgIC8vIEZvciBhY2Nlc3NpYmlsaXR5IGlzc3VlICMxMzQwLCBgdGFiaW5kZXg9XCIwXCJgIG11c3Qgbm90IGJlIHNldCBmb3IgdGhlIHJvb3QgY29udGFpbmVyIGlmIGl0IGlzIG5vdCBpbnRlcmFjdGl2ZS5cbiAgICBHbG9iYWxTZXR0aW5ncy5zZXRUYWJJbmRleEF0Q2FyZFJvb3QgPSAhIXRhcEFjdGlvbjtcblxuICAgIGNvbnN0IHsgdmFsaWRhdGlvbkV2ZW50cyB9ID0gYWRhcHRpdmVDYXJkLnZhbGlkYXRlUHJvcGVydGllcygpO1xuXG4gICAgaWYgKHZhbGlkYXRpb25FdmVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gc2V0RXJyb3JzKHZhbGlkYXRpb25FdmVudHMucmVkdWNlKChpdGVtcywgeyBtZXNzYWdlIH0pID0+IFsuLi5pdGVtcywgbmV3IEVycm9yKG1lc3NhZ2UpXSwgW10pKTtcbiAgICB9XG5cbiAgICBsZXQgZWxlbWVudDtcblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50ID0gYWRhcHRpdmVDYXJkLnJlbmRlcigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gc2V0RXJyb3JzKFtlcnJvcl0pO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHNldEVycm9ycyhbbmV3IEVycm9yKCdBZGFwdGl2ZSBDYXJkIHJlbmRlcmVkIGFzIGVtcHR5IGVsZW1lbnQnKV0pO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGVycm9ycyBvbiBuZXh0IHJlbmRlclxuICAgIHNldEVycm9ycyhbXSk7XG5cbiAgICByZXN0b3JlSW5wdXRWYWx1ZXMoZWxlbWVudCwgaW5wdXRWYWx1ZXNSZWYuY3VycmVudCk7XG5cbiAgICBjdXJyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCA9IGVsZW1lbnQ7XG5cbiAgICAvLyBGb2N1cyBjYW4gb25seSBiZSByZXN0b3JlZCBhZnRlciB0aGUgRE9NIGlzIGF0dGFjaGVkLlxuICAgIHJlc3RvcmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCwgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQpO1xuXG4gICAgc2V0TGFzdFJlbmRlcihEYXRlLm5vdygpKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmVFbGVtZW50SW5kZXhSZWYuY3VycmVudCA9IHNhdmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCk7XG4gICAgICBpbnB1dFZhbHVlc1JlZi5jdXJyZW50ID0gc2F2ZUlucHV0VmFsdWVzKGVsZW1lbnQpO1xuXG4gICAgICBjdXJyZW50LnJlbW92ZUNoaWxkKGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCk7XG5cbiAgICAgIGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9LCBbXG4gICAgYWRhcHRpdmVDYXJkLFxuICAgIGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnLFxuICAgIGNvbnRlbnRSZWYsXG4gICAgR2xvYmFsU2V0dGluZ3MsXG4gICAgSG9zdENvbmZpZyxcbiAgICByZW5kZXJNYXJrZG93bkFzSFRNTCxcbiAgICBzZXRFcnJvcnMsXG4gICAgdGFwQWN0aW9uXG4gIF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gU2V0IG9uRXhlY3V0ZUFjdGlvbiB3aXRob3V0IGNhdXNpbmcgdW5uZWNlc3NhcnkgcmUtcmVuZGVyLlxuICAgIGFkYXB0aXZlQ2FyZC5vbkV4ZWN1dGVBY3Rpb24gPSBkaXNhYmxlZCA/IHVuZGVmaW5lZCA6IGhhbmRsZUV4ZWN1dGVBY3Rpb247XG4gIH0sIFthZGFwdGl2ZUNhcmQsIGRpc2FibGVkLCBoYW5kbGVFeGVjdXRlQWN0aW9uXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IGZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyhhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpLCBbYWRhcHRpdmVDYXJkRWxlbWVudFJlZiwgbGFzdFJlbmRlcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gSWYgdGhlIEFkYXB0aXZlIENhcmQgZ2V0IHJlLXJlbmRlcmVkLCByZS1kaXNhYmxlIGVsZW1lbnRzIGFzIG5lZWRlZC5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCk7XG4gICAgfVxuICB9LCBbYWRhcHRpdmVDYXJkRWxlbWVudFJlZiwgZGlzYWJsZWQsIGxhc3RSZW5kZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIElmIHRoZSBBZGFwdGl2ZSBDYXJkIGNoYW5nZWQsIHJlc2V0IGFsbCBhY3Rpb25zIHBlcmZvcm1lZC5cbiAgICBzZXRBY3Rpb25zUGVyZm9ybWVkKFtdKTtcbiAgfSwgW2FkYXB0aXZlQ2FyZF0pO1xuXG4gIHVzZUVmZmVjdChcbiAgICAoKSA9PlxuICAgICAgaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyhcbiAgICAgICAgLy8gQWN0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIFwicmVuZGVyZWRFbGVtZW50XCIgbWVhbnMgaXQgaXMgdGhlIEFkYXB0aXZlIENhcmQgaXRzZWxmLCBzdWNoIGFzIFwic2VsZWN0QWN0aW9uXCIgKEFDKSBvciBcInRhcEFjdGlvblwiIChyaWNoIGNhcmRzKS5cbiAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdG8gbWFyayB0aGUgd2hvbGUgY2FyZCBhcyBwZXJmb3JtZWQuXG4gICAgICAgIGFjdGlvbnNQZXJmb3JtZWQubWFwKCh7IHJlbmRlcmVkRWxlbWVudCB9KSA9PiByZW5kZXJlZEVsZW1lbnQpLmZpbHRlcihyZW5kZXJlZEVsZW1lbnQgPT4gcmVuZGVyZWRFbGVtZW50KSxcbiAgICAgICAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lXG4gICAgICApLFxuICAgIFthY3Rpb25zUGVyZm9ybWVkLCBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsIGxhc3RSZW5kZXJdXG4gICk7XG5cbiAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyAoXG4gICAgbm9kZV9lbnYgPT09ICdkZXZlbG9wbWVudCcgJiYgPEVycm9yQm94IGVycm9yPXtlcnJvcnNbMF19IHR5cGU9e2xvY2FsaXplKCdBREFQVElWRV9DQVJEX0VSUk9SX0JPWF9USVRMRV9SRU5ERVInKX0gLz5cbiAgKSA6IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYWRhcHRpdmVDYXJkUmVuZGVyZXJTdHlsZVNldCArICcnLCAnd2ViY2hhdF9fYWRhcHRpdmUtY2FyZC1yZW5kZXJlcicpfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvbn1cbiAgICAgIG9uS2V5UHJlc3M9e2hhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb259XG4gICAgICByZWY9e2NvbnRlbnRSZWZ9XG4gICAgLz5cbiAgKTtcbn07XG5cbkFkYXB0aXZlQ2FyZFJlbmRlcmVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lOiAnJyxcbiAgZGlzYWJsZWQ6IHVuZGVmaW5lZCxcbiAgdGFwQWN0aW9uOiB1bmRlZmluZWRcbn07XG5cbkFkYXB0aXZlQ2FyZFJlbmRlcmVyLnByb3BUeXBlcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBhZGFwdGl2ZUNhcmQ6IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8vIFR5cGVTY3JpcHQgY2xhc3MgaXMgbm90IG1hcHBhYmxlIHRvIFByb3BUeXBlcy5mdW5jXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgLy8gQHRzLWlnbm9yZVxuICB0YXBBY3Rpb246IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgaW1hZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nXG4gIH0pXG59O1xuXG5leHBvcnQgZGVmYXVsdCBBZGFwdGl2ZUNhcmRSZW5kZXJlcjtcbiJdfQ==
734
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGl2ZUNhcmRzL0F0dGFjaG1lbnQvQWRhcHRpdmVDYXJkUmVuZGVyZXIudHN4Il0sIm5hbWVzIjpbIkVycm9yQm94IiwiQ29tcG9uZW50cyIsInVzZURpc2FibGVkIiwiaG9va3MiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VQZXJmb3JtQ2FyZEFjdGlvbiIsInVzZVJlbmRlck1hcmtkb3duQXNIVE1MIiwidXNlU2Nyb2xsVG9FbmQiLCJ1c2VTdHlsZVNldCIsIm5vZGVfZW52IiwiYnVuY2hVbmRvcyIsImZucyIsImZvckVhY2giLCJmbiIsImFkZENsYXNzIiwiZWxlbWVudCIsImNsYXNzTmFtZSIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiYWRkIiwiYWRkUGVyc2lzdGVudENsYXNzV2l0aFVuZG8iLCJvYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJvYnNlcnZlIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUZpbHRlciIsImNsYXNzTmFtZXMiLCJTZXQiLCJzcGxpdCIsImRlbGV0ZSIsIkFycmF5IiwiZnJvbSIsImpvaW4iLCJkaXNjb25uZWN0IiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwicHJvdG90eXBlIiwic2V0QXR0cmlidXRlV2l0aFVuZG8iLCJxdWFsaWZpZWROYW1lIiwibmV4dFZhbHVlIiwidmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJkaXNhYmxlZEhhbmRsZXIiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyIsIm5hbWUiLCJoYW5kbGVyIiwiZGV0YWNoIiwiZGV0YWNoaW5nSGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsImFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyIsImRpc2FibGVFbGVtZW50V2l0aFVuZG8iLCJ1bmRvU3RhY2siLCJpc0FjdGl2ZSIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsInRhZyIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwibWFwIiwiY2FsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvcHRpb24iLCJkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvIiwib2JzZXJ2ZVN1YnRyZWUiLCJtdXRhdGlvbnMiLCJhZGRlZE5vZGVzIiwiYWRkZWROb2RlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsImhhc0F0dHJpYnV0ZSIsInNldE9yUmVtb3ZlQXR0cmlidXRlIiwic2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyIsInByZXZWYWx1ZSIsImZpbmRBbmNlc3RvciIsInByZWRpY2F0ZSIsImN1cnJlbnQiLCJwYXJlbnRFbGVtZW50IiwiaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyIsInNlbGVjdGVkQWN0aW9uRWxlbWVudHMiLCJhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUiLCJsZW5ndGgiLCJzb21lIiwiYWN0aW9uRWxlbWVudCIsImNvbnNvbGUiLCJ3YXJuIiwiYWN0aW9uU2V0RWxlbWVudHMiLCJzZWxlY3RlZEFjdGlvbkVsZW1lbnQiLCJhY3Rpb25TZXRFbGVtZW50IiwiYW5jZXN0b3IiLCJpbmNsdWRlcyIsImZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyIsImFjdGlvbkJ1dHRvbiIsInVuZG8iLCJnZXRGb2N1c2FibGVFbGVtZW50cyIsImZpbHRlciIsInRhYkluZGV4IiwicmVzdG9yZUFjdGl2ZUVsZW1lbnRJbmRleCIsImFjdGl2ZUVsZW1lbnRJbmRleCIsImZvY3VzIiwic2F2ZUFjdGl2ZUVsZW1lbnRJbmRleCIsImluZGV4T2YiLCJyZXN0b3JlSW5wdXRWYWx1ZXMiLCJpbnB1dFZhbHVlcyIsImlucHV0cyIsImlucHV0IiwiaW5kZXgiLCJ0YWdOYW1lIiwidHlwZSIsImNoZWNrZWQiLCJzYXZlSW5wdXRWYWx1ZXMiLCJBZGFwdGl2ZUNhcmRSZW5kZXJlciIsImFkYXB0aXZlQ2FyZCIsImRpc2FibGVkRnJvbVByb3BzIiwiZGlzYWJsZWQiLCJ0YXBBY3Rpb24iLCJhZGFwdGl2ZUNhcmRSZW5kZXJlclN0eWxlU2V0IiwiYWRhcHRpdmVDYXJkUmVuZGVyZXIiLCJHbG9iYWxTZXR0aW5ncyIsIkhvc3RDb25maWciLCJhY3Rpb25zUGVyZm9ybWVkIiwic2V0QWN0aW9uc1BlcmZvcm1lZCIsImFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIiwiZGlzYWJsZWRGcm9tQ29tcG9zZXIiLCJlcnJvcnMiLCJzZXRFcnJvcnMiLCJsYXN0UmVuZGVyIiwic2V0TGFzdFJlbmRlciIsImFjdGl2ZUVsZW1lbnRJbmRleFJlZiIsImFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYiLCJjb250ZW50UmVmIiwiaW5wdXRWYWx1ZXNSZWYiLCJsb2NhbGl6ZSIsInBlcmZvcm1DYXJkQWN0aW9uIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJzY3JvbGxUb0VuZCIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3MiLCJrZXkiLCJ0YXJnZXQiLCJhZGFwdGl2ZUNhcmRSb290IiwicXVlcnlTZWxlY3RvciIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24iLCJ1bmRlZmluZWQiLCJhZGRBY3Rpb25zUGVyZm9ybWVkIiwiYWN0aW9uIiwiaGFuZGxlRXhlY3V0ZUFjdGlvbiIsImFjdGlvblR5cGVOYW1lIiwiZ2V0SnNvblR5cGVOYW1lIiwiaW1hZ2UiLCJpY29uVXJsIiwidGl0bGUiLCJ1cmwiLCJkYXRhIiwiX19pc0JvdEZyYW1ld29ya0NhcmRBY3Rpb24iLCJjYXJkQWN0aW9uIiwiZXJyb3IiLCJjb25zdHJ1Y3RvciIsInRleHQiLCJyZXN1bHQiLCJvdXRwdXRIdG1sIiwiZGlkUHJvY2VzcyIsImhvc3RDb25maWciLCJzZXRUYWJJbmRleEF0Q2FyZFJvb3QiLCJ2YWxpZGF0ZVByb3BlcnRpZXMiLCJ2YWxpZGF0aW9uRXZlbnRzIiwicmVkdWNlIiwiaXRlbXMiLCJtZXNzYWdlIiwiRXJyb3IiLCJyZW5kZXIiLCJhcHBlbmRDaGlsZCIsIkRhdGUiLCJub3ciLCJyZW1vdmVDaGlsZCIsIm9uRXhlY3V0ZUFjdGlvbiIsInJlbmRlcmVkRWxlbWVudCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImFueSIsImlzUmVxdWlyZWQiLCJib29sIiwic2hhcGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVNBOztBQUNBOztBQUNBOztBQUNBOztBQWFBOztBQUNBOzs7Ozs7QUExQkE7QUE0QkEsSUFBUUEsUUFBUixHQUFxQkMsd0NBQXJCLENBQVFELFFBQVI7QUFDQSxJQUFRRSxXQUFSLEdBQWtIQyxtQ0FBbEgsQ0FBUUQsV0FBUjtBQUFBLElBQXFCRSxZQUFyQixHQUFrSEQsbUNBQWxILENBQXFCQyxZQUFyQjtBQUFBLElBQW1DQyxvQkFBbkMsR0FBa0hGLG1DQUFsSCxDQUFtQ0Usb0JBQW5DO0FBQUEsSUFBeURDLHVCQUF6RCxHQUFrSEgsbUNBQWxILENBQXlERyx1QkFBekQ7QUFBQSxJQUFrRkMsY0FBbEYsR0FBa0hKLG1DQUFsSCxDQUFrRkksY0FBbEY7QUFBQSxJQUFrR0MsV0FBbEcsR0FBa0hMLG1DQUFsSCxDQUFrR0ssV0FBbEc7QUFFQSxJQUFNQyxRQUFRLEdBQUcseUJBQWpCOztBQUlBLFNBQVNDLFVBQVQsR0FBMEQ7QUFBQSxvQ0FBbkNDLEdBQW1DO0FBQW5DQSxJQUFBQSxHQUFtQztBQUFBOztBQUN4RCxTQUFPO0FBQUEsV0FBTUEsR0FBRyxDQUFDQyxPQUFKLENBQVksVUFBQUMsRUFBRTtBQUFBLGFBQUlBLEVBQUosYUFBSUEsRUFBSix1QkFBSUEsRUFBRSxFQUFOO0FBQUEsS0FBZCxDQUFOO0FBQUEsR0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBOzs7QUFDQSxTQUFTQyxRQUFULENBQWtCQyxPQUFsQixFQUF3Q0MsU0FBeEMsRUFBNkU7QUFD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WUFBWSxFQUFFa0UsbUJBQVVFLEdBQVYsQ0FBY0MsVUFGRztBQUcvQm5FLEVBQUFBLFFBQVEsRUFBRWdFLG1CQUFVSSxJQUhXO0FBSy9CO0FBQ0E7QUFDQW5FLEVBQUFBLFNBQVMsRUFBRStELG1CQUFVSyxLQUFWLENBQWdCO0FBQ3pCbkMsSUFBQUEsS0FBSyxFQUFFOEIsbUJBQVVDLE1BRFE7QUFFekI3QixJQUFBQSxLQUFLLEVBQUU0QixtQkFBVUMsTUFGUTtBQUd6QnZFLElBQUFBLElBQUksRUFBRXNFLG1CQUFVQyxNQUFWLENBQWlCRSxVQUhFO0FBSXpCckosSUFBQUEsS0FBSyxFQUFFa0osbUJBQVVDO0FBSlEsR0FBaEI7QUFQb0IsQ0FBakM7ZUFlZXBFLG9CIiwic291cmNlUm9vdCI6ImJ1bmRsZTovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbLTEsIDAsIDJdIH1dICovXG5cbmltcG9ydCB7XG4gIEFjdGlvbiBhcyBBZGFwdGl2ZUNhcmRBY3Rpb24sXG4gIEFkYXB0aXZlQ2FyZCxcbiAgSU1hcmtkb3duUHJvY2Vzc2luZ1Jlc3VsdCxcbiAgT3BlblVybEFjdGlvbixcbiAgU3VibWl0QWN0aW9uXG59IGZyb20gJ2FkYXB0aXZlY2FyZHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50cywgZ2V0VGFiSW5kZXgsIGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29tcG9uZW50JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwge1xuICBLZXlib2FyZEV2ZW50SGFuZGxlcixcbiAgTW91c2VFdmVudEhhbmRsZXIsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbiAgVkZDXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRGlyZWN0TGluZUNhcmRBY3Rpb24gfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb3JlJztcblxuaW1wb3J0IHsgQm90RnJhbWV3b3JrQ2FyZEFjdGlvbiB9IGZyb20gJy4vQWRhcHRpdmVDYXJkQnVpbGRlcic7XG5pbXBvcnQgdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcgZnJvbSAnLi4vaG9va3MvdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcnO1xuaW1wb3J0IHVzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlIGZyb20gJy4uL2hvb2tzL3VzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlJztcblxuY29uc3QgeyBFcnJvckJveCB9ID0gQ29tcG9uZW50cztcbmNvbnN0IHsgdXNlRGlzYWJsZWQsIHVzZUxvY2FsaXplciwgdXNlUGVyZm9ybUNhcmRBY3Rpb24sIHVzZVJlbmRlck1hcmtkb3duQXNIVE1MLCB1c2VTY3JvbGxUb0VuZCwgdXNlU3R5bGVTZXQgfSA9IGhvb2tzO1xuXG5jb25zdCBub2RlX2VudiA9IHByb2Nlc3MuZW52Lm5vZGVfZW52IHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WO1xuXG50eXBlIFVuZG9GdW5jdGlvbiA9ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gYnVuY2hVbmRvcyguLi5mbnM6IFVuZG9GdW5jdGlvbltdKTogVW5kb0Z1bmN0aW9uIHtcbiAgcmV0dXJuICgpID0+IGZucy5mb3JFYWNoKGZuID0+IGZuPy4oKSk7XG59XG5cbi8qKlxuICogQWRkcyBhIGNsYXNzIHRvIHRoZSBgSFRNTEVsZW1lbnRgLiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY2xhc3MgaXMgYWRkZWQsIG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IHRydWUgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGNsYXNzTGlzdCB9ID0gZWxlbWVudDtcblxuICBpZiAoIWNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGRzIGEgY2xhc3MgdG8gdGhlIGBIVE1MRWxlbWVudGAgYW5kIHJlLWFkZCBvbiBtdXRhdGlvbnMuXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCByZXN0b3JlIHRvIHByZXZpb3VzIHN0YXRlLlxuICovXG5mdW5jdGlvbiBhZGRQZXJzaXN0ZW50Q2xhc3NXaXRoVW5kbyhlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBVbmRvRnVuY3Rpb24ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSkge1xuICAgIC8vIEFmdGVyIHdlIGFkZCB0aGUgY2xhc3MsIGtlZXAgb2JzZXJ2aW5nIHRoZSBlbGVtZW50IHRvIG1ha2Ugc3VyZSB0aGUgY2xhc3MgaXMgbm90IHJlbW92ZWQuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnY2xhc3MnXSB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjbGFzc05hbWVzID0gbmV3IFNldChlbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpKTtcblxuICAgICAgY2xhc3NOYW1lcy5kZWxldGUoY2xhc3NOYW1lKTtcblxuICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBBcnJheS5mcm9tKGNsYXNzTmFtZXMpLmpvaW4oJyAnKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAsIGlmIHRoZSBvYmplY3QgaXMgYSBwbGFpbiBvYmplY3QgYW5kIG5vdCBhIGNsYXNzLCBvdGhlcndpc2UsIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cblxuLyoqXG4gKiBTZXRzIGFuIGF0dHJpYnV0ZS5cbiAqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHJlc3RvcmUgdG8gcHJldmlvdXMgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZVdpdGhVbmRvKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcbiAgcXVhbGlmaWVkTmFtZTogc3RyaW5nLFxuICBuZXh0VmFsdWU6IHN0cmluZ1xuKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcblxuICBpZiAodmFsdWUgIT09IG5leHRWYWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIG5leHRWYWx1ZSk7XG5cbiAgICByZXR1cm4gKCkgPT4gKHZhbHVlID8gZWxlbWVudC5zZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpIDogZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkpO1xuICB9XG59XG5cbi8qKlxuICogQW4gZXZlbnQgaGFuZGxlciBmb3IgZGlzYWJsaW5nIGV2ZW50IGJ1YmJsaW5nIGFuZCBwcm9wYWdhdGlvbi5cbiAqL1xuY29uc3QgZGlzYWJsZWRIYW5kbGVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59O1xuXG4vKipcbiAqIExpc3RlbnMgdG8gZXZlbnQgb25jZS4gUmV0dXJucyBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCBzdG9wIGxpc3RlbmluZy5cbiAqL1xuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4gIG5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogRXZlbnRMaXN0ZW5lclxuKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCAqL1xuICBsZXQgZGV0YWNoOiAoKSA9PiB2b2lkO1xuICBjb25zdCBkZXRhY2hpbmdIYW5kbGVyID0gZXZlbnQgPT4ge1xuICAgIHRyeSB7XG4gICAgICBoYW5kbGVyKGV2ZW50KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHsgb25jZTogdHJ1ZSB9LCBzbyB3ZSBuZWVkIHRvIGRldGFjaCBtYW51YWxseS5cbiAgICAgIGRldGFjaCgpO1xuICAgIH1cbiAgfTtcblxuICBkZXRhY2ggPSAoKSA9PiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgZGV0YWNoaW5nSGFuZGxlcik7XG5cbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGRldGFjaGluZ0hhbmRsZXIsIHsgb25jZTogdHJ1ZSB9KTtcblxuICByZXR1cm4gZGV0YWNoO1xufVxuXG4vKipcbiAqIExpc3RlbnMgdG8gZXZlbnQuIFJldHVybnMgYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgc3RvcCBsaXN0ZW5pbmcuXG4gKi9cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4gIG5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogRXZlbnRMaXN0ZW5lclxuKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIpO1xuXG4gIHJldHVybiAoKSA9PiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlcik7XG59XG5cbi8qKlxuICogRGlzYWJsZXMgYW4gZWxlbWVudCB3aXRoIHVuZG8gZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCByZXN0b3JlIHRvIHByZXZpb3VzIHN0YXRlLlxuICovXG5mdW5jdGlvbiBkaXNhYmxlRWxlbWVudFdpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdW5kb1N0YWNrOiBVbmRvRnVuY3Rpb25bXSA9IFtdO1xuICBjb25zdCBpc0FjdGl2ZSA9IGVsZW1lbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGNvbnN0IHRhZyA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlICovXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICB1bmRvU3RhY2sucHVzaChzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCAnYXJpYS1kaXNhYmxlZCcsICd0cnVlJykpO1xuXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goXG4gICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyhlbGVtZW50LCAnYmx1cicsICgpID0+XG4gICAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKGFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyhlbGVtZW50LCAnY2xpY2snLCBkaXNhYmxlZEhhbmRsZXIpKTtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ3JlYWRvbmx5JywgJ3JlYWRvbmx5JykpO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKFxuICAgICAgICAgIC4uLltdLm1hcC5jYWxsKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJyksIG9wdGlvbiA9PlxuICAgICAgICAgICAgc2V0QXR0cmlidXRlV2l0aFVuZG8ob3B0aW9uLCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gYnVuY2hVbmRvcyguLi51bmRvU3RhY2spO1xufVxuXG4vKipcbiAqIERpc2FibGVzIGFsbCBpbnB1dHRhYmxlIGRlc2NlbmRhbnRzLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnQgfCB1bmRlZmluZWR9IGVsZW1lbnQgQ29udGFpbmVyIGVsZW1lbnQgdG8gc3RhcnQgbG9va2luZyBmb3IgaW5wdXR0YWJsZSBkZXNjZW5kYW50cy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb2JzZXJ2ZVN1YnRyZWUgYHRydWVgIHRvIGFwcGxpZXMgdG8gYWxsIGZ1dHVyZSBpbnB1dHRhYmxlIGRlc2NlbmRhbnRzLCBvdGhlcndpc2UsIGBmYWxzZWAuXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCByZXN0b3JlIHRvIHByZXZpb3VzIHN0YXRlLlxuICovXG5mdW5jdGlvbiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLCBvYnNlcnZlU3VidHJlZSA9IHRydWUpOiBVbmRvRnVuY3Rpb24ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB1bmRvU3RhY2s6ICgoKSA9PiB2b2lkKVtdID0gW10ubWFwLmNhbGwoZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhJyksIGVsZW1lbnQgPT5cbiAgICBkaXNhYmxlRWxlbWVudFdpdGhVbmRvKGVsZW1lbnQpXG4gICk7XG5cbiAgY29uc3QgdGFnID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIE9ubHkgc2V0IHRhYmluZGV4PVwiLTFcIiBvbiBmb2N1c2FibGUgZWxlbWVudC4gT3RoZXJ3aXNlLCB3ZSB3aWxsIG1ha2UgPGRpdj4gZm9jdXNhYmxlIGJ5IG1vdXNlLlxuICAodGFnID09PSAnYScgfHwgdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYScpICYmXG4gICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ3RhYmluZGV4JywgJy0xJykpO1xuXG4gIGlmIChvYnNlcnZlU3VidHJlZSkge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+XG4gICAgICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBhZGRlZE5vZGVzIH0pID0+XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKC4uLltdLm1hcC5jYWxsKGFkZGVkTm9kZXMsIGFkZGVkTm9kZSA9PiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGFkZGVkTm9kZSwgZmFsc2UpKSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgIHVuZG9TdGFjay5wdXNoKCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gIH1cblxuICByZXR1cm4gYnVuY2hVbmRvcyguLi51bmRvU3RhY2spO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQuXG4gKlxuICogQHJldHVybnMge2ZhbHNlIHwgc3RyaW5nfSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gYGZhbHNlYCBpZiB0aGUgYXR0cmlidXRlIHdhcyBub3Qgc2V0LlxuICovXG5mdW5jdGlvbiBnZXRBdHRyaWJ1dGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHF1YWxpZmllZE5hbWU6IHN0cmluZyk6IGZhbHNlIHwgc3RyaW5nIHtcbiAgcmV0dXJuICEhZWxlbWVudCAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSAmJiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHwgJycpO1xufVxuXG4vKipcbiAqIFNldHMgb3IgcmVtb3ZlcyBhbiBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzZXQgb3IgcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tLlxuICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICogQHBhcmFtIHtmYWxzZSB8IHN0cmluZ30gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gV2hlbiBwYXNzaW5nIGBmYWxzZWAsIHJlbW92ZSB0aGUgYXR0cmlidXRlLlxuICovXG5mdW5jdGlvbiBzZXRPclJlbW92ZUF0dHJpYnV0ZShlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCwgcXVhbGlmaWVkTmFtZTogc3RyaW5nLCB2YWx1ZTogZmFsc2UgfCBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgIGVsZW1lbnQ/LnJlbW92ZUF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBlbGVtZW50Py5zZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogU2V0cyBvciByZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQgd2l0aCBhbiB1bmRvIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzZXQgb3IgcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tLlxuICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICogQHBhcmFtIHtmYWxzZSB8IHN0cmluZ30gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gV2hlbiBwYXNzaW5nIGBmYWxzZWAsIHJlbW92ZSB0aGUgYXR0cmlidXRlLlxuICpcbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSBUaGUgdW5kbyBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgdW5kbyBhbGwgbWFuaXB1bGF0aW9ucyBieSByZXN0b3JpbmcgdmFsdWVzIHJlY29yZGVkIGF0IHRoZSB0aW1lIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxuICovXG5mdW5jdGlvbiBzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcbiAgcXVhbGlmaWVkTmFtZTogc3RyaW5nLFxuICB2YWx1ZTogZmFsc2UgfCBzdHJpbmdcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHByZXZWYWx1ZSA9IGdldEF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lKTtcblxuICBzZXRPclJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lLCB2YWx1ZSk7XG5cbiAgcmV0dXJuICgpID0+IHNldE9yUmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIHF1YWxpZmllZE5hbWUsIHByZXZWYWx1ZSk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGZpcnN0IGFuY2VzdG9yIHRoYXQgZnVsZmlsbCB0aGUgcHJlZGljYXRlLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgc3RhcnRpbmcgZWxlbWVudC4gVGhpcyBlbGVtZW50IHdpbGwgbm90IGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgcHJlZGljYXRlLlxuICogQHBhcmFtIHsoYW5jZXN0b3I6IEhUTUxFbGVtZW50KSA9PiBib29sZWFufSBwcmVkaWNhdGUgLSBUaGUgcHJlZGljYXRlIHRvIGZ1bGZpbGwuXG4gKlxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgdW5kZWZpbmVkfSBUaGUgZmlyc3QgYW5jZXN0b3IgdGhhdCBmdWxmaWxsIHRoZSBwcmVkaWNhdGUsIG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRBbmNlc3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCwgcHJlZGljYXRlOiAoYW5jZXN0b3I6IEhUTUxFbGVtZW50KSA9PiBib29sZWFuKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudCA9IGVsZW1lbnQ7XG5cbiAgd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50KSkge1xuICAgIGlmIChwcmVkaWNhdGUuY2FsbChlbGVtZW50LCBjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoZSBhY3Rpb24gc2VsZWN0ZWQgYnkgcGVyZm9ybWluZyBhIHNlcmllcyBvZiBtYW5pcHVsYXRpb25zLCB3aXRoIHVuZG86XG4gKlxuICogLSBBY2Nlc3NpYmlsaXR5OiBzZXQgYGFyaWEtcHJlc3NlZGAgdG8gYHRydWVgXG4gKiAtIEFwcGxpZXMgYHN0eWxlT3B0aW9ucy5hY3Rpb25QZXJmb3JtZWRDbGFzc05hbWVgXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudFtdfSBzZWxlY3RlZEFjdGlvbkVsZW1lbnRzIC0gQW4gYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgcmVwcmVzZW50aW5nIHRoZSBhY3Rpb24gYW5kIGlzIHNlbGVjdGVkLlxuICogQHBhcmFtIHtzdHJpbmc/fSBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYXBwbHkgdG8gYWxsIGVsZW1lbnRzLlxuICpcbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSBUaGUgdW5kbyBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgdW5kbyBhbGwgbWFuaXB1bGF0aW9ucyBieSByZXN0b3JpbmcgdmFsdWVzIHJlY29yZGVkIGF0IHRoZSB0aW1lIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxuICovXG5mdW5jdGlvbiBpbmRpY2F0ZUFjdGlvblNlbGVjdGlvbldpdGhVbmRvKFxuICBzZWxlY3RlZEFjdGlvbkVsZW1lbnRzOiBIVE1MRWxlbWVudFtdIHwgdW5kZWZpbmVkLFxuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWU/OiBzdHJpbmdcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghc2VsZWN0ZWRBY3Rpb25FbGVtZW50cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVmVyaWZ5IGFsbCBpbnB1dCBlbGVtZW50cyBhcmUgXCJhYy1wdXNoQnV0dG9uXCIsIGNvdWxkIGJlbG9uZ3MgdG8gQWN0aW9uU2V0IG9yIFwiY2FyZCBhY3Rpb25zXCIuXG4gIGlmIChzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLnNvbWUoYWN0aW9uRWxlbWVudCA9PiAhYWN0aW9uRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjLXB1c2hCdXR0b24nKSkpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnYm90ZnJhbWV3b3JrLXdlYmNoYXQ6IENhbm5vdCBtYXJrIHNlbGVjdGVkIGFjdGlvbiBpbiB0aGUgY2FyZCwgc29tZSBlbGVtZW50cyBhcmUgbm90IGFuIFwiYWMtcHVzaEJ1dHRvblwiLidcbiAgICApO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQSBkaXN0aW5jdCBzZXQgb2YgYWN0aW9uIHNldCBjb250YWluZXJzIHdoaWNoIGhhcyBzZWxlY3Rpb25zLCBleGNsdWRpbmcgY29udGFpbmVycyB3aXRob3V0IGFjdGlvbnMuXG4gIC8vIE11bHRpcGxlIHN1Ym1pc3Npb24gaW4gYW4gQWRhcHRpdmUgQ2FyZCBpcyBzdGlsbCBhIHZhZ3VlIGFyZWEgYW5kIFRCRC5cbiAgLy8gV2UgbWlnaHQgd2FudCB0byBkaXNhYmxlIHRoZSB3aG9sZSBjYXJkLCBqdXN0IGJ1dHRvbnMgaW4gc2FtZSBjb250YWluZXIsIG9yIGRvIG5vdGhpbmcgKHRvZGF5KS5cbiAgY29uc3QgYWN0aW9uU2V0RWxlbWVudHMgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuXG4gIHNlbGVjdGVkQWN0aW9uRWxlbWVudHMuZm9yRWFjaChzZWxlY3RlZEFjdGlvbkVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGFjdGlvblNldEVsZW1lbnQgPSBmaW5kQW5jZXN0b3IoXG4gICAgICBzZWxlY3RlZEFjdGlvbkVsZW1lbnQsXG4gICAgICBhbmNlc3RvciA9PiBhbmNlc3Rvci5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ21lbnViYXInXG4gICAgKTtcblxuICAgIGFjdGlvblNldEVsZW1lbnQgJiYgYWN0aW9uU2V0RWxlbWVudHMuYWRkKGFjdGlvblNldEVsZW1lbnQpO1xuICB9KTtcblxuICBjb25zdCB1bmRvU3RhY2s6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgYWN0aW9uU2V0RWxlbWVudHMuZm9yRWFjaChhY3Rpb25TZXRFbGVtZW50ID0+IHtcbiAgICAvLyBSZW1vdmUgXCJyb2xlXCIgZnJvbSBldmVyeSBcImFjLWFjdGlvblNldFwiIGNvbnRhaW5lci5cbiAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvblNldEVsZW1lbnQsICdyb2xlJywgZmFsc2UpKTtcblxuICAgIC8vIE1vZGlmeSBcInJvbGVcIiBvZiBldmVyeSBhY3Rpb25zIGluIHRoZSBjb250YWluZXIuXG4gICAgQXJyYXkuZnJvbShhY3Rpb25TZXRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hYy1wdXNoQnV0dG9uJykgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4pLmZvckVhY2goXG4gICAgICBhY3Rpb25FbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkQWN0aW9uRWxlbWVudHMuaW5jbHVkZXMoYWN0aW9uRWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBBZGQgXCJhcmlhLXByZXNzZWRcIiBhbmQgc2V0IFwicm9sZVwiIGF0dHJpYnV0ZSB0byBcImJ1dHRvblwiICh3aGljaCBpcyByZXF1aXJlZCBieSBcImFyaWEtcHJlc3NlZFwiKS5cbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdhcmlhLXByZXNzZWQnLCAndHJ1ZScpKTtcbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdyb2xlJywgJ2J1dHRvbicpKTtcblxuICAgICAgICAgIC8vIEhpZ2hsaWdodCBhY3Rpb25zIGJ5IGFwcGx5aW5nIGBzdHlsZU9wdGlvbnMuYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lYC5cbiAgICAgICAgICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUgJiZcbiAgICAgICAgICAgIHVuZG9TdGFjay5wdXNoKGFkZFBlcnNpc3RlbnRDbGFzc1dpdGhVbmRvKGFjdGlvbkVsZW1lbnQsIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlIHJlbW92ZWQgXCJyb2xlPW1lbnViYXJcIiBmcm9tIHRoZSBjb250YWluZXIsIHdlIG11c3QgcmVtb3ZlIFwicm9sZT1tZW51aXRlbVwiIGZyb20gdW5zZWxlY3RlZCBhY3Rpb25zLlxuICAgICAgICAgIHVuZG9TdGFjay5wdXNoKHNldE9yUmVtb3ZlQXR0cmlidXRlV2l0aFVuZG8oYWN0aW9uRWxlbWVudCwgJ3JvbGUnLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJ1bmNoVW5kb3MoLi4udW5kb1N0YWNrKTtcbn1cblxuLyoqXG4gKiBGaXhlcyBhY2Nlc3NpYmlsaXR5IGlzc3VlcyBmcm9tIEFkYXB0aXZlIENhcmQsIHdpdGggdW5kby5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVGhlIHVuZG8gZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHVuZG8gYWxsIG1hbmlwdWxhdGlvbnMgYnkgcmVzdG9yaW5nIHZhbHVlcyByZWNvcmRlZCBhdCB0aGUgdGltZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZml4QWNjZXNzaWJpbGl0eUlzc3Vlc1dpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVGhlc2UgaGFja3Mgc2hvdWxkIGJlIGRvbmUgaW4gQWRhcHRpdmUgQ2FyZHMgbGlicmFyeSBpbnN0ZWFkLlxuICAvLyBSZWxhdGVkIHRvICMzOTQ5OiBBbGwgYWN0aW9uIGJ1dHRvbnMgaW5zaWRlIHJvbGU9XCJtZW51YmFyXCIgc2hvdWxkIGJlIHJvbGU9XCJtZW51aXRlbVwiLlxuICBjb25zdCB1bmRvU3RhY2s6IFVuZG9GdW5jdGlvbltdID0gQXJyYXkuZnJvbShcbiAgICBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hYy1hY3Rpb25TZXRbcm9sZT1cIm1lbnViYXJcIl0gW3JvbGU9XCJidXR0b25cIl0nKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PlxuICApLm1hcChhY3Rpb25CdXR0b24gPT4gc2V0QXR0cmlidXRlV2l0aFVuZG8oYWN0aW9uQnV0dG9uLCAncm9sZScsICdtZW51aXRlbScpKTtcblxuICByZXR1cm4gKCkgPT4gdW5kb1N0YWNrLmZvckVhY2godW5kbyA9PiB1bmRvPy4oKSk7XG59XG5cbmZ1bmN0aW9uIGdldEZvY3VzYWJsZUVsZW1lbnRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIHJldHVybiBbXS5maWx0ZXIuY2FsbChcbiAgICBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBbXG4gICAgICAgICdhJyxcbiAgICAgICAgJ2JvZHknLFxuICAgICAgICAnYnV0dG9uJyxcbiAgICAgICAgJ2ZyYW1lJyxcbiAgICAgICAgJ2lmcmFtZScsXG4gICAgICAgICdpbWcnLFxuICAgICAgICAnaW5wdXQnLFxuICAgICAgICAnaXNpbmRleCcsXG4gICAgICAgICdvYmplY3QnLFxuICAgICAgICAnc2VsZWN0JyxcbiAgICAgICAgJ3RleHRhcmVhJyxcbiAgICAgICAgJ1t0YWJpbmRleF0nXG4gICAgICBdLmpvaW4oJywgJylcbiAgICApIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+LFxuICAgIGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleChlbGVtZW50KTtcblxuICAgICAgcmV0dXJuIHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMDtcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudDogSFRNTEVsZW1lbnQsIGFjdGl2ZUVsZW1lbnRJbmRleDogbnVtYmVyKSB7XG4gIGdldEZvY3VzYWJsZUVsZW1lbnRzKGVsZW1lbnQpWythY3RpdmVFbGVtZW50SW5kZXhdPy5mb2N1cygpO1xufVxuXG5mdW5jdGlvbiBzYXZlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIHJldHVybiBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50KS5pbmRleE9mKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlSW5wdXRWYWx1ZXMoZWxlbWVudDogSFRNTEVsZW1lbnQsIGlucHV0VmFsdWVzOiAoYm9vbGVhbiB8IHN0cmluZylbXSkge1xuICBjb25zdCBpbnB1dHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJykgYXMgTm9kZUxpc3RPZjxcbiAgICBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gID47XG5cbiAgW10uZm9yRWFjaC5jYWxsKGlucHV0cywgKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFZhbHVlc1sraW5kZXhdO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IHsgdGFnTmFtZSwgdHlwZSB9ID0gaW5wdXQ7XG5cbiAgICAgIGlmICh0YWdOYW1lID09PSAnSU5QVVQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIChpbnB1dCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNhdmVJbnB1dFZhbHVlcyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IChib29sZWFuIHwgc3RyaW5nKVtdIHtcbiAgY29uc3QgaW5wdXRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpIGFzIE5vZGVMaXN0T2Y8XG4gICAgSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICA+O1xuXG4gIHJldHVybiBbXS5tYXAuY2FsbChpbnB1dHMsIChpbnB1dDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gaW5wdXQ7XG5cbiAgICBpZiAoaW5wdXQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKSkge1xuICAgICAgcmV0dXJuIChpbnB1dCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICAgIH1cblxuICAgIHJldHVybiBpbnB1dC52YWx1ZTtcbiAgfSk7XG59XG5cbnR5cGUgQWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lPzogc3RyaW5nO1xuICBhZGFwdGl2ZUNhcmQ6IEFkYXB0aXZlQ2FyZDtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0YXBBY3Rpb24/OiBEaXJlY3RMaW5lQ2FyZEFjdGlvbjtcbn07XG5cbmNvbnN0IEFkYXB0aXZlQ2FyZFJlbmRlcmVyOiBWRkM8QWRhcHRpdmVDYXJkUmVuZGVyZXJQcm9wcz4gPSAoe1xuICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsXG4gIGFkYXB0aXZlQ2FyZCxcbiAgZGlzYWJsZWQ6IGRpc2FibGVkRnJvbVByb3BzLFxuICB0YXBBY3Rpb25cbn0pID0+IHtcbiAgY29uc3QgW3sgYWRhcHRpdmVDYXJkUmVuZGVyZXI6IGFkYXB0aXZlQ2FyZFJlbmRlcmVyU3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbeyBHbG9iYWxTZXR0aW5ncywgSG9zdENvbmZpZyB9XSA9IHVzZUFkYXB0aXZlQ2FyZHNQYWNrYWdlKCk7XG4gIGNvbnN0IFthY3Rpb25zUGVyZm9ybWVkLCBzZXRBY3Rpb25zUGVyZm9ybWVkXSA9IHVzZVN0YXRlPEFkYXB0aXZlQ2FyZEFjdGlvbltdPihbXSk7XG4gIGNvbnN0IFthZGFwdGl2ZUNhcmRzSG9zdENvbmZpZ10gPSB1c2VBZGFwdGl2ZUNhcmRzSG9zdENvbmZpZygpO1xuICBjb25zdCBbZGlzYWJsZWRGcm9tQ29tcG9zZXJdID0gdXNlRGlzYWJsZWQoKTtcbiAgY29uc3QgW2Vycm9ycywgc2V0RXJyb3JzXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2xhc3RSZW5kZXIsIHNldExhc3RSZW5kZXJdID0gdXNlU3RhdGUoMCk7XG4gIGNvbnN0IGFjdGl2ZUVsZW1lbnRJbmRleFJlZiA9IHVzZVJlZigtMSk7XG4gIGNvbnN0IGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYgPSB1c2VSZWY8SFRNTEVsZW1lbnQ+KCk7XG4gIGNvbnN0IGNvbnRlbnRSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG4gIGNvbnN0IGlucHV0VmFsdWVzUmVmID0gdXNlUmVmPChib29sZWFuIHwgc3RyaW5nKVtdPihbXSk7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IHBlcmZvcm1DYXJkQWN0aW9uID0gdXNlUGVyZm9ybUNhcmRBY3Rpb24oKTtcbiAgY29uc3QgcmVuZGVyTWFya2Rvd25Bc0hUTUwgPSB1c2VSZW5kZXJNYXJrZG93bkFzSFRNTCgpO1xuICBjb25zdCBzY3JvbGxUb0VuZCA9IHVzZVNjcm9sbFRvRW5kKCk7XG5cbiAgY29uc3QgZGlzYWJsZWQgPSBkaXNhYmxlZEZyb21Db21wb3NlciB8fCBkaXNhYmxlZEZyb21Qcm9wcztcblxuICAvLyBUT0RPOiBbUDJdICMzMTk5IFdlIHNob3VsZCBjb25zaWRlciB1c2luZyBgYWRhcHRpdmVDYXJkLnNlbGVjdEFjdGlvbmAgaW5zdGVhZC5cbiAgLy8gVGhlIG51bGwgY2hlY2sgZm9yIFwidGFwQWN0aW9uXCIgaXMgaW4gXCJoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uXCIuXG4gIGNvbnN0IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3MgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7IGtleSwgdHlwZSB9ID0gZXZlbnQgYXMgS2V5Ym9hcmRFdmVudDtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudDtcblxuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSB0ZXh0LCBjYW5ub3QgYmUgZGlzYWJsZWQgdGhydSBET00gYXR0cmlidXRlc1xuICAgICAgY29uc3QgeyBjdXJyZW50IH0gPSBjb250ZW50UmVmO1xuICAgICAgY29uc3QgYWRhcHRpdmVDYXJkUm9vdCA9IGN1cnJlbnQucXVlcnlTZWxlY3RvcignLmFjLWFkYXB0aXZlQ2FyZFt0YWJpbmRleD1cIjBcIl0nKTtcblxuICAgICAgaWYgKCFhZGFwdGl2ZUNhcmRSb290KSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ2JvdGZyYW1ld29yay13ZWJjaGF0OiBObyBBZGFwdGl2ZSBDYXJkIHJvb3QgY29udGFpbmVyIGNhbiBiZSBmb3VuZDsgdGhlIGNhcmQgaXMgcHJvYmFibHkgb24gYW4gdW5zdXBwb3J0ZWQgQWRhcHRpdmUgQ2FyZCB2ZXJzaW9uLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIFwia2V5cHJlc3NcIiBldmVudCwgd2Ugb25seSBsaXN0ZW4gdG8gRU5URVIgYW5kIFNQQUNFQkFSIGtleS5cbiAgICAgIGlmICh0eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICAgIGlmIChrZXkgIT09ICdFbnRlcicgJiYga2V5ICE9PSAnICcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSB3aWxsIGNhbGwgcGVyZm9ybUNhcmRBY3Rpb24gaWYgZWl0aGVyOlxuICAgICAgLy8gMS4gV2UgYXJlIG9uIHRoZSB0YXJnZXQsIG9yXG4gICAgICAvLyAyLiBUaGUgZXZlbnQtZGlzcGF0Y2hpbmcgZWxlbWVudCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgIGlmICh0YXJnZXQgIT09IGFkYXB0aXZlQ2FyZFJvb3QpIHtcbiAgICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleCh0YXJnZXQpO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGlzIGNsaWNraW5nIG9uIHNvbWV0aGluZyB0aGF0IGlzIGFscmVhZHkgY2xpY2thYmxlLCBkbyBub3QgYWxsb3cgdGhlbSB0byBjbGljayB0aGUgY2FyZC5cbiAgICAgICAgLy8gRS5nLiBhIGhlcm8gY2FyZCBjYW4gYmUgdGFwcGFibGUsIGFuZCBpbWFnZSBhbmQgYnV0dG9ucyBpbnNpZGUgdGhlIGhlcm8gY2FyZCBjYW4gYWxzbyBiZSB0YXBwYWJsZS5cbiAgICAgICAgaWYgKHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwZXJmb3JtQ2FyZEFjdGlvbih0YXBBY3Rpb24pO1xuICAgICAgc2Nyb2xsVG9FbmQoKTtcbiAgICB9LFxuICAgIFtjb250ZW50UmVmLCBwZXJmb3JtQ2FyZEFjdGlvbiwgc2Nyb2xsVG9FbmQsIHRhcEFjdGlvbl1cbiAgKTtcblxuICAvLyBPbmx5IGxpc3RlbiB0byBldmVudCBpZiBpdCBpcyBub3QgZGlzYWJsZWQgYW5kIGhhdmUgXCJ0YXBBY3Rpb25cIiBwcm9wLlxuICBjb25zdCBoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uID0gIWRpc2FibGVkICYmIHRhcEFjdGlvbiA/IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3MgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYWRkQWN0aW9uc1BlcmZvcm1lZCA9IHVzZUNhbGxiYWNrKFxuICAgIChhY3Rpb246IEFkYXB0aXZlQ2FyZEFjdGlvbik6IHZvaWQgPT5cbiAgICAgICF+YWN0aW9uc1BlcmZvcm1lZC5pbmRleE9mKGFjdGlvbikgJiYgc2V0QWN0aW9uc1BlcmZvcm1lZChbLi4uYWN0aW9uc1BlcmZvcm1lZCwgYWN0aW9uXSksXG4gICAgW2FjdGlvbnNQZXJmb3JtZWQsIHNldEFjdGlvbnNQZXJmb3JtZWRdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlRXhlY3V0ZUFjdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChhY3Rpb246IEFkYXB0aXZlQ2FyZEFjdGlvbik6IHZvaWQgPT4ge1xuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSBpbWFnZSwgY2Fubm90IGJlIGRpc2FibGVkIHRocnUgRE9NIGF0dHJpYnV0ZXNcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFkZEFjdGlvbnNQZXJmb3JtZWQoYWN0aW9uKTtcblxuICAgICAgY29uc3QgYWN0aW9uVHlwZU5hbWUgPSBhY3Rpb24uZ2V0SnNvblR5cGVOYW1lKCk7XG4gICAgICBjb25zdCB7IGljb25Vcmw6IGltYWdlLCB0aXRsZSB9ID0gYWN0aW9uO1xuXG4gICAgICAvLyBXZSBjYW5ub3QgdXNlIFwiaW5zdGFuY2VvZlwiIGNoZWNrIGhlcmUsIGJlY2F1c2Ugd2ViIGRldnMgbWF5IGJyaW5nIHRoZWlyIG93biB2ZXJzaW9uIG9mIEFkYXB0aXZlIENhcmRzIHBhY2thZ2UuXG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHVzaW5nIFwiZ2V0SnNvblR5cGVOYW1lKClcIiBpbnN0ZWFkLlxuICAgICAgaWYgKGFjdGlvblR5cGVOYW1lID09PSAnQWN0aW9uLk9wZW5VcmwnKSB7XG4gICAgICAgIGNvbnN0IHsgdXJsOiB2YWx1ZSB9ID0gYWN0aW9uIGFzIE9wZW5VcmxBY3Rpb247XG5cbiAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oe1xuICAgICAgICAgIGltYWdlLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHR5cGU6ICdvcGVuVXJsJyxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aW9uVHlwZU5hbWUgPT09ICdBY3Rpb24uU3VibWl0Jykge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGFjdGlvbiBhcyBTdWJtaXRBY3Rpb24gYXMge1xuICAgICAgICAgIGRhdGE6IHN0cmluZyB8IEJvdEZyYW1ld29ya0NhcmRBY3Rpb247XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKHtcbiAgICAgICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICB0eXBlOiAnaW1CYWNrJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5fX2lzQm90RnJhbWV3b3JrQ2FyZEFjdGlvbikge1xuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oZGF0YS5jYXJkQWN0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oe1xuICAgICAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIHR5cGU6ICdwb3N0QmFjaycsXG4gICAgICAgICAgICAgIHZhbHVlOiBkYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY3JvbGxUb0VuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2ViIENoYXQ6IHJlY2VpdmVkIHVua25vd24gYWN0aW9uIGZyb20gQWRhcHRpdmUgQ2FyZHNgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihhY3Rpb24pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZEFjdGlvbnNQZXJmb3JtZWQsIGRpc2FibGVkLCBwZXJmb3JtQ2FyZEFjdGlvbiwgc2Nyb2xsVG9FbmRdXG4gICk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IGN1cnJlbnQgfSA9IGNvbnRlbnRSZWY7XG5cbiAgICBpZiAoIWN1cnJlbnQgfHwgIWFkYXB0aXZlQ2FyZCkge1xuICAgICAgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICAgIGlucHV0VmFsdWVzUmVmLmN1cnJlbnQgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDdXJyZW50bHksIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIE1hcmtkb3duIGVuZ2luZSBpcyB0byBzZXQgaXQgdGhydSBzdGF0aWMgbWVtYmVyIG9mIEFkYXB0aXZlQ2FyZCBjbGFzc1xuXG4gICAgLy8gVE9ETzogW1AzXSBDaGVja3MgaWYgd2UgY291bGQgbWFrZSB0aGUgXCJyZW5kZXJNYXJrZG93bkFzSFRNTFwiIHBlciBjYXJkXG4gICAgLy8gICAgICAgVGhpcyBjb3VsZCBiZSBsaW1pdGF0aW9ucyBmcm9tIEFkYXB0aXZlIENhcmRzIHBhY2thZ2UgKG5vdCBzdXBwb3J0ZWQgYXMgb2YgMS4yLjUpXG4gICAgLy8gICAgICAgQmVjYXVzZSB0aGVyZSBjb3VsZCBiZSB0aW1pbmcgZGlmZmVyZW5jZSBiZXR3ZWVuIC5wYXJzZSBhbmQgLnJlbmRlciwgd2UgY291bGQgYmUgdXNpbmcgd3JvbmcgTWFya2Rvd24gZW5naW5lXG5cbiAgICAvLyBcIm9uUHJvY2Vzc01hcmtkb3duXCIgaXMgYSBzdGF0aWMgZnVuY3Rpb24gYnV0IHdlIGFyZSB0cnlpbmcgdG8gc2NvcGUgaXQgdG8gdGhlIGN1cnJlbnQgb2JqZWN0IGluc3RlYWQuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRvdC1ub3RhdGlvblxuICAgIGFkYXB0aXZlQ2FyZC5jb25zdHJ1Y3Rvclsnb25Qcm9jZXNzTWFya2Rvd24nXSA9ICh0ZXh0OiBzdHJpbmcsIHJlc3VsdDogSU1hcmtkb3duUHJvY2Vzc2luZ1Jlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlbmRlck1hcmtkb3duQXNIVE1MKSB7XG4gICAgICAgIHJlc3VsdC5vdXRwdXRIdG1sID0gcmVuZGVyTWFya2Rvd25Bc0hUTUwodGV4dCk7XG4gICAgICAgIHJlc3VsdC5kaWRQcm9jZXNzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKSB7XG4gICAgICBhZGFwdGl2ZUNhcmQuaG9zdENvbmZpZyA9IGlzUGxhaW5PYmplY3QoYWRhcHRpdmVDYXJkc0hvc3RDb25maWcpXG4gICAgICAgID8gbmV3IEhvc3RDb25maWcoYWRhcHRpdmVDYXJkc0hvc3RDb25maWcpXG4gICAgICAgIDogYWRhcHRpdmVDYXJkc0hvc3RDb25maWc7XG4gICAgfVxuXG4gICAgLy8gRm9yIGFjY2Vzc2liaWxpdHkgaXNzdWUgIzEzNDAsIGB0YWJpbmRleD1cIjBcImAgbXVzdCBub3QgYmUgc2V0IGZvciB0aGUgcm9vdCBjb250YWluZXIgaWYgaXQgaXMgbm90IGludGVyYWN0aXZlLlxuICAgIEdsb2JhbFNldHRpbmdzLnNldFRhYkluZGV4QXRDYXJkUm9vdCA9ICEhdGFwQWN0aW9uO1xuXG4gICAgY29uc3QgeyB2YWxpZGF0aW9uRXZlbnRzIH0gPSBhZGFwdGl2ZUNhcmQudmFsaWRhdGVQcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAodmFsaWRhdGlvbkV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBzZXRFcnJvcnModmFsaWRhdGlvbkV2ZW50cy5yZWR1Y2UoKGl0ZW1zLCB7IG1lc3NhZ2UgfSkgPT4gWy4uLml0ZW1zLCBuZXcgRXJyb3IobWVzc2FnZSldLCBbXSkpO1xuICAgIH1cblxuICAgIGxldCBlbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50ID0gYWRhcHRpdmVDYXJkLnJlbmRlcigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gc2V0RXJyb3JzKFtlcnJvcl0pO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHNldEVycm9ycyhbbmV3IEVycm9yKCdBZGFwdGl2ZSBDYXJkIHJlbmRlcmVkIGFzIGVtcHR5IGVsZW1lbnQnKV0pO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGVycm9ycyBvbiBuZXh0IHJlbmRlclxuICAgIHNldEVycm9ycyhbXSk7XG5cbiAgICByZXN0b3JlSW5wdXRWYWx1ZXMoZWxlbWVudCwgaW5wdXRWYWx1ZXNSZWYuY3VycmVudCk7XG5cbiAgICBjdXJyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCA9IGVsZW1lbnQ7XG5cbiAgICAvLyBGb2N1cyBjYW4gb25seSBiZSByZXN0b3JlZCBhZnRlciB0aGUgRE9NIGlzIGF0dGFjaGVkLlxuICAgIHJlc3RvcmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCwgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQpO1xuXG4gICAgc2V0TGFzdFJlbmRlcihEYXRlLm5vdygpKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmVFbGVtZW50SW5kZXhSZWYuY3VycmVudCA9IHNhdmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCk7XG4gICAgICBpbnB1dFZhbHVlc1JlZi5jdXJyZW50ID0gc2F2ZUlucHV0VmFsdWVzKGVsZW1lbnQpO1xuXG4gICAgICBjdXJyZW50LnJlbW92ZUNoaWxkKGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCk7XG5cbiAgICAgIGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9LCBbXG4gICAgYWRhcHRpdmVDYXJkLFxuICAgIGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnLFxuICAgIGNvbnRlbnRSZWYsXG4gICAgR2xvYmFsU2V0dGluZ3MsXG4gICAgSG9zdENvbmZpZyxcbiAgICByZW5kZXJNYXJrZG93bkFzSFRNTCxcbiAgICBzZXRFcnJvcnMsXG4gICAgdGFwQWN0aW9uXG4gIF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gU2V0IG9uRXhlY3V0ZUFjdGlvbiB3aXRob3V0IGNhdXNpbmcgdW5uZWNlc3NhcnkgcmUtcmVuZGVyLlxuICAgIGFkYXB0aXZlQ2FyZC5vbkV4ZWN1dGVBY3Rpb24gPSBkaXNhYmxlZCA/IHVuZGVmaW5lZCA6IGhhbmRsZUV4ZWN1dGVBY3Rpb247XG4gIH0sIFthZGFwdGl2ZUNhcmQsIGRpc2FibGVkLCBoYW5kbGVFeGVjdXRlQWN0aW9uXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IGZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyhhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpLCBbYWRhcHRpdmVDYXJkRWxlbWVudFJlZiwgbGFzdFJlbmRlcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gSWYgdGhlIEFkYXB0aXZlIENhcmQgZ2V0IHJlLXJlbmRlcmVkLCByZS1kaXNhYmxlIGVsZW1lbnRzIGFzIG5lZWRlZC5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYuY3VycmVudCk7XG4gICAgfVxuICB9LCBbYWRhcHRpdmVDYXJkRWxlbWVudFJlZiwgZGlzYWJsZWQsIGxhc3RSZW5kZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIElmIHRoZSBBZGFwdGl2ZSBDYXJkIGNoYW5nZWQsIHJlc2V0IGFsbCBhY3Rpb25zIHBlcmZvcm1lZC5cbiAgICBzZXRBY3Rpb25zUGVyZm9ybWVkKFtdKTtcbiAgfSwgW2FkYXB0aXZlQ2FyZF0pO1xuXG4gIHVzZUVmZmVjdChcbiAgICAoKSA9PlxuICAgICAgaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyhcbiAgICAgICAgLy8gQWN0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIFwicmVuZGVyZWRFbGVtZW50XCIgbWVhbnMgaXQgaXMgdGhlIEFkYXB0aXZlIENhcmQgaXRzZWxmLCBzdWNoIGFzIFwic2VsZWN0QWN0aW9uXCIgKEFDKSBvciBcInRhcEFjdGlvblwiIChyaWNoIGNhcmRzKS5cbiAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdG8gbWFyayB0aGUgd2hvbGUgY2FyZCBhcyBwZXJmb3JtZWQuXG4gICAgICAgIGFjdGlvbnNQZXJmb3JtZWQubWFwKCh7IHJlbmRlcmVkRWxlbWVudCB9KSA9PiByZW5kZXJlZEVsZW1lbnQpLmZpbHRlcihyZW5kZXJlZEVsZW1lbnQgPT4gcmVuZGVyZWRFbGVtZW50KSxcbiAgICAgICAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lXG4gICAgICApLFxuICAgIFthY3Rpb25zUGVyZm9ybWVkLCBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsIGxhc3RSZW5kZXJdXG4gICk7XG5cbiAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyAoXG4gICAgbm9kZV9lbnYgPT09ICdkZXZlbG9wbWVudCcgJiYgPEVycm9yQm94IGVycm9yPXtlcnJvcnNbMF19IHR5cGU9e2xvY2FsaXplKCdBREFQVElWRV9DQVJEX0VSUk9SX0JPWF9USVRMRV9SRU5ERVInKX0gLz5cbiAgKSA6IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYWRhcHRpdmVDYXJkUmVuZGVyZXJTdHlsZVNldCArICcnLCAnd2ViY2hhdF9fYWRhcHRpdmUtY2FyZC1yZW5kZXJlcicpfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvbiBhcyB1bmtub3duIGFzIE1vdXNlRXZlbnRIYW5kbGVyPEhUTUxEaXZFbGVtZW50Pn1cbiAgICAgIG9uS2V5UHJlc3M9e2hhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24gYXMgdW5rbm93biBhcyBLZXlib2FyZEV2ZW50SGFuZGxlcjxIVE1MRGl2RWxlbWVudD59XG4gICAgICByZWY9e2NvbnRlbnRSZWZ9XG4gICAgLz5cbiAgKTtcbn07XG5cbkFkYXB0aXZlQ2FyZFJlbmRlcmVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lOiAnJyxcbiAgZGlzYWJsZWQ6IHVuZGVmaW5lZCxcbiAgdGFwQWN0aW9uOiB1bmRlZmluZWRcbn07XG5cbkFkYXB0aXZlQ2FyZFJlbmRlcmVyLnByb3BUeXBlcyA9IHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBhZGFwdGl2ZUNhcmQ6IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8vIFR5cGVTY3JpcHQgY2xhc3MgaXMgbm90IG1hcHBhYmxlIHRvIFByb3BUeXBlcy5mdW5jXG4gIC8vIEB0cy1pZ25vcmVcbiAgdGFwQWN0aW9uOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGltYWdlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICB2YWx1ZTogUHJvcFR5cGVzLnN0cmluZ1xuICB9KVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWRhcHRpdmVDYXJkUmVuZGVyZXI7XG4iXX0=