@aws-cdk/app-staging-synthesizer-alpha 2.126.0-alpha.0 → 2.128.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -8,7 +8,7 @@
8
8
  "url": "https://aws.amazon.com"
9
9
  },
10
10
  "dependencies": {
11
- "aws-cdk-lib": "^2.126.0",
11
+ "aws-cdk-lib": "^2.128.0",
12
12
  "constructs": "^10.0.0"
13
13
  },
14
14
  "dependencyClosure": {
@@ -3202,19 +3202,6 @@
3202
3202
  }
3203
3203
  }
3204
3204
  },
3205
- "aws-cdk-lib.aws_ssmguiconnect": {
3206
- "targets": {
3207
- "dotnet": {
3208
- "package": "Amazon.CDK.AWS.SSMGuiConnect"
3209
- },
3210
- "java": {
3211
- "package": "software.amazon.awscdk.services.ssmguiconnect"
3212
- },
3213
- "python": {
3214
- "module": "aws_cdk.aws_ssmguiconnect"
3215
- }
3216
- }
3217
- },
3218
3205
  "aws-cdk-lib.aws_ssmincidents": {
3219
3206
  "targets": {
3220
3207
  "dotnet": {
@@ -3682,7 +3669,7 @@
3682
3669
  },
3683
3670
  "name": "@aws-cdk/app-staging-synthesizer-alpha",
3684
3671
  "readme": {
3685
- "markdown": "# App Staging Synthesizer\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\nThis library includes constructs aimed at replacing the current model of bootstrapping and providing\ngreater control of the bootstrap experience to the CDK user. The important constructs in this library\nare as follows:\n\n- the `IStagingResources` interface: a framework for an app-level bootstrap stack that handles\n file assets and docker assets.\n- the `DefaultStagingStack`, which is a works-out-of-the-box implementation of the `IStagingResources`\n interface.\n- the `AppStagingSynthesizer`, a new CDK synthesizer that will synthesize CDK applications with\n the staging resources provided.\n\n> As this library is `experimental`, there are features that are not yet implemented. Please look\n> at the list of [Known Limitations](#known-limitations) before getting started.\n\nTo get started, update your CDK App with a new `defaultStackSynthesizer`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id', // put a unique id here\n }),\n});\n```\n\nThis will introduce a `DefaultStagingStack` in your CDK App and staging assets of your App\nwill live in the resources from that stack rather than the CDK Bootstrap stack.\n\nIf you are migrating from a different version of synthesis your updated CDK App will target\nthe resources in the `DefaultStagingStack` and no longer be tied to the bootstrapped resources\nin your account.\n\n## Bootstrap Model\n\nIn our default bootstrapping process, when you run `cdk bootstrap aws://<account>/<region>`, the following\nresources are created:\n\n- It creates Roles to assume for cross-account deployments and for Pipeline deployments;\n- It creates staging resources: a global S3 bucket and global ECR repository to hold CDK assets;\n- It creates Roles to write to the S3 bucket and ECR repository;\n\nBecause the bootstrapping resources include regional resources, you need to bootstrap\nevery region you plan to deploy to individually. All assets of all CDK apps deploying\nto that account and region will be written to the single S3 Bucket and ECR repository.\n\nBy using the synthesizer in this library, instead of the\n`DefaultStackSynthesizer`, a different set of staging resources will be created\nfor every CDK application, and they will be created automatically as part of a\nregular deployment, in a separate Stack that is deployed before your application\nStacks. The staging resources will be one S3 bucket, and *one ECR repository per\nimage*, and Roles necessary to access those buckets and ECR repositories. The\nRoles from the default bootstrap stack are still used (though their use can be\nturned off).\n\nThis has the following advantages:\n\n- Because staging resources are now application-specific, they can be fully cleaned up when you clean up\n the application.\n- Because there is now one ECR repository per image instead of one ECR repository for all images, it is\n possible to effectively use ECR life cycle rules (for example, retain only the most recent 5 images)\n to cut down on storage costs.\n- Resources between separate CDK Apps are separated so they can be cleaned up and lifecycle\n controlled individually.\n- Because the only shared bootstrapping resources required are Roles, which are global resources,\n you now only need to bootstrap every account in one Region (instead of every Region). This makes it\n easier to do with CloudFormation StackSets.\n\nFor the deployment roles, this synthesizer still uses the Roles from the default\nbootstrap stack, and nothing else. The staging resources from that bootstrap\nstack will be unused. You can customize the template to remove those resources\nif you prefer. In the future, we will provide a bootstrap stack template with\nonly those Roles, specifically for use with this synthesizer.\n\n## Using the Default Staging Stack per Environment\n\nThe most common use case will be to use the built-in default resources. In this scenario, the\nsynthesizer will create a new Staging Stack in each environment the CDK App is deployed to store\nits staging resources. To use this kind of synthesizer, use `AppStagingSynthesizer.defaultResources()`.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});\n```\n\nEvery CDK App that uses the `DefaultStagingStack` must include an `appId`. This should\nbe an identifier unique to the app and is used to differentiate staging resources associated\nwith the app.\n\n### Default Staging Stack\n\nThe Default Staging Stack includes all the staging resources necessary for CDK Assets. The below example\nis of a CDK App using the `AppStagingSynthesizer` and creating a file asset for the Lambda Function\nsource code. As part of the `DefaultStagingStack`, an S3 bucket and IAM role will be created that will be\nused to upload the asset to S3.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({ appId: 'my-app-id' }),\n});\n\nconst stack = new Stack(app, 'my-stack');\n\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')),\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n\napp.synth();\n```\n\n### Custom Roles\n\nYou can customize some or all of the roles you'd like to use in the synthesizer as well,\nif all you need is to supply custom roles (and not change anything else in the `DefaultStagingStack`):\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});\n```\n\nOr, you can ask to use the CLI credentials that exist at deploy-time.\nThese credentials must have the ability to perform CloudFormation calls,\nlookup resources in your account, and perform CloudFormation deployment.\nFor a full list of what is necessary, see `LookupRole`, `DeploymentActionRole`,\nand `CloudFormationExecutionRole` in the\n[bootstrap template](https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml).\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.cliCredentials(),\n }),\n});\n```\n\nThe default staging stack will create roles to publish to the S3 bucket and ECR repositories,\nassumable by the deployment role. You can also specify an existing IAM role for the\n`fileAssetPublishingRole` or `imageAssetPublishingRole`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),\n imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),\n }),\n});\n```\n\n### Deploy Time S3 Assets\n\nThere are two types of assets:\n\n- Assets used only during deployment. These are used to hand off a large piece of data to another\nservice, that will make a private copy of that data. After deployment, the asset is only necessary for\na potential future rollback.\n- Assets accessed throughout the running life time of the application.\n\nExamples of assets that are only used at deploy time are CloudFormation Templates and Lambda Code\nbundles. Examples of assets accessed throughout the life time of the application are script files\ndownloaded to run in a CodeBuild Project, or on EC2 instance startup. ECR images are always application\nlife-time assets. S3 deploy time assets are stored with a `deploy-time/` prefix, and a lifecycle rule will collect them after a configurable number of days.\n\nLambda assets are by default marked as deploy time assets:\n\n```ts\ndeclare const stack: Stack;\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')), // lambda marks deployTime = true\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n```\n\nOr, if you want to create your own deploy time asset:\n\n```ts\nimport { Asset } from 'aws-cdk-lib/aws-s3-assets';\n\ndeclare const stack: Stack;\nconst asset = new Asset(stack, 'deploy-time-asset', {\n deployTime: true,\n path: path.join(__dirname, './deploy-time-asset'),\n});\n```\n\nBy default, we store deploy time assets for 30 days, but you can change this number by specifying\n`deployTimeFileAssetLifetime`. The number you specify here is how long you will be able to roll back\nto a previous version of an application just by doing a CloudFormation deployment with the old\ntemplate, without rebuilding and republishing assets.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deployTimeFileAssetLifetime: Duration.days(100),\n }),\n});\n```\n\n### Lifecycle Rules on ECR Repositories\n\nBy default, we store a maximum of 3 revisions of a particular docker image asset. This allows\nfor smooth faciliation of rollback scenarios where we may reference previous versions of an\nimage. When more than 3 revisions of an asset exist in the ECR repository, the oldest one is\npurged.\n\nTo change the number of revisions stored, use `imageAssetVersionCount`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n imageAssetVersionCount: 10,\n }),\n});\n```\n\n### Auto Delete Staging Assets on Deletion\n\nBy default, the staging resources will be cleaned up on stack deletion. That means that the\nS3 Bucket and ECR Repositories are set to `RemovalPolicy.DESTROY` and have `autoDeleteObjects`\nor `emptyOnDelete` turned on. This creates custom resources under the hood to facilitate\ncleanup. To turn this off, specify `autoDeleteStagingAssets: false`.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n autoDeleteStagingAssets: false,\n }),\n});\n```\n\n### Staging Bucket Encryption\n\nBy default, the staging resources will be stored in an S3 Bucket with KMS encryption. To use\nSSE-S3, set `stagingBucketEncryption` to `BucketEncryption.S3_MANAGED`.\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n }),\n});\n```\n\n## Using a Custom Staging Stack per Environment\n\nIf you want to customize some behavior that is not configurable via properties,\nyou can implement your own class that implements `IStagingResources`. To get a head start,\nyou can subclass `DefaultStagingStack`.\n\n```ts\ninterface CustomStagingStackOptions extends DefaultStagingStackOptions {}\n\nclass CustomStagingStack extends DefaultStagingStack {\n}\n```\n\nOr you can roll your own staging resources from scratch, as long as it implements `IStagingResources`.\n\n```ts\ninterface CustomStagingStackProps extends StackProps {}\n\nclass CustomStagingStack extends Stack implements IStagingResources {\n public constructor(scope: Construct, id: string, props: CustomStagingStackProps) {\n super(scope, id, props);\n }\n\n public addFile(asset: FileAssetSource): FileStagingLocation {\n return {\n bucketName: 'myBucket',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n\n public addDockerImage(asset: DockerImageAssetSource): ImageStagingLocation {\n return {\n repoName: 'myRepo',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n}\n```\n\nUsing your custom staging resources means implementing a `CustomFactory` class and calling the\n`AppStagingSynthesizer.customFactory()` static method. This has the benefit of providing a\ncustom Staging Stack that can be created in every environment the CDK App is deployed to.\n\n```ts fixture=with-custom-staging\nclass CustomFactory implements IStagingResourcesFactory {\n public obtainStagingResources(stack: Stack, context: ObtainStagingResourcesContext) {\n const myApp = App.of(stack);\n\n return new CustomStagingStack(myApp!, `CustomStagingStack-${context.environmentString}`, {});\n }\n}\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customFactory({\n factory: new CustomFactory(),\n oncePerEnv: true, // by default\n }),\n});\n```\n\n## Using an Existing Staging Stack\n\nUse `AppStagingSynthesizer.customResources()` to supply an existing stack as the Staging Stack.\nMake sure that the custom stack you provide implements `IStagingResources`.\n\n```ts fixture=with-custom-staging\nconst resourceApp = new App();\nconst resources = new CustomStagingStack(resourceApp, 'CustomStagingStack', {});\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customResources({\n resources,\n }),\n});\n```\n\n## Known Limitations\n\nSince this module is experimental, there are some known limitations:\n\n- Currently this module does not support CDK Pipelines. You must deploy CDK Apps using this\n synthesizer via `cdk deploy`. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26118)\n to indicate you want this.\n- This synthesizer only needs a bootstrap stack with Roles, without staging resources. We\n haven't written such a bootstrap stack yet; at the moment you can use the existing modern\n bootstrap stack, the staging resources in them will just go unused. You can customize the\n template to remove them if desired.\n- Due to limitations on the CloudFormation template size, CDK Applications can have\n at most 20 independent ECR images. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26119)\n if you need more than this.\n"
3672
+ "markdown": "# App Staging Synthesizer\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\nThis library includes constructs aimed at replacing the current model of bootstrapping and providing\ngreater control of the bootstrap experience to the CDK user. The important constructs in this library\nare as follows:\n\n- the `IStagingResources` interface: a framework for an app-level bootstrap stack that handles\n file assets and docker assets.\n- the `DefaultStagingStack`, which is a works-out-of-the-box implementation of the `IStagingResources`\n interface.\n- the `AppStagingSynthesizer`, a new CDK synthesizer that will synthesize CDK applications with\n the staging resources provided.\n\n> As this library is `experimental`, there are features that are not yet implemented. Please look\n> at the list of [Known Limitations](#known-limitations) before getting started.\n\nTo get started, update your CDK App with a new `defaultStackSynthesizer`:\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id', // put a unique id here\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n }),\n});\n```\n\nThis will introduce a `DefaultStagingStack` in your CDK App and staging assets of your App\nwill live in the resources from that stack rather than the CDK Bootstrap stack.\n\nIf you are migrating from a different version of synthesis your updated CDK App will target\nthe resources in the `DefaultStagingStack` and no longer be tied to the bootstrapped resources\nin your account.\n\n## Bootstrap Model\n\nIn our default bootstrapping process, when you run `cdk bootstrap aws://<account>/<region>`, the following\nresources are created:\n\n- It creates Roles to assume for cross-account deployments and for Pipeline deployments;\n- It creates staging resources: a global S3 bucket and global ECR repository to hold CDK assets;\n- It creates Roles to write to the S3 bucket and ECR repository;\n\nBecause the bootstrapping resources include regional resources, you need to bootstrap\nevery region you plan to deploy to individually. All assets of all CDK apps deploying\nto that account and region will be written to the single S3 Bucket and ECR repository.\n\nBy using the synthesizer in this library, instead of the\n`DefaultStackSynthesizer`, a different set of staging resources will be created\nfor every CDK application, and they will be created automatically as part of a\nregular deployment, in a separate Stack that is deployed before your application\nStacks. The staging resources will be one S3 bucket, and *one ECR repository per\nimage*, and Roles necessary to access those buckets and ECR repositories. The\nRoles from the default bootstrap stack are still used (though their use can be\nturned off).\n\nThis has the following advantages:\n\n- Because staging resources are now application-specific, they can be fully cleaned up when you clean up\n the application.\n- Because there is now one ECR repository per image instead of one ECR repository for all images, it is\n possible to effectively use ECR life cycle rules (for example, retain only the most recent 5 images)\n to cut down on storage costs.\n- Resources between separate CDK Apps are separated so they can be cleaned up and lifecycle\n controlled individually.\n- Because the only shared bootstrapping resources required are Roles, which are global resources,\n you now only need to bootstrap every account in one Region (instead of every Region). This makes it\n easier to do with CloudFormation StackSets.\n\nFor the deployment roles, this synthesizer still uses the Roles from the default\nbootstrap stack, and nothing else. The staging resources from that bootstrap\nstack will be unused. You can customize the template to remove those resources\nif you prefer. In the future, we will provide a bootstrap stack template with\nonly those Roles, specifically for use with this synthesizer.\n\n## Using the Default Staging Stack per Environment\n\nThe most common use case will be to use the built-in default resources. In this scenario, the\nsynthesizer will create a new Staging Stack in each environment the CDK App is deployed to store\nits staging resources. To use this kind of synthesizer, use `AppStagingSynthesizer.defaultResources()`.\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});\n```\n\nEvery CDK App that uses the `DefaultStagingStack` must include an `appId`. This should\nbe an identifier unique to the app and is used to differentiate staging resources associated\nwith the app.\n\n### Default Staging Stack\n\nThe Default Staging Stack includes all the staging resources necessary for CDK Assets. The below example\nis of a CDK App using the `AppStagingSynthesizer` and creating a file asset for the Lambda Function\nsource code. As part of the `DefaultStagingStack`, an S3 bucket and IAM role will be created that will be\nused to upload the asset to S3.\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n }),\n});\n\nconst stack = new Stack(app, 'my-stack');\n\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')),\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n\napp.synth();\n```\n\n### Custom Roles\n\nYou can customize some or all of the roles you'd like to use in the synthesizer as well,\nif all you need is to supply custom roles (and not change anything else in the `DefaultStagingStack`):\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});\n```\n\nOr, you can ask to use the CLI credentials that exist at deploy-time.\nThese credentials must have the ability to perform CloudFormation calls,\nlookup resources in your account, and perform CloudFormation deployment.\nFor a full list of what is necessary, see `LookupRole`, `DeploymentActionRole`,\nand `CloudFormationExecutionRole` in the\n[bootstrap template](https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml).\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n deploymentIdentities: DeploymentIdentities.cliCredentials(),\n }),\n});\n```\n\nThe default staging stack will create roles to publish to the S3 bucket and ECR repositories,\nassumable by the deployment role. You can also specify an existing IAM role for the\n`fileAssetPublishingRole` or `imageAssetPublishingRole`:\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),\n imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),\n }),\n});\n```\n\n### Deploy Time S3 Assets\n\nThere are two types of assets:\n\n- Assets used only during deployment. These are used to hand off a large piece of data to another\nservice, that will make a private copy of that data. After deployment, the asset is only necessary for\na potential future rollback.\n- Assets accessed throughout the running life time of the application.\n\nExamples of assets that are only used at deploy time are CloudFormation Templates and Lambda Code\nbundles. Examples of assets accessed throughout the life time of the application are script files\ndownloaded to run in a CodeBuild Project, or on EC2 instance startup. ECR images are always application\nlife-time assets. S3 deploy time assets are stored with a `deploy-time/` prefix, and a lifecycle rule will collect them after a configurable number of days.\n\nLambda assets are by default marked as deploy time assets:\n\n```ts\ndeclare const stack: Stack;\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')), // lambda marks deployTime = true\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n```\n\nOr, if you want to create your own deploy time asset:\n\n```ts\nimport { Asset } from 'aws-cdk-lib/aws-s3-assets';\n\ndeclare const stack: Stack;\nconst asset = new Asset(stack, 'deploy-time-asset', {\n deployTime: true,\n path: path.join(__dirname, 'deploy-time-asset'),\n});\n```\n\nBy default, we store deploy time assets for 30 days, but you can change this number by specifying\n`deployTimeFileAssetLifetime`. The number you specify here is how long you will be able to roll back\nto a previous version of an application just by doing a CloudFormation deployment with the old\ntemplate, without rebuilding and republishing assets.\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n deployTimeFileAssetLifetime: Duration.days(100),\n }),\n});\n```\n\n### Lifecycle Rules on ECR Repositories\n\nBy default, we store a maximum of 3 revisions of a particular docker image asset. This allows\nfor smooth faciliation of rollback scenarios where we may reference previous versions of an\nimage. When more than 3 revisions of an asset exist in the ECR repository, the oldest one is\npurged.\n\nTo change the number of revisions stored, use `imageAssetVersionCount`:\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n imageAssetVersionCount: 10,\n }),\n});\n```\n\n### Auto Delete Staging Assets on Deletion\n\nBy default, the staging resources will be cleaned up on stack deletion. That means that the\nS3 Bucket and ECR Repositories are set to `RemovalPolicy.DESTROY` and have `autoDeleteObjects`\nor `emptyOnDelete` turned on. This creates custom resources under the hood to facilitate\ncleanup. To turn this off, specify `autoDeleteStagingAssets: false`.\n\n```ts\nimport { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n autoDeleteStagingAssets: false,\n }),\n});\n```\n\n### Staging Bucket Encryption\n\nYou must explicitly specify the encryption type for the staging bucket via the `stagingBucketEncryption` property. In\nfuture versions of this package, the default will be `BucketEncryption.S3_MANAGED`.\n\nIn previous versions of this package, the default was to use KMS encryption for the staging bucket. KMS keys cost\n$1/month, which could result in unexpected costs for users who are not aware of this. As we stabilize this module\nwe intend to make the default S3-managed encryption, which is free. However, the migration path from KMS to S3\nmanaged encryption for existing buckets is not straightforward. Therefore, for now, this property is required.\n\nIf you have an existing staging bucket encrypted with a KMS key, you will likely want to set this property to\n`BucketEncryption.KMS`. If you are creating a new staging bucket, you can set this property to\n`BucketEncryption.S3_MANAGED` to avoid the cost of a KMS key.\n\nYou can learn more about choosing a bucket encryption type in the\n[S3 documentation](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html).\n\n## Using a Custom Staging Stack per Environment\n\nIf you want to customize some behavior that is not configurable via properties,\nyou can implement your own class that implements `IStagingResources`. To get a head start,\nyou can subclass `DefaultStagingStack`.\n\n```ts\ninterface CustomStagingStackOptions extends DefaultStagingStackOptions {}\n\nclass CustomStagingStack extends DefaultStagingStack {\n}\n```\n\nOr you can roll your own staging resources from scratch, as long as it implements `IStagingResources`.\n\n```ts\ninterface CustomStagingStackProps extends StackProps {}\n\nclass CustomStagingStack extends Stack implements IStagingResources {\n public constructor(scope: Construct, id: string, props: CustomStagingStackProps) {\n super(scope, id, props);\n }\n\n public addFile(asset: FileAssetSource): FileStagingLocation {\n return {\n bucketName: 'myBucket',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n\n public addDockerImage(asset: DockerImageAssetSource): ImageStagingLocation {\n return {\n repoName: 'myRepo',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n}\n```\n\nUsing your custom staging resources means implementing a `CustomFactory` class and calling the\n`AppStagingSynthesizer.customFactory()` static method. This has the benefit of providing a\ncustom Staging Stack that can be created in every environment the CDK App is deployed to.\n\n```ts fixture=with-custom-staging\nclass CustomFactory implements IStagingResourcesFactory {\n public obtainStagingResources(stack: Stack, context: ObtainStagingResourcesContext) {\n const myApp = App.of(stack);\n\n return new CustomStagingStack(myApp!, `CustomStagingStack-${context.environmentString}`, {});\n }\n}\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customFactory({\n factory: new CustomFactory(),\n oncePerEnv: true, // by default\n }),\n});\n```\n\n## Using an Existing Staging Stack\n\nUse `AppStagingSynthesizer.customResources()` to supply an existing stack as the Staging Stack.\nMake sure that the custom stack you provide implements `IStagingResources`.\n\n```ts fixture=with-custom-staging\nconst resourceApp = new App();\nconst resources = new CustomStagingStack(resourceApp, 'CustomStagingStack', {});\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customResources({\n resources,\n }),\n});\n```\n\n## Known Limitations\n\nSince this module is experimental, there are some known limitations:\n\n- Currently this module does not support CDK Pipelines. You must deploy CDK Apps using this\n synthesizer via `cdk deploy`. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26118)\n to indicate you want this.\n- This synthesizer only needs a bootstrap stack with Roles, without staging resources. We\n haven't written such a bootstrap stack yet; at the moment you can use the existing modern\n bootstrap stack, the staging resources in them will just go unused. You can customize the\n template to remove them if desired.\n- Due to limitations on the CloudFormation template size, CDK Applications can have\n at most 20 independent ECR images. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26119)\n if you need more than this.\n"
3686
3673
  },
3687
3674
  "repository": {
3688
3675
  "directory": "packages/@aws-cdk/app-staging-synthesizer-alpha",
@@ -4072,7 +4059,7 @@
4072
4059
  "remarks": "These roles must exist already.\nThis class does not create new IAM Roles.",
4073
4060
  "stability": "experimental",
4074
4061
  "summary": "Bootstrapped role specifier.",
4075
- "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});",
4062
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});",
4076
4063
  "custom": {
4077
4064
  "exampleMetadata": "infused"
4078
4065
  }
@@ -4152,7 +4139,7 @@
4152
4139
  "docs": {
4153
4140
  "stability": "experimental",
4154
4141
  "summary": "Roles that are bootstrapped to your account.",
4155
- "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});",
4142
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});",
4156
4143
  "custom": {
4157
4144
  "exampleMetadata": "infused"
4158
4145
  }
