@workflow/core 5.0.0-beta.48 → 5.0.0-beta.49

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.
@@ -61,6 +61,32 @@ export interface WorkflowReadableStreamOptions {
61
61
  */
62
62
  global?: Record<string, any>;
63
63
  }
64
+ /**
65
+ * Options for configuring a writable onto a workflow run's stream.
66
+ */
67
+ export interface WorkflowRunWritableStreamOptions {
68
+ /**
69
+ * An optional namespace to distinguish between multiple streams associated
70
+ * with the same workflow run.
71
+ */
72
+ namespace?: string;
73
+ /**
74
+ * Any asynchronous operations to complete before pausing or terminating the
75
+ * execution environment
76
+ * (i.e. using [`waitUntil()`](https://developer.mozilla.org/docs/Web/API/ExtendableEvent/waitUntil) or similar).
77
+ *
78
+ * Writes are acknowledged on buffer entry, so a caller that needs them
79
+ * durable before the environment goes away should pass an array here and
80
+ * await it after releasing the writer lock.
81
+ */
82
+ ops?: Promise<any>[];
83
+ /**
84
+ * The global object to use for reducing types from the global scope.
85
+ *
86
+ * Defaults to {@link [`globalThis`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/globalThis)}.
87
+ */
88
+ global?: Record<string, any>;
89
+ }
64
90
  /**
65
91
  * A handler class for a workflow run.
66
92
  */
@@ -145,6 +171,22 @@ export declare class Run<TResult> {
145
171
  * @returns A `WorkflowReadableStream` for the workflow run.
146
172
  */
147
173
  getReadable<R = any>(options?: WorkflowReadableStreamOptions): WorkflowReadableStream<R>;
174
+ /** The writable stream of the workflow run. */
175
+ get writable(): WritableStream;
176
+ /**
177
+ * Returns a writable that appends to this run's stream.
178
+ *
179
+ * Initialization is deferred until the first write. The run must already
180
+ * exist. The writable may be forwarded through `start()` and into steps, but
181
+ * grants no read access or additional authorization.
182
+ *
183
+ * @remarks
184
+ * `writer.close()` closes the shared stream. Contributors should call
185
+ * `releaseLock()`, which also drains pending writes.
186
+ *
187
+ * @param options - The writable stream options.
188
+ */
189
+ getWritable<W = any>(options?: WorkflowRunWritableStreamOptions): WritableStream<W>;
148
190
  }
149
191
  /**
150
192
  * Retrieves a `Run` object for a given run ID.
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAe,iBAAiB,EAAS,MAAM,iBAAiB,CAAC;AAc7E,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAErB,MAAM,WAAW,CAAC;AAQnB,gBAAgB;AAChB,wBAAgB,4BAA4B,IAAI,MAAM,CAMrD;AAiBD,gBAAgB;AAChB,wBAAgB,2BAA2B,IAAI,MAAM,CAMpD;AAqBD,gBAAgB;AAChB,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,4BAA4B,IAAI,OAAO,CAItD;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;IAChE;;;;;;;OAOG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,GAAG,CAAC,OAAO;;IACtB,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;;;;IAIlD,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B;IAID;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;gBA4BF,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IAiC9D;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAKlE;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvD;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAa7B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAOvC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGlC;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAKlC;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAKzC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAK3C;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,sBAAsB,CAErC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,CAAC,GAAG,GAAG,EACjB,OAAO,GAAE,6BAAkC,GAC1C,sBAAsB,CAAC,CAAC,CAAC;CA8K7B;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAE3D"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAe,iBAAiB,EAAS,MAAM,iBAAiB,CAAC;AAiB7E,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAErB,MAAM,WAAW,CAAC;AAWnB,gBAAgB;AAChB,wBAAgB,4BAA4B,IAAI,MAAM,CAMrD;AAiBD,gBAAgB;AAChB,wBAAgB,2BAA2B,IAAI,MAAM,CAMpD;AAqBD,gBAAgB;AAChB,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,4BAA4B,IAAI,OAAO,CAItD;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;IAChE;;;;;;;OAOG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,GAAG,CAAC,OAAO;;IACtB,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;;;;IAIlD,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B;IAID;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;gBA4BF,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IAiC9D;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAKlE;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvD;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAa7B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAOvC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGlC;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAKlC;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAKzC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAK3C;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,sBAAsB,CAErC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,CAAC,GAAG,GAAG,EACjB,OAAO,GAAE,6BAAkC,GAC1C,sBAAsB,CAAC,CAAC,CAAC;IA4B5B,+CAA+C;IAC/C,IAAI,QAAQ,IAAI,cAAc,CAE7B;IAED;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,CAAC,GAAG,GAAG,EACjB,OAAO,GAAE,gCAAqC,GAC7C,cAAc,CAAC,CAAC,CAAC;CA2OrB;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAE3D"}
@@ -1,9 +1,9 @@
1
- import { WorkflowRunCancelledError, WorkflowRunFailedError, WorkflowRunNotCompletedError, WorkflowRunNotFoundError, } from '@workflow/errors';
1
+ import { RunExpiredError, WorkflowRunCancelledError, WorkflowRunFailedError, WorkflowRunNotCompletedError, WorkflowRunNotFoundError, } from '@workflow/errors';
2
2
  import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from '@workflow/serde';
3
3
  import { envNumber } from '@workflow/world/env-config';
4
4
  import { SPEC_VERSION_CURRENT } from '@workflow/world/spec-version';
5
5
  import { deriveRunPayloadKeys, } from '../serialization/encryption.js';
6
- import { getRunReadableStream, hydrateRunError, hydrateWorkflowReturnValue, } from '../serialization.js';
6
+ import { createForwardedWritable, getForwardedWritableEncryptionKey, getRunReadableStream, hydrateRunError, hydrateWorkflowReturnValue, tagForwardedWritableTarget, } from '../serialization.js';
7
7
  import { getWorkflowRunStreamId } from '../util.js';
8
8
  import { getWorldLazy } from './get-world-lazy.js';
9
9
  import { wakeUpRun, } from './runs.js';
@@ -12,6 +12,8 @@ const PAYLOAD_TERMINAL_RUN_STATUSES = new Set([
12
12
  'completed',
13
13
  'failed',
14
14
  ]);
15
+ // Give resilient starts up to 10 seconds to create the run.
16
+ const NOT_FOUND_RETRY_DELAYS = [1_000, 3_000, 6_000];
15
17
  /** @internal */
16
18
  export function getReturnValuePollIntervalMs() {
17
19
  return envNumber('WORKFLOW_RETURN_VALUE_POLL_INTERVAL_MS', RETURN_VALUE_POLL_INTERVAL_MS, { integer: true, min: 1 });
@@ -270,8 +272,94 @@ export class Run {
270
272
  },
271
273
  });
272
274
  }
275
+ /** The writable stream of the workflow run. */
276
+ get writable() {
277
+ return this.getWritable();
278
+ }
279
+ /**
280
+ * Returns a writable that appends to this run's stream.
281
+ *
282
+ * Initialization is deferred until the first write. The run must already
283
+ * exist. The writable may be forwarded through `start()` and into steps, but
284
+ * grants no read access or additional authorization.
285
+ *
286
+ * @remarks
287
+ * `writer.close()` closes the shared stream. Contributors should call
288
+ * `releaseLock()`, which also drains pending writes.
289
+ *
290
+ * @param options - The writable stream options.
291
+ */
292
+ getWritable(options = {}) {
293
+ 'use step';
294
+ const { ops = [], global = globalThis, namespace } = options;
295
+ const name = getWorkflowRunStreamId(this.runId, namespace);
296
+ let targetPromise;
297
+ let writable;
298
+ const resolveTarget = () => {
299
+ targetPromise ??= this.#getMetadata().then(async (run) => {
300
+ const target = {
301
+ key: await getForwardedWritableEncryptionKey(this.runId, run.deploymentId, run.encryptionPublicKey),
302
+ deploymentId: run.deploymentId,
303
+ encryptionPublicKey: run.encryptionPublicKey,
304
+ };
305
+ tagForwardedWritableTarget(writable, target);
306
+ return target;
307
+ });
308
+ return targetPromise;
309
+ };
310
+ writable = createForwardedWritable({
311
+ global,
312
+ ops,
313
+ runId: this.runId,
314
+ name,
315
+ key: () => resolveTarget().then(({ key }) => key),
316
+ });
317
+ return writable;
318
+ }
319
+ /** Reads metadata, briefly retrying resilient starts. @internal */
320
+ async #getMetadata() {
321
+ const world = await this.#lazyWorldPromise;
322
+ const maxRetries = this.#resilientStart ? NOT_FOUND_RETRY_DELAYS.length : 0;
323
+ let attempt = 0;
324
+ while (true) {
325
+ try {
326
+ return await world.runs.get(this.runId, { resolveData: 'none' });
327
+ }
328
+ catch (error) {
329
+ if (!WorkflowRunNotFoundError.is(error) || attempt >= maxRetries) {
330
+ throw error;
331
+ }
332
+ const delay = NOT_FOUND_RETRY_DELAYS[attempt];
333
+ attempt++;
334
+ await new Promise((resolve) => setTimeout(resolve, delay));
335
+ }
336
+ }
337
+ }
273
338
  /** @internal */
274
339
  async #resolveTerminalReturnValue(run) {
