footprintjs 10.2.1 → 10.4.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 (131) hide show
  1. package/dist/esm/index.d.ts +3 -0
  2. package/dist/esm/index.js +1 -1
  3. package/dist/esm/lib/capture/absentEntries.d.ts +7 -0
  4. package/dist/esm/lib/capture/absentEntries.js +81 -0
  5. package/dist/esm/lib/capture/checkpointCapture.d.ts +11 -0
  6. package/dist/esm/lib/capture/checkpointCapture.js +104 -0
  7. package/dist/esm/lib/capture/historyData.d.ts +9 -0
  8. package/dist/esm/lib/capture/historyData.js +79 -0
  9. package/dist/esm/lib/capture/historyNote.d.ts +4 -0
  10. package/dist/esm/lib/capture/historyNote.js +52 -0
  11. package/dist/esm/lib/capture/historyTarget.d.ts +5 -0
  12. package/dist/esm/lib/capture/historyTarget.js +35 -0
  13. package/dist/esm/lib/capture/historyTypes.d.ts +39 -0
  14. package/dist/esm/lib/capture/historyTypes.js +4 -0
  15. package/dist/esm/lib/capture/nativeCoverage.d.ts +69 -0
  16. package/dist/esm/lib/capture/nativeCoverage.js +140 -0
  17. package/dist/esm/lib/capture/noteShape.d.ts +10 -0
  18. package/dist/esm/lib/capture/noteShape.js +93 -0
  19. package/dist/esm/lib/capture/readSources.d.ts +43 -0
  20. package/dist/esm/lib/capture/readSources.js +78 -0
  21. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
  22. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  23. package/dist/esm/lib/engine/types.d.ts +3 -0
  24. package/dist/esm/lib/engine/types.js +1 -1
  25. package/dist/esm/lib/memory/StageContext.d.ts +13 -0
  26. package/dist/esm/lib/memory/StageContext.js +110 -14
  27. package/dist/esm/lib/memory/attention.d.ts +2 -0
  28. package/dist/esm/lib/memory/attention.js +12 -5
  29. package/dist/esm/lib/memory/runPolicy.d.ts +5 -1
  30. package/dist/esm/lib/memory/runPolicy.js +2 -1
  31. package/dist/esm/lib/pause/record.js +8 -2
  32. package/dist/esm/lib/pause/types.d.ts +2 -0
  33. package/dist/esm/lib/pause/types.js +1 -1
  34. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +12 -1
  35. package/dist/esm/lib/recorder/ControlDepRecorder.js +23 -1
  36. package/dist/esm/lib/recorder/snapshot.d.ts +1 -1
  37. package/dist/esm/lib/recorder/snapshot.js +7 -2
  38. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +24 -1
  39. package/dist/esm/lib/runner/ExecutionRuntime.js +45 -4
  40. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +5 -0
  41. package/dist/esm/lib/runner/FlowChartExecutor.js +74 -7
  42. package/dist/esm/lib/runner/attach.js +6 -2
  43. package/dist/esm/lib/runner/captureHistory.d.ts +8 -0
  44. package/dist/esm/lib/runner/captureHistory.js +106 -0
  45. package/dist/esm/lib/runner/checkpoint.d.ts +2 -0
  46. package/dist/esm/lib/runner/checkpoint.js +3 -1
  47. package/dist/esm/lib/runner/index.d.ts +1 -0
  48. package/dist/esm/lib/runner/index.js +1 -1
  49. package/dist/esm/lib/runner/options.d.ts +3 -0
  50. package/dist/esm/lib/runner/options.js +46 -3
  51. package/dist/esm/lib/runner/readStoredCapture.d.ts +39 -0
  52. package/dist/esm/lib/runner/readStoredCapture.js +36 -0
  53. package/dist/esm/lib/runner/recordSink.d.ts +11 -0
  54. package/dist/esm/lib/runner/recordSink.js +47 -4
  55. package/dist/esm/lib/runner/snapshot.d.ts +3 -1
  56. package/dist/esm/lib/runner/snapshot.js +35 -4
  57. package/dist/esm/lib/runner/storedCaptureAdmission.d.ts +4 -0
  58. package/dist/esm/lib/runner/storedCaptureAdmission.js +97 -0
  59. package/dist/esm/lib/scope/ScopeFacade.js +4 -2
  60. package/dist/esm/lib/scope/runtime.d.ts +2 -0
  61. package/dist/esm/lib/scope/runtime.js +9 -1
  62. package/dist/esm/lib/sinks/fileSink.d.ts +2 -1
  63. package/dist/esm/lib/sinks/fileSink.js +8 -2
  64. package/dist/esm/trace.d.ts +2 -0
  65. package/dist/esm/trace.js +2 -1
  66. package/dist/index.js +1 -1
  67. package/dist/lib/capture/absentEntries.js +86 -0
  68. package/dist/lib/capture/checkpointCapture.js +110 -0
  69. package/dist/lib/capture/historyData.js +85 -0
  70. package/dist/lib/capture/historyNote.js +56 -0
  71. package/dist/lib/capture/historyTarget.js +40 -0
  72. package/dist/lib/capture/historyTypes.js +7 -0
  73. package/dist/lib/capture/nativeCoverage.js +146 -0
  74. package/dist/lib/capture/noteShape.js +103 -0
  75. package/dist/lib/capture/readSources.js +83 -0
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
  77. package/dist/lib/engine/types.js +1 -1
  78. package/dist/lib/memory/StageContext.js +110 -14
  79. package/dist/lib/memory/attention.js +12 -5
  80. package/dist/lib/memory/runPolicy.js +2 -1
  81. package/dist/lib/pause/record.js +8 -2
  82. package/dist/lib/pause/types.js +1 -1
  83. package/dist/lib/recorder/ControlDepRecorder.js +23 -1
  84. package/dist/lib/recorder/snapshot.js +7 -2
  85. package/dist/lib/runner/ExecutionRuntime.js +44 -3
  86. package/dist/lib/runner/FlowChartExecutor.js +77 -10
  87. package/dist/lib/runner/attach.js +5 -1
  88. package/dist/lib/runner/captureHistory.js +110 -0
  89. package/dist/lib/runner/checkpoint.js +3 -1
  90. package/dist/lib/runner/index.js +1 -1
  91. package/dist/lib/runner/options.js +46 -3
  92. package/dist/lib/runner/readStoredCapture.js +40 -0
  93. package/dist/lib/runner/recordSink.js +47 -4
  94. package/dist/lib/runner/snapshot.js +35 -4
  95. package/dist/lib/runner/storedCaptureAdmission.js +101 -0
  96. package/dist/lib/scope/ScopeFacade.js +3 -1
  97. package/dist/lib/scope/runtime.js +12 -2
  98. package/dist/lib/sinks/fileSink.js +8 -2
  99. package/dist/trace.js +4 -2
  100. package/dist/types/index.d.ts +3 -0
  101. package/dist/types/lib/capture/absentEntries.d.ts +7 -0
  102. package/dist/types/lib/capture/checkpointCapture.d.ts +11 -0
  103. package/dist/types/lib/capture/historyData.d.ts +9 -0
  104. package/dist/types/lib/capture/historyNote.d.ts +4 -0
  105. package/dist/types/lib/capture/historyTarget.d.ts +5 -0
  106. package/dist/types/lib/capture/historyTypes.d.ts +39 -0
  107. package/dist/types/lib/capture/nativeCoverage.d.ts +69 -0
  108. package/dist/types/lib/capture/noteShape.d.ts +10 -0
  109. package/dist/types/lib/capture/readSources.d.ts +43 -0
  110. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  111. package/dist/types/lib/engine/types.d.ts +3 -0
  112. package/dist/types/lib/memory/StageContext.d.ts +13 -0
  113. package/dist/types/lib/memory/attention.d.ts +2 -0
  114. package/dist/types/lib/memory/runPolicy.d.ts +5 -1
  115. package/dist/types/lib/pause/types.d.ts +2 -0
  116. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +12 -1
  117. package/dist/types/lib/recorder/snapshot.d.ts +1 -1
  118. package/dist/types/lib/runner/ExecutionRuntime.d.ts +24 -1
  119. package/dist/types/lib/runner/FlowChartExecutor.d.ts +5 -0
  120. package/dist/types/lib/runner/captureHistory.d.ts +8 -0
  121. package/dist/types/lib/runner/checkpoint.d.ts +2 -0
  122. package/dist/types/lib/runner/index.d.ts +1 -0
  123. package/dist/types/lib/runner/options.d.ts +3 -0
  124. package/dist/types/lib/runner/readStoredCapture.d.ts +39 -0
  125. package/dist/types/lib/runner/recordSink.d.ts +11 -0
  126. package/dist/types/lib/runner/snapshot.d.ts +3 -1
  127. package/dist/types/lib/runner/storedCaptureAdmission.d.ts +4 -0
  128. package/dist/types/lib/scope/runtime.d.ts +2 -0
  129. package/dist/types/lib/sinks/fileSink.d.ts +2 -1
  130. package/dist/types/trace.d.ts +2 -0
  131. package/package.json +2 -2
@@ -89,6 +89,8 @@ export interface ControlDecisionRecord {
89
89
  ruleLabel?: string;
90
90
  }
91
91
  export interface ControlDepRecorderOptions {
92
+ /** Opt in to a same-run collection acknowledgement in the snapshot bundle. */
93
+ captureCoverage?: boolean;
92
94
  /** Recorder id. Defaults to `control-deps-N` (auto-incremented). */
93
95
  id?: string;
94
96
  }
