@blokjs/trigger-cron 0.2.0 → 0.6.1

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.
@@ -9,8 +9,8 @@
9
9
  *
10
10
  * Uses the 'cron' package for cron parsing and scheduling.
11
11
  */
12
- import type { CronTriggerOpts, HelperResponse } from "@blok/helper";
13
- import { DefaultLogger, type GlobalOptions, type BlokService, TriggerBase, type TriggerResponse } from "@blok/runner";
12
+ import type { CronTriggerOpts, HelperResponse } from "@blokjs/helper";
13
+ import { type BlokService, DefaultLogger, type GlobalOptions, TriggerBase, type TriggerResponse } from "@blokjs/runner";
14
14
  import { CronJob } from "cron";
15
15
  /**
16
16
  * Scheduled job information
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * CronTrigger - Scheduled workflow execution based on cron expressions
4
3
  *
@@ -10,19 +9,17 @@
10
9
  *
11
10
  * Uses the 'cron' package for cron parsing and scheduling.
12
11
  */
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.CronTrigger = void 0;
15
- const runner_1 = require("@blok/runner");
16
- const api_1 = require("@opentelemetry/api");
17
- const cron_1 = require("cron");
18
- const uuid_1 = require("uuid");
12
+ import { DefaultLogger, NodeMap, TriggerBase, } from "@blokjs/runner";
13
+ import { SpanStatusCode, metrics, trace } from "@opentelemetry/api";
14
+ import { CronJob } from "cron";
15
+ import { v4 as uuid } from "uuid";
19
16
  /**
20
17
  * CronTrigger - Scheduled workflow execution
21
18
  */
