footprintjs 9.36.0 → 9.37.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 (114) hide show
  1. package/CLAUDE.md +3 -3
  2. package/dist/advanced.js +2 -2
  3. package/dist/esm/advanced.d.ts +2 -2
  4. package/dist/esm/advanced.js +2 -2
  5. package/dist/esm/index.d.ts +2 -2
  6. package/dist/esm/index.js +1 -1
  7. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +5 -34
  8. package/dist/esm/lib/builder/FlowChartBuilder.js +236 -375
  9. package/dist/esm/lib/engine/graph/prefixNodeTree.d.ts +26 -0
  10. package/dist/esm/lib/engine/graph/prefixNodeTree.js +40 -0
  11. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
  12. package/dist/esm/lib/engine/handlers/ParallelForEachHandler.js +3 -3
  13. package/dist/esm/lib/engine/handlers/ResumeEntry.js +11 -2
  14. package/dist/esm/lib/engine/handlers/StageRunner.js +17 -3
  15. package/dist/esm/lib/engine/index.d.ts +1 -1
  16. package/dist/esm/lib/engine/index.js +1 -1
  17. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  18. package/dist/esm/lib/engine/narrative/types.d.ts +25 -1
  19. package/dist/esm/lib/engine/narrative/types.js +1 -1
  20. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
  21. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +68 -86
  22. package/dist/esm/lib/engine/traversalContext.d.ts +65 -0
  23. package/dist/esm/lib/engine/traversalContext.js +83 -0
  24. package/dist/esm/lib/engine/walkSubflowSpec.js +3 -2
  25. package/dist/esm/lib/ids/branchSegment.js +119 -0
  26. package/dist/esm/lib/ids/runtimeStageId.d.ts +191 -0
  27. package/dist/esm/lib/ids/runtimeStageId.js +225 -0
  28. package/dist/esm/lib/memory/commitLogUtils.js +1 -1
  29. package/dist/esm/lib/memory/logModel.js +1 -1
  30. package/dist/esm/lib/memory/verbs.d.ts +2 -1
  31. package/dist/esm/lib/memory/verbs.js +1 -1
  32. package/dist/esm/lib/pause/index.d.ts +1 -1
  33. package/dist/esm/lib/pause/index.js +1 -1
  34. package/dist/esm/lib/pause/types.d.ts +48 -1
  35. package/dist/esm/lib/pause/types.js +52 -3
  36. package/dist/esm/lib/recorder/InOutRecorder.js +3 -2
  37. package/dist/esm/lib/recorder/hooks.d.ts +1 -1
  38. package/dist/esm/lib/recorder/hooks.js +1 -1
  39. package/dist/esm/lib/runner/DeferredObserverTier.js +3 -3
  40. package/dist/esm/lib/runner/FlowChartExecutor.js +33 -9
  41. package/dist/esm/lib/runner/getSubtreeSnapshot.js +6 -5
  42. package/dist/esm/lib/scope/ScopeFacade.d.ts +1 -1
  43. package/dist/esm/lib/scope/ScopeFacade.js +7 -10
  44. package/dist/esm/lib/scope/types.d.ts +2 -0
  45. package/dist/esm/lib/scope/types.js +1 -1
  46. package/dist/esm/lib/time-travel/chain.js +2 -2
  47. package/dist/esm/lib/time-travel/commitStops.js +4 -4
  48. package/dist/esm/lib/time-travel/index.d.ts +1 -1
  49. package/dist/esm/lib/time-travel/index.js +2 -2
  50. package/dist/esm/lib/time-travel/timeTravel.js +8 -9
  51. package/dist/esm/lib/time-travel/types.d.ts +1 -1
  52. package/dist/esm/lib/time-travel/types.js +2 -2
  53. package/dist/esm/trace.d.ts +3 -3
  54. package/dist/esm/trace.js +3 -3
  55. package/dist/index.js +1 -1
  56. package/dist/lib/builder/FlowChartBuilder.js +236 -375
  57. package/dist/lib/engine/graph/prefixNodeTree.js +44 -0
  58. package/dist/lib/engine/handlers/ParallelForEachHandler.js +3 -3
  59. package/dist/lib/engine/handlers/ResumeEntry.js +10 -1
  60. package/dist/lib/engine/handlers/StageRunner.js +17 -3
  61. package/dist/lib/engine/index.js +1 -1
  62. package/dist/lib/engine/narrative/types.js +1 -1
  63. package/dist/lib/engine/traversal/FlowchartTraverser.js +68 -86
  64. package/dist/lib/engine/traversalContext.js +89 -0
  65. package/dist/lib/engine/walkSubflowSpec.js +3 -2
  66. package/dist/lib/ids/branchSegment.js +127 -0
  67. package/dist/lib/ids/runtimeStageId.js +242 -0
  68. package/dist/lib/memory/commitLogUtils.js +1 -1
  69. package/dist/lib/memory/logModel.js +1 -1
  70. package/dist/lib/memory/verbs.js +1 -1
  71. package/dist/lib/pause/index.js +1 -1
  72. package/dist/lib/pause/types.js +54 -4
  73. package/dist/lib/recorder/InOutRecorder.js +3 -2
  74. package/dist/lib/recorder/hooks.js +1 -1
  75. package/dist/lib/runner/DeferredObserverTier.js +3 -3
  76. package/dist/lib/runner/FlowChartExecutor.js +32 -8
  77. package/dist/lib/runner/getSubtreeSnapshot.js +6 -5
  78. package/dist/lib/scope/ScopeFacade.js +7 -10
  79. package/dist/lib/scope/types.js +1 -1
  80. package/dist/lib/time-travel/chain.js +2 -2
  81. package/dist/lib/time-travel/commitStops.js +4 -4
  82. package/dist/lib/time-travel/index.js +2 -2
  83. package/dist/lib/time-travel/timeTravel.js +8 -9
  84. package/dist/lib/time-travel/types.js +2 -2
  85. package/dist/trace.js +3 -3
  86. package/dist/types/advanced.d.ts +2 -2
  87. package/dist/types/index.d.ts +2 -2
  88. package/dist/types/lib/builder/FlowChartBuilder.d.ts +5 -34
  89. package/dist/types/lib/engine/graph/prefixNodeTree.d.ts +26 -0
  90. package/dist/types/lib/engine/handlers/ParallelForEachHandler.d.ts +1 -1
  91. package/dist/types/lib/engine/index.d.ts +1 -1
  92. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  93. package/dist/types/lib/engine/narrative/types.d.ts +25 -1
  94. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +13 -31
  95. package/dist/types/lib/engine/traversalContext.d.ts +65 -0
  96. package/dist/types/lib/ids/runtimeStageId.d.ts +191 -0
  97. package/dist/types/lib/memory/verbs.d.ts +2 -1
  98. package/dist/types/lib/pause/index.d.ts +1 -1
  99. package/dist/types/lib/pause/types.d.ts +48 -1
  100. package/dist/types/lib/recorder/hooks.d.ts +1 -1
  101. package/dist/types/lib/scope/ScopeFacade.d.ts +1 -1
  102. package/dist/types/lib/scope/types.d.ts +2 -0
  103. package/dist/types/lib/time-travel/index.d.ts +1 -1
  104. package/dist/types/lib/time-travel/types.d.ts +1 -1
  105. package/dist/types/trace.d.ts +3 -3
  106. package/package.json +1 -1
  107. package/dist/esm/lib/engine/branchSegment.js +0 -119
  108. package/dist/esm/lib/engine/runtimeStageId.d.ts +0 -103
  109. package/dist/esm/lib/engine/runtimeStageId.js +0 -119
  110. package/dist/lib/engine/branchSegment.js +0 -127
  111. package/dist/lib/engine/runtimeStageId.js +0 -126
  112. package/dist/types/lib/engine/runtimeStageId.d.ts +0 -103
  113. /package/dist/esm/lib/{engine → ids}/branchSegment.d.ts +0 -0
  114. /package/dist/types/lib/{engine → ids}/branchSegment.d.ts +0 -0
