@jjrawlins/cdk-diff-pr-github-action 1.1.5 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +94 -18
- package/API.md +148 -12
- package/README.md +115 -20
- package/lib/CdkDiffIamTemplate.d.ts +51 -5
- package/lib/CdkDiffIamTemplate.js +239 -8
- package/lib/CdkDiffIamTemplateStackSet.js +2 -2
- package/lib/CdkDiffStackWorkflow.js +1 -1
- package/lib/CdkDriftDetectionWorkflow.js +1 -1
- package/lib/CdkDriftIamTemplate.js +2 -2
- package/node_modules/@aws-sdk/client-cloudformation/package.json +6 -6
- package/node_modules/@aws-sdk/client-sso/package.json +5 -5
- package/node_modules/@aws-sdk/core/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-env/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-http/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-ini/package.json +9 -9
- package/node_modules/@aws-sdk/credential-provider-login/package.json +3 -3
- package/node_modules/@aws-sdk/credential-provider-node/package.json +7 -7
- package/node_modules/@aws-sdk/credential-provider-process/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-sso/package.json +4 -4
- package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +3 -3
- package/node_modules/@aws-sdk/middleware-user-agent/package.json +3 -3
- package/node_modules/@aws-sdk/nested-clients/package.json +5 -5
- package/node_modules/@aws-sdk/token-providers/package.json +3 -3
- package/node_modules/@aws-sdk/util-endpoints/package.json +1 -1
- package/node_modules/@aws-sdk/util-user-agent-node/package.json +2 -2
- package/node_modules/@aws-sdk/xml-builder/package.json +2 -2
- package/package.json +3 -3
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/LICENSE +0 -201
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/README.md +0 -6
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-cjs/index.js +0 -415
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/aws/partitions.json +0 -267
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/aws.js +0 -10
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/index.js +0 -6
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/lib/aws/index.js +0 -3
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/lib/aws/isVirtualHostableS3Bucket.js +0 -25
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/lib/aws/parseArn.js +0 -18
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/lib/aws/partition.js +0 -41
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/lib/aws/partitions.json +0 -267
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/lib/isIpAddress.js +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/resolveDefaultAwsRegionalEndpointsConfig.js +0 -21
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/resolveEndpoint.js +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/types/EndpointError.js +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/types/EndpointRuleObject.js +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/types/ErrorRuleObject.js +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/types/RuleSetObject.js +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/types/TreeRuleObject.js +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/types/index.js +0 -6
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-es/types/shared.js +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/aws.d.ts +0 -2
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/index.d.ts +0 -6
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/lib/aws/index.d.ts +0 -3
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/lib/aws/isVirtualHostableS3Bucket.d.ts +0 -5
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/lib/aws/parseArn.d.ts +0 -7
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/lib/aws/partition.d.ts +0 -38
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/lib/isIpAddress.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/resolveDefaultAwsRegionalEndpointsConfig.d.ts +0 -56
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/resolveEndpoint.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/aws.d.ts +0 -2
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/index.d.ts +0 -6
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/lib/aws/index.d.ts +0 -3
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/lib/aws/isVirtualHostableS3Bucket.d.ts +0 -4
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/lib/aws/parseArn.d.ts +0 -2
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/lib/aws/partition.d.ts +0 -28
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/lib/isIpAddress.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/resolveDefaultAwsRegionalEndpointsConfig.d.ts +0 -35
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/resolveEndpoint.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/types/EndpointError.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/types/EndpointRuleObject.d.ts +0 -6
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/types/ErrorRuleObject.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/types/RuleSetObject.d.ts +0 -5
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/types/TreeRuleObject.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/types/index.d.ts +0 -6
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/ts3.4/types/shared.d.ts +0 -12
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/types/EndpointError.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/types/EndpointRuleObject.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/types/ErrorRuleObject.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/types/RuleSetObject.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/types/TreeRuleObject.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/types/index.d.ts +0 -6
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/dist-types/types/shared.d.ts +0 -1
- package/node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints/package.json +0 -60
package/README.md
CHANGED
|
@@ -107,9 +107,16 @@ If neither top‑level OIDC defaults nor all per‑stack values are supplied, th
|
|
|
107
107
|
|
|
108
108
|
## Usage: CdkDiffIamTemplate
|
|
109
109
|
|
|
110
|
-
Emit an
|
|
110
|
+
Emit an IAM template you can deploy in your account for the Change Set workflow. Supports two modes:
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
1. **External OIDC Role** — Reference an existing GitHub OIDC role (original behavior)
|
|
113
|
+
2. **Self-Contained** — Create the GitHub OIDC provider and role within the same template (new)
|
|
114
|
+
|
|
115
|
+
### Option 1: Using an Existing OIDC Role (External)
|
|
116
|
+
|
|
117
|
+
Use this when you already have a GitHub OIDC provider and role set up in your account.
|
|
118
|
+
|
|
119
|
+
#### With Projen
|
|
113
120
|
|
|
114
121
|
```ts
|
|
115
122
|
import { awscdk } from 'projen';
|
|
@@ -131,13 +138,7 @@ new CdkDiffIamTemplate({
|
|
|
131
138
|
project.synth();
|
|
132
139
|
```
|
|
133
140
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
```bash
|
|
137
|
-
npx projen deploy-cdkdiff-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### Without Projen (Standalone Generator)
|
|
141
|
+
#### Without Projen (Standalone Generator)
|
|
141
142
|
|
|
142
143
|
```ts
|
|
143
144
|
import { CdkDiffIamTemplateGenerator } from '@jjrawlins/cdk-diff-pr-github-action';
|
|
@@ -150,22 +151,116 @@ const template = CdkDiffIamTemplateGenerator.generateTemplate({
|
|
|
150
151
|
});
|
|
151
152
|
|
|
152
153
|
fs.writeFileSync('cdk-diff-iam-template.yaml', template);
|
|
154
|
+
```
|
|
153
155
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
156
|
+
### Option 2: Self-Contained Template (Create OIDC Role)
|
|
157
|
+
|
|
158
|
+
Use this when you want a single template that creates everything needed — the GitHub OIDC provider, OIDC role, and changeset role. This simplifies deployment and pairs well with the `CdkDiffStackWorkflow`.
|
|
159
|
+
|
|
160
|
+
#### With Projen
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
import { awscdk } from 'projen';
|
|
164
|
+
import { CdkDiffIamTemplate } from '@jjrawlins/cdk-diff-pr-github-action';
|
|
165
|
+
|
|
166
|
+
const project = new awscdk.AwsCdkConstructLibrary({
|
|
167
|
+
// ...
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
new CdkDiffIamTemplate({
|
|
171
|
+
project,
|
|
172
|
+
roleName: 'CdkChangesetRole',
|
|
173
|
+
createOidcRole: true,
|
|
174
|
+
oidcRoleName: 'GitHubOIDCRole', // Optional, default: 'GitHubOIDCRole'
|
|
175
|
+
githubOidc: {
|
|
176
|
+
owner: 'my-org', // GitHub org or username
|
|
177
|
+
repositories: ['infra-repo', 'app-repo'], // Repos allowed to assume roles
|
|
178
|
+
branches: ['main', 'release/*'], // Branch patterns (default: ['*'])
|
|
179
|
+
},
|
|
180
|
+
// Optional: Skip OIDC provider creation if it already exists
|
|
181
|
+
// skipOidcProviderCreation: true,
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
project.synth();
|
|
157
185
|
```
|
|
158
186
|
|
|
159
|
-
|
|
187
|
+
#### Without Projen (Standalone Generator)
|
|
160
188
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
189
|
+
```ts
|
|
190
|
+
import { CdkDiffIamTemplateGenerator } from '@jjrawlins/cdk-diff-pr-github-action';
|
|
191
|
+
import * as fs from 'fs';
|
|
192
|
+
|
|
193
|
+
const template = CdkDiffIamTemplateGenerator.generateTemplate({
|
|
194
|
+
roleName: 'CdkChangesetRole',
|
|
195
|
+
createOidcRole: true,
|
|
196
|
+
oidcRoleName: 'GitHubOIDCRole',
|
|
197
|
+
githubOidc: {
|
|
198
|
+
owner: 'my-org',
|
|
199
|
+
repositories: ['infra-repo'],
|
|
200
|
+
branches: ['main'],
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
fs.writeFileSync('cdk-diff-iam-template.yaml', template);
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
#### With Existing OIDC Provider (Skip Creation)
|
|
208
|
+
|
|
209
|
+
If your account already has a GitHub OIDC provider but you want the template to create the roles:
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
new CdkDiffIamTemplate({
|
|
213
|
+
project,
|
|
214
|
+
roleName: 'CdkChangesetRole',
|
|
215
|
+
createOidcRole: true,
|
|
216
|
+
skipOidcProviderCreation: true, // Account already has OIDC provider
|
|
217
|
+
githubOidc: {
|
|
218
|
+
owner: 'my-org',
|
|
219
|
+
repositories: ['*'], // All repos in org
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Deploy Task
|
|
225
|
+
|
|
226
|
+
A Projen task is added for easy deployment:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
npx projen deploy-cdkdiff-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args
|
|
230
|
+
```
|
|
167
231
|
|
|
168
|
-
|
|
232
|
+
### CdkDiffIamTemplate Props
|
|
233
|
+
|
|
234
|
+
| Property | Type | Description |
|
|
235
|
+
|----------|------|-------------|
|
|
236
|
+
| `roleName` | `string` | Name for the changeset IAM role (required) |
|
|
237
|
+
| `oidcRoleArn` | `string?` | ARN of existing GitHub OIDC role. Required when `createOidcRole` is false. |
|
|
238
|
+
| `oidcRegion` | `string?` | Region for OIDC trust condition. Required when `createOidcRole` is false. |
|
|
239
|
+
| `createOidcRole` | `boolean?` | Create OIDC role within template (default: false) |
|
|
240
|
+
| `oidcRoleName` | `string?` | Name of OIDC role to create (default: 'GitHubOIDCRole') |
|
|
241
|
+
| `githubOidc` | `GitHubOidcConfig?` | GitHub OIDC config. Required when `createOidcRole` is true. |
|
|
242
|
+
| `skipOidcProviderCreation` | `boolean?` | Skip OIDC provider if it exists (default: false) |
|
|
243
|
+
| `outputPath` | `string?` | Template output path (default: 'cdk-diff-workflow-iam-template.yaml') |
|
|
244
|
+
|
|
245
|
+
### What the Template Creates
|
|
246
|
+
|
|
247
|
+
**External OIDC Role mode:**
|
|
248
|
+
- Parameter `GitHubOIDCRoleArn` — ARN of your existing GitHub OIDC role
|
|
249
|
+
- IAM role `CdkChangesetRole` with minimal permissions for change set operations
|
|
250
|
+
- Outputs: `CdkChangesetRoleArn`, `CdkChangesetRoleName`
|
|
251
|
+
|
|
252
|
+
**Self-Contained mode (`createOidcRole: true`):**
|
|
253
|
+
- GitHub OIDC Provider (unless `skipOidcProviderCreation: true`)
|
|
254
|
+
- IAM role `GitHubOIDCRole` with trust policy for GitHub Actions
|
|
255
|
+
- IAM role `CdkChangesetRole` with minimal permissions (trusts the OIDC role)
|
|
256
|
+
- Outputs: `GitHubOIDCProviderArn`, `GitHubOIDCRoleArn`, `GitHubOIDCRoleName`, `CdkChangesetRoleArn`, `CdkChangesetRoleName`
|
|
257
|
+
|
|
258
|
+
**Changeset Role Permissions:**
|
|
259
|
+
- CloudFormation Change Set operations
|
|
260
|
+
- Access to CDK bootstrap S3 buckets and SSM parameters
|
|
261
|
+
- `iam:PassRole` to `cloudformation.amazonaws.com`
|
|
262
|
+
|
|
263
|
+
Use the created changeset role ARN as `changesetRoleToAssumeArn` in `CdkDiffStackWorkflow`.
|
|
169
264
|
|
|
170
265
|
---
|
|
171
266
|
|
|
@@ -1,13 +1,44 @@
|
|
|
1
|
+
import { GitHubOidcConfig } from './CdkDiffIamTemplateStackSet';
|
|
1
2
|
/**
|
|
2
3
|
* Props for generating CDK Diff IAM templates (no Projen dependency)
|
|
3
4
|
*/
|
|
4
5
|
export interface CdkDiffIamTemplateGeneratorProps {
|
|
5
|
-
/** Name for the IAM role */
|
|
6
|
+
/** Name for the changeset IAM role */
|
|
6
7
|
readonly roleName: string;
|
|
7
|
-
/**
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
/**
|
|
9
|
+
* ARN of the existing GitHub OIDC role that can assume this changeset role.
|
|
10
|
+
* Required when createOidcRole is false or undefined.
|
|
11
|
+
*/
|
|
12
|
+
readonly oidcRoleArn?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Region for the OIDC trust condition.
|
|
15
|
+
* Only used when oidcRoleArn is provided (external OIDC role).
|
|
16
|
+
*/
|
|
17
|
+
readonly oidcRegion?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Create a GitHub OIDC role within this template instead of using an existing one.
|
|
20
|
+
* When true, githubOidc configuration is required and oidcRoleArn is ignored.
|
|
21
|
+
* Default: false
|
|
22
|
+
*/
|
|
23
|
+
readonly createOidcRole?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Name of the GitHub OIDC role to create.
|
|
26
|
+
* Only used when createOidcRole is true.
|
|
27
|
+
* Default: 'GitHubOIDCRole'
|
|
28
|
+
*/
|
|
29
|
+
readonly oidcRoleName?: string;
|
|
30
|
+
/**
|
|
31
|
+
* GitHub OIDC configuration for repo/branch restrictions.
|
|
32
|
+
* Required when createOidcRole is true.
|
|
33
|
+
*/
|
|
34
|
+
readonly githubOidc?: GitHubOidcConfig;
|
|
35
|
+
/**
|
|
36
|
+
* Skip creating the OIDC provider (use existing one).
|
|
37
|
+
* Set to true if the account already has a GitHub OIDC provider.
|
|
38
|
+
* Only used when createOidcRole is true.
|
|
39
|
+
* Default: false
|
|
40
|
+
*/
|
|
41
|
+
readonly skipOidcProviderCreation?: boolean;
|
|
11
42
|
}
|
|
12
43
|
/**
|
|
13
44
|
* Pure generator class for CDK Diff IAM templates.
|
|
@@ -22,6 +53,21 @@ export declare class CdkDiffIamTemplateGenerator {
|
|
|
22
53
|
* Generate the AWS CLI deploy command for the IAM template.
|
|
23
54
|
*/
|
|
24
55
|
static generateDeployCommand(templatePath?: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Generate template that creates OIDC provider and role (self-contained)
|
|
58
|
+
*/
|
|
59
|
+
private static generateTemplateWithOidcRole;
|
|
60
|
+
/**
|
|
61
|
+
* Generate template that uses an external OIDC role (original behavior)
|
|
62
|
+
*/
|
|
63
|
+
private static generateTemplateWithExternalOidcRole;
|
|
64
|
+
private static generateOidcProviderLines;
|
|
65
|
+
private static generateOidcRoleLines;
|
|
66
|
+
private static buildSubjectClaims;
|
|
67
|
+
private static generateChangesetRoleWithOidcRef;
|
|
68
|
+
private static generateOidcProviderOutputLines;
|
|
69
|
+
private static generateOidcRoleOutputLines;
|
|
70
|
+
private static generateChangesetOutputLines;
|
|
25
71
|
}
|
|
26
72
|
/**
|
|
27
73
|
* Props for the Projen-integrated CDK Diff IAM template construct
|
|
@@ -13,6 +13,69 @@ class CdkDiffIamTemplateGenerator {
|
|
|
13
13
|
* Generate the CloudFormation IAM template as a YAML string.
|
|
14
14
|
*/
|
|
15
15
|
static generateTemplate(props) {
|
|
16
|
+
const createOidcRole = props.createOidcRole ?? false;
|
|
17
|
+
// Validate props
|
|
18
|
+
if (createOidcRole) {
|
|
19
|
+
if (!props.githubOidc) {
|
|
20
|
+
throw new Error('githubOidc configuration is required when createOidcRole is true');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
if (!props.oidcRoleArn) {
|
|
25
|
+
throw new Error('oidcRoleArn is required when createOidcRole is false');
|
|
26
|
+
}
|
|
27
|
+
if (!props.oidcRegion) {
|
|
28
|
+
throw new Error('oidcRegion is required when createOidcRole is false');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (createOidcRole) {
|
|
32
|
+
return this.generateTemplateWithOidcRole(props);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return this.generateTemplateWithExternalOidcRole(props);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Generate the AWS CLI deploy command for the IAM template.
|
|
40
|
+
*/
|
|
41
|
+
static generateDeployCommand(templatePath = 'cdk-diff-workflow-iam-template.yaml') {
|
|
42
|
+
return `aws cloudformation deploy --template-file ${templatePath} --stack-name cdk-diff-workflow-iam-role --capabilities CAPABILITY_NAMED_IAM`;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generate template that creates OIDC provider and role (self-contained)
|
|
46
|
+
*/
|
|
47
|
+
static generateTemplateWithOidcRole(props) {
|
|
48
|
+
const oidcRoleName = props.oidcRoleName ?? 'GitHubOIDCRole';
|
|
49
|
+
const skipOidcProvider = props.skipOidcProviderCreation ?? false;
|
|
50
|
+
const githubOidc = props.githubOidc;
|
|
51
|
+
const lines = [
|
|
52
|
+
"AWSTemplateFormatVersion: '2010-09-09'",
|
|
53
|
+
"Description: 'GitHub OIDC and IAM roles for CDK Diff Stack Workflow construct'",
|
|
54
|
+
'',
|
|
55
|
+
'Resources:',
|
|
56
|
+
];
|
|
57
|
+
// OIDC Provider (only if not skipping)
|
|
58
|
+
if (!skipOidcProvider) {
|
|
59
|
+
lines.push(...this.generateOidcProviderLines());
|
|
60
|
+
}
|
|
61
|
+
// OIDC Role
|
|
62
|
+
lines.push(...this.generateOidcRoleLines(oidcRoleName, githubOidc, skipOidcProvider));
|
|
63
|
+
// Changeset Role (trusts the created OIDC role)
|
|
64
|
+
lines.push(...this.generateChangesetRoleWithOidcRef(props.roleName));
|
|
65
|
+
// Outputs
|
|
66
|
+
lines.push('');
|
|
67
|
+
lines.push('Outputs:');
|
|
68
|
+
if (!skipOidcProvider) {
|
|
69
|
+
lines.push(...this.generateOidcProviderOutputLines());
|
|
70
|
+
}
|
|
71
|
+
lines.push(...this.generateOidcRoleOutputLines());
|
|
72
|
+
lines.push(...this.generateChangesetOutputLines());
|
|
73
|
+
return lines.join('\n');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Generate template that uses an external OIDC role (original behavior)
|
|
77
|
+
*/
|
|
78
|
+
static generateTemplateWithExternalOidcRole(props) {
|
|
16
79
|
const lines = [
|
|
17
80
|
"AWSTemplateFormatVersion: '2010-09-09'",
|
|
18
81
|
"Description: 'IAM role for CDK Diff Stack Workflow construct'",
|
|
@@ -94,16 +157,184 @@ class CdkDiffIamTemplateGenerator {
|
|
|
94
157
|
];
|
|
95
158
|
return lines.join('\n');
|
|
96
159
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
160
|
+
static generateOidcProviderLines() {
|
|
161
|
+
return [
|
|
162
|
+
' # GitHub OIDC Provider',
|
|
163
|
+
' GitHubOIDCProvider:',
|
|
164
|
+
' Type: AWS::IAM::OIDCProvider',
|
|
165
|
+
' Properties:',
|
|
166
|
+
' Url: https://token.actions.githubusercontent.com',
|
|
167
|
+
' ClientIdList:',
|
|
168
|
+
' - sts.amazonaws.com',
|
|
169
|
+
' ThumbprintList:',
|
|
170
|
+
' - 6938fd4d98bab03faadb97b34396831e3780aea1',
|
|
171
|
+
' - 1c58a3a8518e8759bf075b76b750d4f2df264fcd',
|
|
172
|
+
'',
|
|
173
|
+
];
|
|
174
|
+
}
|
|
175
|
+
static generateOidcRoleLines(roleName, githubOidc, skipOidcProvider = false) {
|
|
176
|
+
const subjectClaims = this.buildSubjectClaims(githubOidc);
|
|
177
|
+
const lines = [
|
|
178
|
+
' # GitHub OIDC Role - authenticates GitHub Actions workflows',
|
|
179
|
+
' GitHubOIDCRole:',
|
|
180
|
+
' Type: AWS::IAM::Role',
|
|
181
|
+
];
|
|
182
|
+
// Only add DependsOn if we're creating the provider
|
|
183
|
+
if (!skipOidcProvider) {
|
|
184
|
+
lines.push(' DependsOn: GitHubOIDCProvider');
|
|
185
|
+
}
|
|
186
|
+
lines.push(' Properties:', " RoleName: '" + roleName + "'", ' AssumeRolePolicyDocument:', " Version: '2012-10-17'", ' Statement:', ' - Effect: Allow', ' Principal:', " Federated: !Sub 'arn:aws:iam::${AWS::AccountId}:oidc-provider/token.actions.githubusercontent.com'", ' Action: sts:AssumeRoleWithWebIdentity', ' Condition:', ' StringEquals:', " 'token.actions.githubusercontent.com:aud': 'sts.amazonaws.com'", ' StringLike:', " 'token.actions.githubusercontent.com:sub':");
|
|
187
|
+
// Add subject claims
|
|
188
|
+
for (const claim of subjectClaims) {
|
|
189
|
+
lines.push(` - '${claim}'`);
|
|
190
|
+
}
|
|
191
|
+
lines.push('');
|
|
192
|
+
return lines;
|
|
193
|
+
}
|
|
194
|
+
static buildSubjectClaims(githubOidc) {
|
|
195
|
+
const claims = [];
|
|
196
|
+
const branches = githubOidc.branches ?? ['*'];
|
|
197
|
+
for (const repo of githubOidc.repositories) {
|
|
198
|
+
if (repo === '*') {
|
|
199
|
+
// Wildcard repo - allow all repos with branch restrictions
|
|
200
|
+
for (const branch of branches) {
|
|
201
|
+
if (branch === '*') {
|
|
202
|
+
claims.push(`repo:${githubOidc.owner}/*`);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
claims.push(`repo:${githubOidc.owner}/*:ref:refs/heads/${branch}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
// Specific repo
|
|
211
|
+
for (const branch of branches) {
|
|
212
|
+
if (branch === '*') {
|
|
213
|
+
claims.push(`repo:${githubOidc.owner}/${repo}:*`);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
claims.push(`repo:${githubOidc.owner}/${repo}:ref:refs/heads/${branch}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Add any additional claims
|
|
222
|
+
if (githubOidc.additionalClaims) {
|
|
223
|
+
for (const claim of githubOidc.additionalClaims) {
|
|
224
|
+
for (const repo of githubOidc.repositories) {
|
|
225
|
+
if (repo === '*') {
|
|
226
|
+
claims.push(`repo:${githubOidc.owner}/*:${claim}`);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
claims.push(`repo:${githubOidc.owner}/${repo}:${claim}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return claims;
|
|
235
|
+
}
|
|
236
|
+
static generateChangesetRoleWithOidcRef(roleName) {
|
|
237
|
+
return [
|
|
238
|
+
' # CloudFormation ChangeSet Role - minimal permissions for changeset operations',
|
|
239
|
+
' CdkChangesetRole:',
|
|
240
|
+
' Type: AWS::IAM::Role',
|
|
241
|
+
' DependsOn: GitHubOIDCRole',
|
|
242
|
+
' Properties:',
|
|
243
|
+
" RoleName: '" + roleName + "'",
|
|
244
|
+
' AssumeRolePolicyDocument:',
|
|
245
|
+
" Version: '2012-10-17'",
|
|
246
|
+
' Statement:',
|
|
247
|
+
' - Effect: Allow',
|
|
248
|
+
' Principal:',
|
|
249
|
+
' AWS: !GetAtt GitHubOIDCRole.Arn',
|
|
250
|
+
' Action: sts:AssumeRole',
|
|
251
|
+
' Policies:',
|
|
252
|
+
' - PolicyName: CloudFormationChangeSetAccess',
|
|
253
|
+
' PolicyDocument:',
|
|
254
|
+
" Version: '2012-10-17'",
|
|
255
|
+
' Statement:',
|
|
256
|
+
' # CloudFormation changeset operations',
|
|
257
|
+
' - Effect: Allow',
|
|
258
|
+
' Action:',
|
|
259
|
+
' - cloudformation:CreateChangeSet',
|
|
260
|
+
' - cloudformation:DescribeChangeSet',
|
|
261
|
+
' - cloudformation:DeleteChangeSet',
|
|
262
|
+
' - cloudformation:ListChangeSets',
|
|
263
|
+
' - cloudformation:DescribeStacks',
|
|
264
|
+
" Resource: '*'",
|
|
265
|
+
' # CDK bootstrap bucket access (for changeset creation)',
|
|
266
|
+
' - Effect: Allow',
|
|
267
|
+
' Action:',
|
|
268
|
+
' - s3:GetObject',
|
|
269
|
+
' - s3:PutObject',
|
|
270
|
+
' - s3:DeleteObject',
|
|
271
|
+
' - s3:ListBucket',
|
|
272
|
+
' Resource:',
|
|
273
|
+
" - !Sub 'arn:aws:s3:::cdk-${AWS::AccountId}-${AWS::Region}-*'",
|
|
274
|
+
" - !Sub 'arn:aws:s3:::cdk-${AWS::AccountId}-${AWS::Region}-*/*'",
|
|
275
|
+
' # CDK bootstrap parameter access',
|
|
276
|
+
' - Effect: Allow',
|
|
277
|
+
' Action:',
|
|
278
|
+
' - ssm:GetParameter',
|
|
279
|
+
' - ssm:GetParameters',
|
|
280
|
+
' - ssm:GetParametersByPath',
|
|
281
|
+
" Resource: !Sub 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/cdk-bootstrap/*'",
|
|
282
|
+
' # IAM PassRole for CDK operations',
|
|
283
|
+
' - Effect: Allow',
|
|
284
|
+
' Action:',
|
|
285
|
+
' - iam:PassRole',
|
|
286
|
+
" Resource: '*'",
|
|
287
|
+
' Condition:',
|
|
288
|
+
' StringEquals:',
|
|
289
|
+
" 'iam:PassedToService': 'cloudformation.amazonaws.com'",
|
|
290
|
+
'',
|
|
291
|
+
];
|
|
292
|
+
}
|
|
293
|
+
static generateOidcProviderOutputLines() {
|
|
294
|
+
return [
|
|
295
|
+
' GitHubOIDCProviderArn:',
|
|
296
|
+
" Description: 'ARN of the GitHub OIDC provider'",
|
|
297
|
+
' Value: !GetAtt GitHubOIDCProvider.Arn',
|
|
298
|
+
' Export:',
|
|
299
|
+
" Name: !Sub '${AWS::StackName}-GitHubOIDCProviderArn'",
|
|
300
|
+
'',
|
|
301
|
+
];
|
|
302
|
+
}
|
|
303
|
+
static generateOidcRoleOutputLines() {
|
|
304
|
+
return [
|
|
305
|
+
' GitHubOIDCRoleArn:',
|
|
306
|
+
" Description: 'ARN of the GitHub OIDC role'",
|
|
307
|
+
' Value: !GetAtt GitHubOIDCRole.Arn',
|
|
308
|
+
' Export:',
|
|
309
|
+
" Name: !Sub '${AWS::StackName}-GitHubOIDCRoleArn'",
|
|
310
|
+
'',
|
|
311
|
+
' GitHubOIDCRoleName:',
|
|
312
|
+
" Description: 'Name of the GitHub OIDC role'",
|
|
313
|
+
' Value: !Ref GitHubOIDCRole',
|
|
314
|
+
' Export:',
|
|
315
|
+
" Name: !Sub '${AWS::StackName}-GitHubOIDCRoleName'",
|
|
316
|
+
'',
|
|
317
|
+
];
|
|
318
|
+
}
|
|
319
|
+
static generateChangesetOutputLines() {
|
|
320
|
+
return [
|
|
321
|
+
' CdkChangesetRoleArn:',
|
|
322
|
+
" Description: 'ARN of the CDK changeset role'",
|
|
323
|
+
' Value: !GetAtt CdkChangesetRole.Arn',
|
|
324
|
+
' Export:',
|
|
325
|
+
" Name: !Sub '${AWS::StackName}-CdkChangesetRoleArn'",
|
|
326
|
+
'',
|
|
327
|
+
' CdkChangesetRoleName:',
|
|
328
|
+
" Description: 'Name of the CDK changeset role'",
|
|
329
|
+
' Value: !Ref CdkChangesetRole',
|
|
330
|
+
' Export:',
|
|
331
|
+
" Name: !Sub '${AWS::StackName}-CdkChangesetRoleName'",
|
|
332
|
+
];
|
|
102
333
|
}
|
|
103
334
|
}
|
|
104
335
|
exports.CdkDiffIamTemplateGenerator = CdkDiffIamTemplateGenerator;
|
|
105
336
|
_a = JSII_RTTI_SYMBOL_1;
|
|
106
|
-
CdkDiffIamTemplateGenerator[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplateGenerator", version: "1.
|
|
337
|
+
CdkDiffIamTemplateGenerator[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplateGenerator", version: "1.2.0" };
|
|
107
338
|
/**
|
|
108
339
|
* Projen construct that emits a CloudFormation template with minimal IAM permissions
|
|
109
340
|
* for the CDK Diff Stack Workflow.
|
|
@@ -126,5 +357,5 @@ class CdkDiffIamTemplate {
|
|
|
126
357
|
}
|
|
127
358
|
exports.CdkDiffIamTemplate = CdkDiffIamTemplate;
|
|
128
359
|
_b = JSII_RTTI_SYMBOL_1;
|
|
129
|
-
CdkDiffIamTemplate[_b] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplate", version: "1.
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRGlmZklhbVRlbXBsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Nka0RpZmZJYW1UZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFrQztBQWNsQzs7O0dBR0c7QUFDSCxNQUFhLDJCQUEyQjtJQUN0Qzs7T0FFRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUF1QztRQUM3RCxNQUFNLEtBQUssR0FBRztZQUNaLHdDQUF3QztZQUN4QywrREFBK0Q7WUFDL0QsRUFBRTtZQUNGLGFBQWE7WUFDYixzQkFBc0I7WUFDdEIsa0JBQWtCO1lBQ2xCLDZGQUE2RjtZQUM3RixpQkFBaUIsS0FBSyxDQUFDLFdBQVcsR0FBRztZQUNyQyxFQUFFO1lBQ0YsWUFBWTtZQUNaLGtGQUFrRjtZQUNsRixxQkFBcUI7WUFDckIsMEJBQTBCO1lBQzFCLGlCQUFpQjtZQUNqQixtQkFBbUIsR0FBRyxLQUFLLENBQUMsUUFBUSxHQUFHLEdBQUc7WUFDMUMsaUNBQWlDO1lBQ2pDLCtCQUErQjtZQUMvQixvQkFBb0I7WUFDcEIsMkJBQTJCO1lBQzNCLHdCQUF3QjtZQUN4QiwyQ0FBMkM7WUFDM0Msb0NBQW9DO1lBQ3BDLHdCQUF3QjtZQUN4Qiw2QkFBNkI7WUFDN0Isd0NBQXdDLEdBQUcsS0FBSyxDQUFDLFVBQVUsR0FBRyxHQUFHO1lBQ2pFLGlCQUFpQjtZQUNqQixxREFBcUQ7WUFDckQsMkJBQTJCO1lBQzNCLG1DQUFtQztZQUNuQyx3QkFBd0I7WUFDeEIscURBQXFEO1lBQ3JELCtCQUErQjtZQUMvQix5QkFBeUI7WUFDekIsb0RBQW9EO1lBQ3BELHNEQUFzRDtZQUN0RCxvREFBb0Q7WUFDcEQsbURBQW1EO1lBQ25ELG1EQUFtRDtZQUNuRCwrQkFBK0I7WUFDL0Isc0VBQXNFO1lBQ3RFLCtCQUErQjtZQUMvQix5QkFBeUI7WUFDekIsa0NBQWtDO1lBQ2xDLGtDQUFrQztZQUNsQyxxQ0FBcUM7WUFDckMsbUNBQW1DO1lBQ25DLDJCQUEyQjtZQUMzQixnRkFBZ0Y7WUFDaEYsa0ZBQWtGO1lBQ2xGLGdEQUFnRDtZQUNoRCwrQkFBK0I7WUFDL0IseUJBQXlCO1lBQ3pCLHNDQUFzQztZQUN0Qyx1Q0FBdUM7WUFDdkMsNkNBQTZDO1lBQzdDLHlHQUF5RztZQUN6RyxpREFBaUQ7WUFDakQsK0JBQStCO1lBQy9CLHlCQUF5QjtZQUN6QixrQ0FBa0M7WUFDbEMsK0JBQStCO1lBQy9CLDRCQUE0QjtZQUM1QixpQ0FBaUM7WUFDakMsMkVBQTJFO1lBQzNFLEVBQUU7WUFDRixVQUFVO1lBQ1Ysd0JBQXdCO1lBQ3hCLGtEQUFrRDtZQUNsRCx5Q0FBeUM7WUFDekMsYUFBYTtZQUNiLDBEQUEwRDtZQUMxRCxFQUFFO1lBQ0YseUJBQXlCO1lBQ3pCLG1EQUFtRDtZQUNuRCxrQ0FBa0M7WUFDbEMsYUFBYTtZQUNiLDJEQUEyRDtTQUM1RCxDQUFDO1FBRUYsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxlQUF1QixxQ0FBcUM7UUFDdkYsT0FBTyw2Q0FBNkMsWUFBWSw4RUFBOEUsQ0FBQztJQUNqSixDQUFDOztBQTdGSCxrRUE4RkM7OztBQVlEOzs7OztHQUtHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDN0IsWUFBWSxLQUE4QjtRQUN4QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLHFDQUFxQyxDQUFDO1FBRTdFLHdDQUF3QztRQUN4QyxNQUFNLFFBQVEsR0FBRywyQkFBMkIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRSxJQUFJLGlCQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFekUsa0JBQWtCO1FBQ2xCLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLDZCQUE2QixFQUFFO1lBQ25ELFdBQVcsRUFDVCw0SEFBNEg7WUFDOUgsV0FBVyxFQUFFLElBQUk7WUFDakIsSUFBSSxFQUFFLDJCQUEyQixDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQztTQUNwRSxDQUFDLENBQUM7SUFDTCxDQUFDOztBQWZILGdEQWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRleHRGaWxlIH0gZnJvbSAncHJvamVuJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgZ2VuZXJhdGluZyBDREsgRGlmZiBJQU0gdGVtcGxhdGVzIChubyBQcm9qZW4gZGVwZW5kZW5jeSlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGtEaWZmSWFtVGVtcGxhdGVHZW5lcmF0b3JQcm9wcyB7XG4gIC8qKiBOYW1lIGZvciB0aGUgSUFNIHJvbGUgKi9cbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZztcbiAgLyoqIEFSTiBvZiB0aGUgZXhpc3RpbmcgR2l0SHViIE9JREMgcm9sZSB0aGF0IGNhbiBhc3N1bWUgdGhpcyBjaGFuZ2VzZXQgcm9sZSAqL1xuICByZWFkb25seSBvaWRjUm9sZUFybjogc3RyaW5nO1xuICAvKiogUmVnaW9uIGZvciB0aGUgT0lEQyB0cnVzdCBjb25kaXRpb24gKi9cbiAgcmVhZG9ubHkgb2lkY1JlZ2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFB1cmUgZ2VuZXJhdG9yIGNsYXNzIGZvciBDREsgRGlmZiBJQU0gdGVtcGxhdGVzLlxuICogTm8gUHJvamVuIGRlcGVuZGVuY3kgLSBjYW4gYmUgdXNlZCBpbiBhbnkgcHJvamVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvciB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0aGUgQ2xvdWRGb3JtYXRpb24gSUFNIHRlbXBsYXRlIGFzIGEgWUFNTCBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2VuZXJhdGVUZW1wbGF0ZShwcm9wczogQ2RrRGlmZklhbVRlbXBsYXRlR2VuZXJhdG9yUHJvcHMpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgXCJBV1NUZW1wbGF0ZUZvcm1hdFZlcnNpb246ICcyMDEwLTA5LTA5J1wiLFxuICAgICAgXCJEZXNjcmlwdGlvbjogJ0lBTSByb2xlIGZvciBDREsgRGlmZiBTdGFjayBXb3JrZmxvdyBjb25zdHJ1Y3QnXCIsXG4gICAgICAnJyxcbiAgICAgICdQYXJhbWV0ZXJzOicsXG4gICAgICAnICBHaXRIdWJPSURDUm9sZUFybjonLFxuICAgICAgJyAgICBUeXBlOiBTdHJpbmcnLFxuICAgICAgXCIgICAgRGVzY3JpcHRpb246ICdBUk4gb2YgdGhlIGV4aXN0aW5nIEdpdEh1YiBPSURDIHJvbGUgdGhhdCBjYW4gYXNzdW1lIHRoaXMgY2hhbmdlc2V0IHJvbGUnXCIsXG4gICAgICBgICAgIERlZmF1bHQ6ICcke3Byb3BzLm9pZGNSb2xlQXJufSdgLFxuICAgICAgJycsXG4gICAgICAnUmVzb3VyY2VzOicsXG4gICAgICAnICAjIENsb3VkRm9ybWF0aW9uIENoYW5nZVNldCBSb2xlIC0gbWluaW1hbCBwZXJtaXNzaW9ucyBmb3IgY2hhbmdlc2V0IG9wZXJhdGlvbnMnLFxuICAgICAgJyAgQ2RrQ2hhbmdlc2V0Um9sZTonLFxuICAgICAgJyAgICBUeXBlOiBBV1M6OklBTTo6Um9sZScsXG4gICAgICAnICAgIFByb3BlcnRpZXM6JyxcbiAgICAgIFwiICAgICAgUm9sZU5hbWU6ICdcIiArIHByb3BzLnJvbGVOYW1lICsgXCInXCIsXG4gICAgICAnICAgICAgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50OicsXG4gICAgICBcIiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnXCIsXG4gICAgICAnICAgICAgICBTdGF0ZW1lbnQ6JyxcbiAgICAgICcgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICBQcmluY2lwYWw6JyxcbiAgICAgICcgICAgICAgICAgICAgIEFXUzogIVJlZiBHaXRIdWJPSURDUm9sZUFybicsXG4gICAgICAnICAgICAgICAgICAgQWN0aW9uOiBzdHM6QXNzdW1lUm9sZScsXG4gICAgICAnICAgICAgICAgICAgQ29uZGl0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICBTdHJpbmdFcXVhbHM6JyxcbiAgICAgIFwiICAgICAgICAgICAgICAgIGF3czpSZXF1ZXN0ZWRSZWdpb246ICdcIiArIHByb3BzLm9pZGNSZWdpb24gKyBcIidcIixcbiAgICAgICcgICAgICBQb2xpY2llczonLFxuICAgICAgJyAgICAgICAgLSBQb2xpY3lOYW1lOiBDbG91ZEZvcm1hdGlvbkNoYW5nZVNldEFjY2VzcycsXG4gICAgICAnICAgICAgICAgIFBvbGljeURvY3VtZW50OicsXG4gICAgICBcIiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3J1wiLFxuICAgICAgJyAgICAgICAgICAgIFN0YXRlbWVudDonLFxuICAgICAgJyAgICAgICAgICAgICAgIyBDbG91ZEZvcm1hdGlvbiBjaGFuZ2VzZXQgb3BlcmF0aW9ucycsXG4gICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkNyZWF0ZUNoYW5nZVNldCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXNjcmliZUNoYW5nZVNldCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZWxldGVDaGFuZ2VTZXQnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246TGlzdENoYW5nZVNldHMnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVzY3JpYmVTdGFja3MnLFxuICAgICAgXCIgICAgICAgICAgICAgICAgUmVzb3VyY2U6ICcqJ1wiLFxuICAgICAgJyAgICAgICAgICAgICAgIyBDREsgYm9vdHN0cmFwIGJ1Y2tldCBhY2Nlc3MgKGZvciBjaGFuZ2VzZXQgY3JlYXRpb24pJyxcbiAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gczM6R2V0T2JqZWN0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOlB1dE9iamVjdCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzMzpEZWxldGVPYmplY3QnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gczM6TGlzdEJ1Y2tldCcsXG4gICAgICAnICAgICAgICAgICAgICAgIFJlc291cmNlOicsXG4gICAgICBcIiAgICAgICAgICAgICAgICAgIC0gIVN1YiAnYXJuOmF3czpzMzo6OmNkay0ke0FXUzo6QWNjb3VudElkfS0ke0FXUzo6UmVnaW9ufS0qJ1wiLFxuICAgICAgXCIgICAgICAgICAgICAgICAgICAtICFTdWIgJ2Fybjphd3M6czM6OjpjZGstJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0tKi8qJ1wiLFxuICAgICAgJyAgICAgICAgICAgICAgIyBDREsgYm9vdHN0cmFwIHBhcmFtZXRlciBhY2Nlc3MnLFxuICAgICAgJyAgICAgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICAgICAgQWN0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzc206R2V0UGFyYW1ldGVyJyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHNzbTpHZXRQYXJhbWV0ZXJzJyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHNzbTpHZXRQYXJhbWV0ZXJzQnlQYXRoJyxcbiAgICAgIFwiICAgICAgICAgICAgICAgIFJlc291cmNlOiAhU3ViICdhcm46YXdzOnNzbToke0FXUzo6UmVnaW9ufToke0FXUzo6QWNjb3VudElkfTpwYXJhbWV0ZXIvY2RrLWJvb3RzdHJhcC8qJ1wiLFxuICAgICAgJyAgICAgICAgICAgICAgIyBJQU0gUGFzc1JvbGUgZm9yIENESyBvcGVyYXRpb25zJyxcbiAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gaWFtOlBhc3NSb2xlJyxcbiAgICAgIFwiICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKidcIixcbiAgICAgICcgICAgICAgICAgICAgICAgQ29uZGl0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgU3RyaW5nRXF1YWxzOicsXG4gICAgICBcIiAgICAgICAgICAgICAgICAgICAgJ2lhbTpQYXNzZWRUb1NlcnZpY2UnOiAnY2xvdWRmb3JtYXRpb24uYW1hem9uYXdzLmNvbSdcIixcbiAgICAgICcnLFxuICAgICAgJ091dHB1dHM6JyxcbiAgICAgICcgIENka0NoYW5nZXNldFJvbGVBcm46JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBDREsgY2hhbmdlc2V0IHJvbGUnXCIsXG4gICAgICAnICAgIFZhbHVlOiAhR2V0QXR0IENka0NoYW5nZXNldFJvbGUuQXJuJyxcbiAgICAgICcgICAgRXhwb3J0OicsXG4gICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUNka0NoYW5nZXNldFJvbGVBcm4nXCIsXG4gICAgICAnJyxcbiAgICAgICcgIENka0NoYW5nZXNldFJvbGVOYW1lOicsXG4gICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIENESyBjaGFuZ2VzZXQgcm9sZSdcIixcbiAgICAgICcgICAgVmFsdWU6ICFSZWYgQ2RrQ2hhbmdlc2V0Um9sZScsXG4gICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1DZGtDaGFuZ2VzZXRSb2xlTmFtZSdcIixcbiAgICBdO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRoZSBBV1MgQ0xJIGRlcGxveSBjb21tYW5kIGZvciB0aGUgSUFNIHRlbXBsYXRlLlxuICAgKi9cbiAgc3RhdGljIGdlbmVyYXRlRGVwbG95Q29tbWFuZCh0ZW1wbGF0ZVBhdGg6IHN0cmluZyA9ICdjZGstZGlmZi13b3JrZmxvdy1pYW0tdGVtcGxhdGUueWFtbCcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYXdzIGNsb3VkZm9ybWF0aW9uIGRlcGxveSAtLXRlbXBsYXRlLWZpbGUgJHt0ZW1wbGF0ZVBhdGh9IC0tc3RhY2stbmFtZSBjZGstZGlmZi13b3JrZmxvdy1pYW0tcm9sZSAtLWNhcGFiaWxpdGllcyBDQVBBQklMSVRZX05BTUVEX0lBTWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFByb2plbi1pbnRlZ3JhdGVkIENESyBEaWZmIElBTSB0ZW1wbGF0ZSBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGtEaWZmSWFtVGVtcGxhdGVQcm9wcyBleHRlbmRzIENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvclByb3BzIHtcbiAgLyoqIFByb2plbiBwcm9qZWN0IGluc3RhbmNlICovXG4gIHJlYWRvbmx5IHByb2plY3Q6IGFueTtcbiAgLyoqIE91dHB1dCBwYXRoIGZvciB0aGUgdGVtcGxhdGUgZmlsZSAoZGVmYXVsdDogJ2Nkay1kaWZmLXdvcmtmbG93LWlhbS10ZW1wbGF0ZS55YW1sJykgKi9cbiAgcmVhZG9ubHkgb3V0cHV0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9qZW4gY29uc3RydWN0IHRoYXQgZW1pdHMgYSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZSB3aXRoIG1pbmltYWwgSUFNIHBlcm1pc3Npb25zXG4gKiBmb3IgdGhlIENESyBEaWZmIFN0YWNrIFdvcmtmbG93LlxuICpcbiAqIEZvciBub24tUHJvamVuIHByb2plY3RzLCB1c2UgYENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvcmAgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZGtEaWZmSWFtVGVtcGxhdGUge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2RrRGlmZklhbVRlbXBsYXRlUHJvcHMpIHtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcHJvcHMub3V0cHV0UGF0aCA/PyAnY2RrLWRpZmYtd29ya2Zsb3ctaWFtLXRlbXBsYXRlLnlhbWwnO1xuXG4gICAgLy8gR2VuZXJhdGUgdGVtcGxhdGUgdXNpbmcgdGhlIGdlbmVyYXRvclxuICAgIGNvbnN0IHRlbXBsYXRlID0gQ2RrRGlmZklhbVRlbXBsYXRlR2VuZXJhdG9yLmdlbmVyYXRlVGVtcGxhdGUocHJvcHMpO1xuICAgIG5ldyBUZXh0RmlsZShwcm9wcy5wcm9qZWN0LCBvdXRwdXRQYXRoLCB7IGxpbmVzOiB0ZW1wbGF0ZS5zcGxpdCgnXFxuJykgfSk7XG5cbiAgICAvLyBBZGQgZGVwbG95IHRhc2tcbiAgICBwcm9wcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveS1jZGtkaWZmLWlhbS10ZW1wbGF0ZScsIHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnRGVwbG95IHRoZSBDREsgRGlmZiBJQU0gdGVtcGxhdGUgdmlhIENsb3VkRm9ybWF0aW9uIChhY2NlcHRzIGV4dHJhIEFXUyBDTEkgYXJncywgZS5nLiwgLS1wYXJhbWV0ZXItb3ZlcnJpZGVzIEtleT1WYWx1ZS4uLiknLFxuICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgICBleGVjOiBDZGtEaWZmSWFtVGVtcGxhdGVHZW5lcmF0b3IuZ2VuZXJhdGVEZXBsb3lDb21tYW5kKG91dHB1dFBhdGgpLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
360
|
+
CdkDiffIamTemplate[_b] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplate", version: "1.2.0" };
|
|
361
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRGlmZklhbVRlbXBsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Nka0RpZmZJYW1UZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFrQztBQW1EbEM7OztHQUdHO0FBQ0gsTUFBYSwyQkFBMkI7SUFDdEM7O09BRUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBdUM7UUFDN0QsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUM7UUFFckQsaUJBQWlCO1FBQ2pCLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1lBQ3pFLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMscUJBQXFCLENBQUMsZUFBdUIscUNBQXFDO1FBQ3ZGLE9BQU8sNkNBQTZDLFlBQVksOEVBQThFLENBQUM7SUFDakosQ0FBQztJQUVEOztPQUVHO0lBQ0ss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LE1BQU0sQ0FBQyw0QkFBNEI7UUFDekMsT0FBTztZQUNMLHdCQUF3QjtZQUN4QixrREFBa0Q7WUFDbEQseUNBQXlDO1lBQ3pDLGFBQWE7WUFDYiwwREFBMEQ7WUFDMUQsRUFBRTtZQUNGLHlCQUF5QjtZQUN6QixtREFBbUQ7WUFDbkQsa0NBQWtDO1lBQ2xDLGFBQWE7WUFDYiwyREFBMkQ7U0FDNUQsQ0FBQztJQUNKLENBQUM7O0FBNVdILGtFQTZXQzs7O0FBWUQ7Ozs7O0dBS0c7QUFDSCxNQUFhLGtCQUFrQjtJQUM3QixZQUFZLEtBQThCO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUkscUNBQXFDLENBQUM7UUFFN0Usd0NBQXdDO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLDJCQUEyQixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLElBQUksaUJBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV6RSxrQkFBa0I7UUFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLEVBQUU7WUFDbkQsV0FBVyxFQUNULDRIQUE0SDtZQUM5SCxXQUFXLEVBQUUsSUFBSTtZQUNqQixJQUFJLEVBQUUsMkJBQTJCLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDO1NBQ3BFLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBZkgsZ0RBZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGV4dEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgR2l0SHViT2lkY0NvbmZpZyB9IGZyb20gJy4vQ2RrRGlmZklhbVRlbXBsYXRlU3RhY2tTZXQnO1xuXG4vKipcbiAqIFByb3BzIGZvciBnZW5lcmF0aW5nIENESyBEaWZmIElBTSB0ZW1wbGF0ZXMgKG5vIFByb2plbiBkZXBlbmRlbmN5KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvclByb3BzIHtcbiAgLyoqIE5hbWUgZm9yIHRoZSBjaGFuZ2VzZXQgSUFNIHJvbGUgKi9cbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQVJOIG9mIHRoZSBleGlzdGluZyBHaXRIdWIgT0lEQyByb2xlIHRoYXQgY2FuIGFzc3VtZSB0aGlzIGNoYW5nZXNldCByb2xlLlxuICAgKiBSZXF1aXJlZCB3aGVuIGNyZWF0ZU9pZGNSb2xlIGlzIGZhbHNlIG9yIHVuZGVmaW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IG9pZGNSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWdpb24gZm9yIHRoZSBPSURDIHRydXN0IGNvbmRpdGlvbi5cbiAgICogT25seSB1c2VkIHdoZW4gb2lkY1JvbGVBcm4gaXMgcHJvdmlkZWQgKGV4dGVybmFsIE9JREMgcm9sZSkuXG4gICAqL1xuICByZWFkb25seSBvaWRjUmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBHaXRIdWIgT0lEQyByb2xlIHdpdGhpbiB0aGlzIHRlbXBsYXRlIGluc3RlYWQgb2YgdXNpbmcgYW4gZXhpc3Rpbmcgb25lLlxuICAgKiBXaGVuIHRydWUsIGdpdGh1Yk9pZGMgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZCBhbmQgb2lkY1JvbGVBcm4gaXMgaWdub3JlZC5cbiAgICogRGVmYXVsdDogZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZU9pZGNSb2xlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgR2l0SHViIE9JREMgcm9sZSB0byBjcmVhdGUuXG4gICAqIE9ubHkgdXNlZCB3aGVuIGNyZWF0ZU9pZGNSb2xlIGlzIHRydWUuXG4gICAqIERlZmF1bHQ6ICdHaXRIdWJPSURDUm9sZSdcbiAgICovXG4gIHJlYWRvbmx5IG9pZGNSb2xlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogR2l0SHViIE9JREMgY29uZmlndXJhdGlvbiBmb3IgcmVwby9icmFuY2ggcmVzdHJpY3Rpb25zLlxuICAgKiBSZXF1aXJlZCB3aGVuIGNyZWF0ZU9pZGNSb2xlIGlzIHRydWUuXG4gICAqL1xuICByZWFkb25seSBnaXRodWJPaWRjPzogR2l0SHViT2lkY0NvbmZpZztcblxuICAvKipcbiAgICogU2tpcCBjcmVhdGluZyB0aGUgT0lEQyBwcm92aWRlciAodXNlIGV4aXN0aW5nIG9uZSkuXG4gICAqIFNldCB0byB0cnVlIGlmIHRoZSBhY2NvdW50IGFscmVhZHkgaGFzIGEgR2l0SHViIE9JREMgcHJvdmlkZXIuXG4gICAqIE9ubHkgdXNlZCB3aGVuIGNyZWF0ZU9pZGNSb2xlIGlzIHRydWUuXG4gICAqIERlZmF1bHQ6IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBza2lwT2lkY1Byb3ZpZGVyQ3JlYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFB1cmUgZ2VuZXJhdG9yIGNsYXNzIGZvciBDREsgRGlmZiBJQU0gdGVtcGxhdGVzLlxuICogTm8gUHJvamVuIGRlcGVuZGVuY3kgLSBjYW4gYmUgdXNlZCBpbiBhbnkgcHJvamVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvciB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0aGUgQ2xvdWRGb3JtYXRpb24gSUFNIHRlbXBsYXRlIGFzIGEgWUFNTCBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2VuZXJhdGVUZW1wbGF0ZShwcm9wczogQ2RrRGlmZklhbVRlbXBsYXRlR2VuZXJhdG9yUHJvcHMpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNyZWF0ZU9pZGNSb2xlID0gcHJvcHMuY3JlYXRlT2lkY1JvbGUgPz8gZmFsc2U7XG5cbiAgICAvLyBWYWxpZGF0ZSBwcm9wc1xuICAgIGlmIChjcmVhdGVPaWRjUm9sZSkge1xuICAgICAgaWYgKCFwcm9wcy5naXRodWJPaWRjKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2l0aHViT2lkYyBjb25maWd1cmF0aW9uIGlzIHJlcXVpcmVkIHdoZW4gY3JlYXRlT2lkY1JvbGUgaXMgdHJ1ZScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXByb3BzLm9pZGNSb2xlQXJuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb2lkY1JvbGVBcm4gaXMgcmVxdWlyZWQgd2hlbiBjcmVhdGVPaWRjUm9sZSBpcyBmYWxzZScpO1xuICAgICAgfVxuICAgICAgaWYgKCFwcm9wcy5vaWRjUmVnaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb2lkY1JlZ2lvbiBpcyByZXF1aXJlZCB3aGVuIGNyZWF0ZU9pZGNSb2xlIGlzIGZhbHNlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZU9pZGNSb2xlKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVRlbXBsYXRlV2l0aE9pZGNSb2xlKHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVUZW1wbGF0ZVdpdGhFeHRlcm5hbE9pZGNSb2xlKHByb3BzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIEFXUyBDTEkgZGVwbG95IGNvbW1hbmQgZm9yIHRoZSBJQU0gdGVtcGxhdGUuXG4gICAqL1xuICBzdGF0aWMgZ2VuZXJhdGVEZXBsb3lDb21tYW5kKHRlbXBsYXRlUGF0aDogc3RyaW5nID0gJ2Nkay1kaWZmLXdvcmtmbG93LWlhbS10ZW1wbGF0ZS55YW1sJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBhd3MgY2xvdWRmb3JtYXRpb24gZGVwbG95IC0tdGVtcGxhdGUtZmlsZSAke3RlbXBsYXRlUGF0aH0gLS1zdGFjay1uYW1lIGNkay1kaWZmLXdvcmtmbG93LWlhbS1yb2xlIC0tY2FwYWJpbGl0aWVzIENBUEFCSUxJVFlfTkFNRURfSUFNYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0ZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgT0lEQyBwcm92aWRlciBhbmQgcm9sZSAoc2VsZi1jb250YWluZWQpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZVRlbXBsYXRlV2l0aE9pZGNSb2xlKHByb3BzOiBDZGtEaWZmSWFtVGVtcGxhdGVHZW5lcmF0b3JQcm9wcyk6IHN0cmluZyB7XG4gICAgY29uc3Qgb2lkY1JvbGVOYW1lID0gcHJvcHMub2lkY1JvbGVOYW1lID8/ICdHaXRIdWJPSURDUm9sZSc7XG4gICAgY29uc3Qgc2tpcE9pZGNQcm92aWRlciA9IHByb3BzLnNraXBPaWRjUHJvdmlkZXJDcmVhdGlvbiA/PyBmYWxzZTtcbiAgICBjb25zdCBnaXRodWJPaWRjID0gcHJvcHMuZ2l0aHViT2lkYyE7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgICBcIkFXU1RlbXBsYXRlRm9ybWF0VmVyc2lvbjogJzIwMTAtMDktMDknXCIsXG4gICAgICBcIkRlc2NyaXB0aW9uOiAnR2l0SHViIE9JREMgYW5kIElBTSByb2xlcyBmb3IgQ0RLIERpZmYgU3RhY2sgV29ya2Zsb3cgY29uc3RydWN0J1wiLFxuICAgICAgJycsXG4gICAgICAnUmVzb3VyY2VzOicsXG4gICAgXTtcblxuICAgIC8vIE9JREMgUHJvdmlkZXIgKG9ubHkgaWYgbm90IHNraXBwaW5nKVxuICAgIGlmICghc2tpcE9pZGNQcm92aWRlcikge1xuICAgICAgbGluZXMucHVzaCguLi50aGlzLmdlbmVyYXRlT2lkY1Byb3ZpZGVyTGluZXMoKSk7XG4gICAgfVxuXG4gICAgLy8gT0lEQyBSb2xlXG4gICAgbGluZXMucHVzaCguLi50aGlzLmdlbmVyYXRlT2lkY1JvbGVMaW5lcyhvaWRjUm9sZU5hbWUsIGdpdGh1Yk9pZGMsIHNraXBPaWRjUHJvdmlkZXIpKTtcblxuICAgIC8vIENoYW5nZXNldCBSb2xlICh0cnVzdHMgdGhlIGNyZWF0ZWQgT0lEQyByb2xlKVxuICAgIGxpbmVzLnB1c2goLi4udGhpcy5nZW5lcmF0ZUNoYW5nZXNldFJvbGVXaXRoT2lkY1JlZihwcm9wcy5yb2xlTmFtZSkpO1xuXG4gICAgLy8gT3V0cHV0c1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGxpbmVzLnB1c2goJ091dHB1dHM6Jyk7XG5cbiAgICBpZiAoIXNraXBPaWRjUHJvdmlkZXIpIHtcbiAgICAgIGxpbmVzLnB1c2goLi4udGhpcy5nZW5lcmF0ZU9pZGNQcm92aWRlck91dHB1dExpbmVzKCkpO1xuICAgIH1cblxuICAgIGxpbmVzLnB1c2goLi4udGhpcy5nZW5lcmF0ZU9pZGNSb2xlT3V0cHV0TGluZXMoKSk7XG4gICAgbGluZXMucHVzaCguLi50aGlzLmdlbmVyYXRlQ2hhbmdlc2V0T3V0cHV0TGluZXMoKSk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGVtcGxhdGUgdGhhdCB1c2VzIGFuIGV4dGVybmFsIE9JREMgcm9sZSAob3JpZ2luYWwgYmVoYXZpb3IpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZVRlbXBsYXRlV2l0aEV4dGVybmFsT2lkY1JvbGUocHJvcHM6IENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvclByb3BzKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgIFwiQVdTVGVtcGxhdGVGb3JtYXRWZXJzaW9uOiAnMjAxMC0wOS0wOSdcIixcbiAgICAgIFwiRGVzY3JpcHRpb246ICdJQU0gcm9sZSBmb3IgQ0RLIERpZmYgU3RhY2sgV29ya2Zsb3cgY29uc3RydWN0J1wiLFxuICAgICAgJycsXG4gICAgICAnUGFyYW1ldGVyczonLFxuICAgICAgJyAgR2l0SHViT0lEQ1JvbGVBcm46JyxcbiAgICAgICcgICAgVHlwZTogU3RyaW5nJyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBleGlzdGluZyBHaXRIdWIgT0lEQyByb2xlIHRoYXQgY2FuIGFzc3VtZSB0aGlzIGNoYW5nZXNldCByb2xlJ1wiLFxuICAgICAgYCAgICBEZWZhdWx0OiAnJHtwcm9wcy5vaWRjUm9sZUFybn0nYCxcbiAgICAgICcnLFxuICAgICAgJ1Jlc291cmNlczonLFxuICAgICAgJyAgIyBDbG91ZEZvcm1hdGlvbiBDaGFuZ2VTZXQgUm9sZSAtIG1pbmltYWwgcGVybWlzc2lvbnMgZm9yIGNoYW5nZXNldCBvcGVyYXRpb25zJyxcbiAgICAgICcgIENka0NoYW5nZXNldFJvbGU6JyxcbiAgICAgICcgICAgVHlwZTogQVdTOjpJQU06OlJvbGUnLFxuICAgICAgJyAgICBQcm9wZXJ0aWVzOicsXG4gICAgICBcIiAgICAgIFJvbGVOYW1lOiAnXCIgKyBwcm9wcy5yb2xlTmFtZSArIFwiJ1wiLFxuICAgICAgJyAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDonLFxuICAgICAgXCIgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3J1wiLFxuICAgICAgJyAgICAgICAgU3RhdGVtZW50OicsXG4gICAgICAnICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgUHJpbmNpcGFsOicsXG4gICAgICAnICAgICAgICAgICAgICBBV1M6ICFSZWYgR2l0SHViT0lEQ1JvbGVBcm4nLFxuICAgICAgJyAgICAgICAgICAgIEFjdGlvbjogc3RzOkFzc3VtZVJvbGUnLFxuICAgICAgJyAgICAgICAgICAgIENvbmRpdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgU3RyaW5nRXF1YWxzOicsXG4gICAgICBcIiAgICAgICAgICAgICAgICBhd3M6UmVxdWVzdGVkUmVnaW9uOiAnXCIgKyBwcm9wcy5vaWRjUmVnaW9uICsgXCInXCIsXG4gICAgICAnICAgICAgUG9saWNpZXM6JyxcbiAgICAgICcgICAgICAgIC0gUG9saWN5TmFtZTogQ2xvdWRGb3JtYXRpb25DaGFuZ2VTZXRBY2Nlc3MnLFxuICAgICAgJyAgICAgICAgICBQb2xpY3lEb2N1bWVudDonLFxuICAgICAgXCIgICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNydcIixcbiAgICAgICcgICAgICAgICAgICBTdGF0ZW1lbnQ6JyxcbiAgICAgICcgICAgICAgICAgICAgICMgQ2xvdWRGb3JtYXRpb24gY2hhbmdlc2V0IG9wZXJhdGlvbnMnLFxuICAgICAgJyAgICAgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICAgICAgQWN0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpDcmVhdGVDaGFuZ2VTZXQnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVzY3JpYmVDaGFuZ2VTZXQnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVsZXRlQ2hhbmdlU2V0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkxpc3RDaGFuZ2VTZXRzJyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tzJyxcbiAgICAgIFwiICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKidcIixcbiAgICAgICcgICAgICAgICAgICAgICMgQ0RLIGJvb3RzdHJhcCBidWNrZXQgYWNjZXNzIChmb3IgY2hhbmdlc2V0IGNyZWF0aW9uKScsXG4gICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOkdldE9iamVjdCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzMzpQdXRPYmplY3QnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gczM6RGVsZXRlT2JqZWN0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOkxpc3RCdWNrZXQnLFxuICAgICAgJyAgICAgICAgICAgICAgICBSZXNvdXJjZTonLFxuICAgICAgXCIgICAgICAgICAgICAgICAgICAtICFTdWIgJ2Fybjphd3M6czM6OjpjZGstJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0tKidcIixcbiAgICAgIFwiICAgICAgICAgICAgICAgICAgLSAhU3ViICdhcm46YXdzOnMzOjo6Y2RrLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259LSovKidcIixcbiAgICAgICcgICAgICAgICAgICAgICMgQ0RLIGJvb3RzdHJhcCBwYXJhbWV0ZXIgYWNjZXNzJyxcbiAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gc3NtOkdldFBhcmFtZXRlcicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzc206R2V0UGFyYW1ldGVycycsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsXG4gICAgICBcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogIVN1YiAnYXJuOmF3czpzc206JHtBV1M6OlJlZ2lvbn06JHtBV1M6OkFjY291bnRJZH06cGFyYW1ldGVyL2Nkay1ib290c3RyYXAvKidcIixcbiAgICAgICcgICAgICAgICAgICAgICMgSUFNIFBhc3NSb2xlIGZvciBDREsgb3BlcmF0aW9ucycsXG4gICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGlhbTpQYXNzUm9sZScsXG4gICAgICBcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonXCIsXG4gICAgICAnICAgICAgICAgICAgICAgIENvbmRpdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIFN0cmluZ0VxdWFsczonLFxuICAgICAgXCIgICAgICAgICAgICAgICAgICAgICdpYW06UGFzc2VkVG9TZXJ2aWNlJzogJ2Nsb3VkZm9ybWF0aW9uLmFtYXpvbmF3cy5jb20nXCIsXG4gICAgICAnJyxcbiAgICAgICdPdXRwdXRzOicsXG4gICAgICAnICBDZGtDaGFuZ2VzZXRSb2xlQXJuOicsXG4gICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ0FSTiBvZiB0aGUgQ0RLIGNoYW5nZXNldCByb2xlJ1wiLFxuICAgICAgJyAgICBWYWx1ZTogIUdldEF0dCBDZGtDaGFuZ2VzZXRSb2xlLkFybicsXG4gICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1DZGtDaGFuZ2VzZXRSb2xlQXJuJ1wiLFxuICAgICAgJycsXG4gICAgICAnICBDZGtDaGFuZ2VzZXRSb2xlTmFtZTonLFxuICAgICAgXCIgICAgRGVzY3JpcHRpb246ICdOYW1lIG9mIHRoZSBDREsgY2hhbmdlc2V0IHJvbGUnXCIsXG4gICAgICAnICAgIFZhbHVlOiAhUmVmIENka0NoYW5nZXNldFJvbGUnLFxuICAgICAgJyAgICBFeHBvcnQ6JyxcbiAgICAgIFwiICAgICAgTmFtZTogIVN1YiAnJHtBV1M6OlN0YWNrTmFtZX0tQ2RrQ2hhbmdlc2V0Um9sZU5hbWUnXCIsXG4gICAgXTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlT2lkY1Byb3ZpZGVyTGluZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnICAjIEdpdEh1YiBPSURDIFByb3ZpZGVyJyxcbiAgICAgICcgIEdpdEh1Yk9JRENQcm92aWRlcjonLFxuICAgICAgJyAgICBUeXBlOiBBV1M6OklBTTo6T0lEQ1Byb3ZpZGVyJyxcbiAgICAgICcgICAgUHJvcGVydGllczonLFxuICAgICAgJyAgICAgIFVybDogaHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbScsXG4gICAgICAnICAgICAgQ2xpZW50SWRMaXN0OicsXG4gICAgICAnICAgICAgICAtIHN0cy5hbWF6b25hd3MuY29tJyxcbiAgICAgICcgICAgICBUaHVtYnByaW50TGlzdDonLFxuICAgICAgJyAgICAgICAgLSA2OTM4ZmQ0ZDk4YmFiMDNmYWFkYjk3YjM0Mzk2ODMxZTM3ODBhZWExJyxcbiAgICAgICcgICAgICAgIC0gMWM1OGEzYTg1MThlODc1OWJmMDc1Yjc2Yjc1MGQ0ZjJkZjI2NGZjZCcsXG4gICAgICAnJyxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVPaWRjUm9sZUxpbmVzKFxuICAgIHJvbGVOYW1lOiBzdHJpbmcsXG4gICAgZ2l0aHViT2lkYzogR2l0SHViT2lkY0NvbmZpZyxcbiAgICBza2lwT2lkY1Byb3ZpZGVyOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdWJqZWN0Q2xhaW1zID0gdGhpcy5idWlsZFN1YmplY3RDbGFpbXMoZ2l0aHViT2lkYyk7XG5cbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgICcgICMgR2l0SHViIE9JREMgUm9sZSAtIGF1dGhlbnRpY2F0ZXMgR2l0SHViIEFjdGlvbnMgd29ya2Zsb3dzJyxcbiAgICAgICcgIEdpdEh1Yk9JRENSb2xlOicsXG4gICAgICAnICAgIFR5cGU6IEFXUzo6SUFNOjpSb2xlJyxcbiAgICBdO1xuXG4gICAgLy8gT25seSBhZGQgRGVwZW5kc09uIGlmIHdlJ3JlIGNyZWF0aW5nIHRoZSBwcm92aWRlclxuICAgIGlmICghc2tpcE9pZGNQcm92aWRlcikge1xuICAgICAgbGluZXMucHVzaCgnICAgIERlcGVuZHNPbjogR2l0SHViT0lEQ1Byb3ZpZGVyJyk7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaChcbiAgICAgICcgICAgUHJvcGVydGllczonLFxuICAgICAgXCIgICAgICBSb2xlTmFtZTogJ1wiICsgcm9sZU5hbWUgKyBcIidcIixcbiAgICAgICcgICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6JyxcbiAgICAgIFwiICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNydcIixcbiAgICAgICcgICAgICAgIFN0YXRlbWVudDonLFxuICAgICAgJyAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgIFByaW5jaXBhbDonLFxuICAgICAgXCIgICAgICAgICAgICAgIEZlZGVyYXRlZDogIVN1YiAnYXJuOmF3czppYW06OiR7QVdTOjpBY2NvdW50SWR9Om9pZGMtcHJvdmlkZXIvdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20nXCIsXG4gICAgICAnICAgICAgICAgICAgQWN0aW9uOiBzdHM6QXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eScsXG4gICAgICAnICAgICAgICAgICAgQ29uZGl0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICBTdHJpbmdFcXVhbHM6JyxcbiAgICAgIFwiICAgICAgICAgICAgICAgICd0b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTphdWQnOiAnc3RzLmFtYXpvbmF3cy5jb20nXCIsXG4gICAgICAnICAgICAgICAgICAgICBTdHJpbmdMaWtlOicsXG4gICAgICBcIiAgICAgICAgICAgICAgICAndG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb206c3ViJzpcIixcbiAgICApO1xuXG4gICAgLy8gQWRkIHN1YmplY3QgY2xhaW1zXG4gICAgZm9yIChjb25zdCBjbGFpbSBvZiBzdWJqZWN0Q2xhaW1zKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgICAgICAgICAgICAgICAgICAtICcke2NsYWltfSdgKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWlsZFN1YmplY3RDbGFpbXMoZ2l0aHViT2lkYzogR2l0SHViT2lkY0NvbmZpZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjbGFpbXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYnJhbmNoZXMgPSBnaXRodWJPaWRjLmJyYW5jaGVzID8/IFsnKiddO1xuXG4gICAgZm9yIChjb25zdCByZXBvIG9mIGdpdGh1Yk9pZGMucmVwb3NpdG9yaWVzKSB7XG4gICAgICBpZiAocmVwbyA9PT0gJyonKSB7XG4gICAgICAgIC8vIFdpbGRjYXJkIHJlcG8gLSBhbGxvdyBhbGwgcmVwb3Mgd2l0aCBicmFuY2ggcmVzdHJpY3Rpb25zXG4gICAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIGJyYW5jaGVzKSB7XG4gICAgICAgICAgaWYgKGJyYW5jaCA9PT0gJyonKSB7XG4gICAgICAgICAgICBjbGFpbXMucHVzaChgcmVwbzoke2dpdGh1Yk9pZGMub3duZXJ9LypgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xhaW1zLnB1c2goYHJlcG86JHtnaXRodWJPaWRjLm93bmVyfS8qOnJlZjpyZWZzL2hlYWRzLyR7YnJhbmNofWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3BlY2lmaWMgcmVwb1xuICAgICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBicmFuY2hlcykge1xuICAgICAgICAgIGlmIChicmFuY2ggPT09ICcqJykge1xuICAgICAgICAgICAgY2xhaW1zLnB1c2goYHJlcG86JHtnaXRodWJPaWRjLm93bmVyfS8ke3JlcG99OipgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xhaW1zLnB1c2goYHJlcG86JHtnaXRodWJPaWRjLm93bmVyfS8ke3JlcG99OnJlZjpyZWZzL2hlYWRzLyR7YnJhbmNofWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhbnkgYWRkaXRpb25hbCBjbGFpbXNcbiAgICBpZiAoZ2l0aHViT2lkYy5hZGRpdGlvbmFsQ2xhaW1zKSB7XG4gICAgICBmb3IgKGNvbnN0IGNsYWltIG9mIGdpdGh1Yk9pZGMuYWRkaXRpb25hbENsYWltcykge1xuICAgICAgICBmb3IgKGNvbnN0IHJlcG8gb2YgZ2l0aHViT2lkYy5yZXBvc2l0b3JpZXMpIHtcbiAgICAgICAgICBpZiAocmVwbyA9PT0gJyonKSB7XG4gICAgICAgICAgICBjbGFpbXMucHVzaChgcmVwbzoke2dpdGh1Yk9pZGMub3duZXJ9Lyo6JHtjbGFpbX1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xhaW1zLnB1c2goYHJlcG86JHtnaXRodWJPaWRjLm93bmVyfS8ke3JlcG99OiR7Y2xhaW19YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYWltcztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlQ2hhbmdlc2V0Um9sZVdpdGhPaWRjUmVmKHJvbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICcgICMgQ2xvdWRGb3JtYXRpb24gQ2hhbmdlU2V0IFJvbGUgLSBtaW5pbWFsIHBlcm1pc3Npb25zIGZvciBjaGFuZ2VzZXQgb3BlcmF0aW9ucycsXG4gICAgICAnICBDZGtDaGFuZ2VzZXRSb2xlOicsXG4gICAgICAnICAgIFR5cGU6IEFXUzo6SUFNOjpSb2xlJyxcbiAgICAgICcgICAgRGVwZW5kc09uOiBHaXRIdWJPSURDUm9sZScsXG4gICAgICAnICAgIFByb3BlcnRpZXM6JyxcbiAgICAgIFwiICAgICAgUm9sZU5hbWU6ICdcIiArIHJvbGVOYW1lICsgXCInXCIsXG4gICAgICAnICAgICAgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50OicsXG4gICAgICBcIiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnXCIsXG4gICAgICAnICAgICAgICBTdGF0ZW1lbnQ6JyxcbiAgICAgICcgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICBQcmluY2lwYWw6JyxcbiAgICAgICcgICAgICAgICAgICAgIEFXUzogIUdldEF0dCBHaXRIdWJPSURDUm9sZS5Bcm4nLFxuICAgICAgJyAgICAgICAgICAgIEFjdGlvbjogc3RzOkFzc3VtZVJvbGUnLFxuICAgICAgJyAgICAgIFBvbGljaWVzOicsXG4gICAgICAnICAgICAgICAtIFBvbGljeU5hbWU6IENsb3VkRm9ybWF0aW9uQ2hhbmdlU2V0QWNjZXNzJyxcbiAgICAgICcgICAgICAgICAgUG9saWN5RG9jdW1lbnQ6JyxcbiAgICAgIFwiICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnXCIsXG4gICAgICAnICAgICAgICAgICAgU3RhdGVtZW50OicsXG4gICAgICAnICAgICAgICAgICAgICAjIENsb3VkRm9ybWF0aW9uIGNoYW5nZXNldCBvcGVyYXRpb25zJyxcbiAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246Q3JlYXRlQ2hhbmdlU2V0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlc2NyaWJlQ2hhbmdlU2V0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlbGV0ZUNoYW5nZVNldCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpMaXN0Q2hhbmdlU2V0cycsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXNjcmliZVN0YWNrcycsXG4gICAgICBcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonXCIsXG4gICAgICAnICAgICAgICAgICAgICAjIENESyBib290c3RyYXAgYnVja2V0IGFjY2VzcyAoZm9yIGNoYW5nZXNldCBjcmVhdGlvbiknLFxuICAgICAgJyAgICAgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICAgICAgQWN0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzMzpHZXRPYmplY3QnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gczM6UHV0T2JqZWN0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOkRlbGV0ZU9iamVjdCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzMzpMaXN0QnVja2V0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgUmVzb3VyY2U6JyxcbiAgICAgIFwiICAgICAgICAgICAgICAgICAgLSAhU3ViICdhcm46YXdzOnMzOjo6Y2RrLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259LSonXCIsXG4gICAgICBcIiAgICAgICAgICAgICAgICAgIC0gIVN1YiAnYXJuOmF3czpzMzo6OmNkay0ke0FXUzo6QWNjb3VudElkfS0ke0FXUzo6UmVnaW9ufS0qLyonXCIsXG4gICAgICAnICAgICAgICAgICAgICAjIENESyBib290c3RyYXAgcGFyYW1ldGVyIGFjY2VzcycsXG4gICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHNzbTpHZXRQYXJhbWV0ZXInLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gc3NtOkdldFBhcmFtZXRlcnMnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gc3NtOkdldFBhcmFtZXRlcnNCeVBhdGgnLFxuICAgICAgXCIgICAgICAgICAgICAgICAgUmVzb3VyY2U6ICFTdWIgJ2Fybjphd3M6c3NtOiR7QVdTOjpSZWdpb259OiR7QVdTOjpBY2NvdW50SWR9OnBhcmFtZXRlci9jZGstYm9vdHN0cmFwLyonXCIsXG4gICAgICAnICAgICAgICAgICAgICAjIElBTSBQYXNzUm9sZSBmb3IgQ0RLIG9wZXJhdGlvbnMnLFxuICAgICAgJyAgICAgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICAgICAgQWN0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBpYW06UGFzc1JvbGUnLFxuICAgICAgXCIgICAgICAgICAgICAgICAgUmVzb3VyY2U6ICcqJ1wiLFxuICAgICAgJyAgICAgICAgICAgICAgICBDb25kaXRpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICBTdHJpbmdFcXVhbHM6JyxcbiAgICAgIFwiICAgICAgICAgICAgICAgICAgICAnaWFtOlBhc3NlZFRvU2VydmljZSc6ICdjbG91ZGZvcm1hdGlvbi5hbWF6b25hd3MuY29tJ1wiLFxuICAgICAgJycsXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlT2lkY1Byb3ZpZGVyT3V0cHV0TGluZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnICBHaXRIdWJPSURDUHJvdmlkZXJBcm46JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBHaXRIdWIgT0lEQyBwcm92aWRlcidcIixcbiAgICAgICcgICAgVmFsdWU6ICFHZXRBdHQgR2l0SHViT0lEQ1Byb3ZpZGVyLkFybicsXG4gICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1HaXRIdWJPSURDUHJvdmlkZXJBcm4nXCIsXG4gICAgICAnJyxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVPaWRjUm9sZU91dHB1dExpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJyAgR2l0SHViT0lEQ1JvbGVBcm46JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBHaXRIdWIgT0lEQyByb2xlJ1wiLFxuICAgICAgJyAgICBWYWx1ZTogIUdldEF0dCBHaXRIdWJPSURDUm9sZS5Bcm4nLFxuICAgICAgJyAgICBFeHBvcnQ6JyxcbiAgICAgIFwiICAgICAgTmFtZTogIVN1YiAnJHtBV1M6OlN0YWNrTmFtZX0tR2l0SHViT0lEQ1JvbGVBcm4nXCIsXG4gICAgICAnJyxcbiAgICAgICcgIEdpdEh1Yk9JRENSb2xlTmFtZTonLFxuICAgICAgXCIgICAgRGVzY3JpcHRpb246ICdOYW1lIG9mIHRoZSBHaXRIdWIgT0lEQyByb2xlJ1wiLFxuICAgICAgJyAgICBWYWx1ZTogIVJlZiBHaXRIdWJPSURDUm9sZScsXG4gICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1HaXRIdWJPSURDUm9sZU5hbWUnXCIsXG4gICAgICAnJyxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVDaGFuZ2VzZXRPdXRwdXRMaW5lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICcgIENka0NoYW5nZXNldFJvbGVBcm46JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBDREsgY2hhbmdlc2V0IHJvbGUnXCIsXG4gICAgICAnICAgIFZhbHVlOiAhR2V0QXR0IENka0NoYW5nZXNldFJvbGUuQXJuJyxcbiAgICAgICcgICAgRXhwb3J0OicsXG4gICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUNka0NoYW5nZXNldFJvbGVBcm4nXCIsXG4gICAgICAnJyxcbiAgICAgICcgIENka0NoYW5nZXNldFJvbGVOYW1lOicsXG4gICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIENESyBjaGFuZ2VzZXQgcm9sZSdcIixcbiAgICAgICcgICAgVmFsdWU6ICFSZWYgQ2RrQ2hhbmdlc2V0Um9sZScsXG4gICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1DZGtDaGFuZ2VzZXRSb2xlTmFtZSdcIixcbiAgICBdO1xuICB9XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBQcm9qZW4taW50ZWdyYXRlZCBDREsgRGlmZiBJQU0gdGVtcGxhdGUgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrRGlmZklhbVRlbXBsYXRlUHJvcHMgZXh0ZW5kcyBDZGtEaWZmSWFtVGVtcGxhdGVHZW5lcmF0b3JQcm9wcyB7XG4gIC8qKiBQcm9qZW4gcHJvamVjdCBpbnN0YW5jZSAqL1xuICByZWFkb25seSBwcm9qZWN0OiBhbnk7XG4gIC8qKiBPdXRwdXQgcGF0aCBmb3IgdGhlIHRlbXBsYXRlIGZpbGUgKGRlZmF1bHQ6ICdjZGstZGlmZi13b3JrZmxvdy1pYW0tdGVtcGxhdGUueWFtbCcpICovXG4gIHJlYWRvbmx5IG91dHB1dFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvamVuIGNvbnN0cnVjdCB0aGF0IGVtaXRzIGEgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgd2l0aCBtaW5pbWFsIElBTSBwZXJtaXNzaW9uc1xuICogZm9yIHRoZSBDREsgRGlmZiBTdGFjayBXb3JrZmxvdy5cbiAqXG4gKiBGb3Igbm9uLVByb2plbiBwcm9qZWN0cywgdXNlIGBDZGtEaWZmSWFtVGVtcGxhdGVHZW5lcmF0b3JgIGRpcmVjdGx5LlxuICovXG5leHBvcnQgY2xhc3MgQ2RrRGlmZklhbVRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IENka0RpZmZJYW1UZW1wbGF0ZVByb3BzKSB7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHByb3BzLm91dHB1dFBhdGggPz8gJ2Nkay1kaWZmLXdvcmtmbG93LWlhbS10ZW1wbGF0ZS55YW1sJztcblxuICAgIC8vIEdlbmVyYXRlIHRlbXBsYXRlIHVzaW5nIHRoZSBnZW5lcmF0b3JcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvci5nZW5lcmF0ZVRlbXBsYXRlKHByb3BzKTtcbiAgICBuZXcgVGV4dEZpbGUocHJvcHMucHJvamVjdCwgb3V0cHV0UGF0aCwgeyBsaW5lczogdGVtcGxhdGUuc3BsaXQoJ1xcbicpIH0pO1xuXG4gICAgLy8gQWRkIGRlcGxveSB0YXNrXG4gICAgcHJvcHMucHJvamVjdC5hZGRUYXNrKCdkZXBsb3ktY2RrZGlmZi1pYW0tdGVtcGxhdGUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0RlcGxveSB0aGUgQ0RLIERpZmYgSUFNIHRlbXBsYXRlIHZpYSBDbG91ZEZvcm1hdGlvbiAoYWNjZXB0cyBleHRyYSBBV1MgQ0xJIGFyZ3MsIGUuZy4sIC0tcGFyYW1ldGVyLW92ZXJyaWRlcyBLZXk9VmFsdWUuLi4pJyxcbiAgICAgIHJlY2VpdmVBcmdzOiB0cnVlLFxuICAgICAgZXhlYzogQ2RrRGlmZklhbVRlbXBsYXRlR2VuZXJhdG9yLmdlbmVyYXRlRGVwbG95Q29tbWFuZChvdXRwdXRQYXRoKSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|