@glicogh/healthcare-cdk 0.1.88 → 0.1.89

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/README.md CHANGED
@@ -91,13 +91,68 @@ The following stack are meant to be deployed once and shared across the microser
91
91
  - MicroserviceRedis
92
92
  - MicroserviceMySQL
93
93
  - MicroserviceClickHouse
94
+ - MicroserviceMigration
94
95
 
95
- The only required option for these stack is `env`. For example, to deploy `MicroserviceNetwork` in the UAT environment, you would run the command
96
+ The only required option for these stacks is `env`. To deploy a single shared stack, pass its `service` value:
97
+
98
+ | Stack | `service` |
99
+ | ---------------------- | ------------ |
100
+ | MicroserviceNetwork | `network` |
101
+ | MicroserviceInfraAuth | `infra-auth` |
102
+ | MicroserviceRedis | `redis` |
103
+ | MicroserviceMySQL | `mysql` |
104
+ | MicroserviceClickHouse | `clickhouse` |
105
+ | MicroserviceMigration | `migration` |
106
+
107
+ For example, to deploy `MicroserviceNetwork` in the UAT environment, you would run the command
108
+
109
+ ```
110
+ cdk --profile glicogh-uat --context env=uat --context service=network deploy
111
+ ```
112
+
113
+ Only the selected stack is synthesized, so unrelated stacks (and their code assets, such as the migration Lambdas) are not bundled. Omitting `service` synthesizes and deploys all shared stacks. Alternatively, when deploying by stack name (`cdk --context env=uat deploy MicroserviceNetwork`), pass `--exclusively` to `synth`/`deploy`/`diff` to skip bundling unrelated stacks.
114
+
115
+ ### Migration orchestrator (MicroserviceMigration)
116
+
117
+ `MicroserviceMigration` bundles the migration producer/consumer Lambdas (from the sibling `migration/lambdas` directory), the `migration-queue.fifo` queue, a `migration-verifier` Lambda, an S3 artifacts bucket, a one-shot ECS Fargate scripts runner, and the `migration-orchestrator` Step Function (`cdk/constructs/migration-state-machine.ts`). Invoking the state machine runs the migration runbook end-to-end:
118
+
119
+ - **Scripts (runbook Steps 1–4)** run as one-shot ECS Fargate tasks from the migration repo's `Dockerfile` (entrypoint dispatches `restore` / `migrations` / `diseases` / `claim-batches` / `reset`). The restore task syncs the legacy dump from S3 first; no 15-minute Lambda cap.
120
+ - **Migratables (Steps 5–16)** loop the producer Lambda until the response reports `endReached: true`, then wait for the SQS queue to drain (`ApproximateNumberOfMessages` + `NotVisible` = 0) before the next dependency step. Tier 0 (users, providers, insured, tpa, plans) runs as a `Parallel`.
121
+ - **Every resource gets a retry pass** (`fromStart: true, skipMigrated: true`) after the first pass + drain, recovering records dropped by transient service failures.
122
+ - **Verification** invokes the verifier Lambda, which writes `runs/<execution-name>/summary.json` (migrated counts, source counts, API totals) to the artifacts bucket.
123
+
124
+ **Prerequisites**: deploy the shared stacks (the migration stack alone with `cdk --profile glicogh-uat --context env=uat --context service=migration deploy`); upload the legacy dump to the artifacts bucket (`glicogh-healthcare-migration-<env>-<account>`):
96
125
 
97
126
  ```
98
- cdk --profile glicogh-uat --context env=uat deploy MicroserviceNetwork
127
+ aws s3 sync data/legacy-backup s3://glicogh-healthcare-migration-uat-825765383017/backups/<runId>/
99
128
  ```
100
129
 
130
+ **Start an execution** (all input fields are required; `fromStep` uses the step ids below, `""` = full run):
131
+
132
+ ```json
133
+ {
134
+ "backupS3Uri": "s3://glicogh-healthcare-migration-uat-825765383017/backups/<runId>/",
135
+ "fresh": false,
136
+ "skipPhotos": false,
137
+ "fromStep": ""
138
+ }
139
+ ```
140
+
141
+ ```
142
+ aws stepfunctions start-execution \
143
+ --state-machine-arn <state-machine-arn> \
144
+ --name <runId> \
145
+ --input file://input.json
146
+ ```
147
+
148
+ Step ids for `fromStep`: `fresh-reset`, `restore`, `migrations`, `diseases`, `claim-batches`, `product-sources`, `product-categories`, `products`, `categories`, `coverage-groups`, `tier0`, `product-pricing`, `policies`, `benefits`, `plans-rewire`, `beneficiaries-principals`, `beneficiaries-dependants`, `beneficiary-photos`, `claims`.
149
+
150
+ **Pause/resume**: every step is idempotent and cursor-backed — stop the execution and re-invoke later (optionally with `fromStep`). Completed resources no-op on the first producer invocation (`endReached` immediately). Guards fail the execution instead of looping forever: 2,000 producer invocations per pass, 600 drain checks (5-minute interval). Execution timeout 7 days.
151
+
152
+ **Monitoring**: Step Functions execution history; state-machine logs at `/aws/vendedlogs/states/migration-orchestrator`; ECS task logs under `/aws/ecs/migration-scripts`; the verifier summary in S3.
153
+
154
+ **Notes**: the consumer's reserved concurrency is set to `max(50, MIGRATION_QUEUE_SHARDS)` so claims FIFO shards run in parallel. `fresh: true` truncates `migrated`/`disease_lookup`/`claim_batches` and clears the `glico_healthcare_migration:*` Redis cursors before restoring; the restore task re-imports all tables per run (container-local tracking). Secure envs (`DB_PASSWORD`, `MIGRATION_API_KEY`) are injected into the ECS task from SSM.
155
+
101
156
  ### Pipeline-based stack
102
157
 
103
158
  The following stack on the other hand, are meant to deploy a new set of resources on each CDK deployment. These can also be thought of as the stack that have a GIT repository.
@@ -16,7 +16,7 @@ export type BuildConfig = {
16
16
  };
17
17
  };
18
18
  export type Microservice = 'account' | 'plan' | 'policy' | 'claims' | 'notification' | 'reporting';
19
- export type OtherCDKService = 'network' | 'api-gateway' | 'redis' | 'mysql' | 'clickhouse' | 'portal' | 'migration';
19
+ export type OtherCDKService = 'network' | 'infra-auth' | 'api-gateway' | 'redis' | 'mysql' | 'clickhouse' | 'portal' | 'migration';
20
20
  export declare const MicroserviceEnum: Record<Microservice, Microservice>;
21
21
  export declare const MicroserviceList: Microservice[];
22
22
  export declare const LaravelBasedServiceList: ("account" | "plan" | "policy" | "claims" | "reporting")[];
@@ -13,6 +13,7 @@ exports.MicroserviceList = Object.values(exports.MicroserviceEnum);
13
13
  exports.LaravelBasedServiceList = exports.MicroserviceList.filter((i) => i !== 'notification');
