@aws-mdaa/devops 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/SCHEMA.md +981 -0
- package/bin/devops.d.ts +6 -0
- package/bin/devops.js +10 -0
- package/cdk.json +7 -0
- package/lib/config-schema.json +431 -0
- package/lib/devops.d.ts +210 -0
- package/lib/devops.js +392 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +24 -0
- package/mdaa.config.json +3 -0
- package/package.json +57 -0
package/lib/devops.js
ADDED
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MdaaPipeline = exports.MdaaDevopsL3Construct = exports.MdaaDevopsCDKApp = exports.DevOpsConfigParser = void 0;
|
|
10
|
+
const app_1 = require("@aws-mdaa/app");
|
|
11
|
+
const iam_constructs_1 = require("@aws-mdaa/iam-constructs");
|
|
12
|
+
const kms_constructs_1 = require("@aws-mdaa/kms-constructs");
|
|
13
|
+
const l3_construct_1 = require("@aws-mdaa/l3-construct");
|
|
14
|
+
const s3_constructs_1 = require("@aws-mdaa/s3-constructs");
|
|
15
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
16
|
+
const aws_codebuild_1 = require("aws-cdk-lib/aws-codebuild");
|
|
17
|
+
const aws_codecommit_1 = require("aws-cdk-lib/aws-codecommit");
|
|
18
|
+
const aws_codepipeline_1 = require("aws-cdk-lib/aws-codepipeline");
|
|
19
|
+
const aws_codepipeline_actions_1 = require("aws-cdk-lib/aws-codepipeline-actions");
|
|
20
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
21
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
22
|
+
const configSchema = require("./config-schema.json");
|
|
23
|
+
const construct_1 = require("@aws-mdaa/construct"); //NOSONAR
|
|
24
|
+
class DevOpsConfigParser extends app_1.MdaaAppConfigParser {
|
|
25
|
+
constructor(stack, props) {
|
|
26
|
+
super(stack, props, configSchema);
|
|
27
|
+
this.devopsConfig = this.configContents;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.DevOpsConfigParser = DevOpsConfigParser;
|
|
31
|
+
class MdaaDevopsCDKApp extends app_1.MdaaCdkApp {
|
|
32
|
+
constructor(props) {
|
|
33
|
+
super({ ...props, ...{ useBootstrap: false } }, app_1.MdaaCdkApp.parsePackageJson(`${__dirname}/../package.json`));
|
|
34
|
+
}
|
|
35
|
+
subGenerateResources(stack, l3ConstructProps, parserProps) {
|
|
36
|
+
const appConfig = new DevOpsConfigParser(stack, parserProps);
|
|
37
|
+
new MdaaDevopsL3Construct(stack, 'devops', {
|
|
38
|
+
...l3ConstructProps,
|
|
39
|
+
...appConfig.devopsConfig,
|
|
40
|
+
});
|
|
41
|
+
aws_cdk_lib_1.Aspects.of(stack).add(new FixCdkBuildProject());
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.MdaaDevopsCDKApp = MdaaDevopsCDKApp;
|
|
45
|
+
class MdaaDevopsL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
46
|
+
constructor(scope, id, props) {
|
|
47
|
+
super(scope, id, props);
|
|
48
|
+
this.props = props;
|
|
49
|
+
const pipelineRole = new iam_constructs_1.MdaaRole(this, 'pipeline-role', {
|
|
50
|
+
roleName: 'pipeline',
|
|
51
|
+
naming: this.props.naming,
|
|
52
|
+
assumedBy: new aws_iam_1.ServicePrincipal('codepipeline.amazonaws.com'),
|
|
53
|
+
});
|
|
54
|
+
const mdaaRepo = aws_codecommit_1.Repository.fromRepositoryName(this, 'mdaa-import-repo', this.props.mdaaCodeCommitRepo);
|
|
55
|
+
const configsRepo = aws_codecommit_1.Repository.fromRepositoryName(this, 'configs-import-repo', this.props.configsCodeCommitRepo);
|
|
56
|
+
const kmsKey = new kms_constructs_1.MdaaKmsKey(this, 'kms-key', {
|
|
57
|
+
naming: this.props.naming,
|
|
58
|
+
keyUserRoleIds: [pipelineRole.roleId],
|
|
59
|
+
});
|
|
60
|
+
const devOpsBucket = new s3_constructs_1.MdaaBucket(this, 'pipeline-bucket', {
|
|
61
|
+
naming: this.props.naming,
|
|
62
|
+
encryptionKey: kmsKey,
|
|
63
|
+
});
|
|
64
|
+
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(devOpsBucket, [
|
|
65
|
+
{
|
|
66
|
+
id: 'NIST.800.53.R5-S3BucketReplicationEnabled',
|
|
67
|
+
reason: 'Bucket does not contain data assets. Replication not required.',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'HIPAA.Security-S3BucketReplicationEnabled',
|
|
71
|
+
reason: 'Bucket does not contain data assets. Replication not required.',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'PCI.DSS.321-S3BucketReplicationEnabled',
|
|
75
|
+
reason: 'Bucket does not contain data assets. Replication not required.',
|
|
76
|
+
},
|
|
77
|
+
], true);
|
|
78
|
+
const codeCommitEventRole = new iam_constructs_1.MdaaRole(this, 'codecommit-event-role', {
|
|
79
|
+
roleName: 'codecommit-event',
|
|
80
|
+
naming: this.props.naming,
|
|
81
|
+
assumedBy: new aws_iam_1.ServicePrincipal('events.amazonaws.com'),
|
|
82
|
+
});
|
|
83
|
+
const codeCommitReadPolicy = new aws_iam_1.PolicyDocument({
|
|
84
|
+
statements: [
|
|
85
|
+
new aws_iam_1.PolicyStatement({
|
|
86
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
87
|
+
actions: ['codecommit:GetBranch', 'codecommit:GetCommit', 'codecommit:GetRepository', 'codecommit:GitPull'],
|
|
88
|
+
resources: [mdaaRepo.repositoryArn, configsRepo.repositoryArn],
|
|
89
|
+
}),
|
|
90
|
+
],
|
|
91
|
+
});
|
|
92
|
+
const codeCommitActionRole = new iam_constructs_1.MdaaRole(this, 'codecommit-action-role', {
|
|
93
|
+
roleName: 'codecommit-action',
|
|
94
|
+
naming: this.props.naming,
|
|
95
|
+
assumedBy: new aws_iam_1.AccountPrincipal(this.account),
|
|
96
|
+
inlinePolicies: { codecommit_read: codeCommitReadPolicy },
|
|
97
|
+
});
|
|
98
|
+
const codeBuildActionRole = new iam_constructs_1.MdaaRole(this, 'codebuild-action-role', {
|
|
99
|
+
roleName: 'codebuild-action',
|
|
100
|
+
naming: this.props.naming,
|
|
101
|
+
assumedBy: new aws_iam_1.CompositePrincipal(new aws_iam_1.ServicePrincipal('codebuild.amazonaws.com'), new aws_iam_1.AccountPrincipal(this.account)),
|
|
102
|
+
managedPolicies: [aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName('AWSCloudFormationReadOnlyAccess')],
|
|
103
|
+
});
|
|
104
|
+
const codeBuildActionPolicy = new aws_iam_1.Policy(this, 'codebuild-policy');
|
|
105
|
+
const cdkLookupRole = this.importCdkRole(this, 'lookup', this.props.cdkBootstrapContext);
|
|
106
|
+
const cdkDeployRole = this.importCdkRole(this, 'deploy', this.props.cdkBootstrapContext);
|
|
107
|
+
const cdkExecRole = this.importCdkRole(this, 'exec', this.props.cdkBootstrapContext);
|
|
108
|
+
const cdkFilePublishingRole = this.importCdkRole(this, 'file-publishing', this.props.cdkBootstrapContext);
|
|
109
|
+
const cdkImagePublishingRole = this.importCdkRole(this, 'image-publishing', this.props.cdkBootstrapContext);
|
|
110
|
+
const cdkBucket = aws_s3_1.Bucket.fromBucketName(this, `cdk-bucket-import`, `cdk-${this.props.cdkBootstrapContext ?? MdaaDevopsL3Construct.DEFAULT_CDK_BOOTSTRAP_CONTEXT}-assets-${this.account}-${this.region}`);
|
|
111
|
+
codeBuildActionPolicy.addStatements(new aws_iam_1.PolicyStatement({
|
|
112
|
+
sid: 'ASSUMECDKROLES',
|
|
113
|
+
actions: ['sts:AssumeRole'],
|
|
114
|
+
resources: [
|
|
115
|
+
cdkLookupRole.roleArn,
|
|
116
|
+
cdkDeployRole.roleArn,
|
|
117
|
+
cdkFilePublishingRole.roleArn,
|
|
118
|
+
cdkImagePublishingRole.roleArn,
|
|
119
|
+
cdkExecRole.roleArn,
|
|
120
|
+
],
|
|
121
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
122
|
+
}));
|
|
123
|
+
codeBuildActionPolicy.addStatements(new aws_iam_1.PolicyStatement({
|
|
124
|
+
sid: 'S3List',
|
|
125
|
+
actions: ['s3:ListAllMyBuckets'],
|
|
126
|
+
resources: ['*'],
|
|
127
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
128
|
+
}), new aws_iam_1.PolicyStatement({
|
|
129
|
+
sid: 'CloudFormationChangeSets',
|
|
130
|
+
actions: [
|
|
131
|
+
'cloudformation:CreateChangeSet',
|
|
132
|
+
'cloudformation:DescribeChangeSet',
|
|
133
|
+
'cloudformation:DeleteChangeSet',
|
|
134
|
+
],
|
|
135
|
+
resources: ['*'],
|
|
136
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
137
|
+
}));
|
|
138
|
+
codeBuildActionPolicy.addStatements(new aws_iam_1.PolicyStatement({
|
|
139
|
+
sid: 'CDKS3',
|
|
140
|
+
actions: ['s3:Get*', 's3:Put*', 's3:List*'],
|
|
141
|
+
resources: [cdkBucket.bucketArn, cdkBucket.arnForObjects('*')],
|
|
142
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
143
|
+
}));
|
|
144
|
+
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(codeBuildActionPolicy, [
|
|
145
|
+
{ id: 'AwsSolutions-IAM5', reason: 'Permissions are scoped least privilege for deployment time.' },
|
|
146
|
+
{ id: 'NIST.800.53.R5-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
147
|
+
{ id: 'HIPAA.Security-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
148
|
+
{ id: 'PCI.DSS.321-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
149
|
+
], true);
|
|
150
|
+
codeBuildActionPolicy.attachToRole(codeBuildActionRole);
|
|
151
|
+
const manualActionRole = new iam_constructs_1.MdaaRole(this, 'manual-action-role', {
|
|
152
|
+
roleName: 'manual-action',
|
|
153
|
+
naming: this.props.naming,
|
|
154
|
+
assumedBy: new aws_iam_1.AccountPrincipal(this.account),
|
|
155
|
+
});
|
|
156
|
+
const assumeActionRoleGrant = codeBuildActionRole.grantAssumeRole(pipelineRole);
|
|
157
|
+
Object.entries(this.props.pipelines ?? {}).forEach(entry => {
|
|
158
|
+
const pipelineProps = {
|
|
159
|
+
pipelineType: aws_codepipeline_1.PipelineType.V2,
|
|
160
|
+
naming: this.props.naming.withModuleName(`devops-${entry[0]}`),
|
|
161
|
+
pipelineName: this.props.naming.resourceName(entry[0]),
|
|
162
|
+
...entry[1],
|
|
163
|
+
role: pipelineRole,
|
|
164
|
+
artifactBucket: devOpsBucket,
|
|
165
|
+
codeCommitActionRole: codeCommitActionRole,
|
|
166
|
+
codeCommitEventRole: codeCommitEventRole,
|
|
167
|
+
codeBuildActionRole: codeBuildActionRole,
|
|
168
|
+
mdaaRepo: mdaaRepo,
|
|
169
|
+
configsRepo: configsRepo,
|
|
170
|
+
kmsKey: kmsKey,
|
|
171
|
+
manualActionRole: manualActionRole,
|
|
172
|
+
install: [...(this.props.install ?? []), ...(entry[1].install ?? [])],
|
|
173
|
+
pre: [...(this.props.pre ?? []), ...(entry[1].pre ?? [])],
|
|
174
|
+
post: [...(this.props.post ?? []), ...(entry[1].post ?? [])],
|
|
175
|
+
preDeploy: { ...this.props.preDeploy, ...entry[1].preDeploy },
|
|
176
|
+
preDeployValidate: this.props.preDeployValidate || entry[1].preDeployValidate
|
|
177
|
+
? { ...this.props.preDeployValidate, ...entry[1].preDeployValidate }
|
|
178
|
+
: undefined,
|
|
179
|
+
deploy: { ...this.props.deploy, ...entry[1].deploy },
|
|
180
|
+
postDeployValidate: this.props.postDeployValidate || entry[1].postDeployValidate
|
|
181
|
+
? { ...this.props.postDeployValidate, ...entry[1].postDeployValidate }
|
|
182
|
+
: undefined,
|
|
183
|
+
};
|
|
184
|
+
const pipeline = new MdaaPipeline(this, `mdaa-pipeline-${entry[0]}`, pipelineProps);
|
|
185
|
+
assumeActionRoleGrant.applyBefore(pipeline);
|
|
186
|
+
});
|
|
187
|
+
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(pipelineRole, [
|
|
188
|
+
{ id: 'AwsSolutions-IAM5', reason: 'Permissions are scoped least privilege for deployment time.' },
|
|
189
|
+
{ id: 'NIST.800.53.R5-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
190
|
+
{ id: 'HIPAA.Security-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
191
|
+
{ id: 'PCI.DSS.321-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
192
|
+
], true);
|
|
193
|
+
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(codeBuildActionRole, [
|
|
194
|
+
{ id: 'AwsSolutions-IAM4', reason: 'AWSCloudFormationReadOnlyAccess is Read Only Access' },
|
|
195
|
+
{ id: 'AwsSolutions-IAM5', reason: 'Permissions are scoped least privilege for deployment time.' },
|
|
196
|
+
{ id: 'NIST.800.53.R5-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
197
|
+
{ id: 'HIPAA.Security-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
198
|
+
{ id: 'PCI.DSS.321-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
199
|
+
], true);
|
|
200
|
+
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(codeCommitActionRole, [
|
|
201
|
+
{ id: 'AwsSolutions-IAM5', reason: 'Permissions are scoped least privilege for deployment time.' },
|
|
202
|
+
{ id: 'NIST.800.53.R5-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
203
|
+
{ id: 'HIPAA.Security-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
204
|
+
{ id: 'PCI.DSS.321-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
205
|
+
], true);
|
|
206
|
+
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(codeCommitEventRole, [
|
|
207
|
+
{ id: 'NIST.800.53.R5-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
208
|
+
{ id: 'HIPAA.Security-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
209
|
+
{ id: 'PCI.DSS.321-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
210
|
+
], true);
|
|
211
|
+
}
|
|
212
|
+
importCdkRole(scope, roleName, cdkBootstrapContext) {
|
|
213
|
+
return aws_iam_1.Role.fromRoleName(scope, `cdk-${roleName}-role-import`, `cdk-${cdkBootstrapContext ?? MdaaDevopsL3Construct.DEFAULT_CDK_BOOTSTRAP_CONTEXT}-${roleName}-role-${aws_cdk_lib_1.Stack.of(scope).account}-${aws_cdk_lib_1.Stack.of(scope).region}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
exports.MdaaDevopsL3Construct = MdaaDevopsL3Construct;
|
|
217
|
+
MdaaDevopsL3Construct.DEFAULT_CDK_BOOTSTRAP_CONTEXT = 'hnb659fds';
|
|
218
|
+
class MdaaPipeline extends aws_codepipeline_1.Pipeline {
|
|
219
|
+
constructor(scope, id, props) {
|
|
220
|
+
super(scope, id, props);
|
|
221
|
+
this.props = props;
|
|
222
|
+
const sourceStage = this.addStage({ stageName: 'Source' });
|
|
223
|
+
const mdaaSourceOutput = new aws_codepipeline_1.Artifact('MDAA');
|
|
224
|
+
const mdaaSourceAction = this.createCodeCommitSourceAction('mdaa', mdaaSourceOutput, this.props.codeCommitActionRole, this.props.codeCommitEventRole, this.props.mdaaRepo, this.props.mdaaBranch ?? 'main');
|
|
225
|
+
const configSourceOutput = new aws_codepipeline_1.Artifact('CONFIGS');
|
|
226
|
+
const configSourceAction = this.createCodeCommitSourceAction('configs', configSourceOutput, this.props.codeCommitActionRole, this.props.codeCommitEventRole, this.props.configsRepo, this.props.configsBranch ?? 'main');
|
|
227
|
+
sourceStage.addAction(mdaaSourceAction);
|
|
228
|
+
sourceStage.addAction(configSourceAction);
|
|
229
|
+
const pipelineProjects = [];
|
|
230
|
+
const preDeployOutput = new aws_codepipeline_1.Artifact('PREDEPLOY_OUTPUT');
|
|
231
|
+
this.addPreDeployStage(configSourceOutput, mdaaSourceOutput, preDeployOutput, pipelineProjects);
|
|
232
|
+
this.addPreDeployValidateStage(preDeployOutput, pipelineProjects);
|
|
233
|
+
this.addDeployStage(preDeployOutput, pipelineProjects);
|
|
234
|
+
this.addPostDeployValidateStage(preDeployOutput, pipelineProjects);
|
|
235
|
+
const codeBuildActionPolicy = new aws_iam_1.Policy(this, 'codebuild-action-policy', {
|
|
236
|
+
statements: [
|
|
237
|
+
new aws_iam_1.PolicyStatement({
|
|
238
|
+
actions: ['codebuild:StartBuild'],
|
|
239
|
+
resources: pipelineProjects.map(x => x.projectArn),
|
|
240
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
241
|
+
}),
|
|
242
|
+
],
|
|
243
|
+
});
|
|
244
|
+
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(codeBuildActionPolicy, [
|
|
245
|
+
{ id: 'NIST.800.53.R5-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
246
|
+
{ id: 'HIPAA.Security-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
247
|
+
{ id: 'PCI.DSS.321-IAMNoInlinePolicy', reason: 'Inline policy appropriate.' },
|
|
248
|
+
], true);
|
|
249
|
+
this.props.codeBuildActionRole.attachInlinePolicy(codeBuildActionPolicy);
|
|
250
|
+
}
|
|
251
|
+
addPostDeployValidateStage(preDeployOutput, pipelineProjects) {
|
|
252
|
+
if (this.props.postDeployValidate) {
|
|
253
|
+
const [validateAction, validateProject] = this.createCodeBuildAction('PostDeployValidate', preDeployOutput, undefined, undefined, {
|
|
254
|
+
installCommands: [...(this.props.install ?? []), ...(this.props.postDeployValidate?.install ?? [])],
|
|
255
|
+
preCommands: undefined,
|
|
256
|
+
commands: [...(this.props.postDeployValidate?.commands ?? [])],
|
|
257
|
+
});
|
|
258
|
+
pipelineProjects.push(validateProject);
|
|
259
|
+
const postDeployValidateStage = this.addStage({
|
|
260
|
+
stageName: 'Post-Deploy-Validate',
|
|
261
|
+
});
|
|
262
|
+
postDeployValidateStage.addAction(validateAction);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
addDeployStage(preDeployOutput, pipelineProjects) {
|
|
266
|
+
const deployStage = this.addStage({ stageName: 'Deploy' });
|
|
267
|
+
const [deployAction, deployProject] = this.createCodeBuildAction('Deploy', preDeployOutput, undefined, undefined, {
|
|
268
|
+
installCommands: ['n 18', ...(this.props.install ?? []), ...(this.props.deploy?.install ?? [])],
|
|
269
|
+
preCommands: [...(this.props.pre ?? []), ...(this.props.deploy?.pre ?? [])],
|
|
270
|
+
commands: [this.createMdaaCommand('deploy')],
|
|
271
|
+
postCommands: [...(this.props.post ?? []), ...(this.props.deploy?.post ?? [])],
|
|
272
|
+
});
|
|
273
|
+
deployStage.addAction(deployAction);
|
|
274
|
+
pipelineProjects.push(deployProject);
|
|
275
|
+
}
|
|
276
|
+
addPreDeployValidateStage(preDeployOutput, pipelineProjects) {
|
|
277
|
+
const preDeployValidateStage = this.addStage({
|
|
278
|
+
stageName: 'Pre-Deploy-Validate',
|
|
279
|
+
});
|
|
280
|
+
if (this.props.preDeployValidate) {
|
|
281
|
+
const [validateAction, validateProject] = this.createCodeBuildAction('PreDeployValidate', preDeployOutput, undefined, undefined, {
|
|
282
|
+
installCommands: [...(this.props.install ?? []), ...(this.props.preDeployValidate?.install ?? [])],
|
|
283
|
+
preCommands: undefined,
|
|
284
|
+
commands: [...(this.props.preDeployValidate?.commands ?? [])],
|
|
285
|
+
});
|
|
286
|
+
preDeployValidateStage.addAction(validateAction);
|
|
287
|
+
pipelineProjects.push(validateProject);
|
|
288
|
+
}
|
|
289
|
+
preDeployValidateStage.addAction(new aws_codepipeline_actions_1.ManualApprovalAction({
|
|
290
|
+
actionName: 'Approve',
|
|
291
|
+
role: this.props.manualActionRole,
|
|
292
|
+
}));
|
|
293
|
+
}
|
|
294
|
+
addPreDeployStage(configSourceOutput, mdaaSourceOutput, preDeployOutput, pipelineProjects) {
|
|
295
|
+
const preDeployStage = this.addStage({ stageName: 'Pre-Deploy' });
|
|
296
|
+
const [diffAction, diffProject] = this.createCodeBuildAction('Synth-And-Diff', configSourceOutput, [mdaaSourceOutput], [preDeployOutput], {
|
|
297
|
+
installCommands: [
|
|
298
|
+
'n 18',
|
|
299
|
+
'ln -s $CODEBUILD_SRC_DIR_MDAA ./mdaa',
|
|
300
|
+
...(this.props.install ?? []),
|
|
301
|
+
...(this.props.preDeploy?.install ?? []),
|
|
302
|
+
],
|
|
303
|
+
preCommands: [...(this.props.pre ?? []), ...(this.props.preDeploy?.pre ?? [])],
|
|
304
|
+
commands: [this.createMdaaCommand('diff')],
|
|
305
|
+
postCommands: [...(this.props.post ?? []), ...(this.props.preDeploy?.post ?? [])],
|
|
306
|
+
});
|
|
307
|
+
preDeployStage.addAction(diffAction);
|
|
308
|
+
pipelineProjects.push(diffProject);
|
|
309
|
+
return diffProject;
|
|
310
|
+
}
|
|
311
|
+
createCodeCommitSourceAction(actionName, output, role, eventRole, repository, branch) {
|
|
312
|
+
return new aws_codepipeline_actions_1.CodeCommitSourceAction({
|
|
313
|
+
output,
|
|
314
|
+
actionName: actionName,
|
|
315
|
+
role: role,
|
|
316
|
+
runOrder: undefined,
|
|
317
|
+
branch: branch,
|
|
318
|
+
trigger: aws_codepipeline_actions_1.CodeCommitTrigger.EVENTS,
|
|
319
|
+
repository: repository,
|
|
320
|
+
eventRole: eventRole,
|
|
321
|
+
codeBuildCloneOutput: true,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
createMdaaCommand(mdaaAction) {
|
|
325
|
+
const mdaaCmd = [`./mdaa/bin/mdaa ${mdaaAction}`];
|
|
326
|
+
if (this.props.domainFilter) {
|
|
327
|
+
mdaaCmd.push(`-d ${this.props.domainFilter.join(',')}`);
|
|
328
|
+
}
|
|
329
|
+
if (this.props.envFilter) {
|
|
330
|
+
mdaaCmd.push(`-e ${this.props.envFilter.join(',')}`);
|
|
331
|
+
}
|
|
332
|
+
if (this.props.moduleFilter) {
|
|
333
|
+
mdaaCmd.push(`-m ${this.props.moduleFilter.join(',')}`);
|
|
334
|
+
}
|
|
335
|
+
return mdaaCmd.join(' ');
|
|
336
|
+
}
|
|
337
|
+
createCodeBuildAction(actionName, input, extraInputs, outputs, commands) {
|
|
338
|
+
const projectProps = {
|
|
339
|
+
projectName: this.props.naming.resourceName(actionName),
|
|
340
|
+
encryptionKey: this.props.kmsKey,
|
|
341
|
+
role: this.props.codeBuildActionRole,
|
|
342
|
+
environment: {
|
|
343
|
+
computeType: aws_codebuild_1.ComputeType.X2_LARGE,
|
|
344
|
+
buildImage: aws_codebuild_1.LinuxBuildImage.AMAZON_LINUX_2_5,
|
|
345
|
+
},
|
|
346
|
+
buildSpec: aws_codebuild_1.BuildSpec.fromObject({
|
|
347
|
+
version: '0.2',
|
|
348
|
+
phases: {
|
|
349
|
+
install: {
|
|
350
|
+
commands: commands?.installCommands,
|
|
351
|
+
},
|
|
352
|
+
pre_build: {
|
|
353
|
+
commands: commands?.preCommands,
|
|
354
|
+
},
|
|
355
|
+
build: {
|
|
356
|
+
commands: commands?.commands,
|
|
357
|
+
},
|
|
358
|
+
post_build: {
|
|
359
|
+
commands: commands?.postCommands,
|
|
360
|
+
},
|
|
361
|
+
},
|
|
362
|
+
artifacts: {
|
|
363
|
+
files: ['**/*'],
|
|
364
|
+
'enable-symlinks': 'yes',
|
|
365
|
+
},
|
|
366
|
+
}),
|
|
367
|
+
};
|
|
368
|
+
const codeBuildProject = new aws_codebuild_1.PipelineProject(this, `codebuild-project-${actionName}`, projectProps);
|
|
369
|
+
const codeBuildActionProps = {
|
|
370
|
+
input: input,
|
|
371
|
+
extraInputs: extraInputs,
|
|
372
|
+
actionName: actionName,
|
|
373
|
+
project: codeBuildProject,
|
|
374
|
+
role: this.props.codeBuildActionRole,
|
|
375
|
+
outputs: outputs,
|
|
376
|
+
};
|
|
377
|
+
const action = new aws_codepipeline_actions_1.CodeBuildAction(codeBuildActionProps);
|
|
378
|
+
return [action, codeBuildProject];
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
exports.MdaaPipeline = MdaaPipeline;
|
|
382
|
+
class FixCdkBuildProject {
|
|
383
|
+
visit(construct) {
|
|
384
|
+
if (construct.node.id.startsWith('codebuild-project')) {
|
|
385
|
+
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(construct, [
|
|
386
|
+
{ id: 'HIPAA.Security-CodeBuildProjectSourceRepoUrl', reason: 'Pipeline source is CodeCommit.' },
|
|
387
|
+
{ id: 'PCI.DSS.321-CodeBuildProjectSourceRepoUrl', reason: 'Pipeline source is CodeCommit.' },
|
|
388
|
+
], true);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2b3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGV2b3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILHVDQUFrSDtBQUNsSCw2REFBb0Q7QUFDcEQsNkRBQXNEO0FBQ3RELHlEQUErRTtBQUUvRSwyREFBcUQ7QUFFckQsNkNBQWdFO0FBQ2hFLDZEQU1tQztBQUNuQywrREFBcUU7QUFDckUsbUVBQStGO0FBQy9GLG1GQU04QztBQUM5QyxpREFXNkI7QUFFN0IsK0NBQTRDO0FBRTVDLHFEQUFxRDtBQUNyRCxtREFBMEQsQ0FBQyxTQUFTO0FBK0pwRSxNQUFhLGtCQUFtQixTQUFRLHlCQUF5QztJQUcvRSxZQUFZLEtBQVksRUFBRSxLQUErQjtRQUN2RCxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFzQixDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQVJELGdEQVFDO0FBRUQsTUFBYSxnQkFBaUIsU0FBUSxnQkFBVTtJQUM5QyxZQUFZLEtBQWdCO1FBQzFCLEtBQUssQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxnQkFBVSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDL0csQ0FBQztJQUNTLG9CQUFvQixDQUM1QixLQUFZLEVBQ1osZ0JBQXNDLEVBQ3RDLFdBQXFDO1FBRXJDLE1BQU0sU0FBUyxHQUFHLElBQUksa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzdELElBQUkscUJBQXFCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUN6QyxHQUFHLGdCQUFnQjtZQUNuQixHQUFHLFNBQVMsQ0FBQyxZQUFZO1NBQzFCLENBQUMsQ0FBQztRQUNILHFCQUFPLENBQUMs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SUFBSSwwQ0FBZSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDekQsT0FBTyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Q0FDRjtBQXRQRCxvQ0FzUEM7QUFFRCxNQUFNLGtCQUFrQjtJQUNmLEtBQUssQ0FBQyxTQUFxQjtRQUNoQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ3JELCtCQUFtQixDQUFDLDJCQUEyQixDQUM3QyxTQUFTLEVBQ1Q7Z0JBQ0UsRUFBRSxFQUFFLEVBQUUsOENBQThDLEVBQUUsTUFBTSxFQUFFLGdDQUFnQyxFQUFFO2dCQUNoRyxFQUFFLEVBQUUsRUFBRSwyQ0FBMkMsRUFBRSxNQUFNLEVBQUUsZ0NBQWdDLEVBQUU7YUFDOUYsRUFDRCxJQUFJLENBQ0wsQ0FBQztTQUNIO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgTWRhYUFwcENvbmZpZ1BhcnNlciwgTWRhYUFwcENvbmZpZ1BhcnNlclByb3BzLCBNZGFhQmFzZUNvbmZpZ0NvbnRlbnRzLCBNZGFhQ2RrQXBwIH0gZnJvbSAnQGF3cy1tZGFhL2FwcCc7XG5pbXBvcnQgeyBNZGFhUm9sZSB9IGZyb20gJ0Bhd3MtbWRhYS9pYW0tY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhS21zS2V5IH0gZnJvbSAnQGF3cy1tZGFhL2ttcy1jb25zdHJ1Y3RzJztcbmltcG9ydCB7IE1kYWFMM0NvbnN0cnVjdCwgTWRhYUwzQ29uc3RydWN0UHJvcHMgfSBmcm9tICdAYXdzLW1kYWEvbDMtY29uc3RydWN0JztcbmltcG9ydCB7IElNZGFhUmVzb3VyY2VOYW1pbmcgfSBmcm9tICdAYXdzLW1kYWEvbmFtaW5nJztcbmltcG9ydCB7IE1kYWFCdWNrZXQgfSBmcm9tICdAYXdzLW1kYWEvczMtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBTY2hlbWEgfSBmcm9tICdhanYnO1xuaW1wb3J0IHsgQXBwUHJvcHMsIEFzcGVjdHMsIElBc3BlY3QsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgQnVpbGRTcGVjLFxuICBDb21wdXRlVHlwZSxcbiAgTGludXhCdWlsZEltYWdlLFxuICBQaXBlbGluZVByb2plY3QsXG4gIFBpcGVsaW5lUHJvamVjdFByb3BzLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkJztcbmltcG9ydCB7IElSZXBvc2l0b3J5LCBSZXBvc2l0b3J5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVjb21taXQnO1xuaW1wb3J0IHsgQXJ0aWZhY3QsIFBpcGVsaW5lLCBQaXBlbGluZVByb3BzLCBQaXBlbGluZVR5cGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lJztcbmltcG9ydCB7XG4gIENvZGVCdWlsZEFjdGlvbixcbiAgQ29kZUJ1aWxkQWN0aW9uUHJvcHMsXG4gIENvZGVDb21taXRTb3VyY2VBY3Rpb24sXG4gIENvZGVDb21taXRUcmlnZ2VyLFxuICBNYW51YWxBcHByb3ZhbEFjdGlvbixcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZS1hY3Rpb25zJztcbmltcG9ydCB7XG4gIEFjY291bnRQcmluY2lwYWwsXG4gIENvbXBvc2l0ZVByaW5jaXBhbCxcbiAgRWZmZWN0LFxuICBJUm9sZSxcbiAgTWFuYWdlZFBvbGljeSxcbiAgUG9saWN5LFxuICBQb2xpY3lEb2N1bWVudCxcbiAgUG9saWN5U3RhdGVtZW50LFxuICBSb2xlLFxuICBTZXJ2aWNlUHJpbmNpcGFsLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IElLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGNvbmZpZ1NjaGVtYSBmcm9tICcuL2NvbmZpZy1zY2hlbWEuanNvbic7XG5pbXBvcnQgeyBNZGFhTmFnU3VwcHJlc3Npb25zIH0gZnJvbSAnQGF3cy1tZGFhL2NvbnN0cnVjdCc7IC8vTk9TT05BUlxuXG4vKipcbiAqIFEtRU5IQU5DRUQtSU5URVJGQUNFXG4gKiBWYWxpZGF0aW9uIHN0YWdlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIENvZGVCdWlsZCB2YWxpZGF0aW9uIHByb2plY3RzIHRoYXQgZXhlY3V0ZSBpbmZyYXN0cnVjdHVyZSB0ZXN0aW5nIGFuZCBjb21wbGlhbmNlIHZlcmlmaWNhdGlvbiBkdXJpbmcgTURBQSBkZXBsb3ltZW50IHBpcGVsaW5lcy4gRGVmaW5lcyBpbnN0YWxsIGRlcGVuZGVuY2llcyBhbmQgdmFsaWRhdGlvbiBjb21tYW5kcyB0aGF0IHJ1biBpbiBDb2RlQnVpbGQgZW52aXJvbm1lbnRzIHRvIHZlcmlmeSBkZXBsb3llZCBpbmZyYXN0cnVjdHVyZSBtZWV0cyByZXF1aXJlbWVudHMgYmVmb3JlIHBpcGVsaW5lIHByb2dyZXNzaW9uLlxuICpcbiAqIFVzZSBjYXNlczogSW5mcmFzdHJ1Y3R1cmUgc21va2UgdGVzdGluZzsgQ29tcGxpYW5jZSB2ZXJpZmljYXRpb247IERlcGxveW1lbnQgdmFsaWRhdGlvbjsgUXVhbGl0eSBnYXRlIGVuZm9yY2VtZW50OyBQb3N0LWRlcGxveW1lbnQgdmVyaWZpY2F0aW9uXG4gKlxuICogQVdTOiBBV1MgQ29kZUJ1aWxkIHZhbGlkYXRpb24gcHJvamVjdCBjb21tYW5kcyB3aXRoIGluc3RhbGwgZGVwZW5kZW5jaWVzIGFuZCB2YWxpZGF0aW9uIHNjcmlwdCBleGVjdXRpb24gZm9yIHBpcGVsaW5lIHF1YWxpdHkgZ2F0ZXNcbiAqXG4gKiBWYWxpZGF0aW9uOiBpbnN0YWxsIGNvbW1hbmRzIG11c3QgYmUgdmFsaWQgcGFja2FnZSBtYW5hZ2VyIGNvbW1hbmRzOyBjb21tYW5kcyBtdXN0IGJlIGV4ZWN1dGFibGUgc2hlbGwgc2NyaXB0cyB0aGF0IHJldHVybiBhcHByb3ByaWF0ZSBleGl0IGNvZGVzIGZvciBwaXBlbGluZSBzdWNjZXNzL2ZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0ZVN0YWdlQ29tbWFuZHMge1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBhcnJheSBvZiBwYWNrYWdlIGluc3RhbGxhdGlvbiBjb21tYW5kcyBmb3IgQ29kZUJ1aWxkIHZhbGlkYXRpb24gZW52aXJvbm1lbnQgc2V0dXAgZW5hYmxpbmcgdGVzdGluZyB0b29sIGluc3RhbGxhdGlvbiBhbmQgZGVwZW5kZW5jeSBtYW5hZ2VtZW50LiBEZWZpbmVzIGNvbW1hbmRzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBkdXJpbmcgdGhlIGluc3RhbGwgcGhhc2UgdG8gaW5zdGFsbCByZXF1aXJlZCB0ZXN0aW5nIGZyYW1ld29ya3MsIHZhbGlkYXRpb24gdG9vbHMsIGFuZCBkZXBlbmRlbmNpZXMgbmVlZGVkIGZvciBpbmZyYXN0cnVjdHVyZSB2YWxpZGF0aW9uIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogVGVzdGluZyB0b29sIGluc3RhbGxhdGlvbjsgVmFsaWRhdGlvbiBkZXBlbmRlbmN5IHNldHVwOyBUZXN0aW5nIGZyYW1ld29yayBpbnN0YWxsYXRpb247IEVudmlyb25tZW50IHByZXBhcmF0aW9uOyBWYWxpZGF0aW9uIHRvb2wgc2V0dXBcbiAgICpcbiAgICogQVdTOiBBV1MgQ29kZUJ1aWxkIHZhbGlkYXRpb24gaW5zdGFsbCBwaGFzZSBjb21tYW5kcyBmb3IgdGVzdGluZyB0b29sIGluc3RhbGxhdGlvbiBhbmQgdmFsaWRhdGlvbiBlbnZpcm9ubWVudCBzZXR1cFxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIGFycmF5IG9mIHZhbGlkIHNoZWxsIGNvbW1hbmRzIGlmIHByb3ZpZGVkOyBjb21tYW5kcyBleGVjdXRlIGluIENvZGVCdWlsZCBMaW51eCBlbnZpcm9ubWVudDsgb3B0aW9uYWwgZm9yIHZhbGlkYXRpb24gaW5zdGFsbCBwaGFzZVxuICAgKiovXG4gIHJlYWRvbmx5IGluc3RhbGw/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgYXJyYXkgb2YgdmFsaWRhdGlvbiBjb21tYW5kcyBmb3IgaW5mcmFzdHJ1Y3R1cmUgdGVzdGluZyBhbmQgY29tcGxpYW5jZSB2ZXJpZmljYXRpb24gZW5hYmxpbmcgcXVhbGl0eSBnYXRlIGVuZm9yY2VtZW50LiBEZWZpbmVzIGNvbW1hbmRzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB0byB2YWxpZGF0ZSBkZXBsb3llZCBpbmZyYXN0cnVjdHVyZSwgcGVyZm9ybSBzbW9rZSB0ZXN0cywgYW5kIHZlcmlmeSBjb21wbGlhbmNlIHJlcXVpcmVtZW50cyBiZWZvcmUgcGlwZWxpbmUgcHJvZ3Jlc3Npb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogSW5mcmFzdHJ1Y3R1cmUgc21va2UgdGVzdGluZzsgQ29tcGxpYW5jZSB2ZXJpZmljYXRpb247IFF1YWxpdHkgZ2F0ZSBlbmZvcmNlbWVudDsgUG9zdC1kZXBsb3ltZW50IHZhbGlkYXRpb247IEluZnJhc3RydWN0dXJlIHRlc3RpbmdcbiAgICpcbiAgICogQVdTOiBBV1MgQ29kZUJ1aWxkIHZhbGlkYXRpb24gY29tbWFuZHMgZm9yIGluZnJhc3RydWN0dXJlIHRlc3RpbmcgYW5kIGNvbXBsaWFuY2UgdmVyaWZpY2F0aW9uIHdpdGggcXVhbGl0eSBnYXRlIGVuZm9yY2VtZW50XG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgYXJyYXkgb2YgdmFsaWQgc2hlbGwgY29tbWFuZHMgaWYgcHJvdmlkZWQ7IGNvbW1hbmRzIG11c3QgcmV0dXJuIGFwcHJvcHJpYXRlIGV4aXQgY29kZXMgZm9yIHBpcGVsaW5lIHN1Y2Nlc3MvZmFpbHVyZTsgb3B0aW9uYWwgZm9yIHZhbGlkYXRpb24gZXhlY3V0aW9uXG4gICAqKi9cbiAgcmVhZG9ubHkgY29tbWFuZHM/OiBzdHJpbmdbXTtcbn1cbi8qKlxuICogUS1FTkhBTkNFRC1JTlRFUkZBQ0VcbiAqIERlcGxveW1lbnQgc3RhZ2UgY29tbWFuZCBjb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgQ29kZUJ1aWxkIHByb2plY3RzIHRoYXQgZXhlY3V0ZSBjdXN0b20gc2NyaXB0cyBkdXJpbmcgTURBQSBkZXBsb3ltZW50IHBpcGVsaW5lIHN0YWdlcy4gRGVmaW5lcyBpbnN0YWxsIGRlcGVuZGVuY2llcywgcHJlLWRlcGxveW1lbnQgcHJlcGFyYXRpb24gY29tbWFuZHMsIGFuZCBwb3N0LWRlcGxveW1lbnQgY2xlYW51cCBjb21tYW5kcyB0aGF0IHJ1biBpbiBDb2RlQnVpbGQgZW52aXJvbm1lbnRzIHRvIGN1c3RvbWl6ZSBkZXBsb3ltZW50IGJlaGF2aW9yIGFuZCBwZXJmb3JtIGVudmlyb25tZW50LXNwZWNpZmljIG9wZXJhdGlvbnMuXG4gKlxuICogVXNlIGNhc2VzOiBFbnZpcm9ubWVudCBwcmVwYXJhdGlvbjsgQ3VzdG9tIGRlcGxveW1lbnQgc2NyaXB0czsgUG9zdC1kZXBsb3ltZW50IGNsZWFudXA7IEluZnJhc3RydWN0dXJlIGN1c3RvbWl6YXRpb247IEVudmlyb25tZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBBV1M6IEFXUyBDb2RlQnVpbGQgcHJvamVjdCBjb21tYW5kcyB3aXRoIGluc3RhbGwsIHByZS1leGVjdXRpb24sIGFuZCBwb3N0LWV4ZWN1dGlvbiBob29rcyBmb3IgZGVwbG95bWVudCBzdGFnZSBjdXN0b21pemF0aW9uXG4gKlxuICogVmFsaWRhdGlvbjogaW5zdGFsbCBjb21tYW5kcyBtdXN0IGJlIHZhbGlkIHBhY2thZ2UgbWFuYWdlciBjb21tYW5kczsgcHJlL3Bvc3QgY29tbWFuZHMgbXVzdCBiZSBleGVjdXRhYmxlIHNoZWxsIHNjcmlwdHM7IGNvbW1hbmRzIGV4ZWN1dGUgaW4gQ29kZUJ1aWxkIExpbnV4IGVudmlyb25tZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VDb21tYW5kcyB7XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGFycmF5IG9mIHBhY2thZ2UgaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGZvciBDb2RlQnVpbGQgZW52aXJvbm1lbnQgc2V0dXAgZW5hYmxpbmcgZGVwZW5kZW5jeSBtYW5hZ2VtZW50IGFuZCB0b29sIGluc3RhbGxhdGlvbi4gRGVmaW5lcyBjb21tYW5kcyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgZHVyaW5nIHRoZSBpbnN0YWxsIHBoYXNlIHRvIGluc3RhbGwgcmVxdWlyZWQgcGFja2FnZXMsIGRlcGVuZGVuY2llcywgYW5kIHRvb2xzIG5lZWRlZCBmb3IgZGVwbG95bWVudCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IERlcGVuZGVuY3kgaW5zdGFsbGF0aW9uOyBUb29sIHNldHVwOyBQYWNrYWdlIG1hbmFnZW1lbnQ7IEVudmlyb25tZW50IHByZXBhcmF0aW9uOyBCdWlsZCB0b29sIGluc3RhbGxhdGlvblxuICAgKlxuICAgKiBBV1M6IEFXUyBDb2RlQnVpbGQgaW5zdGFsbCBwaGFzZSBjb21tYW5kcyBmb3IgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gYW5kIGVudmlyb25tZW50IHNldHVwXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgYXJyYXkgb2YgdmFsaWQgc2hlbGwgY29tbWFuZHMgaWYgcHJvdmlkZWQ7IGNvbW1hbmRzIGV4ZWN1dGUgaW4gQ29kZUJ1aWxkIExpbnV4IGVudmlyb25tZW50OyBvcHRpb25hbCBmb3IgaW5zdGFsbCBwaGFzZVxuICAgKiovXG4gIHJlYWRvbmx5IGluc3RhbGw/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgYXJyYXkgb2YgcHJlLWV4ZWN1dGlvbiBjb21tYW5kcyBmb3IgZGVwbG95bWVudCBzdGFnZSBwcmVwYXJhdGlvbiBlbmFibGluZyBjdXN0b20gc2V0dXAgYW5kIHZhbGlkYXRpb24gYmVmb3JlIG1haW4gZGVwbG95bWVudCBvcGVyYXRpb25zLiBEZWZpbmVzIGNvbW1hbmRzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIG1haW4gZGVwbG95bWVudCBzdGFnZSB0byBwZXJmb3JtIGVudmlyb25tZW50IHByZXBhcmF0aW9uLCB2YWxpZGF0aW9uLCBhbmQgY3VzdG9tIHNldHVwIHRhc2tzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEVudmlyb25tZW50IHByZXBhcmF0aW9uOyBQcmUtZGVwbG95bWVudCB2YWxpZGF0aW9uOyBDdXN0b20gc2V0dXA7IENvbmZpZ3VyYXRpb24gdmVyaWZpY2F0aW9uOyBQcmVyZXF1aXNpdGUgY2hlY2tzXG4gICAqXG4gICAqIEFXUzogQVdTIENvZGVCdWlsZCBwcmUtZXhlY3V0aW9uIGNvbW1hbmRzIGZvciBkZXBsb3ltZW50IHN0YWdlIHByZXBhcmF0aW9uIGFuZCB2YWxpZGF0aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgYXJyYXkgb2YgdmFsaWQgc2hlbGwgY29tbWFuZHMgaWYgcHJvdmlkZWQ7IGNvbW1hbmRzIGV4ZWN1dGUgaW4gQ29kZUJ1aWxkIExpbnV4IGVudmlyb25tZW50OyBvcHRpb25hbCBmb3IgcHJlLWV4ZWN1dGlvbiBwaGFzZVxuICAgKiovXG4gIHJlYWRvbmx5IHByZT86IHN0cmluZ1tdO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBhcnJheSBvZiBwb3N0LWV4ZWN1dGlvbiBjb21tYW5kcyBmb3IgZGVwbG95bWVudCBzdGFnZSBjbGVhbnVwIGFuZCBmaW5hbGl6YXRpb24gZW5hYmxpbmcgY3VzdG9tIGNsZWFudXAgYW5kIHBvc3QtZGVwbG95bWVudCBvcGVyYXRpb25zLiBEZWZpbmVzIGNvbW1hbmRzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciB0aGUgbWFpbiBkZXBsb3ltZW50IHN0YWdlIHRvIHBlcmZvcm0gY2xlYW51cCwgbm90aWZpY2F0aW9uLCB2YWxpZGF0aW9uLCBhbmQgZmluYWxpemF0aW9uIHRhc2tzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IFBvc3QtZGVwbG95bWVudCBjbGVhbnVwOyBOb3RpZmljYXRpb24gc2VuZGluZzsgVmFsaWRhdGlvbiBjaGVja3M7IFJlc291cmNlIGNsZWFudXA7IEZpbmFsaXphdGlvbiB0YXNrc1xuICAgKlxuICAgKiBBV1M6IEFXUyBDb2RlQnVpbGQgcG9zdC1leGVjdXRpb24gY29tbWFuZHMgZm9yIGRlcGxveW1lbnQgc3RhZ2UgY2xlYW51cCBhbmQgZmluYWxpemF0aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgYXJyYXkgb2YgdmFsaWQgc2hlbGwgY29tbWFuZHMgaWYgcHJvdmlkZWQ7IGNvbW1hbmRzIGV4ZWN1dGUgaW4gQ29kZUJ1aWxkIExpbnV4IGVudmlyb25tZW50OyBvcHRpb25hbCBmb3IgcG9zdC1leGVjdXRpb24gcGhhc2VcbiAgICoqL1xuICByZWFkb25seSBwb3N0Pzogc3RyaW5nW107XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRzIGV4dGVuZHMgU3RhZ2VDb21tYW5kcyB7XG4gIHJlYWRvbmx5IHByZURlcGxveT86IFN0YWdlQ29tbWFuZHM7XG4gIHJlYWRvbmx5IHByZURlcGxveVZhbGlkYXRlPzogVmFsaWRhdGVTdGFnZUNvbW1hbmRzO1xuICByZWFkb25seSBkZXBsb3k/OiBTdGFnZUNvbW1hbmRzO1xuICByZWFkb25seSBwb3N0RGVwbG95VmFsaWRhdGU/OiBWYWxpZGF0ZVN0YWdlQ29tbWFuZHM7XG59XG4vKipcbiAqIFEtRU5IQU5DRUQtSU5URVJGQUNFXG4gKiBNREFBIERldk9wcyBjb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgQ0kvQ0QgcGlwZWxpbmUgb3JjaGVzdHJhdGlvbiB3aXRoIENvZGVDb21taXQgcmVwb3NpdG9yeSBpbnRlZ3JhdGlvbiBhbmQgbXVsdGktZW52aXJvbm1lbnQgZGVwbG95bWVudCBtYW5hZ2VtZW50LiBEZWZpbmVzIHRoZSBjb21wbGV0ZSBEZXZPcHMgaW5mcmFzdHJ1Y3R1cmUgaW5jbHVkaW5nIHNvdXJjZSByZXBvc2l0b3JpZXMsIGRlcGxveW1lbnQgcGlwZWxpbmVzLCBhbmQgQ0RLIGJvb3RzdHJhcCBjb25maWd1cmF0aW9uIGZvciBhdXRvbWF0ZWQgTURBQSBpbmZyYXN0cnVjdHVyZSBkZXBsb3ltZW50IGFjcm9zcyBtdWx0aXBsZSBlbnZpcm9ubWVudHMgd2l0aCBhcHByb3ZhbCBnYXRlcyBhbmQgdmFsaWRhdGlvbiBzdGFnZXMuXG4gKlxuICogVXNlIGNhc2VzOiBNdWx0aS1lbnZpcm9ubWVudCBDSS9DRCBwaXBlbGluZXM7IEF1dG9tYXRlZCBNREFBIGRlcGxveW1lbnRzOyBDb25maWd1cmF0aW9uIHJlcG9zaXRvcnkgbWFuYWdlbWVudDsgSW5mcmFzdHJ1Y3R1cmUgY2hhbmdlIG1hbmFnZW1lbnQ7IERldk9wcyBhdXRvbWF0aW9uXG4gKlxuICogQVdTOiBBV1MgQ29kZVBpcGVsaW5lIHdpdGggQ29kZUNvbW1pdCBzb3VyY2UgcmVwb3NpdG9yaWVzLCBDb2RlQnVpbGQgcHJvamVjdHMgZm9yIE1EQUEgQ0xJIGV4ZWN1dGlvbiwgYW5kIENESyBib290c3RyYXAgaW50ZWdyYXRpb24gZm9yIGluZnJhc3RydWN0dXJlIGRlcGxveW1lbnRcbiAqXG4gKiBWYWxpZGF0aW9uOiBtZGFhQ29kZUNvbW1pdFJlcG8gYW5kIGNvbmZpZ3NDb2RlQ29tbWl0UmVwbyBtdXN0IGJlIHZhbGlkIENvZGVDb21taXQgcmVwb3NpdG9yeSBuYW1lczsgcGlwZWxpbmVzIG11c3QgY29udGFpbiB2YWxpZCBQaXBlbGluZUNvbmZpZyBvYmplY3RzOyBjZGtCb290c3RyYXBDb250ZXh0IG11c3QgYmUgdmFsaWQgQ0RLIHF1YWxpZmllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldk9wc0NvbmZpZ0NvbnRlbnRzIGV4dGVuZHMgTWRhYUJhc2VDb25maWdDb250ZW50cywgQ29tbWFuZHMge1xuICByZWFkb25seSBtZGFhQ29kZUNvbW1pdFJlcG86IHN0cmluZztcbiAgcmVhZG9ubHkgbWRhYUJyYW5jaD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29uZmlnc0NvZGVDb21taXRSZXBvOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZ3NCcmFuY2g/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBpcGVsaW5lcz86IHsgW3BpcGVsaW5lTmFtZTogc3RyaW5nXTogUGlwZWxpbmVDb25maWcgfTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogQ0RLIGJvb3RzdHJhcCBjb250ZXh0IHF1YWxpZmllciBmb3IgaWRlbnRpZnlpbmcgQ0RLIGJvb3RzdHJhcCByZXNvdXJjZXMgaW4gdGhlIHRhcmdldCBlbnZpcm9ubWVudC4gRGVmaW5lcyB0aGUgQ0RLIGJvb3RzdHJhcCBxdWFsaWZpZXIgdXNlZCB0byBsb2NhdGUgQ0RLIGRlcGxveW1lbnQgcm9sZXMsIGJ1Y2tldHMsIGFuZCBvdGhlciBib290c3RyYXAgcmVzb3VyY2VzIGZvciBNREFBIGluZnJhc3RydWN0dXJlIGRlcGxveW1lbnQgdGhyb3VnaCBDSS9DRCBwaXBlbGluZXMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ0RLIGJvb3RzdHJhcCByZXNvdXJjZSBpZGVudGlmaWNhdGlvbjsgTXVsdGktZW52aXJvbm1lbnQgQ0RLIGRlcGxveW1lbnQ7IEJvb3RzdHJhcCByZXNvdXJjZSBpc29sYXRpb247IENESyByb2xlIG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBBV1MgQ0RLIGJvb3RzdHJhcCByZXNvdXJjZXMgaW5jbHVkaW5nIGRlcGxveW1lbnQgcm9sZXMgYW5kIGFzc2V0IGJ1Y2tldHNcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSB2YWxpZCBDREsgYm9vdHN0cmFwIHF1YWxpZmllciBzdHJpbmc7IGRlZmF1bHRzIHRvIHN0YW5kYXJkIENESyBxdWFsaWZpZXIgaWYgbm90IHNwZWNpZmllZDsgb3B0aW9uYWwgc3RyaW5nXG4gICAqKi9cbiAgcmVhZG9ubHkgY2RrQm9vdHN0cmFwQ29udGV4dD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBRLUVOSEFOQ0VELUlOVEVSRkFDRVxuICogSW5kaXZpZHVhbCBwaXBlbGluZSBjb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgZW52aXJvbm1lbnQtc3BlY2lmaWMgTURBQSBkZXBsb3ltZW50IHBpcGVsaW5lcyB3aXRoIGRvbWFpbiwgZW52aXJvbm1lbnQsIGFuZCBtb2R1bGUgZmlsdGVyaW5nIGNhcGFiaWxpdGllcy4gRGVmaW5lcyBwaXBlbGluZS1zcGVjaWZpYyBkZXBsb3ltZW50IHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRhcmdldCBmaWx0ZXJzIGZvciBzZWxlY3RpdmUgZGVwbG95bWVudCwgY3VzdG9tIGNvbW1hbmQgZXhlY3V0aW9uLCBhbmQgcGlwZWxpbmUtbGV2ZWwgZGVwbG95bWVudCBsaWZlY3ljbGUgbWFuYWdlbWVudCBmb3IgdGFyZ2V0ZWQgaW5mcmFzdHJ1Y3R1cmUgZGVwbG95bWVudCB3aXRoaW4gbXVsdGktZG9tYWluIGRhdGEgYXJjaGl0ZWN0dXJlcy5cbiAqIFVzZSBjYXNlczogRW52aXJvbm1lbnQtc3BlY2lmaWMgcGlwZWxpbmVzOyBTZWxlY3RpdmUgbW9kdWxlIGRlcGxveW1lbnQ7IERvbWFpbi1maWx0ZXJlZCBkZXBsb3ltZW50czsgUGlwZWxpbmUgY3VzdG9taXphdGlvbjsgVGFyZ2V0ZWQgaW5mcmFzdHJ1Y3R1cmUgdXBkYXRlc1xuICogQVdTOiBBV1MgQ29kZVBpcGVsaW5lIGNvbmZpZ3VyYXRpb24gd2l0aCBkb21haW4vZW52aXJvbm1lbnQvbW9kdWxlIGZpbHRlcmluZyBmb3Igc2VsZWN0aXZlIE1EQUEgZGVwbG95bWVudCB0YXJnZXRpbmcgc3BlY2lmaWMgaW5mcmFzdHJ1Y3R1cmUgY29tcG9uZW50c1xuICogVmFsaWRhdGlvbjogZG9tYWluRmlsdGVyLCBlbnZGaWx0ZXIsIGFuZCBtb2R1bGVGaWx0ZXIgbXVzdCByZWZlcmVuY2UgdmFsaWQgTURBQSBkb21haW5zLCBlbnZpcm9ubWVudHMsIGFuZCBtb2R1bGVzOyBwaXBlbGluZSBtdXN0IGluaGVyaXQgdmFsaWQgQ29tbWFuZHMgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQ29uZmlnIGV4dGVuZHMgQ29tbWFuZHMge1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBhcnJheSBvZiBkb21haW4gbmFtZXMgZm9yIHBpcGVsaW5lIGRlcGxveW1lbnQgZmlsdGVyaW5nIGVuYWJsaW5nIHNlbGVjdGl2ZSBkb21haW4tc3BlY2lmaWMgZGVwbG95bWVudHMuIFJlc3RyaWN0cyBwaXBlbGluZSBleGVjdXRpb24gdG8gb25seSB0aGUgc3BlY2lmaWVkIE1EQUEgZG9tYWlucywgYWxsb3dpbmcgZm9yIHRhcmdldGVkIGRlcGxveW1lbnQgc3RyYXRlZ2llcyBhbmQgZG9tYWluIGlzb2xhdGlvbiBpbiBtdWx0aS1kb21haW4gZGF0YSBhcmNoaXRlY3R1cmVzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IERvbWFpbi1zcGVjaWZpYyBkZXBsb3ltZW50czsgTXVsdGktZG9tYWluIGZpbHRlcmluZzsgU2VsZWN0aXZlIGRvbWFpbiB1cGRhdGVzOyBEb21haW4gaXNvbGF0aW9uIHN0cmF0ZWdpZXNcbiAgICpcbiAgICogQVdTOiBBV1MgQ29kZVBpcGVsaW5lIGRvbWFpbiBmaWx0ZXJpbmcgZm9yIHNlbGVjdGl2ZSBNREFBIGRvbWFpbiBkZXBsb3ltZW50IGFuZCB0YXJnZXRlZCBpbmZyYXN0cnVjdHVyZSB1cGRhdGVzXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgYXJyYXkgb2YgdmFsaWQgTURBQSBkb21haW4gbmFtZXMgaWYgcHJvdmlkZWQ7IGRvbWFpbnMgbXVzdCBleGlzdCBpbiBNREFBIGNvbmZpZ3VyYXRpb247IG9wdGlvbmFsIGZvciBkb21haW4gZmlsdGVyaW5nXG4gICAqKi9cbiAgcmVhZG9ubHkgZG9tYWluRmlsdGVyPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGFycmF5IG9mIGVudmlyb25tZW50IG5hbWVzIGZvciBwaXBlbGluZSBkZXBsb3ltZW50IGZpbHRlcmluZyBlbmFibGluZyBzZWxlY3RpdmUgZW52aXJvbm1lbnQtc3BlY2lmaWMgZGVwbG95bWVudHMuIFJlc3RyaWN0cyBwaXBlbGluZSBleGVjdXRpb24gdG8gb25seSB0aGUgc3BlY2lmaWVkIE1EQUEgZW52aXJvbm1lbnRzLCBhbGxvd2luZyBmb3IgdGFyZ2V0ZWQgZGVwbG95bWVudCBzdHJhdGVnaWVzIGFuZCBlbnZpcm9ubWVudCBpc29sYXRpb24gYWNyb3NzIGRldmVsb3BtZW50LCBzdGFnaW5nLCBhbmQgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogRW52aXJvbm1lbnQtc3BlY2lmaWMgZGVwbG95bWVudHM7IE11bHRpLWVudmlyb25tZW50IGZpbHRlcmluZzsgU2VsZWN0aXZlIGVudmlyb25tZW50IHVwZGF0ZXM7IEVudmlyb25tZW50IGlzb2xhdGlvbiBzdHJhdGVnaWVzXG4gICAqXG4gICAqIEFXUzogQVdTIENvZGVQaXBlbGluZSBlbnZpcm9ubWVudCBmaWx0ZXJpbmcgZm9yIHNlbGVjdGl2ZSBNREFBIGVudmlyb25tZW50IGRlcGxveW1lbnQgYW5kIHRhcmdldGVkIGluZnJhc3RydWN0dXJlIHVwZGF0ZXNcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBhcnJheSBvZiB2YWxpZCBNREFBIGVudmlyb25tZW50IG5hbWVzIGlmIHByb3ZpZGVkOyBlbnZpcm9ubWVudHMgbXVzdCBleGlzdCBpbiBNREFBIGNvbmZpZ3VyYXRpb247IG9wdGlvbmFsIGZvciBlbnZpcm9ubWVudCBmaWx0ZXJpbmdcbiAgICoqL1xuICByZWFkb25seSBlbnZGaWx0ZXI/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgYXJyYXkgb2YgbW9kdWxlIG5hbWVzIGZvciBwaXBlbGluZSBkZXBsb3ltZW50IGZpbHRlcmluZyBlbmFibGluZyBzZWxlY3RpdmUgbW9kdWxlLXNwZWNpZmljIGRlcGxveW1lbnRzLiBSZXN0cmljdHMgcGlwZWxpbmUgZXhlY3V0aW9uIHRvIG9ubHkgdGhlIHNwZWNpZmllZCBNREFBIG1vZHVsZXMsIGFsbG93aW5nIGZvciB0YXJnZXRlZCBkZXBsb3ltZW50IHN0cmF0ZWdpZXMgYW5kIG1vZHVsZSBpc29sYXRpb24gZm9yIHNwZWNpZmljIGluZnJhc3RydWN0dXJlIGNvbXBvbmVudHMgb3Igc2VydmljZXMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogTW9kdWxlLXNwZWNpZmljIGRlcGxveW1lbnRzOyBNdWx0aS1tb2R1bGUgZmlsdGVyaW5nOyBTZWxlY3RpdmUgbW9kdWxlIHVwZGF0ZXM7IENvbXBvbmVudCBpc29sYXRpb24gc3RyYXRlZ2llc1xuICAgKlxuICAgKiBBV1M6IEFXUyBDb2RlUGlwZWxpbmUgbW9kdWxlIGZpbHRlcmluZyBmb3Igc2VsZWN0aXZlIE1EQUEgbW9kdWxlIGRlcGxveW1lbnQgYW5kIHRhcmdldGVkIGluZnJhc3RydWN0dXJlIGNvbXBvbmVudCB1cGRhdGVzXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgYXJyYXkgb2YgdmFsaWQgTURBQSBtb2R1bGUgbmFtZXMgaWYgcHJvdmlkZWQ7IG1vZHVsZXMgbXVzdCBleGlzdCBpbiBNREFBIGNvbmZpZ3VyYXRpb247IG9wdGlvbmFsIGZvciBtb2R1bGUgZmlsdGVyaW5nXG4gICAqKi9cbiAgcmVhZG9ubHkgbW9kdWxlRmlsdGVyPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBEZXZPcHNDb25maWdQYXJzZXIgZXh0ZW5kcyBNZGFhQXBwQ29uZmlnUGFyc2VyPERldk9wc0NvbmZpZ0NvbnRlbnRzPiB7XG4gIHB1YmxpYyByZWFkb25seSBkZXZvcHNDb25maWc6IERldk9wc0NvbmZpZ0NvbnRlbnRzO1xuXG4gIGNvbnN0cnVjdG9yKHN0YWNrOiBTdGFjaywgcHJvcHM6IE1kYWFBcHBDb25maWdQYXJzZXJQcm9wcykge1xuICAgIHN1cGVyKHN0YWNrLCBwcm9wcywgY29uZmlnU2NoZW1hIGFzIFNjaGVtYSk7XG5cbiAgICB0aGlzLmRldm9wc0NvbmZpZyA9IHRoaXMuY29uZmlnQ29udGVudHM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1kYWFEZXZvcHNDREtBcHAgZXh0ZW5kcyBNZGFhQ2RrQXBwIHtcbiAgY29uc3RydWN0b3IocHJvcHM/OiBBcHBQcm9wcykge1xuICAgIHN1cGVyKHsgLi4ucHJvcHMsIC4uLnsgdXNlQm9vdHN0cmFwOiBmYWxzZSB9IH0sIE1kYWFDZGtBcHAucGFyc2VQYWNrYWdlSnNvbihgJHtfX2Rpcm5hbWV9Ly4uL3BhY2thZ2UuanNvbmApKTtcbiAgfVxuICBwcm90ZWN0ZWQgc3ViR2VuZXJhdGVSZXNvdXJjZXMoXG4gICAgc3RhY2s6IFN0YWNrLFxuICAgIGwzQ29uc3RydWN0UHJvcHM6IE1kYWFMM0NvbnN0cnVjdFByb3BzLFxuICAgIHBhcnNlclByb3BzOiBNZGFhQXBwQ29uZmlnUGFyc2VyUHJvcHMsXG4gICkge1xuICAgIGNvbnN0IGFwcENvbmZpZyA9IG5ldyBEZXZPcHNDb25maWdQYXJzZXIoc3RhY2ssIHBhcnNlclByb3BzKTtcbiAgICBuZXcgTWRhYURldm9wc0wzQ29uc3RydWN0KHN0YWNrLCAnZGV2b3BzJywge1xuICAgICAgLi4ubDNDb25zdHJ1Y3RQcm9wcyxcbiAgICAgIC4uLmFwcENvbmZpZy5kZXZvcHNDb25maWcsXG4gICAgfSk7XG4gICAgQXNwZWN0cy5vZihzdGFjaykuYWRkKG5ldyBGaXhDZGtCdWlsZFByb2plY3QoKSk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTWRhYURldm9wc0wzQ29uc3RydWN0UHJvcHMgZXh0ZW5kcyBNZGFhTDNDb25zdHJ1Y3RQcm9wcywgRGV2T3BzQ29uZmlnQ29udGVudHMge31cblxuZXhwb3J0IGNsYXNzIE1kYWFEZXZvcHNMM0NvbnN0cnVjdCBleHRlbmRzIE1kYWFMM0NvbnN0cnVjdCB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQ0RLX0JPT1RTVFJBUF9DT05URVhUID0gJ2huYjY1OWZkcyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IE1kYWFEZXZvcHNMM0NvbnN0cnVjdFByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBNZGFhRGV2b3BzTDNDb25zdHJ1Y3RQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIGNvbnN0IHBpcGVsaW5lUm9sZSA9IG5ldyBNZGFhUm9sZSh0aGlzLCAncGlwZWxpbmUtcm9sZScsIHtcbiAgICAgIHJvbGVOYW1lOiAncGlwZWxpbmUnLFxuICAgICAgbmFtaW5nOiB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2NvZGVwaXBlbGluZS5hbWF6b25hd3MuY29tJyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBtZGFhUmVwbyA9IFJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlOYW1lKHRoaXMsICdtZGFhLWltcG9ydC1yZXBvJywgdGhpcy5wcm9wcy5tZGFhQ29kZUNvbW1pdFJlcG8pO1xuICAgIGNvbnN0IGNvbmZpZ3NSZXBvID0gUmVwb3NpdG9yeS5mcm9tUmVwb3NpdG9yeU5hbWUodGhpcywgJ2NvbmZpZ3MtaW1wb3J0LXJlcG8nLCB0aGlzLnByb3BzLmNvbmZpZ3NDb2RlQ29tbWl0UmVwbyk7XG5cbiAgICBjb25zdCBrbXNLZXkgPSBuZXcgTWRhYUttc0tleSh0aGlzLCAna21zLWtleScsIHtcbiAgICAgIG5hbWluZzogdGhpcy5wcm9wcy5uYW1pbmcsXG4gICAgICBrZXlVc2VyUm9sZUlkczogW3BpcGVsaW5lUm9sZS5yb2xlSWRdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGV2T3BzQnVja2V0ID0gbmV3IE1kYWFCdWNrZXQodGhpcywgJ3BpcGVsaW5lLWJ1Y2tldCcsIHtcbiAgICAgIG5hbWluZzogdGhpcy5wcm9wcy5uYW1pbmcsXG4gICAgICBlbmNyeXB0aW9uS2V5OiBrbXNLZXksXG4gICAgfSk7XG5cbiAgICBNZGFhTmFnU3VwcHJlc3Npb25zLmFkZENvZGVSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIGRldk9wc0J1Y2tldCxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnTklTVC44MDAuNTMuUjUtUzNCdWNrZXRSZXBsaWNhdGlvbkVuYWJsZWQnLFxuICAgICAgICAgIHJlYXNvbjogJ0J1Y2tldCBkb2VzIG5vdCBjb250YWluIGRhdGEgYXNzZXRzLiBSZXBsaWNhdGlvbiBub3QgcmVxdWlyZWQuJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnSElQQUEuU2VjdXJpdHktUzNCdWNrZXRSZXBsaWNhdGlvbkVuYWJsZWQnLFxuICAgICAgICAgIHJlYXNvbjogJ0J1Y2tldCBkb2VzIG5vdCBjb250YWluIGRhdGEgYXNzZXRzLiBSZXBsaWNhdGlvbiBub3QgcmVxdWlyZWQuJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnUENJLkRTUy4zMjEtUzNCdWNrZXRSZXBsaWNhdGlvbkVuYWJsZWQnLFxuICAgICAgICAgIHJlYXNvbjogJ0J1Y2tldCBkb2VzIG5vdCBjb250YWluIGRhdGEgYXNzZXRzLiBSZXBsaWNhdGlvbiBub3QgcmVxdWlyZWQuJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBjb25zdCBjb2RlQ29tbWl0RXZlbnRSb2xlID0gbmV3IE1kYWFSb2xlKHRoaXMsICdjb2RlY29tbWl0LWV2ZW50LXJvbGUnLCB7XG4gICAgICByb2xlTmFtZTogJ2NvZGVjb21taXQtZXZlbnQnLFxuICAgICAgbmFtaW5nOiB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2V2ZW50cy5hbWF6b25hd3MuY29tJyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb2RlQ29tbWl0UmVhZFBvbGljeSA9IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFsnY29kZWNvbW1pdDpHZXRCcmFuY2gnLCAnY29kZWNvbW1pdDpHZXRDb21taXQnLCAnY29kZWNvbW1pdDpHZXRSZXBvc2l0b3J5JywgJ2NvZGVjb21taXQ6R2l0UHVsbCddLFxuICAgICAgICAgIHJlc291cmNlczogW21kYWFSZXBvLnJlcG9zaXRvcnlBcm4sIGNvbmZpZ3NSZXBvLnJlcG9zaXRvcnlBcm5dLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb2RlQ29tbWl0QWN0aW9uUm9sZSA9IG5ldyBNZGFhUm9sZSh0aGlzLCAnY29kZWNvbW1pdC1hY3Rpb24tcm9sZScsIHtcbiAgICAgIHJvbGVOYW1lOiAnY29kZWNvbW1pdC1hY3Rpb24nLFxuICAgICAgbmFtaW5nOiB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgIGFzc3VtZWRCeTogbmV3IEFjY291bnRQcmluY2lwYWwodGhpcy5hY2NvdW50KSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7IGNvZGVjb21taXRfcmVhZDogY29kZUNvbW1pdFJlYWRQb2xpY3kgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvZGVCdWlsZEFjdGlvblJvbGUgPSBuZXcgTWRhYVJvbGUodGhpcywgJ2NvZGVidWlsZC1hY3Rpb24tcm9sZScsIHtcbiAgICAgIHJvbGVOYW1lOiAnY29kZWJ1aWxkLWFjdGlvbicsXG4gICAgICBuYW1pbmc6IHRoaXMucHJvcHMubmFtaW5nLFxuICAgICAgYXNzdW1lZEJ5OiBuZXcgQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgICAgICBuZXcgU2VydmljZVByaW5jaXBhbCgnY29kZWJ1aWxkLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgbmV3IEFjY291bnRQcmluY2lwYWwodGhpcy5hY2NvdW50KSxcbiAgICAgICksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtNYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQVdTQ2xvdWRGb3JtYXRpb25SZWFkT25seUFjY2VzcycpXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvZGVCdWlsZEFjdGlvblBvbGljeSA9IG5ldyBQb2xpY3kodGhpcywgJ2NvZGVidWlsZC1wb2xpY3knKTtcbiAgICBjb25zdCBjZGtMb29rdXBSb2xlID0gdGhpcy5pbXBvcnRDZGtSb2xlKHRoaXMsICdsb29rdXAnLCB0aGlzLnByb3BzLmNka0Jvb3RzdHJhcENvbnRleHQpO1xuICAgIGNvbnN0IGNka0RlcGxveVJvbGUgPSB0aGlzLmltcG9ydENka1JvbGUodGhpcywgJ2RlcGxveScsIHRoaXMucHJvcHMuY2RrQm9vdHN0cmFwQ29udGV4dCk7XG4gICAgY29uc3QgY2RrRXhlY1JvbGUgPSB0aGlzLmltcG9ydENka1JvbGUodGhpcywgJ2V4ZWMnLCB0aGlzLnByb3BzLmNka0Jvb3RzdHJhcENvbnRleHQpO1xuICAgIGNvbnN0IGNka0ZpbGVQdWJsaXNoaW5nUm9sZSA9IHRoaXMuaW1wb3J0Q2RrUm9sZSh0aGlzLCAnZmlsZS1wdWJsaXNoaW5nJywgdGhpcy5wcm9wcy5jZGtCb290c3RyYXBDb250ZXh0KTtcbiAgICBjb25zdCBjZGtJbWFnZVB1Ymxpc2hpbmdSb2xlID0gdGhpcy5pbXBvcnRDZGtSb2xlKHRoaXMsICdpbWFnZS1wdWJsaXNoaW5nJywgdGhpcy5wcm9wcy5jZGtCb290c3RyYXBDb250ZXh0KTtcbiAgICBjb25zdCBjZGtCdWNrZXQgPSBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoXG4gICAgICB0aGlzLFxuICAgICAgYGNkay1idWNrZXQtaW1wb3J0YCxcbiAgICAgIGBjZGstJHt0aGlzLnByb3BzLmNka0Jvb3RzdHJhcENvbnRleHQgPz8gTWRhYURldm9wc0wzQ29uc3RydWN0LkRFRkFVTFRfQ0RLX0JPT1RTVFJBUF9DT05URVhUfS1hc3NldHMtJHtcbiAgICAgICAgdGhpcy5hY2NvdW50XG4gICAgICB9LSR7dGhpcy5yZWdpb259YCxcbiAgICApO1xuXG4gICAgY29kZUJ1aWxkQWN0aW9uUG9saWN5LmFkZFN0YXRlbWVudHMoXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgc2lkOiAnQVNTVU1FQ0RLUk9MRVMnLFxuICAgICAgICBhY3Rpb25zOiBbJ3N0czpBc3N1bWVSb2xlJ10sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGNka0xvb2t1cFJvbGUucm9sZUFybixcbiAgICAgICAgICBjZGtEZXBsb3lSb2xlLnJvbGVBcm4sXG4gICAgICAgICAgY2RrRmlsZVB1Ymxpc2hpbmdSb2xlLnJvbGVBcm4sXG4gICAgICAgICAgY2RrSW1hZ2VQdWJsaXNoaW5nUm9sZS5yb2xlQXJuLFxuICAgICAgICAgIGNka0V4ZWNSb2xlLnJvbGVBcm4sXG4gICAgICAgIF0sXG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvZGVCdWlsZEFjdGlvblBvbGljeS5hZGRTdGF0ZW1lbnRzKFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIHNpZDogJ1MzTGlzdCcsXG4gICAgICAgIGFjdGlvbnM6IFsnczM6TGlzdEFsbE15QnVja2V0cyddLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIH0pLFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIHNpZDogJ0Nsb3VkRm9ybWF0aW9uQ2hhbmdlU2V0cycsXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnY2xvdWRmb3JtYXRpb246Q3JlYXRlQ2hhbmdlU2V0JyxcbiAgICAgICAgICAnY2xvdWRmb3JtYXRpb246RGVzY3JpYmVDaGFuZ2VTZXQnLFxuICAgICAgICAgICdjbG91ZGZvcm1hdGlvbjpEZWxldGVDaGFuZ2VTZXQnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb2RlQnVpbGRBY3Rpb25Qb2xpY3kuYWRkU3RhdGVtZW50cyhcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBzaWQ6ICdDREtTMycsXG4gICAgICAgIGFjdGlvbnM6IFsnczM6R2V0KicsICdzMzpQdXQqJywgJ3MzOkxpc3QqJ10sXG4gICAgICAgIHJlc291cmNlczogW2Nka0J1Y2tldC5idWNrZXRBcm4sIGNka0J1Y2tldC5hcm5Gb3JPYmplY3RzKCcqJyldLFxuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBNZGFhTmFnU3VwcHJlc3Npb25zLmFkZENvZGVSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIGNvZGVCdWlsZEFjdGlvblBvbGljeSxcbiAgICAgIFtcbiAgICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JywgcmVhc29uOiAnUGVybWlzc2lvbnMgYXJlIHNjb3BlZCBsZWFzdCBwcml2aWxlZ2UgZm9yIGRlcGxveW1lbnQgdGltZS4nIH0sXG4gICAgICAgIHsgaWQ6ICdOSVNULjgwMC41My5SNS1JQU1Ob0lubGluZVBvbGljeScsIHJlYXNvbjogJ0lubGluZSBwb2xpY3kgYXBwcm9wcmlhdGUuJyB9LFxuICAgICAgICB7IGlkOiAnSElQQUEuU2VjdXJpdHktSUFNTm9JbmxpbmVQb2xpY3knLCByZWFzb246ICdJbmxpbmUgcG9saWN5IGFwcHJvcHJpYXRlLicgfSxcbiAgICAgICAgeyBpZDogJ1BDSS5EU1MuMzIxLUlBTU5vSW5saW5lUG9saWN5JywgcmVhc29uOiAnSW5saW5lIHBvbGljeSBhcHByb3ByaWF0ZS4nIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIGNvZGVCdWlsZEFjdGlvblBvbGljeS5hdHRhY2hUb1JvbGUoY29kZUJ1aWxkQWN0aW9uUm9sZSk7XG4gICAgY29uc3QgbWFudWFsQWN0aW9uUm9sZSA9IG5ldyBNZGFhUm9sZSh0aGlzLCAnbWFudWFsLWFjdGlvbi1yb2xlJywge1xuICAgICAgcm9sZU5hbWU6ICdtYW51YWwtYWN0aW9uJyxcbiAgICAgIG5hbWluZzogdGhpcy5wcm9wcy5uYW1pbmcsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBBY2NvdW50UHJpbmNpcGFsKHRoaXMuYWNjb3VudCksXG4gICAgfSk7XG5cbiAgICBjb25zdCBhc3N1bWVBY3Rpb25Sb2xlR3JhbnQgPSBjb2RlQnVpbGRBY3Rpb25Sb2xlLmdyYW50QXNzdW1lUm9sZShwaXBlbGluZVJvbGUpO1xuXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5wcm9wcy5waXBlbGluZXMgPz8ge30pLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgY29uc3QgcGlwZWxpbmVQcm9wczogTWRhYVBpcGVsaW5lUHJvcHMgPSB7XG4gICAgICAgIHBpcGVsaW5lVHlwZTogUGlwZWxpbmVUeXBlLlYyLFxuICAgICAgICBuYW1pbmc6IHRoaXMucHJvcHMubmFtaW5nLndpdGhNb2R1bGVOYW1lKGBkZXZvcHMtJHtlbnRyeVswXX1gKSxcbiAgICAgICAgcGlwZWxpbmVOYW1lOiB0aGlzLnByb3BzLm5hbWluZy5yZXNvdXJjZU5hbWUoZW50cnlbMF0pLFxuICAgICAgICAuLi5lbnRyeVsxXSxcbiAgICAgICAgcm9sZTogcGlwZWxpbmVSb2xlLFxuICAgICAgICBhcnRpZmFjdEJ1Y2tldDogZGV2T3BzQnVja2V0LFxuICAgICAgICBjb2RlQ29tbWl0QWN0aW9uUm9sZTogY29kZUNvbW1pdEFjdGlvblJvbGUsXG4gICAgICAgIGNvZGVDb21taXRFdmVudFJvbGU6IGNvZGVDb21taXRFdmVudFJvbGUsXG4gICAgICAgIGNvZGVCdWlsZEFjdGlvblJvbGU6IGNvZGVCdWlsZEFjdGlvblJvbGUsXG4gICAgICAgIG1kYWFSZXBvOiBtZGFhUmVwbyxcbiAgICAgICAgY29uZmlnc1JlcG86IGNvbmZpZ3NSZXBvLFxuICAgICAgICBrbXNLZXk6IGttc0tleSxcbiAgICAgICAgbWFudWFsQWN0aW9uUm9sZTogbWFudWFsQWN0aW9uUm9sZSxcbiAgICAgICAgaW5zdGFsbDogWy4uLih0aGlzLnByb3BzLmluc3RhbGwgPz8gW10pLCAuLi4oZW50cnlbMV0uaW5zdGFsbCA/PyBbXSldLFxuICAgICAgICBwcmU6IFsuLi4odGhpcy5wcm9wcy5wcmUgPz8gW10pLCAuLi4oZW50cnlbMV0ucHJlID8/IFtdKV0sXG4gICAgICAgIHBvc3Q6IFsuLi4odGhpcy5wcm9wcy5wb3N0ID8/IFtdKSwgLi4uKGVudHJ5WzFdLnBvc3QgPz8gW10pXSxcbiAgICAgICAgcHJlRGVwbG95OiB7IC4uLnRoaXMucHJvcHMucHJlRGVwbG95LCAuLi5lbnRyeVsxXS5wcmVEZXBsb3kgfSxcbiAgICAgICAgcHJlRGVwbG95VmFsaWRhdGU6XG4gICAgICAgICAgdGhpcy5wcm9wcy5wcmVEZXBsb3lWYWxpZGF0ZSB8fCBlbnRyeVsxXS5wcmVEZXBsb3lWYWxpZGF0ZVxuICAgICAgICAgICAgPyB7IC4uLnRoaXMucHJvcHMucHJlRGVwbG95VmFsaWRhdGUsIC4uLmVudHJ5WzFdLnByZURlcGxveVZhbGlkYXRlIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBkZXBsb3k6IHsgLi4udGhpcy5wcm9wcy5kZXBsb3ksIC4uLmVudHJ5WzFdLmRlcGxveSB9LFxuICAgICAgICBwb3N0RGVwbG95VmFsaWRhdGU6XG4gICAgICAgICAgdGhpcy5wcm9wcy5wb3N0RGVwbG95VmFsaWRhdGUgfHwgZW50cnlbMV0ucG9zdERlcGxveVZhbGlkYXRlXG4gICAgICAgICAgICA/IHsgLi4udGhpcy5wcm9wcy5wb3N0RGVwbG95VmFsaWRhdGUsIC4uLmVudHJ5WzFdLnBvc3REZXBsb3lWYWxpZGF0ZSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBpcGVsaW5lID0gbmV3IE1kYWFQaXBlbGluZSh0aGlzLCBgbWRhYS1waXBlbGluZS0ke2VudHJ5WzBdfWAsIHBpcGVsaW5lUHJvcHMpO1xuICAgICAgYXNzdW1lQWN0aW9uUm9sZUdyYW50LmFwcGx5QmVmb3JlKHBpcGVsaW5lKTtcbiAgICB9KTtcblxuICAgIE1kYWFOYWdTdXBwcmVzc2lvbnMuYWRkQ29kZVJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgcGlwZWxpbmVSb2xlLFxuICAgICAgW1xuICAgICAgICB7IGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLCByZWFzb246ICdQZXJtaXNzaW9ucyBhcmUgc2NvcGVkIGxlYXN0IHByaXZpbGVnZSBmb3IgZGVwbG95bWVudCB0aW1lLicgfSxcbiAgICAgICAgeyBpZDogJ05JU1QuODAwLjUzLlI1LUlBTU5vSW5saW5lUG9saWN5JywgcmVhc29uOiAnSW5saW5lIHBvbGljeSBhcHByb3ByaWF0ZS4nIH0sXG4gICAgICAgIHsgaWQ6ICdISVBBQS5TZWN1cml0eS1JQU1Ob0lubGluZVBvbGljeScsIHJlYXNvbjogJ0lubGluZSBwb2xpY3kgYXBwcm9wcmlhdGUuJyB9LFxuICAgICAgICB7IGlkOiAnUENJLkRTUy4zMjEtSUFNTm9JbmxpbmVQb2xpY3knLCByZWFzb246ICdJbmxpbmUgcG9saWN5IGFwcHJvcHJpYXRlLicgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG4gICAgTWRhYU5hZ1N1cHByZXNzaW9ucy5hZGRDb2RlUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBjb2RlQnVpbGRBY3Rpb25Sb2xlLFxuICAgICAgW1xuICAgICAgICB7IGlkOiAnQXdzU29sdXRpb25zLUlBTTQnLCByZWFzb246ICdBV1NDbG91ZEZvcm1hdGlvblJlYWRPbmx5QWNjZXNzIGlzIFJlYWQgT25seSBBY2Nlc3MnIH0sXG4gICAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsIHJlYXNvbjogJ1Blcm1pc3Npb25zIGFyZSBzY29wZWQgbGVhc3QgcHJpdmlsZWdlIGZvciBkZXBsb3ltZW50IHRpbWUuJyB9LFxuICAgICAgICB7IGlkOiAnTklTVC44MDAuNTMuUjUtSUFNTm9JbmxpbmVQb2xpY3knLCByZWFzb246ICdJbmxpbmUgcG9saWN5IGFwcHJvcHJpYXRlLicgfSxcbiAgICAgICAgeyBpZDogJ0hJUEFBLlNlY3VyaXR5LUlBTU5vSW5saW5lUG9saWN5JywgcmVhc29uOiAnSW5saW5lIHBvbGljeSBhcHByb3ByaWF0ZS4nIH0sXG4gICAgICAgIHsgaWQ6ICdQQ0kuRFNTLjMyMS1JQU1Ob0lubGluZVBvbGljeScsIHJlYXNvbjogJ0lubGluZSBwb2xpY3kgYXBwcm9wcmlhdGUuJyB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgICBNZGFhTmFnU3VwcHJlc3Npb25zLmFkZENvZGVSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIGNvZGVDb21taXRBY3Rpb25Sb2xlLFxuICAgICAgW1xuICAgICAgICB7IGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLCByZWFzb246ICdQZXJtaXNzaW9ucyBhcmUgc2NvcGVkIGxlYXN0IHByaXZpbGVnZSBmb3IgZGVwbG95bWVudCB0aW1lLicgfSxcbiAgICAgICAgeyBpZDogJ05JU1QuODAwLjUzLlI1LUlBTU5vSW5saW5lUG9saWN5JywgcmVhc29uOiAnSW5saW5lIHBvbGljeSBhcHByb3ByaWF0ZS4nIH0sXG4gICAgICAgIHsgaWQ6ICdISVBBQS5TZWN1cml0eS1JQU1Ob0lubGluZVBvbGljeScsIHJlYXNvbjogJ0lubGluZSBwb2xpY3kgYXBwcm9wcmlhdGUuJyB9LFxuICAgICAgICB7IGlkOiAnUENJLkRTUy4zMjEtSUFNTm9JbmxpbmVQb2xpY3knLCByZWFzb246ICdJbmxpbmUgcG9saWN5IGFwcHJvcHJpYXRlLicgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG4gICAgTWRhYU5hZ1N1cHByZXNzaW9ucy5hZGRDb2RlUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBjb2RlQ29tbWl0RXZlbnRSb2xlLFxuICAgICAgW1xuICAgICAgICB7IGlkOiAnTklTVC44MDAuNTMuUjUtSUFNTm9JbmxpbmVQb2xpY3knLCByZWFzb246ICdJbmxpbmUgcG9saWN5IGFwcHJvcHJpYXRlLicgfSxcbiAgICAgICAgeyBpZDogJ0hJUEFBLlNlY3VyaXR5LUlBTU5vSW5saW5lUG9saWN5JywgcmVhc29uOiAnSW5saW5lIHBvbGljeSBhcHByb3ByaWF0ZS4nIH0sXG4gICAgICAgIHsgaWQ6ICdQQ0kuRFNTLjMyMS1JQU1Ob0lubGluZVBvbGljeScsIHJlYXNvbjogJ0lubGluZSBwb2xpY3kgYXBwcm9wcmlhdGUuJyB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW1wb3J0Q2RrUm9sZShzY29wZTogQ29uc3RydWN0LCByb2xlTmFtZTogc3RyaW5nLCBjZGtCb290c3RyYXBDb250ZXh0Pzogc3RyaW5nKTogSVJvbGUge1xuICAgIHJldHVybiBSb2xlLmZyb21Sb2xlTmFtZShcbiAgICAgIHNjb3BlLFxuICAgICAgYGNkay0ke3JvbGVOYW1lfS1yb2xlLWltcG9ydGAsXG4gICAgICBgY2RrLSR7Y2RrQm9vdHN0cmFwQ29udGV4dCA/PyBNZGFhRGV2b3BzTDNDb25zdHJ1Y3QuREVGQVVMVF9DREtfQk9PVFNUUkFQX0NPTlRFWFR9LSR7cm9sZU5hbWV9LXJvbGUtJHtcbiAgICAgICAgU3RhY2sub2Yoc2NvcGUpLmFjY291bnRcbiAgICAgIH0tJHtTdGFjay5vZihzY29wZSkucmVnaW9ufWAsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1kYWFQaXBlbGluZVByb3BzIGV4dGVuZHMgUGlwZWxpbmVQcm9wcywgU3RhZ2VDb21tYW5kcywgUGlwZWxpbmVDb25maWcge1xuICByZWFkb25seSBuYW1pbmc6IElNZGFhUmVzb3VyY2VOYW1pbmc7XG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBjb2RlQ29tbWl0QWN0aW9uUm9sZTogSVJvbGU7XG4gIHJlYWRvbmx5IGNvZGVDb21taXRFdmVudFJvbGU6IElSb2xlO1xuICByZWFkb25seSBjb2RlQnVpbGRBY3Rpb25Sb2xlOiBJUm9sZTtcbiAgcmVhZG9ubHkgbWRhYVJlcG86IElSZXBvc2l0b3J5O1xuICByZWFkb25seSBtZGFhQnJhbmNoPzogc3RyaW5nO1xuICByZWFkb25seSBjb25maWdzUmVwbzogSVJlcG9zaXRvcnk7XG4gIHJlYWRvbmx5IGNvbmZpZ3NCcmFuY2g/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGttc0tleTogSUtleTtcbiAgcmVhZG9ubHkgbWFudWFsQWN0aW9uUm9sZTogSVJvbGU7XG59XG5cbmV4cG9ydCBjbGFzcyBNZGFhUGlwZWxpbmUgZXh0ZW5kcyBQaXBlbGluZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IE1kYWFQaXBlbGluZVByb3BzO1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTWRhYVBpcGVsaW5lUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICBjb25zdCBzb3VyY2VTdGFnZSA9IHRoaXMuYWRkU3RhZ2UoeyBzdGFnZU5hbWU6ICdTb3VyY2UnIH0pO1xuICAgIGNvbnN0IG1kYWFTb3VyY2VPdXRwdXQgPSBuZXcgQXJ0aWZhY3QoJ01EQUEnKTtcbiAgICBjb25zdCBtZGFhU291cmNlQWN0aW9uID0gdGhpcy5jcmVhdGVDb2RlQ29tbWl0U291cmNlQWN0aW9uKFxuICAgICAgJ21kYWEnLFxuICAgICAgbWRhYVNvdXJjZU91dHB1dCxcbiAgICAgIHRoaXMucHJvcHMuY29kZUNvbW1pdEFjdGlvblJvbGUsXG4gICAgICB0aGlzLnByb3BzLmNvZGVDb21taXRFdmVudFJvbGUsXG4gICAgICB0aGlzLnByb3BzLm1kYWFSZXBvLFxuICAgICAgdGhpcy5wcm9wcy5tZGFhQnJhbmNoID8/ICdtYWluJyxcbiAgICApO1xuICAgIGNvbnN0IGNvbmZpZ1NvdXJjZU91dHB1dCA9IG5ldyBBcnRpZmFjdCgnQ09ORklHUycpO1xuICAgIGNvbnN0IGNvbmZpZ1NvdXJjZUFjdGlvbiA9IHRoaXMuY3JlYXRlQ29kZUNvbW1pdFNvdXJjZUFjdGlvbihcbiAgICAgICdjb25maWdzJyxcbiAgICAgIGNvbmZpZ1NvdXJjZU91dHB1dCxcbiAgICAgIHRoaXMucHJvcHMuY29kZUNvbW1pdEFjdGlvblJvbGUsXG4gICAgICB0aGlzLnByb3BzLmNvZGVDb21taXRFdmVudFJvbGUsXG4gICAgICB0aGlzLnByb3BzLmNvbmZpZ3NSZXBvLFxuICAgICAgdGhpcy5wcm9wcy5jb25maWdzQnJhbmNoID8/ICdtYWluJyxcbiAgICApO1xuICAgIHNvdXJjZVN0YWdlLmFkZEFjdGlvbihtZGFhU291cmNlQWN0aW9uKTtcbiAgICBzb3VyY2VTdGFnZS5hZGRBY3Rpb24oY29uZmlnU291cmNlQWN0aW9uKTtcblxuICAgIGNvbnN0IHBpcGVsaW5lUHJvamVjdHM6IFBpcGVsaW5lUHJvamVjdFtdID0gW107XG4gICAgY29uc3QgcHJlRGVwbG95T3V0cHV0ID0gbmV3IEFydGlmYWN0KCdQUkVERVBMT1lfT1VUUFVUJyk7XG4gICAgdGhpcy5hZGRQcmVEZXBsb3lTdGFnZShjb25maWdTb3VyY2VPdXRwdXQsIG1kYWFTb3VyY2VPdXRwdXQsIHByZURlcGxveU91dHB1dCwgcGlwZWxpbmVQcm9qZWN0cyk7XG4gICAgdGhpcy5hZGRQcmVEZXBsb3lWYWxpZGF0ZVN0YWdlKHByZURlcGxveU91dHB1dCwgcGlwZWxpbmVQcm9qZWN0cyk7XG4gICAgdGhpcy5hZGREZXBsb3lTdGFnZShwcmVEZXBsb3lPdXRwdXQsIHBpcGVsaW5lUHJvamVjdHMpO1xuICAgIHRoaXMuYWRkUG9zdERlcGxveVZhbGlkYXRlU3RhZ2UocHJlRGVwbG95T3V0cHV0LCBwaXBlbGluZVByb2plY3RzKTtcblxuICAgIGNvbnN0IGNvZGVCdWlsZEFjdGlvblBvbGljeSA9IG5ldyBQb2xpY3kodGhpcywgJ2NvZGVidWlsZC1hY3Rpb24tcG9saWN5Jywge1xuICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ2NvZGVidWlsZDpTdGFydEJ1aWxkJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBwaXBlbGluZVByb2plY3RzLm1hcCh4ID0+IHgucHJvamVjdEFybiksXG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIE1kYWFOYWdTdXBwcmVzc2lvbnMuYWRkQ29kZVJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgY29kZUJ1aWxkQWN0aW9uUG9saWN5LFxuICAgICAgW1xuICAgICAgICB7IGlkOiAnTklTVC44MDAuNTMuUjUtSUFNTm9JbmxpbmVQb2xpY3knLCByZWFzb246ICdJbmxpbmUgcG9saWN5IGFwcHJvcHJpYXRlLicgfSxcbiAgICAgICAgeyBpZDogJ0hJUEFBLlNlY3VyaXR5LUlBTU5vSW5saW5lUG9saWN5JywgcmVhc29uOiAnSW5saW5lIHBvbGljeSBhcHByb3ByaWF0ZS4nIH0sXG4gICAgICAgIHsgaWQ6ICdQQ0kuRFNTLjMyMS1JQU1Ob0lubGluZVBvbGljeScsIHJlYXNvbjogJ0lubGluZSBwb2xpY3kgYXBwcm9wcmlhdGUuJyB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIHRoaXMucHJvcHMuY29kZUJ1aWxkQWN0aW9uUm9sZS5hdHRhY2hJbmxpbmVQb2xpY3koY29kZUJ1aWxkQWN0aW9uUG9saWN5KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUG9zdERlcGxveVZhbGlkYXRlU3RhZ2UocHJlRGVwbG95T3V0cHV0OiBBcnRpZmFjdCwgcGlwZWxpbmVQcm9qZWN0czogUGlwZWxpbmVQcm9qZWN0W10pIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wb3N0RGVwbG95VmFsaWRhdGUpIHtcbiAgICAgIGNvbnN0IFt2YWxpZGF0ZUFjdGlvbiwgdmFsaWRhdGVQcm9qZWN0XSA9IHRoaXMuY3JlYXRlQ29kZUJ1aWxkQWN0aW9uKFxuICAgICAgICAnUG9zdERlcGxveVZhbGlkYXRlJyxcbiAgICAgICAgcHJlRGVwbG95T3V0cHV0LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAge1xuICAgICAgICAgIGluc3RhbGxDb21tYW5kczogWy4uLih0aGlzLnByb3BzLmluc3RhbGwgPz8gW10pLCAuLi4odGhpcy5wcm9wcy5wb3N0RGVwbG95VmFsaWRhdGU/Lmluc3RhbGwgPz8gW10pXSxcbiAgICAgICAgICBwcmVDb21tYW5kczogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbW1hbmRzOiBbLi4uKHRoaXMucHJvcHMucG9zdERlcGxveVZhbGlkYXRlPy5jb21tYW5kcyA/PyBbXSldLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgcGlwZWxpbmVQcm9qZWN0cy5wdXNoKHZhbGlkYXRlUHJvamVjdCk7XG4gICAgICBjb25zdCBwb3N0RGVwbG95VmFsaWRhdGVTdGFnZSA9IHRoaXMuYWRkU3RhZ2Uoe1xuICAgICAgICBzdGFnZU5hbWU6ICdQb3N0LURlcGxveS1WYWxpZGF0ZScsXG4gICAgICB9KTtcbiAgICAgIHBvc3REZXBsb3lWYWxpZGF0ZVN0YWdlLmFkZEFjdGlvbih2YWxpZGF0ZUFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGREZXBsb3lTdGFnZShwcmVEZXBsb3lPdXRwdXQ6IEFydGlmYWN0LCBwaXBlbGluZVByb2plY3RzOiBQaXBlbGluZVByb2plY3RbXSkge1xuICAgIGNvbnN0IGRlcGxveVN0YWdlID0gdGhpcy5hZGRTdGFnZSh7IHN0YWdlTmFtZTogJ0RlcGxveScgfSk7XG4gICAgY29uc3QgW2RlcGxveUFjdGlvbiwgZGVwbG95UHJvamVjdF0gPSB0aGlzLmNyZWF0ZUNvZGVCdWlsZEFjdGlvbihcbiAgICAgICdEZXBsb3knLFxuXG4gICAgICBwcmVEZXBsb3lPdXRwdXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGluc3RhbGxDb21tYW5kczogWyduIDE4JywgLi4uKHRoaXMucHJvcHMuaW5zdGFsbCA/PyBbXSksIC4uLih0aGlzLnByb3BzLmRlcGxveT8uaW5zdGFsbCA/PyBbXSldLFxuICAgICAgICBwcmVDb21tYW5kczogWy4uLih0aGlzLnByb3BzLnByZSA/PyBbXSksIC4uLih0aGlzLnByb3BzLmRlcGxveT8ucHJlID8/IFtdKV0sXG4gICAgICAgIGNvbW1hbmRzOiBbdGhpcy5jcmVhdGVNZGFhQ29tbWFuZCgnZGVwbG95JyldLFxuICAgICAgICBwb3N0Q29tbWFuZHM6IFsuLi4odGhpcy5wcm9wcy5wb3N0ID8/IFtdKSwgLi4uKHRoaXMucHJvcHMuZGVwbG95Py5wb3N0ID8/IFtdKV0sXG4gICAgICB9LFxuICAgICk7XG4gICAgZGVwbG95U3RhZ2UuYWRkQWN0aW9uKGRlcGxveUFjdGlvbik7XG4gICAgcGlwZWxpbmVQcm9qZWN0cy5wdXNoKGRlcGxveVByb2plY3QpO1xuICB9XG4gIHByaXZhdGUgYWRkUHJlRGVwbG95VmFsaWRhdGVTdGFnZShwcmVEZXBsb3lPdXRwdXQ6IEFydGlmYWN0LCBwaXBlbGluZVByb2plY3RzOiBQaXBlbGluZVByb2plY3RbXSkge1xuICAgIGNvbnN0IHByZURlcGxveVZhbGlkYXRlU3RhZ2UgPSB0aGlzLmFkZFN0YWdlKHtcbiAgICAgIHN0YWdlTmFtZTogJ1ByZS1EZXBsb3ktVmFsaWRhdGUnLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLnByb3BzLnByZURlcGxveVZhbGlkYXRlKSB7XG4gICAgICBjb25zdCBbdmFsaWRhdGVBY3Rpb24sIHZhbGlkYXRlUHJvamVjdF0gPSB0aGlzLmNyZWF0ZUNvZGVCdWlsZEFjdGlvbihcbiAgICAgICAgJ1ByZURlcGxveVZhbGlkYXRlJyxcbiAgICAgICAgcHJlRGVwbG95T3V0cHV0LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAge1xuICAgICAgICAgIGluc3RhbGxDb21tYW5kczogWy4uLih0aGlzLnByb3BzLmluc3RhbGwgPz8gW10pLCAuLi4odGhpcy5wcm9wcy5wcmVEZXBsb3lWYWxpZGF0ZT8uaW5zdGFsbCA/PyBbXSldLFxuICAgICAgICAgIHByZUNvbW1hbmRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tbWFuZHM6IFsuLi4odGhpcy5wcm9wcy5wcmVEZXBsb3lWYWxpZGF0ZT8uY29tbWFuZHMgPz8gW10pXSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBwcmVEZXBsb3lWYWxpZGF0ZVN0YWdlLmFkZEFjdGlvbih2YWxpZGF0ZUFjdGlvbik7XG4gICAgICBwaXBlbGluZVByb2plY3RzLnB1c2godmFsaWRhdGVQcm9qZWN0KTtcbiAgICB9XG4gICAgcHJlRGVwbG95VmFsaWRhdGVTdGFnZS5hZGRBY3Rpb24oXG4gICAgICBuZXcgTWFudWFsQXBwcm92YWxBY3Rpb24oe1xuICAgICAgICBhY3Rpb25OYW1lOiAnQXBwcm92ZScsXG4gICAgICAgIHJvbGU6IHRoaXMucHJvcHMubWFudWFsQWN0aW9uUm9sZSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZFByZURlcGxveVN0YWdlKFxuICAgIGNvbmZpZ1NvdXJjZU91dHB1dDogQXJ0aWZhY3QsXG4gICAgbWRhYVNvdXJjZU91dHB1dDogQXJ0aWZhY3QsXG4gICAgcHJlRGVwbG95T3V0cHV0OiBBcnRpZmFjdCxcbiAgICBwaXBlbGluZVByb2plY3RzOiBQaXBlbGluZVByb2plY3RbXSxcbiAgKTogUGlwZWxpbmVQcm9qZWN0IHtcbiAgICBjb25zdCBwcmVEZXBsb3lTdGFnZSA9IHRoaXMuYWRkU3RhZ2UoeyBzdGFnZU5hbWU6ICdQcmUtRGVwbG95JyB9KTtcblxuICAgIGNvbnN0IFtkaWZmQWN0aW9uLCBkaWZmUHJvamVjdF0gPSB0aGlzLmNyZWF0ZUNvZGVCdWlsZEFjdGlvbihcbiAgICAgICdTeW50aC1BbmQtRGlmZicsXG4gICAgICBjb25maWdTb3VyY2VPdXRwdXQsXG4gICAgICBbbWRhYVNvdXJjZU91dHB1dF0sXG4gICAgICBbcHJlRGVwbG95T3V0cHV0XSxcbiAgICAgIHtcbiAgICAgICAgaW5zdGFsbENvbW1hbmRzOiBbXG4gICAgICAgICAgJ24gMTgnLFxuICAgICAgICAgICdsbiAtcyAkQ09ERUJVSUxEX1NSQ19ESVJfTURBQSAuL21kYWEnLFxuICAgICAgICAgIC4uLih0aGlzLnByb3BzLmluc3RhbGwgPz8gW10pLFxuICAgICAgICAgIC4uLih0aGlzLnByb3BzLnByZURlcGxveT8uaW5zdGFsbCA/PyBbXSksXG4gICAgICAgIF0sXG4gICAgICAgIHByZUNvbW1hbmRzOiBbLi4uKHRoaXMucHJvcHMucHJlID8/IFtdKSwgLi4uKHRoaXMucHJvcHMucHJlRGVwbG95Py5wcmUgPz8gW10pXSxcbiAgICAgICAgY29tbWFuZHM6IFt0aGlzLmNyZWF0ZU1kYWFDb21tYW5kKCdkaWZmJyldLFxuICAgICAgICBwb3N0Q29tbWFuZHM6IFsuLi4odGhpcy5wcm9wcy5wb3N0ID8/IFtdKSwgLi4uKHRoaXMucHJvcHMucHJlRGVwbG95Py5wb3N0ID8/IFtdKV0sXG4gICAgICB9LFxuICAgICk7XG4gICAgcHJlRGVwbG95U3RhZ2UuYWRkQWN0aW9uKGRpZmZBY3Rpb24pO1xuICAgIHBpcGVsaW5lUHJvamVjdHMucHVzaChkaWZmUHJvamVjdCk7XG4gICAgcmV0dXJuIGRpZmZQcm9qZWN0O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb2RlQ29tbWl0U291cmNlQWN0aW9uKFxuICAgIGFjdGlvbk5hbWU6IHN0cmluZyxcbiAgICBvdXRwdXQ6IEFydGlmYWN0LFxuICAgIHJvbGU6IElSb2xlLFxuICAgIGV2ZW50Um9sZTogSVJvbGUsXG4gICAgcmVwb3NpdG9yeTogSVJlcG9zaXRvcnksXG4gICAgYnJhbmNoOiBzdHJpbmcsXG4gICk6IENvZGVDb21taXRTb3VyY2VBY3Rpb24ge1xuICAgIHJldHVybiBuZXcgQ29kZUNvbW1pdFNvdXJjZUFjdGlvbih7XG4gICAgICBvdXRwdXQsXG4gICAgICBhY3Rpb25OYW1lOiBhY3Rpb25OYW1lLFxuICAgICAgcm9sZTogcm9sZSxcbiAgICAgIHJ1bk9yZGVyOiB1bmRlZmluZWQsXG4gICAgICBicmFuY2g6IGJyYW5jaCxcbiAgICAgIHRyaWdnZXI6IENvZGVDb21taXRUcmlnZ2VyLkVWRU5UUyxcbiAgICAgIHJlcG9zaXRvcnk6IHJlcG9zaXRvcnksXG4gICAgICBldmVudFJvbGU6IGV2ZW50Um9sZSxcbiAgICAgIGNvZGVCdWlsZENsb25lT3V0cHV0OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNZGFhQ29tbWFuZChtZGFhQWN0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1kYWFDbWQgPSBbYC4vbWRhYS9iaW4vbWRhYSAke21kYWFBY3Rpb259YF07XG4gICAgaWYgKHRoaXMucHJvcHMuZG9tYWluRmlsdGVyKSB7XG4gICAgICBtZGFhQ21kLnB1c2goYC1kICR7dGhpcy5wcm9wcy5kb21haW5GaWx0ZXIuam9pbignLCcpfWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5lbnZGaWx0ZXIpIHtcbiAgICAgIG1kYWFDbWQucHVzaChgLWUgJHt0aGlzLnByb3BzLmVudkZpbHRlci5qb2luKCcsJyl9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLm1vZHVsZUZpbHRlcikge1xuICAgICAgbWRhYUNtZC5wdXNoKGAtbSAke3RoaXMucHJvcHMubW9kdWxlRmlsdGVyLmpvaW4oJywnKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG1kYWFDbWQuam9pbignICcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb2RlQnVpbGRBY3Rpb24oXG4gICAgYWN0aW9uTmFtZTogc3RyaW5nLFxuICAgIGlucHV0OiBBcnRpZmFjdCxcbiAgICBleHRyYUlucHV0cz86IEFydGlmYWN0W10sXG4gICAgb3V0cHV0cz86IEFydGlmYWN0W10sXG4gICAgY29tbWFuZHM/OiB7XG4gICAgICBpbnN0YWxsQ29tbWFuZHM/OiBzdHJpbmdbXTtcbiAgICAgIHByZUNvbW1hbmRzPzogc3RyaW5nW107XG4gICAgICBjb21tYW5kcz86IHN0cmluZ1tdO1xuICAgICAgcG9zdENvbW1hbmRzPzogc3RyaW5nW107XG4gICAgfSxcbiAgKTogW0NvZGVCdWlsZEFjdGlvbiwgUGlwZWxpbmVQcm9qZWN0XSB7XG4gICAgY29uc3QgcHJvamVjdFByb3BzOiBQaXBlbGluZVByb2plY3RQcm9wcyA9IHtcbiAgICAgIHByb2plY3ROYW1lOiB0aGlzLnByb3BzLm5hbWluZy5yZXNvdXJjZU5hbWUoYWN0aW9uTmFtZSksXG4gICAgICBlbmNyeXB0aW9uS2V5OiB0aGlzLnByb3BzLmttc0tleSxcbiAgICAgIHJvbGU6IHRoaXMucHJvcHMuY29kZUJ1aWxkQWN0aW9uUm9sZSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIGNvbXB1dGVUeXBlOiBDb21wdXRlVHlwZS5YMl9MQVJHRSxcbiAgICAgICAgYnVpbGRJbWFnZTogTGludXhCdWlsZEltYWdlLkFNQVpPTl9MSU5VWF8yXzUsXG4gICAgICB9LFxuICAgICAgYnVpbGRTcGVjOiBCdWlsZFNwZWMuZnJvbU9iamVjdCh7XG4gICAgICAgIHZlcnNpb246ICcwLjInLFxuICAgICAgICBwaGFzZXM6IHtcbiAgICAgICAgICBpbnN0YWxsOiB7XG4gICAgICAgICAgICBjb21tYW5kczogY29tbWFuZHM/Lmluc3RhbGxDb21tYW5kcyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZV9idWlsZDoge1xuICAgICAgICAgICAgY29tbWFuZHM6IGNvbW1hbmRzPy5wcmVDb21tYW5kcyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgICBjb21tYW5kczogY29tbWFuZHM/LmNvbW1hbmRzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcG9zdF9idWlsZDoge1xuICAgICAgICAgICAgY29tbWFuZHM6IGNvbW1hbmRzPy5wb3N0Q29tbWFuZHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYXJ0aWZhY3RzOiB7XG4gICAgICAgICAgZmlsZXM6IFsnKiovKiddLFxuICAgICAgICAgICdlbmFibGUtc3ltbGlua3MnOiAneWVzJyxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBjb2RlQnVpbGRQcm9qZWN0ID0gbmV3IFBpcGVsaW5lUHJvamVjdCh0aGlzLCBgY29kZWJ1aWxkLXByb2plY3QtJHthY3Rpb25OYW1lfWAsIHByb2plY3RQcm9wcyk7XG4gICAgY29uc3QgY29kZUJ1aWxkQWN0aW9uUHJvcHM6IENvZGVCdWlsZEFjdGlvblByb3BzID0ge1xuICAgICAgaW5wdXQ6IGlucHV0LFxuICAgICAgZXh0cmFJbnB1dHM6IGV4dHJhSW5wdXRzLFxuICAgICAgYWN0aW9uTmFtZTogYWN0aW9uTmFtZSxcbiAgICAgIHByb2plY3Q6IGNvZGVCdWlsZFByb2plY3QsXG4gICAgICByb2xlOiB0aGlzLnByb3BzLmNvZGVCdWlsZEFjdGlvblJvbGUsXG4gICAgICBvdXRwdXRzOiBvdXRwdXRzLFxuICAgIH07XG5cbiAgICBjb25zdCBhY3Rpb24gPSBuZXcgQ29kZUJ1aWxkQWN0aW9uKGNvZGVCdWlsZEFjdGlvblByb3BzKTtcbiAgICByZXR1cm4gW2FjdGlvbiwgY29kZUJ1aWxkUHJvamVjdF07XG4gIH1cbn1cblxuY2xhc3MgRml4Q2RrQnVpbGRQcm9qZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIHB1YmxpYyB2aXNpdChjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAoY29uc3RydWN0Lm5vZGUuaWQuc3RhcnRzV2l0aCgnY29kZWJ1aWxkLXByb2plY3QnKSkge1xuICAgICAgTWRhYU5hZ1N1cHByZXNzaW9ucy5hZGRDb2RlUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICAgIGNvbnN0cnVjdCxcbiAgICAgICAgW1xuICAgICAgICAgIHsgaWQ6ICdISVBBQS5TZWN1cml0eS1Db2RlQnVpbGRQcm9qZWN0U291cmNlUmVwb1VybCcsIHJlYXNvbjogJ1BpcGVsaW5lIHNvdXJjZSBpcyBDb2RlQ29tbWl0LicgfSxcbiAgICAgICAgICB7IGlkOiAnUENJLkRTUy4zMjEtQ29kZUJ1aWxkUHJvamVjdFNvdXJjZVJlcG9VcmwnLCByZWFzb246ICdQaXBlbGluZSBzb3VyY2UgaXMgQ29kZUNvbW1pdC4nIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
20
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
__exportStar(require("./devops"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsMkNBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9kZXZvcHMnO1xuIl19
|
package/mdaa.config.json
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aws-mdaa/devops",
|
|
3
|
+
"description": "MDAA devops module",
|
|
4
|
+
"author": {
|
|
5
|
+
"name": "Amazon Web Services",
|
|
6
|
+
"url": "https://aws.amazon.com/solutions"
|
|
7
|
+
},
|
|
8
|
+
"bin": {
|
|
9
|
+
"devops-cdk": "bin/devops.js"
|
|
10
|
+
},
|
|
11
|
+
"version": "1.2.0",
|
|
12
|
+
"license": "Apache-2.0",
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc && typescript-json-schema --required --noExtraProps tsconfig.json DevOpsConfigContents --include 'lib/*.ts' --include '../../../../node_modules/@types/**/*.ts' --include 'lib/config-schema.json' > lib/config-schema.json && cp lib/config-schema.json ../../../../schemas/${npm_package_name}.json",
|
|
15
|
+
"watch": "tsc -w",
|
|
16
|
+
"test": "jest --passWithNoTests --coverage",
|
|
17
|
+
"cdk": "cdk",
|
|
18
|
+
"lint": "eslint --max-warnings 0 -c ../../../../.eslintrc.json '**/*.{ts,tsx}' --ignore-pattern 'dist/*' --ignore-pattern 'node_modules/*' --ignore-pattern \"*.d.ts\" "
|
|
19
|
+
},
|
|
20
|
+
"main": "lib/index.js",
|
|
21
|
+
"types": "lib/index.d.ts",
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@aws-mdaa/testing": "1.2.0",
|
|
24
|
+
"@types/jest": "29.5.0",
|
|
25
|
+
"@types/node": "17.0.23",
|
|
26
|
+
"@types/prettier": "2.6.0",
|
|
27
|
+
"jest": "29.5.0",
|
|
28
|
+
"ts-jest": "29.1.0",
|
|
29
|
+
"ts-node": "10.9.1",
|
|
30
|
+
"typescript": "4.6.3",
|
|
31
|
+
"typescript-json-schema": "0.63.0"
|
|
32
|
+
},
|
|
33
|
+
"overrides": {
|
|
34
|
+
"aws-cdk-lib": "2.201.0",
|
|
35
|
+
"@types/babel__traverse": "7.18.2"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@aws-mdaa/app": "1.2.0",
|
|
39
|
+
"@aws-mdaa/config": "1.2.0",
|
|
40
|
+
"@aws-mdaa/iam-constructs": "1.2.0",
|
|
41
|
+
"@aws-mdaa/iam-role-helper": "1.2.0",
|
|
42
|
+
"@aws-mdaa/kms-constructs": "1.2.0",
|
|
43
|
+
"@aws-mdaa/l3-construct": "1.2.0",
|
|
44
|
+
"@aws-mdaa/s3-constructs": "1.2.0",
|
|
45
|
+
"ajv": "8.17.1",
|
|
46
|
+
"aws-cdk-lib": "2.201.0",
|
|
47
|
+
"cdk-nag": "2.37.1",
|
|
48
|
+
"constructs": "10.0.96",
|
|
49
|
+
"source-map-support": "0.5.21",
|
|
50
|
+
"yaml": "1.10.2"
|
|
51
|
+
},
|
|
52
|
+
"gitHead": "8b49a2b371014baec046605ffdbfe38951099c31",
|
|
53
|
+
"repository": {
|
|
54
|
+
"type": "git",
|
|
55
|
+
"url": "https://github.com/aws/modern-data-architecture-accelerator"
|
|
56
|
+
}
|
|
57
|
+
}
|