footprintjs 9.23.2 → 9.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CLAUDE.md +4 -4
  2. package/dist/advanced.js +6 -3
  3. package/dist/esm/advanced.d.ts +1 -1
  4. package/dist/esm/advanced.js +2 -2
  5. package/dist/esm/index.d.ts +1 -1
  6. package/dist/esm/index.js +1 -1
  7. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -0
  8. package/dist/esm/lib/builder/FlowChartBuilder.js +17 -1
  9. package/dist/esm/lib/builder/index.d.ts +1 -1
  10. package/dist/esm/lib/builder/index.js +1 -1
  11. package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +32 -0
  12. package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
  13. package/dist/esm/lib/builder/structure/StructureRecorderDispatcher.d.ts +2 -1
  14. package/dist/esm/lib/builder/structure/StructureRecorderDispatcher.js +13 -1
  15. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.d.ts +8 -0
  16. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.js +11 -2
  17. package/dist/esm/lib/engine/handlers/SubflowInputMapper.d.ts +10 -1
  18. package/dist/esm/lib/engine/handlers/SubflowInputMapper.js +36 -6
  19. package/dist/esm/lib/reactive/arrayTraps.js +14 -12
  20. package/dist/esm/lib/reactive/createTypedScope.js +20 -12
  21. package/dist/esm/lib/reactive/handles.d.ts +46 -0
  22. package/dist/esm/lib/reactive/handles.js +105 -0
  23. package/dist/esm/lib/reactive/index.d.ts +1 -0
  24. package/dist/esm/lib/reactive/index.js +2 -1
  25. package/dist/esm/lib/reactive/structuralWrite.d.ts +0 -15
  26. package/dist/esm/lib/reactive/structuralWrite.js +10 -28
  27. package/dist/esm/lib/reactive/writeTraps.d.ts +4 -3
  28. package/dist/esm/lib/reactive/writeTraps.js +8 -6
  29. package/dist/index.js +1 -1
  30. package/dist/lib/builder/FlowChartBuilder.js +17 -1
  31. package/dist/lib/builder/index.js +1 -1
  32. package/dist/lib/builder/structure/StructureRecorder.js +1 -1
  33. package/dist/lib/builder/structure/StructureRecorderDispatcher.js +13 -1
  34. package/dist/lib/engine/handlers/ParallelForEachHandler.js +11 -2
  35. package/dist/lib/engine/handlers/SubflowInputMapper.js +36 -6
  36. package/dist/lib/reactive/arrayTraps.js +14 -12
  37. package/dist/lib/reactive/createTypedScope.js +20 -12
  38. package/dist/lib/reactive/handles.js +112 -0
  39. package/dist/lib/reactive/index.js +6 -2
  40. package/dist/lib/reactive/structuralWrite.js +11 -30
  41. package/dist/lib/reactive/writeTraps.js +7 -5
  42. package/dist/types/advanced.d.ts +1 -1
  43. package/dist/types/index.d.ts +1 -1
  44. package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -0
  45. package/dist/types/lib/builder/index.d.ts +1 -1
  46. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +32 -0
  47. package/dist/types/lib/builder/structure/StructureRecorderDispatcher.d.ts +2 -1
  48. package/dist/types/lib/engine/handlers/ParallelForEachHandler.d.ts +8 -0
  49. package/dist/types/lib/engine/handlers/SubflowInputMapper.d.ts +10 -1
  50. package/dist/types/lib/reactive/handles.d.ts +46 -0
  51. package/dist/types/lib/reactive/index.d.ts +1 -0
  52. package/dist/types/lib/reactive/structuralWrite.d.ts +0 -15
  53. package/dist/types/lib/reactive/writeTraps.d.ts +4 -3
  54. package/package.json +1 -1
@@ -62,8 +62,8 @@
62
62
  Object.defineProperty(exports, "__esModule", { value: true });
63
63
  exports.createArrayProxy = exports.arrayProxyAt = void 0;
64
64
  const allowlist_js_1 = require("./allowlist.js");
65
+ const handles_js_1 = require("./handles.js");
65
66
  const liveView_js_1 = require("./liveView.js");
66
- const structuralWrite_js_1 = require("./structuralWrite.js");
67
67
  const writeTraps_js_1 = require("./writeTraps.js");
68
68
  /** Methods that mutate the array in-place. We intercept and copy-on-write. */