14
14
  exports.OtherCDKServiceEnum = {
15
15
  network: 'network',
16
+ 'infra-auth': 'infra-auth',
16
17
  'api-gateway': 'api-gateway',
17
18
  redis: 'redis',
18
19
  mysql: 'mysql',
@@ -21,4 +22,4 @@ exports.OtherCDKServiceEnum = {
21
22
  migration: 'migration',
22
23
  };
23
24
  exports.OtherCDKServiceList = Object.values(exports.OtherCDKServiceEnum);
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vQHR5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxQmEsUUFBQSxnQkFBZ0IsR0FBdUM7SUFDbEUsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixZQUFZLEVBQUUsY0FBYztJQUM1QixTQUFTLEVBQUUsV0FBVztJQUN0QixNQUFNLEVBQUUsUUFBUTtDQUNqQixDQUFDO0FBRVcsUUFBQSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLHdCQUFnQixDQUFDLENBQUM7QUFFbkQsUUFBQSx1QkFBdUIsR0FBRyx3QkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxjQUFjLENBQUMsQ0FBQztBQUUvRSxRQUFBLG1CQUFtQixHQUE2QztJQUMzRSxPQUFPLEVBQUUsU0FBUztJQUNsQixhQUFhLEVBQUUsYUFBYTtJQUM1QixLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxPQUFPO0lBQ2QsVUFBVSxFQUFFLFlBQVk7SUFDeEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsU0FBUyxFQUFFLFdBQVc7Q0FDdkIsQ0FBQztBQUVXLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQywyQkFBbUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRW52TmFtZSA9ICd1YXQnIHwgJ3Byb2QnO1xuZXhwb3J0IHR5cGUgUmVwb0JyYW5jaCA9ICdtYXN0ZXInIHwgJ3JlbGVhc2UnO1xuZXhwb3J0IHR5cGUgQnVpbGRDb25maWcgPSB7XG4gIGFwcE5hbWU6IHN0cmluZztcbiAgYXBwVmVyc2lvbjogc3RyaW5nO1xuICBidWlsZElkOiBzdHJpbmc7XG4gIGZvcm1hdHRlZEJ1aWxkSWQ6IHN0cmluZztcbiAgZW52TmFtZTogRW52TmFtZTtcbiAgZW52UGF0aDogc3RyaW5nO1xuICBzZXJ2aWNlTmFtZTogTWljcm9zZXJ2aWNlIHwgT3RoZXJDREtTZXJ2aWNlO1xuICBicmFuY2g/OiBzdHJpbmc7XG4gIGNvbXBhbnlOYW1lOiBzdHJpbmc7XG4gIGF3czoge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgfTtcbn07XG5leHBvcnQgdHlwZSBNaWNyb3NlcnZpY2UgPSAnYWNjb3VudCcgfCAncGxhbicgfCAncG9saWN5JyB8ICdjbGFpbXMnIHwgJ25vdGlmaWNhdGlvbicgfCAncmVwb3J0aW5nJztcblxuZXhwb3J0IHR5cGUgT3RoZXJDREtTZXJ2aWNlID0gJ25ldHdvcmsnIHwgJ2FwaS1nYXRld2F5JyB8ICdyZWRpcycgfCAnbXlzcWwnIHwgJ2NsaWNraG91c2UnIHwgJ3BvcnRhbCcgfCAnbWlncmF0aW9uJztcblxuZXhwb3J0IGNvbnN0IE1pY3Jvc2VydmljZUVudW06IFJlY29yZDxNaWNyb3NlcnZpY2UsIE1pY3Jvc2VydmljZT4gPSB7XG4gIGFjY291bnQ6ICdhY2NvdW50JyxcbiAgcGxhbjogJ3BsYW4nLFxuICBwb2xpY3k6ICdwb2xpY3knLFxuICBub3RpZmljYXRpb246ICdub3RpZmljYXRpb24nLFxuICByZXBvcnRpbmc6ICdyZXBvcnRpbmcnLFxuICBjbGFpbXM6ICdjbGFpbXMnLFxufTtcblxuZXhwb3J0IGNvbnN0IE1pY3Jvc2VydmljZUxpc3QgPSBPYmplY3QudmFsdWVzKE1pY3Jvc2VydmljZUVudW0pO1xuXG5leHBvcnQgY29uc3QgTGFyYXZlbEJhc2VkU2VydmljZUxpc3QgPSBNaWNyb3NlcnZpY2VMaXN0LmZpbHRlcigoaSkgPT4gaSAhPT0gJ25vdGlmaWNhdGlvbicpO1xuXG5leHBvcnQgY29uc3QgT3RoZXJDREtTZXJ2aWNlRW51bTogUmVjb3JkPE90aGVyQ0RLU2VydmljZSwgT3RoZXJDREtTZXJ2aWNlPiA9IHtcbiAgbmV0d29yazogJ25ldHdvcmsnLFxuICAnYXBpLWdhdGV3YXknOiAnYXBpLWdhdGV3YXknLFxuICByZWRpczogJ3JlZGlzJyxcbiAgbXlzcWw6ICdteXNxbCcsXG4gIGNsaWNraG91c2U6ICdjbGlja2hvdXNlJyxcbiAgcG9ydGFsOiAncG9ydGFsJyxcbiAgbWlncmF0aW9uOiAnbWlncmF0aW9uJyxcbn07XG5cbmV4cG9ydCBjb25zdCBPdGhlckNES1NlcnZpY2VMaXN0ID0gT2JqZWN0LnZhbHVlcyhPdGhlckNES1NlcnZpY2VFbnVtKTtcblxuZXhwb3J0IHR5cGUgUmVwb1VybHMgPSB7IFtrZXkgaW4gQnVpbGRDb25maWdbJ3NlcnZpY2VOYW1lJ11dPzogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBSZXBvQnJhbmNoZXMgPSB7IFtrZXkgaW4gRW52TmFtZV06IFJlcG9CcmFuY2ggfTtcbiJdfQ==
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vQHR5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxQmEsUUFBQSxnQkFBZ0IsR0FBdUM7SUFDbEUsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixZQUFZLEVBQUUsY0FBYztJQUM1QixTQUFTLEVBQUUsV0FBVztJQUN0QixNQUFNLEVBQUUsUUFBUTtDQUNqQixDQUFDO0FBRVcsUUFBQSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLHdCQUFnQixDQUFDLENBQUM7QUFFbkQsUUFBQSx1QkFBdUIsR0FBRyx3QkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxjQUFjLENBQUMsQ0FBQztBQUUvRSxRQUFBLG1CQUFtQixHQUE2QztJQUMzRSxPQUFPLEVBQUUsU0FBUztJQUNsQixZQUFZLEVBQUUsWUFBWTtJQUMxQixhQUFhLEVBQUUsYUFBYTtJQUM1QixLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxPQUFPO0lBQ2QsVUFBVSxFQUFFLFlBQVk7SUFDeEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsU0FBUyxFQUFFLFdBQVc7Q0FDdkIsQ0FBQztBQUVXLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQywyQkFBbUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRW52TmFtZSA9ICd1YXQnIHwgJ3Byb2QnO1xuZXhwb3J0IHR5cGUgUmVwb0JyYW5jaCA9ICdtYXN0ZXInIHwgJ3JlbGVhc2UnO1xuZXhwb3J0IHR5cGUgQnVpbGRDb25maWcgPSB7XG4gIGFwcE5hbWU6IHN0cmluZztcbiAgYXBwVmVyc2lvbjogc3RyaW5nO1xuICBidWlsZElkOiBzdHJpbmc7XG4gIGZvcm1hdHRlZEJ1aWxkSWQ6IHN0cmluZztcbiAgZW52TmFtZTogRW52TmFtZTtcbiAgZW52UGF0aDogc3RyaW5nO1xuICBzZXJ2aWNlTmFtZTogTWljcm9zZXJ2aWNlIHwgT3RoZXJDREtTZXJ2aWNlO1xuICBicmFuY2g/OiBzdHJpbmc7XG4gIGNvbXBhbnlOYW1lOiBzdHJpbmc7XG4gIGF3czoge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgfTtcbn07XG5leHBvcnQgdHlwZSBNaWNyb3NlcnZpY2UgPSAnYWNjb3VudCcgfCAncGxhbicgfCAncG9saWN5JyB8ICdjbGFpbXMnIHwgJ25vdGlmaWNhdGlvbicgfCAncmVwb3J0aW5nJztcblxuZXhwb3J0IHR5cGUgT3RoZXJDREtTZXJ2aWNlID0gJ25ldHdvcmsnIHwgJ2luZnJhLWF1dGgnIHwgJ2FwaS1nYXRld2F5JyB8ICdyZWRpcycgfCAnbXlzcWwnIHwgJ2NsaWNraG91c2UnIHwgJ3BvcnRhbCcgfCAnbWlncmF0aW9uJztcblxuZXhwb3J0IGNvbnN0IE1pY3Jvc2VydmljZUVudW06IFJlY29yZDxNaWNyb3NlcnZpY2UsIE1pY3Jvc2VydmljZT4gPSB7XG4gIGFjY291bnQ6ICdhY2NvdW50JyxcbiAgcGxhbjogJ3BsYW4nLFxuICBwb2xpY3k6ICdwb2xpY3knLFxuICBub3RpZmljYXRpb246ICdub3RpZmljYXRpb24nLFxuICByZXBvcnRpbmc6ICdyZXBvcnRpbmcnLFxuICBjbGFpbXM6ICdjbGFpbXMnLFxufTtcblxuZXhwb3J0IGNvbnN0IE1pY3Jvc2VydmljZUxpc3QgPSBPYmplY3QudmFsdWVzKE1pY3Jvc2VydmljZUVudW0pO1xuXG5leHBvcnQgY29uc3QgTGFyYXZlbEJhc2VkU2VydmljZUxpc3QgPSBNaWNyb3NlcnZpY2VMaXN0LmZpbHRlcigoaSkgPT4gaSAhPT0gJ25vdGlmaWNhdGlvbicpO1xuXG5leHBvcnQgY29uc3QgT3RoZXJDREtTZXJ2aWNlRW51bTogUmVjb3JkPE90aGVyQ0RLU2VydmljZSwgT3RoZXJDREtTZXJ2aWNlPiA9IHtcbiAgbmV0d29yazogJ25ldHdvcmsnLFxuICAnaW5mcmEtYXV0aCc6ICdpbmZyYS1hdXRoJyxcbiAgJ2FwaS1nYXRld2F5JzogJ2FwaS1nYXRld2F5JyxcbiAgcmVkaXM6ICdyZWRpcycsXG4gIG15c3FsOiAnbXlzcWwnLFxuICBjbGlja2hvdXNlOiAnY2xpY2tob3VzZScsXG4gIHBvcnRhbDogJ3BvcnRhbCcsXG4gIG1pZ3JhdGlvbjogJ21pZ3JhdGlvbicsXG59O1xuXG5leHBvcnQgY29uc3QgT3RoZXJDREtTZXJ2aWNlTGlzdCA9IE9iamVjdC52YWx1ZXMoT3RoZXJDREtTZXJ2aWNlRW51bSk7XG5cbmV4cG9ydCB0eXBlIFJlcG9VcmxzID0geyBba2V5IGluIEJ1aWxkQ29uZmlnWydzZXJ2aWNlTmFtZSddXT86IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgUmVwb0JyYW5jaGVzID0geyBba2V5IGluIEVudk5hbWVdOiBSZXBvQnJhbmNoIH07XG4iXX0=
@@ -0,0 +1,19 @@
1
+ import * as ec2 from 'aws-cdk-lib/aws-ec2';
2
+ import * as ecs from 'aws-cdk-lib/aws-ecs';
3
+ import * as s3 from 'aws-cdk-lib/aws-s3';
4
+ import { Construct } from 'constructs';
5
+ export interface MigrationScriptsRunnerProps {
6
+ vpc: ec2.IVpc;
7
+ artifactsBucket: s3.IBucket;
8
+ backupPrefix?: string;
9
+ cpu?: number;
10
+ memoryLimitMiB?: number;
11
+ ephemeralStorageGiB?: number;
12
+ }
13
+ export declare class MigrationScriptsRunner extends Construct {
14
+ readonly cluster: ecs.Cluster;
15
+ readonly securityGroup: ec2.SecurityGroup;
16
+ readonly taskDefinition: ecs.FargateTaskDefinition;
17
+ readonly container: ecs.ContainerDefinition;
18
+ constructor(scope: Construct, id: string, props: MigrationScriptsRunnerProps);
19
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MigrationScriptsRunner = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const ec2 = require("aws-cdk-lib/aws-ec2");
6
+ const ecs = require("aws-cdk-lib/aws-ecs");
7
+ const logs = require("aws-cdk-lib/aws-logs");
8
+ const path = require("path");
9
+ const constructs_1 = require("constructs");
10
+ const migration_1 = require("../util/migration");
11
+ // One-shot Fargate tasks that run the migration scripts (restore, migrations,
12
+ // precompute-diseases, precompute-claim-batches, reset) unchanged. The state
13
+ // machine overrides the container command per step.
14
+ class MigrationScriptsRunner extends constructs_1.Construct {
15
+ constructor(scope, id, props) {
16
+ super(scope, id);
17
+ this.cluster = new ecs.Cluster(this, 'Cluster', {
18
+ vpc: props.vpc,
19
+ clusterName: 'migration-scripts',
20
+ });
21
+ this.securityGroup = new ec2.SecurityGroup(this, 'SecurityGroup', {
22
+ vpc: props.vpc,
23
+ securityGroupName: 'Migration-Scripts-SG',
24
+ description: 'Migration scripts ECS tasks',
25
+ allowAllOutbound: true,
26
+ });
27
+ this.taskDefinition = new ecs.FargateTaskDefinition(this, 'TaskDefinition', {
28
+ family: 'migration-scripts',
29
+ cpu: props.cpu ?? 4096,
30
+ memoryLimitMiB: props.memoryLimitMiB ?? 8192,
31
+ ephemeralStorageGiB: props.ephemeralStorageGiB ?? 21,
32
+ runtimePlatform: {
33
+ cpuArchitecture: ecs.CpuArchitecture.X86_64,
34
+ operatingSystemFamily: ecs.OperatingSystemFamily.LINUX,
35
+ },
36
+ });
37
+ const { environment, secrets } = (0, migration_1.getEcsEnvs)(cdk.Stack.of(this));
38
+ this.container = this.taskDefinition.addContainer('scripts', {
39
+ containerName: 'scripts',
40
+ image: ecs.ContainerImage.fromAsset(path.resolve('../../migration'), { file: 'Dockerfile' }),
41
+ environment,
42
+ secrets,
43
+ logging: ecs.LogDrivers.awsLogs({
44
+ streamPrefix: 'migration-scripts',
45
+ logRetention: logs.RetentionDays.ONE_MONTH,
46
+ }),
47
+ });
48
+ props.artifactsBucket.grantRead(this.taskDefinition.taskRole, `${props.backupPrefix ?? 'backups'}/*`);
49
+ }
50
+ }
51
+ exports.MigrationScriptsRunner = MigrationScriptsRunner;
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLXNjcmlwdHMtcnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY29uc3RydWN0cy9taWdyYXRpb24tc2NyaXB0cy1ydW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBQ25DLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MsNkNBQTZDO0FBRTdDLDZCQUE2QjtBQUM3QiwyQ0FBdUM7QUFDdkMsaURBQStDO0FBVy9DLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0Usb0RBQW9EO0FBQ3BELE1BQWEsc0JBQXVCLFNBQVEsc0JBQVM7SUFNbkQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFrQztRQUMxRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDOUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsV0FBVyxFQUFFLG1CQUFtQjtTQUNqQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ2hFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLGlCQUFpQixFQUFFLHNCQUFzQjtZQUN6QyxXQUFXLEVBQUUsNkJBQTZCO1lBQzFDLGdCQUFnQixFQUFFLElBQUk7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDMUUsTUFBTSxFQUFFLG1CQUFtQjtZQUMzQixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJO1lBQ3RCLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUk7WUFDNUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixJQUFJLEVBQUU7WUFDcEQsZUFBZSxFQUFFO2dCQUNmLGVBQWUsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU07Z0JBQzNDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLO2FBQ3ZEO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFBLHNCQUFVLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVoRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRTtZQUMzRCxhQUFhLEVBQUUsU0FBUztZQUN4QixLQUFLLEVBQUUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO1lBQzVGLFdBQVc7WUFDWCxPQUFPO1lBQ1AsT0FBTyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2dCQUM5QixZQUFZLEVBQUUsbUJBQW1CO2dCQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTO2FBQzNDLENBQUM7U0FDSCxDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQztJQUN4RyxDQUFDO0NBQ0Y7QUEvQ0Qsd0RBK0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGVjcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGdldEVjc0VudnMgfSBmcm9tICcuLi91dGlsL21pZ3JhdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0aW9uU2NyaXB0c1J1bm5lclByb3BzIHtcbiAgdnBjOiBlYzIuSVZwYztcbiAgYXJ0aWZhY3RzQnVja2V0OiBzMy5JQnVja2V0O1xuICBiYWNrdXBQcmVmaXg/OiBzdHJpbmc7XG4gIGNwdT86IG51bWJlcjtcbiAgbWVtb3J5TGltaXRNaUI/OiBudW1iZXI7XG4gIGVwaGVtZXJhbFN0b3JhZ2VHaUI/OiBudW1iZXI7XG59XG5cbi8vIE9uZS1zaG90IEZhcmdhdGUgdGFza3MgdGhhdCBydW4gdGhlIG1pZ3JhdGlvbiBzY3JpcHRzIChyZXN0b3JlLCBtaWdyYXRpb25zLFxuLy8gcHJlY29tcHV0ZS1kaXNlYXNlcywgcHJlY29tcHV0ZS1jbGFpbS1iYXRjaGVzLCByZXNldCkgdW5jaGFuZ2VkLiBUaGUgc3RhdGVcbi8vIG1hY2hpbmUgb3ZlcnJpZGVzIHRoZSBjb250YWluZXIgY29tbWFuZCBwZXIgc3RlcC5cbmV4cG9ydCBjbGFzcyBNaWdyYXRpb25TY3JpcHRzUnVubmVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGNsdXN0ZXI6IGVjcy5DbHVzdGVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjdXJpdHlHcm91cDogZWMyLlNlY3VyaXR5R3JvdXA7XG4gIHB1YmxpYyByZWFkb25seSB0YXNrRGVmaW5pdGlvbjogZWNzLkZhcmdhdGVUYXNrRGVmaW5pdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lcjogZWNzLkNvbnRhaW5lckRlZmluaXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE1pZ3JhdGlvblNjcmlwdHNSdW5uZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmNsdXN0ZXIgPSBuZXcgZWNzLkNsdXN0ZXIodGhpcywgJ0NsdXN0ZXInLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGNsdXN0ZXJOYW1lOiAnbWlncmF0aW9uLXNjcmlwdHMnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsICdTZWN1cml0eUdyb3VwJywge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogJ01pZ3JhdGlvbi1TY3JpcHRzLVNHJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTWlncmF0aW9uIHNjcmlwdHMgRUNTIHRhc2tzJyxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhc2tEZWZpbml0aW9uID0gbmV3IGVjcy5GYXJnYXRlVGFza0RlZmluaXRpb24odGhpcywgJ1Rhc2tEZWZpbml0aW9uJywge1xuICAgICAgZmFtaWx5OiAnbWlncmF0aW9uLXNjcmlwdHMnLFxuICAgICAgY3B1OiBwcm9wcy5jcHUgPz8gNDA5NixcbiAgICAgIG1lbW9yeUxpbWl0TWlCOiBwcm9wcy5tZW1vcnlMaW1pdE1pQiA/PyA4MTkyLFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZUdpQjogcHJvcHMuZXBoZW1lcmFsU3RvcmFnZUdpQiA/PyAyMSxcbiAgICAgIHJ1bnRpbWVQbGF0Zm9ybToge1xuICAgICAgICBjcHVBcmNoaXRlY3R1cmU6IGVjcy5DcHVBcmNoaXRlY3R1cmUuWDg2XzY0LFxuICAgICAgICBvcGVyYXRpbmdTeXN0ZW1GYW1pbHk6IGVjcy5PcGVyYXRpbmdTeXN0ZW1GYW1pbHkuTElOVVgsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBlbnZpcm9ubWVudCwgc2VjcmV0cyB9ID0gZ2V0RWNzRW52cyhjZGsuU3RhY2sub2YodGhpcykpO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnRhc2tEZWZpbml0aW9uLmFkZENvbnRhaW5lcignc2NyaXB0cycsIHtcbiAgICAgIGNvbnRhaW5lck5hbWU6ICdzY3JpcHRzJyxcbiAgICAgIGltYWdlOiBlY3MuQ29udGFpbmVySW1hZ2UuZnJvbUFzc2V0KHBhdGgucmVzb2x2ZSgnLi4vLi4vbWlncmF0aW9uJyksIHsgZmlsZTogJ0RvY2tlcmZpbGUnIH0pLFxuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBzZWNyZXRzLFxuICAgICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlcnMuYXdzTG9ncyh7XG4gICAgICAgIHN0cmVhbVByZWZpeDogJ21pZ3JhdGlvbi1zY3JpcHRzJyxcbiAgICAgICAgbG9nUmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBwcm9wcy5hcnRpZmFjdHNCdWNrZXQuZ3JhbnRSZWFkKHRoaXMudGFza0RlZmluaXRpb24udGFza1JvbGUsIGAke3Byb3BzLmJhY2t1cFByZWZpeCA/PyAnYmFja3Vwcyd9LypgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,40 @@
1
+ import * as ec2 from 'aws-cdk-lib/aws-ec2';
2
+ import * as ecs from 'aws-cdk-lib/aws-ecs';
3
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
4
+ import * as s3 from 'aws-cdk-lib/aws-s3';
5
+ import * as sqs from 'aws-cdk-lib/aws-sqs';
6
+ import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
7
+ import { Construct } from 'constructs';
8
+ export interface MigrationStateMachineProps {
9
+ producer: lambda.IFunction;
10
+ verifier: lambda.IFunction;
11
+ queue: sqs.IQueue;
12
+ cluster: ecs.ICluster;
13
+ taskDefinition: ecs.TaskDefinition;
14
+ container: ecs.ContainerDefinition;
15
+ securityGroup: ec2.ISecurityGroup;
16
+ artifactsBucket: s3.IBucket;
17
+ maxInvocations?: number;
18
+ drainMaxChecks?: number;
19
+ loopWaitSeconds?: number;
20
+ drainWaitSeconds?: number;
21
+ }
22
+ export declare class MigrationStateMachine extends Construct {
23
+ readonly stateMachine: sfn.StateMachine;
24
+ private readonly producer;
25
+ private readonly verifier;
26
+ private readonly queue;
27
+ private readonly cluster;
28
+ private readonly taskDefinition;
29
+ private readonly container;
30
+ private readonly securityGroup;
31
+ private readonly artifactsBucket;
32
+ private readonly maxInvocations;
33
+ private readonly drainMaxChecks;
34
+ private readonly loopWaitSeconds;
35
+ private readonly drainWaitSeconds;
36
+ constructor(scope: Construct, id: string, props: MigrationStateMachineProps);
37
+ private producerPass;
38
+ private resourceStep;
39
+ private ecsStep;
40
+ }
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MigrationStateMachine = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const ec2 = require("aws-cdk-lib/aws-ec2");
6
+ const ecs = require("aws-cdk-lib/aws-ecs");
7
+ const logs = require("aws-cdk-lib/aws-logs");
8
+ const sfn = require("aws-cdk-lib/aws-stepfunctions");
9
+ const tasks = require("aws-cdk-lib/aws-stepfunctions-tasks");
10
+ const constructs_1 = require("constructs");
11
+ // Runs the runbook end-to-end: scripts as one-shot Fargate tasks, SQS
12
+ // migratables as producer loops (until endReached) followed by a queue drain
13
+ // and a skipMigrated retry pass, then the verifier summary.
14
+ class MigrationStateMachine extends constructs_1.Construct {
15
+ constructor(scope, id, props) {
16
+ super(scope, id);
17
+ this.producer = props.producer;
18
+ this.verifier = props.verifier;
19
+ this.queue = props.queue;
20
+ this.cluster = props.cluster;
21
+ this.taskDefinition = props.taskDefinition;
22
+ this.container = props.container;
23
+ this.securityGroup = props.securityGroup;
24
+ this.artifactsBucket = props.artifactsBucket;
25
+ this.maxInvocations = props.maxInvocations ?? 2000;
26
+ this.drainMaxChecks = props.drainMaxChecks ?? 600;
27
+ this.loopWaitSeconds = props.loopWaitSeconds ?? 10;
28
+ this.drainWaitSeconds = props.drainWaitSeconds ?? 300;
29
+ const entries = {};
30
+ const verify = new tasks.LambdaInvoke(this, 'Verify', {
31
+ lambdaFunction: this.verifier,
32
+ payload: sfn.TaskInput.fromObject({
33
+ runId: sfn.JsonPath.stringAt('$$.Execution.Name'),
34
+ bucket: this.artifactsBucket.bucketName,
35
+ key: sfn.JsonPath.format('runs/{}/summary.json', sfn.JsonPath.stringAt('$$.Execution.Name')),
36
+ }),
37
+ payloadResponseOnly: true,
38
+ resultPath: '$.verification',
39
+ });
40
+ const complete = new sfn.Succeed(this, 'Complete');
41
+ verify.next(complete);
42
+ let tail = verify;
43
+ entries['claims'] = this.resourceStep('s16-claims', { resource: 'claims' }, tail);
44
+ tail = entries['claims'];
45
+ const photos = this.resourceStep('s15-beneficiary-photos', { resource: 'beneficiary-photos' }, tail);
46
+ entries['beneficiary-photos'] = photos;
47
+ const photosChoice = new sfn.Choice(this, 'SkipPhotos').when(sfn.Condition.booleanEquals('$.skipPhotos', true), tail).otherwise(photos);
48
+ tail = photosChoice;
49
+ entries['beneficiaries-dependants'] = this.resourceStep('s14b-beneficiaries-dependants', { resource: 'beneficiaries', phase: 'dependants' }, tail);
50
+ tail = entries['beneficiaries-dependants'];
51
+ entries['beneficiaries-principals'] = this.resourceStep('s14a-beneficiaries-principals', { resource: 'beneficiaries', phase: 'principals' }, tail);
52
+ tail = entries['beneficiaries-principals'];
53
+ entries['plans-rewire'] = this.resourceStep('s13b-plans-rewire', { resource: 'plans' }, tail);
54
+ tail = entries['plans-rewire'];
55
+ entries['benefits'] = this.resourceStep('s12-benefits', { resource: 'benefits' }, tail);
56
+ tail = entries['benefits'];
57
+ entries['policies'] = this.resourceStep('s11-policies', { resource: 'policies' }, tail);
58
+ tail = entries['policies'];
59
+ entries['product-pricing'] = this.resourceStep('s10-product-pricing', { resource: 'product-pricing' }, tail);
60
+ tail = entries['product-pricing'];
61
+ const tier0 = new sfn.Parallel(this, 's9-tier0', { resultPath: '$.tier0' });
62
+ for (const resource of ['users', 'providers', 'insured', 'tpa', 'plans']) {
63
+ tier0.branch(sfn.Chain.start(this.resourceStep(`s9-${resource}`, { resource })));
64
+ }
65
+ tier0.next(tail);
66
+ entries['tier0'] = tier0;
67
+ tail = tier0;
68
+ entries['coverage-groups'] = this.resourceStep('s8-coverage-groups', { resource: 'coverage-groups' }, tail);
69
+ tail = entries['coverage-groups'];
70
+ entries['categories'] = this.resourceStep('s7-categories', { resource: 'categories' }, tail);
71
+ tail = entries['categories'];
72
+ entries['products'] = this.resourceStep('s6-products', { resource: 'products' }, tail);
73
+ tail = entries['products'];
74
+ entries['product-categories'] = this.resourceStep('s5b-product-categories', { resource: 'product-categories' }, tail);
75
+ tail = entries['product-categories'];
76
+ entries['product-sources'] = this.resourceStep('s5a-product-sources', { resource: 'product-sources' }, tail);
77
+ tail = entries['product-sources'];
78
+ entries['claim-batches'] = this.ecsStep('s4-claim-batches', 'claim-batches', [], cdk.Duration.hours(2), tail);
79
+ tail = entries['claim-batches'];
80
+ entries['diseases'] = this.ecsStep('s3-disease-lookups', 'diseases', [], cdk.Duration.hours(1), tail);
81
+ tail = entries['diseases'];
82
+ entries['migrations'] = this.ecsStep('s2-migrations', 'migrations', [], cdk.Duration.hours(1), tail);
83
+ tail = entries['migrations'];
84
+ const restore = this.ecsStep('s1-restore', 'restore', [{ name: 'BACKUP_S3_URI', value: sfn.JsonPath.stringAt('$.backupS3Uri') }], cdk.Duration.hours(3), tail);
85
+ entries['restore'] = restore;
86
+ tail = restore;
87
+ const reset = this.ecsStep('s0-fresh-reset', 'reset', [], cdk.Duration.minutes(30), restore);
88
+ entries['fresh-reset'] = reset;
89
+ const freshChoice = new sfn.Choice(this, 'FreshReset').when(sfn.Condition.booleanEquals('$.fresh', true), reset).otherwise(restore);
90
+ tail = freshChoice;
91
+ const fromStep = new sfn.Choice(this, 'FromStep');
92
+ for (const [stepId, entry] of Object.entries(entries)) {
93
+ fromStep.when(sfn.Condition.and(sfn.Condition.isPresent('$.fromStep'), sfn.Condition.stringEquals('$.fromStep', stepId)), entry);
94
+ }
95
+ fromStep.otherwise(freshChoice);
96
+ tail = fromStep;
97
+ const logGroup = new logs.LogGroup(this, 'Logs', {
98
+ logGroupName: '/aws/vendedlogs/states/migration-orchestrator',
99
+ retention: logs.RetentionDays.THREE_MONTHS,
100
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
101
+ });
102
+ this.stateMachine = new sfn.StateMachine(this, 'StateMachine', {
103
+ stateMachineName: 'migration-orchestrator',
104
+ definitionBody: sfn.DefinitionBody.fromChainable(tail),
105
+ timeout: cdk.Duration.days(7),
106
+ logs: {
107
+ destination: logGroup,
108
+ level: sfn.LogLevel.ALL,
109
+ includeExecutionData: true,
110
+ },
111
+ });
112
+ this.producer.grantInvoke(this.stateMachine);
113
+ this.verifier.grantInvoke(this.stateMachine);
114
+ this.queue.grant(this.stateMachine, 'sqs:GetQueueAttributes');
115
+ this.taskDefinition.grantRun(this.stateMachine);
116
+ }
117
+ // Producer loop (until endReached, guarded by maxInvocations) -> queue drain
118
+ // (Visible + NotVisible = 0, guarded by drainMaxChecks) -> next.
119
+ producerPass(id, payload, next) {
120
+ const failure = new sfn.Fail(this, `${id}-Failed`, {
121
+ error: 'MigrationStepFailed',
122
+ cause: `Step ${id} exceeded its iteration/drain guard, or an ECS script task failed.`,
123
+ });
124
+ const init = new sfn.Pass(this, `${id}-LoopInit`, {
125
+ parameters: { count: 0 },
126
+ resultPath: '$.loop',
127
+ });
128
+ const invoke = new tasks.LambdaInvoke(this, `${id}-Invoke`, {
129
+ lambdaFunction: this.producer,
130
+ payload: sfn.TaskInput.fromObject(payload),
131
+ payloadResponseOnly: true,
132
+ resultPath: '$.producer',
133
+ taskTimeout: sfn.Timeout.duration(cdk.Duration.minutes(15)),
134
+ });
135
+ invoke.addRetry({
136
+ errors: ['States.TaskFailed', 'Lambda.ServiceException', 'Lambda.AWSLambdaException', 'Lambda.SdkClientException'],
137
+ maxAttempts: 2,
138
+ interval: cdk.Duration.seconds(30),
139
+ backoffRate: 2,
140
+ });
141
+ const endReached = new sfn.Choice(this, `${id}-EndReached`);
142
+ const loopInc = new sfn.Pass(this, `${id}-LoopInc`, {
143
+ parameters: { count: sfn.JsonPath.mathAdd(sfn.JsonPath.numberAt('$.loop.count'), 1) },
144
+ resultPath: '$.loop',
145
+ });
146
+ const loopGuard = new sfn.Choice(this, `${id}-LoopGuard`).when(sfn.Condition.numberGreaterThan('$.loop.count', this.maxInvocations), failure);
147
+ const loopWait = new sfn.Wait(this, `${id}-LoopWait`, {
148
+ time: sfn.WaitTime.duration(cdk.Duration.seconds(this.loopWaitSeconds)),
149
+ });
150
+ const drainInit = new sfn.Pass(this, `${id}-DrainInit`, {
151
+ parameters: { count: 0 },
152
+ resultPath: '$.drain',
153
+ });
154
+ const drainGet = new tasks.CallAwsService(this, `${id}-QueueAttributes`, {
155
+ service: 'sqs',
156
+ action: 'getQueueAttributes',
157
+ parameters: {
158
+ QueueUrl: this.queue.queueUrl,
159
+ AttributeNames: ['ApproximateNumberOfMessages', 'ApproximateNumberOfMessagesNotVisible'],
160
+ },
161
+ iamResources: [this.queue.queueArn],
162
+ resultPath: '$.queue',
163
+ });
164
+ const drained = new sfn.Choice(this, `${id}-Drained`).when(sfn.Condition.and(sfn.Condition.stringEquals('$.queue.Attributes.ApproximateNumberOfMessages', '0'), sfn.Condition.stringEquals('$.queue.Attributes.ApproximateNumberOfMessagesNotVisible', '0')), next);
165
+ const drainInc = new sfn.Pass(this, `${id}-DrainInc`, {
166
+ parameters: { count: sfn.JsonPath.mathAdd(sfn.JsonPath.numberAt('$.drain.count'), 1) },
167
+ resultPath: '$.drain',
168
+ });
169
+ const drainGuard = new sfn.Choice(this, `${id}-DrainGuard`).when(sfn.Condition.numberGreaterThan('$.drain.count', this.drainMaxChecks), failure);
170
+ const drainWait = new sfn.Wait(this, `${id}-DrainWait`, {
171
+ time: sfn.WaitTime.duration(cdk.Duration.seconds(this.drainWaitSeconds)),
172
+ });
173
+ init.next(invoke);
174
+ invoke.next(endReached);
175
+ endReached.when(sfn.Condition.booleanEquals('$.producer.endReached', true), drainInit).otherwise(loopInc);
176
+ loopInc.next(loopGuard);
177
+ loopGuard.otherwise(loopWait);
178
+ loopWait.next(invoke);
179
+ drainInit.next(drainGet);
180
+ drainGet.next(drained);
181
+ drained.otherwise(drainInc);
182
+ drainInc.next(drainGuard);
183
+ drainGuard.otherwise(drainWait);
184
+ drainWait.next(drainGet);
185
+ return init;
186
+ }
187
+ // Main pass, then a skipMigrated retry pass (fromStart) that re-publishes
188
+ // only records without a migrated row.
189
+ resourceStep(id, payload, next) {
190
+ const terminal = next ?? new sfn.Succeed(this, `${id}-Done`);
191
+ const retry = this.producerPass(`${id}-Retry`, { ...payload, fromStart: true, skipMigrated: true }, terminal);
192
+ return this.producerPass(id, payload, retry);
193
+ }
194
+ ecsStep(id, command, environment, timeout, next) {
195
+ const run = new tasks.EcsRunTask(this, id, {
196
+ integrationPattern: sfn.IntegrationPattern.RUN_JOB,
197
+ cluster: this.cluster,
198
+ taskDefinition: this.taskDefinition,
199
+ launchTarget: new tasks.EcsFargateLaunchTarget({ platformVersion: ecs.FargatePlatformVersion.LATEST }),
200
+ containerOverrides: [
201
+ {
202
+ containerDefinition: this.container,
203
+ command: [command],
204
+ environment,
205
+ },
206
+ ],
207
+ subnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS },
208
+ securityGroups: [this.securityGroup],
209
+ assignPublicIp: false,
210
+ taskTimeout: sfn.Timeout.duration(timeout),
211
+ });
212
+ run.addRetry({
213
+ errors: ['States.TaskFailed'],
214
+ maxAttempts: 1,
215
+ interval: cdk.Duration.minutes(1),
216
+ backoffRate: 2,
217
+ });
218
+ run.next(next);
219
+ return run;
220
+ }
221
+ }
222
+ exports.MigrationStateMachine = MigrationStateMachine;
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLXN0YXRlLW1hY2hpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jb25zdHJ1Y3RzL21pZ3JhdGlvbi1zdGF0ZS1tYWNoaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUNuQywyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBRTNDLDZDQUE2QztBQUc3QyxxREFBcUQ7QUFDckQsNkRBQTZEO0FBQzdELDJDQUF1QztBQW1CdkMsc0VBQXNFO0FBQ3RFLDZFQUE2RTtBQUM3RSw0REFBNEQ7QUFDNUQsTUFBYSxxQkFBc0IsU0FBUSxzQkFBUztJQWdCbEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFpQztRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQztRQUNuRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLElBQUksR0FBRyxDQUFDO1FBQ2xELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxHQUFHLENBQUM7UUFFdEQsTUFBTSxPQUFPLEdBQW1DLEVBQUUsQ0FBQztRQUVuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNwRCxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDN0IsT0FBTyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO2dCQUNoQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVU7Z0JBQ3ZDLEdBQUcsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2FBQzdGLENBQUM7WUFDRixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLFVBQVUsRUFBRSxnQkFBZ0I7U0FDN0IsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXRCLElBQUksSUFBSSxHQUFtQixNQUFNLENBQUM7UUFFbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xGLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN2QyxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hJLElBQUksR0FBRyxZQUFZLENBQUM7UUFFcEIsT0FBTyxDQUFDLDBCQUEwQixDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQywrQkFBK0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25KLElBQUksR0FBRyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUUzQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLCtCQUErQixFQUFFLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkosSUFBSSxHQUFHLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBRTNDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlGLElBQUksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFL0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hGLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFM0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hGLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFM0IsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdHLElBQUksR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVsQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLEtBQUssTUFBTSxRQUFRLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN6RSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUViLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1RyxJQUFJLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFbEMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdGLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFN0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFM0IsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RILElBQUksR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUVyQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0csSUFBSSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRWxDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUcsSUFBSSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVoQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RHLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFM0IsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckcsSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU3QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUMxQixZQUFZLEVBQ1osU0FBUyxFQUNULENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEVBQzFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNyQixJQUFJLENBQ0wsQ0FBQztRQUNGLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUVmLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3RixPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQy9CLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEksSUFBSSxHQUFHLFdBQVcsQ0FBQztRQUVuQixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xELEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdEQsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuSSxDQUFDO1FBQ0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBRWhCLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQy9DLFlBQVksRUFBRSwrQ0FBK0M7WUFDN0QsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWTtZQUMxQyxhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPO1NBQ3pDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDN0QsZ0JBQWdCLEVBQUUsd0JBQXdCO1lBQzFDLGNBQWMsRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDdEQsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLEVBQUU7Z0JBQ0osV0FBVyxFQUFFLFFBQVE7Z0JBQ3JCLEtBQUssRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUc7Z0JBQ3ZCLG9CQUFvQixFQUFFLElBQUk7YUFDM0I7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSxpRUFBaUU7SUFDekQsWUFBWSxDQUFDLEVBQVUsRUFBRSxPQUF3QixFQUFFLElBQW9CO1FBQzdFLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRTtZQUNqRCxLQUFLLEVBQUUscUJBQXFCO1lBQzVCLEtBQUssRUFBRSxRQUFRLEVBQUUsb0VBQW9FO1NBQ3RGLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRTtZQUNoRCxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQ3hCLFVBQVUsRUFBRSxRQUFRO1NBQ3JCLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRTtZQUMxRCxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDN0IsT0FBTyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUMxQyxtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLFVBQVUsRUFBRSxZQUFZO1lBQ3hCLFdBQVcsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM1RCxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQ2QsTUFBTSxFQUFFLENBQUMsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsMkJBQTJCLEVBQUUsMkJBQTJCLENBQUM7WUFDbEgsV0FBVyxFQUFFLENBQUM7WUFDZCxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2xDLFdBQVcsRUFBRSxDQUFDO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFNUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFO1lBQ2xELFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNyRixVQUFVLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7UUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlJLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRTtZQUNwRCxJQUFJLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3hFLENBQUMsQ0FBQztRQUVILE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRTtZQUN0RCxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQ3hCLFVBQVUsRUFBRSxTQUFTO1NBQ3RCLENBQUMsQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLGtCQUFrQixFQUFFO1lBQ3ZFLE9BQU8sRUFBRSxLQUFLO1lBQ2QsTUFBTSxFQUFFLG9CQUFvQjtZQUM1QixVQUFVLEVBQUU7Z0JBQ1YsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtnQkFDN0IsY0FBYyxFQUFFLENBQUMsNkJBQTZCLEVBQUUsdUNBQXVDLENBQUM7YUFDekY7WUFDRCxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUNuQyxVQUFVLEVBQUUsU0FBUztTQUN0QixDQUFDLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQ3hELEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUNmLEdBQUcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGdEQUFnRCxFQUFFLEdBQUcsQ0FBQyxFQUNqRixHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQywwREFBMEQsRUFBRSxHQUFHLENBQUMsQ0FDNUYsRUFDRCxJQUFJLENBQ0wsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRTtZQUNwRCxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDdEYsVUFBVSxFQUFFLFNBQVM7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqSixNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUU7WUFDdEQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3pFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hCLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFCLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsdUNBQXVDO0lBQy9CLFlBQVksQ0FBQyxFQUFVLEVBQUUsT0FBd0IsRUFBRSxJQUFxQjtRQUM5RSxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUcsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVPLE9BQU8sQ0FBQyxFQUFVLEVBQUUsT0FBZSxFQUFFLFdBQThDLEVBQUUsT0FBcUIsRUFBRSxJQUFvQjtRQUN0SSxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUN6QyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCLENBQUMsT0FBTztZQUNsRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ25DLFlBQVksRUFBRSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLGVBQWUsRUFBRSxHQUFHLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEcsa0JBQWtCLEVBQUU7Z0JBQ2xCO29CQUNFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTO29CQUNuQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ2xCLFdBQVc7aUJBQ1o7YUFDRjtZQUNELE9BQU8sRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFO1lBQzNELGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDcEMsY0FBYyxFQUFFLEtBQUs7WUFDckIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztTQUMzQyxDQUFDLENBQUM7UUFDSCxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ1gsTUFBTSxFQUFFLENBQUMsbUJBQW1CLENBQUM7WUFDN0IsV0FBVyxFQUFFLENBQUM7WUFDZCxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLFdBQVcsRUFBRSxDQUFDO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBL1FELHNEQStRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBlY3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzcXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNxcyc7XG5pbXBvcnQgKiBhcyBzZm4gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMnO1xuaW1wb3J0ICogYXMgdGFza3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0aW9uU3RhdGVNYWNoaW5lUHJvcHMge1xuICBwcm9kdWNlcjogbGFtYmRhLklGdW5jdGlvbjtcbiAgdmVyaWZpZXI6IGxhbWJkYS5JRnVuY3Rpb247XG4gIHF1ZXVlOiBzcXMuSVF1ZXVlO1xuICBjbHVzdGVyOiBlY3MuSUNsdXN0ZXI7XG4gIHRhc2tEZWZpbml0aW9uOiBlY3MuVGFza0RlZmluaXRpb247XG4gIGNvbnRhaW5lcjogZWNzLkNvbnRhaW5lckRlZmluaXRpb247XG4gIHNlY3VyaXR5R3JvdXA6IGVjMi5JU2VjdXJpdHlHcm91cDtcbiAgYXJ0aWZhY3RzQnVja2V0OiBzMy5JQnVja2V0O1xuICBtYXhJbnZvY2F0aW9ucz86IG51bWJlcjtcbiAgZHJhaW5NYXhDaGVja3M/OiBudW1iZXI7XG4gIGxvb3BXYWl0U2Vjb25kcz86IG51bWJlcjtcbiAgZHJhaW5XYWl0U2Vjb25kcz86IG51bWJlcjtcbn1cblxudHlwZSBQcm9kdWNlclBheWxvYWQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLy8gUnVucyB0aGUgcnVuYm9vayBlbmQtdG8tZW5kOiBzY3JpcHRzIGFzIG9uZS1zaG90IEZhcmdhdGUgdGFza3MsIFNRU1xuLy8gbWlncmF0YWJsZXMgYXMgcHJvZHVjZXIgbG9vcHMgKHVudGlsIGVuZFJlYWNoZWQpIGZvbGxvd2VkIGJ5IGEgcXVldWUgZHJhaW5cbi8vIGFuZCBhIHNraXBNaWdyYXRlZCByZXRyeSBwYXNzLCB0aGVuIHRoZSB2ZXJpZmllciBzdW1tYXJ5LlxuZXhwb3J0IGNsYXNzIE1pZ3JhdGlvblN0YXRlTWFjaGluZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBzdGF0ZU1hY2hpbmU6IHNmbi5TdGF0ZU1hY2hpbmU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9kdWNlcjogbGFtYmRhLklGdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJpZmllcjogbGFtYmRhLklGdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWV1ZTogc3FzLklRdWV1ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBjbHVzdGVyOiBlY3MuSUNsdXN0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFza0RlZmluaXRpb246IGVjcy5UYXNrRGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IGVjcy5Db250YWluZXJEZWZpbml0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXA6IGVjMi5JU2VjdXJpdHlHcm91cDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcnRpZmFjdHNCdWNrZXQ6IHMzLklCdWNrZXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4SW52b2NhdGlvbnM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkcmFpbk1heENoZWNrczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvb3BXYWl0U2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyYWluV2FpdFNlY29uZHM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTWlncmF0aW9uU3RhdGVNYWNoaW5lUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5wcm9kdWNlciA9IHByb3BzLnByb2R1Y2VyO1xuICAgIHRoaXMudmVyaWZpZXIgPSBwcm9wcy52ZXJpZmllcjtcbiAgICB0aGlzLnF1ZXVlID0gcHJvcHMucXVldWU7XG4gICAgdGhpcy5jbHVzdGVyID0gcHJvcHMuY2x1c3RlcjtcbiAgICB0aGlzLnRhc2tEZWZpbml0aW9uID0gcHJvcHMudGFza0RlZmluaXRpb247XG4gICAgdGhpcy5jb250YWluZXIgPSBwcm9wcy5jb250YWluZXI7XG4gICAgdGhpcy5zZWN1cml0eUdyb3VwID0gcHJvcHMuc2VjdXJpdHlHcm91cDtcbiAgICB0aGlzLmFydGlmYWN0c0J1Y2tldCA9IHByb3BzLmFydGlmYWN0c0J1Y2tldDtcbiAgICB0aGlzLm1heEludm9jYXRpb25zID0gcHJvcHMubWF4SW52b2NhdGlvbnMgPz8gMjAwMDtcbiAgICB0aGlzLmRyYWluTWF4Q2hlY2tzID0gcHJvcHMuZHJhaW5NYXhDaGVja3MgPz8gNjAwO1xuICAgIHRoaXMubG9vcFdhaXRTZWNvbmRzID0gcHJvcHMubG9vcFdhaXRTZWNvbmRzID8/IDEwO1xuICAgIHRoaXMuZHJhaW5XYWl0U2Vjb25kcyA9IHByb3BzLmRyYWluV2FpdFNlY29uZHMgPz8gMzAwO1xuXG4gICAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgc2ZuLklDaGFpbmFibGU+ID0ge307XG5cbiAgICBjb25zdCB2ZXJpZnkgPSBuZXcgdGFza3MuTGFtYmRhSW52b2tlKHRoaXMsICdWZXJpZnknLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy52ZXJpZmllcixcbiAgICAgIHBheWxvYWQ6IHNmbi5UYXNrSW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgIHJ1bklkOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQkLkV4ZWN1dGlvbi5OYW1lJyksXG4gICAgICAgIGJ1Y2tldDogdGhpcy5hcnRpZmFjdHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAga2V5OiBzZm4uSnNvblBhdGguZm9ybWF0KCdydW5zL3t9L3N1bW1hcnkuanNvbicsIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJCQuRXhlY3V0aW9uLk5hbWUnKSksXG4gICAgICB9KSxcbiAgICAgIHBheWxvYWRSZXNwb25zZU9ubHk6IHRydWUsXG4gICAgICByZXN1bHRQYXRoOiAnJC52ZXJpZmljYXRpb24nLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbXBsZXRlID0gbmV3IHNmbi5TdWNjZWVkKHRoaXMsICdDb21wbGV0ZScpO1xuICAgIHZlcmlmeS5uZXh0KGNvbXBsZXRlKTtcblxuICAgIGxldCB0YWlsOiBzZm4uSUNoYWluYWJsZSA9IHZlcmlmeTtcblxuICAgIGVudHJpZXNbJ2NsYWltcyddID0gdGhpcy5yZXNvdXJjZVN0ZXAoJ3MxNi1jbGFpbXMnLCB7IHJlc291cmNlOiAnY2xhaW1zJyB9LCB0YWlsKTtcbiAgICB0YWlsID0gZW50cmllc1snY2xhaW1zJ107XG5cbiAgICBjb25zdCBwaG90b3MgPSB0aGlzLnJlc291cmNlU3RlcCgnczE1LWJlbmVmaWNpYXJ5LXBob3RvcycsIHsgcmVzb3VyY2U6ICdiZW5lZmljaWFyeS1waG90b3MnIH0sIHRhaWwpO1xuICAgIGVudHJpZXNbJ2JlbmVmaWNpYXJ5LXBob3RvcyddID0gcGhvdG9zO1xuICAgIGNvbnN0IHBob3Rvc0Nob2ljZSA9IG5ldyBzZm4uQ2hvaWNlKHRoaXMsICdTa2lwUGhvdG9zJykud2hlbihzZm4uQ29uZGl0aW9uLmJvb2xlYW5FcXVhbHMoJyQuc2tpcFBob3RvcycsIHRydWUpLCB0YWlsKS5vdGhlcndpc2UocGhvdG9zKTtcbiAgICB0YWlsID0gcGhvdG9zQ2hvaWNlO1xuXG4gICAgZW50cmllc1snYmVuZWZpY2lhcmllcy1kZXBlbmRhbnRzJ10gPSB0aGlzLnJlc291cmNlU3RlcCgnczE0Yi1iZW5lZmljaWFyaWVzLWRlcGVuZGFudHMnLCB7IHJlc291cmNlOiAnYmVuZWZpY2lhcmllcycsIHBoYXNlOiAnZGVwZW5kYW50cycgfSwgdGFpbCk7XG4gICAgdGFpbCA9IGVudHJpZXNbJ2JlbmVmaWNpYXJpZXMtZGVwZW5kYW50cyddO1xuXG4gICAgZW50cmllc1snYmVuZWZpY2lhcmllcy1wcmluY2lwYWxzJ10gPSB0aGlzLnJlc291cmNlU3RlcCgnczE0YS1iZW5lZmljaWFyaWVzLXByaW5jaXBhbHMnLCB7IHJlc291cmNlOiAnYmVuZWZpY2lhcmllcycsIHBoYXNlOiAncHJpbmNpcGFscycgfSwgdGFpbCk7XG4gICAgdGFpbCA9IGVudHJpZXNbJ2JlbmVmaWNpYXJpZXMtcHJpbmNpcGFscyddO1xuXG4gICAgZW50cmllc1sncGxhbnMtcmV3aXJlJ10gPSB0aGlzLnJlc291cmNlU3RlcCgnczEzYi1wbGFucy1yZXdpcmUnLCB7IHJlc291cmNlOiAncGxhbnMnIH0sIHRhaWwpO1xuICAgIHRhaWwgPSBlbnRyaWVzWydwbGFucy1yZXdpcmUnXTtcblxuICAgIGVudHJpZXNbJ2JlbmVmaXRzJ10gPSB0aGlzLnJlc291cmNlU3RlcCgnczEyLWJlbmVmaXRzJywgeyByZXNvdXJjZTogJ2JlbmVmaXRzJyB9LCB0YWlsKTtcbiAgICB0YWlsID0gZW50cmllc1snYmVuZWZpdHMnXTtcblxuICAgIGVudHJpZXNbJ3BvbGljaWVzJ10gPSB0aGlzLnJlc291cmNlU3RlcCgnczExLXBvbGljaWVzJywgeyByZXNvdXJjZTogJ3BvbGljaWVzJyB9LCB0YWlsKTtcbiAgICB0YWlsID0gZW50cmllc1sncG9saWNpZXMnXTtcblxuICAgIGVudHJpZXNbJ3Byb2R1Y3QtcHJpY2luZyddID0gdGhpcy5yZXNvdXJjZVN0ZXAoJ3MxMC1wcm9kdWN0LXByaWNpbmcnLCB7IHJlc291cmNlOiAncHJvZHVjdC1wcmljaW5nJyB9LCB0YWlsKTtcbiAgICB0YWlsID0gZW50cmllc1sncHJvZHVjdC1wcmljaW5nJ107XG5cbiAgICBjb25zdCB0aWVyMCA9IG5ldyBzZm4uUGFyYWxsZWwodGhpcywgJ3M5LXRpZXIwJywgeyByZXN1bHRQYXRoOiAnJC50aWVyMCcgfSk7XG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBbJ3VzZXJzJywgJ3Byb3ZpZGVycycsICdpbnN1cmVkJywgJ3RwYScsICdwbGFucyddKSB7XG4gICAgICB0aWVyMC5icmFuY2goc2ZuLkNoYWluLnN0YXJ0KHRoaXMucmVzb3VyY2VTdGVwKGBzOS0ke3Jlc291cmNlfWAsIHsgcmVzb3VyY2UgfSkpKTtcbiAgICB9XG4gICAgdGllcjAubmV4dCh0YWlsKTtcbiAgICBlbnRyaWVzWyd0aWVyMCddID0gdGllcjA7XG4gICAgdGFpbCA9IHRpZXIwO1xuXG4gICAgZW50cmllc1snY292ZXJhZ2UtZ3JvdXBzJ10gPSB0aGlzLnJlc291cmNlU3RlcCgnczgtY292ZXJhZ2UtZ3JvdXBzJywgeyByZXNvdXJjZTogJ2NvdmVyYWdlLWdyb3VwcycgfSwgdGFpbCk7XG4gICAgdGFpbCA9IGVudHJpZXNbJ2NvdmVyYWdlLWdyb3VwcyddO1xuXG4gICAgZW50cmllc1snY2F0ZWdvcmllcyddID0gdGhpcy5yZXNvdXJjZVN0ZXAoJ3M3LWNhdGVnb3JpZXMnLCB7IHJlc291cmNlOiAnY2F0ZWdvcmllcycgfSwgdGFpbCk7XG4gICAgdGFpbCA9IGVudHJpZXNbJ2NhdGVnb3JpZXMnXTtcblxuICAgIGVudHJpZXNbJ3Byb2R1Y3RzJ10gPSB0aGlzLnJlc291cmNlU3RlcCgnczYtcHJvZHVjdHMnLCB7IHJlc291cmNlOiAncHJvZHVjdHMnIH0sIHRhaWwpO1xuICAgIHRhaWwgPSBlbnRyaWVzWydwcm9kdWN0cyddO1xuXG4gICAgZW50cmllc1sncHJvZHVjdC1jYXRlZ29yaWVzJ10gPSB0aGlzLnJlc291cmNlU3RlcCgnczViLXByb2R1Y3QtY2F0ZWdvcmllcycsIHsgcmVzb3VyY2U6ICdwcm9kdWN0LWNhdGVnb3JpZXMnIH0sIHRhaWwpO1xuICAgIHRhaWwgPSBlbnRyaWVzWydwcm9kdWN0LWNhdGVnb3JpZXMnXTtcblxuICAgIGVudHJpZXNbJ3Byb2R1Y3Qtc291cmNlcyddID0gdGhpcy5yZXNvdXJjZVN0ZXAoJ3M1YS1wcm9kdWN0LXNvdXJjZXMnLCB7IHJlc291cmNlOiAncHJvZHVjdC1zb3VyY2VzJyB9LCB0YWlsKTtcbiAgICB0YWlsID0gZW50cmllc1sncHJvZHVjdC1zb3VyY2VzJ107XG5cbiAgICBlbnRyaWVzWydjbGFpbS1iYXRjaGVzJ10gPSB0aGlzLmVjc1N0ZXAoJ3M0LWNsYWltLWJhdGNoZXMnLCAnY2xhaW0tYmF0Y2hlcycsIFtdLCBjZGsuRHVyYXRpb24uaG91cnMoMiksIHRhaWwpO1xuICAgIHRhaWwgPSBlbnRyaWVzWydjbGFpbS1iYXRjaGVzJ107XG5cbiAgICBlbnRyaWVzWydkaXNlYXNlcyddID0gdGhpcy5lY3NTdGVwKCdzMy1kaXNlYXNlLWxvb2t1cHMnLCAnZGlzZWFzZXMnLCBbXSwgY2RrLkR1cmF0aW9uLmhvdXJzKDEpLCB0YWlsKTtcbiAgICB0YWlsID0gZW50cmllc1snZGlzZWFzZXMnXTtcblxuICAgIGVudHJpZXNbJ21pZ3JhdGlvbnMnXSA9IHRoaXMuZWNzU3RlcCgnczItbWlncmF0aW9ucycsICdtaWdyYXRpb25zJywgW10sIGNkay5EdXJhdGlvbi5ob3VycygxKSwgdGFpbCk7XG4gICAgdGFpbCA9IGVudHJpZXNbJ21pZ3JhdGlvbnMnXTtcblxuICAgIGNvbnN0IHJlc3RvcmUgPSB0aGlzLmVjc1N0ZXAoXG4gICAgICAnczEtcmVzdG9yZScsXG4gICAgICAncmVzdG9yZScsXG4gICAgICBbeyBuYW1lOiAnQkFDS1VQX1MzX1VSSScsIHZhbHVlOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuYmFja3VwUzNVcmknKSB9XSxcbiAgICAgIGNkay5EdXJhdGlvbi5ob3VycygzKSxcbiAgICAgIHRhaWxcbiAgICApO1xuICAgIGVudHJpZXNbJ3Jlc3RvcmUnXSA9IHJlc3RvcmU7XG4gICAgdGFpbCA9IHJlc3RvcmU7XG5cbiAgICBjb25zdCByZXNldCA9IHRoaXMuZWNzU3RlcCgnczAtZnJlc2gtcmVzZXQnLCAncmVzZXQnLCBbXSwgY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLCByZXN0b3JlKTtcbiAgICBlbnRyaWVzWydmcmVzaC1yZXNldCddID0gcmVzZXQ7XG4gICAgY29uc3QgZnJlc2hDaG9pY2UgPSBuZXcgc2ZuLkNob2ljZSh0aGlzLCAnRnJlc2hSZXNldCcpLndoZW4oc2ZuLkNvbmRpdGlvbi5ib29sZWFuRXF1YWxzKCckLmZyZXNoJywgdHJ1ZSksIHJlc2V0KS5vdGhlcndpc2UocmVzdG9yZSk7XG4gICAgdGFpbCA9IGZyZXNoQ2hvaWNlO1xuXG4gICAgY29uc3QgZnJvbVN0ZXAgPSBuZXcgc2ZuLkNob2ljZSh0aGlzLCAnRnJvbVN0ZXAnKTtcbiAgICBmb3IgKGNvbnN0IFtzdGVwSWQsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgICAgZnJvbVN0ZXAud2hlbihzZm4uQ29uZGl0aW9uLmFuZChzZm4uQ29uZGl0aW9uLmlzUHJlc2VudCgnJC5mcm9tU3RlcCcpLCBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5mcm9tU3RlcCcsIHN0ZXBJZCkpLCBlbnRyeSk7XG4gICAgfVxuICAgIGZyb21TdGVwLm90aGVyd2lzZShmcmVzaENob2ljZSk7XG4gICAgdGFpbCA9IGZyb21TdGVwO1xuXG4gICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgbG9ncy5Mb2dHcm91cCh0aGlzLCAnTG9ncycsIHtcbiAgICAgIGxvZ0dyb3VwTmFtZTogJy9hd3MvdmVuZGVkbG9ncy9zdGF0ZXMvbWlncmF0aW9uLW9yY2hlc3RyYXRvcicsXG4gICAgICByZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5USFJFRV9NT05USFMsXG4gICAgICByZW1vdmFsUG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zdGF0ZU1hY2hpbmUgPSBuZXcgc2ZuLlN0YXRlTWFjaGluZSh0aGlzLCAnU3RhdGVNYWNoaW5lJywge1xuICAgICAgc3RhdGVNYWNoaW5lTmFtZTogJ21pZ3JhdGlvbi1vcmNoZXN0cmF0b3InLFxuICAgICAgZGVmaW5pdGlvbkJvZHk6IHNmbi5EZWZpbml0aW9uQm9keS5mcm9tQ2hhaW5hYmxlKHRhaWwpLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLmRheXMoNyksXG4gICAgICBsb2dzOiB7XG4gICAgICAgIGRlc3RpbmF0aW9uOiBsb2dHcm91cCxcbiAgICAgICAgbGV2ZWw6IHNmbi5Mb2dMZXZlbC5BTEwsXG4gICAgICAgIGluY2x1ZGVFeGVjdXRpb25EYXRhOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvZHVjZXIuZ3JhbnRJbnZva2UodGhpcy5zdGF0ZU1hY2hpbmUpO1xuICAgIHRoaXMudmVyaWZpZXIuZ3JhbnRJbnZva2UodGhpcy5zdGF0ZU1hY2hpbmUpO1xuICAgIHRoaXMucXVldWUuZ3JhbnQodGhpcy5zdGF0ZU1hY2hpbmUsICdzcXM6R2V0UXVldWVBdHRyaWJ1dGVzJyk7XG4gICAgdGhpcy50YXNrRGVmaW5pdGlvbi5ncmFudFJ1bih0aGlzLnN0YXRlTWFjaGluZSk7XG4gIH1cblxuICAvLyBQcm9kdWNlciBsb29wICh1bnRpbCBlbmRSZWFjaGVkLCBndWFyZGVkIGJ5IG1heEludm9jYXRpb25zKSAtPiBxdWV1ZSBkcmFpblxuICAvLyAoVmlzaWJsZSArIE5vdFZpc2libGUgPSAwLCBndWFyZGVkIGJ5IGRyYWluTWF4Q2hlY2tzKSAtPiBuZXh0LlxuICBwcml2YXRlIHByb2R1Y2VyUGFzcyhpZDogc3RyaW5nLCBwYXlsb2FkOiBQcm9kdWNlclBheWxvYWQsIG5leHQ6IHNmbi5JQ2hhaW5hYmxlKTogc2ZuLklDaGFpbmFibGUge1xuICAgIGNvbnN0IGZhaWx1cmUgPSBuZXcgc2ZuLkZhaWwodGhpcywgYCR7aWR9LUZhaWxlZGAsIHtcbiAgICAgIGVycm9yOiAnTWlncmF0aW9uU3RlcEZhaWxlZCcsXG4gICAgICBjYXVzZTogYFN0ZXAgJHtpZH0gZXhjZWVkZWQgaXRzIGl0ZXJhdGlvbi9kcmFpbiBndWFyZCwgb3IgYW4gRUNTIHNjcmlwdCB0YXNrIGZhaWxlZC5gLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW5pdCA9IG5ldyBzZm4uUGFzcyh0aGlzLCBgJHtpZH0tTG9vcEluaXRgLCB7XG4gICAgICBwYXJhbWV0ZXJzOiB7IGNvdW50OiAwIH0sXG4gICAgICByZXN1bHRQYXRoOiAnJC5sb29wJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGludm9rZSA9IG5ldyB0YXNrcy5MYW1iZGFJbnZva2UodGhpcywgYCR7aWR9LUludm9rZWAsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLnByb2R1Y2VyLFxuICAgICAgcGF5bG9hZDogc2ZuLlRhc2tJbnB1dC5mcm9tT2JqZWN0KHBheWxvYWQpLFxuICAgICAgcGF5bG9hZFJlc3BvbnNlT25seTogdHJ1ZSxcbiAgICAgIHJlc3VsdFBhdGg6ICckLnByb2R1Y2VyJyxcbiAgICAgIHRhc2tUaW1lb3V0OiBzZm4uVGltZW91dC5kdXJhdGlvbihjZGsuRHVyYXRpb24ubWludXRlcygxNSkpLFxuICAgIH0pO1xuICAgIGludm9rZS5hZGRSZXRyeSh7XG4gICAgICBlcnJvcnM6IFsnU3RhdGVzLlRhc2tGYWlsZWQnLCAnTGFtYmRhLlNlcnZpY2VFeGNlcHRpb24nLCAnTGFtYmRhLkFXU0xhbWJkYUV4Y2VwdGlvbicsICdMYW1iZGEuU2RrQ2xpZW50RXhjZXB0aW9uJ10sXG4gICAgICBtYXhBdHRlbXB0czogMixcbiAgICAgIGludGVydmFsOiBjZGsuRHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgICBiYWNrb2ZmUmF0ZTogMixcbiAgICB9KTtcblxuICAgIGNvbnN0IGVuZFJlYWNoZWQgPSBuZXcgc2ZuLkNob2ljZSh0aGlzLCBgJHtpZH0tRW5kUmVhY2hlZGApO1xuXG4gICAgY29uc3QgbG9vcEluYyA9IG5ldyBzZm4uUGFzcyh0aGlzLCBgJHtpZH0tTG9vcEluY2AsIHtcbiAgICAgIHBhcmFtZXRlcnM6IHsgY291bnQ6IHNmbi5Kc29uUGF0aC5tYXRoQWRkKHNmbi5Kc29uUGF0aC5udW1iZXJBdCgnJC5sb29wLmNvdW50JyksIDEpIH0sXG4gICAgICByZXN1bHRQYXRoOiAnJC5sb29wJyxcbiAgICB9KTtcbiAgICBjb25zdCBsb29wR3VhcmQgPSBuZXcgc2ZuLkNob2ljZSh0aGlzLCBgJHtpZH0tTG9vcEd1YXJkYCkud2hlbihzZm4uQ29uZGl0aW9uLm51bWJlckdyZWF0ZXJUaGFuKCckLmxvb3AuY291bnQnLCB0aGlzLm1heEludm9jYXRpb25zKSwgZmFpbHVyZSk7XG4gICAgY29uc3QgbG9vcFdhaXQgPSBuZXcgc2ZuLldhaXQodGhpcywgYCR7aWR9LUxvb3BXYWl0YCwge1xuICAgICAgdGltZTogc2ZuLldhaXRUaW1lLmR1cmF0aW9uKGNkay5EdXJhdGlvbi5zZWNvbmRzKHRoaXMubG9vcFdhaXRTZWNvbmRzKSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBkcmFpbkluaXQgPSBuZXcgc2ZuLlBhc3ModGhpcywgYCR7aWR9LURyYWluSW5pdGAsIHtcbiAgICAgIHBhcmFtZXRlcnM6IHsgY291bnQ6IDAgfSxcbiAgICAgIHJlc3VsdFBhdGg6ICckLmRyYWluJyxcbiAgICB9KTtcbiAgICBjb25zdCBkcmFpbkdldCA9IG5ldyB0YXNrcy5DYWxsQXdzU2VydmljZSh0aGlzLCBgJHtpZH0tUXVldWVBdHRyaWJ1dGVzYCwge1xuICAgICAgc2VydmljZTogJ3NxcycsXG4gICAgICBhY3Rpb246ICdnZXRRdWV1ZUF0dHJpYnV0ZXMnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBRdWV1ZVVybDogdGhpcy5xdWV1ZS5xdWV1ZVVybCxcbiAgICAgICAgQXR0cmlidXRlTmFtZXM6IFsnQXBwcm94aW1hdGVOdW1iZXJPZk1lc3NhZ2VzJywgJ0FwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlc05vdFZpc2libGUnXSxcbiAgICAgIH0sXG4gICAgICBpYW1SZXNvdXJjZXM6IFt0aGlzLnF1ZXVlLnF1ZXVlQXJuXSxcbiAgICAgIHJlc3VsdFBhdGg6ICckLnF1ZXVlJyxcbiAgICB9KTtcbiAgICBjb25zdCBkcmFpbmVkID0gbmV3IHNmbi5DaG9pY2UodGhpcywgYCR7aWR9LURyYWluZWRgKS53aGVuKFxuICAgICAgc2ZuLkNvbmRpdGlvbi5hbmQoXG4gICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLnF1ZXVlLkF0dHJpYnV0ZXMuQXBwcm94aW1hdGVOdW1iZXJPZk1lc3NhZ2VzJywgJzAnKSxcbiAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQucXVldWUuQXR0cmlidXRlcy5BcHByb3hpbWF0ZU51bWJlck9mTWVzc2FnZXNOb3RWaXNpYmxlJywgJzAnKVxuICAgICAgKSxcbiAgICAgIG5leHRcbiAgICApO1xuICAgIGNvbnN0IGRyYWluSW5jID0gbmV3IHNmbi5QYXNzKHRoaXMsIGAke2lkfS1EcmFpbkluY2AsIHtcbiAgICAgIHBhcmFtZXRlcnM6IHsgY291bnQ6IHNmbi5Kc29uUGF0aC5tYXRoQWRkKHNmbi5Kc29uUGF0aC5udW1iZXJBdCgnJC5kcmFpbi5jb3VudCcpLCAxKSB9LFxuICAgICAgcmVzdWx0UGF0aDogJyQuZHJhaW4nLFxuICAgIH0pO1xuICAgIGNvbnN0IGRyYWluR3VhcmQgPSBuZXcgc2ZuLkNob2ljZSh0aGlzLCBgJHtpZH0tRHJhaW5HdWFyZGApLndoZW4oc2ZuLkNvbmRpdGlvbi5udW1iZXJHcmVhdGVyVGhhbignJC5kcmFpbi5jb3VudCcsIHRoaXMuZHJhaW5NYXhDaGVja3MpLCBmYWlsdXJlKTtcbiAgICBjb25zdCBkcmFpbldhaXQgPSBuZXcgc2ZuLldhaXQodGhpcywgYCR7aWR9LURyYWluV2FpdGAsIHtcbiAgICAgIHRpbWU6IHNmbi5XYWl0VGltZS5kdXJhdGlvbihjZGsuRHVyYXRpb24uc2Vjb25kcyh0aGlzLmRyYWluV2FpdFNlY29uZHMpKSxcbiAgICB9KTtcblxuICAgIGluaXQubmV4dChpbnZva2UpO1xuICAgIGludm9rZS5uZXh0KGVuZFJlYWNoZWQpO1xuICAgIGVuZFJlYWNoZWQud2hlbihzZm4uQ29uZGl0aW9uLmJvb2xlYW5FcXVhbHMoJyQucHJvZHVjZXIuZW5kUmVhY2hlZCcsIHRydWUpLCBkcmFpbkluaXQpLm90aGVyd2lzZShsb29wSW5jKTtcbiAgICBsb29wSW5jLm5leHQobG9vcEd1YXJkKTtcbiAgICBsb29wR3VhcmQub3RoZXJ3aXNlKGxvb3BXYWl0KTtcbiAgICBsb29wV2FpdC5uZXh0KGludm9rZSk7XG4gICAgZHJhaW5Jbml0Lm5leHQoZHJhaW5HZXQpO1xuICAgIGRyYWluR2V0Lm5leHQoZHJhaW5lZCk7XG4gICAgZHJhaW5lZC5vdGhlcndpc2UoZHJhaW5JbmMpO1xuICAgIGRyYWluSW5jLm5leHQoZHJhaW5HdWFyZCk7XG4gICAgZHJhaW5HdWFyZC5vdGhlcndpc2UoZHJhaW5XYWl0KTtcbiAgICBkcmFpbldhaXQubmV4dChkcmFpbkdldCk7XG5cbiAgICByZXR1cm4gaW5pdDtcbiAgfVxuXG4gIC8vIE1haW4gcGFzcywgdGhlbiBhIHNraXBNaWdyYXRlZCByZXRyeSBwYXNzIChmcm9tU3RhcnQpIHRoYXQgcmUtcHVibGlzaGVzXG4gIC8vIG9ubHkgcmVjb3JkcyB3aXRob3V0IGEgbWlncmF0ZWQgcm93LlxuICBwcml2YXRlIHJlc291cmNlU3RlcChpZDogc3RyaW5nLCBwYXlsb2FkOiBQcm9kdWNlclBheWxvYWQsIG5leHQ/OiBzZm4uSUNoYWluYWJsZSk6IHNmbi5JQ2hhaW5hYmxlIHtcbiAgICBjb25zdCB0ZXJtaW5hbCA9IG5leHQgPz8gbmV3IHNmbi5TdWNjZWVkKHRoaXMsIGAke2lkfS1Eb25lYCk7XG4gICAgY29uc3QgcmV0cnkgPSB0aGlzLnByb2R1Y2VyUGFzcyhgJHtpZH0tUmV0cnlgLCB7IC4uLnBheWxvYWQsIGZyb21TdGFydDogdHJ1ZSwgc2tpcE1pZ3JhdGVkOiB0cnVlIH0sIHRlcm1pbmFsKTtcbiAgICByZXR1cm4gdGhpcy5wcm9kdWNlclBhc3MoaWQsIHBheWxvYWQsIHJldHJ5KTtcbiAgfVxuXG4gIHByaXZhdGUgZWNzU3RlcChpZDogc3RyaW5nLCBjb21tYW5kOiBzdHJpbmcsIGVudmlyb25tZW50OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10sIHRpbWVvdXQ6IGNkay5EdXJhdGlvbiwgbmV4dDogc2ZuLklDaGFpbmFibGUpOiBzZm4uSUNoYWluYWJsZSB7XG4gICAgY29uc3QgcnVuID0gbmV3IHRhc2tzLkVjc1J1blRhc2sodGhpcywgaWQsIHtcbiAgICAgIGludGVncmF0aW9uUGF0dGVybjogc2ZuLkludGVncmF0aW9uUGF0dGVybi5SVU5fSk9CLFxuICAgICAgY2x1c3RlcjogdGhpcy5jbHVzdGVyLFxuICAgICAgdGFza0RlZmluaXRpb246IHRoaXMudGFza0RlZmluaXRpb24sXG4gICAgICBsYXVuY2hUYXJnZXQ6IG5ldyB0YXNrcy5FY3NGYXJnYXRlTGF1bmNoVGFyZ2V0KHsgcGxhdGZvcm1WZXJzaW9uOiBlY3MuRmFyZ2F0ZVBsYXRmb3JtVmVyc2lvbi5MQVRFU1QgfSksXG4gICAgICBjb250YWluZXJPdmVycmlkZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRhaW5lckRlZmluaXRpb246IHRoaXMuY29udGFpbmVyLFxuICAgICAgICAgIGNvbW1hbmQ6IFtjb21tYW5kXSxcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBzdWJuZXRzOiB7IHN1Ym5ldFR5cGU6IGVjMi5TdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1MgfSxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbdGhpcy5zZWN1cml0eUdyb3VwXSxcbiAgICAgIGFzc2lnblB1YmxpY0lwOiBmYWxzZSxcbiAgICAgIHRhc2tUaW1lb3V0OiBzZm4uVGltZW91dC5kdXJhdGlvbih0aW1lb3V0KSxcbiAgICB9KTtcbiAgICBydW4uYWRkUmV0cnkoe1xuICAgICAgZXJyb3JzOiBbJ1N0YXRlcy5UYXNrRmFpbGVkJ10sXG4gICAgICBtYXhBdHRlbXB0czogMSxcbiAgICAgIGludGVydmFsOiBjZGsuRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgIGJhY2tvZmZSYXRlOiAyLFxuICAgIH0pO1xuICAgIHJ1bi5uZXh0KG5leHQpO1xuICAgIHJldHVybiBydW47XG4gIH1cbn1cbiJdfQ==
@@ -5,6 +5,8 @@ const cdk = require("aws-cdk-lib");
5
5
  const constants_1 = require("../util/constants");
6
6
  const initBuildConfig_1 = require("../util/initBuildConfig");
7
7
  const migration_1 = require("../util/migration");
8
+ const migration_scripts_runner_1 = require("../constructs/migration-scripts-runner");
9
+ const migration_state_machine_1 = require("../constructs/migration-state-machine");
8
10
  const path = require("path");
9
11
  const fs = require("fs");
10
12
  class MicroserviceMigration extends cdk.Stack {
@@ -69,6 +71,11 @@ class MicroserviceMigration extends cdk.Stack {
69
71
  if (lambdaProps.environment) {
70
72
  lambdaProps.environment['MIGRATION_QUEUE_URL'] = migrationQueue.queueUrl;
71
73
  }
74
+ // The claims producer shards FIFO message groups by MIGRATION_QUEUE_SHARDS;
75
+ // the consumer's reserved concurrency must cover every shard group.
76
+ const shardsParam = cdk.aws_ssm.StringParameter.valueFromLookup(this, `/${initBuildConfig_1.buildConfig.envName}/microservices/migration/env/MIGRATION_QUEUE_SHARDS`);
77
+ const shards = Number(shardsParam);
78
+ const consumerConcurrency = Number.isFinite(shards) && shards > 0 ? Math.max(50, shards) : 64;
72
79
  const producerLambda = new cdk.aws_lambda_nodejs.NodejsFunction(this, 'migrationProducerLambda', {
73
80
  ...lambdaProps,
74
81
  functionName: 'migration-producer',
@@ -80,16 +87,45 @@ class MicroserviceMigration extends cdk.Stack {
80
87
  functionName: 'migration-consumer',
81
88
  entry: path.join(lambdasRootDir, 'consumer', 'index.ts'),
82
89
  role: lambdaRole,
83
- reservedConcurrentExecutions: 50,
90
+ reservedConcurrentExecutions: consumerConcurrency,
84
91
  });
85
92
  consumerLambda.addEventSource(new cdk.aws_lambda_event_sources.SqsEventSource(migrationQueue, {
86
- maxConcurrency: 50,
93
+ maxConcurrency: consumerConcurrency,
87
94
  reportBatchItemFailures: true,
88
95
  }));
89
96
  migrationQueue.grantSendMessages(producerLambda);
90
97
  migrationQueue.grantConsumeMessages(consumerLambda);
98
+ const artifactsBucket = new cdk.aws_s3.Bucket(this, 'migrationArtifactsBucket', {
99
+ bucketName: `glicogh-healthcare-migration-${initBuildConfig_1.buildConfig.envName}-${initBuildConfig_1.buildConfig.aws.account}`,
100
+ blockPublicAccess: cdk.aws_s3.BlockPublicAccess.BLOCK_ALL,
101
+ encryption: cdk.aws_s3.BucketEncryption.S3_MANAGED,
102
+ enforceSSL: true,
103
+ removalPolicy: cdk.RemovalPolicy.RETAIN,
104
+ lifecycleRules: [{ id: 'expire-backups', prefix: 'backups/', expiration: cdk.Duration.days(30) }],
105
+ });
106
+ const verifierLambda = new cdk.aws_lambda_nodejs.NodejsFunction(this, 'migrationVerifierLambda', {
107
+ ...lambdaProps,
108
+ functionName: 'migration-verifier',
109
+ entry: path.join(lambdasRootDir, 'verifier', 'index.ts'),
110
+ role: lambdaRole,
111
+ });
112
+ artifactsBucket.grantPut(verifierLambda);
113
+ const scriptsRunner = new migration_scripts_runner_1.MigrationScriptsRunner(this, 'migrationScriptsRunner', {
114
+ vpc,
115
+ artifactsBucket,
116
+ });
117
+ new migration_state_machine_1.MigrationStateMachine(this, 'migrationStateMachine', {
118
+ producer: producerLambda,
119
+ verifier: verifierLambda,
120
+ queue: migrationQueue,
121
+ cluster: scriptsRunner.cluster,
122
+ taskDefinition: scriptsRunner.taskDefinition,
123
+ container: scriptsRunner.container,
124
+ securityGroup: scriptsRunner.securityGroup,
125
+ artifactsBucket,
126
+ });
91
127
  }
92
128
  }
93
129
  }
94
130
  exports.MicroserviceMigration = MicroserviceMigration;
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zZXJ2aWNlLW1pZ3JhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9taWNyb3NlcnZpY2UtbWlncmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUVuQyxpREFBbUQ7QUFDbkQsNkRBQXNEO0FBQ3RELGlEQUFrRDtBQUNsRCw2QkFBNkI7QUFDN0IseUJBQXlCO0FBRXpCLE1BQWEscUJBQXNCLFNBQVEsR0FBRyxDQUFDLEtBQUs7SUFDbEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsNkJBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUU7WUFDeEQsT0FBTyxFQUFFLElBQUEsMEJBQWMsRUFBQyxPQUFPLENBQUM7U0FDakMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRTtZQUNqSSxjQUFjLEVBQUUsRUFBRTtZQUNsQixxQkFBcUIsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7U0FDakQsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUU7WUFDbkUsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMs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USxDQUFDO1lBQzNFLENBQUM7WUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHlCQUF5QixFQUFFO2dCQUMvRixHQUFHLFdBQVc7Z0JBQ2QsWUFBWSxFQUFFLG9CQUFvQjtnQkFDbEMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7Z0JBQ3hELElBQUksRUFBRSxVQUFVO2FBQ2pCLENBQUMsQ0FBQztZQUVILE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUseUJBQXlCLEVBQUU7Z0JBQy9GLEdBQUcsV0FBVztnQkFDZCxZQUFZLEVBQUUsb0JBQW9CO2dCQUNsQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztnQkFDeEQsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLDRCQUE0QixFQUFFLEVBQUU7YUFDakMsQ0FBQyxDQUFDO1lBRUgsY0FBYyxDQUFDLGNBQWMsQ0FDM0IsSUFBSSxHQUFHLENBQUMsd0JBQXdCLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRTtnQkFDOUQsY0FBYyxFQUFFLEVBQUU7Z0JBQ2xCLHVCQUF1QixFQUFFLElBQUk7YUFDOUIsQ0FBQyxDQUNILENBQUM7WUFFRixjQUFjLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDakQsY0FBYyxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFoR0Qsc0RBZ0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgZ2V0RW52Q29uc3RhbnQgfSBmcm9tICcuLi91dGlsL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBidWlsZENvbmZpZyB9IGZyb20gJy4uL3V0aWwvaW5pdEJ1aWxkQ29uZmlnJztcbmltcG9ydCB7IGdldExhbWJkYUVudnMgfSBmcm9tICcuLi91dGlsL21pZ3JhdGlvbic7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuXG5leHBvcnQgY2xhc3MgTWljcm9zZXJ2aWNlTWlncmF0aW9uIGV4dGVuZHMgY2RrLlN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBjZGsuU3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgaWYgKCFidWlsZENvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWlsZENvbmZpZyBub3Qgc2V0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgdnBjID0gY2RrLmF3c19lYzIuVnBjLmZyb21Mb29rdXAodGhpcywgJ1ZQQ0xvb2t1cCcsIHtcbiAgICAgIHZwY05hbWU6IGdldEVudkNvbnN0YW50KCd2cGNJZCcpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcGFyYW1zQW5kU2VjcmV0cyA9IGNkay5hd3NfbGFtYmRhLlBhcmFtc0FuZFNlY3JldHNMYXllclZlcnNpb24uZnJvbVZlcnNpb24oY2RrLmF3c19sYW1iZGEuUGFyYW1zQW5kU2VjcmV0c1ZlcnNpb25zLlYxXzBfMTAzLCB7XG4gICAgICBtYXhDb25uZWN0aW9uczogMjAsXG4gICAgICBzZWNyZXRzTWFuYWdlclRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDMwMCksXG4gICAgfSk7XG5cbiAgICBjb25zdCBsYW1iZGFSb2xlID0gbmV3IGNkay5hd3NfaWFtLlJvbGUodGhpcywgJ01pZ3JhdGlvbkxhbWJkYVJvbGUnLCB7XG4gICAgICByb2xlTmFtZTogJ01pZ3JhdGlvbkxhbWJkYScsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBjZGsuYXdzX2lhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbXG4gICAgICAgIGNkay5hd3NfaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJyksXG4gICAgICAgIGNkay5hd3NfaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhVlBDQWNjZXNzRXhlY3V0aW9uUm9sZScpLFxuICAgICAgXSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIG1pZ3JhdGlvbkxhbWJkYXM6IG5ldyBjZGsuYXdzX2lhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IGNkay5hd3NfaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIHNpZDogJ0FsbG93TGFtYmRhVG9SZWFkU1NNUGFyYW1ldGVycycsXG4gICAgICAgICAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOnNzbToke2J1aWxkQ29uZmlnLmF3cy5yZWdpb259OiR7YnVpbGRDb25maWcuYXdzLmFjY291bnR9OnBhcmFtZXRlci8ke2J1aWxkQ29uZmlnLmVudk5hbWV9L21pY3Jvc2VydmljZXMvKmBdLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ3NzbTpHZXRQYXJhbWV0ZXIqJ10sXG4gICAgICAgICAgICAgIGVmZmVjdDogY2RrLmF3c19pYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgbGFtYmRhc1Jvb3REaXIgPSBwYXRoLmpvaW4ocGF0aC5yZXNvbHZlKCcuLi8uLi9taWdyYXRpb24nKSwgJ2xhbWJkYXMnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsYW1iZGFzUm9vdERpcikpIHtcbiAgICAgIGNvbnN0IGxhbWJkYVByb3BzOiBjZGsuYXdzX2xhbWJkYV9ub2RlanMuTm9kZWpzRnVuY3Rpb25Qcm9wcyA9IHtcbiAgICAgICAgcnVudGltZTogY2RrLmF3c19sYW1iZGEuUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgYXJjaGl0ZWN0dXJlOiBjZGsuYXdzX2xhbWJkYS5BcmNoaXRlY3R1cmUuWDg2XzY0LFxuICAgICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICAgIGRlcHNMb2NrRmlsZVBhdGg6IHBhdGguam9pbihsYW1iZGFzUm9vdERpciwgJ3BhY2thZ2UtbG9jay5qc29uJyksXG4gICAgICAgIHByb2plY3RSb290OiBsYW1iZGFzUm9vdERpcixcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICB0c2NvbmZpZzogcGF0aC5qb2luKGxhbWJkYXNSb290RGlyLCAndHNjb25maWcuanNvbicpLFxuICAgICAgICAgIGV4dGVybmFsTW9kdWxlczogWydiZXR0ZXItc3FsaXRlMycsICdwZycsICdteXNxbCcsICdzcWxpdGUzJywgJ3RlZGlvdXMnLCAnb3JhY2xlZGInLCAncGctcXVlcnktc3RyZWFtJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGVudmlyb25tZW50OiBnZXRMYW1iZGFFbnZzKHRoaXMpLFxuICAgICAgICB2cGMsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHsgc3VibmV0VHlwZTogY2RrLmF3c19lYzIuU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTIH0sXG4gICAgICAgIHBhcmFtc0FuZFNlY3JldHMsXG4gICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1pZ3JhdGlvblF1ZXVlID0gbmV3IGNkay5hd3Nfc3FzLlF1ZXVlKHRoaXMsICdtaWdyYXRpb25RdWV1ZScsIHtcbiAgICAgICAgcXVldWVOYW1lOiAnbWlncmF0aW9uLXF1ZXVlLmZpZm8nLFxuICAgICAgICBmaWZvOiB0cnVlLFxuICAgICAgICBmaWZvVGhyb3VnaHB1dExpbWl0OiBjZGsuYXdzX3Nxcy5GaWZvVGhyb3VnaHB1dExpbWl0LlBFUl9NRVNTQUdFX0dST1VQX0lELFxuICAgICAgICBkZWR1cGxpY2F0aW9uU2NvcGU6IGNkay5hd3Nfc3FzLkRlZHVwbGljYXRpb25TY29wZS5NRVNTQUdFX0dST1VQLFxuICAgICAgICB2aXNpYmlsaXR5VGltZW91dDogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMjApLFxuICAgICAgICByZWNlaXZlTWVzc2FnZVdhaXRUaW1lOiBjZGsuRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICB9KTtcblxuICAgICAgaWYgKGxhbWJkYVByb3BzLmVudmlyb25tZW50KSB7XG4gICAgICAgIGxhbWJkYVByb3BzLmVudmlyb25tZW50WydNSUdSQVRJT05fUVVFVUVfVVJMJ10gPSBtaWdyYXRpb25RdWV1ZS5xdWV1ZVVybDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJvZHVjZXJMYW1iZGEgPSBuZXcgY2RrLmF3c19sYW1iZGFfbm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdtaWdyYXRpb25Qcm9kdWNlckxhbWJkYScsIHtcbiAgICAgICAgLi4ubGFtYmRhUHJvcHMsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ21pZ3JhdGlvbi1wcm9kdWNlcicsXG4gICAgICAgIGVudHJ5OiBwYXRoLmpvaW4obGFtYmRhc1Jvb3REaXIsICdwcm9kdWNlcicsICdpbmRleC50cycpLFxuICAgICAgICByb2xlOiBsYW1iZGFSb2xlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbnN1bWVyTGFtYmRhID0gbmV3IGNkay5hd3NfbGFtYmRhX25vZGVqcy5Ob2RlanNGdW5jdGlvbih0aGlzLCAnbWlncmF0aW9uQ29uc3VtZXJMYW1iZGEnLCB7XG4gICAgICAgIC4uLmxhbWJkYVByb3BzLFxuICAgICAgICBmdW5jdGlvbk5hbWU6ICdtaWdyYXRpb24tY29uc3VtZXInLFxuICAgICAgICBlbnRyeTogcGF0aC5qb2luKGxhbWJkYXNSb290RGlyLCAnY29uc3VtZXInLCAnaW5kZXgudHMnKSxcbiAgICAgICAgcm9sZTogbGFtYmRhUm9sZSxcbiAgICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogNTAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3VtZXJMYW1iZGEuYWRkRXZlbnRTb3VyY2UoXG4gICAgICAgIG5ldyBjZGsuYXdzX2xhbWJkYV9ldmVudF9zb3VyY2VzLlNxc0V2ZW50U291cmNlKG1pZ3JhdGlvblF1ZXVlLCB7XG4gICAgICAgICAgbWF4Q29uY3VycmVuY3k6IDUwLFxuICAgICAgICAgIHJlcG9ydEJhdGNoSXRlbUZhaWx1cmVzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgbWlncmF0aW9uUXVldWUuZ3JhbnRTZW5kTWVzc2FnZXMocHJvZHVjZXJMYW1iZGEpO1xuICAgICAgbWlncmF0aW9uUXVldWUuZ3JhbnRDb25zdW1lTWVzc2FnZXMoY29uc3VtZXJMYW1iZGEpO1xuICAgIH1cbiAgfVxufVxuIl19
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zZXJ2aWNlLW1pZ3JhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9taWNyb3NlcnZpY2UtbWlncmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUVuQyxpREFBbUQ7QUFDbkQsNkRBQXNEO0FBQ3RELGlEQUFrRDtBQUNsRCxxRkFBZ0Y7QUFDaEYsbUZBQThFO0FBQzlFLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFFekIsTUFBYSxxQkFBc0IsU0FBUSxHQUFHLENBQUMsS0FBSztJQUNsRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyw2QkFBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUN4RCxPQUFPLEVBQUUsSUFBQSwwQkFBYyxFQUFDLE9BQU8sQ0FBQztTQUNqQyxDQUFDLENBQUM7UUFFSCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsNEJBQTRCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFFO1lBQ2pJLGNBQWMsRUFBRSxFQUFFO1lBQ2xCLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztTQUNqRCxDQUFDLENBQUM7UUFFSCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtZQUNuRSxRQUFRLEVBQUUsaUJBQWlCO1lBQzNC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LGNBQWMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sYUFBYSxHQUFHLElBQUksaURBQXNCLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFO2dCQUMvRSxHQUFHO2dCQUNILGVBQWU7YUFDaEIsQ0FBQyxDQUFDO1lBRUgsSUFBSSwrQ0FBcUIsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUU7Z0JBQ3ZELFFBQVEsRUFBRSxjQUFjO2dCQUN4QixRQUFRLEVBQUUsY0FBYztnQkFDeEIsS0FBSyxFQUFFLGNBQWM7Z0JBQ3JCLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTztnQkFDOUIsY0FBYyxFQUFFLGFBQWEsQ0FBQyxjQUFjO2dCQUM1QyxTQUFTLEVBQUUsYUFBYSxDQUFDLFNBQVM7Z0JBQ2xDLGFBQWEsRUFBRSxhQUFhLENBQUMsYUFBYTtnQkFDMUMsZUFBZTthQUNoQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBdklELHNEQXVJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGdldEVudkNvbnN0YW50IH0gZnJvbSAnLi4vdXRpbC9jb25zdGFudHMnO1xuaW1wb3J0IHsgYnVpbGRDb25maWcgfSBmcm9tICcuLi91dGlsL2luaXRCdWlsZENvbmZpZyc7XG5pbXBvcnQgeyBnZXRMYW1iZGFFbnZzIH0gZnJvbSAnLi4vdXRpbC9taWdyYXRpb24nO1xuaW1wb3J0IHsgTWlncmF0aW9uU2NyaXB0c1J1bm5lciB9IGZyb20gJy4uL2NvbnN0cnVjdHMvbWlncmF0aW9uLXNjcmlwdHMtcnVubmVyJztcbmltcG9ydCB7IE1pZ3JhdGlvblN0YXRlTWFjaGluZSB9IGZyb20gJy4uL2NvbnN0cnVjdHMvbWlncmF0aW9uLXN0YXRlLW1hY2hpbmUnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcblxuZXhwb3J0IGNsYXNzIE1pY3Jvc2VydmljZU1pZ3JhdGlvbiBleHRlbmRzIGNkay5TdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogY2RrLlN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIGlmICghYnVpbGRDb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGRDb25maWcgbm90IHNldCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHZwYyA9IGNkay5hd3NfZWMyLlZwYy5mcm9tTG9va3VwKHRoaXMsICdWUENMb29rdXAnLCB7XG4gICAgICB2cGNOYW1lOiBnZXRFbnZDb25zdGFudCgndnBjSWQnKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBhcmFtc0FuZFNlY3JldHMgPSBjZGsuYXdzX2xhbWJkYS5QYXJhbXNBbmRTZWNyZXRzTGF5ZXJWZXJzaW9uLmZyb21WZXJzaW9uKGNkay5hd3NfbGFtYmRhLlBhcmFtc0FuZFNlY3JldHNWZXJzaW9ucy5WMV8wXzEwMywge1xuICAgICAgbWF4Q29ubmVjdGlvbnM6IDIwLFxuICAgICAgc2VjcmV0c01hbmFnZXJUaW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygzMDApLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbGFtYmRhUm9sZSA9IG5ldyBjZGsuYXdzX2lhbS5Sb2xlKHRoaXMsICdNaWdyYXRpb25MYW1iZGFSb2xlJywge1xuICAgICAgcm9sZU5hbWU6ICdNaWdyYXRpb25MYW1iZGEnLFxuICAgICAgYXNzdW1lZEJ5OiBuZXcgY2RrLmF3c19pYW0uU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICBjZGsuYXdzX2lhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZScpLFxuICAgICAgICBjZGsuYXdzX2lhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0xhbWJkYVZQQ0FjY2Vzc0V4ZWN1dGlvblJvbGUnKSxcbiAgICAgIF0sXG4gICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICBtaWdyYXRpb25MYW1iZGFzOiBuZXcgY2RrLmF3c19pYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBjZGsuYXdzX2lhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBzaWQ6ICdBbGxvd0xhbWJkYVRvUmVhZFNTTVBhcmFtZXRlcnMnLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpzc206JHtidWlsZENvbmZpZy5hd3MucmVnaW9ufToke2J1aWxkQ29uZmlnLmF3cy5hY2NvdW50fTpwYXJhbWV0ZXIvJHtidWlsZENvbmZpZy5lbnZOYW1lfS9taWNyb3NlcnZpY2VzLypgXSxcbiAgICAgICAgICAgICAgYWN0aW9uczogWydzc206R2V0UGFyYW1ldGVyKiddLFxuICAgICAgICAgICAgICBlZmZlY3Q6IGNkay5hd3NfaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGxhbWJkYXNSb290RGlyID0gcGF0aC5qb2luKHBhdGgucmVzb2x2ZSgnLi4vLi4vbWlncmF0aW9uJyksICdsYW1iZGFzJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobGFtYmRhc1Jvb3REaXIpKSB7XG4gICAgICBjb25zdCBsYW1iZGFQcm9wczogY2RrLmF3c19sYW1iZGFfbm9kZWpzLk5vZGVqc0Z1bmN0aW9uUHJvcHMgPSB7XG4gICAgICAgIHJ1bnRpbWU6IGNkay5hd3NfbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgIGFyY2hpdGVjdHVyZTogY2RrLmF3c19sYW1iZGEuQXJjaGl0ZWN0dXJlLlg4Nl82NCxcbiAgICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgICBkZXBzTG9ja0ZpbGVQYXRoOiBwYXRoLmpvaW4obGFtYmRhc1Jvb3REaXIsICdwYWNrYWdlLWxvY2suanNvbicpLFxuICAgICAgICBwcm9qZWN0Um9vdDogbGFtYmRhc1Jvb3REaXIsXG4gICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgdHNjb25maWc6IHBhdGguam9pbihsYW1iZGFzUm9vdERpciwgJ3RzY29uZmlnLmpzb24nKSxcbiAgICAgICAgICBleHRlcm5hbE1vZHVsZXM6IFsnYmV0dGVyLXNxbGl0ZTMnLCAncGcnLCAnbXlzcWwnLCAnc3FsaXRlMycsICd0ZWRpb3VzJywgJ29yYWNsZWRiJywgJ3BnLXF1ZXJ5LXN0cmVhbSddLFxuICAgICAgICB9LFxuICAgICAgICBlbnZpcm9ubWVudDogZ2V0TGFtYmRhRW52cyh0aGlzKSxcbiAgICAgICAgdnBjLFxuICAgICAgICB2cGNTdWJuZXRzOiB7IHN1Ym5ldFR5cGU6IGNkay5hd3NfZWMyLlN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTUyB9LFxuICAgICAgICBwYXJhbXNBbmRTZWNyZXRzLFxuICAgICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtaWdyYXRpb25RdWV1ZSA9IG5ldyBjZGsuYXdzX3Nxcy5RdWV1ZSh0aGlzLCAnbWlncmF0aW9uUXVldWUnLCB7XG4gICAgICAgIHF1ZXVlTmFtZTogJ21pZ3JhdGlvbi1xdWV1ZS5maWZvJyxcbiAgICAgICAgZmlmbzogdHJ1ZSxcbiAgICAgICAgZmlmb1Rocm91Z2hwdXRMaW1pdDogY2RrLmF3c19zcXMuRmlmb1Rocm91Z2hwdXRMaW1pdC5QRVJfTUVTU0FHRV9HUk9VUF9JRCxcbiAgICAgICAgZGVkdXBsaWNhdGlvblNjb3BlOiBjZGsuYXdzX3Nxcy5EZWR1cGxpY2F0aW9uU2NvcGUuTUVTU0FHRV9HUk9VUCxcbiAgICAgICAgdmlzaWJpbGl0eVRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDIwKSxcbiAgICAgICAgcmVjZWl2ZU1lc3NhZ2VXYWl0VGltZTogY2RrLkR1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChsYW1iZGFQcm9wcy5lbnZpcm9ubWVudCkge1xuICAgICAgICBsYW1iZGFQcm9wcy5lbnZpcm9ubWVudFsnTUlHUkFUSU9OX1FVRVVFX1VSTCddID0gbWlncmF0aW9uUXVldWUucXVldWVVcmw7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjbGFpbXMgcHJvZHVjZXIgc2hhcmRzIEZJRk8gbWVzc2FnZSBncm91cHMgYnkgTUlHUkFUSU9OX1FVRVVFX1NIQVJEUztcbiAgICAgIC8vIHRoZSBjb25zdW1lcidzIHJlc2VydmVkIGNvbmN1cnJlbmN5IG11c3QgY292ZXIgZXZlcnkgc2hhcmQgZ3JvdXAuXG4gICAgICBjb25zdCBzaGFyZHNQYXJhbSA9IGNkay5hd3Nfc3NtLlN0cmluZ1BhcmFtZXRlci52YWx1ZUZyb21Mb29rdXAodGhpcywgYC8ke2J1aWxkQ29uZmlnLmVudk5hbWV9L21pY3Jvc2VydmljZXMvbWlncmF0aW9uL2Vudi9NSUdSQVRJT05fUVVFVUVfU0hBUkRTYCk7XG4gICAgICBjb25zdCBzaGFyZHMgPSBOdW1iZXIoc2hhcmRzUGFyYW0pO1xuICAgICAgY29uc3QgY29uc3VtZXJDb25jdXJyZW5jeSA9IE51bWJlci5pc0Zpbml0ZShzaGFyZHMpICYmIHNoYXJkcyA+IDAgPyBNYXRoLm1heCg1MCwgc2hhcmRzKSA6IDY0O1xuXG4gICAgICBjb25zdCBwcm9kdWNlckxhbWJkYSA9IG5ldyBjZGsuYXdzX2xhbWJkYV9ub2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgJ21pZ3JhdGlvblByb2R1Y2VyTGFtYmRhJywge1xuICAgICAgICAuLi5sYW1iZGFQcm9wcyxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAnbWlncmF0aW9uLXByb2R1Y2VyJyxcbiAgICAgICAgZW50cnk6IHBhdGguam9pbihsYW1iZGFzUm9vdERpciwgJ3Byb2R1Y2VyJywgJ2luZGV4LnRzJyksXG4gICAgICAgIHJvbGU6IGxhbWJkYVJvbGUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY29uc3VtZXJMYW1iZGEgPSBuZXcgY2RrLmF3c19sYW1iZGFfbm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdtaWdyYXRpb25Db25zdW1lckxhbWJkYScsIHtcbiAgICAgICAgLi4ubGFtYmRhUHJvcHMsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ21pZ3JhdGlvbi1jb25zdW1lcicsXG4gICAgICAgIGVudHJ5OiBwYXRoLmpvaW4obGFtYmRhc1Jvb3REaXIsICdjb25zdW1lcicsICdpbmRleC50cycpLFxuICAgICAgICByb2xlOiBsYW1iZGFSb2xlLFxuICAgICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBjb25zdW1lckNvbmN1cnJlbmN5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN1bWVyTGFtYmRhLmFkZEV2ZW50U291cmNlKFxuICAgICAgICBuZXcgY2RrLmF3c19sYW1iZGFfZXZlbnRfc291cmNlcy5TcXNFdmVudFNvdXJjZShtaWdyYXRpb25RdWV1ZSwge1xuICAgICAgICAgIG1heENvbmN1cnJlbmN5OiBjb25zdW1lckNvbmN1cnJlbmN5LFxuICAgICAgICAgIHJlcG9ydEJhdGNoSXRlbUZhaWx1cmVzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgbWlncmF0aW9uUXVldWUuZ3JhbnRTZW5kTWVzc2FnZXMocHJvZHVjZXJMYW1iZGEpO1xuICAgICAgbWlncmF0aW9uUXVldWUuZ3JhbnRDb25zdW1lTWVzc2FnZXMoY29uc3VtZXJMYW1iZGEpO1xuXG4gICAgICBjb25zdCBhcnRpZmFjdHNCdWNrZXQgPSBuZXcgY2RrLmF3c19zMy5CdWNrZXQodGhpcywgJ21pZ3JhdGlvbkFydGlmYWN0c0J1Y2tldCcsIHtcbiAgICAgICAgYnVja2V0TmFtZTogYGdsaWNvZ2gtaGVhbHRoY2FyZS1taWdyYXRpb24tJHtidWlsZENvbmZpZy5lbnZOYW1lfS0ke2J1aWxkQ29uZmlnLmF3cy5hY2NvdW50fWAsXG4gICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBjZGsuYXdzX3MzLkJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgZW5jcnlwdGlvbjogY2RrLmF3c19zMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IGNkay5SZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7IGlkOiAnZXhwaXJlLWJhY2t1cHMnLCBwcmVmaXg6ICdiYWNrdXBzLycsIGV4cGlyYXRpb246IGNkay5EdXJhdGlvbi5kYXlzKDMwKSB9XSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB2ZXJpZmllckxhbWJkYSA9IG5ldyBjZGsuYXdzX2xhbWJkYV9ub2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgJ21pZ3JhdGlvblZlcmlmaWVyTGFtYmRhJywge1xuICAgICAgICAuLi5sYW1iZGFQcm9wcyxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAnbWlncmF0aW9uLXZlcmlmaWVyJyxcbiAgICAgICAgZW50cnk6IHBhdGguam9pbihsYW1iZGFzUm9vdERpciwgJ3ZlcmlmaWVyJywgJ2luZGV4LnRzJyksXG4gICAgICAgIHJvbGU6IGxhbWJkYVJvbGUsXG4gICAgICB9KTtcbiAgICAgIGFydGlmYWN0c0J1Y2tldC5ncmFudFB1dCh2ZXJpZmllckxhbWJkYSk7XG5cbiAgICAgIGNvbnN0IHNjcmlwdHNSdW5uZXIgPSBuZXcgTWlncmF0aW9uU2NyaXB0c1J1bm5lcih0aGlzLCAnbWlncmF0aW9uU2NyaXB0c1J1bm5lcicsIHtcbiAgICAgICAgdnBjLFxuICAgICAgICBhcnRpZmFjdHNCdWNrZXQsXG4gICAgICB9KTtcblxuICAgICAgbmV3IE1pZ3JhdGlvblN0YXRlTWFjaGluZSh0aGlzLCAnbWlncmF0aW9uU3RhdGVNYWNoaW5lJywge1xuICAgICAgICBwcm9kdWNlcjogcHJvZHVjZXJMYW1iZGEsXG4gICAgICAgIHZlcmlmaWVyOiB2ZXJpZmllckxhbWJkYSxcbiAgICAgICAgcXVldWU6IG1pZ3JhdGlvblF1ZXVlLFxuICAgICAgICBjbHVzdGVyOiBzY3JpcHRzUnVubmVyLmNsdXN0ZXIsXG4gICAgICAgIHRhc2tEZWZpbml0aW9uOiBzY3JpcHRzUnVubmVyLnRhc2tEZWZpbml0aW9uLFxuICAgICAgICBjb250YWluZXI6IHNjcmlwdHNSdW5uZXIuY29udGFpbmVyLFxuICAgICAgICBzZWN1cml0eUdyb3VwOiBzY3JpcHRzUnVubmVyLnNlY3VyaXR5R3JvdXAsXG4gICAgICAgIGFydGlmYWN0c0J1Y2tldCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -16,6 +16,7 @@ const microservice_portal_1 = require("../lib/microservice-portal");
16
16
  const microservice_infra_auth_1 = require("../lib/microservice-infra-auth");
17
17
  const microservice_migration_1 = require("../lib/microservice-migration");
18
18
  const microservice_clickhouse_1 = require("../lib/microservice-clickhouse");
19
+ const common_1 = require("../@types/common");
19
20
  function initCdkStack() {
20
21
  const app = new cdk.App();
21
22
  const buildConfig = (0, initBuildConfig_1.initBuildConfig)(app);
@@ -54,24 +55,38 @@ function initCdkStack() {
54
55
  });
55
56
  }
56
57
  else {
57
- new microservice_network_1.MicroserviceNetwork(app, 'MicroserviceNetwork', {
58
- env: buildConfig.aws,
59
- });
60
- new microservice_infra_auth_1.MicroserviceInfraAuth(app, 'MicroserviceInfraAuth', {
61
- env: buildConfig.aws,
62
- });
63
- new microservice_redis_1.MicroserviceRedis(app, `MicroserviceRedis${buildConfig.formattedBuildId ? '-' + buildConfig.formattedBuildId : ''}`, {
64
- env: buildConfig.aws,
65
- });
66
- new microservice_mysql_1.MicroserviceMySql(app, `MicroserviceMySQL${buildConfig.formattedBuildId ? '-' + buildConfig.formattedBuildId : ''}`, {
67
- env: buildConfig.aws,
68
- });
69
- new microservice_clickhouse_1.MicroserviceClickHouse(app, `MicroserviceClickHouse${buildConfig.formattedBuildId ? '-' + buildConfig.formattedBuildId : ''}`, {
70
- env: buildConfig.aws,
71
- });
72
- new microservice_migration_1.MicroserviceMigration(app, 'MicroserviceMigration', {
73
- env: buildConfig.aws,
74
- });
58
+ const sharedStacks = {
59
+ network: () => {
60
+ new microservice_network_1.MicroserviceNetwork(app, 'MicroserviceNetwork', { env: buildConfig.aws });
61
+ },
62
+ 'infra-auth': () => {
63
+ new microservice_infra_auth_1.MicroserviceInfraAuth(app, 'MicroserviceInfraAuth', { env: buildConfig.aws });
64
+ },
65
+ redis: () => {
66
+ new microservice_redis_1.MicroserviceRedis(app, `MicroserviceRedis${buildConfig.formattedBuildId ? '-' + buildConfig.formattedBuildId : ''}`, { env: buildConfig.aws });
67
+ },
68
+ mysql: () => {
69
+ new microservice_mysql_1.MicroserviceMySql(app, `MicroserviceMySQL${buildConfig.formattedBuildId ? '-' + buildConfig.formattedBuildId : ''}`, { env: buildConfig.aws });
70
+ },
71
+ clickhouse: () => {
72
+ new microservice_clickhouse_1.MicroserviceClickHouse(app, `MicroserviceClickHouse${buildConfig.formattedBuildId ? '-' + buildConfig.formattedBuildId : ''}`, {
73
+ env: buildConfig.aws,
74
+ });
75
+ },
76
+ migration: () => {
77
+ new microservice_migration_1.MicroserviceMigration(app, 'MicroserviceMigration', { env: buildConfig.aws });
78
+ },
79
+ };
80
+ const sharedService = common_1.OtherCDKServiceList.find((service) => service === buildConfig.serviceName && service in sharedStacks);
81
+ if (sharedService) {
82
+ sharedStacks[sharedService]();
83
+ }
84
+ else if (!buildConfig.serviceName) {
85
+ Object.values(sharedStacks).forEach((createStack) => createStack());
86
+ }
87
+ else {
88
+ throw new Error(`Unknown service '${buildConfig.serviceName}'. Shared stacks: ${Object.keys(sharedStacks).join(', ')}`);
89
+ }
75
90
  }
76
91
  }
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdENka1N0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXRpbC9pbml0Q2RrU3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnQkEsb0NBeURDO0FBekVELHVDQUFxQztBQUNyQyxtQ0FBbUM7QUFDbkMsdURBQW9EO0FBQ3BELDJDQUF1RDtBQUN2RCxrRkFBNkU7QUFDN0Usc0VBQWtFO0FBQ2xFLDhFQUF5RTtBQUN6RSxrRUFBOEQ7QUFDOUQsZ0dBQTJGO0FBQzNGLHFEQUFrRDtBQUNsRCxrRUFBOEQ7QUFDOUQsb0VBQWdFO0FBQ2hFLDRFQUF1RTtBQUN2RSwwRUFBc0U7QUFDdEUsNEVBQXdFO0FBRXhFLFNBQWdCLFlBQVk7SUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDMUIsTUFBTSxXQUFXLEdBQUcsSUFBQSxpQ0FBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLElBQUEscUJBQVMsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUVmLElBQUksSUFBQSwrQkFBYyxHQUFFLEVBQUUsQ0FBQztRQUNyQixJQUFBLHlCQUFhLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxxREFBd0IsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLFdBQVcsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDdkgsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1lBQ3BCOzs2RUFFaUU7WUFFakU7K0VBQ21FO1lBQ25FLDZGQUE2RjtZQUU3Rjs4Q0FDa0M7WUFDbEMseURBQXlEO1lBRXpELDhGQUE4RjtTQUMvRixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sSUFBSSxXQUFXLENBQUMsV0FBVyxLQUFLLGNBQWMsRUFBRSxDQUFDO1FBQ3RELElBQUEseUJBQWEsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLG1FQUErQixDQUFDLEdBQUcsRUFBRSxtQ0FBbUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDMUcsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxXQUFXLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDckQsSUFBSSxpREFBc0IsQ0FBQyxHQUFHLEVBQUUseUJBQXlCLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDakksR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEQsSUFBQSx5QkFBYSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksd0NBQWtCLENBQUMsR0FBRyxFQUFFLHFCQUFxQixXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3pILEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksMENBQW1CLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFO1lBQ2xELEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztTQUNyQixDQUFDLENBQUM7UUFDSCxJQUFJLCtDQUFxQixDQUFDLEdBQUcsRUFBRSx1QkFBdUIsRUFBRTtZQUN0RCxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxzQ0FBaUIsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDdkgsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1NBQ3JCLENBQUMsQ0FBQztRQUNILElBQUksc0NBQWlCLENBQUMsR0FBRyxFQUFFLG9CQUFvQixXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3ZILEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztTQUNyQixDQUFDLENBQUM7UUFDSCxJQUFJLGdEQUFzQixDQUFDLEdBQUcsRUFBRSx5QkFBeUIsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNqSSxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSw4Q0FBcUIsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLEVBQUU7WUFDdEQsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzb3VyY2UtbWFwLXN1cHBvcnQvcmVnaXN0ZXInO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGluaXRCdWlsZENvbmZpZyB9IGZyb20gJy4vaW5pdEJ1aWxkQ29uZmlnJztcbmltcG9ydCB7IGFkZFJlcG9Ub1RhZ3MsIGFwcGx5VGFncyB9IGZyb20gJy4vYXBwbHlUYWdzJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUxhcmF2ZWxCYXNlZCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtbGFyYXZlbC1iYXNlZCc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VOZXR3b3JrIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1uZXR3b3JrJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUFwaUdhdGV3YXkgfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLWFwaS1nYXRld2F5JztcbmltcG9ydCB7IE1pY3Jvc2VydmljZVJlZGlzIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1yZWRpcyc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1ub3RpZmljYXRpb24tc2VydmljZSc7XG5pbXBvcnQgeyBpc0xhcmF2ZWxCYXNlZCB9IGZyb20gJy4vaXNMYXJhdmVsQmFzZWQnO1xuaW1wb3J0IHsgTWljcm9zZXJ2aWNlTXlTcWwgfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLW15c3FsJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZVBvcnRhbCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtcG9ydGFsJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUluZnJhQXV0aCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtaW5mcmEtYXV0aCc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VNaWdyYXRpb24gfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLW1pZ3JhdGlvbic7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VDbGlja0hvdXNlIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1jbGlja2hvdXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRDZGtTdGFjaygpIHtcbiAgY29uc3QgYXBwID0gbmV3IGNkay5BcHAoKTtcbiAgY29uc3QgYnVpbGRDb25maWcgPSBpbml0QnVpbGRDb25maWcoYXBwKTtcbiAgYXBwbHlUYWdzKGFwcCk7XG5cbiAgaWYgKGlzTGFyYXZlbEJhc2VkKCkpIHtcbiAgICBhZGRSZXBvVG9UYWdzKGFwcCk7XG4gICAgbmV3IE1pY3Jvc2VydmljZUxhcmF2ZWxCYXNlZChhcHAsIGBNaWNyb3NlcnZpY2VMYXJhdmVsQmFzZWQtJHtidWlsZENvbmZpZy5zZXJ2aWNlTmFtZX0tJHtidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkfWAsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgICAgLyogSWYgeW91IGRvbid0IHNwZWNpZnkgJ2VudicsIHRoaXMgc3RhY2sgd2lsbCBiZSBlbnZpcm9ubWVudC1hZ25vc3RpYy5cbiAgICAgICAqIEFjY291bnQvUmVnaW9uLWRlcGVuZGVudCBmZWF0dXJlcyBhbmQgY29udGV4dCBsb29rdXBzIHdpbGwgbm90IHdvcmssXG4gICAgICAgKiBidXQgYSBzaW5nbGUgc3ludGhlc2l6ZWQgdGVtcGxhdGUgY2FuIGJlIGRlcGxveWVkIGFueXdoZXJlLiAqL1xuXG4gICAgICAvKiBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBzcGVjaWFsaXplIHRoaXMgc3RhY2sgZm9yIHRoZSBBV1MgQWNjb3VudFxuICAgICAgICogYW5kIFJlZ2lvbiB0aGF0IGFyZSBpbXBsaWVkIGJ5IHRoZSBjdXJyZW50IENMSSBjb25maWd1cmF0aW9uLiAqL1xuICAgICAgLy8gZW52OiB7IGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQsIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfUkVHSU9OIH0sXG5cbiAgICAgIC8qIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIGlmIHlvdSBrbm93IGV4YWN0bHkgd2hhdCBBY2NvdW50IGFuZCBSZWdpb24geW91XG4gICAgICAgKiB3YW50IHRvIGRlcGxveSB0aGUgc3RhY2sgdG8uICovXG4gICAgICAvLyBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcblxuICAgICAgLyogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL2xhdGVzdC9ndWlkZS9lbnZpcm9ubWVudHMuaHRtbCAqL1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGJ1aWxkQ29uZmlnLnNlcnZpY2VOYW1lID09PSAnbm90aWZpY2F0aW9uJykge1xuICAgIGFkZFJlcG9Ub1RhZ3MoYXBwKTtcbiAgICBuZXcgTWljcm9zZXJ2aWNlTm90aWZpY2F0aW9uU2VydmljZShhcHAsIGBNaWNyb3NlcnZpY2VOb3RpZmljYXRpb25TZXJ2aWNlLSR7YnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZH1gLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChidWlsZENvbmZpZy5zZXJ2aWNlTmFtZSA9PT0gJ2FwaS1nYXRld2F5Jykge1xuICAgIG5ldyBNaWNyb3NlcnZpY2VBcGlHYXRld2F5KGFwcCwgYE1pY3Jvc2VydmljZUFwaUdhdGV3YXkke2J1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgPyAnLScgKyBidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkIDogJyd9YCwge1xuICAgICAgZW52OiBidWlsZENvbmZpZy5hd3MsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoYnVpbGRDb25maWcuc2VydmljZU5hbWUgPT09ICdwb3J0YWwnKSB7XG4gICAgYWRkUmVwb1RvVGFncyhhcHApO1xuICAgIG5ldyBNaWNyb3NlcnZpY2VQb3J0YWwoYXBwLCBgTWljcm9zZXJ2aWNlUG9ydGFsJHtidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkID8gJy0nICsgYnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZCA6ICcnfWAsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG5ldyBNaWNyb3NlcnZpY2VOZXR3b3JrKGFwcCwgJ01pY3Jvc2VydmljZU5ldHdvcmsnLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICB9KTtcbiAgICBuZXcgTWljcm9zZXJ2aWNlSW5mcmFBdXRoKGFwcCwgJ01pY3Jvc2VydmljZUluZnJhQXV0aCcsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgIH0pO1xuICAgIG5ldyBNaWNyb3NlcnZpY2VSZWRpcyhhcHAsIGBNaWNyb3NlcnZpY2VSZWRpcyR7YnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZCA/ICctJyArIGJ1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgOiAnJ31gLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICB9KTtcbiAgICBuZXcgTWljcm9zZXJ2aWNlTXlTcWwoYXBwLCBgTWljcm9zZXJ2aWNlTXlTUUwke2J1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgPyAnLScgKyBidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkIDogJyd9YCwge1xuICAgICAgZW52OiBidWlsZENvbmZpZy5hd3MsXG4gICAgfSk7XG4gICAgbmV3IE1pY3Jvc2VydmljZUNsaWNrSG91c2UoYXBwLCBgTWljcm9zZXJ2aWNlQ2xpY2tIb3VzZSR7YnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZCA/ICctJyArIGJ1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgOiAnJ31gLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICB9KTtcbiAgICBuZXcgTWljcm9zZXJ2aWNlTWlncmF0aW9uKGFwcCwgJ01pY3Jvc2VydmljZU1pZ3JhdGlvbicsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdENka1N0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXRpbC9pbml0Q2RrU3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpQkEsb0NBd0VDO0FBekZELHVDQUFxQztBQUNyQyxtQ0FBbUM7QUFDbkMsdURBQW9EO0FBQ3BELDJDQUF1RDtBQUN2RCxrRkFBNkU7QUFDN0Usc0VBQWtFO0FBQ2xFLDhFQUF5RTtBQUN6RSxrRUFBOEQ7QUFDOUQsZ0dBQTJGO0FBQzNGLHFEQUFrRDtBQUNsRCxrRUFBOEQ7QUFDOUQsb0VBQWdFO0FBQ2hFLDRFQUF1RTtBQUN2RSwwRUFBc0U7QUFDdEUsNEVBQXdFO0FBQ3hFLDZDQUF1RDtBQUV2RCxTQUFnQixZQUFZO0lBQzFCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzFCLE1BQU0sV0FBVyxHQUFHLElBQUEsaUNBQWUsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUN6QyxJQUFBLHFCQUFTLEVBQUMsR0FBRyxDQUFDLENBQUM7SUFFZixJQUFJLElBQUEsK0JBQWMsR0FBRSxFQUFFLENBQUM7UUFDckIsSUFBQSx5QkFBYSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUkscURBQXdCLENBQUMsR0FBRyxFQUFFLDRCQUE0QixXQUFXLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQ3ZILEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztZQUNwQjs7NkVBRWlFO1lBRWpFOytFQUNtRTtZQUNuRSw2RkFBNkY7WUFFN0Y7OENBQ2tDO1lBQ2xDLHlEQUF5RDtZQUV6RCw4RkFBOEY7U0FDL0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztTQUFNLElBQUksV0FBVyxDQUFDLFdBQVcsS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUN0RCxJQUFBLHlCQUFhLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxtRUFBK0IsQ0FBQyxH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QztZQUNsQixZQUFZLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNoQyxDQUFDO2FBQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLFdBQVcsQ0FBQyxXQUFXLHFCQUFxQixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUgsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzb3VyY2UtbWFwLXN1cHBvcnQvcmVnaXN0ZXInO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGluaXRCdWlsZENvbmZpZyB9IGZyb20gJy4vaW5pdEJ1aWxkQ29uZmlnJztcbmltcG9ydCB7IGFkZFJlcG9Ub1RhZ3MsIGFwcGx5VGFncyB9IGZyb20gJy4vYXBwbHlUYWdzJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUxhcmF2ZWxCYXNlZCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtbGFyYXZlbC1iYXNlZCc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VOZXR3b3JrIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1uZXR3b3JrJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUFwaUdhdGV3YXkgfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLWFwaS1nYXRld2F5JztcbmltcG9ydCB7IE1pY3Jvc2VydmljZVJlZGlzIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1yZWRpcyc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1ub3RpZmljYXRpb24tc2VydmljZSc7XG5pbXBvcnQgeyBpc0xhcmF2ZWxCYXNlZCB9IGZyb20gJy4vaXNMYXJhdmVsQmFzZWQnO1xuaW1wb3J0IHsgTWljcm9zZXJ2aWNlTXlTcWwgfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLW15c3FsJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZVBvcnRhbCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtcG9ydGFsJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUluZnJhQXV0aCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtaW5mcmEtYXV0aCc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VNaWdyYXRpb24gfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLW1pZ3JhdGlvbic7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VDbGlja0hvdXNlIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1jbGlja2hvdXNlJztcbmltcG9ydCB7IE90aGVyQ0RLU2VydmljZUxpc3QgfSBmcm9tICcuLi9AdHlwZXMvY29tbW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRDZGtTdGFjaygpIHtcbiAgY29uc3QgYXBwID0gbmV3IGNkay5BcHAoKTtcbiAgY29uc3QgYnVpbGRDb25maWcgPSBpbml0QnVpbGRDb25maWcoYXBwKTtcbiAgYXBwbHlUYWdzKGFwcCk7XG5cbiAgaWYgKGlzTGFyYXZlbEJhc2VkKCkpIHtcbiAgICBhZGRSZXBvVG9UYWdzKGFwcCk7XG4gICAgbmV3IE1pY3Jvc2VydmljZUxhcmF2ZWxCYXNlZChhcHAsIGBNaWNyb3NlcnZpY2VMYXJhdmVsQmFzZWQtJHtidWlsZENvbmZpZy5zZXJ2aWNlTmFtZX0tJHtidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkfWAsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgICAgLyogSWYgeW91IGRvbid0IHNwZWNpZnkgJ2VudicsIHRoaXMgc3RhY2sgd2lsbCBiZSBlbnZpcm9ubWVudC1hZ25vc3RpYy5cbiAgICAgICAqIEFjY291bnQvUmVnaW9uLWRlcGVuZGVudCBmZWF0dXJlcyBhbmQgY29udGV4dCBsb29rdXBzIHdpbGwgbm90IHdvcmssXG4gICAgICAgKiBidXQgYSBzaW5nbGUgc3ludGhlc2l6ZWQgdGVtcGxhdGUgY2FuIGJlIGRlcGxveWVkIGFueXdoZXJlLiAqL1xuXG4gICAgICAvKiBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBzcGVjaWFsaXplIHRoaXMgc3RhY2sgZm9yIHRoZSBBV1MgQWNjb3VudFxuICAgICAgICogYW5kIFJlZ2lvbiB0aGF0IGFyZSBpbXBsaWVkIGJ5IHRoZSBjdXJyZW50IENMSSBjb25maWd1cmF0aW9uLiAqL1xuICAgICAgLy8gZW52OiB7IGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQsIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfUkVHSU9OIH0sXG5cbiAgICAgIC8qIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIGlmIHlvdSBrbm93IGV4YWN0bHkgd2hhdCBBY2NvdW50IGFuZCBSZWdpb24geW91XG4gICAgICAgKiB3YW50IHRvIGRlcGxveSB0aGUgc3RhY2sgdG8uICovXG4gICAgICAvLyBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcblxuICAgICAgLyogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL2xhdGVzdC9ndWlkZS9lbnZpcm9ubWVudHMuaHRtbCAqL1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGJ1aWxkQ29uZmlnLnNlcnZpY2VOYW1lID09PSAnbm90aWZpY2F0aW9uJykge1xuICAgIGFkZFJlcG9Ub1RhZ3MoYXBwKTtcbiAgICBuZXcgTWljcm9zZXJ2aWNlTm90aWZpY2F0aW9uU2VydmljZShhcHAsIGBNaWNyb3NlcnZpY2VOb3RpZmljYXRpb25TZXJ2aWNlLSR7YnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZH1gLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChidWlsZENvbmZpZy5zZXJ2aWNlTmFtZSA9PT0gJ2FwaS1nYXRld2F5Jykge1xuICAgIG5ldyBNaWNyb3NlcnZpY2VBcGlHYXRld2F5KGFwcCwgYE1pY3Jvc2VydmljZUFwaUdhdGV3YXkke2J1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgPyAnLScgKyBidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkIDogJyd9YCwge1xuICAgICAgZW52OiBidWlsZENvbmZpZy5hd3MsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoYnVpbGRDb25maWcuc2VydmljZU5hbWUgPT09ICdwb3J0YWwnKSB7XG4gICAgYWRkUmVwb1RvVGFncyhhcHApO1xuICAgIG5ldyBNaWNyb3NlcnZpY2VQb3J0YWwoYXBwLCBgTWljcm9zZXJ2aWNlUG9ydGFsJHtidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkID8gJy0nICsgYnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZCA6ICcnfWAsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNoYXJlZFN0YWNrcyA9IHtcbiAgICAgIG5ldHdvcms6ICgpID0+IHtcbiAgICAgICAgbmV3IE1pY3Jvc2VydmljZU5ldHdvcmsoYXBwLCAnTWljcm9zZXJ2aWNlTmV0d29yaycsIHsgZW52OiBidWlsZENvbmZpZy5hd3MgfSk7XG4gICAgICB9LFxuICAgICAgJ2luZnJhLWF1dGgnOiAoKSA9PiB7XG4gICAgICAgIG5ldyBNaWNyb3NlcnZpY2VJbmZyYUF1dGgoYXBwLCAnTWljcm9zZXJ2aWNlSW5mcmFBdXRoJywgeyBlbnY6IGJ1aWxkQ29uZmlnLmF3cyB9KTtcbiAgICAgIH0sXG4gICAgICByZWRpczogKCkgPT4ge1xuICAgICAgICBuZXcgTWljcm9zZXJ2aWNlUmVkaXMoYXBwLCBgTWljcm9zZXJ2aWNlUmVkaXMke2J1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgPyAnLScgKyBidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkIDogJyd9YCwgeyBlbnY6IGJ1aWxkQ29uZmlnLmF3cyB9KTtcbiAgICAgIH0sXG4gICAgICBteXNxbDogKCkgPT4ge1xuICAgICAgICBuZXcgTWljcm9zZXJ2aWNlTXlTcWwoYXBwLCBgTWljcm9zZXJ2aWNlTXlTUUwke2J1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgPyAnLScgKyBidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkIDogJyd9YCwgeyBlbnY6IGJ1aWxkQ29uZmlnLmF3cyB9KTtcbiAgICAgIH0sXG4gICAgICBjbGlja2hvdXNlOiAoKSA9PiB7XG4gICAgICAgIG5ldyBNaWNyb3NlcnZpY2VDbGlja0hvdXNlKGFwcCwgYE1pY3Jvc2VydmljZUNsaWNrSG91c2Uke2J1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgPyAnLScgKyBidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkIDogJyd9YCwge1xuICAgICAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBtaWdyYXRpb246ICgpID0+IHtcbiAgICAgICAgbmV3IE1pY3Jvc2VydmljZU1pZ3JhdGlvbihhcHAsICdNaWNyb3NlcnZpY2VNaWdyYXRpb24nLCB7IGVudjogYnVpbGRDb25maWcuYXdzIH0pO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2hhcmVkU2VydmljZSA9IE90aGVyQ0RLU2VydmljZUxpc3QuZmluZChcbiAgICAgIChzZXJ2aWNlKTogc2VydmljZSBpcyBrZXlvZiB0eXBlb2Ygc2hhcmVkU3RhY2tzID0+IHNlcnZpY2UgPT09IGJ1aWxkQ29uZmlnLnNlcnZpY2VOYW1lICYmIHNlcnZpY2UgaW4gc2hhcmVkU3RhY2tzXG4gICAgKTtcbiAgICBpZiAoc2hhcmVkU2VydmljZSkge1xuICAgICAgc2hhcmVkU3RhY2tzW3NoYXJlZFNlcnZpY2VdKCk7XG4gICAgfSBlbHNlIGlmICghYnVpbGRDb25maWcuc2VydmljZU5hbWUpIHtcbiAgICAgIE9iamVjdC52YWx1ZXMoc2hhcmVkU3RhY2tzKS5mb3JFYWNoKChjcmVhdGVTdGFjaykgPT4gY3JlYXRlU3RhY2soKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZXJ2aWNlICcke2J1aWxkQ29uZmlnLnNlcnZpY2VOYW1lfScuIFNoYXJlZCBzdGFja3M6ICR7T2JqZWN0LmtleXMoc2hhcmVkU3RhY2tzKS5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,2 +1,6 @@
1
- import { Stack } from 'aws-cdk-lib';
1
+ import { aws_ecs, Stack } from 'aws-cdk-lib';
2
2
  export declare function getLambdaEnvs(scope: Stack): Record<string, string>;
3
+ export declare function getEcsEnvs(scope: Stack): {
4
+ environment: Record<string, string>;
5
+ secrets: Record<string, aws_ecs.Secret>;
6
+ };
@@ -1,61 +1,77 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getLambdaEnvs = getLambdaEnvs;
4
+ exports.getEcsEnvs = getEcsEnvs;
4
5
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
6
  const initBuildConfig_1 = require("./initBuildConfig");
7
+ const SSM_STRING_VARS = [
8
+ 'global:DB_HOST',
9
+ 'global:DB_USERNAME',
10
+ 'global:DB_PORT',
11
+ 'global:REDIS_HOST',
12
+ 'global:REDIS_PORT',
13
+ 'portal:ACCOUNT_SERVICE_URL',
14
+ 'portal:PLAN_SERVICE_URL',
15
+ 'portal:POLICY_SERVICE_URL',
16
+ 'portal:CLAIMS_SERVICE_URL',
17
+ 'migration:MIGRATION_FETCH_SIZE',
18
+ 'migration:DEFAULT_INSURER_ID',
19
+ 'migration:DEFAULT_INSURER_ROLE_ID',
20
+ 'migration:DB_DATABASE',
21
+ 'migration:DB_POOL_MAX',
22
+ 'migration:MIGRATION_PRODUCER_CONCURRENCY',
23
+ 'migration:MIGRATION_CONSUMER_CONCURRENCY',
24
+ 'migration:MIGRATION_QUEUE_SHARDS',
25
+ 'migration:BENEFICIARY_PHOTOS_URL',
26
+ 'migration:TPA_BENEFICIARY_PHOTOS_URL',
27
+ 'migration:EXPIRED_POLICY_GRACE_PERIOD_MONTHS',
28
+ 'migration:CLAIMS_BENEFIT_TYPE_FALLBACK',
29
+ 'migration:HTTP_MAX_SOCKETS',
30
+ 'migration:REQUEST_TIMEOUT_MS',
31
+ 'migration:REQUEST_MAX_RETRIES',
32
+ ];
33
+ const SSM_SECURE_VARS = ['global:DB_PASSWORD', 'migration:MIGRATION_API_KEY'];
6
34
  function getLambdaEnvs(scope) {
7
- const ssmStringVars = [
8
- 'global:DB_HOST',
9
- 'global:DB_USERNAME',
10
- 'global:DB_PORT',
11
- 'global:REDIS_HOST',
12
- 'global:REDIS_PORT',
13
- 'portal:ACCOUNT_SERVICE_URL',
14
- 'portal:PLAN_SERVICE_URL',
15
- 'portal:POLICY_SERVICE_URL',
16
- 'portal:CLAIMS_SERVICE_URL',
17
- 'migration:MIGRATION_FETCH_SIZE',
18
- 'migration:DEFAULT_INSURER_ID',
19
- 'migration:DEFAULT_INSURER_ROLE_ID',
20
- 'migration:DB_DATABASE',
21
- 'migration:DB_POOL_MAX',
22
- 'migration:MIGRATION_PRODUCER_CONCURRENCY',
23
- 'migration:MIGRATION_CONSUMER_CONCURRENCY',
24
- 'migration:MIGRATION_QUEUE_SHARDS',
25
- 'migration:BENEFICIARY_PHOTOS_URL',
26
- 'migration:TPA_BENEFICIARY_PHOTOS_URL',
27
- 'migration:EXPIRED_POLICY_GRACE_PERIOD_MONTHS',
28
- 'migration:CLAIMS_BENEFIT_TYPE_FALLBACK',
29
- 'migration:CLAIMS_STATUS_HELD',
30
- 'migration:HTTP_MAX_SOCKETS',
31
- 'migration:REQUEST_TIMEOUT_MS',
32
- 'migration:REQUEST_MAX_RETRIES',
33
- ];
34
- const ssmSecureVars = ['global:DB_PASSWORD', 'migration:MIGRATION_API_KEY'];
35
35
  const vars = {
36
- ...lookupSsmParameters(scope, ssmStringVars),
37
- ...lookupSsmParameters(scope, ssmSecureVars, true),
36
+ ...lookupSsmParameters(scope, SSM_STRING_VARS),
37
+ ...lookupSsmParameters(scope, SSM_SECURE_VARS, true),
38
38
  ENV: String(initBuildConfig_1.buildConfig?.envName),
39
39
  };
40
40
  return vars;
41
41
  }
