cdk-drizzle-migrate 1.0.0 → 2.0.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/API.md CHANGED
@@ -161,24 +161,12 @@ const drizzleMigrateProps: DrizzleMigrateProps = { ... }
161
161
 
162
162
  | **Name** | **Type** | **Description** |
163
163
  | --- | --- | --- |
164
- | <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.dbSecret">dbSecret</a></code> | <code>aws-cdk-lib.aws_secretsmanager.ISecret</code> | The database secret containing connection details Must contain standard CDK database secret properties: username, password, host, port, engine, etc. |
165
164
  | <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.migrationsPath">migrationsPath</a></code> | <code>string</code> | The path to the migrations directory This directory will be bundled with the Lambda function. |
166
- | <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | The VPC where the Lambda function will be deployed Required to allow the Lambda function to connect to the database. |
167
- | <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.cluster">cluster</a></code> | <code>aws-cdk-lib.aws_rds.IDatabaseCluster \| aws-cdk-lib.aws_rds.IDatabaseInstance</code> | Optional database cluster or instance If provided and a new security group is created, the security group will be configured to allow access to the database. |
165
+ | <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.cluster">cluster</a></code> | <code>aws-cdk-lib.aws_rds.IDatabaseCluster \| aws-cdk-lib.aws_rds.IDatabaseInstance \| aws-cdk-lib.aws_dsql.CfnCluster</code> | Optional database cluster or instance Supports both traditional RDS/Aurora clusters and DSQL clusters - For RDS/Aurora: security groups will be configured to allow access - For DSQL: IAM authentication will be used instead of secrets. |
166
+ | <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.dbSecret">dbSecret</a></code> | <code>aws-cdk-lib.aws_secretsmanager.ISecret</code> | The database secret containing connection details Must contain standard CDK database secret properties: username, password, host, port, engine, etc. |
168
167
  | <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.handlerProps">handlerProps</a></code> | <code>aws-cdk-lib.aws_lambda_nodejs.NodejsFunctionProps</code> | Optional properties to customize the Lambda function Excludes runtime, entry, and handler which are managed by the construct. |
169
- | <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.vpcSubnets">vpcSubnets</a></code> | <code>aws-cdk-lib.aws_ec2.SubnetSelection</code> | Optional subnet selection to deploy the Lambda function. |
170
-
171
- ---
172
-
173
- ##### `dbSecret`<sup>Required</sup> <a name="dbSecret" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.dbSecret"></a>
174
-
175
- ```typescript
176
- public readonly dbSecret: ISecret;
177
- ```
178
-
179
- - *Type:* aws-cdk-lib.aws_secretsmanager.ISecret
180
-
181
- The database secret containing connection details Must contain standard CDK database secret properties: username, password, host, port, engine, etc.
168
+ | <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | The VPC where the Lambda function will be deployed Required when your database is only accessible in a VPC. |
169
+ | <code><a href="#cdk-drizzle-migrate.DrizzleMigrateProps.property.vpcSubnets">vpcSubnets</a></code> | <code>aws-cdk-lib.aws_ec2.SubnetSelection</code> | Optional subnet selection to deploy the Lambda function Only used when vpc is specified. |
182
170
 
183
171
  ---
184
172
 
@@ -194,28 +182,31 @@ The path to the migrations directory This directory will be bundled with the Lam
194
182
 
195
183
  ---
196
184
 
197
- ##### `vpc`<sup>Required</sup> <a name="vpc" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.vpc"></a>
185
+ ##### `cluster`<sup>Optional</sup> <a name="cluster" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.cluster"></a>
198
186
 
199
187
  ```typescript
200
- public readonly vpc: IVpc;
188
+ public readonly cluster: IDatabaseCluster | IDatabaseInstance | CfnCluster;
201
189
  ```
202
190
 
203
- - *Type:* aws-cdk-lib.aws_ec2.IVpc
191
+ - *Type:* aws-cdk-lib.aws_rds.IDatabaseCluster | aws-cdk-lib.aws_rds.IDatabaseInstance | aws-cdk-lib.aws_dsql.CfnCluster
192
+ - *Default:* No database connection is configured
204
193
 
205
- The VPC where the Lambda function will be deployed Required to allow the Lambda function to connect to the database.
194
+ Optional database cluster or instance Supports both traditional RDS/Aurora clusters and DSQL clusters - For RDS/Aurora: security groups will be configured to allow access - For DSQL: IAM authentication will be used instead of secrets.
206
195
 
207
196
  ---
208
197
 
209
- ##### `cluster`<sup>Optional</sup> <a name="cluster" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.cluster"></a>
198
+ ##### `dbSecret`<sup>Optional</sup> <a name="dbSecret" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.dbSecret"></a>
210
199
 
211
200
  ```typescript
212
- public readonly cluster: IDatabaseCluster | IDatabaseInstance;
201
+ public readonly dbSecret: ISecret;
213
202
  ```
214
203
 
215
- - *Type:* aws-cdk-lib.aws_rds.IDatabaseCluster | aws-cdk-lib.aws_rds.IDatabaseInstance
216
- - *Default:* No database connection is configured
204
+ - *Type:* aws-cdk-lib.aws_secretsmanager.ISecret
205
+ - *Default:* undefined for DSQL clusters using IAM authentication
217
206
 
218
- Optional database cluster or instance If provided and a new security group is created, the security group will be configured to allow access to the database.
207
+ The database secret containing connection details Must contain standard CDK database secret properties: username, password, host, port, engine, etc.
208
+
209
+ Not required when relying on IAM authentication (such as DSQL).
219
210
 
220
211
  ---
221
212
 
@@ -232,6 +223,21 @@ Optional properties to customize the Lambda function Excludes runtime, entry, an
232
223
 
233
224
  ---
234
225
 
226
+ ##### `vpc`<sup>Optional</sup> <a name="vpc" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.vpc"></a>
227
+
228
+ ```typescript
229
+ public readonly vpc: IVpc;
230
+ ```
231
+
232
+ - *Type:* aws-cdk-lib.aws_ec2.IVpc
233
+ - *Default:* use VPC of your RDS/Aurora cluster
234
+
235
+ The VPC where the Lambda function will be deployed Required when your database is only accessible in a VPC.
236
+
237
+ Not required for DSQL as it uses public endpoints with IAM authentication
238
+
239
+ ---
240
+
235
241
  ##### `vpcSubnets`<sup>Optional</sup> <a name="vpcSubnets" id="cdk-drizzle-migrate.DrizzleMigrateProps.property.vpcSubnets"></a>
236
242
 