69
69
  const MUTATING_METHODS = new Set([
@@ -121,22 +121,23 @@ function fillHoles(arr, upTo) {
121
121
  for (let i = arr.length; i < upTo; i++)
122
122
  arr[i] = null;
123
123
  }
124
- /** WHY: a mutating method runs on a COPY, with its arguments unwrapped (they
125
- * are the assigned values; a number or a comparator passes through), and the
126
- * copy is committed whole. The array in state is never touched. */
124
+ /** WHY: a mutating method runs on a COPY, with its arguments taken as values
125
+ * (a handle becomes what it stands for; a number or a comparator passes
126
+ * through), and the copy is committed whole. The array in state is never
127
+ * touched. */
127
128
  function mutatingMethod(read, write, name) {
128
129
  return (...args) => {
129
130
  const clone = [...read()];
130
- const result = clone[name](...args.map(structuralWrite_js_1.unwrapProxy));
131
+ const result = clone[name](...args.map(handles_js_1.unwrapHandles));
131
132
  write(clone);
132
133
  return result;
133
134
  };
134
135
  }
135
- /** `arr[i] = v`: copy, `null` the slots a write past the end skips, place the unwrapped value, commit. */
136
+ /** `arr[i] = v`: copy, `null` the slots a write past the end skips, place the value as assigned, commit. */
136
137
  function setIndex(read, write, index, value) {
137
138
  const clone = [...read()];
138
139
  fillHoles(clone, index);
139
- clone[index] = (0, structuralWrite_js_1.unwrapProxy)(value);
140
+ clone[index] = (0, handles_js_1.unwrapHandles)(value);
140
141
  write(clone);
141
142
  }
142
143
  /** `arr.length = n`: copy, `null` the slots growth adds, truncate or extend, commit. */
@@ -206,12 +207,12 @@ function wrapElementMember(value, sink, path, visited) {
206
207
  function createElementProxy(raw, sink, segments, visited) {
207
208
  const members = new liveView_js_1.MemberCache();
208
209
  const live = () => (0, liveView_js_1.liveObject)(raw, sink.readAt(segments));
209
- return new Proxy(raw, {
210
+ return (0, handles_js_1.rememberHandle)(new Proxy(raw, {
210
211
  get: (0, liveView_js_1.liveGetTrap)(live, segments, (value, path) => wrapElementMember(value, sink, path, visited), members),
211
212
  set: (0, writeTraps_js_1.sinkSetTrap)(sink, segments),
212
213
  deleteProperty: (0, writeTraps_js_1.sinkDeleteTrap)(sink, segments),
213
214
  ...(0, liveView_js_1.liveInspectionTraps)(live),
214
- });
215
+ }), live);
215
216
  }
216
217
  /**
217
218
  * Creates a Proxy over an array that intercepts mutating operations.
@@ -231,7 +232,8 @@ function createArrayProxy(getCurrent, commit) {
231
232
  const read = getCurrent;
232
233
  const write = commit;
233
234
  const elements = new Map();
234
- return new Proxy(target, {
235
+ // The array handle's value is the current array itself (handles.ts).
236
+ return (0, handles_js_1.rememberHandle)(new Proxy(target, {
235
237
  get(_target, prop) {
236
238
  if (typeof prop === 'string' && MUTATING_METHODS.has(prop))
237
239
  return mutatingMethod(read, write, prop);
@@ -260,7 +262,7 @@ function createArrayProxy(getCurrent, commit) {
260
262
  has: (_target, prop) => Reflect.has(read(), prop),
261
263
  ownKeys: () => Reflect.ownKeys(read()),
262
264
  getOwnPropertyDescriptor: (_target, prop) => Object.getOwnPropertyDescriptor(read(), prop),
263
- });
265
+ }), read);
264
266
  }
265
267
  exports.createArrayProxy = createArrayProxy;
266
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlUcmFwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvYXJyYXlUcmFwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRHOzs7QUFFSCxpREFBcUQ7QUFDckQsK0NBQTBGO0FBQzFGLDZEQUFtRDtBQUNuRCxtREFBMkY7QUFFM0YsOEVBQThFO0FBQzlFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0IsTUFBTTtJQUNOLEtBQUs7SUFDTCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sU0FBUztJQUNULE1BQU07SUFDTixZQUFZO0NBQ2IsQ0FBQyxDQUFDO0FBS0gsZ0ZBQWdGO0FBRWhGO3NFQUNzRTtBQUN0RSxTQUFTLE9BQU8sQ0FBQyxPQUFrQixFQUFFLElBQXFCO0lBQ3hELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDN0YsQ0FBQztBQUVELHVHQUF1RztBQUN2RyxTQUFTLFVBQVUsQ0FBQyxJQUFxQjtJQUN2QyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtB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O2lCQUN4RCxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RixPQUFPLElBQUksQ0FBQyxDQUFDLGdGQUFnRjtRQUMvRixDQUFDO1FBQ0QsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJO1lBQzFCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDO1FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLHdCQUF3QixFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQztLQUMzRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBOUJELDRDQThCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvYXJyYXlUcmFwcyAtLSBBcnJheSBtdXRhdGlvbiBpbnRlcmNlcHRpb24gdmlhIFByb3h5LlxuICpcbiAqIFdoZW4gc2NvcGUuaXRlbXMgaXMgYW4gYXJyYXksIHdlIHJldHVybiBhIFByb3h5IHRoYXQgaW50ZXJjZXB0cyBtdXRhdGluZ1xuICogbWV0aG9kcyAocHVzaCwgcG9wLCBzcGxpY2UsIGV0Yy4pIEFORCBpbmRleGVkIGFjY2Vzcy4gRWFjaCBtdXRhdGlvbjpcbiAqIDEuIENsb25lcyB0aGUgY3VycmVudCBhcnJheVxuICogMi4gQXBwbGllcyB0aGUgbXV0YXRpb24gdG8gdGhlIGNsb25lXG4gKiAzLiBDb21taXRzIHRoZSBuZXcgYXJyYXkgdmlhIHRoZSBjb21taXQgY2FsbGJhY2tcbiAqXG4gKiBOb24tbXV0YXRpbmcgbWV0aG9kcyAobWFwLCBmaWx0ZXIsIGZvckVhY2gsIGV0Yy4pIHBhc3MgdGhyb3VnaCB0byB0aGVcbiAqIGN1cnJlbnQgYXJyYXkgc25hcHNob3Qgd2l0aG91dCBpbnRlcmNlcHRpb24uXG4gKlxuICogVGhlIG9yaWdpbmFsIGFycmF5IGluIHN0YXRlIGlzIE5FVkVSIG11dGF0ZWQgZGlyZWN0bHkgLS0gYWxsIHdyaXRlcyBnb1xuICogdGhyb3VnaCB0aGUgY29tbWl0IGNhbGxiYWNrIHdoaWNoIGNhbGxzIHNldFZhbHVlL3VwZGF0ZVZhbHVlLlxuICpcbiAqIOKUgOKUgCBPbmx5IHRoZSBBU1NJR05FRCB2YWx1ZSBpcyB1bndyYXBwZWQgKDkuMjMuMCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBMYW5kbWluZSAxIHNheXMgdGhlIHNldCB0cmFwIEpTT04tcm91bmQtdHJpcHMgdGhlIHZhbHVlIHRoZSBjYWxsZXIgaGFuZGVkXG4gKiBpbi4gRm9yIGFuIGFycmF5IHRoYXQgaXMgdGhlIGluZGV4LWFzc2lnbmVkIGVsZW1lbnQsIGEgbXV0YXRpbmcgbWV0aG9kJ3NcbiAqIGFyZ3VtZW50cyAoYHB1c2goeClgLCBgc3BsaWNlKGksIG4sIC4uLml0ZW1zKWAsIGBmaWxsKHgpYCksIG9yIHRoZSBsZWFmIGFuXG4gKiBlbGVtZW50IHByb3h5IHdyaXRlcyDigJQgYW5kIGl0IGlzIHVud3JhcHBlZCBIRVJFLCBhdCB0aGUgdHJhcCB0aGF0IHJlY2VpdmVzXG4gKiBpdC4gVGhlIHJlYnVpbHQgYXJyYXkgaXMgaGFuZGVkIHRvIGBjb21taXRgIGFzIGl0IGlzOiBldmVyeSBzaWJsaW5nIHRoZVxuICogY2FsbGVyIGRpZCBub3QgdG91Y2ggcGFzc2VzIHRocm91Z2ggYnkgcmVmZXJlbmNlLCBgRGF0ZWBzIGFuZCBgTWFwYHNcbiAqIGludGFjdC4gVW50aWwgOS4yMy4wIHRoZSBjb21taXQgY2FsbGJhY2tzIHJvdW5kLXRyaXBwZWQgdGhlIFdIT0xFIHJlYnVpbHRcbiAqIGFycmF5LCB3aGljaCBzdHJpbmdpZmllZCB1bnRvdWNoZWQgc2libGluZ3MgYW5kIHdhcyBPKE4pIHBlciBlbGVtZW50IHdyaXRlLlxuICogVGhlIG9uZSB0aGluZyB0aGUgcm91bmQtdHJpcCB1c2VkIHRvIGRvIGZvciB0aGUgYXJyYXkncyBvd24gc2hhcGUg4oCUIGFuXG4gKiBlbXB0aWVkIG9yIHNraXBwZWQgc2xvdCBiZWNhbWUgYG51bGxgLCBKU09OJ3Mgb25seSBzcGVsbGluZyBmb3IgYSBob2xlIOKAlFxuICogaXMgbm93IGRvbmUgZXhwbGljaXRseSBieSB0aGUgdHJhcHMgdGhhdCBjYW4gY3JlYXRlIG9uZSAoYGRlbGV0ZSBhcnJbaV1gLFxuICogYGFycltpXSA9IHZgIHBhc3QgdGhlIGVuZCwgYGFyci5sZW5ndGggPSBuYCBncm93dGgpLlxuICpcbiAqIOKUgOKUgCBJbmRleGVkIGFjY2VzcyBpcyBwYXJ0IG9mIHRoZSBjaGFpbiAoOS4yMi4wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqIGBhcnJbaV1gIHVzZWQgdG8gaGFuZCBiYWNrIHRoZSBSQVcgZWxlbWVudCwgd2hpY2ggYnJva2UgdGhlIHByb3h5IGNoYWluIGF0XG4gKiBleGFjdGx5IHRoZSBwb2ludCB1c2VycyB3cml0ZSB0aHJvdWdoIGl0OiBgb3JkZXIubGluZXNbMF0ucXR5ID0gNGAgd2FzIGFuXG4gKiBpbi1wbGFjZSBtdXRhdGlvbiBvZiBhIGJvcnJvd2VkIHJlYWQg4oCUIG5vIHRyYXAsIG5vIHRyYWNlIHJvdywgbm8gY29tbWl0LlxuICogQmVmb3JlIHRoZSBzdGFnZSdzIGZpcnN0IHN0YWdlZCB3cml0ZSB0aGF0IGJvcnJvd2VkIHZhbHVlIElTIGNvbW1pdHRlZFxuICogc2hhcmVkIG1lbW9yeSwgc28gdGhlIG11dGF0aW9uIG1vdmVkIHN0YXRlIHdoaWxlIHRoZSBsb2cgc3RheWVkIGVtcHR5OyBhZnRlclxuICogaXQsIHRoZSBtdXRhdGlvbiBsYW5kZWQgaW4gdGhlIHByaXZhdGUgYnVmZmVyIGNsb25lIGFuZCB3YXMgZHJvcHBlZC4gU2FtZVxuICogZXhwcmVzc2lvbiwgdHdvIHNpbGVudCBvdXRjb21lcy5cbiAqXG4gKiBOb3cgYW4gaW5kZXhlZCByZWFkIG9mIGEgd3JhcHBhYmxlIGVsZW1lbnQgcmV0dXJucyBhbiBFTEVNRU5UIFBST1hZIHRoYXRcbiAqIGFjY3VtdWxhdGVzIHRoZSBwYXRoIGluc2lkZSB0aGUgZWxlbWVudCBhbmQsIG9uIHdyaXRlLCByZWJ1aWxkcyB0aGUgYXJyYXlcbiAqIGltbXV0YWJseSAoYHN0cnVjdHVyYWxXcml0ZS5zZXRJblBhdGhgLCBiZWhpbmQgYHdyaXRlVHJhcHMuZWxlbWVudFNpbmtgKVxuICogYW5kIGhhbmRzIHRoZSB3aG9sZSBuZXcgYXJyYXkgdG8gYGNvbW1pdGAg4oCUIHRoZSBzYW1lIGZ1bm5lbCBgcHVzaGAgYWxyZWFkeVxuICogdXNlZC4gT25lIHdyaXRlIHBhdGggZm9yIHRoZSB3aG9sZSBhcnJheSwgd2hhdGV2ZXIgZGVwdGggaXQgaXMgYWRkcmVzc2VkIGF0LlxuICpcbiAqIOKUgOKUgCBXaGF0IGlzIHN0aWxsIE5PVCBzZWVuIChieSBkZXNpZ24pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogRWxlbWVudHMgcmVhY2hlZCBXSVRIT1VUIGFuIGluZGV4IOKAlCBgZmluZCgpYCwgYGZpbHRlcigpYCwgYGZvcuKApm9mYCxcbiAqIGBmb3JFYWNoYCwgZGVzdHJ1Y3R1cmluZyDigJQgYXJlIGhhbmRlZCBiYWNrIHJhdywgYmVjYXVzZSB3cmFwcGluZyB0aGVtIHdvdWxkXG4gKiBtZWFuIHJldHVybmluZyBwcm94aWVzIG91dCBvZiBldmVyeSByZWFkIG1ldGhvZCAoYG1hcGAgd291bGQgYnVpbGQgYW4gYXJyYXlcbiAqIG9mIHByb3hpZXMpIGZvciBhIGNvc3QgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBwYXkuIE11dGF0aW5nIG9uZSBvZiB0aG9zZSBpc1xuICogbm90IGxvc3QgaW4gc2lsZW5jZSBlaXRoZXI6IGBTdGFnZUNvbnRleHRgIGNvbXBhcmVzIHdoYXQgYSBzdGFnZSBSRUFEIHdpdGhcbiAqIHdoYXQgdGhlIHZhbHVlIGhvbGRzIGF0IGNvbW1pdCBhbmQsIGluIGRldiBtb2RlLCB3YXJucyB3aXRoIHRoZSBleGFjdCBwYXRoLlxuICogU2VlIHNyYy9saWIvcmVhY3RpdmUvUkVBRE1FLm1kLlxuICpcbiAqIOKUgOKUgCBTaGFwZSAoOS4yMy4xKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqIGBjcmVhdGVBcnJheVByb3h5YCBhbmQgYGNyZWF0ZUVsZW1lbnRQcm94eWAgYXJlIE9SQ0hFU1RSQVRPUlM6IHRoZXkgd2lyZVxuICogdHJhcHMgYW5kIGhvbGQgdGhlIGNhY2hlcy4gRXZlcnkgdHJhcCBib2R5IGlzIGEgbmFtZWQgbGVhZiBiZWxvdyDigJQgb25lXG4gKiBjb25jZXJuIGVhY2gg4oCUIGFuZCB0aGUgZWxlbWVudCBwcm94eSdzIHNldC9kZWxldGUvZ2V0IHRyYXBzIGFyZSB0aGUgU0FNRVxuICogbGVhdmVzIHRoZSBuZXN0ZWQgYW5kIHRlcm1pbmFsIG9iamVjdCBwcm94aWVzIHVzZSAoYHdyaXRlVHJhcHMudHNgLFxuICogYGxpdmVWaWV3LnRzYCksIG92ZXIgYW4ge0BsaW5rIGVsZW1lbnRTaW5rfS4gQSBmaXggbGFuZHMgaW4gYSBsZWFmIG9uY2UuXG4gKi9cblxuaW1wb3J0IHsgc2hvdWxkV3JhcFdpdGhQcm94eSB9IGZyb20gJy4vYWxsb3dsaXN0LmpzJztcbmltcG9ydCB7IGxpdmVHZXRUcmFwLCBsaXZlSW5zcGVjdGlvblRyYXBzLCBsaXZlT2JqZWN0LCBNZW1iZXJDYWNoZSB9IGZyb20gJy4vbGl2ZVZpZXcuanMnO1xuaW1wb3J0IHsgdW53cmFwUHJveHkgfSBmcm9tICcuL3N0cnVjdHVyYWxXcml0ZS5qcyc7XG5pbXBvcnQgeyB0eXBlIFdyaXRlU2luaywgZWxlbWVudFNpbmssIHNpbmtEZWxldGVUcmFwLCBzaW5rU2V0VHJhcCB9IGZyb20gJy4vd3JpdGVUcmFwcy5qcyc7XG5cbi8qKiBNZXRob2RzIHRoYXQgbXV0YXRlIHRoZSBhcnJheSBpbi1wbGFjZS4gV2UgaW50ZXJjZXB0IGFuZCBjb3B5LW9uLXdyaXRlLiAqL1xuY29uc3QgTVVUQVRJTkdfTUVUSE9EUyA9IG5ldyBTZXQoW1xuICAncHVzaCcsXG4gICdwb3AnLFxuICAnc2hpZnQnLFxuICAndW5zaGlmdCcsXG4gICdzcGxpY2UnLFxuICAnc29ydCcsXG4gICdyZXZlcnNlJyxcbiAgJ2ZpbGwnLFxuICAnY29weVdpdGhpbicsXG5dKTtcblxudHlwZSBSZWFkID0gKCkgPT4gdW5rbm93bltdO1xudHlwZSBXcml0ZSA9IChuZXh0OiB1bmtub3duW10pID0+IHZvaWQ7XG5cbi8vIC0tIExlYXZlczogcmVhZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBXSFkgYE51bWJlcihwcm9wKWA6IHRoZSBoaXN0b3JpY2FsIHJlYWRpbmcgb2YgYW4gaW5kZXggbmFtZSDigJQgYCcwMSdgIGFuZFxuICogIGAnJ2AgYWRkcmVzcyBzbG90cyAxIGFuZCAwLCBhcyB0aGV5IGFsd2F5cyBoYXZlLiBJbiByYW5nZSBvbmx5LiAqL1xuZnVuY3Rpb24gaW5kZXhJbihjdXJyZW50OiB1bmtub3duW10sIHByb3A6IHN0cmluZyB8IHN5bWJvbCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyKHByb3ApO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IGN1cnJlbnQubGVuZ3RoID8gaW5kZXggOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBBIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4IG5hbWVkIGJ5IGBwcm9wYCAoYW55IHJhbmdlIOKAlCBhIHdyaXRlIHBhc3QgdGhlIGVuZCBncm93cyB0aGUgYXJyYXkpLiAqL1xuZnVuY3Rpb24gaW5kZXhOYW1lZChwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpbmRleCA9IE51bWJlcihwcm9wKTtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoaW5kZXgpICYmIGluZGV4ID49IDAgPyBpbmRleCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFdIWTogYSBub24tbXV0YXRpbmcgcmVhZCBhbnN3ZXJzIGZyb20gdGhlIENVUlJFTlQgYXJyYXksIG5ldmVyIHRoZVxuICogIGNyZWF0aW9uLXRpbWUgdGFyZ2V0IOKAlCBhIG1ldGhvZCBpcyBib3VuZCB0byBpdCwgYW55dGhpbmcgZWxzZSByZWFkIG9mZiBpdC4gKi9cbmZ1bmN0aW9uIGJvdW5kTWVtYmVyKGN1cnJlbnQ6IHVua25vd25bXSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKTogdW5rbm93biB7XG4gIGNvbnN0IHZhbCA9IChjdXJyZW50IGFzIGFueSlbcHJvcF07XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nID8gdmFsLmJpbmQoY3VycmVudCkgOiB2YWw7XG59XG5cbnR5cGUgRWxlbWVudENhY2hlID0gTWFwPG51bWJlciwgeyByZWY6IHVua25vd247IHByb3h5OiB1bmtub3duIH0+O1xuXG4vKiogV0hZIHRoZSBjYWNoZTogcmVhZGluZyBgbGluZXNbaV0ucXR5YCBpbiBhIGxvb3AgbXVzdCBub3QgYWxsb2NhdGUgYSBwcm94eVxuICogIHBlciByZWFkLCBhbmQgYGxpbmVzWzBdID09PSBsaW5lc1swXWAgbXVzdCBob2xkIHdpdGhpbiBhIHN0YWdlLiBWYWxpZGF0ZWQgYnlcbiAqICByYXcgaWRlbnRpdHkg4oCUIGEgY29tbWl0IHJlcGxhY2VzIHRoZSBhcnJheSwgdGhlIHJlZiBjaGVjayBtaXNzZXMsIGFuZCBhXG4gKiAgZnJlc2ggcHJveHkgaXMgYnVpbHQgb3ZlciB0aGUgbmV3IGVsZW1lbnQuIEEgcHJpbWl0aXZlIGlzIGhhbmRlZCBiYWNrIHJhdy4gKi9cbmZ1bmN0aW9uIGNhY2hlZEVsZW1lbnQoY2FjaGU6IEVsZW1lbnRDYWNoZSwgZWxlbWVudDogdW5rbm93biwgaW5kZXg6IG51bWJlciwgcmVhZDogUmVhZCwgd3JpdGU6IFdyaXRlKTogdW5rbm93biB7XG4gIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eShlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChpbmRleCk7XG4gIGlmIChjYWNoZWQgJiYgY2FjaGVkLnJlZiA9PT0gZWxlbWVudCkgcmV0dXJuIGNhY2hlZC5wcm94eTtcbiAgY29uc3Qgd3JhcHBlZCA9IHdyYXBFbGVtZW50TWVtYmVyKGVsZW1lbnQsIGVsZW1lbnRTaW5rKHJlYWQsIHdyaXRlLCBpbmRleCksIFtdLCBuZXcgU2V0PG9iamVjdD4oKSk7XG4gIGNhY2hlLnNldChpbmRleCwgeyByZWY6IGVsZW1lbnQsIHByb3h5OiB3cmFwcGVkIH0pO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuLy8gLS0gTGVhdmVzOiB3cml0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFNsb3RzIGZyb20gdGhlIGN1cnJlbnQgZW5kIHVwIHRvIChub3QgaW5jbHVkaW5nKSBgdXBUb2AgYmVjb21lIGBudWxsYCDigJRcbiAqICB0aGUgSlNPTiBzcGVsbGluZyBvZiBhIGhvbGUsIHdoaWNoIGlzIHdoYXQgdGhlIHdob2xlLWFycmF5IHJvdW5kLXRyaXAgdXNlZFxuICogIHRvIHByb2R1Y2UgZm9yIHRoZW0uIE5vLW9wIHdoZW4gYHVwVG9gIGlzIHdpdGhpbiB0aGUgYXJyYXkuICovXG5mdW5jdGlvbiBmaWxsSG9sZXMoYXJyOiB1bmtub3duW10sIHVwVG86IG51bWJlcik6IHZvaWQge1xuICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aDsgaSA8IHVwVG87IGkrKykgYXJyW2ldID0gbnVsbDtcbn1cblxuLyoqIFdIWTogYSBtdXRhdGluZyBtZXRob2QgcnVucyBvbiBhIENPUFksIHdpdGggaXRzIGFyZ3VtZW50cyB1bndyYXBwZWQgKHRoZXlcbiAqICBhcmUgdGhlIGFzc2lnbmVkIHZhbHVlczsgYSBudW1iZXIgb3IgYSBjb21wYXJhdG9yIHBhc3NlcyB0aHJvdWdoKSwgYW5kIHRoZVxuICogIGNvcHkgaXMgY29tbWl0dGVkIHdob2xlLiBUaGUgYXJyYXkgaW4gc3RhdGUgaXMgbmV2ZXIgdG91Y2hlZC4gKi9cbmZ1bmN0aW9uIG11dGF0aW5nTWV0aG9kKHJlYWQ6IFJlYWQsIHdyaXRlOiBXcml0ZSwgbmFtZTogc3RyaW5nKTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gICAgY29uc3QgcmVzdWx0ID0gKGNsb25lIGFzIGFueSlbbmFtZV0oLi4uYXJncy5tYXAodW53cmFwUHJveHkpKTtcbiAgICB3cml0ZShjbG9uZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuLyoqIGBhcnJbaV0gPSB2YDogY29weSwgYG51bGxgIHRoZSBzbG90cyBhIHdyaXRlIHBhc3QgdGhlIGVuZCBza2lwcywgcGxhY2UgdGhlIHVud3JhcHBlZCB2YWx1ZSwgY29tbWl0LiAqL1xuZnVuY3Rpb24gc2V0SW5kZXgocmVhZDogUmVhZCwgd3JpdGU6IFdyaXRlLCBpbmRleDogbnVtYmVyLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBjbG9uZSA9IFsuLi5yZWFkKCldO1xuICBmaWxsSG9sZXMoY2xvbmUsIGluZGV4KTtcbiAgY2xvbmVbaW5kZXhdID0gdW53cmFwUHJveHkodmFsdWUpO1xuICB3cml0ZShjbG9uZSk7XG59XG5cbi8qKiBgYXJyLmxlbmd0aCA9IG5gOiBjb3B5LCBgbnVsbGAgdGhlIHNsb3RzIGdyb3d0aCBhZGRzLCB0cnVuY2F0ZSBvciBleHRlbmQsIGNvbW1pdC4gKi9cbmZ1bmN0aW9uIHNldExlbmd0aChyZWFkOiBSZWFkLCB3cml0ZTogV3JpdGUsIGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gIGZpbGxIb2xlcyhjbG9uZSwgbGVuZ3RoKTtcbiAgY2xvbmUubGVuZ3RoID0gbGVuZ3RoO1xuICB3cml0ZShjbG9uZSk7XG59XG5cbi8qKiBXSFk6IHdpdGhvdXQgdGhpcyB0cmFwIGBkZWxldGUgaXRlbXNbMl1gIHJlYWNoZXMgdGhlIFJBVyBhcnJheSBjYXB0dXJlZFxuICogIGFzIHRoZSBwcm94eSB0YXJnZXQg4oCUIGNvbW1pdHRlZCBzdGF0ZSwgbm8gY29tbWl0IHJlY29yZC4gSlMgYGRlbGV0ZWAgb24gYW5cbiAqICBpbmRleCBsZWF2ZXMgdGhlIHNsb3QgZW1wdHkgYW5kIHRoZSBsZW5ndGggdW5jaGFuZ2VkLCBhbmQgc28gZG9lcyB0aGlzOlxuICogIHRoZSBlbXB0aWVkIHNsb3QgY29tbWl0cyBhcyBgbnVsbGAsIEpTT04ncyBvbmx5IHNwZWxsaW5nIGZvciBhIGhvbGUuICovXG5mdW5jdGlvbiBkZWxldGVTbG90KHJlYWQ6IFJlYWQsIHdyaXRlOiBXcml0ZSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKTogdm9pZCB7XG4gIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gIGNvbnN0IGluZGV4ID0gdHlwZW9mIHByb3AgPT09ICdzdHJpbmcnID8gTnVtYmVyKHByb3ApIDogTmFOO1xuICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IGNsb25lLmxlbmd0aCkgY2xvbmVbaW5kZXhdID0gbnVsbDtcbiAgZWxzZSBkZWxldGUgKGNsb25lIGFzIGFueSlbcHJvcF07XG4gIHdyaXRlKGNsb25lKTtcbn1cblxuLy8gLS0gTGVhdmVzOiB0aGUgY2hhaW4gYmVsb3cgYW4gZWxlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFdIWTogYW4gYXJyYXkgYW55d2hlcmUgYmVsb3cgYSBzaW5rJ3Mgcm9vdCBpcyBPTkUgd3JpdGUgcGF0aCDigJQgaXQgcmVhZHNcbiAqIHRocm91Z2ggdGhlIHNpbmsgYW5kIGNvbW1pdHMgdGhlIFdIT0xFIG5ldyBhcnJheSBiYWNrIHRocm91Z2ggaXQsIHNvXG4gKiBgcHVzaGAgdGhyZWUgbGV2ZWxzIGRvd24gYW5kIGBhcnJbaV0ueCA9IHZgIGF0IHRoZSB0b3Agc2hhcmUgYSBmdW5uZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVByb3h5QXQoc2luazogV3JpdGVTaW5rLCBwYXRoOiByZWFkb25seSBzdHJpbmdbXSk6IHVua25vd25bXSB7XG4gIHJldHVybiBjcmVhdGVBcnJheVByb3h5KFxuICAgICgpID0+IChzaW5rLnJlYWRBdChwYXRoKSBhcyB1bmtub3duW10pID8/IFtdLFxuICAgIChuZXh0KSA9PiBzaW5rLnB1dChwYXRoLCBuZXh0KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBXcmFwIGEgdmFsdWUgcmVhZCBvdXQgb2YgYW4gZWxlbWVudDogYXJyYXlzIGJlY29tZSBhcnJheSBwcm94aWVzIHdob3NlXG4gKiBjb21taXRzIHJvdXRlIGJhY2sgdGhyb3VnaCB0aGUgb3duaW5nIGFycmF5LCBwbGFpbiBvYmplY3RzIGJlY29tZSBlbGVtZW50XG4gKiBwcm94aWVzIG9uZSBsZXZlbCBkZWVwZXIsIGV2ZXJ5dGhpbmcgZWxzZSBpcyByZXR1cm5lZCBhcy1pcy4gQSB2YWx1ZSBhbHJlYWR5XG4gKiBvbiB0aGUgYWNjZXNzIGNoYWluIChhIGN5Y2xlKSBpcyByZXR1cm5lZCByYXcg4oCUIHRoZSBzYW1lIGJhY2stZWRnZSB0aGVcbiAqIG5lc3RlZC1vYmplY3QgdGVybWluYWwgcHJveHkgdGFrZXMuXG4gKi9cbmZ1bmN0aW9uIHdyYXBFbGVtZW50TWVtYmVyKHZhbHVlOiB1bmtub3duLCBzaW5rOiBXcml0ZVNpbmssIHBhdGg6IHN0cmluZ1tdLCB2aXNpdGVkOiBTZXQ8b2JqZWN0Pik6IHVua25vd24ge1xuICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmICh2aXNpdGVkLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IGJyYW5jaCA9IG5ldyBTZXQodmlzaXRlZCk7XG4gIGJyYW5jaC5hZGQodmFsdWUgYXMgb2JqZWN0KTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYXJyYXlQcm94eUF0KHNpbmssIHBhdGgpO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBwYXRoLCBicmFuY2gpO1xufVxuXG4vLyAtLSBPcmNoZXN0cmF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFByb3h5IG92ZXIgb25lIE9CSkVDVCBlbGVtZW50IChvciBhbiBvYmplY3QgbmVzdGVkIGluc2lkZSBvbmUpLCBjYXJyeWluZyB0aGVcbiAqIHBhdGggZnJvbSB0aGUgZWxlbWVudCBkb3duIHRvIGl0LiBSZWFkcyByZWN1cnNlOyB3cml0ZXMgZ28gYmFjayBvdXQgdGhyb3VnaFxuICogdGhlIG93bmluZyBhcnJheSdzIGNvbW1pdCBjYWxsYmFjayAodGhlIHtAbGluayBlbGVtZW50U2lua30pLlxuICpcbiAqIFJFQURTIEFSRSBMSVZFLiBFdmVyeSB3cml0ZSByZWJ1aWxkcyB0aGUgYXJyYXkgaW1tdXRhYmx5LCBzbyB0aGUgb2JqZWN0IHRoZVxuICogcHJveHkgd2FzIGNyZWF0ZWQgb3ZlciBpcyB0aGUgUFJFLXdyaXRlIGVsZW1lbnQgZm9yIGV2ZXIgYWZ0ZXI7IGEgaGVsZFxuICogaGFuZGxlIHRoYXQgcmVhZCBmcm9tIGl0IHNhdyBpdHMgb3duIHdyaXRlcyB2YW5pc2ggKGBsaW5lLm4gKz0gMWAgdHdpY2VcbiAqIGdhdmUgMiwgYGxpbmUudG90YWwgPSBsaW5lLnF0eSAqIDEwYCB1c2VkIHRoZSBvbGQgYHF0eWAsIGAneCcgaW4gbGluZWAgd2FzXG4gKiBmYWxzZSByaWdodCBhZnRlciBgbGluZS54ID0gMWApLiBFdmVyeSB0cmFwIHRoZXJlZm9yZSByZXNvbHZlcyB0aGUgZWxlbWVudFxuICogdGhyb3VnaCB0aGUgc2luayBmaXJzdCwgYW5kIGZhbGxzIGJhY2sgdG8gdGhlIGNhcHR1cmVkIG9iamVjdCBvbmx5IHdoZW5cbiAqIHRoZSBwYXRoIG5vIGxvbmdlciBleGlzdHMgKHRoZSBzbG90IHdhcyBlbXB0aWVkIG9yIHRoZSBhcnJheSBzaHJhbmspIOKAlCB0aGVcbiAqIHNhbWUgcmVhZC15b3VyLXdyaXRlcyB0aGUgYXJyYXkgcHJveHkgaXRzZWxmIGhhcyBhbHdheXMgaGFkLCBhbmQgdGhlIHNhbWVcbiAqIGxhdyB0aGUgbmVzdGVkIGFuZCB0ZXJtaW5hbCBvYmplY3QgcHJveGllcyBmb2xsb3cgKGxpdmVWaWV3LnRzKS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFByb3h5KFxuICByYXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzaW5rOiBXcml0ZVNpbmssXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdmlzaXRlZDogU2V0PG9iamVjdD4sXG4pOiB1bmtub3duIHtcbiAgY29uc3QgbWVtYmVycyA9IG5ldyBNZW1iZXJDYWNoZSgpO1xuICBjb25zdCBsaXZlID0gKCkgPT4gbGl2ZU9iamVjdChyYXcsIHNpbmsucmVhZEF0KHNlZ21lbnRzKSk7XG4gIHJldHVybiBuZXcgUHJveHkocmF3LCB7XG4gICAgZ2V0OiBsaXZlR2V0VHJhcChsaXZlLCBzZWdtZW50cywgKHZhbHVlLCBwYXRoKSA9PiB3cmFwRWxlbWVudE1lbWJlcih2YWx1ZSwgc2luaywgcGF0aCwgdmlzaXRlZCksIG1lbWJlcnMpLFxuICAgIHNldDogc2lua1NldFRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgIGRlbGV0ZVByb3BlcnR5OiBzaW5rRGVsZXRlVHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgLi4ubGl2ZUluc3BlY3Rpb25UcmFwcyhsaXZlKSxcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb3h5IG92ZXIgYW4gYXJyYXkgdGhhdCBpbnRlcmNlcHRzIG11dGF0aW5nIG9wZXJhdGlvbnMuXG4gKlxuICogVGhlIGFjdHVhbCBjdXJyZW50IGFycmF5IGlzIHRoZSBQcm94eSB0YXJnZXQ6IE5vZGUuanMgY29uc29sZS5sb2cgaW5zcGVjdHNcbiAqIHRoZSB0YXJnZXQgZGlyZWN0bHkgKGJ5cGFzc2VzIFByb3h5IHRyYXBzKSwgc28gdGhlIHJlYWwgYXJyYXkgc2hvd3MgY29ycmVjdFxuICogdmFsdWVzLiBUaGUgdGFyZ2V0IHJlZmVyZW5jZSBpcyBmaXhlZCBhdCBjcmVhdGlvbiB0aW1lIOKAlCBhZnRlciBtdXRhdGlvbnMsXG4gKiB0aGUgcHJveHkgcmV0dXJucyBhIG5ldyBwcm94eSAodmlhIGNhY2hlIGludmFsaWRhdGlvbikgd2l0aCB0aGUgZnJlc2ggYXJyYXlcbiAqIGFzIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gZ2V0Q3VycmVudCAtIFJldHVybnMgdGhlIGN1cnJlbnQgYXJyYXkgc25hcHNob3QgZnJvbSBzdGF0ZVxuICogQHBhcmFtIGNvbW1pdCAtIENhbGxlZCB3aXRoIHRoZSBuZXcgYXJyYXkgYWZ0ZXIgYSBtdXRhdGlvbiAodHJpZ2dlcnMgc2V0VmFsdWUpXG4gKiBAcmV0dXJucyBQcm94aWVkIGFycmF5IHdpdGggY29weS1vbi13cml0ZSBzZW1hbnRpY3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFycmF5UHJveHk8VD4oZ2V0Q3VycmVudDogKCkgPT4gVFtdLCBjb21taXQ6IChuZXdBcnJheTogVFtdKSA9PiB2b2lkKTogVFtdIHtcbiAgY29uc3QgdGFyZ2V0ID0gZ2V0Q3VycmVudCgpIGFzIFRbXTtcbiAgY29uc3QgcmVhZCA9IGdldEN1cnJlbnQgYXMgdW5rbm93biBhcyBSZWFkO1xuICBjb25zdCB3cml0ZSA9IGNvbW1pdCBhcyB1bmtub3duIGFzIFdyaXRlO1xuICBjb25zdCBlbGVtZW50czogRWxlbWVudENhY2hlID0gbmV3IE1hcCgpO1xuXG4gIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCB7XG4gICAgZ2V0KF90YXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycgJiYgTVVUQVRJTkdfTUVUSE9EUy5oYXMocHJvcCkpIHJldHVybiBtdXRhdGluZ01ldGhvZChyZWFkLCB3cml0ZSwgcHJvcCk7XG4gICAgICBjb25zdCBjdXJyZW50ID0gcmVhZCgpO1xuICAgICAgaWYgKHByb3AgPT09ICdsZW5ndGgnKSByZXR1cm4gY3VycmVudC5sZW5ndGg7XG4gICAgICBjb25zdCBpbmRleCA9IGluZGV4SW4oY3VycmVudCwgcHJvcCk7XG4gICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZEVsZW1lbnQoZWxlbWVudHMsIGN1cnJlbnRbaW5kZXhdLCBpbmRleCwgcmVhZCwgd3JpdGUpO1xuICAgICAgaWYgKHByb3AgPT09IFN5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJykpIHJldHVybiAoKSA9PiBjdXJyZW50O1xuICAgICAgcmV0dXJuIGJvdW5kTWVtYmVyKGN1cnJlbnQsIHByb3ApO1xuICAgIH0sXG4gICAgc2V0KF90YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGluZGV4TmFtZWQocHJvcCk7XG4gICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkgc2V0SW5kZXgocmVhZCwgd3JpdGUsIGluZGV4LCB2YWx1ZSk7XG4gICAgICBlbHNlIGlmIChwcm9wID09PSAnbGVuZ3RoJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSBzZXRMZW5ndGgocmVhZCwgd3JpdGUsIHZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBhbnkgb3RoZXIgc2V0IGlzIGlnbm9yZWQgKGFuIGV4cGFuZG8gb24gYW4gYXJyYXkgaXMgb3V0IG9mIGNvbnRyYWN0IOKAlCBSRUFETUUpXG4gICAgfSxcbiAgICBkZWxldGVQcm9wZXJ0eShfdGFyZ2V0LCBwcm9wKSB7XG4gICAgICBkZWxldGVTbG90KHJlYWQsIHdyaXRlLCBwcm9wKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgcHJvcCkgPT4gUmVmbGVjdC5oYXMocmVhZCgpLCBwcm9wKSxcbiAgICBvd25LZXlzOiAoKSA9PiBSZWZsZWN0Lm93bktleXMocmVhZCgpKSxcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IChfdGFyZ2V0LCBwcm9wKSA9PiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJlYWQoKSwgcHJvcCksXG4gIH0pO1xufVxuIl19
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlUcmFwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvYXJyYXlUcmFwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRHOzs7QUFFSCxpREFBcUQ7QUFDckQsNkNBQTZEO0FBQzdELCtDQUEwRjtBQUMxRixtREFBMkY7QUFFM0YsOEVBQThFO0FBQzlFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0IsTUFBTTtJQUNOLEtBQUs7SUFDTCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sU0FBUztJQUNULE1BQU07SUFDTixZQUFZO0NBQ2IsQ0FBQyxDQUFDO0FBS0gsZ0ZBQWdGO0FBRWhGO3NFQUNzRTtBQUN0RSxTQUFTLE9BQU8sQ0FBQyxPQUFrQixFQUFFLElBQXFCO0lBQ3hELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDN0YsQ0FBQztBQUVELHVHQUF1RztBQUN2RyxTQUFTLFVBQVUsQ0FBQyxJQUFxQjtJQUN2QyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtB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QkFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3hELElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZGLE9BQU8sSUFBSSxDQUFDLENBQUMsZ0ZBQWdGO1FBQy9GLENBQUM7UUFDRCxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUk7WUFDMUIsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUM7UUFDakQsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsd0JBQXdCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDO0tBQzNGLENBQUMsRUFDRixJQUFJLENBQ0wsQ0FBQztBQUNKLENBQUM7QUFsQ0QsNENBa0NDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWFjdGl2ZS9hcnJheVRyYXBzIC0tIEFycmF5IG11dGF0aW9uIGludGVyY2VwdGlvbiB2aWEgUHJveHkuXG4gKlxuICogV2hlbiBzY29wZS5pdGVtcyBpcyBhbiBhcnJheSwgd2UgcmV0dXJuIGEgUHJveHkgdGhhdCBpbnRlcmNlcHRzIG11dGF0aW5nXG4gKiBtZXRob2RzIChwdXNoLCBwb3AsIHNwbGljZSwgZXRjLikgQU5EIGluZGV4ZWQgYWNjZXNzLiBFYWNoIG11dGF0aW9uOlxuICogMS4gQ2xvbmVzIHRoZSBjdXJyZW50IGFycmF5XG4gKiAyLiBBcHBsaWVzIHRoZSBtdXRhdGlvbiB0byB0aGUgY2xvbmVcbiAqIDMuIENvbW1pdHMgdGhlIG5ldyBhcnJheSB2aWEgdGhlIGNvbW1pdCBjYWxsYmFja1xuICpcbiAqIE5vbi1tdXRhdGluZyBtZXRob2RzIChtYXAsIGZpbHRlciwgZm9yRWFjaCwgZXRjLikgcGFzcyB0aHJvdWdoIHRvIHRoZVxuICogY3VycmVudCBhcnJheSBzbmFwc2hvdCB3aXRob3V0IGludGVyY2VwdGlvbi5cbiAqXG4gKiBUaGUgb3JpZ2luYWwgYXJyYXkgaW4gc3RhdGUgaXMgTkVWRVIgbXV0YXRlZCBkaXJlY3RseSAtLSBhbGwgd3JpdGVzIGdvXG4gKiB0aHJvdWdoIHRoZSBjb21taXQgY2FsbGJhY2sgd2hpY2ggY2FsbHMgc2V0VmFsdWUvdXBkYXRlVmFsdWUuXG4gKlxuICog4pSA4pSAIE9ubHkgdGhlIEFTU0lHTkVEIHZhbHVlIGlzIHVud3JhcHBlZCAoOS4yMy4wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqIExhbmRtaW5lIDEgc2F5cyB0aGUgc2V0IHRyYXAgSlNPTi1yb3VuZC10cmlwcyB0aGUgdmFsdWUgdGhlIGNhbGxlciBoYW5kZWRcbiAqIGluLiBGb3IgYW4gYXJyYXkgdGhhdCBpcyB0aGUgaW5kZXgtYXNzaWduZWQgZWxlbWVudCwgYSBtdXRhdGluZyBtZXRob2Qnc1xuICogYXJndW1lbnRzIChgcHVzaCh4KWAsIGBzcGxpY2UoaSwgbiwgLi4uaXRlbXMpYCwgYGZpbGwoeClgKSwgb3IgdGhlIGxlYWYgYW5cbiAqIGVsZW1lbnQgcHJveHkgd3JpdGVzIOKAlCBhbmQgaXQgaXMgdW53cmFwcGVkIEhFUkUsIGF0IHRoZSB0cmFwIHRoYXQgcmVjZWl2ZXNcbiAqIGl0LiBUaGUgcmVidWlsdCBhcnJheSBpcyBoYW5kZWQgdG8gYGNvbW1pdGAgYXMgaXQgaXM6IGV2ZXJ5IHNpYmxpbmcgdGhlXG4gKiBjYWxsZXIgZGlkIG5vdCB0b3VjaCBwYXNzZXMgdGhyb3VnaCBieSByZWZlcmVuY2UsIGBEYXRlYHMgYW5kIGBNYXBgc1xuICogaW50YWN0LiBVbnRpbCA5LjIzLjAgdGhlIGNvbW1pdCBjYWxsYmFja3Mgcm91bmQtdHJpcHBlZCB0aGUgV0hPTEUgcmVidWlsdFxuICogYXJyYXksIHdoaWNoIHN0cmluZ2lmaWVkIHVudG91Y2hlZCBzaWJsaW5ncyBhbmQgd2FzIE8oTikgcGVyIGVsZW1lbnQgd3JpdGUuXG4gKiBUaGUgb25lIHRoaW5nIHRoZSByb3VuZC10cmlwIHVzZWQgdG8gZG8gZm9yIHRoZSBhcnJheSdzIG93biBzaGFwZSDigJQgYW5cbiAqIGVtcHRpZWQgb3Igc2tpcHBlZCBzbG90IGJlY2FtZSBgbnVsbGAsIEpTT04ncyBvbmx5IHNwZWxsaW5nIGZvciBhIGhvbGUg4oCUXG4gKiBpcyBub3cgZG9uZSBleHBsaWNpdGx5IGJ5IHRoZSB0cmFwcyB0aGF0IGNhbiBjcmVhdGUgb25lIChgZGVsZXRlIGFycltpXWAsXG4gKiBgYXJyW2ldID0gdmAgcGFzdCB0aGUgZW5kLCBgYXJyLmxlbmd0aCA9IG5gIGdyb3d0aCkuXG4gKlxuICog4pSA4pSAIEluZGV4ZWQgYWNjZXNzIGlzIHBhcnQgb2YgdGhlIGNoYWluICg5LjIyLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogYGFycltpXWAgdXNlZCB0byBoYW5kIGJhY2sgdGhlIFJBVyBlbGVtZW50LCB3aGljaCBicm9rZSB0aGUgcHJveHkgY2hhaW4gYXRcbiAqIGV4YWN0bHkgdGhlIHBvaW50IHVzZXJzIHdyaXRlIHRocm91Z2ggaXQ6IGBvcmRlci5saW5lc1swXS5xdHkgPSA0YCB3YXMgYW5cbiAqIGluLXBsYWNlIG11dGF0aW9uIG9mIGEgYm9ycm93ZWQgcmVhZCDigJQgbm8gdHJhcCwgbm8gdHJhY2Ugcm93LCBubyBjb21taXQuXG4gKiBCZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgc3RhZ2VkIHdyaXRlIHRoYXQgYm9ycm93ZWQgdmFsdWUgSVMgY29tbWl0dGVkXG4gKiBzaGFyZWQgbWVtb3J5LCBzbyB0aGUgbXV0YXRpb24gbW92ZWQgc3RhdGUgd2hpbGUgdGhlIGxvZyBzdGF5ZWQgZW1wdHk7IGFmdGVyXG4gKiBpdCwgdGhlIG11dGF0aW9uIGxhbmRlZCBpbiB0aGUgcHJpdmF0ZSBidWZmZXIgY2xvbmUgYW5kIHdhcyBkcm9wcGVkLiBTYW1lXG4gKiBleHByZXNzaW9uLCB0d28gc2lsZW50IG91dGNvbWVzLlxuICpcbiAqIE5vdyBhbiBpbmRleGVkIHJlYWQgb2YgYSB3cmFwcGFibGUgZWxlbWVudCByZXR1cm5zIGFuIEVMRU1FTlQgUFJPWFkgdGhhdFxuICogYWNjdW11bGF0ZXMgdGhlIHBhdGggaW5zaWRlIHRoZSBlbGVtZW50IGFuZCwgb24gd3JpdGUsIHJlYnVpbGRzIHRoZSBhcnJheVxuICogaW1tdXRhYmx5IChgc3RydWN0dXJhbFdyaXRlLnNldEluUGF0aGAsIGJlaGluZCBgd3JpdGVUcmFwcy5lbGVtZW50U2lua2ApXG4gKiBhbmQgaGFuZHMgdGhlIHdob2xlIG5ldyBhcnJheSB0byBgY29tbWl0YCDigJQgdGhlIHNhbWUgZnVubmVsIGBwdXNoYCBhbHJlYWR5XG4gKiB1c2VkLiBPbmUgd3JpdGUgcGF0aCBmb3IgdGhlIHdob2xlIGFycmF5LCB3aGF0ZXZlciBkZXB0aCBpdCBpcyBhZGRyZXNzZWQgYXQuXG4gKlxuICog4pSA4pSAIFdoYXQgaXMgc3RpbGwgTk9UIHNlZW4gKGJ5IGRlc2lnbikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBFbGVtZW50cyByZWFjaGVkIFdJVEhPVVQgYW4gaW5kZXgg4oCUIGBmaW5kKClgLCBgZmlsdGVyKClgLCBgZm9y4oCmb2ZgLFxuICogYGZvckVhY2hgLCBkZXN0cnVjdHVyaW5nIOKAlCBhcmUgaGFuZGVkIGJhY2sgcmF3LCBiZWNhdXNlIHdyYXBwaW5nIHRoZW0gd291bGRcbiAqIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0IG9mIGV2ZXJ5IHJlYWQgbWV0aG9kIChgbWFwYCB3b3VsZCBidWlsZCBhbiBhcnJheVxuICogb2YgcHJveGllcykgZm9yIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheS4gTXV0YXRpbmcgb25lIG9mIHRob3NlIGlzXG4gKiBub3QgbG9zdCBpbiBzaWxlbmNlIGVpdGhlcjogYFN0YWdlQ29udGV4dGAgY29tcGFyZXMgd2hhdCBhIHN0YWdlIFJFQUQgd2l0aFxuICogd2hhdCB0aGUgdmFsdWUgaG9sZHMgYXQgY29tbWl0IGFuZCwgaW4gZGV2IG1vZGUsIHdhcm5zIHdpdGggdGhlIGV4YWN0IHBhdGguXG4gKiBTZWUgc3JjL2xpYi9yZWFjdGl2ZS9SRUFETUUubWQuXG4gKlxuICog4pSA4pSAIFNoYXBlICg5LjIzLjEpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogYGNyZWF0ZUFycmF5UHJveHlgIGFuZCBgY3JlYXRlRWxlbWVudFByb3h5YCBhcmUgT1JDSEVTVFJBVE9SUzogdGhleSB3aXJlXG4gKiB0cmFwcyBhbmQgaG9sZCB0aGUgY2FjaGVzLiBFdmVyeSB0cmFwIGJvZHkgaXMgYSBuYW1lZCBsZWFmIGJlbG93IOKAlCBvbmVcbiAqIGNvbmNlcm4gZWFjaCDigJQgYW5kIHRoZSBlbGVtZW50IHByb3h5J3Mgc2V0L2RlbGV0ZS9nZXQgdHJhcHMgYXJlIHRoZSBTQU1FXG4gKiBsZWF2ZXMgdGhlIG5lc3RlZCBhbmQgdGVybWluYWwgb2JqZWN0IHByb3hpZXMgdXNlIChgd3JpdGVUcmFwcy50c2AsXG4gKiBgbGl2ZVZpZXcudHNgKSwgb3ZlciBhbiB7QGxpbmsgZWxlbWVudFNpbmt9LiBBIGZpeCBsYW5kcyBpbiBhIGxlYWYgb25jZS5cbiAqL1xuXG5pbXBvcnQgeyBzaG91bGRXcmFwV2l0aFByb3h5IH0gZnJvbSAnLi9hbGxvd2xpc3QuanMnO1xuaW1wb3J0IHsgcmVtZW1iZXJIYW5kbGUsIHVud3JhcEhhbmRsZXMgfSBmcm9tICcuL2hhbmRsZXMuanMnO1xuaW1wb3J0IHsgbGl2ZUdldFRyYXAsIGxpdmVJbnNwZWN0aW9uVHJhcHMsIGxpdmVPYmplY3QsIE1lbWJlckNhY2hlIH0gZnJvbSAnLi9saXZlVmlldy5qcyc7XG5pbXBvcnQgeyB0eXBlIFdyaXRlU2luaywgZWxlbWVudFNpbmssIHNpbmtEZWxldGVUcmFwLCBzaW5rU2V0VHJhcCB9IGZyb20gJy4vd3JpdGVUcmFwcy5qcyc7XG5cbi8qKiBNZXRob2RzIHRoYXQgbXV0YXRlIHRoZSBhcnJheSBpbi1wbGFjZS4gV2UgaW50ZXJjZXB0IGFuZCBjb3B5LW9uLXdyaXRlLiAqL1xuY29uc3QgTVVUQVRJTkdfTUVUSE9EUyA9IG5ldyBTZXQoW1xuICAncHVzaCcsXG4gICdwb3AnLFxuICAnc2hpZnQnLFxuICAndW5zaGlmdCcsXG4gICdzcGxpY2UnLFxuICAnc29ydCcsXG4gICdyZXZlcnNlJyxcbiAgJ2ZpbGwnLFxuICAnY29weVdpdGhpbicsXG5dKTtcblxudHlwZSBSZWFkID0gKCkgPT4gdW5rbm93bltdO1xudHlwZSBXcml0ZSA9IChuZXh0OiB1bmtub3duW10pID0+IHZvaWQ7XG5cbi8vIC0tIExlYXZlczogcmVhZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBXSFkgYE51bWJlcihwcm9wKWA6IHRoZSBoaXN0b3JpY2FsIHJlYWRpbmcgb2YgYW4gaW5kZXggbmFtZSDigJQgYCcwMSdgIGFuZFxuICogIGAnJ2AgYWRkcmVzcyBzbG90cyAxIGFuZCAwLCBhcyB0aGV5IGFsd2F5cyBoYXZlLiBJbiByYW5nZSBvbmx5LiAqL1xuZnVuY3Rpb24gaW5kZXhJbihjdXJyZW50OiB1bmtub3duW10sIHByb3A6IHN0cmluZyB8IHN5bWJvbCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyKHByb3ApO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IGN1cnJlbnQubGVuZ3RoID8gaW5kZXggOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBBIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4IG5hbWVkIGJ5IGBwcm9wYCAoYW55IHJhbmdlIOKAlCBhIHdyaXRlIHBhc3QgdGhlIGVuZCBncm93cyB0aGUgYXJyYXkpLiAqL1xuZnVuY3Rpb24gaW5kZXhOYW1lZChwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpbmRleCA9IE51bWJlcihwcm9wKTtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoaW5kZXgpICYmIGluZGV4ID49IDAgPyBpbmRleCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFdIWTogYSBub24tbXV0YXRpbmcgcmVhZCBhbnN3ZXJzIGZyb20gdGhlIENVUlJFTlQgYXJyYXksIG5ldmVyIHRoZVxuICogIGNyZWF0aW9uLXRpbWUgdGFyZ2V0IOKAlCBhIG1ldGhvZCBpcyBib3VuZCB0byBpdCwgYW55dGhpbmcgZWxzZSByZWFkIG9mZiBpdC4gKi9cbmZ1bmN0aW9uIGJvdW5kTWVtYmVyKGN1cnJlbnQ6IHVua25vd25bXSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKTogdW5rbm93biB7XG4gIGNvbnN0IHZhbCA9IChjdXJyZW50IGFzIGFueSlbcHJvcF07XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nID8gdmFsLmJpbmQoY3VycmVudCkgOiB2YWw7XG59XG5cbnR5cGUgRWxlbWVudENhY2hlID0gTWFwPG51bWJlciwgeyByZWY6IHVua25vd247IHByb3h5OiB1bmtub3duIH0+O1xuXG4vKiogV0hZIHRoZSBjYWNoZTogcmVhZGluZyBgbGluZXNbaV0ucXR5YCBpbiBhIGxvb3AgbXVzdCBub3QgYWxsb2NhdGUgYSBwcm94eVxuICogIHBlciByZWFkLCBhbmQgYGxpbmVzWzBdID09PSBsaW5lc1swXWAgbXVzdCBob2xkIHdpdGhpbiBhIHN0YWdlLiBWYWxpZGF0ZWQgYnlcbiAqICByYXcgaWRlbnRpdHkg4oCUIGEgY29tbWl0IHJlcGxhY2VzIHRoZSBhcnJheSwgdGhlIHJlZiBjaGVjayBtaXNzZXMsIGFuZCBhXG4gKiAgZnJlc2ggcHJveHkgaXMgYnVpbHQgb3ZlciB0aGUgbmV3IGVsZW1lbnQuIEEgcHJpbWl0aXZlIGlzIGhhbmRlZCBiYWNrIHJhdy4gKi9cbmZ1bmN0aW9uIGNhY2hlZEVsZW1lbnQoY2FjaGU6IEVsZW1lbnRDYWNoZSwgZWxlbWVudDogdW5rbm93biwgaW5kZXg6IG51bWJlciwgcmVhZDogUmVhZCwgd3JpdGU6IFdyaXRlKTogdW5rbm93biB7XG4gIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eShlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChpbmRleCk7XG4gIGlmIChjYWNoZWQgJiYgY2FjaGVkLnJlZiA9PT0gZWxlbWVudCkgcmV0dXJuIGNhY2hlZC5wcm94eTtcbiAgY29uc3Qgd3JhcHBlZCA9IHdyYXBFbGVtZW50TWVtYmVyKGVsZW1lbnQsIGVsZW1lbnRTaW5rKHJlYWQsIHdyaXRlLCBpbmRleCksIFtdLCBuZXcgU2V0PG9iamVjdD4oKSk7XG4gIGNhY2hlLnNldChpbmRleCwgeyByZWY6IGVsZW1lbnQsIHByb3h5OiB3cmFwcGVkIH0pO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuLy8gLS0gTGVhdmVzOiB3cml0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFNsb3RzIGZyb20gdGhlIGN1cnJlbnQgZW5kIHVwIHRvIChub3QgaW5jbHVkaW5nKSBgdXBUb2AgYmVjb21lIGBudWxsYCDigJRcbiAqICB0aGUgSlNPTiBzcGVsbGluZyBvZiBhIGhvbGUsIHdoaWNoIGlzIHdoYXQgdGhlIHdob2xlLWFycmF5IHJvdW5kLXRyaXAgdXNlZFxuICogIHRvIHByb2R1Y2UgZm9yIHRoZW0uIE5vLW9wIHdoZW4gYHVwVG9gIGlzIHdpdGhpbiB0aGUgYXJyYXkuICovXG5mdW5jdGlvbiBmaWxsSG9sZXMoYXJyOiB1bmtub3duW10sIHVwVG86IG51bWJlcik6IHZvaWQge1xuICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aDsgaSA8IHVwVG87IGkrKykgYXJyW2ldID0gbnVsbDtcbn1cblxuLyoqIFdIWTogYSBtdXRhdGluZyBtZXRob2QgcnVucyBvbiBhIENPUFksIHdpdGggaXRzIGFyZ3VtZW50cyB0YWtlbiBhcyB2YWx1ZXNcbiAqICAoYSBoYW5kbGUgYmVjb21lcyB3aGF0IGl0IHN0YW5kcyBmb3I7IGEgbnVtYmVyIG9yIGEgY29tcGFyYXRvciBwYXNzZXNcbiAqICB0aHJvdWdoKSwgYW5kIHRoZSBjb3B5IGlzIGNvbW1pdHRlZCB3aG9sZS4gVGhlIGFycmF5IGluIHN0YXRlIGlzIG5ldmVyXG4gKiAgdG91Y2hlZC4gKi9cbmZ1bmN0aW9uIG11dGF0aW5nTWV0aG9kKHJlYWQ6IFJlYWQsIHdyaXRlOiBXcml0ZSwgbmFtZTogc3RyaW5nKTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gICAgY29uc3QgcmVzdWx0ID0gKGNsb25lIGFzIGFueSlbbmFtZV0oLi4uYXJncy5tYXAodW53cmFwSGFuZGxlcykpO1xuICAgIHdyaXRlKGNsb25lKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKiogYGFycltpXSA9IHZgOiBjb3B5LCBgbnVsbGAgdGhlIHNsb3RzIGEgd3JpdGUgcGFzdCB0aGUgZW5kIHNraXBzLCBwbGFjZSB0aGUgdmFsdWUgYXMgYXNzaWduZWQsIGNvbW1pdC4gKi9cbmZ1bmN0aW9uIHNldEluZGV4KHJlYWQ6IFJlYWQsIHdyaXRlOiBXcml0ZSwgaW5kZXg6IG51bWJlciwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgY29uc3QgY2xvbmUgPSBbLi4ucmVhZCgpXTtcbiAgZmlsbEhvbGVzKGNsb25lLCBpbmRleCk7XG4gIGNsb25lW2luZGV4XSA9IHVud3JhcEhhbmRsZXModmFsdWUpO1xuICB3cml0ZShjbG9uZSk7XG59XG5cbi8qKiBgYXJyLmxlbmd0aCA9IG5gOiBjb3B5LCBgbnVsbGAgdGhlIHNsb3RzIGdyb3d0aCBhZGRzLCB0cnVuY2F0ZSBvciBleHRlbmQsIGNvbW1pdC4gKi9cbmZ1bmN0aW9uIHNldExlbmd0aChyZWFkOiBSZWFkLCB3cml0ZTogV3JpdGUsIGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gIGZpbGxIb2xlcyhjbG9uZSwgbGVuZ3RoKTtcbiAgY2xvbmUubGVuZ3RoID0gbGVuZ3RoO1xuICB3cml0ZShjbG9uZSk7XG59XG5cbi8qKiBXSFk6IHdpdGhvdXQgdGhpcyB0cmFwIGBkZWxldGUgaXRlbXNbMl1gIHJlYWNoZXMgdGhlIFJBVyBhcnJheSBjYXB0dXJlZFxuICogIGFzIHRoZSBwcm94eSB0YXJnZXQg4oCUIGNvbW1pdHRlZCBzdGF0ZSwgbm8gY29tbWl0IHJlY29yZC4gSlMgYGRlbGV0ZWAgb24gYW5cbiAqICBpbmRleCBsZWF2ZXMgdGhlIHNsb3QgZW1wdHkgYW5kIHRoZSBsZW5ndGggdW5jaGFuZ2VkLCBhbmQgc28gZG9lcyB0aGlzOlxuICogIHRoZSBlbXB0aWVkIHNsb3QgY29tbWl0cyBhcyBgbnVsbGAsIEpTT04ncyBvbmx5IHNwZWxsaW5nIGZvciBhIGhvbGUuICovXG5mdW5jdGlvbiBkZWxldGVTbG90KHJlYWQ6IFJlYWQsIHdyaXRlOiBXcml0ZSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKTogdm9pZCB7XG4gIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gIGNvbnN0IGluZGV4ID0gdHlwZW9mIHByb3AgPT09ICdzdHJpbmcnID8gTnVtYmVyKHByb3ApIDogTmFOO1xuICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IGNsb25lLmxlbmd0aCkgY2xvbmVbaW5kZXhdID0gbnVsbDtcbiAgZWxzZSBkZWxldGUgKGNsb25lIGFzIGFueSlbcHJvcF07XG4gIHdyaXRlKGNsb25lKTtcbn1cblxuLy8gLS0gTGVhdmVzOiB0aGUgY2hhaW4gYmVsb3cgYW4gZWxlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFdIWTogYW4gYXJyYXkgYW55d2hlcmUgYmVsb3cgYSBzaW5rJ3Mgcm9vdCBpcyBPTkUgd3JpdGUgcGF0aCDigJQgaXQgcmVhZHNcbiAqIHRocm91Z2ggdGhlIHNpbmsgYW5kIGNvbW1pdHMgdGhlIFdIT0xFIG5ldyBhcnJheSBiYWNrIHRocm91Z2ggaXQsIHNvXG4gKiBgcHVzaGAgdGhyZWUgbGV2ZWxzIGRvd24gYW5kIGBhcnJbaV0ueCA9IHZgIGF0IHRoZSB0b3Agc2hhcmUgYSBmdW5uZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVByb3h5QXQoc2luazogV3JpdGVTaW5rLCBwYXRoOiByZWFkb25seSBzdHJpbmdbXSk6IHVua25vd25bXSB7XG4gIHJldHVybiBjcmVhdGVBcnJheVByb3h5KFxuICAgICgpID0+IChzaW5rLnJlYWRBdChwYXRoKSBhcyB1bmtub3duW10pID8/IFtdLFxuICAgIChuZXh0KSA9PiBzaW5rLnB1dChwYXRoLCBuZXh0KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBXcmFwIGEgdmFsdWUgcmVhZCBvdXQgb2YgYW4gZWxlbWVudDogYXJyYXlzIGJlY29tZSBhcnJheSBwcm94aWVzIHdob3NlXG4gKiBjb21taXRzIHJvdXRlIGJhY2sgdGhyb3VnaCB0aGUgb3duaW5nIGFycmF5LCBwbGFpbiBvYmplY3RzIGJlY29tZSBlbGVtZW50XG4gKiBwcm94aWVzIG9uZSBsZXZlbCBkZWVwZXIsIGV2ZXJ5dGhpbmcgZWxzZSBpcyByZXR1cm5lZCBhcy1pcy4gQSB2YWx1ZSBhbHJlYWR5XG4gKiBvbiB0aGUgYWNjZXNzIGNoYWluIChhIGN5Y2xlKSBpcyByZXR1cm5lZCByYXcg4oCUIHRoZSBzYW1lIGJhY2stZWRnZSB0aGVcbiAqIG5lc3RlZC1vYmplY3QgdGVybWluYWwgcHJveHkgdGFrZXMuXG4gKi9cbmZ1bmN0aW9uIHdyYXBFbGVtZW50TWVtYmVyKHZhbHVlOiB1bmtub3duLCBzaW5rOiBXcml0ZVNpbmssIHBhdGg6IHN0cmluZ1tdLCB2aXNpdGVkOiBTZXQ8b2JqZWN0Pik6IHVua25vd24ge1xuICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmICh2aXNpdGVkLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IGJyYW5jaCA9IG5ldyBTZXQodmlzaXRlZCk7XG4gIGJyYW5jaC5hZGQodmFsdWUgYXMgb2JqZWN0KTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYXJyYXlQcm94eUF0KHNpbmssIHBhdGgpO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBwYXRoLCBicmFuY2gpO1xufVxuXG4vLyAtLSBPcmNoZXN0cmF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFByb3h5IG92ZXIgb25lIE9CSkVDVCBlbGVtZW50IChvciBhbiBvYmplY3QgbmVzdGVkIGluc2lkZSBvbmUpLCBjYXJyeWluZyB0aGVcbiAqIHBhdGggZnJvbSB0aGUgZWxlbWVudCBkb3duIHRvIGl0LiBSZWFkcyByZWN1cnNlOyB3cml0ZXMgZ28gYmFjayBvdXQgdGhyb3VnaFxuICogdGhlIG93bmluZyBhcnJheSdzIGNvbW1pdCBjYWxsYmFjayAodGhlIHtAbGluayBlbGVtZW50U2lua30pLlxuICpcbiAqIFJFQURTIEFSRSBMSVZFLiBFdmVyeSB3cml0ZSByZWJ1aWxkcyB0aGUgYXJyYXkgaW1tdXRhYmx5LCBzbyB0aGUgb2JqZWN0IHRoZVxuICogcHJveHkgd2FzIGNyZWF0ZWQgb3ZlciBpcyB0aGUgUFJFLXdyaXRlIGVsZW1lbnQgZm9yIGV2ZXIgYWZ0ZXI7IGEgaGVsZFxuICogaGFuZGxlIHRoYXQgcmVhZCBmcm9tIGl0IHNhdyBpdHMgb3duIHdyaXRlcyB2YW5pc2ggKGBsaW5lLm4gKz0gMWAgdHdpY2VcbiAqIGdhdmUgMiwgYGxpbmUudG90YWwgPSBsaW5lLnF0eSAqIDEwYCB1c2VkIHRoZSBvbGQgYHF0eWAsIGAneCcgaW4gbGluZWAgd2FzXG4gKiBmYWxzZSByaWdodCBhZnRlciBgbGluZS54ID0gMWApLiBFdmVyeSB0cmFwIHRoZXJlZm9yZSByZXNvbHZlcyB0aGUgZWxlbWVudFxuICogdGhyb3VnaCB0aGUgc2luayBmaXJzdCwgYW5kIGZhbGxzIGJhY2sgdG8gdGhlIGNhcHR1cmVkIG9iamVjdCBvbmx5IHdoZW5cbiAqIHRoZSBwYXRoIG5vIGxvbmdlciBleGlzdHMgKHRoZSBzbG90IHdhcyBlbXB0aWVkIG9yIHRoZSBhcnJheSBzaHJhbmspIOKAlCB0aGVcbiAqIHNhbWUgcmVhZC15b3VyLXdyaXRlcyB0aGUgYXJyYXkgcHJveHkgaXRzZWxmIGhhcyBhbHdheXMgaGFkLCBhbmQgdGhlIHNhbWVcbiAqIGxhdyB0aGUgbmVzdGVkIGFuZCB0ZXJtaW5hbCBvYmplY3QgcHJveGllcyBmb2xsb3cgKGxpdmVWaWV3LnRzKS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFByb3h5KFxuICByYXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzaW5rOiBXcml0ZVNpbmssXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdmlzaXRlZDogU2V0PG9iamVjdD4sXG4pOiB1bmtub3duIHtcbiAgY29uc3QgbWVtYmVycyA9IG5ldyBNZW1iZXJDYWNoZSgpO1xuICBjb25zdCBsaXZlID0gKCkgPT4gbGl2ZU9iamVjdChyYXcsIHNpbmsucmVhZEF0KHNlZ21lbnRzKSk7XG4gIHJldHVybiByZW1lbWJlckhhbmRsZShcbiAgICBuZXcgUHJveHkocmF3LCB7XG4gICAgICBnZXQ6IGxpdmVHZXRUcmFwKGxpdmUsIHNlZ21lbnRzLCAodmFsdWUsIHBhdGgpID0+IHdyYXBFbGVtZW50TWVtYmVyKHZhbHVlLCBzaW5rLCBwYXRoLCB2aXNpdGVkKSwgbWVtYmVycyksXG4gICAgICBzZXQ6IHNpbmtTZXRUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBzaW5rRGVsZXRlVHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgICAuLi5saXZlSW5zcGVjdGlvblRyYXBzKGxpdmUpLFxuICAgIH0pLFxuICAgIGxpdmUsXG4gICk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb3h5IG92ZXIgYW4gYXJyYXkgdGhhdCBpbnRlcmNlcHRzIG11dGF0aW5nIG9wZXJhdGlvbnMuXG4gKlxuICogVGhlIGFjdHVhbCBjdXJyZW50IGFycmF5IGlzIHRoZSBQcm94eSB0YXJnZXQ6IE5vZGUuanMgY29uc29sZS5sb2cgaW5zcGVjdHNcbiAqIHRoZSB0YXJnZXQgZGlyZWN0bHkgKGJ5cGFzc2VzIFByb3h5IHRyYXBzKSwgc28gdGhlIHJlYWwgYXJyYXkgc2hvd3MgY29ycmVjdFxuICogdmFsdWVzLiBUaGUgdGFyZ2V0IHJlZmVyZW5jZSBpcyBmaXhlZCBhdCBjcmVhdGlvbiB0aW1lIOKAlCBhZnRlciBtdXRhdGlvbnMsXG4gKiB0aGUgcHJveHkgcmV0dXJucyBhIG5ldyBwcm94eSAodmlhIGNhY2hlIGludmFsaWRhdGlvbikgd2l0aCB0aGUgZnJlc2ggYXJyYXlcbiAqIGFzIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gZ2V0Q3VycmVudCAtIFJldHVybnMgdGhlIGN1cnJlbnQgYXJyYXkgc25hcHNob3QgZnJvbSBzdGF0ZVxuICogQHBhcmFtIGNvbW1pdCAtIENhbGxlZCB3aXRoIHRoZSBuZXcgYXJyYXkgYWZ0ZXIgYSBtdXRhdGlvbiAodHJpZ2dlcnMgc2V0VmFsdWUpXG4gKiBAcmV0dXJucyBQcm94aWVkIGFycmF5IHdpdGggY29weS1vbi13cml0ZSBzZW1hbnRpY3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFycmF5UHJveHk8VD4oZ2V0Q3VycmVudDogKCkgPT4gVFtdLCBjb21taXQ6IChuZXdBcnJheTogVFtdKSA9PiB2b2lkKTogVFtdIHtcbiAgY29uc3QgdGFyZ2V0ID0gZ2V0Q3VycmVudCgpIGFzIFRbXTtcbiAgY29uc3QgcmVhZCA9IGdldEN1cnJlbnQgYXMgdW5rbm93biBhcyBSZWFkO1xuICBjb25zdCB3cml0ZSA9IGNvbW1pdCBhcyB1bmtub3duIGFzIFdyaXRlO1xuICBjb25zdCBlbGVtZW50czogRWxlbWVudENhY2hlID0gbmV3IE1hcCgpO1xuXG4gIC8vIFRoZSBhcnJheSBoYW5kbGUncyB2YWx1ZSBpcyB0aGUgY3VycmVudCBhcnJheSBpdHNlbGYgKGhhbmRsZXMudHMpLlxuICByZXR1cm4gcmVtZW1iZXJIYW5kbGUoXG4gICAgbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgZ2V0KF90YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBNVVRBVElOR19NRVRIT0RTLmhhcyhwcm9wKSkgcmV0dXJuIG11dGF0aW5nTWV0aG9kKHJlYWQsIHdyaXRlLCBwcm9wKTtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHJlYWQoKTtcbiAgICAgICAgaWYgKHByb3AgPT09ICdsZW5ndGgnKSByZXR1cm4gY3VycmVudC5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhJbihjdXJyZW50LCBwcm9wKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWRFbGVtZW50KGVsZW1lbnRzLCBjdXJyZW50W2luZGV4XSwgaW5kZXgsIHJlYWQsIHdyaXRlKTtcbiAgICAgICAgaWYgKHByb3AgPT09IFN5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJykpIHJldHVybiAoKSA9PiBjdXJyZW50O1xuICAgICAgICByZXR1cm4gYm91bmRNZW1iZXIoY3VycmVudCwgcHJvcCk7XG4gICAgICB9LFxuICAgICAgc2V0KF90YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhOYW1lZChwcm9wKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHNldEluZGV4KHJlYWQsIHdyaXRlLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICBlbHNlIGlmIChwcm9wID09PSAnbGVuZ3RoJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSBzZXRMZW5ndGgocmVhZCwgd3JpdGUsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIGFueSBvdGhlciBzZXQgaXMgaWdub3JlZCAoYW4gZXhwYW5kbyBvbiBhbiBhcnJheSBpcyBvdXQgb2YgY29udHJhY3Qg4oCUIFJFQURNRSlcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eShfdGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGRlbGV0ZVNsb3QocmVhZCwgd3JpdGUsIHByb3ApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBoYXM6IChfdGFyZ2V0LCBwcm9wKSA9PiBSZWZsZWN0LmhhcyhyZWFkKCksIHByb3ApLFxuICAgICAgb3duS2V5czogKCkgPT4gUmVmbGVjdC5vd25LZXlzKHJlYWQoKSksXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IChfdGFyZ2V0LCBwcm9wKSA9PiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJlYWQoKSwgcHJvcCksXG4gICAgfSksXG4gICAgcmVhZCxcbiAgKTtcbn1cbiJdfQ==
@@ -19,14 +19,19 @@ exports.createTypedScope = void 0;
19
19
  const pathOps_js_1 = require("../memory/pathOps.js");
20
20
  const allowlist_js_1 = require("./allowlist.js");
21
21
  const arrayTraps_js_1 = require("./arrayTraps.js");
22
+ const handles_js_1 = require("./handles.js");
22
23
  const liveView_js_1 = require("./liveView.js");
23
- const structuralWrite_js_1 = require("./structuralWrite.js");
24
24
  const types_js_1 = require("./types.js");
25
25
  const writeTraps_js_1 = require("./writeTraps.js");
26
26
  const METHOD_ROUTES = {
27
27
  $getValue: (t) => t.getValue.bind(t),
28
- $setValue: (t) => t.setValue.bind(t),
29
- $update: (t) => t.updateValue.bind(t),
28
+ // A handle the scope handed out is a value it accepts back (handles.ts):
29
+ // `$setValue('copy', scope.customer)` stores the value behind the handle,
30
+ // not a Proxy the commit could never clone. The set trap does the same for
31
+ // `scope.copy = scope.customer`; these are the explicit doors. A
32
+ // handle-free value passes through by reference.
33
+ $setValue: (t) => (key, value, shouldRedact, description) => t.setValue(key, (0, handles_js_1.unwrapHandles)(value), shouldRedact, description),
34
+ $update: (t) => (key, value, description) => t.updateValue(key, (0, handles_js_1.unwrapHandles)(value), description),
30
35
  $delete: (t) => t.deleteValue.bind(t),
31
36
  $read: (t) => (dotPath) => {
32
37
  const rootKey = dotPath.split('.')[0];
@@ -58,8 +63,10 @@ const METHOD_ROUTES = {
58
63
  const clone = Array.isArray(current) ? structuredClone(current) : [];
59
64
  // User applies all mutations to the plain clone — no Proxy, no per-mutation commit
60
65
  fn(clone);
61
- // One setValue — fires onWrite once with the final array
62
- t.setValue(key, clone);
66
+ // One setValue — fires onWrite once with the final array. The stage may
67
+ // have pushed handles into the clone (`arr.push(scope.template)`) — they
68
+ // are values by the time the array is staged (handles.ts).
69
+ t.setValue(key, (0, handles_js_1.unwrapHandles)(clone));
63
70
  },
64
71
  $break: (_t, opts) => (reason) => {
65
72
  if (!opts.breakFn)
@@ -131,12 +138,12 @@ function createTerminalProxy(obj, sink, segments, visited = new Set()) {
131
138
  return value;
132
139
  return createTerminalProxy(value, sink, path, visited);
133
140
  };
134
- return new Proxy(obj, {
141
+ return (0, handles_js_1.rememberHandle)(new Proxy(obj, {
135
142
  get: (0, liveView_js_1.liveGetTrap)(live, segments, child, members),
136
143
  set: (0, writeTraps_js_1.sinkSetTrap)(sink, segments),
137
144
  deleteProperty: (0, writeTraps_js_1.sinkDeleteTrap)(sink, segments),
138
145
  ...(0, liveView_js_1.liveInspectionTraps)(live),
139
- });
146
+ }), live);
140
147
  }
141
148
  function createNestedProxy(obj, sink, segments, ancestors = new Set()) {
142
149
  // Reads are LIVE (9.22.0): a held proxy reads its own writes, `'x' in o`
@@ -155,12 +162,12 @@ function createNestedProxy(obj, sink, segments, ancestors = new Set()) {
155
162
  return createTerminalProxy(value, sink, path);
156
163
  return createNestedProxy(value, sink, path, new Set(ancestors).add(value));
157
164
  };
158
- return new Proxy(obj, {
165
+ return (0, handles_js_1.rememberHandle)(new Proxy(obj, {
159
166
  get: (0, liveView_js_1.liveGetTrap)(live, segments, child, members),
160
167
  set: (0, writeTraps_js_1.sinkSetTrap)(sink, segments),
161
168
  deleteProperty: (0, writeTraps_js_1.sinkDeleteTrap)(sink, segments),
162
169
  ...(0, liveView_js_1.liveInspectionTraps)(live),
163
- });
170
+ }), live);
164
171
  }
165
172
  // -- Top-level leaves ---------------------------------------------------------
166
173
  /** `internalRead` answered nothing: the name is a state key and must be read (tracked) from the target. */
@@ -225,12 +232,13 @@ function wrapStateValue(target, readSilent, state, key, value) {
225
232
  }, []);
226
233
  }
227
234
  /** WHY: a `$`-name can never be a state key — the write is refused, not shadowed; every other assignment
228
- * stores the unwrapped value (landmine 1) and drops the key's cached proxy. */
235
+ * stores the value AS ASSIGNED (a handle becomes what it stands for, `handles.ts`; the buffer detaches at
236
+ * commit — the same law as `$setValue`, 9.24.0) and drops the key's cached proxy. */
229
237
  function assignStateKey(target, state, key, value) {
230
238
  if (types_js_1.SCOPE_METHOD_NAMES.has(key)) {
231
239
  throw new Error(`Cannot set state key "${key}" -- it conflicts with a reserved TypedScope method. Rename the state key to avoid $-prefixed names.`);
232
240
  }
233
- target.setValue(key, (0, structuralWrite_js_1.unwrapProxy)(value));
241
+ target.setValue(key, (0, handles_js_1.unwrapHandles)(value));
234
242
  state.childCache.delete(key);
235
243
  }
236
244
  /** Does the key exist — answered without a tracked read wherever the target can; `getValue` is the last resort. */
@@ -296,4 +304,4 @@ function createTypedScope(target, options) {
296
304
  });
297
305
  }
298
306
  exports.createTypedScope = createTypedScope;
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7OztBQUVILHFEQUE4RDtBQUM5RCxpREFBcUQ7QUFDckQsbURBQStDO0FBQy9DLCtDQUF3RztBQUN4Ryw2REFBbUQ7QUFFbkQseUNBQXlHO0FBQ3pHLG1EQUEyRjtBQU0zRixNQUFNLGFBQWEsR0FBaUM7SUFDbEQsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQWUsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QyxPQUFPLElBQUEsc0JBQVMsRUFBQyxLQUFLLEVBQUUsT0FBTyxD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SUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3RixPQUFPLDZCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUNoQyx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsSUFBSTtZQUN6QyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSw2QkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUFFLE9BQU8sU0FBUyxDQUFDLENBQUMsK0JBQStCO1lBQy9HLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLHdDQUF3QztRQUMzRyxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWpDRCw0Q0FpQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlL2NyZWF0ZVR5cGVkU2NvcGUgLS0gQ29yZSBQcm94eSBmYWN0b3J5IGZvciBUeXBlZFNjb3BlPFQ+LlxuICpcbiAqIFdyYXBzIGEgUmVhY3RpdmVUYXJnZXQgKFNjb3BlRmFjYWRlKSBpbiBhIFByb3h5IHRoYXQgcHJvdmlkZXM6XG4gKiAtIFR5cGVkIHByb3BlcnR5IGFjY2Vzczogc2NvcGUuY3JlZGl0VGllciAocmVhZCksIHNjb3BlLmNyZWRpdFRpZXIgPSAnQScgKHdyaXRlKVxuICogLSBEZWVwIHdyaXRlIGludGVyY2VwdGlvbjogc2NvcGUuY3VzdG9tZXIuYWRkcmVzcy56aXAgPSAnOTAyMTAnXG4gKiAtIEFycmF5IG11dGF0aW9uIGludGVyY2VwdGlvbjogc2NvcGUuaXRlbXMucHVzaCgnbmV3JylcbiAqIC0gJC1wcmVmaXhlZCBlc2NhcGUgaGF0Y2hlczogJGdldFZhbHVlLCAkc2V0VmFsdWUsICRyZWFkLCAkZ2V0QXJncywgZXRjLlxuICpcbiAqIFJlYWQgc2VtYW50aWNzOiB0b3AtbGV2ZWwgZ2V0IGNhbGxzIGdldFZhbHVlKCkgKGZpcmVzIG9uUmVhZCBPTkNFKS5cbiAqICAgTmVzdGVkIGdldCB0cmFwcyBuYXZpZ2F0ZSBpbi1tZW1vcnkgLS0gbm8gYWRkaXRpb25hbCBvblJlYWQuXG4gKlxuICogV3JpdGUgc2VtYW50aWNzOiB0b3AtbGV2ZWwgc2V0IGNhbGxzIHNldFZhbHVlKCkuIE5lc3RlZCBzZXQgY2FsbHNcbiAqICAgdXBkYXRlVmFsdWUoKSB3aXRoIGEgcGFydGlhbCBvYmplY3QgYnVpbHQgZnJvbSB0aGUgYWNjdW11bGF0ZWQgcGF0aC5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgbG9kYXNoR2V0IH0gZnJvbSAnLi4vbWVtb3J5L3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgc2hvdWxkV3JhcFdpdGhQcm94eSB9IGZyb20gJy4vYWxsb3dsaXN0LmpzJztcbmltcG9ydCB7IGFycmF5UHJveHlBdCB9IGZyb20gJy4vYXJyYXlUcmFwcy5qcyc7XG5pbXBvcnQgeyBjYWNoZWRNZW1iZXIsIGxpdmVHZXRUcmFwLCBsaXZlSW5zcGVjdGlvblRyYXBzLCBsaXZlT2JqZWN0LCBNZW1iZXJDYWNoZSB9IGZyb20gJy4vbGl2ZVZpZXcuanMnO1xuaW1wb3J0IHsgdW53cmFwUHJveHkgfSBmcm9tICcuL3N0cnVjdHVyYWxXcml0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQsIFR5cGVkU2NvcGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IEJSRUFLX1NFVFRFUiwgRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUywgSVNfVFlQRURfU0NPUEUsIFNDT1BFX01FVEhPRF9OQU1FUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBXcml0ZVNpbmssIHJvb3RLZXlTaW5rLCBzaW5rRGVsZXRlVHJhcCwgc2lua1NldFRyYXAgfSBmcm9tICcuL3dyaXRlVHJhcHMuanMnO1xuXG4vLyAtLSAkLW1ldGhvZCByb3V0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgTWV0aG9kUm91dGVyID0gKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIG9wdHM6IFJlYWN0aXZlU3RhdGUpID0+IHVua25vd247XG5cbmNvbnN0IE1FVEhPRF9ST1VURVM6IFJlY29yZDxzdHJpbmcsIE1ldGhvZFJvdXRlcj4gPSB7XG4gICRnZXRWYWx1ZTogKHQpID0+IHQuZ2V0VmFsdWUuYmluZCh0KSxcbiAgJHNldFZhbHVlOiAodCkgPT4gdC5zZXRWYWx1ZS5iaW5kKHQpLFxuICAkdXBkYXRlOiAodCkgPT4gdC51cGRhdGVWYWx1ZS5iaW5kKHQpLFxuICAkZGVsZXRlOiAodCkgPT4gdC5kZWxldGVWYWx1ZS5iaW5kKHQpLFxuICAkcmVhZDogKHQpID0+IChkb3RQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb290S2V5ID0gZG90UGF0aC5zcGxpdCgnLicpWzBdO1xuICAgIGNvbnN0IHZhbHVlID0gdC5nZXRWYWx1ZShyb290S2V5KTtcbiAgICBpZiAoIWRvdFBhdGguaW5jbHVkZXMoJy4nKSkgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBsb2Rhc2hHZXQodmFsdWUsIGRvdFBhdGguc2xpY2Uocm9vdEtleS5sZW5ndGggKyAxKSk7XG4gIH0sXG4gICRnZXRBcmdzOiAodCkgPT4gdC5nZXRBcmdzLmJpbmQodCksXG4gICRnZXRFbnY6ICh0KSA9PiB0LmdldEVudi5iaW5kKHQpLFxuICAkZGVidWc6ICh0KSA9PiB0LmFkZERlYnVnSW5mby5iaW5kKHQpLFxuICAkbG9nOiAodCkgPT4gdC5hZGREZWJ1Z01lc3NhZ2UuYmluZCh0KSxcbiAgJGVycm9yOiAodCkgPT4gdC5hZGRFcnJvckluZm8uYmluZCh0KSxcbiAgJG1ldHJpYzogKHQpID0+IHQuYWRkTWV0cmljLmJpbmQodCksXG4gICRldmFsOiAodCkgPT4gdC5hZGRFdmFsLmJpbmQodCksXG4gICRhdHRhY2hTY29wZVJlY29yZGVyOiAodCkgPT4gdC5hdHRhY2hTY29wZVJlY29yZGVyLmJpbmQodCksXG4gICRkZXRhY2hTY29wZVJlY29yZGVyOiAodCkgPT4gdC5kZXRhY2hTY29wZVJlY29yZGVyLmJpbmQodCksXG4gICRnZXRTY29wZVJlY29yZGVyczogKHQpID0+IHQuZ2V0U2NvcGVSZWNvcmRlcnMuYmluZCh0KSxcbiAgJGJhdGNoQXJyYXk6ICh0KSA9PiAoa2V5OiBzdHJpbmcsIGZuOiAoYXJyOiB1bmtub3duW10pID0+IHZvaWQpID0+IHtcbiAgICAvLyBPbmUgZ2V0VmFsdWUg4oCUIGZpcmVzIG9uUmVhZCBvbmNlXG4gICAgY29uc3QgY3VycmVudCA9IHQuZ2V0VmFsdWUoa2V5KTtcbiAgICAvLyBDbG9uZSBvbmNlIOKAlCBERUVQIChvciBzdGFydCBlbXB0eSBpZiBtaXNzaW5nL25vbi1hcnJheSkuIFRoZSByZWFkIGlzXG4gICAgLy8gQk9SUk9XRUQ6IGJlZm9yZSB0aGUgc3RhZ2UncyBmaXJzdCBzdGFnZWQgd3JpdGUgaXQgaXMgY29tbWl0dGVkIHNoYXJlZFxuICAgIC8vIG1lbW9yeSBpdHNlbGYsIHNvIGEgc2hhbGxvdyBgWy4uLmN1cnJlbnRdYCBoYW5kZWQgdGhlIHN0YWdlIHRoZVxuICAgIC8vIGNvbW1pdHRlZCBFTEVNRU5UUyBhbmQgYGFyclswXS5uID0gOWAgZWRpdGVkIGNvbW1pdHRlZCBzdGF0ZSBpbiBwbGFjZVxuICAgIC8vIHdpdGggbm8gdHJhY2Ugcm93IChhbmQgdGhlIGxhenkgYnVmZmVyJ3MgYmFzZSB3YXMgdGhlbiB0YWtlbiBBRlRFUiB0aGVcbiAgICAvLyBlZGl0LCBzbyB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIgc2F3IG5vdGhpbmcpLiBTdGF0ZSB2YWx1ZXMgc3Vydml2ZVxuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgIGJ5IGNvbnRyYWN0LCBzbyB0aGUgd29ya2luZyBjb3B5IGlzIGEgZnVsbCBjb3B5LlxuICAgIGNvbnN0IGNsb25lOiB1bmtub3duW10gPSBBcnJheS5pc0FycmF5KGN1cnJlbnQpID8gc3RydWN0dXJlZENsb25lKGN1cnJlbnQpIDogW107XG4gICAgLy8gVXNlciBhcHBsaWVzIGFsbCBtdXRhdGlvbnMgdG8gdGhlIHBsYWluIGNsb25lIOKAlCBubyBQcm94eSwgbm8gcGVyLW11dGF0aW9uIGNvbW1pdFxuICAgIGZuKGNsb25lKTtcbiAgICAvLyBPbmUgc2V0VmFsdWUg4oCUIGZpcmVzIG9uV3JpdGUgb25jZSB3aXRoIHRoZSBmaW5hbCBhcnJheVxuICAgIHQuc2V0VmFsdWUoa2V5LCBjbG9uZSk7XG4gIH0sXG4gICRicmVhazogKF90LCBvcHRzKSA9PiAocmVhc29uPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFvcHRzLmJyZWFrRm4pIHRocm93IG5ldyBFcnJvcignJGJyZWFrKCkgaXMgbm90IGF2YWlsYWJsZSBvdXRzaWRlIHN0YWdlIGV4ZWN1dGlvbicpO1xuICAgIG9wdHMuYnJlYWtGbihyZWFzb24pO1xuICB9LFxuICAvLyBPYnNlcnZhYmlsaXR5IOKAlCBFbWl0IGNoYW5uZWwgKFBoYXNlIDMpLiBSb3V0ZXMgdG8gU2NvcGVGYWNhZGUuZW1pdEV2ZW50XG4gIC8vIHdoaWNoIGhhbmRsZXMgZmFzdC1wYXRoLCBlbnJpY2htZW50LCByZWRhY3Rpb24sIGFuZCBlcnJvciBpc29sYXRpb24uXG4gICRlbWl0OiAodCkgPT4gdC5lbWl0RXZlbnQuYmluZCh0KSxcbiAgLy8gRGV0YWNoIChUNCkg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnRzLiBEZWxlZ2F0ZXMgdG8gU2NvcGVGYWNhZGVcbiAgLy8gd2hpY2ggbWludGVkIHJlZklkcyBmcm9tIHJ1bnRpbWVTdGFnZUlkLlxuICAkZGV0YWNoQW5kSm9pbkxhdGVyOiAodCkgPT4gdC5kZXRhY2hBbmRKb2luTGF0ZXIuYmluZCh0KSxcbiAgJGRldGFjaEFuZEZvcmdldDogKHQpID0+IHQuZGV0YWNoQW5kRm9yZ2V0LmJpbmQodCksXG4gICR0b1JhdzogKHQpID0+ICgpID0+IHQsXG59O1xuXG4vLyAtLSBHdWFyZCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGVzZSBtdXN0IGJlIGhhbmRsZWQgdG8gcHJldmVudCBQcm94eSBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBQcm9taXNlLFxuLy8gYnJlYWtpbmcgaW5zdGFuY2VvZiBjaGVja3MsIG9yIGNvbmZ1c2luZyB0ZXN0IG1hdGNoZXJzLlxuXG5jb25zdCBHVUFSRF9QUk9QUzogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4gPSB7XG4gIHRoZW46IHVuZGVmaW5lZCwgLy8gcHJldmVudCBQcm9taXNlIGRldGVjdGlvblxuICBhc3ltbWV0cmljTWF0Y2g6IHVuZGVmaW5lZCwgLy8gcHJldmVudCB2aXRlc3QvamVzdCBtYXRjaGVyIGNvbmZ1c2lvblxuICBjb25zdHJ1Y3RvcjogT2JqZWN0LCAvLyBzYWZlIHByb3RvdHlwZVxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ1R5cGVkU2NvcGUnLFxufTtcblxuLy8gLS0gU2lsZW50IGV4aXN0ZW5jZSBjaGVjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIERvZXMgdGhpcyBrZXkgZXhpc3QgaW4gc3RhdGUsIGFuc3dlcmVkIHdpdGggTk8gdHJhY2tpbmcgc2lkZSBlZmZlY3QgYXQgYWxsP1xuICpcbiAqIGBnZXRTdGF0ZUtleXMoKWAgaXMgdGhlIG9ubHkgaW5zcGVjdGlvbiBhIFNjb3BlRmFjYWRlIGFuc3dlcnMgd2l0aG91dCByb3V0aW5nXG4gKiB0aHJvdWdoIHRoZSB0cmFja2VkIHJlYWQgcGF0aC4gYGhhc0tleSgpYCBkZWxpYmVyYXRlbHkgRE9FUyByb3V0ZSB0aHJvdWdoIGl0OlxuICogYCdrJyBpbiBzY29wZWAgaXMgYSByZWFsIHF1ZXN0aW9uIGFib3V0IHN0YXRlIHRoYXQgYSBzdGFnZSBjYW4gYnJhbmNoIG9uLCBzb1xuICogaXQgcmVnaXN0ZXJzIGFzIGEgcmVhZCDigJQgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhpcyBwcm9iZSBtdXN0IG5vdCB1c2UgaXQuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSB0YXJnZXQgb2ZmZXJzIG5vIHNpbGVudCBhbnN3ZXI7IGNhbGxlcnMgbXVzdFxuICogdGhlbiBjaG9vc2UgZGVsaWJlcmF0ZWx5IHJhdGhlciB0aGFuIGFzc3VtZS5cbiAqL1xuZnVuY3Rpb24gc2lsZW50bHlLbm93bktleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBpZiAoIXRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCkuaW5jbHVkZXMoa2V5KTtcbn1cblxuLy8gLS0gTXV0YWJsZSBzdGF0ZSBwZXIgcHJveHkgaW5zdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgUmVhY3RpdmVTdGF0ZSB7XG4gIGJyZWFrRm4/OiAocmVhc29uPzogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogVGhlIHRvcC1sZXZlbCBrZXkncyBjaGlsZCBwcm94eSwgdmFsaWRhdGVkIGJ5IHJhdyBpZGVudGl0eSAoYGxpdmVWaWV3LnRzIMK3IGNhY2hlZE1lbWJlcmApOyBhIHNpbmsgZHJvcHMgdGhlIGtleSBvbiB3cml0ZS4gKi9cbiAgY2hpbGRDYWNoZTogTWVtYmVyQ2FjaGU7XG59XG5cbi8vIC0tIE5lc3RlZCBjaGlsZCBwcm94aWVzIChmb3IgZGVlcCB3cml0ZSBpbnRlcmNlcHRpb24pIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gQm90aCBmYWN0b3JpZXMgYXJlIE9SQ0hFU1RSQVRPUlMgKDkuMjMuMSk6IHJlYWRzIGFyZSBgbGl2ZVZpZXcudHNgLCB3cml0ZXNcbi8vIGFyZSBgd3JpdGVUcmFwcy50c2Agb3ZlciBhIGByb290S2V5U2lua2AsIGFuZCB0aGUgT05FIHRoaW5nIGVhY2ggZGVjaWRlc1xuLy8gaXRzZWxmIGlzIHdoYXQgYSBjaGlsZCBtZW1iZXIgYmVjb21lcyDigJQgdGhlIGN5Y2xlIHBvbGljeS4gRWFjaCBob2xkcyBpdHNcbi8vIG93biBwZXItbWVtYmVyIHByb3h5IGNhY2hlICg5LjIzLjIsIGBsaXZlVmlldy50cyDCtyBjYWNoZWRNZW1iZXJgKS5cbi8vXG4vLyBDeWNsZSBzYWZldHk6IGFuIGltbXV0YWJsZSBTZXQ8b2JqZWN0PiBvZiBhbmNlc3RvciBvYmplY3RzIGlzIHBhc3NlZCBkb3duXG4vLyBlYWNoIGFjY2VzcyBjaGFpbi4gRWFjaCBicmFuY2ggZ2V0cyBpdHMgb3duIGNvcHkgKG5ldyBTZXQocGFyZW50KSkgc29cbi8vIHNjb3BlLnguZnJpZW5kIGFuZCBzY29wZS54LmNvd29ya2VyIGRvbid0IHBvbGx1dGUgZWFjaCBvdGhlcidzIHRyYWNraW5nLlxuLy8gV2hlbiBhIGNoaWxkIHZhbHVlIGlzIGFscmVhZHkgaW4gdGhlIGFuY2VzdG9yIHNldCwgd2UndmUgaGl0IGEgY3ljbGUuXG4vLyBBdCB0aGUgY3ljbGUgYnJlYWs6IHJldHVybiBhIHRlcm1pbmFsIHByb3h5IHRoYXQgdHJhY2tzIHdyaXRlcyAoc2V0IHRyYXBcbi8vIHN0aWxsIGJ1aWxkcyBwYXRoICsgY29tbWl0cyB0aHJvdWdoIHRoZSBzaW5rKSBidXQgZG9lc24ndCByZWN1cnNlIHJlYWRzXG4vLyBmdXJ0aGVyLiBUaGUgdGVybWluYWwgY2hhaW4gc2hhcmVzIE9ORSBtdXRhYmxlIGB2aXNpdGVkYCBzZXQ6IGEgdmFsdWUgc2VlblxuLy8gYW55d2hlcmUgcGFzdCB0aGUgY3ljbGUgZWRnZSBpcyBoYW5kZWQgYmFjayByYXcuXG5cbmZ1bmN0aW9uIGNyZWF0ZVRlcm1pbmFsUHJveHkoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNpbms6IFdyaXRlU2luayxcbiAgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB2aXNpdGVkOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICB2aXNpdGVkLmFkZChvYmopO1xuICBjb25zdCBtZW1iZXJzID0gbmV3IE1lbWJlckNhY2hlKCk7XG4gIGNvbnN0IGxpdmUgPSAoKSA9PiBsaXZlT2JqZWN0KG9iaiwgc2luay5yZWFkQXQoc2VnbWVudHMpKTtcbiAgY29uc3QgY2hpbGQgPSAodmFsdWU6IHVua25vd24sIHBhdGg6IHN0cmluZ1tdKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIC8vIEFuIGFycmF5IHBhc3QgdGhlIGN5Y2xlIGVkZ2Ugc3RpbGwgZ2V0cyBjb3B5LW9uLXdyaXRlIGludGVyY2VwdGlvbiDigJRcbiAgICAvLyBpdCBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIHJvb3Qga2V5LCB0aGUgc2FtZSBsYXcgYXMgdGhlIG5lc3RlZCBwcm94eS5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHZhbHVlIGFzIG9iamVjdCkpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCwgdmlzaXRlZCk7XG4gIH07XG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0OiBsaXZlR2V0VHJhcChsaXZlLCBzZWdtZW50cywgY2hpbGQsIG1lbWJlcnMpLFxuICAgIHNldDogc2lua1NldFRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgIGRlbGV0ZVByb3BlcnR5OiBzaW5rRGVsZXRlVHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgLi4ubGl2ZUluc3BlY3Rpb25UcmFwcyhsaXZlKSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5lc3RlZFByb3h5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzaW5rOiBXcml0ZVNpbmssXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICAvLyBSZWFkcyBhcmUgTElWRSAoOS4yMi4wKTogYSBoZWxkIHByb3h5IHJlYWRzIGl0cyBvd24gd3JpdGVzLCBgJ3gnIGluIG9gXG4gIC8vIGFuZCBgT2JqZWN0LmtleXMobylgIHNlZSB0aGVtLCBhbmQgYG8uYiA9IG8uYSAqIDEwYCB1c2VzIHRoZSBuZXcgYGFgLlxuICAvLyBUaGUgY2FwdHVyZWQgb2JqZWN0IGFuc3dlcnMgb25seSB3aGVuIHRoZSBwYXRoIGlzIGdvbmUg4oCUIHNlZSBsaXZlVmlldy50cy5cbiAgY29uc3QgbWVtYmVycyA9IG5ldyBNZW1iZXJDYWNoZSgpO1xuICBjb25zdCBsaXZlID0gKCkgPT4gbGl2ZU9iamVjdChvYmosIHNpbmsucmVhZEF0KHNlZ21lbnRzKSk7XG4gIGNvbnN0IGNoaWxkID0gKHZhbHVlOiB1bmtub3duLCBwYXRoOiBzdHJpbmdbXSk6IHVua25vd24gPT4ge1xuICAgIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICAvLyBBbiBhcnJheSBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIFJPT1QgS0VZIChyZWFjdGl2ZS9SRUFETUUubWQsIGxhdyAzKVxuICAgIC8vIOKAlCB0aGUgc2luaydzIHZlcmIsIHdoYXRldmVyIGRlcHRoIHRoZSBhcnJheSBzaXRzIGF0LlxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGFycmF5UHJveHlBdChzaW5rLCBwYXRoKTtcbiAgICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCk7XG4gICAgcmV0dXJuIGNyZWF0ZU5lc3RlZFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBwYXRoLCBuZXcgU2V0KGFuY2VzdG9ycykuYWRkKHZhbHVlIGFzIG9iamVjdCkpO1xuICB9O1xuICByZXR1cm4gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldDogbGl2ZUdldFRyYXAobGl2ZSwgc2VnbWVudHMsIGNoaWxkLCBtZW1iZXJzKSxcbiAgICBzZXQ6IHNpbmtTZXRUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICBkZWxldGVQcm9wZXJ0eTogc2lua0RlbGV0ZVRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgIC4uLmxpdmVJbnNwZWN0aW9uVHJhcHMobGl2ZSksXG4gIH0pO1xufVxuXG4vLyAtLSBUb3AtbGV2ZWwgbGVhdmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogYGludGVybmFsUmVhZGAgYW5zd2VyZWQgbm90aGluZzogdGhlIG5hbWUgaXMgYSBzdGF0ZSBrZXkgYW5kIG11c3QgYmUgcmVhZCAodHJhY2tlZCkgZnJvbSB0aGUgdGFyZ2V0LiAqL1xuY29uc3QgU1RBVEVfS0VZOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdzdGF0ZS1rZXknKTtcblxuLyoqXG4gKiBXSFk6IHRoZSBuYW1lcyB0aGUgc2NvcGUgYW5zd2VycyBJVFNFTEYg4oCUIGludGVybmFsIHN5bWJvbHMsIHRoZSBndWFyZFxuICogcHJvcGVydGllcywgTm9kZSdzIGluc3BlY3QgaG9vaywgdGhlIGAkYC1tZXRob2RzLCB0aGUgZXhlY3V0b3IncyBhbGxvd2xpc3RlZFxuICogcGFzcy10aHJvdWdocyAoYGF0dGFjaFNjb3BlUmVjb3JkZXJgLCBgbm90aWZ5U3RhZ2VTdGFydGAsIOKApiwgY2FsbGVkIGRpcmVjdGx5XG4gKiBvbiB0aGUgc2NvcGUpIGFuZCB0aGUgSlNPTiBwcm9iZSDigJQgbXVzdCBuZXZlciBiZWNvbWUgdHJhY2tlZCByZWFkcztcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBpcyBhIHN0YXRlIGtleSBhbmQgaXMgbGVmdCB0byB0aGUgY2FsbGVyLlxuICpcbiAqIFRoZSBwcm9iZTogYEpTT04uc3RyaW5naWZ5YCBhc2tzIEVWRVJZIHZhbHVlIGZvciBhIGB0b0pTT05gIG1ldGhvZC4gVGhhdFxuICogcXVlc3Rpb24gY29tZXMgZnJvbSB0aGUgcnVudGltZSwgbm90IHRoZSBzdGFnZSBhdXRob3IsIHNvIGl0IG11c3Qgbm90IGVudGVyXG4gKiB0aGUgcmVhZCBzZXQuIEEgc3RhdGUga2V5IGxpdGVyYWxseSBjYWxsZWQgJ3RvSlNPTicgaXMgbGVnYWw6IHdoZW4gaXQgRVhJU1RTXG4gKiB0aGlzIGlzIGEgZ2VudWluZSByZWFkIGFuZCBzdGF5cyB0cmFja2VkLCBhbmQgd2hlbiB0aGUgdGFyZ2V0IGNhbm5vdCBhbnN3ZXJcbiAqIHNpbGVudGx5LCB0cnV0aCB3aW5zIG92ZXIgbm9pc2Ug4oCUIGZhbGwgdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gaW50ZXJuYWxSZWFkKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgaWYgKHByb3AgPT09IElTX1RZUEVEX1NDT1BFKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHByb3AgPT09IEJSRUFLX1NFVFRFUikge1xuICAgIHJldHVybiAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgIHN0YXRlLmJyZWFrRm4gPSBmbjtcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKSkgcmV0dXJuIEdVQVJEX1BST1BTW3Byb3BdO1xuICAgIGlmIChwcm9wID09PSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpKSByZXR1cm4gKCkgPT4gdGFyZ2V0LmdldFZhbHVlKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKSkgcmV0dXJuIEdVQVJEX1BST1BTW3Byb3BdO1xuICBpZiAoU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkgcmV0dXJuIE1FVEhPRF9ST1VURVNbcHJvcF0/Lih0YXJnZXQsIHN0YXRlKTtcbiAgaWYgKEVYRUNVVE9SX0lOVEVSTkFMX01FVEhPRFMuaGFzKHByb3ApICYmIHR5cGVvZiAodGFyZ2V0IGFzIGFueSlbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gKHRhcmdldCBhcyBhbnkpW3Byb3BdLmJpbmQodGFyZ2V0KTtcbiAgfVxuICBpZiAocHJvcCA9PT0gJ3RvSlNPTicgJiYgc2lsZW50bHlLbm93bktleSh0YXJnZXQsIHByb3ApID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIFNUQVRFX0tFWTtcbn1cblxuLyoqXG4gKiBBIHdyYXBwYWJsZSBzdGF0ZSB2YWx1ZSBiZWNvbWVzIHRoZSBhcnJheSBvciBuZXN0ZWQgcHJveHkgZm9yIGl0cyBrZXk7XG4gKiBhbnl0aGluZyBlbHNlIGlzIGhhbmRlZCBiYWNrIHJhdy4gYHNjb3BlLmsgPT09IHNjb3BlLmtgIGhvbGRzIHdpdGhpbiBhXG4gKiBzdGFnZSB0aHJvdWdoIHRoZSBzYW1lIHBlci1tZW1iZXIgY2FjaGUgZXZlcnkgb2JqZWN0IHByb3h5IHVzZXNcbiAqIChgbGl2ZVZpZXcudHMgwrcgY2FjaGVkTWVtYmVyYCk6IGEgd3JpdGUgdG8gdGhlIGtleSBkcm9wcyB0aGUgZW50cnkgKHRoZVxuICogc2luayBkb2VzIGl0KSwgYSBjb21taXQgc3dhcHMgdGhlIHZhbHVlIGFuZCB0aGUgcmVmIGNoZWNrIG1pc3NlcyDigJQgZWl0aGVyXG4gKiB3YXkgdGhlIG5leHQgcmVhZCBidWlsZHMgYSBmcmVzaCBwcm94eSBvdmVyIHRoZSBuZXcgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHdyYXBTdGF0ZVZhbHVlKFxuICB0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LFxuICByZWFkU2lsZW50OiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24sXG4gIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7IC8vIERhdGUsIE1hcCwgY2xhc3MgaW5zdGFuY2UsIGZyb3plbiDigKZcbiAgcmV0dXJuIGNhY2hlZE1lbWJlcihcbiAgICBzdGF0ZS5jaGlsZENhY2hlLFxuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBzaW5rID0gcm9vdEtleVNpbmsodGFyZ2V0LCByZWFkU2lsZW50LCBrZXksIHN0YXRlLmNoaWxkQ2FjaGUpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYXJyYXlQcm94eUF0KHNpbmssIFtdKTtcbiAgICAgIHJldHVybiBjcmVhdGVOZXN0ZWRQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgW10sIG5ldyBTZXQ8b2JqZWN0PihbdmFsdWVdKSk7XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcbn1cblxuLyoqIFdIWTogYSBgJGAtbmFtZSBjYW4gbmV2ZXIgYmUgYSBzdGF0ZSBrZXkg4oCUIHRoZSB3cml0ZSBpcyByZWZ1c2VkLCBub3Qgc2hhZG93ZWQ7IGV2ZXJ5IG90aGVyIGFzc2lnbm1lbnRcbiAqICBzdG9yZXMgdGhlIHVud3JhcHBlZCB2YWx1ZSAobGFuZG1pbmUgMSkgYW5kIGRyb3BzIHRoZSBrZXkncyBjYWNoZWQgcHJveHkuICovXG5mdW5jdGlvbiBhc3NpZ25TdGF0ZUtleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBzdGF0ZTogUmVhY3RpdmVTdGF0ZSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKGtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHNldCBzdGF0ZSBrZXkgXCIke2tleX1cIiAtLSBpdCBjb25mbGljdHMgd2l0aCBhIHJlc2VydmVkIFR5cGVkU2NvcGUgbWV0aG9kLiBSZW5hbWUgdGhlIHN0YXRlIGtleSB0byBhdm9pZCAkLXByZWZpeGVkIG5hbWVzLmAsXG4gICAgKTtcbiAgfVxuICB0YXJnZXQuc2V0VmFsdWUoa2V5LCB1bndyYXBQcm94eSh2YWx1ZSkpO1xuICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShrZXkpO1xufVxuXG4vKiogRG9lcyB0aGUga2V5IGV4aXN0IOKAlCBhbnN3ZXJlZCB3aXRob3V0IGEgdHJhY2tlZCByZWFkIHdoZXJldmVyIHRoZSB0YXJnZXQgY2FuOyBgZ2V0VmFsdWVgIGlzIHRoZSBsYXN0IHJlc29ydC4gKi9cbmZ1bmN0aW9uIGtub3duS2V5KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh0YXJnZXQuaGFzS2V5KSByZXR1cm4gdGFyZ2V0Lmhhc0tleShrZXkpO1xuICBpZiAodGFyZ2V0LmdldFN0YXRlS2V5cykgcmV0dXJuIHRhcmdldC5nZXRTdGF0ZUtleXMoKS5pbmNsdWRlcyhrZXkpO1xuICByZXR1cm4gdGFyZ2V0LmdldFZhbHVlKGtleSkgIT09IHVuZGVmaW5lZDsgLy8gZmFsbGJhY2s6IGZpcmVzIG9uUmVhZCAoYWNjZXB0YWJsZSBkZWdyYWRhdGlvbilcbn1cblxuLyoqIEV2ZXJ5IHN0YXRlIGtleSDigJQgc2lsZW50bHkgd2hlcmUgdGhlIHRhcmdldCBjYW4sIGVsc2UgZnJvbSBhIHdob2xlLXN0YXRlIHJlYWQuICovXG5mdW5jdGlvbiBzdGF0ZUtleXModGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCk7XG4gIGNvbnN0IHNuYXBzaG90ID0gdGFyZ2V0LmdldFZhbHVlKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBzbmFwc2hvdCAmJiB0eXBlb2Ygc25hcHNob3QgPT09ICdvYmplY3QnID8gT2JqZWN0LmtleXMoc25hcHNob3QpIDogW107XG59XG5cbi8vIC0tIFRvcC1sZXZlbCBwcm94eSAodGhlIG1haW4gVHlwZWRTY29wZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGVzIGEgVHlwZWRTY29wZTxUPiBwcm94eSB3cmFwcGluZyBhIFJlYWN0aXZlVGFyZ2V0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdW5kZXJseWluZyBzY29wZSAoU2NvcGVGYWNhZGUgb3IgYW55IFJlYWN0aXZlVGFyZ2V0KVxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIChicmVha1BpcGVsaW5lIGluamVjdGlvbilcbiAqIEByZXR1cm5zIEEgUHJveHkgd2l0aCB0eXBlZCBwcm9wZXJ0eSBhY2Nlc3MgYW5kICQtcHJlZml4ZWQgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHlwZWRTY29wZTxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBvcHRpb25zPzogUmVhY3RpdmVPcHRpb25zKTogVHlwZWRTY29wZTxUPiB7XG4gIGNvbnN0IHN0YXRlOiBSZWFjdGl2ZVN0YXRlID0geyBicmVha0ZuOiBvcHRpb25zPy5icmVha1BpcGVsaW5lLCBjaGlsZENhY2hlOiBuZXcgTWVtYmVyQ2FjaGUoKSB9O1xuICAvLyBCaW5kIHRoZSBzaWxlbnQgcmVhZCBvbmNlIOKAlCB0aGUgbmVzdGVkL2FycmF5IHByb3hpZXMgcmVzb2x2ZSB0aGVpciBsaXZlIHZpZXcgdGhyb3VnaCBpdC5cbiAgY29uc3QgcmVhZFNpbGVudCA9ICh0YXJnZXQuZ2V0VmFsdWVTaWxlbnQgPz8gdGFyZ2V0LmdldFZhbHVlKS5iaW5kKHRhcmdldCk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQgYXMgdW5rbm93biBhcyBUeXBlZFNjb3BlPFQ+LCB7XG4gICAgZ2V0KF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgY29uc3QgYW5zd2VyZWQgPSBpbnRlcm5hbFJlYWQodGFyZ2V0LCBzdGF0ZSwgcHJvcCk7XG4gICAgICBpZiAoYW5zd2VyZWQgIT09IFNUQVRFX0tFWSkgcmV0dXJuIGFuc3dlcmVkO1xuICAgICAgLy8gQSBzdGF0ZSBrZXk6IE9ORSB0cmFja2VkIHJlYWQgKGZpcmVzIG9uUmVhZCBvbmNlKSwgdGhlbiB0aGUgd3JhcHBlci5cbiAgICAgIHJldHVybiB3cmFwU3RhdGVWYWx1ZSh0YXJnZXQsIHJlYWRTaWxlbnQsIHN0YXRlLCBwcm9wIGFzIHN0cmluZywgdGFyZ2V0LmdldFZhbHVlKHByb3AgYXMgc3RyaW5nKSk7XG4gICAgfSxcbiAgICBzZXQoX3Byb3h5VGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykgYXNzaWduU3RhdGVLZXkodGFyZ2V0LCBzdGF0ZSwgcHJvcCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWxldGVQcm9wZXJ0eShfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgdGFyZ2V0LmRlbGV0ZVZhbHVlKHByb3ApO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGhhcyhfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoR1VBUkRfUFJPUFMsIHByb3ApO1xuICAgICAgcmV0dXJuIFNDT1BFX01FVEhPRF9OQU1FUy5oYXMocHJvcCkgfHwga25vd25LZXkodGFyZ2V0LCBwcm9wKTtcbiAgICB9LFxuICAgIG93bktleXM6ICgpID0+IHN0YXRlS2V5cyh0YXJnZXQpLFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycgfHwgU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkgcmV0dXJuIHVuZGVmaW5lZDsgLy8gJC1tZXRob2RzIGFyZSBub24tZW51bWVyYWJsZVxuICAgICAgaWYgKCFrbm93bktleSh0YXJnZXQsIHByb3ApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9OyAvLyB0aGUgdmFsdWUgaXMgZmV0Y2hlZCB2aWEgdGhlIGdldCB0cmFwXG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
307
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7OztBQUVILHFEQUE4RDtBQUM5RCxpREFBcUQ7QUFDckQsbURBQStDO0FBQy9DLDZDQUE2RDtBQUM3RCwrQ0FBd0c7QUFFeEcseUNBQXlHO0FBQ3pHLG1EQUEyRjtBQU0zRixNQUFNLGFBQWEsR0FBaUM7SUFDbEQsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsaUVBQWlFO0lBQ2pFLGlEQUFpRDtJQUNqRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxZQUFzQixFQUFFLFdBQW9CLEVBQUUsRUFBRSxDQUM5RixDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFBLDBCQUFhLEVBQUMsS0FBSyxDQUFDLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQztJQUNsRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxXQUFvQixFQUFFLEVBQUUsQ0FDcEUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBQSwwQkFBYSxFQUFDLEtBQUssQ0FBQyxFQUFFLFdBQVcsQ0FBQztJQUN2RCxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBZSxFQUFF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KiByZWFjdGl2ZS9jcmVhdGVUeXBlZFNjb3BlIC0tIENvcmUgUHJveHkgZmFjdG9yeSBmb3IgVHlwZWRTY29wZTxUPi5cbiAqXG4gKiBXcmFwcyBhIFJlYWN0aXZlVGFyZ2V0IChTY29wZUZhY2FkZSkgaW4gYSBQcm94eSB0aGF0IHByb3ZpZGVzOlxuICogLSBUeXBlZCBwcm9wZXJ0eSBhY2Nlc3M6IHNjb3BlLmNyZWRpdFRpZXIgKHJlYWQpLCBzY29wZS5jcmVkaXRUaWVyID0gJ0EnICh3cml0ZSlcbiAqIC0gRGVlcCB3cml0ZSBpbnRlcmNlcHRpb246IHNjb3BlLmN1c3RvbWVyLmFkZHJlc3MuemlwID0gJzkwMjEwJ1xuICogLSBBcnJheSBtdXRhdGlvbiBpbnRlcmNlcHRpb246IHNjb3BlLml0ZW1zLnB1c2goJ25ldycpXG4gKiAtICQtcHJlZml4ZWQgZXNjYXBlIGhhdGNoZXM6ICRnZXRWYWx1ZSwgJHNldFZhbHVlLCAkcmVhZCwgJGdldEFyZ3MsIGV0Yy5cbiAqXG4gKiBSZWFkIHNlbWFudGljczogdG9wLWxldmVsIGdldCBjYWxscyBnZXRWYWx1ZSgpIChmaXJlcyBvblJlYWQgT05DRSkuXG4gKiAgIE5lc3RlZCBnZXQgdHJhcHMgbmF2aWdhdGUgaW4tbWVtb3J5IC0tIG5vIGFkZGl0aW9uYWwgb25SZWFkLlxuICpcbiAqIFdyaXRlIHNlbWFudGljczogdG9wLWxldmVsIHNldCBjYWxscyBzZXRWYWx1ZSgpLiBOZXN0ZWQgc2V0IGNhbGxzXG4gKiAgIHVwZGF0ZVZhbHVlKCkgd2l0aCBhIHBhcnRpYWwgb2JqZWN0IGJ1aWx0IGZyb20gdGhlIGFjY3VtdWxhdGVkIHBhdGguXG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlR2V0IGFzIGxvZGFzaEdldCB9IGZyb20gJy4uL21lbW9yeS9wYXRoT3BzLmpzJztcbmltcG9ydCB7IHNob3VsZFdyYXBXaXRoUHJveHkgfSBmcm9tICcuL2FsbG93bGlzdC5qcyc7XG5pbXBvcnQgeyBhcnJheVByb3h5QXQgfSBmcm9tICcuL2FycmF5VHJhcHMuanMnO1xuaW1wb3J0IHsgcmVtZW1iZXJIYW5kbGUsIHVud3JhcEhhbmRsZXMgfSBmcm9tICcuL2hhbmRsZXMuanMnO1xuaW1wb3J0IHsgY2FjaGVkTWVtYmVyLCBsaXZlR2V0VHJhcCwgbGl2ZUluc3BlY3Rpb25UcmFwcywgbGl2ZU9iamVjdCwgTWVtYmVyQ2FjaGUgfSBmcm9tICcuL2xpdmVWaWV3LmpzJztcbmltcG9ydCB0eXBlIHsgUmVhY3RpdmVPcHRpb25zLCBSZWFjdGl2ZVRhcmdldCwgVHlwZWRTY29wZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgQlJFQUtfU0VUVEVSLCBFWEVDVVRPUl9JTlRFUk5BTF9NRVRIT0RTLCBJU19UWVBFRF9TQ09QRSwgU0NPUEVfTUVUSE9EX05BTUVTIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyB0eXBlIFdyaXRlU2luaywgcm9vdEtleVNpbmssIHNpbmtEZWxldGVUcmFwLCBzaW5rU2V0VHJhcCB9IGZyb20gJy4vd3JpdGVUcmFwcy5qcyc7XG5cbi8vIC0tICQtbWV0aG9kIHJvdXRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBNZXRob2RSb3V0ZXIgPSAodGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwgb3B0czogUmVhY3RpdmVTdGF0ZSkgPT4gdW5rbm93bjtcblxuY29uc3QgTUVUSE9EX1JPVVRFUzogUmVjb3JkPHN0cmluZywgTWV0aG9kUm91dGVyPiA9IHtcbiAgJGdldFZhbHVlOiAodCkgPT4gdC5nZXRWYWx1ZS5iaW5kKHQpLFxuICAvLyBBIGhhbmRsZSB0aGUgc2NvcGUgaGFuZGVkIG91dCBpcyBhIHZhbHVlIGl0IGFjY2VwdHMgYmFjayAoaGFuZGxlcy50cyk6XG4gIC8vIGAkc2V0VmFsdWUoJ2NvcHknLCBzY29wZS5jdXN0b21lcilgIHN0b3JlcyB0aGUgdmFsdWUgYmVoaW5kIHRoZSBoYW5kbGUsXG4gIC8vIG5vdCBhIFByb3h5IHRoZSBjb21taXQgY291bGQgbmV2ZXIgY2xvbmUuIFRoZSBzZXQgdHJhcCBkb2VzIHRoZSBzYW1lIGZvclxuICAvLyBgc2NvcGUuY29weSA9IHNjb3BlLmN1c3RvbWVyYDsgdGhlc2UgYXJlIHRoZSBleHBsaWNpdCBkb29ycy4gQVxuICAvLyBoYW5kbGUtZnJlZSB2YWx1ZSBwYXNzZXMgdGhyb3VnaCBieSByZWZlcmVuY2UuXG4gICRzZXRWYWx1ZTogKHQpID0+IChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSA9PlxuICAgIHQuc2V0VmFsdWUoa2V5LCB1bndyYXBIYW5kbGVzKHZhbHVlKSwgc2hvdWxkUmVkYWN0LCBkZXNjcmlwdGlvbiksXG4gICR1cGRhdGU6ICh0KSA9PiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykgPT5cbiAgICB0LnVwZGF0ZVZhbHVlKGtleSwgdW53cmFwSGFuZGxlcyh2YWx1ZSksIGRlc2NyaXB0aW9uKSxcbiAgJGRlbGV0ZTogKHQpID0+IHQuZGVsZXRlVmFsdWUuYmluZCh0KSxcbiAgJHJlYWQ6ICh0KSA9PiAoZG90UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm9vdEtleSA9IGRvdFBhdGguc3BsaXQoJy4nKVswXTtcbiAgICBjb25zdCB2YWx1ZSA9IHQuZ2V0VmFsdWUocm9vdEtleSk7XG4gICAgaWYgKCFkb3RQYXRoLmluY2x1ZGVzKCcuJykpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gbG9kYXNoR2V0KHZhbHVlLCBkb3RQYXRoLnNsaWNlKHJvb3RLZXkubGVuZ3RoICsgMSkpO1xuICB9LFxuICAkZ2V0QXJnczogKHQpID0+IHQuZ2V0QXJncy5iaW5kKHQpLFxuICAkZ2V0RW52OiAodCkgPT4gdC5nZXRFbnYuYmluZCh0KSxcbiAgJGRlYnVnOiAodCkgPT4gdC5hZGREZWJ1Z0luZm8uYmluZCh0KSxcbiAgJGxvZzogKHQpID0+IHQuYWRkRGVidWdNZXNzYWdlLmJpbmQodCksXG4gICRlcnJvcjogKHQpID0+IHQuYWRkRXJyb3JJbmZvLmJpbmQodCksXG4gICRtZXRyaWM6ICh0KSA9PiB0LmFkZE1ldHJpYy5iaW5kKHQpLFxuICAkZXZhbDogKHQpID0+IHQuYWRkRXZhbC5iaW5kKHQpLFxuICAkYXR0YWNoU2NvcGVSZWNvcmRlcjogKHQpID0+IHQuYXR0YWNoU2NvcGVSZWNvcmRlci5iaW5kKHQpLFxuICAkZGV0YWNoU2NvcGVSZWNvcmRlcjogKHQpID0+IHQuZGV0YWNoU2NvcGVSZWNvcmRlci5iaW5kKHQpLFxuICAkZ2V0U2NvcGVSZWNvcmRlcnM6ICh0KSA9PiB0LmdldFNjb3BlUmVjb3JkZXJzLmJpbmQodCksXG4gICRiYXRjaEFycmF5OiAodCkgPT4gKGtleTogc3RyaW5nLCBmbjogKGFycjogdW5rbm93bltdKSA9PiB2b2lkKSA9PiB7XG4gICAgLy8gT25lIGdldFZhbHVlIOKAlCBmaXJlcyBvblJlYWQgb25jZVxuICAgIGNvbnN0IGN1cnJlbnQgPSB0LmdldFZhbHVlKGtleSk7XG4gICAgLy8gQ2xvbmUgb25jZSDigJQgREVFUCAob3Igc3RhcnQgZW1wdHkgaWYgbWlzc2luZy9ub24tYXJyYXkpLiBUaGUgcmVhZCBpc1xuICAgIC8vIEJPUlJPV0VEOiBiZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgc3RhZ2VkIHdyaXRlIGl0IGlzIGNvbW1pdHRlZCBzaGFyZWRcbiAgICAvLyBtZW1vcnkgaXRzZWxmLCBzbyBhIHNoYWxsb3cgYFsuLi5jdXJyZW50XWAgaGFuZGVkIHRoZSBzdGFnZSB0aGVcbiAgICAvLyBjb21taXR0ZWQgRUxFTUVOVFMgYW5kIGBhcnJbMF0ubiA9IDlgIGVkaXRlZCBjb21taXR0ZWQgc3RhdGUgaW4gcGxhY2VcbiAgICAvLyB3aXRoIG5vIHRyYWNlIHJvdyAoYW5kIHRoZSBsYXp5IGJ1ZmZlcidzIGJhc2Ugd2FzIHRoZW4gdGFrZW4gQUZURVIgdGhlXG4gICAgLy8gZWRpdCwgc28gdGhlIG5ldC1jaGFuZ2UgZmlsdGVyIHNhdyBub3RoaW5nKS4gU3RhdGUgdmFsdWVzIHN1cnZpdmVcbiAgICAvLyBgc3RydWN0dXJlZENsb25lYCBieSBjb250cmFjdCwgc28gdGhlIHdvcmtpbmcgY29weSBpcyBhIGZ1bGwgY29weS5cbiAgICBjb25zdCBjbG9uZTogdW5rbm93bltdID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IHN0cnVjdHVyZWRDbG9uZShjdXJyZW50KSA6IFtdO1xuICAgIC8vIFVzZXIgYXBwbGllcyBhbGwgbXV0YXRpb25zIHRvIHRoZSBwbGFpbiBjbG9uZSDigJQgbm8gUHJveHksIG5vIHBlci1tdXRhdGlvbiBjb21taXRcbiAgICBmbihjbG9uZSk7XG4gICAgLy8gT25lIHNldFZhbHVlIOKAlCBmaXJlcyBvbldyaXRlIG9uY2Ugd2l0aCB0aGUgZmluYWwgYXJyYXkuIFRoZSBzdGFnZSBtYXlcbiAgICAvLyBoYXZlIHB1c2hlZCBoYW5kbGVzIGludG8gdGhlIGNsb25lIChgYXJyLnB1c2goc2NvcGUudGVtcGxhdGUpYCkg4oCUIHRoZXlcbiAgICAvLyBhcmUgdmFsdWVzIGJ5IHRoZSB0aW1lIHRoZSBhcnJheSBpcyBzdGFnZWQgKGhhbmRsZXMudHMpLlxuICAgIHQuc2V0VmFsdWUoa2V5LCB1bndyYXBIYW5kbGVzKGNsb25lKSk7XG4gIH0sXG4gICRicmVhazogKF90LCBvcHRzKSA9PiAocmVhc29uPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFvcHRzLmJyZWFrRm4pIHRocm93IG5ldyBFcnJvcignJGJyZWFrKCkgaXMgbm90IGF2YWlsYWJsZSBvdXRzaWRlIHN0YWdlIGV4ZWN1dGlvbicpO1xuICAgIG9wdHMuYnJlYWtGbihyZWFzb24pO1xuICB9LFxuICAvLyBPYnNlcnZhYmlsaXR5IOKAlCBFbWl0IGNoYW5uZWwgKFBoYXNlIDMpLiBSb3V0ZXMgdG8gU2NvcGVGYWNhZGUuZW1pdEV2ZW50XG4gIC8vIHdoaWNoIGhhbmRsZXMgZmFzdC1wYXRoLCBlbnJpY2htZW50LCByZWRhY3Rpb24sIGFuZCBlcnJvciBpc29sYXRpb24uXG4gICRlbWl0OiAodCkgPT4gdC5lbWl0RXZlbnQuYmluZCh0KSxcbiAgLy8gRGV0YWNoIChUNCkg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnRzLiBEZWxlZ2F0ZXMgdG8gU2NvcGVGYWNhZGVcbiAgLy8gd2hpY2ggbWludGVkIHJlZklkcyBmcm9tIHJ1bnRpbWVTdGFnZUlkLlxuICAkZGV0YWNoQW5kSm9pbkxhdGVyOiAodCkgPT4gdC5kZXRhY2hBbmRKb2luTGF0ZXIuYmluZCh0KSxcbiAgJGRldGFjaEFuZEZvcmdldDogKHQpID0+IHQuZGV0YWNoQW5kRm9yZ2V0LmJpbmQodCksXG4gICR0b1JhdzogKHQpID0+ICgpID0+IHQsXG59O1xuXG4vLyAtLSBHdWFyZCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGVzZSBtdXN0IGJlIGhhbmRsZWQgdG8gcHJldmVudCBQcm94eSBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBQcm9taXNlLFxuLy8gYnJlYWtpbmcgaW5zdGFuY2VvZiBjaGVja3MsIG9yIGNvbmZ1c2luZyB0ZXN0IG1hdGNoZXJzLlxuXG5jb25zdCBHVUFSRF9QUk9QUzogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4gPSB7XG4gIHRoZW46IHVuZGVmaW5lZCwgLy8gcHJldmVudCBQcm9taXNlIGRldGVjdGlvblxuICBhc3ltbWV0cmljTWF0Y2g6IHVuZGVmaW5lZCwgLy8gcHJldmVudCB2aXRlc3QvamVzdCBtYXRjaGVyIGNvbmZ1c2lvblxuICBjb25zdHJ1Y3RvcjogT2JqZWN0LCAvLyBzYWZlIHByb3RvdHlwZVxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ1R5cGVkU2NvcGUnLFxufTtcblxuLy8gLS0gU2lsZW50IGV4aXN0ZW5jZSBjaGVjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIERvZXMgdGhpcyBrZXkgZXhpc3QgaW4gc3RhdGUsIGFuc3dlcmVkIHdpdGggTk8gdHJhY2tpbmcgc2lkZSBlZmZlY3QgYXQgYWxsP1xuICpcbiAqIGBnZXRTdGF0ZUtleXMoKWAgaXMgdGhlIG9ubHkgaW5zcGVjdGlvbiBhIFNjb3BlRmFjYWRlIGFuc3dlcnMgd2l0aG91dCByb3V0aW5nXG4gKiB0aHJvdWdoIHRoZSB0cmFja2VkIHJlYWQgcGF0aC4gYGhhc0tleSgpYCBkZWxpYmVyYXRlbHkgRE9FUyByb3V0ZSB0aHJvdWdoIGl0OlxuICogYCdrJyBpbiBzY29wZWAgaXMgYSByZWFsIHF1ZXN0aW9uIGFib3V0IHN0YXRlIHRoYXQgYSBzdGFnZSBjYW4gYnJhbmNoIG9uLCBzb1xuICogaXQgcmVnaXN0ZXJzIGFzIGEgcmVhZCDigJQgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhpcyBwcm9iZSBtdXN0IG5vdCB1c2UgaXQuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSB0YXJnZXQgb2ZmZXJzIG5vIHNpbGVudCBhbnN3ZXI7IGNhbGxlcnMgbXVzdFxuICogdGhlbiBjaG9vc2UgZGVsaWJlcmF0ZWx5IHJhdGhlciB0aGFuIGFzc3VtZS5cbiAqL1xuZnVuY3Rpb24gc2lsZW50bHlLbm93bktleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBpZiAoIXRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCkuaW5jbHVkZXMoa2V5KTtcbn1cblxuLy8gLS0gTXV0YWJsZSBzdGF0ZSBwZXIgcHJveHkgaW5zdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgUmVhY3RpdmVTdGF0ZSB7XG4gIGJyZWFrRm4/OiAocmVhc29uPzogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogVGhlIHRvcC1sZXZlbCBrZXkncyBjaGlsZCBwcm94eSwgdmFsaWRhdGVkIGJ5IHJhdyBpZGVudGl0eSAoYGxpdmVWaWV3LnRzIMK3IGNhY2hlZE1lbWJlcmApOyBhIHNpbmsgZHJvcHMgdGhlIGtleSBvbiB3cml0ZS4gKi9cbiAgY2hpbGRDYWNoZTogTWVtYmVyQ2FjaGU7XG59XG5cbi8vIC0tIE5lc3RlZCBjaGlsZCBwcm94aWVzIChmb3IgZGVlcCB3cml0ZSBpbnRlcmNlcHRpb24pIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gQm90aCBmYWN0b3JpZXMgYXJlIE9SQ0hFU1RSQVRPUlMgKDkuMjMuMSk6IHJlYWRzIGFyZSBgbGl2ZVZpZXcudHNgLCB3cml0ZXNcbi8vIGFyZSBgd3JpdGVUcmFwcy50c2Agb3ZlciBhIGByb290S2V5U2lua2AsIGFuZCB0aGUgT05FIHRoaW5nIGVhY2ggZGVjaWRlc1xuLy8gaXRzZWxmIGlzIHdoYXQgYSBjaGlsZCBtZW1iZXIgYmVjb21lcyDigJQgdGhlIGN5Y2xlIHBvbGljeS4gRWFjaCBob2xkcyBpdHNcbi8vIG93biBwZXItbWVtYmVyIHByb3h5IGNhY2hlICg5LjIzLjIsIGBsaXZlVmlldy50cyDCtyBjYWNoZWRNZW1iZXJgKS5cbi8vXG4vLyBDeWNsZSBzYWZldHk6IGFuIGltbXV0YWJsZSBTZXQ8b2JqZWN0PiBvZiBhbmNlc3RvciBvYmplY3RzIGlzIHBhc3NlZCBkb3duXG4vLyBlYWNoIGFjY2VzcyBjaGFpbi4gRWFjaCBicmFuY2ggZ2V0cyBpdHMgb3duIGNvcHkgKG5ldyBTZXQocGFyZW50KSkgc29cbi8vIHNjb3BlLnguZnJpZW5kIGFuZCBzY29wZS54LmNvd29ya2VyIGRvbid0IHBvbGx1dGUgZWFjaCBvdGhlcidzIHRyYWNraW5nLlxuLy8gV2hlbiBhIGNoaWxkIHZhbHVlIGlzIGFscmVhZHkgaW4gdGhlIGFuY2VzdG9yIHNldCwgd2UndmUgaGl0IGEgY3ljbGUuXG4vLyBBdCB0aGUgY3ljbGUgYnJlYWs6IHJldHVybiBhIHRlcm1pbmFsIHByb3h5IHRoYXQgdHJhY2tzIHdyaXRlcyAoc2V0IHRyYXBcbi8vIHN0aWxsIGJ1aWxkcyBwYXRoICsgY29tbWl0cyB0aHJvdWdoIHRoZSBzaW5rKSBidXQgZG9lc24ndCByZWN1cnNlIHJlYWRzXG4vLyBmdXJ0aGVyLiBUaGUgdGVybWluYWwgY2hhaW4gc2hhcmVzIE9ORSBtdXRhYmxlIGB2aXNpdGVkYCBzZXQ6IGEgdmFsdWUgc2VlblxuLy8gYW55d2hlcmUgcGFzdCB0aGUgY3ljbGUgZWRnZSBpcyBoYW5kZWQgYmFjayByYXcuXG5cbmZ1bmN0aW9uIGNyZWF0ZVRlcm1pbmFsUHJveHkoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNpbms6IFdyaXRlU2luayxcbiAgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB2aXNpdGVkOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICB2aXNpdGVkLmFkZChvYmopO1xuICBjb25zdCBtZW1iZXJzID0gbmV3IE1lbWJlckNhY2hlKCk7XG4gIGNvbnN0IGxpdmUgPSAoKSA9PiBsaXZlT2JqZWN0KG9iaiwgc2luay5yZWFkQXQoc2VnbWVudHMpKTtcbiAgY29uc3QgY2hpbGQgPSAodmFsdWU6IHVua25vd24sIHBhdGg6IHN0cmluZ1tdKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIC8vIEFuIGFycmF5IHBhc3QgdGhlIGN5Y2xlIGVkZ2Ugc3RpbGwgZ2V0cyBjb3B5LW9uLXdyaXRlIGludGVyY2VwdGlvbiDigJRcbiAgICAvLyBpdCBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIHJvb3Qga2V5LCB0aGUgc2FtZSBsYXcgYXMgdGhlIG5lc3RlZCBwcm94eS5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHZhbHVlIGFzIG9iamVjdCkpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCwgdmlzaXRlZCk7XG4gIH07XG4gIHJldHVybiByZW1lbWJlckhhbmRsZShcbiAgICBuZXcgUHJveHkob2JqLCB7XG4gICAgICBnZXQ6IGxpdmVHZXRUcmFwKGxpdmUsIHNlZ21lbnRzLCBjaGlsZCwgbWVtYmVycyksXG4gICAgICBzZXQ6IHNpbmtTZXRUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBzaW5rRGVsZXRlVHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgICAuLi5saXZlSW5zcGVjdGlvblRyYXBzKGxpdmUpLFxuICAgIH0pLFxuICAgIGxpdmUsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5lc3RlZFByb3h5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzaW5rOiBXcml0ZVNpbmssXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICAvLyBSZWFkcyBhcmUgTElWRSAoOS4yMi4wKTogYSBoZWxkIHByb3h5IHJlYWRzIGl0cyBvd24gd3JpdGVzLCBgJ3gnIGluIG9gXG4gIC8vIGFuZCBgT2JqZWN0LmtleXMobylgIHNlZSB0aGVtLCBhbmQgYG8uYiA9IG8uYSAqIDEwYCB1c2VzIHRoZSBuZXcgYGFgLlxuICAvLyBUaGUgY2FwdHVyZWQgb2JqZWN0IGFuc3dlcnMgb25seSB3aGVuIHRoZSBwYXRoIGlzIGdvbmUg4oCUIHNlZSBsaXZlVmlldy50cy5cbiAgY29uc3QgbWVtYmVycyA9IG5ldyBNZW1iZXJDYWNoZSgpO1xuICBjb25zdCBsaXZlID0gKCkgPT4gbGl2ZU9iamVjdChvYmosIHNpbmsucmVhZEF0KHNlZ21lbnRzKSk7XG4gIGNvbnN0IGNoaWxkID0gKHZhbHVlOiB1bmtub3duLCBwYXRoOiBzdHJpbmdbXSk6IHVua25vd24gPT4ge1xuICAgIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICAvLyBBbiBhcnJheSBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIFJPT1QgS0VZIChyZWFjdGl2ZS9SRUFETUUubWQsIGxhdyAzKVxuICAgIC8vIOKAlCB0aGUgc2luaydzIHZlcmIsIHdoYXRldmVyIGRlcHRoIHRoZSBhcnJheSBzaXRzIGF0LlxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGFycmF5UHJveHlBdChzaW5rLCBwYXRoKTtcbiAgICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCk7XG4gICAgcmV0dXJuIGNyZWF0ZU5lc3RlZFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBwYXRoLCBuZXcgU2V0KGFuY2VzdG9ycykuYWRkKHZhbHVlIGFzIG9iamVjdCkpO1xuICB9O1xuICByZXR1cm4gcmVtZW1iZXJIYW5kbGUoXG4gICAgbmV3IFByb3h5KG9iaiwge1xuICAgICAgZ2V0OiBsaXZlR2V0VHJhcChsaXZlLCBzZWdtZW50cywgY2hpbGQsIG1lbWJlcnMpLFxuICAgICAgc2V0OiBzaW5rU2V0VHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgICBkZWxldGVQcm9wZXJ0eTogc2lua0RlbGV0ZVRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgICAgLi4ubGl2ZUluc3BlY3Rpb25UcmFwcyhsaXZlKSxcbiAgICB9KSxcbiAgICBsaXZlLFxuICApO1xufVxuXG4vLyAtLSBUb3AtbGV2ZWwgbGVhdmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogYGludGVybmFsUmVhZGAgYW5zd2VyZWQgbm90aGluZzogdGhlIG5hbWUgaXMgYSBzdGF0ZSBrZXkgYW5kIG11c3QgYmUgcmVhZCAodHJhY2tlZCkgZnJvbSB0aGUgdGFyZ2V0LiAqL1xuY29uc3QgU1RBVEVfS0VZOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdzdGF0ZS1rZXknKTtcblxuLyoqXG4gKiBXSFk6IHRoZSBuYW1lcyB0aGUgc2NvcGUgYW5zd2VycyBJVFNFTEYg4oCUIGludGVybmFsIHN5bWJvbHMsIHRoZSBndWFyZFxuICogcHJvcGVydGllcywgTm9kZSdzIGluc3BlY3QgaG9vaywgdGhlIGAkYC1tZXRob2RzLCB0aGUgZXhlY3V0b3IncyBhbGxvd2xpc3RlZFxuICogcGFzcy10aHJvdWdocyAoYGF0dGFjaFNjb3BlUmVjb3JkZXJgLCBgbm90aWZ5U3RhZ2VTdGFydGAsIOKApiwgY2FsbGVkIGRpcmVjdGx5XG4gKiBvbiB0aGUgc2NvcGUpIGFuZCB0aGUgSlNPTiBwcm9iZSDigJQgbXVzdCBuZXZlciBiZWNvbWUgdHJhY2tlZCByZWFkcztcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBpcyBhIHN0YXRlIGtleSBhbmQgaXMgbGVmdCB0byB0aGUgY2FsbGVyLlxuICpcbiAqIFRoZSBwcm9iZTogYEpTT04uc3RyaW5naWZ5YCBhc2tzIEVWRVJZIHZhbHVlIGZvciBhIGB0b0pTT05gIG1ldGhvZC4gVGhhdFxuICogcXVlc3Rpb24gY29tZXMgZnJvbSB0aGUgcnVudGltZSwgbm90IHRoZSBzdGFnZSBhdXRob3IsIHNvIGl0IG11c3Qgbm90IGVudGVyXG4gKiB0aGUgcmVhZCBzZXQuIEEgc3RhdGUga2V5IGxpdGVyYWxseSBjYWxsZWQgJ3RvSlNPTicgaXMgbGVnYWw6IHdoZW4gaXQgRVhJU1RTXG4gKiB0aGlzIGlzIGEgZ2VudWluZSByZWFkIGFuZCBzdGF5cyB0cmFja2VkLCBhbmQgd2hlbiB0aGUgdGFyZ2V0IGNhbm5vdCBhbnN3ZXJcbiAqIHNpbGVudGx5LCB0cnV0aCB3aW5zIG92ZXIgbm9pc2Ug4oCUIGZhbGwgdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gaW50ZXJuYWxSZWFkKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgaWYgKHByb3AgPT09IElTX1RZUEVEX1NDT1BFKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHByb3AgPT09IEJSRUFLX1NFVFRFUikge1xuICAgIHJldHVybiAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgIHN0YXRlLmJyZWFrRm4gPSBmbjtcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKSkgcmV0dXJuIEdVQVJEX1BST1BTW3Byb3BdO1xuICAgIGlmIChwcm9wID09PSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpKSByZXR1cm4gKCkgPT4gdGFyZ2V0LmdldFZhbHVlKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKSkgcmV0dXJuIEdVQVJEX1BST1BTW3Byb3BdO1xuICBpZiAoU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkgcmV0dXJuIE1FVEhPRF9ST1VURVNbcHJvcF0/Lih0YXJnZXQsIHN0YXRlKTtcbiAgaWYgKEVYRUNVVE9SX0lOVEVSTkFMX01FVEhPRFMuaGFzKHByb3ApICYmIHR5cGVvZiAodGFyZ2V0IGFzIGFueSlbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gKHRhcmdldCBhcyBhbnkpW3Byb3BdLmJpbmQodGFyZ2V0KTtcbiAgfVxuICBpZiAocHJvcCA9PT0gJ3RvSlNPTicgJiYgc2lsZW50bHlLbm93bktleSh0YXJnZXQsIHByb3ApID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIFNUQVRFX0tFWTtcbn1cblxuLyoqXG4gKiBBIHdyYXBwYWJsZSBzdGF0ZSB2YWx1ZSBiZWNvbWVzIHRoZSBhcnJheSBvciBuZXN0ZWQgcHJveHkgZm9yIGl0cyBrZXk7XG4gKiBhbnl0aGluZyBlbHNlIGlzIGhhbmRlZCBiYWNrIHJhdy4gYHNjb3BlLmsgPT09IHNjb3BlLmtgIGhvbGRzIHdpdGhpbiBhXG4gKiBzdGFnZSB0aHJvdWdoIHRoZSBzYW1lIHBlci1tZW1iZXIgY2FjaGUgZXZlcnkgb2JqZWN0IHByb3h5IHVzZXNcbiAqIChgbGl2ZVZpZXcudHMgwrcgY2FjaGVkTWVtYmVyYCk6IGEgd3JpdGUgdG8gdGhlIGtleSBkcm9wcyB0aGUgZW50cnkgKHRoZVxuICogc2luayBkb2VzIGl0KSwgYSBjb21taXQgc3dhcHMgdGhlIHZhbHVlIGFuZCB0aGUgcmVmIGNoZWNrIG1pc3NlcyDigJQgZWl0aGVyXG4gKiB3YXkgdGhlIG5leHQgcmVhZCBidWlsZHMgYSBmcmVzaCBwcm94eSBvdmVyIHRoZSBuZXcgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHdyYXBTdGF0ZVZhbHVlKFxuICB0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LFxuICByZWFkU2lsZW50OiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24sXG4gIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7IC8vIERhdGUsIE1hcCwgY2xhc3MgaW5zdGFuY2UsIGZyb3plbiDigKZcbiAgcmV0dXJuIGNhY2hlZE1lbWJlcihcbiAgICBzdGF0ZS5jaGlsZENhY2hlLFxuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBzaW5rID0gcm9vdEtleVNpbmsodGFyZ2V0LCByZWFkU2lsZW50LCBrZXksIHN0YXRlLmNoaWxkQ2FjaGUpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYXJyYXlQcm94eUF0KHNpbmssIFtdKTtcbiAgICAgIHJldHVybiBjcmVhdGVOZXN0ZWRQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgW10sIG5ldyBTZXQ8b2JqZWN0PihbdmFsdWVdKSk7XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcbn1cblxuLyoqIFdIWTogYSBgJGAtbmFtZSBjYW4gbmV2ZXIgYmUgYSBzdGF0ZSBrZXkg4oCUIHRoZSB3cml0ZSBpcyByZWZ1c2VkLCBub3Qgc2hhZG93ZWQ7IGV2ZXJ5IG90aGVyIGFzc2lnbm1lbnRcbiAqICBzdG9yZXMgdGhlIHZhbHVlIEFTIEFTU0lHTkVEIChhIGhhbmRsZSBiZWNvbWVzIHdoYXQgaXQgc3RhbmRzIGZvciwgYGhhbmRsZXMudHNgOyB0aGUgYnVmZmVyIGRldGFjaGVzIGF0XG4gKiAgY29tbWl0IOKAlCB0aGUgc2FtZSBsYXcgYXMgYCRzZXRWYWx1ZWAsIDkuMjQuMCkgYW5kIGRyb3BzIHRoZSBrZXkncyBjYWNoZWQgcHJveHkuICovXG5mdW5jdGlvbiBhc3NpZ25TdGF0ZUtleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBzdGF0ZTogUmVhY3RpdmVTdGF0ZSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKGtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHNldCBzdGF0ZSBrZXkgXCIke2tleX1cIiAtLSBpdCBjb25mbGljdHMgd2l0aCBhIHJlc2VydmVkIFR5cGVkU2NvcGUgbWV0aG9kLiBSZW5hbWUgdGhlIHN0YXRlIGtleSB0byBhdm9pZCAkLXByZWZpeGVkIG5hbWVzLmAsXG4gICAgKTtcbiAgfVxuICB0YXJnZXQuc2V0VmFsdWUoa2V5LCB1bndyYXBIYW5kbGVzKHZhbHVlKSk7XG4gIHN0YXRlLmNoaWxkQ2FjaGUuZGVsZXRlKGtleSk7XG59XG5cbi8qKiBEb2VzIHRoZSBrZXkgZXhpc3Qg4oCUIGFuc3dlcmVkIHdpdGhvdXQgYSB0cmFja2VkIHJlYWQgd2hlcmV2ZXIgdGhlIHRhcmdldCBjYW47IGBnZXRWYWx1ZWAgaXMgdGhlIGxhc3QgcmVzb3J0LiAqL1xuZnVuY3Rpb24ga25vd25LZXkodGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHRhcmdldC5oYXNLZXkpIHJldHVybiB0YXJnZXQuaGFzS2V5KGtleSk7XG4gIGlmICh0YXJnZXQuZ2V0U3RhdGVLZXlzKSByZXR1cm4gdGFyZ2V0LmdldFN0YXRlS2V5cygpLmluY2x1ZGVzKGtleSk7XG4gIHJldHVybiB0YXJnZXQuZ2V0VmFsdWUoa2V5KSAhPT0gdW5kZWZpbmVkOyAvLyBmYWxsYmFjazogZmlyZXMgb25SZWFkIChhY2NlcHRhYmxlIGRlZ3JhZGF0aW9uKVxufVxuXG4vKiogRXZlcnkgc3RhdGUga2V5IOKAlCBzaWxlbnRseSB3aGVyZSB0aGUgdGFyZ2V0IGNhbiwgZWxzZSBmcm9tIGEgd2hvbGUtc3RhdGUgcmVhZC4gKi9cbmZ1bmN0aW9uIHN0YXRlS2V5cyh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0KTogc3RyaW5nW10ge1xuICBpZiAodGFyZ2V0LmdldFN0YXRlS2V5cykgcmV0dXJuIHRhcmdldC5nZXRTdGF0ZUtleXMoKTtcbiAgY29uc3Qgc25hcHNob3QgPSB0YXJnZXQuZ2V0VmFsdWUoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHNuYXBzaG90ICYmIHR5cGVvZiBzbmFwc2hvdCA9PT0gJ29iamVjdCcgPyBPYmplY3Qua2V5cyhzbmFwc2hvdCkgOiBbXTtcbn1cblxuLy8gLS0gVG9wLWxldmVsIHByb3h5ICh0aGUgbWFpbiBUeXBlZFNjb3BlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZXMgYSBUeXBlZFNjb3BlPFQ+IHByb3h5IHdyYXBwaW5nIGEgUmVhY3RpdmVUYXJnZXQuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB1bmRlcmx5aW5nIHNjb3BlIChTY29wZUZhY2FkZSBvciBhbnkgUmVhY3RpdmVUYXJnZXQpXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gKGJyZWFrUGlwZWxpbmUgaW5qZWN0aW9uKVxuICogQHJldHVybnMgQSBQcm94eSB3aXRoIHR5cGVkIHByb3BlcnR5IGFjY2VzcyBhbmQgJC1wcmVmaXhlZCBtZXRob2RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUeXBlZFNjb3BlPFQgZXh0ZW5kcyBvYmplY3Q+KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIG9wdGlvbnM/OiBSZWFjdGl2ZU9wdGlvbnMpOiBUeXBlZFNjb3BlPFQ+IHtcbiAgY29uc3Qgc3RhdGU6IFJlYWN0aXZlU3RhdGUgPSB7IGJyZWFrRm46IG9wdGlvbnM/LmJyZWFrUGlwZWxpbmUsIGNoaWxkQ2FjaGU6IG5ldyBNZW1iZXJDYWNoZSgpIH07XG4gIC8vIEJpbmQgdGhlIHNpbGVudCByZWFkIG9uY2Ug4oCUIHRoZSBuZXN0ZWQvYXJyYXkgcHJveGllcyByZXNvbHZlIHRoZWlyIGxpdmUgdmlldyB0aHJvdWdoIGl0LlxuICBjb25zdCByZWFkU2lsZW50ID0gKHRhcmdldC5nZXRWYWx1ZVNpbGVudCA/PyB0YXJnZXQuZ2V0VmFsdWUpLmJpbmQodGFyZ2V0KTtcblxuICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCBhcyB1bmtub3duIGFzIFR5cGVkU2NvcGU8VD4sIHtcbiAgICBnZXQoX3Byb3h5VGFyZ2V0LCBwcm9wKSB7XG4gICAgICBjb25zdCBhbnN3ZXJlZCA9IGludGVybmFsUmVhZCh0YXJnZXQsIHN0YXRlLCBwcm9wKTtcbiAgICAgIGlmIChhbnN3ZXJlZCAhPT0gU1RBVEVfS0VZKSByZXR1cm4gYW5zd2VyZWQ7XG4gICAgICAvLyBBIHN0YXRlIGtleTogT05FIHRyYWNrZWQgcmVhZCAoZmlyZXMgb25SZWFkIG9uY2UpLCB0aGVuIHRoZSB3cmFwcGVyLlxuICAgICAgcmV0dXJuIHdyYXBTdGF0ZVZhbHVlKHRhcmdldCwgcmVhZFNpbGVudCwgc3RhdGUsIHByb3AgYXMgc3RyaW5nLCB0YXJnZXQuZ2V0VmFsdWUocHJvcCBhcyBzdHJpbmcpKTtcbiAgICB9LFxuICAgIHNldChfcHJveHlUYXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSBhc3NpZ25TdGF0ZUtleSh0YXJnZXQsIHN0YXRlLCBwcm9wLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGRlbGV0ZVByb3BlcnR5KF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG4gICAgICB0YXJnZXQuZGVsZXRlVmFsdWUocHJvcCk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShwcm9wKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaGFzKF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCk7XG4gICAgICByZXR1cm4gU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSB8fCBrbm93bktleSh0YXJnZXQsIHByb3ApO1xuICAgIH0sXG4gICAgb3duS2V5czogKCkgPT4gc3RhdGVLZXlzKHRhcmdldCksXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJyB8fCBTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSByZXR1cm4gdW5kZWZpbmVkOyAvLyAkLW1ldGhvZHMgYXJlIG5vbi1lbnVtZXJhYmxlXG4gICAgICBpZiAoIWtub3duS2V5KHRhcmdldCwgcHJvcCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4geyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH07IC8vIHRoZSB2YWx1ZSBpcyBmZXRjaGVkIHZpYSB0aGUgZ2V0IHRyYXBcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ /**
3
+ * reactive/handles — which objects are the scope's HANDLES, and the value
4
+ * behind each.
5
+ *
6
+ * Every object the typed scope hands back is a Proxy bound to its stage
7
+ * (reactive/README.md, "A handle is bound to its stage"): inside the stage
8
+ * that is what makes a deep write commit and a held read stay live. A handle
9
+ * can also TRAVEL out of the stage in the library's own hands — an
10
+ * `addParallelForEach` items selector returns the array handle and its
11
+ * elements become the generated branch inputs; a subflow `inputMapper` or
12
+ * `outputMapper` hands one on; `$setValue('copy', scope.customer)` hands one
13
+ * back. Wherever the engine RECORDS a value it clones it (`structuredClone`,
14
+ * at commit since 9.23.0), and a Proxy cannot be cloned: `DataCloneError`,
15
+ * the stage's writes lost. 9.22.0–9.23.2 lost every child of a fan-out over
16
+ * object items that way (9.23.3).
17
+ *
18
+ * LAW: a handle the scope handed out is a value the engine accepts back.
19
+ * Each proxy factory registers its handle here with the same live reader its
20
+ * get trap uses, so the value behind a handle is what a read of it would
21
+ * return NOW — and the engine asks {@link unwrapHandles} at every boundary
22
+ * where app code hands it a value to record. O(1) for a handle (a WeakMap
23
+ * lookup, no walk, no JSON round-trip: a `Date` stays a `Date`); a walk only
24
+ * for a plain container the app built around handles, copy-on-write so a
25
+ * handle-free value comes back as the SAME reference.
26
+ *
27
+ * The value behind a handle is BORROWED — the same reference a read hands
28
+ * back, cloned by the buffer at commit. Never mutate it (the reads law).
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.unwrapHandles = exports.valueBehind = exports.isHandle = exports.rememberHandle = void 0;
32
+ /** Every handle the four proxy factories built, mapped to its live reader. */
33
+ const LIVE = new WeakMap();
34
+ /** Register `handle` as a scope handle whose current value `live` returns. Returns the handle. */
35
+ function rememberHandle(handle, live) {
36
+ LIVE.set(handle, live);
37
+ return handle;
38
+ }
39
+ exports.rememberHandle = rememberHandle;
40
+ /** Is `value` a handle the scope handed out? */
41
+ function isHandle(value) {
42
+ return value !== null && typeof value === 'object' && LIVE.has(value);
43
+ }
44
+ exports.isHandle = isHandle;
45
+ /** The live value behind a handle; `value` itself when it is not one. O(1). */
46
+ function valueBehind(value) {
47
+ if (value === null || typeof value !== 'object')
48
+ return value;
49
+ const live = LIVE.get(value);
50
+ return live === undefined ? value : live();
51
+ }
52
+ exports.valueBehind = valueBehind;
53
+ /** A plain object or array — the only containers the walk enters (a `Date`, `Map` or class instance is a leaf). */
54
+ function isPlainContainer(value) {
55
+ if (value === null || typeof value !== 'object')
56
+ return false;
57
+ if (Array.isArray(value))
58
+ return true;
59
+ const proto = Object.getPrototypeOf(value);
60
+ return proto === Object.prototype || proto === null;
61
+ }
62
+ /**
63
+ * `value` with every handle inside it replaced by the value behind it.
64
+ *
65
+ * A handle is replaced in O(1) and NOT entered (the state behind it holds no
66
+ * handles — they are built on read, never stored). A plain container is
67
+ * walked and copied ONLY when something inside it changed, so a handle-free
68
+ * value is returned as the same reference and a hand-built `{ item, index }`
69
+ * around one handle costs one object. Anything else (a `Date`, a `Map`, a
70
+ * class instance, a primitive) is a leaf. A cycle among plain containers is
71
+ * left as it is — `structuredClone` handles cycles; only a Proxy stops it.
72
+ */
73
+ function unwrapHandles(value) {
74
+ return walk(value, new Set());
75
+ }
76
+ exports.unwrapHandles = unwrapHandles;
77
+ function walk(value, onPath) {
78
+ if (value === null || typeof value !== 'object')
79
+ return value;
80
+ const live = LIVE.get(value);
81
+ if (live !== undefined)
82
+ return live();
83
+ if (!isPlainContainer(value) || onPath.has(value))
84
+ return value;
85
+ onPath.add(value);
86
+ const out = Array.isArray(value) ? walkArray(value, onPath) : walkObject(value, onPath);
87
+ onPath.delete(value);
88
+ return out;
89
+ }
90
+ function walkArray(value, onPath) {
91
+ let copy;
92
+ for (let i = 0; i < value.length; i++) {
93
+ const next = walk(value[i], onPath);
94
+ if (next === value[i])
95
+ continue;
96
+ copy ??= [...value];
97
+ copy[i] = next;
98
+ }
99
+ return copy ?? value;
100
+ }
101
+ function walkObject(value, onPath) {
102
+ let copy;
103
+ for (const key of Object.keys(value)) {
104
+ const next = walk(value[key], onPath);
105
+ if (next === value[key])
106
+ continue;
107
+ copy ??= { ...value };
108
+ copy[key] = next;
109
+ }
110
+ return copy ?? value;
111
+ }
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvaGFuZGxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRzs7O0FBRUgsOEVBQThFO0FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUF5QixDQUFDO0FBRWxELGtHQUFrRztBQUNsRyxTQUFnQixjQUFjLENBQW1CLE1BQVMsRUFBRSxJQUFtQjtJQUM3RSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBSEQsd0NBR0M7QUFFRCxnREFBZ0Q7QUFDaEQsU0FBZ0IsUUFBUSxDQUFDLEtBQWM7SUFDckMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFGRCw0QkFFQztBQUVELCtFQUErRTtBQUMvRSxTQUFnQixXQUFXLENBQUMsS0FBYztJQUN4QyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsT0FBTyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFKRCxrQ0FJQztBQUVELG1IQUFtSDtBQUNuSCxTQUFTLGdCQUFnQixDQUFDLEtBQWM7SUFDdEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixhQUFhLENBQUksS0FBUTtJQUN2QyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBTSxDQUFDO0FBQ3JDLENBQUM7QUFGRCxzQ0FFQztBQUVELFNBQVMsSUFBSSxDQUFDLEtBQWMsRUFBRSxNQUFtQjtJQUMvQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsSUFBSSxJQUFJLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDdEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDaEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsS0FBZ0IsRUFBRSxNQUFtQjtJQUN0RCxJQUFJLElBQTJCLENBQUM7SUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFBRSxTQUFTO1FBQ2hDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNqQixDQUFDO0lBQ0QsT0FBTyxJQUFJLElBQUksS0FBSyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUE4QixFQUFFLE1BQW1CO0lBQ3JFLElBQUksSUFBeUMsQ0FBQztJQUM5QyxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFBRSxTQUFTO1FBQ2xDLElBQUksS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxJQUFJLElBQUksS0FBSyxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlL2hhbmRsZXMg4oCUIHdoaWNoIG9iamVjdHMgYXJlIHRoZSBzY29wZSdzIEhBTkRMRVMsIGFuZCB0aGUgdmFsdWVcbiAqIGJlaGluZCBlYWNoLlxuICpcbiAqIEV2ZXJ5IG9iamVjdCB0aGUgdHlwZWQgc2NvcGUgaGFuZHMgYmFjayBpcyBhIFByb3h5IGJvdW5kIHRvIGl0cyBzdGFnZVxuICogKHJlYWN0aXZlL1JFQURNRS5tZCwgXCJBIGhhbmRsZSBpcyBib3VuZCB0byBpdHMgc3RhZ2VcIik6IGluc2lkZSB0aGUgc3RhZ2VcbiAqIHRoYXQgaXMgd2hhdCBtYWtlcyBhIGRlZXAgd3JpdGUgY29tbWl0IGFuZCBhIGhlbGQgcmVhZCBzdGF5IGxpdmUuIEEgaGFuZGxlXG4gKiBjYW4gYWxzbyBUUkFWRUwgb3V0IG9mIHRoZSBzdGFnZSBpbiB0aGUgbGlicmFyeSdzIG93biBoYW5kcyDigJQgYW5cbiAqIGBhZGRQYXJhbGxlbEZvckVhY2hgIGl0ZW1zIHNlbGVjdG9yIHJldHVybnMgdGhlIGFycmF5IGhhbmRsZSBhbmQgaXRzXG4gKiBlbGVtZW50cyBiZWNvbWUgdGhlIGdlbmVyYXRlZCBicmFuY2ggaW5wdXRzOyBhIHN1YmZsb3cgYGlucHV0TWFwcGVyYCBvclxuICogYG91dHB1dE1hcHBlcmAgaGFuZHMgb25lIG9uOyBgJHNldFZhbHVlKCdjb3B5Jywgc2NvcGUuY3VzdG9tZXIpYCBoYW5kcyBvbmVcbiAqIGJhY2suIFdoZXJldmVyIHRoZSBlbmdpbmUgUkVDT1JEUyBhIHZhbHVlIGl0IGNsb25lcyBpdCAoYHN0cnVjdHVyZWRDbG9uZWAsXG4gKiBhdCBjb21taXQgc2luY2UgOS4yMy4wKSwgYW5kIGEgUHJveHkgY2Fubm90IGJlIGNsb25lZDogYERhdGFDbG9uZUVycm9yYCxcbiAqIHRoZSBzdGFnZSdzIHdyaXRlcyBsb3N0LiA5LjIyLjDigJM5LjIzLjIgbG9zdCBldmVyeSBjaGlsZCBvZiBhIGZhbi1vdXQgb3ZlclxuICogb2JqZWN0IGl0ZW1zIHRoYXQgd2F5ICg5LjIzLjMpLlxuICpcbiAqIExBVzogYSBoYW5kbGUgdGhlIHNjb3BlIGhhbmRlZCBvdXQgaXMgYSB2YWx1ZSB0aGUgZW5naW5lIGFjY2VwdHMgYmFjay5cbiAqIEVhY2ggcHJveHkgZmFjdG9yeSByZWdpc3RlcnMgaXRzIGhhbmRsZSBoZXJlIHdpdGggdGhlIHNhbWUgbGl2ZSByZWFkZXIgaXRzXG4gKiBnZXQgdHJhcCB1c2VzLCBzbyB0aGUgdmFsdWUgYmVoaW5kIGEgaGFuZGxlIGlzIHdoYXQgYSByZWFkIG9mIGl0IHdvdWxkXG4gKiByZXR1cm4gTk9XIOKAlCBhbmQgdGhlIGVuZ2luZSBhc2tzIHtAbGluayB1bndyYXBIYW5kbGVzfSBhdCBldmVyeSBib3VuZGFyeVxuICogd2hlcmUgYXBwIGNvZGUgaGFuZHMgaXQgYSB2YWx1ZSB0byByZWNvcmQuIE8oMSkgZm9yIGEgaGFuZGxlIChhIFdlYWtNYXBcbiAqIGxvb2t1cCwgbm8gd2Fsaywgbm8gSlNPTiByb3VuZC10cmlwOiBhIGBEYXRlYCBzdGF5cyBhIGBEYXRlYCk7IGEgd2FsayBvbmx5XG4gKiBmb3IgYSBwbGFpbiBjb250YWluZXIgdGhlIGFwcCBidWlsdCBhcm91bmQgaGFuZGxlcywgY29weS1vbi13cml0ZSBzbyBhXG4gKiBoYW5kbGUtZnJlZSB2YWx1ZSBjb21lcyBiYWNrIGFzIHRoZSBTQU1FIHJlZmVyZW5jZS5cbiAqXG4gKiBUaGUgdmFsdWUgYmVoaW5kIGEgaGFuZGxlIGlzIEJPUlJPV0VEIOKAlCB0aGUgc2FtZSByZWZlcmVuY2UgYSByZWFkIGhhbmRzXG4gKiBiYWNrLCBjbG9uZWQgYnkgdGhlIGJ1ZmZlciBhdCBjb21taXQuIE5ldmVyIG11dGF0ZSBpdCAodGhlIHJlYWRzIGxhdykuXG4gKi9cblxuLyoqIEV2ZXJ5IGhhbmRsZSB0aGUgZm91ciBwcm94eSBmYWN0b3JpZXMgYnVpbHQsIG1hcHBlZCB0byBpdHMgbGl2ZSByZWFkZXIuICovXG5jb25zdCBMSVZFID0gbmV3IFdlYWtNYXA8b2JqZWN0LCAoKSA9PiB1bmtub3duPigpO1xuXG4vKiogUmVnaXN0ZXIgYGhhbmRsZWAgYXMgYSBzY29wZSBoYW5kbGUgd2hvc2UgY3VycmVudCB2YWx1ZSBgbGl2ZWAgcmV0dXJucy4gUmV0dXJucyB0aGUgaGFuZGxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWVtYmVySGFuZGxlPFQgZXh0ZW5kcyBvYmplY3Q+KGhhbmRsZTogVCwgbGl2ZTogKCkgPT4gdW5rbm93bik6IFQge1xuICBMSVZFLnNldChoYW5kbGUsIGxpdmUpO1xuICByZXR1cm4gaGFuZGxlO1xufVxuXG4vKiogSXMgYHZhbHVlYCBhIGhhbmRsZSB0aGUgc2NvcGUgaGFuZGVkIG91dD8gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0hhbmRsZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIExJVkUuaGFzKHZhbHVlKTtcbn1cblxuLyoqIFRoZSBsaXZlIHZhbHVlIGJlaGluZCBhIGhhbmRsZTsgYHZhbHVlYCBpdHNlbGYgd2hlbiBpdCBpcyBub3Qgb25lLiBPKDEpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlQmVoaW5kKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IGxpdmUgPSBMSVZFLmdldCh2YWx1ZSk7XG4gIHJldHVybiBsaXZlID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGxpdmUoKTtcbn1cblxuLyoqIEEgcGxhaW4gb2JqZWN0IG9yIGFycmF5IOKAlCB0aGUgb25seSBjb250YWluZXJzIHRoZSB3YWxrIGVudGVycyAoYSBgRGF0ZWAsIGBNYXBgIG9yIGNsYXNzIGluc3RhbmNlIGlzIGEgbGVhZikuICovXG5mdW5jdGlvbiBpc1BsYWluQ29udGFpbmVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duW10ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuLyoqXG4gKiBgdmFsdWVgIHdpdGggZXZlcnkgaGFuZGxlIGluc2lkZSBpdCByZXBsYWNlZCBieSB0aGUgdmFsdWUgYmVoaW5kIGl0LlxuICpcbiAqIEEgaGFuZGxlIGlzIHJlcGxhY2VkIGluIE8oMSkgYW5kIE5PVCBlbnRlcmVkICh0aGUgc3RhdGUgYmVoaW5kIGl0IGhvbGRzIG5vXG4gKiBoYW5kbGVzIOKAlCB0aGV5IGFyZSBidWlsdCBvbiByZWFkLCBuZXZlciBzdG9yZWQpLiBBIHBsYWluIGNvbnRhaW5lciBpc1xuICogd2Fsa2VkIGFuZCBjb3BpZWQgT05MWSB3aGVuIHNvbWV0aGluZyBpbnNpZGUgaXQgY2hhbmdlZCwgc28gYSBoYW5kbGUtZnJlZVxuICogdmFsdWUgaXMgcmV0dXJuZWQgYXMgdGhlIHNhbWUgcmVmZXJlbmNlIGFuZCBhIGhhbmQtYnVpbHQgYHsgaXRlbSwgaW5kZXggfWBcbiAqIGFyb3VuZCBvbmUgaGFuZGxlIGNvc3RzIG9uZSBvYmplY3QuIEFueXRoaW5nIGVsc2UgKGEgYERhdGVgLCBhIGBNYXBgLCBhXG4gKiBjbGFzcyBpbnN0YW5jZSwgYSBwcmltaXRpdmUpIGlzIGEgbGVhZi4gQSBjeWNsZSBhbW9uZyBwbGFpbiBjb250YWluZXJzIGlzXG4gKiBsZWZ0IGFzIGl0IGlzIOKAlCBgc3RydWN0dXJlZENsb25lYCBoYW5kbGVzIGN5Y2xlczsgb25seSBhIFByb3h5IHN0b3BzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwSGFuZGxlczxUPih2YWx1ZTogVCk6IFQge1xuICByZXR1cm4gd2Fsayh2YWx1ZSwgbmV3IFNldCgpKSBhcyBUO1xufVxuXG5mdW5jdGlvbiB3YWxrKHZhbHVlOiB1bmtub3duLCBvblBhdGg6IFNldDxvYmplY3Q+KTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IGxpdmUgPSBMSVZFLmdldCh2YWx1ZSk7XG4gIGlmIChsaXZlICE9PSB1bmRlZmluZWQpIHJldHVybiBsaXZlKCk7XG4gIGlmICghaXNQbGFpbkNvbnRhaW5lcih2YWx1ZSkgfHwgb25QYXRoLmhhcyh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgb25QYXRoLmFkZCh2YWx1ZSk7XG4gIGNvbnN0IG91dCA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gd2Fsa0FycmF5KHZhbHVlLCBvblBhdGgpIDogd2Fsa09iamVjdCh2YWx1ZSwgb25QYXRoKTtcbiAgb25QYXRoLmRlbGV0ZSh2YWx1ZSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHdhbGtBcnJheSh2YWx1ZTogdW5rbm93bltdLCBvblBhdGg6IFNldDxvYmplY3Q+KTogdW5rbm93bltdIHtcbiAgbGV0IGNvcHk6IHVua25vd25bXSB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5leHQgPSB3YWxrKHZhbHVlW2ldLCBvblBhdGgpO1xuICAgIGlmIChuZXh0ID09PSB2YWx1ZVtpXSkgY29udGludWU7XG4gICAgY29weSA/Pz0gWy4uLnZhbHVlXTtcbiAgICBjb3B5W2ldID0gbmV4dDtcbiAgfVxuICByZXR1cm4gY29weSA/PyB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gd2Fsa09iamVjdCh2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG9uUGF0aDogU2V0PG9iamVjdD4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGxldCBjb3B5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XG4gICAgY29uc3QgbmV4dCA9IHdhbGsodmFsdWVba2V5XSwgb25QYXRoKTtcbiAgICBpZiAobmV4dCA9PT0gdmFsdWVba2V5XSkgY29udGludWU7XG4gICAgY29weSA/Pz0geyAuLi52YWx1ZSB9O1xuICAgIGNvcHlba2V5XSA9IG5leHQ7XG4gIH1cbiAgcmV0dXJuIGNvcHkgPz8gdmFsdWU7XG59XG4iXX0=
@@ -8,7 +8,7 @@
8
8
  * scope.tags.push('vip') instead of scope.setValue('tags', [...tags, 'vip'])
9
9
  */
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.joinPath = exports.buildNestedPatch = exports.createArrayProxy = exports.shouldWrapWithProxy = exports.createTypedScope = exports.SCOPE_METHOD_NAMES = exports.IS_TYPED_SCOPE = exports.EXECUTOR_INTERNAL_METHODS = exports.BREAK_SETTER = void 0;
11
+ exports.joinPath = exports.buildNestedPatch = exports.valueBehind = exports.unwrapHandles = exports.isHandle = exports.createArrayProxy = exports.shouldWrapWithProxy = exports.createTypedScope = exports.SCOPE_METHOD_NAMES = exports.IS_TYPED_SCOPE = exports.EXECUTOR_INTERNAL_METHODS = exports.BREAK_SETTER = void 0;
12
12
  // Runtime constants
13
13
  var types_js_1 = require("./types.js");
14
14
  Object.defineProperty(exports, "BREAK_SETTER", { enumerable: true, get: function () { return types_js_1.BREAK_SETTER; } });
@@ -23,7 +23,11 @@ var allowlist_js_1 = require("./allowlist.js");
23
23
  Object.defineProperty(exports, "shouldWrapWithProxy", { enumerable: true, get: function () { return allowlist_js_1.shouldWrapWithProxy; } });
24
24
  var arrayTraps_js_1 = require("./arrayTraps.js");
25
25
  Object.defineProperty(exports, "createArrayProxy", { enumerable: true, get: function () { return arrayTraps_js_1.createArrayProxy; } });
26
+ var handles_js_1 = require("./handles.js");
27
+ Object.defineProperty(exports, "isHandle", { enumerable: true, get: function () { return handles_js_1.isHandle; } });
28
+ Object.defineProperty(exports, "unwrapHandles", { enumerable: true, get: function () { return handles_js_1.unwrapHandles; } });
29
+ Object.defineProperty(exports, "valueBehind", { enumerable: true, get: function () { return handles_js_1.valueBehind; } });
26
30
  var pathBuilder_js_1 = require("./pathBuilder.js");
27
31
  Object.defineProperty(exports, "buildNestedPatch", { enumerable: true, get: function () { return pathBuilder_js_1.buildNestedPatch; } });
28
32
  Object.defineProperty(exports, "joinPath", { enumerable: true, get: function () { return pathBuilder_js_1.joinPath; } });
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOzs7QUFLSCxvQkFBb0I7QUFDcEIsdUNBQXlHO0FBQWhHLHdHQUFBLFlBQVksT0FBQTtBQUFFLHFIQUFBLHlCQUF5QixPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsOEdBQUEsa0JBQWtCLE9BQUE7QUFFcEYsZUFBZTtBQUNmLDZEQUF5RDtBQUFoRCx1SEFBQSxnQkFBZ0IsT0FBQTtBQUV6QixZQUFZO0FBQ1osK0NBQXFEO0FBQTVDLG1IQUFBLG1CQUFtQixPQUFBO0FBQzVCLGlEQUFtRDtBQUExQyxpSEFBQSxnQkFBZ0IsT0FBQTtBQUN6QixtREFBOEQ7QUFBckQsa0hBQUEsZ0JBQWdCLE9BQUE7QUFBRSwwR0FBQSxRQUFRLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlLyAtLSBEZWVwIFByb3h5IHN5c3RlbSBmb3IgVHlwZWRTY29wZTxUPi5cbiAqXG4gKiBQcm92aWRlcyB0eXBlZCBwcm9wZXJ0eSBhY2Nlc3MgdG8gZm9vdHByaW50anMgc2NvcGUgc3RhdGU6XG4gKiAgIHNjb3BlLmNyZWRpdFRpZXIgPSAnQScgIGluc3RlYWQgb2YgIHNjb3BlLnNldFZhbHVlKCdjcmVkaXRUaWVyJywgJ0EnKVxuICogICBzY29wZS5jdXN0b21lci5hZGRyZXNzLnppcCA9ICc5MDIxMCcgIGluc3RlYWQgb2YgIHNjb3BlLnVwZGF0ZVZhbHVlKC4uLilcbiAqICAgc2NvcGUudGFncy5wdXNoKCd2aXAnKSAgaW5zdGVhZCBvZiAgc2NvcGUuc2V0VmFsdWUoJ3RhZ3MnLCBbLi4udGFncywgJ3ZpcCddKVxuICovXG5cbi8vIFR5cGVzXG5leHBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQsIFNjb3BlTWV0aG9kcywgVHlwZWRTY29wZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBSdW50aW1lIGNvbnN0YW50c1xuZXhwb3J0IHsgQlJFQUtfU0VUVEVSLCBFWEVDVVRPUl9JTlRFUk5BTF9NRVRIT0RTLCBJU19UWVBFRF9TQ09QRSwgU0NPUEVfTUVUSE9EX05BTUVTIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIENvcmUgZmFjdG9yeVxuZXhwb3J0IHsgY3JlYXRlVHlwZWRTY29wZSB9IGZyb20gJy4vY3JlYXRlVHlwZWRTY29wZS5qcyc7XG5cbi8vIFV0aWxpdGllc1xuZXhwb3J0IHsgc2hvdWxkV3JhcFdpdGhQcm94eSB9IGZyb20gJy4vYWxsb3dsaXN0LmpzJztcbmV4cG9ydCB7IGNyZWF0ZUFycmF5UHJveHkgfSBmcm9tICcuL2FycmF5VHJhcHMuanMnO1xuZXhwb3J0IHsgYnVpbGROZXN0ZWRQYXRjaCwgam9pblBhdGggfSBmcm9tICcuL3BhdGhCdWlsZGVyLmpzJztcbiJdfQ==
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOzs7QUFLSCxvQkFBb0I7QUFDcEIsdUNBQXlHO0FBQWhHLHdHQUFBLFlBQVksT0FBQTtBQUFFLHFIQUFBLHlCQUF5QixPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsOEdBQUEsa0JBQWtCLE9BQUE7QUFFcEYsZUFBZTtBQUNmLDZEQUF5RDtBQUFoRCx1SEFBQSxnQkFBZ0IsT0FBQTtBQUV6QixZQUFZO0FBQ1osK0NBQXFEO0FBQTVDLG1IQUFBLG1CQUFtQixPQUFBO0FBQzVCLGlEQUFtRDtBQUExQyxpSEFBQSxnQkFBZ0IsT0FBQTtBQUN6QiwyQ0FBb0U7QUFBM0Qsc0dBQUEsUUFBUSxPQUFBO0FBQUUsMkdBQUEsYUFBYSxPQUFBO0FBQUUseUdBQUEsV0FBVyxPQUFBO0FBQzdDLG1EQUE4RDtBQUFyRCxrSEFBQSxnQkFBZ0IsT0FBQTtBQUFFLDBHQUFBLFFBQVEsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvIC0tIERlZXAgUHJveHkgc3lzdGVtIGZvciBUeXBlZFNjb3BlPFQ+LlxuICpcbiAqIFByb3ZpZGVzIHR5cGVkIHByb3BlcnR5IGFjY2VzcyB0byBmb290cHJpbnRqcyBzY29wZSBzdGF0ZTpcbiAqICAgc2NvcGUuY3JlZGl0VGllciA9ICdBJyAgaW5zdGVhZCBvZiAgc2NvcGUuc2V0VmFsdWUoJ2NyZWRpdFRpZXInLCAnQScpXG4gKiAgIHNjb3BlLmN1c3RvbWVyLmFkZHJlc3MuemlwID0gJzkwMjEwJyAgaW5zdGVhZCBvZiAgc2NvcGUudXBkYXRlVmFsdWUoLi4uKVxuICogICBzY29wZS50YWdzLnB1c2goJ3ZpcCcpICBpbnN0ZWFkIG9mICBzY29wZS5zZXRWYWx1ZSgndGFncycsIFsuLi50YWdzLCAndmlwJ10pXG4gKi9cblxuLy8gVHlwZXNcbmV4cG9ydCB0eXBlIHsgUmVhY3RpdmVPcHRpb25zLCBSZWFjdGl2ZVRhcmdldCwgU2NvcGVNZXRob2RzLCBUeXBlZFNjb3BlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIFJ1bnRpbWUgY29uc3RhbnRzXG5leHBvcnQgeyBCUkVBS19TRVRURVIsIEVYRUNVVE9SX0lOVEVSTkFMX01FVEhPRFMsIElTX1RZUEVEX1NDT1BFLCBTQ09QRV9NRVRIT0RfTkFNRVMgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8gQ29yZSBmYWN0b3J5XG5leHBvcnQgeyBjcmVhdGVUeXBlZFNjb3BlIH0gZnJvbSAnLi9jcmVhdGVUeXBlZFNjb3BlLmpzJztcblxuLy8gVXRpbGl0aWVzXG5leHBvcnQgeyBzaG91bGRXcmFwV2l0aFByb3h5IH0gZnJvbSAnLi9hbGxvd2xpc3QuanMnO1xuZXhwb3J0IHsgY3JlYXRlQXJyYXlQcm94eSB9IGZyb20gJy4vYXJyYXlUcmFwcy5qcyc7XG5leHBvcnQgeyBpc0hhbmRsZSwgdW53cmFwSGFuZGxlcywgdmFsdWVCZWhpbmQgfSBmcm9tICcuL2hhbmRsZXMuanMnO1xuZXhwb3J0IHsgYnVpbGROZXN0ZWRQYXRjaCwgam9pblBhdGggfSBmcm9tICcuL3BhdGhCdWlsZGVyLmpzJztcbiJdfQ==