@workflow/core 4.8.3 → 4.8.5

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.
package/dist/private.d.ts CHANGED
@@ -126,6 +126,13 @@ interface DeliveryBarrierEntry {
126
126
  * once a consumer takes the payload.
127
127
  */
128
128
  armed: boolean;
129
+ /**
130
+ * Retire this entry: resolve `delivered` and remove it from the registry,
131
+ * exactly as `markDelivered` would. Called only by the context's safety-net
132
+ * dispenser ({@link ensureBarrierSafetyNet}), and only on the lowest-index
133
+ * entry at delivery idle. Idempotent.
134
+ */
135
+ retire: () => void;
129
136
  }
130
137
  /**
131
138
  * Awaits, in strict event-log order, every still-registered delivery that is
@@ -151,6 +158,20 @@ interface DeliveryBarrierEntry {
151
158
  * Waits and hooks keep gating on unclaimed payloads: for them, waiting for the
152
159
  * claim IS the ordering guarantee (a `wait_completed` must not preempt a
153
160
  * payload the log ordered first).
161
+ *
162
+ * A delivery that does gate on an unclaimed payload still delivers in log
163
+ * order once that payload's barrier is retired, and that rests on the
164
+ * PAYLOAD's barrier being retired before that of anything parked behind it.
165
+ * That order is structural: safety-net retirements go through one per-context
166
+ * dispenser that only ever retires the lowest-index entry at delivery idle,
167
+ * and every retirement that wakes a chain flips
168
+ * {@link hasParkedCommittedDelivery} back to true, re-blocking the dispenser
169
+ * until the chain has drained — see {@link ensureBarrierSafetyNet}. (This
170
+ * used to rest on the FIFO of one idle poll per barrier, which held for a
171
+ * single parked segment but decayed to timing noise with several — the
172
+ * release order, and therefore the ULIDs drawn by the woken branches, then
173
+ * depended on how much log the replay had loaded. storm-log-replay.test.ts
174
+ * replays a production log corrupted exactly that way.)
154
175
  */
155
176
  export declare function awaitEarlierDeliveries(ctx: WorkflowOrchestratorContext, eventIndex: number | undefined, kind: DeliveryKind): Promise<void>;
156
177
  /** Handle for a registered branch-deciding delivery barrier. */
