@macedon-technologies/batman 1.12.6 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/.jsii +7 -5
  2. package/API.md +961 -1062
  3. package/lib/Api/ApiFiles.d.ts +5 -0
  4. package/lib/Api/ApiFiles.js +15 -0
  5. package/lib/Api/ApiFunctionFile.d.ts +4 -0
  6. package/lib/Api/ApiFunctionFile.js +18 -0
  7. package/lib/Api/ApiHelperFiles.d.ts +5 -0
  8. package/lib/Api/ApiHelperFiles.js +15 -0
  9. package/lib/Api/AppHelperFile.d.ts +4 -0
  10. package/lib/Api/AppHelperFile.js +63 -0
  11. package/lib/Api/AppMiddlewareFiles.d.ts +5 -0
  12. package/lib/Api/AppMiddlewareFiles.js +19 -0
  13. package/lib/Api/AuthMiddlewareFile.d.ts +4 -0
  14. package/lib/Api/AuthMiddlewareFile.js +109 -0
  15. package/lib/Api/CorsMiddlewareFile.d.ts +4 -0
  16. package/lib/Api/CorsMiddlewareFile.js +54 -0
  17. package/lib/Api/ErrorHandlerMiddlewareFile.d.ts +4 -0
  18. package/lib/Api/ErrorHandlerMiddlewareFile.js +49 -0
  19. package/lib/Api/ExpressApiRouterFile.d.ts +4 -0
  20. package/lib/Api/ExpressApiRouterFile.js +61 -0
  21. package/lib/Application.js +6 -6
  22. package/lib/BatmanProject.js +2 -4
  23. package/lib/BootcampApplication.js +4 -4
  24. package/lib/BootcampProject.js +2 -4
  25. package/lib/CodeOwnersFile.js +2 -4
  26. package/lib/LocalDevAppFile.js +2 -1
  27. package/lib/LocalDevFiles.d.ts +7 -0
  28. package/lib/LocalDevFiles.js +13 -0
  29. package/lib/{ApiFunctionFile.d.ts → LocalDevServerFile.d.ts} +1 -1
  30. package/lib/LocalDevServerFile.js +59 -0
  31. package/lib/ProductionDeployWorkflow.js +2 -4
  32. package/lib/StagingDeployWorkflow.js +2 -4
  33. package/lib/ViteReactProject.js +8 -1
  34. package/lib/WorkflowAutoDiscover.js +40 -7
  35. package/lib/WorkflowProvider.js +113 -62
  36. package/package.json +45 -39
  37. package/pnpm-workspace.yaml +6 -0
  38. package/lib/ApiFunctionFile.js +0 -30
@@ -1,12 +1,45 @@
1
1
  "use strict";
2
- var _a;
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
3
35
  Object.defineProperty(exports, "__esModule", { value: true });
4
36
  exports.WorkflowAutoDiscover = void 0;
5
37
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
- const fs = require("fs");
7
- const path = require("path");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
8
40
  const projen_1 = require("projen");
9
41
  class WorkflowAutoDiscover extends projen_1.Component {
42
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.WorkflowAutoDiscover", version: "1.14.0" };
10
43
  constructor(project) {
11
44
  super(project);
12
45
  }
@@ -30,18 +63,17 @@ class WorkflowAutoDiscover extends projen_1.Component {
30
63
  }
31
64
  }
32
65
  exports.WorkflowAutoDiscover = WorkflowAutoDiscover;
