@blokjs/trigger-worker 0.6.18 → 0.6.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/WorkerTrigger.d.ts +27 -3
- package/dist/WorkerTrigger.js +168 -26
- package/dist/adapters/KafkaAdapter.d.ts +5 -0
- package/dist/adapters/KafkaAdapter.js +12 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/package.json +5 -4
- package/CHANGELOG.md +0 -22
- package/__tests__/integration/nats-adapter.real-nats.test.ts +0 -116
- package/__tests__/integration/pgboss-adapter.real-pg.test.ts +0 -164
- package/__tests__/integration/rabbitmq-adapter.real-rabbitmq.test.ts +0 -179
- package/__tests__/integration/sqs-adapter.real-sqs.test.ts +0 -228
- package/src/WorkerTrigger.test.ts +0 -540
- package/src/WorkerTrigger.ts +0 -784
- package/src/adapters/BullMQAdapter.ts +0 -296
- package/src/adapters/InMemoryAdapter.ts +0 -280
- package/src/adapters/KafkaAdapter.ts +0 -277
- package/src/adapters/NATSAdapter.ts +0 -454
- package/src/adapters/PgBossAdapter.ts +0 -293
- package/src/adapters/RabbitMQAdapter.ts +0 -285
- package/src/adapters/RedisStreamsAdapter.ts +0 -286
- package/src/adapters/SQSAdapter.ts +0 -306
- package/src/adapters/factory.test.ts +0 -89
- package/src/adapters/factory.ts +0 -111
- package/src/adapters/new-adapters.test.ts +0 -130
- package/src/index.ts +0 -94
- package/template/.env.example +0 -13
- package/template/package.json +0 -45
- package/template/src/Nodes.ts +0 -10
- package/template/src/Workflows.ts +0 -8
- package/template/src/index.ts +0 -41
- package/template/src/runner/WorkerServer.ts +0 -34
- package/template/src/runner/types/Workflows.ts +0 -7
- package/template/src/workflows/jobs/process-job.ts +0 -47
- package/template/tsconfig.json +0 -31
- package/template/vitest.config.ts +0 -39
- package/tsconfig.json +0 -32
package/dist/WorkerTrigger.js
CHANGED
|
@@ -19,9 +19,29 @@
|
|
|
19
19
|
* - Ack on success, retry or DLQ on failure
|
|
20
20
|
*/
|
|
21
21
|
import { tryParseDuration } from "@blokjs/helper";
|
|
22
|
-
import { ConcurrencyLimitError, ConcurrencyMetrics, DebounceCoordinator, DefaultLogger, DeferredDispatchSignal, Janitor, NodeMap, QueueExpiredError, RunTracker, TriggerBase, createConcurrencyBackend, createDebounceBackend, } from "@blokjs/runner";
|
|
22
|
+
import { ConcurrencyLimitError, ConcurrencyMetrics, Configuration, DebounceCoordinator, DefaultLogger, DeferredDispatchSignal, Janitor, NodeMap, QueueExpiredError, RunCancelledError, RunTracker, TriggerBase, createConcurrencyBackend, createDebounceBackend, } from "@blokjs/runner";
|
|
23
23
|
import { SpanStatusCode, metrics, trace } from "@opentelemetry/api";
|
|
24
24
|
import { v4 as uuid } from "uuid";
|
|
25
|
+
/**
|
|
26
|
+
* F4 / F24 — thrown by `executeWithTimeout` when a worker job exceeds its
|
|
27
|
+
* trigger-level `config.timeout`. A dedicated type (instead of a plain
|
|
28
|
+
* `Error`) lets `handleJob`'s catch discriminate the timeout: it aborts the
|
|
29
|
+
* detached run via `ctx.signal` and flips the run record to `timedOut`
|
|
30
|
+
* (matching the per-step `maxDuration` taxonomy) rather than routing the
|
|
31
|
+
* timeout through the generic retry/DLQ path.
|
|
32
|
+
*/
|
|
33
|
+
export class WorkerTimeoutError extends Error {
|
|
34
|
+
timeoutMs;
|
|
35
|
+
/** Run id of the aborted run, when known — used to flip status to `timedOut`. */
|
|
36
|
+
runId;
|
|
37
|
+
constructor(timeoutMs, runId) {
|
|
38
|
+
super(`Job timed out after ${timeoutMs}ms`);
|
|
39
|
+
this.name = "WorkerTimeoutError";
|
|
40
|
+
this.timeoutMs = timeoutMs;
|
|
41
|
+
this.runId = runId;
|
|
42
|
+
Object.setPrototypeOf(this, WorkerTimeoutError.prototype);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
25
45
|
/**
|
|
26
46
|
* WorkerTrigger - Abstract base class for worker-based triggers
|
|
27
47
|
*
|
|
@@ -95,6 +115,16 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
95
115
|
// where the old constructor used to live for the full reason.
|
|
96
116
|
this.loadNodes();
|
|
97
117
|
this.loadWorkflows();
|
|
118
|
+
// F6 (worker part) — feed the WorkflowRegistry from the worker nodeMap.
|
|
119
|
+
// Worker-only deployments never instantiate an HttpTrigger, so without
|
|
120
|
+
// this the registry is empty and any trigger-level / process-global
|
|
121
|
+
// middleware name or `subworkflow:` step fails at runtime. Workflows
|
|
122
|
+
// flagged `middleware: true` are registered with `isMiddleware`.
|
|
123
|
+
this.registerWorkflowsFromNodeMap(this.logger);
|
|
124
|
+
// F14 (worker part) — seed BLOK_GLOBAL_MIDDLEWARE from env. Only
|
|
125
|
+
// HttpTrigger did this before, so a pure worker process silently
|
|
126
|
+
// dropped the documented env-var configuration.
|
|
127
|
+
this.seedGlobalMiddlewareFromEnv(this.logger);
|
|
98
128
|
try {
|
|
99
129
|
// Tier 2 #6 follow-up · install the cross-process concurrency
|
|
100
130
|
// backend (NATS KV) when the operator opted in via
|
|
@@ -328,14 +358,18 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
328
358
|
const workflows = [];
|
|
329
359
|
for (const [path, workflow] of Object.entries(this.nodeMap.workflows || {})) {
|
|
330
360
|
const workflowConfig = workflow._config;
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
361
|
+
// F11 — discover the worker trigger by direct key access, NOT by
|
|
362
|
+
// inspecting only the FIRST key. A multi-trigger workflow such as
|
|
363
|
+
// `trigger: { http: {...}, worker: { queue: "jobs" } }` declares
|
|
364
|
+
// `worker` second; the old `Object.keys(trigger)[0] === "worker"`
|
|
365
|
+
// check silently dropped it, making discovery depend on JS object
|
|
366
|
+
// key insertion order. Every sibling trigger (HTTP/SSE/Webhook)
|
|
367
|
+
// already reads its key directly.
|
|
368
|
+
if (workflowConfig?.trigger?.worker) {
|
|
369
|
+
workflows.push({
|
|
370
|
+
path,
|
|
371
|
+
config: workflowConfig,
|
|
372
|
+
});
|
|
339
373
|
}
|
|
340
374
|
}
|
|
341
375
|
return workflows;
|
|
@@ -356,12 +390,32 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
356
390
|
description: "Worker job retries",
|
|
357
391
|
});
|
|
358
392
|
await this.tracer.startActiveSpan(`worker:${config.queue}`, async (span) => {
|
|
393
|
+
// F2 — give each job its OWN Configuration so concurrent jobs
|
|
394
|
+
// (`concurrency > 1`, or two queues in one process) never read a
|
|
395
|
+
// step list / name / trigger config another job's `init()`
|
|
396
|
+
// overwrote. Declared outside the try so the catch can flip the
|
|
397
|
+
// run's status via the per-job config name.
|
|
398
|
+
const configuration = new Configuration();
|
|
399
|
+
// F4 — captured from createContext so the timeout path can abort
|
|
400
|
+
// the detached run cooperatively.
|
|
401
|
+
let runCtx;
|
|
359
402
|
try {
|
|
360
403
|
const start = performance.now();
|
|
361
|
-
//
|
|
362
|
-
|
|
363
|
-
//
|
|
364
|
-
|
|
404
|
+
// Bug 03 — resolve the already-loaded workflow object from the
|
|
405
|
+
// in-memory nodeMap and pass it as the `preloaded` arg (mirrors
|
|
406
|
+
// HTTP). This routes init through the preloaded branch and skips
|
|
407
|
+
// the disk-based `LocalStorage` resolver whose dot heuristic
|
|
408
|
+
// rejected dotted `domain.action` workflow names ("File type not
|
|
409
|
+
// supported"). Fallback to `workflow.config` so `preloaded` is
|
|
410
|
+
// never undefined (which would re-trigger the disk branch).
|
|
411
|
+
const preloaded = (this.nodeMap.workflows && this.nodeMap.workflows[workflow.path]) ??
|
|
412
|
+
workflow.config;
|
|
413
|
+
// F2 — initialize the per-job Configuration instead of the shared
|
|
414
|
+
// `this.configuration`.
|
|
415
|
+
await configuration.init(workflow.path, this.nodeMap, preloaded);
|
|
416
|
+
// Create context — bind it to the per-job Configuration (F2).
|
|
417
|
+
const ctx = this.createContext(undefined, workflow.path, jobId, configuration);
|
|
418
|
+
runCtx = ctx;
|
|
365
419
|
// Populate request with job data
|
|
366
420
|
ctx.request = {
|
|
367
421
|
body: job.data,
|
|
@@ -395,14 +449,23 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
395
449
|
// throws (via `@blokjs/throw`) propagates to the outer
|
|
396
450
|
// catch and is routed through the worker's retry / DLQ
|
|
397
451
|
// logic exactly like a main-workflow error.
|
|
398
|
-
|
|
399
|
-
//
|
|
452
|
+
//
|
|
453
|
+
// F2 — pass the per-job `configuration` so trigger-level
|
|
454
|
+
// (`trigger.worker.middleware`) and workflow-level middleware
|
|
455
|
+
// are read from the object THIS job initialized. Without it the
|
|
456
|
+
// chain would read the never-initialized shared `this.configuration`
|
|
457
|
+
// (the worker no longer calls `this.configuration.init`) and
|
|
458
|
+
// silently drop everything but the process-global chain.
|
|
459
|
+
await this.applyMiddlewareChain(ctx, this.nodeMap, configuration);
|
|
460
|
+
// Execute workflow with timeout if configured.
|
|
461
|
+
// F2 — pass the per-job `configuration` into `run` so the runner
|
|
462
|
+
// reads the same object this job initialized.
|
|
400
463
|
let response;
|
|
401
464
|
if (config.timeout && config.timeout > 0) {
|
|
402
|
-
response = await this.executeWithTimeout(ctx, config.timeout);
|
|
465
|
+
response = await this.executeWithTimeout(ctx, config.timeout, configuration);
|
|
403
466
|
}
|
|
404
467
|
else {
|
|
405
|
-
response = await this.run(ctx);
|
|
468
|
+
response = await this.run(ctx, configuration);
|
|
406
469
|
}
|
|
407
470
|
const end = performance.now();
|
|
408
471
|
// Set span attributes
|
|
@@ -416,7 +479,7 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
416
479
|
workerJobs.add(1, {
|
|
417
480
|
env: process.env.NODE_ENV,
|
|
418
481
|
queue: config.queue,
|
|
419
|
-
workflow_name:
|
|
482
|
+
workflow_name: configuration.name,
|
|
420
483
|
success: "true",
|
|
421
484
|
});
|
|
422
485
|
ctx.logger.log(`Job completed in ${(end - start).toFixed(2)}ms: ${jobId}`);
|
|
@@ -470,12 +533,61 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
470
533
|
workerRetries.add(1, {
|
|
471
534
|
env: process.env.NODE_ENV,
|
|
472
535
|
queue: config.queue,
|
|
473
|
-
workflow_name:
|
|
536
|
+
workflow_name: configuration?.name || "unknown",
|
|
474
537
|
reason: "throttled",
|
|
475
538
|
});
|
|
476
539
|
await job.fail(error, true);
|
|
477
540
|
return;
|
|
478
541
|
}
|
|
542
|
+
// F3 — the run was cancelled by an operator
|
|
543
|
+
// (`POST /__blok/runs/:runId/cancel`). `RunnerSteps` throws
|
|
544
|
+
// `RunCancelledError`, which `TriggerBase.run` re-throws
|
|
545
|
+
// untouched (status already flipped to `cancelled`). The run is
|
|
546
|
+
// terminal — ACK the broker WITHOUT requeue so the
|
|
547
|
+
// deliberately-cancelled, often non-idempotent work doesn't run
|
|
548
|
+
// again on redelivery.
|
|
549
|
+
if (error instanceof RunCancelledError) {
|
|
550
|
+
span.setAttribute("success", false);
|
|
551
|
+
span.setAttribute("cancelled", true);
|
|
552
|
+
span.setStatus({ code: SpanStatusCode.OK, message: "run_cancelled" });
|
|
553
|
+
this.logger.log(`Job ${jobId} cancelled (run already terminal) → ACK (no requeue)`);
|
|
554
|
+
await job.complete();
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
// F4 / F24 — trigger-level `config.timeout` elapsed. The detached
|
|
558
|
+
// run was already aborted via `ctx.signal` inside
|
|
559
|
+
// `executeWithTimeout`, so it unwinds with `RunCancelledError`
|
|
560
|
+
// at the next between-step check. Flip the run record to the
|
|
561
|
+
// dedicated `timedOut` status (matching the per-step
|
|
562
|
+
// `maxDuration` taxonomy) instead of routing through the generic
|
|
563
|
+
// retry/DLQ path, and ACK without requeue.
|
|
564
|
+
if (error instanceof WorkerTimeoutError) {
|
|
565
|
+
span.setAttribute("success", false);
|
|
566
|
+
span.setAttribute("timed_out", true);
|
|
567
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: "job_timed_out" });
|
|
568
|
+
const timedOutRunId = error.runId ?? runCtx?._traceRunId;
|
|
569
|
+
if (timedOutRunId) {
|
|
570
|
+
try {
|
|
571
|
+
RunTracker.getInstance().markRunTimedOut(timedOutRunId, {
|
|
572
|
+
stepId: "__worker_timeout__",
|
|
573
|
+
maxDurationMs: error.timeoutMs,
|
|
574
|
+
attemptsExhausted: job.attempts + 1,
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
catch (markErr) {
|
|
578
|
+
this.logger.error(`[blok][worker] markRunTimedOut failed for run ${timedOutRunId}: ${markErr instanceof Error ? markErr.message : String(markErr)}`);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
workerErrors.add(1, {
|
|
582
|
+
env: process.env.NODE_ENV,
|
|
583
|
+
queue: config.queue,
|
|
584
|
+
workflow_name: configuration?.name || "unknown",
|
|
585
|
+
reason: "timeout",
|
|
586
|
+
});
|
|
587
|
+
this.logger.error(`Job ${jobId} timed out after ${error.timeoutMs}ms → run flipped to timedOut, ACK (no requeue)`);
|
|
588
|
+
await job.complete();
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
479
591
|
const shouldRetry = job.attempts < job.maxRetries;
|
|
480
592
|
// Set span error
|
|
481
593
|
span.setAttribute("success", false);
|
|
@@ -496,7 +608,7 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
496
608
|
workerRetries.add(1, {
|
|
497
609
|
env: process.env.NODE_ENV,
|
|
498
610
|
queue: config.queue,
|
|
499
|
-
workflow_name:
|
|
611
|
+
workflow_name: configuration?.name || "unknown",
|
|
500
612
|
attempt: String(job.attempts + 1),
|
|
501
613
|
});
|
|
502
614
|
this.logger.error(`Job ${jobId} failed (attempt ${job.attempts + 1}/${job.maxRetries + 1}), retrying in ${backoffMs}ms: ${errorMessage}`);
|
|
@@ -507,7 +619,7 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
507
619
|
workerErrors.add(1, {
|
|
508
620
|
env: process.env.NODE_ENV,
|
|
509
621
|
queue: config.queue,
|
|
510
|
-
workflow_name:
|
|
622
|
+
workflow_name: configuration?.name || "unknown",
|
|
511
623
|
});
|
|
512
624
|
this.logger.error(`Job ${jobId} permanently failed after ${job.attempts + 1} attempts: ${errorMessage}`, error.stack);
|
|
513
625
|
await job.fail(error, false);
|
|
@@ -519,20 +631,50 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
519
631
|
});
|
|
520
632
|
}
|
|
521
633
|
/**
|
|
522
|
-
* Execute workflow with a timeout
|
|
634
|
+
* Execute workflow with a timeout.
|
|
635
|
+
*
|
|
636
|
+
* F4 — on timeout, fire the ctx AbortController so the detached `run`
|
|
637
|
+
* unwinds cooperatively (it throws `RunCancelledError` at the next
|
|
638
|
+
* between-step check; long uninterruptible nodes should still poll
|
|
639
|
+
* `ctx.signal.aborted`). The promise rejects with a dedicated
|
|
640
|
+
* {@link WorkerTimeoutError} carrying the run id so `handleJob`'s catch can
|
|
641
|
+
* flip the run record to `timedOut` (F24). The second `run` (broker
|
|
642
|
+
* redelivery) is prevented because we ACK without requeue on timeout.
|
|
643
|
+
*
|
|
644
|
+
* F2 — `configuration` is the per-job Configuration; threaded into `run`.
|
|
523
645
|
*/
|
|
524
|
-
async executeWithTimeout(ctx, timeoutMs) {
|
|
646
|
+
async executeWithTimeout(ctx, timeoutMs, configuration) {
|
|
525
647
|
return new Promise((resolve, reject) => {
|
|
648
|
+
let settled = false;
|
|
526
649
|
const timer = setTimeout(() => {
|
|
527
|
-
|
|
650
|
+
if (settled)
|
|
651
|
+
return;
|
|
652
|
+
settled = true;
|
|
653
|
+
// F4 — abort the detached run so it stops executing rather than
|
|
654
|
+
// continuing to settle its own run record out of band.
|
|
655
|
+
const privateSlot = ctx._PRIVATE_;
|
|
656
|
+
try {
|
|
657
|
+
privateSlot?.abortController?.abort();
|
|
658
|
+
}
|
|
659
|
+
catch {
|
|
660
|
+
/* best-effort — abort never throws, but guard anyway */
|
|
661
|
+
}
|
|
662
|
+
const runId = ctx._traceRunId;
|
|
663
|
+
reject(new WorkerTimeoutError(timeoutMs, runId));
|
|
528
664
|
}, timeoutMs);
|
|
529
|
-
this.run(ctx)
|
|
665
|
+
this.run(ctx, configuration)
|
|
530
666
|
.then((result) => {
|
|
531
667
|
clearTimeout(timer);
|
|
668
|
+
if (settled)
|
|
669
|
+
return; // already timed out — ignore the late result
|
|
670
|
+
settled = true;
|
|
532
671
|
resolve(result);
|
|
533
672
|
})
|
|
534
673
|
.catch((error) => {
|
|
535
674
|
clearTimeout(timer);
|
|
675
|
+
if (settled)
|
|
676
|
+
return; // already rejected with WorkerTimeoutError
|
|
677
|
+
settled = true;
|
|
536
678
|
reject(error);
|
|
537
679
|
});
|
|
538
680
|
});
|
|
@@ -550,4 +692,4 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
550
692
|
}
|
|
551
693
|
}
|
|
552
694
|
export default WorkerTrigger;
|
|
553
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2VyVHJpZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Xb3JrZXJUcmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUErQyxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9GLE9BQU8sRUFFTixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2Isc0JBQXNCLEVBRXRCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixXQUFXLEVBRVgsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUNyQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBYSxjQUFjLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBcUhsQzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFnQixhQUFjLFNBQVEsV0FBVztJQUM1QyxPQUFPLEdBQWtCLEVBQW1CLENBQUM7SUFDcEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLHlCQUF5QixFQUNyRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQ3RDLENBQUM7SUFDaUIsTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDaEQ7Ozs7Ozs7Ozs7O09BV0c7SUFDTyxPQUFPLENBQWlCO0lBRWxDLG9DQUFvQztJQUMxQixZQUFZLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFaEQ7Ozs7O09BS0c7SUFDTyxXQUFXLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7SUFNOUQsb0VBQW9FO0lBQ3BFLG9FQUFvRTtJQUNwRSxrRUFBa0U7SUFD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QUFDO1lBQ3pELENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVkLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2lCQUNYLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNoQixZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQixDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2hCLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDTyxnQkFBZ0IsQ0FBQyxPQUFlLEVBQUUsU0FBa0I7UUFDN0QsTUFBTSxJQUFJLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQztRQUMvQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxpQkFBaUI7UUFDekMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLGFBQWE7UUFDL0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0Q7QUFFRCxlQUFlLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV29ya2VyVHJpZ2dlciAtIEJhY2tncm91bmQgam9iIHByb2Nlc3NpbmcgZm9yIEJsb2sgd29ya2Zsb3dzXG4gKlxuICogRXh0ZW5kcyBUcmlnZ2VyQmFzZSB0byBzdXBwb3J0IGxvbmctcnVubmluZyBiYWNrZ3JvdW5kIGpvYnM6XG4gKiAtIENvbmN1cnJlbmN5IGNvbnRyb2xzIChtYXggTiBjb25jdXJyZW50IGpvYnMpXG4gKiAtIFJldHJ5IGxvZ2ljIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICogLSBKb2IgdGltZW91dHNcbiAqIC0gSm9iIHByaW9yaXR5IGFuZCBkZWxheSBzY2hlZHVsaW5nXG4gKiAtIERlYWQgbGV0dGVyIHF1ZXVlIHN1cHBvcnRcbiAqXG4gKiBQYXR0ZXJuOlxuICogMS4gbG9hZE5vZGVzKCkgLSBMb2FkIGF2YWlsYWJsZSBub2RlcyBpbnRvIE5vZGVNYXBcbiAqIDIuIGxvYWRXb3JrZmxvd3MoKSAtIExvYWQgd29ya2Zsb3dzIHdpdGggd29ya2VyIHRyaWdnZXJzXG4gKiAzLiBsaXN0ZW4oKSAtIENvbm5lY3QgdG8gam9iIGJhY2tlbmQgYW5kIHN0YXJ0IHByb2Nlc3NpbmdcbiAqIDQuIEZvciBlYWNoIGpvYjpcbiAqICAgIC0gQ3JlYXRlIGNvbnRleHQgd2l0aCB0aGlzLmNyZWF0ZUNvbnRleHQoKVxuICogICAgLSBQb3B1bGF0ZSBjdHgucmVxdWVzdCB3aXRoIGpvYiBkYXRhXG4gKiAgICAtIEV4ZWN1dGUgd29ya2Zsb3cgdmlhIHRoaXMucnVuKGN0eClcbiAqICAgIC0gQWNrIG9uIHN1Y2Nlc3MsIHJldHJ5IG9yIERMUSBvbiBmYWlsdXJlXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBIZWxwZXJSZXNwb25zZSwgdHlwZSBXb3JrZXJUcmlnZ2VyT3B0cywgdHJ5UGFyc2VEdXJhdGlvbiB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHtcblx0dHlwZSBCbG9rU2VydmljZSxcblx0Q29uY3VycmVuY3lMaW1pdEVycm9yLFxuXHRDb25jdXJyZW5jeU1ldHJpY3MsXG5cdERlYm91bmNlQ29vcmRpbmF0b3IsXG5cdERlZmF1bHRMb2dnZXIsXG5cdERlZmVycmVkRGlzcGF0Y2hTaWduYWwsXG5cdHR5cGUgR2xvYmFsT3B0aW9ucyxcblx0SmFuaXRvcixcblx0Tm9kZU1hcCxcblx0UXVldWVFeHBpcmVkRXJyb3IsXG5cdFJ1blRyYWNrZXIsXG5cdFRyaWdnZXJCYXNlLFxuXHR0eXBlIFRyaWdnZXJSZXNwb25zZSxcblx0Y3JlYXRlQ29uY3VycmVuY3lCYWNrZW5kLFxuXHRjcmVhdGVEZWJvdW5jZUJhY2tlbmQsXG59IGZyb20gXCJAYmxva2pzL3J1bm5lclwiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0LCBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAYmxva2pzL3NoYXJlZFwiO1xuaW1wb3J0IHsgdHlwZSBTcGFuLCBTcGFuU3RhdHVzQ29kZSwgbWV0cmljcywgdHJhY2UgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcblxuLyoqXG4gKiBKb2IgcmVjZWl2ZWQgZnJvbSB3b3JrZXIgcXVldWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJKb2Ige1xuXHQvKiogVW5pcXVlIGpvYiBJRCAqL1xuXHRpZDogc3RyaW5nO1xuXHQvKiogSm9iIGRhdGEgcGF5bG9hZCAqL1xuXHRkYXRhOiB1bmtub3duO1xuXHQvKiogSm9iIG1ldGFkYXRhIGhlYWRlcnMgKi9cblx0aGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0LyoqIFF1ZXVlIG5hbWUgdGhpcyBqb2IgYmVsb25ncyB0byAqL1xuXHRxdWV1ZTogc3RyaW5nO1xuXHQvKiogSm9iIHByaW9yaXR5IChoaWdoZXIgPSBtb3JlIGltcG9ydGFudCkgKi9cblx0cHJpb3JpdHk6IG51bWJlcjtcblx0LyoqIE51bWJlciBvZiBhdHRlbXB0cyBtYWRlIHNvIGZhciAqL1xuXHRhdHRlbXB0czogbnVtYmVyO1xuXHQvKiogTWF4aW11bSByZXRyeSBhdHRlbXB0cyAqL1xuXHRtYXhSZXRyaWVzOiBudW1iZXI7XG5cdC8qKiBUaW1lc3RhbXAgd2hlbiBqb2Igd2FzIGNyZWF0ZWQgKi9cblx0Y3JlYXRlZEF0OiBEYXRlO1xuXHQvKiogRGVsYXkgYmVmb3JlIHByb2Nlc3NpbmcgKG1zKSAqL1xuXHRkZWxheT86IG51bWJlcjtcblx0LyoqIEpvYiB0aW1lb3V0IChtcykgKi9cblx0dGltZW91dD86IG51bWJlcjtcblx0LyoqIE9yaWdpbmFsIHJhdyBqb2IgZnJvbSBwcm92aWRlciAqL1xuXHRyYXc6IHVua25vd247XG5cdC8qKiBNYXJrIGpvYiBhcyBjb21wbGV0ZWQgKi9cblx0Y29tcGxldGU6ICgpID0+IFByb21pc2U8dm9pZD47XG5cdC8qKiBNYXJrIGpvYiBhcyBmYWlsZWQgKG9wdGlvbmFsbHkgcmVxdWV1ZSkgKi9cblx0ZmFpbDogKGVycm9yOiBFcnJvciwgcmVxdWV1ZT86IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogV29ya2VyIGFkYXB0ZXIgaW50ZXJmYWNlIC0gaW1wbGVtZW50ZWQgYnkgZWFjaCBqb2IgYmFja2VuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckFkYXB0ZXIge1xuXHQvKiogUHJvdmlkZXIgbmFtZSAoZS5nLiwgXCJidWxsbXFcIiwgXCJpbi1tZW1vcnlcIikgKi9cblx0cmVhZG9ubHkgcHJvdmlkZXI6IHN0cmluZztcblxuXHQvKiogQ29ubmVjdCB0byB0aGUgam9iIGJhY2tlbmQgKi9cblx0Y29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKiBEaXNjb25uZWN0IGZyb20gdGhlIGpvYiBiYWNrZW5kICovXG5cdGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogU3RhcnQgcHJvY2Vzc2luZyBqb2JzIGZyb20gYSBxdWV1ZVxuXHQgKiBAcGFyYW0gY29uZmlnIFdvcmtlciB0cmlnZ2VyIGNvbmZpZ3VyYXRpb25cblx0ICogQHBhcmFtIGhhbmRsZXIgQ2FsbGJhY2sgZm9yIGVhY2ggam9iXG5cdCAqL1xuXHRwcm9jZXNzKGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChqb2I6IFdvcmtlckpvYikgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEFkZCBhIGpvYiB0byBhIHF1ZXVlIChmb3IgcHJvZ3JhbW1hdGljIGRpc3BhdGNoaW5nKVxuXHQgKiBAcGFyYW0gcXVldWUgUXVldWUgbmFtZVxuXHQgKiBAcGFyYW0gZGF0YSBKb2IgcGF5bG9hZFxuXHQgKiBAcGFyYW0gb3B0cyBKb2Igb3B0aW9uc1xuXHQgKi9cblx0YWRkSm9iKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0ZGF0YTogdW5rbm93bixcblx0XHRvcHRzPzoge1xuXHRcdFx0cHJpb3JpdHk/OiBudW1iZXI7XG5cdFx0XHRkZWxheT86IG51bWJlcjtcblx0XHRcdHJldHJpZXM/OiBudW1iZXI7XG5cdFx0XHR0aW1lb3V0PzogbnVtYmVyO1xuXHRcdFx0am9iSWQ/OiBzdHJpbmc7XG5cdFx0fSxcblx0KTogUHJvbWlzZTxzdHJpbmc+O1xuXG5cdC8qKiBTdG9wIHByb2Nlc3NpbmcgYSBzcGVjaWZpYyBxdWV1ZSAqL1xuXHRzdG9wUHJvY2Vzc2luZyhxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKiogQ2hlY2sgaWYgY29ubmVjdGVkICovXG5cdGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG5cblx0LyoqIEhlYWx0aCBjaGVjayAqL1xuXHRoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+O1xuXG5cdC8qKiBHZXQgcXVldWUgc3RhdHMgKi9cblx0Z2V0UXVldWVTdGF0cyhxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTxXb3JrZXJRdWV1ZVN0YXRzPjtcbn1cblxuLyoqXG4gKiBRdWV1ZSBzdGF0aXN0aWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyUXVldWVTdGF0cyB7XG5cdC8qKiBOdW1iZXIgb2Ygam9icyB3YWl0aW5nIHRvIGJlIHByb2Nlc3NlZCAqL1xuXHR3YWl0aW5nOiBudW1iZXI7XG5cdC8qKiBOdW1iZXIgb2Ygam9icyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkICovXG5cdGFjdGl2ZTogbnVtYmVyO1xuXHQvKiogTnVtYmVyIG9mIGNvbXBsZXRlZCBqb2JzICovXG5cdGNvbXBsZXRlZDogbnVtYmVyO1xuXHQvKiogTnVtYmVyIG9mIGZhaWxlZCBqb2JzICovXG5cdGZhaWxlZDogbnVtYmVyO1xuXHQvKiogTnVtYmVyIG9mIGRlbGF5ZWQgam9icyAqL1xuXHRkZWxheWVkOiBudW1iZXI7XG59XG5cbi8qKlxuICogV29ya2Zsb3cgbW9kZWwgd2l0aCB3b3JrZXIgdHJpZ2dlciBjb25maWd1cmF0aW9uXG4gKi9cbmludGVyZmFjZSBXb3JrZXJXb3JrZmxvd01vZGVsIHtcblx0cGF0aDogc3RyaW5nO1xuXHRjb25maWc6IHtcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0dmVyc2lvbjogc3RyaW5nO1xuXHRcdHRyaWdnZXI/OiB7XG5cdFx0XHR3b3JrZXI/OiBXb3JrZXJUcmlnZ2VyT3B0cztcblx0XHRcdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdFx0fTtcblx0XHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHR9O1xufVxuXG4vKipcbiAqIFdvcmtlclRyaWdnZXIgLSBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB3b3JrZXItYmFzZWQgdHJpZ2dlcnNcbiAqXG4gKiBQcm92aWRlcyBiYWNrZ3JvdW5kIGpvYiBwcm9jZXNzaW5nIHdpdGg6XG4gKiAtIENvbmZpZ3VyYWJsZSBjb25jdXJyZW5jeSBwZXIgcXVldWVcbiAqIC0gQXV0b21hdGljIHJldHJpZXMgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gKiAtIEpvYiB0aW1lb3V0cyB3aXRoIGF1dG9tYXRpYyBmYWlsdXJlXG4gKiAtIFByaW9yaXR5LWJhc2VkIGpvYiBvcmRlcmluZ1xuICogLSBEZWxheWVkIGpvYiBzY2hlZHVsaW5nXG4gKiAtIFF1ZXVlIHN0YXRpc3RpY3MgYW5kIG1vbml0b3JpbmdcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdvcmtlclRyaWdnZXIgZXh0ZW5kcyBUcmlnZ2VyQmFzZSB7XG5cdHByb3RlY3RlZCBub2RlTWFwOiBHbG9iYWxPcHRpb25zID0ge30gYXMgR2xvYmFsT3B0aW9ucztcblx0cHJvdGVjdGVkIHJlYWRvbmx5IHRyYWNlciA9IHRyYWNlLmdldFRyYWNlcihcblx0XHRwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgfHwgXCJ0cmlnZ2VyLXdvcmtlci13b3JrZmxvd1wiLFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfVkVSU0lPTiB8fCBcIjAuMC4xXCIsXG5cdCk7XG5cdHByb3RlY3RlZCByZWFkb25seSBsb2dnZXIgPSBuZXcgRGVmYXVsdExvZ2dlcigpO1xuXHQvKipcblx0ICogdjAuNyBQUiA1IOKAlCB0aGUgXCJkZWZhdWx0XCIgYWRhcHRlciwgdXNlZCB3aGVuIGEgd29ya2Zsb3cnc1xuXHQgKiBgdHJpZ2dlci53b3JrZXIucHJvdmlkZXJgIGZpZWxkIGlzIG9taXR0ZWQgQU5EIHRoZVxuXHQgKiBgQkxPS19XT1JLRVJfQURBUFRFUmAgZW52IHZhciBpcyB1bnNldC4gU3ViY2xhc3NlcyBNQVkgc2V0IHRoaXNcblx0ICogZm9yIGJhY2stY29tcGF0IHdpdGggdGhlIHByZS12MC43IHNpbmdsZS1hZGFwdGVyIHBhdHRlcm5cblx0ICogKGBjbGFzcyBXb3JrZXJTZXJ2ZXIgZXh0ZW5kcyBXb3JrZXJUcmlnZ2VyIHsgcHJvdGVjdGVkIGFkYXB0ZXIgPSBuZXcgTkFUU1dvcmtlckFkYXB0ZXIoKSB9YCkuXG5cdCAqXG5cdCAqIFdoZW4gdW5zZXQgQU5EIG5vIHBlci13b3JrZmxvdyBwcm92aWRlciBpcyBzcGVjaWZpZWQsIHRoZSBmYWN0b3J5XG5cdCAqIGZhbGxzIGJhY2sgdG8gYGluLW1lbW9yeWAuIFRoZSBmYWN0b3J5IHBvb2wgKGBhZGFwdGVycy9mYWN0b3J5LnRzYClcblx0ICogdHJhY2tzIG9uZSBjb25uZWN0ZWQgYWRhcHRlciBwZXIgcHJvdmlkZXIgc28gbXVsdGlwbGUgd29ya2Zsb3dzXG5cdCAqIHdpdGggdGhlIHNhbWUgcHJvdmlkZXIgc2hhcmUgYSBzaW5nbGUgYnJva2VyIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYWRhcHRlcj86IFdvcmtlckFkYXB0ZXI7XG5cblx0LyoqIEFjdGl2ZSBxdWV1ZXMgYmVpbmcgcHJvY2Vzc2VkICovXG5cdHByb3RlY3RlZCBhY3RpdmVRdWV1ZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG5cdC8qKlxuXHQgKiB2MC43IFBSIDUg4oCUIGFkYXB0ZXIgcG9vbCwga2V5ZWQgYnkgcHJvdmlkZXIgbmFtZS4gUG9wdWxhdGVkIGxhemlseVxuXHQgKiBpbnNpZGUgYGxpc3RlbigpYCBhcyB3b3JrZmxvd3MgYXJlIG1hdGNoZWQgdG8gcHJvdmlkZXJzLiBFYWNoXG5cdCAqIGFkYXB0ZXIgaXMgY29ubmVjdGVkIG9uY2UgYW5kIHJldXNlZCBhY3Jvc3Mgd29ya2Zsb3dzIHRoYXQgc2hhcmVcblx0ICogaXRzIHByb3ZpZGVyLiBEcmFpbmVkIGluIGBzdG9wKClgLlxuXHQgKi9cblx0cHJvdGVjdGVkIGFkYXB0ZXJQb29sOiBNYXA8c3RyaW5nLCBXb3JrZXJBZGFwdGVyPiA9IG5ldyBNYXAoKTtcblxuXHQvLyBTdWJjbGFzc2VzIHByb3ZpZGUgdGhlc2Vcblx0cHJvdGVjdGVkIGFic3RyYWN0IG5vZGVzOiBSZWNvcmQ8c3RyaW5nLCBCbG9rU2VydmljZTx1bmtub3duPj47XG5cdHByb3RlY3RlZCBhYnN0cmFjdCB3b3JrZmxvd3M6IFJlY29yZDxzdHJpbmcsIEhlbHBlclJlc3BvbnNlPjtcblxuXHQvLyBDb25zdHJ1Y3RvciByZW1vdmVkIGluIHYwLjYuMyDigJQgcHJlLWZpeCBpdCBjYWxsZWQgYGxvYWROb2RlcygpYCArXG5cdC8vIGBsb2FkV29ya2Zsb3dzKClgLCBidXQgc3ViY2xhc3NlcyB1c2UgY2xhc3MtZmllbGQgYXNzaWdubWVudHMgZm9yXG5cdC8vIGBub2Rlc2AgLyBgd29ya2Zsb3dzYCAodGhlIGNhbm9uaWNhbCBUeXBlU2NyaXB0IHBhdHRlcm4pLiBUaG9zZVxuXHQvLyBmaWVsZHMgcnVuIEFGVEVSIHN1cGVyKCksIHNvIGFjY2Vzc2luZyBgdGhpcy5ub2Rlc2AgZnJvbSB0aGUgcGFyZW50XG5cdC8vIGNvbnN0cnVjdG9yIHJlYWQgYHVuZGVmaW5lZGAgYW5kIGNyYXNoZWQgd2l0aFxuXHQvLyBgVHlwZUVycm9yOiB1bmRlZmluZWQgaXMgbm90IGFuIG9iamVjdCAoT2JqZWN0LmtleXModGhpcy5ub2RlcykpYC5cblx0Ly8gVGhlIHJlZ2lzdHJ5IGluaXQgbm93IGhhcHBlbnMgYXQgdGhlIHN0YXJ0IG9mIGBsaXN0ZW4oKWAsIGFmdGVyXG5cdC8vIHRoZSBzdWJjbGFzcydzIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQuXG5cblx0LyoqXG5cdCAqIExvYWQgbm9kZXMgaW50byB0aGUgbm9kZSBtYXBcblx0ICovXG5cdGxvYWROb2RlcygpOiB2b2lkIHtcblx0XHR0aGlzLm5vZGVNYXAubm9kZXMgPSBuZXcgTm9kZU1hcCgpO1xuXHRcdGNvbnN0IG5vZGVLZXlzID0gT2JqZWN0LmtleXModGhpcy5ub2Rlcyk7XG5cdFx0Zm9yIChjb25zdCBrZXkgb2Ygbm9kZUtleXMpIHtcblx0XHRcdHRoaXMubm9kZU1hcC5ub2Rlcy5hZGROb2RlKGtleSwgdGhpcy5ub2Rlc1trZXldKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCB3b3JrZmxvd3MgaW50byB0aGUgd29ya2Zsb3cgbWFwXG5cdCAqL1xuXHRsb2FkV29ya2Zsb3dzKCk6IHZvaWQge1xuXHRcdHRoaXMubm9kZU1hcC53b3JrZmxvd3MgPSB0aGlzLndvcmtmbG93cztcblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydCB0aGUgd29ya2VyIHByb2Nlc3NvciAtIG1haW4gZW50cnkgcG9pbnRcblx0ICovXG5cdGFzeW5jIGxpc3RlbigpOiBQcm9taXNlPG51bWJlcj4ge1xuXHRcdGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuc3RhcnRDb3VudGVyKCk7XG5cblx0XHQvLyBQb3B1bGF0ZSB0aGUgdHJpZ2dlcidzIG5vZGUgKyB3b3JrZmxvdyByZWdpc3RyaWVzIGZyb20gdGhlXG5cdFx0Ly8gc3ViY2xhc3MncyBgbm9kZXNgIC8gYHdvcmtmbG93c2AgZmllbGRzLiB2MC42LjMgZml4IOKAlCBwcmUtZml4XG5cdFx0Ly8gdGhlc2UgY2FsbHMgbGl2ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBjcmFzaGVkIGJlY2F1c2UgY2xhc3Ncblx0XHQvLyBmaWVsZHMgaGF2ZW4ndCBydW4geWV0IGF0IHN1cGVyLWNvbnN0cnVjdG9yIHRpbWUuIFNlZSB0aGUgY29tbWVudFxuXHRcdC8vIHdoZXJlIHRoZSBvbGQgY29uc3RydWN0b3IgdXNlZCB0byBsaXZlIGZvciB0aGUgZnVsbCByZWFzb24uXG5cdFx0dGhpcy5sb2FkTm9kZXMoKTtcblx0XHR0aGlzLmxvYWRXb3JrZmxvd3MoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBUaWVyIDIgIzYgZm9sbG93LXVwIMK3IGluc3RhbGwgdGhlIGNyb3NzLXByb2Nlc3MgY29uY3VycmVuY3lcblx0XHRcdC8vIGJhY2tlbmQgKE5BVFMgS1YpIHdoZW4gdGhlIG9wZXJhdG9yIG9wdGVkIGluIHZpYVxuXHRcdFx0Ly8gYEJMT0tfQ09OQ1VSUkVOQ1lfQkFDS0VORD1uYXRzLWt2YC4gRGVmYXVsdCBudWxsIHByZXNlcnZlcyB0aGVcblx0XHRcdC8vIGV4aXN0aW5nIGluLXByb2Nlc3MgYmVoYXZpb3IuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gUFIgMyBEMSDigJQgcmVjb3JkIGluc3RhbGwgYXR0ZW1wdHMgdmlhIE9UZWwgY291bnRlci5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGJhY2tlbmQgPSBjcmVhdGVDb25jdXJyZW5jeUJhY2tlbmQoKTtcblx0XHRcdFx0aWYgKGJhY2tlbmQpIHtcblx0XHRcdFx0XHRhd2FpdCBiYWNrZW5kLmNvbm5lY3QoKTtcblx0XHRcdFx0XHRSdW5UcmFja2VyLmdldEluc3RhbmNlKCkuc2V0Q29uY3VycmVuY3lCYWNrZW5kKGJhY2tlbmQpO1xuXHRcdFx0XHRcdENvbmN1cnJlbmN5TWV0cmljcy5nZXRJbnN0YW5jZSgpLnJlY29yZEJhY2tlbmRJbnN0YWxsKHtcblx0XHRcdFx0XHRcdGJhY2tlbmQ6IGJhY2tlbmQubmFtZSxcblx0XHRcdFx0XHRcdHN0YXR1czogXCJzdWNjZXNzXCIsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKGBbY29uY3VycmVuY3ldIGJhY2tlbmQgaW5zdGFsbGVkOiAke2JhY2tlbmQubmFtZX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdENvbmN1cnJlbmN5TWV0cmljcy5nZXRJbnN0YW5jZSgpLnJlY29yZEJhY2tlbmRJbnN0YWxsKHtcblx0XHRcdFx0XHRiYWNrZW5kOiBcInVua25vd25cIixcblx0XHRcdFx0XHRzdGF0dXM6IFwiZmFpbHVyZVwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFx0YFtjb25jdXJyZW5jeV0gYmFja2VuZCBpbnN0YWxsIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9OyBmYWxsaW5nIGJhY2sgdG8gaW4tcHJvY2VzcyBiZWhhdmlvcmAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpZXIgQyAjMSDCtyBpbnN0YWxsIHRoZSBjcm9zcy1wcm9jZXNzIGRlYm91bmNlIGJhY2tlbmRcblx0XHRcdC8vIChOQVRTIEtWIC8gUmVkaXMpIHdoZW4gdGhlIG9wZXJhdG9yIG9wdGVkIGluIHZpYVxuXHRcdFx0Ly8gYEJMT0tfREVCT1VOQ0VfQkFDS0VORGAuIERlZmF1bHQgdW5zZXQgPSB0aGUgZXhpc3Rpbmdcblx0XHRcdC8vIGluLXByb2Nlc3MgYmVoYXZpb3IgaXMgcHJlc2VydmVkLiBPbiBjb25uZWN0IGZhaWx1cmUsIGxvZyArXG5cdFx0XHQvLyBmYWxsIGJhY2sgdG8gaW4tbWVtb3J5IGNvb3JkaW5hdGlvbi5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGRlYm91bmNlQmFja2VuZCA9IGNyZWF0ZURlYm91bmNlQmFja2VuZCgpO1xuXHRcdFx0XHRpZiAoZGVib3VuY2VCYWNrZW5kKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGVhc2VSYXcgPSBwcm9jZXNzLmVudi5CTE9LX0RFQk9VTkNFX09XTkVSX0xFQVNFX01TO1xuXHRcdFx0XHRcdGlmIChsZWFzZVJhdyAmJiAvXlxcZCskLy50ZXN0KGxlYXNlUmF3KSkge1xuXHRcdFx0XHRcdFx0RGVib3VuY2VDb29yZGluYXRvci5nZXRJbnN0YW5jZSgpLnNldE93bmVyTGVhc2VNcyhOdW1iZXIobGVhc2VSYXcpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXdhaXQgZGVib3VuY2VCYWNrZW5kLmNvbm5lY3QoKTtcblx0XHRcdFx0XHREZWJvdW5jZUNvb3JkaW5hdG9yLmdldEluc3RhbmNlKCkuc2V0QmFja2VuZChkZWJvdW5jZUJhY2tlbmQpO1xuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgW2RlYm91bmNlXSBiYWNrZW5kIGluc3RhbGxlZDogJHtkZWJvdW5jZUJhY2tlbmQubmFtZX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFxuXHRcdFx0XHRcdGBbZGVib3VuY2VdIGJhY2tlbmQgaW5zdGFsbCBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfTsgZmFsbGluZyBiYWNrIHRvIGluLW1lbW9yeSBjb29yZGluYXRpb25gLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaWVyIDIgcXVpY2std2lucyBmb2xsb3ctdXAgwrcgaW5zdGFsbCBjcmFzaCBoYW5kbGVycyArIHJlY292ZXJcblx0XHRcdC8vIG9ycGhhbmVkIHJ1bnMgZnJvbSBhIHByZXZpb3VzIChkZWFkKSBwcm9jZXNzLiBJZGVtcG90ZW50ICsgb3B0LW91dFxuXHRcdFx0Ly8gdmlhIGBCTE9LX0NSQVNIX0FVVE9GTElQX0RJU0FCTEVEPTFgLlxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0V29ya2VyVHJpZ2dlci5pbnN0YWxsQ3Jhc2hIYW5kbGVycyh0aGlzLmxvZ2dlcik7XG5cdFx0XHRcdGNvbnN0IG9ycGhhbmVkID0gV29ya2VyVHJpZ2dlci5yZWNvdmVyT3JwaGFuZWRSdW5zKHVuZGVmaW5lZCwgdGhpcy5sb2dnZXIpO1xuXHRcdFx0XHRpZiAob3JwaGFuZWQgPiAwKSB7XG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKGBbY3Jhc2gtYXV0b2ZsaXBdIGZsaXBwZWQgJHtvcnBoYW5lZH0gb3JwaGFuZWQgcnVuKHMpIHRvIGNyYXNoZWQgb24gYm9vdGApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYFtjcmFzaC1hdXRvZmxpcF0gc2V0dXAgZmFpbGVkOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGllciAyIGZvbGxvdy11cCDCtyBzdGFydCB0aGUgcGVyaW9kaWMgc3RvcmFnZSBqYW5pdG9yLlxuXHRcdFx0Ly8gSWRlbXBvdGVudCAoc2luZ2xldG9uKTsgb3B0LW91dCB2aWEgYEJMT0tfSkFOSVRPUl9ESVNBQkxFRD0xYC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdEphbml0b3IuZ2V0SW5zdGFuY2UoUnVuVHJhY2tlci5nZXRJbnN0YW5jZSgpLmdldFN0b3JlKCksIHRoaXMubG9nZ2VyKS5zdGFydCgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBbamFuaXRvcl0gc2V0dXAgZmFpbGVkOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGllciAyIGZvbGxvdy11cCDCtyBpbnN0YWxsIGdyYWNlZnVsIHNodXRkb3duIGhhbmRsZXJzXG5cdFx0XHQvLyAoU0lHVEVSTSAvIFNJR0lOVCkuIElkZW1wb3RlbnQ7IG9wdC1vdXQgdmlhXG5cdFx0XHQvLyBgQkxPS19HUkFDRUZVTF9TSFVURE9XTl9ESVNBQkxFRD0xYC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdFdvcmtlclRyaWdnZXIuaW5zdGFsbFNodXRkb3duSGFuZGxlcnModGhpcywgdGhpcy5sb2dnZXIpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBbc2h1dGRvd25dIHNldHVwIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZpbmQgYWxsIHdvcmtmbG93cyB3aXRoIHdvcmtlciB0cmlnZ2Vyc1xuXHRcdFx0Y29uc3Qgd29ya2VyV29ya2Zsb3dzID0gdGhpcy5nZXRXb3JrZXJXb3JrZmxvd3MoKTtcblxuXHRcdFx0aWYgKHdvcmtlcldvcmtmbG93cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFwiTm8gd29ya2Zsb3dzIHdpdGggd29ya2VyIHRyaWdnZXJzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5lbmRDb3VudGVyKHN0YXJ0VGltZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHByb2Nlc3NpbmcgZWFjaCBxdWV1ZSwgZGlzcGF0Y2hpbmcgdG8gdGhlIHJpZ2h0IGFkYXB0ZXJcblx0XHRcdC8vIGJhc2VkIG9uIHRoZSB3b3JrZmxvdydzIGBwcm92aWRlcmAgZmllbGQgKHdpdGggYmFjay1jb21wYXRcblx0XHRcdC8vIGZhbGxiYWNrIHRvIGB0aGlzLmFkYXB0ZXJgIHdoZW4gc3ViY2xhc3NlcyBzdGlsbCBzZXQgaXQpLlxuXHRcdFx0Zm9yIChjb25zdCB3b3JrZmxvdyBvZiB3b3JrZXJXb3JrZmxvd3MpIHtcblx0XHRcdFx0Y29uc3QgY29uZmlnID0gd29ya2Zsb3cuY29uZmlnLnRyaWdnZXI/LndvcmtlciBhcyBXb3JrZXJUcmlnZ2VyT3B0cztcblx0XHRcdFx0Y29uc3QgYWRhcHRlciA9IGF3YWl0IHRoaXMucmVzb2x2ZUFkYXB0ZXJGb3JXb3JrZmxvdyhjb25maWcpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0YFN0YXJ0aW5nIHdvcmtlciBmb3IgcXVldWU6ICR7Y29uZmlnLnF1ZXVlfSB2aWEgJHthZGFwdGVyLnByb3ZpZGVyfSAoY29uY3VycmVuY3k9JHtjb25maWcuY29uY3VycmVuY3l9LCByZXRyaWVzPSR7Y29uZmlnLnJldHJpZXN9KWAsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0dGhpcy5hY3RpdmVRdWV1ZXMuYWRkKGNvbmZpZy5xdWV1ZSk7XG5cblx0XHRcdFx0YXdhaXQgYWRhcHRlci5wcm9jZXNzKGNvbmZpZywgYXN5bmMgKGpvYikgPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuaGFuZGxlSm9iKGpvYiwgd29ya2Zsb3csIGNvbmZpZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYFdvcmtlciB0cmlnZ2VyIHN0YXJ0ZWQuIFByb2Nlc3NpbmcgJHt3b3JrZXJXb3JrZmxvd3MubGVuZ3RofSBxdWV1ZShzKWApO1xuXG5cdFx0XHQvLyBFbmFibGUgSE1SIGluIGRldmVsb3BtZW50IG1vZGVcblx0XHRcdGlmIChwcm9jZXNzLmVudi5CTE9LX0hNUiA9PT0gXCJ0cnVlXCIgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmVuYWJsZUhvdFJlbG9hZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5lbmRDb3VudGVyKHN0YXJ0VGltZSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc3RhcnQgd29ya2VyIHRyaWdnZXI6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN0b3AgYWxsIHdvcmtlcnMgYW5kIGRpc2Nvbm5lY3Rcblx0ICovXG5cdGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gU3RvcCBlYWNoIHF1ZXVlIG9uIGl0cyBvd25pbmcgYWRhcHRlciDigJQgYWRhcHRlcnMgYXJlIHRyYWNrZWRcblx0XHQvLyBpbiB0aGUgcG9vbCBzbyBtdWx0aS1wcm92aWRlciB3b3JrZXJzIGFsbCBkcmFpbiBjbGVhbmx5LlxuXHRcdGZvciAoY29uc3QgcXVldWUgb2YgdGhpcy5hY3RpdmVRdWV1ZXMpIHtcblx0XHRcdGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJQb29sLnZhbHVlcygpKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YXdhaXQgYWRhcHRlci5zdG9wUHJvY2Vzc2luZyhxdWV1ZSk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdC8qIHN3YWxsb3cg4oCUIGFkYXB0ZXIgbWF5IG5vdCBvd24gdGhpcyBxdWV1ZSAqL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYFN0b3BwZWQgcHJvY2Vzc2luZyBxdWV1ZTogJHtxdWV1ZX1gKTtcblx0XHR9XG5cdFx0dGhpcy5hY3RpdmVRdWV1ZXMuY2xlYXIoKTtcblx0XHQvLyBEaXNjb25uZWN0IGV2ZXJ5IGFkYXB0ZXIgd2UgZXZlciBjb25uZWN0ZWQuXG5cdFx0Zm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlclBvb2wudmFsdWVzKCkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGFkYXB0ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBbYmxva11bd29ya2VyXSBkaXNjb25uZWN0IGZhaWxlZDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmFkYXB0ZXJQb29sLmNsZWFyKCk7XG5cdFx0dGhpcy5kZXN0cm95TW9uaXRvcmluZygpO1xuXHRcdHRoaXMubG9nZ2VyLmxvZyhcIldvcmtlciB0cmlnZ2VyIHN0b3BwZWRcIik7XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgb25IbXJXb3JrZmxvd0NoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmxvZ2dlci5sb2coXCJbSE1SXSBXb3JrZXIgd29ya2Zsb3cgY2hhbmdlZCwgcmVsb2FkaW5nLi4uXCIpO1xuXHRcdGF3YWl0IHRoaXMud2FpdEZvckluRmxpZ2h0UmVxdWVzdHMoKTtcblx0XHRhd2FpdCB0aGlzLnN0b3AoKTtcblx0XHR0aGlzLmxvYWRXb3JrZmxvd3MoKTtcblx0XHRhd2FpdCB0aGlzLmxpc3RlbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BhdGNoIGEgam9iIHRvIGEgd29ya2VyIHF1ZXVlXG5cdCAqL1xuXHRhc3luYyBkaXNwYXRjaChcblx0XHRxdWV1ZTogc3RyaW5nLFxuXHRcdGRhdGE6IHVua25vd24sXG5cdFx0b3B0cz86IHtcblx0XHRcdHByaW9yaXR5PzogbnVtYmVyO1xuXHRcdFx0ZGVsYXk/OiBudW1iZXI7XG5cdFx0XHRyZXRyaWVzPzogbnVtYmVyO1xuXHRcdFx0dGltZW91dD86IG51bWJlcjtcblx0XHRcdGpvYklkPzogc3RyaW5nO1xuXHRcdH0sXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Ly8gQmFjay1jb21wYXQ6IHdoZW4gYSBzdWJjbGFzcyBzZXQgYHRoaXMuYWRhcHRlcmAsIHVzZSBpdC5cblx0XHQvLyBPdGhlcndpc2UgZGlzcGF0Y2ggdmlhIHRoZSBmaXJzdCBwb29sIGFkYXB0ZXIg4oCUIHR5cGljYWxseSB0aGVcblx0XHQvLyBvbmx5IG9uZSB3aGVuIGEgcHJvY2VzcyBvd25zIG9uZSB0cmlnZ2VyIHdvcmtmbG93LlxuXHRcdGNvbnN0IGFkYXB0ZXIgPVxuXHRcdFx0dGhpcy5hZGFwdGVyID8/XG5cdFx0XHQodGhpcy5hZGFwdGVyUG9vbC5zaXplID4gMCA/ICh0aGlzLmFkYXB0ZXJQb29sLnZhbHVlcygpLm5leHQoKS52YWx1ZSBhcyBXb3JrZXJBZGFwdGVyKSA6IHVuZGVmaW5lZCk7XG5cdFx0aWYgKCFhZGFwdGVyKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFwiW2Jsb2tdW3dvcmtlcl0gZGlzcGF0Y2goKSBjYWxsZWQgYmVmb3JlIGFueSBhZGFwdGVyIGlzIGNvbm5lY3RlZC4gQ2FsbCBsaXN0ZW4oKSBmaXJzdCwgb3Igc2V0IHRoaXMuYWRhcHRlciBvbiB0aGUgc3ViY2xhc3MuXCIsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gYWRhcHRlci5hZGRKb2IocXVldWUsIGRhdGEsIG9wdHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBzdGF0aXN0aWNzIGZvciBhIHF1ZXVlXG5cdCAqL1xuXHRhc3luYyBnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+IHtcblx0XHRjb25zdCBhZGFwdGVyID1cblx0XHRcdHRoaXMuYWRhcHRlciA/P1xuXHRcdFx0KHRoaXMuYWRhcHRlclBvb2wuc2l6ZSA+IDAgPyAodGhpcy5hZGFwdGVyUG9vbC52YWx1ZXMoKS5uZXh0KCkudmFsdWUgYXMgV29ya2VyQWRhcHRlcikgOiB1bmRlZmluZWQpO1xuXHRcdGlmICghYWRhcHRlcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcIltibG9rXVt3b3JrZXJdIGdldFF1ZXVlU3RhdHMoKSBjYWxsZWQgYmVmb3JlIGFueSBhZGFwdGVyIGlzIGNvbm5lY3RlZC4gQ2FsbCBsaXN0ZW4oKSBmaXJzdCwgb3Igc2V0IHRoaXMuYWRhcHRlciBvbiB0aGUgc3ViY2xhc3MuXCIsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gYWRhcHRlci5nZXRRdWV1ZVN0YXRzKHF1ZXVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgbGlzdCBvZiBhY3RpdmUgcXVldWVzXG5cdCAqL1xuXHRnZXRBY3RpdmVRdWV1ZXMoKTogc3RyaW5nW10ge1xuXHRcdHJldHVybiBBcnJheS5mcm9tKHRoaXMuYWN0aXZlUXVldWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiB2MC43IFBSIDUg4oCUIHBpY2sgdGhlIGFkYXB0ZXIgZm9yIGEgd29ya2Zsb3cncyBgcHJvdmlkZXJgIGZpZWxkLlxuXHQgKlxuXHQgKiBSZXNvbHV0aW9uIG9yZGVyOlxuXHQgKiAgIDEuIFN1YmNsYXNzLXNldCBgdGhpcy5hZGFwdGVyYCAoYmFjay1jb21wYXQ6IHByZS12MC43IHBhdHRlcm5cblx0ICogICAgICB3aGVyZSBvbmUgcHJvY2VzcyBiaW5kcyB0byBvbmUgYWRhcHRlciBhdCBjb25zdHJ1Y3Rpb24gdGltZSkuXG5cdCAqICAgMi4gUGVyLXdvcmtmbG93IGBwcm92aWRlcmAgZmllbGQsIGxvb2tlZCB1cCB2aWEgdGhlIGZhY3RvcnkuXG5cdCAqICAgMy4gYEJMT0tfV09SS0VSX0FEQVBURVJgIGVudiB2YXIuXG5cdCAqICAgNC4gYGluLW1lbW9yeWAgZmFsbGJhY2suXG5cdCAqXG5cdCAqIEFkYXB0ZXJzIGFyZSBjb25uZWN0ZWQgb24gZmlyc3QgdXNlIGFuZCBwb29sZWQgcGVyIHByb3ZpZGVyIHNvXG5cdCAqIG11bHRpcGxlIHdvcmtmbG93cyBzaGFyaW5nIGEgcHJvdmlkZXIgc2hhcmUgb25lIGJyb2tlclxuXHQgKiBjb25uZWN0aW9uLiBIZWFsdGgtZGVwZW5kZW5jeSByZWdpc3RyYXRpb24gYWxzbyBoYXBwZW5zIGhlcmUgc29cblx0ICogZWFjaCBwcm92aWRlciBpcyB0cmFja2VkIGluZGl2aWR1YWxseSBpbiBgL2hlYWx0aGAuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUFkYXB0ZXJGb3JXb3JrZmxvdyhjb25maWc6IFdvcmtlclRyaWdnZXJPcHRzKTogUHJvbWlzZTxXb3JrZXJBZGFwdGVyPiB7XG5cdFx0Ly8gU3ViY2xhc3Mgb3ZlcnJpZGUgd2lucyBmb3IgYmFjay1jb21wYXQuXG5cdFx0aWYgKHRoaXMuYWRhcHRlcikge1xuXHRcdFx0aWYgKCF0aGlzLmFkYXB0ZXIuaXNDb25uZWN0ZWQoKSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmFkYXB0ZXIuY29ubmVjdCgpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYENvbm5lY3RlZCB0byAke3RoaXMuYWRhcHRlci5wcm92aWRlcn0gd29ya2VyIHN5c3RlbSAoc3ViY2xhc3MgYWRhcHRlcilgKTtcblx0XHRcdFx0dGhpcy5yZWdpc3RlckFkYXB0ZXJIZWFsdGgodGhpcy5hZGFwdGVyKTtcblx0XHRcdH1cblx0XHRcdC8vIFBvb2wtdHJhY2sgc28gc3RvcCgpIGNhbiBkcmFpbiBpdC5cblx0XHRcdHRoaXMuYWRhcHRlclBvb2wuc2V0KHRoaXMuYWRhcHRlci5wcm92aWRlciwgdGhpcy5hZGFwdGVyKTtcblx0XHRcdHJldHVybiB0aGlzLmFkYXB0ZXI7XG5cdFx0fVxuXG5cdFx0Ly8gTGF6eS1pbXBvcnQgdGhlIGZhY3Rvcnkgc28gdGhlIHdvcmtlciBwYWNrYWdlIGRvZXNuJ3QgcHVsbCBpblxuXHRcdC8vIGV2ZXJ5IGFkYXB0ZXIgb24gaW1wb3J0IOKAlCBvbmx5IHRoZSBvbmVzIGFjdHVhbGx5IGV4ZXJjaXNlZC5cblx0XHRjb25zdCB7IHJlc29sdmVQcm92aWRlciwgY3JlYXRlV29ya2VyQWRhcHRlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi9hZGFwdGVycy9mYWN0b3J5XCIpO1xuXHRcdGNvbnN0IHByb3ZpZGVyID0gcmVzb2x2ZVByb3ZpZGVyKGNvbmZpZy5wcm92aWRlcik7XG5cdFx0bGV0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJQb29sLmdldChwcm92aWRlcik7XG5cdFx0aWYgKCFhZGFwdGVyKSB7XG5cdFx0XHRhZGFwdGVyID0gY3JlYXRlV29ya2VyQWRhcHRlcihwcm92aWRlcik7XG5cdFx0XHRhd2FpdCBhZGFwdGVyLmNvbm5lY3QoKTtcblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgQ29ubmVjdGVkIHRvICR7YWRhcHRlci5wcm92aWRlcn0gd29ya2VyIHN5c3RlbWApO1xuXHRcdFx0dGhpcy5yZWdpc3RlckFkYXB0ZXJIZWFsdGgoYWRhcHRlcik7XG5cdFx0XHR0aGlzLmFkYXB0ZXJQb29sLnNldChwcm92aWRlciwgYWRhcHRlcik7XG5cdFx0fVxuXHRcdHJldHVybiBhZGFwdGVyO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3RlckFkYXB0ZXJIZWFsdGgoYWRhcHRlcjogV29ya2VyQWRhcHRlcik6IHZvaWQge1xuXHRcdHRoaXMucmVnaXN0ZXJIZWFsdGhEZXBlbmRlbmN5KGB3b3JrZXItJHthZGFwdGVyLnByb3ZpZGVyfWAsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IGhlYWx0aHkgPSBhd2FpdCBhZGFwdGVyLmhlYWx0aENoZWNrKCk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzdGF0dXM6IGhlYWx0aHkgPyAoXCJoZWFsdGh5XCIgYXMgY29uc3QpIDogKFwidW5oZWFsdGh5XCIgYXMgY29uc3QpLFxuXHRcdFx0XHRsYXN0Q2hlY2tlZDogRGF0ZS5ub3coKSxcblx0XHRcdFx0bWVzc2FnZTogaGVhbHRoeSA/IFwiQ29ubmVjdGVkXCIgOiBcIkNvbm5lY3Rpb24gbG9zdFwiLFxuXHRcdFx0fTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYWxsIHdvcmtmbG93cyB0aGF0IGhhdmUgd29ya2VyIHRyaWdnZXJzXG5cdCAqL1xuXHRwcm90ZWN0ZWQgZ2V0V29ya2VyV29ya2Zsb3dzKCk6IFdvcmtlcldvcmtmbG93TW9kZWxbXSB7XG5cdFx0Y29uc3Qgd29ya2Zsb3dzOiBXb3JrZXJXb3JrZmxvd01vZGVsW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgW3BhdGgsIHdvcmtmbG93XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm5vZGVNYXAud29ya2Zsb3dzIHx8IHt9KSkge1xuXHRcdFx0Y29uc3Qgd29ya2Zsb3dDb25maWcgPSAod29ya2Zsb3cgYXMgdW5rbm93biBhcyB7IF9jb25maWc6IFdvcmtlcldvcmtmbG93TW9kZWxbXCJjb25maWdcIl0gfSkuX2NvbmZpZztcblxuXHRcdFx0aWYgKHdvcmtmbG93Q29uZmlnPy50cmlnZ2VyKSB7XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJUeXBlID0gT2JqZWN0LmtleXMod29ya2Zsb3dDb25maWcudHJpZ2dlcilbMF07XG5cblx0XHRcdFx0aWYgKHRyaWdnZXJUeXBlID09PSBcIndvcmtlclwiICYmIHdvcmtmbG93Q29uZmlnLnRyaWdnZXIud29ya2VyKSB7XG5cdFx0XHRcdFx0d29ya2Zsb3dzLnB1c2goe1xuXHRcdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHRcdGNvbmZpZzogd29ya2Zsb3dDb25maWcsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gd29ya2Zsb3dzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZSBhbiBpbmNvbWluZyBqb2Jcblx0ICovXG5cdHByb3RlY3RlZCBhc3luYyBoYW5kbGVKb2Ioam9iOiBXb3JrZXJKb2IsIHdvcmtmbG93OiBXb3JrZXJXb3JrZmxvd01vZGVsLCBjb25maWc6IFdvcmtlclRyaWdnZXJPcHRzKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgam9iSWQgPSBqb2IuaWQgfHwgdXVpZCgpO1xuXHRcdGNvbnN0IGRlZmF1bHRNZXRlciA9IG1ldHJpY3MuZ2V0TWV0ZXIoXCJkZWZhdWx0XCIpO1xuXHRcdGNvbnN0IHdvcmtlckpvYnMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcIndvcmtlcl9qb2JzX3Byb2Nlc3NlZFwiLCB7XG5cdFx0XHRkZXNjcmlwdGlvbjogXCJXb3JrZXIgam9icyBwcm9jZXNzZWRcIixcblx0XHR9KTtcblx0XHRjb25zdCB3b3JrZXJFcnJvcnMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcIndvcmtlcl9qb2JzX2ZhaWxlZFwiLCB7XG5cdFx0XHRkZXNjcmlwdGlvbjogXCJXb3JrZXIgam9iIGZhaWx1cmVzXCIsXG5cdFx0fSk7XG5cdFx0Y29uc3Qgd29ya2VyUmV0cmllcyA9IGRlZmF1bHRNZXRlci5jcmVhdGVDb3VudGVyKFwid29ya2VyX2pvYnNfcmV0cmllZFwiLCB7XG5cdFx0XHRkZXNjcmlwdGlvbjogXCJXb3JrZXIgam9iIHJldHJpZXNcIixcblx0XHR9KTtcblxuXHRcdGF3YWl0IHRoaXMudHJhY2VyLnN0YXJ0QWN0aXZlU3Bhbihgd29ya2VyOiR7Y29uZmlnLnF1ZXVlfWAsIGFzeW5jIChzcGFuOiBTcGFuKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG5cdFx0XHRcdC8vIEluaXRpYWxpemUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB3b3JrZmxvd1xuXHRcdFx0XHRhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uaW5pdCh3b3JrZmxvdy5wYXRoLCB0aGlzLm5vZGVNYXApO1xuXG5cdFx0XHRcdC8vIENyZWF0ZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IGN0eDogQ29udGV4dCA9IHRoaXMuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQsIHdvcmtmbG93LnBhdGgsIGpvYklkKTtcblxuXHRcdFx0XHQvLyBQb3B1bGF0ZSByZXF1ZXN0IHdpdGggam9iIGRhdGFcblx0XHRcdFx0Y3R4LnJlcXVlc3QgPSB7XG5cdFx0XHRcdFx0Ym9keTogam9iLmRhdGEsXG5cdFx0XHRcdFx0aGVhZGVyczogam9iLmhlYWRlcnMsXG5cdFx0XHRcdFx0cXVlcnk6IHt9LFxuXHRcdFx0XHRcdHBhcmFtczoge1xuXHRcdFx0XHRcdFx0cXVldWU6IGpvYi5xdWV1ZSxcblx0XHRcdFx0XHRcdGpvYklkOiBqb2IuaWQsXG5cdFx0XHRcdFx0XHRhdHRlbXB0OiBTdHJpbmcoam9iLmF0dGVtcHRzKSxcblx0XHRcdFx0XHRcdHByaW9yaXR5OiBTdHJpbmcoam9iLnByaW9yaXR5KSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9IGFzIHVua25vd24gYXMgUmVxdWVzdENvbnRleHQ7XG5cblx0XHRcdFx0Ly8gU3RvcmUgd29ya2VyIG1ldGFkYXRhIGluIGNvbnRleHRcblx0XHRcdFx0aWYgKCFjdHgudmFycykgY3R4LnZhcnMgPSB7fTtcblx0XHRcdFx0Y3R4LnZhcnMuX3dvcmtlcl9qb2IgPSB7XG5cdFx0XHRcdFx0aWQ6IGpvYi5pZCxcblx0XHRcdFx0XHRxdWV1ZTogam9iLnF1ZXVlLFxuXHRcdFx0XHRcdGF0dGVtcHRzOiBTdHJpbmcoam9iLmF0dGVtcHRzKSxcblx0XHRcdFx0XHRtYXhSZXRyaWVzOiBTdHJpbmcoam9iLm1heFJldHJpZXMpLFxuXHRcdFx0XHRcdHByaW9yaXR5OiBTdHJpbmcoam9iLnByaW9yaXR5KSxcblx0XHRcdFx0XHRjcmVhdGVkQXQ6IGpvYi5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSxcblx0XHRcdFx0XHRkZWxheTogU3RyaW5nKGpvYi5kZWxheSA/PyAwKSxcblx0XHRcdFx0XHR0aW1lb3V0OiBTdHJpbmcoam9iLnRpbWVvdXQgPz8gMCksXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y3R4LmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0YFByb2Nlc3Npbmcgam9iICR7am9iSWR9IGZyb20gJHtjb25maWcucXVldWV9IChhdHRlbXB0ICR7am9iLmF0dGVtcHRzICsgMX0vJHtqb2IubWF4UmV0cmllcyArIDF9KWAsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gdjAuNiDCtyBhcHBseSB0aGUgbWVyZ2VkIG1pZGRsZXdhcmUgY2hhaW4gKHByb2Nlc3MtZ2xvYmFsIOKGklxuXHRcdFx0XHQvLyB3b3JrZmxvdy1sZXZlbCDihpIgdHJpZ2dlci1sZXZlbCkgb24gdGhlIHNhbWUgY3R4IHRoZSBtYWluXG5cdFx0XHRcdC8vIHdvcmtmbG93IHdpbGwgc2VlLiBTdGF0ZSBtdXRhdGlvbnMgZnJvbSBtaWRkbGV3YXJlXG5cdFx0XHRcdC8vIChlLmcuIGN0eC5zdGF0ZS5pZGVudGl0eSkgY2FycnkgZm9yd2FyZC4gTWlkZGxld2FyZSB0aGF0XG5cdFx0XHRcdC8vIHRocm93cyAodmlhIGBAYmxva2pzL3Rocm93YCkgcHJvcGFnYXRlcyB0byB0aGUgb3V0ZXJcblx0XHRcdFx0Ly8gY2F0Y2ggYW5kIGlzIHJvdXRlZCB0aHJvdWdoIHRoZSB3b3JrZXIncyByZXRyeSAvIERMUVxuXHRcdFx0XHQvLyBsb2dpYyBleGFjdGx5IGxpa2UgYSBtYWluLXdvcmtmbG93IGVycm9yLlxuXHRcdFx0XHRhd2FpdCB0aGlzLmFwcGx5TWlkZGxld2FyZUNoYWluKGN0eCwgdGhpcy5ub2RlTWFwKTtcblxuXHRcdFx0XHQvLyBFeGVjdXRlIHdvcmtmbG93IHdpdGggdGltZW91dCBpZiBjb25maWd1cmVkXG5cdFx0XHRcdGxldCByZXNwb25zZTogVHJpZ2dlclJlc3BvbnNlO1xuXHRcdFx0XHRpZiAoY29uZmlnLnRpbWVvdXQgJiYgY29uZmlnLnRpbWVvdXQgPiAwKSB7XG5cdFx0XHRcdFx0cmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGVXaXRoVGltZW91dChjdHgsIGNvbmZpZy50aW1lb3V0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNwb25zZSA9IGF3YWl0IHRoaXMucnVuKGN0eCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBlbmQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuXHRcdFx0XHQvLyBTZXQgc3BhbiBhdHRyaWJ1dGVzXG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCB0cnVlKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJqb2JfaWRcIiwgam9iSWQpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInF1ZXVlXCIsIGNvbmZpZy5xdWV1ZSk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiYXR0ZW1wdHNcIiwgam9iLmF0dGVtcHRzKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJlbGFwc2VkX21zXCIsIGVuZCAtIHN0YXJ0KTtcblx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSyB9KTtcblxuXHRcdFx0XHQvLyBSZWNvcmQgbWV0cmljc1xuXHRcdFx0XHR3b3JrZXJKb2JzLmFkZCgxLCB7XG5cdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRxdWV1ZTogY29uZmlnLnF1ZXVlLFxuXHRcdFx0XHRcdHdvcmtmbG93X25hbWU6IHRoaXMuY29uZmlndXJhdGlvbi5uYW1lLFxuXHRcdFx0XHRcdHN1Y2Nlc3M6IFwidHJ1ZVwiLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjdHgubG9nZ2VyLmxvZyhgSm9iIGNvbXBsZXRlZCBpbiAkeyhlbmQgLSBzdGFydCkudG9GaXhlZCgyKX1tczogJHtqb2JJZH1gKTtcblxuXHRcdFx0XHQvLyBNYXJrIGpvYiBhcyBjb21wbGV0ZWRcblx0XHRcdFx0YXdhaXQgam9iLmNvbXBsZXRlKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2U7XG5cblx0XHRcdFx0Ly8gVGllciAyICM1ICsgIzcg4oCUIGRlZmVycmVkIGRpc3BhdGNoIChkZWxheS9UVEwvZGVib3VuY2UpLlxuXHRcdFx0XHQvLyBUaGUgcnVuIHdhcyBkZWZlcnJlZCB0byBhIGZ1dHVyZSB0aW1lcjsgQUNLIHdpdGhvdXQgcmV0cnkuXG5cdFx0XHRcdC8vIFRoZSBpbi1wcm9jZXNzIHNjaGVkdWxlciBvd25zIHRoZSBldmVudHVhbCBkaXNwYXRjaCwgTk9UXG5cdFx0XHRcdC8vIHRoZSBicm9rZXIg4oCUIHJlLXF1ZXVlaW5nIGhlcmUgd291bGQgY3JlYXRlIGEgZHVwbGljYXRlLlxuXHRcdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBEZWZlcnJlZERpc3BhdGNoU2lnbmFsKSB7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImRlZmVycmVkXCIsIHRydWUpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiZGVmZXJyZWRfc3RhdHVzXCIsIGVycm9yLmluZm8uc3RhdHVzKTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LLCBtZXNzYWdlOiBgZGVmZXJyZWQ6JHtlcnJvci5pbmZvLnN0YXR1c31gIH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFxuXHRcdFx0XHRcdFx0YFtzY2hlZHVsaW5nXSBqb2IgJHtqb2JJZH0gcnVuSWQ9JHtlcnJvci5pbmZvLnJ1bklkfSBzdGF0dXM9JHtlcnJvci5pbmZvLnN0YXR1c30gYCArXG5cdFx0XHRcdFx0XHRcdGBzY2hlZHVsZWRBdD0ke2Vycm9yLmluZm8uc2NoZWR1bGVkQXR9IHBpbmdDb3VudD0ke2Vycm9yLmluZm8ucGluZ0NvdW50fSDihpIgQUNLIChubyByZXF1ZXVlKWAsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5jb21wbGV0ZSgpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFBSIDEtNSBwb2xpc2gg4oCUIHF1ZXVlLW1vZGUgVFRMIGVsYXBzZWQuIFRoZSBydW4gaXMgYWxyZWFkeVxuXHRcdFx0XHQvLyBmbGlwcGVkIHRvIGBleHBpcmVkYCAoc2VlIFRyaWdnZXJCYXNlIHF1ZXVlIGJyYW5jaCk7IEFDS1xuXHRcdFx0XHQvLyB3aXRob3V0IHJldHJ5IHNvIHRoZSBicm9rZXIgZG9lc24ndCByZWRlbGl2ZXIg4oCUIHRoZSBydW5cblx0XHRcdFx0Ly8gd2lsbCBuZXZlciBzdWNjZWVkICh0aW1lciB3b24ndCByZS1maXJlKS4gRGlzdGluY3QgZnJvbVxuXHRcdFx0XHQvLyB0aGUgdGhyb3R0bGVkIE5BQ0sgYmVsb3cuXG5cdFx0XHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIFF1ZXVlRXhwaXJlZEVycm9yKSB7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInF1ZXVlX2V4cGlyZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSywgbWVzc2FnZTogXCJxdWV1ZV9leHBpcmVkXCIgfSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0XHRgW2NvbmN1cnJlbmN5XSBqb2IgJHtqb2JJZH0gcnVuSWQ9JHtlcnJvci5pbmZvLnJ1bklkfSBrZXk9JyR7ZXJyb3IuaW5mby5jb25jdXJyZW5jeUtleX0nIGAgK1xuXHRcdFx0XHRcdFx0XHRgcXVldWVFeHBpcmVkQXQ9JHtlcnJvci5pbmZvLnF1ZXVlRXhwaXJlZEF0fSDihpIgQUNLIChubyByZXF1ZXVlLCBydW4gZXhwaXJlZClgLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRhd2FpdCBqb2IuY29tcGxldGUoKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUaWVyIDIgIzYg4oCUIGNvbmN1cnJlbmN5IGdhdGUgZGVuaWFsLiBEaXN0aW5jdCBmcm9tIGEgbm9ybWFsXG5cdFx0XHRcdC8vIGZhaWx1cmU6IE5BQ0sgd2l0aCByZWRlbGl2ZXJ5IHNvIHRoZSBicm9rZXIgcmUtcXVldWVzIHRoZVxuXHRcdFx0XHQvLyBqb2Igd2l0aCBpdHMgZXhpc3RpbmcgYmFjay1vZmYgc2VtYW50aWNzLiBEb2Vzbid0IGNvdW50XG5cdFx0XHRcdC8vIGFnYWluc3QgdGhlIHdvcmtmbG93J3MgcmV0cnkgYnVkZ2V0IChkaWZmZXJlbnQgaW52YXJpYW50KS5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHBhc3MgYHdpbGxSZXRyeTogdHJ1ZWAgcmVnYXJkbGVzcyBvZiBgam9iLmF0dGVtcHRzYFxuXHRcdFx0XHQvLyBiZWNhdXNlIHRocm90dGxpbmcgaXMgYSB0cmFuc2llbnQgcmVzb3VyY2Ugc3RhdGUsIG5vdCBhXG5cdFx0XHRcdC8vIHBlcm1hbmVudCBmYWlsdXJlLlxuXHRcdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb25jdXJyZW5jeUxpbWl0RXJyb3IpIHtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwid2lsbF9yZXRyeVwiLCB0cnVlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInRocm90dGxlZFwiLCB0cnVlKTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LLCBtZXNzYWdlOiBcImNvbmN1cnJlbmN5X2xpbWl0X3JlYWNoZWRcIiB9KTtcblxuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhcblx0XHRcdFx0XHRcdGBbY29uY3VycmVuY3ldIGpvYiAke2pvYklkfSBrZXk9JyR7ZXJyb3IuaW5mby5jb25jdXJyZW5jeUtleX0nIGAgK1xuXHRcdFx0XHRcdFx0XHRgbGltaXQ9JHtlcnJvci5pbmZvLmNvbmN1cnJlbmN5TGltaXR9IGluRmxpZ2h0PSR7ZXJyb3IuaW5mby5jdXJyZW50SW5GbGlnaHR9IOKGkiBOQUNLICsgcmVkZWxpdmVyeWAsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHdvcmtlclJldHJpZXMuYWRkKDEsIHtcblx0XHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0XHRxdWV1ZTogY29uZmlnLnF1ZXVlLFxuXHRcdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogdGhpcy5jb25maWd1cmF0aW9uPy5uYW1lIHx8IFwidW5rbm93blwiLFxuXHRcdFx0XHRcdFx0cmVhc29uOiBcInRocm90dGxlZFwiLFxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0YXdhaXQgam9iLmZhaWwoZXJyb3IgYXMgRXJyb3IsIHRydWUpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHNob3VsZFJldHJ5ID0gam9iLmF0dGVtcHRzIDwgam9iLm1heFJldHJpZXM7XG5cblx0XHRcdFx0Ly8gU2V0IHNwYW4gZXJyb3Jcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJ3aWxsX3JldHJ5XCIsIHNob3VsZFJldHJ5KTtcblx0XHRcdFx0c3Bhbi5yZWNvcmRFeGNlcHRpb24oZXJyb3IgYXMgRXJyb3IpO1xuXHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLCBtZXNzYWdlOiBlcnJvck1lc3NhZ2UgfSk7XG5cblx0XHRcdFx0aWYgKHNob3VsZFJldHJ5KSB7XG5cdFx0XHRcdFx0Ly8gUmV0cnkgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmLiBgY29uZmlnLmRlbGF5YCB3aWRlbmVkIHRvXG5cdFx0XHRcdFx0Ly8gYHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZGAgaW4gVGllciAyICM1IChkdXJhdGlvbiBzdHJpbmdzKS5cblx0XHRcdFx0XHQvLyBgY2FsY3VsYXRlQmFja29mZmAgb25seSBoYW5kbGVzIG51bWJlcnM7IG5vcm1hbGl6ZSB2aWFcblx0XHRcdFx0XHQvLyB0cnlQYXJzZUR1cmF0aW9uLiBGYWlsLW9wZW4gdG8gdW5kZWZpbmVkIOKGkiBkZWZhdWx0IGJhY2tvZmYuXG5cdFx0XHRcdFx0Y29uc3QgZGVsYXlNcyA9XG5cdFx0XHRcdFx0XHR0eXBlb2YgY29uZmlnLmRlbGF5ID09PSBcIm51bWJlclwiXG5cdFx0XHRcdFx0XHRcdD8gY29uZmlnLmRlbGF5XG5cdFx0XHRcdFx0XHRcdDogdHlwZW9mIGNvbmZpZy5kZWxheSA9PT0gXCJzdHJpbmdcIlxuXHRcdFx0XHRcdFx0XHRcdD8gKHRyeVBhcnNlRHVyYXRpb24oY29uZmlnLmRlbGF5KSA/PyB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0Y29uc3QgYmFja29mZk1zID0gdGhpcy5jYWxjdWxhdGVCYWNrb2ZmKGpvYi5hdHRlbXB0cywgZGVsYXlNcyk7XG5cdFx0XHRcdFx0d29ya2VyUmV0cmllcy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdHF1ZXVlOiBjb25maWcucXVldWUsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdFx0XHRhdHRlbXB0OiBTdHJpbmcoam9iLmF0dGVtcHRzICsgMSksXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XHRcdGBKb2IgJHtqb2JJZH0gZmFpbGVkIChhdHRlbXB0ICR7am9iLmF0dGVtcHRzICsgMX0vJHtqb2IubWF4UmV0cmllcyArIDF9KSwgcmV0cnlpbmcgaW4gJHtiYWNrb2ZmTXN9bXM6ICR7ZXJyb3JNZXNzYWdlfWAsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5mYWlsKGVycm9yIGFzIEVycm9yLCB0cnVlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBNYXggcmV0cmllcyBleGhhdXN0ZWQgLSBzZW5kIHRvIERMUVxuXHRcdFx0XHRcdHdvcmtlckVycm9ycy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdHF1ZXVlOiBjb25maWcucXVldWUsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XHRcdGBKb2IgJHtqb2JJZH0gcGVybWFuZW50bHkgZmFpbGVkIGFmdGVyICR7am9iLmF0dGVtcHRzICsgMX0gYXR0ZW1wdHM6ICR7ZXJyb3JNZXNzYWdlfWAsXG5cdFx0XHRcdFx0XHQoZXJyb3IgYXMgRXJyb3IpLnN0YWNrLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRhd2FpdCBqb2IuZmFpbChlcnJvciBhcyBFcnJvciwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRzcGFuLmVuZCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgd29ya2Zsb3cgd2l0aCBhIHRpbWVvdXRcblx0ICovXG5cdHByb3RlY3RlZCBhc3luYyBleGVjdXRlV2l0aFRpbWVvdXQoY3R4OiBDb250ZXh0LCB0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8VHJpZ2dlclJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPFRyaWdnZXJSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0cmVqZWN0KG5ldyBFcnJvcihgSm9iIHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXRNc31tc2ApKTtcblx0XHRcdH0sIHRpbWVvdXRNcyk7XG5cblx0XHRcdHRoaXMucnVuKGN0eClcblx0XHRcdFx0LnRoZW4oKHJlc3VsdCkgPT4ge1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHRcdFx0cmVzb2x2ZShyZXN1bHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGUgZXhwb25lbnRpYWwgYmFja29mZiBkZWxheVxuXHQgKiBGb3JtdWxhOiBtaW4oYmFzZURlbGF5ICogMl5hdHRlbXB0LCAzMDAwMCkgKyBqaXR0ZXJcblx0ICovXG5cdHByb3RlY3RlZCBjYWxjdWxhdGVCYWNrb2ZmKGF0dGVtcHQ6IG51bWJlciwgYmFzZURlbGF5PzogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRjb25zdCBiYXNlID0gYmFzZURlbGF5ID8/IDEwMDA7XG5cdFx0Y29uc3QgbWF4RGVsYXkgPSAzMDAwMDsgLy8gMzAgc2Vjb25kcyBtYXhcblx0XHRjb25zdCBleHBvbmVudGlhbCA9IE1hdGgubWluKGJhc2UgKiAyICoqIGF0dGVtcHQsIG1heERlbGF5KTtcblx0XHRjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogZXhwb25lbnRpYWwgKiAwLjE7IC8vIDEwJSBqaXR0ZXJcblx0XHRyZXR1cm4gTWF0aC5mbG9vcihleHBvbmVudGlhbCArIGppdHRlcik7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV29ya2VyVHJpZ2dlcjtcbiJdfQ==
|
|
695
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2VyVHJpZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Xb3JrZXJUcmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUErQyxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9GLE9BQU8sRUFFTixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLHNCQUFzQixFQUV0QixPQUFPLEVBQ1AsT0FBTyxFQUNQLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFdBQVcsRUFHWCx3QkFBd0IsRUFDeEIscUJBQXFCLEdBQ3JCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFhLGNBQWMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0UsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxLQUFLO0lBQzVCLFNBQVMsQ0FBUztJQUNsQyxpRkFBaUY7SUFDakUsS0FBSyxDQUFVO0lBRS9CLFlBQVksU0FBaUIsRUFBRSxLQUFjO1FBQzVDLEtBQUssQ0FBQyx1QkFBdUIsU0FBUyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRDtBQXFIRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFnQixhQUFjLFNBQVEs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QUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsaUJBQWlCO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxhQUFhO1FBQy9ELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNEO0FBRUQsZUFBZSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdvcmtlclRyaWdnZXIgLSBCYWNrZ3JvdW5kIGpvYiBwcm9jZXNzaW5nIGZvciBCbG9rIHdvcmtmbG93c1xuICpcbiAqIEV4dGVuZHMgVHJpZ2dlckJhc2UgdG8gc3VwcG9ydCBsb25nLXJ1bm5pbmcgYmFja2dyb3VuZCBqb2JzOlxuICogLSBDb25jdXJyZW5jeSBjb250cm9scyAobWF4IE4gY29uY3VycmVudCBqb2JzKVxuICogLSBSZXRyeSBsb2dpYyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAqIC0gSm9iIHRpbWVvdXRzXG4gKiAtIEpvYiBwcmlvcml0eSBhbmQgZGVsYXkgc2NoZWR1bGluZ1xuICogLSBEZWFkIGxldHRlciBxdWV1ZSBzdXBwb3J0XG4gKlxuICogUGF0dGVybjpcbiAqIDEuIGxvYWROb2RlcygpIC0gTG9hZCBhdmFpbGFibGUgbm9kZXMgaW50byBOb2RlTWFwXG4gKiAyLiBsb2FkV29ya2Zsb3dzKCkgLSBMb2FkIHdvcmtmbG93cyB3aXRoIHdvcmtlciB0cmlnZ2Vyc1xuICogMy4gbGlzdGVuKCkgLSBDb25uZWN0IHRvIGpvYiBiYWNrZW5kIGFuZCBzdGFydCBwcm9jZXNzaW5nXG4gKiA0LiBGb3IgZWFjaCBqb2I6XG4gKiAgICAtIENyZWF0ZSBjb250ZXh0IHdpdGggdGhpcy5jcmVhdGVDb250ZXh0KClcbiAqICAgIC0gUG9wdWxhdGUgY3R4LnJlcXVlc3Qgd2l0aCBqb2IgZGF0YVxuICogICAgLSBFeGVjdXRlIHdvcmtmbG93IHZpYSB0aGlzLnJ1bihjdHgpXG4gKiAgICAtIEFjayBvbiBzdWNjZXNzLCByZXRyeSBvciBETFEgb24gZmFpbHVyZVxuICovXG5cbmltcG9ydCB7IHR5cGUgSGVscGVyUmVzcG9uc2UsIHR5cGUgV29ya2VyVHJpZ2dlck9wdHMsIHRyeVBhcnNlRHVyYXRpb24gfSBmcm9tIFwiQGJsb2tqcy9oZWxwZXJcIjtcbmltcG9ydCB7XG5cdHR5cGUgQmxva1NlcnZpY2UsXG5cdENvbmN1cnJlbmN5TGltaXRFcnJvcixcblx0Q29uY3VycmVuY3lNZXRyaWNzLFxuXHRDb25maWd1cmF0aW9uLFxuXHREZWJvdW5jZUNvb3JkaW5hdG9yLFxuXHREZWZhdWx0TG9nZ2VyLFxuXHREZWZlcnJlZERpc3BhdGNoU2lnbmFsLFxuXHR0eXBlIEdsb2JhbE9wdGlvbnMsXG5cdEphbml0b3IsXG5cdE5vZGVNYXAsXG5cdFF1ZXVlRXhwaXJlZEVycm9yLFxuXHRSdW5DYW5jZWxsZWRFcnJvcixcblx0UnVuVHJhY2tlcixcblx0VHJpZ2dlckJhc2UsXG5cdHR5cGUgVHJpZ2dlclJlc3BvbnNlLFxuXHRXb3JrZmxvd1JlZ2lzdHJ5LFxuXHRjcmVhdGVDb25jdXJyZW5jeUJhY2tlbmQsXG5cdGNyZWF0ZURlYm91bmNlQmFja2VuZCxcbn0gZnJvbSBcIkBibG9ranMvcnVubmVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQsIFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBibG9ranMvc2hhcmVkXCI7XG5pbXBvcnQgeyB0eXBlIFNwYW4sIFNwYW5TdGF0dXNDb2RlLCBtZXRyaWNzLCB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuXG4vKipcbiAqIEY0IC8gRjI0IOKAlCB0aHJvd24gYnkgYGV4ZWN1dGVXaXRoVGltZW91dGAgd2hlbiBhIHdvcmtlciBqb2IgZXhjZWVkcyBpdHNcbiAqIHRyaWdnZXItbGV2ZWwgYGNvbmZpZy50aW1lb3V0YC4gQSBkZWRpY2F0ZWQgdHlwZSAoaW5zdGVhZCBvZiBhIHBsYWluXG4gKiBgRXJyb3JgKSBsZXRzIGBoYW5kbGVKb2JgJ3MgY2F0Y2ggZGlzY3JpbWluYXRlIHRoZSB0aW1lb3V0OiBpdCBhYm9ydHMgdGhlXG4gKiBkZXRhY2hlZCBydW4gdmlhIGBjdHguc2lnbmFsYCBhbmQgZmxpcHMgdGhlIHJ1biByZWNvcmQgdG8gYHRpbWVkT3V0YFxuICogKG1hdGNoaW5nIHRoZSBwZXItc3RlcCBgbWF4RHVyYXRpb25gIHRheG9ub215KSByYXRoZXIgdGhhbiByb3V0aW5nIHRoZVxuICogdGltZW91dCB0aHJvdWdoIHRoZSBnZW5lcmljIHJldHJ5L0RMUSBwYXRoLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2VyVGltZW91dEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRwdWJsaWMgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXI7XG5cdC8qKiBSdW4gaWQgb2YgdGhlIGFib3J0ZWQgcnVuLCB3aGVuIGtub3duIOKAlCB1c2VkIHRvIGZsaXAgc3RhdHVzIHRvIGB0aW1lZE91dGAuICovXG5cdHB1YmxpYyByZWFkb25seSBydW5JZD86IHN0cmluZztcblxuXHRjb25zdHJ1Y3Rvcih0aW1lb3V0TXM6IG51bWJlciwgcnVuSWQ/OiBzdHJpbmcpIHtcblx0XHRzdXBlcihgSm9iIHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXRNc31tc2ApO1xuXHRcdHRoaXMubmFtZSA9IFwiV29ya2VyVGltZW91dEVycm9yXCI7XG5cdFx0dGhpcy50aW1lb3V0TXMgPSB0aW1lb3V0TXM7XG5cdFx0dGhpcy5ydW5JZCA9IHJ1bklkO1xuXHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBXb3JrZXJUaW1lb3V0RXJyb3IucHJvdG90eXBlKTtcblx0fVxufVxuXG4vKipcbiAqIEpvYiByZWNlaXZlZCBmcm9tIHdvcmtlciBxdWV1ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckpvYiB7XG5cdC8qKiBVbmlxdWUgam9iIElEICovXG5cdGlkOiBzdHJpbmc7XG5cdC8qKiBKb2IgZGF0YSBwYXlsb2FkICovXG5cdGRhdGE6IHVua25vd247XG5cdC8qKiBKb2IgbWV0YWRhdGEgaGVhZGVycyAqL1xuXHRoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHQvKiogUXVldWUgbmFtZSB0aGlzIGpvYiBiZWxvbmdzIHRvICovXG5cdHF1ZXVlOiBzdHJpbmc7XG5cdC8qKiBKb2IgcHJpb3JpdHkgKGhpZ2hlciA9IG1vcmUgaW1wb3J0YW50KSAqL1xuXHRwcmlvcml0eTogbnVtYmVyO1xuXHQvKiogTnVtYmVyIG9mIGF0dGVtcHRzIG1hZGUgc28gZmFyICovXG5cdGF0dGVtcHRzOiBudW1iZXI7XG5cdC8qKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzICovXG5cdG1heFJldHJpZXM6IG51bWJlcjtcblx0LyoqIFRpbWVzdGFtcCB3aGVuIGpvYiB3YXMgY3JlYXRlZCAqL1xuXHRjcmVhdGVkQXQ6IERhdGU7XG5cdC8qKiBEZWxheSBiZWZvcmUgcHJvY2Vzc2luZyAobXMpICovXG5cdGRlbGF5PzogbnVtYmVyO1xuXHQvKiogSm9iIHRpbWVvdXQgKG1zKSAqL1xuXHR0aW1lb3V0PzogbnVtYmVyO1xuXHQvKiogT3JpZ2luYWwgcmF3IGpvYiBmcm9tIHByb3ZpZGVyICovXG5cdHJhdzogdW5rbm93bjtcblx0LyoqIE1hcmsgam9iIGFzIGNvbXBsZXRlZCAqL1xuXHRjb21wbGV0ZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0LyoqIE1hcmsgam9iIGFzIGZhaWxlZCAob3B0aW9uYWxseSByZXF1ZXVlKSAqL1xuXHRmYWlsOiAoZXJyb3I6IEVycm9yLCByZXF1ZXVlPzogYm9vbGVhbikgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBXb3JrZXIgYWRhcHRlciBpbnRlcmZhY2UgLSBpbXBsZW1lbnRlZCBieSBlYWNoIGpvYiBiYWNrZW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyQWRhcHRlciB7XG5cdC8qKiBQcm92aWRlciBuYW1lIChlLmcuLCBcImJ1bGxtcVwiLCBcImluLW1lbW9yeVwiKSAqL1xuXHRyZWFkb25seSBwcm92aWRlcjogc3RyaW5nO1xuXG5cdC8qKiBDb25uZWN0IHRvIHRoZSBqb2IgYmFja2VuZCAqL1xuXHRjb25uZWN0KCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqIERpc2Nvbm5lY3QgZnJvbSB0aGUgam9iIGJhY2tlbmQgKi9cblx0ZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBTdGFydCBwcm9jZXNzaW5nIGpvYnMgZnJvbSBhIHF1ZXVlXG5cdCAqIEBwYXJhbSBjb25maWcgV29ya2VyIHRyaWdnZXIgY29uZmlndXJhdGlvblxuXHQgKiBAcGFyYW0gaGFuZGxlciBDYWxsYmFjayBmb3IgZWFjaCBqb2Jcblx0ICovXG5cdHByb2Nlc3MoY29uZmlnOiBXb3JrZXJUcmlnZ2VyT3B0cywgaGFuZGxlcjogKGpvYjogV29ya2VySm9iKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogQWRkIGEgam9iIHRvIGEgcXVldWUgKGZvciBwcm9ncmFtbWF0aWMgZGlzcGF0Y2hpbmcpXG5cdCAqIEBwYXJhbSBxdWV1ZSBRdWV1ZSBuYW1lXG5cdCAqIEBwYXJhbSBkYXRhIEpvYiBwYXlsb2FkXG5cdCAqIEBwYXJhbSBvcHRzIEpvYiBvcHRpb25zXG5cdCAqL1xuXHRhZGRKb2IoXG5cdFx0cXVldWU6IHN0cmluZyxcblx0XHRkYXRhOiB1bmtub3duLFxuXHRcdG9wdHM/OiB7XG5cdFx0XHRwcmlvcml0eT86IG51bWJlcjtcblx0XHRcdGRlbGF5PzogbnVtYmVyO1xuXHRcdFx0cmV0cmllcz86IG51bWJlcjtcblx0XHRcdHRpbWVvdXQ/OiBudW1iZXI7XG5cdFx0XHRqb2JJZD86IHN0cmluZztcblx0XHR9LFxuXHQpOiBQcm9taXNlPHN0cmluZz47XG5cblx0LyoqIFN0b3AgcHJvY2Vzc2luZyBhIHNwZWNpZmljIHF1ZXVlICovXG5cdHN0b3BQcm9jZXNzaW5nKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKiBDaGVjayBpZiBjb25uZWN0ZWQgKi9cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbjtcblxuXHQvKiogSGVhbHRoIGNoZWNrICovXG5cdGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj47XG5cblx0LyoqIEdldCBxdWV1ZSBzdGF0cyAqL1xuXHRnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+O1xufVxuXG4vKipcbiAqIFF1ZXVlIHN0YXRpc3RpY3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJRdWV1ZVN0YXRzIHtcblx0LyoqIE51bWJlciBvZiBqb2JzIHdhaXRpbmcgdG8gYmUgcHJvY2Vzc2VkICovXG5cdHdhaXRpbmc6IG51bWJlcjtcblx0LyoqIE51bWJlciBvZiBqb2JzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgKi9cblx0YWN0aXZlOiBudW1iZXI7XG5cdC8qKiBOdW1iZXIgb2YgY29tcGxldGVkIGpvYnMgKi9cblx0Y29tcGxldGVkOiBudW1iZXI7XG5cdC8qKiBOdW1iZXIgb2YgZmFpbGVkIGpvYnMgKi9cblx0ZmFpbGVkOiBudW1iZXI7XG5cdC8qKiBOdW1iZXIgb2YgZGVsYXllZCBqb2JzICovXG5cdGRlbGF5ZWQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXb3JrZmxvdyBtb2RlbCB3aXRoIHdvcmtlciB0cmlnZ2VyIGNvbmZpZ3VyYXRpb25cbiAqL1xuaW50ZXJmYWNlIFdvcmtlcldvcmtmbG93TW9kZWwge1xuXHRwYXRoOiBzdHJpbmc7XG5cdGNvbmZpZzoge1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHR2ZXJzaW9uOiBzdHJpbmc7XG5cdFx0dHJpZ2dlcj86IHtcblx0XHRcdHdvcmtlcj86IFdvcmtlclRyaWdnZXJPcHRzO1xuXHRcdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0XHR9O1xuXHRcdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdH07XG59XG5cbi8qKlxuICogV29ya2VyVHJpZ2dlciAtIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHdvcmtlci1iYXNlZCB0cmlnZ2Vyc1xuICpcbiAqIFByb3ZpZGVzIGJhY2tncm91bmQgam9iIHByb2Nlc3Npbmcgd2l0aDpcbiAqIC0gQ29uZmlndXJhYmxlIGNvbmN1cnJlbmN5IHBlciBxdWV1ZVxuICogLSBBdXRvbWF0aWMgcmV0cmllcyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAqIC0gSm9iIHRpbWVvdXRzIHdpdGggYXV0b21hdGljIGZhaWx1cmVcbiAqIC0gUHJpb3JpdHktYmFzZWQgam9iIG9yZGVyaW5nXG4gKiAtIERlbGF5ZWQgam9iIHNjaGVkdWxpbmdcbiAqIC0gUXVldWUgc3RhdGlzdGljcyBhbmQgbW9uaXRvcmluZ1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV29ya2VyVHJpZ2dlciBleHRlbmRzIFRyaWdnZXJCYXNlIHtcblx0cHJvdGVjdGVkIG5vZGVNYXA6IEdsb2JhbE9wdGlvbnMgPSB7fSBhcyBHbG9iYWxPcHRpb25zO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhY2VyID0gdHJhY2UuZ2V0VHJhY2VyKFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSB8fCBcInRyaWdnZXItd29ya2VyLXdvcmtmbG93XCIsXG5cdFx0cHJvY2Vzcy5lbnYuUFJPSkVDVF9WRVJTSU9OIHx8IFwiMC4wLjFcIixcblx0KTtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBEZWZhdWx0TG9nZ2VyKCk7XG5cdC8qKlxuXHQgKiB2MC43IFBSIDUg4oCUIHRoZSBcImRlZmF1bHRcIiBhZGFwdGVyLCB1c2VkIHdoZW4gYSB3b3JrZmxvdydzXG5cdCAqIGB0cmlnZ2VyLndvcmtlci5wcm92aWRlcmAgZmllbGQgaXMgb21pdHRlZCBBTkQgdGhlXG5cdCAqIGBCTE9LX1dPUktFUl9BREFQVEVSYCBlbnYgdmFyIGlzIHVuc2V0LiBTdWJjbGFzc2VzIE1BWSBzZXQgdGhpc1xuXHQgKiBmb3IgYmFjay1jb21wYXQgd2l0aCB0aGUgcHJlLXYwLjcgc2luZ2xlLWFkYXB0ZXIgcGF0dGVyblxuXHQgKiAoYGNsYXNzIFdvcmtlclNlcnZlciBleHRlbmRzIFdvcmtlclRyaWdnZXIgeyBwcm90ZWN0ZWQgYWRhcHRlciA9IG5ldyBOQVRTV29ya2VyQWRhcHRlcigpIH1gKS5cblx0ICpcblx0ICogV2hlbiB1bnNldCBBTkQgbm8gcGVyLXdvcmtmbG93IHByb3ZpZGVyIGlzIHNwZWNpZmllZCwgdGhlIGZhY3Rvcnlcblx0ICogZmFsbHMgYmFjayB0byBgaW4tbWVtb3J5YC4gVGhlIGZhY3RvcnkgcG9vbCAoYGFkYXB0ZXJzL2ZhY3RvcnkudHNgKVxuXHQgKiB0cmFja3Mgb25lIGNvbm5lY3RlZCBhZGFwdGVyIHBlciBwcm92aWRlciBzbyBtdWx0aXBsZSB3b3JrZmxvd3Ncblx0ICogd2l0aCB0aGUgc2FtZSBwcm92aWRlciBzaGFyZSBhIHNpbmdsZSBicm9rZXIgY29ubmVjdGlvbi5cblx0ICovXG5cdHByb3RlY3RlZCBhZGFwdGVyPzogV29ya2VyQWRhcHRlcjtcblxuXHQvKiogQWN0aXZlIHF1ZXVlcyBiZWluZyBwcm9jZXNzZWQgKi9cblx0cHJvdGVjdGVkIGFjdGl2ZVF1ZXVlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNSDigJQgYWRhcHRlciBwb29sLCBrZXllZCBieSBwcm92aWRlciBuYW1lLiBQb3B1bGF0ZWQgbGF6aWx5XG5cdCAqIGluc2lkZSBgbGlzdGVuKClgIGFzIHdvcmtmbG93cyBhcmUgbWF0Y2hlZCB0byBwcm92aWRlcnMuIEVhY2hcblx0ICogYWRhcHRlciBpcyBjb25uZWN0ZWQgb25jZSBhbmQgcmV1c2VkIGFjcm9zcyB3b3JrZmxvd3MgdGhhdCBzaGFyZVxuXHQgKiBpdHMgcHJvdmlkZXIuIERyYWluZWQgaW4gYHN0b3AoKWAuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYWRhcHRlclBvb2w6IE1hcDxzdHJpbmcsIFdvcmtlckFkYXB0ZXI+ID0gbmV3IE1hcCgpO1xuXG5cdC8vIFN1YmNsYXNzZXMgcHJvdmlkZSB0aGVzZVxuXHRwcm90ZWN0ZWQgYWJzdHJhY3Qgbm9kZXM6IFJlY29yZDxzdHJpbmcsIEJsb2tTZXJ2aWNlPHVua25vd24+Pjtcblx0cHJvdGVjdGVkIGFic3RyYWN0IHdvcmtmbG93czogUmVjb3JkPHN0cmluZywgSGVscGVyUmVzcG9uc2U+O1xuXG5cdC8vIENvbnN0cnVjdG9yIHJlbW92ZWQgaW4gdjAuNi4zIOKAlCBwcmUtZml4IGl0IGNhbGxlZCBgbG9hZE5vZGVzKClgICtcblx0Ly8gYGxvYWRXb3JrZmxvd3MoKWAsIGJ1dCBzdWJjbGFzc2VzIHVzZSBjbGFzcy1maWVsZCBhc3NpZ25tZW50cyBmb3Jcblx0Ly8gYG5vZGVzYCAvIGB3b3JrZmxvd3NgICh0aGUgY2Fub25pY2FsIFR5cGVTY3JpcHQgcGF0dGVybikuIFRob3NlXG5cdC8vIGZpZWxkcyBydW4gQUZURVIgc3VwZXIoKSwgc28gYWNjZXNzaW5nIGB0aGlzLm5vZGVzYCBmcm9tIHRoZSBwYXJlbnRcblx0Ly8gY29uc3RydWN0b3IgcmVhZCBgdW5kZWZpbmVkYCBhbmQgY3Jhc2hlZCB3aXRoXG5cdC8vIGBUeXBlRXJyb3I6IHVuZGVmaW5lZCBpcyBub3QgYW4gb2JqZWN0IChPYmplY3Qua2V5cyh0aGlzLm5vZGVzKSlgLlxuXHQvLyBUaGUgcmVnaXN0cnkgaW5pdCBub3cgaGFwcGVucyBhdCB0aGUgc3RhcnQgb2YgYGxpc3RlbigpYCwgYWZ0ZXJcblx0Ly8gdGhlIHN1YmNsYXNzJ3MgZmllbGRzIGFyZSBpbml0aWFsaXplZC5cblxuXHQvKipcblx0ICogTG9hZCBub2RlcyBpbnRvIHRoZSBub2RlIG1hcFxuXHQgKi9cblx0bG9hZE5vZGVzKCk6IHZvaWQge1xuXHRcdHRoaXMubm9kZU1hcC5ub2RlcyA9IG5ldyBOb2RlTWFwKCk7XG5cdFx0Y29uc3Qgbm9kZUtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBub2RlS2V5cykge1xuXHRcdFx0dGhpcy5ub2RlTWFwLm5vZGVzLmFkZE5vZGUoa2V5LCB0aGlzLm5vZGVzW2tleV0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIHdvcmtmbG93cyBpbnRvIHRoZSB3b3JrZmxvdyBtYXBcblx0ICovXG5cdGxvYWRXb3JrZmxvd3MoKTogdm9pZCB7XG5cdFx0dGhpcy5ub2RlTWFwLndvcmtmbG93cyA9IHRoaXMud29ya2Zsb3dzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN0YXJ0IHRoZSB3b3JrZXIgcHJvY2Vzc29yIC0gbWFpbiBlbnRyeSBwb2ludFxuXHQgKi9cblx0YXN5bmMgbGlzdGVuKCk6IFByb21pc2U8bnVtYmVyPiB7XG5cdFx0Y29uc3Qgc3RhcnRUaW1lID0gdGhpcy5zdGFydENvdW50ZXIoKTtcblxuXHRcdC8vIFBvcHVsYXRlIHRoZSB0cmlnZ2VyJ3Mgbm9kZSArIHdvcmtmbG93IHJlZ2lzdHJpZXMgZnJvbSB0aGVcblx0XHQvLyBzdWJjbGFzcydzIGBub2Rlc2AgLyBgd29ya2Zsb3dzYCBmaWVsZHMuIHYwLjYuMyBmaXgg4oCUIHByZS1maXhcblx0XHQvLyB0aGVzZSBjYWxscyBsaXZlZCBpbiB0aGUgY29uc3RydWN0b3IgYW5kIGNyYXNoZWQgYmVjYXVzZSBjbGFzc1xuXHRcdC8vIGZpZWxkcyBoYXZlbid0IHJ1biB5ZXQgYXQgc3VwZXItY29uc3RydWN0b3IgdGltZS4gU2VlIHRoZSBjb21tZW50XG5cdFx0Ly8gd2hlcmUgdGhlIG9sZCBjb25zdHJ1Y3RvciB1c2VkIHRvIGxpdmUgZm9yIHRoZSBmdWxsIHJlYXNvbi5cblx0XHR0aGlzLmxvYWROb2RlcygpO1xuXHRcdHRoaXMubG9hZFdvcmtmbG93cygpO1xuXG5cdFx0Ly8gRjYgKHdvcmtlciBwYXJ0KSDigJQgZmVlZCB0aGUgV29ya2Zsb3dSZWdpc3RyeSBmcm9tIHRoZSB3b3JrZXIgbm9kZU1hcC5cblx0XHQvLyBXb3JrZXItb25seSBkZXBsb3ltZW50cyBuZXZlciBpbnN0YW50aWF0ZSBhbiBIdHRwVHJpZ2dlciwgc28gd2l0aG91dFxuXHRcdC8vIHRoaXMgdGhlIHJlZ2lzdHJ5IGlzIGVtcHR5IGFuZCBhbnkgdHJpZ2dlci1sZXZlbCAvIHByb2Nlc3MtZ2xvYmFsXG5cdFx0Ly8gbWlkZGxld2FyZSBuYW1lIG9yIGBzdWJ3b3JrZmxvdzpgIHN0ZXAgZmFpbHMgYXQgcnVudGltZS4gV29ya2Zsb3dzXG5cdFx0Ly8gZmxhZ2dlZCBgbWlkZGxld2FyZTogdHJ1ZWAgYXJlIHJlZ2lzdGVyZWQgd2l0aCBgaXNNaWRkbGV3YXJlYC5cblx0XHR0aGlzLnJlZ2lzdGVyV29ya2Zsb3dzRnJvbU5vZGVNYXAodGhpcy5sb2dnZXIpO1xuXG5cdFx0Ly8gRjE0ICh3b3JrZXIgcGFydCkg4oCUIHNlZWQgQkxPS19HTE9CQUxfTUlERExFV0FSRSBmcm9tIGVudi4gT25seVxuXHRcdC8vIEh0dHBUcmlnZ2VyIGRpZCB0aGlzIGJlZm9yZSwgc28gYSBwdXJlIHdvcmtlciBwcm9jZXNzIHNpbGVudGx5XG5cdFx0Ly8gZHJvcHBlZCB0aGUgZG9jdW1lbnRlZCBlbnYtdmFyIGNvbmZpZ3VyYXRpb24uXG5cdFx0dGhpcy5zZWVkR2xvYmFsTWlkZGxld2FyZUZyb21FbnYodGhpcy5sb2dnZXIpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFRpZXIgMiAjNiBmb2xsb3ctdXAgwrcgaW5zdGFsbCB0aGUgY3Jvc3MtcHJvY2VzcyBjb25jdXJyZW5jeVxuXHRcdFx0Ly8gYmFja2VuZCAoTkFUUyBLVikgd2hlbiB0aGUgb3BlcmF0b3Igb3B0ZWQgaW4gdmlhXG5cdFx0XHQvLyBgQkxPS19DT05DVVJSRU5DWV9CQUNLRU5EPW5hdHMta3ZgLiBEZWZhdWx0IG51bGwgcHJlc2VydmVzIHRoZVxuXHRcdFx0Ly8gZXhpc3RpbmcgaW4tcHJvY2VzcyBiZWhhdmlvci5cblx0XHRcdC8vXG5cdFx0XHQvLyBQUiAzIEQxIOKAlCByZWNvcmQgaW5zdGFsbCBhdHRlbXB0cyB2aWEgT1RlbCBjb3VudGVyLlxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgYmFja2VuZCA9IGNyZWF0ZUNvbmN1cnJlbmN5QmFja2VuZCgpO1xuXHRcdFx0XHRpZiAoYmFja2VuZCkge1xuXHRcdFx0XHRcdGF3YWl0IGJhY2tlbmQuY29ubmVjdCgpO1xuXHRcdFx0XHRcdFJ1blRyYWNrZXIuZ2V0SW5zdGFuY2UoKS5zZXRDb25jdXJyZW5jeUJhY2tlbmQoYmFja2VuZCk7XG5cdFx0XHRcdFx0Q29uY3VycmVuY3lNZXRyaWNzLmdldEluc3RhbmNlKCkucmVjb3JkQmFja2VuZEluc3RhbGwoe1xuXHRcdFx0XHRcdFx0YmFja2VuZDogYmFja2VuZC5uYW1lLFxuXHRcdFx0XHRcdFx0c3RhdHVzOiBcInN1Y2Nlc3NcIixcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYFtjb25jdXJyZW5jeV0gYmFja2VuZCBpbnN0YWxsZWQ6ICR7YmFja2VuZC5uYW1lfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0Q29uY3VycmVuY3lNZXRyaWNzLmdldEluc3RhbmNlKCkucmVjb3JkQmFja2VuZEluc3RhbGwoe1xuXHRcdFx0XHRcdGJhY2tlbmQ6IFwidW5rbm93blwiLFxuXHRcdFx0XHRcdHN0YXR1czogXCJmYWlsdXJlXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XHRgW2NvbmN1cnJlbmN5XSBiYWNrZW5kIGluc3RhbGwgZmFpbGVkOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX07IGZhbGxpbmcgYmFjayB0byBpbi1wcm9jZXNzIGJlaGF2aW9yYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGllciBDICMxIMK3IGluc3RhbGwgdGhlIGNyb3NzLXByb2Nlc3MgZGVib3VuY2UgYmFja2VuZFxuXHRcdFx0Ly8gKE5BVFMgS1YgLyBSZWRpcykgd2hlbiB0aGUgb3BlcmF0b3Igb3B0ZWQgaW4gdmlhXG5cdFx0XHQvLyBgQkxPS19ERUJPVU5DRV9CQUNLRU5EYC4gRGVmYXVsdCB1bnNldCA9IHRoZSBleGlzdGluZ1xuXHRcdFx0Ly8gaW4tcHJvY2VzcyBiZWhhdmlvciBpcyBwcmVzZXJ2ZWQuIE9uIGNvbm5lY3QgZmFpbHVyZSwgbG9nICtcblx0XHRcdC8vIGZhbGwgYmFjayB0byBpbi1tZW1vcnkgY29vcmRpbmF0aW9uLlxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgZGVib3VuY2VCYWNrZW5kID0gY3JlYXRlRGVib3VuY2VCYWNrZW5kKCk7XG5cdFx0XHRcdGlmIChkZWJvdW5jZUJhY2tlbmQpIHtcblx0XHRcdFx0XHRjb25zdCBsZWFzZVJhdyA9IHByb2Nlc3MuZW52LkJMT0tfREVCT1VOQ0VfT1dORVJfTEVBU0VfTVM7XG5cdFx0XHRcdFx0aWYgKGxlYXNlUmF3ICYmIC9eXFxkKyQvLnRlc3QobGVhc2VSYXcpKSB7XG5cdFx0XHRcdFx0XHREZWJvdW5jZUNvb3JkaW5hdG9yLmdldEluc3RhbmNlKCkuc2V0T3duZXJMZWFzZU1zKE51bWJlcihsZWFzZVJhdykpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCBkZWJvdW5jZUJhY2tlbmQuY29ubmVjdCgpO1xuXHRcdFx0XHRcdERlYm91bmNlQ29vcmRpbmF0b3IuZ2V0SW5zdGFuY2UoKS5zZXRCYWNrZW5kKGRlYm91bmNlQmFja2VuZCk7XG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKGBbZGVib3VuY2VdIGJhY2tlbmQgaW5zdGFsbGVkOiAke2RlYm91bmNlQmFja2VuZC5uYW1lfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFx0YFtkZWJvdW5jZV0gYmFja2VuZCBpbnN0YWxsIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9OyBmYWxsaW5nIGJhY2sgdG8gaW4tbWVtb3J5IGNvb3JkaW5hdGlvbmAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpZXIgMiBxdWljay13aW5zIGZvbGxvdy11cCDCtyBpbnN0YWxsIGNyYXNoIGhhbmRsZXJzICsgcmVjb3ZlclxuXHRcdFx0Ly8gb3JwaGFuZWQgcnVucyBmcm9tIGEgcHJldmlvdXMgKGRlYWQpIHByb2Nlc3MuIElkZW1wb3RlbnQgKyBvcHQtb3V0XG5cdFx0XHQvLyB2aWEgYEJMT0tfQ1JBU0hfQVVUT0ZMSVBfRElTQUJMRUQ9MWAuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRXb3JrZXJUcmlnZ2VyLmluc3RhbGxDcmFzaEhhbmRsZXJzKHRoaXMubG9nZ2VyKTtcblx0XHRcdFx0Y29uc3Qgb3JwaGFuZWQgPSBXb3JrZXJUcmlnZ2VyLnJlY292ZXJPcnBoYW5lZFJ1bnModW5kZWZpbmVkLCB0aGlzLmxvZ2dlcik7XG5cdFx0XHRcdGlmIChvcnBoYW5lZCA+IDApIHtcblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYFtjcmFzaC1hdXRvZmxpcF0gZmxpcHBlZCAke29ycGhhbmVkfSBvcnBoYW5lZCBydW4ocykgdG8gY3Jhc2hlZCBvbiBib290YCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgW2NyYXNoLWF1dG9mbGlwXSBzZXR1cCBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaWVyIDIgZm9sbG93LXVwIMK3IHN0YXJ0IHRoZSBwZXJpb2RpYyBzdG9yYWdlIGphbml0b3IuXG5cdFx0XHQvLyBJZGVtcG90ZW50IChzaW5nbGV0b24pOyBvcHQtb3V0IHZpYSBgQkxPS19KQU5JVE9SX0RJU0FCTEVEPTFgLlxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0SmFuaXRvci5nZXRJbnN0YW5jZShSdW5UcmFja2VyLmdldEluc3RhbmNlKCkuZ2V0U3RvcmUoKSwgdGhpcy5sb2dnZXIpLnN0YXJ0KCk7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYFtqYW5pdG9yXSBzZXR1cCBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaWVyIDIgZm9sbG93LXVwIMK3IGluc3RhbGwgZ3JhY2VmdWwgc2h1dGRvd24gaGFuZGxlcnNcblx0XHRcdC8vIChTSUdURVJNIC8gU0lHSU5UKS4gSWRlbXBvdGVudDsgb3B0LW91dCB2aWFcblx0XHRcdC8vIGBCTE9LX0dSQUNFRlVMX1NIVVRET1dOX0RJU0FCTEVEPTFgLlxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0V29ya2VyVHJpZ2dlci5pbnN0YWxsU2h1dGRvd25IYW5kbGVycyh0aGlzLCB0aGlzLmxvZ2dlcik7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYFtzaHV0ZG93bl0gc2V0dXAgZmFpbGVkOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRmluZCBhbGwgd29ya2Zsb3dzIHdpdGggd29ya2VyIHRyaWdnZXJzXG5cdFx0XHRjb25zdCB3b3JrZXJXb3JrZmxvd3MgPSB0aGlzLmdldFdvcmtlcldvcmtmbG93cygpO1xuXG5cdFx0XHRpZiAod29ya2VyV29ya2Zsb3dzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXCJObyB3b3JrZmxvd3Mgd2l0aCB3b3JrZXIgdHJpZ2dlcnMgZm91bmRcIik7XG5cdFx0XHRcdHJldHVybiB0aGlzLmVuZENvdW50ZXIoc3RhcnRUaW1lKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgcHJvY2Vzc2luZyBlYWNoIHF1ZXVlLCBkaXNwYXRjaGluZyB0byB0aGUgcmlnaHQgYWRhcHRlclxuXHRcdFx0Ly8gYmFzZWQgb24gdGhlIHdvcmtmbG93J3MgYHByb3ZpZGVyYCBmaWVsZCAod2l0aCBiYWNrLWNvbXBhdFxuXHRcdFx0Ly8gZmFsbGJhY2sgdG8gYHRoaXMuYWRhcHRlcmAgd2hlbiBzdWJjbGFzc2VzIHN0aWxsIHNldCBpdCkuXG5cdFx0XHRmb3IgKGNvbnN0IHdvcmtmbG93IG9mIHdvcmtlcldvcmtmbG93cykge1xuXHRcdFx0XHRjb25zdCBjb25maWcgPSB3b3JrZmxvdy5jb25maWcudHJpZ2dlcj8ud29ya2VyIGFzIFdvcmtlclRyaWdnZXJPcHRzO1xuXHRcdFx0XHRjb25zdCBhZGFwdGVyID0gYXdhaXQgdGhpcy5yZXNvbHZlQWRhcHRlckZvcldvcmtmbG93KGNvbmZpZyk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhcblx0XHRcdFx0XHRgU3RhcnRpbmcgd29ya2VyIGZvciBxdWV1ZTogJHtjb25maWcucXVldWV9IHZpYSAke2FkYXB0ZXIucHJvdmlkZXJ9IChjb25jdXJyZW5jeT0ke2NvbmZpZy5jb25jdXJyZW5jeX0sIHJldHJpZXM9JHtjb25maWcucmV0cmllc30pYCxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHR0aGlzLmFjdGl2ZVF1ZXVlcy5hZGQoY29uZmlnLnF1ZXVlKTtcblxuXHRcdFx0XHRhd2FpdCBhZGFwdGVyLnByb2Nlc3MoY29uZmlnLCBhc3luYyAoam9iKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5oYW5kbGVKb2Ioam9iLCB3b3JrZmxvdywgY29uZmlnKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgV29ya2VyIHRyaWdnZXIgc3RhcnRlZC4gUHJvY2Vzc2luZyAke3dvcmtlcldvcmtmbG93cy5sZW5ndGh9IHF1ZXVlKHMpYCk7XG5cblx0XHRcdC8vIEVuYWJsZSBITVIgaW4gZGV2ZWxvcG1lbnQgbW9kZVxuXHRcdFx0aWYgKHByb2Nlc3MuZW52LkJMT0tfSE1SID09PSBcInRydWVcIiB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZW5hYmxlSG90UmVsb2FkKCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmVuZENvdW50ZXIoc3RhcnRUaW1lKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzdGFydCB3b3JrZXIgdHJpZ2dlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3RvcCBhbGwgd29ya2VycyBhbmQgZGlzY29ubmVjdFxuXHQgKi9cblx0YXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBTdG9wIGVhY2ggcXVldWUgb24gaXRzIG93bmluZyBhZGFwdGVyIOKAlCBhZGFwdGVycyBhcmUgdHJhY2tlZFxuXHRcdC8vIGluIHRoZSBwb29sIHNvIG11bHRpLXByb3ZpZGVyIHdvcmtlcnMgYWxsIGRyYWluIGNsZWFubHkuXG5cdFx0Zm9yIChjb25zdCBxdWV1ZSBvZiB0aGlzLmFjdGl2ZVF1ZXVlcykge1xuXHRcdFx0Zm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlclBvb2wudmFsdWVzKCkpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCBhZGFwdGVyLnN0b3BQcm9jZXNzaW5nKHF1ZXVlKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Lyogc3dhbGxvdyDigJQgYWRhcHRlciBtYXkgbm90IG93biB0aGlzIHF1ZXVlICovXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgU3RvcHBlZCBwcm9jZXNzaW5nIHF1ZXVlOiAke3F1ZXVlfWApO1xuXHRcdH1cblx0XHR0aGlzLmFjdGl2ZVF1ZXVlcy5jbGVhcigpO1xuXHRcdC8vIERpc2Nvbm5lY3QgZXZlcnkgYWRhcHRlciB3ZSBldmVyIGNvbm5lY3RlZC5cblx0XHRmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVyUG9vbC52YWx1ZXMoKSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgYWRhcHRlci5kaXNjb25uZWN0KCk7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYFtibG9rXVt3b3JrZXJdIGRpc2Nvbm5lY3QgZmFpbGVkOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuYWRhcHRlclBvb2wuY2xlYXIoKTtcblx0XHR0aGlzLmRlc3Ryb3lNb25pdG9yaW5nKCk7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiV29ya2VyIHRyaWdnZXIgc3RvcHBlZFwiKTtcblx0fVxuXG5cdHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBvbkhtcldvcmtmbG93Q2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMubG9nZ2VyLmxvZyhcIltITVJdIFdvcmtlciB3b3JrZmxvdyBjaGFuZ2VkLCByZWxvYWRpbmcuLi5cIik7XG5cdFx0YXdhaXQgdGhpcy53YWl0Rm9ySW5GbGlnaHRSZXF1ZXN0cygpO1xuXHRcdGF3YWl0IHRoaXMuc3RvcCgpO1xuXHRcdHRoaXMubG9hZFdvcmtmbG93cygpO1xuXHRcdGF3YWl0IHRoaXMubGlzdGVuKCk7XG5cdH1cblxuXHQvKipcblx0ICogRGlzcGF0Y2ggYSBqb2IgdG8gYSB3b3JrZXIgcXVldWVcblx0ICovXG5cdGFzeW5jIGRpc3BhdGNoKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0ZGF0YTogdW5rbm93bixcblx0XHRvcHRzPzoge1xuXHRcdFx0cHJpb3JpdHk/OiBudW1iZXI7XG5cdFx0XHRkZWxheT86IG51bWJlcjtcblx0XHRcdHJldHJpZXM/OiBudW1iZXI7XG5cdFx0XHR0aW1lb3V0PzogbnVtYmVyO1xuXHRcdFx0am9iSWQ/OiBzdHJpbmc7XG5cdFx0fSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHQvLyBCYWNrLWNvbXBhdDogd2hlbiBhIHN1YmNsYXNzIHNldCBgdGhpcy5hZGFwdGVyYCwgdXNlIGl0LlxuXHRcdC8vIE90aGVyd2lzZSBkaXNwYXRjaCB2aWEgdGhlIGZpcnN0IHBvb2wgYWRhcHRlciDigJQgdHlwaWNhbGx5IHRoZVxuXHRcdC8vIG9ubHkgb25lIHdoZW4gYSBwcm9jZXNzIG93bnMgb25lIHRyaWdnZXIgd29ya2Zsb3cuXG5cdFx0Y29uc3QgYWRhcHRlciA9XG5cdFx0XHR0aGlzLmFkYXB0ZXIgPz9cblx0XHRcdCh0aGlzLmFkYXB0ZXJQb29sLnNpemUgPiAwID8gKHRoaXMuYWRhcHRlclBvb2wudmFsdWVzKCkubmV4dCgpLnZhbHVlIGFzIFdvcmtlckFkYXB0ZXIpIDogdW5kZWZpbmVkKTtcblx0XHRpZiAoIWFkYXB0ZXIpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XCJbYmxva11bd29ya2VyXSBkaXNwYXRjaCgpIGNhbGxlZCBiZWZvcmUgYW55IGFkYXB0ZXIgaXMgY29ubmVjdGVkLiBDYWxsIGxpc3RlbigpIGZpcnN0LCBvciBzZXQgdGhpcy5hZGFwdGVyIG9uIHRoZSBzdWJjbGFzcy5cIixcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBhZGFwdGVyLmFkZEpvYihxdWV1ZSwgZGF0YSwgb3B0cyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHN0YXRpc3RpY3MgZm9yIGEgcXVldWVcblx0ICovXG5cdGFzeW5jIGdldFF1ZXVlU3RhdHMocXVldWU6IHN0cmluZyk6IFByb21pc2U8V29ya2VyUXVldWVTdGF0cz4ge1xuXHRcdGNvbnN0IGFkYXB0ZXIgPVxuXHRcdFx0dGhpcy5hZGFwdGVyID8/XG5cdFx0XHQodGhpcy5hZGFwdGVyUG9vbC5zaXplID4gMCA/ICh0aGlzLmFkYXB0ZXJQb29sLnZhbHVlcygpLm5leHQoKS52YWx1ZSBhcyBXb3JrZXJBZGFwdGVyKSA6IHVuZGVmaW5lZCk7XG5cdFx0aWYgKCFhZGFwdGVyKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFwiW2Jsb2tdW3dvcmtlcl0gZ2V0UXVldWVTdGF0cygpIGNhbGxlZCBiZWZvcmUgYW55IGFkYXB0ZXIgaXMgY29ubmVjdGVkLiBDYWxsIGxpc3RlbigpIGZpcnN0LCBvciBzZXQgdGhpcy5hZGFwdGVyIG9uIHRoZSBzdWJjbGFzcy5cIixcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBhZGFwdGVyLmdldFF1ZXVlU3RhdHMocXVldWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBsaXN0IG9mIGFjdGl2ZSBxdWV1ZXNcblx0ICovXG5cdGdldEFjdGl2ZVF1ZXVlcygpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIEFycmF5LmZyb20odGhpcy5hY3RpdmVRdWV1ZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNSDigJQgcGljayB0aGUgYWRhcHRlciBmb3IgYSB3b3JrZmxvdydzIGBwcm92aWRlcmAgZmllbGQuXG5cdCAqXG5cdCAqIFJlc29sdXRpb24gb3JkZXI6XG5cdCAqICAgMS4gU3ViY2xhc3Mtc2V0IGB0aGlzLmFkYXB0ZXJgIChiYWNrLWNvbXBhdDogcHJlLXYwLjcgcGF0dGVyblxuXHQgKiAgICAgIHdoZXJlIG9uZSBwcm9jZXNzIGJpbmRzIHRvIG9uZSBhZGFwdGVyIGF0IGNvbnN0cnVjdGlvbiB0aW1lKS5cblx0ICogICAyLiBQZXItd29ya2Zsb3cgYHByb3ZpZGVyYCBmaWVsZCwgbG9va2VkIHVwIHZpYSB0aGUgZmFjdG9yeS5cblx0ICogICAzLiBgQkxPS19XT1JLRVJfQURBUFRFUmAgZW52IHZhci5cblx0ICogICA0LiBgaW4tbWVtb3J5YCBmYWxsYmFjay5cblx0ICpcblx0ICogQWRhcHRlcnMgYXJlIGNvbm5lY3RlZCBvbiBmaXJzdCB1c2UgYW5kIHBvb2xlZCBwZXIgcHJvdmlkZXIgc29cblx0ICogbXVsdGlwbGUgd29ya2Zsb3dzIHNoYXJpbmcgYSBwcm92aWRlciBzaGFyZSBvbmUgYnJva2VyXG5cdCAqIGNvbm5lY3Rpb24uIEhlYWx0aC1kZXBlbmRlbmN5IHJlZ2lzdHJhdGlvbiBhbHNvIGhhcHBlbnMgaGVyZSBzb1xuXHQgKiBlYWNoIHByb3ZpZGVyIGlzIHRyYWNrZWQgaW5kaXZpZHVhbGx5IGluIGAvaGVhbHRoYC5cblx0ICovXG5cdHByb3RlY3RlZCBhc3luYyByZXNvbHZlQWRhcHRlckZvcldvcmtmbG93KGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMpOiBQcm9taXNlPFdvcmtlckFkYXB0ZXI+IHtcblx0XHQvLyBTdWJjbGFzcyBvdmVycmlkZSB3aW5zIGZvciBiYWNrLWNvbXBhdC5cblx0XHRpZiAodGhpcy5hZGFwdGVyKSB7XG5cdFx0XHRpZiAoIXRoaXMuYWRhcHRlci5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuYWRhcHRlci5jb25uZWN0KCk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgQ29ubmVjdGVkIHRvICR7dGhpcy5hZGFwdGVyLnByb3ZpZGVyfSB3b3JrZXIgc3lzdGVtIChzdWJjbGFzcyBhZGFwdGVyKWApO1xuXHRcdFx0XHR0aGlzLnJlZ2lzdGVyQWRhcHRlckhlYWx0aCh0aGlzLmFkYXB0ZXIpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gUG9vbC10cmFjayBzbyBzdG9wKCkgY2FuIGRyYWluIGl0LlxuXHRcdFx0dGhpcy5hZGFwdGVyUG9vbC5zZXQodGhpcy5hZGFwdGVyLnByb3ZpZGVyLCB0aGlzLmFkYXB0ZXIpO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRhcHRlcjtcblx0XHR9XG5cblx0XHQvLyBMYXp5LWltcG9ydCB0aGUgZmFjdG9yeSBzbyB0aGUgd29ya2VyIHBhY2thZ2UgZG9lc24ndCBwdWxsIGluXG5cdFx0Ly8gZXZlcnkgYWRhcHRlciBvbiBpbXBvcnQg4oCUIG9ubHkgdGhlIG9uZXMgYWN0dWFsbHkgZXhlcmNpc2VkLlxuXHRcdGNvbnN0IHsgcmVzb2x2ZVByb3ZpZGVyLCBjcmVhdGVXb3JrZXJBZGFwdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2FkYXB0ZXJzL2ZhY3RvcnlcIik7XG5cdFx0Y29uc3QgcHJvdmlkZXIgPSByZXNvbHZlUHJvdmlkZXIoY29uZmlnLnByb3ZpZGVyKTtcblx0XHRsZXQgYWRhcHRlciA9IHRoaXMuYWRhcHRlclBvb2wuZ2V0KHByb3ZpZGVyKTtcblx0XHRpZiAoIWFkYXB0ZXIpIHtcblx0XHRcdGFkYXB0ZXIgPSBjcmVhdGVXb3JrZXJBZGFwdGVyKHByb3ZpZGVyKTtcblx0XHRcdGF3YWl0IGFkYXB0ZXIuY29ubmVjdCgpO1xuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBDb25uZWN0ZWQgdG8gJHthZGFwdGVyLnByb3ZpZGVyfSB3b3JrZXIgc3lzdGVtYCk7XG5cdFx0XHR0aGlzLnJlZ2lzdGVyQWRhcHRlckhlYWx0aChhZGFwdGVyKTtcblx0XHRcdHRoaXMuYWRhcHRlclBvb2wuc2V0KHByb3ZpZGVyLCBhZGFwdGVyKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFkYXB0ZXI7XG5cdH1cblxuXHRwcml2YXRlIHJlZ2lzdGVyQWRhcHRlckhlYWx0aChhZGFwdGVyOiBXb3JrZXJBZGFwdGVyKTogdm9pZCB7XG5cdFx0dGhpcy5yZWdpc3RlckhlYWx0aERlcGVuZGVuY3koYHdvcmtlci0ke2FkYXB0ZXIucHJvdmlkZXJ9YCwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgaGVhbHRoeSA9IGF3YWl0IGFkYXB0ZXIuaGVhbHRoQ2hlY2soKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHN0YXR1czogaGVhbHRoeSA/IChcImhlYWx0aHlcIiBhcyBjb25zdCkgOiAoXCJ1bmhlYWx0aHlcIiBhcyBjb25zdCksXG5cdFx0XHRcdGxhc3RDaGVja2VkOiBEYXRlLm5vdygpLFxuXHRcdFx0XHRtZXNzYWdlOiBoZWFsdGh5ID8gXCJDb25uZWN0ZWRcIiA6IFwiQ29ubmVjdGlvbiBsb3N0XCIsXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhbGwgd29ya2Zsb3dzIHRoYXQgaGF2ZSB3b3JrZXIgdHJpZ2dlcnNcblx0ICovXG5cdHByb3RlY3RlZCBnZXRXb3JrZXJXb3JrZmxvd3MoKTogV29ya2VyV29ya2Zsb3dNb2RlbFtdIHtcblx0XHRjb25zdCB3b3JrZmxvd3M6IFdvcmtlcldvcmtmbG93TW9kZWxbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBbcGF0aCwgd29ya2Zsb3ddIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMubm9kZU1hcC53b3JrZmxvd3MgfHwge30pKSB7XG5cdFx0XHRjb25zdCB3b3JrZmxvd0NvbmZpZyA9ICh3b3JrZmxvdyBhcyB1bmtub3duIGFzIHsgX2NvbmZpZzogV29ya2VyV29ya2Zsb3dNb2RlbFtcImNvbmZpZ1wiXSB9KS5fY29uZmlnO1xuXG5cdFx0XHQvLyBGMTEg4oCUIGRpc2NvdmVyIHRoZSB3b3JrZXIgdHJpZ2dlciBieSBkaXJlY3Qga2V5IGFjY2VzcywgTk9UIGJ5XG5cdFx0XHQvLyBpbnNwZWN0aW5nIG9ubHkgdGhlIEZJUlNUIGtleS4gQSBtdWx0aS10cmlnZ2VyIHdvcmtmbG93IHN1Y2ggYXNcblx0XHRcdC8vIGB0cmlnZ2VyOiB7IGh0dHA6IHsuLi59LCB3b3JrZXI6IHsgcXVldWU6IFwiam9ic1wiIH0gfWAgZGVjbGFyZXNcblx0XHRcdC8vIGB3b3JrZXJgIHNlY29uZDsgdGhlIG9sZCBgT2JqZWN0LmtleXModHJpZ2dlcilbMF0gPT09IFwid29ya2VyXCJgXG5cdFx0XHQvLyBjaGVjayBzaWxlbnRseSBkcm9wcGVkIGl0LCBtYWtpbmcgZGlzY292ZXJ5IGRlcGVuZCBvbiBKUyBvYmplY3Rcblx0XHRcdC8vIGtleSBpbnNlcnRpb24gb3JkZXIuIEV2ZXJ5IHNpYmxpbmcgdHJpZ2dlciAoSFRUUC9TU0UvV2ViaG9vaylcblx0XHRcdC8vIGFscmVhZHkgcmVhZHMgaXRzIGtleSBkaXJlY3RseS5cblx0XHRcdGlmICh3b3JrZmxvd0NvbmZpZz8udHJpZ2dlcj8ud29ya2VyKSB7XG5cdFx0XHRcdHdvcmtmbG93cy5wdXNoKHtcblx0XHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRcdGNvbmZpZzogd29ya2Zsb3dDb25maWcsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB3b3JrZmxvd3M7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlIGFuIGluY29taW5nIGpvYlxuXHQgKi9cblx0cHJvdGVjdGVkIGFzeW5jIGhhbmRsZUpvYihqb2I6IFdvcmtlckpvYiwgd29ya2Zsb3c6IFdvcmtlcldvcmtmbG93TW9kZWwsIGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBqb2JJZCA9IGpvYi5pZCB8fCB1dWlkKCk7XG5cdFx0Y29uc3QgZGVmYXVsdE1ldGVyID0gbWV0cmljcy5nZXRNZXRlcihcImRlZmF1bHRcIik7XG5cdFx0Y29uc3Qgd29ya2VySm9icyA9IGRlZmF1bHRNZXRlci5jcmVhdGVDb3VudGVyKFwid29ya2VyX2pvYnNfcHJvY2Vzc2VkXCIsIHtcblx0XHRcdGRlc2NyaXB0aW9uOiBcIldvcmtlciBqb2JzIHByb2Nlc3NlZFwiLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHdvcmtlckVycm9ycyA9IGRlZmF1bHRNZXRlci5jcmVhdGVDb3VudGVyKFwid29ya2VyX2pvYnNfZmFpbGVkXCIsIHtcblx0XHRcdGRlc2NyaXB0aW9uOiBcIldvcmtlciBqb2IgZmFpbHVyZXNcIixcblx0XHR9KTtcblx0XHRjb25zdCB3b3JrZXJSZXRyaWVzID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJ3b3JrZXJfam9ic19yZXRyaWVkXCIsIHtcblx0XHRcdGRlc2NyaXB0aW9uOiBcIldvcmtlciBqb2IgcmV0cmllc1wiLFxuXHRcdH0pO1xuXG5cdFx0YXdhaXQgdGhpcy50cmFjZXIuc3RhcnRBY3RpdmVTcGFuKGB3b3JrZXI6JHtjb25maWcucXVldWV9YCwgYXN5bmMgKHNwYW46IFNwYW4pID0+IHtcblx0XHRcdC8vIEYyIOKAlCBnaXZlIGVhY2ggam9iIGl0cyBPV04gQ29uZmlndXJhdGlvbiBzbyBjb25jdXJyZW50IGpvYnNcblx0XHRcdC8vIChgY29uY3VycmVuY3kgPiAxYCwgb3IgdHdvIHF1ZXVlcyBpbiBvbmUgcHJvY2VzcykgbmV2ZXIgcmVhZCBhXG5cdFx0XHQvLyBzdGVwIGxpc3QgLyBuYW1lIC8gdHJpZ2dlciBjb25maWcgYW5vdGhlciBqb2IncyBgaW5pdCgpYFxuXHRcdFx0Ly8gb3Zlcndyb3RlLiBEZWNsYXJlZCBvdXRzaWRlIHRoZSB0cnkgc28gdGhlIGNhdGNoIGNhbiBmbGlwIHRoZVxuXHRcdFx0Ly8gcnVuJ3Mgc3RhdHVzIHZpYSB0aGUgcGVyLWpvYiBjb25maWcgbmFtZS5cblx0XHRcdGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpO1xuXHRcdFx0Ly8gRjQg4oCUIGNhcHR1cmVkIGZyb20gY3JlYXRlQ29udGV4dCBzbyB0aGUgdGltZW91dCBwYXRoIGNhbiBhYm9ydFxuXHRcdFx0Ly8gdGhlIGRldGFjaGVkIHJ1biBjb29wZXJhdGl2ZWx5LlxuXHRcdFx0bGV0IHJ1bkN0eDogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0Ly8gQnVnIDAzIOKAlCByZXNvbHZlIHRoZSBhbHJlYWR5LWxvYWRlZCB3b3JrZmxvdyBvYmplY3QgZnJvbSB0aGVcblx0XHRcdFx0Ly8gaW4tbWVtb3J5IG5vZGVNYXAgYW5kIHBhc3MgaXQgYXMgdGhlIGBwcmVsb2FkZWRgIGFyZyAobWlycm9yc1xuXHRcdFx0XHQvLyBIVFRQKS4gVGhpcyByb3V0ZXMgaW5pdCB0aHJvdWdoIHRoZSBwcmVsb2FkZWQgYnJhbmNoIGFuZCBza2lwc1xuXHRcdFx0XHQvLyB0aGUgZGlzay1iYXNlZCBgTG9jYWxTdG9yYWdlYCByZXNvbHZlciB3aG9zZSBkb3QgaGV1cmlzdGljXG5cdFx0XHRcdC8vIHJlamVjdGVkIGRvdHRlZCBgZG9tYWluLmFjdGlvbmAgd29ya2Zsb3cgbmFtZXMgKFwiRmlsZSB0eXBlIG5vdFxuXHRcdFx0XHQvLyBzdXBwb3J0ZWRcIikuIEZhbGxiYWNrIHRvIGB3b3JrZmxvdy5jb25maWdgIHNvIGBwcmVsb2FkZWRgIGlzXG5cdFx0XHRcdC8vIG5ldmVyIHVuZGVmaW5lZCAod2hpY2ggd291bGQgcmUtdHJpZ2dlciB0aGUgZGlzayBicmFuY2gpLlxuXHRcdFx0XHRjb25zdCBwcmVsb2FkZWQgPVxuXHRcdFx0XHRcdCh0aGlzLm5vZGVNYXAud29ya2Zsb3dzICYmICh0aGlzLm5vZGVNYXAud29ya2Zsb3dzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVt3b3JrZmxvdy5wYXRoXSkgPz9cblx0XHRcdFx0XHR3b3JrZmxvdy5jb25maWc7XG5cblx0XHRcdFx0Ly8gRjIg4oCUIGluaXRpYWxpemUgdGhlIHBlci1qb2IgQ29uZmlndXJhdGlvbiBpbnN0ZWFkIG9mIHRoZSBzaGFyZWRcblx0XHRcdFx0Ly8gYHRoaXMuY29uZmlndXJhdGlvbmAuXG5cdFx0XHRcdGF3YWl0IGNvbmZpZ3VyYXRpb24uaW5pdCh3b3JrZmxvdy5wYXRoLCB0aGlzLm5vZGVNYXAsIHByZWxvYWRlZCk7XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIGNvbnRleHQg4oCUIGJpbmQgaXQgdG8gdGhlIHBlci1qb2IgQ29uZmlndXJhdGlvbiAoRjIpLlxuXHRcdFx0XHRjb25zdCBjdHg6IENvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkLCB3b3JrZmxvdy5wYXRoLCBqb2JJZCwgY29uZmlndXJhdGlvbik7XG5cdFx0XHRcdHJ1bkN0eCA9IGN0eDtcblxuXHRcdFx0XHQvLyBQb3B1bGF0ZSByZXF1ZXN0IHdpdGggam9iIGRhdGFcblx0XHRcdFx0Y3R4LnJlcXVlc3QgPSB7XG5cdFx0XHRcdFx0Ym9keTogam9iLmRhdGEsXG5cdFx0XHRcdFx0aGVhZGVyczogam9iLmhlYWRlcnMsXG5cdFx0XHRcdFx0cXVlcnk6IHt9LFxuXHRcdFx0XHRcdHBhcmFtczoge1xuXHRcdFx0XHRcdFx0cXVldWU6IGpvYi5xdWV1ZSxcblx0XHRcdFx0XHRcdGpvYklkOiBqb2IuaWQsXG5cdFx0XHRcdFx0XHRhdHRlbXB0OiBTdHJpbmcoam9iLmF0dGVtcHRzKSxcblx0XHRcdFx0XHRcdHByaW9yaXR5OiBTdHJpbmcoam9iLnByaW9yaXR5KSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9IGFzIHVua25vd24gYXMgUmVxdWVzdENvbnRleHQ7XG5cblx0XHRcdFx0Ly8gU3RvcmUgd29ya2VyIG1ldGFkYXRhIGluIGNvbnRleHRcblx0XHRcdFx0aWYgKCFjdHgudmFycykgY3R4LnZhcnMgPSB7fTtcblx0XHRcdFx0Y3R4LnZhcnMuX3dvcmtlcl9qb2IgPSB7XG5cdFx0XHRcdFx0aWQ6IGpvYi5pZCxcblx0XHRcdFx0XHRxdWV1ZTogam9iLnF1ZXVlLFxuXHRcdFx0XHRcdGF0dGVtcHRzOiBTdHJpbmcoam9iLmF0dGVtcHRzKSxcblx0XHRcdFx0XHRtYXhSZXRyaWVzOiBTdHJpbmcoam9iLm1heFJldHJpZXMpLFxuXHRcdFx0XHRcdHByaW9yaXR5OiBTdHJpbmcoam9iLnByaW9yaXR5KSxcblx0XHRcdFx0XHRjcmVhdGVkQXQ6IGpvYi5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSxcblx0XHRcdFx0XHRkZWxheTogU3RyaW5nKGpvYi5kZWxheSA/PyAwKSxcblx0XHRcdFx0XHR0aW1lb3V0OiBTdHJpbmcoam9iLnRpbWVvdXQgPz8gMCksXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y3R4LmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0YFByb2Nlc3Npbmcgam9iICR7am9iSWR9IGZyb20gJHtjb25maWcucXVldWV9IChhdHRlbXB0ICR7am9iLmF0dGVtcHRzICsgMX0vJHtqb2IubWF4UmV0cmllcyArIDF9KWAsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gdjAuNiDCtyBhcHBseSB0aGUgbWVyZ2VkIG1pZGRsZXdhcmUgY2hhaW4gKHByb2Nlc3MtZ2xvYmFsIOKGklxuXHRcdFx0XHQvLyB3b3JrZmxvdy1sZXZlbCDihpIgdHJpZ2dlci1sZXZlbCkgb24gdGhlIHNhbWUgY3R4IHRoZSBtYWluXG5cdFx0XHRcdC8vIHdvcmtmbG93IHdpbGwgc2VlLiBTdGF0ZSBtdXRhdGlvbnMgZnJvbSBtaWRkbGV3YXJlXG5cdFx0XHRcdC8vIChlLmcuIGN0eC5zdGF0ZS5pZGVudGl0eSkgY2FycnkgZm9yd2FyZC4gTWlkZGxld2FyZSB0aGF0XG5cdFx0XHRcdC8vIHRocm93cyAodmlhIGBAYmxva2pzL3Rocm93YCkgcHJvcGFnYXRlcyB0byB0aGUgb3V0ZXJcblx0XHRcdFx0Ly8gY2F0Y2ggYW5kIGlzIHJvdXRlZCB0aHJvdWdoIHRoZSB3b3JrZXIncyByZXRyeSAvIERMUVxuXHRcdFx0XHQvLyBsb2dpYyBleGFjdGx5IGxpa2UgYSBtYWluLXdvcmtmbG93IGVycm9yLlxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBGMiDigJQgcGFzcyB0aGUgcGVyLWpvYiBgY29uZmlndXJhdGlvbmAgc28gdHJpZ2dlci1sZXZlbFxuXHRcdFx0XHQvLyAoYHRyaWdnZXIud29ya2VyLm1pZGRsZXdhcmVgKSBhbmQgd29ya2Zsb3ctbGV2ZWwgbWlkZGxld2FyZVxuXHRcdFx0XHQvLyBhcmUgcmVhZCBmcm9tIHRoZSBvYmplY3QgVEhJUyBqb2IgaW5pdGlhbGl6ZWQuIFdpdGhvdXQgaXQgdGhlXG5cdFx0XHRcdC8vIGNoYWluIHdvdWxkIHJlYWQgdGhlIG5ldmVyLWluaXRpYWxpemVkIHNoYXJlZCBgdGhpcy5jb25maWd1cmF0aW9uYFxuXHRcdFx0XHQvLyAodGhlIHdvcmtlciBubyBsb25nZXIgY2FsbHMgYHRoaXMuY29uZmlndXJhdGlvbi5pbml0YCkgYW5kXG5cdFx0XHRcdC8vIHNpbGVudGx5IGRyb3AgZXZlcnl0aGluZyBidXQgdGhlIHByb2Nlc3MtZ2xvYmFsIGNoYWluLlxuXHRcdFx0XHRhd2FpdCB0aGlzLmFwcGx5TWlkZGxld2FyZUNoYWluKGN0eCwgdGhpcy5ub2RlTWFwLCBjb25maWd1cmF0aW9uKTtcblxuXHRcdFx0XHQvLyBFeGVjdXRlIHdvcmtmbG93IHdpdGggdGltZW91dCBpZiBjb25maWd1cmVkLlxuXHRcdFx0XHQvLyBGMiDigJQgcGFzcyB0aGUgcGVyLWpvYiBgY29uZmlndXJhdGlvbmAgaW50byBgcnVuYCBzbyB0aGUgcnVubmVyXG5cdFx0XHRcdC8vIHJlYWRzIHRoZSBzYW1lIG9iamVjdCB0aGlzIGpvYiBpbml0aWFsaXplZC5cblx0XHRcdFx0bGV0IHJlc3BvbnNlOiBUcmlnZ2VyUmVzcG9uc2U7XG5cdFx0XHRcdGlmIChjb25maWcudGltZW91dCAmJiBjb25maWcudGltZW91dCA+IDApIHtcblx0XHRcdFx0XHRyZXNwb25zZSA9IGF3YWl0IHRoaXMuZXhlY3V0ZVdpdGhUaW1lb3V0KGN0eCwgY29uZmlnLnRpbWVvdXQsIGNvbmZpZ3VyYXRpb24pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc3BvbnNlID0gYXdhaXQgdGhpcy5ydW4oY3R4LCBjb25maWd1cmF0aW9uKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG5cdFx0XHRcdC8vIFNldCBzcGFuIGF0dHJpYnV0ZXNcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIHRydWUpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImpvYl9pZFwiLCBqb2JJZCk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwicXVldWVcIiwgY29uZmlnLnF1ZXVlKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJhdHRlbXB0c1wiLCBqb2IuYXR0ZW1wdHMpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImVsYXBzZWRfbXNcIiwgZW5kIC0gc3RhcnQpO1xuXHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LIH0pO1xuXG5cdFx0XHRcdC8vIFJlY29yZCBtZXRyaWNzXG5cdFx0XHRcdHdvcmtlckpvYnMuYWRkKDEsIHtcblx0XHRcdFx0XHRlbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuXHRcdFx0XHRcdHF1ZXVlOiBjb25maWcucXVldWUsXG5cdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogY29uZmlndXJhdGlvbi5uYW1lLFxuXHRcdFx0XHRcdHN1Y2Nlc3M6IFwidHJ1ZVwiLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjdHgubG9nZ2VyLmxvZyhgSm9iIGNvbXBsZXRlZCBpbiAkeyhlbmQgLSBzdGFydCkudG9GaXhlZCgyKX1tczogJHtqb2JJZH1gKTtcblxuXHRcdFx0XHQvLyBNYXJrIGpvYiBhcyBjb21wbGV0ZWRcblx0XHRcdFx0YXdhaXQgam9iLmNvbXBsZXRlKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2U7XG5cblx0XHRcdFx0Ly8gVGllciAyICM1ICsgIzcg4oCUIGRlZmVycmVkIGRpc3BhdGNoIChkZWxheS9UVEwvZGVib3VuY2UpLlxuXHRcdFx0XHQvLyBUaGUgcnVuIHdhcyBkZWZlcnJlZCB0byBhIGZ1dHVyZSB0aW1lcjsgQUNLIHdpdGhvdXQgcmV0cnkuXG5cdFx0XHRcdC8vIFRoZSBpbi1wcm9jZXNzIHNjaGVkdWxlciBvd25zIHRoZSBldmVudHVhbCBkaXNwYXRjaCwgTk9UXG5cdFx0XHRcdC8vIHRoZSBicm9rZXIg4oCUIHJlLXF1ZXVlaW5nIGhlcmUgd291bGQgY3JlYXRlIGEgZHVwbGljYXRlLlxuXHRcdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBEZWZlcnJlZERpc3BhdGNoU2lnbmFsKSB7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImRlZmVycmVkXCIsIHRydWUpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiZGVmZXJyZWRfc3RhdHVzXCIsIGVycm9yLmluZm8uc3RhdHVzKTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LLCBtZXNzYWdlOiBgZGVmZXJyZWQ6JHtlcnJvci5pbmZvLnN0YXR1c31gIH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFxuXHRcdFx0XHRcdFx0YFtzY2hlZHVsaW5nXSBqb2IgJHtqb2JJZH0gcnVuSWQ9JHtlcnJvci5pbmZvLnJ1bklkfSBzdGF0dXM9JHtlcnJvci5pbmZvLnN0YXR1c30gYCArXG5cdFx0XHRcdFx0XHRcdGBzY2hlZHVsZWRBdD0ke2Vycm9yLmluZm8uc2NoZWR1bGVkQXR9IHBpbmdDb3VudD0ke2Vycm9yLmluZm8ucGluZ0NvdW50fSDihpIgQUNLIChubyByZXF1ZXVlKWAsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5jb21wbGV0ZSgpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFBSIDEtNSBwb2xpc2gg4oCUIHF1ZXVlLW1vZGUgVFRMIGVsYXBzZWQuIFRoZSBydW4gaXMgYWxyZWFkeVxuXHRcdFx0XHQvLyBmbGlwcGVkIHRvIGBleHBpcmVkYCAoc2VlIFRyaWdnZXJCYXNlIHF1ZXVlIGJyYW5jaCk7IEFDS1xuXHRcdFx0XHQvLyB3aXRob3V0IHJldHJ5IHNvIHRoZSBicm9rZXIgZG9lc24ndCByZWRlbGl2ZXIg4oCUIHRoZSBydW5cblx0XHRcdFx0Ly8gd2lsbCBuZXZlciBzdWNjZWVkICh0aW1lciB3b24ndCByZS1maXJlKS4gRGlzdGluY3QgZnJvbVxuXHRcdFx0XHQvLyB0aGUgdGhyb3R0bGVkIE5BQ0sgYmVsb3cuXG5cdFx0XHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIFF1ZXVlRXhwaXJlZEVycm9yKSB7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInF1ZXVlX2V4cGlyZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSywgbWVzc2FnZTogXCJxdWV1ZV9leHBpcmVkXCIgfSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0XHRgW2NvbmN1cnJlbmN5XSBqb2IgJHtqb2JJZH0gcnVuSWQ9JHtlcnJvci5pbmZvLnJ1bklkfSBrZXk9JyR7ZXJyb3IuaW5mby5jb25jdXJyZW5jeUtleX0nIGAgK1xuXHRcdFx0XHRcdFx0XHRgcXVldWVFeHBpcmVkQXQ9JHtlcnJvci5pbmZvLnF1ZXVlRXhwaXJlZEF0fSDihpIgQUNLIChubyByZXF1ZXVlLCBydW4gZXhwaXJlZClgLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRhd2FpdCBqb2IuY29tcGxldGUoKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUaWVyIDIgIzYg4oCUIGNvbmN1cnJlbmN5IGdhdGUgZGVuaWFsLiBEaXN0aW5jdCBmcm9tIGEgbm9ybWFsXG5cdFx0XHRcdC8vIGZhaWx1cmU6IE5BQ0sgd2l0aCByZWRlbGl2ZXJ5IHNvIHRoZSBicm9rZXIgcmUtcXVldWVzIHRoZVxuXHRcdFx0XHQvLyBqb2Igd2l0aCBpdHMgZXhpc3RpbmcgYmFjay1vZmYgc2VtYW50aWNzLiBEb2Vzbid0IGNvdW50XG5cdFx0XHRcdC8vIGFnYWluc3QgdGhlIHdvcmtmbG93J3MgcmV0cnkgYnVkZ2V0IChkaWZmZXJlbnQgaW52YXJpYW50KS5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHBhc3MgYHdpbGxSZXRyeTogdHJ1ZWAgcmVnYXJkbGVzcyBvZiBgam9iLmF0dGVtcHRzYFxuXHRcdFx0XHQvLyBiZWNhdXNlIHRocm90dGxpbmcgaXMgYSB0cmFuc2llbnQgcmVzb3VyY2Ugc3RhdGUsIG5vdCBhXG5cdFx0XHRcdC8vIHBlcm1hbmVudCBmYWlsdXJlLlxuXHRcdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb25jdXJyZW5jeUxpbWl0RXJyb3IpIHtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwid2lsbF9yZXRyeVwiLCB0cnVlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInRocm90dGxlZFwiLCB0cnVlKTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LLCBtZXNzYWdlOiBcImNvbmN1cnJlbmN5X2xpbWl0X3JlYWNoZWRcIiB9KTtcblxuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhcblx0XHRcdFx0XHRcdGBbY29uY3VycmVuY3ldIGpvYiAke2pvYklkfSBrZXk9JyR7ZXJyb3IuaW5mby5jb25jdXJyZW5jeUtleX0nIGAgK1xuXHRcdFx0XHRcdFx0XHRgbGltaXQ9JHtlcnJvci5pbmZvLmNvbmN1cnJlbmN5TGltaXR9IGluRmxpZ2h0PSR7ZXJyb3IuaW5mby5jdXJyZW50SW5GbGlnaHR9IOKGkiBOQUNLICsgcmVkZWxpdmVyeWAsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHdvcmtlclJldHJpZXMuYWRkKDEsIHtcblx0XHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0XHRxdWV1ZTogY29uZmlnLnF1ZXVlLFxuXHRcdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogY29uZmlndXJhdGlvbj8ubmFtZSB8fCBcInVua25vd25cIixcblx0XHRcdFx0XHRcdHJlYXNvbjogXCJ0aHJvdHRsZWRcIixcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5mYWlsKGVycm9yIGFzIEVycm9yLCB0cnVlKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGMyDigJQgdGhlIHJ1biB3YXMgY2FuY2VsbGVkIGJ5IGFuIG9wZXJhdG9yXG5cdFx0XHRcdC8vIChgUE9TVCAvX19ibG9rL3J1bnMvOnJ1bklkL2NhbmNlbGApLiBgUnVubmVyU3RlcHNgIHRocm93c1xuXHRcdFx0XHQvLyBgUnVuQ2FuY2VsbGVkRXJyb3JgLCB3aGljaCBgVHJpZ2dlckJhc2UucnVuYCByZS10aHJvd3Ncblx0XHRcdFx0Ly8gdW50b3VjaGVkIChzdGF0dXMgYWxyZWFkeSBmbGlwcGVkIHRvIGBjYW5jZWxsZWRgKS4gVGhlIHJ1biBpc1xuXHRcdFx0XHQvLyB0ZXJtaW5hbCDigJQgQUNLIHRoZSBicm9rZXIgV0lUSE9VVCByZXF1ZXVlIHNvIHRoZVxuXHRcdFx0XHQvLyBkZWxpYmVyYXRlbHktY2FuY2VsbGVkLCBvZnRlbiBub24taWRlbXBvdGVudCB3b3JrIGRvZXNuJ3QgcnVuXG5cdFx0XHRcdC8vIGFnYWluIG9uIHJlZGVsaXZlcnkuXG5cdFx0XHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIFJ1bkNhbmNlbGxlZEVycm9yKSB7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImNhbmNlbGxlZFwiLCB0cnVlKTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LLCBtZXNzYWdlOiBcInJ1bl9jYW5jZWxsZWRcIiB9KTtcblxuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgSm9iICR7am9iSWR9IGNhbmNlbGxlZCAocnVuIGFscmVhZHkgdGVybWluYWwpIOKGkiBBQ0sgKG5vIHJlcXVldWUpYCk7XG5cblx0XHRcdFx0XHRhd2FpdCBqb2IuY29tcGxldGUoKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGNCAvIEYyNCDigJQgdHJpZ2dlci1sZXZlbCBgY29uZmlnLnRpbWVvdXRgIGVsYXBzZWQuIFRoZSBkZXRhY2hlZFxuXHRcdFx0XHQvLyBydW4gd2FzIGFscmVhZHkgYWJvcnRlZCB2aWEgYGN0eC5zaWduYWxgIGluc2lkZVxuXHRcdFx0XHQvLyBgZXhlY3V0ZVdpdGhUaW1lb3V0YCwgc28gaXQgdW53aW5kcyB3aXRoIGBSdW5DYW5jZWxsZWRFcnJvcmBcblx0XHRcdFx0Ly8gYXQgdGhlIG5leHQgYmV0d2Vlbi1zdGVwIGNoZWNrLiBGbGlwIHRoZSBydW4gcmVjb3JkIHRvIHRoZVxuXHRcdFx0XHQvLyBkZWRpY2F0ZWQgYHRpbWVkT3V0YCBzdGF0dXMgKG1hdGNoaW5nIHRoZSBwZXItc3RlcFxuXHRcdFx0XHQvLyBgbWF4RHVyYXRpb25gIHRheG9ub215KSBpbnN0ZWFkIG9mIHJvdXRpbmcgdGhyb3VnaCB0aGUgZ2VuZXJpY1xuXHRcdFx0XHQvLyByZXRyeS9ETFEgcGF0aCwgYW5kIEFDSyB3aXRob3V0IHJlcXVldWUuXG5cdFx0XHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtlclRpbWVvdXRFcnJvcikge1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJ0aW1lZF9vdXRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUiwgbWVzc2FnZTogXCJqb2JfdGltZWRfb3V0XCIgfSk7XG5cblx0XHRcdFx0XHRjb25zdCB0aW1lZE91dFJ1bklkID0gZXJyb3IucnVuSWQgPz8gKHJ1bkN0eCBhcyB7IF90cmFjZVJ1bklkPzogc3RyaW5nIH0gfCB1bmRlZmluZWQpPy5fdHJhY2VSdW5JZDtcblx0XHRcdFx0XHRpZiAodGltZWRPdXRSdW5JZCkge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0UnVuVHJhY2tlci5nZXRJbnN0YW5jZSgpLm1hcmtSdW5UaW1lZE91dCh0aW1lZE91dFJ1bklkLCB7XG5cdFx0XHRcdFx0XHRcdFx0c3RlcElkOiBcIl9fd29ya2VyX3RpbWVvdXRfX1wiLFxuXHRcdFx0XHRcdFx0XHRcdG1heER1cmF0aW9uTXM6IGVycm9yLnRpbWVvdXRNcyxcblx0XHRcdFx0XHRcdFx0XHRhdHRlbXB0c0V4aGF1c3RlZDogam9iLmF0dGVtcHRzICsgMSxcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChtYXJrRXJyKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFxuXHRcdFx0XHRcdFx0XHRcdGBbYmxva11bd29ya2VyXSBtYXJrUnVuVGltZWRPdXQgZmFpbGVkIGZvciBydW4gJHt0aW1lZE91dFJ1bklkfTogJHttYXJrRXJyIGluc3RhbmNlb2YgRXJyb3IgPyBtYXJrRXJyLm1lc3NhZ2UgOiBTdHJpbmcobWFya0Vycil9YCxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR3b3JrZXJFcnJvcnMuYWRkKDEsIHtcblx0XHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0XHRxdWV1ZTogY29uZmlnLnF1ZXVlLFxuXHRcdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogY29uZmlndXJhdGlvbj8ubmFtZSB8fCBcInVua25vd25cIixcblx0XHRcdFx0XHRcdHJlYXNvbjogXCJ0aW1lb3V0XCIsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XHRcdGBKb2IgJHtqb2JJZH0gdGltZWQgb3V0IGFmdGVyICR7ZXJyb3IudGltZW91dE1zfW1zIOKGkiBydW4gZmxpcHBlZCB0byB0aW1lZE91dCwgQUNLIChubyByZXF1ZXVlKWAsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5jb21wbGV0ZSgpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHNob3VsZFJldHJ5ID0gam9iLmF0dGVtcHRzIDwgam9iLm1heFJldHJpZXM7XG5cblx0XHRcdFx0Ly8gU2V0IHNwYW4gZXJyb3Jcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJ3aWxsX3JldHJ5XCIsIHNob3VsZFJldHJ5KTtcblx0XHRcdFx0c3Bhbi5yZWNvcmRFeGNlcHRpb24oZXJyb3IgYXMgRXJyb3IpO1xuXHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLCBtZXNzYWdlOiBlcnJvck1lc3NhZ2UgfSk7XG5cblx0XHRcdFx0aWYgKHNob3VsZFJldHJ5KSB7XG5cdFx0XHRcdFx0Ly8gUmV0cnkgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmLiBgY29uZmlnLmRlbGF5YCB3aWRlbmVkIHRvXG5cdFx0XHRcdFx0Ly8gYHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZGAgaW4gVGllciAyICM1IChkdXJhdGlvbiBzdHJpbmdzKS5cblx0XHRcdFx0XHQvLyBgY2FsY3VsYXRlQmFja29mZmAgb25seSBoYW5kbGVzIG51bWJlcnM7IG5vcm1hbGl6ZSB2aWFcblx0XHRcdFx0XHQvLyB0cnlQYXJzZUR1cmF0aW9uLiBGYWlsLW9wZW4gdG8gdW5kZWZpbmVkIOKGkiBkZWZhdWx0IGJhY2tvZmYuXG5cdFx0XHRcdFx0Y29uc3QgZGVsYXlNcyA9XG5cdFx0XHRcdFx0XHR0eXBlb2YgY29uZmlnLmRlbGF5ID09PSBcIm51bWJlclwiXG5cdFx0XHRcdFx0XHRcdD8gY29uZmlnLmRlbGF5XG5cdFx0XHRcdFx0XHRcdDogdHlwZW9mIGNvbmZpZy5kZWxheSA9PT0gXCJzdHJpbmdcIlxuXHRcdFx0XHRcdFx0XHRcdD8gKHRyeVBhcnNlRHVyYXRpb24oY29uZmlnLmRlbGF5KSA/PyB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0Y29uc3QgYmFja29mZk1zID0gdGhpcy5jYWxjdWxhdGVCYWNrb2ZmKGpvYi5hdHRlbXB0cywgZGVsYXlNcyk7XG5cdFx0XHRcdFx0d29ya2VyUmV0cmllcy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdHF1ZXVlOiBjb25maWcucXVldWUsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiBjb25maWd1cmF0aW9uPy5uYW1lIHx8IFwidW5rbm93blwiLFxuXHRcdFx0XHRcdFx0YXR0ZW1wdDogU3RyaW5nKGpvYi5hdHRlbXB0cyArIDEpLFxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFx0XHRgSm9iICR7am9iSWR9IGZhaWxlZCAoYXR0ZW1wdCAke2pvYi5hdHRlbXB0cyArIDF9LyR7am9iLm1heFJldHJpZXMgKyAxfSksIHJldHJ5aW5nIGluICR7YmFja29mZk1zfW1zOiAke2Vycm9yTWVzc2FnZX1gLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRhd2FpdCBqb2IuZmFpbChlcnJvciBhcyBFcnJvciwgdHJ1ZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gTWF4IHJldHJpZXMgZXhoYXVzdGVkIC0gc2VuZCB0byBETFFcblx0XHRcdFx0XHR3b3JrZXJFcnJvcnMuYWRkKDEsIHtcblx0XHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0XHRxdWV1ZTogY29uZmlnLnF1ZXVlLFxuXHRcdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogY29uZmlndXJhdGlvbj8ubmFtZSB8fCBcInVua25vd25cIixcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFxuXHRcdFx0XHRcdFx0YEpvYiAke2pvYklkfSBwZXJtYW5lbnRseSBmYWlsZWQgYWZ0ZXIgJHtqb2IuYXR0ZW1wdHMgKyAxfSBhdHRlbXB0czogJHtlcnJvck1lc3NhZ2V9YCxcblx0XHRcdFx0XHRcdChlcnJvciBhcyBFcnJvcikuc3RhY2ssXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5mYWlsKGVycm9yIGFzIEVycm9yLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdHNwYW4uZW5kKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB3b3JrZmxvdyB3aXRoIGEgdGltZW91dC5cblx0ICpcblx0ICogRjQg4oCUIG9uIHRpbWVvdXQsIGZpcmUgdGhlIGN0eCBBYm9ydENvbnRyb2xsZXIgc28gdGhlIGRldGFjaGVkIGBydW5gXG5cdCAqIHVud2luZHMgY29vcGVyYXRpdmVseSAoaXQgdGhyb3dzIGBSdW5DYW5jZWxsZWRFcnJvcmAgYXQgdGhlIG5leHRcblx0ICogYmV0d2Vlbi1zdGVwIGNoZWNrOyBsb25nIHVuaW50ZXJydXB0aWJsZSBub2RlcyBzaG91bGQgc3RpbGwgcG9sbFxuXHQgKiBgY3R4LnNpZ25hbC5hYm9ydGVkYCkuIFRoZSBwcm9taXNlIHJlamVjdHMgd2l0aCBhIGRlZGljYXRlZFxuXHQgKiB7QGxpbmsgV29ya2VyVGltZW91dEVycm9yfSBjYXJyeWluZyB0aGUgcnVuIGlkIHNvIGBoYW5kbGVKb2JgJ3MgY2F0Y2ggY2FuXG5cdCAqIGZsaXAgdGhlIHJ1biByZWNvcmQgdG8gYHRpbWVkT3V0YCAoRjI0KS4gVGhlIHNlY29uZCBgcnVuYCAoYnJva2VyXG5cdCAqIHJlZGVsaXZlcnkpIGlzIHByZXZlbnRlZCBiZWNhdXNlIHdlIEFDSyB3aXRob3V0IHJlcXVldWUgb24gdGltZW91dC5cblx0ICpcblx0ICogRjIg4oCUIGBjb25maWd1cmF0aW9uYCBpcyB0aGUgcGVyLWpvYiBDb25maWd1cmF0aW9uOyB0aHJlYWRlZCBpbnRvIGBydW5gLlxuXHQgKi9cblx0cHJvdGVjdGVkIGFzeW5jIGV4ZWN1dGVXaXRoVGltZW91dChcblx0XHRjdHg6IENvbnRleHQsXG5cdFx0dGltZW91dE1zOiBudW1iZXIsXG5cdFx0Y29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24sXG5cdCk6IFByb21pc2U8VHJpZ2dlclJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPFRyaWdnZXJSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0bGV0IHNldHRsZWQgPSBmYWxzZTtcblx0XHRcdGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmIChzZXR0bGVkKSByZXR1cm47XG5cdFx0XHRcdHNldHRsZWQgPSB0cnVlO1xuXG5cdFx0XHRcdC8vIEY0IOKAlCBhYm9ydCB0aGUgZGV0YWNoZWQgcnVuIHNvIGl0IHN0b3BzIGV4ZWN1dGluZyByYXRoZXIgdGhhblxuXHRcdFx0XHQvLyBjb250aW51aW5nIHRvIHNldHRsZSBpdHMgb3duIHJ1biByZWNvcmQgb3V0IG9mIGJhbmQuXG5cdFx0XHRcdGNvbnN0IHByaXZhdGVTbG90ID0gY3R4Ll9QUklWQVRFXyBhcyB7IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlciB9IHwgbnVsbDtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRwcml2YXRlU2xvdD8uYWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvKiBiZXN0LWVmZm9ydCDigJQgYWJvcnQgbmV2ZXIgdGhyb3dzLCBidXQgZ3VhcmQgYW55d2F5ICovXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBydW5JZCA9IChjdHggYXMgeyBfdHJhY2VSdW5JZD86IHN0cmluZyB9KS5fdHJhY2VSdW5JZDtcblx0XHRcdFx0cmVqZWN0KG5ldyBXb3JrZXJUaW1lb3V0RXJyb3IodGltZW91dE1zLCBydW5JZCkpO1xuXHRcdFx0fSwgdGltZW91dE1zKTtcblxuXHRcdFx0dGhpcy5ydW4oY3R4LCBjb25maWd1cmF0aW9uKVxuXHRcdFx0XHQudGhlbigocmVzdWx0KSA9PiB7XG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRcdFx0XHRpZiAoc2V0dGxlZCkgcmV0dXJuOyAvLyBhbHJlYWR5IHRpbWVkIG91dCDigJQgaWdub3JlIHRoZSBsYXRlIHJlc3VsdFxuXHRcdFx0XHRcdHNldHRsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHJlc29sdmUocmVzdWx0KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHRcdFx0aWYgKHNldHRsZWQpIHJldHVybjsgLy8gYWxyZWFkeSByZWplY3RlZCB3aXRoIFdvcmtlclRpbWVvdXRFcnJvclxuXHRcdFx0XHRcdHNldHRsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZSBleHBvbmVudGlhbCBiYWNrb2ZmIGRlbGF5XG5cdCAqIEZvcm11bGE6IG1pbihiYXNlRGVsYXkgKiAyXmF0dGVtcHQsIDMwMDAwKSArIGppdHRlclxuXHQgKi9cblx0cHJvdGVjdGVkIGNhbGN1bGF0ZUJhY2tvZmYoYXR0ZW1wdDogbnVtYmVyLCBiYXNlRGVsYXk/OiBudW1iZXIpOiBudW1iZXIge1xuXHRcdGNvbnN0IGJhc2UgPSBiYXNlRGVsYXkgPz8gMTAwMDtcblx0XHRjb25zdCBtYXhEZWxheSA9IDMwMDAwOyAvLyAzMCBzZWNvbmRzIG1heFxuXHRcdGNvbnN0IGV4cG9uZW50aWFsID0gTWF0aC5taW4oYmFzZSAqIDIgKiogYXR0ZW1wdCwgbWF4RGVsYXkpO1xuXHRcdGNvbnN0IGppdHRlciA9IE1hdGgucmFuZG9tKCkgKiBleHBvbmVudGlhbCAqIDAuMTsgLy8gMTAlIGppdHRlclxuXHRcdHJldHVybiBNYXRoLmZsb29yKGV4cG9uZW50aWFsICsgaml0dGVyKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBXb3JrZXJUcmlnZ2VyO1xuIl19
|
|
@@ -16,6 +16,11 @@
|
|
|
16
16
|
* - **Stats**: KafkaJS exposes consumer-group lag via its admin
|
|
17
17
|
* client; the lag count is reported as `waiting`. Other stats
|
|
18
18
|
* are tracked locally per consumer.
|
|
19
|
+
* - **Concurrency**: the `concurrency` field maps to KafkaJS's
|
|
20
|
+
* `partitionsConsumedConcurrently` — it caps how many partitions
|
|
21
|
+
* are processed in parallel, so it's bounded by the topic's
|
|
22
|
+
* partition count. A single-partition topic is effectively serial
|
|
23
|
+
* regardless of the configured value.
|
|
19
24
|
*
|
|
20
25
|
* Requires `kafkajs` as a peer dependency:
|
|
21
26
|
*
|