From 336ec592a51a710aabff6225a17806ffbd5ba7b0 Mon Sep 17 00:00:00 2001 From: Akber Choudhry Date: Sun, 4 Jan 2026 14:34:04 -0500 Subject: [PATCH 1/3] chore: update CI actions to v6, publish to GitHub Packages only --- .github/workflows/ci.yml | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 91c9d58..ee32b4f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,10 +14,10 @@ jobs: node-version: [20, 22, 24] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: 'npm' @@ -38,15 +38,18 @@ jobs: needs: test runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' && github.event_name == 'push' + permissions: + contents: read + packages: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Use Node.js 20 - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 20 - registry-url: 'https://registry.npmjs.org' + registry-url: 'https://npm.pkg.github.com' cache: 'npm' - name: Install dependencies @@ -55,21 +58,7 @@ jobs: - name: Build run: npm run build - - name: Check if version changed - id: version-check - run: | - PACKAGE_VERSION=$(node -p "require('./package.json').version") - NPM_VERSION=$(npm view @dyanet/imap version 2>/dev/null || echo "0.0.0") - if [ "$PACKAGE_VERSION" != "$NPM_VERSION" ]; then - echo "should_publish=true" >> $GITHUB_OUTPUT - echo "Package version $PACKAGE_VERSION differs from npm version $NPM_VERSION" - else - echo "should_publish=false" >> $GITHUB_OUTPUT - echo "Package version $PACKAGE_VERSION matches npm version" - fi - - - name: Publish to npm - if: steps.version-check.outputs.should_publish == 'true' - run: npm publish --access public + - name: Publish to GitHub Packages + run: npm publish env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 417c0ef3ca4955478699d6962810f2ac2d837794 Mon Sep 17 00:00:00 2001 From: Akber Choudhry Date: Sun, 4 Jan 2026 15:57:51 -0500 Subject: [PATCH 2/3] chore: lock dependencies for gmail-viewer example --- .../gmail-viewer-cdk/bin/gmail-viewer-cdk.js | 2 +- .../lib/gmail-viewer-cdk-stack.js | 2 +- .../test/gmail-viewer-cdk.test.js | 2 +- .../test/mail_example_stack.test.js | 2 +- examples/gmail-viewer/package-lock.json | 1074 +++++++++++++++++ examples/gmail-viewer/package.json | 2 +- 6 files changed, 1079 insertions(+), 5 deletions(-) create mode 100644 examples/gmail-viewer/package-lock.json diff --git a/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js b/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js index f41e92b..aad315a 100644 --- a/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js +++ b/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js @@ -21,4 +21,4 @@ new gmail_viewer_cdk_stack_1.GmailViewerCdkStack(app, 'GmailViewerCdkStack', { apiCustomDomainName: 'mail.dyanet.com', certificateArn: 'arn:aws:acm:ca-central-1:239030031457:certificate/af9150f1-4635-4154-8b19-e5449d57e971', }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdtYWlsLXZpZXdlci1jZGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQWtDO0FBQ2xDLDBFQUFvRTtBQUVwRSxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztBQUV0QiwwRkFBMEY7QUFDMUYsK0RBQStEO0FBQy9ELE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRTVFLElBQUksNENBQW1CLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFO0lBQ2xELEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtRQUN4QyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7S0FDdkM7SUFDRCxjQUFjLEVBQUUsQ0FBQywwQkFBMEIsRUFBRywwQkFBMEIsQ0FBQztJQUN6RSxXQUFXLEVBQUUsUUFBUTtJQUNyQixVQUFVLEVBQUUsTUFBTTtJQUNsQixZQUFZLEVBQUUsTUFBTTtJQUNwQixpQkFBaUIsRUFBRSxtR0FBbUc7SUFDdEgsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixtQkFBbUIsRUFBRSxpQkFBaUI7SUFDdEMsY0FBYyxFQUFFLHdGQUF3RjtDQUN6RyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBBcHAgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBHbWFpbFZpZXdlckNka1N0YWNrIH0gZnJvbSAnLi4vbGliL2dtYWlsLXZpZXdlci1jZGstc3RhY2snO1xuXG5jb25zdCBhcHAgPSBuZXcgQXBwKCk7XG5cbi8vIFRvIHNwZWNpZnkgc3VibmV0cywgdXNlIHRoZSAtLWNvbnRleHQgb3B0aW9uIHdpdGggYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzdWJuZXQgSURzOlxuLy8gY2RrIGRlcGxveSAtYyBwcml2YXRlU3VibmV0cz1zdWJuZXQteHh4eHh4eHgsc3VibmV0LXl5eXl5eXl5XG5jb25zdCBwcml2YXRlU3VibmV0cyA9IGFwcC5ub2RlLnRyeUdldENvbnRleHQoJ3ByaXZhdGVTdWJuZXRzJyk/LnNwbGl0KCcsJyk7XG5cbm5ldyBHbWFpbFZpZXdlckNka1N0YWNrKGFwcCwgJ0dtYWlsVmlld2VyQ2RrU3RhY2snLCB7XG4gIGVudjoge1xuICAgIGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQsXG4gICAgcmVnaW9uOiBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT04sXG4gIH0sXG4gIHByaXZhdGVTdWJuZXRzOiBbJ3N1Ym5ldC0wZDgyOTBkMGVhNTc1MzMxYycsIFx0J3N1Ym5ldC0wMzIyOTA1NjlhN2VjZjIxMCddLFxuICBnaXRIdWJPd25lcjogJ2R5YW5ldCcsXG4gIGdpdEh1YlJlcG86ICdpbWFwJyxcbiAgZ2l0SHViQnJhbmNoOiAnbWFpbicsXG4gIGNvZGVDb25uZWN0aW9uQXJuOiAnYXJuOmF3czpjb2RlY29ubmVjdGlvbnM6Y2EtY2VudHJhbC0xOjIzOTAzMDAzMTQ1Nzpjb25uZWN0aW9uLzI5ZmU1YzExLTIzZDItNGMxMC1hODFkLTRlODgwYjEyZTJjNicsXG4gIHVzZUdpdEh1YldlYmhvb2tzOiBmYWxzZSxcbiAgYXBpQ3VzdG9tRG9tYWluTmFtZTogJ21haWwuZHlhbmV0LmNvbScsXG4gIGNlcnRpZmljYXRlQXJuOiAnYXJuOmF3czphY206Y2EtY2VudHJhbC0xOjIzOTAzMDAzMTQ1NzpjZXJ0aWZpY2F0ZS9hZjkxNTBmMS00NjM1LTQxNTQtOGIxOS1lNTQ0OWQ1N2U5NzEnLFxufSk7XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdtYWlsLXZpZXdlci1jZGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQWtDO0FBQ2xDLDBFQUFvRTtBQUVwRSxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztBQUV0QiwwRkFBMEY7QUFDMUYsK0RBQStEO0FBQy9ELE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRTVFLElBQUksNENBQW1CLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFO0lBQ2xELEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtRQUN4QyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7S0FDdkM7SUFDRCxjQUFjLEVBQUUsQ0FBQywwQkFBMEIsRUFBRywwQkFBMEIsQ0FBQztJQUN6RSxXQUFXLEVBQUUsUUFBUTtJQUNyQixVQUFVLEVBQUUsTUFBTTtJQUNsQixZQUFZLEVBQUUsTUFBTTtJQUNwQixpQkFBaUIsRUFBRSxtR0FBbUc7SUFDdEgsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixtQkFBbUIsRUFBRSxpQkFBaUI7SUFDdEMsY0FBYyxFQUFFLHdGQUF3RjtDQUN6RyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXHJcbmltcG9ydCB7IEFwcCB9IGZyb20gJ2F3cy1jZGstbGliJztcclxuaW1wb3J0IHsgR21haWxWaWV3ZXJDZGtTdGFjayB9IGZyb20gJy4uL2xpYi9nbWFpbC12aWV3ZXItY2RrLXN0YWNrJztcclxuXHJcbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcclxuXHJcbi8vIFRvIHNwZWNpZnkgc3VibmV0cywgdXNlIHRoZSAtLWNvbnRleHQgb3B0aW9uIHdpdGggYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzdWJuZXQgSURzOlxyXG4vLyBjZGsgZGVwbG95IC1jIHByaXZhdGVTdWJuZXRzPXN1Ym5ldC14eHh4eHh4eCxzdWJuZXQteXl5eXl5eXlcclxuY29uc3QgcHJpdmF0ZVN1Ym5ldHMgPSBhcHAubm9kZS50cnlHZXRDb250ZXh0KCdwcml2YXRlU3VibmV0cycpPy5zcGxpdCgnLCcpO1xyXG5cclxubmV3IEdtYWlsVmlld2VyQ2RrU3RhY2soYXBwLCAnR21haWxWaWV3ZXJDZGtTdGFjaycsIHtcclxuICBlbnY6IHtcclxuICAgIGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQsXHJcbiAgICByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTixcclxuICB9LFxyXG4gIHByaXZhdGVTdWJuZXRzOiBbJ3N1Ym5ldC0wZDgyOTBkMGVhNTc1MzMxYycsIFx0J3N1Ym5ldC0wMzIyOTA1NjlhN2VjZjIxMCddLFxyXG4gIGdpdEh1Yk93bmVyOiAnZHlhbmV0JyxcclxuICBnaXRIdWJSZXBvOiAnaW1hcCcsXHJcbiAgZ2l0SHViQnJhbmNoOiAnbWFpbicsXHJcbiAgY29kZUNvbm5lY3Rpb25Bcm46ICdhcm46YXdzOmNvZGVjb25uZWN0aW9uczpjYS1jZW50cmFsLTE6MjM5MDMwMDMxNDU3OmNvbm5lY3Rpb24vMjlmZTVjMTEtMjNkMi00YzEwLWE4MWQtNGU4ODBiMTJlMmM2JyxcclxuICB1c2VHaXRIdWJXZWJob29rczogZmFsc2UsXHJcbiAgYXBpQ3VzdG9tRG9tYWluTmFtZTogJ21haWwuZHlhbmV0LmNvbScsXHJcbiAgY2VydGlmaWNhdGVBcm46ICdhcm46YXdzOmFjbTpjYS1jZW50cmFsLTE6MjM5MDMwMDMxNDU3OmNlcnRpZmljYXRlL2FmOTE1MGYxLTQ2MzUtNDE1NC04YjE5LWU1NDQ5ZDU3ZTk3MScsXHJcbn0pO1xyXG4iXX0= \ No newline at end of file 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 8732e6a..ae921de 100644 --- a/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.js +++ b/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.js @@ -667,4 +667,4 @@ class GmailViewerCdkStack extends cdk.Stack { } } exports.GmailViewerCdkStack = GmailViewerCdkStack; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdtYWlsLXZpZXdlci1jZGstc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW1DO0FBQ25DLDJFQUE2RDtBQUM3RCxxRUFBdUQ7QUFDdkQseURBQTJDO0FBQzNDLHlEQUEyQztBQUMzQyx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLDJEQUE2QztBQUM3QyxpRUFBbUQ7QUFDbkQsbUZBQXFFO0FBQ3JFLHlEQUEyQztBQTBCM0MsTUFBYSxtQkFBb0IsU0FBUSxHQUFHLENBQUMsS0FBSztJQUNoQyxXQUFXLENBQVM7SUFDcEIsYUFBYSxDQUFTO0lBQ3RCLFlBQVksQ0FBUztJQUNyQixrQkFBa0IsQ0FBUztJQUUzQyxZQUFtQixLQUFjLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQzVFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBa0MsRUFBRSxRQUFnQixFQUFVLEVBQUU7WUFDaEYsTUFBTSxTQUFTLEdBQUcsS0FBSyxJQUFJLFFBQVEsQ0FBQztZQUNwQyxNQUFNLE1BQU0sR0FBRyxPQUFPLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDckQsQ0FBQyxDQUFDO1FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFrQyxFQUFVLEVBQUU7WUFDaEUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNwQyxN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QUksRUFBRSw2QkFBNkIsRUFBRTtZQUNyRCxHQUFHLEVBQUUsb0JBQW9CO1lBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFO1NBQzFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXpwQkQsa0RBeXBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBhcGlnYXRld2F5djIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2Mic7XG5pbXBvcnQgKiBhcyBjb2RlYnVpbGQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBlY3IgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcic7XG5pbXBvcnQgKiBhcyBlY3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcyc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIHJvdXRlNTMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnO1xuaW1wb3J0ICogYXMgc2VydmljZWRpc2NvdmVyeSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VydmljZWRpc2NvdmVyeSc7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR21haWxWaWV3ZXJDZGtTdGFja1Byb3BzIGV4dGVuZHMgY2RrLlN0YWNrUHJvcHMge1xuICByZWFkb25seSB2cGNJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgcHJpdmF0ZVN1Ym5ldHM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgY29udGFpbmVyUG9ydD86IG51bWJlciB8IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGFpbmVyQ3B1PzogbnVtYmVyIHwgc3RyaW5nO1xuICByZWFkb25seSBjb250YWluZXJNZW1vcnk/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlc2lyZWRDb3VudD86IG51bWJlciB8IHN0cmluZztcbiAgcmVhZG9ubHkgY2VydGlmaWNhdGVBcm4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFwaUN1c3RvbURvbWFpbk5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgc2VydmljZURpc2NvdmVyeU5hbWVzcGFjZU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlcnZpY2VEaXNjb3ZlcnlUdGw/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IHNzbVByZWZpeD86IHN0cmluZztcbiAgcmVhZG9ubHkgZ2l0SHViT3duZXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdpdEh1YlJlcG8/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdpdEh1YkJyYW5jaD86IHN0cmluZztcbiAgcmVhZG9ubHkgcHVibGljRW52VmFsdWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdvb2dsZUNsaWVudElkPzogc3RyaW5nO1xuICByZWFkb25seSBnb29nbGVDbGllbnRTZWNyZXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlc3Npb25TZWNyZXRWYWx1ZT86IHN0cmluZztcbiAgcmVhZG9ubHkgdXNlR2l0SHViV2ViaG9va3M/OiBib29sZWFuO1xuICByZWFkb25seSBjb2RlQ29ubmVjdGlvbkFybj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEdtYWlsVmlld2VyQ2RrU3RhY2sgZXh0ZW5kcyBjZGsuU3RhY2sge1xuICBwdWJsaWMgcmVhZG9ubHkgY2x1c3Rlck5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHJlcG9zaXRvcnlVcmk6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGFwaUludm9rZVVybDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY2xvdWRNYXBTZXJ2aWNlQXJuOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBjZGsuQXBwLCBpZDogc3RyaW5nLCBwcm9wczogR21haWxWaWV3ZXJDZGtTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBjb25zdCB0b051bWJlciA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlID8/IGZhbGxiYWNrO1xuICAgICAgY29uc3QgcGFyc2VkID0gdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ251bWJlcicgPyBjYW5kaWRhdGUgOiBOdW1iZXIoY2FuZGlkYXRlKTtcbiAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IGZhbGxiYWNrO1xuICAgIH07XG5cbiAgICBjb25zdCB0b0NwdVVuaXRzID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkID0gdG9OdW1iZXIodmFsdWUsIDAuNSk7XG4gICAgICBjb25zdCB2Y3B1ID0gcGFyc2VkIDw9IDQgPyBwYXJzZWQgKiAxMDI0IDogcGFyc2VkO1xuICAgICAgY29uc3Qgcm91bmRlZCA9IE1hdGgucm91bmQodmNwdSAvIDI1NikgKiAyNTY7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMjU2LCByb3VuZGVkKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVwb1BhcnRzID0gKHByb2Nlc3MuZW52LkdJVEhVQl9SRVBPU0lUT1JZID8/ICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IGd1ZXNzZWRHaXRIdWJPd25lciA9IHJlcG9QYXJ0c1swXSB8fCAnZHlhbmV0JztcbiAgICBjb25zdCBndWVzc2VkR2l0SHViUmVwbyA9IHJlcG9QYXJ0c1sxXSB8fCAnaW1hcCc7XG5cbiAgICBjb25zdCBjb250YWluZXJQb3J0ID0gdG9OdW1iZXIocHJvcHMuY29udGFpbmVyUG9ydCwgMzAwMCk7XG4gICAgY29uc3QgY29udGFpbmVyQ3B1ID0gdG9DcHVVbml0cyhwcm9wcy5jb250YWluZXJDcHUpO1xuICAgIGNvbnN0IGNvbnRhaW5lck1lbW9yeSA9IHRvTnVtYmVyKHByb3BzLmNvbnRhaW5lck1lbW9yeSwgMTAyNCk7XG4gICAgY29uc3QgZGVzaXJlZENvdW50ID0gdG9OdW1iZXIocHJvcHMuZGVzaXJlZENvdW50LCAxKTtcbiAgICBjb25zdCBzZXJ2aWNlRGlzY292ZXJ5TmFtZXNwYWNlTmFtZSA9IHByb3BzLnNlcnZpY2VEaXNjb3ZlcnlOYW1lc3BhY2VOYW1lID8/ICdtYWlsLmxvY2FsJztcbiAgICBjb25zdCBzZXJ2aWNlRGlzY292ZXJ5VHRsID0gdG9OdW1iZXIocHJvcHMuc2VydmljZURpc2NvdmVyeVR0bCwgNjApO1xuICAgIGNvbnN0IHNzbVByZWZpeFJhdyA9IHByb3BzLnNzbVByZWZpeCA/PyAnL21haWwtZXhhbXBsZSc7XG4gICAgY29uc3Qgc3NtUHJlZml4ID0gJy8nICsgc3NtUHJlZml4UmF3LnNwbGl0KCcvJykuZmlsdGVyKHAgPT4gcCkuam9pbignLycpO1xuICAgIGNvbnN0IGdpdEh1Yk93bmVyID0gcHJvcHMuZ2l0SHViT3duZXIgPz8gZ3Vlc3NlZEdpdEh1Yk93bmVyO1xuICAgIGNvbnN0IGdpdEh1YlJlcG8gPSBwcm9wcy5naXRIdWJSZXBvID8/IGd1ZXNzZWRHaXRIdWJSZXBvO1xuICAgIGNvbnN0IGdpdEh1YkJyYW5jaCA9IHByb3BzLmdpdEh1YkJyYW5jaCA/PyBwcm9jZXNzLmVudi5HSVRIVUJfUkVGX05BTUUgPz8gJ21haW4nO1xuICAgIGNvbnN0IHB1YmxpY0VudlZhbHVlID0gcHJvcHMucHVibGljRW52VmFsdWUgPz8gJ3Byb2R1Y3Rpb24nO1xuICAgIGNvbnN0IGdvb2dsZUNsaWVudElkID0gcHJvcHMuZ29vZ2xlQ2xpZW50SWQgfHwgJ25vdC1zZXQnO1xuICAgIGNvbnN0IGdvb2dsZUNsaWVudFNlY3JldCA9IHByb3BzLmdvb2dsZUNsaWVudFNlY3JldCA/PyAnbm90LXNldCc7XG4gICAgY29uc3Qgc2Vzc2lvblNlY3JldFZhbHVlID0gcHJvcHMuc2Vzc2lvblNlY3JldFZhbHVlID8/ICdub3Qtc2V0JztcbiAgICBjb25zdCBhcGlDdXN0b21Eb21haW5OYW1lID0gcHJvcHMuYXBpQ3VzdG9tRG9tYWluTmFtZSA/PyBwcm9jZXNzLmVudi5BUElfQ1VTVE9NX0RPTUFJTiA/PyAnbWFpbC5keWFuZXQuY29tJztcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZUFybiA9IHByb3BzLmNlcnRpZmljYXRlQXJuID8/IHRoaXMubm9kZS50cnlHZXRDb250ZXh0KCdjZXJ0aWZpY2F0ZUFybicpID8/IHByb2Nlc3MuZW52LkNFUlRJRklDQVRFX0FSTjtcbiAgICBjb25zdCBob3N0ZWRab25lSWQgPSBwcm9wcy5ob3N0ZWRab25lSWQgPz8gJyc7XG4gICAgY29uc3QgaGFzQ3VzdG9tRG9tYWluID0gQm9vbGVhbihjZXJ0aWZpY2F0ZUFybiAmJiBhcGlDdXN0b21Eb21haW5OYW1lKTtcbiAgICBjb25zdCBoYXNIb3N0ZWRab25lID0gQm9vbGVhbihob3N0ZWRab25lSWQpO1xuXG4gICAgbGV0IHZwYzogZWMyLklWcGM7XG4gICAgbGV0IHByaXZhdGVTdWJuZXRJZHM6IHN0cmluZ1tdO1xuICAgIGxldCBzZXJ2aWNlU3VibmV0SWRzOiBzdHJpbmdbXTtcblxuICAgIC8vIElmIGFjY291bnQvcmVnaW9uIGFyZSBhdmFpbGFibGUsIHVzZSBWcGMuZnJvbUxvb2t1cCB0byBhdXRvbWF0aWNhbGx5IGRpc2NvdmVyIHN1Ym5ldHMuXG4gICAgLy8gT3RoZXJ3aXNlIGZhbGwgYmFjayB0byBDbG91ZEZvcm1hdGlvbiBwYXJhbWV0ZXJzIHdoaWNoIGxldCB0aGUgZGVwbG95ZXIgcGljayB2YWx1ZXMgaW4gdGhlIGNvbnNvbGUuXG4gICAgY29uc3QgdXNlVnBjUGFyYW1ldGVyID0gdGhpcy5ub2RlLnRyeUdldENvbnRleHQoJ3VzZVZwY1BhcmFtZXRlcicpO1xuXG4gICAgaWYgKCF1c2VWcGNQYXJhbWV0ZXIgJiYgdGhpcy5hY2NvdW50ICYmIHRoaXMucmVnaW9uKSB7XG4gICAgICB2cGMgPSBlYzIuVnBjLmZyb21Mb29rdXAodGhpcywgJ01haWxWcGMnLCB7IHRhZ3M6IHsgTmFtZTogJ2R5YS12cGMnIH0gfSk7XG4gICAgICBcbiAgICAgIGlmIChwcm9wcy5wcml2YXRlU3VibmV0cyAmJiBwcm9wcy5wcml2YXRlU3VibmV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcHJpdmF0ZVN1Ym5ldElkcyA9IHByb3BzLnByaXZhdGVTdWJuZXRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgc2VydmljZSBsaW5rZWQgdG8gdGhlIFZQQyBMaW5rIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIGFsbCBBdmFpbGFiaWxpdHkgWm9uZXMuXG4gICAgICAgICAgY29uc3QgYmFkQXogPSAnY2FjMS1hejQnO1xuICAgICAgICAgIFxuICAgICAgICAgIGxldCBzdWJuZXRzID0gdnBjLnByaXZhdGVTdWJuZXRzLmZpbHRlcihzID0+IHMuYXZhaWxhYmlsaXR5Wm9uZSAhPT0gYmFkQXopO1xuICAgICAgICAgIGlmIChzdWJuZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gTm8gcHJpdmF0ZSBzdWJuZXRzLCB0cnkgcHVibGljIHN1Ym5ldHNcbiAgICAgICAgICAgIHN1Ym5ldHMgPSB2cGMucHVibGljU3VibmV0cy5maWx0ZXIocyA9PiBzLmF2YWlsYWJpbGl0eVpvbmUgIT09IGJhZEF6KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwcml2YXRlU3VibmV0SWRzID0gc3VibmV0cy5zbGljZSgwLCAyKS5tYXAocyA9PiBzLnN1Ym5ldElkKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAocHJpdmF0ZVN1Ym5ldElkcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZQQyAnJHt2cGMudnBjSWR9JyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHByaXZhdGUgb3IgcHVibGljIHN1Ym5ldCBpbiBhbiBhbGxvd2VkIGF2YWlsYWJpbGl0eSB6b25lIChub3QgaW4gJHtiYWRBen0pLmApO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNlcnZpY2VTdWJuZXRJZHMgPSBwcml2YXRlU3VibmV0SWRzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDbG91ZEZvcm1hdGlvbiBwYXJhbWV0ZXIgZm9yIFZQQyBzZWxlY3Rpb24gKGRyb3Bkb3duIG9mIFZQQyBJRHMgaW4gdGhlIGNvbnNvbGUpXG4gICAgICBjb25zdCB2cGNJZFBhcmFtID0gbmV3IGNkay5DZm5QYXJhbWV0ZXIodGhpcywgJ1ZwY0lkUGFyYW0nLCB7XG4gICAgICAgIHR5cGU6ICdBV1M6OkVDMjo6VlBDOjpJZCcsXG4gICAgICAgIGRlZmF1bHQ6IHByb3BzLnZwY0lkID8/ICcnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE9wdGlvbmFsIHBhcmFtZXRlciBmb3IgcHJpdmF0ZSBzdWJuZXQgSURzIChDb21tYURlbGltaXRlZExpc3QpIHdoZW4gc3ludGhlc2l6aW5nIHdpdGhvdXQgYWNjb3VudC9yZWdpb25cbiAgICAgIGNvbnN0IHByaXZhdGVTdWJuZXRJZHNQYXJhbSA9IG5ldyBjZGsuQ2ZuUGFyYW1ldGVyKHRoaXMsICdQcml2YXRlU3VibmV0SWRzUGFyYW0nLCB7XG4gICAgICAgIHR5cGU6ICdDb21tYURlbGltaXRlZExpc3QnLFxuICAgICAgICBkZWZhdWx0OiBwcm9wcy5wcml2YXRlU3VibmV0cyAmJiBwcm9wcy5wcml2YXRlU3VibmV0cy5sZW5ndGggPiAwID8gcHJvcHMucHJpdmF0ZVN1Ym5ldHMuam9pbignLCcpIDogJycsXG4gICAgICB9KTtcbiAgICAgIC8vIFVzZSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyIHZhbHVlcyAoZGVwbG95ZXIgbXVzdCBzdXBwbHkgcHJpdmF0ZSBzdWJuZXQgaWRzIHdoZW4gc3ludGhlc2l6aW5nIHdpdGhvdXQgbG9va3VwKVxuICAgICAgdnBjID0gZWMyLlZwYy5mcm9tVnBjQXR0cmlidXRlcyh0aGlzLCAnTWFpbFZwYycsIHtcbiAgICAgICAgdnBjSWQ6IHZwY0lkUGFyYW0udmFsdWVBc1N0cmluZyxcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZXM6IGNkay5Gbi5nZXRBenMoKSxcbiAgICAgICAgcHJpdmF0ZVN1Ym5ldElkczogcHJpdmF0ZVN1Ym5ldElkc1BhcmFtLnZhbHVlQXNMaXN0LFxuICAgICAgfSk7XG4gICAgICBwcml2YXRlU3VibmV0SWRzID0gcHJvcHMucHJpdmF0ZVN1Ym5ldHMgPz8gcHJpdmF0ZVN1Ym5ldElkc1BhcmFtLnZhbHVlQXNMaXN0O1xuICAgICAgc2VydmljZVN1Ym5ldElkcyA9IHByaXZhdGVTdWJuZXRJZHM7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpVnBjTGlua1NlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLkNmblNlY3VyaXR5R3JvdXAodGhpcywgJ0FwaVZwY0xpbmtTZWN1cml0eUdyb3VwJywge1xuICAgICAgZ3JvdXBEZXNjcmlwdGlvbjogJ0VncmVzcyBmcm9tIEFQSSBHYXRld2F5IFZQQyBMaW5rIHRvIHNlcnZpY2UnLFxuICAgICAgdnBjSWQ6IHZwYy52cGNJZCxcbiAgICAgIHNlY3VyaXR5R3JvdXBFZ3Jlc3M6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlwUHJvdG9jb2w6ICd0Y3AnLFxuICAgICAgICAgIGZyb21Qb3J0OiBjb250YWluZXJQb3J0LFxuICAgICAgICAgIHRvUG9ydDogY29udGFpbmVyUG9ydCxcbiAgICAgICAgICBjaWRySXA6ICcwLjAuMC4wLzAnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBhcGlWcGNMaW5rU2VjdXJpdHlHcm91cC5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcblxuICAgIGNvbnN0IHNlcnZpY2VTZWN1cml0eUdyb3VwID0gbmV3IGVjMi5DZm5TZWN1cml0eUdyb3VwKHRoaXMsICdTZXJ2aWNlU2VjdXJpdHlHcm91cCcsIHtcbiAgICAgIGdyb3VwRGVzY3JpcHRpb246ICdBbGxvdyBBUEkgR2F0ZXdheSBWUEMgTGluayB0byByZWFjaCBGYXJnYXRlIHRhc2tzJyxcbiAgICAgIHZwY0lkOiB2cGMudnBjSWQsXG4gICAgICBzZWN1cml0eUdyb3VwSW5ncmVzczogW1xuICAgICAgICB7XG4gICAgICAgICAgaXBQcm90b2NvbDogJ3RjcCcsXG4gICAgICAgICAgZnJvbVBvcnQ6IGNvbnRhaW5lclBvcnQsXG4gICAgICAgICAgdG9Qb3J0OiBjb250YWluZXJQb3J0LFxuICAgICAgICAgIGNpZHJJcDogJzAuMC4wLjAvMCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgc2VjdXJpdHlHcm91cEVncmVzczogW1xuICAgICAgICB7XG4gICAgICAgICAgaXBQcm90b2NvbDogJy0xJyxcbiAgICAgICAgICBmcm9tUG9ydDogMCxcbiAgICAgICAgICB0b1BvcnQ6IDY1NTM1LFxuICAgICAgICAgIGNpZHJJcDogJzAuMC4wLjAvMCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIHNlcnZpY2VTZWN1cml0eUdyb3VwLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xuXG4gICAgY29uc3QgYXBwTG9nR3JvdXAgPSBuZXcgbG9ncy5DZm5Mb2dHcm91cCh0aGlzLCAnQXBwTG9nR3JvdXAnLCB7XG4gICAgICBsb2dHcm91cE5hbWU6ICcvZWNzL21haWwtZXhhbXBsZScsXG4gICAgICByZXRlbnRpb25JbkRheXM6IDMwLFxuICAgIH0pO1xuICAgIGFwcExvZ0dyb3VwLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xuXG4gICAgY29uc3QgbWFpbENsdXN0ZXIgPSBuZXcgZWNzLkNmbkNsdXN0ZXIodGhpcywgJ01haWxDbHVzdGVyJywge1xuICAgICAgY2x1c3Rlck5hbWU6ICdtYWlsLWNsdXN0ZXInLFxuICAgICAgY2FwYWNpdHlQcm92aWRlcnM6IFsnRkFSR0FURScsICdGQVJHQVRFX1NQT1QnXSxcbiAgICAgIGRlZmF1bHRDYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3k6IFtcbiAgICAgICAge1xuICAgICAgICAgIGNhcGFjaXR5UHJvdmlkZXI6ICdGQVJHQVRFX1NQT1QnLFxuICAgICAgICAgIHdlaWdodDogNCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNhcGFjaXR5UHJvdmlkZXI6ICdGQVJHQVRFJyxcbiAgICAgICAgICB3ZWlnaHQ6IDEsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIG1haWxDbHVzdGVyLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xuXG4gICAgY29uc3QgbWFpbEV4YW1wbGVSZXBvc2l0b3J5ID0gbmV3IGVjci5DZm5SZXBvc2l0b3J5KHRoaXMsICdNYWlsRXhhbXBsZVJlcG9zaXRvcnknLCB7XG4gICAgICByZXBvc2l0b3J5TmFtZTogJ21haWwtZXhhbXBsZScsXG4gICAgICBpbWFnZVRhZ011dGFiaWxpdHk6ICdNVVRBQkxFJyxcbiAgICAgIGVuY3J5cHRpb25Db25maWd1cmF0aW9uOiB7XG4gICAgICAgIGVuY3J5cHRpb25UeXBlOiAnQUVTMjU2JyxcbiAgICAgIH0sXG4gICAgICBsaWZlY3ljbGVQb2xpY3k6IHtcbiAgICAgICAgbGlmZWN5Y2xlUG9saWN5VGV4dDpcbiAgICAgICAgICAne1xcbiAgXCJydWxlc1wiOiBbXFxuICAgIHtcXG4gICAgICBcInJ1bGVQcmlvcml0eVwiOiAxLFxcbiAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJFeHBpcmUgaW1hZ2VzIG9sZGVyIHRoYW4gMzAgZGF5c1wiLFxcbiAgICAgIFwic2VsZWN0aW9uXCI6IHtcXG4gICAgICAgIFwidGFnU3RhdHVzXCI6IFwiYW55XCIsXFxuICAgICAgICBcImNvdW50VHlwZVwiOiBcInNpbmNlSW1hZ2VQdXNoZWRcIixcXG4gICAgICAgIFwiY291bnRVbml0XCI6IFwiZGF5c1wiLFxcbiAgICAgICAgXCJjb3VudE51bWJlclwiOiAzMFxcbiAgICAgIH0sXFxuICAgICAgXCJhY3Rpb25cIjogeyBcInR5cGVcIjogXCJleHBpcmVcIiB9XFxuICAgIH1cXG4gIF1cXG59XFxuJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgbWFpbEV4YW1wbGVSZXBvc2l0b3J5LmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xuXG4gICAgY29uc3QgbWFpbEh0dHBBcGkgPSBuZXcgYXBpZ2F0ZXdheXYyLkNmbkFwaSh0aGlzLCAnTWFpbEh0dHBBcGknLCB7XG4gICAgICBuYW1lOiAnbWFpbC1leGFtcGxlJyxcbiAgICAgIHByb3RvY29sVHlwZTogJ0hUVFAnLFxuICAgIH0pO1xuICAgIG1haWxIdHRwQXBpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xuXG4gICAgY29uc3QgbWFpbEFwaVN0YWdlID0gbmV3IGFwaWdhdGV3YXl2Mi5DZm5TdGFnZSh0aGlzLCAnTWFpbEFwaVN0YWdlJywge1xuICAgICAgc3RhZ2VOYW1lOiAncHJvZCcsXG4gICAgICBhcGlJZDogbWFpbEh0dHBBcGkucmVmLFxuICAgICAgYXV0b0RlcGxveTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtYWlsQXBpU3RhZ2UuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG5cbiAgICBjb25zdCBhcGlEb21haW5OYW1lID0gaGFzQ3VzdG9tRG9tYWluXG4gICAgICA/IG5ldyBhcGlnYXRld2F5djIuQ2ZuRG9tYWluTmFtZSh0aGlzLCAnQXBpRG9tYWluTmFtZScsIHtcbiAgICAgICAgICBkb21haW5OYW1lOiBhcGlDdXN0b21Eb21haW5OYW1lLFxuICAgICAgICAgIGRvbWFpbk5hbWVDb25maWd1cmF0aW9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZUFybjogY2VydGlmaWNhdGVBcm4hLFxuICAgICAgICAgICAgICBlbmRwb2ludFR5cGU6ICdSRUdJT05BTCcsXG4gICAgICAgICAgICAgIHNlY3VyaXR5UG9saWN5OiAnVExTXzFfMicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoYXBpRG9tYWluTmFtZSkge1xuICAgICAgYXBpRG9tYWluTmFtZS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlNYXBwaW5nID1cbiAgICAgIGhhc0N1c3RvbURvbWFpbiAmJiBhcGlEb21haW5OYW1lXG4gICAgICAgID8gbmV3IGFwaWdhdGV3YXl2Mi5DZm5BcGlNYXBwaW5nKHRoaXMsICdBcGlNYXBwaW5nJywge1xuICAgICAgICAgICAgYXBpSWQ6IG1haWxIdHRwQXBpLnJlZixcbiAgICAgICAgICAgIGRvbWFpbk5hbWU6IGFwaURvbWFpbk5hbWUucmVmLFxuICAgICAgICAgICAgc3RhZ2U6IG1haWxBcGlTdGFnZS5yZWYsXG4gICAgICAgICAgICBhcGlNYXBwaW5nS2V5OiAnZXhhbXBsZXMnLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChhcGlNYXBwaW5nKSB7XG4gICAgICBhcGlNYXBwaW5nLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaURvbWFpblJlY29yZCA9XG4gICAgICBoYXNDdXN0b21Eb21haW4gJiYgaGFzSG9zdGVkWm9uZSAmJiBhcGlEb21haW5OYW1lXG4gICAgICAgID8gbmV3IHJvdXRlNTMuQ2ZuUmVjb3JkU2V0KHRoaXMsICdBcGlEb21haW5SZWNvcmQnLCB7XG4gICAgICAgICAgICBob3N0ZWRab25lSWQsXG4gICAgICAgICAgICBuYW1lOiBhcGlDdXN0b21Eb21haW5OYW1lLFxuICAgICAgICAgICAgdHlwZTogJ0EnLFxuICAgICAgICAgICAgYWxpYXNUYXJnZXQ6IHtcbiAgICAgICAgICAgICAgZG5zTmFtZTogYXBpRG9tYWluTmFtZS5hdHRyUmVnaW9uYWxEb21haW5OYW1lLFxuICAgICAgICAgICAgICBob3N0ZWRab25lSWQ6IGFwaURvbWFpbk5hbWUuYXR0clJlZ2lvbmFsSG9zdGVkWm9uZUlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoYXBpRG9tYWluUmVjb3JkKSB7XG4gICAgICBhcGlEb21haW5SZWNvcmQuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG4gICAgfVxuICAgIGlmIChhcGlNYXBwaW5nICYmIGFwaURvbWFpbk5hbWUpIHtcbiAgICAgIGFwaU1hcHBpbmcuYWRkRGVwZW5kZW5jeShhcGlEb21haW5OYW1lKTtcbiAgICAgIGFwaU1hcHBpbmcuYWRkRGVwZW5kZW5jeShtYWlsQXBpU3RhZ2UpO1xuICAgIH1cbiAgICBpZiAoYXBpRG9tYWluUmVjb3JkICYmIGFwaURvbWFpbk5hbWUpIHtcbiAgICAgIGFwaURvbWFpblJlY29yZC5hZGREZXBlbmRlbmN5KGFwaURvbWFpbk5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IGJhc2VVcmwgPSBoYXNDdXN0b21Eb21haW5cbiAgICAgID8gYGh0dHBzOi8vJHthcGlDdXN0b21Eb21haW5OYW1lfS9leGFtcGxlcy9nbWFpbC12aWV3ZXJgXG4gICAgICA6IGNkay5Gbi5qb2luKCcnLCBbbWFpbEh0dHBBcGkuYXR0ckFwaUVuZHBvaW50LCAnLycsIG1haWxBcGlTdGFnZS5yZWYsICcvZ21haWwtdmlld2VyJ10pO1xuXG4gICAgY29uc3Qgc2VydmljZU5hbWVzcGFjZSA9IG5ldyBzZXJ2aWNlZGlzY292ZXJ5LkNmblByaXZhdGVEbnNOYW1lc3BhY2UodGhpcywgJ1NlcnZpY2VOYW1lc3BhY2UnLCB7XG4gICAgICBuYW1lOiBzZXJ2aWNlRGlzY292ZXJ5TmFtZXNwYWNlTmFtZSxcbiAgICAgIHZwYzogdnBjLnZwY0lkLFxuICAgICAgZGVzY3JpcHRpb246ICdOYW1lc3BhY2UgZm9yIG1haWwgc2VydmljZXMnLFxuICAgIH0pO1xuICAgIHNlcnZpY2VOYW1lc3BhY2UuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG5cbiAgICBjb25zdCBhcGlWcGNMaW5rID0gbmV3IGFwaWdhdGV3YXl2Mi5DZm5WcGNMaW5rKHRoaXMsICdBcGlWcGNMaW5rJywge1xuICAgICAgbmFtZTogJ21haWwtZXhhbXBsZS12cGNsaW5rJyxcbiAgICAgIHN1Ym5ldElkczogc2VydmljZVN1Ym5ldElkcyxcbiAgICAgIHNlY3VyaXR5R3JvdXBJZHM6IFthcGlWcGNMaW5rU2VjdXJpdHlHcm91cC5yZWZdLFxuICAgIH0pO1xuICAgIGFwaVZwY0xpbmsuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG5cbiAgICBjb25zdCBhcHBDbG91ZE1hcFNlcnZpY2UgPSBuZXcgc2VydmljZWRpc2NvdmVyeS5DZm5TZXJ2aWNlKHRoaXMsICdBcHBDbG91ZE1hcFNlcnZpY2UnLCB7XG4gICAgICBuYW1lOiAnbWFpbC1leGFtcGxlJyxcbiAgICAgIG5hbWVzcGFjZUlkOiBzZXJ2aWNlTmFtZXNwYWNlLnJlZixcbiAgICAgIGRuc0NvbmZpZzoge1xuICAgICAgICByb3V0aW5nUG9saWN5OiAnV0VJR0hURUQnLFxuICAgICAgICBkbnNSZWNvcmRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHRsOiBzZXJ2aWNlRGlzY292ZXJ5VHRsLFxuICAgICAgICAgICAgdHlwZTogJ1NSVicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBoZWFsdGhDaGVja0N1c3RvbUNvbmZpZzoge1xuICAgICAgICBmYWlsdXJlVGhyZXNob2xkOiAxLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBhcHBDbG91ZE1hcFNlcnZpY2UuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG5cbiAgICBjb25zdCB0YXNrRXhlY3V0aW9uUm9sZSA9IG5ldyBpYW0uQ2ZuUm9sZSh0aGlzLCAnVGFza0V4ZWN1dGlvblJvbGUnLCB7XG4gICAgICBhc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxuICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgICAgU2VydmljZTogJ2Vjcy10YXNrcy5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBBY3Rpb246ICdzdHM6QXNzdW1lUm9sZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBtYW5hZ2VkUG9saWN5QXJuczogWydhcm46YXdzOmlhbTo6YXdzOnBvbGljeS9zZXJ2aWNlLXJvbGUvQW1hem9uRUNTVGFza0V4ZWN1dGlvblJvbGVQb2xpY3knXSxcbiAgICAgIHBvbGljaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwb2xpY3lOYW1lOiAnQWxsb3dQYXJhbWV0ZXJSZWFkRm9yU2VjcmV0cycsXG4gICAgICAgICAgcG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcbiAgICAgICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgICAgIEFjdGlvbjogWydzc206R2V0UGFyYW1ldGVyJywgJ3NzbTpHZXRQYXJhbWV0ZXJzJywgJ3NzbTpHZXRQYXJhbWV0ZXJzQnlQYXRoJywgJ2ttczpEZWNyeXB0J10sXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgICAgICAgICAgIGBhcm46YXdzOnNzbToke3RoaXMucmVnaW9ufToke3RoaXMuYWNjb3VudH06cGFyYW1ldGVyJHtzc21QcmVmaXh9KmAsXG4gICAgICAgICAgICAgICAgICBgYXJuOmF3czprbXM6JHt0aGlzLnJlZ2lvbn06JHt0aGlzLmFjY291bnR9OmtleS8qYCxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICB0YXNrRXhlY3V0aW9uUm9sZS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcblxuICAgIGNvbnN0IHRhc2tSb2xlID0gbmV3IGlhbS5DZm5Sb2xlKHRoaXMsICdUYXNrUm9sZScsIHtcbiAgICAgIGFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgIFByaW5jaXBhbDoge1xuICAgICAgICAgICAgICBTZXJ2aWNlOiAnZWNzLXRhc2tzLmFtYXpvbmF3cy5jb20nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEFjdGlvbjogJ3N0czpBc3N1bWVSb2xlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHBvbGljaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwb2xpY3lOYW1lOiAnQXBwUnVudGltZUNvbmZpZ1JlYWQnLFxuICAgICAgICAgIHBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgICBBY3Rpb246IFsnc3NtOkdldFBhcmFtZXRlcicsICdzc206R2V0UGFyYW1ldGVycycsICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsICdrbXM6RGVjcnlwdCddLFxuICAgICAgICAgICAgICAgIFJlc291cmNlOiBbXG4gICAgICAgICAgICAgICAgICBgYXJuOmF3czpzc206JHt0aGlzLnJlZ2lvbn06JHt0aGlzLmFjY291bnR9OnBhcmFtZXRlciR7c3NtUHJlZml4fSpgLFxuICAgICAgICAgICAgICAgICAgYGFybjphd3M6a21zOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTprZXkvKmAsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgdGFza1JvbGUuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG5cbiAgICBjb25zdCBhcHBUYXNrRGVmaW5pdGlvbiA9IG5ldyBlY3MuQ2ZuVGFza0RlZmluaXRpb24odGhpcywgJ0FwcFRhc2tEZWZpbml0aW9uJywge1xuICAgICAgZmFtaWx5OiAnbWFpbC1leGFtcGxlJyxcbiAgICAgIGNwdTogY29udGFpbmVyQ3B1LnRvU3RyaW5nKCksXG4gICAgICBtZW1vcnk6IGNvbnRhaW5lck1lbW9yeS50b1N0cmluZygpLFxuICAgICAgbmV0d29ya01vZGU6ICdhd3N2cGMnLFxuICAgICAgcmVxdWlyZXNDb21wYXRpYmlsaXRpZXM6IFsnRkFSR0FURSddLFxuICAgICAgZXhlY3V0aW9uUm9sZUFybjogdGFza0V4ZWN1dGlvblJvbGUuYXR0ckFybixcbiAgICAgIHRhc2tSb2xlQXJuOiB0YXNrUm9sZS5hdHRyQXJuLFxuICAgICAgY29udGFpbmVyRGVmaW5pdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdtYWlsLWV4YW1wbGUnLFxuICAgICAgICAgIGltYWdlOiBgJHttYWlsRXhhbXBsZVJlcG9zaXRvcnkuYXR0clJlcG9zaXRvcnlVcml9OmxhdGVzdGAsXG4gICAgICAgICAgcG9ydE1hcHBpbmdzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnRhaW5lclBvcnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgbG9nQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgbG9nRHJpdmVyOiAnYXdzbG9ncycsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICdhd3Nsb2dzLWdyb3VwJzogYXBwTG9nR3JvdXAucmVmLFxuICAgICAgICAgICAgICAnYXdzbG9ncy1yZWdpb24nOiB0aGlzLnJlZ2lvbixcbiAgICAgICAgICAgICAgJ2F3c2xvZ3Mtc3RyZWFtLXByZWZpeCc6ICdtYWlsLWV4YW1wbGUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudmlyb25tZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdDT05GSUdfU1NNX1BSRUZJWCcsXG4gICAgICAgICAgICAgIHZhbHVlOiBzc21QcmVmaXgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnUE9SVCcsXG4gICAgICAgICAgICAgIHZhbHVlOiBjb250YWluZXJQb3J0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnQkFTRV9VUkwnLFxuICAgICAgICAgICAgICB2YWx1ZTogYmFzZVVybC50b1N0cmluZygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ05PREVfRU5WJyxcbiAgICAgICAgICAgICAgdmFsdWU6IHB1YmxpY0VudlZhbHVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHNlY3JldHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ0dPT0dMRV9DTElFTlRfSUQnLFxuICAgICAgICAgICAgICB2YWx1ZUZyb206IGBhcm46YXdzOnNzbToke3RoaXMucmVnaW9ufToke3RoaXMuYWNjb3VudH06cGFyYW1ldGVyJHtzc21QcmVmaXh9L2Vudi9HT09HTEVfQ0xJRU5UX0lEYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdHT09HTEVfQ0xJRU5UX1NFQ1JFVCcsXG4gICAgICAgICAgICAgIHZhbHVlRnJvbTogYGFybjphd3M6c3NtOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTpwYXJhbWV0ZXIke3NzbVByZWZpeH0vc2VjcmV0cy9HT09HTEVfQ0xJRU5UX1NFQ1JFVGAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnU0VTU0lPTl9TRUNSRVQnLFxuICAgICAgICAgICAgICB2YWx1ZUZyb206IGBhcm46YXdzOnNzbToke3RoaXMucmVnaW9ufToke3RoaXMuYWNjb3VudH06cGFyYW1ldGVyJHtzc21QcmVmaXh9L3NlY3JldHMvU0VTU0lPTl9TRUNSRVRgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBhcHBUYXNrRGVmaW5pdGlvbi5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcblxuICAgIG5ldyBlY3MuQ2ZuU2VydmljZSh0aGlzLCAnQXBwU2VydmljZScsIHtcbiAgICAgIHNlcnZpY2VOYW1lOiAnbWFpbC1leGFtcGxlJyxcbiAgICAgIGNsdXN0ZXI6IG1haWxDbHVzdGVyLnJlZixcbiAgICAgIHRhc2tEZWZpbml0aW9uOiBhcHBUYXNrRGVmaW5pdGlvbi5yZWYsXG4gICAgICBkZXNpcmVkQ291bnQsXG4gICAgICBjYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3k6IFtcbiAgICAgICAge1xuICAgICAgICAgIGNhcGFjaXR5UHJvdmlkZXI6ICdGQVJHQVRFX1NQT1QnLFxuICAgICAgICAgIHdlaWdodDogNCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNhcGFjaXR5UHJvdmlkZXI6ICdGQVJHQVRFJyxcbiAgICAgICAgICB3ZWlnaHQ6IDEsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZGVwbG95bWVudENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgbWF4aW11bVBlcmNlbnQ6IDIwMCxcbiAgICAgICAgbWluaW11bUhlYWx0aHlQZXJjZW50OiA1MCxcbiAgICAgIH0sXG4gICAgICBuZXR3b3JrQ29uZmlndXJhdGlvbjoge1xuICAgICAgICBhd3N2cGNDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgYXNzaWduUHVibGljSXA6ICdESVNBQkxFRCcsXG4gICAgICAgICAgc3VibmV0czogc2VydmljZVN1Ym5ldElkcyxcbiAgICAgICAgICBzZWN1cml0eUdyb3VwczogW3NlcnZpY2VTZWN1cml0eUdyb3VwLnJlZl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2VydmljZVJlZ2lzdHJpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZ2lzdHJ5QXJuOiBhcHBDbG91ZE1hcFNlcnZpY2UuYXR0ckFybixcbiAgICAgICAgICBjb250YWluZXJOYW1lOiAnbWFpbC1leGFtcGxlJyxcbiAgICAgICAgICBjb250YWluZXJQb3J0OiBjb250YWluZXJQb3J0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHBsYXRmb3JtVmVyc2lvbjogJ0xBVEVTVCcsXG4gICAgfSk7XG5cbiAgICBjb25zdCBtYWlsSW50ZWdyYXRpb24gPSBuZXcgYXBpZ2F0ZXdheXYyLkNmbkludGVncmF0aW9uKHRoaXMsICdNYWlsSW50ZWdyYXRpb24nLCB7XG4gICAgICBhcGlJZDogbWFpbEh0dHBBcGkucmVmLFxuICAgICAgaW50ZWdyYXRpb25UeXBlOiAnSFRUUF9QUk9YWScsXG4gICAgICBpbnRlZ3JhdGlvbk1ldGhvZDogJ0FOWScsXG4gICAgICBpbnRlZ3JhdGlvblVyaTogYXBwQ2xvdWRNYXBTZXJ2aWNlLmF0dHJBcm4sXG4gICAgICBjb25uZWN0aW9uVHlwZTogJ1ZQQ19MSU5LJyxcbiAgICAgIGNvbm5lY3Rpb25JZDogYXBpVnBjTGluay5yZWYsXG4gICAgICBwYXlsb2FkRm9ybWF0VmVyc2lvbjogJzEuMCcsXG4gICAgfSk7XG5cbiAgICBuZXcgYXBpZ2F0ZXdheXYyLkNmblJvdXRlKHRoaXMsICdHbWFpbFZpZXdlclJvdXRlJywge1xuICAgICAgYXBpSWQ6IG1haWxIdHRwQXBpLnJlZixcbiAgICAgIHJvdXRlS2V5OiAnQU5ZIC9nbWFpbC12aWV3ZXInLFxuICAgICAgdGFyZ2V0OiBgaW50ZWdyYXRpb25zLyR7bWFpbEludGVncmF0aW9uLnJlZn1gLFxuICAgIH0pO1xuXG4gICAgbmV3IGFwaWdhdGV3YXl2Mi5DZm5Sb3V0ZSh0aGlzLCAnR21haWxWaWV3ZXJQcm94eVJvdXRlJywge1xuICAgICAgYXBpSWQ6IG1haWxIdHRwQXBpLnJlZixcbiAgICAgIHJvdXRlS2V5OiAnQU5ZIC9nbWFpbC12aWV3ZXIve3Byb3h5K30nLFxuICAgICAgdGFyZ2V0OiBgaW50ZWdyYXRpb25zLyR7bWFpbEludGVncmF0aW9uLnJlZn1gLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3NtQmFzZVVybCA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdTc21CYXNlVXJsJywge1xuICAgICAgcGFyYW1ldGVyTmFtZTogYCR7c3NtUHJlZml4fS9lbnYvQkFTRV9VUkxgLFxuICAgICAgc3RyaW5nVmFsdWU6IGJhc2VVcmwsXG4gICAgICB0eXBlOiBzc20uUGFyYW1ldGVyVHlwZS5TVFJJTkcsXG4gICAgfSk7XG4gICAgKHNzbUJhc2VVcmwubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc3NtLkNmblBhcmFtZXRlcikuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG5cbiAgICBjb25zdCBzc21Hb29nbGVDbGllbnRJZCA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdTc21Hb29nbGVDbGllbnRJZCcsIHtcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vZW52L0dPT0dMRV9DTElFTlRfSURgLFxuICAgICAgc3RyaW5nVmFsdWU6IGdvb2dsZUNsaWVudElkLFxuICAgICAgdHlwZTogc3NtLlBhcmFtZXRlclR5cGUuU1RSSU5HLFxuICAgIH0pO1xuICAgIChzc21Hb29nbGVDbGllbnRJZC5ub2RlLmRlZmF1bHRDaGlsZCBhcyBzc20uQ2ZuUGFyYW1ldGVyKS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcblxuICAgIGNvbnN0IHNzbUdvb2dsZUNsaWVudFNlY3JldCA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdTc21Hb29nbGVDbGllbnRTZWNyZXQnLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiBgJHtzc21QcmVmaXh9L3NlY3JldHMvR09PR0xFX0NMSUVOVF9TRUNSRVRgLFxuICAgICAgc3RyaW5nVmFsdWU6IGdvb2dsZUNsaWVudFNlY3JldCxcbiAgICAgIHR5cGU6IHNzbS5QYXJhbWV0ZXJUeXBlLlNUUklORyxcbiAgICB9KTtcbiAgICAoc3NtR29vZ2xlQ2xpZW50U2VjcmV0Lm5vZGUuZGVmYXVsdENoaWxkIGFzIHNzbS5DZm5QYXJhbWV0ZXIpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xuXG4gICAgY29uc3Qgc3NtUG9ydCA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdTc21Qb3J0Jywge1xuICAgICAgcGFyYW1ldGVyTmFtZTogYCR7c3NtUHJlZml4fS9lbnYvUE9SVGAsXG4gICAgICBzdHJpbmdWYWx1ZTogY29udGFpbmVyUG9ydC50b1N0cmluZygpLFxuICAgICAgdHlwZTogc3NtLlBhcmFtZXRlclR5cGUuU1RSSU5HLFxuICAgIH0pO1xuICAgIChzc21Qb3J0Lm5vZGUuZGVmYXVsdENoaWxkIGFzIHNzbS5DZm5QYXJhbWV0ZXIpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xuXG4gICAgY29uc3Qgc3NtUHVibGljRW52ID0gbmV3IHNzbS5TdHJpbmdQYXJhbWV0ZXIodGhpcywgJ1NzbVB1YmxpY0VudicsIHtcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vZW52L05PREVfRU5WYCxcbiAgICAgIHN0cmluZ1ZhbHVlOiBwdWJsaWNFbnZWYWx1ZSxcbiAgICAgIHR5cGU6IHNzbS5QYXJhbWV0ZXJUeXBlLlNUUklORyxcbiAgICB9KTtcbiAgICAoc3NtUHVibGljRW52Lm5vZGUuZGVmYXVsdENoaWxkIGFzIHNzbS5DZm5QYXJhbWV0ZXIpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xuXG4gICAgY29uc3Qgc3NtU2Vzc2lvblNlY3JldCA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdTc21TZXNzaW9uU2VjcmV0Jywge1xuICAgICAgcGFyYW1ldGVyTmFtZTogYCR7c3NtUHJlZml4fS9zZWNyZXRzL1NFU1NJT05fU0VDUkVUYCxcbiAgICAgIHN0cmluZ1ZhbHVlOiBzZXNzaW9uU2VjcmV0VmFsdWUsXG4gICAgICB0eXBlOiBzc20uUGFyYW1ldGVyVHlwZS5TVFJJTkcsXG4gICAgfSk7XG4gICAgKHNzbVNlc3Npb25TZWNyZXQubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc3NtLkNmblBhcmFtZXRlcikuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG5cbiAgICBjb25zdCBjb2RlQnVpbGRSb2xlID0gbmV3IGlhbS5DZm5Sb2xlKHRoaXMsICdDb2RlQnVpbGRSb2xlJywge1xuICAgICAgYXNzdW1lUm9sZVBvbGljeURvY3VtZW50OiB7XG4gICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcbiAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgUHJpbmNpcGFsOiB7XG4gICAgICAgICAgICAgIFNlcnZpY2U6ICdjb2RlYnVpbGQuYW1hem9uYXdzLmNvbScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgQWN0aW9uOiAnc3RzOkFzc3VtZVJvbGUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgcG9saWNpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHBvbGljeU5hbWU6ICdCdWlsZExvZ3MnLFxuICAgICAgICAgIHBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgICBBY3Rpb246IFsnbG9nczpDcmVhdGVMb2dHcm91cCcsICdsb2dzOkNyZWF0ZUxvZ1N0cmVhbScsICdsb2dzOlB1dExvZ0V2ZW50cyddLFxuICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwb2xpY3lOYW1lOiAnRUNSUHVzaCcsXG4gICAgICAgICAgcG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcbiAgICAgICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgICAgIEFjdGlvbjogW1xuICAgICAgICAgICAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxuICAgICAgICAgICAgICAgICAgJ2VjcjpCYXRjaENoZWNrTGF5ZXJBdmFpbGFiaWxpdHknLFxuICAgICAgICAgICAgICAgICAgJ2VjcjpDb21wbGV0ZUxheWVyVXBsb2FkJyxcbiAgICAgICAgICAgICAgICAgICdlY3I6QmF0Y2hHZXRJbWFnZScsXG4gICAgICAgICAgICAgICAgICAnZWNyOkRlc2NyaWJlUmVwb3NpdG9yaWVzJyxcbiAgICAgICAgICAgICAgICAgICdlY3I6SW5pdGlhdGVMYXllclVwbG9hZCcsXG4gICAgICAgICAgICAgICAgICAnZWNyOlB1dEltYWdlJyxcbiAgICAgICAgICAgICAgICAgICdlY3I6VXBsb2FkTGF5ZXJQYXJ0JyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwb2xpY3lOYW1lOiAnRUNTRGVwbG95JyxcbiAgICAgICAgICBwb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxuICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICAgICAgQWN0aW9uOiBbJ2VjczpVcGRhdGVTZXJ2aWNlJywgJ2VjczpEZXNjcmliZVNlcnZpY2VzJywgJ2VjczpEZXNjcmliZUNsdXN0ZXJzJ10sXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6ICcqJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBvbGljeU5hbWU6ICdTU01SZWFkRm9yQnVpbGQnLFxuICAgICAgICAgIHBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgICBBY3Rpb246IFsnc3NtOkdldFBhcmFtZXRlcicsICdzc206R2V0UGFyYW1ldGVycycsICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCddLFxuICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwb2xpY3lOYW1lOiAnQ29kZUNvbm5lY3Rpb25BY2Nlc3MnLFxuICAgICAgICAgIHBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgICBBY3Rpb246IFtcbiAgICAgICAgICAgICAgICBcImNvZGVjb25uZWN0aW9uczpHZXRDb25uZWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJjb2RlY29ubmVjdGlvbnM6R2V0Q29ubmVjdGlvblRva2VuXCIsXG4gICAgICAgICAgICAgICAgXCJjb2RlY29ubmVjdGlvbnM6VXNlQ29ubmVjdGlvblwiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogcHJvcHMuY29kZUNvbm5lY3Rpb25Bcm4sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgfSk7XG4gICAgY29kZUJ1aWxkUm9sZS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcblxuICAgIC8vIFVzZSB0aGUgaGlnaGVyLWxldmVsIFByb2plY3QgY29uc3RydWN0IHNvIHdlIGNhbiBwcm92aWRlIGEgdHlwZWQgQnVpbGRTcGVjXG4gICAgY29uc3QgY29kZWJ1aWxkUm9sZVJlZiA9IGlhbS5Sb2xlLmZyb21Sb2xlQXJuKHRoaXMsICdDb2RlQnVpbGRSb2xlUmVmJywgY29kZUJ1aWxkUm9sZS5hdHRyQXJuKTtcblxuICAgIGNvbnN0IGNvZGVCdWlsZFByb2plY3QgPSBuZXcgY29kZWJ1aWxkLlByb2plY3QodGhpcywgJ0NvZGVCdWlsZFByb2plY3QnLCB7XG4gICAgICBwcm9qZWN0TmFtZTogJ21haWwtZXhhbXBsZScsXG4gICAgICByb2xlOiBjb2RlYnVpbGRSb2xlUmVmLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgYnVpbGRJbWFnZTogY29kZWJ1aWxkLkxpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF83XzAsXG4gICAgICAgIGNvbXB1dGVUeXBlOiBjb2RlYnVpbGQuQ29tcHV0ZVR5cGUuU01BTEwsXG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWUsXG4gICAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiB7XG4gICAgICAgICAgRUNSX1VSSTogeyB2YWx1ZTogbWFpbEV4YW1wbGVSZXBvc2l0b3J5LmF0dHJSZXBvc2l0b3J5VXJpIH0sXG4gICAgICAgICAgQ0xVU1RFUl9OQU1FOiB7IHZhbHVlOiBtYWlsQ2x1c3Rlci5yZWYgfSxcbiAgICAgICAgICBTRVJWSUNFX05BTUU6IHsgdmFsdWU6ICdtYWlsLWV4YW1wbGUnIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc291cmNlOiBjb2RlYnVpbGQuU291cmNlLmdpdEh1Yih7IG93bmVyOiBnaXRIdWJPd25lciwgcmVwbzogZ2l0SHViUmVwbywgYnJhbmNoT3JSZWY6IGdpdEh1YkJyYW5jaCwgfSksXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICBxdWV1ZWRUaW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICBiYWRnZTogdHJ1ZSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgJiBkZXBsb3kgbWFpbC1leGFtcGxlIHRvIEVDUiB0aGVuIGZvcmNlIEVDUyBkZXBsb3knLFxuICAgICAgY2FjaGU6IGNvZGVidWlsZC5DYWNoZS5ub25lKCksXG4gICAgICBidWlsZFNwZWM6IGNvZGVidWlsZC5CdWlsZFNwZWMuZnJvbU9iamVjdCh7XG4gICAgICAgIHZlcnNpb246ICcwLjInLFxuICAgICAgICBwaGFzZXM6IHtcbiAgICAgICAgICBwcmVfYnVpbGQ6IHsgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICdlY2hvIFwiTG9nZ2luZyBpbiB0byBFQ1JcIicsXG4gICAgICAgICAgICAnYXdzIGVjciBnZXQtbG9naW4tcGFzc3dvcmQgLS1yZWdpb24gJEFXU19ERUZBVUxUX1JFR0lPTiB8IGRvY2tlciBsb2dpbiAtLXVzZXJuYW1lIEFXUyAtLXBhc3N3b3JkLXN0ZGluICRFQ1JfVVJJJyxcbiAgICAgICAgICAgICdJTUFHRV9UQUc9JHtDT0RFQlVJTERfUkVTT0xWRURfU09VUkNFX1ZFUlNJT046LWxhdGVzdH0nLFxuICAgICAgICAgIF19LFxuICAgICAgICAgIGJ1aWxkOiB7IGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAnY2QgZXhhbXBsZXMvZ21haWwtdmlld2VyJyxcbiAgICAgICAgICAgICdkb2NrZXIgYnVpbGQgLXQgJEVDUl9VUkk6bGF0ZXN0IC10ICRFQ1JfVVJJOiRJTUFHRV9UQUcgLicsXG4gICAgICAgICAgXSB9LFxuICAgICAgICAgIHBvc3RfYnVpbGQ6IHsgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICdkb2NrZXIgcHVzaCAkRUNSX1VSSTpsYXRlc3QnLFxuICAgICAgICAgICAgJ2RvY2tlciBwdXNoICRFQ1JfVVJJOiRJTUFHRV9UQUcnLFxuICAgICAgICAgICAgJ2F3cyBlY3MgdXBkYXRlLXNlcnZpY2UgLS1jbHVzdGVyICRDTFVTVEVSX05BTUUgLS1zZXJ2aWNlICRTRVJWSUNFX05BTUUgLS1mb3JjZS1uZXctZGVwbG95bWVudCcsXG4gICAgICAgICAgXX0sXG4gICAgICAgIH0sXG4gICAgICAgIGFydGlmYWN0czogeyBmaWxlczogW10gfSxcbiAgICAgICAgZW52OiB7IHNoZWxsOiAnYmFzaCcgfSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIChjb2RlQnVpbGRQcm9qZWN0Lm5vZGUuZGVmYXVsdENoaWxkIGFzIGNvZGVidWlsZC5DZm5Qcm9qZWN0KS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcblxuICAgIHRoaXMuY2x1c3Rlck5hbWUgPSBtYWlsQ2x1c3Rlci5yZWY7XG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ0Nmbk91dHB1dENsdXN0ZXJOYW1lJywge1xuICAgICAga2V5OiAnQ2x1c3Rlck5hbWUnLFxuICAgICAgdmFsdWU6IHRoaXMuY2x1c3Rlck5hbWUudG9TdHJpbmcoKSxcbiAgICB9KTtcbiAgICB0aGlzLnJlcG9zaXRvcnlVcmkgPSBtYWlsRXhhbXBsZVJlcG9zaXRvcnkuYXR0clJlcG9zaXRvcnlVcmk7XG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ0Nmbk91dHB1dFJlcG9zaXRvcnlVcmknLCB7XG4gICAgICBrZXk6ICdSZXBvc2l0b3J5VXJpJyxcbiAgICAgIHZhbHVlOiB0aGlzLnJlcG9zaXRvcnlVcmkudG9TdHJpbmcoKSxcbiAgICB9KTtcbiAgICB0aGlzLmFwaUludm9rZVVybCA9IGJhc2VVcmwudG9TdHJpbmcoKTtcbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnQ2ZuT3V0cHV0QXBpSW52b2tlVXJsJywge1xuICAgICAga2V5OiAnQXBpSW52b2tlVXJsJyxcbiAgICAgIHZhbHVlOiB0aGlzLmFwaUludm9rZVVybCxcbiAgICB9KTtcbiAgICB0aGlzLmNsb3VkTWFwU2VydmljZUFybiA9IGFwcENsb3VkTWFwU2VydmljZS5hdHRyQXJuO1xuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdDZm5PdXRwdXRDbG91ZE1hcFNlcnZpY2VBcm4nLCB7XG4gICAgICBrZXk6ICdDbG91ZE1hcFNlcnZpY2VBcm4nLFxuICAgICAgdmFsdWU6IHRoaXMuY2xvdWRNYXBTZXJ2aWNlQXJuLnRvU3RyaW5nKCksXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdtYWlsLXZpZXdlci1jZGstc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW1DO0FBQ25DLDJFQUE2RDtBQUM3RCxxRUFBdUQ7QUFDdkQseURBQTJDO0FBQzNDLHlEQUEyQztBQUMzQyx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLDJEQUE2QztBQUM3QyxpRUFBbUQ7QUFDbkQsbUZBQXFFO0FBQ3JFLHlEQUEyQztBQTBCM0MsTUFBYSxtQkFBb0IsU0FBUSxHQUFHLENBQUMsS0FBSztJQUNoQyxXQUFXLENBQVM7SUFDcEIsYUFBYSxDQUFTO0lBQ3RCLFlBQVksQ0FBUztJQUNyQixrQkFBa0IsQ0FBUztJQUUzQyxZQUFtQixLQUFjLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQzVFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBa0MsRUFBRSxRQUFnQixFQUFVLEVBQUU7WUFDaEYsTUFBTSxTQUFTLEdBQUcsS0FBSyxJQUFJLFFBQVEsQ0FBQztZQUNwQyxNQUFNLE1BQU0sR0FBRyxPQUFPLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDckQsQ0FBQyxDQUFDO1FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFrQyxFQUFVLEVBQUU7WUFDaEUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNwQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzdDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuRSxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUM7UUFDcEQsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDO1FBRWpELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQsTUFBTSw2QkFBNkIsR0FBRyxLQUFLLENBQUMsNkJBQTZCLElBQUksWUFBWSxDQUFDO1FBQzFGLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsU0FBUyxJQUFJLGVBQWUsQ0FBQztRQUN4RCxNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekUsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxrQkFBa0IsQ0FBQztRQUM1RCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLGlCQUFpQixDQUFDO1FBQ3pELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksTUFBTSxDQUFDO1FBQ2pGLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLElBQUksWUFBWSxDQUFDO1FBQzVELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLElBQUksU0FBUyxDQUFDO1FBQ3pELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixJQUFJLFNBQVMsQ0FBQztRQUNqRSxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxTQUFTLENBQUM7UUFDakUsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsbUJBQW1CLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxpQkFBaUIsQ0FBQztRQUM1RyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFDeEgsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDOUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU1QyxJQUFJLEdBQWEsQ0FBQztRQUNsQixJQUFJLGdCQUEwQixDQUFDO1FBQy9CLElBQUksZ0JBQTBCLENBQUM7UUFFL0IseUZBQXlGO1FBQ3pGLHNHQUFzRztRQUN0RyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEQsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXpFLElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUM1QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0oscUZBQXFGO2dCQUNyRixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUM7Z0JBRXpCLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3pCLHlDQUF5QztvQkFDekMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxDQUFDO2dCQUN4RSxDQUFDO2dCQUVELGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFNUQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsS0FBSyw2RkFBNkYsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDM0ksQ0FBQztZQUNMLENBQUM7WUFDRCxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN0QyxDQUFDO2FBQU0sQ0FBQztZQUNOLGtGQUFrRjtZQUNsRixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtnQkFDMUQsSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTthQUMzQixDQUFDLENBQUM7WUFFSCwwR0FBMEc7WUFDMUcsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFO2dCQUNoRixJQUFJLEVBQUUsb0JBQW9CO2dCQUMxQixPQUFPLEVBQUUsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2FBQ3ZHLENBQUMsQ0FBQztZQUNILCtHQUErRztZQUMvRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO2dCQUMvQyxLQUFLLEVBQUUsVUFBVSxDQUFDLGFBQWE7Z0JBQy9CLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFO2dCQUNsQyxnQkFBZ0IsRUFBRSxxQkFBcUIsQ0FBQyxXQUFXO2FBQ3BELENBQUMsQ0FBQztZQUNILGdCQUFnQixHQUFHLEtBQUssQ0FBQyxjQUFjLElBQUkscUJBQXFCLENBQUMsV0FBVyxDQUFDO1lBQzdFLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3RDLENBQUM7UUFFRCxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSx5QkFBeUIsRUFBRTtZQUN4RixnQkFBZ0IsRUFBRSw2Q0FBNkM7WUFDL0QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ2hCLG1CQUFtQixFQUFFO2dCQUNuQjtvQkFDRSxVQUFVLEVBQUUsS0FBSztvQkFDakIsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLE1BQU0sRUFBRSxhQUFhO29CQUNyQixNQUFNLEVBQUUsV0FBVztpQkFDcEI7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUVqRixNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtZQUNsRixnQkFBZ0IsRUFBRSxtREFBbUQ7WUFDckUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ2hCLG9CQUFvQixFQUFFO2dCQUNwQjtvQkFDRSxVQUFVLEVBQUUsS0FBSztvQkFDakIsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLE1BQU0sRUFBRSxhQUFhO29CQUNyQixNQUFNLEVBQUUsV0FBVztpQkFDcEI7YUFDRjtZQUNELG1CQUFtQixFQUFFO2dCQUNuQjtvQkFDRSxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxFQUFFLEtBQUs7b0JBQ2IsTUFBTSxFQUFFLFdBQVc7aUJBQ3BCO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFDSCxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDNUQsWUFBWSxFQUFFLG1CQUFtQjtZQUNqQyxlQUFlLEVBQUUsRUFBRTtTQUNwQixDQUFDLENBQUM7UUFDSCxXQUFXLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRXJFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQzFELFdBQVcsRUFBRSxjQUFjO1lBQzNCLGlCQUFpQixFQUFFLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQztZQUM5QywrQkFBK0IsRUFBRTtnQkFDL0I7b0JBQ0UsZ0JBQWdCLEVBQUUsY0FBYztvQkFDaEMsTUFBTSxFQUFFLENBQUM7aUJBQ1Y7Z0JBQ0Q7b0JBQ0UsZ0JBQWdCLEVBQUUsU0FBUztvQkFDM0IsTUFBTSxFQUFFLENBQUM7aUJBQ1Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFckUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFO1lBQ2pGLGNBQWMsRUFBRSxjQUFjO1lBQzlCLGtCQUFrQixFQUFFLFNBQVM7WUFDN0IsdUJBQXVCLEVBQUU7Z0JBQ3ZCLGNBQWMsRUFBRSxRQUFRO2FBQ3pCO1lBQ0QsZUFBZSxFQUFFO2dCQUNmLG1CQUFtQixFQUNqQixtVUFBbVU7YUFDdFU7U0FDRixDQUFDLENBQUM7UUFDSCxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFL0UsTUFBTSxXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDL0QsSUFBSSxFQUFFLGNBQWM7WUFDcEIsWUFBWSxFQUFFLE1BQU07U0FDckIsQ0FBQyxDQUFDO1FBQ0gsV0FBVyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUVyRSxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUNuRSxTQUFTLEVBQUUsTUFBTTtZQUNqQixLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUc7WUFDdEIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUV0RSxNQUFNLGFBQWEsR0FBRyxlQUFlO1lBQ25DLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRTtnQkFDcEQsVUFBVSxFQUFFLG1CQUFtQjtnQkFDL0Isd0JBQXdCLEVBQUU7b0JBQ3hCO3dCQUNFLGNBQWMsRUFBRSxjQUFlO3dCQUMvQixZQUFZLEVBQUUsVUFBVTt3QkFDeEIsY0FBYyxFQUFFLFNBQVM7cUJBQzFCO2lCQUNGO2FBQ0YsQ0FBQztZQUNKLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLGFBQWEsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDekUsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUNkLGVBQWUsSUFBSSxhQUFhO1lBQzlCLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtnQkFDakQsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHO2dCQUN0QixVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUc7Z0JBQzdCLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDdkIsYUFBYSxFQUFFLFVBQVU7YUFDMUIsQ0FBQztZQUNKLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLFVBQVUsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDdEUsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUNuQixlQUFlLElBQUksYUFBYSxJQUFJLGFBQWE7WUFDL0MsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7Z0JBQ2hELFlBQVk7Z0JBQ1osSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsV0FBVyxFQUFFO29CQUNYLE9BQU8sRUFBRSxhQUFhLENBQUMsc0JBQXNCO29CQUM3QyxZQUFZLEVBQUUsYUFBYSxDQUFDLHdCQUF3QjtpQkFDckQ7YUFDRixDQUFDO1lBQ0osQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoQixJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLGVBQWUsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDM0UsQ0FBQztRQUNELElBQUksVUFBVSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2hDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDeEMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxlQUFlLElBQUksYUFBYSxFQUFFLENBQUM7WUFDckMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsZUFBZTtZQUM3QixDQUFDLENBQUMsV0FBVyxtQkFBbUIsd0JBQXdCO1lBQ3hELENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFFM0YsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUM3RixJQUFJLEVBQUUsNkJBQTZCO1lBQ25DLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSztZQUNkLFdBQVcsRUFBRSw2QkFBNkI7U0FDM0MsQ0FBQyxDQUFDO1FBQ0gsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRTFFLE1BQU0sVUFBVSxHQUFHLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ2pFLElBQUksRUFBRSxzQkFBc0I7WUFDNUIsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixnQkFBZ0IsRUFBRSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQztTQUNoRCxDQUFDLENBQUM7UUFDSCxVQUFVLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRXBFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ3JGLElBQUksRUFBRSxjQUFjO1lBQ3BCLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHO1lBQ2pDLFNBQVMsRUFBRTtnQkFDVCxhQUFhLEVBQUUsVUFBVTtnQkFDekIsVUFBVSxFQUFFO29CQUNWO3dCQUNFLEdBQUcsRUFBRSxtQkFBbUI7d0JBQ3hCLElBQUksRUFBRSxLQUFLO3FCQUNaO2lCQUNGO2FBQ0Y7WUFDRCx1QkFBdUIsRUFBRTtnQkFDdkIsZ0JBQWdCLEVBQUUsQ0FBQzthQUNwQjtTQUNGLENBQUMsQ0FBQztRQUNILGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUU1RSxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDbkUsd0JBQXdCLEVBQUU7Z0JBQ3hCLE9BQU8sRUFBRSxZQUFZO2dCQUNyQixTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsTUFBTSxFQUFFLE9BQU87d0JBQ2YsU0FBUyxFQUFFOzRCQUNULE9BQU8sRUFBRSx5QkFBeUI7eUJBQ25DO3dCQUNELE1BQU0sRUFBRSxnQkFBZ0I7cUJBQ3pCO2lCQUNGO2FBQ0Y7WUFDRCxpQkFBaUIsRUFBRSxDQUFDLHVFQUF1RSxDQUFDO1lBQzVGLFFBQVEsRUFBRTtnQkFDUjtvQkFDRSxVQUFVLEVBQUUsOEJBQThCO29CQUMxQyxjQUFjLEVBQUU7d0JBQ2QsT0FBTyxFQUFFLFlBQVk7d0JBQ3JCLFNBQVMsRUFBRTs0QkFDVDtnQ0FDRSxNQUFNLEVBQUUsT0FBTztnQ0FDZixNQUFNLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSx5QkFBeUIsRUFBRSxhQUFhLENBQUM7Z0NBQzNGLFFBQVEsRUFBRTtvQ0FDUixlQUFlLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sYUFBYSxTQUFTLEdBQUc7b0NBQ25FLGVBQWUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxRQUFRO2lDQUNuRDs2QkFDRjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRTNFLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ2pELHdCQUF3QixFQUFFO2dCQUN4QixPQUFPLEVBQUUsWUFBWTtnQkFDckIsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE1BQU0sRUFBRSxPQUFPO3dCQUNmLFNBQVMsRUFBRTs0QkFDVCxPQUFPLEVBQUUseUJBQXlCO3lCQUNuQzt3QkFDRCxNQUFNLEVBQUUsZ0JBQWdCO3FCQUN6QjtpQkFDRjthQUNGO1lBQ0QsUUFBUSxFQUFFO2dCQUNSO29CQUNFLFVBQVUsRUFBRSxzQkFBc0I7b0JBQ2xDLGNBQWMsRUFBRTt3QkFDZCxPQUFPLEVBQUUsWUFBWTt3QkFDckIsU0FBUyxFQUFFOzRCQUNUO2dDQUNFLE1BQU0sRUFBRSxPQUFPO2dDQUNmLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLHlCQUF5QixFQUFFLGFBQWEsQ0FBQztnQ0FDM0YsUUFBUSxFQUFFO29DQUNSLGVBQWUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxhQUFhLFNBQVMsR0FBRztvQ0FDbkUsZUFBZSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLFFBQVE7aUNBQ25EOzZCQUNGO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRWxFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQzdFLE1BQU0sRUFBRSxjQUFjO1lBQ3RCLEdBQUcsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFO1lBQzVCLE1BQU0sRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQ2xDLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLHVCQUF1QixFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3BDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLE9BQU87WUFDM0MsV0FBVyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1lBQzdCLG9CQUFvQixFQUFFO2dCQUNwQjtvQkFDRSxJQUFJLEVBQUUsY0FBYztvQkFDcEIsS0FBSyxFQUFFLEdBQUcscUJBQXFCLENBQUMsaUJBQWlCLFNBQVM7b0JBQzFELFlBQVksRUFBRTt3QkFDWjs0QkFDRSxhQUFhO3lCQUNkO3FCQUNGO29CQUNELGdCQUFnQixFQUFFO3dCQUNoQixTQUFTLEVBQUUsU0FBUzt3QkFDcEIsT0FBTyxFQUFFOzRCQUNQLGVBQWUsRUFBRSxXQUFXLENBQUMsR0FBRzs0QkFDaEMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU07NEJBQzdCLHVCQUF1QixFQUFFLGNBQWM7eUJBQ3hDO3FCQUNGO29CQUNELFdBQVcsRUFBRTt3QkFDWDs0QkFDRSxJQUFJLEVBQUUsbUJBQW1COzRCQUN6QixLQUFLLEVBQUUsU0FBUzt5QkFDakI7d0JBQ0Q7NEJBQ0UsSUFBSSxFQUFFLE1BQU07NEJBQ1osS0FBSyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUU7eUJBQ2hDO3dCQUNEOzRCQUNFLElBQUksRUFBRSxVQUFVOzRCQUNoQixLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRTt5QkFDMUI7d0JBQ0Q7NEJBQ0UsSUFBSSxFQUFFLFVBQVU7NEJBQ2hCLEtBQUssRUFBRSxjQUFjO3lCQUN0QjtxQkFDRjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsSUFBSSxFQUFFLGtCQUFrQjs0QkFDeEIsU0FBUyxFQUFFLGVBQWUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxhQUFhLFNBQVMsdUJBQXVCO3lCQUNuRzt3QkFDRDs0QkFDRSxJQUFJLEVBQUUsc0JBQXNCOzRCQUM1QixTQUFTLEVBQUUsZUFBZSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLGFBQWEsU0FBUywrQkFBK0I7eUJBQzNHO3dCQUNEOzRCQUNFLElBQUksRUFBRSxnQkFBZ0I7NEJBQ3RCLFNBQVMsRUFBRSxlQUFlLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sYUFBYSxTQUFTLHlCQUF5Qjt5QkFDckc7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUUzRSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUNyQyxXQUFXLEVBQUUsY0FBYztZQUMzQixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7WUFDeEIsY0FBYyxFQUFFLGlCQUFpQixDQUFDLEdBQUc7WUFDckMsWUFBWTtZQUNaLHdCQUF3QixFQUFFO2dCQUN4QjtvQkFDRSxnQkFBZ0IsRUFBRSxjQUFjO29CQUNoQyxNQUFNLEVBQUUsQ0FBQztpQkFDVjtnQkFDRDtvQkFDRSxnQkFBZ0IsRUFBRSxTQUFTO29CQUMzQixNQUFNLEVBQUUsQ0FBQztpQkFDVjthQUNGO1lBQ0QsdUJBQXVCLEVBQUU7Z0JBQ3ZCLGNBQWMsRUFBRSxHQUFHO2dCQUNuQixxQkFBcUIsRUFBRSxFQUFFO2FBQzFCO1lBQ0Qsb0JBQW9CLEVBQUU7Z0JBQ3BCLG1CQUFtQixFQUFFO29CQUNuQixjQUFjLEVBQUUsVUFBVTtvQkFDMUIsT0FBTyxFQUFFLGdCQUFnQjtvQkFDekIsY0FBYyxFQUFFLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDO2lCQUMzQzthQUNGO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2pCO29CQUNFLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxPQUFPO29CQUN2QyxhQUFhLEVBQUUsY0FBYztvQkFDN0IsYUFBYSxFQUFFLGFBQWE7aUJBQzdCO2FBQ0Y7WUFDRCxlQUFlLEVBQUUsUUFBUTtTQUMxQixDQUFDLENBQUM7UUFFSCxNQUFNLGVBQWUsR0FBRyxJQUFJLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQy9FLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRztZQUN0QixlQUFlLEVBQUUsWUFBWTtZQUM3QixpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxPQUFPO1lBQzFDLGNBQWMsRUFBRSxVQUFVO1lBQzFCLFlBQVksRUFBRSxVQUFVLENBQUMsR0FBRztZQUM1QixvQkFBb0IsRUFBRSxLQUFLO1NBQzVCLENBQUMsQ0FBQztRQUVILElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDbEQsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1lBQ3RCLFFBQVEsRUFBRSxtQkFBbUI7WUFDN0IsTUFBTSxFQUFFLGdCQUFnQixlQUFlLENBQUMsR0FBRyxFQUFFO1NBQzlDLENBQUMsQ0FBQztRQUVILElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUU7WUFDdkQsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1lBQ3RCLFFBQVEsRUFBRSw0QkFBNEI7WUFDdEMsTUFBTSxFQUFFLGdCQUFnQixlQUFlLENBQUMsR0FBRyxFQUFFO1NBQzlDLENBQUMsQ0FBQztRQUVILE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQzdELGFBQWEsRUFBRSxHQUFHLFNBQVMsZUFBZTtZQUMxQyxXQUFXLEVBQUUsT0FBTztZQUNwQixJQUFJLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNO1NBQy9CLENBQUMsQ0FBQztRQUNGLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBaUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFNUcsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQzNFLGFBQWEsRUFBRSxHQUFHLFNBQVMsdUJBQXVCO1lBQ2xELFdBQVcsRUFBRSxjQUFjO1lBQzNCLElBQUksRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU07U0FDL0IsQ0FBQyxDQUFDO1FBQ0YsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQWlDLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRW5ILE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRTtZQUNuRixhQUFhLEVBQUUsR0FBRyxTQUFTLCtCQUErQjtZQUMxRCxXQUFXLEVBQUUsa0JBQWtCO1lBQy9CLElBQUksRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU07U0FDL0IsQ0FBQyxDQUFDO1FBQ0YscUJBQXFCLENBQUMsSUFBSSxDQUFDLFlBQWlDLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRXZILE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ3ZELGFBQWEsRUFBRSxHQUFHLFNBQVMsV0FBVztZQUN0QyxXQUFXLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUNyQyxJQUFJLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNO1NBQy9CLENBQUMsQ0FBQztRQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBaUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFekcsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDakUsYUFBYSxFQUFFLEdBQUcsU0FBUyxlQUFlO1lBQzFDLFdBQVcsRUFBRSxjQUFjO1lBQzNCLElBQUksRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU07U0FDL0IsQ0FBQyxDQUFDO1FBQ0YsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFpQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUU5RyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDekUsYUFBYSxFQUFFLEdBQUcsU0FBUyx5QkFBeUI7WUFDcEQsV0FBVyxFQUFFLGtCQUFrQjtZQUMvQixJQUFJLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNO1NBQy9CLENBQUMsQ0FBQztRQUNGLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFpQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUVsSCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRTtZQUMzRCx3QkFBd0IsRUFBRTtnQkFDeEIsT0FBTyxFQUFFLFlBQVk7Z0JBQ3JCLFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxNQUFNLEVBQUUsT0FBTzt3QkFDZixTQUFTLEVBQUU7NEJBQ1QsT0FBTyxFQUFFLHlCQUF5Qjt5QkFDbkM7d0JBQ0QsTUFBTSxFQUFFLGdCQUFnQjtxQkFDekI7aUJBQ0Y7YUFDRjtZQUNELFFBQVEsRUFBRTtnQkFDUjtvQkFDRSxVQUFVLEVBQUUsV0FBVztvQkFDdkIsY0FBYyxFQUFFO3dCQUNkLE9BQU8sRUFBRSxZQUFZO3dCQUNyQixTQUFTLEVBQUU7NEJBQ1Q7Z0NBQ0UsTUFBTSxFQUFFLE9BQU87Z0NBQ2YsTUFBTSxFQUFFLENBQUMscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLENBQUM7Z0NBQzVFLFFBQVEsRUFBRSxHQUFHOzZCQUNkO3lCQUNGO3FCQUNGO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxTQUFTO29CQUNyQixjQUFjLEVBQUU7d0JBQ2QsT0FBTyxFQUFFLFlBQVk7d0JBQ3JCLFNBQVMsRUFBRTs0QkFDVDtnQ0FDRSxNQUFNLEVBQUUsT0FBTztnQ0FDZixNQUFNLEVBQUU7b0NBQ04sMkJBQTJCO29DQUMzQixpQ0FBaUM7b0NBQ2pDLHlCQUF5QjtvQ0FDekIsbUJBQW1CO29DQUNuQiwwQkFBMEI7b0NBQzFCLHlCQUF5QjtvQ0FDekIsY0FBYztvQ0FDZCxxQkFBcUI7aUNBQ3RCO2dDQUNELFFBQVEsRUFBRSxHQUFHOzZCQUNkO3lCQUNGO3FCQUNGO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxXQUFXO29CQUN2QixjQUFjLEVBQUU7d0JBQ2QsT0FBTyxFQUFFLFlBQVk7d0JBQ3JCLFNBQVMsRUFBRTs0QkFDVDtnQ0FDRSxNQUFNLEVBQUUsT0FBTztnQ0FDZixNQUFNLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsQ0FBQztnQ0FDN0UsUUFBUSxFQUFFLEdBQUc7NkJBQ2Q7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLGlCQUFpQjtvQkFDN0IsY0FBYyxFQUFFO3dCQUNkLE9BQU8sRUFBRSxZQUFZO3dCQUNyQixTQUFTLEVBQUU7NEJBQ1Q7Z0NBQ0UsTUFBTSxFQUFFLE9BQU87Z0NBQ2YsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLENBQUM7Z0NBQzVFLFFBQVEsRUFBRSxHQUFHOzZCQUNkO3lCQUNGO3FCQUNGO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxzQkFBc0I7b0JBQ2xDLGNBQWMsRUFBRTt3QkFDZCxPQUFPLEVBQUUsWUFBWTt3QkFDckIsU0FBUyxFQUFFOzRCQUNUO2dDQUNFLE1BQU0sRUFBRSxPQUFPO2dDQUNmLE1BQU0sRUFBRTtvQ0FDUiwrQkFBK0I7b0NBQy9CLG9DQUFvQztvQ0FDcEMsK0JBQStCO2lDQUM5QjtnQ0FDRCxRQUFRLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjs2QkFDbEM7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILGFBQWEsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFdkUsNkVBQTZFO1FBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvRixNQUFNLGdCQUFnQixHQUFHLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDdkUsV0FBVyxFQUFFLGNBQWM7WUFDM0IsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixXQUFXLEVBQUU7Z0JBQ1gsVUFBVSxFQUFFLFNBQVMsQ0FBQyxlQUFlLENBQUMsWUFBWTtnQkFDbEQsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSztnQkFDeEMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLG9CQUFvQixFQUFFO29CQUNwQixPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsaUJBQWlCLEVBQUU7b0JBQzNELFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFO29CQUN4QyxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO2lCQUN4QzthQUNGO1lBQ0QsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEdBQUcsQ0FBQztZQUNyRyxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLGFBQWEsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdkMsS0FBSyxFQUFFLElBQUk7WUFDWCxXQUFXLEVBQUUsMERBQTBEO1lBQ3ZFLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtZQUM3QixTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7Z0JBQ3hDLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE1BQU0sRUFBRTtvQkFDTixTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUU7NEJBQ3JCLDBCQUEwQjs0QkFDMUIsaUhBQWlIOzRCQUNqSCx3REFBd0Q7eUJBQ3pELEVBQUM7b0JBQ0YsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFOzRCQUNqQiwwQkFBMEI7NEJBQzFCLDBEQUEwRDt5QkFDM0QsRUFBRTtvQkFDSCxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUU7NEJBQ3RCLDZCQUE2Qjs0QkFDN0IsaUNBQWlDOzRCQUNqQywrRkFBK0Y7eUJBQ2hHLEVBQUM7aUJBQ0g7Z0JBQ0QsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtnQkFDeEIsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTthQUN2QixDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBQ0YsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQXFDLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRXRILElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUNuQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQzlDLEdBQUcsRUFBRSxhQUFhO1lBQ2xCLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRTtTQUNuQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDO1FBQzdELElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7WUFDaEQsR0FBRyxFQUFFLGVBQWU7WUFDcEIsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO1NBQ3JDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUU7WUFDL0MsR0FBRyxFQUFFLGNBQWM7WUFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZO1NBQ3pCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFDckQsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSw2QkFBNkIsRUFBRTtZQUNyRCxHQUFHLEVBQUUsb0JBQW9CO1lBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFO1NBQzFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXpwQkQsa0RBeXBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XHJcbmltcG9ydCAqIGFzIGFwaWdhdGV3YXl2MiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyJztcclxuaW1wb3J0ICogYXMgY29kZWJ1aWxkIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xyXG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XHJcbmltcG9ydCAqIGFzIGVjciBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcclxuaW1wb3J0ICogYXMgZWNzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3MnO1xyXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XHJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xyXG5pbXBvcnQgKiBhcyByb3V0ZTUzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzJztcclxuaW1wb3J0ICogYXMgc2VydmljZWRpc2NvdmVyeSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VydmljZWRpc2NvdmVyeSc7XHJcbmltcG9ydCAqIGFzIHNzbSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3NtJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR21haWxWaWV3ZXJDZGtTdGFja1Byb3BzIGV4dGVuZHMgY2RrLlN0YWNrUHJvcHMge1xyXG4gIHJlYWRvbmx5IHZwY0lkPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IHByaXZhdGVTdWJuZXRzPzogc3RyaW5nW107XHJcbiAgcmVhZG9ubHkgY29udGFpbmVyUG9ydD86IG51bWJlciB8IHN0cmluZztcclxuICByZWFkb25seSBjb250YWluZXJDcHU/OiBudW1iZXIgfCBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgY29udGFpbmVyTWVtb3J5PzogbnVtYmVyIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGRlc2lyZWRDb3VudD86IG51bWJlciB8IHN0cmluZztcclxuICByZWFkb25seSBjZXJ0aWZpY2F0ZUFybj86IHN0cmluZztcclxuICByZWFkb25seSBhcGlDdXN0b21Eb21haW5OYW1lPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVJZD86IHN0cmluZztcclxuICByZWFkb25seSBzZXJ2aWNlRGlzY292ZXJ5TmFtZXNwYWNlTmFtZT86IHN0cmluZztcclxuICByZWFkb25seSBzZXJ2aWNlRGlzY292ZXJ5VHRsPzogbnVtYmVyIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IHNzbVByZWZpeD86IHN0cmluZztcclxuICByZWFkb25seSBnaXRIdWJPd25lcj86IHN0cmluZztcclxuICByZWFkb25seSBnaXRIdWJSZXBvPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGdpdEh1YkJyYW5jaD86IHN0cmluZztcclxuICByZWFkb25seSBwdWJsaWNFbnZWYWx1ZT86IHN0cmluZztcclxuICByZWFkb25seSBnb29nbGVDbGllbnRJZD86IHN0cmluZztcclxuICByZWFkb25seSBnb29nbGVDbGllbnRTZWNyZXQ/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgc2Vzc2lvblNlY3JldFZhbHVlPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IHVzZUdpdEh1YldlYmhvb2tzPzogYm9vbGVhbjtcclxuICByZWFkb25seSBjb2RlQ29ubmVjdGlvbkFybj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdtYWlsVmlld2VyQ2RrU3RhY2sgZXh0ZW5kcyBjZGsuU3RhY2sge1xyXG4gIHB1YmxpYyByZWFkb25seSBjbHVzdGVyTmFtZTogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSByZXBvc2l0b3J5VXJpOiBzdHJpbmc7XHJcbiAgcHVibGljIHJlYWRvbmx5IGFwaUludm9rZVVybDogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBjbG91ZE1hcFNlcnZpY2VBcm46IHN0cmluZztcclxuXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBjZGsuQXBwLCBpZDogc3RyaW5nLCBwcm9wczogR21haWxWaWV3ZXJDZGtTdGFja1Byb3BzKSB7XHJcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcclxuXHJcbiAgICBjb25zdCB0b051bWJlciA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWUgPz8gZmFsbGJhY2s7XHJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHR5cGVvZiBjYW5kaWRhdGUgPT09ICdudW1iZXInID8gY2FuZGlkYXRlIDogTnVtYmVyKGNhbmRpZGF0ZSk7XHJcbiAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IGZhbGxiYWNrO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB0b0NwdVVuaXRzID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgPT4ge1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSB0b051bWJlcih2YWx1ZSwgMC41KTtcclxuICAgICAgY29uc3QgdmNwdSA9IHBhcnNlZCA8PSA0ID8gcGFyc2VkICogMTAyNCA6IHBhcnNlZDtcclxuICAgICAgY29uc3Qgcm91bmRlZCA9IE1hdGgucm91bmQodmNwdSAvIDI1NikgKiAyNTY7XHJcbiAgICAgIHJldHVybiBNYXRoLm1heCgyNTYsIHJvdW5kZWQpO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCByZXBvUGFydHMgPSAocHJvY2Vzcy5lbnYuR0lUSFVCX1JFUE9TSVRPUlkgPz8gJycpLnNwbGl0KCcvJyk7XHJcbiAgICBjb25zdCBndWVzc2VkR2l0SHViT3duZXIgPSByZXBvUGFydHNbMF0gfHwgJ2R5YW5ldCc7XHJcbiAgICBjb25zdCBndWVzc2VkR2l0SHViUmVwbyA9IHJlcG9QYXJ0c1sxXSB8fCAnaW1hcCc7XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyUG9ydCA9IHRvTnVtYmVyKHByb3BzLmNvbnRhaW5lclBvcnQsIDMwMDApO1xyXG4gICAgY29uc3QgY29udGFpbmVyQ3B1ID0gdG9DcHVVbml0cyhwcm9wcy5jb250YWluZXJDcHUpO1xyXG4gICAgY29uc3QgY29udGFpbmVyTWVtb3J5ID0gdG9OdW1iZXIocHJvcHMuY29udGFpbmVyTWVtb3J5LCAxMDI0KTtcclxuICAgIGNvbnN0IGRlc2lyZWRDb3VudCA9IHRvTnVtYmVyKHByb3BzLmRlc2lyZWRDb3VudCwgMSk7XHJcbiAgICBjb25zdCBzZXJ2aWNlRGlzY292ZXJ5TmFtZXNwYWNlTmFtZSA9IHByb3BzLnNlcnZpY2VEaXNjb3ZlcnlOYW1lc3BhY2VOYW1lID8/ICdtYWlsLmxvY2FsJztcclxuICAgIGNvbnN0IHNlcnZpY2VEaXNjb3ZlcnlUdGwgPSB0b051bWJlcihwcm9wcy5zZXJ2aWNlRGlzY292ZXJ5VHRsLCA2MCk7XHJcbiAgICBjb25zdCBzc21QcmVmaXhSYXcgPSBwcm9wcy5zc21QcmVmaXggPz8gJy9tYWlsLWV4YW1wbGUnO1xyXG4gICAgY29uc3Qgc3NtUHJlZml4ID0gJy8nICsgc3NtUHJlZml4UmF3LnNwbGl0KCcvJykuZmlsdGVyKHAgPT4gcCkuam9pbignLycpO1xyXG4gICAgY29uc3QgZ2l0SHViT3duZXIgPSBwcm9wcy5naXRIdWJPd25lciA/PyBndWVzc2VkR2l0SHViT3duZXI7XHJcbiAgICBjb25zdCBnaXRIdWJSZXBvID0gcHJvcHMuZ2l0SHViUmVwbyA/PyBndWVzc2VkR2l0SHViUmVwbztcclxuICAgIGNvbnN0IGdpdEh1YkJyYW5jaCA9IHByb3BzLmdpdEh1YkJyYW5jaCA/PyBwcm9jZXNzLmVudi5HSVRIVUJfUkVGX05BTUUgPz8gJ21haW4nO1xyXG4gICAgY29uc3QgcHVibGljRW52VmFsdWUgPSBwcm9wcy5wdWJsaWNFbnZWYWx1ZSA/PyAncHJvZHVjdGlvbic7XHJcbiAgICBjb25zdCBnb29nbGVDbGllbnRJZCA9IHByb3BzLmdvb2dsZUNsaWVudElkIHx8ICdub3Qtc2V0JztcclxuICAgIGNvbnN0IGdvb2dsZUNsaWVudFNlY3JldCA9IHByb3BzLmdvb2dsZUNsaWVudFNlY3JldCA/PyAnbm90LXNldCc7XHJcbiAgICBjb25zdCBzZXNzaW9uU2VjcmV0VmFsdWUgPSBwcm9wcy5zZXNzaW9uU2VjcmV0VmFsdWUgPz8gJ25vdC1zZXQnO1xyXG4gICAgY29uc3QgYXBpQ3VzdG9tRG9tYWluTmFtZSA9IHByb3BzLmFwaUN1c3RvbURvbWFpbk5hbWUgPz8gcHJvY2Vzcy5lbnYuQVBJX0NVU1RPTV9ET01BSU4gPz8gJ21haWwuZHlhbmV0LmNvbSc7XHJcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZUFybiA9IHByb3BzLmNlcnRpZmljYXRlQXJuID8/IHRoaXMubm9kZS50cnlHZXRDb250ZXh0KCdjZXJ0aWZpY2F0ZUFybicpID8/IHByb2Nlc3MuZW52LkNFUlRJRklDQVRFX0FSTjtcclxuICAgIGNvbnN0IGhvc3RlZFpvbmVJZCA9IHByb3BzLmhvc3RlZFpvbmVJZCA/PyAnJztcclxuICAgIGNvbnN0IGhhc0N1c3RvbURvbWFpbiA9IEJvb2xlYW4oY2VydGlmaWNhdGVBcm4gJiYgYXBpQ3VzdG9tRG9tYWluTmFtZSk7XHJcbiAgICBjb25zdCBoYXNIb3N0ZWRab25lID0gQm9vbGVhbihob3N0ZWRab25lSWQpO1xyXG5cclxuICAgIGxldCB2cGM6IGVjMi5JVnBjO1xyXG4gICAgbGV0IHByaXZhdGVTdWJuZXRJZHM6IHN0cmluZ1tdO1xyXG4gICAgbGV0IHNlcnZpY2VTdWJuZXRJZHM6IHN0cmluZ1tdO1xyXG5cclxuICAgIC8vIElmIGFjY291bnQvcmVnaW9uIGFyZSBhdmFpbGFibGUsIHVzZSBWcGMuZnJvbUxvb2t1cCB0byBhdXRvbWF0aWNhbGx5IGRpc2NvdmVyIHN1Ym5ldHMuXHJcbiAgICAvLyBPdGhlcndpc2UgZmFsbCBiYWNrIHRvIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnMgd2hpY2ggbGV0IHRoZSBkZXBsb3llciBwaWNrIHZhbHVlcyBpbiB0aGUgY29uc29sZS5cclxuICAgIGNvbnN0IHVzZVZwY1BhcmFtZXRlciA9IHRoaXMubm9kZS50cnlHZXRDb250ZXh0KCd1c2VWcGNQYXJhbWV0ZXInKTtcclxuXHJcbiAgICBpZiAoIXVzZVZwY1BhcmFtZXRlciAmJiB0aGlzLmFjY291bnQgJiYgdGhpcy5yZWdpb24pIHtcclxuICAgICAgdnBjID0gZWMyLlZwYy5mcm9tTG9va3VwKHRoaXMsICdNYWlsVnBjJywgeyB0YWdzOiB7IE5hbWU6ICdkeWEtdnBjJyB9IH0pO1xyXG4gICAgICBcclxuICAgICAgaWYgKHByb3BzLnByaXZhdGVTdWJuZXRzICYmIHByb3BzLnByaXZhdGVTdWJuZXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHByaXZhdGVTdWJuZXRJZHMgPSBwcm9wcy5wcml2YXRlU3VibmV0cztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIFRoZSBzZXJ2aWNlIGxpbmtlZCB0byB0aGUgVlBDIExpbmsgbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gYWxsIEF2YWlsYWJpbGl0eSBab25lcy5cclxuICAgICAgICAgIGNvbnN0IGJhZEF6ID0gJ2NhYzEtYXo0JztcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgbGV0IHN1Ym5ldHMgPSB2cGMucHJpdmF0ZVN1Ym5ldHMuZmlsdGVyKHMgPT4gcy5hdmFpbGFiaWxpdHlab25lICE9PSBiYWRBeik7XHJcbiAgICAgICAgICBpZiAoc3VibmV0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgLy8gTm8gcHJpdmF0ZSBzdWJuZXRzLCB0cnkgcHVibGljIHN1Ym5ldHNcclxuICAgICAgICAgICAgc3VibmV0cyA9IHZwYy5wdWJsaWNTdWJuZXRzLmZpbHRlcihzID0+IHMuYXZhaWxhYmlsaXR5Wm9uZSAhPT0gYmFkQXopO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHByaXZhdGVTdWJuZXRJZHMgPSBzdWJuZXRzLnNsaWNlKDAsIDIpLm1hcChzID0+IHMuc3VibmV0SWQpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBpZiAocHJpdmF0ZVN1Ym5ldElkcy5sZW5ndGggPCAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVlBDICcke3ZwYy52cGNJZH0nIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcHJpdmF0ZSBvciBwdWJsaWMgc3VibmV0IGluIGFuIGFsbG93ZWQgYXZhaWxhYmlsaXR5IHpvbmUgKG5vdCBpbiAke2JhZEF6fSkuYCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgc2VydmljZVN1Ym5ldElkcyA9IHByaXZhdGVTdWJuZXRJZHM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBDbG91ZEZvcm1hdGlvbiBwYXJhbWV0ZXIgZm9yIFZQQyBzZWxlY3Rpb24gKGRyb3Bkb3duIG9mIFZQQyBJRHMgaW4gdGhlIGNvbnNvbGUpXHJcbiAgICAgIGNvbnN0IHZwY0lkUGFyYW0gPSBuZXcgY2RrLkNmblBhcmFtZXRlcih0aGlzLCAnVnBjSWRQYXJhbScsIHtcclxuICAgICAgICB0eXBlOiAnQVdTOjpFQzI6OlZQQzo6SWQnLFxyXG4gICAgICAgIGRlZmF1bHQ6IHByb3BzLnZwY0lkID8/ICcnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIE9wdGlvbmFsIHBhcmFtZXRlciBmb3IgcHJpdmF0ZSBzdWJuZXQgSURzIChDb21tYURlbGltaXRlZExpc3QpIHdoZW4gc3ludGhlc2l6aW5nIHdpdGhvdXQgYWNjb3VudC9yZWdpb25cclxuICAgICAgY29uc3QgcHJpdmF0ZVN1Ym5ldElkc1BhcmFtID0gbmV3IGNkay5DZm5QYXJhbWV0ZXIodGhpcywgJ1ByaXZhdGVTdWJuZXRJZHNQYXJhbScsIHtcclxuICAgICAgICB0eXBlOiAnQ29tbWFEZWxpbWl0ZWRMaXN0JyxcclxuICAgICAgICBkZWZhdWx0OiBwcm9wcy5wcml2YXRlU3VibmV0cyAmJiBwcm9wcy5wcml2YXRlU3VibmV0cy5sZW5ndGggPiAwID8gcHJvcHMucHJpdmF0ZVN1Ym5ldHMuam9pbignLCcpIDogJycsXHJcbiAgICAgIH0pO1xyXG4gICAgICAvLyBVc2UgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciB2YWx1ZXMgKGRlcGxveWVyIG11c3Qgc3VwcGx5IHByaXZhdGUgc3VibmV0IGlkcyB3aGVuIHN5bnRoZXNpemluZyB3aXRob3V0IGxvb2t1cClcclxuICAgICAgdnBjID0gZWMyLlZwYy5mcm9tVnBjQXR0cmlidXRlcyh0aGlzLCAnTWFpbFZwYycsIHtcclxuICAgICAgICB2cGNJZDogdnBjSWRQYXJhbS52YWx1ZUFzU3RyaW5nLFxyXG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmVzOiBjZGsuRm4uZ2V0QXpzKCksXHJcbiAgICAgICAgcHJpdmF0ZVN1Ym5ldElkczogcHJpdmF0ZVN1Ym5ldElkc1BhcmFtLnZhbHVlQXNMaXN0LFxyXG4gICAgICB9KTtcclxuICAgICAgcHJpdmF0ZVN1Ym5ldElkcyA9IHByb3BzLnByaXZhdGVTdWJuZXRzID8/IHByaXZhdGVTdWJuZXRJZHNQYXJhbS52YWx1ZUFzTGlzdDtcclxuICAgICAgc2VydmljZVN1Ym5ldElkcyA9IHByaXZhdGVTdWJuZXRJZHM7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYXBpVnBjTGlua1NlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLkNmblNlY3VyaXR5R3JvdXAodGhpcywgJ0FwaVZwY0xpbmtTZWN1cml0eUdyb3VwJywge1xyXG4gICAgICBncm91cERlc2NyaXB0aW9uOiAnRWdyZXNzIGZyb20gQVBJIEdhdGV3YXkgVlBDIExpbmsgdG8gc2VydmljZScsXHJcbiAgICAgIHZwY0lkOiB2cGMudnBjSWQsXHJcbiAgICAgIHNlY3VyaXR5R3JvdXBFZ3Jlc3M6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpcFByb3RvY29sOiAndGNwJyxcclxuICAgICAgICAgIGZyb21Qb3J0OiBjb250YWluZXJQb3J0LFxyXG4gICAgICAgICAgdG9Qb3J0OiBjb250YWluZXJQb3J0LFxyXG4gICAgICAgICAgY2lkcklwOiAnMC4wLjAuMC8wJyxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcbiAgICBhcGlWcGNMaW5rU2VjdXJpdHlHcm91cC5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICBjb25zdCBzZXJ2aWNlU2VjdXJpdHlHcm91cCA9IG5ldyBlYzIuQ2ZuU2VjdXJpdHlHcm91cCh0aGlzLCAnU2VydmljZVNlY3VyaXR5R3JvdXAnLCB7XHJcbiAgICAgIGdyb3VwRGVzY3JpcHRpb246ICdBbGxvdyBBUEkgR2F0ZXdheSBWUEMgTGluayB0byByZWFjaCBGYXJnYXRlIHRhc2tzJyxcclxuICAgICAgdnBjSWQ6IHZwYy52cGNJZCxcclxuICAgICAgc2VjdXJpdHlHcm91cEluZ3Jlc3M6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpcFByb3RvY29sOiAndGNwJyxcclxuICAgICAgICAgIGZyb21Qb3J0OiBjb250YWluZXJQb3J0LFxyXG4gICAgICAgICAgdG9Qb3J0OiBjb250YWluZXJQb3J0LFxyXG4gICAgICAgICAgY2lkcklwOiAnMC4wLjAuMC8wJyxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgICBzZWN1cml0eUdyb3VwRWdyZXNzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaXBQcm90b2NvbDogJy0xJyxcclxuICAgICAgICAgIGZyb21Qb3J0OiAwLFxyXG4gICAgICAgICAgdG9Qb3J0OiA2NTUzNSxcclxuICAgICAgICAgIGNpZHJJcDogJzAuMC4wLjAvMCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG4gICAgc2VydmljZVNlY3VyaXR5R3JvdXAuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcblxyXG4gICAgY29uc3QgYXBwTG9nR3JvdXAgPSBuZXcgbG9ncy5DZm5Mb2dHcm91cCh0aGlzLCAnQXBwTG9nR3JvdXAnLCB7XHJcbiAgICAgIGxvZ0dyb3VwTmFtZTogJy9lY3MvbWFpbC1leGFtcGxlJyxcclxuICAgICAgcmV0ZW50aW9uSW5EYXlzOiAzMCxcclxuICAgIH0pO1xyXG4gICAgYXBwTG9nR3JvdXAuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcblxyXG4gICAgY29uc3QgbWFpbENsdXN0ZXIgPSBuZXcgZWNzLkNmbkNsdXN0ZXIodGhpcywgJ01haWxDbHVzdGVyJywge1xyXG4gICAgICBjbHVzdGVyTmFtZTogJ21haWwtY2x1c3RlcicsXHJcbiAgICAgIGNhcGFjaXR5UHJvdmlkZXJzOiBbJ0ZBUkdBVEUnLCAnRkFSR0FURV9TUE9UJ10sXHJcbiAgICAgIGRlZmF1bHRDYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3k6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjYXBhY2l0eVByb3ZpZGVyOiAnRkFSR0FURV9TUE9UJyxcclxuICAgICAgICAgIHdlaWdodDogNCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNhcGFjaXR5UHJvdmlkZXI6ICdGQVJHQVRFJyxcclxuICAgICAgICAgIHdlaWdodDogMSxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcbiAgICBtYWlsQ2x1c3Rlci5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICBjb25zdCBtYWlsRXhhbXBsZVJlcG9zaXRvcnkgPSBuZXcgZWNyLkNmblJlcG9zaXRvcnkodGhpcywgJ01haWxFeGFtcGxlUmVwb3NpdG9yeScsIHtcclxuICAgICAgcmVwb3NpdG9yeU5hbWU6ICdtYWlsLWV4YW1wbGUnLFxyXG4gICAgICBpbWFnZVRhZ011dGFiaWxpdHk6ICdNVVRBQkxFJyxcclxuICAgICAgZW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IHtcclxuICAgICAgICBlbmNyeXB0aW9uVHlwZTogJ0FFUzI1NicsXHJcbiAgICAgIH0sXHJcbiAgICAgIGxpZmVjeWNsZVBvbGljeToge1xyXG4gICAgICAgIGxpZmVjeWNsZVBvbGljeVRleHQ6XHJcbiAgICAgICAgICAne1xcbiAgXCJydWxlc1wiOiBbXFxuICAgIHtcXG4gICAgICBcInJ1bGVQcmlvcml0eVwiOiAxLFxcbiAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJFeHBpcmUgaW1hZ2VzIG9sZGVyIHRoYW4gMzAgZGF5c1wiLFxcbiAgICAgIFwic2VsZWN0aW9uXCI6IHtcXG4gICAgICAgIFwidGFnU3RhdHVzXCI6IFwiYW55XCIsXFxuICAgICAgICBcImNvdW50VHlwZVwiOiBcInNpbmNlSW1hZ2VQdXNoZWRcIixcXG4gICAgICAgIFwiY291bnRVbml0XCI6IFwiZGF5c1wiLFxcbiAgICAgICAgXCJjb3VudE51bWJlclwiOiAzMFxcbiAgICAgIH0sXFxuICAgICAgXCJhY3Rpb25cIjogeyBcInR5cGVcIjogXCJleHBpcmVcIiB9XFxuICAgIH1cXG4gIF1cXG59XFxuJyxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gICAgbWFpbEV4YW1wbGVSZXBvc2l0b3J5LmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IG1haWxIdHRwQXBpID0gbmV3IGFwaWdhdGV3YXl2Mi5DZm5BcGkodGhpcywgJ01haWxIdHRwQXBpJywge1xyXG4gICAgICBuYW1lOiAnbWFpbC1leGFtcGxlJyxcclxuICAgICAgcHJvdG9jb2xUeXBlOiAnSFRUUCcsXHJcbiAgICB9KTtcclxuICAgIG1haWxIdHRwQXBpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IG1haWxBcGlTdGFnZSA9IG5ldyBhcGlnYXRld2F5djIuQ2ZuU3RhZ2UodGhpcywgJ01haWxBcGlTdGFnZScsIHtcclxuICAgICAgc3RhZ2VOYW1lOiAncHJvZCcsXHJcbiAgICAgIGFwaUlkOiBtYWlsSHR0cEFwaS5yZWYsXHJcbiAgICAgIGF1dG9EZXBsb3k6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIG1haWxBcGlTdGFnZS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICBjb25zdCBhcGlEb21haW5OYW1lID0gaGFzQ3VzdG9tRG9tYWluXHJcbiAgICAgID8gbmV3IGFwaWdhdGV3YXl2Mi5DZm5Eb21haW5OYW1lKHRoaXMsICdBcGlEb21haW5OYW1lJywge1xyXG4gICAgICAgICAgZG9tYWluTmFtZTogYXBpQ3VzdG9tRG9tYWluTmFtZSxcclxuICAgICAgICAgIGRvbWFpbk5hbWVDb25maWd1cmF0aW9uczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY2VydGlmaWNhdGVBcm46IGNlcnRpZmljYXRlQXJuISxcclxuICAgICAgICAgICAgICBlbmRwb2ludFR5cGU6ICdSRUdJT05BTCcsXHJcbiAgICAgICAgICAgICAgc2VjdXJpdHlQb2xpY3k6ICdUTFNfMV8yJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSlcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICBpZiAoYXBpRG9tYWluTmFtZSkge1xyXG4gICAgICBhcGlEb21haW5OYW1lLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFwaU1hcHBpbmcgPVxyXG4gICAgICBoYXNDdXN0b21Eb21haW4gJiYgYXBpRG9tYWluTmFtZVxyXG4gICAgICAgID8gbmV3IGFwaWdhdGV3YXl2Mi5DZm5BcGlNYXBwaW5nKHRoaXMsICdBcGlNYXBwaW5nJywge1xyXG4gICAgICAgICAgICBhcGlJZDogbWFpbEh0dHBBcGkucmVmLFxyXG4gICAgICAgICAgICBkb21haW5OYW1lOiBhcGlEb21haW5OYW1lLnJlZixcclxuICAgICAgICAgICAgc3RhZ2U6IG1haWxBcGlTdGFnZS5yZWYsXHJcbiAgICAgICAgICAgIGFwaU1hcHBpbmdLZXk6ICdleGFtcGxlcycsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgaWYgKGFwaU1hcHBpbmcpIHtcclxuICAgICAgYXBpTWFwcGluZy5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhcGlEb21haW5SZWNvcmQgPVxyXG4gICAgICBoYXNDdXN0b21Eb21haW4gJiYgaGFzSG9zdGVkWm9uZSAmJiBhcGlEb21haW5OYW1lXHJcbiAgICAgICAgPyBuZXcgcm91dGU1My5DZm5SZWNvcmRTZXQodGhpcywgJ0FwaURvbWFpblJlY29yZCcsIHtcclxuICAgICAgICAgICAgaG9zdGVkWm9uZUlkLFxyXG4gICAgICAgICAgICBuYW1lOiBhcGlDdXN0b21Eb21haW5OYW1lLFxyXG4gICAgICAgICAgICB0eXBlOiAnQScsXHJcbiAgICAgICAgICAgIGFsaWFzVGFyZ2V0OiB7XHJcbiAgICAgICAgICAgICAgZG5zTmFtZTogYXBpRG9tYWluTmFtZS5hdHRyUmVnaW9uYWxEb21haW5OYW1lLFxyXG4gICAgICAgICAgICAgIGhvc3RlZFpvbmVJZDogYXBpRG9tYWluTmFtZS5hdHRyUmVnaW9uYWxIb3N0ZWRab25lSWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgaWYgKGFwaURvbWFpblJlY29yZCkge1xyXG4gICAgICBhcGlEb21haW5SZWNvcmQuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcbiAgICB9XHJcbiAgICBpZiAoYXBpTWFwcGluZyAmJiBhcGlEb21haW5OYW1lKSB7XHJcbiAgICAgIGFwaU1hcHBpbmcuYWRkRGVwZW5kZW5jeShhcGlEb21haW5OYW1lKTtcclxuICAgICAgYXBpTWFwcGluZy5hZGREZXBlbmRlbmN5KG1haWxBcGlTdGFnZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoYXBpRG9tYWluUmVjb3JkICYmIGFwaURvbWFpbk5hbWUpIHtcclxuICAgICAgYXBpRG9tYWluUmVjb3JkLmFkZERlcGVuZGVuY3koYXBpRG9tYWluTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmFzZVVybCA9IGhhc0N1c3RvbURvbWFpblxyXG4gICAgICA/IGBodHRwczovLyR7YXBpQ3VzdG9tRG9tYWluTmFtZX0vZXhhbXBsZXMvZ21haWwtdmlld2VyYFxyXG4gICAgICA6IGNkay5Gbi5qb2luKCcnLCBbbWFpbEh0dHBBcGkuYXR0ckFwaUVuZHBvaW50LCAnLycsIG1haWxBcGlTdGFnZS5yZWYsICcvZ21haWwtdmlld2VyJ10pO1xyXG5cclxuICAgIGNvbnN0IHNlcnZpY2VOYW1lc3BhY2UgPSBuZXcgc2VydmljZWRpc2NvdmVyeS5DZm5Qcml2YXRlRG5zTmFtZXNwYWNlKHRoaXMsICdTZXJ2aWNlTmFtZXNwYWNlJywge1xyXG4gICAgICBuYW1lOiBzZXJ2aWNlRGlzY292ZXJ5TmFtZXNwYWNlTmFtZSxcclxuICAgICAgdnBjOiB2cGMudnBjSWQsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiAnTmFtZXNwYWNlIGZvciBtYWlsIHNlcnZpY2VzJyxcclxuICAgIH0pO1xyXG4gICAgc2VydmljZU5hbWVzcGFjZS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICBjb25zdCBhcGlWcGNMaW5rID0gbmV3IGFwaWdhdGV3YXl2Mi5DZm5WcGNMaW5rKHRoaXMsICdBcGlWcGNMaW5rJywge1xyXG4gICAgICBuYW1lOiAnbWFpbC1leGFtcGxlLXZwY2xpbmsnLFxyXG4gICAgICBzdWJuZXRJZHM6IHNlcnZpY2VTdWJuZXRJZHMsXHJcbiAgICAgIHNlY3VyaXR5R3JvdXBJZHM6IFthcGlWcGNMaW5rU2VjdXJpdHlHcm91cC5yZWZdLFxyXG4gICAgfSk7XHJcbiAgICBhcGlWcGNMaW5rLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IGFwcENsb3VkTWFwU2VydmljZSA9IG5ldyBzZXJ2aWNlZGlzY292ZXJ5LkNmblNlcnZpY2UodGhpcywgJ0FwcENsb3VkTWFwU2VydmljZScsIHtcclxuICAgICAgbmFtZTogJ21haWwtZXhhbXBsZScsXHJcbiAgICAgIG5hbWVzcGFjZUlkOiBzZXJ2aWNlTmFtZXNwYWNlLnJlZixcclxuICAgICAgZG5zQ29uZmlnOiB7XHJcbiAgICAgICAgcm91dGluZ1BvbGljeTogJ1dFSUdIVEVEJyxcclxuICAgICAgICBkbnNSZWNvcmRzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHR0bDogc2VydmljZURpc2NvdmVyeVR0bCxcclxuICAgICAgICAgICAgdHlwZTogJ1NSVicsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWx0aENoZWNrQ3VzdG9tQ29uZmlnOiB7XHJcbiAgICAgICAgZmFpbHVyZVRocmVzaG9sZDogMSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gICAgYXBwQ2xvdWRNYXBTZXJ2aWNlLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IHRhc2tFeGVjdXRpb25Sb2xlID0gbmV3IGlhbS5DZm5Sb2xlKHRoaXMsICdUYXNrRXhlY3V0aW9uUm9sZScsIHtcclxuICAgICAgYXNzdW1lUm9sZVBvbGljeURvY3VtZW50OiB7XHJcbiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxyXG4gICAgICAgIFN0YXRlbWVudDogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXHJcbiAgICAgICAgICAgIFByaW5jaXBhbDoge1xyXG4gICAgICAgICAgICAgIFNlcnZpY2U6ICdlY3MtdGFza3MuYW1hem9uYXdzLmNvbScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEFjdGlvbjogJ3N0czpBc3N1bWVSb2xlJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSxcclxuICAgICAgbWFuYWdlZFBvbGljeUFybnM6IFsnYXJuOmF3czppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FtYXpvbkVDU1Rhc2tFeGVjdXRpb25Sb2xlUG9saWN5J10sXHJcbiAgICAgIHBvbGljaWVzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcG9saWN5TmFtZTogJ0FsbG93UGFyYW1ldGVyUmVhZEZvclNlY3JldHMnLFxyXG4gICAgICAgICAgcG9saWN5RG9jdW1lbnQ6IHtcclxuICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxyXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXHJcbiAgICAgICAgICAgICAgICBBY3Rpb246IFsnc3NtOkdldFBhcmFtZXRlcicsICdzc206R2V0UGFyYW1ldGVycycsICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsICdrbXM6RGVjcnlwdCddLFxyXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcclxuICAgICAgICAgICAgICAgICAgYGFybjphd3M6c3NtOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTpwYXJhbWV0ZXIke3NzbVByZWZpeH0qYCxcclxuICAgICAgICAgICAgICAgICAgYGFybjphd3M6a21zOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTprZXkvKmAsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuICAgIHRhc2tFeGVjdXRpb25Sb2xlLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IHRhc2tSb2xlID0gbmV3IGlhbS5DZm5Sb2xlKHRoaXMsICdUYXNrUm9sZScsIHtcclxuICAgICAgYXNzdW1lUm9sZVBvbGljeURvY3VtZW50OiB7XHJcbiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxyXG4gICAgICAgIFN0YXRlbWVudDogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXHJcbiAgICAgICAgICAgIFByaW5jaXBhbDoge1xyXG4gICAgICAgICAgICAgIFNlcnZpY2U6ICdlY3MtdGFza3MuYW1hem9uYXdzLmNvbScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEFjdGlvbjogJ3N0czpBc3N1bWVSb2xlJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSxcclxuICAgICAgcG9saWNpZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwb2xpY3lOYW1lOiAnQXBwUnVudGltZUNvbmZpZ1JlYWQnLFxyXG4gICAgICAgICAgcG9saWN5RG9jdW1lbnQ6IHtcclxuICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxyXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXHJcbiAgICAgICAgICAgICAgICBBY3Rpb246IFsnc3NtOkdldFBhcmFtZXRlcicsICdzc206R2V0UGFyYW1ldGVycycsICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsICdrbXM6RGVjcnlwdCddLFxyXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcclxuICAgICAgICAgICAgICAgICAgYGFybjphd3M6c3NtOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTpwYXJhbWV0ZXIke3NzbVByZWZpeH0qYCxcclxuICAgICAgICAgICAgICAgICAgYGFybjphd3M6a21zOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTprZXkvKmAsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuICAgIHRhc2tSb2xlLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IGFwcFRhc2tEZWZpbml0aW9uID0gbmV3IGVjcy5DZm5UYXNrRGVmaW5pdGlvbih0aGlzLCAnQXBwVGFza0RlZmluaXRpb24nLCB7XHJcbiAgICAgIGZhbWlseTogJ21haWwtZXhhbXBsZScsXHJcbiAgICAgIGNwdTogY29udGFpbmVyQ3B1LnRvU3RyaW5nKCksXHJcbiAgICAgIG1lbW9yeTogY29udGFpbmVyTWVtb3J5LnRvU3RyaW5nKCksXHJcbiAgICAgIG5ldHdvcmtNb2RlOiAnYXdzdnBjJyxcclxuICAgICAgcmVxdWlyZXNDb21wYXRpYmlsaXRpZXM6IFsnRkFSR0FURSddLFxyXG4gICAgICBleGVjdXRpb25Sb2xlQXJuOiB0YXNrRXhlY3V0aW9uUm9sZS5hdHRyQXJuLFxyXG4gICAgICB0YXNrUm9sZUFybjogdGFza1JvbGUuYXR0ckFybixcclxuICAgICAgY29udGFpbmVyRGVmaW5pdGlvbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnbWFpbC1leGFtcGxlJyxcclxuICAgICAgICAgIGltYWdlOiBgJHttYWlsRXhhbXBsZVJlcG9zaXRvcnkuYXR0clJlcG9zaXRvcnlVcml9OmxhdGVzdGAsXHJcbiAgICAgICAgICBwb3J0TWFwcGluZ3M6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbnRhaW5lclBvcnQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgbG9nQ29uZmlndXJhdGlvbjoge1xyXG4gICAgICAgICAgICBsb2dEcml2ZXI6ICdhd3Nsb2dzJyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICdhd3Nsb2dzLWdyb3VwJzogYXBwTG9nR3JvdXAucmVmLFxyXG4gICAgICAgICAgICAgICdhd3Nsb2dzLXJlZ2lvbic6IHRoaXMucmVnaW9uLFxyXG4gICAgICAgICAgICAgICdhd3Nsb2dzLXN0cmVhbS1wcmVmaXgnOiAnbWFpbC1leGFtcGxlJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlbnZpcm9ubWVudDogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ0NPTkZJR19TU01fUFJFRklYJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogc3NtUHJlZml4LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ1BPUlQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBjb250YWluZXJQb3J0LnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBuYW1lOiAnQkFTRV9VUkwnLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBiYXNlVXJsLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBuYW1lOiAnTk9ERV9FTlYnLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBwdWJsaWNFbnZWYWx1ZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICBzZWNyZXRzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBuYW1lOiAnR09PR0xFX0NMSUVOVF9JRCcsXHJcbiAgICAgICAgICAgICAgdmFsdWVGcm9tOiBgYXJuOmF3czpzc206JHt0aGlzLnJlZ2lvbn06JHt0aGlzLmFjY291bnR9OnBhcmFtZXRlciR7c3NtUHJlZml4fS9lbnYvR09PR0xFX0NMSUVOVF9JRGAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBuYW1lOiAnR09PR0xFX0NMSUVOVF9TRUNSRVQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRnJvbTogYGFybjphd3M6c3NtOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTpwYXJhbWV0ZXIke3NzbVByZWZpeH0vc2VjcmV0cy9HT09HTEVfQ0xJRU5UX1NFQ1JFVGAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBuYW1lOiAnU0VTU0lPTl9TRUNSRVQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRnJvbTogYGFybjphd3M6c3NtOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTpwYXJhbWV0ZXIke3NzbVByZWZpeH0vc2VjcmV0cy9TRVNTSU9OX1NFQ1JFVGAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuICAgIGFwcFRhc2tEZWZpbml0aW9uLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIG5ldyBlY3MuQ2ZuU2VydmljZSh0aGlzLCAnQXBwU2VydmljZScsIHtcclxuICAgICAgc2VydmljZU5hbWU6ICdtYWlsLWV4YW1wbGUnLFxyXG4gICAgICBjbHVzdGVyOiBtYWlsQ2x1c3Rlci5yZWYsXHJcbiAgICAgIHRhc2tEZWZpbml0aW9uOiBhcHBUYXNrRGVmaW5pdGlvbi5yZWYsXHJcbiAgICAgIGRlc2lyZWRDb3VudCxcclxuICAgICAgY2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5OiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2FwYWNpdHlQcm92aWRlcjogJ0ZBUkdBVEVfU1BPVCcsXHJcbiAgICAgICAgICB3ZWlnaHQ6IDQsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjYXBhY2l0eVByb3ZpZGVyOiAnRkFSR0FURScsXHJcbiAgICAgICAgICB3ZWlnaHQ6IDEsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgICAgZGVwbG95bWVudENvbmZpZ3VyYXRpb246IHtcclxuICAgICAgICBtYXhpbXVtUGVyY2VudDogMjAwLFxyXG4gICAgICAgIG1pbmltdW1IZWFsdGh5UGVyY2VudDogNTAsXHJcbiAgICAgIH0sXHJcbiAgICAgIG5ldHdvcmtDb25maWd1cmF0aW9uOiB7XHJcbiAgICAgICAgYXdzdnBjQ29uZmlndXJhdGlvbjoge1xyXG4gICAgICAgICAgYXNzaWduUHVibGljSXA6ICdESVNBQkxFRCcsXHJcbiAgICAgICAgICBzdWJuZXRzOiBzZXJ2aWNlU3VibmV0SWRzLFxyXG4gICAgICAgICAgc2VjdXJpdHlHcm91cHM6IFtzZXJ2aWNlU2VjdXJpdHlHcm91cC5yZWZdLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHNlcnZpY2VSZWdpc3RyaWVzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcmVnaXN0cnlBcm46IGFwcENsb3VkTWFwU2VydmljZS5hdHRyQXJuLFxyXG4gICAgICAgICAgY29udGFpbmVyTmFtZTogJ21haWwtZXhhbXBsZScsXHJcbiAgICAgICAgICBjb250YWluZXJQb3J0OiBjb250YWluZXJQb3J0LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIHBsYXRmb3JtVmVyc2lvbjogJ0xBVEVTVCcsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBtYWlsSW50ZWdyYXRpb24gPSBuZXcgYXBpZ2F0ZXdheXYyLkNmbkludGVncmF0aW9uKHRoaXMsICdNYWlsSW50ZWdyYXRpb24nLCB7XHJcbiAgICAgIGFwaUlkOiBtYWlsSHR0cEFwaS5yZWYsXHJcbiAgICAgIGludGVncmF0aW9uVHlwZTogJ0hUVFBfUFJPWFknLFxyXG4gICAgICBpbnRlZ3JhdGlvbk1ldGhvZDogJ0FOWScsXHJcbiAgICAgIGludGVncmF0aW9uVXJpOiBhcHBDbG91ZE1hcFNlcnZpY2UuYXR0ckFybixcclxuICAgICAgY29ubmVjdGlvblR5cGU6ICdWUENfTElOSycsXHJcbiAgICAgIGNvbm5lY3Rpb25JZDogYXBpVnBjTGluay5yZWYsXHJcbiAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiAnMS4wJyxcclxuICAgIH0pO1xyXG5cclxuICAgIG5ldyBhcGlnYXRld2F5djIuQ2ZuUm91dGUodGhpcywgJ0dtYWlsVmlld2VyUm91dGUnLCB7XHJcbiAgICAgIGFwaUlkOiBtYWlsSHR0cEFwaS5yZWYsXHJcbiAgICAgIHJvdXRlS2V5OiAnQU5ZIC9nbWFpbC12aWV3ZXInLFxyXG4gICAgICB0YXJnZXQ6IGBpbnRlZ3JhdGlvbnMvJHttYWlsSW50ZWdyYXRpb24ucmVmfWAsXHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXcgYXBpZ2F0ZXdheXYyLkNmblJvdXRlKHRoaXMsICdHbWFpbFZpZXdlclByb3h5Um91dGUnLCB7XHJcbiAgICAgIGFwaUlkOiBtYWlsSHR0cEFwaS5yZWYsXHJcbiAgICAgIHJvdXRlS2V5OiAnQU5ZIC9nbWFpbC12aWV3ZXIve3Byb3h5K30nLFxyXG4gICAgICB0YXJnZXQ6IGBpbnRlZ3JhdGlvbnMvJHttYWlsSW50ZWdyYXRpb24ucmVmfWAsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzc21CYXNlVXJsID0gbmV3IHNzbS5TdHJpbmdQYXJhbWV0ZXIodGhpcywgJ1NzbUJhc2VVcmwnLCB7XHJcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vZW52L0JBU0VfVVJMYCxcclxuICAgICAgc3RyaW5nVmFsdWU6IGJhc2VVcmwsXHJcbiAgICAgIHR5cGU6IHNzbS5QYXJhbWV0ZXJUeXBlLlNUUklORyxcclxuICAgIH0pO1xyXG4gICAgKHNzbUJhc2VVcmwubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc3NtLkNmblBhcmFtZXRlcikuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcblxyXG4gICAgY29uc3Qgc3NtR29vZ2xlQ2xpZW50SWQgPSBuZXcgc3NtLlN0cmluZ1BhcmFtZXRlcih0aGlzLCAnU3NtR29vZ2xlQ2xpZW50SWQnLCB7XHJcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vZW52L0dPT0dMRV9DTElFTlRfSURgLFxyXG4gICAgICBzdHJpbmdWYWx1ZTogZ29vZ2xlQ2xpZW50SWQsXHJcbiAgICAgIHR5cGU6IHNzbS5QYXJhbWV0ZXJUeXBlLlNUUklORyxcclxuICAgIH0pO1xyXG4gICAgKHNzbUdvb2dsZUNsaWVudElkLm5vZGUuZGVmYXVsdENoaWxkIGFzIHNzbS5DZm5QYXJhbWV0ZXIpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IHNzbUdvb2dsZUNsaWVudFNlY3JldCA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdTc21Hb29nbGVDbGllbnRTZWNyZXQnLCB7XHJcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vc2VjcmV0cy9HT09HTEVfQ0xJRU5UX1NFQ1JFVGAsXHJcbiAgICAgIHN0cmluZ1ZhbHVlOiBnb29nbGVDbGllbnRTZWNyZXQsXHJcbiAgICAgIHR5cGU6IHNzbS5QYXJhbWV0ZXJUeXBlLlNUUklORyxcclxuICAgIH0pO1xyXG4gICAgKHNzbUdvb2dsZUNsaWVudFNlY3JldC5ub2RlLmRlZmF1bHRDaGlsZCBhcyBzc20uQ2ZuUGFyYW1ldGVyKS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICBjb25zdCBzc21Qb3J0ID0gbmV3IHNzbS5TdHJpbmdQYXJhbWV0ZXIodGhpcywgJ1NzbVBvcnQnLCB7XHJcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vZW52L1BPUlRgLFxyXG4gICAgICBzdHJpbmdWYWx1ZTogY29udGFpbmVyUG9ydC50b1N0cmluZygpLFxyXG4gICAgICB0eXBlOiBzc20uUGFyYW1ldGVyVHlwZS5TVFJJTkcsXHJcbiAgICB9KTtcclxuICAgIChzc21Qb3J0Lm5vZGUuZGVmYXVsdENoaWxkIGFzIHNzbS5DZm5QYXJhbWV0ZXIpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IHNzbVB1YmxpY0VudiA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdTc21QdWJsaWNFbnYnLCB7XHJcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vZW52L05PREVfRU5WYCxcclxuICAgICAgc3RyaW5nVmFsdWU6IHB1YmxpY0VudlZhbHVlLFxyXG4gICAgICB0eXBlOiBzc20uUGFyYW1ldGVyVHlwZS5TVFJJTkcsXHJcbiAgICB9KTtcclxuICAgIChzc21QdWJsaWNFbnYubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc3NtLkNmblBhcmFtZXRlcikuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcblxyXG4gICAgY29uc3Qgc3NtU2Vzc2lvblNlY3JldCA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdTc21TZXNzaW9uU2VjcmV0Jywge1xyXG4gICAgICBwYXJhbWV0ZXJOYW1lOiBgJHtzc21QcmVmaXh9L3NlY3JldHMvU0VTU0lPTl9TRUNSRVRgLFxyXG4gICAgICBzdHJpbmdWYWx1ZTogc2Vzc2lvblNlY3JldFZhbHVlLFxyXG4gICAgICB0eXBlOiBzc20uUGFyYW1ldGVyVHlwZS5TVFJJTkcsXHJcbiAgICB9KTtcclxuICAgIChzc21TZXNzaW9uU2VjcmV0Lm5vZGUuZGVmYXVsdENoaWxkIGFzIHNzbS5DZm5QYXJhbWV0ZXIpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IGNvZGVCdWlsZFJvbGUgPSBuZXcgaWFtLkNmblJvbGUodGhpcywgJ0NvZGVCdWlsZFJvbGUnLCB7XHJcbiAgICAgIGFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDoge1xyXG4gICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcclxuICAgICAgICBTdGF0ZW1lbnQ6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxyXG4gICAgICAgICAgICBQcmluY2lwYWw6IHtcclxuICAgICAgICAgICAgICBTZXJ2aWNlOiAnY29kZWJ1aWxkLmFtYXpvbmF3cy5jb20nLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBBY3Rpb246ICdzdHM6QXNzdW1lUm9sZScsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHBvbGljaWVzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcG9saWN5TmFtZTogJ0J1aWxkTG9ncycsXHJcbiAgICAgICAgICBwb2xpY3lEb2N1bWVudDoge1xyXG4gICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXHJcbiAgICAgICAgICAgIFN0YXRlbWVudDogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcclxuICAgICAgICAgICAgICAgIEFjdGlvbjogWydsb2dzOkNyZWF0ZUxvZ0dyb3VwJywgJ2xvZ3M6Q3JlYXRlTG9nU3RyZWFtJywgJ2xvZ3M6UHV0TG9nRXZlbnRzJ10sXHJcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcG9saWN5TmFtZTogJ0VDUlB1c2gnLFxyXG4gICAgICAgICAgcG9saWN5RG9jdW1lbnQ6IHtcclxuICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxyXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXHJcbiAgICAgICAgICAgICAgICBBY3Rpb246IFtcclxuICAgICAgICAgICAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxyXG4gICAgICAgICAgICAgICAgICAnZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eScsXHJcbiAgICAgICAgICAgICAgICAgICdlY3I6Q29tcGxldGVMYXllclVwbG9hZCcsXHJcbiAgICAgICAgICAgICAgICAgICdlY3I6QmF0Y2hHZXRJbWFnZScsXHJcbiAgICAgICAgICAgICAgICAgICdlY3I6RGVzY3JpYmVSZXBvc2l0b3JpZXMnLFxyXG4gICAgICAgICAgICAgICAgICAnZWNyOkluaXRpYXRlTGF5ZXJVcGxvYWQnLFxyXG4gICAgICAgICAgICAgICAgICAnZWNyOlB1dEltYWdlJyxcclxuICAgICAgICAgICAgICAgICAgJ2VjcjpVcGxvYWRMYXllclBhcnQnLFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKicsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwb2xpY3lOYW1lOiAnRUNTRGVwbG95JyxcclxuICAgICAgICAgIHBvbGljeURvY3VtZW50OiB7XHJcbiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcclxuICAgICAgICAgICAgU3RhdGVtZW50OiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxyXG4gICAgICAgICAgICAgICAgQWN0aW9uOiBbJ2VjczpVcGRhdGVTZXJ2aWNlJywgJ2VjczpEZXNjcmliZVNlcnZpY2VzJywgJ2VjczpEZXNjcmliZUNsdXN0ZXJzJ10sXHJcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcG9saWN5TmFtZTogJ1NTTVJlYWRGb3JCdWlsZCcsXHJcbiAgICAgICAgICBwb2xpY3lEb2N1bWVudDoge1xyXG4gICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXHJcbiAgICAgICAgICAgIFN0YXRlbWVudDogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcclxuICAgICAgICAgICAgICAgIEFjdGlvbjogWydzc206R2V0UGFyYW1ldGVyJywgJ3NzbTpHZXRQYXJhbWV0ZXJzJywgJ3NzbTpHZXRQYXJhbWV0ZXJzQnlQYXRoJ10sXHJcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcG9saWN5TmFtZTogJ0NvZGVDb25uZWN0aW9uQWNjZXNzJyxcclxuICAgICAgICAgIHBvbGljeURvY3VtZW50OiB7XHJcbiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcclxuICAgICAgICAgICAgU3RhdGVtZW50OiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxyXG4gICAgICAgICAgICAgICAgQWN0aW9uOiBbXHJcbiAgICAgICAgICAgICAgICBcImNvZGVjb25uZWN0aW9uczpHZXRDb25uZWN0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICBcImNvZGVjb25uZWN0aW9uczpHZXRDb25uZWN0aW9uVG9rZW5cIixcclxuICAgICAgICAgICAgICAgIFwiY29kZWNvbm5lY3Rpb25zOlVzZUNvbm5lY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgIFJlc291cmNlOiBwcm9wcy5jb2RlQ29ubmVjdGlvbkFybixcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9XHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuICAgIGNvZGVCdWlsZFJvbGUuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcblxyXG4gICAgLy8gVXNlIHRoZSBoaWdoZXItbGV2ZWwgUHJvamVjdCBjb25zdHJ1Y3Qgc28gd2UgY2FuIHByb3ZpZGUgYSB0eXBlZCBCdWlsZFNwZWNcclxuICAgIGNvbnN0IGNvZGVidWlsZFJvbGVSZWYgPSBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnQ29kZUJ1aWxkUm9sZVJlZicsIGNvZGVCdWlsZFJvbGUuYXR0ckFybik7XHJcblxyXG4gICAgY29uc3QgY29kZUJ1aWxkUHJvamVjdCA9IG5ldyBjb2RlYnVpbGQuUHJvamVjdCh0aGlzLCAnQ29kZUJ1aWxkUHJvamVjdCcsIHtcclxuICAgICAgcHJvamVjdE5hbWU6ICdtYWlsLWV4YW1wbGUnLFxyXG4gICAgICByb2xlOiBjb2RlYnVpbGRSb2xlUmVmLFxyXG4gICAgICBlbnZpcm9ubWVudDoge1xyXG4gICAgICAgIGJ1aWxkSW1hZ2U6IGNvZGVidWlsZC5MaW51eEJ1aWxkSW1hZ2UuU1RBTkRBUkRfN18wLFxyXG4gICAgICAgIGNvbXB1dGVUeXBlOiBjb2RlYnVpbGQuQ29tcHV0ZVR5cGUuU01BTEwsXHJcbiAgICAgICAgcHJpdmlsZWdlZDogdHJ1ZSxcclxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczoge1xyXG4gICAgICAgICAgRUNSX1VSSTogeyB2YWx1ZTogbWFpbEV4YW1wbGVSZXBvc2l0b3J5LmF0dHJSZXBvc2l0b3J5VXJpIH0sXHJcbiAgICAgICAgICBDTFVTVEVSX05BTUU6IHsgdmFsdWU6IG1haWxDbHVzdGVyLnJlZiB9LFxyXG4gICAgICAgICAgU0VSVklDRV9OQU1FOiB7IHZhbHVlOiAnbWFpbC1leGFtcGxlJyB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHNvdXJjZTogY29kZWJ1aWxkLlNvdXJjZS5naXRIdWIoeyBvd25lcjogZ2l0SHViT3duZXIsIHJlcG86IGdpdEh1YlJlcG8sIGJyYW5jaE9yUmVmOiBnaXRIdWJCcmFuY2gsIH0pLFxyXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXHJcbiAgICAgIHF1ZXVlZFRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDMwKSxcclxuICAgICAgYmFkZ2U6IHRydWUsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgJiBkZXBsb3kgbWFpbC1leGFtcGxlIHRvIEVDUiB0aGVuIGZvcmNlIEVDUyBkZXBsb3knLFxyXG4gICAgICBjYWNoZTogY29kZWJ1aWxkLkNhY2hlLm5vbmUoKSxcclxuICAgICAgYnVpbGRTcGVjOiBjb2RlYnVpbGQuQnVpbGRTcGVjLmZyb21PYmplY3Qoe1xyXG4gICAgICAgIHZlcnNpb246ICcwLjInLFxyXG4gICAgICAgIHBoYXNlczoge1xyXG4gICAgICAgICAgcHJlX2J1aWxkOiB7IGNvbW1hbmRzOiBbXHJcbiAgICAgICAgICAgICdlY2hvIFwiTG9nZ2luZyBpbiB0byBFQ1JcIicsXHJcbiAgICAgICAgICAgICdhd3MgZWNyIGdldC1sb2dpbi1wYXNzd29yZCAtLXJlZ2lvbiAkQVdTX0RFRkFVTFRfUkVHSU9OIHwgZG9ja2VyIGxvZ2luIC0tdXNlcm5hbWUgQVdTIC0tcGFzc3dvcmQtc3RkaW4gJEVDUl9VUkknLFxyXG4gICAgICAgICAgICAnSU1BR0VfVEFHPSR7Q09ERUJVSUxEX1JFU09MVkVEX1NPVVJDRV9WRVJTSU9OOi1sYXRlc3R9JyxcclxuICAgICAgICAgIF19LFxyXG4gICAgICAgICAgYnVpbGQ6IHsgY29tbWFuZHM6IFtcclxuICAgICAgICAgICAgJ2NkIGV4YW1wbGVzL2dtYWlsLXZpZXdlcicsXHJcbiAgICAgICAgICAgICdkb2NrZXIgYnVpbGQgLXQgJEVDUl9VUkk6bGF0ZXN0IC10ICRFQ1JfVVJJOiRJTUFHRV9UQUcgLicsXHJcbiAgICAgICAgICBdIH0sXHJcbiAgICAgICAgICBwb3N0X2J1aWxkOiB7IGNvbW1hbmRzOiBbXHJcbiAgICAgICAgICAgICdkb2NrZXIgcHVzaCAkRUNSX1VSSTpsYXRlc3QnLFxyXG4gICAgICAgICAgICAnZG9ja2VyIHB1c2ggJEVDUl9VUkk6JElNQUdFX1RBRycsXHJcbiAgICAgICAgICAgICdhd3MgZWNzIHVwZGF0ZS1zZXJ2aWNlIC0tY2x1c3RlciAkQ0xVU1RFUl9OQU1FIC0tc2VydmljZSAkU0VSVklDRV9OQU1FIC0tZm9yY2UtbmV3LWRlcGxveW1lbnQnLFxyXG4gICAgICAgICAgXX0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhcnRpZmFjdHM6IHsgZmlsZXM6IFtdIH0sXHJcbiAgICAgICAgZW52OiB7IHNoZWxsOiAnYmFzaCcgfSxcclxuICAgICAgfSksXHJcbiAgICB9KTtcclxuICAgIChjb2RlQnVpbGRQcm9qZWN0Lm5vZGUuZGVmYXVsdENoaWxkIGFzIGNvZGVidWlsZC5DZm5Qcm9qZWN0KS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICB0aGlzLmNsdXN0ZXJOYW1lID0gbWFpbENsdXN0ZXIucmVmO1xyXG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ0Nmbk91dHB1dENsdXN0ZXJOYW1lJywge1xyXG4gICAgICBrZXk6ICdDbHVzdGVyTmFtZScsXHJcbiAgICAgIHZhbHVlOiB0aGlzLmNsdXN0ZXJOYW1lLnRvU3RyaW5nKCksXHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVwb3NpdG9yeVVyaSA9IG1haWxFeGFtcGxlUmVwb3NpdG9yeS5hdHRyUmVwb3NpdG9yeVVyaTtcclxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdDZm5PdXRwdXRSZXBvc2l0b3J5VXJpJywge1xyXG4gICAgICBrZXk6ICdSZXBvc2l0b3J5VXJpJyxcclxuICAgICAgdmFsdWU6IHRoaXMucmVwb3NpdG9yeVVyaS50b1N0cmluZygpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFwaUludm9rZVVybCA9IGJhc2VVcmwudG9TdHJpbmcoKTtcclxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdDZm5PdXRwdXRBcGlJbnZva2VVcmwnLCB7XHJcbiAgICAgIGtleTogJ0FwaUludm9rZVVybCcsXHJcbiAgICAgIHZhbHVlOiB0aGlzLmFwaUludm9rZVVybCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jbG91ZE1hcFNlcnZpY2VBcm4gPSBhcHBDbG91ZE1hcFNlcnZpY2UuYXR0ckFybjtcclxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdDZm5PdXRwdXRDbG91ZE1hcFNlcnZpY2VBcm4nLCB7XHJcbiAgICAgIGtleTogJ0Nsb3VkTWFwU2VydmljZUFybicsXHJcbiAgICAgIHZhbHVlOiB0aGlzLmNsb3VkTWFwU2VydmljZUFybi50b1N0cmluZygpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ== \ No newline at end of file diff --git a/examples/gmail-viewer-cdk/test/gmail-viewer-cdk.test.js b/examples/gmail-viewer-cdk/test/gmail-viewer-cdk.test.js index a0206f1..e9f9dbe 100644 --- a/examples/gmail-viewer-cdk/test/gmail-viewer-cdk.test.js +++ b/examples/gmail-viewer-cdk/test/gmail-viewer-cdk.test.js @@ -15,4 +15,4 @@ test('SQS Queue Created', () => { // VisibilityTimeout: 300 // }); }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ21haWwtdmlld2VyLWNkay50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwyQ0FBMkM7QUFDM0MscURBQXFEO0FBQ3JELG1FQUFtRTs7QUFFbkUsdUVBQXVFO0FBQ3ZFLG9EQUFvRDtBQUNwRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO0lBQy9CLCtCQUErQjtJQUMvQixjQUFjO0lBQ2QsOEVBQThFO0lBQzlFLGNBQWM7SUFDZCxnREFBZ0Q7SUFFaEQsd0RBQXdEO0lBQ3hELDZCQUE2QjtJQUM3QixRQUFRO0FBQ1IsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG4vLyBpbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xuLy8gaW1wb3J0ICogYXMgR21haWxWaWV3ZXJDZGsgZnJvbSAnLi4vbGliL2dtYWlsLXZpZXdlci1jZGstc3RhY2snO1xuXG4vLyBleGFtcGxlIHRlc3QuIFRvIHJ1biB0aGVzZSB0ZXN0cywgdW5jb21tZW50IHRoaXMgZmlsZSBhbG9uZyB3aXRoIHRoZVxuLy8gZXhhbXBsZSByZXNvdXJjZSBpbiBsaWIvZ21haWwtdmlld2VyLWNkay1zdGFjay50c1xudGVzdCgnU1FTIFF1ZXVlIENyZWF0ZWQnLCAoKSA9PiB7XG4vLyAgIGNvbnN0IGFwcCA9IG5ldyBjZGsuQXBwKCk7XG4vLyAgICAgLy8gV0hFTlxuLy8gICBjb25zdCBzdGFjayA9IG5ldyBHbWFpbFZpZXdlckNkay5HbWFpbFZpZXdlckNka1N0YWNrKGFwcCwgJ015VGVzdFN0YWNrJyk7XG4vLyAgICAgLy8gVEhFTlxuLy8gICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG5cbi8vICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlNRUzo6UXVldWUnLCB7XG4vLyAgICAgVmlzaWJpbGl0eVRpbWVvdXQ6IDMwMFxuLy8gICB9KTtcbn0pO1xuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ21haWwtdmlld2VyLWNkay50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwyQ0FBMkM7QUFDM0MscURBQXFEO0FBQ3JELG1FQUFtRTs7QUFFbkUsdUVBQXVFO0FBQ3ZFLG9EQUFvRDtBQUNwRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO0lBQy9CLCtCQUErQjtJQUMvQixjQUFjO0lBQ2QsOEVBQThFO0lBQzlFLGNBQWM7SUFDZCxnREFBZ0Q7SUFFaEQsd0RBQXdEO0lBQ3hELDZCQUE2QjtJQUM3QixRQUFRO0FBQ1IsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XHJcbi8vIGltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XHJcbi8vIGltcG9ydCAqIGFzIEdtYWlsVmlld2VyQ2RrIGZyb20gJy4uL2xpYi9nbWFpbC12aWV3ZXItY2RrLXN0YWNrJztcclxuXHJcbi8vIGV4YW1wbGUgdGVzdC4gVG8gcnVuIHRoZXNlIHRlc3RzLCB1bmNvbW1lbnQgdGhpcyBmaWxlIGFsb25nIHdpdGggdGhlXHJcbi8vIGV4YW1wbGUgcmVzb3VyY2UgaW4gbGliL2dtYWlsLXZpZXdlci1jZGstc3RhY2sudHNcclxudGVzdCgnU1FTIFF1ZXVlIENyZWF0ZWQnLCAoKSA9PiB7XHJcbi8vICAgY29uc3QgYXBwID0gbmV3IGNkay5BcHAoKTtcclxuLy8gICAgIC8vIFdIRU5cclxuLy8gICBjb25zdCBzdGFjayA9IG5ldyBHbWFpbFZpZXdlckNkay5HbWFpbFZpZXdlckNka1N0YWNrKGFwcCwgJ015VGVzdFN0YWNrJyk7XHJcbi8vICAgICAvLyBUSEVOXHJcbi8vICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xyXG5cclxuLy8gICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U1FTOjpRdWV1ZScsIHtcclxuLy8gICAgIFZpc2liaWxpdHlUaW1lb3V0OiAzMDBcclxuLy8gICB9KTtcclxufSk7XHJcbiJdfQ== \ No newline at end of file diff --git a/examples/gmail-viewer-cdk/test/mail_example_stack.test.js b/examples/gmail-viewer-cdk/test/mail_example_stack.test.js index d04103a..7ea5ea2 100644 --- a/examples/gmail-viewer-cdk/test/mail_example_stack.test.js +++ b/examples/gmail-viewer-cdk/test/mail_example_stack.test.js @@ -15,4 +15,4 @@ test('SQS Queue Created', () => { // VisibilityTimeout: 300 // }); }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbF9leGFtcGxlX3N0YWNrLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWlsX2V4YW1wbGVfc3RhY2sudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMkNBQTJDO0FBQzNDLHFEQUFxRDtBQUNyRCx1RUFBdUU7O0FBRXZFLHVFQUF1RTtBQUN2RSxzREFBc0Q7QUFDdEQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUMvQiwrQkFBK0I7SUFDL0IsY0FBYztJQUNkLGtGQUFrRjtJQUNsRixjQUFjO0lBQ2QsZ0RBQWdEO0lBRWhELHdEQUF3RDtJQUN4RCw2QkFBNkI7SUFDN0IsUUFBUTtBQUNSLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuLy8gaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbi8vIGltcG9ydCAqIGFzIE1haWxFeGFtcGxlU3RhY2sgZnJvbSAnLi4vbGliL21haWxfZXhhbXBsZV9zdGFjay1zdGFjayc7XG5cbi8vIGV4YW1wbGUgdGVzdC4gVG8gcnVuIHRoZXNlIHRlc3RzLCB1bmNvbW1lbnQgdGhpcyBmaWxlIGFsb25nIHdpdGggdGhlXG4vLyBleGFtcGxlIHJlc291cmNlIGluIGxpYi9tYWlsX2V4YW1wbGVfc3RhY2stc3RhY2sudHNcbnRlc3QoJ1NRUyBRdWV1ZSBDcmVhdGVkJywgKCkgPT4ge1xuLy8gICBjb25zdCBhcHAgPSBuZXcgY2RrLkFwcCgpO1xuLy8gICAgIC8vIFdIRU5cbi8vICAgY29uc3Qgc3RhY2sgPSBuZXcgTWFpbEV4YW1wbGVTdGFjay5NYWlsRXhhbXBsZVN0YWNrU3RhY2soYXBwLCAnTXlUZXN0U3RhY2snKTtcbi8vICAgICAvLyBUSEVOXG4vLyAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcblxuLy8gICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U1FTOjpRdWV1ZScsIHtcbi8vICAgICBWaXNpYmlsaXR5VGltZW91dDogMzAwXG4vLyAgIH0pO1xufSk7XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbF9leGFtcGxlX3N0YWNrLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWlsX2V4YW1wbGVfc3RhY2sudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMkNBQTJDO0FBQzNDLHFEQUFxRDtBQUNyRCx1RUFBdUU7O0FBRXZFLHVFQUF1RTtBQUN2RSxzREFBc0Q7QUFDdEQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUMvQiwrQkFBK0I7SUFDL0IsY0FBYztJQUNkLGtGQUFrRjtJQUNsRixjQUFjO0lBQ2QsZ0RBQWdEO0lBRWhELHdEQUF3RDtJQUN4RCw2QkFBNkI7SUFDN0IsUUFBUTtBQUNSLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xyXG4vLyBpbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xyXG4vLyBpbXBvcnQgKiBhcyBNYWlsRXhhbXBsZVN0YWNrIGZyb20gJy4uL2xpYi9tYWlsX2V4YW1wbGVfc3RhY2stc3RhY2snO1xyXG5cclxuLy8gZXhhbXBsZSB0ZXN0LiBUbyBydW4gdGhlc2UgdGVzdHMsIHVuY29tbWVudCB0aGlzIGZpbGUgYWxvbmcgd2l0aCB0aGVcclxuLy8gZXhhbXBsZSByZXNvdXJjZSBpbiBsaWIvbWFpbF9leGFtcGxlX3N0YWNrLXN0YWNrLnRzXHJcbnRlc3QoJ1NRUyBRdWV1ZSBDcmVhdGVkJywgKCkgPT4ge1xyXG4vLyAgIGNvbnN0IGFwcCA9IG5ldyBjZGsuQXBwKCk7XHJcbi8vICAgICAvLyBXSEVOXHJcbi8vICAgY29uc3Qgc3RhY2sgPSBuZXcgTWFpbEV4YW1wbGVTdGFjay5NYWlsRXhhbXBsZVN0YWNrU3RhY2soYXBwLCAnTXlUZXN0U3RhY2snKTtcclxuLy8gICAgIC8vIFRIRU5cclxuLy8gICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XHJcblxyXG4vLyAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTUVM6OlF1ZXVlJywge1xyXG4vLyAgICAgVmlzaWJpbGl0eVRpbWVvdXQ6IDMwMFxyXG4vLyAgIH0pO1xyXG59KTtcclxuIl19 \ No newline at end of file diff --git a/examples/gmail-viewer/package-lock.json b/examples/gmail-viewer/package-lock.json new file mode 100644 index 0000000..bfb97ff --- /dev/null +++ b/examples/gmail-viewer/package-lock.json @@ -0,0 +1,1074 @@ +{ + "name": "gmail-viewer-example", + "version": "0.5.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gmail-viewer-example", + "version": "0.5.2", + "license": "MIT", + "dependencies": { + "@dyanet/config-aws": "^1.0.3", + "@dyanet/imap": "^0.5.2", + "express": "^4.21.0", + "express-session": "^1.18.0", + "helmet": "^8.0.0", + "zod": "^3.22.0" + }, + "devDependencies": { + "@types/express": "^5.0.0", + "@types/express-session": "^1.18.0", + "@types/node": "^20.10.0", + "typescript": "^5.3.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@dyanet/config-aws": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@dyanet/config-aws/-/config-aws-1.0.3.tgz", + "integrity": "sha512-Y7Wr9MWU+5rRrwg8Wr/5bqufdZWZvo8l3OZd18oCetRT9935+aPVdNP0IuGwLocitQoz+pP91x4G/3bIe/PIOg==", + "license": "MIT", + "engines": { + "node": ">=20.0.0", + "npm": ">=10.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.0.0", + "@aws-sdk/client-secrets-manager": "^3.0.0", + "@aws-sdk/client-ssm": "^3.0.0", + "zod": "^3.22.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-s3": { + "optional": true + }, + "@aws-sdk/client-secrets-manager": { + "optional": true + }, + "@aws-sdk/client-ssm": { + "optional": true + } + } + }, + "node_modules/@dyanet/imap": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@dyanet/imap/-/imap-0.5.2.tgz", + "integrity": "sha512-VwxFsqCY4DKct4A+bHzLpBex7UrwWE4p0DsLrA6Bjuwftxmtm7HkkENuRwEZOlw020XDIAfbWMKXWd/n8M/N0A==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", + "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express-session": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.18.2.tgz", + "integrity": "sha512-k+I0BxwVXsnEU2hV77cCobC08kIsn4y44C3gC0b46uxZVMaXA04lSPgRLR/bSL2w0t0ShJiG8o4jPzRG/nscFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", + "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-session": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.2.tgz", + "integrity": "sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.7", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.1.0", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/helmet": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz", + "integrity": "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "license": "MIT", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/examples/gmail-viewer/package.json b/examples/gmail-viewer/package.json index f4ec4c3..0ce9b40 100644 --- a/examples/gmail-viewer/package.json +++ b/examples/gmail-viewer/package.json @@ -25,7 +25,7 @@ "express": "^4.21.0", "express-session": "^1.18.0", "helmet": "^8.0.0", - "zod": "^4.2.1" + "zod": "^3.22.0" }, "devDependencies": { "@types/express": "^5.0.0", From 1f6c68c1cf9caae3313df813d34bc52670d6cbc4 Mon Sep 17 00:00:00 2001 From: Akber Choudhry Date: Tue, 6 Jan 2026 10:52:55 -0500 Subject: [PATCH 3/3] fix(buid) : changes to cdk and to example gmail viewer --- .../gmail-viewer-cdk/bin/gmail-viewer-cdk.js | 3 +- .../gmail-viewer-cdk/bin/gmail-viewer-cdk.ts | 3 +- .../lib/gmail-viewer-cdk-stack.d.ts | 1 + .../lib/gmail-viewer-cdk-stack.js | 710 ++----- .../lib/gmail-viewer-cdk-stack.ts | 739 ++----- examples/gmail-viewer/package-lock.json | 1844 ++++++++++++++++- examples/gmail-viewer/package.json | 3 + 7 files changed, 2106 insertions(+), 1197 deletions(-) diff --git a/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js b/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js index aad315a..332c32c 100644 --- a/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js +++ b/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.js @@ -13,6 +13,7 @@ new gmail_viewer_cdk_stack_1.GmailViewerCdkStack(app, 'GmailViewerCdkStack', { region: process.env.CDK_DEFAULT_REGION, }, privateSubnets: ['subnet-0d8290d0ea575331c', 'subnet-032290569a7ecf210'], + publicSubnets: ['subnet-0713ade30dd8c308c', 'subnet-0b4dd45b51bb8252f'], gitHubOwner: 'dyanet', gitHubRepo: 'imap', gitHubBranch: 'main', @@ -21,4 +22,4 @@ new gmail_viewer_cdk_stack_1.GmailViewerCdkStack(app, 'GmailViewerCdkStack', { apiCustomDomainName: 'mail.dyanet.com', certificateArn: 'arn:aws:acm:ca-central-1:239030031457:certificate/af9150f1-4635-4154-8b19-e5449d57e971', }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdtYWlsLXZpZXdlci1jZGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQWtDO0FBQ2xDLDBFQUFvRTtBQUVwRSxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztBQUV0QiwwRkFBMEY7QUFDMUYsK0RBQStEO0FBQy9ELE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRTVFLElBQUksNENBQW1CLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFO0lBQ2xELEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtRQUN4QyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7S0FDdkM7SUFDRCxjQUFjLEVBQUUsQ0FBQywwQkFBMEIsRUFBRywwQkFBMEIsQ0FBQztJQUN6RSxXQUFXLEVBQUUsUUFBUTtJQUNyQixVQUFVLEVBQUUsTUFBTTtJQUNsQixZQUFZLEVBQUUsTUFBTTtJQUNwQixpQkFBaUIsRUFBRSxtR0FBbUc7SUFDdEgsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixtQkFBbUIsRUFBRSxpQkFBaUI7SUFDdEMsY0FBYyxFQUFFLHdGQUF3RjtDQUN6RyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXHJcbmltcG9ydCB7IEFwcCB9IGZyb20gJ2F3cy1jZGstbGliJztcclxuaW1wb3J0IHsgR21haWxWaWV3ZXJDZGtTdGFjayB9IGZyb20gJy4uL2xpYi9nbWFpbC12aWV3ZXItY2RrLXN0YWNrJztcclxuXHJcbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcclxuXHJcbi8vIFRvIHNwZWNpZnkgc3VibmV0cywgdXNlIHRoZSAtLWNvbnRleHQgb3B0aW9uIHdpdGggYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzdWJuZXQgSURzOlxyXG4vLyBjZGsgZGVwbG95IC1jIHByaXZhdGVTdWJuZXRzPXN1Ym5ldC14eHh4eHh4eCxzdWJuZXQteXl5eXl5eXlcclxuY29uc3QgcHJpdmF0ZVN1Ym5ldHMgPSBhcHAubm9kZS50cnlHZXRDb250ZXh0KCdwcml2YXRlU3VibmV0cycpPy5zcGxpdCgnLCcpO1xyXG5cclxubmV3IEdtYWlsVmlld2VyQ2RrU3RhY2soYXBwLCAnR21haWxWaWV3ZXJDZGtTdGFjaycsIHtcclxuICBlbnY6IHtcclxuICAgIGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQsXHJcbiAgICByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTixcclxuICB9LFxyXG4gIHByaXZhdGVTdWJuZXRzOiBbJ3N1Ym5ldC0wZDgyOTBkMGVhNTc1MzMxYycsIFx0J3N1Ym5ldC0wMzIyOTA1NjlhN2VjZjIxMCddLFxyXG4gIGdpdEh1Yk93bmVyOiAnZHlhbmV0JyxcclxuICBnaXRIdWJSZXBvOiAnaW1hcCcsXHJcbiAgZ2l0SHViQnJhbmNoOiAnbWFpbicsXHJcbiAgY29kZUNvbm5lY3Rpb25Bcm46ICdhcm46YXdzOmNvZGVjb25uZWN0aW9uczpjYS1jZW50cmFsLTE6MjM5MDMwMDMxNDU3OmNvbm5lY3Rpb24vMjlmZTVjMTEtMjNkMi00YzEwLWE4MWQtNGU4ODBiMTJlMmM2JyxcclxuICB1c2VHaXRIdWJXZWJob29rczogZmFsc2UsXHJcbiAgYXBpQ3VzdG9tRG9tYWluTmFtZTogJ21haWwuZHlhbmV0LmNvbScsXHJcbiAgY2VydGlmaWNhdGVBcm46ICdhcm46YXdzOmFjbTpjYS1jZW50cmFsLTE6MjM5MDMwMDMxNDU3OmNlcnRpZmljYXRlL2FmOTE1MGYxLTQ2MzUtNDE1NC04YjE5LWU1NDQ5ZDU3ZTk3MScsXHJcbn0pO1xyXG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdtYWlsLXZpZXdlci1jZGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQWtDO0FBQ2xDLDBFQUFvRTtBQUVwRSxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztBQUV0QiwwRkFBMEY7QUFDMUYsK0RBQStEO0FBQy9ELE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRTVFLElBQUksNENBQW1CLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFO0lBQ2xELEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtRQUN4QyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7S0FDdkM7SUFDRCxjQUFjLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSwwQkFBMEIsQ0FBQztJQUN4RSxhQUFhLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSwwQkFBMEIsQ0FBQztJQUN2RSxXQUFXLEVBQUUsUUFBUTtJQUNyQixVQUFVLEVBQUUsTUFBTTtJQUNsQixZQUFZLEVBQUUsTUFBTTtJQUNwQixpQkFBaUIsRUFBRSxtR0FBbUc7SUFDdEgsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixtQkFBbUIsRUFBRSxpQkFBaUI7SUFDdEMsY0FBYyxFQUFFLHdGQUF3RjtDQUN6RyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXHJcbmltcG9ydCB7IEFwcCB9IGZyb20gJ2F3cy1jZGstbGliJztcclxuaW1wb3J0IHsgR21haWxWaWV3ZXJDZGtTdGFjayB9IGZyb20gJy4uL2xpYi9nbWFpbC12aWV3ZXItY2RrLXN0YWNrJztcclxuXHJcbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcclxuXHJcbi8vIFRvIHNwZWNpZnkgc3VibmV0cywgdXNlIHRoZSAtLWNvbnRleHQgb3B0aW9uIHdpdGggYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzdWJuZXQgSURzOlxyXG4vLyBjZGsgZGVwbG95IC1jIHByaXZhdGVTdWJuZXRzPXN1Ym5ldC14eHh4eHh4eCxzdWJuZXQteXl5eXl5eXlcclxuY29uc3QgcHJpdmF0ZVN1Ym5ldHMgPSBhcHAubm9kZS50cnlHZXRDb250ZXh0KCdwcml2YXRlU3VibmV0cycpPy5zcGxpdCgnLCcpO1xyXG5cclxubmV3IEdtYWlsVmlld2VyQ2RrU3RhY2soYXBwLCAnR21haWxWaWV3ZXJDZGtTdGFjaycsIHtcclxuICBlbnY6IHtcclxuICAgIGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQsXHJcbiAgICByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTixcclxuICB9LFxyXG4gIHByaXZhdGVTdWJuZXRzOiBbJ3N1Ym5ldC0wZDgyOTBkMGVhNTc1MzMxYycsICdzdWJuZXQtMDMyMjkwNTY5YTdlY2YyMTAnXSxcclxuICBwdWJsaWNTdWJuZXRzOiBbJ3N1Ym5ldC0wNzEzYWRlMzBkZDhjMzA4YycsICdzdWJuZXQtMGI0ZGQ0NWI1MWJiODI1MmYnXSxcclxuICBnaXRIdWJPd25lcjogJ2R5YW5ldCcsXHJcbiAgZ2l0SHViUmVwbzogJ2ltYXAnLFxyXG4gIGdpdEh1YkJyYW5jaDogJ21haW4nLFxyXG4gIGNvZGVDb25uZWN0aW9uQXJuOiAnYXJuOmF3czpjb2RlY29ubmVjdGlvbnM6Y2EtY2VudHJhbC0xOjIzOTAzMDAzMTQ1Nzpjb25uZWN0aW9uLzI5ZmU1YzExLTIzZDItNGMxMC1hODFkLTRlODgwYjEyZTJjNicsXHJcbiAgdXNlR2l0SHViV2ViaG9va3M6IGZhbHNlLFxyXG4gIGFwaUN1c3RvbURvbWFpbk5hbWU6ICdtYWlsLmR5YW5ldC5jb20nLFxyXG4gIGNlcnRpZmljYXRlQXJuOiAnYXJuOmF3czphY206Y2EtY2VudHJhbC0xOjIzOTAzMDAzMTQ1NzpjZXJ0aWZpY2F0ZS9hZjkxNTBmMS00NjM1LTQxNTQtOGIxOS1lNTQ0OWQ1N2U5NzEnLFxyXG59KTtcclxuIl19 \ 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 a0292c4..b984745 100644 --- a/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.ts +++ b/examples/gmail-viewer-cdk/bin/gmail-viewer-cdk.ts @@ -13,7 +13,8 @@ new GmailViewerCdkStack(app, 'GmailViewerCdkStack', { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION, }, - privateSubnets: ['subnet-0d8290d0ea575331c', 'subnet-032290569a7ecf210'], + privateSubnets: ['subnet-0d8290d0ea575331c', 'subnet-032290569a7ecf210'], + publicSubnets: ['subnet-0713ade30dd8c308c', 'subnet-0b4dd45b51bb8252f'], gitHubOwner: 'dyanet', gitHubRepo: 'imap', gitHubBranch: 'main', diff --git a/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.d.ts b/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.d.ts index 0f6ce4b..177ad7f 100644 --- a/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.d.ts +++ b/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.d.ts @@ -2,6 +2,7 @@ import * as cdk from 'aws-cdk-lib'; export interface GmailViewerCdkStackProps extends cdk.StackProps { readonly vpcId?: string; readonly privateSubnets?: string[]; + readonly publicSubnets?: string[]; readonly containerPort?: number | string; readonly containerCpu?: number | string; readonly containerMemory?: number | string; 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 ae921de..d3db55e 100644 --- a/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.js +++ b/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.js @@ -37,6 +37,7 @@ exports.GmailViewerCdkStack = void 0; const cdk = __importStar(require("aws-cdk-lib")); const apigatewayv2 = __importStar(require("aws-cdk-lib/aws-apigatewayv2")); const codebuild = __importStar(require("aws-cdk-lib/aws-codebuild")); +const cr = __importStar(require("aws-cdk-lib/custom-resources")); const ec2 = __importStar(require("aws-cdk-lib/aws-ec2")); const ecr = __importStar(require("aws-cdk-lib/aws-ecr")); const ecs = __importStar(require("aws-cdk-lib/aws-ecs")); @@ -44,6 +45,7 @@ const iam = __importStar(require("aws-cdk-lib/aws-iam")); 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; @@ -60,611 +62,185 @@ class GmailViewerCdkStack extends cdk.Stack { const toCpuUnits = (value) => { const parsed = toNumber(value, 0.5); const vcpu = parsed <= 4 ? parsed * 1024 : parsed; - const rounded = Math.round(vcpu / 256) * 256; - return Math.max(256, rounded); + return Math.max(256, Math.round(vcpu / 256) * 256); }; const repoParts = (process.env.GITHUB_REPOSITORY ?? '').split('/'); - const guessedGitHubOwner = repoParts[0] || 'dyanet'; - const guessedGitHubRepo = repoParts[1] || 'imap'; const containerPort = toNumber(props.containerPort, 3000); const containerCpu = toCpuUnits(props.containerCpu); const containerMemory = toNumber(props.containerMemory, 1024); const desiredCount = toNumber(props.desiredCount, 1); - const serviceDiscoveryNamespaceName = props.serviceDiscoveryNamespaceName ?? 'mail.local'; - const serviceDiscoveryTtl = toNumber(props.serviceDiscoveryTtl, 60); + const nsName = props.serviceDiscoveryNamespaceName ?? 'mail.local'; + const nsTtl = cdk.Duration.seconds(toNumber(props.serviceDiscoveryTtl, 60)); const ssmPrefixRaw = props.ssmPrefix ?? '/mail-example'; const ssmPrefix = '/' + ssmPrefixRaw.split('/').filter(p => p).join('/'); - const gitHubOwner = props.gitHubOwner ?? guessedGitHubOwner; - const gitHubRepo = props.gitHubRepo ?? guessedGitHubRepo; + const gitHubOwner = props.gitHubOwner ?? (repoParts[0] || 'dyanet'); + const gitHubRepo = props.gitHubRepo ?? (repoParts[1] || 'imap'); const gitHubBranch = props.gitHubBranch ?? process.env.GITHUB_REF_NAME ?? 'main'; const publicEnvValue = props.publicEnvValue ?? 'production'; - const googleClientId = props.googleClientId || 'not-set'; - const googleClientSecret = props.googleClientSecret ?? 'not-set'; - const sessionSecretValue = props.sessionSecretValue ?? 'not-set'; - const apiCustomDomainName = props.apiCustomDomainName ?? process.env.API_CUSTOM_DOMAIN ?? 'mail.dyanet.com'; - const certificateArn = props.certificateArn ?? this.node.tryGetContext('certificateArn') ?? process.env.CERTIFICATE_ARN; - const hostedZoneId = props.hostedZoneId ?? ''; - const hasCustomDomain = Boolean(certificateArn && apiCustomDomainName); - const hasHostedZone = Boolean(hostedZoneId); + 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 certArn = props.certificateArn ?? this.node.tryGetContext('certificateArn') ?? process.env.CERTIFICATE_ARN; + const zoneId = props.hostedZoneId ?? ''; + const hasCustomDomain = Boolean(certArn && apiDomain); + const hasHostedZone = Boolean(zoneId); + const usePublicSubnets = props.publicSubnets && props.publicSubnets.length > 0; + // VPC setup let vpc; - let privateSubnetIds; let serviceSubnetIds; - // If account/region are available, use Vpc.fromLookup to automatically discover subnets. - // Otherwise fall back to CloudFormation parameters which let the deployer pick values in the console. const useVpcParameter = this.node.tryGetContext('useVpcParameter'); if (!useVpcParameter && this.account && this.region) { vpc = ec2.Vpc.fromLookup(this, 'MailVpc', { tags: { Name: 'dya-vpc' } }); - if (props.privateSubnets && props.privateSubnets.length > 0) { - privateSubnetIds = props.privateSubnets; + if (usePublicSubnets) { + serviceSubnetIds = props.publicSubnets; + } + else if (props.privateSubnets && props.privateSubnets.length > 0) { + serviceSubnetIds = props.privateSubnets; } else { - // The service linked to the VPC Link may not be available in all Availability Zones. const badAz = 'cac1-az4'; let subnets = vpc.privateSubnets.filter(s => s.availabilityZone !== badAz); - if (subnets.length === 0) { - // No private subnets, try public subnets + if (subnets.length === 0) subnets = vpc.publicSubnets.filter(s => s.availabilityZone !== badAz); - } - privateSubnetIds = subnets.slice(0, 2).map(s => s.subnetId); - if (privateSubnetIds.length < 1) { - throw new Error(`VPC '${vpc.vpcId}' must have at least one private or public subnet in an allowed availability zone (not in ${badAz}).`); - } + serviceSubnetIds = subnets.slice(0, 2).map(s => s.subnetId); + if (serviceSubnetIds.length < 1) + throw new Error(`VPC must have at least one subnet in an allowed AZ.`); } - serviceSubnetIds = privateSubnetIds; } else { - // CloudFormation parameter for VPC selection (dropdown of VPC IDs in the console) - const vpcIdParam = new cdk.CfnParameter(this, 'VpcIdParam', { - type: 'AWS::EC2::VPC::Id', - default: props.vpcId ?? '', - }); - // Optional parameter for private subnet IDs (CommaDelimitedList) when synthesizing without account/region - const privateSubnetIdsParam = new cdk.CfnParameter(this, 'PrivateSubnetIdsParam', { - type: 'CommaDelimitedList', - default: props.privateSubnets && props.privateSubnets.length > 0 ? props.privateSubnets.join(',') : '', - }); - // Use the provided parameter values (deployer must supply private subnet ids when synthesizing without lookup) - vpc = ec2.Vpc.fromVpcAttributes(this, 'MailVpc', { - vpcId: vpcIdParam.valueAsString, - availabilityZones: cdk.Fn.getAzs(), - privateSubnetIds: privateSubnetIdsParam.valueAsList, - }); - privateSubnetIds = props.privateSubnets ?? privateSubnetIdsParam.valueAsList; - serviceSubnetIds = privateSubnetIds; - } - const apiVpcLinkSecurityGroup = new ec2.CfnSecurityGroup(this, 'ApiVpcLinkSecurityGroup', { - groupDescription: 'Egress from API Gateway VPC Link to service', - vpcId: vpc.vpcId, - securityGroupEgress: [ - { - ipProtocol: 'tcp', - fromPort: containerPort, - toPort: containerPort, - cidrIp: '0.0.0.0/0', - }, - ], - }); - apiVpcLinkSecurityGroup.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const serviceSecurityGroup = new ec2.CfnSecurityGroup(this, 'ServiceSecurityGroup', { - groupDescription: 'Allow API Gateway VPC Link to reach Fargate tasks', - vpcId: vpc.vpcId, - securityGroupIngress: [ - { - ipProtocol: 'tcp', - fromPort: containerPort, - toPort: containerPort, - cidrIp: '0.0.0.0/0', - }, - ], - securityGroupEgress: [ - { - ipProtocol: '-1', - fromPort: 0, - toPort: 65535, - cidrIp: '0.0.0.0/0', - }, - ], - }); - serviceSecurityGroup.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const appLogGroup = new logs.CfnLogGroup(this, 'AppLogGroup', { - logGroupName: '/ecs/mail-example', - retentionInDays: 30, - }); - appLogGroup.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const mailCluster = new ecs.CfnCluster(this, 'MailCluster', { - clusterName: 'mail-cluster', - capacityProviders: ['FARGATE', 'FARGATE_SPOT'], - defaultCapacityProviderStrategy: [ - { - capacityProvider: 'FARGATE_SPOT', - weight: 4, - }, - { - capacityProvider: 'FARGATE', - weight: 1, - }, - ], - }); - mailCluster.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const mailExampleRepository = new ecr.CfnRepository(this, 'MailExampleRepository', { - repositoryName: 'mail-example', - imageTagMutability: 'MUTABLE', - encryptionConfiguration: { - encryptionType: 'AES256', - }, - lifecyclePolicy: { - lifecyclePolicyText: '{\n "rules": [\n {\n "rulePriority": 1,\n "description": "Expire images older than 30 days",\n "selection": {\n "tagStatus": "any",\n "countType": "sinceImagePushed",\n "countUnit": "days",\n "countNumber": 30\n },\n "action": { "type": "expire" }\n }\n ]\n}\n', - }, - }); - mailExampleRepository.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const mailHttpApi = new apigatewayv2.CfnApi(this, 'MailHttpApi', { - name: 'mail-example', - protocolType: 'HTTP', - }); - mailHttpApi.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const mailApiStage = new apigatewayv2.CfnStage(this, 'MailApiStage', { - stageName: 'prod', - apiId: mailHttpApi.ref, - autoDeploy: true, - }); - mailApiStage.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const apiDomainName = hasCustomDomain - ? new apigatewayv2.CfnDomainName(this, 'ApiDomainName', { - domainName: apiCustomDomainName, - domainNameConfigurations: [ - { - certificateArn: certificateArn, - endpointType: 'REGIONAL', - securityPolicy: 'TLS_1_2', - }, - ], - }) - : undefined; - if (apiDomainName) { - apiDomainName.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - } - const apiMapping = hasCustomDomain && apiDomainName - ? new apigatewayv2.CfnApiMapping(this, 'ApiMapping', { - apiId: mailHttpApi.ref, - domainName: apiDomainName.ref, - stage: mailApiStage.ref, - apiMappingKey: 'examples', - }) - : undefined; - if (apiMapping) { - apiMapping.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - } - const apiDomainRecord = hasCustomDomain && hasHostedZone && apiDomainName - ? new route53.CfnRecordSet(this, 'ApiDomainRecord', { - hostedZoneId, - name: apiCustomDomainName, - type: 'A', - aliasTarget: { - dnsName: apiDomainName.attrRegionalDomainName, - hostedZoneId: apiDomainName.attrRegionalHostedZoneId, - }, - }) - : undefined; - if (apiDomainRecord) { - apiDomainRecord.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; + const vpcIdParam = new cdk.CfnParameter(this, 'VpcIdParam', { type: 'AWS::EC2::VPC::Id', default: props.vpcId ?? '' }); + const subnetParam = new cdk.CfnParameter(this, 'PrivateSubnetIdsParam', { type: 'CommaDelimitedList', default: props.privateSubnets?.join(',') ?? '' }); + vpc = ec2.Vpc.fromVpcAttributes(this, 'MailVpc', { vpcId: vpcIdParam.valueAsString, availabilityZones: cdk.Fn.getAzs(), privateSubnetIds: subnetParam.valueAsList }); + serviceSubnetIds = props.privateSubnets ?? subnetParam.valueAsList; } + // Security Groups (L2) + const apiVpcLinkSg = new ec2.SecurityGroup(this, 'ApiVpcLinkSecurityGroup', { vpc, description: 'Egress from API Gateway VPC Link', allowAllOutbound: false }); + apiVpcLinkSg.addEgressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(containerPort)); + const serviceSg = new ec2.SecurityGroup(this, 'ServiceSecurityGroup', { vpc, description: 'Allow traffic to Fargate tasks', allowAllOutbound: true }); + serviceSg.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(containerPort)); + // Log Group (L2) + const appLogGroup = new logs.LogGroup(this, 'AppLogGroup', { logGroupName: '/ecs/mail-example', retention: logs.RetentionDays.ONE_MONTH, removalPolicy: cdk.RemovalPolicy.DESTROY }); + // ECS Cluster (L2) + const cluster = new ecs.Cluster(this, 'MailCluster', { vpc, clusterName: 'public-cluster', enableFargateCapacityProviders: true }); + // ECR Repository - create if not exists using custom resource + const ecrRepoName = 'mail-example'; + const checkEcrRepo = new cr.AwsCustomResource(this, 'CheckEcrRepo', { + onCreate: { service: 'ECR', action: 'describeRepositories', parameters: { repositoryNames: [ecrRepoName] }, physicalResourceId: cr.PhysicalResourceId.of(ecrRepoName) }, + policy: cr.AwsCustomResourcePolicy.fromSdkCalls({ resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE }), + }); + const createEcrRepo = new cr.AwsCustomResource(this, 'CreateEcrRepo', { + onCreate: { service: 'ECR', action: 'createRepository', parameters: { repositoryName: ecrRepoName, imageTagMutability: 'MUTABLE', encryptionConfiguration: { encryptionType: 'AES256' } }, physicalResourceId: cr.PhysicalResourceId.of(ecrRepoName), ignoreErrorCodesMatching: 'RepositoryAlreadyExistsException' }, + policy: cr.AwsCustomResourcePolicy.fromSdkCalls({ resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE }), + }); + createEcrRepo.node.addDependency(checkEcrRepo); + const ecrRepo = ecr.Repository.fromRepositoryName(this, 'MailExampleRepositoryRef', ecrRepoName); + // API Gateway HTTP API (L1 - no L2 for HTTP API with VPC Link) + const httpApi = new apigatewayv2.CfnApi(this, 'MailHttpApi', { name: 'mail-example', protocolType: 'HTTP' }); + const apiStage = new apigatewayv2.CfnStage(this, 'MailApiStage', { stageName: 'prod', apiId: httpApi.ref, autoDeploy: true }); + const apiDomainName = hasCustomDomain ? new apigatewayv2.CfnDomainName(this, 'ApiDomainName', { + domainName: apiDomain, domainNameConfigurations: [{ certificateArn: certArn, endpointType: 'REGIONAL', securityPolicy: 'TLS_1_2' }], + }) : undefined; + const apiMapping = hasCustomDomain && apiDomainName ? new apigatewayv2.CfnApiMapping(this, 'ApiMapping', { + apiId: httpApi.ref, domainName: apiDomainName.ref, stage: apiStage.ref, apiMappingKey: 'examples', + }) : undefined; if (apiMapping && apiDomainName) { apiMapping.addDependency(apiDomainName); - apiMapping.addDependency(mailApiStage); + apiMapping.addDependency(apiStage); } - if (apiDomainRecord && apiDomainName) { - apiDomainRecord.addDependency(apiDomainName); - } - const baseUrl = hasCustomDomain - ? `https://${apiCustomDomainName}/examples/gmail-viewer` - : cdk.Fn.join('', [mailHttpApi.attrApiEndpoint, '/', mailApiStage.ref, '/gmail-viewer']); - const serviceNamespace = new servicediscovery.CfnPrivateDnsNamespace(this, 'ServiceNamespace', { - name: serviceDiscoveryNamespaceName, - vpc: vpc.vpcId, - description: 'Namespace for mail services', - }); - serviceNamespace.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const apiVpcLink = new apigatewayv2.CfnVpcLink(this, 'ApiVpcLink', { - name: 'mail-example-vpclink', - subnetIds: serviceSubnetIds, - securityGroupIds: [apiVpcLinkSecurityGroup.ref], - }); - apiVpcLink.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const appCloudMapService = new servicediscovery.CfnService(this, 'AppCloudMapService', { - name: 'mail-example', - namespaceId: serviceNamespace.ref, - dnsConfig: { - routingPolicy: 'WEIGHTED', - dnsRecords: [ - { - ttl: serviceDiscoveryTtl, - type: 'SRV', - }, - ], + const apiRecord = hasCustomDomain && hasHostedZone && apiDomainName ? new route53.CfnRecordSet(this, 'ApiDomainRecord', { + hostedZoneId: zoneId, name: apiDomain, type: 'A', aliasTarget: { dnsName: apiDomainName.attrRegionalDomainName, hostedZoneId: apiDomainName.attrRegionalHostedZoneId }, + }) : undefined; + if (apiRecord && apiDomainName) + apiRecord.addDependency(apiDomainName); + const baseUrl = hasCustomDomain ? `https://${apiDomain}/examples/gmail-viewer` : cdk.Fn.join('', [httpApi.attrApiEndpoint, '/', apiStage.ref, '/gmail-viewer']); + // Cloud Map Namespace (L2) + const namespace = new servicediscovery.PrivateDnsNamespace(this, 'ServiceNamespace', { name: nsName, vpc, description: 'Namespace for mail services' }); + // VPC Link (L1) + const vpcLink = new apigatewayv2.CfnVpcLink(this, 'ApiVpcLink', { name: 'mail-example-vpclink', subnetIds: serviceSubnetIds, securityGroupIds: [apiVpcLinkSg.securityGroupId] }); + // Cloud Map Service (L2) + 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 + const appSecrets = new secretsmanager.Secret(this, 'AppSecrets', { + secretName: `${ssmPrefix}/secrets`, + description: 'Application secrets for mail-example', + secretObjectValue: { + GOOGLE_CLIENT_SECRET: cdk.SecretValue.unsafePlainText(googleClientSecret), + SESSION_SECRET: cdk.SecretValue.unsafePlainText(sessionSecretValue), }, - healthCheckCustomConfig: { - failureThreshold: 1, - }, - }); - appCloudMapService.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const taskExecutionRole = new iam.CfnRole(this, 'TaskExecutionRole', { - assumeRolePolicyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { - Service: 'ecs-tasks.amazonaws.com', - }, - Action: 'sts:AssumeRole', - }, - ], - }, - managedPolicyArns: ['arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy'], - policies: [ - { - policyName: 'AllowParameterReadForSecrets', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath', 'kms:Decrypt'], - Resource: [ - `arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}*`, - `arn:aws:kms:${this.region}:${this.account}:key/*`, - ], - }, - ], - }, - }, - ], }); - taskExecutionRole.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const taskRole = new iam.CfnRole(this, 'TaskRole', { - assumeRolePolicyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { - Service: 'ecs-tasks.amazonaws.com', - }, - Action: 'sts:AssumeRole', - }, - ], + // IAM Roles (L2) + const taskExecRole = new iam.Role(this, 'TaskExecutionRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AmazonECSTaskExecutionRolePolicy')] }); + taskExecRole.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/*`] })); + taskExecRole.addToPolicy(new iam.PolicyStatement({ actions: ['secretsmanager:GetSecretValue'], resources: [appSecrets.secretArn] })); + 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', { + image: ecs.ContainerImage.fromEcrRepository(ecrRepo, 'latest'), portMappings: [{ containerPort }], + 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_SECRET: ecs.Secret.fromSecretsManager(appSecrets, 'GOOGLE_CLIENT_SECRET'), + SESSION_SECRET: ecs.Secret.fromSecretsManager(appSecrets, 'SESSION_SECRET'), }, - policies: [ - { - policyName: 'AppRuntimeConfigRead', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath', 'kms:Decrypt'], - Resource: [ - `arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}*`, - `arn:aws:kms:${this.region}:${this.account}:key/*`, - ], - }, - ], - }, - }, - ], - }); - taskRole.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const appTaskDefinition = new ecs.CfnTaskDefinition(this, 'AppTaskDefinition', { - family: 'mail-example', - cpu: containerCpu.toString(), - memory: containerMemory.toString(), - networkMode: 'awsvpc', - requiresCompatibilities: ['FARGATE'], - executionRoleArn: taskExecutionRole.attrArn, - taskRoleArn: taskRole.attrArn, - containerDefinitions: [ - { - name: 'mail-example', - image: `${mailExampleRepository.attrRepositoryUri}:latest`, - portMappings: [ - { - containerPort, - }, - ], - logConfiguration: { - logDriver: 'awslogs', - options: { - 'awslogs-group': appLogGroup.ref, - 'awslogs-region': this.region, - 'awslogs-stream-prefix': 'mail-example', - }, - }, - environment: [ - { - name: 'CONFIG_SSM_PREFIX', - value: ssmPrefix, - }, - { - name: 'PORT', - value: containerPort.toString(), - }, - { - name: 'BASE_URL', - value: baseUrl.toString(), - }, - { - name: 'NODE_ENV', - value: publicEnvValue, - }, - ], - secrets: [ - { - name: 'GOOGLE_CLIENT_ID', - valueFrom: `arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}/env/GOOGLE_CLIENT_ID`, - }, - { - name: 'GOOGLE_CLIENT_SECRET', - valueFrom: `arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}/secrets/GOOGLE_CLIENT_SECRET`, - }, - { - name: 'SESSION_SECRET', - valueFrom: `arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}/secrets/SESSION_SECRET`, - }, - ], - }, - ], }); - appTaskDefinition.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - new ecs.CfnService(this, 'AppService', { - serviceName: 'mail-example', - cluster: mailCluster.ref, - taskDefinition: appTaskDefinition.ref, - desiredCount, - capacityProviderStrategy: [ - { - capacityProvider: 'FARGATE_SPOT', - weight: 4, - }, - { - capacityProvider: 'FARGATE', - weight: 1, - }, - ], - deploymentConfiguration: { - maximumPercent: 200, - minimumHealthyPercent: 50, - }, - networkConfiguration: { - awsvpcConfiguration: { - assignPublicIp: 'DISABLED', - subnets: serviceSubnetIds, - securityGroups: [serviceSecurityGroup.ref], - }, - }, - serviceRegistries: [ - { - registryArn: appCloudMapService.attrArn, - containerName: 'mail-example', - containerPort: containerPort, - }, - ], - platformVersion: 'LATEST', - }); - const mailIntegration = new apigatewayv2.CfnIntegration(this, 'MailIntegration', { - apiId: mailHttpApi.ref, - integrationType: 'HTTP_PROXY', - integrationMethod: 'ANY', - integrationUri: appCloudMapService.attrArn, - connectionType: 'VPC_LINK', - connectionId: apiVpcLink.ref, - payloadFormatVersion: '1.0', - }); - new apigatewayv2.CfnRoute(this, 'GmailViewerRoute', { - apiId: mailHttpApi.ref, - routeKey: 'ANY /gmail-viewer', - target: `integrations/${mailIntegration.ref}`, - }); - new apigatewayv2.CfnRoute(this, 'GmailViewerProxyRoute', { - apiId: mailHttpApi.ref, - routeKey: 'ANY /gmail-viewer/{proxy+}', - target: `integrations/${mailIntegration.ref}`, - }); - const ssmBaseUrl = new ssm.StringParameter(this, 'SsmBaseUrl', { - parameterName: `${ssmPrefix}/env/BASE_URL`, - stringValue: baseUrl, - type: ssm.ParameterType.STRING, - }); - ssmBaseUrl.node.defaultChild.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const ssmGoogleClientId = new ssm.StringParameter(this, 'SsmGoogleClientId', { - parameterName: `${ssmPrefix}/env/GOOGLE_CLIENT_ID`, - stringValue: googleClientId, - type: ssm.ParameterType.STRING, - }); - ssmGoogleClientId.node.defaultChild.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const ssmGoogleClientSecret = new ssm.StringParameter(this, 'SsmGoogleClientSecret', { - parameterName: `${ssmPrefix}/secrets/GOOGLE_CLIENT_SECRET`, - stringValue: googleClientSecret, - type: ssm.ParameterType.STRING, - }); - ssmGoogleClientSecret.node.defaultChild.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const ssmPort = new ssm.StringParameter(this, 'SsmPort', { - parameterName: `${ssmPrefix}/env/PORT`, - stringValue: containerPort.toString(), - type: ssm.ParameterType.STRING, - }); - ssmPort.node.defaultChild.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const ssmPublicEnv = new ssm.StringParameter(this, 'SsmPublicEnv', { - parameterName: `${ssmPrefix}/env/NODE_ENV`, - stringValue: publicEnvValue, - type: ssm.ParameterType.STRING, - }); - ssmPublicEnv.node.defaultChild.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const ssmSessionSecret = new ssm.StringParameter(this, 'SsmSessionSecret', { - parameterName: `${ssmPrefix}/secrets/SESSION_SECRET`, - stringValue: sessionSecretValue, - type: ssm.ParameterType.STRING, - }); - ssmSessionSecret.node.defaultChild.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const codeBuildRole = new iam.CfnRole(this, 'CodeBuildRole', { - assumeRolePolicyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { - Service: 'codebuild.amazonaws.com', - }, - Action: 'sts:AssumeRole', - }, - ], - }, - policies: [ - { - policyName: 'BuildLogs', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents'], - Resource: '*', - }, - ], - }, - }, - { - policyName: 'ECRPush', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 'ecr:GetAuthorizationToken', - 'ecr:BatchCheckLayerAvailability', - 'ecr:CompleteLayerUpload', - 'ecr:BatchGetImage', - 'ecr:DescribeRepositories', - 'ecr:InitiateLayerUpload', - 'ecr:PutImage', - 'ecr:UploadLayerPart', - ], - Resource: '*', - }, - ], - }, - }, - { - policyName: 'ECSDeploy', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['ecs:UpdateService', 'ecs:DescribeServices', 'ecs:DescribeClusters'], - Resource: '*', - }, - ], - }, - }, - { - policyName: 'SSMReadForBuild', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath'], - Resource: '*', - }, - ], - }, - }, - { - policyName: 'CodeConnectionAccess', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - "codeconnections:GetConnection", - "codeconnections:GetConnectionToken", - "codeconnections:UseConnection" - ], - Resource: props.codeConnectionArn, - }, - ], - }, - } - ], - }); - codeBuildRole.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - // Use the higher-level Project construct so we can provide a typed BuildSpec - const codebuildRoleRef = iam.Role.fromRoleArn(this, 'CodeBuildRoleRef', codeBuildRole.attrArn); - const codeBuildProject = new codebuild.Project(this, 'CodeBuildProject', { - projectName: 'mail-example', - role: codebuildRoleRef, - environment: { - buildImage: codebuild.LinuxBuildImage.STANDARD_7_0, - computeType: codebuild.ComputeType.SMALL, - privileged: true, - environmentVariables: { - ECR_URI: { value: mailExampleRepository.attrRepositoryUri }, - CLUSTER_NAME: { value: mailCluster.ref }, - SERVICE_NAME: { value: 'mail-example' }, - }, - }, - source: codebuild.Source.gitHub({ owner: gitHubOwner, repo: gitHubRepo, branchOrRef: gitHubBranch, }), - timeout: cdk.Duration.minutes(30), - queuedTimeout: cdk.Duration.minutes(30), - badge: true, - description: 'Build & deploy mail-example to ECR then force ECS deploy', - cache: codebuild.Cache.none(), + // ECS Service (L2) - associate with standalone Cloud Map service for API Gateway integration + const service = new ecs.FargateService(this, 'AppService', { + serviceName: 'mail-example', cluster, taskDefinition: taskDef, desiredCount, + capacityProviderStrategies: [{ capacityProvider: 'FARGATE_SPOT', weight: 4 }, { capacityProvider: 'FARGATE', weight: 1 }], + vpcSubnets: { subnets: serviceSubnetIds.map((id, i) => ec2.Subnet.fromSubnetId(this, `ServiceSubnet${i}`, id)) }, + securityGroups: [serviceSg], assignPublicIp: usePublicSubnets ?? false, minHealthyPercent: 50, maxHealthyPercent: 200, + }); + service.associateCloudMapService({ service: cloudMapService, containerPort, container: taskDef.defaultContainer }); + // API Gateway Integration (L1) + const integration = new apigatewayv2.CfnIntegration(this, 'MailIntegration', { apiId: httpApi.ref, integrationType: 'HTTP_PROXY', integrationMethod: 'ANY', integrationUri: cloudMapService.serviceArn, connectionType: 'VPC_LINK', connectionId: vpcLink.ref, payloadFormatVersion: '1.0' }); + new apigatewayv2.CfnRoute(this, 'GmailViewerRoute', { apiId: httpApi.ref, routeKey: 'ANY /gmail-viewer', target: `integrations/${integration.ref}` }); + new apigatewayv2.CfnRoute(this, 'GmailViewerProxyRoute', { apiId: httpApi.ref, routeKey: 'ANY /gmail-viewer/{proxy+}', target: `integrations/${integration.ref}` }); + // CodeBuild Role (L2) + const buildRole = new iam.Role(this, 'CodeBuildRole', { assumedBy: new iam.ServicePrincipal('codebuild.amazonaws.com') }); + buildRole.addToPolicy(new iam.PolicyStatement({ actions: ['logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents'], resources: ['*'] })); + buildRole.addToPolicy(new iam.PolicyStatement({ actions: ['ecr:GetAuthorizationToken', 'ecr:BatchCheckLayerAvailability', 'ecr:CompleteLayerUpload', 'ecr:BatchGetImage', 'ecr:DescribeRepositories', 'ecr:InitiateLayerUpload', 'ecr:PutImage', 'ecr:UploadLayerPart'], resources: ['*'] })); + buildRole.addToPolicy(new iam.PolicyStatement({ actions: ['ecs:UpdateService', 'ecs:DescribeServices', 'ecs:DescribeClusters'], resources: ['*'] })); + buildRole.addToPolicy(new iam.PolicyStatement({ actions: ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath'], resources: ['*'] })); + if (props.codeConnectionArn) + buildRole.addToPolicy(new iam.PolicyStatement({ actions: ['codeconnections:GetConnection', 'codeconnections:GetConnectionToken', 'codeconnections:UseConnection'], resources: [props.codeConnectionArn] })); + // CodeBuild Project (L2) + new codebuild.Project(this, 'CodeBuildProject', { + projectName: 'mail-example', role: buildRole, + environment: { buildImage: codebuild.LinuxBuildImage.STANDARD_7_0, computeType: codebuild.ComputeType.SMALL, privileged: true, environmentVariables: { ECR_URI: { value: ecrRepo.repositoryUri }, CLUSTER_NAME: { value: cluster.clusterName }, SERVICE_NAME: { value: 'mail-example' } } }, + source: codebuild.Source.gitHub({ owner: gitHubOwner, repo: gitHubRepo, branchOrRef: gitHubBranch }), + timeout: cdk.Duration.minutes(30), queuedTimeout: cdk.Duration.minutes(30), badge: true, description: 'Build & deploy mail-example to ECR then force ECS deploy', buildSpec: codebuild.BuildSpec.fromObject({ version: '0.2', phases: { - pre_build: { commands: [ - 'echo "Logging in to ECR"', - 'aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_URI', - 'IMAGE_TAG=${CODEBUILD_RESOLVED_SOURCE_VERSION:-latest}', - ] }, - build: { commands: [ - 'cd examples/gmail-viewer', - 'docker build -t $ECR_URI:latest -t $ECR_URI:$IMAGE_TAG .', - ] }, - post_build: { commands: [ - 'docker push $ECR_URI:latest', - 'docker push $ECR_URI:$IMAGE_TAG', - 'aws ecs update-service --cluster $CLUSTER_NAME --service $SERVICE_NAME --force-new-deployment', - ] }, + pre_build: { commands: ['echo "Logging in to ECR"', 'aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_URI', 'IMAGE_TAG=${CODEBUILD_RESOLVED_SOURCE_VERSION:-latest}'] }, + build: { commands: ['cd examples/gmail-viewer', 'docker build -t $ECR_URI:latest -t $ECR_URI:$IMAGE_TAG .'] }, + post_build: { commands: ['docker push $ECR_URI:latest', 'docker push $ECR_URI:$IMAGE_TAG', 'aws ecs update-service --cluster $CLUSTER_NAME --service $SERVICE_NAME --force-new-deployment'] }, }, - artifacts: { files: [] }, - env: { shell: 'bash' }, + artifacts: { files: [] }, env: { shell: 'bash' }, }), }); - codeBuildProject.node.defaultChild.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - this.clusterName = mailCluster.ref; - new cdk.CfnOutput(this, 'CfnOutputClusterName', { - key: 'ClusterName', - value: this.clusterName.toString(), - }); - this.repositoryUri = mailExampleRepository.attrRepositoryUri; - new cdk.CfnOutput(this, 'CfnOutputRepositoryUri', { - key: 'RepositoryUri', - value: this.repositoryUri.toString(), - }); + // Outputs + this.clusterName = cluster.clusterName; + new cdk.CfnOutput(this, 'ClusterName', { value: this.clusterName }); + this.repositoryUri = ecrRepo.repositoryUri; + new cdk.CfnOutput(this, 'RepositoryUri', { value: this.repositoryUri }); this.apiInvokeUrl = baseUrl.toString(); - new cdk.CfnOutput(this, 'CfnOutputApiInvokeUrl', { - key: 'ApiInvokeUrl', - value: this.apiInvokeUrl, - }); - this.cloudMapServiceArn = appCloudMapService.attrArn; - new cdk.CfnOutput(this, 'CfnOutputCloudMapServiceArn', { - key: 'CloudMapServiceArn', - value: this.cloudMapServiceArn.toString(), - }); + new cdk.CfnOutput(this, 'ApiInvokeUrl', { value: this.apiInvokeUrl }); + this.cloudMapServiceArn = cloudMapService.serviceArn; + new cdk.CfnOutput(this, 'CloudMapServiceArn', { value: this.cloudMapServiceArn }); } } exports.GmailViewerCdkStack = GmailViewerCdkStack; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ21haWwtdmlld2VyLWNkay1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdtYWlsLXZpZXdlci1jZGstc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW1DO0FBQ25DLDJFQUE2RDtBQUM3RCxxRUFBdUQ7QUFDdkQseURBQTJDO0FBQzNDLHlEQUEyQztBQUMzQyx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLDJEQUE2QztBQUM3QyxpRUFBbUQ7QUFDbkQsbUZBQXFFO0FBQ3JFLHlEQUEyQztBQTBCM0MsTUFBYSxtQkFBb0IsU0FBUSxHQUFHLENBQUMsS0FBSztJQUNoQyxXQUFXLENBQVM7SUFDcEIsYUFBYSxDQUFTO0lBQ3RCLFlBQVksQ0FBUztJQUNyQixrQkFBa0IsQ0FBUztJQUUzQyxZQUFtQixLQUFjLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQzVFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBa0MsRUFBRSxRQUFnQixFQUFVLEVBQUU7WUFDaEYsTUFBTSxTQUFTLEdBQUcsS0FBSyxJQUFJLFFBQVEsQ0FBQztZQUNwQyxNQUFNLE1BQU0sR0FBRyxPQUFPLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDckQsQ0FBQyxDQUFDO1FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFrQyxFQUFVLEVBQUU7WUFDaEUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNwQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzdDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuRSxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUM7UUFDcEQsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDO1FBRWpELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQsTUFBTSw2QkFBNkIsR0FBRyxLQUFLLENBQUMsNkJBQTZCLElBQUksWUFBWSxDQUFDO1FBQzFGLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsU0FBUyxJQUFJLGVBQWUsQ0FBQztRQUN4RCxNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekUsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxrQkFBa0IsQ0FBQztRQUM1RCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLGlCQUFpQixDQUFDO1FBQ3pELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksTUFBTSxDQUFDO1FBQ2pGLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLElBQUksWUFBWSxDQUFDO1FBQzVELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLElBQUksU0FBUyxDQUFDO1FBQ3pELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixJQUFJLFNBQVMsQ0FBQztRQUNqRSxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxTQUFTLENBQUM7UUFDakUsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsbUJBQW1CLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxpQkFBaUIsQ0FBQztRQUM1RyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFDeEgsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDOUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU1QyxJQUFJLEdBQWEsQ0FBQztRQUNsQixJQUFJLGdCQUEwQixDQUFDO1FBQy9CLElBQUksZ0JBQTBCLENBQUM7UUFFL0IseUZBQXlGO1FBQ3pGLHNHQUFzRztRQUN0RyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEQsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXpFLElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUM1QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0oscUZBQXFGO2dCQUNyRixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUM7Z0JBRXpCLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3pCLHlDQUF5QztvQkFDekMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxDQUFDO2dCQUN4RSxDQUFDO2dCQUVELGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFNUQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsS0FBSyw2RkFBNkYsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDM0ksQ0FBQztZQUNMLENBQUM7WUFDRCxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN0QyxDQUFDO2FBQU0sQ0FBQztZQUNOLGtGQUFrRjtZQUNsRixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtnQkFDMUQsSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTthQUMzQixDQUFDLENBQUM7WUFFSCwwR0FBMEc7WUFDMUcsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFO2dCQUNoRixJQUFJLEVBQUUsb0JBQW9CO2dCQUMxQixPQUFPLEVBQUUsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2FBQ3ZHLENBQUMsQ0FBQztZQUNILCtHQUErRztZQUMvRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO2dCQUMvQyxLQUFLLEVBQUUsVUFBVSxDQUFDLGFBQWE7Z0JBQy9CLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFO2dCQUNsQyxnQkFBZ0IsRUFBRSxxQkFBcUIsQ0FBQyxXQUFXO2FBQ3BELENBQUMsQ0FBQztZQUNILGdCQUFnQixHQUFHLEtBQUssQ0FBQyxjQUFjLElBQUkscUJBQXFCLENBQUMsV0FBVyxDQUFDO1lBQzdFLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3RDLENBQUM7UUFFRCxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSx5QkFBeUIsRUFBRTtZQUN4RixnQkFBZ0IsRUFBRSw2Q0FBNkM7WUFDL0QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ2hCLG1CQUFtQixFQUFFO2dCQUNuQjtvQkFDRSxVQUFVLEVBQUUsS0FBSztvQkFDakIsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLE1BQU0sRUFBRSxhQUFhO29CQUNyQixNQUFNLEVBQUUsV0FBVztpQkFDcEI7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUVqRixNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtZQUNsRixnQkFBZ0IsRUFBRSxtREFBbUQ7WUFDckUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ2hCLG9CQUFvQixFQUFFO2dCQUNwQjtvQkFDRSxVQUFVLEVBQUUsS0FBSztvQkFDakIsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLE1BQU0sRUFBRSxhQUFhO29CQUNyQixNQUFNLEVBQUUsV0FBVztpQkFDcEI7YUFDRjtZQUNELG1CQUFtQixFQUFFO2dCQUNuQjtvQkFDRSxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxFQUFFLEtBQUs7b0JBQ2IsTUFBTSxFQUFFLFdBQVc7aUJBQ3BCO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFDSCxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDNUQsWUFBWSxFQUFFLG1CQUFtQjtZQUNqQyxlQUFlLEVBQUUsRUFBRTtTQUNwQixDQUFDLENBQUM7UUFDSCxXQUFXLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRXJFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQzFELFdBQVcsRUFBRSxjQUFjO1lBQzNCLGlCQUFpQixFQUFFLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQztZQUM5QywrQkFBK0IsRUFBRTtnQkFDL0I7b0JBQ0UsZ0JBQWdCLEVBQUUsY0FBYztvQkFDaEMsTUFBTSxFQUFFLENBQUM7aUJBQ1Y7Z0JBQ0Q7b0JBQ0UsZ0JBQWdCLEVBQUUsU0FBUztvQkFDM0IsTUFBTSxFQUFFLENBQUM7aUJBQ1Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFckUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFO1lBQ2pGLGNBQWMsRUFBRSxjQUFjO1lBQzlCLGtCQUFrQixFQUFFLFNBQVM7WUFDN0IsdUJBQXVCLEVBQUU7Z0JBQ3ZCLGNBQWMsRUFBRSxRQUFRO2FBQ3pCO1lBQ0QsZUFBZSxFQUFFO2dCQUNmLG1CQUFtQixFQUNqQixtVUFBbVU7YUFDdFU7U0FDRixDQUFDLENBQUM7UUFDSCxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFL0UsTUFBTSxXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDL0QsSUFBSSxFQUFFLGNBQWM7WUFDcEIsWUFBWSxFQUFFLE1BQU07U0FDckIsQ0FBQyxDQUFDO1FBQ0gsV0FBVyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUVyRSxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUNuRSxTQUFTLEVBQUUsTUFBTTtZQUNqQixLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUc7WUFDdEIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUV0RSxNQUFNLGFBQWEsR0FBRyxlQUFlO1lBQ25DLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRTtnQkFDcEQsVUFBVSxFQUFFLG1CQUFtQjtnQkFDL0Isd0JBQXdCLEVBQUU7b0JBQ3hCO3dCQUNFLGNBQWMsRUFBRSxjQUFlO3dCQUMvQixZQUFZLEVBQUUsVUFBVTt3QkFDeEIsY0FBYyxFQUFFLFNBQVM7cUJBQzFCO2lCQUNGO2FBQ0YsQ0FBQztZQUNKLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLGFBQWEsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDekUsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUNkLGVBQWUsSUFBSSxhQUFhO1lBQzlCLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtnQkFDakQsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHO2dCQUN0QixVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUc7Z0JBQzdCLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDdkIsYUFBYSxFQUFFLFVBQVU7YUFDMUIsQ0FBQztZQUNKLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLFVBQVUsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDdEUsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUNuQixlQUFlLElBQUksYUFBYSxJQUFJLGFBQWE7WUFDL0MsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7Z0JBQ2hELFlBQVk7Z0JBQ1osSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsV0FBVyxFQUFFO29CQUNYLE9BQU8sRUFBRSxhQUFhLENBQUMsc0JBQXNCO29CQUM3QyxZQUFZLEVBQUUsYUFBYSxDQUFDLHdCQUF3QjtpQkFDckQ7YUFDRixDQUFDO1lBQ0osQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoQixJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLGVBQWUsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDM0UsQ0FBQztRQUNELElBQUksVUFBVSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2hDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDeEMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxlQUFlLElBQUksYUFBYSxFQUFFLENBQUM7WUFDckMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsZUFBZTtZQUM3QixDQUFDLENBQUMsV0FBVyxtQkFBbUIsd0JBQXdCO1lBQ3hELENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFFM0YsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUM3RixJQUFJLEVBQUUsNkJBQTZCO1lBQ25DLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSztZQUNkLFdBQVcsRUFBRSw2QkFBNkI7U0FDM0MsQ0FBQyxDQUFDO1FBQ0gsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRTFFLE1BQU0sVUFBVSxHQUFHLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ2pFLElBQUksRUFBRSxzQkFBc0I7WUFDNUIsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixnQkFBZ0IsRUFBRSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQztTQUNoRCxDQUFDLENBQUM7UUFDSCxVQUFVLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRXBFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ3JGLElBQUksRUFBRSxjQUFjO1lBQ3BCLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHO1lBQ2pDLFNBQVMsRUFBRTtnQkFDVCxhQUFhLEVBQUUsVUFBVTtnQkFDekIsVUFBVSxFQUFFO29CQUNWO3dCQUNFLEdBQUcsRUFBRSxtQkFBbUI7d0JBQ3hCLElBQUksRUFBRSxLQUFLO3FCQUNaO2lCQUNGO2FBQ0Y7WUFDRCx1QkFBdUIsRUFBRTtnQkFDdkIsZ0JBQWdCLEVBQUUsQ0FBQzthQUNwQjtTQUNGLENBQUMsQ0FBQztRQUNILGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUU1RSxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDbkUsd0JBQXdCLEVBQUU7Z0JBQ3hCLE9BQU8sRUFBRSxZQUFZO2dCQUNyQixTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsTUFBTSxFQUFFLE9BQU87d0JBQ2YsU0FBUyxFQUFFOzRCQUNULE9BQU8sRUFBRSx5QkFBeUI7eUJBQ25DO3dCQUNELE1BQU0sRUFBRSxnQkFBZ0I7cUJBQ3pCO2lCQUNGO2FBQ0Y7WUFDRCxpQkFBaUIsRUFBRSxDQUFDLHVFQUF1RSxDQUFDO1lBQzVGLFFBQVEsRUFBRTtnQkFDUjtvQkFDRSxVQUFVLEVBQUUsOEJBQThCO29CQUMxQyxjQUFjLEVBQUU7d0JBQ2QsT0FBTyxFQUFFLFlBQVk7d0JBQ3JCLFNBQVMsRUFBRTs0QkFDVDtnQ0FDRSxNQUFNLEVBQUUsT0FBTztnQ0FDZixNQUFNLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSx5QkFBeUIsRUFBRSxhQUFhLENBQUM7Z0NBQzNGLFFBQVEsRUFBRTtvQ0FDUixlQUFlLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sYUFBYSxTQUFTLEdBQUc7b0NBQ25FLGVBQWUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxRQUFRO2lDQUNuRDs2QkFDRjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRTNFLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ2pELHdCQUF3QixFQUFFO2dCQUN4QixPQUFPLEVBQUUsWUFBWTtnQkFDckIsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE1BQU0sRUFBRSxPQUFPO3dCQUNmLFNBQVMsRUFBRTs0QkFDVCxPQUFPLEVBQUUseUJBQXlCO3lCQUNuQzt3QkFDRCxNQUFNLEVBQUUsZ0JBQWdCO3FCQUN6QjtpQkFDRjthQUNGO1lBQ0QsUUFBUSxFQUFFO2dCQUNSO29CQUNFLFVBQVUsRUFBRSxzQkFBc0I7b0JBQ2xDLGNBQWMsRUFBRTt3QkFDZCxPQUFPLEVBQUUsWUFBWTt3QkFDckIsU0FBUyxFQUFFOzRCQUNUO2dDQUNFLE1BQU0sRUFBRSxPQUFPO2dDQUNmLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLHlCQUF5QixFQUFFLGFBQWEsQ0FBQztnQ0FDM0YsUUFBUSxFQUFFO29DQUNSLGVBQWUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxhQUFhLFNBQVMsR0FBRztvQ0FDbkUsZUFBZSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLFFBQVE7aUNBQ25EOzZCQUNGO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRWxFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQzdFLE1BQU0sRUFBRSxjQUFjO1lBQ3RCLEdBQUcsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFO1lBQzVCLE1BQU0sRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQ2xDLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLHVCQUF1QixFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3BDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLE9BQU87WUFDM0MsV0FBVyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1lBQzdCLG9CQUFvQixFQUFFO2dCQUNwQjtvQkFDRSxJQUFJLEVBQUUsY0FBYztvQkFDcEIsS0FBSyxFQUFFLEdBQUcscUJBQXFCLENBQUMsaUJBQWlCLFNBQVM7b0JBQzFELFlBQVksRUFBRTt3QkFDWjs0QkFDRSxhQUFhO3lCQUNkO3FCQUNGO29CQUNELGdCQUFnQixFQUFFO3dCQUNoQixTQUFTLEVBQUUsU0FBUzt3QkFDcEIsT0FBTyxFQUFFOzRCQUNQLGVBQWUsRUFBRSxXQUFXLENBQUMsR0FBRzs0QkFDaEMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU07NEJBQzdCLHVCQUF1QixFQUFFLGNBQWM7eUJBQ3hDO3FCQUNGO29CQUNELFdBQVcsRUFBRTt3QkFDWDs0QkFDRSxJQUFJLEVBQUUsbUJBQW1COzRCQUN6QixLQUFLLEVBQUUsU0FBUzt5QkFDakI7d0JBQ0Q7NEJBQ0UsSUFBSSxFQUFFLE1BQU07NEJBQ1osS0FBSyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUU7eUJBQ2hDO3dCQUNEOzRCQUNFLElBQUksRUFBRSxVQUFVOzRCQUNoQixLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRTt5QkFDMUI7d0JBQ0Q7NEJBQ0UsSUFBSSxFQUFFLFVBQVU7NEJBQ2hCLEtBQUssRUFBRSxjQUFjO3lCQUN0QjtxQkFDRjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsSUFBSSxFQUFFLGtCQUFrQjs0QkFDeEIsU0FBUyxFQUFFLGVBQWUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxhQUFhLFNBQVMsdUJBQXVCO3lCQUNuRzt3QkFDRDs0QkFDRSxJQUFJLEVBQUUsc0JBQXNCOzRCQUM1QixTQUFTLEVBQUUsZUFBZSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLGFBQWEsU0FBUywrQkFBK0I7eUJBQzNHO3dCQUNEOzRCQUNFLElBQUksRUFBRSxnQkFBZ0I7NEJBQ3RCLFNBQVMsRUFBRSxlQUFlLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sYUFBYSxTQUFTLHlCQUF5Qjt5QkFDckc7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUUzRSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUNyQyxXQUFXLEVBQUUsY0FBYztZQUMzQixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7WUFDeEIsY0FBYyxFQUFFLGlCQUFpQixDQUFDLEdBQUc7WUFDckMsWUFBWTtZQUNaLHdCQUF3QixFQUFFO2dCQUN4QjtvQkFDRSxnQkFBZ0IsRUFBRSxjQUFjO29CQUNoQyxNQUFNLEVBQUUsQ0FBQztpQkFDVjtnQkFDRDtvQkFDRSxnQkFBZ0IsRUFBRSxTQUFTO29CQUMzQixNQUFNLEVBQUUsQ0FBQztpQkFDVjthQUNGO1lBQ0QsdUJBQXVCLEVBQUU7Z0JBQ3ZCLGNBQWMsRUFBRSxHQUFHO2dCQUNuQixxQkFBcUIsRUFBRSxFQUFFO2FBQzFCO1lBQ0Qsb0JBQW9CLEVBQUU7Z0JBQ3BCLG1CQUFtQixFQUFFO29CQUNuQixjQUFjLEVBQUUsVUFBVTtvQkFDMUIsT0FBTyxFQUFFLGdCQUFnQjtvQkFDekIsY0FBYyxFQUFFLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDO2lCQUMzQzthQUNGO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2pCO29CQUNFLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxPQUFPO29CQUN2QyxhQUFhLEVBQUUsY0FBYztvQkFDN0IsYUFBYSxFQUFFLGFBQWE7aUJBQzdCO2FBQ0Y7WUFDRCxlQUFlLEVBQUUsUUFBUTtTQUMxQixDQUFDLENBQUM7UUFFSCxNQUFNLGVBQWUsR0FBRyxJQUFJLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQy9FLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRztZQUN0QixlQUFlLEVBQUUsWUFBWTtZQUM3QixpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxPQUFPO1lBQzFDLGNBQWMsRUFBRSxVQUFVO1lBQzFCLFlBQVksRUFBRSxVQUFVLENBQUMsR0FBRztZQUM1QixvQkFBb0IsRUFBRSxLQUFLO1NBQzVCLENBQUMsQ0FBQztRQUVILElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDbEQsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1lBQ3RCLFFBQVEsRUFBRSxtQkFBbUI7WUFDN0IsTUFBTSxFQUFFLGdCQUFnQixlQUFlLENBQUMsR0FBRyxFQUFFO1NBQzlDLENBQUMsQ0FBQztRQUVILElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUU7WUFDdkQsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1lBQ3RCLFFBQVEsRUFBRSw0QkFBNEI7WUFDdEMsTUFBTSxFQUFFLGdCQUFnQixlQUFlLENBQUMsR0FBRyxFQUFFO1NBQzlDLENBQUMsQ0FBQztRQUVILE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQzdELGFBQWEsRUFBRSxHQUFHLFNBQVMsZUFBZTtZQUMxQyxXQUFXLEVBQUUsT0FBTztZQUNwQixJQUFJLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNO1NBQy9CLENBQUMsQ0FBQztRQUNGLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBaUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFNUcsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQzNFLGFBQWEsRUFBRSxHQUFHLFNBQVMsdUJBQXVCO1lBQ2xELFdBQVcsRUFBRSxjQUFjO1lBQzNCLElBQUksRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU07U0FDL0IsQ0FBQyxDQUFDO1FBQ0YsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQWlDLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRW5ILE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRTtZQUNuRixhQUFhLEVBQUUsR0FBRyxTQUFTLCtCQUErQjtZQUMxRCxXQUFXLEVBQUUsa0JBQWtCO1lBQy9CLElBQUksRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU07U0FDL0IsQ0FBQyxDQUFDO1FBQ0YscUJBQXFCLENBQUMsSUFBSSxDQUFDLFlBQWlDLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRXZILE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ3ZELGFBQWEsRUFBRSxHQUFHLFNBQVMsV0FBVztZQUN0QyxXQUFXLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUNyQyxJQUFJLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNO1NBQy9CLENBQUMsQ0FBQztRQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBaUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFekcsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDakUsYUFBYSxFQUFFLEdBQUcsU0FBUyxlQUFlO1lBQzFDLFdBQVcsRUFBRSxjQUFjO1lBQzNCLElBQUksRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU07U0FDL0IsQ0FBQyxDQUFDO1FBQ0YsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFpQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUU5RyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDekUsYUFBYSxFQUFFLEdBQUcsU0FBUyx5QkFBeUI7WUFDcEQsV0FBVyxFQUFFLGtCQUFrQjtZQUMvQixJQUFJLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNO1NBQy9CLENBQUMsQ0FBQztRQUNGLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFpQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUVsSCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRTtZQUMzRCx3QkFBd0IsRUFBRTtnQkFDeEIsT0FBTyxFQUFFLFlBQVk7Z0JBQ3JCLFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxNQUFNLEVBQUUsT0FBTzt3QkFDZixTQUFTLEVBQUU7NEJBQ1QsT0FBTyxFQUFFLHlCQUF5Qjt5QkFDbkM7d0JBQ0QsTUFBTSxFQUFFLGdCQUFnQjtxQkFDekI7aUJBQ0Y7YUFDRjtZQUNELFFBQVEsRUFBRTtnQkFDUjtvQkFDRSxVQUFVLEVBQUUsV0FBVztvQkFDdkIsY0FBYyxFQUFFO3dCQUNkLE9BQU8sRUFBRSxZQUFZO3dCQUNyQixTQUFTLEVBQUU7NEJBQ1Q7Z0NBQ0UsTUFBTSxFQUFFLE9BQU87Z0NBQ2YsTUFBTSxFQUFFLENBQUMscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLENBQUM7Z0NBQzVFLFFBQVEsRUFBRSxHQUFHOzZCQUNkO3lCQUNGO3FCQUNGO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxTQUFTO29CQUNyQixjQUFjLEVBQUU7d0JBQ2QsT0FBTyxFQUFFLFlBQVk7d0JBQ3JCLFNBQVMsRUFBRTs0QkFDVDtnQ0FDRSxNQUFNLEVBQUUsT0FBTztnQ0FDZixNQUFNLEVBQUU7b0NBQ04sMkJBQTJCO29DQUMzQixpQ0FBaUM7b0NBQ2pDLHlCQUF5QjtvQ0FDekIsbUJBQW1CO29DQUNuQiwwQkFBMEI7b0NBQzFCLHlCQUF5QjtvQ0FDekIsY0FBYztvQ0FDZCxxQkFBcUI7aUNBQ3RCO2dDQUNELFFBQVEsRUFBRSxHQUFHOzZCQUNkO3lCQUNGO3FCQUNGO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxXQUFXO29CQUN2QixjQUFjLEVBQUU7d0JBQ2QsT0FBTyxFQUFFLFlBQVk7d0JBQ3JCLFNBQVMsRUFBRTs0QkFDVDtnQ0FDRSxNQUFNLEVBQUUsT0FBTztnQ0FDZixNQUFNLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsQ0FBQztnQ0FDN0UsUUFBUSxFQUFFLEdBQUc7NkJBQ2Q7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLGlCQUFpQjtvQkFDN0IsY0FBYyxFQUFFO3dCQUNkLE9BQU8sRUFBRSxZQUFZO3dCQUNyQixTQUFTLEVBQUU7NEJBQ1Q7Z0NBQ0UsTUFBTSxFQUFFLE9BQU87Z0NBQ2YsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLENBQUM7Z0NBQzVFLFFBQVEsRUFBRSxHQUFHOzZCQUNkO3lCQUNGO3FCQUNGO2lCQUNGO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxzQkFBc0I7b0JBQ2xDLGNBQWMsRUFBRTt3QkFDZCxPQUFPLEVBQUUsWUFBWTt3QkFDckIsU0FBUyxFQUFFOzRCQUNUO2dDQUNFLE1BQU0sRUFBRSxPQUFPO2dDQUNmLE1BQU0sRUFBRTtvQ0FDUiwrQkFBK0I7b0NBQy9CLG9DQUFvQztvQ0FDcEMsK0JBQStCO2lDQUM5QjtnQ0FDRCxRQUFRLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjs2QkFDbEM7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUNILGFBQWEsQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFFdkUsNkVBQTZFO1FBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvRixNQUFNLGdCQUFnQixHQUFHLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDdkUsV0FBVyxFQUFFLGNBQWM7WUFDM0IsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixXQUFXLEVBQUU7Z0JBQ1gsVUFBVSxFQUFFLFNBQVMsQ0FBQyxlQUFlLENBQUMsWUFBWTtnQkFDbEQsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSztnQkFDeEMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLG9CQUFvQixFQUFFO29CQUNwQixPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsaUJBQWlCLEVBQUU7b0JBQzNELFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFO29CQUN4QyxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO2lCQUN4QzthQUNGO1lBQ0QsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEdBQUcsQ0FBQztZQUNyRyxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLGFBQWEsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdkMsS0FBSyxFQUFFLElBQUk7WUFDWCxXQUFXLEVBQUUsMERBQTBEO1lBQ3ZFLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtZQUM3QixTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7Z0JBQ3hDLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE1BQU0sRUFBRTtvQkFDTixTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUU7NEJBQ3JCLDBCQUEwQjs0QkFDMUIsaUhBQWlIOzRCQUNqSCx3REFBd0Q7eUJBQ3pELEVBQUM7b0JBQ0YsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFOzRCQUNqQiwwQkFBMEI7NEJBQzFCLDBEQUEwRDt5QkFDM0QsRUFBRTtvQkFDSCxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUU7NEJBQ3RCLDZCQUE2Qjs0QkFDN0IsaUNBQWlDOzRCQUNqQywrRkFBK0Y7eUJBQ2hHLEVBQUM7aUJBQ0g7Z0JBQ0QsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtnQkFDeEIsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTthQUN2QixDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBQ0YsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQXFDLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRXRILElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUNuQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQzlDLEdBQUcsRUFBRSxhQUFhO1lBQ2xCLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRTtTQUNuQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDO1FBQzdELElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7WUFDaEQsR0FBRyxFQUFFLGVBQWU7WUFDcEIsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO1NBQ3JDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUU7WUFDL0MsR0FBRyxFQUFFLGNBQWM7WUFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZO1NBQ3pCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFDckQsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSw2QkFBNkIsRUFBRTtZQUNyRCxHQUFHLEVBQUUsb0JBQW9CO1lBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFO1NBQzFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXpwQkQsa0RBeXBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XHJcbmltcG9ydCAqIGFzIGFwaWdhdGV3YXl2MiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyJztcclxuaW1wb3J0ICogYXMgY29kZWJ1aWxkIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xyXG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XHJcbmltcG9ydCAqIGFzIGVjciBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcclxuaW1wb3J0ICogYXMgZWNzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3MnO1xyXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XHJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xyXG5pbXBvcnQgKiBhcyByb3V0ZTUzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzJztcclxuaW1wb3J0ICogYXMgc2VydmljZWRpc2NvdmVyeSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VydmljZWRpc2NvdmVyeSc7XHJcbmltcG9ydCAqIGFzIHNzbSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3NtJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR21haWxWaWV3ZXJDZGtTdGFja1Byb3BzIGV4dGVuZHMgY2RrLlN0YWNrUHJvcHMge1xyXG4gIHJlYWRvbmx5IHZwY0lkPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IHByaXZhdGVTdWJuZXRzPzogc3RyaW5nW107XHJcbiAgcmVhZG9ubHkgY29udGFpbmVyUG9ydD86IG51bWJlciB8IHN0cmluZztcclxuICByZWFkb25seSBjb250YWluZXJDcHU/OiBudW1iZXIgfCBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgY29udGFpbmVyTWVtb3J5PzogbnVtYmVyIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGRlc2lyZWRDb3VudD86IG51bWJlciB8IHN0cmluZztcclxuICByZWFkb25seSBjZXJ0aWZpY2F0ZUFybj86IHN0cmluZztcclxuICByZWFkb25seSBhcGlDdXN0b21Eb21haW5OYW1lPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVJZD86IHN0cmluZztcclxuICByZWFkb25seSBzZXJ2aWNlRGlzY292ZXJ5TmFtZXNwYWNlTmFtZT86IHN0cmluZztcclxuICByZWFkb25seSBzZXJ2aWNlRGlzY292ZXJ5VHRsPzogbnVtYmVyIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IHNzbVByZWZpeD86IHN0cmluZztcclxuICByZWFkb25seSBnaXRIdWJPd25lcj86IHN0cmluZztcclxuICByZWFkb25seSBnaXRIdWJSZXBvPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGdpdEh1YkJyYW5jaD86IHN0cmluZztcclxuICByZWFkb25seSBwdWJsaWNFbnZWYWx1ZT86IHN0cmluZztcclxuICByZWFkb25seSBnb29nbGVDbGllbnRJZD86IHN0cmluZztcclxuICByZWFkb25seSBnb29nbGVDbGllbnRTZWNyZXQ/OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgc2Vzc2lvblNlY3JldFZhbHVlPzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IHVzZUdpdEh1YldlYmhvb2tzPzogYm9vbGVhbjtcclxuICByZWFkb25seSBjb2RlQ29ubmVjdGlvbkFybj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdtYWlsVmlld2VyQ2RrU3RhY2sgZXh0ZW5kcyBjZGsuU3RhY2sge1xyXG4gIHB1YmxpYyByZWFkb25seSBjbHVzdGVyTmFtZTogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSByZXBvc2l0b3J5VXJpOiBzdHJpbmc7XHJcbiAgcHVibGljIHJlYWRvbmx5IGFwaUludm9rZVVybDogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBjbG91ZE1hcFNlcnZpY2VBcm46IHN0cmluZztcclxuXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBjZGsuQXBwLCBpZDogc3RyaW5nLCBwcm9wczogR21haWxWaWV3ZXJDZGtTdGFja1Byb3BzKSB7XHJcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcclxuXHJcbiAgICBjb25zdCB0b051bWJlciA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWUgPz8gZmFsbGJhY2s7XHJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHR5cGVvZiBjYW5kaWRhdGUgPT09ICdudW1iZXInID8gY2FuZGlkYXRlIDogTnVtYmVyKGNhbmRpZGF0ZSk7XHJcbiAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IGZhbGxiYWNrO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB0b0NwdVVuaXRzID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgPT4ge1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSB0b051bWJlcih2YWx1ZSwgMC41KTtcclxuICAgICAgY29uc3QgdmNwdSA9IHBhcnNlZCA8PSA0ID8gcGFyc2VkICogMTAyNCA6IHBhcnNlZDtcclxuICAgICAgY29uc3Qgcm91bmRlZCA9IE1hdGgucm91bmQodmNwdSAvIDI1NikgKiAyNTY7XHJcbiAgICAgIHJldHVybiBNYXRoLm1heCgyNTYsIHJvdW5kZWQpO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCByZXBvUGFydHMgPSAocHJvY2Vzcy5lbnYuR0lUSFVCX1JFUE9TSVRPUlkgPz8gJycpLnNwbGl0KCcvJyk7XHJcbiAgICBjb25zdCBndWVzc2VkR2l0SHViT3duZXIgPSByZXBvUGFydHNbMF0gfHwgJ2R5YW5ldCc7XHJcbiAgICBjb25zdCBndWVzc2VkR2l0SHViUmVwbyA9IHJlcG9QYXJ0c1sxXSB8fCAnaW1hcCc7XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyUG9ydCA9IHRvTnVtYmVyKHByb3BzLmNvbnRhaW5lclBvcnQsIDMwMDApO1xyXG4gICAgY29uc3QgY29udGFpbmVyQ3B1ID0gdG9DcHVVbml0cyhwcm9wcy5jb250YWluZXJDcHUpO1xyXG4gICAgY29uc3QgY29udGFpbmVyTWVtb3J5ID0gdG9OdW1iZXIocHJvcHMuY29udGFpbmVyTWVtb3J5LCAxMDI0KTtcclxuICAgIGNvbnN0IGRlc2lyZWRDb3VudCA9IHRvTnVtYmVyKHByb3BzLmRlc2lyZWRDb3VudCwgMSk7XHJcbiAgICBjb25zdCBzZXJ2aWNlRGlzY292ZXJ5TmFtZXNwYWNlTmFtZSA9IHByb3BzLnNlcnZpY2VEaXNjb3ZlcnlOYW1lc3BhY2VOYW1lID8/ICdtYWlsLmxvY2FsJztcclxuICAgIGNvbnN0IHNlcnZpY2VEaXNjb3ZlcnlUdGwgPSB0b051bWJlcihwcm9wcy5zZXJ2aWNlRGlzY292ZXJ5VHRsLCA2MCk7XHJcbiAgICBjb25zdCBzc21QcmVmaXhSYXcgPSBwcm9wcy5zc21QcmVmaXggPz8gJy9tYWlsLWV4YW1wbGUnO1xyXG4gICAgY29uc3Qgc3NtUHJlZml4ID0gJy8nICsgc3NtUHJlZml4UmF3LnNwbGl0KCcvJykuZmlsdGVyKHAgPT4gcCkuam9pbignLycpO1xyXG4gICAgY29uc3QgZ2l0SHViT3duZXIgPSBwcm9wcy5naXRIdWJPd25lciA/PyBndWVzc2VkR2l0SHViT3duZXI7XHJcbiAgICBjb25zdCBnaXRIdWJSZXBvID0gcHJvcHMuZ2l0SHViUmVwbyA/PyBndWVzc2VkR2l0SHViUmVwbztcclxuICAgIGNvbnN0IGdpdEh1YkJyYW5jaCA9IHByb3BzLmdpdEh1YkJyYW5jaCA/PyBwcm9jZXNzLmVudi5HSVRIVUJfUkVGX05BTUUgPz8gJ21haW4nO1xyXG4gICAgY29uc3QgcHVibGljRW52VmFsdWUgPSBwcm9wcy5wdWJsaWNFbnZWYWx1ZSA/PyAncHJvZHVjdGlvbic7XHJcbiAgICBjb25zdCBnb29nbGVDbGllbnRJZCA9IHByb3BzLmdvb2dsZUNsaWVudElkIHx8ICdub3Qtc2V0JztcclxuICAgIGNvbnN0IGdvb2dsZUNsaWVudFNlY3JldCA9IHByb3BzLmdvb2dsZUNsaWVudFNlY3JldCA/PyAnbm90LXNldCc7XHJcbiAgICBjb25zdCBzZXNzaW9uU2VjcmV0VmFsdWUgPSBwcm9wcy5zZXNzaW9uU2VjcmV0VmFsdWUgPz8gJ25vdC1zZXQnO1xyXG4gICAgY29uc3QgYXBpQ3VzdG9tRG9tYWluTmFtZSA9IHByb3BzLmFwaUN1c3RvbURvbWFpbk5hbWUgPz8gcHJvY2Vzcy5lbnYuQVBJX0NVU1RPTV9ET01BSU4gPz8gJ21haWwuZHlhbmV0LmNvbSc7XHJcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZUFybiA9IHByb3BzLmNlcnRpZmljYXRlQXJuID8/IHRoaXMubm9kZS50cnlHZXRDb250ZXh0KCdjZXJ0aWZpY2F0ZUFybicpID8/IHByb2Nlc3MuZW52LkNFUlRJRklDQVRFX0FSTjtcclxuICAgIGNvbnN0IGhvc3RlZFpvbmVJZCA9IHByb3BzLmhvc3RlZFpvbmVJZCA/PyAnJztcclxuICAgIGNvbnN0IGhhc0N1c3RvbURvbWFpbiA9IEJvb2xlYW4oY2VydGlmaWNhdGVBcm4gJiYgYXBpQ3VzdG9tRG9tYWluTmFtZSk7XHJcbiAgICBjb25zdCBoYXNIb3N0ZWRab25lID0gQm9vbGVhbihob3N0ZWRab25lSWQpO1xyXG5cclxuICAgIGxldCB2cGM6IGVjMi5JVnBjO1xyXG4gICAgbGV0IHByaXZhdGVTdWJuZXRJZHM6IHN0cmluZ1tdO1xyXG4gICAgbGV0IHNlcnZpY2VTdWJuZXRJZHM6IHN0cmluZ1tdO1xyXG5cclxuICAgIC8vIElmIGFjY291bnQvcmVnaW9uIGFyZSBhdmFpbGFibGUsIHVzZSBWcGMuZnJvbUxvb2t1cCB0byBhdXRvbWF0aWNhbGx5IGRpc2NvdmVyIHN1Ym5ldHMuXHJcbiAgICAvLyBPdGhlcndpc2UgZmFsbCBiYWNrIHRvIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnMgd2hpY2ggbGV0IHRoZSBkZXBsb3llciBwaWNrIHZhbHVlcyBpbiB0aGUgY29uc29sZS5cclxuICAgIGNvbnN0IHVzZVZwY1BhcmFtZXRlciA9IHRoaXMubm9kZS50cnlHZXRDb250ZXh0KCd1c2VWcGNQYXJhbWV0ZXInKTtcclxuXHJcbiAgICBpZiAoIXVzZVZwY1BhcmFtZXRlciAmJiB0aGlzLmFjY291bnQgJiYgdGhpcy5yZWdpb24pIHtcclxuICAgICAgdnBjID0gZWMyLlZwYy5mcm9tTG9va3VwKHRoaXMsICdNYWlsVnBjJywgeyB0YWdzOiB7IE5hbWU6ICdkeWEtdnBjJyB9IH0pO1xyXG4gICAgICBcclxuICAgICAgaWYgKHByb3BzLnByaXZhdGVTdWJuZXRzICYmIHByb3BzLnByaXZhdGVTdWJuZXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHByaXZhdGVTdWJuZXRJZHMgPSBwcm9wcy5wcml2YXRlU3VibmV0cztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIFRoZSBzZXJ2aWNlIGxpbmtlZCB0byB0aGUgVlBDIExpbmsgbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gYWxsIEF2YWlsYWJpbGl0eSBab25lcy5cclxuICAgICAgICAgIGNvbnN0IGJhZEF6ID0gJ2NhYzEtYXo0JztcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgbGV0IHN1Ym5ldHMgPSB2cGMucHJpdmF0ZVN1Ym5ldHMuZmlsdGVyKHMgPT4gcy5hdmFpbGFiaWxpdHlab25lICE9PSBiYWRBeik7XHJcbiAgICAgICAgICBpZiAoc3VibmV0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgLy8gTm8gcHJpdmF0ZSBzdWJuZXRzLCB0cnkgcHVibGljIHN1Ym5ldHNcclxuICAgICAgICAgICAgc3VibmV0cyA9IHZwYy5wdWJsaWNTdWJuZXRzLmZpbHRlcihzID0+IHMuYXZhaWxhYmlsaXR5Wm9uZSAhPT0gYmFkQXopO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHByaXZhdGVTdWJuZXRJZHMgPSBzdWJuZXRzLnNsaWNlKDAsIDIpLm1hcChzID0+IHMuc3VibmV0SWQpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBpZiAocHJpdmF0ZVN1Ym5ldElkcy5sZW5ndGggPCAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVlBDICcke3ZwYy52cGNJZH0nIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcHJpdmF0ZSBvciBwdWJsaWMgc3VibmV0IGluIGFuIGFsbG93ZWQgYXZhaWxhYmlsaXR5IHpvbmUgKG5vdCBpbiAke2JhZEF6fSkuYCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgc2VydmljZVN1Ym5ldElkcyA9IHByaXZhdGVTdWJuZXRJZHM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBDbG91ZEZvcm1hdGlvbiBwYXJhbWV0ZXIgZm9yIFZQQyBzZWxlY3Rpb24gKGRyb3Bkb3duIG9mIFZQQyBJRHMgaW4gdGhlIGNvbnNvbGUpXHJcbiAgICAgIGNvbnN0IHZwY0lkUGFyYW0gPSBuZXcgY2RrLkNmblBhcmFtZXRlcih0aGlzLCAnVnBjSWRQYXJhbScsIHtcclxuICAgICAgICB0eXBlOiAnQVdTOjpFQzI6OlZQQzo6SWQnLFxyXG4gICAgICAgIGRlZmF1bHQ6IHByb3BzLnZwY0lkID8/ICcnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIE9wdGlvbmFsIHBhcmFtZXRlciBmb3IgcHJpdmF0ZSBzdWJuZXQgSURzIChDb21tYURlbGltaXRlZExpc3QpIHdoZW4gc3ludGhlc2l6aW5nIHdpdGhvdXQgYWNjb3VudC9yZWdpb25cclxuICAgICAgY29uc3QgcHJpdmF0ZVN1Ym5ldElkc1BhcmFtID0gbmV3IGNkay5DZm5QYXJhbWV0ZXIodGhpcywgJ1ByaXZhdGVTdWJuZXRJZHNQYXJhbScsIHtcclxuICAgICAgICB0eXBlOiAnQ29tbWFEZWxpbWl0ZWRMaXN0JyxcclxuICAgICAgICBkZWZhdWx0OiBwcm9wcy5wcml2YXRlU3VibmV0cyAmJiBwcm9wcy5wcml2YXRlU3VibmV0cy5sZW5ndGggPiAwID8gcHJvcHMucHJpdmF0ZVN1Ym5ldHMuam9pbignLCcpIDogJycsXHJcbiAgICAgIH0pO1xyXG4gICAgICAvLyBVc2UgdGhlIHByb3ZpZGVkIHBhcmFtZXRlciB2YWx1ZXMgKGRlcGxveWVyIG11c3Qgc3VwcGx5IHByaXZhdGUgc3VibmV0IGlkcyB3aGVuIHN5bnRoZXNpemluZyB3aXRob3V0IGxvb2t1cClcclxuICAgICAgdnBjID0gZWMyLlZwYy5mcm9tVnBjQXR0cmlidXRlcyh0aGlzLCAnTWFpbFZwYycsIHtcclxuICAgICAgICB2cGNJZDogdnBjSWRQYXJhbS52YWx1ZUFzU3RyaW5nLFxyXG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmVzOiBjZGsuRm4uZ2V0QXpzKCksXHJcbiAgICAgICAgcHJpdmF0ZVN1Ym5ldElkczogcHJpdmF0ZVN1Ym5ldElkc1BhcmFtLnZhbHVlQXNMaXN0LFxyXG4gICAgICB9KTtcclxuICAgICAgcHJpdmF0ZVN1Ym5ldElkcyA9IHByb3BzLnByaXZhdGVTdWJuZXRzID8/IHByaXZhdGVTdWJuZXRJZHNQYXJhbS52YWx1ZUFzTGlzdDtcclxuICAgICAgc2VydmljZVN1Ym5ldElkcyA9IHByaXZhdGVTdWJuZXRJZHM7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYXBpVnBjTGlua1NlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLkNmblNlY3VyaXR5R3JvdXAodGhpcywgJ0FwaVZwY0xpbmtTZWN1cml0eUdyb3VwJywge1xyXG4gICAgICBncm91cERlc2NyaXB0aW9uOiAnRWdyZXNzIGZyb20gQVBJIEdhdGV3YXkgVlBDIExpbmsgdG8gc2VydmljZScsXHJcbiAgICAgIHZwY0lkOiB2cGMudnBjSWQsXHJcbiAgICAgIHNlY3VyaXR5R3JvdXBFZ3Jlc3M6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpcFByb3RvY29sOiAndGNwJyxcclxuICAgICAgICAgIGZyb21Qb3J0OiBjb250YWluZXJQb3J0LFxyXG4gICAgICAgICAgdG9Qb3J0OiBjb250YWluZXJQb3J0LFxyXG4gICAgICAgICAgY2lkcklwOiAnMC4wLjAuMC8wJyxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcbiAgICBhcGlWcGNMaW5rU2VjdXJpdHlHcm91cC5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICBjb25zdCBzZXJ2aWNlU2VjdXJpdHlHcm91cCA9IG5ldyBlYzIuQ2ZuU2VjdXJpdHlHcm91cCh0aGlzLCAnU2VydmljZVNlY3VyaXR5R3JvdXAnLCB7XHJcbiAgICAgIGdyb3VwRGVzY3JpcHRpb246ICdBbGxvdyBBUEkgR2F0ZXdheSBWUEMgTGluayB0byByZWFjaCBGYXJnYXRlIHRhc2tzJyxcclxuICAgICAgdnBjSWQ6IHZwYy52cGNJZCxcclxuICAgICAgc2VjdXJpdHlHcm91cEluZ3Jlc3M6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpcFByb3RvY29sOiAndGNwJyxcclxuICAgICAgICAgIGZyb21Qb3J0OiBjb250YWluZXJQb3J0LFxyXG4gICAgICAgICAgdG9Qb3J0OiBjb250YWluZXJQb3J0LFxyXG4gICAgICAgICAgY2lkcklwOiAnMC4wLjAuMC8wJyxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgICBzZWN1cml0eUdyb3VwRWdyZXNzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaXBQcm90b2NvbDogJy0xJyxcclxuICAgICAgICAgIGZyb21Qb3J0OiAwLFxyXG4gICAgICAgICAgdG9Qb3J0OiA2NTUzNSxcclxuICAgICAgICAgIGNpZHJJcDogJzAuMC4wLjAvMCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG4gICAgc2VydmljZVNlY3VyaXR5R3JvdXAuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcblxyXG4gICAgY29uc3QgYXBwTG9nR3JvdXAgPSBuZXcgbG9ncy5DZm5Mb2dHcm91cCh0aGlzLCAnQXBwTG9nR3JvdXAnLCB7XHJcbiAgICAgIGxvZ0dyb3VwTmFtZTogJy9lY3MvbWFpbC1leGFtcGxlJyxcclxuICAgICAgcmV0ZW50aW9uSW5EYXlzOiAzMCxcclxuICAgIH0pO1xyXG4gICAgYXBwTG9nR3JvdXAuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcblxyXG4gICAgY29uc3QgbWFpbENsdXN0ZXIgPSBuZXcgZWNzLkNmbkNsdXN0ZXIodGhpcywgJ01haWxDbHVzdGVyJywge1xyXG4gICAgICBjbHVzdGVyTmFtZTogJ21haWwtY2x1c3RlcicsXHJcbiAgICAgIGNhcGFjaXR5UHJvdmlkZXJzOiBbJ0ZBUkdBVEUnLCAnRkFSR0FURV9TUE9UJ10sXHJcbiAgICAgIGRlZmF1bHRDYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3k6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjYXBhY2l0eVByb3ZpZGVyOiAnRkFSR0FURV9TUE9UJyxcclxuICAgICAgICAgIHdlaWdodDogNCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNhcGFjaXR5UHJvdmlkZXI6ICdGQVJHQVRFJyxcclxuICAgICAgICAgIHdlaWdodDogMSxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcbiAgICBtYWlsQ2x1c3Rlci5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICBjb25zdCBtYWlsRXhhbXBsZVJlcG9zaXRvcnkgPSBuZXcgZWNyLkNmblJlcG9zaXRvcnkodGhpcywgJ01haWxFeGFtcGxlUmVwb3NpdG9yeScsIHtcclxuICAgICAgcmVwb3NpdG9yeU5hbWU6ICdtYWlsLWV4YW1wbGUnLFxyXG4gICAgICBpbWFnZVRhZ011dGFiaWxpdHk6ICdNVVRBQkxFJyxcclxuICAgICAgZW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IHtcclxuICAgICAgICBlbmNyeXB0aW9uVHlwZTogJ0FFUzI1NicsXHJcbiAgICAgIH0sXHJcbiAgICAgIGxpZmVjeWNsZVBvbGljeToge1xyXG4gICAgICAgIGxpZmVjeWNsZVBvbGljeVRleHQ6XHJcbiAgICAgICAgICAne1xcbiAgXCJydWxlc1wiOiBbXFxuICAgIHtcXG4gICAgICBcInJ1bGVQcmlvcml0eVwiOiAxLFxcbiAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJFeHBpcmUgaW1hZ2VzIG9sZGVyIHRoYW4gMzAgZGF5c1wiLFxcbiAgICAgIFwic2VsZWN0aW9uXCI6IHtcXG4gICAgICAgIFwidGFnU3RhdHVzXCI6IFwiYW55XCIsXFxuICAgICAgICBcImNvdW50VHlwZVwiOiBcInNpbmNlSW1hZ2VQdXNoZWRcIixcXG4gICAgICAgIFwiY291bnRVbml0XCI6IFwiZGF5c1wiLFxcbiAgICAgICAgXCJjb3VudE51bWJlclwiOiAzMFxcbiAgICAgIH0sXFxuICAgICAgXCJhY3Rpb25cIjogeyBcInR5cGVcIjogXCJleHBpcmVcIiB9XFxuICAgIH1cXG4gIF1cXG59XFxuJyxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gICAgbWFpbEV4YW1wbGVSZXBvc2l0b3J5LmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IG1haWxIdHRwQXBpID0gbmV3IGFwaWdhdGV3YXl2Mi5DZm5BcGkodGhpcywgJ01haWxIdHRwQXBpJywge1xyXG4gICAgICBuYW1lOiAnbWFpbC1leGFtcGxlJyxcclxuICAgICAgcHJvdG9jb2xUeXBlOiAnSFRUUCcsXHJcbiAgICB9KTtcclxuICAgIG1haWxIdHRwQXBpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IG1haWxBcGlTdGFnZSA9IG5ldyBhcGlnYXRld2F5djIuQ2ZuU3RhZ2UodGhpcywgJ01haWxBcGlTdGFnZScsIHtcclxuICAgICAgc3RhZ2VOYW1lOiAncHJvZCcsXHJcbiAgICAgIGFwaUlkOiBtYWlsSHR0cEFwaS5yZWYsXHJcbiAgICAgIGF1dG9EZXBsb3k6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIG1haWxBcGlTdGFnZS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICBjb25zdCBhcGlEb21haW5OYW1lID0gaGFzQ3VzdG9tRG9tYWluXHJcbiAgICAgID8gbmV3IGFwaWdhdGV3YXl2Mi5DZm5Eb21haW5OYW1lKHRoaXMsICdBcGlEb21haW5OYW1lJywge1xyXG4gICAgICAgICAgZG9tYWluTmFtZTogYXBpQ3VzdG9tRG9tYWluTmFtZSxcclxuICAgICAgICAgIGRvbWFpbk5hbWVDb25maWd1cmF0aW9uczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY2VydGlmaWNhdGVBcm46IGNlcnRpZmljYXRlQXJuISxcclxuICAgICAgICAgICAgICBlbmRwb2ludFR5cGU6ICdSRUdJT05BTCcsXHJcbiAgICAgICAgICAgICAgc2VjdXJpdHlQb2xpY3k6ICdUTFNfMV8yJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSlcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICBpZiAoYXBpRG9tYWluTmFtZSkge1xyXG4gICAgICBhcGlEb21haW5OYW1lLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFwaU1hcHBpbmcgPVxyXG4gICAgICBoYXNDdXN0b21Eb21haW4gJiYgYXBpRG9tYWluTmFtZVxyXG4gICAgICAgID8gbmV3IGFwaWdhdGV3YXl2Mi5DZm5BcGlNYXBwaW5nKHRoaXMsICdBcGlNYXBwaW5nJywge1xyXG4gICAgICAgICAgICBhcGlJZDogbWFpbEh0dHBBcGkucmVmLFxyXG4gICAgICAgICAgICBkb21haW5OYW1lOiBhcGlEb21haW5OYW1lLnJlZixcclxuICAgICAgICAgICAgc3RhZ2U6IG1haWxBcGlTdGFnZS5yZWYsXHJcbiAgICAgICAgICAgIGFwaU1hcHBpbmdLZXk6ICdleGFtcGxlcycsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgaWYgKGFwaU1hcHBpbmcpIHtcclxuICAgICAgYXBpTWFwcGluZy5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhcGlEb21haW5SZWNvcmQgPVxyXG4gICAgICBoYXNDdXN0b21Eb21haW4gJiYgaGFzSG9zdGVkWm9uZSAmJiBhcGlEb21haW5OYW1lXHJcbiAgICAgICAgPyBuZXcgcm91dGU1My5DZm5SZWNvcmRTZXQodGhpcywgJ0FwaURvbWFpblJlY29yZCcsIHtcclxuICAgICAgICAgICAgaG9zdGVkWm9uZUlkLFxyXG4gICAgICAgICAgICBuYW1lOiBhcGlDdXN0b21Eb21haW5OYW1lLFxyXG4gICAgICAgICAgICB0eXBlOiAnQScsXHJcbiAgICAgICAgICAgIGFsaWFzVGFyZ2V0OiB7XHJcbiAgICAgICAgICAgICAgZG5zTmFtZTogYXBpRG9tYWluTmFtZS5hdHRyUmVnaW9uYWxEb21haW5OYW1lLFxyXG4gICAgICAgICAgICAgIGhvc3RlZFpvbmVJZDogYXBpRG9tYWluTmFtZS5hdHRyUmVnaW9uYWxIb3N0ZWRab25lSWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgaWYgKGFwaURvbWFpblJlY29yZCkge1xyXG4gICAgICBhcGlEb21haW5SZWNvcmQuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcbiAgICB9XHJcbiAgICBpZiAoYXBpTWFwcGluZyAmJiBhcGlEb21haW5OYW1lKSB7XHJcbiAgICAgIGFwaU1hcHBpbmcuYWRkRGVwZW5kZW5jeShhcGlEb21haW5OYW1lKTtcclxuICAgICAgYXBpTWFwcGluZy5hZGREZXBlbmRlbmN5KG1haWxBcGlTdGFnZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoYXBpRG9tYWluUmVjb3JkICYmIGFwaURvbWFpbk5hbWUpIHtcclxuICAgICAgYXBpRG9tYWluUmVjb3JkLmFkZERlcGVuZGVuY3koYXBpRG9tYWluTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmFzZVVybCA9IGhhc0N1c3RvbURvbWFpblxyXG4gICAgICA/IGBodHRwczovLyR7YXBpQ3VzdG9tRG9tYWluTmFtZX0vZXhhbXBsZXMvZ21haWwtdmlld2VyYFxyXG4gICAgICA6IGNkay5Gbi5qb2luKCcnLCBbbWFpbEh0dHBBcGkuYXR0ckFwaUVuZHBvaW50LCAnLycsIG1haWxBcGlTdGFnZS5yZWYsICcvZ21haWwtdmlld2VyJ10pO1xyXG5cclxuICAgIGNvbnN0IHNlcnZpY2VOYW1lc3BhY2UgPSBuZXcgc2VydmljZWRpc2NvdmVyeS5DZm5Qcml2YXRlRG5zTmFtZXNwYWNlKHRoaXMsICdTZXJ2aWNlTmFtZXNwYWNlJywge1xyXG4gICAgICBuYW1lOiBzZXJ2aWNlRGlzY292ZXJ5TmFtZXNwYWNlTmFtZSxcclxuICAgICAgdnBjOiB2cGMudnBjSWQsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiAnTmFtZXNwYWNlIGZvciBtYWlsIHNlcnZpY2VzJyxcclxuICAgIH0pO1xyXG4gICAgc2VydmljZU5hbWVzcGFjZS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICBjb25zdCBhcGlWcGNMaW5rID0gbmV3IGFwaWdhdGV3YXl2Mi5DZm5WcGNMaW5rKHRoaXMsICdBcGlWcGNMaW5rJywge1xyXG4gICAgICBuYW1lOiAnbWFpbC1leGFtcGxlLXZwY2xpbmsnLFxyXG4gICAgICBzdWJuZXRJZHM6IHNlcnZpY2VTdWJuZXRJZHMsXHJcbiAgICAgIHNlY3VyaXR5R3JvdXBJZHM6IFthcGlWcGNMaW5rU2VjdXJpdHlHcm91cC5yZWZdLFxyXG4gICAgfSk7XHJcbiAgICBhcGlWcGNMaW5rLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IGFwcENsb3VkTWFwU2VydmljZSA9IG5ldyBzZXJ2aWNlZGlzY292ZXJ5LkNmblNlcnZpY2UodGhpcywgJ0FwcENsb3VkTWFwU2VydmljZScsIHtcclxuICAgICAgbmFtZTogJ21haWwtZXhhbXBsZScsXHJcbiAgICAgIG5hbWVzcGFjZUlkOiBzZXJ2aWNlTmFtZXNwYWNlLnJlZixcclxuICAgICAgZG5zQ29uZmlnOiB7XHJcbiAgICAgICAgcm91dGluZ1BvbGljeTogJ1dFSUdIVEVEJyxcclxuICAgICAgICBkbnNSZWNvcmRzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHR0bDogc2VydmljZURpc2NvdmVyeVR0bCxcclxuICAgICAgICAgICAgdHlwZTogJ1NSVicsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWx0aENoZWNrQ3VzdG9tQ29uZmlnOiB7XHJcbiAgICAgICAgZmFpbHVyZVRocmVzaG9sZDogMSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gICAgYXBwQ2xvdWRNYXBTZXJ2aWNlLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IHRhc2tFeGVjdXRpb25Sb2xlID0gbmV3IGlhbS5DZm5Sb2xlKHRoaXMsICdUYXNrRXhlY3V0aW9uUm9sZScsIHtcclxuICAgICAgYXNzdW1lUm9sZVBvbGljeURvY3VtZW50OiB7XHJcbiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxyXG4gICAgICAgIFN0YXRlbWVudDogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXHJcbiAgICAgICAgICAgIFByaW5jaXBhbDoge1xyXG4gICAgICAgICAgICAgIFNlcnZpY2U6ICdlY3MtdGFza3MuYW1hem9uYXdzLmNvbScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEFjdGlvbjogJ3N0czpBc3N1bWVSb2xlJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSxcclxuICAgICAgbWFuYWdlZFBvbGljeUFybnM6IFsnYXJuOmF3czppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FtYXpvbkVDU1Rhc2tFeGVjdXRpb25Sb2xlUG9saWN5J10sXHJcbiAgICAgIHBvbGljaWVzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcG9saWN5TmFtZTogJ0FsbG93UGFyYW1ldGVyUmVhZEZvclNlY3JldHMnLFxyXG4gICAgICAgICAgcG9saWN5RG9jdW1lbnQ6IHtcclxuICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxyXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXHJcbiAgICAgICAgICAgICAgICBBY3Rpb246IFsnc3NtOkdldFBhcmFtZXRlcicsICdzc206R2V0UGFyYW1ldGVycycsICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsICdrbXM6RGVjcnlwdCddLFxyXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcclxuICAgICAgICAgICAgICAgICAgYGFybjphd3M6c3NtOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTpwYXJhbWV0ZXIke3NzbVByZWZpeH0qYCxcclxuICAgICAgICAgICAgICAgICAgYGFybjphd3M6a21zOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTprZXkvKmAsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuICAgIHRhc2tFeGVjdXRpb25Sb2xlLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IHRhc2tSb2xlID0gbmV3IGlhbS5DZm5Sb2xlKHRoaXMsICdUYXNrUm9sZScsIHtcclxuICAgICAgYXNzdW1lUm9sZVBvbGljeURvY3VtZW50OiB7XHJcbiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxyXG4gICAgICAgIFN0YXRlbWVudDogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXHJcbiAgICAgICAgICAgIFByaW5jaXBhbDoge1xyXG4gICAgICAgICAgICAgIFNlcnZpY2U6ICdlY3MtdGFza3MuYW1hem9uYXdzLmNvbScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEFjdGlvbjogJ3N0czpBc3N1bWVSb2xlJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSxcclxuICAgICAgcG9saWNpZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwb2xpY3lOYW1lOiAnQXBwUnVudGltZUNvbmZpZ1JlYWQnLFxyXG4gICAgICAgICAgcG9saWN5RG9jdW1lbnQ6IHtcclxuICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxyXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXHJcbiAgICAgICAgICAgICAgICBBY3Rpb246IFsnc3NtOkdldFBhcmFtZXRlcicsICdzc206R2V0UGFyYW1ldGVycycsICdzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsICdrbXM6RGVjcnlwdCddLFxyXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcclxuICAgICAgICAgICAgICAgICAgYGFybjphd3M6c3NtOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTpwYXJhbWV0ZXIke3NzbVByZWZpeH0qYCxcclxuICAgICAgICAgICAgICAgICAgYGFybjphd3M6a21zOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTprZXkvKmAsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuICAgIHRhc2tSb2xlLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IGFwcFRhc2tEZWZpbml0aW9uID0gbmV3IGVjcy5DZm5UYXNrRGVmaW5pdGlvbih0aGlzLCAnQXBwVGFza0RlZmluaXRpb24nLCB7XHJcbiAgICAgIGZhbWlseTogJ21haWwtZXhhbXBsZScsXHJcbiAgICAgIGNwdTogY29udGFpbmVyQ3B1LnRvU3RyaW5nKCksXHJcbiAgICAgIG1lbW9yeTogY29udGFpbmVyTWVtb3J5LnRvU3RyaW5nKCksXHJcbiAgICAgIG5ldHdvcmtNb2RlOiAnYXdzdnBjJyxcclxuICAgICAgcmVxdWlyZXNDb21wYXRpYmlsaXRpZXM6IFsnRkFSR0FURSddLFxyXG4gICAgICBleGVjdXRpb25Sb2xlQXJuOiB0YXNrRXhlY3V0aW9uUm9sZS5hdHRyQXJuLFxyXG4gICAgICB0YXNrUm9sZUFybjogdGFza1JvbGUuYXR0ckFybixcclxuICAgICAgY29udGFpbmVyRGVmaW5pdGlvbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnbWFpbC1leGFtcGxlJyxcclxuICAgICAgICAgIGltYWdlOiBgJHttYWlsRXhhbXBsZVJlcG9zaXRvcnkuYXR0clJlcG9zaXRvcnlVcml9OmxhdGVzdGAsXHJcbiAgICAgICAgICBwb3J0TWFwcGluZ3M6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbnRhaW5lclBvcnQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgbG9nQ29uZmlndXJhdGlvbjoge1xyXG4gICAgICAgICAgICBsb2dEcml2ZXI6ICdhd3Nsb2dzJyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICdhd3Nsb2dzLWdyb3VwJzogYXBwTG9nR3JvdXAucmVmLFxyXG4gICAgICAgICAgICAgICdhd3Nsb2dzLXJlZ2lvbic6IHRoaXMucmVnaW9uLFxyXG4gICAgICAgICAgICAgICdhd3Nsb2dzLXN0cmVhbS1wcmVmaXgnOiAnbWFpbC1leGFtcGxlJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlbnZpcm9ubWVudDogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ0NPTkZJR19TU01fUFJFRklYJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogc3NtUHJlZml4LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ1BPUlQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBjb250YWluZXJQb3J0LnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBuYW1lOiAnQkFTRV9VUkwnLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBiYXNlVXJsLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBuYW1lOiAnTk9ERV9FTlYnLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBwdWJsaWNFbnZWYWx1ZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICBzZWNyZXRzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBuYW1lOiAnR09PR0xFX0NMSUVOVF9JRCcsXHJcbiAgICAgICAgICAgICAgdmFsdWVGcm9tOiBgYXJuOmF3czpzc206JHt0aGlzLnJlZ2lvbn06JHt0aGlzLmFjY291bnR9OnBhcmFtZXRlciR7c3NtUHJlZml4fS9lbnYvR09PR0xFX0NMSUVOVF9JRGAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBuYW1lOiAnR09PR0xFX0NMSUVOVF9TRUNSRVQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRnJvbTogYGFybjphd3M6c3NtOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTpwYXJhbWV0ZXIke3NzbVByZWZpeH0vc2VjcmV0cy9HT09HTEVfQ0xJRU5UX1NFQ1JFVGAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBuYW1lOiAnU0VTU0lPTl9TRUNSRVQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRnJvbTogYGFybjphd3M6c3NtOiR7dGhpcy5yZWdpb259OiR7dGhpcy5hY2NvdW50fTpwYXJhbWV0ZXIke3NzbVByZWZpeH0vc2VjcmV0cy9TRVNTSU9OX1NFQ1JFVGAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuICAgIGFwcFRhc2tEZWZpbml0aW9uLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIG5ldyBlY3MuQ2ZuU2VydmljZSh0aGlzLCAnQXBwU2VydmljZScsIHtcclxuICAgICAgc2VydmljZU5hbWU6ICdtYWlsLWV4YW1wbGUnLFxyXG4gICAgICBjbHVzdGVyOiBtYWlsQ2x1c3Rlci5yZWYsXHJcbiAgICAgIHRhc2tEZWZpbml0aW9uOiBhcHBUYXNrRGVmaW5pdGlvbi5yZWYsXHJcbiAgICAgIGRlc2lyZWRDb3VudCxcclxuICAgICAgY2FwYWNpdHlQcm92aWRlclN0cmF0ZWd5OiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2FwYWNpdHlQcm92aWRlcjogJ0ZBUkdBVEVfU1BPVCcsXHJcbiAgICAgICAgICB3ZWlnaHQ6IDQsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjYXBhY2l0eVByb3ZpZGVyOiAnRkFSR0FURScsXHJcbiAgICAgICAgICB3ZWlnaHQ6IDEsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgICAgZGVwbG95bWVudENvbmZpZ3VyYXRpb246IHtcclxuICAgICAgICBtYXhpbXVtUGVyY2VudDogMjAwLFxyXG4gICAgICAgIG1pbmltdW1IZWFsdGh5UGVyY2VudDogNTAsXHJcbiAgICAgIH0sXHJcbiAgICAgIG5ldHdvcmtDb25maWd1cmF0aW9uOiB7XHJcbiAgICAgICAgYXdzdnBjQ29uZmlndXJhdGlvbjoge1xyXG4gICAgICAgICAgYXNzaWduUHVibGljSXA6ICdESVNBQkxFRCcsXHJcbiAgICAgICAgICBzdWJuZXRzOiBzZXJ2aWNlU3VibmV0SWRzLFxyXG4gICAgICAgICAgc2VjdXJpdHlHcm91cHM6IFtzZXJ2aWNlU2VjdXJpdHlHcm91cC5yZWZdLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHNlcnZpY2VSZWdpc3RyaWVzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcmVnaXN0cnlBcm46IGFwcENsb3VkTWFwU2VydmljZS5hdHRyQXJuLFxyXG4gICAgICAgICAgY29udGFpbmVyTmFtZTogJ21haWwtZXhhbXBsZScsXHJcbiAgICAgICAgICBjb250YWluZXJQb3J0OiBjb250YWluZXJQb3J0LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIHBsYXRmb3JtVmVyc2lvbjogJ0xBVEVTVCcsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBtYWlsSW50ZWdyYXRpb24gPSBuZXcgYXBpZ2F0ZXdheXYyLkNmbkludGVncmF0aW9uKHRoaXMsICdNYWlsSW50ZWdyYXRpb24nLCB7XHJcbiAgICAgIGFwaUlkOiBtYWlsSHR0cEFwaS5yZWYsXHJcbiAgICAgIGludGVncmF0aW9uVHlwZTogJ0hUVFBfUFJPWFknLFxyXG4gICAgICBpbnRlZ3JhdGlvbk1ldGhvZDogJ0FOWScsXHJcbiAgICAgIGludGVncmF0aW9uVXJpOiBhcHBDbG91ZE1hcFNlcnZpY2UuYXR0ckFybixcclxuICAgICAgY29ubmVjdGlvblR5cGU6ICdWUENfTElOSycsXHJcbiAgICAgIGNvbm5lY3Rpb25JZDogYXBpVnBjTGluay5yZWYsXHJcbiAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiAnMS4wJyxcclxuICAgIH0pO1xyXG5cclxuICAgIG5ldyBhcGlnYXRld2F5djIuQ2ZuUm91dGUodGhpcywgJ0dtYWlsVmlld2VyUm91dGUnLCB7XHJcbiAgICAgIGFwaUlkOiBtYWlsSHR0cEFwaS5yZWYsXHJcbiAgICAgIHJvdXRlS2V5OiAnQU5ZIC9nbWFpbC12aWV3ZXInLFxyXG4gICAgICB0YXJnZXQ6IGBpbnRlZ3JhdGlvbnMvJHttYWlsSW50ZWdyYXRpb24ucmVmfWAsXHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXcgYXBpZ2F0ZXdheXYyLkNmblJvdXRlKHRoaXMsICdHbWFpbFZpZXdlclByb3h5Um91dGUnLCB7XHJcbiAgICAgIGFwaUlkOiBtYWlsSHR0cEFwaS5yZWYsXHJcbiAgICAgIHJvdXRlS2V5OiAnQU5ZIC9nbWFpbC12aWV3ZXIve3Byb3h5K30nLFxyXG4gICAgICB0YXJnZXQ6IGBpbnRlZ3JhdGlvbnMvJHttYWlsSW50ZWdyYXRpb24ucmVmfWAsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzc21CYXNlVXJsID0gbmV3IHNzbS5TdHJpbmdQYXJhbWV0ZXIodGhpcywgJ1NzbUJhc2VVcmwnLCB7XHJcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vZW52L0JBU0VfVVJMYCxcclxuICAgICAgc3RyaW5nVmFsdWU6IGJhc2VVcmwsXHJcbiAgICAgIHR5cGU6IHNzbS5QYXJhbWV0ZXJUeXBlLlNUUklORyxcclxuICAgIH0pO1xyXG4gICAgKHNzbUJhc2VVcmwubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc3NtLkNmblBhcmFtZXRlcikuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcblxyXG4gICAgY29uc3Qgc3NtR29vZ2xlQ2xpZW50SWQgPSBuZXcgc3NtLlN0cmluZ1BhcmFtZXRlcih0aGlzLCAnU3NtR29vZ2xlQ2xpZW50SWQnLCB7XHJcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vZW52L0dPT0dMRV9DTElFTlRfSURgLFxyXG4gICAgICBzdHJpbmdWYWx1ZTogZ29vZ2xlQ2xpZW50SWQsXHJcbiAgICAgIHR5cGU6IHNzbS5QYXJhbWV0ZXJUeXBlLlNUUklORyxcclxuICAgIH0pO1xyXG4gICAgKHNzbUdvb2dsZUNsaWVudElkLm5vZGUuZGVmYXVsdENoaWxkIGFzIHNzbS5DZm5QYXJhbWV0ZXIpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IHNzbUdvb2dsZUNsaWVudFNlY3JldCA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdTc21Hb29nbGVDbGllbnRTZWNyZXQnLCB7XHJcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vc2VjcmV0cy9HT09HTEVfQ0xJRU5UX1NFQ1JFVGAsXHJcbiAgICAgIHN0cmluZ1ZhbHVlOiBnb29nbGVDbGllbnRTZWNyZXQsXHJcbiAgICAgIHR5cGU6IHNzbS5QYXJhbWV0ZXJUeXBlLlNUUklORyxcclxuICAgIH0pO1xyXG4gICAgKHNzbUdvb2dsZUNsaWVudFNlY3JldC5ub2RlLmRlZmF1bHRDaGlsZCBhcyBzc20uQ2ZuUGFyYW1ldGVyKS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICBjb25zdCBzc21Qb3J0ID0gbmV3IHNzbS5TdHJpbmdQYXJhbWV0ZXIodGhpcywgJ1NzbVBvcnQnLCB7XHJcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vZW52L1BPUlRgLFxyXG4gICAgICBzdHJpbmdWYWx1ZTogY29udGFpbmVyUG9ydC50b1N0cmluZygpLFxyXG4gICAgICB0eXBlOiBzc20uUGFyYW1ldGVyVHlwZS5TVFJJTkcsXHJcbiAgICB9KTtcclxuICAgIChzc21Qb3J0Lm5vZGUuZGVmYXVsdENoaWxkIGFzIHNzbS5DZm5QYXJhbWV0ZXIpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IHNzbVB1YmxpY0VudiA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdTc21QdWJsaWNFbnYnLCB7XHJcbiAgICAgIHBhcmFtZXRlck5hbWU6IGAke3NzbVByZWZpeH0vZW52L05PREVfRU5WYCxcclxuICAgICAgc3RyaW5nVmFsdWU6IHB1YmxpY0VudlZhbHVlLFxyXG4gICAgICB0eXBlOiBzc20uUGFyYW1ldGVyVHlwZS5TVFJJTkcsXHJcbiAgICB9KTtcclxuICAgIChzc21QdWJsaWNFbnYubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc3NtLkNmblBhcmFtZXRlcikuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcblxyXG4gICAgY29uc3Qgc3NtU2Vzc2lvblNlY3JldCA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdTc21TZXNzaW9uU2VjcmV0Jywge1xyXG4gICAgICBwYXJhbWV0ZXJOYW1lOiBgJHtzc21QcmVmaXh9L3NlY3JldHMvU0VTU0lPTl9TRUNSRVRgLFxyXG4gICAgICBzdHJpbmdWYWx1ZTogc2Vzc2lvblNlY3JldFZhbHVlLFxyXG4gICAgICB0eXBlOiBzc20uUGFyYW1ldGVyVHlwZS5TVFJJTkcsXHJcbiAgICB9KTtcclxuICAgIChzc21TZXNzaW9uU2VjcmV0Lm5vZGUuZGVmYXVsdENoaWxkIGFzIHNzbS5DZm5QYXJhbWV0ZXIpLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3kgPSBjZGsuQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xyXG5cclxuICAgIGNvbnN0IGNvZGVCdWlsZFJvbGUgPSBuZXcgaWFtLkNmblJvbGUodGhpcywgJ0NvZGVCdWlsZFJvbGUnLCB7XHJcbiAgICAgIGFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDoge1xyXG4gICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcclxuICAgICAgICBTdGF0ZW1lbnQ6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxyXG4gICAgICAgICAgICBQcmluY2lwYWw6IHtcclxuICAgICAgICAgICAgICBTZXJ2aWNlOiAnY29kZWJ1aWxkLmFtYXpvbmF3cy5jb20nLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBBY3Rpb246ICdzdHM6QXNzdW1lUm9sZScsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHBvbGljaWVzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcG9saWN5TmFtZTogJ0J1aWxkTG9ncycsXHJcbiAgICAgICAgICBwb2xpY3lEb2N1bWVudDoge1xyXG4gICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXHJcbiAgICAgICAgICAgIFN0YXRlbWVudDogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcclxuICAgICAgICAgICAgICAgIEFjdGlvbjogWydsb2dzOkNyZWF0ZUxvZ0dyb3VwJywgJ2xvZ3M6Q3JlYXRlTG9nU3RyZWFtJywgJ2xvZ3M6UHV0TG9nRXZlbnRzJ10sXHJcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcG9saWN5TmFtZTogJ0VDUlB1c2gnLFxyXG4gICAgICAgICAgcG9saWN5RG9jdW1lbnQ6IHtcclxuICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxyXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXHJcbiAgICAgICAgICAgICAgICBBY3Rpb246IFtcclxuICAgICAgICAgICAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxyXG4gICAgICAgICAgICAgICAgICAnZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eScsXHJcbiAgICAgICAgICAgICAgICAgICdlY3I6Q29tcGxldGVMYXllclVwbG9hZCcsXHJcbiAgICAgICAgICAgICAgICAgICdlY3I6QmF0Y2hHZXRJbWFnZScsXHJcbiAgICAgICAgICAgICAgICAgICdlY3I6RGVzY3JpYmVSZXBvc2l0b3JpZXMnLFxyXG4gICAgICAgICAgICAgICAgICAnZWNyOkluaXRpYXRlTGF5ZXJVcGxvYWQnLFxyXG4gICAgICAgICAgICAgICAgICAnZWNyOlB1dEltYWdlJyxcclxuICAgICAgICAgICAgICAgICAgJ2VjcjpVcGxvYWRMYXllclBhcnQnLFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKicsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwb2xpY3lOYW1lOiAnRUNTRGVwbG95JyxcclxuICAgICAgICAgIHBvbGljeURvY3VtZW50OiB7XHJcbiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcclxuICAgICAgICAgICAgU3RhdGVtZW50OiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxyXG4gICAgICAgICAgICAgICAgQWN0aW9uOiBbJ2VjczpVcGRhdGVTZXJ2aWNlJywgJ2VjczpEZXNjcmliZVNlcnZpY2VzJywgJ2VjczpEZXNjcmliZUNsdXN0ZXJzJ10sXHJcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcG9saWN5TmFtZTogJ1NTTVJlYWRGb3JCdWlsZCcsXHJcbiAgICAgICAgICBwb2xpY3lEb2N1bWVudDoge1xyXG4gICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXHJcbiAgICAgICAgICAgIFN0YXRlbWVudDogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcclxuICAgICAgICAgICAgICAgIEFjdGlvbjogWydzc206R2V0UGFyYW1ldGVyJywgJ3NzbTpHZXRQYXJhbWV0ZXJzJywgJ3NzbTpHZXRQYXJhbWV0ZXJzQnlQYXRoJ10sXHJcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcG9saWN5TmFtZTogJ0NvZGVDb25uZWN0aW9uQWNjZXNzJyxcclxuICAgICAgICAgIHBvbGljeURvY3VtZW50OiB7XHJcbiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcclxuICAgICAgICAgICAgU3RhdGVtZW50OiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxyXG4gICAgICAgICAgICAgICAgQWN0aW9uOiBbXHJcbiAgICAgICAgICAgICAgICBcImNvZGVjb25uZWN0aW9uczpHZXRDb25uZWN0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICBcImNvZGVjb25uZWN0aW9uczpHZXRDb25uZWN0aW9uVG9rZW5cIixcclxuICAgICAgICAgICAgICAgIFwiY29kZWNvbm5lY3Rpb25zOlVzZUNvbm5lY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgIFJlc291cmNlOiBwcm9wcy5jb2RlQ29ubmVjdGlvbkFybixcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9XHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuICAgIGNvZGVCdWlsZFJvbGUuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSA9IGNkay5DZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XHJcblxyXG4gICAgLy8gVXNlIHRoZSBoaWdoZXItbGV2ZWwgUHJvamVjdCBjb25zdHJ1Y3Qgc28gd2UgY2FuIHByb3ZpZGUgYSB0eXBlZCBCdWlsZFNwZWNcclxuICAgIGNvbnN0IGNvZGVidWlsZFJvbGVSZWYgPSBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnQ29kZUJ1aWxkUm9sZVJlZicsIGNvZGVCdWlsZFJvbGUuYXR0ckFybik7XHJcblxyXG4gICAgY29uc3QgY29kZUJ1aWxkUHJvamVjdCA9IG5ldyBjb2RlYnVpbGQuUHJvamVjdCh0aGlzLCAnQ29kZUJ1aWxkUHJvamVjdCcsIHtcclxuICAgICAgcHJvamVjdE5hbWU6ICdtYWlsLWV4YW1wbGUnLFxyXG4gICAgICByb2xlOiBjb2RlYnVpbGRSb2xlUmVmLFxyXG4gICAgICBlbnZpcm9ubWVudDoge1xyXG4gICAgICAgIGJ1aWxkSW1hZ2U6IGNvZGVidWlsZC5MaW51eEJ1aWxkSW1hZ2UuU1RBTkRBUkRfN18wLFxyXG4gICAgICAgIGNvbXB1dGVUeXBlOiBjb2RlYnVpbGQuQ29tcHV0ZVR5cGUuU01BTEwsXHJcbiAgICAgICAgcHJpdmlsZWdlZDogdHJ1ZSxcclxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczoge1xyXG4gICAgICAgICAgRUNSX1VSSTogeyB2YWx1ZTogbWFpbEV4YW1wbGVSZXBvc2l0b3J5LmF0dHJSZXBvc2l0b3J5VXJpIH0sXHJcbiAgICAgICAgICBDTFVTVEVSX05BTUU6IHsgdmFsdWU6IG1haWxDbHVzdGVyLnJlZiB9LFxyXG4gICAgICAgICAgU0VSVklDRV9OQU1FOiB7IHZhbHVlOiAnbWFpbC1leGFtcGxlJyB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHNvdXJjZTogY29kZWJ1aWxkLlNvdXJjZS5naXRIdWIoeyBvd25lcjogZ2l0SHViT3duZXIsIHJlcG86IGdpdEh1YlJlcG8sIGJyYW5jaE9yUmVmOiBnaXRIdWJCcmFuY2gsIH0pLFxyXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXHJcbiAgICAgIHF1ZXVlZFRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDMwKSxcclxuICAgICAgYmFkZ2U6IHRydWUsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgJiBkZXBsb3kgbWFpbC1leGFtcGxlIHRvIEVDUiB0aGVuIGZvcmNlIEVDUyBkZXBsb3knLFxyXG4gICAgICBjYWNoZTogY29kZWJ1aWxkLkNhY2hlLm5vbmUoKSxcclxuICAgICAgYnVpbGRTcGVjOiBjb2RlYnVpbGQuQnVpbGRTcGVjLmZyb21PYmplY3Qoe1xyXG4gICAgICAgIHZlcnNpb246ICcwLjInLFxyXG4gICAgICAgIHBoYXNlczoge1xyXG4gICAgICAgICAgcHJlX2J1aWxkOiB7IGNvbW1hbmRzOiBbXHJcbiAgICAgICAgICAgICdlY2hvIFwiTG9nZ2luZyBpbiB0byBFQ1JcIicsXHJcbiAgICAgICAgICAgICdhd3MgZWNyIGdldC1sb2dpbi1wYXNzd29yZCAtLXJlZ2lvbiAkQVdTX0RFRkFVTFRfUkVHSU9OIHwgZG9ja2VyIGxvZ2luIC0tdXNlcm5hbWUgQVdTIC0tcGFzc3dvcmQtc3RkaW4gJEVDUl9VUkknLFxyXG4gICAgICAgICAgICAnSU1BR0VfVEFHPSR7Q09ERUJVSUxEX1JFU09MVkVEX1NPVVJDRV9WRVJTSU9OOi1sYXRlc3R9JyxcclxuICAgICAgICAgIF19LFxyXG4gICAgICAgICAgYnVpbGQ6IHsgY29tbWFuZHM6IFtcclxuICAgICAgICAgICAgJ2NkIGV4YW1wbGVzL2dtYWlsLXZpZXdlcicsXHJcbiAgICAgICAgICAgICdkb2NrZXIgYnVpbGQgLXQgJEVDUl9VUkk6bGF0ZXN0IC10ICRFQ1JfVVJJOiRJTUFHRV9UQUcgLicsXHJcbiAgICAgICAgICBdIH0sXHJcbiAgICAgICAgICBwb3N0X2J1aWxkOiB7IGNvbW1hbmRzOiBbXHJcbiAgICAgICAgICAgICdkb2NrZXIgcHVzaCAkRUNSX1VSSTpsYXRlc3QnLFxyXG4gICAgICAgICAgICAnZG9ja2VyIHB1c2ggJEVDUl9VUkk6JElNQUdFX1RBRycsXHJcbiAgICAgICAgICAgICdhd3MgZWNzIHVwZGF0ZS1zZXJ2aWNlIC0tY2x1c3RlciAkQ0xVU1RFUl9OQU1FIC0tc2VydmljZSAkU0VSVklDRV9OQU1FIC0tZm9yY2UtbmV3LWRlcGxveW1lbnQnLFxyXG4gICAgICAgICAgXX0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhcnRpZmFjdHM6IHsgZmlsZXM6IFtdIH0sXHJcbiAgICAgICAgZW52OiB7IHNoZWxsOiAnYmFzaCcgfSxcclxuICAgICAgfSksXHJcbiAgICB9KTtcclxuICAgIChjb2RlQnVpbGRQcm9qZWN0Lm5vZGUuZGVmYXVsdENoaWxkIGFzIGNvZGVidWlsZC5DZm5Qcm9qZWN0KS5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5ID0gY2RrLkNmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcclxuXHJcbiAgICB0aGlzLmNsdXN0ZXJOYW1lID0gbWFpbENsdXN0ZXIucmVmO1xyXG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ0Nmbk91dHB1dENsdXN0ZXJOYW1lJywge1xyXG4gICAgICBrZXk6ICdDbHVzdGVyTmFtZScsXHJcbiAgICAgIHZhbHVlOiB0aGlzLmNsdXN0ZXJOYW1lLnRvU3RyaW5nKCksXHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVwb3NpdG9yeVVyaSA9IG1haWxFeGFtcGxlUmVwb3NpdG9yeS5hdHRyUmVwb3NpdG9yeVVyaTtcclxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdDZm5PdXRwdXRSZXBvc2l0b3J5VXJpJywge1xyXG4gICAgICBrZXk6ICdSZXBvc2l0b3J5VXJpJyxcclxuICAgICAgdmFsdWU6IHRoaXMucmVwb3NpdG9yeVVyaS50b1N0cmluZygpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFwaUludm9rZVVybCA9IGJhc2VVcmwudG9TdHJpbmcoKTtcclxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdDZm5PdXRwdXRBcGlJbnZva2VVcmwnLCB7XHJcbiAgICAgIGtleTogJ0FwaUludm9rZVVybCcsXHJcbiAgICAgIHZhbHVlOiB0aGlzLmFwaUludm9rZVVybCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jbG91ZE1hcFNlcnZpY2VBcm4gPSBhcHBDbG91ZE1hcFNlcnZpY2UuYXR0ckFybjtcclxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdDZm5PdXRwdXRDbG91ZE1hcFNlcnZpY2VBcm4nLCB7XHJcbiAgICAgIGtleTogJ0Nsb3VkTWFwU2VydmljZUFybicsXHJcbiAgICAgIHZhbHVlOiB0aGlzLmNsb3VkTWFwU2VydmljZUFybi50b1N0cmluZygpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ== \ No newline at end of file +//# 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 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 7b85065..caea0e5 100644 --- a/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.ts +++ b/examples/gmail-viewer-cdk/lib/gmail-viewer-cdk-stack.ts @@ -1,6 +1,7 @@ import * as cdk from 'aws-cdk-lib'; import * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2'; import * as codebuild from 'aws-cdk-lib/aws-codebuild'; +import * as cr from 'aws-cdk-lib/custom-resources'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as ecr from 'aws-cdk-lib/aws-ecr'; import * as ecs from 'aws-cdk-lib/aws-ecs'; @@ -8,11 +9,13 @@ import * as iam from 'aws-cdk-lib/aws-iam'; import * as logs from 'aws-cdk-lib/aws-logs'; import * as route53 from 'aws-cdk-lib/aws-route53'; import * as servicediscovery from 'aws-cdk-lib/aws-servicediscovery'; +import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager'; import * as ssm from 'aws-cdk-lib/aws-ssm'; export interface GmailViewerCdkStackProps extends cdk.StackProps { readonly vpcId?: string; readonly privateSubnets?: string[]; + readonly publicSubnets?: string[]; readonly containerPort?: number | string; readonly containerCpu?: number | string; readonly containerMemory?: number | string; @@ -48,655 +51,203 @@ export class GmailViewerCdkStack extends cdk.Stack { const parsed = typeof candidate === 'number' ? candidate : Number(candidate); return Number.isFinite(parsed) ? parsed : fallback; }; - const toCpuUnits = (value: string | number | undefined): number => { const parsed = toNumber(value, 0.5); const vcpu = parsed <= 4 ? parsed * 1024 : parsed; - const rounded = Math.round(vcpu / 256) * 256; - return Math.max(256, rounded); + return Math.max(256, Math.round(vcpu / 256) * 256); }; const repoParts = (process.env.GITHUB_REPOSITORY ?? '').split('/'); - const guessedGitHubOwner = repoParts[0] || 'dyanet'; - const guessedGitHubRepo = repoParts[1] || 'imap'; - const containerPort = toNumber(props.containerPort, 3000); const containerCpu = toCpuUnits(props.containerCpu); const containerMemory = toNumber(props.containerMemory, 1024); const desiredCount = toNumber(props.desiredCount, 1); - const serviceDiscoveryNamespaceName = props.serviceDiscoveryNamespaceName ?? 'mail.local'; - const serviceDiscoveryTtl = toNumber(props.serviceDiscoveryTtl, 60); + const nsName = props.serviceDiscoveryNamespaceName ?? 'mail.local'; + const nsTtl = cdk.Duration.seconds(toNumber(props.serviceDiscoveryTtl, 60)); const ssmPrefixRaw = props.ssmPrefix ?? '/mail-example'; const ssmPrefix = '/' + ssmPrefixRaw.split('/').filter(p => p).join('/'); - const gitHubOwner = props.gitHubOwner ?? guessedGitHubOwner; - const gitHubRepo = props.gitHubRepo ?? guessedGitHubRepo; + const gitHubOwner = props.gitHubOwner ?? (repoParts[0] || 'dyanet'); + const gitHubRepo = props.gitHubRepo ?? (repoParts[1] || 'imap'); const gitHubBranch = props.gitHubBranch ?? process.env.GITHUB_REF_NAME ?? 'main'; const publicEnvValue = props.publicEnvValue ?? 'production'; - const googleClientId = props.googleClientId || 'not-set'; - const googleClientSecret = props.googleClientSecret ?? 'not-set'; - const sessionSecretValue = props.sessionSecretValue ?? 'not-set'; - const apiCustomDomainName = props.apiCustomDomainName ?? process.env.API_CUSTOM_DOMAIN ?? 'mail.dyanet.com'; - const certificateArn = props.certificateArn ?? this.node.tryGetContext('certificateArn') ?? process.env.CERTIFICATE_ARN; - const hostedZoneId = props.hostedZoneId ?? ''; - const hasCustomDomain = Boolean(certificateArn && apiCustomDomainName); - const hasHostedZone = Boolean(hostedZoneId); - + 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 certArn = props.certificateArn ?? this.node.tryGetContext('certificateArn') ?? process.env.CERTIFICATE_ARN; + const zoneId = props.hostedZoneId ?? ''; + const hasCustomDomain = Boolean(certArn && apiDomain); + const hasHostedZone = Boolean(zoneId); + const usePublicSubnets = props.publicSubnets && props.publicSubnets.length > 0; + + // VPC setup let vpc: ec2.IVpc; - let privateSubnetIds: string[]; let serviceSubnetIds: string[]; - - // If account/region are available, use Vpc.fromLookup to automatically discover subnets. - // Otherwise fall back to CloudFormation parameters which let the deployer pick values in the console. const useVpcParameter = this.node.tryGetContext('useVpcParameter'); if (!useVpcParameter && this.account && this.region) { vpc = ec2.Vpc.fromLookup(this, 'MailVpc', { tags: { Name: 'dya-vpc' } }); - - if (props.privateSubnets && props.privateSubnets.length > 0) { - privateSubnetIds = props.privateSubnets; + if (usePublicSubnets) { + serviceSubnetIds = props.publicSubnets!; + } else if (props.privateSubnets && props.privateSubnets.length > 0) { + serviceSubnetIds = props.privateSubnets; } else { - // The service linked to the VPC Link may not be available in all Availability Zones. - const badAz = 'cac1-az4'; - - let subnets = vpc.privateSubnets.filter(s => s.availabilityZone !== badAz); - if (subnets.length === 0) { - // No private subnets, try public subnets - subnets = vpc.publicSubnets.filter(s => s.availabilityZone !== badAz); - } - - privateSubnetIds = subnets.slice(0, 2).map(s => s.subnetId); - - if (privateSubnetIds.length < 1) { - throw new Error(`VPC '${vpc.vpcId}' must have at least one private or public subnet in an allowed availability zone (not in ${badAz}).`); - } + const badAz = 'cac1-az4'; + let subnets = vpc.privateSubnets.filter(s => s.availabilityZone !== badAz); + if (subnets.length === 0) subnets = vpc.publicSubnets.filter(s => s.availabilityZone !== badAz); + serviceSubnetIds = subnets.slice(0, 2).map(s => s.subnetId); + if (serviceSubnetIds.length < 1) throw new Error(`VPC must have at least one subnet in an allowed AZ.`); } - serviceSubnetIds = privateSubnetIds; } else { - // CloudFormation parameter for VPC selection (dropdown of VPC IDs in the console) - const vpcIdParam = new cdk.CfnParameter(this, 'VpcIdParam', { - type: 'AWS::EC2::VPC::Id', - default: props.vpcId ?? '', - }); - - // Optional parameter for private subnet IDs (CommaDelimitedList) when synthesizing without account/region - const privateSubnetIdsParam = new cdk.CfnParameter(this, 'PrivateSubnetIdsParam', { - type: 'CommaDelimitedList', - default: props.privateSubnets && props.privateSubnets.length > 0 ? props.privateSubnets.join(',') : '', - }); - // Use the provided parameter values (deployer must supply private subnet ids when synthesizing without lookup) - vpc = ec2.Vpc.fromVpcAttributes(this, 'MailVpc', { - vpcId: vpcIdParam.valueAsString, - availabilityZones: cdk.Fn.getAzs(), - privateSubnetIds: privateSubnetIdsParam.valueAsList, - }); - privateSubnetIds = props.privateSubnets ?? privateSubnetIdsParam.valueAsList; - serviceSubnetIds = privateSubnetIds; + const vpcIdParam = new cdk.CfnParameter(this, 'VpcIdParam', { type: 'AWS::EC2::VPC::Id', default: props.vpcId ?? '' }); + const subnetParam = new cdk.CfnParameter(this, 'PrivateSubnetIdsParam', { type: 'CommaDelimitedList', default: props.privateSubnets?.join(',') ?? '' }); + vpc = ec2.Vpc.fromVpcAttributes(this, 'MailVpc', { vpcId: vpcIdParam.valueAsString, availabilityZones: cdk.Fn.getAzs(), privateSubnetIds: subnetParam.valueAsList }); + serviceSubnetIds = props.privateSubnets ?? subnetParam.valueAsList; } - const apiVpcLinkSecurityGroup = new ec2.CfnSecurityGroup(this, 'ApiVpcLinkSecurityGroup', { - groupDescription: 'Egress from API Gateway VPC Link to service', - vpcId: vpc.vpcId, - securityGroupEgress: [ - { - ipProtocol: 'tcp', - fromPort: containerPort, - toPort: containerPort, - cidrIp: '0.0.0.0/0', - }, - ], - }); - apiVpcLinkSecurityGroup.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; + // Security Groups (L2) + const apiVpcLinkSg = new ec2.SecurityGroup(this, 'ApiVpcLinkSecurityGroup', { vpc, description: 'Egress from API Gateway VPC Link', allowAllOutbound: false }); + apiVpcLinkSg.addEgressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(containerPort)); - const serviceSecurityGroup = new ec2.CfnSecurityGroup(this, 'ServiceSecurityGroup', { - groupDescription: 'Allow API Gateway VPC Link to reach Fargate tasks', - vpcId: vpc.vpcId, - securityGroupIngress: [ - { - ipProtocol: 'tcp', - fromPort: containerPort, - toPort: containerPort, - cidrIp: '0.0.0.0/0', - }, - ], - securityGroupEgress: [ - { - ipProtocol: '-1', - fromPort: 0, - toPort: 65535, - cidrIp: '0.0.0.0/0', - }, - ], - }); - serviceSecurityGroup.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; + const serviceSg = new ec2.SecurityGroup(this, 'ServiceSecurityGroup', { vpc, description: 'Allow traffic to Fargate tasks', allowAllOutbound: true }); + serviceSg.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(containerPort)); - const appLogGroup = new logs.CfnLogGroup(this, 'AppLogGroup', { - logGroupName: '/ecs/mail-example', - retentionInDays: 30, - }); - appLogGroup.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; + // Log Group (L2) + const appLogGroup = new logs.LogGroup(this, 'AppLogGroup', { logGroupName: '/ecs/mail-example', retention: logs.RetentionDays.ONE_MONTH, removalPolicy: cdk.RemovalPolicy.DESTROY }); - const mailCluster = new ecs.CfnCluster(this, 'MailCluster', { - clusterName: 'mail-cluster', - capacityProviders: ['FARGATE', 'FARGATE_SPOT'], - defaultCapacityProviderStrategy: [ - { - capacityProvider: 'FARGATE_SPOT', - weight: 4, - }, - { - capacityProvider: 'FARGATE', - weight: 1, - }, - ], - }); - mailCluster.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; + // ECS Cluster (L2) + const cluster = new ecs.Cluster(this, 'MailCluster', { vpc, clusterName: 'public-cluster', enableFargateCapacityProviders: true }); - const mailExampleRepository = new ecr.CfnRepository(this, 'MailExampleRepository', { - repositoryName: 'mail-example', - imageTagMutability: 'MUTABLE', - encryptionConfiguration: { - encryptionType: 'AES256', - }, - lifecyclePolicy: { - lifecyclePolicyText: - '{\n "rules": [\n {\n "rulePriority": 1,\n "description": "Expire images older than 30 days",\n "selection": {\n "tagStatus": "any",\n "countType": "sinceImagePushed",\n "countUnit": "days",\n "countNumber": 30\n },\n "action": { "type": "expire" }\n }\n ]\n}\n', - }, - }); - mailExampleRepository.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const mailHttpApi = new apigatewayv2.CfnApi(this, 'MailHttpApi', { - name: 'mail-example', - protocolType: 'HTTP', + // ECR Repository - create if not exists using custom resource + const ecrRepoName = 'mail-example'; + const checkEcrRepo = new cr.AwsCustomResource(this, 'CheckEcrRepo', { + onCreate: { service: 'ECR', action: 'describeRepositories', parameters: { repositoryNames: [ecrRepoName] }, physicalResourceId: cr.PhysicalResourceId.of(ecrRepoName) }, + policy: cr.AwsCustomResourcePolicy.fromSdkCalls({ resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE }), }); - mailHttpApi.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - - const mailApiStage = new apigatewayv2.CfnStage(this, 'MailApiStage', { - stageName: 'prod', - apiId: mailHttpApi.ref, - autoDeploy: true, + const createEcrRepo = new cr.AwsCustomResource(this, 'CreateEcrRepo', { + onCreate: { service: 'ECR', action: 'createRepository', parameters: { repositoryName: ecrRepoName, imageTagMutability: 'MUTABLE', encryptionConfiguration: { encryptionType: 'AES256' } }, physicalResourceId: cr.PhysicalResourceId.of(ecrRepoName), ignoreErrorCodesMatching: 'RepositoryAlreadyExistsException' }, + policy: cr.AwsCustomResourcePolicy.fromSdkCalls({ resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE }), }); - mailApiStage.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; + createEcrRepo.node.addDependency(checkEcrRepo); + const ecrRepo = ecr.Repository.fromRepositoryName(this, 'MailExampleRepositoryRef', ecrRepoName); - const apiDomainName = hasCustomDomain - ? new apigatewayv2.CfnDomainName(this, 'ApiDomainName', { - domainName: apiCustomDomainName, - domainNameConfigurations: [ - { - certificateArn: certificateArn!, - endpointType: 'REGIONAL', - securityPolicy: 'TLS_1_2', - }, - ], - }) - : undefined; - if (apiDomainName) { - apiDomainName.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - } + // API Gateway HTTP API (L1 - no L2 for HTTP API with VPC Link) + const httpApi = new apigatewayv2.CfnApi(this, 'MailHttpApi', { name: 'mail-example', protocolType: 'HTTP' }); + const apiStage = new apigatewayv2.CfnStage(this, 'MailApiStage', { stageName: 'prod', apiId: httpApi.ref, autoDeploy: true }); - const apiMapping = - hasCustomDomain && apiDomainName - ? new apigatewayv2.CfnApiMapping(this, 'ApiMapping', { - apiId: mailHttpApi.ref, - domainName: apiDomainName.ref, - stage: mailApiStage.ref, - apiMappingKey: 'examples', - }) - : undefined; - if (apiMapping) { - apiMapping.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - } + const apiDomainName = hasCustomDomain ? new apigatewayv2.CfnDomainName(this, 'ApiDomainName', { + domainName: apiDomain, domainNameConfigurations: [{ certificateArn: certArn!, endpointType: 'REGIONAL', securityPolicy: 'TLS_1_2' }], + }) : undefined; - const apiDomainRecord = - hasCustomDomain && hasHostedZone && apiDomainName - ? new route53.CfnRecordSet(this, 'ApiDomainRecord', { - hostedZoneId, - name: apiCustomDomainName, - type: 'A', - aliasTarget: { - dnsName: apiDomainName.attrRegionalDomainName, - hostedZoneId: apiDomainName.attrRegionalHostedZoneId, - }, - }) - : undefined; - if (apiDomainRecord) { - apiDomainRecord.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - } - if (apiMapping && apiDomainName) { - apiMapping.addDependency(apiDomainName); - apiMapping.addDependency(mailApiStage); - } - if (apiDomainRecord && apiDomainName) { - apiDomainRecord.addDependency(apiDomainName); - } - - const baseUrl = hasCustomDomain - ? `https://${apiCustomDomainName}/examples/gmail-viewer` - : cdk.Fn.join('', [mailHttpApi.attrApiEndpoint, '/', mailApiStage.ref, '/gmail-viewer']); - - const serviceNamespace = new servicediscovery.CfnPrivateDnsNamespace(this, 'ServiceNamespace', { - name: serviceDiscoveryNamespaceName, - vpc: vpc.vpcId, - description: 'Namespace for mail services', - }); - serviceNamespace.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; + const apiMapping = hasCustomDomain && apiDomainName ? new apigatewayv2.CfnApiMapping(this, 'ApiMapping', { + apiId: httpApi.ref, domainName: apiDomainName.ref, stage: apiStage.ref, apiMappingKey: 'examples', + }) : undefined; + if (apiMapping && apiDomainName) { apiMapping.addDependency(apiDomainName); apiMapping.addDependency(apiStage); } - const apiVpcLink = new apigatewayv2.CfnVpcLink(this, 'ApiVpcLink', { - name: 'mail-example-vpclink', - subnetIds: serviceSubnetIds, - securityGroupIds: [apiVpcLinkSecurityGroup.ref], - }); - apiVpcLink.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; + const apiRecord = hasCustomDomain && hasHostedZone && apiDomainName ? new route53.CfnRecordSet(this, 'ApiDomainRecord', { + hostedZoneId: zoneId, name: apiDomain, type: 'A', aliasTarget: { dnsName: apiDomainName.attrRegionalDomainName, hostedZoneId: apiDomainName.attrRegionalHostedZoneId }, + }) : undefined; + if (apiRecord && apiDomainName) apiRecord.addDependency(apiDomainName); - const appCloudMapService = new servicediscovery.CfnService(this, 'AppCloudMapService', { - name: 'mail-example', - namespaceId: serviceNamespace.ref, - dnsConfig: { - routingPolicy: 'WEIGHTED', - dnsRecords: [ - { - ttl: serviceDiscoveryTtl, - type: 'SRV', - }, - ], - }, - healthCheckCustomConfig: { - failureThreshold: 1, - }, - }); - appCloudMapService.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; + const baseUrl = hasCustomDomain ? `https://${apiDomain}/examples/gmail-viewer` : cdk.Fn.join('', [httpApi.attrApiEndpoint, '/', apiStage.ref, '/gmail-viewer']); - const taskExecutionRole = new iam.CfnRole(this, 'TaskExecutionRole', { - assumeRolePolicyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { - Service: 'ecs-tasks.amazonaws.com', - }, - Action: 'sts:AssumeRole', - }, - ], - }, - managedPolicyArns: ['arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy'], - policies: [ - { - policyName: 'AllowParameterReadForSecrets', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath', 'kms:Decrypt'], - Resource: [ - `arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}*`, - `arn:aws:kms:${this.region}:${this.account}:key/*`, - ], - }, - ], - }, - }, - ], - }); - taskExecutionRole.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; + // Cloud Map Namespace (L2) + const namespace = new servicediscovery.PrivateDnsNamespace(this, 'ServiceNamespace', { name: nsName, vpc, description: 'Namespace for mail services' }); - const taskRole = new iam.CfnRole(this, 'TaskRole', { - assumeRolePolicyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { - Service: 'ecs-tasks.amazonaws.com', - }, - Action: 'sts:AssumeRole', - }, - ], - }, - policies: [ - { - policyName: 'AppRuntimeConfigRead', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath', 'kms:Decrypt'], - Resource: [ - `arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}*`, - `arn:aws:kms:${this.region}:${this.account}:key/*`, - ], - }, - ], - }, - }, - ], - }); - taskRole.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; + // VPC Link (L1) + const vpcLink = new apigatewayv2.CfnVpcLink(this, 'ApiVpcLink', { name: 'mail-example-vpclink', subnetIds: serviceSubnetIds, securityGroupIds: [apiVpcLinkSg.securityGroupId] }); - const appTaskDefinition = new ecs.CfnTaskDefinition(this, 'AppTaskDefinition', { - family: 'mail-example', - cpu: containerCpu.toString(), - memory: containerMemory.toString(), - networkMode: 'awsvpc', - requiresCompatibilities: ['FARGATE'], - executionRoleArn: taskExecutionRole.attrArn, - taskRoleArn: taskRole.attrArn, - containerDefinitions: [ - { - name: 'mail-example', - image: `${mailExampleRepository.attrRepositoryUri}:latest`, - portMappings: [ - { - containerPort, - }, - ], - logConfiguration: { - logDriver: 'awslogs', - options: { - 'awslogs-group': appLogGroup.ref, - 'awslogs-region': this.region, - 'awslogs-stream-prefix': 'mail-example', - }, - }, - environment: [ - { - name: 'CONFIG_SSM_PREFIX', - value: ssmPrefix, - }, - { - name: 'PORT', - value: containerPort.toString(), - }, - { - name: 'BASE_URL', - value: baseUrl.toString(), - }, - { - name: 'NODE_ENV', - value: publicEnvValue, - }, - ], - secrets: [ - { - name: 'GOOGLE_CLIENT_ID', - valueFrom: `arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}/env/GOOGLE_CLIENT_ID`, - }, - { - name: 'GOOGLE_CLIENT_SECRET', - valueFrom: `arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}/secrets/GOOGLE_CLIENT_SECRET`, - }, - { - name: 'SESSION_SECRET', - valueFrom: `arn:aws:ssm:${this.region}:${this.account}:parameter${ssmPrefix}/secrets/SESSION_SECRET`, - }, - ], - }, - ], + // Cloud Map Service (L2) + const cloudMapService = new servicediscovery.Service(this, 'AppCloudMapService', { + name: 'mail-example', namespace, dnsRecordType: servicediscovery.DnsRecordType.SRV, dnsTtl: nsTtl, routingPolicy: servicediscovery.RoutingPolicy.WEIGHTED, customHealthCheck: { failureThreshold: 1 }, }); - appTaskDefinition.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - new ecs.CfnService(this, 'AppService', { - serviceName: 'mail-example', - cluster: mailCluster.ref, - taskDefinition: appTaskDefinition.ref, - desiredCount, - capacityProviderStrategy: [ - { - capacityProvider: 'FARGATE_SPOT', - weight: 4, - }, - { - capacityProvider: 'FARGATE', - weight: 1, - }, - ], - deploymentConfiguration: { - maximumPercent: 200, - minimumHealthyPercent: 50, + // Secrets Manager - single secret with GOOGLE_CLIENT_SECRET and SESSION_SECRET + const appSecrets = new secretsmanager.Secret(this, 'AppSecrets', { + secretName: `${ssmPrefix}/secrets`, + description: 'Application secrets for mail-example', + secretObjectValue: { + GOOGLE_CLIENT_SECRET: cdk.SecretValue.unsafePlainText(googleClientSecret), + SESSION_SECRET: cdk.SecretValue.unsafePlainText(sessionSecretValue), }, - networkConfiguration: { - awsvpcConfiguration: { - assignPublicIp: 'DISABLED', - subnets: serviceSubnetIds, - securityGroups: [serviceSecurityGroup.ref], - }, - }, - serviceRegistries: [ - { - registryArn: appCloudMapService.attrArn, - containerName: 'mail-example', - containerPort: containerPort, - }, - ], - platformVersion: 'LATEST', - }); - - const mailIntegration = new apigatewayv2.CfnIntegration(this, 'MailIntegration', { - apiId: mailHttpApi.ref, - integrationType: 'HTTP_PROXY', - integrationMethod: 'ANY', - integrationUri: appCloudMapService.attrArn, - connectionType: 'VPC_LINK', - connectionId: apiVpcLink.ref, - payloadFormatVersion: '1.0', - }); - - new apigatewayv2.CfnRoute(this, 'GmailViewerRoute', { - apiId: mailHttpApi.ref, - routeKey: 'ANY /gmail-viewer', - target: `integrations/${mailIntegration.ref}`, - }); - - new apigatewayv2.CfnRoute(this, 'GmailViewerProxyRoute', { - apiId: mailHttpApi.ref, - routeKey: 'ANY /gmail-viewer/{proxy+}', - target: `integrations/${mailIntegration.ref}`, - }); - - const ssmBaseUrl = new ssm.StringParameter(this, 'SsmBaseUrl', { - parameterName: `${ssmPrefix}/env/BASE_URL`, - stringValue: baseUrl, - type: ssm.ParameterType.STRING, - }); - (ssmBaseUrl.node.defaultChild as ssm.CfnParameter).cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - - const ssmGoogleClientId = new ssm.StringParameter(this, 'SsmGoogleClientId', { - parameterName: `${ssmPrefix}/env/GOOGLE_CLIENT_ID`, - stringValue: googleClientId, - type: ssm.ParameterType.STRING, - }); - (ssmGoogleClientId.node.defaultChild as ssm.CfnParameter).cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - - const ssmGoogleClientSecret = new ssm.StringParameter(this, 'SsmGoogleClientSecret', { - parameterName: `${ssmPrefix}/secrets/GOOGLE_CLIENT_SECRET`, - stringValue: googleClientSecret, - type: ssm.ParameterType.STRING, - }); - (ssmGoogleClientSecret.node.defaultChild as ssm.CfnParameter).cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - - const ssmPort = new ssm.StringParameter(this, 'SsmPort', { - parameterName: `${ssmPrefix}/env/PORT`, - stringValue: containerPort.toString(), - type: ssm.ParameterType.STRING, - }); - (ssmPort.node.defaultChild as ssm.CfnParameter).cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - - const ssmPublicEnv = new ssm.StringParameter(this, 'SsmPublicEnv', { - parameterName: `${ssmPrefix}/env/NODE_ENV`, - stringValue: publicEnvValue, - type: ssm.ParameterType.STRING, }); - (ssmPublicEnv.node.defaultChild as ssm.CfnParameter).cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - const ssmSessionSecret = new ssm.StringParameter(this, 'SsmSessionSecret', { - parameterName: `${ssmPrefix}/secrets/SESSION_SECRET`, - stringValue: sessionSecretValue, - type: ssm.ParameterType.STRING, - }); - (ssmSessionSecret.node.defaultChild as ssm.CfnParameter).cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - - const codeBuildRole = new iam.CfnRole(this, 'CodeBuildRole', { - assumeRolePolicyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { - Service: 'codebuild.amazonaws.com', - }, - Action: 'sts:AssumeRole', - }, - ], + // IAM Roles (L2) + const taskExecRole = new iam.Role(this, 'TaskExecutionRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AmazonECSTaskExecutionRolePolicy')] }); + taskExecRole.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/*`] })); + taskExecRole.addToPolicy(new iam.PolicyStatement({ actions: ['secretsmanager:GetSecretValue'], resources: [appSecrets.secretArn] })); + + 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', { + image: ecs.ContainerImage.fromEcrRepository(ecrRepo, 'latest'), portMappings: [{ containerPort }], + 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_SECRET: ecs.Secret.fromSecretsManager(appSecrets, 'GOOGLE_CLIENT_SECRET'), + SESSION_SECRET: ecs.Secret.fromSecretsManager(appSecrets, 'SESSION_SECRET'), }, - policies: [ - { - policyName: 'BuildLogs', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents'], - Resource: '*', - }, - ], - }, - }, - { - policyName: 'ECRPush', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 'ecr:GetAuthorizationToken', - 'ecr:BatchCheckLayerAvailability', - 'ecr:CompleteLayerUpload', - 'ecr:BatchGetImage', - 'ecr:DescribeRepositories', - 'ecr:InitiateLayerUpload', - 'ecr:PutImage', - 'ecr:UploadLayerPart', - ], - Resource: '*', - }, - ], - }, - }, - { - policyName: 'ECSDeploy', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['ecs:UpdateService', 'ecs:DescribeServices', 'ecs:DescribeClusters'], - Resource: '*', - }, - ], - }, - }, - { - policyName: 'SSMReadForBuild', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath'], - Resource: '*', - }, - ], - }, - }, - { - policyName: 'CodeConnectionAccess', - policyDocument: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - "codeconnections:GetConnection", - "codeconnections:GetConnectionToken", - "codeconnections:UseConnection" - ], - Resource: props.codeConnectionArn, - }, - ], - }, - } - ], }); - codeBuildRole.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - - // Use the higher-level Project construct so we can provide a typed BuildSpec - const codebuildRoleRef = iam.Role.fromRoleArn(this, 'CodeBuildRoleRef', codeBuildRole.attrArn); - const codeBuildProject = new codebuild.Project(this, 'CodeBuildProject', { - projectName: 'mail-example', - role: codebuildRoleRef, - environment: { - buildImage: codebuild.LinuxBuildImage.STANDARD_7_0, - computeType: codebuild.ComputeType.SMALL, - privileged: true, - environmentVariables: { - ECR_URI: { value: mailExampleRepository.attrRepositoryUri }, - CLUSTER_NAME: { value: mailCluster.ref }, - SERVICE_NAME: { value: 'mail-example' }, - }, - }, - source: codebuild.Source.gitHub({ owner: gitHubOwner, repo: gitHubRepo, branchOrRef: gitHubBranch, }), - timeout: cdk.Duration.minutes(30), - queuedTimeout: cdk.Duration.minutes(30), - badge: true, - description: 'Build & deploy mail-example to ECR then force ECS deploy', - cache: codebuild.Cache.none(), + // ECS Service (L2) - associate with standalone Cloud Map service for API Gateway integration + const service = new ecs.FargateService(this, 'AppService', { + serviceName: 'mail-example', cluster, taskDefinition: taskDef, desiredCount, + capacityProviderStrategies: [{ capacityProvider: 'FARGATE_SPOT', weight: 4 }, { capacityProvider: 'FARGATE', weight: 1 }], + vpcSubnets: { subnets: serviceSubnetIds.map((id, i) => ec2.Subnet.fromSubnetId(this, `ServiceSubnet${i}`, id)) }, + securityGroups: [serviceSg], assignPublicIp: usePublicSubnets ?? false, minHealthyPercent: 50, maxHealthyPercent: 200, + }); + service.associateCloudMapService({ service: cloudMapService, containerPort, container: taskDef.defaultContainer! }); + + // API Gateway Integration (L1) + const integration = new apigatewayv2.CfnIntegration(this, 'MailIntegration', { apiId: httpApi.ref, integrationType: 'HTTP_PROXY', integrationMethod: 'ANY', integrationUri: cloudMapService.serviceArn, connectionType: 'VPC_LINK', connectionId: vpcLink.ref, payloadFormatVersion: '1.0' }); + new apigatewayv2.CfnRoute(this, 'GmailViewerRoute', { apiId: httpApi.ref, routeKey: 'ANY /gmail-viewer', target: `integrations/${integration.ref}` }); + new apigatewayv2.CfnRoute(this, 'GmailViewerProxyRoute', { apiId: httpApi.ref, routeKey: 'ANY /gmail-viewer/{proxy+}', target: `integrations/${integration.ref}` }); + + // CodeBuild Role (L2) + const buildRole = new iam.Role(this, 'CodeBuildRole', { assumedBy: new iam.ServicePrincipal('codebuild.amazonaws.com') }); + buildRole.addToPolicy(new iam.PolicyStatement({ actions: ['logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents'], resources: ['*'] })); + buildRole.addToPolicy(new iam.PolicyStatement({ actions: ['ecr:GetAuthorizationToken', 'ecr:BatchCheckLayerAvailability', 'ecr:CompleteLayerUpload', 'ecr:BatchGetImage', 'ecr:DescribeRepositories', 'ecr:InitiateLayerUpload', 'ecr:PutImage', 'ecr:UploadLayerPart'], resources: ['*'] })); + buildRole.addToPolicy(new iam.PolicyStatement({ actions: ['ecs:UpdateService', 'ecs:DescribeServices', 'ecs:DescribeClusters'], resources: ['*'] })); + buildRole.addToPolicy(new iam.PolicyStatement({ actions: ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath'], resources: ['*'] })); + if (props.codeConnectionArn) buildRole.addToPolicy(new iam.PolicyStatement({ actions: ['codeconnections:GetConnection', 'codeconnections:GetConnectionToken', 'codeconnections:UseConnection'], resources: [props.codeConnectionArn] })); + + // CodeBuild Project (L2) + new codebuild.Project(this, 'CodeBuildProject', { + projectName: 'mail-example', role: buildRole, + environment: { buildImage: codebuild.LinuxBuildImage.STANDARD_7_0, computeType: codebuild.ComputeType.SMALL, privileged: true, environmentVariables: { ECR_URI: { value: ecrRepo.repositoryUri }, CLUSTER_NAME: { value: cluster.clusterName }, SERVICE_NAME: { value: 'mail-example' } } }, + source: codebuild.Source.gitHub({ owner: gitHubOwner, repo: gitHubRepo, branchOrRef: gitHubBranch }), + timeout: cdk.Duration.minutes(30), queuedTimeout: cdk.Duration.minutes(30), badge: true, description: 'Build & deploy mail-example to ECR then force ECS deploy', buildSpec: codebuild.BuildSpec.fromObject({ version: '0.2', phases: { - pre_build: { commands: [ - 'echo "Logging in to ECR"', - 'aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_URI', - 'IMAGE_TAG=${CODEBUILD_RESOLVED_SOURCE_VERSION:-latest}', - ]}, - build: { commands: [ - 'cd examples/gmail-viewer', - 'docker build -t $ECR_URI:latest -t $ECR_URI:$IMAGE_TAG .', - ] }, - post_build: { commands: [ - 'docker push $ECR_URI:latest', - 'docker push $ECR_URI:$IMAGE_TAG', - 'aws ecs update-service --cluster $CLUSTER_NAME --service $SERVICE_NAME --force-new-deployment', - ]}, + pre_build: { commands: ['echo "Logging in to ECR"', 'aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_URI', 'IMAGE_TAG=${CODEBUILD_RESOLVED_SOURCE_VERSION:-latest}'] }, + build: { commands: ['cd examples/gmail-viewer', 'docker build -t $ECR_URI:latest -t $ECR_URI:$IMAGE_TAG .'] }, + post_build: { commands: ['docker push $ECR_URI:latest', 'docker push $ECR_URI:$IMAGE_TAG', 'aws ecs update-service --cluster $CLUSTER_NAME --service $SERVICE_NAME --force-new-deployment'] }, }, - artifacts: { files: [] }, - env: { shell: 'bash' }, + artifacts: { files: [] }, env: { shell: 'bash' }, }), }); - (codeBuildProject.node.defaultChild as codebuild.CfnProject).cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE; - this.clusterName = mailCluster.ref; - new cdk.CfnOutput(this, 'CfnOutputClusterName', { - key: 'ClusterName', - value: this.clusterName.toString(), - }); - this.repositoryUri = mailExampleRepository.attrRepositoryUri; - new cdk.CfnOutput(this, 'CfnOutputRepositoryUri', { - key: 'RepositoryUri', - value: this.repositoryUri.toString(), - }); + // Outputs + this.clusterName = cluster.clusterName; + new cdk.CfnOutput(this, 'ClusterName', { value: this.clusterName }); + this.repositoryUri = ecrRepo.repositoryUri; + new cdk.CfnOutput(this, 'RepositoryUri', { value: this.repositoryUri }); this.apiInvokeUrl = baseUrl.toString(); - new cdk.CfnOutput(this, 'CfnOutputApiInvokeUrl', { - key: 'ApiInvokeUrl', - value: this.apiInvokeUrl, - }); - this.cloudMapServiceArn = appCloudMapService.attrArn; - new cdk.CfnOutput(this, 'CfnOutputCloudMapServiceArn', { - key: 'CloudMapServiceArn', - value: this.cloudMapServiceArn.toString(), - }); + new cdk.CfnOutput(this, 'ApiInvokeUrl', { value: this.apiInvokeUrl }); + this.cloudMapServiceArn = cloudMapService.serviceArn; + new cdk.CfnOutput(this, 'CloudMapServiceArn', { value: this.cloudMapServiceArn }); } } diff --git a/examples/gmail-viewer/package-lock.json b/examples/gmail-viewer/package-lock.json index bfb97ff..82025b0 100644 --- a/examples/gmail-viewer/package-lock.json +++ b/examples/gmail-viewer/package-lock.json @@ -9,6 +9,9 @@ "version": "0.5.2", "license": "MIT", "dependencies": { + "@aws-sdk/client-s3": "^3.0.0", + "@aws-sdk/client-secrets-manager": "^3.0.0", + "@aws-sdk/client-ssm": "^3.0.0", "@dyanet/config-aws": "^1.0.3", "@dyanet/imap": "^0.5.2", "express": "^4.21.0", @@ -16,50 +19,1781 @@ "helmet": "^8.0.0", "zod": "^3.22.0" }, - "devDependencies": { - "@types/express": "^5.0.0", - "@types/express-session": "^1.18.0", - "@types/node": "^20.10.0", - "typescript": "^5.3.0" + "devDependencies": { + "@types/express": "^5.0.0", + "@types/express-session": "^1.18.0", + "@types/node": "^20.10.0", + "typescript": "^5.3.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.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", + "integrity": "sha512-I2/1McBZCcM3PfM4ck8D6gnZR3K7+yl1fGkwTq/3ThEn9tdLjNwcdgTbPfxfX6LoecLrH9Ekoo+D9nmQ0T261w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@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-bucket-endpoint": "3.957.0", + "@aws-sdk/middleware-expect-continue": "3.957.0", + "@aws-sdk/middleware-flexible-checksums": "3.957.0", + "@aws-sdk/middleware-host-header": "3.957.0", + "@aws-sdk/middleware-location-constraint": "3.957.0", + "@aws-sdk/middleware-logger": "3.957.0", + "@aws-sdk/middleware-recursion-detection": "3.957.0", + "@aws-sdk/middleware-sdk-s3": "3.957.0", + "@aws-sdk/middleware-ssec": "3.957.0", + "@aws-sdk/middleware-user-agent": "3.957.0", + "@aws-sdk/region-config-resolver": "3.957.0", + "@aws-sdk/signature-v4-multi-region": "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/eventstream-serde-browser": "^4.2.7", + "@smithy/eventstream-serde-config-resolver": "^4.3.7", + "@smithy/eventstream-serde-node": "^4.2.7", + "@smithy/fetch-http-handler": "^5.3.8", + "@smithy/hash-blob-browser": "^4.2.8", + "@smithy/hash-node": "^4.2.7", + "@smithy/hash-stream-node": "^4.2.7", + "@smithy/invalid-dependency": "^4.2.7", + "@smithy/md5-js": "^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-stream": "^4.5.8", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-secrets-manager": { + "version": "3.962.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.962.0.tgz", + "integrity": "sha512-UwXvVou6ACuYYEcdRjRVVq/M6w7X1kly80kavd0GdaPG0ZUhwGOfd3K5nqqwBM+meEcnQiAF2rTlHZ1yw/+e3w==", + "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-ssm": { + "version": "3.962.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.962.0.tgz", + "integrity": "sha512-UONnQGDp+02fh4M4ym44Zzato39O36JoJ+vvLKMsAfPJ70dhSbtO0xnMBhUtmNZ3d68JtCa6gBzXileSIKCNhw==", + "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", + "@smithy/util-waiter": "^4.2.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.958.0.tgz", + "integrity": "sha512-6qNCIeaMzKzfqasy2nNRuYnMuaMebCcCPP4J2CVGkA8QYMbIVKPlkn9bpB20Vxe6H/r3jtCCLQaOJjVTx/6dXg==", + "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/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/core": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.957.0.tgz", + "integrity": "sha512-DrZgDnF1lQZv75a52nFWs6MExihJF2GZB6ETZRqr6jMwhrk2kbJPUtvgbifwcL7AYmVqHQDJBrR/MqkwwFCpiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@aws-sdk/xml-builder": "3.957.0", + "@smithy/core": "^3.20.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/signature-v4": "^5.3.7", + "@smithy/smithy-client": "^4.10.2", + "@smithy/types": "^4.11.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/crc64-nvme": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.957.0.tgz", + "integrity": "sha512-qSwSfI+qBU9HDsd6/4fM9faCxYJx2yDuHtj+NVOQ6XYDWQzFab/hUdwuKZ77Pi6goLF1pBZhJ2azaC2w7LbnTA==", + "license": "Apache-2.0", + "dependencies": { + "@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", + "integrity": "sha512-475mkhGaWCr+Z52fOOVb/q2VHuNvqEDixlYIkeaO6xJ6t9qR0wpLt4hOQaR6zR1wfZV0SlE7d8RErdYq/PByog==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.957.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-http": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.957.0.tgz", + "integrity": "sha512-8dS55QHRxXgJlHkEYaCGZIhieCs9NU1HU1BcqQ4RfUdSsfRdxxktqUKgCnBnOOn0oD3PPA8cQOCAVgIyRb3Rfw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@smithy/fetch-http-handler": "^5.3.8", + "@smithy/node-http-handler": "^4.4.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/smithy-client": "^4.10.2", + "@smithy/types": "^4.11.0", + "@smithy/util-stream": "^4.5.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.962.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.962.0.tgz", + "integrity": "sha512-h0kVnXLW2d3nxbcrR/Pfg3W/+YoCguasWz7/3nYzVqmdKarGrpJzaFdoZtLgvDSZ8VgWUC4lWOTcsDMV0UNqUQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.957.0", + "@aws-sdk/credential-provider-env": "3.957.0", + "@aws-sdk/credential-provider-http": "3.957.0", + "@aws-sdk/credential-provider-login": "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/credential-provider-imds": "^4.2.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.962.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.962.0.tgz", + "integrity": "sha512-kHYH6Av2UifG3mPkpPUNRh/PuX6adaAcpmsclJdHdxlixMCRdh8GNeEihq480DC0GmfqdpoSf1w2CLmLLPIS6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.957.0", + "@aws-sdk/nested-clients": "3.958.0", + "@aws-sdk/types": "3.957.0", + "@smithy/property-provider": "^4.2.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.962.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.962.0.tgz", + "integrity": "sha512-CS78NsWRxLa+nWqeWBEYMZTLacMFIXs1C5WJuM9kD05LLiWL32ksljoPsvNN24Bc7rCSQIIMx/U3KGvkDVZMVg==", + "license": "Apache-2.0", + "dependencies": { + "@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-process": "3.957.0", + "@aws-sdk/credential-provider-sso": "3.958.0", + "@aws-sdk/credential-provider-web-identity": "3.958.0", + "@aws-sdk/types": "3.957.0", + "@smithy/credential-provider-imds": "^4.2.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.957.0.tgz", + "integrity": "sha512-/KIz9kadwbeLy6SKvT79W81Y+hb/8LMDyeloA2zhouE28hmne+hLn0wNCQXAAupFFlYOAtZR2NTBs7HBAReJlg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@smithy/property-provider": "^4.2.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.958.0.tgz", + "integrity": "sha512-CBYHJ5ufp8HC4q+o7IJejCUctJXWaksgpmoFpXerbjAso7/Fg7LLUu9inXVOxlHKLlvYekDXjIUBXDJS2WYdgg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.958.0", + "@aws-sdk/core": "3.957.0", + "@aws-sdk/token-providers": "3.958.0", + "@aws-sdk/types": "3.957.0", + "@smithy/property-provider": "^4.2.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.958.0.tgz", + "integrity": "sha512-dgnvwjMq5Y66WozzUzxNkCFap+umHUtqMMKlr8z/vl9NYMLem/WUbWNpFFOVFWquXikc+ewtpBMR4KEDXfZ+KA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.957.0", + "@aws-sdk/nested-clients": "3.958.0", + "@aws-sdk/types": "3.957.0", + "@smithy/property-provider": "^4.2.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@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", + "integrity": "sha512-iczcn/QRIBSpvsdAS/rbzmoBpleX1JBjXvCynMbDceVLBIcVrwT1hXECrhtIC2cjh4HaLo9ClAbiOiWuqt+6MA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@aws-sdk/util-arn-parser": "3.957.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.957.0.tgz", + "integrity": "sha512-AlbK3OeVNwZZil0wlClgeI/ISlOt/SPUxBsIns876IFaVu/Pj3DgImnYhpcJuFRek4r4XM51xzIaGQXM6GDHGg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.957.0.tgz", + "integrity": "sha512-iJpeVR5V8se1hl2pt+k8bF/e9JO4KWgPCMjg8BtRspNtKIUGy7j6msYvbDixaKZaF2Veg9+HoYcOhwnZumjXSA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.957.0", + "@aws-sdk/crc64-nvme": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-stream": "^4.5.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.957.0.tgz", + "integrity": "sha512-BBgKawVyfQZglEkNTuBBdC3azlyqNXsvvN4jPkWAiNYcY0x1BasaJFl+7u/HisfULstryweJq/dAvIZIxzlZaA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.957.0.tgz", + "integrity": "sha512-y8/W7TOQpmDJg/fPYlqAhwA4+I15LrS7TwgUEoxogtkD8gfur9wFMRLT8LCyc9o4NMEcAnK50hSb4+wB0qv6tQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.957.0.tgz", + "integrity": "sha512-w1qfKrSKHf9b5a8O76yQ1t69u6NWuBjr5kBX+jRWFx/5mu6RLpqERXRpVJxfosbep7k3B+DSB5tZMZ82GKcJtQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.957.0.tgz", + "integrity": "sha512-D2H/WoxhAZNYX+IjkKTdOhOkWQaK0jjJrDBj56hKjU5c9ltQiaX/1PqJ4dfjHntEshJfu0w+E6XJ+/6A6ILBBA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.957.0.tgz", + "integrity": "sha512-5B2qY2nR2LYpxoQP0xUum5A1UNvH2JQpLHDH1nWFNF/XetV7ipFHksMxPNhtJJ6ARaWhQIDXfOUj0jcnkJxXUg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@aws-sdk/util-arn-parser": "3.957.0", + "@smithy/core": "^3.20.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/signature-v4": "^5.3.7", + "@smithy/smithy-client": "^4.10.2", + "@smithy/types": "^4.11.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-stream": "^4.5.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.957.0.tgz", + "integrity": "sha512-qwkmrK0lizdjNt5qxl4tHYfASh8DFpHXM1iDVo+qHe+zuslfMqQEGRkzxS8tJq/I+8F0c6v3IKOveKJAfIvfqQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.957.0.tgz", + "integrity": "sha512-50vcHu96XakQnIvlKJ1UoltrFODjsq2KvtTgHiPFteUS884lQnK5VC/8xd1Msz/1ONpLMzdCVproCQqhDTtMPQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@aws-sdk/util-endpoints": "3.957.0", + "@smithy/core": "^3.20.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.958.0.tgz", + "integrity": "sha512-/KuCcS8b5TpQXkYOrPLYytrgxBhv81+5pChkOlhegbeHttjM69pyUpQVJqyfDM/A7wPLnDrzCAnk4zaAOkY0Nw==", + "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/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/region-config-resolver": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.957.0.tgz", + "integrity": "sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@smithy/config-resolver": "^4.4.5", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.957.0.tgz", + "integrity": "sha512-t6UfP1xMUigMMzHcb7vaZcjv7dA2DQkk9C/OAP1dKyrE0vb4lFGDaTApi17GN6Km9zFxJthEMUbBc7DL0hq1Bg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/signature-v4": "^5.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.958.0.tgz", + "integrity": "sha512-UCj7lQXODduD1myNJQkV+LYcGYJ9iiMggR8ow8Hva1g3A/Na5imNXzz6O67k7DAee0TYpy+gkNw+SizC6min8Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.957.0", + "@aws-sdk/nested-clients": "3.958.0", + "@aws-sdk/types": "3.957.0", + "@smithy/property-provider": "^4.2.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", + "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.957.0.tgz", + "integrity": "sha512-Aj6m+AyrhWyg8YQ4LDPg2/gIfGHCEcoQdBt5DeSFogN5k9mmJPOJ+IAmNSWmWRjpOxEy6eY813RNDI6qS97M0g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.957.0.tgz", + "integrity": "sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-endpoints": "^3.2.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.957.0.tgz", + "integrity": "sha512-nhmgKHnNV9K+i9daumaIz8JTLsIIML9PE/HUks5liyrjUzenjW/aHoc7WJ9/Td/gPZtayxFnXQSJRb/fDlBuJw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.957.0.tgz", + "integrity": "sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@smithy/types": "^4.11.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.957.0.tgz", + "integrity": "sha512-ycbYCwqXk4gJGp0Oxkzf2KBeeGBdTxz559D41NJP8FlzSej1Gh7Rk40Zo6AyTfsNWkrl/kVi1t937OIzC5t+9Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.957.0.tgz", + "integrity": "sha512-Ai5iiQqS8kJ5PjzMhWcLKN0G2yasAkvpnPlq2EnqlIMdB48HsizElt62qcktdxp4neRMyGkFq4NzgmDbXnhRiA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz", + "integrity": "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@dyanet/config-aws": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@dyanet/config-aws/-/config-aws-1.0.3.tgz", + "integrity": "sha512-Y7Wr9MWU+5rRrwg8Wr/5bqufdZWZvo8l3OZd18oCetRT9935+aPVdNP0IuGwLocitQoz+pP91x4G/3bIe/PIOg==", + "license": "MIT", + "engines": { + "node": ">=20.0.0", + "npm": ">=10.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.0.0", + "@aws-sdk/client-secrets-manager": "^3.0.0", + "@aws-sdk/client-ssm": "^3.0.0", + "zod": "^3.22.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-s3": { + "optional": true + }, + "@aws-sdk/client-secrets-manager": { + "optional": true + }, + "@aws-sdk/client-ssm": { + "optional": true + } + } + }, + "node_modules/@dyanet/imap": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@dyanet/imap/-/imap-0.5.2.tgz", + "integrity": "sha512-VwxFsqCY4DKct4A+bHzLpBex7UrwWE4p0DsLrA6Bjuwftxmtm7HkkENuRwEZOlw020XDIAfbWMKXWd/n8M/N0A==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.7.tgz", + "integrity": "sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", + "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", + "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.5.tgz", + "integrity": "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.7", + "@smithy/types": "^4.11.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.7", + "@smithy/util-middleware": "^4.2.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.20.0.tgz", + "integrity": "sha512-WsSHCPq/neD5G/MkK4csLI5Y5Pkd9c1NMfpYEKeghSGaD4Ja1qLIohRQf2D5c1Uy5aXp76DeKHkzWZ9KAlHroQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.8", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-stream": "^4.5.8", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz", + "integrity": "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.7.tgz", + "integrity": "sha512-DrpkEoM3j9cBBWhufqBwnbbn+3nf1N9FP6xuVJ+e220jbactKuQgaZwjwP5CP1t+O94brm2JgVMD2atMGX3xIQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.11.0", + "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.7.tgz", + "integrity": "sha512-ujzPk8seYoDBmABDE5YqlhQZAXLOrtxtJLrbhHMKjBoG5b4dK4i6/mEU+6/7yXIAkqOO8sJ6YxZl+h0QQ1IJ7g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.7.tgz", + "integrity": "sha512-x7BtAiIPSaNaWuzm24Q/mtSkv+BrISO/fmheiJ39PKRNH3RmH2Hph/bUKSOBOBC9unqfIYDhKTHwpyZycLGPVQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.7.tgz", + "integrity": "sha512-roySCtHC5+pQq5lK4be1fZ/WR6s/AxnPaLfCODIPArtN2du8s5Ot4mKVK3pPtijL/L654ws592JHJ1PbZFF6+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.7.tgz", + "integrity": "sha512-QVD+g3+icFkThoy4r8wVFZMsIP08taHVKjE6Jpmz8h5CgX/kk6pTODq5cht0OMtcapUx+xrPzUTQdA+TmO0m1g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.8.tgz", + "integrity": "sha512-h/Fi+o7mti4n8wx1SR6UHWLaakwHRx29sizvp8OOm7iqwKGFneT06GCSFhml6Bha5BT6ot5pj3CYZnCHhGC2Rg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.7", + "@smithy/querystring-builder": "^4.2.7", + "@smithy/types": "^4.11.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.8.tgz", + "integrity": "sha512-07InZontqsM1ggTCPSRgI7d8DirqRrnpL7nIACT4PW0AWrgDiHhjGZzbAE5UtRSiU0NISGUYe7/rri9ZeWyDpw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/chunked-blob-reader": "^5.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.1", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", + "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.7.tgz", + "integrity": "sha512-ZQVoAwNYnFMIbd4DUc517HuwNelJUY6YOzwqrbcAgCnVn+79/OK7UjwA93SPpdTOpKDVkLIzavWm/Ck7SmnDPQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", + "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.7.tgz", + "integrity": "sha512-Wv6JcUxtOLTnxvNjDnAiATUsk8gvA6EeS8zzHig07dotpByYsLot+m0AaQEniUBjx97AC41MQR4hW0baraD1Xw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", + "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.1.tgz", + "integrity": "sha512-gpLspUAoe6f1M6H0u4cVuFzxZBrsGZmjx2O9SigurTx4PbntYa4AJ+o0G0oGm1L2oSX6oBhcGHwrfJHup2JnJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.20.0", + "@smithy/middleware-serde": "^4.2.8", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-middleware": "^4.2.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.4.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.17.tgz", + "integrity": "sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/service-error-classification": "^4.2.7", + "@smithy/smithy-client": "^4.10.2", + "@smithy/types": "^4.11.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-retry": "^4.2.7", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.8.tgz", + "integrity": "sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.7.tgz", + "integrity": "sha512-bsOT0rJ+HHlZd9crHoS37mt8qRRN/h9jRve1SXUhVbkRzu0QaNYZp1i1jha4n098tsvROjcwfLlfvcFuJSXEsw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=18.0.0" } }, - "node_modules/@dyanet/config-aws": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@dyanet/config-aws/-/config-aws-1.0.3.tgz", - "integrity": "sha512-Y7Wr9MWU+5rRrwg8Wr/5bqufdZWZvo8l3OZd18oCetRT9935+aPVdNP0IuGwLocitQoz+pP91x4G/3bIe/PIOg==", - "license": "MIT", + "node_modules/@smithy/node-config-provider": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.7.tgz", + "integrity": "sha512-7r58wq8sdOcrwWe+klL9y3bc4GW1gnlfnFOuL7CXa7UzfhzhxKuzNdtqgzmTV+53lEp9NXh5hY/S4UgjLOzPfw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=20.0.0", - "npm": ">=10.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.7.tgz", + "integrity": "sha512-NELpdmBOO6EpZtWgQiHjoShs1kmweaiNuETUpuup+cmm/xJYjT4eUjfhrXRP4jCOaAsS3c3yPsP3B+K+/fyPCQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/querystring-builder": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-s3": "^3.0.0", - "@aws-sdk/client-secrets-manager": "^3.0.0", - "@aws-sdk/client-ssm": "^3.0.0", - "zod": "^3.22.0" + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.7.tgz", + "integrity": "sha512-jmNYKe9MGGPoSl/D7JDDs1C8b3dC8f/w78LbaVfoTtWy4xAd5dfjaFG9c9PWPihY4ggMQNQSMtzU77CNgAJwmA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" }, - "peerDependenciesMeta": { - "@aws-sdk/client-s3": { - "optional": true - }, - "@aws-sdk/client-secrets-manager": { - "optional": true - }, - "@aws-sdk/client-ssm": { - "optional": true - } + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@dyanet/imap": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@dyanet/imap/-/imap-0.5.2.tgz", - "integrity": "sha512-VwxFsqCY4DKct4A+bHzLpBex7UrwWE4p0DsLrA6Bjuwftxmtm7HkkENuRwEZOlw020XDIAfbWMKXWd/n8M/N0A==", - "license": "MIT", + "node_modules/@smithy/protocol-http": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.7.tgz", + "integrity": "sha512-1r07pb994I20dD/c2seaZhoCuNYm0rWrvBxhCQ70brNh11M5Ml2ew6qJVo0lclB3jMIXirD4s2XRXRe7QEi0xA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=20.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.7.tgz", + "integrity": "sha512-eKONSywHZxK4tBxe2lXEysh8wbBdvDWiA+RIuaxZSgCMmA0zMgoDpGLJhnyj+c0leOQprVnXOmcB4m+W9Rw7sg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.7.tgz", + "integrity": "sha512-3X5ZvzUHmlSTHAXFlswrS6EGt8fMSIxX/c3Rm1Pni3+wYWB6cjGocmRIoqcQF9nU5OgGmL0u7l9m44tSUpfj9w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", + "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.2.tgz", + "integrity": "sha512-M7iUUff/KwfNunmrgtqBfvZSzh3bmFgv/j/t1Y1dQ+8dNo34br1cqVEqy6v0mYEgi0DkGO7Xig0AnuOaEGVlcg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.7.tgz", + "integrity": "sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.2.tgz", + "integrity": "sha512-D5z79xQWpgrGpAHb054Fn2CCTQZpog7JELbVQ6XAvXs5MNKWf28U9gzSBlJkOyMl9LA1TZEjRtwvGXfP0Sl90g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.20.0", + "@smithy/middleware-endpoint": "^4.4.1", + "@smithy/middleware-stack": "^4.2.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "@smithy/util-stream": "^4.5.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.11.0.tgz", + "integrity": "sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.7.tgz", + "integrity": "sha512-/RLtVsRV4uY3qPWhBDsjwahAtt3x2IsMGnP5W1b2VZIe+qgCqkLxI1UOHDZp1Q1QSOrdOR32MF3Ph2JfWT1VHg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.16.tgz", + "integrity": "sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.7", + "@smithy/smithy-client": "^4.10.2", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.19", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.19.tgz", + "integrity": "sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.5", + "@smithy/credential-provider-imds": "^4.2.7", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/smithy-client": "^4.10.2", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.7.tgz", + "integrity": "sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.7.tgz", + "integrity": "sha512-i1IkpbOae6NvIKsEeLLM9/2q4X+M90KV3oCFgWQI4q0Qz+yUZvsr+gZPdAEAtFhWQhAHpTsJO8DRJPuwVyln+w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", + "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.8.tgz", + "integrity": "sha512-ZnnBhTapjM0YPGUSmOs0Mcg/Gg87k503qG4zU2v/+Js2Gu+daKOJMeqcQns8ajepY8tgzzfYxl6kQyZKml6O2w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.8", + "@smithy/node-http-handler": "^4.4.7", + "@smithy/types": "^4.11.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.7.tgz", + "integrity": "sha512-vHJFXi9b7kUEpHWUCY3Twl+9NPOZvQ0SAi+Ewtn48mbiJk4JY9MZmKQjGB4SCvVb9WPiSphZJYY6RIbs+grrzw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@types/body-parser": { @@ -213,6 +1947,12 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/bowser": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", + "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", + "license": "MIT" + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -454,6 +2194,24 @@ "node": ">= 0.8.0" } }, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/finalhandler": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", @@ -979,6 +2737,18 @@ "node": ">= 0.8" } }, + "node_modules/strnum": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -988,6 +2758,12 @@ "node": ">=0.6" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", diff --git a/examples/gmail-viewer/package.json b/examples/gmail-viewer/package.json index 0ce9b40..20e4523 100644 --- a/examples/gmail-viewer/package.json +++ b/examples/gmail-viewer/package.json @@ -20,6 +20,9 @@ "author": "", "license": "MIT", "dependencies": { + "@aws-sdk/client-s3": "^3.0.0", + "@aws-sdk/client-secrets-manager": "^3.0.0", + "@aws-sdk/client-ssm": "^3.0.0", "@dyanet/config-aws": "^1.0.3", "@dyanet/imap": "^0.5.2", "express": "^4.21.0",