237
243
  ```typescript
@@ -241,7 +247,7 @@ public readonly vpcSubnets: SubnetSelection;
241
247
  - *Type:* aws-cdk-lib.aws_ec2.SubnetSelection
242
248
  - *Default:* PRIVATE_WITH_EGRESS subnets
243
249
 
244
- Optional subnet selection to deploy the Lambda function.
250
+ Optional subnet selection to deploy the Lambda function Only used when vpc is specified.
245
251
 
246
252
  ---
247
253
 
package/CLAUDE.md ADDED
@@ -0,0 +1,79 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ This is a Projen managed AWS CDK construct library that enables
8
+ running Drizzle ORM migrations against RDS clusters at deploy time. It
9
+ supports PostgreSQL, MariaDB, and MySQL engines and is designed for
10
+ enterprise environments with isolated subnets.
11
+
12
+ ## Development Commands
13
+
14
+ - **Build**: `npx projen build` - Compiles TypeScript and runs all build steps
15
+ - **Test**: `npx projen test` - Runs Jest tests and synthesizes integration stacks
16
+ - **Lint**: `npx projen eslint` - Runs ESLint on source files
17
+ - **Format**: `npx projen format` - Formats code with Prettier
18
+
19
+ ### Lambda Handler Development
20
+
21
+ When modifying the Lambda handler code in `lambda/handler.ts`:
22
+
23
+ 1. Transpile to JavaScript: `npx projen build:handler`
24
+ 2. This generates `src/handler/handler.js` which is used by the CDK construct
25
+ 3. The build automatically runs before compilation via pre-compile hook
26
+
27
+ ### Unit testing
28
+
29
+ - Run unit tests: `npx jest test/drizzle-migration.test.ts`
30
+ - Run a single test: `npx jest test/drizzle-migrate.test.ts --no-coverage -t "creates resources"`
31
+
32
+ ### Integration Testing
33
+
34
+ The project has three integration test stacks for different database engines:
35
+
36
+ - **PostgreSQL**: `npx projen integ:deploy:postgres`, `npx projen integ:destroy:postgres`
37
+ - **MariaDB**: `npx projen integ:deploy:mariadb`, `npx projen integ:destroy:mariadb`
38
+ - **Aurora Serverless**: `npx projen integ:deploy:serverless`, `npx projen integ:destroy:serverless`
39
+
40
+ Generate migrations for integration tests:
41
+ - `npx projen integ:generate-migrations:postgres`
42
+ - `npx projen integ:generate-migrations:mariadb`
43
+ - `npx projen integ:generate-migrations:serverless`
44
+
45
+ Synthesize all integration stacks: `npx projen integ:synth:all`
46
+
47
+ ## Architecture
48
+
49
+ ### Core Components
50
+
51
+ - **DrizzleMigrate** (`src/drizzle-migrate-provider.ts`): Main CDK construct that creates a Lambda function to run migrations
52
+ - **Lambda Handler** (`lambda/handler.ts`): Runtime code that connects to RDS and executes Drizzle migrations
53
+ - **Integration Tests** (`integ/`): Three separate CDK apps testing different database engines
54
+
55
+ ### Key Design Patterns
56
+
57
+ 1. **Handler Bundling**: The Lambda handler is transpiled from TypeScript to JavaScript using esbuild and bundled with the construct to avoid Node.js dependency issues
58
+
59
+ 2. **Security Groups**: If a database cluster/instance is passed to the construct, it automatically configures security group rules to allow Lambda access
60
+
61
+ 3. **Multi-Engine Support**: The handler detects database engine from the secret and uses appropriate Drizzle drivers (postgres-js, mysql2)
62
+
63
+ 4. **Migration Path Bundling**: The specified migrations directory is bundled with the Lambda function and read at runtime
64
+
65
+ ### Dependencies
66
+
67
+ - Uses Projen for project configuration and task management
68
+ - CDK v2
69
+ - Drizzle ORM and drizzle-kit for database operations
70
+ - esbuild for Lambda handler transpilation
71
+ - Jest for testing with integration stack synthesis
72
+
73
+ ## File Structure
74
+
75
+ - `src/` - CDK construct source code
76
+ - `lambda/` - Lambda handler source (TypeScript)
77
+ - `src/handler/` - Generated JavaScript handler (do not edit directly)
78
+ - `integ/` - Integration test CDK applications
79
+ - `test/` - Unit tests
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # About
2
2
 
3
3
  This CDK construct library makes it possible to run the drizzle
4
- migrate at deploy of your stack time against the RDS cluster of your
4
+ migrate at deploy of your stack time against the RDS or DSQL cluster of your
5
5
  choice. The supported engines are PostgreSQL, MariaDB and MySQL.
6
6
 
7
7
  This construct library is intended to be used in enterprise
@@ -31,6 +31,8 @@ actually want to create migrations.
31
31
 
32
32
  # Usage
33
33
 
34
+ ## RDS and Aurora
35
+
34
36
  Have an RDS database and a secret that stores your db
35
37
  credentials. Usually this will be the root secret for your RDS
36
38
  database:
@@ -64,6 +66,17 @@ Your secret should look like the standard one created by CDK:
64
66
  }
65
67
  ```
66
68
 
69
+ ## DSQL
70
+
71
+ For DSQL there is no secret where credentials are stored. Only IAM
72
+ access is supported.
73
+
74
+ Drizzle doesn't really support DSQL, so if you create migrations you
75
+ will often need to tweak them manually as so little of postgresql is
76
+ supported.
77
+
78
+ ## Migrations
79
+
67
80
  Specify the path where the migrations are stored, `migrations` in this case.
68
81
 
69
82
  When this resource is deployed, it will run `drizzle-kit migrate` for
@@ -80,9 +93,9 @@ security group if no security group is present in
80
93
  If you do not pass a cluster, make sure to pass in a security group in
81
94
  `handlerProps.securityGroups` which can connect to your database.
82
95
 
83
- Also if you do not pass a cluster you, but still create a database,
84
- you may wish to add a dependency to make sure the database is created,
85
- before the migration is run:
96
+ Also if you do not pass a cluster, but you still want to create a
97
+ database, you may wish to add a dependency to make sure the database
98
+ is created, before the migration is run:
86
99
 
87
100
  ```ts
88
101
  migrator.resource.node.addDependency(cluster)
@@ -95,14 +108,15 @@ migrator.resource.node.addDependency(cluster)
95
108
 
96
109
  # Working on this code
97
110
 
98
- 1. Install packages: `npm i`
111
+ 1. Install packages: `npm ci`
99
112
 
100
113
  2. Bootstrap CDK if not done: `npx cdk bootstrap
101
114
  aws://123456/us-east-1`. Replace 123456 with your AWS account.
102
115
 
103
116
  ## Handler notes
104
117
 
105
- When making changes to the Lambda handler code in `lambda/index.ts`, you need to transpile it to JavaScript:
118
+ When making changes to the Lambda handler code in `lambda/index.ts`,
119
+ you need to transpile it to JavaScript:
106
120
 