@@ -208,6 +229,18 @@ export declare function registerDeliveryBarrier(ctx: WorkflowOrchestratorContext
208
229
  * what it has and has not done yet says nothing about the run. Two callers
209
230
  * read it, for the two such decisions: {@link scheduleWhenIdle} for the
210
231
  * suspension, and the events consumer's unconsumed-event check for divergence.
232
+ *
233
+ * A non-empty barrier registry counts as in flight, even when every remaining
234
+ * entry is parked behind an unclaimed buffered payload. Those entries only
235
+ * move when the safety-net dispenser retires them (lowest-first, see
236
+ * {@link ensureBarrierSafetyNet}), and the deliveries they release are real
237
+ * workflow reactions — a suspension raised before they run would be computed
238
+ * from a VM that has not seen them, scheduling none of their follow-up work
239
+ * and leaving the run dormant (the vercel/workflow#3183 shape). The dispenser
240
+ * itself is gated on {@link canRetireAbandonedBarriers}, the weaker predicate
241
+ * without the registry term, precisely so it can do the draining that this
242
+ * predicate waits for; registry size strictly decreases at each retirement,
243
+ * so idle is always reached.
211
244
  */
212
245
  export declare function isDeliveryIdle(ctx: WorkflowOrchestratorContext): boolean;
213
246
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"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"}
package/dist/private.js CHANGED
@@ -90,8 +90,7 @@ export { __private_getClosureVars } from './step/get-closure-vars.js';
90
90
  * Which earlier kinds each delivery kind defers behind. Chosen so that no kind
91
91
  * blocks on a peer it does not need to:
92
92
  *
93
- * - a hook defers behind earlier WAITS and STEPS — not earlier hooks, which
94
- * are sequential same-entity payloads and must not block one another;
93
+ * - a hook defers behind earlier HOOKS, WAITS and STEPS;
95
94
  * - a wait defers behind earlier HOOKS and STEPS — not earlier waits, since a
96
95
  * wait never needs to queue behind another wait;
97
96
  * - a step defers behind earlier WAITS, HOOKS and STEPS.
@@ -114,7 +113,7 @@ export { __private_getClosureVars } from './step/get-closure-vars.js';
114
113
  * wait-for graph can never contain a cycle.
115
114
  */
116
115
  const DEFER_BEHIND = {
117
- hook: ['wait', 'step'],
116
+ hook: ['hook', 'wait', 'step'],
118
117
  wait: ['hook', 'step'],
119
118
  step: ['wait', 'hook', 'step'],
120
119
  };
@@ -187,6 +186,20 @@ function computeResolvesOnItsOwn(barriers, index, entry, memo) {
187
186
  * Waits and hooks keep gating on unclaimed payloads: for them, waiting for the
188
187
  * claim IS the ordering guarantee (a `wait_completed` must not preempt a
189
188
  * payload the log ordered first).
189
+ *
190
+ * A delivery that does gate on an unclaimed payload still delivers in log
191
+ * order once that payload's barrier is retired, and that rests on the
192
+ * PAYLOAD's barrier being retired before that of anything parked behind it.
193
+ * That order is structural: safety-net retirements go through one per-context
194
+ * dispenser that only ever retires the lowest-index entry at delivery idle,
195
+ * and every retirement that wakes a chain flips
196
+ * {@link hasParkedCommittedDelivery} back to true, re-blocking the dispenser
197
+ * until the chain has drained — see {@link ensureBarrierSafetyNet}. (This
198
+ * used to rest on the FIFO of one idle poll per barrier, which held for a
199
+ * single parked segment but decayed to timing noise with several — the
200
+ * release order, and therefore the ULIDs drawn by the woken branches, then
201
+ * depended on how much log the replay had loaded. storm-log-replay.test.ts
202
+ * replays a production log corrupted exactly that way.)
190
203
  */
191
204
  export async function awaitEarlierDeliveries(ctx, eventIndex, kind) {
192
205
  // Defensive: tolerate contexts that predate this field (test harnesses).
@@ -258,12 +271,6 @@ export function registerDeliveryBarrier(ctx, eventIndex, kind, options = {}) {
258
271
  }
259
272
  let done = false;
260
273
  const { promise, resolve } = withResolvers();
261
- const entry = {
262
- kind,
263
- delivered: promise,
264
- armed: options.armed ?? true,
265
- };
266
- barriers.set(eventIndex, entry);
267
274
  const finish = () => {
268
275
  if (done) {
269
276
  return;
@@ -274,12 +281,22 @@ export function registerDeliveryBarrier(ctx, eventIndex, kind, options = {}) {
274
281
  }
275
282
  resolve();
276
283
  };
284
+ const entry = {
285
+ kind,
286
+ delivered: promise,
287
+ armed: options.armed ?? true,
288
+ retire: finish,
289
+ };
290
+ barriers.set(eventIndex, entry);
277
291
  // Safety net: if this delivery is never delivered to the workflow (its
278
292
  // branch was not taken / the run is suspending, or a buffered hook payload
279
293
  // is only claimed after a later delivery the workflow is still waiting on),
280
- // resolve at idle so a later delivery gated on it cannot deadlock and the
281
- // registry cannot leak an entry per abandoned delivery.
282
- scheduleWhenIdle(ctx, finish);
294
+ // it is retired at idle so a later delivery gated on it cannot deadlock and
295
+ // the registry cannot leak an entry per abandoned delivery. Retirement goes
296
+ // through the context's single ordered dispenser rather than a per-barrier
297
+ // idle poll — see {@link ensureBarrierSafetyNet} for why the ORDER of these
298
+ // retirements is load-bearing.
299
+ ensureBarrierSafetyNet(ctx);
283
300
  return {
284
301
  markDelivered: finish,
285
302
  arm: () => {
@@ -287,6 +304,113 @@ export function registerDeliveryBarrier(ctx, eventIndex, kind, options = {}) {
287
304
  },
288
305
  };
289
306
  }
307
+ /**
308
+ * Contexts whose barrier safety-net dispenser is currently armed. Module-level
309
+ * so the context interface (constructed literally by many test harnesses)
310
+ * needs no new field; entries drop with the context.
311
+ */
312
+ const activeBarrierSafetyNets = new WeakSet();
313
+ /**
314
+ * The barrier registry's safety net: ONE idle-gated dispenser per context that
315
+ * retires, at each observation of delivery idle, only the LOWEST-index entry
316
+ * still registered, then yields so the chain it released can run before the
317
+ * next retirement is considered.
318
+ *
319
+ * Why one ordered dispenser and not a poll per barrier (which is what this
320
+ * replaced): the order of safety-net retirements decides the delivery order of
321
+ * every chain parked behind an unclaimed buffered hook payload — a hook the
322
+ * workflow never reads (a fire-and-forget `createHook`) parks every later
323
+ * armed wait/hook behind a barrier that only this net can retire. Per-barrier
324
+ * polls fire in whatever order their re-arm cycles land, and each re-arm
325
+ * attaches to a `promiseQueue` that grows between checks, so with several
326
+ * parked segments the release order decays to timing noise. Draws (`useStep`
327
+ * correlation ids) then depend on which segment happened to release first —
328
+ * concretely, on how MUCH log the replay loaded, since that decides what is in
329
+ * the registry. That is the mechanism behind slot-mode CORRUPTED_EVENT_LOG on
330
+ * storm-shaped runs (see storm-log-replay.test.ts, built from a production
331
+ * log): two replays of the same run holding different-length prefixes bound
332
+ * the same correlation ordinal to different steps.
333
+ *
334
+ * Retiring lowest-first is not merely tidy, it is the only order that cannot
335
+ * invert the log: every gate points from a higher index to a strictly lower
336
+ * one, so at delivery idle the lowest undelivered entry gates on nothing
337
+ * still registered — it is the head of every parked chain (in practice, the
338
+ * unclaimed payload itself). Releasing it lets the chain above deliver
339
+ * through the ordinary barrier order; anything the release wakes flips
340
+ * {@link hasParkedCommittedDelivery} back to true, which re-blocks this
341
+ * dispenser until the chain has fully drained. A higher entry must never be
342
+ * retired while a lower one is registered — that is exactly the inversion
343
+ * described on {@link awaitEarlierDeliveries}.
344
+ *
345
+ * The dispenser goes dormant when the registry empties and is re-armed by the
346
+ * next registration, so an idle context holds no live timer.
347
+ */
348
+ function ensureBarrierSafetyNet(ctx) {
349
+ const barriers = ctx.pendingDeliveryBarriers;
350
+ if (!barriers || activeBarrierSafetyNets.has(ctx)) {
351
+ return;
352
+ }
353
+ activeBarrierSafetyNets.add(ctx);
354
+ const rearm = () => {
355
+ setTimeout(check, 0);
356
+ };
357
+ // A rejected promiseQueue settles immediately and forever, so re-arming
358
+ // through it at the normal cadence would degenerate into a busy loop on an
359
+ // abandoned context. Back off instead: correctness only needs the dispenser
360
+ // to still exist, since the registry gates suspension via isDeliveryIdle
361
+ // and a dead dispenser would wedge the run.
362
+ const rearmAfterRejection = () => {
363
+ setTimeout(check, 50);
364
+ };
365
+ const check = () => {
366
+ if (barriers.size === 0) {
367
+ // Dormant. The next registerDeliveryBarrier re-arms.
368
+ activeBarrierSafetyNets.delete(ctx);
369
+ return;
370
+ }
371
+ if (!canRetireAbandonedBarriers(ctx)) {
372
+ // A delivery is hydrating or committed-but-parked on its deferral; let
373
+ // the queue drain and re-check a tick later (same cadence as
374
+ // scheduleWhenIdle).
375
+ ctx.promiseQueue.then(rearm, rearmAfterRejection);
376
+ return;
377
+ }
378
+ // Idle with entries left: nothing remaining delivers on its own, so
379
+ // release parked chains from the head — lowest index first, one at a
380
+ // time, re-reading idle between retirements. A retirement that wakes a
381
+ // chain flips {@link hasParkedCommittedDelivery} synchronously (it is
382
+ // computed from the registry this loop just mutated), which stops the
383
+ // sweep so the chain delivers before anything above it is released. A
384
+ // retirement that wakes nothing (a stale payload no delivery gates on)
385
+ // keeps the sweep going, so a backlog of those drains in ONE idle
386
+ // observation — pacing them one per timer tick would hold consumed-but-
387
+ // undelivered events hostage long enough to trip the events consumer's
388
+ // unconsumed-event deadline and fail healthy replays.
389
+ while (barriers.size > 0 && canRetireAbandonedBarriers(ctx)) {
390
+ let lowestIndex;
391
+ let lowestEntry;
392
+ for (const [index, entry] of barriers) {
393
+ if (lowestIndex === undefined || index < lowestIndex) {
394
+ lowestIndex = index;
395
+ lowestEntry = entry;
396
+ }
397
+ }
398
+ lowestEntry?.retire();
399
+ }
400
+ setTimeout(check, 0);
401
+ };
402
+ setTimeout(check, 0);
403
+ }
404
+ /**
405
+ * Whether the safety-net dispenser may retire abandoned barriers right now:
406
+ * no hydration in flight and no committed delivery still working through its
407
+ * detached deferral. This is deliberately WEAKER than {@link isDeliveryIdle}:
408
+ * the dispenser is what empties the registry, so gating it on registry
409
+ * emptiness would gate its own work.
410
+ */
411
+ function canRetireAbandonedBarriers(ctx) {
412
+ return ctx.pendingDeliveries === 0 && !hasParkedCommittedDelivery(ctx);
413
+ }
290
414
  /**
291
415
  * Whether some registered branch-deciding delivery is going to reach the
292
416
  * workflow without any further help (it is armed and not transitively parked
@@ -343,9 +467,22 @@ function hasParkedCommittedDelivery(ctx) {
343
467
  * what it has and has not done yet says nothing about the run. Two callers
344
468
  * read it, for the two such decisions: {@link scheduleWhenIdle} for the
345
469
  * suspension, and the events consumer's unconsumed-event check for divergence.
470
+ *
471
+ * A non-empty barrier registry counts as in flight, even when every remaining
472
+ * entry is parked behind an unclaimed buffered payload. Those entries only
473
+ * move when the safety-net dispenser retires them (lowest-first, see
474
+ * {@link ensureBarrierSafetyNet}), and the deliveries they release are real
475
+ * workflow reactions — a suspension raised before they run would be computed
476
+ * from a VM that has not seen them, scheduling none of their follow-up work
477
+ * and leaving the run dormant (the vercel/workflow#3183 shape). The dispenser
478
+ * itself is gated on {@link canRetireAbandonedBarriers}, the weaker predicate
479
+ * without the registry term, precisely so it can do the draining that this
480
+ * predicate waits for; registry size strictly decreases at each retirement,
481
+ * so idle is always reached.
346
482
  */
347
483
  export function isDeliveryIdle(ctx) {
348
- return ctx.pendingDeliveries === 0 && !hasParkedCommittedDelivery(ctx);
484
+ return (ctx.pendingDeliveries === 0 &&
485
+ (!ctx.pendingDeliveryBarriers || ctx.pendingDeliveryBarriers.size === 0));
349
486
  }
350
487
  /**
351
488
  * Schedule a callback to fire only after all pending data deliveries
@@ -384,4 +521,4 @@ export function scheduleWhenIdle(ctx, fn) {
384
521
  };
385
522
  setTimeout(check, 0);
386
523
  }
387
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBZWhELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sYUFBYSxHQUVmLFVBQVUsQ0FBQztBQUVmLHdEQUF3RDtBQUN4RCxNQUFNLGVBQWUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLElBQUksR0FBRyxFQUduRSxDQUFDLENBQUM7QUFFTCxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2pDLGlDQUFpQztJQUNqQyx5QkFBeUI7SUFDekIseUJBQXlCO0NBQzFCLENBQUMsQ0FBQztBQUVILFNBQVMsd0JBQXdCLENBQUMsTUFBYztJQUM5QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzlDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTVDLE1BQU0sUUFBUSxHQUFHLENBQUMsZUFBdUIsRUFBRSxFQUFFO1FBQzNDLElBQUksZUFBZSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ25DLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FB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QztRQUN0QyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDNUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFnQztJQUM3RCxPQUFPLEdBQUcsQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixHQUFnQyxFQUNoQyxFQUFjO0lBRWQsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6Qix1RUFBdUU7WUFDdkUscUVBQXFFO1lBQ3JFLHFFQUFxRTtZQUNyRSxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3pCLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLEVBQUUsRUFBRSxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUMsQ0FBQztJQUNGLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXRpbHMgdXNlZCBieSB0aGUgYnVuZGxlciB3aGVuIHRyYW5zZm9ybWluZyBjb2RlXG4gKi9cblxuaW1wb3J0IHsgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IENyeXB0b0tleSB9IGZyb20gJy4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50c0NvbnN1bWVyIH0gZnJvbSAnLi9ldmVudHMtY29uc3VtZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZUl0ZW0gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4vc2NoZW1hcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0ZXBIeWRyYXRpb25DYWNoZSB9IGZyb20gJy4vc3RlcC1oeWRyYXRpb24tY2FjaGUuanMnO1xuXG5leHBvcnQgdHlwZSBTdGVwRnVuY3Rpb248XG4gIEFyZ3MgZXh0ZW5kcyBTZXJpYWxpemFibGVbXSA9IGFueVtdLFxuICBSZXN1bHQgZXh0ZW5kcyBTZXJpYWxpemFibGUgfCB1bmtub3duID0gdW5rbm93bixcbj4gPSAoKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2U8UmVzdWx0PikgJiB7XG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIHN0ZXBJZD86IHN0cmluZztcbn07XG5cbmNvbnN0IFJlZ2lzdGVyZWRTdGVwc0tleSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9jb3JlLy9yZWdpc3RlcmVkU3RlcHMnKTtcblxuY29uc3QgZ2xvYmFsU3ltYm9sczogdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gIFtSZWdpc3RlcmVkU3RlcHNLZXldPzogTWFwPHN0cmluZywgU3RlcEZ1bmN0aW9uPjtcbn0gPSBnbG9iYWxUaGlzO1xuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogL1xuY29uc3QgcmVnaXN0ZXJlZFN0ZXBzID0gKGdsb2JhbFN5bWJvbHNbUmVnaXN0ZXJlZFN0ZXBzS2V5XSA/Pz0gbmV3IE1hcDxcbiAgc3RyaW5nLFxuICBTdGVwRnVuY3Rpb25cbj4oKSk7XG5cbmNvbnN0IEJVSUxUSU5fU1RFUF9OQU1FUyA9IG5ldyBTZXQoW1xuICAnX19idWlsdGluX3Jlc3BvbnNlX2FycmF5X2J1ZmZlcicsXG4gICdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicsXG4gICdfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dCcsXG5dKTtcblxuZnVuY3Rpb24gZ2V0U3RlcElkQWxpYXNDYW5kaWRhdGVzKHN0ZXBJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXJ0cyA9IHN0ZXBJZC5zcGxpdCgnLy8nKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyB8fCBwYXJ0c1swXSAhPT0gJ3N0ZXAnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlUGF0aCA9IHBhcnRzWzFdO1xuICBjb25zdCBmbk5hbWUgPSBwYXJ0c1syXTtcbiAgY29uc3QgbW9kdWxlUGF0aEFsaWFzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCBhZGRBbGlhcyA9IChhbGlhc01vZHVsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgIGlmIChhbGlhc01vZHVsZVBhdGggIT09IG1vZHVsZVBhdGgpIHtcbiAgICAgIG1vZHVsZVBhdGhBbGlhc2VzLmFkZChhbGlhc01vZHVsZVBhdGgpO1xuICAgIH1cbiAgfTtcblxuICBpZiAobW9kdWxlUGF0aC5zdGFydHNXaXRoKCcuL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vZXhhbXBsZS8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICAgIGFkZEFsaWFzKGAuL3NyYy8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9IGVsc2UgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi9leGFtcGxlL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi9leGFtcGxlLycubGVuZ3RoKTtcbiAgICBhZGRBbGlhcyhgLi8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICAgIGFkZEFsaWFzKGAuL3NyYy8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9IGVsc2UgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi9zcmMvd29ya2Zsb3dzLycpKSB7XG4gICAgY29uc3Qgd29ya2Zsb3dSZWxhdGl2ZVBhdGggPSBtb2R1bGVQYXRoLnNsaWNlKCcuL3NyYy8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9leGFtcGxlLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICBtb2R1bGVQYXRoQWxpYXNlcyxcbiAgICAoYWxpYXNNb2R1bGVQYXRoKSA9PiBgc3RlcC8vJHthbGlhc01vZHVsZVBhdGh9Ly8ke2ZuTmFtZX1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEJ1aWx0aW5SZXNwb25zZVN0ZXBBbGlhcyhzdGVwSWQ6IHN0cmluZyk6IFN0ZXBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmICghQlVJTFRJTl9TVEVQX05BTUVTLmhhcyhzdGVwSWQpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3JlZ2lzdGVyZWRTdGVwSWQsIHN0ZXBGbl0gb2YgcmVnaXN0ZXJlZFN0ZXBzLmVudHJpZXMoKSkge1xuICAgIGlmIChyZWdpc3RlcmVkU3RlcElkLmVuZHNXaXRoKGAvLyR7c3RlcElkfWApKSB7XG4gICAgICByZXR1cm4gc3RlcEZuO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBzdGVwIGZ1bmN0aW9uIHRvIGJlIHNlcnZlZCBpbiB0aGUgc2VydmVyIGJ1bmRsZS5cbiAqIEFsc28gc2V0cyB0aGUgc3RlcElkIHByb3BlcnR5IG9uIHRoZSBmdW5jdGlvbiBmb3Igc2VyaWFsaXphdGlvbiBzdXBwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdGVwRnVuY3Rpb24oc3RlcElkOiBzdHJpbmcsIHN0ZXBGbjogU3RlcEZ1bmN0aW9uKSB7XG4gIHJlZ2lzdGVyZWRTdGVwcy5zZXQoc3RlcElkLCBzdGVwRm4pO1xuICBzdGVwRm4uc3RlcElkID0gc3RlcElkO1xufVxuXG4vKipcbiAqIEZpbmQgYSByZWdpc3RlcmVkIHN0ZXAgZnVuY3Rpb24gYnkgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBJZDogc3RyaW5nKTogU3RlcEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGlyZWN0TWF0Y2ggPSByZWdpc3RlcmVkU3RlcHMuZ2V0KHN0ZXBJZCk7XG4gIGlmIChkaXJlY3RNYXRjaCkge1xuICAgIHJldHVybiBkaXJlY3RNYXRjaDtcbiAgfVxuXG4gIC8vIFN1cHBvcnQgZXF1aXZhbGVudCB3b3JrZmxvdyBwYXRoIGFsaWFzZXMgaW4gbWl4ZWQgc3ltbGluayBlbnZpcm9ubWVudHMuXG4gIGZvciAoY29uc3QgYWxpYXNTdGVwSWQgb2YgZ2V0U3RlcElkQWxpYXNDYW5kaWRhdGVzKHN0ZXBJZCkpIHtcbiAgICBjb25zdCBhbGlhc01hdGNoID0gcmVnaXN0ZXJlZFN0ZXBzLmdldChhbGlhc1N0ZXBJZCk7XG4gICAgaWYgKGFsaWFzTWF0Y2gpIHtcbiAgICAgIHJldHVybiBhbGlhc01hdGNoO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJ1aWx0aW5BbGlhc01hdGNoID0gZ2V0QnVpbHRpblJlc3BvbnNlU3RlcEFsaWFzKHN0ZXBJZCk7XG4gIGlmIChidWlsdGluQWxpYXNNYXRjaCkge1xuICAgIHJldHVybiBidWlsdGluQWxpYXNNYXRjaDtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IGNsb3N1cmUgdmFyaWFibGVzIGZvciB0aGUgY3VycmVudCBzdGVwIGZ1bmN0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgX19wcml2YXRlX2dldENsb3N1cmVWYXJzIH0gZnJvbSAnLi9zdGVwL2dldC1jbG9zdXJlLXZhcnMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGVuY3J5cHRpb25LZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZDtcbiAgZ2xvYmFsVGhpczogdHlwZW9mIGdsb2JhbFRoaXM7XG4gIGV2ZW50c0NvbnN1bWVyOiBFdmVudHNDb25zdW1lcjtcbiAgLyoqXG4gICAqIE1hcCBvZiBwZW5kaW5nIGludm9jYXRpb25zIGtleWVkIGJ5IGNvcnJlbGF0aW9uSWQuXG4gICAqIFVzaW5nIE1hcCBpbnN0ZWFkIG9mIEFycmF5IGZvciBPKDEpIGxvb2t1cC9kZWxldGUgb3BlcmF0aW9ucy5cbiAgICovXG4gIGludm9jYXRpb25zUXVldWU6IE1hcDxzdHJpbmcsIFF1ZXVlSXRlbT47XG4gIG9uV29ya2Zsb3dFcnJvcjogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgZ2VuZXJhdGVVbGlkOiAoKSA9PiBzdHJpbmc7XG4gIGdlbmVyYXRlTmFub2lkOiAoKSA9PiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXF1ZW50aWFsIHByb21pc2UgcXVldWUgdGhhdCBlbnN1cmVzIGFsbCBldmVudC1kcml2ZW4gcHJvbWlzZSByZXNvbHV0aW9uc1xuICAgKiAoc3RlcCByZXN1bHRzLCBob29rIHBheWxvYWRzLCBmYWlsdXJlcywgc3VzcGVuc2lvbnMpIGhhcHBlbiBpbiBldmVudCBsb2dcbiAgICogb3JkZXIuIEV2ZXJ5IHJlc29sdmUsIHJlamVjdCwgb3Igd29ya2Zsb3cgZXJyb3IgaXMgY2hhaW5lZCB0aHJvdWdoIHRoaXNcbiAgICogcXVldWUgc28gdGhhdCBldmVuIGlmIGluZGl2aWR1YWwgb3BlcmF0aW9ucyB0YWtlIHZhcmlhYmxlIHRpbWUgKGUuZy4sXG4gICAqIGFzeW5jIGRlY3J5cHRpb24pLCBwcm9taXNlcyByZXNvbHZlIGRldGVybWluaXN0aWNhbGx5LlxuICAgKi9cbiAgcHJvbWlzZVF1ZXVlOiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogQ291bnRlciBvZiBpbi1mbGlnaHQgYXN5bmMgZGF0YSBkZWxpdmVyeSBvcGVyYXRpb25zIChzdGVwIHJlc3VsdFxuICAgKiBoeWRyYXRpb24sIGhvb2sgcGF5bG9hZCBoeWRyYXRpb24pLiBTdXNwZW5zaW9ucyBtdXN0IHdhaXQgZm9yIHRoaXNcbiAgICogdG8gcmVhY2ggMCBiZWZvcmUgZmlyaW5nLCB0byBhdm9pZCBwcmVlbXB0aW5nIGRhdGEgZGVsaXZlcnkuXG4gICAqL1xuICBwZW5kaW5nRGVsaXZlcmllczogbnVtYmVyO1xuICAvKipcbiAgICogT3JkZXJlZCByZWdpc3RyeSBvZiBpbi1mbGlnaHQgXCJicmFuY2gtZGVjaWRpbmdcIiBkZWxpdmVyaWVzIOKAlCB0aGVcbiAgICogcmVzb2x1dGlvbnMgYSB3b3JrZmxvdyB0eXBpY2FsbHkgYFByb21pc2UucmFjZWBzIG9uLCBvciBhd2FpdHMgZnJvbVxuICAgKiBpbmRlcGVuZGVudCBjb25jdXJyZW50IGJyYW5jaGVzOiBob29rIHBheWxvYWRzIChgaG9va19yZWNlaXZlZGApLCB3YWl0XG4gICAqIGNvbXBsZXRpb25zIChgd2FpdF9jb21wbGV0ZWRgKSwgYW5kIHN0ZXAgcmVzdWx0cyAoYHN0ZXBfY29tcGxldGVkYCAvXG4gICAqIGBzdGVwX2ZhaWxlZGApLiBLZXllZCBieSB0aGUgZGVsaXZlcnkncyBwb3NpdGlvbiAoaW5kZXgpIGluIHRoZSBjb25zdW1lZFxuICAgKiBldmVudCBsb2cuXG4gICAqXG4gICAqIFRoZSBwcm9ibGVtOiBlYWNoIG9mIHRoZXNlIHJlc29sdXRpb25zIHJlYWNoZXMgd29ya2Zsb3cgY29kZSBhZnRlciBhXG4gICAqIGRpZmZlcmVudCwgd29ya2xvYWQtZGVwZW5kZW50IG51bWJlciBvZiBtaWNyb3Rhc2sgaG9wcy4gQSBidWZmZXJlZCBob29rXG4gICAqIHBheWxvYWQgaXMgb2JzZXJ2ZWQgdmlhIHRoZSBhc3luYyBob29rIGl0ZXJhdG9yIChgeWllbGQgYXdhaXQgdGhpc2ApLFxuICAgKiBjb3N0aW5nIGV4dHJhIGhvcHM7IGEgYHdhaXRfY29tcGxldGVkYCByZXNvbHZlcyB3aXRoIGZld2VyLCBhbmQgYSByZXVzZWRcbiAgICogc2xlZXAgY2FuIHJlc29sdmUgaW4gYW4gZW50aXJlbHkgZWFybGllciBsb29wIGl0ZXJhdGlvbjsgYSBzdGVwIHJlc3VsdCBpc1xuICAgKiBnYXRlZCBvbiBoeWRyYXRpb24gd2hvc2UgY29zdCB2YXJpZXMgYmV0d2VlbiByZXBsYXlzIG9mIHRoZSBTQU1FXG4gICAqIGludm9jYXRpb24g4oCUIHRoZSBmaXJzdCByZXBsYXkgcGF5cyB0aGUgZnVsbCBkZWNyeXB0L2RlY29tcHJlc3MvcmV2aXZlLFxuICAgKiB3aGlsZSBsYXRlciByZXBsYXlzIHNoYXJpbmcgdGhlIGludm9jYXRpb24ncyBgc3RlcEh5ZHJhdGlvbkNhY2hlYFxuICAgKiBtZW1vLWhpdCBzbWFsbCBwcmltaXRpdmUgcmVzdWx0cyBhbmQgcmVzb2x2ZSBpbiBvbmUgb3IgdHdvIGhvcHMuIEVpdGhlclxuICAgKiB3YXksIHRoZSByZXNvbHV0aW9uIHRoYXQgdGhlIGNvbW1pdHRlZCBldmVudCBsb2cgb3JkZXJlZCBmaXJzdCBjYW4gbG9zZSBhXG4gICAqIGBQcm9taXNlLnJhY2VgIChvciBhIGB1c2VTdGVwYCBVTElEIGFsbG9jYXRpb24pIHRvIGEgZmFzdGVyLSBvclxuICAgKiBhbHJlYWR5LXJlc29sdmVkIGNvbXBldGl0b3IsIGRpdmVyZ2luZyBmcm9tIHRoZSBsb2cgYW5kIHN1cmZhY2luZyBhc1xuICAgKiBgUmVwbGF5RGl2ZXJnZW5jZUVycm9yYC5cbiAgICpcbiAgICogVGhlIGZpeCBpcyBhIHN0cmljdCwgZGV0ZXJtaW5pc3RpYyBkZWxpdmVyeSBvcmRlciBhbmNob3JlZCBvblxuICAgKiBldmVudC1sb2cgcG9zaXRpb246IGEgZGVsaXZlcnkgZG9lcyBub3QgcmVzb2x2ZSB0byB0aGUgd29ya2Zsb3cgdW50aWxcbiAgICogZXZlcnkgcmVsZXZhbnQgZWFybGllci1pbi1sb2cgZGVsaXZlcnkgaGFzIGJlZW4gZGVsaXZlcmVkLiBCZWNhdXNlIHRoZVxuICAgKiBnYXRlIGlzIFwidGhlIGVhcmxpZXIgZGVsaXZlcnkgcmVzb2x2ZWRcIiwgbm90IFwid29uIGEgdGltaW5nIHJhY2VcIiwgdGhlXG4gICAqIG91dGNvbWUgaXMgaW5kZXBlbmRlbnQgb2YgbWljcm90YXNrIGhvcHMsIGh5ZHJhdGlvbi9kZWNyeXB0aW9uIHRpbWUsXG4gICAqIGFuZCBgUHJvbWlzZS5yYWNlYCBhcmd1bWVudCBvcmRlci4gV2hpY2ggZWFybGllciBraW5kcyBhIGRlbGl2ZXJ5IGRlZmVyc1xuICAgKiBiZWhpbmQgaXMgc3BlbGxlZCBvdXQgb24ge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9LlxuICAgKlxuICAgKiBJbmRleCBpcyB1c2VkIHJhdGhlciB0aGFuIHRoZSBgZXZlbnRJZGAgc3RyaW5nIGJlY2F1c2UgYGV2ZW50SWRgIGlzIGFuXG4gICAqIG9wYXF1ZSwgd29ybGQtYXNzaWduZWQgdmFsdWUgbm90IGd1YXJhbnRlZWQgdG8gc29ydCBpbiBjcmVhdGlvbiBvcmRlclxuICAgKiAob25seSB0aGUgYnVuZGxlZCBVTElEIHdvcmxkcyBoYXBwZW4gdG8pLlxuICAgKlxuICAgKiBPcHRpb25hbCBzbyBvbGRlci9vdXQtb2YtdHJlZSBjb250ZXh0cyAoYW5kIGxpZ2h0d2VpZ2h0IHRlc3QgaGFybmVzc2VzKVxuICAgKiB0aGF0IGRvIG5vdCBpbml0aWFsaXplIGl0IGRlZ3JhZGUgZ3JhY2VmdWxseSB0byB0aGUgcHJldmlvdXMgYmVoYXZpb3IuXG4gICAqL1xuICBwZW5kaW5nRGVsaXZlcnlCYXJyaWVycz86IE1hcDxudW1iZXIsIERlbGl2ZXJ5QmFycmllckVudHJ5PjtcbiAgLyoqXG4gICAqIFBlci1ydW4gbWVtb2l6YXRpb24gY2FjaGUgZm9yIGh5ZHJhdGVkIHN0ZXAgcmV0dXJuIHZhbHVlcywga2V5ZWQgYnkgdGhlXG4gICAqIGBzdGVwX2NvbXBsZXRlZGAgZXZlbnQgaWQuIE93bmVkIGJ5IHRoZSBpbmxpbmUgcmVwbGF5IGxvb3AgaW4gYHJ1bnRpbWUudHNgXG4gICAqIGFuZCB0aHJlYWRlZCB0aHJvdWdoIGVhY2ggYHJ1bldvcmtmbG93YCBjYWxsIHNvIGl0IHN1cnZpdmVzIGFjcm9zcyByZXBsYXlcbiAgICogaXRlcmF0aW9ucyBvZiB0aGUgU0FNRSBydW4gKGEgZnJlc2ggY29udGV4dCBpcyBjcmVhdGVkIGVhY2ggaXRlcmF0aW9uKSBidXRcbiAgICogbmV2ZXIgbGVha3MgYWNyb3NzIHVucmVsYXRlZCBydW5zLlxuICAgKlxuICAgKiBPbiByZXBsYXkgSyBvZiBhIHNlcXVlbnRpYWwgTi1zdGVwIHdvcmtmbG93LCB0aGUgc3RlcCBjb25zdW1lciB3b3VsZFxuICAgKiBvdGhlcndpc2UgcmUtZGVjcnlwdCBhbmQgcmUtcGFyc2UgdGhlIHJlc3VsdHMgb2YgYWxsIEsgYWxyZWFkeS1jb21wbGV0ZWRcbiAgICogc3RlcHMg4oCUIE8oTsKyKSBhY3Jvc3MgYW4gaW52b2NhdGlvbi4gVGhpcyBjYWNoZSBtYWtlcyBhIGNvbXBsZXRlZCBzdGVwJ3NcbiAgICogcmVzdWx0IGF2YWlsYWJsZSBpbiBPKDEpIG9uIHN1YnNlcXVlbnQgcmVwbGF5cy4gT25seSBwcmltaXRpdmUgcmVzdWx0cyBhcmVcbiAgICogbWVtb2l6ZWQsIHNvIGEgc2hhcmVkIHJlZmVyZW5jZSBjYW4gbmV2ZXIgbGV0IG9uZSByZXBsYXkncyBtdXRhdGlvbiBsZWFrXG4gICAqIGludG8gdGhlIG5leHQ7IHNlZSBgc3RlcC1oeWRyYXRpb24tY2FjaGUudHNgIGZvciB0aGUgZnVsbCByYXRpb25hbGUuXG4gICAqXG4gICAqIE9wdGlvbmFsIHNvIGNvbnRleHRzIHRoYXQgZG8gbm90IGluaXRpYWxpemUgaXQgKHRlc3QgaGFybmVzc2VzKSBkZWdyYWRlXG4gICAqIGdyYWNlZnVsbHkgdG8gcmUtaHlkcmF0aW5nIGV2ZXJ5IHJlcGxheSDigJQgaWRlbnRpY2FsIHRvIHByZXZpb3VzIGJlaGF2aW9yLlxuICAgKi9cbiAgc3RlcEh5ZHJhdGlvbkNhY2hlPzogU3RlcEh5ZHJhdGlvbkNhY2hlO1xufVxuXG4vKiogVGhlIGtpbmQgb2YgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5IGEgYmFycmllciByZXByZXNlbnRzLiAqL1xuZXhwb3J0IHR5cGUgRGVsaXZlcnlLaW5kID0gJ2hvb2snIHwgJ3dhaXQnIHwgJ3N0ZXAnO1xuXG5pbnRlcmZhY2UgRGVsaXZlcnlCYXJyaWVyRW50cnkge1xuICBraW5kOiBEZWxpdmVyeUtpbmQ7XG4gIC8qKiBSZXNvbHZlcyBvbmNlIHRoaXMgZGVsaXZlcnkgaGFzIHJlc29sdmVkIHRvIHRoZSB3b3JrZmxvdy4gKi9cbiAgZGVsaXZlcmVkOiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGRlbGl2ZXJ5IGlzIGNvbW1pdHRlZCB0byByZWFjaGluZyB0aGUgd29ya2Zsb3cgd2l0aG91dCBhbnlcbiAgICogZnVydGhlciBhY3Rpb24gYnkgd29ya2Zsb3cgY29kZS4gVHJ1ZSBmb3Igd2FpdCBjb21wbGV0aW9ucyBhbmQgc3RlcFxuICAgKiByZXN1bHRzLCB3aGljaCBhbHdheXMgcmVzb2x2ZSBmcm9tIHRoZWlyIG93biBjaGFpbiwgYW5kIGZvciBhIGhvb2sgcGF5bG9hZFxuICAgKiB0aGF0IGFscmVhZHkgaGFkIGEgd2FpdGluZyBjb25zdW1lciB3aGVuIGl0IHdhcyBjb25zdW1lZC5cbiAgICpcbiAgICogRmFsc2UgZm9yIGEgQlVGRkVSRUQgaG9vayBwYXlsb2FkIG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkIHlldDogaXQgaXNcbiAgICogZGVsaXZlcmVkIGJ5IGBjbGFpbSgpYCwgaS5lLiB3aGVuZXZlciB0aGUgd29ya2Zsb3cgbmV4dCByZWFkcyB0aGUgaG9vayDigJRcbiAgICogd2hpY2ggbWF5IGJlIGNhdXNhbGx5ICphZnRlciogYSBsYXRlci1pbi1sb2cgZGVsaXZlcnkuIGBhcm0oKWAgZmxpcHMgaXRcbiAgICogb25jZSBhIGNvbnN1bWVyIHRha2VzIHRoZSBwYXlsb2FkLlxuICAgKi9cbiAgYXJtZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogV2hpY2ggZWFybGllciBraW5kcyBlYWNoIGRlbGl2ZXJ5IGtpbmQgZGVmZXJzIGJlaGluZC4gQ2hvc2VuIHNvIHRoYXQgbm8ga2luZFxuICogYmxvY2tzIG9uIGEgcGVlciBpdCBkb2VzIG5vdCBuZWVkIHRvOlxuICpcbiAqICAtIGEgaG9vayBkZWZlcnMgYmVoaW5kIGVhcmxpZXIgV0FJVFMgYW5kIFNURVBTIOKAlCBub3QgZWFybGllciBob29rcywgd2hpY2hcbiAqICAgIGFyZSBzZXF1ZW50aWFsIHNhbWUtZW50aXR5IHBheWxvYWRzIGFuZCBtdXN0IG5vdCBibG9jayBvbmUgYW5vdGhlcjtcbiAqICAtIGEgd2FpdCBkZWZlcnMgYmVoaW5kIGVhcmxpZXIgSE9PS1MgYW5kIFNURVBTIOKAlCBub3QgZWFybGllciB3YWl0cywgc2luY2UgYVxuICogICAgd2FpdCBuZXZlciBuZWVkcyB0byBxdWV1ZSBiZWhpbmQgYW5vdGhlciB3YWl0O1xuICogIC0gYSBzdGVwIGRlZmVycyBiZWhpbmQgZWFybGllciBXQUlUUywgSE9PS1MgYW5kIFNURVBTLlxuICpcbiAqIFRoZSBzdGVwLWJlaGluZC1zdGVwIGVkZ2UgaXMgbm90IHJlZHVuZGFudCB3aXRoIHRoZSBzZXJpYWwgYHByb21pc2VRdWV1ZWAuXG4gKiBUaGUgcXVldWUgZml4ZXMgdGhlIG9yZGVyIGluIHdoaWNoIHN0ZXAgcmVzdWx0cyBhcmUgSFlEUkFURUQsIGJ1dCBhIHN0ZXAgbm9cbiAqIGxvbmdlciByZXNvbHZlcyBpbnNpZGUgaXRzIHF1ZXVlIHNsb3Qg4oCUIGl0IGNhcHR1cmVzIHRoZSBvdXRjb21lIHRoZXJlIGFuZFxuICogcmVzb2x2ZXMgZnJvbSBhIGRldGFjaGVkIGNvbnRpbnVhdGlvbiBvbmNlIGl0cyBiYXJyaWVyIGNsZWFycy4gVHdvIHN0ZXBzXG4gKiBhZ3JlZSBvbiB0aGF0IGNvbnRpbnVhdGlvbidzIG9yZGVyaW5nIG9ubHkgd2hpbGUgdGhleSBkZWZlciBiZWhpbmQgdGhlIHNhbWVcbiAqIHNldCwgd2hpY2ggaG9sZHMgd2hlbiB0aGV5IGFyZSBjb25zdW1lZCBpbiB0aGUgc2FtZSBkcmFpbiB3aW5kb3cgYnV0IG5vdFxuICogYWNyb3NzIHdpbmRvd3M6IGEgc3RlcCBjb25zdW1lZCBsYXRlciBjYW4gbWlzcyBhIHdhaXQvaG9vayBiYXJyaWVyIHRoYXQgYW5cbiAqIGVhcmxpZXIgc3RlcCBpcyBzdGlsbCBwYXJrZWQgb24sIGJlY2F1c2UgdGhlIGJhcnJpZXIgcmV0aXJlZCBpbiBiZXR3ZWVuLiBUaGVcbiAqIGVhcmxpZXIgc3RlcCBpcyB0aGVuIHdhaXRpbmcgb3V0IHRoZSBtYWNyb3Rhc2sgeWllbGQgYmVsb3cgd2hpbGUgdGhlIGxhdGVyXG4gKiBvbmUgcmVzb2x2ZXMgb24gbWljcm90YXNrcywgYW5kIG92ZXJ0YWtlcyBpdCDigJQgc2VlXG4gKiBgZGVsaXZlcnktYmFycmllci1jb3ZlcmFnZS50ZXN0LnRzYC4gRGVmZXJyaW5nIGJlaGluZCBlYXJsaWVyIHN0ZXBzXG4gKiBjbG9zZXMgdGhhdCB3aW5kb3cgc3RydWN0dXJhbGx5OiB0aGUgZWFybGllciBzdGVwJ3MgYmFycmllciBpcyBzdGlsbFxuICogcmVnaXN0ZXJlZCBwcmVjaXNlbHkgYmVjYXVzZSBpdCBoYXMgbm90IGRlbGl2ZXJlZCB5ZXQuXG4gKlxuICogRXZlcnkgZWRnZSBwb2ludHMgZnJvbSBhIGxhdGVyIGxvZyBpbmRleCB0byBhIHN0cmljdGx5IGVhcmxpZXIgb25lLCBzbyB0aGVcbiAqIHdhaXQtZm9yIGdyYXBoIGNhbiBuZXZlciBjb250YWluIGEgY3ljbGUuXG4gKi9cbmNvbnN0IERFRkVSX0JFSElORDogUmVjb3JkPERlbGl2ZXJ5S2luZCwgcmVhZG9ubHkgRGVsaXZlcnlLaW5kW10+ID0ge1xuICBob29rOiBbJ3dhaXQnLCAnc3RlcCddLFxuICB3YWl0OiBbJ2hvb2snLCAnc3RlcCddLFxuICBzdGVwOiBbJ3dhaXQnLCAnaG9vaycsICdzdGVwJ10sXG59O1xuXG4vKipcbiAqIFdoZXRoZXIgYGVudHJ5YCB3aWxsIHJlc29sdmUgb24gaXRzIG93biDigJQgaXQgaXMgYXJtZWQsIGFuZCBldmVyeSBlYXJsaWVyXG4gKiBkZWxpdmVyeSBpdCBkZWZlcnMgYmVoaW5kIHdpbGwgbGlrZXdpc2UgcmVzb2x2ZSBvbiBpdHMgb3duLlxuICpcbiAqIEEgc3RlcCBkZWxpdmVyeSBpcyBhbHdheXMgc2VsZi1yZXNvbHZpbmc6IGl0IHNraXBzIHVuY29tbWl0dGVkIGRlbGl2ZXJpZXNcbiAqIChzZWUge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9KSwgYW5kIHRoZSBlYXJsaWVyIHN0ZXBzIGl0IGRvZXMgZGVmZXJcbiAqIGJlaGluZCBhcmUgc2VsZi1yZXNvbHZpbmcgYnkgdGhlIHNhbWUgYXJndW1lbnQsIGluZHVjdGluZyBkb3duIG9uIGluZGV4LlxuICpcbiAqIFJlY3Vyc2lvbiB0ZXJtaW5hdGVzIGJlY2F1c2UgZXZlcnkgZWRnZSBwb2ludHMgdG8gYSBzdHJpY3RseSBzbWFsbGVyIGluZGV4LlxuICogYG1lbW9gIGlzIHJlcXVpcmVkIHJhdGhlciB0aGFuIGFuIG9wdGltaXphdGlvbjogd2l0aG91dCBpdCB0aGUgd2FsayBpc1xuICogZXhwb25lbnRpYWwgaW4gdGhlIG51bWJlciBvZiBsaXZlIGhvb2svd2FpdCBiYXJyaWVycyAoZWFjaCBhcm1lZCBlbnRyeVxuICogcmUtd2Fsa3MgZXZlcnkgZWFybGllciBlbnRyeSBvZiB0aGUgb3Bwb3NpdGUga2luZCwgVChuKSA9IM6jIFQoaikpLCBhbmQgdGhlXG4gKiByZWdpc3RyeSBpcyBub3Qgc21hbGwgYnkgY29uc3RydWN0aW9uIOKAlCBgRXZlbnRzQ29uc3VtZXJgIGRyYWluc1xuICogY29uc2VjdXRpdmVseSBjb25zdW1hYmxlIGV2ZW50cyBzeW5jaHJvbm91c2x5IHdoaWxlIGJhcnJpZXJzIG9ubHkgcmV0aXJlIG9uXG4gKiBtaWNyb3Rhc2stZHJpdmVuIGRlbGl2ZXJpZXMsIHNvIGEgZmFuLW91dCBvZiBgUHJvbWlzZS5yYWNlKFtob29rLCBzbGVlcF0pYFxuICogYnJhbmNoZXMgYWNjdW11bGF0ZXMgb25lIGJhcnJpZXIgcGVyIGJyYW5jaCBwZXIga2luZC4gTWVtb2l6ZWQsIHRoZSB3YWxrIGlzXG4gKiBsaW5lYXIgaW4gcmVnaXN0cnkgc2l6ZS4gVGhlIG1lbW8gTVVTVCBiZSBwZXItY2FsbDogYGFybWVkYCBtdXRhdGVzIGJldHdlZW5cbiAqIGNhbGxzIGFzIGJ1ZmZlcmVkIHBheWxvYWRzIGFyZSBjbGFpbWVkLlxuICovXG5mdW5jdGlvbiByZXNvbHZlc09uSXRzT3duKFxuICBiYXJyaWVyczogTWFwPG51bWJlciwgRGVsaXZlcnlCYXJyaWVyRW50cnk+LFxuICBpbmRleDogbnVtYmVyLFxuICBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnksXG4gIG1lbW86IE1hcDxudW1iZXIsIGJvb2xlYW4+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgY2FjaGVkID0gbWVtby5nZXQoaW5kZXgpO1xuICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVSZXNvbHZlc09uSXRzT3duKGJhcnJpZXJzLCBpbmRleCwgZW50cnksIG1lbW8pO1xuICBtZW1vLnNldChpbmRleCwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVJlc29sdmVzT25JdHNPd24oXG4gIGJhcnJpZXJzOiBNYXA8bnVtYmVyLCBEZWxpdmVyeUJhcnJpZXJFbnRyeT4sXG4gIGluZGV4OiBudW1iZXIsXG4gIGVudHJ5OiBEZWxpdmVyeUJhcnJpZXJFbnRyeSxcbiAgbWVtbzogTWFwPG51bWJlciwgYm9vbGVhbj5cbik6IGJvb2xlYW4ge1xuICBpZiAoIWVudHJ5LmFybWVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBkZWZlckJlaGluZCA9IERFRkVSX0JFSElORFtlbnRyeS5raW5kXTtcbiAgZm9yIChjb25zdCBbb3RoZXJJbmRleCwgb3RoZXJdIG9mIGJhcnJpZXJzKSB7XG4gICAgaWYgKFxuICAgICAgb3RoZXJJbmRleCA8IGluZGV4ICYmXG4gICAgICBkZWZlckJlaGluZC5pbmNsdWRlcyhvdGhlci5raW5kKSAmJlxuICAgICAgIXJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIG90aGVySW5kZXgsIG90aGVyLCBtZW1vKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBd2FpdHMsIGluIHN0cmljdCBldmVudC1sb2cgb3JkZXIsIGV2ZXJ5IHN0aWxsLXJlZ2lzdGVyZWQgZGVsaXZlcnkgdGhhdCBpc1xuICogZWFybGllciBpbiB0aGUgbG9nIHRoYW4gYGV2ZW50SW5kZXhgIGFuZCB0aGF0IGEgZGVsaXZlcnkgb2YgYGtpbmRgIGRlZmVyc1xuICogYmVoaW5kIChzZWUge0BsaW5rIERFRkVSX0JFSElORH0pLCBzbyB0aGF0IHRoaXMgcmVzb2x1dGlvbiBpcyBoYW5kZWQgdG8gdGhlXG4gKiB3b3JrZmxvdyBvbmx5IGFmdGVyIGFsbCByZWxldmFudCBlYXJsaWVyLWluLWxvZyBkZWxpdmVyaWVzIGhhdmUgYmVlbi4gVGhpc1xuICogaXMgd2hhdCBrZWVwcyBhIGBQcm9taXNlLnJhY2VgIOKAlCBvciB0aGUgVUxJRCBhIGZvbGxvdy11cCBgdXNlU3RlcGAgZHJhd3Mgb25cbiAqIGEgY29uY3VycmVudCBicmFuY2gg4oCUIGRldGVybWluaXN0aWMgYW5kIGFsaWduZWQgd2l0aCB0aGUgY29tbWl0dGVkIGV2ZW50XG4gKiBsb2csIGluZGVwZW5kZW50IG9mIG1pY3JvdGFzay1ob3AgY291bnRzLCBoeWRyYXRpb24gdGltZSwgb3IgcmFjZS1hcmd1bWVudFxuICogb3JkZXIuIFdoZW4gdGhpcyBkZWxpdmVyeSBkb2VzIGhhdmUgdG8gd2FpdCwgaXQgYWxzbyB5aWVsZHMgYSBtYWNyb3Rhc2tcbiAqIGFmdGVyd2FyZHMgc28gdGhlIGVhcmxpZXIgZGVsaXZlcnkncyBjb25zdW1lciBjYW4gcnVuIHRvIGl0cyBvd24gbmV4dFxuICogc3VzcGVuc2lvbiBwb2ludCBmaXJzdDsgc2VlIHRoZSBjb21tZW50IGF0IHRoYXQgYGF3YWl0YCBmb3Igd2h5IG9yZGVyaW5nIHRoZVxuICogYHJlc29sdmUoKWAgY2FsbHMgYWxvbmUgaXMgbm90IGVub3VnaC5cbiAqXG4gKiBPbmUgYXN5bW1ldHJ5OiBhIFNURVAgcmVzdWx0IGFkZGl0aW9uYWxseSBza2lwcyBhbnkgZWFybGllciBkZWxpdmVyeSB0aGF0XG4gKiB3aWxsIG5vdCByZXNvbHZlIG9uIGl0cyBvd24sIGkuZS4gb25lIGJsb2NrZWQgKGRpcmVjdGx5IG9yIHRyYW5zaXRpdmVseSkgb25cbiAqIGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkIG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkLiBTdWNoIGEgcGF5bG9hZCBpcyBkZWxpdmVyZWRcbiAqIG9ubHkgd2hlbiB0aGUgd29ya2Zsb3cgbmV4dCByZWFkcyB0aGUgaG9vaywgYW5kIHJlYWNoaW5nIHRoYXQgcmVhZCB2ZXJ5XG4gKiBjb21tb25seSByZXF1aXJlcyB0aGUgc3RlcCByZXN1bHQgaXRzZWxmIChgYXdhaXQgc3RlcFgoKWAgYmVmb3JlIHRoZSByZWFkKS5cbiAqIEdhdGluZyB0aGUgc3RlcCBvbiBpdCB3b3VsZCBzdGFsbCB0aGUgd29ya2Zsb3cgdW50aWwgdGhlIGJhcnJpZXIncyBpZGxlXG4gKiBzYWZldHkgbmV0IGZpcmVzLCB3aGljaCB0aGVuIHJlbGVhc2VzIGV2ZXJ5IGRlbGl2ZXJ5IHF1ZXVlZCBiZWhpbmQgdGhhdFxuICogcGF5bG9hZCBhdCBvbmNlIOKAlCBsb3NpbmcgZXhhY3RseSB0aGUgcmFjZSB0aGlzIG9yZGVyaW5nIGV4aXN0cyB0byBwcm90ZWN0LlxuICogV2FpdHMgYW5kIGhvb2tzIGtlZXAgZ2F0aW5nIG9uIHVuY2xhaW1lZCBwYXlsb2FkczogZm9yIHRoZW0sIHdhaXRpbmcgZm9yIHRoZVxuICogY2xhaW0gSVMgdGhlIG9yZGVyaW5nIGd1YXJhbnRlZSAoYSBgd2FpdF9jb21wbGV0ZWRgIG11c3Qgbm90IHByZWVtcHQgYVxuICogcGF5bG9hZCB0aGUgbG9nIG9yZGVyZWQgZmlyc3QpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRFYXJsaWVyRGVsaXZlcmllcyhcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGV2ZW50SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAga2luZDogRGVsaXZlcnlLaW5kXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gRGVmZW5zaXZlOiB0b2xlcmF0ZSBjb250ZXh0cyB0aGF0IHByZWRhdGUgdGhpcyBmaWVsZCAodGVzdCBoYXJuZXNzZXMpLlxuICBpZiAoXG4gICAgZXZlbnRJbmRleCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgIWN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycyB8fFxuICAgIGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycy5zaXplID09PSAwXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBiYXJyaWVycyA9IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycztcbiAgY29uc3QgZGVmZXJCZWhpbmQgPSBERUZFUl9CRUhJTkRba2luZF07XG4gIGNvbnN0IGVhcmxpZXI6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAvLyBTaGFyZWQgYWNyb3NzIHRoaXMgY2FsbCBvbmx5IOKAlCBzZWUgYHJlc29sdmVzT25JdHNPd25gLlxuICBjb25zdCBzZWxmUmVzb2x2aW5nID0gbmV3IE1hcDxudW1iZXIsIGJvb2xlYW4+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgYmFycmllcnMpIHtcbiAgICBpZiAoaW5kZXggPj0gZXZlbnRJbmRleCB8fCAhZGVmZXJCZWhpbmQuaW5jbHVkZXMoZW50cnkua2luZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBraW5kID09PSAnc3RlcCcgJiZcbiAgICAgICFyZXNvbHZlc09uSXRzT3duKGJhcnJpZXJzLCBpbmRleCwgZW50cnksIHNlbGZSZXNvbHZpbmcpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZWFybGllci5wdXNoKGVudHJ5LmRlbGl2ZXJlZCk7XG4gIH1cbiAgaWYgKGVhcmxpZXIubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGVhcmxpZXIpO1xuICAgIC8vIEFuIGVhcmxpZXIgZGVsaXZlcnkgYmVpbmcgXCJkZWxpdmVyZWRcIiBvbmx5IG1lYW5zIGl0cyBgcmVzb2x2ZSgpYCByYW4uXG4gICAgLy8gVGhlIGJyYW5jaCBpdCB3b2tlIG1heSBuZWVkIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZnVydGhlciBtaWNyb3Rhc2tcbiAgICAvLyBob3BzIGJlZm9yZSBpdCByZWFjaGVzIGl0cyBuZXh0IGB1c2VTdGVwYCBjYWxsIGFuZCBkcmF3cyBhIFVMSUQg4oCUIGFcbiAgICAvLyBgZm9yIGF3YWl0YCBvdmVyIGEgaG9vaywgZm9yIGluc3RhbmNlLCByZXN1bWVzIHRoZSBnZW5lcmF0b3IsIHNldHRsZXNcbiAgICAvLyB0aGUgcHJvbWlzZSBmcm9tIGBuZXh0KClgLCBhbmQgb25seSB0aGVuIHJ1bnMgdGhlIGxvb3AgYm9keS4gUmVzb2x2aW5nXG4gICAgLy8gdGhpcyBkZWxpdmVyeSBvbiBhIG1pY3JvdGFzayB3b3VsZCBsZXQgaXQgb3ZlcnRha2UgdGhhdCBicmFuY2ggYW5kXG4gICAgLy8gcmVvcmRlciB0aGUgVUxJRCBhbGxvY2F0aW9uIGFueXdheSwgdHVybmluZyB0aGUgZ3VhcmFudGVlIGJlbG93IGludG8gYVxuICAgIC8vIGhvcC1jb3VudCByYWNlIHRoYXQgaG9sZHMgb25seSBmb3IgdGhlIHNob3J0ZXN0IGNvbnN1bWVycy5cbiAgICAvL1xuICAgIC8vIFlpZWxkaW5nIGEgbWFjcm90YXNrIGxldHMgdGhlIGVhcmxpZXIgYnJhbmNoJ3MgZW50aXJlIG1pY3JvdGFzayBjaGFpblxuICAgIC8vIGRyYWluIGZpcnN0LCB3aGF0ZXZlciBpdHMgbGVuZ3RoLCBzbyBsb2cgb3JkZXIgc3Vydml2ZXMgcmVnYXJkbGVzcyBvZlxuICAgIC8vIGhvdyB0aGUgd29ya2Zsb3cgY29uc3VtZXMgdGhlIGVhcmxpZXIgZGVsaXZlcnkuIE9ubHkgZGVsaXZlcmllcyB0aGF0XG4gICAgLy8gYWN0dWFsbHkgaGFkIHRvIGRlZmVyIHBheSB0aGlzLCBzbyB0aGUgY29tbW9uIHNpbmdsZS1kZWxpdmVyeSBkcmFpbiBpc1xuICAgIC8vIHVuYWZmZWN0ZWQuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICB9XG59XG5cbi8qKiBIYW5kbGUgZm9yIGEgcmVnaXN0ZXJlZCBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYmFycmllci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsaXZlcnlCYXJyaWVyIHtcbiAgLyoqXG4gICAqIE1hcmsgdGhpcyBkZWxpdmVyeSBhcyBkZWxpdmVyZWQgdG8gdGhlIHdvcmtmbG93LiBSZXNvbHZlcyBpdHNcbiAgICogYGRlbGl2ZXJlZGAgcHJvbWlzZSBzbyBhbnkgbGF0ZXItaW4tbG9nIGRlbGl2ZXJ5IGdhdGVkIG9uIGl0ICh2aWFcbiAgICoge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9KSBtYXkgcHJvY2VlZCwgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGVcbiAgICogcmVnaXN0cnkuIElkZW1wb3RlbnQuXG4gICAqL1xuICBtYXJrRGVsaXZlcmVkOiAoKSA9PiB2b2lkO1xuICAvKipcbiAgICogTWFyayB0aGlzIGRlbGl2ZXJ5IGFzIGNvbW1pdHRlZCB0byBoYXBwZW5pbmcsIGZvciBhIGJhcnJpZXIgcmVnaXN0ZXJlZFxuICAgKiB1bmFybWVkIChhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCkgb25jZSBhIGNvbnN1bWVyIGhhcyBjbGFpbWVkIGl0LiBGcm9tXG4gICAqIHRoZW4gb24gYSBsYXRlciBzdGVwIHJlc3VsdCBtYXkgYmUgb3JkZXJlZCBiZWhpbmQgaXQuIElkZW1wb3RlbnQuXG4gICAqL1xuICBhcm06ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYXQgaXRzIGV2ZW50LWxvZyBpbmRleCBzbyB0aGF0IGxhdGVyXG4gKiBkZWxpdmVyaWVzIGNhbiBiZSBvcmRlcmVkIHN0cmljdGx5IGFmdGVyIGl0LiBSZXR1cm5zIGFuIGluZXJ0IGhhbmRsZSB3aGVuXG4gKiBgcGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgIGlzIG5vdCBpbml0aWFsaXplZC5cbiAqXG4gKiBQYXNzIGBhcm1lZDogZmFsc2VgIGZvciBhIGRlbGl2ZXJ5IHdob3NlIHJlc29sdXRpb24gd2FpdHMgb24gd29ya2Zsb3cgY29kZVxuICogYXNraW5nIGZvciBpdCAoYSBidWZmZXJlZCBob29rIHBheWxvYWQpOyBjYWxsIGBhcm0oKWAgd2hlbiBpdCBkb2VzLlxuICpcbiAqIFRvIGd1YXJhbnRlZSBhIGxhdGVyIGRlbGl2ZXJ5IGdhdGVkIG9uIHRoaXMgb25lIGNhbiBuZXZlciBoYW5nIHdoZW4gdGhpc1xuICogZGVsaXZlcnkgaXMgYWJhbmRvbmVkICh0aGUgd29ya2Zsb3cgdG9vayBhIGRpZmZlcmVudCBicmFuY2ggb3IgaXNcbiAqIHN1c3BlbmRpbmcgYW5kIG5ldmVyIG9ic2VydmVzIGl0KSwgdGhlIGJhcnJpZXIgYXV0by1yZXNvbHZlcyBhdCBpZGxlLlxuICpcbiAqIElOVkFSSUFOVCByZXF1aXJlZCBvZiBldmVyeSBjYWxsIHNpdGU6IGEgYmFycmllciB0aGF0IGlzIGV2ZXIgYGFybWVkYCBtdXN0XG4gKiBiZSBwYWlyZWQgd2l0aCBhIGRlbGl2ZXJ5IGNoYWluIHRoYXQgcnVucyB1bmNvbmRpdGlvbmFsbHkg4oCUIGF0dGFjaGVkIHdoZW5cbiAqIHRoZSBldmVudCBpcyBjb25zdW1lZCAod2FpdHMsIHN0ZXAgcmVzdWx0cywgd2FpdGluZy1jb25zdW1lciBob29rXG4gKiBwYXlsb2FkcyksIG9yIGJ5IHRoZSBgY2xhaW0oKWAgd2hvc2UgaW52b2NhdGlvbiBpcyB3aGF0IGFybXMgaXQgKGJ1ZmZlcmVkXG4gKiBob29rIHBheWxvYWRzKS4gVGhlIGlkbGUgY2hlY2sgKHtAbGluayBzY2hlZHVsZVdoZW5JZGxlfSkgcmVmdXNlcyB0b1xuICogb2JzZXJ2ZSBpZGxlIHdoaWxlIGFuIGFybWVkLCBzZWxmLXJlc29sdmluZyBiYXJyaWVyIGlzIHVuZGVsaXZlcmVkLCBhbmQgdGhlXG4gKiBzYWZldHkgbmV0IGJlbG93IGlzIGl0c2VsZiBpZGxlLWdhdGVkIOKAlCBzbyBhbiBhcm1lZCBiYXJyaWVyIHdpdGggbm9cbiAqIHVuY29uZGl0aW9uYWwgY2hhaW4gd291bGQgbGl2ZWxvY2sgZXZlcnkgaWRsZSBjaGVjayBpbiB0aGUgcnVuLCBpbmNsdWRpbmdcbiAqIGl0cyBvd24gcmV0aXJlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZXZlbnRJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBraW5kOiBEZWxpdmVyeUtpbmQsXG4gIG9wdGlvbnM6IHsgYXJtZWQ/OiBib29sZWFuIH0gPSB7fVxuKTogRGVsaXZlcnlCYXJyaWVyIHtcbiAgY29uc3QgYmFycmllcnMgPSBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM7XG4gIGlmICghYmFycmllcnMgfHwgZXZlbnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgbWFya0RlbGl2ZXJlZDogKCkgPT4ge30sIGFybTogKCkgPT4ge30gfTtcbiAgfVxuXG4gIGxldCBkb25lID0gZmFsc2U7XG4gIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuICBjb25zdCBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnkgPSB7XG4gICAga2luZCxcbiAgICBkZWxpdmVyZWQ6IHByb21pc2UsXG4gICAgYXJtZWQ6IG9wdGlvbnMuYXJtZWQgPz8gdHJ1ZSxcbiAgfTtcbiAgYmFycmllcnMuc2V0KGV2ZW50SW5kZXgsIGVudHJ5KTtcblxuICBjb25zdCBmaW5pc2ggPSAoKSA9PiB7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG9uZSA9IHRydWU7XG4gICAgaWYgKGJhcnJpZXJzLmdldChldmVudEluZGV4KSA9PT0gZW50cnkpIHtcbiAgICAgIGJhcnJpZXJzLmRlbGV0ZShldmVudEluZGV4KTtcbiAgICB9XG4gICAgcmVzb2x2ZSgpO1xuICB9O1xuXG4gIC8vIFNhZmV0eSBuZXQ6IGlmIHRoaXMgZGVsaXZlcnkgaXMgbmV2ZXIgZGVsaXZlcmVkIHRvIHRoZSB3b3JrZmxvdyAoaXRzXG4gIC8vIGJyYW5jaCB3YXMgbm90IHRha2VuIC8gdGhlIHJ1biBpcyBzdXNwZW5kaW5nLCBvciBhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZFxuICAvLyBpcyBvbmx5IGNsYWltZWQgYWZ0ZXIgYSBsYXRlciBkZWxpdmVyeSB0aGUgd29ya2Zsb3cgaXMgc3RpbGwgd2FpdGluZyBvbiksXG4gIC8vIHJlc29sdmUgYXQgaWRsZSBzbyBhIGxhdGVyIGRlbGl2ZXJ5IGdhdGVkIG9uIGl0IGNhbm5vdCBkZWFkbG9jayBhbmQgdGhlXG4gIC8vIHJlZ2lzdHJ5IGNhbm5vdCBsZWFrIGFuIGVudHJ5IHBlciBhYmFuZG9uZWQgZGVsaXZlcnkuXG4gIHNjaGVkdWxlV2hlbklkbGUoY3R4LCBmaW5pc2gpO1xuXG4gIHJldHVybiB7XG4gICAgbWFya0RlbGl2ZXJlZDogZmluaXNoLFxuICAgIGFybTogKCkgPT4ge1xuICAgICAgZW50cnkuYXJtZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciBzb21lIHJlZ2lzdGVyZWQgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5IGlzIGdvaW5nIHRvIHJlYWNoIHRoZVxuICogd29ya2Zsb3cgd2l0aG91dCBhbnkgZnVydGhlciBoZWxwIChpdCBpcyBhcm1lZCBhbmQgbm90IHRyYW5zaXRpdmVseSBwYXJrZWRcbiAqIGJlaGluZCBhbiB1bmNsYWltZWQgYnVmZmVyZWQgcGF5bG9hZCDigJQgc2VlIHtAbGluayByZXNvbHZlc09uSXRzT3dufSkgYnV0XG4gKiBoYXMgbm90IGJlZW4gaGFuZGVkIG92ZXIgeWV0LlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlbGl2ZXJ5IHN0YXRlIGBwZW5kaW5nRGVsaXZlcmllc2AgY2Fubm90IHNlZS4gVGhhdCBjb3VudGVyXG4gKiBjb3ZlcnMgdGhlIGh5ZHJhdGlvbiB3aW5kb3cgaW5zaWRlIGEgc2VyaWFsIGBwcm9taXNlUXVldWVgIHNsb3QgYW5kIGlzXG4gKiByZWxlYXNlZCB0aGVyZSwgd2hpbGUgdGhlIGRlbGl2ZXJ5J3MgYHJlc29sdmUoKWAgcnVucyBsYXRlciwgZnJvbSBhXG4gKiBkZXRhY2hlZCBjb250aW51YXRpb24gYmVoaW5kIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfSDigJQgaW5jbHVkaW5nIGl0c1xuICogbWFjcm90YXNrIHlpZWxkIHdoZW5ldmVyIHRoZSBkZWxpdmVyeSBoYWQgdG8gZGVmZXIuIFJlcGxheWluZyBhIGJhdGNoIG9mIE5cbiAqIHBhcmFsbGVsIHN0ZXAgcmVzdWx0cyBjb25zdW1lZCBpbiBvbmUgZHJhaW4gd2luZG93IGxlYXZlcyBOLTEgb2YgdGhlbVxuICogcGFya2VkIG9uIHRoYXQgeWllbGQgd2l0aCBgcGVuZGluZ0RlbGl2ZXJpZXNgIGFscmVhZHkgYXQgMC4gQW4gaWRsZSBjaGVja1xuICogYXJtZWQgZHVyaW5nIHRoZSBzYW1lIHdpbmRvdyAoYSBwZW5kaW5nIGBzbGVlcCgpYCBhcm1zIG9uZSBvbiBldmVyeSByZXBsYXkpXG4gKiBjb3VsZCB0aGVuIG9ic2VydmUgXCJpZGxlXCIgbWlkLWRlZmVycmFsIGFuZCByYWlzZSBhIGBXb3JrZmxvd1N1c3BlbnNpb25gXG4gKiBCRUZPUkUgdGhlIHdvcmtmbG93J3Mgb3duIGNvbnRpbnVhdGlvbnMgcmFuIOKAlCBhIHN1c3BlbnNpb24gY2Fycnlpbmcgbm9uZSBvZlxuICogdGhlIGZvbGxvdy11cCB3b3JrIHRoZSBiYXRjaCB3YXMgYWJvdXQgdG8gY3JlYXRlLCB3aGljaCB0aGUgcnVudGltZVxuICogZHV0aWZ1bGx5IHNjaGVkdWxlcyBhcyBub3RoaW5nLCBsZWF2aW5nIHRoZSBydW4gZG9ybWFudCB1bnRpbCBhbiB1bnJlbGF0ZWRcbiAqIHRpbWVyIGZpcmVzICh2ZXJjZWwvd29ya2Zsb3cjMzE4MykuXG4gKlxuICogRGVsaXZlcmllcyB0aGF0IGRvIE5PVCByZXNvbHZlIG9uIHRoZWlyIG93biBtdXN0IGJlIGV4Y2x1ZGVkLCBub3QgZm9yXG4gKiBhY2N1cmFjeSBidXQgZm9yIHRlcm1pbmF0aW9uOiBhbiB1bmNsYWltZWQgYnVmZmVyZWQgaG9vayBwYXlsb2FkIGlzIHJldGlyZWRcbiAqIEJZIHRoZSBpZGxlIHNhZmV0eSBuZXQgaW4ge0BsaW5rIHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyfSwgc28gY291bnRpbmcgaXRcbiAqIGhlcmUgd291bGQgZ2F0ZSBpdHMgb3duIHJldGlyZW1lbnQuIFNlbGYtcmVzb2x2aW5nIGRlbGl2ZXJpZXMgYWx3YXlzXG4gKiBkZWxpdmVyIGZyb20gdGhlaXIgb3duIGNoYWlucyAoc2VlIHRoZSBJTlZBUklBTlQgb25cbiAqIHtAbGluayByZWdpc3RlckRlbGl2ZXJ5QmFycmllcn0pIGFuZCBuZXZlciBuZWVkIHRoYXQgbmV0LCBzbyB3YWl0aW5nIG9uXG4gKiB0aGVtIGlzIGRlYWRsb2NrLWZyZWUuXG4gKi9cbmZ1bmN0aW9uIGhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5KGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGJhcnJpZXJzID0gY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzO1xuICBpZiAoIWJhcnJpZXJzIHx8IGJhcnJpZXJzLnNpemUgPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gU2hhcmVkIGFjcm9zcyB0aGlzIGNhbGwgb25seSDigJQgc2VlIGByZXNvbHZlc09uSXRzT3duYC5cbiAgY29uc3Qgc2VsZlJlc29sdmluZyA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgZW50cnldIG9mIGJhcnJpZXJzKSB7XG4gICAgaWYgKHJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIGluZGV4LCBlbnRyeSwgc2VsZlJlc29sdmluZykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciBubyBkYXRhIGRlbGl2ZXJ5IChzdGVwIHJlc3VsdCwgaG9vayBwYXlsb2FkKSBpcyBpbiBmbGlnaHQgcmlnaHQgbm93LlxuICpcbiAqIFwiSW4gZmxpZ2h0XCIgaXMgdHdvIGRpc3RpbmN0IHdpbmRvd3MsIGVhY2ggd2l0aCBpdHMgb3duIGd1YXJkOlxuICogYHBlbmRpbmdEZWxpdmVyaWVzID4gMGAgY292ZXJzIGh5ZHJhdGlvbiBpbnNpZGUgdGhlIHNlcmlhbCBxdWV1ZSBzbG90cywgYW5kXG4gKiB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IGNvdmVycyB0aGUgZGV0YWNoZWQgZ2FwIGJldHdlZW4gYSBzbG90XG4gKiByZWxlYXNpbmcgdGhhdCBjb3VudGVyIGFuZCB0aGUgZGVsaXZlcnkncyBgcmVzb2x2ZSgpYCBhY3R1YWxseSBydW5uaW5nIOKAlFxuICogZGVsaWJlcmF0ZWx5IG91dHNpZGUgYHBlbmRpbmdEZWxpdmVyaWVzYCAoc2VlIHN0ZXAudHMpLCBhbmQgaW52aXNpYmxlIHRvIGl0LlxuICpcbiAqIEFueXRoaW5nIHRoYXQgZGVjaWRlcyBhIHJlcGxheSBpcyBvdmVyLCBvciB0aGF0IGEgcmVwbGF5IHdlbnQgd3JvbmcsIGhhcyB0b1xuICogY29uc3VsdCB0aGlzIGZpcnN0OiB3aGlsZSBpdCBpcyBmYWxzZSB0aGUgd29ya2Zsb3cgVk0gaXMgbWlkLXJlYWN0aW9uLCBzb1xuICogd2hhdCBpdCBoYXMgYW5kIGhhcyBub3QgZG9uZSB5ZXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBydW4uIFR3byBjYWxsZXJzXG4gKiByZWFkIGl0LCBmb3IgdGhlIHR3byBzdWNoIGRlY2lzaW9uczoge0BsaW5rIHNjaGVkdWxlV2hlbklkbGV9IGZvciB0aGVcbiAqIHN1c3BlbnNpb24sIGFuZCB0aGUgZXZlbnRzIGNvbnN1bWVyJ3MgdW5jb25zdW1lZC1ldmVudCBjaGVjayBmb3IgZGl2ZXJnZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVsaXZlcnlJZGxlKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KTogYm9vbGVhbiB7XG4gIHJldHVybiBjdHgucGVuZGluZ0RlbGl2ZXJpZXMgPT09IDAgJiYgIWhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5KGN0eCk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYSBjYWxsYmFjayB0byBmaXJlIG9ubHkgYWZ0ZXIgYWxsIHBlbmRpbmcgZGF0YSBkZWxpdmVyaWVzXG4gKiAoc3RlcCByZXN1bHRzLCBob29rIHBheWxvYWRzKSBhbmQgYXN5bmMgZGVzZXJpYWxpemF0aW9uIGhhdmUgY29tcGxldGVkLlxuICogVXNlcyBhIHBvbGxpbmcgbG9vcDogc2V0VGltZW91dCgwKSDihpIgY2hlY2sgcGVuZGluZ0RlbGl2ZXJpZXMgYW5kIHRoZVxuICogYmFycmllciByZWdpc3RyeSDihpIgaWYgYW55dGhpbmcgaXMgc3RpbGwgaW4gZmxpZ2h0LCB3YWl0IGZvciBwcm9taXNlUXVldWUg4oaSXG4gKiByZXBlYXQuIFRoaXMgaGFuZGxlcyB0aGUgbXVsdGktcm91bmQgZGVsaXZlcnkgcGF0dGVybiB3aGVyZSBlYWNoIGhvb2tcbiAqIHBheWxvYWQgZGVsaXZlcnkgY3ljbGUgYXBwZW5kcyBuZXcgYXN5bmMgd29yayB0byB0aGUgcHJvbWlzZVF1ZXVlLiBXaGF0XG4gKiBjb3VudHMgYXMgaW4gZmxpZ2h0IGlzIHtAbGluayBpc0RlbGl2ZXJ5SWRsZX0uXG4gKlxuICogVGhlIGluaXRpYWwgYHNldFRpbWVvdXQoMClgIG1hY3JvdGFzayBpcyBsb2FkLWJlYXJpbmcgYW5kIG11c3QgTk9UIGJlXG4gKiBkb3duZ3JhZGVkIHRvIGEgbWljcm90YXNrIChgcXVldWVNaWNyb3Rhc2tgL2BQcm9taXNlLnJlc29sdmUoKS50aGVuYCkuXG4gKiBgcGVuZGluZ0RlbGl2ZXJpZXNgIG9ubHkgZ3VhcmRzIHRoZSBob3N0LXNpZGUgaHlkcmF0aW9uIHdpbmRvdzsgYmV0d2VlbiBhXG4gKiBkZWxpdmVyeSdzIGByZXNvbHZlKClgIGFuZCB0aGUgd29ya2Zsb3cgVk0gYm9keSBydW5uaW5nIGl0cyBjb250aW51YXRpb24gdG9cbiAqIHJlZ2lzdGVyIHRoZSBuZXh0IHN1YnNjcmliZXIsIGBwZW5kaW5nRGVsaXZlcmllc2AgaXMgYWxyZWFkeSAwIGV2ZW4gdGhvdWdoXG4gKiB0aGUgVk0gaXMgbWlkLXJlYWN0aW9uLiBOb2RlIGRvZXMgbm90IGd1YXJhbnRlZSBhIG1pY3JvdGFzayBzY2hlZHVsZWQgaW5cbiAqIHRoZSBob3N0IGNvbnRleHQgc2V0dGxlcyBhZnRlciB0aGUgY3Jvc3MtVk0gcHJvbWlzZSBjaGFpbiAocmVzb2x2ZSBpbiBob3N0XG4gKiDihpIgd29ya2Zsb3cgY29kZSBpbiBWTSDihpIgc3Vic2NyaWJlIGJhY2sgaW4gaG9zdCk7IHRoZSBtYWNyb3Rhc2sgYm91bmRhcnlcbiAqIGdpdmVzIHRoYXQgY2hhaW4gdGltZSB0byBydW4sIHNvIHRoZSBzdXNwZW5zaW9uIGRvZXMgbm90IHByZWVtcHQgYSBzaWJsaW5nXG4gKiBkZWxpdmVyeSBzdGlsbCBpbiBmbGlnaHQuIEVtcGlyaWNhbGx5LCByZXBsYWNpbmcgaXQgd2l0aCBgcXVldWVNaWNyb3Rhc2tgXG4gKiBicmVha3MgaG9vay9zbGVlcCBgUHJvbWlzZS5yYWNlYCBvcmRlcmluZyAoQ29ycnVwdGVkRXZlbnRMb2dFcnJvcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2hlZHVsZVdoZW5JZGxlKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZm46ICgpID0+IHZvaWRcbik6IHZvaWQge1xuICBjb25zdCBjaGVjayA9ICgpID0+IHtcbiAgICBpZiAoIWlzRGVsaXZlcnlJZGxlKGN0eCkpIHtcbiAgICAgIC8vIEEgZGVsaXZlcnkgaXMgc3RpbGwgaHlkcmF0aW5nLCBvciBpcyBjb21taXR0ZWQgYnV0IHBhcmtlZCBiZWhpbmQgaXRzXG4gICAgICAvLyBkZWZlcnJhbCAod2hvc2UgcmVzb2x2ZSBydW5zIG9uIGEgZGV0YWNoZWQgdGltZXIsIG5vdCB0aGlzIHF1ZXVlKS5cbiAgICAgIC8vIEVpdGhlciB3YXk6IGxldCB0aGUgcXVldWUgZHJhaW4sIHRoZW4gcmUtY2hlY2sgYSB0aW1lciB0aWNrIGxhdGVyLlxuICAgICAgY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChjaGVjaywgMCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm4oKTtcbiAgICB9XG4gIH07XG4gIHNldFRpbWVvdXQoY2hlY2ssIDApO1xufVxuIl19
524
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBZWhELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sYUFBYSxHQUVmLFVBQVUsQ0FBQztBQUVmLHdEQUF3RDtBQUN4RCxNQUFNLGVBQWUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLElBQUksR0FBRyxFQUduRSxDQUFDLENBQUM7QUFFTCxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2pDLGlDQUFpQztJQUNqQyx5QkFBeUI7SUFDekIseUJBQXlCO0NBQzFCLENBQUMsQ0FBQztBQUVILFNBQVMsd0JBQXdCLENBQUMsTUFBYztJQUM5QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzlDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTVDLE1BQU0sUUFBUSxHQUFHLENBQUMsZUFBdUIsRUFBRSxFQUFFO1FBQzNDLElBQUksZUFBZSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ25DLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FB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LENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFnQztJQUM3RCxPQUFPLENBQ0wsR0FBRyxDQUFDLGlCQUFpQixLQUFLLENBQUM7UUFDM0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsSUFBSSxHQUFHLENBQUMsdUJBQXVCLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUN6RSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsR0FBZ0MsRUFDaEMsRUFBYztJQUVkLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRTtRQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsdUVBQXVFO1lBQ3ZFLHFFQUFxRTtZQUNyRSxxRUFBcUU7WUFDckUsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUN6QixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixFQUFFLEVBQUUsQ0FBQztRQUNQLENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxzIHVzZWQgYnkgdGhlIGJ1bmRsZXIgd2hlbiB0cmFuc2Zvcm1pbmcgY29kZVxuICovXG5cbmltcG9ydCB7IHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBDcnlwdG9LZXkgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFdmVudHNDb25zdW1lciB9IGZyb20gJy4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB0eXBlIHsgUXVldWVJdGVtIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NjaGVtYXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwSHlkcmF0aW9uQ2FjaGUgfSBmcm9tICcuL3N0ZXAtaHlkcmF0aW9uLWNhY2hlLmpzJztcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFxuICBBcmdzIGV4dGVuZHMgU2VyaWFsaXphYmxlW10gPSBhbnlbXSxcbiAgUmVzdWx0IGV4dGVuZHMgU2VyaWFsaXphYmxlIHwgdW5rbm93biA9IHVua25vd24sXG4+ID0gKCguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPFJlc3VsdD4pICYge1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICBzdGVwSWQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBSZWdpc3RlcmVkU3RlcHNLZXkgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvY29yZS8vcmVnaXN0ZXJlZFN0ZXBzJyk7XG5cbmNvbnN0IGdsb2JhbFN5bWJvbHM6IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbUmVnaXN0ZXJlZFN0ZXBzS2V5XT86IE1hcDxzdHJpbmcsIFN0ZXBGdW5jdGlvbj47XG59ID0gZ2xvYmFsVGhpcztcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IC9cbmNvbnN0IHJlZ2lzdGVyZWRTdGVwcyA9IChnbG9iYWxTeW1ib2xzW1JlZ2lzdGVyZWRTdGVwc0tleV0gPz89IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAgU3RlcEZ1bmN0aW9uXG4+KCkpO1xuXG5jb25zdCBCVUlMVElOX1NURVBfTkFNRVMgPSBuZXcgU2V0KFtcbiAgJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX2pzb24nLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX3RleHQnLFxuXSk7XG5cbmZ1bmN0aW9uIGdldFN0ZXBJZEFsaWFzQ2FuZGlkYXRlcyhzdGVwSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGFydHMgPSBzdGVwSWQuc3BsaXQoJy8vJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09ICdzdGVwJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZVBhdGggPSBwYXJ0c1sxXTtcbiAgY29uc3QgZm5OYW1lID0gcGFydHNbMl07XG4gIGNvbnN0IG1vZHVsZVBhdGhBbGlhc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgYWRkQWxpYXMgPSAoYWxpYXNNb2R1bGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoYWxpYXNNb2R1bGVQYXRoICE9PSBtb2R1bGVQYXRoKSB7XG4gICAgICBtb2R1bGVQYXRoQWxpYXNlcy5hZGQoYWxpYXNNb2R1bGVQYXRoKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuL2V4YW1wbGUvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vZXhhbXBsZS93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vZXhhbXBsZS8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vc3JjL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi9zcmMvJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gICAgYWRkQWxpYXMoYC4vZXhhbXBsZS8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbW9kdWxlUGF0aEFsaWFzZXMsXG4gICAgKGFsaWFzTW9kdWxlUGF0aCkgPT4gYHN0ZXAvLyR7YWxpYXNNb2R1bGVQYXRofS8vJHtmbk5hbWV9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRCdWlsdGluUmVzcG9uc2VTdGVwQWxpYXMoc3RlcElkOiBzdHJpbmcpOiBTdGVwRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICBpZiAoIUJVSUxUSU5fU1RFUF9OQU1FUy5oYXMoc3RlcElkKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtyZWdpc3RlcmVkU3RlcElkLCBzdGVwRm5dIG9mIHJlZ2lzdGVyZWRTdGVwcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAocmVnaXN0ZXJlZFN0ZXBJZC5lbmRzV2l0aChgLy8ke3N0ZXBJZH1gKSkge1xuICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgc3RlcCBmdW5jdGlvbiB0byBiZSBzZXJ2ZWQgaW4gdGhlIHNlcnZlciBidW5kbGUuXG4gKiBBbHNvIHNldHMgdGhlIHN0ZXBJZCBwcm9wZXJ0eSBvbiB0aGUgZnVuY3Rpb24gZm9yIHNlcmlhbGl6YXRpb24gc3VwcG9ydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU3RlcEZ1bmN0aW9uKHN0ZXBJZDogc3RyaW5nLCBzdGVwRm46IFN0ZXBGdW5jdGlvbikge1xuICByZWdpc3RlcmVkU3RlcHMuc2V0KHN0ZXBJZCwgc3RlcEZuKTtcbiAgc3RlcEZuLnN0ZXBJZCA9IHN0ZXBJZDtcbn1cblxuLyoqXG4gKiBGaW5kIGEgcmVnaXN0ZXJlZCBzdGVwIGZ1bmN0aW9uIGJ5IG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0ZXBGdW5jdGlvbihzdGVwSWQ6IHN0cmluZyk6IFN0ZXBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRpcmVjdE1hdGNoID0gcmVnaXN0ZXJlZFN0ZXBzLmdldChzdGVwSWQpO1xuICBpZiAoZGlyZWN0TWF0Y2gpIHtcbiAgICByZXR1cm4gZGlyZWN0TWF0Y2g7XG4gIH1cblxuICAvLyBTdXBwb3J0IGVxdWl2YWxlbnQgd29ya2Zsb3cgcGF0aCBhbGlhc2VzIGluIG1peGVkIHN5bWxpbmsgZW52aXJvbm1lbnRzLlxuICBmb3IgKGNvbnN0IGFsaWFzU3RlcElkIG9mIGdldFN0ZXBJZEFsaWFzQ2FuZGlkYXRlcyhzdGVwSWQpKSB7XG4gICAgY29uc3QgYWxpYXNNYXRjaCA9IHJlZ2lzdGVyZWRTdGVwcy5nZXQoYWxpYXNTdGVwSWQpO1xuICAgIGlmIChhbGlhc01hdGNoKSB7XG4gICAgICByZXR1cm4gYWxpYXNNYXRjaDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBidWlsdGluQWxpYXNNYXRjaCA9IGdldEJ1aWx0aW5SZXNwb25zZVN0ZXBBbGlhcyhzdGVwSWQpO1xuICBpZiAoYnVpbHRpbkFsaWFzTWF0Y2gpIHtcbiAgICByZXR1cm4gYnVpbHRpbkFsaWFzTWF0Y2g7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdldCBjbG9zdXJlIHZhcmlhYmxlcyBmb3IgdGhlIGN1cnJlbnQgc3RlcCBmdW5jdGlvblxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB7IF9fcHJpdmF0ZV9nZXRDbG9zdXJlVmFycyB9IGZyb20gJy4vc3RlcC9nZXQtY2xvc3VyZS12YXJzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQge1xuICBydW5JZDogc3RyaW5nO1xuICBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQ7XG4gIGdsb2JhbFRoaXM6IHR5cGVvZiBnbG9iYWxUaGlzO1xuICBldmVudHNDb25zdW1lcjogRXZlbnRzQ29uc3VtZXI7XG4gIC8qKlxuICAgKiBNYXAgb2YgcGVuZGluZyBpbnZvY2F0aW9ucyBrZXllZCBieSBjb3JyZWxhdGlvbklkLlxuICAgKiBVc2luZyBNYXAgaW5zdGVhZCBvZiBBcnJheSBmb3IgTygxKSBsb29rdXAvZGVsZXRlIG9wZXJhdGlvbnMuXG4gICAqL1xuICBpbnZvY2F0aW9uc1F1ZXVlOiBNYXA8c3RyaW5nLCBRdWV1ZUl0ZW0+O1xuICBvbldvcmtmbG93RXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIGdlbmVyYXRlVWxpZDogKCkgPT4gc3RyaW5nO1xuICBnZW5lcmF0ZU5hbm9pZDogKCkgPT4gc3RyaW5nO1xuICAvKipcbiAgICogU2VxdWVudGlhbCBwcm9taXNlIHF1ZXVlIHRoYXQgZW5zdXJlcyBhbGwgZXZlbnQtZHJpdmVuIHByb21pc2UgcmVzb2x1dGlvbnNcbiAgICogKHN0ZXAgcmVzdWx0cywgaG9vayBwYXlsb2FkcywgZmFpbHVyZXMsIHN1c3BlbnNpb25zKSBoYXBwZW4gaW4gZXZlbnQgbG9nXG4gICAqIG9yZGVyLiBFdmVyeSByZXNvbHZlLCByZWplY3QsIG9yIHdvcmtmbG93IGVycm9yIGlzIGNoYWluZWQgdGhyb3VnaCB0aGlzXG4gICAqIHF1ZXVlIHNvIHRoYXQgZXZlbiBpZiBpbmRpdmlkdWFsIG9wZXJhdGlvbnMgdGFrZSB2YXJpYWJsZSB0aW1lIChlLmcuLFxuICAgKiBhc3luYyBkZWNyeXB0aW9uKSwgcHJvbWlzZXMgcmVzb2x2ZSBkZXRlcm1pbmlzdGljYWxseS5cbiAgICovXG4gIHByb21pc2VRdWV1ZTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIENvdW50ZXIgb2YgaW4tZmxpZ2h0IGFzeW5jIGRhdGEgZGVsaXZlcnkgb3BlcmF0aW9ucyAoc3RlcCByZXN1bHRcbiAgICogaHlkcmF0aW9uLCBob29rIHBheWxvYWQgaHlkcmF0aW9uKS4gU3VzcGVuc2lvbnMgbXVzdCB3YWl0IGZvciB0aGlzXG4gICAqIHRvIHJlYWNoIDAgYmVmb3JlIGZpcmluZywgdG8gYXZvaWQgcHJlZW1wdGluZyBkYXRhIGRlbGl2ZXJ5LlxuICAgKi9cbiAgcGVuZGluZ0RlbGl2ZXJpZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIE9yZGVyZWQgcmVnaXN0cnkgb2YgaW4tZmxpZ2h0IFwiYnJhbmNoLWRlY2lkaW5nXCIgZGVsaXZlcmllcyDigJQgdGhlXG4gICAqIHJlc29sdXRpb25zIGEgd29ya2Zsb3cgdHlwaWNhbGx5IGBQcm9taXNlLnJhY2VgcyBvbiwgb3IgYXdhaXRzIGZyb21cbiAgICogaW5kZXBlbmRlbnQgY29uY3VycmVudCBicmFuY2hlczogaG9vayBwYXlsb2FkcyAoYGhvb2tfcmVjZWl2ZWRgKSwgd2FpdFxuICAgKiBjb21wbGV0aW9ucyAoYHdhaXRfY29tcGxldGVkYCksIGFuZCBzdGVwIHJlc3VsdHMgKGBzdGVwX2NvbXBsZXRlZGAgL1xuICAgKiBgc3RlcF9mYWlsZWRgKS4gS2V5ZWQgYnkgdGhlIGRlbGl2ZXJ5J3MgcG9zaXRpb24gKGluZGV4KSBpbiB0aGUgY29uc3VtZWRcbiAgICogZXZlbnQgbG9nLlxuICAgKlxuICAgKiBUaGUgcHJvYmxlbTogZWFjaCBvZiB0aGVzZSByZXNvbHV0aW9ucyByZWFjaGVzIHdvcmtmbG93IGNvZGUgYWZ0ZXIgYVxuICAgKiBkaWZmZXJlbnQsIHdvcmtsb2FkLWRlcGVuZGVudCBudW1iZXIgb2YgbWljcm90YXNrIGhvcHMuIEEgYnVmZmVyZWQgaG9va1xuICAgKiBwYXlsb2FkIGlzIG9ic2VydmVkIHZpYSB0aGUgYXN5bmMgaG9vayBpdGVyYXRvciAoYHlpZWxkIGF3YWl0IHRoaXNgKSxcbiAgICogY29zdGluZyBleHRyYSBob3BzOyBhIGB3YWl0X2NvbXBsZXRlZGAgcmVzb2x2ZXMgd2l0aCBmZXdlciwgYW5kIGEgcmV1c2VkXG4gICAqIHNsZWVwIGNhbiByZXNvbHZlIGluIGFuIGVudGlyZWx5IGVhcmxpZXIgbG9vcCBpdGVyYXRpb247IGEgc3RlcCByZXN1bHQgaXNcbiAgICogZ2F0ZWQgb24gaHlkcmF0aW9uIHdob3NlIGNvc3QgdmFyaWVzIGJldHdlZW4gcmVwbGF5cyBvZiB0aGUgU0FNRVxuICAgKiBpbnZvY2F0aW9uIOKAlCB0aGUgZmlyc3QgcmVwbGF5IHBheXMgdGhlIGZ1bGwgZGVjcnlwdC9kZWNvbXByZXNzL3Jldml2ZSxcbiAgICogd2hpbGUgbGF0ZXIgcmVwbGF5cyBzaGFyaW5nIHRoZSBpbnZvY2F0aW9uJ3MgYHN0ZXBIeWRyYXRpb25DYWNoZWBcbiAgICogbWVtby1oaXQgc21hbGwgcHJpbWl0aXZlIHJlc3VsdHMgYW5kIHJlc29sdmUgaW4gb25lIG9yIHR3byBob3BzLiBFaXRoZXJcbiAgICogd2F5LCB0aGUgcmVzb2x1dGlvbiB0aGF0IHRoZSBjb21taXR0ZWQgZXZlbnQgbG9nIG9yZGVyZWQgZmlyc3QgY2FuIGxvc2UgYVxuICAgKiBgUHJvbWlzZS5yYWNlYCAob3IgYSBgdXNlU3RlcGAgVUxJRCBhbGxvY2F0aW9uKSB0byBhIGZhc3Rlci0gb3JcbiAgICogYWxyZWFkeS1yZXNvbHZlZCBjb21wZXRpdG9yLCBkaXZlcmdpbmcgZnJvbSB0aGUgbG9nIGFuZCBzdXJmYWNpbmcgYXNcbiAgICogYFJlcGxheURpdmVyZ2VuY2VFcnJvcmAuXG4gICAqXG4gICAqIFRoZSBmaXggaXMgYSBzdHJpY3QsIGRldGVybWluaXN0aWMgZGVsaXZlcnkgb3JkZXIgYW5jaG9yZWQgb25cbiAgICogZXZlbnQtbG9nIHBvc2l0aW9uOiBhIGRlbGl2ZXJ5IGRvZXMgbm90IHJlc29sdmUgdG8gdGhlIHdvcmtmbG93IHVudGlsXG4gICAqIGV2ZXJ5IHJlbGV2YW50IGVhcmxpZXItaW4tbG9nIGRlbGl2ZXJ5IGhhcyBiZWVuIGRlbGl2ZXJlZC4gQmVjYXVzZSB0aGVcbiAgICogZ2F0ZSBpcyBcInRoZSBlYXJsaWVyIGRlbGl2ZXJ5IHJlc29sdmVkXCIsIG5vdCBcIndvbiBhIHRpbWluZyByYWNlXCIsIHRoZVxuICAgKiBvdXRjb21lIGlzIGluZGVwZW5kZW50IG9mIG1pY3JvdGFzayBob3BzLCBoeWRyYXRpb24vZGVjcnlwdGlvbiB0aW1lLFxuICAgKiBhbmQgYFByb21pc2UucmFjZWAgYXJndW1lbnQgb3JkZXIuIFdoaWNoIGVhcmxpZXIga2luZHMgYSBkZWxpdmVyeSBkZWZlcnNcbiAgICogYmVoaW5kIGlzIHNwZWxsZWQgb3V0IG9uIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfS5cbiAgICpcbiAgICogSW5kZXggaXMgdXNlZCByYXRoZXIgdGhhbiB0aGUgYGV2ZW50SWRgIHN0cmluZyBiZWNhdXNlIGBldmVudElkYCBpcyBhblxuICAgKiBvcGFxdWUsIHdvcmxkLWFzc2lnbmVkIHZhbHVlIG5vdCBndWFyYW50ZWVkIHRvIHNvcnQgaW4gY3JlYXRpb24gb3JkZXJcbiAgICogKG9ubHkgdGhlIGJ1bmRsZWQgVUxJRCB3b3JsZHMgaGFwcGVuIHRvKS5cbiAgICpcbiAgICogT3B0aW9uYWwgc28gb2xkZXIvb3V0LW9mLXRyZWUgY29udGV4dHMgKGFuZCBsaWdodHdlaWdodCB0ZXN0IGhhcm5lc3NlcylcbiAgICogdGhhdCBkbyBub3QgaW5pdGlhbGl6ZSBpdCBkZWdyYWRlIGdyYWNlZnVsbHkgdG8gdGhlIHByZXZpb3VzIGJlaGF2aW9yLlxuICAgKi9cbiAgcGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM/OiBNYXA8bnVtYmVyLCBEZWxpdmVyeUJhcnJpZXJFbnRyeT47XG4gIC8qKlxuICAgKiBQZXItcnVuIG1lbW9pemF0aW9uIGNhY2hlIGZvciBoeWRyYXRlZCBzdGVwIHJldHVybiB2YWx1ZXMsIGtleWVkIGJ5IHRoZVxuICAgKiBgc3RlcF9jb21wbGV0ZWRgIGV2ZW50IGlkLiBPd25lZCBieSB0aGUgaW5saW5lIHJlcGxheSBsb29wIGluIGBydW50aW1lLnRzYFxuICAgKiBhbmQgdGhyZWFkZWQgdGhyb3VnaCBlYWNoIGBydW5Xb3JrZmxvd2AgY2FsbCBzbyBpdCBzdXJ2aXZlcyBhY3Jvc3MgcmVwbGF5XG4gICAqIGl0ZXJhdGlvbnMgb2YgdGhlIFNBTUUgcnVuIChhIGZyZXNoIGNvbnRleHQgaXMgY3JlYXRlZCBlYWNoIGl0ZXJhdGlvbikgYnV0XG4gICAqIG5ldmVyIGxlYWtzIGFjcm9zcyB1bnJlbGF0ZWQgcnVucy5cbiAgICpcbiAgICogT24gcmVwbGF5IEsgb2YgYSBzZXF1ZW50aWFsIE4tc3RlcCB3b3JrZmxvdywgdGhlIHN0ZXAgY29uc3VtZXIgd291bGRcbiAgICogb3RoZXJ3aXNlIHJlLWRlY3J5cHQgYW5kIHJlLXBhcnNlIHRoZSByZXN1bHRzIG9mIGFsbCBLIGFscmVhZHktY29tcGxldGVkXG4gICAqIHN0ZXBzIOKAlCBPKE7CsikgYWNyb3NzIGFuIGludm9jYXRpb24uIFRoaXMgY2FjaGUgbWFrZXMgYSBjb21wbGV0ZWQgc3RlcCdzXG4gICAqIHJlc3VsdCBhdmFpbGFibGUgaW4gTygxKSBvbiBzdWJzZXF1ZW50IHJlcGxheXMuIE9ubHkgcHJpbWl0aXZlIHJlc3VsdHMgYXJlXG4gICAqIG1lbW9pemVkLCBzbyBhIHNoYXJlZCByZWZlcmVuY2UgY2FuIG5ldmVyIGxldCBvbmUgcmVwbGF5J3MgbXV0YXRpb24gbGVha1xuICAgKiBpbnRvIHRoZSBuZXh0OyBzZWUgYHN0ZXAtaHlkcmF0aW9uLWNhY2hlLnRzYCBmb3IgdGhlIGZ1bGwgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBPcHRpb25hbCBzbyBjb250ZXh0cyB0aGF0IGRvIG5vdCBpbml0aWFsaXplIGl0ICh0ZXN0IGhhcm5lc3NlcykgZGVncmFkZVxuICAgKiBncmFjZWZ1bGx5IHRvIHJlLWh5ZHJhdGluZyBldmVyeSByZXBsYXkg4oCUIGlkZW50aWNhbCB0byBwcmV2aW91cyBiZWhhdmlvci5cbiAgICovXG4gIHN0ZXBIeWRyYXRpb25DYWNoZT86IFN0ZXBIeWRyYXRpb25DYWNoZTtcbn1cblxuLyoqIFRoZSBraW5kIG9mIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBhIGJhcnJpZXIgcmVwcmVzZW50cy4gKi9cbmV4cG9ydCB0eXBlIERlbGl2ZXJ5S2luZCA9ICdob29rJyB8ICd3YWl0JyB8ICdzdGVwJztcblxuaW50ZXJmYWNlIERlbGl2ZXJ5QmFycmllckVudHJ5IHtcbiAga2luZDogRGVsaXZlcnlLaW5kO1xuICAvKiogUmVzb2x2ZXMgb25jZSB0aGlzIGRlbGl2ZXJ5IGhhcyByZXNvbHZlZCB0byB0aGUgd29ya2Zsb3cuICovXG4gIGRlbGl2ZXJlZDogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBkZWxpdmVyeSBpcyBjb21taXR0ZWQgdG8gcmVhY2hpbmcgdGhlIHdvcmtmbG93IHdpdGhvdXQgYW55XG4gICAqIGZ1cnRoZXIgYWN0aW9uIGJ5IHdvcmtmbG93IGNvZGUuIFRydWUgZm9yIHdhaXQgY29tcGxldGlvbnMgYW5kIHN0ZXBcbiAgICogcmVzdWx0cywgd2hpY2ggYWx3YXlzIHJlc29sdmUgZnJvbSB0aGVpciBvd24gY2hhaW4sIGFuZCBmb3IgYSBob29rIHBheWxvYWRcbiAgICogdGhhdCBhbHJlYWR5IGhhZCBhIHdhaXRpbmcgY29uc3VtZXIgd2hlbiBpdCB3YXMgY29uc3VtZWQuXG4gICAqXG4gICAqIEZhbHNlIGZvciBhIEJVRkZFUkVEIGhvb2sgcGF5bG9hZCBubyBjb25zdW1lciBoYXMgY2xhaW1lZCB5ZXQ6IGl0IGlzXG4gICAqIGRlbGl2ZXJlZCBieSBgY2xhaW0oKWAsIGkuZS4gd2hlbmV2ZXIgdGhlIHdvcmtmbG93IG5leHQgcmVhZHMgdGhlIGhvb2sg4oCUXG4gICAqIHdoaWNoIG1heSBiZSBjYXVzYWxseSAqYWZ0ZXIqIGEgbGF0ZXItaW4tbG9nIGRlbGl2ZXJ5LiBgYXJtKClgIGZsaXBzIGl0XG4gICAqIG9uY2UgYSBjb25zdW1lciB0YWtlcyB0aGUgcGF5bG9hZC5cbiAgICovXG4gIGFybWVkOiBib29sZWFuO1xuICAvKipcbiAgICogUmV0aXJlIHRoaXMgZW50cnk6IHJlc29sdmUgYGRlbGl2ZXJlZGAgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSByZWdpc3RyeSxcbiAgICogZXhhY3RseSBhcyBgbWFya0RlbGl2ZXJlZGAgd291bGQuIENhbGxlZCBvbmx5IGJ5IHRoZSBjb250ZXh0J3Mgc2FmZXR5LW5ldFxuICAgKiBkaXNwZW5zZXIgKHtAbGluayBlbnN1cmVCYXJyaWVyU2FmZXR5TmV0fSksIGFuZCBvbmx5IG9uIHRoZSBsb3dlc3QtaW5kZXhcbiAgICogZW50cnkgYXQgZGVsaXZlcnkgaWRsZS4gSWRlbXBvdGVudC5cbiAgICovXG4gIHJldGlyZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBXaGljaCBlYXJsaWVyIGtpbmRzIGVhY2ggZGVsaXZlcnkga2luZCBkZWZlcnMgYmVoaW5kLiBDaG9zZW4gc28gdGhhdCBubyBraW5kXG4gKiBibG9ja3Mgb24gYSBwZWVyIGl0IGRvZXMgbm90IG5lZWQgdG86XG4gKlxuICogIC0gYSBob29rIGRlZmVycyBiZWhpbmQgZWFybGllciBIT09LUywgV0FJVFMgYW5kIFNURVBTO1xuICogIC0gYSB3YWl0IGRlZmVycyBiZWhpbmQgZWFybGllciBIT09LUyBhbmQgU1RFUFMg4oCUIG5vdCBlYXJsaWVyIHdhaXRzLCBzaW5jZSBhXG4gKiAgICB3YWl0IG5ldmVyIG5lZWRzIHRvIHF1ZXVlIGJlaGluZCBhbm90aGVyIHdhaXQ7XG4gKiAgLSBhIHN0ZXAgZGVmZXJzIGJlaGluZCBlYXJsaWVyIFdBSVRTLCBIT09LUyBhbmQgU1RFUFMuXG4gKlxuICogVGhlIHN0ZXAtYmVoaW5kLXN0ZXAgZWRnZSBpcyBub3QgcmVkdW5kYW50IHdpdGggdGhlIHNlcmlhbCBgcHJvbWlzZVF1ZXVlYC5cbiAqIFRoZSBxdWV1ZSBmaXhlcyB0aGUgb3JkZXIgaW4gd2hpY2ggc3RlcCByZXN1bHRzIGFyZSBIWURSQVRFRCwgYnV0IGEgc3RlcCBub1xuICogbG9uZ2VyIHJlc29sdmVzIGluc2lkZSBpdHMgcXVldWUgc2xvdCDigJQgaXQgY2FwdHVyZXMgdGhlIG91dGNvbWUgdGhlcmUgYW5kXG4gKiByZXNvbHZlcyBmcm9tIGEgZGV0YWNoZWQgY29udGludWF0aW9uIG9uY2UgaXRzIGJhcnJpZXIgY2xlYXJzLiBUd28gc3RlcHNcbiAqIGFncmVlIG9uIHRoYXQgY29udGludWF0aW9uJ3Mgb3JkZXJpbmcgb25seSB3aGlsZSB0aGV5IGRlZmVyIGJlaGluZCB0aGUgc2FtZVxuICogc2V0LCB3aGljaCBob2xkcyB3aGVuIHRoZXkgYXJlIGNvbnN1bWVkIGluIHRoZSBzYW1lIGRyYWluIHdpbmRvdyBidXQgbm90XG4gKiBhY3Jvc3Mgd2luZG93czogYSBzdGVwIGNvbnN1bWVkIGxhdGVyIGNhbiBtaXNzIGEgd2FpdC9ob29rIGJhcnJpZXIgdGhhdCBhblxuICogZWFybGllciBzdGVwIGlzIHN0aWxsIHBhcmtlZCBvbiwgYmVjYXVzZSB0aGUgYmFycmllciByZXRpcmVkIGluIGJldHdlZW4uIFRoZVxuICogZWFybGllciBzdGVwIGlzIHRoZW4gd2FpdGluZyBvdXQgdGhlIG1hY3JvdGFzayB5aWVsZCBiZWxvdyB3aGlsZSB0aGUgbGF0ZXJcbiAqIG9uZSByZXNvbHZlcyBvbiBtaWNyb3Rhc2tzLCBhbmQgb3ZlcnRha2VzIGl0IOKAlCBzZWVcbiAqIGBkZWxpdmVyeS1iYXJyaWVyLWNvdmVyYWdlLnRlc3QudHNgLiBEZWZlcnJpbmcgYmVoaW5kIGVhcmxpZXIgc3RlcHNcbiAqIGNsb3NlcyB0aGF0IHdpbmRvdyBzdHJ1Y3R1cmFsbHk6IHRoZSBlYXJsaWVyIHN0ZXAncyBiYXJyaWVyIGlzIHN0aWxsXG4gKiByZWdpc3RlcmVkIHByZWNpc2VseSBiZWNhdXNlIGl0IGhhcyBub3QgZGVsaXZlcmVkIHlldC5cbiAqXG4gKiBFdmVyeSBlZGdlIHBvaW50cyBmcm9tIGEgbGF0ZXIgbG9nIGluZGV4IHRvIGEgc3RyaWN0bHkgZWFybGllciBvbmUsIHNvIHRoZVxuICogd2FpdC1mb3IgZ3JhcGggY2FuIG5ldmVyIGNvbnRhaW4gYSBjeWNsZS5cbiAqL1xuY29uc3QgREVGRVJfQkVISU5EOiBSZWNvcmQ8RGVsaXZlcnlLaW5kLCByZWFkb25seSBEZWxpdmVyeUtpbmRbXT4gPSB7XG4gIGhvb2s6IFsnaG9vaycsICd3YWl0JywgJ3N0ZXAnXSxcbiAgd2FpdDogWydob29rJywgJ3N0ZXAnXSxcbiAgc3RlcDogWyd3YWl0JywgJ2hvb2snLCAnc3RlcCddLFxufTtcblxuLyoqXG4gKiBXaGV0aGVyIGBlbnRyeWAgd2lsbCByZXNvbHZlIG9uIGl0cyBvd24g4oCUIGl0IGlzIGFybWVkLCBhbmQgZXZlcnkgZWFybGllclxuICogZGVsaXZlcnkgaXQgZGVmZXJzIGJlaGluZCB3aWxsIGxpa2V3aXNlIHJlc29sdmUgb24gaXRzIG93bi5cbiAqXG4gKiBBIHN0ZXAgZGVsaXZlcnkgaXMgYWx3YXlzIHNlbGYtcmVzb2x2aW5nOiBpdCBza2lwcyB1bmNvbW1pdHRlZCBkZWxpdmVyaWVzXG4gKiAoc2VlIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfSksIGFuZCB0aGUgZWFybGllciBzdGVwcyBpdCBkb2VzIGRlZmVyXG4gKiBiZWhpbmQgYXJlIHNlbGYtcmVzb2x2aW5nIGJ5IHRoZSBzYW1lIGFyZ3VtZW50LCBpbmR1Y3RpbmcgZG93biBvbiBpbmRleC5cbiAqXG4gKiBSZWN1cnNpb24gdGVybWluYXRlcyBiZWNhdXNlIGV2ZXJ5IGVkZ2UgcG9pbnRzIHRvIGEgc3RyaWN0bHkgc21hbGxlciBpbmRleC5cbiAqIGBtZW1vYCBpcyByZXF1aXJlZCByYXRoZXIgdGhhbiBhbiBvcHRpbWl6YXRpb246IHdpdGhvdXQgaXQgdGhlIHdhbGsgaXNcbiAqIGV4cG9uZW50aWFsIGluIHRoZSBudW1iZXIgb2YgbGl2ZSBob29rL3dhaXQgYmFycmllcnMgKGVhY2ggYXJtZWQgZW50cnlcbiAqIHJlLXdhbGtzIGV2ZXJ5IGVhcmxpZXIgZW50cnkgb2YgdGhlIG9wcG9zaXRlIGtpbmQsIFQobikgPSDOoyBUKGopKSwgYW5kIHRoZVxuICogcmVnaXN0cnkgaXMgbm90IHNtYWxsIGJ5IGNvbnN0cnVjdGlvbiDigJQgYEV2ZW50c0NvbnN1bWVyYCBkcmFpbnNcbiAqIGNvbnNlY3V0aXZlbHkgY29uc3VtYWJsZSBldmVudHMgc3luY2hyb25vdXNseSB3aGlsZSBiYXJyaWVycyBvbmx5IHJldGlyZSBvblxuICogbWljcm90YXNrLWRyaXZlbiBkZWxpdmVyaWVzLCBzbyBhIGZhbi1vdXQgb2YgYFByb21pc2UucmFjZShbaG9vaywgc2xlZXBdKWBcbiAqIGJyYW5jaGVzIGFjY3VtdWxhdGVzIG9uZSBiYXJyaWVyIHBlciBicmFuY2ggcGVyIGtpbmQuIE1lbW9pemVkLCB0aGUgd2FsayBpc1xuICogbGluZWFyIGluIHJlZ2lzdHJ5IHNpemUuIFRoZSBtZW1vIE1VU1QgYmUgcGVyLWNhbGw6IGBhcm1lZGAgbXV0YXRlcyBiZXR3ZWVuXG4gKiBjYWxscyBhcyBidWZmZXJlZCBwYXlsb2FkcyBhcmUgY2xhaW1lZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZXNPbkl0c093bihcbiAgYmFycmllcnM6IE1hcDxudW1iZXIsIERlbGl2ZXJ5QmFycmllckVudHJ5PixcbiAgaW5kZXg6IG51bWJlcixcbiAgZW50cnk6IERlbGl2ZXJ5QmFycmllckVudHJ5LFxuICBtZW1vOiBNYXA8bnVtYmVyLCBib29sZWFuPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNhY2hlZCA9IG1lbW8uZ2V0KGluZGV4KTtcbiAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjb21wdXRlUmVzb2x2ZXNPbkl0c093bihiYXJyaWVycywgaW5kZXgsIGVudHJ5LCBtZW1vKTtcbiAgbWVtby5zZXQoaW5kZXgsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVSZXNvbHZlc09uSXRzT3duKFxuICBiYXJyaWVyczogTWFwPG51bWJlciwgRGVsaXZlcnlCYXJyaWVyRW50cnk+LFxuICBpbmRleDogbnVtYmVyLFxuICBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnksXG4gIG1lbW86IE1hcDxudW1iZXIsIGJvb2xlYW4+XG4pOiBib29sZWFuIHtcbiAgaWYgKCFlbnRyeS5hcm1lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZW50cnkua2luZCA9PT0gJ3N0ZXAnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgZGVmZXJCZWhpbmQgPSBERUZFUl9CRUhJTkRbZW50cnkua2luZF07XG4gIGZvciAoY29uc3QgW290aGVySW5kZXgsIG90aGVyXSBvZiBiYXJyaWVycykge1xuICAgIGlmIChcbiAgICAgIG90aGVySW5kZXggPCBpbmRleCAmJlxuICAgICAgZGVmZXJCZWhpbmQuaW5jbHVkZXMob3RoZXIua2luZCkgJiZcbiAgICAgICFyZXNvbHZlc09uSXRzT3duKGJhcnJpZXJzLCBvdGhlckluZGV4LCBvdGhlciwgbWVtbylcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQXdhaXRzLCBpbiBzdHJpY3QgZXZlbnQtbG9nIG9yZGVyLCBldmVyeSBzdGlsbC1yZWdpc3RlcmVkIGRlbGl2ZXJ5IHRoYXQgaXNcbiAqIGVhcmxpZXIgaW4gdGhlIGxvZyB0aGFuIGBldmVudEluZGV4YCBhbmQgdGhhdCBhIGRlbGl2ZXJ5IG9mIGBraW5kYCBkZWZlcnNcbiAqIGJlaGluZCAoc2VlIHtAbGluayBERUZFUl9CRUhJTkR9KSwgc28gdGhhdCB0aGlzIHJlc29sdXRpb24gaXMgaGFuZGVkIHRvIHRoZVxuICogd29ya2Zsb3cgb25seSBhZnRlciBhbGwgcmVsZXZhbnQgZWFybGllci1pbi1sb2cgZGVsaXZlcmllcyBoYXZlIGJlZW4uIFRoaXNcbiAqIGlzIHdoYXQga2VlcHMgYSBgUHJvbWlzZS5yYWNlYCDigJQgb3IgdGhlIFVMSUQgYSBmb2xsb3ctdXAgYHVzZVN0ZXBgIGRyYXdzIG9uXG4gKiBhIGNvbmN1cnJlbnQgYnJhbmNoIOKAlCBkZXRlcm1pbmlzdGljIGFuZCBhbGlnbmVkIHdpdGggdGhlIGNvbW1pdHRlZCBldmVudFxuICogbG9nLCBpbmRlcGVuZGVudCBvZiBtaWNyb3Rhc2staG9wIGNvdW50cywgaHlkcmF0aW9uIHRpbWUsIG9yIHJhY2UtYXJndW1lbnRcbiAqIG9yZGVyLiBXaGVuIHRoaXMgZGVsaXZlcnkgZG9lcyBoYXZlIHRvIHdhaXQsIGl0IGFsc28geWllbGRzIGEgbWFjcm90YXNrXG4gKiBhZnRlcndhcmRzIHNvIHRoZSBlYXJsaWVyIGRlbGl2ZXJ5J3MgY29uc3VtZXIgY2FuIHJ1biB0byBpdHMgb3duIG5leHRcbiAqIHN1c3BlbnNpb24gcG9pbnQgZmlyc3Q7IHNlZSB0aGUgY29tbWVudCBhdCB0aGF0IGBhd2FpdGAgZm9yIHdoeSBvcmRlcmluZyB0aGVcbiAqIGByZXNvbHZlKClgIGNhbGxzIGFsb25lIGlzIG5vdCBlbm91Z2guXG4gKlxuICogT25lIGFzeW1tZXRyeTogYSBTVEVQIHJlc3VsdCBhZGRpdGlvbmFsbHkgc2tpcHMgYW55IGVhcmxpZXIgZGVsaXZlcnkgdGhhdFxuICogd2lsbCBub3QgcmVzb2x2ZSBvbiBpdHMgb3duLCBpLmUuIG9uZSBibG9ja2VkIChkaXJlY3RseSBvciB0cmFuc2l0aXZlbHkpIG9uXG4gKiBhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCBubyBjb25zdW1lciBoYXMgY2xhaW1lZC4gU3VjaCBhIHBheWxvYWQgaXMgZGVsaXZlcmVkXG4gKiBvbmx5IHdoZW4gdGhlIHdvcmtmbG93IG5leHQgcmVhZHMgdGhlIGhvb2ssIGFuZCByZWFjaGluZyB0aGF0IHJlYWQgdmVyeVxuICogY29tbW9ubHkgcmVxdWlyZXMgdGhlIHN0ZXAgcmVzdWx0IGl0c2VsZiAoYGF3YWl0IHN0ZXBYKClgIGJlZm9yZSB0aGUgcmVhZCkuXG4gKiBHYXRpbmcgdGhlIHN0ZXAgb24gaXQgd291bGQgc3RhbGwgdGhlIHdvcmtmbG93IHVudGlsIHRoZSBiYXJyaWVyJ3MgaWRsZVxuICogc2FmZXR5IG5ldCBmaXJlcywgd2hpY2ggdGhlbiByZWxlYXNlcyBldmVyeSBkZWxpdmVyeSBxdWV1ZWQgYmVoaW5kIHRoYXRcbiAqIHBheWxvYWQgYXQgb25jZSDigJQgbG9zaW5nIGV4YWN0bHkgdGhlIHJhY2UgdGhpcyBvcmRlcmluZyBleGlzdHMgdG8gcHJvdGVjdC5cbiAqIFdhaXRzIGFuZCBob29rcyBrZWVwIGdhdGluZyBvbiB1bmNsYWltZWQgcGF5bG9hZHM6IGZvciB0aGVtLCB3YWl0aW5nIGZvciB0aGVcbiAqIGNsYWltIElTIHRoZSBvcmRlcmluZyBndWFyYW50ZWUgKGEgYHdhaXRfY29tcGxldGVkYCBtdXN0IG5vdCBwcmVlbXB0IGFcbiAqIHBheWxvYWQgdGhlIGxvZyBvcmRlcmVkIGZpcnN0KS5cbiAqXG4gKiBBIGRlbGl2ZXJ5IHRoYXQgZG9lcyBnYXRlIG9uIGFuIHVuY2xhaW1lZCBwYXlsb2FkIHN0aWxsIGRlbGl2ZXJzIGluIGxvZ1xuICogb3JkZXIgb25jZSB0aGF0IHBheWxvYWQncyBiYXJyaWVyIGlzIHJldGlyZWQsIGFuZCB0aGF0IHJlc3RzIG9uIHRoZVxuICogUEFZTE9BRCdzIGJhcnJpZXIgYmVpbmcgcmV0aXJlZCBiZWZvcmUgdGhhdCBvZiBhbnl0aGluZyBwYXJrZWQgYmVoaW5kIGl0LlxuICogVGhhdCBvcmRlciBpcyBzdHJ1Y3R1cmFsOiBzYWZldHktbmV0IHJldGlyZW1lbnRzIGdvIHRocm91Z2ggb25lIHBlci1jb250ZXh0XG4gKiBkaXNwZW5zZXIgdGhhdCBvbmx5IGV2ZXIgcmV0aXJlcyB0aGUgbG93ZXN0LWluZGV4IGVudHJ5IGF0IGRlbGl2ZXJ5IGlkbGUsXG4gKiBhbmQgZXZlcnkgcmV0aXJlbWVudCB0aGF0IHdha2VzIGEgY2hhaW4gZmxpcHNcbiAqIHtAbGluayBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeX0gYmFjayB0byB0cnVlLCByZS1ibG9ja2luZyB0aGUgZGlzcGVuc2VyXG4gKiB1bnRpbCB0aGUgY2hhaW4gaGFzIGRyYWluZWQg4oCUIHNlZSB7QGxpbmsgZW5zdXJlQmFycmllclNhZmV0eU5ldH0uIChUaGlzXG4gKiB1c2VkIHRvIHJlc3Qgb24gdGhlIEZJRk8gb2Ygb25lIGlkbGUgcG9sbCBwZXIgYmFycmllciwgd2hpY2ggaGVsZCBmb3IgYVxuICogc2luZ2xlIHBhcmtlZCBzZWdtZW50IGJ1dCBkZWNheWVkIHRvIHRpbWluZyBub2lzZSB3aXRoIHNldmVyYWwg4oCUIHRoZVxuICogcmVsZWFzZSBvcmRlciwgYW5kIHRoZXJlZm9yZSB0aGUgVUxJRHMgZHJhd24gYnkgdGhlIHdva2VuIGJyYW5jaGVzLCB0aGVuXG4gKiBkZXBlbmRlZCBvbiBob3cgbXVjaCBsb2cgdGhlIHJlcGxheSBoYWQgbG9hZGVkLiBzdG9ybS1sb2ctcmVwbGF5LnRlc3QudHNcbiAqIHJlcGxheXMgYSBwcm9kdWN0aW9uIGxvZyBjb3JydXB0ZWQgZXhhY3RseSB0aGF0IHdheS4pXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZXZlbnRJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBraW5kOiBEZWxpdmVyeUtpbmRcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBEZWZlbnNpdmU6IHRvbGVyYXRlIGNvbnRleHRzIHRoYXQgcHJlZGF0ZSB0aGlzIGZpZWxkICh0ZXN0IGhhcm5lc3NlcykuXG4gIGlmIChcbiAgICBldmVudEluZGV4ID09PSB1bmRlZmluZWQgfHxcbiAgICAhY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzIHx8XG4gICAgY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzLnNpemUgPT09IDBcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGJhcnJpZXJzID0gY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzO1xuICBjb25zdCBkZWZlckJlaGluZCA9IERFRkVSX0JFSElORFtraW5kXTtcbiAgY29uc3QgZWFybGllcjogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIC8vIFNoYXJlZCBhY3Jvc3MgdGhpcyBjYWxsIG9ubHkg4oCUIHNlZSBgcmVzb2x2ZXNPbkl0c093bmAuXG4gIGNvbnN0IHNlbGZSZXNvbHZpbmcgPSBuZXcgTWFwPG51bWJlciwgYm9vbGVhbj4oKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGVudHJ5XSBvZiBiYXJyaWVycykge1xuICAgIGlmIChpbmRleCA+PSBldmVudEluZGV4IHx8ICFkZWZlckJlaGluZC5pbmNsdWRlcyhlbnRyeS5raW5kKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGtpbmQgPT09ICdzdGVwJyAmJlxuICAgICAgIXJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIGluZGV4LCBlbnRyeSwgc2VsZlJlc29sdmluZylcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlYXJsaWVyLnB1c2goZW50cnkuZGVsaXZlcmVkKTtcbiAgfVxuICBpZiAoZWFybGllci5sZW5ndGggPiAwKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZWFybGllcik7XG4gICAgLy8gQW4gZWFybGllciBkZWxpdmVyeSBiZWluZyBcImRlbGl2ZXJlZFwiIG9ubHkgbWVhbnMgaXRzIGByZXNvbHZlKClgIHJhbi5cbiAgICAvLyBUaGUgYnJhbmNoIGl0IHdva2UgbWF5IG5lZWQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBmdXJ0aGVyIG1pY3JvdGFza1xuICAgIC8vIGhvcHMgYmVmb3JlIGl0IHJlYWNoZXMgaXRzIG5leHQgYHVzZVN0ZXBgIGNhbGwgYW5kIGRyYXdzIGEgVUxJRCDigJQgYVxuICAgIC8vIGBmb3IgYXdhaXRgIG92ZXIgYSBob29rLCBmb3IgaW5zdGFuY2UsIHJlc3VtZXMgdGhlIGdlbmVyYXRvciwgc2V0dGxlc1xuICAgIC8vIHRoZSBwcm9taXNlIGZyb20gYG5leHQoKWAsIGFuZCBvbmx5IHRoZW4gcnVucyB0aGUgbG9vcCBib2R5LiBSZXNvbHZpbmdcbiAgICAvLyB0aGlzIGRlbGl2ZXJ5IG9uIGEgbWljcm90YXNrIHdvdWxkIGxldCBpdCBvdmVydGFrZSB0aGF0IGJyYW5jaCBhbmRcbiAgICAvLyByZW9yZGVyIHRoZSBVTElEIGFsbG9jYXRpb24gYW55d2F5LCB0dXJuaW5nIHRoZSBndWFyYW50ZWUgYmVsb3cgaW50byBhXG4gICAgLy8gaG9wLWNvdW50IHJhY2UgdGhhdCBob2xkcyBvbmx5IGZvciB0aGUgc2hvcnRlc3QgY29uc3VtZXJzLlxuICAgIC8vXG4gICAgLy8gWWllbGRpbmcgYSBtYWNyb3Rhc2sgbGV0cyB0aGUgZWFybGllciBicmFuY2gncyBlbnRpcmUgbWljcm90YXNrIGNoYWluXG4gICAgLy8gZHJhaW4gZmlyc3QsIHdoYXRldmVyIGl0cyBsZW5ndGgsIHNvIGxvZyBvcmRlciBzdXJ2aXZlcyByZWdhcmRsZXNzIG9mXG4gICAgLy8gaG93IHRoZSB3b3JrZmxvdyBjb25zdW1lcyB0aGUgZWFybGllciBkZWxpdmVyeS4gT25seSBkZWxpdmVyaWVzIHRoYXRcbiAgICAvLyBhY3R1YWxseSBoYWQgdG8gZGVmZXIgcGF5IHRoaXMsIHNvIHRoZSBjb21tb24gc2luZ2xlLWRlbGl2ZXJ5IGRyYWluIGlzXG4gICAgLy8gdW5hZmZlY3RlZC5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gIH1cbn1cblxuLyoqIEhhbmRsZSBmb3IgYSByZWdpc3RlcmVkIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBiYXJyaWVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWxpdmVyeUJhcnJpZXIge1xuICAvKipcbiAgICogTWFyayB0aGlzIGRlbGl2ZXJ5IGFzIGRlbGl2ZXJlZCB0byB0aGUgd29ya2Zsb3cuIFJlc29sdmVzIGl0c1xuICAgKiBgZGVsaXZlcmVkYCBwcm9taXNlIHNvIGFueSBsYXRlci1pbi1sb2cgZGVsaXZlcnkgZ2F0ZWQgb24gaXQgKHZpYVxuICAgKiB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30pIG1heSBwcm9jZWVkLCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZVxuICAgKiByZWdpc3RyeS4gSWRlbXBvdGVudC5cbiAgICovXG4gIG1hcmtEZWxpdmVyZWQ6ICgpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBNYXJrIHRoaXMgZGVsaXZlcnkgYXMgY29tbWl0dGVkIHRvIGhhcHBlbmluZywgZm9yIGEgYmFycmllciByZWdpc3RlcmVkXG4gICAqIHVuYXJtZWQgKGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkKSBvbmNlIGEgY29uc3VtZXIgaGFzIGNsYWltZWQgaXQuIEZyb21cbiAgICogdGhlbiBvbiBhIGxhdGVyIHN0ZXAgcmVzdWx0IG1heSBiZSBvcmRlcmVkIGJlaGluZCBpdC4gSWRlbXBvdGVudC5cbiAgICovXG4gIGFybTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBhdCBpdHMgZXZlbnQtbG9nIGluZGV4IHNvIHRoYXQgbGF0ZXJcbiAqIGRlbGl2ZXJpZXMgY2FuIGJlIG9yZGVyZWQgc3RyaWN0bHkgYWZ0ZXIgaXQuIFJldHVybnMgYW4gaW5lcnQgaGFuZGxlIHdoZW5cbiAqIGBwZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2AgaXMgbm90IGluaXRpYWxpemVkLlxuICpcbiAqIFBhc3MgYGFybWVkOiBmYWxzZWAgZm9yIGEgZGVsaXZlcnkgd2hvc2UgcmVzb2x1dGlvbiB3YWl0cyBvbiB3b3JrZmxvdyBjb2RlXG4gKiBhc2tpbmcgZm9yIGl0IChhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCk7IGNhbGwgYGFybSgpYCB3aGVuIGl0IGRvZXMuXG4gKlxuICogVG8gZ3VhcmFudGVlIGEgbGF0ZXIgZGVsaXZlcnkgZ2F0ZWQgb24gdGhpcyBvbmUgY2FuIG5ldmVyIGhhbmcgd2hlbiB0aGlzXG4gKiBkZWxpdmVyeSBpcyBhYmFuZG9uZWQgKHRoZSB3b3JrZmxvdyB0b29rIGEgZGlmZmVyZW50IGJyYW5jaCBvciBpc1xuICogc3VzcGVuZGluZyBhbmQgbmV2ZXIgb2JzZXJ2ZXMgaXQpLCB0aGUgYmFycmllciBhdXRvLXJlc29sdmVzIGF0IGlkbGUuXG4gKlxuICogSU5WQVJJQU5UIHJlcXVpcmVkIG9mIGV2ZXJ5IGNhbGwgc2l0ZTogYSBiYXJyaWVyIHRoYXQgaXMgZXZlciBgYXJtZWRgIG11c3RcbiAqIGJlIHBhaXJlZCB3aXRoIGEgZGVsaXZlcnkgY2hhaW4gdGhhdCBydW5zIHVuY29uZGl0aW9uYWxseSDigJQgYXR0YWNoZWQgd2hlblxuICogdGhlIGV2ZW50IGlzIGNvbnN1bWVkICh3YWl0cywgc3RlcCByZXN1bHRzLCB3YWl0aW5nLWNvbnN1bWVyIGhvb2tcbiAqIHBheWxvYWRzKSwgb3IgYnkgdGhlIGBjbGFpbSgpYCB3aG9zZSBpbnZvY2F0aW9uIGlzIHdoYXQgYXJtcyBpdCAoYnVmZmVyZWRcbiAqIGhvb2sgcGF5bG9hZHMpLiBUaGUgaWRsZSBjaGVjayAoe0BsaW5rIHNjaGVkdWxlV2hlbklkbGV9KSByZWZ1c2VzIHRvXG4gKiBvYnNlcnZlIGlkbGUgd2hpbGUgYW4gYXJtZWQsIHNlbGYtcmVzb2x2aW5nIGJhcnJpZXIgaXMgdW5kZWxpdmVyZWQsIGFuZCB0aGVcbiAqIHNhZmV0eSBuZXQgYmVsb3cgaXMgaXRzZWxmIGlkbGUtZ2F0ZWQg4oCUIHNvIGFuIGFybWVkIGJhcnJpZXIgd2l0aCBub1xuICogdW5jb25kaXRpb25hbCBjaGFpbiB3b3VsZCBsaXZlbG9jayBldmVyeSBpZGxlIGNoZWNrIGluIHRoZSBydW4sIGluY2x1ZGluZ1xuICogaXRzIG93biByZXRpcmVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBldmVudEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGtpbmQ6IERlbGl2ZXJ5S2luZCxcbiAgb3B0aW9uczogeyBhcm1lZD86IGJvb2xlYW4gfSA9IHt9XG4pOiBEZWxpdmVyeUJhcnJpZXIge1xuICBjb25zdCBiYXJyaWVycyA9IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycztcbiAgaWYgKCFiYXJyaWVycyB8fCBldmVudEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBtYXJrRGVsaXZlcmVkOiAoKSA9PiB7fSwgYXJtOiAoKSA9PiB7fSB9O1xuICB9XG5cbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlIH0gPSB3aXRoUmVzb2x2ZXJzPHZvaWQ+KCk7XG5cbiAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgIGlmIChkb25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvbmUgPSB0cnVlO1xuICAgIGlmIChiYXJyaWVycy5nZXQoZXZlbnRJbmRleCkgPT09IGVudHJ5KSB7XG4gICAgICBiYXJyaWVycy5kZWxldGUoZXZlbnRJbmRleCk7XG4gICAgfVxuICAgIHJlc29sdmUoKTtcbiAgfTtcblxuICBjb25zdCBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnkgPSB7XG4gICAga2luZCxcbiAgICBkZWxpdmVyZWQ6IHByb21pc2UsXG4gICAgYXJtZWQ6IG9wdGlvbnMuYXJtZWQgPz8gdHJ1ZSxcbiAgICByZXRpcmU6IGZpbmlzaCxcbiAgfTtcbiAgYmFycmllcnMuc2V0KGV2ZW50SW5kZXgsIGVudHJ5KTtcblxuICAvLyBTYWZldHkgbmV0OiBpZiB0aGlzIGRlbGl2ZXJ5IGlzIG5ldmVyIGRlbGl2ZXJlZCB0byB0aGUgd29ya2Zsb3cgKGl0c1xuICAvLyBicmFuY2ggd2FzIG5vdCB0YWtlbiAvIHRoZSBydW4gaXMgc3VzcGVuZGluZywgb3IgYSBidWZmZXJlZCBob29rIHBheWxvYWRcbiAgLy8gaXMgb25seSBjbGFpbWVkIGFmdGVyIGEgbGF0ZXIgZGVsaXZlcnkgdGhlIHdvcmtmbG93IGlzIHN0aWxsIHdhaXRpbmcgb24pLFxuICAvLyBpdCBpcyByZXRpcmVkIGF0IGlkbGUgc28gYSBsYXRlciBkZWxpdmVyeSBnYXRlZCBvbiBpdCBjYW5ub3QgZGVhZGxvY2sgYW5kXG4gIC8vIHRoZSByZWdpc3RyeSBjYW5ub3QgbGVhayBhbiBlbnRyeSBwZXIgYWJhbmRvbmVkIGRlbGl2ZXJ5LiBSZXRpcmVtZW50IGdvZXNcbiAgLy8gdGhyb3VnaCB0aGUgY29udGV4dCdzIHNpbmdsZSBvcmRlcmVkIGRpc3BlbnNlciByYXRoZXIgdGhhbiBhIHBlci1iYXJyaWVyXG4gIC8vIGlkbGUgcG9sbCDigJQgc2VlIHtAbGluayBlbnN1cmVCYXJyaWVyU2FmZXR5TmV0fSBmb3Igd2h5IHRoZSBPUkRFUiBvZiB0aGVzZVxuICAvLyByZXRpcmVtZW50cyBpcyBsb2FkLWJlYXJpbmcuXG4gIGVuc3VyZUJhcnJpZXJTYWZldHlOZXQoY3R4KTtcblxuICByZXR1cm4ge1xuICAgIG1hcmtEZWxpdmVyZWQ6IGZpbmlzaCxcbiAgICBhcm06ICgpID0+IHtcbiAgICAgIGVudHJ5LmFybWVkID0gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIENvbnRleHRzIHdob3NlIGJhcnJpZXIgc2FmZXR5LW5ldCBkaXNwZW5zZXIgaXMgY3VycmVudGx5IGFybWVkLiBNb2R1bGUtbGV2ZWxcbiAqIHNvIHRoZSBjb250ZXh0IGludGVyZmFjZSAoY29uc3RydWN0ZWQgbGl0ZXJhbGx5IGJ5IG1hbnkgdGVzdCBoYXJuZXNzZXMpXG4gKiBuZWVkcyBubyBuZXcgZmllbGQ7IGVudHJpZXMgZHJvcCB3aXRoIHRoZSBjb250ZXh0LlxuICovXG5jb25zdCBhY3RpdmVCYXJyaWVyU2FmZXR5TmV0cyA9IG5ldyBXZWFrU2V0PFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dD4oKTtcblxuLyoqXG4gKiBUaGUgYmFycmllciByZWdpc3RyeSdzIHNhZmV0eSBuZXQ6IE9ORSBpZGxlLWdhdGVkIGRpc3BlbnNlciBwZXIgY29udGV4dCB0aGF0XG4gKiByZXRpcmVzLCBhdCBlYWNoIG9ic2VydmF0aW9uIG9mIGRlbGl2ZXJ5IGlkbGUsIG9ubHkgdGhlIExPV0VTVC1pbmRleCBlbnRyeVxuICogc3RpbGwgcmVnaXN0ZXJlZCwgdGhlbiB5aWVsZHMgc28gdGhlIGNoYWluIGl0IHJlbGVhc2VkIGNhbiBydW4gYmVmb3JlIHRoZVxuICogbmV4dCByZXRpcmVtZW50IGlzIGNvbnNpZGVyZWQuXG4gKlxuICogV2h5IG9uZSBvcmRlcmVkIGRpc3BlbnNlciBhbmQgbm90IGEgcG9sbCBwZXIgYmFycmllciAod2hpY2ggaXMgd2hhdCB0aGlzXG4gKiByZXBsYWNlZCk6IHRoZSBvcmRlciBvZiBzYWZldHktbmV0IHJldGlyZW1lbnRzIGRlY2lkZXMgdGhlIGRlbGl2ZXJ5IG9yZGVyIG9mXG4gKiBldmVyeSBjaGFpbiBwYXJrZWQgYmVoaW5kIGFuIHVuY2xhaW1lZCBidWZmZXJlZCBob29rIHBheWxvYWQg4oCUIGEgaG9vayB0aGVcbiAqIHdvcmtmbG93IG5ldmVyIHJlYWRzIChhIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9va2ApIHBhcmtzIGV2ZXJ5IGxhdGVyXG4gKiBhcm1lZCB3YWl0L2hvb2sgYmVoaW5kIGEgYmFycmllciB0aGF0IG9ubHkgdGhpcyBuZXQgY2FuIHJldGlyZS4gUGVyLWJhcnJpZXJcbiAqIHBvbGxzIGZpcmUgaW4gd2hhdGV2ZXIgb3JkZXIgdGhlaXIgcmUtYXJtIGN5Y2xlcyBsYW5kLCBhbmQgZWFjaCByZS1hcm1cbiAqIGF0dGFjaGVzIHRvIGEgYHByb21pc2VRdWV1ZWAgdGhhdCBncm93cyBiZXR3ZWVuIGNoZWNrcywgc28gd2l0aCBzZXZlcmFsXG4gKiBwYXJrZWQgc2VnbWVudHMgdGhlIHJlbGVhc2Ugb3JkZXIgZGVjYXlzIHRvIHRpbWluZyBub2lzZS4gRHJhd3MgKGB1c2VTdGVwYFxuICogY29ycmVsYXRpb24gaWRzKSB0aGVuIGRlcGVuZCBvbiB3aGljaCBzZWdtZW50IGhhcHBlbmVkIHRvIHJlbGVhc2UgZmlyc3Qg4oCUXG4gKiBjb25jcmV0ZWx5LCBvbiBob3cgTVVDSCBsb2cgdGhlIHJlcGxheSBsb2FkZWQsIHNpbmNlIHRoYXQgZGVjaWRlcyB3aGF0IGlzIGluXG4gKiB0aGUgcmVnaXN0cnkuIFRoYXQgaXMgdGhlIG1lY2hhbmlzbSBiZWhpbmQgc2xvdC1tb2RlIENPUlJVUFRFRF9FVkVOVF9MT0cgb25cbiAqIHN0b3JtLXNoYXBlZCBydW5zIChzZWUgc3Rvcm0tbG9nLXJlcGxheS50ZXN0LnRzLCBidWlsdCBmcm9tIGEgcHJvZHVjdGlvblxuICogbG9nKTogdHdvIHJlcGxheXMgb2YgdGhlIHNhbWUgcnVuIGhvbGRpbmcgZGlmZmVyZW50LWxlbmd0aCBwcmVmaXhlcyBib3VuZFxuICogdGhlIHNhbWUgY29ycmVsYXRpb24gb3JkaW5hbCB0byBkaWZmZXJlbnQgc3RlcHMuXG4gKlxuICogUmV0aXJpbmcgbG93ZXN0LWZpcnN0IGlzIG5vdCBtZXJlbHkgdGlkeSwgaXQgaXMgdGhlIG9ubHkgb3JkZXIgdGhhdCBjYW5ub3RcbiAqIGludmVydCB0aGUgbG9nOiBldmVyeSBnYXRlIHBvaW50cyBmcm9tIGEgaGlnaGVyIGluZGV4IHRvIGEgc3RyaWN0bHkgbG93ZXJcbiAqIG9uZSwgc28gYXQgZGVsaXZlcnkgaWRsZSB0aGUgbG93ZXN0IHVuZGVsaXZlcmVkIGVudHJ5IGdhdGVzIG9uIG5vdGhpbmdcbiAqIHN0aWxsIHJlZ2lzdGVyZWQg4oCUIGl0IGlzIHRoZSBoZWFkIG9mIGV2ZXJ5IHBhcmtlZCBjaGFpbiAoaW4gcHJhY3RpY2UsIHRoZVxuICogdW5jbGFpbWVkIHBheWxvYWQgaXRzZWxmKS4gUmVsZWFzaW5nIGl0IGxldHMgdGhlIGNoYWluIGFib3ZlIGRlbGl2ZXJcbiAqIHRocm91Z2ggdGhlIG9yZGluYXJ5IGJhcnJpZXIgb3JkZXI7IGFueXRoaW5nIHRoZSByZWxlYXNlIHdha2VzIGZsaXBzXG4gKiB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IGJhY2sgdG8gdHJ1ZSwgd2hpY2ggcmUtYmxvY2tzIHRoaXNcbiAqIGRpc3BlbnNlciB1bnRpbCB0aGUgY2hhaW4gaGFzIGZ1bGx5IGRyYWluZWQuIEEgaGlnaGVyIGVudHJ5IG11c3QgbmV2ZXIgYmVcbiAqIHJldGlyZWQgd2hpbGUgYSBsb3dlciBvbmUgaXMgcmVnaXN0ZXJlZCDigJQgdGhhdCBpcyBleGFjdGx5IHRoZSBpbnZlcnNpb25cbiAqIGRlc2NyaWJlZCBvbiB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30uXG4gKlxuICogVGhlIGRpc3BlbnNlciBnb2VzIGRvcm1hbnQgd2hlbiB0aGUgcmVnaXN0cnkgZW1wdGllcyBhbmQgaXMgcmUtYXJtZWQgYnkgdGhlXG4gKiBuZXh0IHJlZ2lzdHJhdGlvbiwgc28gYW4gaWRsZSBjb250ZXh0IGhvbGRzIG5vIGxpdmUgdGltZXIuXG4gKi9cbmZ1bmN0aW9uIGVuc3VyZUJhcnJpZXJTYWZldHlOZXQoY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpOiB2b2lkIHtcbiAgY29uc3QgYmFycmllcnMgPSBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM7XG4gIGlmICghYmFycmllcnMgfHwgYWN0aXZlQmFycmllclNhZmV0eU5ldHMuaGFzKGN0eCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYWN0aXZlQmFycmllclNhZmV0eU5ldHMuYWRkKGN0eCk7XG4gIGNvbnN0IHJlYXJtID0gKCkgPT4ge1xuICAgIHNldFRpbWVvdXQoY2hlY2ssIDApO1xuICB9O1xuICAvLyBBIHJlamVjdGVkIHByb21pc2VRdWV1ZSBzZXR0bGVzIGltbWVkaWF0ZWx5IGFuZCBmb3JldmVyLCBzbyByZS1hcm1pbmdcbiAgLy8gdGhyb3VnaCBpdCBhdCB0aGUgbm9ybWFsIGNhZGVuY2Ugd291bGQgZGVnZW5lcmF0ZSBpbnRvIGEgYnVzeSBsb29wIG9uIGFuXG4gIC8vIGFiYW5kb25lZCBjb250ZXh0LiBCYWNrIG9mZiBpbnN0ZWFkOiBjb3JyZWN0bmVzcyBvbmx5IG5lZWRzIHRoZSBkaXNwZW5zZXJcbiAgLy8gdG8gc3RpbGwgZXhpc3QsIHNpbmNlIHRoZSByZWdpc3RyeSBnYXRlcyBzdXNwZW5zaW9uIHZpYSBpc0RlbGl2ZXJ5SWRsZVxuICAvLyBhbmQgYSBkZWFkIGRpc3BlbnNlciB3b3VsZCB3ZWRnZSB0aGUgcnVuLlxuICBjb25zdCByZWFybUFmdGVyUmVqZWN0aW9uID0gKCkgPT4ge1xuICAgIHNldFRpbWVvdXQoY2hlY2ssIDUwKTtcbiAgfTtcbiAgY29uc3QgY2hlY2sgPSAoKSA9PiB7XG4gICAgaWYgKGJhcnJpZXJzLnNpemUgPT09IDApIHtcbiAgICAgIC8vIERvcm1hbnQuIFRoZSBuZXh0IHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyIHJlLWFybXMuXG4gICAgICBhY3RpdmVCYXJyaWVyU2FmZXR5TmV0cy5kZWxldGUoY3R4KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFjYW5SZXRpcmVBYmFuZG9uZWRCYXJyaWVycyhjdHgpKSB7XG4gICAgICAvLyBBIGRlbGl2ZXJ5IGlzIGh5ZHJhdGluZyBvciBjb21taXR0ZWQtYnV0LXBhcmtlZCBvbiBpdHMgZGVmZXJyYWw7IGxldFxuICAgICAgLy8gdGhlIHF1ZXVlIGRyYWluIGFuZCByZS1jaGVjayBhIHRpY2sgbGF0ZXIgKHNhbWUgY2FkZW5jZSBhc1xuICAgICAgLy8gc2NoZWR1bGVXaGVuSWRsZSkuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlLnRoZW4ocmVhcm0sIHJlYXJtQWZ0ZXJSZWplY3Rpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBJZGxlIHdpdGggZW50cmllcyBsZWZ0OiBub3RoaW5nIHJlbWFpbmluZyBkZWxpdmVycyBvbiBpdHMgb3duLCBzb1xuICAgIC8vIHJlbGVhc2UgcGFya2VkIGNoYWlucyBmcm9tIHRoZSBoZWFkIOKAlCBsb3dlc3QgaW5kZXggZmlyc3QsIG9uZSBhdCBhXG4gICAgLy8gdGltZSwgcmUtcmVhZGluZyBpZGxlIGJldHdlZW4gcmV0aXJlbWVudHMuIEEgcmV0aXJlbWVudCB0aGF0IHdha2VzIGFcbiAgICAvLyBjaGFpbiBmbGlwcyB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IHN5bmNocm9ub3VzbHkgKGl0IGlzXG4gICAgLy8gY29tcHV0ZWQgZnJvbSB0aGUgcmVnaXN0cnkgdGhpcyBsb29wIGp1c3QgbXV0YXRlZCksIHdoaWNoIHN0b3BzIHRoZVxuICAgIC8vIHN3ZWVwIHNvIHRoZSBjaGFpbiBkZWxpdmVycyBiZWZvcmUgYW55dGhpbmcgYWJvdmUgaXQgaXMgcmVsZWFzZWQuIEFcbiAgICAvLyByZXRpcmVtZW50IHRoYXQgd2FrZXMgbm90aGluZyAoYSBzdGFsZSBwYXlsb2FkIG5vIGRlbGl2ZXJ5IGdhdGVzIG9uKVxuICAgIC8vIGtlZXBzIHRoZSBzd2VlcCBnb2luZywgc28gYSBiYWNrbG9nIG9mIHRob3NlIGRyYWlucyBpbiBPTkUgaWRsZVxuICAgIC8vIG9ic2VydmF0aW9uIOKAlCBwYWNpbmcgdGhlbSBvbmUgcGVyIHRpbWVyIHRpY2sgd291bGQgaG9sZCBjb25zdW1lZC1idXQtXG4gICAgLy8gdW5kZWxpdmVyZWQgZXZlbnRzIGhvc3RhZ2UgbG9uZyBlbm91Z2ggdG8gdHJpcCB0aGUgZXZlbnRzIGNvbnN1bWVyJ3NcbiAgICAvLyB1bmNvbnN1bWVkLWV2ZW50IGRlYWRsaW5lIGFuZCBmYWlsIGhlYWx0aHkgcmVwbGF5cy5cbiAgICB3aGlsZSAoYmFycmllcnMuc2l6ZSA+IDAgJiYgY2FuUmV0aXJlQWJhbmRvbmVkQmFycmllcnMoY3R4KSkge1xuICAgICAgbGV0IGxvd2VzdEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgbG93ZXN0RW50cnk6IERlbGl2ZXJ5QmFycmllckVudHJ5IHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGVudHJ5XSBvZiBiYXJyaWVycykge1xuICAgICAgICBpZiAobG93ZXN0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBpbmRleCA8IGxvd2VzdEluZGV4KSB7XG4gICAgICAgICAgbG93ZXN0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICBsb3dlc3RFbnRyeSA9IGVudHJ5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb3dlc3RFbnRyeT8ucmV0aXJlKCk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoY2hlY2ssIDApO1xuICB9O1xuICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBzYWZldHktbmV0IGRpc3BlbnNlciBtYXkgcmV0aXJlIGFiYW5kb25lZCBiYXJyaWVycyByaWdodCBub3c6XG4gKiBubyBoeWRyYXRpb24gaW4gZmxpZ2h0IGFuZCBubyBjb21taXR0ZWQgZGVsaXZlcnkgc3RpbGwgd29ya2luZyB0aHJvdWdoIGl0c1xuICogZGV0YWNoZWQgZGVmZXJyYWwuIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IFdFQUtFUiB0aGFuIHtAbGluayBpc0RlbGl2ZXJ5SWRsZX06XG4gKiB0aGUgZGlzcGVuc2VyIGlzIHdoYXQgZW1wdGllcyB0aGUgcmVnaXN0cnksIHNvIGdhdGluZyBpdCBvbiByZWdpc3RyeVxuICogZW1wdGluZXNzIHdvdWxkIGdhdGUgaXRzIG93biB3b3JrLlxuICovXG5mdW5jdGlvbiBjYW5SZXRpcmVBYmFuZG9uZWRCYXJyaWVycyhjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY3R4LnBlbmRpbmdEZWxpdmVyaWVzID09PSAwICYmICFoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeShjdHgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgc29tZSByZWdpc3RlcmVkIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBpcyBnb2luZyB0byByZWFjaCB0aGVcbiAqIHdvcmtmbG93IHdpdGhvdXQgYW55IGZ1cnRoZXIgaGVscCAoaXQgaXMgYXJtZWQgYW5kIG5vdCB0cmFuc2l0aXZlbHkgcGFya2VkXG4gKiBiZWhpbmQgYW4gdW5jbGFpbWVkIGJ1ZmZlcmVkIHBheWxvYWQg4oCUIHNlZSB7QGxpbmsgcmVzb2x2ZXNPbkl0c093bn0pIGJ1dFxuICogaGFzIG5vdCBiZWVuIGhhbmRlZCBvdmVyIHlldC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWxpdmVyeSBzdGF0ZSBgcGVuZGluZ0RlbGl2ZXJpZXNgIGNhbm5vdCBzZWUuIFRoYXQgY291bnRlclxuICogY292ZXJzIHRoZSBoeWRyYXRpb24gd2luZG93IGluc2lkZSBhIHNlcmlhbCBgcHJvbWlzZVF1ZXVlYCBzbG90IGFuZCBpc1xuICogcmVsZWFzZWQgdGhlcmUsIHdoaWxlIHRoZSBkZWxpdmVyeSdzIGByZXNvbHZlKClgIHJ1bnMgbGF0ZXIsIGZyb20gYVxuICogZGV0YWNoZWQgY29udGludWF0aW9uIGJlaGluZCB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30g4oCUIGluY2x1ZGluZyBpdHNcbiAqIG1hY3JvdGFzayB5aWVsZCB3aGVuZXZlciB0aGUgZGVsaXZlcnkgaGFkIHRvIGRlZmVyLiBSZXBsYXlpbmcgYSBiYXRjaCBvZiBOXG4gKiBwYXJhbGxlbCBzdGVwIHJlc3VsdHMgY29uc3VtZWQgaW4gb25lIGRyYWluIHdpbmRvdyBsZWF2ZXMgTi0xIG9mIHRoZW1cbiAqIHBhcmtlZCBvbiB0aGF0IHlpZWxkIHdpdGggYHBlbmRpbmdEZWxpdmVyaWVzYCBhbHJlYWR5IGF0IDAuIEFuIGlkbGUgY2hlY2tcbiAqIGFybWVkIGR1cmluZyB0aGUgc2FtZSB3aW5kb3cgKGEgcGVuZGluZyBgc2xlZXAoKWAgYXJtcyBvbmUgb24gZXZlcnkgcmVwbGF5KVxuICogY291bGQgdGhlbiBvYnNlcnZlIFwiaWRsZVwiIG1pZC1kZWZlcnJhbCBhbmQgcmFpc2UgYSBgV29ya2Zsb3dTdXNwZW5zaW9uYFxuICogQkVGT1JFIHRoZSB3b3JrZmxvdydzIG93biBjb250aW51YXRpb25zIHJhbiDigJQgYSBzdXNwZW5zaW9uIGNhcnJ5aW5nIG5vbmUgb2ZcbiAqIHRoZSBmb2xsb3ctdXAgd29yayB0aGUgYmF0Y2ggd2FzIGFib3V0IHRvIGNyZWF0ZSwgd2hpY2ggdGhlIHJ1bnRpbWVcbiAqIGR1dGlmdWxseSBzY2hlZHVsZXMgYXMgbm90aGluZywgbGVhdmluZyB0aGUgcnVuIGRvcm1hbnQgdW50aWwgYW4gdW5yZWxhdGVkXG4gKiB0aW1lciBmaXJlcyAodmVyY2VsL3dvcmtmbG93IzMxODMpLlxuICpcbiAqIERlbGl2ZXJpZXMgdGhhdCBkbyBOT1QgcmVzb2x2ZSBvbiB0aGVpciBvd24gbXVzdCBiZSBleGNsdWRlZCwgbm90IGZvclxuICogYWNjdXJhY3kgYnV0IGZvciB0ZXJtaW5hdGlvbjogYW4gdW5jbGFpbWVkIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCBpcyByZXRpcmVkXG4gKiBCWSB0aGUgaWRsZSBzYWZldHkgbmV0IGluIHtAbGluayByZWdpc3RlckRlbGl2ZXJ5QmFycmllcn0sIHNvIGNvdW50aW5nIGl0XG4gKiBoZXJlIHdvdWxkIGdhdGUgaXRzIG93biByZXRpcmVtZW50LiBTZWxmLXJlc29sdmluZyBkZWxpdmVyaWVzIGFsd2F5c1xuICogZGVsaXZlciBmcm9tIHRoZWlyIG93biBjaGFpbnMgKHNlZSB0aGUgSU5WQVJJQU5UIG9uXG4gKiB7QGxpbmsgcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXJ9KSBhbmQgbmV2ZXIgbmVlZCB0aGF0IG5ldCwgc28gd2FpdGluZyBvblxuICogdGhlbSBpcyBkZWFkbG9jay1mcmVlLlxuICovXG5mdW5jdGlvbiBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeShjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXJyaWVycyA9IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycztcbiAgaWYgKCFiYXJyaWVycyB8fCBiYXJyaWVycy5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFNoYXJlZCBhY3Jvc3MgdGhpcyBjYWxsIG9ubHkg4oCUIHNlZSBgcmVzb2x2ZXNPbkl0c093bmAuXG4gIGNvbnN0IHNlbGZSZXNvbHZpbmcgPSBuZXcgTWFwPG51bWJlciwgYm9vbGVhbj4oKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGVudHJ5XSBvZiBiYXJyaWVycykge1xuICAgIGlmIChyZXNvbHZlc09uSXRzT3duKGJhcnJpZXJzLCBpbmRleCwgZW50cnksIHNlbGZSZXNvbHZpbmcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgbm8gZGF0YSBkZWxpdmVyeSAoc3RlcCByZXN1bHQsIGhvb2sgcGF5bG9hZCkgaXMgaW4gZmxpZ2h0IHJpZ2h0IG5vdy5cbiAqXG4gKiBcIkluIGZsaWdodFwiIGlzIHR3byBkaXN0aW5jdCB3aW5kb3dzLCBlYWNoIHdpdGggaXRzIG93biBndWFyZDpcbiAqIGBwZW5kaW5nRGVsaXZlcmllcyA+IDBgIGNvdmVycyBoeWRyYXRpb24gaW5zaWRlIHRoZSBzZXJpYWwgcXVldWUgc2xvdHMsIGFuZFxuICoge0BsaW5rIGhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5fSBjb3ZlcnMgdGhlIGRldGFjaGVkIGdhcCBiZXR3ZWVuIGEgc2xvdFxuICogcmVsZWFzaW5nIHRoYXQgY291bnRlciBhbmQgdGhlIGRlbGl2ZXJ5J3MgYHJlc29sdmUoKWAgYWN0dWFsbHkgcnVubmluZyDigJRcbiAqIGRlbGliZXJhdGVseSBvdXRzaWRlIGBwZW5kaW5nRGVsaXZlcmllc2AgKHNlZSBzdGVwLnRzKSwgYW5kIGludmlzaWJsZSB0byBpdC5cbiAqXG4gKiBBbnl0aGluZyB0aGF0IGRlY2lkZXMgYSByZXBsYXkgaXMgb3Zlciwgb3IgdGhhdCBhIHJlcGxheSB3ZW50IHdyb25nLCBoYXMgdG9cbiAqIGNvbnN1bHQgdGhpcyBmaXJzdDogd2hpbGUgaXQgaXMgZmFsc2UgdGhlIHdvcmtmbG93IFZNIGlzIG1pZC1yZWFjdGlvbiwgc29cbiAqIHdoYXQgaXQgaGFzIGFuZCBoYXMgbm90IGRvbmUgeWV0IHNheXMgbm90aGluZyBhYm91dCB0aGUgcnVuLiBUd28gY2FsbGVyc1xuICogcmVhZCBpdCwgZm9yIHRoZSB0d28gc3VjaCBkZWNpc2lvbnM6IHtAbGluayBzY2hlZHVsZVdoZW5JZGxlfSBmb3IgdGhlXG4gKiBzdXNwZW5zaW9uLCBhbmQgdGhlIGV2ZW50cyBjb25zdW1lcidzIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgZm9yIGRpdmVyZ2VuY2UuXG4gKlxuICogQSBub24tZW1wdHkgYmFycmllciByZWdpc3RyeSBjb3VudHMgYXMgaW4gZmxpZ2h0LCBldmVuIHdoZW4gZXZlcnkgcmVtYWluaW5nXG4gKiBlbnRyeSBpcyBwYXJrZWQgYmVoaW5kIGFuIHVuY2xhaW1lZCBidWZmZXJlZCBwYXlsb2FkLiBUaG9zZSBlbnRyaWVzIG9ubHlcbiAqIG1vdmUgd2hlbiB0aGUgc2FmZXR5LW5ldCBkaXNwZW5zZXIgcmV0aXJlcyB0aGVtIChsb3dlc3QtZmlyc3QsIHNlZVxuICoge0BsaW5rIGVuc3VyZUJhcnJpZXJTYWZldHlOZXR9KSwgYW5kIHRoZSBkZWxpdmVyaWVzIHRoZXkgcmVsZWFzZSBhcmUgcmVhbFxuICogd29ya2Zsb3cgcmVhY3Rpb25zIOKAlCBhIHN1c3BlbnNpb24gcmFpc2VkIGJlZm9yZSB0aGV5IHJ1biB3b3VsZCBiZSBjb21wdXRlZFxuICogZnJvbSBhIFZNIHRoYXQgaGFzIG5vdCBzZWVuIHRoZW0sIHNjaGVkdWxpbmcgbm9uZSBvZiB0aGVpciBmb2xsb3ctdXAgd29ya1xuICogYW5kIGxlYXZpbmcgdGhlIHJ1biBkb3JtYW50ICh0aGUgdmVyY2VsL3dvcmtmbG93IzMxODMgc2hhcGUpLiBUaGUgZGlzcGVuc2VyXG4gKiBpdHNlbGYgaXMgZ2F0ZWQgb24ge0BsaW5rIGNhblJldGlyZUFiYW5kb25lZEJhcnJpZXJzfSwgdGhlIHdlYWtlciBwcmVkaWNhdGVcbiAqIHdpdGhvdXQgdGhlIHJlZ2lzdHJ5IHRlcm0sIHByZWNpc2VseSBzbyBpdCBjYW4gZG8gdGhlIGRyYWluaW5nIHRoYXQgdGhpc1xuICogcHJlZGljYXRlIHdhaXRzIGZvcjsgcmVnaXN0cnkgc2l6ZSBzdHJpY3RseSBkZWNyZWFzZXMgYXQgZWFjaCByZXRpcmVtZW50LFxuICogc28gaWRsZSBpcyBhbHdheXMgcmVhY2hlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVsaXZlcnlJZGxlKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzID09PSAwICYmXG4gICAgKCFjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnMgfHwgY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzLnNpemUgPT09IDApXG4gICk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYSBjYWxsYmFjayB0byBmaXJlIG9ubHkgYWZ0ZXIgYWxsIHBlbmRpbmcgZGF0YSBkZWxpdmVyaWVzXG4gKiAoc3RlcCByZXN1bHRzLCBob29rIHBheWxvYWRzKSBhbmQgYXN5bmMgZGVzZXJpYWxpemF0aW9uIGhhdmUgY29tcGxldGVkLlxuICogVXNlcyBhIHBvbGxpbmcgbG9vcDogc2V0VGltZW91dCgwKSDihpIgY2hlY2sgcGVuZGluZ0RlbGl2ZXJpZXMgYW5kIHRoZVxuICogYmFycmllciByZWdpc3RyeSDihpIgaWYgYW55dGhpbmcgaXMgc3RpbGwgaW4gZmxpZ2h0LCB3YWl0IGZvciBwcm9taXNlUXVldWUg4oaSXG4gKiByZXBlYXQuIFRoaXMgaGFuZGxlcyB0aGUgbXVsdGktcm91bmQgZGVsaXZlcnkgcGF0dGVybiB3aGVyZSBlYWNoIGhvb2tcbiAqIHBheWxvYWQgZGVsaXZlcnkgY3ljbGUgYXBwZW5kcyBuZXcgYXN5bmMgd29yayB0byB0aGUgcHJvbWlzZVF1ZXVlLiBXaGF0XG4gKiBjb3VudHMgYXMgaW4gZmxpZ2h0IGlzIHtAbGluayBpc0RlbGl2ZXJ5SWRsZX0uXG4gKlxuICogVGhlIGluaXRpYWwgYHNldFRpbWVvdXQoMClgIG1hY3JvdGFzayBpcyBsb2FkLWJlYXJpbmcgYW5kIG11c3QgTk9UIGJlXG4gKiBkb3duZ3JhZGVkIHRvIGEgbWljcm90YXNrIChgcXVldWVNaWNyb3Rhc2tgL2BQcm9taXNlLnJlc29sdmUoKS50aGVuYCkuXG4gKiBgcGVuZGluZ0RlbGl2ZXJpZXNgIG9ubHkgZ3VhcmRzIHRoZSBob3N0LXNpZGUgaHlkcmF0aW9uIHdpbmRvdzsgYmV0d2VlbiBhXG4gKiBkZWxpdmVyeSdzIGByZXNvbHZlKClgIGFuZCB0aGUgd29ya2Zsb3cgVk0gYm9keSBydW5uaW5nIGl0cyBjb250aW51YXRpb24gdG9cbiAqIHJlZ2lzdGVyIHRoZSBuZXh0IHN1YnNjcmliZXIsIGBwZW5kaW5nRGVsaXZlcmllc2AgaXMgYWxyZWFkeSAwIGV2ZW4gdGhvdWdoXG4gKiB0aGUgVk0gaXMgbWlkLXJlYWN0aW9uLiBOb2RlIGRvZXMgbm90IGd1YXJhbnRlZSBhIG1pY3JvdGFzayBzY2hlZHVsZWQgaW5cbiAqIHRoZSBob3N0IGNvbnRleHQgc2V0dGxlcyBhZnRlciB0aGUgY3Jvc3MtVk0gcHJvbWlzZSBjaGFpbiAocmVzb2x2ZSBpbiBob3N0XG4gKiDihpIgd29ya2Zsb3cgY29kZSBpbiBWTSDihpIgc3Vic2NyaWJlIGJhY2sgaW4gaG9zdCk7IHRoZSBtYWNyb3Rhc2sgYm91bmRhcnlcbiAqIGdpdmVzIHRoYXQgY2hhaW4gdGltZSB0byBydW4sIHNvIHRoZSBzdXNwZW5zaW9uIGRvZXMgbm90IHByZWVtcHQgYSBzaWJsaW5nXG4gKiBkZWxpdmVyeSBzdGlsbCBpbiBmbGlnaHQuIEVtcGlyaWNhbGx5LCByZXBsYWNpbmcgaXQgd2l0aCBgcXVldWVNaWNyb3Rhc2tgXG4gKiBicmVha3MgaG9vay9zbGVlcCBgUHJvbWlzZS5yYWNlYCBvcmRlcmluZyAoQ29ycnVwdGVkRXZlbnRMb2dFcnJvcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2hlZHVsZVdoZW5JZGxlKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZm46ICgpID0+IHZvaWRcbik6IHZvaWQge1xuICBjb25zdCBjaGVjayA9ICgpID0+IHtcbiAgICBpZiAoIWlzRGVsaXZlcnlJZGxlKGN0eCkpIHtcbiAgICAgIC8vIEEgZGVsaXZlcnkgaXMgc3RpbGwgaHlkcmF0aW5nLCBvciBpcyBjb21taXR0ZWQgYnV0IHBhcmtlZCBiZWhpbmQgaXRzXG4gICAgICAvLyBkZWZlcnJhbCAod2hvc2UgcmVzb2x2ZSBydW5zIG9uIGEgZGV0YWNoZWQgdGltZXIsIG5vdCB0aGlzIHF1ZXVlKS5cbiAgICAgIC8vIEVpdGhlciB3YXk6IGxldCB0aGUgcXVldWUgZHJhaW4sIHRoZW4gcmUtY2hlY2sgYSB0aW1lciB0aWNrIGxhdGVyLlxuICAgICAgY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChjaGVjaywgMCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm4oKTtcbiAgICB9XG4gIH07XG4gIHNldFRpbWVvdXQoY2hlY2ssIDApO1xufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"step-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/step-handler.ts"],"names":[],"mappings":"AAi6BA;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CACC,CAAC"}
1
+ {"version":3,"file":"step-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/step-handler.ts"],"names":[],"mappings":"AAk7BA;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CACC,CAAC"}