@@ -4328,7 +4315,7 @@
4328
4315
  "docs": {
4329
4316
  "stability": "experimental",
4330
4317
  "summary": "Options for `DeploymentIdentities.defaultBootstrappedRoles`.",
4331
- "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});",
4318
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});",
4332
4319
  "custom": {
4333
4320
  "exampleMetadata": "infused"
4334
4321
  }
@@ -4369,7 +4356,7 @@
4369
4356
  "docs": {
4370
4357
  "stability": "experimental",
4371
4358
  "summary": "Properties for stackPerEnv static method.",
4372
- "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),\n imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),\n }),\n});",
4359
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),\n imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),\n }),\n});",
4373
4360
  "custom": {
4374
4361
  "exampleMetadata": "infused"
4375
4362
  }
@@ -4391,7 +4378,7 @@
4391
4378
  "assembly": "@aws-cdk/app-staging-synthesizer-alpha",
4392
4379
  "base": "aws-cdk-lib.Stack",
4393
4380
  "docs": {
4394
- "example": "const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id' });",
4381
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\nconst defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id', stagingBucketEncryption: BucketEncryption.S3_MANAGED });",
4395
4382
  "stability": "experimental",
4396
4383
  "summary": "A default Staging Stack that implements IStagingResources."
4397
4384
  },
@@ -4402,7 +4389,7 @@
4402
4389
  },
4403
4390
  "locationInModule": {
4404
4391
  "filename": "lib/default-staging-stack.ts",
4405
- "line": 249
4392
+ "line": 259
4406
4393
  },
4407
4394
  "parameters": [
4408
4395
  {
@@ -4431,7 +4418,7 @@
4431
4418
  "kind": "class",
4432
4419
  "locationInModule": {
4433
4420
  "filename": "lib/default-staging-stack.ts",
4434
- "line": 160
4421
+ "line": 170
4435
4422
  },
4436
4423
  "methods": [
4437
4424
  {
@@ -4441,7 +4428,7 @@
4441
4428
  },
4442
4429
  "locationInModule": {
4443
4430
  "filename": "lib/default-staging-stack.ts",
4444
- "line": 164
4431
+ "line": 174
4445
4432
  },
4446
4433
  "name": "factory",
4447
4434
  "parameters": [
@@ -4466,7 +4453,7 @@
4466
4453
  },
4467
4454
  "locationInModule": {
4468
4455
  "filename": "lib/default-staging-stack.ts",
4469
- "line": 480
4456
+ "line": 490
4470
4457
  },
4471
4458
  "name": "addDockerImage",
4472
4459
  "overrides": "@aws-cdk/app-staging-synthesizer-alpha.IStagingResources",
@@ -4491,7 +4478,7 @@
4491
4478
  },
4492
4479
  "locationInModule": {
4493
4480
  "filename": "lib/default-staging-stack.ts",
4494
- "line": 468
4481
+ "line": 478
4495
4482
  },
4496
4483
  "name": "addFile",
4497
4484
  "overrides": "@aws-cdk/app-staging-synthesizer-alpha.IStagingResources",
@@ -4520,7 +4507,7 @@
4520
4507
  "immutable": true,
4521
4508
  "locationInModule": {
4522
4509
  "filename": "lib/default-staging-stack.ts",
4523
- "line": 225
4510
+ "line": 235
4524
4511
  },
4525
4512
  "name": "dependencyStack",
4526
4513
  "type": {
@@ -4535,7 +4522,7 @@
4535
4522
  "immutable": true,
4536
4523
  "locationInModule": {
4537
4524
  "filename": "lib/default-staging-stack.ts",
4538
- "line": 220
4525
+ "line": 230
4539
4526
  },
4540
4527
  "name": "stagingRepos",
4541
4528
  "type": {
@@ -4555,7 +4542,7 @@
4555
4542
  "immutable": true,
4556
4543
  "locationInModule": {
4557
4544
  "filename": "lib/default-staging-stack.ts",
4558
- "line": 215
4545
+ "line": 225
4559
4546
  },
4560
4547
  "name": "stagingBucket",
4561
4548
  "optional": true,
@@ -4572,7 +4559,7 @@
4572
4559
  "docs": {
4573
4560
  "stability": "experimental",
4574
4561
  "summary": "User configurable options to the DefaultStagingStack.",
4575
- "example": "const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id' });",
4562
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\nconst defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id', stagingBucketEncryption: BucketEncryption.S3_MANAGED });",
4576
4563
  "custom": {
4577
4564
  "exampleMetadata": "infused"
4578
4565
  }
@@ -4602,6 +4589,23 @@
4602
4589
  "primitive": "string"
4603
4590
  }
4604
4591
  },
4592
+ {
4593
+ "abstract": true,
4594
+ "docs": {
4595
+ "remarks": "In future versions of this package, the default will be BucketEncryption.S3_MANAGED.\n\nIn previous versions of this package, the default was to use KMS encryption for the staging bucket. KMS keys cost\n$1/month, which could result in unexpected costs for users who are not aware of this. As we stabilize this module\nwe intend to make the default S3-managed encryption, which is free. However, the migration path from KMS to S3\nmanaged encryption for existing buckets is not straightforward. Therefore, for now, this property is required.\n\nIf you have an existing staging bucket encrypted with a KMS key, you will likely want to set this property to\nBucketEncryption.KMS. If you are creating a new staging bucket, you can set this property to\nBucketEncryption.S3_MANAGED to avoid the cost of a KMS key.",
4596
+ "stability": "experimental",
4597
+ "summary": "Encryption type for staging bucket."
4598
+ },
4599
+ "immutable": true,
4600
+ "locationInModule": {
4601
+ "filename": "lib/default-staging-stack.ts",
4602
+ "line": 78
4603
+ },
4604
+ "name": "stagingBucketEncryption",
4605
+ "type": {
4606
+ "fqn": "aws-cdk-lib.aws_s3.BucketEncryption"
4607
+ }
4608
+ },
4605
4609
  {
4606
4610
  "abstract": true,
4607
4611
  "docs": {
@@ -4612,7 +4616,7 @@
4612
4616
  "immutable": true,
4613
4617
  "locationInModule": {
4614
4618
  "filename": "lib/default-staging-stack.ts",
4615
- "line": 120
4619
+ "line": 129
4616
4620
  },
4617
4621
  "name": "autoDeleteStagingAssets",
4618
4622
  "optional": true,
@@ -4631,7 +4635,7 @@
4631
4635
  "immutable": true,
4632
4636
  "locationInModule": {
4633
4637
  "filename": "lib/default-staging-stack.ts",
4634
- "line": 100
4638
+ "line": 109
4635
4639
  },
4636
4640
  "name": "deployTimeFileAssetLifetime",
4637
4641
  "optional": true,
@@ -4649,7 +4653,7 @@
4649
4653
  "immutable": true,
4650
4654
  "locationInModule": {
4651
4655
  "filename": "lib/default-staging-stack.ts",
4652
- "line": 76
4656
+ "line": 85
4653
4657
  },
4654
4658
  "name": "fileAssetPublishingRole",
4655
4659
  "optional": true,
@@ -4667,7 +4671,7 @@
4667
4671
  "immutable": true,
4668
4672
  "locationInModule": {
4669
4673
  "filename": "lib/default-staging-stack.ts",
4670
- "line": 83
4674
+ "line": 92
4671
4675
  },
4672
4676
  "name": "imageAssetPublishingRole",
4673
4677
  "optional": true,
@@ -4686,7 +4690,7 @@
4686
4690
  "immutable": true,
4687
4691
  "locationInModule": {
4688
4692
  "filename": "lib/default-staging-stack.ts",
4689
- "line": 112
4693
+ "line": 121
4690
4694
  },
4691
4695
  "name": "imageAssetVersionCount",
4692
4696
  "optional": true,
@@ -4694,24 +4698,6 @@
4694
4698
  "primitive": "number"
4695
4699
  }
4696
4700
  },
4697
- {
4698
- "abstract": true,
4699
- "docs": {
4700
- "default": "- s3.BucketEncryption.KMS",
4701
- "stability": "experimental",
4702
- "summary": "Encryption type for staging bucket."
4703
- },
4704
- "immutable": true,
4705
- "locationInModule": {
4706
- "filename": "lib/default-staging-stack.ts",
4707
- "line": 69
4708
- },
4709
- "name": "stagingBucketEncryption",
4710
- "optional": true,
4711
- "type": {
4712
- "fqn": "aws-cdk-lib.aws_s3.BucketEncryption"
4713
- }
4714
- },
4715
4701
  {
4716
4702
  "abstract": true,
4717
4703
  "docs": {
@@ -4741,7 +4727,7 @@
4741
4727
  "immutable": true,
4742
4728
  "locationInModule": {
4743
4729
  "filename": "lib/default-staging-stack.ts",
4744
- "line": 130
4730
+ "line": 139
4745
4731
  },
4746
4732
  "name": "stagingStackNamePrefix",
4747
4733
  "optional": true,
@@ -4758,7 +4744,7 @@
4758
4744
  "docs": {
4759
4745
  "stability": "experimental",
4760
4746
  "summary": "Default Staging Stack Properties.",
4761
- "example": "// The code below shows an example of how to instantiate this type.\n// The values are placeholders you should change.\nimport * as app_staging_synthesizer_alpha from '@aws-cdk/app-staging-synthesizer-alpha';\nimport * as cdk from 'aws-cdk-lib';\nimport { aws_s3 as s3 } from 'aws-cdk-lib';\n\ndeclare const bootstrapRole: app_staging_synthesizer_alpha.BootstrapRole;\ndeclare const permissionsBoundary: cdk.PermissionsBoundary;\ndeclare const stackSynthesizer: cdk.StackSynthesizer;\nconst defaultStagingStackProps: app_staging_synthesizer_alpha.DefaultStagingStackProps = {\n appId: 'appId',\n qualifier: 'qualifier',\n\n // the properties below are optional\n analyticsReporting: false,\n autoDeleteStagingAssets: false,\n crossRegionReferences: false,\n deployRoleArn: 'deployRoleArn',\n deployTimeFileAssetLifetime: cdk.Duration.minutes(30),\n description: 'description',\n env: {\n account: 'account',\n region: 'region',\n },\n fileAssetPublishingRole: bootstrapRole,\n imageAssetPublishingRole: bootstrapRole,\n imageAssetVersionCount: 123,\n permissionsBoundary: permissionsBoundary,\n stackName: 'stackName',\n stagingBucketEncryption: s3.BucketEncryption.UNENCRYPTED,\n stagingBucketName: 'stagingBucketName',\n stagingStackNamePrefix: 'stagingStackNamePrefix',\n suppressTemplateIndentation: false,\n synthesizer: stackSynthesizer,\n tags: {\n tagsKey: 'tags',\n },\n terminationProtection: false,\n};",
4747
+ "example": "// The code below shows an example of how to instantiate this type.\n// The values are placeholders you should change.\nimport * as app_staging_synthesizer_alpha from '@aws-cdk/app-staging-synthesizer-alpha';\nimport * as cdk from 'aws-cdk-lib';\nimport { aws_s3 as s3 } from 'aws-cdk-lib';\n\ndeclare const bootstrapRole: app_staging_synthesizer_alpha.BootstrapRole;\ndeclare const permissionsBoundary: cdk.PermissionsBoundary;\ndeclare const stackSynthesizer: cdk.StackSynthesizer;\nconst defaultStagingStackProps: app_staging_synthesizer_alpha.DefaultStagingStackProps = {\n appId: 'appId',\n qualifier: 'qualifier',\n stagingBucketEncryption: s3.BucketEncryption.UNENCRYPTED,\n\n // the properties below are optional\n analyticsReporting: false,\n autoDeleteStagingAssets: false,\n crossRegionReferences: false,\n deployRoleArn: 'deployRoleArn',\n deployTimeFileAssetLifetime: cdk.Duration.minutes(30),\n description: 'description',\n env: {\n account: 'account',\n region: 'region',\n },\n fileAssetPublishingRole: bootstrapRole,\n imageAssetPublishingRole: bootstrapRole,\n imageAssetVersionCount: 123,\n permissionsBoundary: permissionsBoundary,\n stackName: 'stackName',\n stagingBucketName: 'stagingBucketName',\n stagingStackNamePrefix: 'stagingStackNamePrefix',\n suppressTemplateIndentation: false,\n synthesizer: stackSynthesizer,\n tags: {\n tagsKey: 'tags',\n },\n terminationProtection: false,\n};",
4762
4748
  "custom": {
4763
4749
  "exampleMetadata": "fixture=_generated"
4764
4750
  }
@@ -4771,7 +4757,7 @@
4771
4757
  "kind": "interface",
4772
4758
  "locationInModule": {
4773
4759
  "filename": "lib/default-staging-stack.ts",
4774
- "line": 136
4760
+ "line": 145
4775
4761
  },
4776
4762
  "name": "DefaultStagingStackProps",
4777
4763
  "properties": [
@@ -4785,7 +4771,7 @@
4785
4771
  "immutable": true,
4786
4772
  "locationInModule": {
4787
4773
  "filename": "lib/default-staging-stack.ts",
4788
- "line": 151
4774
+ "line": 160
4789
4775
  },
4790
4776
  "name": "qualifier",
4791
4777
  "type": {
@@ -4803,7 +4789,7 @@
4803
4789
  "immutable": true,
4804
4790
  "locationInModule": {
4805
4791
  "filename": "lib/default-staging-stack.ts",
4806
- "line": 144
4792
+ "line": 153
4807
4793
  },
4808
4794
  "name": "deployRoleArn",
4809
4795
  "optional": true,
@@ -4819,7 +4805,7 @@
4819
4805
  "docs": {
4820
4806
  "stability": "experimental",
4821
4807
  "summary": "Deployment identities are the class of roles to be assumed by the CDK when deploying the App.",
4822
- "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});",
4808
+ "example": "import { BucketEncryption } from 'aws-cdk-lib/aws-s3';\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n stagingBucketEncryption: BucketEncryption.S3_MANAGED,\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});",
4823
4809
  "custom": {
4824
4810
  "exampleMetadata": "infused"
4825
4811
  }
@@ -5421,6 +5407,6 @@
5421
5407
  "symbolId": "lib/default-staging-stack:UsingAppStagingSynthesizer"
5422
5408
  }
5423
5409
  },
5424
- "version": "2.126.0-alpha.0",
5410
+ "version": "2.128.0-alpha.0",
5425
5411
  "fingerprint": "**********"
5426
5412
  }
Binary file
package/README.md CHANGED
@@ -32,9 +32,12 @@ are as follows:
32
32
  To get started, update your CDK App with a new `defaultStackSynthesizer`:
33
33
 
34
34
  ```ts
35
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
36
+
35
37
  const app = new App({
36
38
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
37
39
  appId: 'my-app-id', // put a unique id here
40
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
38
41
  }),
39
42
  });
40
43
  ```
@@ -94,9 +97,12 @@ synthesizer will create a new Staging Stack in each environment the CDK App is d
94
97
  its staging resources. To use this kind of synthesizer, use `AppStagingSynthesizer.defaultResources()`.
95
98
 
96
99
  ```ts
100
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
101
+
97
102
  const app = new App({
98
103
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
99
104
  appId: 'my-app-id',
105
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
100
106
 
101
107
  // The following line is optional. By default it is assumed you have bootstrapped in the same
102
108
  // region(s) as the stack(s) you are deploying.
@@ -117,8 +123,13 @@ source code. As part of the `DefaultStagingStack`, an S3 bucket and IAM role wil
117
123
  used to upload the asset to S3.
118
124
 
119
125
  ```ts
126
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
127
+
120
128
  const app = new App({
121
- defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({ appId: 'my-app-id' }),
129
+ defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
130
+ appId: 'my-app-id',
131
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
132
+ }),
122
133
  });
123
134
 
124
135
  const stack = new Stack(app, 'my-stack');
@@ -138,9 +149,12 @@ You can customize some or all of the roles you'd like to use in the synthesizer
138
149
  if all you need is to supply custom roles (and not change anything else in the `DefaultStagingStack`):
139
150
 
140
151
  ```ts
152
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
153
+
141
154
  const app = new App({
142
155
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
143
156
  appId: 'my-app-id',
157
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
144
158
  deploymentIdentities: DeploymentIdentities.specifyRoles({
145
159
  cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),
146
160
  deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),
@@ -158,9 +172,12 @@ and `CloudFormationExecutionRole` in the
158
172
  [bootstrap template](https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml).
159
173
 
160
174
  ```ts
175
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
176
+
161
177
  const app = new App({
162
178
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
163
179
  appId: 'my-app-id',
180
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
164
181
  deploymentIdentities: DeploymentIdentities.cliCredentials(),
165
182
  }),
166
183
  });
@@ -171,9 +188,12 @@ assumable by the deployment role. You can also specify an existing IAM role for
171
188
  `fileAssetPublishingRole` or `imageAssetPublishingRole`:
172
189
 
173
190
  ```ts
191
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
192
+
174
193
  const app = new App({
175
194
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
176
195
  appId: 'my-app-id',
196
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
177
197
  fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),
178
198
  imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),
179
199
  }),
@@ -213,7 +233,7 @@ import { Asset } from 'aws-cdk-lib/aws-s3-assets';
213
233
  declare const stack: Stack;
214
234
  const asset = new Asset(stack, 'deploy-time-asset', {
215
235
  deployTime: true,
216
- path: path.join(__dirname, './deploy-time-asset'),
236
+ path: path.join(__dirname, 'deploy-time-asset'),
217
237
  });
218
238
  ```
219
239
 
@@ -223,9 +243,12 @@ to a previous version of an application just by doing a CloudFormation deploymen
223
243
  template, without rebuilding and republishing assets.
224
244
 
225
245
  ```ts
246
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
247
+
226
248
  const app = new App({
227
249
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
228
250
  appId: 'my-app-id',
251
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
229
252
  deployTimeFileAssetLifetime: Duration.days(100),
230
253
  }),
231
254
  });
@@ -241,9 +264,12 @@ purged.
241
264
  To change the number of revisions stored, use `imageAssetVersionCount`:
242
265
 
243
266
  ```ts
267
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
268
+
244
269
  const app = new App({
245
270
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
246
271
  appId: 'my-app-id',
272
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
247
273
  imageAssetVersionCount: 10,
248
274
  }),
249
275
  });
