@rio-cloud/cdk-v2-constructs 8.8.2 → 9.0.0-alpha.1
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 +3550 -7420
- package/lib/contributions/cop-frontend/cloudfront/rio-cloudfront-distribution.js +1 -5
- package/lib/contributions/smart-route/gitlab-runner/autoscaling-runner.js +1 -5
- package/lib/contributions/smart-route/gitlab-runner/runner-roles.js +1 -5
- package/lib/contributions/smart-route/gitlab-runner/spot-role.js +1 -5
- package/lib/contributions/team-claid/aws-backup-monitoring/aws-backup-monitoring.js +1 -7
- package/lib/contributions/team-claid/aws-glue/csv-table.js +1 -5
- package/lib/contributions/team-claid/aws-glue/schema.js +1 -5
- package/lib/contributions/team-claid/aws-glue/view-table.js +1 -5
- package/lib/contributions/team-claid/datadog-usage-monitoring/datadog-usage-monitoring.js +1 -5
- package/lib/contributions/team-outbound-order-book/aws-ecs-abruptly-stopped-monitor/aws-ecs-abruptly-stopped-monitor.js +1 -5
- package/lib/contributions/team-outbound-order-book/index.d.ts +1 -0
- package/lib/contributions/team-outbound-order-book/index.js +18 -0
- package/lib/contributions/team-shipper-inbound-blue/index.d.ts +1 -0
- package/lib/contributions/team-shipper-inbound-blue/index.js +18 -0
- package/lib/contributions/team-shipper-inbound-blue/pipeline/code-build-project.js +1 -5
- package/lib/contributions/team-shipper-inbound-blue/pipeline/pipeline-build-stage-actions.js +1 -5
- package/lib/contributions/team-transport/datadog/datadog-dashboard-construct.js +41 -0
- package/lib/contributions/team-transport/datadog/datadog-dashboard-downloader.js +120 -0
- package/lib/contributions/{team-transport-two → team-transport}/datadog/index.js +1 -1
- package/lib/contributions/{team-transport-two → team-transport}/datadog-synthetics/datadog-synthetics-test-custom-resource/handler.cjs +109 -106
- package/lib/contributions/team-transport/datadog-synthetics/datadog-synthetics-test.js +77 -0
- package/lib/contributions/{team-transport-two → team-transport}/datadog-synthetics/index.js +1 -1
- package/lib/contributions/team-transport/index.d.ts +3 -0
- package/lib/contributions/team-transport/index.js +20 -0
- package/lib/contributions/team-transport/pipeline/application-stage.js +16 -0
- package/lib/contributions/team-transport/pipeline/build-project.js +39 -0
- package/lib/contributions/{team-transport-two → team-transport}/pipeline/buildspecs.d.ts +3 -3
- package/lib/contributions/team-transport/pipeline/buildspecs.js +227 -0
- package/lib/contributions/team-transport/pipeline/datadog-monitors.js +45 -0
- package/lib/contributions/{team-transport-two → team-transport}/pipeline/index.js +1 -1
- package/lib/contributions/team-transport/pipeline/monitoring-deploy-step.js +28 -0
- package/lib/contributions/{team-transport-two → team-transport}/pipeline/pipeline-stack.d.ts +2 -0
- package/lib/contributions/team-transport/pipeline/pipeline-stack.js +430 -0
- package/lib/datadogv2/datadog-lambda-instrumentation.d.ts +1 -1
- package/lib/datadogv2/datadog-lambda-instrumentation.js +5 -2
- package/lib/datadogv2/secret-locator-custom-resource/on-create.cjs +85 -76
- package/lib/datadogv2/service-catalog-custom-resource/on-create.cjs +85 -82
- package/lib/datadogv2/validate-lambda-environment.d.ts +3 -0
- package/lib/datadogv2/validate-lambda-environment.js +33 -0
- package/lib/fargate/codedeploy-custom-resources/create-deployment-is-complete.cjs +85 -76
- package/lib/fargate/codedeploy-custom-resources/create-deployment-on-create.cjs +85 -76
- package/lib/fargate/codedeploy-custom-resources/run-monitoring-test-suite-runner.cjs +90 -81
- package/lib/index.d.ts +0 -8
- package/lib/index.js +1 -9
- package/lib/sbom-catalog/lambda/handler.cjs +88 -84
- package/package.json +22 -11
- package/version.json +1 -1
- package/lib/contributions/team-transport-two/datadog/datadog-dashboard-construct.js +0 -45
- package/lib/contributions/team-transport-two/datadog/datadog-dashboard-downloader.js +0 -120
- package/lib/contributions/team-transport-two/datadog-synthetics/datadog-synthetics-test.js +0 -81
- package/lib/contributions/team-transport-two/pipeline/application-stage.js +0 -16
- package/lib/contributions/team-transport-two/pipeline/build-project.js +0 -39
- package/lib/contributions/team-transport-two/pipeline/buildspecs.js +0 -205
- package/lib/contributions/team-transport-two/pipeline/datadog-monitors.js +0 -45
- package/lib/contributions/team-transport-two/pipeline/monitoring-deploy-step.js +0 -28
- package/lib/contributions/team-transport-two/pipeline/pipeline-stack.js +0 -432
- /package/lib/contributions/{team-transport-two → team-transport}/datadog/datadog-dashboard-construct.d.ts +0 -0
- /package/lib/contributions/{team-transport-two → team-transport}/datadog/datadog-dashboard-downloader.d.ts +0 -0
- /package/lib/contributions/{team-transport-two → team-transport}/datadog/index.d.ts +0 -0
- /package/lib/contributions/{team-transport-two → team-transport}/datadog-synthetics/datadog-synthetics-test.d.ts +0 -0
- /package/lib/contributions/{team-transport-two → team-transport}/datadog-synthetics/index.d.ts +0 -0
- /package/lib/contributions/{team-transport-two → team-transport}/pipeline/application-stage.d.ts +0 -0
- /package/lib/contributions/{team-transport-two → team-transport}/pipeline/build-project.d.ts +0 -0
- /package/lib/contributions/{team-transport-two → team-transport}/pipeline/datadog-monitors.d.ts +0 -0
- /package/lib/contributions/{team-transport-two → team-transport}/pipeline/index.d.ts +0 -0
- /package/lib/contributions/{team-transport-two → team-transport}/pipeline/monitoring-deploy-step.d.ts +0 -0
|
@@ -1,432 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _a;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.PipelineStack = exports.PipelineType = void 0;
|
|
5
|
-
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
-
const aws_codebuild_1 = require("aws-cdk-lib/aws-codebuild");
|
|
8
|
-
const codepipeline = require("aws-cdk-lib/aws-codepipeline");
|
|
9
|
-
const codepipeline_actions = require("aws-cdk-lib/aws-codepipeline-actions");
|
|
10
|
-
const events = require("aws-cdk-lib/aws-events");
|
|
11
|
-
const targets = require("aws-cdk-lib/aws-events-targets");
|
|
12
|
-
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
13
|
-
const s3 = require("aws-cdk-lib/aws-s3");
|
|
14
|
-
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
15
|
-
const ssm = require("aws-cdk-lib/aws-ssm");
|
|
16
|
-
const pipelines = require("aws-cdk-lib/pipelines");
|
|
17
|
-
const pipelines_1 = require("aws-cdk-lib/pipelines");
|
|
18
|
-
const fs = require("fs");
|
|
19
|
-
const yaml = require("js-yaml");
|
|
20
|
-
const path = require("path");
|
|
21
|
-
const iam_1 = require("../../../iam");
|
|
22
|
-
const rio = require("../../../index");
|
|
23
|
-
const index_1 = require("../../../index");
|
|
24
|
-
const application_stage_1 = require("./application-stage");
|
|
25
|
-
const build_project_1 = require("./build-project");
|
|
26
|
-
const buildspecs_1 = require("./buildspecs");
|
|
27
|
-
const datadog_monitors_1 = require("./datadog-monitors");
|
|
28
|
-
const monitoring_deploy_step_1 = require("./monitoring-deploy-step");
|
|
29
|
-
var PipelineType;
|
|
30
|
-
(function (PipelineType) {
|
|
31
|
-
/**
|
|
32
|
-
* Self-mutating codepipeline deploying the provided AppStack. Be aware: The provided service won't have access to Kafka.
|
|
33
|
-
*
|
|
34
|
-
* Comes with a pre-defined buildspec.yaml for a gradle project. This buildspec.yaml is used for both the main and
|
|
35
|
-
* branch pipeline and includes the following steps
|
|
36
|
-
* - build and test of the artifact via command "./gradlew clean build".
|
|
37
|
-
* <p> This gradle command must be provided by the gradle project.
|
|
38
|
-
* - license-check and upload of license-check-file using @rio-cloud/rio-license-checker.
|
|
39
|
-
* <p> This gradle command must be provided by the gradle project.
|
|
40
|
-
* - create a self-signed certificate to make TLS communication possible, e.g. with a loadbalancer.
|
|
41
|
-
* - build the container image via command "./gradlew jibBuildTar".
|
|
42
|
-
* <p> This gradle command must be provided by the gradle project.
|
|
43
|
-
*/
|
|
44
|
-
PipelineType["STANDARD_GRADLE"] = "STANDARD_GRADLE";
|
|
45
|
-
/**
|
|
46
|
-
* Self-mutating codepipeline deploying the provided AppStack with additional steps needed to access Kafka.
|
|
47
|
-
*
|
|
48
|
-
* Comes with a pre-defined buildspec.yaml for a gradle project. This buildspec.yaml is used for both the main and
|
|
49
|
-
* branch pipeline and includes the following steps
|
|
50
|
-
* - build and test of the artifact via command "./gradlew clean build".
|
|
51
|
-
* <p> This gradle command must be provided by the gradle project.
|
|
52
|
-
* - license-check and upload of license-check-file using @rio-cloud/rio-license-checker.
|
|
53
|
-
* <p> This gradle command must be provided by the gradle project.
|
|
54
|
-
* - create a self-signed certificate to make TLS communication possible, e.g. with a loadbalancer.
|
|
55
|
-
* - request a certificate to authenticate against Kafka via mutual TLS
|
|
56
|
-
* - build the container image via command "./gradlew jibBuildTar".
|
|
57
|
-
* <p> This gradle command must be provided by the gradle project.
|
|
58
|
-
*/
|
|
59
|
-
PipelineType["STANDARD_GRADLE_KAFKA"] = "STANDARD_GRADLE_KAFKA";
|
|
60
|
-
/**
|
|
61
|
-
* Self-mutating codepipeline deploying the provided AppStack.
|
|
62
|
-
*
|
|
63
|
-
* Comes with a pre-defined buildspec.yaml to synthesize the AppStack.
|
|
64
|
-
* No branch or vulnerability pipeline is created.
|
|
65
|
-
*/
|
|
66
|
-
PipelineType["STANDARD_INFRASTRUCTURE"] = "STANDARD_INFRASTRUCTURE";
|
|
67
|
-
})(PipelineType || (exports.PipelineType = PipelineType = {}));
|
|
68
|
-
class PipelineStack extends aws_cdk_lib_1.Stack {
|
|
69
|
-
constructor(scope, id, props) {
|
|
70
|
-
super(scope, id, props);
|
|
71
|
-
this._features = this.parseFeatures(props);
|
|
72
|
-
// populate external parameters
|
|
73
|
-
this._bucket = s3.Bucket.fromBucketName(this, 'TriggerBucket', aws_cdk_lib_1.Fn.importValue('bitbucket-integration-s3-bucket'));
|
|
74
|
-
this._cacheBucket = new s3.Bucket(this, 'CacheBucket', {
|
|
75
|
-
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
76
|
-
autoDeleteObjects: true,
|
|
77
|
-
lifecycleRules: [
|
|
78
|
-
{
|
|
79
|
-
expiration: aws_cdk_lib_1.Duration.days(30),
|
|
80
|
-
abortIncompleteMultipartUploadAfter: aws_cdk_lib_1.Duration.days(7),
|
|
81
|
-
},
|
|
82
|
-
],
|
|
83
|
-
});
|
|
84
|
-
this._hostedZone = rio.RioLandingZone.getDefaultHostedZone(this);
|
|
85
|
-
this._inputMasterTriggerFile = pipelines.CodePipelineSource.s3(this._bucket, `${props.serviceName}/trigger/${rio.TriggerKey.MASTER_REPO}`, { trigger: codepipeline_actions.S3Trigger.EVENTS });
|
|
86
|
-
this._inputBranchTriggerFile = pipelines.CodePipelineSource.s3(this._bucket, `${props.serviceName}/trigger/${rio.TriggerKey.BRANCH_REPO}`, { trigger: codepipeline_actions.S3Trigger.EVENTS });
|
|
87
|
-
this._ossLicensesBucketParameter = ssm.StringParameter.fromStringParameterAttributes(this, 'OssLicensesBucketParameter', { parameterName: '/config/oss-licenses/bucket-name' });
|
|
88
|
-
this._ossLicensesBucket = s3.Bucket.fromBucketName(this, 'OssLicensesBucket', this._ossLicensesBucketParameter.stringValue);
|
|
89
|
-
this._serviceKeystorePassword = ssm.StringParameter.fromSecureStringParameterAttributes(this, 'KeystorePassword', {
|
|
90
|
-
parameterName: `/config/${props.serviceName}/service-keystore-password`,
|
|
91
|
-
version: 1,
|
|
92
|
-
});
|
|
93
|
-
this._accountNameParameter = ssm.StringParameter.fromStringParameterName(this, 'AccountNameParameter', '/config/account/name');
|
|
94
|
-
this._teamIdentifierParameter = ssm.StringParameter.fromStringParameterName(this, 'TeamIdentifierParameter', '/config/team/identifier');
|
|
95
|
-
this._nistDataMirrorUrl = ssm.StringParameter.fromSecureStringParameterAttributes(this, 'NistDataMirrorUrl', {
|
|
96
|
-
parameterName: '/config/nist-data-mirror/url',
|
|
97
|
-
version: 1,
|
|
98
|
-
});
|
|
99
|
-
this._codePipelineType = props.codePipelineType ?? codepipeline.PipelineType.V1;
|
|
100
|
-
this._mainCodeBuildProject = this.createMainCodeBuildProject(props);
|
|
101
|
-
this.addMainPipeline(this._mainCodeBuildProject, props);
|
|
102
|
-
if (this._features.branchPipeline) {
|
|
103
|
-
this._branchCodeBuildProject = this.createBranchCodeBuildProject(props);
|
|
104
|
-
this.addBranchPipeline(this._branchCodeBuildProject);
|
|
105
|
-
}
|
|
106
|
-
if (this._features.vulnerabilityPipeline) {
|
|
107
|
-
this._vulnerabilityCodeBuildProject = this.createVulnerabilityBuildProject(props);
|
|
108
|
-
this.addVulnerabilityPipeline(this._vulnerabilityCodeBuildProject, props);
|
|
109
|
-
}
|
|
110
|
-
const [feature, packageName] = __dirname.split(path.sep).reverse();
|
|
111
|
-
new index_1.Claidometer(this, 'Claidometer', {
|
|
112
|
-
product: index_1.ClaidometerProduct.CDK_CONTRIBUTION,
|
|
113
|
-
packageName,
|
|
114
|
-
feature,
|
|
115
|
-
version: '1.5.0',
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
get mainCodebuildProject() {
|
|
119
|
-
return this._mainCodeBuildProject;
|
|
120
|
-
}
|
|
121
|
-
get branchCodeBuildProject() {
|
|
122
|
-
if (this._branchCodeBuildProject === undefined) {
|
|
123
|
-
throw Error('The pipeline type you have selected does not support a branch codebuild project');
|
|
124
|
-
}
|
|
125
|
-
return this._branchCodeBuildProject;
|
|
126
|
-
}
|
|
127
|
-
get vulnerabilityCodeBuildProject() {
|
|
128
|
-
if (this._vulnerabilityCodeBuildProject === undefined) {
|
|
129
|
-
throw Error('The pipeline type you have selected does not support a vulnerability codebuild project');
|
|
130
|
-
}
|
|
131
|
-
return this._vulnerabilityCodeBuildProject;
|
|
132
|
-
}
|
|
133
|
-
parseFeatures(props) {
|
|
134
|
-
if (props.pipelineType && props.features) {
|
|
135
|
-
throw Error('You cannot provide both a pipelineType and features. Please use features only.');
|
|
136
|
-
}
|
|
137
|
-
if (props.features?.kafkaIntegration && !props.features?.gradleBuild) {
|
|
138
|
-
throw Error('Kafka integration is only supported for pipelines with gradle build');
|
|
139
|
-
}
|
|
140
|
-
if (props.features?.frontendBucketName && !props.features?.npmBuild) {
|
|
141
|
-
throw Error('Frontend bucket name can only be set when npm build is enabled');
|
|
142
|
-
}
|
|
143
|
-
if (props.features?.additionalBuildCommands && props.codeBuildOptions?.partialBuildSpecPath) {
|
|
144
|
-
throw Error('You cannot provide additionalBuildCommands if you use a partialBuildSpecPath.');
|
|
145
|
-
}
|
|
146
|
-
if (props.features && props.codeBuildOptions?.partialBuildSpecPath) {
|
|
147
|
-
console.warn('You are using the pipeline features in combination with a partialBuildSpecPath. Please keep in mind, that all buildspec related features are ignored and the partialBuildSpec is applied.');
|
|
148
|
-
}
|
|
149
|
-
if (props.pipelineType) {
|
|
150
|
-
switch (props.pipelineType) {
|
|
151
|
-
case PipelineType.STANDARD_GRADLE:
|
|
152
|
-
return {
|
|
153
|
-
branchPipeline: true,
|
|
154
|
-
vulnerabilityPipeline: true,
|
|
155
|
-
gradleBuild: true,
|
|
156
|
-
npmBuild: false,
|
|
157
|
-
kafkaIntegration: false,
|
|
158
|
-
enablePipelineMonitors: true,
|
|
159
|
-
};
|
|
160
|
-
case PipelineType.STANDARD_GRADLE_KAFKA:
|
|
161
|
-
return {
|
|
162
|
-
branchPipeline: true,
|
|
163
|
-
vulnerabilityPipeline: true,
|
|
164
|
-
gradleBuild: true,
|
|
165
|
-
npmBuild: false,
|
|
166
|
-
kafkaIntegration: true,
|
|
167
|
-
enablePipelineMonitors: true,
|
|
168
|
-
};
|
|
169
|
-
case PipelineType.STANDARD_INFRASTRUCTURE:
|
|
170
|
-
return {
|
|
171
|
-
branchPipeline: false,
|
|
172
|
-
vulnerabilityPipeline: false,
|
|
173
|
-
gradleBuild: false,
|
|
174
|
-
npmBuild: false,
|
|
175
|
-
kafkaIntegration: false,
|
|
176
|
-
enablePipelineMonitors: true,
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return {
|
|
181
|
-
branchPipeline: props.features?.branchPipeline ?? true,
|
|
182
|
-
vulnerabilityPipeline: props.features?.vulnerabilityPipeline ?? true,
|
|
183
|
-
gradleBuild: props.features?.gradleBuild ?? false,
|
|
184
|
-
npmBuild: props.features?.npmBuild ?? false,
|
|
185
|
-
kafkaIntegration: props.features?.kafkaIntegration ?? false,
|
|
186
|
-
frontendBucketName: props.features?.frontendBucketName,
|
|
187
|
-
additionalBuildCommands: props.features?.additionalBuildCommands,
|
|
188
|
-
enablePipelineMonitors: props.features?.enablePipelineMonitors ?? true,
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
createRioCodeBuildProject(name, cdkOutputDirectory, triggerFile, buildSpec, props) {
|
|
192
|
-
return new build_project_1.RioCodeBuildProject(this, name, {
|
|
193
|
-
input: triggerFile,
|
|
194
|
-
cdkOutDirectory: cdkOutputDirectory,
|
|
195
|
-
partialBuildSpec: buildSpec,
|
|
196
|
-
buildEnvironment: props?.codeBuildOptions?.buildEnvironment,
|
|
197
|
-
hostedZoneName: this._hostedZone.zoneName,
|
|
198
|
-
serviceName: props.serviceName,
|
|
199
|
-
cacheBucket: this._cacheBucket,
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
createMainCodeBuildProject(props) {
|
|
203
|
-
const buildSpec = this.loadBuildSpecFromFile(props?.codeBuildOptions?.partialBuildSpecPath) || (0, buildspecs_1.createMainBuildSpec)(this._features);
|
|
204
|
-
return this.createRioCodeBuildProject('MainBuild', 'infrastructure/cdk.out', this._inputMasterTriggerFile, buildSpec, props);
|
|
205
|
-
}
|
|
206
|
-
createBranchCodeBuildProject(props) {
|
|
207
|
-
const buildSpec = this.loadBuildSpecFromFile(props?.codeBuildOptions?.partialBuildSpecPath) || (0, buildspecs_1.createMainBuildSpec)(this._features);
|
|
208
|
-
return this.createRioCodeBuildProject('BranchBuild', 'infrastructure/cdk.out', this._inputBranchTriggerFile, buildSpec, props);
|
|
209
|
-
}
|
|
210
|
-
createVulnerabilityBuildProject(props) {
|
|
211
|
-
const buildSpec = this.loadBuildSpecFromFile(props?.codeBuildOptions?.vulnerabilityPartialBuildSpecPath) ||
|
|
212
|
-
(0, buildspecs_1.createVulnerabilityBuildSpec)(this._features);
|
|
213
|
-
return this.createRioCodeBuildProject('VulnerabilityChecks', './', this._inputMasterTriggerFile, buildSpec, props);
|
|
214
|
-
}
|
|
215
|
-
addMainPipeline(mainBuild, props) {
|
|
216
|
-
const pipeline = new codepipeline.Pipeline(this, 'Pipeline', {
|
|
217
|
-
artifactBucket: this._cacheBucket,
|
|
218
|
-
pipelineType: this._codePipelineType,
|
|
219
|
-
restartExecutionOnUpdate: true,
|
|
220
|
-
});
|
|
221
|
-
const codePipeline = new pipelines.CodePipeline(pipeline, 'CodePipeline', {
|
|
222
|
-
codePipeline: pipeline,
|
|
223
|
-
synth: mainBuild,
|
|
224
|
-
selfMutationCodeBuildDefaults: {
|
|
225
|
-
buildEnvironment: {
|
|
226
|
-
buildImage: aws_codebuild_1.LinuxLambdaBuildImage.AMAZON_LINUX_2023_NODE_20,
|
|
227
|
-
computeType: aws_codebuild_1.ComputeType.LAMBDA_1GB,
|
|
228
|
-
},
|
|
229
|
-
},
|
|
230
|
-
});
|
|
231
|
-
aws_cdk_lib_1.Tags.of(pipeline).add('pipeline_type', 'build');
|
|
232
|
-
const stripAssetsStep = this.createStripAssetsStep(codePipeline);
|
|
233
|
-
codePipeline.addWave('BeforeDeploy', { pre: [stripAssetsStep] });
|
|
234
|
-
const capabilityMonitoringDeployStep = this.createCapabilityMonitoringDeployStep(mainBuild, props);
|
|
235
|
-
const secretsDeployStepProps = this.createSecretsDeployStep(props);
|
|
236
|
-
const frontendDeployStep = this.createDeployFrontendDeployStep(mainBuild);
|
|
237
|
-
const postSteps = [];
|
|
238
|
-
if (capabilityMonitoringDeployStep) {
|
|
239
|
-
postSteps.push(capabilityMonitoringDeployStep);
|
|
240
|
-
}
|
|
241
|
-
if (frontendDeployStep) {
|
|
242
|
-
postSteps.push(frontendDeployStep);
|
|
243
|
-
}
|
|
244
|
-
codePipeline.addStage(new application_stage_1.Application(this, 'DeployApplicationStacks', {
|
|
245
|
-
appStackFactory: props.appStackFactory,
|
|
246
|
-
serviceName: props.serviceName,
|
|
247
|
-
version: process.env.PIPELINE_EXECUTION_ID ?? 'PIPELINE_EXECUTION_ID not set',
|
|
248
|
-
}), {
|
|
249
|
-
pre: secretsDeployStepProps ? [secretsDeployStepProps] : undefined,
|
|
250
|
-
post: postSteps,
|
|
251
|
-
});
|
|
252
|
-
codePipeline.buildPipeline();
|
|
253
|
-
this.tagCodeBuildProject(stripAssetsStep, 'project_type', 'strip_assets');
|
|
254
|
-
this.tagCodeBuildProject(secretsDeployStepProps, 'project_type', 'deploy_secrets');
|
|
255
|
-
this.tagCodeBuildProject(mainBuild, 'project_type', 'build');
|
|
256
|
-
this.tagCodeBuildProject(capabilityMonitoringDeployStep, 'project_type', 'deploy_capability_monitoring');
|
|
257
|
-
this.tagCodeBuildProject(frontendDeployStep, 'project_type', 'deploy_frontend');
|
|
258
|
-
if (capabilityMonitoringDeployStep) {
|
|
259
|
-
const monitoringTestsuiteRunnerBucket = aws_s3_1.Bucket.fromBucketName(this, 'MonitoringTestsuiteRunnerBucket', `monitoring-testsuite-runner-${this.account}`);
|
|
260
|
-
monitoringTestsuiteRunnerBucket.grantWrite(capabilityMonitoringDeployStep);
|
|
261
|
-
}
|
|
262
|
-
if (frontendDeployStep) {
|
|
263
|
-
const frontendBucket = s3.Bucket.fromBucketName(this, 'FrontendBucket', this._features.frontendBucketName);
|
|
264
|
-
frontendBucket.grantReadWrite(frontendDeployStep);
|
|
265
|
-
}
|
|
266
|
-
const rule = new events.Rule(this, 'PipelineSchedule', {
|
|
267
|
-
schedule: events.Schedule.expression(props.pipelineSchedules?.mainPipeline || 'cron(0 9 ? * 2#1 *)'),
|
|
268
|
-
});
|
|
269
|
-
rule.addTarget(new targets.CodePipeline(codePipeline.pipeline));
|
|
270
|
-
this._ossLicensesBucket.grantReadWrite(mainBuild);
|
|
271
|
-
this._ossLicensesBucketParameter.grantRead(mainBuild);
|
|
272
|
-
this._serviceKeystorePassword.grantRead(mainBuild);
|
|
273
|
-
this._accountNameParameter.grantRead(mainBuild);
|
|
274
|
-
this._teamIdentifierParameter.grantRead(mainBuild);
|
|
275
|
-
if (this._features.kafkaIntegration) {
|
|
276
|
-
this.grantPermissionsForKafkaIntegration(mainBuild, 'KafkaIntegrationPolicy');
|
|
277
|
-
}
|
|
278
|
-
codePipeline.pipeline.artifactBucket.grantReadWrite(stripAssetsStep.project);
|
|
279
|
-
if (this._features?.enablePipelineMonitors) {
|
|
280
|
-
new datadog_monitors_1.DatadogPipelineErrorAlert(this, 'DatadogPipelineErrorMonitor', {
|
|
281
|
-
serviceName: props.serviceName,
|
|
282
|
-
pipelineName: pipeline.pipelineName,
|
|
283
|
-
accountId: this.account,
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
addBranchPipeline(branchBuild) {
|
|
288
|
-
const branchPipeline = new codepipeline.Pipeline(this, 'BranchPipeline', {
|
|
289
|
-
artifactBucket: this._cacheBucket,
|
|
290
|
-
pipelineType: this._codePipelineType,
|
|
291
|
-
restartExecutionOnUpdate: true,
|
|
292
|
-
});
|
|
293
|
-
const branchCodePipeline = new pipelines.CodePipeline(branchPipeline, 'CodePipeline', {
|
|
294
|
-
codePipeline: branchPipeline,
|
|
295
|
-
synth: branchBuild,
|
|
296
|
-
selfMutation: false,
|
|
297
|
-
});
|
|
298
|
-
aws_cdk_lib_1.Tags.of(branchPipeline).add('pipeline_type', 'branch');
|
|
299
|
-
branchCodePipeline.addWave('BranchBuild').addPost(branchBuild);
|
|
300
|
-
branchCodePipeline.buildPipeline();
|
|
301
|
-
this.tagCodeBuildProject(branchBuild, 'project_type', 'branch_build');
|
|
302
|
-
this._ossLicensesBucket.grantReadWrite(branchBuild);
|
|
303
|
-
this._ossLicensesBucketParameter.grantRead(branchBuild);
|
|
304
|
-
this._serviceKeystorePassword.grantRead(branchBuild);
|
|
305
|
-
this._accountNameParameter.grantRead(branchBuild);
|
|
306
|
-
this._teamIdentifierParameter.grantRead(branchBuild);
|
|
307
|
-
if (this._features.kafkaIntegration) {
|
|
308
|
-
this.grantPermissionsForKafkaIntegration(branchBuild, 'BranchKafkaIntegrationPolicy');
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
addVulnerabilityPipeline(vulnerabilityBuild, props) {
|
|
312
|
-
const vulnerabilityPipeline = new codepipeline.Pipeline(this, 'VulnerabilityPipeline', {
|
|
313
|
-
artifactBucket: this._cacheBucket,
|
|
314
|
-
pipelineType: this._codePipelineType,
|
|
315
|
-
restartExecutionOnUpdate: true,
|
|
316
|
-
});
|
|
317
|
-
const vulnerabilityCodePipeline = new pipelines.CodePipeline(vulnerabilityPipeline, 'CodePipeline', {
|
|
318
|
-
codePipeline: vulnerabilityPipeline,
|
|
319
|
-
synth: vulnerabilityBuild,
|
|
320
|
-
selfMutation: false,
|
|
321
|
-
});
|
|
322
|
-
aws_cdk_lib_1.Tags.of(vulnerabilityPipeline).add('pipeline_type', 'vulnerability');
|
|
323
|
-
vulnerabilityCodePipeline.addWave('VulnerabilityChecks').addPost(vulnerabilityBuild);
|
|
324
|
-
vulnerabilityCodePipeline.buildPipeline();
|
|
325
|
-
aws_cdk_lib_1.Tags.of(vulnerabilityBuild.project).add('project_type', 'vulnerability_check');
|
|
326
|
-
this._nistDataMirrorUrl.grantRead(vulnerabilityBuild);
|
|
327
|
-
iam_1.SonatypeOssIndexCredentials.allowAccessTo(this, vulnerabilityBuild);
|
|
328
|
-
const vulnerabilityRule = new events.Rule(this, 'VulnerabilityPipelineSchedule', {
|
|
329
|
-
schedule: events.Schedule.expression(props.pipelineSchedules?.vulnerabilityPipeline || 'cron(0 5 ? * MON-FRI *)'),
|
|
330
|
-
});
|
|
331
|
-
vulnerabilityRule.addTarget(new targets.CodePipeline(vulnerabilityCodePipeline.pipeline));
|
|
332
|
-
if (props.datadogAlertType === 'opsgenie') {
|
|
333
|
-
throw Error('The OpsGenie alertType is not supported anymore. Please use the vulnerabilityNotification property instead.');
|
|
334
|
-
}
|
|
335
|
-
if (this._features?.enablePipelineMonitors) {
|
|
336
|
-
new datadog_monitors_1.DataDogPipelineErrorAlertForVulnerabilityChecks(this, 'DataDogPipelineErrorForVulnerabilityChecksMonitor', {
|
|
337
|
-
serviceName: props.serviceName,
|
|
338
|
-
pipelineName: vulnerabilityPipeline.pipelineName,
|
|
339
|
-
accountId: this.account,
|
|
340
|
-
notification: props.vulnerabilityNotification,
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
createStripAssetsStep(pipeline) {
|
|
345
|
-
// CloudAssemblyArtifacts must be smaller than 256MB. Due to the gradle artifact we are exceeding this limit and pipeline fails in deployment step.
|
|
346
|
-
// Issue is known and not fixed for already some years. See: https://github.com/aws/aws-cdk/issues/9917
|
|
347
|
-
// Dirty fix: Assets are already uploaded and thus not needed. Remove them from pipeline artifact.
|
|
348
|
-
return new pipelines_1.CodeBuildStep('StripAssetsFromAssembly', {
|
|
349
|
-
input: pipeline.cloudAssemblyFileSet,
|
|
350
|
-
commands: [
|
|
351
|
-
'S3_PATH=${CODEBUILD_SOURCE_VERSION#"arn:aws:s3:::"}',
|
|
352
|
-
'ZIP_ARCHIVE=$(basename $S3_PATH)',
|
|
353
|
-
'rm -rfv asset.*',
|
|
354
|
-
'zip -r -q -A $ZIP_ARCHIVE *',
|
|
355
|
-
'aws s3 cp $ZIP_ARCHIVE s3://$S3_PATH',
|
|
356
|
-
],
|
|
357
|
-
buildEnvironment: {
|
|
358
|
-
buildImage: aws_codebuild_1.LinuxLambdaBuildImage.AMAZON_LINUX_2023_NODE_20,
|
|
359
|
-
computeType: aws_codebuild_1.ComputeType.LAMBDA_1GB,
|
|
360
|
-
},
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
createCapabilityMonitoringDeployStep(mainBuild, props) {
|
|
364
|
-
if (props.monitoringDeployStepProps) {
|
|
365
|
-
const monitoringArtifacts = Object.keys(props.monitoringDeployStepProps.monitoringArtifacts).map(key => {
|
|
366
|
-
const output = mainBuild.addOutputDirectory(key);
|
|
367
|
-
return {
|
|
368
|
-
input: output,
|
|
369
|
-
files: props.monitoringDeployStepProps.monitoringArtifacts[key],
|
|
370
|
-
};
|
|
371
|
-
});
|
|
372
|
-
return new monitoring_deploy_step_1.RioCapabilityMonitoringDeployStep(this, 'DeployCapabilityMonitoring', {
|
|
373
|
-
monitoringArtifacts: monitoringArtifacts,
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
else {
|
|
377
|
-
return undefined;
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
createSecretsDeployStep(props) {
|
|
381
|
-
if (props.secretsDeployStepProps) {
|
|
382
|
-
return new rio.RioSecretsDeployStep(this, 'DeploySecrets', {
|
|
383
|
-
...props.secretsDeployStepProps,
|
|
384
|
-
input: this._inputMasterTriggerFile,
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
else {
|
|
388
|
-
return undefined;
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
createDeployFrontendDeployStep(mainBuild) {
|
|
392
|
-
if (!this._features.frontendBucketName) {
|
|
393
|
-
return undefined;
|
|
394
|
-
}
|
|
395
|
-
const frontendBuildOutput = mainBuild.addOutputDirectory('build');
|
|
396
|
-
return new pipelines_1.CodeBuildStep('DeployFrontend', {
|
|
397
|
-
input: frontendBuildOutput,
|
|
398
|
-
buildEnvironment: {
|
|
399
|
-
buildImage: aws_codebuild_1.LinuxLambdaBuildImage.AMAZON_LINUX_2023_NODE_20,
|
|
400
|
-
computeType: aws_codebuild_1.ComputeType.LAMBDA_1GB,
|
|
401
|
-
},
|
|
402
|
-
commands: [
|
|
403
|
-
`aws s3 sync --exclude index.html --cache-control max-age=31536000 ./ 's3://${this._features.frontendBucketName}'`,
|
|
404
|
-
`aws s3 cp --cache-control no-cache index.html 's3://${this._features.frontendBucketName}'`,
|
|
405
|
-
],
|
|
406
|
-
});
|
|
407
|
-
}
|
|
408
|
-
grantPermissionsForKafkaIntegration(buildProject, policyId) {
|
|
409
|
-
const buildProjectRole = buildProject.project.role;
|
|
410
|
-
if (buildProjectRole) {
|
|
411
|
-
buildProjectRole.addManagedPolicy(aws_iam_1.ManagedPolicy.fromManagedPolicyArn(this, policyId, aws_cdk_lib_1.Fn.importValue('kafka-integration-policy-arn')));
|
|
412
|
-
}
|
|
413
|
-
else {
|
|
414
|
-
throw Error(`Could not add managed policy for kafka-integration to CodeBuild project of ${buildProject.id} due to missing role.`);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
loadBuildSpecFromFile(buildSpecPath) {
|
|
418
|
-
if (!buildSpecPath) {
|
|
419
|
-
return undefined;
|
|
420
|
-
}
|
|
421
|
-
return aws_codebuild_1.BuildSpec.fromObject(yaml.load(fs.readFileSync(buildSpecPath, { encoding: 'utf-8' })));
|
|
422
|
-
}
|
|
423
|
-
tagCodeBuildProject(project, key, value) {
|
|
424
|
-
if (project) {
|
|
425
|
-
aws_cdk_lib_1.Tags.of(project.project).add(key, value);
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
exports.PipelineStack = PipelineStack;
|
|
430
|
-
_a = JSII_RTTI_SYMBOL_1;
|
|
431
|
-
PipelineStack[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.PipelineStack", version: "0.0.0" };
|
|
432
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29udHJpYnV0aW9ucy90ZWFtLXRyYW5zcG9ydC10d28vcGlwZWxpbmUvcGlwZWxpbmUtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBbUY7QUFDbkYsNkRBQTRHO0FBQzVHLDZEQUE2RDtBQUM3RCw2RUFBNkU7QUFDN0UsaURBQWlEO0FBQ2pELDBEQUEwRDtBQUMxRCxpREFBb0Q7QUFFcEQseUNBQXlDO0FBQ3pDLCtDQUFxRDtBQUNyRCwyQ0FBMkM7QUFFM0MsbURBQW1EO0FBQ25ELHFEQUEwRTtBQUUxRSx5QkFBeUI7QUFDekIsZ0NBQWdDO0FBQ2hDLDZCQUE2QjtBQUc3QixzQ0FBMkQ7QUFDM0Qsc0NBQXNDO0FBQ3RDLDBDQUFpRTtBQUNqRSwyREFBa0Q7QUFDbEQsbURBQXNEO0FBQ3RELDZDQUFpRjtBQUNqRix5REFBZ0g7QUFDaEgscUVBQTZFO0FBMkw3RSxJQUFZLFlBcUNYO0FBckNELFdBQVksWUFBWTtJQUN0Qjs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxtREFBbUMsQ0FBQTtJQUNuQzs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsK0RBQStDLENBQUE7SUFDL0M7Ozs7O09BS0c7SUFDSCxtRUFBbUQsQ0FBQTtBQUNyRCxDQUFDLEVBckNXLFlBQVksNEJBQVosWUFBWSxRQXFDdkI7QUFpQkQsTUFBYSxhQUFjLFNBQVEsbUJBQUs7SUFrQnRDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7UUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLCtCQUErQjtRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxD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WUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDbkQsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLGdCQUFnQixDQUFDLGdCQUFnQixDQUMvQix1QkFBYSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsZ0JBQUUsQ0FBQyxXQUFXLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUNuRyxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEtBQUssQ0FDVCw4RUFBOEUsWUFBWSxDQUFDLEVBQUUsdUJBQXVCLENBQ3JILENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLGFBQXNCO1FBQ2xELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyx5QkFBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQVcsQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxPQUFrQyxFQUFFLEdBQVcsRUFBRSxLQUFhO1FBQ3hGLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixrQkFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQzs7QUEzZEgsc0NBNGRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIEZuLCBSZW1vdmFsUG9saWN5LCBTdGFjaywgU3RhY2tQcm9wcywgVGFncyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEJ1aWxkRW52aXJvbm1lbnQsIEJ1aWxkU3BlYywgQ29tcHV0ZVR5cGUsIExpbnV4TGFtYmRhQnVpbGRJbWFnZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0ICogYXMgY29kZXBpcGVsaW5lIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUnO1xuaW1wb3J0ICogYXMgY29kZXBpcGVsaW5lX2FjdGlvbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZS1hY3Rpb25zJztcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzJztcbmltcG9ydCAqIGFzIHRhcmdldHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCB7IE1hbmFnZWRQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IElIb3N0ZWRab25lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IEJ1Y2tldCwgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBJU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgKiBhcyBwaXBlbGluZXMgZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB7IENvZGVCdWlsZFN0ZXAsIENvZGVQaXBlbGluZVNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliL3BpcGVsaW5lcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgRGF0YWRvZ0FsZXJ0VHlwZSB9IGZyb20gJy4uLy4uLy4uL2RhdGFkb2cnO1xuaW1wb3J0IHsgSU5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RhdGFkb2d2Mic7XG5pbXBvcnQgeyBTb25hdHlwZU9zc0luZGV4Q3JlZGVudGlhbHMgfSBmcm9tICcuLi8uLi8uLi9pYW0nO1xuaW1wb3J0ICogYXMgcmlvIGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCB7IENsYWlkb21ldGVyLCBDbGFpZG9tZXRlclByb2R1Y3QgfSBmcm9tICcuLi8uLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbiB9IGZyb20gJy4vYXBwbGljYXRpb24tc3RhZ2UnO1xuaW1wb3J0IHsgUmlvQ29kZUJ1aWxkUHJvamVjdCB9IGZyb20gJy4vYnVpbGQtcHJvamVjdCc7XG5pbXBvcnQgeyBjcmVhdGVNYWluQnVpbGRTcGVjLCBjcmVhdGVWdWxuZXJhYmlsaXR5QnVpbGRTcGVjIH0gZnJvbSAnLi9idWlsZHNwZWNzJztcbmltcG9ydCB7IERhdGFEb2dQaXBlbGluZUVycm9yQWxlcnRGb3JWdWxuZXJhYmlsaXR5Q2hlY2tzLCBEYXRhZG9nUGlwZWxpbmVFcnJvckFsZXJ0IH0gZnJvbSAnLi9kYXRhZG9nLW1vbml0b3JzJztcbmltcG9ydCB7IFJpb0NhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCB9IGZyb20gJy4vbW9uaXRvcmluZy1kZXBsb3ktc3RlcCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTY2hlZHVsZXNQcm9wcyB7XG4gIHJlYWRvbmx5IG1haW5QaXBlbGluZT86IHN0cmluZztcbiAgcmVhZG9ubHkgdnVsbmVyYWJpbGl0eVBpcGVsaW5lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBzdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlXG4gICAqIC0gVGhpcyBoYXMgdG8gYmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcmVwb3NpdG9yeSBhcyB0aGUgczMgdHJpZ2dlciBmaWxlIGNyZWF0ZWQgYnkgdGhlIGJpdGJ1Y2tldC1pbnRlZ3JhdGlvbiB1c2VzIHRoaXMgYXMgYSBwcmVmaXhcbiAgICogLSBUaGUgc2VydmljZU5hbWUgaXMgYXZhaWxhYmxlIGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIFNFUlZJQ0VfTkFNRSBpbiB0aGUgQ29kZUJ1aWxkU3RlcFxuICAgKiAtIFRoZSBzZXJ2aWNlTmFtZSBpcyBhdmFpbGFibGUgaW4gdGhlIEFwcFN0YWNrUHJvcHMgaW4gdGhlIGFwcFN0YWNrRmFjdG9yeVxuICAgKiAtIFRoZSBzZXJ2aWNlTmFtZSBpcyBhdmFpbGFibGUgYXMgc3RhY2tOYW1lIHByb3BlcnR5IGluIHRoZSBBcHBTdGFja1Byb3BzIGluIHRoZSBhcHBTdGFja0ZhY3RvcnkuIEkuZS4gdGhlIHN0YWNrIGlzIG5hbWVkIGFmdGVyIHRoZSBzZXJ2aWNlXG4gICAqIC0gVGhlIHNlcnZpY2VOYW1lIGlzIGhhbmRlZCBvdmVyIHRvIGFsbCBEYXRhZG9nIG1vbml0b3JzXG4gICAqIC0gUklPIGNvbnZlbnRpb24gaXMgdGhhdCB1cGxvYWRlZCBsaWNlbnNlLWNoZWNrLWZpbGVzIGFyZSBuYW1lZCBhZnRlciB0aGUgc2VydmljZSwgaS5lLiBzZXJ2aWNlTmFtZS50eHRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVyIGZvciBhcHBTdGFjayB0byBiZSBkZXBsb3llZC5cbiAgICpcbiAgICogVGhpcyBhY3RzIGFzIGEgd3JhcHBlciBmb3IgYWxsIHJlc291cmNlcyB5b3Ugd2FudCB0byBkZXBsb3kgdmlhIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcFN0YWNrRmFjdG9yeTogSUFwcFN0YWNrRmFjdG9yeTtcblxuICAvKipcbiAgICogRGVmaW5lcyB3aGljaCBraW5kIG9mIHBpcGVsaW5lIGlzIGRlcGxveWVkLlxuICAgKlxuICAgKiBVc2UgdGhlIGZlYXR1cmVzIHRvIGNvbWJpbmUgZGlmZmVyZW50IG9waW5pb25hdGVkLCBSSU8tc3BlY2lmaWMgcGlwZWxpbmUgZmVhdHVyZXMgc3VjaCBhcyBhZGRpbmcgYSBicmFuY2ggcGlwZWxpbmUgb3Igc3VwcG9ydGluZyBLYWZrYS5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzPzogUGlwZWxpbmVGZWF0dXJlcztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBgZmVhdHVyZXNgIHByb3BlcnR5IGluc3RlYWQuIEZvciBub3csIHRoZSBwaXBlbGluZSB0eXBlcyBhcmUgbWFwcGVkIHRvIHRoZSBmZWF0dXJlcy5cbiAgICogRGVmaW5lcyB3aGljaCBraW5kIG9mIHBpcGVsaW5lIGlzIGRlcGxveWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVUeXBlPzogUGlwZWxpbmVUeXBlO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGhvdyBvZnRlbiB0aGUgcGlwZWxpbmUgaXMgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkuIElzIGRlZmluZWQgdmlhIGEgY3JvbiBleHByZXNzaW9uLlxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2V2ZW50cy9TY2hlZHVsZWRFdmVudHMuaHRtbFxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlczpcbiAgICogLSBtYWluIHBpcGVsaW5lOiBjcm9uKDAgOSA/ICogMiMxICopXG4gICAqIC0gdnVsbmVyYWJpbGl0eSBwaXBlbGluZTogY3JvbigwIDUgPyAqIE1PTi1GUkkgKilcbiAgICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lU2NoZWR1bGVzPzogUGlwZWxpbmVTY2hlZHVsZXNQcm9wcztcblxuICAvKipcbiAgICogUGF0aCB0byBzZWNyZXRzIGZpbGUgY29udGFpbmluZyBlbmNyeXB0ZWQgc2VjcmV0cy5cbiAgICpcbiAgICogVGhlIFJpb1NlY3JldHNEZXBsb3lTdGVwIGlzIGFkZGVkIHByaW9yIHRvIGRlcGxveW1lbnQgb2YgdGhlIEFwcFN0YWNrIGlmIGEgcGF0aCBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogTm8gc2VjcmV0cyBhcmUgZGVwbG95ZWQgaWYgbm8gcGF0aCBpcyBwcm92aWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldHNEZXBsb3lTdGVwUHJvcHM/OiBQaXBlbGluZVN0YWNrUmlvU2VjcmV0c0RlcGxveVN0ZXBQcm9wcztcblxuICAvKipcbiAgICogQ29kZUJ1aWxkIG9wdGlvbnMgb3ZlcnJpZGluZyB0aGUgcmlvLXNwZWNpZmljIGRlZmF1bHRzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZUJ1aWxkT3B0aW9ucz86IENvZGVCdWlsZE9wdGlvbnM7XG4gIC8qKlxuICAgKiBJZiBwcmVzZW50LCB0aGUgY2FwYWJpbGl0eSBtb25pdG9yaW5nIGRlcGxveSBzdGVwIGlzIGFkZGVkIHRvIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHJlYWRvbmx5IG1vbml0b3JpbmdEZXBsb3lTdGVwUHJvcHM/OiBQaXBlbGluZVN0YWNrUmlvTW9uaXRvcmluZ0RlcGxveVN0ZXBQcm9wcztcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgdGhlIGB2dWxuZXJhYmlsaXR5Tm90aWZpY2F0aW9uYCBwcm9wZXJ0eSBpbnN0ZWFkLlxuICAgKiBJZiBgb3BzZ2VuaWVgIGlzIHNwZWNpZmllZCwgYW4gRXhjZXB0aW9uIGlzIHRocm93biwgYXMgdGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuXG4gICAqL1xuICByZWFkb25seSBkYXRhZG9nQWxlcnRUeXBlPzogRGF0YWRvZ0FsZXJ0VHlwZTtcbiAgLyoqXG4gICAqIE5vdGlmaWNhdGlvbiB0eXBlIGZvciB0aGUgYXV0by1nZW5lcmF0ZWQgdnVsbmVyYWJpbGl0eSBwaXBlbGluZSBtb25pdG9yLiBEZWZhdWx0cyB0byBzbGFjay5cbiAgICovXG4gIHJlYWRvbmx5IHZ1bG5lcmFiaWxpdHlOb3RpZmljYXRpb24/OiBJTm90aWZpY2F0aW9uO1xuICAvKipcbiAgICogQ29kZVBpcGVsaW5lIFBpcGVsaW5lVHlwZSAoVjEgb3IgVjIpLiBEZWZhdWx0cyB0byBWMS5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGVQaXBlbGluZVR5cGU/OiBjb2RlcGlwZWxpbmUuUGlwZWxpbmVUeXBlO1xufVxuXG4vKipcbiAqIFByb3ZpZGVyIGludGVyZmFjZSB0byBjcmVhdGUgdGhlIEFwcFN0YWNrIHdpdGhpbiB0aGUgc3BlY2lmaWMgc2NvcGVcbiAqXG4gKiBTaW1wbHkgcGxhY2UgdGhlIEFwcFN0YWNrIGNyZWF0aW9uIGludG8gdGhlIGNyZWF0ZS1tZXRob2Q6XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFVzZSBlLmcuIHdpdGhpbiBBcHBsaWNhdGlvblByb3BzIGFzIEpTT05PYmplY3Q6XG4gKiBcXHsgY3JlYXRlOiAoY29uc3RydWN0LCBwcm9wcykgPVxcPiBuZXcgU3RhY2soY29uc3RydWN0LCAnQXBwU3RhY2snLCBwcm9wcykgXFx9XG4gKlxuICogLy8gb3Igc2ltcGx5IGFzIGNsYXNzIGludGVyZmFjZSB3aXRoaW4geW91ciBzdGFjayBpbXBsZW1lbnRhdGlvbjpcbiAqIGNsYXNzIFBpcGVsaW5lU3RhZ2UgZXh0ZW5kcyBTdGFnZSBpbXBsZW1lbnRzIElBcHBTdGFja0ZhY3RvcnkgXFx7XG4gKiAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTdGFnZVByb3BzKSBcXHtcbiAqICAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAqICAgICAvLyB5b3VyIHN0YWdlIGRlZmluaXRpb25cbiAqICAgXFx9XG4gKlxuICogICBjcmVhdGUoc2NvcGU6IENvbnN0cnVjdCwgcHJvcHM6IEFwcFN0YWNrUHJvcHMpOiB2b2lkIFxce1xuICogICAgIC8vIGFwcCBzdGFjayBpbml0aWF0aW9uIGdvZXMgaW4gaGVyZVxuICogICBcXH1cbiAqIFxcfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBcHBTdGFja0ZhY3Rvcnkge1xuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QsIGJlaW5nIGludm9rZWQgd2l0aCB0aGUgc3BlY2lmaWMgc2NvcGUgZHVyaW5nIHBpcGVsaW5lIGluc3RhbnRpYXRpb25cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gVGhlIHBhcmVudCBjb25zdHJ1Y3QgZm9yIHRoZSBhcHAgc3RhY2tcbiAgICogQHBhcmFtIHByb3BzIC0gVGhlIGFwcCBzdGFja3MgcHJvcGVydGllc1xuICAgKi9cbiAgY3JlYXRlKHNjb3BlOiBDb25zdHJ1Y3QsIHByb3BzOiBBcHBTdGFja1Byb3BzKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBTdGFja1Byb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZWxlY3RlZCBwcm9wZXJ0aWVzIGJlaW5nIGhhbmRlZCBvdmVyIHRvIFJpb1NlY3JldHNEZXBsb3lTdGVwLlxuICpcbiAqIEBzZWUgcmlvLlJpb1NlY3JldHNEZXBsb3lTdGVwXG4gKiBAc2VlIHJpby5SaW9TZWNyZXRzRGVwbG95U3RlcFByb3BzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTdGFja1Jpb1NlY3JldHNEZXBsb3lTdGVwUHJvcHMge1xuICByZWFkb25seSBzZWNyZXRzRmlsZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVN0YWNrUmlvTW9uaXRvcmluZ0RlcGxveVN0ZXBQcm9wcyB7XG4gIC8qKlxuICAgKiBNYXAgXFx7ZGlyZWN0b3J5OiBmaWxlbmFtZXNcXH0gY29udGFpbmluZyAgLmphciBvciAuemlwIGZpbGVzIGNyZWF0ZWQgaW4gbWFpbiBidWlsZCBzdGVwIHRvIGJlIHVwbG9hZGVkIHRvIHRoZSBtb25pdG9yaW5nLXRlc3RzdWl0ZS1ydW5uZXIgYnVja2V0LCBlLmcuXG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAnYXZhaWxhYmlsaXR5LW1vbml0b3JpbmcvYnVpbGQvbGlicyc6IFsnZm9vLWF2YWlsYWJpbGl0eS5qYXInXSxcbiAgICogICdwZXJmb3JtYW5jZS1tb25pdG9yaW5nL2J1aWxkL2xpYnMnOiBbJ2FwaS1jaGVjay56aXAnLCAnZm9vLXBlcmZvcm1hbmNlLmphciddLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgbW9uaXRvcmluZ0FydGlmYWN0czogeyBbZGlyZWN0b3J5OiBzdHJpbmddOiBzdHJpbmdbXSB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lRmVhdHVyZXMge1xuICAvKipcbiAgICogQ3JlYXRlIGEgYnJhbmNoIHBpcGVsaW5lIHVzZWQgYnkgcmVub3ZhdGUuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IGJyYW5jaFBpcGVsaW5lPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZ1bG5lcmFiaWxpdHkgcGlwZWxpbmUgdG8gc2NhbiBkZXBlbmRlbmNpZXMgZm9yIHZ1bG5lcmFiaWxpdGllcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgdnVsbmVyYWJpbGl0eVBpcGVsaW5lPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJ1biBhIHN0YW5kYXJkIGdyYWRsZSBidWlsZCBpbiB0aGUgcmVwb3NpdG9yeSByb290LiBEZWZhdWx0cyB0byBgZmFsc2VgOlxuICAgKiAtIGJ1aWxkIGFuZCB0ZXN0IG9mIHRoZSBhcnRpZmFjdCB2aWEgY29tbWFuZCBcIi4vZ3JhZGxldyBjbGVhbiBidWlsZFwiXG4gICAqIC0gbGljZW5zZS1jaGVjayBhbmQgdXBsb2FkIG9mIGxpY2Vuc2UtY2hlY2stZmlsZSB1c2luZyBAcmlvLWNsb3VkL3Jpby1saWNlbnNlLWNoZWNrZXIuXG4gICAqIC0gY3JlYXRlIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgdG8gbWFrZSBUTFMgY29tbXVuaWNhdGlvbiBwb3NzaWJsZSwgZS5nLiB3aXRoIGEgbG9hZGJhbGFuY2VyXG4gICAqIC0gYnVpbGQgdGhlIGNvbnRhaW5lciBpbWFnZSB2aWEgY29tbWFuZCBcIi4vZ3JhZGxldyBqaWJCdWlsZFRhclwiXG4gICAqL1xuICByZWFkb25seSBncmFkbGVCdWlsZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSdW4gYSBzdGFuZGFyZCBucG0gYnVpbGQgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdC4gRGVmYXVsdHMgdG8gYGZhbHNlYDpcbiAgICogLSBydW4gbGludGVyIHZpYSBjb21tYW5kIFwibnBtIHJ1biBsaW50XCJcbiAgICogLSBydW4gdGVzdHMgdmlhIGNvbW1hbmQgXCJucG0gcnVuIHRlc3Q6Y2lcIlxuICAgKiAtIHJ1biBhIGxpY2Vuc2UgY2hlY2sgYnkgY2FsbGluZyB0aGUgc2NyaXB0IFwiY2hlY2stb3NzLWxpY2Vuc2VzLnNoXCIgKGZyb20gdGhlIFJJTyBmcm9udGVuZCB0ZW1wbGF0ZSlcbiAgICogLSBidWlsZCB0aGUgYXJ0aWZhY3QgdmlhIGNvbW1hbmQgXCJucG0gcnVuIGJ1aWxkXCJcbiAgICovXG4gIHJlYWRvbmx5IG5wbUJ1aWxkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFkZCByZXF1aXJlZCBzdGVwcyBhbmQgcGVybWlzc2lvbnMgdG8gc3VwcG9ydCBLYWZrYS4gQ3VycmVudGx5LCB0aGlzIHJlcXVpcmVzIGBncmFkbGVCdWlsZGAgdG8gYmUgc2V0IHRvIGB0cnVlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IGthZmthSW50ZWdyYXRpb24/OiBib29sZWFuO1xuICAvKipcbiAgICogUzMgQnVja2V0IHRvIGRlcGxveSBmcm9udGVuZCB0by4gUmVxdWlyZXMgYG5wbUJ1aWxkYCB0byBiZSBzZXQgdG8gYHRydWVgLiBJZiBzZXQsIHRoZSBvdXRwdXQgb2YgdGhlIG5wbSBidWlsZCBpcyBkZXBsb3llZCB0byB0aGUgcHJvdmlkZWQgYnVja2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbnRlbmRCdWNrZXROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBidWlsZCBjb21tYW5kcyBmb3IgbWFpbiBhbmQgYnJhbmNoIHBpcGVsaW5lLiBXaWxsIGJlIGFkZGVkIGFmdGVyIGFsbCBidWlsZCAmIHRlc3QgY29tbWFuZHMsIGJlZm9yZSB0aGUgaW5mcmFzdHJ1Y3R1cmUgYnVpbGQuIERvZXMgbm90IHdvcmsgd2l0aCBwYXJ0aWFsQnVpbGRzcGVjLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEJ1aWxkQ29tbWFuZHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIElmIHNldCB0byBmYWxzZSwgbm8gRGF0YWRvZyBtb25pdG9ycyBmb3IgbWFpbiBhbmQgdnVsbmVyYWJpbGl0eSBwaXBlbGluZXMgd2lsbCBiZSBjcmVhdGVkLiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlUGlwZWxpbmVNb25pdG9ycz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBlbnVtIFBpcGVsaW5lVHlwZSB7XG4gIC8qKlxuICAgKiBTZWxmLW11dGF0aW5nIGNvZGVwaXBlbGluZSBkZXBsb3lpbmcgdGhlIHByb3ZpZGVkIEFwcFN0YWNrLiBCZSBhd2FyZTogVGhlIHByb3ZpZGVkIHNlcnZpY2Ugd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gS2Fma2EuXG4gICAqXG4gICAqIENvbWVzIHdpdGggYSBwcmUtZGVmaW5lZCBidWlsZHNwZWMueWFtbCBmb3IgYSBncmFkbGUgcHJvamVjdC4gVGhpcyBidWlsZHNwZWMueWFtbCBpcyB1c2VkIGZvciBib3RoIHRoZSBtYWluIGFuZFxuICAgKiBicmFuY2ggcGlwZWxpbmUgYW5kIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgc3RlcHNcbiAgICogLSBidWlsZCBhbmQgdGVzdCBvZiB0aGUgYXJ0aWZhY3QgdmlhIGNvbW1hbmQgXCIuL2dyYWRsZXcgY2xlYW4gYnVpbGRcIi5cbiAgICogPHA+IFRoaXMgZ3JhZGxlIGNvbW1hbmQgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgZ3JhZGxlIHByb2plY3QuXG4gICAqIC0gbGljZW5zZS1jaGVjayBhbmQgdXBsb2FkIG9mIGxpY2Vuc2UtY2hlY2stZmlsZSB1c2luZyBAcmlvLWNsb3VkL3Jpby1saWNlbnNlLWNoZWNrZXIuXG4gICAqIDxwPiBUaGlzIGdyYWRsZSBjb21tYW5kIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGdyYWRsZSBwcm9qZWN0LlxuICAgKiAtIGNyZWF0ZSBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIHRvIG1ha2UgVExTIGNvbW11bmljYXRpb24gcG9zc2libGUsIGUuZy4gd2l0aCBhIGxvYWRiYWxhbmNlci5cbiAgICogLSBidWlsZCB0aGUgY29udGFpbmVyIGltYWdlIHZpYSBjb21tYW5kIFwiLi9ncmFkbGV3IGppYkJ1aWxkVGFyXCIuXG4gICAqIDxwPiBUaGlzIGdyYWRsZSBjb21tYW5kIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGdyYWRsZSBwcm9qZWN0LlxuICAgKi9cbiAgU1RBTkRBUkRfR1JBRExFID0gJ1NUQU5EQVJEX0dSQURMRScsXG4gIC8qKlxuICAgKiBTZWxmLW11dGF0aW5nIGNvZGVwaXBlbGluZSBkZXBsb3lpbmcgdGhlIHByb3ZpZGVkIEFwcFN0YWNrIHdpdGggYWRkaXRpb25hbCBzdGVwcyBuZWVkZWQgdG8gYWNjZXNzIEthZmthLlxuICAgKlxuICAgKiBDb21lcyB3aXRoIGEgcHJlLWRlZmluZWQgYnVpbGRzcGVjLnlhbWwgZm9yIGEgZ3JhZGxlIHByb2plY3QuIFRoaXMgYnVpbGRzcGVjLnlhbWwgaXMgdXNlZCBmb3IgYm90aCB0aGUgbWFpbiBhbmRcbiAgICogYnJhbmNoIHBpcGVsaW5lIGFuZCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHN0ZXBzXG4gICAqIC0gYnVpbGQgYW5kIHRlc3Qgb2YgdGhlIGFydGlmYWN0IHZpYSBjb21tYW5kIFwiLi9ncmFkbGV3IGNsZWFuIGJ1aWxkXCIuXG4gICAqIDxwPiBUaGlzIGdyYWRsZSBjb21tYW5kIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGdyYWRsZSBwcm9qZWN0LlxuICAgKiAtIGxpY2Vuc2UtY2hlY2sgYW5kIHVwbG9hZCBvZiBsaWNlbnNlLWNoZWNrLWZpbGUgdXNpbmcgQHJpby1jbG91ZC9yaW8tbGljZW5zZS1jaGVja2VyLlxuICAgKiA8cD4gVGhpcyBncmFkbGUgY29tbWFuZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBncmFkbGUgcHJvamVjdC5cbiAgICogLSBjcmVhdGUgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSB0byBtYWtlIFRMUyBjb21tdW5pY2F0aW9uIHBvc3NpYmxlLCBlLmcuIHdpdGggYSBsb2FkYmFsYW5jZXIuXG4gICAqIC0gcmVxdWVzdCBhIGNlcnRpZmljYXRlIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbnN0IEthZmthIHZpYSBtdXR1YWwgVExTXG4gICAqIC0gYnVpbGQgdGhlIGNvbnRhaW5lciBpbWFnZSB2aWEgY29tbWFuZCBcIi4vZ3JhZGxldyBqaWJCdWlsZFRhclwiLlxuICAgKiA8cD4gVGhpcyBncmFkbGUgY29tbWFuZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBncmFkbGUgcHJvamVjdC5cbiAgICovXG4gIFNUQU5EQVJEX0dSQURMRV9LQUZLQSA9ICdTVEFOREFSRF9HUkFETEVfS0FGS0EnLFxuICAvKipcbiAgICogU2VsZi1tdXRhdGluZyBjb2RlcGlwZWxpbmUgZGVwbG95aW5nIHRoZSBwcm92aWRlZCBBcHBTdGFjay5cbiAgICpcbiAgICogQ29tZXMgd2l0aCBhIHByZS1kZWZpbmVkIGJ1aWxkc3BlYy55YW1sIHRvIHN5bnRoZXNpemUgdGhlIEFwcFN0YWNrLlxuICAgKiBObyBicmFuY2ggb3IgdnVsbmVyYWJpbGl0eSBwaXBlbGluZSBpcyBjcmVhdGVkLlxuICAgKi9cbiAgU1RBTkRBUkRfSU5GUkFTVFJVQ1RVUkUgPSAnU1RBTkRBUkRfSU5GUkFTVFJVQ1RVUkUnLFxufVxuXG4vKipcbiAqIEBwYXJhbSBwYXJ0aWFsQnVpbGRTcGVjUGF0aCAtIFBhdGggdG8gYSBjdXN0b20gYnVpbGQtc3BlYyBmaWxlIHRvIHVzZSBmb3IgdGhlIG1haW4gYW5kIGJyYW5jaCBwaXBlbGluZS5cbiAqIEEgcHJlLWRlZmluZWQgYnVpbGRzcGVjLnlhbWwgZml0dGluZyB0aGUgcGlwZWxpbmVUeXBlIGlzIHVzZWQgaWYgbm90IHByb3ZpZGVkLlxuICogQHBhcmFtIHZ1bG5lcmFiaWxpdHlQYXJ0aWFsQnVpbGRTcGVjUGF0aCAtIFBhdGggdG8gYSBjdXN0b20gYnVpbGQtc3BlYyBmaWxlIHRvIHVzZSBmb3IgdGhlIHZ1bG5lcmFiaWxpdHkgcGlwZWxpbmUuXG4gKiBBIHByZS1kZWZpbmVkIHZ1bG5lcmFiaWxpdHkgYnVpbGRzcGVjLnlhbWwgZml0dGluZyB0aGUgcGlwZWxpbmVUeXBlIGlzIHVzZWQgaWYgbm90IHByb3ZpZGVkLlxuICogQHBhcmFtIGJ1aWxkRW52aXJvbm1lbnQgLSBDdXN0b20gQ29kZUJ1aWxkIGJ1aWxkIGVudmlyb25tZW50IG92ZXJyaWRpbmcgdGhlIHJpby1zcGVjaWZpYyBkZWZhdWx0cy4gVGhlIGRlZmF1bHRzIGFyZTpcbiAqICAgICAgICAgIGJ1aWxkSW1hZ2U6IEFNQVpPTl9MSU5VWF8yXzVcbiAqICAgICAgICAgIGNvbXB1dGVUeXBlOiBMQVJHRVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCdWlsZE9wdGlvbnMge1xuICByZWFkb25seSBwYXJ0aWFsQnVpbGRTcGVjUGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgdnVsbmVyYWJpbGl0eVBhcnRpYWxCdWlsZFNwZWNQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBidWlsZEVudmlyb25tZW50PzogQnVpbGRFbnZpcm9ubWVudDtcbn1cblxuZXhwb3J0IGNsYXNzIFBpcGVsaW5lU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZlYXR1cmVzOiBQaXBlbGluZUZlYXR1cmVzO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYWluQ29kZUJ1aWxkUHJvamVjdDogQ29kZUJ1aWxkU3RlcDtcbiAgcHJpdmF0ZSByZWFkb25seSBfYnJhbmNoQ29kZUJ1aWxkUHJvamVjdDogQ29kZUJ1aWxkU3RlcCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBfdnVsbmVyYWJpbGl0eUNvZGVCdWlsZFByb2plY3Q6IENvZGVCdWlsZFN0ZXAgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1Y2tldDogSUJ1Y2tldDtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2FjaGVCdWNrZXQ6IElCdWNrZXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3RlZFpvbmU6IElIb3N0ZWRab25lO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbnB1dE1hc3RlclRyaWdnZXJGaWxlOiBDb2RlUGlwZWxpbmVTb3VyY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2lucHV0QnJhbmNoVHJpZ2dlckZpbGU6IENvZGVQaXBlbGluZVNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfb3NzTGljZW5zZXNCdWNrZXRQYXJhbWV0ZXI6IElTdHJpbmdQYXJhbWV0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29zc0xpY2Vuc2VzQnVja2V0OiBJQnVja2V0O1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZXJ2aWNlS2V5c3RvcmVQYXNzd29yZDogSVN0cmluZ1BhcmFtZXRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWNjb3VudE5hbWVQYXJhbWV0ZXI6IElTdHJpbmdQYXJhbWV0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3RlYW1JZGVudGlmaWVyUGFyYW1ldGVyOiBJU3RyaW5nUGFyYW1ldGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9uaXN0RGF0YU1pcnJvclVybDogSVN0cmluZ1BhcmFtZXRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29kZVBpcGVsaW5lVHlwZTogY29kZXBpcGVsaW5lLlBpcGVsaW5lVHlwZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLl9mZWF0dXJlcyA9IHRoaXMucGFyc2VGZWF0dXJlcyhwcm9wcyk7XG5cbiAgICAvLyBwb3B1bGF0ZSBleHRlcm5hbCBwYXJhbWV0ZXJzXG4gICAgdGhpcy5fYnVja2V0ID0gczMuQnVja2V0LmZyb21CdWNrZXROYW1lKHRoaXMsICdUcmlnZ2VyQnVja2V0JywgRm4uaW1wb3J0VmFsdWUoJ2JpdGJ1Y2tldC1pbnRlZ3JhdGlvbi1zMy1idWNrZXQnKSk7XG4gICAgdGhpcy5fY2FjaGVCdWNrZXQgPSBuZXcgczMuQnVja2V0KHRoaXMsICdDYWNoZUJ1Y2tldCcsIHtcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgbGlmZWN5Y2xlUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4cGlyYXRpb246IER1cmF0aW9uLmRheXMoMzApLFxuICAgICAgICAgIGFib3J0SW5jb21wbGV0ZU11bHRpcGFydFVwbG9hZEFmdGVyOiBEdXJhdGlvbi5kYXlzKDcpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICB0aGlzLl9ob3N0ZWRab25lID0gcmlvLlJpb0xhbmRpbmdab25lLmdldERlZmF1bHRIb3N0ZWRab25lKHRoaXMpO1xuICAgIHRoaXMuX2lucHV0TWFzdGVyVHJpZ2dlckZpbGUgPSBwaXBlbGluZXMuQ29kZVBpcGVsaW5lU291cmNlLnMzKFxuICAgICAgdGhpcy5fYnVja2V0LFxuICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9L3RyaWdnZXIvJHtyaW8uVHJpZ2dlcktleS5NQVNURVJfUkVQT31gLFxuICAgICAgeyB0cmlnZ2VyOiBjb2RlcGlwZWxpbmVfYWN0aW9ucy5TM1RyaWdnZXIuRVZFTlRTIH1cbiAgICApO1xuICAgIHRoaXMuX2lucHV0QnJhbmNoVHJpZ2dlckZpbGUgPSBwaXBlbGluZXMuQ29kZVBpcGVsaW5lU291cmNlLnMzKFxuICAgICAgdGhpcy5fYnVja2V0LFxuICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9L3RyaWdnZXIvJHtyaW8uVHJpZ2dlcktleS5CUkFOQ0hfUkVQT31gLFxuICAgICAgeyB0cmlnZ2VyOiBjb2RlcGlwZWxpbmVfYWN0aW9ucy5TM1RyaWdnZXIuRVZFTlRTIH1cbiAgICApO1xuXG4gICAgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXRQYXJhbWV0ZXIgPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzKFxuICAgICAgdGhpcyxcbiAgICAgICdPc3NMaWNlbnNlc0J1Y2tldFBhcmFtZXRlcicsXG4gICAgICB7IHBhcmFtZXRlck5hbWU6ICcvY29uZmlnL29zcy1saWNlbnNlcy9idWNrZXQtbmFtZScgfVxuICAgICk7XG4gICAgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXQgPSBzMy5CdWNrZXQuZnJvbUJ1Y2tldE5hbWUoXG4gICAgICB0aGlzLFxuICAgICAgJ09zc0xpY2Vuc2VzQnVja2V0JyxcbiAgICAgIHRoaXMuX29zc0xpY2Vuc2VzQnVja2V0UGFyYW1ldGVyLnN0cmluZ1ZhbHVlXG4gICAgKTtcbiAgICB0aGlzLl9zZXJ2aWNlS2V5c3RvcmVQYXNzd29yZCA9IHNzbS5TdHJpbmdQYXJhbWV0ZXIuZnJvbVNlY3VyZVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXModGhpcywgJ0tleXN0b3JlUGFzc3dvcmQnLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiBgL2NvbmZpZy8ke3Byb3BzLnNlcnZpY2VOYW1lfS9zZXJ2aWNlLWtleXN0b3JlLXBhc3N3b3JkYCxcbiAgICAgIHZlcnNpb246IDEsXG4gICAgfSk7XG4gICAgdGhpcy5fYWNjb3VudE5hbWVQYXJhbWV0ZXIgPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJOYW1lKFxuICAgICAgdGhpcyxcbiAgICAgICdBY2NvdW50TmFtZVBhcmFtZXRlcicsXG4gICAgICAnL2NvbmZpZy9hY2NvdW50L25hbWUnXG4gICAgKTtcbiAgICB0aGlzLl90ZWFtSWRlbnRpZmllclBhcmFtZXRlciA9IHNzbS5TdHJpbmdQYXJhbWV0ZXIuZnJvbVN0cmluZ1BhcmFtZXRlck5hbWUoXG4gICAgICB0aGlzLFxuICAgICAgJ1RlYW1JZGVudGlmaWVyUGFyYW1ldGVyJyxcbiAgICAgICcvY29uZmlnL3RlYW0vaWRlbnRpZmllcidcbiAgICApO1xuICAgIHRoaXMuX25pc3REYXRhTWlycm9yVXJsID0gc3NtLlN0cmluZ1BhcmFtZXRlci5mcm9tU2VjdXJlU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyh0aGlzLCAnTmlzdERhdGFNaXJyb3JVcmwnLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiAnL2NvbmZpZy9uaXN0LWRhdGEtbWlycm9yL3VybCcsXG4gICAgICB2ZXJzaW9uOiAxLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29kZVBpcGVsaW5lVHlwZSA9IHByb3BzLmNvZGVQaXBlbGluZVR5cGUgPz8gY29kZXBpcGVsaW5lLlBpcGVsaW5lVHlwZS5WMTtcblxuICAgIHRoaXMuX21haW5Db2RlQnVpbGRQcm9qZWN0ID0gdGhpcy5jcmVhdGVNYWluQ29kZUJ1aWxkUHJvamVjdChwcm9wcyk7XG4gICAgdGhpcy5hZGRNYWluUGlwZWxpbmUodGhpcy5fbWFpbkNvZGVCdWlsZFByb2plY3QsIHByb3BzKTtcblxuICAgIGlmICh0aGlzLl9mZWF0dXJlcy5icmFuY2hQaXBlbGluZSkge1xuICAgICAgdGhpcy5fYnJhbmNoQ29kZUJ1aWxkUHJvamVjdCA9IHRoaXMuY3JlYXRlQnJhbmNoQ29kZUJ1aWxkUHJvamVjdChwcm9wcyk7XG4gICAgICB0aGlzLmFkZEJyYW5jaFBpcGVsaW5lKHRoaXMuX2JyYW5jaENvZGVCdWlsZFByb2plY3QpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZmVhdHVyZXMudnVsbmVyYWJpbGl0eVBpcGVsaW5lKSB7XG4gICAgICB0aGlzLl92dWxuZXJhYmlsaXR5Q29kZUJ1aWxkUHJvamVjdCA9IHRoaXMuY3JlYXRlVnVsbmVyYWJpbGl0eUJ1aWxkUHJvamVjdChwcm9wcyk7XG4gICAgICB0aGlzLmFkZFZ1bG5lcmFiaWxpdHlQaXBlbGluZSh0aGlzLl92dWxuZXJhYmlsaXR5Q29kZUJ1aWxkUHJvamVjdCwgcHJvcHMpO1xuICAgIH1cblxuICAgIGNvbnN0IFtmZWF0dXJlLCBwYWNrYWdlTmFtZV0gPSBfX2Rpcm5hbWUuc3BsaXQocGF0aC5zZXApLnJldmVyc2UoKTtcbiAgICBuZXcgQ2xhaWRvbWV0ZXIodGhpcywgJ0NsYWlkb21ldGVyJywge1xuICAgICAgcHJvZHVjdDogQ2xhaWRvbWV0ZXJQcm9kdWN0LkNES19DT05UUklCVVRJT04sXG4gICAgICBwYWNrYWdlTmFtZSxcbiAgICAgIGZlYXR1cmUsXG4gICAgICB2ZXJzaW9uOiAnMS41LjAnLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBtYWluQ29kZWJ1aWxkUHJvamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFpbkNvZGVCdWlsZFByb2plY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJyYW5jaENvZGVCdWlsZFByb2plY3QoKTogQ29kZUJ1aWxkU3RlcCB7XG4gICAgaWYgKHRoaXMuX2JyYW5jaENvZGVCdWlsZFByb2plY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1RoZSBwaXBlbGluZSB0eXBlIHlvdSBoYXZlIHNlbGVjdGVkIGRvZXMgbm90IHN1cHBvcnQgYSBicmFuY2ggY29kZWJ1aWxkIHByb2plY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2JyYW5jaENvZGVCdWlsZFByb2plY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZ1bG5lcmFiaWxpdHlDb2RlQnVpbGRQcm9qZWN0KCk6IENvZGVCdWlsZFN0ZXAge1xuICAgIGlmICh0aGlzLl92dWxuZXJhYmlsaXR5Q29kZUJ1aWxkUHJvamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignVGhlIHBpcGVsaW5lIHR5cGUgeW91IGhhdmUgc2VsZWN0ZWQgZG9lcyBub3Qgc3VwcG9ydCBhIHZ1bG5lcmFiaWxpdHkgY29kZWJ1aWxkIHByb2plY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Z1bG5lcmFiaWxpdHlDb2RlQnVpbGRQcm9qZWN0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUZlYXR1cmVzKHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpOiBQaXBlbGluZUZlYXR1cmVzIHtcbiAgICBpZiAocHJvcHMucGlwZWxpbmVUeXBlICYmIHByb3BzLmZlYXR1cmVzKSB7XG4gICAgICB0aHJvdyBFcnJvcignWW91IGNhbm5vdCBwcm92aWRlIGJvdGggYSBwaXBlbGluZVR5cGUgYW5kIGZlYXR1cmVzLiBQbGVhc2UgdXNlIGZlYXR1cmVzIG9ubHkuJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5mZWF0dXJlcz8ua2Fma2FJbnRlZ3JhdGlvbiAmJiAhcHJvcHMuZmVhdHVyZXM/LmdyYWRsZUJ1aWxkKSB7XG4gICAgICB0aHJvdyBFcnJvcignS2Fma2EgaW50ZWdyYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIHBpcGVsaW5lcyB3aXRoIGdyYWRsZSBidWlsZCcpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZmVhdHVyZXM/LmZyb250ZW5kQnVja2V0TmFtZSAmJiAhcHJvcHMuZmVhdHVyZXM/Lm5wbUJ1aWxkKSB7XG4gICAgICB0aHJvdyBFcnJvcignRnJvbnRlbmQgYnVja2V0IG5hbWUgY2FuIG9ubHkgYmUgc2V0IHdoZW4gbnBtIGJ1aWxkIGlzIGVuYWJsZWQnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmZlYXR1cmVzPy5hZGRpdGlvbmFsQnVpbGRDb21tYW5kcyAmJiBwcm9wcy5jb2RlQnVpbGRPcHRpb25zPy5wYXJ0aWFsQnVpbGRTcGVjUGF0aCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1lvdSBjYW5ub3QgcHJvdmlkZSBhZGRpdGlvbmFsQnVpbGRDb21tYW5kcyBpZiB5b3UgdXNlIGEgcGFydGlhbEJ1aWxkU3BlY1BhdGguJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5mZWF0dXJlcyAmJiBwcm9wcy5jb2RlQnVpbGRPcHRpb25zPy5wYXJ0aWFsQnVpbGRTcGVjUGF0aCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcGlwZWxpbmUgZmVhdHVyZXMgaW4gY29tYmluYXRpb24gd2l0aCBhIHBhcnRpYWxCdWlsZFNwZWNQYXRoLiBQbGVhc2Uga2VlcCBpbiBtaW5kLCB0aGF0IGFsbCBidWlsZHNwZWMgcmVsYXRlZCBmZWF0dXJlcyBhcmUgaWdub3JlZCBhbmQgdGhlIHBhcnRpYWxCdWlsZFNwZWMgaXMgYXBwbGllZC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMucGlwZWxpbmVUeXBlKSB7XG4gICAgICBzd2l0Y2ggKHByb3BzLnBpcGVsaW5lVHlwZSkge1xuICAgICAgICBjYXNlIFBpcGVsaW5lVHlwZS5TVEFOREFSRF9HUkFETEU6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJyYW5jaFBpcGVsaW5lOiB0cnVlLFxuICAgICAgICAgICAgdnVsbmVyYWJpbGl0eVBpcGVsaW5lOiB0cnVlLFxuICAgICAgICAgICAgZ3JhZGxlQnVpbGQ6IHRydWUsXG4gICAgICAgICAgICBucG1CdWlsZDogZmFsc2UsXG4gICAgICAgICAgICBrYWZrYUludGVncmF0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIGVuYWJsZVBpcGVsaW5lTW9uaXRvcnM6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBQaXBlbGluZVR5cGUuU1RBTkRBUkRfR1JBRExFX0tBRktBOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBicmFuY2hQaXBlbGluZTogdHJ1ZSxcbiAgICAgICAgICAgIHZ1bG5lcmFiaWxpdHlQaXBlbGluZTogdHJ1ZSxcbiAgICAgICAgICAgIGdyYWRsZUJ1aWxkOiB0cnVlLFxuICAgICAgICAgICAgbnBtQnVpbGQ6IGZhbHNlLFxuICAgICAgICAgICAga2Fma2FJbnRlZ3JhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIGVuYWJsZVBpcGVsaW5lTW9uaXRvcnM6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBQaXBlbGluZVR5cGUuU1RBTkRBUkRfSU5GUkFTVFJVQ1RVUkU6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJyYW5jaFBpcGVsaW5lOiBmYWxzZSxcbiAgICAgICAgICAgIHZ1bG5lcmFiaWxpdHlQaXBlbGluZTogZmFsc2UsXG4gICAgICAgICAgICBncmFkbGVCdWlsZDogZmFsc2UsXG4gICAgICAgICAgICBucG1CdWlsZDogZmFsc2UsXG4gICAgICAgICAgICBrYWZrYUludGVncmF0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIGVuYWJsZVBpcGVsaW5lTW9uaXRvcnM6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJyYW5jaFBpcGVsaW5lOiBwcm9wcy5mZWF0dXJlcz8uYnJhbmNoUGlwZWxpbmUgPz8gdHJ1ZSxcbiAgICAgIHZ1bG5lcmFiaWxpdHlQaXBlbGluZTogcHJvcHMuZmVhdHVyZXM/LnZ1bG5lcmFiaWxpdHlQaXBlbGluZSA/PyB0cnVlLFxuICAgICAgZ3JhZGxlQnVpbGQ6IHByb3BzLmZlYXR1cmVzPy5ncmFkbGVCdWlsZCA/PyBmYWxzZSxcbiAgICAgIG5wbUJ1aWxkOiBwcm9wcy5mZWF0dXJlcz8ubnBtQnVpbGQgPz8gZmFsc2UsXG4gICAgICBrYWZrYUludGVncmF0aW9uOiBwcm9wcy5mZWF0dXJlcz8ua2Fma2FJbnRlZ3JhdGlvbiA/PyBmYWxzZSxcbiAgICAgIGZyb250ZW5kQnVja2V0TmFtZTogcHJvcHMuZmVhdHVyZXM/LmZyb250ZW5kQnVja2V0TmFtZSxcbiAgICAgIGFkZGl0aW9uYWxCdWlsZENvbW1hbmRzOiBwcm9wcy5mZWF0dXJlcz8uYWRkaXRpb25hbEJ1aWxkQ29tbWFuZHMsXG4gICAgICBlbmFibGVQaXBlbGluZU1vbml0b3JzOiBwcm9wcy5mZWF0dXJlcz8uZW5hYmxlUGlwZWxpbmVNb25pdG9ycyA/PyB0cnVlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJpb0NvZGVCdWlsZFByb2plY3QoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNka091dHB1dERpcmVjdG9yeTogc3RyaW5nLFxuICAgIHRyaWdnZXJGaWxlOiBDb2RlUGlwZWxpbmVTb3VyY2UsXG4gICAgYnVpbGRTcGVjOiBCdWlsZFNwZWMsXG4gICAgcHJvcHM6IFBpcGVsaW5lU3RhY2tQcm9wc1xuICApIHtcbiAgICByZXR1cm4gbmV3IFJpb0NvZGVCdWlsZFByb2plY3QodGhpcywgbmFtZSwge1xuICAgICAgaW5wdXQ6IHRyaWdnZXJGaWxlLFxuICAgICAgY2RrT3V0RGlyZWN0b3J5OiBjZGtPdXRwdXREaXJlY3RvcnksXG4gICAgICBwYXJ0aWFsQnVpbGRTcGVjOiBidWlsZFNwZWMsXG4gICAgICBidWlsZEVudmlyb25tZW50OiBwcm9wcz8uY29kZUJ1aWxkT3B0aW9ucz8uYnVpbGRFbnZpcm9ubWVudCxcbiAgICAgIGhvc3RlZFpvbmVOYW1lOiB0aGlzLl9ob3N0ZWRab25lLnpvbmVOYW1lLFxuICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgICAgY2FjaGVCdWNrZXQ6IHRoaXMuX2NhY2hlQnVja2V0LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNYWluQ29kZUJ1aWxkUHJvamVjdChwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzKSB7XG4gICAgY29uc3QgYnVpbGRTcGVjID1cbiAgICAgIHRoaXMubG9hZEJ1aWxkU3BlY0Zyb21GaWxlKHByb3BzPy5jb2RlQnVpbGRPcHRpb25zPy5wYXJ0aWFsQnVpbGRTcGVjUGF0aCkgfHwgY3JlYXRlTWFpbkJ1aWxkU3BlYyh0aGlzLl9mZWF0dXJlcyk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUmlvQ29kZUJ1aWxkUHJvamVjdChcbiAgICAgICdNYWluQnVpbGQnLFxuICAgICAgJ2luZnJhc3RydWN0dXJlL2Nkay5vdXQnLFxuICAgICAgdGhpcy5faW5wdXRNYXN0ZXJUcmlnZ2VyRmlsZSxcbiAgICAgIGJ1aWxkU3BlYyxcbiAgICAgIHByb3BzXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnJhbmNoQ29kZUJ1aWxkUHJvamVjdChwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzKSB7XG4gICAgY29uc3QgYnVpbGRTcGVjID1cbiAgICAgIHRoaXMubG9hZEJ1aWxkU3BlY0Zyb21GaWxlKHByb3BzPy5jb2RlQnVpbGRPcHRpb25zPy5wYXJ0aWFsQnVpbGRTcGVjUGF0aCkgfHwgY3JlYXRlTWFpbkJ1aWxkU3BlYyh0aGlzLl9mZWF0dXJlcyk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUmlvQ29kZUJ1aWxkUHJvamVjdChcbiAgICAgICdCcmFuY2hCdWlsZCcsXG4gICAgICAnaW5mcmFzdHJ1Y3R1cmUvY2RrLm91dCcsXG4gICAgICB0aGlzLl9pbnB1dEJyYW5jaFRyaWdnZXJGaWxlLFxuICAgICAgYnVpbGRTcGVjLFxuICAgICAgcHJvcHNcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWdWxuZXJhYmlsaXR5QnVpbGRQcm9qZWN0KHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpIHtcbiAgICBjb25zdCBidWlsZFNwZWMgPVxuICAgICAgdGhpcy5sb2FkQnVpbGRTcGVjRnJvbUZpbGUocHJvcHM/LmNvZGVCdWlsZE9wdGlvbnM/LnZ1bG5lcmFiaWxpdHlQYXJ0aWFsQnVpbGRTcGVjUGF0aCkgfHxcbiAgICAgIGNyZWF0ZVZ1bG5lcmFiaWxpdHlCdWlsZFNwZWModGhpcy5fZmVhdHVyZXMpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVJpb0NvZGVCdWlsZFByb2plY3QoJ1Z1bG5lcmFiaWxpdHlDaGVja3MnLCAnLi8nLCB0aGlzLl9pbnB1dE1hc3RlclRyaWdnZXJGaWxlLCBidWlsZFNwZWMsIHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTWFpblBpcGVsaW5lKG1haW5CdWlsZDogQ29kZUJ1aWxkU3RlcCwgcHJvcHM6IFBpcGVsaW5lU3RhY2tQcm9wcykge1xuICAgIGNvbnN0IHBpcGVsaW5lID0gbmV3IGNvZGVwaXBlbGluZS5QaXBlbGluZSh0aGlzLCAnUGlwZWxpbmUnLCB7XG4gICAgICBhcnRpZmFjdEJ1Y2tldDogdGhpcy5fY2FjaGVCdWNrZXQsXG4gICAgICBwaXBlbGluZVR5cGU6IHRoaXMuX2NvZGVQaXBlbGluZVR5cGUsXG4gICAgICByZXN0YXJ0RXhlY3V0aW9uT25VcGRhdGU6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgY29kZVBpcGVsaW5lID0gbmV3IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmUocGlwZWxpbmUsICdDb2RlUGlwZWxpbmUnLCB7XG4gICAgICBjb2RlUGlwZWxpbmU6IHBpcGVsaW5lLFxuICAgICAgc3ludGg6IG1haW5CdWlsZCxcbiAgICAgIHNlbGZNdXRhdGlvbkNvZGVCdWlsZERlZmF1bHRzOiB7XG4gICAgICAgIGJ1aWxkRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBidWlsZEltYWdlOiBMaW51eExhbWJkYUJ1aWxkSW1hZ2UuQU1BWk9OX0xJTlVYXzIwMjNfTk9ERV8yMCxcbiAgICAgICAgICBjb21wdXRlVHlwZTogQ29tcHV0ZVR5cGUuTEFNQkRBXzFHQixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGFncy5vZihwaXBlbGluZSkuYWRkKCdwaXBlbGluZV90eXBlJywgJ2J1aWxkJyk7XG5cbiAgICBjb25zdCBzdHJpcEFzc2V0c1N0ZXAgPSB0aGlzLmNyZWF0ZVN0cmlwQXNzZXRzU3RlcChjb2RlUGlwZWxpbmUpO1xuICAgIGNvZGVQaXBlbGluZS5hZGRXYXZlKCdCZWZvcmVEZXBsb3knLCB7IHByZTogW3N0cmlwQXNzZXRzU3RlcF0gfSk7XG5cbiAgICBjb25zdCBjYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXAgPSB0aGlzLmNyZWF0ZUNhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcChtYWluQnVpbGQsIHByb3BzKTtcbiAgICBjb25zdCBzZWNyZXRzRGVwbG95U3RlcFByb3BzID0gdGhpcy5jcmVhdGVTZWNyZXRzRGVwbG95U3RlcChwcm9wcyk7XG4gICAgY29uc3QgZnJvbnRlbmREZXBsb3lTdGVwID0gdGhpcy5jcmVhdGVEZXBsb3lGcm9udGVuZERlcGxveVN0ZXAobWFpbkJ1aWxkKTtcbiAgICBjb25zdCBwb3N0U3RlcHMgPSBbXTtcbiAgICBpZiAoY2FwYWJpbGl0eU1vbml0b3JpbmdEZXBsb3lTdGVwKSB7XG4gICAgICBwb3N0U3RlcHMucHVzaChjYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXApO1xuICAgIH1cbiAgICBpZiAoZnJvbnRlbmREZXBsb3lTdGVwKSB7XG4gICAgICBwb3N0U3RlcHMucHVzaChmcm9udGVuZERlcGxveVN0ZXApO1xuICAgIH1cblxuICAgIGNvZGVQaXBlbGluZS5hZGRTdGFnZShcbiAgICAgIG5ldyBBcHBsaWNhdGlvbih0aGlzLCAnRGVwbG95QXBwbGljYXRpb25TdGFja3MnLCB7XG4gICAgICAgIGFwcFN0YWNrRmFjdG9yeTogcHJvcHMuYXBwU3RhY2tGYWN0b3J5LFxuICAgICAgICBzZXJ2aWNlTmFtZTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgICAgIHZlcnNpb246IHByb2Nlc3MuZW52LlBJUEVMSU5FX0VYRUNVVElPTl9JRCA/PyAnUElQRUxJTkVfRVhFQ1VUSU9OX0lEIG5vdCBzZXQnLFxuICAgICAgfSksXG4gICAgICB7XG4gICAgICAgIHByZTogc2VjcmV0c0RlcGxveVN0ZXBQcm9wcyA/IFtzZWNyZXRzRGVwbG95U3RlcFByb3BzXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcG9zdDogcG9zdFN0ZXBzLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb2RlUGlwZWxpbmUuYnVpbGRQaXBlbGluZSgpO1xuXG4gICAgdGhpcy50YWdDb2RlQnVpbGRQcm9qZWN0KHN0cmlwQXNzZXRzU3RlcCwgJ3Byb2plY3RfdHlwZScsICdzdHJpcF9hc3NldHMnKTtcbiAgICB0aGlzLnRhZ0NvZGVCdWlsZFByb2plY3Qoc2VjcmV0c0RlcGxveVN0ZXBQcm9wcywgJ3Byb2plY3RfdHlwZScsICdkZXBsb3lfc2VjcmV0cycpO1xuICAgIHRoaXMudGFnQ29kZUJ1aWxkUHJvamVjdChtYWluQnVpbGQsICdwcm9qZWN0X3R5cGUnLCAnYnVpbGQnKTtcbiAgICB0aGlzLnRhZ0NvZGVCdWlsZFByb2plY3QoY2FwYWJpbGl0eU1vbml0b3JpbmdEZXBsb3lTdGVwLCAncHJvamVjdF90eXBlJywgJ2RlcGxveV9jYXBhYmlsaXR5X21vbml0b3JpbmcnKTtcbiAgICB0aGlzLnRhZ0NvZGVCdWlsZFByb2plY3QoZnJvbnRlbmREZXBsb3lTdGVwLCAncHJvamVjdF90eXBlJywgJ2RlcGxveV9mcm9udGVuZCcpO1xuXG4gICAgaWYgKGNhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCkge1xuICAgICAgY29uc3QgbW9uaXRvcmluZ1Rlc3RzdWl0ZVJ1bm5lckJ1Y2tldCA9IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgJ01vbml0b3JpbmdUZXN0c3VpdGVSdW5uZXJCdWNrZXQnLFxuICAgICAgICBgbW9uaXRvcmluZy10ZXN0c3VpdGUtcnVubmVyLSR7dGhpcy5hY2NvdW50fWBcbiAgICAgICk7XG4gICAgICBtb25pdG9yaW5nVGVzdHN1aXRlUnVubmVyQnVja2V0LmdyYW50V3JpdGUoY2FwYWJpbGl0eU1vbml0b3JpbmdEZXBsb3lTdGVwKTtcbiAgICB9XG4gICAgaWYgKGZyb250ZW5kRGVwbG95U3RlcCkge1xuICAgICAgY29uc3QgZnJvbnRlbmRCdWNrZXQgPSBzMy5CdWNrZXQuZnJvbUJ1Y2tldE5hbWUodGhpcywgJ0Zyb250ZW5kQnVja2V0JywgdGhpcy5fZmVhdHVyZXMuZnJvbnRlbmRCdWNrZXROYW1lISEpO1xuICAgICAgZnJvbnRlbmRCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoZnJvbnRlbmREZXBsb3lTdGVwKTtcbiAgICB9XG5cbiAgICBjb25zdCBydWxlID0gbmV3IGV2ZW50cy5SdWxlKHRoaXMsICdQaXBlbGluZVNjaGVkdWxlJywge1xuICAgICAgc2NoZWR1bGU6IGV2ZW50cy5TY2hlZHVsZS5leHByZXNzaW9uKHByb3BzLnBpcGVsaW5lU2NoZWR1bGVzPy5tYWluUGlwZWxpbmUgfHwgJ2Nyb24oMCA5ID8gKiAyIzEgKiknKSxcbiAgICB9KTtcbiAgICBydWxlLmFkZFRhcmdldChuZXcgdGFyZ2V0cy5Db2RlUGlwZWxpbmUoY29kZVBpcGVsaW5lLnBpcGVsaW5lKSk7XG5cbiAgICB0aGlzLl9vc3NMaWNlbnNlc0J1Y2tldC5ncmFudFJlYWRXcml0ZShtYWluQnVpbGQpO1xuICAgIHRoaXMuX29zc0xpY2Vuc2VzQnVja2V0UGFyYW1ldGVyLmdyYW50UmVhZChtYWluQnVpbGQpO1xuICAgIHRoaXMuX3NlcnZpY2VLZXlzdG9yZVBhc3N3b3JkLmdyYW50UmVhZChtYWluQnVpbGQpO1xuICAgIHRoaXMuX2FjY291bnROYW1lUGFyYW1ldGVyLmdyYW50UmVhZChtYWluQnVpbGQpO1xuICAgIHRoaXMuX3RlYW1JZGVudGlmaWVyUGFyYW1ldGVyLmdyYW50UmVhZChtYWluQnVpbGQpO1xuICAgIGlmICh0aGlzLl9mZWF0dXJlcy5rYWZrYUludGVncmF0aW9uKSB7XG4gICAgICB0aGlzLmdyYW50UGVybWlzc2lvbnNGb3JLYWZrYUludGVncmF0aW9uKG1haW5CdWlsZCwgJ0thZmthSW50ZWdyYXRpb25Qb2xpY3knKTtcbiAgICB9XG4gICAgY29kZVBpcGVsaW5lLnBpcGVsaW5lLmFydGlmYWN0QnVja2V0LmdyYW50UmVhZFdyaXRlKHN0cmlwQXNzZXRzU3RlcC5wcm9qZWN0KTtcblxuICAgIGlmICh0aGlzLl9mZWF0dXJlcz8uZW5hYmxlUGlwZWxpbmVNb25pdG9ycykge1xuICAgICAgbmV3IERhdGFkb2dQaXBlbGluZUVycm9yQWxlcnQodGhpcywgJ0RhdGFkb2dQaXBlbGluZUVycm9yTW9uaXRvcicsIHtcbiAgICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgICAgICBwaXBlbGluZU5hbWU6IHBpcGVsaW5lLnBpcGVsaW5lTmFtZSxcbiAgICAgICAgYWNjb3VudElkOiB0aGlzLmFjY291bnQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEJyYW5jaFBpcGVsaW5lKGJyYW5jaEJ1aWxkOiBDb2RlQnVpbGRTdGVwKSB7XG4gICAgY29uc3QgYnJhbmNoUGlwZWxpbmUgPSBuZXcgY29kZXBpcGVsaW5lLlBpcGVsaW5lKHRoaXMsICdCcmFuY2hQaXBlbGluZScsIHtcbiAgICAgIGFydGlmYWN0QnVja2V0OiB0aGlzLl9jYWNoZUJ1Y2tldCxcbiAgICAgIHBpcGVsaW5lVHlwZTogdGhpcy5fY29kZVBpcGVsaW5lVHlwZSxcbiAgICAgIHJlc3RhcnRFeGVjdXRpb25PblVwZGF0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBicmFuY2hDb2RlUGlwZWxpbmUgPSBuZXcgcGlwZWxpbmVzLkNvZGVQaXBlbGluZShicmFuY2hQaXBlbGluZSwgJ0NvZGVQaXBlbGluZScsIHtcbiAgICAgIGNvZGVQaXBlbGluZTogYnJhbmNoUGlwZWxpbmUsXG4gICAgICBzeW50aDogYnJhbmNoQnVpbGQsXG4gICAgICBzZWxmTXV0YXRpb246IGZhbHNlLFxuICAgIH0pO1xuICAgIFRhZ3Mub2YoYnJhbmNoUGlwZWxpbmUpLmFkZCgncGlwZWxpbmVfdHlwZScsICdicmFuY2gnKTtcbiAgICBicmFuY2hDb2RlUGlwZWxpbmUuYWRkV2F2ZSgnQnJhbmNoQnVpbGQnKS5hZGRQb3N0KGJyYW5jaEJ1aWxkKTtcbiAgICBicmFuY2hDb2RlUGlwZWxpbmUuYnVpbGRQaXBlbGluZSgpO1xuXG4gICAgdGhpcy50YWdDb2RlQnVpbGRQcm9qZWN0KGJyYW5jaEJ1aWxkLCAncHJvamVjdF90eXBlJywgJ2JyYW5jaF9idWlsZCcpO1xuXG4gICAgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoYnJhbmNoQnVpbGQpO1xuICAgIHRoaXMuX29zc0xpY2Vuc2VzQnVja2V0UGFyYW1ldGVyLmdyYW50UmVhZChicmFuY2hCdWlsZCk7XG4gICAgdGhpcy5fc2VydmljZUtleXN0b3JlUGFzc3dvcmQuZ3JhbnRSZWFkKGJyYW5jaEJ1aWxkKTtcbiAgICB0aGlzLl9hY2NvdW50TmFtZVBhcmFtZXRlci5ncmFudFJlYWQoYnJhbmNoQnVpbGQpO1xuICAgIHRoaXMuX3RlYW1JZGVudGlmaWVyUGFyYW1ldGVyLmdyYW50UmVhZChicmFuY2hCdWlsZCk7XG4gICAgaWYgKHRoaXMuX2ZlYXR1cmVzLmthZmthSW50ZWdyYXRpb24pIHtcbiAgICAgIHRoaXMuZ3JhbnRQZXJtaXNzaW9uc0ZvckthZmthSW50ZWdyYXRpb24oYnJhbmNoQnVpbGQsICdCcmFuY2hLYWZrYUludGVncmF0aW9uUG9saWN5Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRWdWxuZXJhYmlsaXR5UGlwZWxpbmUodnVsbmVyYWJpbGl0eUJ1aWxkOiBDb2RlQnVpbGRTdGVwLCBwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzKSB7XG4gICAgY29uc3QgdnVsbmVyYWJpbGl0eVBpcGVsaW5lID0gbmV3IGNvZGVwaXBlbGluZS5QaXBlbGluZSh0aGlzLCAnVnVsbmVyYWJpbGl0eVBpcGVsaW5lJywge1xuICAgICAgYXJ0aWZhY3RCdWNrZXQ6IHRoaXMuX2NhY2hlQnVja2V0LFxuICAgICAgcGlwZWxpbmVUeXBlOiB0aGlzLl9jb2RlUGlwZWxpbmVUeXBlLFxuICAgICAgcmVzdGFydEV4ZWN1dGlvbk9uVXBkYXRlOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IHZ1bG5lcmFiaWxpdHlDb2RlUGlwZWxpbmUgPSBuZXcgcGlwZWxpbmVzLkNvZGVQaXBlbGluZSh2dWxuZXJhYmlsaXR5UGlwZWxpbmUsICdDb2RlUGlwZWxpbmUnLCB7XG4gICAgICBjb2RlUGlwZWxpbmU6IHZ1bG5lcmFiaWxpdHlQaXBlbGluZSxcbiAgICAgIHN5bnRoOiB2dWxuZXJhYmlsaXR5QnVpbGQsXG4gICAgICBzZWxmTXV0YXRpb246IGZhbHNlLFxuICAgIH0pO1xuICAgIFRhZ3Mub2YodnVsbmVyYWJpbGl0eVBpcGVsaW5lKS5hZGQoJ3BpcGVsaW5lX3R5cGUnLCAndnVsbmVyYWJpbGl0eScpO1xuXG4gICAgdnVsbmVyYWJpbGl0eUNvZGVQaXBlbGluZS5hZGRXYXZlKCdWdWxuZXJhYmlsaXR5Q2hlY2tzJykuYWRkUG9zdCh2dWxuZXJhYmlsaXR5QnVpbGQpO1xuICAgIHZ1bG5lcmFiaWxpdHlDb2RlUGlwZWxpbmUuYnVpbGRQaXBlbGluZSgpO1xuICAgIFRhZ3Mub2YodnVsbmVyYWJpbGl0eUJ1aWxkLnByb2plY3QpLmFkZCgncHJvamVjdF90eXBlJywgJ3Z1bG5lcmFiaWxpdHlfY2hlY2snKTtcbiAgICB0aGlzLl9uaXN0RGF0YU1pcnJvclVybC5ncmFudFJlYWQodnVsbmVyYWJpbGl0eUJ1aWxkKTtcbiAgICBTb25hdHlwZU9zc0luZGV4Q3JlZGVudGlhbHMuYWxsb3dBY2Nlc3NUbyh0aGlzLCB2dWxuZXJhYmlsaXR5QnVpbGQpO1xuXG4gICAgY29uc3QgdnVsbmVyYWJpbGl0eVJ1bGUgPSBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ1Z1bG5lcmFiaWxpdHlQaXBlbGluZVNjaGVkdWxlJywge1xuICAgICAgc2NoZWR1bGU6IGV2ZW50cy5TY2hlZHVsZS5leHByZXNzaW9uKHByb3BzLnBpcGVsaW5lU2NoZWR1bGVzPy52dWxuZXJhYmlsaXR5UGlwZWxpbmUgfHwgJ2Nyb24oMCA1ID8gKiBNT04tRlJJICopJyksXG4gICAgfSk7XG4gICAgdnVsbmVyYWJpbGl0eVJ1bGUuYWRkVGFyZ2V0KG5ldyB0YXJnZXRzLkNvZGVQaXBlbGluZSh2dWxuZXJhYmlsaXR5Q29kZVBpcGVsaW5lLnBpcGVsaW5lKSk7XG5cbiAgICBpZiAocHJvcHMuZGF0YWRvZ0FsZXJ0VHlwZSA9PT0gJ29wc2dlbmllJykge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICdUaGUgT3BzR2VuaWUgYWxlcnRUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gUGxlYXNlIHVzZSB0aGUgdnVsbmVyYWJpbGl0eU5vdGlmaWNhdGlvbiBwcm9wZXJ0eSBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZWF0dXJlcz8uZW5hYmxlUGlwZWxpbmVNb25pdG9ycykge1xuICAgICAgbmV3IERhdGFEb2dQaXBlbGluZUVycm9yQWxlcnRGb3JWdWxuZXJhYmlsaXR5Q2hlY2tzKHRoaXMsICdEYXRhRG9nUGlwZWxpbmVFcnJvckZvclZ1bG5lcmFiaWxpdHlDaGVja3NNb25pdG9yJywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgICAgIHBpcGVsaW5lTmFtZTogdnVsbmVyYWJpbGl0eVBpcGVsaW5lLnBpcGVsaW5lTmFtZSxcbiAgICAgICAgYWNjb3VudElkOiB0aGlzLmFjY291bnQsXG4gICAgICAgIG5vdGlmaWNhdGlvbjogcHJvcHMudnVsbmVyYWJpbGl0eU5vdGlmaWNhdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RyaXBBc3NldHNTdGVwKHBpcGVsaW5lOiBwaXBlbGluZXMuQ29kZVBpcGVsaW5lKTogQ29kZUJ1aWxkU3RlcCB7XG4gICAgLy8gQ2xvdWRBc3NlbWJseUFydGlmYWN0cyBtdXN0IGJlIHNtYWxsZXIgdGhhbiAyNTZNQi4gRHVlIHRvIHRoZSBncmFkbGUgYXJ0aWZhY3Qgd2UgYXJlIGV4Y2VlZGluZyB0aGlzIGxpbWl0IGFuZCBwaXBlbGluZSBmYWlscyBpbiBkZXBsb3ltZW50IHN0ZXAuXG4gICAgLy8gSXNzdWUgaXMga25vd24gYW5kIG5vdCBmaXhlZCBmb3IgYWxyZWFkeSBzb21lIHllYXJzLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvOTkxN1xuICAgIC8vIERpcnR5IGZpeDogQXNzZXRzIGFyZSBhbHJlYWR5IHVwbG9hZGVkIGFuZCB0aHVzIG5vdCBuZWVkZWQuIFJlbW92ZSB0aGVtIGZyb20gcGlwZWxpbmUgYXJ0aWZhY3QuXG4gICAgcmV0dXJuIG5ldyBDb2RlQnVpbGRTdGVwKCdTdHJpcEFzc2V0c0Zyb21Bc3NlbWJseScsIHtcbiAgICAgIGlucHV0OiBwaXBlbGluZS5jbG91ZEFzc2VtYmx5RmlsZVNldCxcbiAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICdTM19QQVRIPSR7Q09ERUJVSUxEX1NPVVJDRV9WRVJTSU9OI1wiYXJuOmF3czpzMzo6OlwifScsXG4gICAgICAgICdaSVBfQVJDSElWRT0kKGJhc2VuYW1lICRTM19QQVRIKScsXG4gICAgICAgICdybSAtcmZ2IGFzc2V0LionLFxuICAgICAgICAnemlwIC1yIC1xIC1BICRaSVBfQVJDSElWRSAqJyxcbiAgICAgICAgJ2F3cyBzMyBjcCAkWklQX0FSQ0hJVkUgczM6Ly8kUzNfUEFUSCcsXG4gICAgICBdLFxuICAgICAgYnVpbGRFbnZpcm9ubWVudDoge1xuICAgICAgICBidWlsZEltYWdlOiBMaW51eExhbWJkYUJ1aWxkSW1hZ2UuQU1BWk9OX0xJTlVYXzIwMjNfTk9ERV8yMCxcbiAgICAgICAgY29tcHV0ZVR5cGU6IENvbXB1dGVUeXBlLkxBTUJEQV8xR0IsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXAoXG4gICAgbWFpbkJ1aWxkOiBDb2RlQnVpbGRTdGVwLFxuICAgIHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHNcbiAgKTogQ29kZUJ1aWxkU3RlcCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb3BzLm1vbml0b3JpbmdEZXBsb3lTdGVwUHJvcHMpIHtcbiAgICAgIGNvbnN0IG1vbml0b3JpbmdBcnRpZmFjdHMgPSBPYmplY3Qua2V5cyhwcm9wcy5tb25pdG9yaW5nRGVwbG95U3RlcFByb3BzLm1vbml0b3JpbmdBcnRpZmFjdHMpLm1hcChrZXkgPT4ge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBtYWluQnVpbGQuYWRkT3V0cHV0RGlyZWN0b3J5KGtleSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5wdXQ6IG91dHB1dCxcbiAgICAgICAgICBmaWxlczogcHJvcHMubW9uaXRvcmluZ0RlcGxveVN0ZXBQcm9wcyEubW9uaXRvcmluZ0FydGlmYWN0c1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFJpb0NhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCh0aGlzLCAnRGVwbG95Q2FwYWJpbGl0eU1vbml0b3JpbmcnLCB7XG4gICAgICAgIG1vbml0b3JpbmdBcnRpZmFjdHM6IG1vbml0b3JpbmdBcnRpZmFjdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNlY3JldHNEZXBsb3lTdGVwKHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpOiByaW8uUmlvU2VjcmV0c0RlcGxveVN0ZXAgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9wcy5zZWNyZXRzRGVwbG95U3RlcFByb3BzKSB7XG4gICAgICByZXR1cm4gbmV3IHJpby5SaW9TZWNyZXRzRGVwbG95U3RlcCh0aGlzLCAnRGVwbG95U2VjcmV0cycsIHtcbiAgICAgICAgLi4ucHJvcHMuc2VjcmV0c0RlcGxveVN0ZXBQcm9wcyxcbiAgICAgICAgaW5wdXQ6IHRoaXMuX2lucHV0TWFzdGVyVHJpZ2dlckZpbGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlcGxveUZyb250ZW5kRGVwbG95U3RlcChtYWluQnVpbGQ6IENvZGVCdWlsZFN0ZXApOiBDb2RlQnVpbGRTdGVwIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2ZlYXR1cmVzLmZyb250ZW5kQnVja2V0TmFtZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZnJvbnRlbmRCdWlsZE91dHB1dCA9IG1haW5CdWlsZC5hZGRPdXRwdXREaXJlY3RvcnkoJ2J1aWxkJyk7XG4gICAgcmV0dXJuIG5ldyBDb2RlQnVpbGRTdGVwKCdEZXBsb3lGcm9udGVuZCcsIHtcbiAgICAgIGlucHV0OiBmcm9udGVuZEJ1aWxkT3V0cHV0LFxuICAgICAgYnVpbGRFbnZpcm9ubWVudDoge1xuICAgICAgICBidWlsZEltYWdlOiBMaW51eExhbWJkYUJ1aWxkSW1hZ2UuQU1BWk9OX0xJTlVYXzIwMjNfTk9ERV8yMCxcbiAgICAgICAgY29tcHV0ZVR5cGU6IENvbXB1dGVUeXBlLkxBTUJEQV8xR0IsXG4gICAgICB9LFxuICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgYGF3cyBzMyBzeW5jIC0tZXhjbHVkZSBpbmRleC5odG1sIC0tY2FjaGUtY29udHJvbCBtYXgtYWdlPTMxNTM2MDAwIC4vICdzMzovLyR7dGhpcy5fZmVhdHVyZXMuZnJvbnRlbmRCdWNrZXROYW1lfSdgLFxuICAgICAgICBgYXdzIHMzIGNwIC0tY2FjaGUtY29udHJvbCBuby1jYWNoZSBpbmRleC5odG1sICdzMzovLyR7dGhpcy5fZmVhdHVyZXMuZnJvbnRlbmRCdWNrZXROYW1lfSdgLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ3JhbnRQZXJtaXNzaW9uc0ZvckthZmthSW50ZWdyYXRpb24oYnVpbGRQcm9qZWN0OiBSaW9Db2RlQnVpbGRQcm9qZWN0LCBwb2xpY3lJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVpbGRQcm9qZWN0Um9sZSA9IGJ1aWxkUHJvamVjdC5wcm9qZWN0LnJvbGU7XG4gICAgaWYgKGJ1aWxkUHJvamVjdFJvbGUpIHtcbiAgICAgIGJ1aWxkUHJvamVjdFJvbGUuYWRkTWFuYWdlZFBvbGljeShcbiAgICAgICAgTWFuYWdlZFBvbGljeS5mcm9tTWFuYWdlZFBvbGljeUFybih0aGlzLCBwb2xpY3lJZCwgRm4uaW1wb3J0VmFsdWUoJ2thZmthLWludGVncmF0aW9uLXBvbGljeS1hcm4nKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGFkZCBtYW5hZ2VkIHBvbGljeSBmb3Iga2Fma2EtaW50ZWdyYXRpb24gdG8gQ29kZUJ1aWxkIHByb2plY3Qgb2YgJHtidWlsZFByb2plY3QuaWR9IGR1ZSB0byBtaXNzaW5nIHJvbGUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvYWRCdWlsZFNwZWNGcm9tRmlsZShidWlsZFNwZWNQYXRoPzogc3RyaW5nKTogQnVpbGRTcGVjIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWJ1aWxkU3BlY1BhdGgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBCdWlsZFNwZWMuZnJvbU9iamVjdCh5YW1sLmxvYWQoZnMucmVhZEZpbGVTeW5jKGJ1aWxkU3BlY1BhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkpIGFzIE9iamVjdCk7XG4gIH1cblxuICBwcml2YXRlIHRhZ0NvZGVCdWlsZFByb2plY3QocHJvamVjdDogQ29kZUJ1aWxkU3RlcCB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAocHJvamVjdCkge1xuICAgICAgVGFncy5vZihwcm9qZWN0LnByb2plY3QpLmFkZChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/lib/contributions/{team-transport-two → team-transport}/datadog-synthetics/index.d.ts
RENAMED
|
File without changes
|
/package/lib/contributions/{team-transport-two → team-transport}/pipeline/application-stage.d.ts
RENAMED
|
File without changes
|
/package/lib/contributions/{team-transport-two → team-transport}/pipeline/build-project.d.ts
RENAMED
|
File without changes
|
/package/lib/contributions/{team-transport-two → team-transport}/pipeline/datadog-monitors.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|