@@ -115,7 +117,11 @@ export declare class ControlDepRecorder implements FlowRecorder {
115
117
  private readonly consumedSlots;
116
118
  /** Convention 4 — runId of the run currently being recorded. */
117
119
  private lastRunId?;
120
+ private readonly captureCoverage;
121
+ private captureRunId?;
122
+ private captureIntact;
118
123
  constructor(options?: ControlDepRecorderOptions);
124
+ onRunStart(event: import('../engine/narrative/types.js').FlowRunEvent): void;
119
125
  onDecision(event: FlowDecisionEvent): void;
120
126
  onAttempt(event: FlowAttemptEvent): void;
121
127
  onSelected(event: FlowSelectedEvent): void;
@@ -146,13 +152,18 @@ export declare class ControlDepRecorder implements FlowRecorder {
146
152
  * Parentless roots cannot have a governing control edge.
147
153
  */
148
154
  toSnapshot(): {
149
- name: string;
150
155
  data: {
151
156
  decisions: ControlDecisionRecord[];
152
157
  controlDeps: {
153
158
  [k: string]: ControlDependency;
154
159
  };
155
160
  };
161
+ capture?: {
162
+ version: 1;
163
+ runId: string;
164
+ control: "captured" | "partial";
165
+ } | undefined;
166
+ name: string;
156
167
  };
157
168
  /** Reset all state (also happens automatically on runId change). */
158
169
  clear(): void;
@@ -91,9 +91,22 @@ export class ControlDepRecorder {
91
91
  consumedSlots = new Set();
92
92
  /** Convention 4 — runId of the run currently being recorded. */
93
93
  lastRunId;
94
+ captureCoverage;
95
+ captureRunId;
96
+ captureIntact = false;
94
97
  constructor(options = {}) {
98
+ this.captureCoverage = options.captureCoverage === true;
95
99
  this.id = options.id ?? `control-deps-${++_counter}`;
96
100
  }
101
+ onRunStart(event) {
102
+ if (this.captureCoverage) {
103
+ const runId = event.traversalContext?.runId;
104
+ if (runId)
105
+ this.resetIfNewRun(runId);
106
+ this.captureRunId = runId;
107
+ this.captureIntact = true;
108
+ }
109
+ }
97
110
  // ── FlowRecorder hooks ────────────────────────────────────────────────
98
111
  onDecision(event) {
99
112
  const ctx = event.traversalContext;
@@ -220,11 +233,20 @@ export class ControlDepRecorder {
220
233
  }
221
234
  return {
222
235
  name: 'control-dependencies',
236
+ ...(this.captureCoverage &&
237
+ this.captureRunId && {
238
+ capture: {
239
+ version: 1,
240
+ runId: this.captureRunId,
241
+ control: this.captureIntact ? 'captured' : 'partial',
242
+ },
243
+ }),
223
244
  data: { decisions: this.getDecisions(), controlDeps: Object.fromEntries(dependencies) },
224
245
  };
225
246
  }
226
247
  /** Reset all state (also happens automatically on runId change). */
227
248
  clear() {
249
+ this.captureIntact = false;
228
250
  this.parentOf.clear();
229
251
  this.decisions.clear();
230
252
  this.branchEntryToDecision.clear();
@@ -274,4 +296,4 @@ function matchedRuleLabel(evidence) {
274
296
  const rule = evidence.rules.find((r) => r.matched && r.branch === evidence.chosen) ?? evidence.rules.find((r) => r.matched);
275
297
  return rule?.label;
276
298
  }
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbERlcFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9Db250cm9sRGVwUmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUVHO0FBYUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBb0NyRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsVUFBcUMsRUFBRTtJQUN4RSxPQUFPLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3BCLEVBQUUsQ0FBUztJQUVwQiwwRUFBMEU7SUFDekQsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3RELDJEQUEyRDtJQUMxQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFDdEUsc0VBQXNFO0lBQ3JELHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ25FLGlFQUFpRTtJQUN6RCxPQUFPLEdBQXNCLEVBQUUsQ0FBQztJQUN4Qyx1RUFBdUU7SUFDdEQsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDbkQsZ0VBQWdFO0lBQ3hELFNBQVMsQ0FBVTtJQUUzQixZQUFZLFVBQXFDLEVBQUU7UUFDakQsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFRCx5RUFBeUU7SUFFekUsVUFBVSxDQUFDLEtBQXdCO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0Is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Q0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxvQkFBb0I7Z0JBQUUsU0FBUztZQUVuRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN2QyxJQUFJLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDO2dCQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoRCxPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsUUFBc0M7SUFDOUQsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FDUixRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pILE9BQU8sSUFBSSxFQUFFLEtBQUssQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250cm9sRGVwUmVjb3JkZXIg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSB0cmFja2luZyBmcm9tIGZsb3cgZXZlbnRzIChSRkMtMDAzIEQ1KS5cbiAqXG4gKiBUaGUgZ2FwIHRoaXMgZmlsbHM6XG4gKiAgIFRoZSBiYWNrdHJhY2tlcidzIGBjb250cm9sRGVwc2Agb3B0aW9uIChEMykgbmVlZHMgYSBgQ29udHJvbERlcExvb2t1cGA6XG4gKiAgIFwid2hpY2ggZGVjaWRlciBleGVjdXRpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bj9cIiBUaGUgZW5naW5lIGtub3dzXG4gKiAgIHRoaXMgZHVyaW5nIHRyYXZlcnNhbCBidXQgdGhlIGNvbW1pdCBsb2cgZG9lc24ndCByZWNvcmQgaXQg4oCUIGNvbnRyb2xcbiAqICAgZmxvdyBpcyBhIEZsb3dSZWNvcmRlciBjb25jZXJuLiBUaGlzIHJlY29yZGVyIGlzIHRoZSBzdGFuZGFyZCBwcm9kdWNlcjpcbiAqICAgb25lIHN1YnNjcmlwdGlvbiwgb25lIGxvb2t1cCwgcGx1ZyBpdCBzdHJhaWdodCBpbnRvIGBjYXVzYWxDaGFpbmAuXG4gKlxuICogSG93IGl0IHdvcmtzIOKAlCB0d28gY29ycmVsYXRpb24gc3RydWN0dXJlcyBidWlsdCBkdXJpbmcgdHJhdmVyc2FsOlxuICpcbiAqICAgMS4gYHBhcmVudE9mYCDigJQgdGhlIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4sIGZyb20gZXZlcnkgc3RhZ2UgZXZlbnQnc1xuICogICAgICBgdHJhdmVyc2FsQ29udGV4dC5wYXJlbnRSdW50aW1lU3RhZ2VJZGAgKFJGQy0wMDMgRDEpLiBDcm9zc2VzXG4gKiAgICAgIHN1YmZsb3cgYm91bmRhcmllczsgbG9vcCByZS1lbnRyaWVzIHN0YXkgdW5hbWJpZ3VvdXMgYmVjYXVzZVxuICogICAgICBydW50aW1lIGlkcyBkaWZmZXIgcGVyIGl0ZXJhdGlvbi5cbiAqXG4gKiAgIDIuIGBicmFuY2hFbnRyeVRvRGVjaXNpb25gIOKAlCBvbiBgb25EZWNpc2lvbmAvYG9uU2VsZWN0ZWRgIHRoZSBkZWNpc2lvblxuICogICAgICBpcyByZWNvcmRlZCBhcyBQRU5ESU5HOyB0aGUgbmV4dCBzdGFnZShzKSBleGVjdXRlZCB3aG9zZVxuICogICAgICBgcGFyZW50UnVudGltZVN0YWdlSWRgIElTIHRoZSBkZWNpZGVyJ3MgcnVudGltZVN0YWdlSWQgYXJlIGl0c1xuICogICAgICBicmFuY2ggZW50cmllcyAoMSBmb3IgYSBkZWNpZGVyLCBOID0gc2VsZWN0ZWQubGVuZ3RoIGZvciBhXG4gKiAgICAgIHNlbGVjdG9yKS4gQ29ycmVsYXRpb24gaXMgYnkgcGFyZW50LWlkICsgY291bnQsIE5PVCBieSBzdGFnZSBuYW1lIOKAlFxuICogICAgICBzdWJmbG93LW1vdW50IGV2ZW50cyBjYXJyeSBwYXRoLXByZWZpeGVkIGlubmVyLXJvb3QgbmFtZXMgdGhhdFxuICogICAgICBkb24ndCBtYXRjaCBgRmxvd0RlY2lzaW9uRXZlbnQuY2hvc2VuYCwgYW5kIHNlbGVjdG9ycyBlbWl0IGFcbiAqICAgICAgc3ludGhldGljIGZvcmsgZXZlbnQgc2hhcmluZyB0aGUgc2VsZWN0b3IncyBvd24gcnVudGltZVN0YWdlSWRcbiAqICAgICAgKGV4Y2x1ZGVkIHZpYSB0aGUgc2VsZi1pZCBndWFyZCkuIEEgYnJhbmNoIHRoYXQgVEhST1dTIGJlZm9yZVxuICogICAgICBjb21wbGV0aW5nIGNvbnN1bWVzIGl0cyBzbG90IHZpYSBgb25FcnJvcmAsIHNvIHRoZSBwb3N0LWZhbi1vdXRcbiAqICAgICAgY29udmVyZ2VuY2Ugc3RhZ2UgaXMgbmV2ZXIgbWlzYXR0cmlidXRlZCBhcyBhIGJyYW5jaCBlbnRyeS5cbiAqXG4gKiAgIDMuIGF0dGVtcHQgc3RvcHMgKDEwLjEpIOKAlCBgb25BdHRlbXB0YDogYSBzdGFnZSB3aG9zZSByZXRyeSBzZXJpZXMgU1RPUFBFRFxuICogICAgICAoaXQgZ2F2ZSB1cCwgb3IgYSBsYXRlciBhdHRlbXB0IHBhdXNlZCBvciB3YXMgYWJvcnRlZDsgdGhlIHNoYXJlZFxuICogICAgICBwcmVkaWNhdGUgYHJlY29yZGVyL2F0dGVtcHRTZXJpZXMudHMgwrcgaXNSZXRyeUV2aWRlbmNlYCkgbWFkZSBhIGRlY2lzaW9uIG9mIGl0c1xuICogICAgICBvd24g4oCUIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uLCBpbiB0aGUgc2hhcGUgYGRlY2lkZSgpYCBwcm9kdWNlcy4gSXRcbiAqICAgICAgaXMgcmVjb3JkZWQgYmVzaWRlIHRoZSBkZWNpZGVycyBhcyBga2luZDogJ2F0dGVtcHQtc3RvcCdgXG4gKiAgICAgIChgZ2V0RGVjaXNpb25zKClgLCBgZ2V0QXR0ZW1wdFN0b3AoaWQpYCksIGBjaG9zZW46ICdzdG9wJ2AsIHRoZSBzdG9wXG4gKiAgICAgIHJlYXNvbiBhcyBpdHMgYHJ1bGVMYWJlbGAuIEl0IGlzIE5PVCBhIGJyYW5jaCBlbnRyeTogYSBjb250cm9sIGVkZ2UgaW5cbiAqICAgICAgYGNhdXNhbENoYWluYCBsaW5rcyBhIHN0YWdlIHRvIEFOT1RIRVIgZXhlY3V0aW9uIHRoYXQgZ292ZXJuZWQgaXQsIGFuZFxuICogICAgICB0aGUgc3RvcCBnb3Zlcm5zIHRoZSBzdGFnZSBpdHNlbGYg4oCUIHNvIGBsb29rdXBgIGlzIHVuY2hhbmdlZCwgYW5kIGFcbiAqICAgICAgcmVhZGVyIHdhbGtpbmcgYSBmYWlsZWQgc3RhZ2UgcmVhZHMgdGhlIHN0b3Agb2ZmIGl0cyBkZWNpc2lvbiByZWNvcmQuXG4gKlxuICogICBgbG9va3VwKHJ1bnRpbWVTdGFnZUlkKWAgdGhlbiB3YWxrcyB0aGUgYW5jZXN0b3IgY2hhaW4gZnJvbSB0aGUgc3RhZ2VcbiAqICAgdXB3YXJkOyB0aGUgZmlyc3QgYW5jZXN0b3IgKG9yIHRoZSBzdGFnZSBpdHNlbGYpIHJlZ2lzdGVyZWQgYXMgYVxuICogICBicmFuY2ggZW50cnkgeWllbGRzIGl0cyBnb3Zlcm5pbmcgZGVjaWRlciDigJQgdGhlIE5FQVJFU1QgZGVjaXNpb24uXG4gKiAgIE5lc3RlZCBkZWNpc2lvbnMgY29tcG9zZSBuYXR1cmFsbHk6IHRoZSBiYWNrdHJhY2tlciBleHBhbmRzIHRoZVxuICogICBkZWNpZGVyIG5vZGUgYW5kIGFza3MgYWdhaW4uXG4gKlxuICogQ29udmVudGlvbiA0OiBzdGF0ZSByZXNldHMgd2hlbiBgdHJhdmVyc2FsQ29udGV4dC5ydW5JZGAgY2hhbmdlcyDigJQgZWFjaFxuICogcnVuIChhbmQgZWFjaCByZXN1bWUsIHdoaWNoIG1pbnRzIGEgZnJlc2ggcnVuSWQpIHN0YXJ0cyBjbGVhbi4gQ29udHJvbFxuICogY2hhaW5zIHRoZXJlZm9yZSBkbyBOT1Qgc3Vydml2ZSBhIHBhdXNlL3Jlc3VtZSBib3VuZGFyeTogcG9zdC1yZXN1bWVcbiAqIHN0YWdlcyBjYW5ub3QgcmVzb2x2ZSBwcmUtcGF1c2UgZGVjaXNpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjb250cm9sRGVwUmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG5pbXBvcnQgeyBjYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG4gKlxuICogY29uc3QgY3RybCA9IGNvbnRyb2xEZXBSZWNvcmRlcigpO1xuICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihjdHJsKTsgLy8gYXV0by1yb3V0ZXMgdG8gRmxvd1JlY29yZGVyIGNoYW5uZWxcbiAqXG4gKiBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAqXG4gKiBjb25zdCBkYWcgPSBjYXVzYWxDaGFpbihjb21taXRMb2csICdhcHByb3ZlIzInLCBrZXlzUmVhZCwge1xuICogICBjb250cm9sRGVwczogY3RybC5hc0xvb2t1cCgpLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbnRyb2xEZXBlbmRlbmN5LCBDb250cm9sRGVwTG9va3VwIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBEZWNpc2lvbkV2aWRlbmNlLCBTZWxlY3Rpb25FdmlkZW5jZSB9IGZyb20gJy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG59IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeUV2aWRlbmNlIH0gZnJvbSAnLi9hdHRlbXB0U2VyaWVzLmpzJztcblxuLyoqIE9uZSByZWNvcmRlZCBkZWNpc2lvbi9zZWxlY3Rpb24gZXZlbnQgKFJGQy0wMDMgRDUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVjaXNpb25SZWNvcmQge1xuICAvKipcbiAgICogYCdhdHRlbXB0LXN0b3AnYCBmb3IgYSBzdGFnZSdzIG93biByZXRyeS1vci1zdG9wIGRlY2lzaW9uIHRoYXQgU1RPUFBFRCBpdHMgc2VyaWVzICgxMC4xKSDigJQgdGhlblxuICAgKiBgZGVjaWRlclJ1bnRpbWVTdGFnZUlkYCBpcyB0aGUgc3RhZ2UncyBleGVjdXRpb24sIGBjaG9zZW5gIGlzIGAnc3RvcCdgLCBgZXZpZGVuY2VgIHRoZSBhdHRlbXB0J3MgZGVjaXNpb24gYW5kXG4gICAqIGBydWxlTGFiZWxgIHRoZSBzdG9wIHJlYXNvbi4gQWJzZW50IGZvciBhIGRlY2lkZXIgLyBzZWxlY3Rvci5cbiAgICovXG4gIGtpbmQ/OiAnYXR0ZW1wdC1zdG9wJztcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBzdGVwLiAqL1xuICBkZWNpZGVyUnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIENob3NlbiBicmFuY2ggZGlzcGxheSBuYW1lIChkZWNpZGVyKSBvciBzZWxlY3RlZCBuYW1lcyAoc2VsZWN0b3IpLiAqL1xuICBjaG9zZW46IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU3RydWN0dXJlZCBldmlkZW5jZSBmcm9tIGRlY2lkZSgpL3NlbGVjdCgpLCB3aGVuIHRoZSBzdGFnZSB1c2VkIHRoZW0uICovXG4gIGV2aWRlbmNlPzogRGVjaXNpb25FdmlkZW5jZSB8IFNlbGVjdGlvbkV2aWRlbmNlO1xuICAvKipcbiAgICogVGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgdGhhdCBwcm9kdWNlZCB0aGUgZGVjaXNpb24gKGUuZy4gJ0dvb2QgY3JlZGl0JykuXG4gICAqIERlY2lkZXJzIG9ubHkg4oCUIGEgc2VsZWN0b3IgcGlja3MgTiBicmFuY2hlcyBhbmQgbm8gc2luZ2xlIGxhYmVsXG4gICAqIGF0dHJpYnV0ZXMgdG8gYWxsIG9mIHRoZW0gKGluc3BlY3QgYGV2aWRlbmNlYCBpbnN0ZWFkKS5cbiAgICovXG4gIHJ1bGVMYWJlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIFJlY29yZGVyIGlkLiBEZWZhdWx0cyB0byBgY29udHJvbC1kZXBzLU5gIChhdXRvLWluY3JlbWVudGVkKS4gKi9cbiAgaWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBBIGRlY2lzaW9uIGF3YWl0aW5nIGJyYW5jaC1lbnRyeSBjb3JyZWxhdGlvbi4gKi9cbmludGVyZmFjZSBQZW5kaW5nRGVjaXNpb24ge1xuICBkZWNpZGVySWQ6IHN0cmluZztcbiAgLyoqIEhvdyBtYW55IGJyYW5jaCBlbnRyaWVzIGFyZSBzdGlsbCBleHBlY3RlZCAoZGVjaWRlcjogMSwgc2VsZWN0b3I6IE4pLiAqL1xuICByZW1haW5pbmc6IG51bWJlcjtcbn1cblxubGV0IF9jb3VudGVyID0gMDtcblxuLyoqXG4gKiBGYWN0b3J5IOKAlCBtYXRjaGVzIHRoZSBgdG9wb2xvZ3lSZWNvcmRlcigpYCAvIGBpbk91dFJlY29yZGVyKClgIHN0eWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbERlcFJlY29yZGVyKG9wdGlvbnM6IENvbnRyb2xEZXBSZWNvcmRlck9wdGlvbnMgPSB7fSk6IENvbnRyb2xEZXBSZWNvcmRlciB7XG4gIHJldHVybiBuZXcgQ29udHJvbERlcFJlY29yZGVyKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFN0YXRlZnVsIGFjY3VtdWxhdG9yIHRoYXQgd2F0Y2hlcyBGbG93UmVjb3JkZXIgZXZlbnRzIGFuZCBhbnN3ZXJzXG4gKiBcIndoaWNoIGRlY2lzaW9uIGFsbG93ZWQgdGhpcyBzdGFnZSB0byBydW4/XCIgQXR0YWNoIHZpYVxuICogYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXIpYCAob3IgYGF0dGFjaEZsb3dSZWNvcmRlcmApLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbERlcFJlY29yZGVyIGltcGxlbWVudHMgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKiogUnVudGltZSBhbmNlc3RvciBjaGFpbjogcnVudGltZVN0YWdlSWQg4oaSIHBhcmVudFJ1bnRpbWVTdGFnZUlkIChEMSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50T2YgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogUmVjb3JkZWQgZGVjaXNpb25zLCBrZXllZCBieSBkZWNpZGVyIHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY2lzaW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBDb250cm9sRGVjaXNpb25SZWNvcmQ+KCk7XG4gIC8qKiBCcmFuY2gtZW50cnkgcnVudGltZVN0YWdlSWQg4oaSIGdvdmVybmluZyBkZWNpZGVyIHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaEVudHJ5VG9EZWNpc2lvbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBEZWNpc2lvbnMgd2hvc2UgYnJhbmNoIGVudHJpZXMgaGF2ZSBub3QgYWxsIGJlZW4gc2VlbiB5ZXQuICovXG4gIHByaXZhdGUgcGVuZGluZzogUGVuZGluZ0RlY2lzaW9uW10gPSBbXTtcbiAgLyoqIFN0YWdlIGlkcyB0aGF0IGFscmVhZHkgY29uc3VtZWQgYSBwZW5kaW5nIHNsb3QgKGVudHJ5IE9SIGVycm9yKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25zdW1lZFNsb3RzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKiBDb252ZW50aW9uIDQg4oCUIHJ1bklkIG9mIHRoZSBydW4gY3VycmVudGx5IGJlaW5nIHJlY29yZGVkLiAqL1xuICBwcml2YXRlIGxhc3RSdW5JZD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZCA/PyBgY29udHJvbC1kZXBzLSR7KytfY291bnRlcn1gO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3dSZWNvcmRlciBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvbkRlY2lzaW9uKGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcblxuICAgIGNvbnN0IGRlY2lkZXJJZCA9IGN0eC5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBydWxlTGFiZWwgPSBtYXRjaGVkUnVsZUxhYmVsKGV2ZW50LmV2aWRlbmNlKTtcbiAgICB0aGlzLmRlY2lzaW9ucy5zZXQoZGVjaWRlcklkLCB7XG4gICAgICBkZWNpZGVyUnVudGltZVN0YWdlSWQ6IGRlY2lkZXJJZCxcbiAgICAgIGNob3NlbjogZXZlbnQuY2hvc2VuLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgICAgLi4uKHJ1bGVMYWJlbCAhPT0gdW5kZWZpbmVkICYmIHsgcnVsZUxhYmVsIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IDEgfSk7XG4gIH1cblxuICBvbkF0dGVtcHQoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGNvbnN0IHsgcmVjb3JkIH0gPSBldmVudDtcbiAgICBpZiAoIWN0eCB8fCByZWNvcmQubmV4dCAhPT0gJ3N0b3AnIHx8ICFpc1JldHJ5RXZpZGVuY2UocmVjb3JkKSkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChyZWNvcmQuc2VyaWVzLCB7XG4gICAgICBraW5kOiAnYXR0ZW1wdC1zdG9wJyxcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogcmVjb3JkLnNlcmllcyxcbiAgICAgIGNob3NlbjogJ3N0b3AnLFxuICAgICAgZXZpZGVuY2U6IHJlY29yZC5kZWNpc2lvbixcbiAgICAgIHJ1bGVMYWJlbDogcmVjb3JkLnJlYXNvbixcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWQoZXZlbnQ6IEZsb3dTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIGlmIChldmVudC5zZWxlY3RlZC5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm90aGluZyBzZWxlY3RlZCDihpIgbm90aGluZyBnb3Zlcm5lZFxuXG4gICAgY29uc3QgZGVjaWRlcklkID0gY3R4LnJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChkZWNpZGVySWQsIHtcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogZGVjaWRlcklkLFxuICAgICAgY2hvc2VuOiBbLi4uZXZlbnQuc2VsZWN0ZWRdLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IGV2ZW50LnNlbGVjdGVkLmxlbmd0aCB9KTtcbiAgfVxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgdGhpcy5yZXNldElmTmV3UnVuKGN0eC5ydW5JZCk7XG5cbiAgICBjb25zdCB7IHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCB9ID0gY3R4O1xuICAgIGlmIChwYXJlbnRSdW50aW1lU3RhZ2VJZCkge1xuICAgICAgdGhpcy5wYXJlbnRPZi5zZXQocnVudGltZVN0YWdlSWQsIHBhcmVudFJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIHRoaXMuY29uc3VtZVBlbmRpbmdTbG90KHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgYnJhbmNoIHRoYXQgdGhyb3dzIG5ldmVyIGZpcmVzIGBvblN0YWdlRXhlY3V0ZWRgIOKAlCB3aXRob3V0IHRoaXMgaG9va1xuICAgKiBpdHMgcGVuZGluZyBzbG90IHdvdWxkIGxlYWsgYW5kIHRoZSBwb3N0LWZhbi1vdXQgY29udmVyZ2VuY2Ugc3RhZ2VcbiAgICogKHdob3NlIGNvbnRleHQgYWxzbyBjaGFpbnMgdG8gdGhlIHNlbGVjdG9yKSB3b3VsZCBiZSBtaXNhdHRyaWJ1dGVkIGFzXG4gICAqIGEgYnJhbmNoIGVudHJ5IHVuZGVyIGJlc3QtZWZmb3J0IChgZmFpbEZhc3Q6IGZhbHNlYCkgZmFuLW91dHMuXG4gICAqL1xuICBvbkVycm9yKGV2ZW50OiBGbG93RXJyb3JFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcbiAgICBpZiAoY3R4LnBhcmVudFJ1bnRpbWVTdGFnZUlkKSB7XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYWluIEFORCBhdHRyaWJ1dGUgdGhlIGZhaWxlZCBzdGFnZSB0byBpdHMgZGVjaXNpb24g4oCUXG4gICAgICAvLyB0aGUgc3RhZ2UgUkFOIChhbmQgbWF5IGhhdmUgY29tbWl0dGVkIHBhcnRpYWwgd3JpdGVzKSBiZWNhdXNlIHRoZVxuICAgICAgLy8gZGVjaXNpb24gY2hvc2UgaXQ7IGZhaWxpbmcgYWZ0ZXJ3YXJkcyBkb2Vzbid0IHVuZG8gdGhlIGRlcGVuZGVuY3kuXG4gICAgICB0aGlzLnBhcmVudE9mLnNldChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCk7XG4gICAgICB0aGlzLmNvbnN1bWVQZW5kaW5nU2xvdChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXJpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIE5FQVJFU1QgZ292ZXJuaW5nIGRlY2lzaW9uIGZvciBhbiBleGVjdXRpb24gc3RlcDogd2Fsa3MgdGhlXG4gICAqIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4gKHRoZSBzdGVwIGl0c2VsZiBmaXJzdCkgdW50aWwgaXQgaGl0cyBhXG4gICAqIHJlZ2lzdGVyZWQgYnJhbmNoIGVudHJ5LiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzdGVwIGlzIG5vdCBkb3duc3RyZWFtIG9mXG4gICAqIGFueSByZWNvcmRlZCBkZWNpc2lvbi5cbiAgICovXG4gIGxvb2t1cChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgY3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBydW50aW1lU3RhZ2VJZDtcbiAgICB3aGlsZSAoY3VyICE9PSB1bmRlZmluZWQgJiYgIXNlZW4uaGFzKGN1cikpIHtcbiAgICAgIHNlZW4uYWRkKGN1cik7XG4gICAgICBjb25zdCBkZWNpZGVySWQgPSB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5nZXQoY3VyKTtcbiAgICAgIGlmIChkZWNpZGVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmRlY2lzaW9ucy5nZXQoZGVjaWRlcklkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZWNpZGVySWQsXG4gICAgICAgICAgLi4uKHJlY29yZD8ucnVsZUxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbDogcmVjb3JkLnJ1bGVMYWJlbCB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGN1ciA9IHRoaXMucGFyZW50T2YuZ2V0KGN1cik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIGxvb2t1cCBhcyBhIGJhcmUgZnVuY3Rpb24g4oCUIHBsdWcgaW50byBgY2F1c2FsQ2hhaW4oLi4uLCB7IGNvbnRyb2xEZXBzIH0pYC4gKi9cbiAgYXNMb29rdXAoKTogQ29udHJvbERlcExvb2t1cCB7XG4gICAgcmV0dXJuIChydW50aW1lU3RhZ2VJZCkgPT4gdGhpcy5sb29rdXAocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0LXN0b3AgZGVjaXNpb24gb2YgYSBzdGFnZSBleGVjdXRpb24gd2hvc2UgcmV0cnkgc2VyaWVzIHN0b3BwZWQsIGlmIGl0IGRpZC4gKi9cbiAgZ2V0QXR0ZW1wdFN0b3AocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IENvbnRyb2xEZWNpc2lvblJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5kZWNpc2lvbnMuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXR1cm4gcmVjb3JkPy5raW5kID09PSAnYXR0ZW1wdC1zdG9wJyA/IHJlY29yZCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBbGwgZGVjaXNpb25zIHJlY29yZGVkIGZvciB0aGUgY3VycmVudCBydW4sIGluIGV2ZW50IG9yZGVyIOKAlCBkZWNpZGVycywgc2VsZWN0b3JzIGFuZCBhdHRlbXB0IHN0b3BzLiAqL1xuICBnZXREZWNpc2lvbnMoKTogQ29udHJvbERlY2lzaW9uUmVjb3JkW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5kZWNpc2lvbnMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQtcnVuIGNvbnRyb2wgZXZpZGVuY2UgZm9yIHRoZSBuYXRpdmUgc25hcHNob3QuIFByb2plY3Qgb25seSB0aGVcbiAgICogc3RhZ2UgaWRlbnRpdGllcyBjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbDsgbmV2ZXIgd2FsayB0aGUgZXhlY3V0aW9uIHRyZWUuXG4gICAqIFBhcmVudGxlc3Mgcm9vdHMgY2Fubm90IGhhdmUgYSBnb3Zlcm5pbmcgY29udHJvbCBlZGdlLlxuICAgKi9cbiAgdG9TbmFwc2hvdCgpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXM6IFtzdHJpbmcsIENvbnRyb2xEZXBlbmRlbmN5XVtdID0gW107XG4gICAgZm9yIChjb25zdCBydW50aW1lU3RhZ2VJZCBvZiB0aGlzLnBhcmVudE9mLmtleXMoKSkge1xuICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHRoaXMubG9va3VwKHJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIGlmIChkZXBlbmRlbmN5KSBkZXBlbmRlbmNpZXMucHVzaChbcnVudGltZVN0YWdlSWQsIGRlcGVuZGVuY3ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdjb250cm9sLWRlcGVuZGVuY2llcycsXG4gICAgICBkYXRhOiB7IGRlY2lzaW9uczogdGhpcy5nZXREZWNpc2lvbnMoKSwgY29udHJvbERlcHM6IE9iamVjdC5mcm9tRW50cmllcyhkZXBlbmRlbmNpZXMpIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBSZXNldCBhbGwgc3RhdGUgKGFsc28gaGFwcGVucyBhdXRvbWF0aWNhbGx5IG9uIHJ1bklkIGNoYW5nZSkuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50T2YuY2xlYXIoKTtcbiAgICB0aGlzLmRlY2lzaW9ucy5jbGVhcigpO1xuICAgIHRoaXMuYnJhbmNoRW50cnlUb0RlY2lzaW9uLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nID0gW107XG4gICAgdGhpcy5jb25zdW1lZFNsb3RzLmNsZWFyKCk7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDb252ZW50aW9uIDQ6IGEgbmV3IHJ1bklkIG1lYW5zIGEgbmV3IHJ1biDigJQgcmVzZXQgdHJhbnNpZW50IHN0YXRlLiAqL1xuICBwcml2YXRlIHJlc2V0SWZOZXdSdW4ocnVuSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChydW5JZCA9PT0gdGhpcy5sYXN0UnVuSWQpIHJldHVybjtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0UnVuSWQgPSBydW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBgcGFyZW50UnVudGltZVN0YWdlSWRgIGlzIGEgZGVjaWRlciB3aXRoIGFuIHVubWF0Y2hlZCBwZW5kaW5nIHNsb3QsXG4gICAqIGNvbnN1bWUgb25lLiBgcmVnaXN0ZXJgIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHN0YWdlIGlzIHJlY29yZGVkIGFzIGFcbiAgICogYnJhbmNoIGVudHJ5IChzdGFnZSBleGVjdXRlZC9lcnJvcmVkKSDigJQgYm90aCBwYXRocyBjb25zdW1lIHRoZSBzbG90IHNvXG4gICAqIGNvdW50cyBzdGF5IGV4YWN0IGV2ZW4gd2hlbiBhIHN0YWdlIHByb2R1Y2VzIGJvdGggZXZlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdW1lUGVuZGluZ1Nsb3QocnVudGltZVN0YWdlSWQ6IHN0cmluZywgcGFyZW50UnVudGltZVN0YWdlSWQ6IHN0cmluZywgcmVnaXN0ZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAocnVudGltZVN0YWdlSWQgPT09IHBhcmVudFJ1bnRpbWVTdGFnZUlkKSByZXR1cm47IC8vIHN5bnRoZXRpYyBzZWxmLWV2ZW50c1xuICAgIGlmICh0aGlzLmNvbnN1bWVkU2xvdHMuaGFzKHJ1bnRpbWVTdGFnZUlkKSkgcmV0dXJuO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBlbmRpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHAgPSB0aGlzLnBlbmRpbmdbaV07XG4gICAgICBpZiAocC5kZWNpZGVySWQgIT09IHBhcmVudFJ1bnRpbWVTdGFnZUlkKSBjb250aW51ZTtcblxuICAgICAgdGhpcy5jb25zdW1lZFNsb3RzLmFkZChydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAocmVnaXN0ZXIpIHRoaXMuYnJhbmNoRW50cnlUb0RlY2lzaW9uLnNldChydW50aW1lU3RhZ2VJZCwgcC5kZWNpZGVySWQpO1xuICAgICAgcC5yZW1haW5pbmctLTtcbiAgICAgIGlmIChwLnJlbWFpbmluZyA8PSAwKSB0aGlzLnBlbmRpbmcuc3BsaWNlKGksIDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWNpZGUoKSBydWxlIGxhYmVsIHRoYXQgcHJvZHVjZWQgdGhlIGRlY2lzaW9uOiB0aGUgbWF0Y2hlZCBydWxlXG4gKiBtYXBwaW5nIHRvIHRoZSBjaG9zZW4gYnJhbmNoIChmaXJzdCBtYXRjaGVkIHJ1bGUgYXMgZmFsbGJhY2spLlxuICovXG5mdW5jdGlvbiBtYXRjaGVkUnVsZUxhYmVsKGV2aWRlbmNlOiBEZWNpc2lvbkV2aWRlbmNlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFldmlkZW5jZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcnVsZSA9XG4gICAgZXZpZGVuY2UucnVsZXMuZmluZCgocikgPT4gci5tYXRjaGVkICYmIHIuYnJhbmNoID09PSBldmlkZW5jZS5jaG9zZW4pID8/IGV2aWRlbmNlLnJ1bGVzLmZpbmQoKHIpID0+IHIubWF0Y2hlZCk7XG4gIHJldHVybiBydWxlPy5sYWJlbDtcbn1cbiJdfQ==
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbERlcFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9Db250cm9sRGVwUmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUVHO0FBYUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBc0NyRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsVUFBcUMsRUFBRTtJQUN4RSxPQUFPLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3BCLEVBQUUsQ0FBUztJQUVwQiwwRUFBMEU7SUFDekQsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3RELDJEQUEyRDtJQUMxQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFDdEUsc0VBQXNFO0lBQ3JELHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ25FLGlFQUFpRTtJQUN6RCxPQUFPLEdBQXNCLEVBQUUsQ0FBQztJQUN4Qyx1RUFBdUU7SUFDdEQsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDbkQsZ0VBQWdFO0lBQ3hELFNBQVMsQ0FBVTtJQUNWLGVBQWUsQ0FBVTtJQUNsQyxZQUFZLENBQVU7SUFDdEIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUU5QixZQUFZLFVBQXFDLEVBQUU7UUFDakQsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQztRQUN4RCxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElB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QUUsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDO2dCQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoRCxPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsUUFBc0M7SUFDOUQsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FDUixRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pILE9BQU8sSUFBSSxFQUFFLEtBQUssQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250cm9sRGVwUmVjb3JkZXIg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSB0cmFja2luZyBmcm9tIGZsb3cgZXZlbnRzIChSRkMtMDAzIEQ1KS5cbiAqXG4gKiBUaGUgZ2FwIHRoaXMgZmlsbHM6XG4gKiAgIFRoZSBiYWNrdHJhY2tlcidzIGBjb250cm9sRGVwc2Agb3B0aW9uIChEMykgbmVlZHMgYSBgQ29udHJvbERlcExvb2t1cGA6XG4gKiAgIFwid2hpY2ggZGVjaWRlciBleGVjdXRpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bj9cIiBUaGUgZW5naW5lIGtub3dzXG4gKiAgIHRoaXMgZHVyaW5nIHRyYXZlcnNhbCBidXQgdGhlIGNvbW1pdCBsb2cgZG9lc24ndCByZWNvcmQgaXQg4oCUIGNvbnRyb2xcbiAqICAgZmxvdyBpcyBhIEZsb3dSZWNvcmRlciBjb25jZXJuLiBUaGlzIHJlY29yZGVyIGlzIHRoZSBzdGFuZGFyZCBwcm9kdWNlcjpcbiAqICAgb25lIHN1YnNjcmlwdGlvbiwgb25lIGxvb2t1cCwgcGx1ZyBpdCBzdHJhaWdodCBpbnRvIGBjYXVzYWxDaGFpbmAuXG4gKlxuICogSG93IGl0IHdvcmtzIOKAlCB0d28gY29ycmVsYXRpb24gc3RydWN0dXJlcyBidWlsdCBkdXJpbmcgdHJhdmVyc2FsOlxuICpcbiAqICAgMS4gYHBhcmVudE9mYCDigJQgdGhlIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4sIGZyb20gZXZlcnkgc3RhZ2UgZXZlbnQnc1xuICogICAgICBgdHJhdmVyc2FsQ29udGV4dC5wYXJlbnRSdW50aW1lU3RhZ2VJZGAgKFJGQy0wMDMgRDEpLiBDcm9zc2VzXG4gKiAgICAgIHN1YmZsb3cgYm91bmRhcmllczsgbG9vcCByZS1lbnRyaWVzIHN0YXkgdW5hbWJpZ3VvdXMgYmVjYXVzZVxuICogICAgICBydW50aW1lIGlkcyBkaWZmZXIgcGVyIGl0ZXJhdGlvbi5cbiAqXG4gKiAgIDIuIGBicmFuY2hFbnRyeVRvRGVjaXNpb25gIOKAlCBvbiBgb25EZWNpc2lvbmAvYG9uU2VsZWN0ZWRgIHRoZSBkZWNpc2lvblxuICogICAgICBpcyByZWNvcmRlZCBhcyBQRU5ESU5HOyB0aGUgbmV4dCBzdGFnZShzKSBleGVjdXRlZCB3aG9zZVxuICogICAgICBgcGFyZW50UnVudGltZVN0YWdlSWRgIElTIHRoZSBkZWNpZGVyJ3MgcnVudGltZVN0YWdlSWQgYXJlIGl0c1xuICogICAgICBicmFuY2ggZW50cmllcyAoMSBmb3IgYSBkZWNpZGVyLCBOID0gc2VsZWN0ZWQubGVuZ3RoIGZvciBhXG4gKiAgICAgIHNlbGVjdG9yKS4gQ29ycmVsYXRpb24gaXMgYnkgcGFyZW50LWlkICsgY291bnQsIE5PVCBieSBzdGFnZSBuYW1lIOKAlFxuICogICAgICBzdWJmbG93LW1vdW50IGV2ZW50cyBjYXJyeSBwYXRoLXByZWZpeGVkIGlubmVyLXJvb3QgbmFtZXMgdGhhdFxuICogICAgICBkb24ndCBtYXRjaCBgRmxvd0RlY2lzaW9uRXZlbnQuY2hvc2VuYCwgYW5kIHNlbGVjdG9ycyBlbWl0IGFcbiAqICAgICAgc3ludGhldGljIGZvcmsgZXZlbnQgc2hhcmluZyB0aGUgc2VsZWN0b3IncyBvd24gcnVudGltZVN0YWdlSWRcbiAqICAgICAgKGV4Y2x1ZGVkIHZpYSB0aGUgc2VsZi1pZCBndWFyZCkuIEEgYnJhbmNoIHRoYXQgVEhST1dTIGJlZm9yZVxuICogICAgICBjb21wbGV0aW5nIGNvbnN1bWVzIGl0cyBzbG90IHZpYSBgb25FcnJvcmAsIHNvIHRoZSBwb3N0LWZhbi1vdXRcbiAqICAgICAgY29udmVyZ2VuY2Ugc3RhZ2UgaXMgbmV2ZXIgbWlzYXR0cmlidXRlZCBhcyBhIGJyYW5jaCBlbnRyeS5cbiAqXG4gKiAgIDMuIGF0dGVtcHQgc3RvcHMgKDEwLjEpIOKAlCBgb25BdHRlbXB0YDogYSBzdGFnZSB3aG9zZSByZXRyeSBzZXJpZXMgU1RPUFBFRFxuICogICAgICAoaXQgZ2F2ZSB1cCwgb3IgYSBsYXRlciBhdHRlbXB0IHBhdXNlZCBvciB3YXMgYWJvcnRlZDsgdGhlIHNoYXJlZFxuICogICAgICBwcmVkaWNhdGUgYHJlY29yZGVyL2F0dGVtcHRTZXJpZXMudHMgwrcgaXNSZXRyeUV2aWRlbmNlYCkgbWFkZSBhIGRlY2lzaW9uIG9mIGl0c1xuICogICAgICBvd24g4oCUIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uLCBpbiB0aGUgc2hhcGUgYGRlY2lkZSgpYCBwcm9kdWNlcy4gSXRcbiAqICAgICAgaXMgcmVjb3JkZWQgYmVzaWRlIHRoZSBkZWNpZGVycyBhcyBga2luZDogJ2F0dGVtcHQtc3RvcCdgXG4gKiAgICAgIChgZ2V0RGVjaXNpb25zKClgLCBgZ2V0QXR0ZW1wdFN0b3AoaWQpYCksIGBjaG9zZW46ICdzdG9wJ2AsIHRoZSBzdG9wXG4gKiAgICAgIHJlYXNvbiBhcyBpdHMgYHJ1bGVMYWJlbGAuIEl0IGlzIE5PVCBhIGJyYW5jaCBlbnRyeTogYSBjb250cm9sIGVkZ2UgaW5cbiAqICAgICAgYGNhdXNhbENoYWluYCBsaW5rcyBhIHN0YWdlIHRvIEFOT1RIRVIgZXhlY3V0aW9uIHRoYXQgZ292ZXJuZWQgaXQsIGFuZFxuICogICAgICB0aGUgc3RvcCBnb3Zlcm5zIHRoZSBzdGFnZSBpdHNlbGYg4oCUIHNvIGBsb29rdXBgIGlzIHVuY2hhbmdlZCwgYW5kIGFcbiAqICAgICAgcmVhZGVyIHdhbGtpbmcgYSBmYWlsZWQgc3RhZ2UgcmVhZHMgdGhlIHN0b3Agb2ZmIGl0cyBkZWNpc2lvbiByZWNvcmQuXG4gKlxuICogICBgbG9va3VwKHJ1bnRpbWVTdGFnZUlkKWAgdGhlbiB3YWxrcyB0aGUgYW5jZXN0b3IgY2hhaW4gZnJvbSB0aGUgc3RhZ2VcbiAqICAgdXB3YXJkOyB0aGUgZmlyc3QgYW5jZXN0b3IgKG9yIHRoZSBzdGFnZSBpdHNlbGYpIHJlZ2lzdGVyZWQgYXMgYVxuICogICBicmFuY2ggZW50cnkgeWllbGRzIGl0cyBnb3Zlcm5pbmcgZGVjaWRlciDigJQgdGhlIE5FQVJFU1QgZGVjaXNpb24uXG4gKiAgIE5lc3RlZCBkZWNpc2lvbnMgY29tcG9zZSBuYXR1cmFsbHk6IHRoZSBiYWNrdHJhY2tlciBleHBhbmRzIHRoZVxuICogICBkZWNpZGVyIG5vZGUgYW5kIGFza3MgYWdhaW4uXG4gKlxuICogQ29udmVudGlvbiA0OiBzdGF0ZSByZXNldHMgd2hlbiBgdHJhdmVyc2FsQ29udGV4dC5ydW5JZGAgY2hhbmdlcyDigJQgZWFjaFxuICogcnVuIChhbmQgZWFjaCByZXN1bWUsIHdoaWNoIG1pbnRzIGEgZnJlc2ggcnVuSWQpIHN0YXJ0cyBjbGVhbi4gQ29udHJvbFxuICogY2hhaW5zIHRoZXJlZm9yZSBkbyBOT1Qgc3Vydml2ZSBhIHBhdXNlL3Jlc3VtZSBib3VuZGFyeTogcG9zdC1yZXN1bWVcbiAqIHN0YWdlcyBjYW5ub3QgcmVzb2x2ZSBwcmUtcGF1c2UgZGVjaXNpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjb250cm9sRGVwUmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG5pbXBvcnQgeyBjYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG4gKlxuICogY29uc3QgY3RybCA9IGNvbnRyb2xEZXBSZWNvcmRlcigpO1xuICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihjdHJsKTsgLy8gYXV0by1yb3V0ZXMgdG8gRmxvd1JlY29yZGVyIGNoYW5uZWxcbiAqXG4gKiBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAqXG4gKiBjb25zdCBkYWcgPSBjYXVzYWxDaGFpbihjb21taXRMb2csICdhcHByb3ZlIzInLCBrZXlzUmVhZCwge1xuICogICBjb250cm9sRGVwczogY3RybC5hc0xvb2t1cCgpLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbnRyb2xEZXBlbmRlbmN5LCBDb250cm9sRGVwTG9va3VwIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBEZWNpc2lvbkV2aWRlbmNlLCBTZWxlY3Rpb25FdmlkZW5jZSB9IGZyb20gJy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG59IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeUV2aWRlbmNlIH0gZnJvbSAnLi9hdHRlbXB0U2VyaWVzLmpzJztcblxuLyoqIE9uZSByZWNvcmRlZCBkZWNpc2lvbi9zZWxlY3Rpb24gZXZlbnQgKFJGQy0wMDMgRDUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVjaXNpb25SZWNvcmQge1xuICAvKipcbiAgICogYCdhdHRlbXB0LXN0b3AnYCBmb3IgYSBzdGFnZSdzIG93biByZXRyeS1vci1zdG9wIGRlY2lzaW9uIHRoYXQgU1RPUFBFRCBpdHMgc2VyaWVzICgxMC4xKSDigJQgdGhlblxuICAgKiBgZGVjaWRlclJ1bnRpbWVTdGFnZUlkYCBpcyB0aGUgc3RhZ2UncyBleGVjdXRpb24sIGBjaG9zZW5gIGlzIGAnc3RvcCdgLCBgZXZpZGVuY2VgIHRoZSBhdHRlbXB0J3MgZGVjaXNpb24gYW5kXG4gICAqIGBydWxlTGFiZWxgIHRoZSBzdG9wIHJlYXNvbi4gQWJzZW50IGZvciBhIGRlY2lkZXIgLyBzZWxlY3Rvci5cbiAgICovXG4gIGtpbmQ/OiAnYXR0ZW1wdC1zdG9wJztcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBzdGVwLiAqL1xuICBkZWNpZGVyUnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIENob3NlbiBicmFuY2ggZGlzcGxheSBuYW1lIChkZWNpZGVyKSBvciBzZWxlY3RlZCBuYW1lcyAoc2VsZWN0b3IpLiAqL1xuICBjaG9zZW46IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU3RydWN0dXJlZCBldmlkZW5jZSBmcm9tIGRlY2lkZSgpL3NlbGVjdCgpLCB3aGVuIHRoZSBzdGFnZSB1c2VkIHRoZW0uICovXG4gIGV2aWRlbmNlPzogRGVjaXNpb25FdmlkZW5jZSB8IFNlbGVjdGlvbkV2aWRlbmNlO1xuICAvKipcbiAgICogVGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgdGhhdCBwcm9kdWNlZCB0aGUgZGVjaXNpb24gKGUuZy4gJ0dvb2QgY3JlZGl0JykuXG4gICAqIERlY2lkZXJzIG9ubHkg4oCUIGEgc2VsZWN0b3IgcGlja3MgTiBicmFuY2hlcyBhbmQgbm8gc2luZ2xlIGxhYmVsXG4gICAqIGF0dHJpYnV0ZXMgdG8gYWxsIG9mIHRoZW0gKGluc3BlY3QgYGV2aWRlbmNlYCBpbnN0ZWFkKS5cbiAgICovXG4gIHJ1bGVMYWJlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIE9wdCBpbiB0byBhIHNhbWUtcnVuIGNvbGxlY3Rpb24gYWNrbm93bGVkZ2VtZW50IGluIHRoZSBzbmFwc2hvdCBidW5kbGUuICovXG4gIGNhcHR1cmVDb3ZlcmFnZT86IGJvb2xlYW47XG4gIC8qKiBSZWNvcmRlciBpZC4gRGVmYXVsdHMgdG8gYGNvbnRyb2wtZGVwcy1OYCAoYXV0by1pbmNyZW1lbnRlZCkuICovXG4gIGlkPzogc3RyaW5nO1xufVxuXG4vKiogQSBkZWNpc2lvbiBhd2FpdGluZyBicmFuY2gtZW50cnkgY29ycmVsYXRpb24uICovXG5pbnRlcmZhY2UgUGVuZGluZ0RlY2lzaW9uIHtcbiAgZGVjaWRlcklkOiBzdHJpbmc7XG4gIC8qKiBIb3cgbWFueSBicmFuY2ggZW50cmllcyBhcmUgc3RpbGwgZXhwZWN0ZWQgKGRlY2lkZXI6IDEsIHNlbGVjdG9yOiBOKS4gKi9cbiAgcmVtYWluaW5nOiBudW1iZXI7XG59XG5cbmxldCBfY291bnRlciA9IDA7XG5cbi8qKlxuICogRmFjdG9yeSDigJQgbWF0Y2hlcyB0aGUgYHRvcG9sb2d5UmVjb3JkZXIoKWAgLyBgaW5PdXRSZWNvcmRlcigpYCBzdHlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xEZXBSZWNvcmRlcihvcHRpb25zOiBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zID0ge30pOiBDb250cm9sRGVwUmVjb3JkZXIge1xuICByZXR1cm4gbmV3IENvbnRyb2xEZXBSZWNvcmRlcihvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTdGF0ZWZ1bCBhY2N1bXVsYXRvciB0aGF0IHdhdGNoZXMgRmxvd1JlY29yZGVyIGV2ZW50cyBhbmQgYW5zd2Vyc1xuICogXCJ3aGljaCBkZWNpc2lvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuP1wiIEF0dGFjaCB2aWFcbiAqIGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHJlY29yZGVyKWAgKG9yIGBhdHRhY2hGbG93UmVjb3JkZXJgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyb2xEZXBSZWNvcmRlciBpbXBsZW1lbnRzIEZsb3dSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqIFJ1bnRpbWUgYW5jZXN0b3IgY2hhaW46IHJ1bnRpbWVTdGFnZUlkIOKGkiBwYXJlbnRSdW50aW1lU3RhZ2VJZCAoRDEpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudE9mID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgLyoqIFJlY29yZGVkIGRlY2lzaW9ucywga2V5ZWQgYnkgZGVjaWRlciBydW50aW1lU3RhZ2VJZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkZWNpc2lvbnMgPSBuZXcgTWFwPHN0cmluZywgQ29udHJvbERlY2lzaW9uUmVjb3JkPigpO1xuICAvKiogQnJhbmNoLWVudHJ5IHJ1bnRpbWVTdGFnZUlkIOKGkiBnb3Zlcm5pbmcgZGVjaWRlciBydW50aW1lU3RhZ2VJZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBicmFuY2hFbnRyeVRvRGVjaXNpb24gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogRGVjaXNpb25zIHdob3NlIGJyYW5jaCBlbnRyaWVzIGhhdmUgbm90IGFsbCBiZWVuIHNlZW4geWV0LiAqL1xuICBwcml2YXRlIHBlbmRpbmc6IFBlbmRpbmdEZWNpc2lvbltdID0gW107XG4gIC8qKiBTdGFnZSBpZHMgdGhhdCBhbHJlYWR5IGNvbnN1bWVkIGEgcGVuZGluZyBzbG90IChlbnRyeSBPUiBlcnJvcikuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uc3VtZWRTbG90cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKiogQ29udmVudGlvbiA0IOKAlCBydW5JZCBvZiB0aGUgcnVuIGN1cnJlbnRseSBiZWluZyByZWNvcmRlZC4gKi9cbiAgcHJpdmF0ZSBsYXN0UnVuSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FwdHVyZUNvdmVyYWdlOiBib29sZWFuO1xuICBwcml2YXRlIGNhcHR1cmVSdW5JZD86IHN0cmluZztcbiAgcHJpdmF0ZSBjYXB0dXJlSW50YWN0ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogQ29udHJvbERlcFJlY29yZGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5jYXB0dXJlQ292ZXJhZ2UgPSBvcHRpb25zLmNhcHR1cmVDb3ZlcmFnZSA9PT0gdHJ1ZTtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZCA/PyBgY29udHJvbC1kZXBzLSR7KytfY291bnRlcn1gO1xuICB9XG5cbiAgb25SdW5TdGFydChldmVudDogaW1wb3J0KCcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJykuRmxvd1J1bkV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FwdHVyZUNvdmVyYWdlKSB7XG4gICAgICBjb25zdCBydW5JZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bklkO1xuICAgICAgaWYgKHJ1bklkKSB0aGlzLnJlc2V0SWZOZXdSdW4ocnVuSWQpO1xuICAgICAgdGhpcy5jYXB0dXJlUnVuSWQgPSBydW5JZDtcbiAgICAgIHRoaXMuY2FwdHVyZUludGFjdCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3dSZWNvcmRlciBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvbkRlY2lzaW9uKGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcblxuICAgIGNvbnN0IGRlY2lkZXJJZCA9IGN0eC5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBydWxlTGFiZWwgPSBtYXRjaGVkUnVsZUxhYmVsKGV2ZW50LmV2aWRlbmNlKTtcbiAgICB0aGlzLmRlY2lzaW9ucy5zZXQoZGVjaWRlcklkLCB7XG4gICAgICBkZWNpZGVyUnVudGltZVN0YWdlSWQ6IGRlY2lkZXJJZCxcbiAgICAgIGNob3NlbjogZXZlbnQuY2hvc2VuLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgICAgLi4uKHJ1bGVMYWJlbCAhPT0gdW5kZWZpbmVkICYmIHsgcnVsZUxhYmVsIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IDEgfSk7XG4gIH1cblxuICBvbkF0dGVtcHQoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGNvbnN0IHsgcmVjb3JkIH0gPSBldmVudDtcbiAgICBpZiAoIWN0eCB8fCByZWNvcmQubmV4dCAhPT0gJ3N0b3AnIHx8ICFpc1JldHJ5RXZpZGVuY2UocmVjb3JkKSkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChyZWNvcmQuc2VyaWVzLCB7XG4gICAgICBraW5kOiAnYXR0ZW1wdC1zdG9wJyxcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogcmVjb3JkLnNlcmllcyxcbiAgICAgIGNob3NlbjogJ3N0b3AnLFxuICAgICAgZXZpZGVuY2U6IHJlY29yZC5kZWNpc2lvbixcbiAgICAgIHJ1bGVMYWJlbDogcmVjb3JkLnJlYXNvbixcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWQoZXZlbnQ6IEZsb3dTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIGlmIChldmVudC5zZWxlY3RlZC5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm90aGluZyBzZWxlY3RlZCDihpIgbm90aGluZyBnb3Zlcm5lZFxuXG4gICAgY29uc3QgZGVjaWRlcklkID0gY3R4LnJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChkZWNpZGVySWQsIHtcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogZGVjaWRlcklkLFxuICAgICAgY2hvc2VuOiBbLi4uZXZlbnQuc2VsZWN0ZWRdLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IGV2ZW50LnNlbGVjdGVkLmxlbmd0aCB9KTtcbiAgfVxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgdGhpcy5yZXNldElmTmV3UnVuKGN0eC5ydW5JZCk7XG5cbiAgICBjb25zdCB7IHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCB9ID0gY3R4O1xuICAgIGlmIChwYXJlbnRSdW50aW1lU3RhZ2VJZCkge1xuICAgICAgdGhpcy5wYXJlbnRPZi5zZXQocnVudGltZVN0YWdlSWQsIHBhcmVudFJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIHRoaXMuY29uc3VtZVBlbmRpbmdTbG90KHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgYnJhbmNoIHRoYXQgdGhyb3dzIG5ldmVyIGZpcmVzIGBvblN0YWdlRXhlY3V0ZWRgIOKAlCB3aXRob3V0IHRoaXMgaG9va1xuICAgKiBpdHMgcGVuZGluZyBzbG90IHdvdWxkIGxlYWsgYW5kIHRoZSBwb3N0LWZhbi1vdXQgY29udmVyZ2VuY2Ugc3RhZ2VcbiAgICogKHdob3NlIGNvbnRleHQgYWxzbyBjaGFpbnMgdG8gdGhlIHNlbGVjdG9yKSB3b3VsZCBiZSBtaXNhdHRyaWJ1dGVkIGFzXG4gICAqIGEgYnJhbmNoIGVudHJ5IHVuZGVyIGJlc3QtZWZmb3J0IChgZmFpbEZhc3Q6IGZhbHNlYCkgZmFuLW91dHMuXG4gICAqL1xuICBvbkVycm9yKGV2ZW50OiBGbG93RXJyb3JFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcbiAgICBpZiAoY3R4LnBhcmVudFJ1bnRpbWVTdGFnZUlkKSB7XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYWluIEFORCBhdHRyaWJ1dGUgdGhlIGZhaWxlZCBzdGFnZSB0byBpdHMgZGVjaXNpb24g4oCUXG4gICAgICAvLyB0aGUgc3RhZ2UgUkFOIChhbmQgbWF5IGhhdmUgY29tbWl0dGVkIHBhcnRpYWwgd3JpdGVzKSBiZWNhdXNlIHRoZVxuICAgICAgLy8gZGVjaXNpb24gY2hvc2UgaXQ7IGZhaWxpbmcgYWZ0ZXJ3YXJkcyBkb2Vzbid0IHVuZG8gdGhlIGRlcGVuZGVuY3kuXG4gICAgICB0aGlzLnBhcmVudE9mLnNldChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCk7XG4gICAgICB0aGlzLmNvbnN1bWVQZW5kaW5nU2xvdChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXJpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIE5FQVJFU1QgZ292ZXJuaW5nIGRlY2lzaW9uIGZvciBhbiBleGVjdXRpb24gc3RlcDogd2Fsa3MgdGhlXG4gICAqIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4gKHRoZSBzdGVwIGl0c2VsZiBmaXJzdCkgdW50aWwgaXQgaGl0cyBhXG4gICAqIHJlZ2lzdGVyZWQgYnJhbmNoIGVudHJ5LiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzdGVwIGlzIG5vdCBkb3duc3RyZWFtIG9mXG4gICAqIGFueSByZWNvcmRlZCBkZWNpc2lvbi5cbiAgICovXG4gIGxvb2t1cChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgY3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBydW50aW1lU3RhZ2VJZDtcbiAgICB3aGlsZSAoY3VyICE9PSB1bmRlZmluZWQgJiYgIXNlZW4uaGFzKGN1cikpIHtcbiAgICAgIHNlZW4uYWRkKGN1cik7XG4gICAgICBjb25zdCBkZWNpZGVySWQgPSB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5nZXQoY3VyKTtcbiAgICAgIGlmIChkZWNpZGVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmRlY2lzaW9ucy5nZXQoZGVjaWRlcklkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZWNpZGVySWQsXG4gICAgICAgICAgLi4uKHJlY29yZD8ucnVsZUxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbDogcmVjb3JkLnJ1bGVMYWJlbCB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGN1ciA9IHRoaXMucGFyZW50T2YuZ2V0KGN1cik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIGxvb2t1cCBhcyBhIGJhcmUgZnVuY3Rpb24g4oCUIHBsdWcgaW50byBgY2F1c2FsQ2hhaW4oLi4uLCB7IGNvbnRyb2xEZXBzIH0pYC4gKi9cbiAgYXNMb29rdXAoKTogQ29udHJvbERlcExvb2t1cCB7XG4gICAgcmV0dXJuIChydW50aW1lU3RhZ2VJZCkgPT4gdGhpcy5sb29rdXAocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0LXN0b3AgZGVjaXNpb24gb2YgYSBzdGFnZSBleGVjdXRpb24gd2hvc2UgcmV0cnkgc2VyaWVzIHN0b3BwZWQsIGlmIGl0IGRpZC4gKi9cbiAgZ2V0QXR0ZW1wdFN0b3AocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IENvbnRyb2xEZWNpc2lvblJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5kZWNpc2lvbnMuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXR1cm4gcmVjb3JkPy5raW5kID09PSAnYXR0ZW1wdC1zdG9wJyA/IHJlY29yZCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBbGwgZGVjaXNpb25zIHJlY29yZGVkIGZvciB0aGUgY3VycmVudCBydW4sIGluIGV2ZW50IG9yZGVyIOKAlCBkZWNpZGVycywgc2VsZWN0b3JzIGFuZCBhdHRlbXB0IHN0b3BzLiAqL1xuICBnZXREZWNpc2lvbnMoKTogQ29udHJvbERlY2lzaW9uUmVjb3JkW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5kZWNpc2lvbnMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQtcnVuIGNvbnRyb2wgZXZpZGVuY2UgZm9yIHRoZSBuYXRpdmUgc25hcHNob3QuIFByb2plY3Qgb25seSB0aGVcbiAgICogc3RhZ2UgaWRlbnRpdGllcyBjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbDsgbmV2ZXIgd2FsayB0aGUgZXhlY3V0aW9uIHRyZWUuXG4gICAqIFBhcmVudGxlc3Mgcm9vdHMgY2Fubm90IGhhdmUgYSBnb3Zlcm5pbmcgY29udHJvbCBlZGdlLlxuICAgKi9cbiAgdG9TbmFwc2hvdCgpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXM6IFtzdHJpbmcsIENvbnRyb2xEZXBlbmRlbmN5XVtdID0gW107XG4gICAgZm9yIChjb25zdCBydW50aW1lU3RhZ2VJZCBvZiB0aGlzLnBhcmVudE9mLmtleXMoKSkge1xuICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHRoaXMubG9va3VwKHJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIGlmIChkZXBlbmRlbmN5KSBkZXBlbmRlbmNpZXMucHVzaChbcnVudGltZVN0YWdlSWQsIGRlcGVuZGVuY3ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdjb250cm9sLWRlcGVuZGVuY2llcycsXG4gICAgICAuLi4odGhpcy5jYXB0dXJlQ292ZXJhZ2UgJiZcbiAgICAgICAgdGhpcy5jYXB0dXJlUnVuSWQgJiYge1xuICAgICAgICAgIGNhcHR1cmU6IHtcbiAgICAgICAgICAgIHZlcnNpb246IDEgYXMgY29uc3QsXG4gICAgICAgICAgICBydW5JZDogdGhpcy5jYXB0dXJlUnVuSWQsXG4gICAgICAgICAgICBjb250cm9sOiB0aGlzLmNhcHR1cmVJbnRhY3QgPyAoJ2NhcHR1cmVkJyBhcyBjb25zdCkgOiAoJ3BhcnRpYWwnIGFzIGNvbnN0KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIGRhdGE6IHsgZGVjaXNpb25zOiB0aGlzLmdldERlY2lzaW9ucygpLCBjb250cm9sRGVwczogT2JqZWN0LmZyb21FbnRyaWVzKGRlcGVuZGVuY2llcykgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJlc2V0IGFsbCBzdGF0ZSAoYWxzbyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgb24gcnVuSWQgY2hhbmdlKS4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYXB0dXJlSW50YWN0ID0gZmFsc2U7XG4gICAgdGhpcy5wYXJlbnRPZi5jbGVhcigpO1xuICAgIHRoaXMuZGVjaXNpb25zLmNsZWFyKCk7XG4gICAgdGhpcy5icmFuY2hFbnRyeVRvRGVjaXNpb24uY2xlYXIoKTtcbiAgICB0aGlzLnBlbmRpbmcgPSBbXTtcbiAgICB0aGlzLmNvbnN1bWVkU2xvdHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIENvbnZlbnRpb24gNDogYSBuZXcgcnVuSWQgbWVhbnMgYSBuZXcgcnVuIOKAlCByZXNldCB0cmFuc2llbnQgc3RhdGUuICovXG4gIHByaXZhdGUgcmVzZXRJZk5ld1J1bihydW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHJ1bklkID09PSB0aGlzLmxhc3RSdW5JZCkgcmV0dXJuO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICB0aGlzLmxhc3RSdW5JZCA9IHJ1bklkO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgaXMgYSBkZWNpZGVyIHdpdGggYW4gdW5tYXRjaGVkIHBlbmRpbmcgc2xvdCxcbiAgICogY29uc3VtZSBvbmUuIGByZWdpc3RlcmAgY29udHJvbHMgd2hldGhlciB0aGUgc3RhZ2UgaXMgcmVjb3JkZWQgYXMgYVxuICAgKiBicmFuY2ggZW50cnkgKHN0YWdlIGV4ZWN1dGVkL2Vycm9yZWQpIOKAlCBib3RoIHBhdGhzIGNvbnN1bWUgdGhlIHNsb3Qgc29cbiAgICogY291bnRzIHN0YXkgZXhhY3QgZXZlbiB3aGVuIGEgc3RhZ2UgcHJvZHVjZXMgYm90aCBldmVudHMuXG4gICAqL1xuICBwcml2YXRlIGNvbnN1bWVQZW5kaW5nU2xvdChydW50aW1lU3RhZ2VJZDogc3RyaW5nLCBwYXJlbnRSdW50aW1lU3RhZ2VJZDogc3RyaW5nLCByZWdpc3RlcjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChydW50aW1lU3RhZ2VJZCA9PT0gcGFyZW50UnVudGltZVN0YWdlSWQpIHJldHVybjsgLy8gc3ludGhldGljIHNlbGYtZXZlbnRzXG4gICAgaWYgKHRoaXMuY29uc3VtZWRTbG90cy5oYXMocnVudGltZVN0YWdlSWQpKSByZXR1cm47XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGVuZGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcCA9IHRoaXMucGVuZGluZ1tpXTtcbiAgICAgIGlmIChwLmRlY2lkZXJJZCAhPT0gcGFyZW50UnVudGltZVN0YWdlSWQpIGNvbnRpbnVlO1xuXG4gICAgICB0aGlzLmNvbnN1bWVkU2xvdHMuYWRkKHJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIGlmIChyZWdpc3RlcikgdGhpcy5icmFuY2hFbnRyeVRvRGVjaXNpb24uc2V0KHJ1bnRpbWVTdGFnZUlkLCBwLmRlY2lkZXJJZCk7XG4gICAgICBwLnJlbWFpbmluZy0tO1xuICAgICAgaWYgKHAucmVtYWluaW5nIDw9IDApIHRoaXMucGVuZGluZy5zcGxpY2UoaSwgMSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgdGhhdCBwcm9kdWNlZCB0aGUgZGVjaXNpb246IHRoZSBtYXRjaGVkIHJ1bGVcbiAqIG1hcHBpbmcgdG8gdGhlIGNob3NlbiBicmFuY2ggKGZpcnN0IG1hdGNoZWQgcnVsZSBhcyBmYWxsYmFjaykuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZWRSdWxlTGFiZWwoZXZpZGVuY2U6IERlY2lzaW9uRXZpZGVuY2UgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWV2aWRlbmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBydWxlID1cbiAgICBldmlkZW5jZS5ydWxlcy5maW5kKChyKSA9PiByLm1hdGNoZWQgJiYgci5icmFuY2ggPT09IGV2aWRlbmNlLmNob3NlbikgPz8gZXZpZGVuY2UucnVsZXMuZmluZCgocikgPT4gci5tYXRjaGVkKTtcbiAgcmV0dXJuIHJ1bGU/LmxhYmVsO1xufVxuIl19
@@ -16,4 +16,4 @@ import type { RecorderSnapshot } from '../runner/ExecutionRuntime.js';
16
16
  /** What `toSnapshot()` returns: a snapshot row without the `id` the attach site owns. */
17
17
  export type RecorderBundle = Omit<RecorderSnapshot, 'id'>;
18
18
  /** Rebuild `bundle` as the snapshot row for the recorder attached under `id`. */
19
- export declare function copyBundle(id: string, bundle: RecorderBundle): RecorderSnapshot;
19
+ export declare function copyBundle(id: string, bundle: RecorderBundle, includeCapture?: boolean): RecorderSnapshot;
@@ -12,8 +12,12 @@
12
12
  * one line here. The three `toSnapshot?()` signatures (`ScopeRecorder`, `FlowRecorder`,
13
13
  * `CombinedRecorder`, and `EmitRecorder`) all name `RecorderBundle`, so they follow.
14
14
  */
15
+ import { copyCaptureAcknowledgement } from '../capture/nativeCoverage.js';
15
16
  /** Rebuild `bundle` as the snapshot row for the recorder attached under `id`. */
16
- export function copyBundle(id, bundle) {
17
+ export function copyBundle(id, bundle, includeCapture = false) {
18
+ const capture = includeCapture
19
+ ? copyCaptureAcknowledgement(Object.getOwnPropertyDescriptor(bundle, 'capture')?.value)
20
+ : undefined;
17
21
  return {
18
22
  id,
19
23
  name: bundle.name,
@@ -21,6 +25,7 @@ export function copyBundle(id, bundle) {
21
25
  preferredOperation: bundle.preferredOperation,
22
26
  data: bundle.data,
23
27
  meta: bundle.meta,
28
+ ...(capture && { capture }),
24
29
  };
25
30
  }
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL3NuYXBzaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFPSCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLFVBQVUsQ0FBQyxFQUFVLEVBQUUsTUFBc0I7SUFDM0QsT0FBTztRQUNMLEVBQUU7UUFDRixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxrQkFBa0I7UUFDN0MsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVjb3JkZXIvc25hcHNob3QudHMg4oCUIHRoZSBPTkUgY29waWVyIGZvciBhIHJlY29yZGVyJ3MgYHRvU25hcHNob3QoKWAgYnVuZGxlIChGNikuXG4gKlxuICogQSBidW5kbGUgaXMgbmV2ZXIgcGFzc2VkIHRocm91Z2ggYXMgcmV0dXJuZWQ6IGl0IGlzIHJlYnVpbHQgZmllbGQgYnkgZmllbGQsIHNvIGEgcmVjb3JkZXJcbiAqIGNhbm5vdCBzcG9vZiBpdHMgb3duIGBpZGAgKHRoZSBleGVjdXRvcidzLCBhbmQgY29uc3VtZXJzIGluZGV4IGJ5IGl0KSBhbmQgbm90aGluZyBpdCBhZGRzXG4gKiBiZXlvbmQgdGhlIGNvbnRyYWN0IGxlYWtzIGludG8gdGhlIHNuYXBzaG90LiBUaGUgY29zdCBpcyB0aGF0IGEgZmllbGQgdGhpcyBjb3BpZXIgZm9yZ2V0c1xuICogaXMgZHJvcHBlZCBpbiBzaWxlbmNlIOKAlCB3aGljaCBpcyB3aHkgdGhlcmUgaXMgZXhhY3RseSBvbmUgY29waWVyLCBhbmQgd2h5XG4gKiBgcnVubmVyL3NuYXBzaG90LnRzIMK3IGNvbGxlY3RSZWNvcmRlclNuYXBzaG90c2AgYW5kIGBDb21wb3NpdGVSZWNvcmRlciDCtyB0b1NuYXBzaG90YCBib3RoXG4gKiBjYWxsIGl0ICh0aGUgY29tcG9zaXRlIHVzZWQgdG8ga2VlcCBvbmx5IGBuYW1lYC9gZGF0YWAgYW5kIGxvc3QgYG1ldGFgL2BkZXNjcmlwdGlvbmApLlxuICpcbiAqIEEgbmV3IGJ1bmRsZSBmaWVsZCBpczogb25lIG1lbWJlciBvbiBgUmVjb3JkZXJTbmFwc2hvdGAgKHJ1bm5lci9FeGVjdXRpb25SdW50aW1lLnRzKSBhbmRcbiAqIG9uZSBsaW5lIGhlcmUuIFRoZSB0aHJlZSBgdG9TbmFwc2hvdD8oKWAgc2lnbmF0dXJlcyAoYFNjb3BlUmVjb3JkZXJgLCBgRmxvd1JlY29yZGVyYCxcbiAqIGBDb21iaW5lZFJlY29yZGVyYCwgYW5kIGBFbWl0UmVjb3JkZXJgKSBhbGwgbmFtZSBgUmVjb3JkZXJCdW5kbGVgLCBzbyB0aGV5IGZvbGxvdy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlY29yZGVyU25hcHNob3QgfSBmcm9tICcuLi9ydW5uZXIvRXhlY3V0aW9uUnVudGltZS5qcyc7XG5cbi8qKiBXaGF0IGB0b1NuYXBzaG90KClgIHJldHVybnM6IGEgc25hcHNob3Qgcm93IHdpdGhvdXQgdGhlIGBpZGAgdGhlIGF0dGFjaCBzaXRlIG93bnMuICovXG5leHBvcnQgdHlwZSBSZWNvcmRlckJ1bmRsZSA9IE9taXQ8UmVjb3JkZXJTbmFwc2hvdCwgJ2lkJz47XG5cbi8qKiBSZWJ1aWxkIGBidW5kbGVgIGFzIHRoZSBzbmFwc2hvdCByb3cgZm9yIHRoZSByZWNvcmRlciBhdHRhY2hlZCB1bmRlciBgaWRgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlCdW5kbGUoaWQ6IHN0cmluZywgYnVuZGxlOiBSZWNvcmRlckJ1bmRsZSk6IFJlY29yZGVyU25hcHNob3Qge1xuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIG5hbWU6IGJ1bmRsZS5uYW1lLFxuICAgIGRlc2NyaXB0aW9uOiBidW5kbGUuZGVzY3JpcHRpb24sXG4gICAgcHJlZmVycmVkT3BlcmF0aW9uOiBidW5kbGUucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgIGRhdGE6IGJ1bmRsZS5kYXRhLFxuICAgIG1ldGE6IGJ1bmRsZS5tZXRhLFxuICB9O1xufVxuIl19
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL3NuYXBzaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQU0xRSxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLFVBQVUsQ0FBQyxFQUFVLEVBQUUsTUFBc0IsRUFBRSxjQUFjLEdBQUcsS0FBSztJQUNuRixNQUFNLE9BQU8sR0FBRyxjQUFjO1FBQzVCLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUN2RixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2QsT0FBTztRQUNMLEVBQUU7UUFDRixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxrQkFBa0I7UUFDN0MsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7S0FDNUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlY29yZGVyL3NuYXBzaG90LnRzIOKAlCB0aGUgT05FIGNvcGllciBmb3IgYSByZWNvcmRlcidzIGB0b1NuYXBzaG90KClgIGJ1bmRsZSAoRjYpLlxuICpcbiAqIEEgYnVuZGxlIGlzIG5ldmVyIHBhc3NlZCB0aHJvdWdoIGFzIHJldHVybmVkOiBpdCBpcyByZWJ1aWx0IGZpZWxkIGJ5IGZpZWxkLCBzbyBhIHJlY29yZGVyXG4gKiBjYW5ub3Qgc3Bvb2YgaXRzIG93biBgaWRgICh0aGUgZXhlY3V0b3IncywgYW5kIGNvbnN1bWVycyBpbmRleCBieSBpdCkgYW5kIG5vdGhpbmcgaXQgYWRkc1xuICogYmV5b25kIHRoZSBjb250cmFjdCBsZWFrcyBpbnRvIHRoZSBzbmFwc2hvdC4gVGhlIGNvc3QgaXMgdGhhdCBhIGZpZWxkIHRoaXMgY29waWVyIGZvcmdldHNcbiAqIGlzIGRyb3BwZWQgaW4gc2lsZW5jZSDigJQgd2hpY2ggaXMgd2h5IHRoZXJlIGlzIGV4YWN0bHkgb25lIGNvcGllciwgYW5kIHdoeVxuICogYHJ1bm5lci9zbmFwc2hvdC50cyDCtyBjb2xsZWN0UmVjb3JkZXJTbmFwc2hvdHNgIGFuZCBgQ29tcG9zaXRlUmVjb3JkZXIgwrcgdG9TbmFwc2hvdGAgYm90aFxuICogY2FsbCBpdCAodGhlIGNvbXBvc2l0ZSB1c2VkIHRvIGtlZXAgb25seSBgbmFtZWAvYGRhdGFgIGFuZCBsb3N0IGBtZXRhYC9gZGVzY3JpcHRpb25gKS5cbiAqXG4gKiBBIG5ldyBidW5kbGUgZmllbGQgaXM6IG9uZSBtZW1iZXIgb24gYFJlY29yZGVyU25hcHNob3RgIChydW5uZXIvRXhlY3V0aW9uUnVudGltZS50cykgYW5kXG4gKiBvbmUgbGluZSBoZXJlLiBUaGUgdGhyZWUgYHRvU25hcHNob3Q/KClgIHNpZ25hdHVyZXMgKGBTY29wZVJlY29yZGVyYCwgYEZsb3dSZWNvcmRlcmAsXG4gKiBgQ29tYmluZWRSZWNvcmRlcmAsIGFuZCBgRW1pdFJlY29yZGVyYCkgYWxsIG5hbWUgYFJlY29yZGVyQnVuZGxlYCwgc28gdGhleSBmb2xsb3cuXG4gKi9cblxuaW1wb3J0IHsgY29weUNhcHR1cmVBY2tub3dsZWRnZW1lbnQgfSBmcm9tICcuLi9jYXB0dXJlL25hdGl2ZUNvdmVyYWdlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXJTbmFwc2hvdCB9IGZyb20gJy4uL3J1bm5lci9FeGVjdXRpb25SdW50aW1lLmpzJztcblxuLyoqIFdoYXQgYHRvU25hcHNob3QoKWAgcmV0dXJuczogYSBzbmFwc2hvdCByb3cgd2l0aG91dCB0aGUgYGlkYCB0aGUgYXR0YWNoIHNpdGUgb3ducy4gKi9cbmV4cG9ydCB0eXBlIFJlY29yZGVyQnVuZGxlID0gT21pdDxSZWNvcmRlclNuYXBzaG90LCAnaWQnPjtcblxuLyoqIFJlYnVpbGQgYGJ1bmRsZWAgYXMgdGhlIHNuYXBzaG90IHJvdyBmb3IgdGhlIHJlY29yZGVyIGF0dGFjaGVkIHVuZGVyIGBpZGAuICovXG5leHBvcnQgZnVuY3Rpb24gY29weUJ1bmRsZShpZDogc3RyaW5nLCBidW5kbGU6IFJlY29yZGVyQnVuZGxlLCBpbmNsdWRlQ2FwdHVyZSA9IGZhbHNlKTogUmVjb3JkZXJTbmFwc2hvdCB7XG4gIGNvbnN0IGNhcHR1cmUgPSBpbmNsdWRlQ2FwdHVyZVxuICAgID8gY29weUNhcHR1cmVBY2tub3dsZWRnZW1lbnQoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihidW5kbGUsICdjYXB0dXJlJyk/LnZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIG5hbWU6IGJ1bmRsZS5uYW1lLFxuICAgIGRlc2NyaXB0aW9uOiBidW5kbGUuZGVzY3JpcHRpb24sXG4gICAgcHJlZmVycmVkT3BlcmF0aW9uOiBidW5kbGUucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgIGRhdGE6IGJ1bmRsZS5kYXRhLFxuICAgIG1ldGE6IGJ1bmRsZS5tZXRhLFxuICAgIC4uLihjYXB0dXJlICYmIHsgY2FwdHVyZSB9KSxcbiAgfTtcbn1cbiJdfQ==
@@ -13,6 +13,11 @@ import type { CommitBundle, CommitValuesMode, LogAddress, LogOutcome, Meta } fro
13
13
  import type { RecordSink, WriteProvenanceMode } from 'foottrace/write';
14
14
  import { EventLog, SharedMemory } from 'foottrace/write';
15
15
  import type { RunCorrelation } from '../attempt/types.js';
16
+ import type { CaptureHistoryStatus } from '../capture/historyTypes.js';
17
+ import type { CaptureChannelStatus, RecorderCaptureAcknowledgement } from '../capture/nativeCoverage.js';
18
+ import { NativeCapture } from '../capture/nativeCoverage.js';
19
+ import type { EngineReadSources, NativeCaptureObservation, SourceLimitation } from '../capture/readSources.js';
20
+ import { EngineReadSourceCapture } from '../capture/readSources.js';
16
21
  import type { StageSnapshot } from '../memory/frameTypes.js';
17
22
  import type { RunPolicy } from '../memory/runPolicy.js';
18
23
  import { StageContext } from '../memory/StageContext.js';
@@ -43,6 +48,8 @@ export interface RecorderSnapshot {
43
48
  * keep the values JSON-safe, since this rides the snapshot out to disk.
44
49
  */
45
50
  meta?: Readonly<Record<string, unknown>>;
51
+ /** Optional current-run capture acknowledgement from the recorder contract. */
52
+ capture?: RecorderCaptureAcknowledgement;
46
53
  }
47
54
  export type RuntimeSnapshot = {
48
55
  /**
@@ -57,6 +64,10 @@ export type RuntimeSnapshot = {
57
64
  * snapshot carries a DIFFERENT runId than the paused run's snapshot.
58
65
  */
59
66
  readonly runId: string;
67
+ /** Opt-in native observation; root log and current leg only, never durable storage. */
68
+ readonly capture?: NativeCaptureObservation;
69
+ /** Opt-in ordered native occurrences. Unknown ownership has no record; never infer observed-empty. */
70
+ readonly readSources?: EngineReadSources;
60
71
  /**
61
72
  * The run's correlation (10.1) — `env.traceparent`, or `env.traceId` + `env.operationId`, resolved once per
62
73
  * leg; the same frozen object every event of the leg carries (`TraversalContext.correlation`, a scope event's
@@ -140,6 +151,8 @@ export type RuntimeSnapshot = {
140
151
  };
141
152
  /** `getSnapshot().sink` — what the run handed its sink, and what the sink did not take (10.1, P6). */
142
153
  export interface RecordSinkStats {
154
+ /** Present only when explicit capture persistence was requested. Never inferred from an ordinary flush. */
155
+ readonly capture?: CaptureHistoryStatus;
143
156
  /** Entries handed to the adapter (each `opened`, `commit`, `note`, `closed` call). */
144
157
  readonly entries: number;
145
158
  /**
@@ -161,6 +174,13 @@ export interface RuntimeRecord {
161
174
  readonly meta?: Meta;
162
175
  }
163
176
  export declare class ExecutionRuntime {
177
+ readSources?: EngineReadSourceCapture;
178
+ /** Present only for the current opted-in root leg. Never inherited by a subflow runtime. */
179
+ capture?: NativeCapture;
180
+ beginCapture(runId: string): NativeCapture;
181
+ /** A reused log cannot be retrofitted or relabelled as the new leg's base. */
182
+ resumeReadSources(runId: string): void;
183
+ captureSnapshot(to: number, control?: CaptureChannelStatus, redact?: boolean): NativeCaptureObservation | undefined;
164
184
  globalStore: SharedMemory;
165
185
  /**
166
186
  * Parallel redacted mirror of `globalStore`. Populated by every commit that
@@ -192,7 +212,10 @@ export declare class ExecutionRuntime {
192
212
  * every frame after inherits the same reference. Default: every dial at
193
213
  * its default, no rule, no mirror.
194
214
  */
195
- constructor(rootName: string, rootId: string, defaultValues?: unknown, initialState?: unknown, policy?: RunPolicy, record?: RuntimeRecord);
215
+ constructor(rootName: string, rootId: string, defaultValues?: unknown, initialState?: unknown, policy?: RunPolicy, record?: RuntimeRecord, source?: {
216
+ readonly runId: string;
217
+ readonly unavailable?: SourceLimitation;
218
+ });
196
219
  /**
197
220
  * A fresh root frame for this runtime — `globalStore`, `executionHistory`,
198
221
  * the run's policy and (when kept) the mirror. Also how `SubflowExecutor`
@@ -9,10 +9,36 @@
9
9
  * The engine (FlowchartTraverser) receives this as its runtime parameter.
10
10
  * After execution, consumers query it for the full execution state.
11
11
  */
12
- import { EventLog, freezeRecord, LOG_PLACEHOLDER, SharedMemory } from 'foottrace/write';
12
+ import { createReadSourceRecord, EventLog, freezeRecord, LOG_PLACEHOLDER, SharedMemory } from 'foottrace/write';
13
+ import { NativeCapture } from '../capture/nativeCoverage.js';
14
+ import { EngineReadSourceCapture, withReadSources } from '../capture/readSources.js';
13
15
  import { DEFAULT_RUN_POLICY } from '../memory/runPolicy.js';
14
16
  import { StageContext } from '../memory/StageContext.js';
15
17
  export class ExecutionRuntime {
18
+ readSources;
19
+ /** Present only for the current opted-in root leg. Never inherited by a subflow runtime. */
20
+ capture;
21
+ beginCapture(runId) {
22
+ const address = this.executionHistory.address ?? this.capture?.logAddress ?? { logRunId: runId, drillPath: [] };
23
+ const capture = new NativeCapture(runId, address, this.executionHistory.length, this.policy);
24
+ if (this.capture)
25
+ capture.limit('resumed-segment');
26
+ this.capture = capture;
27
+ this.rootStageContext.capture = capture;
28
+ return capture;
29
+ }
30
+ /** A reused log cannot be retrofitted or relabelled as the new leg's base. */
31
+ resumeReadSources(runId) {
32
+ this.readSources?.retire();
33
+ this.readSources = this.policy.readSources
34
+ ? new EngineReadSourceCapture(runId, undefined, 'resumed-source-ownership', this.executionHistory.length)
35
+ : undefined;
36
+ this.rootStageContext.readSources = this.readSources;
37
+ }
38
+ captureSnapshot(to, control = 'unknown', redact = false) {
39
+ const note = this.capture?.snapshot(to, control, redact);
40
+ return note && this.readSources ? withReadSources(note, this.readSources.snapshot(to, redact)) : note;
41
+ }
16
42
  globalStore;
17
43
  /**
18
44
  * Parallel redacted mirror of `globalStore`. Populated by every commit that
@@ -44,7 +70,7 @@ export class ExecutionRuntime {
44
70
  * every frame after inherits the same reference. Default: every dial at
45
71
  * its default, no rule, no mirror.
46
72
  */
47
- constructor(rootName, rootId, defaultValues, initialState, policy = DEFAULT_RUN_POLICY, record) {
73
+ constructor(rootName, rootId, defaultValues, initialState, policy = DEFAULT_RUN_POLICY, record, source) {
48
74
  this._initialState = initialState;
49
75
  this._defaultValues = defaultValues;
50
76
  this.globalStore = new SharedMemory(defaultValues, initialState);
@@ -54,7 +80,18 @@ export class ExecutionRuntime {
54
80
  // left `defaultValues` out of every replay, so a fold could not reproduce
55
81
  // the state a stage actually saw. `getState()` is the live context; the
56
82
  // EventLog constructor clones it, so the base stays detached.
57
- this.executionHistory = openLog(this.globalStore.getState(), record);
83
+ if (policy.readSources && source?.runId && !source.unavailable && !record) {
84
+ // The record owns origin selection, first-touch fallback, staging and commit admission.
85
+ // Open once, before any frame exists. Constructor/clone errors keep their original identity.
86
+ const book = createReadSourceRecord(this.globalStore, { logRunId: source.runId, drillPath: [] }, typeof policy.readSources === 'object' ? policy.readSources : undefined);
87
+ this.executionHistory = book.log;
88
+ this.readSources = new EngineReadSourceCapture(source.runId, book);
89
+ }
90
+ else {
91
+ this.executionHistory = openLog(this.globalStore.getState(), record);
92
+ if (policy.readSources && source?.runId)
93
+ this.readSources = new EngineReadSourceCapture(source.runId, undefined, source.unavailable ?? 'sink-source-unsupported');
94
+ }
58
95
  if (record && this.executionHistory.address !== undefined)
59
96
  this.recordSink = record.sink;
60
97
  this.policy = policy;
@@ -93,6 +130,7 @@ export class ExecutionRuntime {
93
130
  */
94
131
  installPolicy(root) {
95
132
  root.usePolicy(this.policy);
133
+ root.readSources = this.readSources;
96
134
  if (!this.policy.mirror)
97
135
  return;
98
136
  if (!this.redactedStore) {
@@ -210,6 +248,9 @@ export class ExecutionRuntime {
210
248
  ...(this.executionHistory.address === undefined ? {} : { logAddress: this.executionHistory.address }),
211
249
  commitValues: this.policy.commitValues,
212
250
  writeProvenance: this.policy.writeProvenance,
251
+ ...(this.readSources && {
252
+ readSources: this.readSources.snapshot(this.executionHistory.length, options?.redact === true),
253
+ }),
213
254
  };
214
255
  }
215
256
  }
@@ -237,4 +278,4 @@ function openLog(base, record) {
237
278
  return new EventLog(base);
238
279
  }
239
280
  }
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUlILE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUt4RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFzSnpELE1BQU0sT0FBTyxnQkFBZ0I7SUFDcEIsV0FBVyxDQUFlO0lBQ2pDOzs7Ozs7OztPQVFHO0lBQ0ksYUFBYSxDQUFnQjtJQUM3QixnQkFBZ0IsQ0FBZTtJQUMvQixnQkFBZ0IsQ0FBVztJQUNsQyxzR0FBc0c7SUFDOUYsVUFBVSxDQUFjO0lBQ2hDLG9GQUFvRjtJQUM1RSxhQUFhLENBQWdCO0lBQzdCLGFBQWEsQ0FBVTtJQUN2QixjQUFjLENBQVU7SUFDaEM7bUZBQytFO0lBQ3ZFLE1BQU0sQ0FBWTtJQUUxQiw0RUFBNEU7SUFDcEUsU0FBUyxDQUEyQjtJQUU1Qzs7Ozs7O09BTUc7SUFDSCxZQUNFLFFBQWdCLEVBQ2hCLE1BQWMsRUFDZCxhQUF1QixFQUN2QixZQUFzQixFQUN0QixTQUFvQixrQkFBa0IsRUFDdEMsTUFBc0I7UUFFdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDakUseUVBQXlFO1FBQ3pFLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSw4REFBOEQ7UUFDOUQs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LE9BQU8sQ0FBQyxJQUE2QixFQUFFLE1BQWlDO0lBQy9FLElBQUksTUFBTSxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7Z0JBQ3BGLEtBQUs7YUFDTixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsaUdBQWlHO1FBQ25HLENBQUM7UUFDRCxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeGVjdXRpb25SdW50aW1lIOKAlCBUaGUgcnVudGltZSBlbnZpcm9ubWVudCBmb3Igb25lIGZsb3djaGFydCBleGVjdXRpb24uXG4gKlxuICogV2lyZXMgdXAgdGhlIHRocmVlIG1lbW9yeSBwcmltaXRpdmVzIGludG8gYSBzaW5nbGUgY29udGFpbmVyOlxuICogICAtIFNoYXJlZE1lbW9yeSAodGhlIGhlYXAg4oCUIHNoYXJlZCBzdGF0ZSBhY3Jvc3MgYWxsIHN0YWdlcylcbiAqICAgLSBTdGFnZUNvbnRleHQgICh0aGUgY2FsbCBzdGFjayDigJQgcGVyLXN0YWdlIGV4ZWN1dGlvbiB0cmVlKVxuICogICAtIEV2ZW50TG9nICAgICAgKHRoZSB0cmFuc2FjdGlvbiBsb2cg4oCUIGNvbW1pdCBoaXN0b3J5IGZvciByZXBsYXkpXG4gKlxuICogVGhlIGVuZ2luZSAoRmxvd2NoYXJ0VHJhdmVyc2VyKSByZWNlaXZlcyB0aGlzIGFzIGl0cyBydW50aW1lIHBhcmFtZXRlci5cbiAqIEFmdGVyIGV4ZWN1dGlvbiwgY29uc3VtZXJzIHF1ZXJ5IGl0IGZvciB0aGUgZnVsbCBleGVjdXRpb24gc3RhdGUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIENvbW1pdFZhbHVlc01vZGUsIExvZ0FkZHJlc3MsIExvZ091dGNvbWUsIE1ldGEgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRTaW5rLCBXcml0ZVByb3ZlbmFuY2VNb2RlIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcbmltcG9ydCB7IEV2ZW50TG9nLCBmcmVlemVSZWNvcmQsIExPR19QTEFDRUhPTERFUiwgU2hhcmVkTWVtb3J5IH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHR5cGUgeyBSdW5Db3JyZWxhdGlvbiB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZVNuYXBzaG90IH0gZnJvbSAnLi4vbWVtb3J5L2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IERFRkFVTFRfUlVOX1BPTElDWSB9IGZyb20gJy4uL21lbW9yeS9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmVyU3RhdHMgfSBmcm9tICcuL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLmpzJztcblxuLyoqIFNuYXBzaG90IG9mIGEgc2luZ2xlIHJlY29yZGVyJ3MgY29sbGVjdGVkIGRhdGEuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVyU25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTY29wZVJlY29yZGVyIHR5cGUgYW5kIHBhdHRlcm4gZGVzY3JpcHRpb24gKGUuZy4sIFwiVHJhbnNsYXRvciAoS2V5ZWRTdG9yZSkg4oCUIHBlci1zdGVwIHRva2VuIHVzYWdlXCIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFByZWZlcnJlZCByZWFkLXRpbWUgb3BlcmF0aW9uIOKAlCBoaW50cyB0aGUgVUkgYWJvdXQgd2hpY2ggdmlldyB0byBzaG93IHByb21pbmVudGx5LiAqL1xuICBwcmVmZXJyZWRPcGVyYXRpb24/OiAndHJhbnNsYXRlJyB8ICdhY2N1bXVsYXRlJyB8ICdhZ2dyZWdhdGUnO1xuICBkYXRhOiB1bmtub3duO1xuICAvKipcbiAgICogU21hbGwgbWFjaGluZS1yZWFkYWJsZSBmYWN0cyBhYm91dCB0aGUgQlVORExFIOKAlCBob3cgaXQgd2FzIHByb2R1Y2VkLFxuICAgKiB3aGljaCBwcm9qZWN0aW9uIG9mIHRoZSByZWNvcmRlcidzIGRhdGEgaXQgaXMsIHdoYXQgaXQgZGVsaWJlcmF0ZWx5XG4gICAqIGxlZnQgb3V0LiBXaGF0ZXZlciB0aGUgcmVjb3JkZXIncyBgdG9TbmFwc2hvdCgpYCBwdXQgaGVyZSwgY29waWVkXG4gICAqIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUaGUgc3BsaXQgd2l0aCBgZGVzY3JpcHRpb25gOiBgZGVzY3JpcHRpb25gIGlzIHRoZSBzZW50ZW5jZSBhIGh1bWFuXG4gICAqIHJlYWRzOyBgbWV0YWAgaXMgd2hhdCBhbiBvZmZsaW5lIGNvbnN1bWVyIEJSQU5DSEVTIG9uLiBBIHJlY29yZGVyIHdpdGhcbiAgICogYSBcImZ1bGxcIiBhbmQgYSBcImxlYW5cIiBidW5kbGUgc2hhcGUgdGhhdCBzYXlzIHNvIG9ubHkgaW4gaXRzXG4gICAqIGRlc2NyaXB0aW9uIGZvcmNlcyBldmVyeSByZWFkZXIgdG8gc3RyaW5nLW1hdGNoIHByb3NlIOKAlCBhbmQgYSByZWFkZXJcbiAgICogdGhhdCBkb2Vzbid0IHJlbmRlcnMgYW4gZW1wdHkgcGFuZWwgaW5zdGVhZCBvZiBzYXlpbmcgXCJ0aGlzIHJlY29yZGluZ1xuICAgKiBjYXJyaWVzIHN0cnVjdHVyZSBvbmx5XCIuXG4gICAqXG4gICAqIE5vdCBpbnRlcnByZXRlZCBieSB0aGUgZW5naW5lLCBzbyBrZXlzIGFyZSB0aGUgcmVjb3JkZXIncyB0byBjaG9vc2U7XG4gICAqIGtlZXAgdGhlIHZhbHVlcyBKU09OLXNhZmUsIHNpbmNlIHRoaXMgcmlkZXMgdGhlIHNuYXBzaG90IG91dCB0byBkaXNrLlxuICAgKi9cbiAgbWV0YT86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuZXhwb3J0IHR5cGUgUnVudGltZVNuYXBzaG90ID0ge1xuICAvKipcbiAgICogVGhlIHJ1biB0aGlzIHNuYXBzaG90IGJlbG9uZ3MgdG8g4oCUIHRoZSBzYW1lIGBydW5JZGAgc3RhbXBlZCBvbiBldmVyeVxuICAgKiBgVHJhdmVyc2FsQ29udGV4dGAgKGFuZCB0aHVzIGV2ZXJ5IHJlY29yZGVyIGV2ZW50KSBvZiB0aGUgcnVuLCBzbyBhXG4gICAqIHNuYXBzaG90IGNhbiBiZSBqb2luZWQgYWdhaW5zdCBhbiBldmVudCBzdHJlYW0gb3IgYW4gZXh0ZXJuYWxcbiAgICogY29ycmVsYXRpb24gdGFibGUuIFJlYWQtb25seSBieSBjb250cmFjdDogZ2VuZXJhdGVkIGJ5IHRoZSBleGVjdXRvclxuICAgKiAoYHJ1bm5lci9ydW5JZC50c2ApLCBuZXZlciBkZXJpdmVkIGZyb20gc25hcHNob3QgY29udGVudHMuXG4gICAqXG4gICAqIExpZmVjeWNsZSAobWF0Y2hlcyB0aGUgZXZlbnQgbW9kZWwpOiBmcmVzaCBwZXIgYHJ1bigpYCBBTkQgcGVyXG4gICAqIGByZXN1bWUoKWAg4oCUIHJlc3VtZSBpcyBsb2dpY2FsbHkgYSBkaXN0aW5jdCBydW4sIHNvIGEgcG9zdC1yZXN1bWVcbiAgICogc25hcHNob3QgY2FycmllcyBhIERJRkZFUkVOVCBydW5JZCB0aGFuIHRoZSBwYXVzZWQgcnVuJ3Mgc25hcHNob3QuXG4gICAqL1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1bidzIGNvcnJlbGF0aW9uICgxMC4xKSDigJQgYGVudi50cmFjZXBhcmVudGAsIG9yIGBlbnYudHJhY2VJZGAgKyBgZW52Lm9wZXJhdGlvbklkYCwgcmVzb2x2ZWQgb25jZSBwZXJcbiAgICogbGVnOyB0aGUgc2FtZSBmcm96ZW4gb2JqZWN0IGV2ZXJ5IGV2ZW50IG9mIHRoZSBsZWcgY2FycmllcyAoYFRyYXZlcnNhbENvbnRleHQuY29ycmVsYXRpb25gLCBhIHNjb3BlIGV2ZW50J3NcbiAgICogYGNvcnJlbGF0aW9uYCkuIExpa2UgYHJ1bklkYCwgcGVyIGxlZzogYSByZXN1bWUgY2FycmllcyBJVFMgZW52J3MsIG5ldmVyIHRoZSBwYXVzZWQgbGVnJ3MuIEFic2VudCDigJQgbm9cbiAgICoga2V5IOKAlCB3aGVuIG5vbmUgd2FzIGdpdmVuLlxuICAgKi9cbiAgcmVhZG9ubHkgY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcbiAgc2hhcmVkU3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBleGVjdXRpb25UcmVlOiBTdGFnZVNuYXBzaG90O1xuICAvKipcbiAgICogVGhlIGNvbW1pdCBsb2cncyBmb2xkIEJBU0Ug4oCUIHRoZSBydW4ncyBzdGF0ZSBiZWZvcmUgaXRzIGZpcnN0IGNvbW1pdFxuICAgKiAoYGluaXRpYWxDb250ZXh0YCBtZXJnZWQgd2l0aCBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgOyBvbiBhIHJlc3VtZSwgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBzdGF0ZSkuIERlZXBseSBmcm96ZW4gYW5kIGZ1bGx5IGRldGFjaGVkIGZyb20gdGhlIGVuZ2luZS5cbiAgICpcbiAgICogQ29tbWl0IGJ1bmRsZXMgYXJlIERJRkZTLCBzbyB0aGUgbG9nIGFsb25lIGNhbm5vdCByZWJ1aWxkIGEgdmFsdWUgdGhhdFxuICAgKiB3YXMgc2VlZGVkIGJlZm9yZSB0aGUgcnVuIGFuZCBvbmx5IGV2ZXIgbWVyZ2VkIGFmdGVyd2FyZHMuIFNoaXBwaW5nIHRoZVxuICAgKiBiYXNlIFdJVEggdGhlIGxvZyBpcyB3aGF0IG1ha2VzIGFuIG9mZmxpbmUgZm9sZCDigJQgYHN0YXRlQXQoc25hcHNob3QsIGkpYFxuICAgKiBmcm9tIGBmb290dHJhY2VgIOKAlCByZXByb2R1Y2UgdGhlIHN0YXRlIGEgc3RhZ2UgYWN0dWFsbHkgc2F3LlxuICAgKlxuICAgKiBPUFRJT05BTCBCWSBUWVBFLCBhbmQgYWJzZW50IGluIGV4YWN0bHkgdHdvIGNhc2VzLiBBIHBsYWluIGBnZXRTbmFwc2hvdCgpYFxuICAgKiBhbHdheXMgY2FycmllcyBpdCwgc28gYSBsaXZlIGZvbGQgcmVwb3J0cyBgYmFzaXM6ICdpbml0aWFsK2xvZydgLiBVbmRlclxuICAgKiBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIGl0IGlzIE9NSVRURUQg4oCUIHRoZSBiYXNlIGlzIHRoZSByYXcgcHJlLXJ1blxuICAgKiBzZWVkIGFuZCB0aGUgcmVkYWN0aW9uIHBvbGljeSBpcyBub3QgcGx1bWJlZCBpbnRvIHRoZSBmb2xkIOKAlCBzbyBhIGZvbGQgb2ZcbiAgICogYSByZWRhY3RlZCBzbmFwc2hvdCBkZWdyYWRlcyBob25lc3RseSB0byBgYmFzaXM6ICdsb2ctb25seSdgLiBBbmQgaXQgaXNcbiAgICogZGVjbGFyZWQgb3B0aW9uYWwgc28gdGhhdCBjb2RlIHdyaXR0ZW4gYWdhaW5zdCA5LjE2Lngg4oCUIGEgdGVzdCBmaXh0dXJlIG9yXG4gICAqIGEgVUkgbW9jayB0aGF0IENPTlNUUlVDVFMgYSBgUnVudGltZVNuYXBzaG90YCBsaXRlcmFsIOKAlCBzdGlsbCBjb21waWxlcy5cbiAgICogYHN0YXRlQXRgIGhhbmRsZXMgYWJzZW5jZSBieSBzYXlpbmcgc28sIG5ldmVyIGJ5IGZvbGRpbmcgYSBsaWUuXG4gICAqL1xuICByZWFkb25seSBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBjb21taXQgYnVuZGxlcywgb25lIHBlciBleGVjdXRlZCBzdGFnZSwgaW4gZXhlY3V0aW9uIG9yZGVyIOKAlFxuICAgKiBhIERFVEFDSEVELCBmcm96ZW4gY29weSBvZiB0aGUgZW5naW5lJ3MgbGl2ZSBsb2cgKGEgc25hcHNob3QgaXMgYSBmb2xkXG4gICAqIHJlc3VsdDogaXQgbXVzdCBub3Qga2VlcCBjaGFuZ2luZyB1bmRlciB0aGUgY29uc3VtZXIgdGhhdCBob2xkcyBpdCkuXG4gICAqIFRoZSBidW5kbGVzIGluc2lkZSBhcmUgdGhlIGVuZ2luZSdzIG93biBvYmplY3RzLCBpbW11dGFibGUgYWZ0ZXIgcmVjb3JkLlxuICAgKi9cbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXTtcbiAgLyoqIElkZW50aXR5IG9mIHRoaXMgbG9nLCBzdGFibGUgYWNyb3NzIHNhbWUtZXhlY3V0b3IgcmVzdW1lLiBBYnNlbnQgYmVmb3JlIGJpbmRpbmcgb3IgaW4gb2xkZXIgc291cmNlcy4gKi9cbiAgcmVhZG9ubHkgbG9nQWRkcmVzcz86IExvZ0FkZHJlc3M7XG4gIC8qKlxuICAgKiBFbmNvZGluZyBkaXNjcmltaW5hbnQgZm9yIGBjb21taXRMb2dgICgjMTNjLUIpOiBgJ2Z1bGwnYCDigJQgZXZlcnkgYHNldGBcbiAgICogYnVuZGxlIHN0b3JlcyB0aGUgZnVsbCBmaW5hbCB2YWx1ZSAoaGlzdG9yaWNhbCk7IGAnZGVsdGEnYCDigJQgYnVuZGxlcyBtYXlcbiAgICogY2FycnkgYGFwcGVuZGAvYGRlbGV0ZWAgdHJhY2UgdmVyYnMgd2l0aCB2ZXJiLXF1YWxpZmllZCBgb3ZlcndyaXRlYFxuICAgKiBwYXlsb2FkcyAodGFpbHMpLiBPZmZsaW5lIHRvb2xpbmcga2V5cyBvbiB0aGlzIGZpZWxkOyBhIGJ1bmRsZSBzdHJlYW1cbiAgICogd2l0aG91dCBjb250ZXh0IHJlbWFpbnMgc2VsZi1kZXNjcmliaW5nIHZpYSB0aGUgdmVyYnMgdGhlbXNlbHZlcy5cbiAgICovXG4gIGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZTtcbiAgLyoqIFBlci13cml0ZSByZWFkLXByb3ZlbmFuY2UgZGlhbCAoI1AxKSB0aGUgcnVuIGV4ZWN1dGVkIHVuZGVyIOKAlCB0aGVcbiAgICogIG9mZmxpbmUtdG9vbGluZyBkaXNjcmltaW5hbnQgZm9yIGBUcmFjZUVudHJ5LnJlYWRLZXlzYCBhdmFpbGFiaWxpdHkuICovXG4gIHdyaXRlUHJvdmVuYW5jZTogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbiAgLyoqXG4gICAqIFBlci1zdWJmbG93IGV4ZWN1dGlvbiByZXN1bHRzLCBEVUFMLUtFWUVEIChkZXNpZ246IGRvY3MvZGVzaWduL3N1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkubWQpOlxuICAgKiAgIC0gYnkgc3ViZmxvdyBQQVRIIChgc3ViZmxvd0lkYCwgZS5nLiBgJ3NmLXBheSdgKSDihpIgdGhlIExBU1QgaXRlcmF0aW9uIChiYWNrLWNvbXBhdCk7IHRoaXNcbiAgICogICAgIGlzIHdoYXQgYGdldFN1YnRyZWVTbmFwc2hvdChwYXRoKWAgYW5kIGBsaXN0U3ViZmxvd1BhdGhzKClgIHJlc29sdmUuXG4gICAqICAgLSBieSBwZXItZXhlY3V0aW9uIG1vdW50IGBydW50aW1lU3RhZ2VJZGAgKGUuZy4gYCdzZi1wYXkjNSdgKSDihpIgVEhBVCBpdGVyYXRpb24ncyByZXN1bHQsIHNvXG4gICAqICAgICBhIExPT1BJTkcgc3ViZmxvdyByZXRhaW5zIEVWRVJZIGl0ZXJhdGlvbiAobm90IGp1c3QgdGhlIGxhc3QpLiBMb29rIHVwIGEgc3BlY2lmaWNcbiAgICogICAgIGl0ZXJhdGlvbiBhcyBgc3ViZmxvd1Jlc3VsdHNbbm9kZS5ydW50aW1lU3RhZ2VJZF0gPz8gc3ViZmxvd1Jlc3VsdHNbbm9kZS5zdWJmbG93SWRdYC5cbiAgICogQm90aCBrZXlzIHBvaW50IGF0IHRoZSBzYW1lIG9iamVjdCBmb3IgYSBzaW5nbGUgbW91bnQ7IGl0ZXJhdGUgd2l0aCBjYXJlIChjb3VudCB2aWEgdGhlXG4gICAqIHBhdGgga2V5cyDigJQgdGhvc2Ugd2l0aG91dCBgJyMnYCkuIFRoZSBwYXVzZSBjaGVja3BvaW50IGNhcnJpZXMgb25seSB0aGUgcGF0aCBrZXlzLCBsZWFuLlxuICAgKlxuICAgKiBVbmRlciBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIGVhY2ggZW50cnkncyBgdHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgaXMgdGhhdFxuICAgKiBzdWJmbG93J3MgT1dOIHJlZGFjdGVkIG1pcnJvciAoOS4yMC4wKSDigJQgdGhlIGZvbGQgb2YgaXRzIHNjcnViYmVkIGBoaXN0b3J5YCDigJQgc2VydmVkIGFzXG4gICAqIG9uZSBzdWJzdGl0dXRlZCBvYmplY3QgcGVyIG1vdW50IChib3RoIGtleXMgc3RpbGwgYWdyZWUpIOKAlCB0aGUgd3JhcHBlciBpcyBmcmVzaCBwZXJcbiAgICogYGdldFNuYXBzaG90YCBjYWxsLCB0aGUgYGdsb2JhbENvbnRleHRgIGluc2lkZSBpdCBpcyB0aGUgc3RhYmxlIG1pcnJvcjsgcGxhaW4sIGl0IGlzIHRoZSBzdWJmbG93J3NcbiAgICogbGl2ZSBoZWFwLiBXaXRob3V0IGEgcG9saWN5IHRoZXJlIGlzIG5vIG1pcnJvciBhbmQgdGhlIHR3byB2aWV3cyBhcmUgdGhlIHNhbWUgb2JqZWN0cy5cbiAgICovXG4gIHN1YmZsb3dSZXN1bHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBTbmFwc2hvdCBkYXRhIGZyb20gcmVjb3JkZXJzIHRoYXQgaW1wbGVtZW50IHRvU25hcHNob3QoKS4gKi9cbiAgcmVjb3JkZXJzPzogUmVjb3JkZXJTbmFwc2hvdFtdO1xuICAvKipcbiAgICogRGVmZXJyZWQtb2JzZXJ2ZXIgYWNjb3VudGluZyAoUkZDLTAwMSBCbG9jayA5KSDigJQgcXVldWUgZGVwdGgsIGRyb3BzLFxuICAgKiBmbHVzaC9idWRnZXQgY291bnRlcnMsIHBlci1saXN0ZW5lciB0aW1lIGF0dHJpYnV0aW9uLCBhbmQgdGhlXG4gICAqIHRlcm1pbmFsLWZsdXNoIHN0cmFuZGluZyBjb3VudC4gQUJTRU5UIHVubGVzcyBhIHJlY29yZGVyIHdhcyBhdHRhY2hlZFxuICAgKiB3aXRoIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIG9uIHRoaXMgZXhlY3V0b3IgKHplcm8tY29zdCBkaXNjaXBsaW5lKS5cbiAgICovXG4gIG9ic2VydmVyU3RhdHM/OiBPYnNlcnZlclN0YXRzO1xuICAvKipcbiAgICogVGhlIGNyYXNoLXNhZmUgcmVjb3JkJ3MgYWNjb3VudGluZyAoMTAuMSwgUDYpIOKAlCBob3cgbWFueSBlbnRyaWVzIHRoZSBydW4gaGFuZGVkIGl0cyBzaW5rIGFuZCBob3cgbWFueSB0aGUgc2lua1xuICAgKiBkaWQgbm90IHRha2UuIEFCU0VOVCB1bmxlc3MgdGhlIGV4ZWN1dG9yIHdhcyBidWlsdCB3aXRoIGEgYHNpbmtgIGFuZCBhIHJ1biBzdGFydGVkLlxuICAgKi9cbiAgc2luaz86IFJlY29yZFNpbmtTdGF0cztcbn07XG5cbi8qKiBgZ2V0U25hcHNob3QoKS5zaW5rYCDigJQgd2hhdCB0aGUgcnVuIGhhbmRlZCBpdHMgc2luaywgYW5kIHdoYXQgdGhlIHNpbmsgZGlkIG5vdCB0YWtlICgxMC4xLCBQNikuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZFNpbmtTdGF0cyB7XG4gIC8qKiBFbnRyaWVzIGhhbmRlZCB0byB0aGUgYWRhcHRlciAoZWFjaCBgb3BlbmVkYCwgYGNvbW1pdGAsIGBub3RlYCwgYGNsb3NlZGAgY2FsbCkuICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIExvc3NlcyDigJQgYSBtZXRob2QgdGhhdCB0aHJldyBvciByZWplY3RlZCwgYW4gZW50cnkgdGhlIGxvZyByZWZ1c2VkIHRvIHNlbmQsIGEgYG1ldGFgIHRoZSBsb2cgY291bGQgbm90IGNvcHlcbiAgICogKHRoYXQgZW50cnkgd2FzIHN0aWxsIHN0b3JlZCwgd2l0aG91dCBpdCksIGFuZCBmYWlsZWQgb3IgdGltZWQtb3V0IGZsdXNoZXMuIEEgcmVqZWN0aW9uIHRoYXQgc2V0dGxlcyBhZnRlciB0aGVcbiAgICogcnVuIGZpbmlzaGVkIGlzIGNvdW50ZWQgd2hlbiBpdCBzZXR0bGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBudW1iZXI7XG4gIC8qKiBUaGUgbGFzdCBsb3NzJ3MgZXJyb3IsIGFzIHRleHQuIEFic2VudCB3aGlsZSBub3RoaW5nIHdhcyBsb3N0LiAqL1xuICByZWFkb25seSBsYXN0RXJyb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hlcmUgYSBydW50aW1lJ3MgbG9nIHdyaXRlcyBhcyBpdCBsYW5kcyAoMTAuMSwgUDYpOiB0aGUgcnVuJ3Mgc2luaywgdGhlIGxvZydzIGFkZHJlc3MgYW5kIHdoYXQgdGhlIHdyaXRlciBwdXRzIG9uXG4gKiBpdHMgYG9wZW5lZGAgZW50cnkuIEFic2VudCDihpIgdGhlIGxvZyBpcyB0aGUgcGxhaW4gb25lLWFyZ3VtZW50IGBFdmVudExvZ2AsIGJ5dGUtaWRlbnRpY2FsIHRvIDEwLjAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVJlY29yZCB7XG4gIHJlYWRvbmx5IHNpbms6IFJlY29yZFNpbms7XG4gIHJlYWRvbmx5IGFkZHJlc3M6IExvZ0FkZHJlc3M7XG4gIHJlYWRvbmx5IG1ldGE/OiBNZXRhO1xufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0aW9uUnVudGltZSB7XG4gIHB1YmxpYyBnbG9iYWxTdG9yZTogU2hhcmVkTWVtb3J5O1xuICAvKipcbiAgICogUGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yIG9mIGBnbG9iYWxTdG9yZWAuIFBvcHVsYXRlZCBieSBldmVyeSBjb21taXQgdGhhdFxuICAgKiBzdGFnZWQgYSB3cml0ZSAoYG1lbW9yeS9yZWNvcmRDb21taXQudHMgwrcgcmVjb3JkQ29tbWl0YCksIHdpdGggdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcy5cbiAgICogT25seSBleGlzdHMgd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGEgbWlycm9yIChgUnVuUG9saWN5Lm1pcnJvcmAg4oCUXG4gICAqIGBGbG93Q2hhcnRFeGVjdXRvcmAgc2V0cyBpdCB3aGVuIGEgYFJlZGFjdGlvblBvbGljeWAgaXMgY29uZmlndXJlZCkuXG4gICAqIE90aGVyd2lzZSB1bmRlZmluZWQgYW5kIHplcm8gY29zdC5cbiAgICpcbiAgICogUmVhZCB2aWEgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYC5cbiAgICovXG4gIHB1YmxpYyByZWRhY3RlZFN0b3JlPzogU2hhcmVkTWVtb3J5O1xuICBwdWJsaWMgcm9vdFN0YWdlQ29udGV4dDogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgZXhlY3V0aW9uSGlzdG9yeTogRXZlbnRMb2c7XG4gIC8qKiBUaGUgcnVuJ3Mgc2luaywgd2hlbiB0aGlzIHJ1bnRpbWUncyBsb2cgd3JpdGVzIHRvIG9uZSDigJQgaGFuZGVkIG9uIHRvIGV2ZXJ5IG1vdW50IChgcmVjb3JkRm9yYCkuICovXG4gIHByaXZhdGUgcmVjb3JkU2luaz86IFJlY29yZFNpbms7XG4gIC8qKiBPcmlnaW5hbCByb290IGZvciBnZXRTbmFwc2hvdCgpIOKAlCBzZXQgYmVmb3JlIHJlc3VtZSBjaGFuZ2VzIHJvb3RTdGFnZUNvbnRleHQuICovXG4gIHByaXZhdGUgX3NuYXBzaG90Um9vdD86IFN0YWdlQ29udGV4dDtcbiAgcHJpdmF0ZSBfaW5pdGlhbFN0YXRlOiB1bmtub3duO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWVzOiB1bmtub3duO1xuICAvKiogVGhlIHJ1bidzIHBvbGljeSAoYG1lbW9yeS9ydW5Qb2xpY3kudHNgKSDigJQgaW5zdGFsbGVkIG9uIHRoZSByb290IGZyYW1lO1xuICAgKiAgaXRzIGBjb21taXRWYWx1ZXNgIGFuZCBgd3JpdGVQcm92ZW5hbmNlYCBhcmUgdGhlIHNuYXBzaG90IGRpc2NyaW1pbmFudHMuICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3k7XG5cbiAgLyoqIE1lbW9pemVkIGZyb3plbiBmb2xkIGJhc2Ug4oCUIHNlZSB7QGxpbmsgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZX0uICovXG4gIHByaXZhdGUgX2ZvbGRCYXNlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwb2xpY3kgVGhlIHJ1bidzIHBvbGljeSAoYHJ1blBvbGljeS50c2AsIEY1KSDigJQgdGhlIGZvdXIgZGlhbHMsIHRoZVxuICAgKiAgIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWcuIEluc3RhbGxlZCBvbiB0aGUgcm9vdCBmcmFtZSBoZXJlLCBzb1xuICAgKiAgIHRoZSBGSVJTVCBjb21taXQgKGEgc3ViZmxvdydzIHNlZWQsIGBoaXN0b3J5WzBdYCkgYWxyZWFkeSBydW5zIHVuZGVyIGl0O1xuICAgKiAgIGV2ZXJ5IGZyYW1lIGFmdGVyIGluaGVyaXRzIHRoZSBzYW1lIHJlZmVyZW5jZS4gRGVmYXVsdDogZXZlcnkgZGlhbCBhdFxuICAgKiAgIGl0cyBkZWZhdWx0LCBubyBydWxlLCBubyBtaXJyb3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICByb290TmFtZTogc3RyaW5nLFxuICAgIHJvb3RJZDogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuICAgIGluaXRpYWxTdGF0ZT86IHVua25vd24sXG4gICAgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1ksXG4gICAgcmVjb3JkPzogUnVudGltZVJlY29yZCxcbiAgKSB7XG4gICAgdGhpcy5faW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0VmFsdWVzO1xuICAgIHRoaXMuZ2xvYmFsU3RvcmUgPSBuZXcgU2hhcmVkTWVtb3J5KGRlZmF1bHRWYWx1ZXMsIGluaXRpYWxTdGF0ZSk7XG4gICAgLy8gVGhlIGV2ZW50IGxvZydzIGZvbGQgYmFzZSBtdXN0IGJlIHRoZSBTQU1FIHN0YXRlIHRoZSBzdG9yZSBzdGFydHMgZnJvbVxuICAgIC8vIOKAlCBgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAsIHdoaWNoIGlzIHdoYXRcbiAgICAvLyBgU2hhcmVkTWVtb3J5YCBjb21wdXRlZCBhYm92ZS4gU2VlZGluZyB0aGUgbG9nIGZyb20gYGluaXRpYWxTdGF0ZWAgYWxvbmVcbiAgICAvLyBsZWZ0IGBkZWZhdWx0VmFsdWVzYCBvdXQgb2YgZXZlcnkgcmVwbGF5LCBzbyBhIGZvbGQgY291bGQgbm90IHJlcHJvZHVjZVxuICAgIC8vIHRoZSBzdGF0ZSBhIHN0YWdlIGFjdHVhbGx5IHNhdy4gYGdldFN0YXRlKClgIGlzIHRoZSBsaXZlIGNvbnRleHQ7IHRoZVxuICAgIC8vIEV2ZW50TG9nIGNvbnN0cnVjdG9yIGNsb25lcyBpdCwgc28gdGhlIGJhc2Ugc3RheXMgZGV0YWNoZWQuXG4gICAgdGhpcy5leGVjdXRpb25IaXN0b3J5ID0gb3BlbkxvZyh0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCksIHJlY29yZCk7XG4gICAgaWYgKHJlY29yZCAmJiB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZFNpbmsgPSByZWNvcmQuc2luaztcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQgPSB0aGlzLm5ld1Jvb3Qocm9vdE5hbWUsIHJvb3RJZCk7XG4gIH1cblxuICAvKipcbiAgICogQSBmcmVzaCByb290IGZyYW1lIGZvciB0aGlzIHJ1bnRpbWUg4oCUIGBnbG9iYWxTdG9yZWAsIGBleGVjdXRpb25IaXN0b3J5YCxcbiAgICogdGhlIHJ1bidzIHBvbGljeSBhbmQgKHdoZW4ga2VwdCkgdGhlIG1pcnJvci4gQWxzbyBob3cgYFN1YmZsb3dFeGVjdXRvcmBcbiAgICogcmVwbGFjZXMgYSBzdWJmbG93J3Mgc2VlZCBmcmFtZSB3aXRoIHRoZSBmcmFtZSBpdHMgZmlyc3Qgc3RhZ2UgcnVucyBvbi5cbiAgICovXG4gIG5ld1Jvb3QobmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICBjb25zdCByb290ID0gbmV3IFN0YWdlQ29udGV4dCgnJywgbmFtZSwgaWQsIHRoaXMuZ2xvYmFsU3RvcmUsICcnLCB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkpO1xuICAgIHRoaXMuaW5zdGFsbFBvbGljeShyb290KTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBwb2xpY3kgb24gdGhlIENVUlJFTlQgcm9vdCBmcmFtZSDigJQgYSBzYW1lLWV4ZWN1dG9yXG4gICAqIHJlc3VtZSwgd2hvc2UgY29udGludWF0aW9uIHJvb3QgKGBsZWFmLmNyZWF0ZU5leHRgKSBpcyBhZHZhbmNlZCBiZWZvcmVcbiAgICogdGhlIGV4ZWN1dG9yIGJ1aWxkcyB0aGlzIGxlZydzIHBvbGljeSAoYSBmcmVzaCBydWxlIHBlciBsZWcpLiBFdmVyeVxuICAgKiBkZXNjZW5kYW50IHRha2VzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGVyZS5cbiAgICovXG4gIHVzZVBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMuaW5zdGFsbFBvbGljeSh0aGlzLnJvb3RTdGFnZUNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwb2xpY3kgb24gYHJvb3RgLCBhbmQgdGhlIG1pcnJvciBzdG9yZSB3aGVuIHRoZSBwb2xpY3kga2VlcHMgb25lLlxuICAgKiBUaGUgbWlycm9yIGlzIGEgU0VSVkVEIHN1cmZhY2UsIHNvIGl0cyBzZWVkIG11c3QgYWxyZWFkeSBiZSB0aGUgcG9saWN5J3NcbiAgICogdmlldyBvZiB0aGUgc3RhcnRpbmcgc3RhdGU6IGEgcG9saWN5IGtleSB0aGF0IGFycml2ZXMgYnkgYGluaXRpYWxDb250ZXh0YFxuICAgKiAvIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAgKG9yLCBvbiBhIGNyb3NzLWV4ZWN1dG9yIHJlc3VtZSwgYnkgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBgc2hhcmVkU3RhdGVgKSBhbmQgaXMgbmV2ZXIgcmUtd3JpdHRlbiB3b3VsZCBvdGhlcndpc2Ugc2l0XG4gICAqIGluIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgaW4gcGxhaW50ZXh0IOKAlCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgKiB3aXRoIHRoZSBMT0cncyBwbGFjZWhvbGRlciwgdGhlIHNhbWUgc3RyaW5nIHRoZSByZWRhY3RlZCBwYXRjaGVzIGNhcnJ5LlxuICAgKiBDcmVhdGVkIG9uY2UgcGVyIHJ1bnRpbWUgKGEgc3ViZmxvdydzIHJ1bnRpbWUga2VlcHMgaXRzIG93bjsgaXRzIHNlZWQgaXNcbiAgICogZW1wdHkg4oCUIHRoZSBpbnB1dCBhcnJpdmVzIGFzIGEgY29tbWl0KS5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFBvbGljeShyb290OiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICByb290LnVzZVBvbGljeSh0aGlzLnBvbGljeSk7XG4gICAgaWYgKCF0aGlzLnBvbGljeS5taXJyb3IpIHJldHVybjtcbiAgICBpZiAoIXRoaXMucmVkYWN0ZWRTdG9yZSkge1xuICAgICAgY29uc3QgcnVsZSA9IHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgICAgIHRoaXMucmVkYWN0ZWRTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoXG4gICAgICAgIHJ1bGUgPyBydWxlLnJldGFpblN0YXRlKHRoaXMuX2RlZmF1bHRWYWx1ZXMsIExPR19QTEFDRUhPTERFUikgOiB0aGlzLl9kZWZhdWx0VmFsdWVzLFxuICAgICAgICBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZSh0aGlzLl9pbml0aWFsU3RhdGUsIExPR19QTEFDRUhPTERFUikgOiB0aGlzLl9pbml0aWFsU3RhdGUsXG4gICAgICApO1xuICAgIH1cbiAgICByb290LnVzZVJlZGFjdGVkTWlycm9yKHRoaXMucmVkYWN0ZWRTdG9yZSk7XG4gIH1cblxuICAvKiogUHJlc2VydmUgdGhlIGN1cnJlbnQgcm9vdFN0YWdlQ29udGV4dCBmb3Igc25hcHNob3RzIGJlZm9yZSBjaGFuZ2luZyBpdCBmb3IgcmVzdW1lLiAqL1xuICBwcmVzZXJ2ZVNuYXBzaG90Um9vdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3NuYXBzaG90Um9vdCkge1xuICAgICAgdGhpcy5fc25hcHNob3RSb290ID0gdGhpcy5yb290U3RhZ2VDb250ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnJvemVuLCBkZXRhY2hlZCBmb2xkIGJhc2Ugc2VydmVkIGFzIHtAbGluayBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlfS5cbiAgICogQ29tcHV0ZWQgb25jZSAodGhlIGJhc2UgbmV2ZXIgY2hhbmdlcyBhZnRlciBjb25zdHJ1Y3Rpb24pIGFuZCBzaGFyZWQg4oCUXG4gICAqIHNhZmUgYmVjYXVzZSBpdCBpcyBkZWVwbHkgZnJvemVuLCBzbyBubyBob2xkZXIgY2FuIG11dGF0ZSBpdCBvciByZWFjaCB0aGVcbiAgICogZW5naW5lIHRocm91Z2ggaXQ7IGEgYmFzZSBob2xkaW5nIGEgRGF0ZSwgTWFwLCBidWZmZXIg4oCmICh3aGF0IGZyZWV6aW5nXG4gICAqIGNhbm5vdCBzZWFsKSBpcyBzZXJ2ZWQgYnkgdGhlIHB1YmxpYyBzbmFwc2hvdCBhcyBhIGNvcHkgb2YgaXRzIG9wZW4gcGF0aHNcbiAgICogKGBydW5uZXIvc25hcHNob3QudHMgwrcgc2VydmVkU25hcHNob3RgLCBgY2FwdHVyZS9mcmVlemUudHMgwrcgc2VydmVSZWNvcmRgLFxuICAgKiA5LjQ0LjIpLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGb2xkQmFzZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLl9mb2xkQmFzZSkge1xuICAgICAgY29uc3QgYmFzZSA9IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5nZXRJbml0aWFsU3RhdGUoKTtcbiAgICAgIHRoaXMuX2ZvbGRCYXNlID0gZnJlZXplUmVjb3JkKGJhc2UgJiYgdHlwZW9mIGJhc2UgPT09ICdvYmplY3QnID8gYmFzZSA6IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZvbGRCYXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXJlIGEgbW91bnQncyBsb2cgd3JpdGVzICgxMC4xLCBQNik6IHRoZSBzYW1lIHNpbmssIGF0IHRoaXMgbG9nJ3MgYWRkcmVzcyBwbHVzIHRoZSBtb3VudCdzIGBydW50aW1lU3RhZ2VJZGBcbiAgICogKGBkcmlsbFBhdGg6IFsuLi5wYXJlbnQsIG1vdW50XWAsIHRoZSBhZGRyZXNzIGxhdyBgUnVudGltZVNuYXBzaG90LmxvZ0FkZHJlc3NgIHN0YXRlcykuIEFic2VudCB3aGVuIHRoaXMgbG9nXG4gICAqIHdyaXRlcyB0byBubyBzaW5rIOKAlCBhIG1vdW50IG9mIGEgcGxhaW4gbG9nIGlzIHBsYWluIHRvby5cbiAgICovXG4gIHJlY29yZEZvcihtb3VudFJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIG1ldGE/OiBNZXRhKTogUnVudGltZVJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYWRkcmVzcyA9IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5hZGRyZXNzO1xuICAgIGlmICh0aGlzLnJlY29yZFNpbmsgPT09IHVuZGVmaW5lZCB8fCBhZGRyZXNzID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpbms6IHRoaXMucmVjb3JkU2luayxcbiAgICAgIGFkZHJlc3M6IHsgbG9nUnVuSWQ6IGFkZHJlc3MubG9nUnVuSWQsIGRyaWxsUGF0aDogWy4uLmFkZHJlc3MuZHJpbGxQYXRoLCBtb3VudFJ1bnRpbWVTdGFnZUlkXSB9LFxuICAgICAgLi4uKG1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhIH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogVGVsbCB0aGUgc2luayB0aGlzIHJ1bnRpbWUncyBsb2cgZW5kZWQuIE5vdGhpbmcgaGFwcGVucyB3aXRob3V0IGEgc2luazsgbmV2ZXIgdGhyb3dzLiAqL1xuICBjbG9zZVJlY29yZChvdXRjb21lOiBMb2dPdXRjb21lLCBtZXRhPzogTWV0YSk6IHZvaWQge1xuICAgIHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5jbG9zZShvdXRjb21lLCBtZXRhKTtcbiAgfVxuXG4gIC8qKiBOb3RlIHNvbWV0aGluZyBiZXNpZGUgdGhpcyBydW50aW1lJ3MgbG9nLCBpbiBpdHMgc2luayAoYSByZXN1bWVkIGxlZykuIE5vdGhpbmcgd2l0aG91dCBhIHNpbms7IG5ldmVyIHRocm93cy4gKi9cbiAgbm90ZVJlY29yZChraW5kOiBzdHJpbmcsIGRhdGE6IE1ldGEpOiB2b2lkIHtcbiAgICB0aGlzLmV4ZWN1dGlvbkhpc3Rvcnkubm90ZShraW5kLCBkYXRhKTtcbiAgfVxuXG4gIGdldFBpcGVsaW5lcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgcmV0dXJuIHN0YXRlLnBpcGVsaW5lcyA/IE9iamVjdC5rZXlzKHN0YXRlLnBpcGVsaW5lcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiBbXTtcbiAgfVxuXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucm9vdFN0YWdlQ29udGV4dC5zZXRPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBydW50aW1lIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRhY3QgIFdoZW4gYHRydWVgLCByZXR1cm5zIGBzaGFyZWRTdGF0ZWAgZnJvbSB0aGVcbiAgICogICBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IgKGlmIG9uZSB3YXMgZW5hYmxlZCkuIFRoaXMgaXMgdGhlIHNhZmUgdmlld1xuICAgKiAgIGZvciBzaGFyaW5nIHRyYWNlcyBleHRlcm5hbGx5IOKAlCBwYXN0ZSBpbnRvIGEgdmlld2VyLCBzaGlwIHRvIHN1cHBvcnQsXG4gICAqICAgZXRjLiBXaGVuIHRoZSBtaXJyb3Igd2FzIG5ldmVyIGVuYWJsZWQsIGZhbGxzIGJhY2sgdG8gcmF3IGBnbG9iYWxTdG9yZWBcbiAgICogICBhbmQgYSBkZXYtbW9kZSB3YXJuaW5nIGlzIGVtaXR0ZWQgKHNpbGVudCBpbiBwcm9kdWN0aW9uKS5cbiAgICpcbiAgICogICBEZWZhdWx0IGBmYWxzZWAgcHJlc2VydmVzIHRoZSBydW50aW1lIHZpZXcg4oCUIG5lY2Vzc2FyeSBmb3IgcGF1c2UgL1xuICAgKiAgIHJlc3VtZSAocmVzdW1wdGlvbiBtdXN0IHJlcGxheSBhZ2FpbnN0IHRoZSByZWFsIHZhbHVlcywgbm90XG4gICAqICAgJ1tSRURBQ1RFRF0nKS5cbiAgICpcbiAgICogT3RoZXIgZmllbGRzIChgZXhlY3V0aW9uVHJlZWAsIGBjb21taXRMb2dgKSBhcmUgdGhlIHNhbWUgZWl0aGVyIHdheSDigJRcbiAgICogdGhlIGNvbW1pdCBsb2cgaXMgYWxyZWFkeSByZWRhY3RlZCBhdCB3cml0ZS10aW1lLCBhbmQgdGhlIGV4ZWN1dGlvblxuICAgKiB0cmVlIG9ubHkgY2FycmllcyBzdHJ1Y3R1cmFsIG1ldGFkYXRhLlxuICAgKlxuICAgKiBgaW5pdGlhbFN0YXRlYCAodGhlIGZvbGQgYmFzZSkgaXMgT01JVFRFRCB1bmRlciBgcmVkYWN0OiB0cnVlYC4gSXQgaXMgdGhlXG4gICAqIHJ1bidzIHJhdyBwcmUtcnVuIHNlZWQg4oCUIGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGhcbiAgICogYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCDigJQgYW5kIGl0IG5ldmVyIHBhc3NlZCB0aHJvdWdoIGEgcmVkYWN0aW9uXG4gICAqIHBvbGljeTogdGhlIHBvbGljeSBzY3J1YnMgV1JJVEVTIGF0IHRoZSBzY29wZSBmYWNhZGUsIGFuZCB0aGUgYmFzZSB3YXNcbiAgICogbmV2ZXIgd3JpdHRlbiBieSBhIHN0YWdlLiBTZXJ2aW5nIGl0IG9uIHRoZSByZWRhY3RlZCBzdXJmYWNlIHdvdWxkIGhhbmRcbiAgICogYmFjayB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgYSBzZWVkZWQgc2VjcmV0IHRoYXQgYSBsYXRlciBjb21taXQgaGFkXG4gICAqIHNjcnViYmVkLiBBIGNvbnN1bWVyIGZvbGRpbmcgd2l0aG91dCBpdCBnZXRzIGBiYXNpczogJ2xvZy1vbmx5J2AgZnJvbVxuICAgKiBgc3RhdGVBdGAsIHdoaWNoIGlzIHRoZSBob25lc3Qgc2lnbmFsIHRoYXQgdGhlIGJhc2UgZGlkIG5vdCB0cmF2ZWwgd2l0aFxuICAgKiB0aGlzIGxvZyDigJQgYSBwYXJ0aWFsIGFuc3dlciB0aGF0IHNheXMgaXQgaXMgcGFydGlhbCwgbmV2ZXIgYSBzaWxlbnQgb25lLlxuICAgKlxuICAgKiBSZXR1cm5zIGBPbWl0PFJ1bnRpbWVTbmFwc2hvdCwgJ3J1bklkJyB8ICdjb3JyZWxhdGlvbic+YDogdGhlIHJ1bnRpbWUgaXMgdGhlIG1lbW9yeVxuICAgKiBjb250YWluZXIgYW5kIGRvZXNuJ3Qga25vdyB3aGljaCBydW4gaXQgc2VydmVzIOKAlCBgcnVuSWRgIGlzIHBlci1ydW5cbiAgICogZXhlY3V0b3Igc3RhdGUsIHN0YW1wZWQgYnkgYEZsb3djaGFydFRyYXZlcnNlci5nZXRTbmFwc2hvdCgpYCAod2hpY2hcbiAgICogb3ducyB0aGUgcnVuJ3MgaWQgYW5kIGFscmVhZHkgc3RhbXBzIGl0IG9uIGV2ZXJ5IGV2ZW50KS4gU3ViZmxvd3MnXG4gICAqIG5lc3RlZCBydW50aW1lcyBkZWxpYmVyYXRlbHkgaGF2ZSBOTyBydW5JZCBvZiB0aGVpciBvd24gKGEgc3ViZmxvdyBpc1xuICAgKiBwYXJ0IG9mIHRoZSBwYXJlbnQncyBsb2dpY2FsIHJ1bikuIGBjb3JyZWxhdGlvbmAgaXMgdGhlIHRyYXZlcnNlcidzIGZvclxuICAgKiB0aGUgc2FtZSByZWFzb24uXG4gICAqL1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiBPbWl0PFJ1bnRpbWVTbmFwc2hvdCwgJ3J1bklkJyB8ICdjb3JyZWxhdGlvbic+IHtcbiAgICBjb25zdCBzbmFwc2hvdFJvb3QgPSB0aGlzLl9zbmFwc2hvdFJvb3QgPz8gdGhpcy5yb290U3RhZ2VDb250ZXh0O1xuICAgIGNvbnN0IHVzZVJlZGFjdGVkID0gb3B0aW9ucz8ucmVkYWN0ID09PSB0cnVlICYmIHRoaXMucmVkYWN0ZWRTdG9yZSAhPT0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBzaGFyZWRTdGF0ZTogdXNlUmVkYWN0ZWQgPyB0aGlzLnJlZGFjdGVkU3RvcmUhLmdldFN0YXRlKCkgOiB0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCksXG4gICAgICBleGVjdXRpb25UcmVlOiBzbmFwc2hvdFJvb3QuZ2V0U25hcHNob3QoKSxcbiAgICAgIC8vIFJFREFDVElPTjogdGhlIGZvbGQgYmFzZSBpcyB0aGUgcmF3IHByZS1ydW4gc2VlZCBhbmQgbm8gcG9saWN5IGV2ZXJcbiAgICAgIC8vIHRvdWNoZWQgaXQgKHBvbGljaWVzIHNjcnViIHdyaXRlczsgbm90aGluZyB3cm90ZSB0aGUgYmFzZSkuIE9taXQgaXRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGxlYWsgaXQg4oCUIGBzdGF0ZUF0YCBkZWdyYWRlcyB0byBgYmFzaXM6ICdsb2ctb25seSdgLlxuICAgICAgLi4uKHVzZVJlZGFjdGVkID8ge30gOiB7IGluaXRpYWxTdGF0ZTogdGhpcy5nZXRGb2xkQmFzZSgpIH0pLFxuICAgICAgLy8gREVUQUNIRUQ6IHRoZSBlbmdpbmUga2VlcHMgaXRzIGxpdmUgRXZlbnRMb2c7IHRoZSBzbmFwc2hvdCBnZXRzIGFcbiAgICAgIC8vIGZyb3plbiBhcnJheSBvZiBpdHMgb3duIChgcmVjb3JkZWQoKWAgYnVpbGRzIGEgbmV3IG9uZSkuIFNlcnZpbmcgdGhlXG4gICAgICAvLyBpbnRlcm5hbCBhcnJheSBhbGlhc2VkIGl0LCBzbyBhIHNuYXBzaG90IHRha2VuIG1pZC1ydW4ga2VwdCBncm93aW5nXG4gICAgICAvLyB1bmRlciBpdHMgaG9sZGVyIGFuZCBhIGNvbnN1bWVyIGNvdWxkIHNwbGljZSB0aGUgZW5naW5lJ3Mgb3duIGhpc3RvcnkuXG4gICAgICAvLyBUaGUgYnVuZGxlcyBpbiBpdCBhcmUgdGhlIGxvZydzIG93biwgZnJvemVuIGF0IGBFdmVudExvZyDCtyByZWNvcmRgXG4gICAgICAvLyAoRjMpLiBUaGUgcHVibGljIHNuYXBzaG90IHNlcnZlcyB0aGVtIChgcnVubmVyL3NuYXBzaG90LnRzIMK3XG4gICAgICAvLyBzZXJ2ZWRTbmFwc2hvdGAsIDkuNDQuMik7IHRoaXMgb25lIGlzIGFsc28gdGhlIGVuZ2luZSdzIG93biDigJQgYVxuICAgICAgLy8gc3ViZmxvdyBtb3VudCB0YWtlcyBpdCBvbmNlIHBlciBtb3VudCDigJQgc28gdGhlIHJ1biBwYXRoIHNlcnZlcyBub3RoaW5nLlxuICAgICAgY29tbWl0TG9nOiBPYmplY3QuZnJlZXplKHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5yZWNvcmRlZCgpKSBhcyBDb21taXRCdW5kbGVbXSxcbiAgICAgIC4uLih0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxvZ0FkZHJlc3M6IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5hZGRyZXNzIH0pLFxuICAgICAgY29tbWl0VmFsdWVzOiB0aGlzLnBvbGljeS5jb21taXRWYWx1ZXMsXG4gICAgICB3cml0ZVByb3ZlbmFuY2U6IHRoaXMucG9saWN5LndyaXRlUHJvdmVuYW5jZSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVGhlIHJ1bnRpbWUncyBsb2c6IHdpdGggYSByZWNvcmQsIHRoZSBsb2cgdGhhdCB3cml0ZXMgdG8gdGhlIHNpbmsgYXMgaXQgbGFuZHMuIEEgYmFzZSB0aGUgc2luayBjYW5ub3QgY2FycnkgKGl0XG4gKiBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0KSBpcyB0aGUgc2luaydzIGxvc3MsIG5ldmVyIHRoZSBydW4ncyDigJQgdGhlIGxvZyBpcyB0aGVuIHRoZSBwbGFpbiBvbmUsIGFuZCB0aGUgbG9zcyBpc1xuICogcmVwb3J0ZWQgdG8gdGhlIHNpbmsgbGlrZSBhbnkgb3RoZXIgKGBSZWNvcmRTaW5rLm9uRmFpbHVyZWApLCBzbyB0aGUgcnVuJ3MgYWNjb3VudGluZyBuYW1lcyBpdC5cbiAqL1xuZnVuY3Rpb24gb3BlbkxvZyhiYXNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmVjb3JkOiBSdW50aW1lUmVjb3JkIHwgdW5kZWZpbmVkKTogRXZlbnRMb2cge1xuICBpZiAocmVjb3JkID09PSB1bmRlZmluZWQpIHJldHVybiBuZXcgRXZlbnRMb2coYmFzZSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFdmVudExvZyhiYXNlLCByZWNvcmQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQuc2luay5vbkZhaWx1cmU/Lih7XG4gICAgICAgIGVudHJ5OiB7IGtpbmQ6ICdvcGVuZWQnLCBhZGRyZXNzOiByZWNvcmQuYWRkcmVzcywgYXQ6IERhdGUubm93KCksIGluaXRpYWxTdGF0ZToge30gfSxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBydW4ncyBvd24gc2luayBpc29sYXRlcyBpdHMgbGlzdGVuZXI7IGFuIGFwcCdzIHJhdyBhZGFwdGVyIGhlcmUgaXMgdG9sZCBvbmNlLCBiZXN0IGVmZm9ydC5cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFdmVudExvZyhiYXNlKTtcbiAgfVxufVxuIl19
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUlILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVNoSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFN0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQThKekQsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixXQUFXLENBQTJCO0lBQ3RDLDRGQUE0RjtJQUM1RixPQUFPLENBQWlCO0lBRXhCLFlBQVksQ0FBQyxLQUFhO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNoSCxNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdGLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFD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QUNyRyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO1lBQ3RDLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWU7WUFDNUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUk7Z0JBQ3RCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDO2FBQy9GLENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsT0FBTyxDQUFDLElBQTZCLEVBQUUsTUFBaUM7SUFDL0UsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN0QixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRTtnQkFDcEYsS0FBSzthQUNOLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxpR0FBaUc7UUFDbkcsQ0FBQztRQUNELE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4ZWN1dGlvblJ1bnRpbWUg4oCUIFRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciBvbmUgZmxvd2NoYXJ0IGV4ZWN1dGlvbi5cbiAqXG4gKiBXaXJlcyB1cCB0aGUgdGhyZWUgbWVtb3J5IHByaW1pdGl2ZXMgaW50byBhIHNpbmdsZSBjb250YWluZXI6XG4gKiAgIC0gU2hhcmVkTWVtb3J5ICh0aGUgaGVhcCDigJQgc2hhcmVkIHN0YXRlIGFjcm9zcyBhbGwgc3RhZ2VzKVxuICogICAtIFN0YWdlQ29udGV4dCAgKHRoZSBjYWxsIHN0YWNrIOKAlCBwZXItc3RhZ2UgZXhlY3V0aW9uIHRyZWUpXG4gKiAgIC0gRXZlbnRMb2cgICAgICAodGhlIHRyYW5zYWN0aW9uIGxvZyDigJQgY29tbWl0IGhpc3RvcnkgZm9yIHJlcGxheSlcbiAqXG4gKiBUaGUgZW5naW5lIChGbG93Y2hhcnRUcmF2ZXJzZXIpIHJlY2VpdmVzIHRoaXMgYXMgaXRzIHJ1bnRpbWUgcGFyYW1ldGVyLlxuICogQWZ0ZXIgZXhlY3V0aW9uLCBjb25zdW1lcnMgcXVlcnkgaXQgZm9yIHRoZSBmdWxsIGV4ZWN1dGlvbiBzdGF0ZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgQ29tbWl0VmFsdWVzTW9kZSwgTG9nQWRkcmVzcywgTG9nT3V0Y29tZSwgTWV0YSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZFNpbmssIFdyaXRlUHJvdmVuYW5jZU1vZGUgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFNvdXJjZVJlY29yZCwgRXZlbnRMb2csIGZyZWV6ZVJlY29yZCwgTE9HX1BMQUNFSE9MREVSLCBTaGFyZWRNZW1vcnkgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IFJ1bkNvcnJlbGF0aW9uIH0gZnJvbSAnLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENhcHR1cmVIaXN0b3J5U3RhdHVzIH0gZnJvbSAnLi4vY2FwdHVyZS9oaXN0b3J5VHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDYXB0dXJlQ2hhbm5lbFN0YXR1cyxcbiAgTmF0aXZlQ2FwdHVyZU5vdGUsXG4gIFJlY29yZGVyQ2FwdHVyZUFja25vd2xlZGdlbWVudCxcbn0gZnJvbSAnLi4vY2FwdHVyZS9uYXRpdmVDb3ZlcmFnZS5qcyc7XG5pbXBvcnQgeyBOYXRpdmVDYXB0dXJlIH0gZnJvbSAnLi4vY2FwdHVyZS9uYXRpdmVDb3ZlcmFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEVuZ2luZVJlYWRTb3VyY2VzLCBOYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb24sIFNvdXJjZUxpbWl0YXRpb24gfSBmcm9tICcuLi9jYXB0dXJlL3JlYWRTb3VyY2VzLmpzJztcbmltcG9ydCB7IEVuZ2luZVJlYWRTb3VyY2VDYXB0dXJlLCB3aXRoUmVhZFNvdXJjZXMgfSBmcm9tICcuLi9jYXB0dXJlL3JlYWRTb3VyY2VzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VTbmFwc2hvdCB9IGZyb20gJy4uL21lbW9yeS9mcmFtZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1kgfSBmcm9tICcuLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNlcnZlclN0YXRzIH0gZnJvbSAnLi9EZWZlcnJlZE9ic2VydmVyVGllci5qcyc7XG5cbi8qKiBTbmFwc2hvdCBvZiBhIHNpbmdsZSByZWNvcmRlcidzIGNvbGxlY3RlZCBkYXRhLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlclNuYXBzaG90IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU2NvcGVSZWNvcmRlciB0eXBlIGFuZCBwYXR0ZXJuIGRlc2NyaXB0aW9uIChlLmcuLCBcIlRyYW5zbGF0b3IgKEtleWVkU3RvcmUpIOKAlCBwZXItc3RlcCB0b2tlbiB1c2FnZVwiKS4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBQcmVmZXJyZWQgcmVhZC10aW1lIG9wZXJhdGlvbiDigJQgaGludHMgdGhlIFVJIGFib3V0IHdoaWNoIHZpZXcgdG8gc2hvdyBwcm9taW5lbnRseS4gKi9cbiAgcHJlZmVycmVkT3BlcmF0aW9uPzogJ3RyYW5zbGF0ZScgfCAnYWNjdW11bGF0ZScgfCAnYWdncmVnYXRlJztcbiAgZGF0YTogdW5rbm93bjtcbiAgLyoqXG4gICAqIFNtYWxsIG1hY2hpbmUtcmVhZGFibGUgZmFjdHMgYWJvdXQgdGhlIEJVTkRMRSDigJQgaG93IGl0IHdhcyBwcm9kdWNlZCxcbiAgICogd2hpY2ggcHJvamVjdGlvbiBvZiB0aGUgcmVjb3JkZXIncyBkYXRhIGl0IGlzLCB3aGF0IGl0IGRlbGliZXJhdGVseVxuICAgKiBsZWZ0IG91dC4gV2hhdGV2ZXIgdGhlIHJlY29yZGVyJ3MgYHRvU25hcHNob3QoKWAgcHV0IGhlcmUsIGNvcGllZFxuICAgKiB0aHJvdWdoIHVuY2hhbmdlZC5cbiAgICpcbiAgICogVGhlIHNwbGl0IHdpdGggYGRlc2NyaXB0aW9uYDogYGRlc2NyaXB0aW9uYCBpcyB0aGUgc2VudGVuY2UgYSBodW1hblxuICAgKiByZWFkczsgYG1ldGFgIGlzIHdoYXQgYW4gb2ZmbGluZSBjb25zdW1lciBCUkFOQ0hFUyBvbi4gQSByZWNvcmRlciB3aXRoXG4gICAqIGEgXCJmdWxsXCIgYW5kIGEgXCJsZWFuXCIgYnVuZGxlIHNoYXBlIHRoYXQgc2F5cyBzbyBvbmx5IGluIGl0c1xuICAgKiBkZXNjcmlwdGlvbiBmb3JjZXMgZXZlcnkgcmVhZGVyIHRvIHN0cmluZy1tYXRjaCBwcm9zZSDigJQgYW5kIGEgcmVhZGVyXG4gICAqIHRoYXQgZG9lc24ndCByZW5kZXJzIGFuIGVtcHR5IHBhbmVsIGluc3RlYWQgb2Ygc2F5aW5nIFwidGhpcyByZWNvcmRpbmdcbiAgICogY2FycmllcyBzdHJ1Y3R1cmUgb25seVwiLlxuICAgKlxuICAgKiBOb3QgaW50ZXJwcmV0ZWQgYnkgdGhlIGVuZ2luZSwgc28ga2V5cyBhcmUgdGhlIHJlY29yZGVyJ3MgdG8gY2hvb3NlO1xuICAgKiBrZWVwIHRoZSB2YWx1ZXMgSlNPTi1zYWZlLCBzaW5jZSB0aGlzIHJpZGVzIHRoZSBzbmFwc2hvdCBvdXQgdG8gZGlzay5cbiAgICovXG4gIG1ldGE/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIC8qKiBPcHRpb25hbCBjdXJyZW50LXJ1biBjYXB0dXJlIGFja25vd2xlZGdlbWVudCBmcm9tIHRoZSByZWNvcmRlciBjb250cmFjdC4gKi9cbiAgY2FwdHVyZT86IFJlY29yZGVyQ2FwdHVyZUFja25vd2xlZGdlbWVudDtcbn1cblxuZXhwb3J0IHR5cGUgUnVudGltZVNuYXBzaG90ID0ge1xuICAvKipcbiAgICogVGhlIHJ1biB0aGlzIHNuYXBzaG90IGJlbG9uZ3MgdG8g4oCUIHRoZSBzYW1lIGBydW5JZGAgc3RhbXBlZCBvbiBldmVyeVxuICAgKiBgVHJhdmVyc2FsQ29udGV4dGAgKGFuZCB0aHVzIGV2ZXJ5IHJlY29yZGVyIGV2ZW50KSBvZiB0aGUgcnVuLCBzbyBhXG4gICAqIHNuYXBzaG90IGNhbiBiZSBqb2luZWQgYWdhaW5zdCBhbiBldmVudCBzdHJlYW0gb3IgYW4gZXh0ZXJuYWxcbiAgICogY29ycmVsYXRpb24gdGFibGUuIFJlYWQtb25seSBieSBjb250cmFjdDogZ2VuZXJhdGVkIGJ5IHRoZSBleGVjdXRvclxuICAgKiAoYHJ1bm5lci9ydW5JZC50c2ApLCBuZXZlciBkZXJpdmVkIGZyb20gc25hcHNob3QgY29udGVudHMuXG4gICAqXG4gICAqIExpZmVjeWNsZSAobWF0Y2hlcyB0aGUgZXZlbnQgbW9kZWwpOiBmcmVzaCBwZXIgYHJ1bigpYCBBTkQgcGVyXG4gICAqIGByZXN1bWUoKWAg4oCUIHJlc3VtZSBpcyBsb2dpY2FsbHkgYSBkaXN0aW5jdCBydW4sIHNvIGEgcG9zdC1yZXN1bWVcbiAgICogc25hcHNob3QgY2FycmllcyBhIERJRkZFUkVOVCBydW5JZCB0aGFuIHRoZSBwYXVzZWQgcnVuJ3Mgc25hcHNob3QuXG4gICAqL1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKiogT3B0LWluIG5hdGl2ZSBvYnNlcnZhdGlvbjsgcm9vdCBsb2cgYW5kIGN1cnJlbnQgbGVnIG9ubHksIG5ldmVyIGR1cmFibGUgc3RvcmFnZS4gKi9cbiAgcmVhZG9ubHkgY2FwdHVyZT86IE5hdGl2ZUNhcHR1cmVPYnNlcnZhdGlvbjtcbiAgLyoqIE9wdC1pbiBvcmRlcmVkIG5hdGl2ZSBvY2N1cnJlbmNlcy4gVW5rbm93biBvd25lcnNoaXAgaGFzIG5vIHJlY29yZDsgbmV2ZXIgaW5mZXIgb2JzZXJ2ZWQtZW1wdHkuICovXG4gIHJlYWRvbmx5IHJlYWRTb3VyY2VzPzogRW5naW5lUmVhZFNvdXJjZXM7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgY29ycmVsYXRpb24gKDEwLjEpIOKAlCBgZW52LnRyYWNlcGFyZW50YCwgb3IgYGVudi50cmFjZUlkYCArIGBlbnYub3BlcmF0aW9uSWRgLCByZXNvbHZlZCBvbmNlIHBlclxuICAgKiBsZWc7IHRoZSBzYW1lIGZyb3plbiBvYmplY3QgZXZlcnkgZXZlbnQgb2YgdGhlIGxlZyBjYXJyaWVzIChgVHJhdmVyc2FsQ29udGV4dC5jb3JyZWxhdGlvbmAsIGEgc2NvcGUgZXZlbnQnc1xuICAgKiBgY29ycmVsYXRpb25gKS4gTGlrZSBgcnVuSWRgLCBwZXIgbGVnOiBhIHJlc3VtZSBjYXJyaWVzIElUUyBlbnYncywgbmV2ZXIgdGhlIHBhdXNlZCBsZWcncy4gQWJzZW50IOKAlCBub1xuICAgKiBrZXkg4oCUIHdoZW4gbm9uZSB3YXMgZ2l2ZW4uXG4gICAqL1xuICByZWFkb25seSBjb3JyZWxhdGlvbj86IFJ1bkNvcnJlbGF0aW9uO1xuICBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IGxvZydzIGZvbGQgQkFTRSDigJQgdGhlIHJ1bidzIHN0YXRlIGJlZm9yZSBpdHMgZmlyc3QgY29tbWl0XG4gICAqIChgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGA7IG9uIGEgcmVzdW1lLCB0aGVcbiAgICogY2hlY2twb2ludCdzIHN0YXRlKS4gRGVlcGx5IGZyb3plbiBhbmQgZnVsbHkgZGV0YWNoZWQgZnJvbSB0aGUgZW5naW5lLlxuICAgKlxuICAgKiBDb21taXQgYnVuZGxlcyBhcmUgRElGRlMsIHNvIHRoZSBsb2cgYWxvbmUgY2Fubm90IHJlYnVpbGQgYSB2YWx1ZSB0aGF0XG4gICAqIHdhcyBzZWVkZWQgYmVmb3JlIHRoZSBydW4gYW5kIG9ubHkgZXZlciBtZXJnZWQgYWZ0ZXJ3YXJkcy4gU2hpcHBpbmcgdGhlXG4gICAqIGJhc2UgV0lUSCB0aGUgbG9nIGlzIHdoYXQgbWFrZXMgYW4gb2ZmbGluZSBmb2xkIOKAlCBgc3RhdGVBdChzbmFwc2hvdCwgaSlgXG4gICAqIGZyb20gYGZvb3R0cmFjZWAg4oCUIHJlcHJvZHVjZSB0aGUgc3RhdGUgYSBzdGFnZSBhY3R1YWxseSBzYXcuXG4gICAqXG4gICAqIE9QVElPTkFMIEJZIFRZUEUsIGFuZCBhYnNlbnQgaW4gZXhhY3RseSB0d28gY2FzZXMuIEEgcGxhaW4gYGdldFNuYXBzaG90KClgXG4gICAqIGFsd2F5cyBjYXJyaWVzIGl0LCBzbyBhIGxpdmUgZm9sZCByZXBvcnRzIGBiYXNpczogJ2luaXRpYWwrbG9nJ2AuIFVuZGVyXG4gICAqIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgaXQgaXMgT01JVFRFRCDigJQgdGhlIGJhc2UgaXMgdGhlIHJhdyBwcmUtcnVuXG4gICAqIHNlZWQgYW5kIHRoZSByZWRhY3Rpb24gcG9saWN5IGlzIG5vdCBwbHVtYmVkIGludG8gdGhlIGZvbGQg4oCUIHNvIGEgZm9sZCBvZlxuICAgKiBhIHJlZGFjdGVkIHNuYXBzaG90IGRlZ3JhZGVzIGhvbmVzdGx5IHRvIGBiYXNpczogJ2xvZy1vbmx5J2AuIEFuZCBpdCBpc1xuICAgKiBkZWNsYXJlZCBvcHRpb25hbCBzbyB0aGF0IGNvZGUgd3JpdHRlbiBhZ2FpbnN0IDkuMTYueCDigJQgYSB0ZXN0IGZpeHR1cmUgb3JcbiAgICogYSBVSSBtb2NrIHRoYXQgQ09OU1RSVUNUUyBhIGBSdW50aW1lU25hcHNob3RgIGxpdGVyYWwg4oCUIHN0aWxsIGNvbXBpbGVzLlxuICAgKiBgc3RhdGVBdGAgaGFuZGxlcyBhYnNlbmNlIGJ5IHNheWluZyBzbywgbmV2ZXIgYnkgZm9sZGluZyBhIGxpZS5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogVGhlIHJ1bidzIGNvbW1pdCBidW5kbGVzLCBvbmUgcGVyIGV4ZWN1dGVkIHN0YWdlLCBpbiBleGVjdXRpb24gb3JkZXIg4oCUXG4gICAqIGEgREVUQUNIRUQsIGZyb3plbiBjb3B5IG9mIHRoZSBlbmdpbmUncyBsaXZlIGxvZyAoYSBzbmFwc2hvdCBpcyBhIGZvbGRcbiAgICogcmVzdWx0OiBpdCBtdXN0IG5vdCBrZWVwIGNoYW5naW5nIHVuZGVyIHRoZSBjb25zdW1lciB0aGF0IGhvbGRzIGl0KS5cbiAgICogVGhlIGJ1bmRsZXMgaW5zaWRlIGFyZSB0aGUgZW5naW5lJ3Mgb3duIG9iamVjdHMsIGltbXV0YWJsZSBhZnRlciByZWNvcmQuXG4gICAqL1xuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdO1xuICAvKiogSWRlbnRpdHkgb2YgdGhpcyBsb2csIHN0YWJsZSBhY3Jvc3Mgc2FtZS1leGVjdXRvciByZXN1bWUuIEFic2VudCBiZWZvcmUgYmluZGluZyBvciBpbiBvbGRlciBzb3VyY2VzLiAqL1xuICByZWFkb25seSBsb2dBZGRyZXNzPzogTG9nQWRkcmVzcztcbiAgLyoqXG4gICAqIEVuY29kaW5nIGRpc2NyaW1pbmFudCBmb3IgYGNvbW1pdExvZ2AgKCMxM2MtQik6IGAnZnVsbCdgIOKAlCBldmVyeSBgc2V0YFxuICAgKiBidW5kbGUgc3RvcmVzIHRoZSBmdWxsIGZpbmFsIHZhbHVlIChoaXN0b3JpY2FsKTsgYCdkZWx0YSdgIOKAlCBidW5kbGVzIG1heVxuICAgKiBjYXJyeSBgYXBwZW5kYC9gZGVsZXRlYCB0cmFjZSB2ZXJicyB3aXRoIHZlcmItcXVhbGlmaWVkIGBvdmVyd3JpdGVgXG4gICAqIHBheWxvYWRzICh0YWlscykuIE9mZmxpbmUgdG9vbGluZyBrZXlzIG9uIHRoaXMgZmllbGQ7IGEgYnVuZGxlIHN0cmVhbVxuICAgKiB3aXRob3V0IGNvbnRleHQgcmVtYWlucyBzZWxmLWRlc2NyaWJpbmcgdmlhIHRoZSB2ZXJicyB0aGVtc2VsdmVzLlxuICAgKi9cbiAgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlO1xuICAvKiogUGVyLXdyaXRlIHJlYWQtcHJvdmVuYW5jZSBkaWFsICgjUDEpIHRoZSBydW4gZXhlY3V0ZWQgdW5kZXIg4oCUIHRoZVxuICAgKiAgb2ZmbGluZS10b29saW5nIGRpc2NyaW1pbmFudCBmb3IgYFRyYWNlRW50cnkucmVhZEtleXNgIGF2YWlsYWJpbGl0eS4gKi9cbiAgd3JpdGVQcm92ZW5hbmNlOiBXcml0ZVByb3ZlbmFuY2VNb2RlO1xuICAvKipcbiAgICogUGVyLXN1YmZsb3cgZXhlY3V0aW9uIHJlc3VsdHMsIERVQUwtS0VZRUQgKGRlc2lnbjogZG9jcy9kZXNpZ24vc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eS5tZCk6XG4gICAqICAgLSBieSBzdWJmbG93IFBBVEggKGBzdWJmbG93SWRgLCBlLmcuIGAnc2YtcGF5J2ApIOKGkiB0aGUgTEFTVCBpdGVyYXRpb24gKGJhY2stY29tcGF0KTsgdGhpc1xuICAgKiAgICAgaXMgd2hhdCBgZ2V0U3VidHJlZVNuYXBzaG90KHBhdGgpYCBhbmQgYGxpc3RTdWJmbG93UGF0aHMoKWAgcmVzb2x2ZS5cbiAgICogICAtIGJ5IHBlci1leGVjdXRpb24gbW91bnQgYHJ1bnRpbWVTdGFnZUlkYCAoZS5nLiBgJ3NmLXBheSM1J2ApIOKGkiBUSEFUIGl0ZXJhdGlvbidzIHJlc3VsdCwgc29cbiAgICogICAgIGEgTE9PUElORyBzdWJmbG93IHJldGFpbnMgRVZFUlkgaXRlcmF0aW9uIChub3QganVzdCB0aGUgbGFzdCkuIExvb2sgdXAgYSBzcGVjaWZpY1xuICAgKiAgICAgaXRlcmF0aW9uIGFzIGBzdWJmbG93UmVzdWx0c1tub2RlLnJ1bnRpbWVTdGFnZUlkXSA/PyBzdWJmbG93UmVzdWx0c1tub2RlLnN1YmZsb3dJZF1gLlxuICAgKiBCb3RoIGtleXMgcG9pbnQgYXQgdGhlIHNhbWUgb2JqZWN0IGZvciBhIHNpbmdsZSBtb3VudDsgaXRlcmF0ZSB3aXRoIGNhcmUgKGNvdW50IHZpYSB0aGVcbiAgICogcGF0aCBrZXlzIOKAlCB0aG9zZSB3aXRob3V0IGAnIydgKS4gVGhlIHBhdXNlIGNoZWNrcG9pbnQgY2FycmllcyBvbmx5IHRoZSBwYXRoIGtleXMsIGxlYW4uXG4gICAqXG4gICAqIFVuZGVyIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgZWFjaCBlbnRyeSdzIGB0cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0YCBpcyB0aGF0XG4gICAqIHN1YmZsb3cncyBPV04gcmVkYWN0ZWQgbWlycm9yICg5LjIwLjApIOKAlCB0aGUgZm9sZCBvZiBpdHMgc2NydWJiZWQgYGhpc3RvcnlgIOKAlCBzZXJ2ZWQgYXNcbiAgICogb25lIHN1YnN0aXR1dGVkIG9iamVjdCBwZXIgbW91bnQgKGJvdGgga2V5cyBzdGlsbCBhZ3JlZSkg4oCUIHRoZSB3cmFwcGVyIGlzIGZyZXNoIHBlclxuICAgKiBgZ2V0U25hcHNob3RgIGNhbGwsIHRoZSBgZ2xvYmFsQ29udGV4dGAgaW5zaWRlIGl0IGlzIHRoZSBzdGFibGUgbWlycm9yOyBwbGFpbiwgaXQgaXMgdGhlIHN1YmZsb3cnc1xuICAgKiBsaXZlIGhlYXAuIFdpdGhvdXQgYSBwb2xpY3kgdGhlcmUgaXMgbm8gbWlycm9yIGFuZCB0aGUgdHdvIHZpZXdzIGFyZSB0aGUgc2FtZSBvYmplY3RzLlxuICAgKi9cbiAgc3ViZmxvd1Jlc3VsdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFNuYXBzaG90IGRhdGEgZnJvbSByZWNvcmRlcnMgdGhhdCBpbXBsZW1lbnQgdG9TbmFwc2hvdCgpLiAqL1xuICByZWNvcmRlcnM/OiBSZWNvcmRlclNuYXBzaG90W107XG4gIC8qKlxuICAgKiBEZWZlcnJlZC1vYnNlcnZlciBhY2NvdW50aW5nIChSRkMtMDAxIEJsb2NrIDkpIOKAlCBxdWV1ZSBkZXB0aCwgZHJvcHMsXG4gICAqIGZsdXNoL2J1ZGdldCBjb3VudGVycywgcGVyLWxpc3RlbmVyIHRpbWUgYXR0cmlidXRpb24sIGFuZCB0aGVcbiAgICogdGVybWluYWwtZmx1c2ggc3RyYW5kaW5nIGNvdW50LiBBQlNFTlQgdW5sZXNzIGEgcmVjb3JkZXIgd2FzIGF0dGFjaGVkXG4gICAqIHdpdGggYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgb24gdGhpcyBleGVjdXRvciAoemVyby1jb3N0IGRpc2NpcGxpbmUpLlxuICAgKi9cbiAgb2JzZXJ2ZXJTdGF0cz86IE9ic2VydmVyU3RhdHM7XG4gIC8qKlxuICAgKiBUaGUgY3Jhc2gtc2FmZSByZWNvcmQncyBhY2NvdW50aW5nICgxMC4xLCBQNikg4oCUIGhvdyBtYW55IGVudHJpZXMgdGhlIHJ1biBoYW5kZWQgaXRzIHNpbmsgYW5kIGhvdyBtYW55IHRoZSBzaW5rXG4gICAqIGRpZCBub3QgdGFrZS4gQUJTRU5UIHVubGVzcyB0aGUgZXhlY3V0b3Igd2FzIGJ1aWx0IHdpdGggYSBgc2lua2AgYW5kIGEgcnVuIHN0YXJ0ZWQuXG4gICAqL1xuICBzaW5rPzogUmVjb3JkU2lua1N0YXRzO1xufTtcblxuLyoqIGBnZXRTbmFwc2hvdCgpLnNpbmtgIOKAlCB3aGF0IHRoZSBydW4gaGFuZGVkIGl0cyBzaW5rLCBhbmQgd2hhdCB0aGUgc2luayBkaWQgbm90IHRha2UgKDEwLjEsIFA2KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkU2lua1N0YXRzIHtcbiAgLyoqIFByZXNlbnQgb25seSB3aGVuIGV4cGxpY2l0IGNhcHR1cmUgcGVyc2lzdGVuY2Ugd2FzIHJlcXVlc3RlZC4gTmV2ZXIgaW5mZXJyZWQgZnJvbSBhbiBvcmRpbmFyeSBmbHVzaC4gKi9cbiAgcmVhZG9ubHkgY2FwdHVyZT86IENhcHR1cmVIaXN0b3J5U3RhdHVzO1xuICAvKiogRW50cmllcyBoYW5kZWQgdG8gdGhlIGFkYXB0ZXIgKGVhY2ggYG9wZW5lZGAsIGBjb21taXRgLCBgbm90ZWAsIGBjbG9zZWRgIGNhbGwpLiAqL1xuICByZWFkb25seSBlbnRyaWVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBMb3NzZXMg4oCUIGEgbWV0aG9kIHRoYXQgdGhyZXcgb3IgcmVqZWN0ZWQsIGFuIGVudHJ5IHRoZSBsb2cgcmVmdXNlZCB0byBzZW5kLCBhIGBtZXRhYCB0aGUgbG9nIGNvdWxkIG5vdCBjb3B5XG4gICAqICh0aGF0IGVudHJ5IHdhcyBzdGlsbCBzdG9yZWQsIHdpdGhvdXQgaXQpLCBhbmQgZmFpbGVkIG9yIHRpbWVkLW91dCBmbHVzaGVzLiBBIHJlamVjdGlvbiB0aGF0IHNldHRsZXMgYWZ0ZXIgdGhlXG4gICAqIHJ1biBmaW5pc2hlZCBpcyBjb3VudGVkIHdoZW4gaXQgc2V0dGxlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZhaWxlZDogbnVtYmVyO1xuICAvKiogVGhlIGxhc3QgbG9zcydzIGVycm9yLCBhcyB0ZXh0LiBBYnNlbnQgd2hpbGUgbm90aGluZyB3YXMgbG9zdC4gKi9cbiAgcmVhZG9ubHkgbGFzdEVycm9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXJlIGEgcnVudGltZSdzIGxvZyB3cml0ZXMgYXMgaXQgbGFuZHMgKDEwLjEsIFA2KTogdGhlIHJ1bidzIHNpbmssIHRoZSBsb2cncyBhZGRyZXNzIGFuZCB3aGF0IHRoZSB3cml0ZXIgcHV0cyBvblxuICogaXRzIGBvcGVuZWRgIGVudHJ5LiBBYnNlbnQg4oaSIHRoZSBsb2cgaXMgdGhlIHBsYWluIG9uZS1hcmd1bWVudCBgRXZlbnRMb2dgLCBieXRlLWlkZW50aWNhbCB0byAxMC4wLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVSZWNvcmQge1xuICByZWFkb25seSBzaW5rOiBSZWNvcmRTaW5rO1xuICByZWFkb25seSBhZGRyZXNzOiBMb2dBZGRyZXNzO1xuICByZWFkb25seSBtZXRhPzogTWV0YTtcbn1cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGlvblJ1bnRpbWUge1xuICByZWFkU291cmNlcz86IEVuZ2luZVJlYWRTb3VyY2VDYXB0dXJlO1xuICAvKiogUHJlc2VudCBvbmx5IGZvciB0aGUgY3VycmVudCBvcHRlZC1pbiByb290IGxlZy4gTmV2ZXIgaW5oZXJpdGVkIGJ5IGEgc3ViZmxvdyBydW50aW1lLiAqL1xuICBjYXB0dXJlPzogTmF0aXZlQ2FwdHVyZTtcblxuICBiZWdpbkNhcHR1cmUocnVuSWQ6IHN0cmluZyk6IE5hdGl2ZUNhcHR1cmUge1xuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyA/PyB0aGlzLmNhcHR1cmU/LmxvZ0FkZHJlc3MgPz8geyBsb2dSdW5JZDogcnVuSWQsIGRyaWxsUGF0aDogW10gfTtcbiAgICBjb25zdCBjYXB0dXJlID0gbmV3IE5hdGl2ZUNhcHR1cmUocnVuSWQsIGFkZHJlc3MsIHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5sZW5ndGgsIHRoaXMucG9saWN5KTtcbiAgICBpZiAodGhpcy5jYXB0dXJlKSBjYXB0dXJlLmxpbWl0KCdyZXN1bWVkLXNlZ21lbnQnKTtcbiAgICB0aGlzLmNhcHR1cmUgPSBjYXB0dXJlO1xuICAgIHRoaXMucm9vdFN0YWdlQ29udGV4dC5jYXB0dXJlID0gY2FwdHVyZTtcbiAgICByZXR1cm4gY2FwdHVyZTtcbiAgfVxuXG4gIC8qKiBBIHJldXNlZCBsb2cgY2Fubm90IGJlIHJldHJvZml0dGVkIG9yIHJlbGFiZWxsZWQgYXMgdGhlIG5ldyBsZWcncyBiYXNlLiAqL1xuICByZXN1bWVSZWFkU291cmNlcyhydW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWFkU291cmNlcz8ucmV0aXJlKCk7XG4gICAgdGhpcy5yZWFkU291cmNlcyA9IHRoaXMucG9saWN5LnJlYWRTb3VyY2VzXG4gICAgICA/IG5ldyBFbmdpbmVSZWFkU291cmNlQ2FwdHVyZShydW5JZCwgdW5kZWZpbmVkLCAncmVzdW1lZC1zb3VyY2Utb3duZXJzaGlwJywgdGhpcy5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aClcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucm9vdFN0YWdlQ29udGV4dC5yZWFkU291cmNlcyA9IHRoaXMucmVhZFNvdXJjZXM7XG4gIH1cblxuICBjYXB0dXJlU25hcHNob3QoXG4gICAgdG86IG51bWJlcixcbiAgICBjb250cm9sOiBDYXB0dXJlQ2hhbm5lbFN0YXR1cyA9ICd1bmtub3duJyxcbiAgICByZWRhY3QgPSBmYWxzZSxcbiAgKTogTmF0aXZlQ2FwdHVyZU9ic2VydmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBub3RlID0gdGhpcy5jYXB0dXJlPy5zbmFwc2hvdCh0bywgY29udHJvbCwgcmVkYWN0KTtcbiAgICByZXR1cm4gbm90ZSAmJiB0aGlzLnJlYWRTb3VyY2VzID8gd2l0aFJlYWRTb3VyY2VzKG5vdGUsIHRoaXMucmVhZFNvdXJjZXMuc25hcHNob3QodG8sIHJlZGFjdCkpIDogbm90ZTtcbiAgfVxuXG4gIHB1YmxpYyBnbG9iYWxTdG9yZTogU2hhcmVkTWVtb3J5O1xuICAvKipcbiAgICogUGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yIG9mIGBnbG9iYWxTdG9yZWAuIFBvcHVsYXRlZCBieSBldmVyeSBjb21taXQgdGhhdFxuICAgKiBzdGFnZWQgYSB3cml0ZSAoYG1lbW9yeS9yZWNvcmRDb21taXQudHMgwrcgcmVjb3JkQ29tbWl0YCksIHdpdGggdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcy5cbiAgICogT25seSBleGlzdHMgd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGEgbWlycm9yIChgUnVuUG9saWN5Lm1pcnJvcmAg4oCUXG4gICAqIGBGbG93Q2hhcnRFeGVjdXRvcmAgc2V0cyBpdCB3aGVuIGEgYFJlZGFjdGlvblBvbGljeWAgaXMgY29uZmlndXJlZCkuXG4gICAqIE90aGVyd2lzZSB1bmRlZmluZWQgYW5kIHplcm8gY29zdC5cbiAgICpcbiAgICogUmVhZCB2aWEgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYC5cbiAgICovXG4gIHB1YmxpYyByZWRhY3RlZFN0b3JlPzogU2hhcmVkTWVtb3J5O1xuICBwdWJsaWMgcm9vdFN0YWdlQ29udGV4dDogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgZXhlY3V0aW9uSGlzdG9yeTogRXZlbnRMb2c7XG4gIC8qKiBUaGUgcnVuJ3Mgc2luaywgd2hlbiB0aGlzIHJ1bnRpbWUncyBsb2cgd3JpdGVzIHRvIG9uZSDigJQgaGFuZGVkIG9uIHRvIGV2ZXJ5IG1vdW50IChgcmVjb3JkRm9yYCkuICovXG4gIHByaXZhdGUgcmVjb3JkU2luaz86IFJlY29yZFNpbms7XG4gIC8qKiBPcmlnaW5hbCByb290IGZvciBnZXRTbmFwc2hvdCgpIOKAlCBzZXQgYmVmb3JlIHJlc3VtZSBjaGFuZ2VzIHJvb3RTdGFnZUNvbnRleHQuICovXG4gIHByaXZhdGUgX3NuYXBzaG90Um9vdD86IFN0YWdlQ29udGV4dDtcbiAgcHJpdmF0ZSBfaW5pdGlhbFN0YXRlOiB1bmtub3duO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWVzOiB1bmtub3duO1xuICAvKiogVGhlIHJ1bidzIHBvbGljeSAoYG1lbW9yeS9ydW5Qb2xpY3kudHNgKSDigJQgaW5zdGFsbGVkIG9uIHRoZSByb290IGZyYW1lO1xuICAgKiAgaXRzIGBjb21taXRWYWx1ZXNgIGFuZCBgd3JpdGVQcm92ZW5hbmNlYCBhcmUgdGhlIHNuYXBzaG90IGRpc2NyaW1pbmFudHMuICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3k7XG5cbiAgLyoqIE1lbW9pemVkIGZyb3plbiBmb2xkIGJhc2Ug4oCUIHNlZSB7QGxpbmsgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZX0uICovXG4gIHByaXZhdGUgX2ZvbGRCYXNlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwb2xpY3kgVGhlIHJ1bidzIHBvbGljeSAoYHJ1blBvbGljeS50c2AsIEY1KSDigJQgdGhlIGZvdXIgZGlhbHMsIHRoZVxuICAgKiAgIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWcuIEluc3RhbGxlZCBvbiB0aGUgcm9vdCBmcmFtZSBoZXJlLCBzb1xuICAgKiAgIHRoZSBGSVJTVCBjb21taXQgKGEgc3ViZmxvdydzIHNlZWQsIGBoaXN0b3J5WzBdYCkgYWxyZWFkeSBydW5zIHVuZGVyIGl0O1xuICAgKiAgIGV2ZXJ5IGZyYW1lIGFmdGVyIGluaGVyaXRzIHRoZSBzYW1lIHJlZmVyZW5jZS4gRGVmYXVsdDogZXZlcnkgZGlhbCBhdFxuICAgKiAgIGl0cyBkZWZhdWx0LCBubyBydWxlLCBubyBtaXJyb3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICByb290TmFtZTogc3RyaW5nLFxuICAgIHJvb3RJZDogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuICAgIGluaXRpYWxTdGF0ZT86IHVua25vd24sXG4gICAgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1ksXG4gICAgcmVjb3JkPzogUnVudGltZVJlY29yZCxcbiAgICBzb3VyY2U/OiB7IHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7IHJlYWRvbmx5IHVuYXZhaWxhYmxlPzogU291cmNlTGltaXRhdGlvbiB9LFxuICApIHtcbiAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgdGhpcy5nbG9iYWxTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoZGVmYXVsdFZhbHVlcywgaW5pdGlhbFN0YXRlKTtcbiAgICAvLyBUaGUgZXZlbnQgbG9nJ3MgZm9sZCBiYXNlIG11c3QgYmUgdGhlIFNBTUUgc3RhdGUgdGhlIHN0b3JlIHN0YXJ0cyBmcm9tXG4gICAgLy8g4oCUIGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGggYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCwgd2hpY2ggaXMgd2hhdFxuICAgIC8vIGBTaGFyZWRNZW1vcnlgIGNvbXB1dGVkIGFib3ZlLiBTZWVkaW5nIHRoZSBsb2cgZnJvbSBgaW5pdGlhbFN0YXRlYCBhbG9uZVxuICAgIC8vIGxlZnQgYGRlZmF1bHRWYWx1ZXNgIG91dCBvZiBldmVyeSByZXBsYXksIHNvIGEgZm9sZCBjb3VsZCBub3QgcmVwcm9kdWNlXG4gICAgLy8gdGhlIHN0YXRlIGEgc3RhZ2UgYWN0dWFsbHkgc2F3LiBgZ2V0U3RhdGUoKWAgaXMgdGhlIGxpdmUgY29udGV4dDsgdGhlXG4gICAgLy8gRXZlbnRMb2cgY29uc3RydWN0b3IgY2xvbmVzIGl0LCBzbyB0aGUgYmFzZSBzdGF5cyBkZXRhY2hlZC5cbiAgICBpZiAocG9saWN5LnJlYWRTb3VyY2VzICYmIHNvdXJjZT8ucnVuSWQgJiYgIXNvdXJjZS51bmF2YWlsYWJsZSAmJiAhcmVjb3JkKSB7XG4gICAgICAvLyBUaGUgcmVjb3JkIG93bnMgb3JpZ2luIHNlbGVjdGlvbiwgZmlyc3QtdG91Y2ggZmFsbGJhY2ssIHN0YWdpbmcgYW5kIGNvbW1pdCBhZG1pc3Npb24uXG4gICAgICAvLyBPcGVuIG9uY2UsIGJlZm9yZSBhbnkgZnJhbWUgZXhpc3RzLiBDb25zdHJ1Y3Rvci9jbG9uZSBlcnJvcnMga2VlcCB0aGVpciBvcmlnaW5hbCBpZGVudGl0eS5cbiAgICAgIGNvbnN0IGJvb2sgPSBjcmVhdGVSZWFkU291cmNlUmVjb3JkKFxuICAgICAgICB0aGlzLmdsb2JhbFN0b3JlLFxuICAgICAgICB7IGxvZ1J1bklkOiBzb3VyY2UucnVuSWQsIGRyaWxsUGF0aDogW10gfSxcbiAgICAgICAgdHlwZW9mIHBvbGljeS5yZWFkU291cmNlcyA9PT0gJ29iamVjdCcgPyBwb2xpY3kucmVhZFNvdXJjZXMgOiB1bmRlZmluZWQsXG4gICAgICApO1xuICAgICAgdGhpcy5leGVjdXRpb25IaXN0b3J5ID0gYm9vay5sb2c7XG4gICAgICB0aGlzLnJlYWRTb3VyY2VzID0gbmV3IEVuZ2luZVJlYWRTb3VyY2VDYXB0dXJlKHNvdXJjZS5ydW5JZCwgYm9vayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhlY3V0aW9uSGlzdG9yeSA9IG9wZW5Mb2codGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpLCByZWNvcmQpO1xuICAgICAgaWYgKHBvbGljeS5yZWFkU291cmNlcyAmJiBzb3VyY2U/LnJ1bklkKVxuICAgICAgICB0aGlzLnJlYWRTb3VyY2VzID0gbmV3IEVuZ2luZVJlYWRTb3VyY2VDYXB0dXJlKFxuICAgICAgICAgIHNvdXJjZS5ydW5JZCxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgc291cmNlLnVuYXZhaWxhYmxlID8/ICdzaW5rLXNvdXJjZS11bnN1cHBvcnRlZCcsXG4gICAgICAgICk7XG4gICAgfVxuICAgIGlmIChyZWNvcmQgJiYgdGhpcy5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3MgIT09IHVuZGVmaW5lZCkgdGhpcy5yZWNvcmRTaW5rID0gcmVjb3JkLnNpbms7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0ID0gdGhpcy5uZXdSb290KHJvb3ROYW1lLCByb290SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZnJlc2ggcm9vdCBmcmFtZSBmb3IgdGhpcyBydW50aW1lIOKAlCBgZ2xvYmFsU3RvcmVgLCBgZXhlY3V0aW9uSGlzdG9yeWAsXG4gICAqIHRoZSBydW4ncyBwb2xpY3kgYW5kICh3aGVuIGtlcHQpIHRoZSBtaXJyb3IuIEFsc28gaG93IGBTdWJmbG93RXhlY3V0b3JgXG4gICAqIHJlcGxhY2VzIGEgc3ViZmxvdydzIHNlZWQgZnJhbWUgd2l0aCB0aGUgZnJhbWUgaXRzIGZpcnN0IHN0YWdlIHJ1bnMgb24uXG4gICAqL1xuICBuZXdSb290KG5hbWU6IHN0cmluZywgaWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgY29uc3Qgcm9vdCA9IG5ldyBTdGFnZUNvbnRleHQoJycsIG5hbWUsIGlkLCB0aGlzLmdsb2JhbFN0b3JlLCAnJywgdGhpcy5leGVjdXRpb25IaXN0b3J5KTtcbiAgICB0aGlzLmluc3RhbGxQb2xpY3kocm9vdCk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgcG9saWN5IG9uIHRoZSBDVVJSRU5UIHJvb3QgZnJhbWUg4oCUIGEgc2FtZS1leGVjdXRvclxuICAgKiByZXN1bWUsIHdob3NlIGNvbnRpbnVhdGlvbiByb290IChgbGVhZi5jcmVhdGVOZXh0YCkgaXMgYWR2YW5jZWQgYmVmb3JlXG4gICAqIHRoZSBleGVjdXRvciBidWlsZHMgdGhpcyBsZWcncyBwb2xpY3kgKGEgZnJlc2ggcnVsZSBwZXIgbGVnKS4gRXZlcnlcbiAgICogZGVzY2VuZGFudCB0YWtlcyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlcmUuXG4gICAqL1xuICB1c2VQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLmluc3RhbGxQb2xpY3kodGhpcy5yb290U3RhZ2VDb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcG9saWN5IG9uIGByb290YCwgYW5kIHRoZSBtaXJyb3Igc3RvcmUgd2hlbiB0aGUgcG9saWN5IGtlZXBzIG9uZS5cbiAgICogVGhlIG1pcnJvciBpcyBhIFNFUlZFRCBzdXJmYWNlLCBzbyBpdHMgc2VlZCBtdXN0IGFscmVhZHkgYmUgdGhlIHBvbGljeSdzXG4gICAqIHZpZXcgb2YgdGhlIHN0YXJ0aW5nIHN0YXRlOiBhIHBvbGljeSBrZXkgdGhhdCBhcnJpdmVzIGJ5IGBpbml0aWFsQ29udGV4dGBcbiAgICogLyBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgIChvciwgb24gYSBjcm9zcy1leGVjdXRvciByZXN1bWUsIGJ5IHRoZVxuICAgKiBjaGVja3BvaW50J3MgYHNoYXJlZFN0YXRlYCkgYW5kIGlzIG5ldmVyIHJlLXdyaXR0ZW4gd291bGQgb3RoZXJ3aXNlIHNpdFxuICAgKiBpbiBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIGluIHBsYWludGV4dCDigJQgc28gdGhlIHNlZWQgaXMgc2NydWJiZWRcbiAgICogd2l0aCB0aGUgTE9HJ3MgcGxhY2Vob2xkZXIsIHRoZSBzYW1lIHN0cmluZyB0aGUgcmVkYWN0ZWQgcGF0Y2hlcyBjYXJyeS5cbiAgICogQ3JlYXRlZCBvbmNlIHBlciBydW50aW1lIChhIHN1YmZsb3cncyBydW50aW1lIGtlZXBzIGl0cyBvd247IGl0cyBzZWVkIGlzXG4gICAqIGVtcHR5IOKAlCB0aGUgaW5wdXQgYXJyaXZlcyBhcyBhIGNvbW1pdCkuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxQb2xpY3kocm9vdDogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgcm9vdC51c2VQb2xpY3kodGhpcy5wb2xpY3kpO1xuICAgIHJvb3QucmVhZFNvdXJjZXMgPSB0aGlzLnJlYWRTb3VyY2VzO1xuICAgIGlmICghdGhpcy5wb2xpY3kubWlycm9yKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnJlZGFjdGVkU3RvcmUpIHtcbiAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gICAgICB0aGlzLnJlZGFjdGVkU3RvcmUgPSBuZXcgU2hhcmVkTWVtb3J5KFxuICAgICAgICBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZSh0aGlzLl9kZWZhdWx0VmFsdWVzLCBMT0dfUExBQ0VIT0xERVIpIDogdGhpcy5fZGVmYXVsdFZhbHVlcyxcbiAgICAgICAgcnVsZSA/IHJ1bGUucmV0YWluU3RhdGUodGhpcy5faW5pdGlhbFN0YXRlLCBMT0dfUExBQ0VIT0xERVIpIDogdGhpcy5faW5pdGlhbFN0YXRlLFxuICAgICAgKTtcbiAgICB9XG4gICAgcm9vdC51c2VSZWRhY3RlZE1pcnJvcih0aGlzLnJlZGFjdGVkU3RvcmUpO1xuICB9XG5cbiAgLyoqIFByZXNlcnZlIHRoZSBjdXJyZW50IHJvb3RTdGFnZUNvbnRleHQgZm9yIHNuYXBzaG90cyBiZWZvcmUgY2hhbmdpbmcgaXQgZm9yIHJlc3VtZS4gKi9cbiAgcHJlc2VydmVTbmFwc2hvdFJvb3QoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zbmFwc2hvdFJvb3QpIHtcbiAgICAgIHRoaXMuX3NuYXBzaG90Um9vdCA9IHRoaXMucm9vdFN0YWdlQ29udGV4dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZyb3plbiwgZGV0YWNoZWQgZm9sZCBiYXNlIHNlcnZlZCBhcyB7QGxpbmsgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZX0uXG4gICAqIENvbXB1dGVkIG9uY2UgKHRoZSBiYXNlIG5ldmVyIGNoYW5nZXMgYWZ0ZXIgY29uc3RydWN0aW9uKSBhbmQgc2hhcmVkIOKAlFxuICAgKiBzYWZlIGJlY2F1c2UgaXQgaXMgZGVlcGx5IGZyb3plbiwgc28gbm8gaG9sZGVyIGNhbiBtdXRhdGUgaXQgb3IgcmVhY2ggdGhlXG4gICAqIGVuZ2luZSB0aHJvdWdoIGl0OyBhIGJhc2UgaG9sZGluZyBhIERhdGUsIE1hcCwgYnVmZmVyIOKApiAod2hhdCBmcmVlemluZ1xuICAgKiBjYW5ub3Qgc2VhbCkgaXMgc2VydmVkIGJ5IHRoZSBwdWJsaWMgc25hcHNob3QgYXMgYSBjb3B5IG9mIGl0cyBvcGVuIHBhdGhzXG4gICAqIChgcnVubmVyL3NuYXBzaG90LnRzIMK3IHNlcnZlZFNuYXBzaG90YCwgYGNhcHR1cmUvZnJlZXplLnRzIMK3IHNlcnZlUmVjb3JkYCxcbiAgICogOS40NC4yKS5cbiAgICovXG4gIHByaXZhdGUgZ2V0Rm9sZEJhc2UoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5fZm9sZEJhc2UpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICB0aGlzLl9mb2xkQmFzZSA9IGZyZWV6ZVJlY29yZChiYXNlICYmIHR5cGVvZiBiYXNlID09PSAnb2JqZWN0JyA/IGJhc2UgOiB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb2xkQmFzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVyZSBhIG1vdW50J3MgbG9nIHdyaXRlcyAoMTAuMSwgUDYpOiB0aGUgc2FtZSBzaW5rLCBhdCB0aGlzIGxvZydzIGFkZHJlc3MgcGx1cyB0aGUgbW91bnQncyBgcnVudGltZVN0YWdlSWRgXG4gICAqIChgZHJpbGxQYXRoOiBbLi4ucGFyZW50LCBtb3VudF1gLCB0aGUgYWRkcmVzcyBsYXcgYFJ1bnRpbWVTbmFwc2hvdC5sb2dBZGRyZXNzYCBzdGF0ZXMpLiBBYnNlbnQgd2hlbiB0aGlzIGxvZ1xuICAgKiB3cml0ZXMgdG8gbm8gc2luayDigJQgYSBtb3VudCBvZiBhIHBsYWluIGxvZyBpcyBwbGFpbiB0b28uXG4gICAqL1xuICByZWNvcmRGb3IobW91bnRSdW50aW1lU3RhZ2VJZDogc3RyaW5nLCBtZXRhPzogTWV0YSk6IFJ1bnRpbWVSZWNvcmQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcztcbiAgICBpZiAodGhpcy5yZWNvcmRTaW5rID09PSB1bmRlZmluZWQgfHwgYWRkcmVzcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBzaW5rOiB0aGlzLnJlY29yZFNpbmssXG4gICAgICBhZGRyZXNzOiB7IGxvZ1J1bklkOiBhZGRyZXNzLmxvZ1J1bklkLCBkcmlsbFBhdGg6IFsuLi5hZGRyZXNzLmRyaWxsUGF0aCwgbW91bnRSdW50aW1lU3RhZ2VJZF0gfSxcbiAgICAgIC4uLihtZXRhID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbWV0YSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRlbGwgdGhlIHNpbmsgdGhpcyBydW50aW1lJ3MgbG9nIGVuZGVkLiBOb3RoaW5nIGhhcHBlbnMgd2l0aG91dCBhIHNpbms7IG5ldmVyIHRocm93cy4gKi9cbiAgY2xvc2VSZWNvcmQob3V0Y29tZTogTG9nT3V0Y29tZSwgbWV0YT86IE1ldGEpOiB2b2lkIHtcbiAgICB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuY2xvc2Uob3V0Y29tZSwgbWV0YSk7XG4gIH1cblxuICAvKiogTm90ZSBzb21ldGhpbmcgYmVzaWRlIHRoaXMgcnVudGltZSdzIGxvZywgaW4gaXRzIHNpbmsgKGEgcmVzdW1lZCBsZWcpLiBOb3RoaW5nIHdpdGhvdXQgYSBzaW5rOyBuZXZlciB0aHJvd3MuICovXG4gIG5vdGVSZWNvcmQoa2luZDogc3RyaW5nLCBkYXRhOiBNZXRhKTogdm9pZCB7XG4gICAgdGhpcy5leGVjdXRpb25IaXN0b3J5Lm5vdGUoa2luZCwgZGF0YSk7XG4gIH1cblxuICBnZXRQaXBlbGluZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBzdGF0ZS5waXBlbGluZXMgPyBPYmplY3Qua2V5cyhzdGF0ZS5waXBlbGluZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDogW107XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQuc2V0T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcnVudGltZSBzbmFwc2hvdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMucmVkYWN0ICBXaGVuIGB0cnVlYCwgcmV0dXJucyBgc2hhcmVkU3RhdGVgIGZyb20gdGhlXG4gICAqICAgcGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yIChpZiBvbmUgd2FzIGVuYWJsZWQpLiBUaGlzIGlzIHRoZSBzYWZlIHZpZXdcbiAgICogICBmb3Igc2hhcmluZyB0cmFjZXMgZXh0ZXJuYWxseSDigJQgcGFzdGUgaW50byBhIHZpZXdlciwgc2hpcCB0byBzdXBwb3J0LFxuICAgKiAgIGV0Yy4gV2hlbiB0aGUgbWlycm9yIHdhcyBuZXZlciBlbmFibGVkLCBmYWxscyBiYWNrIHRvIHJhdyBgZ2xvYmFsU3RvcmVgXG4gICAqICAgYW5kIGEgZGV2LW1vZGUgd2FybmluZyBpcyBlbWl0dGVkIChzaWxlbnQgaW4gcHJvZHVjdGlvbikuXG4gICAqXG4gICAqICAgRGVmYXVsdCBgZmFsc2VgIHByZXNlcnZlcyB0aGUgcnVudGltZSB2aWV3IOKAlCBuZWNlc3NhcnkgZm9yIHBhdXNlIC9cbiAgICogICByZXN1bWUgKHJlc3VtcHRpb24gbXVzdCByZXBsYXkgYWdhaW5zdCB0aGUgcmVhbCB2YWx1ZXMsIG5vdFxuICAgKiAgICdbUkVEQUNURURdJykuXG4gICAqXG4gICAqIE90aGVyIGZpZWxkcyAoYGV4ZWN1dGlvblRyZWVgLCBgY29tbWl0TG9nYCkgYXJlIHRoZSBzYW1lIGVpdGhlciB3YXkg4oCUXG4gICAqIHRoZSBjb21taXQgbG9nIGlzIGFscmVhZHkgcmVkYWN0ZWQgYXQgd3JpdGUtdGltZSwgYW5kIHRoZSBleGVjdXRpb25cbiAgICogdHJlZSBvbmx5IGNhcnJpZXMgc3RydWN0dXJhbCBtZXRhZGF0YS5cbiAgICpcbiAgICogYGluaXRpYWxTdGF0ZWAgKHRoZSBmb2xkIGJhc2UpIGlzIE9NSVRURUQgdW5kZXIgYHJlZGFjdDogdHJ1ZWAuIEl0IGlzIHRoZVxuICAgKiBydW4ncyByYXcgcHJlLXJ1biBzZWVkIOKAlCBgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoXG4gICAqIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAg4oCUIGFuZCBpdCBuZXZlciBwYXNzZWQgdGhyb3VnaCBhIHJlZGFjdGlvblxuICAgKiBwb2xpY3k6IHRoZSBwb2xpY3kgc2NydWJzIFdSSVRFUyBhdCB0aGUgc2NvcGUgZmFjYWRlLCBhbmQgdGhlIGJhc2Ugd2FzXG4gICAqIG5ldmVyIHdyaXR0ZW4gYnkgYSBzdGFnZS4gU2VydmluZyBpdCBvbiB0aGUgcmVkYWN0ZWQgc3VyZmFjZSB3b3VsZCBoYW5kXG4gICAqIGJhY2sgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIGEgc2VlZGVkIHNlY3JldCB0aGF0IGEgbGF0ZXIgY29tbWl0IGhhZFxuICAgKiBzY3J1YmJlZC4gQSBjb25zdW1lciBmb2xkaW5nIHdpdGhvdXQgaXQgZ2V0cyBgYmFzaXM6ICdsb2ctb25seSdgIGZyb21cbiAgICogYHN0YXRlQXRgLCB3aGljaCBpcyB0aGUgaG9uZXN0IHNpZ25hbCB0aGF0IHRoZSBiYXNlIGRpZCBub3QgdHJhdmVsIHdpdGhcbiAgICogdGhpcyBsb2cg4oCUIGEgcGFydGlhbCBhbnN3ZXIgdGhhdCBzYXlzIGl0IGlzIHBhcnRpYWwsIG5ldmVyIGEgc2lsZW50IG9uZS5cbiAgICpcbiAgICogUmV0dXJucyBgT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCcgfCAnY29ycmVsYXRpb24nPmA6IHRoZSBydW50aW1lIGlzIHRoZSBtZW1vcnlcbiAgICogY29udGFpbmVyIGFuZCBkb2Vzbid0IGtub3cgd2hpY2ggcnVuIGl0IHNlcnZlcyDigJQgYHJ1bklkYCBpcyBwZXItcnVuXG4gICAqIGV4ZWN1dG9yIHN0YXRlLCBzdGFtcGVkIGJ5IGBGbG93Y2hhcnRUcmF2ZXJzZXIuZ2V0U25hcHNob3QoKWAgKHdoaWNoXG4gICAqIG93bnMgdGhlIHJ1bidzIGlkIGFuZCBhbHJlYWR5IHN0YW1wcyBpdCBvbiBldmVyeSBldmVudCkuIFN1YmZsb3dzJ1xuICAgKiBuZXN0ZWQgcnVudGltZXMgZGVsaWJlcmF0ZWx5IGhhdmUgTk8gcnVuSWQgb2YgdGhlaXIgb3duIChhIHN1YmZsb3cgaXNcbiAgICogcGFydCBvZiB0aGUgcGFyZW50J3MgbG9naWNhbCBydW4pLiBgY29ycmVsYXRpb25gIGlzIHRoZSB0cmF2ZXJzZXIncyBmb3JcbiAgICogdGhlIHNhbWUgcmVhc29uLlxuICAgKi9cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KTogT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCcgfCAnY29ycmVsYXRpb24nPiB7XG4gICAgY29uc3Qgc25hcHNob3RSb290ID0gdGhpcy5fc25hcHNob3RSb290ID8/IHRoaXMucm9vdFN0YWdlQ29udGV4dDtcbiAgICBjb25zdCB1c2VSZWRhY3RlZCA9IG9wdGlvbnM/LnJlZGFjdCA9PT0gdHJ1ZSAmJiB0aGlzLnJlZGFjdGVkU3RvcmUgIT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgc2hhcmVkU3RhdGU6IHVzZVJlZGFjdGVkID8gdGhpcy5yZWRhY3RlZFN0b3JlIS5nZXRTdGF0ZSgpIDogdGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpLFxuICAgICAgZXhlY3V0aW9uVHJlZTogc25hcHNob3RSb290LmdldFNuYXBzaG90KCksXG4gICAgICAvLyBSRURBQ1RJT046IHRoZSBmb2xkIGJhc2UgaXMgdGhlIHJhdyBwcmUtcnVuIHNlZWQgYW5kIG5vIHBvbGljeSBldmVyXG4gICAgICAvLyB0b3VjaGVkIGl0IChwb2xpY2llcyBzY3J1YiB3cml0ZXM7IG5vdGhpbmcgd3JvdGUgdGhlIGJhc2UpLiBPbWl0IGl0XG4gICAgICAvLyByYXRoZXIgdGhhbiBsZWFrIGl0IOKAlCBgc3RhdGVBdGAgZGVncmFkZXMgdG8gYGJhc2lzOiAnbG9nLW9ubHknYC5cbiAgICAgIC4uLih1c2VSZWRhY3RlZCA/IHt9IDogeyBpbml0aWFsU3RhdGU6IHRoaXMuZ2V0Rm9sZEJhc2UoKSB9KSxcbiAgICAgIC8vIERFVEFDSEVEOiB0aGUgZW5naW5lIGtlZXBzIGl0cyBsaXZlIEV2ZW50TG9nOyB0aGUgc25hcHNob3QgZ2V0cyBhXG4gICAgICAvLyBmcm96ZW4gYXJyYXkgb2YgaXRzIG93biAoYHJlY29yZGVkKClgIGJ1aWxkcyBhIG5ldyBvbmUpLiBTZXJ2aW5nIHRoZVxuICAgICAgLy8gaW50ZXJuYWwgYXJyYXkgYWxpYXNlZCBpdCwgc28gYSBzbmFwc2hvdCB0YWtlbiBtaWQtcnVuIGtlcHQgZ3Jvd2luZ1xuICAgICAgLy8gdW5kZXIgaXRzIGhvbGRlciBhbmQgYSBjb25zdW1lciBjb3VsZCBzcGxpY2UgdGhlIGVuZ2luZSdzIG93biBoaXN0b3J5LlxuICAgICAgLy8gVGhlIGJ1bmRsZXMgaW4gaXQgYXJlIHRoZSBsb2cncyBvd24sIGZyb3plbiBhdCBgRXZlbnRMb2cgwrcgcmVjb3JkYFxuICAgICAgLy8gKEYzKS4gVGhlIHB1YmxpYyBzbmFwc2hvdCBzZXJ2ZXMgdGhlbSAoYHJ1bm5lci9zbmFwc2hvdC50cyDCt1xuICAgICAgLy8gc2VydmVkU25hcHNob3RgLCA5LjQ0LjIpOyB0aGlzIG9uZSBpcyBhbHNvIHRoZSBlbmdpbmUncyBvd24g4oCUIGFcbiAgICAgIC8vIHN1YmZsb3cgbW91bnQgdGFrZXMgaXQgb25jZSBwZXIgbW91bnQg4oCUIHNvIHRoZSBydW4gcGF0aCBzZXJ2ZXMgbm90aGluZy5cbiAgICAgIGNvbW1pdExvZzogT2JqZWN0LmZyZWV6ZSh0aGlzLmV4ZWN1dGlvbkhpc3RvcnkucmVjb3JkZWQoKSkgYXMgQ29tbWl0QnVuZGxlW10sXG4gICAgICAuLi4odGhpcy5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3MgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBsb2dBZGRyZXNzOiB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyB9KSxcbiAgICAgIGNvbW1pdFZhbHVlczogdGhpcy5wb2xpY3kuY29tbWl0VmFsdWVzLFxuICAgICAgd3JpdGVQcm92ZW5hbmNlOiB0aGlzLnBvbGljeS53cml0ZVByb3ZlbmFuY2UsXG4gICAgICAuLi4odGhpcy5yZWFkU291cmNlcyAmJiB7XG4gICAgICAgIHJlYWRTb3VyY2VzOiB0aGlzLnJlYWRTb3VyY2VzLnNuYXBzaG90KHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5sZW5ndGgsIG9wdGlvbnM/LnJlZGFjdCA9PT0gdHJ1ZSksXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVGhlIHJ1bnRpbWUncyBsb2c6IHdpdGggYSByZWNvcmQsIHRoZSBsb2cgdGhhdCB3cml0ZXMgdG8gdGhlIHNpbmsgYXMgaXQgbGFuZHMuIEEgYmFzZSB0aGUgc2luayBjYW5ub3QgY2FycnkgKGl0XG4gKiBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0KSBpcyB0aGUgc2luaydzIGxvc3MsIG5ldmVyIHRoZSBydW4ncyDigJQgdGhlIGxvZyBpcyB0aGVuIHRoZSBwbGFpbiBvbmUsIGFuZCB0aGUgbG9zcyBpc1xuICogcmVwb3J0ZWQgdG8gdGhlIHNpbmsgbGlrZSBhbnkgb3RoZXIgKGBSZWNvcmRTaW5rLm9uRmFpbHVyZWApLCBzbyB0aGUgcnVuJ3MgYWNjb3VudGluZyBuYW1lcyBpdC5cbiAqL1xuZnVuY3Rpb24gb3BlbkxvZyhiYXNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmVjb3JkOiBSdW50aW1lUmVjb3JkIHwgdW5kZWZpbmVkKTogRXZlbnRMb2cge1xuICBpZiAocmVjb3JkID09PSB1bmRlZmluZWQpIHJldHVybiBuZXcgRXZlbnRMb2coYmFzZSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFdmVudExvZyhiYXNlLCByZWNvcmQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQuc2luay5vbkZhaWx1cmU/Lih7XG4gICAgICAgIGVudHJ5OiB7IGtpbmQ6ICdvcGVuZWQnLCBhZGRyZXNzOiByZWNvcmQuYWRkcmVzcywgYXQ6IERhdGUubm93KCksIGluaXRpYWxTdGF0ZToge30gfSxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBydW4ncyBvd24gc2luayBpc29sYXRlcyBpdHMgbGlzdGVuZXI7IGFuIGFwcCdzIHJhdyBhZGFwdGVyIGhlcmUgaXMgdG9sZCBvbmNlLCBiZXN0IGVmZm9ydC5cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFdmVudExvZyhiYXNlKTtcbiAgfVxufVxuIl19
@@ -65,6 +65,8 @@ export declare class FlowChartExecutor<TOut = any, TScope = any> {
65
65
  * See docs/guides/execution-model.md.
66
66
  */
67
67
  private _isExecuting;
68
+ private captureSignal?;
69
+ private captureHistoryLease?;
68
70
  private failureState;
69
71
  /** Safe native context for the latest rejected leg; undefined before, during, after success or pause. */
70
72
  getFailureContext(): TerminalFailureContext | undefined;
@@ -188,6 +190,9 @@ export declare class FlowChartExecutor<TOut = any, TScope = any> {
188
190
  * the `RecordSinkError`.
189
191
  */
190
192
  private settleRecorded;
193
+ private settleRecordedLeg;
194
+ private saveCaptureHistory;
195
+ private finishCapture;
191
196
  /**
192
197
  * What a new root log opens with: names and numbers the run already serves — the run, the chart, the correlation,
193
198
  * the deadline, the declared budget, and the run a fresh-executor resume continues. Served by the record.