@@ -257,9 +283,12 @@ or `emptyOnDelete` turned on. This creates custom resources under the hood to fa
257
283
  cleanup. To turn this off, specify `autoDeleteStagingAssets: false`.
258
284
 
259
285
  ```ts
286
+ import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
287
+
260
288
  const app = new App({
261
289
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
262
290
  appId: 'my-app-id',
291
+ stagingBucketEncryption: BucketEncryption.S3_MANAGED,
263
292
  autoDeleteStagingAssets: false,
264
293
  }),
265
294
  });
@@ -267,19 +296,20 @@ const app = new App({
267
296
 
268
297
  ### Staging Bucket Encryption
269
298
 
270
- By default, the staging resources will be stored in an S3 Bucket with KMS encryption. To use
271
- SSE-S3, set `stagingBucketEncryption` to `BucketEncryption.S3_MANAGED`.
299
+ You must explicitly specify the encryption type for the staging bucket via the `stagingBucketEncryption` property. In
300
+ future versions of this package, the default will be `BucketEncryption.S3_MANAGED`.
272
301
 
273
- ```ts
274
- import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
302
+ In previous versions of this package, the default was to use KMS encryption for the staging bucket. KMS keys cost
303
+ $1/month, which could result in unexpected costs for users who are not aware of this. As we stabilize this module
304
+ we intend to make the default S3-managed encryption, which is free. However, the migration path from KMS to S3
305
+ managed encryption for existing buckets is not straightforward. Therefore, for now, this property is required.
275
306
 
276
- const app = new App({
277
- defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
278
- appId: 'my-app-id',
279
- stagingBucketEncryption: BucketEncryption.S3_MANAGED,
280
- }),
281
- });
282
- ```
307
+ If you have an existing staging bucket encrypted with a KMS key, you will likely want to set this property to
308
+ `BucketEncryption.KMS`. If you are creating a new staging bucket, you can set this property to
309
+ `BucketEncryption.S3_MANAGED` to avoid the cost of a KMS key.
310
+
311
+ You can learn more about choosing a bucket encryption type in the
312
+ [S3 documentation](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html).
283
313
 
284
314
  ## Using a Custom Staging Stack per Environment
285
315
 
@@ -171,7 +171,7 @@ class AppStagingSynthesizer extends core_1.StackSynthesizer {
171
171
  }
172
172
  exports.AppStagingSynthesizer = AppStagingSynthesizer;
173
173
  _a = JSII_RTTI_SYMBOL_1;
174
- AppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.AppStagingSynthesizer", version: "2.126.0-alpha.0" };
174
+ AppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.AppStagingSynthesizer", version: "2.128.0-alpha.0" };
175
175
  /**
176
176
  * Default ARN qualifier
177
177
  */
@@ -54,7 +54,7 @@ class BootstrapRole {
54
54
  }
55
55
  exports.BootstrapRole = BootstrapRole;
56
56
  _a = JSII_RTTI_SYMBOL_1;
57
- BootstrapRole[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRole", version: "2.126.0-alpha.0" };
57
+ BootstrapRole[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRole", version: "2.128.0-alpha.0" };
58
58
  BootstrapRole.CLI_CREDS = 'cli-credentials';
59
59
  /**
60
60
  * Deployment identities are the class of roles to be assumed by the CDK
@@ -122,5 +122,5 @@ class DeploymentIdentities {
122
122
  }
123
123
  exports.DeploymentIdentities = DeploymentIdentities;
124
124
  _b = JSII_RTTI_SYMBOL_1;
125
- DeploymentIdentities[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DeploymentIdentities", version: "2.126.0-alpha.0" };
125
+ DeploymentIdentities[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DeploymentIdentities", version: "2.128.0-alpha.0" };
126
126
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLXJvbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYm9vdHN0cmFwLXJvbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRFQUF3STtBQUN4SSx1RUFBa0U7QUFFbEU7OztHQUdHO0FBQ0gsTUFBYSxhQUFhO0lBQ3hCOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWM7UUFDMUIsT0FBTyxJQUFJLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDbkQ7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBVztRQUNuQyxvQ0FBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUM3RCxPQUFPLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQy9CO0lBSUQsWUFBcUMsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7S0FBSTtJQUV4RDs7T0FFRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQztLQUNqRDtJQUVEOztPQUVHO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnREFBNkIsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDMUY7SUFFRDs7T0FFRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0RBQTZCLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzFGO0lBRUQ7O09BRUc7SUFDSSxXQUFXLENBQUMsSUFBdUI7UUFDeEMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0tBQ3pEOztBQTlDSCxzQ0ErQ0M7OztBQS9CZ0IsdUJBQVMsR0FBRyxpQkFBaUIsQ0FBQztBQWlDL0M7OztHQUdHO0FBQ0gsTUFBYSxvQkFBb0I7SUFDL0I7O09BRUc7SUFDSSxNQUFNLENBQUMsY0FBYztRQUMxQixPQUFPLElBQUksb0JBQW9CLENBQUM7WUFDOUIsMkJBQTJCLEVBQUUsYUFBYSxDQUFDLGNBQWMsRUFBRTtZQUMzRCxjQUFjLEVBQUUsYUFBYSxDQUFDLGNBQWMsRUFBRTtZQUM5QyxVQUFVLEVBQUUsYUFBYSxDQUFDLGNBQWMsRUFBRTtTQUMzQyxDQUFDLENBQUM7S0FDSjtJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBcUI7Ozs7Ozs7Ozs7UUFDOUMsT0FBTyxJQUFJLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3hDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMscUJBQXFCLENBQUMsVUFBd0MsRUFBRTs7Ozs7Ozs7OztRQUM1RSxTQUFTLG1CQUFtQixDQUFDLENBQVM7WUFDcEMsSUFBSSxPQUFPLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVELE9BQU8sSUFBSSxvQkFBb0IsQ0FBQztZQUM5QixjQUFjLEVBQUUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQywrQ0FBcUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzdHLDJCQUEyQixFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsK0NBQXFCLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUNsSSxVQUFVLEVBQUUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQywrQ0FBcUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQzFHLENBQUMsQ0FBQztLQUNKO0lBa0JEO0lBQ0UsbURBQW1EO0lBQ25ELEtBQXFCO1FBRXJCLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUMsMkJBQTJCLENBQUM7UUFDckUsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztLQUNwQzs7QUE3REgsb0RBOERDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RyaW5nU3BlY2lhbGl6ZXIsIHRyYW5zbGF0ZUFzc2V0VG9rZW5Ub0NmblRva2VuLCB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgQXBwU3RhZ2luZ1N5bnRoZXNpemVyIH0gZnJvbSAnLi9hcHAtc3RhZ2luZy1zeW50aGVzaXplcic7XG5cbi8qKlxuICogQm9vdHN0cmFwcGVkIHJvbGUgc3BlY2lmaWVyLiBUaGVzZSByb2xlcyBtdXN0IGV4aXN0IGFscmVhZHkuXG4gKiBUaGlzIGNsYXNzIGRvZXMgbm90IGNyZWF0ZSBuZXcgSUFNIFJvbGVzLlxuICovXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwUm9sZSB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGN1cnJlbnRseSBhc3N1bWVkIHJvbGUvY3JlZGVudGlhbHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xpQ3JlZGVudGlhbHMoKSB7XG4gICAgcmV0dXJuIG5ldyBCb290c3RyYXBSb2xlKEJvb3RzdHJhcFJvbGUuQ0xJX0NSRURTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGFuIGV4aXN0aW5nIElBTSBSb2xlIHRvIGFzc3VtZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUm9sZUFybihhcm46IHN0cmluZykge1xuICAgIFN0cmluZ1NwZWNpYWxpemVyLnZhbGlkYXRlTm9Ub2tlbnMoYXJuLCAnQm9vdHN0cmFwUm9sZSBBUk4nKTtcbiAgICByZXR1cm4gbmV3IEJvb3RzdHJhcFJvbGUoYXJuKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIENMSV9DUkVEUyA9ICdjbGktY3JlZGVudGlhbHMnO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByb2xlQXJuOiBzdHJpbmcpIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgb2JqZWN0IHdhcyBjcmVhdGVkIHVzaW5nIEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKVxuICAgKi9cbiAgcHVibGljIGlzQ2xpQ3JlZGVudGlhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucm9sZUFybiA9PT0gQm9vdHN0cmFwUm9sZS5DTElfQ1JFRFM7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2FybkZvckNsb3VkRm9ybWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmlzQ2xpQ3JlZGVudGlhbHMoKSA/IHVuZGVmaW5lZCA6IHRyYW5zbGF0ZUFzc2V0VG9rZW5Ub0NmblRva2VuKHRoaXMucm9sZUFybik7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2FybkZvckNsb3VkQXNzZW1ibHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDbGlDcmVkZW50aWFscygpID8gdW5kZWZpbmVkIDogdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4odGhpcy5yb2xlQXJuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfc3BlY2lhbGl6ZShzcGVjOiBTdHJpbmdTcGVjaWFsaXplcikge1xuICAgIHJldHVybiBuZXcgQm9vdHN0cmFwUm9sZShzcGVjLnNwZWNpYWxpemUodGhpcy5yb2xlQXJuKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXBsb3ltZW50IGlkZW50aXRpZXMgYXJlIHRoZSBjbGFzcyBvZiByb2xlcyB0byBiZSBhc3N1bWVkIGJ5IHRoZSBDREtcbiAqIHdoZW4gZGVwbG95aW5nIHRoZSBBcHAuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3ltZW50SWRlbnRpdGllcyB7XG4gIC8qKlxuICAgKiBVc2UgQ0xJIGNyZWRlbnRpYWxzIGZvciBhbGwgZGVwbG95bWVudCBpZGVudGl0aWVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGlDcmVkZW50aWFscygpOiBEZXBsb3ltZW50SWRlbnRpdGllcyB7XG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50SWRlbnRpdGllcyh7XG4gICAgICBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU6IEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKSxcbiAgICAgIGRlcGxveW1lbnRSb2xlOiBCb290c3RyYXBSb2xlLmNsaUNyZWRlbnRpYWxzKCksXG4gICAgICBsb29rdXBSb2xlOiBCb290c3RyYXBSb2xlLmNsaUNyZWRlbnRpYWxzKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSB5b3VyIG93biByb2xlcyBmb3IgYWxsIGRlcGxveW1lbnQgaWRlbnRpdGllcy4gVGhlc2Ugcm9sZXNcbiAgICogbXVzdCBhbHJlYWR5IGV4aXN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGVjaWZ5Um9sZXMocm9sZXM6IEJvb3RzdHJhcFJvbGVzKTogRGVwbG95bWVudElkZW50aXRpZXMge1xuICAgIHJldHVybiBuZXcgRGVwbG95bWVudElkZW50aXRpZXMocm9sZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgUm9sZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUgZGVmYXVsdCBib290c3RyYXAgc3RhY2tcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdEJvb3RzdHJhcFJvbGVzKG9wdGlvbnM6IERlZmF1bHRCb290c3RyYXBSb2xlc09wdGlvbnMgPSB7fSk6IERlcGxveW1lbnRJZGVudGl0aWVzIHtcbiAgICBmdW5jdGlvbiByZXBsYWNlUGxhY2Vob2xkZXJzKHg6IHN0cmluZykge1xuICAgICAgaWYgKG9wdGlvbnMuYm9vdHN0cmFwUmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeCA9IHgucmVwbGFjZSgvXFwkXFx7QVdTOjpSZWdpb25cXH0vZywgb3B0aW9ucy5ib290c3RyYXBSZWdpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50SWRlbnRpdGllcyh7XG4gICAgICBkZXBsb3ltZW50Um9sZTogQm9vdHN0cmFwUm9sZS5mcm9tUm9sZUFybihyZXBsYWNlUGxhY2Vob2xkZXJzKEFwcFN0YWdpbmdTeW50aGVzaXplci5ERUZBVUxUX0RFUExPWV9ST0xFX0FSTikpLFxuICAgICAgY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlOiBCb290c3RyYXBSb2xlLmZyb21Sb2xlQXJuKHJlcGxhY2VQbGFjZWhvbGRlcnMoQXBwU3RhZ2luZ1N5bnRoZXNpemVyLkRFRkFVTFRfQ0xPVURGT1JNQVRJT05fUk9MRV9BUk4pKSxcbiAgICAgIGxvb2t1cFJvbGU6IEJvb3RzdHJhcFJvbGUuZnJvbVJvbGVBcm4ocmVwbGFjZVBsYWNlaG9sZGVycyhBcHBTdGFnaW5nU3ludGhlc2l6ZXIuREVGQVVMVF9MT09LVVBfUk9MRV9BUk4pKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG91ZEZvcm1hdGlvbiBFeGVjdXRpb24gUm9sZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIERlcGxveW1lbnQgQWN0aW9uIFJvbGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXBsb3ltZW50Um9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIExvb2t1cCBSb2xlXG4gICAgQGRlZmF1bHQgLSB1c2UgYm9vdHN0cmFwcGVkIHJvbGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb29rdXBSb2xlPzogQm9vdHN0cmFwUm9sZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIC8qKiByb2xlcyB0aGF0IGFyZSBib290c3RyYXBwZWQgdG8geW91ciBhY2NvdW50LiAqL1xuICAgIHJvbGVzOiBCb290c3RyYXBSb2xlcyxcbiAgKSB7XG4gICAgdGhpcy5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGUgPSByb2xlcy5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU7XG4gICAgdGhpcy5kZXBsb3ltZW50Um9sZSA9IHJvbGVzLmRlcGxveW1lbnRSb2xlO1xuICAgIHRoaXMubG9va3VwUm9sZSA9IHJvbGVzLmxvb2t1cFJvbGU7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgRGVwbG95bWVudElkZW50aXRpZXMuZGVmYXVsdEJvb3RzdHJhcHBlZFJvbGVzYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRCb290c3RyYXBSb2xlc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHJlZ2lvbiB3aGVyZSB0aGUgZGVmYXVsdCBib290c3RyYXAgcm9sZXMgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhlIHJlZ2lvbiBpbiB3aGljaCB0aGUgc3RhY2sgaXMgZGVwbG95ZWQgaXMgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgc3RhY2sncyBjdXJyZW50IHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgYm9vdHN0cmFwUmVnaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJvbGVzIHRoYXQgYXJlIGJvb3RzdHJhcHBlZCB0byB5b3VyIGFjY291bnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwUm9sZXMge1xuICAvKipcbiAgICogQ2xvdWRGb3JtYXRpb24gRXhlY3V0aW9uIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgYm9vdHN0cmFwcGVkIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIERlcGxveW1lbnQgQWN0aW9uIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgYm9vc3RyYXBwZWQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFJvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBMb29rdXAgUm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVzZSBib290c3RyYXBwZWQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZT86IEJvb3RzdHJhcFJvbGU7XG59XG5cbi8qKlxuICogUm9sZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIFN0YWdpbmcgU3RhY2tcbiAqIChmb3IgYWNjZXNzIHRvIFN0YWdpbmcgUmVzb3VyY2VzKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdpbmdSb2xlcyB7XG4gIC8qKlxuICAgKiBGaWxlIEFzc2V0IFB1Ymxpc2hpbmcgUm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN0YWdpbmcgc3RhY2sgY3JlYXRlcyBhIGZpbGUgYXNzZXQgcHVibGlzaGluZyByb2xlXG4gICAqL1xuICByZWFkb25seSBmaWxlQXNzZXRQdWJsaXNoaW5nUm9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIERvY2tlciBBc3NldCBQdWJsaXNoaW5nIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdGFnaW5nIHN0YWNrIGNyZWF0ZXMgYSBkb2NrZXIgYXNzZXQgcHVibGlzaGluZyByb2xlXG4gICAqL1xuICByZWFkb25seSBkb2NrZXJBc3NldFB1Ymxpc2hpbmdSb2xlPzogQm9vdHN0cmFwUm9sZTtcbn1cbiJdfQ==
@@ -39,9 +39,18 @@ export interface DefaultStagingStackOptions {
39
39
  /**
40
40
  * Encryption type for staging bucket
41
41
  *
42
- * @default - s3.BucketEncryption.KMS
42
+ * In future versions of this package, the default will be BucketEncryption.S3_MANAGED.
43
+ *
44
+ * In previous versions of this package, the default was to use KMS encryption for the staging bucket. KMS keys cost
45
+ * $1/month, which could result in unexpected costs for users who are not aware of this. As we stabilize this module
46
+ * we intend to make the default S3-managed encryption, which is free. However, the migration path from KMS to S3
47
+ * managed encryption for existing buckets is not straightforward. Therefore, for now, this property is required.
48
+ *
49
+ * If you have an existing staging bucket encrypted with a KMS key, you will likely want to set this property to
50
+ * BucketEncryption.KMS. If you are creating a new staging bucket, you can set this property to
51
+ * BucketEncryption.S3_MANAGED to avoid the cost of a KMS key.
43
52
  */
44
- readonly stagingBucketEncryption?: s3.BucketEncryption;
53
+ readonly stagingBucketEncryption: s3.BucketEncryption;
45
54
  /**
46
55
  * Pass in an existing role to be used as the file publishing role.
47
56
  *
@@ -121,7 +130,8 @@ export interface DefaultStagingStackProps extends DefaultStagingStackOptions, St
121
130
  * A default Staging Stack that implements IStagingResources.
122
131
  *
123
132
  * @example
124
- * const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id' });
133
+ * import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
134
+ * const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id', stagingBucketEncryption: BucketEncryption.S3_MANAGED });
125
135
  */
126
136
  export declare class DefaultStagingStack extends Stack implements IStagingResources {
127
137
  private readonly props;
@@ -151,7 +161,7 @@ export declare class DefaultStagingStack extends Stack implements IStagingResour
151
161
  readonly dependencyStack: Stack;
152
162
  private readonly appId;
153
163
  private readonly stagingBucketName?;
154
- private stagingBucketEncryption?;
164
+ private stagingBucketEncryption;
155
165
  /**
156
166
  * File publish role ARN in asset manifest format
157
167
  */
@@ -30,12 +30,13 @@ class UsingAppStagingSynthesizer extends constructs_1.Construct {
30
30
  }
31
31
  exports.UsingAppStagingSynthesizer = UsingAppStagingSynthesizer;
32
32
  _a = JSII_RTTI_SYMBOL_1;
33
- UsingAppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.UsingAppStagingSynthesizer", version: "2.126.0-alpha.0" };
33
+ UsingAppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.UsingAppStagingSynthesizer", version: "2.128.0-alpha.0" };
34
34
  /**
35
35
  * A default Staging Stack that implements IStagingResources.
36
36
  *
37
37
  * @example
38
- * const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id' });
38
+ * import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
39
+ * const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id', stagingBucketEncryption: BucketEncryption.S3_MANAGED });
39
40
  */
40
41
  class DefaultStagingStack extends core_1.Stack {
41
42
  /**
@@ -122,6 +123,8 @@ class DefaultStagingStack extends core_1.Stack {
122
123
  this.dependencyStack = this;
123
124
  this.deployRoleArn = props.deployRoleArn;
124
125
  this.stagingBucketName = props.stagingBucketName;
126
+ // FIXME: when stabilizing this module, we should make `stagingBucketEncryption` optional, defaulting to S3_MANAGED.
127
+ // See https://github.com/aws/aws-cdk/pull/28978#issuecomment-1930007176 for details on this decision.
125
128
  this.stagingBucketEncryption = props.stagingBucketEncryption;
126
129
  const specializer = new helpers_internal_1.StringSpecializer(this, props.qualifier);
127
130
  this.providedFileRole = props.fileAssetPublishingRole?._specialize(specializer);
@@ -211,11 +214,7 @@ class DefaultStagingStack extends core_1.Stack {
211
214
  }
212
215
  this.ensureFileRole();
213
216
  let key = undefined;
214
- if (this.stagingBucketEncryption === s3.BucketEncryption.KMS || this.stagingBucketEncryption === undefined) {
215
- if (this.stagingBucketEncryption === undefined) {
216
- // default is KMS as an AWS best practice, and for backwards compatibility
217
- this.stagingBucketEncryption = s3.BucketEncryption.KMS;
218
- }
217
+ if (this.stagingBucketEncryption === s3.BucketEncryption.KMS) {
219
218
  key = this.createBucketKey();
220
219
  }
221
220
  // Create the bucket once the dependencies have been created
@@ -329,5 +328,5 @@ class DefaultStagingStack extends core_1.Stack {
329
328
  }
330
329
  exports.DefaultStagingStack = DefaultStagingStack;
331
330
  _b = JSII_RTTI_SYMBOL_1;
332
- DefaultStagingStack[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DefaultStagingStack", version: "2.126.0-alpha.0" };
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MseUNBQXlDO0FBQ3pDLDJDQVkwQjtBQUMxQiw0RUFBMEU7QUFDMUUsNENBQTRDO0FBQzVDLDJDQUF1QztBQUkxQixRQUFBLGtCQUFrQixHQUFHLGNBQWMsQ0FBQztBQUVqRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSwwQkFBMkIsU0FBUSxzQkFBUztJQUN2RCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2xCOztBQUhILGdFQUlDOzs7QUFrSEQ7Ozs7O0dBS0c7QUFDSCxNQUFhLG1CQUFvQixTQUFRLFlBQUs7SUFDNUM7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQW1DOzs7Ozs7Ozs7O1FBQ3ZELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekYsT0FBTztZQUNMLHNCQUFzQixDQUFDLEtBQUssRUFBRSxPQUFPO2dCQUNuQyxNQUFNLEdBQUcsR0FBRyxVQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsVUFBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxDQUFDLFNBQVMseUJBQXlCLENBQUMsQ0FBQztnQkFDckUsQ0FBQztnQkFFRCw0RUFBNEU7Z0JBQzVF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O1FBQ25DLG9DQUFvQztRQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFMUMsT0FBTztZQUNMLFVBQVU7WUFDVixhQUFhLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtZQUN2QyxNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsMEJBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekQsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztLQUNIO0lBRU0sY0FBYyxDQUFDLEtBQTZCO1FBQ2pELG9DQUFvQztRQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLE9BQU87WUFDTCxRQUFRO1lBQ1IsYUFBYSxFQUFFLElBQUksQ0FBQyxvQkFBb0I7WUFDeEMsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztLQUNIO0lBRUQ7OztPQUdHO0lBQ0ksbUJBQW1CLENBQUMsT0FBMEIsRUFBRSxhQUFrQztRQUN2RixLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRWxELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2QyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxJQUFJLFFBQVEsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7S0FDRjs7QUF4Vkgsa0RBeVZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGVjciBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQge1xuICBBcHAsXG4gIEFybkZvcm1hdCxcbiAgQm9vdHN0cmFwbGVzc1N5bnRoZXNpemVyLFxuICBEb2NrZXJJbWFnZUFzc2V0U291cmNlLFxuICBEdXJhdGlvbixcbiAgRmlsZUFzc2V0U291cmNlLFxuICBJU3ludGhlc2lzU2Vzc2lvbixcbiAgUmVtb3ZhbFBvbGljeSxcbiAgU3RhY2ssXG4gIFN0YWNrUHJvcHMsXG4gIElOTElORV9DVVNUT01fUkVTT1VSQ0VfQ09OVEVYVCxcbn0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBTdHJpbmdTcGVjaWFsaXplciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnYXdzLWNkay1saWIvY3gtYXBpJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQm9vdHN0cmFwUm9sZSB9IGZyb20gJy4vYm9vdHN0cmFwLXJvbGVzJztcbmltcG9ydCB7IEZpbGVTdGFnaW5nTG9jYXRpb24sIElTdGFnaW5nUmVzb3VyY2VzLCBJU3RhZ2luZ1Jlc291cmNlc0ZhY3RvcnksIEltYWdlU3RhZ2luZ0xvY2F0aW9uIH0gZnJvbSAnLi9zdGFnaW5nLXN0YWNrJztcblxuZXhwb3J0IGNvbnN0IERFUExPWV9USU1FX1BSRUZJWCA9ICdkZXBsb3ktdGltZS8nO1xuXG4vKipcbiAqIFRoaXMgaXMgYSBkdW1teSBjb25zdHJ1Y3QgbWVhbnQgdG8gc2lnbmlmeSB0aGF0IGEgc3RhY2sgaXMgdXRpbGl6aW5nXG4gKiB0aGUgQXBwU3RhZ2luZ1N5bnRoZXNpemVyLiBJdCBkb2VzIG5vdCBkbyBhbnl0aGluZywgYW5kIGlzIG5vdCBtZWFudFxuICogdG8gYmUgY3JlYXRlZCBvbiBpdHMgb3duLiBUaGlzIGNvbnN0cnVjdCB3aWxsIGJlIGEgcGFydCBvZiB0aGVcbiAqIGNvbnN0cnVjdCB0cmVlIG9ubHkgYW5kIG5vdCB0aGUgQ2ZuIHRlbXBsYXRlLiBUaGUgY29uc3RydWN0IHRyZWUgaXNcbiAqIHRoZW4gZW5jb2RlZCBpbiB0aGUgQVdTOjpDREs6Ok1ldGFkYXRhIHJlc291cmNlIG9mIHRoZSBzdGFjayBhbmRcbiAqIGluamVzdGVkIGluIG91ciBtZXRyaWNzIGxpa2UgZXZlcnkgb3RoZXIgY29uc3RydWN0LlxuICovXG5leHBvcnQgY2xhc3MgVXNpbmdBcHBTdGFnaW5nU3ludGhlc2l6ZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZXIgY29uZmlndXJhYmxlIG9wdGlvbnMgdG8gdGhlIERlZmF1bHRTdGFnaW5nU3RhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdFN0YWdpbmdTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFwcGxpY2F0aW9uIHRoYXQgdGhlIHN0YWdpbmcgc3RhY2sgYmVsb25ncyB0by5cbiAgICpcbiAgICogVGhpcyBpZGVudGlmaWVyIHdpbGwgYmUgdXNlZCBpbiB0aGUgbmFtZSBvZiBzdGFnaW5nIHJlc291cmNlc1xuICAgKiBjcmVhdGVkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgQ0RLIGFwcHMuXG4gICAqXG4gICAqIFRoZSBpZGVudGlmaWVyIHNob3VsZCBpbmNsdWRlIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCBkYXNoZXMgKCctJykgb25seVxuICAgKiBhbmQgaGF2ZSBhIG1heGltdW0gb2YgMjAgY2hhcmFjdGVycy5cbiAgICovXG4gIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IG5hbWUgZm9yIHRoZSBzdGFnaW5nIGJ1Y2tldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgd2VsbC1rbm93biBuYW1lIHVuaXF1ZSB0byB0aGlzIGFwcC9lbnYuXG4gICAqL1xuICByZWFkb25seSBzdGFnaW5nQnVja2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRW5jcnlwdGlvbiB0eXBlIGZvciBzdGFnaW5nIGJ1Y2tldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TXG4gICAqL1xuICByZWFkb25seSBzdGFnaW5nQnVja2V0RW5jcnlwdGlvbj86IHMzLkJ1Y2tldEVuY3J5cHRpb247XG5cbiAgLyoqXG4gICAqIFBhc3MgaW4gYW4gZXhpc3Rpbmcgcm9sZSB0byBiZSB1c2VkIGFzIHRoZSBmaWxlIHB1Ymxpc2hpbmcgcm9sZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5ldyByb2xlIHdpbGwgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBQYXNzIGluIGFuIGV4aXN0aW5nIHJvbGUgdG8gYmUgdXNlZCBhcyB0aGUgaW1hZ2UgcHVibGlzaGluZyByb2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlmZXRpbWUgZm9yIGRlcGxveSB0aW1lIGZpbGUgYXNzZXRzLlxuICAgKlxuICAgKiBBc3NldHMgdGhhdCBhcmUgb25seSBuZWNlc3NhcnkgYXQgZGVwbG95bWVudCB0aW1lIChmb3IgaW5zdGFuY2UsXG4gICAqIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcyBhbmQgTGFtYmRhIHNvdXJjZSBjb2RlIGJ1bmRsZXMpIHdpbGwgYmVcbiAgICogYXV0b21hdGljYWxseSBkZWxldGVkIGFmdGVyIHRoaXMgbWFueSBkYXlzLiBBc3NldHMgdGhhdCBtYXkgYmVcbiAgICogcmVhZCBmcm9tIHRoZSBzdGFnaW5nIGJ1Y2tldCBkdXJpbmcgeW91ciBhcHBsaWNhdGlvbidzIHJ1biB0aW1lXG4gICAqIHdpbGwgbm90IGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIFNldCB0aGlzIHRvIHRoZSBsZW5ndGggb2YgdGltZSB5b3Ugd2lzaCB0byBiZSBhYmxlIHRvIHJvbGwgYmFjayB0b1xuICAgKiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB5b3VyIGFwcGxpY2F0aW9uIHdpdGhvdXQgaGF2aW5nIHRvIGRvIGEgbmV3XG4gICAqIGBjZGsgc3ludGhgIGFuZCByZS11cGxvYWQgb2YgYXNzZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIER1cmF0aW9uLmRheXMoMzApXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lUaW1lRmlsZUFzc2V0TGlmZXRpbWU/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIHZlcnNpb25zIHRvIHN0b3JlIGluIGEgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogUHJldmlvdXMgdmVyc2lvbnMgb2YgYW4gaW1hZ2UgY2FuIGJlIHN0b3JlZCBmb3Igcm9sbGJhY2sgcHVycG9zZXMuXG4gICAqIE9uY2UgYSByZXBvc2l0b3J5IGhhcyBtb3JlIHRoYW4gMyBpbWFnZSB2ZXJzaW9ucyBzdG9yZWQsIHRoZSBvbGRlc3RcbiAgICogdmVyc2lvbiB3aWxsIGJlIGRpc2NhcmRlZC4gVGhpcyBhbGxvd3MgZm9yIHNlbnNpYmxlIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgKiB3aGlsZSBtYWludGFpbmluZyBhIGZldyBwcmV2aW91cyB2ZXJzaW9ucyBmb3Igcm9sbGJhY2sgc2NlbmFyaW9zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVwIHRvIDMgdmVyc2lvbnMgc3RvcmVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0VmVyc2lvbkNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdXRvIGRlbGV0ZXMgb2JqZWN0cyBpbiB0aGUgc3RhZ2luZyBTMyBidWNrZXQgYW5kIGltYWdlcyBpbiB0aGVcbiAgICogc3RhZ2luZyBFQ1IgcmVwb3NpdG9yaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhdXRvRGVsZXRlU3RhZ2luZ0Fzc2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBjdXN0b20gcHJlZml4IHRvIGJlIHVzZWQgYXMgdGhlIHN0YWdpbmcgc3RhY2sgbmFtZSBhbmRcbiAgICogY29uc3RydWN0IElELiBUaGUgcHJlZml4IHdpbGwgYmUgYXBwZW5kZWQgYmVmb3JlIHRoZSBhcHBJZCwgd2hpY2hcbiAgICogaXMgcmVxdWlyZWQgdG8gYmUgcGFydCBvZiB0aGUgc3RhY2sgbmFtZSBhbmQgY29uc3RydWN0IElEIHRvXG4gICAqIGVuc3VyZSB1bmlxdWVuZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnU3RhZ2luZ1N0YWNrJ1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2luZ1N0YWNrTmFtZVByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IFN0YWdpbmcgU3RhY2sgUHJvcGVydGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRTdGFnaW5nU3RhY2tQcm9wcyBleHRlbmRzIERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zLCBTdGFja1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGRlcGxveSBhY3Rpb24gcm9sZSwgaWYgZ2l2ZW5cbiAgICpcbiAgICogVGhpcyByb2xlIHdpbGwgbmVlZCBwZXJtaXNzaW9ucyB0byByZWFkIGZyb20gdG8gdGhlIHN0YWdpbmcgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBDTEkgY3JlZGVudGlhbHMgYXJlIGFzc3VtZWQsIG5vIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcXVhbGlmaWVyIHVzZWQgdG8gc3BlY2lhbGl6ZSBzdHJpbmdzXG4gICAqXG4gICAqIFNob3VsZG4ndCBiZSBuZWNlc3NhcnkgYnV0IHdobyBrbm93cyB3aGF0IHBlb3BsZSBtaWdodCBkby5cbiAgICovXG4gIHJlYWRvbmx5IHF1YWxpZmllcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgZGVmYXVsdCBTdGFnaW5nIFN0YWNrIHRoYXQgaW1wbGVtZW50cyBJU3RhZ2luZ1Jlc291cmNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGVmYXVsdFN0YWdpbmdTdGFjayA9IERlZmF1bHRTdGFnaW5nU3RhY2suZmFjdG9yeSh7IGFwcElkOiAnbXktYXBwLWlkJyB9KTtcbiAqL1xuZXhwb3J0IGNsYXNzIERlZmF1bHRTdGFnaW5nU3RhY2sgZXh0ZW5kcyBTdGFjayBpbXBsZW1lbnRzIElTdGFnaW5nUmVzb3VyY2VzIHtcbiAgLyoqXG4gICAqIFJldHVybiBhIGZhY3RvcnkgdGhhdCB3aWxsIGNyZWF0ZSBEZWZhdWx0U3RhZ2luZ1N0YWNrc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmYWN0b3J5KG9wdGlvbnM6IERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zKTogSVN0YWdpbmdSZXNvdXJjZXNGYWN0b3J5IHtcbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQudG9Mb2NhbGVMb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJykuc2xpY2UoMCwgMjApO1xuICAgIHJldHVybiB7XG4gICAgICBvYnRhaW5TdGFnaW5nUmVzb3VyY2VzKHN0YWNrLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGFwcCA9IEFwcC5vZihzdGFjayk7XG4gICAgICAgIGlmICghQXBwLmlzQXBwKGFwcCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YWNrICR7c3RhY2suc3RhY2tOYW1lfSBtdXN0IGJlIHBhcnQgb2YgYW4gQXBwYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZWNhdXNlIHdlIGRvIG5vdCBrZWVwIG1ldHJpY3MgaW4gdGhlIERlZmF1bHRTdGFnaW5nU3RhY2ssIHdlIHdpbGwgaW5qZWN0XG4gICAgICAgIC8vIGEgZHVtbXkgY29uc3RydWN0IGludG8gdGhlIHN0YWNrIHVzaW5nIHRoZSBEZWZhdWx0U3RhZ2luZ1N0YWNrIGluc3RlYWQuXG4gICAgICAgIGlmIChjeGFwaS5BTkFMWVRJQ1NfUkVQT1JUSU5HX0VOQUJMRURfQ09OVEVYVCkge1xuICAgICAgICAgIG5ldyBVc2luZ0FwcFN0YWdpbmdTeW50aGVzaXplcihzdGFjaywgYFVzaW5nQXBwU3RhZ2luZ1N5bnRoZXNpemVyLyR7c3RhY2suc3RhY2tOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhY2tQcmVmaXggPSBvcHRpb25zLnN0YWdpbmdTdGFja05hbWVQcmVmaXggPz8gJ1N0YWdpbmdTdGFjayc7XG4gICAgICAgIC8vIFN0YWNrIG5hbWUgZG9lcyBub3QgbmVlZCB0byBjb250YWluIGVudmlyb25tZW50IGJlY2F1c2UgYXBwSWQgaXMgdW5pcXVlIGluc2lkZSBhbiBlbnZcbiAgICAgICAgY29uc3Qgc3RhY2tOYW1lID0gYCR7c3RhY2tQcmVmaXh9LSR7YXBwSWR9YDtcbiAgICAgICAgY29uc3Qgc3RhY2tJZCA9IGAke3N0YWNrTmFtZX0tJHtjb250ZXh0LmVudmlyb25tZW50U3RyaW5nfWA7XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFN0YWdpbmdTdGFjayhhcHAsIHN0YWNrSWQsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIHN0YWNrTmFtZSxcbiAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgIGFjY291bnQ6IHN0YWNrLmFjY291bnQsXG4gICAgICAgICAgICByZWdpb246IHN0YWNrLnJlZ2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwcElkLFxuICAgICAgICAgIHF1YWxpZmllcjogY29udGV4dC5xdWFsaWZpZXIsXG4gICAgICAgICAgZGVwbG95Um9sZUFybjogY29udGV4dC5kZXBsb3lSb2xlQXJuLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGFzc2V0IHB1Ymxpc2hpbmcgcm9sZSBuYW1lIGZvciBmaWxlIChTMykgYXNzZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZmlsZVJvbGVOYW1lKCkge1xuICAgIHJldHVybiBgY2RrLSR7dGhpcy5hcHBJZH0tZmlsZS1yb2xlLSR7dGhpcy5yZWdpb259YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGFzc2V0IHB1Ymxpc2hpbmcgcm9sZSBuYW1lIGZvciBkb2NrZXIgKEVDUikgYXNzZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgaW1hZ2VSb2xlTmFtZSgpIHtcbiAgICByZXR1cm4gYGNkay0ke3RoaXMuYXBwSWR9LWltYWdlLXJvbGUtJHt0aGlzLnJlZ2lvbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhcHAtc2NvcGVkLCBldmlyb25tZW50LWtleWVkIHN0YWdpbmcgYnVja2V0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YWdpbmdCdWNrZXQ/OiBzMy5CdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBhcHAtc2NvcGVkLCBlbnZpcm9ubWVudC1rZXllZCBlY3IgcmVwb3NpdG9yaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFwcC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGFnaW5nUmVwb3M6IFJlY29yZDxzdHJpbmcsIGVjci5SZXBvc2l0b3J5PjtcblxuICAvKipcbiAgICogVGhlIHN0YWNrIHRvIGFkZCBkZXBlbmRlbmNpZXMgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVwZW5kZW5jeVN0YWNrOiBTdGFjaztcblxuICBwcml2YXRlIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2luZ0J1Y2tldE5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhZ2luZ0J1Y2tldEVuY3J5cHRpb24/OiBzMy5CdWNrZXRFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBGaWxlIHB1Ymxpc2ggcm9sZSBBUk4gaW4gYXNzZXQgbWFuaWZlc3QgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVkRmlsZVJvbGU/OiBCb290c3RyYXBSb2xlO1xuICBwcml2YXRlIGZpbGVSb2xlPzogaWFtLklSb2xlO1xuICBwcml2YXRlIGZpbGVSb2xlTWFuaWZlc3RBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEltYWdlIHB1Ymxpc2hpbmcgcm9sZSBBUk4gaW4gYXNzZXQgbWFuaWZlc3QgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVkSW1hZ2VSb2xlPzogQm9vdHN0cmFwUm9sZTtcbiAgcHJpdmF0ZSBpbWFnZVJvbGU/OiBpYW0uSVJvbGU7XG4gIHByaXZhdGUgZGlkSW1hZ2VSb2xlID0gZmFsc2U7XG4gIHByaXZhdGUgaW1hZ2VSb2xlTWFuaWZlc3RBcm4/OiBzdHJpbmc7XG4gIHByaXZhdGUgYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXBsb3lSb2xlQXJuPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBBcHAsIGlkOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IERlZmF1bHRTdGFnaW5nU3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBzeW50aGVzaXplcjogbmV3IEJvb3RzdHJhcGxlc3NTeW50aGVzaXplcigpLFxuICAgICAgZGVzY3JpcHRpb246IGBUaGlzIHN0YWNrIGluY2x1ZGVzIHJlc291cmNlcyBuZWVkZWQgdG8gZGVwbG95IHRoZSBBV1MgQ0RLIGFwcCAke3Byb3BzLmFwcElkfSBpbnRvIHRoaXMgZW52aXJvbm1lbnRgLFxuICAgICAgYW5hbHl0aWNzUmVwb3J0aW5nOiBmYWxzZSwgLy8gcmVtb3ZpbmcgQVdTOjpDREs6Ok1ldGFkYXRhIGNvbnN0cnVjdCBzYXZlcyB+M0tCXG4gICAgfSk7XG4gICAgLy8gcmVtb3ZpbmcgcGF0aCBtZXRhZGF0YSBzYXZlcyB+MktCXG4gICAgdGhpcy5ub2RlLnNldENvbnRleHQoY3hhcGkuUEFUSF9NRVRBREFUQV9FTkFCTEVfQ09OVEVYVCwgZmFsc2UpO1xuXG4gICAgLy8gRm9yIGFsbCByZXNvdXJjZXMgdW5kZXIgdGhlIGRlZmF1bHQgc3RhZ2luZyBzdGFjaywgd2Ugd2FudCB0byBpbmxpbmUgY3VzdG9tXG4gICAgLy8gcmVzb3VyY2VzIGJlY2F1c2UgdGhlIHN0YWdpbmcgYnVja2V0IG5lY2Vzc2FyeSBmb3IgY3VzdG9tIHJlc291cmNlIGFzc2V0c1xuICAgIC8vIGRvZXMgbm90IGV4aXN0IHlldC5cbiAgICB0aGlzLm5vZGUuc2V0Q29udGV4dChJTkxJTkVfQ1VTVE9NX1JFU09VUkNFX0NPTlRFWFQsIHRydWUpO1xuICAgIHRoaXMuYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHMgPSBwcm9wcy5hdXRvRGVsZXRlU3RhZ2luZ0Fzc2V0cyA/PyB0cnVlO1xuXG4gICAgdGhpcy5hcHBJZCA9IHRoaXMudmFsaWRhdGVBcHBJZChwcm9wcy5hcHBJZCk7XG4gICAgdGhpcy5kZXBlbmRlbmN5U3RhY2sgPSB0aGlzO1xuXG4gICAgdGhpcy5kZXBsb3lSb2xlQXJuID0gcHJvcHMuZGVwbG95Um9sZUFybjtcbiAgICB0aGlzLnN0YWdpbmdCdWNrZXROYW1lID0gcHJvcHMuc3RhZ2luZ0J1Y2tldE5hbWU7XG4gICAgdGhpcy5zdGFnaW5nQnVja2V0RW5jcnlwdGlvbiA9IHByb3BzLnN0YWdpbmdCdWNrZXRFbmNyeXB0aW9uO1xuICAgIGNvbnN0IHNwZWNpYWxpemVyID0gbmV3IFN0cmluZ1NwZWNpYWxpemVyKHRoaXMsIHByb3BzLnF1YWxpZmllcik7XG5cbiAgICB0aGlzLnByb3ZpZGVkRmlsZVJvbGUgPSBwcm9wcy5maWxlQXNzZXRQdWJsaXNoaW5nUm9sZT8uX3NwZWNpYWxpemUoc3BlY2lhbGl6ZXIpO1xuICAgIHRoaXMucHJvdmlkZWRJbWFnZVJvbGUgPSBwcm9wcy5pbWFnZUFzc2V0UHVibGlzaGluZ1JvbGU/Ll9zcGVjaWFsaXplKHNwZWNpYWxpemVyKTtcbiAgICB0aGlzLnN0YWdpbmdSZXBvcyA9IHt9O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFwcElkKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBpZiAoaWQubGVuZ3RoID4gMjApIHtcbiAgICAgIGVycm9ycy5wdXNoKGBhcHBJZCBleHBlY3RlZCBubyBtb3JlIHRoYW4gMjAgY2hhcmFjdGVycyBidXQgZ290ICR7aWQubGVuZ3RofSBjaGFyYWN0ZXJzLmApO1xuICAgIH1cbiAgICBpZiAoaWQgIT09IGlkLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdhcHBJZCBvbmx5IGFjY2VwdHMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuJyk7XG4gICAgfVxuICAgIGlmICghL15bYS16MC05LV0qJC8udGVzdChpZCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdhcHBJZCBleHBlY3RzIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIGRhc2hlcyAoXFwnLVxcJyknKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgIGBhcHBJZCAke2lkfSBoYXMgZXJyb3JzOmAsXG4gICAgICAgIC4uLmVycm9ycyxcbiAgICAgIF0uam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUZpbGVSb2xlKCkge1xuICAgIGlmICh0aGlzLnByb3ZpZGVkRmlsZVJvbGUpIHtcbiAgICAgIC8vIE92ZXJyaWRlXG4gICAgICB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4gPSB0aGlzLnByb3ZpZGVkRmlsZVJvbGUuX2FybkZvckNsb3VkQXNzZW1ibHkoKTtcbiAgICAgIGNvbnN0IGNmbkFybiA9IHRoaXMucHJvdmlkZWRGaWxlUm9sZS5fYXJuRm9yQ2xvdWRGb3JtYXRpb24oKTtcbiAgICAgIHRoaXMuZmlsZVJvbGUgPSBjZm5Bcm4gPyBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnQ2RrRmlsZVJvbGUnLCBjZm5Bcm4pIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJvbGVOYW1lID0gdGhpcy5maWxlUm9sZU5hbWU7XG4gICAgdGhpcy5maWxlUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnQ2RrRmlsZVJvbGUnLCB7XG4gICAgICByb2xlTmFtZSxcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKHRoaXMuYWNjb3VudCksXG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4gPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgcGFydGl0aW9uOiAnJHtBV1M6OlBhcnRpdGlvbn0nLFxuICAgICAgcmVnaW9uOiAnJywgLy8gaWFtIGlzIGdsb2JhbFxuICAgICAgc2VydmljZTogJ2lhbScsXG4gICAgICByZXNvdXJjZTogJ3JvbGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiByb2xlTmFtZSxcbiAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUltYWdlUm9sZSgpIHtcbiAgICAvLyBJdCBtYXkgZW5kIHVwIHNldHRpbmcgaW1hZ2VSb2xlIHRvIHVuZGVmaW5lZCwgYnV0IGF0IGxlYXN0IHdlIHRyaWVkXG4gICAgaWYgKHRoaXMuZGlkSW1hZ2VSb2xlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlkSW1hZ2VSb2xlID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnByb3ZpZGVkSW1hZ2VSb2xlKSB7XG4gICAgICAvLyBPdmVycmlkZVxuICAgICAgdGhpcy5pbWFnZVJvbGVNYW5pZmVzdEFybiA9IHRoaXMucHJvdmlkZWRJbWFnZVJvbGUuX2FybkZvckNsb3VkQXNzZW1ibHkoKTtcbiAgICAgIGNvbnN0IGNmbkFybiA9IHRoaXMucHJvdmlkZWRJbWFnZVJvbGUuX2FybkZvckNsb3VkRm9ybWF0aW9uKCk7XG4gICAgICB0aGlzLmltYWdlUm9sZSA9IGNmbkFybiA/IGlhbS5Sb2xlLmZyb21Sb2xlQXJuKHRoaXMsICdDZGtJbWFnZVJvbGUnLCBjZm5Bcm4pIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJvbGVOYW1lID0gdGhpcy5pbWFnZVJvbGVOYW1lO1xuICAgIHRoaXMuaW1hZ2VSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdDZGtJbWFnZVJvbGUnLCB7XG4gICAgICByb2xlTmFtZSxcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKHRoaXMuYWNjb3VudCksXG4gICAgfSk7XG4gICAgdGhpcy5pbWFnZVJvbGVNYW5pZmVzdEFybiA9IFN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICBwYXJ0aXRpb246ICcke0FXUzo6UGFydGl0aW9ufScsXG4gICAgICByZWdpb246ICcnLCAvLyBpYW0gaXMgZ2xvYmFsXG4gICAgICBzZXJ2aWNlOiAnaWFtJyxcbiAgICAgIHJlc291cmNlOiAncm9sZScsXG4gICAgICByZXNvdXJjZU5hbWU6IHJvbGVOYW1lLFxuICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnVja2V0S2V5KCk6IGttcy5JS2V5IHtcbiAgICByZXR1cm4gbmV3IGttcy5LZXkodGhpcywgJ0J1Y2tldEtleScsIHtcbiAgICAgIGFsaWFzOiBgYWxpYXMvY2RrLSR7dGhpcy5hcHBJZH0tc3RhZ2luZ2AsXG4gICAgICBhZG1pbnM6IFtuZXcgaWFtLkFjY291bnRQcmluY2lwYWwodGhpcy5hY2NvdW50KV0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENyZWF0ZUJ1Y2tldCgpIHtcbiAgICBjb25zdCBzdGFnaW5nQnVja2V0TmFtZSA9IHRoaXMuc3RhZ2luZ0J1Y2tldE5hbWUgPz8gYGNkay0ke3RoaXMuYXBwSWR9LXN0YWdpbmctJHt0aGlzLmFjY291bnR9LSR7dGhpcy5yZWdpb259YDtcbiAgICBjb25zdCBidWNrZXRJZCA9ICdDZGtTdGFnaW5nQnVja2V0JztcbiAgICBjb25zdCBjcmVhdGVkQnVja2V0ID0gdGhpcy5ub2RlLnRyeUZpbmRDaGlsZChidWNrZXRJZCkgYXMgczMuQnVja2V0O1xuICAgIGlmIChjcmVhdGVkQnVja2V0KSB7XG4gICAgICByZXR1cm4gc3RhZ2luZ0J1Y2tldE5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5lbnN1cmVGaWxlUm9sZSgpO1xuXG4gICAgbGV0IGtleSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5zdGFnaW5nQnVja2V0RW5jcnlwdGlvbiA9PT0gczMuQnVja2V0RW5jcnlwdGlvbi5LTVMgfHwgdGhpcy5zdGFnaW5nQnVja2V0RW5jcnlwdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zdGFnaW5nQnVja2V0RW5jcnlwdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGRlZmF1bHQgaXMgS01TIGFzIGFuIEFXUyBiZXN0IHByYWN0aWNlLCBhbmQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgIHRoaXMuc3RhZ2luZ0J1Y2tldEVuY3J5cHRpb24gPSBzMy5CdWNrZXRFbmNyeXB0aW9uLktNUztcbiAgICAgIH1cbiAgICAgIGtleSA9IHRoaXMuY3JlYXRlQnVja2V0S2V5KCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBidWNrZXQgb25jZSB0aGUgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBjcmVhdGVkXG4gICAgY29uc3QgYnVja2V0ID0gbmV3IHMzLkJ1Y2tldCh0aGlzLCBidWNrZXRJZCwge1xuICAgICAgYnVja2V0TmFtZTogc3RhZ2luZ0J1Y2tldE5hbWUsXG4gICAgICAuLi4odGhpcy5hdXRvRGVsZXRlU3RhZ2luZ0Fzc2V0cyA/IHtcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgIH0gOiB7XG4gICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgfSksXG4gICAgICBlbmNyeXB0aW9uOiB0aGlzLnN0YWdpbmdCdWNrZXRFbmNyeXB0aW9uLFxuICAgICAgZW5jcnlwdGlvbktleToga2V5LFxuXG4gICAgICAvLyBNYW55IEFXUyBhY2NvdW50IHNhZmV0eSBjaGVja2VycyB3aWxsIGNvbXBsYWluIHdoZW4gYnVja2V0cyBhcmVuJ3QgdmVyc2lvbmVkXG4gICAgICB2ZXJzaW9uZWQ6IHRydWUsXG4gICAgICAvLyBNYW55IEFXUyBhY2NvdW50IHNhZmV0eSBjaGVja2VycyB3aWxsIGNvbXBsYWluIHdoZW4gU1NMIGlzbid0IGVuZm9yY2VkXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZmlsZVJvbGUpIHtcbiAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmZpbGVSb2xlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXBsb3lSb2xlQXJuKSB7XG4gICAgICBidWNrZXQuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnczM6R2V0T2JqZWN0KicsXG4gICAgICAgICAgJ3MzOkdldEJ1Y2tldConLFxuICAgICAgICAgICdzMzpMaXN0KicsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW2J1Y2tldC5idWNrZXRBcm4sIGJ1Y2tldC5hcm5Gb3JPYmplY3RzKCcqJyldLFxuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5Bcm5QcmluY2lwYWwodGhpcy5kZXBsb3lSb2xlQXJuKV0sXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gT2JqZWN0cyBzaG91bGQgbmV2ZXIgYmUgb3ZlcndyaXR0ZW4sIGJ1dCBsZXQncyBtYWtlIHN1cmUgd2UgaGF2ZSBhIGxpZmVjeWNsZSBwb2xpY3lcbiAgICAvLyBmb3IgaXQgYW55d2F5LlxuICAgIGJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgIG5vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvbjogRHVyYXRpb24uZGF5cygzNjUpLFxuICAgIH0pO1xuXG4gICAgYnVja2V0LmFkZExpZmVjeWNsZVJ1bGUoe1xuICAgICAgcHJlZml4OiBERVBMT1lfVElNRV9QUkVGSVgsXG4gICAgICBleHBpcmF0aW9uOiB0aGlzLnByb3BzLmRlcGxveVRpbWVGaWxlQXNzZXRMaWZldGltZSA/PyBEdXJhdGlvbi5kYXlzKDMwKSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdGFnaW5nQnVja2V0TmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3ZWxsLWtub3duIG5hbWUgb2YgdGhlIHJlcG9cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3JlYXRlUmVwbyhhc3NldDogRG9ja2VySW1hZ2VBc3NldFNvdXJjZSk6IHN0cmluZyB7XG4gICAgaWYgKCFhc3NldC5hc3NldE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXNzZXRzIHN5bnRoZXNpemVkIHdpdGggQXBwU2NvcGVkU3RhZ2luZ1N5bnRoZXNpemVyIG11c3QgaW5jbHVkZSBhbiBcXCdhc3NldE5hbWVcXCcgaW4gdGhlIGFzc2V0IHNvdXJjZSBkZWZpbml0aW9uLicpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBpbWFnZSBwdWJsaXNoaW5nIHJvbGUgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIHRoaXMuZW5zdXJlSW1hZ2VSb2xlKCk7XG5cbiAgICBjb25zdCByZXBvTmFtZSA9IGdlbmVyYXRlUmVwb05hbWUoYCR7dGhpcy5hcHBJZH0vJHthc3NldC5hc3NldE5hbWV9YCk7XG4gICAgaWYgKHRoaXMuc3RhZ2luZ1JlcG9zW2Fzc2V0LmFzc2V0TmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFnaW5nUmVwb3NbYXNzZXQuYXNzZXROYW1lXSA9IG5ldyBlY3IuUmVwb3NpdG9yeSh0aGlzLCByZXBvTmFtZSwge1xuICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwb05hbWUsXG4gICAgICAgIGltYWdlVGFnTXV0YWJpbGl0eTogZWNyLlRhZ011dGFiaWxpdHkuSU1NVVRBQkxFLFxuICAgICAgICBsaWZlY3ljbGVSdWxlczogW3tcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0dhcmJhZ2UgY29sbGVjdCBvbGQgaW1hZ2UgdmVyc2lvbnMnLFxuICAgICAgICAgIG1heEltYWdlQ291bnQ6IHRoaXMucHJvcHMuaW1hZ2VBc3NldFZlcnNpb25Db3VudCA/PyAzLFxuICAgICAgICB9XSxcbiAgICAgICAgLi4uKHRoaXMuYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHMgPyB7XG4gICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgIGVtcHR5T25EZWxldGU6IHRydWUsXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLmltYWdlUm9sZSkge1xuICAgICAgICB0aGlzLnN0YWdpbmdSZXBvc1thc3NldC5hc3NldE5hbWVdLmdyYW50UHVsbFB1c2godGhpcy5pbWFnZVJvbGUpO1xuICAgICAgICB0aGlzLnN0YWdpbmdSZXBvc1thc3NldC5hc3NldE5hbWVdLmdyYW50UmVhZCh0aGlzLmltYWdlUm9sZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXBvTmFtZTtcblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlUmVwb05hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICctJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZEZpbGUoYXNzZXQ6IEZpbGVBc3NldFNvdXJjZSk6IEZpbGVTdGFnaW5nTG9jYXRpb24ge1xuICAgIC8vIEhhcyBzaWRlIGVmZmVjdHMgc28gbXVzdCBnbyBmaXJzdFxuICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSB0aGlzLmdldENyZWF0ZUJ1Y2tldCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICBhc3N1bWVSb2xlQXJuOiB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4sXG4gICAgICBwcmVmaXg6IGFzc2V0LmRlcGxveVRpbWUgPyBERVBMT1lfVElNRV9QUkVGSVggOiB1bmRlZmluZWQsXG4gICAgICBkZXBlbmRlbmN5U3RhY2s6IHRoaXMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhZGREb2NrZXJJbWFnZShhc3NldDogRG9ja2VySW1hZ2VBc3NldFNvdXJjZSk6IEltYWdlU3RhZ2luZ0xvY2F0aW9uIHtcbiAgICAvLyBIYXMgc2lkZSBlZmZlY3RzIHNvIG11c3QgZ28gZmlyc3RcbiAgICBjb25zdCByZXBvTmFtZSA9IHRoaXMuZ2V0Q3JlYXRlUmVwbyhhc3NldCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVwb05hbWUsXG4gICAgICBhc3N1bWVSb2xlQXJuOiB0aGlzLmltYWdlUm9sZU1hbmlmZXN0QXJuLFxuICAgICAgZGVwZW5kZW5jeVN0YWNrOiB0aGlzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3ludGhlc2l6ZXMgdGhlIGNsb3VkZm9ybWF0aW9uIHRlbXBsYXRlIGludG8gYSBjbG91ZCBhc3NlbWJseS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3N5bnRoZXNpemVUZW1wbGF0ZShzZXNzaW9uOiBJU3ludGhlc2lzU2Vzc2lvbiwgbG9va3VwUm9sZUFybj86IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHN1cGVyLl9zeW50aGVzaXplVGVtcGxhdGUoc2Vzc2lvbiwgbG9va3VwUm9sZUFybik7XG5cbiAgICBjb25zdCBidWlsZGVyID0gc2Vzc2lvbi5hc3NlbWJseTtcbiAgICBjb25zdCBvdXRQYXRoID0gcGF0aC5qb2luKGJ1aWxkZXIub3V0ZGlyLCB0aGlzLnRlbXBsYXRlRmlsZSk7XG4gICAgY29uc3Qgc2l6ZSA9IGZzLnN0YXRTeW5jKG91dFBhdGgpLnNpemU7XG4gICAgaWYgKHNpemUgPiA1MTIwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFnaW5nIHJlc291cmNlIHRlbXBsYXRlIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gNTEyMDAgYnl0ZXMsIGJ1dCBnb3QgJHtzaXplfSBieXRlc2ApO1xuICAgIH1cbiAgfVxufVxuIl19
331
+ DefaultStagingStack[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DefaultStagingStack", version: "2.128.0-alpha.0" };
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MseUNBQXlDO0FBQ3pDLDJDQVkwQjtBQUMxQiw0RUFBMEU7QUFDMUUsNENBQTRDO0FBQzVDLDJDQUF1QztBQUkxQixRQUFBLGtCQUFrQixHQUFHLGNBQWMsQ0FBQztBQUVqRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSwwQkFBMkIsU0FBUSxzQkFBUztJQUN2RCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2xCOztBQUhILGdFQUlDOzs7QUEySEQ7Ozs7OztHQU1HO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxZQUFLO0lBQzVDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFtQzs7Ozs7Ozs7OztRQUN2RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLE9BQU87WUFDTCxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsT0FBTztnQkFDbkMsTUFBTSxHQUFHLEdBQUcsVUFBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFVBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssQ0FBQyxTQUFTLHlCQUF5QixDQUFDLENBQUM7Z0JBQ3JFLENBQUM7Z0JBRUQsNEVBQTRFO2dCQUM1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LFVBQVUsQ0FBQyxDQUFDLENBQUMsMEJBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekQsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztLQUNIO0lBRU0sY0FBYyxDQUFDLEtBQTZCO1FBQ2pELG9DQUFvQztRQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLE9BQU87WUFDTCxRQUFRO1lBQ1IsYUFBYSxFQUFFLElBQUksQ0FBQyxvQkFBb0I7WUFDeEMsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztLQUNIO0lBRUQ7OztPQUdHO0lBQ0ksbUJBQW1CLENBQUMsT0FBMEIsRUFBRSxhQUFrQztRQUN2RixLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRWxELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2QyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxJQUFJLFFBQVEsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7S0FDRjs7QUF4Vkgsa0RBeVZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGVjciBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQge1xuICBBcHAsXG4gIEFybkZvcm1hdCxcbiAgQm9vdHN0cmFwbGVzc1N5bnRoZXNpemVyLFxuICBEb2NrZXJJbWFnZUFzc2V0U291cmNlLFxuICBEdXJhdGlvbixcbiAgRmlsZUFzc2V0U291cmNlLFxuICBJU3ludGhlc2lzU2Vzc2lvbixcbiAgUmVtb3ZhbFBvbGljeSxcbiAgU3RhY2ssXG4gIFN0YWNrUHJvcHMsXG4gIElOTElORV9DVVNUT01fUkVTT1VSQ0VfQ09OVEVYVCxcbn0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBTdHJpbmdTcGVjaWFsaXplciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnYXdzLWNkay1saWIvY3gtYXBpJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQm9vdHN0cmFwUm9sZSB9IGZyb20gJy4vYm9vdHN0cmFwLXJvbGVzJztcbmltcG9ydCB7IEZpbGVTdGFnaW5nTG9jYXRpb24sIElTdGFnaW5nUmVzb3VyY2VzLCBJU3RhZ2luZ1Jlc291cmNlc0ZhY3RvcnksIEltYWdlU3RhZ2luZ0xvY2F0aW9uIH0gZnJvbSAnLi9zdGFnaW5nLXN0YWNrJztcblxuZXhwb3J0IGNvbnN0IERFUExPWV9USU1FX1BSRUZJWCA9ICdkZXBsb3ktdGltZS8nO1xuXG4vKipcbiAqIFRoaXMgaXMgYSBkdW1teSBjb25zdHJ1Y3QgbWVhbnQgdG8gc2lnbmlmeSB0aGF0IGEgc3RhY2sgaXMgdXRpbGl6aW5nXG4gKiB0aGUgQXBwU3RhZ2luZ1N5bnRoZXNpemVyLiBJdCBkb2VzIG5vdCBkbyBhbnl0aGluZywgYW5kIGlzIG5vdCBtZWFudFxuICogdG8gYmUgY3JlYXRlZCBvbiBpdHMgb3duLiBUaGlzIGNvbnN0cnVjdCB3aWxsIGJlIGEgcGFydCBvZiB0aGVcbiAqIGNvbnN0cnVjdCB0cmVlIG9ubHkgYW5kIG5vdCB0aGUgQ2ZuIHRlbXBsYXRlLiBUaGUgY29uc3RydWN0IHRyZWUgaXNcbiAqIHRoZW4gZW5jb2RlZCBpbiB0aGUgQVdTOjpDREs6Ok1ldGFkYXRhIHJlc291cmNlIG9mIHRoZSBzdGFjayBhbmRcbiAqIGluamVzdGVkIGluIG91ciBtZXRyaWNzIGxpa2UgZXZlcnkgb3RoZXIgY29uc3RydWN0LlxuICovXG5leHBvcnQgY2xhc3MgVXNpbmdBcHBTdGFnaW5nU3ludGhlc2l6ZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZXIgY29uZmlndXJhYmxlIG9wdGlvbnMgdG8gdGhlIERlZmF1bHRTdGFnaW5nU3RhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdFN0YWdpbmdTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFwcGxpY2F0aW9uIHRoYXQgdGhlIHN0YWdpbmcgc3RhY2sgYmVsb25ncyB0by5cbiAgICpcbiAgICogVGhpcyBpZGVudGlmaWVyIHdpbGwgYmUgdXNlZCBpbiB0aGUgbmFtZSBvZiBzdGFnaW5nIHJlc291cmNlc1xuICAgKiBjcmVhdGVkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgQ0RLIGFwcHMuXG4gICAqXG4gICAqIFRoZSBpZGVudGlmaWVyIHNob3VsZCBpbmNsdWRlIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCBkYXNoZXMgKCctJykgb25seVxuICAgKiBhbmQgaGF2ZSBhIG1heGltdW0gb2YgMjAgY2hhcmFjdGVycy5cbiAgICovXG4gIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IG5hbWUgZm9yIHRoZSBzdGFnaW5nIGJ1Y2tldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgd2VsbC1rbm93biBuYW1lIHVuaXF1ZSB0byB0aGlzIGFwcC9lbnYuXG4gICAqL1xuICByZWFkb25seSBzdGFnaW5nQnVja2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRW5jcnlwdGlvbiB0eXBlIGZvciBzdGFnaW5nIGJ1Y2tldFxuICAgKlxuICAgKiBJbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBwYWNrYWdlLCB0aGUgZGVmYXVsdCB3aWxsIGJlIEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRC5cbiAgICpcbiAgICogSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBwYWNrYWdlLCB0aGUgZGVmYXVsdCB3YXMgdG8gdXNlIEtNUyBlbmNyeXB0aW9uIGZvciB0aGUgc3RhZ2luZyBidWNrZXQuIEtNUyBrZXlzIGNvc3RcbiAgICogJDEvbW9udGgsIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiB1bmV4cGVjdGVkIGNvc3RzIGZvciB1c2VycyB3aG8gYXJlIG5vdCBhd2FyZSBvZiB0aGlzLiBBcyB3ZSBzdGFiaWxpemUgdGhpcyBtb2R1bGVcbiAgICogd2UgaW50ZW5kIHRvIG1ha2UgdGhlIGRlZmF1bHQgUzMtbWFuYWdlZCBlbmNyeXB0aW9uLCB3aGljaCBpcyBmcmVlLiBIb3dldmVyLCB0aGUgbWlncmF0aW9uIHBhdGggZnJvbSBLTVMgdG8gUzNcbiAgICogbWFuYWdlZCBlbmNyeXB0aW9uIGZvciBleGlzdGluZyBidWNrZXRzIGlzIG5vdCBzdHJhaWdodGZvcndhcmQuIFRoZXJlZm9yZSwgZm9yIG5vdywgdGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogSWYgeW91IGhhdmUgYW4gZXhpc3Rpbmcgc3RhZ2luZyBidWNrZXQgZW5jcnlwdGVkIHdpdGggYSBLTVMga2V5LCB5b3Ugd2lsbCBsaWtlbHkgd2FudCB0byBzZXQgdGhpcyBwcm9wZXJ0eSB0b1xuICAgKiBCdWNrZXRFbmNyeXB0aW9uLktNUy4gSWYgeW91IGFyZSBjcmVhdGluZyBhIG5ldyBzdGFnaW5nIGJ1Y2tldCwgeW91IGNhbiBzZXQgdGhpcyBwcm9wZXJ0eSB0b1xuICAgKiBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQgdG8gYXZvaWQgdGhlIGNvc3Qgb2YgYSBLTVMga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2luZ0J1Y2tldEVuY3J5cHRpb246IHMzLkJ1Y2tldEVuY3J5cHRpb247XG5cbiAgLyoqXG4gICAqIFBhc3MgaW4gYW4gZXhpc3Rpbmcgcm9sZSB0byBiZSB1c2VkIGFzIHRoZSBmaWxlIHB1Ymxpc2hpbmcgcm9sZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5ldyByb2xlIHdpbGwgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBQYXNzIGluIGFuIGV4aXN0aW5nIHJvbGUgdG8gYmUgdXNlZCBhcyB0aGUgaW1hZ2UgcHVibGlzaGluZyByb2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlmZXRpbWUgZm9yIGRlcGxveSB0aW1lIGZpbGUgYXNzZXRzLlxuICAgKlxuICAgKiBBc3NldHMgdGhhdCBhcmUgb25seSBuZWNlc3NhcnkgYXQgZGVwbG95bWVudCB0aW1lIChmb3IgaW5zdGFuY2UsXG4gICAqIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcyBhbmQgTGFtYmRhIHNvdXJjZSBjb2RlIGJ1bmRsZXMpIHdpbGwgYmVcbiAgICogYXV0b21hdGljYWxseSBkZWxldGVkIGFmdGVyIHRoaXMgbWFueSBkYXlzLiBBc3NldHMgdGhhdCBtYXkgYmVcbiAgICogcmVhZCBmcm9tIHRoZSBzdGFnaW5nIGJ1Y2tldCBkdXJpbmcgeW91ciBhcHBsaWNhdGlvbidzIHJ1biB0aW1lXG4gICAqIHdpbGwgbm90IGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIFNldCB0aGlzIHRvIHRoZSBsZW5ndGggb2YgdGltZSB5b3Ugd2lzaCB0byBiZSBhYmxlIHRvIHJvbGwgYmFjayB0b1xuICAgKiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB5b3VyIGFwcGxpY2F0aW9uIHdpdGhvdXQgaGF2aW5nIHRvIGRvIGEgbmV3XG4gICAqIGBjZGsgc3ludGhgIGFuZCByZS11cGxvYWQgb2YgYXNzZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIER1cmF0aW9uLmRheXMoMzApXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lUaW1lRmlsZUFzc2V0TGlmZXRpbWU/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIHZlcnNpb25zIHRvIHN0b3JlIGluIGEgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogUHJldmlvdXMgdmVyc2lvbnMgb2YgYW4gaW1hZ2UgY2FuIGJlIHN0b3JlZCBmb3Igcm9sbGJhY2sgcHVycG9zZXMuXG4gICAqIE9uY2UgYSByZXBvc2l0b3J5IGhhcyBtb3JlIHRoYW4gMyBpbWFnZSB2ZXJzaW9ucyBzdG9yZWQsIHRoZSBvbGRlc3RcbiAgICogdmVyc2lvbiB3aWxsIGJlIGRpc2NhcmRlZC4gVGhpcyBhbGxvd3MgZm9yIHNlbnNpYmxlIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgKiB3aGlsZSBtYWludGFpbmluZyBhIGZldyBwcmV2aW91cyB2ZXJzaW9ucyBmb3Igcm9sbGJhY2sgc2NlbmFyaW9zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVwIHRvIDMgdmVyc2lvbnMgc3RvcmVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0VmVyc2lvbkNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdXRvIGRlbGV0ZXMgb2JqZWN0cyBpbiB0aGUgc3RhZ2luZyBTMyBidWNrZXQgYW5kIGltYWdlcyBpbiB0aGVcbiAgICogc3RhZ2luZyBFQ1IgcmVwb3NpdG9yaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhdXRvRGVsZXRlU3RhZ2luZ0Fzc2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBjdXN0b20gcHJlZml4IHRvIGJlIHVzZWQgYXMgdGhlIHN0YWdpbmcgc3RhY2sgbmFtZSBhbmRcbiAgICogY29uc3RydWN0IElELiBUaGUgcHJlZml4IHdpbGwgYmUgYXBwZW5kZWQgYmVmb3JlIHRoZSBhcHBJZCwgd2hpY2hcbiAgICogaXMgcmVxdWlyZWQgdG8gYmUgcGFydCBvZiB0aGUgc3RhY2sgbmFtZSBhbmQgY29uc3RydWN0IElEIHRvXG4gICAqIGVuc3VyZSB1bmlxdWVuZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnU3RhZ2luZ1N0YWNrJ1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2luZ1N0YWNrTmFtZVByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IFN0YWdpbmcgU3RhY2sgUHJvcGVydGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRTdGFnaW5nU3RhY2tQcm9wcyBleHRlbmRzIERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zLCBTdGFja1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGRlcGxveSBhY3Rpb24gcm9sZSwgaWYgZ2l2ZW5cbiAgICpcbiAgICogVGhpcyByb2xlIHdpbGwgbmVlZCBwZXJtaXNzaW9ucyB0byByZWFkIGZyb20gdG8gdGhlIHN0YWdpbmcgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBDTEkgY3JlZGVudGlhbHMgYXJlIGFzc3VtZWQsIG5vIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcXVhbGlmaWVyIHVzZWQgdG8gc3BlY2lhbGl6ZSBzdHJpbmdzXG4gICAqXG4gICAqIFNob3VsZG4ndCBiZSBuZWNlc3NhcnkgYnV0IHdobyBrbm93cyB3aGF0IHBlb3BsZSBtaWdodCBkby5cbiAgICovXG4gIHJlYWRvbmx5IHF1YWxpZmllcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgZGVmYXVsdCBTdGFnaW5nIFN0YWNrIHRoYXQgaW1wbGVtZW50cyBJU3RhZ2luZ1Jlc291cmNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgQnVja2V0RW5jcnlwdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG4gKiBjb25zdCBkZWZhdWx0U3RhZ2luZ1N0YWNrID0gRGVmYXVsdFN0YWdpbmdTdGFjay5mYWN0b3J5KHsgYXBwSWQ6ICdteS1hcHAtaWQnLCBzdGFnaW5nQnVja2V0RW5jcnlwdGlvbjogQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEIH0pO1xuICovXG5leHBvcnQgY2xhc3MgRGVmYXVsdFN0YWdpbmdTdGFjayBleHRlbmRzIFN0YWNrIGltcGxlbWVudHMgSVN0YWdpbmdSZXNvdXJjZXMge1xuICAvKipcbiAgICogUmV0dXJuIGEgZmFjdG9yeSB0aGF0IHdpbGwgY3JlYXRlIERlZmF1bHRTdGFnaW5nU3RhY2tzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZhY3Rvcnkob3B0aW9uczogRGVmYXVsdFN0YWdpbmdTdGFja09wdGlvbnMpOiBJU3RhZ2luZ1Jlc291cmNlc0ZhY3Rvcnkge1xuICAgIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZC50b0xvY2FsZUxvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKS5zbGljZSgwLCAyMCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9idGFpblN0YWdpbmdSZXNvdXJjZXMoc3RhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgYXBwID0gQXBwLm9mKHN0YWNrKTtcbiAgICAgICAgaWYgKCFBcHAuaXNBcHAoYXBwKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhY2sgJHtzdGFjay5zdGFja05hbWV9IG11c3QgYmUgcGFydCBvZiBhbiBBcHBgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlY2F1c2Ugd2UgZG8gbm90IGtlZXAgbWV0cmljcyBpbiB0aGUgRGVmYXVsdFN0YWdpbmdTdGFjaywgd2Ugd2lsbCBpbmplY3RcbiAgICAgICAgLy8gYSBkdW1teSBjb25zdHJ1Y3QgaW50byB0aGUgc3RhY2sgdXNpbmcgdGhlIERlZmF1bHRTdGFnaW5nU3RhY2sgaW5zdGVhZC5cbiAgICAgICAgaWYgKGN4YXBpLkFOQUxZVElDU19SRVBPUlRJTkdfRU5BQkxFRF9DT05URVhUKSB7XG4gICAgICAgICAgbmV3IFVzaW5nQXBwU3RhZ2luZ1N5bnRoZXNpemVyKHN0YWNrLCBgVXNpbmdBcHBTdGFnaW5nU3ludGhlc2l6ZXIvJHtzdGFjay5zdGFja05hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFja1ByZWZpeCA9IG9wdGlvbnMuc3RhZ2luZ1N0YWNrTmFtZVByZWZpeCA/PyAnU3RhZ2luZ1N0YWNrJztcbiAgICAgICAgLy8gU3RhY2sgbmFtZSBkb2VzIG5vdCBuZWVkIHRvIGNvbnRhaW4gZW52aXJvbm1lbnQgYmVjYXVzZSBhcHBJZCBpcyB1bmlxdWUgaW5zaWRlIGFuIGVudlxuICAgICAgICBjb25zdCBzdGFja05hbWUgPSBgJHtzdGFja1ByZWZpeH0tJHthcHBJZH1gO1xuICAgICAgICBjb25zdCBzdGFja0lkID0gYCR7c3RhY2tOYW1lfS0ke2NvbnRleHQuZW52aXJvbm1lbnRTdHJpbmd9YDtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0U3RhZ2luZ1N0YWNrKGFwcCwgc3RhY2tJZCwge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgc3RhY2tOYW1lLFxuICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgYWNjb3VudDogc3RhY2suYWNjb3VudCxcbiAgICAgICAgICAgIHJlZ2lvbjogc3RhY2sucmVnaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBwSWQsXG4gICAgICAgICAgcXVhbGlmaWVyOiBjb250ZXh0LnF1YWxpZmllcixcbiAgICAgICAgICBkZXBsb3lSb2xlQXJuOiBjb250ZXh0LmRlcGxveVJvbGVBcm4sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYXNzZXQgcHVibGlzaGluZyByb2xlIG5hbWUgZm9yIGZpbGUgKFMzKSBhc3NldHMuXG4gICAqL1xuICBwcml2YXRlIGdldCBmaWxlUm9sZU5hbWUoKSB7XG4gICAgcmV0dXJuIGBjZGstJHt0aGlzLmFwcElkfS1maWxlLXJvbGUtJHt0aGlzLnJlZ2lvbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYXNzZXQgcHVibGlzaGluZyByb2xlIG5hbWUgZm9yIGRvY2tlciAoRUNSKSBhc3NldHMuXG4gICAqL1xuICBwcml2YXRlIGdldCBpbWFnZVJvbGVOYW1lKCkge1xuICAgIHJldHVybiBgY2RrLSR7dGhpcy5hcHBJZH0taW1hZ2Utcm9sZS0ke3RoaXMucmVnaW9ufWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFwcC1zY29wZWQsIGV2aXJvbm1lbnQta2V5ZWQgc3RhZ2luZyBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhZ2luZ0J1Y2tldD86IHMzLkJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIGFwcC1zY29wZWQsIGVudmlyb25tZW50LWtleWVkIGVjciByZXBvc2l0b3JpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXBwLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YWdpbmdSZXBvczogUmVjb3JkPHN0cmluZywgZWNyLlJlcG9zaXRvcnk+O1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdG8gYWRkIGRlcGVuZGVuY2llcyB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXBlbmRlbmN5U3RhY2s6IFN0YWNrO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnaW5nQnVja2V0TmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSBzdGFnaW5nQnVja2V0RW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbjtcblxuICAvKipcbiAgICogRmlsZSBwdWJsaXNoIHJvbGUgQVJOIGluIGFzc2V0IG1hbmlmZXN0IGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlZEZpbGVSb2xlPzogQm9vdHN0cmFwUm9sZTtcbiAgcHJpdmF0ZSBmaWxlUm9sZT86IGlhbS5JUm9sZTtcbiAgcHJpdmF0ZSBmaWxlUm9sZU1hbmlmZXN0QXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbWFnZSBwdWJsaXNoaW5nIHJvbGUgQVJOIGluIGFzc2V0IG1hbmlmZXN0IGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlZEltYWdlUm9sZT86IEJvb3RzdHJhcFJvbGU7XG4gIHByaXZhdGUgaW1hZ2VSb2xlPzogaWFtLklSb2xlO1xuICBwcml2YXRlIGRpZEltYWdlUm9sZSA9IGZhbHNlO1xuICBwcml2YXRlIGltYWdlUm9sZU1hbmlmZXN0QXJuPzogc3RyaW5nO1xuICBwcml2YXRlIGF1dG9EZWxldGVTdGFnaW5nQXNzZXRzOiBib29sZWFuO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95Um9sZUFybj86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQXBwLCBpZDogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBEZWZhdWx0U3RhZ2luZ1N0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc3ludGhlc2l6ZXI6IG5ldyBCb290c3RyYXBsZXNzU3ludGhlc2l6ZXIoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgVGhpcyBzdGFjayBpbmNsdWRlcyByZXNvdXJjZXMgbmVlZGVkIHRvIGRlcGxveSB0aGUgQVdTIENESyBhcHAgJHtwcm9wcy5hcHBJZH0gaW50byB0aGlzIGVudmlyb25tZW50YCxcbiAgICAgIGFuYWx5dGljc1JlcG9ydGluZzogZmFsc2UsIC8vIHJlbW92aW5nIEFXUzo6Q0RLOjpNZXRhZGF0YSBjb25zdHJ1Y3Qgc2F2ZXMgfjNLQlxuICAgIH0pO1xuICAgIC8vIHJlbW92aW5nIHBhdGggbWV0YWRhdGEgc2F2ZXMgfjJLQlxuICAgIHRoaXMubm9kZS5zZXRDb250ZXh0KGN4YXBpLlBBVEhfTUVUQURBVEFfRU5BQkxFX0NPTlRFWFQsIGZhbHNlKTtcblxuICAgIC8vIEZvciBhbGwgcmVzb3VyY2VzIHVuZGVyIHRoZSBkZWZhdWx0IHN0YWdpbmcgc3RhY2ssIHdlIHdhbnQgdG8gaW5saW5lIGN1c3RvbVxuICAgIC8vIHJlc291cmNlcyBiZWNhdXNlIHRoZSBzdGFnaW5nIGJ1Y2tldCBuZWNlc3NhcnkgZm9yIGN1c3RvbSByZXNvdXJjZSBhc3NldHNcbiAgICAvLyBkb2VzIG5vdCBleGlzdCB5ZXQuXG4gICAgdGhpcy5ub2RlLnNldENvbnRleHQoSU5MSU5FX0NVU1RPTV9SRVNPVVJDRV9DT05URVhULCB0cnVlKTtcbiAgICB0aGlzLmF1dG9EZWxldGVTdGFnaW5nQXNzZXRzID0gcHJvcHMuYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHMgPz8gdHJ1ZTtcblxuICAgIHRoaXMuYXBwSWQgPSB0aGlzLnZhbGlkYXRlQXBwSWQocHJvcHMuYXBwSWQpO1xuICAgIHRoaXMuZGVwZW5kZW5jeVN0YWNrID0gdGhpcztcblxuICAgIHRoaXMuZGVwbG95Um9sZUFybiA9IHByb3BzLmRlcGxveVJvbGVBcm47XG4gICAgdGhpcy5zdGFnaW5nQnVja2V0TmFtZSA9IHByb3BzLnN0YWdpbmdCdWNrZXROYW1lO1xuXG4gICAgLy8gRklYTUU6IHdoZW4gc3RhYmlsaXppbmcgdGhpcyBtb2R1bGUsIHdlIHNob3VsZCBtYWtlIGBzdGFnaW5nQnVja2V0RW5jcnlwdGlvbmAgb3B0aW9uYWwsIGRlZmF1bHRpbmcgdG8gUzNfTUFOQUdFRC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL3B1bGwvMjg5NzgjaXNzdWVjb21tZW50LTE5MzAwMDcxNzYgZm9yIGRldGFpbHMgb24gdGhpcyBkZWNpc2lvbi5cbiAgICB0aGlzLnN0YWdpbmdCdWNrZXRFbmNyeXB0aW9uID0gcHJvcHMuc3RhZ2luZ0J1Y2tldEVuY3J5cHRpb247XG5cbiAgICBjb25zdCBzcGVjaWFsaXplciA9IG5ldyBTdHJpbmdTcGVjaWFsaXplcih0aGlzLCBwcm9wcy5xdWFsaWZpZXIpO1xuXG4gICAgdGhpcy5wcm92aWRlZEZpbGVSb2xlID0gcHJvcHMuZmlsZUFzc2V0UHVibGlzaGluZ1JvbGU/Ll9zcGVjaWFsaXplKHNwZWNpYWxpemVyKTtcbiAgICB0aGlzLnByb3ZpZGVkSW1hZ2VSb2xlID0gcHJvcHMuaW1hZ2VBc3NldFB1Ymxpc2hpbmdSb2xlPy5fc3BlY2lhbGl6ZShzcGVjaWFsaXplcik7XG4gICAgdGhpcy5zdGFnaW5nUmVwb3MgPSB7fTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBcHBJZChpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgaWYgKGlkLmxlbmd0aCA+IDIwKSB7XG4gICAgICBlcnJvcnMucHVzaChgYXBwSWQgZXhwZWN0ZWQgbm8gbW9yZSB0aGFuIDIwIGNoYXJhY3RlcnMgYnV0IGdvdCAke2lkLmxlbmd0aH0gY2hhcmFjdGVycy5gKTtcbiAgICB9XG4gICAgaWYgKGlkICE9PSBpZC50b0xvY2FsZUxvd2VyQ2FzZSgpKSB7XG4gICAgICBlcnJvcnMucHVzaCgnYXBwSWQgb25seSBhY2NlcHRzIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLicpO1xuICAgIH1cbiAgICBpZiAoIS9eW2EtejAtOS1dKiQvLnRlc3QoaWQpKSB7XG4gICAgICBlcnJvcnMucHVzaCgnYXBwSWQgZXhwZWN0cyBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGFuZCBkYXNoZXMgKFxcJy1cXCcpJyk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoW1xuICAgICAgICBgYXBwSWQgJHtpZH0gaGFzIGVycm9yczpgLFxuICAgICAgICAuLi5lcnJvcnMsXG4gICAgICBdLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVGaWxlUm9sZSgpIHtcbiAgICBpZiAodGhpcy5wcm92aWRlZEZpbGVSb2xlKSB7XG4gICAgICAvLyBPdmVycmlkZVxuICAgICAgdGhpcy5maWxlUm9sZU1hbmlmZXN0QXJuID0gdGhpcy5wcm92aWRlZEZpbGVSb2xlLl9hcm5Gb3JDbG91ZEFzc2VtYmx5KCk7XG4gICAgICBjb25zdCBjZm5Bcm4gPSB0aGlzLnByb3ZpZGVkRmlsZVJvbGUuX2FybkZvckNsb3VkRm9ybWF0aW9uKCk7XG4gICAgICB0aGlzLmZpbGVSb2xlID0gY2ZuQXJuID8gaWFtLlJvbGUuZnJvbVJvbGVBcm4odGhpcywgJ0Nka0ZpbGVSb2xlJywgY2ZuQXJuKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByb2xlTmFtZSA9IHRoaXMuZmlsZVJvbGVOYW1lO1xuICAgIHRoaXMuZmlsZVJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ0Nka0ZpbGVSb2xlJywge1xuICAgICAgcm9sZU5hbWUsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQWNjb3VudFByaW5jaXBhbCh0aGlzLmFjY291bnQpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5maWxlUm9sZU1hbmlmZXN0QXJuID0gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHBhcnRpdGlvbjogJyR7QVdTOjpQYXJ0aXRpb259JyxcbiAgICAgIHJlZ2lvbjogJycsIC8vIGlhbSBpcyBnbG9iYWxcbiAgICAgIHNlcnZpY2U6ICdpYW0nLFxuICAgICAgcmVzb3VyY2U6ICdyb2xlJyxcbiAgICAgIHJlc291cmNlTmFtZTogcm9sZU5hbWUsXG4gICAgICBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVJbWFnZVJvbGUoKSB7XG4gICAgLy8gSXQgbWF5IGVuZCB1cCBzZXR0aW5nIGltYWdlUm9sZSB0byB1bmRlZmluZWQsIGJ1dCBhdCBsZWFzdCB3ZSB0cmllZFxuICAgIGlmICh0aGlzLmRpZEltYWdlUm9sZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpZEltYWdlUm9sZSA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5wcm92aWRlZEltYWdlUm9sZSkge1xuICAgICAgLy8gT3ZlcnJpZGVcbiAgICAgIHRoaXMuaW1hZ2VSb2xlTWFuaWZlc3RBcm4gPSB0aGlzLnByb3ZpZGVkSW1hZ2VSb2xlLl9hcm5Gb3JDbG91ZEFzc2VtYmx5KCk7XG4gICAgICBjb25zdCBjZm5Bcm4gPSB0aGlzLnByb3ZpZGVkSW1hZ2VSb2xlLl9hcm5Gb3JDbG91ZEZvcm1hdGlvbigpO1xuICAgICAgdGhpcy5pbWFnZVJvbGUgPSBjZm5Bcm4gPyBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnQ2RrSW1hZ2VSb2xlJywgY2ZuQXJuKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByb2xlTmFtZSA9IHRoaXMuaW1hZ2VSb2xlTmFtZTtcbiAgICB0aGlzLmltYWdlUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnQ2RrSW1hZ2VSb2xlJywge1xuICAgICAgcm9sZU5hbWUsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQWNjb3VudFByaW5jaXBhbCh0aGlzLmFjY291bnQpLFxuICAgIH0pO1xuICAgIHRoaXMuaW1hZ2VSb2xlTWFuaWZlc3RBcm4gPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgcGFydGl0aW9uOiAnJHtBV1M6OlBhcnRpdGlvbn0nLFxuICAgICAgcmVnaW9uOiAnJywgLy8gaWFtIGlzIGdsb2JhbFxuICAgICAgc2VydmljZTogJ2lhbScsXG4gICAgICByZXNvdXJjZTogJ3JvbGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiByb2xlTmFtZSxcbiAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJ1Y2tldEtleSgpOiBrbXMuSUtleSB7XG4gICAgcmV0dXJuIG5ldyBrbXMuS2V5KHRoaXMsICdCdWNrZXRLZXknLCB7XG4gICAgICBhbGlhczogYGFsaWFzL2Nkay0ke3RoaXMuYXBwSWR9LXN0YWdpbmdgLFxuICAgICAgYWRtaW5zOiBbbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKHRoaXMuYWNjb3VudCldLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDcmVhdGVCdWNrZXQoKSB7XG4gICAgY29uc3Qgc3RhZ2luZ0J1Y2tldE5hbWUgPSB0aGlzLnN0YWdpbmdCdWNrZXROYW1lID8/IGBjZGstJHt0aGlzLmFwcElkfS1zdGFnaW5nLSR7dGhpcy5hY2NvdW50fS0ke3RoaXMucmVnaW9ufWA7XG4gICAgY29uc3QgYnVja2V0SWQgPSAnQ2RrU3RhZ2luZ0J1Y2tldCc7XG4gICAgY29uc3QgY3JlYXRlZEJ1Y2tldCA9IHRoaXMubm9kZS50cnlGaW5kQ2hpbGQoYnVja2V0SWQpIGFzIHMzLkJ1Y2tldDtcbiAgICBpZiAoY3JlYXRlZEJ1Y2tldCkge1xuICAgICAgcmV0dXJuIHN0YWdpbmdCdWNrZXROYW1lO1xuICAgIH1cblxuICAgIHRoaXMuZW5zdXJlRmlsZVJvbGUoKTtcblxuICAgIGxldCBrZXkgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuc3RhZ2luZ0J1Y2tldEVuY3J5cHRpb24gPT09IHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TKSB7XG4gICAgICBrZXkgPSB0aGlzLmNyZWF0ZUJ1Y2tldEtleSgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgYnVja2V0IG9uY2UgdGhlIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gY3JlYXRlZFxuICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgYnVja2V0SWQsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHN0YWdpbmdCdWNrZXROYW1lLFxuICAgICAgLi4uKHRoaXMuYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHMgPyB7XG4gICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICB9IDoge1xuICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICAgIH0pLFxuICAgICAgZW5jcnlwdGlvbjogdGhpcy5zdGFnaW5nQnVja2V0RW5jcnlwdGlvbixcbiAgICAgIGVuY3J5cHRpb25LZXk6IGtleSxcblxuICAgICAgLy8gTWFueSBBV1MgYWNjb3VudCBzYWZldHkgY2hlY2tlcnMgd2lsbCBjb21wbGFpbiB3aGVuIGJ1Y2tldHMgYXJlbid0IHZlcnNpb25lZFxuICAgICAgdmVyc2lvbmVkOiB0cnVlLFxuICAgICAgLy8gTWFueSBBV1MgYWNjb3VudCBzYWZldHkgY2hlY2tlcnMgd2lsbCBjb21wbGFpbiB3aGVuIFNTTCBpc24ndCBlbmZvcmNlZFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmZpbGVSb2xlKSB7XG4gICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5maWxlUm9sZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVwbG95Um9sZUFybikge1xuICAgICAgYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3MzOkdldE9iamVjdConLFxuICAgICAgICAgICdzMzpHZXRCdWNrZXQqJyxcbiAgICAgICAgICAnczM6TGlzdConLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtidWNrZXQuYnVja2V0QXJuLCBidWNrZXQuYXJuRm9yT2JqZWN0cygnKicpXSxcbiAgICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uQXJuUHJpbmNpcGFsKHRoaXMuZGVwbG95Um9sZUFybildLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIE9iamVjdHMgc2hvdWxkIG5ldmVyIGJlIG92ZXJ3cml0dGVuLCBidXQgbGV0J3MgbWFrZSBzdXJlIHdlIGhhdmUgYSBsaWZlY3ljbGUgcG9saWN5XG4gICAgLy8gZm9yIGl0IGFueXdheS5cbiAgICBidWNrZXQuYWRkTGlmZWN5Y2xlUnVsZSh7XG4gICAgICBub25jdXJyZW50VmVyc2lvbkV4cGlyYXRpb246IER1cmF0aW9uLmRheXMoMzY1KSxcbiAgICB9KTtcblxuICAgIGJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgIHByZWZpeDogREVQTE9ZX1RJTUVfUFJFRklYLFxuICAgICAgZXhwaXJhdGlvbjogdGhpcy5wcm9wcy5kZXBsb3lUaW1lRmlsZUFzc2V0TGlmZXRpbWUgPz8gRHVyYXRpb24uZGF5cygzMCksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RhZ2luZ0J1Y2tldE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgd2VsbC1rbm93biBuYW1lIG9mIHRoZSByZXBvXG4gICAqL1xuICBwcml2YXRlIGdldENyZWF0ZVJlcG8oYXNzZXQ6IERvY2tlckltYWdlQXNzZXRTb3VyY2UpOiBzdHJpbmcge1xuICAgIGlmICghYXNzZXQuYXNzZXROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fzc2V0cyBzeW50aGVzaXplZCB3aXRoIEFwcFNjb3BlZFN0YWdpbmdTeW50aGVzaXplciBtdXN0IGluY2x1ZGUgYW4gXFwnYXNzZXROYW1lXFwnIGluIHRoZSBhc3NldCBzb3VyY2UgZGVmaW5pdGlvbi4nKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgaW1hZ2UgcHVibGlzaGluZyByb2xlIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICB0aGlzLmVuc3VyZUltYWdlUm9sZSgpO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSBnZW5lcmF0ZVJlcG9OYW1lKGAke3RoaXMuYXBwSWR9LyR7YXNzZXQuYXNzZXROYW1lfWApO1xuICAgIGlmICh0aGlzLnN0YWdpbmdSZXBvc1thc3NldC5hc3NldE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhZ2luZ1JlcG9zW2Fzc2V0LmFzc2V0TmFtZV0gPSBuZXcgZWNyLlJlcG9zaXRvcnkodGhpcywgcmVwb05hbWUsIHtcbiAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lLFxuICAgICAgICBpbWFnZVRhZ011dGFiaWxpdHk6IGVjci5UYWdNdXRhYmlsaXR5LklNTVVUQUJMRSxcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdHYXJiYWdlIGNvbGxlY3Qgb2xkIGltYWdlIHZlcnNpb25zJyxcbiAgICAgICAgICBtYXhJbWFnZUNvdW50OiB0aGlzLnByb3BzLmltYWdlQXNzZXRWZXJzaW9uQ291bnQgPz8gMyxcbiAgICAgICAgfV0sXG4gICAgICAgIC4uLih0aGlzLmF1dG9EZWxldGVTdGFnaW5nQXNzZXRzID8ge1xuICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICBlbXB0eU9uRGVsZXRlOiB0cnVlLFxuICAgICAgICB9IDoge1xuICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5pbWFnZVJvbGUpIHtcbiAgICAgICAgdGhpcy5zdGFnaW5nUmVwb3NbYXNzZXQuYXNzZXROYW1lXS5ncmFudFB1bGxQdXNoKHRoaXMuaW1hZ2VSb2xlKTtcbiAgICAgICAgdGhpcy5zdGFnaW5nUmVwb3NbYXNzZXQuYXNzZXROYW1lXS5ncmFudFJlYWQodGhpcy5pbWFnZVJvbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVwb05hbWU7XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVJlcG9OYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLnJlcGxhY2UoJy4nLCAnLScpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRGaWxlKGFzc2V0OiBGaWxlQXNzZXRTb3VyY2UpOiBGaWxlU3RhZ2luZ0xvY2F0aW9uIHtcbiAgICAvLyBIYXMgc2lkZSBlZmZlY3RzIHNvIG11c3QgZ28gZmlyc3RcbiAgICBjb25zdCBidWNrZXROYW1lID0gdGhpcy5nZXRDcmVhdGVCdWNrZXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBidWNrZXROYW1lLFxuICAgICAgYXNzdW1lUm9sZUFybjogdGhpcy5maWxlUm9sZU1hbmlmZXN0QXJuLFxuICAgICAgcHJlZml4OiBhc3NldC5kZXBsb3lUaW1lID8gREVQTE9ZX1RJTUVfUFJFRklYIDogdW5kZWZpbmVkLFxuICAgICAgZGVwZW5kZW5jeVN0YWNrOiB0aGlzLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYWRkRG9ja2VySW1hZ2UoYXNzZXQ6IERvY2tlckltYWdlQXNzZXRTb3VyY2UpOiBJbWFnZVN0YWdpbmdMb2NhdGlvbiB7XG4gICAgLy8gSGFzIHNpZGUgZWZmZWN0cyBzbyBtdXN0IGdvIGZpcnN0XG4gICAgY29uc3QgcmVwb05hbWUgPSB0aGlzLmdldENyZWF0ZVJlcG8oYXNzZXQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgYXNzdW1lUm9sZUFybjogdGhpcy5pbWFnZVJvbGVNYW5pZmVzdEFybixcbiAgICAgIGRlcGVuZGVuY3lTdGFjazogdGhpcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoZXNpemVzIHRoZSBjbG91ZGZvcm1hdGlvbiB0ZW1wbGF0ZSBpbnRvIGEgY2xvdWQgYXNzZW1ibHkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9zeW50aGVzaXplVGVtcGxhdGUoc2Vzc2lvbjogSVN5bnRoZXNpc1Nlc3Npb24sIGxvb2t1cFJvbGVBcm4/OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBzdXBlci5fc3ludGhlc2l6ZVRlbXBsYXRlKHNlc3Npb24sIGxvb2t1cFJvbGVBcm4pO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IHNlc3Npb24uYXNzZW1ibHk7XG4gICAgY29uc3Qgb3V0UGF0aCA9IHBhdGguam9pbihidWlsZGVyLm91dGRpciwgdGhpcy50ZW1wbGF0ZUZpbGUpO1xuICAgIGNvbnN0IHNpemUgPSBmcy5zdGF0U3luYyhvdXRQYXRoKS5zaXplO1xuICAgIGlmIChzaXplID4gNTEyMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhZ2luZyByZXNvdXJjZSB0ZW1wbGF0ZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDUxMjAwIGJ5dGVzLCBidXQgZ290ICR7c2l6ZX0gYnl0ZXNgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@aws-cdk/app-staging-synthesizer-alpha",
3
3
  "private": false,
4
- "version": "2.126.0-alpha.0",
4
+ "version": "2.128.0-alpha.0",
5
5
  "description": "Cdk synthesizer for with app-scoped staging stack",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -84,15 +84,15 @@
84
84
  }
85
85
  },
86
86
  "devDependencies": {
87
- "aws-cdk-lib": "2.126.0",
88
- "@aws-cdk/integ-runner": "2.126.0-alpha.0",
89
- "@aws-cdk/integ-tests-alpha": "2.126.0-alpha.0",
87
+ "aws-cdk-lib": "2.128.0",
88
+ "@aws-cdk/integ-runner": "2.128.0-alpha.0",
89
+ "@aws-cdk/integ-tests-alpha": "2.128.0-alpha.0",
90
90
  "constructs": "^10.0.0",
91
- "@aws-cdk/cdk-build-tools": "2.126.0-alpha.0",
92
- "@aws-cdk/pkglint": "2.126.0-alpha.0"
91
+ "@aws-cdk/cdk-build-tools": "2.128.0-alpha.0",
92
+ "@aws-cdk/pkglint": "2.128.0-alpha.0"
93
93
  },
94
94
  "peerDependencies": {
95
- "aws-cdk-lib": "^2.126.0",
95
+ "aws-cdk-lib": "^2.128.0",
96
96
  "constructs": "^10.0.0"
97
97
  },
98
98
  "publishConfig": {