@workflow/web-shared 5.0.0-beta.46 → 5.0.0-beta.47

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 (30) hide show
  1. package/dist/components/event-list-view.js +3 -3
  2. package/dist/components/trace-viewer/components/use-alt-held.d.ts +11 -0
  3. package/dist/components/trace-viewer/components/use-alt-held.d.ts.map +1 -0
  4. package/dist/components/trace-viewer/components/use-alt-held.js +48 -0
  5. package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
  6. package/dist/components/trace-viewer/trace-viewer.js +4 -17
  7. package/dist/components/trace-viewer.d.ts +4 -1
  8. package/dist/components/trace-viewer.d.ts.map +1 -1
  9. package/dist/components/trace-viewer.js +4 -3
  10. package/dist/components/ui/data-inspector.d.ts +3 -2
  11. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  12. package/dist/components/ui/data-inspector.js +85 -8
  13. package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -1
  14. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  15. package/dist/components/workflow-traces/trace-span-construction.js +7 -3
  16. package/dist/lib/duplicate-events.d.ts.map +1 -1
  17. package/dist/lib/duplicate-events.js +14 -25
  18. package/dist/lib/trace-builder.d.ts +3 -1
  19. package/dist/lib/trace-builder.d.ts.map +1 -1
  20. package/dist/lib/trace-builder.js +5 -5
  21. package/package.json +5 -5
  22. package/src/components/event-list-view.tsx +2 -2
  23. package/src/components/trace-viewer/components/use-alt-held.ts +54 -0
  24. package/src/components/trace-viewer/trace-viewer.tsx +3 -15
  25. package/src/components/trace-viewer.tsx +6 -1
  26. package/src/components/ui/data-inspector.tsx +105 -9
  27. package/src/components/workflow-traces/trace-span-construction.ts +14 -2
  28. package/src/lib/duplicate-events.ts +14 -26
  29. package/src/lib/trace-builder.test.ts +42 -1
  30. package/src/lib/trace-builder.ts +13 -4
@@ -134,10 +134,36 @@ function BytesDisplayValue({ display }) {
134
134
  function formatField(field) {
135
135
  return field === '' ? '""' : field;
136
136
  }
137
+ function isGenericIterable(value) {
138
+ if (value === null ||
139
+ (typeof value !== 'object' && typeof value !== 'function') ||
140
+ Array.isArray(value) ||
141
+ value instanceof Map ||
142
+ value instanceof Set) {
143
+ return false;
144
+ }
145
+ return (typeof value[Symbol.iterator] ===
146
+ 'function');
147
+ }
148
+ function isEntryIterable(value) {
149
+ return typeof value.entries === 'function';
150
+ }
151
+ function collectEntries(iterable, asPairs) {
152
+ return Array.from(iterable, (item, index) => {
153
+ if (asPairs && Array.isArray(item) && item.length >= 2) {
154
+ return [String(item[0]), collapseRefs(item[1]), index];
155
+ }
156
+ return [undefined, collapseRefs(item), index];
157
+ });
158
+ }
159
+ function isSelfIterableIterator(value) {
160
+ return Object.is(value[Symbol.iterator](), value);
161
+ }
137
162
  /**
138
- * Describe an object/array/map/set as an expandable container. Returns null for
139
- * values that should render as a primitive. `prefix` carries a class name shown
140
- * before the opening bracket (Map/Set and named class instances).
163
+ * Describe an object/array/iterable as an expandable container. Returns null
164
+ * for values that should render as a primitive. `prefix` carries a class name
165
+ * shown before the opening bracket (Map/Set, generic iterables, and named class
166
+ * instances).
141
167
  */
142
168
  function describeContainer(value) {
143
169
  if (Array.isArray(value)) {
@@ -166,6 +192,25 @@ function describeContainer(value) {
166
192
  prefix: 'Set',
167
193
  };
168
194
  }
195
+ if (isGenericIterable(value)) {
196
+ const name = value.constructor
197
+ ?.name;
198
+ const prefix = name && name !== 'Object' ? name : undefined;
199
+ if (isEntryIterable(value)) {
200
+ return {
201
+ entries: collectEntries(value.entries(), true),
202
+ open: '{',
203
+ close: '}',
204
+ prefix,
205
+ };
206
+ }
207
+ return {
208
+ entries: collectEntries(value, false),
209
+ open: '[',
210
+ close: ']',
211
+ prefix,
212
+ };
213
+ }
169
214
  if (value !== null && typeof value === 'object') {
170
215
  const name = value.constructor
171
216
  ?.name;
@@ -285,7 +330,7 @@ function ExpandableContainer({ field, entries, open, close, prefix, ctx, isLast,
285
330
  }
286
331
  };
287
332
  const lastIndex = entries.length - 1;
288
- return (_jsxs("div", { className: CLS.child, role: "treeitem", "aria-expanded": expanded, "aria-controls": expanded ? contentsId : undefined, "data-json-expander": true, ref: rowRef, tabIndex: level === 0 ? 0 : -1, onClick: onClick, onKeyDown: onKeyDown, children: [_jsx("span", { className: expanded ? CLS.collapseIcon : CLS.expandIcon, "aria-hidden": "true" }), field !== undefined && (_jsx("span", { className: CLS.clickableLabel, children: `${formatField(field)}:` })), prefix ? _jsx("span", { className: CLS.className, children: prefix }) : null, _jsx("span", { className: CLS.punctuation, children: open }), expanded ? (_jsx("ul", { id: contentsId, className: CLS.childFields, role: "group", children: entries.map(([childField, childValue], index) => (_jsx(DataRender, { field: childField, value: childValue, isLast: index === lastIndex, ctx: { ...ctx, level: level + 1 } }, childField ?? index))) })) : (_jsx("span", { className: CLS.collapsedContent, "aria-hidden": "true" })), _jsx("span", { className: CLS.punctuation, children: close }), _jsx(Comma, { isLast: isLast })] }));
333
+ return (_jsxs("div", { className: CLS.child, role: "treeitem", "aria-expanded": expanded, "aria-controls": expanded ? contentsId : undefined, "data-json-expander": true, ref: rowRef, tabIndex: level === 0 ? 0 : -1, onClick: onClick, onKeyDown: onKeyDown, children: [_jsx("span", { className: expanded ? CLS.collapseIcon : CLS.expandIcon, "aria-hidden": "true" }), field !== undefined && (_jsx("span", { className: CLS.clickableLabel, children: `${formatField(field)}:` })), prefix ? _jsx("span", { className: CLS.className, children: prefix }) : null, _jsx("span", { className: CLS.punctuation, children: open }), expanded ? (_jsx("ul", { id: contentsId, className: CLS.childFields, role: "group", children: entries.map(([childField, childValue, entryKey], index) => (_jsx(DataRender, { field: childField, value: childValue, isLast: index === lastIndex, ctx: { ...ctx, level: level + 1 } }, entryKey ?? childField ?? index))) })) : (_jsx("span", { className: CLS.collapsedContent, "aria-hidden": "true" })), _jsx("span", { className: CLS.punctuation, children: close }), _jsx(Comma, { isLast: isLast })] }));
289
334
  }
290
335
  function DataRender({ field, value, isLast, ctx }) {
291
336
  if (isBytesDisplay(value)) {
@@ -364,8 +409,8 @@ function makeBytesDisplay(display) {
364
409
  * non-expandable versions so the renderer doesn't show their internals.
365
410
  * Only recurses into plain objects and arrays to avoid stripping class
366
411
  * instances (Date, Error, URL, Headers, etc.) that have their own rendering.
367
- * Map and Set containers are preserved while their contents are prepared for
368
- * display.
412
+ * Map and Set contents are prepared here; other iterable contents are prepared
413
+ * when the renderer traverses them.
369
414
  *
370
415
  * Exported for testing the typed-array detection path used by hydrated
371
416
  * AI agent stream chunks (e.g. `{ delta: new Uint8Array(...) }`).
@@ -438,7 +483,20 @@ function isSameBytesDisplay(a, b) {
438
483
  a.decodedFrom?.encoding === b.decodedFrom?.encoding &&
439
484
  a.decodedFrom?.rawSummary === b.decodedFrom?.rawSummary);
440
485
  }
441
- function isDeepEqual(a, b, seen = new WeakMap()) {
486
+ function haveSameIterableValues(a, b, seen) {
487
+ const aIterator = a[Symbol.iterator]();
488
+ const bIterator = b[Symbol.iterator]();
489
+ while (true) {
490
+ const aResult = aIterator.next();
491
+ const bResult = bIterator.next();
492
+ if (aResult.done || bResult.done) {
493
+ return aResult.done === bResult.done;
494
+ }
495
+ if (!isDeepEqual(aResult.value, bResult.value, seen))
496
+ return false;
497
+ }
498
+ }
499
+ export function isDeepEqual(a, b, seen = new WeakMap()) {
442
500
  if (Object.is(a, b))
443
501
  return true;
444
502
  if (isBytesDisplay(a) || isBytesDisplay(b)) {
@@ -450,6 +508,25 @@ function isDeepEqual(a, b, seen = new WeakMap()) {
450
508
  if (a instanceof RegExp && b instanceof RegExp) {
451
509
  return a.source === b.source && a.flags === b.flags;
452
510
  }
511
+ if (isGenericIterable(a) || isGenericIterable(b)) {
512
+ if (!isGenericIterable(a) || !isGenericIterable(b))
513
+ return false;
514
+ if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))
515
+ return false;
516
+ if (isSelfIterableIterator(a) || isSelfIterableIterator(b))
517
+ return false;
518
+ if (seen.get(a) === b)
519
+ return true;
520
+ seen.set(a, b);
521
+ const aHasEntries = isEntryIterable(a);
522
+ const bHasEntries = isEntryIterable(b);
523
+ if (aHasEntries !== bHasEntries)
524
+ return false;
525
+ if (aHasEntries && bHasEntries) {
526
+ return haveSameIterableValues(a.entries(), b.entries(), seen);
527
+ }
528
+ return haveSameIterableValues(a, b, seen);
529
+ }
453
530
  if (a instanceof Map && b instanceof Map) {
454
531
  if (a.size !== b.size)
455
532
  return false;
@@ -499,4 +576,4 @@ function isDeepEqual(a, b, seen = new WeakMap()) {
499
576
  }
500
577
  return true;
501
578
  }
502
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1pbnNwZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9kYXRhLWluc3BlY3Rvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFDTCxhQUFhLEVBS2IsVUFBVSxFQUNWLEtBQUssRUFDTCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUdMLCtCQUErQixHQUNoQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLDhDQUE4QztBQUM5Qyx3REFBd0Q7QUFDeEQsOEVBQThFO0FBRTlFLE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDO0FBQ2xELE1BQU0sdUJBQXVCLEdBQUcsaUNBQWlDLENBQUM7QUFDbEUsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQUM7QUFDNUMsTUFBTSxrQkFBa0IsR0FBRyw0QkFBNEIsQ0FBQztBQXlCeEQsU0FBUyxvQkFBb0IsQ0FBQyxJQUFZO0lBQ3hDLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFZO0lBQ2xDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWM7SUFDakMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxtRkFBbUY7SUFDbkYsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5RCxPQUFPLElBQUksRUFBRSxLQUFLLEtBQUssZUFBZSxDQUFDO0FBQ3pDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5RCxPQUFPLElBQUksRUFBRSxLQUFLLEtBQUssWUFBWSxDQUFDO0FBQ3RDLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWM7SUFDM0MsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlELE9BQU8sSUFBSSxFQUFFLEtBQUssS0FBSyxrQkFBa0IsQ0FBQztBQUM1QyxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxLQUFjO0lBQ3hDLE9BQU8sQ0FDTCxLQUFLLEtBQUssSUFBSTtRQUNkLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsUUFBUSxJQUFJLEtBQUs7UUFDaEIsS0FBaUMsQ0FBQyxNQUFNLEtBQUssdUJBQXVCLENBQ3RFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxLQUFjO0lBQ3ZDLE9BQU8sQ0FDTCxLQUFLLEtBQUssSUFBSTtRQUNkLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDeEIsS0FBNkMsQ0FBQyxXQUFXLEVBQUUsSUFBSTtZQUM5RCxzQkFBc0IsQ0FDekIsQ0FBQztBQUNKLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsdURBQXVEO0FBQ3ZELDhFQUE4RTtBQUU5RTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBRTdDLFNBQVMsQ0FBQyxDQUFDO0FBY2IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsYUFBYSxDQUU5QyxTQUFTLENBQUMsQ0FBQztBQUViLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBRTFDLFNBQVMsQ0FBQyxDQUFDO0FBRWIsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSw4RUFBOEU7QUFFOUUsU0FBUyxvQkFBb0I7SUFDM0IsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDNUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNSLE9BQU8sQ0FDTCxNQUFDLE1BQU0sSUFDTCxJQUFJLEVBQUMsSUFBSSxFQUNULFNBQVMsRUFBQyx3QkFBd0IsRUFDbEMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLGlCQUFpQixFQUNuRCxLQUFLLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDcEUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2IsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEIsQ0FBQyxhQUVBLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQ2xCLEtBQUMsT0FBTyxJQUFDLElBQUksRUFBRSxFQUFFLEdBQUksQ0FDdEIsQ0FBQyxDQUFDLENBQUMsQ0FDRixLQUFDLElBQUksSUFBQyxTQUFTLEVBQUMsU0FBUyxHQUFHLENBQzdCLEVBQ0QscUNBQW9CLElBQ2IsQ0FDVixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sQ0FDTCxnQkFBTSxTQUFTLEVBQUMsc0JBQXNCLGFBQ3BDLEtBQUMsSUFBSSxJQUFDLFNBQVMsRUFBQyw2Q0FBNkMsR0FBRyxpQkFFM0QsQ0FDUixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUE0QjtJQUM5RCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyRCxPQUFPLENBQ0wsa0JBQ0UsSUFBSSxFQUFDLFFBQVEsRUFDYixTQUFTLEVBQUMsaU5BQWlOLEVBQzNOLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2IsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxDQUFDLEVBQ0QsS0FBSyxFQUFFLGdCQUFnQixTQUFTLENBQUMsUUFBUSxFQUFFLGFBRTNDLDBDQUFlLEVBQ2YseUJBQU8sU0FBUyxDQUFDLFFBQVEsR0FBUSxJQUMxQixDQUNWLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsRUFBRSxNQUFNLEVBQXNCO0lBQ2xELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMvQyxPQUFPLENBQ0wsaUJBQ0UsSUFBSSxFQUFDLFFBQVEsRUFDYixTQUFTLEVBQUMseU5BQXlOLEVBQ25PLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2IsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDLEVBQ0QsS0FBSyxFQUFFLGFBQWEsTUFBTSxDQUFDLEtBQUssRUFBRSxZQUVsQyx5QkFBTyxNQUFNLENBQUMsS0FBSyxHQUFRLEdBQ3BCLENBQ1YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEVBQ3pCLFdBQVcsRUFDWCxNQUFNLEdBSVA7SUFDQyxNQUFNLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxHQUFHLFFBQVEsQ0FDOUMsU0FBUyxDQUNWLENBQUM7SUFDRixNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFM0MsT0FBTyxDQUNMLGVBQUssU0FBUyxFQUFDLFNBQVMsYUFDckIsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDNUIsY0FBSyxTQUFTLEVBQUMsU0FBUyxZQUNyQixPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQzVCLGVBQU0sU0FBUyxFQUFDLGdEQUFnRCxZQUM3RCxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsR0FDeEIsQ0FDUixDQUFDLENBQUMsQ0FBQyxDQUNGLEtBQUMsYUFBYSxJQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBSSxDQUNoRCxHQUNHLENBQ1AsQ0FBQyxDQUFDLENBQUMsQ0FDRixLQUFDLHFCQUFxQixJQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBSSxDQUNwRSxFQUNELGNBQUssU0FBUyxFQUFDLFdBQVcsWUFDeEIsZUFDRSxTQUFTLEVBQUMsNERBQTRELEVBQ3RFLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLGVBQWUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsNkRBQTZELGFBRTlILGlCQUNFLElBQUksRUFBQyxRQUFRLEVBQ2IsU0FBUyxFQUFFLEVBQUUsQ0FDWCxrREFBa0QsRUFDbEQsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQzNELEVBQ0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsa0JBQzNCLFlBQVksS0FBSyxTQUFTLGdCQUM3QixtQkFBbUIsd0JBR3ZCLEVBQ1QsaUJBQ0UsSUFBSSxFQUFDLFFBQVEsRUFDYixTQUFTLEVBQUUsRUFBRSxDQUNYLDJFQUEyRSxFQUMzRSxZQUFZLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FDekQsRUFDRCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxrQkFDekIsWUFBWSxLQUFLLE9BQU8sZ0JBQzNCLHdCQUF3QixzQkFHNUIsSUFDTCxHQUNGLElBQ0YsQ0FDUCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsRUFDN0IsV0FBVyxFQUNYLE1BQU0sR0FJUDtJQUNDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWhELE9BQU8sQ0FDTCxlQUFLLFNBQVMsRUFBQyxXQUFXLGFBQ3hCLGtCQUNFLElBQUksRUFBQyxRQUFRLEVBQ2IsU0FBUyxFQUFDLDREQUE0RCxFQUN0RSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUM3QyxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxlQUFlLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE9BQU8sYUFFeEUsZUFBTSxTQUFTLEVBQUMsMkJBQTJCLFlBQ3hDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQ2hCLEVBQ1AsZUFBTSxTQUFTLEVBQUMscUJBQXFCLFlBQUUsTUFBTSxDQUFDLFVBQVUsR0FBUSxJQUN6RCxFQUNSLFFBQVEsSUFBSSxDQUNYLGVBQUssU0FBUyxFQUFDLFdBQVcsYUFDeEIsZUFBTSxTQUFTLEVBQUMsZUFBZSwwQkFBaUIsRUFDaEQsZUFBTSxTQUFTLEVBQUMsZ0RBQWdELFlBQzdELElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQ3ZCLElBQ0gsQ0FDUCxJQUNHLENBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxFQUE2QjtJQUMvRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQ0wsS0FBQyxpQkFBaUIsSUFDaEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQ3pCLE1BQU0sRUFBRSxPQUFPLENBQUMsV0FBVyxHQUMzQixDQUNILENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxDQUNMLGVBQU0sU0FBUyxFQUFDLGdEQUFnRCxZQUM3RCxPQUFPLENBQUMsSUFBSSxHQUNSLENBQ1IsQ0FBQztBQUNKLENBQUM7QUFjRCxzRUFBc0U7QUFDdEUsU0FBUyxXQUFXLENBQUMsS0FBYTtJQUNoQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3JDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDeEIsS0FBYztJQUVkLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU87WUFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFVLENBQUM7WUFDeEQsSUFBSSxFQUFFLEdBQUc7WUFDVCxLQUFLLEVBQUUsR0FBRztTQUNYLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxLQUFLLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDekIsT0FBTztZQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLEdBQUcsQ0FBQztnQkFDWCxHQUFHO2FBQ0osQ0FBWTtZQUNiLElBQUksRUFBRSxHQUFHO1lBQ1QsS0FBSyxFQUFFLEdBQUc7WUFDVixNQUFNLEVBQUUsS0FBSztTQUNkLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxLQUFLLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDekIsT0FBTztZQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFVLENBQUM7WUFDekUsSUFBSSxFQUFFLEdBQUc7WUFDVCxLQUFLLEVBQUUsR0FBRztZQUNWLE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEQsTUFBTSxJQUFJLEdBQUksS0FBNkMsQ0FBQyxXQUFXO1lBQ3JFLEVBQUUsSUFBSSxDQUFDO1FBQ1QsT0FBTztZQUNMLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBWTtZQUN6QyxJQUFJLEVBQUUsR0FBRztZQUNULEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFFLElBQUksSUFBSSxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDckQsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEtBQWM7SUFDdkMsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0QsSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDMUUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLE1BQU0sRUFBRSxDQUFDO1FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLFlBQVksT0FBTyxFQUFFLENBQUM7UUFDM0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLE1BQU0sRUFBRSxDQUFDO1FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDdkQsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBMkM7SUFDMUUsSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3JDLE9BQU8sQ0FDTCxlQUFNLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFlBQ3hELEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQ3BCLENBQ1IsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBdUI7SUFDNUMsSUFBSSxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEIsT0FBTyxlQUFNLFNBQVMsRUFBRSxHQUFHLENBQUMsV0FBVyxrQkFBVSxDQUFDO0FBQ3BELENBQUM7QUFFRCw4Q0FBOEM7QUFDOUMsU0FBUyxPQUFPLENBQUMsRUFDZixLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsR0FLVDtJQUNDLE9BQU8sQ0FDTCxlQUFLLFNBQVMsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxhQUNyRCxLQUFDLEtBQUssSUFBQyxLQUFLLEVBQUUsS0FBSyxHQUFJLEVBQ3RCLFFBQVEsRUFDVCxLQUFDLEtBQUssSUFBQyxNQUFNLEVBQUUsTUFBTSxHQUFJLElBQ3JCLENBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFhO0lBQ3pELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxDQUNMLEtBQUMsT0FBTyxJQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFDbkMsZUFBTSxTQUFTLEVBQUUsR0FBRyxZQUFHLElBQUksR0FBUSxHQUMzQixDQUNYLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsRUFDdEIsS0FBSyxFQUNMLE1BQU0sRUFDTixJQUFJLEVBQ0osS0FBSyxFQUNMLE1BQU0sR0FPUDtJQUNDLE9BQU8sQ0FDTCxlQUFLLFNBQVMsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxhQUNyRCxLQUFDLEtBQUssSUFBQyxLQUFLLEVBQUUsS0FBSyxHQUFJLEVBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBTSxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsWUFBRyxNQUFNLEdBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUNoRSxlQUFNLFNBQVMsRUFBRSxHQUFHLENBQUMsV0FBVyxZQUFHLElBQUksR0FBUSxFQUMvQyxlQUFNLFNBQVMsRUFBRSxHQUFHLENBQUMsV0FBVyxZQUFHLEtBQUssR0FBUSxFQUNoRCxLQUFDLEtBQUssSUFBQyxNQUFNLEVBQUUsTUFBTSxHQUFJLElBQ3JCLENBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FDcEIsTUFBbUIsRUFDbkIsUUFBMEM7SUFFMUMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQzlDLG9DQUFvQyxDQUNyQyxDQUFDO0lBQ0YsSUFBSSxRQUFRO1FBQUUsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNwQixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDakIsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQ3hCLFFBQTBDLEVBQzFDLFNBQWlCO0lBRWpCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDOUIsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPO0lBQ2xCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBYyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzNFLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNaLE1BQU07UUFDUixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksT0FBTyxHQUFHLENBQUM7UUFBRSxPQUFPO0lBQ3hCLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUNyRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxFQUMzQixLQUFLLEVBQ0wsT0FBTyxFQUNQLElBQUksRUFDSixLQUFLLEVBQ0wsTUFBTSxFQUNOLEdBQUcsRUFDSCxNQUFNLEdBU1A7SUFDQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDOUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDcEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFpQixJQUFJLENBQUMsQ0FBQztJQUM1QyxNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUUzQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUNMLEtBQUMsY0FBYyxJQUNiLEtBQUssRUFBRSxLQUFLLEVBQ1osTUFBTSxFQUFFLE1BQU0sRUFDZCxJQUFJLEVBQUUsSUFBSSxFQUNWLEtBQUssRUFBRSxLQUFLLEVBQ1osTUFBTSxFQUFFLE1BQU0sR0FDZCxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxFQUFFO1FBQ2xCLFdBQVcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLE1BQU0sQ0FBQyxPQUFPO1lBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUQsQ0FBQyxDQUFDO0lBRUYsOEVBQThFO0lBQzlFLGlFQUFpRTtJQUNqRSxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQXNCLEVBQUUsRUFBRTtRQUN6QyxJQUNHLEtBQUssQ0FBQyxNQUFzQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztZQUMxRCxLQUFLLENBQUMsYUFBYSxFQUNuQixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLEVBQUUsQ0FBQztJQUNYLENBQUMsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBeUIsRUFBRSxFQUFFO1FBQzlDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUMvQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDckMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRXJDLE9BQU8sQ0FHTCxlQUNFLFNBQVMsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUNwQixJQUFJLEVBQUMsVUFBVSxtQkFDQSxRQUFRLG1CQUNSLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLDhCQUVoRCxHQUFHLEVBQUUsTUFBTSxFQUNYLFFBQVEsRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUM5QixPQUFPLEVBQUUsT0FBTyxFQUNoQixTQUFTLEVBQUUsU0FBUyxhQUVwQixlQUNFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLGlCQUMzQyxNQUFNLEdBQ2xCLEVBQ0QsS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUN0QixlQUFNLFNBQVMsRUFBRSxHQUFHLENBQUMsY0FBYyxZQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQVEsQ0FDdkUsRUFDQSxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQU0sU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLFlBQUcsTUFBTSxHQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksRUFDaEUsZUFBTSxTQUFTLEVBQUUsR0FBRyxDQUFDLFdBQVcsWUFBRyxJQUFJLEdBQVEsRUFDOUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUVWLGFBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUMsT0FBTyxZQUN6RCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUNoRCxLQUFDLFVBQVUsSUFFVCxLQUFLLEVBQUUsVUFBVSxFQUNqQixLQUFLLEVBQUUsVUFBVSxFQUNqQixNQUFNLEVBQUUsS0FBSyxLQUFLLFNBQVMsRUFDM0IsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFKNUIsVUFBVSxJQUFJLEtBQUssQ0FLeEIsQ0FDSCxDQUFDLEdBQ0MsQ0FDTixDQUFDLENBQUMsQ0FBQyxDQUNGLGVBQU0sU0FBUyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsaUJBQWMsTUFBTSxHQUFHLENBQzdELEVBQ0QsZUFBTSxTQUFTLEVBQUUsR0FBRyxDQUFDLFdBQVcsWUFBRyxLQUFLLEdBQVEsRUFDaEQsS0FBQyxLQUFLLElBQUMsTUFBTSxFQUFFLE1BQU0sR0FBSSxJQUNyQixDQUNQLENBQUM7QUFDSixDQUFDO0FBU0QsU0FBUyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWE7SUFDMUQsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLENBQ0wsS0FBQyxPQUFPLElBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUNuQyxLQUFDLGlCQUFpQixJQUFDLE9BQU8sRUFBRSxLQUFLLEdBQUksR0FDN0IsQ0FDWCxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQ0wsS0FBQyxPQUFPLElBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUNuQyxLQUFDLG9CQUFvQixLQUFHLEdBQ2hCLENBQ1gsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sQ0FDTCxLQUFDLE9BQU8sSUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQ25DLEtBQUMsZUFBZSxJQUFDLFNBQVMsRUFBRSxLQUFLLEdBQUksR0FDN0IsQ0FDWCxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEIsT0FBTyxDQUNMLEtBQUMsT0FBTyxJQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFDbkMsS0FBQyxZQUFZLElBQUMsTUFBTSxFQUFFLEtBQUssR0FBSSxHQUN2QixDQUNYLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDMUIsT0FBTyxDQUNMLEtBQUMsT0FBTyxJQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFDbkMsZUFBTSxTQUFTLEVBQUUsR0FBRyxDQUFDLElBQUksWUFBRyxLQUFLLENBQUMsV0FBVyxFQUFFLEdBQVEsR0FDL0MsQ0FDWCxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksS0FBSyxZQUFZLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FDTCxLQUFDLE9BQU8sSUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQ25DLGVBQU0sU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNLFlBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFRLEdBQzlDLENBQ1gsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxDQUNMLEtBQUMsaUJBQWlCLElBQ2hCLEtBQUssRUFBRSxLQUFLLEVBQ1osUUFBUSxFQUFFLEtBQUssRUFDZixNQUFNLEVBQUUsTUFBTSxFQUNkLEdBQUcsRUFBRSxHQUFHLEdBQ1IsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxPQUFPLENBQ0wsS0FBQyxtQkFBbUIsSUFDbEIsS0FBSyxFQUFFLEtBQUssRUFDWixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFDMUIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQ3BCLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxFQUN0QixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFDeEIsR0FBRyxFQUFFLEdBQUcsRUFDUixNQUFNLEVBQUUsTUFBTSxHQUNkLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLENBQ0wsS0FBQyxjQUFjLElBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBSSxDQUN6RSxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsRUFDekIsS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sR0FBRyxHQU1KO0lBQ0MsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxPQUFPLENBQ0wsS0FBQyxtQkFBbUIsSUFDbEIsS0FBSyxFQUFFLEtBQUssRUFDWixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFDMUIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQ3BCLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxFQUN0QixNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFDMUIsR0FBRyxFQUFFLEdBQUcsRUFDUixNQUFNLEVBQUUsTUFBTSxHQUNkLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxPQUFPLENBQ0wsTUFBQyxPQUFPLElBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUNuQyxlQUFNLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUyxZQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQVEsRUFDM0QsZUFBTSxTQUFTLEVBQUUsR0FBRyxZQUFHLElBQUksR0FBUSxJQUMzQixDQUNYLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsRUFDaEIsSUFBSSxFQUNKLElBQUksRUFDSixXQUFXLEdBS1o7SUFDQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQWlCLElBQUksQ0FBQyxDQUFDO0lBQzlDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FDMUIsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxXQUFXLEVBQzVDLENBQUMsV0FBVyxDQUFDLENBQ2QsQ0FBQztJQUNGLE9BQU8sQ0FDTCxjQUNFLEdBQUcsRUFBRSxRQUFRLEVBQ2IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQ3hCLElBQUksRUFBQyxNQUFNLGdCQUNBLFdBQVcsWUFFdEIsS0FBQyxVQUFVLElBQ1QsS0FBSyxFQUFFLElBQUksRUFDWCxLQUFLLEVBQUUsSUFBSSxFQUNYLE1BQU0sUUFDTixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsR0FDekMsR0FDRSxDQUNQLENBQUM7QUFDSixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLDZEQUE2RDtBQUM3RCw4RUFBOEU7QUFFOUU7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLEdBQTRCO0lBQ2pELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE9BQW9DO0lBQzVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFO1FBQ3RDLEtBQUssRUFBRSxrQkFBa0I7UUFDekIsVUFBVSxFQUFFLEtBQUs7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO1FBQ3BDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNuQixVQUFVLEVBQUUsS0FBSztLQUNsQixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUU7UUFDM0MsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQzFCLFVBQVUsRUFBRSxLQUFLO0tBQ2xCLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFhO0lBQ3hDLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM1RCxPQUFPLGdCQUFnQixDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDckMsT0FBTyxhQUFhLENBQUMsSUFBMEMsQ0FBQyxDQUFDO0lBQ25FLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdkQsSUFBSSxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDeEIsT0FBTyxJQUFJLEdBQUcsQ0FDWixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxZQUFZLENBQUMsR0FBRyxDQUFDO1lBQ2pCLFlBQVksQ0FBQyxLQUFLLENBQUM7U0FDcEIsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDeEIsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFDRCxtRUFBbUU7SUFDbkUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDOUQsTUFBTSxNQUFNLEdBQTRCLEVBQUUsQ0FBQztJQUMzQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUEyQkQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxFQUM1QixJQUFJLEVBQ0osV0FBVyxHQUFHLENBQUMsRUFDZixJQUFJLEVBQ0osYUFBYSxFQUNiLFVBQVUsRUFDVixTQUFTLEVBQ1QsWUFBWSxHQUFHLEtBQUssRUFDcEIsaUJBQWlCLEdBQUcsS0FBSyxFQUN6QixxQkFBcUIsR0FDRjtJQUNuQixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoRSxNQUFNLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUV6RCxJQUFJLE9BQU8sR0FBYyxDQUN2Qiw4QkFHRSxnQkFBTyxJQUFJLEVBQUMsY0FBYyxFQUFDLFVBQVUsRUFBQyxTQUFTLFlBQzVDLGdCQUFnQixHQUNYLEVBQ1IsS0FBQyxRQUFRLElBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEdBQUksSUFDbkUsQ0FDSixDQUFDO0lBRUYsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixPQUFPLEdBQUcsQ0FDUixLQUFDLGtCQUFrQixDQUFDLFFBQVEsSUFBQyxLQUFLLEVBQUUsYUFBYSxZQUM5QyxPQUFPLEdBQ29CLENBQy9CLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUNSLEtBQUMsZUFBZSxDQUFDLFFBQVEsSUFBQyxLQUFLLEVBQUUsVUFBVSxZQUN4QyxPQUFPLEdBQ2lCLENBQzVCLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLE9BQU8sR0FBRyxDQUNSLEtBQUMsbUJBQW1CLENBQUMsUUFBUSxJQUMzQixLQUFLLEVBQUU7Z0JBQ0wsU0FBUztnQkFDVCxZQUFZO2dCQUNaLGlCQUFpQjtnQkFDakIscUJBQXFCO2FBQ3RCLFlBRUEsT0FBTyxHQUNxQixDQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsb0VBQW9FO0FBQ3BFLDhFQUE4RTtBQUU5RSxTQUFTLHNCQUFzQixDQUFJLElBQU87SUFDeEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFJLElBQUksQ0FBQyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVDLFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUM7QUFDN0IsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxDQUFlLEVBQUUsQ0FBZTtJQUMxRCxPQUFPLENBQ0wsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSTtRQUNqQixDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUk7UUFDM0MsQ0FBQyxDQUFDLFdBQVcsRUFBRSxRQUFRLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxRQUFRO1FBQ25ELENBQUMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUN4RCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLENBQVUsRUFBRSxDQUFVLEVBQUUsSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFO0lBQy9ELElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFakMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0MsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUMzQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFZLE1BQU0sSUFBSSxDQUFDLFlBQVksTUFBTSxFQUFFLENBQUM7UUFDL0MsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3BDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7UUFDekUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDcEMsS0FBSyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7UUFDbEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWYsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLElBQUksUUFBUSxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUV4QyxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUNuRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRWhELEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2RCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG4vKipcbiAqIFJldXNhYmxlIGRhdGEgaW5zcGVjdG9yIGZvciB0aGUgbzExeSBVSS5cbiAqXG4gKiBSZW5kZXJzIEpTT04gYXMgYSBjb2xsYXBzaWJsZSB0cmVlOiBicmFja2V0IG5vdGF0aW9uIChgeyDigKYgfWAgLyBgWyDigKYgXWApLFxuICogY29sb3JlZCBrZXlzLCB0eXBlZCB2YWx1ZSBjb2xvcnMsIGDilrhgL2Dilr5gIGRpc2Nsb3N1cmUgaWNvbnMsIGFuZCBhIGAuLi5gXG4gKiBjb2xsYXBzZWQgaW5kaWNhdG9yLlxuICpcbiAqIE9uIHRvcCBvZiBwbGFpbiBKU09OIGl0IGhhbmRsZXMgdGhlIHdvcmtmbG93LXNwZWNpZmljIHZhbHVlIHR5cGVzOiBTdHJlYW1SZWYgL1xuICogUnVuUmVmIGJhZGdlcywgZW5jcnlwdGVkIG1hcmtlcnMsIGRlY29kZWQgYnl0ZSBzdHJlYW1zLCBEYXRlcywgYW5kIG5hbWVkXG4gKiBjbGFzcyBpbnN0YW5jZXMuXG4gKi9cblxuaW1wb3J0IHsgTG9jayB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQge1xuICBjcmVhdGVDb250ZXh0LFxuICB0eXBlIEtleWJvYXJkRXZlbnQgYXMgUmVhY3RLZXlib2FyZEV2ZW50LFxuICB0eXBlIE1vdXNlRXZlbnQgYXMgUmVhY3RNb3VzZUV2ZW50LFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdHlwZSBSZWZPYmplY3QsXG4gIHVzZUNvbnRleHQsXG4gIHVzZUlkLFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uL2xpYi9jbic7XG5pbXBvcnQgeyBFTkNSWVBURURfRElTUExBWV9OQU1FIH0gZnJvbSAnLi4vLi4vbGliL2h5ZHJhdGlvbic7XG5pbXBvcnQge1xuICB0eXBlIERlY29kZWRTdHJlYW1DaHVua1NvdXJjZSxcbiAgdHlwZSBGb3JtYXR0ZWRTdHJlYW1DaHVua0Rpc3BsYXksXG4gIGZvcm1hdEFycmF5QnVmZmVyVmlld0ZvckRpc3BsYXksXG59IGZyb20gJy4uLy4uL2xpYi9zdHJlYW0tZGlzcGxheSc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL2J1dHRvbic7XG5pbXBvcnQgeyBDTFMsIEpTT05fVklFV19TVFlMRVMgfSBmcm9tICcuL2RhdGEtaW5zcGVjdG9yLnN0eWxlcyc7XG5pbXBvcnQgeyBTcGlubmVyIH0gZnJvbSAnLi9zcGlubmVyJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW1SZWYgLyBDbGFzc0luc3RhbmNlUmVmIHR5cGUgZGV0ZWN0aW9uXG4vLyAoaW5saW5lIHRvIGF2b2lkIGNpcmN1bGFyIGRlcHMgd2l0aCBoeWRyYXRpb24gbW9kdWxlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFNUUkVBTV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3N0cmVhbV9yZWZfXyc7XG5jb25zdCBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X2NsYXNzX2luc3RhbmNlX3JlZl9fJztcbmNvbnN0IFJVTl9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3J1bl9yZWZfXyc7XG5jb25zdCBCWVRFU19ESVNQTEFZX1RZUEUgPSAnX193b3JrZmxvd19ieXRlc19kaXNwbGF5X18nO1xuXG5pbnRlcmZhY2UgU3RyZWFtUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgU1RSRUFNX1JFRl9UWVBFO1xuICBzdHJlYW1JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUnVuUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgUlVOX1JFRl9UWVBFO1xuICBydW5JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnl0ZXNEaXNwbGF5IHtcbiAgX190eXBlOiB0eXBlb2YgQllURVNfRElTUExBWV9UWVBFO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGRlY29kZWRGcm9tPzogRGVjb2RlZFN0cmVhbUNodW5rU291cmNlO1xufVxuXG5pbnRlcmZhY2UgQ2xhc3NJbnN0YW5jZVJlZiB7XG4gIF9fdHlwZTogdHlwZW9mIENMQVNTX0lOU1RBTkNFX1JFRl9UWVBFO1xuICBjbGFzc05hbWU6IHN0cmluZztcbiAgY2xhc3NJZDogc3RyaW5nO1xuICBkYXRhOiB1bmtub3duO1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUNodW5rVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDaHVua0RhdGEodGV4dDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3RyZWFtUmVmKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU3RyZWFtUmVmIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgLy8gQ2hlY2sgYm90aCBlbnVtZXJhYmxlIGFuZCBub24tZW51bWVyYWJsZSBfX3R5cGUgKG9wYXF1ZSByZWZzIHVzZSBub24tZW51bWVyYWJsZSlcbiAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdfX3R5cGUnKTtcbiAgcmV0dXJuIGRlc2M/LnZhbHVlID09PSBTVFJFQU1fUkVGX1RZUEU7XG59XG5cbmZ1bmN0aW9uIGlzUnVuUmVmKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVuUmVmIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdfX3R5cGUnKTtcbiAgcmV0dXJuIGRlc2M/LnZhbHVlID09PSBSVU5fUkVGX1RZUEU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0J5dGVzRGlzcGxheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEJ5dGVzRGlzcGxheSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCAnX190eXBlJyk7XG4gIHJldHVybiBkZXNjPy52YWx1ZSA9PT0gQllURVNfRElTUExBWV9UWVBFO1xufVxuXG5mdW5jdGlvbiBpc0NsYXNzSW5zdGFuY2VSZWYodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDbGFzc0luc3RhbmNlUmVmIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAnX190eXBlJyBpbiB2YWx1ZSAmJlxuICAgICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuX190eXBlID09PSBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0VuY3J5cHRlZE1hcmtlcih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICh2YWx1ZSBhcyB7IGNvbnN0cnVjdG9yPzogeyBuYW1lPzogc3RyaW5nIH0gfSkuY29uc3RydWN0b3I/Lm5hbWUgPT09XG4gICAgICBFTkNSWVBURURfRElTUExBWV9OQU1FXG4gICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3RyZWFtIGNsaWNrIGNvbnRleHQgKHBhc3NlZCB0aHJvdWdoIGZyb20gdGhlIHBhbmVsKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29udGV4dCBmb3IgcGFzc2luZyBzdHJlYW0gY2xpY2sgaGFuZGxlcnMgZG93biB0byBEYXRhSW5zcGVjdG9yIGluc3RhbmNlcy5cbiAqIEV4cG9ydGVkIHNvIHRoYXQgcGFyZW50IGNvbXBvbmVudHMgKGUuZy4sIEF0dHJpYnV0ZVBhbmVsKSBjYW4gcHJvdmlkZSB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0cmVhbUNsaWNrQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8XG4gICgoc3RyZWFtSWQ6IHN0cmluZykgPT4gdm9pZCkgfCB1bmRlZmluZWRcbj4odW5kZWZpbmVkKTtcblxuLyoqXG4gKiBDb250ZXh0IGZvciBwYXNzaW5nIGEgZGVjcnlwdCBoYW5kbGVyIGRvd24gdG8gRGF0YUluc3BlY3RvciBpbnN0YW5jZXMuXG4gKiBXaGVuIHByb3ZpZGVkLCBlbmNyeXB0ZWQgbWFya2VycyBiZWNvbWUgY2xpY2thYmxlIGJ1dHRvbnMgdGhhdCB0cmlnZ2VyIGRlY3J5cHRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIERlY3J5cHRDbGlja0NvbnRleHRWYWx1ZSA9IHtcbiAgb25EZWNyeXB0OiAoKSA9PiB2b2lkO1xuICBpc0RlY3J5cHRpbmc6IGJvb2xlYW47XG4gIGlzRGVjcnlwdERpc2FibGVkPzogYm9vbGVhbjtcbiAgZGVjcnlwdERpc2FibGVkUmVhc29uPzogc3RyaW5nO1xuICBoYXNFbmNyeXB0ZWREYXRhPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBEZWNyeXB0Q2xpY2tDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxcbiAgRGVjcnlwdENsaWNrQ29udGV4dFZhbHVlIHwgdW5kZWZpbmVkXG4+KHVuZGVmaW5lZCk7XG5cbmV4cG9ydCBjb25zdCBSdW5DbGlja0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFxuICAoKHJ1bklkOiBzdHJpbmcpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4+KHVuZGVmaW5lZCk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya2Zsb3ctc3BlY2lmaWMgdmFsdWUgcmVuZGVyZXJzIChiYWRnZXMsIGVuY3J5cHRlZCBtYXJrZXJzLCBieXRlIHN0cmVhbXMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gRW5jcnlwdGVkSW5saW5lTGFiZWwoKSB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoRGVjcnlwdENsaWNrQ29udGV4dCk7XG4gIGlmIChjdHgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJ1dHRvblxuICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICBjbGFzc05hbWU9XCJhbGlnbi1iYXNlbGluZSBnYXAteC0xXCJcbiAgICAgICAgZGlzYWJsZWQ9e2N0eC5pc0RlY3J5cHRpbmcgfHwgY3R4LmlzRGVjcnlwdERpc2FibGVkfVxuICAgICAgICB0aXRsZT17Y3R4LmlzRGVjcnlwdERpc2FibGVkID8gY3R4LmRlY3J5cHREaXNhYmxlZFJlYXNvbiA6IHVuZGVmaW5lZH1cbiAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGN0eC5vbkRlY3J5cHQoKTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2N0eC5pc0RlY3J5cHRpbmcgPyAoXG4gICAgICAgICAgPFNwaW5uZXIgc2l6ZT17MTB9IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPExvY2sgY2xhc3NOYW1lPVwiaC0zIHctM1wiIC8+XG4gICAgICAgICl9XG4gICAgICAgIDxzcGFuPkRlY3J5cHQ8L3NwYW4+XG4gICAgICA8L0J1dHRvbj5cbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1ncmF5LTYwMCBpdGFsaWNcIj5cbiAgICAgIDxMb2NrIGNsYXNzTmFtZT1cIi1tdC1weCBtci1bM3B4XSBpbmxpbmUgaC0zIHctMyBhbGlnbi1taWRkbGVcIiAvPlxuICAgICAgRW5jcnlwdGVkXG4gICAgPC9zcGFuPlxuICApO1xufVxuXG5mdW5jdGlvbiBTdHJlYW1SZWZJbmxpbmUoeyBzdHJlYW1SZWYgfTogeyBzdHJlYW1SZWY6IFN0cmVhbVJlZiB9KSB7XG4gIGNvbnN0IG9uU3RyZWFtQ2xpY2sgPSB1c2VDb250ZXh0KFN0cmVhbUNsaWNrQ29udGV4dCk7XG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZCBib3JkZXIgYm9yZGVyLWJsdWUtMzAwIGJnLWJsdWUtMTAwIHB4LTEuNSBweS0wLjUgZm9udC1tb25vIHRleHQtWzEwcHhdIHRleHQtYmx1ZS05MDAgdW5kZXJsaW5lIGRlY29yYXRpb24tdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctYmx1ZS0yMDBcIlxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25TdHJlYW1DbGljaz8uKHN0cmVhbVJlZi5zdHJlYW1JZCk7XG4gICAgICB9fVxuICAgICAgdGl0bGU9e2BWaWV3IHN0cmVhbTogJHtzdHJlYW1SZWYuc3RyZWFtSWR9YH1cbiAgICA+XG4gICAgICA8c3Bhbj7wn5OhPC9zcGFuPlxuICAgICAgPHNwYW4+e3N0cmVhbVJlZi5zdHJlYW1JZH08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFJ1blJlZklubGluZSh7IHJ1blJlZiB9OiB7IHJ1blJlZjogUnVuUmVmIH0pIHtcbiAgY29uc3Qgb25SdW5DbGljayA9IHVzZUNvbnRleHQoUnVuQ2xpY2tDb250ZXh0KTtcbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciBnYXAtMSByb3VuZGVkIGJvcmRlciBib3JkZXItcHVycGxlLTMwMCBiZy1wdXJwbGUtMTAwIHB4LTEuNSBweS0wLjUgZm9udC1tb25vIHRleHQtWzEwcHhdIHRleHQtcHVycGxlLTkwMCB1bmRlcmxpbmUgZGVjb3JhdGlvbi10cmFuc3BhcmVudCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1wdXJwbGUtMjAwXCJcbiAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIG9uUnVuQ2xpY2s/LihydW5SZWYucnVuSWQpO1xuICAgICAgfX1cbiAgICAgIHRpdGxlPXtgVmlldyBydW46ICR7cnVuUmVmLnJ1bklkfWB9XG4gICAgPlxuICAgICAgPHNwYW4+e3J1blJlZi5ydW5JZH08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICk7XG59XG5cbmZ1bmN0aW9uIERlY29kZWRCeXRlc0NodW5rKHtcbiAgZGVjb2RlZFRleHQsXG4gIHNvdXJjZSxcbn06IHtcbiAgZGVjb2RlZFRleHQ6IHN0cmluZztcbiAgc291cmNlOiBEZWNvZGVkU3RyZWFtQ2h1bmtTb3VyY2U7XG59KSB7XG4gIGNvbnN0IFtzZWxlY3RlZFZpZXcsIHNldFNlbGVjdGVkVmlld10gPSB1c2VTdGF0ZTwnZGVjb2RlZCcgfCAnYnl0ZXMnPihcbiAgICAnZGVjb2RlZCdcbiAgKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VDaHVua0RhdGEoZGVjb2RlZFRleHQpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wXCI+XG4gICAgICB7c2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCcgPyAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMFwiPlxuICAgICAgICAgIHt0eXBlb2YgcGFyc2VkID09PSAnc3RyaW5nJyA/IChcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHMgdGV4dC1ncmF5LTEwMDBcIj5cbiAgICAgICAgICAgICAge2Rlc2VyaWFsaXplQ2h1bmtUZXh0KHBhcnNlZCl9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxEYXRhSW5zcGVjdG9yIGRhdGE9e3BhcnNlZH0gZXhwYW5kTGV2ZWw9ezF9IC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogKFxuICAgICAgICA8RGVjb2RlZEJ5dGVzSW5zcGVjdG9yIGRlY29kZWRUZXh0PXtkZWNvZGVkVGV4dH0gc291cmNlPXtzb3VyY2V9IC8+XG4gICAgICApfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0yIGZsZXhcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IG92ZXJmbG93LWhpZGRlbiByb3VuZGVkIGJvcmRlciBib3JkZXItZ3JheS00MDBcIlxuICAgICAgICAgIHRpdGxlPXtgJHtzb3VyY2UudHlwZX0gZGVjb2RlZCBhcyAke3NvdXJjZS5lbmNvZGluZy50b1VwcGVyQ2FzZSgpfSB0ZXh0LiBTd2l0Y2ggdG8gQnl0ZXMgdG8gaW5zcGVjdCB0aGUgc3VtbWFyaXplZCByYXcgdmFsdWUuYH1cbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ2gtNSBweC0xLjUgZm9udC1tZWRpdW0gdGV4dC1bMTBweF0gdGV4dC1ncmF5LTkwMCcsXG4gICAgICAgICAgICAgIHNlbGVjdGVkVmlldyA9PT0gJ2RlY29kZWQnID8gJ2JnLWdyYXktMjAwJyA6ICdiZy1ncmF5LTEwMCdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTZWxlY3RlZFZpZXcoJ2RlY29kZWQnKX1cbiAgICAgICAgICAgIGFyaWEtcHJlc3NlZD17c2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCd9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2hvdyBkZWNvZGVkIHRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIERlY29kZWRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdoLTUgYm9yZGVyLWdyYXktNDAwIGJvcmRlci1sIHB4LTEuNSBmb250LW1lZGl1bSB0ZXh0LVsxMHB4XSB0ZXh0LWdyYXktOTAwJyxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3ID09PSAnYnl0ZXMnID8gJ2JnLWdyYXktMjAwJyA6ICdiZy1ncmF5LTEwMCdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTZWxlY3RlZFZpZXcoJ2J5dGVzJyl9XG4gICAgICAgICAgICBhcmlhLXByZXNzZWQ9e3NlbGVjdGVkVmlldyA9PT0gJ2J5dGVzJ31cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTaG93IHJhdyBieXRlcyBzdW1tYXJ5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBCeXRlc1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBEZWNvZGVkQnl0ZXNJbnNwZWN0b3Ioe1xuICBkZWNvZGVkVGV4dCxcbiAgc291cmNlLFxufToge1xuICBkZWNvZGVkVGV4dDogc3RyaW5nO1xuICBzb3VyY2U6IERlY29kZWRTdHJlYW1DaHVua1NvdXJjZTtcbn0pIHtcbiAgY29uc3QgW2V4cGFuZGVkLCBzZXRFeHBhbmRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtbW9ub1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBtYXgtdy1mdWxsIGl0ZW1zLXN0YXJ0IGdhcC0xIHRleHQtbGVmdCB0ZXh0LWdyYXktMTAwMFwiXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEV4cGFuZGVkKCh2YWx1ZSkgPT4gIXZhbHVlKX1cbiAgICAgICAgdGl0bGU9e2Ake3NvdXJjZS50eXBlfSBkZWNvZGVkIGFzICR7c291cmNlLmVuY29kaW5nLnRvVXBwZXJDYXNlKCl9IHRleHRgfVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzZWxlY3Qtbm9uZSB0ZXh0LWdyYXktNzAwXCI+XG4gICAgICAgICAge2V4cGFuZGVkID8gJ+KWvCcgOiAn4pa2J31cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtaW4tdy0wIGJyZWFrLXdvcmRzXCI+e3NvdXJjZS5yYXdTdW1tYXJ5fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAge2V4cGFuZGVkICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIHBsLTVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktNzAwXCI+ZGVjb2RlZDogPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHMgdGV4dC1ncmVlbi05MDBcIj5cbiAgICAgICAgICAgIHtKU09OLnN0cmluZ2lmeShkZWNvZGVkVGV4dCl9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEJ5dGVzRGlzcGxheVZhbHVlKHsgZGlzcGxheSB9OiB7IGRpc3BsYXk6IEJ5dGVzRGlzcGxheSB9KSB7XG4gIGlmIChkaXNwbGF5LmRlY29kZWRGcm9tKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEZWNvZGVkQnl0ZXNDaHVua1xuICAgICAgICBkZWNvZGVkVGV4dD17ZGlzcGxheS50ZXh0fVxuICAgICAgICBzb3VyY2U9e2Rpc3BsYXkuZGVjb2RlZEZyb219XG4gICAgICAvPlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICA8c3BhbiBjbGFzc05hbWU9XCJ3aGl0ZXNwYWNlLXByZS13cmFwIGJyZWFrLXdvcmRzIHRleHQtZ3JheS0xMDAwXCI+XG4gICAgICB7ZGlzcGxheS50ZXh0fVxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUcmVlIHJlbmRlcmVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBFbnRyeSA9IFtmaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkLCB2YWx1ZTogdW5rbm93bl07XG5cbmludGVyZmFjZSBOb2RlQ29udGV4dCB7XG4gIGxldmVsOiBudW1iZXI7XG4gIHNob3VsZEV4cGFuZDogKGxldmVsOiBudW1iZXIpID0+IGJvb2xlYW47XG4gIG91dGVyUmVmOiBSZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQgfCBudWxsPjtcbn1cblxuLyoqIEZpZWxkIG5hbWVzIGFyZSByZW5kZXJlZCB1bnF1b3RlZCAoZW1wdHkgc3RyaW5nIHNob3dzIGFzIGBcIlwiYCkuICovXG5mdW5jdGlvbiBmb3JtYXRGaWVsZChmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZpZWxkID09PSAnJyA/ICdcIlwiJyA6IGZpZWxkO1xufVxuXG4vKipcbiAqIERlc2NyaWJlIGFuIG9iamVjdC9hcnJheS9tYXAvc2V0IGFzIGFuIGV4cGFuZGFibGUgY29udGFpbmVyLiBSZXR1cm5zIG51bGwgZm9yXG4gKiB2YWx1ZXMgdGhhdCBzaG91bGQgcmVuZGVyIGFzIGEgcHJpbWl0aXZlLiBgcHJlZml4YCBjYXJyaWVzIGEgY2xhc3MgbmFtZSBzaG93blxuICogYmVmb3JlIHRoZSBvcGVuaW5nIGJyYWNrZXQgKE1hcC9TZXQgYW5kIG5hbWVkIGNsYXNzIGluc3RhbmNlcykuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQ29udGFpbmVyKFxuICB2YWx1ZTogdW5rbm93blxuKTogeyBlbnRyaWVzOiBFbnRyeVtdOyBvcGVuOiBzdHJpbmc7IGNsb3NlOiBzdHJpbmc7IHByZWZpeD86IHN0cmluZyB9IHwgbnVsbCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBlbnRyaWVzOiB2YWx1ZS5tYXAoKGl0ZW0pID0+IFt1bmRlZmluZWQsIGl0ZW1dIGFzIEVudHJ5KSxcbiAgICAgIG9wZW46ICdbJyxcbiAgICAgIGNsb3NlOiAnXScsXG4gICAgfTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50cmllczogQXJyYXkuZnJvbSh2YWx1ZS5lbnRyaWVzKCksIChba2V5LCB2YWxdKSA9PiBbXG4gICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICB2YWwsXG4gICAgICBdKSBhcyBFbnRyeVtdLFxuICAgICAgb3BlbjogJ3snLFxuICAgICAgY2xvc2U6ICd9JyxcbiAgICAgIHByZWZpeDogJ01hcCcsXG4gICAgfTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50cmllczogQXJyYXkuZnJvbSh2YWx1ZS52YWx1ZXMoKSwgKGl0ZW0pID0+IFt1bmRlZmluZWQsIGl0ZW1dIGFzIEVudHJ5KSxcbiAgICAgIG9wZW46ICdbJyxcbiAgICAgIGNsb3NlOiAnXScsXG4gICAgICBwcmVmaXg6ICdTZXQnLFxuICAgIH07XG4gIH1cbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBuYW1lID0gKHZhbHVlIGFzIHsgY29uc3RydWN0b3I/OiB7IG5hbWU/OiBzdHJpbmcgfSB9KS5jb25zdHJ1Y3RvclxuICAgICAgPy5uYW1lO1xuICAgIHJldHVybiB7XG4gICAgICBlbnRyaWVzOiBPYmplY3QuZW50cmllcyh2YWx1ZSkgYXMgRW50cnlbXSxcbiAgICAgIG9wZW46ICd7JyxcbiAgICAgIGNsb3NlOiAnfScsXG4gICAgICBwcmVmaXg6IG5hbWUgJiYgbmFtZSAhPT0gJ09iamVjdCcgPyBuYW1lIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlUHJpbWl0aXZlKHZhbHVlOiB1bmtub3duKTogeyB0ZXh0OiBzdHJpbmc7IGNsczogc3RyaW5nIH0ge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiB7IHRleHQ6ICdudWxsJywgY2xzOiBDTFMubnVsbCB9O1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgdGV4dDogJ3VuZGVmaW5lZCcsIGNsczogQ0xTLnVuZGVmaW5lZCB9O1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgIHJldHVybiB7IHRleHQ6IGBcIiR7U3RyaW5nKHZhbHVlKX1cImAsIGNsczogQ0xTLnN0cmluZyB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHtcbiAgICByZXR1cm4geyB0ZXh0OiBTdHJpbmcodmFsdWUpLCBjbHM6IENMUy5ib29sZWFuIH07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICByZXR1cm4geyB0ZXh0OiBTdHJpbmcodmFsdWUpLCBjbHM6IENMUy5udW1iZXIgfTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiB7IHRleHQ6IGAke3ZhbHVlLnRvU3RyaW5nKCl9bmAsIGNsczogQ0xTLm51bWJlciB9O1xuICB9XG4gIHJldHVybiB7IHRleHQ6IFN0cmluZyh2YWx1ZSksIGNsczogQ0xTLnB1bmN0dWF0aW9uIH07XG59XG5cbmZ1bmN0aW9uIExhYmVsKHsgZmllbGQsIGNsaWNrYWJsZSB9OiB7IGZpZWxkPzogc3RyaW5nOyBjbGlja2FibGU/OiBib29sZWFuIH0pIHtcbiAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICByZXR1cm4gKFxuICAgIDxzcGFuIGNsYXNzTmFtZT17Y2xpY2thYmxlID8gQ0xTLmNsaWNrYWJsZUxhYmVsIDogQ0xTLmxhYmVsfT5cbiAgICAgIHtgJHtmb3JtYXRGaWVsZChmaWVsZCl9OmB9XG4gICAgPC9zcGFuPlxuICApO1xufVxuXG5mdW5jdGlvbiBDb21tYSh7IGlzTGFzdCB9OiB7IGlzTGFzdDogYm9vbGVhbiB9KSB7XG4gIGlmIChpc0xhc3QpIHJldHVybiBudWxsO1xuICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPXtDTFMucHVuY3R1YXRpb259Piw8L3NwYW4+O1xufVxuXG4vKiogQSBub24tZXhwYW5kYWJsZSByb3c6IGBmaWVsZDogPHZhbHVlPmAuICovXG5mdW5jdGlvbiBMZWFmUm93KHtcbiAgZmllbGQsXG4gIGlzTGFzdCxcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGZpZWxkPzogc3RyaW5nO1xuICBpc0xhc3Q6IGJvb2xlYW47XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e0NMUy5jaGlsZH0gcm9sZT1cInRyZWVpdGVtXCIgdGFiSW5kZXg9ey0xfT5cbiAgICAgIDxMYWJlbCBmaWVsZD17ZmllbGR9IC8+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICA8Q29tbWEgaXNMYXN0PXtpc0xhc3R9IC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFByaW1pdGl2ZVZhbHVlKHsgZmllbGQsIHZhbHVlLCBpc0xhc3QgfTogTm9kZVByb3BzKSB7XG4gIGNvbnN0IHsgdGV4dCwgY2xzIH0gPSBkZXNjcmliZVByaW1pdGl2ZSh2YWx1ZSk7XG4gIHJldHVybiAoXG4gICAgPExlYWZSb3cgZmllbGQ9e2ZpZWxkfSBpc0xhc3Q9e2lzTGFzdH0+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e2Nsc30+e3RleHR9PC9zcGFuPlxuICAgIDwvTGVhZlJvdz5cbiAgKTtcbn1cblxuZnVuY3Rpb24gRW1wdHlDb250YWluZXIoe1xuICBmaWVsZCxcbiAgcHJlZml4LFxuICBvcGVuLFxuICBjbG9zZSxcbiAgaXNMYXN0LFxufToge1xuICBmaWVsZD86IHN0cmluZztcbiAgcHJlZml4Pzogc3RyaW5nO1xuICBvcGVuOiBzdHJpbmc7XG4gIGNsb3NlOiBzdHJpbmc7XG4gIGlzTGFzdDogYm9vbGVhbjtcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Q0xTLmNoaWxkfSByb2xlPVwidHJlZWl0ZW1cIiB0YWJJbmRleD17LTF9PlxuICAgICAgPExhYmVsIGZpZWxkPXtmaWVsZH0gLz5cbiAgICAgIHtwcmVmaXggPyA8c3BhbiBjbGFzc05hbWU9e0NMUy5jbGFzc05hbWV9PntwcmVmaXh9PC9zcGFuPiA6IG51bGx9XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e0NMUy5wdW5jdHVhdGlvbn0+e29wZW59PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtDTFMucHVuY3R1YXRpb259PntjbG9zZX08L3NwYW4+XG4gICAgICA8Q29tbWEgaXNMYXN0PXtpc0xhc3R9IC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIGZvY3VzRXhwYW5kZXIoXG4gIGJ1dHRvbjogSFRNTEVsZW1lbnQsXG4gIG91dGVyUmVmOiBSZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQgfCBudWxsPlxuKSB7XG4gIGNvbnN0IHByZXZpb3VzID0gb3V0ZXJSZWYuY3VycmVudD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXG4gICAgJ1tkYXRhLWpzb24tZXhwYW5kZXJdW3RhYmluZGV4PVwiMFwiXSdcbiAgKTtcbiAgaWYgKHByZXZpb3VzKSBwcmV2aW91cy50YWJJbmRleCA9IC0xO1xuICBidXR0b24udGFiSW5kZXggPSAwO1xuICBidXR0b24uZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gbW92ZUV4cGFuZGVyRm9jdXMoXG4gIG91dGVyUmVmOiBSZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQgfCBudWxsPixcbiAgZGlyZWN0aW9uOiAxIHwgLTFcbikge1xuICBjb25zdCByb290ID0gb3V0ZXJSZWYuY3VycmVudDtcbiAgaWYgKCFyb290KSByZXR1cm47XG4gIGNvbnN0IGJ1dHRvbnMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdbZGF0YS1qc29uLWV4cGFuZGVyXScpO1xuICBsZXQgY3VycmVudCA9IC0xO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoYnV0dG9uc1tpXS50YWJJbmRleCA9PT0gMCkge1xuICAgICAgY3VycmVudCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnQgPCAwKSByZXR1cm47XG4gIGNvbnN0IG5leHQgPSAoY3VycmVudCArIGRpcmVjdGlvbiArIGJ1dHRvbnMubGVuZ3RoKSAlIGJ1dHRvbnMubGVuZ3RoO1xuICBidXR0b25zW2N1cnJlbnRdLnRhYkluZGV4ID0gLTE7XG4gIGJ1dHRvbnNbbmV4dF0udGFiSW5kZXggPSAwO1xuICBidXR0b25zW25leHRdLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIEV4cGFuZGFibGVDb250YWluZXIoe1xuICBmaWVsZCxcbiAgZW50cmllcyxcbiAgb3BlbixcbiAgY2xvc2UsXG4gIHByZWZpeCxcbiAgY3R4LFxuICBpc0xhc3QsXG59OiB7XG4gIGZpZWxkPzogc3RyaW5nO1xuICBlbnRyaWVzOiBFbnRyeVtdO1xuICBvcGVuOiBzdHJpbmc7XG4gIGNsb3NlOiBzdHJpbmc7XG4gIHByZWZpeD86IHN0cmluZztcbiAgY3R4OiBOb2RlQ29udGV4dDtcbiAgaXNMYXN0OiBib29sZWFuO1xufSkge1xuICBjb25zdCB7IGxldmVsLCBzaG91bGRFeHBhbmQsIG91dGVyUmVmIH0gPSBjdHg7XG4gIGNvbnN0IFtleHBhbmRlZCwgc2V0RXhwYW5kZWRdID0gdXNlU3RhdGUoKCkgPT4gc2hvdWxkRXhwYW5kKGxldmVsKSk7XG4gIGNvbnN0IHJvd1JlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IGNvbnRlbnRzSWQgPSB1c2VJZCgpO1xuXG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICA8RW1wdHlDb250YWluZXJcbiAgICAgICAgZmllbGQ9e2ZpZWxkfVxuICAgICAgICBwcmVmaXg9e3ByZWZpeH1cbiAgICAgICAgb3Blbj17b3Blbn1cbiAgICAgICAgY2xvc2U9e2Nsb3NlfVxuICAgICAgICBpc0xhc3Q9e2lzTGFzdH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRvZ2dsZSA9ICgpID0+IHtcbiAgICBzZXRFeHBhbmRlZCgodmFsdWUpID0+ICF2YWx1ZSk7XG4gICAgaWYgKHJvd1JlZi5jdXJyZW50KSBmb2N1c0V4cGFuZGVyKHJvd1JlZi5jdXJyZW50LCBvdXRlclJlZik7XG4gIH07XG5cbiAgLy8gVG9nZ2xlIG9ubHkgZm9yIGNsaWNrcyB0aGF0IGxhbmQgb24gdGhpcyByb3cgaXRzZWxmOyBjbGlja3MgYnViYmxpbmcgdXAgb3V0XG4gIC8vIG9mIGEgbmVzdGVkIHRyZWVpdGVtIGFyZSBoYW5kbGVkIGJ5IHRoYXQgZGVzY2VuZGFudCdzIG93biByb3cuXG4gIGNvbnN0IG9uQ2xpY2sgPSAoZXZlbnQ6IFJlYWN0TW91c2VFdmVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJ1tyb2xlPVwidHJlZWl0ZW1cIl0nKSAhPT1cbiAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdG9nZ2xlKCk7XG4gIH07XG5cbiAgY29uc3Qgb25LZXlEb3duID0gKGV2ZW50OiBSZWFjdEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRFeHBhbmRlZCh0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRFeHBhbmRlZChmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIG1vdmVFeHBhbmRlckZvY3VzKG91dGVyUmVmLCAtMSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgbW92ZUV4cGFuZGVyRm9jdXMob3V0ZXJSZWYsIDEpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsYXN0SW5kZXggPSBlbnRyaWVzLmxlbmd0aCAtIDE7XG5cbiAgcmV0dXJuIChcbiAgICAvLyBUaGUgdHJlZWl0ZW0gcm93IGlzIHRoZSBmb2N1c2FibGUsIGtleWJvYXJkLW9wZXJhYmxlIGNvbnRyb2wgKHJvdmluZ1xuICAgIC8vIHRhYmluZGV4ICsgYXJyb3cga2V5cyk7IHRoZSBkaXNjbG9zdXJlIG1hcmtlciBiZWxvdyBpcyBwdXJlbHkgZGVjb3JhdGl2ZS5cbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e0NMUy5jaGlsZH1cbiAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICBhcmlhLWV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgIGFyaWEtY29udHJvbHM9e2V4cGFuZGVkID8gY29udGVudHNJZCA6IHVuZGVmaW5lZH1cbiAgICAgIGRhdGEtanNvbi1leHBhbmRlclxuICAgICAgcmVmPXtyb3dSZWZ9XG4gICAgICB0YWJJbmRleD17bGV2ZWwgPT09IDAgPyAwIDogLTF9XG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgb25LZXlEb3duPXtvbktleURvd259XG4gICAgPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3NOYW1lPXtleHBhbmRlZCA/IENMUy5jb2xsYXBzZUljb24gOiBDTFMuZXhwYW5kSWNvbn1cbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIC8+XG4gICAgICB7ZmllbGQgIT09IHVuZGVmaW5lZCAmJiAoXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Q0xTLmNsaWNrYWJsZUxhYmVsfT57YCR7Zm9ybWF0RmllbGQoZmllbGQpfTpgfTwvc3Bhbj5cbiAgICAgICl9XG4gICAgICB7cHJlZml4ID8gPHNwYW4gY2xhc3NOYW1lPXtDTFMuY2xhc3NOYW1lfT57cHJlZml4fTwvc3Bhbj4gOiBudWxsfVxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtDTFMucHVuY3R1YXRpb259PntvcGVufTwvc3Bhbj5cbiAgICAgIHtleHBhbmRlZCA/IChcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvYTExeS91c2VTZW1hbnRpY0VsZW1lbnRzOiBBUklBIHRyZWUgZ3JvdXAgaXMgdGhlIGNvcnJlY3Qgcm9sZSBoZXJlXG4gICAgICAgIDx1bCBpZD17Y29udGVudHNJZH0gY2xhc3NOYW1lPXtDTFMuY2hpbGRGaWVsZHN9IHJvbGU9XCJncm91cFwiPlxuICAgICAgICAgIHtlbnRyaWVzLm1hcCgoW2NoaWxkRmllbGQsIGNoaWxkVmFsdWVdLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPERhdGFSZW5kZXJcbiAgICAgICAgICAgICAga2V5PXtjaGlsZEZpZWxkID8/IGluZGV4fVxuICAgICAgICAgICAgICBmaWVsZD17Y2hpbGRGaWVsZH1cbiAgICAgICAgICAgICAgdmFsdWU9e2NoaWxkVmFsdWV9XG4gICAgICAgICAgICAgIGlzTGFzdD17aW5kZXggPT09IGxhc3RJbmRleH1cbiAgICAgICAgICAgICAgY3R4PXt7IC4uLmN0eCwgbGV2ZWw6IGxldmVsICsgMSB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC91bD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Q0xTLmNvbGxhcHNlZENvbnRlbnR9IGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICApfVxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtDTFMucHVuY3R1YXRpb259PntjbG9zZX08L3NwYW4+XG4gICAgICA8Q29tbWEgaXNMYXN0PXtpc0xhc3R9IC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmludGVyZmFjZSBOb2RlUHJvcHMge1xuICBmaWVsZD86IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG4gIGlzTGFzdDogYm9vbGVhbjtcbiAgY3R4OiBOb2RlQ29udGV4dDtcbn1cblxuZnVuY3Rpb24gRGF0YVJlbmRlcih7IGZpZWxkLCB2YWx1ZSwgaXNMYXN0LCBjdHggfTogTm9kZVByb3BzKSB7XG4gIGlmIChpc0J5dGVzRGlzcGxheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPExlYWZSb3cgZmllbGQ9e2ZpZWxkfSBpc0xhc3Q9e2lzTGFzdH0+XG4gICAgICAgIDxCeXRlc0Rpc3BsYXlWYWx1ZSBkaXNwbGF5PXt2YWx1ZX0gLz5cbiAgICAgIDwvTGVhZlJvdz5cbiAgICApO1xuICB9XG4gIGlmIChpc0VuY3J5cHRlZE1hcmtlcih2YWx1ZSkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPExlYWZSb3cgZmllbGQ9e2ZpZWxkfSBpc0xhc3Q9e2lzTGFzdH0+XG4gICAgICAgIDxFbmNyeXB0ZWRJbmxpbmVMYWJlbCAvPlxuICAgICAgPC9MZWFmUm93PlxuICAgICk7XG4gIH1cbiAgaWYgKGlzU3RyZWFtUmVmKHZhbHVlKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8TGVhZlJvdyBmaWVsZD17ZmllbGR9IGlzTGFzdD17aXNMYXN0fT5cbiAgICAgICAgPFN0cmVhbVJlZklubGluZSBzdHJlYW1SZWY9e3ZhbHVlfSAvPlxuICAgICAgPC9MZWFmUm93PlxuICAgICk7XG4gIH1cbiAgaWYgKGlzUnVuUmVmKHZhbHVlKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8TGVhZlJvdyBmaWVsZD17ZmllbGR9IGlzTGFzdD17aXNMYXN0fT5cbiAgICAgICAgPFJ1blJlZklubGluZSBydW5SZWY9e3ZhbHVlfSAvPlxuICAgICAgPC9MZWFmUm93PlxuICAgICk7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8TGVhZlJvdyBmaWVsZD17ZmllbGR9IGlzTGFzdD17aXNMYXN0fT5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtDTFMuZGF0ZX0+e3ZhbHVlLnRvSVNPU3RyaW5nKCl9PC9zcGFuPlxuICAgICAgPC9MZWFmUm93PlxuICAgICk7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxMZWFmUm93IGZpZWxkPXtmaWVsZH0gaXNMYXN0PXtpc0xhc3R9PlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e0NMUy5yZWdleHB9Pnt2YWx1ZS50b1N0cmluZygpfTwvc3Bhbj5cbiAgICAgIDwvTGVhZlJvdz5cbiAgICApO1xuICB9XG4gIGlmIChpc0NsYXNzSW5zdGFuY2VSZWYodmFsdWUpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxDbGFzc0luc3RhbmNlTm9kZVxuICAgICAgICBmaWVsZD17ZmllbGR9XG4gICAgICAgIGluc3RhbmNlPXt2YWx1ZX1cbiAgICAgICAgaXNMYXN0PXtpc0xhc3R9XG4gICAgICAgIGN0eD17Y3R4fVxuICAgICAgLz5cbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29udGFpbmVyID0gZGVzY3JpYmVDb250YWluZXIodmFsdWUpO1xuICBpZiAoY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxFeHBhbmRhYmxlQ29udGFpbmVyXG4gICAgICAgIGZpZWxkPXtmaWVsZH1cbiAgICAgICAgZW50cmllcz17Y29udGFpbmVyLmVudHJpZXN9XG4gICAgICAgIG9wZW49e2NvbnRhaW5lci5vcGVufVxuICAgICAgICBjbG9zZT17Y29udGFpbmVyLmNsb3NlfVxuICAgICAgICBwcmVmaXg9e2NvbnRhaW5lci5wcmVmaXh9XG4gICAgICAgIGN0eD17Y3R4fVxuICAgICAgICBpc0xhc3Q9e2lzTGFzdH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFByaW1pdGl2ZVZhbHVlIGZpZWxkPXtmaWVsZH0gdmFsdWU9e3ZhbHVlfSBpc0xhc3Q9e2lzTGFzdH0gY3R4PXtjdHh9IC8+XG4gICk7XG59XG5cbmZ1bmN0aW9uIENsYXNzSW5zdGFuY2VOb2RlKHtcbiAgZmllbGQsXG4gIGluc3RhbmNlLFxuICBpc0xhc3QsXG4gIGN0eCxcbn06IHtcbiAgZmllbGQ/OiBzdHJpbmc7XG4gIGluc3RhbmNlOiBDbGFzc0luc3RhbmNlUmVmO1xuICBpc0xhc3Q6IGJvb2xlYW47XG4gIGN0eDogTm9kZUNvbnRleHQ7XG59KSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRlc2NyaWJlQ29udGFpbmVyKGluc3RhbmNlLmRhdGEpO1xuICBpZiAoY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxFeHBhbmRhYmxlQ29udGFpbmVyXG4gICAgICAgIGZpZWxkPXtmaWVsZH1cbiAgICAgICAgZW50cmllcz17Y29udGFpbmVyLmVudHJpZXN9XG4gICAgICAgIG9wZW49e2NvbnRhaW5lci5vcGVufVxuICAgICAgICBjbG9zZT17Y29udGFpbmVyLmNsb3NlfVxuICAgICAgICBwcmVmaXg9e2luc3RhbmNlLmNsYXNzTmFtZX1cbiAgICAgICAgY3R4PXtjdHh9XG4gICAgICAgIGlzTGFzdD17aXNMYXN0fVxuICAgICAgLz5cbiAgICApO1xuICB9XG4gIGNvbnN0IHsgdGV4dCwgY2xzIH0gPSBkZXNjcmliZVByaW1pdGl2ZShpbnN0YW5jZS5kYXRhKTtcbiAgcmV0dXJuIChcbiAgICA8TGVhZlJvdyBmaWVsZD17ZmllbGR9IGlzTGFzdD17aXNMYXN0fT5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT17Q0xTLmNsYXNzTmFtZX0+e2luc3RhbmNlLmNsYXNzTmFtZX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e2Nsc30+e3RleHR9PC9zcGFuPlxuICAgIDwvTGVhZlJvdz5cbiAgKTtcbn1cblxuZnVuY3Rpb24gSnNvblRyZWUoe1xuICBkYXRhLFxuICBuYW1lLFxuICBleHBhbmRMZXZlbCxcbn06IHtcbiAgZGF0YTogdW5rbm93bjtcbiAgbmFtZT86IHN0cmluZztcbiAgZXhwYW5kTGV2ZWw6IG51bWJlcjtcbn0pIHtcbiAgY29uc3Qgb3V0ZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBzaG91bGRFeHBhbmQgPSB1c2VNZW1vKFxuICAgICgpID0+IChsZXZlbDogbnVtYmVyKSA9PiBsZXZlbCA8IGV4cGFuZExldmVsLFxuICAgIFtleHBhbmRMZXZlbF1cbiAgKTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICByZWY9e291dGVyUmVmfVxuICAgICAgY2xhc3NOYW1lPXtDTFMuY29udGFpbmVyfVxuICAgICAgcm9sZT1cInRyZWVcIlxuICAgICAgYXJpYS1sYWJlbD1cIkpTT04gdmlld1wiXG4gICAgPlxuICAgICAgPERhdGFSZW5kZXJcbiAgICAgICAgZmllbGQ9e25hbWV9XG4gICAgICAgIHZhbHVlPXtkYXRhfVxuICAgICAgICBpc0xhc3RcbiAgICAgICAgY3R4PXt7IGxldmVsOiAwLCBzaG91bGRFeHBhbmQsIG91dGVyUmVmIH19XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlZiAvIHR5cGVkLWFycmF5IGNvbGxhcHNpbmcgKHByZXByb2Nlc3NpbmcgYmVmb3JlIHJlbmRlcilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZSBhIG5vbi1leHBhbmRhYmxlIHdyYXBwZXIgdGhhdCBjYXJyaWVzIHJlZiBkYXRhIGFzIG5vbi1lbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIHNvIHRoZSByZW5kZXJlciBjYW4gZGV0ZWN0IFN0cmVhbVJlZi9SdW5SZWYgd2l0aG91dCBleHBvc2luZ1xuICogdGhlaXIgaW50ZXJuYWxzIGFzIG9iamVjdCBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIG1ha2VPcGFxdWVSZWYocmVmOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd24ge1xuICBjb25zdCBvcGFxdWUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWYpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wYXF1ZSwga2V5LCB7IHZhbHVlLCBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbiAgfVxuICByZXR1cm4gb3BhcXVlO1xufVxuXG5mdW5jdGlvbiBtYWtlQnl0ZXNEaXNwbGF5KGRpc3BsYXk6IEZvcm1hdHRlZFN0cmVhbUNodW5rRGlzcGxheSk6IHVua25vd24ge1xuICBjb25zdCBvcGFxdWUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCAnX190eXBlJywge1xuICAgIHZhbHVlOiBCWVRFU19ESVNQTEFZX1RZUEUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCAndGV4dCcsIHtcbiAgICB2YWx1ZTogZGlzcGxheS50ZXh0LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wYXF1ZSwgJ2RlY29kZWRGcm9tJywge1xuICAgIHZhbHVlOiBkaXNwbGF5LmRlY29kZWRGcm9tLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIG9wYXF1ZTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSB3YWxrIGRhdGEgYW5kIHJlcGxhY2UgUnVuUmVmL1N0cmVhbVJlZi90eXBlZCBhcnJheSBvYmplY3RzIHdpdGhcbiAqIG5vbi1leHBhbmRhYmxlIHZlcnNpb25zIHNvIHRoZSByZW5kZXJlciBkb2Vzbid0IHNob3cgdGhlaXIgaW50ZXJuYWxzLlxuICogT25seSByZWN1cnNlcyBpbnRvIHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyB0byBhdm9pZCBzdHJpcHBpbmcgY2xhc3NcbiAqIGluc3RhbmNlcyAoRGF0ZSwgRXJyb3IsIFVSTCwgSGVhZGVycywgZXRjLikgdGhhdCBoYXZlIHRoZWlyIG93biByZW5kZXJpbmcuXG4gKiBNYXAgYW5kIFNldCBjb250YWluZXJzIGFyZSBwcmVzZXJ2ZWQgd2hpbGUgdGhlaXIgY29udGVudHMgYXJlIHByZXBhcmVkIGZvclxuICogZGlzcGxheS5cbiAqXG4gKiBFeHBvcnRlZCBmb3IgdGVzdGluZyB0aGUgdHlwZWQtYXJyYXkgZGV0ZWN0aW9uIHBhdGggdXNlZCBieSBoeWRyYXRlZFxuICogQUkgYWdlbnQgc3RyZWFtIGNodW5rcyAoZS5nLiBgeyBkZWx0YTogbmV3IFVpbnQ4QXJyYXkoLi4uKSB9YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsYXBzZVJlZnMoZGF0YTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBkYXRhO1xuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpICYmICEoZGF0YSBpbnN0YW5jZW9mIERhdGFWaWV3KSkge1xuICAgIHJldHVybiBtYWtlQnl0ZXNEaXNwbGF5KGZvcm1hdEFycmF5QnVmZmVyVmlld0ZvckRpc3BsYXkoZGF0YSkpO1xuICB9XG4gIGlmIChpc1J1blJlZihkYXRhKSB8fCBpc1N0cmVhbVJlZihkYXRhKSlcbiAgICByZXR1cm4gbWFrZU9wYXF1ZVJlZihkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIGRhdGEubWFwKGNvbGxhcHNlUmVmcyk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICBBcnJheS5mcm9tKGRhdGEuZW50cmllcygpLCAoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgIGNvbGxhcHNlUmVmcyhrZXkpLFxuICAgICAgICBjb2xsYXBzZVJlZnModmFsdWUpLFxuICAgICAgXSlcbiAgICApO1xuICB9XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuZnJvbShkYXRhLnZhbHVlcygpLCBjb2xsYXBzZVJlZnMpKTtcbiAgfVxuICAvLyBPbmx5IHJlY3Vyc2UgaW50byBwbGFpbiBvYmplY3RzOyBsZWF2ZSBjbGFzcyBpbnN0YW5jZXMgdW50b3VjaGVkXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGRhdGEpO1xuICBpZiAocHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUgJiYgcHJvdG8gIT09IG51bGwpIHJldHVybiBkYXRhO1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgcmVzdWx0W2tleV0gPSBjb2xsYXBzZVJlZnModmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljIGNvbXBvbmVudFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUluc3BlY3RvclByb3BzIHtcbiAgLyoqIFRoZSBkYXRhIHRvIGluc3BlY3QgKi9cbiAgZGF0YTogdW5rbm93bjtcbiAgLyoqIExldmVscyBzdHJpY3RseSBiZWxvdyB0aGlzIG51bWJlciBhdXRvLWV4cGFuZCAoZGVmYXVsdDogMikgKi9cbiAgZXhwYW5kTGV2ZWw/OiBudW1iZXI7XG4gIC8qKiBPcHRpb25hbCBuYW1lIGZvciB0aGUgcm9vdCBub2RlICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBDYWxsYmFjayB3aGVuIGEgc3RyZWFtIHJlZmVyZW5jZSBpcyBjbGlja2VkICovXG4gIG9uU3RyZWFtQ2xpY2s/OiAoc3RyZWFtSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHdoZW4gYSBydW4gcmVmZXJlbmNlIGlzIGNsaWNrZWQgKi9cbiAgb25SdW5DbGljaz86IChydW5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogQ2FsbGJhY2sgd2hlbiBhbiBlbmNyeXB0ZWQgbWFya2VyIGlzIGNsaWNrZWQgKHRyaWdnZXJzIGRlY3J5cHRpb24pICovXG4gIG9uRGVjcnlwdD86ICgpID0+IHZvaWQ7XG4gIC8qKiBXaGV0aGVyIGRlY3J5cHRpb24gaXMgY3VycmVudGx5IGluIHByb2dyZXNzICovXG4gIGlzRGVjcnlwdGluZz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGRlY3J5cHRpb24gaXMgdW5hdmFpbGFibGUgKi9cbiAgaXNEZWNyeXB0RGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogRXhwbGFpbnMgd2h5IGRlY3J5cHRpb24gaXMgdW5hdmFpbGFibGUgKi9cbiAgZGVjcnlwdERpc2FibGVkUmVhc29uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRGF0YUluc3BlY3Rvcih7XG4gIGRhdGEsXG4gIGV4cGFuZExldmVsID0gMixcbiAgbmFtZSxcbiAgb25TdHJlYW1DbGljayxcbiAgb25SdW5DbGljayxcbiAgb25EZWNyeXB0LFxuICBpc0RlY3J5cHRpbmcgPSBmYWxzZSxcbiAgaXNEZWNyeXB0RGlzYWJsZWQgPSBmYWxzZSxcbiAgZGVjcnlwdERpc2FibGVkUmVhc29uLFxufTogRGF0YUluc3BlY3RvclByb3BzKSB7XG4gIGNvbnN0IGNvbGxhcHNlZERhdGEgPSB1c2VNZW1vKCgpID0+IGNvbGxhcHNlUmVmcyhkYXRhKSwgW2RhdGFdKTtcbiAgY29uc3Qgc3RhYmxlRGF0YSA9IHVzZVN0YWJsZUluc3BlY3RvckRhdGEoY29sbGFwc2VkRGF0YSk7XG5cbiAgbGV0IGNvbnRlbnQ6IFJlYWN0Tm9kZSA9IChcbiAgICA8PlxuICAgICAgey8qIFJlYWN0IDE5IGhvaXN0cyAmIGRlZHVwZXMgdGhpcyA8c3R5bGU+IGJ5IGhyZWYsIHNvIGl0IGlzIGVtaXR0ZWQgb25jZVxuICAgICAgICAgIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgaW5zcGVjdG9ycyBhcmUgbW91bnRlZC4gKi99XG4gICAgICA8c3R5bGUgaHJlZj1cIndmLWpzb24tdmlld1wiIHByZWNlZGVuY2U9XCJkZWZhdWx0XCI+XG4gICAgICAgIHtKU09OX1ZJRVdfU1RZTEVTfVxuICAgICAgPC9zdHlsZT5cbiAgICAgIDxKc29uVHJlZSBkYXRhPXtzdGFibGVEYXRhfSBuYW1lPXtuYW1lfSBleHBhbmRMZXZlbD17ZXhwYW5kTGV2ZWx9IC8+XG4gICAgPC8+XG4gICk7XG5cbiAgaWYgKG9uU3RyZWFtQ2xpY2spIHtcbiAgICBjb250ZW50ID0gKFxuICAgICAgPFN0cmVhbUNsaWNrQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17b25TdHJlYW1DbGlja30+XG4gICAgICAgIHtjb250ZW50fVxuICAgICAgPC9TdHJlYW1DbGlja0NvbnRleHQuUHJvdmlkZXI+XG4gICAgKTtcbiAgfVxuICBpZiAob25SdW5DbGljaykge1xuICAgIGNvbnRlbnQgPSAoXG4gICAgICA8UnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtvblJ1bkNsaWNrfT5cbiAgICAgICAge2NvbnRlbnR9XG4gICAgICA8L1J1bkNsaWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgICApO1xuICB9XG4gIGlmIChvbkRlY3J5cHQpIHtcbiAgICBjb250ZW50ID0gKFxuICAgICAgPERlY3J5cHRDbGlja0NvbnRleHQuUHJvdmlkZXJcbiAgICAgICAgdmFsdWU9e3tcbiAgICAgICAgICBvbkRlY3J5cHQsXG4gICAgICAgICAgaXNEZWNyeXB0aW5nLFxuICAgICAgICAgIGlzRGVjcnlwdERpc2FibGVkLFxuICAgICAgICAgIGRlY3J5cHREaXNhYmxlZFJlYXNvbixcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2NvbnRlbnR9XG4gICAgICA8L0RlY3J5cHRDbGlja0NvbnRleHQuUHJvdmlkZXI+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlbmRlciBzdGFiaWxpemF0aW9uIChhdm9pZCByZS1yZW5kZXJzIHdoZW4gZGF0YSBpcyBkZWVwbHkgZXF1YWwpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gdXNlU3RhYmxlSW5zcGVjdG9yRGF0YTxUPihuZXh0OiBUKTogVCB7XG4gIGNvbnN0IHByZXZpb3VzUmVmID0gdXNlUmVmPFQ+KG5leHQpO1xuICBpZiAoIWlzRGVlcEVxdWFsKHByZXZpb3VzUmVmLmN1cnJlbnQsIG5leHQpKSB7XG4gICAgcHJldmlvdXNSZWYuY3VycmVudCA9IG5leHQ7XG4gIH1cbiAgcmV0dXJuIHByZXZpb3VzUmVmLmN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZUJ5dGVzRGlzcGxheShhOiBCeXRlc0Rpc3BsYXksIGI6IEJ5dGVzRGlzcGxheSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGEudGV4dCA9PT0gYi50ZXh0ICYmXG4gICAgYS5kZWNvZGVkRnJvbT8udHlwZSA9PT0gYi5kZWNvZGVkRnJvbT8udHlwZSAmJlxuICAgIGEuZGVjb2RlZEZyb20/LmVuY29kaW5nID09PSBiLmRlY29kZWRGcm9tPy5lbmNvZGluZyAmJlxuICAgIGEuZGVjb2RlZEZyb20/LnJhd1N1bW1hcnkgPT09IGIuZGVjb2RlZEZyb20/LnJhd1N1bW1hcnlcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNEZWVwRXF1YWwoYTogdW5rbm93biwgYjogdW5rbm93biwgc2VlbiA9IG5ldyBXZWFrTWFwKCkpOiBib29sZWFuIHtcbiAgaWYgKE9iamVjdC5pcyhhLCBiKSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKGlzQnl0ZXNEaXNwbGF5KGEpIHx8IGlzQnl0ZXNEaXNwbGF5KGIpKSB7XG4gICAgcmV0dXJuIGlzQnl0ZXNEaXNwbGF5KGEpICYmIGlzQnl0ZXNEaXNwbGF5KGIpICYmIGlzU2FtZUJ5dGVzRGlzcGxheShhLCBiKTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCk7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiBiIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBNYXAgJiYgYiBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEuZW50cmllcygpKSB7XG4gICAgICBpZiAoIWIuaGFzKGtleSkgfHwgIWlzRGVlcEVxdWFsKHZhbHVlLCBiLmdldChrZXkpLCBzZWVuKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgU2V0ICYmIGIgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGEudmFsdWVzKCkpIHtcbiAgICAgIGlmICghYi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFpc09iamVjdExpa2UoYSkgfHwgIWlzT2JqZWN0TGlrZShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzZWVuLmdldChhKSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIHNlZW4uc2V0KGEsIGIpO1xuXG4gIGNvbnN0IGFJc0FycmF5ID0gQXJyYXkuaXNBcnJheShhKTtcbiAgY29uc3QgYklzQXJyYXkgPSBBcnJheS5pc0FycmF5KGIpO1xuICBpZiAoYUlzQXJyYXkgIT09IGJJc0FycmF5KSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGFJc0FycmF5ICYmIGJJc0FycmF5KSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKCFpc0RlZXBFcXVhbChhW2ldLCBiW2ldLCBzZWVuKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGFLZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gIGNvbnN0IGJLZXlzID0gT2JqZWN0LmtleXMoYik7XG4gIGlmIChhS2V5cy5sZW5ndGggIT09IGJLZXlzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGFLZXlzKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGIsIGtleSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWlzRGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBzZWVuKSkgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
579
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1pbnNwZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9kYXRhLWluc3BlY3Rvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFDTCxhQUFhLEVBS2IsVUFBVSxFQUNWLEtBQUssRUFDTCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUdMLCtCQUErQixHQUNoQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLDhDQUE4QztBQUM5Qyx3REFBd0Q7QUFDeEQsOEVBQThFO0FBRTlFLE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDO0FBQ2xELE1BQU0sdUJBQXVCLEdBQUcsaUNBQWlDLENBQUM7QUFDbEUsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQUM7QUFDNUMsTUFBTSxrQkFBa0IsR0FBRyw0QkFBNEIsQ0FBQztBQXlCeEQsU0FBUyxvQkFBb0IsQ0FBQyxJQUFZO0lBQ3hDLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FB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QyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUNuRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRWhELEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2RCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG4vKipcbiAqIFJldXNhYmxlIGRhdGEgaW5zcGVjdG9yIGZvciB0aGUgbzExeSBVSS5cbiAqXG4gKiBSZW5kZXJzIEpTT04gYXMgYSBjb2xsYXBzaWJsZSB0cmVlOiBicmFja2V0IG5vdGF0aW9uIChgeyDigKYgfWAgLyBgWyDigKYgXWApLFxuICogY29sb3JlZCBrZXlzLCB0eXBlZCB2YWx1ZSBjb2xvcnMsIGDilrhgL2Dilr5gIGRpc2Nsb3N1cmUgaWNvbnMsIGFuZCBhIGAuLi5gXG4gKiBjb2xsYXBzZWQgaW5kaWNhdG9yLlxuICpcbiAqIE9uIHRvcCBvZiBwbGFpbiBKU09OIGl0IGhhbmRsZXMgdGhlIHdvcmtmbG93LXNwZWNpZmljIHZhbHVlIHR5cGVzOiBTdHJlYW1SZWYgL1xuICogUnVuUmVmIGJhZGdlcywgZW5jcnlwdGVkIG1hcmtlcnMsIGRlY29kZWQgYnl0ZSBzdHJlYW1zLCBEYXRlcywgYW5kIG5hbWVkXG4gKiBjbGFzcyBpbnN0YW5jZXMuXG4gKi9cblxuaW1wb3J0IHsgTG9jayB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQge1xuICBjcmVhdGVDb250ZXh0LFxuICB0eXBlIEtleWJvYXJkRXZlbnQgYXMgUmVhY3RLZXlib2FyZEV2ZW50LFxuICB0eXBlIE1vdXNlRXZlbnQgYXMgUmVhY3RNb3VzZUV2ZW50LFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdHlwZSBSZWZPYmplY3QsXG4gIHVzZUNvbnRleHQsXG4gIHVzZUlkLFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uL2xpYi9jbic7XG5pbXBvcnQgeyBFTkNSWVBURURfRElTUExBWV9OQU1FIH0gZnJvbSAnLi4vLi4vbGliL2h5ZHJhdGlvbic7XG5pbXBvcnQge1xuICB0eXBlIERlY29kZWRTdHJlYW1DaHVua1NvdXJjZSxcbiAgdHlwZSBGb3JtYXR0ZWRTdHJlYW1DaHVua0Rpc3BsYXksXG4gIGZvcm1hdEFycmF5QnVmZmVyVmlld0ZvckRpc3BsYXksXG59IGZyb20gJy4uLy4uL2xpYi9zdHJlYW0tZGlzcGxheSc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL2J1dHRvbic7XG5pbXBvcnQgeyBDTFMsIEpTT05fVklFV19TVFlMRVMgfSBmcm9tICcuL2RhdGEtaW5zcGVjdG9yLnN0eWxlcyc7XG5pbXBvcnQgeyBTcGlubmVyIH0gZnJvbSAnLi9zcGlubmVyJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW1SZWYgLyBDbGFzc0luc3RhbmNlUmVmIHR5cGUgZGV0ZWN0aW9uXG4vLyAoaW5saW5lIHRvIGF2b2lkIGNpcmN1bGFyIGRlcHMgd2l0aCBoeWRyYXRpb24gbW9kdWxlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFNUUkVBTV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3N0cmVhbV9yZWZfXyc7XG5jb25zdCBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X2NsYXNzX2luc3RhbmNlX3JlZl9fJztcbmNvbnN0IFJVTl9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3J1bl9yZWZfXyc7XG5jb25zdCBCWVRFU19ESVNQTEFZX1RZUEUgPSAnX193b3JrZmxvd19ieXRlc19kaXNwbGF5X18nO1xuXG5pbnRlcmZhY2UgU3RyZWFtUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgU1RSRUFNX1JFRl9UWVBFO1xuICBzdHJlYW1JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUnVuUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgUlVOX1JFRl9UWVBFO1xuICBydW5JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnl0ZXNEaXNwbGF5IHtcbiAgX190eXBlOiB0eXBlb2YgQllURVNfRElTUExBWV9UWVBFO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGRlY29kZWRGcm9tPzogRGVjb2RlZFN0cmVhbUNodW5rU291cmNlO1xufVxuXG5pbnRlcmZhY2UgQ2xhc3NJbnN0YW5jZVJlZiB7XG4gIF9fdHlwZTogdHlwZW9mIENMQVNTX0lOU1RBTkNFX1JFRl9UWVBFO1xuICBjbGFzc05hbWU6IHN0cmluZztcbiAgY2xhc3NJZDogc3RyaW5nO1xuICBkYXRhOiB1bmtub3duO1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUNodW5rVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDaHVua0RhdGEodGV4dDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3RyZWFtUmVmKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU3RyZWFtUmVmIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgLy8gQ2hlY2sgYm90aCBlbnVtZXJhYmxlIGFuZCBub24tZW51bWVyYWJsZSBfX3R5cGUgKG9wYXF1ZSByZWZzIHVzZSBub24tZW51bWVyYWJsZSlcbiAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdfX3R5cGUnKTtcbiAgcmV0dXJuIGRlc2M/LnZhbHVlID09PSBTVFJFQU1fUkVGX1RZUEU7XG59XG5cbmZ1bmN0aW9uIGlzUnVuUmVmKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVuUmVmIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdfX3R5cGUnKTtcbiAgcmV0dXJuIGRlc2M/LnZhbHVlID09PSBSVU5fUkVGX1RZUEU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0J5dGVzRGlzcGxheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEJ5dGVzRGlzcGxheSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCAnX190eXBlJyk7XG4gIHJldHVybiBkZXNjPy52YWx1ZSA9PT0gQllURVNfRElTUExBWV9UWVBFO1xufVxuXG5mdW5jdGlvbiBpc0NsYXNzSW5zdGFuY2VSZWYodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDbGFzc0luc3RhbmNlUmVmIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAnX190eXBlJyBpbiB2YWx1ZSAmJlxuICAgICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuX190eXBlID09PSBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0VuY3J5cHRlZE1hcmtlcih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICh2YWx1ZSBhcyB7IGNvbnN0cnVjdG9yPzogeyBuYW1lPzogc3RyaW5nIH0gfSkuY29uc3RydWN0b3I/Lm5hbWUgPT09XG4gICAgICBFTkNSWVBURURfRElTUExBWV9OQU1FXG4gICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3RyZWFtIGNsaWNrIGNvbnRleHQgKHBhc3NlZCB0aHJvdWdoIGZyb20gdGhlIHBhbmVsKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29udGV4dCBmb3IgcGFzc2luZyBzdHJlYW0gY2xpY2sgaGFuZGxlcnMgZG93biB0byBEYXRhSW5zcGVjdG9yIGluc3RhbmNlcy5cbiAqIEV4cG9ydGVkIHNvIHRoYXQgcGFyZW50IGNvbXBvbmVudHMgKGUuZy4sIEF0dHJpYnV0ZVBhbmVsKSBjYW4gcHJvdmlkZSB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0cmVhbUNsaWNrQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8XG4gICgoc3RyZWFtSWQ6IHN0cmluZykgPT4gdm9pZCkgfCB1bmRlZmluZWRcbj4odW5kZWZpbmVkKTtcblxuLyoqXG4gKiBDb250ZXh0IGZvciBwYXNzaW5nIGEgZGVjcnlwdCBoYW5kbGVyIGRvd24gdG8gRGF0YUluc3BlY3RvciBpbnN0YW5jZXMuXG4gKiBXaGVuIHByb3ZpZGVkLCBlbmNyeXB0ZWQgbWFya2VycyBiZWNvbWUgY2xpY2thYmxlIGJ1dHRvbnMgdGhhdCB0cmlnZ2VyIGRlY3J5cHRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIERlY3J5cHRDbGlja0NvbnRleHRWYWx1ZSA9IHtcbiAgb25EZWNyeXB0OiAoKSA9PiB2b2lkO1xuICBpc0RlY3J5cHRpbmc6IGJvb2xlYW47XG4gIGlzRGVjcnlwdERpc2FibGVkPzogYm9vbGVhbjtcbiAgZGVjcnlwdERpc2FibGVkUmVhc29uPzogc3RyaW5nO1xuICBoYXNFbmNyeXB0ZWREYXRhPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBEZWNyeXB0Q2xpY2tDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxcbiAgRGVjcnlwdENsaWNrQ29udGV4dFZhbHVlIHwgdW5kZWZpbmVkXG4+KHVuZGVmaW5lZCk7XG5cbmV4cG9ydCBjb25zdCBSdW5DbGlja0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFxuICAoKHJ1bklkOiBzdHJpbmcpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4+KHVuZGVmaW5lZCk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya2Zsb3ctc3BlY2lmaWMgdmFsdWUgcmVuZGVyZXJzIChiYWRnZXMsIGVuY3J5cHRlZCBtYXJrZXJzLCBieXRlIHN0cmVhbXMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gRW5jcnlwdGVkSW5saW5lTGFiZWwoKSB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoRGVjcnlwdENsaWNrQ29udGV4dCk7XG4gIGlmIChjdHgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJ1dHRvblxuICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICBjbGFzc05hbWU9XCJhbGlnbi1iYXNlbGluZSBnYXAteC0xXCJcbiAgICAgICAgZGlzYWJsZWQ9e2N0eC5pc0RlY3J5cHRpbmcgfHwgY3R4LmlzRGVjcnlwdERpc2FibGVkfVxuICAgICAgICB0aXRsZT17Y3R4LmlzRGVjcnlwdERpc2FibGVkID8gY3R4LmRlY3J5cHREaXNhYmxlZFJlYXNvbiA6IHVuZGVmaW5lZH1cbiAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGN0eC5vbkRlY3J5cHQoKTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2N0eC5pc0RlY3J5cHRpbmcgPyAoXG4gICAgICAgICAgPFNwaW5uZXIgc2l6ZT17MTB9IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPExvY2sgY2xhc3NOYW1lPVwiaC0zIHctM1wiIC8+XG4gICAgICAgICl9XG4gICAgICAgIDxzcGFuPkRlY3J5cHQ8L3NwYW4+XG4gICAgICA8L0J1dHRvbj5cbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1ncmF5LTYwMCBpdGFsaWNcIj5cbiAgICAgIDxMb2NrIGNsYXNzTmFtZT1cIi1tdC1weCBtci1bM3B4XSBpbmxpbmUgaC0zIHctMyBhbGlnbi1taWRkbGVcIiAvPlxuICAgICAgRW5jcnlwdGVkXG4gICAgPC9zcGFuPlxuICApO1xufVxuXG5mdW5jdGlvbiBTdHJlYW1SZWZJbmxpbmUoeyBzdHJlYW1SZWYgfTogeyBzdHJlYW1SZWY6IFN0cmVhbVJlZiB9KSB7XG4gIGNvbnN0IG9uU3RyZWFtQ2xpY2sgPSB1c2VDb250ZXh0KFN0cmVhbUNsaWNrQ29udGV4dCk7XG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZCBib3JkZXIgYm9yZGVyLWJsdWUtMzAwIGJnLWJsdWUtMTAwIHB4LTEuNSBweS0wLjUgZm9udC1tb25vIHRleHQtWzEwcHhdIHRleHQtYmx1ZS05MDAgdW5kZXJsaW5lIGRlY29yYXRpb24tdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctYmx1ZS0yMDBcIlxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25TdHJlYW1DbGljaz8uKHN0cmVhbVJlZi5zdHJlYW1JZCk7XG4gICAgICB9fVxuICAgICAgdGl0bGU9e2BWaWV3IHN0cmVhbTogJHtzdHJlYW1SZWYuc3RyZWFtSWR9YH1cbiAgICA+XG4gICAgICA8c3Bhbj7wn5OhPC9zcGFuPlxuICAgICAgPHNwYW4+e3N0cmVhbVJlZi5zdHJlYW1JZH08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFJ1blJlZklubGluZSh7IHJ1blJlZiB9OiB7IHJ1blJlZjogUnVuUmVmIH0pIHtcbiAgY29uc3Qgb25SdW5DbGljayA9IHVzZUNvbnRleHQoUnVuQ2xpY2tDb250ZXh0KTtcbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciBnYXAtMSByb3VuZGVkIGJvcmRlciBib3JkZXItcHVycGxlLTMwMCBiZy1wdXJwbGUtMTAwIHB4LTEuNSBweS0wLjUgZm9udC1tb25vIHRleHQtWzEwcHhdIHRleHQtcHVycGxlLTkwMCB1bmRlcmxpbmUgZGVjb3JhdGlvbi10cmFuc3BhcmVudCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1wdXJwbGUtMjAwXCJcbiAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIG9uUnVuQ2xpY2s/LihydW5SZWYucnVuSWQpO1xuICAgICAgfX1cbiAgICAgIHRpdGxlPXtgVmlldyBydW46ICR7cnVuUmVmLnJ1bklkfWB9XG4gICAgPlxuICAgICAgPHNwYW4+e3J1blJlZi5ydW5JZH08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICk7XG59XG5cbmZ1bmN0aW9uIERlY29kZWRCeXRlc0NodW5rKHtcbiAgZGVjb2RlZFRleHQsXG4gIHNvdXJjZSxcbn06IHtcbiAgZGVjb2RlZFRleHQ6IHN0cmluZztcbiAgc291cmNlOiBEZWNvZGVkU3RyZWFtQ2h1bmtTb3VyY2U7XG59KSB7XG4gIGNvbnN0IFtzZWxlY3RlZFZpZXcsIHNldFNlbGVjdGVkVmlld10gPSB1c2VTdGF0ZTwnZGVjb2RlZCcgfCAnYnl0ZXMnPihcbiAgICAnZGVjb2RlZCdcbiAgKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VDaHVua0RhdGEoZGVjb2RlZFRleHQpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wXCI+XG4gICAgICB7c2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCcgPyAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMFwiPlxuICAgICAgICAgIHt0eXBlb2YgcGFyc2VkID09PSAnc3RyaW5nJyA/IChcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHMgdGV4dC1ncmF5LTEwMDBcIj5cbiAgICAgICAgICAgICAge2Rlc2VyaWFsaXplQ2h1bmtUZXh0KHBhcnNlZCl9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxEYXRhSW5zcGVjdG9yIGRhdGE9e3BhcnNlZH0gZXhwYW5kTGV2ZWw9ezF9IC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogKFxuICAgICAgICA8RGVjb2RlZEJ5dGVzSW5zcGVjdG9yIGRlY29kZWRUZXh0PXtkZWNvZGVkVGV4dH0gc291cmNlPXtzb3VyY2V9IC8+XG4gICAgICApfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0yIGZsZXhcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IG92ZXJmbG93LWhpZGRlbiByb3VuZGVkIGJvcmRlciBib3JkZXItZ3JheS00MDBcIlxuICAgICAgICAgIHRpdGxlPXtgJHtzb3VyY2UudHlwZX0gZGVjb2RlZCBhcyAke3NvdXJjZS5lbmNvZGluZy50b1VwcGVyQ2FzZSgpfSB0ZXh0LiBTd2l0Y2ggdG8gQnl0ZXMgdG8gaW5zcGVjdCB0aGUgc3VtbWFyaXplZCByYXcgdmFsdWUuYH1cbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ2gtNSBweC0xLjUgZm9udC1tZWRpdW0gdGV4dC1bMTBweF0gdGV4dC1ncmF5LTkwMCcsXG4gICAgICAgICAgICAgIHNlbGVjdGVkVmlldyA9PT0gJ2RlY29kZWQnID8gJ2JnLWdyYXktMjAwJyA6ICdiZy1ncmF5LTEwMCdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTZWxlY3RlZFZpZXcoJ2RlY29kZWQnKX1cbiAgICAgICAgICAgIGFyaWEtcHJlc3NlZD17c2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCd9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2hvdyBkZWNvZGVkIHRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIERlY29kZWRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdoLTUgYm9yZGVyLWdyYXktNDAwIGJvcmRlci1sIHB4LTEuNSBmb250LW1lZGl1bSB0ZXh0LVsxMHB4XSB0ZXh0LWdyYXktOTAwJyxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3ID09PSAnYnl0ZXMnID8gJ2JnLWdyYXktMjAwJyA6ICdiZy1ncmF5LTEwMCdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTZWxlY3RlZFZpZXcoJ2J5dGVzJyl9XG4gICAgICAgICAgICBhcmlhLXByZXNzZWQ9e3NlbGVjdGVkVmlldyA9PT0gJ2J5dGVzJ31cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTaG93IHJhdyBieXRlcyBzdW1tYXJ5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBCeXRlc1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBEZWNvZGVkQnl0ZXNJbnNwZWN0b3Ioe1xuICBkZWNvZGVkVGV4dCxcbiAgc291cmNlLFxufToge1xuICBkZWNvZGVkVGV4dDogc3RyaW5nO1xuICBzb3VyY2U6IERlY29kZWRTdHJlYW1DaHVua1NvdXJjZTtcbn0pIHtcbiAgY29uc3QgW2V4cGFuZGVkLCBzZXRFeHBhbmRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtbW9ub1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBtYXgtdy1mdWxsIGl0ZW1zLXN0YXJ0IGdhcC0xIHRleHQtbGVmdCB0ZXh0LWdyYXktMTAwMFwiXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEV4cGFuZGVkKCh2YWx1ZSkgPT4gIXZhbHVlKX1cbiAgICAgICAgdGl0bGU9e2Ake3NvdXJjZS50eXBlfSBkZWNvZGVkIGFzICR7c291cmNlLmVuY29kaW5nLnRvVXBwZXJDYXNlKCl9IHRleHRgfVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzZWxlY3Qtbm9uZSB0ZXh0LWdyYXktNzAwXCI+XG4gICAgICAgICAge2V4cGFuZGVkID8gJ+KWvCcgOiAn4pa2J31cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtaW4tdy0wIGJyZWFrLXdvcmRzXCI+e3NvdXJjZS5yYXdTdW1tYXJ5fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAge2V4cGFuZGVkICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIHBsLTVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktNzAwXCI+ZGVjb2RlZDogPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHMgdGV4dC1ncmVlbi05MDBcIj5cbiAgICAgICAgICAgIHtKU09OLnN0cmluZ2lmeShkZWNvZGVkVGV4dCl9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEJ5dGVzRGlzcGxheVZhbHVlKHsgZGlzcGxheSB9OiB7IGRpc3BsYXk6IEJ5dGVzRGlzcGxheSB9KSB7XG4gIGlmIChkaXNwbGF5LmRlY29kZWRGcm9tKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEZWNvZGVkQnl0ZXNDaHVua1xuICAgICAgICBkZWNvZGVkVGV4dD17ZGlzcGxheS50ZXh0fVxuICAgICAgICBzb3VyY2U9e2Rpc3BsYXkuZGVjb2RlZEZyb219XG4gICAgICAvPlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICA8c3BhbiBjbGFzc05hbWU9XCJ3aGl0ZXNwYWNlLXByZS13cmFwIGJyZWFrLXdvcmRzIHRleHQtZ3JheS0xMDAwXCI+XG4gICAgICB7ZGlzcGxheS50ZXh0fVxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUcmVlIHJlbmRlcmVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBFbnRyeSA9IFtmaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkLCB2YWx1ZTogdW5rbm93biwga2V5Pzogc3RyaW5nIHwgbnVtYmVyXTtcblxuaW50ZXJmYWNlIE5vZGVDb250ZXh0IHtcbiAgbGV2ZWw6IG51bWJlcjtcbiAgc2hvdWxkRXhwYW5kOiAobGV2ZWw6IG51bWJlcikgPT4gYm9vbGVhbjtcbiAgb3V0ZXJSZWY6IFJlZk9iamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+O1xufVxuXG4vKiogRmllbGQgbmFtZXMgYXJlIHJlbmRlcmVkIHVucXVvdGVkIChlbXB0eSBzdHJpbmcgc2hvd3MgYXMgYFwiXCJgKS4gKi9cbmZ1bmN0aW9uIGZvcm1hdEZpZWxkKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZmllbGQgPT09ICcnID8gJ1wiXCInIDogZmllbGQ7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJpY0l0ZXJhYmxlKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgb2JqZWN0ICYgSXRlcmFibGU8dW5rbm93bj4ge1xuICBpZiAoXG4gICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHx8XG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHxcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgU2V0XG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHR5cGVvZiAodmFsdWUgYXMgeyBbU3ltYm9sLml0ZXJhdG9yXT86IHVua25vd24gfSlbU3ltYm9sLml0ZXJhdG9yXSA9PT1cbiAgICAnZnVuY3Rpb24nXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRW50cnlJdGVyYWJsZShcbiAgdmFsdWU6IG9iamVjdCAmIEl0ZXJhYmxlPHVua25vd24+XG4pOiB2YWx1ZSBpcyBvYmplY3QgJiBJdGVyYWJsZTx1bmtub3duPiAmIHsgZW50cmllcygpOiBJdGVyYWJsZTx1bmtub3duPiB9IHtcbiAgcmV0dXJuIHR5cGVvZiAodmFsdWUgYXMgeyBlbnRyaWVzPzogdW5rbm93biB9KS5lbnRyaWVzID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RW50cmllcyhcbiAgaXRlcmFibGU6IEl0ZXJhYmxlPHVua25vd24+LFxuICBhc1BhaXJzOiBib29sZWFuXG4pOiBFbnRyeVtdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oaXRlcmFibGUsIChpdGVtLCBpbmRleCkgPT4ge1xuICAgIGlmIChhc1BhaXJzICYmIEFycmF5LmlzQXJyYXkoaXRlbSkgJiYgaXRlbS5sZW5ndGggPj0gMikge1xuICAgICAgcmV0dXJuIFtTdHJpbmcoaXRlbVswXSksIGNvbGxhcHNlUmVmcyhpdGVtWzFdKSwgaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gW3VuZGVmaW5lZCwgY29sbGFwc2VSZWZzKGl0ZW0pLCBpbmRleF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1NlbGZJdGVyYWJsZUl0ZXJhdG9yKHZhbHVlOiBvYmplY3QgJiBJdGVyYWJsZTx1bmtub3duPik6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LmlzKHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0oKSwgdmFsdWUpO1xufVxuXG4vKipcbiAqIERlc2NyaWJlIGFuIG9iamVjdC9hcnJheS9pdGVyYWJsZSBhcyBhbiBleHBhbmRhYmxlIGNvbnRhaW5lci4gUmV0dXJucyBudWxsXG4gKiBmb3IgdmFsdWVzIHRoYXQgc2hvdWxkIHJlbmRlciBhcyBhIHByaW1pdGl2ZS4gYHByZWZpeGAgY2FycmllcyBhIGNsYXNzIG5hbWVcbiAqIHNob3duIGJlZm9yZSB0aGUgb3BlbmluZyBicmFja2V0IChNYXAvU2V0LCBnZW5lcmljIGl0ZXJhYmxlcywgYW5kIG5hbWVkIGNsYXNzXG4gKiBpbnN0YW5jZXMpLlxuICovXG5mdW5jdGlvbiBkZXNjcmliZUNvbnRhaW5lcihcbiAgdmFsdWU6IHVua25vd25cbik6IHsgZW50cmllczogRW50cnlbXTsgb3Blbjogc3RyaW5nOyBjbG9zZTogc3RyaW5nOyBwcmVmaXg/OiBzdHJpbmcgfSB8IG51bGwge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50cmllczogdmFsdWUubWFwKChpdGVtKSA9PiBbdW5kZWZpbmVkLCBpdGVtXSBhcyBFbnRyeSksXG4gICAgICBvcGVuOiAnWycsXG4gICAgICBjbG9zZTogJ10nLFxuICAgIH07XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudHJpZXM6IEFycmF5LmZyb20odmFsdWUuZW50cmllcygpLCAoW2tleSwgdmFsXSkgPT4gW1xuICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgdmFsLFxuICAgICAgXSkgYXMgRW50cnlbXSxcbiAgICAgIG9wZW46ICd7JyxcbiAgICAgIGNsb3NlOiAnfScsXG4gICAgICBwcmVmaXg6ICdNYXAnLFxuICAgIH07XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudHJpZXM6IEFycmF5LmZyb20odmFsdWUudmFsdWVzKCksIChpdGVtKSA9PiBbdW5kZWZpbmVkLCBpdGVtXSBhcyBFbnRyeSksXG4gICAgICBvcGVuOiAnWycsXG4gICAgICBjbG9zZTogJ10nLFxuICAgICAgcHJlZml4OiAnU2V0JyxcbiAgICB9O1xuICB9XG4gIGlmIChpc0dlbmVyaWNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICBjb25zdCBuYW1lID0gKHZhbHVlIGFzIHsgY29uc3RydWN0b3I/OiB7IG5hbWU/OiBzdHJpbmcgfSB9KS5jb25zdHJ1Y3RvclxuICAgICAgPy5uYW1lO1xuICAgIGNvbnN0IHByZWZpeCA9IG5hbWUgJiYgbmFtZSAhPT0gJ09iamVjdCcgPyBuYW1lIDogdW5kZWZpbmVkO1xuICAgIGlmIChpc0VudHJ5SXRlcmFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnRyaWVzOiBjb2xsZWN0RW50cmllcyh2YWx1ZS5lbnRyaWVzKCksIHRydWUpLFxuICAgICAgICBvcGVuOiAneycsXG4gICAgICAgIGNsb3NlOiAnfScsXG4gICAgICAgIHByZWZpeCxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBlbnRyaWVzOiBjb2xsZWN0RW50cmllcyh2YWx1ZSwgZmFsc2UpLFxuICAgICAgb3BlbjogJ1snLFxuICAgICAgY2xvc2U6ICddJyxcbiAgICAgIHByZWZpeCxcbiAgICB9O1xuICB9XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgbmFtZSA9ICh2YWx1ZSBhcyB7IGNvbnN0cnVjdG9yPzogeyBuYW1lPzogc3RyaW5nIH0gfSkuY29uc3RydWN0b3JcbiAgICAgID8ubmFtZTtcbiAgICByZXR1cm4ge1xuICAgICAgZW50cmllczogT2JqZWN0LmVudHJpZXModmFsdWUpIGFzIEVudHJ5W10sXG4gICAgICBvcGVuOiAneycsXG4gICAgICBjbG9zZTogJ30nLFxuICAgICAgcHJlZml4OiBuYW1lICYmIG5hbWUgIT09ICdPYmplY3QnID8gbmFtZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVByaW1pdGl2ZSh2YWx1ZTogdW5rbm93bik6IHsgdGV4dDogc3RyaW5nOyBjbHM6IHN0cmluZyB9IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4geyB0ZXh0OiAnbnVsbCcsIGNsczogQ0xTLm51bGwgfTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB7IHRleHQ6ICd1bmRlZmluZWQnLCBjbHM6IENMUy51bmRlZmluZWQgfTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICByZXR1cm4geyB0ZXh0OiBgXCIke1N0cmluZyh2YWx1ZSl9XCJgLCBjbHM6IENMUy5zdHJpbmcgfTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgcmV0dXJuIHsgdGV4dDogU3RyaW5nKHZhbHVlKSwgY2xzOiBDTFMuYm9vbGVhbiB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7XG4gICAgcmV0dXJuIHsgdGV4dDogU3RyaW5nKHZhbHVlKSwgY2xzOiBDTFMubnVtYmVyIH07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4geyB0ZXh0OiBgJHt2YWx1ZS50b1N0cmluZygpfW5gLCBjbHM6IENMUy5udW1iZXIgfTtcbiAgfVxuICByZXR1cm4geyB0ZXh0OiBTdHJpbmcodmFsdWUpLCBjbHM6IENMUy5wdW5jdHVhdGlvbiB9O1xufVxuXG5mdW5jdGlvbiBMYWJlbCh7IGZpZWxkLCBjbGlja2FibGUgfTogeyBmaWVsZD86IHN0cmluZzsgY2xpY2thYmxlPzogYm9vbGVhbiB9KSB7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChcbiAgICA8c3BhbiBjbGFzc05hbWU9e2NsaWNrYWJsZSA/IENMUy5jbGlja2FibGVMYWJlbCA6IENMUy5sYWJlbH0+XG4gICAgICB7YCR7Zm9ybWF0RmllbGQoZmllbGQpfTpgfVxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gQ29tbWEoeyBpc0xhc3QgfTogeyBpc0xhc3Q6IGJvb2xlYW4gfSkge1xuICBpZiAoaXNMYXN0KSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT17Q0xTLnB1bmN0dWF0aW9ufT4sPC9zcGFuPjtcbn1cblxuLyoqIEEgbm9uLWV4cGFuZGFibGUgcm93OiBgZmllbGQ6IDx2YWx1ZT5gLiAqL1xuZnVuY3Rpb24gTGVhZlJvdyh7XG4gIGZpZWxkLFxuICBpc0xhc3QsXG4gIGNoaWxkcmVuLFxufToge1xuICBmaWVsZD86IHN0cmluZztcbiAgaXNMYXN0OiBib29sZWFuO1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtDTFMuY2hpbGR9IHJvbGU9XCJ0cmVlaXRlbVwiIHRhYkluZGV4PXstMX0+XG4gICAgICA8TGFiZWwgZmllbGQ9e2ZpZWxkfSAvPlxuICAgICAge2NoaWxkcmVufVxuICAgICAgPENvbW1hIGlzTGFzdD17aXNMYXN0fSAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBQcmltaXRpdmVWYWx1ZSh7IGZpZWxkLCB2YWx1ZSwgaXNMYXN0IH06IE5vZGVQcm9wcykge1xuICBjb25zdCB7IHRleHQsIGNscyB9ID0gZGVzY3JpYmVQcmltaXRpdmUodmFsdWUpO1xuICByZXR1cm4gKFxuICAgIDxMZWFmUm93IGZpZWxkPXtmaWVsZH0gaXNMYXN0PXtpc0xhc3R9PlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjbHN9Pnt0ZXh0fTwvc3Bhbj5cbiAgICA8L0xlYWZSb3c+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEVtcHR5Q29udGFpbmVyKHtcbiAgZmllbGQsXG4gIHByZWZpeCxcbiAgb3BlbixcbiAgY2xvc2UsXG4gIGlzTGFzdCxcbn06IHtcbiAgZmllbGQ/OiBzdHJpbmc7XG4gIHByZWZpeD86IHN0cmluZztcbiAgb3Blbjogc3RyaW5nO1xuICBjbG9zZTogc3RyaW5nO1xuICBpc0xhc3Q6IGJvb2xlYW47XG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e0NMUy5jaGlsZH0gcm9sZT1cInRyZWVpdGVtXCIgdGFiSW5kZXg9ey0xfT5cbiAgICAgIDxMYWJlbCBmaWVsZD17ZmllbGR9IC8+XG4gICAgICB7cHJlZml4ID8gPHNwYW4gY2xhc3NOYW1lPXtDTFMuY2xhc3NOYW1lfT57cHJlZml4fTwvc3Bhbj4gOiBudWxsfVxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtDTFMucHVuY3R1YXRpb259PntvcGVufTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT17Q0xTLnB1bmN0dWF0aW9ufT57Y2xvc2V9PC9zcGFuPlxuICAgICAgPENvbW1hIGlzTGFzdD17aXNMYXN0fSAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBmb2N1c0V4cGFuZGVyKFxuICBidXR0b246IEhUTUxFbGVtZW50LFxuICBvdXRlclJlZjogUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50IHwgbnVsbD5cbikge1xuICBjb25zdCBwcmV2aW91cyA9IG91dGVyUmVmLmN1cnJlbnQ/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFxuICAgICdbZGF0YS1qc29uLWV4cGFuZGVyXVt0YWJpbmRleD1cIjBcIl0nXG4gICk7XG4gIGlmIChwcmV2aW91cykgcHJldmlvdXMudGFiSW5kZXggPSAtMTtcbiAgYnV0dG9uLnRhYkluZGV4ID0gMDtcbiAgYnV0dG9uLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVFeHBhbmRlckZvY3VzKFxuICBvdXRlclJlZjogUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50IHwgbnVsbD4sXG4gIGRpcmVjdGlvbjogMSB8IC0xXG4pIHtcbiAgY29uc3Qgcm9vdCA9IG91dGVyUmVmLmN1cnJlbnQ7XG4gIGlmICghcm9vdCkgcmV0dXJuO1xuICBjb25zdCBidXR0b25zID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignW2RhdGEtanNvbi1leHBhbmRlcl0nKTtcbiAgbGV0IGN1cnJlbnQgPSAtMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBidXR0b25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGJ1dHRvbnNbaV0udGFiSW5kZXggPT09IDApIHtcbiAgICAgIGN1cnJlbnQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjdXJyZW50IDwgMCkgcmV0dXJuO1xuICBjb25zdCBuZXh0ID0gKGN1cnJlbnQgKyBkaXJlY3Rpb24gKyBidXR0b25zLmxlbmd0aCkgJSBidXR0b25zLmxlbmd0aDtcbiAgYnV0dG9uc1tjdXJyZW50XS50YWJJbmRleCA9IC0xO1xuICBidXR0b25zW25leHRdLnRhYkluZGV4ID0gMDtcbiAgYnV0dG9uc1tuZXh0XS5mb2N1cygpO1xufVxuXG5mdW5jdGlvbiBFeHBhbmRhYmxlQ29udGFpbmVyKHtcbiAgZmllbGQsXG4gIGVudHJpZXMsXG4gIG9wZW4sXG4gIGNsb3NlLFxuICBwcmVmaXgsXG4gIGN0eCxcbiAgaXNMYXN0LFxufToge1xuICBmaWVsZD86IHN0cmluZztcbiAgZW50cmllczogRW50cnlbXTtcbiAgb3Blbjogc3RyaW5nO1xuICBjbG9zZTogc3RyaW5nO1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIGN0eDogTm9kZUNvbnRleHQ7XG4gIGlzTGFzdDogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgeyBsZXZlbCwgc2hvdWxkRXhwYW5kLCBvdXRlclJlZiB9ID0gY3R4O1xuICBjb25zdCBbZXhwYW5kZWQsIHNldEV4cGFuZGVkXSA9IHVzZVN0YXRlKCgpID0+IHNob3VsZEV4cGFuZChsZXZlbCkpO1xuICBjb25zdCByb3dSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBjb250ZW50c0lkID0gdXNlSWQoKTtcblxuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEVtcHR5Q29udGFpbmVyXG4gICAgICAgIGZpZWxkPXtmaWVsZH1cbiAgICAgICAgcHJlZml4PXtwcmVmaXh9XG4gICAgICAgIG9wZW49e29wZW59XG4gICAgICAgIGNsb3NlPXtjbG9zZX1cbiAgICAgICAgaXNMYXN0PXtpc0xhc3R9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICBjb25zdCB0b2dnbGUgPSAoKSA9PiB7XG4gICAgc2V0RXhwYW5kZWQoKHZhbHVlKSA9PiAhdmFsdWUpO1xuICAgIGlmIChyb3dSZWYuY3VycmVudCkgZm9jdXNFeHBhbmRlcihyb3dSZWYuY3VycmVudCwgb3V0ZXJSZWYpO1xuICB9O1xuXG4gIC8vIFRvZ2dsZSBvbmx5IGZvciBjbGlja3MgdGhhdCBsYW5kIG9uIHRoaXMgcm93IGl0c2VsZjsgY2xpY2tzIGJ1YmJsaW5nIHVwIG91dFxuICAvLyBvZiBhIG5lc3RlZCB0cmVlaXRlbSBhcmUgaGFuZGxlZCBieSB0aGF0IGRlc2NlbmRhbnQncyBvd24gcm93LlxuICBjb25zdCBvbkNsaWNrID0gKGV2ZW50OiBSZWFjdE1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAoXG4gICAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCdbcm9sZT1cInRyZWVpdGVtXCJdJykgIT09XG4gICAgICBldmVudC5jdXJyZW50VGFyZ2V0XG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRvZ2dsZSgpO1xuICB9O1xuXG4gIGNvbnN0IG9uS2V5RG93biA9IChldmVudDogUmVhY3RLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2V0RXhwYW5kZWQodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2V0RXhwYW5kZWQoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBtb3ZlRXhwYW5kZXJGb2N1cyhvdXRlclJlZiwgLTEpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIG1vdmVFeHBhbmRlckZvY3VzKG91dGVyUmVmLCAxKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbGFzdEluZGV4ID0gZW50cmllcy5sZW5ndGggLSAxO1xuXG4gIHJldHVybiAoXG4gICAgLy8gVGhlIHRyZWVpdGVtIHJvdyBpcyB0aGUgZm9jdXNhYmxlLCBrZXlib2FyZC1vcGVyYWJsZSBjb250cm9sIChyb3ZpbmdcbiAgICAvLyB0YWJpbmRleCArIGFycm93IGtleXMpOyB0aGUgZGlzY2xvc3VyZSBtYXJrZXIgYmVsb3cgaXMgcHVyZWx5IGRlY29yYXRpdmUuXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtDTFMuY2hpbGR9XG4gICAgICByb2xlPVwidHJlZWl0ZW1cIlxuICAgICAgYXJpYS1leHBhbmRlZD17ZXhwYW5kZWR9XG4gICAgICBhcmlhLWNvbnRyb2xzPXtleHBhbmRlZCA/IGNvbnRlbnRzSWQgOiB1bmRlZmluZWR9XG4gICAgICBkYXRhLWpzb24tZXhwYW5kZXJcbiAgICAgIHJlZj17cm93UmVmfVxuICAgICAgdGFiSW5kZXg9e2xldmVsID09PSAwID8gMCA6IC0xfVxuICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzTmFtZT17ZXhwYW5kZWQgPyBDTFMuY29sbGFwc2VJY29uIDogQ0xTLmV4cGFuZEljb259XG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAvPlxuICAgICAge2ZpZWxkICE9PSB1bmRlZmluZWQgJiYgKFxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e0NMUy5jbGlja2FibGVMYWJlbH0+e2Ake2Zvcm1hdEZpZWxkKGZpZWxkKX06YH08L3NwYW4+XG4gICAgICApfVxuICAgICAge3ByZWZpeCA/IDxzcGFuIGNsYXNzTmFtZT17Q0xTLmNsYXNzTmFtZX0+e3ByZWZpeH08L3NwYW4+IDogbnVsbH1cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT17Q0xTLnB1bmN0dWF0aW9ufT57b3Blbn08L3NwYW4+XG4gICAgICB7ZXhwYW5kZWQgPyAoXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2ExMXkvdXNlU2VtYW50aWNFbGVtZW50czogQVJJQSB0cmVlIGdyb3VwIGlzIHRoZSBjb3JyZWN0IHJvbGUgaGVyZVxuICAgICAgICA8dWwgaWQ9e2NvbnRlbnRzSWR9IGNsYXNzTmFtZT17Q0xTLmNoaWxkRmllbGRzfSByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgICB7ZW50cmllcy5tYXAoKFtjaGlsZEZpZWxkLCBjaGlsZFZhbHVlLCBlbnRyeUtleV0sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICA8RGF0YVJlbmRlclxuICAgICAgICAgICAgICBrZXk9e2VudHJ5S2V5ID8/IGNoaWxkRmllbGQgPz8gaW5kZXh9XG4gICAgICAgICAgICAgIGZpZWxkPXtjaGlsZEZpZWxkfVxuICAgICAgICAgICAgICB2YWx1ZT17Y2hpbGRWYWx1ZX1cbiAgICAgICAgICAgICAgaXNMYXN0PXtpbmRleCA9PT0gbGFzdEluZGV4fVxuICAgICAgICAgICAgICBjdHg9e3sgLi4uY3R4LCBsZXZlbDogbGV2ZWwgKyAxIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L3VsPlxuICAgICAgKSA6IChcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtDTFMuY29sbGFwc2VkQ29udGVudH0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICl9XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e0NMUy5wdW5jdHVhdGlvbn0+e2Nsb3NlfTwvc3Bhbj5cbiAgICAgIDxDb21tYSBpc0xhc3Q9e2lzTGFzdH0gLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuaW50ZXJmYWNlIE5vZGVQcm9wcyB7XG4gIGZpZWxkPzogc3RyaW5nO1xuICB2YWx1ZTogdW5rbm93bjtcbiAgaXNMYXN0OiBib29sZWFuO1xuICBjdHg6IE5vZGVDb250ZXh0O1xufVxuXG5mdW5jdGlvbiBEYXRhUmVuZGVyKHsgZmllbGQsIHZhbHVlLCBpc0xhc3QsIGN0eCB9OiBOb2RlUHJvcHMpIHtcbiAgaWYgKGlzQnl0ZXNEaXNwbGF5KHZhbHVlKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8TGVhZlJvdyBmaWVsZD17ZmllbGR9IGlzTGFzdD17aXNMYXN0fT5cbiAgICAgICAgPEJ5dGVzRGlzcGxheVZhbHVlIGRpc3BsYXk9e3ZhbHVlfSAvPlxuICAgICAgPC9MZWFmUm93PlxuICAgICk7XG4gIH1cbiAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8TGVhZlJvdyBmaWVsZD17ZmllbGR9IGlzTGFzdD17aXNMYXN0fT5cbiAgICAgICAgPEVuY3J5cHRlZElubGluZUxhYmVsIC8+XG4gICAgICA8L0xlYWZSb3c+XG4gICAgKTtcbiAgfVxuICBpZiAoaXNTdHJlYW1SZWYodmFsdWUpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxMZWFmUm93IGZpZWxkPXtmaWVsZH0gaXNMYXN0PXtpc0xhc3R9PlxuICAgICAgICA8U3RyZWFtUmVmSW5saW5lIHN0cmVhbVJlZj17dmFsdWV9IC8+XG4gICAgICA8L0xlYWZSb3c+XG4gICAgKTtcbiAgfVxuICBpZiAoaXNSdW5SZWYodmFsdWUpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxMZWFmUm93IGZpZWxkPXtmaWVsZH0gaXNMYXN0PXtpc0xhc3R9PlxuICAgICAgICA8UnVuUmVmSW5saW5lIHJ1blJlZj17dmFsdWV9IC8+XG4gICAgICA8L0xlYWZSb3c+XG4gICAgKTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxMZWFmUm93IGZpZWxkPXtmaWVsZH0gaXNMYXN0PXtpc0xhc3R9PlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e0NMUy5kYXRlfT57dmFsdWUudG9JU09TdHJpbmcoKX08L3NwYW4+XG4gICAgICA8L0xlYWZSb3c+XG4gICAgKTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gKFxuICAgICAgPExlYWZSb3cgZmllbGQ9e2ZpZWxkfSBpc0xhc3Q9e2lzTGFzdH0+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Q0xTLnJlZ2V4cH0+e3ZhbHVlLnRvU3RyaW5nKCl9PC9zcGFuPlxuICAgICAgPC9MZWFmUm93PlxuICAgICk7XG4gIH1cbiAgaWYgKGlzQ2xhc3NJbnN0YW5jZVJlZih2YWx1ZSkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPENsYXNzSW5zdGFuY2VOb2RlXG4gICAgICAgIGZpZWxkPXtmaWVsZH1cbiAgICAgICAgaW5zdGFuY2U9e3ZhbHVlfVxuICAgICAgICBpc0xhc3Q9e2lzTGFzdH1cbiAgICAgICAgY3R4PXtjdHh9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICBjb25zdCBjb250YWluZXIgPSBkZXNjcmliZUNvbnRhaW5lcih2YWx1ZSk7XG4gIGlmIChjb250YWluZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEV4cGFuZGFibGVDb250YWluZXJcbiAgICAgICAgZmllbGQ9e2ZpZWxkfVxuICAgICAgICBlbnRyaWVzPXtjb250YWluZXIuZW50cmllc31cbiAgICAgICAgb3Blbj17Y29udGFpbmVyLm9wZW59XG4gICAgICAgIGNsb3NlPXtjb250YWluZXIuY2xvc2V9XG4gICAgICAgIHByZWZpeD17Y29udGFpbmVyLnByZWZpeH1cbiAgICAgICAgY3R4PXtjdHh9XG4gICAgICAgIGlzTGFzdD17aXNMYXN0fVxuICAgICAgLz5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8UHJpbWl0aXZlVmFsdWUgZmllbGQ9e2ZpZWxkfSB2YWx1ZT17dmFsdWV9IGlzTGFzdD17aXNMYXN0fSBjdHg9e2N0eH0gLz5cbiAgKTtcbn1cblxuZnVuY3Rpb24gQ2xhc3NJbnN0YW5jZU5vZGUoe1xuICBmaWVsZCxcbiAgaW5zdGFuY2UsXG4gIGlzTGFzdCxcbiAgY3R4LFxufToge1xuICBmaWVsZD86IHN0cmluZztcbiAgaW5zdGFuY2U6IENsYXNzSW5zdGFuY2VSZWY7XG4gIGlzTGFzdDogYm9vbGVhbjtcbiAgY3R4OiBOb2RlQ29udGV4dDtcbn0pIHtcbiAgY29uc3QgY29udGFpbmVyID0gZGVzY3JpYmVDb250YWluZXIoaW5zdGFuY2UuZGF0YSk7XG4gIGlmIChjb250YWluZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEV4cGFuZGFibGVDb250YWluZXJcbiAgICAgICAgZmllbGQ9e2ZpZWxkfVxuICAgICAgICBlbnRyaWVzPXtjb250YWluZXIuZW50cmllc31cbiAgICAgICAgb3Blbj17Y29udGFpbmVyLm9wZW59XG4gICAgICAgIGNsb3NlPXtjb250YWluZXIuY2xvc2V9XG4gICAgICAgIHByZWZpeD17aW5zdGFuY2UuY2xhc3NOYW1lfVxuICAgICAgICBjdHg9e2N0eH1cbiAgICAgICAgaXNMYXN0PXtpc0xhc3R9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbiAgY29uc3QgeyB0ZXh0LCBjbHMgfSA9IGRlc2NyaWJlUHJpbWl0aXZlKGluc3RhbmNlLmRhdGEpO1xuICByZXR1cm4gKFxuICAgIDxMZWFmUm93IGZpZWxkPXtmaWVsZH0gaXNMYXN0PXtpc0xhc3R9PlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtDTFMuY2xhc3NOYW1lfT57aW5zdGFuY2UuY2xhc3NOYW1lfTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT17Y2xzfT57dGV4dH08L3NwYW4+XG4gICAgPC9MZWFmUm93PlxuICApO1xufVxuXG5mdW5jdGlvbiBKc29uVHJlZSh7XG4gIGRhdGEsXG4gIG5hbWUsXG4gIGV4cGFuZExldmVsLFxufToge1xuICBkYXRhOiB1bmtub3duO1xuICBuYW1lPzogc3RyaW5nO1xuICBleHBhbmRMZXZlbDogbnVtYmVyO1xufSkge1xuICBjb25zdCBvdXRlclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IHNob3VsZEV4cGFuZCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKGxldmVsOiBudW1iZXIpID0+IGxldmVsIDwgZXhwYW5kTGV2ZWwsXG4gICAgW2V4cGFuZExldmVsXVxuICApO1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17b3V0ZXJSZWZ9XG4gICAgICBjbGFzc05hbWU9e0NMUy5jb250YWluZXJ9XG4gICAgICByb2xlPVwidHJlZVwiXG4gICAgICBhcmlhLWxhYmVsPVwiSlNPTiB2aWV3XCJcbiAgICA+XG4gICAgICA8RGF0YVJlbmRlclxuICAgICAgICBmaWVsZD17bmFtZX1cbiAgICAgICAgdmFsdWU9e2RhdGF9XG4gICAgICAgIGlzTGFzdFxuICAgICAgICBjdHg9e3sgbGV2ZWw6IDAsIHNob3VsZEV4cGFuZCwgb3V0ZXJSZWYgfX1cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVmIC8gdHlwZWQtYXJyYXkgY29sbGFwc2luZyAocHJlcHJvY2Vzc2luZyBiZWZvcmUgcmVuZGVyKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ3JlYXRlIGEgbm9uLWV4cGFuZGFibGUgd3JhcHBlciB0aGF0IGNhcnJpZXMgcmVmIGRhdGEgYXMgbm9uLWVudW1lcmFibGVcbiAqIHByb3BlcnRpZXMgc28gdGhlIHJlbmRlcmVyIGNhbiBkZXRlY3QgU3RyZWFtUmVmL1J1blJlZiB3aXRob3V0IGV4cG9zaW5nXG4gKiB0aGVpciBpbnRlcm5hbHMgYXMgb2JqZWN0IGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gbWFrZU9wYXF1ZVJlZihyZWY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdW5rbm93biB7XG4gIGNvbnN0IG9wYXF1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlZikpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCBrZXksIHsgdmFsdWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICB9XG4gIHJldHVybiBvcGFxdWU7XG59XG5cbmZ1bmN0aW9uIG1ha2VCeXRlc0Rpc3BsYXkoZGlzcGxheTogRm9ybWF0dGVkU3RyZWFtQ2h1bmtEaXNwbGF5KTogdW5rbm93biB7XG4gIGNvbnN0IG9wYXF1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcGFxdWUsICdfX3R5cGUnLCB7XG4gICAgdmFsdWU6IEJZVEVTX0RJU1BMQVlfVFlQRSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcGFxdWUsICd0ZXh0Jywge1xuICAgIHZhbHVlOiBkaXNwbGF5LnRleHQsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCAnZGVjb2RlZEZyb20nLCB7XG4gICAgdmFsdWU6IGRpc3BsYXkuZGVjb2RlZEZyb20sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gb3BhcXVlO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHdhbGsgZGF0YSBhbmQgcmVwbGFjZSBSdW5SZWYvU3RyZWFtUmVmL3R5cGVkIGFycmF5IG9iamVjdHMgd2l0aFxuICogbm9uLWV4cGFuZGFibGUgdmVyc2lvbnMgc28gdGhlIHJlbmRlcmVyIGRvZXNuJ3Qgc2hvdyB0aGVpciBpbnRlcm5hbHMuXG4gKiBPbmx5IHJlY3Vyc2VzIGludG8gcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzIHRvIGF2b2lkIHN0cmlwcGluZyBjbGFzc1xuICogaW5zdGFuY2VzIChEYXRlLCBFcnJvciwgVVJMLCBIZWFkZXJzLCBldGMuKSB0aGF0IGhhdmUgdGhlaXIgb3duIHJlbmRlcmluZy5cbiAqIE1hcCBhbmQgU2V0IGNvbnRlbnRzIGFyZSBwcmVwYXJlZCBoZXJlOyBvdGhlciBpdGVyYWJsZSBjb250ZW50cyBhcmUgcHJlcGFyZWRcbiAqIHdoZW4gdGhlIHJlbmRlcmVyIHRyYXZlcnNlcyB0aGVtLlxuICpcbiAqIEV4cG9ydGVkIGZvciB0ZXN0aW5nIHRoZSB0eXBlZC1hcnJheSBkZXRlY3Rpb24gcGF0aCB1c2VkIGJ5IGh5ZHJhdGVkXG4gKiBBSSBhZ2VudCBzdHJlYW0gY2h1bmtzIChlLmcuIGB7IGRlbHRhOiBuZXcgVWludDhBcnJheSguLi4pIH1gKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxhcHNlUmVmcyhkYXRhOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykgcmV0dXJuIGRhdGE7XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSkgJiYgIShkYXRhIGluc3RhbmNlb2YgRGF0YVZpZXcpKSB7XG4gICAgcmV0dXJuIG1ha2VCeXRlc0Rpc3BsYXkoZm9ybWF0QXJyYXlCdWZmZXJWaWV3Rm9yRGlzcGxheShkYXRhKSk7XG4gIH1cbiAgaWYgKGlzUnVuUmVmKGRhdGEpIHx8IGlzU3RyZWFtUmVmKGRhdGEpKVxuICAgIHJldHVybiBtYWtlT3BhcXVlUmVmKGRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gZGF0YS5tYXAoY29sbGFwc2VSZWZzKTtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICByZXR1cm4gbmV3IE1hcChcbiAgICAgIEFycmF5LmZyb20oZGF0YS5lbnRyaWVzKCksIChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgICAgY29sbGFwc2VSZWZzKGtleSksXG4gICAgICAgIGNvbGxhcHNlUmVmcyh2YWx1ZSksXG4gICAgICBdKVxuICAgICk7XG4gIH1cbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICByZXR1cm4gbmV3IFNldChBcnJheS5mcm9tKGRhdGEudmFsdWVzKCksIGNvbGxhcHNlUmVmcykpO1xuICB9XG4gIC8vIE9ubHkgcmVjdXJzZSBpbnRvIHBsYWluIG9iamVjdHM7IGxlYXZlIGNsYXNzIGluc3RhbmNlcyB1bnRvdWNoZWRcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZGF0YSk7XG4gIGlmIChwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90byAhPT0gbnVsbCkgcmV0dXJuIGRhdGE7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICByZXN1bHRba2V5XSA9IGNvbGxhcHNlUmVmcyh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgY29tcG9uZW50XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhSW5zcGVjdG9yUHJvcHMge1xuICAvKiogVGhlIGRhdGEgdG8gaW5zcGVjdCAqL1xuICBkYXRhOiB1bmtub3duO1xuICAvKiogTGV2ZWxzIHN0cmljdGx5IGJlbG93IHRoaXMgbnVtYmVyIGF1dG8tZXhwYW5kIChkZWZhdWx0OiAyKSAqL1xuICBleHBhbmRMZXZlbD86IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSByb290IG5vZGUgKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIENhbGxiYWNrIHdoZW4gYSBzdHJlYW0gcmVmZXJlbmNlIGlzIGNsaWNrZWQgKi9cbiAgb25TdHJlYW1DbGljaz86IChzdHJlYW1JZDogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogQ2FsbGJhY2sgd2hlbiBhIHJ1biByZWZlcmVuY2UgaXMgY2xpY2tlZCAqL1xuICBvblJ1bkNsaWNrPzogKHJ1bklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB3aGVuIGFuIGVuY3J5cHRlZCBtYXJrZXIgaXMgY2xpY2tlZCAodHJpZ2dlcnMgZGVjcnlwdGlvbikgKi9cbiAgb25EZWNyeXB0PzogKCkgPT4gdm9pZDtcbiAgLyoqIFdoZXRoZXIgZGVjcnlwdGlvbiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKi9cbiAgaXNEZWNyeXB0aW5nPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgZGVjcnlwdGlvbiBpcyB1bmF2YWlsYWJsZSAqL1xuICBpc0RlY3J5cHREaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBFeHBsYWlucyB3aHkgZGVjcnlwdGlvbiBpcyB1bmF2YWlsYWJsZSAqL1xuICBkZWNyeXB0RGlzYWJsZWRSZWFzb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEYXRhSW5zcGVjdG9yKHtcbiAgZGF0YSxcbiAgZXhwYW5kTGV2ZWwgPSAyLFxuICBuYW1lLFxuICBvblN0cmVhbUNsaWNrLFxuICBvblJ1bkNsaWNrLFxuICBvbkRlY3J5cHQsXG4gIGlzRGVjcnlwdGluZyA9IGZhbHNlLFxuICBpc0RlY3J5cHREaXNhYmxlZCA9IGZhbHNlLFxuICBkZWNyeXB0RGlzYWJsZWRSZWFzb24sXG59OiBEYXRhSW5zcGVjdG9yUHJvcHMpIHtcbiAgY29uc3QgY29sbGFwc2VkRGF0YSA9IHVzZU1lbW8oKCkgPT4gY29sbGFwc2VSZWZzKGRhdGEpLCBbZGF0YV0pO1xuICBjb25zdCBzdGFibGVEYXRhID0gdXNlU3RhYmxlSW5zcGVjdG9yRGF0YShjb2xsYXBzZWREYXRhKTtcblxuICBsZXQgY29udGVudDogUmVhY3ROb2RlID0gKFxuICAgIDw+XG4gICAgICB7LyogUmVhY3QgMTkgaG9pc3RzICYgZGVkdXBlcyB0aGlzIDxzdHlsZT4gYnkgaHJlZiwgc28gaXQgaXMgZW1pdHRlZCBvbmNlXG4gICAgICAgICAgcmVnYXJkbGVzcyBvZiBob3cgbWFueSBpbnNwZWN0b3JzIGFyZSBtb3VudGVkLiAqL31cbiAgICAgIDxzdHlsZSBocmVmPVwid2YtanNvbi12aWV3XCIgcHJlY2VkZW5jZT1cImRlZmF1bHRcIj5cbiAgICAgICAge0pTT05fVklFV19TVFlMRVN9XG4gICAgICA8L3N0eWxlPlxuICAgICAgPEpzb25UcmVlIGRhdGE9e3N0YWJsZURhdGF9IG5hbWU9e25hbWV9IGV4cGFuZExldmVsPXtleHBhbmRMZXZlbH0gLz5cbiAgICA8Lz5cbiAgKTtcblxuICBpZiAob25TdHJlYW1DbGljaykge1xuICAgIGNvbnRlbnQgPSAoXG4gICAgICA8U3RyZWFtQ2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtvblN0cmVhbUNsaWNrfT5cbiAgICAgICAge2NvbnRlbnR9XG4gICAgICA8L1N0cmVhbUNsaWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgICApO1xuICB9XG4gIGlmIChvblJ1bkNsaWNrKSB7XG4gICAgY29udGVudCA9IChcbiAgICAgIDxSdW5DbGlja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e29uUnVuQ2xpY2t9PlxuICAgICAgICB7Y29udGVudH1cbiAgICAgIDwvUnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgICk7XG4gIH1cbiAgaWYgKG9uRGVjcnlwdCkge1xuICAgIGNvbnRlbnQgPSAoXG4gICAgICA8RGVjcnlwdENsaWNrQ29udGV4dC5Qcm92aWRlclxuICAgICAgICB2YWx1ZT17e1xuICAgICAgICAgIG9uRGVjcnlwdCxcbiAgICAgICAgICBpc0RlY3J5cHRpbmcsXG4gICAgICAgICAgaXNEZWNyeXB0RGlzYWJsZWQsXG4gICAgICAgICAgZGVjcnlwdERpc2FibGVkUmVhc29uLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7Y29udGVudH1cbiAgICAgIDwvRGVjcnlwdENsaWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVuZGVyIHN0YWJpbGl6YXRpb24gKGF2b2lkIHJlLXJlbmRlcnMgd2hlbiBkYXRhIGlzIGRlZXBseSBlcXVhbClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiB1c2VTdGFibGVJbnNwZWN0b3JEYXRhPFQ+KG5leHQ6IFQpOiBUIHtcbiAgY29uc3QgcHJldmlvdXNSZWYgPSB1c2VSZWY8VD4obmV4dCk7XG4gIGlmICghaXNEZWVwRXF1YWwocHJldmlvdXNSZWYuY3VycmVudCwgbmV4dCkpIHtcbiAgICBwcmV2aW91c1JlZi5jdXJyZW50ID0gbmV4dDtcbiAgfVxuICByZXR1cm4gcHJldmlvdXNSZWYuY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNTYW1lQnl0ZXNEaXNwbGF5KGE6IEJ5dGVzRGlzcGxheSwgYjogQnl0ZXNEaXNwbGF5KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgYS50ZXh0ID09PSBiLnRleHQgJiZcbiAgICBhLmRlY29kZWRGcm9tPy50eXBlID09PSBiLmRlY29kZWRGcm9tPy50eXBlICYmXG4gICAgYS5kZWNvZGVkRnJvbT8uZW5jb2RpbmcgPT09IGIuZGVjb2RlZEZyb20/LmVuY29kaW5nICYmXG4gICAgYS5kZWNvZGVkRnJvbT8ucmF3U3VtbWFyeSA9PT0gYi5kZWNvZGVkRnJvbT8ucmF3U3VtbWFyeVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXZlU2FtZUl0ZXJhYmxlVmFsdWVzKFxuICBhOiBJdGVyYWJsZTx1bmtub3duPixcbiAgYjogSXRlcmFibGU8dW5rbm93bj4sXG4gIHNlZW46IFdlYWtNYXA8b2JqZWN0LCBvYmplY3Q+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgYUl0ZXJhdG9yID0gYVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIGNvbnN0IGJJdGVyYXRvciA9IGJbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGFSZXN1bHQgPSBhSXRlcmF0b3IubmV4dCgpO1xuICAgIGNvbnN0IGJSZXN1bHQgPSBiSXRlcmF0b3IubmV4dCgpO1xuICAgIGlmIChhUmVzdWx0LmRvbmUgfHwgYlJlc3VsdC5kb25lKSB7XG4gICAgICByZXR1cm4gYVJlc3VsdC5kb25lID09PSBiUmVzdWx0LmRvbmU7XG4gICAgfVxuICAgIGlmICghaXNEZWVwRXF1YWwoYVJlc3VsdC52YWx1ZSwgYlJlc3VsdC52YWx1ZSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEZWVwRXF1YWwoXG4gIGE6IHVua25vd24sXG4gIGI6IHVua25vd24sXG4gIHNlZW4gPSBuZXcgV2Vha01hcCgpXG4pOiBib29sZWFuIHtcbiAgaWYgKE9iamVjdC5pcyhhLCBiKSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKGlzQnl0ZXNEaXNwbGF5KGEpIHx8IGlzQnl0ZXNEaXNwbGF5KGIpKSB7XG4gICAgcmV0dXJuIGlzQnl0ZXNEaXNwbGF5KGEpICYmIGlzQnl0ZXNEaXNwbGF5KGIpICYmIGlzU2FtZUJ5dGVzRGlzcGxheShhLCBiKTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCk7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiBiIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICB9XG5cbiAgaWYgKGlzR2VuZXJpY0l0ZXJhYmxlKGEpIHx8IGlzR2VuZXJpY0l0ZXJhYmxlKGIpKSB7XG4gICAgaWYgKCFpc0dlbmVyaWNJdGVyYWJsZShhKSB8fCAhaXNHZW5lcmljSXRlcmFibGUoYikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpICE9PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaXNTZWxmSXRlcmFibGVJdGVyYXRvcihhKSB8fCBpc1NlbGZJdGVyYWJsZUl0ZXJhdG9yKGIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHNlZW4uZ2V0KGEpID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgICBzZWVuLnNldChhLCBiKTtcbiAgICBjb25zdCBhSGFzRW50cmllcyA9IGlzRW50cnlJdGVyYWJsZShhKTtcbiAgICBjb25zdCBiSGFzRW50cmllcyA9IGlzRW50cnlJdGVyYWJsZShiKTtcbiAgICBpZiAoYUhhc0VudHJpZXMgIT09IGJIYXNFbnRyaWVzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGFIYXNFbnRyaWVzICYmIGJIYXNFbnRyaWVzKSB7XG4gICAgICByZXR1cm4gaGF2ZVNhbWVJdGVyYWJsZVZhbHVlcyhhLmVudHJpZXMoKSwgYi5lbnRyaWVzKCksIHNlZW4pO1xuICAgIH1cbiAgICByZXR1cm4gaGF2ZVNhbWVJdGVyYWJsZVZhbHVlcyhhLCBiLCBzZWVuKTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwICYmIGIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhLmVudHJpZXMoKSkge1xuICAgICAgaWYgKCFiLmhhcyhrZXkpIHx8ICFpc0RlZXBFcXVhbCh2YWx1ZSwgYi5nZXQoa2V5KSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIFNldCAmJiBiIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIWIuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaXNPYmplY3RMaWtlKGEpIHx8ICFpc09iamVjdExpa2UoYikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc2Vlbi5nZXQoYSkgPT09IGIpIHJldHVybiB0cnVlO1xuICBzZWVuLnNldChhLCBiKTtcblxuICBjb25zdCBhSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYSk7XG4gIGNvbnN0IGJJc0FycmF5ID0gQXJyYXkuaXNBcnJheShiKTtcbiAgaWYgKGFJc0FycmF5ICE9PSBiSXNBcnJheSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChhSXNBcnJheSAmJiBiSXNBcnJheSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICghaXNEZWVwRXF1YWwoYVtpXSwgYltpXSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBhS2V5cykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFpc0RlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIl19
@@ -26,6 +26,7 @@ export declare const waitEventsToWaitEntity: (events: Event[]) => {
26
26
  * Converts a workflow Wait to an OpenTelemetry Span
27
27
  */
28
28
  export declare function waitToSpan(events: Event[], maxEndTime: Date, fallbackEndTime?: Date): Span | null;
29
+ export type GetStepAttributes = (events: Event[]) => Record<string, unknown> | undefined;
29
30
  export declare const stepEventsToStepEntity: (events: Event[]) => {
30
31
  stepId: string;
31
32
  runId: string;
@@ -41,7 +42,7 @@ export declare const stepEventsToStepEntity: (events: Event[]) => {
41
42
  /**
42
43
  * Converts step events to an OpenTelemetry Span
43
44
  */
44
- export declare function stepToSpan(stepEvents: Event[], maxEndTime: Date): Span | null;
45
+ export declare function stepToSpan(stepEvents: Event[], maxEndTime: Date, getStepAttributes?: GetStepAttributes): Span | null;
45
46
  export declare const hookEventsToHookEntity: (events: Event[]) => {
46
47
  hookId: string;
47
48
  runId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"trace-span-construction.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-traces/trace-span-construction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,KAAK,KAAK,EAEV,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAI7D,eAAO,MAAM,gBAAgB;;;CAG5B,CAAC;AAkBF,eAAO,MAAM,iBAAiB,GAC5B,OAAO,KAAK,GAAG,SAAS,KACvB,IAAI,GAAG,SAMT,CAAC;AAEF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,KAAK,EAAE,EACf,WAAW,UAAO,EAClB,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,SAAS,EAAE,CAoBb;AAED,eAAO,MAAM,sBAAsB,GACjC,QAAQ,KAAK,EAAE,KACd;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB,GAAG,IAiBH,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,KAAK,EAAE,EACf,UAAU,EAAE,IAAI,EAChB,eAAe,OAAa,GAC3B,IAAI,GAAG,IAAI,CAyCb;AAED,eAAO,MAAM,sBAAsB,GACjC,QAAQ,KAAK,EAAE,KACd;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,IA+DH,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAoE7E;AAED,eAAO,MAAM,sBAAsB,GACjC,QAAQ,KAAK,EAAE,KACd;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB,GAAG,IAuBH,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CA6B7E;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,KAAK,EAAE,EAClB,OAAO,CAAC,EAAE,IAAI,GACb,IAAI,CAoEN"}
1
+ {"version":3,"file":"trace-span-construction.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-traces/trace-span-construction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,KAAK,KAAK,EAEV,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAI7D,eAAO,MAAM,gBAAgB;;;CAG5B,CAAC;AAkBF,eAAO,MAAM,iBAAiB,GAC5B,OAAO,KAAK,GAAG,SAAS,KACvB,IAAI,GAAG,SAMT,CAAC;AAEF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,KAAK,EAAE,EACf,WAAW,UAAO,EAClB,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,SAAS,EAAE,CAoBb;AAED,eAAO,MAAM,sBAAsB,GACjC,QAAQ,KAAK,EAAE,KACd;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB,GAAG,IAiBH,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,KAAK,EAAE,EACf,UAAU,EAAE,IAAI,EAChB,eAAe,OAAa,GAC3B,IAAI,GAAG,IAAI,CAyCb;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC9B,MAAM,EAAE,KAAK,EAAE,KACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;AAEzC,eAAO,MAAM,sBAAsB,GACjC,QAAQ,KAAK,EAAE,KACd;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,IA+DH,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CACxB,UAAU,EAAE,KAAK,EAAE,EACnB,UAAU,EAAE,IAAI,EAChB,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,IAAI,GAAG,IAAI,CAwEb;AAED,eAAO,MAAM,sBAAsB,GACjC,QAAQ,KAAK,EAAE,KACd;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB,GAAG,IAuBH,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CA6B7E;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,KAAK,EAAE,EAClB,OAAO,CAAC,EAAE,IAAI,GACb,IAAI,CAoEN"}