340
+ // Expiry is checked before the status branches, and deliberately so.
341
+ //
342
+ // Past its retention boundary a run's payloads are gone but its metadata
343
+ // usually is not, so `run.output` and `run.error` hydrate to an
344
+ // expired-data placeholder rather than to anything the caller asked for.
345
+ // Handing that back as if it were the return value — or wrapping it as
346
+ // the `cause` of a WorkflowRunFailedError — is worse than failing: it is
347
+ // indistinguishable from the workflow having genuinely returned it.
348
+ //
349
+ // A run started with `experimental_retention: 0` reaches this almost
350
+ // immediately (its purge races, and usually beats, the caller's own read
351
+ // of the result). An ordinary run reaches it whenever it is read after
352
+ // the World's default window. Both are the same condition and get the
353
+ // same terminal, non-retryable error, carrying whatever metadata
354
+ // survived so the caller can still tell success from failure.
355
+ //
356
+ // When even the metadata is gone the World reports the run as missing and
357
+ // the caller gets WorkflowRunNotFoundError from the read above instead —
358
+ // there is nothing left here to describe.
359
+ const expiredAt = run.expiredAt;
360
+ if (expiredAt != null && expiredAt <= new Date()) {
361
+ throw new RunExpiredError(`Run "${this.runId}" ${run.status === 'completed' ? 'completed' : `is ${run.status}`}, but its data expired at ${expiredAt.toISOString()} and is no longer readable.`, this.runId, run.status, expiredAt);
362
+ }
275
363
  if (run.status === 'completed') {
276
364
  const encryptionKey = await this.#getEncryptionKey(run);
277
365
  return await hydrateWorkflowReturnValue(run.output, this.runId, encryptionKey);
@@ -315,8 +403,9 @@ export class Run {
315
403
  // and the runtime to create the run via run_started.
316
404
  // When resilientStart is false, 404 is a real error: fail fast.
317
405
  let notFoundRetries = 0;
318
- const NOT_FOUND_MAX_RETRIES = this.#resilientStart ? 3 : 0;
319
- const NOT_FOUND_DELAYS = [1_000, 3_000, 6_000];
406
+ const NOT_FOUND_MAX_RETRIES = this.#resilientStart
407
+ ? NOT_FOUND_RETRY_DELAYS.length
408
+ : 0;
320
409
  // Prefer the World's long poll: one read that the backend holds open
321
410
  // until the run finishes, instead of asking again every second and
322
411
  // paying up to a full interval of quantization on a run that already
@@ -386,7 +475,7 @@ export class Run {
386
475
  }
387
476
  if (WorkflowRunNotFoundError.is(error) &&
388
477
  notFoundRetries < NOT_FOUND_MAX_RETRIES) {
389
- const delay = NOT_FOUND_DELAYS[notFoundRetries];
478
+ const delay = NOT_FOUND_RETRY_DELAYS[notFoundRetries];
390
479
  notFoundRetries++;
391
480
  await new Promise((resolve) => setTimeout(resolve, delay));
392
481
  continue;
@@ -406,4 +495,4 @@ export class Run {
406
495
  export function getRun(runId) {
407
496
  return new Run(runId);
408
497
  }
409
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcnVuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLDRCQUE0QixFQUM1Qix3QkFBd0IsR0FDekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUNMLG9CQUFvQixHQUVyQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUlMLFNBQVMsR0FDVixNQUFNLFdBQVcsQ0FBQztBQUVuQixNQUFNLDZCQUE2QixHQUFHLEtBQUssQ0FBQztBQUM1QyxNQUFNLDZCQUE2QixHQUFHLElBQUksR0FBRyxDQUFvQjtJQUMvRCxXQUFXO0lBQ1gsUUFBUTtDQUNULENBQUMsQ0FBQztBQUVILGdCQUFnQjtBQUNoQixNQUFNLFVBQVUsNEJBQTRCO0lBQzFDLE9BQU8sU0FBUyxDQUNkLHdDQUF3QyxFQUN4Qyw2QkFBNkIsRUFDN0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FDMUIsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLDRCQUE0QixHQUFHLE1BQU0sQ0FBQztBQUU1QyxnQkFBZ0I7QUFDaEIsTUFBTSxVQUFVLDJCQUEyQjtJQUN6QyxPQUFPLFNBQVMsQ0FDZCwrQkFBK0IsRUFDL0IsNEJBQTRCLEVBQzVCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQzFCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUV2QyxnQkFBZ0I7QUFDaEIsTUFBTSxVQUFVLDBCQUEwQjtJQUN4QyxPQUFPLFNBQVMsQ0FDZCxzQ0FBc0MsRUFDdEMsMkJBQTJCLEVBQzNCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQzFCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsNEJBQTRCO0lBQzFDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUM7SUFDeEQsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakQsT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQTZDRDs7R0FFRztBQUNILE1BQU0sT0FBTyxHQUFHO0lBQ2QsTUFBTSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFzQjtRQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTSxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUc3QjtRQUNDLE9BQU8sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQVM7SUFFZDs7O09BR0c7SUFDSCxhQUFhLENBQTZCO0lBQzFDLElBQUksaUJBQWlCO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUFFLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDN0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gscUJBQXFCLEdBQTJDLElBQUksQ0FBQztJQUVyRTs7Ozs7O09BTUc7SUFDSCxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRXhCLFlBQVksS0FBYSxFQUFFLElBQW1DO1FBQzVELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxFQUFFLGNBQWMsSUFBSSxLQUFLLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaUJBQWlCLENBQUMsR0FBaUI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztnQkFDM0MsTUFBTSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0QsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNqRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHVCQUF1QjtRQUNyQixPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQTBCO1FBQ3JDLFVBQVUsQ0FBQztRQUNYLE9BQU8sU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBMEI7UUFDckMsVUFBVSxDQUFDO1FBQ1gsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDM0MsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3BDLFNBQVMsRUFBRSxlQUFlO1lBQzFCLFdBQVcsRUFBRSxvQkFBb0I7WUFDakMsR0FBRyxDQUFDLE9BQU8sRUFBRSxZQUFZLEtBQUssU0FBUztnQkFDckMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRTtnQkFDdkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNSLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksTUFBTTtRQUNSLFVBQVUsQ0FBQztRQUNYLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzNDLEtBQUssQ0FBQyxJQUFJO2FBQ1AsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7YUFDeEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQzthQUNoQixLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNmLElBQUksd0JBQXdCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksTUFBTTtRQUNSLFVBQVUsQ0FBQztRQUNYLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzNDLEtBQUssQ0FBQyxJQUFJO2FBQ1AsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7YUFDeEMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQzdCLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxXQUFXO1FBQ2IsVUFBVSxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFlBQVk7UUFDZCxVQUFVLENBQUM7UUFDWCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQzNELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFNBQVM7UUFDWCxVQUFVLENBQUM7UUFDWCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQ3hELENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxTQUFTO1FBQ1gsVUFBVSxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDM0MsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUN4RCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksV0FBVztRQUNiLFVBQVUsQ0FBQztRQUNYLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzNDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILFdBQVcsQ0FDVCxVQUF5QyxFQUFFO1FBRTNDLFVBQVUsQ0FBQztRQUNYLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLE1BQU0sR0FBRyxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUN6RSxNQUFNLElBQUksR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNELHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUscURBQXFEO1FBQ3JELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3JELE1BQU0sTUFBTSxHQUFHLG9CQUFvQixDQUNqQyxNQUFNLEVBQ04sR0FBRyxFQUNILElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxFQUNKLFVBQVUsRUFDVixhQUFhLENBQ2QsQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUM1QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDM0IsWUFBWSxFQUFFLEtBQUssSUFBcUIsRUFBRTtnQkFDeEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN0RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDeEIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsS0FBSyxDQUFDLDJCQUEyQixDQUFDLEdBQWdCO1FBQ2hELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMvQixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4RCxPQUFPLE1BQU0sMEJBQTBCLENBQ3JDLEdBQUcsQ0FBQyxNQUFNLEVBQ1YsSUFBSSxDQUFDLEtBQUssRUFDVixhQUFhLENBQ2QsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVCLGdFQUFnRTtZQUNoRSw0REFBNEQ7WUFDNUQscUNBQXFDO1lBQ3JDLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hELElBQUksYUFBc0IsQ0FBQztZQUMzQixJQUFJLENBQUM7Z0JBQ0gsYUFBYSxHQUFHLE1BQU0sZUFBZSxDQUNuQyxHQUFHLENBQUMsS0FBSyxFQUNULElBQUksQ0FBQyxLQUFLLEVBQ1YsYUFBYSxDQUNkLENBQUM7WUFDSixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLDZEQUE2RDtnQkFDN0QsOERBQThEO2dCQUM5RCwyREFBMkQ7Z0JBQzNELGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFDRCxNQUFNLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUU7Z0JBQzFELFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUzthQUN6QixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLHFEQUFxRDtRQUNyRCxNQUFNLElBQUksNEJBQTRCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBRTNDLGtFQUFrRTtRQUNsRSxpRUFBaUU7UUFDakUsK0RBQStEO1FBQy9ELHFEQUFxRDtRQUNyRCxnRUFBZ0U7UUFDaEUsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFL0MscUVBQXFFO1FBQ3JFLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsMERBQTBEO1FBQzFELG9FQUFvRTtRQUNwRSxrRUFBa0U7UUFDbEUsOERBQThEO1FBQzlELE1BQU0scUJBQXFCLEdBQUcsNEJBQTRCLEVBQUU7WUFDMUQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDcEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLDBFQUEwRTtRQUMxRSwwRUFBMEU7UUFDMUUsa0VBQWtFO1FBQ2xFLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixNQUFNLFlBQVksR0FBRywwQkFBMEIsRUFBRSxDQUFDO1FBRWxELHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsb0VBQW9FO1FBQ3BFLHVFQUF1RTtRQUN2RSxrRUFBa0U7UUFDbEUsc0VBQXNFO1FBQ3RFLHlCQUF5QjtRQUN6QixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDO2dCQUNILHFFQUFxRTtnQkFDckUsdUVBQXVFO2dCQUN2RSxZQUFZO2dCQUNaLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RFLElBQUksV0FBVztvQkFBRSxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxXQUFXLEdBQUcsV0FBVztvQkFDN0IsQ0FBQyxDQUFDLE1BQU0scUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTt3QkFDdEMsU0FBUyxFQUFFLDJCQUEyQixFQUFFO3dCQUN4QyxXQUFXLEVBQUUsTUFBTTtxQkFDcEIsQ0FBQztvQkFDSixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO3dCQUMvQixXQUFXLEVBQUUsTUFBTTtxQkFDcEIsQ0FBQyxDQUFDO2dCQUVQLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDdkMsTUFBTSxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztnQkFFRCxJQUFJLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDMUQscUVBQXFFO29CQUNyRSwrREFBK0Q7b0JBQy9ELE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTt3QkFDM0MsV0FBVyxFQUFFLEtBQUs7cUJBQ25CLENBQUMsQ0FBQztvQkFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO2dCQUVELCtDQUErQztnQkFDL0MsTUFBTSxJQUFJLDRCQUE0QixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pFLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksNEJBQTRCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzNDLGdFQUFnRTtvQkFDaEUsb0VBQW9FO29CQUNwRSw0REFBNEQ7b0JBQzVELGtFQUFrRTtvQkFDbEUsaUVBQWlFO29CQUNqRSxvRUFBb0U7b0JBQ3BFLE1BQU0sbUJBQW1CLEdBQ3ZCLDRCQUE0QixFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztvQkFDckUsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDNUIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQzVCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsQ0FDekMsQ0FBQztvQkFDSixDQUFDO29CQUNELFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxJQUNFLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQ2xDLGVBQWUsR0FBRyxxQkFBcUIsRUFDdkMsQ0FBQztvQkFDRCxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUUsQ0FBQztvQkFDakQsZUFBZSxFQUFFLENBQUM7b0JBQ2xCLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDM0QsU0FBUztnQkFDWCxDQUFDO2dCQUNELE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFVLEtBQWE7SUFDM0MsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvcixcbiAgV29ya2Zsb3dSdW5GYWlsZWRFcnJvcixcbiAgV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvcixcbiAgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IFdPUktGTE9XX0RFU0VSSUFMSVpFLCBXT1JLRkxPV19TRVJJQUxJWkUgfSBmcm9tICdAd29ya2Zsb3cvc2VyZGUnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd1J1biwgV29ya2Zsb3dSdW5TdGF0dXMsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGVudk51bWJlciB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZC9lbnYtY29uZmlnJztcbmltcG9ydCB7IFNQRUNfVkVSU0lPTl9DVVJSRU5UIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkL3NwZWMtdmVyc2lvbic7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0UnVuUmVhZGFibGVTdHJlYW0sXG4gIGh5ZHJhdGVSdW5FcnJvcixcbiAgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCB9IGZyb20gJy4uL3V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIENhbmNlbFJ1bk9wdGlvbnMsXG4gIHR5cGUgU3RvcFNsZWVwT3B0aW9ucyxcbiAgdHlwZSBTdG9wU2xlZXBSZXN1bHQsXG4gIHdha2VVcFJ1bixcbn0gZnJvbSAnLi9ydW5zLmpzJztcblxuY29uc3QgUkVUVVJOX1ZBTFVFX1BPTExfSU5URVJWQUxfTVMgPSAxXzAwMDtcbmNvbnN0IFBBWUxPQURfVEVSTUlOQUxfUlVOX1NUQVRVU0VTID0gbmV3IFNldDxXb3JrZmxvd1J1blN0YXR1cz4oW1xuICAnY29tcGxldGVkJyxcbiAgJ2ZhaWxlZCcsXG5dKTtcblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJldHVyblZhbHVlUG9sbEludGVydmFsTXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUkVUVVJOX1ZBTFVFX1BPTExfSU5URVJWQUxfTVMnLFxuICAgIFJFVFVSTl9WQUxVRV9QT0xMX0lOVEVSVkFMX01TLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBIb3cgbG9uZyBhIHNpbmdsZSBgcnVucy53YWl0Rm9yVGVybWluYWxTdGF0dXNgIGNhbGwgbWF5IGJsb2NrIHdoaWxlIHdhaXRpbmdcbiAqIGZvciBhIHJ1biB0byBmaW5pc2guIFRoZSB3YWl0IGlzIHJlLWlzc3VlZCB1bnRpbCB0aGUgcnVuIGlzIHRlcm1pbmFsLCBzb1xuICogdGhpcyBpcyBhIHBlci1jYWxsIGJ1ZGdldCByYXRoZXIgdGhhbiBhIGxpbWl0IG9uIHRvdGFsIHdhaXQgdGltZTogaXRzIG9ubHlcbiAqIGpvYiBpcyB0byBib3VuZCBvbmUgcmVxdWVzdCBzbyBhIHN0YWxsZWQgY29ubmVjdGlvbiBjYW5ub3QgaG9sZCB0aGUgYXdhaXRpbmdcbiAqIHNpZGUgZm9yZXZlci5cbiAqXG4gKiA1MHMgaXMgdGhlIGxhcmdlc3QgYnVkZ2V0IGB3b3JsZC12ZXJjZWxgIGNhbiBhY3R1YWxseSByZXF1ZXN0OiBpdCBjbGFtcHMgdG9cbiAqIGBSRVFVRVNUX1RJTUVPVVRfTVNgICg2MHMpIG1pbnVzIDEwcyBvZiBoZWFkcm9vbSwgc28gdGhlIGJ1ZGdldCBpcyBhbHdheXNcbiAqIG9ic2VydmVkIGFzIGEgKnJlc3BvbnNlKiAoYSBub24tdGVybWluYWwgc25hcHNob3QpIHJhdGhlciB0aGFuIGFzIGFcbiAqIGNsaWVudC1zaWRlIHRpbWVvdXQuIEFza2luZyBmb3IgbW9yZSBpcyBzaWxlbnRseSByZWR1Y2VkIHRvIHRoYXQsIHNvIHJhaXNpbmdcbiAqIHRoaXMgd2l0aG91dCBhbHNvIHJhaXNpbmcgYFdPUktGTE9XX1JFUVVFU1RfVElNRU9VVF9NU2AgaGFzIG5vIGVmZmVjdC5cbiAqL1xuY29uc3QgUkVUVVJOX1ZBTFVFX1dBSVRfVElNRU9VVF9NUyA9IDUwXzAwMDtcblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJldHVyblZhbHVlV2FpdFRpbWVvdXRNcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19SRVRVUk5fVkFMVUVfV0FJVF9NUycsXG4gICAgUkVUVVJOX1ZBTFVFX1dBSVRfVElNRU9VVF9NUyxcbiAgICB7IGludGVnZXI6IHRydWUsIG1pbjogMSB9XG4gICk7XG59XG5cbi8qKlxuICogSG93IG1hbnkgY29uc2VjdXRpdmUgbG9uZy1wb2xsIGNhbGxzIGBhd2FpdCBydW4ucmV0dXJuVmFsdWVgIHdpbGwgbWFrZVxuICogYmVmb3JlIGZhbGxpbmcgYmFjayB0byBpbnRlcnZhbCBwb2xsaW5nIGZvciB0aGUgcmVzdCBvZiB0aGUgd2FpdC5cbiAqXG4gKiBBIGNhcCBpcyB3b3J0aCBoYXZpbmcgYmVjYXVzZSBhIHdhaXQgdGhhdCBrZWVwcyByZXR1cm5pbmcgbm9uLXRlcm1pbmFsIGlzXG4gKiBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG9uZSB0aGF0IGlzIG5vdCB3b3JraW5nLCBhbmQgaW50ZXJ2YWwgcG9sbGluZyBpcyB0aGVcbiAqIGJlaGF2aW9yIHdlIGtub3cgaXMgY29ycmVjdC4gSXQgZG9lcyAqKm5vdCoqIGVuZCB0aGUgYXdhaXQ6IGEgcnVuIGxlZ2l0aW1hdGVseVxuICogbGFzdHMgaG91cnMgb3IgZGF5cywgc28gZXhoYXVzdGluZyB0aGUgY2FwIHN3aXRjaGVzIHN0cmF0ZWd5IGFuZCBrZWVwc1xuICogd2FpdGluZyByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAqXG4gKiBOb3RlIHRoZSBjb25zZXF1ZW5jZSwgc2luY2UgaXQgY3V0cyBhZ2FpbnN0IHRoZSByZWFzb24gdGhlIGxvbmcgcG9sbCBleGlzdHM6XG4gKiBhIHJ1biBzdGlsbCBnb2luZyBhZnRlciBgTUFYIHggYnVkZ2V0YCAofjggbWludXRlcyBhdCB0aGUgZGVmYXVsdHMpIHNwZW5kc1xuICogdGhlIHJlbWFpbmRlciBvZiBpdHMgbGlmZSBwb2xsaW5nIG9uY2UgcGVyXG4gKiBgV09SS0ZMT1dfUkVUVVJOX1ZBTFVFX1BPTExfSU5URVJWQUxfTVNgLCB3aGljaCBpcyBtb3JlIHJlcXVlc3RzIHRoYW5cbiAqIGNvbnRpbnVpbmcgdG8gbG9uZyBwb2xsIHdvdWxkIGhhdmUgY29zdC4gUnVucyB0aGF0IG91dGxpdmUgdGhlIGNhcCBhcmVcbiAqIGV4YWN0bHkgdGhlIG9uZXMgdGhlIHJlcXVlc3QgcmVkdWN0aW9uIGhlbHBlZCBtb3N0LlxuICovXG5jb25zdCBSRVRVUk5fVkFMVUVfTUFYX0xPTkdfUE9MTFMgPSAxMDtcblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJldHVyblZhbHVlTWF4TG9uZ1BvbGxzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX1JFVFVSTl9WQUxVRV9NQVhfTE9OR19QT0xMUycsXG4gICAgUkVUVVJOX1ZBTFVFX01BWF9MT05HX1BPTExTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBhd2FpdCBydW4ucmV0dXJuVmFsdWVgIG1heSB1c2UgdGhlIFdvcmxkJ3MgbG9uZyBwb2xsXG4gKiAoYHJ1bnMud2FpdEZvclRlcm1pbmFsU3RhdHVzYCkgaW5zdGVhZCBvZiBpbnRlcnZhbC1wb2xsaW5nIGBydW5zLmdldGAuXG4gKlxuICogRGVmYXVsdCAqKk9OKiogd2hlcmV2ZXIgdGhlIFdvcmxkIGltcGxlbWVudHMgdGhlIG1ldGhvZDsgYSBXb3JsZCB0aGF0IGRvZXNcbiAqIG5vdCBpcyBhbHJlYWR5IG9uIHRoZSBpbnRlcnZhbCBwYXRoIHdpdGggbm90aGluZyB0byBzd2l0Y2ggb2ZmLiBSZWFkc1xuICogYHByb2Nlc3MuZW52LldPUktGTE9XX1JFVFVSTl9WQUxVRV9MT05HX1BPTExgIGxhemlseTsgYW4gZXhwbGljaXQgYCcwJ2AgL1xuICogYCdmYWxzZSdgIGlzIHRoZSBraWxsIHN3aXRjaCwgcmVzdG9yaW5nIHRoZSBmaXhlZC1pbnRlcnZhbCBwb2xsIGV4YWN0bHkgYXNcbiAqIGl0IGJlaGF2ZWQgYmVmb3JlIHRoZSBmYXN0IHBhdGggZXhpc3RlZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmV0dXJuVmFsdWVMb25nUG9sbEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX1JFVFVSTl9WQUxVRV9MT05HX1BPTEw7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEocmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZScpO1xufVxuXG4vKipcbiAqIEEgYFJlYWRhYmxlU3RyZWFtYCBleHRlbmRlZCB3aXRoIHdvcmtmbG93LXNwZWNpZmljIGhlbHBlcnMuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW08UiA9IGFueT4gPSBSZWFkYWJsZVN0cmVhbTxSPiAmIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhaWwgaW5kZXggKGluZGV4IG9mIHRoZSBsYXN0IGtub3duIGNodW5rLCAwLWJhc2VkKSBvZiB0aGVcbiAgICogdW5kZXJseWluZyB3b3JrZmxvdyBzdHJlYW0uIFVzZWZ1bCBmb3IgcmVzb2x2aW5nIGEgbmVnYXRpdmUgYHN0YXJ0SW5kZXhgXG4gICAqIGludG8gYW4gYWJzb2x1dGUgcG9zaXRpb24sIGZvciBleGFtcGxlLCB3aGVuIGJ1aWxkaW5nIHJlY29ubmVjdGlvblxuICAgKiBlbmRwb2ludHMgdGhhdCBuZWVkIHRvIGluZm9ybSB0aGUgY2xpZW50IHdoZXJlIHRoZSBzdHJlYW0gc3RhcnRzLlxuICAgKlxuICAgKiBSZXR1cm5zIGAtMWAgd2hlbiBubyBjaHVua3MgaGF2ZSBiZWVuIHdyaXR0ZW4geWV0LlxuICAgKi9cbiAgZ2V0VGFpbEluZGV4KCk6IFByb21pc2U8bnVtYmVyPjtcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB3b3JrZmxvdydzIHJlYWRhYmxlIHN0cmVhbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lc3BhY2UgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtdWx0aXBsZSBzdHJlYW1zIGFzc29jaWF0ZWRcbiAgICogd2l0aCB0aGUgc2FtZSB3b3JrZmxvdyBydW4uXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggbnVtYmVyIG9mIHRoZSBzdGFydGluZyBjaHVuayB0byBiZWdpbiByZWFkaW5nIHRoZSBzdHJlYW0gZnJvbS5cbiAgICogTmVnYXRpdmUgdmFsdWVzIHN0YXJ0IGZyb20gdGhlIGVuZCAoZS5nLiAtMyByZWFkcyB0aGUgbGFzdCAzIGNodW5rcykuXG4gICAqL1xuICBzdGFydEluZGV4PzogbnVtYmVyO1xuICAvKipcbiAgICogQW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlIGJlZm9yZSBwYXVzaW5nIG9yIHRlcm1pbmF0aW5nIHRoZVxuICAgKiBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAgICogKGkuZS4gdXNpbmcgW2B3YWl0VW50aWwoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9FeHRlbmRhYmxlRXZlbnQvd2FpdFVudGlsKSBvciBzaW1pbGFyKS5cbiAgICovXG4gIG9wcz86IFByb21pc2U8YW55PltdO1xuICAvKipcbiAgICogVGhlIGdsb2JhbCBvYmplY3QgdG8gdXNlIGZvciBoeWRyYXRpbmcgdHlwZXMgZnJvbSB0aGUgZ2xvYmFsIHNjb3BlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgW2BnbG9iYWxUaGlzYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZ2xvYmFsVGhpcyl9LlxuICAgKi9cbiAgZ2xvYmFsPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgY2xhc3MgZm9yIGEgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgY2xhc3MgUnVuPFRSZXN1bHQ+IHtcbiAgc3RhdGljIFtXT1JLRkxPV19TRVJJQUxJWkVdKGluc3RhbmNlOiBSdW48dW5rbm93bj4pIHtcbiAgICByZXR1cm4geyBydW5JZDogaW5zdGFuY2UucnVuSWQsIHJlc2lsaWVudFN0YXJ0OiBpbnN0YW5jZS4jcmVzaWxpZW50U3RhcnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfREVTRVJJQUxJWkVdKGRhdGE6IHtcbiAgICBydW5JZDogc3RyaW5nO1xuICAgIHJlc2lsaWVudFN0YXJ0PzogYm9vbGVhbjtcbiAgfSkge1xuICAgIHJldHVybiBuZXcgUnVuKGRhdGEucnVuSWQsIHsgcmVzaWxpZW50U3RhcnQ6IGRhdGEucmVzaWxpZW50U3RhcnQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqL1xuICBydW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ybGQgb2JqZWN0LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICN3b3JsZFByb21pc2U6IFByb21pc2U8V29ybGQ+IHwgdW5kZWZpbmVkO1xuICBnZXQgI2xhenlXb3JsZFByb21pc2UoKSB7XG4gICAgaWYgKCF0aGlzLiN3b3JsZFByb21pc2UpIHRoaXMuI3dvcmxkUHJvbWlzZSA9IGdldFdvcmxkTGF6eSgpO1xuICAgIHJldHVybiB0aGlzLiN3b3JsZFByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2FjaGVkIGVuY3J5cHRpb24ga2V5IHJlc29sdXRpb24uIFJlc29sdmVkIG9uY2Ugb24gZmlyc3QgdXNlIGFuZFxuICAgKiByZXVzZWQgZm9yIHJldHVyblZhbHVlLCBnZXRSZWFkYWJsZSgpLCBldGMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgI2VuY3J5cHRpb25LZXlQcm9taXNlOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgcnVuX2NyZWF0ZWQgZmFpbGVkIGFuZCB0aGUgcnVuIG1heSBub3QgZXhpc3QgeWV0ICh0aGVcbiAgICogcmVzaWxpZW50IHN0YXJ0IHBhdGggd2lsbCBjcmVhdGUgaXQgdmlhIHJ1bl9zdGFydGVkKS4gcG9sbFJldHVyblZhbHVlXG4gICAqIHJldHJpZXMgb24gV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIG9ubHkgd2hlbiB0aGlzIGZsYWcgaXMgc2V0IHNvXG4gICAqIHRoYXQgbm9ybWFsIHJ1bnMgZmFpbCBmYXN0IG9uIDQwNC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICAjcmVzaWxpZW50U3RhcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBvcHRzPzogeyByZXNpbGllbnRTdGFydD86IGJvb2xlYW4gfSkge1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLiNyZXNpbGllbnRTdGFydCA9IG9wdHM/LnJlc2lsaWVudFN0YXJ0ID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuZCBjYWNoZXMgdGhlIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIHJ1bi5cbiAgICogVGhlIGtleSBpcyB0aGUgc2FtZSBmb3IgdGhlIGxpZmV0aW1lIG9mIGEgcnVuLCBzbyBpdCBvbmx5IG5lZWRzXG4gICAqIHRvIGJlIHJlc29sdmVkIG9uY2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgI2dldEVuY3J5cHRpb25LZXkocnVuPzogV29ya2Zsb3dSdW4pOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMuI2VuY3J5cHRpb25LZXlQcm9taXNlKSB7XG4gICAgICB0aGlzLiNlbmNyeXB0aW9uS2V5UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgdGhpcy4jbGF6eVdvcmxkUHJvbWlzZTtcbiAgICAgICAgY29uc3QgcnVuRGF0YSA9IHJ1biA/PyAoYXdhaXQgd29ybGQucnVucy5nZXQodGhpcy5ydW5JZCkpO1xuICAgICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuRGF0YSk7XG4gICAgICAgIHJldHVybiByYXdLZXkgPyBhd2FpdCBkZXJpdmVSdW5QYXlsb2FkS2V5cyhyYXdLZXkpIDogdW5kZWZpbmVkO1xuICAgICAgfSkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI2VuY3J5cHRpb25LZXlQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmVycyBmZXRjaGluZyB0aGUgcnVuIGFuZCBpdHMgZW5jcnlwdGlvbiBrZXkgdW50aWwgYSByZWFkYWJsZSBpcyBmaXJzdFxuICAgKiBjb25zdW1lZC4gVGhlIGZpcnN0IHB1bGwgcHJlZmV0Y2hlcyBpdCBzbyBhbiBlbmNyeXB0ZWQgZmlyc3QgZnJhbWUgY2FuIGpvaW5cbiAgICogdGhlIGxvb2t1cDsgdGhpcyBhbHNvIGFwcGxpZXMgdG8gYW4gZW1wdHkgY29uc3VtZWQgc3RyZWFtLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICNnZXRFbmNyeXB0aW9uS2V5TGF6aWx5KCk6ICgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoKSA9PiB0aGlzLiNnZXRFbmNyeXB0aW9uS2V5KCk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJydXB0cyBwZW5kaW5nIGBzbGVlcCgpYCBjYWxscywgcmVzdW1pbmcgdGhlIHdvcmtmbG93IGVhcmx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIHRvIHRhcmdldCBzcGVjaWZpYyBzbGVlcCBjYWxscyBieSBjb3JyZWxhdGlvbiBJRC5cbiAgICogICBJZiBub3QgcHJvdmlkZWQsIGFsbCBwZW5kaW5nIHNsZWVwIGNhbGxzIHdpbGwgYmUgaW50ZXJydXB0ZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFN0b3BTbGVlcFJlc3VsdH0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzbGVlcCBjYWxscyB0aGF0IHdlcmUgaW50ZXJydXB0ZWQuXG4gICAqL1xuICBhc3luYyB3YWtlVXAob3B0aW9ucz86IFN0b3BTbGVlcE9wdGlvbnMpOiBQcm9taXNlPFN0b3BTbGVlcFJlc3VsdD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHdha2VVcFJ1bihhd2FpdCB0aGlzLiNsYXp5V29ybGRQcm9taXNlLCB0aGlzLnJ1bklkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY2FuY2VsbGF0aW9uIHNldHRpbmdzLiBgY2FuY2VsUmVhc29uYCByZWNvcmRzIGFcbiAgICogICBmcmVlLXRleHQgcmVhc29uIChtYXggNTEyIGNoYXJzKSBvbiB0aGUgcnVuX2NhbmNlbGxlZCBldmVudCwgc3VyZmFjZWQgaW5cbiAgICogICB0aGUgcnVuIGRldGFpbCB2aWV3LlxuICAgKi9cbiAgYXN5bmMgY2FuY2VsKG9wdGlvbnM/OiBDYW5jZWxSdW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZSh0aGlzLnJ1bklkLCB7XG4gICAgICBldmVudFR5cGU6ICdydW5fY2FuY2VsbGVkJyxcbiAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgIC4uLihvcHRpb25zPy5jYW5jZWxSZWFzb24gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgZXZlbnREYXRhOiB7IGNhbmNlbFJlYXNvbjogb3B0aW9ucy5jYW5jZWxSZWFzb24gfSB9XG4gICAgICAgIDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IHJ1biBleGlzdHMuXG4gICAqL1xuICBnZXQgZXhpc3RzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQodGhpcy5ydW5JZCwgeyByZXNvbHZlRGF0YTogJ25vbmUnIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIGdldCBzdGF0dXMoKTogUHJvbWlzZTxXb3JrZmxvd1J1blN0YXR1cz4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQodGhpcy5ydW5JZCwgeyByZXNvbHZlRGF0YTogJ25vbmUnIH0pXG4gICAgICAgIC50aGVuKChydW4pID0+IHJ1bi5zdGF0dXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqIFBvbGxzIHRoZSB3b3JrZmxvdyByZXR1cm4gdmFsdWUgdW50aWwgdGhlIHdvcmtmbG93IHJ1biBjb21wbGV0ZXMuXG4gICAqL1xuICBnZXQgcmV0dXJuVmFsdWUoKTogUHJvbWlzZTxUUmVzdWx0PiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICByZXR1cm4gdGhpcy4jcG9sbFJldHVyblZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93LlxuICAgKi9cbiAgZ2V0IHdvcmtmbG93TmFtZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi53b3JrZmxvd05hbWUpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IHJ1biB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGdldCBjcmVhdGVkQXQoKTogUHJvbWlzZTxEYXRlPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICByZXR1cm4gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZS50aGVuKCh3b3JsZCkgPT5cbiAgICAgIHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQpLnRoZW4oKHJ1bikgPT4gcnVuLmNyZWF0ZWRBdClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgd29ya2Zsb3cgcnVuIHN0YXJ0ZWQgZXhlY3V0aW9uLlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgd29ya2Zsb3cgaGFzIG5vdCBzdGFydGVkIHlldC5cbiAgICovXG4gIGdldCBzdGFydGVkQXQoKTogUHJvbWlzZTxEYXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICByZXR1cm4gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZS50aGVuKCh3b3JsZCkgPT5cbiAgICAgIHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQpLnRoZW4oKHJ1bikgPT4gcnVuLnN0YXJ0ZWRBdClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgd29ya2Zsb3cgcnVuIGNvbXBsZXRlZC5cbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIHdvcmtmbG93IGhhcyBub3QgY29tcGxldGVkIHlldC5cbiAgICovXG4gIGdldCBjb21wbGV0ZWRBdCgpOiBQcm9taXNlPERhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICAndXNlIHN0ZXAnO1xuICAgIHJldHVybiB0aGlzLiNsYXp5V29ybGRQcm9taXNlLnRoZW4oKHdvcmxkKSA9PlxuICAgICAgd29ybGQucnVucy5nZXQodGhpcy5ydW5JZCkudGhlbigocnVuKSA9PiBydW4uY29tcGxldGVkQXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVhZGFibGUgc3RyZWFtIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqL1xuICBnZXQgcmVhZGFibGUoKTogV29ya2Zsb3dSZWFkYWJsZVN0cmVhbSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVhZGFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHdvcmtmbG93IHJ1bidzIGRlZmF1bHQgcmVhZGFibGUgc3RyZWFtLCB3aGljaCByZWFkcyBjaHVua3NcbiAgICogd3JpdHRlbiB0byB0aGUgY29ycmVzcG9uZGluZyB3cml0YWJsZSBzdHJlYW0ge0BsaW5rIGdldFdyaXRhYmxlfS5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBoYXMgYW4gYWRkaXRpb25hbCB7QGxpbmsgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbS5nZXRUYWlsSW5kZXggfCBnZXRUYWlsSW5kZXgoKX1cbiAgICogaGVscGVyIHRoYXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qga25vd24gY2h1bmsuIFRoaXMgaXMgdXNlZnVsIHdoZW5cbiAgICogYnVpbGRpbmcgcmVjb25uZWN0aW9uIGVuZHBvaW50cyB0aGF0IG5lZWQgdG8gaW5mb3JtIGNsaWVudHMgd2hlcmUgdGhlXG4gICAqIHN0cmVhbSBzdGFydHMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSByZWFkYWJsZSBzdHJlYW0uXG4gICAqIEByZXR1cm5zIEEgYFdvcmtmbG93UmVhZGFibGVTdHJlYW1gIGZvciB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgZ2V0UmVhZGFibGU8UiA9IGFueT4oXG4gICAgb3B0aW9uczogV29ya2Zsb3dSZWFkYWJsZVN0cmVhbU9wdGlvbnMgPSB7fVxuICApOiBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtPFI+IHtcbiAgICAndXNlIHN0ZXAnO1xuICAgIGNvbnN0IHsgb3BzID0gW10sIGdsb2JhbCA9IGdsb2JhbFRoaXMsIHN0YXJ0SW5kZXgsIG5hbWVzcGFjZSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBuYW1lID0gZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCh0aGlzLnJ1bklkLCBuYW1lc3BhY2UpO1xuICAgIC8vIFRoZSByZXNvbHZlciBzdGFydHMgb25seSBvbiB0aGUgcmVhZGFibGUncyBmaXJzdCBwdWxsLCBzbyBjb25zdHJ1Y3Rpb25cbiAgICAvLyBpcyBpbmVydC4gQSBjb25zdW1lZCBlbXB0eSBzdHJlYW0gc3RpbGwgcGVyZm9ybXMgdGhlIHNwZWN1bGF0aXZlIGxvb2t1cFxuICAgIC8vIHRvIGtlZXAgdGhlIGZpcnN0IGVuY3J5cHRlZC1mcmFtZSBwYXRoIGNvbmN1cnJlbnQuXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHRoaXMuI2dldEVuY3J5cHRpb25LZXlMYXppbHkoKTtcbiAgICBjb25zdCBzdHJlYW0gPSBnZXRSdW5SZWFkYWJsZVN0cmVhbTxSPihcbiAgICAgIGdsb2JhbCxcbiAgICAgIG9wcyxcbiAgICAgIHRoaXMucnVuSWQsXG4gICAgICBuYW1lLFxuICAgICAgc3RhcnRJbmRleCxcbiAgICAgIGVuY3J5cHRpb25LZXlcbiAgICApO1xuXG4gICAgY29uc3Qgd29ybGRQcm9taXNlID0gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZTtcbiAgICBjb25zdCBydW5JZCA9IHRoaXMucnVuSWQ7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc3RyZWFtLCB7XG4gICAgICBnZXRUYWlsSW5kZXg6IGFzeW5jICgpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHdvcmxkUHJvbWlzZTtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0SW5mbyhydW5JZCwgbmFtZSk7XG4gICAgICAgIHJldHVybiBpbmZvLnRhaWxJbmRleDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGFzeW5jICNyZXNvbHZlVGVybWluYWxSZXR1cm5WYWx1ZShydW46IFdvcmtmbG93UnVuKTogUHJvbWlzZTxUUmVzdWx0PiB7XG4gICAgaWYgKHJ1bi5zdGF0dXMgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgdGhpcy4jZ2V0RW5jcnlwdGlvbktleShydW4pO1xuICAgICAgcmV0dXJuIGF3YWl0IGh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICAgICAgICBydW4ub3V0cHV0LFxuICAgICAgICB0aGlzLnJ1bklkLFxuICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChydW4uc3RhdHVzID09PSAnY2FuY2VsbGVkJykge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuQ2FuY2VsbGVkRXJyb3IodGhpcy5ydW5JZCk7XG4gICAgfVxuXG4gICAgaWYgKHJ1bi5zdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgICAvLyBIeWRyYXRlIHRoZSBzZXJpYWxpemVkIHJ1biBlcnJvciBzbyB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlXG4gICAgICAvLyAod2l0aCBpdHMgdHlwZSBpZGVudGl0eSwgY2F1c2UgY2hhaW4sIGV0Yy4pIGlzIHNldCBhcyB0aGVcbiAgICAgIC8vIGBjYXVzZWAgb24gV29ya2Zsb3dSdW5GYWlsZWRFcnJvci5cbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLiNnZXRFbmNyeXB0aW9uS2V5KHJ1bik7XG4gICAgICBsZXQgaHlkcmF0ZWRFcnJvcjogdW5rbm93bjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGh5ZHJhdGVkRXJyb3IgPSBhd2FpdCBoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgcnVuLmVycm9yLFxuICAgICAgICAgIHRoaXMucnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElmIGh5ZHJhdGlvbiBmYWlscywgc3VyZmFjZSBhIGdlbmVyaWMgZmFsbGJhY2sgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gbGVhdmluZyB0aGUgdXNlciB3aXRoIGEgcmF3IFVpbnQ4QXJyYXkuIFRoZSBydW4ncyBlcnJvckNvZGVcbiAgICAgICAgLy8gaXMgc3RpbGwgcHJlc2VydmVkIG9uIHRoZSB0aHJvd24gV29ya2Zsb3dSdW5GYWlsZWRFcnJvci5cbiAgICAgICAgaHlkcmF0ZWRFcnJvciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIGh5ZHJhdGUgd29ya2Zsb3cgcnVuIGVycm9yJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW5GYWlsZWRFcnJvcih0aGlzLnJ1bklkLCBoeWRyYXRlZEVycm9yLCB7XG4gICAgICAgIGVycm9yQ29kZTogcnVuLmVycm9yQ29kZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRlcm1pbmFsIHN0YXR1c2VzIGFyZSBpbW11dGFibGUsIGJ1dCBpZiBhbiBpbmNvbnNpc3RlbnQgd29ybGQgcmV0dXJuc1xuICAgIC8vIGEgbm9uLXRlcm1pbmFsIGZ1bGwgcmVjb3JkLCByZXN1bWUgcG9sbGluZyBzYWZlbHkuXG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IodGhpcy5ydW5JZCwgcnVuLnN0YXR1cyk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZSB1bnRpbCB0aGUgd29ya2Zsb3cgcnVuIGNvbXBsZXRlcy5cbiAgICogQGludGVybmFsXG4gICAqIEByZXR1cm5zIFRoZSB3b3JrZmxvdyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhc3luYyAjcG9sbFJldHVyblZhbHVlKCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgdGhpcy4jbGF6eVdvcmxkUHJvbWlzZTtcblxuICAgIC8vIFdoZW4gcmVzaWxpZW50U3RhcnQgaXMgdHJ1ZSwgcnVuX2NyZWF0ZWQgZmFpbGVkIGFuZCB0aGUgcnVuIG1heVxuICAgIC8vIG5vdCBleGlzdCB5ZXQuIFJldHJ5IG9uIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciB1cCB0byAzIHRpbWVzXG4gICAgLy8gKDFzICsgM3MgKyA2cyA9IDEwcyB0b3RhbCkgdG8gZ2l2ZSB0aGUgcXVldWUgdGltZSB0byBkZWxpdmVyXG4gICAgLy8gYW5kIHRoZSBydW50aW1lIHRvIGNyZWF0ZSB0aGUgcnVuIHZpYSBydW5fc3RhcnRlZC5cbiAgICAvLyBXaGVuIHJlc2lsaWVudFN0YXJ0IGlzIGZhbHNlLCA0MDQgaXMgYSByZWFsIGVycm9yOiBmYWlsIGZhc3QuXG4gICAgbGV0IG5vdEZvdW5kUmV0cmllcyA9IDA7XG4gICAgY29uc3QgTk9UX0ZPVU5EX01BWF9SRVRSSUVTID0gdGhpcy4jcmVzaWxpZW50U3RhcnQgPyAzIDogMDtcbiAgICBjb25zdCBOT1RfRk9VTkRfREVMQVlTID0gWzFfMDAwLCAzXzAwMCwgNl8wMDBdO1xuXG4gICAgLy8gUHJlZmVyIHRoZSBXb3JsZCdzIGxvbmcgcG9sbDogb25lIHJlYWQgdGhhdCB0aGUgYmFja2VuZCBob2xkcyBvcGVuXG4gICAgLy8gdW50aWwgdGhlIHJ1biBmaW5pc2hlcywgaW5zdGVhZCBvZiBhc2tpbmcgYWdhaW4gZXZlcnkgc2Vjb25kIGFuZFxuICAgIC8vIHBheWluZyB1cCB0byBhIGZ1bGwgaW50ZXJ2YWwgb2YgcXVhbnRpemF0aW9uIG9uIGEgcnVuIHRoYXQgYWxyZWFkeVxuICAgIC8vIGVuZGVkLiBXb3JsZHMgdGhhdCBjYW5ub3Qgd2FpdCBkbyBub3QgaW1wbGVtZW50IGl0IChzZWVcbiAgICAvLyBgU3RvcmFnZVsncnVucyddLndhaXRGb3JUZXJtaW5hbFN0YXR1c2ApIGFuZCB0aGlzIHN0YXlzIHRoZSBleGFjdFxuICAgIC8vIGZpeGVkLWludGVydmFsIHBvbGwgaXQgaGFzIGFsd2F5cyBiZWVuLCBhcyBkb2VzIGFuIG9wZXJhdG9yIHdob1xuICAgIC8vIHRocm93cyB0aGUgYFdPUktGTE9XX1JFVFVSTl9WQUxVRV9MT05HX1BPTEw9MGAga2lsbCBzd2l0Y2guXG4gICAgY29uc3Qgd2FpdEZvclRlcm1pbmFsU3RhdHVzID0gaXNSZXR1cm5WYWx1ZUxvbmdQb2xsRW5hYmxlZCgpXG4gICAgICA/IHdvcmxkLnJ1bnMud2FpdEZvclRlcm1pbmFsU3RhdHVzPy5iaW5kKHdvcmxkLnJ1bnMpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIExvbmcgcG9sbHMgc3BlbnQgc28gZmFyLiBPbmNlIHRoZSBjYXAgaXMgcmVhY2hlZCB0aGUgbG9vcCBrZWVwcyB3YWl0aW5nXG4gICAgLy8gYnV0IG9uIHRoZSBpbnRlcnZhbCBwYXRoLCB3aGljaCBpcyB0aGUgc3RyYXRlZ3kgd2Uga25vdyBpcyBjb3JyZWN0OyBzZWVcbiAgICAvLyBgUkVUVVJOX1ZBTFVFX01BWF9MT05HX1BPTExTYC4gTmV2ZXIgYSByZWFzb24gdG8gc3RvcCBhd2FpdGluZy5cbiAgICBsZXQgbG9uZ1BvbGxzID0gMDtcbiAgICBjb25zdCBtYXhMb25nUG9sbHMgPSBnZXRSZXR1cm5WYWx1ZU1heExvbmdQb2xscygpO1xuXG4gICAgLy8gTk9URTogd2hlbiB0aGlzIHBvbGwgcnVucyBpbnNpZGUgYSBzdGVwIChlLmcuIHRoZSBzdGVwIHRoYXQgYSBwYXJlbnRcbiAgICAvLyB3b3JrZmxvdyB1c2VzIHRvIGF3YWl0IGEgY2hpbGQgd29ya2Zsb3cncyBgcmV0dXJuVmFsdWVgKSwgaXQgYmxvY2tzXG4gICAgLy8gYSBxdWV1ZSB3b3JrZXIgc2xvdCBmb3IgYXMgbG9uZyBhcyB0aGUgY2hpbGQgcnVuIHRha2VzIHRvIGZpbmlzaC5cbiAgICAvLyBXb3JrZXItYmFzZWQgd29ybGRzIGxpa2UgYHdvcmxkLXBvc3RncmVzYCBtdXN0IGJlIHNpemVkIHRvIGNvdmVyIHRoZVxuICAgIC8vIHBlYWsgbnVtYmVyIG9mIHN1Y2ggcG9sbHMgaW4gZmxpZ2h0OyBzZWUgdGhlIGBxdWV1ZUNvbmN1cnJlbmN5YFxuICAgIC8vIGRlZmF1bHQgb24gdGhlIFBvc3RncmVzIHdvcmxkIGFuZCB0aGUgbm90ZXMgaW4gdGhlIGVhZ2VyLXByb2Nlc3NpbmdcbiAgICAvLyBjaGFuZ2Vsb2cgZm9yIGRldGFpbHMuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdGlvblN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBNZXRhZGF0YSBvbmx5LCBlaXRoZXIgd2F5OiB0aGUgc3RhdHVzIGlzIGFsbCB0aGlzIGl0ZXJhdGlvbiBuZWVkcyxcbiAgICAgICAgLy8gYW5kIHBheWxvYWQgcmVmcyBhcmUgcmVzb2x2ZWQgb25jZSBiZWxvdywgYWZ0ZXIgYSB0ZXJtaW5hbCBzdGF0dXMgaXNcbiAgICAgICAgLy8gb2JzZXJ2ZWQuXG4gICAgICAgIGNvbnN0IHVzZUxvbmdQb2xsID0gd2FpdEZvclRlcm1pbmFsU3RhdHVzICYmIGxvbmdQb2xscyA8IG1heExvbmdQb2xscztcbiAgICAgICAgaWYgKHVzZUxvbmdQb2xsKSBsb25nUG9sbHMrKztcbiAgICAgICAgY29uc3QgcnVuTWV0YWRhdGEgPSB1c2VMb25nUG9sbFxuICAgICAgICAgID8gYXdhaXQgd2FpdEZvclRlcm1pbmFsU3RhdHVzKHRoaXMucnVuSWQsIHtcbiAgICAgICAgICAgICAgdGltZW91dE1zOiBnZXRSZXR1cm5WYWx1ZVdhaXRUaW1lb3V0TXMoKSxcbiAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdub25lJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBhd2FpdCB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkLCB7XG4gICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAocnVuTWV0YWRhdGEuc3RhdHVzID09PSAnY2FuY2VsbGVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yKHRoaXMucnVuSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFBBWUxPQURfVEVSTUlOQUxfUlVOX1NUQVRVU0VTLmhhcyhydW5NZXRhZGF0YS5zdGF0dXMpKSB7XG4gICAgICAgICAgLy8gVGhlIHBvbGxpbmcgcmVhZCBhYm92ZSBkZWxpYmVyYXRlbHkgc2tpcHMgaW5wdXQvb3V0cHV0L2Vycm9yIHJlZnMuXG4gICAgICAgICAgLy8gUmVzb2x2ZSBwYXlsb2FkcyBvbmx5IG9uY2UgdGhlIHJ1biByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQodGhpcy5ydW5JZCwge1xuICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNyZXNvbHZlVGVybWluYWxSZXR1cm5WYWx1ZShydW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIG5vdCBjb21wbGV0ZWQgeWV0OiBzbGVlcCBhbmQgcG9sbCBhZ2Fpbi5cbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IodGhpcy5ydW5JZCwgcnVuTWV0YWRhdGEuc3RhdHVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgIC8vIFNwYWNlIGNvbnNlY3V0aXZlIG5vbi10ZXJtaW5hbCBvYnNlcnZhdGlvbnMgYXQgbGVhc3Qgb25lIHBvbGxcbiAgICAgICAgICAvLyBpbnRlcnZhbCBhcGFydC4gT24gdGhlIHBsYWluLXBvbGwgcGF0aCB0aGF0IGlzIHRoZSBmYW1pbGlhciBmaXhlZFxuICAgICAgICAgIC8vIHNsZWVwOyBvbiB0aGUgbG9uZy1wb2xsIHBhdGggdGhlIHdhaXQgaGFzIHVzdWFsbHkgYWxyZWFkeVxuICAgICAgICAgIC8vIG91dGxhc3RlZCB0aGUgaW50ZXJ2YWwgYW5kIHRoaXMgaXMgYSBuby1vcCwgYnV0IGl0IGFsc28gbWVhbnMgYVxuICAgICAgICAgIC8vIFdvcmxkIHdob3NlIHdhaXQgcmV0dXJucyBlYXJseSAoYSBiYWNrZW5kIHdpdGggbm8gbG9uZyBwb2xsLCBhXG4gICAgICAgICAgLy8gY2xhbXBlZCBidWRnZXQpIGRlZ3JhZGVzIHRvIGludGVydmFsIHBvbGxpbmcgaW5zdGVhZCBvZiBzcGlubmluZy5cbiAgICAgICAgICBjb25zdCByZW1haW5pbmdJbnRlcnZhbE1zID1cbiAgICAgICAgICAgIGdldFJldHVyblZhbHVlUG9sbEludGVydmFsTXMoKSAtIChEYXRlLm5vdygpIC0gaXRlcmF0aW9uU3RhcnRlZEF0KTtcbiAgICAgICAgICBpZiAocmVtYWluaW5nSW50ZXJ2YWxNcyA+IDApIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHJlbWFpbmluZ0ludGVydmFsTXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKGVycm9yKSAmJlxuICAgICAgICAgIG5vdEZvdW5kUmV0cmllcyA8IE5PVF9GT1VORF9NQVhfUkVUUklFU1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBkZWxheSA9IE5PVF9GT1VORF9ERUxBWVNbbm90Rm91bmRSZXRyaWVzXSE7XG4gICAgICAgICAgbm90Rm91bmRSZXRyaWVzKys7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBgUnVuYCBvYmplY3QgZm9yIGEgZ2l2ZW4gcnVuIElELlxuICpcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgb2J0YWluZWQgZnJvbSB7QGxpbmsgc3RhcnR9LlxuICogQHJldHVybnMgQSBgUnVuYCBvYmplY3QuXG4gKiBAdGhyb3dzIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciBpZiB0aGUgcnVuIElEIGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bjxUUmVzdWx0PihydW5JZDogc3RyaW5nKTogUnVuPFRSZXN1bHQ+IHtcbiAgcmV0dXJuIG5ldyBSdW4ocnVuSWQpO1xufVxuIl19
498
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcnVuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxlQUFlLEVBQ2YseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0Qiw0QkFBNEIsRUFDNUIsd0JBQXdCLEdBQ3pCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlDQUFpQyxFQUNqQyxvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLDBCQUEwQixFQUMxQiwwQkFBMEIsR0FDM0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFJTCxTQUFTLEdBQ1YsTUFBTSxXQUFXLENBQUM7QUFFbkIsTUFBTSw2QkFBNkIsR0FBRyxLQUFLLENBQUM7QUFDNUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsQ0FBb0I7SUFDL0QsV0FBVztJQUNYLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFFSCw0REFBNEQ7QUFDNUQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFckQsZ0JBQWdCO0FBQ2hCLE1BQU0sVUFBVSw0QkFBNEI7SUFDMUMsT0FBTyxTQUFTLENBQ2Qsd0NBQXdDLEVBQ3hDLDZCQUE2QixFQUM3QixFQUFFLE9B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VSxLQUFhO0lBQzNDLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvcixcbiAgV29ya2Zsb3dSdW5GYWlsZWRFcnJvcixcbiAgV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvcixcbiAgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IFdPUktGTE9XX0RFU0VSSUFMSVpFLCBXT1JLRkxPV19TRVJJQUxJWkUgfSBmcm9tICdAd29ya2Zsb3cvc2VyZGUnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd1J1biwgV29ya2Zsb3dSdW5TdGF0dXMsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGVudk51bWJlciB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZC9lbnYtY29uZmlnJztcbmltcG9ydCB7IFNQRUNfVkVSU0lPTl9DVVJSRU5UIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkL3NwZWMtdmVyc2lvbic7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRm9yd2FyZGVkV3JpdGFibGUsXG4gIGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleSxcbiAgZ2V0UnVuUmVhZGFibGVTdHJlYW0sXG4gIGh5ZHJhdGVSdW5FcnJvcixcbiAgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUsXG4gIHRhZ0ZvcndhcmRlZFdyaXRhYmxlVGFyZ2V0LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UnVuU3RyZWFtSWQgfSBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vZ2V0LXdvcmxkLWxhenkuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBDYW5jZWxSdW5PcHRpb25zLFxuICB0eXBlIFN0b3BTbGVlcE9wdGlvbnMsXG4gIHR5cGUgU3RvcFNsZWVwUmVzdWx0LFxuICB3YWtlVXBSdW4sXG59IGZyb20gJy4vcnVucy5qcyc7XG5cbmNvbnN0IFJFVFVSTl9WQUxVRV9QT0xMX0lOVEVSVkFMX01TID0gMV8wMDA7XG5jb25zdCBQQVlMT0FEX1RFUk1JTkFMX1JVTl9TVEFUVVNFUyA9IG5ldyBTZXQ8V29ya2Zsb3dSdW5TdGF0dXM+KFtcbiAgJ2NvbXBsZXRlZCcsXG4gICdmYWlsZWQnLFxuXSk7XG5cbi8vIEdpdmUgcmVzaWxpZW50IHN0YXJ0cyB1cCB0byAxMCBzZWNvbmRzIHRvIGNyZWF0ZSB0aGUgcnVuLlxuY29uc3QgTk9UX0ZPVU5EX1JFVFJZX0RFTEFZUyA9IFsxXzAwMCwgM18wMDAsIDZfMDAwXTtcblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJldHVyblZhbHVlUG9sbEludGVydmFsTXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUkVUVVJOX1ZBTFVFX1BPTExfSU5URVJWQUxfTVMnLFxuICAgIFJFVFVSTl9WQUxVRV9QT0xMX0lOVEVSVkFMX01TLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBIb3cgbG9uZyBhIHNpbmdsZSBgcnVucy53YWl0Rm9yVGVybWluYWxTdGF0dXNgIGNhbGwgbWF5IGJsb2NrIHdoaWxlIHdhaXRpbmdcbiAqIGZvciBhIHJ1biB0byBmaW5pc2guIFRoZSB3YWl0IGlzIHJlLWlzc3VlZCB1bnRpbCB0aGUgcnVuIGlzIHRlcm1pbmFsLCBzb1xuICogdGhpcyBpcyBhIHBlci1jYWxsIGJ1ZGdldCByYXRoZXIgdGhhbiBhIGxpbWl0IG9uIHRvdGFsIHdhaXQgdGltZTogaXRzIG9ubHlcbiAqIGpvYiBpcyB0byBib3VuZCBvbmUgcmVxdWVzdCBzbyBhIHN0YWxsZWQgY29ubmVjdGlvbiBjYW5ub3QgaG9sZCB0aGUgYXdhaXRpbmdcbiAqIHNpZGUgZm9yZXZlci5cbiAqXG4gKiA1MHMgaXMgdGhlIGxhcmdlc3QgYnVkZ2V0IGB3b3JsZC12ZXJjZWxgIGNhbiBhY3R1YWxseSByZXF1ZXN0OiBpdCBjbGFtcHMgdG9cbiAqIGBSRVFVRVNUX1RJTUVPVVRfTVNgICg2MHMpIG1pbnVzIDEwcyBvZiBoZWFkcm9vbSwgc28gdGhlIGJ1ZGdldCBpcyBhbHdheXNcbiAqIG9ic2VydmVkIGFzIGEgKnJlc3BvbnNlKiAoYSBub24tdGVybWluYWwgc25hcHNob3QpIHJhdGhlciB0aGFuIGFzIGFcbiAqIGNsaWVudC1zaWRlIHRpbWVvdXQuIEFza2luZyBmb3IgbW9yZSBpcyBzaWxlbnRseSByZWR1Y2VkIHRvIHRoYXQsIHNvIHJhaXNpbmdcbiAqIHRoaXMgd2l0aG91dCBhbHNvIHJhaXNpbmcgYFdPUktGTE9XX1JFUVVFU1RfVElNRU9VVF9NU2AgaGFzIG5vIGVmZmVjdC5cbiAqL1xuY29uc3QgUkVUVVJOX1ZBTFVFX1dBSVRfVElNRU9VVF9NUyA9IDUwXzAwMDtcblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJldHVyblZhbHVlV2FpdFRpbWVvdXRNcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19SRVRVUk5fVkFMVUVfV0FJVF9NUycsXG4gICAgUkVUVVJOX1ZBTFVFX1dBSVRfVElNRU9VVF9NUyxcbiAgICB7IGludGVnZXI6IHRydWUsIG1pbjogMSB9XG4gICk7XG59XG5cbi8qKlxuICogSG93IG1hbnkgY29uc2VjdXRpdmUgbG9uZy1wb2xsIGNhbGxzIGBhd2FpdCBydW4ucmV0dXJuVmFsdWVgIHdpbGwgbWFrZVxuICogYmVmb3JlIGZhbGxpbmcgYmFjayB0byBpbnRlcnZhbCBwb2xsaW5nIGZvciB0aGUgcmVzdCBvZiB0aGUgd2FpdC5cbiAqXG4gKiBBIGNhcCBpcyB3b3J0aCBoYXZpbmcgYmVjYXVzZSBhIHdhaXQgdGhhdCBrZWVwcyByZXR1cm5pbmcgbm9uLXRlcm1pbmFsIGlzXG4gKiBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG9uZSB0aGF0IGlzIG5vdCB3b3JraW5nLCBhbmQgaW50ZXJ2YWwgcG9sbGluZyBpcyB0aGVcbiAqIGJlaGF2aW9yIHdlIGtub3cgaXMgY29ycmVjdC4gSXQgZG9lcyAqKm5vdCoqIGVuZCB0aGUgYXdhaXQ6IGEgcnVuIGxlZ2l0aW1hdGVseVxuICogbGFzdHMgaG91cnMgb3IgZGF5cywgc28gZXhoYXVzdGluZyB0aGUgY2FwIHN3aXRjaGVzIHN0cmF0ZWd5IGFuZCBrZWVwc1xuICogd2FpdGluZyByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAqXG4gKiBOb3RlIHRoZSBjb25zZXF1ZW5jZSwgc2luY2UgaXQgY3V0cyBhZ2FpbnN0IHRoZSByZWFzb24gdGhlIGxvbmcgcG9sbCBleGlzdHM6XG4gKiBhIHJ1biBzdGlsbCBnb2luZyBhZnRlciBgTUFYIHggYnVkZ2V0YCAofjggbWludXRlcyBhdCB0aGUgZGVmYXVsdHMpIHNwZW5kc1xuICogdGhlIHJlbWFpbmRlciBvZiBpdHMgbGlmZSBwb2xsaW5nIG9uY2UgcGVyXG4gKiBgV09SS0ZMT1dfUkVUVVJOX1ZBTFVFX1BPTExfSU5URVJWQUxfTVNgLCB3aGljaCBpcyBtb3JlIHJlcXVlc3RzIHRoYW5cbiAqIGNvbnRpbnVpbmcgdG8gbG9uZyBwb2xsIHdvdWxkIGhhdmUgY29zdC4gUnVucyB0aGF0IG91dGxpdmUgdGhlIGNhcCBhcmVcbiAqIGV4YWN0bHkgdGhlIG9uZXMgdGhlIHJlcXVlc3QgcmVkdWN0aW9uIGhlbHBlZCBtb3N0LlxuICovXG5jb25zdCBSRVRVUk5fVkFMVUVfTUFYX0xPTkdfUE9MTFMgPSAxMDtcblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJldHVyblZhbHVlTWF4TG9uZ1BvbGxzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX1JFVFVSTl9WQUxVRV9NQVhfTE9OR19QT0xMUycsXG4gICAgUkVUVVJOX1ZBTFVFX01BWF9MT05HX1BPTExTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBhd2FpdCBydW4ucmV0dXJuVmFsdWVgIG1heSB1c2UgdGhlIFdvcmxkJ3MgbG9uZyBwb2xsXG4gKiAoYHJ1bnMud2FpdEZvclRlcm1pbmFsU3RhdHVzYCkgaW5zdGVhZCBvZiBpbnRlcnZhbC1wb2xsaW5nIGBydW5zLmdldGAuXG4gKlxuICogRGVmYXVsdCAqKk9OKiogd2hlcmV2ZXIgdGhlIFdvcmxkIGltcGxlbWVudHMgdGhlIG1ldGhvZDsgYSBXb3JsZCB0aGF0IGRvZXNcbiAqIG5vdCBpcyBhbHJlYWR5IG9uIHRoZSBpbnRlcnZhbCBwYXRoIHdpdGggbm90aGluZyB0byBzd2l0Y2ggb2ZmLiBSZWFkc1xuICogYHByb2Nlc3MuZW52LldPUktGTE9XX1JFVFVSTl9WQUxVRV9MT05HX1BPTExgIGxhemlseTsgYW4gZXhwbGljaXQgYCcwJ2AgL1xuICogYCdmYWxzZSdgIGlzIHRoZSBraWxsIHN3aXRjaCwgcmVzdG9yaW5nIHRoZSBmaXhlZC1pbnRlcnZhbCBwb2xsIGV4YWN0bHkgYXNcbiAqIGl0IGJlaGF2ZWQgYmVmb3JlIHRoZSBmYXN0IHBhdGggZXhpc3RlZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmV0dXJuVmFsdWVMb25nUG9sbEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX1JFVFVSTl9WQUxVRV9MT05HX1BPTEw7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEocmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZScpO1xufVxuXG4vKipcbiAqIEEgYFJlYWRhYmxlU3RyZWFtYCBleHRlbmRlZCB3aXRoIHdvcmtmbG93LXNwZWNpZmljIGhlbHBlcnMuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW08UiA9IGFueT4gPSBSZWFkYWJsZVN0cmVhbTxSPiAmIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhaWwgaW5kZXggKGluZGV4IG9mIHRoZSBsYXN0IGtub3duIGNodW5rLCAwLWJhc2VkKSBvZiB0aGVcbiAgICogdW5kZXJseWluZyB3b3JrZmxvdyBzdHJlYW0uIFVzZWZ1bCBmb3IgcmVzb2x2aW5nIGEgbmVnYXRpdmUgYHN0YXJ0SW5kZXhgXG4gICAqIGludG8gYW4gYWJzb2x1dGUgcG9zaXRpb24sIGZvciBleGFtcGxlLCB3aGVuIGJ1aWxkaW5nIHJlY29ubmVjdGlvblxuICAgKiBlbmRwb2ludHMgdGhhdCBuZWVkIHRvIGluZm9ybSB0aGUgY2xpZW50IHdoZXJlIHRoZSBzdHJlYW0gc3RhcnRzLlxuICAgKlxuICAgKiBSZXR1cm5zIGAtMWAgd2hlbiBubyBjaHVua3MgaGF2ZSBiZWVuIHdyaXR0ZW4geWV0LlxuICAgKi9cbiAgZ2V0VGFpbEluZGV4KCk6IFByb21pc2U8bnVtYmVyPjtcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB3b3JrZmxvdydzIHJlYWRhYmxlIHN0cmVhbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lc3BhY2UgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtdWx0aXBsZSBzdHJlYW1zIGFzc29jaWF0ZWRcbiAgICogd2l0aCB0aGUgc2FtZSB3b3JrZmxvdyBydW4uXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggbnVtYmVyIG9mIHRoZSBzdGFydGluZyBjaHVuayB0byBiZWdpbiByZWFkaW5nIHRoZSBzdHJlYW0gZnJvbS5cbiAgICogTmVnYXRpdmUgdmFsdWVzIHN0YXJ0IGZyb20gdGhlIGVuZCAoZS5nLiAtMyByZWFkcyB0aGUgbGFzdCAzIGNodW5rcykuXG4gICAqL1xuICBzdGFydEluZGV4PzogbnVtYmVyO1xuICAvKipcbiAgICogQW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlIGJlZm9yZSBwYXVzaW5nIG9yIHRlcm1pbmF0aW5nIHRoZVxuICAgKiBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAgICogKGkuZS4gdXNpbmcgW2B3YWl0VW50aWwoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9FeHRlbmRhYmxlRXZlbnQvd2FpdFVudGlsKSBvciBzaW1pbGFyKS5cbiAgICovXG4gIG9wcz86IFByb21pc2U8YW55PltdO1xuICAvKipcbiAgICogVGhlIGdsb2JhbCBvYmplY3QgdG8gdXNlIGZvciBoeWRyYXRpbmcgdHlwZXMgZnJvbSB0aGUgZ2xvYmFsIHNjb3BlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgW2BnbG9iYWxUaGlzYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZ2xvYmFsVGhpcyl9LlxuICAgKi9cbiAgZ2xvYmFsPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyBhIHdyaXRhYmxlIG9udG8gYSB3b3JrZmxvdyBydW4ncyBzdHJlYW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dSdW5Xcml0YWJsZVN0cmVhbU9wdGlvbnMge1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbmFtZXNwYWNlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbXVsdGlwbGUgc3RyZWFtcyBhc3NvY2lhdGVkXG4gICAqIHdpdGggdGhlIHNhbWUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAvKipcbiAgICogQW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlIGJlZm9yZSBwYXVzaW5nIG9yIHRlcm1pbmF0aW5nIHRoZVxuICAgKiBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAgICogKGkuZS4gdXNpbmcgW2B3YWl0VW50aWwoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9FeHRlbmRhYmxlRXZlbnQvd2FpdFVudGlsKSBvciBzaW1pbGFyKS5cbiAgICpcbiAgICogV3JpdGVzIGFyZSBhY2tub3dsZWRnZWQgb24gYnVmZmVyIGVudHJ5LCBzbyBhIGNhbGxlciB0aGF0IG5lZWRzIHRoZW1cbiAgICogZHVyYWJsZSBiZWZvcmUgdGhlIGVudmlyb25tZW50IGdvZXMgYXdheSBzaG91bGQgcGFzcyBhbiBhcnJheSBoZXJlIGFuZFxuICAgKiBhd2FpdCBpdCBhZnRlciByZWxlYXNpbmcgdGhlIHdyaXRlciBsb2NrLlxuICAgKi9cbiAgb3BzPzogUHJvbWlzZTxhbnk+W107XG4gIC8qKlxuICAgKiBUaGUgZ2xvYmFsIG9iamVjdCB0byB1c2UgZm9yIHJlZHVjaW5nIHR5cGVzIGZyb20gdGhlIGdsb2JhbCBzY29wZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8ge0BsaW5rIFtgZ2xvYmFsVGhpc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2dsb2JhbFRoaXMpfS5cbiAgICovXG4gIGdsb2JhbD86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGNsYXNzIGZvciBhIHdvcmtmbG93IHJ1bi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bjxUUmVzdWx0PiB7XG4gIHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZTogUnVuPHVua25vd24+KSB7XG4gICAgcmV0dXJuIHsgcnVuSWQ6IGluc3RhbmNlLnJ1bklkLCByZXNpbGllbnRTdGFydDogaW5zdGFuY2UuI3Jlc2lsaWVudFN0YXJ0IH07XG4gIH1cblxuICBzdGF0aWMgW1dPUktGTE9XX0RFU0VSSUFMSVpFXShkYXRhOiB7XG4gICAgcnVuSWQ6IHN0cmluZztcbiAgICByZXNpbGllbnRTdGFydD86IGJvb2xlYW47XG4gIH0pIHtcbiAgICByZXR1cm4gbmV3IFJ1bihkYXRhLnJ1bklkLCB7IHJlc2lsaWVudFN0YXJ0OiBkYXRhLnJlc2lsaWVudFN0YXJ0IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgcnVuSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdvcmxkIG9iamVjdC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICAjd29ybGRQcm9taXNlOiBQcm9taXNlPFdvcmxkPiB8IHVuZGVmaW5lZDtcbiAgZ2V0ICNsYXp5V29ybGRQcm9taXNlKCkge1xuICAgIGlmICghdGhpcy4jd29ybGRQcm9taXNlKSB0aGlzLiN3b3JsZFByb21pc2UgPSBnZXRXb3JsZExhenkoKTtcbiAgICByZXR1cm4gdGhpcy4jd29ybGRQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhY2hlZCBlbmNyeXB0aW9uIGtleSByZXNvbHV0aW9uLiBSZXNvbHZlZCBvbmNlIG9uIGZpcnN0IHVzZSBhbmRcbiAgICogcmV1c2VkIGZvciByZXR1cm5WYWx1ZSwgZ2V0UmVhZGFibGUoKSwgZXRjLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICNlbmNyeXB0aW9uS2V5UHJvbWlzZTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHJ1bl9jcmVhdGVkIGZhaWxlZCBhbmQgdGhlIHJ1biBtYXkgbm90IGV4aXN0IHlldCAodGhlXG4gICAqIHJlc2lsaWVudCBzdGFydCBwYXRoIHdpbGwgY3JlYXRlIGl0IHZpYSBydW5fc3RhcnRlZCkuIHBvbGxSZXR1cm5WYWx1ZVxuICAgKiByZXRyaWVzIG9uIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciBvbmx5IHdoZW4gdGhpcyBmbGFnIGlzIHNldCBzb1xuICAgKiB0aGF0IG5vcm1hbCBydW5zIGZhaWwgZmFzdCBvbiA0MDQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgI3Jlc2lsaWVudFN0YXJ0ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZywgb3B0cz86IHsgcmVzaWxpZW50U3RhcnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gICAgdGhpcy4jcmVzaWxpZW50U3RhcnQgPSBvcHRzPy5yZXNpbGllbnRTdGFydCA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbmQgY2FjaGVzIHRoZSBlbmNyeXB0aW9uIGtleSBmb3IgdGhpcyBydW4uXG4gICAqIFRoZSBrZXkgaXMgdGhlIHNhbWUgZm9yIHRoZSBsaWZldGltZSBvZiBhIHJ1biwgc28gaXQgb25seSBuZWVkc1xuICAgKiB0byBiZSByZXNvbHZlZCBvbmNlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICNnZXRFbmNyeXB0aW9uS2V5KHJ1bj86IFdvcmtmbG93UnVuKTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLiNlbmNyeXB0aW9uS2V5UHJvbWlzZSkge1xuICAgICAgdGhpcy4jZW5jcnlwdGlvbktleVByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG4gICAgICAgIGNvbnN0IHJ1bkRhdGEgPSBydW4gPz8gKGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQpKTtcbiAgICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bkRhdGEpO1xuICAgICAgICByZXR1cm4gcmF3S2V5ID8gYXdhaXQgZGVyaXZlUnVuUGF5bG9hZEtleXMocmF3S2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNlbmNyeXB0aW9uS2V5UHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZlcnMgZmV0Y2hpbmcgdGhlIHJ1biBhbmQgaXRzIGVuY3J5cHRpb24ga2V5IHVudGlsIGEgcmVhZGFibGUgaXMgZmlyc3RcbiAgICogY29uc3VtZWQuIFRoZSBmaXJzdCBwdWxsIHByZWZldGNoZXMgaXQgc28gYW4gZW5jcnlwdGVkIGZpcnN0IGZyYW1lIGNhbiBqb2luXG4gICAqIHRoZSBsb29rdXA7IHRoaXMgYWxzbyBhcHBsaWVzIHRvIGFuIGVtcHR5IGNvbnN1bWVkIHN0cmVhbS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICAjZ2V0RW5jcnlwdGlvbktleUxhemlseSgpOiAoKSA9PiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy4jZ2V0RW5jcnlwdGlvbktleSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVycnVwdHMgcGVuZGluZyBgc2xlZXAoKWAgY2FsbHMsIHJlc3VtaW5nIHRoZSB3b3JrZmxvdyBlYXJseS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzZXR0aW5ncyB0byB0YXJnZXQgc3BlY2lmaWMgc2xlZXAgY2FsbHMgYnkgY29ycmVsYXRpb24gSUQuXG4gICAqICAgSWYgbm90IHByb3ZpZGVkLCBhbGwgcGVuZGluZyBzbGVlcCBjYWxscyB3aWxsIGJlIGludGVycnVwdGVkLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBTdG9wU2xlZXBSZXN1bHR9IG9iamVjdCBjb250YWluaW5nIHRoZSBudW1iZXIgb2Ygc2xlZXAgY2FsbHMgdGhhdCB3ZXJlIGludGVycnVwdGVkLlxuICAgKi9cbiAgYXN5bmMgd2FrZVVwKG9wdGlvbnM/OiBTdG9wU2xlZXBPcHRpb25zKTogUHJvbWlzZTxTdG9wU2xlZXBSZXN1bHQ+IHtcbiAgICAndXNlIHN0ZXAnO1xuICAgIHJldHVybiB3YWtlVXBSdW4oYXdhaXQgdGhpcy4jbGF6eVdvcmxkUHJvbWlzZSwgdGhpcy5ydW5JZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNhbmNlbGxhdGlvbiBzZXR0aW5ncy4gYGNhbmNlbFJlYXNvbmAgcmVjb3JkcyBhXG4gICAqICAgZnJlZS10ZXh0IHJlYXNvbiAobWF4IDUxMiBjaGFycykgb24gdGhlIHJ1bl9jYW5jZWxsZWQgZXZlbnQsIHN1cmZhY2VkIGluXG4gICAqICAgdGhlIHJ1biBkZXRhaWwgdmlldy5cbiAgICovXG4gIGFzeW5jIGNhbmNlbChvcHRpb25zPzogQ2FuY2VsUnVuT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCB0aGlzLiNsYXp5V29ybGRQcm9taXNlO1xuICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUodGhpcy5ydW5JZCwge1xuICAgICAgZXZlbnRUeXBlOiAncnVuX2NhbmNlbGxlZCcsXG4gICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAuLi4ob3B0aW9ucz8uY2FuY2VsUmVhc29uICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IGV2ZW50RGF0YTogeyBjYW5jZWxSZWFzb246IG9wdGlvbnMuY2FuY2VsUmVhc29uIH0gfVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3b3JrZmxvdyBydW4gZXhpc3RzLlxuICAgKi9cbiAgZ2V0IGV4aXN0cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAndXNlIHN0ZXAnO1xuICAgIHJldHVybiB0aGlzLiNsYXp5V29ybGRQcm9taXNlLnRoZW4oKHdvcmxkKSA9PlxuICAgICAgd29ybGQucnVuc1xuICAgICAgICAuZ2V0KHRoaXMucnVuSWQsIHsgcmVzb2x2ZURhdGE6ICdub25lJyB9KVxuICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKFdvcmtmbG93UnVuTm90Rm91bmRFcnJvci5pcyhlcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqL1xuICBnZXQgc3RhdHVzKCk6IFByb21pc2U8V29ya2Zsb3dSdW5TdGF0dXM+IHtcbiAgICAndXNlIHN0ZXAnO1xuICAgIHJldHVybiB0aGlzLiNsYXp5V29ybGRQcm9taXNlLnRoZW4oKHdvcmxkKSA9PlxuICAgICAgd29ybGQucnVuc1xuICAgICAgICAuZ2V0KHRoaXMucnVuSWQsIHsgcmVzb2x2ZURhdGE6ICdub25lJyB9KVxuICAgICAgICAudGhlbigocnVuKSA9PiBydW4uc3RhdHVzKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKiBQb2xscyB0aGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlIHVudGlsIHRoZSB3b3JrZmxvdyBydW4gY29tcGxldGVzLlxuICAgKi9cbiAgZ2V0IHJldHVyblZhbHVlKCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI3BvbGxSZXR1cm5WYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdy5cbiAgICovXG4gIGdldCB3b3JrZmxvd05hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAndXNlIHN0ZXAnO1xuICAgIHJldHVybiB0aGlzLiNsYXp5V29ybGRQcm9taXNlLnRoZW4oKHdvcmxkKSA9PlxuICAgICAgd29ybGQucnVucy5nZXQodGhpcy5ydW5JZCkudGhlbigocnVuKSA9PiBydW4ud29ya2Zsb3dOYW1lKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSB3b3JrZmxvdyBydW4gd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBnZXQgY3JlYXRlZEF0KCk6IFByb21pc2U8RGF0ZT4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5jcmVhdGVkQXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IHJ1biBzdGFydGVkIGV4ZWN1dGlvbi5cbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIHdvcmtmbG93IGhhcyBub3Qgc3RhcnRlZCB5ZXQuXG4gICAqL1xuICBnZXQgc3RhcnRlZEF0KCk6IFByb21pc2U8RGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgcmV0dXJuIHRoaXMuI2xhenlXb3JsZFByb21pc2UudGhlbigod29ybGQpID0+XG4gICAgICB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkKS50aGVuKChydW4pID0+IHJ1bi5zdGFydGVkQXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IHJ1biBjb21wbGV0ZWQuXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSB3b3JrZmxvdyBoYXMgbm90IGNvbXBsZXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgY29tcGxldGVkQXQoKTogUHJvbWlzZTxEYXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICByZXR1cm4gdGhpcy4jbGF6eVdvcmxkUHJvbWlzZS50aGVuKCh3b3JsZCkgPT5cbiAgICAgIHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQpLnRoZW4oKHJ1bikgPT4gcnVuLmNvbXBsZXRlZEF0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlYWRhYmxlIHN0cmVhbSBvZiB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgZ2V0IHJlYWRhYmxlKCk6IFdvcmtmbG93UmVhZGFibGVTdHJlYW0ge1xuICAgIHJldHVybiB0aGlzLmdldFJlYWRhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB3b3JrZmxvdyBydW4ncyBkZWZhdWx0IHJlYWRhYmxlIHN0cmVhbSwgd2hpY2ggcmVhZHMgY2h1bmtzXG4gICAqIHdyaXR0ZW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgd3JpdGFibGUgc3RyZWFtIHtAbGluayBnZXRXcml0YWJsZX0uXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaGFzIGFuIGFkZGl0aW9uYWwge0BsaW5rIFdvcmtmbG93UmVhZGFibGVTdHJlYW0uZ2V0VGFpbEluZGV4IHwgZ2V0VGFpbEluZGV4KCl9XG4gICAqIGhlbHBlciB0aGF0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGtub3duIGNodW5rLiBUaGlzIGlzIHVzZWZ1bCB3aGVuXG4gICAqIGJ1aWxkaW5nIHJlY29ubmVjdGlvbiBlbmRwb2ludHMgdGhhdCBuZWVkIHRvIGluZm9ybSBjbGllbnRzIHdoZXJlIHRoZVxuICAgKiBzdHJlYW0gc3RhcnRzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgcmVhZGFibGUgc3RyZWFtLlxuICAgKiBAcmV0dXJucyBBIGBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtYCBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICovXG4gIGdldFJlYWRhYmxlPFIgPSBhbnk+KFxuICAgIG9wdGlvbnM6IFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zID0ge31cbiAgKTogV29ya2Zsb3dSZWFkYWJsZVN0cmVhbTxSPiB7XG4gICAgJ3VzZSBzdGVwJztcbiAgICBjb25zdCB7IG9wcyA9IFtdLCBnbG9iYWwgPSBnbG9iYWxUaGlzLCBzdGFydEluZGV4LCBuYW1lc3BhY2UgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbmFtZSA9IGdldFdvcmtmbG93UnVuU3RyZWFtSWQodGhpcy5ydW5JZCwgbmFtZXNwYWNlKTtcbiAgICAvLyBUaGUgcmVzb2x2ZXIgc3RhcnRzIG9ubHkgb24gdGhlIHJlYWRhYmxlJ3MgZmlyc3QgcHVsbCwgc28gY29uc3RydWN0aW9uXG4gICAgLy8gaXMgaW5lcnQuIEEgY29uc3VtZWQgZW1wdHkgc3RyZWFtIHN0aWxsIHBlcmZvcm1zIHRoZSBzcGVjdWxhdGl2ZSBsb29rdXBcbiAgICAvLyB0byBrZWVwIHRoZSBmaXJzdCBlbmNyeXB0ZWQtZnJhbWUgcGF0aCBjb25jdXJyZW50LlxuICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSB0aGlzLiNnZXRFbmNyeXB0aW9uS2V5TGF6aWx5KCk7XG4gICAgY29uc3Qgc3RyZWFtID0gZ2V0UnVuUmVhZGFibGVTdHJlYW08Uj4oXG4gICAgICBnbG9iYWwsXG4gICAgICBvcHMsXG4gICAgICB0aGlzLnJ1bklkLFxuICAgICAgbmFtZSxcbiAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICBlbmNyeXB0aW9uS2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHdvcmxkUHJvbWlzZSA9IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG4gICAgY29uc3QgcnVuSWQgPSB0aGlzLnJ1bklkO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHN0cmVhbSwge1xuICAgICAgZ2V0VGFpbEluZGV4OiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldEluZm8ocnVuSWQsIG5hbWUpO1xuICAgICAgICByZXR1cm4gaW5mby50YWlsSW5kZXg7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSB3cml0YWJsZSBzdHJlYW0gb2YgdGhlIHdvcmtmbG93IHJ1bi4gKi9cbiAgZ2V0IHdyaXRhYmxlKCk6IFdyaXRhYmxlU3RyZWFtIHtcbiAgICByZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB3cml0YWJsZSB0aGF0IGFwcGVuZHMgdG8gdGhpcyBydW4ncyBzdHJlYW0uXG4gICAqXG4gICAqIEluaXRpYWxpemF0aW9uIGlzIGRlZmVycmVkIHVudGlsIHRoZSBmaXJzdCB3cml0ZS4gVGhlIHJ1biBtdXN0IGFscmVhZHlcbiAgICogZXhpc3QuIFRoZSB3cml0YWJsZSBtYXkgYmUgZm9yd2FyZGVkIHRocm91Z2ggYHN0YXJ0KClgIGFuZCBpbnRvIHN0ZXBzLCBidXRcbiAgICogZ3JhbnRzIG5vIHJlYWQgYWNjZXNzIG9yIGFkZGl0aW9uYWwgYXV0aG9yaXphdGlvbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogYHdyaXRlci5jbG9zZSgpYCBjbG9zZXMgdGhlIHNoYXJlZCBzdHJlYW0uIENvbnRyaWJ1dG9ycyBzaG91bGQgY2FsbFxuICAgKiBgcmVsZWFzZUxvY2soKWAsIHdoaWNoIGFsc28gZHJhaW5zIHBlbmRpbmcgd3JpdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB3cml0YWJsZSBzdHJlYW0gb3B0aW9ucy5cbiAgICovXG4gIGdldFdyaXRhYmxlPFcgPSBhbnk+KFxuICAgIG9wdGlvbnM6IFdvcmtmbG93UnVuV3JpdGFibGVTdHJlYW1PcHRpb25zID0ge31cbiAgKTogV3JpdGFibGVTdHJlYW08Vz4ge1xuICAgICd1c2Ugc3RlcCc7XG4gICAgY29uc3QgeyBvcHMgPSBbXSwgZ2xvYmFsID0gZ2xvYmFsVGhpcywgbmFtZXNwYWNlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG5hbWUgPSBnZXRXb3JrZmxvd1J1blN0cmVhbUlkKHRoaXMucnVuSWQsIG5hbWVzcGFjZSk7XG4gICAgbGV0IHRhcmdldFByb21pc2U6XG4gICAgICB8IFByb21pc2U8e1xuICAgICAgICAgIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gICAgICAgICAgZW5jcnlwdGlvblB1YmxpY0tleT86IHN0cmluZztcbiAgICAgICAgfT5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGxldCB3cml0YWJsZTogV3JpdGFibGVTdHJlYW08Vz47XG5cbiAgICBjb25zdCByZXNvbHZlVGFyZ2V0ID0gKCkgPT4ge1xuICAgICAgdGFyZ2V0UHJvbWlzZSA/Pz0gdGhpcy4jZ2V0TWV0YWRhdGEoKS50aGVuKGFzeW5jIChydW4pID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0ge1xuICAgICAgICAgIGtleTogYXdhaXQgZ2V0Rm9yd2FyZGVkV3JpdGFibGVFbmNyeXB0aW9uS2V5KFxuICAgICAgICAgICAgdGhpcy5ydW5JZCxcbiAgICAgICAgICAgIHJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBydW4uZW5jcnlwdGlvblB1YmxpY0tleVxuICAgICAgICAgICksXG4gICAgICAgICAgZGVwbG95bWVudElkOiBydW4uZGVwbG95bWVudElkLFxuICAgICAgICAgIGVuY3J5cHRpb25QdWJsaWNLZXk6IHJ1bi5lbmNyeXB0aW9uUHVibGljS2V5LFxuICAgICAgICB9O1xuICAgICAgICB0YWdGb3J3YXJkZWRXcml0YWJsZVRhcmdldCh3cml0YWJsZSwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRhcmdldFByb21pc2U7XG4gICAgfTtcblxuICAgIHdyaXRhYmxlID0gY3JlYXRlRm9yd2FyZGVkV3JpdGFibGU8Vz4oe1xuICAgICAgZ2xvYmFsLFxuICAgICAgb3BzLFxuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBuYW1lLFxuICAgICAga2V5OiAoKSA9PiByZXNvbHZlVGFyZ2V0KCkudGhlbigoeyBrZXkgfSkgPT4ga2V5KSxcbiAgICB9KTtcbiAgICByZXR1cm4gd3JpdGFibGU7XG4gIH1cblxuICAvKiogUmVhZHMgbWV0YWRhdGEsIGJyaWVmbHkgcmV0cnlpbmcgcmVzaWxpZW50IHN0YXJ0cy4gQGludGVybmFsICovXG4gIGFzeW5jICNnZXRNZXRhZGF0YSgpIHtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRoaXMuI2xhenlXb3JsZFByb21pc2U7XG4gICAgY29uc3QgbWF4UmV0cmllcyA9IHRoaXMuI3Jlc2lsaWVudFN0YXJ0ID8gTk9UX0ZPVU5EX1JFVFJZX0RFTEFZUy5sZW5ndGggOiAwO1xuICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHRoaXMucnVuSWQsIHsgcmVzb2x2ZURhdGE6ICdub25lJyB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKGVycm9yKSB8fCBhdHRlbXB0ID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWxheSA9IE5PVF9GT1VORF9SRVRSWV9ERUxBWVNbYXR0ZW1wdF0hO1xuICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhc3luYyAjcmVzb2x2ZVRlcm1pbmFsUmV0dXJuVmFsdWUocnVuOiBXb3JrZmxvd1J1bik6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgIC8vIEV4cGlyeSBpcyBjaGVja2VkIGJlZm9yZSB0aGUgc3RhdHVzIGJyYW5jaGVzLCBhbmQgZGVsaWJlcmF0ZWx5IHNvLlxuICAgIC8vXG4gICAgLy8gUGFzdCBpdHMgcmV0ZW50aW9uIGJvdW5kYXJ5IGEgcnVuJ3MgcGF5bG9hZHMgYXJlIGdvbmUgYnV0IGl0cyBtZXRhZGF0YVxuICAgIC8vIHVzdWFsbHkgaXMgbm90LCBzbyBgcnVuLm91dHB1dGAgYW5kIGBydW4uZXJyb3JgIGh5ZHJhdGUgdG8gYW5cbiAgICAvLyBleHBpcmVkLWRhdGEgcGxhY2Vob2xkZXIgcmF0aGVyIHRoYW4gdG8gYW55dGhpbmcgdGhlIGNhbGxlciBhc2tlZCBmb3IuXG4gICAgLy8gSGFuZGluZyB0aGF0IGJhY2sgYXMgaWYgaXQgd2VyZSB0aGUgcmV0dXJuIHZhbHVlIOKAlCBvciB3cmFwcGluZyBpdCBhc1xuICAgIC8vIHRoZSBgY2F1c2VgIG9mIGEgV29ya2Zsb3dSdW5GYWlsZWRFcnJvciDigJQgaXMgd29yc2UgdGhhbiBmYWlsaW5nOiBpdCBpc1xuICAgIC8vIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIHdvcmtmbG93IGhhdmluZyBnZW51aW5lbHkgcmV0dXJuZWQgaXQuXG4gICAgLy9cbiAgICAvLyBBIHJ1biBzdGFydGVkIHdpdGggYGV4cGVyaW1lbnRhbF9yZXRlbnRpb246IDBgIHJlYWNoZXMgdGhpcyBhbG1vc3RcbiAgICAvLyBpbW1lZGlhdGVseSAoaXRzIHB1cmdlIHJhY2VzLCBhbmQgdXN1YWxseSBiZWF0cywgdGhlIGNhbGxlcidzIG93biByZWFkXG4gICAgLy8gb2YgdGhlIHJlc3VsdCkuIEFuIG9yZGluYXJ5IHJ1biByZWFjaGVzIGl0IHdoZW5ldmVyIGl0IGlzIHJlYWQgYWZ0ZXJcbiAgICAvLyB0aGUgV29ybGQncyBkZWZhdWx0IHdpbmRvdy4gQm90aCBhcmUgdGhlIHNhbWUgY29uZGl0aW9uIGFuZCBnZXQgdGhlXG4gICAgLy8gc2FtZSB0ZXJtaW5hbCwgbm9uLXJldHJ5YWJsZSBlcnJvciwgY2Fycnlpbmcgd2hhdGV2ZXIgbWV0YWRhdGFcbiAgICAvLyBzdXJ2aXZlZCBzbyB0aGUgY2FsbGVyIGNhbiBzdGlsbCB0ZWxsIHN1Y2Nlc3MgZnJvbSBmYWlsdXJlLlxuICAgIC8vXG4gICAgLy8gV2hlbiBldmVuIHRoZSBtZXRhZGF0YSBpcyBnb25lIHRoZSBXb3JsZCByZXBvcnRzIHRoZSBydW4gYXMgbWlzc2luZyBhbmRcbiAgICAvLyB0aGUgY2FsbGVyIGdldHMgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIGZyb20gdGhlIHJlYWQgYWJvdmUgaW5zdGVhZCDigJRcbiAgICAvLyB0aGVyZSBpcyBub3RoaW5nIGxlZnQgaGVyZSB0byBkZXNjcmliZS5cbiAgICBjb25zdCBleHBpcmVkQXQgPSBydW4uZXhwaXJlZEF0O1xuICAgIGlmIChleHBpcmVkQXQgIT0gbnVsbCAmJiBleHBpcmVkQXQgPD0gbmV3IERhdGUoKSkge1xuICAgICAgdGhyb3cgbmV3IFJ1bkV4cGlyZWRFcnJvcihcbiAgICAgICAgYFJ1biBcIiR7dGhpcy5ydW5JZH1cIiAke3J1bi5zdGF0dXMgPT09ICdjb21wbGV0ZWQnID8gJ2NvbXBsZXRlZCcgOiBgaXMgJHtydW4uc3RhdHVzfWB9LCBidXQgaXRzIGRhdGEgZXhwaXJlZCBhdCAke2V4cGlyZWRBdC50b0lTT1N0cmluZygpfSBhbmQgaXMgbm8gbG9uZ2VyIHJlYWRhYmxlLmAsXG4gICAgICAgIHRoaXMucnVuSWQsXG4gICAgICAgIHJ1bi5zdGF0dXMsXG4gICAgICAgIGV4cGlyZWRBdFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocnVuLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLiNnZXRFbmNyeXB0aW9uS2V5KHJ1bik7XG4gICAgICByZXR1cm4gYXdhaXQgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gICAgICAgIHJ1bi5vdXRwdXQsXG4gICAgICAgIHRoaXMucnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJ1bi5zdGF0dXMgPT09ICdjYW5jZWxsZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvcih0aGlzLnJ1bklkKTtcbiAgICB9XG5cbiAgICBpZiAocnVuLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgIC8vIEh5ZHJhdGUgdGhlIHNlcmlhbGl6ZWQgcnVuIGVycm9yIHNvIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWVcbiAgICAgIC8vICh3aXRoIGl0cyB0eXBlIGlkZW50aXR5LCBjYXVzZSBjaGFpbiwgZXRjLikgaXMgc2V0IGFzIHRoZVxuICAgICAgLy8gYGNhdXNlYCBvbiBXb3JrZmxvd1J1bkZhaWxlZEVycm9yLlxuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGF3YWl0IHRoaXMuI2dldEVuY3J5cHRpb25LZXkocnVuKTtcbiAgICAgIGxldCBoeWRyYXRlZEVycm9yOiB1bmtub3duO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICBydW4uZXJyb3IsXG4gICAgICAgICAgdGhpcy5ydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWYgaHlkcmF0aW9uIGZhaWxzLCBzdXJmYWNlIGEgZ2VuZXJpYyBmYWxsYmFjayByYXRoZXIgdGhhblxuICAgICAgICAvLyBsZWF2aW5nIHRoZSB1c2VyIHdpdGggYSByYXcgVWludDhBcnJheS4gVGhlIHJ1bidzIGVycm9yQ29kZVxuICAgICAgICAvLyBpcyBzdGlsbCBwcmVzZXJ2ZWQgb24gdGhlIHRocm93biBXb3JrZmxvd1J1bkZhaWxlZEVycm9yLlxuICAgICAgICBoeWRyYXRlZEVycm9yID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gaHlkcmF0ZSB3b3JrZmxvdyBydW4gZXJyb3InKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bkZhaWxlZEVycm9yKHRoaXMucnVuSWQsIGh5ZHJhdGVkRXJyb3IsIHtcbiAgICAgICAgZXJyb3JDb2RlOiBydW4uZXJyb3JDb2RlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVGVybWluYWwgc3RhdHVzZXMgYXJlIGltbXV0YWJsZSwgYnV0IGlmIGFuIGluY29uc2lzdGVudCB3b3JsZCByZXR1cm5zXG4gICAgLy8gYSBub24tdGVybWluYWwgZnVsbCByZWNvcmQsIHJlc3VtZSBwb2xsaW5nIHNhZmVseS5cbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvcih0aGlzLnJ1bklkLCBydW4uc3RhdHVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB0aGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlIHVudGlsIHRoZSB3b3JrZmxvdyBydW4gY29tcGxldGVzLlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHJldHVybnMgVGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFzeW5jICNwb2xsUmV0dXJuVmFsdWUoKTogUHJvbWlzZTxUUmVzdWx0PiB7XG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCB0aGlzLiNsYXp5V29ybGRQcm9taXNlO1xuXG4gICAgLy8gV2hlbiByZXNpbGllbnRTdGFydCBpcyB0cnVlLCBydW5fY3JlYXRlZCBmYWlsZWQgYW5kIHRoZSBydW4gbWF5XG4gICAgLy8gbm90IGV4aXN0IHlldC4gUmV0cnkgb24gV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIHVwIHRvIDMgdGltZXNcbiAgICAvLyAoMXMgKyAzcyArIDZzID0gMTBzIHRvdGFsKSB0byBnaXZlIHRoZSBxdWV1ZSB0aW1lIHRvIGRlbGl2ZXJcbiAgICAvLyBhbmQgdGhlIHJ1bnRpbWUgdG8gY3JlYXRlIHRoZSBydW4gdmlhIHJ1bl9zdGFydGVkLlxuICAgIC8vIFdoZW4gcmVzaWxpZW50U3RhcnQgaXMgZmFsc2UsIDQwNCBpcyBhIHJlYWwgZXJyb3I6IGZhaWwgZmFzdC5cbiAgICBsZXQgbm90Rm91bmRSZXRyaWVzID0gMDtcbiAgICBjb25zdCBOT1RfRk9VTkRfTUFYX1JFVFJJRVMgPSB0aGlzLiNyZXNpbGllbnRTdGFydFxuICAgICAgPyBOT1RfRk9VTkRfUkVUUllfREVMQVlTLmxlbmd0aFxuICAgICAgOiAwO1xuXG4gICAgLy8gUHJlZmVyIHRoZSBXb3JsZCdzIGxvbmcgcG9sbDogb25lIHJlYWQgdGhhdCB0aGUgYmFja2VuZCBob2xkcyBvcGVuXG4gICAgLy8gdW50aWwgdGhlIHJ1biBmaW5pc2hlcywgaW5zdGVhZCBvZiBhc2tpbmcgYWdhaW4gZXZlcnkgc2Vjb25kIGFuZFxuICAgIC8vIHBheWluZyB1cCB0byBhIGZ1bGwgaW50ZXJ2YWwgb2YgcXVhbnRpemF0aW9uIG9uIGEgcnVuIHRoYXQgYWxyZWFkeVxuICAgIC8vIGVuZGVkLiBXb3JsZHMgdGhhdCBjYW5ub3Qgd2FpdCBkbyBub3QgaW1wbGVtZW50IGl0IChzZWVcbiAgICAvLyBgU3RvcmFnZVsncnVucyddLndhaXRGb3JUZXJtaW5hbFN0YXR1c2ApIGFuZCB0aGlzIHN0YXlzIHRoZSBleGFjdFxuICAgIC8vIGZpeGVkLWludGVydmFsIHBvbGwgaXQgaGFzIGFsd2F5cyBiZWVuLCBhcyBkb2VzIGFuIG9wZXJhdG9yIHdob1xuICAgIC8vIHRocm93cyB0aGUgYFdPUktGTE9XX1JFVFVSTl9WQUxVRV9MT05HX1BPTEw9MGAga2lsbCBzd2l0Y2guXG4gICAgY29uc3Qgd2FpdEZvclRlcm1pbmFsU3RhdHVzID0gaXNSZXR1cm5WYWx1ZUxvbmdQb2xsRW5hYmxlZCgpXG4gICAgICA/IHdvcmxkLnJ1bnMud2FpdEZvclRlcm1pbmFsU3RhdHVzPy5iaW5kKHdvcmxkLnJ1bnMpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIExvbmcgcG9sbHMgc3BlbnQgc28gZmFyLiBPbmNlIHRoZSBjYXAgaXMgcmVhY2hlZCB0aGUgbG9vcCBrZWVwcyB3YWl0aW5nXG4gICAgLy8gYnV0IG9uIHRoZSBpbnRlcnZhbCBwYXRoLCB3aGljaCBpcyB0aGUgc3RyYXRlZ3kgd2Uga25vdyBpcyBjb3JyZWN0OyBzZWVcbiAgICAvLyBgUkVUVVJOX1ZBTFVFX01BWF9MT05HX1BPTExTYC4gTmV2ZXIgYSByZWFzb24gdG8gc3RvcCBhd2FpdGluZy5cbiAgICBsZXQgbG9uZ1BvbGxzID0gMDtcbiAgICBjb25zdCBtYXhMb25nUG9sbHMgPSBnZXRSZXR1cm5WYWx1ZU1heExvbmdQb2xscygpO1xuXG4gICAgLy8gTk9URTogd2hlbiB0aGlzIHBvbGwgcnVucyBpbnNpZGUgYSBzdGVwIChlLmcuIHRoZSBzdGVwIHRoYXQgYSBwYXJlbnRcbiAgICAvLyB3b3JrZmxvdyB1c2VzIHRvIGF3YWl0IGEgY2hpbGQgd29ya2Zsb3cncyBgcmV0dXJuVmFsdWVgKSwgaXQgYmxvY2tzXG4gICAgLy8gYSBxdWV1ZSB3b3JrZXIgc2xvdCBmb3IgYXMgbG9uZyBhcyB0aGUgY2hpbGQgcnVuIHRha2VzIHRvIGZpbmlzaC5cbiAgICAvLyBXb3JrZXItYmFzZWQgd29ybGRzIGxpa2UgYHdvcmxkLXBvc3RncmVzYCBtdXN0IGJlIHNpemVkIHRvIGNvdmVyIHRoZVxuICAgIC8vIHBlYWsgbnVtYmVyIG9mIHN1Y2ggcG9sbHMgaW4gZmxpZ2h0OyBzZWUgdGhlIGBxdWV1ZUNvbmN1cnJlbmN5YFxuICAgIC8vIGRlZmF1bHQgb24gdGhlIFBvc3RncmVzIHdvcmxkIGFuZCB0aGUgbm90ZXMgaW4gdGhlIGVhZ2VyLXByb2Nlc3NpbmdcbiAgICAvLyBjaGFuZ2Vsb2cgZm9yIGRldGFpbHMuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdGlvblN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBNZXRhZGF0YSBvbmx5LCBlaXRoZXIgd2F5OiB0aGUgc3RhdHVzIGlzIGFsbCB0aGlzIGl0ZXJhdGlvbiBuZWVkcyxcbiAgICAgICAgLy8gYW5kIHBheWxvYWQgcmVmcyBhcmUgcmVzb2x2ZWQgb25jZSBiZWxvdywgYWZ0ZXIgYSB0ZXJtaW5hbCBzdGF0dXMgaXNcbiAgICAgICAgLy8gb2JzZXJ2ZWQuXG4gICAgICAgIGNvbnN0IHVzZUxvbmdQb2xsID0gd2FpdEZvclRlcm1pbmFsU3RhdHVzICYmIGxvbmdQb2xscyA8IG1heExvbmdQb2xscztcbiAgICAgICAgaWYgKHVzZUxvbmdQb2xsKSBsb25nUG9sbHMrKztcbiAgICAgICAgY29uc3QgcnVuTWV0YWRhdGEgPSB1c2VMb25nUG9sbFxuICAgICAgICAgID8gYXdhaXQgd2FpdEZvclRlcm1pbmFsU3RhdHVzKHRoaXMucnVuSWQsIHtcbiAgICAgICAgICAgICAgdGltZW91dE1zOiBnZXRSZXR1cm5WYWx1ZVdhaXRUaW1lb3V0TXMoKSxcbiAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdub25lJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBhd2FpdCB3b3JsZC5ydW5zLmdldCh0aGlzLnJ1bklkLCB7XG4gICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAocnVuTWV0YWRhdGEuc3RhdHVzID09PSAnY2FuY2VsbGVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yKHRoaXMucnVuSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFBBWUxPQURfVEVSTUlOQUxfUlVOX1NUQVRVU0VTLmhhcyhydW5NZXRhZGF0YS5zdGF0dXMpKSB7XG4gICAgICAgICAgLy8gVGhlIHBvbGxpbmcgcmVhZCBhYm92ZSBkZWxpYmVyYXRlbHkgc2tpcHMgaW5wdXQvb3V0cHV0L2Vycm9yIHJlZnMuXG4gICAgICAgICAgLy8gUmVzb2x2ZSBwYXlsb2FkcyBvbmx5IG9uY2UgdGhlIHJ1biByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQodGhpcy5ydW5JZCwge1xuICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNyZXNvbHZlVGVybWluYWxSZXR1cm5WYWx1ZShydW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIG5vdCBjb21wbGV0ZWQgeWV0OiBzbGVlcCBhbmQgcG9sbCBhZ2Fpbi5cbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3IodGhpcy5ydW5JZCwgcnVuTWV0YWRhdGEuc3RhdHVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgIC8vIFNwYWNlIGNvbnNlY3V0aXZlIG5vbi10ZXJtaW5hbCBvYnNlcnZhdGlvbnMgYXQgbGVhc3Qgb25lIHBvbGxcbiAgICAgICAgICAvLyBpbnRlcnZhbCBhcGFydC4gT24gdGhlIHBsYWluLXBvbGwgcGF0aCB0aGF0IGlzIHRoZSBmYW1pbGlhciBmaXhlZFxuICAgICAgICAgIC8vIHNsZWVwOyBvbiB0aGUgbG9uZy1wb2xsIHBhdGggdGhlIHdhaXQgaGFzIHVzdWFsbHkgYWxyZWFkeVxuICAgICAgICAgIC8vIG91dGxhc3RlZCB0aGUgaW50ZXJ2YWwgYW5kIHRoaXMgaXMgYSBuby1vcCwgYnV0IGl0IGFsc28gbWVhbnMgYVxuICAgICAgICAgIC8vIFdvcmxkIHdob3NlIHdhaXQgcmV0dXJucyBlYXJseSAoYSBiYWNrZW5kIHdpdGggbm8gbG9uZyBwb2xsLCBhXG4gICAgICAgICAgLy8gY2xhbXBlZCBidWRnZXQpIGRlZ3JhZGVzIHRvIGludGVydmFsIHBvbGxpbmcgaW5zdGVhZCBvZiBzcGlubmluZy5cbiAgICAgICAgICBjb25zdCByZW1haW5pbmdJbnRlcnZhbE1zID1cbiAgICAgICAgICAgIGdldFJldHVyblZhbHVlUG9sbEludGVydmFsTXMoKSAtIChEYXRlLm5vdygpIC0gaXRlcmF0aW9uU3RhcnRlZEF0KTtcbiAgICAgICAgICBpZiAocmVtYWluaW5nSW50ZXJ2YWxNcyA+IDApIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHJlbWFpbmluZ0ludGVydmFsTXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLmlzKGVycm9yKSAmJlxuICAgICAgICAgIG5vdEZvdW5kUmV0cmllcyA8IE5PVF9GT1VORF9NQVhfUkVUUklFU1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBkZWxheSA9IE5PVF9GT1VORF9SRVRSWV9ERUxBWVNbbm90Rm91bmRSZXRyaWVzXSE7XG4gICAgICAgICAgbm90Rm91bmRSZXRyaWVzKys7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBgUnVuYCBvYmplY3QgZm9yIGEgZ2l2ZW4gcnVuIElELlxuICpcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgb2J0YWluZWQgZnJvbSB7QGxpbmsgc3RhcnR9LlxuICogQHJldHVybnMgQSBgUnVuYCBvYmplY3QuXG4gKiBAdGhyb3dzIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciBpZiB0aGUgcnVuIElEIGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bjxUUmVzdWx0PihydW5JZDogc3RyaW5nKTogUnVuPFRSZXN1bHQ+IHtcbiAgcmV0dXJuIG5ldyBSdW4ocnVuSWQpO1xufVxuIl19
@@ -1,4 +1,4 @@
1
- import type { World } from '@workflow/world';
1
+ import type { RunRetention, World } from '@workflow/world';
2
2
  import { Run } from './run.js';
3
3
  /**
4
4
  * Reset the `deploymentId: 'latest'` no-op warn-once guard. Test-only,
@@ -48,6 +48,36 @@ export interface StartOptionsBase {
48
48
  * the `setAttributes` option of the same name.
49
49
  */
50
50
  allowReservedAttributes?: boolean;
51
+ /**
52
+ * Set a preference for data retention after run completion.
53
+ *
54
+ * **Experimental.** Both the unit and the set of accepted values are expected
55
+ * to change.
56
+ *
57
+ * Worlds control the retention of user data (event payloads and stream
58
+ * chunks), the event log, and any analytics data. Options are:
59
+ * - `'default'`: same as omission, the World will decide. On Vercel, this
60
+ * is based on your team's plan.
61
+ * - `0`: data is deleted as soon as your run completes or fails. On
62
+ * Vercel, user data is deleted, but metadata may persist for your plan's
63
+ * default retention period.
64
+ *
65
+ * The value is a duration, with zero being the only valid option currently.
66
+ *
67
+ * **Known limitation at `0`.** The purge races your own read of the run's
68
+ * result and generally wins, so `await run.returnValue` on a
69
+ * `experimental_retention: 0` run usually throws `RunExpiredError` rather
70
+ * than resolving. If you need the result, return it through a channel you
71
+ * control, e.g. a step that writes it to external storage.
72
+ *
73
+ * Recorded on the run as the reserved `$retention` attribute, so it
74
+ * requires a World implementing spec version 4 or later. `'default'` is
75
+ * not written at all, keeping it exactly equivalent to omitting the
76
+ * option. Retention is enforced by the World: the first-party Worlds
77
+ * (Vercel, Local, Postgres) implement it, and a World that does not
78
+ * recognize the value keeps the data.
79
+ */
80
+ experimental_retention?: RunRetention;
51
81
  /**
52
82
  * The ID of an existing run this run is being replayed from, if any.
53
83
  *
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/runtime/start.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAyB,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAmCpE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAqD/B;;;;;GAKG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC;;;;;;;;;;;OAWG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,4BAA6B,SAAQ,gBAAgB;IACpE;;;;;;;;;;;;;;;OAeG;IACH,YAAY,EAAE,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,+BAAgC,SAAQ,gBAAgB;IACvE,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,4BAA4B,GAC5B,+BAA+B,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,IAAI,CAC/D,GAAG,IAAI,EAAE,KAAK,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;;;GAOG;AAIH,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,OAAO,EAAE,EACf,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAGzB,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,KAAK,EACX,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/runtime/start.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EAEZ,KAAK,EACN,MAAM,iBAAiB,CAAC;AAoCzB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AA4D/B;;;;;GAKG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC;;;;;;;;;;;OAWG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,sBAAsB,CAAC,EAAE,YAAY,CAAC;IAEtC;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,4BAA6B,SAAQ,gBAAgB;IACpE;;;;;;;;;;;;;;;OAeG;IACH,YAAY,EAAE,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,+BAAgC,SAAQ,gBAAgB;IACvE,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,4BAA4B,GAC5B,+BAA+B,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,IAAI,CAC/D,GAAG,IAAI,EAAE,KAAK,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;;;GAOG;AAIH,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,OAAO,EAAE,EACf,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAGzB,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,KAAK,EACX,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC"}