33
- _a = JSII_RTTI_SYMBOL_1;
34
- WorkflowAutoDiscover[_a] = { fqn: "@macedon-technologies/batman.WorkflowAutoDiscover", version: "1.12.6" };
35
66
  function generateWorkflowFile(className, workflowJsonName) {
36
67
  return [
37
68
  '// ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen".',
38
69
  "import { join } from 'path';",
39
70
  "import { ISecret } from 'aws-cdk-lib/aws-secretsmanager';",
40
71
  "import { Construct } from 'constructs';",
41
- "import { WorkflowProvider } from './WorkflowProvider';",
72
+ "import { Replacement, WorkflowProvider } from './WorkflowProvider';",
42
73
  '',
43
74
  `export interface ${className}Props {`,
44
75
  ' readonly secret: ISecret;',
76
+ ' readonly replacements?: Replacement[];',
45
77
  '}',
46
78
  '',
47
79
  `export class ${className} extends WorkflowProvider {`,
@@ -49,6 +81,7 @@ function generateWorkflowFile(className, workflowJsonName) {
49
81
  ' super(scope, id, {',
50
82
  ` workflowFilePath: join(__dirname, '../workflows/${workflowJsonName}'),`,
51
83
  ' secret: props.secret,',
84
+ ' replacements: props.replacements,',
52
85
  ' });',
53
86
  ' }',
54
87
  '}',
@@ -68,4 +101,4 @@ function toClassName(baseName) {
68
101
  }
69
102
  return pascal + 'Workflow';
70
103
  }
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2Zsb3dBdXRvRGlzY292ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvV29ya2Zsb3dBdXRvRGlzY292ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLG1DQUFtQztBQUduQyxNQUFhLG9CQUFxQixTQUFRLGtCQUFTO0lBQ2pELFlBQVksT0FBNEI7UUFDdEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxVQUFVO1FBQ1IsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRW5CLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDckUsSUFBSSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBRWpDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2hDLGFBQWEsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztpQkFDekMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDaEMsSUFBSSxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZFLEVBQUUsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFakQsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3QyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RELEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxTQUFTLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDOztBQTFCSCxvREEyQkM7OztBQUVELFNBQVMsb0JBQW9CLENBQUMsU0FBaUIsRUFBRSxnQkFBd0I7SUFDdkUsT0FBTztRQUNMLCtFQUErRTtRQUMvRSw4QkFBOEI7UUFDOUIsMkRBQTJEO1FBQzNELHlDQUF5QztRQUN6Qyx3REFBd0Q7UUFDeEQsRUFBRTtRQUNGLG9CQUFvQixTQUFTLFNBQVM7UUFDdEMsNkJBQTZCO1FBQzdCLEdBQUc7UUFDSCxFQUFFO1FBQ0YsZ0JBQWdCLFNBQVMsNkJBQTZCO1FBQ3RELHNEQUFzRCxTQUFTLFVBQVU7UUFDekUsd0JBQXdCO1FBQ3hCLHlEQUF5RCxnQkFBZ0IsS0FBSztRQUM5RSw2QkFBNkI7UUFDN0IsU0FBUztRQUNULEtBQUs7UUFDTCxHQUFHO1FBQ0gsRUFBRTtLQUNILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEdBQVc7SUFDL0IsT0FBTyxHQUFHO1NBQ1AsS0FBSyxDQUFDLFNBQVMsQ0FBQztTQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdkUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLFFBQWdCO0lBQ25DLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLE1BQU0sR0FBRyxVQUFVLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93QXV0b0Rpc2NvdmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuICB9XG5cbiAgc3ludGhlc2l6ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5zeW50aGVzaXplKCk7XG5cbiAgICBjb25zdCB3b3JrZmxvd3NEaXIgPSBwYXRoLmpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgJ3NyYy93b3JrZmxvd3MnKTtcbiAgICBsZXQgd29ya2Zsb3dGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtmbG93c0RpcikpIHtcbiAgICAgIHdvcmtmbG93RmlsZXMgPSBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NEaXIpXG4gICAgICAgIC5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKCcuanNvbicpKVxuICAgICAgICAuc29ydCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnN0cnVjdHNEaXIgPSBwYXRoLmpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgJ3NyYy9jb25zdHJ1Y3RzJyk7XG4gICAgZnMubWtkaXJTeW5jKGNvbnN0cnVjdHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHdvcmtmbG93RmlsZXMpIHtcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZmlsZS5yZXBsYWNlKC9cXC5qc29uJC8sICcnKTtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRvQ2xhc3NOYW1lKGJhc2VOYW1lKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZVdvcmtmbG93RmlsZShjbGFzc05hbWUsIGZpbGUpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oY29uc3RydWN0c0RpciwgYCR7Y2xhc3NOYW1lfS50c2ApLCBjb250ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd0ZpbGUoY2xhc3NOYW1lOiBzdHJpbmcsIHdvcmtmbG93SnNvbk5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBbXG4gICAgJy8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi4nLFxuICAgIFwiaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1wiLFxuICAgIFwiaW1wb3J0IHsgSVNlY3JldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XCIsXG4gICAgXCJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcIixcbiAgICBcImltcG9ydCB7IFdvcmtmbG93UHJvdmlkZXIgfSBmcm9tICcuL1dvcmtmbG93UHJvdmlkZXInO1wiLFxuICAgICcnLFxuICAgIGBleHBvcnQgaW50ZXJmYWNlICR7Y2xhc3NOYW1lfVByb3BzIHtgLFxuICAgICcgIHJlYWRvbmx5IHNlY3JldDogSVNlY3JldDsnLFxuICAgICd9JyxcbiAgICAnJyxcbiAgICBgZXhwb3J0IGNsYXNzICR7Y2xhc3NOYW1lfSBleHRlbmRzIFdvcmtmbG93UHJvdmlkZXIge2AsXG4gICAgYCAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6ICR7Y2xhc3NOYW1lfVByb3BzKSB7YCxcbiAgICAnICAgIHN1cGVyKHNjb3BlLCBpZCwgeycsXG4gICAgYCAgICAgIHdvcmtmbG93RmlsZVBhdGg6IGpvaW4oX19kaXJuYW1lLCAnLi4vd29ya2Zsb3dzLyR7d29ya2Zsb3dKc29uTmFtZX0nKSxgLFxuICAgICcgICAgICBzZWNyZXQ6IHByb3BzLnNlY3JldCwnLFxuICAgICcgICAgfSk7JyxcbiAgICAnICB9JyxcbiAgICAnfScsXG4gICAgJycsXG4gIF0uam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHRvUGFzY2FsQ2FzZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHJcbiAgICAuc3BsaXQoL1stX1xcc10rLylcbiAgICAubWFwKHdvcmQgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSlcbiAgICAuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIHRvQ2xhc3NOYW1lKGJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXNjYWwgPSB0b1Bhc2NhbENhc2UoYmFzZU5hbWUpO1xuICBpZiAocGFzY2FsLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJ3dvcmtmbG93JykpIHtcbiAgICByZXR1cm4gcGFzY2FsLnNsaWNlKDAsIC04KSArICdXb3JrZmxvdyc7XG4gIH1cbiAgcmV0dXJuIHBhc2NhbCArICdXb3JrZmxvdyc7XG59XG4iXX0=
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2Zsb3dBdXRvRGlzY292ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvV29ya2Zsb3dBdXRvRGlzY292ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsbUNBQW1DO0FBR25DLE1BQWEsb0JBQXFCLFNBQVEsa0JBQVM7O0lBQ2pELFlBQVksT0FBNEI7UUFDdEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxVQUFVO1FBQ1IsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRW5CLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDckUsSUFBSSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBRWpDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2hDLGFBQWEsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztpQkFDekMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDaEMsSUFBSSxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZFLEVBQUUsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFakQsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3QyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RELEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxTQUFTLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDOztBQTFCSCxvREEyQkM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLFNBQWlCLEVBQUUsZ0JBQXdCO0lBQ3ZFLE9BQU87UUFDTCwrRUFBK0U7UUFDL0UsOEJBQThCO1FBQzlCLDJEQUEyRDtRQUMzRCx5Q0FBeUM7UUFDekMscUVBQXFFO1FBQ3JFLEVBQUU7UUFDRixvQkFBb0IsU0FBUyxTQUFTO1FBQ3RDLDZCQUE2QjtRQUM3QiwwQ0FBMEM7UUFDMUMsR0FBRztRQUNILEVBQUU7UUFDRixnQkFBZ0IsU0FBUyw2QkFBNkI7UUFDdEQsc0RBQXNELFNBQVMsVUFBVTtRQUN6RSx3QkFBd0I7UUFDeEIseURBQXlELGdCQUFnQixLQUFLO1FBQzlFLDZCQUE2QjtRQUM3Qix5Q0FBeUM7UUFDekMsU0FBUztRQUNULEtBQUs7UUFDTCxHQUFHO1FBQ0gsRUFBRTtLQUNILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEdBQVc7SUFDL0IsT0FBTyxHQUFHO1NBQ1AsS0FBSyxDQUFDLFNBQVMsQ0FBQztTQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdkUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLFFBQWdCO0lBQ25DLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLE1BQU0sR0FBRyxVQUFVLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93QXV0b0Rpc2NvdmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuICB9XG5cbiAgc3ludGhlc2l6ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5zeW50aGVzaXplKCk7XG5cbiAgICBjb25zdCB3b3JrZmxvd3NEaXIgPSBwYXRoLmpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgJ3NyYy93b3JrZmxvd3MnKTtcbiAgICBsZXQgd29ya2Zsb3dGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtmbG93c0RpcikpIHtcbiAgICAgIHdvcmtmbG93RmlsZXMgPSBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NEaXIpXG4gICAgICAgIC5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKCcuanNvbicpKVxuICAgICAgICAuc29ydCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnN0cnVjdHNEaXIgPSBwYXRoLmpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgJ3NyYy9jb25zdHJ1Y3RzJyk7XG4gICAgZnMubWtkaXJTeW5jKGNvbnN0cnVjdHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHdvcmtmbG93RmlsZXMpIHtcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZmlsZS5yZXBsYWNlKC9cXC5qc29uJC8sICcnKTtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRvQ2xhc3NOYW1lKGJhc2VOYW1lKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZVdvcmtmbG93RmlsZShjbGFzc05hbWUsIGZpbGUpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oY29uc3RydWN0c0RpciwgYCR7Y2xhc3NOYW1lfS50c2ApLCBjb250ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd0ZpbGUoY2xhc3NOYW1lOiBzdHJpbmcsIHdvcmtmbG93SnNvbk5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBbXG4gICAgJy8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi4nLFxuICAgIFwiaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1wiLFxuICAgIFwiaW1wb3J0IHsgSVNlY3JldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XCIsXG4gICAgXCJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcIixcbiAgICBcImltcG9ydCB7IFJlcGxhY2VtZW50LCBXb3JrZmxvd1Byb3ZpZGVyIH0gZnJvbSAnLi9Xb3JrZmxvd1Byb3ZpZGVyJztcIixcbiAgICAnJyxcbiAgICBgZXhwb3J0IGludGVyZmFjZSAke2NsYXNzTmFtZX1Qcm9wcyB7YCxcbiAgICAnICByZWFkb25seSBzZWNyZXQ6IElTZWNyZXQ7JyxcbiAgICAnICByZWFkb25seSByZXBsYWNlbWVudHM/OiBSZXBsYWNlbWVudFtdOycsXG4gICAgJ30nLFxuICAgICcnLFxuICAgIGBleHBvcnQgY2xhc3MgJHtjbGFzc05hbWV9IGV4dGVuZHMgV29ya2Zsb3dQcm92aWRlciB7YCxcbiAgICBgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogJHtjbGFzc05hbWV9UHJvcHMpIHtgLFxuICAgICcgICAgc3VwZXIoc2NvcGUsIGlkLCB7JyxcbiAgICBgICAgICAgd29ya2Zsb3dGaWxlUGF0aDogam9pbihfX2Rpcm5hbWUsICcuLi93b3JrZmxvd3MvJHt3b3JrZmxvd0pzb25OYW1lfScpLGAsXG4gICAgJyAgICAgIHNlY3JldDogcHJvcHMuc2VjcmV0LCcsXG4gICAgJyAgICAgIHJlcGxhY2VtZW50czogcHJvcHMucmVwbGFjZW1lbnRzLCcsXG4gICAgJyAgICB9KTsnLFxuICAgICcgIH0nLFxuICAgICd9JyxcbiAgICAnJyxcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gdG9QYXNjYWxDYXNlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0clxuICAgIC5zcGxpdCgvWy1fXFxzXSsvKVxuICAgIC5tYXAod29yZCA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKVxuICAgIC5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gdG9DbGFzc05hbWUoYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhc2NhbCA9IHRvUGFzY2FsQ2FzZShiYXNlTmFtZSk7XG4gIGlmIChwYXNjYWwudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnd29ya2Zsb3cnKSkge1xuICAgIHJldHVybiBwYXNjYWwuc2xpY2UoMCwgLTgpICsgJ1dvcmtmbG93JztcbiAgfVxuICByZXR1cm4gcGFzY2FsICsgJ1dvcmtmbG93Jztcbn1cbiJdfQ==
@@ -8,13 +8,32 @@ class WorkflowProviderFile extends projen_1.TextFile {
8
8
  marker: true,
9
9
  readonly: true,
10
10
  lines: [
11
- 'import { Arn, AssetHashType, CfnOutput, CustomResource, Duration, Reference, Stack } from \'aws-cdk-lib\';',
12
- 'import { Effect, PolicyStatement } from \'aws-cdk-lib/aws-iam\';',
13
- 'import { Code, Function, Runtime } from \'aws-cdk-lib/aws-lambda\';',
14
- 'import { Asset } from \'aws-cdk-lib/aws-s3-assets\';',
15
- 'import { ISecret } from \'aws-cdk-lib/aws-secretsmanager\';',
16
- 'import { Provider } from \'aws-cdk-lib/custom-resources\';',
17
- 'import { Construct } from \'constructs\';',
11
+ "import { readFileSync } from 'fs';",
12
+ "import { join } from 'path';",
13
+ "import { Arn, CfnOutput, CustomResource, Duration, Reference, Stack } from 'aws-cdk-lib';",
14
+ "import { Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam';",
15
+ "import { Code, Function, Runtime } from 'aws-cdk-lib/aws-lambda';",
16
+ "import { ISecret } from 'aws-cdk-lib/aws-secretsmanager';",
17
+ "import { Provider } from 'aws-cdk-lib/custom-resources';",
18
+ "import { Construct } from 'constructs';",
19
+ "import { JSONPath } from 'jsonpath-plus';",
20
+ '',
21
+ 'export interface Replacement {',
22
+ ' /**',
23
+ " * The 'name' from the 'node' that you'd like to make a replacement on.",
24
+ ' */',
25
+ ' readonly nodeName: string;',
26
+ '',
27
+ ' /**',
28
+ ' * A dotpath to the field on the node to change.',
29
+ ' */',
30
+ ' readonly path: string;',
31
+ '',
32
+ ' /**',
33
+ ' * The value to change the field to.',
34
+ ' */',
35
+ ' readonly value: string;',
36
+ '}',
18
37
  '',
19
38
  'export interface WorkflowProviderProps {',
20
39
  ' /**',
@@ -30,6 +49,12 @@ class WorkflowProviderFile extends projen_1.TextFile {
30
49
  ' * }',
31
50
  ' */',
32
51
  ' readonly secret: ISecret;',
52
+ '',
53
+ ' /**',
54
+ ' * An array of Replacements to make against the workflow. Use this to update Lambda function ARNs and other',
55
+ ' * AWS-controlled resources in your workflow.',
56
+ ' */',
57
+ ' readonly replacements?: Replacement[];',
33
58
  '}',
34
59
  '',
35
60
  'export class WorkflowProvider extends Construct {',
@@ -39,24 +64,32 @@ class WorkflowProviderFile extends projen_1.TextFile {
39
64
  ' constructor(scope: Construct, id: string, props: WorkflowProviderProps) {',
40
65
  ' super(scope, id);',
41
66
  '',
42
- ' const workflowAsset = new Asset(this, \'WorkflowAsset\', {',
43
- ' path: props.workflowFilePath,',
44
- ' assetHashType: AssetHashType.SOURCE,',
45
- ' });',
67
+ " const workflowContents = readFileSync(join(__dirname, '../workflows/alfred.json'));",
68
+ " const workflow = JSON.parse(workflowContents.toString('utf8'));",
69
+ ' let newContents: string = workflow;',
70
+ ' if (props.replacements) {',
71
+ ' newContents = JSON.stringify(props.replacements',
72
+ ' .reduce((p: any, c: Replacement) => {',
73
+ ' replaceFieldByNodeName(p, c.nodeName, c.path, c.value);',
74
+ ' return p;',
75
+ ' }, workflow),',
76
+ ' null,',
77
+ ' 2);',
78
+ ' }',
46
79
  '',
47
- ' const lambda = this.handler = new Function(this, \'Handler\', {',
80
+ '',
81
+ " const lambda = this.handler = new Function(this, 'Handler', {",
48
82
  ' runtime: Runtime.NODEJS_22_X,',
49
- ' handler: \'index.handler\',',
83
+ " handler: 'index.handler',",
50
84
  ' timeout: Duration.minutes(5),',
51
85
  ' code: Code.fromInline(`',
52
- 'const { SecretsManagerClient, GetSecretValueCommand } = require(\'@aws-sdk/client-secrets-manager\');',
53
- 'const { S3Client, GetObjectCommand } = require(\'@aws-sdk/client-s3\');',
86
+ "const { SecretsManagerClient, GetSecretValueCommand } = require('@aws-sdk/client-secrets-manager');",
54
87
  '',
55
88
  'exports.handler = async (event) => {',
56
- ' console.log(\'Event:\', JSON.stringify(event, null, 2));',
89
+ " console.log('Event:', JSON.stringify(event, null, 2));",
57
90
  ' ',
58
- ' if (event.RequestType === \'Delete\') {',
59
- ' return { PhysicalResourceId: event.PhysicalResourceId || \'workflow-uploader\' };',
91
+ " if (event.RequestType === 'Delete') {",
92
+ " return { PhysicalResourceId: event.PhysicalResourceId || 'workflow-uploader' };",
60
93
  ' }',
61
94
  '',
62
95
  ' try {',
@@ -68,14 +101,7 @@ class WorkflowProviderFile extends projen_1.TextFile {
68
101
  ' const secret = JSON.parse(secretResponse.SecretString);',
69
102
  ' const { url, apiKey } = secret;',
70
103
  ' ',
71
- ' // Read workflow file from S3',
72
- ' const s3Client = new S3Client({});',
73
- ' const s3Command = new GetObjectCommand({',
74
- ' Bucket: process.env.ASSET_BUCKET,',
75
- ' Key: process.env.ASSET_KEY,',
76
- ' });',
77
- ' const s3Response = await s3Client.send(s3Command);',
78
- ' const workflowContent = await s3Response.Body.transformToString();',
104
+ ' const workflowContent = event.ResourceProperties.Content;',
79
105
  ' const { name, nodes, connections, settings } = JSON.parse(workflowContent);',
80
106
  ' const workflowData = {',
81
107
  ' name,',
@@ -86,27 +112,27 @@ class WorkflowProviderFile extends projen_1.TextFile {
86
112
  ' delete workflowData.settings.binaryMode;',
87
113
  '',
88
114
  ' const headers = {',
89
- ' \'Content-Type\': \'application/json\',',
90
- ' \'X-N8N-API-KEY\': apiKey,',
115
+ " 'Content-Type': 'application/json',",
116
+ " 'X-N8N-API-KEY': apiKey,",
91
117
  ' };',
92
118
  ' ',
93
119
  ' let workflowId = event.PhysicalResourceId;',
94
120
  ' let isUpdate = false;',
95
121
  ' ',
96
122
  ' // Try to get existing workflow if we have a physicalResourceId',
97
- ' if (workflowId && workflowId !== \'workflow-uploader\') {',
123
+ " if (workflowId && workflowId !== 'workflow-uploader') {",
98
124
  ' try {',
99
125
  ' const getResponse = await fetch(\\`\\${url}/api/v1/workflows/\\${workflowId}\\`, {',
100
- ' method: \'GET\',',
126
+ " method: 'GET',",
101
127
  ' headers,',
102
128
  ' });',
103
129
  ' ',
104
130
  ' if (getResponse.ok) {',
105
131
  ' isUpdate = true;',
106
- ' console.log(\'Found existing workflow, will update\');',
132
+ " console.log('Found existing workflow, will update');",
107
133
  ' }',
108
134
  ' } catch (error) {',
109
- ' console.log(\'Workflow not found, will create new one\');',
135
+ " console.log('Workflow not found, will create new one');",
110
136
  ' }',
111
137
  ' }',
112
138
  ' ',
@@ -114,7 +140,7 @@ class WorkflowProviderFile extends projen_1.TextFile {
114
140
  ' if (isUpdate) {',
115
141
  ' // Update existing workflow',
116
142
  ' const updateResponse = await fetch(\\`\\${url}/api/v1/workflows/\\${workflowId}\\`, {',
117
- ' method: \'PUT\',',
143
+ " method: 'PUT',",
118
144
  ' headers,',
119
145
  ' body: JSON.stringify(workflowData),',
120
146
  ' });',
@@ -124,11 +150,11 @@ class WorkflowProviderFile extends projen_1.TextFile {
124
150
  ' }',
125
151
  ' ',
126
152
  ' result = await updateResponse.json();',
127
- ' console.log(\'Workflow updated successfully\');',
153
+ " console.log('Workflow updated successfully');",
128
154
  ' } else {',
129
155
  ' // Create new workflow',
130
156
  ' const createResponse = await fetch(\\`\\${url}/api/v1/workflows\\`, {',
131
- ' method: \'POST\',',
157
+ " method: 'POST',",
132
158
  ' headers,',
133
159
  ' body: JSON.stringify(workflowData),',
134
160
  ' });',
@@ -145,12 +171,12 @@ class WorkflowProviderFile extends projen_1.TextFile {
145
171
  ' ',
146
172
  ' ',
147
173
  ' workflowId = result.id;',
148
- ' console.log(\'Workflow created successfully\');',
174
+ " console.log('Workflow created successfully');",
149
175
  ' }',
150
176
  ' ',
151
177
  ' // Activate the workflow',
152
178
  ' const activateResponse = await fetch(\\`\\${url}/api/v1/workflows/\\${workflowId}/activate\\`, {',
153
- ' method: \'POST\',',
179
+ " method: 'POST',",
154
180
  ' headers,',
155
181
  ' });',
156
182
  ' ',
@@ -161,19 +187,19 @@ class WorkflowProviderFile extends projen_1.TextFile {
161
187
  ' }',
162
188
  ' console.warn(\\`Activation failed: \\${activateResponse.status} \\${activateResponse.statusText}\\\\ \\${JSON.stringify(result)} \\`);',
163
189
  ' } else {',
164
- ' console.log(\'Workflow activated successfully\');',
190
+ " console.log('Workflow activated successfully');",
165
191
  ' }',
166
192
  '',
167
193
  ' // Fetch the workflow to extract webhook path',
168
- ' let webhookPath = \\\'\\\';',
194
+ " let webhookPath = \\'\\';",
169
195
  ' const getWorkflowResponse = await fetch(\\`\\${url}/api/v1/workflows/\\${workflowId}\\`, {',
170
- ' method: \'GET\',',
196
+ " method: 'GET',",
171
197
  ' headers,',
172
198
  ' });',
173
199
  '',
174
200
  ' if (getWorkflowResponse.ok) {',
175
201
  ' const workflow = await getWorkflowResponse.json();',
176
- ' const webhookNode = (workflow.nodes || []).find(n => n.type === \'n8n-nodes-base.webhook\');',
202
+ " const webhookNode = (workflow.nodes || []).find(n => n.type === 'n8n-nodes-base.webhook');",
177
203
  ' if (webhookNode && webhookNode.parameters && webhookNode.parameters.path) {',
178
204
  ' webhookPath = webhookNode.parameters.path;',
179
205
  ' console.log(\\`Found webhook path: \\${webhookPath}\\`);',
@@ -185,68 +211,93 @@ class WorkflowProviderFile extends projen_1.TextFile {
185
211
  ' Data: { WorkflowId: workflowId, WebhookPath: webhookPath }',
186
212
  ' };',
187
213
  ' } catch (error) {',
188
- ' console.error(\'Error:\', error);',
214
+ " console.error('Error:', error);",
189
215
  ' return {',
190
- ' PhysicalResourceId: event.PhysicalResourceId || \'workflow-uploader\',',
191
- ' Data: { Error: String(error), WebhookPath: \'unavailable\' }',
216
+ " PhysicalResourceId: event.PhysicalResourceId || 'workflow-uploader',",
217
+ " Data: { Error: String(error), WebhookPath: 'unavailable' }",
192
218
  ' };',
193
219
  ' }',
194
220
  '};',
195
221
  ' `),',
196
222
  ' environment: {',
197
223
  ' SECRET_ARN: props.secret.secretArn,',
198
- ' ASSET_BUCKET: workflowAsset.bucket.bucketName,',
199
- ' ASSET_KEY: workflowAsset.s3ObjectKey,',
200
224
  ' },',
201
225
  ' });',
202
226
  '',
203
227
  ' props.secret.grantRead(lambda);',
204
- ' workflowAsset.grantRead(lambda);',
205
228
  '',
206
229
  '',
207
230
  ' // Grant KMS decrypt permissions for the secret',
208
231
  ' if (props.secret.encryptionKey) {',
209
- ' console.log(\'encryption key found, granting decrypt permissions\');',
232
+ " console.log('encryption key found, granting decrypt permissions');",
210
233
  ' props.secret.encryptionKey.grantDecrypt(lambda);',
211
234
  '',
212
235
  ' } else {',
213
236
  ' lambda.role?.addToPrincipalPolicy(new PolicyStatement({',
214
237
  ' effect: Effect.ALLOW,',
215
238
  ' actions: [',
216
- ' \'kms:Decrypt\',',
217
- ' \'kms:DescribeKey\',',
239
+ " 'kms:Decrypt',",
240
+ " 'kms:DescribeKey',",
218
241
  ' ],',
219
242
  ' resources: [Arn.format({',
220
- ' service: \'kms\',',
221
- ' resource: \'key\',',
222
- ' resourceName: \'a699f853-0475-4d4d-b8ab-be881d66624f\',',
223
- ' partition: \'aws\',',
243
+ " service: 'kms',",
244
+ " resource: 'key',",
245
+ " resourceName: 'a699f853-0475-4d4d-b8ab-be881d66624f',",
246
+ " partition: 'aws',",
224
247
  ' region: Stack.of(this).region,',
225
- ' account: \'581514672367\',',
248
+ " account: '581514672367',",
226
249
  '',
227
250
  ' })],',
228
251
  ' }));',
229
252
  ' }',
230
253
  '',
231
- ' const provider = new Provider(this, \'Provider\', {',
254
+ " const provider = new Provider(this, 'Provider', {",
232
255
  ' onEventHandler: lambda,',
233
256
  ' });',
234
257
  '',
235
- ' const customResource = new CustomResource(this, \'Resource\', {',
258
+ " const customResource = new CustomResource(this, 'Resource', {",
236
259
  ' serviceToken: provider.serviceToken,',
237
260
  ' properties: {',
238
- ' UPDATED_TIME: Date.now().toString(),',
261
+ ' Content: newContents,',
239
262
  ' },',
240
263
  ' });',
241
264
  '',
242
- ' this.webhookPath = customResource.getAtt(\'WebhookPath\');',
265
+ " this.webhookPath = customResource.getAtt('WebhookPath');",
243
266
  '',
244
267
  ' // Output the Lambda execution role ARN for cross-account KMS permissions',
245
- ' new CfnOutput(this, \'LambdaExecutionRoleArn\', {',
268
+ " new CfnOutput(this, 'LambdaExecutionRoleArn', {",
246
269
  ' value: lambda.role!.roleArn,',
247
- ' description: \'Lambda execution role ARN - add this to KMS key policy in other account\',',
270
+ " description: 'Lambda execution role ARN - add this to KMS key policy in other account',",
248
271
  ' });',
249
272
  ' }',
273
+ '',
274
+ '',
275
+ '}',
276
+ '',
277
+ 'export function replaceFieldByNodeName(',
278
+ ' obj: Record<string, unknown>,',
279
+ ' nodeName: string,',
280
+ ' fieldPath: string, // dot-notation relative to the node, e.g. "parameters.url"',
281
+ ' newValue: unknown,',
282
+ '): void {',
283
+ ' const nodes = JSONPath({',
284
+ " path: `$.nodes[?(@.name=='${nodeName}')]`,",
285
+ ' json: obj,',
286
+ " resultType: 'value',",
287
+ ' });',
288
+ '',
289
+ ' for (const node of nodes) {',
290
+ ' setNestedValue(node, fieldPath, newValue);',
291
+ ' }',
292
+ '}',
293
+ '',
294
+ 'function setNestedValue(obj: any, dotPath: string, value: unknown): void {',
295
+ " const keys = dotPath.split('.');",
296
+ ' let current = obj;',
297
+ ' for (let i = 0; i < keys.length - 1; i++) {',
298
+ ' current = current[keys[i]];',
299
+ ' }',
300
+ ' current[keys[keys.length - 1]] = value;',
250
301
  '}',
251
302
  '',
252
303
  ],
@@ -254,4 +305,4 @@ class WorkflowProviderFile extends projen_1.TextFile {
254
305
  }
255
306
  }
256
307
  exports.WorkflowProviderFile = WorkflowProviderFile;
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2Zsb3dQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Xb3JrZmxvd1Byb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFrQztBQUdsQyxNQUFhLG9CQUFxQixTQUFRLGlCQUFRO0lBQ2hELFlBQVksT0FBNEI7UUFDdEMsS0FBSyxDQUFDLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRTtZQUNuRCxNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFO2dCQUNMLDRHQUE0RztnQkFDNUcsa0VBQWtFO2dCQUNsRSxxRUFBcUU7Z0JBQ3JFLHNEQUFzRDtnQkFDdEQsNkRBQTZEO2dCQUM3RCw0REFBNEQ7Z0JBQzVELDJDQUEyQztnQkFDM0MsRUFBRTtnQkFDRiwwQ0FBMEM7Z0JBQzFDLE9BQU87Z0JBQ1AsZ0VBQWdFO2dCQUNoRSxPQUFPO2dCQUNQLHNDQUFzQztnQkFDdEMsRUFBRTtnQkFDRixPQUFPO2dCQUNQLDJEQUEyRDtnQkFDM0QsUUFBUTtnQkFDUixnREFBZ0Q7Z0JBQ2hELHFDQUFxQztnQkFDckMsUUFBUTtnQkFDUixPQUFPO2dCQUNQLDZCQUE2QjtnQkFDN0IsR0FBRztnQkFDSCxFQUFFO2dCQUNGLG1EQUFtRDtnQkFDbkQsNkJBQTZCO2dCQUM3QixrQ0FBa0M7Z0JBQ2xDLEVBQUU7Z0JBQ0YsNkVBQTZFO2dCQUM3RSx1QkFBdUI7Z0JBQ3ZCLEVBQUU7Z0JBQ0YsZ0VBQWdFO2dCQUNoRSxxQ0FBcUM7Z0JBQ3JDLDRDQUE0QztnQkFDNUMsU0FBUztnQkFDVCxFQUFFO2dCQUNGLHFFQUFxRTtnQkFDckUscUNBQXFDO2dCQUNyQyxtQ0FBbUM7Z0JBQ25DLHFDQUFxQztnQkFDckMsK0JBQStCO2dCQUMvQix1R0FBdUc7Z0JBQ3ZHLHlFQUF5RTtnQkFDekUsRUFBRTtnQkFDRixzQ0FBc0M7Z0JBQ3RDLDREQUE0RDtnQkFDNUQsSUFBSTtnQkFDSiwyQ0FBMkM7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QXdEO2dCQUN4RCwrQ0FBK0M7Z0JBQy9DLFVBQVU7Z0JBQ1YsU0FBUztnQkFDVCxFQUFFO2dCQUNGLHFDQUFxQztnQkFDckMsc0NBQXNDO2dCQUN0QyxFQUFFO2dCQUNGLEVBQUU7Z0JBQ0YscURBQXFEO2dCQUNyRCx1Q0FBdUM7Z0JBQ3ZDLDRFQUE0RTtnQkFDNUUsd0RBQXdEO2dCQUN4RCxFQUFFO2dCQUNGLGNBQWM7Z0JBQ2QsK0RBQStEO2dCQUMvRCwrQkFBK0I7Z0JBQy9CLG9CQUFvQjtnQkFDcEIsNEJBQTRCO2dCQUM1QixnQ0FBZ0M7Z0JBQ2hDLFlBQVk7Z0JBQ1osa0NBQWtDO2dCQUNsQyw2QkFBNkI7Z0JBQzdCLDhCQUE4QjtnQkFDOUIsbUVBQW1FO2dCQUNuRSwrQkFBK0I7Z0JBQy9CLDBDQUEwQztnQkFDMUMsc0NBQXNDO2dCQUN0QyxFQUFFO2dCQUNGLGNBQWM7Z0JBQ2QsWUFBWTtnQkFDWixPQUFPO2dCQUNQLEVBQUU7Z0JBQ0YseURBQXlEO2dCQUN6RCwrQkFBK0I7Z0JBQy9CLFNBQVM7Z0JBQ1QsRUFBRTtnQkFDRixxRUFBcUU7Z0JBQ3JFLDRDQUE0QztnQkFDNUMscUJBQXFCO2dCQUNyQiw4Q0FBOEM7Z0JBQzlDLFVBQVU7Z0JBQ1YsU0FBUztnQkFDVCxFQUFFO2dCQUNGLGdFQUFnRTtnQkFDaEUsRUFBRTtnQkFDRiwrRUFBK0U7Z0JBQy9FLHVEQUF1RDtnQkFDdkQsb0NBQW9DO2dCQUNwQyxpR0FBaUc7Z0JBQ2pHLFNBQVM7Z0JBQ1QsS0FBSztnQkFDTCxHQUFHO2dCQUNILEVBQUU7YUFDSDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTFQRCxvREEwUEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dQcm92aWRlckZpbGUgZXh0ZW5kcyBUZXh0RmlsZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHApIHtcbiAgICBzdXBlcihwcm9qZWN0LCAnc3JjL2NvbnN0cnVjdHMvV29ya2Zsb3dQcm92aWRlci50cycsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgbGluZXM6IFtcbiAgICAgICAgJ2ltcG9ydCB7IEFybiwgQXNzZXRIYXNoVHlwZSwgQ2ZuT3V0cHV0LCBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24sIFJlZmVyZW5jZSwgU3RhY2sgfSBmcm9tIFxcJ2F3cy1jZGstbGliXFwnOycsXG4gICAgICAgICdpbXBvcnQgeyBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gXFwnYXdzLWNkay1saWIvYXdzLWlhbVxcJzsnLFxuICAgICAgICAnaW1wb3J0IHsgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUgfSBmcm9tIFxcJ2F3cy1jZGstbGliL2F3cy1sYW1iZGFcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCB7IEFzc2V0IH0gZnJvbSBcXCdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzXFwnOycsXG4gICAgICAgICdpbXBvcnQgeyBJU2VjcmV0IH0gZnJvbSBcXCdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSBcXCdhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXFwnOycsXG4gICAgICAgICdpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFxcJ2NvbnN0cnVjdHNcXCc7JyxcbiAgICAgICAgJycsXG4gICAgICAgICdleHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93UHJvdmlkZXJQcm9wcyB7JyxcbiAgICAgICAgJyAgLyoqJyxcbiAgICAgICAgJyAgICogVGhlIGZ1bGwgcGF0aCB0byB0aGUgd29ya2Zsb3cgLkpTT04gZmlsZSB5b3Ugd2FudCB0byBhZGQuJyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgd29ya2Zsb3dGaWxlUGF0aDogc3RyaW5nOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICAnICAgKiBBbiBBV1MgU2VjcmV0IHRoYXQgaGFzIHRoZSBmb2xsb3dpbmcgSlNPTiBzdHJ1Y3R1cmU6JyxcbiAgICAgICAgJyAgICogeycsXG4gICAgICAgICcgICAqICAgXCJ1cmxcIjogXCJodHRwczovL3lvdXItbjhuLWluc3RhbmNlLmNvbVwiLCcsXG4gICAgICAgICcgICAqICAgXCJhcGlLZXlcIjogXCJ5b3VyLW44bi1hcGkta2V5XCInLFxuICAgICAgICAnICAgKiB9JyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgc2VjcmV0OiBJU2VjcmV0OycsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICdleHBvcnQgY2xhc3MgV29ya2Zsb3dQcm92aWRlciBleHRlbmRzIENvbnN0cnVjdCB7JyxcbiAgICAgICAgJyAgcHVibGljIGhhbmRsZXI6IEZ1bmN0aW9uOycsXG4gICAgICAgICcgIHB1YmxpYyB3ZWJob29rUGF0aDogUmVmZXJlbmNlOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV29ya2Zsb3dQcm92aWRlclByb3BzKSB7JyxcbiAgICAgICAgJyAgICBzdXBlcihzY29wZSwgaWQpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIGNvbnN0IHdvcmtmbG93QXNzZXQgPSBuZXcgQXNzZXQodGhpcywgXFwnV29ya2Zsb3dBc3NldFxcJywgeycsXG4gICAgICAgICcgICAgICBwYXRoOiBwcm9wcy53b3JrZmxvd0ZpbGVQYXRoLCcsXG4gICAgICAgICcgICAgICBhc3NldEhhc2hUeXBlOiBBc3NldEhhc2hUeXBlLlNPVVJDRSwnLFxuICAgICAgICAnICAgIH0pOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIGNvbnN0IGxhbWJkYSA9IHRoaXMuaGFuZGxlciA9IG5ldyBGdW5jdGlvbih0aGlzLCBcXCdIYW5kbGVyXFwnLCB7JyxcbiAgICAgICAgJyAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsJyxcbiAgICAgICAgJyAgICAgIGhhbmRsZXI6IFxcJ2luZGV4LmhhbmRsZXJcXCcsJyxcbiAgICAgICAgJyAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksJyxcbiAgICAgICAgJyAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShgJyxcbiAgICAgICAgJ2NvbnN0IHsgU2VjcmV0c01hbmFnZXJDbGllbnQsIEdldFNlY3JldFZhbHVlQ29tbWFuZCB9ID0gcmVxdWlyZShcXCdAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyXFwnKTsnLFxuICAgICAgICAnY29uc3QgeyBTM0NsaWVudCwgR2V0T2JqZWN0Q29tbWFuZCB9ID0gcmVxdWlyZShcXCdAYXdzLXNkay9jbGllbnQtczNcXCcpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiB7JyxcbiAgICAgICAgJyAgY29uc29sZS5sb2coXFwnRXZlbnQ6XFwnLCBKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpOycsXG4gICAgICAgICcgICcsXG4gICAgICAgICcgIGlmIChldmVudC5SZXF1ZXN0VHlwZSA9PT0gXFwnRGVsZXRlXFwnKSB7JyxcbiAgICAgICAgJyAgICByZXR1cm4geyBQaHlzaWNhbFJlc291cmNlSWQ6IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCB8fCBcXCd3b3JrZmxvdy11cGxvYWRlclxcJyB9OycsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgdHJ5IHsnLFxuICAgICAgICAnICAgIC8vIEdldCBzZWNyZXQnLFxuICAgICAgICAnICAgIGNvbnN0IHNlY3JldHNDbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pOycsXG4gICAgICAgICcgICAgY29uc3Qgc2VjcmV0Q29tbWFuZCA9IG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogcHJvY2Vzcy5lbnYuU0VDUkVUX0FSTiB9KTsnLFxuICAgICAgICAnICAgIGNvbnN0IHNlY3JldFJlc3BvbnNlID0gYXdhaXQgc2VjcmV0c0NsaWVudC5zZW5kKHNlY3JldENvbW1hbmQpOycsXG4gICAgICAgICcgICAgJyxcbiAgICAgICAgJyAgICBjb25zdCBzZWNyZXQgPSBKU09OLnBhcnNlKHNlY3JldFJlc3BvbnNlLlNlY3JldFN0cmluZyk7JyxcbiAgICAgICAgJyAgICBjb25zdCB7IHVybCwgYXBpS2V5IH0gPSBzZWNyZXQ7JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIC8vIFJlYWQgd29ya2Zsb3cgZmlsZSBmcm9tIFMzJyxcbiAgICAgICAgJyAgICBjb25zdCBzM0NsaWVudCA9IG5ldyBTM0NsaWVudCh7fSk7JyxcbiAgICAgICAgJyAgICBjb25zdCBzM0NvbW1hbmQgPSBuZXcgR2V0T2JqZWN0Q29tbWFuZCh7JyxcbiAgICAgICAgJyAgICAgIEJ1Y2tldDogcHJvY2Vzcy5lbnYuQVNTRVRfQlVDS0VULCcsXG4gICAgICAgICcgICAgICBLZXk6IHByb2Nlc3MuZW52LkFTU0VUX0tFWSwnLFxuICAgICAgICAnICAgIH0pOycsXG4gICAgICAgICcgICAgY29uc3QgczNSZXNwb25zZSA9IGF3YWl0IHMzQ2xpZW50LnNlbmQoczNDb21tYW5kKTsnLFxuICAgICAgICAnICAgIGNvbnN0IHdvcmtmbG93Q29udGVudCA9IGF3YWl0IHMzUmVzcG9uc2UuQm9keS50cmFuc2Zvcm1Ub1N0cmluZygpOycsXG4gICAgICAgICcgICAgY29uc3QgeyBuYW1lLCBub2RlcywgY29ubmVjdGlvbnMsIHNldHRpbmdzIH0gPSBKU09OLnBhcnNlKHdvcmtmbG93Q29udGVudCk7JyxcbiAgICAgICAgJyAgICBjb25zdCB3b3JrZmxvd0RhdGEgPSB7JyxcbiAgICAgICAgJyAgICAgIG5hbWUsJyxcbiAgICAgICAgJyAgICAgIG5vZGVzLCcsXG4gICAgICAgICcgICAgICBjb25uZWN0aW9ucywnLFxuICAgICAgICAnICAgICAgc2V0dGluZ3MsJyxcbiAgICAgICAgJyAgICB9OycsXG4gICAgICAgICcgICAgZGVsZXRlIHdvcmtmbG93RGF0YS5zZXR0aW5ncy5iaW5hcnlNb2RlOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIGNvbnN0IGhlYWRlcnMgPSB7JyxcbiAgICAgICAgJyAgICAgIFxcJ0NvbnRlbnQtVHlwZVxcJzogXFwnYXBwbGljYXRpb24vanNvblxcJywnLFxuICAgICAgICAnICAgICAgXFwnWC1OOE4tQVBJLUtFWVxcJzogYXBpS2V5LCcsXG4gICAgICAgICcgICAgfTsnLFxuICAgICAgICAnICAgICcsXG4gICAgICAgICcgICAgbGV0IHdvcmtmbG93SWQgPSBldmVudC5QaHlzaWNhbFJlc291cmNlSWQ7JyxcbiAgICAgICAgJyAgICBsZXQgaXNVcGRhdGUgPSBmYWxzZTsnLFxuICAgICAgICAnICAgICcsXG4gICAgICAgICcgICAgLy8gVHJ5IHRvIGdldCBleGlzdGluZyB3b3JrZmxvdyBpZiB3ZSBoYXZlIGEgcGh5c2ljYWxSZXNvdXJjZUlkJyxcbiAgICAgICAgJyAgICBpZiAod29ya2Zsb3dJZCAmJiB3b3JrZmxvd0lkICE9PSBcXCd3b3JrZmxvdy11cGxvYWRlclxcJykgeycsXG4gICAgICAgICcgICAgICB0cnkgeycsXG4gICAgICAgICcgICAgICAgIGNvbnN0IGdldFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXFxcXGBcXFxcJHt1cmx9L2FwaS92MS93b3JrZmxvd3MvXFxcXCR7d29ya2Zsb3dJZH1cXFxcYCwgeycsXG4gICAgICAgICcgICAgICAgICAgbWV0aG9kOiBcXCdHRVRcXCcsJyxcbiAgICAgICAgJyAgICAgICAgICBoZWFkZXJzLCcsXG4gICAgICAgICcgICAgICAgIH0pOycsXG4gICAgICAgICcgICAgICAgICcsXG4gICAgICAgICcgICAgICAgIGlmIChnZXRSZXNwb25zZS5vaykgeycsXG4gICAgICAgICcgICAgICAgICAgaXNVcGRhdGUgPSB0cnVlOycsXG4gICAgICAgICcgICAgICAgICAgY29uc29sZS5sb2coXFwnRm91bmQgZXhpc3Rpbmcgd29ya2Zsb3csIHdpbGwgdXBkYXRlXFwnKTsnLFxuICAgICAgICAnICAgICAgICB9JyxcbiAgICAgICAgJyAgICAgIH0gY2F0Y2ggKGVycm9yKSB7JyxcbiAgICAgICAgJyAgICAgICAgY29uc29sZS5sb2coXFwnV29ya2Zsb3cgbm90IGZvdW5kLCB3aWxsIGNyZWF0ZSBuZXcgb25lXFwnKTsnLFxuICAgICAgICAnICAgICAgfScsXG4gICAgICAgICcgICAgfScsXG4gICAgICAgICcgICAgJyxcbiAgICAgICAgJyAgICBsZXQgcmVzdWx0OycsXG4gICAgICAgICcgICAgaWYgKGlzVXBkYXRlKSB7JyxcbiAgICAgICAgJyAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyB3b3JrZmxvdycsXG4gICAgICAgICcgICAgICBjb25zdCB1cGRhdGVSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxcXFxgXFxcXCR7dXJsfS9hcGkvdjEvd29ya2Zsb3dzL1xcXFwke3dvcmtmbG93SWR9XFxcXGAsIHsnLFxuICAgICAgICAnICAgICAgICBtZXRob2Q6IFxcJ1BVVFxcJywnLFxuICAgICAgICAnICAgICAgICBoZWFkZXJzLCcsXG4gICAgICAgICcgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHdvcmtmbG93RGF0YSksJyxcbiAgICAgICAgJyAgICAgIH0pOycsXG4gICAgICAgICcgICAgICAnLFxuICAgICAgICAnICAgICAgaWYgKCF1cGRhdGVSZXNwb25zZS5vaykgeycsXG4gICAgICAgICcgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcYFVwZGF0ZSBmYWlsZWQ6IFxcXFwke3VwZGF0ZVJlc3BvbnNlLnN0YXR1c30gXFxcXCR7dXBkYXRlUmVzcG9uc2Uuc3RhdHVzVGV4dH1cXFxcYCk7JyxcbiAgICAgICAgJyAgICAgIH0nLFxuICAgICAgICAnICAgICAgJyxcbiAgICAgICAgJyAgICAgIHJlc3VsdCA9IGF3YWl0IHVwZGF0ZVJlc3BvbnNlLmpzb24oKTsnLFxuICAgICAgICAnICAgICAgY29uc29sZS5sb2coXFwnV29ya2Zsb3cgdXBkYXRlZCBzdWNjZXNzZnVsbHlcXCcpOycsXG4gICAgICAgICcgICAgfSBlbHNlIHsnLFxuICAgICAgICAnICAgICAgLy8gQ3JlYXRlIG5ldyB3b3JrZmxvdycsXG4gICAgICAgICcgICAgICBjb25zdCBjcmVhdGVSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxcXFxgXFxcXCR7dXJsfS9hcGkvdjEvd29ya2Zsb3dzXFxcXGAsIHsnLFxuICAgICAgICAnICAgICAgICBtZXRob2Q6IFxcJ1BPU1RcXCcsJyxcbiAgICAgICAgJyAgICAgICAgaGVhZGVycywnLFxuICAgICAgICAnICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh3b3JrZmxvd0RhdGEpLCcsXG4gICAgICAgICcgICAgICB9KTsnLFxuICAgICAgICAnICAgICAgJyxcbiAgICAgICAgJyAgICAgIGlmICghY3JlYXRlUmVzcG9uc2Uub2spIHsnLFxuICAgICAgICAnICAgICAgICBsZXQgcmVzdWx0ID0ge307JyxcbiAgICAgICAgJyAgICAgICAgaWYgKGNyZWF0ZVJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwKSB7JyxcbiAgICAgICAgJyAgICAgICAgICByZXN1bHQgPSBhd2FpdCBjcmVhdGVSZXNwb25zZS5qc29uKCk7ICAnLFxuICAgICAgICAnICAgICAgICB9JyxcbiAgICAgICAgJyAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxgQ3JlYXRlIGZhaWxlZDogXFxcXCR7Y3JlYXRlUmVzcG9uc2Uuc3RhdHVzfSBcXFxcJHtjcmVhdGVSZXNwb25zZS5zdGF0dXNUZXh0fSBcXFxcJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfSBcXFxcYCk7JyxcbiAgICAgICAgJyAgICAgIH0nLFxuICAgICAgICAnICAgICAgJyxcbiAgICAgICAgJyAgICAgIHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVJlc3BvbnNlLmpzb24oKTsnLFxuICAgICAgICAnICAgICAgJyxcbiAgICAgICAgJyAgICAgICcsXG4gICAgICAgICcgICAgICB3b3JrZmxvd0lkID0gcmVzdWx0LmlkOycsXG4gICAgICAgICcgICAgICBjb25zb2xlLmxvZyhcXCdXb3JrZmxvdyBjcmVhdGVkIHN1Y2Nlc3NmdWxseVxcJyk7JyxcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIC8vIEFjdGl2YXRlIHRoZSB3b3JrZmxvdycsXG4gICAgICAgICcgICAgY29uc3QgYWN0aXZhdGVSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxcXFxgXFxcXCR7dXJsfS9hcGkvdjEvd29ya2Zsb3dzL1xcXFwke3dvcmtmbG93SWR9L2FjdGl2YXRlXFxcXGAsIHsnLFxuICAgICAgICAnICAgICAgbWV0aG9kOiBcXCdQT1NUXFwnLCcsXG4gICAgICAgICcgICAgICBoZWFkZXJzLCcsXG4gICAgICAgICcgICAgfSk7JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIGlmICghYWN0aXZhdGVSZXNwb25zZS5vaykgeycsXG4gICAgICAgICcgICAgbGV0IHJlc3VsdCA9IHt9OycsXG4gICAgICAgICcgICAgICBpZiAoYWN0aXZhdGVSZXNwb25zZS5zdGF0dXMgPT09IDQwMCkgeycsXG4gICAgICAgICcgICAgICAgIHJlc3VsdCA9IGF3YWl0IGFjdGl2YXRlUmVzcG9uc2UuanNvbigpOycsXG4gICAgICAgICcgICAgICB9JyxcbiAgICAgICAgJyAgICAgIGNvbnNvbGUud2FybihcXFxcYEFjdGl2YXRpb24gZmFpbGVkOiBcXFxcJHthY3RpdmF0ZVJlc3BvbnNlLnN0YXR1c30gXFxcXCR7YWN0aXZhdGVSZXNwb25zZS5zdGF0dXNUZXh0fVxcXFxcXFxcIFxcXFwke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9IFxcXFxgKTsnLFxuICAgICAgICAnICAgIH0gZWxzZSB7JyxcbiAgICAgICAgJyAgICAgIGNvbnNvbGUubG9nKFxcJ1dvcmtmbG93IGFjdGl2YXRlZCBzdWNjZXNzZnVsbHlcXCcpOycsXG4gICAgICAgICcgICAgfScsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIC8vIEZldGNoIHRoZSB3b3JrZmxvdyB0byBleHRyYWN0IHdlYmhvb2sgcGF0aCcsXG4gICAgICAgICcgICAgbGV0IHdlYmhvb2tQYXRoID0gXFxcXFxcJ1xcXFxcXCc7JyxcbiAgICAgICAgJyAgICBjb25zdCBnZXRXb3JrZmxvd1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goXFxcXGBcXFxcJHt1cmx9L2FwaS92MS93b3JrZmxvd3MvXFxcXCR7d29ya2Zsb3dJZH1cXFxcYCwgeycsXG4gICAgICAgICcgICAgICBtZXRob2Q6IFxcJ0dFVFxcJywnLFxuICAgICAgICAnICAgICAgaGVhZGVycywnLFxuICAgICAgICAnICAgIH0pOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIGlmIChnZXRXb3JrZmxvd1Jlc3BvbnNlLm9rKSB7JyxcbiAgICAgICAgJyAgICAgIGNvbnN0IHdvcmtmbG93ID0gYXdhaXQgZ2V0V29ya2Zsb3dSZXNwb25zZS5qc29uKCk7JyxcbiAgICAgICAgJyAgICAgIGNvbnN0IHdlYmhvb2tOb2RlID0gKHdvcmtmbG93Lm5vZGVzIHx8IFtdKS5maW5kKG4gPT4gbi50eXBlID09PSBcXCduOG4tbm9kZXMtYmFzZS53ZWJob29rXFwnKTsnLFxuICAgICAgICAnICAgICAgaWYgKHdlYmhvb2tOb2RlICYmIHdlYmhvb2tOb2RlLnBhcmFtZXRlcnMgJiYgd2ViaG9va05vZGUucGFyYW1ldGVycy5wYXRoKSB7JyxcbiAgICAgICAgJyAgICAgICAgd2ViaG9va1BhdGggPSB3ZWJob29rTm9kZS5wYXJhbWV0ZXJzLnBhdGg7JyxcbiAgICAgICAgJyAgICAgICAgY29uc29sZS5sb2coXFxcXGBGb3VuZCB3ZWJob29rIHBhdGg6IFxcXFwke3dlYmhvb2tQYXRofVxcXFxgKTsnLFxuICAgICAgICAnICAgICAgfScsXG4gICAgICAgICcgICAgfScsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIHJldHVybiB7JyxcbiAgICAgICAgJyAgICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogd29ya2Zsb3dJZCwnLFxuICAgICAgICAnICAgICAgRGF0YTogeyBXb3JrZmxvd0lkOiB3b3JrZmxvd0lkLCBXZWJob29rUGF0aDogd2ViaG9va1BhdGggfScsXG4gICAgICAgICcgICAgfTsnLFxuICAgICAgICAnICB9IGNhdGNoIChlcnJvcikgeycsXG4gICAgICAgICcgICAgY29uc29sZS5lcnJvcihcXCdFcnJvcjpcXCcsIGVycm9yKTsnLFxuICAgICAgICAnICAgIHJldHVybiB7JyxcbiAgICAgICAgJyAgICAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCB8fCBcXCd3b3JrZmxvdy11cGxvYWRlclxcJywnLFxuICAgICAgICAnICAgICAgIERhdGE6IHsgRXJyb3I6IFN0cmluZyhlcnJvciksIFdlYmhvb2tQYXRoOiBcXCd1bmF2YWlsYWJsZVxcJyB9JyxcbiAgICAgICAgJyAgICB9OycsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnfTsnLFxuICAgICAgICAnICAgICAgYCksJyxcbiAgICAgICAgJyAgICAgIGVudmlyb25tZW50OiB7JyxcbiAgICAgICAgJyAgICAgICAgU0VDUkVUX0FSTjogcHJvcHMuc2VjcmV0LnNlY3JldEFybiwnLFxuICAgICAgICAnICAgICAgICBBU1NFVF9CVUNLRVQ6IHdvcmtmbG93QXNzZXQuYnVja2V0LmJ1Y2tldE5hbWUsJyxcbiAgICAgICAgJyAgICAgICAgQVNTRVRfS0VZOiB3b3JrZmxvd0Fzc2V0LnMzT2JqZWN0S2V5LCcsXG4gICAgICAgICcgICAgICB9LCcsXG4gICAgICAgICcgICAgfSk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgcHJvcHMuc2VjcmV0LmdyYW50UmVhZChsYW1iZGEpOycsXG4gICAgICAgICcgICAgd29ya2Zsb3dBc3NldC5ncmFudFJlYWQobGFtYmRhKTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgLy8gR3JhbnQgS01TIGRlY3J5cHQgcGVybWlzc2lvbnMgZm9yIHRoZSBzZWNyZXQnLFxuICAgICAgICAnICAgIGlmIChwcm9wcy5zZWNyZXQuZW5jcnlwdGlvbktleSkgeycsXG4gICAgICAgICcgICAgICBjb25zb2xlLmxvZyhcXCdlbmNyeXB0aW9uIGtleSBmb3VuZCwgZ3JhbnRpbmcgZGVjcnlwdCBwZXJtaXNzaW9uc1xcJyk7JyxcbiAgICAgICAgJyAgICAgIHByb3BzLnNlY3JldC5lbmNyeXB0aW9uS2V5LmdyYW50RGVjcnlwdChsYW1iZGEpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIH0gZWxzZSB7JyxcbiAgICAgICAgJyAgICAgIGxhbWJkYS5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHsnLFxuICAgICAgICAnICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVywnLFxuICAgICAgICAnICAgICAgICBhY3Rpb25zOiBbJyxcbiAgICAgICAgJyAgICAgICAgICBcXCdrbXM6RGVjcnlwdFxcJywnLFxuICAgICAgICAnICAgICAgICAgIFxcJ2ttczpEZXNjcmliZUtleVxcJywnLFxuICAgICAgICAnICAgICAgICBdLCcsXG4gICAgICAgICcgICAgICAgIHJlc291cmNlczogW0Fybi5mb3JtYXQoeycsXG4gICAgICAgICcgICAgICAgICAgc2VydmljZTogXFwna21zXFwnLCcsXG4gICAgICAgICcgICAgICAgICAgcmVzb3VyY2U6IFxcJ2tleVxcJywnLFxuICAgICAgICAnICAgICAgICAgIHJlc291cmNlTmFtZTogXFwnYTY5OWY4NTMtMDQ3NS00ZDRkLWI4YWItYmU4ODFkNjY2MjRmXFwnLCcsXG4gICAgICAgICcgICAgICAgICAgcGFydGl0aW9uOiBcXCdhd3NcXCcsJyxcbiAgICAgICAgJyAgICAgICAgICByZWdpb246IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbiwnLFxuICAgICAgICAnICAgICAgICAgIGFjY291bnQ6IFxcJzU4MTUxNDY3MjM2N1xcJywnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICAgICAgfSldLCcsXG4gICAgICAgICcgICAgICB9KSk7JyxcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgXFwnUHJvdmlkZXJcXCcsIHsnLFxuICAgICAgICAnICAgICAgb25FdmVudEhhbmRsZXI6IGxhbWJkYSwnLFxuICAgICAgICAnICAgIH0pOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIGNvbnN0IGN1c3RvbVJlc291cmNlID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIFxcJ1Jlc291cmNlXFwnLCB7JyxcbiAgICAgICAgJyAgICAgIHNlcnZpY2VUb2tlbjogcHJvdmlkZXIuc2VydmljZVRva2VuLCcsXG4gICAgICAgICcgICAgICBwcm9wZXJ0aWVzOiB7JyxcbiAgICAgICAgJyAgICAgICAgVVBEQVRFRF9USU1FOiBEYXRlLm5vdygpLnRvU3RyaW5nKCksJyxcbiAgICAgICAgJyAgICAgIH0sJyxcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICB0aGlzLndlYmhvb2tQYXRoID0gY3VzdG9tUmVzb3VyY2UuZ2V0QXR0KFxcJ1dlYmhvb2tQYXRoXFwnKTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICAvLyBPdXRwdXQgdGhlIExhbWJkYSBleGVjdXRpb24gcm9sZSBBUk4gZm9yIGNyb3NzLWFjY291bnQgS01TIHBlcm1pc3Npb25zJyxcbiAgICAgICAgJyAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFxcJ0xhbWJkYUV4ZWN1dGlvblJvbGVBcm5cXCcsIHsnLFxuICAgICAgICAnICAgICAgdmFsdWU6IGxhbWJkYS5yb2xlIS5yb2xlQXJuLCcsXG4gICAgICAgICcgICAgICBkZXNjcmlwdGlvbjogXFwnTGFtYmRhIGV4ZWN1dGlvbiByb2xlIEFSTiAtIGFkZCB0aGlzIHRvIEtNUyBrZXkgcG9saWN5IGluIG90aGVyIGFjY291bnRcXCcsJyxcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2Zsb3dQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Xb3JrZmxvd1Byb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFrQztBQUdsQyxNQUFhLG9CQUFxQixTQUFRLGlCQUFRO0lBQ2hELFlBQVksT0FBNEI7UUFDdEMsS0FBSyxDQUFDLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRTtZQUNuRCxNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFO2dCQUNMLG9DQUFvQztnQkFDcEMsOEJBQThCO2dCQUM5QiwyRkFBMkY7Z0JBQzNGLGdFQUFnRTtnQkFDaEUsbUVBQW1FO2dCQUNuRSwyREFBMkQ7Z0JBQzNELDBEQUEwRDtnQkFDMUQseUNBQXlDO2dCQUN6QywyQ0FBMkM7Z0JBQzNDLEVBQUU7Z0JBQ0YsZ0NBQWdDO2dCQUNoQyxPQUFPO2dCQUNQLDJFQUEyRTtnQkFDM0UsT0FBTztnQkFDUCw4QkFBOEI7Z0JBQzlCLEVBQUU7Z0JBQ0YsT0FBTztnQkFDUCxvREFBb0Q7Z0JBQ3BELE9BQU87Z0JBQ1AsMEJBQTBCO2dCQUMxQixFQUFFO2dCQUNGLE9BQU87Z0JBQ1Asd0NBQXdDO2dCQUN4QyxPQUFPO2dCQUNQLDJCQUEyQjtnQkFDM0IsR0FBRztnQkFDSCxFQUFFO2dCQUNGLDBDQUEwQztnQkFDMUMsT0FBTztnQkFDUCxnRUFBZ0U7Z0JBQ2hFLE9BQU87Z0JBQ1Asc0NBQXNDO2dCQUN0QyxFQUFFO2dCQUNGLE9BQU87Z0JBQ1AsMkRBQTJEO2dCQUMzRCxRQUFRO2dCQUNSLGdEQUFnRDtnQkFDaEQscUNBQXFDO2dCQUNyQyxRQUFRO2dCQUNSLE9BQU87Z0JBQ1AsNkJBQTZCO2dCQUM3QixFQUFFO2dCQUNGLE9BQU87Z0JBQ1AsK0dBQStHO2dCQUMvRyxpREFBaUQ7Z0JBQ2pELE9BQU87Z0JBQ1AsMENBQTBDO2dCQUMxQyxHQUFHO2dCQUNILEVBQUU7Z0JBQ0Ys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cEMsK0ZBQStGO2dCQUMvRixTQUFTO2dCQUNULEtBQUs7Z0JBQ0wsRUFBRTtnQkFDRixFQUFFO2dCQUNGLEdBQUc7Z0JBQ0gsRUFBRTtnQkFDRix5Q0FBeUM7Z0JBQ3pDLGlDQUFpQztnQkFDakMscUJBQXFCO2dCQUNyQixrRkFBa0Y7Z0JBQ2xGLHNCQUFzQjtnQkFDdEIsV0FBVztnQkFDWCw0QkFBNEI7Z0JBQzVCLGdEQUFnRDtnQkFDaEQsZ0JBQWdCO2dCQUNoQiwwQkFBMEI7Z0JBQzFCLE9BQU87Z0JBQ1AsRUFBRTtnQkFDRiwrQkFBK0I7Z0JBQy9CLGdEQUFnRDtnQkFDaEQsS0FBSztnQkFDTCxHQUFHO2dCQUNILEVBQUU7Z0JBQ0YsNEVBQTRFO2dCQUM1RSxvQ0FBb0M7Z0JBQ3BDLHNCQUFzQjtnQkFDdEIsK0NBQStDO2dCQUMvQyxpQ0FBaUM7Z0JBQ2pDLEtBQUs7Z0JBQ0wsMkNBQTJDO2dCQUMzQyxHQUFHO2dCQUNILEVBQUU7YUFDSDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTdTRCxvREE2U0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dQcm92aWRlckZpbGUgZXh0ZW5kcyBUZXh0RmlsZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHApIHtcbiAgICBzdXBlcihwcm9qZWN0LCAnc3JjL2NvbnN0cnVjdHMvV29ya2Zsb3dQcm92aWRlci50cycsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgbGluZXM6IFtcbiAgICAgICAgXCJpbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XCIsXG4gICAgICAgIFwiaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1wiLFxuICAgICAgICBcImltcG9ydCB7IEFybiwgQ2ZuT3V0cHV0LCBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24sIFJlZmVyZW5jZSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XCIsXG4gICAgICAgIFwiaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcIixcbiAgICAgICAgXCJpbXBvcnQgeyBDb2RlLCBGdW5jdGlvbiwgUnVudGltZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1wiLFxuICAgICAgICBcImltcG9ydCB7IElTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1wiLFxuICAgICAgICBcImltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XCIsXG4gICAgICAgIFwiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XCIsXG4gICAgICAgIFwiaW1wb3J0IHsgSlNPTlBhdGggfSBmcm9tICdqc29ucGF0aC1wbHVzJztcIixcbiAgICAgICAgJycsXG4gICAgICAgICdleHBvcnQgaW50ZXJmYWNlIFJlcGxhY2VtZW50IHsnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICBcIiAgICogVGhlICduYW1lJyBmcm9tIHRoZSAnbm9kZScgdGhhdCB5b3UnZCBsaWtlIHRvIG1ha2UgYSByZXBsYWNlbWVudCBvbi5cIixcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgbm9kZU5hbWU6IHN0cmluZzsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgLyoqJyxcbiAgICAgICAgJyAgICogQSBkb3RwYXRoIHRvIHRoZSBmaWVsZCBvbiB0aGUgbm9kZSB0byBjaGFuZ2UuJyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgcGF0aDogc3RyaW5nOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICAnICAgKiBUaGUgdmFsdWUgdG8gY2hhbmdlIHRoZSBmaWVsZCB0by4nLFxuICAgICAgICAnICAgKi8nLFxuICAgICAgICAnICByZWFkb25seSB2YWx1ZTogc3RyaW5nOycsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICdleHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93UHJvdmlkZXJQcm9wcyB7JyxcbiAgICAgICAgJyAgLyoqJyxcbiAgICAgICAgJyAgICogVGhlIGZ1bGwgcGF0aCB0byB0aGUgd29ya2Zsb3cgLkpTT04gZmlsZSB5b3Ugd2FudCB0byBhZGQuJyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgd29ya2Zsb3dGaWxlUGF0aDogc3RyaW5nOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICAnICAgKiBBbiBBV1MgU2VjcmV0IHRoYXQgaGFzIHRoZSBmb2xsb3dpbmcgSlNPTiBzdHJ1Y3R1cmU6JyxcbiAgICAgICAgJyAgICogeycsXG4gICAgICAgICcgICAqICAgXCJ1cmxcIjogXCJodHRwczovL3lvdXItbjhuLWluc3RhbmNlLmNvbVwiLCcsXG4gICAgICAgICcgICAqICAgXCJhcGlLZXlcIjogXCJ5b3VyLW44bi1hcGkta2V5XCInLFxuICAgICAgICAnICAgKiB9JyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgc2VjcmV0OiBJU2VjcmV0OycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICAnICAgKiBBbiBhcnJheSBvZiBSZXBsYWNlbWVudHMgdG8gbWFrZSBhZ2FpbnN0IHRoZSB3b3JrZmxvdy4gVXNlIHRoaXMgdG8gdXBkYXRlIExhbWJkYSBmdW5jdGlvbiBBUk5zIGFuZCBvdGhlcicsXG4gICAgICAgICcgICAqIEFXUy1jb250cm9sbGVkIHJlc291cmNlcyBpbiB5b3VyIHdvcmtmbG93LicsXG4gICAgICAgICcgICAqLycsXG4gICAgICAgICcgIHJlYWRvbmx5IHJlcGxhY2VtZW50cz86IFJlcGxhY2VtZW50W107JyxcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2V4cG9ydCBjbGFzcyBXb3JrZmxvd1Byb3ZpZGVyIGV4dGVuZHMgQ29uc3RydWN0IHsnLFxuICAgICAgICAnICBwdWJsaWMgaGFuZGxlcjogRnVuY3Rpb247JyxcbiAgICAgICAgJyAgcHVibGljIHdlYmhvb2tQYXRoOiBSZWZlcmVuY2U7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXb3JrZmxvd1Byb3ZpZGVyUHJvcHMpIHsnLFxuICAgICAgICAnICAgIHN1cGVyKHNjb3BlLCBpZCk7JyxcbiAgICAgICAgJycsXG4gICAgICAgIFwiICAgIGNvbnN0IHdvcmtmbG93Q29udGVudHMgPSByZWFkRmlsZVN5bmMoam9pbihfX2Rpcm5hbWUsICcuLi93b3JrZmxvd3MvYWxmcmVkLmpzb24nKSk7XCIsXG4gICAgICAgIFwiICAgIGNvbnN0IHdvcmtmbG93ID0gSlNPTi5wYXJzZSh3b3JrZmxvd0NvbnRlbnRzLnRvU3RyaW5nKCd1dGY4JykpO1wiLFxuICAgICAgICAnICAgIGxldCBuZXdDb250ZW50czogc3RyaW5nID0gd29ya2Zsb3c7JyxcbiAgICAgICAgJyAgICBpZiAocHJvcHMucmVwbGFjZW1lbnRzKSB7JyxcbiAgICAgICAgJyAgICAgIG5ld0NvbnRlbnRzID0gSlNPTi5zdHJpbmdpZnkocHJvcHMucmVwbGFjZW1lbnRzJyxcbiAgICAgICAgJyAgICAgICAgLnJlZHVjZSgocDogYW55LCBjOiBSZXBsYWNlbWVudCkgPT4geycsXG4gICAgICAgICcgICAgICAgICAgcmVwbGFjZUZpZWxkQnlOb2RlTmFtZShwLCBjLm5vZGVOYW1lLCBjLnBhdGgsIGMudmFsdWUpOycsXG4gICAgICAgICcgICAgICAgICAgcmV0dXJuIHA7JyxcbiAgICAgICAgJyAgICAgICAgfSwgd29ya2Zsb3cpLCcsXG4gICAgICAgICcgICAgICBudWxsLCcsXG4gICAgICAgICcgICAgICAyKTsnLFxuICAgICAgICAnICAgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJycsXG4gICAgICAgIFwiICAgIGNvbnN0IGxhbWJkYSA9IHRoaXMuaGFuZGxlciA9IG5ldyBGdW5jdGlvbih0aGlzLCAnSGFuZGxlcicsIHtcIixcbiAgICAgICAgJyAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsJyxcbiAgICAgICAgXCIgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXCIsXG4gICAgICAgICcgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLCcsXG4gICAgICAgICcgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoYCcsXG4gICAgICAgIFwiY29uc3QgeyBTZWNyZXRzTWFuYWdlckNsaWVudCwgR2V0U2VjcmV0VmFsdWVDb21tYW5kIH0gPSByZXF1aXJlKCdAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyJyk7XCIsXG4gICAgICAgICcnLFxuICAgICAgICAnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiB7JyxcbiAgICAgICAgXCIgIGNvbnNvbGUubG9nKCdFdmVudDonLCBKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpO1wiLFxuICAgICAgICAnICAnLFxuICAgICAgICBcIiAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlID09PSAnRGVsZXRlJykge1wiLFxuICAgICAgICBcIiAgICByZXR1cm4geyBQaHlzaWNhbFJlc291cmNlSWQ6IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCB8fCAnd29ya2Zsb3ctdXBsb2FkZXInIH07XCIsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgdHJ5IHsnLFxuICAgICAgICAnICAgIC8vIEdldCBzZWNyZXQnLFxuICAgICAgICAnICAgIGNvbnN0IHNlY3JldHNDbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pOycsXG4gICAgICAgICcgICAgY29uc3Qgc2VjcmV0Q29tbWFuZCA9IG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogcHJvY2Vzcy5lbnYuU0VDUkVUX0FSTiB9KTsnLFxuICAgICAgICAnICAgIGNvbnN0IHNlY3JldFJlc3BvbnNlID0gYXdhaXQgc2VjcmV0c0NsaWVudC5zZW5kKHNlY3JldENvbW1hbmQpOycsXG4gICAgICAgICcgICAgJyxcbiAgICAgICAgJyAgICBjb25zdCBzZWNyZXQgPSBKU09OLnBhcnNlKHNlY3JldFJlc3BvbnNlLlNlY3JldFN0cmluZyk7JyxcbiAgICAgICAgJyAgICBjb25zdCB7IHVybCwgYXBpS2V5IH0gPSBzZWNyZXQ7JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIGNvbnN0IHdvcmtmbG93Q29udGVudCA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5Db250ZW50OycsXG4gICAgICAgICcgICAgY29uc3QgeyBuYW1lLCBub2RlcywgY29ubmVjdGlvbnMsIHNldHRpbmdzIH0gPSBKU09OLnBhcnNlKHdvcmtmbG93Q29udGVudCk7JyxcbiAgICAgICAgJyAgICBjb25zdCB3b3JrZmxvd0RhdGEgPSB7JyxcbiAgICAgICAgJyAgICAgIG5hbWUsJyxcbiAgICAgICAgJyAgICAgIG5vZGVzLCcsXG4gICAgICAgICcgICAgICBjb25uZWN0aW9ucywnLFxuICAgICAgICAnICAgICAgc2V0dGluZ3MsJyxcbiAgICAgICAgJyAgICB9OycsXG4gICAgICAgICcgICAgZGVsZXRlIHdvcmtmbG93RGF0YS5zZXR0aW5ncy5iaW5hcnlNb2RlOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIGNvbnN0IGhlYWRlcnMgPSB7JyxcbiAgICAgICAgXCIgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFwiLFxuICAgICAgICBcIiAgICAgICdYLU44Ti1BUEktS0VZJzogYXBpS2V5LFwiLFxuICAgICAgICAnICAgIH07JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIGxldCB3b3JrZmxvd0lkID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkOycsXG4gICAgICAgICcgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIC8vIFRyeSB0byBnZXQgZXhpc3Rpbmcgd29ya2Zsb3cgaWYgd2UgaGF2ZSBhIHBoeXNpY2FsUmVzb3VyY2VJZCcsXG4gICAgICAgIFwiICAgIGlmICh3b3JrZmxvd0lkICYmIHdvcmtmbG93SWQgIT09ICd3b3JrZmxvdy11cGxvYWRlcicpIHtcIixcbiAgICAgICAgJyAgICAgIHRyeSB7JyxcbiAgICAgICAgJyAgICAgICAgY29uc3QgZ2V0UmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcXFxcYFxcXFwke3VybH0vYXBpL3YxL3dvcmtmbG93cy9cXFxcJHt3b3JrZmxvd0lkfVxcXFxgLCB7JyxcbiAgICAgICAgXCIgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcIixcbiAgICAgICAgJyAgICAgICAgICBoZWFkZXJzLCcsXG4gICAgICAgICcgICAgICAgIH0pOycsXG4gICAgICAgICcgICAgICAgICcsXG4gICAgICAgICcgICAgICAgIGlmIChnZXRSZXNwb25zZS5vaykgeycsXG4gICAgICAgICcgICAgICAgICAgaXNVcGRhdGUgPSB0cnVlOycsXG4gICAgICAgIFwiICAgICAgICAgIGNvbnNvbGUubG9nKCdGb3VuZCBleGlzdGluZyB3b3JrZmxvdywgd2lsbCB1cGRhdGUnKTtcIixcbiAgICAgICAgJyAgICAgICAgfScsXG4gICAgICAgICcgICAgICB9IGNhdGNoIChlcnJvcikgeycsXG4gICAgICAgIFwiICAgICAgICBjb25zb2xlLmxvZygnV29ya2Zsb3cgbm90IGZvdW5kLCB3aWxsIGNyZWF0ZSBuZXcgb25lJyk7XCIsXG4gICAgICAgICcgICAgICB9JyxcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIGxldCByZXN1bHQ7JyxcbiAgICAgICAgJyAgICBpZiAoaXNVcGRhdGUpIHsnLFxuICAgICAgICAnICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIHdvcmtmbG93JyxcbiAgICAgICAgJyAgICAgIGNvbnN0IHVwZGF0ZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXFxcXGBcXFxcJHt1cmx9L2FwaS92MS93b3JrZmxvd3MvXFxcXCR7d29ya2Zsb3dJZH1cXFxcYCwgeycsXG4gICAgICAgIFwiICAgICAgICBtZXRob2Q6ICdQVVQnLFwiLFxuICAgICAgICAnICAgICAgICBoZWFkZXJzLCcsXG4gICAgICAgICcgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHdvcmtmbG93RGF0YSksJyxcbiAgICAgICAgJyAgICAgIH0pOycsXG4gICAgICAgICcgICAgICAnLFxuICAgICAgICAnICAgICAgaWYgKCF1cGRhdGVSZXNwb25zZS5vaykgeycsXG4gICAgICAgICcgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcYFVwZGF0ZSBmYWlsZWQ6IFxcXFwke3VwZGF0ZVJlc3BvbnNlLnN0YXR1c30gXFxcXCR7dXBkYXRlUmVzcG9uc2Uuc3RhdHVzVGV4dH1cXFxcYCk7JyxcbiAgICAgICAgJyAgICAgIH0nLFxuICAgICAgICAnICAgICAgJyxcbiAgICAgICAgJyAgICAgIHJlc3VsdCA9IGF3YWl0IHVwZGF0ZVJlc3BvbnNlLmpzb24oKTsnLFxuICAgICAgICBcIiAgICAgIGNvbnNvbGUubG9nKCdXb3JrZmxvdyB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1wiLFxuICAgICAgICAnICAgIH0gZWxzZSB7JyxcbiAgICAgICAgJyAgICAgIC8vIENyZWF0ZSBuZXcgd29ya2Zsb3cnLFxuICAgICAgICAnICAgICAgY29uc3QgY3JlYXRlUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcXFxcYFxcXFwke3VybH0vYXBpL3YxL3dvcmtmbG93c1xcXFxgLCB7JyxcbiAgICAgICAgXCIgICAgICAgIG1ldGhvZDogJ1BPU1QnLFwiLFxuICAgICAgICAnICAgICAgICBoZWFkZXJzLCcsXG4gICAgICAgICcgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHdvcmtmbG93RGF0YSksJyxcbiAgICAgICAgJyAgICAgIH0pOycsXG4gICAgICAgICcgICAgICAnLFxuICAgICAgICAnICAgICAgaWYgKCFjcmVhdGVSZXNwb25zZS5vaykgeycsXG4gICAgICAgICcgICAgICAgIGxldCByZXN1bHQgPSB7fTsnLFxuICAgICAgICAnICAgICAgICBpZiAoY3JlYXRlUmVzcG9uc2Uuc3RhdHVzID09PSA0MDApIHsnLFxuICAgICAgICAnICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVJlc3BvbnNlLmpzb24oKTsgICcsXG4gICAgICAgICcgICAgICAgIH0nLFxuICAgICAgICAnICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXGBDcmVhdGUgZmFpbGVkOiBcXFxcJHtjcmVhdGVSZXNwb25zZS5zdGF0dXN9IFxcXFwke2NyZWF0ZVJlc3BvbnNlLnN0YXR1c1RleHR9IFxcXFwke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9IFxcXFxgKTsnLFxuICAgICAgICAnICAgICAgfScsXG4gICAgICAgICcgICAgICAnLFxuICAgICAgICAnICAgICAgcmVzdWx0ID0gYXdhaXQgY3JlYXRlUmVzcG9uc2UuanNvbigpOycsXG4gICAgICAgICcgICAgICAnLFxuICAgICAgICAnICAgICAgJyxcbiAgICAgICAgJyAgICAgIHdvcmtmbG93SWQgPSByZXN1bHQuaWQ7JyxcbiAgICAgICAgXCIgICAgICBjb25zb2xlLmxvZygnV29ya2Zsb3cgY3JlYXRlZCBzdWNjZXNzZnVsbHknKTtcIixcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIC8vIEFjdGl2YXRlIHRoZSB3b3JrZmxvdycsXG4gICAgICAgICcgICAgY29uc3QgYWN0aXZhdGVSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxcXFxgXFxcXCR7dXJsfS9hcGkvdjEvd29ya2Zsb3dzL1xcXFwke3dvcmtmbG93SWR9L2FjdGl2YXRlXFxcXGAsIHsnLFxuICAgICAgICBcIiAgICAgIG1ldGhvZDogJ1BPU1QnLFwiLFxuICAgICAgICAnICAgICAgaGVhZGVycywnLFxuICAgICAgICAnICAgIH0pOycsXG4gICAgICAgICcgICAgJyxcbiAgICAgICAgJyAgICBpZiAoIWFjdGl2YXRlUmVzcG9uc2Uub2spIHsnLFxuICAgICAgICAnICAgIGxldCByZXN1bHQgPSB7fTsnLFxuICAgICAgICAnICAgICAgaWYgKGFjdGl2YXRlUmVzcG9uc2Uuc3RhdHVzID09PSA0MDApIHsnLFxuICAgICAgICAnICAgICAgICByZXN1bHQgPSBhd2FpdCBhY3RpdmF0ZVJlc3BvbnNlLmpzb24oKTsnLFxuICAgICAgICAnICAgICAgfScsXG4gICAgICAgICcgICAgICBjb25zb2xlLndhcm4oXFxcXGBBY3RpdmF0aW9uIGZhaWxlZDogXFxcXCR7YWN0aXZhdGVSZXNwb25zZS5zdGF0dXN9IFxcXFwke2FjdGl2YXRlUmVzcG9uc2Uuc3RhdHVzVGV4dH1cXFxcXFxcXCBcXFxcJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfSBcXFxcYCk7JyxcbiAgICAgICAgJyAgICB9IGVsc2UgeycsXG4gICAgICAgIFwiICAgICAgY29uc29sZS5sb2coJ1dvcmtmbG93IGFjdGl2YXRlZCBzdWNjZXNzZnVsbHknKTtcIixcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgLy8gRmV0Y2ggdGhlIHdvcmtmbG93IHRvIGV4dHJhY3Qgd2ViaG9vayBwYXRoJyxcbiAgICAgICAgXCIgICAgbGV0IHdlYmhvb2tQYXRoID0gXFxcXCdcXFxcJztcIixcbiAgICAgICAgJyAgICBjb25zdCBnZXRXb3JrZmxvd1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goXFxcXGBcXFxcJHt1cmx9L2FwaS92MS93b3JrZmxvd3MvXFxcXCR7d29ya2Zsb3dJZH1cXFxcYCwgeycsXG4gICAgICAgIFwiICAgICAgbWV0aG9kOiAnR0VUJyxcIixcbiAgICAgICAgJyAgICAgIGhlYWRlcnMsJyxcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICBpZiAoZ2V0V29ya2Zsb3dSZXNwb25zZS5vaykgeycsXG4gICAgICAgICcgICAgICBjb25zdCB3b3JrZmxvdyA9IGF3YWl0IGdldFdvcmtmbG93UmVzcG9uc2UuanNvbigpOycsXG4gICAgICAgIFwiICAgICAgY29uc3Qgd2ViaG9va05vZGUgPSAod29ya2Zsb3cubm9kZXMgfHwgW10pLmZpbmQobiA9PiBuLnR5cGUgPT09ICduOG4tbm9kZXMtYmFzZS53ZWJob29rJyk7XCIsXG4gICAgICAgICcgICAgICBpZiAod2ViaG9va05vZGUgJiYgd2ViaG9va05vZGUucGFyYW1ldGVycyAmJiB3ZWJob29rTm9kZS5wYXJhbWV0ZXJzLnBhdGgpIHsnLFxuICAgICAgICAnICAgICAgICB3ZWJob29rUGF0aCA9IHdlYmhvb2tOb2RlLnBhcmFtZXRlcnMucGF0aDsnLFxuICAgICAgICAnICAgICAgICBjb25zb2xlLmxvZyhcXFxcYEZvdW5kIHdlYmhvb2sgcGF0aDogXFxcXCR7d2ViaG9va1BhdGh9XFxcXGApOycsXG4gICAgICAgICcgICAgICB9JyxcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgcmV0dXJuIHsnLFxuICAgICAgICAnICAgICAgUGh5c2ljYWxSZXNvdXJjZUlkOiB3b3JrZmxvd0lkLCcsXG4gICAgICAgICcgICAgICBEYXRhOiB7IFdvcmtmbG93SWQ6IHdvcmtmbG93SWQsIFdlYmhvb2tQYXRoOiB3ZWJob29rUGF0aCB9JyxcbiAgICAgICAgJyAgICB9OycsXG4gICAgICAgICcgIH0gY2F0Y2ggKGVycm9yKSB7JyxcbiAgICAgICAgXCIgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpO1wiLFxuICAgICAgICAnICAgIHJldHVybiB7JyxcbiAgICAgICAgXCIgICAgICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBldmVudC5QaHlzaWNhbFJlc291cmNlSWQgfHwgJ3dvcmtmbG93LXVwbG9hZGVyJyxcIixcbiAgICAgICAgXCIgICAgICAgRGF0YTogeyBFcnJvcjogU3RyaW5nKGVycm9yKSwgV2ViaG9va1BhdGg6ICd1bmF2YWlsYWJsZScgfVwiLFxuICAgICAgICAnICAgIH07JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICd9OycsXG4gICAgICAgICcgICAgICBgKSwnLFxuICAgICAgICAnICAgICAgZW52aXJvbm1lbnQ6IHsnLFxuICAgICAgICAnICAgICAgICBTRUNSRVRfQVJOOiBwcm9wcy5zZWNyZXQuc2VjcmV0QXJuLCcsXG4gICAgICAgICcgICAgICB9LCcsXG4gICAgICAgICcgICAgfSk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgcHJvcHMuc2VjcmV0LmdyYW50UmVhZChsYW1iZGEpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICAvLyBHcmFudCBLTVMgZGVjcnlwdCBwZXJtaXNzaW9ucyBmb3IgdGhlIHNlY3JldCcsXG4gICAgICAgICcgICAgaWYgKHByb3BzLnNlY3JldC5lbmNyeXB0aW9uS2V5KSB7JyxcbiAgICAgICAgXCIgICAgICBjb25zb2xlLmxvZygnZW5jcnlwdGlvbiBrZXkgZm91bmQsIGdyYW50aW5nIGRlY3J5cHQgcGVybWlzc2lvbnMnKTtcIixcbiAgICAgICAgJyAgICAgIHByb3BzLnNlY3JldC5lbmNyeXB0aW9uS2V5LmdyYW50RGVjcnlwdChsYW1iZGEpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIH0gZWxzZSB7JyxcbiAgICAgICAgJyAgICAgIGxhbWJkYS5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHsnLFxuICAgICAgICAnICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVywnLFxuICAgICAgICAnICAgICAgICBhY3Rpb25zOiBbJyxcbiAgICAgICAgXCIgICAgICAgICAgJ2ttczpEZWNyeXB0JyxcIixcbiAgICAgICAgXCIgICAgICAgICAgJ2ttczpEZXNjcmliZUtleScsXCIsXG4gICAgICAgICcgICAgICAgIF0sJyxcbiAgICAgICAgJyAgICAgICAgcmVzb3VyY2VzOiBbQXJuLmZvcm1hdCh7JyxcbiAgICAgICAgXCIgICAgICAgICAgc2VydmljZTogJ2ttcycsXCIsXG4gICAgICAgIFwiICAgICAgICAgIHJlc291cmNlOiAna2V5JyxcIixcbiAgICAgICAgXCIgICAgICAgICAgcmVzb3VyY2VOYW1lOiAnYTY5OWY4NTMtMDQ3NS00ZDRkLWI4YWItYmU4ODFkNjY2MjRmJyxcIixcbiAgICAgICAgXCIgICAgICAgICAgcGFydGl0aW9uOiAnYXdzJyxcIixcbiAgICAgICAgJyAgICAgICAgICByZWdpb246IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbiwnLFxuICAgICAgICBcIiAgICAgICAgICBhY2NvdW50OiAnNTgxNTE0NjcyMzY3JyxcIixcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgICAgIH0pXSwnLFxuICAgICAgICAnICAgICAgfSkpOycsXG4gICAgICAgICcgICAgfScsXG4gICAgICAgICcnLFxuICAgICAgICBcIiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCAnUHJvdmlkZXInLCB7XCIsXG4gICAgICAgICcgICAgICBvbkV2ZW50SGFuZGxlcjogbGFtYmRhLCcsXG4gICAgICAgICcgICAgfSk7JyxcbiAgICAgICAgJycsXG4gICAgICAgIFwiICAgIGNvbnN0IGN1c3RvbVJlc291cmNlID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsICdSZXNvdXJjZScsIHtcIixcbiAgICAgICAgJyAgICAgIHNlcnZpY2VUb2tlbjogcHJvdmlkZXIuc2VydmljZVRva2VuLCcsXG4gICAgICAgICcgICAgICBwcm9wZXJ0aWVzOiB7JyxcbiAgICAgICAgJyAgICAgICAgQ29udGVudDogbmV3Q29udGVudHMsJyxcbiAgICAgICAgJyAgICAgIH0sJyxcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgXCIgICAgdGhpcy53ZWJob29rUGF0aCA9IGN1c3RvbVJlc291cmNlLmdldEF0dCgnV2ViaG9va1BhdGgnKTtcIixcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgLy8gT3V0cHV0IHRoZSBMYW1iZGEgZXhlY3V0aW9uIHJvbGUgQVJOIGZvciBjcm9zcy1hY2NvdW50IEtNUyBwZXJtaXNzaW9ucycsXG4gICAgICAgIFwiICAgIG5ldyBDZm5PdXRwdXQodGhpcywgJ0xhbWJkYUV4ZWN1dGlvblJvbGVBcm4nLCB7XCIsXG4gICAgICAgICcgICAgICB2YWx1ZTogbGFtYmRhLnJvbGUhLnJvbGVBcm4sJyxcbiAgICAgICAgXCIgICAgICBkZXNjcmlwdGlvbjogJ0xhbWJkYSBleGVjdXRpb24gcm9sZSBBUk4gLSBhZGQgdGhpcyB0byBLTVMga2V5IHBvbGljeSBpbiBvdGhlciBhY2NvdW50JyxcIixcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcnLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgICAnZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VGaWVsZEJ5Tm9kZU5hbWUoJyxcbiAgICAgICAgJyAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwnLFxuICAgICAgICAnICBub2RlTmFtZTogc3RyaW5nLCcsXG4gICAgICAgICcgIGZpZWxkUGF0aDogc3RyaW5nLCAvLyBkb3Qtbm90YXRpb24gcmVsYXRpdmUgdG8gdGhlIG5vZGUsIGUuZy4gXCJwYXJhbWV0ZXJzLnVybFwiJyxcbiAgICAgICAgJyAgbmV3VmFsdWU6IHVua25vd24sJyxcbiAgICAgICAgJyk6IHZvaWQgeycsXG4gICAgICAgICcgIGNvbnN0IG5vZGVzID0gSlNPTlBhdGgoeycsXG4gICAgICAgIFwiICAgIHBhdGg6IGAkLm5vZGVzWz8oQC5uYW1lPT0nJHtub2RlTmFtZX0nKV1gLFwiLFxuICAgICAgICAnICAgIGpzb246IG9iaiwnLFxuICAgICAgICBcIiAgICByZXN1bHRUeXBlOiAndmFsdWUnLFwiLFxuICAgICAgICAnICB9KTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7JyxcbiAgICAgICAgJyAgICBzZXROZXN0ZWRWYWx1ZShub2RlLCBmaWVsZFBhdGgsIG5ld1ZhbHVlKTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2Z1bmN0aW9uIHNldE5lc3RlZFZhbHVlKG9iajogYW55LCBkb3RQYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7JyxcbiAgICAgICAgXCIgIGNvbnN0IGtleXMgPSBkb3RQYXRoLnNwbGl0KCcuJyk7XCIsXG4gICAgICAgICcgIGxldCBjdXJyZW50ID0gb2JqOycsXG4gICAgICAgICcgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHsnLFxuICAgICAgICAnICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleXNbaV1dOycsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnICBjdXJyZW50W2tleXNba2V5cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTsnLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuIl19