From d10786e9f11741c526d8da1ace15804f5d18e0d4 Mon Sep 17 00:00:00 2001 From: Akber Choudhry Date: Tue, 6 Jan 2026 11:02:45 -0500 Subject: [PATCH 1/3] fix: add AWS SDK peer dependencies for @dyanet/config-aws --- examples/gmail-viewer/package-lock.json | 98 +++++++++++++++++++++++++ examples/gmail-viewer/package.json | 1 + 2 files changed, 99 insertions(+) diff --git a/examples/gmail-viewer/package-lock.json b/examples/gmail-viewer/package-lock.json index 82025b0..e8c2d87 100644 --- a/examples/gmail-viewer/package-lock.json +++ b/examples/gmail-viewer/package-lock.json @@ -12,6 +12,7 @@ "@aws-sdk/client-s3": "^3.0.0", "@aws-sdk/client-secrets-manager": "^3.0.0", "@aws-sdk/client-ssm": "^3.0.0", + "@aws-sdk/credential-providers": "^3.0.0", "@dyanet/config-aws": "^1.0.3", "@dyanet/imap": "^0.5.2", "express": "^4.21.0", @@ -231,6 +232,56 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.962.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.962.0.tgz", + "integrity": "sha512-gQKsnvC4Rlg0uVSDZIo5Ditp/oqea21omsJsftqkAXGyFQsNVLMd1Toz0Akg0ecbLoLhrWPCMylugH6El1buYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.957.0", + "@aws-sdk/credential-provider-node": "3.962.0", + "@aws-sdk/middleware-host-header": "3.957.0", + "@aws-sdk/middleware-logger": "3.957.0", + "@aws-sdk/middleware-recursion-detection": "3.957.0", + "@aws-sdk/middleware-user-agent": "3.957.0", + "@aws-sdk/region-config-resolver": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@aws-sdk/util-endpoints": "3.957.0", + "@aws-sdk/util-user-agent-browser": "3.957.0", + "@aws-sdk/util-user-agent-node": "3.957.0", + "@smithy/config-resolver": "^4.4.5", + "@smithy/core": "^3.20.0", + "@smithy/fetch-http-handler": "^5.3.8", + "@smithy/hash-node": "^4.2.7", + "@smithy/invalid-dependency": "^4.2.7", + "@smithy/middleware-content-length": "^4.2.7", + "@smithy/middleware-endpoint": "^4.4.1", + "@smithy/middleware-retry": "^4.4.17", + "@smithy/middleware-serde": "^4.2.8", + "@smithy/middleware-stack": "^4.2.7", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/node-http-handler": "^4.4.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/smithy-client": "^4.10.2", + "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.16", + "@smithy/util-defaults-mode-node": "^4.2.19", + "@smithy/util-endpoints": "^3.2.7", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-retry": "^4.2.7", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws-sdk/client-s3": { "version": "3.962.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.962.0.tgz", @@ -484,6 +535,22 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.962.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.962.0.tgz", + "integrity": "sha512-0B1iwgCNY3cg/s3JwWtBP1PaB4uldd0sgx6WgVVcnQ9rpyuCMOUF61enA1OcmSWgRRndylznGXjok8cva5Pw4w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.962.0", + "@aws-sdk/types": "3.957.0", + "@smithy/property-provider": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws-sdk/credential-provider-env": { "version": "3.957.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.957.0.tgz", @@ -642,6 +709,37 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.962.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.962.0.tgz", + "integrity": "sha512-KIFu4zkMxJ9TeBm/TWv64W9en5fSP/pPWxm3tkFMleEmyotWmC2xkihZZYcHKgLhezA3fyZxTVz2v++6DpO76A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.962.0", + "@aws-sdk/core": "3.957.0", + "@aws-sdk/credential-provider-cognito-identity": "3.962.0", + "@aws-sdk/credential-provider-env": "3.957.0", + "@aws-sdk/credential-provider-http": "3.957.0", + "@aws-sdk/credential-provider-ini": "3.962.0", + "@aws-sdk/credential-provider-login": "3.962.0", + "@aws-sdk/credential-provider-node": "3.962.0", + "@aws-sdk/credential-provider-process": "3.957.0", + "@aws-sdk/credential-provider-sso": "3.958.0", + "@aws-sdk/credential-provider-web-identity": "3.958.0", + "@aws-sdk/nested-clients": "3.958.0", + "@aws-sdk/types": "3.957.0", + "@smithy/config-resolver": "^4.4.5", + "@smithy/core": "^3.20.0", + "@smithy/credential-provider-imds": "^4.2.7", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.957.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.957.0.tgz", diff --git a/examples/gmail-viewer/package.json b/examples/gmail-viewer/package.json index 20e4523..494d45e 100644 --- a/examples/gmail-viewer/package.json +++ b/examples/gmail-viewer/package.json @@ -23,6 +23,7 @@ "@aws-sdk/client-s3": "^3.0.0", "@aws-sdk/client-secrets-manager": "^3.0.0", "@aws-sdk/client-ssm": "^3.0.0", + "@aws-sdk/credential-providers": "^3.0.0", "@dyanet/config-aws": "^1.0.3", "@dyanet/imap": "^0.5.2", "express": "^4.21.0", From 12dc58822ef3ff7aea4c05357f08ba5784e939bd Mon Sep 17 00:00:00 2001 From: Akber Choudhry Date: Tue, 6 Jan 2026 11:11:20 -0500 Subject: [PATCH 2/3] fix: exclude NIL from atom generator in property tests --- tests/property/protocol.property.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/property/protocol.property.ts b/tests/property/protocol.property.ts index 62d7b3d..38d5b41 100644 --- a/tests/property/protocol.property.ts +++ b/tests/property/protocol.property.ts @@ -41,11 +41,12 @@ const responseTextArb = fc.stringOf( /** * Generates valid IMAP atoms (no special characters) + * Excludes NIL (case-insensitive) as it's a reserved keyword */ const atomArb = fc.stringOf( fc.constantFrom(...'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-'), { minLength: 1, maxLength: 20 } -); +).filter(s => s.toUpperCase() !== 'NIL'); /** * Generates valid quoted strings (may contain spaces) From 3c17e4e51f0f41ac65605fc893466e3dcd775c1c Mon Sep 17 00:00:00 2001 From: Akber Choudhry Date: Tue, 6 Jan 2026 14:48:02 -0500 Subject: [PATCH 3/3] fix(cdk): minor fixes to SSM and secrets params --- .../gmail-viewer-cdk/bin/gmail-viewer-cdk.js | 6 +++--- .../gmail-viewer-cdk/bin/gmail-viewer-cdk.ts | 4 ++-- .../lib/gmail-viewer-cdk-stack.js | 21 ++++++++----------- .../lib/gmail-viewer-cdk-stack.ts | 19 +++++++---------- 4 files changed, 22 insertions(+), 28 deletions(-) diff --git a/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js b/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js index 332c32c..4f2feb2 100644 --- a/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js +++ b/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js @@ -19,7 +19,7 @@ new gmail_viewer_cdk_stack_1.GmailViewerCdkStack(app, 'GmailViewerCdkStack', { gitHubBranch: 'main', codeConnectionArn: 'arn:aws:codeconnections:ca-central-1:239030031457:connection/29fe5c11-23d2-4c10-a81d-4e880b12e2c6', useGitHubWebhooks: false, - apiCustomDomainName: 'mail.dyanet.com', - certificateArn: 'arn:aws:acm:ca-central-1:239030031457:certificate/af9150f1-4635-4154-8b19-e5449d57e971', + apiCustomDomainName: 'demo.dyanet.com', + certificateArn: 'arn:aws:acm:ca-central-1:239030031457:certificate/cb01610f-dddd-44e1-abd9-0672f0dc3355', }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdtYWlsLXZpZXdlci1jZGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQWtDO0FBQ2xDLDBFQUFvRTtBQUVwRSxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztBQUV0QiwwRkFBMEY7QUFDMUYsK0RBQStEO0FBQy9ELE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRTVFLElBQUksNENBQW1CLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFO0lBQ2xELEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtRQUN4QyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7S0FDdkM7SUFDRCxjQUFjLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSwwQkFBMEIsQ0FBQztJQUN4RSxhQUFhLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSwwQkFBMEIsQ0FBQztJQUN2RSxXQUFXLEVBQUUsUUFBUTtJQUNyQixVQUFVLEVBQUUsTUFBTTtJQUNsQixZQUFZLEVBQUUsTUFBTTtJQUNwQixpQkFBaUIsRUFBRSxtR0FBbUc7SUFDdEgsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixtQkFBbUIsRUFBRSxpQkFBaUI7SUFDdEMsY0FBYyxFQUFFLHdGQUF3RjtDQUN6RyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXHJcbmltcG9ydCB7IEFwcCB9IGZyb20gJ2F3cy1jZGstbGliJztcclxuaW1wb3J0IHsgR21haWxWaWV3ZXJDZGtTdGFjayB9IGZyb20gJy4uL2xpYi9nbWFpbC12aWV3ZXItY2RrLXN0YWNrJztcclxuXHJcbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcclxuXHJcbi8vIFRvIHNwZWNpZnkgc3VibmV0cywgdXNlIHRoZSAtLWNvbnRleHQgb3B0aW9uIHdpdGggYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzdWJuZXQgSURzOlxyXG4vLyBjZGsgZGVwbG95IC1jIHByaXZhdGVTdWJuZXRzPXN1Ym5ldC14eHh4eHh4eCxzdWJuZXQteXl5eXl5eXlcclxuY29uc3QgcHJpdmF0ZVN1Ym5ldHMgPSBhcHAubm9kZS50cnlHZXRDb250ZXh0KCdwcml2YXRlU3VibmV0cycpPy5zcGxpdCgnLCcpO1xyXG5cclxubmV3IEdtYWlsVmlld2VyQ2RrU3RhY2soYXBwLCAnR21haWxWaWV3ZXJDZGtTdGFjaycsIHtcclxuICBlbnY6IHtcclxuICAgIGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQsXHJcbiAgICByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTixcclxuICB9LFxyXG4gIHByaXZhdGVTdWJuZXRzOiBbJ3N1Ym5ldC0wZDgyOTBkMGVhNTc1MzMxYycsICdzdWJuZXQtMDMyMjkwNTY5YTdlY2YyMTAnXSxcclxuICBwdWJsaWNTdWJuZXRzOiBbJ3N1Ym5ldC0wNzEzYWRlMzBkZDhjMzA4YycsICdzdWJuZXQtMGI0ZGQ0NWI1MWJiODI1MmYnXSxcclxuICBnaXRIdWJPd25lcjogJ2R5YW5ldCcsXHJcbiAgZ2l0SHViUmVwbzogJ2ltYXAnLFxyXG4gIGdpdEh1YkJyYW5jaDogJ21haW4nLFxyXG4gIGNvZGVDb25uZWN0aW9uQXJuOiAnYXJuOmF3czpjb2RlY29ubmVjdGlvbnM6Y2EtY2VudHJhbC0xOjIzOTAzMDAzMTQ1Nzpjb25uZWN0aW9uLzI5ZmU1YzExLTIzZDItNGMxMC1hODFkLTRlODgwYjEyZTJjNicsXHJcbiAgdXNlR2l0SHViV2ViaG9va3M6IGZhbHNlLFxyXG4gIGFwaUN1c3RvbURvbWFpbk5hbWU6ICdtYWlsLmR5YW5ldC5jb20nLFxyXG4gIGNlcnRpZmljYXRlQXJuOiAnYXJuOmF3czphY206Y2EtY2VudHJhbC0xOjIzOTAzMDAzMTQ1NzpjZXJ0aWZpY2F0ZS9hZjkxNTBmMS00NjM1LTQxNTQtOGIxOS1lNTQ0OWQ1N2U5NzEnLFxyXG59KTtcclxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdtYWlsLXZpZXdlci1jZGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQWtDO0FBQ2xDLDBFQUFvRTtBQUVwRSxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztBQUV0QiwwRkFBMEY7QUFDMUYsK0RBQStEO0FBQy9ELE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRTVFLElBQUksNENBQW1CLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFO0lBQ2xELEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtRQUN4QyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7S0FDdkM7SUFDRCxjQUFjLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSwwQkFBMEIsQ0FBQztJQUN4RSxhQUFhLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSwwQkFBMEIsQ0FBQztJQUN2RSxXQUFXLEVBQUUsUUFBUTtJQUNyQixVQUFVLEVBQUUsTUFBTTtJQUNsQixZQUFZLEVBQUUsTUFBTTtJQUNwQixpQkFBaUIsRUFBRSxtR0FBbUc7SUFDdEgsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixtQkFBbUIsRUFBRSxpQkFBaUI7SUFDdEMsY0FBYyxFQUFFLHdGQUF3RjtDQUN6RyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXHJcbmltcG9ydCB7IEFwcCB9IGZyb20gJ2F3cy1jZGstbGliJztcclxuaW1wb3J0IHsgR21haWxWaWV3ZXJDZGtTdGFjayB9IGZyb20gJy4uL2xpYi9nbWFpbC12aWV3ZXItY2RrLXN0YWNrJztcclxuXHJcbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcclxuXHJcbi8vIFRvIHNwZWNpZnkgc3VibmV0cywgdXNlIHRoZSAtLWNvbnRleHQgb3B0aW9uIHdpdGggYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzdWJuZXQgSURzOlxyXG4vLyBjZGsgZGVwbG95IC1jIHByaXZhdGVTdWJuZXRzPXN1Ym5ldC14eHh4eHh4eCxzdWJuZXQteXl5eXl5eXlcclxuY29uc3QgcHJpdmF0ZVN1Ym5ldHMgPSBhcHAubm9kZS50cnlHZXRDb250ZXh0KCdwcml2YXRlU3VibmV0cycpPy5zcGxpdCgnLCcpO1xyXG5cclxubmV3IEdtYWlsVmlld2VyQ2RrU3RhY2soYXBwLCAnR21haWxWaWV3ZXJDZGtTdGFjaycsIHtcclxuICBlbnY6IHtcclxuICAgIGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQsXHJcbiAgICByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTixcclxuICB9LFxyXG4gIHByaXZhdGVTdWJuZXRzOiBbJ3N1Ym5ldC0wZDgyOTBkMGVhNTc1MzMxYycsICdzdWJuZXQtMDMyMjkwNTY5YTdlY2YyMTAnXSxcclxuICBwdWJsaWNTdWJuZXRzOiBbJ3N1Ym5ldC0wNzEzYWRlMzBkZDhjMzA4YycsICdzdWJuZXQtMGI0ZGQ0NWI1MWJiODI1MmYnXSxcclxuICBnaXRIdWJPd25lcjogJ2R5YW5ldCcsXHJcbiAgZ2l0SHViUmVwbzogJ2ltYXAnLFxyXG4gIGdpdEh1YkJyYW5jaDogJ21haW4nLFxyXG4gIGNvZGVDb25uZWN0aW9uQXJuOiAnYXJuOmF3czpjb2RlY29ubmVjdGlvbnM6Y2EtY2VudHJhbC0xOjIzOTAzMDAzMTQ1Nzpjb25uZWN0aW9uLzI5ZmU1YzExLTIzZDItNGMxMC1hODFkLTRlODgwYjEyZTJjNicsXHJcbiAgdXNlR2l0SHViV2ViaG9va3M6IGZhbHNlLFxyXG4gIGFwaUN1c3RvbURvbWFpbk5hbWU6ICdkZW1vLmR5YW5ldC5jb20nLFxyXG4gIGNlcnRpZmljYXRlQXJuOiAnYXJuOmF3czphY206Y2EtY2VudHJhbC0xOjIzOTAzMDAzMTQ1NzpjZXJ0aWZpY2F0ZS9jYjAxNjEwZi1kZGRkLTQ0ZTEtYWJkOS0wNjcyZjBkYzMzNTUnLFxyXG59KTtcclxuIl19 \ No newline at end of file diff --git a/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.ts b/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.ts index b984745..e30480b 100644 --- a/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.ts +++ b/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.ts @@ -20,6 +20,6 @@ new GmailViewerCdkStack(app, 'GmailViewerCdkStack', { gitHubBranch: 'main', codeConnectionArn: 'arn:aws:codeconnections:ca-central-1:239030031457:connection/29fe5c11-23d2-4c10-a81d-4e880b12e2c6', useGitHubWebhooks: false, - apiCustomDomainName: 'mail.dyanet.com', - certificateArn: 'arn:aws:acm:ca-central-1:239030031457:certificate/af9150f1-4635-4154-8b19-e5449d57e971', + apiCustomDomainName: 'demo.dyanet.com', + certificateArn: 'arn:aws:acm:ca-central-1:239030031457:certificate/cb01610f-dddd-44e1-abd9-0672f0dc3355', }); diff --git a/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.js b/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.js index d3db55e..3b677c0 100644 --- a/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.js +++ b/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.js @@ -46,7 +46,6 @@ const logs = __importStar(require("aws-cdk-lib/aws-logs")); const route53 = __importStar(require("aws-cdk-lib/aws-route53")); const servicediscovery = __importStar(require("aws-cdk-lib/aws-servicediscovery")); const secretsmanager = __importStar(require("aws-cdk-lib/aws-secretsmanager")); -const ssm = __importStar(require("aws-cdk-lib/aws-ssm")); class GmailViewerCdkStack extends cdk.Stack { clusterName; repositoryUri; @@ -80,7 +79,7 @@ class GmailViewerCdkStack extends cdk.Stack { const googleClientId = props.googleClientId || 'PLACEHOLDER_GOOGLE_CLIENT_ID'; const googleClientSecret = props.googleClientSecret || 'PLACEHOLDER_GOOGLE_CLIENT_SECRET'; const sessionSecretValue = props.sessionSecretValue || 'PLACEHOLDER_SESSION_SECRET'; - const apiDomain = props.apiCustomDomainName ?? process.env.API_CUSTOM_DOMAIN ?? 'mail.dyanet.com'; + const apiDomain = props.apiCustomDomainName ?? process.env.API_CUSTOM_DOMAIN ?? 'demo.dyanet.com'; const certArn = props.certificateArn ?? this.node.tryGetContext('certificateArn') ?? process.env.CERTIFICATE_ARN; const zoneId = props.hostedZoneId ?? ''; const hasCustomDomain = Boolean(certArn && apiDomain); @@ -162,13 +161,16 @@ class GmailViewerCdkStack extends cdk.Stack { const cloudMapService = new servicediscovery.Service(this, 'AppCloudMapService', { name: 'mail-example', namespace, dnsRecordType: servicediscovery.DnsRecordType.SRV, dnsTtl: nsTtl, routingPolicy: servicediscovery.RoutingPolicy.WEIGHTED, customHealthCheck: { failureThreshold: 1 }, }); - // Secrets Manager - single secret with GOOGLE_CLIENT_SECRET and SESSION_SECRET + // Secrets Manager - all config values for the application const appSecrets = new secretsmanager.Secret(this, 'AppSecrets', { - secretName: `${ssmPrefix}/secrets`, - description: 'Application secrets for mail-example', + secretName: `${ssmPrefix}/config`, + description: 'Application configuration for mail-example', secretObjectValue: { + GOOGLE_CLIENT_ID: cdk.SecretValue.unsafePlainText(googleClientId), GOOGLE_CLIENT_SECRET: cdk.SecretValue.unsafePlainText(googleClientSecret), SESSION_SECRET: cdk.SecretValue.unsafePlainText(sessionSecretValue), + BASE_URL: cdk.SecretValue.unsafePlainText(baseUrl.toString()), + PORT: cdk.SecretValue.unsafePlainText(containerPort.toString()), }, }); // IAM Roles (L2) @@ -178,11 +180,6 @@ class GmailViewerCdkStack extends cdk.Stack { const taskRole = new iam.Role(this, 'TaskRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com') }); taskRole.addToPolicy(new iam.PolicyStatement({ actions: ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath', 'kms:Decrypt'], resources: [`arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}*`, `arn:aws:kms:${this.region}:${this.account}:key/*`] })); taskRole.addToPolicy(new iam.PolicyStatement({ actions: ['secretsmanager:GetSecretValue'], resources: [appSecrets.secretArn] })); - // SSM Parameters (L2) - create before task definition so they can be referenced - const ssmBaseUrl = new ssm.StringParameter(this, 'SsmBaseUrl', { parameterName: `${ssmPrefix}/env/BASE_URL`, stringValue: baseUrl.toString() }); - const ssmGoogleClientId = new ssm.StringParameter(this, 'SsmGoogleClientId', { parameterName: `${ssmPrefix}/env/GOOGLE_CLIENT_ID`, stringValue: googleClientId }); - new ssm.StringParameter(this, 'SsmPort', { parameterName: `${ssmPrefix}/env/PORT`, stringValue: containerPort.toString() }); - new ssm.StringParameter(this, 'SsmPublicEnv', { parameterName: `${ssmPrefix}/env/NODE_ENV`, stringValue: publicEnvValue }); // ECS Task Definition (L2) const taskDef = new ecs.FargateTaskDefinition(this, 'AppTaskDefinition', { family: 'mail-example', cpu: containerCpu, memoryLimitMiB: containerMemory, executionRole: taskExecRole, taskRole }); taskDef.addContainer('mail-example', { @@ -190,7 +187,7 @@ class GmailViewerCdkStack extends cdk.Stack { logging: ecs.LogDrivers.awsLogs({ logGroup: appLogGroup, streamPrefix: 'mail-example' }), environment: { CONFIG_SSM_PREFIX: ssmPrefix, PORT: containerPort.toString(), BASE_URL: baseUrl.toString(), NODE_ENV: publicEnvValue }, secrets: { - GOOGLE_CLIENT_ID: ecs.Secret.fromSsmParameter(ssmGoogleClientId), + GOOGLE_CLIENT_ID: ecs.Secret.fromSecretsManager(appSecrets, 'GOOGLE_CLIENT_ID'), GOOGLE_CLIENT_SECRET: ecs.Secret.fromSecretsManager(appSecrets, 'GOOGLE_CLIENT_SECRET'), SESSION_SECRET: ecs.Secret.fromSecretsManager(appSecrets, 'SESSION_SECRET'), }, @@ -243,4 +240,4 @@ class GmailViewerCdkStack extends cdk.Stack { } } exports.GmailViewerCdkStack = GmailViewerCdkStack; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdtYWlsLXZpZXdlci1jZGstc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW1DO0FBQ25DLDJFQUE2RDtBQUM3RCxxRUFBdUQ7QUFDdkQsaUVBQW1EO0FBQ25ELHlEQUEyQztBQUMzQyx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLHlEQUEyQztBQUMzQywyREFBNkM7QUFDN0MsaUVBQW1EO0FBQ25ELG1GQUFxRTtBQUNyRSwrRUFBaUU7QUFDakUseURBQTJDO0FBMkIzQyxNQUFhLG1CQUFvQixTQUFRLEdBQUcsQ0FBQyxLQUFLO0lBQ2hDLFdBQVcsQ0FBUztJQUNwQixhQUFhLENBQVM7SUFDdEIsWUFBWSxDQUFTO0lBQ3JCLGtCQUFrQixDQUFTO0lBRTNDLFlBQW1CLEtBQWMsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDNUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFrQyxFQUFFLFFBQWdCLEVBQVUsRUFBRTtZQUNoRixNQUFNLFNBQVMsR0FBRyxLQUFLLElBQUksUUFBUSxDQUFDO1lBQ3BDLE1BQU0sTUFBTSxHQUFHLE9BQU8sU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDN0UsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNyRCxDQUFDLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQWtDLEVBQVUsRUFBRTtZQUNoRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxF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VixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDdkMsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQzNDLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDO1FBQ3JELElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUNwRixDQUFDO0NBQ0Y7QUFyTkQsa0RBcU5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcclxuaW1wb3J0ICogYXMgYXBpZ2F0ZXdheXYyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djInO1xyXG5pbXBvcnQgKiBhcyBjb2RlYnVpbGQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XHJcbmltcG9ydCAqIGFzIGNyIGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xyXG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XHJcbmltcG9ydCAqIGFzIGVjciBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcclxuaW1wb3J0ICogYXMgZWNzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3MnO1xyXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XHJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xyXG5pbXBvcnQgKiBhcyByb3V0ZTUzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzJztcclxuaW1wb3J0ICogYXMgc2VydmljZWRpc2NvdmVyeSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VydmljZWRpc2NvdmVyeSc7XHJcbmltcG9ydCAqIGFzIHNlY3JldHNtYW5hZ2VyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XHJcbmltcG9ydCAqIGFzIHNzbSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3NtJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR21haWxWaWV3ZXJDZGtTdGFja1Byb3BzIGV4dGVuZHMgY2RrLlN0YWNrUHJvcHMge1xyXG4gIHJlYWRvbmx5IHZwY0lkPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IHByaXZhdGVTdWJuZXRzPzogc3RyaW5nW107XHJcbiAgcmVhZG9ubHkgcHVibGljU3VibmV0cz86IHN0cmluZ1tdO1xyXG4gIHJlYWRvbmx5IGNvbnRhaW5lclBvcnQ/OiBudW1iZXIgfCBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgY29udGFpbmVyQ3B1PzogbnVtYmVyIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGNvbnRhaW5lck1lbW9yeT86IG51bWJlciB8IHN0cmluZztcclxuICByZWFkb25seSBkZXNpcmVkQ291bnQ/OiBudW1iZXIgfCBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgY2VydGlmaWNhdGVBcm4/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgYXBpQ3VzdG9tRG9tYWluTmFtZT86IHN0cmluZztcclxuICByZWFkb25seSBob3N0ZWRab25lSWQ/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgc2VydmljZURpc2NvdmVyeU5hbWVzcGFjZU5hbWU/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgc2VydmljZURpc2NvdmVyeVR0bD86IG51bWJlciB8IHN0cmluZztcclxuICByZWFkb25seSBzc21QcmVmaXg/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgZ2l0SHViT3duZXI/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgZ2l0SHViUmVwbz86IHN0cmluZztcclxuICByZWFkb25seSBnaXRIdWJCcmFuY2g/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgcHVibGljRW52VmFsdWU/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgZ29vZ2xlQ2xpZW50SWQ/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgZ29vZ2xlQ2xpZW50U2VjcmV0Pzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IHNlc3Npb25TZWNyZXRWYWx1ZT86IHN0cmluZztcclxuICByZWFkb25seSB1c2VHaXRIdWJXZWJob29rcz86IGJvb2xlYW47XHJcbiAgcmVhZG9ubHkgY29kZUNvbm5lY3Rpb25Bcm4/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHbWFpbFZpZXdlckNka1N0YWNrIGV4dGVuZHMgY2RrLlN0YWNrIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgY2x1c3Rlck5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3NpdG9yeVVyaTogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBhcGlJbnZva2VVcmw6IHN0cmluZztcclxuICBwdWJsaWMgcmVhZG9ubHkgY2xvdWRNYXBTZXJ2aWNlQXJuOiBzdHJpbmc7XHJcblxyXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogY2RrLkFwcCwgaWQ6IHN0cmluZywgcHJvcHM6IEdtYWlsVmlld2VyQ2RrU3RhY2tQcm9wcykge1xyXG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XHJcblxyXG4gICAgY29uc3QgdG9OdW1iZXIgPSAodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciA9PiB7XHJcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlID8/IGZhbGxiYWNrO1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSB0eXBlb2YgY2FuZGlkYXRlID09PSAnbnVtYmVyJyA/IGNhbmRpZGF0ZSA6IE51bWJlcihjYW5kaWRhdGUpO1xyXG4gICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiBmYWxsYmFjaztcclxuICAgIH07XHJcbiAgICBjb25zdCB0b0NwdVVuaXRzID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgPT4ge1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSB0b051bWJlcih2YWx1ZSwgMC41KTtcclxuICAgICAgY29uc3QgdmNwdSA9IHBhcnNlZCA8PSA0ID8gcGFyc2VkICogMTAyNCA6IHBhcnNlZDtcclxuICAgICAgcmV0dXJuIE1hdGgubWF4KDI1NiwgTWF0aC5yb3VuZCh2Y3B1IC8gMjU2KSAqIDI1Nik7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHJlcG9QYXJ0cyA9IChwcm9jZXNzLmVudi5HSVRIVUJfUkVQT1NJVE9SWSA/PyAnJykuc3BsaXQoJy8nKTtcclxuICAgIGNvbnN0IGNvbnRhaW5lclBvcnQgPSB0b051bWJlcihwcm9wcy5jb250YWluZXJQb3J0LCAzMDAwKTtcclxuICAgIGNvbnN0IGNvbnRhaW5lckNwdSA9IHRvQ3B1VW5pdHMocHJvcHMuY29udGFpbmVyQ3B1KTtcclxuICAgIGNvbnN0IGNvbnRhaW5lck1lbW9yeSA9IHRvTnVtYmVyKHByb3BzLmNvbnRhaW5lck1lbW9yeSwgMTAyNCk7XHJcbiAgICBjb25zdCBkZXNpcmVkQ291bnQgPSB0b051bWJlcihwcm9wcy5kZXNpcmVkQ291bnQsIDEpO1xyXG4gICAgY29uc3QgbnNOYW1lID0gcHJvcHMuc2VydmljZURpc2NvdmVyeU5hbWVzcGFjZU5hbWUgPz8gJ21haWwubG9jYWwnO1xyXG4gICAgY29uc3QgbnNUdGwgPSBjZGsuRHVyYXRpb24uc2Vjb25kcyh0b051bWJlcihwcm9wcy5zZXJ2aWNlRGlzY292ZXJ5VHRsLCA2MCkpO1xyXG4gICAgY29uc3Qgc3NtUHJlZml4UmF3ID0gcHJvcHMuc3NtUHJlZml4ID8/ICcvbWFpbC1leGFtcGxlJztcclxuICAgIGNvbnN0IHNzbVByZWZpeCA9ICcvJyArIHNzbVByZWZpeFJhdy5zcGxpdCgnLycpLmZpbHRlcihwID0+IHApLmpvaW4oJy8nKTtcclxuICAgIGNvbnN0IGdpdEh1Yk93bmVyID0gcHJvcHMuZ2l0SHViT3duZXIgPz8gKHJlcG9QYXJ0c1swXSB8fCAnZHlhbmV0Jyk7XHJcbiAgICBjb25zdCBnaXRIdWJSZXBvID0gcHJvcHMuZ2l0SHViUmVwbyA/PyAocmVwb1BhcnRzWzFdIHx8ICdpbWFwJyk7XHJcbiAgICBjb25zdCBnaXRIdWJCcmFuY2ggPSBwcm9wcy5naXRIdWJCcmFuY2ggPz8gcHJvY2Vzcy5lbnYuR0lUSFVCX1JFRl9OQU1FID8/ICdtYWluJztcclxuICAgIGNvbnN0IHB1YmxpY0VudlZhbHVlID0gcHJvcHMucHVibGljRW52VmFsdWUgPz8gJ3Byb2R1Y3Rpb24nO1xyXG4gICAgY29uc3QgZ29vZ2xlQ2xpZW50SWQgPSBwcm9wcy5nb29nbGVDbGllbnRJZCB8fCAnUExBQ0VIT0xERVJfR09PR0xFX0NMSUVOVF9JRCc7XHJcbiAgICBjb25zdCBnb29nbGVDbGllbnRTZWNyZXQgPSBwcm9wcy5nb29nbGVDbGllbnRTZWNyZXQgfHwgJ1BMQUNFSE9MREVSX0dPT0dMRV9DTElFTlRfU0VDUkVUJztcclxuICAgIGNvbnN0IHNlc3Npb25TZWNyZXRWYWx1ZSA9IHByb3BzLnNlc3Npb25TZWNyZXRWYWx1ZSB8fCAnUExBQ0VIT0xERVJfU0VTU0lPTl9TRUNSRVQnO1xyXG4gICAgY29uc3QgYXBpRG9tYWluID0gcHJvcHMuYXBpQ3VzdG9tRG9tYWluTmFtZSA/PyBwcm9jZXNzLmVudi5BUElfQ1VTVE9NX0RPTUFJTiA/PyAnbWFpbC5keWFuZXQuY29tJztcclxuICAgIGNvbnN0IGNlcnRBcm4gPSBwcm9wcy5jZXJ0aWZpY2F0ZUFybiA/PyB0aGlzLm5vZGUudHJ5R2V0Q29udGV4dCgnY2VydGlmaWNhdGVBcm4nKSA/PyBwcm9jZXNzLmVudi5DRVJUSUZJQ0FURV9BUk47XHJcbiAgICBjb25zdCB6b25lSWQgPSBwcm9wcy5ob3N0ZWRab25lSWQgPz8gJyc7XHJcbiAgICBjb25zdCBoYXNDdXN0b21Eb21haW4gPSBCb29sZWFuKGNlcnRBcm4gJiYgYXBpRG9tYWluKTtcclxuICAgIGNvbnN0IGhhc0hvc3RlZFpvbmUgPSBCb29sZWFuKHpvbmVJZCk7XHJcbiAgICBjb25zdCB1c2VQdWJsaWNTdWJuZXRzID0gcHJvcHMucHVibGljU3VibmV0cyAmJiBwcm9wcy5wdWJsaWNTdWJuZXRzLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgLy8gVlBDIHNldHVwXHJcbiAgICBsZXQgdnBjOiBlYzIuSVZwYztcclxuICAgIGxldCBzZXJ2aWNlU3VibmV0SWRzOiBzdHJpbmdbXTtcclxuICAgIGNvbnN0IHVzZVZwY1BhcmFtZXRlciA9IHRoaXMubm9kZS50cnlHZXRDb250ZXh0KCd1c2VWcGNQYXJhbWV0ZXInKTtcclxuXHJcbiAgICBpZiAoIXVzZVZwY1BhcmFtZXRlciAmJiB0aGlzLmFjY291bnQgJiYgdGhpcy5yZWdpb24pIHtcclxuICAgICAgdnBjID0gZWMyLlZwYy5mcm9tTG9va3VwKHRoaXMsICdNYWlsVnBjJywgeyB0YWdzOiB7IE5hbWU6ICdkeWEtdnBjJyB9IH0pO1xyXG4gICAgICBpZiAodXNlUHVibGljU3VibmV0cykge1xyXG4gICAgICAgIHNlcnZpY2VTdWJuZXRJZHMgPSBwcm9wcy5wdWJsaWNTdWJuZXRzITtcclxuICAgICAgfSBlbHNlIGlmIChwcm9wcy5wcml2YXRlU3VibmV0cyAmJiBwcm9wcy5wcml2YXRlU3VibmV0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgc2VydmljZVN1Ym5ldElkcyA9IHByb3BzLnByaXZhdGVTdWJuZXRzO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGJhZEF6ID0gJ2NhYzEtYXo0JztcclxuICAgICAgICBsZXQgc3VibmV0cyA9IHZwYy5wcml2YXRlU3VibmV0cy5maWx0ZXIocyA9PiBzLmF2YWlsYWJpbGl0eVpvbmUgIT09IGJhZEF6KTtcclxuICAgICAgICBpZiAoc3VibmV0cy5sZW5ndGggPT09IDApIHN1Ym5ldHMgPSB2cGMucHVibGljU3VibmV0cy5maWx0ZXIocyA9PiBzLmF2YWlsYWJpbGl0eVpvbmUgIT09IGJhZEF6KTtcclxuICAgICAgICBzZXJ2aWNlU3VibmV0SWRzID0gc3VibmV0cy5zbGljZSgwLCAyKS5tYXAocyA9PiBzLnN1Ym5ldElkKTtcclxuICAgICAgICBpZiAoc2VydmljZVN1Ym5ldElkcy5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoYFZQQyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN1Ym5ldCBpbiBhbiBhbGxvd2VkIEFaLmApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB2cGNJZFBhcmFtID0gbmV3IGNkay5DZm5QYXJhbWV0ZXIodGhpcywgJ1ZwY0lkUGFyYW0nLCB7IHR5cGU6ICdBV1M6OkVDMjo6VlBDOjpJZCcsIGRlZmF1bHQ6IHByb3BzLnZwY0lkID8/ICcnIH0pO1xyXG4gICAgICBjb25zdCBzdWJuZXRQYXJhbSA9IG5ldyBjZGsuQ2ZuUGFyYW1ldGVyKHRoaXMsICdQcml2YXRlU3VibmV0SWRzUGFyYW0nLCB7IHR5cGU6ICdDb21tYURlbGltaXRlZExpc3QnLCBkZWZhdWx0OiBwcm9wcy5wcml2YXRlU3VibmV0cz8uam9pbignLCcpID8/ICcnIH0pO1xyXG4gICAgICB2cGMgPSBlYzIuVnBjLmZyb21WcGNBdHRyaWJ1dGVzKHRoaXMsICdNYWlsVnBjJywgeyB2cGNJZDogdnBjSWRQYXJhbS52YWx1ZUFzU3RyaW5nLCBhdmFpbGFiaWxpdHlab25lczogY2RrLkZuLmdldEF6cygpLCBwcml2YXRlU3VibmV0SWRzOiBzdWJuZXRQYXJhbS52YWx1ZUFzTGlzdCB9KTtcclxuICAgICAgc2VydmljZVN1Ym5ldElkcyA9IHByb3BzLnByaXZhdGVTdWJuZXRzID8/IHN1Ym5ldFBhcmFtLnZhbHVlQXNMaXN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNlY3VyaXR5IEdyb3VwcyAoTDIpXHJcbiAgICBjb25zdCBhcGlWcGNMaW5rU2cgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgJ0FwaVZwY0xpbmtTZWN1cml0eUdyb3VwJywgeyB2cGMsIGRlc2NyaXB0aW9uOiAnRWdyZXNzIGZyb20gQVBJIEdhdGV3YXkgVlBDIExpbmsnLCBhbGxvd0FsbE91dGJvdW5kOiBmYWxzZSB9KTtcclxuICAgIGFwaVZwY0xpbmtTZy5hZGRFZ3Jlc3NSdWxlKGVjMi5QZWVyLmFueUlwdjQoKSwgZWMyLlBvcnQudGNwKGNvbnRhaW5lclBvcnQpKTtcclxuXHJcbiAgICBjb25zdCBzZXJ2aWNlU2cgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgJ1NlcnZpY2VTZWN1cml0eUdyb3VwJywgeyB2cGMsIGRlc2NyaXB0aW9uOiAnQWxsb3cgdHJhZmZpYyB0byBGYXJnYXRlIHRhc2tzJywgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSB9KTtcclxuICAgIHNlcnZpY2VTZy5hZGRJbmdyZXNzUnVsZShlYzIuUGVlci5hbnlJcHY0KCksIGVjMi5Qb3J0LnRjcChjb250YWluZXJQb3J0KSk7XHJcblxyXG4gICAgLy8gTG9nIEdyb3VwIChMMilcclxuICAgIGNvbnN0IGFwcExvZ0dyb3VwID0gbmV3IGxvZ3MuTG9nR3JvdXAodGhpcywgJ0FwcExvZ0dyb3VwJywgeyBsb2dHcm91cE5hbWU6ICcvZWNzL21haWwtZXhhbXBsZScsIHJldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCwgcmVtb3ZhbFBvbGljeTogY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSB9KTtcclxuXHJcbiAgICAvLyBFQ1MgQ2x1c3RlciAoTDIpXHJcbiAgICBjb25zdCBjbHVzdGVyID0gbmV3IGVjcy5DbHVzdGVyKHRoaXMsICdNYWlsQ2x1c3RlcicsIHsgdnBjLCBjbHVzdGVyTmFtZTogJ3B1YmxpYy1jbHVzdGVyJywgZW5hYmxlRmFyZ2F0ZUNhcGFjaXR5UHJvdmlkZXJzOiB0cnVlIH0pO1xyXG5cclxuXHJcbiAgICAvLyBFQ1IgUmVwb3NpdG9yeSAtIGNyZWF0ZSBpZiBub3QgZXhpc3RzIHVzaW5nIGN1c3RvbSByZXNvdXJjZVxyXG4gICAgY29uc3QgZWNyUmVwb05hbWUgPSAnbWFpbC1leGFtcGxlJztcclxuICAgIGNvbnN0IGNoZWNrRWNyUmVwbyA9IG5ldyBjci5Bd3NDdXN0b21SZXNvdXJjZSh0aGlzLCAnQ2hlY2tFY3JSZXBvJywge1xyXG4gICAgICBvbkNyZWF0ZTogeyBzZXJ2aWNlOiAnRUNSJywgYWN0aW9uOiAnZGVzY3JpYmVSZXBvc2l0b3JpZXMnLCBwYXJhbWV0ZXJzOiB7IHJlcG9zaXRvcnlOYW1lczogW2VjclJlcG9OYW1lXSB9LCBwaHlzaWNhbFJlc291cmNlSWQ6IGNyLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihlY3JSZXBvTmFtZSkgfSxcclxuICAgICAgcG9saWN5OiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU2RrQ2FsbHMoeyByZXNvdXJjZXM6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LkFOWV9SRVNPVVJDRSB9KSxcclxuICAgIH0pO1xyXG4gICAgY29uc3QgY3JlYXRlRWNyUmVwbyA9IG5ldyBjci5Bd3NDdXN0b21SZXNvdXJjZSh0aGlzLCAnQ3JlYXRlRWNyUmVwbycsIHtcclxuICAgICAgb25DcmVhdGU6IHsgc2VydmljZTogJ0VDUicsIGFjdGlvbjogJ2NyZWF0ZVJlcG9zaXRvcnknLCBwYXJhbWV0ZXJzOiB7IHJlcG9zaXRvcnlOYW1lOiBlY3JSZXBvTmFtZSwgaW1hZ2VUYWdNdXRhYmlsaXR5OiAnTVVUQUJMRScsIGVuY3J5cHRpb25Db25maWd1cmF0aW9uOiB7IGVuY3J5cHRpb25UeXBlOiAnQUVTMjU2JyB9IH0sIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKGVjclJlcG9OYW1lKSwgaWdub3JlRXJyb3JDb2Rlc01hdGNoaW5nOiAnUmVwb3NpdG9yeUFscmVhZHlFeGlzdHNFeGNlcHRpb24nIH0sXHJcbiAgICAgIHBvbGljeTogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVNka0NhbGxzKHsgcmVzb3VyY2VzOiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5BTllfUkVTT1VSQ0UgfSksXHJcbiAgICB9KTtcclxuICAgIGNyZWF0ZUVjclJlcG8ubm9kZS5hZGREZXBlbmRlbmN5KGNoZWNrRWNyUmVwbyk7XHJcbiAgICBjb25zdCBlY3JSZXBvID0gZWNyLlJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlOYW1lKHRoaXMsICdNYWlsRXhhbXBsZVJlcG9zaXRvcnlSZWYnLCBlY3JSZXBvTmFtZSk7XHJcblxyXG4gICAgLy8gQVBJIEdhdGV3YXkgSFRUUCBBUEkgKEwxIC0gbm8gTDIgZm9yIEhUVFAgQVBJIHdpdGggVlBDIExpbmspXHJcbiAgICBjb25zdCBodHRwQXBpID0gbmV3IGFwaWdhdGV3YXl2Mi5DZm5BcGkodGhpcywgJ01haWxIdHRwQXBpJywgeyBuYW1lOiAnbWFpbC1leGFtcGxlJywgcHJvdG9jb2xUeXBlOiAnSFRUUCcgfSk7XHJcbiAgICBjb25zdCBhcGlTdGFnZSA9IG5ldyBhcGlnYXRld2F5djIuQ2ZuU3RhZ2UodGhpcywgJ01haWxBcGlTdGFnZScsIHsgc3RhZ2VOYW1lOiAncHJvZCcsIGFwaUlkOiBodHRwQXBpLnJlZiwgYXV0b0RlcGxveTogdHJ1ZSB9KTtcclxuXHJcbiAgICBjb25zdCBhcGlEb21haW5OYW1lID0gaGFzQ3VzdG9tRG9tYWluID8gbmV3IGFwaWdhdGV3YXl2Mi5DZm5Eb21haW5OYW1lKHRoaXMsICdBcGlEb21haW5OYW1lJywge1xyXG4gICAgICBkb21haW5OYW1lOiBhcGlEb21haW4sIGRvbWFpbk5hbWVDb25maWd1cmF0aW9uczogW3sgY2VydGlmaWNhdGVBcm46IGNlcnRBcm4hLCBlbmRwb2ludFR5cGU6ICdSRUdJT05BTCcsIHNlY3VyaXR5UG9saWN5OiAnVExTXzFfMicgfV0sXHJcbiAgICB9KSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdCBhcGlNYXBwaW5nID0gaGFzQ3VzdG9tRG9tYWluICYmIGFwaURvbWFpbk5hbWUgPyBuZXcgYXBpZ2F0ZXdheXYyLkNmbkFwaU1hcHBpbmcodGhpcywgJ0FwaU1hcHBpbmcnLCB7XHJcbiAgICAgIGFwaUlkOiBodHRwQXBpLnJlZiwgZG9tYWluTmFtZTogYXBpRG9tYWluTmFtZS5yZWYsIHN0YWdlOiBhcGlTdGFnZS5yZWYsIGFwaU1hcHBpbmdLZXk6ICdleGFtcGxlcycsXHJcbiAgICB9KSA6IHVuZGVmaW5lZDtcclxuICAgIGlmIChhcGlNYXBwaW5nICYmIGFwaURvbWFpbk5hbWUpIHsgYXBpTWFwcGluZy5hZGREZXBlbmRlbmN5KGFwaURvbWFpbk5hbWUpOyBhcGlNYXBwaW5nLmFkZERlcGVuZGVuY3koYXBpU3RhZ2UpOyB9XHJcblxyXG4gICAgY29uc3QgYXBpUmVjb3JkID0gaGFzQ3VzdG9tRG9tYWluICYmIGhhc0hvc3RlZFpvbmUgJiYgYXBpRG9tYWluTmFtZSA/IG5ldyByb3V0ZTUzLkNmblJlY29yZFNldCh0aGlzLCAnQXBpRG9tYWluUmVjb3JkJywge1xyXG4gICAgICBob3N0ZWRab25lSWQ6IHpvbmVJZCwgbmFtZTogYXBpRG9tYWluLCB0eXBlOiAnQScsIGFsaWFzVGFyZ2V0OiB7IGRuc05hbWU6IGFwaURvbWFpbk5hbWUuYXR0clJlZ2lvbmFsRG9tYWluTmFtZSwgaG9zdGVkWm9uZUlkOiBhcGlEb21haW5OYW1lLmF0dHJSZWdpb25hbEhvc3RlZFpvbmVJZCB9LFxyXG4gICAgfSkgOiB1bmRlZmluZWQ7XHJcbiAgICBpZiAoYXBpUmVjb3JkICYmIGFwaURvbWFpbk5hbWUpIGFwaVJlY29yZC5hZGREZXBlbmRlbmN5KGFwaURvbWFpbk5hbWUpO1xyXG5cclxuICAgIGNvbnN0IGJhc2VVcmwgPSBoYXNDdXN0b21Eb21haW4gPyBgaHR0cHM6Ly8ke2FwaURvbWFpbn0vZXhhbXBsZXMvZ21haWwtdmlld2VyYCA6IGNkay5Gbi5qb2luKCcnLCBbaHR0cEFwaS5hdHRyQXBpRW5kcG9pbnQsICcvJywgYXBpU3RhZ2UucmVmLCAnL2dtYWlsLXZpZXdlciddKTtcclxuXHJcbiAgICAvLyBDbG91ZCBNYXAgTmFtZXNwYWNlIChMMilcclxuICAgIGNvbnN0IG5hbWVzcGFjZSA9IG5ldyBzZXJ2aWNlZGlzY292ZXJ5LlByaXZhdGVEbnNOYW1lc3BhY2UodGhpcywgJ1NlcnZpY2VOYW1lc3BhY2UnLCB7IG5hbWU6IG5zTmFtZSwgdnBjLCBkZXNjcmlwdGlvbjogJ05hbWVzcGFjZSBmb3IgbWFpbCBzZXJ2aWNlcycgfSk7XHJcblxyXG4gICAgLy8gVlBDIExpbmsgKEwxKVxyXG4gICAgY29uc3QgdnBjTGluayA9IG5ldyBhcGlnYXRld2F5djIuQ2ZuVnBjTGluayh0aGlzLCAnQXBpVnBjTGluaycsIHsgbmFtZTogJ21haWwtZXhhbXBsZS12cGNsaW5rJywgc3VibmV0SWRzOiBzZXJ2aWNlU3VibmV0SWRzLCBzZWN1cml0eUdyb3VwSWRzOiBbYXBpVnBjTGlua1NnLnNlY3VyaXR5R3JvdXBJZF0gfSk7XHJcblxyXG4gICAgLy8gQ2xvdWQgTWFwIFNlcnZpY2UgKEwyKVxyXG4gICAgY29uc3QgY2xvdWRNYXBTZXJ2aWNlID0gbmV3IHNlcnZpY2VkaXNjb3ZlcnkuU2VydmljZSh0aGlzLCAnQXBwQ2xvdWRNYXBTZXJ2aWNlJywge1xyXG4gICAgICBuYW1lOiAnbWFpbC1leGFtcGxlJywgbmFtZXNwYWNlLCBkbnNSZWNvcmRUeXBlOiBzZXJ2aWNlZGlzY292ZXJ5LkRuc1JlY29yZFR5cGUuU1JWLCBkbnNUdGw6IG5zVHRsLCByb3V0aW5nUG9saWN5OiBzZXJ2aWNlZGlzY292ZXJ5LlJvdXRpbmdQb2xpY3kuV0VJR0hURUQsIGN1c3RvbUhlYWx0aENoZWNrOiB7IGZhaWx1cmVUaHJlc2hvbGQ6IDEgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNlY3JldHMgTWFuYWdlciAtIHNpbmdsZSBzZWNyZXQgd2l0aCBHT09HTEVfQ0xJRU5UX1NFQ1JFVCBhbmQgU0VTU0lPTl9TRUNSRVRcclxuICAgIGNvbnN0IGFwcFNlY3JldHMgPSBuZXcgc2VjcmV0c21hbmFnZXIuU2VjcmV0KHRoaXMsICdBcHBTZWNyZXRzJywge1xyXG4gICAgICBzZWNyZXROYW1lOiBgJHtzc21QcmVmaXh9L3NlY3JldHNgLFxyXG4gICAgICBkZXNjcmlwdGlvbjogJ0FwcGxpY2F0aW9uIHNlY3JldHMgZm9yIG1haWwtZXhhbXBsZScsXHJcbiAgICAgIHNlY3JldE9iamVjdFZhbHVlOiB7XHJcbiAgICAgICAgR09PR0xFX0NMSUVOVF9TRUNSRVQ6IGNkay5TZWNyZXRWYWx1ZS51bnNhZmVQbGFpblRleHQoZ29vZ2xlQ2xpZW50U2VjcmV0KSxcclxuICAgICAgICBTRVNTSU9OX1NFQ1JFVDogY2RrLlNlY3JldFZhbHVlLnVuc2FmZVBsYWluVGV4dChzZXNzaW9uU2VjcmV0VmFsdWUpLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gSUFNIFJvbGVzIChMMilcclxuICAgIGNvbnN0IHRhc2tFeGVjUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnVGFza0V4ZWN1dGlvblJvbGUnLCB7IGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdlY3MtdGFza3MuYW1hem9uYXdzLmNvbScpLCBtYW5hZ2VkUG9saWNpZXM6IFtpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BbWF6b25FQ1NUYXNrRXhlY3V0aW9uUm9sZVBvbGljeScpXSB9KTtcclxuICAgIHRhc2tFeGVjUm9sZS5hZGRUb1BvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7IGFjdGlvbnM6IFsnc3NtOkdldFBhcmFtZXRlcicsICdzc206R2V0UGFyYW1ldGVycycsICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsICdrbXM6RGVjcnlwdCddLCByZXNvdXJjZXM6IFtgYXJuOmF3czpzc206JHt0aGlzLnJlZ2lvbn06JHt0aGlzLmFjY291bnR9OnBhcmFtZXRlciR7c3NtUHJlZml4fSpgLCBgYXJuOmF3czprbXM6JHt0aGlzLnJlZ2lvbn06JHt0aGlzLmFjY291bnR9OmtleS8qYF0gfSkpO1xyXG4gICAgdGFza0V4ZWNSb2xlLmFkZFRvUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9uczogWydzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZSddLCByZXNvdXJjZXM6IFthcHBTZWNyZXRzLnNlY3JldEFybl0gfSkpO1xyXG5cclxuICAgIGNvbnN0IHRhc2tSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdUYXNrUm9sZScsIHsgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2Vjcy10YXNrcy5hbWF6b25hd3MuY29tJykgfSk7XHJcbiAgICB0YXNrUm9sZS5hZGRUb1BvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7IGFjdGlvbnM6IFsnc3NtOkdldFBhcmFtZXRlcicsICdzc206R2V0UGFyYW1ldGVycycsICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsICdrbXM6RGVjcnlwdCddLCByZXNvdXJjZXM6IFtgYXJuOmF3czpzc206JHt0aGlzLnJlZ2lvbn06JHt0aGlzLmFjY291bnR9OnBhcmFtZXRlciR7c3NtUHJlZml4fSpgLCBgYXJuOmF3czprbXM6JHt0aGlzLnJlZ2lvbn06JHt0aGlzLmFjY291bnR9OmtleS8qYF0gfSkpO1xyXG4gICAgdGFza1JvbGUuYWRkVG9Qb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zOiBbJ3NlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlJ10sIHJlc291cmNlczogW2FwcFNlY3JldHMuc2VjcmV0QXJuXSB9KSk7XHJcblxyXG4gICAgLy8gU1NNIFBhcmFtZXRlcnMgKEwyKSAtIGNyZWF0ZSBiZWZvcmUgdGFzayBkZWZpbml0aW9uIHNvIHRoZXkgY2FuIGJlIHJlZmVyZW5jZWRcclxuICAgIGNvbnN0IHNzbUJhc2VVcmwgPSBuZXcgc3NtLlN0cmluZ1BhcmFtZXRlcih0aGlzLCAnU3NtQmFzZVVybCcsIHsgcGFyYW1ldGVyTmFtZTogYCR7c3NtUHJlZml4fS9lbnYvQkFTRV9VUkxgLCBzdHJpbmdWYWx1ZTogYmFzZVVybC50b1N0cmluZygpIH0pO1xyXG4gICAgY29uc3Qgc3NtR29vZ2xlQ2xpZW50SWQgPSBuZXcgc3NtLlN0cmluZ1BhcmFtZXRlcih0aGlzLCAnU3NtR29vZ2xlQ2xpZW50SWQnLCB7IHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vZW52L0dPT0dMRV9DTElFTlRfSURgLCBzdHJpbmdWYWx1ZTogZ29vZ2xlQ2xpZW50SWQgfSk7XHJcbiAgICBuZXcgc3NtLlN0cmluZ1BhcmFtZXRlcih0aGlzLCAnU3NtUG9ydCcsIHsgcGFyYW1ldGVyTmFtZTogYCR7c3NtUHJlZml4fS9lbnYvUE9SVGAsIHN0cmluZ1ZhbHVlOiBjb250YWluZXJQb3J0LnRvU3RyaW5nKCkgfSk7XHJcbiAgICBuZXcgc3NtLlN0cmluZ1BhcmFtZXRlcih0aGlzLCAnU3NtUHVibGljRW52JywgeyBwYXJhbWV0ZXJOYW1lOiBgJHtzc21QcmVmaXh9L2Vudi9OT0RFX0VOVmAsIHN0cmluZ1ZhbHVlOiBwdWJsaWNFbnZWYWx1ZSB9KTtcclxuXHJcbiAgICAvLyBFQ1MgVGFzayBEZWZpbml0aW9uIChMMilcclxuICAgIGNvbnN0IHRhc2tEZWYgPSBuZXcgZWNzLkZhcmdhdGVUYXNrRGVmaW5pdGlvbih0aGlzLCAnQXBwVGFza0RlZmluaXRpb24nLCB7IGZhbWlseTogJ21haWwtZXhhbXBsZScsIGNwdTogY29udGFpbmVyQ3B1LCBtZW1vcnlMaW1pdE1pQjogY29udGFpbmVyTWVtb3J5LCBleGVjdXRpb25Sb2xlOiB0YXNrRXhlY1JvbGUsIHRhc2tSb2xlIH0pO1xyXG4gICAgdGFza0RlZi5hZGRDb250YWluZXIoJ21haWwtZXhhbXBsZScsIHtcclxuICAgICAgaW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZS5mcm9tRWNyUmVwb3NpdG9yeShlY3JSZXBvLCAnbGF0ZXN0JyksIHBvcnRNYXBwaW5nczogW3sgY29udGFpbmVyUG9ydCB9XSxcclxuICAgICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlcnMuYXdzTG9ncyh7IGxvZ0dyb3VwOiBhcHBMb2dHcm91cCwgc3RyZWFtUHJlZml4OiAnbWFpbC1leGFtcGxlJyB9KSxcclxuICAgICAgZW52aXJvbm1lbnQ6IHsgQ09ORklHX1NTTV9QUkVGSVg6IHNzbVByZWZpeCwgUE9SVDogY29udGFpbmVyUG9ydC50b1N0cmluZygpLCBCQVNFX1VSTDogYmFzZVVybC50b1N0cmluZygpLCBOT0RFX0VOVjogcHVibGljRW52VmFsdWUgfSxcclxuICAgICAgc2VjcmV0czoge1xyXG4gICAgICAgIEdPT0dMRV9DTElFTlRfSUQ6IGVjcy5TZWNyZXQuZnJvbVNzbVBhcmFtZXRlcihzc21Hb29nbGVDbGllbnRJZCksXHJcbiAgICAgICAgR09PR0xFX0NMSUVOVF9TRUNSRVQ6IGVjcy5TZWNyZXQuZnJvbVNlY3JldHNNYW5hZ2VyKGFwcFNlY3JldHMsICdHT09HTEVfQ0xJRU5UX1NFQ1JFVCcpLFxyXG4gICAgICAgIFNFU1NJT05fU0VDUkVUOiBlY3MuU2VjcmV0LmZyb21TZWNyZXRzTWFuYWdlcihhcHBTZWNyZXRzLCAnU0VTU0lPTl9TRUNSRVQnKSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEVDUyBTZXJ2aWNlIChMMikgLSBhc3NvY2lhdGUgd2l0aCBzdGFuZGFsb25lIENsb3VkIE1hcCBzZXJ2aWNlIGZvciBBUEkgR2F0ZXdheSBpbnRlZ3JhdGlvblxyXG4gICAgY29uc3Qgc2VydmljZSA9IG5ldyBlY3MuRmFyZ2F0ZVNlcnZpY2UodGhpcywgJ0FwcFNlcnZpY2UnLCB7XHJcbiAgICAgIHNlcnZpY2VOYW1lOiAnbWFpbC1leGFtcGxlJywgY2x1c3RlciwgdGFza0RlZmluaXRpb246IHRhc2tEZWYsIGRlc2lyZWRDb3VudCxcclxuICAgICAgY2FwYWNpdHlQcm92aWRlclN0cmF0ZWdpZXM6IFt7IGNhcGFjaXR5UHJvdmlkZXI6ICdGQVJHQVRFX1NQT1QnLCB3ZWlnaHQ6IDQgfSwgeyBjYXBhY2l0eVByb3ZpZGVyOiAnRkFSR0FURScsIHdlaWdodDogMSB9XSxcclxuICAgICAgdnBjU3VibmV0czogeyBzdWJuZXRzOiBzZXJ2aWNlU3VibmV0SWRzLm1hcCgoaWQsIGkpID0+IGVjMi5TdWJuZXQuZnJvbVN1Ym5ldElkKHRoaXMsIGBTZXJ2aWNlU3VibmV0JHtpfWAsIGlkKSkgfSxcclxuICAgICAgc2VjdXJpdHlHcm91cHM6IFtzZXJ2aWNlU2ddLCBhc3NpZ25QdWJsaWNJcDogdXNlUHVibGljU3VibmV0cyA/PyBmYWxzZSwgbWluSGVhbHRoeVBlcmNlbnQ6IDUwLCBtYXhIZWFsdGh5UGVyY2VudDogMjAwLFxyXG4gICAgfSk7XHJcbiAgICBzZXJ2aWNlLmFzc29jaWF0ZUNsb3VkTWFwU2VydmljZSh7IHNlcnZpY2U6IGNsb3VkTWFwU2VydmljZSwgY29udGFpbmVyUG9ydCwgY29udGFpbmVyOiB0YXNrRGVmLmRlZmF1bHRDb250YWluZXIhIH0pO1xyXG5cclxuICAgIC8vIEFQSSBHYXRld2F5IEludGVncmF0aW9uIChMMSlcclxuICAgIGNvbnN0IGludGVncmF0aW9uID0gbmV3IGFwaWdhdGV3YXl2Mi5DZm5JbnRlZ3JhdGlvbih0aGlzLCAnTWFpbEludGVncmF0aW9uJywgeyBhcGlJZDogaHR0cEFwaS5yZWYsIGludGVncmF0aW9uVHlwZTogJ0hUVFBfUFJPWFknLCBpbnRlZ3JhdGlvbk1ldGhvZDogJ0FOWScsIGludGVncmF0aW9uVXJpOiBjbG91ZE1hcFNlcnZpY2Uuc2VydmljZUFybiwgY29ubmVjdGlvblR5cGU6ICdWUENfTElOSycsIGNvbm5lY3Rpb25JZDogdnBjTGluay5yZWYsIHBheWxvYWRGb3JtYXRWZXJzaW9uOiAnMS4wJyB9KTtcclxuICAgIG5ldyBhcGlnYXRld2F5djIuQ2ZuUm91dGUodGhpcywgJ0dtYWlsVmlld2VyUm91dGUnLCB7IGFwaUlkOiBodHRwQXBpLnJlZiwgcm91dGVLZXk6ICdBTlkgL2dtYWlsLXZpZXdlcicsIHRhcmdldDogYGludGVncmF0aW9ucy8ke2ludGVncmF0aW9uLnJlZn1gIH0pO1xyXG4gICAgbmV3IGFwaWdhdGV3YXl2Mi5DZm5Sb3V0ZSh0aGlzLCAnR21haWxWaWV3ZXJQcm94eVJvdXRlJywgeyBhcGlJZDogaHR0cEFwaS5yZWYsIHJvdXRlS2V5OiAnQU5ZIC9nbWFpbC12aWV3ZXIve3Byb3h5K30nLCB0YXJnZXQ6IGBpbnRlZ3JhdGlvbnMvJHtpbnRlZ3JhdGlvbi5yZWZ9YCB9KTtcclxuXHJcbiAgICAvLyBDb2RlQnVpbGQgUm9sZSAoTDIpXHJcbiAgICBjb25zdCBidWlsZFJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ0NvZGVCdWlsZFJvbGUnLCB7IGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdjb2RlYnVpbGQuYW1hem9uYXdzLmNvbScpIH0pO1xyXG4gICAgYnVpbGRSb2xlLmFkZFRvUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9uczogWydsb2dzOkNyZWF0ZUxvZ0dyb3VwJywgJ2xvZ3M6Q3JlYXRlTG9nU3RyZWFtJywgJ2xvZ3M6UHV0TG9nRXZlbnRzJ10sIHJlc291cmNlczogWycqJ10gfSkpO1xyXG4gICAgYnVpbGRSb2xlLmFkZFRvUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9uczogWydlY3I6R2V0QXV0aG9yaXphdGlvblRva2VuJywgJ2VjcjpCYXRjaENoZWNrTGF5ZXJBdmFpbGFiaWxpdHknLCAnZWNyOkNvbXBsZXRlTGF5ZXJVcGxvYWQnLCAnZWNyOkJhdGNoR2V0SW1hZ2UnLCAnZWNyOkRlc2NyaWJlUmVwb3NpdG9yaWVzJywgJ2VjcjpJbml0aWF0ZUxheWVyVXBsb2FkJywgJ2VjcjpQdXRJbWFnZScsICdlY3I6VXBsb2FkTGF5ZXJQYXJ0J10sIHJlc291cmNlczogWycqJ10gfSkpO1xyXG4gICAgYnVpbGRSb2xlLmFkZFRvUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9uczogWydlY3M6VXBkYXRlU2VydmljZScsICdlY3M6RGVzY3JpYmVTZXJ2aWNlcycsICdlY3M6RGVzY3JpYmVDbHVzdGVycyddLCByZXNvdXJjZXM6IFsnKiddIH0pKTtcclxuICAgIGJ1aWxkUm9sZS5hZGRUb1BvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7IGFjdGlvbnM6IFsnc3NtOkdldFBhcmFtZXRlcicsICdzc206R2V0UGFyYW1ldGVycycsICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCddLCByZXNvdXJjZXM6IFsnKiddIH0pKTtcclxuICAgIGlmIChwcm9wcy5jb2RlQ29ubmVjdGlvbkFybikgYnVpbGRSb2xlLmFkZFRvUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9uczogWydjb2RlY29ubmVjdGlvbnM6R2V0Q29ubmVjdGlvbicsICdjb2RlY29ubmVjdGlvbnM6R2V0Q29ubmVjdGlvblRva2VuJywgJ2NvZGVjb25uZWN0aW9uczpVc2VDb25uZWN0aW9uJ10sIHJlc291cmNlczogW3Byb3BzLmNvZGVDb25uZWN0aW9uQXJuXSB9KSk7XHJcblxyXG4gICAgLy8gQ29kZUJ1aWxkIFByb2plY3QgKEwyKVxyXG4gICAgbmV3IGNvZGVidWlsZC5Qcm9qZWN0KHRoaXMsICdDb2RlQnVpbGRQcm9qZWN0Jywge1xyXG4gICAgICBwcm9qZWN0TmFtZTogJ21haWwtZXhhbXBsZScsIHJvbGU6IGJ1aWxkUm9sZSxcclxuICAgICAgZW52aXJvbm1lbnQ6IHsgYnVpbGRJbWFnZTogY29kZWJ1aWxkLkxpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF83XzAsIGNvbXB1dGVUeXBlOiBjb2RlYnVpbGQuQ29tcHV0ZVR5cGUuU01BTEwsIHByaXZpbGVnZWQ6IHRydWUsIGVudmlyb25tZW50VmFyaWFibGVzOiB7IEVDUl9VUkk6IHsgdmFsdWU6IGVjclJlcG8ucmVwb3NpdG9yeVVyaSB9LCBDTFVTVEVSX05BTUU6IHsgdmFsdWU6IGNsdXN0ZXIuY2x1c3Rlck5hbWUgfSwgU0VSVklDRV9OQU1FOiB7IHZhbHVlOiAnbWFpbC1leGFtcGxlJyB9IH0gfSxcclxuICAgICAgc291cmNlOiBjb2RlYnVpbGQuU291cmNlLmdpdEh1Yih7IG93bmVyOiBnaXRIdWJPd25lciwgcmVwbzogZ2l0SHViUmVwbywgYnJhbmNoT3JSZWY6IGdpdEh1YkJyYW5jaCB9KSxcclxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLCBxdWV1ZWRUaW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksIGJhZGdlOiB0cnVlLCBkZXNjcmlwdGlvbjogJ0J1aWxkICYgZGVwbG95IG1haWwtZXhhbXBsZSB0byBFQ1IgdGhlbiBmb3JjZSBFQ1MgZGVwbG95JyxcclxuICAgICAgYnVpbGRTcGVjOiBjb2RlYnVpbGQuQnVpbGRTcGVjLmZyb21PYmplY3Qoe1xyXG4gICAgICAgIHZlcnNpb246ICcwLjInLFxyXG4gICAgICAgIHBoYXNlczoge1xyXG4gICAgICAgICAgcHJlX2J1aWxkOiB7IGNvbW1hbmRzOiBbJ2VjaG8gXCJMb2dnaW5nIGluIHRvIEVDUlwiJywgJ2F3cyBlY3IgZ2V0LWxvZ2luLXBhc3N3b3JkIC0tcmVnaW9uICRBV1NfREVGQVVMVF9SRUdJT04gfCBkb2NrZXIgbG9naW4gLS11c2VybmFtZSBBV1MgLS1wYXNzd29yZC1zdGRpbiAkRUNSX1VSSScsICdJTUFHRV9UQUc9JHtDT0RFQlVJTERfUkVTT0xWRURfU09VUkNFX1ZFUlNJT046LWxhdGVzdH0nXSB9LFxyXG4gICAgICAgICAgYnVpbGQ6IHsgY29tbWFuZHM6IFsnY2QgZXhhbXBsZXMvZ21haWwtdmlld2VyJywgJ2RvY2tlciBidWlsZCAtdCAkRUNSX1VSSTpsYXRlc3QgLXQgJEVDUl9VUkk6JElNQUdFX1RBRyAuJ10gfSxcclxuICAgICAgICAgIHBvc3RfYnVpbGQ6IHsgY29tbWFuZHM6IFsnZG9ja2VyIHB1c2ggJEVDUl9VUkk6bGF0ZXN0JywgJ2RvY2tlciBwdXNoICRFQ1JfVVJJOiRJTUFHRV9UQUcnLCAnYXdzIGVjcyB1cGRhdGUtc2VydmljZSAtLWNsdXN0ZXIgJENMVVNURVJfTkFNRSAtLXNlcnZpY2UgJFNFUlZJQ0VfTkFNRSAtLWZvcmNlLW5ldy1kZXBsb3ltZW50J10gfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGFydGlmYWN0czogeyBmaWxlczogW10gfSwgZW52OiB7IHNoZWxsOiAnYmFzaCcgfSxcclxuICAgICAgfSksXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBPdXRwdXRzXHJcbiAgICB0aGlzLmNsdXN0ZXJOYW1lID0gY2x1c3Rlci5jbHVzdGVyTmFtZTtcclxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdDbHVzdGVyTmFtZScsIHsgdmFsdWU6IHRoaXMuY2x1c3Rlck5hbWUgfSk7XHJcbiAgICB0aGlzLnJlcG9zaXRvcnlVcmkgPSBlY3JSZXBvLnJlcG9zaXRvcnlVcmk7XHJcbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnUmVwb3NpdG9yeVVyaScsIHsgdmFsdWU6IHRoaXMucmVwb3NpdG9yeVVyaSB9KTtcclxuICAgIHRoaXMuYXBpSW52b2tlVXJsID0gYmFzZVVybC50b1N0cmluZygpO1xyXG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ0FwaUludm9rZVVybCcsIHsgdmFsdWU6IHRoaXMuYXBpSW52b2tlVXJsIH0pO1xyXG4gICAgdGhpcy5jbG91ZE1hcFNlcnZpY2VBcm4gPSBjbG91ZE1hcFNlcnZpY2Uuc2VydmljZUFybjtcclxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdDbG91ZE1hcFNlcnZpY2VBcm4nLCB7IHZhbHVlOiB0aGlzLmNsb3VkTWFwU2VydmljZUFybiB9KTtcclxuICB9XHJcbn1cclxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdtYWlsLXZpZXdlci1jZGstc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW1DO0FBQ25DLDJFQUE2RDtBQUM3RCxxRUFBdUQ7QUFDdkQsaUVBQW1EO0FBQ25ELHlEQUEyQztBQUMzQyx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLHlEQUEyQztBQUMzQywyREFBNkM7QUFDN0MsaUVBQW1EO0FBQ25ELG1GQUFxRTtBQUNyRSwrRUFBaUU7QUE0QmpFLE1BQWEsbUJBQW9CLFNBQVEsR0FBRyxDQUFDLEtBQUs7SUFDaEMsV0FBVyxDQUFTO0lBQ3BCLGFBQWEsQ0FBUztJQUN0QixZQUFZLENBQVM7SUFDckIsa0JBQWtCLENBQVM7SUFFM0MsWUFBbUIsS0FBYyxFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUM1RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWtDLEVBQUUsUUFBZ0IsRUFBVSxFQUFFO1lBQ2hGLE1BQU0sU0FBUyxHQUFHLEtBQUssSUFBSSxRQUFRLENBQUM7WUFDcEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxTQUFTLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3JELENBQUMsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBa0MsRUFBVSxFQUFFO1lBQ2hFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFD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QUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUM7UUFDckQsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7Q0FDRjtBQWxORCxrREFrTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xyXG5pbXBvcnQgKiBhcyBhcGlnYXRld2F5djIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2Mic7XHJcbmltcG9ydCAqIGFzIGNvZGVidWlsZCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkJztcclxuaW1wb3J0ICogYXMgY3IgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XHJcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcclxuaW1wb3J0ICogYXMgZWNyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xyXG5pbXBvcnQgKiBhcyBlY3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcyc7XHJcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcclxuaW1wb3J0ICogYXMgbG9ncyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XHJcbmltcG9ydCAqIGFzIHJvdXRlNTMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnO1xyXG5pbXBvcnQgKiBhcyBzZXJ2aWNlZGlzY292ZXJ5IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZXJ2aWNlZGlzY292ZXJ5JztcclxuaW1wb3J0ICogYXMgc2VjcmV0c21hbmFnZXIgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyJztcclxuaW1wb3J0ICogYXMgc3NtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHbWFpbFZpZXdlckNka1N0YWNrUHJvcHMgZXh0ZW5kcyBjZGsuU3RhY2tQcm9wcyB7XHJcbiAgcmVhZG9ubHkgdnBjSWQ/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgcHJpdmF0ZVN1Ym5ldHM/OiBzdHJpbmdbXTtcclxuICByZWFkb25seSBwdWJsaWNTdWJuZXRzPzogc3RyaW5nW107XHJcbiAgcmVhZG9ubHkgY29udGFpbmVyUG9ydD86IG51bWJlciB8IHN0cmluZztcclxuICByZWFkb25seSBjb250YWluZXJDcHU/OiBudW1iZXIgfCBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgY29udGFpbmVyTWVtb3J5PzogbnVtYmVyIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGRlc2lyZWRDb3VudD86IG51bWJlciB8IHN0cmluZztcclxuICByZWFkb25seSBjZXJ0aWZpY2F0ZUFybj86IHN0cmluZztcclxuICByZWFkb25seSBhcGlDdXN0b21Eb21haW5OYW1lPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVJZD86IHN0cmluZztcclxuICByZWFkb25seSBzZXJ2aWNlRGlzY292ZXJ5TmFtZXNwYWNlTmFtZT86IHN0cmluZztcclxuICByZWFkb25seSBzZXJ2aWNlRGlzY292ZXJ5VHRsPzogbnVtYmVyIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IHNzbVByZWZpeD86IHN0cmluZztcclxuICByZWFkb25seSBnaXRIdWJPd25lcj86IHN0cmluZztcclxuICByZWFkb25seSBnaXRIdWJSZXBvPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGdpdEh1YkJyYW5jaD86IHN0cmluZztcclxuICByZWFkb25seSBwdWJsaWNFbnZWYWx1ZT86IHN0cmluZztcclxuICByZWFkb25seSBnb29nbGVDbGllbnRJZD86IHN0cmluZztcclxuICByZWFkb25seSBnb29nbGVDbGllbnRTZWNyZXQ/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgc2Vzc2lvblNlY3JldFZhbHVlPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IHVzZUdpdEh1YldlYmhvb2tzPzogYm9vbGVhbjtcclxuICByZWFkb25seSBjb2RlQ29ubmVjdGlvbkFybj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdtYWlsVmlld2VyQ2RrU3RhY2sgZXh0ZW5kcyBjZGsuU3RhY2sge1xyXG4gIHB1YmxpYyByZWFkb25seSBjbHVzdGVyTmFtZTogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSByZXBvc2l0b3J5VXJpOiBzdHJpbmc7XHJcbiAgcHVibGljIHJlYWRvbmx5IGFwaUludm9rZVVybDogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBjbG91ZE1hcFNlcnZpY2VBcm46IHN0cmluZztcclxuXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBjZGsuQXBwLCBpZDogc3RyaW5nLCBwcm9wczogR21haWxWaWV3ZXJDZGtTdGFja1Byb3BzKSB7XHJcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcclxuXHJcbiAgICBjb25zdCB0b051bWJlciA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWUgPz8gZmFsbGJhY2s7XHJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHR5cGVvZiBjYW5kaWRhdGUgPT09ICdudW1iZXInID8gY2FuZGlkYXRlIDogTnVtYmVyKGNhbmRpZGF0ZSk7XHJcbiAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IGZhbGxiYWNrO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IHRvQ3B1VW5pdHMgPSAodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRvTnVtYmVyKHZhbHVlLCAwLjUpO1xyXG4gICAgICBjb25zdCB2Y3B1ID0gcGFyc2VkIDw9IDQgPyBwYXJzZWQgKiAxMDI0IDogcGFyc2VkO1xyXG4gICAgICByZXR1cm4gTWF0aC5tYXgoMjU2LCBNYXRoLnJvdW5kKHZjcHUgLyAyNTYpICogMjU2KTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgcmVwb1BhcnRzID0gKHByb2Nlc3MuZW52LkdJVEhVQl9SRVBPU0lUT1JZID8/ICcnKS5zcGxpdCgnLycpO1xyXG4gICAgY29uc3QgY29udGFpbmVyUG9ydCA9IHRvTnVtYmVyKHByb3BzLmNvbnRhaW5lclBvcnQsIDMwMDApO1xyXG4gICAgY29uc3QgY29udGFpbmVyQ3B1ID0gdG9DcHVVbml0cyhwcm9wcy5jb250YWluZXJDcHUpO1xyXG4gICAgY29uc3QgY29udGFpbmVyTWVtb3J5ID0gdG9OdW1iZXIocHJvcHMuY29udGFpbmVyTWVtb3J5LCAxMDI0KTtcclxuICAgIGNvbnN0IGRlc2lyZWRDb3VudCA9IHRvTnVtYmVyKHByb3BzLmRlc2lyZWRDb3VudCwgMSk7XHJcbiAgICBjb25zdCBuc05hbWUgPSBwcm9wcy5zZXJ2aWNlRGlzY292ZXJ5TmFtZXNwYWNlTmFtZSA/PyAnbWFpbC5sb2NhbCc7XHJcbiAgICBjb25zdCBuc1R0bCA9IGNkay5EdXJhdGlvbi5zZWNvbmRzKHRvTnVtYmVyKHByb3BzLnNlcnZpY2VEaXNjb3ZlcnlUdGwsIDYwKSk7XHJcbiAgICBjb25zdCBzc21QcmVmaXhSYXcgPSBwcm9wcy5zc21QcmVmaXggPz8gJy9tYWlsLWV4YW1wbGUnO1xyXG4gICAgY29uc3Qgc3NtUHJlZml4ID0gJy8nICsgc3NtUHJlZml4UmF3LnNwbGl0KCcvJykuZmlsdGVyKHAgPT4gcCkuam9pbignLycpO1xyXG4gICAgY29uc3QgZ2l0SHViT3duZXIgPSBwcm9wcy5naXRIdWJPd25lciA/PyAocmVwb1BhcnRzWzBdIHx8ICdkeWFuZXQnKTtcclxuICAgIGNvbnN0IGdpdEh1YlJlcG8gPSBwcm9wcy5naXRIdWJSZXBvID8/IChyZXBvUGFydHNbMV0gfHwgJ2ltYXAnKTtcclxuICAgIGNvbnN0IGdpdEh1YkJyYW5jaCA9IHByb3BzLmdpdEh1YkJyYW5jaCA/PyBwcm9jZXNzLmVudi5HSVRIVUJfUkVGX05BTUUgPz8gJ21haW4nO1xyXG4gICAgY29uc3QgcHVibGljRW52VmFsdWUgPSBwcm9wcy5wdWJsaWNFbnZWYWx1ZSA/PyAncHJvZHVjdGlvbic7XHJcbiAgICBjb25zdCBnb29nbGVDbGllbnRJZCA9IHByb3BzLmdvb2dsZUNsaWVudElkIHx8ICdQTEFDRUhPTERFUl9HT09HTEVfQ0xJRU5UX0lEJztcclxuICAgIGNvbnN0IGdvb2dsZUNsaWVudFNlY3JldCA9IHByb3BzLmdvb2dsZUNsaWVudFNlY3JldCB8fCAnUExBQ0VIT0xERVJfR09PR0xFX0NMSUVOVF9TRUNSRVQnO1xyXG4gICAgY29uc3Qgc2Vzc2lvblNlY3JldFZhbHVlID0gcHJvcHMuc2Vzc2lvblNlY3JldFZhbHVlIHx8ICdQTEFDRUhPTERFUl9TRVNTSU9OX1NFQ1JFVCc7XHJcbiAgICBjb25zdCBhcGlEb21haW4gPSBwcm9wcy5hcGlDdXN0b21Eb21haW5OYW1lID8/IHByb2Nlc3MuZW52LkFQSV9DVVNUT01fRE9NQUlOID8/ICdkZW1vLmR5YW5ldC5jb20nO1xyXG4gICAgY29uc3QgY2VydEFybiA9IHByb3BzLmNlcnRpZmljYXRlQXJuID8/IHRoaXMubm9kZS50cnlHZXRDb250ZXh0KCdjZXJ0aWZpY2F0ZUFybicpID8/IHByb2Nlc3MuZW52LkNFUlRJRklDQVRFX0FSTjtcclxuICAgIGNvbnN0IHpvbmVJZCA9IHByb3BzLmhvc3RlZFpvbmVJZCA/PyAnJztcclxuICAgIGNvbnN0IGhhc0N1c3RvbURvbWFpbiA9IEJvb2xlYW4oY2VydEFybiAmJiBhcGlEb21haW4pO1xyXG4gICAgY29uc3QgaGFzSG9zdGVkWm9uZSA9IEJvb2xlYW4oem9uZUlkKTtcclxuICAgIGNvbnN0IHVzZVB1YmxpY1N1Ym5ldHMgPSBwcm9wcy5wdWJsaWNTdWJuZXRzICYmIHByb3BzLnB1YmxpY1N1Ym5ldHMubGVuZ3RoID4gMDtcclxuXHJcbiAgICAvLyBWUEMgc2V0dXBcclxuICAgIGxldCB2cGM6IGVjMi5JVnBjO1xyXG4gICAgbGV0IHNlcnZpY2VTdWJuZXRJZHM6IHN0cmluZ1tdO1xyXG4gICAgY29uc3QgdXNlVnBjUGFyYW1ldGVyID0gdGhpcy5ub2RlLnRyeUdldENvbnRleHQoJ3VzZVZwY1BhcmFtZXRlcicpO1xyXG5cclxuICAgIGlmICghdXNlVnBjUGFyYW1ldGVyICYmIHRoaXMuYWNjb3VudCAmJiB0aGlzLnJlZ2lvbikge1xyXG4gICAgICB2cGMgPSBlYzIuVnBjLmZyb21Mb29rdXAodGhpcywgJ01haWxWcGMnLCB7IHRhZ3M6IHsgTmFtZTogJ2R5YS12cGMnIH0gfSk7XHJcbiAgICAgIGlmICh1c2VQdWJsaWNTdWJuZXRzKSB7XHJcbiAgICAgICAgc2VydmljZVN1Ym5ldElkcyA9IHByb3BzLnB1YmxpY1N1Ym5ldHMhO1xyXG4gICAgICB9IGVsc2UgaWYgKHByb3BzLnByaXZhdGVTdWJuZXRzICYmIHByb3BzLnByaXZhdGVTdWJuZXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBzZXJ2aWNlU3VibmV0SWRzID0gcHJvcHMucHJpdmF0ZVN1Ym5ldHM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgYmFkQXogPSAnY2FjMS1hejQnO1xyXG4gICAgICAgIGxldCBzdWJuZXRzID0gdnBjLnByaXZhdGVTdWJuZXRzLmZpbHRlcihzID0+IHMuYXZhaWxhYmlsaXR5Wm9uZSAhPT0gYmFkQXopO1xyXG4gICAgICAgIGlmIChzdWJuZXRzLmxlbmd0aCA9PT0gMCkgc3VibmV0cyA9IHZwYy5wdWJsaWNTdWJuZXRzLmZpbHRlcihzID0+IHMuYXZhaWxhYmlsaXR5Wm9uZSAhPT0gYmFkQXopO1xyXG4gICAgICAgIHNlcnZpY2VTdWJuZXRJZHMgPSBzdWJuZXRzLnNsaWNlKDAsIDIpLm1hcChzID0+IHMuc3VibmV0SWQpO1xyXG4gICAgICAgIGlmIChzZXJ2aWNlU3VibmV0SWRzLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihgVlBDIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3VibmV0IGluIGFuIGFsbG93ZWQgQVouYCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHZwY0lkUGFyYW0gPSBuZXcgY2RrLkNmblBhcmFtZXRlcih0aGlzLCAnVnBjSWRQYXJhbScsIHsgdHlwZTogJ0FXUzo6RUMyOjpWUEM6OklkJywgZGVmYXVsdDogcHJvcHMudnBjSWQgPz8gJycgfSk7XHJcbiAgICAgIGNvbnN0IHN1Ym5ldFBhcmFtID0gbmV3IGNkay5DZm5QYXJhbWV0ZXIodGhpcywgJ1ByaXZhdGVTdWJuZXRJZHNQYXJhbScsIHsgdHlwZTogJ0NvbW1hRGVsaW1pdGVkTGlzdCcsIGRlZmF1bHQ6IHByb3BzLnByaXZhdGVTdWJuZXRzPy5qb2luKCcsJykgPz8gJycgfSk7XHJcbiAgICAgIHZwYyA9IGVjMi5WcGMuZnJvbVZwY0F0dHJpYnV0ZXModGhpcywgJ01haWxWcGMnLCB7IHZwY0lkOiB2cGNJZFBhcmFtLnZhbHVlQXNTdHJpbmcsIGF2YWlsYWJpbGl0eVpvbmVzOiBjZGsuRm4uZ2V0QXpzKCksIHByaXZhdGVTdWJuZXRJZHM6IHN1Ym5ldFBhcmFtLnZhbHVlQXNMaXN0IH0pO1xyXG4gICAgICBzZXJ2aWNlU3VibmV0SWRzID0gcHJvcHMucHJpdmF0ZVN1Ym5ldHMgPz8gc3VibmV0UGFyYW0udmFsdWVBc0xpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2VjdXJpdHkgR3JvdXBzIChMMilcclxuICAgIGNvbnN0IGFwaVZwY0xpbmtTZyA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cCh0aGlzLCAnQXBpVnBjTGlua1NlY3VyaXR5R3JvdXAnLCB7IHZwYywgZGVzY3JpcHRpb246ICdFZ3Jlc3MgZnJvbSBBUEkgR2F0ZXdheSBWUEMgTGluaycsIGFsbG93QWxsT3V0Ym91bmQ6IGZhbHNlIH0pO1xyXG4gICAgYXBpVnBjTGlua1NnLmFkZEVncmVzc1J1bGUoZWMyLlBlZXIuYW55SXB2NCgpLCBlYzIuUG9ydC50Y3AoY29udGFpbmVyUG9ydCkpO1xyXG5cclxuICAgIGNvbnN0IHNlcnZpY2VTZyA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cCh0aGlzLCAnU2VydmljZVNlY3VyaXR5R3JvdXAnLCB7IHZwYywgZGVzY3JpcHRpb246ICdBbGxvdyB0cmFmZmljIHRvIEZhcmdhdGUgdGFza3MnLCBhbGxvd0FsbE91dGJvdW5kOiB0cnVlIH0pO1xyXG4gICAgc2VydmljZVNnLmFkZEluZ3Jlc3NSdWxlKGVjMi5QZWVyLmFueUlwdjQoKSwgZWMyLlBvcnQudGNwKGNvbnRhaW5lclBvcnQpKTtcclxuXHJcbiAgICAvLyBMb2cgR3JvdXAgKEwyKVxyXG4gICAgY29uc3QgYXBwTG9nR3JvdXAgPSBuZXcgbG9ncy5Mb2dHcm91cCh0aGlzLCAnQXBwTG9nR3JvdXAnLCB7IGxvZ0dyb3VwTmFtZTogJy9lY3MvbWFpbC1leGFtcGxlJywgcmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILCByZW1vdmFsUG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZIH0pO1xyXG5cclxuICAgIC8vIEVDUyBDbHVzdGVyIChMMilcclxuICAgIGNvbnN0IGNsdXN0ZXIgPSBuZXcgZWNzLkNsdXN0ZXIodGhpcywgJ01haWxDbHVzdGVyJywgeyB2cGMsIGNsdXN0ZXJOYW1lOiAncHVibGljLWNsdXN0ZXInLCBlbmFibGVGYXJnYXRlQ2FwYWNpdHlQcm92aWRlcnM6IHRydWUgfSk7XHJcblxyXG5cclxuICAgIC8vIEVDUiBSZXBvc2l0b3J5IC0gY3JlYXRlIGlmIG5vdCBleGlzdHMgdXNpbmcgY3VzdG9tIHJlc291cmNlXHJcbiAgICBjb25zdCBlY3JSZXBvTmFtZSA9ICdtYWlsLWV4YW1wbGUnO1xyXG4gICAgY29uc3QgY2hlY2tFY3JSZXBvID0gbmV3IGNyLkF3c0N1c3RvbVJlc291cmNlKHRoaXMsICdDaGVja0VjclJlcG8nLCB7XHJcbiAgICAgIG9uQ3JlYXRlOiB7IHNlcnZpY2U6ICdFQ1InLCBhY3Rpb246ICdkZXNjcmliZVJlcG9zaXRvcmllcycsIHBhcmFtZXRlcnM6IHsgcmVwb3NpdG9yeU5hbWVzOiBbZWNyUmVwb05hbWVdIH0sIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKGVjclJlcG9OYW1lKSB9LFxyXG4gICAgICBwb2xpY3k6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TZGtDYWxscyh7IHJlc291cmNlczogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuQU5ZX1JFU09VUkNFIH0pLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjcmVhdGVFY3JSZXBvID0gbmV3IGNyLkF3c0N1c3RvbVJlc291cmNlKHRoaXMsICdDcmVhdGVFY3JSZXBvJywge1xyXG4gICAgICBvbkNyZWF0ZTogeyBzZXJ2aWNlOiAnRUNSJywgYWN0aW9uOiAnY3JlYXRlUmVwb3NpdG9yeScsIHBhcmFtZXRlcnM6IHsgcmVwb3NpdG9yeU5hbWU6IGVjclJlcG9OYW1lLCBpbWFnZVRhZ011dGFiaWxpdHk6ICdNVVRBQkxFJywgZW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IHsgZW5jcnlwdGlvblR5cGU6ICdBRVMyNTYnIH0gfSwgcGh5c2ljYWxSZXNvdXJjZUlkOiBjci5QaHlzaWNhbFJlc291cmNlSWQub2YoZWNyUmVwb05hbWUpLCBpZ25vcmVFcnJvckNvZGVzTWF0Y2hpbmc6ICdSZXBvc2l0b3J5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbicgfSxcclxuICAgICAgcG9saWN5OiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU2RrQ2FsbHMoeyByZXNvdXJjZXM6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LkFOWV9SRVNPVVJDRSB9KSxcclxuICAgIH0pO1xyXG4gICAgY3JlYXRlRWNyUmVwby5ub2RlLmFkZERlcGVuZGVuY3koY2hlY2tFY3JSZXBvKTtcclxuICAgIGNvbnN0IGVjclJlcG8gPSBlY3IuUmVwb3NpdG9yeS5mcm9tUmVwb3NpdG9yeU5hbWUodGhpcywgJ01haWxFeGFtcGxlUmVwb3NpdG9yeVJlZicsIGVjclJlcG9OYW1lKTtcclxuXHJcbiAgICAvLyBBUEkgR2F0ZXdheSBIVFRQIEFQSSAoTDEgLSBubyBMMiBmb3IgSFRUUCBBUEkgd2l0aCBWUEMgTGluaylcclxuICAgIGNvbnN0IGh0dHBBcGkgPSBuZXcgYXBpZ2F0ZXdheXYyLkNmbkFwaSh0aGlzLCAnTWFpbEh0dHBBcGknLCB7IG5hbWU6ICdtYWlsLWV4YW1wbGUnLCBwcm90b2NvbFR5cGU6ICdIVFRQJyB9KTtcclxuICAgIGNvbnN0IGFwaVN0YWdlID0gbmV3IGFwaWdhdGV3YXl2Mi5DZm5TdGFnZSh0aGlzLCAnTWFpbEFwaVN0YWdlJywgeyBzdGFnZU5hbWU6ICdwcm9kJywgYXBpSWQ6IGh0dHBBcGkucmVmLCBhdXRvRGVwbG95OiB0cnVlIH0pO1xyXG5cclxuICAgIGNvbnN0IGFwaURvbWFpbk5hbWUgPSBoYXNDdXN0b21Eb21haW4gPyBuZXcgYXBpZ2F0ZXdheXYyLkNmbkRvbWFpbk5hbWUodGhpcywgJ0FwaURvbWFpbk5hbWUnLCB7XHJcbiAgICAgIGRvbWFpbk5hbWU6IGFwaURvbWFpbiwgZG9tYWluTmFtZUNvbmZpZ3VyYXRpb25zOiBbeyBjZXJ0aWZpY2F0ZUFybjogY2VydEFybiEsIGVuZHBvaW50VHlwZTogJ1JFR0lPTkFMJywgc2VjdXJpdHlQb2xpY3k6ICdUTFNfMV8yJyB9XSxcclxuICAgIH0pIDogdW5kZWZpbmVkO1xyXG5cclxuICAgIGNvbnN0IGFwaU1hcHBpbmcgPSBoYXNDdXN0b21Eb21haW4gJiYgYXBpRG9tYWluTmFtZSA/IG5ldyBhcGlnYXRld2F5djIuQ2ZuQXBpTWFwcGluZyh0aGlzLCAnQXBpTWFwcGluZycsIHtcclxuICAgICAgYXBpSWQ6IGh0dHBBcGkucmVmLCBkb21haW5OYW1lOiBhcGlEb21haW5OYW1lLnJlZiwgc3RhZ2U6IGFwaVN0YWdlLnJlZiwgYXBpTWFwcGluZ0tleTogJ2V4YW1wbGVzJyxcclxuICAgIH0pIDogdW5kZWZpbmVkO1xyXG4gICAgaWYgKGFwaU1hcHBpbmcgJiYgYXBpRG9tYWluTmFtZSkgeyBhcGlNYXBwaW5nLmFkZERlcGVuZGVuY3koYXBpRG9tYWluTmFtZSk7IGFwaU1hcHBpbmcuYWRkRGVwZW5kZW5jeShhcGlTdGFnZSk7IH1cclxuXHJcbiAgICBjb25zdCBhcGlSZWNvcmQgPSBoYXNDdXN0b21Eb21haW4gJiYgaGFzSG9zdGVkWm9uZSAmJiBhcGlEb21haW5OYW1lID8gbmV3IHJvdXRlNTMuQ2ZuUmVjb3JkU2V0KHRoaXMsICdBcGlEb21haW5SZWNvcmQnLCB7XHJcbiAgICAgIGhvc3RlZFpvbmVJZDogem9uZUlkLCBuYW1lOiBhcGlEb21haW4sIHR5cGU6ICdBJywgYWxpYXNUYXJnZXQ6IHsgZG5zTmFtZTogYXBpRG9tYWluTmFtZS5hdHRyUmVnaW9uYWxEb21haW5OYW1lLCBob3N0ZWRab25lSWQ6IGFwaURvbWFpbk5hbWUuYXR0clJlZ2lvbmFsSG9zdGVkWm9uZUlkIH0sXHJcbiAgICB9KSA6IHVuZGVmaW5lZDtcclxuICAgIGlmIChhcGlSZWNvcmQgJiYgYXBpRG9tYWluTmFtZSkgYXBpUmVjb3JkLmFkZERlcGVuZGVuY3koYXBpRG9tYWluTmFtZSk7XHJcblxyXG4gICAgY29uc3QgYmFzZVVybCA9IGhhc0N1c3RvbURvbWFpbiA/IGBodHRwczovLyR7YXBpRG9tYWlufS9leGFtcGxlcy9nbWFpbC12aWV3ZXJgIDogY2RrLkZuLmpvaW4oJycsIFtodHRwQXBpLmF0dHJBcGlFbmRwb2ludCwgJy8nLCBhcGlTdGFnZS5yZWYsICcvZ21haWwtdmlld2VyJ10pO1xyXG5cclxuICAgIC8vIENsb3VkIE1hcCBOYW1lc3BhY2UgKEwyKVxyXG4gICAgY29uc3QgbmFtZXNwYWNlID0gbmV3IHNlcnZpY2VkaXNjb3ZlcnkuUHJpdmF0ZURuc05hbWVzcGFjZSh0aGlzLCAnU2VydmljZU5hbWVzcGFjZScsIHsgbmFtZTogbnNOYW1lLCB2cGMsIGRlc2NyaXB0aW9uOiAnTmFtZXNwYWNlIGZvciBtYWlsIHNlcnZpY2VzJyB9KTtcclxuXHJcbiAgICAvLyBWUEMgTGluayAoTDEpXHJcbiAgICBjb25zdCB2cGNMaW5rID0gbmV3IGFwaWdhdGV3YXl2Mi5DZm5WcGNMaW5rKHRoaXMsICdBcGlWcGNMaW5rJywgeyBuYW1lOiAnbWFpbC1leGFtcGxlLXZwY2xpbmsnLCBzdWJuZXRJZHM6IHNlcnZpY2VTdWJuZXRJZHMsIHNlY3VyaXR5R3JvdXBJZHM6IFthcGlWcGNMaW5rU2cuc2VjdXJpdHlHcm91cElkXSB9KTtcclxuXHJcbiAgICAvLyBDbG91ZCBNYXAgU2VydmljZSAoTDIpXHJcbiAgICBjb25zdCBjbG91ZE1hcFNlcnZpY2UgPSBuZXcgc2VydmljZWRpc2NvdmVyeS5TZXJ2aWNlKHRoaXMsICdBcHBDbG91ZE1hcFNlcnZpY2UnLCB7XHJcbiAgICAgIG5hbWU6ICdtYWlsLWV4YW1wbGUnLCBuYW1lc3BhY2UsIGRuc1JlY29yZFR5cGU6IHNlcnZpY2VkaXNjb3ZlcnkuRG5zUmVjb3JkVHlwZS5TUlYsIGRuc1R0bDogbnNUdGwsIHJvdXRpbmdQb2xpY3k6IHNlcnZpY2VkaXNjb3ZlcnkuUm91dGluZ1BvbGljeS5XRUlHSFRFRCwgY3VzdG9tSGVhbHRoQ2hlY2s6IHsgZmFpbHVyZVRocmVzaG9sZDogMSB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU2VjcmV0cyBNYW5hZ2VyIC0gYWxsIGNvbmZpZyB2YWx1ZXMgZm9yIHRoZSBhcHBsaWNhdGlvblxyXG4gICAgY29uc3QgYXBwU2VjcmV0cyA9IG5ldyBzZWNyZXRzbWFuYWdlci5TZWNyZXQodGhpcywgJ0FwcFNlY3JldHMnLCB7XHJcbiAgICAgIHNlY3JldE5hbWU6IGAke3NzbVByZWZpeH0vY29uZmlnYCxcclxuICAgICAgZGVzY3JpcHRpb246ICdBcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGZvciBtYWlsLWV4YW1wbGUnLFxyXG4gICAgICBzZWNyZXRPYmplY3RWYWx1ZToge1xyXG4gICAgICAgIEdPT0dMRV9DTElFTlRfSUQ6IGNkay5TZWNyZXRWYWx1ZS51bnNhZmVQbGFpblRleHQoZ29vZ2xlQ2xpZW50SWQpLFxyXG4gICAgICAgIEdPT0dMRV9DTElFTlRfU0VDUkVUOiBjZGsuU2VjcmV0VmFsdWUudW5zYWZlUGxhaW5UZXh0KGdvb2dsZUNsaWVudFNlY3JldCksXHJcbiAgICAgICAgU0VTU0lPTl9TRUNSRVQ6IGNkay5TZWNyZXRWYWx1ZS51bnNhZmVQbGFpblRleHQoc2Vzc2lvblNlY3JldFZhbHVlKSxcclxuICAgICAgICBCQVNFX1VSTDogY2RrLlNlY3JldFZhbHVlLnVuc2FmZVBsYWluVGV4dChiYXNlVXJsLnRvU3RyaW5nKCkpLFxyXG4gICAgICAgIFBPUlQ6IGNkay5TZWNyZXRWYWx1ZS51bnNhZmVQbGFpblRleHQoY29udGFpbmVyUG9ydC50b1N0cmluZygpKSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIElBTSBSb2xlcyAoTDIpXHJcbiAgICBjb25zdCB0YXNrRXhlY1JvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ1Rhc2tFeGVjdXRpb25Sb2xlJywgeyBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZWNzLXRhc2tzLmFtYXpvbmF3cy5jb20nKSwgbWFuYWdlZFBvbGljaWVzOiBbaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdzZXJ2aWNlLXJvbGUvQW1hem9uRUNTVGFza0V4ZWN1dGlvblJvbGVQb2xpY3knKV0gfSk7XHJcbiAgICB0YXNrRXhlY1JvbGUuYWRkVG9Qb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zOiBbJ3NzbTpHZXRQYXJhbWV0ZXInLCAnc3NtOkdldFBhcmFtZXRlcnMnLCAnc3NtOkdldFBhcmFtZXRlcnNCeVBhdGgnLCAna21zOkRlY3J5cHQnXSwgcmVzb3VyY2VzOiBbYGFybjphd3M6c3NtOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTpwYXJhbWV0ZXIke3NzbVByZWZpeH0qYCwgYGFybjphd3M6a21zOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTprZXkvKmBdIH0pKTtcclxuICAgIHRhc2tFeGVjUm9sZS5hZGRUb1BvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7IGFjdGlvbnM6IFsnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnXSwgcmVzb3VyY2VzOiBbYXBwU2VjcmV0cy5zZWNyZXRBcm5dIH0pKTtcclxuXHJcbiAgICBjb25zdCB0YXNrUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnVGFza1JvbGUnLCB7IGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdlY3MtdGFza3MuYW1hem9uYXdzLmNvbScpIH0pO1xyXG4gICAgdGFza1JvbGUuYWRkVG9Qb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zOiBbJ3NzbTpHZXRQYXJhbWV0ZXInLCAnc3NtOkdldFBhcmFtZXRlcnMnLCAnc3NtOkdldFBhcmFtZXRlcnNCeVBhdGgnLCAna21zOkRlY3J5cHQnXSwgcmVzb3VyY2VzOiBbYGFybjphd3M6c3NtOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTpwYXJhbWV0ZXIke3NzbVByZWZpeH0qYCwgYGFybjphd3M6a21zOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTprZXkvKmBdIH0pKTtcclxuICAgIHRhc2tSb2xlLmFkZFRvUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9uczogWydzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZSddLCByZXNvdXJjZXM6IFthcHBTZWNyZXRzLnNlY3JldEFybl0gfSkpO1xyXG5cclxuICAgIC8vIEVDUyBUYXNrIERlZmluaXRpb24gKEwyKVxyXG4gICAgY29uc3QgdGFza0RlZiA9IG5ldyBlY3MuRmFyZ2F0ZVRhc2tEZWZpbml0aW9uKHRoaXMsICdBcHBUYXNrRGVmaW5pdGlvbicsIHsgZmFtaWx5OiAnbWFpbC1leGFtcGxlJywgY3B1OiBjb250YWluZXJDcHUsIG1lbW9yeUxpbWl0TWlCOiBjb250YWluZXJNZW1vcnksIGV4ZWN1dGlvblJvbGU6IHRhc2tFeGVjUm9sZSwgdGFza1JvbGUgfSk7XHJcbiAgICB0YXNrRGVmLmFkZENvbnRhaW5lcignbWFpbC1leGFtcGxlJywge1xyXG4gICAgICBpbWFnZTogZWNzLkNvbnRhaW5lckltYWdlLmZyb21FY3JSZXBvc2l0b3J5KGVjclJlcG8sICdsYXRlc3QnKSwgcG9ydE1hcHBpbmdzOiBbeyBjb250YWluZXJQb3J0IH1dLFxyXG4gICAgICBsb2dnaW5nOiBlY3MuTG9nRHJpdmVycy5hd3NMb2dzKHsgbG9nR3JvdXA6IGFwcExvZ0dyb3VwLCBzdHJlYW1QcmVmaXg6ICdtYWlsLWV4YW1wbGUnIH0pLFxyXG4gICAgICBlbnZpcm9ubWVudDogeyBDT05GSUdfU1NNX1BSRUZJWDogc3NtUHJlZml4LCBQT1JUOiBjb250YWluZXJQb3J0LnRvU3RyaW5nKCksIEJBU0VfVVJMOiBiYXNlVXJsLnRvU3RyaW5nKCksIE5PREVfRU5WOiBwdWJsaWNFbnZWYWx1ZSB9LFxyXG4gICAgICBzZWNyZXRzOiB7XHJcbiAgICAgICAgR09PR0xFX0NMSUVOVF9JRDogZWNzLlNlY3JldC5mcm9tU2VjcmV0c01hbmFnZXIoYXBwU2VjcmV0cywgJ0dPT0dMRV9DTElFTlRfSUQnKSxcclxuICAgICAgICBHT09HTEVfQ0xJRU5UX1NFQ1JFVDogZWNzLlNlY3JldC5mcm9tU2VjcmV0c01hbmFnZXIoYXBwU2VjcmV0cywgJ0dPT0dMRV9DTElFTlRfU0VDUkVUJyksXHJcbiAgICAgICAgU0VTU0lPTl9TRUNSRVQ6IGVjcy5TZWNyZXQuZnJvbVNlY3JldHNNYW5hZ2VyKGFwcFNlY3JldHMsICdTRVNTSU9OX1NFQ1JFVCcpLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gRUNTIFNlcnZpY2UgKEwyKSAtIGFzc29jaWF0ZSB3aXRoIHN0YW5kYWxvbmUgQ2xvdWQgTWFwIHNlcnZpY2UgZm9yIEFQSSBHYXRld2F5IGludGVncmF0aW9uXHJcbiAgICBjb25zdCBzZXJ2aWNlID0gbmV3IGVjcy5GYXJnYXRlU2VydmljZSh0aGlzLCAnQXBwU2VydmljZScsIHtcclxuICAgICAgc2VydmljZU5hbWU6ICdtYWlsLWV4YW1wbGUnLCBjbHVzdGVyLCB0YXNrRGVmaW5pdGlvbjogdGFza0RlZiwgZGVzaXJlZENvdW50LFxyXG4gICAgICBjYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ2llczogW3sgY2FwYWNpdHlQcm92aWRlcjogJ0ZBUkdBVEVfU1BPVCcsIHdlaWdodDogNCB9LCB7IGNhcGFjaXR5UHJvdmlkZXI6ICdGQVJHQVRFJywgd2VpZ2h0OiAxIH1dLFxyXG4gICAgICB2cGNTdWJuZXRzOiB7IHN1Ym5ldHM6IHNlcnZpY2VTdWJuZXRJZHMubWFwKChpZCwgaSkgPT4gZWMyLlN1Ym5ldC5mcm9tU3VibmV0SWQodGhpcywgYFNlcnZpY2VTdWJuZXQke2l9YCwgaWQpKSB9LFxyXG4gICAgICBzZWN1cml0eUdyb3VwczogW3NlcnZpY2VTZ10sIGFzc2lnblB1YmxpY0lwOiB1c2VQdWJsaWNTdWJuZXRzID8/IGZhbHNlLCBtaW5IZWFsdGh5UGVyY2VudDogNTAsIG1heEhlYWx0aHlQZXJjZW50OiAyMDAsXHJcbiAgICB9KTtcclxuICAgIHNlcnZpY2UuYXNzb2NpYXRlQ2xvdWRNYXBTZXJ2aWNlKHsgc2VydmljZTogY2xvdWRNYXBTZXJ2aWNlLCBjb250YWluZXJQb3J0LCBjb250YWluZXI6IHRhc2tEZWYuZGVmYXVsdENvbnRhaW5lciEgfSk7XHJcblxyXG4gICAgLy8gQVBJIEdhdGV3YXkgSW50ZWdyYXRpb24gKEwxKVxyXG4gICAgY29uc3QgaW50ZWdyYXRpb24gPSBuZXcgYXBpZ2F0ZXdheXYyLkNmbkludGVncmF0aW9uKHRoaXMsICdNYWlsSW50ZWdyYXRpb24nLCB7IGFwaUlkOiBodHRwQXBpLnJlZiwgaW50ZWdyYXRpb25UeXBlOiAnSFRUUF9QUk9YWScsIGludGVncmF0aW9uTWV0aG9kOiAnQU5ZJywgaW50ZWdyYXRpb25Vcmk6IGNsb3VkTWFwU2VydmljZS5zZXJ2aWNlQXJuLCBjb25uZWN0aW9uVHlwZTogJ1ZQQ19MSU5LJywgY29ubmVjdGlvbklkOiB2cGNMaW5rLnJlZiwgcGF5bG9hZEZvcm1hdFZlcnNpb246ICcxLjAnIH0pO1xyXG4gICAgbmV3IGFwaWdhdGV3YXl2Mi5DZm5Sb3V0ZSh0aGlzLCAnR21haWxWaWV3ZXJSb3V0ZScsIHsgYXBpSWQ6IGh0dHBBcGkucmVmLCByb3V0ZUtleTogJ0FOWSAvZ21haWwtdmlld2VyJywgdGFyZ2V0OiBgaW50ZWdyYXRpb25zLyR7aW50ZWdyYXRpb24ucmVmfWAgfSk7XHJcbiAgICBuZXcgYXBpZ2F0ZXdheXYyLkNmblJvdXRlKHRoaXMsICdHbWFpbFZpZXdlclByb3h5Um91dGUnLCB7IGFwaUlkOiBodHRwQXBpLnJlZiwgcm91dGVLZXk6ICdBTlkgL2dtYWlsLXZpZXdlci97cHJveHkrfScsIHRhcmdldDogYGludGVncmF0aW9ucy8ke2ludGVncmF0aW9uLnJlZn1gIH0pO1xyXG5cclxuICAgIC8vIENvZGVCdWlsZCBSb2xlIChMMilcclxuICAgIGNvbnN0IGJ1aWxkUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnQ29kZUJ1aWxkUm9sZScsIHsgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2NvZGVidWlsZC5hbWF6b25hd3MuY29tJykgfSk7XHJcbiAgICBidWlsZFJvbGUuYWRkVG9Qb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zOiBbJ2xvZ3M6Q3JlYXRlTG9nR3JvdXAnLCAnbG9nczpDcmVhdGVMb2dTdHJlYW0nLCAnbG9nczpQdXRMb2dFdmVudHMnXSwgcmVzb3VyY2VzOiBbJyonXSB9KSk7XHJcbiAgICBidWlsZFJvbGUuYWRkVG9Qb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zOiBbJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLCAnZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eScsICdlY3I6Q29tcGxldGVMYXllclVwbG9hZCcsICdlY3I6QmF0Y2hHZXRJbWFnZScsICdlY3I6RGVzY3JpYmVSZXBvc2l0b3JpZXMnLCAnZWNyOkluaXRpYXRlTGF5ZXJVcGxvYWQnLCAnZWNyOlB1dEltYWdlJywgJ2VjcjpVcGxvYWRMYXllclBhcnQnXSwgcmVzb3VyY2VzOiBbJyonXSB9KSk7XHJcbiAgICBidWlsZFJvbGUuYWRkVG9Qb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zOiBbJ2VjczpVcGRhdGVTZXJ2aWNlJywgJ2VjczpEZXNjcmliZVNlcnZpY2VzJywgJ2VjczpEZXNjcmliZUNsdXN0ZXJzJ10sIHJlc291cmNlczogWycqJ10gfSkpO1xyXG4gICAgYnVpbGRSb2xlLmFkZFRvUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9uczogWydzc206R2V0UGFyYW1ldGVyJywgJ3NzbTpHZXRQYXJhbWV0ZXJzJywgJ3NzbTpHZXRQYXJhbWV0ZXJzQnlQYXRoJ10sIHJlc291cmNlczogWycqJ10gfSkpO1xyXG4gICAgaWYgKHByb3BzLmNvZGVDb25uZWN0aW9uQXJuKSBidWlsZFJvbGUuYWRkVG9Qb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zOiBbJ2NvZGVjb25uZWN0aW9uczpHZXRDb25uZWN0aW9uJywgJ2NvZGVjb25uZWN0aW9uczpHZXRDb25uZWN0aW9uVG9rZW4nLCAnY29kZWNvbm5lY3Rpb25zOlVzZUNvbm5lY3Rpb24nXSwgcmVzb3VyY2VzOiBbcHJvcHMuY29kZUNvbm5lY3Rpb25Bcm5dIH0pKTtcclxuXHJcbiAgICAvLyBDb2RlQnVpbGQgUHJvamVjdCAoTDIpXHJcbiAgICBuZXcgY29kZWJ1aWxkLlByb2plY3QodGhpcywgJ0NvZGVCdWlsZFByb2plY3QnLCB7XHJcbiAgICAgIHByb2plY3ROYW1lOiAnbWFpbC1leGFtcGxlJywgcm9sZTogYnVpbGRSb2xlLFxyXG4gICAgICBlbnZpcm9ubWVudDogeyBidWlsZEltYWdlOiBjb2RlYnVpbGQuTGludXhCdWlsZEltYWdlLlNUQU5EQVJEXzdfMCwgY29tcHV0ZVR5cGU6IGNvZGVidWlsZC5Db21wdXRlVHlwZS5TTUFMTCwgcHJpdmlsZWdlZDogdHJ1ZSwgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHsgRUNSX1VSSTogeyB2YWx1ZTogZWNyUmVwby5yZXBvc2l0b3J5VXJpIH0sIENMVVNURVJfTkFNRTogeyB2YWx1ZTogY2x1c3Rlci5jbHVzdGVyTmFtZSB9LCBTRVJWSUNFX05BTUU6IHsgdmFsdWU6ICdtYWlsLWV4YW1wbGUnIH0gfSB9LFxyXG4gICAgICBzb3VyY2U6IGNvZGVidWlsZC5Tb3VyY2UuZ2l0SHViKHsgb3duZXI6IGdpdEh1Yk93bmVyLCByZXBvOiBnaXRIdWJSZXBvLCBicmFuY2hPclJlZjogZ2l0SHViQnJhbmNoIH0pLFxyXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksIHF1ZXVlZFRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDMwKSwgYmFkZ2U6IHRydWUsIGRlc2NyaXB0aW9uOiAnQnVpbGQgJiBkZXBsb3kgbWFpbC1leGFtcGxlIHRvIEVDUiB0aGVuIGZvcmNlIEVDUyBkZXBsb3knLFxyXG4gICAgICBidWlsZFNwZWM6IGNvZGVidWlsZC5CdWlsZFNwZWMuZnJvbU9iamVjdCh7XHJcbiAgICAgICAgdmVyc2lvbjogJzAuMicsXHJcbiAgICAgICAgcGhhc2VzOiB7XHJcbiAgICAgICAgICBwcmVfYnVpbGQ6IHsgY29tbWFuZHM6IFsnZWNobyBcIkxvZ2dpbmcgaW4gdG8gRUNSXCInLCAnYXdzIGVjciBnZXQtbG9naW4tcGFzc3dvcmQgLS1yZWdpb24gJEFXU19ERUZBVUxUX1JFR0lPTiB8IGRvY2tlciBsb2dpbiAtLXVzZXJuYW1lIEFXUyAtLXBhc3N3b3JkLXN0ZGluICRFQ1JfVVJJJywgJ0lNQUdFX1RBRz0ke0NPREVCVUlMRF9SRVNPTFZFRF9TT1VSQ0VfVkVSU0lPTjotbGF0ZXN0fSddIH0sXHJcbiAgICAgICAgICBidWlsZDogeyBjb21tYW5kczogWydjZCBleGFtcGxlcy9nbWFpbC12aWV3ZXInLCAnZG9ja2VyIGJ1aWxkIC10ICRFQ1JfVVJJOmxhdGVzdCAtdCAkRUNSX1VSSTokSU1BR0VfVEFHIC4nXSB9LFxyXG4gICAgICAgICAgcG9zdF9idWlsZDogeyBjb21tYW5kczogWydkb2NrZXIgcHVzaCAkRUNSX1VSSTpsYXRlc3QnLCAnZG9ja2VyIHB1c2ggJEVDUl9VUkk6JElNQUdFX1RBRycsICdhd3MgZWNzIHVwZGF0ZS1zZXJ2aWNlIC0tY2x1c3RlciAkQ0xVU1RFUl9OQU1FIC0tc2VydmljZSAkU0VSVklDRV9OQU1FIC0tZm9yY2UtbmV3LWRlcGxveW1lbnQnXSB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYXJ0aWZhY3RzOiB7IGZpbGVzOiBbXSB9LCBlbnY6IHsgc2hlbGw6ICdiYXNoJyB9LFxyXG4gICAgICB9KSxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIE91dHB1dHNcclxuICAgIHRoaXMuY2x1c3Rlck5hbWUgPSBjbHVzdGVyLmNsdXN0ZXJOYW1lO1xyXG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ0NsdXN0ZXJOYW1lJywgeyB2YWx1ZTogdGhpcy5jbHVzdGVyTmFtZSB9KTtcclxuICAgIHRoaXMucmVwb3NpdG9yeVVyaSA9IGVjclJlcG8ucmVwb3NpdG9yeVVyaTtcclxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdSZXBvc2l0b3J5VXJpJywgeyB2YWx1ZTogdGhpcy5yZXBvc2l0b3J5VXJpIH0pO1xyXG4gICAgdGhpcy5hcGlJbnZva2VVcmwgPSBiYXNlVXJsLnRvU3RyaW5nKCk7XHJcbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnQXBpSW52b2tlVXJsJywgeyB2YWx1ZTogdGhpcy5hcGlJbnZva2VVcmwgfSk7XHJcbiAgICB0aGlzLmNsb3VkTWFwU2VydmljZUFybiA9IGNsb3VkTWFwU2VydmljZS5zZXJ2aWNlQXJuO1xyXG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ0Nsb3VkTWFwU2VydmljZUFybicsIHsgdmFsdWU6IHRoaXMuY2xvdWRNYXBTZXJ2aWNlQXJuIH0pO1xyXG4gIH1cclxufVxyXG4iXX0= \ No newline at end of file diff --git a/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.ts b/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.ts index caea0e5..2eecb7e 100644 --- a/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.ts +++ b/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.ts @@ -73,7 +73,7 @@ export class GmailViewerCdkStack extends cdk.Stack { const googleClientId = props.googleClientId || 'PLACEHOLDER_GOOGLE_CLIENT_ID'; const googleClientSecret = props.googleClientSecret || 'PLACEHOLDER_GOOGLE_CLIENT_SECRET'; const sessionSecretValue = props.sessionSecretValue || 'PLACEHOLDER_SESSION_SECRET'; - const apiDomain = props.apiCustomDomainName ?? process.env.API_CUSTOM_DOMAIN ?? 'mail.dyanet.com'; + const apiDomain = props.apiCustomDomainName ?? process.env.API_CUSTOM_DOMAIN ?? 'demo.dyanet.com'; const certArn = props.certificateArn ?? this.node.tryGetContext('certificateArn') ?? process.env.CERTIFICATE_ARN; const zoneId = props.hostedZoneId ?? ''; const hasCustomDomain = Boolean(certArn && apiDomain); @@ -163,13 +163,16 @@ export class GmailViewerCdkStack extends cdk.Stack { name: 'mail-example', namespace, dnsRecordType: servicediscovery.DnsRecordType.SRV, dnsTtl: nsTtl, routingPolicy: servicediscovery.RoutingPolicy.WEIGHTED, customHealthCheck: { failureThreshold: 1 }, }); - // Secrets Manager - single secret with GOOGLE_CLIENT_SECRET and SESSION_SECRET + // Secrets Manager - all config values for the application const appSecrets = new secretsmanager.Secret(this, 'AppSecrets', { - secretName: `${ssmPrefix}/secrets`, - description: 'Application secrets for mail-example', + secretName: `${ssmPrefix}/config`, + description: 'Application configuration for mail-example', secretObjectValue: { + GOOGLE_CLIENT_ID: cdk.SecretValue.unsafePlainText(googleClientId), GOOGLE_CLIENT_SECRET: cdk.SecretValue.unsafePlainText(googleClientSecret), SESSION_SECRET: cdk.SecretValue.unsafePlainText(sessionSecretValue), + BASE_URL: cdk.SecretValue.unsafePlainText(baseUrl.toString()), + PORT: cdk.SecretValue.unsafePlainText(containerPort.toString()), }, }); @@ -182,12 +185,6 @@ export class GmailViewerCdkStack extends cdk.Stack { taskRole.addToPolicy(new iam.PolicyStatement({ actions: ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath', 'kms:Decrypt'], resources: [`arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}*`, `arn:aws:kms:${this.region}:${this.account}:key/*`] })); taskRole.addToPolicy(new iam.PolicyStatement({ actions: ['secretsmanager:GetSecretValue'], resources: [appSecrets.secretArn] })); - // SSM Parameters (L2) - create before task definition so they can be referenced - const ssmBaseUrl = new ssm.StringParameter(this, 'SsmBaseUrl', { parameterName: `${ssmPrefix}/env/BASE_URL`, stringValue: baseUrl.toString() }); - const ssmGoogleClientId = new ssm.StringParameter(this, 'SsmGoogleClientId', { parameterName: `${ssmPrefix}/env/GOOGLE_CLIENT_ID`, stringValue: googleClientId }); - new ssm.StringParameter(this, 'SsmPort', { parameterName: `${ssmPrefix}/env/PORT`, stringValue: containerPort.toString() }); - new ssm.StringParameter(this, 'SsmPublicEnv', { parameterName: `${ssmPrefix}/env/NODE_ENV`, stringValue: publicEnvValue }); - // ECS Task Definition (L2) const taskDef = new ecs.FargateTaskDefinition(this, 'AppTaskDefinition', { family: 'mail-example', cpu: containerCpu, memoryLimitMiB: containerMemory, executionRole: taskExecRole, taskRole }); taskDef.addContainer('mail-example', { @@ -195,7 +192,7 @@ export class GmailViewerCdkStack extends cdk.Stack { logging: ecs.LogDrivers.awsLogs({ logGroup: appLogGroup, streamPrefix: 'mail-example' }), environment: { CONFIG_SSM_PREFIX: ssmPrefix, PORT: containerPort.toString(), BASE_URL: baseUrl.toString(), NODE_ENV: publicEnvValue }, secrets: { - GOOGLE_CLIENT_ID: ecs.Secret.fromSsmParameter(ssmGoogleClientId), + GOOGLE_CLIENT_ID: ecs.Secret.fromSecretsManager(appSecrets, 'GOOGLE_CLIENT_ID'), GOOGLE_CLIENT_SECRET: ecs.Secret.fromSecretsManager(appSecrets, 'GOOGLE_CLIENT_SECRET'), SESSION_SECRET: ecs.Secret.fromSecretsManager(appSecrets, 'SESSION_SECRET'), },