107
121
  ```bash
108
122
  npx projen build:handler
@@ -1,4 +1,5 @@
1
1
  import { CustomResource } from "aws-cdk-lib";
2
+ import * as dsql from "aws-cdk-lib/aws-dsql";
2
3
  import * as ec2 from "aws-cdk-lib/aws-ec2";
3
4
  import { NodejsFunction, NodejsFunctionProps } from "aws-cdk-lib/aws-lambda-nodejs";
4
5
  import * as rds from "aws-cdk-lib/aws-rds";
@@ -10,9 +11,12 @@ import { Construct } from "constructs";
10
11
  export interface DrizzleMigrateProps {
11
12
  /**
12
13
  * The database secret containing connection details
13
- * Must contain standard CDK database secret properties: username, password, host, port, engine, etc.
14
+ * Must contain standard CDK database secret properties: username,
15
+ * password, host, port, engine, etc.
16
+ * Not required when relying on IAM authentication (such as DSQL).
17
+ * @default - undefined for DSQL clusters using IAM authentication
14
18
  */
15
- readonly dbSecret: secretsmanager.ISecret;
19
+ readonly dbSecret?: secretsmanager.ISecret;
16
20
  /**
17
21
  * The path to the migrations directory
18
22
  * This directory will be bundled with the Lambda function
@@ -26,21 +30,25 @@ export interface DrizzleMigrateProps {
26
30
  readonly handlerProps?: NodejsFunctionProps;
27
31
  /**
28
32
  * The VPC where the Lambda function will be deployed
29
- * Required to allow the Lambda function to connect to the database
33
+ * Required when your database is only accessible in a VPC.
34
+ * Not required for DSQL as it uses public endpoints with IAM authentication
35
+ * @default - use VPC of your RDS/Aurora cluster
30
36
  */
31
- readonly vpc: ec2.IVpc;
37
+ readonly vpc?: ec2.IVpc;
32
38
  /**
33
39
  * Optional subnet selection to deploy the Lambda function
40
+ * Only used when vpc is specified
34
41
  * @default - PRIVATE_WITH_EGRESS subnets
35
42
  */
36
43
  readonly vpcSubnets?: ec2.SubnetSelection;
37
44
  /**
38
45
  * Optional database cluster or instance
39
- * If provided and a new security group is created, the security group will be
40
- * configured to allow access to the database
46
+ * Supports both traditional RDS/Aurora clusters and DSQL clusters
47
+ * - For RDS/Aurora: security groups will be configured to allow access
48
+ * - For DSQL: IAM authentication will be used instead of secrets
41
49
  * @default - No database connection is configured
42
50
  */
43
- readonly cluster?: rds.IDatabaseCluster | rds.IDatabaseInstance;
51
+ readonly cluster?: rds.IDatabaseCluster | rds.IDatabaseInstance | dsql.CfnCluster;
44
52
  }
45
53
  /**
46
54
  * A custom resource that runs Drizzle migrations
@@ -7,46 +7,78 @@ const assert_1 = require("assert");
7
7
  const fs_1 = require("fs");
8
8
  const path = require("path");
9
9
  const aws_cdk_lib_1 = require("aws-cdk-lib");
10
+ const dsql = require("aws-cdk-lib/aws-dsql");
11
+ const iam = require("aws-cdk-lib/aws-iam");
10
12
  const lambda = require("aws-cdk-lib/aws-lambda");
11
13
  const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
12
14
  const logs = require("aws-cdk-lib/aws-logs");
13
15
  const cr = require("aws-cdk-lib/custom-resources");
14
16
  const constructs_1 = require("constructs");
17
+ /**
18
+ * Helper function to determine if a cluster is a DSQL cluster
19
+ */
20
+ function isDsqlCluster(cluster) {
21
+ return cluster instanceof dsql.CfnCluster;
22
+ }
15
23
  /**
16
24
  * A custom resource that runs Drizzle migrations
17
25
  */
18
26
  class DrizzleMigrate extends constructs_1.Construct {
19
27
  constructor(scope, id, props) {
20
28
  super(scope, id);
29
+ // Validate configuration
30
+ const isDsql = props.cluster && isDsqlCluster(props.cluster);
31
+ if (!isDsql && !props.dbSecret) {
32
+ throw new Error("Either dbSecret (for traditional RDS) or cluster with DSQL must be provided");
33
+ }
34
+ if (!isDsql && !props.vpc) {
35
+ throw new Error("VPC is required for traditional RDS databases");
36
+ }
37
+ if (isDsql && props.dbSecret) {
38
+ throw new Error("dbSecret should not be provided when using DSQL cluster (uses IAM authentication)");
39
+ }
21
40
  const migrationsDir = path.join(process.cwd(), props.migrationsPath);
22
41
  (0, assert_1.strict)((0, fs_1.existsSync)(migrationsDir), `Migrations directory ${migrationsDir} does not exist`);
23
42
  const handlerDir = path.join(__dirname, "handler");
24
43
  const ts_filename = path.join(handlerDir, "index.ts");
25
44
  const js_filename = path.join(handlerDir, "index.js");
26
45
  const entry = (0, fs_1.existsSync)(ts_filename) ? ts_filename : js_filename;
46
+ const environment = {
47
+ NO_COLOR: "1",
48
+ ...(props.handlerProps?.environment || {}),
49
+ };
50
+ // Create explicit log group for the Lambda handler
51
+ const logGroup = new logs.LogGroup(this, "MigrateHandlerLogGroup", {
52
+ retention: logs.RetentionDays.ONE_WEEK,
53
+ // Keep log group, it's annoying when it gets deleted for new
54
+ // deploys, and something has gone wrong. You have no way to
55
+ // look at the logs in that case.
56
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.RETAIN,
57
+ });
27
58
  const onEventHandler = new aws_lambda_nodejs_1.NodejsFunction(this, "MigrateHandler", {
28
59
  runtime: lambda.Runtime.NODEJS_20_X,
29
60
  entry: entry,
30
- logRetention: logs.RetentionDays.ONE_WEEK,
61
+ logGroup: logGroup,
62
+ loggingFormat: lambda.LoggingFormat.JSON,
63
+ applicationLogLevelV2: lambda.ApplicationLogLevel.INFO,
31
64
  timeout: aws_cdk_lib_1.Duration.minutes(5),
32
65
  vpc: props.vpc,
33
66
  vpcSubnets: props.vpcSubnets,
34
67
  ...props.handlerProps,
35
- environment: {
36
- NO_COLOR: "1",
37
- ...(props.handlerProps?.environment || {}),
38
- },
68
+ environment,
39
69
  bundling: {
40
70
  sourceMap: false,
41
71
  // Include the migrations directory in the bundle
42
72
  commandHooks: {
43
73
  beforeBundling(_, outputDir) {
44
- return [
74
+ const commands = [
45
75
  `cp ${handlerDir}/handler.js ${outputDir}`,
46
76
  `cp -r ${migrationsDir} ${path.join(outputDir, "migrations")}`,
77
+ // Always download RDS certificate for SSL connections (both RDS and DSQL need it)
47
78
  `mkdir -p ${path.join(outputDir, "certs")}`,
48
79
  `curl --silent -fL https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -o ${path.join(outputDir, "certs", "global-bundle.pem")}`,
49
80
  ];
81
+ return commands;
50
82
  },
51
83
  afterBundling() {
52
84
  return [];
@@ -58,30 +90,55 @@ class DrizzleMigrate extends constructs_1.Construct {
58
90
  ...props.handlerProps?.bundling,
59
91
  },
60
92
  });
61
- // If the user gave us a security group, assume it can connect to the database.
62
- // If not, make sure the CDK created security group allows access to the DB.
63
- if (props.cluster &&
64
- (!props.handlerProps ||
65
- typeof props.handlerProps.securityGroups === "undefined" ||
66
- props.handlerProps.securityGroups.length === 0)) {
67
- props.cluster.connections.allowDefaultPortFrom(onEventHandler.connections, "Allow drizzle migrate lambda to connect to db");
93
+ // Handle database connection setup
94
+ if (isDsql) {
95
+ // For DSQL, grant IAM permissions instead of VPC security groups
96
+ const dsqlCluster = props.cluster;
97
+ onEventHandler.addToRolePolicy(new iam.PolicyStatement({
98
+ effect: iam.Effect.ALLOW,
99
+ actions: ["dsql:DbConnectAdmin"],
100
+ resources: [dsqlCluster.attrResourceArn],
101
+ }));
102
+ }
103
+ else {
104
+ // Traditional RDS setup with security groups
105
+ if (props.cluster &&
106
+ (!props.handlerProps ||
107
+ typeof props.handlerProps.securityGroups === "undefined" ||
108
+ props.handlerProps.securityGroups.length === 0)) {
109
+ const rdsCluster = props.cluster;
110
+ rdsCluster.connections.allowDefaultPortFrom(onEventHandler.connections, "Allow drizzle migrate lambda to connect to db");
111
+ }
112
+ // Grant the Lambda function permission to read the secret
113
+ props.dbSecret.grantRead(onEventHandler);
68
114
  }
69
115
  this.handler = onEventHandler;
70
- // Grant the Lambda function permission to read the secret
71
- props.dbSecret.grantRead(onEventHandler);
72
116
  const provider = new cr.Provider(this, "Provider", {
73
117
  onEventHandler,
74
- logRetention: logs.RetentionDays.ONE_WEEK,
118
+ logGroup,
75
119
  });
120
+ // Build custom resource properties based on database type
121
+ const customResourceProperties = {
122
+ // We're now using a fixed path inside the Lambda bundle
123
+ migrationsPath: "migrations",
124
+ // Adding a timestamp ensures the resource is updated on each deployment
125
+ timestamp: Date.now().toString(),
126
+ };
127
+ if (isDsql) {
128
+ // For DSQL, construct the endpoint from cluster ID and region
129
+ // DSQL endpoint format: ${clusterId}.dsql.${region}.on.aws
130
+ const dsqlCluster = props.cluster;
131
+ const clusterId = dsqlCluster.attrIdentifier;
132
+ const region = aws_cdk_lib_1.Stack.of(this).region;
133
+ customResourceProperties.endpoint = `${clusterId}.dsql.${region}.on.aws`;
134
+ customResourceProperties.port = "5432";
135
+ }
136
+ else {
137
+ customResourceProperties.secretArn = props.dbSecret.secretArn;
138
+ }
76
139
  this.resource = new aws_cdk_lib_1.CustomResource(this, "CustomResource", {
77
140
  serviceToken: provider.serviceToken,
78
- properties: {
79
- secretArn: props.dbSecret.secretArn,
80
- // We're now using a fixed path inside the Lambda bundle
81
- migrationsPath: "migrations",
82
- // Adding a timestamp ensures the resource is updated on each deployment
83
- timestamp: Date.now().toString(),
84
- },
141
+ properties: customResourceProperties,
85
142
  });
86
143
  const resourceCfn = this.resource.node.defaultChild;
87
144
  resourceCfn.addPropertyOverride("ServiceTimeout", 900);
@@ -93,5 +150,5 @@ class DrizzleMigrate extends constructs_1.Construct {
93
150
  }
94
151
  exports.DrizzleMigrate = DrizzleMigrate;
95
152
  _a = JSII_RTTI_SYMBOL_1;
96
- DrizzleMigrate[_a] = { fqn: "cdk-drizzle-migrate.DrizzleMigrate", version: "1.0.0" };
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpenpsZS1taWdyYXRlLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RyaXp6bGUtbWlncmF0ZS1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUF5QztBQUN6QywyQkFBK0I7QUFDL0IsNkJBQTRCO0FBQzVCLDZDQUFtRTtBQUVuRSxpREFBZ0Q7QUFDaEQscUVBQW1GO0FBQ25GLDZDQUE0QztBQUc1QyxtREFBa0Q7QUFDbEQsMkNBQXNDO0FBOEN0Qzs7R0FFRztBQUNILE1BQWEsY0FBZSxTQUFRLHNCQUFTO0lBVzNDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDcEUsSUFBQSxlQUFNLEVBQ0osSUFBQSxlQUFVLEVBQUMsYUFBYSxDQUFDLEVBQ3pCLHdCQUF3QixhQUFhLGlCQUFpQixDQUN2RCxDQUFBO1FBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFFbEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDckQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFVLEVBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBO1FBRWpFLE1BQU0sY0FBYyxHQUFHLElBQUksa0NBQWMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFD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Q0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2pELENBQUM7SUFDSCxDQUFDOztBQXRHSCx3Q0F1R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzdHJpY3QgYXMgYXNzZXJ0IH0gZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcImZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgQ2ZuUmVzb3VyY2UsIEN1c3RvbVJlc291cmNlLCBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uLCBOb2RlanNGdW5jdGlvblByb3BzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCJcbmltcG9ydCAqIGFzIHJkcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiXG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIGNyIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBEcml6emxlTWlncmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERyaXp6bGVNaWdyYXRlUHJvcHMge1xuICAvKipcbiAgICogVGhlIGRhdGFiYXNlIHNlY3JldCBjb250YWluaW5nIGNvbm5lY3Rpb24gZGV0YWlsc1xuICAgKiBNdXN0IGNvbnRhaW4gc3RhbmRhcmQgQ0RLIGRhdGFiYXNlIHNlY3JldCBwcm9wZXJ0aWVzOiB1c2VybmFtZSwgcGFzc3dvcmQsIGhvc3QsIHBvcnQsIGVuZ2luZSwgZXRjLlxuICAgKi9cbiAgcmVhZG9ubHkgZGJTZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXRcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5XG4gICAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYnVuZGxlZCB3aXRoIHRoZSBMYW1iZGEgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IG1pZ3JhdGlvbnNQYXRoOiBzdHJpbmdcblxuICAvKipcbiAgICogT3B0aW9uYWwgcHJvcGVydGllcyB0byBjdXN0b21pemUgdGhlIExhbWJkYSBmdW5jdGlvblxuICAgKiBFeGNsdWRlcyBydW50aW1lLCBlbnRyeSwgYW5kIGhhbmRsZXIgd2hpY2ggYXJlIG1hbmFnZWQgYnkgdGhlIGNvbnN0cnVjdFxuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgTGFtYmRhIGNvbmZpZ3VyYXRpb24gaXMgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgaGFuZGxlclByb3BzPzogTm9kZWpzRnVuY3Rpb25Qcm9wc1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIHdoZXJlIHRoZSBMYW1iZGEgZnVuY3Rpb24gd2lsbCBiZSBkZXBsb3llZFxuICAgKiBSZXF1aXJlZCB0byBhbGxvdyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlXG4gICAqL1xuICByZWFkb25seSB2cGM6IGVjMi5JVnBjXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHN1Ym5ldCBzZWxlY3Rpb24gdG8gZGVwbG95IHRoZSBMYW1iZGEgZnVuY3Rpb25cbiAgICogQGRlZmF1bHQgLSBQUklWQVRFX1dJVEhfRUdSRVNTIHN1Ym5ldHNcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRhdGFiYXNlIGNsdXN0ZXIgb3IgaW5zdGFuY2VcbiAgICogSWYgcHJvdmlkZWQgYW5kIGEgbmV3IHNlY3VyaXR5IGdyb3VwIGlzIGNyZWF0ZWQsIHRoZSBzZWN1cml0eSBncm91cCB3aWxsIGJlXG4gICAqIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWNjZXNzIHRvIHRoZSBkYXRhYmFzZVxuICAgKiBAZGVmYXVsdCAtIE5vIGRhdGFiYXNlIGNvbm5lY3Rpb24gaXMgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3Rlcj86IHJkcy5JRGF0YWJhc2VDbHVzdGVyIHwgcmRzLklEYXRhYmFzZUluc3RhbmNlXG59XG5cbi8qKlxuICogQSBjdXN0b20gcmVzb3VyY2UgdGhhdCBydW5zIERyaXp6bGUgbWlncmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgRHJpenpsZU1pZ3JhdGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIGN1c3RvbSByZXNvdXJjZSB0aGF0IHdhcyBjcmVhdGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IEN1c3RvbVJlc291cmNlXG5cbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBleGVjdXRlcyB0aGUgbWlncmF0aW9uc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhhbmRsZXI6IE5vZGVqc0Z1bmN0aW9uXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERyaXp6bGVNaWdyYXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBtaWdyYXRpb25zRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIHByb3BzLm1pZ3JhdGlvbnNQYXRoKVxuICAgIGFzc2VydChcbiAgICAgIGV4aXN0c1N5bmMobWlncmF0aW9uc0RpciksXG4gICAgICBgTWlncmF0aW9ucyBkaXJlY3RvcnkgJHttaWdyYXRpb25zRGlyfSBkb2VzIG5vdCBleGlzdGBcbiAgICApXG4gICAgY29uc3QgaGFuZGxlckRpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiaGFuZGxlclwiKVxuXG4gICAgY29uc3QgdHNfZmlsZW5hbWUgPSBwYXRoLmpvaW4oaGFuZGxlckRpciwgXCJpbmRleC50c1wiKVxuICAgIGNvbnN0IGpzX2ZpbGVuYW1lID0gcGF0aC5qb2luKGhhbmRsZXJEaXIsIFwiaW5kZXguanNcIilcbiAgICBjb25zdCBlbnRyeSA9IGV4aXN0c1N5bmModHNfZmlsZW5hbWUpID8gdHNfZmlsZW5hbWUgOiBqc19maWxlbmFtZVxuXG4gICAgY29uc3Qgb25FdmVudEhhbmRsZXIgPSBuZXcgTm9kZWpzRnVuY3Rpb24odGhpcywgXCJNaWdyYXRlSGFuZGxlclwiLCB7XG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGVudHJ5OiBlbnRyeSxcbiAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgdnBjU3VibmV0czogcHJvcHMudnBjU3VibmV0cyxcbiAgICAgIC4uLnByb3BzLmhhbmRsZXJQcm9wcyxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIE5PX0NPTE9SOiBcIjFcIixcbiAgICAgICAgLi4uKHByb3BzLmhhbmRsZXJQcm9wcz8uZW52aXJvbm1lbnQgfHwge30pLFxuICAgICAgfSxcbiAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgIHNvdXJjZU1hcDogZmFsc2UsXG4gICAgICAgIC8vIEluY2x1ZGUgdGhlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGluIHRoZSBidW5kbGVcbiAgICAgICAgY29tbWFuZEhvb2tzOiB7XG4gICAgICAgICAgYmVmb3JlQnVuZGxpbmcoXzogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIGBjcCAke2hhbmRsZXJEaXJ9L2hhbmRsZXIuanMgJHtvdXRwdXREaXJ9YCxcbiAgICAgICAgICAgICAgYGNwIC1yICR7bWlncmF0aW9uc0Rpcn0gJHtwYXRoLmpvaW4ob3V0cHV0RGlyLCBcIm1pZ3JhdGlvbnNcIil9YCxcbiAgICAgICAgICAgICAgYG1rZGlyIC1wICR7cGF0aC5qb2luKG91dHB1dERpciwgXCJjZXJ0c1wiKX1gLFxuICAgICAgICAgICAgICBgY3VybCAtLXNpbGVudCAtZkwgaHR0cHM6Ly90cnVzdHN0b3JlLnBraS5yZHMuYW1hem9uYXdzLmNvbS9nbG9iYWwvZ2xvYmFsLWJ1bmRsZS5wZW0gLW8gJHtwYXRoLmpvaW4ob3V0cHV0RGlyLCBcImNlcnRzXCIsIFwiZ2xvYmFsLWJ1bmRsZS5wZW1cIil9YCxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGFmdGVyQnVuZGxpbmcoKTogc3RyaW5nW10ge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiZWZvcmVJbnN0YWxsKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnByb3BzLmhhbmRsZXJQcm9wcz8uYnVuZGxpbmcsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICAvLyBJZiB0aGUgdXNlciBnYXZlIHVzIGEgc2VjdXJpdHkgZ3JvdXAsIGFzc3VtZSBpdCBjYW4gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuXG4gICAgLy8gSWYgbm90LCBtYWtlIHN1cmUgdGhlIENESyBjcmVhdGVkIHNlY3VyaXR5IGdyb3VwIGFsbG93cyBhY2Nlc3MgdG8gdGhlIERCLlxuICAgIGlmIChcbiAgICAgIHByb3BzLmNsdXN0ZXIgJiZcbiAgICAgICghcHJvcHMuaGFuZGxlclByb3BzIHx8XG4gICAgICAgIHR5cGVvZiBwcm9wcy5oYW5kbGVyUHJvcHMuc2VjdXJpdHlHcm91cHMgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgcHJvcHMuaGFuZGxlclByb3BzLnNlY3VyaXR5R3JvdXBzLmxlbmd0aCA9PT0gMClcbiAgICApIHtcbiAgICAgIHByb3BzLmNsdXN0ZXIuY29ubmVjdGlvbnMuYWxsb3dEZWZhdWx0UG9ydEZyb20oXG4gICAgICAgIG9uRXZlbnRIYW5kbGVyLmNvbm5lY3Rpb25zLFxuICAgICAgICBcIkFsbG93IGRyaXp6bGUgbWlncmF0ZSBsYW1iZGEgdG8gY29ubmVjdCB0byBkYlwiXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVyID0gb25FdmVudEhhbmRsZXJcblxuICAgIC8vIEdyYW50IHRoZSBMYW1iZGEgZnVuY3Rpb24gcGVybWlzc2lvbiB0byByZWFkIHRoZSBzZWNyZXRcbiAgICBwcm9wcy5kYlNlY3JldC5ncmFudFJlYWQob25FdmVudEhhbmRsZXIpXG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBjci5Qcm92aWRlcih0aGlzLCBcIlByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyLFxuICAgICAgbG9nUmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX1dFRUssXG4gICAgfSlcblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJDdXN0b21SZXNvdXJjZVwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc2VjcmV0QXJuOiBwcm9wcy5kYlNlY3JldC5zZWNyZXRBcm4sXG4gICAgICAgIC8vIFdlJ3JlIG5vdyB1c2luZyBhIGZpeGVkIHBhdGggaW5zaWRlIHRoZSBMYW1iZGEgYnVuZGxlXG4gICAgICAgIG1pZ3JhdGlvbnNQYXRoOiBcIm1pZ3JhdGlvbnNcIixcbiAgICAgICAgLy8gQWRkaW5nIGEgdGltZXN0YW1wIGVuc3VyZXMgdGhlIHJlc291cmNlIGlzIHVwZGF0ZWQgb24gZWFjaCBkZXBsb3ltZW50XG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKS50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVzb3VyY2VDZm4gPSB0aGlzLnJlc291cmNlLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblJlc291cmNlXG4gICAgcmVzb3VyY2VDZm4uYWRkUHJvcGVydHlPdmVycmlkZShcIlNlcnZpY2VUaW1lb3V0XCIsIDkwMClcblxuICAgIC8vIEFkZCBkZXBlbmRlbmN5IHRvIGVuc3VyZSBkYXRhYmFzZSBpcyBjcmVhdGVkIGJlZm9yZSBtaWdyYXRpb25zIHJ1blxuICAgIGlmIChwcm9wcy5jbHVzdGVyKSB7XG4gICAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5jbHVzdGVyKVxuICAgIH1cbiAgfVxufVxuIl19
153
+ DrizzleMigrate[_a] = { fqn: "cdk-drizzle-migrate.DrizzleMigrate", version: "2.0.0" };
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpenpsZS1taWdyYXRlLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RyaXp6bGUtbWlncmF0ZS1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUF5QztBQUN6QywyQkFBK0I7QUFDL0IsNkJBQTRCO0FBQzVCLDZDQUF5RjtBQUN6Riw2Q0FBNEM7QUFFNUMsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxxRUFBbUY7QUFDbkYsNkNBQTRDO0FBRzVDLG1EQUFrRDtBQUNsRCwyQ0FBc0M7QUFFdEM7O0dBRUc7QUFDSCxTQUFTLGFBQWEsQ0FDcEIsT0FBdUU7SUFFdkUsT0FBTyxPQUFPLFlBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQTtBQUMzQyxDQUFDO0FBcUREOztHQUVHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsc0JBQVM7SUFXM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLHlCQUF5QjtRQUN6QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDNUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUNiLDZFQUE2RSxDQUM5RSxDQUFBO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFBO1FBQ2xFLENBQUM7UUFDRCxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDYixtRkFBbUYsQ0FDcEYsQ0FBQTtRQUNILENBQUM7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QztZQUNYLDhEQUE4RDtZQUM5RCwyREFBMkQ7WUFDM0QsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQTBCLENBQUE7WUFDcEQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQTtZQUM1QyxNQUFNLE1BQU0sR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUE7WUFDcEMsd0JBQXdCLENBQUMsUUFBUSxHQUFHLEdBQUcsU0FBUyxTQUFTLE1BQU0sU0FBUyxDQUFBO1lBQ3hFLHdCQUF3QixDQUFDLElBQUksR0FBRyxNQUFNLENBQUE7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTix3QkFBd0IsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVMsQ0FBQyxTQUFTLENBQUE7UUFDaEUsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSw0QkFBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUN6RCxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7WUFDbkMsVUFBVSxFQUFFLHdCQUF3QjtTQUNyQyxDQUFDLENBQUE7UUFFRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUEyQixDQUFBO1FBQ2xFLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUV0RCxxRUFBcUU7UUFDckUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNqRCxDQUFDO0lBQ0gsQ0FBQzs7QUFqS0gsd0NBa0tDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGFzc2VydCB9IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IENmblJlc291cmNlLCBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24sIFN0YWNrLCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIGRzcWwgZnJvbSBcImF3cy1jZGstbGliL2F3cy1kc3FsXCJcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uLCBOb2RlanNGdW5jdGlvblByb3BzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCJcbmltcG9ydCAqIGFzIHJkcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiXG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIGNyIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgY2x1c3RlciBpcyBhIERTUUwgY2x1c3RlclxuICovXG5mdW5jdGlvbiBpc0RzcWxDbHVzdGVyKFxuICBjbHVzdGVyOiByZHMuSURhdGFiYXNlQ2x1c3RlciB8IHJkcy5JRGF0YWJhc2VJbnN0YW5jZSB8IGRzcWwuQ2ZuQ2x1c3RlclxuKTogY2x1c3RlciBpcyBkc3FsLkNmbkNsdXN0ZXIge1xuICByZXR1cm4gY2x1c3RlciBpbnN0YW5jZW9mIGRzcWwuQ2ZuQ2x1c3RlclxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIERyaXp6bGVNaWdyYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHJpenpsZU1pZ3JhdGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgZGF0YWJhc2Ugc2VjcmV0IGNvbnRhaW5pbmcgY29ubmVjdGlvbiBkZXRhaWxzXG4gICAqIE11c3QgY29udGFpbiBzdGFuZGFyZCBDREsgZGF0YWJhc2Ugc2VjcmV0IHByb3BlcnRpZXM6IHVzZXJuYW1lLFxuICAgKiBwYXNzd29yZCwgaG9zdCwgcG9ydCwgZW5naW5lLCBldGMuXG4gICAqIE5vdCByZXF1aXJlZCB3aGVuIHJlbHlpbmcgb24gSUFNIGF1dGhlbnRpY2F0aW9uIChzdWNoIGFzIERTUUwpLlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCBmb3IgRFNRTCBjbHVzdGVycyB1c2luZyBJQU0gYXV0aGVudGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRiU2VjcmV0Pzogc2VjcmV0c21hbmFnZXIuSVNlY3JldFxuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgbWlncmF0aW9ucyBkaXJlY3RvcnlcbiAgICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBidW5kbGVkIHdpdGggdGhlIExhbWJkYSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWlncmF0aW9uc1BhdGg6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGN1c3RvbWl6ZSB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gICAqIEV4Y2x1ZGVzIHJ1bnRpbWUsIGVudHJ5LCBhbmQgaGFuZGxlciB3aGljaCBhcmUgbWFuYWdlZCBieSB0aGUgY29uc3RydWN0XG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBMYW1iZGEgY29uZmlndXJhdGlvbiBpcyB1c2VkXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyUHJvcHM/OiBOb2RlanNGdW5jdGlvblByb3BzXG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgd2hlcmUgdGhlIExhbWJkYSBmdW5jdGlvbiB3aWxsIGJlIGRlcGxveWVkXG4gICAqIFJlcXVpcmVkIHdoZW4geW91ciBkYXRhYmFzZSBpcyBvbmx5IGFjY2Vzc2libGUgaW4gYSBWUEMuXG4gICAqIE5vdCByZXF1aXJlZCBmb3IgRFNRTCBhcyBpdCB1c2VzIHB1YmxpYyBlbmRwb2ludHMgd2l0aCBJQU0gYXV0aGVudGljYXRpb25cbiAgICogQGRlZmF1bHQgLSB1c2UgVlBDIG9mIHlvdXIgUkRTL0F1cm9yYSBjbHVzdGVyXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBlYzIuSVZwY1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzdWJuZXQgc2VsZWN0aW9uIHRvIGRlcGxveSB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gICAqIE9ubHkgdXNlZCB3aGVuIHZwYyBpcyBzcGVjaWZpZWRcbiAgICogQGRlZmF1bHQgLSBQUklWQVRFX1dJVEhfRUdSRVNTIHN1Ym5ldHNcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRhdGFiYXNlIGNsdXN0ZXIgb3IgaW5zdGFuY2VcbiAgICogU3VwcG9ydHMgYm90aCB0cmFkaXRpb25hbCBSRFMvQXVyb3JhIGNsdXN0ZXJzIGFuZCBEU1FMIGNsdXN0ZXJzXG4gICAqIC0gRm9yIFJEUy9BdXJvcmE6IHNlY3VyaXR5IGdyb3VwcyB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWNjZXNzXG4gICAqIC0gRm9yIERTUUw6IElBTSBhdXRoZW50aWNhdGlvbiB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiBzZWNyZXRzXG4gICAqIEBkZWZhdWx0IC0gTm8gZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyPzogcmRzLklEYXRhYmFzZUNsdXN0ZXIgfCByZHMuSURhdGFiYXNlSW5zdGFuY2UgfCBkc3FsLkNmbkNsdXN0ZXJcbn1cblxuLyoqXG4gKiBBIGN1c3RvbSByZXNvdXJjZSB0aGF0IHJ1bnMgRHJpenpsZSBtaWdyYXRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBEcml6emxlTWlncmF0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHJlc291cmNlIHRoYXQgd2FzIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogQ3VzdG9tUmVzb3VyY2VcblxuICAvKipcbiAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBtaWdyYXRpb25zXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGFuZGxlcjogTm9kZWpzRnVuY3Rpb25cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRHJpenpsZU1pZ3JhdGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIC8vIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBpc0RzcWwgPSBwcm9wcy5jbHVzdGVyICYmIGlzRHNxbENsdXN0ZXIocHJvcHMuY2x1c3RlcilcbiAgICBpZiAoIWlzRHNxbCAmJiAhcHJvcHMuZGJTZWNyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFaXRoZXIgZGJTZWNyZXQgKGZvciB0cmFkaXRpb25hbCBSRFMpIG9yIGNsdXN0ZXIgd2l0aCBEU1FMIG11c3QgYmUgcHJvdmlkZWRcIlxuICAgICAgKVxuICAgIH1cbiAgICBpZiAoIWlzRHNxbCAmJiAhcHJvcHMudnBjKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWUEMgaXMgcmVxdWlyZWQgZm9yIHRyYWRpdGlvbmFsIFJEUyBkYXRhYmFzZXNcIilcbiAgICB9XG4gICAgaWYgKGlzRHNxbCAmJiBwcm9wcy5kYlNlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImRiU2VjcmV0IHNob3VsZCBub3QgYmUgcHJvdmlkZWQgd2hlbiB1c2luZyBEU1FMIGNsdXN0ZXIgKHVzZXMgSUFNIGF1dGhlbnRpY2F0aW9uKVwiXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgbWlncmF0aW9uc0RpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBwcm9wcy5taWdyYXRpb25zUGF0aClcbiAgICBhc3NlcnQoXG4gICAgICBleGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXIpLFxuICAgICAgYE1pZ3JhdGlvbnMgZGlyZWN0b3J5ICR7bWlncmF0aW9uc0Rpcn0gZG9lcyBub3QgZXhpc3RgXG4gICAgKVxuICAgIGNvbnN0IGhhbmRsZXJEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImhhbmRsZXJcIilcblxuICAgIGNvbnN0IHRzX2ZpbGVuYW1lID0gcGF0aC5qb2luKGhhbmRsZXJEaXIsIFwiaW5kZXgudHNcIilcbiAgICBjb25zdCBqc19maWxlbmFtZSA9IHBhdGguam9pbihoYW5kbGVyRGlyLCBcImluZGV4LmpzXCIpXG4gICAgY29uc3QgZW50cnkgPSBleGlzdHNTeW5jKHRzX2ZpbGVuYW1lKSA/IHRzX2ZpbGVuYW1lIDoganNfZmlsZW5hbWVcblxuICAgIGNvbnN0IGVudmlyb25tZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgTk9fQ09MT1I6IFwiMVwiLFxuICAgICAgLi4uKHByb3BzLmhhbmRsZXJQcm9wcz8uZW52aXJvbm1lbnQgfHwge30pLFxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBleHBsaWNpdCBsb2cgZ3JvdXAgZm9yIHRoZSBMYW1iZGEgaGFuZGxlclxuICAgIGNvbnN0IGxvZ0dyb3VwID0gbmV3IGxvZ3MuTG9nR3JvdXAodGhpcywgXCJNaWdyYXRlSGFuZGxlckxvZ0dyb3VwXCIsIHtcbiAgICAgIHJldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgICAgLy8gS2VlcCBsb2cgZ3JvdXAsIGl0J3MgYW5ub3lpbmcgd2hlbiBpdCBnZXRzIGRlbGV0ZWQgZm9yIG5ld1xuICAgICAgLy8gZGVwbG95cywgYW5kIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZy4gWW91IGhhdmUgbm8gd2F5IHRvXG4gICAgICAvLyBsb29rIGF0IHRoZSBsb2dzIGluIHRoYXQgY2FzZS5cbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgIH0pXG5cbiAgICBjb25zdCBvbkV2ZW50SGFuZGxlciA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCBcIk1pZ3JhdGVIYW5kbGVyXCIsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgZW50cnk6IGVudHJ5LFxuICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwLFxuICAgICAgbG9nZ2luZ0Zvcm1hdDogbGFtYmRhLkxvZ2dpbmdGb3JtYXQuSlNPTixcbiAgICAgIGFwcGxpY2F0aW9uTG9nTGV2ZWxWMjogbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GTyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHByb3BzLnZwY1N1Ym5ldHMsXG4gICAgICAuLi5wcm9wcy5oYW5kbGVyUHJvcHMsXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgIHNvdXJjZU1hcDogZmFsc2UsXG4gICAgICAgIC8vIEluY2x1ZGUgdGhlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGluIHRoZSBidW5kbGVcbiAgICAgICAgY29tbWFuZEhvb2tzOiB7XG4gICAgICAgICAgYmVmb3JlQnVuZGxpbmcoXzogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICAgICAgICAgICBgY3AgJHtoYW5kbGVyRGlyfS9oYW5kbGVyLmpzICR7b3V0cHV0RGlyfWAsXG4gICAgICAgICAgICAgIGBjcCAtciAke21pZ3JhdGlvbnNEaXJ9ICR7cGF0aC5qb2luKG91dHB1dERpciwgXCJtaWdyYXRpb25zXCIpfWAsXG4gICAgICAgICAgICAgIC8vIEFsd2F5cyBkb3dubG9hZCBSRFMgY2VydGlmaWNhdGUgZm9yIFNTTCBjb25uZWN0aW9ucyAoYm90aCBSRFMgYW5kIERTUUwgbmVlZCBpdClcbiAgICAgICAgICAgICAgYG1rZGlyIC1wICR7cGF0aC5qb2luKG91dHB1dERpciwgXCJjZXJ0c1wiKX1gLFxuICAgICAgICAgICAgICBgY3VybCAtLXNpbGVudCAtZkwgaHR0cHM6Ly90cnVzdHN0b3JlLnBraS5yZHMuYW1hem9uYXdzLmNvbS9nbG9iYWwvZ2xvYmFsLWJ1bmRsZS5wZW0gLW8gJHtwYXRoLmpvaW4ob3V0cHV0RGlyLCBcImNlcnRzXCIsIFwiZ2xvYmFsLWJ1bmRsZS5wZW1cIil9YCxcbiAgICAgICAgICAgIF1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhZnRlckJ1bmRsaW5nKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYmVmb3JlSW5zdGFsbCgpOiBzdHJpbmdbXSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAuLi5wcm9wcy5oYW5kbGVyUHJvcHM/LmJ1bmRsaW5nLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgLy8gSGFuZGxlIGRhdGFiYXNlIGNvbm5lY3Rpb24gc2V0dXBcbiAgICBpZiAoaXNEc3FsKSB7XG4gICAgICAvLyBGb3IgRFNRTCwgZ3JhbnQgSUFNIHBlcm1pc3Npb25zIGluc3RlYWQgb2YgVlBDIHNlY3VyaXR5IGdyb3Vwc1xuICAgICAgY29uc3QgZHNxbENsdXN0ZXIgPSBwcm9wcy5jbHVzdGVyIGFzIGRzcWwuQ2ZuQ2x1c3RlclxuICAgICAgb25FdmVudEhhbmRsZXIuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFtcImRzcWw6RGJDb25uZWN0QWRtaW5cIl0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbZHNxbENsdXN0ZXIuYXR0clJlc291cmNlQXJuXSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhZGl0aW9uYWwgUkRTIHNldHVwIHdpdGggc2VjdXJpdHkgZ3JvdXBzXG4gICAgICBpZiAoXG4gICAgICAgIHByb3BzLmNsdXN0ZXIgJiZcbiAgICAgICAgKCFwcm9wcy5oYW5kbGVyUHJvcHMgfHxcbiAgICAgICAgICB0eXBlb2YgcHJvcHMuaGFuZGxlclByb3BzLnNlY3VyaXR5R3JvdXBzID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgICAgcHJvcHMuaGFuZGxlclByb3BzLnNlY3VyaXR5R3JvdXBzLmxlbmd0aCA9PT0gMClcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZHNDbHVzdGVyID0gcHJvcHMuY2x1c3RlciBhcyByZHMuSURhdGFiYXNlQ2x1c3RlciB8IHJkcy5JRGF0YWJhc2VJbnN0YW5jZVxuICAgICAgICByZHNDbHVzdGVyLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRGcm9tKFxuICAgICAgICAgIG9uRXZlbnRIYW5kbGVyLmNvbm5lY3Rpb25zLFxuICAgICAgICAgIFwiQWxsb3cgZHJpenpsZSBtaWdyYXRlIGxhbWJkYSB0byBjb25uZWN0IHRvIGRiXCJcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBHcmFudCB0aGUgTGFtYmRhIGZ1bmN0aW9uIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc2VjcmV0XG4gICAgICBwcm9wcy5kYlNlY3JldCEuZ3JhbnRSZWFkKG9uRXZlbnRIYW5kbGVyKVxuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlciA9IG9uRXZlbnRIYW5kbGVyXG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBjci5Qcm92aWRlcih0aGlzLCBcIlByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyLFxuICAgICAgbG9nR3JvdXAsXG4gICAgfSlcblxuICAgIC8vIEJ1aWxkIGN1c3RvbSByZXNvdXJjZSBwcm9wZXJ0aWVzIGJhc2VkIG9uIGRhdGFiYXNlIHR5cGVcbiAgICBjb25zdCBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAvLyBXZSdyZSBub3cgdXNpbmcgYSBmaXhlZCBwYXRoIGluc2lkZSB0aGUgTGFtYmRhIGJ1bmRsZVxuICAgICAgbWlncmF0aW9uc1BhdGg6IFwibWlncmF0aW9uc1wiLFxuICAgICAgLy8gQWRkaW5nIGEgdGltZXN0YW1wIGVuc3VyZXMgdGhlIHJlc291cmNlIGlzIHVwZGF0ZWQgb24gZWFjaCBkZXBsb3ltZW50XG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCkudG9TdHJpbmcoKSxcbiAgICB9XG5cbiAgICBpZiAoaXNEc3FsKSB7XG4gICAgICAvLyBGb3IgRFNRTCwgY29uc3RydWN0IHRoZSBlbmRwb2ludCBmcm9tIGNsdXN0ZXIgSUQgYW5kIHJlZ2lvblxuICAgICAgLy8gRFNRTCBlbmRwb2ludCBmb3JtYXQ6ICR7Y2x1c3RlcklkfS5kc3FsLiR7cmVnaW9ufS5vbi5hd3NcbiAgICAgIGNvbnN0IGRzcWxDbHVzdGVyID0gcHJvcHMuY2x1c3RlciBhcyBkc3FsLkNmbkNsdXN0ZXJcbiAgICAgIGNvbnN0IGNsdXN0ZXJJZCA9IGRzcWxDbHVzdGVyLmF0dHJJZGVudGlmaWVyXG4gICAgICBjb25zdCByZWdpb24gPSBTdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICAgIGN1c3RvbVJlc291cmNlUHJvcGVydGllcy5lbmRwb2ludCA9IGAke2NsdXN0ZXJJZH0uZHNxbC4ke3JlZ2lvbn0ub24uYXdzYFxuICAgICAgY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzLnBvcnQgPSBcIjU0MzJcIlxuICAgIH0gZWxzZSB7XG4gICAgICBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXMuc2VjcmV0QXJuID0gcHJvcHMuZGJTZWNyZXQhLnNlY3JldEFyblxuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJDdXN0b21SZXNvdXJjZVwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IGN1c3RvbVJlc291cmNlUHJvcGVydGllcyxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVzb3VyY2VDZm4gPSB0aGlzLnJlc291cmNlLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblJlc291cmNlXG4gICAgcmVzb3VyY2VDZm4uYWRkUHJvcGVydHlPdmVycmlkZShcIlNlcnZpY2VUaW1lb3V0XCIsIDkwMClcblxuICAgIC8vIEFkZCBkZXBlbmRlbmN5IHRvIGVuc3VyZSBkYXRhYmFzZSBpcyBjcmVhdGVkIGJlZm9yZSBtaWdyYXRpb25zIHJ1blxuICAgIGlmIChwcm9wcy5jbHVzdGVyKSB7XG4gICAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5jbHVzdGVyKVxuICAgIH1cbiAgfVxufVxuIl19