@@ -0,0 +1,225 @@
1
+ /**
2
+ * runtimeStageId — unique identifier for each execution step during traversal.
3
+ *
4
+ * Format: [subflowPath/]stageId#executionIndex
5
+ *
6
+ * Components:
7
+ * stageId — stable node ID from the builder ('call-llm', 'seed')
8
+ * executionIndex — monotonic counter incremented per stage execution (0, 1, 2...)
9
+ * subflowPath — optional path for subflow stages ('sf-tools', 'sf-outer/sf-inner')
10
+ *
11
+ * Properties:
12
+ * - Unique within a run (executionIndex never repeats)
13
+ * - Execution-ordered (sort by executionIndex = execution order)
14
+ * - Human-readable ('sf-tools/execute-tool-calls#8')
15
+ * - Parseable (split on '#' for stageId and index, split stageId on '/' for subflow path)
16
+ *
17
+ * Naming-collision warning
18
+ * ────────────────────────
19
+ * The parsed-output `.stageId` field below is the LOCAL form (segment
20
+ * after the last '/'). This is NOT the same as `spec.id` / `node.id`
21
+ * for subflow-nested stages, which carry the FULL prefixed form
22
+ * (`'sf-tools/execute-tool-calls'`). To compare safely, use
23
+ * `splitStageId(spec.id)` to decompose the prefixed form the same
24
+ * way `parseRuntimeStageId` decomposes a runtimeStageId.
25
+ *
26
+ * @example
27
+ * ```
28
+ * buildRuntimeStageId('call-llm', 5) // 'call-llm#5'
29
+ * buildRuntimeStageId('execute-tool-calls', 8, 'sf-tools') // 'sf-tools/execute-tool-calls#8'
30
+ * buildRuntimeStageId('validate', 3, 'sf-outer/sf-inner') // 'sf-outer/sf-inner/validate#3'
31
+ * ```
32
+ *
33
+ * ## The one owner (F7, 9.37.0)
34
+ *
35
+ * This module is the ONE place the grammar is spelled. Every reader asks it —
36
+ * `isExecutionKey`, `stageIdOf`, `subflowPathOf`, `subflowSegmentsOf`,
37
+ * `lastSegmentOf`, `isWithinSubflow` — and every composer joins through
38
+ * `joinPath` / `buildRuntimeStageId`; no other file splits on `#` or `/`.
39
+ * The delimiters are RESERVED (RFC 3986 §2.2 style): `refuseReservedId` is
40
+ * the builder's one refusal for user-authored ids, so last-delimiter parsing
41
+ * is sound by construction rather than by hope. Stores and the prefixer never
42
+ * refuse — they hold runtime ids and prefixed ids, which carry the delimiters
43
+ * on purpose.
44
+ */
45
+ import { branchSegmentReservationMessage, hasBranchSegmentMarker } from './branchSegment.js';
46
+ /** Separates subflow path segments from each other and from the stage id. */
47
+ const PATH_DELIMITER = '/';
48
+ /** Separates the (prefixed) stage id from the execution index. */
49
+ const EXECUTION_DELIMITER = '#';
50
+ /**
51
+ * Build a runtimeStageId from its components.
52
+ *
53
+ * Note: The traverser does NOT use the subflowPath parameter — node.id already
54
+ * includes the subflow prefix from the builder. This parameter exists for external
55
+ * consumers constructing IDs from parsed components (round-trip via parseRuntimeStageId).
56
+ */
57
+ export function buildRuntimeStageId(stageId, executionIndex, subflowPath) {
58
+ const prefix = subflowPath ? `${subflowPath}${PATH_DELIMITER}` : '';
59
+ return `${prefix}${stageId}${EXECUTION_DELIMITER}${executionIndex}`;
60
+ }
61
+ /**
62
+ * Parse a runtimeStageId into its components.
63
+ *
64
+ * IMPORTANT — naming collision: the returned `stageId` is the LOCAL
65
+ * form (the segment between the last '/' and the '#'). This is NOT
66
+ * the same as `spec.id` or `node.id` for subflow-nested stages,
67
+ * which contain the FULL prefixed form.
68
+ *
69
+ * parseRuntimeStageId('sf-tools/execute-tool-calls#8').stageId
70
+ * // → 'execute-tool-calls' (LOCAL)
71
+ *
72
+ * node.id // (post-mount, in a spec that contains subflows)
73
+ * // → 'sf-tools/execute-tool-calls' (FULL prefixed)
74
+ *
75
+ * To compare these two safely, use `splitStageId(node.id)` to get
76
+ * the local form, OR reconstruct the full form via
77
+ * `(subflowPath ? subflowPath + '/' : '') + stageId`.
78
+ */
79
+ export function parseRuntimeStageId(runtimeStageId) {
80
+ const hashIdx = runtimeStageId.lastIndexOf(EXECUTION_DELIMITER);
81
+ if (hashIdx === -1) {
82
+ return { stageId: runtimeStageId, executionIndex: 0, subflowPath: undefined };
83
+ }
84
+ const beforeHash = runtimeStageId.slice(0, hashIdx);
85
+ const executionIndex = parseInt(runtimeStageId.slice(hashIdx + 1), 10);
86
+ const lastSlash = beforeHash.lastIndexOf(PATH_DELIMITER);
87
+ if (lastSlash === -1) {
88
+ return { stageId: beforeHash, executionIndex, subflowPath: undefined };
89
+ }
90
+ return {
91
+ stageId: beforeHash.slice(lastSlash + 1),
92
+ executionIndex,
93
+ subflowPath: beforeHash.slice(0, lastSlash),
94
+ };
95
+ }
96
+ /**
97
+ * Decompose a (possibly prefixed) stage id into its components.
98
+ *
99
+ * Use this when you have an id WITHOUT the `#N` execution suffix and
100
+ * need the local stage name and/or the subflow path. Common sources
101
+ * of such ids:
102
+ * - `spec.id` (post-mount the id includes any subflow prefix)
103
+ * - `CommitBundle.stageId` (post-mount id)
104
+ * - `node.id` from xyflow nodes built off the spec
105
+ * - the segment of `runtimeStageId` BEFORE the `#` (use
106
+ * `parseRuntimeStageId` directly for full runtimeStageId strings)
107
+ *
108
+ * Mirrors the decomposition `parseRuntimeStageId` performs on the
109
+ * stageId portion of a runtimeStageId, so the two helpers stay in
110
+ * lockstep on naming and behavior.
111
+ *
112
+ * @example
113
+ * splitStageId('sf-tools/execute-tool-calls')
114
+ * // → { localStageId: 'execute-tool-calls', subflowPath: 'sf-tools' }
115
+ *
116
+ * splitStageId('execute-tool-calls')
117
+ * // → { localStageId: 'execute-tool-calls', subflowPath: undefined }
118
+ *
119
+ * splitStageId('sf-outer/sf-inner/validate')
120
+ * // → { localStageId: 'validate', subflowPath: 'sf-outer/sf-inner' }
121
+ */
122
+ export function splitStageId(prefixedStageId) {
123
+ const lastSlash = prefixedStageId.lastIndexOf(PATH_DELIMITER);
124
+ if (lastSlash === -1) {
125
+ return { localStageId: prefixedStageId, subflowPath: undefined };
126
+ }
127
+ return {
128
+ localStageId: prefixedStageId.slice(lastSlash + 1),
129
+ subflowPath: prefixedStageId.slice(0, lastSlash),
130
+ };
131
+ }
132
+ /**
133
+ * True when `key` names one EXECUTION (`…#N`) rather than a stage or a subflow
134
+ * path. Its presence alone decides: the delimiter is reserved in every
135
+ * user-authored id (`refuseReservedId`), so only the grammar puts it there.
136
+ *
137
+ * Asked where a map is keyed by both — `subflowResults` is dual-keyed by
138
+ * subflow path AND by mount runtimeStageId.
139
+ */
140
+ export function isExecutionKey(key) {
141
+ return key.includes(EXECUTION_DELIMITER);
142
+ }
143
+ /**
144
+ * The FULL (subflow-prefixed) stage id of a runtimeStageId — everything before
145
+ * the last `#`, i.e. what `node.id` / `CommitBundle.stageId` hold. A string
146
+ * with no `#` is returned whole.
147
+ *
148
+ * @example stageIdOf('sf-tools/execute#8') // 'sf-tools/execute'
149
+ */
150
+ export function stageIdOf(runtimeStageId) {
151
+ const hashIdx = runtimeStageId.lastIndexOf(EXECUTION_DELIMITER);
152
+ return hashIdx === -1 ? runtimeStageId : runtimeStageId.slice(0, hashIdx);
153
+ }
154
+ /** The execution index of a runtimeStageId, or `NaN` when it carries none. */
155
+ export function executionIndexOf(runtimeStageId) {
156
+ const hashIdx = runtimeStageId.lastIndexOf(EXECUTION_DELIMITER);
157
+ return hashIdx === -1 ? NaN : Number.parseInt(runtimeStageId.slice(hashIdx + 1), 10);
158
+ }
159
+ /**
160
+ * The subflow path a runtimeStageId executes in (`'sf-a/sf-b'`), or
161
+ * `undefined` at the top level. Reads the stage-id part, so it agrees with
162
+ * `splitStageId(stageIdOf(rid)).subflowPath`.
163
+ */
164
+ export function subflowPathOf(runtimeStageId) {
165
+ return splitStageId(stageIdOf(runtimeStageId)).subflowPath;
166
+ }
167
+ /** The subflow path of a runtimeStageId as segments (`['sf-a', 'sf-b']`); `[]` at the top level. */
168
+ export function subflowSegmentsOf(runtimeStageId) {
169
+ const path = subflowPathOf(runtimeStageId);
170
+ return path === undefined ? [] : path.split(PATH_DELIMITER);
171
+ }
172
+ /** The non-empty segments of a subflow path or prefixed id (`'a//b/'` → `['a', 'b']`). */
173
+ export function pathSegments(path) {
174
+ return path.split(PATH_DELIMITER).filter((s) => s.length > 0);
175
+ }
176
+ /** The last segment of a path or prefixed id (`'sf-a/sf-b'` → `'sf-b'`); the whole string when it has none. */
177
+ export function lastSegmentOf(path) {
178
+ return path.slice(path.lastIndexOf(PATH_DELIMITER) + 1);
179
+ }
180
+ /** Join path segments with the grammar's delimiter (`joinPath('sf', 'stage')` → `'sf/stage'`). */
181
+ export function joinPath(...segments) {
182
+ return segments.join(PATH_DELIMITER);
183
+ }
184
+ /** True when the (prefixed) id `id` sits INSIDE the subflow at `path` — at any depth below it. */
185
+ export function isWithinSubflow(id, path) {
186
+ return id.startsWith(`${path}${PATH_DELIMITER}`);
187
+ }
188
+ /**
189
+ * The builder's ONE refusal for user-authored ids (RFC 3986 §2.2 — the
190
+ * grammar's delimiters are reserved, so a user id can never fake a subflow
191
+ * path or an execution suffix). Returns the refusal sentence, or `undefined`
192
+ * when the id is admissible; the builder turns a sentence into its own error.
193
+ *
194
+ * Called at the builder's id doors ONLY — never by the prefixer (which writes
195
+ * `/` on purpose) and never by a store (which holds runtimeStageIds).
196
+ *
197
+ * The `~` sentence is `branchSegmentReservationMessage`'s, byte-for-byte, so a
198
+ * pre-9.37.0 refusal reads the same.
199
+ *
200
+ * @param what How the error names the id (`"subflow id"`, `"addFunction id"`).
201
+ * @param id The id as the user wrote it.
202
+ * @param position Where the id sits in the grammar.
203
+ */
204
+ export function refuseReservedId(what, id, position) {
205
+ // A missing / non-string id is not this rule's business — the door's own checks own it.
206
+ if (typeof id !== 'string')
207
+ return undefined;
208
+ if (position === 'segment' && hasBranchSegmentMarker(id))
209
+ return branchSegmentReservationMessage(what, id);
210
+ for (const delimiter of [PATH_DELIMITER, EXECUTION_DELIMITER]) {
211
+ if (!id.includes(delimiter))
212
+ continue;
213
+ return (`${what} '${id}' contains the reserved character '${delimiter}'. ` +
214
+ `From 9.37.0 '${PATH_DELIMITER}' and '${EXECUTION_DELIMITER}' are reserved for the runtimeStageId grammar ` +
215
+ `([subflowPath${PATH_DELIMITER}]stageId${EXECUTION_DELIMITER}executionIndex) — allowing one here would let a ` +
216
+ 'hand-authored id read as a subflow path or an execution suffix and silently mis-attribute its trace. ' +
217
+ 'Rename the id (a dash reads the same).');
218
+ }
219
+ return undefined;
220
+ }
221
+ /** Create a new execution counter starting at 0. */
222
+ export function createExecutionCounter() {
223
+ return { value: 0 };
224
+ }
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZVN0YWdlSWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2lkcy9ydW50aW1lU3RhZ2VJZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJDRztBQUVILE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTdGLDZFQUE2RTtBQUM3RSxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFDM0Isa0VBQWtFO0FBQ2xFLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBZWhDOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxPQUFlLEVBQUUsY0FBc0IsRUFBRSxXQUFvQjtJQUMvRixNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEUsT0FBTyxHQUFHLE1BQU0sR0FBRyxPQUFPLEdBQUcsbUJBQW1CLEdBQUcsY0FBYyxFQUFvQixDQUFDO0FBQ3hGLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsY0FBc0I7SUFLeEQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2hFLElBQUksT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQW1CLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2xHLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNwRCxNQUFNLGNB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QWMsV0FBVyxtQkFBbUIsa0RBQWtEO1lBQzlHLHVHQUF1RztZQUN2Ryx3Q0FBd0MsQ0FDekMsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBV0Qsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBydW50aW1lU3RhZ2VJZCDigJQgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggZXhlY3V0aW9uIHN0ZXAgZHVyaW5nIHRyYXZlcnNhbC5cbiAqXG4gKiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleFxuICpcbiAqIENvbXBvbmVudHM6XG4gKiAgIHN0YWdlSWQgICAgICAgIOKAlCBzdGFibGUgbm9kZSBJRCBmcm9tIHRoZSBidWlsZGVyICgnY2FsbC1sbG0nLCAnc2VlZCcpXG4gKiAgIGV4ZWN1dGlvbkluZGV4IOKAlCBtb25vdG9uaWMgY291bnRlciBpbmNyZW1lbnRlZCBwZXIgc3RhZ2UgZXhlY3V0aW9uICgwLCAxLCAyLi4uKVxuICogICBzdWJmbG93UGF0aCAgICDigJQgb3B0aW9uYWwgcGF0aCBmb3Igc3ViZmxvdyBzdGFnZXMgKCdzZi10b29scycsICdzZi1vdXRlci9zZi1pbm5lcicpXG4gKlxuICogUHJvcGVydGllczpcbiAqICAgLSBVbmlxdWUgd2l0aGluIGEgcnVuIChleGVjdXRpb25JbmRleCBuZXZlciByZXBlYXRzKVxuICogICAtIEV4ZWN1dGlvbi1vcmRlcmVkIChzb3J0IGJ5IGV4ZWN1dGlvbkluZGV4ID0gZXhlY3V0aW9uIG9yZGVyKVxuICogICAtIEh1bWFuLXJlYWRhYmxlICgnc2YtdG9vbHMvZXhlY3V0ZS10b29sLWNhbGxzIzgnKVxuICogICAtIFBhcnNlYWJsZSAoc3BsaXQgb24gJyMnIGZvciBzdGFnZUlkIGFuZCBpbmRleCwgc3BsaXQgc3RhZ2VJZCBvbiAnLycgZm9yIHN1YmZsb3cgcGF0aClcbiAqXG4gKiBOYW1pbmctY29sbGlzaW9uIHdhcm5pbmdcbiAqIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogICBUaGUgcGFyc2VkLW91dHB1dCBgLnN0YWdlSWRgIGZpZWxkIGJlbG93IGlzIHRoZSBMT0NBTCBmb3JtIChzZWdtZW50XG4gKiAgIGFmdGVyIHRoZSBsYXN0ICcvJykuIFRoaXMgaXMgTk9UIHRoZSBzYW1lIGFzIGBzcGVjLmlkYCAvIGBub2RlLmlkYFxuICogICBmb3Igc3ViZmxvdy1uZXN0ZWQgc3RhZ2VzLCB3aGljaCBjYXJyeSB0aGUgRlVMTCBwcmVmaXhlZCBmb3JtXG4gKiAgIChgJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscydgKS4gVG8gY29tcGFyZSBzYWZlbHksIHVzZVxuICogICBgc3BsaXRTdGFnZUlkKHNwZWMuaWQpYCB0byBkZWNvbXBvc2UgdGhlIHByZWZpeGVkIGZvcm0gdGhlIHNhbWVcbiAqICAgd2F5IGBwYXJzZVJ1bnRpbWVTdGFnZUlkYCBkZWNvbXBvc2VzIGEgcnVudGltZVN0YWdlSWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogYnVpbGRSdW50aW1lU3RhZ2VJZCgnY2FsbC1sbG0nLCA1KSAgICAgICAgICAgICAgICAgICAgLy8gJ2NhbGwtbGxtIzUnXG4gKiBidWlsZFJ1bnRpbWVTdGFnZUlkKCdleGVjdXRlLXRvb2wtY2FsbHMnLCA4LCAnc2YtdG9vbHMnKSAvLyAnc2YtdG9vbHMvZXhlY3V0ZS10b29sLWNhbGxzIzgnXG4gKiBidWlsZFJ1bnRpbWVTdGFnZUlkKCd2YWxpZGF0ZScsIDMsICdzZi1vdXRlci9zZi1pbm5lcicpICAvLyAnc2Ytb3V0ZXIvc2YtaW5uZXIvdmFsaWRhdGUjMydcbiAqIGBgYFxuICpcbiAqICMjIFRoZSBvbmUgb3duZXIgKEY3LCA5LjM3LjApXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgdGhlIE9ORSBwbGFjZSB0aGUgZ3JhbW1hciBpcyBzcGVsbGVkLiBFdmVyeSByZWFkZXIgYXNrcyBpdCDigJRcbiAqIGBpc0V4ZWN1dGlvbktleWAsIGBzdGFnZUlkT2ZgLCBgc3ViZmxvd1BhdGhPZmAsIGBzdWJmbG93U2VnbWVudHNPZmAsXG4gKiBgbGFzdFNlZ21lbnRPZmAsIGBpc1dpdGhpblN1YmZsb3dgIOKAlCBhbmQgZXZlcnkgY29tcG9zZXIgam9pbnMgdGhyb3VnaFxuICogYGpvaW5QYXRoYCAvIGBidWlsZFJ1bnRpbWVTdGFnZUlkYDsgbm8gb3RoZXIgZmlsZSBzcGxpdHMgb24gYCNgIG9yIGAvYC5cbiAqIFRoZSBkZWxpbWl0ZXJzIGFyZSBSRVNFUlZFRCAoUkZDIDM5ODYgwqcyLjIgc3R5bGUpOiBgcmVmdXNlUmVzZXJ2ZWRJZGAgaXNcbiAqIHRoZSBidWlsZGVyJ3Mgb25lIHJlZnVzYWwgZm9yIHVzZXItYXV0aG9yZWQgaWRzLCBzbyBsYXN0LWRlbGltaXRlciBwYXJzaW5nXG4gKiBpcyBzb3VuZCBieSBjb25zdHJ1Y3Rpb24gcmF0aGVyIHRoYW4gYnkgaG9wZS4gU3RvcmVzIGFuZCB0aGUgcHJlZml4ZXIgbmV2ZXJcbiAqIHJlZnVzZSDigJQgdGhleSBob2xkIHJ1bnRpbWUgaWRzIGFuZCBwcmVmaXhlZCBpZHMsIHdoaWNoIGNhcnJ5IHRoZSBkZWxpbWl0ZXJzXG4gKiBvbiBwdXJwb3NlLlxuICovXG5cbmltcG9ydCB7IGJyYW5jaFNlZ21lbnRSZXNlcnZhdGlvbk1lc3NhZ2UsIGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIgfSBmcm9tICcuL2JyYW5jaFNlZ21lbnQuanMnO1xuXG4vKiogU2VwYXJhdGVzIHN1YmZsb3cgcGF0aCBzZWdtZW50cyBmcm9tIGVhY2ggb3RoZXIgYW5kIGZyb20gdGhlIHN0YWdlIGlkLiAqL1xuY29uc3QgUEFUSF9ERUxJTUlURVIgPSAnLyc7XG4vKiogU2VwYXJhdGVzIHRoZSAocHJlZml4ZWQpIHN0YWdlIGlkIGZyb20gdGhlIGV4ZWN1dGlvbiBpbmRleC4gKi9cbmNvbnN0IEVYRUNVVElPTl9ERUxJTUlURVIgPSAnIyc7XG5cbi8vIOKUgOKUgCBCcmFuZHMgKHR5cGVzIG9ubHkg4oCUIFJ1c3QtbmV3dHlwZSBzdHlsZTsgbm8gcnVudGltZSBjb3N0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZGVjbGFyZSBjb25zdCBSVU5USU1FX1NUQUdFX0lEOiB1bmlxdWUgc3ltYm9sO1xuZGVjbGFyZSBjb25zdCBFWEVDVVRJT05fSU5ERVg6IHVuaXF1ZSBzeW1ib2w7XG5kZWNsYXJlIGNvbnN0IENPTU1JVF9JRFg6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKiBBIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgIHN0cmluZyB0aGUgZ3JhbW1hciBwcm9kdWNlZC4gQXNzaWduYWJsZSB0byBgc3RyaW5nYC4gKi9cbmV4cG9ydCB0eXBlIFJ1bnRpbWVTdGFnZUlkID0gc3RyaW5nICYgeyByZWFkb25seSBbUlVOVElNRV9TVEFHRV9JRF06IHRydWUgfTtcbi8qKiBUaGUgcnVuLWdsb2JhbCwgbW9ub3RvbmljIHBvc2l0aW9uIG9mIG9uZSBzdGFnZSBleGVjdXRpb24gKHRoZSBgI05gKS4gQXNzaWduYWJsZSB0byBgbnVtYmVyYC4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGlvbkluZGV4ID0gbnVtYmVyICYgeyByZWFkb25seSBbRVhFQ1VUSU9OX0lOREVYXTogdHJ1ZSB9O1xuLyoqIEEgYnVuZGxlJ3MgcG9zaXRpb24gaW4gYSBjb21taXQgbG9nIChgYnVuZGxlLmlkeGApLiBBc3NpZ25hYmxlIHRvIGBudW1iZXJgLiAqL1xuZXhwb3J0IHR5cGUgQ29tbWl0SWR4ID0gbnVtYmVyICYgeyByZWFkb25seSBbQ09NTUlUX0lEWF06IHRydWUgfTtcblxuLyoqXG4gKiBCdWlsZCBhIHJ1bnRpbWVTdGFnZUlkIGZyb20gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogTm90ZTogVGhlIHRyYXZlcnNlciBkb2VzIE5PVCB1c2UgdGhlIHN1YmZsb3dQYXRoIHBhcmFtZXRlciDigJQgbm9kZS5pZCBhbHJlYWR5XG4gKiBpbmNsdWRlcyB0aGUgc3ViZmxvdyBwcmVmaXggZnJvbSB0aGUgYnVpbGRlci4gVGhpcyBwYXJhbWV0ZXIgZXhpc3RzIGZvciBleHRlcm5hbFxuICogY29uc3VtZXJzIGNvbnN0cnVjdGluZyBJRHMgZnJvbSBwYXJzZWQgY29tcG9uZW50cyAocm91bmQtdHJpcCB2aWEgcGFyc2VSdW50aW1lU3RhZ2VJZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJ1bnRpbWVTdGFnZUlkKHN0YWdlSWQ6IHN0cmluZywgZXhlY3V0aW9uSW5kZXg6IG51bWJlciwgc3ViZmxvd1BhdGg/OiBzdHJpbmcpOiBSdW50aW1lU3RhZ2VJZCB7XG4gIGNvbnN0IHByZWZpeCA9IHN1YmZsb3dQYXRoID8gYCR7c3ViZmxvd1BhdGh9JHtQQVRIX0RFTElNSVRFUn1gIDogJyc7XG4gIHJldHVybiBgJHtwcmVmaXh9JHtzdGFnZUlkfSR7RVhFQ1VUSU9OX0RFTElNSVRFUn0ke2V4ZWN1dGlvbkluZGV4fWAgYXMgUnVudGltZVN0YWdlSWQ7XG59XG5cbi8qKlxuICogUGFyc2UgYSBydW50aW1lU3RhZ2VJZCBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIElNUE9SVEFOVCDigJQgbmFtaW5nIGNvbGxpc2lvbjogdGhlIHJldHVybmVkIGBzdGFnZUlkYCBpcyB0aGUgTE9DQUxcbiAqIGZvcm0gKHRoZSBzZWdtZW50IGJldHdlZW4gdGhlIGxhc3QgJy8nIGFuZCB0aGUgJyMnKS4gVGhpcyBpcyBOT1RcbiAqIHRoZSBzYW1lIGFzIGBzcGVjLmlkYCBvciBgbm9kZS5pZGAgZm9yIHN1YmZsb3ctbmVzdGVkIHN0YWdlcyxcbiAqIHdoaWNoIGNvbnRhaW4gdGhlIEZVTEwgcHJlZml4ZWQgZm9ybS5cbiAqXG4gKiAgIHBhcnNlUnVudGltZVN0YWdlSWQoJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscyM4Jykuc3RhZ2VJZFxuICogICAvLyDihpIgJ2V4ZWN1dGUtdG9vbC1jYWxscycgICAoTE9DQUwpXG4gKlxuICogICBub2RlLmlkICAvLyAocG9zdC1tb3VudCwgaW4gYSBzcGVjIHRoYXQgY29udGFpbnMgc3ViZmxvd3MpXG4gKiAgIC8vIOKGkiAnc2YtdG9vbHMvZXhlY3V0ZS10b29sLWNhbGxzJyAgIChGVUxMIHByZWZpeGVkKVxuICpcbiAqIFRvIGNvbXBhcmUgdGhlc2UgdHdvIHNhZmVseSwgdXNlIGBzcGxpdFN0YWdlSWQobm9kZS5pZClgIHRvIGdldFxuICogdGhlIGxvY2FsIGZvcm0sIE9SIHJlY29uc3RydWN0IHRoZSBmdWxsIGZvcm0gdmlhXG4gKiBgKHN1YmZsb3dQYXRoID8gc3ViZmxvd1BhdGggKyAnLycgOiAnJykgKyBzdGFnZUlkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUnVudGltZVN0YWdlSWQocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHtcbiAgc3RhZ2VJZDogc3RyaW5nO1xuICBleGVjdXRpb25JbmRleDogRXhlY3V0aW9uSW5kZXg7XG4gIHN1YmZsb3dQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59IHtcbiAgY29uc3QgaGFzaElkeCA9IHJ1bnRpbWVTdGFnZUlkLmxhc3RJbmRleE9mKEVYRUNVVElPTl9ERUxJTUlURVIpO1xuICBpZiAoaGFzaElkeCA9PT0gLTEpIHtcbiAgICByZXR1cm4geyBzdGFnZUlkOiBydW50aW1lU3RhZ2VJZCwgZXhlY3V0aW9uSW5kZXg6IDAgYXMgRXhlY3V0aW9uSW5kZXgsIHN1YmZsb3dQYXRoOiB1bmRlZmluZWQgfTtcbiAgfVxuXG4gIGNvbnN0IGJlZm9yZUhhc2ggPSBydW50aW1lU3RhZ2VJZC5zbGljZSgwLCBoYXNoSWR4KTtcbiAgY29uc3QgZXhlY3V0aW9uSW5kZXggPSBwYXJzZUludChydW50aW1lU3RhZ2VJZC5zbGljZShoYXNoSWR4ICsgMSksIDEwKSBhcyBFeGVjdXRpb25JbmRleDtcblxuICBjb25zdCBsYXN0U2xhc2ggPSBiZWZvcmVIYXNoLmxhc3RJbmRleE9mKFBBVEhfREVMSU1JVEVSKTtcbiAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICByZXR1cm4geyBzdGFnZUlkOiBiZWZvcmVIYXNoLCBleGVjdXRpb25JbmRleCwgc3ViZmxvd1BhdGg6IHVuZGVmaW5lZCB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFnZUlkOiBiZWZvcmVIYXNoLnNsaWNlKGxhc3RTbGFzaCArIDEpLFxuICAgIGV4ZWN1dGlvbkluZGV4LFxuICAgIHN1YmZsb3dQYXRoOiBiZWZvcmVIYXNoLnNsaWNlKDAsIGxhc3RTbGFzaCksXG4gIH07XG59XG5cbi8qKlxuICogRGVjb21wb3NlIGEgKHBvc3NpYmx5IHByZWZpeGVkKSBzdGFnZSBpZCBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIFVzZSB0aGlzIHdoZW4geW91IGhhdmUgYW4gaWQgV0lUSE9VVCB0aGUgYCNOYCBleGVjdXRpb24gc3VmZml4IGFuZFxuICogbmVlZCB0aGUgbG9jYWwgc3RhZ2UgbmFtZSBhbmQvb3IgdGhlIHN1YmZsb3cgcGF0aC4gQ29tbW9uIHNvdXJjZXNcbiAqIG9mIHN1Y2ggaWRzOlxuICogICAtIGBzcGVjLmlkYCAocG9zdC1tb3VudCB0aGUgaWQgaW5jbHVkZXMgYW55IHN1YmZsb3cgcHJlZml4KVxuICogICAtIGBDb21taXRCdW5kbGUuc3RhZ2VJZGAgKHBvc3QtbW91bnQgaWQpXG4gKiAgIC0gYG5vZGUuaWRgIGZyb20geHlmbG93IG5vZGVzIGJ1aWx0IG9mZiB0aGUgc3BlY1xuICogICAtIHRoZSBzZWdtZW50IG9mIGBydW50aW1lU3RhZ2VJZGAgQkVGT1JFIHRoZSBgI2AgKHVzZVxuICogICAgIGBwYXJzZVJ1bnRpbWVTdGFnZUlkYCBkaXJlY3RseSBmb3IgZnVsbCBydW50aW1lU3RhZ2VJZCBzdHJpbmdzKVxuICpcbiAqIE1pcnJvcnMgdGhlIGRlY29tcG9zaXRpb24gYHBhcnNlUnVudGltZVN0YWdlSWRgIHBlcmZvcm1zIG9uIHRoZVxuICogc3RhZ2VJZCBwb3J0aW9uIG9mIGEgcnVudGltZVN0YWdlSWQsIHNvIHRoZSB0d28gaGVscGVycyBzdGF5IGluXG4gKiBsb2Nrc3RlcCBvbiBuYW1pbmcgYW5kIGJlaGF2aW9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiBzcGxpdFN0YWdlSWQoJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscycpXG4gKiAvLyDihpIgeyBsb2NhbFN0YWdlSWQ6ICdleGVjdXRlLXRvb2wtY2FsbHMnLCBzdWJmbG93UGF0aDogJ3NmLXRvb2xzJyB9XG4gKlxuICogc3BsaXRTdGFnZUlkKCdleGVjdXRlLXRvb2wtY2FsbHMnKVxuICogLy8g4oaSIHsgbG9jYWxTdGFnZUlkOiAnZXhlY3V0ZS10b29sLWNhbGxzJywgc3ViZmxvd1BhdGg6IHVuZGVmaW5lZCB9XG4gKlxuICogc3BsaXRTdGFnZUlkKCdzZi1vdXRlci9zZi1pbm5lci92YWxpZGF0ZScpXG4gKiAvLyDihpIgeyBsb2NhbFN0YWdlSWQ6ICd2YWxpZGF0ZScsIHN1YmZsb3dQYXRoOiAnc2Ytb3V0ZXIvc2YtaW5uZXInIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3RhZ2VJZChwcmVmaXhlZFN0YWdlSWQ6IHN0cmluZyk6IHtcbiAgbG9jYWxTdGFnZUlkOiBzdHJpbmc7XG4gIHN1YmZsb3dQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59IHtcbiAgY29uc3QgbGFzdFNsYXNoID0gcHJlZml4ZWRTdGFnZUlkLmxhc3RJbmRleE9mKFBBVEhfREVMSU1JVEVSKTtcbiAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICByZXR1cm4geyBsb2NhbFN0YWdlSWQ6IHByZWZpeGVkU3RhZ2VJZCwgc3ViZmxvd1BhdGg6IHVuZGVmaW5lZCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbG9jYWxTdGFnZUlkOiBwcmVmaXhlZFN0YWdlSWQuc2xpY2UobGFzdFNsYXNoICsgMSksXG4gICAgc3ViZmxvd1BhdGg6IHByZWZpeGVkU3RhZ2VJZC5zbGljZSgwLCBsYXN0U2xhc2gpLFxuICB9O1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBga2V5YCBuYW1lcyBvbmUgRVhFQ1VUSU9OIChg4oCmI05gKSByYXRoZXIgdGhhbiBhIHN0YWdlIG9yIGEgc3ViZmxvd1xuICogcGF0aC4gSXRzIHByZXNlbmNlIGFsb25lIGRlY2lkZXM6IHRoZSBkZWxpbWl0ZXIgaXMgcmVzZXJ2ZWQgaW4gZXZlcnlcbiAqIHVzZXItYXV0aG9yZWQgaWQgKGByZWZ1c2VSZXNlcnZlZElkYCksIHNvIG9ubHkgdGhlIGdyYW1tYXIgcHV0cyBpdCB0aGVyZS5cbiAqXG4gKiBBc2tlZCB3aGVyZSBhIG1hcCBpcyBrZXllZCBieSBib3RoIOKAlCBgc3ViZmxvd1Jlc3VsdHNgIGlzIGR1YWwta2V5ZWQgYnlcbiAqIHN1YmZsb3cgcGF0aCBBTkQgYnkgbW91bnQgcnVudGltZVN0YWdlSWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0V4ZWN1dGlvbktleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4ga2V5LmluY2x1ZGVzKEVYRUNVVElPTl9ERUxJTUlURVIpO1xufVxuXG4vKipcbiAqIFRoZSBGVUxMIChzdWJmbG93LXByZWZpeGVkKSBzdGFnZSBpZCBvZiBhIHJ1bnRpbWVTdGFnZUlkIOKAlCBldmVyeXRoaW5nIGJlZm9yZVxuICogdGhlIGxhc3QgYCNgLCBpLmUuIHdoYXQgYG5vZGUuaWRgIC8gYENvbW1pdEJ1bmRsZS5zdGFnZUlkYCBob2xkLiBBIHN0cmluZ1xuICogd2l0aCBubyBgI2AgaXMgcmV0dXJuZWQgd2hvbGUuXG4gKlxuICogQGV4YW1wbGUgc3RhZ2VJZE9mKCdzZi10b29scy9leGVjdXRlIzgnKSAvLyAnc2YtdG9vbHMvZXhlY3V0ZSdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YWdlSWRPZihydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaElkeCA9IHJ1bnRpbWVTdGFnZUlkLmxhc3RJbmRleE9mKEVYRUNVVElPTl9ERUxJTUlURVIpO1xuICByZXR1cm4gaGFzaElkeCA9PT0gLTEgPyBydW50aW1lU3RhZ2VJZCA6IHJ1bnRpbWVTdGFnZUlkLnNsaWNlKDAsIGhhc2hJZHgpO1xufVxuXG4vKiogVGhlIGV4ZWN1dGlvbiBpbmRleCBvZiBhIHJ1bnRpbWVTdGFnZUlkLCBvciBgTmFOYCB3aGVuIGl0IGNhcnJpZXMgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRpb25JbmRleE9mKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBoYXNoSWR4ID0gcnVudGltZVN0YWdlSWQubGFzdEluZGV4T2YoRVhFQ1VUSU9OX0RFTElNSVRFUik7XG4gIHJldHVybiBoYXNoSWR4ID09PSAtMSA/IE5hTiA6IE51bWJlci5wYXJzZUludChydW50aW1lU3RhZ2VJZC5zbGljZShoYXNoSWR4ICsgMSksIDEwKTtcbn1cblxuLyoqXG4gKiBUaGUgc3ViZmxvdyBwYXRoIGEgcnVudGltZVN0YWdlSWQgZXhlY3V0ZXMgaW4gKGAnc2YtYS9zZi1iJ2ApLCBvclxuICogYHVuZGVmaW5lZGAgYXQgdGhlIHRvcCBsZXZlbC4gUmVhZHMgdGhlIHN0YWdlLWlkIHBhcnQsIHNvIGl0IGFncmVlcyB3aXRoXG4gKiBgc3BsaXRTdGFnZUlkKHN0YWdlSWRPZihyaWQpKS5zdWJmbG93UGF0aGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJmbG93UGF0aE9mKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3BsaXRTdGFnZUlkKHN0YWdlSWRPZihydW50aW1lU3RhZ2VJZCkpLnN1YmZsb3dQYXRoO1xufVxuXG4vKiogVGhlIHN1YmZsb3cgcGF0aCBvZiBhIHJ1bnRpbWVTdGFnZUlkIGFzIHNlZ21lbnRzIChgWydzZi1hJywgJ3NmLWInXWApOyBgW11gIGF0IHRoZSB0b3AgbGV2ZWwuICovXG5leHBvcnQgZnVuY3Rpb24gc3ViZmxvd1NlZ21lbnRzT2YocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGF0aCA9IHN1YmZsb3dQYXRoT2YocnVudGltZVN0YWdlSWQpO1xuICByZXR1cm4gcGF0aCA9PT0gdW5kZWZpbmVkID8gW10gOiBwYXRoLnNwbGl0KFBBVEhfREVMSU1JVEVSKTtcbn1cblxuLyoqIFRoZSBub24tZW1wdHkgc2VnbWVudHMgb2YgYSBzdWJmbG93IHBhdGggb3IgcHJlZml4ZWQgaWQgKGAnYS8vYi8nYCDihpIgYFsnYScsICdiJ11gKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRoU2VnbWVudHMocGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gcGF0aC5zcGxpdChQQVRIX0RFTElNSVRFUikuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCA+IDApO1xufVxuXG4vKiogVGhlIGxhc3Qgc2VnbWVudCBvZiBhIHBhdGggb3IgcHJlZml4ZWQgaWQgKGAnc2YtYS9zZi1iJ2Ag4oaSIGAnc2YtYidgKTsgdGhlIHdob2xlIHN0cmluZyB3aGVuIGl0IGhhcyBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhc3RTZWdtZW50T2YocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguc2xpY2UocGF0aC5sYXN0SW5kZXhPZihQQVRIX0RFTElNSVRFUikgKyAxKTtcbn1cblxuLyoqIEpvaW4gcGF0aCBzZWdtZW50cyB3aXRoIHRoZSBncmFtbWFyJ3MgZGVsaW1pdGVyIChgam9pblBhdGgoJ3NmJywgJ3N0YWdlJylgIOKGkiBgJ3NmL3N0YWdlJ2ApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpvaW5QYXRoKC4uLnNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBzZWdtZW50cy5qb2luKFBBVEhfREVMSU1JVEVSKTtcbn1cblxuLyoqIFRydWUgd2hlbiB0aGUgKHByZWZpeGVkKSBpZCBgaWRgIHNpdHMgSU5TSURFIHRoZSBzdWJmbG93IGF0IGBwYXRoYCDigJQgYXQgYW55IGRlcHRoIGJlbG93IGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2l0aGluU3ViZmxvdyhpZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoYCR7cGF0aH0ke1BBVEhfREVMSU1JVEVSfWApO1xufVxuXG4vKipcbiAqIFdoZXJlIGEgdXNlci1hdXRob3JlZCBpZCBzaXRzIGluIHRoZSBncmFtbWFyIOKAlCB3aGF0IHRoZSBidWlsZGVyIGFkbWl0cyBpdCBhcy5cbiAqXG4gKiAtIGAnc3RhZ2UnYCAgIOKAlCBhIHN0YWdlIGlkIChgc3RhZ2VJZGAgcG9zaXRpb24pOiBgI2AgYW5kIGAvYCBhcmUgcmVmdXNlZC5cbiAqIC0gYCdzZWdtZW50J2Ag4oCUIGEgc3ViZmxvdyBpZCBvciBhIGBwYXJhbGxlbEZvckVhY2hgIGlkIChhIFBBVEggU0VHTUVOVCwgb3JcbiAqICAgdGhlIHBhcmVudCBvZiBhIGdlbmVyYXRlZCBvbmUpOiBgfmAgaXMgcmVmdXNlZCB0b28gKHNlZSBgYnJhbmNoU2VnbWVudC50c2ApLlxuICovXG5leHBvcnQgdHlwZSBJZFBvc2l0aW9uID0gJ3N0YWdlJyB8ICdzZWdtZW50JztcblxuLyoqXG4gKiBUaGUgYnVpbGRlcidzIE9ORSByZWZ1c2FsIGZvciB1c2VyLWF1dGhvcmVkIGlkcyAoUkZDIDM5ODYgwqcyLjIg4oCUIHRoZVxuICogZ3JhbW1hcidzIGRlbGltaXRlcnMgYXJlIHJlc2VydmVkLCBzbyBhIHVzZXIgaWQgY2FuIG5ldmVyIGZha2UgYSBzdWJmbG93XG4gKiBwYXRoIG9yIGFuIGV4ZWN1dGlvbiBzdWZmaXgpLiBSZXR1cm5zIHRoZSByZWZ1c2FsIHNlbnRlbmNlLCBvciBgdW5kZWZpbmVkYFxuICogd2hlbiB0aGUgaWQgaXMgYWRtaXNzaWJsZTsgdGhlIGJ1aWxkZXIgdHVybnMgYSBzZW50ZW5jZSBpbnRvIGl0cyBvd24gZXJyb3IuXG4gKlxuICogQ2FsbGVkIGF0IHRoZSBidWlsZGVyJ3MgaWQgZG9vcnMgT05MWSDigJQgbmV2ZXIgYnkgdGhlIHByZWZpeGVyICh3aGljaCB3cml0ZXNcbiAqIGAvYCBvbiBwdXJwb3NlKSBhbmQgbmV2ZXIgYnkgYSBzdG9yZSAod2hpY2ggaG9sZHMgcnVudGltZVN0YWdlSWRzKS5cbiAqXG4gKiBUaGUgYH5gIHNlbnRlbmNlIGlzIGBicmFuY2hTZWdtZW50UmVzZXJ2YXRpb25NZXNzYWdlYCdzLCBieXRlLWZvci1ieXRlLCBzbyBhXG4gKiBwcmUtOS4zNy4wIHJlZnVzYWwgcmVhZHMgdGhlIHNhbWUuXG4gKlxuICogQHBhcmFtIHdoYXQgICAgIEhvdyB0aGUgZXJyb3IgbmFtZXMgdGhlIGlkIChgXCJzdWJmbG93IGlkXCJgLCBgXCJhZGRGdW5jdGlvbiBpZFwiYCkuXG4gKiBAcGFyYW0gaWQgICAgICAgVGhlIGlkIGFzIHRoZSB1c2VyIHdyb3RlIGl0LlxuICogQHBhcmFtIHBvc2l0aW9uIFdoZXJlIHRoZSBpZCBzaXRzIGluIHRoZSBncmFtbWFyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmdXNlUmVzZXJ2ZWRJZCh3aGF0OiBzdHJpbmcsIGlkOiBzdHJpbmcsIHBvc2l0aW9uOiBJZFBvc2l0aW9uKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gQSBtaXNzaW5nIC8gbm9uLXN0cmluZyBpZCBpcyBub3QgdGhpcyBydWxlJ3MgYnVzaW5lc3Mg4oCUIHRoZSBkb29yJ3Mgb3duIGNoZWNrcyBvd24gaXQuXG4gIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAocG9zaXRpb24gPT09ICdzZWdtZW50JyAmJiBoYXNCcmFuY2hTZWdtZW50TWFya2VyKGlkKSkgcmV0dXJuIGJyYW5jaFNlZ21lbnRSZXNlcnZhdGlvbk1lc3NhZ2Uod2hhdCwgaWQpO1xuICBmb3IgKGNvbnN0IGRlbGltaXRlciBvZiBbUEFUSF9ERUxJTUlURVIsIEVYRUNVVElPTl9ERUxJTUlURVJdKSB7XG4gICAgaWYgKCFpZC5pbmNsdWRlcyhkZWxpbWl0ZXIpKSBjb250aW51ZTtcbiAgICByZXR1cm4gKFxuICAgICAgYCR7d2hhdH0gJyR7aWR9JyBjb250YWlucyB0aGUgcmVzZXJ2ZWQgY2hhcmFjdGVyICcke2RlbGltaXRlcn0nLiBgICtcbiAgICAgIGBGcm9tIDkuMzcuMCAnJHtQQVRIX0RFTElNSVRFUn0nIGFuZCAnJHtFWEVDVVRJT05fREVMSU1JVEVSfScgYXJlIHJlc2VydmVkIGZvciB0aGUgcnVudGltZVN0YWdlSWQgZ3JhbW1hciBgICtcbiAgICAgIGAoW3N1YmZsb3dQYXRoJHtQQVRIX0RFTElNSVRFUn1dc3RhZ2VJZCR7RVhFQ1VUSU9OX0RFTElNSVRFUn1leGVjdXRpb25JbmRleCkg4oCUIGFsbG93aW5nIG9uZSBoZXJlIHdvdWxkIGxldCBhIGAgK1xuICAgICAgJ2hhbmQtYXV0aG9yZWQgaWQgcmVhZCBhcyBhIHN1YmZsb3cgcGF0aCBvciBhbiBleGVjdXRpb24gc3VmZml4IGFuZCBzaWxlbnRseSBtaXMtYXR0cmlidXRlIGl0cyB0cmFjZS4gJyArXG4gICAgICAnUmVuYW1lIHRoZSBpZCAoYSBkYXNoIHJlYWRzIHRoZSBzYW1lKS4nXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNoYXJlZCBtdXRhYmxlIGNvdW50ZXIgZm9yIGV4ZWN1dGlvbiBpbmRleC5cbiAqIFBhc3NlZCBieSByZWZlcmVuY2UgdG8gY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIHRoZXlcbiAqIGNvbnRpbnVlIHRoZSBnbG9iYWwgbnVtYmVyaW5nIGluc3RlYWQgb2YgcmVzdGFydGluZyBhdCAwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50ZXIge1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vKiogQ3JlYXRlIGEgbmV3IGV4ZWN1dGlvbiBjb3VudGVyIHN0YXJ0aW5nIGF0IDAuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0aW9uQ291bnRlcigpOiBFeGVjdXRpb25Db3VudGVyIHtcbiAgcmV0dXJuIHsgdmFsdWU6IDAgfTtcbn1cbiJdfQ==
@@ -336,4 +336,4 @@ export function commitIndexOf(commitLog, runtimeStageId) {
336
336
  }
337
337
  return -1;
338
338
  }
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0TG9nVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9jb21taXRMb2dVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUdILE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFjLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXBGLGlHQUFpRztBQUNqRyw4RkFBOEY7QUFDOUYsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRiwyRkFBMkY7QUFDM0YsMENBQTBDO0FBRTFDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsU0FBeUIsRUFBRSxPQUFlLEVBQUUsR0FBWTtJQUNqRixJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQztJQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUQsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsTUFBTSxVQUFVLFdBQVcsQ0FBQyxTQUF5QixFQUFFLE9BQWU7SUFDcEUsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQXlCLEVBQUUsR0FBVyxFQUFFLFNBQWtCO0lBQ3ZGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDN0MsQ0FBQztJQUNELCtGQUErRjtJQUMvRixpR0FBaUc7SUFDakcsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQztJQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDekIsU0FBUyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUM3QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsS0FBSyxRQUFRO2dCQUFFLFlBQVksR0FBRyxJQUFJLENBQUM7aUJBQ25DLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTTtvQkFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDOztvQkFDNUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDMUQsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFRRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLFNBQWtDLEVBQUUsR0FBVyxFQUFFLFVBQTBCLEVBQUU7SUFDckcsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNoRCxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUM7U0FDdkIsU0FBUyxDQUFDLEdBQUcsQ0FBQztTQUNkLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQWtDLEVBQUUsR0FBVyxFQUFFLEdBQVc7SUFDeEYsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxTQUF5QixFQUFFLEdBQVcsRUFBRSxHQUFXO0lBQy9FLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sV0FBVyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQTZDRCxNQUFNLGlCQUFpQixHQUEwQjtJQUMvQyxlQUFlO0lBQ2YsU0FBUztJQUNULGFBQWE7SUFDYixvQkFBb0I7SUFDcEIsVUFBVTtDQUNYLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsU0FBeUIsRUFDekIsR0FBVyxFQUNYLEdBQVcsRUFDWCxVQUE2QixFQUFFO0lBRS9CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLDJHQUEyRztJQUMzRyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDbkIsSUFBSSxXQUE4QixDQUFDO0lBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxTQUFTO1lBQUUsU0FBUztRQUM5QixXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxLQUFLLFFBQVE7WUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQzdCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDWCxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7SUFDbEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdGLE1BQU0sS0FBSyxHQUNULE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxhQUFhO1FBQzVCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6RixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWMsQ0FBQztJQUNwQywwR0FBMEc7SUFDMUcsNkRBQTZEO0lBQzdELDZHQUE2RztJQUM3Ryx1R0FBdUc7SUFDdkcsd0dBQXdHO0lBQ3hHLDJHQUEyRztJQUMzRyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0YsTUFBTSxZQUFZLEdBQUcsV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztJQUNySCxNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0lBQzlFLE1BQU0sZUFBZSxHQUFHLFdBQVcsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQztJQUMxRyxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUM7SUFDN0YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNO1lBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM5QyxDQUFDO1NBQU0sSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsWUFBWSxJQUFJLGVBQWUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RHLElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLE1BQU07UUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3RELElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxhQUFhLENBQUM7UUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDNUYsSUFBSSxHQUFHLENBQUMsR0FBRztRQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDeEIsU0FBa0MsRUFDbEMsR0FBVyxFQUNYLElBQVksRUFDWixHQUFXO0lBRVgsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLElBQUksRUFBRSxFQUFFLENBQUM7WUFDakQsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsS0FBSyxTQUFTO2dCQUFFLFNBQVM7WUFDOUIsR0FBRyxHQUFHLElBQUksQ0FBQztZQUNYLElBQUksQ0FBQyxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBaUJEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsU0FBeUIsRUFBRSxHQUFXLEVBQUUsU0FBa0I7SUFDaEcsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDekQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztJQUN0RyxDQUFDO0lBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUNqRixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxTQUF5QixFQUFFLEdBQVcsRUFBRSxHQUFXO0lBQ3RFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDOUIsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNqQyxTQUFTLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDaEMsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzFFLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxHQUFHLENBQUM7SUFDNUIsTUFBTSxJQUFJLEdBQVksRUFBRSxDQUFDO0lBQ3pCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0MsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNqQyxLQUFLLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNqRCxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxLQUFLLFNBQVM7Z0JBQUUsU0FBUztZQUM5QixJQUFJLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDckUsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFxQixFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEcsSUFBSSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDaEIsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQWtDO0lBQ2pFLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUMsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQWtDLEVBQUUsY0FBc0I7SUFDdEYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEtBQUssY0FBYztZQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHlwZWQgdXRpbGl0aWVzIGZvciBxdWVyeWluZyB0aGUgY29tbWl0IGxvZy5cbiAqXG4gKiBUaGUgY29tbWl0TG9nIGlzIGFuIG9yZGVyZWQgYXJyYXkgb2YgQ29tbWl0QnVuZGxlIOKAlCBvbmUgcGVyIHN0YWdlIGNvbW1pdC5cbiAqIFRoZXNlIGhlbHBlcnMgcHJvdmlkZSB0eXBlLXNhZmUgcXVlcmllcyB3aXRob3V0IChiOiBhbnkpIGNhc3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVnaXN0ZXJlZENvZGUgfSBmcm9tICcuL2hvbmVzdHkuanMnO1xuaW1wb3J0IHsgcXVlcnlXb3JrLCByZWxhdGlvbiwgcm9vdE9mLCB3cml0ZXNPbmx5SW5zaWRlIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQgeyBsZWF2ZXNTdHJpbmdBYm92ZSwgbG9nTW9kZWwsIG1lbW9pc2VkTW9kZWwgfSBmcm9tICcuL2xvZ01vZGVsLmpzJztcbmltcG9ydCB7IG5hdGl2ZUdldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgeyBERUxJTSB9IGZyb20gJy4vcGF0aHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHR5cGUgVG91Y2gsIGZvbGRLZXksIGlzVG90YWwsIGlzVmVyYiwgVW5rbm93blZlcmJFcnJvciB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG4vLyBFdmVyeSBrZXkgcXVlcnkgaGVyZSBmb2xsb3dzIHRoZSB3cml0ZXIgcnVsZSBhbmQgdGhlIHZhbHVlIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCAoRjMsIDkuMzMuMCk6XG4vLyBhIGtleSBpcyB3cml0dGVuIGJ5IGEgcm93IE9OIGl0LCBJTlNJREUgaXQsIG9yIEFST1VORCBpdCB3aGVuIHRoYXQgY2hhbmdlZCBpdCDigJQgbmV2ZXIgYnkgYW5cbi8vIGV4YWN0IHBhdGggbWF0Y2ggYWxvbmUsIHdoaWNoIGNhbGxlZCBldmVyeSBzdWJmbG93IHNlZWQgYW5kIG1lcmdlLWJhY2sgXCJuZXZlciB3cml0dGVuXCIuIFRoZVxuLy8gcmVhZCBtb2RlbCB0aGF0IGFuc3dlcnMgdGhlbSBhdCBhIGNvc3QgcHJvcG9ydGlvbmFsIHRvIHRoZSBhbnN3ZXIgaXMgYGxvZ01vZGVsLnRzYDsgYSBmcm96ZW5cbi8vIGxvZydzIG1vZGVsIGlzIG1lbW9pc2VkLCBhbmQgYSBzaW5nbGUgcXVlc3Rpb24gb24gYSBsb2cgdGhhdCBpcyBub3QgZnJvemVuIGZpcnN0IHRyaWVzIGFcbi8vIGJhY2t3YXJkIHNjYW4gdGhhdCBzdG9wcyBhdCB0aGUgYW5zd2VyLlxuXG4vKipcbiAqIEZpbmQgdGhlIGZpcnN0IGNvbW1pdCBieSBgc3RhZ2VJZGAsIG9wdGlvbmFsbHkgdGhlIGZpcnN0IG9uZSB0aGF0IFdST1RFIGBrZXlgIOKAlCB1bmRlciB0aGUgd3JpdGVyXG4gKiBydWxlOiBhIHJvdyBvbiB0aGUga2V5LCBpbnNpZGUgaXQsIG9yIGFyb3VuZCBpdCB0aGF0IGNoYW5nZWQgaXQgKHNlZSB7QGxpbmsgd3JpdGVyc09mfSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29tbWl0KGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIHN0YWdlSWQ6IHN0cmluZywga2V5Pzogc3RyaW5nKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFrZXkpIHJldHVybiBjb21taXRMb2cuZmluZCgoYikgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkKTtcbiAgY29uc3Qgd3JpdGVycyA9IG5ldyBTZXQobG9nTW9kZWwoY29tbWl0TG9nKS53cml0ZXJzT2Yoa2V5KSk7XG4gIHJldHVybiBjb21taXRMb2cuZmluZCgoYiwgaSkgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkICYmIHdyaXRlcnMuaGFzKGkpKTtcbn1cblxuLyoqIEZpbmQgYWxsIGNvbW1pdHMgYnkgc3RhZ2VJZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29tbWl0cyhjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBzdGFnZUlkOiBzdHJpbmcpOiBDb21taXRCdW5kbGVbXSB7XG4gIHJldHVybiBjb21taXRMb2cuZmlsdGVyKChiKSA9PiBiLnN0YWdlSWQgPT09IHN0YWdlSWQpO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGxhc3QgY29tbWl0IHRoYXQgV1JPVEUgYGtleWAgYmVmb3JlIGBiZWZvcmVJZHhgIChleGNsdXNpdmU7IGRlZmF1bHQ6IHRoZSB3aG9sZSBsb2cpIOKAlFxuICogdGhlIGFuY2hvciBvZiBldmVyeSBiYWNrd2FyZCBxdWVzdGlvbiAoXCJ3aG8gbWFkZSBpdCB0aGlzP1wiKS5cbiAqXG4gKiBUaGUgd3JpdGVyIHJ1bGUgKGBrZXlQYXRocy50c2ApOiBhIGNvbW1pdCB3cml0ZXMgYGtleWAgd2hlbiBvbmUgb2YgaXRzIHJvd3MgaXMgT04gdGhlIGtleSxcbiAqIElOU0lERSBpdCAoYSBzdWJmbG93J3MgaW5wdXQgc2VlZCB3cml0ZXMgYGNmZ+KQn2FgOyBhbiBvdXRwdXRNYXBwZXIgbWVyZ2UtYmFjayB3cml0ZXMgYGNmZ+KQn2JgO1xuICogZWl0aGVyIGlzIGEgd3JpdGUgb2YgYGNmZ2ApLCBvciBBUk9VTkQgaXQgd2l0aCB0aGUgdmFsdWUgYXQgdGhlIGtleSBkaWZmZXJlbnQgYWNyb3NzIHRoZSBjb21taXRcbiAqIChhIGBzZXRgIG9mIGBjZmdgIHdyaXRlcyBgY2Zn4pCfYWA7IGEgYG1lcmdlYCBvZiBgY2ZnYCB0aGF0IG5ldmVyIHJlYWNoZXMgYGFgIGRvZXMgbm90KS4gQSB3cml0ZVxuICogZm91bmQgdGhyb3VnaCBhIHJvdyBJTlNJREUgdGhlIGtleSB3cm90ZSBvbmx5IFBBUlQgb2YgaXRzIHZhbHVlIOKAlCB0aGUgc2xpY2UgcmVhZGVycyBzYXkgc28gd2l0aFxuICogdGhlIGAnbmVzdGVkLXJvd3MnYCBub3RlLlxuICpcbiAqIEBwYXJhbSBrZXkgIEEgREVMSU0tam9pbmVkIHBhdGggKGBub3JtYWxpc2VQYXRoYCk7IGEgdG9wLWxldmVsIGtleSBpcyBhIG9uZS1zZWdtZW50IHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdFdyaXRlcihjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBrZXk6IHN0cmluZywgYmVmb3JlSWR4PzogbnVtYmVyKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW5kID0gTWF0aC5taW4oYmVmb3JlSWR4ID8/IGNvbW1pdExvZy5sZW5ndGgsIGNvbW1pdExvZy5sZW5ndGgpO1xuICBjb25zdCBtb2RlbCA9IG1lbW9pc2VkTW9kZWwoY29tbWl0TG9nKTtcbiAgaWYgKG1vZGVsICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBhdCA9IG1vZGVsLmxhc3RXcml0ZXJCZWZvcmUoa2V5LCBlbmQpO1xuICAgIHJldHVybiBhdCA+PSAwID8gY29tbWl0TG9nW2F0XSA6IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBOb3QgZnJvemVuOiBzY2FuIGJhY2sgYW5kIHN0b3AgYXQgdGhlIGZpcnN0IHdyaXRlIG9uIG9yIGluc2lkZSB0aGUga2V5LiBBIHJvdyBBUk9VTkQgdGhlIGtleVxuICAvLyAob3IgYSBuZXN0ZWQgYGRlbGV0ZWAsIHdoaWNoIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lcikgbmVlZHMgYSB2ZXJkaWN0IOKAlCB0aGUgbW9kZWwncy5cbiAgY29uc3QgbmVzdGVkID0gcm9vdE9mKGtleSkgIT09IGtleTtcbiAgZm9yIChsZXQgaSA9IGVuZCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGV0IHdyaXRlID0gZmFsc2U7XG4gICAgbGV0IG5lZWRzVmVyZGljdCA9IGZhbHNlO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSBjb21taXRMb2dbaV0udHJhY2UubGVuZ3RoO1xuICAgIGZvciAoY29uc3QgdCBvZiBjb21taXRMb2dbaV0udHJhY2UpIHtcbiAgICAgIGNvbnN0IHIgPSByZWxhdGlvbih0LnBhdGgsIGtleSk7XG4gICAgICBpZiAociA9PT0gJ2Fyb3VuZCcpIG5lZWRzVmVyZGljdCA9IHRydWU7XG4gICAgICBlbHNlIGlmIChyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHQudmVyYiAhPT0gJ2RlbGV0ZScgfHwgIW5lc3RlZCkgd3JpdGUgPSB0cnVlO1xuICAgICAgICBlbHNlIG5lZWRzVmVyZGljdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3cml0ZSAmJiAoIW5lZWRzVmVyZGljdCB8fCAhbGVhdmVzU3RyaW5nQWJvdmUoY29tbWl0TG9nW2ldLCBrZXkpKSkgcmV0dXJuIGNvbW1pdExvZ1tpXTtcbiAgICBpZiAobmVlZHNWZXJkaWN0KSB7XG4gICAgICBjb25zdCBhdCA9IGxvZ01vZGVsKGNvbW1pdExvZykubGFzdFdyaXRlckJlZm9yZShrZXksIGVuZCk7XG4gICAgICByZXR1cm4gYXQgPj0gMCA/IGNvbW1pdExvZ1thdF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBXaGF0IHtAbGluayB3cml0ZXJzT2Z9IGlzIGFza2VkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXcml0ZXJzT3B0aW9ucyB7XG4gIC8qKiBUaGUgbGFzdCBjb21taXQgQVJSQVkgaW5kZXggY29uc2lkZXJlZCwgaW5jbHVzaXZlLiBEZWZhdWx0OiB0aGUgd2hvbGUgbG9nLiAqL1xuICByZWFkb25seSBlbmQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIEFSUkFZIHBvc2l0aW9ucyAoYXNjZW5kaW5nKSBvZiBldmVyeSBjb21taXQgaW4gYGNvbW1pdExvZ1swLi5lbmRdYCB0aGF0IFdST1RFIGBrZXlgIOKAlCB0aGVcbiAqIHdyaXRlciBydWxlIG9mIGBrZXlQYXRocy50c2AsIHRoZSBvbmUgZGVmaW5pdGlvbiBldmVyeSBrZXkgcXVlcnkgc2hhcmVzIChgbG9nTW9kZWwudHNgIGFwcGxpZXMgaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVyc09mKGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sIGtleTogc3RyaW5nLCBvcHRpb25zOiBXcml0ZXJzT3B0aW9ucyA9IHt9KTogbnVtYmVyW10ge1xuICBjb25zdCBlbmQgPSBvcHRpb25zLmVuZCA/PyBjb21taXRMb2cubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGxvZ01vZGVsKGNvbW1pdExvZylcbiAgICAud3JpdGVyc09mKGtleSlcbiAgICAuZmlsdGVyKChpKSA9PiBpIDw9IGVuZCk7XG59XG5cbi8qKlxuICogRXZlcnkgcm93IHVuZGVyIGBrZXlgJ3MgVE9QLUxFVkVMIGtleSBpbiBgY29tbWl0TG9nWzAuLmVuZF1gLCBpbiBjb21taXQgb3JkZXIg4oCUIHRoZSByb3dzIHRoZSB2YWx1ZVxuICogcnVsZSBmb2xkcyAoe0BsaW5rIGZvbGRLZXl9KSwgZWFjaCB3aXRoIGl0cyB7QGxpbmsgVG91Y2gucmVsYXRpb259IHRvIGBrZXlgIChhYnNlbnQgZm9yIGEgc2libGluZ1xuICogdW5kZXIgdGhlIHNhbWUgdG9wLWxldmVsIGtleTogYXBwbGllZCwgbm90IG9ic2VydmVkKSDigJQgZm91bmQgdGhyb3VnaCB0aGUgbG9nJ3MgaW5kZXguIEEgcm93IHdob3NlXG4gKiB2ZXJiIGlzIG5vdCBvbmUgb2YgdGhlIGZvdXIgaXMgcmVmdXNlZCB3aXRoIHtAbGluayBVbmtub3duVmVyYkVycm9yfSBuYW1pbmcgdGhlIHJvdyDigJQgd2hldGhlciBvclxuICogbm90IHRoZSBmb2xkIHdvdWxkIGhhdmUgcmVhY2hlZCBpdDogdGhlIGFuc3dlciBtdXN0IG5vdCBkZXBlbmQgb24gd2hlcmUgYW4gb3B0aW1pc2F0aW9uIHN0YXJ0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvd3NVbmRlclJvb3QoY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSwga2V5OiBzdHJpbmcsIGVuZDogbnVtYmVyKTogVG91Y2hbXSB7XG4gIHJldHVybiBsb2dNb2RlbChjb21taXRMb2cpLnJvd3NVbmRlclJvb3Qoa2V5LCBlbmQpO1xufVxuXG4vKipcbiAqIFJlY29uc3RydWN0IHRoZSBGVUxMIHZhbHVlIG9mIGBrZXlgIGFzIG9mIGNvbW1pdCBhcnJheSBpbmRleCBgaWR4YFxuICogKGluY2x1c2l2ZSkg4oCUIHRoZSBtaWdyYXRpb24gaGVscGVyIGZvciB0aGUgXCJyZWFkIGBidW5kbGUub3ZlcndyaXRlW2tleV1gXG4gKiBhcyB0aGUgZnVsbCB2YWx1ZSB3cml0dGVuXCIgcGF0dGVybiAoIzEzYy1CKS5cbiAqXG4gKiBUaGUgdmFsdWUgcnVsZSAoYGtleVBhdGhzLnRzYCwgOS4zMy4wKTogZXZlcnkgcm93IHVuZGVyIHRoZSBrZXkncyBUT1AtTEVWRUxcbiAqIGtleSBpbiBgY29tbWl0TG9nWzAuLmlkeF1gIGlzIGZvbGRlZCwgYW5jaG9yZWQgYXQgdGhhdCBrZXkncyBsYXN0IGBzZXRgIC9cbiAqIGBkZWxldGVgLCB3aXRoIHRoZSBTQU1FIHN0ZXAgYW5kIGNsb25lIGRpc2NpcGxpbmUgdGhlIHJlcGxheSB1c2VzXG4gKiAoYHZlcmJzLnRzYCDCtyBgZm9sZEtleWApLCBhbmQgdGhlIHJlc3VsdCBpcyByZWFkIGF0IGBrZXlgLiBTbyB0aGUgYW5zd2VyIGlzXG4gKiB0aGUgdmFsdWUgYHN0YXRlQXRgIGdpdmVzIGF0IHRoYXQgcGF0aCB3aGVuIGl0IGZvbGRzIHRoZSBsb2cgYWxvbmUg4oCUIHJvd3NcbiAqIElOU0lERSB0aGUga2V5IChhIHN1YmZsb3cgc2VlZCwgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2spIGFuZCBBUk9VTkQgaXQgKGFcbiAqIGBzZXRgIG9mIHRoZSBjb250YWluZXIpIGNvdW50OyBiZWZvcmUgOS4zMy4wIG9ubHkgcm93cyBvbiB0aGUgZXhhY3QgcGF0aCBkaWQsXG4gKiBhbmQgYSBzZWVkZWQgYGNmZ2AgcmVhZCBhcyBgdW5kZWZpbmVkYC4gVW5kZXIgYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsIGFuXG4gKiBgYXBwZW5kYCByb3cncyBgb3ZlcndyaXRlW2tleV1gIGhvbGRzIG9ubHkgdGhlIFRBSUw7IHRoZSBmb2xkIHB1dHMgdGhlIGFycmF5XG4gKiBiYWNrIHRvZ2V0aGVyLiBUd28gYG1lcmdlYCByb3dzIG9mIG9uZSBidW5kbGUgc2VlIG9uZSBjb3B5IG9mIHRoZSBidW5kbGUnc1xuICogZGVsdGEsIGFzIHRoZSByZXBsYXkncyBkby5cbiAqXG4gKiBAcGFyYW0ga2V5ICBBIERFTElNLWpvaW5lZCBwYXRoIChgbm9ybWFsaXNlUGF0aGApOyBhIHRvcC1sZXZlbCBrZXkgaXMgYVxuICogICBvbmUtc2VnbWVudCBwYXRoLlxuICogQHBhcmFtIGlkeCAgQ29tbWl0QnVuZGxlIEFSUkFZIGluZGV4ICh0aGUgYGJ1bmRsZS5pZHhgIHBvc2l0aW9uKSxcbiAqICAgaW5jbHVzaXZlLiBOT1QgdGhlIGV4ZWN1dGlvbkluZGV4IGZyb20gYSBydW50aW1lU3RhZ2VJZC5cbiAqIEByZXR1cm5zIFRoZSByZWNvbnN0cnVjdGVkIHZhbHVlIChhIGRldGFjaGVkIGNsb25lKSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBub1xuICogICByb3cgaW4gYGNvbW1pdExvZ1swLi5pZHhdYCBpcyBvbiwgaW5zaWRlIG9yIGFyb3VuZCB0aGUga2V5LCBvciB0aGUgZm9sZFxuICogICBsZWF2ZXMgaXQgYWJzZW50IChpdHMgbGFzdCB3cml0ZSB3YXMgYSBkZWxldGUpLiBDYXZlYXQ6IGEga2V5IHRoYXQgaGVsZCBhXG4gKiAgIHZhbHVlIGluIHRoZSBydW4ncyBJTklUSUFMIHN0YXRlIGZvbGRzIGZyb20gYWJzZW50IGhlcmUg4oCUIHRoZSBsb2cgYWxvbmVcbiAqICAgY2Fubm90IHNlZSB0aGUgcHJlLXJ1biBiYXNlLCBzbyBtZXJnZXMgYW5kIG5lc3RlZCB3cml0ZXMgb250byBhIHNlZWRlZCBrZXlcbiAqICAgZ2l2ZSBvbmx5IHdoYXQgdGhleSBhZGRlZC4gU2luY2UgOS4xNy4wIHRoZSBiYXNlIFRSQVZFTFMgd2l0aCB0aGUgbG9nOlxuICogICBgc3RhdGVBdChzbmFwc2hvdCwgaWR4KWAgKGZvb3RwcmludGpzL3RyYWNlKSBmb2xkcyBmcm9tXG4gKiAgIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYCwgd2hpY2ggdGhpcyBmdW5jdGlvbiBuZXZlciByZWNlaXZlcy5cbiAqIEB0aHJvd3Mge0BsaW5rIFVua25vd25WZXJiRXJyb3J9IHdoZW4gYSByb3cgdW5kZXIgdGhlIGtleSdzIHRvcC1sZXZlbCBrZXlcbiAqICAgY2FycmllcyBhIHZlcmIgb3RoZXIgdGhhbiBgc2V0IHwgbWVyZ2UgfCBhcHBlbmQgfCBkZWxldGVgIOKAlCBhIGZvcmVpZ24gb3JcbiAqICAgY29ycnVwdGVkIGxvZyBpcyByZWZ1c2VkLCBub3QgZm9sZGVkIGFzIGEgYG1lcmdlYC4gRW5naW5lLXdyaXR0ZW4gbG9nc1xuICogICBuZXZlciBjYXJyeSBvbmUuXG4gKiBAc2VlIGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMg4oCUIHRoZSBzYW1lIGFuc3dlciwgd2l0aCB0aGUgY29kZXMgdGhhdCBzYXkgV0hZIGl0IGlzXG4gKiAgIGB1bmRlZmluZWRgIG9yIHBhcnRpYWwgKGFuZCB0aGUgYGluaXRpYWxTdGF0ZWAgYmFzZSB0aGlzIGZ1bmN0aW9uIG5ldmVyIHJlY2VpdmVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdFZhbHVlQXQoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSwgaWR4OiBudW1iZXIsIGtleTogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKGlkeCwgY29tbWl0TG9nLmxlbmd0aCAtIDEpO1xuICBjb25zdCBtb2RlbCA9IG1lbW9pc2VkTW9kZWwoY29tbWl0TG9nKTtcbiAgaWYgKG1vZGVsICE9PSB1bmRlZmluZWQpIHJldHVybiBtb2RlbC52YWx1ZUF0KGtleSwgZW5kKTtcbiAgcmV0dXJuIHZhbHVlQnlTY2FuKGNvbW1pdExvZywgZW5kLCBrZXkpO1xufVxuXG4vLyDilIDilIAgVGhlIGJhc2lzIHR3aW5zIChGNGIsIDkuMzMuMCk6IHRoZSBzYW1lIGFuc3dlciwgYW5kIHRoZSBjb2RlcyB0aGF0IHNheSB3aHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogV2h5IHtAbGluayBjb21taXRWYWx1ZUF0V2l0aEJhc2lzfSBhbnN3ZXJlZCB3aGF0IGl0IGRpZC4gRWFjaCBjb2RlIGlzIHJlZ2lzdGVyZWQsIHdpdGggdGhlIG9uZVxuICogc2VudGVuY2UgdGhhdCBzYXlzIHdoYXQgaXQgbWVhbnMsIGluIGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCAoc2VydmVkIG9uXG4gKiBgZm9vdHByaW50anMvdHJhY2VgKTsgdGhlIHVuaW9uIGRlY2xhcmVzIGl0cyBtZW1iZXJzIHRocm91Z2ggYFJlZ2lzdGVyZWRDb2RlYC5cbiAqXG4gKiAtIGAnbmV2ZXItd3JpdHRlbidgICAgICAg4oCUIG5vIGNvbW1pdCBpbiByYW5nZSB3cm90ZSB0aGUga2V5ICh0aGUgd3JpdGVyIHJ1bGUg4oCUIHRoZSBhbnN3ZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmaW5kTGFzdFdyaXRlcmAgYW5kIHRoZSBzbGljZSBsYXllciBnaXZlKSwgdW5sZXNzIHRoZSBydW4gcmVtb3ZlZCBhIHZhbHVlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFzc2VkIGBpbml0aWFsU3RhdGVgIGhlbGQgKHRoZW4gYCdkZWxldGVkJ2ApLCBvciBhIHJlZGFjdGlvbiBhdCBvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJvdW5kIHRoZSBrZXkgaGlkIHRoZSB3cml0ZSAodGhlbiBgJ3JlZGFjdGVkJ2AgYWxvbmUpLlxuICogLSBgJ2RlbGV0ZWQnYCAgICAgICAgICAgIOKAlCB0aGUgYW5zd2VyIGlzIGB1bmRlZmluZWRgIGFuZCB0aGUga2V5IFdBUyB3cml0dGVuOiBpdHMgbGFzdCB3cml0ZSBsZWZ0IGl0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNlbnQuXG4gKiAtIGAnbmVzdGVkLXJvd3MnYCAgICAgICAg4oCUIHRoZSB2YWx1ZSByZXN0cyBvbiByb3dzIElOU0lERSB0aGUga2V5IChhIHN1YmZsb3cgc2VlZCwgYW4gb3V0cHV0TWFwcGVyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZS1iYWNrLCBhIGZvcmsgY2hpbGQncyBuYW1lc3BhY2UpIHdpdGggbm8gYHNldGAvYGRlbGV0ZWAgb2YgdGhlIGtleSBvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYSBjb250YWluZXIgYXJvdW5kIGl0IGluIHJhbmdlLlxuICogLSBgJ2Zyb20taW5pdGlhbC1zdGF0ZSdgIOKAlCBubyBgc2V0YC9gZGVsZXRlYCBvZiB0aGUga2V5IG9yIGFyb3VuZCBpdCBpbiByYW5nZSwgc28gdGhlIHZhbHVlIHJlc3RzIG9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJlLXJ1biBiYXNlOiBmb2xkZWQgZnJvbSBgb3B0aW9ucy5pbml0aWFsU3RhdGVgIHdoZW4gaXQgaG9sZHMgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkncyB0b3AtbGV2ZWwga2V5LCBwYXJ0aWFsIHdoZW4gbm8gYGluaXRpYWxTdGF0ZWAgd2FzIHBhc3NlZC5cbiAqIC0gYCdyZWRhY3RlZCdgICAgICAgICAgICDigJQgYSBwYXRoIGF0LCBpbnNpZGUgb3IgYXJvdW5kIHRoZSBrZXkgaXMgaW4gdGhlIGByZWRhY3RlZFBhdGhzYCBvZiBhIGNvbW1pdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIHJlc3RzIG9uIChmcm9tIGl0cyBsYXN0IGBzZXRgL2BkZWxldGVgIG9uLCBvciB0aGUgd2hvbGUgcmFuZ2UpLlxuICovXG5leHBvcnQgdHlwZSBWYWx1ZUJhc2lzID0gUmVnaXN0ZXJlZENvZGU8XG4gICduZXZlci13cml0dGVuJyB8ICdkZWxldGVkJyB8ICduZXN0ZWQtcm93cycgfCAnZnJvbS1pbml0aWFsLXN0YXRlJyB8ICdyZWRhY3RlZCdcbj47XG5cbi8qKiBXaGF0IHtAbGluayBjb21taXRWYWx1ZUF0V2l0aEJhc2lzfSBpcyBhc2tlZCBiZXNpZGVzIHRoZSBsb2csIHRoZSBpbmRleCBhbmQgdGhlIGtleS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWVCYXNpc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHN0YXRlIGJlZm9yZSB0aGUgcnVuIOKAlCBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAgKG9yIGEgc3ViZmxvdydzXG4gICAqIGB0cmVlQ29udGV4dC5pbml0aWFsU3RhdGVgKS4gV2hlbiBnaXZlbiwgYSBrZXkgd2l0aCBubyBgc2V0YC9gZGVsZXRlYCBpbiByYW5nZSBmb2xkcyBmcm9tIGl0LCBhc1xuICAgKiBgc3RhdGVBdGAgZG9lczsgd2hlbiBhYnNlbnQsIHN1Y2ggYW4gYW5zd2VyIGlzIHRoZSBsb2ctb25seSBmb2xkIGFuZCBjYXJyaWVzIGAnZnJvbS1pbml0aWFsLXN0YXRlJ2AuXG4gICAqL1xuICByZWFkb25seSBpbml0aWFsU3RhdGU/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59XG5cbi8qKiBBIGtleSdzIHZhbHVlIHJlYWQgb2ZmIHRoZSBsb2csIGFuZCB0aGUgY29kZXMgdGhhdCBzYXkgd2hhdCBpdCByZXN0cyBvbiDigJQgYWJzZW50IGNvZGVzID0gYW4gZXhhY3QgYW5zd2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWx1ZVdpdGhCYXNpcyB7XG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xuICAvKiogSW4gdGhlIG9yZGVyIG9mIHtAbGluayBWYWx1ZUJhc2lzfSdzIGxpc3Q7IEVNUFRZIHdoZW4gYSBgc2V0YC9gZGVsZXRlYCBvZiB0aGUga2V5IG9yIGFyb3VuZCBpdCBhbmNob3JzIHRoZSB2YWx1ZSBhbmQgbm8gcmVkYWN0aW9uIHRvdWNoZWQgaXQuICovXG4gIHJlYWRvbmx5IGJhc2lzOiBWYWx1ZUJhc2lzW107XG59XG5cbmNvbnN0IFZBTFVFX0JBU0lTX09SREVSOiByZWFkb25seSBWYWx1ZUJhc2lzW10gPSBbXG4gICduZXZlci13cml0dGVuJyxcbiAgJ2RlbGV0ZWQnLFxuICAnbmVzdGVkLXJvd3MnLFxuICAnZnJvbS1pbml0aWFsLXN0YXRlJyxcbiAgJ3JlZGFjdGVkJyxcbl07XG5cbi8qKlxuICoge0BsaW5rIGNvbW1pdFZhbHVlQXR9LCB3aXRoIHRoZSBjb2RlcyB0aGF0IHNheSB3aGF0IHRoZSBhbnN3ZXIgcmVzdHMgb24uIFdpdGhvdXQgYG9wdGlvbnMuaW5pdGlhbFN0YXRlYFxuICogdGhlIHZhbHVlIElTIGBjb21taXRWYWx1ZUF0KGNvbW1pdExvZywgaWR4LCBrZXkpYCAocGlubmVkIGJ5IGEgcHJvcGVydHkpOyB3aXRoIGl0LCBhIGtleSB0aGF0IGhhcyBub1xuICogYHNldGAvYGRlbGV0ZWAgb2YgaXRzZWxmIG9yIG9mIGEgY29udGFpbmVyIGFyb3VuZCBpdCBpbiByYW5nZSBmb2xkcyBmcm9tIHRoYXQgYmFzZSDigJQgdGhlIHZhbHVlXG4gKiBgc3RhdGVBdChzbmFwc2hvdCwgaWR4KWAgZ2l2ZXMgYXQgdGhlIGtleS4gUmVmdXNlcyBhbiB1bmtub3duIHZlcmIgZXhhY3RseSBhcyBgY29tbWl0VmFsdWVBdGAgZG9lcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyB2YWx1ZSwgYmFzaXMgfSA9IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMoc25hcC5jb21taXRMb2csIGksICdjZmcnLCB7IGluaXRpYWxTdGF0ZTogc25hcC5pbml0aWFsU3RhdGUgfSk7XG4gKiBmb3IgKGNvbnN0IGNvZGUgb2YgYmFzaXMpIGNvbnNvbGUubG9nKGNvZGUsIEhPTkVTVFlfQ09ERVNbY29kZV0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21taXRWYWx1ZUF0V2l0aEJhc2lzKFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICBpZHg6IG51bWJlcixcbiAga2V5OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFZhbHVlQmFzaXNPcHRpb25zID0ge30sXG4pOiBWYWx1ZVdpdGhCYXNpcyB7XG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKGlkeCwgY29tbWl0TG9nLmxlbmd0aCAtIDEpO1xuICBjb25zdCBtb2RlbCA9IGxvZ01vZGVsKGNvbW1pdExvZyk7XG4gIGNvbnN0IHJvd3MgPSBtb2RlbC5yb3dzVW5kZXJSb290KGtleSwgZW5kKTtcbiAgLy8gVGhlIGxhc3QgYHNldGAvYGRlbGV0ZWAgT04gdGhlIGtleSBvciBBUk9VTkQgaXQgZGVjaWRlcyB0aGUgdmFsdWUgYWxvbmU7IHJvd3MgaW5zaWRlIGFmdGVyIGl0IHJlZmluZSBpdC5cbiAgbGV0IGFuY2hvciA9IC0xO1xuICBsZXQgaW5zaWRlID0gZmFsc2U7XG4gIGxldCBsYXN0UmVsYXRlZDogVG91Y2ggfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHIgPSByb3dzW2ldLnJlbGF0aW9uO1xuICAgIGlmIChyID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGxhc3RSZWxhdGVkID0gcm93c1tpXTtcbiAgICBpZiAociA9PT0gJ2luc2lkZScpIGluc2lkZSA9IHRydWU7XG4gICAgZWxzZSBpZiAoaXNUb3RhbChyb3dzW2ldLnZlcmIpKSB7XG4gICAgICBhbmNob3IgPSBpO1xuICAgICAgaW5zaWRlID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJvb3QgPSByb290T2Yoa2V5KTtcbiAgY29uc3QgYmFzZSA9IG9wdGlvbnMuaW5pdGlhbFN0YXRlO1xuICBjb25zdCBiYXNlSG9sZHNSb290ID0gYmFzZSAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiYXNlLCByb290KTtcbiAgY29uc3QgdmFsdWUgPVxuICAgIGFuY2hvciA9PT0gLTEgJiYgYmFzZUhvbGRzUm9vdFxuICAgICAgPyBmb2xkS2V5KHJvd3MsIGtleS5zcGxpdChERUxJTSksIHsgYW5jaG9yZWQ6IHRydWUsIHN0YXJ0OiBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZVtyb290XSkgfSlcbiAgICAgIDogbW9kZWwudmFsdWVBdChrZXksIGVuZCk7XG5cbiAgY29uc3QgY29kZXMgPSBuZXcgU2V0PFZhbHVlQmFzaXM+KCk7XG4gIC8vIFRoZSB3cml0ZXIgcnVsZSBkZWNpZGVzICduZXZlci13cml0dGVuJyAoYXMgaXQgZG9lcyBmb3IgYGZpbmRMYXN0V3JpdGVyYCBhbmQgdGhlIHNsaWNlIGxheWVyKSwgd2l0aCB0d29cbiAgLy8gY29ycmVjdGlvbnMgb25seSB0aGUgYmFzZSBhbmQgdGhlIHJlZGFjdGlvbiBsaXN0IGNhbiBtYWtlOlxuICAvLyAgIC0gdGhlIHJ1biBSRU1PVkVEIGEgdmFsdWUgdGhlIHBhc3NlZCBiYXNlIGhlbGQgKGEgYGRlbGV0ZWAg4oCUIGZ1bGwgbW9kZSBzcGVsbHMgaXQgYSBgc2V0YCDigJQgb3IgYSBgc2V0YCBvZlxuICAvLyAgICAgYSBjb250YWluZXIgd2l0aG91dCB0aGUga2V5KTogdGhlIGxvZy1vbmx5IHZlcmRpY3Qgc2VlcyBhYnNlbnQg4oaSIGFic2VudCwgdGhlIHRydXRoIGlzICdkZWxldGVkJztcbiAgLy8gICAtIGEgcmVkYWN0aW9uIGF0IG9yIGFyb3VuZCB0aGUga2V5IEhJRCB0aGUgd3JpdGUgKGEgcGxhY2Vob2xkZXIgc3RyaW5nIHJlcGxhY2VkIHRoZSBjb250YWluZXIpOiB0aGVcbiAgLy8gICAgIGxvZyBjYW5ub3Qgc2F5IHdoZXRoZXIgdGhlIGtleSB3YXMgd3JpdHRlbiwgc28gdGhlIGFuc3dlciBzYXlzICdyZWRhY3RlZCcgYW5kIG5vdGhpbmcgZWxzZSBhYm91dCBpdC5cbiAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gIGNvbnN0IHJlZCA9IHJlZGFjdGlvbnNJblJhbmdlKGNvbW1pdExvZywga2V5LCBhbmNob3IgPT09IC0xID8gMCA6IHJvd3NbYW5jaG9yXS5jb21taXRJZHgsIGVuZCk7XG4gIGNvbnN0IGRlbGV0ZWRCeVJvdyA9IGxhc3RSZWxhdGVkICE9PSB1bmRlZmluZWQgJiYgbGFzdFJlbGF0ZWQucmVsYXRpb24gIT09ICdpbnNpZGUnICYmIGxhc3RSZWxhdGVkLnZlcmIgPT09ICdkZWxldGUnO1xuICBjb25zdCBiYXNlSGVsZEtleSA9IGJhc2UgIT09IHVuZGVmaW5lZCAmJiBuYXRpdmVHZXQoYmFzZSwgc2VncykgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVtb3ZlZEZyb21CYXNlID0gYmFzZUhlbGRLZXkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhcmVkLmFueSAmJiAoYW5jaG9yICE9PSAtMSB8fCBkZWxldGVkQnlSb3cpO1xuICBjb25zdCB3cml0dGVuID0gKGVuZCA+PSAwICYmIG1vZGVsLmxhc3RXcml0ZXJCZWZvcmUoa2V5LCBlbmQgKyAxKSAhPT0gLTEpIHx8IHJlbW92ZWRGcm9tQmFzZTtcbiAgaWYgKCF3cml0dGVuKSB7XG4gICAgaWYgKCFyZWQuaGlkZGVuKSBjb2Rlcy5hZGQoJ25ldmVyLXdyaXR0ZW4nKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIChkZWxldGVkQnlSb3cgfHwgcmVtb3ZlZEZyb21CYXNlIHx8ICFyZWQuYW55KSkgY29kZXMuYWRkKCdkZWxldGVkJyk7XG4gIGlmIChhbmNob3IgPT09IC0xICYmIGluc2lkZSkgY29kZXMuYWRkKCduZXN0ZWQtcm93cycpO1xuICBpZiAoYW5jaG9yID09PSAtMSAmJiAoYmFzZSA9PT0gdW5kZWZpbmVkIHx8IGJhc2VIb2xkc1Jvb3QpKSBjb2Rlcy5hZGQoJ2Zyb20taW5pdGlhbC1zdGF0ZScpO1xuICBpZiAocmVkLmFueSkgY29kZXMuYWRkKCdyZWRhY3RlZCcpO1xuICByZXR1cm4geyB2YWx1ZSwgYmFzaXM6IFZBTFVFX0JBU0lTX09SREVSLmZpbHRlcigoYykgPT4gY29kZXMuaGFzKGMpKSB9O1xufVxuXG4vKipcbiAqIFRoZSByZWRhY3RlZCBwYXRocyBvZiB0aGUgY29tbWl0cyBpbiBgW2Zyb20sIGVuZF1gIGFnYWluc3QgYGtleWA6IGBhbnlgIOKAlCBvbmUgYXQsIGluc2lkZSBvciBhcm91bmQgaXQ7XG4gKiBgaGlkZGVuYCDigJQgb25lIEFUIG9yIEFST1VORCBpdCAoYSBwbGFjZWhvbGRlciByZXBsYWNlZCB0aGUga2V5IG9yIGl0cyBjb250YWluZXIsIHNvIHRoZSB3cml0ZSBpcyBoaWRkZW4pLlxuICovXG5mdW5jdGlvbiByZWRhY3Rpb25zSW5SYW5nZShcbiAgY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSxcbiAga2V5OiBzdHJpbmcsXG4gIGZyb206IG51bWJlcixcbiAgZW5kOiBudW1iZXIsXG4pOiB7IGFueTogYm9vbGVhbjsgaGlkZGVuOiBib29sZWFuIH0ge1xuICBsZXQgYW55ID0gZmFsc2U7XG4gIGZvciAobGV0IGMgPSBmcm9tOyBjIDw9IGVuZDsgYysrKSB7XG4gICAgZm9yIChjb25zdCBwIG9mIGNvbW1pdExvZ1tjXS5yZWRhY3RlZFBhdGhzID8/IFtdKSB7XG4gICAgICBjb25zdCByID0gcmVsYXRpb24ocCwga2V5KTtcbiAgICAgIGlmIChyID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgYW55ID0gdHJ1ZTtcbiAgICAgIGlmIChyICE9PSAnaW5zaWRlJykgcmV0dXJuIHsgYW55LCBoaWRkZW46IHRydWUgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgYW55LCBoaWRkZW46IGZhbHNlIH07XG59XG5cbi8qKlxuICogV2h5IHtAbGluayBmaW5kTGFzdFdyaXRlcldpdGhCYXNpc30gYW5zd2VyZWQgd2hhdCBpdCBkaWQg4oCUIHJlZ2lzdGVyZWQgaW4gYEhPTkVTVFlfQ09ERVNgOlxuICogYCduZXZlci13cml0dGVuJ2AgKG5vIHdyaXRlciBiZWZvcmUgdGhlIGJvdW5kKSwgYCduZXN0ZWQtcm93cydgICh0aGUgd3JpdGVyIHJlYWNoZWQgdGhlIGtleSBvbmx5XG4gKiB0aHJvdWdoIHJvd3MgaW5zaWRlIGl0LCBzbyBpdCB3cm90ZSBwYXJ0IG9mIHRoZSB2YWx1ZSksIGAncmVkYWN0ZWQnYCAobm8gd3JpdGVyIHRoZSBsb2cgY2FuIHNlZSwgYmVjYXVzZSBhXG4gKiByZWRhY3Rpb24gYXQgb3IgYXJvdW5kIHRoZSBrZXkgaGlkIHRoZSB3cml0ZSDigJQgdGhlIHJ1bGUgYGNvbW1pdFZhbHVlQXRXaXRoQmFzaXNgIGZvbGxvd3MpLlxuICovXG5leHBvcnQgdHlwZSBXcml0ZXJCYXNpcyA9IFJlZ2lzdGVyZWRDb2RlPCduZXZlci13cml0dGVuJyB8ICduZXN0ZWQtcm93cycgfCAncmVkYWN0ZWQnPjtcblxuLyoqIFRoZSBsYXN0IHdyaXRlciBvZiBhIGtleSwgYW5kIHRoZSBjb2RlcyB0aGF0IHNheSB3aGF0IGtpbmQgb2Ygd3JpdGUgaXQgd2FzIOKAlCBhYnNlbnQgY29kZXMgPSBhIHdyaXRlIG9uIG9yIGFyb3VuZCB0aGUga2V5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBXcml0ZXJXaXRoQmFzaXMge1xuICAvKiogQWJzZW50IGV4YWN0bHkgd2hlbiBgYmFzaXNgIGhvbGRzIGAnbmV2ZXItd3JpdHRlbidgIG9yIGAncmVkYWN0ZWQnYC4gKi9cbiAgcmVhZG9ubHkgd3JpdGVyPzogQ29tbWl0QnVuZGxlO1xuICByZWFkb25seSBiYXNpczogV3JpdGVyQmFzaXNbXTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgZmluZExhc3RXcml0ZXJ9LCB3aXRoIHRoZSBjb2RlIHRoYXQgc2F5cyB3aHk6IGB3cml0ZXJgIGlzIGBmaW5kTGFzdFdyaXRlcihjb21taXRMb2csIGtleSwgYmVmb3JlSWR4KWA7XG4gKiBgYmFzaXNgIGlzIGBbJ25ldmVyLXdyaXR0ZW4nXWAgd2hlbiB0aGVyZSBpcyBub25lIGFuZCBgWyduZXN0ZWQtcm93cyddYCB3aGVuIHRoYXQgY29tbWl0IHdyb3RlIHRoZSBrZXlcbiAqIG9ubHkgdGhyb3VnaCByb3dzIGluc2lkZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0V3JpdGVyV2l0aEJhc2lzKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIGtleTogc3RyaW5nLCBiZWZvcmVJZHg/OiBudW1iZXIpOiBXcml0ZXJXaXRoQmFzaXMge1xuICBjb25zdCB3cml0ZXIgPSBmaW5kTGFzdFdyaXRlcihjb21taXRMb2csIGtleSwgYmVmb3JlSWR4KTtcbiAgaWYgKHdyaXRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4oYmVmb3JlSWR4ID8/IGNvbW1pdExvZy5sZW5ndGgsIGNvbW1pdExvZy5sZW5ndGgpIC0gMTtcbiAgICByZXR1cm4geyBiYXNpczogW3JlZGFjdGlvbnNJblJhbmdlKGNvbW1pdExvZywga2V5LCAwLCBlbmQpLmhpZGRlbiA/ICdyZWRhY3RlZCcgOiAnbmV2ZXItd3JpdHRlbiddIH07XG4gIH1cbiAgcmV0dXJuIHsgd3JpdGVyLCBiYXNpczogd3JpdGVzT25seUluc2lkZSh3cml0ZXIsIGtleSkgPyBbJ25lc3RlZC1yb3dzJ10gOiBbXSB9O1xufVxuXG4vKipcbiAqIHtAbGluayBjb21taXRWYWx1ZUF0fSBvbiBhIGxvZyB0aGF0IGlzIG5vdCBmcm96ZW46IHJlZnVzZSBhbiB1bmtub3duIHZlcmIgdW5kZXIgdGhlIHRvcC1sZXZlbCBrZXksXG4gKiB0aGVuIHNjYW4gYmFjayBmcm9tIGBlbmRgIHRvIHRoZSBsYXN0IGBzZXRgIE9OIHRoZSBrZXksIGtlZXBpbmcgdGhlIHJvd3Mgb24gYW5kIGluc2lkZSBpdCDigJQgZW5vdWdoXG4gKiB3aGlsZSBub3RoaW5nIEFST1VORCB0aGUga2V5IHdhcyB3cml0dGVuIGluIGJldHdlZW4gKGFuZCwgZm9yIGEgbmVzdGVkIGtleSwgbm8gYGRlbGV0ZWAgb24gaXQ6IGFcbiAqIGBkZWxldGVgIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lcikuIE90aGVyd2lzZSB0aGUgbW9kZWwgZm9sZHMgdGhlIHRvcC1sZXZlbCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHZhbHVlQnlTY2FuKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIGVuZDogbnVtYmVyLCBrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCByb290ID0gcm9vdE9mKGtleSk7XG4gIGZvciAobGV0IGMgPSAwOyBjIDw9IGVuZDsgYysrKSB7XG4gICAgY29uc3QgdHJhY2UgPSBjb21taXRMb2dbY10udHJhY2U7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHRyYWNlLmxlbmd0aDtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0cmFjZS5sZW5ndGg7IHJvdysrKSB7XG4gICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICBpZiAoKHBhdGggPT09IHJvb3QgfHwgcmVsYXRpb24ocGF0aCwgcm9vdCkgPT09ICdpbnNpZGUnKSAmJiAhaXNWZXJiKHZlcmIpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIsIHsgcGF0aCwgcm93LCBjb21taXQ6IGMgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IG5lc3RlZCA9IHJvb3QgIT09IGtleTtcbiAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICBsZXQgYW5jaG9yZWQgPSBmYWxzZTtcbiAgZm9yIChsZXQgYyA9IGVuZDsgYyA+PSAwICYmICFhbmNob3JlZDsgYy0tKSB7XG4gICAgY29uc3QgdHJhY2UgPSBjb21taXRMb2dbY10udHJhY2U7XG4gICAgZm9yIChsZXQgcm93ID0gdHJhY2UubGVuZ3RoIC0gMTsgcm93ID49IDA7IHJvdy0tKSB7XG4gICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICBjb25zdCByID0gcmVsYXRpb24ocGF0aCwga2V5KTtcbiAgICAgIGlmIChyID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKHIgPT09ICdhcm91bmQnIHx8IChuZXN0ZWQgJiYgciA9PT0gJ2V4YWN0JyAmJiB2ZXJiID09PSAnZGVsZXRlJykpIHtcbiAgICAgICAgcmV0dXJuIGxvZ01vZGVsKGNvbW1pdExvZykudmFsdWVBdChrZXksIGVuZCk7XG4gICAgICB9XG4gICAgICByb3dzLnB1c2goeyB2ZXJiOiB2ZXJiIGFzIFRvdWNoWyd2ZXJiJ10sIGJ1bmRsZTogY29tbWl0TG9nW2NdLCBjb21taXRJZHg6IGMsIHBhdGgsIHJlbGF0aW9uOiByIH0pO1xuICAgICAgaWYgKHIgPT09ICdleGFjdCcgJiYgKHZlcmIgPT09ICdzZXQnIHx8IHZlcmIgPT09ICdkZWxldGUnKSkge1xuICAgICAgICBhbmNob3JlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBmb2xkS2V5KHJvd3MucmV2ZXJzZSgpLCBrZXkuc3BsaXQoREVMSU0pKTtcbn1cblxuLyoqXG4gKiBQb3NpdGlvbiBpbmRleCBvdmVyIGEgY29tbWl0IGxvZzogYHJ1bnRpbWVTdGFnZUlkYCDihpIgdGhlIEFSUkFZIElOREVYIG9mIHRoZVxuICogRklSU1QgYnVuZGxlIHRoYXQgc3RhZ2UgY29tbWl0dGVkLlxuICpcbiAqIFwiRmlyc3RcIiBpcyB0aGUgY29udHJhY3QsIGFuZCBpdCBpcyBsb2FkLWJlYXJpbmcuIEEgc3RhZ2Ugbm9ybWFsbHkgY29tbWl0c1xuICogZXhhY3RseSBvbmUgYnVuZGxlLCBidXQgYSBzdWJmbG93IE1PVU5UIGNvbW1pdHMgdHdvIHRoYXQgc2hhcmUgb25lXG4gKiBgcnVudGltZVN0YWdlSWRgICh0aGUgb3V0cHV0LW1hcHBpbmcgY29tbWl0LCB0aGVuIHRoZSBtb3VudC1leGl0IGNvbW1pdCkuXG4gKiBBIGN1cnNvciBhc2tzIFwid2hlcmUgZG9lcyB0aGlzIHN0YWdlIHN0YXJ0P1wiLCBzbyB0aGUgZmlyc3Qgd2lucyDigJQgdGhlXG4gKiBncm91cGluZyBhIHJlYWRlcidzIGF4aXMgdXNlcyAoYGNvbW1pdFN0b3BzYCkgYW5jaG9ycyBhdCB0aGUgc2FtZSBwbGFjZS5cbiAqXG4gKiBCdWlsZCB0aGlzIE9OQ0Ugd2hlbiByZXNvbHZpbmcgbWFueSBpZHM7IHVzZSB7QGxpbmsgY29tbWl0SW5kZXhPZn0gZm9yIGFcbiAqIHNpbmdsZSBsb29rdXAuXG4gKlxuICogQHBhcmFtIGNvbW1pdExvZyBPcmRlcmVkIGNvbW1pdCBidW5kbGVzIOKAlCBgZ2V0U25hcHNob3QoKS5jb21taXRMb2dgLlxuICogQHJldHVybnMgQSBmcmVzaCBNYXAsIG93bmVkIGJ5IHRoZSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbW1pdEluZGV4KGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgaW5kZXggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1pdExvZy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGlkID0gY29tbWl0TG9nW2ldLnJ1bnRpbWVTdGFnZUlkO1xuICAgIGlmICghaW5kZXguaGFzKGlkKSkgaW5kZXguc2V0KGlkLCBpKTtcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbi8qKlxuICogVGhlIEFSUkFZIElOREVYIG9mIHRoZSBmaXJzdCBjb21taXQgYSBnaXZlbiBgcnVudGltZVN0YWdlSWRgIHByb2R1Y2VkLCBvclxuICogYC0xYCB3aGVuIHRoYXQgc3RhZ2UgaXMgbm90IGluIHRoaXMgbG9nIChgaW5kZXhPZmAgc2VtYW50aWNzIOKAlCB0aGUgbmFtZSdzXG4gKiBwcm9taXNlKS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIGV2ZXJ5IHJlYWRlciBuZWVkcyBhbmQgbm9ib2R5IGV4cG9ydGVkOiBhXG4gKiBgcnVudGltZVN0YWdlSWRgIGlzIHRoZSBpZCBhbiBldmVudCBjYXJyaWVzLCBhIGNvbW1pdCBpbmRleCBpcyB3aGF0XG4gKiBgY29tbWl0VmFsdWVBdGAgLyBgc3RhdGVBdGAgLyBgQ29tbWl0UmFuZ2VJbmRleGAgc3BlYWsuIE8obikg4oCUIGZvciBtYW55XG4gKiBsb29rdXBzIGJ1aWxkIHRoZSBtYXAgb25jZSB3aXRoIHtAbGluayBidWlsZENvbW1pdEluZGV4fS5cbiAqXG4gKiBBIHN0YWdlIHRoYXQgcmFuIGluc2lkZSBhIFNVQkZMT1cgaXMgbm90IGluIHRoZSBydW4tbGV2ZWwgbG9nIChzdWJmbG93c1xuICogY29tbWl0IHRvIHRoZWlyIG93biBpc29sYXRlZCBsb2cpOyBsb29rIGl0IHVwIGluIHRoYXQgc3ViZmxvdydzIG93blxuICogYGhpc3RvcnlgIGluc3RlYWQg4oCUIHNlZSBgZ2V0U3VidHJlZVNuYXBzaG90YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgaWR4ID0gY29tbWl0SW5kZXhPZihzbmFwc2hvdC5jb21taXRMb2csICdzY29yZS1yaXNrIzcnKTtcbiAqIGNvbnN0IGJlZm9yZSA9IGlkeCA+IDAgPyBjb21taXRWYWx1ZUF0KHNuYXBzaG90LmNvbW1pdExvZywgaWR4IC0gMSwgJ3Jpc2snKSA6IHVuZGVmaW5lZDtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0SW5kZXhPZihjb21taXRMb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21taXRMb2cubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY29tbWl0TG9nW2ldLnJ1bnRpbWVTdGFnZUlkID09PSBydW50aW1lU3RhZ2VJZCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuIl19
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0TG9nVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9jb21taXRMb2dVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUlILE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFjLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXBGLGlHQUFpRztBQUNqRyw4RkFBOEY7QUFDOUYsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRiwyRkFBMkY7QUFDM0YsMENBQTBDO0FBRTFDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsU0FBeUIsRUFBRSxPQUFlLEVBQUUsR0FBWTtJQUNqRixJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQztJQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUQsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FB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RUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQWtDO0lBQ2pFLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUMsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQWtDLEVBQUUsY0FBc0I7SUFDdEYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEtBQUssY0FBYztZQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHlwZWQgdXRpbGl0aWVzIGZvciBxdWVyeWluZyB0aGUgY29tbWl0IGxvZy5cbiAqXG4gKiBUaGUgY29tbWl0TG9nIGlzIGFuIG9yZGVyZWQgYXJyYXkgb2YgQ29tbWl0QnVuZGxlIOKAlCBvbmUgcGVyIHN0YWdlIGNvbW1pdC5cbiAqIFRoZXNlIGhlbHBlcnMgcHJvdmlkZSB0eXBlLXNhZmUgcXVlcmllcyB3aXRob3V0IChiOiBhbnkpIGNhc3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tbWl0SWR4IH0gZnJvbSAnLi4vaWRzL3J1bnRpbWVTdGFnZUlkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVnaXN0ZXJlZENvZGUgfSBmcm9tICcuL2hvbmVzdHkuanMnO1xuaW1wb3J0IHsgcXVlcnlXb3JrLCByZWxhdGlvbiwgcm9vdE9mLCB3cml0ZXNPbmx5SW5zaWRlIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQgeyBsZWF2ZXNTdHJpbmdBYm92ZSwgbG9nTW9kZWwsIG1lbW9pc2VkTW9kZWwgfSBmcm9tICcuL2xvZ01vZGVsLmpzJztcbmltcG9ydCB7IG5hdGl2ZUdldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgeyBERUxJTSB9IGZyb20gJy4vcGF0aHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHR5cGUgVG91Y2gsIGZvbGRLZXksIGlzVG90YWwsIGlzVmVyYiwgVW5rbm93blZlcmJFcnJvciB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG4vLyBFdmVyeSBrZXkgcXVlcnkgaGVyZSBmb2xsb3dzIHRoZSB3cml0ZXIgcnVsZSBhbmQgdGhlIHZhbHVlIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCAoRjMsIDkuMzMuMCk6XG4vLyBhIGtleSBpcyB3cml0dGVuIGJ5IGEgcm93IE9OIGl0LCBJTlNJREUgaXQsIG9yIEFST1VORCBpdCB3aGVuIHRoYXQgY2hhbmdlZCBpdCDigJQgbmV2ZXIgYnkgYW5cbi8vIGV4YWN0IHBhdGggbWF0Y2ggYWxvbmUsIHdoaWNoIGNhbGxlZCBldmVyeSBzdWJmbG93IHNlZWQgYW5kIG1lcmdlLWJhY2sgXCJuZXZlciB3cml0dGVuXCIuIFRoZVxuLy8gcmVhZCBtb2RlbCB0aGF0IGFuc3dlcnMgdGhlbSBhdCBhIGNvc3QgcHJvcG9ydGlvbmFsIHRvIHRoZSBhbnN3ZXIgaXMgYGxvZ01vZGVsLnRzYDsgYSBmcm96ZW5cbi8vIGxvZydzIG1vZGVsIGlzIG1lbW9pc2VkLCBhbmQgYSBzaW5nbGUgcXVlc3Rpb24gb24gYSBsb2cgdGhhdCBpcyBub3QgZnJvemVuIGZpcnN0IHRyaWVzIGFcbi8vIGJhY2t3YXJkIHNjYW4gdGhhdCBzdG9wcyBhdCB0aGUgYW5zd2VyLlxuXG4vKipcbiAqIEZpbmQgdGhlIGZpcnN0IGNvbW1pdCBieSBgc3RhZ2VJZGAsIG9wdGlvbmFsbHkgdGhlIGZpcnN0IG9uZSB0aGF0IFdST1RFIGBrZXlgIOKAlCB1bmRlciB0aGUgd3JpdGVyXG4gKiBydWxlOiBhIHJvdyBvbiB0aGUga2V5LCBpbnNpZGUgaXQsIG9yIGFyb3VuZCBpdCB0aGF0IGNoYW5nZWQgaXQgKHNlZSB7QGxpbmsgd3JpdGVyc09mfSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29tbWl0KGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIHN0YWdlSWQ6IHN0cmluZywga2V5Pzogc3RyaW5nKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFrZXkpIHJldHVybiBjb21taXRMb2cuZmluZCgoYikgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkKTtcbiAgY29uc3Qgd3JpdGVycyA9IG5ldyBTZXQobG9nTW9kZWwoY29tbWl0TG9nKS53cml0ZXJzT2Yoa2V5KSk7XG4gIHJldHVybiBjb21taXRMb2cuZmluZCgoYiwgaSkgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkICYmIHdyaXRlcnMuaGFzKGkpKTtcbn1cblxuLyoqIEZpbmQgYWxsIGNvbW1pdHMgYnkgc3RhZ2VJZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29tbWl0cyhjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBzdGFnZUlkOiBzdHJpbmcpOiBDb21taXRCdW5kbGVbXSB7XG4gIHJldHVybiBjb21taXRMb2cuZmlsdGVyKChiKSA9PiBiLnN0YWdlSWQgPT09IHN0YWdlSWQpO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGxhc3QgY29tbWl0IHRoYXQgV1JPVEUgYGtleWAgYmVmb3JlIGBiZWZvcmVJZHhgIChleGNsdXNpdmU7IGRlZmF1bHQ6IHRoZSB3aG9sZSBsb2cpIOKAlFxuICogdGhlIGFuY2hvciBvZiBldmVyeSBiYWNrd2FyZCBxdWVzdGlvbiAoXCJ3aG8gbWFkZSBpdCB0aGlzP1wiKS5cbiAqXG4gKiBUaGUgd3JpdGVyIHJ1bGUgKGBrZXlQYXRocy50c2ApOiBhIGNvbW1pdCB3cml0ZXMgYGtleWAgd2hlbiBvbmUgb2YgaXRzIHJvd3MgaXMgT04gdGhlIGtleSxcbiAqIElOU0lERSBpdCAoYSBzdWJmbG93J3MgaW5wdXQgc2VlZCB3cml0ZXMgYGNmZ+KQn2FgOyBhbiBvdXRwdXRNYXBwZXIgbWVyZ2UtYmFjayB3cml0ZXMgYGNmZ+KQn2JgO1xuICogZWl0aGVyIGlzIGEgd3JpdGUgb2YgYGNmZ2ApLCBvciBBUk9VTkQgaXQgd2l0aCB0aGUgdmFsdWUgYXQgdGhlIGtleSBkaWZmZXJlbnQgYWNyb3NzIHRoZSBjb21taXRcbiAqIChhIGBzZXRgIG9mIGBjZmdgIHdyaXRlcyBgY2Zn4pCfYWA7IGEgYG1lcmdlYCBvZiBgY2ZnYCB0aGF0IG5ldmVyIHJlYWNoZXMgYGFgIGRvZXMgbm90KS4gQSB3cml0ZVxuICogZm91bmQgdGhyb3VnaCBhIHJvdyBJTlNJREUgdGhlIGtleSB3cm90ZSBvbmx5IFBBUlQgb2YgaXRzIHZhbHVlIOKAlCB0aGUgc2xpY2UgcmVhZGVycyBzYXkgc28gd2l0aFxuICogdGhlIGAnbmVzdGVkLXJvd3MnYCBub3RlLlxuICpcbiAqIEBwYXJhbSBrZXkgIEEgREVMSU0tam9pbmVkIHBhdGggKGBub3JtYWxpc2VQYXRoYCk7IGEgdG9wLWxldmVsIGtleSBpcyBhIG9uZS1zZWdtZW50IHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdFdyaXRlcihjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBrZXk6IHN0cmluZywgYmVmb3JlSWR4PzogbnVtYmVyKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW5kID0gTWF0aC5taW4oYmVmb3JlSWR4ID8/IGNvbW1pdExvZy5sZW5ndGgsIGNvbW1pdExvZy5sZW5ndGgpO1xuICBjb25zdCBtb2RlbCA9IG1lbW9pc2VkTW9kZWwoY29tbWl0TG9nKTtcbiAgaWYgKG1vZGVsICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBhdCA9IG1vZGVsLmxhc3RXcml0ZXJCZWZvcmUoa2V5LCBlbmQpO1xuICAgIHJldHVybiBhdCA+PSAwID8gY29tbWl0TG9nW2F0XSA6IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBOb3QgZnJvemVuOiBzY2FuIGJhY2sgYW5kIHN0b3AgYXQgdGhlIGZpcnN0IHdyaXRlIG9uIG9yIGluc2lkZSB0aGUga2V5LiBBIHJvdyBBUk9VTkQgdGhlIGtleVxuICAvLyAob3IgYSBuZXN0ZWQgYGRlbGV0ZWAsIHdoaWNoIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lcikgbmVlZHMgYSB2ZXJkaWN0IOKAlCB0aGUgbW9kZWwncy5cbiAgY29uc3QgbmVzdGVkID0gcm9vdE9mKGtleSkgIT09IGtleTtcbiAgZm9yIChsZXQgaSA9IGVuZCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGV0IHdyaXRlID0gZmFsc2U7XG4gICAgbGV0IG5lZWRzVmVyZGljdCA9IGZhbHNlO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSBjb21taXRMb2dbaV0udHJhY2UubGVuZ3RoO1xuICAgIGZvciAoY29uc3QgdCBvZiBjb21taXRMb2dbaV0udHJhY2UpIHtcbiAgICAgIGNvbnN0IHIgPSByZWxhdGlvbih0LnBhdGgsIGtleSk7XG4gICAgICBpZiAociA9PT0gJ2Fyb3VuZCcpIG5lZWRzVmVyZGljdCA9IHRydWU7XG4gICAgICBlbHNlIGlmIChyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHQudmVyYiAhPT0gJ2RlbGV0ZScgfHwgIW5lc3RlZCkgd3JpdGUgPSB0cnVlO1xuICAgICAgICBlbHNlIG5lZWRzVmVyZGljdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3cml0ZSAmJiAoIW5lZWRzVmVyZGljdCB8fCAhbGVhdmVzU3RyaW5nQWJvdmUoY29tbWl0TG9nW2ldLCBrZXkpKSkgcmV0dXJuIGNvbW1pdExvZ1tpXTtcbiAgICBpZiAobmVlZHNWZXJkaWN0KSB7XG4gICAgICBjb25zdCBhdCA9IGxvZ01vZGVsKGNvbW1pdExvZykubGFzdFdyaXRlckJlZm9yZShrZXksIGVuZCk7XG4gICAgICByZXR1cm4gYXQgPj0gMCA/IGNvbW1pdExvZ1thdF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBXaGF0IHtAbGluayB3cml0ZXJzT2Z9IGlzIGFza2VkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXcml0ZXJzT3B0aW9ucyB7XG4gIC8qKiBUaGUgbGFzdCBjb21taXQgQVJSQVkgaW5kZXggY29uc2lkZXJlZCwgaW5jbHVzaXZlLiBEZWZhdWx0OiB0aGUgd2hvbGUgbG9nLiAqL1xuICByZWFkb25seSBlbmQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIEFSUkFZIHBvc2l0aW9ucyAoYXNjZW5kaW5nKSBvZiBldmVyeSBjb21taXQgaW4gYGNvbW1pdExvZ1swLi5lbmRdYCB0aGF0IFdST1RFIGBrZXlgIOKAlCB0aGVcbiAqIHdyaXRlciBydWxlIG9mIGBrZXlQYXRocy50c2AsIHRoZSBvbmUgZGVmaW5pdGlvbiBldmVyeSBrZXkgcXVlcnkgc2hhcmVzIChgbG9nTW9kZWwudHNgIGFwcGxpZXMgaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVyc09mKGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sIGtleTogc3RyaW5nLCBvcHRpb25zOiBXcml0ZXJzT3B0aW9ucyA9IHt9KTogbnVtYmVyW10ge1xuICBjb25zdCBlbmQgPSBvcHRpb25zLmVuZCA/PyBjb21taXRMb2cubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGxvZ01vZGVsKGNvbW1pdExvZylcbiAgICAud3JpdGVyc09mKGtleSlcbiAgICAuZmlsdGVyKChpKSA9PiBpIDw9IGVuZCk7XG59XG5cbi8qKlxuICogRXZlcnkgcm93IHVuZGVyIGBrZXlgJ3MgVE9QLUxFVkVMIGtleSBpbiBgY29tbWl0TG9nWzAuLmVuZF1gLCBpbiBjb21taXQgb3JkZXIg4oCUIHRoZSByb3dzIHRoZSB2YWx1ZVxuICogcnVsZSBmb2xkcyAoe0BsaW5rIGZvbGRLZXl9KSwgZWFjaCB3aXRoIGl0cyB7QGxpbmsgVG91Y2gucmVsYXRpb259IHRvIGBrZXlgIChhYnNlbnQgZm9yIGEgc2libGluZ1xuICogdW5kZXIgdGhlIHNhbWUgdG9wLWxldmVsIGtleTogYXBwbGllZCwgbm90IG9ic2VydmVkKSDigJQgZm91bmQgdGhyb3VnaCB0aGUgbG9nJ3MgaW5kZXguIEEgcm93IHdob3NlXG4gKiB2ZXJiIGlzIG5vdCBvbmUgb2YgdGhlIGZvdXIgaXMgcmVmdXNlZCB3aXRoIHtAbGluayBVbmtub3duVmVyYkVycm9yfSBuYW1pbmcgdGhlIHJvdyDigJQgd2hldGhlciBvclxuICogbm90IHRoZSBmb2xkIHdvdWxkIGhhdmUgcmVhY2hlZCBpdDogdGhlIGFuc3dlciBtdXN0IG5vdCBkZXBlbmQgb24gd2hlcmUgYW4gb3B0aW1pc2F0aW9uIHN0YXJ0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvd3NVbmRlclJvb3QoY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSwga2V5OiBzdHJpbmcsIGVuZDogbnVtYmVyKTogVG91Y2hbXSB7XG4gIHJldHVybiBsb2dNb2RlbChjb21taXRMb2cpLnJvd3NVbmRlclJvb3Qoa2V5LCBlbmQpO1xufVxuXG4vKipcbiAqIFJlY29uc3RydWN0IHRoZSBGVUxMIHZhbHVlIG9mIGBrZXlgIGFzIG9mIGNvbW1pdCBhcnJheSBpbmRleCBgaWR4YFxuICogKGluY2x1c2l2ZSkg4oCUIHRoZSBtaWdyYXRpb24gaGVscGVyIGZvciB0aGUgXCJyZWFkIGBidW5kbGUub3ZlcndyaXRlW2tleV1gXG4gKiBhcyB0aGUgZnVsbCB2YWx1ZSB3cml0dGVuXCIgcGF0dGVybiAoIzEzYy1CKS5cbiAqXG4gKiBUaGUgdmFsdWUgcnVsZSAoYGtleVBhdGhzLnRzYCwgOS4zMy4wKTogZXZlcnkgcm93IHVuZGVyIHRoZSBrZXkncyBUT1AtTEVWRUxcbiAqIGtleSBpbiBgY29tbWl0TG9nWzAuLmlkeF1gIGlzIGZvbGRlZCwgYW5jaG9yZWQgYXQgdGhhdCBrZXkncyBsYXN0IGBzZXRgIC9cbiAqIGBkZWxldGVgLCB3aXRoIHRoZSBTQU1FIHN0ZXAgYW5kIGNsb25lIGRpc2NpcGxpbmUgdGhlIHJlcGxheSB1c2VzXG4gKiAoYHZlcmJzLnRzYCDCtyBgZm9sZEtleWApLCBhbmQgdGhlIHJlc3VsdCBpcyByZWFkIGF0IGBrZXlgLiBTbyB0aGUgYW5zd2VyIGlzXG4gKiB0aGUgdmFsdWUgYHN0YXRlQXRgIGdpdmVzIGF0IHRoYXQgcGF0aCB3aGVuIGl0IGZvbGRzIHRoZSBsb2cgYWxvbmUg4oCUIHJvd3NcbiAqIElOU0lERSB0aGUga2V5IChhIHN1YmZsb3cgc2VlZCwgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2spIGFuZCBBUk9VTkQgaXQgKGFcbiAqIGBzZXRgIG9mIHRoZSBjb250YWluZXIpIGNvdW50OyBiZWZvcmUgOS4zMy4wIG9ubHkgcm93cyBvbiB0aGUgZXhhY3QgcGF0aCBkaWQsXG4gKiBhbmQgYSBzZWVkZWQgYGNmZ2AgcmVhZCBhcyBgdW5kZWZpbmVkYC4gVW5kZXIgYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsIGFuXG4gKiBgYXBwZW5kYCByb3cncyBgb3ZlcndyaXRlW2tleV1gIGhvbGRzIG9ubHkgdGhlIFRBSUw7IHRoZSBmb2xkIHB1dHMgdGhlIGFycmF5XG4gKiBiYWNrIHRvZ2V0aGVyLiBUd28gYG1lcmdlYCByb3dzIG9mIG9uZSBidW5kbGUgc2VlIG9uZSBjb3B5IG9mIHRoZSBidW5kbGUnc1xuICogZGVsdGEsIGFzIHRoZSByZXBsYXkncyBkby5cbiAqXG4gKiBAcGFyYW0ga2V5ICBBIERFTElNLWpvaW5lZCBwYXRoIChgbm9ybWFsaXNlUGF0aGApOyBhIHRvcC1sZXZlbCBrZXkgaXMgYVxuICogICBvbmUtc2VnbWVudCBwYXRoLlxuICogQHBhcmFtIGlkeCAgQ29tbWl0QnVuZGxlIEFSUkFZIGluZGV4ICh0aGUgYGJ1bmRsZS5pZHhgIHBvc2l0aW9uKSxcbiAqICAgaW5jbHVzaXZlLiBOT1QgdGhlIGV4ZWN1dGlvbkluZGV4IGZyb20gYSBydW50aW1lU3RhZ2VJZC5cbiAqIEByZXR1cm5zIFRoZSByZWNvbnN0cnVjdGVkIHZhbHVlIChhIGRldGFjaGVkIGNsb25lKSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBub1xuICogICByb3cgaW4gYGNvbW1pdExvZ1swLi5pZHhdYCBpcyBvbiwgaW5zaWRlIG9yIGFyb3VuZCB0aGUga2V5LCBvciB0aGUgZm9sZFxuICogICBsZWF2ZXMgaXQgYWJzZW50IChpdHMgbGFzdCB3cml0ZSB3YXMgYSBkZWxldGUpLiBDYXZlYXQ6IGEga2V5IHRoYXQgaGVsZCBhXG4gKiAgIHZhbHVlIGluIHRoZSBydW4ncyBJTklUSUFMIHN0YXRlIGZvbGRzIGZyb20gYWJzZW50IGhlcmUg4oCUIHRoZSBsb2cgYWxvbmVcbiAqICAgY2Fubm90IHNlZSB0aGUgcHJlLXJ1biBiYXNlLCBzbyBtZXJnZXMgYW5kIG5lc3RlZCB3cml0ZXMgb250byBhIHNlZWRlZCBrZXlcbiAqICAgZ2l2ZSBvbmx5IHdoYXQgdGhleSBhZGRlZC4gU2luY2UgOS4xNy4wIHRoZSBiYXNlIFRSQVZFTFMgd2l0aCB0aGUgbG9nOlxuICogICBgc3RhdGVBdChzbmFwc2hvdCwgaWR4KWAgKGZvb3RwcmludGpzL3RyYWNlKSBmb2xkcyBmcm9tXG4gKiAgIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYCwgd2hpY2ggdGhpcyBmdW5jdGlvbiBuZXZlciByZWNlaXZlcy5cbiAqIEB0aHJvd3Mge0BsaW5rIFVua25vd25WZXJiRXJyb3J9IHdoZW4gYSByb3cgdW5kZXIgdGhlIGtleSdzIHRvcC1sZXZlbCBrZXlcbiAqICAgY2FycmllcyBhIHZlcmIgb3RoZXIgdGhhbiBgc2V0IHwgbWVyZ2UgfCBhcHBlbmQgfCBkZWxldGVgIOKAlCBhIGZvcmVpZ24gb3JcbiAqICAgY29ycnVwdGVkIGxvZyBpcyByZWZ1c2VkLCBub3QgZm9sZGVkIGFzIGEgYG1lcmdlYC4gRW5naW5lLXdyaXR0ZW4gbG9nc1xuICogICBuZXZlciBjYXJyeSBvbmUuXG4gKiBAc2VlIGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMg4oCUIHRoZSBzYW1lIGFuc3dlciwgd2l0aCB0aGUgY29kZXMgdGhhdCBzYXkgV0hZIGl0IGlzXG4gKiAgIGB1bmRlZmluZWRgIG9yIHBhcnRpYWwgKGFuZCB0aGUgYGluaXRpYWxTdGF0ZWAgYmFzZSB0aGlzIGZ1bmN0aW9uIG5ldmVyIHJlY2VpdmVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdFZhbHVlQXQoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSwgaWR4OiBudW1iZXIsIGtleTogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKGlkeCwgY29tbWl0TG9nLmxlbmd0aCAtIDEpO1xuICBjb25zdCBtb2RlbCA9IG1lbW9pc2VkTW9kZWwoY29tbWl0TG9nKTtcbiAgaWYgKG1vZGVsICE9PSB1bmRlZmluZWQpIHJldHVybiBtb2RlbC52YWx1ZUF0KGtleSwgZW5kKTtcbiAgcmV0dXJuIHZhbHVlQnlTY2FuKGNvbW1pdExvZywgZW5kLCBrZXkpO1xufVxuXG4vLyDilIDilIAgVGhlIGJhc2lzIHR3aW5zIChGNGIsIDkuMzMuMCk6IHRoZSBzYW1lIGFuc3dlciwgYW5kIHRoZSBjb2RlcyB0aGF0IHNheSB3aHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogV2h5IHtAbGluayBjb21taXRWYWx1ZUF0V2l0aEJhc2lzfSBhbnN3ZXJlZCB3aGF0IGl0IGRpZC4gRWFjaCBjb2RlIGlzIHJlZ2lzdGVyZWQsIHdpdGggdGhlIG9uZVxuICogc2VudGVuY2UgdGhhdCBzYXlzIHdoYXQgaXQgbWVhbnMsIGluIGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCAoc2VydmVkIG9uXG4gKiBgZm9vdHByaW50anMvdHJhY2VgKTsgdGhlIHVuaW9uIGRlY2xhcmVzIGl0cyBtZW1iZXJzIHRocm91Z2ggYFJlZ2lzdGVyZWRDb2RlYC5cbiAqXG4gKiAtIGAnbmV2ZXItd3JpdHRlbidgICAgICAg4oCUIG5vIGNvbW1pdCBpbiByYW5nZSB3cm90ZSB0aGUga2V5ICh0aGUgd3JpdGVyIHJ1bGUg4oCUIHRoZSBhbnN3ZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmaW5kTGFzdFdyaXRlcmAgYW5kIHRoZSBzbGljZSBsYXllciBnaXZlKSwgdW5sZXNzIHRoZSBydW4gcmVtb3ZlZCBhIHZhbHVlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFzc2VkIGBpbml0aWFsU3RhdGVgIGhlbGQgKHRoZW4gYCdkZWxldGVkJ2ApLCBvciBhIHJlZGFjdGlvbiBhdCBvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJvdW5kIHRoZSBrZXkgaGlkIHRoZSB3cml0ZSAodGhlbiBgJ3JlZGFjdGVkJ2AgYWxvbmUpLlxuICogLSBgJ2RlbGV0ZWQnYCAgICAgICAgICAgIOKAlCB0aGUgYW5zd2VyIGlzIGB1bmRlZmluZWRgIGFuZCB0aGUga2V5IFdBUyB3cml0dGVuOiBpdHMgbGFzdCB3cml0ZSBsZWZ0IGl0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNlbnQuXG4gKiAtIGAnbmVzdGVkLXJvd3MnYCAgICAgICAg4oCUIHRoZSB2YWx1ZSByZXN0cyBvbiByb3dzIElOU0lERSB0aGUga2V5IChhIHN1YmZsb3cgc2VlZCwgYW4gb3V0cHV0TWFwcGVyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZS1iYWNrLCBhIGZvcmsgY2hpbGQncyBuYW1lc3BhY2UpIHdpdGggbm8gYHNldGAvYGRlbGV0ZWAgb2YgdGhlIGtleSBvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYSBjb250YWluZXIgYXJvdW5kIGl0IGluIHJhbmdlLlxuICogLSBgJ2Zyb20taW5pdGlhbC1zdGF0ZSdgIOKAlCBubyBgc2V0YC9gZGVsZXRlYCBvZiB0aGUga2V5IG9yIGFyb3VuZCBpdCBpbiByYW5nZSwgc28gdGhlIHZhbHVlIHJlc3RzIG9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJlLXJ1biBiYXNlOiBmb2xkZWQgZnJvbSBgb3B0aW9ucy5pbml0aWFsU3RhdGVgIHdoZW4gaXQgaG9sZHMgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkncyB0b3AtbGV2ZWwga2V5LCBwYXJ0aWFsIHdoZW4gbm8gYGluaXRpYWxTdGF0ZWAgd2FzIHBhc3NlZC5cbiAqIC0gYCdyZWRhY3RlZCdgICAgICAgICAgICDigJQgYSBwYXRoIGF0LCBpbnNpZGUgb3IgYXJvdW5kIHRoZSBrZXkgaXMgaW4gdGhlIGByZWRhY3RlZFBhdGhzYCBvZiBhIGNvbW1pdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIHJlc3RzIG9uIChmcm9tIGl0cyBsYXN0IGBzZXRgL2BkZWxldGVgIG9uLCBvciB0aGUgd2hvbGUgcmFuZ2UpLlxuICovXG5leHBvcnQgdHlwZSBWYWx1ZUJhc2lzID0gUmVnaXN0ZXJlZENvZGU8XG4gICduZXZlci13cml0dGVuJyB8ICdkZWxldGVkJyB8ICduZXN0ZWQtcm93cycgfCAnZnJvbS1pbml0aWFsLXN0YXRlJyB8ICdyZWRhY3RlZCdcbj47XG5cbi8qKiBXaGF0IHtAbGluayBjb21taXRWYWx1ZUF0V2l0aEJhc2lzfSBpcyBhc2tlZCBiZXNpZGVzIHRoZSBsb2csIHRoZSBpbmRleCBhbmQgdGhlIGtleS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWVCYXNpc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHN0YXRlIGJlZm9yZSB0aGUgcnVuIOKAlCBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAgKG9yIGEgc3ViZmxvdydzXG4gICAqIGB0cmVlQ29udGV4dC5pbml0aWFsU3RhdGVgKS4gV2hlbiBnaXZlbiwgYSBrZXkgd2l0aCBubyBgc2V0YC9gZGVsZXRlYCBpbiByYW5nZSBmb2xkcyBmcm9tIGl0LCBhc1xuICAgKiBgc3RhdGVBdGAgZG9lczsgd2hlbiBhYnNlbnQsIHN1Y2ggYW4gYW5zd2VyIGlzIHRoZSBsb2ctb25seSBmb2xkIGFuZCBjYXJyaWVzIGAnZnJvbS1pbml0aWFsLXN0YXRlJ2AuXG4gICAqL1xuICByZWFkb25seSBpbml0aWFsU3RhdGU/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59XG5cbi8qKiBBIGtleSdzIHZhbHVlIHJlYWQgb2ZmIHRoZSBsb2csIGFuZCB0aGUgY29kZXMgdGhhdCBzYXkgd2hhdCBpdCByZXN0cyBvbiDigJQgYWJzZW50IGNvZGVzID0gYW4gZXhhY3QgYW5zd2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWx1ZVdpdGhCYXNpcyB7XG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xuICAvKiogSW4gdGhlIG9yZGVyIG9mIHtAbGluayBWYWx1ZUJhc2lzfSdzIGxpc3Q7IEVNUFRZIHdoZW4gYSBgc2V0YC9gZGVsZXRlYCBvZiB0aGUga2V5IG9yIGFyb3VuZCBpdCBhbmNob3JzIHRoZSB2YWx1ZSBhbmQgbm8gcmVkYWN0aW9uIHRvdWNoZWQgaXQuICovXG4gIHJlYWRvbmx5IGJhc2lzOiBWYWx1ZUJhc2lzW107XG59XG5cbmNvbnN0IFZBTFVFX0JBU0lTX09SREVSOiByZWFkb25seSBWYWx1ZUJhc2lzW10gPSBbXG4gICduZXZlci13cml0dGVuJyxcbiAgJ2RlbGV0ZWQnLFxuICAnbmVzdGVkLXJvd3MnLFxuICAnZnJvbS1pbml0aWFsLXN0YXRlJyxcbiAgJ3JlZGFjdGVkJyxcbl07XG5cbi8qKlxuICoge0BsaW5rIGNvbW1pdFZhbHVlQXR9LCB3aXRoIHRoZSBjb2RlcyB0aGF0IHNheSB3aGF0IHRoZSBhbnN3ZXIgcmVzdHMgb24uIFdpdGhvdXQgYG9wdGlvbnMuaW5pdGlhbFN0YXRlYFxuICogdGhlIHZhbHVlIElTIGBjb21taXRWYWx1ZUF0KGNvbW1pdExvZywgaWR4LCBrZXkpYCAocGlubmVkIGJ5IGEgcHJvcGVydHkpOyB3aXRoIGl0LCBhIGtleSB0aGF0IGhhcyBub1xuICogYHNldGAvYGRlbGV0ZWAgb2YgaXRzZWxmIG9yIG9mIGEgY29udGFpbmVyIGFyb3VuZCBpdCBpbiByYW5nZSBmb2xkcyBmcm9tIHRoYXQgYmFzZSDigJQgdGhlIHZhbHVlXG4gKiBgc3RhdGVBdChzbmFwc2hvdCwgaWR4KWAgZ2l2ZXMgYXQgdGhlIGtleS4gUmVmdXNlcyBhbiB1bmtub3duIHZlcmIgZXhhY3RseSBhcyBgY29tbWl0VmFsdWVBdGAgZG9lcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyB2YWx1ZSwgYmFzaXMgfSA9IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMoc25hcC5jb21taXRMb2csIGksICdjZmcnLCB7IGluaXRpYWxTdGF0ZTogc25hcC5pbml0aWFsU3RhdGUgfSk7XG4gKiBmb3IgKGNvbnN0IGNvZGUgb2YgYmFzaXMpIGNvbnNvbGUubG9nKGNvZGUsIEhPTkVTVFlfQ09ERVNbY29kZV0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21taXRWYWx1ZUF0V2l0aEJhc2lzKFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICBpZHg6IG51bWJlcixcbiAga2V5OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFZhbHVlQmFzaXNPcHRpb25zID0ge30sXG4pOiBWYWx1ZVdpdGhCYXNpcyB7XG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKGlkeCwgY29tbWl0TG9nLmxlbmd0aCAtIDEpO1xuICBjb25zdCBtb2RlbCA9IGxvZ01vZGVsKGNvbW1pdExvZyk7XG4gIGNvbnN0IHJvd3MgPSBtb2RlbC5yb3dzVW5kZXJSb290KGtleSwgZW5kKTtcbiAgLy8gVGhlIGxhc3QgYHNldGAvYGRlbGV0ZWAgT04gdGhlIGtleSBvciBBUk9VTkQgaXQgZGVjaWRlcyB0aGUgdmFsdWUgYWxvbmU7IHJvd3MgaW5zaWRlIGFmdGVyIGl0IHJlZmluZSBpdC5cbiAgbGV0IGFuY2hvciA9IC0xO1xuICBsZXQgaW5zaWRlID0gZmFsc2U7XG4gIGxldCBsYXN0UmVsYXRlZDogVG91Y2ggfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHIgPSByb3dzW2ldLnJlbGF0aW9uO1xuICAgIGlmIChyID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGxhc3RSZWxhdGVkID0gcm93c1tpXTtcbiAgICBpZiAociA9PT0gJ2luc2lkZScpIGluc2lkZSA9IHRydWU7XG4gICAgZWxzZSBpZiAoaXNUb3RhbChyb3dzW2ldLnZlcmIpKSB7XG4gICAgICBhbmNob3IgPSBpO1xuICAgICAgaW5zaWRlID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJvb3QgPSByb290T2Yoa2V5KTtcbiAgY29uc3QgYmFzZSA9IG9wdGlvbnMuaW5pdGlhbFN0YXRlO1xuICBjb25zdCBiYXNlSG9sZHNSb290ID0gYmFzZSAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiYXNlLCByb290KTtcbiAgY29uc3QgdmFsdWUgPVxuICAgIGFuY2hvciA9PT0gLTEgJiYgYmFzZUhvbGRzUm9vdFxuICAgICAgPyBmb2xkS2V5KHJvd3MsIGtleS5zcGxpdChERUxJTSksIHsgYW5jaG9yZWQ6IHRydWUsIHN0YXJ0OiBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZVtyb290XSkgfSlcbiAgICAgIDogbW9kZWwudmFsdWVBdChrZXksIGVuZCk7XG5cbiAgY29uc3QgY29kZXMgPSBuZXcgU2V0PFZhbHVlQmFzaXM+KCk7XG4gIC8vIFRoZSB3cml0ZXIgcnVsZSBkZWNpZGVzICduZXZlci13cml0dGVuJyAoYXMgaXQgZG9lcyBmb3IgYGZpbmRMYXN0V3JpdGVyYCBhbmQgdGhlIHNsaWNlIGxheWVyKSwgd2l0aCB0d29cbiAgLy8gY29ycmVjdGlvbnMgb25seSB0aGUgYmFzZSBhbmQgdGhlIHJlZGFjdGlvbiBsaXN0IGNhbiBtYWtlOlxuICAvLyAgIC0gdGhlIHJ1biBSRU1PVkVEIGEgdmFsdWUgdGhlIHBhc3NlZCBiYXNlIGhlbGQgKGEgYGRlbGV0ZWAg4oCUIGZ1bGwgbW9kZSBzcGVsbHMgaXQgYSBgc2V0YCDigJQgb3IgYSBgc2V0YCBvZlxuICAvLyAgICAgYSBjb250YWluZXIgd2l0aG91dCB0aGUga2V5KTogdGhlIGxvZy1vbmx5IHZlcmRpY3Qgc2VlcyBhYnNlbnQg4oaSIGFic2VudCwgdGhlIHRydXRoIGlzICdkZWxldGVkJztcbiAgLy8gICAtIGEgcmVkYWN0aW9uIGF0IG9yIGFyb3VuZCB0aGUga2V5IEhJRCB0aGUgd3JpdGUgKGEgcGxhY2Vob2xkZXIgc3RyaW5nIHJlcGxhY2VkIHRoZSBjb250YWluZXIpOiB0aGVcbiAgLy8gICAgIGxvZyBjYW5ub3Qgc2F5IHdoZXRoZXIgdGhlIGtleSB3YXMgd3JpdHRlbiwgc28gdGhlIGFuc3dlciBzYXlzICdyZWRhY3RlZCcgYW5kIG5vdGhpbmcgZWxzZSBhYm91dCBpdC5cbiAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gIGNvbnN0IHJlZCA9IHJlZGFjdGlvbnNJblJhbmdlKGNvbW1pdExvZywga2V5LCBhbmNob3IgPT09IC0xID8gMCA6IHJvd3NbYW5jaG9yXS5jb21taXRJZHgsIGVuZCk7XG4gIGNvbnN0IGRlbGV0ZWRCeVJvdyA9IGxhc3RSZWxhdGVkICE9PSB1bmRlZmluZWQgJiYgbGFzdFJlbGF0ZWQucmVsYXRpb24gIT09ICdpbnNpZGUnICYmIGxhc3RSZWxhdGVkLnZlcmIgPT09ICdkZWxldGUnO1xuICBjb25zdCBiYXNlSGVsZEtleSA9IGJhc2UgIT09IHVuZGVmaW5lZCAmJiBuYXRpdmVHZXQoYmFzZSwgc2VncykgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVtb3ZlZEZyb21CYXNlID0gYmFzZUhlbGRLZXkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhcmVkLmFueSAmJiAoYW5jaG9yICE9PSAtMSB8fCBkZWxldGVkQnlSb3cpO1xuICBjb25zdCB3cml0dGVuID0gKGVuZCA+PSAwICYmIG1vZGVsLmxhc3RXcml0ZXJCZWZvcmUoa2V5LCBlbmQgKyAxKSAhPT0gLTEpIHx8IHJlbW92ZWRGcm9tQmFzZTtcbiAgaWYgKCF3cml0dGVuKSB7XG4gICAgaWYgKCFyZWQuaGlkZGVuKSBjb2Rlcy5hZGQoJ25ldmVyLXdyaXR0ZW4nKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIChkZWxldGVkQnlSb3cgfHwgcmVtb3ZlZEZyb21CYXNlIHx8ICFyZWQuYW55KSkgY29kZXMuYWRkKCdkZWxldGVkJyk7XG4gIGlmIChhbmNob3IgPT09IC0xICYmIGluc2lkZSkgY29kZXMuYWRkKCduZXN0ZWQtcm93cycpO1xuICBpZiAoYW5jaG9yID09PSAtMSAmJiAoYmFzZSA9PT0gdW5kZWZpbmVkIHx8IGJhc2VIb2xkc1Jvb3QpKSBjb2Rlcy5hZGQoJ2Zyb20taW5pdGlhbC1zdGF0ZScpO1xuICBpZiAocmVkLmFueSkgY29kZXMuYWRkKCdyZWRhY3RlZCcpO1xuICByZXR1cm4geyB2YWx1ZSwgYmFzaXM6IFZBTFVFX0JBU0lTX09SREVSLmZpbHRlcigoYykgPT4gY29kZXMuaGFzKGMpKSB9O1xufVxuXG4vKipcbiAqIFRoZSByZWRhY3RlZCBwYXRocyBvZiB0aGUgY29tbWl0cyBpbiBgW2Zyb20sIGVuZF1gIGFnYWluc3QgYGtleWA6IGBhbnlgIOKAlCBvbmUgYXQsIGluc2lkZSBvciBhcm91bmQgaXQ7XG4gKiBgaGlkZGVuYCDigJQgb25lIEFUIG9yIEFST1VORCBpdCAoYSBwbGFjZWhvbGRlciByZXBsYWNlZCB0aGUga2V5IG9yIGl0cyBjb250YWluZXIsIHNvIHRoZSB3cml0ZSBpcyBoaWRkZW4pLlxuICovXG5mdW5jdGlvbiByZWRhY3Rpb25zSW5SYW5nZShcbiAgY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSxcbiAga2V5OiBzdHJpbmcsXG4gIGZyb206IG51bWJlcixcbiAgZW5kOiBudW1iZXIsXG4pOiB7IGFueTogYm9vbGVhbjsgaGlkZGVuOiBib29sZWFuIH0ge1xuICBsZXQgYW55ID0gZmFsc2U7XG4gIGZvciAobGV0IGMgPSBmcm9tOyBjIDw9IGVuZDsgYysrKSB7XG4gICAgZm9yIChjb25zdCBwIG9mIGNvbW1pdExvZ1tjXS5yZWRhY3RlZFBhdGhzID8/IFtdKSB7XG4gICAgICBjb25zdCByID0gcmVsYXRpb24ocCwga2V5KTtcbiAgICAgIGlmIChyID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgYW55ID0gdHJ1ZTtcbiAgICAgIGlmIChyICE9PSAnaW5zaWRlJykgcmV0dXJuIHsgYW55LCBoaWRkZW46IHRydWUgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgYW55LCBoaWRkZW46IGZhbHNlIH07XG59XG5cbi8qKlxuICogV2h5IHtAbGluayBmaW5kTGFzdFdyaXRlcldpdGhCYXNpc30gYW5zd2VyZWQgd2hhdCBpdCBkaWQg4oCUIHJlZ2lzdGVyZWQgaW4gYEhPTkVTVFlfQ09ERVNgOlxuICogYCduZXZlci13cml0dGVuJ2AgKG5vIHdyaXRlciBiZWZvcmUgdGhlIGJvdW5kKSwgYCduZXN0ZWQtcm93cydgICh0aGUgd3JpdGVyIHJlYWNoZWQgdGhlIGtleSBvbmx5XG4gKiB0aHJvdWdoIHJvd3MgaW5zaWRlIGl0LCBzbyBpdCB3cm90ZSBwYXJ0IG9mIHRoZSB2YWx1ZSksIGAncmVkYWN0ZWQnYCAobm8gd3JpdGVyIHRoZSBsb2cgY2FuIHNlZSwgYmVjYXVzZSBhXG4gKiByZWRhY3Rpb24gYXQgb3IgYXJvdW5kIHRoZSBrZXkgaGlkIHRoZSB3cml0ZSDigJQgdGhlIHJ1bGUgYGNvbW1pdFZhbHVlQXRXaXRoQmFzaXNgIGZvbGxvd3MpLlxuICovXG5leHBvcnQgdHlwZSBXcml0ZXJCYXNpcyA9IFJlZ2lzdGVyZWRDb2RlPCduZXZlci13cml0dGVuJyB8ICduZXN0ZWQtcm93cycgfCAncmVkYWN0ZWQnPjtcblxuLyoqIFRoZSBsYXN0IHdyaXRlciBvZiBhIGtleSwgYW5kIHRoZSBjb2RlcyB0aGF0IHNheSB3aGF0IGtpbmQgb2Ygd3JpdGUgaXQgd2FzIOKAlCBhYnNlbnQgY29kZXMgPSBhIHdyaXRlIG9uIG9yIGFyb3VuZCB0aGUga2V5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBXcml0ZXJXaXRoQmFzaXMge1xuICAvKiogQWJzZW50IGV4YWN0bHkgd2hlbiBgYmFzaXNgIGhvbGRzIGAnbmV2ZXItd3JpdHRlbidgIG9yIGAncmVkYWN0ZWQnYC4gKi9cbiAgcmVhZG9ubHkgd3JpdGVyPzogQ29tbWl0QnVuZGxlO1xuICByZWFkb25seSBiYXNpczogV3JpdGVyQmFzaXNbXTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgZmluZExhc3RXcml0ZXJ9LCB3aXRoIHRoZSBjb2RlIHRoYXQgc2F5cyB3aHk6IGB3cml0ZXJgIGlzIGBmaW5kTGFzdFdyaXRlcihjb21taXRMb2csIGtleSwgYmVmb3JlSWR4KWA7XG4gKiBgYmFzaXNgIGlzIGBbJ25ldmVyLXdyaXR0ZW4nXWAgd2hlbiB0aGVyZSBpcyBub25lIGFuZCBgWyduZXN0ZWQtcm93cyddYCB3aGVuIHRoYXQgY29tbWl0IHdyb3RlIHRoZSBrZXlcbiAqIG9ubHkgdGhyb3VnaCByb3dzIGluc2lkZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0V3JpdGVyV2l0aEJhc2lzKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIGtleTogc3RyaW5nLCBiZWZvcmVJZHg/OiBudW1iZXIpOiBXcml0ZXJXaXRoQmFzaXMge1xuICBjb25zdCB3cml0ZXIgPSBmaW5kTGFzdFdyaXRlcihjb21taXRMb2csIGtleSwgYmVmb3JlSWR4KTtcbiAgaWYgKHdyaXRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4oYmVmb3JlSWR4ID8/IGNvbW1pdExvZy5sZW5ndGgsIGNvbW1pdExvZy5sZW5ndGgpIC0gMTtcbiAgICByZXR1cm4geyBiYXNpczogW3JlZGFjdGlvbnNJblJhbmdlKGNvbW1pdExvZywga2V5LCAwLCBlbmQpLmhpZGRlbiA/ICdyZWRhY3RlZCcgOiAnbmV2ZXItd3JpdHRlbiddIH07XG4gIH1cbiAgcmV0dXJuIHsgd3JpdGVyLCBiYXNpczogd3JpdGVzT25seUluc2lkZSh3cml0ZXIsIGtleSkgPyBbJ25lc3RlZC1yb3dzJ10gOiBbXSB9O1xufVxuXG4vKipcbiAqIHtAbGluayBjb21taXRWYWx1ZUF0fSBvbiBhIGxvZyB0aGF0IGlzIG5vdCBmcm96ZW46IHJlZnVzZSBhbiB1bmtub3duIHZlcmIgdW5kZXIgdGhlIHRvcC1sZXZlbCBrZXksXG4gKiB0aGVuIHNjYW4gYmFjayBmcm9tIGBlbmRgIHRvIHRoZSBsYXN0IGBzZXRgIE9OIHRoZSBrZXksIGtlZXBpbmcgdGhlIHJvd3Mgb24gYW5kIGluc2lkZSBpdCDigJQgZW5vdWdoXG4gKiB3aGlsZSBub3RoaW5nIEFST1VORCB0aGUga2V5IHdhcyB3cml0dGVuIGluIGJldHdlZW4gKGFuZCwgZm9yIGEgbmVzdGVkIGtleSwgbm8gYGRlbGV0ZWAgb24gaXQ6IGFcbiAqIGBkZWxldGVgIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lcikuIE90aGVyd2lzZSB0aGUgbW9kZWwgZm9sZHMgdGhlIHRvcC1sZXZlbCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHZhbHVlQnlTY2FuKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIGVuZDogbnVtYmVyLCBrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCByb290ID0gcm9vdE9mKGtleSk7XG4gIGZvciAobGV0IGMgPSAwOyBjIDw9IGVuZDsgYysrKSB7XG4gICAgY29uc3QgdHJhY2UgPSBjb21taXRMb2dbY10udHJhY2U7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHRyYWNlLmxlbmd0aDtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0cmFjZS5sZW5ndGg7IHJvdysrKSB7XG4gICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICBpZiAoKHBhdGggPT09IHJvb3QgfHwgcmVsYXRpb24ocGF0aCwgcm9vdCkgPT09ICdpbnNpZGUnKSAmJiAhaXNWZXJiKHZlcmIpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIsIHsgcGF0aCwgcm93LCBjb21taXQ6IGMgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IG5lc3RlZCA9IHJvb3QgIT09IGtleTtcbiAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICBsZXQgYW5jaG9yZWQgPSBmYWxzZTtcbiAgZm9yIChsZXQgYyA9IGVuZDsgYyA+PSAwICYmICFhbmNob3JlZDsgYy0tKSB7XG4gICAgY29uc3QgdHJhY2UgPSBjb21taXRMb2dbY10udHJhY2U7XG4gICAgZm9yIChsZXQgcm93ID0gdHJhY2UubGVuZ3RoIC0gMTsgcm93ID49IDA7IHJvdy0tKSB7XG4gICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICBjb25zdCByID0gcmVsYXRpb24ocGF0aCwga2V5KTtcbiAgICAgIGlmIChyID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKHIgPT09ICdhcm91bmQnIHx8IChuZXN0ZWQgJiYgciA9PT0gJ2V4YWN0JyAmJiB2ZXJiID09PSAnZGVsZXRlJykpIHtcbiAgICAgICAgcmV0dXJuIGxvZ01vZGVsKGNvbW1pdExvZykudmFsdWVBdChrZXksIGVuZCk7XG4gICAgICB9XG4gICAgICByb3dzLnB1c2goeyB2ZXJiOiB2ZXJiIGFzIFRvdWNoWyd2ZXJiJ10sIGJ1bmRsZTogY29tbWl0TG9nW2NdLCBjb21taXRJZHg6IGMgYXMgQ29tbWl0SWR4LCBwYXRoLCByZWxhdGlvbjogciB9KTtcbiAgICAgIGlmIChyID09PSAnZXhhY3QnICYmICh2ZXJiID09PSAnc2V0JyB8fCB2ZXJiID09PSAnZGVsZXRlJykpIHtcbiAgICAgICAgYW5jaG9yZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZm9sZEtleShyb3dzLnJldmVyc2UoKSwga2V5LnNwbGl0KERFTElNKSk7XG59XG5cbi8qKlxuICogUG9zaXRpb24gaW5kZXggb3ZlciBhIGNvbW1pdCBsb2c6IGBydW50aW1lU3RhZ2VJZGAg4oaSIHRoZSBBUlJBWSBJTkRFWCBvZiB0aGVcbiAqIEZJUlNUIGJ1bmRsZSB0aGF0IHN0YWdlIGNvbW1pdHRlZC5cbiAqXG4gKiBcIkZpcnN0XCIgaXMgdGhlIGNvbnRyYWN0LCBhbmQgaXQgaXMgbG9hZC1iZWFyaW5nLiBBIHN0YWdlIG5vcm1hbGx5IGNvbW1pdHNcbiAqIGV4YWN0bHkgb25lIGJ1bmRsZSwgYnV0IGEgc3ViZmxvdyBNT1VOVCBjb21taXRzIHR3byB0aGF0IHNoYXJlIG9uZVxuICogYHJ1bnRpbWVTdGFnZUlkYCAodGhlIG91dHB1dC1tYXBwaW5nIGNvbW1pdCwgdGhlbiB0aGUgbW91bnQtZXhpdCBjb21taXQpLlxuICogQSBjdXJzb3IgYXNrcyBcIndoZXJlIGRvZXMgdGhpcyBzdGFnZSBzdGFydD9cIiwgc28gdGhlIGZpcnN0IHdpbnMg4oCUIHRoZVxuICogZ3JvdXBpbmcgYSByZWFkZXIncyBheGlzIHVzZXMgKGBjb21taXRTdG9wc2ApIGFuY2hvcnMgYXQgdGhlIHNhbWUgcGxhY2UuXG4gKlxuICogQnVpbGQgdGhpcyBPTkNFIHdoZW4gcmVzb2x2aW5nIG1hbnkgaWRzOyB1c2Uge0BsaW5rIGNvbW1pdEluZGV4T2Z9IGZvciBhXG4gKiBzaW5nbGUgbG9va3VwLlxuICpcbiAqIEBwYXJhbSBjb21taXRMb2cgT3JkZXJlZCBjb21taXQgYnVuZGxlcyDigJQgYGdldFNuYXBzaG90KCkuY29tbWl0TG9nYC5cbiAqIEByZXR1cm5zIEEgZnJlc2ggTWFwLCBvd25lZCBieSB0aGUgY2FsbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21taXRJbmRleChjb21taXRMb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21taXRMb2cubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpZCA9IGNvbW1pdExvZ1tpXS5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAoIWluZGV4LmhhcyhpZCkpIGluZGV4LnNldChpZCwgaSk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIFRoZSBBUlJBWSBJTkRFWCBvZiB0aGUgZmlyc3QgY29tbWl0IGEgZ2l2ZW4gYHJ1bnRpbWVTdGFnZUlkYCBwcm9kdWNlZCwgb3JcbiAqIGAtMWAgd2hlbiB0aGF0IHN0YWdlIGlzIG5vdCBpbiB0aGlzIGxvZyAoYGluZGV4T2ZgIHNlbWFudGljcyDigJQgdGhlIG5hbWUnc1xuICogcHJvbWlzZSkuXG4gKlxuICogVGhpcyBpcyB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBldmVyeSByZWFkZXIgbmVlZHMgYW5kIG5vYm9keSBleHBvcnRlZDogYVxuICogYHJ1bnRpbWVTdGFnZUlkYCBpcyB0aGUgaWQgYW4gZXZlbnQgY2FycmllcywgYSBjb21taXQgaW5kZXggaXMgd2hhdFxuICogYGNvbW1pdFZhbHVlQXRgIC8gYHN0YXRlQXRgIC8gYENvbW1pdFJhbmdlSW5kZXhgIHNwZWFrLiBPKG4pIOKAlCBmb3IgbWFueVxuICogbG9va3VwcyBidWlsZCB0aGUgbWFwIG9uY2Ugd2l0aCB7QGxpbmsgYnVpbGRDb21taXRJbmRleH0uXG4gKlxuICogQSBzdGFnZSB0aGF0IHJhbiBpbnNpZGUgYSBTVUJGTE9XIGlzIG5vdCBpbiB0aGUgcnVuLWxldmVsIGxvZyAoc3ViZmxvd3NcbiAqIGNvbW1pdCB0byB0aGVpciBvd24gaXNvbGF0ZWQgbG9nKTsgbG9vayBpdCB1cCBpbiB0aGF0IHN1YmZsb3cncyBvd25cbiAqIGBoaXN0b3J5YCBpbnN0ZWFkIOKAlCBzZWUgYGdldFN1YnRyZWVTbmFwc2hvdGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGlkeCA9IGNvbW1pdEluZGV4T2Yoc25hcHNob3QuY29tbWl0TG9nLCAnc2NvcmUtcmlzayM3Jyk7XG4gKiBjb25zdCBiZWZvcmUgPSBpZHggPiAwID8gY29tbWl0VmFsdWVBdChzbmFwc2hvdC5jb21taXRMb2csIGlkeCAtIDEsICdyaXNrJykgOiB1bmRlZmluZWQ7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdEluZGV4T2YoY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSwgcnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWl0TG9nLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNvbW1pdExvZ1tpXS5ydW50aW1lU3RhZ2VJZCA9PT0gcnVudGltZVN0YWdlSWQpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cbiJdfQ==