@macedon-technologies/batman 1.28.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/utils.js CHANGED
@@ -112,7 +112,7 @@ function readmeContents(projectName, e2eTesting = true, packageManager = javascr
112
112
  '| `src/LocalDevApp.ts` | Local development CDK app — used by `yarn cdk:dev` - deploys to AWS for slower but more thorough testing |',
113
113
  '| `src/GitHubRoles.ts` | CDK app for deploying the GitHub OIDC IAM role (one-time bootstrap) |',
114
114
  '| `src/stacks/ApplicationStack.ts` | Your primary stack — extend it to add resources |',
115
- '| `src/stacks/BaseApplicationStack.ts` | Base stack with VPC, API, static website, Datadog, and Route 53 wired up |',
115
+ '| `src/stacks/BaseApplicationStack.ts` | Base stack with API, static website, Datadog, and Route 53 wired up |',
116
116
  '| `src/stacks/GitHubRolesStack.ts` | IAM role stack for GitHub Actions OIDC authentication |',
117
117
  '| `src/constructs/Api.ts` | API Gateway + Lambda construct with Clerk JWT authorizer |',
118
118
  '| `src/constructs/StaticWebsite.ts` | CloudFront + S3 + ACM + Route 53 construct |',
@@ -237,7 +237,7 @@ function readmeContents(projectName, e2eTesting = true, packageManager = javascr
237
237
  '',
238
238
  '## Where to Start',
239
239
  '',
240
- '1. **`src/stacks/ApplicationStack.ts`** — Add your CDK constructs here. The base stack already provides `this.api`, `this.vpc`, `this.hostedZone`, and `this.datadog` as protected properties.',
240
+ '1. **`src/stacks/ApplicationStack.ts`** — Add your CDK constructs here. The base stack already provides `this.api`, `this.hostedZone`, `this.datadog`, and (when the stack creates one) `this.vpc` as protected properties.',
241
241
  '',
242
242
  '2. **`web/`** — Build your frontend. Start with `web/src/App.tsx` and add services alongside `web/src/services/ApiService.ts`.',
243
243
  '',
@@ -286,4 +286,4 @@ function readmeContents(projectName, e2eTesting = true, packageManager = javascr
286
286
  'This updates all managed files to the latest Batman standards. Your editable sample files are never touched.',
287
287
  ].join('\n');
288
288
  }
289
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSw0Q0FZQztBQU1ELHdDQVdDO0FBV0QsNERBT0M7QUFVRCxzREFFQztBQU9ELDREQUVDO0FBRUQsa0NBZ0JDO0FBRUQsd0NBa01DO0FBL1JELHNEQUEyRDtBQUUzRDs7R0FFRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLGNBQWtDLEVBQUUsTUFBYztJQUNqRixRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFdBQVcsTUFBTSxFQUFFLENBQUM7UUFDN0IsS0FBSywrQkFBa0IsQ0FBQyxHQUFHO1lBQ3pCLE9BQU8sV0FBVyxNQUFNLEVBQUUsQ0FBQztRQUM3QixLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQzFCO1lBQ0Usb0ZBQW9GO1lBQ3BGLE9BQU8sUUFBUSxNQUFNLEVBQUUsQ0FBQztJQUM1QixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxjQUFrQztJQUMvRCxRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLCtCQUFrQixDQUFDLEdBQUc7WUFDekIsT0FBTywrQkFBK0IsQ0FBQztRQUN6QyxLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxnQ0FBZ0MsQ0FBQztRQUMxQztZQUNFLE9BQU8sZ0NBQWdDLENBQUM7SUFDNUMsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHdCQUF3QjtJQUN0QyxPQUFPO1FBQ0wsbUdBQW1HO1FBQ25HLG9EQUFvRDtRQUNwRCwrQ0FBK0M7UUFDL0MsSUFBSTtLQUNMLENBQUM7QUFDSixDQUFDO0FB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O1FBQ1osS0FBSztRQUNMLEVBQUU7UUFDRiw4R0FBOEc7S0FDL0csQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZVBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAncHJvamVuL2xpYi9qYXZhc2NyaXB0JztcblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBjb21tYW5kIHVzZWQgdG8gcnVuIGEgcGFja2FnZS5qc29uIHNjcmlwdCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgbWFuYWdlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blNjcmlwdENvbW1hbmQocGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlciwgc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgcmV0dXJuIGBucG0gcnVuICR7c2NyaXB0fWA7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOOlxuICAgICAgcmV0dXJuIGBidW4gcnVuICR7c2NyaXB0fWA7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTTpcbiAgICAgIHJldHVybiBgcG5wbSAke3NjcmlwdH1gO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBhbGwgeWFybiB2YXJpYW50cyAoeWFybiwgeWFybjIsIHlhcm5fY2xhc3NpYywgeWFybl9iZXJyeSkgc2hhcmUgdGhlIGB5YXJuYCBiaW5hcnlcbiAgICAgIHJldHVybiBgeWFybiAke3NjcmlwdH1gO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgY29tbWFuZCB1c2VkIHRvIGRvIGEgY2xlYW4sIHJlcHJvZHVjaWJsZSBkZXBlbmRlbmN5IGluc3RhbGwgKGUuZy4gZm9yIENJKVxuICogZm9yIHRoZSBnaXZlbiBwYWNrYWdlIG1hbmFnZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwYWNrYWdlTWFuYWdlcikge1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTpcbiAgICAgIHJldHVybiAnbnBtIGNpJztcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5CVU46XG4gICAgICByZXR1cm4gJ2J1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJztcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgcmV0dXJuICdwbnBtIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ3lhcm4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSc7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNoIGxpbmVzIHRoYXQgc2FuaXRpemUgYSBgQ0xFQU5fQlJBTkNIX05BTUVgIHZhcmlhYmxlIChhbHJlYWR5IHN0cmlwcGVkIG9mIGFueVxuICogY29udmVudGlvbmFsLWNvbW1pdCBwcmVmaXgpIGludG8gYSB2YWx1ZSBzYWZlIHRvIHVzZSBhcyBhIENsb3VkRm9ybWF0aW9uIHN0YWNrLW5hbWVcbiAqIGZyYWdtZW50OiBjb2xsYXBzZXMgcnVucyBvZiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgdG8gYC1gLCB0cmltcyBsZWFkaW5nL3RyYWlsaW5nXG4gKiBgLWAsIGFuZCBwcmVmaXhlcyB3aXRoIGBwci1gIGlmIHRoZSByZXN1bHQgd291bGQgbm90IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKG9yIGlzIGVtcHR5KS5cbiAqXG4gKiBTaGFyZWQgYnkgUHJEZXBsb3lXb3JrZmxvdyBhbmQgUHJDbGVhbnVwV29ya2Zsb3cgc28gYm90aCBkZXJpdmUgdGhlIGlkZW50aWNhbCBzdGFja1xuICogbmFtZSBmb3IgYSBnaXZlbiBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUJyYW5jaE5hbWVTY3JpcHQoKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgICdDTEVBTl9CUkFOQ0hfTkFNRT0kKGVjaG8gXCIkQ0xFQU5fQlJBTkNIX05BTUVcIiB8IHNlZCAtRSBcXCdzL1teQS1aYS16MC05XSsvLS9nOyBzL14tKy8vOyBzLy0rJC8vXFwnKScsXG4gICAgJ2lmIFtbICEgXCIkQ0xFQU5fQlJBTkNIX05BTUVcIiA9fiBeW0EtWmEtel0gXV07IHRoZW4nLFxuICAgICcgIENMRUFOX0JSQU5DSF9OQU1FPVwicHItJHtDTEVBTl9CUkFOQ0hfTkFNRX1cIicsXG4gICAgJ2ZpJyxcbiAgXTtcbn1cblxuLyoqXG4gKiBKb2lucyBjb21tYW5kcyB3aXRoIGA7YCBpbnN0ZWFkIG9mIGAmJmAvYHx8YCBzbyB0aGUgcmVzdWx0IGlzIHZhbGlkIGZvciBhIHN3YW1wXG4gKiBjb21tYW5kL3NoZWxsIG1vZGVsJ3MgYHJ1bjpgIHZhbHVlIG9uIGJvdGggUE9TSVggc2hlbGxzIGFuZCBXaW5kb3dzIFBvd2VyU2hlbGwgNS4xXG4gKiAod2hpY2ggaGFzIG5vIGAmJmAvYHx8YCBjaGFpbiBvcGVyYXRvcnMgYmVmb3JlIHB3c2ggNykuIFVubGlrZSBgJiZgLCBgO2AgZG9lcyBub3RcbiAqIHNob3J0LWNpcmN1aXQgb24gZmFpbHVyZSDigJQgY2FsbGVycyB0aGF0IG5lZWQgZmFpbHVyZSB0byBzdG9wIHRoZSBzZXF1ZW5jZSBzaG91bGQgc3BsaXRcbiAqIGludG8gc2VwYXJhdGUgd29ya2Zsb3cgc3RlcHMgd2l0aCB0aGVpciBvd24gYGFzc2VydGAgZ2F0ZXMgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRoaXNcbiAqIGZvciBjb250cm9sIGZsb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbFBvcnRhYmxlU2VxdWVuY2UoLi4uY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJzsgJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHBvcnRhYmxlIGZvcmNlLWRlbGV0ZSBmb3IgYSBzaW5nbGUgZmlsZSwgZm9yIHVzZSBpbiBhIHN3YW1wIGNvbW1hbmQvc2hlbGxcbiAqIG1vZGVsJ3MgYHJ1bjpgIHZhbHVlIGluIHBsYWNlIG9mIGBybSAtZiA8cGF0aD5gIChhbWJpZ3VvdXMgd2l0aCBQb3dlclNoZWxsIDUuMSdzXG4gKiBgUmVtb3ZlLUl0ZW0gLUZpbHRlcmAgYWxpYXMpLiBNYXRjaGVzIHRoZSBmaXggYWxyZWFkeSB2YWxpZGF0ZWQgaW4gZXhtYW4jMTM2LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxQb3J0YWJsZUZvcmNlRGVsZXRlKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgbm9kZSAtZSBcInJlcXVpcmUoJ2ZzJykucm1TeW5jKCcke3BhdGh9JywgeyBmb3JjZTogdHJ1ZSB9KVwiYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVRzKHZhbHVlOiBhbnksIGRlcHRoID0gMSk6IHN0cmluZyB7XG4gIGNvbnN0IHBhZCA9ICcgICcucmVwZWF0KGRlcHRoKTtcbiAgY29uc3QgaW5uZXJQYWQgPSAnICAnLnJlcGVhdChkZXB0aCArIDEpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIGAnJHt2YWx1ZX0nYDtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IHZhbHVlLm1hcCh2ID0+IGAke2lubmVyUGFkfSR7c2VyaWFsaXplVHModiwgZGVwdGggKyAxKX1gKS5qb2luKCcsXFxuJyk7XG4gICAgcmV0dXJuIGBbXFxuJHtpdGVtc30sXFxuJHtwYWR9XWA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWUpXG4gICAgICAubWFwKChbaywgdl0pID0+IGAke2lubmVyUGFkfSR7a306ICR7c2VyaWFsaXplVHModiwgZGVwdGggKyAxKX1gKVxuICAgICAgLmpvaW4oJyxcXG4nKTtcbiAgICByZXR1cm4gYHtcXG4ke2VudHJpZXN9LFxcbiR7cGFkfX1gO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkbWVDb250ZW50cyhcbiAgcHJvamVjdE5hbWU6IHN0cmluZyxcbiAgZTJlVGVzdGluZyA9IHRydWUsXG4gIHBhY2thZ2VNYW5hZ2VyOiBOb2RlUGFja2FnZU1hbmFnZXIgPSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDLFxuKSB7XG4gIGNvbnN0IHRlc3RFMmVDb21tYW5kID0gcnVuU2NyaXB0Q29tbWFuZChwYWNrYWdlTWFuYWdlciwgJ3Rlc3Q6ZTJlJyk7XG4gIHJldHVybiBbXG4gICAgYCMgJHtwcm9qZWN0TmFtZX1gLFxuICAgICcnLFxuICAgICdUaGlzIHByb2plY3Qgd2FzIGJvb3RzdHJhcHBlZCB3aXRoIFtCYXRtYW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9tYWNlZG9uLXRlY2hub2xvZ2llcy9wbGF0Zm9ybS1jb21tb24pLicsXG4gICAgJycsXG4gICAgJyMjIFdoYXQgQmF0bWFuIENyZWF0ZWQnLFxuICAgICcnLFxuICAgICcjIyMgQ0RLIEluZnJhc3RydWN0dXJlIChgc3JjL2ApJyxcbiAgICAnJyxcbiAgICAnfCBGaWxlIHwgRGVzY3JpcHRpb24gfCcsXG4gICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLXwnLFxuICAgICd8IGBzcmMvbWFpbi50c2AgfCBDREsgYXBwIGVudHJ5IHBvaW50IOKAlCBpbnN0YW50aWF0ZXMgZGV2LCBzdGFnaW5nLCBhbmQgcHJvZCBgQXBwbGljYXRpb25TdGFja2BzIHwnLFxuICAgICd8IGBzcmMvTG9jYWxEZXZBcHAudHNgIHwgTG9jYWwgZGV2ZWxvcG1lbnQgQ0RLIGFwcCDigJQgdXNlZCBieSBgeWFybiBjZGs6ZGV2YCAtIGRlcGxveXMgdG8gQVdTIGZvciBzbG93ZXIgYnV0IG1vcmUgdGhvcm91Z2ggdGVzdGluZyB8JyxcbiAgICAnfCBgc3JjL0dpdEh1YlJvbGVzLnRzYCB8IENESyBhcHAgZm9yIGRlcGxveWluZyB0aGUgR2l0SHViIE9JREMgSUFNIHJvbGUgKG9uZS10aW1lIGJvb3RzdHJhcCkgfCcsXG4gICAgJ3wgYHNyYy9zdGFja3MvQXBwbGljYXRpb25TdGFjay50c2AgfCBZb3VyIHByaW1hcnkgc3RhY2sg4oCUIGV4dGVuZCBpdCB0byBhZGQgcmVzb3VyY2VzIHwnLFxuICAgICd8IGBzcmMvc3RhY2tzL0Jhc2VBcHBsaWNhdGlvblN0YWNrLnRzYCB8IEJhc2Ugc3RhY2sgd2l0aCBWUEMsIEFQSSwgc3RhdGljIHdlYnNpdGUsIERhdGFkb2csIGFuZCBSb3V0ZSA1MyB3aXJlZCB1cCB8JyxcbiAgICAnfCBgc3JjL3N0YWNrcy9HaXRIdWJSb2xlc1N0YWNrLnRzYCB8IElBTSByb2xlIHN0YWNrIGZvciBHaXRIdWIgQWN0aW9ucyBPSURDIGF1dGhlbnRpY2F0aW9uIHwnLFxuICAgICd8IGBzcmMvY29uc3RydWN0cy9BcGkudHNgIHwgQVBJIEdhdGV3YXkgKyBMYW1iZGEgY29uc3RydWN0IHdpdGggQ2xlcmsgSldUIGF1dGhvcml6ZXIgfCcsXG4gICAgJ3wgYHNyYy9jb25zdHJ1Y3RzL1N0YXRpY1dlYnNpdGUudHNgIHwgQ2xvdWRGcm9udCArIFMzICsgQUNNICsgUm91dGUgNTMgY29uc3RydWN0IHwnLFxuICAgICd8IGBzcmMvY29uc3RydWN0cy9oYW5kbGVyL0FwaS5GdW5jdGlvbi50c2AgfCBMYW1iZGEgaGFuZGxlciBlbnRyeSBwb2ludCwgYmFzaWMgd3JhcHBlciBhcm91bmQgRXhwcmVzcy1jb21wYXRpYmxlIGFwcCBjb2RlIHwnLFxuICAgICd8IGBzcmMvYXNwZWN0cy9EYXRhRG9nQXNwZWN0LnRzYCB8IENESyBhc3BlY3QgdGhhdCB3aXJlcyBhbGwgTGFtYmRhIGZ1bmN0aW9ucyB0byBEYXRhZG9nIHwnLFxuICAgICcnLFxuICAgICcjIyMgRnJvbnRlbmQgKGB3ZWIvYCknLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBEZXNjcmlwdGlvbiB8JyxcbiAgICAnfC0tLS0tLXwtLS0tLS0tLS0tLS0tfCcsXG4gICAgJ3wgYHdlYi9zcmMvbWFpbi50c3hgIHwgUmVhY3QgYXBwIGVudHJ5IHBvaW50IHdpdGggQ2xlcmsgYW5kIFJlYWN0IFF1ZXJ5IHByb3ZpZGVycyB8JyxcbiAgICAnfCBgd2ViL3NyYy9BcHAudHN4YCB8IFJvb3QgYXBwbGljYXRpb24gY29tcG9uZW50IHwnLFxuICAgICd8IGB3ZWIvc3JjL0FwcC5jc3NgIC8gYHdlYi9zcmMvaW5kZXguY3NzYCB8IEJhc2Ugc3R5bGVzaGVldHMgKFRhaWx3aW5kIENTUyB2NCkgfCcsXG4gICAgJ3wgYHdlYi9zcmMvY29uZmlnLnRzYCB8IGB1c2VDb25maWcoKWAgaG9vayDigJQgbG9hZHMgcnVudGltZSBjb25maWcgZnJvbSBgY29uZmlnLmpzb25gIHwnLFxuICAgICd8IGB3ZWIvc3JjL3NlcnZpY2VzL0FwaVNlcnZpY2UudHNgIHwgYHVzZUFwaVF1ZXJ5KClgIC8gYHVzZUFwaU11dGF0aW9uKClgIOKAlCBhdXRoZW50aWNhdGVkIEFQSSBob29rcywgY2FjaGVkIHBlciBwYXRoIHwnLFxuICAgICd8IGB3ZWIvc3JjL2hlbHBlcnMvYCB8IGByZXF1ZXN0cy50c2AsIGBIdHRwRXJyb3IudHNgLCBgZXJyb3JzLnRzYCwgYHJldHJ5LnRzYCDigJQgdGhlIHJlcXVlc3QgYW5kIGVycm9yIGhlbHBlcnMgYEFwaVNlcnZpY2VgIGlzIGJ1aWx0IG9uIHwnLFxuICAgICd8IGB3ZWIvcHVibGljL2NvbmZpZy5qc29uYCB8IFJ1bnRpbWUgY29uZmlnIChBUEkgYmFzZSBVUkwsIENsZXJrIHB1Ymxpc2hhYmxlIGtleSkgfCcsXG4gICAgLi4uKGUyZVRlc3RpbmcgPyBbXG4gICAgICAnfCBgd2ViL3BsYXl3cmlnaHQuY29uZmlnLnRzYCB8IFBsYXl3cmlnaHQgZTJlIGNvbmZpZyDigJQgc2VlIGB3ZWIvZTJlL1JFQURNRS5tZGAgfCcsXG4gICAgICBgfCBcXGB3ZWIvZTJlL1xcYCB8IFBsYXl3cmlnaHQgZTJlIHN1aXRlIChcXGAke3Rlc3RFMmVDb21tYW5kfVxcYCk7IGFsc28gcnVuIGluIENJIGFnYWluc3QgZWFjaCBQUidzIGRlcGxveWVkIFVSTCB8YCxcbiAgICBdIDogW10pLFxuICAgICcnLFxuICAgICcjIyMgR2l0SHViIEFjdGlvbnMgV29ya2Zsb3dzIChgLmdpdGh1Yi93b3JrZmxvd3MvYCknLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBUcmlnZ2VyIHwnLFxuICAgICd8LS0tLS0tfC0tLS0tLS0tLXwnLFxuICAgICd8IGBwci1kZXBsb3kueW1sYCB8IE9uIHB1bGwgcmVxdWVzdCBvcGVuL3VwZGF0ZSDigJQgZGVwbG95cyBhIHBlci1QUiBkZXYgc3RhY2sgfCcsXG4gICAgJ3wgYHByLWNsZWFudXAueW1sYCB8IE9uIHB1bGwgcmVxdWVzdCBjbG9zZSDigJQgdGVhcnMgZG93biB0aGUgcGVyLVBSIGRldiBzdGFjayB8JyxcbiAgICAnfCBgc3RhZ2luZy1kZXBsb3kueW1sYCB8IE9uIHB1c2ggdG8gYG1haW5gIOKAlCBkZXBsb3lzIHRvIHN0YWdpbmcgfCcsXG4gICAgJ3wgYHByb2R1Y3Rpb24tZGVwbG95LnltbGAgfCBNYW51YWxseSB0cmlnZ2VyZWQg4oCUIGRlcGxveXMgdG8gcHJvZHVjdGlvbiB8JyxcbiAgICAnJyxcbiAgICAnLS0tJyxcbiAgICAnJyxcbiAgICAnIyMgRmlsZXMgWW91IENhbiBFZGl0JyxcbiAgICAnJyxcbiAgICAnVGhlc2UgZmlsZXMgYXJlIGdlbmVyYXRlZCBvbmNlIGFuZCBuZXZlciBvdmVyd3JpdHRlbiBieSBCYXRtYW4uIE1vZGlmeSB0aGVtIGZyZWVseS4nLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBXaGF0IHRvIGRvIHdpdGggaXQgfCcsXG4gICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18JyxcbiAgICAnfCBgLnByb2plbnJjLnRzIHwgVGhlIG1haW4gUHJvamVuIGNvbmZpZ3VyYXRpb24gZmlsZS4gQWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgZm9yIGVpdGhlciB0aGUgQVBJIG9yIHRoZSBXZWIgZnJvbnRlbmQgbmVlZCB0byBiZSBhZGRlZCBoZXJlIHwnLFxuICAgICd8IGBzcmMvc3RhY2tzL0FwcGxpY2F0aW9uU3RhY2sudHNgIHwgKipTdGFydCBoZXJlLioqIEFkZCBDREsgY29uc3RydWN0cyB0byBidWlsZCB5b3VyIGluZnJhc3RydWN0dXJlIHwnLFxuICAgICd8IGBzcmMvYXBpL2FwcC50cyB8IFRoZSBtYWluIG1vbm9saXRoaWMgQVBJIFJFU1Qgc2VydmVyIGZpbGUuIE1haW4gZmlsZSB5b3Ugc2hvdWxkIGJlIG1vZGlmeWluZyB8JyxcbiAgICAnfCBgd2ViL3NyYy9BcHAudHN4YCB8IEJ1aWxkIHlvdXIgVUkgaGVyZSB8JyxcbiAgICAnfCBgd2ViL3NyYy9BcHAuY3NzYCAvIGB3ZWIvc3JjL2luZGV4LmNzc2AgfCBTdHlsZSB5b3VyIGFwcGxpY2F0aW9uIHwnLFxuICAgICd8IGB3ZWIvc3JjL21haW4udHN4YCB8IEFkanVzdCB0b3AtbGV2ZWwgcHJvdmlkZXJzIG9yIHJvdXRpbmcgfCcsXG4gICAgJ3wgYHdlYi9zcmMvc2VydmljZXMvQXBpU2VydmljZS50c2AgLyBgd2ViL3NyYy9oZWxwZXJzL2AgfCBBZGQgQVBJIHNlcnZpY2UgaG9va3MgYWxvbmdzaWRlIGBBcGlTZXJ2aWNlLnRzYCwgb3IgYWRqdXN0IHRoZSByZXF1ZXN0IGhlbHBlcnMgfCcsXG4gICAgJ3wgYHdlYi9wdWJsaWMvY29uZmlnLmpzb25gIHwgVXBkYXRlIGZvciBsb2NhbCBkZXZlbG9wbWVudCAoQVBJIFVSTCwgQ2xlcmsga2V5KSB8JyxcbiAgICAuLi4oZTJlVGVzdGluZyA/IFtcbiAgICAgICd8IGB3ZWIvcGxheXdyaWdodC5jb25maWcudHNgIC8gYHdlYi9lMmUvYCB8IFBsYXl3cmlnaHQgZTJlIHN1aXRlIOKAlCBleHRlbmQgaXQgd2l0aCByZWFsIGZsb3dzOyBzZWUgYHdlYi9lMmUvUkVBRE1FLm1kYCB8JyxcbiAgICBdIDogW10pLFxuICAgICcnLFxuICAgICcjIyBGaWxlcyBZb3UgQ2Fubm90IEVkaXQnLFxuICAgICcnLFxuICAgICdUaGVzZSBmaWxlcyBhcmUgKiptYW5hZ2VkIGJ5IEJhdG1hbioqIGFuZCB3aWxsIGJlIG92ZXJ3cml0dGVuIGV2ZXJ5IHRpbWUgYG5weCBwcm9qZW5gIHJ1bnMuIERvIG5vdCBlZGl0IHRoZW0gZGlyZWN0bHkg4oCUIG1ha2UgY2hhbmdlcyBpbiBgLnByb2plbnJjLnRzYCBpbnN0ZWFkLicsXG4gICAgJycsXG4gICAgJz4gWyFJTVBPUlRBTlRdJyxcbiAgICAnPiBJZiB5b3UgaGF2ZSBBTlkgY2hhbmdlcyB5b3Ugd2FudCB0byBtYWtlIHRvIHRoZXNlIGZpbGVzLCBub3RpZnkgI3RlYW0tYmF0bWFuIG9uIFNsYWNrLiAnLFxuICAgICc+IFdlIG1haW50YWluIHRoZXNlIGZpbGVzIGFzIHBhcnQgb2YgdGhlIGNvcmUgQmF0bWFuIGV4cGVyaWVuY2UsIGFuZCB5b3VyIGZlZWRiYWNrIGlzIGNydWNpYWwgdG8gZW5zdXJlIHRoZXkgbWVldCB5b3VyIG5lZWRzLicsXG4gICAgJycsXG4gICAgJ3wgRmlsZSB8IFdoeSBpdFxcJ3MgbWFuYWdlZCB8JyxcbiAgICAnfC0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwnLFxuICAgICd8IGBzcmMvc3RhY2tzL0Jhc2VBcHBsaWNhdGlvblN0YWNrLnRzYCB8IENvcmUgc3RhY2sgd2lyaW5nIOKAlCB1cGRhdGVkIHdpdGggQmF0bWFuIHJlbGVhc2VzIHwnLFxuICAgICd8IGBzcmMvYXNwZWN0cy9EYXRhRG9nQXNwZWN0LnRzYCB8IERhdGFkb2cgQ0RLIGFzcGVjdCB8JyxcbiAgICAnfCBgd2ViL3ZpdGUuY29uZmlnLnRzYCB8IFZpdGUgY29uZmlndXJhdGlvbiB8JyxcbiAgICAnfCBgd2ViL2VzbGludC5jb25maWcuanNgIHwgRVNMaW50IGNvbmZpZ3VyYXRpb24gfCcsXG4gICAgJ3wgYHdlYi9wb3N0Y3NzLmNvbmZpZy5qc2AgfCBQb3N0Q1NTIC8gVGFpbHdpbmQgY29uZmlndXJhdGlvbiB8JyxcbiAgICAnfCBgd2ViL2luZGV4Lmh0bWxgIHwgSFRNTCBlbnRyeSBwb2ludCB8JyxcbiAgICAnfCBgd2ViL3RzY29uZmlnLmpzb25gIC8gYHdlYi90c2NvbmZpZy5hcHAuanNvbmAgLyBgd2ViL3RzY29uZmlnLm5vZGUuanNvbmAgfCBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gfCcsXG4gICAgJ3wgYHdlYi9zcmMvdml0ZS1lbnYuZC50c2AgfCBWaXRlIHR5cGUgZGVjbGFyYXRpb25zIHwnLFxuICAgICd8IGB3ZWIvc3JjL2NvbmZpZy50c2AgfCBSdW50aW1lIGNvbmZpZyBob29rIOKAlCBzaGFwZSBkcml2ZW4gYnkgYC5wcm9qZW5yYy50c2AgfCcsXG4gICAgJ3wgYC5naXRodWIvQ09ERU9XTkVSU2AgfCBDb2RlIG93bmVyc2hpcCBwb2xpY3kgfCcsXG4gICAgJ3wgYC5naXRodWIvd29ya2Zsb3dzLyoueW1sYCB8IEFsbCBDSS9DRCB3b3JrZmxvd3MgfCcsXG4gICAgJ3wgYGFyY2hpdGVjdHVyZS1ydWxlcy9jaGVjay50c2AsIGB0c2NvbmZpZy5qc29uYCwgYFJFQURNRS5tZGAgfCBBcmNoaXRlY3R1cmUgcnVsZSBlbmdpbmUgfCcsXG4gICAgJ3wgYGF0dGVzdGF0aW9uL21hbmlmZXN0LnRzYCwgYHZlcmlmeS50c2AsIGB0c2NvbmZpZy5qc29uYCB8IFBSIGF0dGVzdGF0aW9uIG1lY2hhbmlzbSB8JyxcbiAgICAnfCBgb3BlbnNwZWMtZ2F0ZXMvY2hlY2stdGFza3MtY29tcGxldGUudHNgLCBgdHNjb25maWcuanNvbmAgfCBPcGVuU3BlYyB0YXNrLWNvbXBsZXRpb24gZ2F0ZSB8JyxcbiAgICAnfCBgc3dhbXAtYm9vdHN0cmFwL3B1bGwtZXh0ZW5zaW9ucy50c2AsIGB0c2NvbmZpZy5qc29uYCB8IFB1bGxzIHN3YW1wIGV4dGVuc2lvbnMgYXQgdGhlaXIgcGlubmVkIHZlcnNpb25zIHwnLFxuICAgICd8IGB3b3JrZmxvd3Mvd29ya2Zsb3ctKi55YW1sYCB8IFN3YW1wIHdvcmtmbG93cyB0aGUgc29mdHdhcmUgZmFjdG9yeSBydW5zIHwnLFxuICAgICcnLFxuICAgICc+ICoqVGlwOioqIEZpbGVzIHdpdGggYSBgfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibnB4IHByb2plblwiLiB+fmAgaGVhZGVyIGFyZSBtYW5hZ2VkIGZpbGVzLicsXG4gICAgJycsXG4gICAgJyMjIyBTb2Z0d2FyZSBGYWN0b3J5IChgbW9kZWxzL2AsIGBhcmNoaXRlY3R1cmUtcnVsZXMvcnVsZXMuanNvbmApJyxcbiAgICAnJyxcbiAgICAnQmF0bWFuIGFsc28gc2VlZHMgYSBbc3dhbXBdKGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FtcC1jbHViL3N3YW1wKSBzb2Z0d2FyZScsXG4gICAgJ2ZhY3Rvcnkg4oCUIGEgYEBzd2FtcC9zb2Z0d2FyZS1mYWN0b3J5YCBzdGF0ZSBtYWNoaW5lIHRoYXQgZHJpdmVzIGEgR2l0SHViJyxcbiAgICAnaXNzdWUgdGhyb3VnaCBpbnRha2UsIE9wZW5TcGVjIHBsYW5uaW5nLCBpbXBsZW1lbnRhdGlvbiwgcHJlLVBSJyxcbiAgICAndmVyaWZpY2F0aW9uLCBhbmQgYW4gb3BlbmVkIFBSLiBUaGUgc2VlZCBmaWxlcyB1bmRlciBgbW9kZWxzLyoqLyoueWFtbGAgYW5kJyxcbiAgICAnYGFyY2hpdGVjdHVyZS1ydWxlcy9ydWxlcy5qc29uYCBhcmUgZ2VuZXJhdGVkIG9uY2UgKGxpa2UgdGhlIGZpbGVzIGluJyxcbiAgICAnXCJGaWxlcyBZb3UgQ2FuIEVkaXRcIiBhYm92ZSkg4oCUIHR1bmUgdGhlIGZhY3RvcnlcXCdzIHN0YWdlcy9nYXRlcyBvciBhZGQgeW91cicsXG4gICAgJ293biBhcmNoaXRlY3R1cmUgcnVsZXMgZGlyZWN0bHkgaW4gdGhvc2UgZmlsZXMuJyxcbiAgICAnJyxcbiAgICAnYHN3YW1wIGluaXRgIHJ1bnMgYXV0b21hdGljYWxseSBhcyBwYXJ0IG9mIGBpbnN0YWxsYC9gaW5zdGFsbDpjaWAgKGEgc2lsZW50JyxcbiAgICAnbm8tb3AgaWYgYHN3YW1wYCBpc25cXCd0IG9uIFBBVEgsIGUuZy4gaW4gQ0kpLCBzbyB0aGUgcmVwbyBzdGF5cyBpbml0aWFsaXplZCcsXG4gICAgJ3dpdGhvdXQgYSBzZXBhcmF0ZSBzdGVwLicsXG4gICAgJycsXG4gICAgJ2Bzd2FtcFZlcnNpb25gIGluIGAuc3dhbXAueWFtbGAgaXMgdGhlIG1pbmltdW0gc3dhbXAgQ0xJIHRoZSByZXBvIG5lZWRzOiB0aGUnLFxuICAgICd2ZXJzaW9uIGl0IHdhcyBsYXN0IHVwZ3JhZGVkIHdpdGguIHN3YW1wIGRvZXNuXFwndCBrZWVwIG9sZCBidWlsZHMsIHNvIGluc3RhbGwnLFxuICAgICd0aGUgY3VycmVudCBgc3RhYmxlYCByZWxlYXNlIHJhdGhlciB0aGFuIHRoYXQgZXhhY3QgdmVyc2lvbjonLFxuICAgICcnLFxuICAgICdgYGBiYXNoJyxcbiAgICAnIyBtYWNPUyAvIExpbnV4JyxcbiAgICAnY3VybCAtZnNTTCBodHRwczovL3N3YW1wLmNsdWIvaW5zdGFsbC5zaCB8IHNoJyxcbiAgICAnJyxcbiAgICAnIyBXaW5kb3dzIChQb3dlclNoZWxsKScsXG4gICAgJ2lybSBodHRwczovL3N3YW1wLmNsdWIvaW5zdGFsbC5wczEgfCBpZXgnLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICdPbmUtdGltZSBzZXR1cCBiZXlvbmQgdGhhdCwgYWZ0ZXIgeW91ciBmaXJzdCBgbnB4IHByb2plbmA6JyxcbiAgICAnJyxcbiAgICAnYGBgYmFzaCcsXG4gICAgJyMgUHVsbHMgZWFjaCBleHRlbnNpb24gYXQgdGhlIHZlcnNpb24gcGlubmVkIGluJyxcbiAgICAnIyBleHRlbnNpb25zL21vZGVscy91cHN0cmVhbV9leHRlbnNpb25zLmpzb24gKG9yIHRoZSBsYXRlc3QnLFxuICAgICcjIHNvZnR3YXJlLWZhY3RvcnkvZ2l0aHViIGV4dGVuc2lvbnMgaW4gYSByZXBvIHdpdGggbm8gbG9ja2ZpbGUgeWV0KSwnLFxuICAgICcjIHJlc3RvcmVzIHRoZSBsb2NrZmlsZSBhbmQgY29tbWl0dGVkIHNraWxsIGZpbGVzIGZyb20gZ2l0LCBhbmQgY3JlYXRlcyB0aGUnLFxuICAgICcjIHJlcG9cXCdzIHNlY3JldHMgdmF1bHQnLFxuICAgICducHggcHJvamVuIHN3YW1wOmJvb3RzdHJhcCcsXG4gICAgJycsXG4gICAgJyMgVGhlbiBzdG9yZSBhIEdpdEh1YiB0b2tlbiB0aGUgZmFjdG9yeSBjYW4gb3BlbiBQUnMgd2l0aCcsXG4gICAgJ3N3YW1wIHZhdWx0IHB1dCA8cmVwbz4tc2VjcmV0cyBHSVRIVUJfVE9LRU4gLS1yZWZyZXNoLWZyb20gXCJnaCBhdXRoIHRva2VuXCInLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICctLS0nLFxuICAgICcnLFxuICAgICcjIyBXaGVyZSB0byBTdGFydCcsXG4gICAgJycsXG4gICAgJzEuICoqYHNyYy9zdGFja3MvQXBwbGljYXRpb25TdGFjay50c2AqKiDigJQgQWRkIHlvdXIgQ0RLIGNvbnN0cnVjdHMgaGVyZS4gVGhlIGJhc2Ugc3RhY2sgYWxyZWFkeSBwcm92aWRlcyBgdGhpcy5hcGlgLCBgdGhpcy52cGNgLCBgdGhpcy5ob3N0ZWRab25lYCwgYW5kIGB0aGlzLmRhdGFkb2dgIGFzIHByb3RlY3RlZCBwcm9wZXJ0aWVzLicsXG4gICAgJycsXG4gICAgJzIuICoqYHdlYi9gKiog4oCUIEJ1aWxkIHlvdXIgZnJvbnRlbmQuIFN0YXJ0IHdpdGggYHdlYi9zcmMvQXBwLnRzeGAgYW5kIGFkZCBzZXJ2aWNlcyBhbG9uZ3NpZGUgYHdlYi9zcmMvc2VydmljZXMvQXBpU2VydmljZS50c2AuJyxcbiAgICAnJyxcbiAgICAnMy4gKipgc3JjL2FwaS9hcHAudHNgKiog4oCUIEltcGxlbWVudCB5b3VyIGJhY2tlbmQgTGFtYmRhIGhhbmRsZXIgbG9naWMgaGVyZS4nLFxuICAgICcnLFxuICAgICc0LiAqKmAucHJvamVucmMudHNgKiogLSBNYW5hZ2VzIHByb2plY3QgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9uLiBSdW4gYG5weCBwcm9qZW5gIGFmdGVyIG1ha2luZyBhbnkgY2hhbmdlcyB0byB0aGlzIGZpbGUuJyxcbiAgICAnLS0tJyxcbiAgICAnJyxcbiAgICAnIyMgRGV2ZWxvcG1lbnQgV29ya2Zsb3cnLFxuICAgICcnLFxuICAgICdgYGBiYXNoJyxcbiAgICAnIyBJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgJ3lhcm4gaW5zdGFsbCcsXG4gICAgJycsXG4gICAgJyMgU3RhcnQgbG9jYWwgZGV2IHNlcnZlciAoYmFja2VuZCBMYW1iZGEgKyBWaXRlIGZyb250ZW5kIGluIHBhcmFsbGVsKScsXG4gICAgJ3lhcm4gZGV2JyxcbiAgICAnJyxcbiAgICAnIyBEZXBsb3kgYSBwZXJzb25hbCBkZXYgc3RhY2sgdG8gQVdTIGFzIGFuIGFsdGVybmF0aXZlIHRvIGxvY2FsIGRldmVsb3BtZW50LCBwcm92aWRlcyBtb3JlIHRob3JvdWdoIGVuZC10by1lbmQgdGVzdGluZycsXG4gICAgJ3lhcm4gY2RrOmRldiAtLWNvbnRleHQgbG9jYWwtZGV2LXByZWZpeD15b3VyLWhhbmRsZSBkZXBsb3knLFxuICAgICcnLFxuICAgICcjIFJlZGVwbG95IHlvdXIgcGVyc29uYWwgZGV2IHN0YWNrIGZhc3Q6IGFmdGVyIHRoZSBmaXJzdCBkZXBsb3kgYWJvdmUsIGtlZXAnLFxuICAgIFwiIyByZXVzaW5nIHRoZSBzYW1lIHN0YWNrIChkb24ndCBkZWxldGUgaXQgYmV0d2VlbiBicmFuY2hlcykgYW5kIGl0ZXJhdGUgd2l0aFwiLFxuICAgICcjIGhvdHN3YXAtZmFsbGJhY2sgaW5zdGVhZCBvZiBhIGZ1bGwgQ2xvdWRGb3JtYXRpb24gZGVwbG95bWVudCcsXG4gICAgJ3lhcm4gY2RrOmRldjpob3Rzd2FwIC0tY29udGV4dCBsb2NhbC1kZXYtcHJlZml4PXlvdXItaGFuZGxlJyxcbiAgICAnJyxcbiAgICAnIyBSdW4gdGVzdHMnLFxuICAgICd5YXJuIHRlc3QnLFxuICAgICcnLFxuICAgICcjIFJlLXN5bnRoZXNpemUgcHJvamVjdCBmaWxlcyBhZnRlciBlZGl0aW5nIC5wcm9qZW5yYy50cycsXG4gICAgJ25weCBwcm9qZW4nLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICc+IFshSU1QT1JUQU5UXScsXG4gICAgJz4gYC0taG90c3dhcC1mYWxsYmFja2AgKHVzZWQgYnkgYGNkazpkZXY6aG90c3dhcGAgYW5kIHRoZSBgd2F0Y2hgIHRhc2spIGlzIGZvcicsXG4gICAgJz4gcGVyc29uYWwgZGV2IHN0YWNrcyBvbmx5IOKAlCBuZXZlciBydW4gaXQgYWdhaW5zdCBzdGFnaW5nIG9yIHByb2QuJyxcbiAgICAnJyxcbiAgICAnLS0tJyxcbiAgICAnJyxcbiAgICAnIyMgVXBncmFkaW5nIEJhdG1hbicsXG4gICAgJycsXG4gICAgJ2BgYGJhc2gnLFxuICAgICd5YXJuIGFkZCBAbWFjZWRvbi10ZWNobm9sb2dpZXMvYmF0bWFuQGxhdGVzdCcsXG4gICAgJ25weCBwcm9qZW4nLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICdUaGlzIHVwZGF0ZXMgYWxsIG1hbmFnZWQgZmlsZXMgdG8gdGhlIGxhdGVzdCBCYXRtYW4gc3RhbmRhcmRzLiBZb3VyIGVkaXRhYmxlIHNhbXBsZSBmaWxlcyBhcmUgbmV2ZXIgdG91Y2hlZC4nLFxuICBdLmpvaW4oJ1xcbicpO1xufVxuIl19
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSw0Q0FZQztBQU1ELHdDQVdDO0FBV0QsNERBT0M7QUFVRCxzREFFQztBQU9ELDREQUVDO0FBRUQsa0NBZ0JDO0FBRUQsd0NBa01DO0FBL1JELHNEQUEyRDtBQUUzRDs7R0FFRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLGNBQWtDLEVBQUUsTUFBYztJQUNqRixRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFdBQVcsTUFBTSxFQUFFLENBQUM7UUFDN0IsS0FBSywrQkFBa0IsQ0FBQyxHQUFHO1lBQ3pCLE9BQU8sV0FBVyxNQUFNLEVBQUUsQ0FBQztRQUM3QixLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQzFCO1lBQ0Usb0ZBQW9GO1lBQ3BGLE9BQU8sUUFBUSxNQUFNLEVBQUUsQ0FBQztJQUM1QixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxjQUFrQztJQUMvRCxRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLCtCQUFrQixDQUFDLEdBQUc7WUFDekIsT0FBTywrQkFBK0IsQ0FBQztRQUN6QyxLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxnQ0FBZ0MsQ0FBQztRQUMxQztZQUNFLE9BQU8sZ0NBQWdDLENBQUM7SUFDNUMsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHdCQUF3QjtJQUN0QyxPQUFPO1FBQ0wsbUdBQW1HO1FBQ25HLG9EQUFvRDtRQUNwRCwrQ0FBK0M7UUFDL0MsSUFBSTtLQUNMLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLEdBQUcsUUFBa0I7SUFDekQsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsSUFBWTtJQUNuRCxPQUFPLGtDQUFrQyxJQUFJLHNCQUFzQixDQUFDO0FBQ3RFLENBQUM7QUFFRCxTQUFnQixXQUFXLENBQUMsS0FBVSxFQUFFLEtBQUssR0FBRyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDeEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLEtBQUssR0FBRyxDQUFDO0lBQ25ELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRixPQUFPLE1BQU0sS0FBSyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7YUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ2hFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNmLE9BQU8sTUFBTSxPQUFPLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFDbkMsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUM1QixXQUFtQixFQUNuQixVQUFVLEdBQUcsSUFBSSxFQUNqQixpQkFBcUMsK0JBQWtCLENBQUMsWUFBWTtJQUVwRSxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDcEUsT0FBTztRQUNMLEtBQUssV0FBVyxFQUFFO1FBQ2xCLEVBQUU7UUFDRix1R0FBdUc7UUFDdkcsRUFBRTtRQUNGLHdCQUF3QjtRQUN4QixFQUFFO1FBQ0YsaUNBQWlDO1FBQ2pDLEVBQUU7UUFDRix3QkFBd0I7UUFDeEIsd0JBQXdCO1FBQ3hCLG1HQUFtRztRQUNuRyxxSUFBcUk7UUFDckksZ0dBQWdHO1FBQ2hHLHdGQUF3RjtRQUN4RixnSEFBZ0g7UUFDaEgsOEZBQThGO1FBQzlGLHdGQUF3RjtRQUN4RixvRkFBb0Y7UUFDcEYsNkhBQTZIO1FBQzdILDRGQUE0RjtRQUM1RixFQUFFO1FBQ0YsdUJBQXVCO1FBQ3ZCLEVBQUU7UUFDRix3QkFBd0I7UUFDeEIsd0JBQXdCO1FBQ3hCLHFGQUFxRjtRQUNyRixvREFBb0Q7UUFDcEQsa0ZBQWtGO1FBQ2xGLHdGQUF3RjtRQUN4Rix3SEFBd0g7UUFDeEgsMElBQTBJO1FBQzFJLHFGQUFxRjtRQUNyRixHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNmLGtGQUFrRjtZQUNsRiw0Q0FBNEMsY0FBYyxzREFBc0Q7U0FDakgsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsRUFBRTtRQUNGLHFEQUFxRDtRQUNyRCxFQUFFO1FBQ0Ysb0JBQW9CO1FBQ3BCLG9CQUFvQjtRQUNwQixnRkFBZ0Y7UUFDaEYsZ0ZBQWdGO1FBQ2hGLG1FQUFtRTtRQUNuRSwwRUFBMEU7UUFDMUUsRUFBRTtRQUNGLEtBQUs7UUFDTCxFQUFFO1FBQ0YsdUJBQXVCO1FBQ3ZCLEVBQUU7UUFDRixxRkFBcUY7UUFDckYsRUFBRTtRQUNGLCtCQUErQjtRQUMvQiwrQkFBK0I7UUFDL0IsOElBQThJO1FBQzlJLHdHQUF3RztRQUN4RyxtR0FBbUc7UUFDbkcsNENBQTRDO1FBQzVDLHNFQUFzRTtRQUN0RSxnRUFBZ0U7UUFDaEUsNElBQTRJO1FBQzVJLGtGQUFrRjtRQUNsRixHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNmLHlIQUF5SDtTQUMxSCxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxFQUFFO1FBQ0YsMEJBQTBCO1FBQzFCLEVBQUU7UUFDRixpS0FBaUs7UUFDakssRUFBRTtRQUNGLGdCQUFnQjtRQUNoQiwyRkFBMkY7UUFDM0YsK0hBQStIO1FBQy9ILEVBQUU7UUFDRiw4QkFBOEI7UUFDOUIsNEJBQTRCO1FBQzVCLDZGQUE2RjtRQUM3Rix5REFBeUQ7UUFDekQsK0NBQStDO1FBQy9DLG1EQUFtRDtRQUNuRCxnRUFBZ0U7UUFDaEUseUNBQXlDO1FBQ3pDLHlHQUF5RztRQUN6RyxzREFBc0Q7UUFDdEQsZ0ZBQWdGO1FBQ2hGLGtEQUFrRDtRQUNsRCxxREFBcUQ7UUFDckQsNEZBQTRGO1FBQzVGLHdGQUF3RjtRQUN4RiwrRkFBK0Y7UUFDL0YsNkdBQTZHO1FBQzdHLDZFQUE2RTtRQUM3RSxFQUFFO1FBQ0YsbUlBQW1JO1FBQ25JLEVBQUU7UUFDRixtRUFBbUU7UUFDbkUsRUFBRTtRQUNGLDJFQUEyRTtRQUMzRSwwRUFBMEU7UUFDMUUsaUVBQWlFO1FBQ2pFLDZFQUE2RTtRQUM3RSx1RUFBdUU7UUFDdkUsNEVBQTRFO1FBQzVFLGlEQUFpRDtRQUNqRCxFQUFFO1FBQ0YsNkVBQTZFO1FBQzdFLDZFQUE2RTtRQUM3RSwwQkFBMEI7UUFDMUIsRUFBRTtRQUNGLDhFQUE4RTtRQUM5RSwrRUFBK0U7UUFDL0UsOERBQThEO1FBQzlELEVBQUU7UUFDRixTQUFTO1FBQ1QsaUJBQWlCO1FBQ2pCLCtDQUErQztRQUMvQyxFQUFFO1FBQ0Ysd0JBQXdCO1FBQ3hCLDBDQUEwQztRQUMxQyxLQUFLO1FBQ0wsRUFBRTtRQUNGLDREQUE0RDtRQUM1RCxFQUFFO1FBQ0YsU0FBUztRQUNULGlEQUFpRDtRQUNqRCw2REFBNkQ7UUFDN0QsdUVBQXVFO1FBQ3ZFLDZFQUE2RTtRQUM3RSx5QkFBeUI7UUFDekIsNEJBQTRCO1FBQzVCLEVBQUU7UUFDRiwyREFBMkQ7UUFDM0QsNEVBQTRFO1FBQzVFLEtBQUs7UUFDTCxFQUFFO1FBQ0YsS0FBSztRQUNMLEVBQUU7UUFDRixtQkFBbUI7UUFDbkIsRUFBRTtRQUNGLDZOQUE2TjtRQUM3TixFQUFFO1FBQ0YsZ0lBQWdJO1FBQ2hJLEVBQUU7UUFDRiw2RUFBNkU7UUFDN0UsRUFBRTtRQUNGLGlJQUFpSTtRQUNqSSxLQUFLO1FBQ0wsRUFBRTtRQUNGLHlCQUF5QjtRQUN6QixFQUFFO1FBQ0YsU0FBUztRQUNULHdCQUF3QjtRQUN4QixjQUFjO1FBQ2QsRUFBRTtRQUNGLHVFQUF1RTtRQUN2RSxVQUFVO1FBQ1YsRUFBRTtRQUNGLHdIQUF3SDtRQUN4SCw0REFBNEQ7UUFDNUQsRUFBRTtRQUNGLDZFQUE2RTtRQUM3RSw4RUFBOEU7UUFDOUUsZ0VBQWdFO1FBQ2hFLDZEQUE2RDtRQUM3RCxFQUFFO1FBQ0YsYUFBYTtRQUNiLFdBQVc7UUFDWCxFQUFFO1FBQ0YsMERBQTBEO1FBQzFELFlBQVk7UUFDWixLQUFLO1FBQ0wsRUFBRTtRQUNGLGdCQUFnQjtRQUNoQixnRkFBZ0Y7UUFDaEYsb0VBQW9FO1FBQ3BFLEVBQUU7UUFDRixLQUFLO1FBQ0wsRUFBRTtRQUNGLHFCQUFxQjtRQUNyQixFQUFFO1FBQ0YsU0FBUztRQUNULDhDQUE4QztRQUM5QyxZQUFZO1FBQ1osS0FBSztRQUNMLEVBQUU7UUFDRiw4R0FBOEc7S0FDL0csQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZVBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAncHJvamVuL2xpYi9qYXZhc2NyaXB0JztcblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBjb21tYW5kIHVzZWQgdG8gcnVuIGEgcGFja2FnZS5qc29uIHNjcmlwdCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgbWFuYWdlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blNjcmlwdENvbW1hbmQocGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlciwgc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgcmV0dXJuIGBucG0gcnVuICR7c2NyaXB0fWA7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOOlxuICAgICAgcmV0dXJuIGBidW4gcnVuICR7c2NyaXB0fWA7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTTpcbiAgICAgIHJldHVybiBgcG5wbSAke3NjcmlwdH1gO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBhbGwgeWFybiB2YXJpYW50cyAoeWFybiwgeWFybjIsIHlhcm5fY2xhc3NpYywgeWFybl9iZXJyeSkgc2hhcmUgdGhlIGB5YXJuYCBiaW5hcnlcbiAgICAgIHJldHVybiBgeWFybiAke3NjcmlwdH1gO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgY29tbWFuZCB1c2VkIHRvIGRvIGEgY2xlYW4sIHJlcHJvZHVjaWJsZSBkZXBlbmRlbmN5IGluc3RhbGwgKGUuZy4gZm9yIENJKVxuICogZm9yIHRoZSBnaXZlbiBwYWNrYWdlIG1hbmFnZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwYWNrYWdlTWFuYWdlcikge1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTpcbiAgICAgIHJldHVybiAnbnBtIGNpJztcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5CVU46XG4gICAgICByZXR1cm4gJ2J1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJztcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgcmV0dXJuICdwbnBtIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ3lhcm4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSc7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNoIGxpbmVzIHRoYXQgc2FuaXRpemUgYSBgQ0xFQU5fQlJBTkNIX05BTUVgIHZhcmlhYmxlIChhbHJlYWR5IHN0cmlwcGVkIG9mIGFueVxuICogY29udmVudGlvbmFsLWNvbW1pdCBwcmVmaXgpIGludG8gYSB2YWx1ZSBzYWZlIHRvIHVzZSBhcyBhIENsb3VkRm9ybWF0aW9uIHN0YWNrLW5hbWVcbiAqIGZyYWdtZW50OiBjb2xsYXBzZXMgcnVucyBvZiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgdG8gYC1gLCB0cmltcyBsZWFkaW5nL3RyYWlsaW5nXG4gKiBgLWAsIGFuZCBwcmVmaXhlcyB3aXRoIGBwci1gIGlmIHRoZSByZXN1bHQgd291bGQgbm90IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKG9yIGlzIGVtcHR5KS5cbiAqXG4gKiBTaGFyZWQgYnkgUHJEZXBsb3lXb3JrZmxvdyBhbmQgUHJDbGVhbnVwV29ya2Zsb3cgc28gYm90aCBkZXJpdmUgdGhlIGlkZW50aWNhbCBzdGFja1xuICogbmFtZSBmb3IgYSBnaXZlbiBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUJyYW5jaE5hbWVTY3JpcHQoKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgICdDTEVBTl9CUkFOQ0hfTkFNRT0kKGVjaG8gXCIkQ0xFQU5fQlJBTkNIX05BTUVcIiB8IHNlZCAtRSBcXCdzL1teQS1aYS16MC05XSsvLS9nOyBzL14tKy8vOyBzLy0rJC8vXFwnKScsXG4gICAgJ2lmIFtbICEgXCIkQ0xFQU5fQlJBTkNIX05BTUVcIiA9fiBeW0EtWmEtel0gXV07IHRoZW4nLFxuICAgICcgIENMRUFOX0JSQU5DSF9OQU1FPVwicHItJHtDTEVBTl9CUkFOQ0hfTkFNRX1cIicsXG4gICAgJ2ZpJyxcbiAgXTtcbn1cblxuLyoqXG4gKiBKb2lucyBjb21tYW5kcyB3aXRoIGA7YCBpbnN0ZWFkIG9mIGAmJmAvYHx8YCBzbyB0aGUgcmVzdWx0IGlzIHZhbGlkIGZvciBhIHN3YW1wXG4gKiBjb21tYW5kL3NoZWxsIG1vZGVsJ3MgYHJ1bjpgIHZhbHVlIG9uIGJvdGggUE9TSVggc2hlbGxzIGFuZCBXaW5kb3dzIFBvd2VyU2hlbGwgNS4xXG4gKiAod2hpY2ggaGFzIG5vIGAmJmAvYHx8YCBjaGFpbiBvcGVyYXRvcnMgYmVmb3JlIHB3c2ggNykuIFVubGlrZSBgJiZgLCBgO2AgZG9lcyBub3RcbiAqIHNob3J0LWNpcmN1aXQgb24gZmFpbHVyZSDigJQgY2FsbGVycyB0aGF0IG5lZWQgZmFpbHVyZSB0byBzdG9wIHRoZSBzZXF1ZW5jZSBzaG91bGQgc3BsaXRcbiAqIGludG8gc2VwYXJhdGUgd29ya2Zsb3cgc3RlcHMgd2l0aCB0aGVpciBvd24gYGFzc2VydGAgZ2F0ZXMgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRoaXNcbiAqIGZvciBjb250cm9sIGZsb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbFBvcnRhYmxlU2VxdWVuY2UoLi4uY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJzsgJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHBvcnRhYmxlIGZvcmNlLWRlbGV0ZSBmb3IgYSBzaW5nbGUgZmlsZSwgZm9yIHVzZSBpbiBhIHN3YW1wIGNvbW1hbmQvc2hlbGxcbiAqIG1vZGVsJ3MgYHJ1bjpgIHZhbHVlIGluIHBsYWNlIG9mIGBybSAtZiA8cGF0aD5gIChhbWJpZ3VvdXMgd2l0aCBQb3dlclNoZWxsIDUuMSdzXG4gKiBgUmVtb3ZlLUl0ZW0gLUZpbHRlcmAgYWxpYXMpLiBNYXRjaGVzIHRoZSBmaXggYWxyZWFkeSB2YWxpZGF0ZWQgaW4gZXhtYW4jMTM2LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxQb3J0YWJsZUZvcmNlRGVsZXRlKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgbm9kZSAtZSBcInJlcXVpcmUoJ2ZzJykucm1TeW5jKCcke3BhdGh9JywgeyBmb3JjZTogdHJ1ZSB9KVwiYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVRzKHZhbHVlOiBhbnksIGRlcHRoID0gMSk6IHN0cmluZyB7XG4gIGNvbnN0IHBhZCA9ICcgICcucmVwZWF0KGRlcHRoKTtcbiAgY29uc3QgaW5uZXJQYWQgPSAnICAnLnJlcGVhdChkZXB0aCArIDEpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIGAnJHt2YWx1ZX0nYDtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IHZhbHVlLm1hcCh2ID0+IGAke2lubmVyUGFkfSR7c2VyaWFsaXplVHModiwgZGVwdGggKyAxKX1gKS5qb2luKCcsXFxuJyk7XG4gICAgcmV0dXJuIGBbXFxuJHtpdGVtc30sXFxuJHtwYWR9XWA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWUpXG4gICAgICAubWFwKChbaywgdl0pID0+IGAke2lubmVyUGFkfSR7a306ICR7c2VyaWFsaXplVHModiwgZGVwdGggKyAxKX1gKVxuICAgICAgLmpvaW4oJyxcXG4nKTtcbiAgICByZXR1cm4gYHtcXG4ke2VudHJpZXN9LFxcbiR7cGFkfX1gO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkbWVDb250ZW50cyhcbiAgcHJvamVjdE5hbWU6IHN0cmluZyxcbiAgZTJlVGVzdGluZyA9IHRydWUsXG4gIHBhY2thZ2VNYW5hZ2VyOiBOb2RlUGFja2FnZU1hbmFnZXIgPSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDLFxuKSB7XG4gIGNvbnN0IHRlc3RFMmVDb21tYW5kID0gcnVuU2NyaXB0Q29tbWFuZChwYWNrYWdlTWFuYWdlciwgJ3Rlc3Q6ZTJlJyk7XG4gIHJldHVybiBbXG4gICAgYCMgJHtwcm9qZWN0TmFtZX1gLFxuICAgICcnLFxuICAgICdUaGlzIHByb2plY3Qgd2FzIGJvb3RzdHJhcHBlZCB3aXRoIFtCYXRtYW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9tYWNlZG9uLXRlY2hub2xvZ2llcy9wbGF0Zm9ybS1jb21tb24pLicsXG4gICAgJycsXG4gICAgJyMjIFdoYXQgQmF0bWFuIENyZWF0ZWQnLFxuICAgICcnLFxuICAgICcjIyMgQ0RLIEluZnJhc3RydWN0dXJlIChgc3JjL2ApJyxcbiAgICAnJyxcbiAgICAnfCBGaWxlIHwgRGVzY3JpcHRpb24gfCcsXG4gICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLXwnLFxuICAgICd8IGBzcmMvbWFpbi50c2AgfCBDREsgYXBwIGVudHJ5IHBvaW50IOKAlCBpbnN0YW50aWF0ZXMgZGV2LCBzdGFnaW5nLCBhbmQgcHJvZCBgQXBwbGljYXRpb25TdGFja2BzIHwnLFxuICAgICd8IGBzcmMvTG9jYWxEZXZBcHAudHNgIHwgTG9jYWwgZGV2ZWxvcG1lbnQgQ0RLIGFwcCDigJQgdXNlZCBieSBgeWFybiBjZGs6ZGV2YCAtIGRlcGxveXMgdG8gQVdTIGZvciBzbG93ZXIgYnV0IG1vcmUgdGhvcm91Z2ggdGVzdGluZyB8JyxcbiAgICAnfCBgc3JjL0dpdEh1YlJvbGVzLnRzYCB8IENESyBhcHAgZm9yIGRlcGxveWluZyB0aGUgR2l0SHViIE9JREMgSUFNIHJvbGUgKG9uZS10aW1lIGJvb3RzdHJhcCkgfCcsXG4gICAgJ3wgYHNyYy9zdGFja3MvQXBwbGljYXRpb25TdGFjay50c2AgfCBZb3VyIHByaW1hcnkgc3RhY2sg4oCUIGV4dGVuZCBpdCB0byBhZGQgcmVzb3VyY2VzIHwnLFxuICAgICd8IGBzcmMvc3RhY2tzL0Jhc2VBcHBsaWNhdGlvblN0YWNrLnRzYCB8IEJhc2Ugc3RhY2sgd2l0aCBBUEksIHN0YXRpYyB3ZWJzaXRlLCBEYXRhZG9nLCBhbmQgUm91dGUgNTMgd2lyZWQgdXAgfCcsXG4gICAgJ3wgYHNyYy9zdGFja3MvR2l0SHViUm9sZXNTdGFjay50c2AgfCBJQU0gcm9sZSBzdGFjayBmb3IgR2l0SHViIEFjdGlvbnMgT0lEQyBhdXRoZW50aWNhdGlvbiB8JyxcbiAgICAnfCBgc3JjL2NvbnN0cnVjdHMvQXBpLnRzYCB8IEFQSSBHYXRld2F5ICsgTGFtYmRhIGNvbnN0cnVjdCB3aXRoIENsZXJrIEpXVCBhdXRob3JpemVyIHwnLFxuICAgICd8IGBzcmMvY29uc3RydWN0cy9TdGF0aWNXZWJzaXRlLnRzYCB8IENsb3VkRnJvbnQgKyBTMyArIEFDTSArIFJvdXRlIDUzIGNvbnN0cnVjdCB8JyxcbiAgICAnfCBgc3JjL2NvbnN0cnVjdHMvaGFuZGxlci9BcGkuRnVuY3Rpb24udHNgIHwgTGFtYmRhIGhhbmRsZXIgZW50cnkgcG9pbnQsIGJhc2ljIHdyYXBwZXIgYXJvdW5kIEV4cHJlc3MtY29tcGF0aWJsZSBhcHAgY29kZSB8JyxcbiAgICAnfCBgc3JjL2FzcGVjdHMvRGF0YURvZ0FzcGVjdC50c2AgfCBDREsgYXNwZWN0IHRoYXQgd2lyZXMgYWxsIExhbWJkYSBmdW5jdGlvbnMgdG8gRGF0YWRvZyB8JyxcbiAgICAnJyxcbiAgICAnIyMjIEZyb250ZW5kIChgd2ViL2ApJyxcbiAgICAnJyxcbiAgICAnfCBGaWxlIHwgRGVzY3JpcHRpb24gfCcsXG4gICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLXwnLFxuICAgICd8IGB3ZWIvc3JjL21haW4udHN4YCB8IFJlYWN0IGFwcCBlbnRyeSBwb2ludCB3aXRoIENsZXJrIGFuZCBSZWFjdCBRdWVyeSBwcm92aWRlcnMgfCcsXG4gICAgJ3wgYHdlYi9zcmMvQXBwLnRzeGAgfCBSb290IGFwcGxpY2F0aW9uIGNvbXBvbmVudCB8JyxcbiAgICAnfCBgd2ViL3NyYy9BcHAuY3NzYCAvIGB3ZWIvc3JjL2luZGV4LmNzc2AgfCBCYXNlIHN0eWxlc2hlZXRzIChUYWlsd2luZCBDU1MgdjQpIHwnLFxuICAgICd8IGB3ZWIvc3JjL2NvbmZpZy50c2AgfCBgdXNlQ29uZmlnKClgIGhvb2sg4oCUIGxvYWRzIHJ1bnRpbWUgY29uZmlnIGZyb20gYGNvbmZpZy5qc29uYCB8JyxcbiAgICAnfCBgd2ViL3NyYy9zZXJ2aWNlcy9BcGlTZXJ2aWNlLnRzYCB8IGB1c2VBcGlRdWVyeSgpYCAvIGB1c2VBcGlNdXRhdGlvbigpYCDigJQgYXV0aGVudGljYXRlZCBBUEkgaG9va3MsIGNhY2hlZCBwZXIgcGF0aCB8JyxcbiAgICAnfCBgd2ViL3NyYy9oZWxwZXJzL2AgfCBgcmVxdWVzdHMudHNgLCBgSHR0cEVycm9yLnRzYCwgYGVycm9ycy50c2AsIGByZXRyeS50c2Ag4oCUIHRoZSByZXF1ZXN0IGFuZCBlcnJvciBoZWxwZXJzIGBBcGlTZXJ2aWNlYCBpcyBidWlsdCBvbiB8JyxcbiAgICAnfCBgd2ViL3B1YmxpYy9jb25maWcuanNvbmAgfCBSdW50aW1lIGNvbmZpZyAoQVBJIGJhc2UgVVJMLCBDbGVyayBwdWJsaXNoYWJsZSBrZXkpIHwnLFxuICAgIC4uLihlMmVUZXN0aW5nID8gW1xuICAgICAgJ3wgYHdlYi9wbGF5d3JpZ2h0LmNvbmZpZy50c2AgfCBQbGF5d3JpZ2h0IGUyZSBjb25maWcg4oCUIHNlZSBgd2ViL2UyZS9SRUFETUUubWRgIHwnLFxuICAgICAgYHwgXFxgd2ViL2UyZS9cXGAgfCBQbGF5d3JpZ2h0IGUyZSBzdWl0ZSAoXFxgJHt0ZXN0RTJlQ29tbWFuZH1cXGApOyBhbHNvIHJ1biBpbiBDSSBhZ2FpbnN0IGVhY2ggUFIncyBkZXBsb3llZCBVUkwgfGAsXG4gICAgXSA6IFtdKSxcbiAgICAnJyxcbiAgICAnIyMjIEdpdEh1YiBBY3Rpb25zIFdvcmtmbG93cyAoYC5naXRodWIvd29ya2Zsb3dzL2ApJyxcbiAgICAnJyxcbiAgICAnfCBGaWxlIHwgVHJpZ2dlciB8JyxcbiAgICAnfC0tLS0tLXwtLS0tLS0tLS18JyxcbiAgICAnfCBgcHItZGVwbG95LnltbGAgfCBPbiBwdWxsIHJlcXVlc3Qgb3Blbi91cGRhdGUg4oCUIGRlcGxveXMgYSBwZXItUFIgZGV2IHN0YWNrIHwnLFxuICAgICd8IGBwci1jbGVhbnVwLnltbGAgfCBPbiBwdWxsIHJlcXVlc3QgY2xvc2Ug4oCUIHRlYXJzIGRvd24gdGhlIHBlci1QUiBkZXYgc3RhY2sgfCcsXG4gICAgJ3wgYHN0YWdpbmctZGVwbG95LnltbGAgfCBPbiBwdXNoIHRvIGBtYWluYCDigJQgZGVwbG95cyB0byBzdGFnaW5nIHwnLFxuICAgICd8IGBwcm9kdWN0aW9uLWRlcGxveS55bWxgIHwgTWFudWFsbHkgdHJpZ2dlcmVkIOKAlCBkZXBsb3lzIHRvIHByb2R1Y3Rpb24gfCcsXG4gICAgJycsXG4gICAgJy0tLScsXG4gICAgJycsXG4gICAgJyMjIEZpbGVzIFlvdSBDYW4gRWRpdCcsXG4gICAgJycsXG4gICAgJ1RoZXNlIGZpbGVzIGFyZSBnZW5lcmF0ZWQgb25jZSBhbmQgbmV2ZXIgb3ZlcndyaXR0ZW4gYnkgQmF0bWFuLiBNb2RpZnkgdGhlbSBmcmVlbHkuJyxcbiAgICAnJyxcbiAgICAnfCBGaWxlIHwgV2hhdCB0byBkbyB3aXRoIGl0IHwnLFxuICAgICd8LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfCcsXG4gICAgJ3wgYC5wcm9qZW5yYy50cyB8IFRoZSBtYWluIFByb2plbiBjb25maWd1cmF0aW9uIGZpbGUuIEFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIGZvciBlaXRoZXIgdGhlIEFQSSBvciB0aGUgV2ViIGZyb250ZW5kIG5lZWQgdG8gYmUgYWRkZWQgaGVyZSB8JyxcbiAgICAnfCBgc3JjL3N0YWNrcy9BcHBsaWNhdGlvblN0YWNrLnRzYCB8ICoqU3RhcnQgaGVyZS4qKiBBZGQgQ0RLIGNvbnN0cnVjdHMgdG8gYnVpbGQgeW91ciBpbmZyYXN0cnVjdHVyZSB8JyxcbiAgICAnfCBgc3JjL2FwaS9hcHAudHMgfCBUaGUgbWFpbiBtb25vbGl0aGljIEFQSSBSRVNUIHNlcnZlciBmaWxlLiBNYWluIGZpbGUgeW91IHNob3VsZCBiZSBtb2RpZnlpbmcgfCcsXG4gICAgJ3wgYHdlYi9zcmMvQXBwLnRzeGAgfCBCdWlsZCB5b3VyIFVJIGhlcmUgfCcsXG4gICAgJ3wgYHdlYi9zcmMvQXBwLmNzc2AgLyBgd2ViL3NyYy9pbmRleC5jc3NgIHwgU3R5bGUgeW91ciBhcHBsaWNhdGlvbiB8JyxcbiAgICAnfCBgd2ViL3NyYy9tYWluLnRzeGAgfCBBZGp1c3QgdG9wLWxldmVsIHByb3ZpZGVycyBvciByb3V0aW5nIHwnLFxuICAgICd8IGB3ZWIvc3JjL3NlcnZpY2VzL0FwaVNlcnZpY2UudHNgIC8gYHdlYi9zcmMvaGVscGVycy9gIHwgQWRkIEFQSSBzZXJ2aWNlIGhvb2tzIGFsb25nc2lkZSBgQXBpU2VydmljZS50c2AsIG9yIGFkanVzdCB0aGUgcmVxdWVzdCBoZWxwZXJzIHwnLFxuICAgICd8IGB3ZWIvcHVibGljL2NvbmZpZy5qc29uYCB8IFVwZGF0ZSBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgKEFQSSBVUkwsIENsZXJrIGtleSkgfCcsXG4gICAgLi4uKGUyZVRlc3RpbmcgPyBbXG4gICAgICAnfCBgd2ViL3BsYXl3cmlnaHQuY29uZmlnLnRzYCAvIGB3ZWIvZTJlL2AgfCBQbGF5d3JpZ2h0IGUyZSBzdWl0ZSDigJQgZXh0ZW5kIGl0IHdpdGggcmVhbCBmbG93czsgc2VlIGB3ZWIvZTJlL1JFQURNRS5tZGAgfCcsXG4gICAgXSA6IFtdKSxcbiAgICAnJyxcbiAgICAnIyMgRmlsZXMgWW91IENhbm5vdCBFZGl0JyxcbiAgICAnJyxcbiAgICAnVGhlc2UgZmlsZXMgYXJlICoqbWFuYWdlZCBieSBCYXRtYW4qKiBhbmQgd2lsbCBiZSBvdmVyd3JpdHRlbiBldmVyeSB0aW1lIGBucHggcHJvamVuYCBydW5zLiBEbyBub3QgZWRpdCB0aGVtIGRpcmVjdGx5IOKAlCBtYWtlIGNoYW5nZXMgaW4gYC5wcm9qZW5yYy50c2AgaW5zdGVhZC4nLFxuICAgICcnLFxuICAgICc+IFshSU1QT1JUQU5UXScsXG4gICAgJz4gSWYgeW91IGhhdmUgQU5ZIGNoYW5nZXMgeW91IHdhbnQgdG8gbWFrZSB0byB0aGVzZSBmaWxlcywgbm90aWZ5ICN0ZWFtLWJhdG1hbiBvbiBTbGFjay4gJyxcbiAgICAnPiBXZSBtYWludGFpbiB0aGVzZSBmaWxlcyBhcyBwYXJ0IG9mIHRoZSBjb3JlIEJhdG1hbiBleHBlcmllbmNlLCBhbmQgeW91ciBmZWVkYmFjayBpcyBjcnVjaWFsIHRvIGVuc3VyZSB0aGV5IG1lZXQgeW91ciBuZWVkcy4nLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBXaHkgaXRcXCdzIG1hbmFnZWQgfCcsXG4gICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18JyxcbiAgICAnfCBgc3JjL3N0YWNrcy9CYXNlQXBwbGljYXRpb25TdGFjay50c2AgfCBDb3JlIHN0YWNrIHdpcmluZyDigJQgdXBkYXRlZCB3aXRoIEJhdG1hbiByZWxlYXNlcyB8JyxcbiAgICAnfCBgc3JjL2FzcGVjdHMvRGF0YURvZ0FzcGVjdC50c2AgfCBEYXRhZG9nIENESyBhc3BlY3QgfCcsXG4gICAgJ3wgYHdlYi92aXRlLmNvbmZpZy50c2AgfCBWaXRlIGNvbmZpZ3VyYXRpb24gfCcsXG4gICAgJ3wgYHdlYi9lc2xpbnQuY29uZmlnLmpzYCB8IEVTTGludCBjb25maWd1cmF0aW9uIHwnLFxuICAgICd8IGB3ZWIvcG9zdGNzcy5jb25maWcuanNgIHwgUG9zdENTUyAvIFRhaWx3aW5kIGNvbmZpZ3VyYXRpb24gfCcsXG4gICAgJ3wgYHdlYi9pbmRleC5odG1sYCB8IEhUTUwgZW50cnkgcG9pbnQgfCcsXG4gICAgJ3wgYHdlYi90c2NvbmZpZy5qc29uYCAvIGB3ZWIvdHNjb25maWcuYXBwLmpzb25gIC8gYHdlYi90c2NvbmZpZy5ub2RlLmpzb25gIHwgVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIHwnLFxuICAgICd8IGB3ZWIvc3JjL3ZpdGUtZW52LmQudHNgIHwgVml0ZSB0eXBlIGRlY2xhcmF0aW9ucyB8JyxcbiAgICAnfCBgd2ViL3NyYy9jb25maWcudHNgIHwgUnVudGltZSBjb25maWcgaG9vayDigJQgc2hhcGUgZHJpdmVuIGJ5IGAucHJvamVucmMudHNgIHwnLFxuICAgICd8IGAuZ2l0aHViL0NPREVPV05FUlNgIHwgQ29kZSBvd25lcnNoaXAgcG9saWN5IHwnLFxuICAgICd8IGAuZ2l0aHViL3dvcmtmbG93cy8qLnltbGAgfCBBbGwgQ0kvQ0Qgd29ya2Zsb3dzIHwnLFxuICAgICd8IGBhcmNoaXRlY3R1cmUtcnVsZXMvY2hlY2sudHNgLCBgdHNjb25maWcuanNvbmAsIGBSRUFETUUubWRgIHwgQXJjaGl0ZWN0dXJlIHJ1bGUgZW5naW5lIHwnLFxuICAgICd8IGBhdHRlc3RhdGlvbi9tYW5pZmVzdC50c2AsIGB2ZXJpZnkudHNgLCBgdHNjb25maWcuanNvbmAgfCBQUiBhdHRlc3RhdGlvbiBtZWNoYW5pc20gfCcsXG4gICAgJ3wgYG9wZW5zcGVjLWdhdGVzL2NoZWNrLXRhc2tzLWNvbXBsZXRlLnRzYCwgYHRzY29uZmlnLmpzb25gIHwgT3BlblNwZWMgdGFzay1jb21wbGV0aW9uIGdhdGUgfCcsXG4gICAgJ3wgYHN3YW1wLWJvb3RzdHJhcC9wdWxsLWV4dGVuc2lvbnMudHNgLCBgdHNjb25maWcuanNvbmAgfCBQdWxscyBzd2FtcCBleHRlbnNpb25zIGF0IHRoZWlyIHBpbm5lZCB2ZXJzaW9ucyB8JyxcbiAgICAnfCBgd29ya2Zsb3dzL3dvcmtmbG93LSoueWFtbGAgfCBTd2FtcCB3b3JrZmxvd3MgdGhlIHNvZnR3YXJlIGZhY3RvcnkgcnVucyB8JyxcbiAgICAnJyxcbiAgICAnPiAqKlRpcDoqKiBGaWxlcyB3aXRoIGEgYH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi4gfn5gIGhlYWRlciBhcmUgbWFuYWdlZCBmaWxlcy4nLFxuICAgICcnLFxuICAgICcjIyMgU29mdHdhcmUgRmFjdG9yeSAoYG1vZGVscy9gLCBgYXJjaGl0ZWN0dXJlLXJ1bGVzL3J1bGVzLmpzb25gKScsXG4gICAgJycsXG4gICAgJ0JhdG1hbiBhbHNvIHNlZWRzIGEgW3N3YW1wXShodHRwczovL2dpdGh1Yi5jb20vc3dhbXAtY2x1Yi9zd2FtcCkgc29mdHdhcmUnLFxuICAgICdmYWN0b3J5IOKAlCBhIGBAc3dhbXAvc29mdHdhcmUtZmFjdG9yeWAgc3RhdGUgbWFjaGluZSB0aGF0IGRyaXZlcyBhIEdpdEh1YicsXG4gICAgJ2lzc3VlIHRocm91Z2ggaW50YWtlLCBPcGVuU3BlYyBwbGFubmluZywgaW1wbGVtZW50YXRpb24sIHByZS1QUicsXG4gICAgJ3ZlcmlmaWNhdGlvbiwgYW5kIGFuIG9wZW5lZCBQUi4gVGhlIHNlZWQgZmlsZXMgdW5kZXIgYG1vZGVscy8qKi8qLnlhbWxgIGFuZCcsXG4gICAgJ2BhcmNoaXRlY3R1cmUtcnVsZXMvcnVsZXMuanNvbmAgYXJlIGdlbmVyYXRlZCBvbmNlIChsaWtlIHRoZSBmaWxlcyBpbicsXG4gICAgJ1wiRmlsZXMgWW91IENhbiBFZGl0XCIgYWJvdmUpIOKAlCB0dW5lIHRoZSBmYWN0b3J5XFwncyBzdGFnZXMvZ2F0ZXMgb3IgYWRkIHlvdXInLFxuICAgICdvd24gYXJjaGl0ZWN0dXJlIHJ1bGVzIGRpcmVjdGx5IGluIHRob3NlIGZpbGVzLicsXG4gICAgJycsXG4gICAgJ2Bzd2FtcCBpbml0YCBydW5zIGF1dG9tYXRpY2FsbHkgYXMgcGFydCBvZiBgaW5zdGFsbGAvYGluc3RhbGw6Y2lgIChhIHNpbGVudCcsXG4gICAgJ25vLW9wIGlmIGBzd2FtcGAgaXNuXFwndCBvbiBQQVRILCBlLmcuIGluIENJKSwgc28gdGhlIHJlcG8gc3RheXMgaW5pdGlhbGl6ZWQnLFxuICAgICd3aXRob3V0IGEgc2VwYXJhdGUgc3RlcC4nLFxuICAgICcnLFxuICAgICdgc3dhbXBWZXJzaW9uYCBpbiBgLnN3YW1wLnlhbWxgIGlzIHRoZSBtaW5pbXVtIHN3YW1wIENMSSB0aGUgcmVwbyBuZWVkczogdGhlJyxcbiAgICAndmVyc2lvbiBpdCB3YXMgbGFzdCB1cGdyYWRlZCB3aXRoLiBzd2FtcCBkb2VzblxcJ3Qga2VlcCBvbGQgYnVpbGRzLCBzbyBpbnN0YWxsJyxcbiAgICAndGhlIGN1cnJlbnQgYHN0YWJsZWAgcmVsZWFzZSByYXRoZXIgdGhhbiB0aGF0IGV4YWN0IHZlcnNpb246JyxcbiAgICAnJyxcbiAgICAnYGBgYmFzaCcsXG4gICAgJyMgbWFjT1MgLyBMaW51eCcsXG4gICAgJ2N1cmwgLWZzU0wgaHR0cHM6Ly9zd2FtcC5jbHViL2luc3RhbGwuc2ggfCBzaCcsXG4gICAgJycsXG4gICAgJyMgV2luZG93cyAoUG93ZXJTaGVsbCknLFxuICAgICdpcm0gaHR0cHM6Ly9zd2FtcC5jbHViL2luc3RhbGwucHMxIHwgaWV4JyxcbiAgICAnYGBgJyxcbiAgICAnJyxcbiAgICAnT25lLXRpbWUgc2V0dXAgYmV5b25kIHRoYXQsIGFmdGVyIHlvdXIgZmlyc3QgYG5weCBwcm9qZW5gOicsXG4gICAgJycsXG4gICAgJ2BgYGJhc2gnLFxuICAgICcjIFB1bGxzIGVhY2ggZXh0ZW5zaW9uIGF0IHRoZSB2ZXJzaW9uIHBpbm5lZCBpbicsXG4gICAgJyMgZXh0ZW5zaW9ucy9tb2RlbHMvdXBzdHJlYW1fZXh0ZW5zaW9ucy5qc29uIChvciB0aGUgbGF0ZXN0JyxcbiAgICAnIyBzb2Z0d2FyZS1mYWN0b3J5L2dpdGh1YiBleHRlbnNpb25zIGluIGEgcmVwbyB3aXRoIG5vIGxvY2tmaWxlIHlldCksJyxcbiAgICAnIyByZXN0b3JlcyB0aGUgbG9ja2ZpbGUgYW5kIGNvbW1pdHRlZCBza2lsbCBmaWxlcyBmcm9tIGdpdCwgYW5kIGNyZWF0ZXMgdGhlJyxcbiAgICAnIyByZXBvXFwncyBzZWNyZXRzIHZhdWx0JyxcbiAgICAnbnB4IHByb2plbiBzd2FtcDpib290c3RyYXAnLFxuICAgICcnLFxuICAgICcjIFRoZW4gc3RvcmUgYSBHaXRIdWIgdG9rZW4gdGhlIGZhY3RvcnkgY2FuIG9wZW4gUFJzIHdpdGgnLFxuICAgICdzd2FtcCB2YXVsdCBwdXQgPHJlcG8+LXNlY3JldHMgR0lUSFVCX1RPS0VOIC0tcmVmcmVzaC1mcm9tIFwiZ2ggYXV0aCB0b2tlblwiJyxcbiAgICAnYGBgJyxcbiAgICAnJyxcbiAgICAnLS0tJyxcbiAgICAnJyxcbiAgICAnIyMgV2hlcmUgdG8gU3RhcnQnLFxuICAgICcnLFxuICAgICcxLiAqKmBzcmMvc3RhY2tzL0FwcGxpY2F0aW9uU3RhY2sudHNgKiog4oCUIEFkZCB5b3VyIENESyBjb25zdHJ1Y3RzIGhlcmUuIFRoZSBiYXNlIHN0YWNrIGFscmVhZHkgcHJvdmlkZXMgYHRoaXMuYXBpYCwgYHRoaXMuaG9zdGVkWm9uZWAsIGB0aGlzLmRhdGFkb2dgLCBhbmQgKHdoZW4gdGhlIHN0YWNrIGNyZWF0ZXMgb25lKSBgdGhpcy52cGNgIGFzIHByb3RlY3RlZCBwcm9wZXJ0aWVzLicsXG4gICAgJycsXG4gICAgJzIuICoqYHdlYi9gKiog4oCUIEJ1aWxkIHlvdXIgZnJvbnRlbmQuIFN0YXJ0IHdpdGggYHdlYi9zcmMvQXBwLnRzeGAgYW5kIGFkZCBzZXJ2aWNlcyBhbG9uZ3NpZGUgYHdlYi9zcmMvc2VydmljZXMvQXBpU2VydmljZS50c2AuJyxcbiAgICAnJyxcbiAgICAnMy4gKipgc3JjL2FwaS9hcHAudHNgKiog4oCUIEltcGxlbWVudCB5b3VyIGJhY2tlbmQgTGFtYmRhIGhhbmRsZXIgbG9naWMgaGVyZS4nLFxuICAgICcnLFxuICAgICc0LiAqKmAucHJvamVucmMudHNgKiogLSBNYW5hZ2VzIHByb2plY3QgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9uLiBSdW4gYG5weCBwcm9qZW5gIGFmdGVyIG1ha2luZyBhbnkgY2hhbmdlcyB0byB0aGlzIGZpbGUuJyxcbiAgICAnLS0tJyxcbiAgICAnJyxcbiAgICAnIyMgRGV2ZWxvcG1lbnQgV29ya2Zsb3cnLFxuICAgICcnLFxuICAgICdgYGBiYXNoJyxcbiAgICAnIyBJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgJ3lhcm4gaW5zdGFsbCcsXG4gICAgJycsXG4gICAgJyMgU3RhcnQgbG9jYWwgZGV2IHNlcnZlciAoYmFja2VuZCBMYW1iZGEgKyBWaXRlIGZyb250ZW5kIGluIHBhcmFsbGVsKScsXG4gICAgJ3lhcm4gZGV2JyxcbiAgICAnJyxcbiAgICAnIyBEZXBsb3kgYSBwZXJzb25hbCBkZXYgc3RhY2sgdG8gQVdTIGFzIGFuIGFsdGVybmF0aXZlIHRvIGxvY2FsIGRldmVsb3BtZW50LCBwcm92aWRlcyBtb3JlIHRob3JvdWdoIGVuZC10by1lbmQgdGVzdGluZycsXG4gICAgJ3lhcm4gY2RrOmRldiAtLWNvbnRleHQgbG9jYWwtZGV2LXByZWZpeD15b3VyLWhhbmRsZSBkZXBsb3knLFxuICAgICcnLFxuICAgICcjIFJlZGVwbG95IHlvdXIgcGVyc29uYWwgZGV2IHN0YWNrIGZhc3Q6IGFmdGVyIHRoZSBmaXJzdCBkZXBsb3kgYWJvdmUsIGtlZXAnLFxuICAgIFwiIyByZXVzaW5nIHRoZSBzYW1lIHN0YWNrIChkb24ndCBkZWxldGUgaXQgYmV0d2VlbiBicmFuY2hlcykgYW5kIGl0ZXJhdGUgd2l0aFwiLFxuICAgICcjIGhvdHN3YXAtZmFsbGJhY2sgaW5zdGVhZCBvZiBhIGZ1bGwgQ2xvdWRGb3JtYXRpb24gZGVwbG95bWVudCcsXG4gICAgJ3lhcm4gY2RrOmRldjpob3Rzd2FwIC0tY29udGV4dCBsb2NhbC1kZXYtcHJlZml4PXlvdXItaGFuZGxlJyxcbiAgICAnJyxcbiAgICAnIyBSdW4gdGVzdHMnLFxuICAgICd5YXJuIHRlc3QnLFxuICAgICcnLFxuICAgICcjIFJlLXN5bnRoZXNpemUgcHJvamVjdCBmaWxlcyBhZnRlciBlZGl0aW5nIC5wcm9qZW5yYy50cycsXG4gICAgJ25weCBwcm9qZW4nLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICc+IFshSU1QT1JUQU5UXScsXG4gICAgJz4gYC0taG90c3dhcC1mYWxsYmFja2AgKHVzZWQgYnkgYGNkazpkZXY6aG90c3dhcGAgYW5kIHRoZSBgd2F0Y2hgIHRhc2spIGlzIGZvcicsXG4gICAgJz4gcGVyc29uYWwgZGV2IHN0YWNrcyBvbmx5IOKAlCBuZXZlciBydW4gaXQgYWdhaW5zdCBzdGFnaW5nIG9yIHByb2QuJyxcbiAgICAnJyxcbiAgICAnLS0tJyxcbiAgICAnJyxcbiAgICAnIyMgVXBncmFkaW5nIEJhdG1hbicsXG4gICAgJycsXG4gICAgJ2BgYGJhc2gnLFxuICAgICd5YXJuIGFkZCBAbWFjZWRvbi10ZWNobm9sb2dpZXMvYmF0bWFuQGxhdGVzdCcsXG4gICAgJ25weCBwcm9qZW4nLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICdUaGlzIHVwZGF0ZXMgYWxsIG1hbmFnZWQgZmlsZXMgdG8gdGhlIGxhdGVzdCBCYXRtYW4gc3RhbmRhcmRzLiBZb3VyIGVkaXRhYmxlIHNhbXBsZSBmaWxlcyBhcmUgbmV2ZXIgdG91Y2hlZC4nLFxuICBdLmpvaW4oJ1xcbicpO1xufVxuIl19
package/package.json CHANGED
@@ -49,7 +49,7 @@
49
49
  "main": "lib/index.js",
50
50
  "license": "Apache-2.0",
51
51
  "stability": "stable",
52
- "version": "1.28.0",
52
+ "version": "1.30.0",
53
53
  "jest": {
54
54
  "coverageProvider": "v8",
55
55
  "testMatch": [
@@ -1,6 +0,0 @@
1
- import { Component } from 'projen';
2
- import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
3
- export declare class WorkflowAutoDiscover extends Component {
4
- constructor(project: AwsCdkTypeScriptApp);
5
- synthesize(): void;
6
- }
@@ -1,104 +0,0 @@
1
- "use strict";
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
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.WorkflowAutoDiscover = void 0;
37
- const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
- const fs = __importStar(require("fs"));
39
- const path = __importStar(require("path"));
40
- const projen_1 = require("projen");
41
- class WorkflowAutoDiscover extends projen_1.Component {
42
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.WorkflowAutoDiscover", version: "1.28.0" };
43
- constructor(project) {
44
- super(project);
45
- }
46
- synthesize() {
47
- super.synthesize();
48
- const workflowsDir = path.join(this.project.outdir, 'src/workflows');
49
- let workflowFiles = [];
50
- if (fs.existsSync(workflowsDir)) {
51
- workflowFiles = fs.readdirSync(workflowsDir)
52
- .filter(f => f.endsWith('.json'))
53
- .sort();
54
- }
55
- const constructsDir = path.join(this.project.outdir, 'src/constructs');
56
- fs.mkdirSync(constructsDir, { recursive: true });
57
- for (const file of workflowFiles) {
58
- const baseName = file.replace(/\.json$/, '');
59
- const className = toClassName(baseName);
60
- const content = generateWorkflowFile(className, file);
61
- fs.writeFileSync(path.join(constructsDir, `${className}.ts`), content);
62
- }
63
- }
64
- }
65
- exports.WorkflowAutoDiscover = WorkflowAutoDiscover;
66
- function generateWorkflowFile(className, workflowJsonName) {
67
- return [
68
- '// ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen".',
69
- "import { join } from 'path';",
70
- "import { ISecret } from 'aws-cdk-lib/aws-secretsmanager';",
71
- "import { Construct } from 'constructs';",
72
- "import { Replacement, WorkflowProvider } from './WorkflowProvider';",
73
- '',
74
- `export interface ${className}Props {`,
75
- ' readonly secret: ISecret;',
76
- ' readonly replacements?: Replacement[];',
77
- '}',
78
- '',
79
- `export class ${className} extends WorkflowProvider {`,
80
- ` constructor(scope: Construct, id: string, props: ${className}Props) {`,
81
- ' super(scope, id, {',
82
- ` workflowFilePath: join(__dirname, '../workflows/${workflowJsonName}'),`,
83
- ' secret: props.secret,',
84
- ' replacements: props.replacements,',
85
- ' });',
86
- ' }',
87
- '}',
88
- '',
89
- ].join('\n');
90
- }
91
- function toPascalCase(str) {
92
- return str
93
- .split(/[-_\s]+/)
94
- .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
95
- .join('');
96
- }
97
- function toClassName(baseName) {
98
- const pascal = toPascalCase(baseName);
99
- if (pascal.toLowerCase().endsWith('workflow')) {
100
- return pascal.slice(0, -8) + 'Workflow';
101
- }
102
- return pascal + 'Workflow';
103
- }
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2Zsb3dBdXRvRGlzY292ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvV29ya2Zsb3dBdXRvRGlzY292ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsbUNBQW1DO0FBR25DLE1BQWEsb0JBQXFCLFNBQVEsa0JBQVM7O0lBQ2pELFlBQVksT0FBNEI7UUFDdEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxVQUFVO1FBQ1IsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRW5CLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDckUsSUFBSSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBRWpDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2hDLGFBQWEsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztpQkFDekMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDaEMsSUFBSSxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZFLEVBQUUsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFakQsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3QyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RELEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxTQUFTLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDOztBQTFCSCxvREEyQkM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLFNBQWlCLEVBQUUsZ0JBQXdCO0lBQ3ZFLE9BQU87UUFDTCwrRUFBK0U7UUFDL0UsOEJBQThCO1FBQzlCLDJEQUEyRDtRQUMzRCx5Q0FBeUM7UUFDekMscUVBQXFFO1FBQ3JFLEVBQUU7UUFDRixvQkFBb0IsU0FBUyxTQUFTO1FBQ3RDLDZCQUE2QjtRQUM3QiwwQ0FBMEM7UUFDMUMsR0FBRztRQUNILEVBQUU7UUFDRixnQkFBZ0IsU0FBUyw2QkFBNkI7UUFDdEQsc0RBQXNELFNBQVMsVUFBVTtRQUN6RSx3QkFBd0I7UUFDeEIseURBQXlELGdCQUFnQixLQUFLO1FBQzlFLDZCQUE2QjtRQUM3Qix5Q0FBeUM7UUFDekMsU0FBUztRQUNULEtBQUs7UUFDTCxHQUFHO1FBQ0gsRUFBRTtLQUNILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEdBQVc7SUFDL0IsT0FBTyxHQUFHO1NBQ1AsS0FBSyxDQUFDLFNBQVMsQ0FBQztTQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdkUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLFFBQWdCO0lBQ25DLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLE1BQU0sR0FBRyxVQUFVLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93QXV0b0Rpc2NvdmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuICB9XG5cbiAgc3ludGhlc2l6ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5zeW50aGVzaXplKCk7XG5cbiAgICBjb25zdCB3b3JrZmxvd3NEaXIgPSBwYXRoLmpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgJ3NyYy93b3JrZmxvd3MnKTtcbiAgICBsZXQgd29ya2Zsb3dGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtmbG93c0RpcikpIHtcbiAgICAgIHdvcmtmbG93RmlsZXMgPSBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NEaXIpXG4gICAgICAgIC5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKCcuanNvbicpKVxuICAgICAgICAuc29ydCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnN0cnVjdHNEaXIgPSBwYXRoLmpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgJ3NyYy9jb25zdHJ1Y3RzJyk7XG4gICAgZnMubWtkaXJTeW5jKGNvbnN0cnVjdHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHdvcmtmbG93RmlsZXMpIHtcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZmlsZS5yZXBsYWNlKC9cXC5qc29uJC8sICcnKTtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRvQ2xhc3NOYW1lKGJhc2VOYW1lKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZVdvcmtmbG93RmlsZShjbGFzc05hbWUsIGZpbGUpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oY29uc3RydWN0c0RpciwgYCR7Y2xhc3NOYW1lfS50c2ApLCBjb250ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd0ZpbGUoY2xhc3NOYW1lOiBzdHJpbmcsIHdvcmtmbG93SnNvbk5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBbXG4gICAgJy8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi4nLFxuICAgIFwiaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1wiLFxuICAgIFwiaW1wb3J0IHsgSVNlY3JldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XCIsXG4gICAgXCJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcIixcbiAgICBcImltcG9ydCB7IFJlcGxhY2VtZW50LCBXb3JrZmxvd1Byb3ZpZGVyIH0gZnJvbSAnLi9Xb3JrZmxvd1Byb3ZpZGVyJztcIixcbiAgICAnJyxcbiAgICBgZXhwb3J0IGludGVyZmFjZSAke2NsYXNzTmFtZX1Qcm9wcyB7YCxcbiAgICAnICByZWFkb25seSBzZWNyZXQ6IElTZWNyZXQ7JyxcbiAgICAnICByZWFkb25seSByZXBsYWNlbWVudHM/OiBSZXBsYWNlbWVudFtdOycsXG4gICAgJ30nLFxuICAgICcnLFxuICAgIGBleHBvcnQgY2xhc3MgJHtjbGFzc05hbWV9IGV4dGVuZHMgV29ya2Zsb3dQcm92aWRlciB7YCxcbiAgICBgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogJHtjbGFzc05hbWV9UHJvcHMpIHtgLFxuICAgICcgICAgc3VwZXIoc2NvcGUsIGlkLCB7JyxcbiAgICBgICAgICAgd29ya2Zsb3dGaWxlUGF0aDogam9pbihfX2Rpcm5hbWUsICcuLi93b3JrZmxvd3MvJHt3b3JrZmxvd0pzb25OYW1lfScpLGAsXG4gICAgJyAgICAgIHNlY3JldDogcHJvcHMuc2VjcmV0LCcsXG4gICAgJyAgICAgIHJlcGxhY2VtZW50czogcHJvcHMucmVwbGFjZW1lbnRzLCcsXG4gICAgJyAgICB9KTsnLFxuICAgICcgIH0nLFxuICAgICd9JyxcbiAgICAnJyxcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gdG9QYXNjYWxDYXNlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0clxuICAgIC5zcGxpdCgvWy1fXFxzXSsvKVxuICAgIC5tYXAod29yZCA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKVxuICAgIC5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gdG9DbGFzc05hbWUoYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhc2NhbCA9IHRvUGFzY2FsQ2FzZShiYXNlTmFtZSk7XG4gIGlmIChwYXNjYWwudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnd29ya2Zsb3cnKSkge1xuICAgIHJldHVybiBwYXNjYWwuc2xpY2UoMCwgLTgpICsgJ1dvcmtmbG93JztcbiAgfVxuICByZXR1cm4gcGFzY2FsICsgJ1dvcmtmbG93Jztcbn1cbiJdfQ==
@@ -1,5 +0,0 @@
1
- import { TextFile } from 'projen';
2
- import { AwsCdkTypeScriptApp } from 'projen/lib/awscdk';
3
- export declare class WorkflowProviderFile extends TextFile {
4
- constructor(project: AwsCdkTypeScriptApp);
5
- }
@@ -1,308 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WorkflowProviderFile = void 0;
4
- const projen_1 = require("projen");
5
- class WorkflowProviderFile extends projen_1.TextFile {
6
- constructor(project) {
7
- super(project, 'src/constructs/WorkflowProvider.ts', {
8
- marker: true,
9
- readonly: true,
10
- lines: [
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
- '}',
37
- '',
38
- 'export interface WorkflowProviderProps {',
39
- ' /**',
40
- ' * The full path to the workflow .JSON file you want to add.',
41
- ' */',
42
- ' readonly workflowFilePath: string;',
43
- '',
44
- ' /**',
45
- ' * An AWS Secret that has the following JSON structure:',
46
- ' * {',
47
- ' * "url": "https://your-n8n-instance.com",',
48
- ' * "apiKey": "your-n8n-api-key"',
49
- ' * }',
50
- ' */',
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[];',
58
- '}',
59
- '',
60
- 'export class WorkflowProvider extends Construct {',
61
- ' public handler: Function;',
62
- ' public webhookPath: Reference;',
63
- '',
64
- ' constructor(scope: Construct, id: string, props: WorkflowProviderProps) {',
65
- ' super(scope, id);',
66
- '',
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
- ' }',
79
- '',
80
- '',
81
- " const lambda = this.handler = new Function(this, 'Handler', {",
82
- ' runtime: Runtime.NODEJS_24_X,',
83
- " handler: 'index.handler',",
84
- ' timeout: Duration.minutes(5),',
85
- ' code: Code.fromInline(`',
86
- "const { SecretsManagerClient, GetSecretValueCommand } = require('@aws-sdk/client-secrets-manager');",
87
- '',
88
- 'exports.handler = async (event) => {',
89
- " console.log('Event:', JSON.stringify(event, null, 2));",
90
- ' ',
91
- " if (event.RequestType === 'Delete') {",
92
- " return { PhysicalResourceId: event.PhysicalResourceId || 'workflow-uploader' };",
93
- ' }',
94
- '',
95
- ' try {',
96
- ' // Get secret',
97
- ' const secretsClient = new SecretsManagerClient({});',
98
- ' const secretCommand = new GetSecretValueCommand({ SecretId: process.env.SECRET_ARN });',
99
- ' const secretResponse = await secretsClient.send(secretCommand);',
100
- ' ',
101
- ' const secret = JSON.parse(secretResponse.SecretString);',
102
- ' const { url, apiKey } = secret;',
103
- ' ',
104
- ' const workflowContent = event.ResourceProperties.Content;',
105
- ' const { name, nodes, connections, settings } = JSON.parse(workflowContent);',
106
- ' const workflowData = {',
107
- ' name,',
108
- ' nodes,',
109
- ' connections,',
110
- ' settings,',
111
- ' };',
112
- ' delete workflowData.settings.binaryMode;',
113
- '',
114
- ' const headers = {',
115
- " 'Content-Type': 'application/json',",
116
- " 'X-N8N-API-KEY': apiKey,",
117
- ' };',
118
- ' ',
119
- ' let workflowId = event.PhysicalResourceId;',
120
- ' let isUpdate = false;',
121
- ' ',
122
- ' // Try to get existing workflow if we have a physicalResourceId',
123
- " if (workflowId && workflowId !== 'workflow-uploader') {",
124
- ' try {',
125
- ' const getResponse = await fetch(\\`\\${url}/api/v1/workflows/\\${workflowId}\\`, {',
126
- " method: 'GET',",
127
- ' headers,',
128
- ' });',
129
- ' ',
130
- ' if (getResponse.ok) {',
131
- ' isUpdate = true;',
132
- " console.log('Found existing workflow, will update');",
133
- ' }',
134
- ' } catch (error) {',
135
- " console.log('Workflow not found, will create new one');",
136
- ' }',
137
- ' }',
138
- ' ',
139
- ' let result;',
140
- ' if (isUpdate) {',
141
- ' // Update existing workflow',
142
- ' const updateResponse = await fetch(\\`\\${url}/api/v1/workflows/\\${workflowId}\\`, {',
143
- " method: 'PUT',",
144
- ' headers,',
145
- ' body: JSON.stringify(workflowData),',
146
- ' });',
147
- ' ',
148
- ' if (!updateResponse.ok) {',
149
- ' throw new Error(\\`Update failed: \\${updateResponse.status} \\${updateResponse.statusText}\\`);',
150
- ' }',
151
- ' ',
152
- ' result = await updateResponse.json();',
153
- " console.log('Workflow updated successfully');",
154
- ' } else {',
155
- ' // Create new workflow',
156
- ' const createResponse = await fetch(\\`\\${url}/api/v1/workflows\\`, {',
157
- " method: 'POST',",
158
- ' headers,',
159
- ' body: JSON.stringify(workflowData),',
160
- ' });',
161
- ' ',
162
- ' if (!createResponse.ok) {',
163
- ' let result = {};',
164
- ' if (createResponse.status === 400) {',
165
- ' result = await createResponse.json(); ',
166
- ' }',
167
- ' throw new Error(\\`Create failed: \\${createResponse.status} \\${createResponse.statusText} \\${JSON.stringify(result)} \\`);',
168
- ' }',
169
- ' ',
170
- ' result = await createResponse.json();',
171
- ' ',
172
- ' ',
173
- ' workflowId = result.id;',
174
- " console.log('Workflow created successfully');",
175
- ' }',
176
- ' ',
177
- ' // Activate the workflow',
178
- ' const activateResponse = await fetch(\\`\\${url}/api/v1/workflows/\\${workflowId}/activate\\`, {',
179
- " method: 'POST',",
180
- ' headers,',
181
- ' });',
182
- ' ',
183
- ' if (!activateResponse.ok) {',
184
- ' let result = {};',
185
- ' if (activateResponse.status === 400) {',
186
- ' result = await activateResponse.json();',
187
- ' }',
188
- ' console.warn(\\`Activation failed: \\${activateResponse.status} \\${activateResponse.statusText}\\\\ \\${JSON.stringify(result)} \\`);',
189
- ' } else {',
190
- " console.log('Workflow activated successfully');",
191
- ' }',
192
- '',
193
- ' // Fetch the workflow to extract webhook path',
194
- " let webhookPath = \\'\\';",
195
- ' const getWorkflowResponse = await fetch(\\`\\${url}/api/v1/workflows/\\${workflowId}\\`, {',
196
- " method: 'GET',",
197
- ' headers,',
198
- ' });',
199
- '',
200
- ' if (getWorkflowResponse.ok) {',
201
- ' const workflow = await getWorkflowResponse.json();',
202
- " const webhookNode = (workflow.nodes || []).find(n => n.type === 'n8n-nodes-base.webhook');",
203
- ' if (webhookNode && webhookNode.parameters && webhookNode.parameters.path) {',
204
- ' webhookPath = webhookNode.parameters.path;',
205
- ' console.log(\\`Found webhook path: \\${webhookPath}\\`);',
206
- ' }',
207
- ' }',
208
- '',
209
- ' return {',
210
- ' PhysicalResourceId: workflowId,',
211
- ' Data: { WorkflowId: workflowId, WebhookPath: webhookPath }',
212
- ' };',
213
- ' } catch (error) {',
214
- " console.error('Error:', error);",
215
- ' return {',
216
- " PhysicalResourceId: event.PhysicalResourceId || 'workflow-uploader',",
217
- " Data: { Error: String(error), WebhookPath: 'unavailable' }",
218
- ' };',
219
- ' }',
220
- '};',
221
- ' `),',
222
- ' environment: {',
223
- ' SECRET_ARN: props.secret.secretArn,',
224
- ' },',
225
- ' });',
226
- '',
227
- ' props.secret.grantRead(lambda);',
228
- '',
229
- '',
230
- ' // Grant KMS decrypt permissions for the secret',
231
- ' if (props.secret.encryptionKey) {',
232
- " console.log('encryption key found, granting decrypt permissions');",
233
- ' props.secret.encryptionKey.grantDecrypt(lambda);',
234
- '',
235
- ' } else {',
236
- ' lambda.role?.addToPrincipalPolicy(new PolicyStatement({',
237
- ' effect: Effect.ALLOW,',
238
- ' actions: [',
239
- " 'kms:Decrypt',",
240
- " 'kms:DescribeKey',",
241
- ' ],',
242
- ' resources: [Arn.format({',
243
- " service: 'kms',",
244
- " resource: 'key',",
245
- " resourceName: 'a699f853-0475-4d4d-b8ab-be881d66624f',",
246
- " partition: 'aws',",
247
- ' region: Stack.of(this).region,',
248
- " account: '581514672367',",
249
- '',
250
- ' })],',
251
- ' }));',
252
- ' }',
253
- '',
254
- " const provider = new Provider(this, 'Provider', {",
255
- ' onEventHandler: lambda,',
256
- ' });',
257
- '',
258
- " const customResource = new CustomResource(this, 'Resource', {",
259
- ' serviceToken: provider.serviceToken,',
260
- ' properties: {',
261
- ' Content: newContents,',
262
- ' },',
263
- ' });',
264
- '',
265
- " this.webhookPath = customResource.getAtt('WebhookPath');",
266
- '',
267
- ' // Output the Lambda execution role ARN for cross-account KMS permissions',
268
- " new CfnOutput(this, 'LambdaExecutionRoleArn', {",
269
- ' value: lambda.role!.roleArn,',
270
- " description: 'Lambda execution role ARN - add this to KMS key policy in other account',",
271
- ' });',
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;',
301
- '}',
302
- '',
303
- ],
304
- });
305
- }
306
- }
307
- exports.WorkflowProviderFile = WorkflowProviderFile;
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2Zsb3dQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Xb3JrZmxvd1Byb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFrQztBQUdsQyxNQUFhLG9CQUFxQixTQUFRLGlCQUFRO0lBQ2hELFlBQVksT0FBNEI7UUFDdEMsS0FBSyxDQUFDLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRTtZQUNuRCxNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFO2dCQUNMLG9DQUFvQztnQkFDcEMsOEJBQThCO2dCQUM5QiwyRkFBMkY7Z0JBQzNGLGdFQUFnRTtnQkFDaEUsbUVBQW1FO2dCQUNuRSwyREFBMkQ7Z0JBQzNELDBEQUEwRDtnQkFDMUQseUNBQXlDO2dCQUN6QywyQ0FBMkM7Z0JBQzNDLEVBQUU7Z0JBQ0YsZ0NBQWdDO2dCQUNoQyxPQUFPO2dCQUNQLDJFQUEyRTtnQkFDM0UsT0FBTztnQkFDUCw4QkFBOEI7Z0JBQzlCLEVBQUU7Z0JBQ0YsT0FBTztnQkFDUCxvREFBb0Q7Z0JBQ3BELE9BQU87Z0JBQ1AsMEJBQTBCO2dCQUMxQixFQUFFO2dCQUNGLE9BQU87Z0JBQ1Asd0NBQXdDO2dCQUN4QyxPQUFPO2dCQUNQLDJCQUEyQjtnQkFDM0IsR0FBRztnQkFDSCxFQUFFO2dCQUNGLDBDQUEwQztnQkFDMUMsT0FBTztnQkFDUCxnRUFBZ0U7Z0JBQ2hFLE9BQU87Z0JBQ1Asc0NBQXNDO2dCQUN0QyxFQUFFO2dCQUNGLE9BQU87Z0JBQ1AsMkRBQTJEO2dCQUMzRCxRQUFRO2dCQUNSLGdEQUFnRDtnQkFDaEQscUNBQXFDO2dCQUNyQyxRQUFRO2dCQUNSLE9BQU87Z0JBQ1AsNkJBQTZCO2dCQUM3QixFQUFFO2dCQUNGLE9BQU87Z0JBQ1AsK0dBQStHO2dCQUMvRyxpREFBaUQ7Z0JBQ2pELE9BQU87Z0JBQ1AsMENBQTBDO2dCQUMxQyxHQUFHO2dCQUNILEVBQUU7Z0JBQ0Ys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cEMsK0ZBQStGO2dCQUMvRixTQUFTO2dCQUNULEtBQUs7Z0JBQ0wsRUFBRTtnQkFDRixFQUFFO2dCQUNGLEdBQUc7Z0JBQ0gsRUFBRTtnQkFDRix5Q0FBeUM7Z0JBQ3pDLGlDQUFpQztnQkFDakMscUJBQXFCO2dCQUNyQixrRkFBa0Y7Z0JBQ2xGLHNCQUFzQjtnQkFDdEIsV0FBVztnQkFDWCw0QkFBNEI7Z0JBQzVCLGdEQUFnRDtnQkFDaEQsZ0JBQWdCO2dCQUNoQiwwQkFBMEI7Z0JBQzFCLE9BQU87Z0JBQ1AsRUFBRTtnQkFDRiwrQkFBK0I7Z0JBQy9CLGdEQUFnRDtnQkFDaEQsS0FBSztnQkFDTCxHQUFHO2dCQUNILEVBQUU7Z0JBQ0YsNEVBQTRFO2dCQUM1RSxvQ0FBb0M7Z0JBQ3BDLHNCQUFzQjtnQkFDdEIsK0NBQStDO2dCQUMvQyxpQ0FBaUM7Z0JBQ2pDLEtBQUs7Z0JBQ0wsMkNBQTJDO2dCQUMzQyxHQUFHO2dCQUNILEVBQUU7YUFDSDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTdTRCxvREE2U0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dQcm92aWRlckZpbGUgZXh0ZW5kcyBUZXh0RmlsZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHApIHtcbiAgICBzdXBlcihwcm9qZWN0LCAnc3JjL2NvbnN0cnVjdHMvV29ya2Zsb3dQcm92aWRlci50cycsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgbGluZXM6IFtcbiAgICAgICAgXCJpbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XCIsXG4gICAgICAgIFwiaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1wiLFxuICAgICAgICBcImltcG9ydCB7IEFybiwgQ2ZuT3V0cHV0LCBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24sIFJlZmVyZW5jZSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XCIsXG4gICAgICAgIFwiaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcIixcbiAgICAgICAgXCJpbXBvcnQgeyBDb2RlLCBGdW5jdGlvbiwgUnVudGltZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1wiLFxuICAgICAgICBcImltcG9ydCB7IElTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1wiLFxuICAgICAgICBcImltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XCIsXG4gICAgICAgIFwiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XCIsXG4gICAgICAgIFwiaW1wb3J0IHsgSlNPTlBhdGggfSBmcm9tICdqc29ucGF0aC1wbHVzJztcIixcbiAgICAgICAgJycsXG4gICAgICAgICdleHBvcnQgaW50ZXJmYWNlIFJlcGxhY2VtZW50IHsnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICBcIiAgICogVGhlICduYW1lJyBmcm9tIHRoZSAnbm9kZScgdGhhdCB5b3UnZCBsaWtlIHRvIG1ha2UgYSByZXBsYWNlbWVudCBvbi5cIixcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgbm9kZU5hbWU6IHN0cmluZzsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgLyoqJyxcbiAgICAgICAgJyAgICogQSBkb3RwYXRoIHRvIHRoZSBmaWVsZCBvbiB0aGUgbm9kZSB0byBjaGFuZ2UuJyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgcGF0aDogc3RyaW5nOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICAnICAgKiBUaGUgdmFsdWUgdG8gY2hhbmdlIHRoZSBmaWVsZCB0by4nLFxuICAgICAgICAnICAgKi8nLFxuICAgICAgICAnICByZWFkb25seSB2YWx1ZTogc3RyaW5nOycsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICdleHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93UHJvdmlkZXJQcm9wcyB7JyxcbiAgICAgICAgJyAgLyoqJyxcbiAgICAgICAgJyAgICogVGhlIGZ1bGwgcGF0aCB0byB0aGUgd29ya2Zsb3cgLkpTT04gZmlsZSB5b3Ugd2FudCB0byBhZGQuJyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgd29ya2Zsb3dGaWxlUGF0aDogc3RyaW5nOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICAnICAgKiBBbiBBV1MgU2VjcmV0IHRoYXQgaGFzIHRoZSBmb2xsb3dpbmcgSlNPTiBzdHJ1Y3R1cmU6JyxcbiAgICAgICAgJyAgICogeycsXG4gICAgICAgICcgICAqICAgXCJ1cmxcIjogXCJodHRwczovL3lvdXItbjhuLWluc3RhbmNlLmNvbVwiLCcsXG4gICAgICAgICcgICAqICAgXCJhcGlLZXlcIjogXCJ5b3VyLW44bi1hcGkta2V5XCInLFxuICAgICAgICAnICAgKiB9JyxcbiAgICAgICAgJyAgICovJyxcbiAgICAgICAgJyAgcmVhZG9ubHkgc2VjcmV0OiBJU2VjcmV0OycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvKionLFxuICAgICAgICAnICAgKiBBbiBhcnJheSBvZiBSZXBsYWNlbWVudHMgdG8gbWFrZSBhZ2FpbnN0IHRoZSB3b3JrZmxvdy4gVXNlIHRoaXMgdG8gdXBkYXRlIExhbWJkYSBmdW5jdGlvbiBBUk5zIGFuZCBvdGhlcicsXG4gICAgICAgICcgICAqIEFXUy1jb250cm9sbGVkIHJlc291cmNlcyBpbiB5b3VyIHdvcmtmbG93LicsXG4gICAgICAgICcgICAqLycsXG4gICAgICAgICcgIHJlYWRvbmx5IHJlcGxhY2VtZW50cz86IFJlcGxhY2VtZW50W107JyxcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2V4cG9ydCBjbGFzcyBXb3JrZmxvd1Byb3ZpZGVyIGV4dGVuZHMgQ29uc3RydWN0IHsnLFxuICAgICAgICAnICBwdWJsaWMgaGFuZGxlcjogRnVuY3Rpb247JyxcbiAgICAgICAgJyAgcHVibGljIHdlYmhvb2tQYXRoOiBSZWZlcmVuY2U7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXb3JrZmxvd1Byb3ZpZGVyUHJvcHMpIHsnLFxuICAgICAgICAnICAgIHN1cGVyKHNjb3BlLCBpZCk7JyxcbiAgICAgICAgJycsXG4gICAgICAgIFwiICAgIGNvbnN0IHdvcmtmbG93Q29udGVudHMgPSByZWFkRmlsZVN5bmMoam9pbihfX2Rpcm5hbWUsICcuLi93b3JrZmxvd3MvYWxmcmVkLmpzb24nKSk7XCIsXG4gICAgICAgIFwiICAgIGNvbnN0IHdvcmtmbG93ID0gSlNPTi5wYXJzZSh3b3JrZmxvd0NvbnRlbnRzLnRvU3RyaW5nKCd1dGY4JykpO1wiLFxuICAgICAgICAnICAgIGxldCBuZXdDb250ZW50czogc3RyaW5nID0gd29ya2Zsb3c7JyxcbiAgICAgICAgJyAgICBpZiAocHJvcHMucmVwbGFjZW1lbnRzKSB7JyxcbiAgICAgICAgJyAgICAgIG5ld0NvbnRlbnRzID0gSlNPTi5zdHJpbmdpZnkocHJvcHMucmVwbGFjZW1lbnRzJyxcbiAgICAgICAgJyAgICAgICAgLnJlZHVjZSgocDogYW55LCBjOiBSZXBsYWNlbWVudCkgPT4geycsXG4gICAgICAgICcgICAgICAgICAgcmVwbGFjZUZpZWxkQnlOb2RlTmFtZShwLCBjLm5vZGVOYW1lLCBjLnBhdGgsIGMudmFsdWUpOycsXG4gICAgICAgICcgICAgICAgICAgcmV0dXJuIHA7JyxcbiAgICAgICAgJyAgICAgICAgfSwgd29ya2Zsb3cpLCcsXG4gICAgICAgICcgICAgICBudWxsLCcsXG4gICAgICAgICcgICAgICAyKTsnLFxuICAgICAgICAnICAgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJycsXG4gICAgICAgIFwiICAgIGNvbnN0IGxhbWJkYSA9IHRoaXMuaGFuZGxlciA9IG5ldyBGdW5jdGlvbih0aGlzLCAnSGFuZGxlcicsIHtcIixcbiAgICAgICAgJyAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzI0X1gsJyxcbiAgICAgICAgXCIgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXCIsXG4gICAgICAgICcgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLCcsXG4gICAgICAgICcgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoYCcsXG4gICAgICAgIFwiY29uc3QgeyBTZWNyZXRzTWFuYWdlckNsaWVudCwgR2V0U2VjcmV0VmFsdWVDb21tYW5kIH0gPSByZXF1aXJlKCdAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyJyk7XCIsXG4gICAgICAgICcnLFxuICAgICAgICAnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiB7JyxcbiAgICAgICAgXCIgIGNvbnNvbGUubG9nKCdFdmVudDonLCBKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpO1wiLFxuICAgICAgICAnICAnLFxuICAgICAgICBcIiAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlID09PSAnRGVsZXRlJykge1wiLFxuICAgICAgICBcIiAgICByZXR1cm4geyBQaHlzaWNhbFJlc291cmNlSWQ6IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCB8fCAnd29ya2Zsb3ctdXBsb2FkZXInIH07XCIsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgdHJ5IHsnLFxuICAgICAgICAnICAgIC8vIEdldCBzZWNyZXQnLFxuICAgICAgICAnICAgIGNvbnN0IHNlY3JldHNDbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pOycsXG4gICAgICAgICcgICAgY29uc3Qgc2VjcmV0Q29tbWFuZCA9IG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogcHJvY2Vzcy5lbnYuU0VDUkVUX0FSTiB9KTsnLFxuICAgICAgICAnICAgIGNvbnN0IHNlY3JldFJlc3BvbnNlID0gYXdhaXQgc2VjcmV0c0NsaWVudC5zZW5kKHNlY3JldENvbW1hbmQpOycsXG4gICAgICAgICcgICAgJyxcbiAgICAgICAgJyAgICBjb25zdCBzZWNyZXQgPSBKU09OLnBhcnNlKHNlY3JldFJlc3BvbnNlLlNlY3JldFN0cmluZyk7JyxcbiAgICAgICAgJyAgICBjb25zdCB7IHVybCwgYXBpS2V5IH0gPSBzZWNyZXQ7JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIGNvbnN0IHdvcmtmbG93Q29udGVudCA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5Db250ZW50OycsXG4gICAgICAgICcgICAgY29uc3QgeyBuYW1lLCBub2RlcywgY29ubmVjdGlvbnMsIHNldHRpbmdzIH0gPSBKU09OLnBhcnNlKHdvcmtmbG93Q29udGVudCk7JyxcbiAgICAgICAgJyAgICBjb25zdCB3b3JrZmxvd0RhdGEgPSB7JyxcbiAgICAgICAgJyAgICAgIG5hbWUsJyxcbiAgICAgICAgJyAgICAgIG5vZGVzLCcsXG4gICAgICAgICcgICAgICBjb25uZWN0aW9ucywnLFxuICAgICAgICAnICAgICAgc2V0dGluZ3MsJyxcbiAgICAgICAgJyAgICB9OycsXG4gICAgICAgICcgICAgZGVsZXRlIHdvcmtmbG93RGF0YS5zZXR0aW5ncy5iaW5hcnlNb2RlOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIGNvbnN0IGhlYWRlcnMgPSB7JyxcbiAgICAgICAgXCIgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFwiLFxuICAgICAgICBcIiAgICAgICdYLU44Ti1BUEktS0VZJzogYXBpS2V5LFwiLFxuICAgICAgICAnICAgIH07JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIGxldCB3b3JrZmxvd0lkID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkOycsXG4gICAgICAgICcgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIC8vIFRyeSB0byBnZXQgZXhpc3Rpbmcgd29ya2Zsb3cgaWYgd2UgaGF2ZSBhIHBoeXNpY2FsUmVzb3VyY2VJZCcsXG4gICAgICAgIFwiICAgIGlmICh3b3JrZmxvd0lkICYmIHdvcmtmbG93SWQgIT09ICd3b3JrZmxvdy11cGxvYWRlcicpIHtcIixcbiAgICAgICAgJyAgICAgIHRyeSB7JyxcbiAgICAgICAgJyAgICAgICAgY29uc3QgZ2V0UmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcXFxcYFxcXFwke3VybH0vYXBpL3YxL3dvcmtmbG93cy9cXFxcJHt3b3JrZmxvd0lkfVxcXFxgLCB7JyxcbiAgICAgICAgXCIgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcIixcbiAgICAgICAgJyAgICAgICAgICBoZWFkZXJzLCcsXG4gICAgICAgICcgICAgICAgIH0pOycsXG4gICAgICAgICcgICAgICAgICcsXG4gICAgICAgICcgICAgICAgIGlmIChnZXRSZXNwb25zZS5vaykgeycsXG4gICAgICAgICcgICAgICAgICAgaXNVcGRhdGUgPSB0cnVlOycsXG4gICAgICAgIFwiICAgICAgICAgIGNvbnNvbGUubG9nKCdGb3VuZCBleGlzdGluZyB3b3JrZmxvdywgd2lsbCB1cGRhdGUnKTtcIixcbiAgICAgICAgJyAgICAgICAgfScsXG4gICAgICAgICcgICAgICB9IGNhdGNoIChlcnJvcikgeycsXG4gICAgICAgIFwiICAgICAgICBjb25zb2xlLmxvZygnV29ya2Zsb3cgbm90IGZvdW5kLCB3aWxsIGNyZWF0ZSBuZXcgb25lJyk7XCIsXG4gICAgICAgICcgICAgICB9JyxcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIGxldCByZXN1bHQ7JyxcbiAgICAgICAgJyAgICBpZiAoaXNVcGRhdGUpIHsnLFxuICAgICAgICAnICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIHdvcmtmbG93JyxcbiAgICAgICAgJyAgICAgIGNvbnN0IHVwZGF0ZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXFxcXGBcXFxcJHt1cmx9L2FwaS92MS93b3JrZmxvd3MvXFxcXCR7d29ya2Zsb3dJZH1cXFxcYCwgeycsXG4gICAgICAgIFwiICAgICAgICBtZXRob2Q6ICdQVVQnLFwiLFxuICAgICAgICAnICAgICAgICBoZWFkZXJzLCcsXG4gICAgICAgICcgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHdvcmtmbG93RGF0YSksJyxcbiAgICAgICAgJyAgICAgIH0pOycsXG4gICAgICAgICcgICAgICAnLFxuICAgICAgICAnICAgICAgaWYgKCF1cGRhdGVSZXNwb25zZS5vaykgeycsXG4gICAgICAgICcgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcYFVwZGF0ZSBmYWlsZWQ6IFxcXFwke3VwZGF0ZVJlc3BvbnNlLnN0YXR1c30gXFxcXCR7dXBkYXRlUmVzcG9uc2Uuc3RhdHVzVGV4dH1cXFxcYCk7JyxcbiAgICAgICAgJyAgICAgIH0nLFxuICAgICAgICAnICAgICAgJyxcbiAgICAgICAgJyAgICAgIHJlc3VsdCA9IGF3YWl0IHVwZGF0ZVJlc3BvbnNlLmpzb24oKTsnLFxuICAgICAgICBcIiAgICAgIGNvbnNvbGUubG9nKCdXb3JrZmxvdyB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1wiLFxuICAgICAgICAnICAgIH0gZWxzZSB7JyxcbiAgICAgICAgJyAgICAgIC8vIENyZWF0ZSBuZXcgd29ya2Zsb3cnLFxuICAgICAgICAnICAgICAgY29uc3QgY3JlYXRlUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcXFxcYFxcXFwke3VybH0vYXBpL3YxL3dvcmtmbG93c1xcXFxgLCB7JyxcbiAgICAgICAgXCIgICAgICAgIG1ldGhvZDogJ1BPU1QnLFwiLFxuICAgICAgICAnICAgICAgICBoZWFkZXJzLCcsXG4gICAgICAgICcgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHdvcmtmbG93RGF0YSksJyxcbiAgICAgICAgJyAgICAgIH0pOycsXG4gICAgICAgICcgICAgICAnLFxuICAgICAgICAnICAgICAgaWYgKCFjcmVhdGVSZXNwb25zZS5vaykgeycsXG4gICAgICAgICcgICAgICAgIGxldCByZXN1bHQgPSB7fTsnLFxuICAgICAgICAnICAgICAgICBpZiAoY3JlYXRlUmVzcG9uc2Uuc3RhdHVzID09PSA0MDApIHsnLFxuICAgICAgICAnICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVJlc3BvbnNlLmpzb24oKTsgICcsXG4gICAgICAgICcgICAgICAgIH0nLFxuICAgICAgICAnICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXGBDcmVhdGUgZmFpbGVkOiBcXFxcJHtjcmVhdGVSZXNwb25zZS5zdGF0dXN9IFxcXFwke2NyZWF0ZVJlc3BvbnNlLnN0YXR1c1RleHR9IFxcXFwke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9IFxcXFxgKTsnLFxuICAgICAgICAnICAgICAgfScsXG4gICAgICAgICcgICAgICAnLFxuICAgICAgICAnICAgICAgcmVzdWx0ID0gYXdhaXQgY3JlYXRlUmVzcG9uc2UuanNvbigpOycsXG4gICAgICAgICcgICAgICAnLFxuICAgICAgICAnICAgICAgJyxcbiAgICAgICAgJyAgICAgIHdvcmtmbG93SWQgPSByZXN1bHQuaWQ7JyxcbiAgICAgICAgXCIgICAgICBjb25zb2xlLmxvZygnV29ya2Zsb3cgY3JlYXRlZCBzdWNjZXNzZnVsbHknKTtcIixcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJyAgICAnLFxuICAgICAgICAnICAgIC8vIEFjdGl2YXRlIHRoZSB3b3JrZmxvdycsXG4gICAgICAgICcgICAgY29uc3QgYWN0aXZhdGVSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxcXFxgXFxcXCR7dXJsfS9hcGkvdjEvd29ya2Zsb3dzL1xcXFwke3dvcmtmbG93SWR9L2FjdGl2YXRlXFxcXGAsIHsnLFxuICAgICAgICBcIiAgICAgIG1ldGhvZDogJ1BPU1QnLFwiLFxuICAgICAgICAnICAgICAgaGVhZGVycywnLFxuICAgICAgICAnICAgIH0pOycsXG4gICAgICAgICcgICAgJyxcbiAgICAgICAgJyAgICBpZiAoIWFjdGl2YXRlUmVzcG9uc2Uub2spIHsnLFxuICAgICAgICAnICAgIGxldCByZXN1bHQgPSB7fTsnLFxuICAgICAgICAnICAgICAgaWYgKGFjdGl2YXRlUmVzcG9uc2Uuc3RhdHVzID09PSA0MDApIHsnLFxuICAgICAgICAnICAgICAgICByZXN1bHQgPSBhd2FpdCBhY3RpdmF0ZVJlc3BvbnNlLmpzb24oKTsnLFxuICAgICAgICAnICAgICAgfScsXG4gICAgICAgICcgICAgICBjb25zb2xlLndhcm4oXFxcXGBBY3RpdmF0aW9uIGZhaWxlZDogXFxcXCR7YWN0aXZhdGVSZXNwb25zZS5zdGF0dXN9IFxcXFwke2FjdGl2YXRlUmVzcG9uc2Uuc3RhdHVzVGV4dH1cXFxcXFxcXCBcXFxcJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfSBcXFxcYCk7JyxcbiAgICAgICAgJyAgICB9IGVsc2UgeycsXG4gICAgICAgIFwiICAgICAgY29uc29sZS5sb2coJ1dvcmtmbG93IGFjdGl2YXRlZCBzdWNjZXNzZnVsbHknKTtcIixcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgLy8gRmV0Y2ggdGhlIHdvcmtmbG93IHRvIGV4dHJhY3Qgd2ViaG9vayBwYXRoJyxcbiAgICAgICAgXCIgICAgbGV0IHdlYmhvb2tQYXRoID0gXFxcXCdcXFxcJztcIixcbiAgICAgICAgJyAgICBjb25zdCBnZXRXb3JrZmxvd1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goXFxcXGBcXFxcJHt1cmx9L2FwaS92MS93b3JrZmxvd3MvXFxcXCR7d29ya2Zsb3dJZH1cXFxcYCwgeycsXG4gICAgICAgIFwiICAgICAgbWV0aG9kOiAnR0VUJyxcIixcbiAgICAgICAgJyAgICAgIGhlYWRlcnMsJyxcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICBpZiAoZ2V0V29ya2Zsb3dSZXNwb25zZS5vaykgeycsXG4gICAgICAgICcgICAgICBjb25zdCB3b3JrZmxvdyA9IGF3YWl0IGdldFdvcmtmbG93UmVzcG9uc2UuanNvbigpOycsXG4gICAgICAgIFwiICAgICAgY29uc3Qgd2ViaG9va05vZGUgPSAod29ya2Zsb3cubm9kZXMgfHwgW10pLmZpbmQobiA9PiBuLnR5cGUgPT09ICduOG4tbm9kZXMtYmFzZS53ZWJob29rJyk7XCIsXG4gICAgICAgICcgICAgICBpZiAod2ViaG9va05vZGUgJiYgd2ViaG9va05vZGUucGFyYW1ldGVycyAmJiB3ZWJob29rTm9kZS5wYXJhbWV0ZXJzLnBhdGgpIHsnLFxuICAgICAgICAnICAgICAgICB3ZWJob29rUGF0aCA9IHdlYmhvb2tOb2RlLnBhcmFtZXRlcnMucGF0aDsnLFxuICAgICAgICAnICAgICAgICBjb25zb2xlLmxvZyhcXFxcYEZvdW5kIHdlYmhvb2sgcGF0aDogXFxcXCR7d2ViaG9va1BhdGh9XFxcXGApOycsXG4gICAgICAgICcgICAgICB9JyxcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgcmV0dXJuIHsnLFxuICAgICAgICAnICAgICAgUGh5c2ljYWxSZXNvdXJjZUlkOiB3b3JrZmxvd0lkLCcsXG4gICAgICAgICcgICAgICBEYXRhOiB7IFdvcmtmbG93SWQ6IHdvcmtmbG93SWQsIFdlYmhvb2tQYXRoOiB3ZWJob29rUGF0aCB9JyxcbiAgICAgICAgJyAgICB9OycsXG4gICAgICAgICcgIH0gY2F0Y2ggKGVycm9yKSB7JyxcbiAgICAgICAgXCIgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpO1wiLFxuICAgICAgICAnICAgIHJldHVybiB7JyxcbiAgICAgICAgXCIgICAgICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBldmVudC5QaHlzaWNhbFJlc291cmNlSWQgfHwgJ3dvcmtmbG93LXVwbG9hZGVyJyxcIixcbiAgICAgICAgXCIgICAgICAgRGF0YTogeyBFcnJvcjogU3RyaW5nKGVycm9yKSwgV2ViaG9va1BhdGg6ICd1bmF2YWlsYWJsZScgfVwiLFxuICAgICAgICAnICAgIH07JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICd9OycsXG4gICAgICAgICcgICAgICBgKSwnLFxuICAgICAgICAnICAgICAgZW52aXJvbm1lbnQ6IHsnLFxuICAgICAgICAnICAgICAgICBTRUNSRVRfQVJOOiBwcm9wcy5zZWNyZXQuc2VjcmV0QXJuLCcsXG4gICAgICAgICcgICAgICB9LCcsXG4gICAgICAgICcgICAgfSk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgcHJvcHMuc2VjcmV0LmdyYW50UmVhZChsYW1iZGEpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICAvLyBHcmFudCBLTVMgZGVjcnlwdCBwZXJtaXNzaW9ucyBmb3IgdGhlIHNlY3JldCcsXG4gICAgICAgICcgICAgaWYgKHByb3BzLnNlY3JldC5lbmNyeXB0aW9uS2V5KSB7JyxcbiAgICAgICAgXCIgICAgICBjb25zb2xlLmxvZygnZW5jcnlwdGlvbiBrZXkgZm91bmQsIGdyYW50aW5nIGRlY3J5cHQgcGVybWlzc2lvbnMnKTtcIixcbiAgICAgICAgJyAgICAgIHByb3BzLnNlY3JldC5lbmNyeXB0aW9uS2V5LmdyYW50RGVjcnlwdChsYW1iZGEpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIH0gZWxzZSB7JyxcbiAgICAgICAgJyAgICAgIGxhbWJkYS5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHsnLFxuICAgICAgICAnICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVywnLFxuICAgICAgICAnICAgICAgICBhY3Rpb25zOiBbJyxcbiAgICAgICAgXCIgICAgICAgICAgJ2ttczpEZWNyeXB0JyxcIixcbiAgICAgICAgXCIgICAgICAgICAgJ2ttczpEZXNjcmliZUtleScsXCIsXG4gICAgICAgICcgICAgICAgIF0sJyxcbiAgICAgICAgJyAgICAgICAgcmVzb3VyY2VzOiBbQXJuLmZvcm1hdCh7JyxcbiAgICAgICAgXCIgICAgICAgICAgc2VydmljZTogJ2ttcycsXCIsXG4gICAgICAgIFwiICAgICAgICAgIHJlc291cmNlOiAna2V5JyxcIixcbiAgICAgICAgXCIgICAgICAgICAgcmVzb3VyY2VOYW1lOiAnYTY5OWY4NTMtMDQ3NS00ZDRkLWI4YWItYmU4ODFkNjY2MjRmJyxcIixcbiAgICAgICAgXCIgICAgICAgICAgcGFydGl0aW9uOiAnYXdzJyxcIixcbiAgICAgICAgJyAgICAgICAgICByZWdpb246IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbiwnLFxuICAgICAgICBcIiAgICAgICAgICBhY2NvdW50OiAnNTgxNTE0NjcyMzY3JyxcIixcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgICAgIH0pXSwnLFxuICAgICAgICAnICAgICAgfSkpOycsXG4gICAgICAgICcgICAgfScsXG4gICAgICAgICcnLFxuICAgICAgICBcIiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCAnUHJvdmlkZXInLCB7XCIsXG4gICAgICAgICcgICAgICBvbkV2ZW50SGFuZGxlcjogbGFtYmRhLCcsXG4gICAgICAgICcgICAgfSk7JyxcbiAgICAgICAgJycsXG4gICAgICAgIFwiICAgIGNvbnN0IGN1c3RvbVJlc291cmNlID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsICdSZXNvdXJjZScsIHtcIixcbiAgICAgICAgJyAgICAgIHNlcnZpY2VUb2tlbjogcHJvdmlkZXIuc2VydmljZVRva2VuLCcsXG4gICAgICAgICcgICAgICBwcm9wZXJ0aWVzOiB7JyxcbiAgICAgICAgJyAgICAgICAgQ29udGVudDogbmV3Q29udGVudHMsJyxcbiAgICAgICAgJyAgICAgIH0sJyxcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgXCIgICAgdGhpcy53ZWJob29rUGF0aCA9IGN1c3RvbVJlc291cmNlLmdldEF0dCgnV2ViaG9va1BhdGgnKTtcIixcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgLy8gT3V0cHV0IHRoZSBMYW1iZGEgZXhlY3V0aW9uIHJvbGUgQVJOIGZvciBjcm9zcy1hY2NvdW50IEtNUyBwZXJtaXNzaW9ucycsXG4gICAgICAgIFwiICAgIG5ldyBDZm5PdXRwdXQodGhpcywgJ0xhbWJkYUV4ZWN1dGlvblJvbGVBcm4nLCB7XCIsXG4gICAgICAgICcgICAgICB2YWx1ZTogbGFtYmRhLnJvbGUhLnJvbGVBcm4sJyxcbiAgICAgICAgXCIgICAgICBkZXNjcmlwdGlvbjogJ0xhbWJkYSBleGVjdXRpb24gcm9sZSBBUk4gLSBhZGQgdGhpcyB0byBLTVMga2V5IHBvbGljeSBpbiBvdGhlciBhY2NvdW50JyxcIixcbiAgICAgICAgJyAgICB9KTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcnLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgICAnZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VGaWVsZEJ5Tm9kZU5hbWUoJyxcbiAgICAgICAgJyAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwnLFxuICAgICAgICAnICBub2RlTmFtZTogc3RyaW5nLCcsXG4gICAgICAgICcgIGZpZWxkUGF0aDogc3RyaW5nLCAvLyBkb3Qtbm90YXRpb24gcmVsYXRpdmUgdG8gdGhlIG5vZGUsIGUuZy4gXCJwYXJhbWV0ZXJzLnVybFwiJyxcbiAgICAgICAgJyAgbmV3VmFsdWU6IHVua25vd24sJyxcbiAgICAgICAgJyk6IHZvaWQgeycsXG4gICAgICAgICcgIGNvbnN0IG5vZGVzID0gSlNPTlBhdGgoeycsXG4gICAgICAgIFwiICAgIHBhdGg6IGAkLm5vZGVzWz8oQC5uYW1lPT0nJHtub2RlTmFtZX0nKV1gLFwiLFxuICAgICAgICAnICAgIGpzb246IG9iaiwnLFxuICAgICAgICBcIiAgICByZXN1bHRUeXBlOiAndmFsdWUnLFwiLFxuICAgICAgICAnICB9KTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7JyxcbiAgICAgICAgJyAgICBzZXROZXN0ZWRWYWx1ZShub2RlLCBmaWVsZFBhdGgsIG5ld1ZhbHVlKTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2Z1bmN0aW9uIHNldE5lc3RlZFZhbHVlKG9iajogYW55LCBkb3RQYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7JyxcbiAgICAgICAgXCIgIGNvbnN0IGtleXMgPSBkb3RQYXRoLnNwbGl0KCcuJyk7XCIsXG4gICAgICAgICcgIGxldCBjdXJyZW50ID0gb2JqOycsXG4gICAgICAgICcgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHsnLFxuICAgICAgICAnICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleXNbaV1dOycsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnICBjdXJyZW50W2tleXNba2V5cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTsnLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuIl19