@inkeep/agents-api 0.0.0-dev-20260216002643 → 0.0.0-dev-20260216012253

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.
Files changed (36) hide show
  1. package/dist/.well-known/workflow/v1/flow.cjs +52 -52
  2. package/dist/.well-known/workflow/v1/flow.cjs.debug.json +2 -2
  3. package/dist/.well-known/workflow/v1/manifest.json +20 -20
  4. package/dist/.well-known/workflow/v1/step.cjs.debug.json +2 -2
  5. package/dist/createApp.d.ts +2 -2
  6. package/dist/createApp.js +22 -0
  7. package/dist/data/db/manageDbClient.d.ts +2 -2
  8. package/dist/data/db/runDbClient.d.ts +2 -2
  9. package/dist/domains/evals/routes/datasetTriggers.d.ts +2 -2
  10. package/dist/domains/evals/routes/index.d.ts +2 -2
  11. package/dist/domains/evals/workflow/routes.d.ts +2 -2
  12. package/dist/domains/manage/routes/availableAgents.d.ts +2 -2
  13. package/dist/domains/manage/routes/conversations.d.ts +2 -2
  14. package/dist/domains/manage/routes/index.d.ts +2 -2
  15. package/dist/domains/manage/routes/mcp.d.ts +2 -2
  16. package/dist/domains/manage/routes/passwordResetLinks.d.ts +2 -2
  17. package/dist/domains/manage/routes/signoz.d.ts +2 -2
  18. package/dist/domains/manage/routes/users.d.ts +2 -2
  19. package/dist/domains/mcp/routes/mcp.d.ts +2 -2
  20. package/dist/domains/run/agents/relationTools.d.ts +2 -2
  21. package/dist/domains/run/tools/distill-conversation-history-tool.d.ts +1 -1
  22. package/dist/domains/run/types/chat.d.ts +4 -4
  23. package/dist/domains/run/workflow/steps/scheduledTriggerSteps.d.ts +5 -5
  24. package/dist/env.d.ts +2 -2
  25. package/dist/factory.d.ts +3 -3
  26. package/dist/index.d.ts +2 -2
  27. package/dist/middleware/evalsAuth.d.ts +2 -2
  28. package/dist/middleware/manageAuth.d.ts +2 -2
  29. package/dist/middleware/projectAccess.d.ts +2 -2
  30. package/dist/middleware/projectConfig.d.ts +3 -3
  31. package/dist/middleware/requirePermission.d.ts +2 -2
  32. package/dist/middleware/runAuth.d.ts +4 -4
  33. package/dist/middleware/sessionAuth.d.ts +3 -3
  34. package/dist/middleware/tenantAccess.d.ts +2 -2
  35. package/dist/middleware/tracing.d.ts +3 -3
  36. package/package.json +5 -5
@@ -50198,6 +50198,44 @@ var runDatasetItemWorkflow = Object.assign(_runDatasetItemWorkflow, {
50198
50198
  workflowId: "workflow//./src/domains/evals/workflow/functions/runDatasetItem//_runDatasetItemWorkflow"
50199
50199
  });
50200
50200
 
50201
+ // src/domains/evals/workflow/functions/evaluateConversation.ts
50202
+ var getConversationStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//getConversationStep");
50203
+ var getEvaluatorsStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//getEvaluatorsStep");
50204
+ var executeEvaluatorStep2 = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//executeEvaluatorStep");
50205
+ var logStep2 = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//logStep");
50206
+ async function _evaluateConversationWorkflow(payload) {
50207
+ const { conversationId, evaluatorIds } = payload;
50208
+ await logStep2("Starting conversation evaluation", payload);
50209
+ const conversation = await getConversationStep(payload);
50210
+ const evaluators = await getEvaluatorsStep(payload);
50211
+ if (evaluators.length === 0) {
50212
+ await logStep2("No valid evaluators found", {
50213
+ conversationId,
50214
+ evaluatorIds
50215
+ });
50216
+ return {
50217
+ success: false,
50218
+ reason: "No valid evaluators"
50219
+ };
50220
+ }
50221
+ const results = [];
50222
+ for (const evaluator of evaluators) {
50223
+ const result = await executeEvaluatorStep2(payload, evaluator.id, conversation);
50224
+ results.push(result);
50225
+ }
50226
+ return {
50227
+ success: true,
50228
+ conversationId,
50229
+ resultCount: results.length
50230
+ };
50231
+ }
50232
+ __name(_evaluateConversationWorkflow, "_evaluateConversationWorkflow");
50233
+ _evaluateConversationWorkflow.workflowId = "workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow";
50234
+ globalThis.__private_workflows.set("workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow", _evaluateConversationWorkflow);
50235
+ var evaluateConversationWorkflow = Object.assign(_evaluateConversationWorkflow, {
50236
+ workflowId: "workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow"
50237
+ });
50238
+
50201
50239
  // ../node_modules/.pnpm/@workflow+utils@4.1.0-beta.11/node_modules/@workflow/utils/dist/time.js
50202
50240
  var import_ms = __toESM(require_ms(), 1);
50203
50241
 
@@ -50239,7 +50277,7 @@ __name(getWorkflowMetadata, "getWorkflowMetadata");
50239
50277
  var fetch = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflow@4.1.0-beta.54//fetch");
50240
50278
 
50241
50279
  // src/domains/run/workflow/steps/scheduledTriggerSteps.ts
50242
- var logStep2 = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/run/workflow/steps/scheduledTriggerSteps//logStep");
50280
+ var logStep3 = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/run/workflow/steps/scheduledTriggerSteps//logStep");
50243
50281
  var calculateNextExecutionStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/run/workflow/steps/scheduledTriggerSteps//calculateNextExecutionStep");
50244
50282
  var computeSleepDurationStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/run/workflow/steps/scheduledTriggerSteps//computeSleepDurationStep");
50245
50283
  var getNextPendingInvocationStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/run/workflow/steps/scheduledTriggerSteps//getNextPendingInvocationStep");
@@ -50263,7 +50301,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
50263
50301
  const { tenantId, projectId, agentId, scheduledTriggerId } = payload;
50264
50302
  const metadata = getWorkflowMetadata();
50265
50303
  const runnerId = metadata.workflowRunId;
50266
- await logStep2("Starting scheduled trigger runner workflow", {
50304
+ await logStep3("Starting scheduled trigger runner workflow", {
50267
50305
  tenantId,
50268
50306
  projectId,
50269
50307
  agentId,
@@ -50280,7 +50318,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
50280
50318
  runnerId
50281
50319
  });
50282
50320
  if (!enabledCheck.shouldContinue || !enabledCheck.trigger) {
50283
- await logStep2("Scheduled trigger workflow stopping", {
50321
+ await logStep3("Scheduled trigger workflow stopping", {
50284
50322
  scheduledTriggerId,
50285
50323
  reason: enabledCheck.reason
50286
50324
  });
@@ -50301,7 +50339,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
50301
50339
  let scheduledFor;
50302
50340
  if (isOneTime) {
50303
50341
  if (!trigger.runAt) {
50304
- await logStep2("One-time trigger missing runAt", {
50342
+ await logStep3("One-time trigger missing runAt", {
50305
50343
  scheduledTriggerId
50306
50344
  });
50307
50345
  return {
@@ -50318,7 +50356,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
50318
50356
  });
50319
50357
  scheduledFor = nextExecutionTime;
50320
50358
  } else {
50321
- await logStep2("Trigger missing both cronExpression and runAt", {
50359
+ await logStep3("Trigger missing both cronExpression and runAt", {
50322
50360
  scheduledTriggerId
50323
50361
  });
50324
50362
  return {
@@ -50338,7 +50376,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
50338
50376
  });
50339
50377
  invocation = result.invocation;
50340
50378
  if (isOneTime && result.alreadyExists && invocation.status !== "pending") {
50341
- await logStep2("One-time trigger already executed", {
50379
+ await logStep3("One-time trigger already executed", {
50342
50380
  scheduledTriggerId,
50343
50381
  invocationId: invocation.id,
50344
50382
  status: invocation.status
@@ -50349,13 +50387,13 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
50349
50387
  };
50350
50388
  }
50351
50389
  }
50352
- await logStep2("Got next pending invocation", {
50390
+ await logStep3("Got next pending invocation", {
50353
50391
  scheduledTriggerId,
50354
50392
  invocationId: invocation.id,
50355
50393
  scheduledFor: invocation.scheduledFor
50356
50394
  });
50357
50395
  const sleepMs = await computeSleepDurationStep(invocation.scheduledFor);
50358
- await logStep2("Sleeping until scheduled time", {
50396
+ await logStep3("Sleeping until scheduled time", {
50359
50397
  scheduledTriggerId,
50360
50398
  invocationId: invocation.id,
50361
50399
  scheduledFor: invocation.scheduledFor,
@@ -50370,7 +50408,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
50370
50408
  runnerId
50371
50409
  });
50372
50410
  if (!postSleepCheck.shouldContinue || !postSleepCheck.trigger) {
50373
- await logStep2("Trigger disabled/deleted during sleep, stopping", {
50411
+ await logStep3("Trigger disabled/deleted during sleep, stopping", {
50374
50412
  scheduledTriggerId,
50375
50413
  reason: postSleepCheck.reason
50376
50414
  });
@@ -50388,7 +50426,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
50388
50426
  invocationId: invocation.id
50389
50427
  });
50390
50428
  if (cancelCheck.cancelled) {
50391
- await logStep2("Invocation was cancelled, skipping to next", {
50429
+ await logStep3("Invocation was cancelled, skipping to next", {
50392
50430
  scheduledTriggerId,
50393
50431
  invocationId: invocation.id
50394
50432
  });
@@ -50406,7 +50444,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
50406
50444
  invocationId: invocation.id
50407
50445
  });
50408
50446
  if (retryCancel.cancelled) {
50409
- await logStep2("Invocation cancelled during retry loop", {
50447
+ await logStep3("Invocation cancelled during retry loop", {
50410
50448
  scheduledTriggerId,
50411
50449
  invocationId: invocation.id
50412
50450
  });
@@ -50447,7 +50485,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
50447
50485
  scheduledTriggerId,
50448
50486
  invocationId: invocation.id
50449
50487
  });
50450
- await logStep2("Scheduled trigger execution completed", {
50488
+ await logStep3("Scheduled trigger execution completed", {
50451
50489
  scheduledTriggerId,
50452
50490
  invocationId: invocation.id,
50453
50491
  conversationId: result.conversationId
@@ -50456,7 +50494,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
50456
50494
  break;
50457
50495
  }
50458
50496
  lastError = result.error || "Unknown error";
50459
- await logStep2("Scheduled trigger execution failed", {
50497
+ await logStep3("Scheduled trigger execution failed", {
50460
50498
  scheduledTriggerId,
50461
50499
  invocationId: invocation.id,
50462
50500
  attemptNumber,
@@ -50502,45 +50540,7 @@ globalThis.__private_workflows.set("workflow//./src/domains/run/workflow/functio
50502
50540
  var scheduledTriggerRunnerWorkflow = Object.assign(_scheduledTriggerRunnerWorkflow, {
50503
50541
  workflowId: "workflow//./src/domains/run/workflow/functions/scheduledTriggerRunner//_scheduledTriggerRunnerWorkflow"
50504
50542
  });
50505
-
50506
- // src/domains/evals/workflow/functions/evaluateConversation.ts
50507
- var getConversationStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//getConversationStep");
50508
- var getEvaluatorsStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//getEvaluatorsStep");
50509
- var executeEvaluatorStep2 = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//executeEvaluatorStep");
50510
- var logStep3 = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//logStep");
50511
- async function _evaluateConversationWorkflow(payload) {
50512
- const { conversationId, evaluatorIds } = payload;
50513
- await logStep3("Starting conversation evaluation", payload);
50514
- const conversation = await getConversationStep(payload);
50515
- const evaluators = await getEvaluatorsStep(payload);
50516
- if (evaluators.length === 0) {
50517
- await logStep3("No valid evaluators found", {
50518
- conversationId,
50519
- evaluatorIds
50520
- });
50521
- return {
50522
- success: false,
50523
- reason: "No valid evaluators"
50524
- };
50525
- }
50526
- const results = [];
50527
- for (const evaluator of evaluators) {
50528
- const result = await executeEvaluatorStep2(payload, evaluator.id, conversation);
50529
- results.push(result);
50530
- }
50531
- return {
50532
- success: true,
50533
- conversationId,
50534
- resultCount: results.length
50535
- };
50536
- }
50537
- __name(_evaluateConversationWorkflow, "_evaluateConversationWorkflow");
50538
- _evaluateConversationWorkflow.workflowId = "workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow";
50539
- globalThis.__private_workflows.set("workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow", _evaluateConversationWorkflow);
50540
- var evaluateConversationWorkflow = Object.assign(_evaluateConversationWorkflow, {
50541
- workflowId: "workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow"
50542
- });
50543
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21zQDIuMS4zL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0udHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0B3b3JrZmxvdyt1dGlsc0A0LjEuMC1iZXRhLjExL25vZGVfbW9kdWxlcy9Ad29ya2Zsb3cvdXRpbHMvc3JjL3RpbWUudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0B3b3JrZmxvdytjb3JlQDQuMS4wLWJldGEuNTRfQGF3cy1zZGsrY2xpZW50LXN0c0AzLjk3MC4wX0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMC9ub2RlX21vZHVsZXMvQHdvcmtmbG93L2NvcmUvc3JjL3N5bWJvbHMudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0B3b3JrZmxvdytjb3JlQDQuMS4wLWJldGEuNTRfQGF3cy1zZGsrY2xpZW50LXN0c0AzLjk3MC4wX0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMC9ub2RlX21vZHVsZXMvQHdvcmtmbG93L2NvcmUvc3JjL3NsZWVwLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ad29ya2Zsb3crY29yZUA0LjEuMC1iZXRhLjU0X0Bhd3Mtc2RrK2NsaWVudC1zdHNAMy45NzAuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjAvbm9kZV9tb2R1bGVzL0B3b3JrZmxvdy9jb3JlL3NyYy93b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3dvcmtmbG93QDQuMS4wLWJldGEuNTRfQGF3cy1zZGsrY2xpZW50LXN0c0AzLjk3MC4wX0BuZXN0anMrY29tbW9uQDExLjEuMTNfcmVmbGVjdC1tZXRhZF9mODUyODFmMjU4MGQ3MDY1ZmM1MTRlNjM3ZjVmNWUxZi9ub2RlX21vZHVsZXMvd29ya2Zsb3cvc3JjL3N0ZGxpYi50cyIsICJzcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLnRzIiwgInNyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci50cyIsICJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogSGVscGVycy5cbiAqLyB2YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi8gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgKyBKU09OLnN0cmluZ2lmeSh2YWwpKTtcbn07XG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqLyBmdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhzdHIpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICAgIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoKHR5cGUpe1xuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5cnMnOlxuICAgICAgICBjYXNlICd5cic6XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB5O1xuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgIHJldHVybiBuICogdztcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBkO1xuICAgICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICBjYXNlICdocnMnOlxuICAgICAgICBjYXNlICdocic6XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBoO1xuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2FzZSAnbWlucyc6XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBtO1xuICAgICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjcyc6XG4gICAgICAgIGNhc2UgJ3NlYyc6XG4gICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBzO1xuICAgICAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgIGNhc2UgJ21zZWNzJzpcbiAgICAgICAgY2FzZSAnbXNlYyc6XG4gICAgICAgIGNhc2UgJ21zJzpcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovIGZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gICAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gICAgfVxuICAgIHJldHVybiBtcyArICdtcyc7XG59XG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi8gZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICAgIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovIGZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIi8qKlxuICogV29ya2Zsb3cgZm9yIHJ1bm5pbmcgZGF0YXNldCBpdGVtcyB0aHJvdWdoIHRoZSBjaGF0IEFQSS5cbiAqXG4gKiBUaGlzIG1ha2VzIGRhdGFzZXQgcnVuIHByb2Nlc3NpbmcgZmlyZS1hbmQtZm9yZ2V0IC0gZWFjaCBpdGVtIGlzIHF1ZXVlZFxuICogaW5kZXBlbmRlbnRseSBhbmQgcHJvY2Vzc2VkIGluIHBhcmFsbGVsIGJ5IHRoZSB3b3JrZmxvdyBzeXN0ZW0uXG4gKi8gLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0udHNcIjp7XCJfcnVuRGF0YXNldEl0ZW1Xb3JrZmxvd1wiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3dcIn19fSxcInN0ZXBzXCI6e1wic3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLnRzXCI6e1wiY2FsbENoYXRBcGlTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY2FsbENoYXRBcGlTdGVwXCJ9LFwiY3JlYXRlUmVsYXRpb25TdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY3JlYXRlUmVsYXRpb25TdGVwXCJ9LFwiZXhlY3V0ZUV2YWx1YXRvclN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9leGVjdXRlRXZhbHVhdG9yU3RlcFwifSxcImxvZ1N0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9sb2dTdGVwXCJ9fX19Ki87XG4vKipcbiAqIFN0ZXA6IENhbGwgdGhlIGNoYXQgQVBJIHRvIHByb2Nlc3MgdGhlIGRhdGFzZXQgaXRlbVxuICovIHZhciBjYWxsQ2hhdEFwaVN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY2FsbENoYXRBcGlTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBDcmVhdGUgY29udmVyc2F0aW9uIHJlbGF0aW9uIGluIGRhdGFiYXNlXG4gKi8gdmFyIGNyZWF0ZVJlbGF0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9jcmVhdGVSZWxhdGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEV4ZWN1dGUgYSBzaW5nbGUgZXZhbHVhdG9yIG9uIGEgY29udmVyc2F0aW9uXG4gKi8gdmFyIGV4ZWN1dGVFdmFsdWF0b3JTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0vL2V4ZWN1dGVFdmFsdWF0b3JTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBMb2cgd29ya2Zsb3cgcHJvZ3Jlc3NcbiAqLyB2YXIgbG9nU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9sb2dTdGVwXCIpO1xuLyoqXG4gKiBNYWluIHdvcmtmbG93IGZ1bmN0aW9uIC0gcHJvY2Vzc2VzIGEgc2luZ2xlIGRhdGFzZXQgaXRlbSB0aHJvdWdoIHRoZSBjaGF0IEFQSS5cbiAqIE9wdGlvbmFsbHkgcnVucyBldmFsdWF0b3JzIG9uIHRoZSByZXN1bHRpbmcgY29udmVyc2F0aW9uLlxuICovIGFzeW5jIGZ1bmN0aW9uIF9ydW5EYXRhc2V0SXRlbVdvcmtmbG93KHBheWxvYWQpIHtcbiAgICBjb25zdCB7IGRhdGFzZXRJdGVtSWQsIGRhdGFzZXRSdW5JZCwgYWdlbnRJZCwgZXZhbHVhdG9ySWRzLCBldmFsdWF0aW9uUnVuSWQgfSA9IHBheWxvYWQ7XG4gICAgYXdhaXQgbG9nU3RlcCgnU3RhcnRpbmcgZGF0YXNldCBpdGVtIHByb2Nlc3NpbmcnLCB7XG4gICAgICAgIGRhdGFzZXRJdGVtSWQsXG4gICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgaGFzRXZhbHVhdG9yczogISEoZXZhbHVhdG9ySWRzICYmIGV2YWx1YXRvcklkcy5sZW5ndGggPiAwKVxuICAgIH0pO1xuICAgIC8vIENhbGwgY2hhdCBBUElcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWxsQ2hhdEFwaVN0ZXAocGF5bG9hZCk7XG4gICAgLy8gQ3JlYXRlIHJlbGF0aW9uIGlmIHdlIGdvdCBhIGNvbnZlcnNhdGlvblxuICAgIGlmIChyZXN1bHQuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgYXdhaXQgY3JlYXRlUmVsYXRpb25TdGVwKHBheWxvYWQsIHJlc3VsdC5jb252ZXJzYXRpb25JZCk7XG4gICAgICAgIC8vIFJ1biBldmFsdWF0aW9ucyBpZiBjb25maWd1cmVkXG4gICAgICAgIGlmIChldmFsdWF0b3JJZHMgJiYgZXZhbHVhdG9ySWRzLmxlbmd0aCA+IDAgJiYgZXZhbHVhdGlvblJ1bklkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV2YWx1YXRvcklkIG9mIGV2YWx1YXRvcklkcyl7XG4gICAgICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZUV2YWx1YXRvclN0ZXAocGF5bG9hZC50ZW5hbnRJZCwgcGF5bG9hZC5wcm9qZWN0SWQsIHJlc3VsdC5jb252ZXJzYXRpb25JZCwgZXZhbHVhdG9ySWQsIGV2YWx1YXRpb25SdW5JZCwgcGF5bG9hZC5kYXRhc2V0SXRlbUV4cGVjdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ05vIGNvbnZlcnNhdGlvbiBjcmVhdGVkJywge1xuICAgICAgICAgICAgZGF0YXNldEl0ZW1JZCxcbiAgICAgICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgICAgIGVycm9yOiByZXN1bHQuZXJyb3JcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6ICFyZXN1bHQuZXJyb3IsXG4gICAgICAgIGRhdGFzZXRJdGVtSWQsXG4gICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgY29udmVyc2F0aW9uSWQ6IHJlc3VsdC5jb252ZXJzYXRpb25JZCB8fCBudWxsLFxuICAgICAgICBlcnJvcjogcmVzdWx0LmVycm9yIHx8IG51bGxcbiAgICB9O1xufVxuX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3cud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9fcnVuRGF0YXNldEl0ZW1Xb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3dcIiwgX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3cpO1xuLy8gVGhpcyBJRCBtdXN0IG1hdGNoIHdoYXQgd29ya2Zsb3c6YnVpbGQgZ2VuZXJhdGVzIGluIC53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cuY2pzXG5leHBvcnQgY29uc3QgcnVuRGF0YXNldEl0ZW1Xb3JrZmxvdyA9IE9iamVjdC5hc3NpZ24oX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3csIHtcbiAgICB3b3JrZmxvd0lkOiAnd29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9fcnVuRGF0YXNldEl0ZW1Xb3JrZmxvdydcbn0pO1xuIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIi8qKlxuICogU3RlcCBmdW5jdGlvbnMgZm9yIHNjaGVkdWxlZCB0cmlnZ2VyIHdvcmtmbG93LlxuICpcbiAqIFRoZXNlIHN0ZXAgZnVuY3Rpb25zIGhhdmUgZnVsbCBOb2RlLmpzIGFjY2VzcyBhbmQgaGFuZGxlIGFsbCBkYXRhYmFzZVxuICogb3BlcmF0aW9ucyBhbmQgZXh0ZXJuYWwgc2VydmljZSBjYWxscy5cbiAqLyAvKipfX2ludGVybmFsX3dvcmtmbG93c3tcInN0ZXBzXCI6e1wic3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy50c1wiOntcImFkZENvbnZlcnNhdGlvbklkU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9hZGRDb252ZXJzYXRpb25JZFN0ZXBcIn0sXCJjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcFwifSxcImNoZWNrSW52b2NhdGlvbkNhbmNlbGxlZFN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcFwifSxcImNoZWNrVHJpZ2dlckVuYWJsZWRTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NoZWNrVHJpZ2dlckVuYWJsZWRTdGVwXCJ9LFwiY29tcHV0ZVNsZWVwRHVyYXRpb25TdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NvbXB1dGVTbGVlcER1cmF0aW9uU3RlcFwifSxcImNyZWF0ZUludm9jYXRpb25JZGVtcG90ZW50U3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jcmVhdGVJbnZvY2F0aW9uSWRlbXBvdGVudFN0ZXBcIn0sXCJkZWxldGVQZW5kaW5nSW52b2NhdGlvbnNTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2RlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXBcIn0sXCJleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZXhlY3V0ZVNjaGVkdWxlZFRyaWdnZXJTdGVwXCJ9LFwiZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9nZXROZXh0UGVuZGluZ0ludm9jYXRpb25TdGVwXCJ9LFwiaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIn0sXCJsb2dTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2xvZ1N0ZXBcIn0sXCJtYXJrQ29tcGxldGVkU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9tYXJrQ29tcGxldGVkU3RlcFwifSxcIm1hcmtGYWlsZWRTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtGYWlsZWRTdGVwXCJ9LFwibWFya1J1bm5pbmdTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtSdW5uaW5nU3RlcFwifX19fSovO1xuLyoqXG4gKiBTdGVwOiBMb2cgYSBtZXNzYWdlIChhbGxvd3MgbG9nZ2luZyBmcm9tIHdvcmtmbG93IGNvbnRleHQpXG4gKi8gZXhwb3J0IHZhciBsb2dTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9sb2dTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBDYWxjdWxhdGUgdGhlIG5leHQgZXhlY3V0aW9uIHRpbWUgcmVsYXRpdmUgdG8gYSBiYXNlIHRpbWUuXG4gKi8gZXhwb3J0IHZhciBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2FsY3VsYXRlTmV4dEV4ZWN1dGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IENvbXB1dGUgc2xlZXAgZHVyYXRpb25cbiAqIFJldHVybnMgbWlsbGlzZWNvbmRzIHRvIHNsZWVwLlxuICovIGV4cG9ydCB2YXIgY29tcHV0ZVNsZWVwRHVyYXRpb25TdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jb21wdXRlU2xlZXBEdXJhdGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEdldCB0aGUgbmV4dCBwZW5kaW5nIGludm9jYXRpb24gdG8gZXhlY3V0ZSAoZWFybGllc3Qgc2NoZWR1bGVkRm9yKS5cbiAqIFJldHVybnMgbnVsbCBpZiBubyBwZW5kaW5nIGludm9jYXRpb25zIGV4aXN0LlxuICovIGV4cG9ydCB2YXIgZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcFwiKTtcbi8qKlxuICogU3RlcDogRGVsZXRlIGFsbCBwZW5kaW5nIGludm9jYXRpb25zIGZvciBhIHRyaWdnZXIuXG4gKiBVc2VkIHdoZW4gY3JvbiBleHByZXNzaW9uIGNoYW5nZXMgb3IgdHJpZ2dlciBpcyBkaXNhYmxlZC5cbiAqLyBleHBvcnQgdmFyIGRlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2RlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IENoZWNrIGlmIHRyaWdnZXIgaXMgc3RpbGwgZW5hYmxlZCBhbmQgdGhpcyBydW5uZXIgaXMgYXV0aG9yaXRhdGl2ZS5cbiAqLyBleHBvcnQgdmFyIGNoZWNrVHJpZ2dlckVuYWJsZWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jaGVja1RyaWdnZXJFbmFibGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogVHJ5IHRvIGNyZWF0ZSBpbnZvY2F0aW9uIGlkZW1wb3RlbnRseS5cbiAqIFJldHVybnMgZXhpc3RpbmcgaW52b2NhdGlvbiBpZiBhbHJlYWR5IGNyZWF0ZWQuXG4gKi8gZXhwb3J0IHZhciBjcmVhdGVJbnZvY2F0aW9uSWRlbXBvdGVudFN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NyZWF0ZUludm9jYXRpb25JZGVtcG90ZW50U3RlcFwiKTtcbi8qKlxuICogU3RlcDogQ2hlY2sgaWYgaW52b2NhdGlvbiB3YXMgY2FuY2VsbGVkIGJlZm9yZSBleGVjdXRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiBjYW5jZWxsZWQgKHNob3VsZCBza2lwIGV4ZWN1dGlvbiksIGZhbHNlIG90aGVyd2lzZVxuICovIGV4cG9ydCB2YXIgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogTWFyayBpbnZvY2F0aW9uIGFzIHJ1bm5pbmdcbiAqLyBleHBvcnQgdmFyIG1hcmtSdW5uaW5nU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vbWFya1J1bm5pbmdTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBBZGQgYSBjb252ZXJzYXRpb24gSUQgdG8gdGhlIGludm9jYXRpb24ncyBjb252ZXJzYXRpb25JZHMgYXJyYXlcbiAqIENhbGxlZCBhZnRlciBlYWNoIGF0dGVtcHQgdG8gdHJhY2sgYWxsIGNvbnZlcnNhdGlvbnMgY3JlYXRlZCBkdXJpbmcgcmV0cmllc1xuICovIGV4cG9ydCB2YXIgYWRkQ29udmVyc2F0aW9uSWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9hZGRDb252ZXJzYXRpb25JZFN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IE1hcmsgaW52b2NhdGlvbiBhcyBjb21wbGV0ZWRcbiAqLyBleHBvcnQgdmFyIG1hcmtDb21wbGV0ZWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9tYXJrQ29tcGxldGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogTWFyayBpbnZvY2F0aW9uIGFzIGZhaWxlZFxuICovIGV4cG9ydCB2YXIgbWFya0ZhaWxlZFN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtGYWlsZWRTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBJbmNyZW1lbnQgYXR0ZW1wdCBudW1iZXIgZm9yIHJldHJ5XG4gKi8gZXhwb3J0IHZhciBpbmNyZW1lbnRBdHRlbXB0U3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEV4ZWN1dGUgdGhlIHNjaGVkdWxlZCB0cmlnZ2VyIHVzaW5nIGV4ZWN1dGVBZ2VudEFzeW5jLlxuICpcbiAqIFVzZXMgdGhlIHNoYXJlZCBleGVjdXRlQWdlbnRBc3luYyBmcm9tIFRyaWdnZXJTZXJ2aWNlIHdoaWNoIGluY2x1ZGVzXG4gKiBwcm9wZXIgdHJhY2luZywgZXJyb3IgaGFuZGxpbmcsIGFuZCBjb252ZXJzYXRpb24gbWFuYWdlbWVudC5cbiAqLyBleHBvcnQgdmFyIGV4ZWN1dGVTY2hlZHVsZWRUcmlnZ2VyU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZXhlY3V0ZVNjaGVkdWxlZFRyaWdnZXJTdGVwXCIpO1xuIiwgIi8qKlxuICogV29ya2Zsb3cgZm9yIHJ1bm5pbmcgc2NoZWR1bGVkIHRyaWdnZXJzLlxuICpcbiAqIFRoaXMgd29ya2Zsb3c6XG4gKiAxLiBHZXRzIG9yIGNyZWF0ZXMgdGhlIG5leHQgcGVuZGluZyBpbnZvY2F0aW9uXG4gKiAyLiBTbGVlcHMgdW50aWwgaXRzIHNjaGVkdWxlZCB0aW1lXG4gKiAzLiBDaGVja3MgaWYgdGhlIHRyaWdnZXIgaXMgc3RpbGwgZW5hYmxlZFxuICogNC4gRXhlY3V0ZXMgdGhlIGFnZW50IHdpdGggcmV0cmllc1xuICogNS4gRm9yIGNyb24gdHJpZ2dlcnMsIGxvb3BzIGJhY2sgdG8gc3RlcCAxXG4gKlxuICovIGltcG9ydCB7IGdldFdvcmtmbG93TWV0YWRhdGEsIHNsZWVwIH0gZnJvbSAnd29ya2Zsb3cnO1xuaW1wb3J0IHsgYWRkQ29udmVyc2F0aW9uSWRTdGVwLCBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCwgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCwgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAsIGNvbXB1dGVTbGVlcER1cmF0aW9uU3RlcCwgY3JlYXRlSW52b2NhdGlvbklkZW1wb3RlbnRTdGVwLCBleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXAsIGdldE5leHRQZW5kaW5nSW52b2NhdGlvblN0ZXAsIGluY3JlbWVudEF0dGVtcHRTdGVwLCBsb2dTdGVwLCBtYXJrQ29tcGxldGVkU3RlcCwgbWFya0ZhaWxlZFN0ZXAsIG1hcmtSdW5uaW5nU3RlcCB9IGZyb20gJy4uL3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcyc7XG4vKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcInNyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci50c1wiOntcIl9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3dcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvZnVuY3Rpb25zL3NjaGVkdWxlZFRyaWdnZXJSdW5uZXIvL19zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3dcIn19fX0qLztcbi8qKlxuICogR2VuZXJhdGUgaWRlbXBvdGVuY3kga2V5IGZvciBhIHNjaGVkdWxlZCBleGVjdXRpb24uXG4gKi8gZnVuY3Rpb24gZ2VuZXJhdGVJZGVtcG90ZW5jeUtleShzY2hlZHVsZWRUcmlnZ2VySWQsIHNjaGVkdWxlZEZvcikge1xuICAgIHJldHVybiBgc2NoZWRfJHtzY2hlZHVsZWRUcmlnZ2VySWR9XyR7c2NoZWR1bGVkRm9yfWA7XG59XG4vKipcbiAqIE1haW4gd29ya2Zsb3cgZnVuY3Rpb24gLSBydW5zIGEgc2NoZWR1bGVkIHRyaWdnZXIuXG4gKiBGb3IgY3JvbiB0cmlnZ2VycywgdGhpcyBsb29wcyBpbmRlZmluaXRlbHkgdW50aWwgZGlzYWJsZWQvZGVsZXRlZC5cbiAqIEZvciBvbmUtdGltZSB0cmlnZ2VycywgaXQgZXhlY3V0ZXMgb25jZSBhbmQgY29tcGxldGVzLlxuICpcbiAqLyBhc3luYyBmdW5jdGlvbiBfc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93KHBheWxvYWQpIHtcbiAgICBjb25zdCB7IHRlbmFudElkLCBwcm9qZWN0SWQsIGFnZW50SWQsIHNjaGVkdWxlZFRyaWdnZXJJZCB9ID0gcGF5bG9hZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldFdvcmtmbG93TWV0YWRhdGEoKTtcbiAgICBjb25zdCBydW5uZXJJZCA9IG1ldGFkYXRhLndvcmtmbG93UnVuSWQ7XG4gICAgYXdhaXQgbG9nU3RlcCgnU3RhcnRpbmcgc2NoZWR1bGVkIHRyaWdnZXIgcnVubmVyIHdvcmtmbG93Jywge1xuICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgcHJvamVjdElkLFxuICAgICAgICBhZ2VudElkLFxuICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgIHJ1bm5lcklkXG4gICAgfSk7XG4gICAgLy8gVHJhY2sgdGhlIGxhc3Qgc2NoZWR1bGVkIHRpbWUgZm9yIGNyb24gY2FsY3VsYXRpb25zXG4gICAgbGV0IGxhc3RTY2hlZHVsZWRGb3IgPSBudWxsO1xuICAgIC8vIE1haW4gZXhlY3V0aW9uIGxvb3BcbiAgICB3aGlsZSh0cnVlKXtcbiAgICAgICAgY29uc3QgZW5hYmxlZENoZWNrID0gYXdhaXQgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAoe1xuICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgcnVubmVySWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZW5hYmxlZENoZWNrLnNob3VsZENvbnRpbnVlIHx8ICFlbmFibGVkQ2hlY2sudHJpZ2dlcikge1xuICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnU2NoZWR1bGVkIHRyaWdnZXIgd29ya2Zsb3cgc3RvcHBpbmcnLCB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogZW5hYmxlZENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ3N0b3BwZWQnLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogZW5hYmxlZENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyID0gZW5hYmxlZENoZWNrLnRyaWdnZXI7XG4gICAgICAgIGNvbnN0IGlzT25lVGltZSA9ICEhdHJpZ2dlci5ydW5BdDtcbiAgICAgICAgbGV0IGludm9jYXRpb24gPSBhd2FpdCBnZXROZXh0UGVuZGluZ0ludm9jYXRpb25TdGVwKHtcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ3JlYXRlIGludm9jYXRpb24gaWYgbm9uZSBleGlzdHNcbiAgICAgICAgaWYgKCFpbnZvY2F0aW9uKSB7XG4gICAgICAgICAgICBsZXQgc2NoZWR1bGVkRm9yO1xuICAgICAgICAgICAgaWYgKGlzT25lVGltZSkge1xuICAgICAgICAgICAgICAgIGlmICghdHJpZ2dlci5ydW5BdCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2dTdGVwKCdPbmUtdGltZSB0cmlnZ2VyIG1pc3NpbmcgcnVuQXQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246ICdvbmUtdGltZSB0cmlnZ2VyIG1pc3NpbmcgcnVuQXQnXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZEZvciA9IHRyaWdnZXIucnVuQXQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXIuY3JvbkV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG5leHRFeGVjdXRpb25UaW1lIH0gPSBhd2FpdCBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgIGNyb25FeHByZXNzaW9uOiB0cmlnZ2VyLmNyb25FeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICBjcm9uVGltZXpvbmU6IHRyaWdnZXIuY3JvblRpbWV6b25lLFxuICAgICAgICAgICAgICAgICAgICBsYXN0U2NoZWR1bGVkRm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRm9yID0gbmV4dEV4ZWN1dGlvblRpbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1RyaWdnZXIgbWlzc2luZyBib3RoIGNyb25FeHByZXNzaW9uIGFuZCBydW5BdCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICByZWFzb246ICd0cmlnZ2VyIG1pc3NpbmcgY3JvbkV4cHJlc3Npb24gYW5kIHJ1bkF0J1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpZGVtcG90ZW5jeUtleSA9IGdlbmVyYXRlSWRlbXBvdGVuY3lLZXkoc2NoZWR1bGVkVHJpZ2dlcklkLCBzY2hlZHVsZWRGb3IpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlSW52b2NhdGlvbklkZW1wb3RlbnRTdGVwKHtcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRm9yLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHRyaWdnZXIucGF5bG9hZCA/PyBudWxsLFxuICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGludm9jYXRpb24gPSByZXN1bHQuaW52b2NhdGlvbjtcbiAgICAgICAgICAgIC8vIEZvciBvbmUtdGltZSB0cmlnZ2VycywgY2hlY2sgaWYgYWxyZWFkeSBwcm9jZXNzZWRcbiAgICAgICAgICAgIGlmIChpc09uZVRpbWUgJiYgcmVzdWx0LmFscmVhZHlFeGlzdHMgJiYgaW52b2NhdGlvbi5zdGF0dXMgIT09ICdwZW5kaW5nJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ09uZS10aW1lIHRyaWdnZXIgYWxyZWFkeSBleGVjdXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogaW52b2NhdGlvbi5zdGF0dXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdhbHJlYWR5X2V4ZWN1dGVkJyxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBsb2dTdGVwKCdHb3QgbmV4dCBwZW5kaW5nIGludm9jYXRpb24nLCB7XG4gICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICBzY2hlZHVsZWRGb3I6IGludm9jYXRpb24uc2NoZWR1bGVkRm9yXG4gICAgICAgIH0pO1xuICAgICAgICAvLyA0LiBTbGVlcCB1bnRpbCB0aGUgaW52b2NhdGlvbidzIHNjaGVkdWxlZCB0aW1lXG4gICAgICAgIGNvbnN0IHNsZWVwTXMgPSBhd2FpdCBjb21wdXRlU2xlZXBEdXJhdGlvblN0ZXAoaW52b2NhdGlvbi5zY2hlZHVsZWRGb3IpO1xuICAgICAgICBhd2FpdCBsb2dTdGVwKCdTbGVlcGluZyB1bnRpbCBzY2hlZHVsZWQgdGltZScsIHtcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZEZvcjogaW52b2NhdGlvbi5zY2hlZHVsZWRGb3IsXG4gICAgICAgICAgICBzbGVlcE1zXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1zKTtcbiAgICAgICAgLy8gNS4gUmUtY2hlY2sgaWYgdHJpZ2dlciBpcyBzdGlsbCBlbmFibGVkIGFmdGVyIHNsZWVwXG4gICAgICAgIGNvbnN0IHBvc3RTbGVlcENoZWNrID0gYXdhaXQgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAoe1xuICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgcnVubmVySWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcG9zdFNsZWVwQ2hlY2suc2hvdWxkQ29udGludWUgfHwgIXBvc3RTbGVlcENoZWNrLnRyaWdnZXIpIHtcbiAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1RyaWdnZXIgZGlzYWJsZWQvZGVsZXRlZCBkdXJpbmcgc2xlZXAsIHN0b3BwaW5nJywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICByZWFzb246IHBvc3RTbGVlcENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ3N0b3BwZWQnLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogcG9zdFNsZWVwQ2hlY2sucmVhc29uXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZnJlc2ggdHJpZ2dlciBjb25maWcgKG1heSBoYXZlIGNoYW5nZWQgZHVyaW5nIHNsZWVwKVxuICAgICAgICBjb25zdCBjdXJyZW50VHJpZ2dlciA9IHBvc3RTbGVlcENoZWNrLnRyaWdnZXI7XG4gICAgICAgIC8vIDYuIENoZWNrIGlmIGludm9jYXRpb24gd2FzIGNhbmNlbGxlZCBkdXJpbmcgc2xlZXBcbiAgICAgICAgY29uc3QgY2FuY2VsQ2hlY2sgPSBhd2FpdCBjaGVja0ludm9jYXRpb25DYW5jZWxsZWRTdGVwKHtcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhbmNlbENoZWNrLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnSW52b2NhdGlvbiB3YXMgY2FuY2VsbGVkLCBza2lwcGluZyB0byBuZXh0Jywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4gRXhlY3V0ZSB3aXRoIHJldHJpZXNcbiAgICAgICAgbGV0IGF0dGVtcHROdW1iZXIgPSBpbnZvY2F0aW9uLmF0dGVtcHROdW1iZXI7XG4gICAgICAgIGxldCBsYXN0RXJyb3IgPSBudWxsO1xuICAgICAgICBjb25zdCBtYXhBdHRlbXB0cyA9IGN1cnJlbnRUcmlnZ2VyLm1heFJldHJpZXMgKyAxO1xuICAgICAgICB3aGlsZShhdHRlbXB0TnVtYmVyIDw9IG1heEF0dGVtcHRzKXtcbiAgICAgICAgICAgIGNvbnN0IHJldHJ5Q2FuY2VsID0gYXdhaXQgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmV0cnlDYW5jZWwuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnSW52b2NhdGlvbiBjYW5jZWxsZWQgZHVyaW5nIHJldHJ5IGxvb3AnLCB7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNYXJrIGFzIHJ1bm5pbmdcbiAgICAgICAgICAgIGF3YWl0IG1hcmtSdW5uaW5nU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXAoe1xuICAgICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICAgIHByb2plY3RJZCxcbiAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiBjdXJyZW50VHJpZ2dlci5tZXNzYWdlVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogY3VycmVudFRyaWdnZXIucGF5bG9hZCA/PyBudWxsLFxuICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzOiBjdXJyZW50VHJpZ2dlci50aW1lb3V0U2Vjb25kc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBTYXZlIGNvbnZlcnNhdGlvbiBJRCBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGF0dGVtcHRcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhZGRDb252ZXJzYXRpb25JZFN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHJlc3VsdC5jb252ZXJzYXRpb25JZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbWFya0NvbXBsZXRlZFN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1NjaGVkdWxlZCB0cmlnZ2VyIGV4ZWN1dGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZDogcmVzdWx0LmNvbnZlcnNhdGlvbklkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGFzdEVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RFcnJvciA9IHJlc3VsdC5lcnJvciB8fCAnVW5rbm93biBlcnJvcic7XG4gICAgICAgICAgICBhd2FpdCBsb2dTdGVwKCdTY2hlZHVsZWQgdHJpZ2dlciBleGVjdXRpb24gZmFpbGVkJywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgYXR0ZW1wdE51bWJlcixcbiAgICAgICAgICAgICAgICBlcnJvcjogbGFzdEVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChhdHRlbXB0TnVtYmVyIDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbmNyZW1lbnRBdHRlbXB0U3RlcCh7XG4gICAgICAgICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0ZW1wdDogYXR0ZW1wdE51bWJlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF0dGVtcHROdW1iZXIrKztcbiAgICAgICAgICAgICAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogMC4zO1xuICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKGN1cnJlbnRUcmlnZ2VyLnJldHJ5RGVsYXlTZWNvbmRzICogMTAwMCAqICgxICsgaml0dGVyKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE1hcmsgYXMgZmFpbGVkIGlmIGFsbCByZXRyaWVzIGV4aGF1c3RlZFxuICAgICAgICBpZiAobGFzdEVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCBtYXJrRmFpbGVkU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJhY2sgdGhpcyBpbnZvY2F0aW9uJ3Mgc2NoZWR1bGVkIHRpbWUgZm9yIG5leHQgY3JvbiBjYWxjdWxhdGlvblxuICAgICAgICBsYXN0U2NoZWR1bGVkRm9yID0gaW52b2NhdGlvbi5zY2hlZHVsZWRGb3I7XG4gICAgICAgIC8vIEZvciBvbmUtdGltZSB0cmlnZ2Vycywgd2UncmUgZG9uZVxuICAgICAgICBpZiAoaXNPbmVUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogbGFzdEVycm9yID8gJ2ZhaWxlZCcgOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAvLyBGb3IgY3JvbiB0cmlnZ2VycywgbG9vcCBjb250aW51ZXMgdG8gY3JlYXRlL2dldCBuZXh0IGludm9jYXRpb25cbiAgICB9XG59XG5fc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93LndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci8vX3NjaGVkdWxlZFRyaWdnZXJSdW5uZXJXb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci8vX3NjaGVkdWxlZFRyaWdnZXJSdW5uZXJXb3JrZmxvd1wiLCBfc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93KTtcbi8vIEV4cG9ydCB3aXRoIHdvcmtmbG93SWQgZm9yIHRoZSBidWlsZCBzeXN0ZW1cbmV4cG9ydCBjb25zdCBzY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3cgPSBPYmplY3QuYXNzaWduKF9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3csIHtcbiAgICB3b3JrZmxvd0lkOiAnd29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L2Z1bmN0aW9ucy9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyLy9fc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93J1xufSk7XG4iLCAiLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24udHNcIjp7XCJfZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvd1wiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3dcIn19fSxcInN0ZXBzXCI6e1wic3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLnRzXCI6e1wiZXhlY3V0ZUV2YWx1YXRvclN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9leGVjdXRlRXZhbHVhdG9yU3RlcFwifSxcImdldENvbnZlcnNhdGlvblN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9nZXRDb252ZXJzYXRpb25TdGVwXCJ9LFwiZ2V0RXZhbHVhdG9yc1N0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9nZXRFdmFsdWF0b3JzU3RlcFwifSxcImxvZ1N0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9sb2dTdGVwXCJ9fX19Ki87XG52YXIgZ2V0Q29udmVyc2F0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9nZXRDb252ZXJzYXRpb25TdGVwXCIpO1xudmFyIGdldEV2YWx1YXRvcnNTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24vL2dldEV2YWx1YXRvcnNTdGVwXCIpO1xudmFyIGV4ZWN1dGVFdmFsdWF0b3JTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24vL2V4ZWN1dGVFdmFsdWF0b3JTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBMb2cgd29ya2Zsb3cgcHJvZ3Jlc3NcbiAqLyB2YXIgbG9nU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9sb2dTdGVwXCIpO1xuLyoqXG4gKiBNYWluIHdvcmtmbG93IGZ1bmN0aW9uIC0gb3JjaGVzdHJhdGVzIHRoZSBldmFsdWF0aW9uIHN0ZXBzLlxuICpcbiAqIElNUE9SVEFOVDogVGhpcyBydW5zIGluIGEgZGV0ZXJtaW5pc3RpYyBzYW5kYm94LlxuICogLSBEbyBOT1QgY2FsbCBOb2RlLmpzIEFQSXMgZGlyZWN0bHkgaGVyZSAobm8gREIsIG5vIGZzLCBldGMuKVxuICogLSBBbGwgc2lkZSBlZmZlY3RzIG11c3QgaGFwcGVuIGluIHN0ZXAgZnVuY3Rpb25zXG4gKi8gYXN5bmMgZnVuY3Rpb24gX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3cocGF5bG9hZCkge1xuICAgIGNvbnN0IHsgY29udmVyc2F0aW9uSWQsIGV2YWx1YXRvcklkcyB9ID0gcGF5bG9hZDtcbiAgICBhd2FpdCBsb2dTdGVwKCdTdGFydGluZyBjb252ZXJzYXRpb24gZXZhbHVhdGlvbicsIHBheWxvYWQpO1xuICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGF3YWl0IGdldENvbnZlcnNhdGlvblN0ZXAocGF5bG9hZCk7XG4gICAgY29uc3QgZXZhbHVhdG9ycyA9IGF3YWl0IGdldEV2YWx1YXRvcnNTdGVwKHBheWxvYWQpO1xuICAgIGlmIChldmFsdWF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBhd2FpdCBsb2dTdGVwKCdObyB2YWxpZCBldmFsdWF0b3JzIGZvdW5kJywge1xuICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICBldmFsdWF0b3JJZHNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlYXNvbjogJ05vIHZhbGlkIGV2YWx1YXRvcnMnXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGV2YWx1YXRvciBvZiBldmFsdWF0b3JzKXtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUV2YWx1YXRvclN0ZXAocGF5bG9hZCwgZXZhbHVhdG9yLmlkLCBjb252ZXJzYXRpb24pO1xuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICAgIHJlc3VsdENvdW50OiByZXN1bHRzLmxlbmd0aFxuICAgIH07XG59XG5fZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvdy53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24vL19ldmFsdWF0ZUNvbnZlcnNhdGlvbldvcmtmbG93XCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9fZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvd1wiLCBfZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvdyk7XG4vLyBUaGlzIElEIG11c3QgbWF0Y2ggd2hhdCB3b3JrZmxvdzpidWlsZCBnZW5lcmF0ZXMgaW4gLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdy5janNcbmV4cG9ydCBjb25zdCBldmFsdWF0ZUNvbnZlcnNhdGlvbldvcmtmbG93ID0gT2JqZWN0LmFzc2lnbihfZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvdywge1xuICAgIHdvcmtmbG93SWQ6ICd3b3JrZmxvdy8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24vL19ldmFsdWF0ZUNvbnZlcnNhdGlvbldvcmtmbG93J1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBLHFFQUFBQSxTQUFBO0FBQUE7QUFFSSxRQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBYVIsSUFBQUEsUUFBTyxVQUFVLFNBQVMsS0FBSyxTQUFTO0FBQ3hDLGdCQUFVLFdBQVcsQ0FBQztBQUN0QixVQUFJLE9BQU8sT0FBTztBQUNsQixVQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVMsR0FBRztBQUNyQyxlQUFPLE1BQU0sR0FBRztBQUFBLE1BQ3BCLFdBQVcsU0FBUyxZQUFZLFNBQVMsR0FBRyxHQUFHO0FBQzNDLGVBQU8sUUFBUSxPQUFPLFFBQVEsR0FBRyxJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ3JEO0FBQ0EsWUFBTSxJQUFJLE1BQU0sMERBQTBELEtBQUssVUFBVSxHQUFHLENBQUM7QUFB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UUFBUSxZQUFZLFdBQVc7QUFBQSxRQUMvQixjQUFjLFdBQVc7QUFBQSxNQUM3QjtBQUFBLElBQ0o7QUFBQSxFQUVKO0FBQ0o7QUEzUG1CO0FBNFBuQixnQ0FBZ0MsYUFBYTtBQUM3QyxXQUFXLG9CQUFvQixJQUFJLDBHQUEwRywrQkFBK0I7QUFFckssSUFBTSxpQ0FBaUMsT0FBTyxPQUFPLGlDQUFpQztBQUFBLEVBQ3pGLFlBQVk7QUFDaEIsQ0FBQzs7O0FDdlJELElBQUksc0JBQXNCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsd0ZBQXdGO0FBQzlKLElBQUksb0JBQW9CLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsc0ZBQXNGO0FBQzFKLElBQUlDLHdCQUF1QixXQUFXLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLHlGQUF5RjtBQUc1SixJQUFJQyxXQUFVLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsNEVBQTRFO0FBT3RJLGVBQWUsOEJBQThCLFNBQVM7QUFDdEQsUUFBTSxFQUFFLGdCQUFnQixhQUFhLElBQUk7QUFDekMsUUFBTUEsU0FBUSxvQ0FBb0MsT0FBTztBQUN6RCxRQUFNLGVBQWUsTUFBTSxvQkFBb0IsT0FBTztBQUN0RCxRQUFNLGFBQWEsTUFBTSxrQkFBa0IsT0FBTztBQUNsRCxNQUFJLFdBQVcsV0FBVyxHQUFHO0FBQ3pCLFVBQU1BLFNBQVEsNkJBQTZCO0FBQUEsTUFDdkM7QUFBQSxNQUNBO0FBQUEsSUFDSixDQUFDO0FBQ0QsV0FBTztBQUFBLE1BQ0gsU0FBUztBQUFBLE1BQ1QsUUFBUTtBQUFBLElBQ1o7QUFBQSxFQUNKO0FBQ0EsUUFBTSxVQUFVLENBQUM7QUFDakIsYUFBVyxhQUFhLFlBQVc7QUFDL0IsVUFBTSxTQUFTLE1BQU1ELHNCQUFxQixTQUFTLFVBQVUsSUFBSSxZQUFZO0FBQzdFLFlBQVEsS0FBSyxNQUFNO0FBQUEsRUFDdkI7QUFDQSxTQUFPO0FBQUEsSUFDSCxTQUFTO0FBQUEsSUFDVDtBQUFBLElBQ0EsYUFBYSxRQUFRO0FBQUEsRUFDekI7QUFDSjtBQXpCbUI7QUEwQm5CLDhCQUE4QixhQUFhO0FBQzNDLFdBQVcsb0JBQW9CLElBQUksd0dBQXdHLDZCQUE2QjtBQUVqSyxJQUFNLCtCQUErQixPQUFPLE9BQU8sK0JBQStCO0FBQUEsRUFDckYsWUFBWTtBQUNoQixDQUFDOyIsCiAgIm5hbWVzIjogWyJtb2R1bGUiLCAibXMiLCAibG9nU3RlcCIsICJsb2dTdGVwIiwgImV4ZWN1dGVFdmFsdWF0b3JTdGVwIiwgImxvZ1N0ZXAiXQp9Cg==
50543
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21zQDIuMS4zL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0udHMiLCAic3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ad29ya2Zsb3crdXRpbHNANC4xLjAtYmV0YS4xMS9ub2RlX21vZHVsZXMvQHdvcmtmbG93L3V0aWxzL3NyYy90aW1lLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ad29ya2Zsb3crY29yZUA0LjEuMC1iZXRhLjU0X0Bhd3Mtc2RrK2NsaWVudC1zdHNAMy45NzAuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjAvbm9kZV9tb2R1bGVzL0B3b3JrZmxvdy9jb3JlL3NyYy9zeW1ib2xzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ad29ya2Zsb3crY29yZUA0LjEuMC1iZXRhLjU0X0Bhd3Mtc2RrK2NsaWVudC1zdHNAMy45NzAuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjAvbm9kZV9tb2R1bGVzL0B3b3JrZmxvdy9jb3JlL3NyYy9zbGVlcC50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vQHdvcmtmbG93K2NvcmVANC4xLjAtYmV0YS41NF9AYXdzLXNkaytjbGllbnQtc3RzQDMuOTcwLjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4wL25vZGVfbW9kdWxlcy9Ad29ya2Zsb3cvY29yZS9zcmMvd29ya2Zsb3cvZ2V0LXdvcmtmbG93LW1ldGFkYXRhLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS93b3JrZmxvd0A0LjEuMC1iZXRhLjU0X0Bhd3Mtc2RrK2NsaWVudC1zdHNAMy45NzAuMF9AbmVzdGpzK2NvbW1vbkAxMS4xLjEzX3JlZmxlY3QtbWV0YWRfZjg1MjgxZjI1ODBkNzA2NWZjNTE0ZTYzN2Y1ZjVlMWYvbm9kZV9tb2R1bGVzL3dvcmtmbG93L3NyYy9zdGRsaWIudHMiLCAic3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy50cyIsICJzcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvZnVuY3Rpb25zL3NjaGVkdWxlZFRyaWdnZXJSdW5uZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogSGVscGVycy5cbiAqLyB2YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi8gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgKyBKU09OLnN0cmluZ2lmeSh2YWwpKTtcbn07XG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqLyBmdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhzdHIpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICAgIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoKHR5cGUpe1xuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5cnMnOlxuICAgICAgICBjYXNlICd5cic6XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB5O1xuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgIHJldHVybiBuICogdztcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBkO1xuICAgICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICBjYXNlICdocnMnOlxuICAgICAgICBjYXNlICdocic6XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBoO1xuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2FzZSAnbWlucyc6XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBtO1xuICAgICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjcyc6XG4gICAgICAgIGNhc2UgJ3NlYyc6XG4gICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBzO1xuICAgICAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgIGNhc2UgJ21zZWNzJzpcbiAgICAgICAgY2FzZSAnbXNlYyc6XG4gICAgICAgIGNhc2UgJ21zJzpcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovIGZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gICAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gICAgfVxuICAgIHJldHVybiBtcyArICdtcyc7XG59XG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi8gZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICAgIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovIGZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIi8qKlxuICogV29ya2Zsb3cgZm9yIHJ1bm5pbmcgZGF0YXNldCBpdGVtcyB0aHJvdWdoIHRoZSBjaGF0IEFQSS5cbiAqXG4gKiBUaGlzIG1ha2VzIGRhdGFzZXQgcnVuIHByb2Nlc3NpbmcgZmlyZS1hbmQtZm9yZ2V0IC0gZWFjaCBpdGVtIGlzIHF1ZXVlZFxuICogaW5kZXBlbmRlbnRseSBhbmQgcHJvY2Vzc2VkIGluIHBhcmFsbGVsIGJ5IHRoZSB3b3JrZmxvdyBzeXN0ZW0uXG4gKi8gLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0udHNcIjp7XCJfcnVuRGF0YXNldEl0ZW1Xb3JrZmxvd1wiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3dcIn19fSxcInN0ZXBzXCI6e1wic3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLnRzXCI6e1wiY2FsbENoYXRBcGlTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY2FsbENoYXRBcGlTdGVwXCJ9LFwiY3JlYXRlUmVsYXRpb25TdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY3JlYXRlUmVsYXRpb25TdGVwXCJ9LFwiZXhlY3V0ZUV2YWx1YXRvclN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9leGVjdXRlRXZhbHVhdG9yU3RlcFwifSxcImxvZ1N0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9sb2dTdGVwXCJ9fX19Ki87XG4vKipcbiAqIFN0ZXA6IENhbGwgdGhlIGNoYXQgQVBJIHRvIHByb2Nlc3MgdGhlIGRhdGFzZXQgaXRlbVxuICovIHZhciBjYWxsQ2hhdEFwaVN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY2FsbENoYXRBcGlTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBDcmVhdGUgY29udmVyc2F0aW9uIHJlbGF0aW9uIGluIGRhdGFiYXNlXG4gKi8gdmFyIGNyZWF0ZVJlbGF0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9jcmVhdGVSZWxhdGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEV4ZWN1dGUgYSBzaW5nbGUgZXZhbHVhdG9yIG9uIGEgY29udmVyc2F0aW9uXG4gKi8gdmFyIGV4ZWN1dGVFdmFsdWF0b3JTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0vL2V4ZWN1dGVFdmFsdWF0b3JTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBMb2cgd29ya2Zsb3cgcHJvZ3Jlc3NcbiAqLyB2YXIgbG9nU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9sb2dTdGVwXCIpO1xuLyoqXG4gKiBNYWluIHdvcmtmbG93IGZ1bmN0aW9uIC0gcHJvY2Vzc2VzIGEgc2luZ2xlIGRhdGFzZXQgaXRlbSB0aHJvdWdoIHRoZSBjaGF0IEFQSS5cbiAqIE9wdGlvbmFsbHkgcnVucyBldmFsdWF0b3JzIG9uIHRoZSByZXN1bHRpbmcgY29udmVyc2F0aW9uLlxuICovIGFzeW5jIGZ1bmN0aW9uIF9ydW5EYXRhc2V0SXRlbVdvcmtmbG93KHBheWxvYWQpIHtcbiAgICBjb25zdCB7IGRhdGFzZXRJdGVtSWQsIGRhdGFzZXRSdW5JZCwgYWdlbnRJZCwgZXZhbHVhdG9ySWRzLCBldmFsdWF0aW9uUnVuSWQgfSA9IHBheWxvYWQ7XG4gICAgYXdhaXQgbG9nU3RlcCgnU3RhcnRpbmcgZGF0YXNldCBpdGVtIHByb2Nlc3NpbmcnLCB7XG4gICAgICAgIGRhdGFzZXRJdGVtSWQsXG4gICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgaGFzRXZhbHVhdG9yczogISEoZXZhbHVhdG9ySWRzICYmIGV2YWx1YXRvcklkcy5sZW5ndGggPiAwKVxuICAgIH0pO1xuICAgIC8vIENhbGwgY2hhdCBBUElcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWxsQ2hhdEFwaVN0ZXAocGF5bG9hZCk7XG4gICAgLy8gQ3JlYXRlIHJlbGF0aW9uIGlmIHdlIGdvdCBhIGNvbnZlcnNhdGlvblxuICAgIGlmIChyZXN1bHQuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgYXdhaXQgY3JlYXRlUmVsYXRpb25TdGVwKHBheWxvYWQsIHJlc3VsdC5jb252ZXJzYXRpb25JZCk7XG4gICAgICAgIC8vIFJ1biBldmFsdWF0aW9ucyBpZiBjb25maWd1cmVkXG4gICAgICAgIGlmIChldmFsdWF0b3JJZHMgJiYgZXZhbHVhdG9ySWRzLmxlbmd0aCA+IDAgJiYgZXZhbHVhdGlvblJ1bklkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV2YWx1YXRvcklkIG9mIGV2YWx1YXRvcklkcyl7XG4gICAgICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZUV2YWx1YXRvclN0ZXAocGF5bG9hZC50ZW5hbnRJZCwgcGF5bG9hZC5wcm9qZWN0SWQsIHJlc3VsdC5jb252ZXJzYXRpb25JZCwgZXZhbHVhdG9ySWQsIGV2YWx1YXRpb25SdW5JZCwgcGF5bG9hZC5kYXRhc2V0SXRlbUV4cGVjdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ05vIGNvbnZlcnNhdGlvbiBjcmVhdGVkJywge1xuICAgICAgICAgICAgZGF0YXNldEl0ZW1JZCxcbiAgICAgICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgICAgIGVycm9yOiByZXN1bHQuZXJyb3JcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6ICFyZXN1bHQuZXJyb3IsXG4gICAgICAgIGRhdGFzZXRJdGVtSWQsXG4gICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgY29udmVyc2F0aW9uSWQ6IHJlc3VsdC5jb252ZXJzYXRpb25JZCB8fCBudWxsLFxuICAgICAgICBlcnJvcjogcmVzdWx0LmVycm9yIHx8IG51bGxcbiAgICB9O1xufVxuX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3cud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9fcnVuRGF0YXNldEl0ZW1Xb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3dcIiwgX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3cpO1xuLy8gVGhpcyBJRCBtdXN0IG1hdGNoIHdoYXQgd29ya2Zsb3c6YnVpbGQgZ2VuZXJhdGVzIGluIC53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cuY2pzXG5leHBvcnQgY29uc3QgcnVuRGF0YXNldEl0ZW1Xb3JrZmxvdyA9IE9iamVjdC5hc3NpZ24oX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3csIHtcbiAgICB3b3JrZmxvd0lkOiAnd29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9fcnVuRGF0YXNldEl0ZW1Xb3JrZmxvdydcbn0pO1xuIiwgIi8qKl9faW50ZXJuYWxfd29ya2Zsb3dze1wid29ya2Zsb3dzXCI6e1wic3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLnRzXCI6e1wiX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3dcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24vL19ldmFsdWF0ZUNvbnZlcnNhdGlvbldvcmtmbG93XCJ9fX0sXCJzdGVwc1wiOntcInNyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi50c1wiOntcImV4ZWN1dGVFdmFsdWF0b3JTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vZXhlY3V0ZUV2YWx1YXRvclN0ZXBcIn0sXCJnZXRDb252ZXJzYXRpb25TdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vZ2V0Q29udmVyc2F0aW9uU3RlcFwifSxcImdldEV2YWx1YXRvcnNTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vZ2V0RXZhbHVhdG9yc1N0ZXBcIn0sXCJsb2dTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vbG9nU3RlcFwifX19fSovO1xudmFyIGdldENvbnZlcnNhdGlvblN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vZ2V0Q29udmVyc2F0aW9uU3RlcFwiKTtcbnZhciBnZXRFdmFsdWF0b3JzU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9nZXRFdmFsdWF0b3JzU3RlcFwiKTtcbnZhciBleGVjdXRlRXZhbHVhdG9yU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9leGVjdXRlRXZhbHVhdG9yU3RlcFwiKTtcbi8qKlxuICogU3RlcDogTG9nIHdvcmtmbG93IHByb2dyZXNzXG4gKi8gdmFyIGxvZ1N0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vbG9nU3RlcFwiKTtcbi8qKlxuICogTWFpbiB3b3JrZmxvdyBmdW5jdGlvbiAtIG9yY2hlc3RyYXRlcyB0aGUgZXZhbHVhdGlvbiBzdGVwcy5cbiAqXG4gKiBJTVBPUlRBTlQ6IFRoaXMgcnVucyBpbiBhIGRldGVybWluaXN0aWMgc2FuZGJveC5cbiAqIC0gRG8gTk9UIGNhbGwgTm9kZS5qcyBBUElzIGRpcmVjdGx5IGhlcmUgKG5vIERCLCBubyBmcywgZXRjLilcbiAqIC0gQWxsIHNpZGUgZWZmZWN0cyBtdXN0IGhhcHBlbiBpbiBzdGVwIGZ1bmN0aW9uc1xuICovIGFzeW5jIGZ1bmN0aW9uIF9ldmFsdWF0ZUNvbnZlcnNhdGlvbldvcmtmbG93KHBheWxvYWQpIHtcbiAgICBjb25zdCB7IGNvbnZlcnNhdGlvbklkLCBldmFsdWF0b3JJZHMgfSA9IHBheWxvYWQ7XG4gICAgYXdhaXQgbG9nU3RlcCgnU3RhcnRpbmcgY29udmVyc2F0aW9uIGV2YWx1YXRpb24nLCBwYXlsb2FkKTtcbiAgICBjb25zdCBjb252ZXJzYXRpb24gPSBhd2FpdCBnZXRDb252ZXJzYXRpb25TdGVwKHBheWxvYWQpO1xuICAgIGNvbnN0IGV2YWx1YXRvcnMgPSBhd2FpdCBnZXRFdmFsdWF0b3JzU3RlcChwYXlsb2FkKTtcbiAgICBpZiAoZXZhbHVhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXdhaXQgbG9nU3RlcCgnTm8gdmFsaWQgZXZhbHVhdG9ycyBmb3VuZCcsIHtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgZXZhbHVhdG9ySWRzXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICByZWFzb246ICdObyB2YWxpZCBldmFsdWF0b3JzJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgZm9yIChjb25zdCBldmFsdWF0b3Igb2YgZXZhbHVhdG9ycyl7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVFdmFsdWF0b3JTdGVwKHBheWxvYWQsIGV2YWx1YXRvci5pZCwgY29udmVyc2F0aW9uKTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIGNvbnZlcnNhdGlvbklkLFxuICAgICAgICByZXN1bHRDb3VudDogcmVzdWx0cy5sZW5ndGhcbiAgICB9O1xufVxuX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3cud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9fZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3dcIiwgX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3cpO1xuLy8gVGhpcyBJRCBtdXN0IG1hdGNoIHdoYXQgd29ya2Zsb3c6YnVpbGQgZ2VuZXJhdGVzIGluIC53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cuY2pzXG5leHBvcnQgY29uc3QgZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvdyA9IE9iamVjdC5hc3NpZ24oX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3csIHtcbiAgICB3b3JrZmxvd0lkOiAnd29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9fZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvdydcbn0pO1xuIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIi8qKlxuICogU3RlcCBmdW5jdGlvbnMgZm9yIHNjaGVkdWxlZCB0cmlnZ2VyIHdvcmtmbG93LlxuICpcbiAqIFRoZXNlIHN0ZXAgZnVuY3Rpb25zIGhhdmUgZnVsbCBOb2RlLmpzIGFjY2VzcyBhbmQgaGFuZGxlIGFsbCBkYXRhYmFzZVxuICogb3BlcmF0aW9ucyBhbmQgZXh0ZXJuYWwgc2VydmljZSBjYWxscy5cbiAqLyAvKipfX2ludGVybmFsX3dvcmtmbG93c3tcInN0ZXBzXCI6e1wic3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy50c1wiOntcImFkZENvbnZlcnNhdGlvbklkU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9hZGRDb252ZXJzYXRpb25JZFN0ZXBcIn0sXCJjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcFwifSxcImNoZWNrSW52b2NhdGlvbkNhbmNlbGxlZFN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcFwifSxcImNoZWNrVHJpZ2dlckVuYWJsZWRTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NoZWNrVHJpZ2dlckVuYWJsZWRTdGVwXCJ9LFwiY29tcHV0ZVNsZWVwRHVyYXRpb25TdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NvbXB1dGVTbGVlcER1cmF0aW9uU3RlcFwifSxcImNyZWF0ZUludm9jYXRpb25JZGVtcG90ZW50U3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jcmVhdGVJbnZvY2F0aW9uSWRlbXBvdGVudFN0ZXBcIn0sXCJkZWxldGVQZW5kaW5nSW52b2NhdGlvbnNTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2RlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXBcIn0sXCJleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZXhlY3V0ZVNjaGVkdWxlZFRyaWdnZXJTdGVwXCJ9LFwiZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9nZXROZXh0UGVuZGluZ0ludm9jYXRpb25TdGVwXCJ9LFwiaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIn0sXCJsb2dTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2xvZ1N0ZXBcIn0sXCJtYXJrQ29tcGxldGVkU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9tYXJrQ29tcGxldGVkU3RlcFwifSxcIm1hcmtGYWlsZWRTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtGYWlsZWRTdGVwXCJ9LFwibWFya1J1bm5pbmdTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtSdW5uaW5nU3RlcFwifX19fSovO1xuLyoqXG4gKiBTdGVwOiBMb2cgYSBtZXNzYWdlIChhbGxvd3MgbG9nZ2luZyBmcm9tIHdvcmtmbG93IGNvbnRleHQpXG4gKi8gZXhwb3J0IHZhciBsb2dTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9sb2dTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBDYWxjdWxhdGUgdGhlIG5leHQgZXhlY3V0aW9uIHRpbWUgcmVsYXRpdmUgdG8gYSBiYXNlIHRpbWUuXG4gKi8gZXhwb3J0IHZhciBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2FsY3VsYXRlTmV4dEV4ZWN1dGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IENvbXB1dGUgc2xlZXAgZHVyYXRpb25cbiAqIFJldHVybnMgbWlsbGlzZWNvbmRzIHRvIHNsZWVwLlxuICovIGV4cG9ydCB2YXIgY29tcHV0ZVNsZWVwRHVyYXRpb25TdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jb21wdXRlU2xlZXBEdXJhdGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEdldCB0aGUgbmV4dCBwZW5kaW5nIGludm9jYXRpb24gdG8gZXhlY3V0ZSAoZWFybGllc3Qgc2NoZWR1bGVkRm9yKS5cbiAqIFJldHVybnMgbnVsbCBpZiBubyBwZW5kaW5nIGludm9jYXRpb25zIGV4aXN0LlxuICovIGV4cG9ydCB2YXIgZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcFwiKTtcbi8qKlxuICogU3RlcDogRGVsZXRlIGFsbCBwZW5kaW5nIGludm9jYXRpb25zIGZvciBhIHRyaWdnZXIuXG4gKiBVc2VkIHdoZW4gY3JvbiBleHByZXNzaW9uIGNoYW5nZXMgb3IgdHJpZ2dlciBpcyBkaXNhYmxlZC5cbiAqLyBleHBvcnQgdmFyIGRlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2RlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IENoZWNrIGlmIHRyaWdnZXIgaXMgc3RpbGwgZW5hYmxlZCBhbmQgdGhpcyBydW5uZXIgaXMgYXV0aG9yaXRhdGl2ZS5cbiAqLyBleHBvcnQgdmFyIGNoZWNrVHJpZ2dlckVuYWJsZWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jaGVja1RyaWdnZXJFbmFibGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogVHJ5IHRvIGNyZWF0ZSBpbnZvY2F0aW9uIGlkZW1wb3RlbnRseS5cbiAqIFJldHVybnMgZXhpc3RpbmcgaW52b2NhdGlvbiBpZiBhbHJlYWR5IGNyZWF0ZWQuXG4gKi8gZXhwb3J0IHZhciBjcmVhdGVJbnZvY2F0aW9uSWRlbXBvdGVudFN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NyZWF0ZUludm9jYXRpb25JZGVtcG90ZW50U3RlcFwiKTtcbi8qKlxuICogU3RlcDogQ2hlY2sgaWYgaW52b2NhdGlvbiB3YXMgY2FuY2VsbGVkIGJlZm9yZSBleGVjdXRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiBjYW5jZWxsZWQgKHNob3VsZCBza2lwIGV4ZWN1dGlvbiksIGZhbHNlIG90aGVyd2lzZVxuICovIGV4cG9ydCB2YXIgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogTWFyayBpbnZvY2F0aW9uIGFzIHJ1bm5pbmdcbiAqLyBleHBvcnQgdmFyIG1hcmtSdW5uaW5nU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vbWFya1J1bm5pbmdTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBBZGQgYSBjb252ZXJzYXRpb24gSUQgdG8gdGhlIGludm9jYXRpb24ncyBjb252ZXJzYXRpb25JZHMgYXJyYXlcbiAqIENhbGxlZCBhZnRlciBlYWNoIGF0dGVtcHQgdG8gdHJhY2sgYWxsIGNvbnZlcnNhdGlvbnMgY3JlYXRlZCBkdXJpbmcgcmV0cmllc1xuICovIGV4cG9ydCB2YXIgYWRkQ29udmVyc2F0aW9uSWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9hZGRDb252ZXJzYXRpb25JZFN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IE1hcmsgaW52b2NhdGlvbiBhcyBjb21wbGV0ZWRcbiAqLyBleHBvcnQgdmFyIG1hcmtDb21wbGV0ZWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9tYXJrQ29tcGxldGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogTWFyayBpbnZvY2F0aW9uIGFzIGZhaWxlZFxuICovIGV4cG9ydCB2YXIgbWFya0ZhaWxlZFN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtGYWlsZWRTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBJbmNyZW1lbnQgYXR0ZW1wdCBudW1iZXIgZm9yIHJldHJ5XG4gKi8gZXhwb3J0IHZhciBpbmNyZW1lbnRBdHRlbXB0U3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEV4ZWN1dGUgdGhlIHNjaGVkdWxlZCB0cmlnZ2VyIHVzaW5nIGV4ZWN1dGVBZ2VudEFzeW5jLlxuICpcbiAqIFVzZXMgdGhlIHNoYXJlZCBleGVjdXRlQWdlbnRBc3luYyBmcm9tIFRyaWdnZXJTZXJ2aWNlIHdoaWNoIGluY2x1ZGVzXG4gKiBwcm9wZXIgdHJhY2luZywgZXJyb3IgaGFuZGxpbmcsIGFuZCBjb252ZXJzYXRpb24gbWFuYWdlbWVudC5cbiAqLyBleHBvcnQgdmFyIGV4ZWN1dGVTY2hlZHVsZWRUcmlnZ2VyU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZXhlY3V0ZVNjaGVkdWxlZFRyaWdnZXJTdGVwXCIpO1xuIiwgIi8qKlxuICogV29ya2Zsb3cgZm9yIHJ1bm5pbmcgc2NoZWR1bGVkIHRyaWdnZXJzLlxuICpcbiAqIFRoaXMgd29ya2Zsb3c6XG4gKiAxLiBHZXRzIG9yIGNyZWF0ZXMgdGhlIG5leHQgcGVuZGluZyBpbnZvY2F0aW9uXG4gKiAyLiBTbGVlcHMgdW50aWwgaXRzIHNjaGVkdWxlZCB0aW1lXG4gKiAzLiBDaGVja3MgaWYgdGhlIHRyaWdnZXIgaXMgc3RpbGwgZW5hYmxlZFxuICogNC4gRXhlY3V0ZXMgdGhlIGFnZW50IHdpdGggcmV0cmllc1xuICogNS4gRm9yIGNyb24gdHJpZ2dlcnMsIGxvb3BzIGJhY2sgdG8gc3RlcCAxXG4gKlxuICovIGltcG9ydCB7IGdldFdvcmtmbG93TWV0YWRhdGEsIHNsZWVwIH0gZnJvbSAnd29ya2Zsb3cnO1xuaW1wb3J0IHsgYWRkQ29udmVyc2F0aW9uSWRTdGVwLCBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCwgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCwgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAsIGNvbXB1dGVTbGVlcER1cmF0aW9uU3RlcCwgY3JlYXRlSW52b2NhdGlvbklkZW1wb3RlbnRTdGVwLCBleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXAsIGdldE5leHRQZW5kaW5nSW52b2NhdGlvblN0ZXAsIGluY3JlbWVudEF0dGVtcHRTdGVwLCBsb2dTdGVwLCBtYXJrQ29tcGxldGVkU3RlcCwgbWFya0ZhaWxlZFN0ZXAsIG1hcmtSdW5uaW5nU3RlcCB9IGZyb20gJy4uL3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcyc7XG4vKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcInNyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci50c1wiOntcIl9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3dcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvZnVuY3Rpb25zL3NjaGVkdWxlZFRyaWdnZXJSdW5uZXIvL19zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3dcIn19fX0qLztcbi8qKlxuICogR2VuZXJhdGUgaWRlbXBvdGVuY3kga2V5IGZvciBhIHNjaGVkdWxlZCBleGVjdXRpb24uXG4gKi8gZnVuY3Rpb24gZ2VuZXJhdGVJZGVtcG90ZW5jeUtleShzY2hlZHVsZWRUcmlnZ2VySWQsIHNjaGVkdWxlZEZvcikge1xuICAgIHJldHVybiBgc2NoZWRfJHtzY2hlZHVsZWRUcmlnZ2VySWR9XyR7c2NoZWR1bGVkRm9yfWA7XG59XG4vKipcbiAqIE1haW4gd29ya2Zsb3cgZnVuY3Rpb24gLSBydW5zIGEgc2NoZWR1bGVkIHRyaWdnZXIuXG4gKiBGb3IgY3JvbiB0cmlnZ2VycywgdGhpcyBsb29wcyBpbmRlZmluaXRlbHkgdW50aWwgZGlzYWJsZWQvZGVsZXRlZC5cbiAqIEZvciBvbmUtdGltZSB0cmlnZ2VycywgaXQgZXhlY3V0ZXMgb25jZSBhbmQgY29tcGxldGVzLlxuICpcbiAqLyBhc3luYyBmdW5jdGlvbiBfc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93KHBheWxvYWQpIHtcbiAgICBjb25zdCB7IHRlbmFudElkLCBwcm9qZWN0SWQsIGFnZW50SWQsIHNjaGVkdWxlZFRyaWdnZXJJZCB9ID0gcGF5bG9hZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldFdvcmtmbG93TWV0YWRhdGEoKTtcbiAgICBjb25zdCBydW5uZXJJZCA9IG1ldGFkYXRhLndvcmtmbG93UnVuSWQ7XG4gICAgYXdhaXQgbG9nU3RlcCgnU3RhcnRpbmcgc2NoZWR1bGVkIHRyaWdnZXIgcnVubmVyIHdvcmtmbG93Jywge1xuICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgcHJvamVjdElkLFxuICAgICAgICBhZ2VudElkLFxuICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgIHJ1bm5lcklkXG4gICAgfSk7XG4gICAgLy8gVHJhY2sgdGhlIGxhc3Qgc2NoZWR1bGVkIHRpbWUgZm9yIGNyb24gY2FsY3VsYXRpb25zXG4gICAgbGV0IGxhc3RTY2hlZHVsZWRGb3IgPSBudWxsO1xuICAgIC8vIE1haW4gZXhlY3V0aW9uIGxvb3BcbiAgICB3aGlsZSh0cnVlKXtcbiAgICAgICAgY29uc3QgZW5hYmxlZENoZWNrID0gYXdhaXQgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAoe1xuICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgcnVubmVySWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZW5hYmxlZENoZWNrLnNob3VsZENvbnRpbnVlIHx8ICFlbmFibGVkQ2hlY2sudHJpZ2dlcikge1xuICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnU2NoZWR1bGVkIHRyaWdnZXIgd29ya2Zsb3cgc3RvcHBpbmcnLCB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogZW5hYmxlZENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ3N0b3BwZWQnLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogZW5hYmxlZENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyID0gZW5hYmxlZENoZWNrLnRyaWdnZXI7XG4gICAgICAgIGNvbnN0IGlzT25lVGltZSA9ICEhdHJpZ2dlci5ydW5BdDtcbiAgICAgICAgbGV0IGludm9jYXRpb24gPSBhd2FpdCBnZXROZXh0UGVuZGluZ0ludm9jYXRpb25TdGVwKHtcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ3JlYXRlIGludm9jYXRpb24gaWYgbm9uZSBleGlzdHNcbiAgICAgICAgaWYgKCFpbnZvY2F0aW9uKSB7XG4gICAgICAgICAgICBsZXQgc2NoZWR1bGVkRm9yO1xuICAgICAgICAgICAgaWYgKGlzT25lVGltZSkge1xuICAgICAgICAgICAgICAgIGlmICghdHJpZ2dlci5ydW5BdCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2dTdGVwKCdPbmUtdGltZSB0cmlnZ2VyIG1pc3NpbmcgcnVuQXQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246ICdvbmUtdGltZSB0cmlnZ2VyIG1pc3NpbmcgcnVuQXQnXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZEZvciA9IHRyaWdnZXIucnVuQXQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXIuY3JvbkV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG5leHRFeGVjdXRpb25UaW1lIH0gPSBhd2FpdCBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgIGNyb25FeHByZXNzaW9uOiB0cmlnZ2VyLmNyb25FeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICBjcm9uVGltZXpvbmU6IHRyaWdnZXIuY3JvblRpbWV6b25lLFxuICAgICAgICAgICAgICAgICAgICBsYXN0U2NoZWR1bGVkRm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRm9yID0gbmV4dEV4ZWN1dGlvblRpbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1RyaWdnZXIgbWlzc2luZyBib3RoIGNyb25FeHByZXNzaW9uIGFuZCBydW5BdCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICByZWFzb246ICd0cmlnZ2VyIG1pc3NpbmcgY3JvbkV4cHJlc3Npb24gYW5kIHJ1bkF0J1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpZGVtcG90ZW5jeUtleSA9IGdlbmVyYXRlSWRlbXBvdGVuY3lLZXkoc2NoZWR1bGVkVHJpZ2dlcklkLCBzY2hlZHVsZWRGb3IpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlSW52b2NhdGlvbklkZW1wb3RlbnRTdGVwKHtcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRm9yLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHRyaWdnZXIucGF5bG9hZCA/PyBudWxsLFxuICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGludm9jYXRpb24gPSByZXN1bHQuaW52b2NhdGlvbjtcbiAgICAgICAgICAgIC8vIEZvciBvbmUtdGltZSB0cmlnZ2VycywgY2hlY2sgaWYgYWxyZWFkeSBwcm9jZXNzZWRcbiAgICAgICAgICAgIGlmIChpc09uZVRpbWUgJiYgcmVzdWx0LmFscmVhZHlFeGlzdHMgJiYgaW52b2NhdGlvbi5zdGF0dXMgIT09ICdwZW5kaW5nJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ09uZS10aW1lIHRyaWdnZXIgYWxyZWFkeSBleGVjdXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogaW52b2NhdGlvbi5zdGF0dXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdhbHJlYWR5X2V4ZWN1dGVkJyxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBsb2dTdGVwKCdHb3QgbmV4dCBwZW5kaW5nIGludm9jYXRpb24nLCB7XG4gICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICBzY2hlZHVsZWRGb3I6IGludm9jYXRpb24uc2NoZWR1bGVkRm9yXG4gICAgICAgIH0pO1xuICAgICAgICAvLyA0LiBTbGVlcCB1bnRpbCB0aGUgaW52b2NhdGlvbidzIHNjaGVkdWxlZCB0aW1lXG4gICAgICAgIGNvbnN0IHNsZWVwTXMgPSBhd2FpdCBjb21wdXRlU2xlZXBEdXJhdGlvblN0ZXAoaW52b2NhdGlvbi5zY2hlZHVsZWRGb3IpO1xuICAgICAgICBhd2FpdCBsb2dTdGVwKCdTbGVlcGluZyB1bnRpbCBzY2hlZHVsZWQgdGltZScsIHtcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZEZvcjogaW52b2NhdGlvbi5zY2hlZHVsZWRGb3IsXG4gICAgICAgICAgICBzbGVlcE1zXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1zKTtcbiAgICAgICAgLy8gNS4gUmUtY2hlY2sgaWYgdHJpZ2dlciBpcyBzdGlsbCBlbmFibGVkIGFmdGVyIHNsZWVwXG4gICAgICAgIGNvbnN0IHBvc3RTbGVlcENoZWNrID0gYXdhaXQgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAoe1xuICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgcnVubmVySWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcG9zdFNsZWVwQ2hlY2suc2hvdWxkQ29udGludWUgfHwgIXBvc3RTbGVlcENoZWNrLnRyaWdnZXIpIHtcbiAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1RyaWdnZXIgZGlzYWJsZWQvZGVsZXRlZCBkdXJpbmcgc2xlZXAsIHN0b3BwaW5nJywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICByZWFzb246IHBvc3RTbGVlcENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ3N0b3BwZWQnLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogcG9zdFNsZWVwQ2hlY2sucmVhc29uXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZnJlc2ggdHJpZ2dlciBjb25maWcgKG1heSBoYXZlIGNoYW5nZWQgZHVyaW5nIHNsZWVwKVxuICAgICAgICBjb25zdCBjdXJyZW50VHJpZ2dlciA9IHBvc3RTbGVlcENoZWNrLnRyaWdnZXI7XG4gICAgICAgIC8vIDYuIENoZWNrIGlmIGludm9jYXRpb24gd2FzIGNhbmNlbGxlZCBkdXJpbmcgc2xlZXBcbiAgICAgICAgY29uc3QgY2FuY2VsQ2hlY2sgPSBhd2FpdCBjaGVja0ludm9jYXRpb25DYW5jZWxsZWRTdGVwKHtcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhbmNlbENoZWNrLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnSW52b2NhdGlvbiB3YXMgY2FuY2VsbGVkLCBza2lwcGluZyB0byBuZXh0Jywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4gRXhlY3V0ZSB3aXRoIHJldHJpZXNcbiAgICAgICAgbGV0IGF0dGVtcHROdW1iZXIgPSBpbnZvY2F0aW9uLmF0dGVtcHROdW1iZXI7XG4gICAgICAgIGxldCBsYXN0RXJyb3IgPSBudWxsO1xuICAgICAgICBjb25zdCBtYXhBdHRlbXB0cyA9IGN1cnJlbnRUcmlnZ2VyLm1heFJldHJpZXMgKyAxO1xuICAgICAgICB3aGlsZShhdHRlbXB0TnVtYmVyIDw9IG1heEF0dGVtcHRzKXtcbiAgICAgICAgICAgIGNvbnN0IHJldHJ5Q2FuY2VsID0gYXdhaXQgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmV0cnlDYW5jZWwuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnSW52b2NhdGlvbiBjYW5jZWxsZWQgZHVyaW5nIHJldHJ5IGxvb3AnLCB7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNYXJrIGFzIHJ1bm5pbmdcbiAgICAgICAgICAgIGF3YWl0IG1hcmtSdW5uaW5nU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXAoe1xuICAgICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICAgIHByb2plY3RJZCxcbiAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiBjdXJyZW50VHJpZ2dlci5tZXNzYWdlVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogY3VycmVudFRyaWdnZXIucGF5bG9hZCA/PyBudWxsLFxuICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzOiBjdXJyZW50VHJpZ2dlci50aW1lb3V0U2Vjb25kc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBTYXZlIGNvbnZlcnNhdGlvbiBJRCBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGF0dGVtcHRcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhZGRDb252ZXJzYXRpb25JZFN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHJlc3VsdC5jb252ZXJzYXRpb25JZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbWFya0NvbXBsZXRlZFN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1NjaGVkdWxlZCB0cmlnZ2VyIGV4ZWN1dGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZDogcmVzdWx0LmNvbnZlcnNhdGlvbklkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGFzdEVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RFcnJvciA9IHJlc3VsdC5lcnJvciB8fCAnVW5rbm93biBlcnJvcic7XG4gICAgICAgICAgICBhd2FpdCBsb2dTdGVwKCdTY2hlZHVsZWQgdHJpZ2dlciBleGVjdXRpb24gZmFpbGVkJywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgYXR0ZW1wdE51bWJlcixcbiAgICAgICAgICAgICAgICBlcnJvcjogbGFzdEVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChhdHRlbXB0TnVtYmVyIDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbmNyZW1lbnRBdHRlbXB0U3RlcCh7XG4gICAgICAgICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0ZW1wdDogYXR0ZW1wdE51bWJlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF0dGVtcHROdW1iZXIrKztcbiAgICAgICAgICAgICAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogMC4zO1xuICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKGN1cnJlbnRUcmlnZ2VyLnJldHJ5RGVsYXlTZWNvbmRzICogMTAwMCAqICgxICsgaml0dGVyKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE1hcmsgYXMgZmFpbGVkIGlmIGFsbCByZXRyaWVzIGV4aGF1c3RlZFxuICAgICAgICBpZiAobGFzdEVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCBtYXJrRmFpbGVkU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJhY2sgdGhpcyBpbnZvY2F0aW9uJ3Mgc2NoZWR1bGVkIHRpbWUgZm9yIG5leHQgY3JvbiBjYWxjdWxhdGlvblxuICAgICAgICBsYXN0U2NoZWR1bGVkRm9yID0gaW52b2NhdGlvbi5zY2hlZHVsZWRGb3I7XG4gICAgICAgIC8vIEZvciBvbmUtdGltZSB0cmlnZ2Vycywgd2UncmUgZG9uZVxuICAgICAgICBpZiAoaXNPbmVUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogbGFzdEVycm9yID8gJ2ZhaWxlZCcgOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAvLyBGb3IgY3JvbiB0cmlnZ2VycywgbG9vcCBjb250aW51ZXMgdG8gY3JlYXRlL2dldCBuZXh0IGludm9jYXRpb25cbiAgICB9XG59XG5fc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93LndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci8vX3NjaGVkdWxlZFRyaWdnZXJSdW5uZXJXb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci8vX3NjaGVkdWxlZFRyaWdnZXJSdW5uZXJXb3JrZmxvd1wiLCBfc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93KTtcbi8vIEV4cG9ydCB3aXRoIHdvcmtmbG93SWQgZm9yIHRoZSBidWlsZCBzeXN0ZW1cbmV4cG9ydCBjb25zdCBzY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3cgPSBPYmplY3QuYXNzaWduKF9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3csIHtcbiAgICB3b3JrZmxvd0lkOiAnd29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L2Z1bmN0aW9ucy9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyLy9fc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93J1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBLHFFQUFBQSxTQUFBO0FBQUE7QUFFSSxRQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBYVIsSUFBQUEsUUFBTyxVQUFVLFNBQVMsS0FBSyxTQUFTO0FBQ3hDLGdCQUFVLFdBQVcsQ0FBQztBQUN0QixVQUFJLE9BQU8sT0FBTztBQUNsQixVQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVMsR0FBRztBQUNyQyxlQUFPLE1BQU0sR0FBRztBQUFBLE1BQ3BCLFdBQVcsU0FBUyxZQUFZLFNBQVMsR0FBRyxHQUFHO0FBQzNDLGVBQU8sUUFBUSxPQUFPLFFBQVEsR0FBRyxJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ3JEO0FBQ0EsWUFBTSxJQUFJLE1BQU0sMERBQTBELEtBQUssVUFBVSxHQUFHLENBQUM7QUFB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O0FBQUEsVUFDQSxjQUFjLFdBQVc7QUFBQSxVQUN6QixnQkFBZ0IsT0FBTztBQUFBLFFBQzNCLENBQUM7QUFBQSxNQUNMO0FBQ0EsVUFBSSxPQUFPLFNBQVM7QUFDaEIsY0FBTSxrQkFBa0I7QUFBQSxVQUNwQjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0EsY0FBYyxXQUFXO0FBQUEsUUFDN0IsQ0FBQztBQUNELGNBQU1BLFNBQVEseUNBQXlDO0FBQUEsVUFDbkQ7QUFBQSxVQUNBLGNBQWMsV0FBVztBQUFBLFVBQ3pCLGdCQUFnQixPQUFPO0FBQUEsUUFDM0IsQ0FBQztBQUNELG9CQUFZO0FBQ1o7QUFBQSxNQUNKO0FBQ0Esa0JBQVksT0FBTyxTQUFTO0FBQzVCLFlBQU1BLFNBQVEsc0NBQXNDO0FBQUEsUUFDaEQ7QUFBQSxRQUNBLGNBQWMsV0FBVztBQUFBLFFBQ3pCO0FBQUEsUUFDQSxPQUFPO0FBQUEsTUFDWCxDQUFDO0FBQ0QsVUFBSSxnQkFBZ0IsYUFBYTtBQUM3QixjQUFNLHFCQUFxQjtBQUFBLFVBQ3ZCO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxjQUFjLFdBQVc7QUFBQSxVQUN6QixnQkFBZ0I7QUFBQSxRQUNwQixDQUFDO0FBQ0Q7QUFDQSxjQUFNLFNBQVMsS0FBSyxPQUFPLElBQUk7QUFDL0IsY0FBTSxNQUFNLGVBQWUsb0JBQW9CLE9BQVEsSUFBSSxPQUFPO0FBQUEsTUFDdEUsT0FBTztBQUNIO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxRQUFJLFdBQVc7QUFDWCxZQUFNLGVBQWU7QUFBQSxRQUNqQjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0EsY0FBYyxXQUFXO0FBQUEsTUFDN0IsQ0FBQztBQUFBLElBQ0w7QUFFQSx1QkFBbUIsV0FBVztBQUU5QixRQUFJLFdBQVc7QUFDWCxhQUFPO0FBQUEsUUFDSCxRQUFRLFlBQVksV0FBVztBQUFBLFFBQy9CLGNBQWMsV0FBVztBQUFBLE1BQzdCO0FBQUEsSUFDSjtBQUFBLEVBRUo7QUFDSjtBQTNQbUI7QUE0UG5CLGdDQUFnQyxhQUFhO0FBQzdDLFdBQVcsb0JBQW9CLElBQUksMEdBQTBHLCtCQUErQjtBQUVySyxJQUFNLGlDQUFpQyxPQUFPLE9BQU8saUNBQWlDO0FBQUEsRUFDekYsWUFBWTtBQUNoQixDQUFDOyIsCiAgIm5hbWVzIjogWyJtb2R1bGUiLCAibXMiLCAiZXhlY3V0ZUV2YWx1YXRvclN0ZXAiLCAibG9nU3RlcCIsICJsb2dTdGVwIiwgImxvZ1N0ZXAiXQp9Cg==
50544
50544
  `;
50545
50545
  var POST = workflowEntrypoint(workflowCode);
50546
50546
  // Annotate the CommonJS export names for ESM import in node:
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "workflowFiles": [
3
3
  "/home/runner/work/agents/agents/agents-api/src/domains/evals/workflow/functions/runDatasetItem.ts",
4
- "/home/runner/work/agents/agents/agents-api/src/domains/run/workflow/functions/scheduledTriggerRunner.ts",
5
- "/home/runner/work/agents/agents/agents-api/src/domains/evals/workflow/functions/evaluateConversation.ts"
4
+ "/home/runner/work/agents/agents/agents-api/src/domains/evals/workflow/functions/evaluateConversation.ts",
5
+ "/home/runner/work/agents/agents/agents-api/src/domains/run/workflow/functions/scheduledTriggerRunner.ts"
6
6
  ],
7
7
  "serdeOnlyFiles": []
8
8
  }
@@ -17,20 +17,6 @@
17
17
  "stepId": "step//workflow@4.1.0-beta.54//fetch"
18
18
  }
19
19
  },
20
- "src/domains/evals/workflow/functions/runDatasetItem.ts": {
21
- "callChatApiStep": {
22
- "stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//callChatApiStep"
23
- },
24
- "createRelationStep": {
25
- "stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//createRelationStep"
26
- },
27
- "executeEvaluatorStep": {
28
- "stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//executeEvaluatorStep"
29
- },
30
- "logStep": {
31
- "stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//logStep"
32
- }
33
- },
34
20
  "src/domains/evals/workflow/functions/evaluateConversation.ts": {
35
21
  "executeEvaluatorStep": {
36
22
  "stepId": "step//./src/domains/evals/workflow/functions/evaluateConversation//executeEvaluatorStep"
@@ -45,6 +31,20 @@
45
31
  "stepId": "step//./src/domains/evals/workflow/functions/evaluateConversation//logStep"
46
32
  }
47
33
  },
34
+ "src/domains/evals/workflow/functions/runDatasetItem.ts": {
35
+ "callChatApiStep": {
36
+ "stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//callChatApiStep"
37
+ },
38
+ "createRelationStep": {
39
+ "stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//createRelationStep"
40
+ },
41
+ "executeEvaluatorStep": {
42
+ "stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//executeEvaluatorStep"
43
+ },
44
+ "logStep": {
45
+ "stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//logStep"
46
+ }
47
+ },
48
48
  "src/domains/run/workflow/steps/scheduledTriggerSteps.ts": {
49
49
  "addConversationIdStep": {
50
50
  "stepId": "step//./src/domains/run/workflow/steps/scheduledTriggerSteps//addConversationIdStep"
@@ -91,18 +91,18 @@
91
91
  }
92
92
  },
93
93
  "workflows": {
94
- "src/domains/evals/workflow/functions/runDatasetItem.ts": {
95
- "_runDatasetItemWorkflow": {
96
- "workflowId": "workflow//./src/domains/evals/workflow/functions/runDatasetItem//_runDatasetItemWorkflow",
94
+ "src/domains/evals/workflow/functions/evaluateConversation.ts": {
95
+ "_evaluateConversationWorkflow": {
96
+ "workflowId": "workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow",
97
97
  "graph": {
98
98
  "nodes": [],
99
99
  "edges": []
100
100
  }
101
101
  }
102
102
  },
103
- "src/domains/evals/workflow/functions/evaluateConversation.ts": {
104
- "_evaluateConversationWorkflow": {
105
- "workflowId": "workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow",
103
+ "src/domains/evals/workflow/functions/runDatasetItem.ts": {
104
+ "_runDatasetItemWorkflow": {
105
+ "workflowId": "workflow//./src/domains/evals/workflow/functions/runDatasetItem//_runDatasetItemWorkflow",
106
106
  "graph": {
107
107
  "nodes": [],
108
108
  "edges": []
@@ -7,8 +7,8 @@
7
7
  ],
8
8
  "workflowFiles": [
9
9
  "/home/runner/work/agents/agents/agents-api/src/domains/evals/workflow/functions/runDatasetItem.ts",
10
- "/home/runner/work/agents/agents/agents-api/src/domains/run/workflow/functions/scheduledTriggerRunner.ts",
11
- "/home/runner/work/agents/agents/agents-api/src/domains/evals/workflow/functions/evaluateConversation.ts"
10
+ "/home/runner/work/agents/agents/agents-api/src/domains/evals/workflow/functions/evaluateConversation.ts",
11
+ "/home/runner/work/agents/agents/agents-api/src/domains/run/workflow/functions/scheduledTriggerRunner.ts"
12
12
  ],
13
13
  "serdeOnlyFiles": []
14
14
  }
@@ -1,10 +1,10 @@
1
1
  import { AppConfig } from "./types/app.js";
2
2
  import "./types/index.js";
3
3
  import { Hono } from "hono";
4
- import * as hono_types13 from "hono/types";
4
+ import * as hono_types0 from "hono/types";
5
5
 
6
6
  //#region src/createApp.d.ts
7
7
  declare const isWebhookRoute: (path: string) => boolean;
8
- declare function createAgentsHono(config: AppConfig): Hono<hono_types13.BlankEnv, hono_types13.BlankSchema, "/">;
8
+ declare function createAgentsHono(config: AppConfig): Hono<hono_types0.BlankEnv, hono_types0.BlankSchema, "/">;
9
9
  //#endregion
10
10
  export { createAgentsHono, isWebhookRoute };
package/dist/createApp.js CHANGED
@@ -48,6 +48,28 @@ function createAgentsHono(config) {
48
48
  app.use("*", requestId());
49
49
  if (auth) {
50
50
  app.use("/api/auth/*", cors(authCorsConfig));
51
+ if (env.ENVIRONMENT === "development") app.post("/api/auth/dev-session", async (c) => {
52
+ const email = env.INKEEP_AGENTS_MANAGE_UI_USERNAME;
53
+ if (!email) return c.json({ error: "Dev credentials not configured. Run pnpm db:auth:init first." }, 400);
54
+ const ctx = await auth.$context;
55
+ const found = await ctx.internalAdapter.findUserByEmail(email);
56
+ if (!found) return c.json({ error: "Dev user not found. Run pnpm db:auth:init first." }, 400);
57
+ const session = await ctx.internalAdapter.createSession(found.user.id);
58
+ const key = await crypto.subtle.importKey("raw", new TextEncoder().encode(ctx.secret), {
59
+ name: "HMAC",
60
+ hash: "SHA-256"
61
+ }, false, ["sign"]);
62
+ const sig = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(session.token));
63
+ const base64Sig = btoa(String.fromCharCode(...new Uint8Array(sig)));
64
+ const encodedValue = encodeURIComponent(`${session.token}.${base64Sig}`);
65
+ const { name: cookieName, options } = ctx.authCookies.sessionToken;
66
+ const { path, httpOnly, secure, sameSite = "lax" } = options;
67
+ const maxAge = ctx.sessionConfig.expiresIn;
68
+ const sameSiteValue = sameSite.charAt(0).toUpperCase() + sameSite.slice(1);
69
+ const cookieString = `${cookieName}=${encodedValue}; Path=${path}; Max-Age=${maxAge}${httpOnly ? "; HttpOnly" : ""}${secure ? "; Secure" : ""}; SameSite=${sameSiteValue}`;
70
+ c.header("set-cookie", cookieString);
71
+ return c.json({ ok: true });
72
+ });
51
73
  app.on(["POST", "GET"], "/api/auth/*", (c) => {
52
74
  return auth.handler(c.req.raw);
53
75
  });
@@ -1,6 +1,6 @@
1
- import * as _inkeep_agents_core0 from "@inkeep/agents-core";
1
+ import * as _inkeep_agents_core1 from "@inkeep/agents-core";
2
2
 
3
3
  //#region src/data/db/manageDbClient.d.ts
4
- declare const manageDbClient: _inkeep_agents_core0.AgentsManageDatabaseClient;
4
+ declare const manageDbClient: _inkeep_agents_core1.AgentsManageDatabaseClient;
5
5
  //#endregion
6
6
  export { manageDbClient as default };
@@ -1,6 +1,6 @@
1
- import * as _inkeep_agents_core0 from "@inkeep/agents-core";
1
+ import * as _inkeep_agents_core2 from "@inkeep/agents-core";
2
2
 
3
3
  //#region src/data/db/runDbClient.d.ts
4
- declare const runDbClient: _inkeep_agents_core0.AgentsRunDatabaseClient;
4
+ declare const runDbClient: _inkeep_agents_core2.AgentsRunDatabaseClient;
5
5
  //#endregion
6
6
  export { runDbClient as default };
@@ -1,7 +1,7 @@
1
1
  import { OpenAPIHono } from "@hono/zod-openapi";
2
- import * as hono2 from "hono";
2
+ import * as hono17 from "hono";
3
3
 
4
4
  //#region src/domains/evals/routes/datasetTriggers.d.ts
5
- declare const app: OpenAPIHono<hono2.Env, {}, "/">;
5
+ declare const app: OpenAPIHono<hono17.Env, {}, "/">;
6
6
  //#endregion
7
7
  export { app as default };
@@ -1,7 +1,7 @@
1
1
  import { OpenAPIHono } from "@hono/zod-openapi";
2
- import * as hono3 from "hono";
2
+ import * as hono0 from "hono";
3
3
 
4
4
  //#region src/domains/evals/routes/index.d.ts
5
- declare const app: OpenAPIHono<hono3.Env, {}, "/">;
5
+ declare const app: OpenAPIHono<hono0.Env, {}, "/">;
6
6
  //#endregion
7
7
  export { app as default };
@@ -1,7 +1,7 @@
1
1
  import { Hono } from "hono";
2
- import * as hono_types7 from "hono/types";
2
+ import * as hono_types4 from "hono/types";
3
3
 
4
4
  //#region src/domains/evals/workflow/routes.d.ts
5
- declare const workflowRoutes: Hono<hono_types7.BlankEnv, hono_types7.BlankSchema, "/">;
5
+ declare const workflowRoutes: Hono<hono_types4.BlankEnv, hono_types4.BlankSchema, "/">;
6
6
  //#endregion
7
7
  export { workflowRoutes };
@@ -1,7 +1,7 @@
1
1
  import { OpenAPIHono } from "@hono/zod-openapi";
2
- import * as hono13 from "hono";
2
+ import * as hono6 from "hono";
3
3
 
4
4
  //#region src/domains/manage/routes/availableAgents.d.ts
5
- declare const app: OpenAPIHono<hono13.Env, {}, "/">;
5
+ declare const app: OpenAPIHono<hono6.Env, {}, "/">;
6
6
  //#endregion
7
7
  export { app as default };
@@ -1,7 +1,7 @@
1
1
  import { OpenAPIHono } from "@hono/zod-openapi";
2
- import * as hono1 from "hono";
2
+ import * as hono0 from "hono";
3
3
 
4
4
  //#region src/domains/manage/routes/conversations.d.ts
5
- declare const app: OpenAPIHono<hono1.Env, {}, "/">;
5
+ declare const app: OpenAPIHono<hono0.Env, {}, "/">;
6
6
  //#endregion
7
7
  export { app as default };
@@ -1,7 +1,7 @@
1
1
  import { OpenAPIHono } from "@hono/zod-openapi";
2
- import * as hono4 from "hono";
2
+ import * as hono18 from "hono";
3
3
 
4
4
  //#region src/domains/manage/routes/index.d.ts
5
- declare const app: OpenAPIHono<hono4.Env, {}, "/">;
5
+ declare const app: OpenAPIHono<hono18.Env, {}, "/">;
6
6
  //#endregion
7
7
  export { app as default };
@@ -1,7 +1,7 @@
1
1
  import { Hono } from "hono";
2
- import * as hono_types9 from "hono/types";
2
+ import * as hono_types12 from "hono/types";
3
3
 
4
4
  //#region src/domains/manage/routes/mcp.d.ts
5
- declare const app: Hono<hono_types9.BlankEnv, hono_types9.BlankSchema, "/">;
5
+ declare const app: Hono<hono_types12.BlankEnv, hono_types12.BlankSchema, "/">;
6
6
  //#endregion
7
7
  export { app as default };
@@ -1,10 +1,10 @@
1
1
  import { ManageAppVariables } from "../../../types/app.js";
2
2
  import { Hono } from "hono";
3
- import * as hono_types12 from "hono/types";
3
+ import * as hono_types14 from "hono/types";
4
4
 
5
5
  //#region src/domains/manage/routes/passwordResetLinks.d.ts
6
6
  declare const passwordResetLinksRoutes: Hono<{
7
7
  Variables: ManageAppVariables;
8
- }, hono_types12.BlankSchema, "/">;
8
+ }, hono_types14.BlankSchema, "/">;
9
9
  //#endregion
10
10
  export { passwordResetLinksRoutes as default };
@@ -1,10 +1,10 @@
1
1
  import { ManageAppVariables } from "../../../types/app.js";
2
2
  import { Hono } from "hono";
3
- import * as hono_types6 from "hono/types";
3
+ import * as hono_types3 from "hono/types";
4
4
 
5
5
  //#region src/domains/manage/routes/signoz.d.ts
6
6
  declare const app: Hono<{
7
7
  Variables: ManageAppVariables;
8
- }, hono_types6.BlankSchema, "/">;
8
+ }, hono_types3.BlankSchema, "/">;
9
9
  //#endregion
10
10
  export { app as default };
@@ -1,10 +1,10 @@
1
1
  import { ManageAppVariables } from "../../../types/app.js";
2
2
  import { Hono } from "hono";
3
- import * as hono_types3 from "hono/types";
3
+ import * as hono_types10 from "hono/types";
4
4
 
5
5
  //#region src/domains/manage/routes/users.d.ts
6
6
  declare const usersRoutes: Hono<{
7
7
  Variables: ManageAppVariables;
8
- }, hono_types3.BlankSchema, "/">;
8
+ }, hono_types10.BlankSchema, "/">;
9
9
  //#endregion
10
10
  export { usersRoutes as default };
@@ -1,7 +1,7 @@
1
1
  import { Hono } from "hono";
2
- import * as hono_types4 from "hono/types";
2
+ import * as hono_types6 from "hono/types";
3
3
 
4
4
  //#region src/domains/mcp/routes/mcp.d.ts
5
- declare const app: Hono<hono_types4.BlankEnv, hono_types4.BlankSchema, "/">;
5
+ declare const app: Hono<hono_types6.BlankEnv, hono_types6.BlankSchema, "/">;
6
6
  //#endregion
7
7
  export { app as default };
@@ -1,6 +1,6 @@
1
1
  import { AgentConfig, DelegateRelation } from "./Agent.js";
2
2
  import { InternalRelation } from "../utils/project.js";
3
- import * as _inkeep_agents_core1 from "@inkeep/agents-core";
3
+ import * as _inkeep_agents_core0 from "@inkeep/agents-core";
4
4
  import { CredentialStoreRegistry, FullExecutionContext } from "@inkeep/agents-core";
5
5
  import * as ai0 from "ai";
6
6
 
@@ -44,7 +44,7 @@ declare function createDelegateToAgentTool({
44
44
  message: string;
45
45
  }, {
46
46
  toolCallId: any;
47
- result: _inkeep_agents_core1.Message | _inkeep_agents_core1.Task;
47
+ result: _inkeep_agents_core0.Message | _inkeep_agents_core0.Task;
48
48
  }>;
49
49
  /**
50
50
  * Parameters for building a transfer relation config
@@ -32,9 +32,9 @@ declare const ConversationHistorySummarySchema: z.ZodObject<{
32
32
  tool_call_id: z.ZodString;
33
33
  content_summary: z.ZodString;
34
34
  relevance: z.ZodEnum<{
35
- low: "low";
36
35
  high: "high";
37
36
  medium: "medium";
37
+ low: "low";
38
38
  }>;
39
39
  }, z.core.$strip>>>;
40
40
  conversation_flow: z.ZodObject<{
@@ -9,9 +9,9 @@ declare const ImageUrlSchema: z.ZodUnion<readonly [z.ZodURL, z.ZodString]>;
9
9
  /** OpenAI-specific image detail level. Has no effect on other providers. */
10
10
  declare const ImageDetailEnum: readonly ["auto", "low", "high"];
11
11
  declare const ImageDetailSchema: z.ZodEnum<{
12
- auto: "auto";
13
- low: "low";
14
12
  high: "high";
13
+ low: "low";
14
+ auto: "auto";
15
15
  }>;
16
16
  type ImageDetail = z.infer<typeof ImageDetailSchema>;
17
17
  declare const ImageContentItemSchema: z.ZodObject<{
@@ -19,9 +19,9 @@ declare const ImageContentItemSchema: z.ZodObject<{
19
19
  image_url: z.ZodObject<{
20
20
  url: z.ZodUnion<readonly [z.ZodURL, z.ZodString]>;
21
21
  detail: z.ZodOptional<z.ZodEnum<{
22
- auto: "auto";
23
- low: "low";
24
22
  high: "high";
23
+ low: "low";
24
+ auto: "auto";
25
25
  }>>;
26
26
  }, z.core.$strip>;
27
27
  }, z.core.$strip>;
@@ -105,7 +105,7 @@ declare function createInvocationIdempotentStep(params: {
105
105
  projectId: string;
106
106
  tenantId: string;
107
107
  id: string;
108
- status: "pending" | "failed" | "running" | "completed" | "cancelled";
108
+ status: "pending" | "completed" | "failed" | "running" | "cancelled";
109
109
  resolvedPayload?: Record<string, unknown> | null | undefined;
110
110
  };
111
111
  alreadyExists: boolean;
@@ -145,7 +145,7 @@ declare function markRunningStep(params: {
145
145
  projectId: string;
146
146
  tenantId: string;
147
147
  id: string;
148
- status: "pending" | "failed" | "running" | "completed" | "cancelled";
148
+ status: "pending" | "completed" | "failed" | "running" | "cancelled";
149
149
  resolvedPayload?: Record<string, unknown> | null | undefined;
150
150
  }>;
151
151
  /**
@@ -172,7 +172,7 @@ declare function addConversationIdStep(params: {
172
172
  projectId: string;
173
173
  tenantId: string;
174
174
  id: string;
175
- status: "pending" | "failed" | "running" | "completed" | "cancelled";
175
+ status: "pending" | "completed" | "failed" | "running" | "cancelled";
176
176
  resolvedPayload?: Record<string, unknown> | null | undefined;
177
177
  } | undefined>;
178
178
  /**
@@ -197,7 +197,7 @@ declare function markCompletedStep(params: {
197
197
  projectId: string;
198
198
  tenantId: string;
199
199
  id: string;
200
- status: "pending" | "failed" | "running" | "completed" | "cancelled";
200
+ status: "pending" | "completed" | "failed" | "running" | "cancelled";
201
201
  resolvedPayload?: Record<string, unknown> | null | undefined;
202
202
  } | undefined>;
203
203
  /**
@@ -222,7 +222,7 @@ declare function markFailedStep(params: {
222
222
  projectId: string;
223
223
  tenantId: string;
224
224
  id: string;
225
- status: "pending" | "failed" | "running" | "completed" | "cancelled";
225
+ status: "pending" | "completed" | "failed" | "running" | "cancelled";
226
226
  resolvedPayload?: Record<string, unknown> | null | undefined;
227
227
  } | undefined>;
228
228
  /**
package/dist/env.d.ts CHANGED
@@ -14,11 +14,11 @@ declare const envSchema: z.ZodObject<{
14
14
  pentest: "pentest";
15
15
  }>>;
16
16
  LOG_LEVEL: z.ZodDefault<z.ZodEnum<{
17
- error: "error";
18
17
  trace: "trace";
19
18
  debug: "debug";
20
19
  info: "info";
21
20
  warn: "warn";
21
+ error: "error";
22
22
  }>>;
23
23
  INKEEP_AGENTS_MANAGE_DATABASE_URL: z.ZodString;
24
24
  INKEEP_AGENTS_RUN_DATABASE_URL: z.ZodString;
@@ -59,7 +59,7 @@ declare const envSchema: z.ZodObject<{
59
59
  declare const env: {
60
60
  NODE_ENV: "development" | "production" | "test";
61
61
  ENVIRONMENT: "development" | "production" | "test" | "pentest";
62
- LOG_LEVEL: "error" | "trace" | "debug" | "info" | "warn";
62
+ LOG_LEVEL: "trace" | "debug" | "info" | "warn" | "error";
63
63
  INKEEP_AGENTS_MANAGE_DATABASE_URL: string;
64
64
  INKEEP_AGENTS_RUN_DATABASE_URL: string;
65
65
  INKEEP_AGENTS_API_URL: string;
package/dist/factory.d.ts CHANGED
@@ -3,10 +3,10 @@ import "./types/index.js";
3
3
  import { createAgentsHono } from "./createApp.js";
4
4
  import { createAuth0Provider, createOIDCProvider } from "./ssoHelpers.js";
5
5
  import { CredentialStore, ServerConfig } from "@inkeep/agents-core";
6
- import * as hono0 from "hono";
6
+ import * as hono1 from "hono";
7
7
  import * as zod0 from "zod";
8
8
  import { SSOProviderConfig, UserAuthConfig } from "@inkeep/agents-core/auth";
9
- import * as hono_types0 from "hono/types";
9
+ import * as hono_types1 from "hono/types";
10
10
  import * as better_auth0 from "better-auth";
11
11
  import * as better_auth_plugins0 from "better-auth/plugins";
12
12
  import * as _better_auth_sso0 from "@better-auth/sso";
@@ -1570,6 +1570,6 @@ declare function createAgentsApp(config?: {
1570
1570
  credentialStores?: CredentialStore[];
1571
1571
  auth?: UserAuthConfig;
1572
1572
  sandboxConfig?: SandboxConfig;
1573
- }): hono0.Hono<hono_types0.BlankEnv, hono_types0.BlankSchema, "/">;
1573
+ }): hono1.Hono<hono_types1.BlankEnv, hono_types1.BlankSchema, "/">;
1574
1574
  //#endregion
1575
1575
  export { type SSOProviderConfig, type UserAuthConfig, createAgentsApp, createAgentsAuth, createAgentsHono, createAuth0Provider, createOIDCProvider };
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@ import { createAuth0Provider, createOIDCProvider } from "./ssoHelpers.js";
7
7
  import { SSOProviderConfig, UserAuthConfig, createAgentsApp } from "./factory.js";
8
8
  import { Hono } from "hono";
9
9
  import * as zod205 from "zod";
10
- import * as hono_types1 from "hono/types";
10
+ import * as hono_types8 from "hono/types";
11
11
  import * as better_auth79 from "better-auth";
12
12
  import * as better_auth_plugins69 from "better-auth/plugins";
13
13
  import * as _better_auth_sso10 from "@better-auth/sso";
@@ -1566,6 +1566,6 @@ declare const auth: better_auth79.Auth<{
1566
1566
  }>;
1567
1567
  }];
1568
1568
  }>;
1569
- declare const app: Hono<hono_types1.BlankEnv, hono_types1.BlankSchema, "/">;
1569
+ declare const app: Hono<hono_types8.BlankEnv, hono_types8.BlankSchema, "/">;
1570
1570
  //#endregion
1571
1571
  export { type AppConfig, type AppVariables, Hono, type NativeSandboxConfig, type SSOProviderConfig, type SandboxConfig, type UserAuthConfig, type VercelSandboxConfig, auth, createAgentsApp, createAgentsHono, createAuth0Provider, createOIDCProvider, app as default };
@@ -1,5 +1,5 @@
1
1
  import { BaseExecutionContext } from "@inkeep/agents-core";
2
- import * as hono5 from "hono";
2
+ import * as hono3 from "hono";
3
3
 
4
4
  //#region src/middleware/evalsAuth.d.ts
5
5
 
@@ -7,7 +7,7 @@ import * as hono5 from "hono";
7
7
  * Middleware to authenticate API requests using Bearer token authentication
8
8
  * First checks if token matches INKEEP_AGENTS_EVAL_API_BYPASS_SECRET,
9
9
  */
10
- declare const evalApiKeyAuth: () => hono5.MiddlewareHandler<{
10
+ declare const evalApiKeyAuth: () => hono3.MiddlewareHandler<{
11
11
  Variables: {
12
12
  executionContext: BaseExecutionContext;
13
13
  };
@@ -1,5 +1,5 @@
1
1
  import { BaseExecutionContext } from "@inkeep/agents-core";
2
- import * as hono0 from "hono";
2
+ import * as hono7 from "hono";
3
3
  import { createAuth } from "@inkeep/agents-core/auth";
4
4
 
5
5
  //#region src/middleware/manageAuth.d.ts
@@ -12,7 +12,7 @@ import { createAuth } from "@inkeep/agents-core/auth";
12
12
  * 3. Database API key
13
13
  * 4. Internal service token
14
14
  */
15
- declare const manageApiKeyAuth: () => hono0.MiddlewareHandler<{
15
+ declare const manageApiKeyAuth: () => hono7.MiddlewareHandler<{
16
16
  Variables: {
17
17
  executionContext: BaseExecutionContext;
18
18
  userId?: string;
@@ -1,6 +1,6 @@
1
1
  import { ManageAppVariables } from "../types/app.js";
2
2
  import { ProjectPermissionLevel } from "@inkeep/agents-core";
3
- import * as hono6 from "hono";
3
+ import * as hono2 from "hono";
4
4
 
5
5
  //#region src/middleware/projectAccess.d.ts
6
6
  /**
@@ -10,6 +10,6 @@ declare const requireProjectPermission: <Env$1 extends {
10
10
  Variables: ManageAppVariables;
11
11
  } = {
12
12
  Variables: ManageAppVariables;
13
- }>(permission?: ProjectPermissionLevel) => hono6.MiddlewareHandler<Env$1, string, {}, Response>;
13
+ }>(permission?: ProjectPermissionLevel) => hono2.MiddlewareHandler<Env$1, string, {}, Response>;
14
14
  //#endregion
15
15
  export { requireProjectPermission };
@@ -1,11 +1,11 @@
1
1
  import { BaseExecutionContext, ResolvedRef } from "@inkeep/agents-core";
2
- import * as hono7 from "hono";
2
+ import * as hono4 from "hono";
3
3
 
4
4
  //#region src/middleware/projectConfig.d.ts
5
5
  /**
6
6
  * Middleware that fetches the full project definition from the Management API
7
7
  */
8
- declare const projectConfigMiddleware: hono7.MiddlewareHandler<{
8
+ declare const projectConfigMiddleware: hono4.MiddlewareHandler<{
9
9
  Variables: {
10
10
  executionContext: BaseExecutionContext;
11
11
  resolvedRef: ResolvedRef;
@@ -15,7 +15,7 @@ declare const projectConfigMiddleware: hono7.MiddlewareHandler<{
15
15
  * Creates a middleware that applies project config fetching except for specified route patterns
16
16
  * @param skipRouteCheck - Function that returns true if the route should skip the middleware
17
17
  */
18
- declare const projectConfigMiddlewareExcept: (skipRouteCheck: (path: string) => boolean) => hono7.MiddlewareHandler<{
18
+ declare const projectConfigMiddlewareExcept: (skipRouteCheck: (path: string) => boolean) => hono4.MiddlewareHandler<{
19
19
  Variables: {
20
20
  executionContext: BaseExecutionContext;
21
21
  resolvedRef: ResolvedRef;
@@ -1,5 +1,5 @@
1
1
  import { ManageAppVariables } from "../types/app.js";
2
- import * as hono9 from "hono";
2
+ import * as hono14 from "hono";
3
3
 
4
4
  //#region src/middleware/requirePermission.d.ts
5
5
  type Permission = {
@@ -9,6 +9,6 @@ declare const requirePermission: <Env$1 extends {
9
9
  Variables: ManageAppVariables;
10
10
  } = {
11
11
  Variables: ManageAppVariables;
12
- }>(permissions: Permission) => hono9.MiddlewareHandler<Env$1, string, {}, Response>;
12
+ }>(permissions: Permission) => hono14.MiddlewareHandler<Env$1, string, {}, Response>;
13
13
  //#endregion
14
14
  export { requirePermission };
@@ -1,8 +1,8 @@
1
1
  import { BaseExecutionContext } from "@inkeep/agents-core";
2
- import * as hono10 from "hono";
2
+ import * as hono8 from "hono";
3
3
 
4
4
  //#region src/middleware/runAuth.d.ts
5
- declare const runApiKeyAuth: () => hono10.MiddlewareHandler<{
5
+ declare const runApiKeyAuth: () => hono8.MiddlewareHandler<{
6
6
  Variables: {
7
7
  executionContext: BaseExecutionContext;
8
8
  };
@@ -11,7 +11,7 @@ declare const runApiKeyAuth: () => hono10.MiddlewareHandler<{
11
11
  * Creates a middleware that applies API key authentication except for specified route patterns
12
12
  * @param skipRouteCheck - Function that returns true if the route should skip authentication
13
13
  */
14
- declare const runApiKeyAuthExcept: (skipRouteCheck: (path: string) => boolean) => hono10.MiddlewareHandler<{
14
+ declare const runApiKeyAuthExcept: (skipRouteCheck: (path: string) => boolean) => hono8.MiddlewareHandler<{
15
15
  Variables: {
16
16
  executionContext: BaseExecutionContext;
17
17
  };
@@ -20,7 +20,7 @@ declare const runApiKeyAuthExcept: (skipRouteCheck: (path: string) => boolean) =
20
20
  * Helper middleware for endpoints that optionally support API key authentication
21
21
  * If no auth header is present, it continues without setting the executionContext
22
22
  */
23
- declare const runOptionalAuth: () => hono10.MiddlewareHandler<{
23
+ declare const runOptionalAuth: () => hono8.MiddlewareHandler<{
24
24
  Variables: {
25
25
  executionContext?: BaseExecutionContext;
26
26
  };
@@ -1,4 +1,4 @@
1
- import * as hono14 from "hono";
1
+ import * as hono15 from "hono";
2
2
 
3
3
  //#region src/middleware/sessionAuth.d.ts
4
4
 
@@ -7,11 +7,11 @@ import * as hono14 from "hono";
7
7
  * Requires that a user has already been authenticated via Better Auth session.
8
8
  * Used primarily for manage routes that require an active user session.
9
9
  */
10
- declare const sessionAuth: () => hono14.MiddlewareHandler<any, string, {}, Response>;
10
+ declare const sessionAuth: () => hono15.MiddlewareHandler<any, string, {}, Response>;
11
11
  /**
12
12
  * Global session middleware - sets user and session in context for all routes
13
13
  * Used for all routes that require an active user session.
14
14
  */
15
- declare const sessionContext: () => hono14.MiddlewareHandler<any, string, {}, Response>;
15
+ declare const sessionContext: () => hono15.MiddlewareHandler<any, string, {}, Response>;
16
16
  //#endregion
17
17
  export { sessionAuth, sessionContext };
@@ -1,4 +1,4 @@
1
- import * as hono16 from "hono";
1
+ import * as hono13 from "hono";
2
2
 
3
3
  //#region src/middleware/tenantAccess.d.ts
4
4
 
@@ -11,7 +11,7 @@ import * as hono16 from "hono";
11
11
  * - API key user: Access only to the tenant associated with the API key
12
12
  * - Session user: Access based on organization membership
13
13
  */
14
- declare const requireTenantAccess: () => hono16.MiddlewareHandler<{
14
+ declare const requireTenantAccess: () => hono13.MiddlewareHandler<{
15
15
  Variables: {
16
16
  userId: string;
17
17
  tenantId: string;
@@ -1,7 +1,7 @@
1
- import * as hono17 from "hono";
1
+ import * as hono11 from "hono";
2
2
 
3
3
  //#region src/middleware/tracing.d.ts
4
- declare const otelBaggageMiddleware: () => hono17.MiddlewareHandler<any, string, {}, Response>;
5
- declare const executionBaggageMiddleware: () => hono17.MiddlewareHandler<any, string, {}, Response>;
4
+ declare const otelBaggageMiddleware: () => hono11.MiddlewareHandler<any, string, {}, Response>;
5
+ declare const executionBaggageMiddleware: () => hono11.MiddlewareHandler<any, string, {}, Response>;
6
6
  //#endregion
7
7
  export { executionBaggageMiddleware, otelBaggageMiddleware };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inkeep/agents-api",
3
- "version": "0.0.0-dev-20260216002643",
3
+ "version": "0.0.0-dev-20260216012253",
4
4
  "description": "Unified Inkeep Agents API - combines management, runtime, and evaluation capabilities",
5
5
  "types": "dist/index.d.ts",
6
6
  "exports": {
@@ -67,10 +67,10 @@
67
67
  "openid-client": "^6.8.1",
68
68
  "pg": "^8.16.3",
69
69
  "workflow": "^4.1.0-beta.54",
70
- "@inkeep/agents-core": "^0.0.0-dev-20260216002643",
71
- "@inkeep/agents-manage-mcp": "^0.0.0-dev-20260216002643",
72
- "@inkeep/agents-mcp": "^0.0.0-dev-20260216002643",
73
- "@inkeep/agents-work-apps": "^0.0.0-dev-20260216002643"
70
+ "@inkeep/agents-core": "^0.0.0-dev-20260216012253",
71
+ "@inkeep/agents-manage-mcp": "^0.0.0-dev-20260216012253",
72
+ "@inkeep/agents-mcp": "^0.0.0-dev-20260216012253",
73
+ "@inkeep/agents-work-apps": "^0.0.0-dev-20260216012253"
74
74
  },
75
75
  "peerDependencies": {
76
76
  "@hono/zod-openapi": "^1.1.5",