42
- function lookupSsmParameters(scope, keys, secure = false) {
43
- const env = initBuildConfig_1.buildConfig?.envName;
44
- const variables = [];
45
- for (const key of keys) {
46
- const namespace = key.substring(0, key.indexOf(':'));
47
- const name = key.substring(namespace.length + 1);
48
- const path = `/${env}/microservices/${namespace}/env/${name}`;
49
- variables.push({ path, name });
42
+ function getEcsEnvs(scope) {
43
+ const environment = {
44
+ ...lookupSsmParameters(scope, SSM_STRING_VARS),
45
+ ENV: String(initBuildConfig_1.buildConfig?.envName),
46
+ };
47
+ const secrets = {};
48
+ for (const key of SSM_SECURE_VARS) {
49
+ const name = ssmName(key);
50
+ secrets[name] = aws_cdk_lib_1.aws_ecs.Secret.fromSsmParameter(aws_cdk_lib_1.aws_ssm.StringParameter.fromSecureStringParameterAttributes(scope, `EcsSecret${name}`, {
51
+ parameterName: ssmPath(key),
52
+ }));
50
53
  }
51
- return variables.reduce((acc, item) => {
54
+ return { environment, secrets };
55
+ }
56
+ function ssmNamespace(key) {
57
+ return key.substring(0, key.indexOf(':'));
58
+ }
59
+ function ssmName(key) {
60
+ return key.substring(key.indexOf(':') + 1);
61
+ }
62
+ function ssmPath(key) {
63
+ const env = initBuildConfig_1.buildConfig?.envName;
64
+ return `/${env}/microservices/${ssmNamespace(key)}/env/${ssmName(key)}`;
65
+ }
66
+ function lookupSsmParameters(scope, keys, secure = false) {
67
+ return keys.reduce((acc, key) => {
52
68
  if (secure) {
53
- acc[item.name] = `ssm://${item.path}`;
69
+ acc[ssmName(key)] = `ssm://${ssmPath(key)}`;
54
70
  }
55
71
  else {
56
- acc[item.name] = aws_cdk_lib_1.aws_ssm.StringParameter.valueFromLookup(scope, item.path);
72
+ acc[ssmName(key)] = aws_cdk_lib_1.aws_ssm.StringParameter.valueFromLookup(scope, ssmPath(key));
57
73
  }
58
74
  return acc;
59
75
  }, {});
60
76
  }
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXRpbC9taWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSxzQ0F1Q0M7QUE3Q0QsNkNBQTZDO0FBQzdDLHVEQUFnRDtBQUtoRCxTQUFnQixhQUFhLENBQUMsS0FBWTtJQUN4QyxNQUFNLGFBQWEsR0FBYTtRQUM5QixnQkFBZ0I7UUFDaEIsb0JBQW9CO1FBQ3BCLGdCQUFnQjtRQUNoQixtQkFBbUI7UUFDbkIsbUJBQW1CO1FBRW5CLDRCQUE0QjtRQUM1Qix5QkFBeUI7UUFDekIsMkJBQTJCO1FBQzNCLDJCQUEyQjtRQUUzQixnQ0FBZ0M7UUFDaEMsOEJBQThCO1FBQzlCLG1DQUFtQztRQUNuQyx1QkFBdUI7UUFDdkIsdUJBQXVCO1FBQ3ZCLDBDQUEwQztRQUMxQywwQ0FBMEM7UUFDMUMsa0NBQWtDO1FBQ2xDLGtDQUFrQztRQUNsQyxzQ0FBc0M7UUFDdEMsOENBQThDO1FBQzlDLHdDQUF3QztRQUN4Qyw4QkFBOEI7UUFDOUIsNEJBQTRCO1FBQzVCLDhCQUE4QjtRQUM5QiwrQkFBK0I7S0FDaEMsQ0FBQztJQUVGLE1BQU0sYUFBYSxHQUFhLENBQUMsb0JBQW9CLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztJQUV0RixNQUFNLElBQUksR0FBRztRQUNYLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQztRQUM1QyxHQUFHLG1CQUFtQixDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDO1FBQ2xELEdBQUcsRUFBRSxNQUFNLENBQUMsNkJBQVcsRUFBRSxPQUFPLENBQUM7S0FDbEMsQ0FBQztJQUNGLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsS0FBWSxFQUFFLElBQWMsRUFBRSxNQUFNLEdBQUcsS0FBSztJQUN2RSxNQUFNLEdBQUcsR0FBRyw2QkFBVyxFQUFFLE9BQU8sQ0FBQztJQUNqQyxNQUFNLFNBQVMsR0FBcUMsRUFBRSxDQUFDO0lBQ3ZELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsa0JBQWtCLFNBQVMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FDckIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDWixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcscUJBQU8sQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUNELEVBQTRCLENBQzdCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXdzX3NzbSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBidWlsZENvbmZpZyB9IGZyb20gJy4vaW5pdEJ1aWxkQ29uZmlnJztcblxudHlwZSBTc21OYW1lc3BhY2UgPSAnZ2xvYmFsJyB8ICdtaWdyYXRpb24nIHwgJ3BvcnRhbCc7XG50eXBlIFNzbUtleSA9IGAke1NzbU5hbWVzcGFjZX06JHtzdHJpbmd9YDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhbWJkYUVudnMoc2NvcGU6IFN0YWNrKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHNzbVN0cmluZ1ZhcnM6IFNzbUtleVtdID0gW1xuICAgICdnbG9iYWw6REJfSE9TVCcsXG4gICAgJ2dsb2JhbDpEQl9VU0VSTkFNRScsXG4gICAgJ2dsb2JhbDpEQl9QT1JUJyxcbiAgICAnZ2xvYmFsOlJFRElTX0hPU1QnLFxuICAgICdnbG9iYWw6UkVESVNfUE9SVCcsXG5cbiAgICAncG9ydGFsOkFDQ09VTlRfU0VSVklDRV9VUkwnLFxuICAgICdwb3J0YWw6UExBTl9TRVJWSUNFX1VSTCcsXG4gICAgJ3BvcnRhbDpQT0xJQ1lfU0VSVklDRV9VUkwnLFxuICAgICdwb3J0YWw6Q0xBSU1TX1NFUlZJQ0VfVVJMJyxcblxuICAgICdtaWdyYXRpb246TUlHUkFUSU9OX0ZFVENIX1NJWkUnLFxuICAgICdtaWdyYXRpb246REVGQVVMVF9JTlNVUkVSX0lEJyxcbiAgICAnbWlncmF0aW9uOkRFRkFVTFRfSU5TVVJFUl9ST0xFX0lEJyxcbiAgICAnbWlncmF0aW9uOkRCX0RBVEFCQVNFJyxcbiAgICAnbWlncmF0aW9uOkRCX1BPT0xfTUFYJyxcbiAgICAnbWlncmF0aW9uOk1JR1JBVElPTl9QUk9EVUNFUl9DT05DVVJSRU5DWScsXG4gICAgJ21pZ3JhdGlvbjpNSUdSQVRJT05fQ09OU1VNRVJfQ09OQ1VSUkVOQ1knLFxuICAgICdtaWdyYXRpb246TUlHUkFUSU9OX1FVRVVFX1NIQVJEUycsXG4gICAgJ21pZ3JhdGlvbjpCRU5FRklDSUFSWV9QSE9UT1NfVVJMJyxcbiAgICAnbWlncmF0aW9uOlRQQV9CRU5FRklDSUFSWV9QSE9UT1NfVVJMJyxcbiAgICAnbWlncmF0aW9uOkVYUElSRURfUE9MSUNZX0dSQUNFX1BFUklPRF9NT05USFMnLFxuICAgICdtaWdyYXRpb246Q0xBSU1TX0JFTkVGSVRfVFlQRV9GQUxMQkFDSycsXG4gICAgJ21pZ3JhdGlvbjpDTEFJTVNfU1RBVFVTX0hFTEQnLFxuICAgICdtaWdyYXRpb246SFRUUF9NQVhfU09DS0VUUycsXG4gICAgJ21pZ3JhdGlvbjpSRVFVRVNUX1RJTUVPVVRfTVMnLFxuICAgICdtaWdyYXRpb246UkVRVUVTVF9NQVhfUkVUUklFUycsXG4gIF07XG5cbiAgY29uc3Qgc3NtU2VjdXJlVmFyczogU3NtS2V5W10gPSBbJ2dsb2JhbDpEQl9QQVNTV09SRCcsICdtaWdyYXRpb246TUlHUkFUSU9OX0FQSV9LRVknXTtcblxuICBjb25zdCB2YXJzID0ge1xuICAgIC4uLmxvb2t1cFNzbVBhcmFtZXRlcnMoc2NvcGUsIHNzbVN0cmluZ1ZhcnMpLFxuICAgIC4uLmxvb2t1cFNzbVBhcmFtZXRlcnMoc2NvcGUsIHNzbVNlY3VyZVZhcnMsIHRydWUpLFxuICAgIEVOVjogU3RyaW5nKGJ1aWxkQ29uZmlnPy5lbnZOYW1lKSxcbiAgfTtcbiAgcmV0dXJuIHZhcnM7XG59XG5cbmZ1bmN0aW9uIGxvb2t1cFNzbVBhcmFtZXRlcnMoc2NvcGU6IFN0YWNrLCBrZXlzOiBTc21LZXlbXSwgc2VjdXJlID0gZmFsc2UpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW52ID0gYnVpbGRDb25maWc/LmVudk5hbWU7XG4gIGNvbnN0IHZhcmlhYmxlczogeyBwYXRoOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IGtleS5zdWJzdHJpbmcoMCwga2V5LmluZGV4T2YoJzonKSk7XG4gICAgY29uc3QgbmFtZSA9IGtleS5zdWJzdHJpbmcobmFtZXNwYWNlLmxlbmd0aCArIDEpO1xuICAgIGNvbnN0IHBhdGggPSBgLyR7ZW52fS9taWNyb3NlcnZpY2VzLyR7bmFtZXNwYWNlfS9lbnYvJHtuYW1lfWA7XG4gICAgdmFyaWFibGVzLnB1c2goeyBwYXRoLCBuYW1lIH0pO1xuICB9XG4gIHJldHVybiB2YXJpYWJsZXMucmVkdWNlKFxuICAgIChhY2MsIGl0ZW0pID0+IHtcbiAgICAgIGlmIChzZWN1cmUpIHtcbiAgICAgICAgYWNjW2l0ZW0ubmFtZV0gPSBgc3NtOi8vJHtpdGVtLnBhdGh9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY1tpdGVtLm5hbWVdID0gYXdzX3NzbS5TdHJpbmdQYXJhbWV0ZXIudmFsdWVGcm9tTG9va3VwKHNjb3BlLCBpdGVtLnBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgKTtcbn1cbiJdfQ==
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXRpbC9taWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxQ0Esc0NBT0M7QUFFRCxnQ0FpQkM7QUEvREQsNkNBQXNEO0FBQ3RELHVEQUFnRDtBQUtoRCxNQUFNLGVBQWUsR0FBYTtJQUNoQyxnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBRW5CLDRCQUE0QjtJQUM1Qix5QkFBeUI7SUFDekIsMkJBQTJCO0lBQzNCLDJCQUEyQjtJQUUzQixnQ0FBZ0M7SUFDaEMsOEJBQThCO0lBQzlCLG1DQUFtQztJQUNuQyx1QkFBdUI7SUFDdkIsdUJBQXVCO0lBQ3ZCLDBDQUEwQztJQUMxQywwQ0FBMEM7SUFDMUMsa0NBQWtDO0lBQ2xDLGtDQUFrQztJQUNsQyxzQ0FBc0M7SUFDdEMsOENBQThDO0lBQzlDLHdDQUF3QztJQUN4Qyw0QkFBNEI7SUFDNUIsOEJBQThCO0lBQzlCLCtCQUErQjtDQUNoQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQWEsQ0FBQyxvQkFBb0IsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO0FBRXhGLFNBQWdCLGFBQWEsQ0FBQyxLQUFZO0lBQ3hDLE1BQU0sSUFBSSxHQUFHO1FBQ1gsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDO1FBQzlDLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUM7UUFDcEQsR0FBRyxFQUFFLE1BQU0sQ0FBQyw2QkFBVyxFQUFFLE9BQU8sQ0FBQztLQUNsQyxDQUFDO0lBQ0YsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsVUFBVSxDQUFDLEtBQVk7SUFDckMsTUFBTSxXQUFXLEdBQUc7UUFDbEIsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDO1FBQzlDLEdBQUcsRUFBRSxNQUFNLENBQUMsNkJBQVcsRUFBRSxPQUFPLENBQUM7S0FDbEMsQ0FBQztJQUVGLE1BQU0sT0FBTyxHQUFtQyxFQUFFLENBQUM7SUFDbkQsS0FBSyxNQUFNLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLHFCQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUM3QyxxQkFBTyxDQUFDLGVBQWUsQ0FBQyxtQ0FBbUMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxJQUFJLEVBQUUsRUFBRTtZQUNyRixhQUFhLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQztTQUM1QixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxHQUFXO0lBQy9CLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBaUIsQ0FBQztBQUM1RCxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsR0FBVztJQUMxQixPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsR0FBVztJQUMxQixNQUFNLEdBQUcsR0FBRyw2QkFBVyxFQUFFLE9BQU8sQ0FBQztJQUNqQyxPQUFPLElBQUksR0FBRyxrQkFBa0IsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQzFFLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEtBQVksRUFBRSxJQUFjLEVBQUUsTUFBTSxHQUFHLEtBQUs7SUFDdkUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUNoQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNYLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxxQkFBTyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsRUFDRCxFQUE0QixDQUM3QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGF3c19lY3MsIGF3c19zc20sIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgYnVpbGRDb25maWcgfSBmcm9tICcuL2luaXRCdWlsZENvbmZpZyc7XG5cbnR5cGUgU3NtTmFtZXNwYWNlID0gJ2dsb2JhbCcgfCAnbWlncmF0aW9uJyB8ICdwb3J0YWwnO1xudHlwZSBTc21LZXkgPSBgJHtTc21OYW1lc3BhY2V9OiR7c3RyaW5nfWA7XG5cbmNvbnN0IFNTTV9TVFJJTkdfVkFSUzogU3NtS2V5W10gPSBbXG4gICdnbG9iYWw6REJfSE9TVCcsXG4gICdnbG9iYWw6REJfVVNFUk5BTUUnLFxuICAnZ2xvYmFsOkRCX1BPUlQnLFxuICAnZ2xvYmFsOlJFRElTX0hPU1QnLFxuICAnZ2xvYmFsOlJFRElTX1BPUlQnLFxuXG4gICdwb3J0YWw6QUNDT1VOVF9TRVJWSUNFX1VSTCcsXG4gICdwb3J0YWw6UExBTl9TRVJWSUNFX1VSTCcsXG4gICdwb3J0YWw6UE9MSUNZX1NFUlZJQ0VfVVJMJyxcbiAgJ3BvcnRhbDpDTEFJTVNfU0VSVklDRV9VUkwnLFxuXG4gICdtaWdyYXRpb246TUlHUkFUSU9OX0ZFVENIX1NJWkUnLFxuICAnbWlncmF0aW9uOkRFRkFVTFRfSU5TVVJFUl9JRCcsXG4gICdtaWdyYXRpb246REVGQVVMVF9JTlNVUkVSX1JPTEVfSUQnLFxuICAnbWlncmF0aW9uOkRCX0RBVEFCQVNFJyxcbiAgJ21pZ3JhdGlvbjpEQl9QT09MX01BWCcsXG4gICdtaWdyYXRpb246TUlHUkFUSU9OX1BST0RVQ0VSX0NPTkNVUlJFTkNZJyxcbiAgJ21pZ3JhdGlvbjpNSUdSQVRJT05fQ09OU1VNRVJfQ09OQ1VSUkVOQ1knLFxuICAnbWlncmF0aW9uOk1JR1JBVElPTl9RVUVVRV9TSEFSRFMnLFxuICAnbWlncmF0aW9uOkJFTkVGSUNJQVJZX1BIT1RPU19VUkwnLFxuICAnbWlncmF0aW9uOlRQQV9CRU5FRklDSUFSWV9QSE9UT1NfVVJMJyxcbiAgJ21pZ3JhdGlvbjpFWFBJUkVEX1BPTElDWV9HUkFDRV9QRVJJT0RfTU9OVEhTJyxcbiAgJ21pZ3JhdGlvbjpDTEFJTVNfQkVORUZJVF9UWVBFX0ZBTExCQUNLJyxcbiAgJ21pZ3JhdGlvbjpIVFRQX01BWF9TT0NLRVRTJyxcbiAgJ21pZ3JhdGlvbjpSRVFVRVNUX1RJTUVPVVRfTVMnLFxuICAnbWlncmF0aW9uOlJFUVVFU1RfTUFYX1JFVFJJRVMnLFxuXTtcblxuY29uc3QgU1NNX1NFQ1VSRV9WQVJTOiBTc21LZXlbXSA9IFsnZ2xvYmFsOkRCX1BBU1NXT1JEJywgJ21pZ3JhdGlvbjpNSUdSQVRJT05fQVBJX0tFWSddO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFtYmRhRW52cyhzY29wZTogU3RhY2spOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgdmFycyA9IHtcbiAgICAuLi5sb29rdXBTc21QYXJhbWV0ZXJzKHNjb3BlLCBTU01fU1RSSU5HX1ZBUlMpLFxuICAgIC4uLmxvb2t1cFNzbVBhcmFtZXRlcnMoc2NvcGUsIFNTTV9TRUNVUkVfVkFSUywgdHJ1ZSksXG4gICAgRU5WOiBTdHJpbmcoYnVpbGRDb25maWc/LmVudk5hbWUpLFxuICB9O1xuICByZXR1cm4gdmFycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVjc0VudnMoc2NvcGU6IFN0YWNrKTogeyBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc2VjcmV0czogUmVjb3JkPHN0cmluZywgYXdzX2Vjcy5TZWNyZXQ+IH0ge1xuICBjb25zdCBlbnZpcm9ubWVudCA9IHtcbiAgICAuLi5sb29rdXBTc21QYXJhbWV0ZXJzKHNjb3BlLCBTU01fU1RSSU5HX1ZBUlMpLFxuICAgIEVOVjogU3RyaW5nKGJ1aWxkQ29uZmlnPy5lbnZOYW1lKSxcbiAgfTtcblxuICBjb25zdCBzZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBhd3NfZWNzLlNlY3JldD4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgU1NNX1NFQ1VSRV9WQVJTKSB7XG4gICAgY29uc3QgbmFtZSA9IHNzbU5hbWUoa2V5KTtcbiAgICBzZWNyZXRzW25hbWVdID0gYXdzX2Vjcy5TZWNyZXQuZnJvbVNzbVBhcmFtZXRlcihcbiAgICAgIGF3c19zc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TZWN1cmVTdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzKHNjb3BlLCBgRWNzU2VjcmV0JHtuYW1lfWAsIHtcbiAgICAgICAgcGFyYW1ldGVyTmFtZTogc3NtUGF0aChrZXkpLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHsgZW52aXJvbm1lbnQsIHNlY3JldHMgfTtcbn1cblxuZnVuY3Rpb24gc3NtTmFtZXNwYWNlKGtleTogU3NtS2V5KTogU3NtTmFtZXNwYWNlIHtcbiAgcmV0dXJuIGtleS5zdWJzdHJpbmcoMCwga2V5LmluZGV4T2YoJzonKSkgYXMgU3NtTmFtZXNwYWNlO1xufVxuXG5mdW5jdGlvbiBzc21OYW1lKGtleTogU3NtS2V5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoJzonKSArIDEpO1xufVxuXG5mdW5jdGlvbiBzc21QYXRoKGtleTogU3NtS2V5KTogc3RyaW5nIHtcbiAgY29uc3QgZW52ID0gYnVpbGRDb25maWc/LmVudk5hbWU7XG4gIHJldHVybiBgLyR7ZW52fS9taWNyb3NlcnZpY2VzLyR7c3NtTmFtZXNwYWNlKGtleSl9L2Vudi8ke3NzbU5hbWUoa2V5KX1gO1xufVxuXG5mdW5jdGlvbiBsb29rdXBTc21QYXJhbWV0ZXJzKHNjb3BlOiBTdGFjaywga2V5czogU3NtS2V5W10sIHNlY3VyZSA9IGZhbHNlKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShcbiAgICAoYWNjLCBrZXkpID0+IHtcbiAgICAgIGlmIChzZWN1cmUpIHtcbiAgICAgICAgYWNjW3NzbU5hbWUoa2V5KV0gPSBgc3NtOi8vJHtzc21QYXRoKGtleSl9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY1tzc21OYW1lKGtleSldID0gYXdzX3NzbS5TdHJpbmdQYXJhbWV0ZXIudmFsdWVGcm9tTG9va3VwKHNjb3BlLCBzc21QYXRoKGtleSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgKTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glicogh/healthcare-cdk",
3
- "version": "0.1.88",
3
+ "version": "0.1.89",
4
4
  "description": "CDK automations",
5
5
  "bin": {
6
6
  "cdk": "bin/cdk.js"
@@ -17,6 +17,7 @@
17
17
  "@types/jest": "^29.5.12",
18
18
  "@types/node": "20.14.9",
19
19
  "aws-cdk": "^2.155.0",
20
+ "esbuild": "^0.21.5",
20
21
  "jest": "^29.7.0",
21
22
  "ts-jest": "^29.1.5",
22
23
  "ts-node": "^10.9.2",