@workflow/core 5.0.0-beta.37 → 5.0.0-beta.38
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 +21 -5
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +67 -7
- package/dist/runtime/world.d.ts +10 -5
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +128 -21
- package/dist/serialization.js +2 -2
- package/dist/telemetry/semantic-conventions.d.ts +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/package.json +5 -10
- package/dist/runtime/world-target.d.ts +0 -11
- package/dist/runtime/world-target.d.ts.map +0 -1
- package/dist/runtime/world-target.js +0 -15
package/dist/private.d.ts
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* Utils used by the bundler when transforming code
|
|
3
3
|
*/
|
|
4
4
|
import type { WorldCapabilities } from '@workflow/world';
|
|
5
|
-
import type { PayloadKey } from './serialization/encryption.js';
|
|
6
5
|
import type { EventsConsumer } from './events-consumer.js';
|
|
7
6
|
import type { QueueItem } from './global.js';
|
|
8
7
|
import type { ReplayPayloadCache } from './replay-payload-cache.js';
|
|
9
8
|
import type { Serializable } from './schemas.js';
|
|
9
|
+
import type { PayloadKey } from './serialization/encryption.js';
|
|
10
10
|
export type StepFunction<Args extends Serializable[] = any[], Result extends Serializable | unknown = unknown> = ((...args: Args) => Promise<Result>) & {
|
|
11
11
|
maxRetries?: number;
|
|
12
12
|
stepId?: string;
|
|
@@ -171,6 +171,16 @@ export interface DeliveryBarrier {
|
|
|
171
171
|
* To guarantee a later delivery gated on this one can never hang when this
|
|
172
172
|
* delivery is abandoned (the workflow took a different branch or is
|
|
173
173
|
* suspending and never observes it), the barrier auto-resolves at idle.
|
|
174
|
+
*
|
|
175
|
+
* INVARIANT required of every call site: a barrier that is ever `armed` must
|
|
176
|
+
* be paired with a delivery chain that runs unconditionally — attached when
|
|
177
|
+
* the event is consumed (waits, step results, waiting-consumer hook payloads,
|
|
178
|
+
* aborts), or by the `claim()` whose invocation is what arms it (buffered
|
|
179
|
+
* hook payloads). The idle check ({@link scheduleWhenIdle}) refuses to
|
|
180
|
+
* observe idle while an armed, self-resolving barrier is undelivered, and the
|
|
181
|
+
* safety net below is itself idle-gated — so an armed barrier with no
|
|
182
|
+
* unconditional chain would livelock every idle check in the run, including
|
|
183
|
+
* its own retirement.
|
|
174
184
|
*/
|
|
175
185
|
export declare function registerDeliveryBarrier(ctx: WorkflowOrchestratorContext, eventIndex: number | undefined, kind: DeliveryKind, options?: {
|
|
176
186
|
armed?: boolean;
|
|
@@ -178,10 +188,16 @@ export declare function registerDeliveryBarrier(ctx: WorkflowOrchestratorContext
|
|
|
178
188
|
/**
|
|
179
189
|
* Schedule a callback to fire only after all pending data deliveries
|
|
180
190
|
* (step results, hook payloads) and async deserialization have completed.
|
|
181
|
-
* Uses a polling loop: setTimeout(0) → check pendingDeliveries
|
|
182
|
-
* if
|
|
183
|
-
* delivery pattern where each hook
|
|
184
|
-
* async work to the promiseQueue.
|
|
191
|
+
* Uses a polling loop: setTimeout(0) → check pendingDeliveries and the
|
|
192
|
+
* barrier registry → if anything is still in flight, wait for promiseQueue →
|
|
193
|
+
* repeat. This handles the multi-round delivery pattern where each hook
|
|
194
|
+
* payload delivery cycle appends new async work to the promiseQueue.
|
|
195
|
+
*
|
|
196
|
+
* "In flight" is two distinct windows, each with its own guard:
|
|
197
|
+
* `pendingDeliveries > 0` covers hydration inside the serial queue slots, and
|
|
198
|
+
* {@link hasParkedCommittedDelivery} covers the detached gap between a slot
|
|
199
|
+
* releasing that counter and the delivery's `resolve()` actually running —
|
|
200
|
+
* deliberately outside `pendingDeliveries` (see step.ts), and invisible to it.
|
|
185
201
|
*
|
|
186
202
|
* The initial `setTimeout(0)` macrotask is load-bearing and must NOT be
|
|
187
203
|
* downgraded to a microtask (`queueMicrotask`/`Promise.resolve().then`).
|
package/dist/private.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"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"}
|
package/dist/private.js
CHANGED
|
@@ -240,6 +240,16 @@ export async function awaitEarlierDeliveries(ctx, eventIndex, kind) {
|
|
|
240
240
|
* To guarantee a later delivery gated on this one can never hang when this
|
|
241
241
|
* delivery is abandoned (the workflow took a different branch or is
|
|
242
242
|
* suspending and never observes it), the barrier auto-resolves at idle.
|
|
243
|
+
*
|
|
244
|
+
* INVARIANT required of every call site: a barrier that is ever `armed` must
|
|
245
|
+
* be paired with a delivery chain that runs unconditionally — attached when
|
|
246
|
+
* the event is consumed (waits, step results, waiting-consumer hook payloads,
|
|
247
|
+
* aborts), or by the `claim()` whose invocation is what arms it (buffered
|
|
248
|
+
* hook payloads). The idle check ({@link scheduleWhenIdle}) refuses to
|
|
249
|
+
* observe idle while an armed, self-resolving barrier is undelivered, and the
|
|
250
|
+
* safety net below is itself idle-gated — so an armed barrier with no
|
|
251
|
+
* unconditional chain would livelock every idle check in the run, including
|
|
252
|
+
* its own retirement.
|
|
243
253
|
*/
|
|
244
254
|
export function registerDeliveryBarrier(ctx, eventIndex, kind, options = {}) {
|
|
245
255
|
const barriers = ctx.pendingDeliveryBarriers;
|
|
@@ -277,13 +287,61 @@ export function registerDeliveryBarrier(ctx, eventIndex, kind, options = {}) {
|
|
|
277
287
|
},
|
|
278
288
|
};
|
|
279
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* Whether some registered branch-deciding delivery is going to reach the
|
|
292
|
+
* workflow without any further help (it is armed and not transitively parked
|
|
293
|
+
* behind an unclaimed buffered payload — see {@link resolvesOnItsOwn}) but
|
|
294
|
+
* has not been handed over yet.
|
|
295
|
+
*
|
|
296
|
+
* This is the delivery state `pendingDeliveries` cannot see. That counter
|
|
297
|
+
* covers the hydration window inside a serial `promiseQueue` slot and is
|
|
298
|
+
* released there, while the delivery's `resolve()` runs later, from a
|
|
299
|
+
* detached continuation behind {@link awaitEarlierDeliveries} — including its
|
|
300
|
+
* macrotask yield whenever the delivery had to defer. Replaying a batch of N
|
|
301
|
+
* parallel step results consumed in one drain window leaves N-1 of them
|
|
302
|
+
* parked on that yield with `pendingDeliveries` already at 0. An idle check
|
|
303
|
+
* armed during the same window (a pending `sleep()` arms one on every replay)
|
|
304
|
+
* could then observe "idle" mid-deferral and raise a `WorkflowSuspension`
|
|
305
|
+
* BEFORE the workflow's own continuations ran — a suspension carrying none of
|
|
306
|
+
* the follow-up work the batch was about to create, which the runtime
|
|
307
|
+
* dutifully schedules as nothing, leaving the run dormant until an unrelated
|
|
308
|
+
* timer fires (vercel/workflow#3183).
|
|
309
|
+
*
|
|
310
|
+
* Deliveries that do NOT resolve on their own must be excluded, not for
|
|
311
|
+
* accuracy but for termination: an unclaimed buffered hook payload is retired
|
|
312
|
+
* BY the idle safety net in {@link registerDeliveryBarrier}, so counting it
|
|
313
|
+
* here would gate its own retirement. Self-resolving deliveries always
|
|
314
|
+
* deliver from their own chains (see the INVARIANT on
|
|
315
|
+
* {@link registerDeliveryBarrier}) and never need that net, so waiting on
|
|
316
|
+
* them is deadlock-free.
|
|
317
|
+
*/
|
|
318
|
+
function hasParkedCommittedDelivery(ctx) {
|
|
319
|
+
const barriers = ctx.pendingDeliveryBarriers;
|
|
320
|
+
if (!barriers || barriers.size === 0) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
// Shared across this call only — see `resolvesOnItsOwn`.
|
|
324
|
+
const selfResolving = new Map();
|
|
325
|
+
for (const [index, entry] of barriers) {
|
|
326
|
+
if (resolvesOnItsOwn(barriers, index, entry, selfResolving)) {
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
280
332
|
/**
|
|
281
333
|
* Schedule a callback to fire only after all pending data deliveries
|
|
282
334
|
* (step results, hook payloads) and async deserialization have completed.
|
|
283
|
-
* Uses a polling loop: setTimeout(0) → check pendingDeliveries
|
|
284
|
-
* if
|
|
285
|
-
* delivery pattern where each hook
|
|
286
|
-
* async work to the promiseQueue.
|
|
335
|
+
* Uses a polling loop: setTimeout(0) → check pendingDeliveries and the
|
|
336
|
+
* barrier registry → if anything is still in flight, wait for promiseQueue →
|
|
337
|
+
* repeat. This handles the multi-round delivery pattern where each hook
|
|
338
|
+
* payload delivery cycle appends new async work to the promiseQueue.
|
|
339
|
+
*
|
|
340
|
+
* "In flight" is two distinct windows, each with its own guard:
|
|
341
|
+
* `pendingDeliveries > 0` covers hydration inside the serial queue slots, and
|
|
342
|
+
* {@link hasParkedCommittedDelivery} covers the detached gap between a slot
|
|
343
|
+
* releasing that counter and the delivery's `resolve()` actually running —
|
|
344
|
+
* deliberately outside `pendingDeliveries` (see step.ts), and invisible to it.
|
|
287
345
|
*
|
|
288
346
|
* The initial `setTimeout(0)` macrotask is load-bearing and must NOT be
|
|
289
347
|
* downgraded to a microtask (`queueMicrotask`/`Promise.resolve().then`).
|
|
@@ -299,8 +357,10 @@ export function registerDeliveryBarrier(ctx, eventIndex, kind, options = {}) {
|
|
|
299
357
|
*/
|
|
300
358
|
export function scheduleWhenIdle(ctx, fn) {
|
|
301
359
|
const check = () => {
|
|
302
|
-
if (ctx.pendingDeliveries > 0) {
|
|
303
|
-
//
|
|
360
|
+
if (ctx.pendingDeliveries > 0 || hasParkedCommittedDelivery(ctx)) {
|
|
361
|
+
// A delivery is still hydrating, or is committed but parked behind its
|
|
362
|
+
// deferral (whose resolve runs on a detached timer, not this queue).
|
|
363
|
+
// Either way: let the queue drain, then re-check a timer tick later.
|
|
304
364
|
ctx.promiseQueue.then(() => {
|
|
305
365
|
setTimeout(check, 0);
|
|
306
366
|
});
|
|
@@ -311,4 +371,4 @@ export function scheduleWhenIdle(ctx, fn) {
|
|
|
311
371
|
};
|
|
312
372
|
setTimeout(check, 0);
|
|
313
373
|
}
|
|
314
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBZ0JoRCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV6RSxNQUFNLGFBQWEsR0FFZixVQUFVLENBQUM7QUFFZix3REFBd0Q7QUFDeEQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsS0FBSyxJQUFJLEdBQUcsRUFHbkUsQ0FBQyxDQUFDO0FBRUwsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMxQyxpQ0FBaUM7SUFDakMseUJBQXlCO0lBQ3pCLHlCQUF5QjtDQUMxQixDQUFDLENBQUM7QUFFSCxTQUFTLHdCQUF3QixDQUFDLE1BQWM7SUFDOUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUM5QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU1QyxNQUFNLFFBQVEsR0FBRyxDQUFDLGVBQXVCLEVBQUUsRUFBRTtRQUMzQyxJQUFJLGVBQWUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENB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QUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxzIHVzZWQgYnkgdGhlIGJ1bmRsZXIgd2hlbiB0cmFuc2Zvcm1pbmcgY29kZVxuICovXG5cbmltcG9ydCB7IHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBXb3JsZENhcGFiaWxpdGllcyB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRLZXkgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50c0NvbnN1bWVyIH0gZnJvbSAnLi9ldmVudHMtY29uc3VtZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZUl0ZW0gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NjaGVtYXMuanMnO1xuXG5leHBvcnQgdHlwZSBTdGVwRnVuY3Rpb248XG4gIEFyZ3MgZXh0ZW5kcyBTZXJpYWxpemFibGVbXSA9IGFueVtdLFxuICBSZXN1bHQgZXh0ZW5kcyBTZXJpYWxpemFibGUgfCB1bmtub3duID0gdW5rbm93bixcbj4gPSAoKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2U8UmVzdWx0PikgJiB7XG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIHN0ZXBJZD86IHN0cmluZztcbn07XG5cbmNvbnN0IFJlZ2lzdGVyZWRTdGVwc0tleSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9jb3JlLy9yZWdpc3RlcmVkU3RlcHMnKTtcblxuY29uc3QgZ2xvYmFsU3ltYm9sczogdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gIFtSZWdpc3RlcmVkU3RlcHNLZXldPzogTWFwPHN0cmluZywgU3RlcEZ1bmN0aW9uPjtcbn0gPSBnbG9iYWxUaGlzO1xuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogL1xuY29uc3QgcmVnaXN0ZXJlZFN0ZXBzID0gKGdsb2JhbFN5bWJvbHNbUmVnaXN0ZXJlZFN0ZXBzS2V5XSA/Pz0gbmV3IE1hcDxcbiAgc3RyaW5nLFxuICBTdGVwRnVuY3Rpb25cbj4oKSk7XG5cbmNvbnN0IEJVSUxUSU5fUkVTUE9OU0VfU1RFUF9OQU1FUyA9IG5ldyBTZXQoW1xuICAnX19idWlsdGluX3Jlc3BvbnNlX2FycmF5X2J1ZmZlcicsXG4gICdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicsXG4gICdfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dCcsXG5dKTtcblxuZnVuY3Rpb24gZ2V0U3RlcElkQWxpYXNDYW5kaWRhdGVzKHN0ZXBJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXJ0cyA9IHN0ZXBJZC5zcGxpdCgnLy8nKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyB8fCBwYXJ0c1swXSAhPT0gJ3N0ZXAnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlUGF0aCA9IHBhcnRzWzFdO1xuICBjb25zdCBmbk5hbWUgPSBwYXJ0c1syXTtcbiAgY29uc3QgbW9kdWxlUGF0aEFsaWFzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCBhZGRBbGlhcyA9IChhbGlhc01vZHVsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgIGlmIChhbGlhc01vZHVsZVBhdGggIT09IG1vZHVsZVBhdGgpIHtcbiAgICAgIG1vZHVsZVBhdGhBbGlhc2VzLmFkZChhbGlhc01vZHVsZVBhdGgpO1xuICAgIH1cbiAgfTtcblxuICBpZiAobW9kdWxlUGF0aC5zdGFydHNXaXRoKCcuL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vZXhhbXBsZS8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICAgIGFkZEFsaWFzKGAuL3NyYy8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9IGVsc2UgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi9leGFtcGxlL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi9leGFtcGxlLycubGVuZ3RoKTtcbiAgICBhZGRBbGlhcyhgLi8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICAgIGFkZEFsaWFzKGAuL3NyYy8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9IGVsc2UgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi9zcmMvd29ya2Zsb3dzLycpKSB7XG4gICAgY29uc3Qgd29ya2Zsb3dSZWxhdGl2ZVBhdGggPSBtb2R1bGVQYXRoLnNsaWNlKCcuL3NyYy8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9leGFtcGxlLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICBtb2R1bGVQYXRoQWxpYXNlcyxcbiAgICAoYWxpYXNNb2R1bGVQYXRoKSA9PiBgc3RlcC8vJHthbGlhc01vZHVsZVBhdGh9Ly8ke2ZuTmFtZX1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEJ1aWx0aW5SZXNwb25zZVN0ZXBBbGlhcyhzdGVwSWQ6IHN0cmluZyk6IFN0ZXBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmICghQlVJTFRJTl9SRVNQT05TRV9TVEVQX05BTUVTLmhhcyhzdGVwSWQpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3JlZ2lzdGVyZWRTdGVwSWQsIHN0ZXBGbl0gb2YgcmVnaXN0ZXJlZFN0ZXBzLmVudHJpZXMoKSkge1xuICAgIGlmIChyZWdpc3RlcmVkU3RlcElkLmVuZHNXaXRoKGAvLyR7c3RlcElkfWApKSB7XG4gICAgICByZXR1cm4gc3RlcEZuO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBzdGVwIGZ1bmN0aW9uIHRvIGJlIHNlcnZlZCBpbiB0aGUgc2VydmVyIGJ1bmRsZS5cbiAqIEFsc28gc2V0cyB0aGUgc3RlcElkIHByb3BlcnR5IG9uIHRoZSBmdW5jdGlvbiBmb3Igc2VyaWFsaXphdGlvbiBzdXBwb3J0LlxuICpcbiAqIE5vdGU6IFRoZSBTV0MgY29tcGlsZXIgcGx1Z2luIG5vIGxvbmdlciBnZW5lcmF0ZXMgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbi5cbiAqIFN0ZXAgcmVnaXN0cmF0aW9uIGlzIG5vdyBpbmxpbmVkIGFzIGEgc2VsZi1jb250YWluZWQgSUlGRSB0aGF0IHdyaXRlc1xuICogZGlyZWN0bHkgdG8gdGhlIGdsb2JhbCBNYXAgYXQgU3ltYm9sLmZvcihcIkB3b3JrZmxvdy9jb3JlLy9yZWdpc3RlcmVkU3RlcHNcIikuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGtlcHQgZm9yIGludGVybmFsL3Rlc3QgdXNlIG9ubHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclN0ZXBGdW5jdGlvbihzdGVwSWQ6IHN0cmluZywgc3RlcEZuOiBTdGVwRnVuY3Rpb24pIHtcbiAgcmVnaXN0ZXJlZFN0ZXBzLnNldChzdGVwSWQsIHN0ZXBGbik7XG4gIHN0ZXBGbi5zdGVwSWQgPSBzdGVwSWQ7XG59XG5cbi8qKlxuICogRmluZCBhIHJlZ2lzdGVyZWQgc3RlcCBmdW5jdGlvbiBieSBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGVwRnVuY3Rpb24oc3RlcElkOiBzdHJpbmcpOiBTdGVwRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBkaXJlY3RNYXRjaCA9IHJlZ2lzdGVyZWRTdGVwcy5nZXQoc3RlcElkKTtcbiAgaWYgKGRpcmVjdE1hdGNoKSB7XG4gICAgcmV0dXJuIGRpcmVjdE1hdGNoO1xuICB9XG5cbiAgLy8gU3VwcG9ydCBlcXVpdmFsZW50IHdvcmtmbG93IHBhdGggYWxpYXNlcyBpbiBtaXhlZCBzeW1saW5rIGVudmlyb25tZW50cy5cbiAgZm9yIChjb25zdCBhbGlhc1N0ZXBJZCBvZiBnZXRTdGVwSWRBbGlhc0NhbmRpZGF0ZXMoc3RlcElkKSkge1xuICAgIGNvbnN0IGFsaWFzTWF0Y2ggPSByZWdpc3RlcmVkU3RlcHMuZ2V0KGFsaWFzU3RlcElkKTtcbiAgICBpZiAoYWxpYXNNYXRjaCkge1xuICAgICAgcmV0dXJuIGFsaWFzTWF0Y2g7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYnVpbHRpbkFsaWFzTWF0Y2ggPSBnZXRCdWlsdGluUmVzcG9uc2VTdGVwQWxpYXMoc3RlcElkKTtcbiAgaWYgKGJ1aWx0aW5BbGlhc01hdGNoKSB7XG4gICAgcmV0dXJuIGJ1aWx0aW5BbGlhc01hdGNoO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLy8gTm90ZTogX19wcml2YXRlX2dldENsb3N1cmVWYXJzIGlzIG5vIGxvbmdlciByZS1leHBvcnRlZCBoZXJlLlxuLy8gVGhlIFNXQyBjb21waWxlciBwbHVnaW4gbm93IGlubGluZXMgY2xvc3VyZSB2YXJpYWJsZSBhY2Nlc3MgYXMgYVxuLy8gc2VsZi1jb250YWluZWQgSUlGRSB0aGF0IHJlYWRzIGRpcmVjdGx5IGZyb20gdGhlIGdsb2JhbCBBc3luY0xvY2FsU3RvcmFnZVxuLy8gYXQgU3ltYm9sLmZvcihcIldPUktGTE9XX1NURVBfQ09OVEVYVF9TVE9SQUdFXCIpLlxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gIHdvcmxkQ2FwYWJpbGl0aWVzPzogV29ybGRDYXBhYmlsaXRpZXM7XG4gIGdsb2JhbFRoaXM6IHR5cGVvZiBnbG9iYWxUaGlzO1xuICBldmVudHNDb25zdW1lcjogRXZlbnRzQ29uc3VtZXI7XG4gIC8qKlxuICAgKiBNYXAgb2YgcGVuZGluZyBpbnZvY2F0aW9ucyBrZXllZCBieSBjb3JyZWxhdGlvbklkLlxuICAgKiBVc2luZyBNYXAgaW5zdGVhZCBvZiBBcnJheSBmb3IgTygxKSBsb29rdXAvZGVsZXRlIG9wZXJhdGlvbnMuXG4gICAqL1xuICBpbnZvY2F0aW9uc1F1ZXVlOiBNYXA8c3RyaW5nLCBRdWV1ZUl0ZW0+O1xuICBvbldvcmtmbG93RXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIGdlbmVyYXRlVWxpZDogKCkgPT4gc3RyaW5nO1xuICBnZW5lcmF0ZU5hbm9pZDogKCkgPT4gc3RyaW5nO1xuICAvKipcbiAgICogU2VxdWVudGlhbCBwcm9taXNlIHF1ZXVlIHRoYXQgZW5zdXJlcyBhbGwgZXZlbnQtZHJpdmVuIHByb21pc2UgcmVzb2x1dGlvbnNcbiAgICogKHN0ZXAgcmVzdWx0cywgaG9vayBwYXlsb2FkcywgZmFpbHVyZXMsIHN1c3BlbnNpb25zKSBoYXBwZW4gaW4gZXZlbnQgbG9nXG4gICAqIG9yZGVyLiBFdmVyeSByZXNvbHZlLCByZWplY3QsIG9yIHdvcmtmbG93IGVycm9yIGlzIGNoYWluZWQgdGhyb3VnaCB0aGlzXG4gICAqIHF1ZXVlIHNvIHRoYXQgZXZlbiBpZiBpbmRpdmlkdWFsIG9wZXJhdGlvbnMgdGFrZSB2YXJpYWJsZSB0aW1lIChlLmcuLFxuICAgKiBhc3luYyBkZWNyeXB0aW9uKSwgcHJvbWlzZXMgcmVzb2x2ZSBkZXRlcm1pbmlzdGljYWxseS5cbiAgICovXG4gIHByb21pc2VRdWV1ZTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIENvdW50ZXIgb2YgaW4tZmxpZ2h0IGFzeW5jIGRhdGEgZGVsaXZlcnkgb3BlcmF0aW9ucyAoc3RlcCByZXN1bHRcbiAgICogaHlkcmF0aW9uLCBob29rIHBheWxvYWQgaHlkcmF0aW9uLCBhYm9ydCBzaWduYWwgaHlkcmF0aW9uKS4gU3VzcGVuc2lvbnNcbiAgICogbXVzdCB3YWl0IGZvciB0aGlzIHRvIHJlYWNoIDAgYmVmb3JlIGZpcmluZywgdG8gYXZvaWQgcHJlZW1wdGluZyBkYXRhXG4gICAqIGRlbGl2ZXJ5IOKAlCBlLmcuIGRlaHlkcmF0aW5nIGEgc3RlcCdzIGFyZ3VtZW50cyB3aGlsZSBhbiBhYm9ydCB0aGF0IHNob3VsZFxuICAgKiBiZSByZWZsZWN0ZWQgaW4gdGhvc2UgYXJndW1lbnRzIGlzIHN0aWxsIGh5ZHJhdGluZyBpdHMgcmVhc29uLlxuICAgKi9cbiAgcGVuZGluZ0RlbGl2ZXJpZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIE9yZGVyZWQgcmVnaXN0cnkgb2YgaW4tZmxpZ2h0IFwiYnJhbmNoLWRlY2lkaW5nXCIgZGVsaXZlcmllcyDigJQgdGhlXG4gICAqIHJlc29sdXRpb25zIGEgd29ya2Zsb3cgdHlwaWNhbGx5IGBQcm9taXNlLnJhY2VgcyBvbiwgb3IgYXdhaXRzIGZyb21cbiAgICogaW5kZXBlbmRlbnQgY29uY3VycmVudCBicmFuY2hlczogaG9vayBwYXlsb2FkcyAoYGhvb2tfcmVjZWl2ZWRgKSwgd2FpdFxuICAgKiBjb21wbGV0aW9ucyAoYHdhaXRfY29tcGxldGVkYCksIGFuZCBzdGVwIHJlc3VsdHMgKGBzdGVwX2NvbXBsZXRlZGAgL1xuICAgKiBgc3RlcF9mYWlsZWRgKS4gS2V5ZWQgYnkgdGhlIGRlbGl2ZXJ5J3MgcG9zaXRpb24gKGluZGV4KSBpbiB0aGUgY29uc3VtZWRcbiAgICogZXZlbnQgbG9nLlxuICAgKlxuICAgKiBUaGUgcHJvYmxlbTogZWFjaCBvZiB0aGVzZSByZXNvbHV0aW9ucyByZWFjaGVzIHdvcmtmbG93IGNvZGUgYWZ0ZXIgYVxuICAgKiBkaWZmZXJlbnQsIHdvcmtsb2FkLWRlcGVuZGVudCBudW1iZXIgb2YgbWljcm90YXNrIGhvcHMuIEEgYnVmZmVyZWQgaG9va1xuICAgKiBwYXlsb2FkIGlzIG9ic2VydmVkIHZpYSB0aGUgYXN5bmMgaG9vayBpdGVyYXRvciAoYHlpZWxkIGF3YWl0IHRoaXNgKSxcbiAgICogY29zdGluZyBleHRyYSBob3BzOyBhIGB3YWl0X2NvbXBsZXRlZGAgcmVzb2x2ZXMgd2l0aCBmZXdlciwgYW5kIGEgcmV1c2VkXG4gICAqIHNsZWVwIGNhbiByZXNvbHZlIGluIGFuIGVudGlyZWx5IGVhcmxpZXIgbG9vcCBpdGVyYXRpb247IGEgc3RlcCByZXN1bHQgaXNcbiAgICogZ2F0ZWQgb24gaHlkcmF0aW9uIHdob3NlIGNvc3QgdmFyaWVzIGJldHdlZW4gcmVwbGF5cyBvZiB0aGUgU0FNRVxuICAgKiBpbnZvY2F0aW9uIOKAlCB0aGUgZmlyc3QgcmVwbGF5IHBheXMgdGhlIGZ1bGwgZGVjcnlwdC9kZWNvbXByZXNzL3Jldml2ZSxcbiAgICogd2hpbGUgbGF0ZXIgcmVwbGF5cyBzaGFyaW5nIHRoZSBpbnZvY2F0aW9uJ3MgYFJlcGxheVBheWxvYWRDYWNoZWBcbiAgICogbWVtby1oaXQgc21hbGwgcHJpbWl0aXZlIHJlc3VsdHMgYW5kIHJlc29sdmUgaW4gb25lIG9yIHR3byBob3BzLiBFaXRoZXJcbiAgICogd2F5LCB0aGUgcmVzb2x1dGlvbiB0aGF0IHRoZSBjb21taXR0ZWQgZXZlbnQgbG9nIG9yZGVyZWQgZmlyc3QgY2FuIGxvc2UgYVxuICAgKiBgUHJvbWlzZS5yYWNlYCAob3IgYSBgdXNlU3RlcGAgVUxJRCBhbGxvY2F0aW9uKSB0byBhIGZhc3Rlci0gb3JcbiAgICogYWxyZWFkeS1yZXNvbHZlZCBjb21wZXRpdG9yLCBkaXZlcmdpbmcgZnJvbSB0aGUgbG9nIGFuZCBzdXJmYWNpbmcgYXNcbiAgICogYENvcnJ1cHRlZEV2ZW50TG9nRXJyb3JgLlxuICAgKlxuICAgKiBUaGUgZml4IGlzIGEgc3RyaWN0LCBkZXRlcm1pbmlzdGljIGRlbGl2ZXJ5IG9yZGVyIGFuY2hvcmVkIG9uXG4gICAqIGV2ZW50LWxvZyBwb3NpdGlvbjogYSBkZWxpdmVyeSBkb2VzIG5vdCByZXNvbHZlIHRvIHRoZSB3b3JrZmxvdyB1bnRpbFxuICAgKiBldmVyeSByZWxldmFudCBlYXJsaWVyLWluLWxvZyBkZWxpdmVyeSBoYXMgYmVlbiBkZWxpdmVyZWQuIEJlY2F1c2UgdGhlXG4gICAqIGdhdGUgaXMgXCJ0aGUgZWFybGllciBkZWxpdmVyeSByZXNvbHZlZFwiLCBub3QgXCJ3b24gYSB0aW1pbmcgcmFjZVwiLCB0aGVcbiAgICogb3V0Y29tZSBpcyBpbmRlcGVuZGVudCBvZiBtaWNyb3Rhc2sgaG9wcywgaHlkcmF0aW9uL2RlY3J5cHRpb24gdGltZSxcbiAgICogYW5kIGBQcm9taXNlLnJhY2VgIGFyZ3VtZW50IG9yZGVyLiBXaGljaCBlYXJsaWVyIGtpbmRzIGEgZGVsaXZlcnkgZGVmZXJzXG4gICAqIGJlaGluZCBpcyBzcGVsbGVkIG91dCBvbiB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30uXG4gICAqXG4gICAqIEluZGV4IGlzIHVzZWQgcmF0aGVyIHRoYW4gdGhlIGBldmVudElkYCBzdHJpbmcgYmVjYXVzZSBgZXZlbnRJZGAgaXMgYW5cbiAgICogb3BhcXVlLCB3b3JsZC1hc3NpZ25lZCB2YWx1ZSBub3QgZ3VhcmFudGVlZCB0byBzb3J0IGluIGNyZWF0aW9uIG9yZGVyXG4gICAqIChvbmx5IHRoZSBidW5kbGVkIFVMSUQgd29ybGRzIGhhcHBlbiB0bykuXG4gICAqXG4gICAqIE9wdGlvbmFsIHNvIG9sZGVyL291dC1vZi10cmVlIGNvbnRleHRzIChhbmQgbGlnaHR3ZWlnaHQgdGVzdCBoYXJuZXNzZXMpXG4gICAqIHRoYXQgZG8gbm90IGluaXRpYWxpemUgaXQgZGVncmFkZSBncmFjZWZ1bGx5IHRvIHRoZSBwcmV2aW91cyBiZWhhdmlvci5cbiAgICovXG4gIHBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzPzogTWFwPG51bWJlciwgRGVsaXZlcnlCYXJyaWVyRW50cnk+O1xuICAvKipcbiAgICogSW52b2NhdGlvbi1zY29wZWQgY2FjaGUgb2YgcHJlcGFyZWQgc2VyaWFsaXplZCBwYXlsb2FkcyBhbmQgaW1tdXRhYmxlIGZpbmFsXG4gICAqIHZhbHVlcy4gUHJlcGFyZWQgYnl0ZXMgc3Vydml2ZSBmcmVzaCByZXBsYXkgVk1zOyBvYmplY3QgZ3JhcGhzIGRvIG5vdC5cbiAgICovXG4gIHJlcGxheVBheWxvYWRDYWNoZTogUmVwbGF5UGF5bG9hZENhY2hlO1xufVxuXG4vKiogVGhlIGtpbmQgb2YgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5IGEgYmFycmllciByZXByZXNlbnRzLiAqL1xuZXhwb3J0IHR5cGUgRGVsaXZlcnlLaW5kID0gJ2hvb2snIHwgJ3dhaXQnIHwgJ3N0ZXAnO1xuXG5pbnRlcmZhY2UgRGVsaXZlcnlCYXJyaWVyRW50cnkge1xuICBraW5kOiBEZWxpdmVyeUtpbmQ7XG4gIC8qKiBSZXNvbHZlcyBvbmNlIHRoaXMgZGVsaXZlcnkgaGFzIHJlc29sdmVkIHRvIHRoZSB3b3JrZmxvdy4gKi9cbiAgZGVsaXZlcmVkOiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGRlbGl2ZXJ5IGlzIGNvbW1pdHRlZCB0byByZWFjaGluZyB0aGUgd29ya2Zsb3cgd2l0aG91dCBhbnlcbiAgICogZnVydGhlciBhY3Rpb24gYnkgd29ya2Zsb3cgY29kZS4gVHJ1ZSBmb3Igd2FpdCBjb21wbGV0aW9ucyBhbmQgc3RlcFxuICAgKiByZXN1bHRzLCB3aGljaCBhbHdheXMgcmVzb2x2ZSBmcm9tIHRoZWlyIG93biBjaGFpbiwgYW5kIGZvciBhIGhvb2sgcGF5bG9hZFxuICAgKiB0aGF0IGFscmVhZHkgaGFkIGEgd2FpdGluZyBjb25zdW1lciB3aGVuIGl0IHdhcyBjb25zdW1lZC5cbiAgICpcbiAgICogRmFsc2UgZm9yIGEgQlVGRkVSRUQgaG9vayBwYXlsb2FkIG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkIHlldDogaXQgaXNcbiAgICogZGVsaXZlcmVkIGJ5IGBjbGFpbSgpYCwgaS5lLiB3aGVuZXZlciB0aGUgd29ya2Zsb3cgbmV4dCByZWFkcyB0aGUgaG9vayDigJRcbiAgICogd2hpY2ggbWF5IGJlIGNhdXNhbGx5ICphZnRlciogYSBsYXRlci1pbi1sb2cgZGVsaXZlcnkuIGBhcm0oKWAgZmxpcHMgaXRcbiAgICogb25jZSBhIGNvbnN1bWVyIHRha2VzIHRoZSBwYXlsb2FkLlxuICAgKi9cbiAgYXJtZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogV2hpY2ggZWFybGllciBraW5kcyBlYWNoIGRlbGl2ZXJ5IGtpbmQgZGVmZXJzIGJlaGluZC4gQ2hvc2VuIHNvIHRoYXQgbm8ga2luZFxuICogYmxvY2tzIG9uIGEgcGVlciBpdCBkb2VzIG5vdCBuZWVkIHRvOlxuICpcbiAqICAtIGEgaG9vayBkZWZlcnMgYmVoaW5kIGVhcmxpZXIgV0FJVFMgYW5kIFNURVBTIOKAlCBub3QgZWFybGllciBob29rcywgd2hpY2hcbiAqICAgIGFyZSBzZXF1ZW50aWFsIHNhbWUtZW50aXR5IHBheWxvYWRzIGFuZCBtdXN0IG5vdCBibG9jayBvbmUgYW5vdGhlcjtcbiAqICAtIGEgd2FpdCBkZWZlcnMgYmVoaW5kIGVhcmxpZXIgSE9PS1MgYW5kIFNURVBTIOKAlCBub3QgZWFybGllciB3YWl0cywgc2luY2UgYVxuICogICAgd2FpdCBuZXZlciBuZWVkcyB0byBxdWV1ZSBiZWhpbmQgYW5vdGhlciB3YWl0O1xuICogIC0gYSBzdGVwIGRlZmVycyBiZWhpbmQgZWFybGllciBXQUlUUywgSE9PS1MgYW5kIFNURVBTLlxuICpcbiAqIFRoZSBzdGVwLWJlaGluZC1zdGVwIGVkZ2UgaXMgbm90IHJlZHVuZGFudCB3aXRoIHRoZSBzZXJpYWwgYHByb21pc2VRdWV1ZWAuXG4gKiBUaGUgcXVldWUgZml4ZXMgdGhlIG9yZGVyIGluIHdoaWNoIHN0ZXAgcmVzdWx0cyBhcmUgSFlEUkFURUQsIGJ1dCBhIHN0ZXAgbm9cbiAqIGxvbmdlciByZXNvbHZlcyBpbnNpZGUgaXRzIHF1ZXVlIHNsb3Qg4oCUIGl0IGNhcHR1cmVzIHRoZSBvdXRjb21lIHRoZXJlIGFuZFxuICogcmVzb2x2ZXMgZnJvbSBhIGRldGFjaGVkIGNvbnRpbnVhdGlvbiBvbmNlIGl0cyBiYXJyaWVyIGNsZWFycy4gVHdvIHN0ZXBzXG4gKiBhZ3JlZSBvbiB0aGF0IGNvbnRpbnVhdGlvbidzIG9yZGVyaW5nIG9ubHkgd2hpbGUgdGhleSBkZWZlciBiZWhpbmQgdGhlIHNhbWVcbiAqIHNldCwgd2hpY2ggaG9sZHMgd2hlbiB0aGV5IGFyZSBjb25zdW1lZCBpbiB0aGUgc2FtZSBkcmFpbiB3aW5kb3cgYnV0IG5vdFxuICogYWNyb3NzIHdpbmRvd3M6IGEgc3RlcCBjb25zdW1lZCBsYXRlciBjYW4gbWlzcyBhIHdhaXQvaG9vayBiYXJyaWVyIHRoYXQgYW5cbiAqIGVhcmxpZXIgc3RlcCBpcyBzdGlsbCBwYXJrZWQgb24sIGJlY2F1c2UgdGhlIGJhcnJpZXIgcmV0aXJlZCBpbiBiZXR3ZWVuLiBUaGVcbiAqIGVhcmxpZXIgc3RlcCBpcyB0aGVuIHdhaXRpbmcgb3V0IHRoZSBtYWNyb3Rhc2sgeWllbGQgYmVsb3cgd2hpbGUgdGhlIGxhdGVyXG4gKiBvbmUgcmVzb2x2ZXMgb24gbWljcm90YXNrcywgYW5kIG92ZXJ0YWtlcyBpdCDigJQgc2VlXG4gKiBgZGVsaXZlcnktYmFycmllci1jb3ZlcmFnZS50ZXN0LnRzYC4gRGVmZXJyaW5nIGJlaGluZCBlYXJsaWVyIHN0ZXBzXG4gKiBjbG9zZXMgdGhhdCB3aW5kb3cgc3RydWN0dXJhbGx5OiB0aGUgZWFybGllciBzdGVwJ3MgYmFycmllciBpcyBzdGlsbFxuICogcmVnaXN0ZXJlZCBwcmVjaXNlbHkgYmVjYXVzZSBpdCBoYXMgbm90IGRlbGl2ZXJlZCB5ZXQuXG4gKlxuICogRXZlcnkgZWRnZSBwb2ludHMgZnJvbSBhIGxhdGVyIGxvZyBpbmRleCB0byBhIHN0cmljdGx5IGVhcmxpZXIgb25lLCBzbyB0aGVcbiAqIHdhaXQtZm9yIGdyYXBoIGNhbiBuZXZlciBjb250YWluIGEgY3ljbGUuXG4gKi9cbmNvbnN0IERFRkVSX0JFSElORDogUmVjb3JkPERlbGl2ZXJ5S2luZCwgcmVhZG9ubHkgRGVsaXZlcnlLaW5kW10+ID0ge1xuICBob29rOiBbJ3dhaXQnLCAnc3RlcCddLFxuICB3YWl0OiBbJ2hvb2snLCAnc3RlcCddLFxuICBzdGVwOiBbJ3dhaXQnLCAnaG9vaycsICdzdGVwJ10sXG59O1xuXG4vKipcbiAqIFdoZXRoZXIgYGVudHJ5YCB3aWxsIHJlc29sdmUgb24gaXRzIG93biDigJQgaXQgaXMgYXJtZWQsIGFuZCBldmVyeSBlYXJsaWVyXG4gKiBkZWxpdmVyeSBpdCBkZWZlcnMgYmVoaW5kIHdpbGwgbGlrZXdpc2UgcmVzb2x2ZSBvbiBpdHMgb3duLlxuICpcbiAqIEEgc3RlcCBkZWxpdmVyeSBpcyBhbHdheXMgc2VsZi1yZXNvbHZpbmc6IGl0IHNraXBzIHVuY29tbWl0dGVkIGRlbGl2ZXJpZXNcbiAqIChzZWUge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9KSwgYW5kIHRoZSBlYXJsaWVyIHN0ZXBzIGl0IGRvZXMgZGVmZXJcbiAqIGJlaGluZCBhcmUgc2VsZi1yZXNvbHZpbmcgYnkgdGhlIHNhbWUgYXJndW1lbnQsIGluZHVjdGluZyBkb3duIG9uIGluZGV4LlxuICpcbiAqIFJlY3Vyc2lvbiB0ZXJtaW5hdGVzIGJlY2F1c2UgZXZlcnkgZWRnZSBwb2ludHMgdG8gYSBzdHJpY3RseSBzbWFsbGVyIGluZGV4LlxuICogYG1lbW9gIGlzIHJlcXVpcmVkIHJhdGhlciB0aGFuIGFuIG9wdGltaXphdGlvbjogd2l0aG91dCBpdCB0aGUgd2FsayBpc1xuICogZXhwb25lbnRpYWwgaW4gdGhlIG51bWJlciBvZiBsaXZlIGhvb2svd2FpdCBiYXJyaWVycyAoZWFjaCBhcm1lZCBlbnRyeVxuICogcmUtd2Fsa3MgZXZlcnkgZWFybGllciBlbnRyeSBvZiB0aGUgb3Bwb3NpdGUga2luZCwgVChuKSA9IM6jIFQoaikpLCBhbmQgdGhlXG4gKiByZWdpc3RyeSBpcyBub3Qgc21hbGwgYnkgY29uc3RydWN0aW9uIOKAlCBgRXZlbnRzQ29uc3VtZXJgIGRyYWluc1xuICogY29uc2VjdXRpdmVseSBjb25zdW1hYmxlIGV2ZW50cyBzeW5jaHJvbm91c2x5IHdoaWxlIGJhcnJpZXJzIG9ubHkgcmV0aXJlIG9uXG4gKiBtaWNyb3Rhc2stZHJpdmVuIGRlbGl2ZXJpZXMsIHNvIGEgZmFuLW91dCBvZiBgUHJvbWlzZS5yYWNlKFtob29rLCBzbGVlcF0pYFxuICogYnJhbmNoZXMgYWNjdW11bGF0ZXMgb25lIGJhcnJpZXIgcGVyIGJyYW5jaCBwZXIga2luZC4gTWVtb2l6ZWQsIHRoZSB3YWxrIGlzXG4gKiBsaW5lYXIgaW4gcmVnaXN0cnkgc2l6ZS4gVGhlIG1lbW8gTVVTVCBiZSBwZXItY2FsbDogYGFybWVkYCBtdXRhdGVzIGJldHdlZW5cbiAqIGNhbGxzIGFzIGJ1ZmZlcmVkIHBheWxvYWRzIGFyZSBjbGFpbWVkLlxuICovXG5mdW5jdGlvbiByZXNvbHZlc09uSXRzT3duKFxuICBiYXJyaWVyczogTWFwPG51bWJlciwgRGVsaXZlcnlCYXJyaWVyRW50cnk+LFxuICBpbmRleDogbnVtYmVyLFxuICBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnksXG4gIG1lbW86IE1hcDxudW1iZXIsIGJvb2xlYW4+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgY2FjaGVkID0gbWVtby5nZXQoaW5kZXgpO1xuICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVSZXNvbHZlc09uSXRzT3duKGJhcnJpZXJzLCBpbmRleCwgZW50cnksIG1lbW8pO1xuICBtZW1vLnNldChpbmRleCwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVJlc29sdmVzT25JdHNPd24oXG4gIGJhcnJpZXJzOiBNYXA8bnVtYmVyLCBEZWxpdmVyeUJhcnJpZXJFbnRyeT4sXG4gIGluZGV4OiBudW1iZXIsXG4gIGVudHJ5OiBEZWxpdmVyeUJhcnJpZXJFbnRyeSxcbiAgbWVtbzogTWFwPG51bWJlciwgYm9vbGVhbj5cbik6IGJvb2xlYW4ge1xuICBpZiAoIWVudHJ5LmFybWVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBkZWZlckJlaGluZCA9IERFRkVSX0JFSElORFtlbnRyeS5raW5kXTtcbiAgZm9yIChjb25zdCBbb3RoZXJJbmRleCwgb3RoZXJdIG9mIGJhcnJpZXJzKSB7XG4gICAgaWYgKFxuICAgICAgb3RoZXJJbmRleCA8IGluZGV4ICYmXG4gICAgICBkZWZlckJlaGluZC5pbmNsdWRlcyhvdGhlci5raW5kKSAmJlxuICAgICAgIXJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIG90aGVySW5kZXgsIG90aGVyLCBtZW1vKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBd2FpdHMsIGluIHN0cmljdCBldmVudC1sb2cgb3JkZXIsIGV2ZXJ5IHN0aWxsLXJlZ2lzdGVyZWQgZGVsaXZlcnkgdGhhdCBpc1xuICogZWFybGllciBpbiB0aGUgbG9nIHRoYW4gYGV2ZW50SW5kZXhgIGFuZCB0aGF0IGEgZGVsaXZlcnkgb2YgYGtpbmRgIGRlZmVyc1xuICogYmVoaW5kIChzZWUge0BsaW5rIERFRkVSX0JFSElORH0pLCBzbyB0aGF0IHRoaXMgcmVzb2x1dGlvbiBpcyBoYW5kZWQgdG8gdGhlXG4gKiB3b3JrZmxvdyBvbmx5IGFmdGVyIGFsbCByZWxldmFudCBlYXJsaWVyLWluLWxvZyBkZWxpdmVyaWVzIGhhdmUgYmVlbi4gVGhpc1xuICogaXMgd2hhdCBrZWVwcyBhIGBQcm9taXNlLnJhY2VgIOKAlCBvciB0aGUgVUxJRCBhIGZvbGxvdy11cCBgdXNlU3RlcGAgZHJhd3Mgb25cbiAqIGEgY29uY3VycmVudCBicmFuY2gg4oCUIGRldGVybWluaXN0aWMgYW5kIGFsaWduZWQgd2l0aCB0aGUgY29tbWl0dGVkIGV2ZW50XG4gKiBsb2csIGluZGVwZW5kZW50IG9mIG1pY3JvdGFzay1ob3AgY291bnRzLCBoeWRyYXRpb24gdGltZSwgb3IgcmFjZS1hcmd1bWVudFxuICogb3JkZXIuIFdoZW4gdGhpcyBkZWxpdmVyeSBkb2VzIGhhdmUgdG8gd2FpdCwgaXQgYWxzbyB5aWVsZHMgYSBtYWNyb3Rhc2tcbiAqIGFmdGVyd2FyZHMgc28gdGhlIGVhcmxpZXIgZGVsaXZlcnkncyBjb25zdW1lciBjYW4gcnVuIHRvIGl0cyBvd24gbmV4dFxuICogc3VzcGVuc2lvbiBwb2ludCBmaXJzdDsgc2VlIHRoZSBjb21tZW50IGF0IHRoYXQgYGF3YWl0YCBmb3Igd2h5IG9yZGVyaW5nIHRoZVxuICogYHJlc29sdmUoKWAgY2FsbHMgYWxvbmUgaXMgbm90IGVub3VnaC5cbiAqXG4gKiBPbmUgYXN5bW1ldHJ5OiBhIFNURVAgcmVzdWx0IGFkZGl0aW9uYWxseSBza2lwcyBhbnkgZWFybGllciBkZWxpdmVyeSB0aGF0XG4gKiB3aWxsIG5vdCByZXNvbHZlIG9uIGl0cyBvd24sIGkuZS4gb25lIGJsb2NrZWQgKGRpcmVjdGx5IG9yIHRyYW5zaXRpdmVseSkgb25cbiAqIGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkIG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkLiBTdWNoIGEgcGF5bG9hZCBpcyBkZWxpdmVyZWRcbiAqIG9ubHkgd2hlbiB0aGUgd29ya2Zsb3cgbmV4dCByZWFkcyB0aGUgaG9vaywgYW5kIHJlYWNoaW5nIHRoYXQgcmVhZCB2ZXJ5XG4gKiBjb21tb25seSByZXF1aXJlcyB0aGUgc3RlcCByZXN1bHQgaXRzZWxmIChgYXdhaXQgc3RlcFgoKWAgYmVmb3JlIHRoZSByZWFkKS5cbiAqIEdhdGluZyB0aGUgc3RlcCBvbiBpdCB3b3VsZCBzdGFsbCB0aGUgd29ya2Zsb3cgdW50aWwgdGhlIGJhcnJpZXIncyBpZGxlXG4gKiBzYWZldHkgbmV0IGZpcmVzLCB3aGljaCB0aGVuIHJlbGVhc2VzIGV2ZXJ5IGRlbGl2ZXJ5IHF1ZXVlZCBiZWhpbmQgdGhhdFxuICogcGF5bG9hZCBhdCBvbmNlIOKAlCBsb3NpbmcgZXhhY3RseSB0aGUgcmFjZSB0aGlzIG9yZGVyaW5nIGV4aXN0cyB0byBwcm90ZWN0LlxuICogV2FpdHMgYW5kIGhvb2tzIGtlZXAgZ2F0aW5nIG9uIHVuY2xhaW1lZCBwYXlsb2FkczogZm9yIHRoZW0sIHdhaXRpbmcgZm9yIHRoZVxuICogY2xhaW0gSVMgdGhlIG9yZGVyaW5nIGd1YXJhbnRlZSAoYSBgd2FpdF9jb21wbGV0ZWRgIG11c3Qgbm90IHByZWVtcHQgYVxuICogcGF5bG9hZCB0aGUgbG9nIG9yZGVyZWQgZmlyc3QpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRFYXJsaWVyRGVsaXZlcmllcyhcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGV2ZW50SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAga2luZDogRGVsaXZlcnlLaW5kXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gRGVmZW5zaXZlOiB0b2xlcmF0ZSBjb250ZXh0cyB0aGF0IHByZWRhdGUgdGhpcyBmaWVsZCAodGVzdCBoYXJuZXNzZXMpLlxuICBpZiAoXG4gICAgZXZlbnRJbmRleCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgIWN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycyB8fFxuICAgIGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycy5zaXplID09PSAwXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBiYXJyaWVycyA9IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycztcbiAgY29uc3QgZGVmZXJCZWhpbmQgPSBERUZFUl9CRUhJTkRba2luZF07XG4gIGNvbnN0IGVhcmxpZXI6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAvLyBTaGFyZWQgYWNyb3NzIHRoaXMgY2FsbCBvbmx5IOKAlCBzZWUgYHJlc29sdmVzT25JdHNPd25gLlxuICBjb25zdCBzZWxmUmVzb2x2aW5nID0gbmV3IE1hcDxudW1iZXIsIGJvb2xlYW4+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgYmFycmllcnMpIHtcbiAgICBpZiAoaW5kZXggPj0gZXZlbnRJbmRleCB8fCAhZGVmZXJCZWhpbmQuaW5jbHVkZXMoZW50cnkua2luZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBraW5kID09PSAnc3RlcCcgJiZcbiAgICAgICFyZXNvbHZlc09uSXRzT3duKGJhcnJpZXJzLCBpbmRleCwgZW50cnksIHNlbGZSZXNvbHZpbmcpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZWFybGllci5wdXNoKGVudHJ5LmRlbGl2ZXJlZCk7XG4gIH1cbiAgaWYgKGVhcmxpZXIubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGVhcmxpZXIpO1xuICAgIC8vIEFuIGVhcmxpZXIgZGVsaXZlcnkgYmVpbmcgXCJkZWxpdmVyZWRcIiBvbmx5IG1lYW5zIGl0cyBgcmVzb2x2ZSgpYCByYW4uXG4gICAgLy8gVGhlIGJyYW5jaCBpdCB3b2tlIG1heSBuZWVkIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZnVydGhlciBtaWNyb3Rhc2tcbiAgICAvLyBob3BzIGJlZm9yZSBpdCByZWFjaGVzIGl0cyBuZXh0IGB1c2VTdGVwYCBjYWxsIGFuZCBkcmF3cyBhIFVMSUQg4oCUIGFcbiAgICAvLyBgZm9yIGF3YWl0YCBvdmVyIGEgaG9vaywgZm9yIGluc3RhbmNlLCByZXN1bWVzIHRoZSBnZW5lcmF0b3IsIHNldHRsZXNcbiAgICAvLyB0aGUgcHJvbWlzZSBmcm9tIGBuZXh0KClgLCBhbmQgb25seSB0aGVuIHJ1bnMgdGhlIGxvb3AgYm9keS4gUmVzb2x2aW5nXG4gICAgLy8gdGhpcyBkZWxpdmVyeSBvbiBhIG1pY3JvdGFzayB3b3VsZCBsZXQgaXQgb3ZlcnRha2UgdGhhdCBicmFuY2ggYW5kXG4gICAgLy8gcmVvcmRlciB0aGUgVUxJRCBhbGxvY2F0aW9uIGFueXdheSwgdHVybmluZyB0aGUgZ3VhcmFudGVlIGJlbG93IGludG8gYVxuICAgIC8vIGhvcC1jb3VudCByYWNlIHRoYXQgaG9sZHMgb25seSBmb3IgdGhlIHNob3J0ZXN0IGNvbnN1bWVycy5cbiAgICAvL1xuICAgIC8vIFlpZWxkaW5nIGEgbWFjcm90YXNrIGxldHMgdGhlIGVhcmxpZXIgYnJhbmNoJ3MgZW50aXJlIG1pY3JvdGFzayBjaGFpblxuICAgIC8vIGRyYWluIGZpcnN0LCB3aGF0ZXZlciBpdHMgbGVuZ3RoLCBzbyBsb2cgb3JkZXIgc3Vydml2ZXMgcmVnYXJkbGVzcyBvZlxuICAgIC8vIGhvdyB0aGUgd29ya2Zsb3cgY29uc3VtZXMgdGhlIGVhcmxpZXIgZGVsaXZlcnkuIE9ubHkgZGVsaXZlcmllcyB0aGF0XG4gICAgLy8gYWN0dWFsbHkgaGFkIHRvIGRlZmVyIHBheSB0aGlzLCBzbyB0aGUgY29tbW9uIHNpbmdsZS1kZWxpdmVyeSBkcmFpbiBpc1xuICAgIC8vIHVuYWZmZWN0ZWQuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICB9XG59XG5cbi8qKiBIYW5kbGUgZm9yIGEgcmVnaXN0ZXJlZCBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYmFycmllci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsaXZlcnlCYXJyaWVyIHtcbiAgLyoqXG4gICAqIE1hcmsgdGhpcyBkZWxpdmVyeSBhcyBkZWxpdmVyZWQgdG8gdGhlIHdvcmtmbG93LiBSZXNvbHZlcyBpdHNcbiAgICogYGRlbGl2ZXJlZGAgcHJvbWlzZSBzbyBhbnkgbGF0ZXItaW4tbG9nIGRlbGl2ZXJ5IGdhdGVkIG9uIGl0ICh2aWFcbiAgICoge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9KSBtYXkgcHJvY2VlZCwgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGVcbiAgICogcmVnaXN0cnkuIElkZW1wb3RlbnQuXG4gICAqL1xuICBtYXJrRGVsaXZlcmVkOiAoKSA9PiB2b2lkO1xuICAvKipcbiAgICogTWFyayB0aGlzIGRlbGl2ZXJ5IGFzIGNvbW1pdHRlZCB0byBoYXBwZW5pbmcsIGZvciBhIGJhcnJpZXIgcmVnaXN0ZXJlZFxuICAgKiB1bmFybWVkIChhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCkgb25jZSBhIGNvbnN1bWVyIGhhcyBjbGFpbWVkIGl0LiBGcm9tXG4gICAqIHRoZW4gb24gYSBsYXRlciBzdGVwIHJlc3VsdCBtYXkgYmUgb3JkZXJlZCBiZWhpbmQgaXQuIElkZW1wb3RlbnQuXG4gICAqL1xuICBhcm06ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYXQgaXRzIGV2ZW50LWxvZyBpbmRleCBzbyB0aGF0IGxhdGVyXG4gKiBkZWxpdmVyaWVzIGNhbiBiZSBvcmRlcmVkIHN0cmljdGx5IGFmdGVyIGl0LiBSZXR1cm5zIGFuIGluZXJ0IGhhbmRsZSB3aGVuXG4gKiBgcGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgIGlzIG5vdCBpbml0aWFsaXplZC5cbiAqXG4gKiBQYXNzIGBhcm1lZDogZmFsc2VgIGZvciBhIGRlbGl2ZXJ5IHdob3NlIHJlc29sdXRpb24gd2FpdHMgb24gd29ya2Zsb3cgY29kZVxuICogYXNraW5nIGZvciBpdCAoYSBidWZmZXJlZCBob29rIHBheWxvYWQpOyBjYWxsIGBhcm0oKWAgd2hlbiBpdCBkb2VzLlxuICpcbiAqIFRvIGd1YXJhbnRlZSBhIGxhdGVyIGRlbGl2ZXJ5IGdhdGVkIG9uIHRoaXMgb25lIGNhbiBuZXZlciBoYW5nIHdoZW4gdGhpc1xuICogZGVsaXZlcnkgaXMgYWJhbmRvbmVkICh0aGUgd29ya2Zsb3cgdG9vayBhIGRpZmZlcmVudCBicmFuY2ggb3IgaXNcbiAqIHN1c3BlbmRpbmcgYW5kIG5ldmVyIG9ic2VydmVzIGl0KSwgdGhlIGJhcnJpZXIgYXV0by1yZXNvbHZlcyBhdCBpZGxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBldmVudEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGtpbmQ6IERlbGl2ZXJ5S2luZCxcbiAgb3B0aW9uczogeyBhcm1lZD86IGJvb2xlYW4gfSA9IHt9XG4pOiBEZWxpdmVyeUJhcnJpZXIge1xuICBjb25zdCBiYXJyaWVycyA9IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycztcbiAgaWYgKCFiYXJyaWVycyB8fCBldmVudEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBtYXJrRGVsaXZlcmVkOiAoKSA9PiB7fSwgYXJtOiAoKSA9PiB7fSB9O1xuICB9XG5cbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlIH0gPSB3aXRoUmVzb2x2ZXJzPHZvaWQ+KCk7XG4gIGNvbnN0IGVudHJ5OiBEZWxpdmVyeUJhcnJpZXJFbnRyeSA9IHtcbiAgICBraW5kLFxuICAgIGRlbGl2ZXJlZDogcHJvbWlzZSxcbiAgICBhcm1lZDogb3B0aW9ucy5hcm1lZCA/PyB0cnVlLFxuICB9O1xuICBiYXJyaWVycy5zZXQoZXZlbnRJbmRleCwgZW50cnkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpID0+IHtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkb25lID0gdHJ1ZTtcbiAgICBpZiAoYmFycmllcnMuZ2V0KGV2ZW50SW5kZXgpID09PSBlbnRyeSkge1xuICAgICAgYmFycmllcnMuZGVsZXRlKGV2ZW50SW5kZXgpO1xuICAgIH1cbiAgICByZXNvbHZlKCk7XG4gIH07XG5cbiAgLy8gU2FmZXR5IG5ldDogaWYgdGhpcyBkZWxpdmVyeSBpcyBuZXZlciBkZWxpdmVyZWQgdG8gdGhlIHdvcmtmbG93IChpdHNcbiAgLy8gYnJhbmNoIHdhcyBub3QgdGFrZW4gLyB0aGUgcnVuIGlzIHN1c3BlbmRpbmcsIG9yIGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkXG4gIC8vIGlzIG9ubHkgY2xhaW1lZCBhZnRlciBhIGxhdGVyIGRlbGl2ZXJ5IHRoZSB3b3JrZmxvdyBpcyBzdGlsbCB3YWl0aW5nIG9uKSxcbiAgLy8gcmVzb2x2ZSBhdCBpZGxlIHNvIGEgbGF0ZXIgZGVsaXZlcnkgZ2F0ZWQgb24gaXQgY2Fubm90IGRlYWRsb2NrIGFuZCB0aGVcbiAgLy8gcmVnaXN0cnkgY2Fubm90IGxlYWsgYW4gZW50cnkgcGVyIGFiYW5kb25lZCBkZWxpdmVyeS5cbiAgc2NoZWR1bGVXaGVuSWRsZShjdHgsIGZpbmlzaCk7XG5cbiAgcmV0dXJuIHtcbiAgICBtYXJrRGVsaXZlcmVkOiBmaW5pc2gsXG4gICAgYXJtOiAoKSA9PiB7XG4gICAgICBlbnRyeS5hcm1lZCA9IHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGZpcmUgb25seSBhZnRlciBhbGwgcGVuZGluZyBkYXRhIGRlbGl2ZXJpZXNcbiAqIChzdGVwIHJlc3VsdHMsIGhvb2sgcGF5bG9hZHMpIGFuZCBhc3luYyBkZXNlcmlhbGl6YXRpb24gaGF2ZSBjb21wbGV0ZWQuXG4gKiBVc2VzIGEgcG9sbGluZyBsb29wOiBzZXRUaW1lb3V0KDApIOKGkiBjaGVjayBwZW5kaW5nRGVsaXZlcmllcyDihpJcbiAqIGlmID4gMCwgd2FpdCBmb3IgcHJvbWlzZVF1ZXVlIOKGkiByZXBlYXQuIFRoaXMgaGFuZGxlcyB0aGUgbXVsdGktcm91bmRcbiAqIGRlbGl2ZXJ5IHBhdHRlcm4gd2hlcmUgZWFjaCBob29rIHBheWxvYWQgZGVsaXZlcnkgY3ljbGUgYXBwZW5kcyBuZXdcbiAqIGFzeW5jIHdvcmsgdG8gdGhlIHByb21pc2VRdWV1ZS5cbiAqXG4gKiBUaGUgaW5pdGlhbCBgc2V0VGltZW91dCgwKWAgbWFjcm90YXNrIGlzIGxvYWQtYmVhcmluZyBhbmQgbXVzdCBOT1QgYmVcbiAqIGRvd25ncmFkZWQgdG8gYSBtaWNyb3Rhc2sgKGBxdWV1ZU1pY3JvdGFza2AvYFByb21pc2UucmVzb2x2ZSgpLnRoZW5gKS5cbiAqIGBwZW5kaW5nRGVsaXZlcmllc2Agb25seSBndWFyZHMgdGhlIGhvc3Qtc2lkZSBoeWRyYXRpb24gd2luZG93OyBiZXR3ZWVuIGFcbiAqIGRlbGl2ZXJ5J3MgYHJlc29sdmUoKWAgYW5kIHRoZSB3b3JrZmxvdyBWTSBib2R5IHJ1bm5pbmcgaXRzIGNvbnRpbnVhdGlvbiB0b1xuICogcmVnaXN0ZXIgdGhlIG5leHQgc3Vic2NyaWJlciwgYHBlbmRpbmdEZWxpdmVyaWVzYCBpcyBhbHJlYWR5IDAgZXZlbiB0aG91Z2hcbiAqIHRoZSBWTSBpcyBtaWQtcmVhY3Rpb24uIE5vZGUgZG9lcyBub3QgZ3VhcmFudGVlIGEgbWljcm90YXNrIHNjaGVkdWxlZCBpblxuICogdGhlIGhvc3QgY29udGV4dCBzZXR0bGVzIGFmdGVyIHRoZSBjcm9zcy1WTSBwcm9taXNlIGNoYWluIChyZXNvbHZlIGluIGhvc3RcbiAqIOKGkiB3b3JrZmxvdyBjb2RlIGluIFZNIOKGkiBzdWJzY3JpYmUgYmFjayBpbiBob3N0KTsgdGhlIG1hY3JvdGFzayBib3VuZGFyeVxuICogZ2l2ZXMgdGhhdCBjaGFpbiB0aW1lIHRvIHJ1biwgc28gdGhlIHN1c3BlbnNpb24gZG9lcyBub3QgcHJlZW1wdCBhIHNpYmxpbmdcbiAqIGRlbGl2ZXJ5IHN0aWxsIGluIGZsaWdodC4gRW1waXJpY2FsbHksIHJlcGxhY2luZyBpdCB3aXRoIGBxdWV1ZU1pY3JvdGFza2BcbiAqIGJyZWFrcyBob29rL3NsZWVwIGBQcm9taXNlLnJhY2VgIG9yZGVyaW5nIChDb3JydXB0ZWRFdmVudExvZ0Vycm9yKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlV2hlbklkbGUoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBmbjogKCkgPT4gdm9pZFxuKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrID0gKCkgPT4ge1xuICAgIGlmIChjdHgucGVuZGluZ0RlbGl2ZXJpZXMgPiAwKSB7XG4gICAgICAvLyBTdGlsbCBkZWxpdmVyaW5nIGRhdGEg4oCUIHdhaXQgZm9yIHF1ZXVlIHRvIGRyYWluLCB0aGVuIHJlLWNoZWNrXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbigpO1xuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dChjaGVjaywgMCk7XG59XG4iXX0=
|
|
374
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBZ0JoRCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV6RSxNQUFNLGFBQWEsR0FFZixVQUFVLENBQUM7QUFFZix3REFBd0Q7QUFDeEQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsS0FBSyxJQUFJLEdBQUcsRUFHbkUsQ0FBQyxDQUFDO0FBRUwsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMxQyxpQ0FBaUM7SUFDakMseUJBQXlCO0lBQ3pCLHlCQUF5QjtDQUMxQixDQUFDLENBQUM7QUFFSCxTQUFTLHdCQUF3QixDQUFDLE1BQWM7SUFDOUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUM5QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU1QyxNQUFNLFFBQVEsR0FBRyxDQUFDLGVBQXVCLEVBQUUsRUFBRTtRQUMzQyxJQUFJLGVBQWUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENB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QUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDNUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixHQUFnQyxFQUNoQyxFQUFjO0lBRWQsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFO1FBQ2pCLElBQUksR0FBRyxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pFLHVFQUF1RTtZQUN2RSxxRUFBcUU7WUFDckUscUVBQXFFO1lBQ3JFLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDekIsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sRUFBRSxFQUFFLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlscyB1c2VkIGJ5IHRoZSBidW5kbGVyIHdoZW4gdHJhbnNmb3JtaW5nIGNvZGVcbiAqL1xuXG5pbXBvcnQgeyB3aXRoUmVzb2x2ZXJzIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB0eXBlIHsgV29ybGRDYXBhYmlsaXRpZXMgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHR5cGUgeyBFdmVudHNDb25zdW1lciB9IGZyb20gJy4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB0eXBlIHsgUXVldWVJdGVtIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXBsYXlQYXlsb2FkQ2FjaGUgfSBmcm9tICcuL3JlcGxheS1wYXlsb2FkLWNhY2hlLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi9zY2hlbWFzLmpzJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZEtleSB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFxuICBBcmdzIGV4dGVuZHMgU2VyaWFsaXphYmxlW10gPSBhbnlbXSxcbiAgUmVzdWx0IGV4dGVuZHMgU2VyaWFsaXphYmxlIHwgdW5rbm93biA9IHVua25vd24sXG4+ID0gKCguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPFJlc3VsdD4pICYge1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICBzdGVwSWQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBSZWdpc3RlcmVkU3RlcHNLZXkgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvY29yZS8vcmVnaXN0ZXJlZFN0ZXBzJyk7XG5cbmNvbnN0IGdsb2JhbFN5bWJvbHM6IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbUmVnaXN0ZXJlZFN0ZXBzS2V5XT86IE1hcDxzdHJpbmcsIFN0ZXBGdW5jdGlvbj47XG59ID0gZ2xvYmFsVGhpcztcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IC9cbmNvbnN0IHJlZ2lzdGVyZWRTdGVwcyA9IChnbG9iYWxTeW1ib2xzW1JlZ2lzdGVyZWRTdGVwc0tleV0gPz89IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAgU3RlcEZ1bmN0aW9uXG4+KCkpO1xuXG5jb25zdCBCVUlMVElOX1JFU1BPTlNFX1NURVBfTkFNRVMgPSBuZXcgU2V0KFtcbiAgJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX2pzb24nLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX3RleHQnLFxuXSk7XG5cbmZ1bmN0aW9uIGdldFN0ZXBJZEFsaWFzQ2FuZGlkYXRlcyhzdGVwSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGFydHMgPSBzdGVwSWQuc3BsaXQoJy8vJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09ICdzdGVwJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZVBhdGggPSBwYXJ0c1sxXTtcbiAgY29uc3QgZm5OYW1lID0gcGFydHNbMl07XG4gIGNvbnN0IG1vZHVsZVBhdGhBbGlhc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgYWRkQWxpYXMgPSAoYWxpYXNNb2R1bGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoYWxpYXNNb2R1bGVQYXRoICE9PSBtb2R1bGVQYXRoKSB7XG4gICAgICBtb2R1bGVQYXRoQWxpYXNlcy5hZGQoYWxpYXNNb2R1bGVQYXRoKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuL2V4YW1wbGUvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vZXhhbXBsZS93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vZXhhbXBsZS8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vc3JjL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi9zcmMvJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gICAgYWRkQWxpYXMoYC4vZXhhbXBsZS8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbW9kdWxlUGF0aEFsaWFzZXMsXG4gICAgKGFsaWFzTW9kdWxlUGF0aCkgPT4gYHN0ZXAvLyR7YWxpYXNNb2R1bGVQYXRofS8vJHtmbk5hbWV9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRCdWlsdGluUmVzcG9uc2VTdGVwQWxpYXMoc3RlcElkOiBzdHJpbmcpOiBTdGVwRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICBpZiAoIUJVSUxUSU5fUkVTUE9OU0VfU1RFUF9OQU1FUy5oYXMoc3RlcElkKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtyZWdpc3RlcmVkU3RlcElkLCBzdGVwRm5dIG9mIHJlZ2lzdGVyZWRTdGVwcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAocmVnaXN0ZXJlZFN0ZXBJZC5lbmRzV2l0aChgLy8ke3N0ZXBJZH1gKSkge1xuICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgc3RlcCBmdW5jdGlvbiB0byBiZSBzZXJ2ZWQgaW4gdGhlIHNlcnZlciBidW5kbGUuXG4gKiBBbHNvIHNldHMgdGhlIHN0ZXBJZCBwcm9wZXJ0eSBvbiB0aGUgZnVuY3Rpb24gZm9yIHNlcmlhbGl6YXRpb24gc3VwcG9ydC5cbiAqXG4gKiBOb3RlOiBUaGUgU1dDIGNvbXBpbGVyIHBsdWdpbiBubyBsb25nZXIgZ2VuZXJhdGVzIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uXG4gKiBTdGVwIHJlZ2lzdHJhdGlvbiBpcyBub3cgaW5saW5lZCBhcyBhIHNlbGYtY29udGFpbmVkIElJRkUgdGhhdCB3cml0ZXNcbiAqIGRpcmVjdGx5IHRvIHRoZSBnbG9iYWwgTWFwIGF0IFN5bWJvbC5mb3IoXCJAd29ya2Zsb3cvY29yZS8vcmVnaXN0ZXJlZFN0ZXBzXCIpLlxuICogVGhpcyBmdW5jdGlvbiBpcyBrZXB0IGZvciBpbnRlcm5hbC90ZXN0IHVzZSBvbmx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdGVwRnVuY3Rpb24oc3RlcElkOiBzdHJpbmcsIHN0ZXBGbjogU3RlcEZ1bmN0aW9uKSB7XG4gIHJlZ2lzdGVyZWRTdGVwcy5zZXQoc3RlcElkLCBzdGVwRm4pO1xuICBzdGVwRm4uc3RlcElkID0gc3RlcElkO1xufVxuXG4vKipcbiAqIEZpbmQgYSByZWdpc3RlcmVkIHN0ZXAgZnVuY3Rpb24gYnkgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBJZDogc3RyaW5nKTogU3RlcEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGlyZWN0TWF0Y2ggPSByZWdpc3RlcmVkU3RlcHMuZ2V0KHN0ZXBJZCk7XG4gIGlmIChkaXJlY3RNYXRjaCkge1xuICAgIHJldHVybiBkaXJlY3RNYXRjaDtcbiAgfVxuXG4gIC8vIFN1cHBvcnQgZXF1aXZhbGVudCB3b3JrZmxvdyBwYXRoIGFsaWFzZXMgaW4gbWl4ZWQgc3ltbGluayBlbnZpcm9ubWVudHMuXG4gIGZvciAoY29uc3QgYWxpYXNTdGVwSWQgb2YgZ2V0U3RlcElkQWxpYXNDYW5kaWRhdGVzKHN0ZXBJZCkpIHtcbiAgICBjb25zdCBhbGlhc01hdGNoID0gcmVnaXN0ZXJlZFN0ZXBzLmdldChhbGlhc1N0ZXBJZCk7XG4gICAgaWYgKGFsaWFzTWF0Y2gpIHtcbiAgICAgIHJldHVybiBhbGlhc01hdGNoO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJ1aWx0aW5BbGlhc01hdGNoID0gZ2V0QnVpbHRpblJlc3BvbnNlU3RlcEFsaWFzKHN0ZXBJZCk7XG4gIGlmIChidWlsdGluQWxpYXNNYXRjaCkge1xuICAgIHJldHVybiBidWlsdGluQWxpYXNNYXRjaDtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIE5vdGU6IF9fcHJpdmF0ZV9nZXRDbG9zdXJlVmFycyBpcyBubyBsb25nZXIgcmUtZXhwb3J0ZWQgaGVyZS5cbi8vIFRoZSBTV0MgY29tcGlsZXIgcGx1Z2luIG5vdyBpbmxpbmVzIGNsb3N1cmUgdmFyaWFibGUgYWNjZXNzIGFzIGFcbi8vIHNlbGYtY29udGFpbmVkIElJRkUgdGhhdCByZWFkcyBkaXJlY3RseSBmcm9tIHRoZSBnbG9iYWwgQXN5bmNMb2NhbFN0b3JhZ2Vcbi8vIGF0IFN5bWJvbC5mb3IoXCJXT1JLRkxPV19TVEVQX0NPTlRFWFRfU1RPUkFHRVwiKS5cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQge1xuICBydW5JZDogc3RyaW5nO1xuICBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xuICB3b3JsZENhcGFiaWxpdGllcz86IFdvcmxkQ2FwYWJpbGl0aWVzO1xuICBnbG9iYWxUaGlzOiB0eXBlb2YgZ2xvYmFsVGhpcztcbiAgZXZlbnRzQ29uc3VtZXI6IEV2ZW50c0NvbnN1bWVyO1xuICAvKipcbiAgICogTWFwIG9mIHBlbmRpbmcgaW52b2NhdGlvbnMga2V5ZWQgYnkgY29ycmVsYXRpb25JZC5cbiAgICogVXNpbmcgTWFwIGluc3RlYWQgb2YgQXJyYXkgZm9yIE8oMSkgbG9va3VwL2RlbGV0ZSBvcGVyYXRpb25zLlxuICAgKi9cbiAgaW52b2NhdGlvbnNRdWV1ZTogTWFwPHN0cmluZywgUXVldWVJdGVtPjtcbiAgb25Xb3JrZmxvd0Vycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICBnZW5lcmF0ZVVsaWQ6ICgpID0+IHN0cmluZztcbiAgZ2VuZXJhdGVOYW5vaWQ6ICgpID0+IHN0cmluZztcbiAgLyoqXG4gICAqIFNlcXVlbnRpYWwgcHJvbWlzZSBxdWV1ZSB0aGF0IGVuc3VyZXMgYWxsIGV2ZW50LWRyaXZlbiBwcm9taXNlIHJlc29sdXRpb25zXG4gICAqIChzdGVwIHJlc3VsdHMsIGhvb2sgcGF5bG9hZHMsIGZhaWx1cmVzLCBzdXNwZW5zaW9ucykgaGFwcGVuIGluIGV2ZW50IGxvZ1xuICAgKiBvcmRlci4gRXZlcnkgcmVzb2x2ZSwgcmVqZWN0LCBvciB3b3JrZmxvdyBlcnJvciBpcyBjaGFpbmVkIHRocm91Z2ggdGhpc1xuICAgKiBxdWV1ZSBzbyB0aGF0IGV2ZW4gaWYgaW5kaXZpZHVhbCBvcGVyYXRpb25zIHRha2UgdmFyaWFibGUgdGltZSAoZS5nLixcbiAgICogYXN5bmMgZGVjcnlwdGlvbiksIHByb21pc2VzIHJlc29sdmUgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gICAqL1xuICBwcm9taXNlUXVldWU6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBDb3VudGVyIG9mIGluLWZsaWdodCBhc3luYyBkYXRhIGRlbGl2ZXJ5IG9wZXJhdGlvbnMgKHN0ZXAgcmVzdWx0XG4gICAqIGh5ZHJhdGlvbiwgaG9vayBwYXlsb2FkIGh5ZHJhdGlvbiwgYWJvcnQgc2lnbmFsIGh5ZHJhdGlvbikuIFN1c3BlbnNpb25zXG4gICAqIG11c3Qgd2FpdCBmb3IgdGhpcyB0byByZWFjaCAwIGJlZm9yZSBmaXJpbmcsIHRvIGF2b2lkIHByZWVtcHRpbmcgZGF0YVxuICAgKiBkZWxpdmVyeSDigJQgZS5nLiBkZWh5ZHJhdGluZyBhIHN0ZXAncyBhcmd1bWVudHMgd2hpbGUgYW4gYWJvcnQgdGhhdCBzaG91bGRcbiAgICogYmUgcmVmbGVjdGVkIGluIHRob3NlIGFyZ3VtZW50cyBpcyBzdGlsbCBoeWRyYXRpbmcgaXRzIHJlYXNvbi5cbiAgICovXG4gIHBlbmRpbmdEZWxpdmVyaWVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcmRlcmVkIHJlZ2lzdHJ5IG9mIGluLWZsaWdodCBcImJyYW5jaC1kZWNpZGluZ1wiIGRlbGl2ZXJpZXMg4oCUIHRoZVxuICAgKiByZXNvbHV0aW9ucyBhIHdvcmtmbG93IHR5cGljYWxseSBgUHJvbWlzZS5yYWNlYHMgb24sIG9yIGF3YWl0cyBmcm9tXG4gICAqIGluZGVwZW5kZW50IGNvbmN1cnJlbnQgYnJhbmNoZXM6IGhvb2sgcGF5bG9hZHMgKGBob29rX3JlY2VpdmVkYCksIHdhaXRcbiAgICogY29tcGxldGlvbnMgKGB3YWl0X2NvbXBsZXRlZGApLCBhbmQgc3RlcCByZXN1bHRzIChgc3RlcF9jb21wbGV0ZWRgIC9cbiAgICogYHN0ZXBfZmFpbGVkYCkuIEtleWVkIGJ5IHRoZSBkZWxpdmVyeSdzIHBvc2l0aW9uIChpbmRleCkgaW4gdGhlIGNvbnN1bWVkXG4gICAqIGV2ZW50IGxvZy5cbiAgICpcbiAgICogVGhlIHByb2JsZW06IGVhY2ggb2YgdGhlc2UgcmVzb2x1dGlvbnMgcmVhY2hlcyB3b3JrZmxvdyBjb2RlIGFmdGVyIGFcbiAgICogZGlmZmVyZW50LCB3b3JrbG9hZC1kZXBlbmRlbnQgbnVtYmVyIG9mIG1pY3JvdGFzayBob3BzLiBBIGJ1ZmZlcmVkIGhvb2tcbiAgICogcGF5bG9hZCBpcyBvYnNlcnZlZCB2aWEgdGhlIGFzeW5jIGhvb2sgaXRlcmF0b3IgKGB5aWVsZCBhd2FpdCB0aGlzYCksXG4gICAqIGNvc3RpbmcgZXh0cmEgaG9wczsgYSBgd2FpdF9jb21wbGV0ZWRgIHJlc29sdmVzIHdpdGggZmV3ZXIsIGFuZCBhIHJldXNlZFxuICAgKiBzbGVlcCBjYW4gcmVzb2x2ZSBpbiBhbiBlbnRpcmVseSBlYXJsaWVyIGxvb3AgaXRlcmF0aW9uOyBhIHN0ZXAgcmVzdWx0IGlzXG4gICAqIGdhdGVkIG9uIGh5ZHJhdGlvbiB3aG9zZSBjb3N0IHZhcmllcyBiZXR3ZWVuIHJlcGxheXMgb2YgdGhlIFNBTUVcbiAgICogaW52b2NhdGlvbiDigJQgdGhlIGZpcnN0IHJlcGxheSBwYXlzIHRoZSBmdWxsIGRlY3J5cHQvZGVjb21wcmVzcy9yZXZpdmUsXG4gICAqIHdoaWxlIGxhdGVyIHJlcGxheXMgc2hhcmluZyB0aGUgaW52b2NhdGlvbidzIGBSZXBsYXlQYXlsb2FkQ2FjaGVgXG4gICAqIG1lbW8taGl0IHNtYWxsIHByaW1pdGl2ZSByZXN1bHRzIGFuZCByZXNvbHZlIGluIG9uZSBvciB0d28gaG9wcy4gRWl0aGVyXG4gICAqIHdheSwgdGhlIHJlc29sdXRpb24gdGhhdCB0aGUgY29tbWl0dGVkIGV2ZW50IGxvZyBvcmRlcmVkIGZpcnN0IGNhbiBsb3NlIGFcbiAgICogYFByb21pc2UucmFjZWAgKG9yIGEgYHVzZVN0ZXBgIFVMSUQgYWxsb2NhdGlvbikgdG8gYSBmYXN0ZXItIG9yXG4gICAqIGFscmVhZHktcmVzb2x2ZWQgY29tcGV0aXRvciwgZGl2ZXJnaW5nIGZyb20gdGhlIGxvZyBhbmQgc3VyZmFjaW5nIGFzXG4gICAqIGBDb3JydXB0ZWRFdmVudExvZ0Vycm9yYC5cbiAgICpcbiAgICogVGhlIGZpeCBpcyBhIHN0cmljdCwgZGV0ZXJtaW5pc3RpYyBkZWxpdmVyeSBvcmRlciBhbmNob3JlZCBvblxuICAgKiBldmVudC1sb2cgcG9zaXRpb246IGEgZGVsaXZlcnkgZG9lcyBub3QgcmVzb2x2ZSB0byB0aGUgd29ya2Zsb3cgdW50aWxcbiAgICogZXZlcnkgcmVsZXZhbnQgZWFybGllci1pbi1sb2cgZGVsaXZlcnkgaGFzIGJlZW4gZGVsaXZlcmVkLiBCZWNhdXNlIHRoZVxuICAgKiBnYXRlIGlzIFwidGhlIGVhcmxpZXIgZGVsaXZlcnkgcmVzb2x2ZWRcIiwgbm90IFwid29uIGEgdGltaW5nIHJhY2VcIiwgdGhlXG4gICAqIG91dGNvbWUgaXMgaW5kZXBlbmRlbnQgb2YgbWljcm90YXNrIGhvcHMsIGh5ZHJhdGlvbi9kZWNyeXB0aW9uIHRpbWUsXG4gICAqIGFuZCBgUHJvbWlzZS5yYWNlYCBhcmd1bWVudCBvcmRlci4gV2hpY2ggZWFybGllciBraW5kcyBhIGRlbGl2ZXJ5IGRlZmVyc1xuICAgKiBiZWhpbmQgaXMgc3BlbGxlZCBvdXQgb24ge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9LlxuICAgKlxuICAgKiBJbmRleCBpcyB1c2VkIHJhdGhlciB0aGFuIHRoZSBgZXZlbnRJZGAgc3RyaW5nIGJlY2F1c2UgYGV2ZW50SWRgIGlzIGFuXG4gICAqIG9wYXF1ZSwgd29ybGQtYXNzaWduZWQgdmFsdWUgbm90IGd1YXJhbnRlZWQgdG8gc29ydCBpbiBjcmVhdGlvbiBvcmRlclxuICAgKiAob25seSB0aGUgYnVuZGxlZCBVTElEIHdvcmxkcyBoYXBwZW4gdG8pLlxuICAgKlxuICAgKiBPcHRpb25hbCBzbyBvbGRlci9vdXQtb2YtdHJlZSBjb250ZXh0cyAoYW5kIGxpZ2h0d2VpZ2h0IHRlc3QgaGFybmVzc2VzKVxuICAgKiB0aGF0IGRvIG5vdCBpbml0aWFsaXplIGl0IGRlZ3JhZGUgZ3JhY2VmdWxseSB0byB0aGUgcHJldmlvdXMgYmVoYXZpb3IuXG4gICAqL1xuICBwZW5kaW5nRGVsaXZlcnlCYXJyaWVycz86IE1hcDxudW1iZXIsIERlbGl2ZXJ5QmFycmllckVudHJ5PjtcbiAgLyoqXG4gICAqIEludm9jYXRpb24tc2NvcGVkIGNhY2hlIG9mIHByZXBhcmVkIHNlcmlhbGl6ZWQgcGF5bG9hZHMgYW5kIGltbXV0YWJsZSBmaW5hbFxuICAgKiB2YWx1ZXMuIFByZXBhcmVkIGJ5dGVzIHN1cnZpdmUgZnJlc2ggcmVwbGF5IFZNczsgb2JqZWN0IGdyYXBocyBkbyBub3QuXG4gICAqL1xuICByZXBsYXlQYXlsb2FkQ2FjaGU6IFJlcGxheVBheWxvYWRDYWNoZTtcbn1cblxuLyoqIFRoZSBraW5kIG9mIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBhIGJhcnJpZXIgcmVwcmVzZW50cy4gKi9cbmV4cG9ydCB0eXBlIERlbGl2ZXJ5S2luZCA9ICdob29rJyB8ICd3YWl0JyB8ICdzdGVwJztcblxuaW50ZXJmYWNlIERlbGl2ZXJ5QmFycmllckVudHJ5IHtcbiAga2luZDogRGVsaXZlcnlLaW5kO1xuICAvKiogUmVzb2x2ZXMgb25jZSB0aGlzIGRlbGl2ZXJ5IGhhcyByZXNvbHZlZCB0byB0aGUgd29ya2Zsb3cuICovXG4gIGRlbGl2ZXJlZDogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBkZWxpdmVyeSBpcyBjb21taXR0ZWQgdG8gcmVhY2hpbmcgdGhlIHdvcmtmbG93IHdpdGhvdXQgYW55XG4gICAqIGZ1cnRoZXIgYWN0aW9uIGJ5IHdvcmtmbG93IGNvZGUuIFRydWUgZm9yIHdhaXQgY29tcGxldGlvbnMgYW5kIHN0ZXBcbiAgICogcmVzdWx0cywgd2hpY2ggYWx3YXlzIHJlc29sdmUgZnJvbSB0aGVpciBvd24gY2hhaW4sIGFuZCBmb3IgYSBob29rIHBheWxvYWRcbiAgICogdGhhdCBhbHJlYWR5IGhhZCBhIHdhaXRpbmcgY29uc3VtZXIgd2hlbiBpdCB3YXMgY29uc3VtZWQuXG4gICAqXG4gICAqIEZhbHNlIGZvciBhIEJVRkZFUkVEIGhvb2sgcGF5bG9hZCBubyBjb25zdW1lciBoYXMgY2xhaW1lZCB5ZXQ6IGl0IGlzXG4gICAqIGRlbGl2ZXJlZCBieSBgY2xhaW0oKWAsIGkuZS4gd2hlbmV2ZXIgdGhlIHdvcmtmbG93IG5leHQgcmVhZHMgdGhlIGhvb2sg4oCUXG4gICAqIHdoaWNoIG1heSBiZSBjYXVzYWxseSAqYWZ0ZXIqIGEgbGF0ZXItaW4tbG9nIGRlbGl2ZXJ5LiBgYXJtKClgIGZsaXBzIGl0XG4gICAqIG9uY2UgYSBjb25zdW1lciB0YWtlcyB0aGUgcGF5bG9hZC5cbiAgICovXG4gIGFybWVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoaWNoIGVhcmxpZXIga2luZHMgZWFjaCBkZWxpdmVyeSBraW5kIGRlZmVycyBiZWhpbmQuIENob3NlbiBzbyB0aGF0IG5vIGtpbmRcbiAqIGJsb2NrcyBvbiBhIHBlZXIgaXQgZG9lcyBub3QgbmVlZCB0bzpcbiAqXG4gKiAgLSBhIGhvb2sgZGVmZXJzIGJlaGluZCBlYXJsaWVyIFdBSVRTIGFuZCBTVEVQUyDigJQgbm90IGVhcmxpZXIgaG9va3MsIHdoaWNoXG4gKiAgICBhcmUgc2VxdWVudGlhbCBzYW1lLWVudGl0eSBwYXlsb2FkcyBhbmQgbXVzdCBub3QgYmxvY2sgb25lIGFub3RoZXI7XG4gKiAgLSBhIHdhaXQgZGVmZXJzIGJlaGluZCBlYXJsaWVyIEhPT0tTIGFuZCBTVEVQUyDigJQgbm90IGVhcmxpZXIgd2FpdHMsIHNpbmNlIGFcbiAqICAgIHdhaXQgbmV2ZXIgbmVlZHMgdG8gcXVldWUgYmVoaW5kIGFub3RoZXIgd2FpdDtcbiAqICAtIGEgc3RlcCBkZWZlcnMgYmVoaW5kIGVhcmxpZXIgV0FJVFMsIEhPT0tTIGFuZCBTVEVQUy5cbiAqXG4gKiBUaGUgc3RlcC1iZWhpbmQtc3RlcCBlZGdlIGlzIG5vdCByZWR1bmRhbnQgd2l0aCB0aGUgc2VyaWFsIGBwcm9taXNlUXVldWVgLlxuICogVGhlIHF1ZXVlIGZpeGVzIHRoZSBvcmRlciBpbiB3aGljaCBzdGVwIHJlc3VsdHMgYXJlIEhZRFJBVEVELCBidXQgYSBzdGVwIG5vXG4gKiBsb25nZXIgcmVzb2x2ZXMgaW5zaWRlIGl0cyBxdWV1ZSBzbG90IOKAlCBpdCBjYXB0dXJlcyB0aGUgb3V0Y29tZSB0aGVyZSBhbmRcbiAqIHJlc29sdmVzIGZyb20gYSBkZXRhY2hlZCBjb250aW51YXRpb24gb25jZSBpdHMgYmFycmllciBjbGVhcnMuIFR3byBzdGVwc1xuICogYWdyZWUgb24gdGhhdCBjb250aW51YXRpb24ncyBvcmRlcmluZyBvbmx5IHdoaWxlIHRoZXkgZGVmZXIgYmVoaW5kIHRoZSBzYW1lXG4gKiBzZXQsIHdoaWNoIGhvbGRzIHdoZW4gdGhleSBhcmUgY29uc3VtZWQgaW4gdGhlIHNhbWUgZHJhaW4gd2luZG93IGJ1dCBub3RcbiAqIGFjcm9zcyB3aW5kb3dzOiBhIHN0ZXAgY29uc3VtZWQgbGF0ZXIgY2FuIG1pc3MgYSB3YWl0L2hvb2sgYmFycmllciB0aGF0IGFuXG4gKiBlYXJsaWVyIHN0ZXAgaXMgc3RpbGwgcGFya2VkIG9uLCBiZWNhdXNlIHRoZSBiYXJyaWVyIHJldGlyZWQgaW4gYmV0d2Vlbi4gVGhlXG4gKiBlYXJsaWVyIHN0ZXAgaXMgdGhlbiB3YWl0aW5nIG91dCB0aGUgbWFjcm90YXNrIHlpZWxkIGJlbG93IHdoaWxlIHRoZSBsYXRlclxuICogb25lIHJlc29sdmVzIG9uIG1pY3JvdGFza3MsIGFuZCBvdmVydGFrZXMgaXQg4oCUIHNlZVxuICogYGRlbGl2ZXJ5LWJhcnJpZXItY292ZXJhZ2UudGVzdC50c2AuIERlZmVycmluZyBiZWhpbmQgZWFybGllciBzdGVwc1xuICogY2xvc2VzIHRoYXQgd2luZG93IHN0cnVjdHVyYWxseTogdGhlIGVhcmxpZXIgc3RlcCdzIGJhcnJpZXIgaXMgc3RpbGxcbiAqIHJlZ2lzdGVyZWQgcHJlY2lzZWx5IGJlY2F1c2UgaXQgaGFzIG5vdCBkZWxpdmVyZWQgeWV0LlxuICpcbiAqIEV2ZXJ5IGVkZ2UgcG9pbnRzIGZyb20gYSBsYXRlciBsb2cgaW5kZXggdG8gYSBzdHJpY3RseSBlYXJsaWVyIG9uZSwgc28gdGhlXG4gKiB3YWl0LWZvciBncmFwaCBjYW4gbmV2ZXIgY29udGFpbiBhIGN5Y2xlLlxuICovXG5jb25zdCBERUZFUl9CRUhJTkQ6IFJlY29yZDxEZWxpdmVyeUtpbmQsIHJlYWRvbmx5IERlbGl2ZXJ5S2luZFtdPiA9IHtcbiAgaG9vazogWyd3YWl0JywgJ3N0ZXAnXSxcbiAgd2FpdDogWydob29rJywgJ3N0ZXAnXSxcbiAgc3RlcDogWyd3YWl0JywgJ2hvb2snLCAnc3RlcCddLFxufTtcblxuLyoqXG4gKiBXaGV0aGVyIGBlbnRyeWAgd2lsbCByZXNvbHZlIG9uIGl0cyBvd24g4oCUIGl0IGlzIGFybWVkLCBhbmQgZXZlcnkgZWFybGllclxuICogZGVsaXZlcnkgaXQgZGVmZXJzIGJlaGluZCB3aWxsIGxpa2V3aXNlIHJlc29sdmUgb24gaXRzIG93bi5cbiAqXG4gKiBBIHN0ZXAgZGVsaXZlcnkgaXMgYWx3YXlzIHNlbGYtcmVzb2x2aW5nOiBpdCBza2lwcyB1bmNvbW1pdHRlZCBkZWxpdmVyaWVzXG4gKiAoc2VlIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfSksIGFuZCB0aGUgZWFybGllciBzdGVwcyBpdCBkb2VzIGRlZmVyXG4gKiBiZWhpbmQgYXJlIHNlbGYtcmVzb2x2aW5nIGJ5IHRoZSBzYW1lIGFyZ3VtZW50LCBpbmR1Y3RpbmcgZG93biBvbiBpbmRleC5cbiAqXG4gKiBSZWN1cnNpb24gdGVybWluYXRlcyBiZWNhdXNlIGV2ZXJ5IGVkZ2UgcG9pbnRzIHRvIGEgc3RyaWN0bHkgc21hbGxlciBpbmRleC5cbiAqIGBtZW1vYCBpcyByZXF1aXJlZCByYXRoZXIgdGhhbiBhbiBvcHRpbWl6YXRpb246IHdpdGhvdXQgaXQgdGhlIHdhbGsgaXNcbiAqIGV4cG9uZW50aWFsIGluIHRoZSBudW1iZXIgb2YgbGl2ZSBob29rL3dhaXQgYmFycmllcnMgKGVhY2ggYXJtZWQgZW50cnlcbiAqIHJlLXdhbGtzIGV2ZXJ5IGVhcmxpZXIgZW50cnkgb2YgdGhlIG9wcG9zaXRlIGtpbmQsIFQobikgPSDOoyBUKGopKSwgYW5kIHRoZVxuICogcmVnaXN0cnkgaXMgbm90IHNtYWxsIGJ5IGNvbnN0cnVjdGlvbiDigJQgYEV2ZW50c0NvbnN1bWVyYCBkcmFpbnNcbiAqIGNvbnNlY3V0aXZlbHkgY29uc3VtYWJsZSBldmVudHMgc3luY2hyb25vdXNseSB3aGlsZSBiYXJyaWVycyBvbmx5IHJldGlyZSBvblxuICogbWljcm90YXNrLWRyaXZlbiBkZWxpdmVyaWVzLCBzbyBhIGZhbi1vdXQgb2YgYFByb21pc2UucmFjZShbaG9vaywgc2xlZXBdKWBcbiAqIGJyYW5jaGVzIGFjY3VtdWxhdGVzIG9uZSBiYXJyaWVyIHBlciBicmFuY2ggcGVyIGtpbmQuIE1lbW9pemVkLCB0aGUgd2FsayBpc1xuICogbGluZWFyIGluIHJlZ2lzdHJ5IHNpemUuIFRoZSBtZW1vIE1VU1QgYmUgcGVyLWNhbGw6IGBhcm1lZGAgbXV0YXRlcyBiZXR3ZWVuXG4gKiBjYWxscyBhcyBidWZmZXJlZCBwYXlsb2FkcyBhcmUgY2xhaW1lZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZXNPbkl0c093bihcbiAgYmFycmllcnM6IE1hcDxudW1iZXIsIERlbGl2ZXJ5QmFycmllckVudHJ5PixcbiAgaW5kZXg6IG51bWJlcixcbiAgZW50cnk6IERlbGl2ZXJ5QmFycmllckVudHJ5LFxuICBtZW1vOiBNYXA8bnVtYmVyLCBib29sZWFuPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNhY2hlZCA9IG1lbW8uZ2V0KGluZGV4KTtcbiAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjb21wdXRlUmVzb2x2ZXNPbkl0c093bihiYXJyaWVycywgaW5kZXgsIGVudHJ5LCBtZW1vKTtcbiAgbWVtby5zZXQoaW5kZXgsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVSZXNvbHZlc09uSXRzT3duKFxuICBiYXJyaWVyczogTWFwPG51bWJlciwgRGVsaXZlcnlCYXJyaWVyRW50cnk+LFxuICBpbmRleDogbnVtYmVyLFxuICBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnksXG4gIG1lbW86IE1hcDxudW1iZXIsIGJvb2xlYW4+XG4pOiBib29sZWFuIHtcbiAgaWYgKCFlbnRyeS5hcm1lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZW50cnkua2luZCA9PT0gJ3N0ZXAnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgZGVmZXJCZWhpbmQgPSBERUZFUl9CRUhJTkRbZW50cnkua2luZF07XG4gIGZvciAoY29uc3QgW290aGVySW5kZXgsIG90aGVyXSBvZiBiYXJyaWVycykge1xuICAgIGlmIChcbiAgICAgIG90aGVySW5kZXggPCBpbmRleCAmJlxuICAgICAgZGVmZXJCZWhpbmQuaW5jbHVkZXMob3RoZXIua2luZCkgJiZcbiAgICAgICFyZXNvbHZlc09uSXRzT3duKGJhcnJpZXJzLCBvdGhlckluZGV4LCBvdGhlciwgbWVtbylcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQXdhaXRzLCBpbiBzdHJpY3QgZXZlbnQtbG9nIG9yZGVyLCBldmVyeSBzdGlsbC1yZWdpc3RlcmVkIGRlbGl2ZXJ5IHRoYXQgaXNcbiAqIGVhcmxpZXIgaW4gdGhlIGxvZyB0aGFuIGBldmVudEluZGV4YCBhbmQgdGhhdCBhIGRlbGl2ZXJ5IG9mIGBraW5kYCBkZWZlcnNcbiAqIGJlaGluZCAoc2VlIHtAbGluayBERUZFUl9CRUhJTkR9KSwgc28gdGhhdCB0aGlzIHJlc29sdXRpb24gaXMgaGFuZGVkIHRvIHRoZVxuICogd29ya2Zsb3cgb25seSBhZnRlciBhbGwgcmVsZXZhbnQgZWFybGllci1pbi1sb2cgZGVsaXZlcmllcyBoYXZlIGJlZW4uIFRoaXNcbiAqIGlzIHdoYXQga2VlcHMgYSBgUHJvbWlzZS5yYWNlYCDigJQgb3IgdGhlIFVMSUQgYSBmb2xsb3ctdXAgYHVzZVN0ZXBgIGRyYXdzIG9uXG4gKiBhIGNvbmN1cnJlbnQgYnJhbmNoIOKAlCBkZXRlcm1pbmlzdGljIGFuZCBhbGlnbmVkIHdpdGggdGhlIGNvbW1pdHRlZCBldmVudFxuICogbG9nLCBpbmRlcGVuZGVudCBvZiBtaWNyb3Rhc2staG9wIGNvdW50cywgaHlkcmF0aW9uIHRpbWUsIG9yIHJhY2UtYXJndW1lbnRcbiAqIG9yZGVyLiBXaGVuIHRoaXMgZGVsaXZlcnkgZG9lcyBoYXZlIHRvIHdhaXQsIGl0IGFsc28geWllbGRzIGEgbWFjcm90YXNrXG4gKiBhZnRlcndhcmRzIHNvIHRoZSBlYXJsaWVyIGRlbGl2ZXJ5J3MgY29uc3VtZXIgY2FuIHJ1biB0byBpdHMgb3duIG5leHRcbiAqIHN1c3BlbnNpb24gcG9pbnQgZmlyc3Q7IHNlZSB0aGUgY29tbWVudCBhdCB0aGF0IGBhd2FpdGAgZm9yIHdoeSBvcmRlcmluZyB0aGVcbiAqIGByZXNvbHZlKClgIGNhbGxzIGFsb25lIGlzIG5vdCBlbm91Z2guXG4gKlxuICogT25lIGFzeW1tZXRyeTogYSBTVEVQIHJlc3VsdCBhZGRpdGlvbmFsbHkgc2tpcHMgYW55IGVhcmxpZXIgZGVsaXZlcnkgdGhhdFxuICogd2lsbCBub3QgcmVzb2x2ZSBvbiBpdHMgb3duLCBpLmUuIG9uZSBibG9ja2VkIChkaXJlY3RseSBvciB0cmFuc2l0aXZlbHkpIG9uXG4gKiBhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCBubyBjb25zdW1lciBoYXMgY2xhaW1lZC4gU3VjaCBhIHBheWxvYWQgaXMgZGVsaXZlcmVkXG4gKiBvbmx5IHdoZW4gdGhlIHdvcmtmbG93IG5leHQgcmVhZHMgdGhlIGhvb2ssIGFuZCByZWFjaGluZyB0aGF0IHJlYWQgdmVyeVxuICogY29tbW9ubHkgcmVxdWlyZXMgdGhlIHN0ZXAgcmVzdWx0IGl0c2VsZiAoYGF3YWl0IHN0ZXBYKClgIGJlZm9yZSB0aGUgcmVhZCkuXG4gKiBHYXRpbmcgdGhlIHN0ZXAgb24gaXQgd291bGQgc3RhbGwgdGhlIHdvcmtmbG93IHVudGlsIHRoZSBiYXJyaWVyJ3MgaWRsZVxuICogc2FmZXR5IG5ldCBmaXJlcywgd2hpY2ggdGhlbiByZWxlYXNlcyBldmVyeSBkZWxpdmVyeSBxdWV1ZWQgYmVoaW5kIHRoYXRcbiAqIHBheWxvYWQgYXQgb25jZSDigJQgbG9zaW5nIGV4YWN0bHkgdGhlIHJhY2UgdGhpcyBvcmRlcmluZyBleGlzdHMgdG8gcHJvdGVjdC5cbiAqIFdhaXRzIGFuZCBob29rcyBrZWVwIGdhdGluZyBvbiB1bmNsYWltZWQgcGF5bG9hZHM6IGZvciB0aGVtLCB3YWl0aW5nIGZvciB0aGVcbiAqIGNsYWltIElTIHRoZSBvcmRlcmluZyBndWFyYW50ZWUgKGEgYHdhaXRfY29tcGxldGVkYCBtdXN0IG5vdCBwcmVlbXB0IGFcbiAqIHBheWxvYWQgdGhlIGxvZyBvcmRlcmVkIGZpcnN0KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF3YWl0RWFybGllckRlbGl2ZXJpZXMoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBldmVudEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGtpbmQ6IERlbGl2ZXJ5S2luZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIERlZmVuc2l2ZTogdG9sZXJhdGUgY29udGV4dHMgdGhhdCBwcmVkYXRlIHRoaXMgZmllbGQgKHRlc3QgaGFybmVzc2VzKS5cbiAgaWYgKFxuICAgIGV2ZW50SW5kZXggPT09IHVuZGVmaW5lZCB8fFxuICAgICFjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnMgfHxcbiAgICBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnMuc2l6ZSA9PT0gMFxuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYmFycmllcnMgPSBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM7XG4gIGNvbnN0IGRlZmVyQmVoaW5kID0gREVGRVJfQkVISU5EW2tpbmRdO1xuICBjb25zdCBlYXJsaWVyOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgLy8gU2hhcmVkIGFjcm9zcyB0aGlzIGNhbGwgb25seSDigJQgc2VlIGByZXNvbHZlc09uSXRzT3duYC5cbiAgY29uc3Qgc2VsZlJlc29sdmluZyA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgZW50cnldIG9mIGJhcnJpZXJzKSB7XG4gICAgaWYgKGluZGV4ID49IGV2ZW50SW5kZXggfHwgIWRlZmVyQmVoaW5kLmluY2x1ZGVzKGVudHJ5LmtpbmQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAga2luZCA9PT0gJ3N0ZXAnICYmXG4gICAgICAhcmVzb2x2ZXNPbkl0c093bihiYXJyaWVycywgaW5kZXgsIGVudHJ5LCBzZWxmUmVzb2x2aW5nKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVhcmxpZXIucHVzaChlbnRyeS5kZWxpdmVyZWQpO1xuICB9XG4gIGlmIChlYXJsaWVyLmxlbmd0aCA+IDApIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChlYXJsaWVyKTtcbiAgICAvLyBBbiBlYXJsaWVyIGRlbGl2ZXJ5IGJlaW5nIFwiZGVsaXZlcmVkXCIgb25seSBtZWFucyBpdHMgYHJlc29sdmUoKWAgcmFuLlxuICAgIC8vIFRoZSBicmFuY2ggaXQgd29rZSBtYXkgbmVlZCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGZ1cnRoZXIgbWljcm90YXNrXG4gICAgLy8gaG9wcyBiZWZvcmUgaXQgcmVhY2hlcyBpdHMgbmV4dCBgdXNlU3RlcGAgY2FsbCBhbmQgZHJhd3MgYSBVTElEIOKAlCBhXG4gICAgLy8gYGZvciBhd2FpdGAgb3ZlciBhIGhvb2ssIGZvciBpbnN0YW5jZSwgcmVzdW1lcyB0aGUgZ2VuZXJhdG9yLCBzZXR0bGVzXG4gICAgLy8gdGhlIHByb21pc2UgZnJvbSBgbmV4dCgpYCwgYW5kIG9ubHkgdGhlbiBydW5zIHRoZSBsb29wIGJvZHkuIFJlc29sdmluZ1xuICAgIC8vIHRoaXMgZGVsaXZlcnkgb24gYSBtaWNyb3Rhc2sgd291bGQgbGV0IGl0IG92ZXJ0YWtlIHRoYXQgYnJhbmNoIGFuZFxuICAgIC8vIHJlb3JkZXIgdGhlIFVMSUQgYWxsb2NhdGlvbiBhbnl3YXksIHR1cm5pbmcgdGhlIGd1YXJhbnRlZSBiZWxvdyBpbnRvIGFcbiAgICAvLyBob3AtY291bnQgcmFjZSB0aGF0IGhvbGRzIG9ubHkgZm9yIHRoZSBzaG9ydGVzdCBjb25zdW1lcnMuXG4gICAgLy9cbiAgICAvLyBZaWVsZGluZyBhIG1hY3JvdGFzayBsZXRzIHRoZSBlYXJsaWVyIGJyYW5jaCdzIGVudGlyZSBtaWNyb3Rhc2sgY2hhaW5cbiAgICAvLyBkcmFpbiBmaXJzdCwgd2hhdGV2ZXIgaXRzIGxlbmd0aCwgc28gbG9nIG9yZGVyIHN1cnZpdmVzIHJlZ2FyZGxlc3Mgb2ZcbiAgICAvLyBob3cgdGhlIHdvcmtmbG93IGNvbnN1bWVzIHRoZSBlYXJsaWVyIGRlbGl2ZXJ5LiBPbmx5IGRlbGl2ZXJpZXMgdGhhdFxuICAgIC8vIGFjdHVhbGx5IGhhZCB0byBkZWZlciBwYXkgdGhpcywgc28gdGhlIGNvbW1vbiBzaW5nbGUtZGVsaXZlcnkgZHJhaW4gaXNcbiAgICAvLyB1bmFmZmVjdGVkLlxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcbiAgfVxufVxuXG4vKiogSGFuZGxlIGZvciBhIHJlZ2lzdGVyZWQgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5IGJhcnJpZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbGl2ZXJ5QmFycmllciB7XG4gIC8qKlxuICAgKiBNYXJrIHRoaXMgZGVsaXZlcnkgYXMgZGVsaXZlcmVkIHRvIHRoZSB3b3JrZmxvdy4gUmVzb2x2ZXMgaXRzXG4gICAqIGBkZWxpdmVyZWRgIHByb21pc2Ugc28gYW55IGxhdGVyLWluLWxvZyBkZWxpdmVyeSBnYXRlZCBvbiBpdCAodmlhXG4gICAqIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfSkgbWF5IHByb2NlZWQsIGFuZCByZW1vdmVzIGl0IGZyb20gdGhlXG4gICAqIHJlZ2lzdHJ5LiBJZGVtcG90ZW50LlxuICAgKi9cbiAgbWFya0RlbGl2ZXJlZDogKCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIE1hcmsgdGhpcyBkZWxpdmVyeSBhcyBjb21taXR0ZWQgdG8gaGFwcGVuaW5nLCBmb3IgYSBiYXJyaWVyIHJlZ2lzdGVyZWRcbiAgICogdW5hcm1lZCAoYSBidWZmZXJlZCBob29rIHBheWxvYWQpIG9uY2UgYSBjb25zdW1lciBoYXMgY2xhaW1lZCBpdC4gRnJvbVxuICAgKiB0aGVuIG9uIGEgbGF0ZXIgc3RlcCByZXN1bHQgbWF5IGJlIG9yZGVyZWQgYmVoaW5kIGl0LiBJZGVtcG90ZW50LlxuICAgKi9cbiAgYXJtOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5IGF0IGl0cyBldmVudC1sb2cgaW5kZXggc28gdGhhdCBsYXRlclxuICogZGVsaXZlcmllcyBjYW4gYmUgb3JkZXJlZCBzdHJpY3RseSBhZnRlciBpdC4gUmV0dXJucyBhbiBpbmVydCBoYW5kbGUgd2hlblxuICogYHBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzYCBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gKlxuICogUGFzcyBgYXJtZWQ6IGZhbHNlYCBmb3IgYSBkZWxpdmVyeSB3aG9zZSByZXNvbHV0aW9uIHdhaXRzIG9uIHdvcmtmbG93IGNvZGVcbiAqIGFza2luZyBmb3IgaXQgKGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkKTsgY2FsbCBgYXJtKClgIHdoZW4gaXQgZG9lcy5cbiAqXG4gKiBUbyBndWFyYW50ZWUgYSBsYXRlciBkZWxpdmVyeSBnYXRlZCBvbiB0aGlzIG9uZSBjYW4gbmV2ZXIgaGFuZyB3aGVuIHRoaXNcbiAqIGRlbGl2ZXJ5IGlzIGFiYW5kb25lZCAodGhlIHdvcmtmbG93IHRvb2sgYSBkaWZmZXJlbnQgYnJhbmNoIG9yIGlzXG4gKiBzdXNwZW5kaW5nIGFuZCBuZXZlciBvYnNlcnZlcyBpdCksIHRoZSBiYXJyaWVyIGF1dG8tcmVzb2x2ZXMgYXQgaWRsZS5cbiAqXG4gKiBJTlZBUklBTlQgcmVxdWlyZWQgb2YgZXZlcnkgY2FsbCBzaXRlOiBhIGJhcnJpZXIgdGhhdCBpcyBldmVyIGBhcm1lZGAgbXVzdFxuICogYmUgcGFpcmVkIHdpdGggYSBkZWxpdmVyeSBjaGFpbiB0aGF0IHJ1bnMgdW5jb25kaXRpb25hbGx5IOKAlCBhdHRhY2hlZCB3aGVuXG4gKiB0aGUgZXZlbnQgaXMgY29uc3VtZWQgKHdhaXRzLCBzdGVwIHJlc3VsdHMsIHdhaXRpbmctY29uc3VtZXIgaG9vayBwYXlsb2FkcyxcbiAqIGFib3J0cyksIG9yIGJ5IHRoZSBgY2xhaW0oKWAgd2hvc2UgaW52b2NhdGlvbiBpcyB3aGF0IGFybXMgaXQgKGJ1ZmZlcmVkXG4gKiBob29rIHBheWxvYWRzKS4gVGhlIGlkbGUgY2hlY2sgKHtAbGluayBzY2hlZHVsZVdoZW5JZGxlfSkgcmVmdXNlcyB0b1xuICogb2JzZXJ2ZSBpZGxlIHdoaWxlIGFuIGFybWVkLCBzZWxmLXJlc29sdmluZyBiYXJyaWVyIGlzIHVuZGVsaXZlcmVkLCBhbmQgdGhlXG4gKiBzYWZldHkgbmV0IGJlbG93IGlzIGl0c2VsZiBpZGxlLWdhdGVkIOKAlCBzbyBhbiBhcm1lZCBiYXJyaWVyIHdpdGggbm9cbiAqIHVuY29uZGl0aW9uYWwgY2hhaW4gd291bGQgbGl2ZWxvY2sgZXZlcnkgaWRsZSBjaGVjayBpbiB0aGUgcnVuLCBpbmNsdWRpbmdcbiAqIGl0cyBvd24gcmV0aXJlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZXZlbnRJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBraW5kOiBEZWxpdmVyeUtpbmQsXG4gIG9wdGlvbnM6IHsgYXJtZWQ/OiBib29sZWFuIH0gPSB7fVxuKTogRGVsaXZlcnlCYXJyaWVyIHtcbiAgY29uc3QgYmFycmllcnMgPSBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM7XG4gIGlmICghYmFycmllcnMgfHwgZXZlbnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgbWFya0RlbGl2ZXJlZDogKCkgPT4ge30sIGFybTogKCkgPT4ge30gfTtcbiAgfVxuXG4gIGxldCBkb25lID0gZmFsc2U7XG4gIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuICBjb25zdCBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnkgPSB7XG4gICAga2luZCxcbiAgICBkZWxpdmVyZWQ6IHByb21pc2UsXG4gICAgYXJtZWQ6IG9wdGlvbnMuYXJtZWQgPz8gdHJ1ZSxcbiAgfTtcbiAgYmFycmllcnMuc2V0KGV2ZW50SW5kZXgsIGVudHJ5KTtcblxuICBjb25zdCBmaW5pc2ggPSAoKSA9PiB7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG9uZSA9IHRydWU7XG4gICAgaWYgKGJhcnJpZXJzLmdldChldmVudEluZGV4KSA9PT0gZW50cnkpIHtcbiAgICAgIGJhcnJpZXJzLmRlbGV0ZShldmVudEluZGV4KTtcbiAgICB9XG4gICAgcmVzb2x2ZSgpO1xuICB9O1xuXG4gIC8vIFNhZmV0eSBuZXQ6IGlmIHRoaXMgZGVsaXZlcnkgaXMgbmV2ZXIgZGVsaXZlcmVkIHRvIHRoZSB3b3JrZmxvdyAoaXRzXG4gIC8vIGJyYW5jaCB3YXMgbm90IHRha2VuIC8gdGhlIHJ1biBpcyBzdXNwZW5kaW5nLCBvciBhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZFxuICAvLyBpcyBvbmx5IGNsYWltZWQgYWZ0ZXIgYSBsYXRlciBkZWxpdmVyeSB0aGUgd29ya2Zsb3cgaXMgc3RpbGwgd2FpdGluZyBvbiksXG4gIC8vIHJlc29sdmUgYXQgaWRsZSBzbyBhIGxhdGVyIGRlbGl2ZXJ5IGdhdGVkIG9uIGl0IGNhbm5vdCBkZWFkbG9jayBhbmQgdGhlXG4gIC8vIHJlZ2lzdHJ5IGNhbm5vdCBsZWFrIGFuIGVudHJ5IHBlciBhYmFuZG9uZWQgZGVsaXZlcnkuXG4gIHNjaGVkdWxlV2hlbklkbGUoY3R4LCBmaW5pc2gpO1xuXG4gIHJldHVybiB7XG4gICAgbWFya0RlbGl2ZXJlZDogZmluaXNoLFxuICAgIGFybTogKCkgPT4ge1xuICAgICAgZW50cnkuYXJtZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciBzb21lIHJlZ2lzdGVyZWQgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5IGlzIGdvaW5nIHRvIHJlYWNoIHRoZVxuICogd29ya2Zsb3cgd2l0aG91dCBhbnkgZnVydGhlciBoZWxwIChpdCBpcyBhcm1lZCBhbmQgbm90IHRyYW5zaXRpdmVseSBwYXJrZWRcbiAqIGJlaGluZCBhbiB1bmNsYWltZWQgYnVmZmVyZWQgcGF5bG9hZCDigJQgc2VlIHtAbGluayByZXNvbHZlc09uSXRzT3dufSkgYnV0XG4gKiBoYXMgbm90IGJlZW4gaGFuZGVkIG92ZXIgeWV0LlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlbGl2ZXJ5IHN0YXRlIGBwZW5kaW5nRGVsaXZlcmllc2AgY2Fubm90IHNlZS4gVGhhdCBjb3VudGVyXG4gKiBjb3ZlcnMgdGhlIGh5ZHJhdGlvbiB3aW5kb3cgaW5zaWRlIGEgc2VyaWFsIGBwcm9taXNlUXVldWVgIHNsb3QgYW5kIGlzXG4gKiByZWxlYXNlZCB0aGVyZSwgd2hpbGUgdGhlIGRlbGl2ZXJ5J3MgYHJlc29sdmUoKWAgcnVucyBsYXRlciwgZnJvbSBhXG4gKiBkZXRhY2hlZCBjb250aW51YXRpb24gYmVoaW5kIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfSDigJQgaW5jbHVkaW5nIGl0c1xuICogbWFjcm90YXNrIHlpZWxkIHdoZW5ldmVyIHRoZSBkZWxpdmVyeSBoYWQgdG8gZGVmZXIuIFJlcGxheWluZyBhIGJhdGNoIG9mIE5cbiAqIHBhcmFsbGVsIHN0ZXAgcmVzdWx0cyBjb25zdW1lZCBpbiBvbmUgZHJhaW4gd2luZG93IGxlYXZlcyBOLTEgb2YgdGhlbVxuICogcGFya2VkIG9uIHRoYXQgeWllbGQgd2l0aCBgcGVuZGluZ0RlbGl2ZXJpZXNgIGFscmVhZHkgYXQgMC4gQW4gaWRsZSBjaGVja1xuICogYXJtZWQgZHVyaW5nIHRoZSBzYW1lIHdpbmRvdyAoYSBwZW5kaW5nIGBzbGVlcCgpYCBhcm1zIG9uZSBvbiBldmVyeSByZXBsYXkpXG4gKiBjb3VsZCB0aGVuIG9ic2VydmUgXCJpZGxlXCIgbWlkLWRlZmVycmFsIGFuZCByYWlzZSBhIGBXb3JrZmxvd1N1c3BlbnNpb25gXG4gKiBCRUZPUkUgdGhlIHdvcmtmbG93J3Mgb3duIGNvbnRpbnVhdGlvbnMgcmFuIOKAlCBhIHN1c3BlbnNpb24gY2Fycnlpbmcgbm9uZSBvZlxuICogdGhlIGZvbGxvdy11cCB3b3JrIHRoZSBiYXRjaCB3YXMgYWJvdXQgdG8gY3JlYXRlLCB3aGljaCB0aGUgcnVudGltZVxuICogZHV0aWZ1bGx5IHNjaGVkdWxlcyBhcyBub3RoaW5nLCBsZWF2aW5nIHRoZSBydW4gZG9ybWFudCB1bnRpbCBhbiB1bnJlbGF0ZWRcbiAqIHRpbWVyIGZpcmVzICh2ZXJjZWwvd29ya2Zsb3cjMzE4MykuXG4gKlxuICogRGVsaXZlcmllcyB0aGF0IGRvIE5PVCByZXNvbHZlIG9uIHRoZWlyIG93biBtdXN0IGJlIGV4Y2x1ZGVkLCBub3QgZm9yXG4gKiBhY2N1cmFjeSBidXQgZm9yIHRlcm1pbmF0aW9uOiBhbiB1bmNsYWltZWQgYnVmZmVyZWQgaG9vayBwYXlsb2FkIGlzIHJldGlyZWRcbiAqIEJZIHRoZSBpZGxlIHNhZmV0eSBuZXQgaW4ge0BsaW5rIHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyfSwgc28gY291bnRpbmcgaXRcbiAqIGhlcmUgd291bGQgZ2F0ZSBpdHMgb3duIHJldGlyZW1lbnQuIFNlbGYtcmVzb2x2aW5nIGRlbGl2ZXJpZXMgYWx3YXlzXG4gKiBkZWxpdmVyIGZyb20gdGhlaXIgb3duIGNoYWlucyAoc2VlIHRoZSBJTlZBUklBTlQgb25cbiAqIHtAbGluayByZWdpc3RlckRlbGl2ZXJ5QmFycmllcn0pIGFuZCBuZXZlciBuZWVkIHRoYXQgbmV0LCBzbyB3YWl0aW5nIG9uXG4gKiB0aGVtIGlzIGRlYWRsb2NrLWZyZWUuXG4gKi9cbmZ1bmN0aW9uIGhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5KGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGJhcnJpZXJzID0gY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzO1xuICBpZiAoIWJhcnJpZXJzIHx8IGJhcnJpZXJzLnNpemUgPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gU2hhcmVkIGFjcm9zcyB0aGlzIGNhbGwgb25seSDigJQgc2VlIGByZXNvbHZlc09uSXRzT3duYC5cbiAgY29uc3Qgc2VsZlJlc29sdmluZyA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgZW50cnldIG9mIGJhcnJpZXJzKSB7XG4gICAgaWYgKHJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIGluZGV4LCBlbnRyeSwgc2VsZlJlc29sdmluZykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYSBjYWxsYmFjayB0byBmaXJlIG9ubHkgYWZ0ZXIgYWxsIHBlbmRpbmcgZGF0YSBkZWxpdmVyaWVzXG4gKiAoc3RlcCByZXN1bHRzLCBob29rIHBheWxvYWRzKSBhbmQgYXN5bmMgZGVzZXJpYWxpemF0aW9uIGhhdmUgY29tcGxldGVkLlxuICogVXNlcyBhIHBvbGxpbmcgbG9vcDogc2V0VGltZW91dCgwKSDihpIgY2hlY2sgcGVuZGluZ0RlbGl2ZXJpZXMgYW5kIHRoZVxuICogYmFycmllciByZWdpc3RyeSDihpIgaWYgYW55dGhpbmcgaXMgc3RpbGwgaW4gZmxpZ2h0LCB3YWl0IGZvciBwcm9taXNlUXVldWUg4oaSXG4gKiByZXBlYXQuIFRoaXMgaGFuZGxlcyB0aGUgbXVsdGktcm91bmQgZGVsaXZlcnkgcGF0dGVybiB3aGVyZSBlYWNoIGhvb2tcbiAqIHBheWxvYWQgZGVsaXZlcnkgY3ljbGUgYXBwZW5kcyBuZXcgYXN5bmMgd29yayB0byB0aGUgcHJvbWlzZVF1ZXVlLlxuICpcbiAqIFwiSW4gZmxpZ2h0XCIgaXMgdHdvIGRpc3RpbmN0IHdpbmRvd3MsIGVhY2ggd2l0aCBpdHMgb3duIGd1YXJkOlxuICogYHBlbmRpbmdEZWxpdmVyaWVzID4gMGAgY292ZXJzIGh5ZHJhdGlvbiBpbnNpZGUgdGhlIHNlcmlhbCBxdWV1ZSBzbG90cywgYW5kXG4gKiB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IGNvdmVycyB0aGUgZGV0YWNoZWQgZ2FwIGJldHdlZW4gYSBzbG90XG4gKiByZWxlYXNpbmcgdGhhdCBjb3VudGVyIGFuZCB0aGUgZGVsaXZlcnkncyBgcmVzb2x2ZSgpYCBhY3R1YWxseSBydW5uaW5nIOKAlFxuICogZGVsaWJlcmF0ZWx5IG91dHNpZGUgYHBlbmRpbmdEZWxpdmVyaWVzYCAoc2VlIHN0ZXAudHMpLCBhbmQgaW52aXNpYmxlIHRvIGl0LlxuICpcbiAqIFRoZSBpbml0aWFsIGBzZXRUaW1lb3V0KDApYCBtYWNyb3Rhc2sgaXMgbG9hZC1iZWFyaW5nIGFuZCBtdXN0IE5PVCBiZVxuICogZG93bmdyYWRlZCB0byBhIG1pY3JvdGFzayAoYHF1ZXVlTWljcm90YXNrYC9gUHJvbWlzZS5yZXNvbHZlKCkudGhlbmApLlxuICogYHBlbmRpbmdEZWxpdmVyaWVzYCBvbmx5IGd1YXJkcyB0aGUgaG9zdC1zaWRlIGh5ZHJhdGlvbiB3aW5kb3c7IGJldHdlZW4gYVxuICogZGVsaXZlcnkncyBgcmVzb2x2ZSgpYCBhbmQgdGhlIHdvcmtmbG93IFZNIGJvZHkgcnVubmluZyBpdHMgY29udGludWF0aW9uIHRvXG4gKiByZWdpc3RlciB0aGUgbmV4dCBzdWJzY3JpYmVyLCBgcGVuZGluZ0RlbGl2ZXJpZXNgIGlzIGFscmVhZHkgMCBldmVuIHRob3VnaFxuICogdGhlIFZNIGlzIG1pZC1yZWFjdGlvbi4gTm9kZSBkb2VzIG5vdCBndWFyYW50ZWUgYSBtaWNyb3Rhc2sgc2NoZWR1bGVkIGluXG4gKiB0aGUgaG9zdCBjb250ZXh0IHNldHRsZXMgYWZ0ZXIgdGhlIGNyb3NzLVZNIHByb21pc2UgY2hhaW4gKHJlc29sdmUgaW4gaG9zdFxuICog4oaSIHdvcmtmbG93IGNvZGUgaW4gVk0g4oaSIHN1YnNjcmliZSBiYWNrIGluIGhvc3QpOyB0aGUgbWFjcm90YXNrIGJvdW5kYXJ5XG4gKiBnaXZlcyB0aGF0IGNoYWluIHRpbWUgdG8gcnVuLCBzbyB0aGUgc3VzcGVuc2lvbiBkb2VzIG5vdCBwcmVlbXB0IGEgc2libGluZ1xuICogZGVsaXZlcnkgc3RpbGwgaW4gZmxpZ2h0LiBFbXBpcmljYWxseSwgcmVwbGFjaW5nIGl0IHdpdGggYHF1ZXVlTWljcm90YXNrYFxuICogYnJlYWtzIGhvb2svc2xlZXAgYFByb21pc2UucmFjZWAgb3JkZXJpbmcgKENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NoZWR1bGVXaGVuSWRsZShcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGZuOiAoKSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgY29uc3QgY2hlY2sgPSAoKSA9PiB7XG4gICAgaWYgKGN0eC5wZW5kaW5nRGVsaXZlcmllcyA+IDAgfHwgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnkoY3R4KSkge1xuICAgICAgLy8gQSBkZWxpdmVyeSBpcyBzdGlsbCBoeWRyYXRpbmcsIG9yIGlzIGNvbW1pdHRlZCBidXQgcGFya2VkIGJlaGluZCBpdHNcbiAgICAgIC8vIGRlZmVycmFsICh3aG9zZSByZXNvbHZlIHJ1bnMgb24gYSBkZXRhY2hlZCB0aW1lciwgbm90IHRoaXMgcXVldWUpLlxuICAgICAgLy8gRWl0aGVyIHdheTogbGV0IHRoZSBxdWV1ZSBkcmFpbiwgdGhlbiByZS1jaGVjayBhIHRpbWVyIHRpY2sgbGF0ZXIuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbigpO1xuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dChjaGVjaywgMCk7XG59XG4iXX0=
|
package/dist/runtime/world.d.ts
CHANGED
|
@@ -5,18 +5,23 @@ export type WorldFactoryModule = {
|
|
|
5
5
|
};
|
|
6
6
|
/**
|
|
7
7
|
* Create a World instance from a world factory module. Shared by
|
|
8
|
-
* `createWorld()` (for the
|
|
8
|
+
* `createWorld()` (for the world package named by WORKFLOW_TARGET_WORLD) and
|
|
9
9
|
* tooling that loads a world module dynamically (e.g. the Nitro dev
|
|
10
10
|
* handler and `@workflow/world-testing`). World packages should export
|
|
11
11
|
* `createWorld()`.
|
|
12
12
|
*/
|
|
13
13
|
export declare function createWorldFromModule(mod: WorldFactoryModule): World | Promise<World>;
|
|
14
14
|
/**
|
|
15
|
-
* Create a new world instance
|
|
15
|
+
* Create a new world instance based on environment variables.
|
|
16
|
+
* WORKFLOW_TARGET_WORLD is used to determine the target world.
|
|
16
17
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
18
|
+
* Note: WORKFLOW_VERCEL_* env vars (PROJECT, TEAM, AUTH_TOKEN, etc.) are
|
|
19
|
+
* intentionally NOT read here. Those are for CLI/observability tooling only
|
|
20
|
+
* and should not affect runtime behavior. The Vercel runtime provides
|
|
21
|
+
* authentication via OIDC tokens and project context via system env vars
|
|
22
|
+
* (VERCEL_DEPLOYMENT_ID, VERCEL_PROJECT_ID). Tooling that needs these env
|
|
23
|
+
* vars should call the Vercel world's createWorld() directly with an explicit
|
|
24
|
+
* config and use setWorld() to inject the instance.
|
|
20
25
|
*/
|
|
21
26
|
export declare const createWorld: () => Promise<World>;
|
|
22
27
|
export type WorldHandlers = Pick<World, 'createQueueHandler' | 'specVersion'>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../../src/runtime/world.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../../src/runtime/world.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAuC7C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;CAClD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,kBAAkB,GACtB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAcxB;AA8CD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,KAAK,CA6DjD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,oBAAoB,GAAG,aAAa,CAAC,CAAC;AAE9E;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,aAAa,CAoB9D,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAa,OAAO,CAAC,KAAK,CAgB9C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,KAAK,GAAG,SAAS,KAAG,IAKnD,CAAC"}
|