22
- class CronTrigger extends runner_1.TriggerBase {
19
+ export class CronTrigger extends TriggerBase {
23
20
  nodeMap = {};
24
- tracer = api_1.trace.getTracer(process.env.PROJECT_NAME || "trigger-cron-workflow", process.env.PROJECT_VERSION || "0.0.1");
25
- logger = new runner_1.DefaultLogger();
21
+ tracer = trace.getTracer(process.env.PROJECT_NAME || "trigger-cron-workflow", process.env.PROJECT_VERSION || "0.0.1");
22
+ logger = new DefaultLogger();
26
23
  jobs = new Map();
27
24
  constructor() {
28
25
  super();
@@ -33,7 +30,7 @@ class CronTrigger extends runner_1.TriggerBase {
33
30
  * Load nodes into the node map
34
31
  */
35
32
  loadNodes() {
36
- this.nodeMap.nodes = new runner_1.NodeMap();
33
+ this.nodeMap.nodes = new NodeMap();
37
34
  const nodeKeys = Object.keys(this.nodes);
38
35
  for (const key of nodeKeys) {
39
36
  this.nodeMap.nodes.addNode(key, this.nodes[key]);
@@ -70,18 +67,23 @@ class CronTrigger extends runner_1.TriggerBase {
70
67
  // Create and start cron jobs for each workflow
71
68
  for (const workflow of cronWorkflows) {
72
69
  const config = workflow.config.trigger?.cron;
73
- const jobId = `cron-${workflow.path}-${(0, uuid_1.v4)().slice(0, 8)}`;
74
- this.logger.log(`Scheduling workflow: ${workflow.path} with schedule: ${config.schedule} (${config.timezone})`);
75
- const job = new cron_1.CronJob(config.schedule, async () => {
70
+ const jobId = `cron-${workflow.path}-${uuid().slice(0, 8)}`;
71
+ // `CronTriggerOpts` is `z.input<…>` so `timezone` is `string | undefined`
72
+ // even though the schema declares `.default("UTC")`. Apply the
73
+ // default once here so the rest of this method (and the cron lib's
74
+ // constructor) sees a guaranteed string.
75
+ const timezone = config.timezone ?? "UTC";
76
+ this.logger.log(`Scheduling workflow: ${workflow.path} with schedule: ${config.schedule} (${timezone})`);
77
+ const job = new CronJob(config.schedule, async () => {
76
78
  await this.executeWorkflow(jobId, workflow, config, false);
77
79
  }, null, // onComplete
78
80
  false, // start
79
- config.timezone);
81
+ timezone);
80
82
  const scheduledJob = {
81
83
  id: jobId,
82
84
  workflowPath: workflow.path,
83
85
  schedule: config.schedule,
84
- timezone: config.timezone,
86
+ timezone,
85
87
  overlap: config.overlap ?? false,
86
88
  running: false,
87
89
  nextRun: this.toDate(job.nextDate()),
@@ -194,11 +196,13 @@ class CronTrigger extends runner_1.TriggerBase {
194
196
  this.logger.log(`Skipping ${jobId}: previous execution still running (overlap disabled)`);
195
197
  return { ctx: {}, metrics: {} };
196
198
  }
197
- const executionId = (0, uuid_1.v4)();
199
+ const executionId = uuid();
198
200
  const lastDate = scheduledJob.job.lastDate();
199
201
  const scheduledTime = lastDate ? new Date(lastDate) : new Date();
200
202
  const executionTime = new Date();
201
- const defaultMeter = api_1.metrics.getMeter("default");
203
+ // Apply the schema default — see explanation in `listen()`.
204
+ const timezone = config.timezone ?? "UTC";
205
+ const defaultMeter = metrics.getMeter("default");
202
206
  const cronExecutions = defaultMeter.createCounter("cron_executions", {
203
207
  description: "Cron job executions",
204
208
  });
@@ -220,7 +224,7 @@ class CronTrigger extends runner_1.TriggerBase {
220
224
  scheduledTime,
221
225
  executionTime,
222
226
  schedule: config.schedule,
223
- timezone: config.timezone,
227
+ timezone,
224
228
  manual,
225
229
  };
226
230
  // Populate request with cron context
@@ -250,6 +254,13 @@ class CronTrigger extends runner_1.TriggerBase {
250
254
  manual: String(manual),
251
255
  };
252
256
  ctx.logger.log(`Executing cron job: ${jobId} (${manual ? "manual" : "scheduled"})`);
257
+ // v0.6 · apply the merged middleware chain (process-global →
258
+ // workflow-level → trigger-level) before the main workflow
259
+ // body. Lets cron workflows compose auth-check + audit-log
260
+ // chains exactly like HTTP triggers. A throwing middleware
261
+ // propagates to the outer catch and surfaces as a cron job
262
+ // failure.
263
+ await this.applyMiddlewareChain(ctx, this.nodeMap);
253
264
  // Execute workflow
254
265
  const response = await this.run(ctx);
255
266
  const end = performance.now();
@@ -261,10 +272,10 @@ class CronTrigger extends runner_1.TriggerBase {
261
272
  span.setAttribute("job_id", jobId);
262
273
  span.setAttribute("workflow_path", workflow.path);
263
274
  span.setAttribute("schedule", config.schedule);
264
- span.setAttribute("timezone", config.timezone);
275
+ span.setAttribute("timezone", timezone);
265
276
  span.setAttribute("manual", manual);
266
277
  span.setAttribute("elapsed_ms", end - start);
267
- span.setStatus({ code: api_1.SpanStatusCode.OK });
278
+ span.setStatus({ code: SpanStatusCode.OK });
268
279
  // Record metrics
269
280
  cronExecutions.add(1, {
270
281
  env: process.env.NODE_ENV,
@@ -281,7 +292,7 @@ class CronTrigger extends runner_1.TriggerBase {
281
292
  // Set span error
282
293
  span.setAttribute("success", false);
283
294
  span.recordException(error);
284
- span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: errorMessage });
295
+ span.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage });
285
296
  // Record error metrics
286
297
  cronErrors.add(1, {
287
298
  env: process.env.NODE_ENV,
@@ -300,6 +311,5 @@ class CronTrigger extends runner_1.TriggerBase {
300
311
  });
301
312
  }
302
313
  }
303
- exports.CronTrigger = CronTrigger;
304
- exports.default = CronTrigger;
305
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JvblRyaWdnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQ3JvblRyaWdnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7O0dBVUc7OztBQUdILHlDQU9zQjtBQUV0Qiw0Q0FBK0U7QUFDL0UsK0JBQStCO0FBQy9CLCtCQUFrQztBQTREbEM7O0dBRUc7QUFDSCxNQUFzQixXQUFZLFNBQVEsb0JBQVc7SUFDMUMsT0FBTyxHQUFrQixFQUFtQixDQUFDO0lBQ3BDLE1BQU0sR0FBRyxXQUFLLENBQUMsU0FBUyxDQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSx1QkFBdUIsRUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksT0FBTyxDQUN0QyxDQUFDO0lBQ2lCLE1BQU0sR0FBRyxJQUFJLHNCQUFhLEVBQUUsQ0FBQztJQUN0QyxJQUFJLEdBQThCLElBQUksR0FBRyxFQUFFLENBQUM7SUFNdEQ7UUFDQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUztRQUNSLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksZ0JBQU8sRUFBRSxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNGLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWixJQUFJLENBQUMsT0FBTyxDQUFDLFNB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QUFJLFNBQVM7d0JBQ3BELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO3FCQUN0QixDQUFDLENBQUM7b0JBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEtBQUssS0FBSyxZQUFZLEVBQUUsRUFBRyxLQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRXZGLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFhLEVBQUUsT0FBTyxFQUFFLEVBQWlCLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RCxDQUFDO3dCQUFTLENBQUM7b0JBQ1YsWUFBWSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQzdCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDWixDQUFDO1lBQ0YsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRDtBQXRWRCxrQ0FzVkM7QUFFRCxrQkFBZSxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENyb25UcmlnZ2VyIC0gU2NoZWR1bGVkIHdvcmtmbG93IGV4ZWN1dGlvbiBiYXNlZCBvbiBjcm9uIGV4cHJlc3Npb25zXG4gKlxuICogRXh0ZW5kcyBUcmlnZ2VyQmFzZSB0byBzdXBwb3J0IHNjaGVkdWxlZCB0cmlnZ2VyczpcbiAqIC0gQ3JvbiBleHByZXNzaW9ucyAoZS5nLiwgXCIwICogKiAqICpcIiBmb3IgaG91cmx5KVxuICogLSBUaW1lem9uZS1hd2FyZSBzY2hlZHVsaW5nXG4gKiAtIE92ZXJsYXAgcHJldmVudGlvblxuICogLSBNYW51YWwgdHJpZ2dlciBzdXBwb3J0XG4gKlxuICogVXNlcyB0aGUgJ2Nyb24nIHBhY2thZ2UgZm9yIGNyb24gcGFyc2luZyBhbmQgc2NoZWR1bGluZy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENyb25UcmlnZ2VyT3B0cywgSGVscGVyUmVzcG9uc2UgfSBmcm9tIFwiQGJsb2svaGVscGVyXCI7XG5pbXBvcnQge1xuXHREZWZhdWx0TG9nZ2VyLFxuXHR0eXBlIEdsb2JhbE9wdGlvbnMsXG5cdHR5cGUgQmxva1NlcnZpY2UsXG5cdE5vZGVNYXAsXG5cdFRyaWdnZXJCYXNlLFxuXHR0eXBlIFRyaWdnZXJSZXNwb25zZSxcbn0gZnJvbSBcIkBibG9rL3J1bm5lclwiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0LCBNZXRyaWNzVHlwZSwgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGJsb2svc2hhcmVkXCI7XG5pbXBvcnQgeyB0eXBlIFNwYW4sIFNwYW5TdGF0dXNDb2RlLCBtZXRyaWNzLCB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB7IENyb25Kb2IgfSBmcm9tIFwiY3JvblwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5cbi8qKlxuICogU2NoZWR1bGVkIGpvYiBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlZEpvYiB7XG5cdC8qKiBVbmlxdWUgam9iIElEICovXG5cdGlkOiBzdHJpbmc7XG5cdC8qKiBXb3JrZmxvdyBwYXRoICovXG5cdHdvcmtmbG93UGF0aDogc3RyaW5nO1xuXHQvKiogQ3JvbiBleHByZXNzaW9uICovXG5cdHNjaGVkdWxlOiBzdHJpbmc7XG5cdC8qKiBUaW1lem9uZSAqL1xuXHR0aW1lem9uZTogc3RyaW5nO1xuXHQvKiogQWxsb3cgb3ZlcmxhcHBpbmcgZXhlY3V0aW9ucyAqL1xuXHRvdmVybGFwOiBib29sZWFuO1xuXHQvKiogV2hldGhlciB0aGUgam9iIGlzIGN1cnJlbnRseSBydW5uaW5nICovXG5cdHJ1bm5pbmc6IGJvb2xlYW47XG5cdC8qKiBMYXN0IGV4ZWN1dGlvbiB0aW1lICovXG5cdGxhc3RSdW4/OiBEYXRlO1xuXHQvKiogTmV4dCBzY2hlZHVsZWQgdGltZSAqL1xuXHRuZXh0UnVuPzogRGF0ZTtcblx0LyoqIEludGVybmFsIENyb25Kb2IgaW5zdGFuY2UgKi9cblx0am9iOiBDcm9uSm9iO1xufVxuXG4vKipcbiAqIEV4ZWN1dGlvbiBjb250ZXh0IHBhc3NlZCB0byB0aGUgd29ya2Zsb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcm9uRXhlY3V0aW9uQ29udGV4dCB7XG5cdC8qKiBKb2IgSUQgKi9cblx0am9iSWQ6IHN0cmluZztcblx0LyoqIFNjaGVkdWxlZCB0aW1lICh3aGVuIGl0IHdhcyBzdXBwb3NlZCB0byBydW4pICovXG5cdHNjaGVkdWxlZFRpbWU6IERhdGU7XG5cdC8qKiBBY3R1YWwgZXhlY3V0aW9uIHRpbWUgKi9cblx0ZXhlY3V0aW9uVGltZTogRGF0ZTtcblx0LyoqIENyb24gZXhwcmVzc2lvbiAqL1xuXHRzY2hlZHVsZTogc3RyaW5nO1xuXHQvKiogVGltZXpvbmUgKi9cblx0dGltZXpvbmU6IHN0cmluZztcblx0LyoqIFdoZXRoZXIgdGhpcyBpcyBhIG1hbnVhbCB0cmlnZ2VyICovXG5cdG1hbnVhbDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXb3JrZmxvdyBtb2RlbCB3aXRoIGNyb24gdHJpZ2dlciBjb25maWd1cmF0aW9uXG4gKi9cbmludGVyZmFjZSBDcm9uV29ya2Zsb3dNb2RlbCB7XG5cdHBhdGg6IHN0cmluZztcblx0Y29uZmlnOiB7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdHZlcnNpb246IHN0cmluZztcblx0XHR0cmlnZ2VyPzoge1xuXHRcdFx0Y3Jvbj86IENyb25UcmlnZ2VyT3B0cztcblx0XHRcdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdFx0fTtcblx0XHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHR9O1xufVxuXG4vKipcbiAqIENyb25UcmlnZ2VyIC0gU2NoZWR1bGVkIHdvcmtmbG93IGV4ZWN1dGlvblxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ3JvblRyaWdnZXIgZXh0ZW5kcyBUcmlnZ2VyQmFzZSB7XG5cdHByb3RlY3RlZCBub2RlTWFwOiBHbG9iYWxPcHRpb25zID0ge30gYXMgR2xvYmFsT3B0aW9ucztcblx0cHJvdGVjdGVkIHJlYWRvbmx5IHRyYWNlciA9IHRyYWNlLmdldFRyYWNlcihcblx0XHRwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgfHwgXCJ0cmlnZ2VyLWNyb24td29ya2Zsb3dcIixcblx0XHRwcm9jZXNzLmVudi5QUk9KRUNUX1ZFUlNJT04gfHwgXCIwLjAuMVwiLFxuXHQpO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IERlZmF1bHRMb2dnZXIoKTtcblx0cHJvdGVjdGVkIGpvYnM6IE1hcDxzdHJpbmcsIFNjaGVkdWxlZEpvYj4gPSBuZXcgTWFwKCk7XG5cblx0Ly8gU3ViY2xhc3NlcyBwcm92aWRlIHRoZXNlXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBub2RlczogUmVjb3JkPHN0cmluZywgQmxva1NlcnZpY2U8dW5rbm93bj4+O1xuXHRwcm90ZWN0ZWQgYWJzdHJhY3Qgd29ya2Zsb3dzOiBSZWNvcmQ8c3RyaW5nLCBIZWxwZXJSZXNwb25zZT47XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmxvYWROb2RlcygpO1xuXHRcdHRoaXMubG9hZFdvcmtmbG93cygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgbm9kZXMgaW50byB0aGUgbm9kZSBtYXBcblx0ICovXG5cdGxvYWROb2RlcygpOiB2b2lkIHtcblx0XHR0aGlzLm5vZGVNYXAubm9kZXMgPSBuZXcgTm9kZU1hcCgpO1xuXHRcdGNvbnN0IG5vZGVLZXlzID0gT2JqZWN0LmtleXModGhpcy5ub2Rlcyk7XG5cdFx0Zm9yIChjb25zdCBrZXkgb2Ygbm9kZUtleXMpIHtcblx0XHRcdHRoaXMubm9kZU1hcC5ub2Rlcy5hZGROb2RlKGtleSwgdGhpcy5ub2Rlc1trZXldKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCB3b3JrZmxvd3MgaW50byB0aGUgd29ya2Zsb3cgbWFwXG5cdCAqL1xuXHRsb2FkV29ya2Zsb3dzKCk6IHZvaWQge1xuXHRcdHRoaXMubm9kZU1hcC53b3JrZmxvd3MgPSB0aGlzLndvcmtmbG93cztcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IGNyb24gRGF0ZVRpbWUgdG8gRGF0ZVxuXHQgKiBUaGUgY3JvbiBwYWNrYWdlIHVzZXMgbHV4b24gRGF0ZVRpbWUgd2hpY2ggaGFzIHRvSlNEYXRlKClcblx0ICovXG5cdHByb3RlY3RlZCB0b0RhdGUoZGF0ZVRpbWU6IHVua25vd24pOiBEYXRlIHtcblx0XHRpZiAoZGF0ZVRpbWUgJiYgdHlwZW9mIGRhdGVUaW1lID09PSBcIm9iamVjdFwiICYmIFwidG9KU0RhdGVcIiBpbiBkYXRlVGltZSkge1xuXHRcdFx0cmV0dXJuIChkYXRlVGltZSBhcyB7IHRvSlNEYXRlOiAoKSA9PiBEYXRlIH0pLnRvSlNEYXRlKCk7XG5cdFx0fVxuXHRcdHJldHVybiBkYXRlVGltZSBpbnN0YW5jZW9mIERhdGUgPyBkYXRlVGltZSA6IG5ldyBEYXRlKGRhdGVUaW1lIGFzIHN0cmluZyB8IG51bWJlcik7XG5cdH1cblxuXHQvKipcblx0ICogU3RhcnQgdGhlIGNyb24gc2NoZWR1bGVyIC0gbWFpbiBlbnRyeSBwb2ludFxuXHQgKi9cblx0YXN5bmMgbGlzdGVuKCk6IFByb21pc2U8bnVtYmVyPiB7XG5cdFx0Y29uc3Qgc3RhcnRUaW1lID0gdGhpcy5zdGFydENvdW50ZXIoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBGaW5kIGFsbCB3b3JrZmxvd3Mgd2l0aCBjcm9uIHRyaWdnZXJzXG5cdFx0XHRjb25zdCBjcm9uV29ya2Zsb3dzID0gdGhpcy5nZXRDcm9uV29ya2Zsb3dzKCk7XG5cblx0XHRcdGlmIChjcm9uV29ya2Zsb3dzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXCJObyB3b3JrZmxvd3Mgd2l0aCBjcm9uIHRyaWdnZXJzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5lbmRDb3VudGVyKHN0YXJ0VGltZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENyZWF0ZSBhbmQgc3RhcnQgY3JvbiBqb2JzIGZvciBlYWNoIHdvcmtmbG93XG5cdFx0XHRmb3IgKGNvbnN0IHdvcmtmbG93IG9mIGNyb25Xb3JrZmxvd3MpIHtcblx0XHRcdFx0Y29uc3QgY29uZmlnID0gd29ya2Zsb3cuY29uZmlnLnRyaWdnZXI/LmNyb24gYXMgQ3JvblRyaWdnZXJPcHRzO1xuXHRcdFx0XHRjb25zdCBqb2JJZCA9IGBjcm9uLSR7d29ya2Zsb3cucGF0aH0tJHt1dWlkKCkuc2xpY2UoMCwgOCl9YDtcblxuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYFNjaGVkdWxpbmcgd29ya2Zsb3c6ICR7d29ya2Zsb3cucGF0aH0gd2l0aCBzY2hlZHVsZTogJHtjb25maWcuc2NoZWR1bGV9ICgke2NvbmZpZy50aW1lem9uZX0pYCk7XG5cblx0XHRcdFx0Y29uc3Qgam9iID0gbmV3IENyb25Kb2IoXG5cdFx0XHRcdFx0Y29uZmlnLnNjaGVkdWxlLFxuXHRcdFx0XHRcdGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZVdvcmtmbG93KGpvYklkLCB3b3JrZmxvdywgY29uZmlnLCBmYWxzZSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRudWxsLCAvLyBvbkNvbXBsZXRlXG5cdFx0XHRcdFx0ZmFsc2UsIC8vIHN0YXJ0XG5cdFx0XHRcdFx0Y29uZmlnLnRpbWV6b25lLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbnN0IHNjaGVkdWxlZEpvYjogU2NoZWR1bGVkSm9iID0ge1xuXHRcdFx0XHRcdGlkOiBqb2JJZCxcblx0XHRcdFx0XHR3b3JrZmxvd1BhdGg6IHdvcmtmbG93LnBhdGgsXG5cdFx0XHRcdFx0c2NoZWR1bGU6IGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHR0aW1lem9uZTogY29uZmlnLnRpbWV6b25lLFxuXHRcdFx0XHRcdG92ZXJsYXA6IGNvbmZpZy5vdmVybGFwID8/IGZhbHNlLFxuXHRcdFx0XHRcdHJ1bm5pbmc6IGZhbHNlLFxuXHRcdFx0XHRcdG5leHRSdW46IHRoaXMudG9EYXRlKGpvYi5uZXh0RGF0ZSgpKSxcblx0XHRcdFx0XHRqb2IsXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dGhpcy5qb2JzLnNldChqb2JJZCwgc2NoZWR1bGVkSm9iKTtcblxuXHRcdFx0XHQvLyBTdGFydCB0aGUgam9iXG5cdFx0XHRcdGpvYi5zdGFydCgpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYEpvYiAke2pvYklkfSBzdGFydGVkLiBOZXh0IHJ1bjogJHtzY2hlZHVsZWRKb2IubmV4dFJ1bn1gKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBDcm9uIHRyaWdnZXIgc3RhcnRlZC4gJHt0aGlzLmpvYnMuc2l6ZX0gam9iKHMpIHNjaGVkdWxlZGApO1xuXG5cdFx0XHQvLyBFbmFibGUgSE1SIGluIGRldmVsb3BtZW50IG1vZGVcblx0XHRcdGlmIChwcm9jZXNzLmVudi5CTE9LX0hNUiA9PT0gXCJ0cnVlXCIgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmVuYWJsZUhvdFJlbG9hZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5lbmRDb3VudGVyKHN0YXJ0VGltZSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc3RhcnQgY3JvbiB0cmlnZ2VyOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdG9wIGFsbCBjcm9uIGpvYnNcblx0ICovXG5cdGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Zm9yIChjb25zdCBbam9iSWQsIHNjaGVkdWxlZEpvYl0gb2YgdGhpcy5qb2JzKSB7XG5cdFx0XHRzY2hlZHVsZWRKb2Iuam9iLnN0b3AoKTtcblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgSm9iICR7am9iSWR9IHN0b3BwZWRgKTtcblx0XHR9XG5cdFx0dGhpcy5qb2JzLmNsZWFyKCk7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiQ3JvbiB0cmlnZ2VyIHN0b3BwZWRcIik7XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgb25IbXJXb3JrZmxvd0NoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmxvZ2dlci5sb2coXCJbSE1SXSBDcm9uIHdvcmtmbG93IGNoYW5nZWQsIHJlbG9hZGluZy4uLlwiKTtcblx0XHRhd2FpdCB0aGlzLndhaXRGb3JJbkZsaWdodFJlcXVlc3RzKCk7XG5cdFx0YXdhaXQgdGhpcy5zdG9wKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cdFx0YXdhaXQgdGhpcy5saXN0ZW4oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW51YWxseSB0cmlnZ2VyIGEgc3BlY2lmaWMgam9iXG5cdCAqL1xuXHRhc3luYyB0cmlnZ2VySm9iKGpvYklkOiBzdHJpbmcpOiBQcm9taXNlPFRyaWdnZXJSZXNwb25zZSB8IG51bGw+IHtcblx0XHRjb25zdCBzY2hlZHVsZWRKb2IgPSB0aGlzLmpvYnMuZ2V0KGpvYklkKTtcblx0XHRpZiAoIXNjaGVkdWxlZEpvYikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEpvYiBub3QgZm91bmQ6ICR7am9iSWR9YCk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHQvLyBHZXQgdGhlIHdvcmtmbG93XG5cdFx0Y29uc3Qgd29ya2Zsb3cgPSB0aGlzLmdldFdvcmtmbG93QnlQYXRoKHNjaGVkdWxlZEpvYi53b3JrZmxvd1BhdGgpO1xuXHRcdGlmICghd29ya2Zsb3cpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBXb3JrZmxvdyBub3QgZm91bmQ6ICR7c2NoZWR1bGVkSm9iLndvcmtmbG93UGF0aH1gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbmZpZyA9IHdvcmtmbG93LmNvbmZpZy50cmlnZ2VyPy5jcm9uIGFzIENyb25UcmlnZ2VyT3B0cztcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRlV29ya2Zsb3coam9iSWQsIHdvcmtmbG93LCBjb25maWcsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhbGwgc2NoZWR1bGVkIGpvYnNcblx0ICovXG5cdGdldEpvYnMoKTogU2NoZWR1bGVkSm9iW10ge1xuXHRcdHJldHVybiBBcnJheS5mcm9tKHRoaXMuam9icy52YWx1ZXMoKSkubWFwKChqb2IpID0+ICh7XG5cdFx0XHQuLi5qb2IsXG5cdFx0XHRuZXh0UnVuOiB0aGlzLnRvRGF0ZShqb2Iuam9iLm5leHREYXRlKCkpLFxuXHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYWxsIHdvcmtmbG93cyB0aGF0IGhhdmUgY3JvbiB0cmlnZ2Vyc1xuXHQgKi9cblx0cHJvdGVjdGVkIGdldENyb25Xb3JrZmxvd3MoKTogQ3JvbldvcmtmbG93TW9kZWxbXSB7XG5cdFx0Y29uc3Qgd29ya2Zsb3dzOiBDcm9uV29ya2Zsb3dNb2RlbFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IFtwYXRoLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ub2RlTWFwLndvcmtmbG93cyB8fCB7fSkpIHtcblx0XHRcdGNvbnN0IHdvcmtmbG93Q29uZmlnID0gKHdvcmtmbG93IGFzIHVua25vd24gYXMgeyBfY29uZmlnOiBDcm9uV29ya2Zsb3dNb2RlbFtcImNvbmZpZ1wiXSB9KS5fY29uZmlnO1xuXG5cdFx0XHRpZiAod29ya2Zsb3dDb25maWc/LnRyaWdnZXIpIHtcblx0XHRcdFx0Y29uc3QgdHJpZ2dlclR5cGUgPSBPYmplY3Qua2V5cyh3b3JrZmxvd0NvbmZpZy50cmlnZ2VyKVswXTtcblxuXHRcdFx0XHRpZiAodHJpZ2dlclR5cGUgPT09IFwiY3JvblwiICYmIHdvcmtmbG93Q29uZmlnLnRyaWdnZXIuY3Jvbikge1xuXHRcdFx0XHRcdHdvcmtmbG93cy5wdXNoKHtcblx0XHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0XHRjb25maWc6IHdvcmtmbG93Q29uZmlnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdvcmtmbG93cztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgd29ya2Zsb3cgYnkgcGF0aFxuXHQgKi9cblx0cHJvdGVjdGVkIGdldFdvcmtmbG93QnlQYXRoKHBhdGg6IHN0cmluZyk6IENyb25Xb3JrZmxvd01vZGVsIHwgbnVsbCB7XG5cdFx0Y29uc3Qgd29ya2Zsb3cgPSB0aGlzLm5vZGVNYXAud29ya2Zsb3dzPy5bcGF0aF07XG5cdFx0aWYgKCF3b3JrZmxvdykgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCB3b3JrZmxvd0NvbmZpZyA9ICh3b3JrZmxvdyBhcyB1bmtub3duIGFzIHsgX2NvbmZpZzogQ3JvbldvcmtmbG93TW9kZWxbXCJjb25maWdcIl0gfSkuX2NvbmZpZztcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGF0aCxcblx0XHRcdGNvbmZpZzogd29ya2Zsb3dDb25maWcsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGEgd29ya2Zsb3dcblx0ICovXG5cdHByb3RlY3RlZCBhc3luYyBleGVjdXRlV29ya2Zsb3coXG5cdFx0am9iSWQ6IHN0cmluZyxcblx0XHR3b3JrZmxvdzogQ3JvbldvcmtmbG93TW9kZWwsXG5cdFx0Y29uZmlnOiBDcm9uVHJpZ2dlck9wdHMsXG5cdFx0bWFudWFsOiBib29sZWFuLFxuXHQpOiBQcm9taXNlPFRyaWdnZXJSZXNwb25zZT4ge1xuXHRcdGNvbnN0IHNjaGVkdWxlZEpvYiA9IHRoaXMuam9icy5nZXQoam9iSWQpO1xuXHRcdGlmICghc2NoZWR1bGVkSm9iKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEpvYiBub3QgZm91bmQ6ICR7am9iSWR9YCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIG92ZXJsYXBcblx0XHRpZiAoc2NoZWR1bGVkSm9iLnJ1bm5pbmcgJiYgIXNjaGVkdWxlZEpvYi5vdmVybGFwKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYFNraXBwaW5nICR7am9iSWR9OiBwcmV2aW91cyBleGVjdXRpb24gc3RpbGwgcnVubmluZyAob3ZlcmxhcCBkaXNhYmxlZClgKTtcblx0XHRcdHJldHVybiB7IGN0eDoge30gYXMgQ29udGV4dCwgbWV0cmljczoge30gYXMgTWV0cmljc1R5cGUgfTtcblx0XHR9XG5cblx0XHRjb25zdCBleGVjdXRpb25JZCA9IHV1aWQoKTtcblx0XHRjb25zdCBsYXN0RGF0ZSA9IHNjaGVkdWxlZEpvYi5qb2IubGFzdERhdGUoKTtcblx0XHRjb25zdCBzY2hlZHVsZWRUaW1lID0gbGFzdERhdGUgPyBuZXcgRGF0ZShsYXN0RGF0ZSBhcyB1bmtub3duIGFzIHN0cmluZyB8IG51bWJlcikgOiBuZXcgRGF0ZSgpO1xuXHRcdGNvbnN0IGV4ZWN1dGlvblRpbWUgPSBuZXcgRGF0ZSgpO1xuXG5cdFx0Y29uc3QgZGVmYXVsdE1ldGVyID0gbWV0cmljcy5nZXRNZXRlcihcImRlZmF1bHRcIik7XG5cdFx0Y29uc3QgY3JvbkV4ZWN1dGlvbnMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcImNyb25fZXhlY3V0aW9uc1wiLCB7XG5cdFx0XHRkZXNjcmlwdGlvbjogXCJDcm9uIGpvYiBleGVjdXRpb25zXCIsXG5cdFx0fSk7XG5cdFx0Y29uc3QgY3JvbkVycm9ycyA9IGRlZmF1bHRNZXRlci5jcmVhdGVDb3VudGVyKFwiY3Jvbl9lcnJvcnNcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiQ3JvbiBqb2IgZXhlY3V0aW9uIGVycm9yc1wiLFxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHR0aGlzLnRyYWNlci5zdGFydEFjdGl2ZVNwYW4oYGNyb246JHt3b3JrZmxvdy5wYXRofWAsIGFzeW5jIChzcGFuOiBTcGFuKSA9PiB7XG5cdFx0XHRcdHNjaGVkdWxlZEpvYi5ydW5uaW5nID0gdHJ1ZTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0XHQvLyBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgd29ya2Zsb3dcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uaW5pdCh3b3JrZmxvdy5wYXRoLCB0aGlzLm5vZGVNYXApO1xuXG5cdFx0XHRcdFx0Ly8gQ3JlYXRlIGNvbnRleHRcblx0XHRcdFx0XHRjb25zdCBjdHg6IENvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkLCB3b3JrZmxvdy5wYXRoLCBleGVjdXRpb25JZCk7XG5cblx0XHRcdFx0XHQvLyBDcmVhdGUgZXhlY3V0aW9uIGNvbnRleHRcblx0XHRcdFx0XHRjb25zdCBjcm9uQ29udGV4dDogQ3JvbkV4ZWN1dGlvbkNvbnRleHQgPSB7XG5cdFx0XHRcdFx0XHRqb2JJZCxcblx0XHRcdFx0XHRcdHNjaGVkdWxlZFRpbWUsXG5cdFx0XHRcdFx0XHRleGVjdXRpb25UaW1lLFxuXHRcdFx0XHRcdFx0c2NoZWR1bGU6IGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHRcdHRpbWV6b25lOiBjb25maWcudGltZXpvbmUsXG5cdFx0XHRcdFx0XHRtYW51YWwsXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdC8vIFBvcHVsYXRlIHJlcXVlc3Qgd2l0aCBjcm9uIGNvbnRleHRcblx0XHRcdFx0XHRjdHgucmVxdWVzdCA9IHtcblx0XHRcdFx0XHRcdGJvZHk6IGNyb25Db250ZXh0LFxuXHRcdFx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdFx0XHRcIngtY3Jvbi1qb2ItaWRcIjogam9iSWQsXG5cdFx0XHRcdFx0XHRcdFwieC1jcm9uLXNjaGVkdWxlXCI6IGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHRcdFx0XCJ4LWNyb24tdGltZXpvbmVcIjogY29uZmlnLnRpbWV6b25lLFxuXHRcdFx0XHRcdFx0XHRcIngtY3Jvbi1tYW51YWxcIjogU3RyaW5nKG1hbnVhbCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0cXVlcnk6IHt9LFxuXHRcdFx0XHRcdFx0cGFyYW1zOiB7XG5cdFx0XHRcdFx0XHRcdGpvYklkLFxuXHRcdFx0XHRcdFx0XHRzY2hlZHVsZTogY29uZmlnLnNjaGVkdWxlLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9IGFzIHVua25vd24gYXMgUmVxdWVzdENvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjcm9uIGNvbnRleHQgaW4gdmFyc1xuXHRcdFx0XHRcdGlmICghY3R4LnZhcnMpIGN0eC52YXJzID0ge307XG5cdFx0XHRcdFx0Y3R4LnZhcnMuX2Nyb25fY29udGV4dCA9IHtcblx0XHRcdFx0XHRcdGpvYklkLFxuXHRcdFx0XHRcdFx0c2NoZWR1bGVkVGltZTogc2NoZWR1bGVkVGltZS50b0lTT1N0cmluZygpLFxuXHRcdFx0XHRcdFx0ZXhlY3V0aW9uVGltZTogZXhlY3V0aW9uVGltZS50b0lTT1N0cmluZygpLFxuXHRcdFx0XHRcdFx0c2NoZWR1bGU6IGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHRcdHRpbWV6b25lOiBjb25maWcudGltZXpvbmUsXG5cdFx0XHRcdFx0XHRtYW51YWw6IFN0cmluZyhtYW51YWwpLFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRjdHgubG9nZ2VyLmxvZyhgRXhlY3V0aW5nIGNyb24gam9iOiAke2pvYklkfSAoJHttYW51YWwgPyBcIm1hbnVhbFwiIDogXCJzY2hlZHVsZWRcIn0pYCk7XG5cblx0XHRcdFx0XHQvLyBFeGVjdXRlIHdvcmtmbG93XG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2U6IFRyaWdnZXJSZXNwb25zZSA9IGF3YWl0IHRoaXMucnVuKGN0eCk7XG5cdFx0XHRcdFx0Y29uc3QgZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgam9iIHN0YXRlXG5cdFx0XHRcdFx0c2NoZWR1bGVkSm9iLmxhc3RSdW4gPSBleGVjdXRpb25UaW1lO1xuXHRcdFx0XHRcdHNjaGVkdWxlZEpvYi5uZXh0UnVuID0gdGhpcy50b0RhdGUoc2NoZWR1bGVkSm9iLmpvYi5uZXh0RGF0ZSgpKTtcblxuXHRcdFx0XHRcdC8vIFNldCBzcGFuIGF0dHJpYnV0ZXNcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJqb2JfaWRcIiwgam9iSWQpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwid29ya2Zsb3dfcGF0aFwiLCB3b3JrZmxvdy5wYXRoKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInNjaGVkdWxlXCIsIGNvbmZpZy5zY2hlZHVsZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJ0aW1lem9uZVwiLCBjb25maWcudGltZXpvbmUpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwibWFudWFsXCIsIG1hbnVhbCk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJlbGFwc2VkX21zXCIsIGVuZCAtIHN0YXJ0KTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LIH0pO1xuXG5cdFx0XHRcdFx0Ly8gUmVjb3JkIG1ldHJpY3Ncblx0XHRcdFx0XHRjcm9uRXhlY3V0aW9ucy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdGpvYl9pZDogam9iSWQsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24ubmFtZSxcblx0XHRcdFx0XHRcdG1hbnVhbDogU3RyaW5nKG1hbnVhbCksXG5cdFx0XHRcdFx0XHRzdWNjZXNzOiBcInRydWVcIixcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdGN0eC5sb2dnZXIubG9nKGBDcm9uIGpvYiBjb21wbGV0ZWQgaW4gJHsoZW5kIC0gc3RhcnQpLnRvRml4ZWQoMil9bXM6ICR7am9iSWR9YCk7XG5cblx0XHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2U7XG5cblx0XHRcdFx0XHQvLyBTZXQgc3BhbiBlcnJvclxuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdFx0c3Bhbi5yZWNvcmRFeGNlcHRpb24oZXJyb3IgYXMgRXJyb3IpO1xuXHRcdFx0XHRcdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSB9KTtcblxuXHRcdFx0XHRcdC8vIFJlY29yZCBlcnJvciBtZXRyaWNzXG5cdFx0XHRcdFx0Y3JvbkVycm9ycy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdGpvYl9pZDogam9iSWQsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdFx0XHRtYW51YWw6IFN0cmluZyhtYW51YWwpLFxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENyb24gam9iIGZhaWxlZCAke2pvYklkfTogJHtlcnJvck1lc3NhZ2V9YCwgKGVycm9yIGFzIEVycm9yKS5zdGFjayk7XG5cblx0XHRcdFx0XHRyZXNvbHZlKHsgY3R4OiB7fSBhcyBDb250ZXh0LCBtZXRyaWNzOiB7fSBhcyBNZXRyaWNzVHlwZSB9KTtcblx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRzY2hlZHVsZWRKb2IucnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdHNwYW4uZW5kKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENyb25UcmlnZ2VyO1xuIl19
314
+ export default CronTrigger;
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JvblRyaWdnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQ3JvblRyaWdnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUdILE9BQU8sRUFFTixhQUFhLEVBRWIsT0FBTyxFQUNQLFdBQVcsR0FFWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBYSxjQUFjLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUE0RGxDOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixXQUFZLFNBQVEsV0FBVztJQUMxQyxPQUFPLEdBQWtCLEVBQW1CLENBQUM7SUFDcEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLHVCQUF1QixFQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQ3RDLENBQUM7SUFDaUIsTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDdEMsSUFBSSxHQUE4QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBTXREO1FBQ0MsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7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QUFDO29CQUNoQixNQUFNLFlBQVksR0FBSSxLQUFlLENBQUMsT0FBTyxDQUFDO29CQUU5QyxpQkFBaUI7b0JBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQWMsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7b0JBRXRFLHVCQUF1QjtvQkFDdkIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0JBQ2pCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7d0JBQ3pCLE1BQU0sRUFBRSxLQUFLO3dCQUNiLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxTQUFTO3dCQUNwRCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztxQkFDdEIsQ0FBQyxDQUFDO29CQUVILElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixLQUFLLEtBQUssWUFBWSxFQUFFLEVBQUcsS0FBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUV2RixPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBYSxFQUFFLE9BQU8sRUFBRSxFQUFpQixFQUFFLENBQUMsQ0FBQztnQkFDN0QsQ0FBQzt3QkFBUyxDQUFDO29CQUNWLFlBQVksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO29CQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztZQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Q7QUFFRCxlQUFlLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3JvblRyaWdnZXIgLSBTY2hlZHVsZWQgd29ya2Zsb3cgZXhlY3V0aW9uIGJhc2VkIG9uIGNyb24gZXhwcmVzc2lvbnNcbiAqXG4gKiBFeHRlbmRzIFRyaWdnZXJCYXNlIHRvIHN1cHBvcnQgc2NoZWR1bGVkIHRyaWdnZXJzOlxuICogLSBDcm9uIGV4cHJlc3Npb25zIChlLmcuLCBcIjAgKiAqICogKlwiIGZvciBob3VybHkpXG4gKiAtIFRpbWV6b25lLWF3YXJlIHNjaGVkdWxpbmdcbiAqIC0gT3ZlcmxhcCBwcmV2ZW50aW9uXG4gKiAtIE1hbnVhbCB0cmlnZ2VyIHN1cHBvcnRcbiAqXG4gKiBVc2VzIHRoZSAnY3JvbicgcGFja2FnZSBmb3IgY3JvbiBwYXJzaW5nIGFuZCBzY2hlZHVsaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ3JvblRyaWdnZXJPcHRzLCBIZWxwZXJSZXNwb25zZSB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHtcblx0dHlwZSBCbG9rU2VydmljZSxcblx0RGVmYXVsdExvZ2dlcixcblx0dHlwZSBHbG9iYWxPcHRpb25zLFxuXHROb2RlTWFwLFxuXHRUcmlnZ2VyQmFzZSxcblx0dHlwZSBUcmlnZ2VyUmVzcG9uc2UsXG59IGZyb20gXCJAYmxva2pzL3J1bm5lclwiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0LCBNZXRyaWNzVHlwZSwgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGJsb2tqcy9zaGFyZWRcIjtcbmltcG9ydCB7IHR5cGUgU3BhbiwgU3BhblN0YXR1c0NvZGUsIG1ldHJpY3MsIHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgQ3JvbkpvYiB9IGZyb20gXCJjcm9uXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcblxuLyoqXG4gKiBTY2hlZHVsZWQgam9iIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVkSm9iIHtcblx0LyoqIFVuaXF1ZSBqb2IgSUQgKi9cblx0aWQ6IHN0cmluZztcblx0LyoqIFdvcmtmbG93IHBhdGggKi9cblx0d29ya2Zsb3dQYXRoOiBzdHJpbmc7XG5cdC8qKiBDcm9uIGV4cHJlc3Npb24gKi9cblx0c2NoZWR1bGU6IHN0cmluZztcblx0LyoqIFRpbWV6b25lICovXG5cdHRpbWV6b25lOiBzdHJpbmc7XG5cdC8qKiBBbGxvdyBvdmVybGFwcGluZyBleGVjdXRpb25zICovXG5cdG92ZXJsYXA6IGJvb2xlYW47XG5cdC8qKiBXaGV0aGVyIHRoZSBqb2IgaXMgY3VycmVudGx5IHJ1bm5pbmcgKi9cblx0cnVubmluZzogYm9vbGVhbjtcblx0LyoqIExhc3QgZXhlY3V0aW9uIHRpbWUgKi9cblx0bGFzdFJ1bj86IERhdGU7XG5cdC8qKiBOZXh0IHNjaGVkdWxlZCB0aW1lICovXG5cdG5leHRSdW4/OiBEYXRlO1xuXHQvKiogSW50ZXJuYWwgQ3JvbkpvYiBpbnN0YW5jZSAqL1xuXHRqb2I6IENyb25Kb2I7XG59XG5cbi8qKlxuICogRXhlY3V0aW9uIGNvbnRleHQgcGFzc2VkIHRvIHRoZSB3b3JrZmxvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyb25FeGVjdXRpb25Db250ZXh0IHtcblx0LyoqIEpvYiBJRCAqL1xuXHRqb2JJZDogc3RyaW5nO1xuXHQvKiogU2NoZWR1bGVkIHRpbWUgKHdoZW4gaXQgd2FzIHN1cHBvc2VkIHRvIHJ1bikgKi9cblx0c2NoZWR1bGVkVGltZTogRGF0ZTtcblx0LyoqIEFjdHVhbCBleGVjdXRpb24gdGltZSAqL1xuXHRleGVjdXRpb25UaW1lOiBEYXRlO1xuXHQvKiogQ3JvbiBleHByZXNzaW9uICovXG5cdHNjaGVkdWxlOiBzdHJpbmc7XG5cdC8qKiBUaW1lem9uZSAqL1xuXHR0aW1lem9uZTogc3RyaW5nO1xuXHQvKiogV2hldGhlciB0aGlzIGlzIGEgbWFudWFsIHRyaWdnZXIgKi9cblx0bWFudWFsOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdvcmtmbG93IG1vZGVsIHdpdGggY3JvbiB0cmlnZ2VyIGNvbmZpZ3VyYXRpb25cbiAqL1xuaW50ZXJmYWNlIENyb25Xb3JrZmxvd01vZGVsIHtcblx0cGF0aDogc3RyaW5nO1xuXHRjb25maWc6IHtcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0dmVyc2lvbjogc3RyaW5nO1xuXHRcdHRyaWdnZXI/OiB7XG5cdFx0XHRjcm9uPzogQ3JvblRyaWdnZXJPcHRzO1xuXHRcdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0XHR9O1xuXHRcdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdH07XG59XG5cbi8qKlxuICogQ3JvblRyaWdnZXIgLSBTY2hlZHVsZWQgd29ya2Zsb3cgZXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDcm9uVHJpZ2dlciBleHRlbmRzIFRyaWdnZXJCYXNlIHtcblx0cHJvdGVjdGVkIG5vZGVNYXA6IEdsb2JhbE9wdGlvbnMgPSB7fSBhcyBHbG9iYWxPcHRpb25zO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhY2VyID0gdHJhY2UuZ2V0VHJhY2VyKFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSB8fCBcInRyaWdnZXItY3Jvbi13b3JrZmxvd1wiLFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfVkVSU0lPTiB8fCBcIjAuMC4xXCIsXG5cdCk7XG5cdHByb3RlY3RlZCByZWFkb25seSBsb2dnZXIgPSBuZXcgRGVmYXVsdExvZ2dlcigpO1xuXHRwcm90ZWN0ZWQgam9iczogTWFwPHN0cmluZywgU2NoZWR1bGVkSm9iPiA9IG5ldyBNYXAoKTtcblxuXHQvLyBTdWJjbGFzc2VzIHByb3ZpZGUgdGhlc2Vcblx0cHJvdGVjdGVkIGFic3RyYWN0IG5vZGVzOiBSZWNvcmQ8c3RyaW5nLCBCbG9rU2VydmljZTx1bmtub3duPj47XG5cdHByb3RlY3RlZCBhYnN0cmFjdCB3b3JrZmxvd3M6IFJlY29yZDxzdHJpbmcsIEhlbHBlclJlc3BvbnNlPjtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubG9hZE5vZGVzKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBub2RlcyBpbnRvIHRoZSBub2RlIG1hcFxuXHQgKi9cblx0bG9hZE5vZGVzKCk6IHZvaWQge1xuXHRcdHRoaXMubm9kZU1hcC5ub2RlcyA9IG5ldyBOb2RlTWFwKCk7XG5cdFx0Y29uc3Qgbm9kZUtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBub2RlS2V5cykge1xuXHRcdFx0dGhpcy5ub2RlTWFwLm5vZGVzLmFkZE5vZGUoa2V5LCB0aGlzLm5vZGVzW2tleV0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIHdvcmtmbG93cyBpbnRvIHRoZSB3b3JrZmxvdyBtYXBcblx0ICovXG5cdGxvYWRXb3JrZmxvd3MoKTogdm9pZCB7XG5cdFx0dGhpcy5ub2RlTWFwLndvcmtmbG93cyA9IHRoaXMud29ya2Zsb3dzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnQgY3JvbiBEYXRlVGltZSB0byBEYXRlXG5cdCAqIFRoZSBjcm9uIHBhY2thZ2UgdXNlcyBsdXhvbiBEYXRlVGltZSB3aGljaCBoYXMgdG9KU0RhdGUoKVxuXHQgKi9cblx0cHJvdGVjdGVkIHRvRGF0ZShkYXRlVGltZTogdW5rbm93bik6IERhdGUge1xuXHRcdGlmIChkYXRlVGltZSAmJiB0eXBlb2YgZGF0ZVRpbWUgPT09IFwib2JqZWN0XCIgJiYgXCJ0b0pTRGF0ZVwiIGluIGRhdGVUaW1lKSB7XG5cdFx0XHRyZXR1cm4gKGRhdGVUaW1lIGFzIHsgdG9KU0RhdGU6ICgpID0+IERhdGUgfSkudG9KU0RhdGUoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGRhdGVUaW1lIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGVUaW1lIDogbmV3IERhdGUoZGF0ZVRpbWUgYXMgc3RyaW5nIHwgbnVtYmVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydCB0aGUgY3JvbiBzY2hlZHVsZXIgLSBtYWluIGVudHJ5IHBvaW50XG5cdCAqL1xuXHRhc3luYyBsaXN0ZW4oKTogUHJvbWlzZTxudW1iZXI+IHtcblx0XHRjb25zdCBzdGFydFRpbWUgPSB0aGlzLnN0YXJ0Q291bnRlcigpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIEZpbmQgYWxsIHdvcmtmbG93cyB3aXRoIGNyb24gdHJpZ2dlcnNcblx0XHRcdGNvbnN0IGNyb25Xb3JrZmxvd3MgPSB0aGlzLmdldENyb25Xb3JrZmxvd3MoKTtcblxuXHRcdFx0aWYgKGNyb25Xb3JrZmxvd3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhcIk5vIHdvcmtmbG93cyB3aXRoIGNyb24gdHJpZ2dlcnMgZm91bmRcIik7XG5cdFx0XHRcdHJldHVybiB0aGlzLmVuZENvdW50ZXIoc3RhcnRUaW1lKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ3JlYXRlIGFuZCBzdGFydCBjcm9uIGpvYnMgZm9yIGVhY2ggd29ya2Zsb3dcblx0XHRcdGZvciAoY29uc3Qgd29ya2Zsb3cgb2YgY3JvbldvcmtmbG93cykge1xuXHRcdFx0XHRjb25zdCBjb25maWcgPSB3b3JrZmxvdy5jb25maWcudHJpZ2dlcj8uY3JvbiBhcyBDcm9uVHJpZ2dlck9wdHM7XG5cdFx0XHRcdGNvbnN0IGpvYklkID0gYGNyb24tJHt3b3JrZmxvdy5wYXRofS0ke3V1aWQoKS5zbGljZSgwLCA4KX1gO1xuXG5cdFx0XHRcdC8vIGBDcm9uVHJpZ2dlck9wdHNgIGlzIGB6LmlucHV0POKApj5gIHNvIGB0aW1lem9uZWAgaXMgYHN0cmluZyB8IHVuZGVmaW5lZGBcblx0XHRcdFx0Ly8gZXZlbiB0aG91Z2ggdGhlIHNjaGVtYSBkZWNsYXJlcyBgLmRlZmF1bHQoXCJVVENcIilgLiBBcHBseSB0aGVcblx0XHRcdFx0Ly8gZGVmYXVsdCBvbmNlIGhlcmUgc28gdGhlIHJlc3Qgb2YgdGhpcyBtZXRob2QgKGFuZCB0aGUgY3JvbiBsaWInc1xuXHRcdFx0XHQvLyBjb25zdHJ1Y3Rvcikgc2VlcyBhIGd1YXJhbnRlZWQgc3RyaW5nLlxuXHRcdFx0XHRjb25zdCB0aW1lem9uZSA9IGNvbmZpZy50aW1lem9uZSA/PyBcIlVUQ1wiO1xuXG5cdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgU2NoZWR1bGluZyB3b3JrZmxvdzogJHt3b3JrZmxvdy5wYXRofSB3aXRoIHNjaGVkdWxlOiAke2NvbmZpZy5zY2hlZHVsZX0gKCR7dGltZXpvbmV9KWApO1xuXG5cdFx0XHRcdGNvbnN0IGpvYiA9IG5ldyBDcm9uSm9iKFxuXHRcdFx0XHRcdGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHRhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmV4ZWN1dGVXb3JrZmxvdyhqb2JJZCwgd29ya2Zsb3csIGNvbmZpZywgZmFsc2UpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bnVsbCwgLy8gb25Db21wbGV0ZVxuXHRcdFx0XHRcdGZhbHNlLCAvLyBzdGFydFxuXHRcdFx0XHRcdHRpbWV6b25lLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbnN0IHNjaGVkdWxlZEpvYjogU2NoZWR1bGVkSm9iID0ge1xuXHRcdFx0XHRcdGlkOiBqb2JJZCxcblx0XHRcdFx0XHR3b3JrZmxvd1BhdGg6IHdvcmtmbG93LnBhdGgsXG5cdFx0XHRcdFx0c2NoZWR1bGU6IGNvbmZpZy5zY2hlZHVsZSxcblx0XHRcdFx0XHR0aW1lem9uZSxcblx0XHRcdFx0XHRvdmVybGFwOiBjb25maWcub3ZlcmxhcCA/PyBmYWxzZSxcblx0XHRcdFx0XHRydW5uaW5nOiBmYWxzZSxcblx0XHRcdFx0XHRuZXh0UnVuOiB0aGlzLnRvRGF0ZShqb2IubmV4dERhdGUoKSksXG5cdFx0XHRcdFx0am9iLFxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHRoaXMuam9icy5zZXQoam9iSWQsIHNjaGVkdWxlZEpvYik7XG5cblx0XHRcdFx0Ly8gU3RhcnQgdGhlIGpvYlxuXHRcdFx0XHRqb2Iuc3RhcnQoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKGBKb2IgJHtqb2JJZH0gc3RhcnRlZC4gTmV4dCBydW46ICR7c2NoZWR1bGVkSm9iLm5leHRSdW59YCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgQ3JvbiB0cmlnZ2VyIHN0YXJ0ZWQuICR7dGhpcy5qb2JzLnNpemV9IGpvYihzKSBzY2hlZHVsZWRgKTtcblxuXHRcdFx0Ly8gRW5hYmxlIEhNUiBpbiBkZXZlbG9wbWVudCBtb2RlXG5cdFx0XHRpZiAocHJvY2Vzcy5lbnYuQkxPS19ITVIgPT09IFwidHJ1ZVwiIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5lbmFibGVIb3RSZWxvYWQoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuZW5kQ291bnRlcihzdGFydFRpbWUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHN0YXJ0IGNyb24gdHJpZ2dlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3RvcCBhbGwgY3JvbiBqb2JzXG5cdCAqL1xuXHRhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGZvciAoY29uc3QgW2pvYklkLCBzY2hlZHVsZWRKb2JdIG9mIHRoaXMuam9icykge1xuXHRcdFx0c2NoZWR1bGVkSm9iLmpvYi5zdG9wKCk7XG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYEpvYiAke2pvYklkfSBzdG9wcGVkYCk7XG5cdFx0fVxuXHRcdHRoaXMuam9icy5jbGVhcigpO1xuXHRcdHRoaXMubG9nZ2VyLmxvZyhcIkNyb24gdHJpZ2dlciBzdG9wcGVkXCIpO1xuXHR9XG5cblx0cHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIG9uSG1yV29ya2Zsb3dDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiW0hNUl0gQ3JvbiB3b3JrZmxvdyBjaGFuZ2VkLCByZWxvYWRpbmcuLi5cIik7XG5cdFx0YXdhaXQgdGhpcy53YWl0Rm9ySW5GbGlnaHRSZXF1ZXN0cygpO1xuXHRcdGF3YWl0IHRoaXMuc3RvcCgpO1xuXHRcdHRoaXMubG9hZFdvcmtmbG93cygpO1xuXHRcdGF3YWl0IHRoaXMubGlzdGVuKCk7XG5cdH1cblxuXHQvKipcblx0ICogTWFudWFsbHkgdHJpZ2dlciBhIHNwZWNpZmljIGpvYlxuXHQgKi9cblx0YXN5bmMgdHJpZ2dlckpvYihqb2JJZDogc3RyaW5nKTogUHJvbWlzZTxUcmlnZ2VyUmVzcG9uc2UgfCBudWxsPiB7XG5cdFx0Y29uc3Qgc2NoZWR1bGVkSm9iID0gdGhpcy5qb2JzLmdldChqb2JJZCk7XG5cdFx0aWYgKCFzY2hlZHVsZWRKb2IpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBKb2Igbm90IGZvdW5kOiAke2pvYklkfWApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0IHRoZSB3b3JrZmxvd1xuXHRcdGNvbnN0IHdvcmtmbG93ID0gdGhpcy5nZXRXb3JrZmxvd0J5UGF0aChzY2hlZHVsZWRKb2Iud29ya2Zsb3dQYXRoKTtcblx0XHRpZiAoIXdvcmtmbG93KSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgV29ya2Zsb3cgbm90IGZvdW5kOiAke3NjaGVkdWxlZEpvYi53b3JrZmxvd1BhdGh9YCk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBjb25maWcgPSB3b3JrZmxvdy5jb25maWcudHJpZ2dlcj8uY3JvbiBhcyBDcm9uVHJpZ2dlck9wdHM7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0ZVdvcmtmbG93KGpvYklkLCB3b3JrZmxvdywgY29uZmlnLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYWxsIHNjaGVkdWxlZCBqb2JzXG5cdCAqL1xuXHRnZXRKb2JzKCk6IFNjaGVkdWxlZEpvYltdIHtcblx0XHRyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmpvYnMudmFsdWVzKCkpLm1hcCgoam9iKSA9PiAoe1xuXHRcdFx0Li4uam9iLFxuXHRcdFx0bmV4dFJ1bjogdGhpcy50b0RhdGUoam9iLmpvYi5uZXh0RGF0ZSgpKSxcblx0XHR9KSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFsbCB3b3JrZmxvd3MgdGhhdCBoYXZlIGNyb24gdHJpZ2dlcnNcblx0ICovXG5cdHByb3RlY3RlZCBnZXRDcm9uV29ya2Zsb3dzKCk6IENyb25Xb3JrZmxvd01vZGVsW10ge1xuXHRcdGNvbnN0IHdvcmtmbG93czogQ3JvbldvcmtmbG93TW9kZWxbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBbcGF0aCwgd29ya2Zsb3ddIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMubm9kZU1hcC53b3JrZmxvd3MgfHwge30pKSB7XG5cdFx0XHRjb25zdCB3b3JrZmxvd0NvbmZpZyA9ICh3b3JrZmxvdyBhcyB1bmtub3duIGFzIHsgX2NvbmZpZzogQ3JvbldvcmtmbG93TW9kZWxbXCJjb25maWdcIl0gfSkuX2NvbmZpZztcblxuXHRcdFx0aWYgKHdvcmtmbG93Q29uZmlnPy50cmlnZ2VyKSB7XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJUeXBlID0gT2JqZWN0LmtleXMod29ya2Zsb3dDb25maWcudHJpZ2dlcilbMF07XG5cblx0XHRcdFx0aWYgKHRyaWdnZXJUeXBlID09PSBcImNyb25cIiAmJiB3b3JrZmxvd0NvbmZpZy50cmlnZ2VyLmNyb24pIHtcblx0XHRcdFx0XHR3b3JrZmxvd3MucHVzaCh7XG5cdFx0XHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRcdFx0Y29uZmlnOiB3b3JrZmxvd0NvbmZpZyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB3b3JrZmxvd3M7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHdvcmtmbG93IGJ5IHBhdGhcblx0ICovXG5cdHByb3RlY3RlZCBnZXRXb3JrZmxvd0J5UGF0aChwYXRoOiBzdHJpbmcpOiBDcm9uV29ya2Zsb3dNb2RlbCB8IG51bGwge1xuXHRcdGNvbnN0IHdvcmtmbG93ID0gdGhpcy5ub2RlTWFwLndvcmtmbG93cz8uW3BhdGhdO1xuXHRcdGlmICghd29ya2Zsb3cpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3Qgd29ya2Zsb3dDb25maWcgPSAod29ya2Zsb3cgYXMgdW5rbm93biBhcyB7IF9jb25maWc6IENyb25Xb3JrZmxvd01vZGVsW1wiY29uZmlnXCJdIH0pLl9jb25maWc7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHBhdGgsXG5cdFx0XHRjb25maWc6IHdvcmtmbG93Q29uZmlnLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIHdvcmtmbG93XG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgZXhlY3V0ZVdvcmtmbG93KFxuXHRcdGpvYklkOiBzdHJpbmcsXG5cdFx0d29ya2Zsb3c6IENyb25Xb3JrZmxvd01vZGVsLFxuXHRcdGNvbmZpZzogQ3JvblRyaWdnZXJPcHRzLFxuXHRcdG1hbnVhbDogYm9vbGVhbixcblx0KTogUHJvbWlzZTxUcmlnZ2VyUmVzcG9uc2U+IHtcblx0XHRjb25zdCBzY2hlZHVsZWRKb2IgPSB0aGlzLmpvYnMuZ2V0KGpvYklkKTtcblx0XHRpZiAoIXNjaGVkdWxlZEpvYikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBKb2Igbm90IGZvdW5kOiAke2pvYklkfWApO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBvdmVybGFwXG5cdFx0aWYgKHNjaGVkdWxlZEpvYi5ydW5uaW5nICYmICFzY2hlZHVsZWRKb2Iub3ZlcmxhcCkge1xuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBTa2lwcGluZyAke2pvYklkfTogcHJldmlvdXMgZXhlY3V0aW9uIHN0aWxsIHJ1bm5pbmcgKG92ZXJsYXAgZGlzYWJsZWQpYCk7XG5cdFx0XHRyZXR1cm4geyBjdHg6IHt9IGFzIENvbnRleHQsIG1ldHJpY3M6IHt9IGFzIE1ldHJpY3NUeXBlIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgZXhlY3V0aW9uSWQgPSB1dWlkKCk7XG5cdFx0Y29uc3QgbGFzdERhdGUgPSBzY2hlZHVsZWRKb2Iuam9iLmxhc3REYXRlKCk7XG5cdFx0Y29uc3Qgc2NoZWR1bGVkVGltZSA9IGxhc3REYXRlID8gbmV3IERhdGUobGFzdERhdGUgYXMgdW5rbm93biBhcyBzdHJpbmcgfCBudW1iZXIpIDogbmV3IERhdGUoKTtcblx0XHRjb25zdCBleGVjdXRpb25UaW1lID0gbmV3IERhdGUoKTtcblxuXHRcdC8vIEFwcGx5IHRoZSBzY2hlbWEgZGVmYXVsdCDigJQgc2VlIGV4cGxhbmF0aW9uIGluIGBsaXN0ZW4oKWAuXG5cdFx0Y29uc3QgdGltZXpvbmUgPSBjb25maWcudGltZXpvbmUgPz8gXCJVVENcIjtcblxuXHRcdGNvbnN0IGRlZmF1bHRNZXRlciA9IG1ldHJpY3MuZ2V0TWV0ZXIoXCJkZWZhdWx0XCIpO1xuXHRcdGNvbnN0IGNyb25FeGVjdXRpb25zID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJjcm9uX2V4ZWN1dGlvbnNcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiQ3JvbiBqb2IgZXhlY3V0aW9uc1wiLFxuXHRcdH0pO1xuXHRcdGNvbnN0IGNyb25FcnJvcnMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcImNyb25fZXJyb3JzXCIsIHtcblx0XHRcdGRlc2NyaXB0aW9uOiBcIkNyb24gam9iIGV4ZWN1dGlvbiBlcnJvcnNcIixcblx0XHR9KTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy50cmFjZXIuc3RhcnRBY3RpdmVTcGFuKGBjcm9uOiR7d29ya2Zsb3cucGF0aH1gLCBhc3luYyAoc3BhbjogU3BhbikgPT4ge1xuXHRcdFx0XHRzY2hlZHVsZWRKb2IucnVubmluZyA9IHRydWU7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG5cdFx0XHRcdFx0Ly8gSW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHdvcmtmbG93XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmluaXQod29ya2Zsb3cucGF0aCwgdGhpcy5ub2RlTWFwKTtcblxuXHRcdFx0XHRcdC8vIENyZWF0ZSBjb250ZXh0XG5cdFx0XHRcdFx0Y29uc3QgY3R4OiBDb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCwgd29ya2Zsb3cucGF0aCwgZXhlY3V0aW9uSWQpO1xuXG5cdFx0XHRcdFx0Ly8gQ3JlYXRlIGV4ZWN1dGlvbiBjb250ZXh0XG5cdFx0XHRcdFx0Y29uc3QgY3JvbkNvbnRleHQ6IENyb25FeGVjdXRpb25Db250ZXh0ID0ge1xuXHRcdFx0XHRcdFx0am9iSWQsXG5cdFx0XHRcdFx0XHRzY2hlZHVsZWRUaW1lLFxuXHRcdFx0XHRcdFx0ZXhlY3V0aW9uVGltZSxcblx0XHRcdFx0XHRcdHNjaGVkdWxlOiBjb25maWcuc2NoZWR1bGUsXG5cdFx0XHRcdFx0XHR0aW1lem9uZSxcblx0XHRcdFx0XHRcdG1hbnVhbCxcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Ly8gUG9wdWxhdGUgcmVxdWVzdCB3aXRoIGNyb24gY29udGV4dFxuXHRcdFx0XHRcdGN0eC5yZXF1ZXN0ID0ge1xuXHRcdFx0XHRcdFx0Ym9keTogY3JvbkNvbnRleHQsXG5cdFx0XHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0XHRcdFwieC1jcm9uLWpvYi1pZFwiOiBqb2JJZCxcblx0XHRcdFx0XHRcdFx0XCJ4LWNyb24tc2NoZWR1bGVcIjogY29uZmlnLnNjaGVkdWxlLFxuXHRcdFx0XHRcdFx0XHRcIngtY3Jvbi10aW1lem9uZVwiOiBjb25maWcudGltZXpvbmUsXG5cdFx0XHRcdFx0XHRcdFwieC1jcm9uLW1hbnVhbFwiOiBTdHJpbmcobWFudWFsKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRxdWVyeToge30sXG5cdFx0XHRcdFx0XHRwYXJhbXM6IHtcblx0XHRcdFx0XHRcdFx0am9iSWQsXG5cdFx0XHRcdFx0XHRcdHNjaGVkdWxlOiBjb25maWcuc2NoZWR1bGUsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0gYXMgdW5rbm93biBhcyBSZXF1ZXN0Q29udGV4dDtcblxuXHRcdFx0XHRcdC8vIFN0b3JlIGNyb24gY29udGV4dCBpbiB2YXJzXG5cdFx0XHRcdFx0aWYgKCFjdHgudmFycykgY3R4LnZhcnMgPSB7fTtcblx0XHRcdFx0XHRjdHgudmFycy5fY3Jvbl9jb250ZXh0ID0ge1xuXHRcdFx0XHRcdFx0am9iSWQsXG5cdFx0XHRcdFx0XHRzY2hlZHVsZWRUaW1lOiBzY2hlZHVsZWRUaW1lLnRvSVNPU3RyaW5nKCksXG5cdFx0XHRcdFx0XHRleGVjdXRpb25UaW1lOiBleGVjdXRpb25UaW1lLnRvSVNPU3RyaW5nKCksXG5cdFx0XHRcdFx0XHRzY2hlZHVsZTogY29uZmlnLnNjaGVkdWxlLFxuXHRcdFx0XHRcdFx0dGltZXpvbmU6IGNvbmZpZy50aW1lem9uZSxcblx0XHRcdFx0XHRcdG1hbnVhbDogU3RyaW5nKG1hbnVhbCksXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGN0eC5sb2dnZXIubG9nKGBFeGVjdXRpbmcgY3JvbiBqb2I6ICR7am9iSWR9ICgke21hbnVhbCA/IFwibWFudWFsXCIgOiBcInNjaGVkdWxlZFwifSlgKTtcblxuXHRcdFx0XHRcdC8vIHYwLjYgwrcgYXBwbHkgdGhlIG1lcmdlZCBtaWRkbGV3YXJlIGNoYWluIChwcm9jZXNzLWdsb2JhbCDihpJcblx0XHRcdFx0XHQvLyB3b3JrZmxvdy1sZXZlbCDihpIgdHJpZ2dlci1sZXZlbCkgYmVmb3JlIHRoZSBtYWluIHdvcmtmbG93XG5cdFx0XHRcdFx0Ly8gYm9keS4gTGV0cyBjcm9uIHdvcmtmbG93cyBjb21wb3NlIGF1dGgtY2hlY2sgKyBhdWRpdC1sb2dcblx0XHRcdFx0XHQvLyBjaGFpbnMgZXhhY3RseSBsaWtlIEhUVFAgdHJpZ2dlcnMuIEEgdGhyb3dpbmcgbWlkZGxld2FyZVxuXHRcdFx0XHRcdC8vIHByb3BhZ2F0ZXMgdG8gdGhlIG91dGVyIGNhdGNoIGFuZCBzdXJmYWNlcyBhcyBhIGNyb24gam9iXG5cdFx0XHRcdFx0Ly8gZmFpbHVyZS5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmFwcGx5TWlkZGxld2FyZUNoYWluKGN0eCwgdGhpcy5ub2RlTWFwKTtcblxuXHRcdFx0XHRcdC8vIEV4ZWN1dGUgd29ya2Zsb3dcblx0XHRcdFx0XHRjb25zdCByZXNwb25zZTogVHJpZ2dlclJlc3BvbnNlID0gYXdhaXQgdGhpcy5ydW4oY3R4KTtcblx0XHRcdFx0XHRjb25zdCBlbmQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuXHRcdFx0XHRcdC8vIFVwZGF0ZSBqb2Igc3RhdGVcblx0XHRcdFx0XHRzY2hlZHVsZWRKb2IubGFzdFJ1biA9IGV4ZWN1dGlvblRpbWU7XG5cdFx0XHRcdFx0c2NoZWR1bGVkSm9iLm5leHRSdW4gPSB0aGlzLnRvRGF0ZShzY2hlZHVsZWRKb2Iuam9iLm5leHREYXRlKCkpO1xuXG5cdFx0XHRcdFx0Ly8gU2V0IHNwYW4gYXR0cmlidXRlc1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCB0cnVlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImpvYl9pZFwiLCBqb2JJZCk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJ3b3JrZmxvd19wYXRoXCIsIHdvcmtmbG93LnBhdGgpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic2NoZWR1bGVcIiwgY29uZmlnLnNjaGVkdWxlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInRpbWV6b25lXCIsIHRpbWV6b25lKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcIm1hbnVhbFwiLCBtYW51YWwpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiZWxhcHNlZF9tc1wiLCBlbmQgLSBzdGFydCk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSyB9KTtcblxuXHRcdFx0XHRcdC8vIFJlY29yZCBtZXRyaWNzXG5cdFx0XHRcdFx0Y3JvbkV4ZWN1dGlvbnMuYWRkKDEsIHtcblx0XHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0XHRqb2JfaWQ6IGpvYklkLFxuXHRcdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogdGhpcy5jb25maWd1cmF0aW9uLm5hbWUsXG5cdFx0XHRcdFx0XHRtYW51YWw6IFN0cmluZyhtYW51YWwpLFxuXHRcdFx0XHRcdFx0c3VjY2VzczogXCJ0cnVlXCIsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRjdHgubG9nZ2VyLmxvZyhgQ3JvbiBqb2IgY29tcGxldGVkIGluICR7KGVuZCAtIHN0YXJ0KS50b0ZpeGVkKDIpfW1zOiAke2pvYklkfWApO1xuXG5cdFx0XHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlO1xuXG5cdFx0XHRcdFx0Ly8gU2V0IHNwYW4gZXJyb3Jcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdHNwYW4ucmVjb3JkRXhjZXB0aW9uKGVycm9yIGFzIEVycm9yKTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLCBtZXNzYWdlOiBlcnJvck1lc3NhZ2UgfSk7XG5cblx0XHRcdFx0XHQvLyBSZWNvcmQgZXJyb3IgbWV0cmljc1xuXHRcdFx0XHRcdGNyb25FcnJvcnMuYWRkKDEsIHtcblx0XHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0XHRqb2JfaWQ6IGpvYklkLFxuXHRcdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogdGhpcy5jb25maWd1cmF0aW9uPy5uYW1lIHx8IFwidW5rbm93blwiLFxuXHRcdFx0XHRcdFx0bWFudWFsOiBTdHJpbmcobWFudWFsKSxcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBDcm9uIGpvYiBmYWlsZWQgJHtqb2JJZH06ICR7ZXJyb3JNZXNzYWdlfWAsIChlcnJvciBhcyBFcnJvcikuc3RhY2spO1xuXG5cdFx0XHRcdFx0cmVzb2x2ZSh7IGN0eDoge30gYXMgQ29udGV4dCwgbWV0cmljczoge30gYXMgTWV0cmljc1R5cGUgfSk7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0c2NoZWR1bGVkSm9iLnJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRzcGFuLmVuZCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBDcm9uVHJpZ2dlcjtcbiJdfQ==
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @blok/trigger-cron
2
+ * @blokjs/trigger-cron
3
3
  *
4
4
  * Cron/scheduled trigger for Blok workflows.
5
5
  * Execute workflows on a schedule using cron expressions.
@@ -13,7 +13,7 @@
13
13
  *
14
14
  * @example
15
15
  * ```typescript
16
- * import { CronTrigger } from "@blok/trigger-cron";
16
+ * import { CronTrigger } from "@blokjs/trigger-cron";
17
17
  *
18
18
  * class MyCronTrigger extends CronTrigger {
19
19
  * protected nodes = myNodes;
@@ -61,4 +61,4 @@
61
61
  * - "0 0 1 * *" - First day of every month
62
62
  */
63
63
  export { CronTrigger, type ScheduledJob, type CronExecutionContext, } from "./CronTrigger";
64
- export type { CronTriggerOpts } from "@blok/helper";
64
+ export type { CronTriggerOpts } from "@blokjs/helper";
package/dist/index.js CHANGED
@@ -1,6 +1,5 @@
1
- "use strict";
2
1
  /**
3
- * @blok/trigger-cron
2
+ * @blokjs/trigger-cron
4
3
  *
5
4
  * Cron/scheduled trigger for Blok workflows.
6
5
  * Execute workflows on a schedule using cron expressions.
@@ -14,7 +13,7 @@
14
13
  *
15
14
  * @example
16
15
  * ```typescript
17
- * import { CronTrigger } from "@blok/trigger-cron";
16
+ * import { CronTrigger } from "@blokjs/trigger-cron";
18
17
  *
19
18
  * class MyCronTrigger extends CronTrigger {
20
19
  * protected nodes = myNodes;
@@ -61,9 +60,6 @@
61
60
  * - "0 0 * * 0" - Every Sunday at midnight
62
61
  * - "0 0 1 * *" - First day of every month
63
62
  */
64
- Object.defineProperty(exports, "__esModule", { value: true });
65
- exports.CronTrigger = void 0;
66
63
  // Core exports
67
- var CronTrigger_1 = require("./CronTrigger");
68
- Object.defineProperty(exports, "CronTrigger", { enumerable: true, get: function () { return CronTrigger_1.CronTrigger; } });
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRHOzs7QUFFSCxlQUFlO0FBQ2YsNkNBSXVCO0FBSHRCLDBHQUFBLFdBQVcsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGJsb2svdHJpZ2dlci1jcm9uXG4gKlxuICogQ3Jvbi9zY2hlZHVsZWQgdHJpZ2dlciBmb3IgQmxvayB3b3JrZmxvd3MuXG4gKiBFeGVjdXRlIHdvcmtmbG93cyBvbiBhIHNjaGVkdWxlIHVzaW5nIGNyb24gZXhwcmVzc2lvbnMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIFN0YW5kYXJkIGNyb24gZXhwcmVzc2lvbiBzeW50YXhcbiAqIC0gVGltZXpvbmUtYXdhcmUgc2NoZWR1bGluZ1xuICogLSBPdmVybGFwIHByZXZlbnRpb25cbiAqIC0gTWFudWFsIHRyaWdnZXIgc3VwcG9ydFxuICogLSBKb2IgbWFuYWdlbWVudCBBUElcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ3JvblRyaWdnZXIgfSBmcm9tIFwiQGJsb2svdHJpZ2dlci1jcm9uXCI7XG4gKlxuICogY2xhc3MgTXlDcm9uVHJpZ2dlciBleHRlbmRzIENyb25UcmlnZ2VyIHtcbiAqICAgcHJvdGVjdGVkIG5vZGVzID0gbXlOb2RlcztcbiAqICAgcHJvdGVjdGVkIHdvcmtmbG93cyA9IG15V29ya2Zsb3dzO1xuICogfVxuICpcbiAqIGNvbnN0IHRyaWdnZXIgPSBuZXcgTXlDcm9uVHJpZ2dlcigpO1xuICogYXdhaXQgdHJpZ2dlci5saXN0ZW4oKTtcbiAqXG4gKiAvLyBMaXN0IGFsbCBzY2hlZHVsZWQgam9ic1xuICogY29uc3Qgam9icyA9IHRyaWdnZXIuZ2V0Sm9icygpO1xuICpcbiAqIC8vIE1hbnVhbGx5IHRyaWdnZXIgYSBqb2JcbiAqIGF3YWl0IHRyaWdnZXIudHJpZ2dlckpvYihcImNyb24tbXktd29ya2Zsb3ctYWJjMTIzXCIpO1xuICogYGBgXG4gKlxuICogV29ya2Zsb3cgRGVmaW5pdGlvbjpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIFdvcmtmbG93KHsgbmFtZTogXCJkYWlseS1jbGVhbnVwXCIsIHZlcnNpb246IFwiMS4wLjBcIiB9KVxuICogICAuYWRkVHJpZ2dlcihcImNyb25cIiwge1xuICogICAgIHNjaGVkdWxlOiBcIjAgMiAqICogKlwiLCAgLy8gUnVuIGF0IDIgQU0gZGFpbHlcbiAqICAgICB0aW1lem9uZTogXCJBbWVyaWNhL05ld19Zb3JrXCIsXG4gKiAgICAgb3ZlcmxhcDogZmFsc2UsXG4gKiAgIH0pXG4gKiAgIC5hZGRTdGVwKHsgLi4uIH0pO1xuICogYGBgXG4gKlxuICogQ3JvbiBFeHByZXNzaW9uIEZvcm1hdDpcbiAqIGBgYFxuICogKiAqICogKiAqICpcbiAqIOKUgiDilIIg4pSCIOKUgiDilIIg4pSCXG4gKiDilIIg4pSCIOKUgiDilIIg4pSCIOKUlOKUgOKUgCBEYXkgb2Ygd2VlayAoMC03LCBTdW49MCw3KVxuICog4pSCIOKUgiDilIIg4pSCIOKUlOKUgOKUgOKUgOKUgCBNb250aCAoMS0xMilcbiAqIOKUgiDilIIg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgCBEYXkgb2YgbW9udGggKDEtMzEpXG4gKiDilIIg4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBIb3VyICgwLTIzKVxuICog4pSCIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBNaW51dGUgKDAtNTkpXG4gKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgU2Vjb25kICgwLTU5LCBvcHRpb25hbClcbiAqIGBgYFxuICpcbiAqIENvbW1vbiBzY2hlZHVsZXM6XG4gKiAtIFwiKiAqICogKiAqXCIgLSBFdmVyeSBtaW51dGVcbiAqIC0gXCIwICogKiAqICpcIiAtIEV2ZXJ5IGhvdXJcbiAqIC0gXCIwIDAgKiAqICpcIiAtIEV2ZXJ5IGRheSBhdCBtaWRuaWdodFxuICogLSBcIjAgMCAqICogMFwiIC0gRXZlcnkgU3VuZGF5IGF0IG1pZG5pZ2h0XG4gKiAtIFwiMCAwIDEgKiAqXCIgLSBGaXJzdCBkYXkgb2YgZXZlcnkgbW9udGhcbiAqL1xuXG4vLyBDb3JlIGV4cG9ydHNcbmV4cG9ydCB7XG5cdENyb25UcmlnZ2VyLFxuXHR0eXBlIFNjaGVkdWxlZEpvYixcblx0dHlwZSBDcm9uRXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4vQ3JvblRyaWdnZXJcIjtcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZyb20gaGVscGVyIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBDcm9uVHJpZ2dlck9wdHMgfSBmcm9tIFwiQGJsb2svaGVscGVyXCI7XG4iXX0=
64
+ export { CronTrigger, } from "./CronTrigger";
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2REc7QUFFSCxlQUFlO0FBQ2YsT0FBTyxFQUNOLFdBQVcsR0FHWCxNQUFNLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGJsb2tqcy90cmlnZ2VyLWNyb25cbiAqXG4gKiBDcm9uL3NjaGVkdWxlZCB0cmlnZ2VyIGZvciBCbG9rIHdvcmtmbG93cy5cbiAqIEV4ZWN1dGUgd29ya2Zsb3dzIG9uIGEgc2NoZWR1bGUgdXNpbmcgY3JvbiBleHByZXNzaW9ucy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gU3RhbmRhcmQgY3JvbiBleHByZXNzaW9uIHN5bnRheFxuICogLSBUaW1lem9uZS1hd2FyZSBzY2hlZHVsaW5nXG4gKiAtIE92ZXJsYXAgcHJldmVudGlvblxuICogLSBNYW51YWwgdHJpZ2dlciBzdXBwb3J0XG4gKiAtIEpvYiBtYW5hZ2VtZW50IEFQSVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBDcm9uVHJpZ2dlciB9IGZyb20gXCJAYmxva2pzL3RyaWdnZXItY3JvblwiO1xuICpcbiAqIGNsYXNzIE15Q3JvblRyaWdnZXIgZXh0ZW5kcyBDcm9uVHJpZ2dlciB7XG4gKiAgIHByb3RlY3RlZCBub2RlcyA9IG15Tm9kZXM7XG4gKiAgIHByb3RlY3RlZCB3b3JrZmxvd3MgPSBteVdvcmtmbG93cztcbiAqIH1cbiAqXG4gKiBjb25zdCB0cmlnZ2VyID0gbmV3IE15Q3JvblRyaWdnZXIoKTtcbiAqIGF3YWl0IHRyaWdnZXIubGlzdGVuKCk7XG4gKlxuICogLy8gTGlzdCBhbGwgc2NoZWR1bGVkIGpvYnNcbiAqIGNvbnN0IGpvYnMgPSB0cmlnZ2VyLmdldEpvYnMoKTtcbiAqXG4gKiAvLyBNYW51YWxseSB0cmlnZ2VyIGEgam9iXG4gKiBhd2FpdCB0cmlnZ2VyLnRyaWdnZXJKb2IoXCJjcm9uLW15LXdvcmtmbG93LWFiYzEyM1wiKTtcbiAqIGBgYFxuICpcbiAqIFdvcmtmbG93IERlZmluaXRpb246XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBXb3JrZmxvdyh7IG5hbWU6IFwiZGFpbHktY2xlYW51cFwiLCB2ZXJzaW9uOiBcIjEuMC4wXCIgfSlcbiAqICAgLmFkZFRyaWdnZXIoXCJjcm9uXCIsIHtcbiAqICAgICBzY2hlZHVsZTogXCIwIDIgKiAqICpcIiwgIC8vIFJ1biBhdCAyIEFNIGRhaWx5XG4gKiAgICAgdGltZXpvbmU6IFwiQW1lcmljYS9OZXdfWW9ya1wiLFxuICogICAgIG92ZXJsYXA6IGZhbHNlLFxuICogICB9KVxuICogICAuYWRkU3RlcCh7IC4uLiB9KTtcbiAqIGBgYFxuICpcbiAqIENyb24gRXhwcmVzc2lvbiBGb3JtYXQ6XG4gKiBgYGBcbiAqICogKiAqICogKiAqXG4gKiDilIIg4pSCIOKUgiDilIIg4pSCIOKUglxuICog4pSCIOKUgiDilIIg4pSCIOKUgiDilJTilIDilIAgRGF5IG9mIHdlZWsgKDAtNywgU3VuPTAsNylcbiAqIOKUgiDilIIg4pSCIOKUgiDilJTilIDilIDilIDilIAgTW9udGggKDEtMTIpXG4gKiDilIIg4pSCIOKUgiDilJTilIDilIDilIDilIDilIDilIAgRGF5IG9mIG1vbnRoICgxLTMxKVxuICog4pSCIOKUgiDilJTilIDilIDilIDilIDilIDilIDilIDilIAgSG91ciAoMC0yMylcbiAqIOKUgiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgTWludXRlICgwLTU5KVxuICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFNlY29uZCAoMC01OSwgb3B0aW9uYWwpXG4gKiBgYGBcbiAqXG4gKiBDb21tb24gc2NoZWR1bGVzOlxuICogLSBcIiogKiAqICogKlwiIC0gRXZlcnkgbWludXRlXG4gKiAtIFwiMCAqICogKiAqXCIgLSBFdmVyeSBob3VyXG4gKiAtIFwiMCAwICogKiAqXCIgLSBFdmVyeSBkYXkgYXQgbWlkbmlnaHRcbiAqIC0gXCIwIDAgKiAqIDBcIiAtIEV2ZXJ5IFN1bmRheSBhdCBtaWRuaWdodFxuICogLSBcIjAgMCAxICogKlwiIC0gRmlyc3QgZGF5IG9mIGV2ZXJ5IG1vbnRoXG4gKi9cblxuLy8gQ29yZSBleHBvcnRzXG5leHBvcnQge1xuXHRDcm9uVHJpZ2dlcixcblx0dHlwZSBTY2hlZHVsZWRKb2IsXG5cdHR5cGUgQ3JvbkV4ZWN1dGlvbkNvbnRleHQsXG59IGZyb20gXCIuL0Nyb25UcmlnZ2VyXCI7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIGhlbHBlciBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHsgQ3JvblRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blokjs/trigger-cron",
3
- "version": "0.2.0",
3
+ "version": "0.6.1",
4
4
  "description": "Cron/scheduled trigger for Blok workflows - supports cron expressions and interval-based scheduling",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -14,9 +14,9 @@
14
14
  "author": "Deskree Technologies Inc.",
15
15
  "license": "Apache-2.0",
16
16
  "dependencies": {
17
- "@blokjs/helper": "workspace:*",
18
- "@blokjs/runner": "workspace:*",
19
- "@blokjs/shared": "workspace:*",
17
+ "@blokjs/helper": "^0.6.1",
18
+ "@blokjs/runner": "^0.6.1",
19
+ "@blokjs/shared": "^0.6.1",
20
20
  "@opentelemetry/api": "^1.9.0",
21
21
  "cron": "^4.4.0",
22
22
  "uuid": "^11.1.0"
@@ -12,9 +12,9 @@
12
12
 
13
13
  import type { CronTriggerOpts, HelperResponse } from "@blokjs/helper";
14
14
  import {
15
+ type BlokService,
15
16
  DefaultLogger,
16
17
  type GlobalOptions,
17
- type BlokService,
18
18
  NodeMap,
19
19
  TriggerBase,
20
20
  type TriggerResponse,
@@ -153,7 +153,13 @@ export abstract class CronTrigger extends TriggerBase {
153
153
  const config = workflow.config.trigger?.cron as CronTriggerOpts;
154
154
  const jobId = `cron-${workflow.path}-${uuid().slice(0, 8)}`;
155
155
 
156
- this.logger.log(`Scheduling workflow: ${workflow.path} with schedule: ${config.schedule} (${config.timezone})`);
156
+ // `CronTriggerOpts` is `z.input<…>` so `timezone` is `string | undefined`
157
+ // even though the schema declares `.default("UTC")`. Apply the
158
+ // default once here so the rest of this method (and the cron lib's
159
+ // constructor) sees a guaranteed string.
160
+ const timezone = config.timezone ?? "UTC";
161
+
162
+ this.logger.log(`Scheduling workflow: ${workflow.path} with schedule: ${config.schedule} (${timezone})`);
157
163
 
158
164
  const job = new CronJob(
159
165
  config.schedule,
@@ -162,14 +168,14 @@ export abstract class CronTrigger extends TriggerBase {
162
168
  },
163
169
  null, // onComplete
164
170
  false, // start
165
- config.timezone,
171
+ timezone,
166
172
  );
167
173
 
168
174
  const scheduledJob: ScheduledJob = {
169
175
  id: jobId,
170
176
  workflowPath: workflow.path,
171
177
  schedule: config.schedule,
172
- timezone: config.timezone,
178
+ timezone,
173
179
  overlap: config.overlap ?? false,
174
180
  running: false,
175
181
  nextRun: this.toDate(job.nextDate()),
@@ -311,6 +317,9 @@ export abstract class CronTrigger extends TriggerBase {
311
317
  const scheduledTime = lastDate ? new Date(lastDate as unknown as string | number) : new Date();
312
318
  const executionTime = new Date();
313
319
 
320
+ // Apply the schema default — see explanation in `listen()`.
321
+ const timezone = config.timezone ?? "UTC";
322
+
314
323
  const defaultMeter = metrics.getMeter("default");
315
324
  const cronExecutions = defaultMeter.createCounter("cron_executions", {
316
325
  description: "Cron job executions",
@@ -338,7 +347,7 @@ export abstract class CronTrigger extends TriggerBase {
338
347
  scheduledTime,
339
348
  executionTime,
340
349
  schedule: config.schedule,
341
- timezone: config.timezone,
350
+ timezone,
342
351
  manual,
343
352
  };
344
353
 
@@ -371,6 +380,14 @@ export abstract class CronTrigger extends TriggerBase {
371
380
 
372
381
  ctx.logger.log(`Executing cron job: ${jobId} (${manual ? "manual" : "scheduled"})`);
373
382
 
383
+ // v0.6 · apply the merged middleware chain (process-global →
384
+ // workflow-level → trigger-level) before the main workflow
385
+ // body. Lets cron workflows compose auth-check + audit-log
386
+ // chains exactly like HTTP triggers. A throwing middleware
387
+ // propagates to the outer catch and surfaces as a cron job
388
+ // failure.
389
+ await this.applyMiddlewareChain(ctx, this.nodeMap);
390
+
374
391
  // Execute workflow
375
392
  const response: TriggerResponse = await this.run(ctx);
376
393
  const end = performance.now();
@@ -384,7 +401,7 @@ export abstract class CronTrigger extends TriggerBase {
384
401
  span.setAttribute("job_id", jobId);
385
402
  span.setAttribute("workflow_path", workflow.path);
386
403
  span.setAttribute("schedule", config.schedule);
387
- span.setAttribute("timezone", config.timezone);
404
+ span.setAttribute("timezone", timezone);
388
405
  span.setAttribute("manual", manual);
389
406
  span.setAttribute("elapsed_ms", end - start);
390
407
  span.setStatus({ code: SpanStatusCode.OK });