@blokjs/trigger-worker 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/WorkerTrigger.d.ts +3 -3
- package/dist/WorkerTrigger.js +132 -21
- package/dist/adapters/BullMQAdapter.d.ts +1 -1
- package/dist/adapters/BullMQAdapter.js +5 -42
- package/dist/adapters/InMemoryAdapter.d.ts +1 -1
- package/dist/adapters/InMemoryAdapter.js +4 -8
- package/dist/adapters/NATSAdapter.d.ts +110 -0
- package/dist/adapters/NATSAdapter.js +394 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.js +8 -13
- package/package.json +9 -5
- package/src/WorkerTrigger.test.ts +44 -14
- package/src/WorkerTrigger.ts +147 -6
- package/src/adapters/NATSAdapter.ts +452 -0
- package/src/index.ts +1 -0
- package/template/.env.example +13 -0
- package/template/package.json +45 -0
- package/template/src/Nodes.ts +10 -0
- package/template/src/Workflows.ts +8 -0
- package/template/src/index.ts +41 -0
- package/template/src/runner/WorkerServer.ts +34 -0
- package/template/src/runner/types/Workflows.ts +7 -0
- package/template/src/workflows/jobs/process-job.ts +45 -0
- package/template/tsconfig.json +31 -0
- package/template/vitest.config.ts +39 -0
package/dist/WorkerTrigger.d.ts
CHANGED
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
* - Execute workflow via this.run(ctx)
|
|
19
19
|
* - Ack on success, retry or DLQ on failure
|
|
20
20
|
*/
|
|
21
|
-
import type
|
|
22
|
-
import { DefaultLogger, type GlobalOptions,
|
|
23
|
-
import type { Context } from "@
|
|
21
|
+
import { type HelperResponse, type WorkerTriggerOpts } from "@blokjs/helper";
|
|
22
|
+
import { type BlokService, DefaultLogger, type GlobalOptions, TriggerBase, type TriggerResponse } from "@blokjs/runner";
|
|
23
|
+
import type { Context } from "@blokjs/shared";
|
|
24
24
|
/**
|
|
25
25
|
* Job received from worker queue
|
|
26
26
|
*/
|
package/dist/WorkerTrigger.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* WorkerTrigger - Background job processing for Blok workflows
|
|
4
3
|
*
|
|
@@ -19,11 +18,10 @@
|
|
|
19
18
|
* - Execute workflow via this.run(ctx)
|
|
20
19
|
* - Ack on success, retry or DLQ on failure
|
|
21
20
|
*/
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const uuid_1 = require("uuid");
|
|
21
|
+
import { tryParseDuration } from "@blokjs/helper";
|
|
22
|
+
import { ConcurrencyLimitError, QueueExpiredError, ConcurrencyMetrics, DefaultLogger, DeferredDispatchSignal, Janitor, NodeMap, RunTracker, TriggerBase, createConcurrencyBackend, } from "@blokjs/runner";
|
|
23
|
+
import { SpanStatusCode, metrics, trace } from "@opentelemetry/api";
|
|
24
|
+
import { v4 as uuid } from "uuid";
|
|
27
25
|
/**
|
|
28
26
|
* WorkerTrigger - Abstract base class for worker-based triggers
|
|
29
27
|
*
|
|
@@ -35,10 +33,10 @@ const uuid_1 = require("uuid");
|
|
|
35
33
|
* - Delayed job scheduling
|
|
36
34
|
* - Queue statistics and monitoring
|
|
37
35
|
*/
|
|
38
|
-
class WorkerTrigger extends
|
|
36
|
+
export class WorkerTrigger extends TriggerBase {
|
|
39
37
|
nodeMap = {};
|
|
40
|
-
tracer =
|
|
41
|
-
logger = new
|
|
38
|
+
tracer = trace.getTracer(process.env.PROJECT_NAME || "trigger-worker-workflow", process.env.PROJECT_VERSION || "0.0.1");
|
|
39
|
+
logger = new DefaultLogger();
|
|
42
40
|
/** Active queues being processed */
|
|
43
41
|
activeQueues = new Set();
|
|
44
42
|
constructor() {
|
|
@@ -50,7 +48,7 @@ class WorkerTrigger extends runner_1.TriggerBase {
|
|
|
50
48
|
* Load nodes into the node map
|
|
51
49
|
*/
|
|
52
50
|
loadNodes() {
|
|
53
|
-
this.nodeMap.nodes = new
|
|
51
|
+
this.nodeMap.nodes = new NodeMap();
|
|
54
52
|
const nodeKeys = Object.keys(this.nodes);
|
|
55
53
|
for (const key of nodeKeys) {
|
|
56
54
|
this.nodeMap.nodes.addNode(key, this.nodes[key]);
|
|
@@ -68,6 +66,61 @@ class WorkerTrigger extends runner_1.TriggerBase {
|
|
|
68
66
|
async listen() {
|
|
69
67
|
const startTime = this.startCounter();
|
|
70
68
|
try {
|
|
69
|
+
// Tier 2 #6 follow-up · install the cross-process concurrency
|
|
70
|
+
// backend (NATS KV) when the operator opted in via
|
|
71
|
+
// `BLOK_CONCURRENCY_BACKEND=nats-kv`. Default null preserves the
|
|
72
|
+
// existing in-process behavior.
|
|
73
|
+
//
|
|
74
|
+
// PR 3 D1 — record install attempts via OTel counter.
|
|
75
|
+
try {
|
|
76
|
+
const backend = createConcurrencyBackend();
|
|
77
|
+
if (backend) {
|
|
78
|
+
await backend.connect();
|
|
79
|
+
RunTracker.getInstance().setConcurrencyBackend(backend);
|
|
80
|
+
ConcurrencyMetrics.getInstance().recordBackendInstall({
|
|
81
|
+
backend: backend.name,
|
|
82
|
+
status: "success",
|
|
83
|
+
});
|
|
84
|
+
this.logger.log(`[concurrency] backend installed: ${backend.name}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
ConcurrencyMetrics.getInstance().recordBackendInstall({
|
|
89
|
+
backend: "unknown",
|
|
90
|
+
status: "failure",
|
|
91
|
+
});
|
|
92
|
+
this.logger.error(`[concurrency] backend install failed: ${err instanceof Error ? err.message : String(err)}; falling back to in-process behavior`);
|
|
93
|
+
}
|
|
94
|
+
// Tier 2 quick-wins follow-up · install crash handlers + recover
|
|
95
|
+
// orphaned runs from a previous (dead) process. Idempotent + opt-out
|
|
96
|
+
// via `BLOK_CRASH_AUTOFLIP_DISABLED=1`.
|
|
97
|
+
try {
|
|
98
|
+
WorkerTrigger.installCrashHandlers(this.logger);
|
|
99
|
+
const orphaned = WorkerTrigger.recoverOrphanedRuns(undefined, this.logger);
|
|
100
|
+
if (orphaned > 0) {
|
|
101
|
+
this.logger.log(`[crash-autoflip] flipped ${orphaned} orphaned run(s) to crashed on boot`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
this.logger.error(`[crash-autoflip] setup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
106
|
+
}
|
|
107
|
+
// Tier 2 follow-up · start the periodic storage janitor.
|
|
108
|
+
// Idempotent (singleton); opt-out via `BLOK_JANITOR_DISABLED=1`.
|
|
109
|
+
try {
|
|
110
|
+
Janitor.getInstance(RunTracker.getInstance().getStore(), this.logger).start();
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
this.logger.error(`[janitor] setup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
114
|
+
}
|
|
115
|
+
// Tier 2 follow-up · install graceful shutdown handlers
|
|
116
|
+
// (SIGTERM / SIGINT). Idempotent; opt-out via
|
|
117
|
+
// `BLOK_GRACEFUL_SHUTDOWN_DISABLED=1`.
|
|
118
|
+
try {
|
|
119
|
+
WorkerTrigger.installShutdownHandlers(this, this.logger);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
this.logger.error(`[shutdown] setup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
123
|
+
}
|
|
71
124
|
// Connect to job backend
|
|
72
125
|
await this.adapter.connect();
|
|
73
126
|
this.logger.log(`Connected to ${this.adapter.provider} worker system`);
|
|
@@ -168,8 +221,8 @@ class WorkerTrigger extends runner_1.TriggerBase {
|
|
|
168
221
|
* Handle an incoming job
|
|
169
222
|
*/
|
|
170
223
|
async handleJob(job, workflow, config) {
|
|
171
|
-
const jobId = job.id || (
|
|
172
|
-
const defaultMeter =
|
|
224
|
+
const jobId = job.id || uuid();
|
|
225
|
+
const defaultMeter = metrics.getMeter("default");
|
|
173
226
|
const workerJobs = defaultMeter.createCounter("worker_jobs_processed", {
|
|
174
227
|
description: "Worker jobs processed",
|
|
175
228
|
});
|
|
@@ -201,7 +254,7 @@ class WorkerTrigger extends runner_1.TriggerBase {
|
|
|
201
254
|
// Store worker metadata in context
|
|
202
255
|
if (!ctx.vars)
|
|
203
256
|
ctx.vars = {};
|
|
204
|
-
ctx.vars
|
|
257
|
+
ctx.vars._worker_job = {
|
|
205
258
|
id: job.id,
|
|
206
259
|
queue: job.queue,
|
|
207
260
|
attempts: String(job.attempts),
|
|
@@ -227,7 +280,7 @@ class WorkerTrigger extends runner_1.TriggerBase {
|
|
|
227
280
|
span.setAttribute("queue", config.queue);
|
|
228
281
|
span.setAttribute("attempts", job.attempts);
|
|
229
282
|
span.setAttribute("elapsed_ms", end - start);
|
|
230
|
-
span.setStatus({ code:
|
|
283
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
231
284
|
// Record metrics
|
|
232
285
|
workerJobs.add(1, {
|
|
233
286
|
env: process.env.NODE_ENV,
|
|
@@ -241,15 +294,74 @@ class WorkerTrigger extends runner_1.TriggerBase {
|
|
|
241
294
|
}
|
|
242
295
|
catch (error) {
|
|
243
296
|
const errorMessage = error.message;
|
|
297
|
+
// Tier 2 #5 + #7 — deferred dispatch (delay/TTL/debounce).
|
|
298
|
+
// The run was deferred to a future timer; ACK without retry.
|
|
299
|
+
// The in-process scheduler owns the eventual dispatch, NOT
|
|
300
|
+
// the broker — re-queueing here would create a duplicate.
|
|
301
|
+
if (error instanceof DeferredDispatchSignal) {
|
|
302
|
+
span.setAttribute("success", false);
|
|
303
|
+
span.setAttribute("deferred", true);
|
|
304
|
+
span.setAttribute("deferred_status", error.info.status);
|
|
305
|
+
span.setStatus({ code: SpanStatusCode.OK, message: `deferred:${error.info.status}` });
|
|
306
|
+
this.logger.log(`[scheduling] job ${jobId} runId=${error.info.runId} status=${error.info.status} ` +
|
|
307
|
+
`scheduledAt=${error.info.scheduledAt} pingCount=${error.info.pingCount} → ACK (no requeue)`);
|
|
308
|
+
await job.complete();
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
// PR 1-5 polish — queue-mode TTL elapsed. The run is already
|
|
312
|
+
// flipped to `expired` (see TriggerBase queue branch); ACK
|
|
313
|
+
// without retry so the broker doesn't redeliver — the run
|
|
314
|
+
// will never succeed (timer won't re-fire). Distinct from
|
|
315
|
+
// the throttled NACK below.
|
|
316
|
+
if (error instanceof QueueExpiredError) {
|
|
317
|
+
span.setAttribute("success", false);
|
|
318
|
+
span.setAttribute("queue_expired", true);
|
|
319
|
+
span.setStatus({ code: SpanStatusCode.OK, message: "queue_expired" });
|
|
320
|
+
this.logger.log(`[concurrency] job ${jobId} runId=${error.info.runId} key='${error.info.concurrencyKey}' ` +
|
|
321
|
+
`queueExpiredAt=${error.info.queueExpiredAt} → ACK (no requeue, run expired)`);
|
|
322
|
+
await job.complete();
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
// Tier 2 #6 — concurrency gate denial. Distinct from a normal
|
|
326
|
+
// failure: NACK with redelivery so the broker re-queues the
|
|
327
|
+
// job with its existing back-off semantics. Doesn't count
|
|
328
|
+
// against the workflow's retry budget (different invariant).
|
|
329
|
+
// We always pass `willRetry: true` regardless of `job.attempts`
|
|
330
|
+
// because throttling is a transient resource state, not a
|
|
331
|
+
// permanent failure.
|
|
332
|
+
if (error instanceof ConcurrencyLimitError) {
|
|
333
|
+
span.setAttribute("success", false);
|
|
334
|
+
span.setAttribute("will_retry", true);
|
|
335
|
+
span.setAttribute("throttled", true);
|
|
336
|
+
span.setStatus({ code: SpanStatusCode.OK, message: "concurrency_limit_reached" });
|
|
337
|
+
this.logger.log(`[concurrency] job ${jobId} key='${error.info.concurrencyKey}' ` +
|
|
338
|
+
`limit=${error.info.concurrencyLimit} inFlight=${error.info.currentInFlight} → NACK + redelivery`);
|
|
339
|
+
workerRetries.add(1, {
|
|
340
|
+
env: process.env.NODE_ENV,
|
|
341
|
+
queue: config.queue,
|
|
342
|
+
workflow_name: this.configuration?.name || "unknown",
|
|
343
|
+
reason: "throttled",
|
|
344
|
+
});
|
|
345
|
+
await job.fail(error, true);
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
244
348
|
const shouldRetry = job.attempts < job.maxRetries;
|
|
245
349
|
// Set span error
|
|
246
350
|
span.setAttribute("success", false);
|
|
247
351
|
span.setAttribute("will_retry", shouldRetry);
|
|
248
352
|
span.recordException(error);
|
|
249
|
-
span.setStatus({ code:
|
|
353
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage });
|
|
250
354
|
if (shouldRetry) {
|
|
251
|
-
// Retry with exponential backoff
|
|
252
|
-
|
|
355
|
+
// Retry with exponential backoff. `config.delay` widened to
|
|
356
|
+
// `string | number | undefined` in Tier 2 #5 (duration strings).
|
|
357
|
+
// `calculateBackoff` only handles numbers; normalize via
|
|
358
|
+
// tryParseDuration. Fail-open to undefined → default backoff.
|
|
359
|
+
const delayMs = typeof config.delay === "number"
|
|
360
|
+
? config.delay
|
|
361
|
+
: typeof config.delay === "string"
|
|
362
|
+
? (tryParseDuration(config.delay) ?? undefined)
|
|
363
|
+
: undefined;
|
|
364
|
+
const backoffMs = this.calculateBackoff(job.attempts, delayMs);
|
|
253
365
|
workerRetries.add(1, {
|
|
254
366
|
env: process.env.NODE_ENV,
|
|
255
367
|
queue: config.queue,
|
|
@@ -301,11 +413,10 @@ class WorkerTrigger extends runner_1.TriggerBase {
|
|
|
301
413
|
calculateBackoff(attempt, baseDelay) {
|
|
302
414
|
const base = baseDelay ?? 1000;
|
|
303
415
|
const maxDelay = 30000; // 30 seconds max
|
|
304
|
-
const exponential = Math.min(base *
|
|
416
|
+
const exponential = Math.min(base * 2 ** attempt, maxDelay);
|
|
305
417
|
const jitter = Math.random() * exponential * 0.1; // 10% jitter
|
|
306
418
|
return Math.floor(exponential + jitter);
|
|
307
419
|
}
|
|
308
420
|
}
|
|
309
|
-
|
|
310
|
-
exports.default = WorkerTrigger;
|
|
311
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2VyVHJpZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Xb3JrZXJUcmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRzs7O0FBR0gseUNBT3NCO0FBRXRCLDRDQUErRTtBQUMvRSwrQkFBa0M7QUFxSGxDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFzQixhQUFjLFNBQVEsb0JBQVc7SUFDNUMsT0FBTyxHQUFrQixFQUFtQixDQUFDO0lBQ3BDLE1BQU0sR0FBRyxXQUFLLENBQUMsU0FBUyxDQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSx5QkFBeUIsRUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksT0FBTyxDQUN0QyxDQUFDO0lBQ2lCLE1BQU0sR0FBRyxJQUFJLHNCQUFhLEVBQUUsQ0FBQztJQUdoRCxvQ0FBb0M7SUFDMUIsWUFBWSxHQUFnQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBTWhEO1FBQ0MsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLGdCQUFPLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1os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O1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sZ0JBQWdCLENBQUMsT0FBZSxFQUFFLFNBQWtCO1FBQzdELE1BQU0sSUFBSSxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUM7UUFDL0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsaUJBQWlCO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsYUFBYTtRQUMvRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRDtBQWxWRCxzQ0FrVkM7QUFFRCxrQkFBZSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdvcmtlclRyaWdnZXIgLSBCYWNrZ3JvdW5kIGpvYiBwcm9jZXNzaW5nIGZvciBCbG9rIHdvcmtmbG93c1xuICpcbiAqIEV4dGVuZHMgVHJpZ2dlckJhc2UgdG8gc3VwcG9ydCBsb25nLXJ1bm5pbmcgYmFja2dyb3VuZCBqb2JzOlxuICogLSBDb25jdXJyZW5jeSBjb250cm9scyAobWF4IE4gY29uY3VycmVudCBqb2JzKVxuICogLSBSZXRyeSBsb2dpYyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAqIC0gSm9iIHRpbWVvdXRzXG4gKiAtIEpvYiBwcmlvcml0eSBhbmQgZGVsYXkgc2NoZWR1bGluZ1xuICogLSBEZWFkIGxldHRlciBxdWV1ZSBzdXBwb3J0XG4gKlxuICogUGF0dGVybjpcbiAqIDEuIGxvYWROb2RlcygpIC0gTG9hZCBhdmFpbGFibGUgbm9kZXMgaW50byBOb2RlTWFwXG4gKiAyLiBsb2FkV29ya2Zsb3dzKCkgLSBMb2FkIHdvcmtmbG93cyB3aXRoIHdvcmtlciB0cmlnZ2Vyc1xuICogMy4gbGlzdGVuKCkgLSBDb25uZWN0IHRvIGpvYiBiYWNrZW5kIGFuZCBzdGFydCBwcm9jZXNzaW5nXG4gKiA0LiBGb3IgZWFjaCBqb2I6XG4gKiAgICAtIENyZWF0ZSBjb250ZXh0IHdpdGggdGhpcy5jcmVhdGVDb250ZXh0KClcbiAqICAgIC0gUG9wdWxhdGUgY3R4LnJlcXVlc3Qgd2l0aCBqb2IgZGF0YVxuICogICAgLSBFeGVjdXRlIHdvcmtmbG93IHZpYSB0aGlzLnJ1bihjdHgpXG4gKiAgICAtIEFjayBvbiBzdWNjZXNzLCByZXRyeSBvciBETFEgb24gZmFpbHVyZVxuICovXG5cbmltcG9ydCB0eXBlIHsgSGVscGVyUmVzcG9uc2UsIFdvcmtlclRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9rL2hlbHBlclwiO1xuaW1wb3J0IHtcblx0RGVmYXVsdExvZ2dlcixcblx0dHlwZSBHbG9iYWxPcHRpb25zLFxuXHR0eXBlIEJsb2tTZXJ2aWNlLFxuXHROb2RlTWFwLFxuXHRUcmlnZ2VyQmFzZSxcblx0dHlwZSBUcmlnZ2VyUmVzcG9uc2UsXG59IGZyb20gXCJAYmxvay9ydW5uZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dCwgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGJsb2svc2hhcmVkXCI7XG5pbXBvcnQgeyB0eXBlIFNwYW4sIFNwYW5TdGF0dXNDb2RlLCBtZXRyaWNzLCB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuXG4vKipcbiAqIEpvYiByZWNlaXZlZCBmcm9tIHdvcmtlciBxdWV1ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckpvYiB7XG5cdC8qKiBVbmlxdWUgam9iIElEICovXG5cdGlkOiBzdHJpbmc7XG5cdC8qKiBKb2IgZGF0YSBwYXlsb2FkICovXG5cdGRhdGE6IHVua25vd247XG5cdC8qKiBKb2IgbWV0YWRhdGEgaGVhZGVycyAqL1xuXHRoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHQvKiogUXVldWUgbmFtZSB0aGlzIGpvYiBiZWxvbmdzIHRvICovXG5cdHF1ZXVlOiBzdHJpbmc7XG5cdC8qKiBKb2IgcHJpb3JpdHkgKGhpZ2hlciA9IG1vcmUgaW1wb3J0YW50KSAqL1xuXHRwcmlvcml0eTogbnVtYmVyO1xuXHQvKiogTnVtYmVyIG9mIGF0dGVtcHRzIG1hZGUgc28gZmFyICovXG5cdGF0dGVtcHRzOiBudW1iZXI7XG5cdC8qKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzICovXG5cdG1heFJldHJpZXM6IG51bWJlcjtcblx0LyoqIFRpbWVzdGFtcCB3aGVuIGpvYiB3YXMgY3JlYXRlZCAqL1xuXHRjcmVhdGVkQXQ6IERhdGU7XG5cdC8qKiBEZWxheSBiZWZvcmUgcHJvY2Vzc2luZyAobXMpICovXG5cdGRlbGF5PzogbnVtYmVyO1xuXHQvKiogSm9iIHRpbWVvdXQgKG1zKSAqL1xuXHR0aW1lb3V0PzogbnVtYmVyO1xuXHQvKiogT3JpZ2luYWwgcmF3IGpvYiBmcm9tIHByb3ZpZGVyICovXG5cdHJhdzogdW5rbm93bjtcblx0LyoqIE1hcmsgam9iIGFzIGNvbXBsZXRlZCAqL1xuXHRjb21wbGV0ZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0LyoqIE1hcmsgam9iIGFzIGZhaWxlZCAob3B0aW9uYWxseSByZXF1ZXVlKSAqL1xuXHRmYWlsOiAoZXJyb3I6IEVycm9yLCByZXF1ZXVlPzogYm9vbGVhbikgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBXb3JrZXIgYWRhcHRlciBpbnRlcmZhY2UgLSBpbXBsZW1lbnRlZCBieSBlYWNoIGpvYiBiYWNrZW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyQWRhcHRlciB7XG5cdC8qKiBQcm92aWRlciBuYW1lIChlLmcuLCBcImJ1bGxtcVwiLCBcImluLW1lbW9yeVwiKSAqL1xuXHRyZWFkb25seSBwcm92aWRlcjogc3RyaW5nO1xuXG5cdC8qKiBDb25uZWN0IHRvIHRoZSBqb2IgYmFja2VuZCAqL1xuXHRjb25uZWN0KCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqIERpc2Nvbm5lY3QgZnJvbSB0aGUgam9iIGJhY2tlbmQgKi9cblx0ZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBTdGFydCBwcm9jZXNzaW5nIGpvYnMgZnJvbSBhIHF1ZXVlXG5cdCAqIEBwYXJhbSBjb25maWcgV29ya2VyIHRyaWdnZXIgY29uZmlndXJhdGlvblxuXHQgKiBAcGFyYW0gaGFuZGxlciBDYWxsYmFjayBmb3IgZWFjaCBqb2Jcblx0ICovXG5cdHByb2Nlc3MoY29uZmlnOiBXb3JrZXJUcmlnZ2VyT3B0cywgaGFuZGxlcjogKGpvYjogV29ya2VySm9iKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogQWRkIGEgam9iIHRvIGEgcXVldWUgKGZvciBwcm9ncmFtbWF0aWMgZGlzcGF0Y2hpbmcpXG5cdCAqIEBwYXJhbSBxdWV1ZSBRdWV1ZSBuYW1lXG5cdCAqIEBwYXJhbSBkYXRhIEpvYiBwYXlsb2FkXG5cdCAqIEBwYXJhbSBvcHRzIEpvYiBvcHRpb25zXG5cdCAqL1xuXHRhZGRKb2IoXG5cdFx0cXVldWU6IHN0cmluZyxcblx0XHRkYXRhOiB1bmtub3duLFxuXHRcdG9wdHM/OiB7XG5cdFx0XHRwcmlvcml0eT86IG51bWJlcjtcblx0XHRcdGRlbGF5PzogbnVtYmVyO1xuXHRcdFx0cmV0cmllcz86IG51bWJlcjtcblx0XHRcdHRpbWVvdXQ/OiBudW1iZXI7XG5cdFx0XHRqb2JJZD86IHN0cmluZztcblx0XHR9LFxuXHQpOiBQcm9taXNlPHN0cmluZz47XG5cblx0LyoqIFN0b3AgcHJvY2Vzc2luZyBhIHNwZWNpZmljIHF1ZXVlICovXG5cdHN0b3BQcm9jZXNzaW5nKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKiBDaGVjayBpZiBjb25uZWN0ZWQgKi9cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbjtcblxuXHQvKiogSGVhbHRoIGNoZWNrICovXG5cdGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj47XG5cblx0LyoqIEdldCBxdWV1ZSBzdGF0cyAqL1xuXHRnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+O1xufVxuXG4vKipcbiAqIFF1ZXVlIHN0YXRpc3RpY3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJRdWV1ZVN0YXRzIHtcblx0LyoqIE51bWJlciBvZiBqb2JzIHdhaXRpbmcgdG8gYmUgcHJvY2Vzc2VkICovXG5cdHdhaXRpbmc6IG51bWJlcjtcblx0LyoqIE51bWJlciBvZiBqb2JzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgKi9cblx0YWN0aXZlOiBudW1iZXI7XG5cdC8qKiBOdW1iZXIgb2YgY29tcGxldGVkIGpvYnMgKi9cblx0Y29tcGxldGVkOiBudW1iZXI7XG5cdC8qKiBOdW1iZXIgb2YgZmFpbGVkIGpvYnMgKi9cblx0ZmFpbGVkOiBudW1iZXI7XG5cdC8qKiBOdW1iZXIgb2YgZGVsYXllZCBqb2JzICovXG5cdGRlbGF5ZWQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXb3JrZmxvdyBtb2RlbCB3aXRoIHdvcmtlciB0cmlnZ2VyIGNvbmZpZ3VyYXRpb25cbiAqL1xuaW50ZXJmYWNlIFdvcmtlcldvcmtmbG93TW9kZWwge1xuXHRwYXRoOiBzdHJpbmc7XG5cdGNvbmZpZzoge1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHR2ZXJzaW9uOiBzdHJpbmc7XG5cdFx0dHJpZ2dlcj86IHtcblx0XHRcdHdvcmtlcj86IFdvcmtlclRyaWdnZXJPcHRzO1xuXHRcdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0XHR9O1xuXHRcdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdH07XG59XG5cbi8qKlxuICogV29ya2VyVHJpZ2dlciAtIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHdvcmtlci1iYXNlZCB0cmlnZ2Vyc1xuICpcbiAqIFByb3ZpZGVzIGJhY2tncm91bmQgam9iIHByb2Nlc3Npbmcgd2l0aDpcbiAqIC0gQ29uZmlndXJhYmxlIGNvbmN1cnJlbmN5IHBlciBxdWV1ZVxuICogLSBBdXRvbWF0aWMgcmV0cmllcyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAqIC0gSm9iIHRpbWVvdXRzIHdpdGggYXV0b21hdGljIGZhaWx1cmVcbiAqIC0gUHJpb3JpdHktYmFzZWQgam9iIG9yZGVyaW5nXG4gKiAtIERlbGF5ZWQgam9iIHNjaGVkdWxpbmdcbiAqIC0gUXVldWUgc3RhdGlzdGljcyBhbmQgbW9uaXRvcmluZ1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV29ya2VyVHJpZ2dlciBleHRlbmRzIFRyaWdnZXJCYXNlIHtcblx0cHJvdGVjdGVkIG5vZGVNYXA6IEdsb2JhbE9wdGlvbnMgPSB7fSBhcyBHbG9iYWxPcHRpb25zO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhY2VyID0gdHJhY2UuZ2V0VHJhY2VyKFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSB8fCBcInRyaWdnZXItd29ya2VyLXdvcmtmbG93XCIsXG5cdFx0cHJvY2Vzcy5lbnYuUFJPSkVDVF9WRVJTSU9OIHx8IFwiMC4wLjFcIixcblx0KTtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBEZWZhdWx0TG9nZ2VyKCk7XG5cdHByb3RlY3RlZCBhYnN0cmFjdCBhZGFwdGVyOiBXb3JrZXJBZGFwdGVyO1xuXG5cdC8qKiBBY3RpdmUgcXVldWVzIGJlaW5nIHByb2Nlc3NlZCAqL1xuXHRwcm90ZWN0ZWQgYWN0aXZlUXVldWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuXHQvLyBTdWJjbGFzc2VzIHByb3ZpZGUgdGhlc2Vcblx0cHJvdGVjdGVkIGFic3RyYWN0IG5vZGVzOiBSZWNvcmQ8c3RyaW5nLCBCbG9rU2VydmljZTx1bmtub3duPj47XG5cdHByb3RlY3RlZCBhYnN0cmFjdCB3b3JrZmxvd3M6IFJlY29yZDxzdHJpbmcsIEhlbHBlclJlc3BvbnNlPjtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubG9hZE5vZGVzKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBub2RlcyBpbnRvIHRoZSBub2RlIG1hcFxuXHQgKi9cblx0bG9hZE5vZGVzKCk6IHZvaWQge1xuXHRcdHRoaXMubm9kZU1hcC5ub2RlcyA9IG5ldyBOb2RlTWFwKCk7XG5cdFx0Y29uc3Qgbm9kZUtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBub2RlS2V5cykge1xuXHRcdFx0dGhpcy5ub2RlTWFwLm5vZGVzLmFkZE5vZGUoa2V5LCB0aGlzLm5vZGVzW2tleV0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIHdvcmtmbG93cyBpbnRvIHRoZSB3b3JrZmxvdyBtYXBcblx0ICovXG5cdGxvYWRXb3JrZmxvd3MoKTogdm9pZCB7XG5cdFx0dGhpcy5ub2RlTWFwLndvcmtmbG93cyA9IHRoaXMud29ya2Zsb3dzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN0YXJ0IHRoZSB3b3JrZXIgcHJvY2Vzc29yIC0gbWFpbiBlbnRyeSBwb2ludFxuXHQgKi9cblx0YXN5bmMgbGlzdGVuKCk6IFByb21pc2U8bnVtYmVyPiB7XG5cdFx0Y29uc3Qgc3RhcnRUaW1lID0gdGhpcy5zdGFydENvdW50ZXIoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBDb25uZWN0IHRvIGpvYiBiYWNrZW5kXG5cdFx0XHRhd2FpdCB0aGlzLmFkYXB0ZXIuY29ubmVjdCgpO1xuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBDb25uZWN0ZWQgdG8gJHt0aGlzLmFkYXB0ZXIucHJvdmlkZXJ9IHdvcmtlciBzeXN0ZW1gKTtcblxuXHRcdFx0Ly8gUmVnaXN0ZXIgaGVhbHRoIGRlcGVuZGVuY3lcblx0XHRcdHRoaXMucmVnaXN0ZXJIZWFsdGhEZXBlbmRlbmN5KGB3b3JrZXItJHt0aGlzLmFkYXB0ZXIucHJvdmlkZXJ9YCwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBoZWFsdGh5ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmhlYWx0aENoZWNrKCk7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0c3RhdHVzOiBoZWFsdGh5ID8gKFwiaGVhbHRoeVwiIGFzIGNvbnN0KSA6IChcInVuaGVhbHRoeVwiIGFzIGNvbnN0KSxcblx0XHRcdFx0XHRsYXN0Q2hlY2tlZDogRGF0ZS5ub3coKSxcblx0XHRcdFx0XHRtZXNzYWdlOiBoZWFsdGh5ID8gXCJDb25uZWN0ZWRcIiA6IFwiQ29ubmVjdGlvbiBsb3N0XCIsXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gRmluZCBhbGwgd29ya2Zsb3dzIHdpdGggd29ya2VyIHRyaWdnZXJzXG5cdFx0XHRjb25zdCB3b3JrZXJXb3JrZmxvd3MgPSB0aGlzLmdldFdvcmtlcldvcmtmbG93cygpO1xuXG5cdFx0XHRpZiAod29ya2VyV29ya2Zsb3dzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXCJObyB3b3JrZmxvd3Mgd2l0aCB3b3JrZXIgdHJpZ2dlcnMgZm91bmRcIik7XG5cdFx0XHRcdHJldHVybiB0aGlzLmVuZENvdW50ZXIoc3RhcnRUaW1lKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgcHJvY2Vzc2luZyBlYWNoIHF1ZXVlXG5cdFx0XHRmb3IgKGNvbnN0IHdvcmtmbG93IG9mIHdvcmtlcldvcmtmbG93cykge1xuXHRcdFx0XHRjb25zdCBjb25maWcgPSB3b3JrZmxvdy5jb25maWcudHJpZ2dlcj8ud29ya2VyIGFzIFdvcmtlclRyaWdnZXJPcHRzO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0YFN0YXJ0aW5nIHdvcmtlciBmb3IgcXVldWU6ICR7Y29uZmlnLnF1ZXVlfSAoY29uY3VycmVuY3k9JHtjb25maWcuY29uY3VycmVuY3l9LCByZXRyaWVzPSR7Y29uZmlnLnJldHJpZXN9KWAsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0dGhpcy5hY3RpdmVRdWV1ZXMuYWRkKGNvbmZpZy5xdWV1ZSk7XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5hZGFwdGVyLnByb2Nlc3MoY29uZmlnLCBhc3luYyAoam9iKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5oYW5kbGVKb2Ioam9iLCB3b3JrZmxvdywgY29uZmlnKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgV29ya2VyIHRyaWdnZXIgc3RhcnRlZC4gUHJvY2Vzc2luZyAke3dvcmtlcldvcmtmbG93cy5sZW5ndGh9IHF1ZXVlKHMpYCk7XG5cblx0XHRcdC8vIEVuYWJsZSBITVIgaW4gZGV2ZWxvcG1lbnQgbW9kZVxuXHRcdFx0aWYgKHByb2Nlc3MuZW52LkJMT0tfSE1SID09PSBcInRydWVcIiB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZW5hYmxlSG90UmVsb2FkKCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmVuZENvdW50ZXIoc3RhcnRUaW1lKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzdGFydCB3b3JrZXIgdHJpZ2dlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3RvcCBhbGwgd29ya2VycyBhbmQgZGlzY29ubmVjdFxuXHQgKi9cblx0YXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRmb3IgKGNvbnN0IHF1ZXVlIG9mIHRoaXMuYWN0aXZlUXVldWVzKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmFkYXB0ZXIuc3RvcFByb2Nlc3NpbmcocXVldWUpO1xuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBTdG9wcGVkIHByb2Nlc3NpbmcgcXVldWU6ICR7cXVldWV9YCk7XG5cdFx0fVxuXHRcdHRoaXMuYWN0aXZlUXVldWVzLmNsZWFyKCk7XG5cdFx0YXdhaXQgdGhpcy5hZGFwdGVyLmRpc2Nvbm5lY3QoKTtcblx0XHR0aGlzLmRlc3Ryb3lNb25pdG9yaW5nKCk7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiV29ya2VyIHRyaWdnZXIgc3RvcHBlZFwiKTtcblx0fVxuXG5cdHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBvbkhtcldvcmtmbG93Q2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMubG9nZ2VyLmxvZyhcIltITVJdIFdvcmtlciB3b3JrZmxvdyBjaGFuZ2VkLCByZWxvYWRpbmcuLi5cIik7XG5cdFx0YXdhaXQgdGhpcy53YWl0Rm9ySW5GbGlnaHRSZXF1ZXN0cygpO1xuXHRcdGF3YWl0IHRoaXMuc3RvcCgpO1xuXHRcdHRoaXMubG9hZFdvcmtmbG93cygpO1xuXHRcdGF3YWl0IHRoaXMubGlzdGVuKCk7XG5cdH1cblxuXHQvKipcblx0ICogRGlzcGF0Y2ggYSBqb2IgdG8gYSB3b3JrZXIgcXVldWVcblx0ICovXG5cdGFzeW5jIGRpc3BhdGNoKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0ZGF0YTogdW5rbm93bixcblx0XHRvcHRzPzoge1xuXHRcdFx0cHJpb3JpdHk/OiBudW1iZXI7XG5cdFx0XHRkZWxheT86IG51bWJlcjtcblx0XHRcdHJldHJpZXM/OiBudW1iZXI7XG5cdFx0XHR0aW1lb3V0PzogbnVtYmVyO1xuXHRcdFx0am9iSWQ/OiBzdHJpbmc7XG5cdFx0fSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5hZGFwdGVyLmFkZEpvYihxdWV1ZSwgZGF0YSwgb3B0cyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHN0YXRpc3RpY3MgZm9yIGEgcXVldWVcblx0ICovXG5cdGFzeW5jIGdldFF1ZXVlU3RhdHMocXVldWU6IHN0cmluZyk6IFByb21pc2U8V29ya2VyUXVldWVTdGF0cz4ge1xuXHRcdHJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0UXVldWVTdGF0cyhxdWV1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGxpc3Qgb2YgYWN0aXZlIHF1ZXVlc1xuXHQgKi9cblx0Z2V0QWN0aXZlUXVldWVzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmFjdGl2ZVF1ZXVlcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFsbCB3b3JrZmxvd3MgdGhhdCBoYXZlIHdvcmtlciB0cmlnZ2Vyc1xuXHQgKi9cblx0cHJvdGVjdGVkIGdldFdvcmtlcldvcmtmbG93cygpOiBXb3JrZXJXb3JrZmxvd01vZGVsW10ge1xuXHRcdGNvbnN0IHdvcmtmbG93czogV29ya2VyV29ya2Zsb3dNb2RlbFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IFtwYXRoLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ub2RlTWFwLndvcmtmbG93cyB8fCB7fSkpIHtcblx0XHRcdGNvbnN0IHdvcmtmbG93Q29uZmlnID0gKHdvcmtmbG93IGFzIHVua25vd24gYXMgeyBfY29uZmlnOiBXb3JrZXJXb3JrZmxvd01vZGVsW1wiY29uZmlnXCJdIH0pLl9jb25maWc7XG5cblx0XHRcdGlmICh3b3JrZmxvd0NvbmZpZz8udHJpZ2dlcikge1xuXHRcdFx0XHRjb25zdCB0cmlnZ2VyVHlwZSA9IE9iamVjdC5rZXlzKHdvcmtmbG93Q29uZmlnLnRyaWdnZXIpWzBdO1xuXG5cdFx0XHRcdGlmICh0cmlnZ2VyVHlwZSA9PT0gXCJ3b3JrZXJcIiAmJiB3b3JrZmxvd0NvbmZpZy50cmlnZ2VyLndvcmtlcikge1xuXHRcdFx0XHRcdHdvcmtmbG93cy5wdXNoKHtcblx0XHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0XHRjb25maWc6IHdvcmtmbG93Q29uZmlnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdvcmtmbG93cztcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgYW4gaW5jb21pbmcgam9iXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlSm9iKGpvYjogV29ya2VySm9iLCB3b3JrZmxvdzogV29ya2VyV29ya2Zsb3dNb2RlbCwgY29uZmlnOiBXb3JrZXJUcmlnZ2VyT3B0cyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGpvYklkID0gam9iLmlkIHx8IHV1aWQoKTtcblx0XHRjb25zdCBkZWZhdWx0TWV0ZXIgPSBtZXRyaWNzLmdldE1ldGVyKFwiZGVmYXVsdFwiKTtcblx0XHRjb25zdCB3b3JrZXJKb2JzID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJ3b3JrZXJfam9ic19wcm9jZXNzZWRcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiV29ya2VyIGpvYnMgcHJvY2Vzc2VkXCIsXG5cdFx0fSk7XG5cdFx0Y29uc3Qgd29ya2VyRXJyb3JzID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJ3b3JrZXJfam9ic19mYWlsZWRcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiV29ya2VyIGpvYiBmYWlsdXJlc1wiLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHdvcmtlclJldHJpZXMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcIndvcmtlcl9qb2JzX3JldHJpZWRcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiV29ya2VyIGpvYiByZXRyaWVzXCIsXG5cdFx0fSk7XG5cblx0XHRhd2FpdCB0aGlzLnRyYWNlci5zdGFydEFjdGl2ZVNwYW4oYHdvcmtlcjoke2NvbmZpZy5xdWV1ZX1gLCBhc3luYyAoc3BhbjogU3BhbikgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuXHRcdFx0XHQvLyBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgd29ya2Zsb3dcblx0XHRcdFx0YXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmluaXQod29ya2Zsb3cucGF0aCwgdGhpcy5ub2RlTWFwKTtcblxuXHRcdFx0XHQvLyBDcmVhdGUgY29udGV4dFxuXHRcdFx0XHRjb25zdCBjdHg6IENvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkLCB3b3JrZmxvdy5wYXRoLCBqb2JJZCk7XG5cblx0XHRcdFx0Ly8gUG9wdWxhdGUgcmVxdWVzdCB3aXRoIGpvYiBkYXRhXG5cdFx0XHRcdGN0eC5yZXF1ZXN0ID0ge1xuXHRcdFx0XHRcdGJvZHk6IGpvYi5kYXRhLFxuXHRcdFx0XHRcdGhlYWRlcnM6IGpvYi5oZWFkZXJzLFxuXHRcdFx0XHRcdHF1ZXJ5OiB7fSxcblx0XHRcdFx0XHRwYXJhbXM6IHtcblx0XHRcdFx0XHRcdHF1ZXVlOiBqb2IucXVldWUsXG5cdFx0XHRcdFx0XHRqb2JJZDogam9iLmlkLFxuXHRcdFx0XHRcdFx0YXR0ZW1wdDogU3RyaW5nKGpvYi5hdHRlbXB0cyksXG5cdFx0XHRcdFx0XHRwcmlvcml0eTogU3RyaW5nKGpvYi5wcmlvcml0eSksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSBhcyB1bmtub3duIGFzIFJlcXVlc3RDb250ZXh0O1xuXG5cdFx0XHRcdC8vIFN0b3JlIHdvcmtlciBtZXRhZGF0YSBpbiBjb250ZXh0XG5cdFx0XHRcdGlmICghY3R4LnZhcnMpIGN0eC52YXJzID0ge307XG5cdFx0XHRcdGN0eC52YXJzW1wiX3dvcmtlcl9qb2JcIl0gPSB7XG5cdFx0XHRcdFx0aWQ6IGpvYi5pZCxcblx0XHRcdFx0XHRxdWV1ZTogam9iLnF1ZXVlLFxuXHRcdFx0XHRcdGF0dGVtcHRzOiBTdHJpbmcoam9iLmF0dGVtcHRzKSxcblx0XHRcdFx0XHRtYXhSZXRyaWVzOiBTdHJpbmcoam9iLm1heFJldHJpZXMpLFxuXHRcdFx0XHRcdHByaW9yaXR5OiBTdHJpbmcoam9iLnByaW9yaXR5KSxcblx0XHRcdFx0XHRjcmVhdGVkQXQ6IGpvYi5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSxcblx0XHRcdFx0XHRkZWxheTogU3RyaW5nKGpvYi5kZWxheSA/PyAwKSxcblx0XHRcdFx0XHR0aW1lb3V0OiBTdHJpbmcoam9iLnRpbWVvdXQgPz8gMCksXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y3R4LmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0YFByb2Nlc3Npbmcgam9iICR7am9iSWR9IGZyb20gJHtjb25maWcucXVldWV9IChhdHRlbXB0ICR7am9iLmF0dGVtcHRzICsgMX0vJHtqb2IubWF4UmV0cmllcyArIDF9KWAsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSB3b3JrZmxvdyB3aXRoIHRpbWVvdXQgaWYgY29uZmlndXJlZFxuXHRcdFx0XHRsZXQgcmVzcG9uc2U6IFRyaWdnZXJSZXNwb25zZTtcblx0XHRcdFx0aWYgKGNvbmZpZy50aW1lb3V0ICYmIGNvbmZpZy50aW1lb3V0ID4gMCkge1xuXHRcdFx0XHRcdHJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjdXRlV2l0aFRpbWVvdXQoY3R4LCBjb25maWcudGltZW91dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJ1bihjdHgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0Ly8gU2V0IHNwYW4gYXR0cmlidXRlc1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgdHJ1ZSk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiam9iX2lkXCIsIGpvYklkKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJxdWV1ZVwiLCBjb25maWcucXVldWUpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImF0dGVtcHRzXCIsIGpvYi5hdHRlbXB0cyk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiZWxhcHNlZF9tc1wiLCBlbmQgLSBzdGFydCk7XG5cdFx0XHRcdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuT0sgfSk7XG5cblx0XHRcdFx0Ly8gUmVjb3JkIG1ldHJpY3Ncblx0XHRcdFx0d29ya2VySm9icy5hZGQoMSwge1xuXHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24ubmFtZSxcblx0XHRcdFx0XHRzdWNjZXNzOiBcInRydWVcIixcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Y3R4LmxvZ2dlci5sb2coYEpvYiBjb21wbGV0ZWQgaW4gJHsoZW5kIC0gc3RhcnQpLnRvRml4ZWQoMil9bXM6ICR7am9iSWR9YCk7XG5cblx0XHRcdFx0Ly8gTWFyayBqb2IgYXMgY29tcGxldGVkXG5cdFx0XHRcdGF3YWl0IGpvYi5jb21wbGV0ZSgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlO1xuXHRcdFx0XHRjb25zdCBzaG91bGRSZXRyeSA9IGpvYi5hdHRlbXB0cyA8IGpvYi5tYXhSZXRyaWVzO1xuXG5cdFx0XHRcdC8vIFNldCBzcGFuIGVycm9yXG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwid2lsbF9yZXRyeVwiLCBzaG91bGRSZXRyeSk7XG5cdFx0XHRcdHNwYW4ucmVjb3JkRXhjZXB0aW9uKGVycm9yIGFzIEVycm9yKTtcblx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUiwgbWVzc2FnZTogZXJyb3JNZXNzYWdlIH0pO1xuXG5cdFx0XHRcdGlmIChzaG91bGRSZXRyeSkge1xuXHRcdFx0XHRcdC8vIFJldHJ5IHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuXHRcdFx0XHRcdGNvbnN0IGJhY2tvZmZNcyA9IHRoaXMuY2FsY3VsYXRlQmFja29mZihqb2IuYXR0ZW1wdHMsIGNvbmZpZy5kZWxheSk7XG5cdFx0XHRcdFx0d29ya2VyUmV0cmllcy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdHF1ZXVlOiBjb25maWcucXVldWUsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdFx0XHRhdHRlbXB0OiBTdHJpbmcoam9iLmF0dGVtcHRzICsgMSksXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XHRcdGBKb2IgJHtqb2JJZH0gZmFpbGVkIChhdHRlbXB0ICR7am9iLmF0dGVtcHRzICsgMX0vJHtqb2IubWF4UmV0cmllcyArIDF9KSwgcmV0cnlpbmcgaW4gJHtiYWNrb2ZmTXN9bXM6ICR7ZXJyb3JNZXNzYWdlfWAsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5mYWlsKGVycm9yIGFzIEVycm9yLCB0cnVlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBNYXggcmV0cmllcyBleGhhdXN0ZWQgLSBzZW5kIHRvIERMUVxuXHRcdFx0XHRcdHdvcmtlckVycm9ycy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdHF1ZXVlOiBjb25maWcucXVldWUsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XHRcdGBKb2IgJHtqb2JJZH0gcGVybWFuZW50bHkgZmFpbGVkIGFmdGVyICR7am9iLmF0dGVtcHRzICsgMX0gYXR0ZW1wdHM6ICR7ZXJyb3JNZXNzYWdlfWAsXG5cdFx0XHRcdFx0XHQoZXJyb3IgYXMgRXJyb3IpLnN0YWNrLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRhd2FpdCBqb2IuZmFpbChlcnJvciBhcyBFcnJvciwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRzcGFuLmVuZCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgd29ya2Zsb3cgd2l0aCBhIHRpbWVvdXRcblx0ICovXG5cdHByb3RlY3RlZCBhc3luYyBleGVjdXRlV2l0aFRpbWVvdXQoY3R4OiBDb250ZXh0LCB0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8VHJpZ2dlclJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPFRyaWdnZXJSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0cmVqZWN0KG5ldyBFcnJvcihgSm9iIHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXRNc31tc2ApKTtcblx0XHRcdH0sIHRpbWVvdXRNcyk7XG5cblx0XHRcdHRoaXMucnVuKGN0eClcblx0XHRcdFx0LnRoZW4oKHJlc3VsdCkgPT4ge1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHRcdFx0cmVzb2x2ZShyZXN1bHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGUgZXhwb25lbnRpYWwgYmFja29mZiBkZWxheVxuXHQgKiBGb3JtdWxhOiBtaW4oYmFzZURlbGF5ICogMl5hdHRlbXB0LCAzMDAwMCkgKyBqaXR0ZXJcblx0ICovXG5cdHByb3RlY3RlZCBjYWxjdWxhdGVCYWNrb2ZmKGF0dGVtcHQ6IG51bWJlciwgYmFzZURlbGF5PzogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRjb25zdCBiYXNlID0gYmFzZURlbGF5ID8/IDEwMDA7XG5cdFx0Y29uc3QgbWF4RGVsYXkgPSAzMDAwMDsgLy8gMzAgc2Vjb25kcyBtYXhcblx0XHRjb25zdCBleHBvbmVudGlhbCA9IE1hdGgubWluKGJhc2UgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSwgbWF4RGVsYXkpO1xuXHRcdGNvbnN0IGppdHRlciA9IE1hdGgucmFuZG9tKCkgKiBleHBvbmVudGlhbCAqIDAuMTsgLy8gMTAlIGppdHRlclxuXHRcdHJldHVybiBNYXRoLmZsb29yKGV4cG9uZW50aWFsICsgaml0dGVyKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBXb3JrZXJUcmlnZ2VyO1xuIl19
|
|
421
|
+
export default WorkerTrigger;
|
|
422
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2VyVHJpZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Xb3JrZXJUcmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUErQyxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9GLE9BQU8sRUFFTixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixhQUFhLEVBQ2Isc0JBQXNCLEVBRXRCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsVUFBVSxFQUNWLFdBQVcsRUFFWCx3QkFBd0IsR0FDeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQWEsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQXFIbEM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sT0FBZ0IsYUFBYyxTQUFRLFdBQVc7SUFDNUMsT0FBTyxHQUFrQixFQUFtQixDQUFDO0lBQ3BDLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSx5QkFBeUIsRUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksT0FBTyxDQUN0QyxDQUFDO0lBQ2lCLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBR2hELG9DQUFvQztJQUMxQixZQUFZLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFNaEQ7UUFDQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUztRQUNSLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElB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UyxJQUFJLElBQUksQ0FBQztRQUMvQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxpQkFBaUI7UUFDekMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLGFBQWE7UUFDL0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0Q7QUFFRCxlQUFlLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV29ya2VyVHJpZ2dlciAtIEJhY2tncm91bmQgam9iIHByb2Nlc3NpbmcgZm9yIEJsb2sgd29ya2Zsb3dzXG4gKlxuICogRXh0ZW5kcyBUcmlnZ2VyQmFzZSB0byBzdXBwb3J0IGxvbmctcnVubmluZyBiYWNrZ3JvdW5kIGpvYnM6XG4gKiAtIENvbmN1cnJlbmN5IGNvbnRyb2xzIChtYXggTiBjb25jdXJyZW50IGpvYnMpXG4gKiAtIFJldHJ5IGxvZ2ljIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICogLSBKb2IgdGltZW91dHNcbiAqIC0gSm9iIHByaW9yaXR5IGFuZCBkZWxheSBzY2hlZHVsaW5nXG4gKiAtIERlYWQgbGV0dGVyIHF1ZXVlIHN1cHBvcnRcbiAqXG4gKiBQYXR0ZXJuOlxuICogMS4gbG9hZE5vZGVzKCkgLSBMb2FkIGF2YWlsYWJsZSBub2RlcyBpbnRvIE5vZGVNYXBcbiAqIDIuIGxvYWRXb3JrZmxvd3MoKSAtIExvYWQgd29ya2Zsb3dzIHdpdGggd29ya2VyIHRyaWdnZXJzXG4gKiAzLiBsaXN0ZW4oKSAtIENvbm5lY3QgdG8gam9iIGJhY2tlbmQgYW5kIHN0YXJ0IHByb2Nlc3NpbmdcbiAqIDQuIEZvciBlYWNoIGpvYjpcbiAqICAgIC0gQ3JlYXRlIGNvbnRleHQgd2l0aCB0aGlzLmNyZWF0ZUNvbnRleHQoKVxuICogICAgLSBQb3B1bGF0ZSBjdHgucmVxdWVzdCB3aXRoIGpvYiBkYXRhXG4gKiAgICAtIEV4ZWN1dGUgd29ya2Zsb3cgdmlhIHRoaXMucnVuKGN0eClcbiAqICAgIC0gQWNrIG9uIHN1Y2Nlc3MsIHJldHJ5IG9yIERMUSBvbiBmYWlsdXJlXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBIZWxwZXJSZXNwb25zZSwgdHlwZSBXb3JrZXJUcmlnZ2VyT3B0cywgdHJ5UGFyc2VEdXJhdGlvbiB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHtcblx0dHlwZSBCbG9rU2VydmljZSxcblx0Q29uY3VycmVuY3lMaW1pdEVycm9yLFxuXHRRdWV1ZUV4cGlyZWRFcnJvcixcblx0Q29uY3VycmVuY3lNZXRyaWNzLFxuXHREZWZhdWx0TG9nZ2VyLFxuXHREZWZlcnJlZERpc3BhdGNoU2lnbmFsLFxuXHR0eXBlIEdsb2JhbE9wdGlvbnMsXG5cdEphbml0b3IsXG5cdE5vZGVNYXAsXG5cdFJ1blRyYWNrZXIsXG5cdFRyaWdnZXJCYXNlLFxuXHR0eXBlIFRyaWdnZXJSZXNwb25zZSxcblx0Y3JlYXRlQ29uY3VycmVuY3lCYWNrZW5kLFxufSBmcm9tIFwiQGJsb2tqcy9ydW5uZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dCwgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGJsb2tqcy9zaGFyZWRcIjtcbmltcG9ydCB7IHR5cGUgU3BhbiwgU3BhblN0YXR1c0NvZGUsIG1ldHJpY3MsIHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5cbi8qKlxuICogSm9iIHJlY2VpdmVkIGZyb20gd29ya2VyIHF1ZXVlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VySm9iIHtcblx0LyoqIFVuaXF1ZSBqb2IgSUQgKi9cblx0aWQ6IHN0cmluZztcblx0LyoqIEpvYiBkYXRhIHBheWxvYWQgKi9cblx0ZGF0YTogdW5rbm93bjtcblx0LyoqIEpvYiBtZXRhZGF0YSBoZWFkZXJzICovXG5cdGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdC8qKiBRdWV1ZSBuYW1lIHRoaXMgam9iIGJlbG9uZ3MgdG8gKi9cblx0cXVldWU6IHN0cmluZztcblx0LyoqIEpvYiBwcmlvcml0eSAoaGlnaGVyID0gbW9yZSBpbXBvcnRhbnQpICovXG5cdHByaW9yaXR5OiBudW1iZXI7XG5cdC8qKiBOdW1iZXIgb2YgYXR0ZW1wdHMgbWFkZSBzbyBmYXIgKi9cblx0YXR0ZW1wdHM6IG51bWJlcjtcblx0LyoqIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgKi9cblx0bWF4UmV0cmllczogbnVtYmVyO1xuXHQvKiogVGltZXN0YW1wIHdoZW4gam9iIHdhcyBjcmVhdGVkICovXG5cdGNyZWF0ZWRBdDogRGF0ZTtcblx0LyoqIERlbGF5IGJlZm9yZSBwcm9jZXNzaW5nIChtcykgKi9cblx0ZGVsYXk/OiBudW1iZXI7XG5cdC8qKiBKb2IgdGltZW91dCAobXMpICovXG5cdHRpbWVvdXQ/OiBudW1iZXI7XG5cdC8qKiBPcmlnaW5hbCByYXcgam9iIGZyb20gcHJvdmlkZXIgKi9cblx0cmF3OiB1bmtub3duO1xuXHQvKiogTWFyayBqb2IgYXMgY29tcGxldGVkICovXG5cdGNvbXBsZXRlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogTWFyayBqb2IgYXMgZmFpbGVkIChvcHRpb25hbGx5IHJlcXVldWUpICovXG5cdGZhaWw6IChlcnJvcjogRXJyb3IsIHJlcXVldWU/OiBib29sZWFuKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFdvcmtlciBhZGFwdGVyIGludGVyZmFjZSAtIGltcGxlbWVudGVkIGJ5IGVhY2ggam9iIGJhY2tlbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJBZGFwdGVyIHtcblx0LyoqIFByb3ZpZGVyIG5hbWUgKGUuZy4sIFwiYnVsbG1xXCIsIFwiaW4tbWVtb3J5XCIpICovXG5cdHJlYWRvbmx5IHByb3ZpZGVyOiBzdHJpbmc7XG5cblx0LyoqIENvbm5lY3QgdG8gdGhlIGpvYiBiYWNrZW5kICovXG5cdGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKiogRGlzY29ubmVjdCBmcm9tIHRoZSBqb2IgYmFja2VuZCAqL1xuXHRkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIFN0YXJ0IHByb2Nlc3Npbmcgam9icyBmcm9tIGEgcXVldWVcblx0ICogQHBhcmFtIGNvbmZpZyBXb3JrZXIgdHJpZ2dlciBjb25maWd1cmF0aW9uXG5cdCAqIEBwYXJhbSBoYW5kbGVyIENhbGxiYWNrIGZvciBlYWNoIGpvYlxuXHQgKi9cblx0cHJvY2Vzcyhjb25maWc6IFdvcmtlclRyaWdnZXJPcHRzLCBoYW5kbGVyOiAoam9iOiBXb3JrZXJKb2IpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBBZGQgYSBqb2IgdG8gYSBxdWV1ZSAoZm9yIHByb2dyYW1tYXRpYyBkaXNwYXRjaGluZylcblx0ICogQHBhcmFtIHF1ZXVlIFF1ZXVlIG5hbWVcblx0ICogQHBhcmFtIGRhdGEgSm9iIHBheWxvYWRcblx0ICogQHBhcmFtIG9wdHMgSm9iIG9wdGlvbnNcblx0ICovXG5cdGFkZEpvYihcblx0XHRxdWV1ZTogc3RyaW5nLFxuXHRcdGRhdGE6IHVua25vd24sXG5cdFx0b3B0cz86IHtcblx0XHRcdHByaW9yaXR5PzogbnVtYmVyO1xuXHRcdFx0ZGVsYXk/OiBudW1iZXI7XG5cdFx0XHRyZXRyaWVzPzogbnVtYmVyO1xuXHRcdFx0dGltZW91dD86IG51bWJlcjtcblx0XHRcdGpvYklkPzogc3RyaW5nO1xuXHRcdH0sXG5cdCk6IFByb21pc2U8c3RyaW5nPjtcblxuXHQvKiogU3RvcCBwcm9jZXNzaW5nIGEgc3BlY2lmaWMgcXVldWUgKi9cblx0c3RvcFByb2Nlc3NpbmcocXVldWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqIENoZWNrIGlmIGNvbm5lY3RlZCAqL1xuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuO1xuXG5cdC8qKiBIZWFsdGggY2hlY2sgKi9cblx0aGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPjtcblxuXHQvKiogR2V0IHF1ZXVlIHN0YXRzICovXG5cdGdldFF1ZXVlU3RhdHMocXVldWU6IHN0cmluZyk6IFByb21pc2U8V29ya2VyUXVldWVTdGF0cz47XG59XG5cbi8qKlxuICogUXVldWUgc3RhdGlzdGljc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlclF1ZXVlU3RhdHMge1xuXHQvKiogTnVtYmVyIG9mIGpvYnMgd2FpdGluZyB0byBiZSBwcm9jZXNzZWQgKi9cblx0d2FpdGluZzogbnVtYmVyO1xuXHQvKiogTnVtYmVyIG9mIGpvYnMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCAqL1xuXHRhY3RpdmU6IG51bWJlcjtcblx0LyoqIE51bWJlciBvZiBjb21wbGV0ZWQgam9icyAqL1xuXHRjb21wbGV0ZWQ6IG51bWJlcjtcblx0LyoqIE51bWJlciBvZiBmYWlsZWQgam9icyAqL1xuXHRmYWlsZWQ6IG51bWJlcjtcblx0LyoqIE51bWJlciBvZiBkZWxheWVkIGpvYnMgKi9cblx0ZGVsYXllZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdvcmtmbG93IG1vZGVsIHdpdGggd29ya2VyIHRyaWdnZXIgY29uZmlndXJhdGlvblxuICovXG5pbnRlcmZhY2UgV29ya2VyV29ya2Zsb3dNb2RlbCB7XG5cdHBhdGg6IHN0cmluZztcblx0Y29uZmlnOiB7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdHZlcnNpb246IHN0cmluZztcblx0XHR0cmlnZ2VyPzoge1xuXHRcdFx0d29ya2VyPzogV29ya2VyVHJpZ2dlck9wdHM7XG5cdFx0XHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHRcdH07XG5cdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0fTtcbn1cblxuLyoqXG4gKiBXb3JrZXJUcmlnZ2VyIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igd29ya2VyLWJhc2VkIHRyaWdnZXJzXG4gKlxuICogUHJvdmlkZXMgYmFja2dyb3VuZCBqb2IgcHJvY2Vzc2luZyB3aXRoOlxuICogLSBDb25maWd1cmFibGUgY29uY3VycmVuY3kgcGVyIHF1ZXVlXG4gKiAtIEF1dG9tYXRpYyByZXRyaWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICogLSBKb2IgdGltZW91dHMgd2l0aCBhdXRvbWF0aWMgZmFpbHVyZVxuICogLSBQcmlvcml0eS1iYXNlZCBqb2Igb3JkZXJpbmdcbiAqIC0gRGVsYXllZCBqb2Igc2NoZWR1bGluZ1xuICogLSBRdWV1ZSBzdGF0aXN0aWNzIGFuZCBtb25pdG9yaW5nXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXb3JrZXJUcmlnZ2VyIGV4dGVuZHMgVHJpZ2dlckJhc2Uge1xuXHRwcm90ZWN0ZWQgbm9kZU1hcDogR2xvYmFsT3B0aW9ucyA9IHt9IGFzIEdsb2JhbE9wdGlvbnM7XG5cdHByb3RlY3RlZCByZWFkb25seSB0cmFjZXIgPSB0cmFjZS5nZXRUcmFjZXIoXG5cdFx0cHJvY2Vzcy5lbnYuUFJPSkVDVF9OQU1FIHx8IFwidHJpZ2dlci13b3JrZXItd29ya2Zsb3dcIixcblx0XHRwcm9jZXNzLmVudi5QUk9KRUNUX1ZFUlNJT04gfHwgXCIwLjAuMVwiLFxuXHQpO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IERlZmF1bHRMb2dnZXIoKTtcblx0cHJvdGVjdGVkIGFic3RyYWN0IGFkYXB0ZXI6IFdvcmtlckFkYXB0ZXI7XG5cblx0LyoqIEFjdGl2ZSBxdWV1ZXMgYmVpbmcgcHJvY2Vzc2VkICovXG5cdHByb3RlY3RlZCBhY3RpdmVRdWV1ZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG5cdC8vIFN1YmNsYXNzZXMgcHJvdmlkZSB0aGVzZVxuXHRwcm90ZWN0ZWQgYWJzdHJhY3Qgbm9kZXM6IFJlY29yZDxzdHJpbmcsIEJsb2tTZXJ2aWNlPHVua25vd24+Pjtcblx0cHJvdGVjdGVkIGFic3RyYWN0IHdvcmtmbG93czogUmVjb3JkPHN0cmluZywgSGVscGVyUmVzcG9uc2U+O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5sb2FkTm9kZXMoKTtcblx0XHR0aGlzLmxvYWRXb3JrZmxvd3MoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIG5vZGVzIGludG8gdGhlIG5vZGUgbWFwXG5cdCAqL1xuXHRsb2FkTm9kZXMoKTogdm9pZCB7XG5cdFx0dGhpcy5ub2RlTWFwLm5vZGVzID0gbmV3IE5vZGVNYXAoKTtcblx0XHRjb25zdCBub2RlS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMubm9kZXMpO1xuXHRcdGZvciAoY29uc3Qga2V5IG9mIG5vZGVLZXlzKSB7XG5cdFx0XHR0aGlzLm5vZGVNYXAubm9kZXMuYWRkTm9kZShrZXksIHRoaXMubm9kZXNba2V5XSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgd29ya2Zsb3dzIGludG8gdGhlIHdvcmtmbG93IG1hcFxuXHQgKi9cblx0bG9hZFdvcmtmbG93cygpOiB2b2lkIHtcblx0XHR0aGlzLm5vZGVNYXAud29ya2Zsb3dzID0gdGhpcy53b3JrZmxvd3M7XG5cdH1cblxuXHQvKipcblx0ICogU3RhcnQgdGhlIHdvcmtlciBwcm9jZXNzb3IgLSBtYWluIGVudHJ5IHBvaW50XG5cdCAqL1xuXHRhc3luYyBsaXN0ZW4oKTogUHJvbWlzZTxudW1iZXI+IHtcblx0XHRjb25zdCBzdGFydFRpbWUgPSB0aGlzLnN0YXJ0Q291bnRlcigpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFRpZXIgMiAjNiBmb2xsb3ctdXAgwrcgaW5zdGFsbCB0aGUgY3Jvc3MtcHJvY2VzcyBjb25jdXJyZW5jeVxuXHRcdFx0Ly8gYmFja2VuZCAoTkFUUyBLVikgd2hlbiB0aGUgb3BlcmF0b3Igb3B0ZWQgaW4gdmlhXG5cdFx0XHQvLyBgQkxPS19DT05DVVJSRU5DWV9CQUNLRU5EPW5hdHMta3ZgLiBEZWZhdWx0IG51bGwgcHJlc2VydmVzIHRoZVxuXHRcdFx0Ly8gZXhpc3RpbmcgaW4tcHJvY2VzcyBiZWhhdmlvci5cblx0XHRcdC8vXG5cdFx0XHQvLyBQUiAzIEQxIOKAlCByZWNvcmQgaW5zdGFsbCBhdHRlbXB0cyB2aWEgT1RlbCBjb3VudGVyLlxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgYmFja2VuZCA9IGNyZWF0ZUNvbmN1cnJlbmN5QmFja2VuZCgpO1xuXHRcdFx0XHRpZiAoYmFja2VuZCkge1xuXHRcdFx0XHRcdGF3YWl0IGJhY2tlbmQuY29ubmVjdCgpO1xuXHRcdFx0XHRcdFJ1blRyYWNrZXIuZ2V0SW5zdGFuY2UoKS5zZXRDb25jdXJyZW5jeUJhY2tlbmQoYmFja2VuZCk7XG5cdFx0XHRcdFx0Q29uY3VycmVuY3lNZXRyaWNzLmdldEluc3RhbmNlKCkucmVjb3JkQmFja2VuZEluc3RhbGwoe1xuXHRcdFx0XHRcdFx0YmFja2VuZDogYmFja2VuZC5uYW1lLFxuXHRcdFx0XHRcdFx0c3RhdHVzOiBcInN1Y2Nlc3NcIixcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYFtjb25jdXJyZW5jeV0gYmFja2VuZCBpbnN0YWxsZWQ6ICR7YmFja2VuZC5uYW1lfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0Q29uY3VycmVuY3lNZXRyaWNzLmdldEluc3RhbmNlKCkucmVjb3JkQmFja2VuZEluc3RhbGwoe1xuXHRcdFx0XHRcdGJhY2tlbmQ6IFwidW5rbm93blwiLFxuXHRcdFx0XHRcdHN0YXR1czogXCJmYWlsdXJlXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XHRgW2NvbmN1cnJlbmN5XSBiYWNrZW5kIGluc3RhbGwgZmFpbGVkOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX07IGZhbGxpbmcgYmFjayB0byBpbi1wcm9jZXNzIGJlaGF2aW9yYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGllciAyIHF1aWNrLXdpbnMgZm9sbG93LXVwIMK3IGluc3RhbGwgY3Jhc2ggaGFuZGxlcnMgKyByZWNvdmVyXG5cdFx0XHQvLyBvcnBoYW5lZCBydW5zIGZyb20gYSBwcmV2aW91cyAoZGVhZCkgcHJvY2Vzcy4gSWRlbXBvdGVudCArIG9wdC1vdXRcblx0XHRcdC8vIHZpYSBgQkxPS19DUkFTSF9BVVRPRkxJUF9ESVNBQkxFRD0xYC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdFdvcmtlclRyaWdnZXIuaW5zdGFsbENyYXNoSGFuZGxlcnModGhpcy5sb2dnZXIpO1xuXHRcdFx0XHRjb25zdCBvcnBoYW5lZCA9IFdvcmtlclRyaWdnZXIucmVjb3Zlck9ycGhhbmVkUnVucyh1bmRlZmluZWQsIHRoaXMubG9nZ2VyKTtcblx0XHRcdFx0aWYgKG9ycGhhbmVkID4gMCkge1xuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgW2NyYXNoLWF1dG9mbGlwXSBmbGlwcGVkICR7b3JwaGFuZWR9IG9ycGhhbmVkIHJ1bihzKSB0byBjcmFzaGVkIG9uIGJvb3RgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBbY3Jhc2gtYXV0b2ZsaXBdIHNldHVwIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpZXIgMiBmb2xsb3ctdXAgwrcgc3RhcnQgdGhlIHBlcmlvZGljIHN0b3JhZ2UgamFuaXRvci5cblx0XHRcdC8vIElkZW1wb3RlbnQgKHNpbmdsZXRvbik7IG9wdC1vdXQgdmlhIGBCTE9LX0pBTklUT1JfRElTQUJMRUQ9MWAuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRKYW5pdG9yLmdldEluc3RhbmNlKFJ1blRyYWNrZXIuZ2V0SW5zdGFuY2UoKS5nZXRTdG9yZSgpLCB0aGlzLmxvZ2dlcikuc3RhcnQoKTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgW2phbml0b3JdIHNldHVwIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpZXIgMiBmb2xsb3ctdXAgwrcgaW5zdGFsbCBncmFjZWZ1bCBzaHV0ZG93biBoYW5kbGVyc1xuXHRcdFx0Ly8gKFNJR1RFUk0gLyBTSUdJTlQpLiBJZGVtcG90ZW50OyBvcHQtb3V0IHZpYVxuXHRcdFx0Ly8gYEJMT0tfR1JBQ0VGVUxfU0hVVERPV05fRElTQUJMRUQ9MWAuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRXb3JrZXJUcmlnZ2VyLmluc3RhbGxTaHV0ZG93bkhhbmRsZXJzKHRoaXMsIHRoaXMubG9nZ2VyKTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgW3NodXRkb3duXSBzZXR1cCBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb25uZWN0IHRvIGpvYiBiYWNrZW5kXG5cdFx0XHRhd2FpdCB0aGlzLmFkYXB0ZXIuY29ubmVjdCgpO1xuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBDb25uZWN0ZWQgdG8gJHt0aGlzLmFkYXB0ZXIucHJvdmlkZXJ9IHdvcmtlciBzeXN0ZW1gKTtcblxuXHRcdFx0Ly8gUmVnaXN0ZXIgaGVhbHRoIGRlcGVuZGVuY3lcblx0XHRcdHRoaXMucmVnaXN0ZXJIZWFsdGhEZXBlbmRlbmN5KGB3b3JrZXItJHt0aGlzLmFkYXB0ZXIucHJvdmlkZXJ9YCwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBoZWFsdGh5ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmhlYWx0aENoZWNrKCk7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0c3RhdHVzOiBoZWFsdGh5ID8gKFwiaGVhbHRoeVwiIGFzIGNvbnN0KSA6IChcInVuaGVhbHRoeVwiIGFzIGNvbnN0KSxcblx0XHRcdFx0XHRsYXN0Q2hlY2tlZDogRGF0ZS5ub3coKSxcblx0XHRcdFx0XHRtZXNzYWdlOiBoZWFsdGh5ID8gXCJDb25uZWN0ZWRcIiA6IFwiQ29ubmVjdGlvbiBsb3N0XCIsXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gRmluZCBhbGwgd29ya2Zsb3dzIHdpdGggd29ya2VyIHRyaWdnZXJzXG5cdFx0XHRjb25zdCB3b3JrZXJXb3JrZmxvd3MgPSB0aGlzLmdldFdvcmtlcldvcmtmbG93cygpO1xuXG5cdFx0XHRpZiAod29ya2VyV29ya2Zsb3dzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXCJObyB3b3JrZmxvd3Mgd2l0aCB3b3JrZXIgdHJpZ2dlcnMgZm91bmRcIik7XG5cdFx0XHRcdHJldHVybiB0aGlzLmVuZENvdW50ZXIoc3RhcnRUaW1lKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgcHJvY2Vzc2luZyBlYWNoIHF1ZXVlXG5cdFx0XHRmb3IgKGNvbnN0IHdvcmtmbG93IG9mIHdvcmtlcldvcmtmbG93cykge1xuXHRcdFx0XHRjb25zdCBjb25maWcgPSB3b3JrZmxvdy5jb25maWcudHJpZ2dlcj8ud29ya2VyIGFzIFdvcmtlclRyaWdnZXJPcHRzO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0YFN0YXJ0aW5nIHdvcmtlciBmb3IgcXVldWU6ICR7Y29uZmlnLnF1ZXVlfSAoY29uY3VycmVuY3k9JHtjb25maWcuY29uY3VycmVuY3l9LCByZXRyaWVzPSR7Y29uZmlnLnJldHJpZXN9KWAsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0dGhpcy5hY3RpdmVRdWV1ZXMuYWRkKGNvbmZpZy5xdWV1ZSk7XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5hZGFwdGVyLnByb2Nlc3MoY29uZmlnLCBhc3luYyAoam9iKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5oYW5kbGVKb2Ioam9iLCB3b3JrZmxvdywgY29uZmlnKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgV29ya2VyIHRyaWdnZXIgc3RhcnRlZC4gUHJvY2Vzc2luZyAke3dvcmtlcldvcmtmbG93cy5sZW5ndGh9IHF1ZXVlKHMpYCk7XG5cblx0XHRcdC8vIEVuYWJsZSBITVIgaW4gZGV2ZWxvcG1lbnQgbW9kZVxuXHRcdFx0aWYgKHByb2Nlc3MuZW52LkJMT0tfSE1SID09PSBcInRydWVcIiB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZW5hYmxlSG90UmVsb2FkKCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmVuZENvdW50ZXIoc3RhcnRUaW1lKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzdGFydCB3b3JrZXIgdHJpZ2dlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3RvcCBhbGwgd29ya2VycyBhbmQgZGlzY29ubmVjdFxuXHQgKi9cblx0YXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRmb3IgKGNvbnN0IHF1ZXVlIG9mIHRoaXMuYWN0aXZlUXVldWVzKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmFkYXB0ZXIuc3RvcFByb2Nlc3NpbmcocXVldWUpO1xuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBTdG9wcGVkIHByb2Nlc3NpbmcgcXVldWU6ICR7cXVldWV9YCk7XG5cdFx0fVxuXHRcdHRoaXMuYWN0aXZlUXVldWVzLmNsZWFyKCk7XG5cdFx0YXdhaXQgdGhpcy5hZGFwdGVyLmRpc2Nvbm5lY3QoKTtcblx0XHR0aGlzLmRlc3Ryb3lNb25pdG9yaW5nKCk7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiV29ya2VyIHRyaWdnZXIgc3RvcHBlZFwiKTtcblx0fVxuXG5cdHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBvbkhtcldvcmtmbG93Q2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMubG9nZ2VyLmxvZyhcIltITVJdIFdvcmtlciB3b3JrZmxvdyBjaGFuZ2VkLCByZWxvYWRpbmcuLi5cIik7XG5cdFx0YXdhaXQgdGhpcy53YWl0Rm9ySW5GbGlnaHRSZXF1ZXN0cygpO1xuXHRcdGF3YWl0IHRoaXMuc3RvcCgpO1xuXHRcdHRoaXMubG9hZFdvcmtmbG93cygpO1xuXHRcdGF3YWl0IHRoaXMubGlzdGVuKCk7XG5cdH1cblxuXHQvKipcblx0ICogRGlzcGF0Y2ggYSBqb2IgdG8gYSB3b3JrZXIgcXVldWVcblx0ICovXG5cdGFzeW5jIGRpc3BhdGNoKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0ZGF0YTogdW5rbm93bixcblx0XHRvcHRzPzoge1xuXHRcdFx0cHJpb3JpdHk/OiBudW1iZXI7XG5cdFx0XHRkZWxheT86IG51bWJlcjtcblx0XHRcdHJldHJpZXM/OiBudW1iZXI7XG5cdFx0XHR0aW1lb3V0PzogbnVtYmVyO1xuXHRcdFx0am9iSWQ/OiBzdHJpbmc7XG5cdFx0fSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5hZGFwdGVyLmFkZEpvYihxdWV1ZSwgZGF0YSwgb3B0cyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHN0YXRpc3RpY3MgZm9yIGEgcXVldWVcblx0ICovXG5cdGFzeW5jIGdldFF1ZXVlU3RhdHMocXVldWU6IHN0cmluZyk6IFByb21pc2U8V29ya2VyUXVldWVTdGF0cz4ge1xuXHRcdHJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0UXVldWVTdGF0cyhxdWV1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGxpc3Qgb2YgYWN0aXZlIHF1ZXVlc1xuXHQgKi9cblx0Z2V0QWN0aXZlUXVldWVzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmFjdGl2ZVF1ZXVlcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFsbCB3b3JrZmxvd3MgdGhhdCBoYXZlIHdvcmtlciB0cmlnZ2Vyc1xuXHQgKi9cblx0cHJvdGVjdGVkIGdldFdvcmtlcldvcmtmbG93cygpOiBXb3JrZXJXb3JrZmxvd01vZGVsW10ge1xuXHRcdGNvbnN0IHdvcmtmbG93czogV29ya2VyV29ya2Zsb3dNb2RlbFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IFtwYXRoLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ub2RlTWFwLndvcmtmbG93cyB8fCB7fSkpIHtcblx0XHRcdGNvbnN0IHdvcmtmbG93Q29uZmlnID0gKHdvcmtmbG93IGFzIHVua25vd24gYXMgeyBfY29uZmlnOiBXb3JrZXJXb3JrZmxvd01vZGVsW1wiY29uZmlnXCJdIH0pLl9jb25maWc7XG5cblx0XHRcdGlmICh3b3JrZmxvd0NvbmZpZz8udHJpZ2dlcikge1xuXHRcdFx0XHRjb25zdCB0cmlnZ2VyVHlwZSA9IE9iamVjdC5rZXlzKHdvcmtmbG93Q29uZmlnLnRyaWdnZXIpWzBdO1xuXG5cdFx0XHRcdGlmICh0cmlnZ2VyVHlwZSA9PT0gXCJ3b3JrZXJcIiAmJiB3b3JrZmxvd0NvbmZpZy50cmlnZ2VyLndvcmtlcikge1xuXHRcdFx0XHRcdHdvcmtmbG93cy5wdXNoKHtcblx0XHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0XHRjb25maWc6IHdvcmtmbG93Q29uZmlnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdvcmtmbG93cztcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgYW4gaW5jb21pbmcgam9iXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlSm9iKGpvYjogV29ya2VySm9iLCB3b3JrZmxvdzogV29ya2VyV29ya2Zsb3dNb2RlbCwgY29uZmlnOiBXb3JrZXJUcmlnZ2VyT3B0cyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGpvYklkID0gam9iLmlkIHx8IHV1aWQoKTtcblx0XHRjb25zdCBkZWZhdWx0TWV0ZXIgPSBtZXRyaWNzLmdldE1ldGVyKFwiZGVmYXVsdFwiKTtcblx0XHRjb25zdCB3b3JrZXJKb2JzID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJ3b3JrZXJfam9ic19wcm9jZXNzZWRcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiV29ya2VyIGpvYnMgcHJvY2Vzc2VkXCIsXG5cdFx0fSk7XG5cdFx0Y29uc3Qgd29ya2VyRXJyb3JzID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJ3b3JrZXJfam9ic19mYWlsZWRcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiV29ya2VyIGpvYiBmYWlsdXJlc1wiLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHdvcmtlclJldHJpZXMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcIndvcmtlcl9qb2JzX3JldHJpZWRcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiV29ya2VyIGpvYiByZXRyaWVzXCIsXG5cdFx0fSk7XG5cblx0XHRhd2FpdCB0aGlzLnRyYWNlci5zdGFydEFjdGl2ZVNwYW4oYHdvcmtlcjoke2NvbmZpZy5xdWV1ZX1gLCBhc3luYyAoc3BhbjogU3BhbikgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuXHRcdFx0XHQvLyBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgd29ya2Zsb3dcblx0XHRcdFx0YXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmluaXQod29ya2Zsb3cucGF0aCwgdGhpcy5ub2RlTWFwKTtcblxuXHRcdFx0XHQvLyBDcmVhdGUgY29udGV4dFxuXHRcdFx0XHRjb25zdCBjdHg6IENvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkLCB3b3JrZmxvdy5wYXRoLCBqb2JJZCk7XG5cblx0XHRcdFx0Ly8gUG9wdWxhdGUgcmVxdWVzdCB3aXRoIGpvYiBkYXRhXG5cdFx0XHRcdGN0eC5yZXF1ZXN0ID0ge1xuXHRcdFx0XHRcdGJvZHk6IGpvYi5kYXRhLFxuXHRcdFx0XHRcdGhlYWRlcnM6IGpvYi5oZWFkZXJzLFxuXHRcdFx0XHRcdHF1ZXJ5OiB7fSxcblx0XHRcdFx0XHRwYXJhbXM6IHtcblx0XHRcdFx0XHRcdHF1ZXVlOiBqb2IucXVldWUsXG5cdFx0XHRcdFx0XHRqb2JJZDogam9iLmlkLFxuXHRcdFx0XHRcdFx0YXR0ZW1wdDogU3RyaW5nKGpvYi5hdHRlbXB0cyksXG5cdFx0XHRcdFx0XHRwcmlvcml0eTogU3RyaW5nKGpvYi5wcmlvcml0eSksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSBhcyB1bmtub3duIGFzIFJlcXVlc3RDb250ZXh0O1xuXG5cdFx0XHRcdC8vIFN0b3JlIHdvcmtlciBtZXRhZGF0YSBpbiBjb250ZXh0XG5cdFx0XHRcdGlmICghY3R4LnZhcnMpIGN0eC52YXJzID0ge307XG5cdFx0XHRcdGN0eC52YXJzLl93b3JrZXJfam9iID0ge1xuXHRcdFx0XHRcdGlkOiBqb2IuaWQsXG5cdFx0XHRcdFx0cXVldWU6IGpvYi5xdWV1ZSxcblx0XHRcdFx0XHRhdHRlbXB0czogU3RyaW5nKGpvYi5hdHRlbXB0cyksXG5cdFx0XHRcdFx0bWF4UmV0cmllczogU3RyaW5nKGpvYi5tYXhSZXRyaWVzKSxcblx0XHRcdFx0XHRwcmlvcml0eTogU3RyaW5nKGpvYi5wcmlvcml0eSksXG5cdFx0XHRcdFx0Y3JlYXRlZEF0OiBqb2IuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG5cdFx0XHRcdFx0ZGVsYXk6IFN0cmluZyhqb2IuZGVsYXkgPz8gMCksXG5cdFx0XHRcdFx0dGltZW91dDogU3RyaW5nKGpvYi50aW1lb3V0ID8/IDApLFxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGN0eC5sb2dnZXIubG9nKFxuXHRcdFx0XHRcdGBQcm9jZXNzaW5nIGpvYiAke2pvYklkfSBmcm9tICR7Y29uZmlnLnF1ZXVlfSAoYXR0ZW1wdCAke2pvYi5hdHRlbXB0cyArIDF9LyR7am9iLm1heFJldHJpZXMgKyAxfSlgLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgd29ya2Zsb3cgd2l0aCB0aW1lb3V0IGlmIGNvbmZpZ3VyZWRcblx0XHRcdFx0bGV0IHJlc3BvbnNlOiBUcmlnZ2VyUmVzcG9uc2U7XG5cdFx0XHRcdGlmIChjb25maWcudGltZW91dCAmJiBjb25maWcudGltZW91dCA+IDApIHtcblx0XHRcdFx0XHRyZXNwb25zZSA9IGF3YWl0IHRoaXMuZXhlY3V0ZVdpdGhUaW1lb3V0KGN0eCwgY29uZmlnLnRpbWVvdXQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc3BvbnNlID0gYXdhaXQgdGhpcy5ydW4oY3R4KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG5cdFx0XHRcdC8vIFNldCBzcGFuIGF0dHJpYnV0ZXNcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIHRydWUpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImpvYl9pZFwiLCBqb2JJZCk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwicXVldWVcIiwgY29uZmlnLnF1ZXVlKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJhdHRlbXB0c1wiLCBqb2IuYXR0ZW1wdHMpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImVsYXBzZWRfbXNcIiwgZW5kIC0gc3RhcnQpO1xuXHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LIH0pO1xuXG5cdFx0XHRcdC8vIFJlY29yZCBtZXRyaWNzXG5cdFx0XHRcdHdvcmtlckpvYnMuYWRkKDEsIHtcblx0XHRcdFx0XHRlbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuXHRcdFx0XHRcdHF1ZXVlOiBjb25maWcucXVldWUsXG5cdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogdGhpcy5jb25maWd1cmF0aW9uLm5hbWUsXG5cdFx0XHRcdFx0c3VjY2VzczogXCJ0cnVlXCIsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGN0eC5sb2dnZXIubG9nKGBKb2IgY29tcGxldGVkIGluICR7KGVuZCAtIHN0YXJ0KS50b0ZpeGVkKDIpfW1zOiAke2pvYklkfWApO1xuXG5cdFx0XHRcdC8vIE1hcmsgam9iIGFzIGNvbXBsZXRlZFxuXHRcdFx0XHRhd2FpdCBqb2IuY29tcGxldGUoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9IChlcnJvciBhcyBFcnJvcikubWVzc2FnZTtcblxuXHRcdFx0XHQvLyBUaWVyIDIgIzUgKyAjNyDigJQgZGVmZXJyZWQgZGlzcGF0Y2ggKGRlbGF5L1RUTC9kZWJvdW5jZSkuXG5cdFx0XHRcdC8vIFRoZSBydW4gd2FzIGRlZmVycmVkIHRvIGEgZnV0dXJlIHRpbWVyOyBBQ0sgd2l0aG91dCByZXRyeS5cblx0XHRcdFx0Ly8gVGhlIGluLXByb2Nlc3Mgc2NoZWR1bGVyIG93bnMgdGhlIGV2ZW50dWFsIGRpc3BhdGNoLCBOT1Rcblx0XHRcdFx0Ly8gdGhlIGJyb2tlciDigJQgcmUtcXVldWVpbmcgaGVyZSB3b3VsZCBjcmVhdGUgYSBkdXBsaWNhdGUuXG5cdFx0XHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIERlZmVycmVkRGlzcGF0Y2hTaWduYWwpIHtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiZGVmZXJyZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJkZWZlcnJlZF9zdGF0dXNcIiwgZXJyb3IuaW5mby5zdGF0dXMpO1xuXHRcdFx0XHRcdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuT0ssIG1lc3NhZ2U6IGBkZWZlcnJlZDoke2Vycm9yLmluZm8uc3RhdHVzfWAgfSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0XHRgW3NjaGVkdWxpbmddIGpvYiAke2pvYklkfSBydW5JZD0ke2Vycm9yLmluZm8ucnVuSWR9IHN0YXR1cz0ke2Vycm9yLmluZm8uc3RhdHVzfSBgICtcblx0XHRcdFx0XHRcdFx0YHNjaGVkdWxlZEF0PSR7ZXJyb3IuaW5mby5zY2hlZHVsZWRBdH0gcGluZ0NvdW50PSR7ZXJyb3IuaW5mby5waW5nQ291bnR9IOKGkiBBQ0sgKG5vIHJlcXVldWUpYCxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0YXdhaXQgam9iLmNvbXBsZXRlKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUFIgMS01IHBvbGlzaCDigJQgcXVldWUtbW9kZSBUVEwgZWxhcHNlZC4gVGhlIHJ1biBpcyBhbHJlYWR5XG5cdFx0XHRcdC8vIGZsaXBwZWQgdG8gYGV4cGlyZWRgIChzZWUgVHJpZ2dlckJhc2UgcXVldWUgYnJhbmNoKTsgQUNLXG5cdFx0XHRcdC8vIHdpdGhvdXQgcmV0cnkgc28gdGhlIGJyb2tlciBkb2Vzbid0IHJlZGVsaXZlciDigJQgdGhlIHJ1blxuXHRcdFx0XHQvLyB3aWxsIG5ldmVyIHN1Y2NlZWQgKHRpbWVyIHdvbid0IHJlLWZpcmUpLiBEaXN0aW5jdCBmcm9tXG5cdFx0XHRcdC8vIHRoZSB0aHJvdHRsZWQgTkFDSyBiZWxvdy5cblx0XHRcdFx0aWYgKGVycm9yIGluc3RhbmNlb2YgUXVldWVFeHBpcmVkRXJyb3IpIHtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwicXVldWVfZXhwaXJlZFwiLCB0cnVlKTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LLCBtZXNzYWdlOiBcInF1ZXVlX2V4cGlyZWRcIiB9KTtcblxuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhcblx0XHRcdFx0XHRcdGBbY29uY3VycmVuY3ldIGpvYiAke2pvYklkfSBydW5JZD0ke2Vycm9yLmluZm8ucnVuSWR9IGtleT0nJHtlcnJvci5pbmZvLmNvbmN1cnJlbmN5S2V5fScgYCArXG5cdFx0XHRcdFx0XHRcdGBxdWV1ZUV4cGlyZWRBdD0ke2Vycm9yLmluZm8ucXVldWVFeHBpcmVkQXR9IOKGkiBBQ0sgKG5vIHJlcXVldWUsIHJ1biBleHBpcmVkKWAsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5jb21wbGV0ZSgpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRpZXIgMiAjNiDigJQgY29uY3VycmVuY3kgZ2F0ZSBkZW5pYWwuIERpc3RpbmN0IGZyb20gYSBub3JtYWxcblx0XHRcdFx0Ly8gZmFpbHVyZTogTkFDSyB3aXRoIHJlZGVsaXZlcnkgc28gdGhlIGJyb2tlciByZS1xdWV1ZXMgdGhlXG5cdFx0XHRcdC8vIGpvYiB3aXRoIGl0cyBleGlzdGluZyBiYWNrLW9mZiBzZW1hbnRpY3MuIERvZXNuJ3QgY291bnRcblx0XHRcdFx0Ly8gYWdhaW5zdCB0aGUgd29ya2Zsb3cncyByZXRyeSBidWRnZXQgKGRpZmZlcmVudCBpbnZhcmlhbnQpLlxuXHRcdFx0XHQvLyBXZSBhbHdheXMgcGFzcyBgd2lsbFJldHJ5OiB0cnVlYCByZWdhcmRsZXNzIG9mIGBqb2IuYXR0ZW1wdHNgXG5cdFx0XHRcdC8vIGJlY2F1c2UgdGhyb3R0bGluZyBpcyBhIHRyYW5zaWVudCByZXNvdXJjZSBzdGF0ZSwgbm90IGFcblx0XHRcdFx0Ly8gcGVybWFuZW50IGZhaWx1cmUuXG5cdFx0XHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIENvbmN1cnJlbmN5TGltaXRFcnJvcikge1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJ3aWxsX3JldHJ5XCIsIHRydWUpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwidGhyb3R0bGVkXCIsIHRydWUpO1xuXHRcdFx0XHRcdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuT0ssIG1lc3NhZ2U6IFwiY29uY3VycmVuY3lfbGltaXRfcmVhY2hlZFwiIH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFxuXHRcdFx0XHRcdFx0YFtjb25jdXJyZW5jeV0gam9iICR7am9iSWR9IGtleT0nJHtlcnJvci5pbmZvLmNvbmN1cnJlbmN5S2V5fScgYCArXG5cdFx0XHRcdFx0XHRcdGBsaW1pdD0ke2Vycm9yLmluZm8uY29uY3VycmVuY3lMaW1pdH0gaW5GbGlnaHQ9JHtlcnJvci5pbmZvLmN1cnJlbnRJbkZsaWdodH0g4oaSIE5BQ0sgKyByZWRlbGl2ZXJ5YCxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0d29ya2VyUmV0cmllcy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdHF1ZXVlOiBjb25maWcucXVldWUsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdFx0XHRyZWFzb246IFwidGhyb3R0bGVkXCIsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRhd2FpdCBqb2IuZmFpbChlcnJvciBhcyBFcnJvciwgdHJ1ZSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgc2hvdWxkUmV0cnkgPSBqb2IuYXR0ZW1wdHMgPCBqb2IubWF4UmV0cmllcztcblxuXHRcdFx0XHQvLyBTZXQgc3BhbiBlcnJvclxuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgZmFsc2UpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcIndpbGxfcmV0cnlcIiwgc2hvdWxkUmV0cnkpO1xuXHRcdFx0XHRzcGFuLnJlY29yZEV4Y2VwdGlvbihlcnJvciBhcyBFcnJvcik7XG5cdFx0XHRcdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSB9KTtcblxuXHRcdFx0XHRpZiAoc2hvdWxkUmV0cnkpIHtcblx0XHRcdFx0XHQvLyBSZXRyeSB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuIGBjb25maWcuZGVsYXlgIHdpZGVuZWQgdG9cblx0XHRcdFx0XHQvLyBgc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkYCBpbiBUaWVyIDIgIzUgKGR1cmF0aW9uIHN0cmluZ3MpLlxuXHRcdFx0XHRcdC8vIGBjYWxjdWxhdGVCYWNrb2ZmYCBvbmx5IGhhbmRsZXMgbnVtYmVyczsgbm9ybWFsaXplIHZpYVxuXHRcdFx0XHRcdC8vIHRyeVBhcnNlRHVyYXRpb24uIEZhaWwtb3BlbiB0byB1bmRlZmluZWQg4oaSIGRlZmF1bHQgYmFja29mZi5cblx0XHRcdFx0XHRjb25zdCBkZWxheU1zID1cblx0XHRcdFx0XHRcdHR5cGVvZiBjb25maWcuZGVsYXkgPT09IFwibnVtYmVyXCJcblx0XHRcdFx0XHRcdFx0PyBjb25maWcuZGVsYXlcblx0XHRcdFx0XHRcdFx0OiB0eXBlb2YgY29uZmlnLmRlbGF5ID09PSBcInN0cmluZ1wiXG5cdFx0XHRcdFx0XHRcdFx0PyAodHJ5UGFyc2VEdXJhdGlvbihjb25maWcuZGVsYXkpID8/IHVuZGVmaW5lZClcblx0XHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRjb25zdCBiYWNrb2ZmTXMgPSB0aGlzLmNhbGN1bGF0ZUJhY2tvZmYoam9iLmF0dGVtcHRzLCBkZWxheU1zKTtcblx0XHRcdFx0XHR3b3JrZXJSZXRyaWVzLmFkZCgxLCB7XG5cdFx0XHRcdFx0XHRlbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuXHRcdFx0XHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHRcdHdvcmtmbG93X25hbWU6IHRoaXMuY29uZmlndXJhdGlvbj8ubmFtZSB8fCBcInVua25vd25cIixcblx0XHRcdFx0XHRcdGF0dGVtcHQ6IFN0cmluZyhqb2IuYXR0ZW1wdHMgKyAxKSxcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFxuXHRcdFx0XHRcdFx0YEpvYiAke2pvYklkfSBmYWlsZWQgKGF0dGVtcHQgJHtqb2IuYXR0ZW1wdHMgKyAxfS8ke2pvYi5tYXhSZXRyaWVzICsgMX0pLCByZXRyeWluZyBpbiAke2JhY2tvZmZNc31tczogJHtlcnJvck1lc3NhZ2V9YCxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0YXdhaXQgam9iLmZhaWwoZXJyb3IgYXMgRXJyb3IsIHRydWUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIE1heCByZXRyaWVzIGV4aGF1c3RlZCAtIHNlbmQgdG8gRExRXG5cdFx0XHRcdFx0d29ya2VyRXJyb3JzLmFkZCgxLCB7XG5cdFx0XHRcdFx0XHRlbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuXHRcdFx0XHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHRcdHdvcmtmbG93X25hbWU6IHRoaXMuY29uZmlndXJhdGlvbj8ubmFtZSB8fCBcInVua25vd25cIixcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFxuXHRcdFx0XHRcdFx0YEpvYiAke2pvYklkfSBwZXJtYW5lbnRseSBmYWlsZWQgYWZ0ZXIgJHtqb2IuYXR0ZW1wdHMgKyAxfSBhdHRlbXB0czogJHtlcnJvck1lc3NhZ2V9YCxcblx0XHRcdFx0XHRcdChlcnJvciBhcyBFcnJvcikuc3RhY2ssXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5mYWlsKGVycm9yIGFzIEVycm9yLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdHNwYW4uZW5kKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB3b3JrZmxvdyB3aXRoIGEgdGltZW91dFxuXHQgKi9cblx0cHJvdGVjdGVkIGFzeW5jIGV4ZWN1dGVXaXRoVGltZW91dChjdHg6IENvbnRleHQsIHRpbWVvdXRNczogbnVtYmVyKTogUHJvbWlzZTxUcmlnZ2VyUmVzcG9uc2U+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8VHJpZ2dlclJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRyZWplY3QobmV3IEVycm9yKGBKb2IgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCkpO1xuXHRcdFx0fSwgdGltZW91dE1zKTtcblxuXHRcdFx0dGhpcy5ydW4oY3R4KVxuXHRcdFx0XHQudGhlbigocmVzdWx0KSA9PiB7XG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRcdFx0XHRyZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZSBleHBvbmVudGlhbCBiYWNrb2ZmIGRlbGF5XG5cdCAqIEZvcm11bGE6IG1pbihiYXNlRGVsYXkgKiAyXmF0dGVtcHQsIDMwMDAwKSArIGppdHRlclxuXHQgKi9cblx0cHJvdGVjdGVkIGNhbGN1bGF0ZUJhY2tvZmYoYXR0ZW1wdDogbnVtYmVyLCBiYXNlRGVsYXk/OiBudW1iZXIpOiBudW1iZXIge1xuXHRcdGNvbnN0IGJhc2UgPSBiYXNlRGVsYXkgPz8gMTAwMDtcblx0XHRjb25zdCBtYXhEZWxheSA9IDMwMDAwOyAvLyAzMCBzZWNvbmRzIG1heFxuXHRcdGNvbnN0IGV4cG9uZW50aWFsID0gTWF0aC5taW4oYmFzZSAqIDIgKiogYXR0ZW1wdCwgbWF4RGVsYXkpO1xuXHRcdGNvbnN0IGppdHRlciA9IE1hdGgucmFuZG9tKCkgKiBleHBvbmVudGlhbCAqIDAuMTsgLy8gMTAlIGppdHRlclxuXHRcdHJldHVybiBNYXRoLmZsb29yKGV4cG9uZW50aWFsICsgaml0dGVyKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBXb3JrZXJUcmlnZ2VyO1xuIl19
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
22
|
import type { WorkerAdapter, WorkerJob, WorkerQueueStats } from "../WorkerTrigger";
|
|
23
|
-
import type { WorkerTriggerOpts } from "@
|
|
23
|
+
import type { WorkerTriggerOpts } from "@blokjs/helper";
|
|
24
24
|
/**
|
|
25
25
|
* BullMQ adapter configuration
|
|
26
26
|
*/
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* BullMQAdapter - Worker adapter using BullMQ (Redis-backed)
|
|
4
3
|
*
|
|
@@ -20,48 +19,13 @@
|
|
|
20
19
|
* });
|
|
21
20
|
* ```
|
|
22
21
|
*/
|
|
23
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
24
|
-
if (k2 === undefined) k2 = k;
|
|
25
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
26
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
27
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
28
|
-
}
|
|
29
|
-
Object.defineProperty(o, k2, desc);
|
|
30
|
-
}) : (function(o, m, k, k2) {
|
|
31
|
-
if (k2 === undefined) k2 = k;
|
|
32
|
-
o[k2] = m[k];
|
|
33
|
-
}));
|
|
34
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
35
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
36
|
-
}) : function(o, v) {
|
|
37
|
-
o["default"] = v;
|
|
38
|
-
});
|
|
39
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
40
|
-
var ownKeys = function(o) {
|
|
41
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
42
|
-
var ar = [];
|
|
43
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
44
|
-
return ar;
|
|
45
|
-
};
|
|
46
|
-
return ownKeys(o);
|
|
47
|
-
};
|
|
48
|
-
return function (mod) {
|
|
49
|
-
if (mod && mod.__esModule) return mod;
|
|
50
|
-
var result = {};
|
|
51
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
52
|
-
__setModuleDefault(result, mod);
|
|
53
|
-
return result;
|
|
54
|
-
};
|
|
55
|
-
})();
|
|
56
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
-
exports.BullMQAdapter = void 0;
|
|
58
22
|
/**
|
|
59
23
|
* BullMQ Worker Adapter
|
|
60
24
|
*
|
|
61
25
|
* Uses BullMQ for robust, Redis-backed job processing with support for
|
|
62
26
|
* priority queues, delayed jobs, retries, and dead letter handling.
|
|
63
27
|
*/
|
|
64
|
-
class BullMQAdapter {
|
|
28
|
+
export class BullMQAdapter {
|
|
65
29
|
provider = "bullmq";
|
|
66
30
|
connection = null;
|
|
67
31
|
workers = new Map();
|
|
@@ -83,7 +47,7 @@ class BullMQAdapter {
|
|
|
83
47
|
if (this.connected)
|
|
84
48
|
return;
|
|
85
49
|
try {
|
|
86
|
-
const { default: IORedis } = await
|
|
50
|
+
const { default: IORedis } = await import("ioredis");
|
|
87
51
|
this.connection = new IORedis({
|
|
88
52
|
host: this.config.host,
|
|
89
53
|
port: this.config.port,
|
|
@@ -131,7 +95,7 @@ class BullMQAdapter {
|
|
|
131
95
|
}
|
|
132
96
|
try {
|
|
133
97
|
// Dynamic import to avoid hard dependency on bullmq
|
|
134
|
-
const bullmq = await
|
|
98
|
+
const bullmq = await import("bullmq");
|
|
135
99
|
const BullWorker = bullmq.Worker;
|
|
136
100
|
const BullQueue = bullmq.Queue;
|
|
137
101
|
// Build worker options
|
|
@@ -194,7 +158,7 @@ class BullMQAdapter {
|
|
|
194
158
|
try {
|
|
195
159
|
// Ensure queue exists
|
|
196
160
|
if (!this.queues.has(queue)) {
|
|
197
|
-
const { Queue } = await
|
|
161
|
+
const { Queue } = await import("bullmq");
|
|
198
162
|
const q = new Queue(queue, {
|
|
199
163
|
connection: this.connection,
|
|
200
164
|
prefix: this.config.prefix,
|
|
@@ -255,5 +219,4 @@ class BullMQAdapter {
|
|
|
255
219
|
return { waiting, active, completed, failed, delayed };
|
|
256
220
|
}
|
|
257
221
|
}
|
|
258
|
-
exports.BullMQAdapter = BullMQAdapter;
|
|
259
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVsbE1RQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9CdWxsTVFBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBCSDs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYTtJQUNoQixRQUFRLEdBQUcsUUFBaUIsQ0FBQztJQUM5QixVQUFVLEdBQVksSUFBSSxDQUFDO0lBQzNCLE9BQU8sR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMxQyxNQUFNLEdBQXlCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDekMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNULE1BQU0sQ0FBZTtJQUV0QyxZQUFZLE1BQThCO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxXQUFXO1lBQzNELElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUMzRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWM7WUFDeEQsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLGFBQWE7WUFDdkMsZUFBZSxFQUFFLE1BQU0sRUFBRSxlQUFlLElBQUksQ0FBQztZQUM3QyxlQUFlLEVBQUUsTUFBTSxFQUFFLGVBQWUsSUFBSSxJQUFJ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LEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN2RSxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQU05QixDQUFDO1FBRUYsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDdkUsQ0FBQyxDQUFDLGVBQWUsRUFBRTtZQUNuQixDQUFDLENBQUMsY0FBYyxFQUFFO1lBQ2xCLENBQUMsQ0FBQyxpQkFBaUIsRUFBRTtZQUNyQixDQUFDLENBQUMsY0FBYyxFQUFFO1lBQ2xCLENBQUMsQ0FBQyxlQUFlLEVBQUU7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0NBQ0Q7QUFuUEQsc0NBbVBDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCdWxsTVFBZGFwdGVyIC0gV29ya2VyIGFkYXB0ZXIgdXNpbmcgQnVsbE1RIChSZWRpcy1iYWNrZWQpXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIFJlZGlzLWJhY2tlZCBwZXJzaXN0ZW50IGpvYiBxdWV1ZXNcbiAqIC0gQ29uZmlndXJhYmxlIGNvbmN1cnJlbmN5IHBlciBxdWV1ZVxuICogLSBKb2IgcHJpb3JpdHkgc3VwcG9ydFxuICogLSBEZWxheWVkIGpvYiBzY2hlZHVsaW5nXG4gKiAtIEF1dG9tYXRpYyByZXRyaWVzIHdpdGggY29uZmlndXJhYmxlIGJhY2tvZmZcbiAqIC0gUXVldWUgc3RhdGlzdGljc1xuICpcbiAqIFJlcXVpcmVzOiBidWxsbXEgYW5kIGlvcmVkaXMgYXMgcGVlciBkZXBlbmRlbmNpZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYWRhcHRlciA9IG5ldyBCdWxsTVFBZGFwdGVyKHtcbiAqICAgaG9zdDogXCJsb2NhbGhvc3RcIixcbiAqICAgcG9ydDogNjM3OSxcbiAqIH0pO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3JrZXJBZGFwdGVyLCBXb3JrZXJKb2IsIFdvcmtlclF1ZXVlU3RhdHMgfSBmcm9tIFwiLi4vV29ya2VyVHJpZ2dlclwiO1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtlclRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9rL2hlbHBlclwiO1xuXG4vKipcbiAqIEJ1bGxNUSBhZGFwdGVyIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxsTVFDb25maWcge1xuXHQvKiogUmVkaXMgaG9zdCAoZGVmYXVsdDogZnJvbSBSRURJU19IT1NUIGVudiBvciBcImxvY2FsaG9zdFwiKSAqL1xuXHRob3N0OiBzdHJpbmc7XG5cdC8qKiBSZWRpcyBwb3J0IChkZWZhdWx0OiBmcm9tIFJFRElTX1BPUlQgZW52IG9yIDYzNzkpICovXG5cdHBvcnQ6IG51bWJlcjtcblx0LyoqIFJlZGlzIHBhc3N3b3JkIChkZWZhdWx0OiBmcm9tIFJFRElTX1BBU1NXT1JEIGVudikgKi9cblx0cGFzc3dvcmQ/OiBzdHJpbmc7XG5cdC8qKiBSZWRpcyBkYXRhYmFzZSAoZGVmYXVsdDogZnJvbSBSRURJU19EQiBlbnYgb3IgMCkgKi9cblx0ZGI/OiBudW1iZXI7XG5cdC8qKiBLZXkgcHJlZml4IGZvciBhbGwgQnVsbE1RIGtleXMgKi9cblx0cHJlZml4Pzogc3RyaW5nO1xuXHQvKiogTWF4IHN0YWxsZWQgY291bnQgYmVmb3JlIGpvYiBmYWlscyAqL1xuXHRtYXhTdGFsbGVkQ291bnQ/OiBudW1iZXI7XG5cdC8qKiBTdGFsbGVkIGludGVydmFsIGluIG1zICovXG5cdHN0YWxsZWRJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCdWxsTVEgV29ya2VyIEFkYXB0ZXJcbiAqXG4gKiBVc2VzIEJ1bGxNUSBmb3Igcm9idXN0LCBSZWRpcy1iYWNrZWQgam9iIHByb2Nlc3Npbmcgd2l0aCBzdXBwb3J0IGZvclxuICogcHJpb3JpdHkgcXVldWVzLCBkZWxheWVkIGpvYnMsIHJldHJpZXMsIGFuZCBkZWFkIGxldHRlciBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1bGxNUUFkYXB0ZXIgaW1wbGVtZW50cyBXb3JrZXJBZGFwdGVyIHtcblx0cmVhZG9ubHkgcHJvdmlkZXIgPSBcImJ1bGxtcVwiIGFzIGNvbnN0O1xuXHRwcml2YXRlIGNvbm5lY3Rpb246IHVua25vd24gPSBudWxsO1xuXHRwcml2YXRlIHdvcmtlcnM6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIHF1ZXVlczogTWFwPHN0cmluZywgdW5rbm93bj4gPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG5cdHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBCdWxsTVFDb25maWc7XG5cblx0Y29uc3RydWN0b3IoY29uZmlnPzogUGFydGlhbDxCdWxsTVFDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRob3N0OiBjb25maWc/Lmhvc3QgfHwgcHJvY2Vzcy5lbnYuUkVESVNfSE9TVCB8fCBcImxvY2FsaG9zdFwiLFxuXHRcdFx0cG9ydDogY29uZmlnPy5wb3J0ID8/IE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5SRURJU19QT1JUIHx8IFwiNjM3OVwiLCAxMCksXG5cdFx0XHRwYXNzd29yZDogY29uZmlnPy5wYXNzd29yZCB8fCBwcm9jZXNzLmVudi5SRURJU19QQVNTV09SRCxcblx0XHRcdGRiOiBjb25maWc/LmRiID8/IE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5SRURJU19EQiB8fCBcIjBcIiwgMTApLFxuXHRcdFx0cHJlZml4OiBjb25maWc/LnByZWZpeCB8fCBcImJsb2std29ya2VyXCIsXG5cdFx0XHRtYXhTdGFsbGVkQ291bnQ6IGNvbmZpZz8ubWF4U3RhbGxlZENvdW50ID8/IDIsXG5cdFx0XHRzdGFsbGVkSW50ZXJ2YWw6IGNvbmZpZz8uc3RhbGxlZEludGVydmFsID8/IDUwMDAsXG5cdFx0fTtcblx0fVxuXG5cdGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgeyBkZWZhdWx0OiBJT1JlZGlzIH0gPSBhd2FpdCBpbXBvcnQoXCJpb3JlZGlzXCIpO1xuXHRcdFx0dGhpcy5jb25uZWN0aW9uID0gbmV3IElPUmVkaXMoe1xuXHRcdFx0XHRob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuXHRcdFx0XHRwb3J0OiB0aGlzLmNvbmZpZy5wb3J0LFxuXHRcdFx0XHRwYXNzd29yZDogdGhpcy5jb25maWcucGFzc3dvcmQsXG5cdFx0XHRcdGRiOiB0aGlzLmNvbmZpZy5kYixcblx0XHRcdFx0bWF4UmV0cmllc1BlclJlcXVlc3Q6IG51bGwsIC8vIFJlcXVpcmVkIGZvciBCdWxsTVFcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBWZXJpZnkgY29ubmVjdGlvblxuXHRcdFx0YXdhaXQgKHRoaXMuY29ubmVjdGlvbiBhcyB7IHBpbmc6ICgpID0+IFByb21pc2U8c3RyaW5nPiB9KS5waW5nKCk7XG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0J1bGxNUUFkYXB0ZXJdIENvbm5lY3RlZCB0byBSZWRpcyBhdCAke3RoaXMuY29uZmlnLmhvc3R9OiR7dGhpcy5jb25maWcucG9ydH1gKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgRmFpbGVkIHRvIGNvbm5lY3QgdG8gUmVkaXM6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS4gRW5zdXJlIGlvcmVkaXMgYW5kIGJ1bGxtcSBhcmUgaW5zdGFsbGVkOiBucG0gaW5zdGFsbCBpb3JlZGlzIGJ1bGxtcWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIENsb3NlIGFsbCB3b3JrZXJzXG5cdFx0XHRmb3IgKGNvbnN0IFssIHdvcmtlcl0gb2YgdGhpcy53b3JrZXJzKSB7XG5cdFx0XHRcdGF3YWl0ICh3b3JrZXIgYXMgeyBjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB9KS5jbG9zZSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy53b3JrZXJzLmNsZWFyKCk7XG5cblx0XHRcdC8vIENsb3NlIGFsbCBxdWV1ZXNcblx0XHRcdGZvciAoY29uc3QgWywgcXVldWVdIG9mIHRoaXMucXVldWVzKSB7XG5cdFx0XHRcdGF3YWl0IChxdWV1ZSBhcyB7IGNsb3NlOiAoKSA9PiBQcm9taXNlPHZvaWQ+IH0pLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnF1ZXVlcy5jbGVhcigpO1xuXG5cdFx0XHQvLyBDbG9zZSBSZWRpcyBjb25uZWN0aW9uXG5cdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uKSB7XG5cdFx0XHRcdGF3YWl0ICh0aGlzLmNvbm5lY3Rpb24gYXMgeyBxdWl0OiAoKSA9PiBQcm9taXNlPHN0cmluZz4gfSkucXVpdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc29sZS5sb2coXCJbQnVsbE1RQWRhcHRlcl0gRGlzY29ubmVjdGVkIGZyb20gUmVkaXNcIik7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFtCdWxsTVFBZGFwdGVyXSBEaXNjb25uZWN0IGVycm9yOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBwcm9jZXNzKGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChqb2I6IFdvcmtlckpvYikgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgaGFyZCBkZXBlbmRlbmN5IG9uIGJ1bGxtcVxuXHRcdFx0Y29uc3QgYnVsbG1xID0gYXdhaXQgaW1wb3J0KFwiYnVsbG1xXCIpO1xuXHRcdFx0Y29uc3QgQnVsbFdvcmtlciA9IGJ1bGxtcS5Xb3JrZXI7XG5cdFx0XHRjb25zdCBCdWxsUXVldWUgPSBidWxsbXEuUXVldWU7XG5cblx0XHRcdC8vIEJ1aWxkIHdvcmtlciBvcHRpb25zXG5cdFx0XHRjb25zdCB3b3JrZXJPcHRzID0ge1xuXHRcdFx0XHRjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG5cdFx0XHRcdGNvbmN1cnJlbmN5OiBjb25maWcuY29uY3VycmVuY3kgPz8gMSxcblx0XHRcdFx0cHJlZml4OiB0aGlzLmNvbmZpZy5wcmVmaXgsXG5cdFx0XHRcdHN0YWxsZWRJbnRlcnZhbDogdGhpcy5jb25maWcuc3RhbGxlZEludGVydmFsID8/IDUwMDAsXG5cdFx0XHRcdG1heFN0YWxsZWRDb3VudDogdGhpcy5jb25maWcubWF4U3RhbGxlZENvdW50ID8/IDIsXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCB3b3JrZXIgPSBuZXcgQnVsbFdvcmtlcihcblx0XHRcdFx0Y29uZmlnLnF1ZXVlLFxuXHRcdFx0XHQvLyBCdWxsTVEgcHJvY2Vzc29yIGNhbGxiYWNrXG5cdFx0XHRcdCgoYnVsbEpvYjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGpvYiA9IGJ1bGxKb2IgYXMge1xuXHRcdFx0XHRcdFx0aWQ/OiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRkYXRhOiB1bmtub3duO1xuXHRcdFx0XHRcdFx0b3B0cz86IHsgcHJpb3JpdHk/OiBudW1iZXI7IGRlbGF5PzogbnVtYmVyIH07XG5cdFx0XHRcdFx0XHRhdHRlbXB0c01hZGU6IG51bWJlcjtcblx0XHRcdFx0XHRcdHRpbWVzdGFtcDogbnVtYmVyO1xuXHRcdFx0XHRcdFx0dG9rZW4/OiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRtb3ZlVG9GYWlsZWQ6IChlcnI6IEVycm9yLCB0b2tlbjogc3RyaW5nLCBmZXRjaE5leHQ6IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD47XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCB3b3JrZXJKb2I6IFdvcmtlckpvYiA9IHtcblx0XHRcdFx0XHRcdGlkOiBqb2IuaWQgfHwgYGpvYi0ke0RhdGUubm93KCl9YCxcblx0XHRcdFx0XHRcdGRhdGE6IGpvYi5kYXRhLFxuXHRcdFx0XHRcdFx0aGVhZGVyczogKChqb2IuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/Ll9oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHx8IHt9LFxuXHRcdFx0XHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHRcdHByaW9yaXR5OiBqb2Iub3B0cz8ucHJpb3JpdHkgPz8gY29uZmlnLnByaW9yaXR5ID8/IDAsXG5cdFx0XHRcdFx0XHRhdHRlbXB0czogam9iLmF0dGVtcHRzTWFkZSxcblx0XHRcdFx0XHRcdG1heFJldHJpZXM6IGNvbmZpZy5yZXRyaWVzID8/IDMsXG5cdFx0XHRcdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKGpvYi50aW1lc3RhbXApLFxuXHRcdFx0XHRcdFx0ZGVsYXk6IGpvYi5vcHRzPy5kZWxheSxcblx0XHRcdFx0XHRcdHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0LFxuXHRcdFx0XHRcdFx0cmF3OiBqb2IsXG5cdFx0XHRcdFx0XHRjb21wbGV0ZTogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBCdWxsTVEgYXV0by1jb21wbGV0ZXMgd2hlbiBwcm9jZXNzb3IgcmVzb2x2ZXNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRmYWlsOiBhc3luYyAoZXJyb3I6IEVycm9yLCByZXF1ZXVlPzogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoIXJlcXVldWUpIHtcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCBqb2IubW92ZVRvRmFpbGVkKGVycm9yLCBqb2IudG9rZW4gfHwgXCJcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyb3I7IC8vIEJ1bGxNUSB3aWxsIGF1dG8tcmV0cnlcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHJldHVybiBoYW5kbGVyKHdvcmtlckpvYik7XG5cdFx0XHRcdH0pIGFzIG5ldmVyLFxuXHRcdFx0XHR3b3JrZXJPcHRzIGFzIG5ldmVyLFxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy53b3JrZXJzLnNldChjb25maWcucXVldWUsIHdvcmtlcik7XG5cblx0XHRcdC8vIEVuc3VyZSBxdWV1ZSBvYmplY3QgZXhpc3RzIGZvciBqb2IgZGlzcGF0Y2hpbmdcblx0XHRcdGlmICghdGhpcy5xdWV1ZXMuaGFzKGNvbmZpZy5xdWV1ZSkpIHtcblx0XHRcdFx0Y29uc3QgcXVldWUgPSBuZXcgQnVsbFF1ZXVlKGNvbmZpZy5xdWV1ZSwge1xuXHRcdFx0XHRcdGNvbm5lY3Rpb246IHRoaXMuY29ubmVjdGlvbiBhcyB7IGhvc3Q6IHN0cmluZzsgcG9ydDogbnVtYmVyIH0sXG5cdFx0XHRcdFx0cHJlZml4OiB0aGlzLmNvbmZpZy5wcmVmaXgsXG5cdFx0XHRcdH0gYXMgbmV2ZXIpO1xuXHRcdFx0XHR0aGlzLnF1ZXVlcy5zZXQoY29uZmlnLnF1ZXVlLCBxdWV1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUubG9nKGBbQnVsbE1RQWRhcHRlcl0gUHJvY2Vzc2luZyBxdWV1ZTogJHtjb25maWcucXVldWV9IChjb25jdXJyZW5jeT0ke2NvbmZpZy5jb25jdXJyZW5jeSA/PyAxfSlgKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZzogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgYWRkSm9iKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0ZGF0YTogdW5rbm93bixcblx0XHRvcHRzPzoge1xuXHRcdFx0cHJpb3JpdHk/OiBudW1iZXI7XG5cdFx0XHRkZWxheT86IG51bWJlcjtcblx0XHRcdHJldHJpZXM/OiBudW1iZXI7XG5cdFx0XHR0aW1lb3V0PzogbnVtYmVyO1xuXHRcdFx0am9iSWQ/OiBzdHJpbmc7XG5cdFx0fSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJOb3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIEVuc3VyZSBxdWV1ZSBleGlzdHNcblx0XHRcdGlmICghdGhpcy5xdWV1ZXMuaGFzKHF1ZXVlKSkge1xuXHRcdFx0XHRjb25zdCB7IFF1ZXVlIH0gPSBhd2FpdCBpbXBvcnQoXCJidWxsbXFcIik7XG5cdFx0XHRcdGNvbnN0IHEgPSBuZXcgUXVldWUocXVldWUsIHtcblx0XHRcdFx0XHRjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24gYXMgeyBob3N0OiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9LFxuXHRcdFx0XHRcdHByZWZpeDogdGhpcy5jb25maWcucHJlZml4LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5xdWV1ZXMuc2V0KHF1ZXVlLCBxKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcSA9IHRoaXMucXVldWVzLmdldChxdWV1ZSkgYXMge1xuXHRcdFx0XHRhZGQ6IChuYW1lOiBzdHJpbmcsIGRhdGE6IHVua25vd24sIG9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBQcm9taXNlPHsgaWQ6IHN0cmluZyB9Pjtcblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IGpvYiA9IGF3YWl0IHEuYWRkKFwicHJvY2Vzc1wiLCBkYXRhLCB7XG5cdFx0XHRcdHByaW9yaXR5OiBvcHRzPy5wcmlvcml0eSxcblx0XHRcdFx0ZGVsYXk6IG9wdHM/LmRlbGF5LFxuXHRcdFx0XHRhdHRlbXB0czogKG9wdHM/LnJldHJpZXMgPz8gMykgKyAxLFxuXHRcdFx0XHRqb2JJZDogb3B0cz8uam9iSWQsXG5cdFx0XHRcdGJhY2tvZmY6IHtcblx0XHRcdFx0XHR0eXBlOiBcImV4cG9uZW50aWFsXCIsXG5cdFx0XHRcdFx0ZGVsYXk6IDEwMDAsXG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGpvYi5pZDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gYWRkIGpvYjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgc3RvcFByb2Nlc3NpbmcocXVldWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2Vycy5nZXQocXVldWUpO1xuXHRcdGlmICh3b3JrZXIpIHtcblx0XHRcdGF3YWl0ICh3b3JrZXIgYXMgeyBjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB9KS5jbG9zZSgpO1xuXHRcdFx0dGhpcy53b3JrZXJzLmRlbGV0ZShxdWV1ZSk7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0J1bGxNUUFkYXB0ZXJdIFN0b3BwZWQgcHJvY2Vzc2luZyBxdWV1ZTogJHtxdWV1ZX1gKTtcblx0XHR9XG5cdH1cblxuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHRhc3luYyBoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLmNvbm5lY3Rpb24pIHJldHVybiBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgKHRoaXMuY29ubmVjdGlvbiBhcyB7IHBpbmc6ICgpID0+IFByb21pc2U8c3RyaW5nPiB9KS5waW5nKCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+IHtcblx0XHRpZiAoIXRoaXMucXVldWVzLmhhcyhxdWV1ZSkpIHtcblx0XHRcdHJldHVybiB7IHdhaXRpbmc6IDAsIGFjdGl2ZTogMCwgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGRlbGF5ZWQ6IDAgfTtcblx0XHR9XG5cblx0XHRjb25zdCBxID0gdGhpcy5xdWV1ZXMuZ2V0KHF1ZXVlKSBhcyB7XG5cdFx0XHRnZXRXYWl0aW5nQ291bnQ6ICgpID0+IFByb21pc2U8bnVtYmVyPjtcblx0XHRcdGdldEFjdGl2ZUNvdW50OiAoKSA9PiBQcm9taXNlPG51bWJlcj47XG5cdFx0XHRnZXRDb21wbGV0ZWRDb3VudDogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xuXHRcdFx0Z2V0RmFpbGVkQ291bnQ6ICgpID0+IFByb21pc2U8bnVtYmVyPjtcblx0XHRcdGdldERlbGF5ZWRDb3VudDogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xuXHRcdH07XG5cblx0XHRjb25zdCBbd2FpdGluZywgYWN0aXZlLCBjb21wbGV0ZWQsIGZhaWxlZCwgZGVsYXllZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0XHRxLmdldFdhaXRpbmdDb3VudCgpLFxuXHRcdFx0cS5nZXRBY3RpdmVDb3VudCgpLFxuXHRcdFx0cS5nZXRDb21wbGV0ZWRDb3VudCgpLFxuXHRcdFx0cS5nZXRGYWlsZWRDb3VudCgpLFxuXHRcdFx0cS5nZXREZWxheWVkQ291bnQoKSxcblx0XHRdKTtcblxuXHRcdHJldHVybiB7IHdhaXRpbmcsIGFjdGl2ZSwgY29tcGxldGVkLCBmYWlsZWQsIGRlbGF5ZWQgfTtcblx0fVxufVxuIl19
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVsbE1RQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9CdWxsTVFBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQTBCSDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ2hCLFFBQVEsR0FBRyxRQUFpQixDQUFDO0lBQzlCLFVBQVUsR0FBWSxJQUFJLENBQUM7SUFDM0IsT0FBTyxHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzFDLE1BQU0sR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN6QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ1QsTUFBTSxDQUFlO0lBRXRDLFlBQVksTUFBOEI7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNiLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFdBQVc7WUFDM0QsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQzNFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztZQUN4RCxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDbEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksYUFBYTtZQUN2QyxlQUFlLEVBQUUsTUFBTSxFQUFFLGVBQWUsSUFBSSxDQUFDO1lBQzdDLGVBQWUsRUFBRSxNQUFNLEVBQUUsZUFBZSxJQUFJLElBQUk7U0FDaEQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFL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RSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3ZFLENBQUM7UUFFRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBTTlCLENBQUM7UUFFRixNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN2RSxDQUFDLENBQUMsZUFBZSxFQUFFO1lBQ25CLENBQUMsQ0FBQyxjQUFjLEVBQUU7WUFDbEIsQ0FBQyxDQUFDLGlCQUFpQixFQUFFO1lBQ3JCLENBQUMsQ0FBQyxjQUFjLEVBQUU7WUFDbEIsQ0FBQyxDQUFDLGVBQWUsRUFBRTtTQUNuQixDQUFDLENBQUM7UUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3hELENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnVsbE1RQWRhcHRlciAtIFdvcmtlciBhZGFwdGVyIHVzaW5nIEJ1bGxNUSAoUmVkaXMtYmFja2VkKVxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBSZWRpcy1iYWNrZWQgcGVyc2lzdGVudCBqb2IgcXVldWVzXG4gKiAtIENvbmZpZ3VyYWJsZSBjb25jdXJyZW5jeSBwZXIgcXVldWVcbiAqIC0gSm9iIHByaW9yaXR5IHN1cHBvcnRcbiAqIC0gRGVsYXllZCBqb2Igc2NoZWR1bGluZ1xuICogLSBBdXRvbWF0aWMgcmV0cmllcyB3aXRoIGNvbmZpZ3VyYWJsZSBiYWNrb2ZmXG4gKiAtIFF1ZXVlIHN0YXRpc3RpY3NcbiAqXG4gKiBSZXF1aXJlczogYnVsbG1xIGFuZCBpb3JlZGlzIGFzIHBlZXIgZGVwZW5kZW5jaWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgQnVsbE1RQWRhcHRlcih7XG4gKiAgIGhvc3Q6IFwibG9jYWxob3N0XCIsXG4gKiAgIHBvcnQ6IDYzNzksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB0eXBlIHsgV29ya2VyQWRhcHRlciwgV29ya2VySm9iLCBXb3JrZXJRdWV1ZVN0YXRzIH0gZnJvbSBcIi4uL1dvcmtlclRyaWdnZXJcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JrZXJUcmlnZ2VyT3B0cyB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuXG4vKipcbiAqIEJ1bGxNUSBhZGFwdGVyIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxsTVFDb25maWcge1xuXHQvKiogUmVkaXMgaG9zdCAoZGVmYXVsdDogZnJvbSBSRURJU19IT1NUIGVudiBvciBcImxvY2FsaG9zdFwiKSAqL1xuXHRob3N0OiBzdHJpbmc7XG5cdC8qKiBSZWRpcyBwb3J0IChkZWZhdWx0OiBmcm9tIFJFRElTX1BPUlQgZW52IG9yIDYzNzkpICovXG5cdHBvcnQ6IG51bWJlcjtcblx0LyoqIFJlZGlzIHBhc3N3b3JkIChkZWZhdWx0OiBmcm9tIFJFRElTX1BBU1NXT1JEIGVudikgKi9cblx0cGFzc3dvcmQ/OiBzdHJpbmc7XG5cdC8qKiBSZWRpcyBkYXRhYmFzZSAoZGVmYXVsdDogZnJvbSBSRURJU19EQiBlbnYgb3IgMCkgKi9cblx0ZGI/OiBudW1iZXI7XG5cdC8qKiBLZXkgcHJlZml4IGZvciBhbGwgQnVsbE1RIGtleXMgKi9cblx0cHJlZml4Pzogc3RyaW5nO1xuXHQvKiogTWF4IHN0YWxsZWQgY291bnQgYmVmb3JlIGpvYiBmYWlscyAqL1xuXHRtYXhTdGFsbGVkQ291bnQ/OiBudW1iZXI7XG5cdC8qKiBTdGFsbGVkIGludGVydmFsIGluIG1zICovXG5cdHN0YWxsZWRJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCdWxsTVEgV29ya2VyIEFkYXB0ZXJcbiAqXG4gKiBVc2VzIEJ1bGxNUSBmb3Igcm9idXN0LCBSZWRpcy1iYWNrZWQgam9iIHByb2Nlc3Npbmcgd2l0aCBzdXBwb3J0IGZvclxuICogcHJpb3JpdHkgcXVldWVzLCBkZWxheWVkIGpvYnMsIHJldHJpZXMsIGFuZCBkZWFkIGxldHRlciBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1bGxNUUFkYXB0ZXIgaW1wbGVtZW50cyBXb3JrZXJBZGFwdGVyIHtcblx0cmVhZG9ubHkgcHJvdmlkZXIgPSBcImJ1bGxtcVwiIGFzIGNvbnN0O1xuXHRwcml2YXRlIGNvbm5lY3Rpb246IHVua25vd24gPSBudWxsO1xuXHRwcml2YXRlIHdvcmtlcnM6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIHF1ZXVlczogTWFwPHN0cmluZywgdW5rbm93bj4gPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG5cdHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBCdWxsTVFDb25maWc7XG5cblx0Y29uc3RydWN0b3IoY29uZmlnPzogUGFydGlhbDxCdWxsTVFDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRob3N0OiBjb25maWc/Lmhvc3QgfHwgcHJvY2Vzcy5lbnYuUkVESVNfSE9TVCB8fCBcImxvY2FsaG9zdFwiLFxuXHRcdFx0cG9ydDogY29uZmlnPy5wb3J0ID8/IE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5SRURJU19QT1JUIHx8IFwiNjM3OVwiLCAxMCksXG5cdFx0XHRwYXNzd29yZDogY29uZmlnPy5wYXNzd29yZCB8fCBwcm9jZXNzLmVudi5SRURJU19QQVNTV09SRCxcblx0XHRcdGRiOiBjb25maWc/LmRiID8/IE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5SRURJU19EQiB8fCBcIjBcIiwgMTApLFxuXHRcdFx0cHJlZml4OiBjb25maWc/LnByZWZpeCB8fCBcImJsb2std29ya2VyXCIsXG5cdFx0XHRtYXhTdGFsbGVkQ291bnQ6IGNvbmZpZz8ubWF4U3RhbGxlZENvdW50ID8/IDIsXG5cdFx0XHRzdGFsbGVkSW50ZXJ2YWw6IGNvbmZpZz8uc3RhbGxlZEludGVydmFsID8/IDUwMDAsXG5cdFx0fTtcblx0fVxuXG5cdGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgeyBkZWZhdWx0OiBJT1JlZGlzIH0gPSBhd2FpdCBpbXBvcnQoXCJpb3JlZGlzXCIpO1xuXHRcdFx0dGhpcy5jb25uZWN0aW9uID0gbmV3IElPUmVkaXMoe1xuXHRcdFx0XHRob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuXHRcdFx0XHRwb3J0OiB0aGlzLmNvbmZpZy5wb3J0LFxuXHRcdFx0XHRwYXNzd29yZDogdGhpcy5jb25maWcucGFzc3dvcmQsXG5cdFx0XHRcdGRiOiB0aGlzLmNvbmZpZy5kYixcblx0XHRcdFx0bWF4UmV0cmllc1BlclJlcXVlc3Q6IG51bGwsIC8vIFJlcXVpcmVkIGZvciBCdWxsTVFcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBWZXJpZnkgY29ubmVjdGlvblxuXHRcdFx0YXdhaXQgKHRoaXMuY29ubmVjdGlvbiBhcyB7IHBpbmc6ICgpID0+IFByb21pc2U8c3RyaW5nPiB9KS5waW5nKCk7XG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0J1bGxNUUFkYXB0ZXJdIENvbm5lY3RlZCB0byBSZWRpcyBhdCAke3RoaXMuY29uZmlnLmhvc3R9OiR7dGhpcy5jb25maWcucG9ydH1gKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgRmFpbGVkIHRvIGNvbm5lY3QgdG8gUmVkaXM6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS4gRW5zdXJlIGlvcmVkaXMgYW5kIGJ1bGxtcSBhcmUgaW5zdGFsbGVkOiBucG0gaW5zdGFsbCBpb3JlZGlzIGJ1bGxtcWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIENsb3NlIGFsbCB3b3JrZXJzXG5cdFx0XHRmb3IgKGNvbnN0IFssIHdvcmtlcl0gb2YgdGhpcy53b3JrZXJzKSB7XG5cdFx0XHRcdGF3YWl0ICh3b3JrZXIgYXMgeyBjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB9KS5jbG9zZSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy53b3JrZXJzLmNsZWFyKCk7XG5cblx0XHRcdC8vIENsb3NlIGFsbCBxdWV1ZXNcblx0XHRcdGZvciAoY29uc3QgWywgcXVldWVdIG9mIHRoaXMucXVldWVzKSB7XG5cdFx0XHRcdGF3YWl0IChxdWV1ZSBhcyB7IGNsb3NlOiAoKSA9PiBQcm9taXNlPHZvaWQ+IH0pLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnF1ZXVlcy5jbGVhcigpO1xuXG5cdFx0XHQvLyBDbG9zZSBSZWRpcyBjb25uZWN0aW9uXG5cdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uKSB7XG5cdFx0XHRcdGF3YWl0ICh0aGlzLmNvbm5lY3Rpb24gYXMgeyBxdWl0OiAoKSA9PiBQcm9taXNlPHN0cmluZz4gfSkucXVpdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc29sZS5sb2coXCJbQnVsbE1RQWRhcHRlcl0gRGlzY29ubmVjdGVkIGZyb20gUmVkaXNcIik7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFtCdWxsTVFBZGFwdGVyXSBEaXNjb25uZWN0IGVycm9yOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBwcm9jZXNzKGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChqb2I6IFdvcmtlckpvYikgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgaGFyZCBkZXBlbmRlbmN5IG9uIGJ1bGxtcVxuXHRcdFx0Y29uc3QgYnVsbG1xID0gYXdhaXQgaW1wb3J0KFwiYnVsbG1xXCIpO1xuXHRcdFx0Y29uc3QgQnVsbFdvcmtlciA9IGJ1bGxtcS5Xb3JrZXI7XG5cdFx0XHRjb25zdCBCdWxsUXVldWUgPSBidWxsbXEuUXVldWU7XG5cblx0XHRcdC8vIEJ1aWxkIHdvcmtlciBvcHRpb25zXG5cdFx0XHRjb25zdCB3b3JrZXJPcHRzID0ge1xuXHRcdFx0XHRjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG5cdFx0XHRcdGNvbmN1cnJlbmN5OiBjb25maWcuY29uY3VycmVuY3kgPz8gMSxcblx0XHRcdFx0cHJlZml4OiB0aGlzLmNvbmZpZy5wcmVmaXgsXG5cdFx0XHRcdHN0YWxsZWRJbnRlcnZhbDogdGhpcy5jb25maWcuc3RhbGxlZEludGVydmFsID8/IDUwMDAsXG5cdFx0XHRcdG1heFN0YWxsZWRDb3VudDogdGhpcy5jb25maWcubWF4U3RhbGxlZENvdW50ID8/IDIsXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCB3b3JrZXIgPSBuZXcgQnVsbFdvcmtlcihcblx0XHRcdFx0Y29uZmlnLnF1ZXVlLFxuXHRcdFx0XHQvLyBCdWxsTVEgcHJvY2Vzc29yIGNhbGxiYWNrXG5cdFx0XHRcdCgoYnVsbEpvYjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGpvYiA9IGJ1bGxKb2IgYXMge1xuXHRcdFx0XHRcdFx0aWQ/OiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRkYXRhOiB1bmtub3duO1xuXHRcdFx0XHRcdFx0b3B0cz86IHsgcHJpb3JpdHk/OiBudW1iZXI7IGRlbGF5PzogbnVtYmVyIH07XG5cdFx0XHRcdFx0XHRhdHRlbXB0c01hZGU6IG51bWJlcjtcblx0XHRcdFx0XHRcdHRpbWVzdGFtcDogbnVtYmVyO1xuXHRcdFx0XHRcdFx0dG9rZW4/OiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRtb3ZlVG9GYWlsZWQ6IChlcnI6IEVycm9yLCB0b2tlbjogc3RyaW5nLCBmZXRjaE5leHQ6IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD47XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCB3b3JrZXJKb2I6IFdvcmtlckpvYiA9IHtcblx0XHRcdFx0XHRcdGlkOiBqb2IuaWQgfHwgYGpvYi0ke0RhdGUubm93KCl9YCxcblx0XHRcdFx0XHRcdGRhdGE6IGpvYi5kYXRhLFxuXHRcdFx0XHRcdFx0aGVhZGVyczogKChqb2IuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/Ll9oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHx8IHt9LFxuXHRcdFx0XHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHRcdHByaW9yaXR5OiBqb2Iub3B0cz8ucHJpb3JpdHkgPz8gY29uZmlnLnByaW9yaXR5ID8/IDAsXG5cdFx0XHRcdFx0XHRhdHRlbXB0czogam9iLmF0dGVtcHRzTWFkZSxcblx0XHRcdFx0XHRcdG1heFJldHJpZXM6IGNvbmZpZy5yZXRyaWVzID8/IDMsXG5cdFx0XHRcdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKGpvYi50aW1lc3RhbXApLFxuXHRcdFx0XHRcdFx0ZGVsYXk6IGpvYi5vcHRzPy5kZWxheSxcblx0XHRcdFx0XHRcdHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0LFxuXHRcdFx0XHRcdFx0cmF3OiBqb2IsXG5cdFx0XHRcdFx0XHRjb21wbGV0ZTogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBCdWxsTVEgYXV0by1jb21wbGV0ZXMgd2hlbiBwcm9jZXNzb3IgcmVzb2x2ZXNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRmYWlsOiBhc3luYyAoZXJyb3I6IEVycm9yLCByZXF1ZXVlPzogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoIXJlcXVldWUpIHtcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCBqb2IubW92ZVRvRmFpbGVkKGVycm9yLCBqb2IudG9rZW4gfHwgXCJcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyb3I7IC8vIEJ1bGxNUSB3aWxsIGF1dG8tcmV0cnlcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHJldHVybiBoYW5kbGVyKHdvcmtlckpvYik7XG5cdFx0XHRcdH0pIGFzIG5ldmVyLFxuXHRcdFx0XHR3b3JrZXJPcHRzIGFzIG5ldmVyLFxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy53b3JrZXJzLnNldChjb25maWcucXVldWUsIHdvcmtlcik7XG5cblx0XHRcdC8vIEVuc3VyZSBxdWV1ZSBvYmplY3QgZXhpc3RzIGZvciBqb2IgZGlzcGF0Y2hpbmdcblx0XHRcdGlmICghdGhpcy5xdWV1ZXMuaGFzKGNvbmZpZy5xdWV1ZSkpIHtcblx0XHRcdFx0Y29uc3QgcXVldWUgPSBuZXcgQnVsbFF1ZXVlKGNvbmZpZy5xdWV1ZSwge1xuXHRcdFx0XHRcdGNvbm5lY3Rpb246IHRoaXMuY29ubmVjdGlvbiBhcyB7IGhvc3Q6IHN0cmluZzsgcG9ydDogbnVtYmVyIH0sXG5cdFx0XHRcdFx0cHJlZml4OiB0aGlzLmNvbmZpZy5wcmVmaXgsXG5cdFx0XHRcdH0gYXMgbmV2ZXIpO1xuXHRcdFx0XHR0aGlzLnF1ZXVlcy5zZXQoY29uZmlnLnF1ZXVlLCBxdWV1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUubG9nKGBbQnVsbE1RQWRhcHRlcl0gUHJvY2Vzc2luZyBxdWV1ZTogJHtjb25maWcucXVldWV9IChjb25jdXJyZW5jeT0ke2NvbmZpZy5jb25jdXJyZW5jeSA/PyAxfSlgKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZzogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgYWRkSm9iKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0ZGF0YTogdW5rbm93bixcblx0XHRvcHRzPzoge1xuXHRcdFx0cHJpb3JpdHk/OiBudW1iZXI7XG5cdFx0XHRkZWxheT86IG51bWJlcjtcblx0XHRcdHJldHJpZXM/OiBudW1iZXI7XG5cdFx0XHR0aW1lb3V0PzogbnVtYmVyO1xuXHRcdFx0am9iSWQ/OiBzdHJpbmc7XG5cdFx0fSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJOb3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIEVuc3VyZSBxdWV1ZSBleGlzdHNcblx0XHRcdGlmICghdGhpcy5xdWV1ZXMuaGFzKHF1ZXVlKSkge1xuXHRcdFx0XHRjb25zdCB7IFF1ZXVlIH0gPSBhd2FpdCBpbXBvcnQoXCJidWxsbXFcIik7XG5cdFx0XHRcdGNvbnN0IHEgPSBuZXcgUXVldWUocXVldWUsIHtcblx0XHRcdFx0XHRjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24gYXMgeyBob3N0OiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9LFxuXHRcdFx0XHRcdHByZWZpeDogdGhpcy5jb25maWcucHJlZml4LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5xdWV1ZXMuc2V0KHF1ZXVlLCBxKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcSA9IHRoaXMucXVldWVzLmdldChxdWV1ZSkgYXMge1xuXHRcdFx0XHRhZGQ6IChuYW1lOiBzdHJpbmcsIGRhdGE6IHVua25vd24sIG9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBQcm9taXNlPHsgaWQ6IHN0cmluZyB9Pjtcblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IGpvYiA9IGF3YWl0IHEuYWRkKFwicHJvY2Vzc1wiLCBkYXRhLCB7XG5cdFx0XHRcdHByaW9yaXR5OiBvcHRzPy5wcmlvcml0eSxcblx0XHRcdFx0ZGVsYXk6IG9wdHM/LmRlbGF5LFxuXHRcdFx0XHRhdHRlbXB0czogKG9wdHM/LnJldHJpZXMgPz8gMykgKyAxLFxuXHRcdFx0XHRqb2JJZDogb3B0cz8uam9iSWQsXG5cdFx0XHRcdGJhY2tvZmY6IHtcblx0XHRcdFx0XHR0eXBlOiBcImV4cG9uZW50aWFsXCIsXG5cdFx0XHRcdFx0ZGVsYXk6IDEwMDAsXG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGpvYi5pZDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gYWRkIGpvYjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgc3RvcFByb2Nlc3NpbmcocXVldWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2Vycy5nZXQocXVldWUpO1xuXHRcdGlmICh3b3JrZXIpIHtcblx0XHRcdGF3YWl0ICh3b3JrZXIgYXMgeyBjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB9KS5jbG9zZSgpO1xuXHRcdFx0dGhpcy53b3JrZXJzLmRlbGV0ZShxdWV1ZSk7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0J1bGxNUUFkYXB0ZXJdIFN0b3BwZWQgcHJvY2Vzc2luZyBxdWV1ZTogJHtxdWV1ZX1gKTtcblx0XHR9XG5cdH1cblxuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHRhc3luYyBoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLmNvbm5lY3Rpb24pIHJldHVybiBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgKHRoaXMuY29ubmVjdGlvbiBhcyB7IHBpbmc6ICgpID0+IFByb21pc2U8c3RyaW5nPiB9KS5waW5nKCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+IHtcblx0XHRpZiAoIXRoaXMucXVldWVzLmhhcyhxdWV1ZSkpIHtcblx0XHRcdHJldHVybiB7IHdhaXRpbmc6IDAsIGFjdGl2ZTogMCwgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGRlbGF5ZWQ6IDAgfTtcblx0XHR9XG5cblx0XHRjb25zdCBxID0gdGhpcy5xdWV1ZXMuZ2V0KHF1ZXVlKSBhcyB7XG5cdFx0XHRnZXRXYWl0aW5nQ291bnQ6ICgpID0+IFByb21pc2U8bnVtYmVyPjtcblx0XHRcdGdldEFjdGl2ZUNvdW50OiAoKSA9PiBQcm9taXNlPG51bWJlcj47XG5cdFx0XHRnZXRDb21wbGV0ZWRDb3VudDogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xuXHRcdFx0Z2V0RmFpbGVkQ291bnQ6ICgpID0+IFByb21pc2U8bnVtYmVyPjtcblx0XHRcdGdldERlbGF5ZWRDb3VudDogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xuXHRcdH07XG5cblx0XHRjb25zdCBbd2FpdGluZywgYWN0aXZlLCBjb21wbGV0ZWQsIGZhaWxlZCwgZGVsYXllZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0XHRxLmdldFdhaXRpbmdDb3VudCgpLFxuXHRcdFx0cS5nZXRBY3RpdmVDb3VudCgpLFxuXHRcdFx0cS5nZXRDb21wbGV0ZWRDb3VudCgpLFxuXHRcdFx0cS5nZXRGYWlsZWRDb3VudCgpLFxuXHRcdFx0cS5nZXREZWxheWVkQ291bnQoKSxcblx0XHRdKTtcblxuXHRcdHJldHVybiB7IHdhaXRpbmcsIGFjdGl2ZSwgY29tcGxldGVkLCBmYWlsZWQsIGRlbGF5ZWQgfTtcblx0fVxufVxuIl19
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* const adapter = new InMemoryAdapter();
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
|
-
import type { WorkerTriggerOpts } from "@
|
|
19
|
+
import type { WorkerTriggerOpts } from "@blokjs/helper";
|
|
20
20
|
import type { WorkerAdapter, WorkerJob, WorkerQueueStats } from "../WorkerTrigger";
|
|
21
21
|
/**
|
|
22
22
|
* InMemoryAdapter - Simple in-process worker queue
|