aws-cdk 2.1006.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/THIRD_PARTY_LICENSES +104 -86
- package/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/api/aws-auth.d.ts +1 -0
- package/lib/api/{logs/index.js → aws-auth.js} +2 -3
- package/lib/api/bootstrap.d.ts +1 -0
- package/lib/api/bootstrap.js +18 -0
- package/lib/api/cloud-assembly.d.ts +1 -0
- package/lib/api/cloud-assembly.js +18 -0
- package/lib/api/cloudformation.d.ts +1 -0
- package/lib/api/cloudformation.js +18 -0
- package/lib/api/context.d.ts +1 -40
- package/lib/api/context.js +16 -80
- package/lib/api/deployments.d.ts +1 -0
- package/lib/api/deployments.js +18 -0
- package/lib/api/environment.d.ts +1 -0
- package/lib/api/environment.js +18 -0
- package/lib/api/garbage-collection.d.ts +1 -0
- package/lib/api/garbage-collection.js +18 -0
- package/lib/api/hotswap.d.ts +1 -0
- package/lib/api/hotswap.js +18 -0
- package/lib/api/index.d.ts +5 -1
- package/lib/api/index.js +6 -2
- package/lib/api/logs-monitor.d.ts +1 -0
- package/lib/api/logs-monitor.js +18 -0
- package/lib/api/notices.d.ts +1 -0
- package/lib/api/notices.js +18 -0
- package/lib/api/plugin.d.ts +1 -0
- package/lib/api/{resource-import/index.js → plugin.js} +2 -3
- package/lib/api/resource-import.d.ts +1 -0
- package/lib/api/resource-import.js +18 -0
- package/lib/api/rwlock.d.ts +1 -0
- package/lib/api/{garbage-collection/index.js → rwlock.js} +2 -2
- package/lib/api/settings.d.ts +1 -26
- package/lib/api/settings.js +16 -103
- package/lib/api/stack-events.d.ts +1 -0
- package/lib/api/stack-events.js +18 -0
- package/lib/api/tags.d.ts +1 -9
- package/lib/api/tags.js +16 -8
- package/lib/api/toolkit-info.d.ts +1 -52
- package/lib/api/toolkit-info.js +16 -152
- package/lib/api/tree.d.ts +1 -31
- package/lib/api/tree.js +16 -35
- package/lib/api/work-graph.d.ts +1 -0
- package/lib/api/work-graph.js +18 -0
- package/lib/api-private.d.ts +3 -0
- package/lib/api-private.js +22 -0
- package/lib/cli/cdk-toolkit.d.ts +20 -16
- package/lib/cli/cdk-toolkit.js +102 -37
- package/lib/cli/cli-config.js +2 -2
- package/lib/cli/cli.d.ts +1 -1
- package/lib/cli/cli.js +22 -19
- package/lib/cli/io-host/cli-io-host.js +2 -2
- package/lib/cli/pretty-print-error.js +3 -1
- package/lib/cli/util/npm.d.ts +4 -1
- package/lib/cli/util/npm.js +25 -13
- package/lib/cli/version.d.ts +1 -1
- package/lib/cli/version.js +21 -25
- package/lib/commands/context.js +3 -2
- package/lib/commands/diff.d.ts +1 -50
- package/lib/commands/diff.js +5 -213
- package/lib/commands/init/init.js +3 -2
- package/lib/commands/list-stacks.js +4 -4
- package/lib/context-providers/ami.d.ts +1 -13
- package/lib/context-providers/ami.js +16 -48
- package/lib/context-providers/availability-zones.d.ts +1 -13
- package/lib/context-providers/availability-zones.js +16 -25
- package/lib/context-providers/cc-api-provider.d.ts +1 -30
- package/lib/context-providers/cc-api-provider.js +16 -136
- package/lib/context-providers/endpoint-service-availability-zones.d.ts +1 -13
- package/lib/context-providers/endpoint-service-availability-zones.js +16 -31
- package/lib/context-providers/hosted-zones.d.ts +1 -12
- package/lib/context-providers/hosted-zones.js +16 -65
- package/lib/context-providers/index.d.ts +1 -44
- package/lib/context-providers/index.js +15 -126
- package/lib/context-providers/keys.d.ts +1 -13
- package/lib/context-providers/keys.js +16 -50
- package/lib/context-providers/load-balancers.d.ts +1 -20
- package/lib/context-providers/load-balancers.js +16 -154
- package/lib/context-providers/security-groups.d.ts +1 -9
- package/lib/context-providers/security-groups.js +16 -66
- package/lib/context-providers/ssm-parameters.d.ts +1 -25
- package/lib/context-providers/ssm-parameters.js +16 -57
- package/lib/context-providers/vpcs.d.ts +1 -13
- package/lib/context-providers/vpcs.js +16 -285
- package/lib/{api/cxapp → cxapp}/cloud-assembly.d.ts +3 -59
- package/lib/cxapp/cloud-assembly.js +108 -0
- package/lib/{api/cxapp → cxapp}/cloud-executable.d.ts +10 -3
- package/lib/cxapp/cloud-executable.js +92 -0
- package/lib/{api/cxapp → cxapp}/environments.d.ts +1 -2
- package/lib/{api/cxapp → cxapp}/environments.js +2 -2
- package/lib/cxapp/exec.d.ts +14 -0
- package/lib/cxapp/exec.js +157 -0
- package/lib/cxapp/index.d.ts +4 -0
- package/lib/{api/bootstrap → cxapp}/index.js +5 -3
- package/lib/index.js +134493 -125222
- package/lib/init-templates/.init-version.json +1 -1
- package/lib/init-templates/.recommended-feature-flags.json +3 -1
- package/lib/legacy-aws-auth.d.ts +74 -0
- package/lib/legacy-aws-auth.js +40 -0
- package/lib/legacy-exports-source.d.ts +13 -18
- package/lib/legacy-exports-source.js +42 -49
- package/lib/legacy-exports.d.ts +3 -6
- package/lib/legacy-exports.js +5 -5
- package/lib/legacy-types.d.ts +31 -0
- package/lib/legacy-types.js +3 -0
- package/package.json +19 -18
- package/lib/api/aws-auth/account-cache.d.ts +0 -36
- package/lib/api/aws-auth/account-cache.js +0 -99
- package/lib/api/aws-auth/awscli-compatible.d.ts +0 -42
- package/lib/api/aws-auth/awscli-compatible.js +0 -263
- package/lib/api/aws-auth/cached.d.ts +0 -11
- package/lib/api/aws-auth/cached.js +0 -26
- package/lib/api/aws-auth/credential-plugins.d.ts +0 -36
- package/lib/api/aws-auth/credential-plugins.js +0 -152
- package/lib/api/aws-auth/index.d.ts +0 -3
- package/lib/api/aws-auth/index.js +0 -20
- package/lib/api/aws-auth/provider-caching.d.ts +0 -13
- package/lib/api/aws-auth/provider-caching.js +0 -24
- package/lib/api/aws-auth/sdk-logger.d.ts +0 -69
- package/lib/api/aws-auth/sdk-logger.js +0 -124
- package/lib/api/aws-auth/sdk-provider.d.ts +0 -207
- package/lib/api/aws-auth/sdk-provider.js +0 -357
- package/lib/api/aws-auth/sdk.d.ts +0 -229
- package/lib/api/aws-auth/sdk.js +0 -373
- package/lib/api/aws-auth/tracing.d.ts +0 -11
- package/lib/api/aws-auth/tracing.js +0 -60
- package/lib/api/aws-auth/user-agent.d.ts +0 -7
- package/lib/api/aws-auth/user-agent.js +0 -20
- package/lib/api/aws-auth/util.d.ts +0 -6
- package/lib/api/aws-auth/util.js +0 -23
- package/lib/api/bootstrap/bootstrap-environment.d.ts +0 -35
- package/lib/api/bootstrap/bootstrap-environment.js +0 -321
- package/lib/api/bootstrap/bootstrap-props.d.ts +0 -130
- package/lib/api/bootstrap/bootstrap-props.js +0 -14
- package/lib/api/bootstrap/deploy-bootstrap.d.ts +0 -39
- package/lib/api/bootstrap/deploy-bootstrap.js +0 -141
- package/lib/api/bootstrap/index.d.ts +0 -2
- package/lib/api/bootstrap/legacy-template.d.ts +0 -2
- package/lib/api/bootstrap/legacy-template.js +0 -82
- package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +0 -85
- package/lib/api/cloudformation/evaluate-cloudformation-template.js +0 -440
- package/lib/api/cloudformation/index.d.ts +0 -4
- package/lib/api/cloudformation/index.js +0 -21
- package/lib/api/cloudformation/nested-stack-helpers.d.ts +0 -25
- package/lib/api/cloudformation/nested-stack-helpers.js +0 -86
- package/lib/api/cloudformation/stack-helpers.d.ts +0 -96
- package/lib/api/cloudformation/stack-helpers.js +0 -158
- package/lib/api/cloudformation/template-body-parameter.d.ts +0 -22
- package/lib/api/cloudformation/template-body-parameter.js +0 -104
- package/lib/api/cxapp/cloud-assembly.js +0 -304
- package/lib/api/cxapp/cloud-executable.js +0 -89
- package/lib/api/cxapp/exec.d.ts +0 -56
- package/lib/api/cxapp/exec.js +0 -272
- package/lib/api/deployments/asset-manifest-builder.d.ts +0 -8
- package/lib/api/deployments/asset-manifest-builder.js +0 -35
- package/lib/api/deployments/asset-publishing.d.ts +0 -60
- package/lib/api/deployments/asset-publishing.js +0 -141
- package/lib/api/deployments/assets.d.ts +0 -11
- package/lib/api/deployments/assets.js +0 -109
- package/lib/api/deployments/cfn-api.d.ts +0 -138
- package/lib/api/deployments/cfn-api.js +0 -438
- package/lib/api/deployments/checks.d.ts +0 -9
- package/lib/api/deployments/checks.js +0 -72
- package/lib/api/deployments/deploy-stack.d.ts +0 -155
- package/lib/api/deployments/deploy-stack.js +0 -478
- package/lib/api/deployments/deployment-method.d.ts +0 -24
- package/lib/api/deployments/deployment-method.js +0 -3
- package/lib/api/deployments/deployment-result.d.ts +0 -21
- package/lib/api/deployments/deployment-result.js +0 -10
- package/lib/api/deployments/deployments.d.ts +0 -296
- package/lib/api/deployments/deployments.js +0 -331
- package/lib/api/deployments/hotswap-deployments.d.ts +0 -17
- package/lib/api/deployments/hotswap-deployments.js +0 -441
- package/lib/api/deployments/index.d.ts +0 -4
- package/lib/api/deployments/index.js +0 -21
- package/lib/api/environment/environment-access.d.ts +0 -140
- package/lib/api/environment/environment-access.js +0 -202
- package/lib/api/environment/environment-resources.d.ts +0 -75
- package/lib/api/environment/environment-resources.js +0 -207
- package/lib/api/environment/index.d.ts +0 -3
- package/lib/api/environment/index.js +0 -20
- package/lib/api/environment/placeholders.d.ts +0 -10
- package/lib/api/environment/placeholders.js +0 -23
- package/lib/api/garbage-collection/garbage-collector.d.ts +0 -158
- package/lib/api/garbage-collection/garbage-collector.js +0 -599
- package/lib/api/garbage-collection/index.d.ts +0 -1
- package/lib/api/garbage-collection/progress-printer.d.ts +0 -23
- package/lib/api/garbage-collection/progress-printer.js +0 -70
- package/lib/api/garbage-collection/stack-refresh.d.ts +0 -49
- package/lib/api/garbage-collection/stack-refresh.js +0 -151
- package/lib/api/hotswap/appsync-mapping-templates.d.ts +0 -4
- package/lib/api/hotswap/appsync-mapping-templates.js +0 -162
- package/lib/api/hotswap/code-build-projects.d.ts +0 -4
- package/lib/api/hotswap/code-build-projects.js +0 -62
- package/lib/api/hotswap/common.d.ts +0 -89
- package/lib/api/hotswap/common.js +0 -128
- package/lib/api/hotswap/ecs-services.d.ts +0 -4
- package/lib/api/hotswap/ecs-services.js +0 -159
- package/lib/api/hotswap/lambda-functions.d.ts +0 -4
- package/lib/api/hotswap/lambda-functions.js +0 -297
- package/lib/api/hotswap/s3-bucket-deployments.d.ts +0 -5
- package/lib/api/hotswap/s3-bucket-deployments.js +0 -117
- package/lib/api/hotswap/stepfunctions-state-machines.d.ts +0 -4
- package/lib/api/hotswap/stepfunctions-state-machines.js +0 -48
- package/lib/api/logs/find-cloudwatch-logs.d.ts +0 -25
- package/lib/api/logs/find-cloudwatch-logs.js +0 -95
- package/lib/api/logs/index.d.ts +0 -2
- package/lib/api/logs/logs-monitor.d.ts +0 -76
- package/lib/api/logs/logs-monitor.js +0 -187
- package/lib/api/plugin/context-provider-plugin.d.ts +0 -6
- package/lib/api/plugin/context-provider-plugin.js +0 -7
- package/lib/api/plugin/index.d.ts +0 -3
- package/lib/api/plugin/index.js +0 -20
- package/lib/api/plugin/mode.d.ts +0 -4
- package/lib/api/plugin/mode.js +0 -9
- package/lib/api/plugin/plugin.d.ts +0 -63
- package/lib/api/plugin/plugin.js +0 -102
- package/lib/api/resource-import/importer.d.ts +0 -220
- package/lib/api/resource-import/importer.js +0 -331
- package/lib/api/resource-import/index.d.ts +0 -2
- package/lib/api/resource-import/migrator.d.ts +0 -26
- package/lib/api/resource-import/migrator.js +0 -71
- package/lib/api/stack-events/index.d.ts +0 -3
- package/lib/api/stack-events/index.js +0 -20
- package/lib/api/stack-events/stack-activity-monitor.d.ts +0 -100
- package/lib/api/stack-events/stack-activity-monitor.js +0 -142
- package/lib/api/stack-events/stack-event-poller.d.ts +0 -69
- package/lib/api/stack-events/stack-event-poller.js +0 -128
- package/lib/api/stack-events/stack-progress-monitor.d.ts +0 -48
- package/lib/api/stack-events/stack-progress-monitor.js +0 -94
- package/lib/api/stack-events/stack-status.d.ts +0 -42
- package/lib/api/stack-events/stack-status.js +0 -88
- package/lib/api/util/rwlock.d.ts +0 -65
- package/lib/api/util/rwlock.js +0 -179
- package/lib/api/work-graph/index.d.ts +0 -3
- package/lib/api/work-graph/index.js +0 -20
- package/lib/api/work-graph/work-graph-builder.d.ts +0 -34
- package/lib/api/work-graph/work-graph-builder.js +0 -168
- package/lib/api/work-graph/work-graph-types.d.ts +0 -50
- package/lib/api/work-graph/work-graph-types.js +0 -13
- package/lib/api/work-graph/work-graph.d.ts +0 -72
- package/lib/api/work-graph/work-graph.js +0 -346
- package/lib/cli/activity-printer/base.d.ts +0 -50
- package/lib/cli/activity-printer/base.js +0 -114
- package/lib/cli/activity-printer/current.d.ts +0 -26
- package/lib/cli/activity-printer/current.js +0 -118
- package/lib/cli/activity-printer/display.d.ts +0 -13
- package/lib/cli/activity-printer/display.js +0 -80
- package/lib/cli/activity-printer/history.d.ts +0 -32
- package/lib/cli/activity-printer/history.js +0 -108
- package/lib/cli/activity-printer/index.d.ts +0 -3
- package/lib/cli/activity-printer/index.js +0 -20
- package/lib/notices.d.ts +0 -203
- package/lib/notices.js +0 -411
|
@@ -1,297 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isHotswappableLambdaFunctionChange = isHotswappableLambdaFunctionChange;
|
|
4
|
-
const stream_1 = require("stream");
|
|
5
|
-
const common_1 = require("./common");
|
|
6
|
-
const api_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api");
|
|
7
|
-
const util_1 = require("../../util");
|
|
8
|
-
const cloudformation_1 = require("../cloudformation");
|
|
9
|
-
// namespace object imports won't work in the bundle for function exports
|
|
10
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
11
|
-
const archiver = require('archiver');
|
|
12
|
-
async function isHotswappableLambdaFunctionChange(logicalId, change, evaluateCfnTemplate) {
|
|
13
|
-
// if the change is for a Lambda Version, we just ignore it
|
|
14
|
-
// we will publish a new version when we get to hotswapping the actual Function this Version points to
|
|
15
|
-
// (Versions can't be changed in CloudFormation anyway, they're immutable)
|
|
16
|
-
if (change.newValue.Type === 'AWS::Lambda::Version') {
|
|
17
|
-
return [];
|
|
18
|
-
}
|
|
19
|
-
// we handle Aliases specially too
|
|
20
|
-
// the actual alias update will happen if we change the function
|
|
21
|
-
if (change.newValue.Type === 'AWS::Lambda::Alias') {
|
|
22
|
-
return classifyAliasChanges(change);
|
|
23
|
-
}
|
|
24
|
-
if (change.newValue.Type !== 'AWS::Lambda::Function') {
|
|
25
|
-
return [];
|
|
26
|
-
}
|
|
27
|
-
const ret = [];
|
|
28
|
-
const classifiedChanges = (0, common_1.classifyChanges)(change, ['Code', 'Environment', 'Description']);
|
|
29
|
-
classifiedChanges.reportNonHotswappablePropertyChanges(ret);
|
|
30
|
-
const functionName = await evaluateCfnTemplate.establishResourcePhysicalName(logicalId, change.newValue.Properties?.FunctionName);
|
|
31
|
-
const namesOfHotswappableChanges = Object.keys(classifiedChanges.hotswappableProps);
|
|
32
|
-
if (functionName && namesOfHotswappableChanges.length > 0) {
|
|
33
|
-
const lambdaCodeChange = await evaluateLambdaFunctionProps(classifiedChanges.hotswappableProps, change.newValue.Properties?.Runtime, evaluateCfnTemplate);
|
|
34
|
-
// nothing to do here
|
|
35
|
-
if (lambdaCodeChange === undefined) {
|
|
36
|
-
return ret;
|
|
37
|
-
}
|
|
38
|
-
const dependencies = await dependantResources(logicalId, functionName, evaluateCfnTemplate);
|
|
39
|
-
ret.push({
|
|
40
|
-
change: {
|
|
41
|
-
cause: change,
|
|
42
|
-
resources: [
|
|
43
|
-
{
|
|
44
|
-
logicalId,
|
|
45
|
-
resourceType: change.newValue.Type,
|
|
46
|
-
physicalName: functionName,
|
|
47
|
-
metadata: evaluateCfnTemplate.metadataFor(logicalId),
|
|
48
|
-
},
|
|
49
|
-
...dependencies,
|
|
50
|
-
],
|
|
51
|
-
},
|
|
52
|
-
hotswappable: true,
|
|
53
|
-
service: 'lambda',
|
|
54
|
-
apply: async (sdk) => {
|
|
55
|
-
const lambda = sdk.lambda();
|
|
56
|
-
const operations = [];
|
|
57
|
-
if (lambdaCodeChange.code !== undefined || lambdaCodeChange.configurations !== undefined) {
|
|
58
|
-
if (lambdaCodeChange.code !== undefined) {
|
|
59
|
-
const updateFunctionCodeResponse = await lambda.updateFunctionCode({
|
|
60
|
-
FunctionName: functionName,
|
|
61
|
-
S3Bucket: lambdaCodeChange.code.s3Bucket,
|
|
62
|
-
S3Key: lambdaCodeChange.code.s3Key,
|
|
63
|
-
ImageUri: lambdaCodeChange.code.imageUri,
|
|
64
|
-
ZipFile: lambdaCodeChange.code.functionCodeZip,
|
|
65
|
-
S3ObjectVersion: lambdaCodeChange.code.s3ObjectVersion,
|
|
66
|
-
});
|
|
67
|
-
await waitForLambdasPropertiesUpdateToFinish(updateFunctionCodeResponse, lambda, functionName);
|
|
68
|
-
}
|
|
69
|
-
if (lambdaCodeChange.configurations !== undefined) {
|
|
70
|
-
const updateRequest = {
|
|
71
|
-
FunctionName: functionName,
|
|
72
|
-
};
|
|
73
|
-
if (lambdaCodeChange.configurations.description !== undefined) {
|
|
74
|
-
updateRequest.Description = lambdaCodeChange.configurations.description;
|
|
75
|
-
}
|
|
76
|
-
if (lambdaCodeChange.configurations.environment !== undefined) {
|
|
77
|
-
updateRequest.Environment = lambdaCodeChange.configurations.environment;
|
|
78
|
-
}
|
|
79
|
-
const updateFunctionCodeResponse = await lambda.updateFunctionConfiguration(updateRequest);
|
|
80
|
-
await waitForLambdasPropertiesUpdateToFinish(updateFunctionCodeResponse, lambda, functionName);
|
|
81
|
-
}
|
|
82
|
-
// only if the code changed is there any point in publishing a new Version
|
|
83
|
-
const versions = dependencies.filter((d) => d.resourceType === 'AWS::Lambda::Version');
|
|
84
|
-
if (versions.length) {
|
|
85
|
-
const publishVersionPromise = lambda.publishVersion({
|
|
86
|
-
FunctionName: functionName,
|
|
87
|
-
});
|
|
88
|
-
const aliases = dependencies.filter((d) => d.resourceType === 'AWS::Lambda::Alias');
|
|
89
|
-
if (aliases.length) {
|
|
90
|
-
// we need to wait for the Version to finish publishing
|
|
91
|
-
const versionUpdate = await publishVersionPromise;
|
|
92
|
-
for (const alias of aliases) {
|
|
93
|
-
operations.push(lambda.updateAlias({
|
|
94
|
-
FunctionName: functionName,
|
|
95
|
-
Name: alias.physicalName,
|
|
96
|
-
FunctionVersion: versionUpdate.Version,
|
|
97
|
-
}));
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
operations.push(publishVersionPromise);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
// run all of our updates in parallel
|
|
106
|
-
// Limited set of updates per function
|
|
107
|
-
// eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
|
|
108
|
-
await Promise.all(operations);
|
|
109
|
-
},
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
return ret;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Determines which changes to this Alias are hotswappable or not
|
|
116
|
-
*/
|
|
117
|
-
function classifyAliasChanges(change) {
|
|
118
|
-
const ret = [];
|
|
119
|
-
const classifiedChanges = (0, common_1.classifyChanges)(change, ['FunctionVersion']);
|
|
120
|
-
classifiedChanges.reportNonHotswappablePropertyChanges(ret);
|
|
121
|
-
// we only want to report not hotswappable changes to aliases
|
|
122
|
-
// the actual alias update will happen if we change the function
|
|
123
|
-
return ret;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Evaluates the hotswappable properties of an AWS::Lambda::Function and
|
|
127
|
-
* Returns a `LambdaFunctionChange` if the change is hotswappable.
|
|
128
|
-
* Returns `undefined` if the change is not hotswappable.
|
|
129
|
-
*/
|
|
130
|
-
async function evaluateLambdaFunctionProps(hotswappablePropChanges, runtime, evaluateCfnTemplate) {
|
|
131
|
-
/*
|
|
132
|
-
* At first glance, we would want to initialize these using the "previous" values (change.oldValue),
|
|
133
|
-
* in case only one of them changed, like the key, and the Bucket stayed the same.
|
|
134
|
-
* However, that actually fails for old-style synthesis, which uses CFN Parameters!
|
|
135
|
-
* Because the names of the Parameters depend on the hash of the Asset,
|
|
136
|
-
* the Parameters used for the "old" values no longer exist in `assetParams` at this point,
|
|
137
|
-
* which means we don't have the correct values available to evaluate the CFN expression with.
|
|
138
|
-
* Fortunately, the diff will always include both the s3Bucket and s3Key parts of the Lambda's Code property,
|
|
139
|
-
* even if only one of them was actually changed,
|
|
140
|
-
* which means we don't need the "old" values at all, and we can safely initialize these with just `''`.
|
|
141
|
-
*/
|
|
142
|
-
let code = undefined;
|
|
143
|
-
let description = undefined;
|
|
144
|
-
let environment = undefined;
|
|
145
|
-
for (const updatedPropName in hotswappablePropChanges) {
|
|
146
|
-
const updatedProp = hotswappablePropChanges[updatedPropName];
|
|
147
|
-
switch (updatedPropName) {
|
|
148
|
-
case 'Code':
|
|
149
|
-
let s3Bucket, s3Key, s3ObjectVersion, imageUri, functionCodeZip;
|
|
150
|
-
for (const newPropName in updatedProp.newValue) {
|
|
151
|
-
switch (newPropName) {
|
|
152
|
-
case 'S3Bucket':
|
|
153
|
-
s3Bucket = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue[newPropName]);
|
|
154
|
-
break;
|
|
155
|
-
case 'S3Key':
|
|
156
|
-
s3Key = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue[newPropName]);
|
|
157
|
-
break;
|
|
158
|
-
case 'S3ObjectVersion':
|
|
159
|
-
s3ObjectVersion = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue[newPropName]);
|
|
160
|
-
break;
|
|
161
|
-
case 'ImageUri':
|
|
162
|
-
imageUri = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue[newPropName]);
|
|
163
|
-
break;
|
|
164
|
-
case 'ZipFile':
|
|
165
|
-
// We must create a zip package containing a file with the inline code
|
|
166
|
-
const functionCode = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue[newPropName]);
|
|
167
|
-
const functionRuntime = await evaluateCfnTemplate.evaluateCfnExpression(runtime);
|
|
168
|
-
if (!functionRuntime) {
|
|
169
|
-
return undefined;
|
|
170
|
-
}
|
|
171
|
-
// file extension must be chosen depending on the runtime
|
|
172
|
-
const codeFileExt = determineCodeFileExtFromRuntime(functionRuntime);
|
|
173
|
-
functionCodeZip = await zipString(`index.${codeFileExt}`, functionCode);
|
|
174
|
-
break;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
code = {
|
|
178
|
-
s3Bucket,
|
|
179
|
-
s3Key,
|
|
180
|
-
s3ObjectVersion,
|
|
181
|
-
imageUri,
|
|
182
|
-
functionCodeZip,
|
|
183
|
-
};
|
|
184
|
-
break;
|
|
185
|
-
case 'Description':
|
|
186
|
-
description = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue);
|
|
187
|
-
break;
|
|
188
|
-
case 'Environment':
|
|
189
|
-
environment = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue);
|
|
190
|
-
break;
|
|
191
|
-
default:
|
|
192
|
-
// we will never get here, but just in case we do throw an error
|
|
193
|
-
throw new api_1.ToolkitError('while apply()ing, found a property that cannot be hotswapped. Please report this at github.com/aws/aws-cdk/issues/new/choose');
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
const configurations = description || environment ? { description, environment } : undefined;
|
|
197
|
-
return code || configurations ? { code, configurations } : undefined;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Compress a string as a file, returning a promise for the zip buffer
|
|
201
|
-
* https://github.com/archiverjs/node-archiver/issues/342
|
|
202
|
-
*/
|
|
203
|
-
function zipString(fileName, rawString) {
|
|
204
|
-
return new Promise((resolve, reject) => {
|
|
205
|
-
const buffers = [];
|
|
206
|
-
const converter = new stream_1.Writable();
|
|
207
|
-
converter._write = (chunk, _, callback) => {
|
|
208
|
-
buffers.push(chunk);
|
|
209
|
-
process.nextTick(callback);
|
|
210
|
-
};
|
|
211
|
-
converter.on('finish', () => {
|
|
212
|
-
resolve(Buffer.concat(buffers));
|
|
213
|
-
});
|
|
214
|
-
const archive = archiver('zip');
|
|
215
|
-
archive.on('error', (err) => {
|
|
216
|
-
reject(err);
|
|
217
|
-
});
|
|
218
|
-
archive.pipe(converter);
|
|
219
|
-
archive.append(rawString, {
|
|
220
|
-
name: fileName,
|
|
221
|
-
date: new Date('1980-01-01T00:00:00.000Z'), // Add date to make resulting zip file deterministic
|
|
222
|
-
});
|
|
223
|
-
void archive.finalize();
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* After a Lambda Function is updated, it cannot be updated again until the
|
|
228
|
-
* `State=Active` and the `LastUpdateStatus=Successful`.
|
|
229
|
-
*
|
|
230
|
-
* Depending on the configuration of the Lambda Function this could happen relatively quickly
|
|
231
|
-
* or very slowly. For example, Zip based functions _not_ in a VPC can take ~1 second whereas VPC
|
|
232
|
-
* or Container functions can take ~25 seconds (and 'idle' VPC functions can take minutes).
|
|
233
|
-
*/
|
|
234
|
-
async function waitForLambdasPropertiesUpdateToFinish(currentFunctionConfiguration, lambda, functionName) {
|
|
235
|
-
const functionIsInVpcOrUsesDockerForCode = currentFunctionConfiguration.VpcConfig?.VpcId || currentFunctionConfiguration.PackageType === 'Image';
|
|
236
|
-
// if the function is deployed in a VPC or if it is a container image function
|
|
237
|
-
// then the update will take much longer and we can wait longer between checks
|
|
238
|
-
// otherwise, the update will be quick, so a 1-second delay is fine
|
|
239
|
-
const delaySeconds = functionIsInVpcOrUsesDockerForCode ? 5 : 1;
|
|
240
|
-
await lambda.waitUntilFunctionUpdated(delaySeconds, {
|
|
241
|
-
FunctionName: functionName,
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Get file extension from Lambda runtime string.
|
|
246
|
-
* We use this extension to create a deployment package from Lambda inline code.
|
|
247
|
-
*/
|
|
248
|
-
function determineCodeFileExtFromRuntime(runtime) {
|
|
249
|
-
if (runtime.startsWith('node')) {
|
|
250
|
-
return 'js';
|
|
251
|
-
}
|
|
252
|
-
if (runtime.startsWith('python')) {
|
|
253
|
-
return 'py';
|
|
254
|
-
}
|
|
255
|
-
// Currently inline code only supports Node.js and Python, ignoring other runtimes.
|
|
256
|
-
// https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#aws-properties-lambda-function-code-properties
|
|
257
|
-
throw new cloudformation_1.CfnEvaluationException(`runtime ${runtime} is unsupported, only node.js and python runtimes are currently supported.`);
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Finds all Versions that reference an AWS::Lambda::Function with logical ID `logicalId`
|
|
261
|
-
* and Aliases that reference those Versions.
|
|
262
|
-
*/
|
|
263
|
-
async function versionsAndAliases(logicalId, evaluateCfnTemplate) {
|
|
264
|
-
// find all Lambda Versions that reference this Function
|
|
265
|
-
const versionsReferencingFunction = evaluateCfnTemplate
|
|
266
|
-
.findReferencesTo(logicalId)
|
|
267
|
-
.filter((r) => r.Type === 'AWS::Lambda::Version');
|
|
268
|
-
// find all Lambda Aliases that reference the above Versions
|
|
269
|
-
const aliasesReferencingVersions = (0, util_1.flatMap)(versionsReferencingFunction, v => evaluateCfnTemplate.findReferencesTo(v.LogicalId));
|
|
270
|
-
return { versionsReferencingFunction, aliasesReferencingVersions };
|
|
271
|
-
}
|
|
272
|
-
async function dependantResources(logicalId, functionName, evaluateCfnTemplate) {
|
|
273
|
-
const candidates = await versionsAndAliases(logicalId, evaluateCfnTemplate);
|
|
274
|
-
// Limited set of updates per function
|
|
275
|
-
// eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
|
|
276
|
-
const aliases = await Promise.all(candidates.aliasesReferencingVersions.map(async (a) => {
|
|
277
|
-
const name = await evaluateCfnTemplate.evaluateCfnExpression(a.Properties?.Name);
|
|
278
|
-
return {
|
|
279
|
-
logicalId: a.LogicalId,
|
|
280
|
-
resourceType: a.Type,
|
|
281
|
-
physicalName: name,
|
|
282
|
-
description: `${a.Type} '${name}' for AWS::Lambda::Function '${functionName}'`,
|
|
283
|
-
metadata: evaluateCfnTemplate.metadataFor(a.LogicalId),
|
|
284
|
-
};
|
|
285
|
-
}));
|
|
286
|
-
const versions = candidates.versionsReferencingFunction.map((v) => ({
|
|
287
|
-
logicalId: v.LogicalId,
|
|
288
|
-
resourceType: v.Type,
|
|
289
|
-
description: `${v.Type} for AWS::Lambda::Function '${functionName}'`,
|
|
290
|
-
metadata: evaluateCfnTemplate.metadataFor(v.LogicalId),
|
|
291
|
-
}));
|
|
292
|
-
return [
|
|
293
|
-
...versions,
|
|
294
|
-
...aliases,
|
|
295
|
-
];
|
|
296
|
-
}
|
|
297
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWZ1bmN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxhbWJkYS1mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFlQSxnRkErSEM7QUE5SUQsbUNBQWtDO0FBSWxDLHFDQUEyQztBQUMzQywwRUFBZ0Y7QUFFaEYscUNBQXFDO0FBRXJDLHNEQUFnRztBQUVoRyx5RUFBeUU7QUFDekUsaUVBQWlFO0FBQ2pFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUU5QixLQUFLLFVBQVUsa0NBQWtDLENBQ3RELFNBQWlCLEVBQ2pCLE1BQXNCLEVBQ3RCLG1CQUFtRDtJQUVuRCwyREFBMkQ7SUFDM0Qsc0dBQXNHO0lBQ3RHLDBFQUEwRTtJQUMxRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLHNCQUFzQixFQUFFLENBQUM7UUFDcEQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLGdFQUFnRTtJQUNoRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLG9CQUFvQixFQUFFLENBQUM7UUFDbEQsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3JELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFvQixFQUFFLENBQUM7SUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLHdCQUFlLEVBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzFGLGlCQUFpQixDQUFDLG9DQUFvQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTVELE1BQU0sWUFBWSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsNkJBQTZCLENBQzFFLFNBQVMsRUFDVCxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQ3pDLENBQUM7SUFDRixNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwRixJQUFJLFlBQVksSUFBSSwwQkFBMEIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLDJCQUEyQixDQUN4RCxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFDbkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUNuQyxtQkFBbUIsQ0FDcEIsQ0FBQztRQUVGLHFCQUFxQjtRQUNyQixJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRTVGLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDUCxNQUFNLEVBQUU7Z0JBQ04sS0FBSyxFQUFFLE1BQU07Z0JBQ2IsU0FBUyxFQUFFO29CQUNUO3dCQUNFLFNBQVM7d0JBQ1QsWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSTt3QkFDbEMsWUFBWSxFQUFFLFlBQVk7d0JBQzFCLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO3FCQUNyRDtvQkFDRCxHQUFHLFlBQVk7aUJBQ2hCO2FBQ0Y7WUFDRCxZQUFZLEVBQUUsSUFBSTtZQUNsQixPQUFPLEVBQUUsUUFBUTtZQUNqQixLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQVEsRUFBRSxFQUFFO2dCQUN4QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sVUFBVSxHQUFtQixFQUFFLENBQUM7Z0JBRXRDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3pGLElBQUksZ0JBQWdCLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUN4QyxNQUFNLDBCQUEwQixHQUFHLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDOzRCQUNqRSxZQUFZLEVBQUUsWUFBWTs0QkFDMUIsUUFBUSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFROzRCQUN4QyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUs7NEJBQ2xDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUTs0QkFDeEMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxlQUFlOzRCQUM5QyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWU7eUJBQ3ZELENBQUMsQ0FBQzt3QkFFSCxNQUFNLHNDQUFzQyxDQUFDLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDakcsQ0FBQztvQkFFRCxJQUFJLGdCQUFnQixDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDbEQsTUFBTSxhQUFhLEdBQTRDOzRCQUM3RCxZQUFZLEVBQUUsWUFBWTt5QkFDM0IsQ0FBQzt3QkFDRixJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7NEJBQzlELGFBQWEsQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQzt3QkFDMUUsQ0FBQzt3QkFDRCxJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7NEJBQzlELGFBQWEsQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQzt3QkFDMUUsQ0FBQzt3QkFDRCxNQUFNLDBCQUEwQixHQUFHLE1BQU0sTUFBTSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUMzRixNQUFNLHNDQUFzQyxDQUFDLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDakcsQ0FBQztvQkFFRCwwRUFBMEU7b0JBQzFFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssc0JBQXNCLENBQUMsQ0FBQztvQkFDdkYsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ3BCLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQzs0QkFDbEQsWUFBWSxFQUFFLFlBQVk7eUJBQzNCLENBQUMsQ0FBQzt3QkFFSCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLG9CQUFvQixDQUFDLENBQUM7d0JBQ3BGLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDOzRCQUNuQix1REFBdUQ7NEJBQ3ZELE1BQU0sYUFBYSxHQUFHLE1BQU0scUJBQXFCLENBQUM7NEJBQ2xELEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7Z0NBQzVCLFVBQVUsQ0FBQyxJQUFJLENBQ2IsTUFBTSxDQUFDLFdBQVcsQ0FBQztvQ0FDakIsWUFBWSxFQUFFLFlBQVk7b0NBQzFCLElBQUksRUFBRSxLQUFLLENBQUMsWUFBWTtvQ0FDeEIsZUFBZSxFQUFFLGFBQWEsQ0FBQyxPQUFPO2lDQUN2QyxDQUFDLENBQ0gsQ0FBQzs0QkFDSixDQUFDO3dCQUNILENBQUM7NkJBQU0sQ0FBQzs0QkFDTixVQUFVLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7d0JBQ3pDLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUVELHFDQUFxQztnQkFDckMsc0NBQXNDO2dCQUN0Qyx3RUFBd0U7Z0JBQ3hFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxNQUFzQjtJQUNsRCxNQUFNLEdBQUcsR0FBb0IsRUFBRSxDQUFDO0lBQ2hDLE1BQU0saUJBQWlCLEdBQUcsSUFBQSx3QkFBZSxFQUFDLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUN2RSxpQkFBaUIsQ0FBQyxvQ0FBb0MsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU1RCw2REFBNkQ7SUFDN0QsZ0VBQWdFO0lBRWhFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsMkJBQTJCLENBQ3hDLHVCQUFnRSxFQUNoRSxPQUFlLEVBQ2YsbUJBQW1EO0lBRW5EOzs7Ozs7Ozs7O09BVUc7SUFDSCxJQUFJLElBQUksR0FBbUMsU0FBUyxDQUFDO0lBQ3JELElBQUksV0FBVyxHQUF1QixTQUFTLENBQUM7SUFDaEQsSUFBSSxXQUFXLEdBQTBDLFNBQVMsQ0FBQztJQUVuRSxLQUFLLE1BQU0sZUFBZSxJQUFJLHVCQUF1QixFQUFFLENBQUM7UUFDdEQsTUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFN0QsUUFBUSxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLE1BQU07Z0JBQ1QsSUFBSSxRQUFRLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDO2dCQUVoRSxLQUFLLE1BQU0sV0FBVyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDL0MsUUFBUSxXQUFXLEVBQUUsQ0FBQzt3QkFDcEIsS0FBSyxVQUFVOzRCQUNiLFFBQVEsR0FBRyxNQUFNLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzs0QkFDOUYsTUFBTTt3QkFDUixLQUFLLE9BQU87NEJBQ1YsS0FBSyxHQUFHLE1BQU0sbUJBQW1CLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDOzRCQUMzRixNQUFNO3dCQUNSLEtBQUssaUJBQWlCOzRCQUNwQixlQUFlLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7NEJBQ3JHLE1BQU07d0JBQ1IsS0FBSyxVQUFVOzRCQUNiLFFBQVEsR0FBRyxNQUFNLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzs0QkFDOUYsTUFBTTt3QkFDUixLQUFLLFNBQVM7NEJBQ1osc0VBQXNFOzRCQUN0RSxNQUFNLFlBQVksR0FBRyxNQUFNLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzs0QkFDeEcsTUFBTSxlQUFlLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQzs0QkFDakYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dDQUNyQixPQUFPLFNBQVMsQ0FBQzs0QkFDbkIsQ0FBQzs0QkFDRCx5REFBeUQ7NEJBQ3pELE1BQU0sV0FBVyxHQUFHLCtCQUErQixDQUFDLGVBQWUsQ0FBQyxDQUFDOzRCQUNyRSxlQUFlLEdBQUcsTUFBTSxTQUFTLENBQUMsU0FBUyxXQUFXLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQzs0QkFDeEUsTUFBTTtvQkFDVixDQUFDO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxHQUFHO29CQUNMLFFBQVE7b0JBQ1IsS0FBSztvQkFDTCxlQUFlO29CQUNmLFFBQVE7b0JBQ1IsZUFBZTtpQkFDaEIsQ0FBQztnQkFDRixNQUFNO1lBQ1IsS0FBSyxhQUFhO2dCQUNoQixXQUFXLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BGLE1BQU07WUFDUixLQUFLLGFBQWE7Z0JBQ2hCLFdBQVcsR0FBRyxNQUFNLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEYsTUFBTTtZQUNSO2dCQUNFLGdFQUFnRTtnQkFDaEUsTUFBTSxJQUFJLGtCQUFZLENBQ3BCLDhIQUE4SCxDQUMvSCxDQUFDO1FBQ04sQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxXQUFXLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdGLE9BQU8sSUFBSSxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN2RSxDQUFDO0FBb0JEOzs7R0FHRztBQUNILFNBQVMsU0FBUyxDQUFDLFFBQWdCLEVBQUUsU0FBaUI7SUFDcEQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFFN0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxpQkFBUSxFQUFFLENBQUM7UUFFakMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQWEsRUFBRSxDQUFTLEVBQUUsUUFBb0IsRUFBRSxFQUFFO1lBQ3BFLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUM7UUFFRixTQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDMUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV4QixPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUN4QixJQUFJLEVBQUUsUUFBUTtZQUNkLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLG9EQUFvRDtTQUNqRyxDQUFDLENBQUM7UUFFSCxLQUFLLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMxQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsS0FBSyxVQUFVLHNDQUFzQyxDQUNuRCw0QkFBbUQsRUFDbkQsTUFBcUIsRUFDckIsWUFBb0I7SUFFcEIsTUFBTSxrQ0FBa0MsR0FDdEMsNEJBQTRCLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSw0QkFBNEIsQ0FBQyxXQUFXLEtBQUssT0FBTyxDQUFDO0lBRXhHLDhFQUE4RTtJQUM5RSw4RUFBOEU7SUFDOUUsbUVBQW1FO0lBQ25FLE1BQU0sWUFBWSxHQUFHLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoRSxNQUFNLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLEVBQUU7UUFDbEQsWUFBWSxFQUFFLFlBQVk7S0FDM0IsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsK0JBQStCLENBQUMsT0FBZTtJQUN0RCxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxtRkFBbUY7SUFDbkYseUpBQXlKO0lBQ3pKLE1BQU0sSUFBSSx1Q0FBc0IsQ0FDOUIsV0FBVyxPQUFPLDRFQUE0RSxDQUMvRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxTQUFpQixFQUFFLG1CQUFtRDtJQUN0Ryx3REFBd0Q7SUFDeEQsTUFBTSwyQkFBMkIsR0FBRyxtQkFBbUI7U0FDcEQsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1NBQzNCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3BELDREQUE0RDtJQUM1RCxNQUFNLDBCQUEwQixHQUFHLElBQUEsY0FBTyxFQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQzFFLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXJELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSwwQkFBMEIsRUFBRSxDQUFDO0FBQ3JFLENBQUM7QUFFRCxLQUFLLFVBQVUsa0JBQWtCLENBQy9CLFNBQWlCLEVBQ2pCLFlBQW9CLEVBQ3BCLG1CQUFtRDtJQUVuRCxNQUFNLFVBQVUsR0FBRyxNQUFNLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBRTVFLHNDQUFzQztJQUN0Qyx3RUFBd0U7SUFDeEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3RGLE1BQU0sSUFBSSxHQUFHLE1BQU0sbUJBQW1CLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRixPQUFPO1lBQ0wsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO1lBQ3RCLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNwQixZQUFZLEVBQUUsSUFBSTtZQUNsQixXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksZ0NBQWdDLFlBQVksR0FBRztZQUM5RSxRQUFRLEVBQUUsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7U0FDdkQsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFSixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUNqRTtRQUNFLFNBQVMsRUFBRSxDQUFDLENBQUMsU0FBUztRQUN0QixZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUk7UUFDcEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksK0JBQStCLFlBQVksR0FBRztRQUNwRSxRQUFRLEVBQUUsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7S0FDdkQsQ0FDRixDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsR0FBRyxRQUFRO1FBQ1gsR0FBRyxPQUFPO0tBQ1gsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXcml0YWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnR5RGlmZmVyZW5jZSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHR5cGUgeyBGdW5jdGlvbkNvbmZpZ3VyYXRpb24sIFVwZGF0ZUZ1bmN0aW9uQ29uZmlndXJhdGlvbkNvbW1hbmRJbnB1dCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1sYW1iZGEnO1xuaW1wb3J0IHR5cGUgeyBIb3Rzd2FwQ2hhbmdlIH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgY2xhc3NpZnlDaGFuZ2VzIH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vQGF3cy1jZGsvdG1wLXRvb2xraXQtaGVscGVycy9zcmMvYXBpJztcbmltcG9ydCB0eXBlIHsgQWZmZWN0ZWRSZXNvdXJjZSwgUmVzb3VyY2VDaGFuZ2UgfSBmcm9tICcuLi8uLi8uLi8uLi9AYXdzLWNkay90bXAtdG9vbGtpdC1oZWxwZXJzL3NyYy9hcGkvaW8vcGF5bG9hZHMvaG90c3dhcCc7XG5pbXBvcnQgeyBmbGF0TWFwIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IElMYW1iZGFDbGllbnQsIFNESyB9IGZyb20gJy4uL2F3cy1hdXRoJztcbmltcG9ydCB7IENmbkV2YWx1YXRpb25FeGNlcHRpb24sIHR5cGUgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlIH0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24nO1xuXG4vLyBuYW1lc3BhY2Ugb2JqZWN0IGltcG9ydHMgd29uJ3Qgd29yayBpbiB0aGUgYnVuZGxlIGZvciBmdW5jdGlvbiBleHBvcnRzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgYXJjaGl2ZXIgPSByZXF1aXJlKCdhcmNoaXZlcicpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNIb3Rzd2FwcGFibGVMYW1iZGFGdW5jdGlvbkNoYW5nZShcbiAgbG9naWNhbElkOiBzdHJpbmcsXG4gIGNoYW5nZTogUmVzb3VyY2VDaGFuZ2UsXG4gIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbik6IFByb21pc2U8SG90c3dhcENoYW5nZVtdPiB7XG4gIC8vIGlmIHRoZSBjaGFuZ2UgaXMgZm9yIGEgTGFtYmRhIFZlcnNpb24sIHdlIGp1c3QgaWdub3JlIGl0XG4gIC8vIHdlIHdpbGwgcHVibGlzaCBhIG5ldyB2ZXJzaW9uIHdoZW4gd2UgZ2V0IHRvIGhvdHN3YXBwaW5nIHRoZSBhY3R1YWwgRnVuY3Rpb24gdGhpcyBWZXJzaW9uIHBvaW50cyB0b1xuICAvLyAoVmVyc2lvbnMgY2FuJ3QgYmUgY2hhbmdlZCBpbiBDbG91ZEZvcm1hdGlvbiBhbnl3YXksIHRoZXkncmUgaW1tdXRhYmxlKVxuICBpZiAoY2hhbmdlLm5ld1ZhbHVlLlR5cGUgPT09ICdBV1M6OkxhbWJkYTo6VmVyc2lvbicpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyB3ZSBoYW5kbGUgQWxpYXNlcyBzcGVjaWFsbHkgdG9vXG4gIC8vIHRoZSBhY3R1YWwgYWxpYXMgdXBkYXRlIHdpbGwgaGFwcGVuIGlmIHdlIGNoYW5nZSB0aGUgZnVuY3Rpb25cbiAgaWYgKGNoYW5nZS5uZXdWYWx1ZS5UeXBlID09PSAnQVdTOjpMYW1iZGE6OkFsaWFzJykge1xuICAgIHJldHVybiBjbGFzc2lmeUFsaWFzQ2hhbmdlcyhjaGFuZ2UpO1xuICB9XG5cbiAgaWYgKGNoYW5nZS5uZXdWYWx1ZS5UeXBlICE9PSAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHJldDogSG90c3dhcENoYW5nZVtdID0gW107XG4gIGNvbnN0IGNsYXNzaWZpZWRDaGFuZ2VzID0gY2xhc3NpZnlDaGFuZ2VzKGNoYW5nZSwgWydDb2RlJywgJ0Vudmlyb25tZW50JywgJ0Rlc2NyaXB0aW9uJ10pO1xuICBjbGFzc2lmaWVkQ2hhbmdlcy5yZXBvcnROb25Ib3Rzd2FwcGFibGVQcm9wZXJ0eUNoYW5nZXMocmV0KTtcblxuICBjb25zdCBmdW5jdGlvbk5hbWUgPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmVzdGFibGlzaFJlc291cmNlUGh5c2ljYWxOYW1lKFxuICAgIGxvZ2ljYWxJZCxcbiAgICBjaGFuZ2UubmV3VmFsdWUuUHJvcGVydGllcz8uRnVuY3Rpb25OYW1lLFxuICApO1xuICBjb25zdCBuYW1lc09mSG90c3dhcHBhYmxlQ2hhbmdlcyA9IE9iamVjdC5rZXlzKGNsYXNzaWZpZWRDaGFuZ2VzLmhvdHN3YXBwYWJsZVByb3BzKTtcbiAgaWYgKGZ1bmN0aW9uTmFtZSAmJiBuYW1lc09mSG90c3dhcHBhYmxlQ2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbGFtYmRhQ29kZUNoYW5nZSA9IGF3YWl0IGV2YWx1YXRlTGFtYmRhRnVuY3Rpb25Qcm9wcyhcbiAgICAgIGNsYXNzaWZpZWRDaGFuZ2VzLmhvdHN3YXBwYWJsZVByb3BzLFxuICAgICAgY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlJ1bnRpbWUsXG4gICAgICBldmFsdWF0ZUNmblRlbXBsYXRlLFxuICAgICk7XG5cbiAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICBpZiAobGFtYmRhQ29kZUNoYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGF3YWl0IGRlcGVuZGFudFJlc291cmNlcyhsb2dpY2FsSWQsIGZ1bmN0aW9uTmFtZSwgZXZhbHVhdGVDZm5UZW1wbGF0ZSk7XG5cbiAgICByZXQucHVzaCh7XG4gICAgICBjaGFuZ2U6IHtcbiAgICAgICAgY2F1c2U6IGNoYW5nZSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbG9naWNhbElkLFxuICAgICAgICAgICAgcmVzb3VyY2VUeXBlOiBjaGFuZ2UubmV3VmFsdWUuVHlwZSxcbiAgICAgICAgICAgIHBoeXNpY2FsTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGV2YWx1YXRlQ2ZuVGVtcGxhdGUubWV0YWRhdGFGb3IobG9naWNhbElkKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmRlcGVuZGVuY2llcyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBob3Rzd2FwcGFibGU6IHRydWUsXG4gICAgICBzZXJ2aWNlOiAnbGFtYmRhJyxcbiAgICAgIGFwcGx5OiBhc3luYyAoc2RrOiBTREspID0+IHtcbiAgICAgICAgY29uc3QgbGFtYmRhID0gc2RrLmxhbWJkYSgpO1xuICAgICAgICBjb25zdCBvcGVyYXRpb25zOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuXG4gICAgICAgIGlmIChsYW1iZGFDb2RlQ2hhbmdlLmNvZGUgIT09IHVuZGVmaW5lZCB8fCBsYW1iZGFDb2RlQ2hhbmdlLmNvbmZpZ3VyYXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAobGFtYmRhQ29kZUNoYW5nZS5jb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUZ1bmN0aW9uQ29kZVJlc3BvbnNlID0gYXdhaXQgbGFtYmRhLnVwZGF0ZUZ1bmN0aW9uQ29kZSh7XG4gICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICBTM0J1Y2tldDogbGFtYmRhQ29kZUNoYW5nZS5jb2RlLnMzQnVja2V0LFxuICAgICAgICAgICAgICBTM0tleTogbGFtYmRhQ29kZUNoYW5nZS5jb2RlLnMzS2V5LFxuICAgICAgICAgICAgICBJbWFnZVVyaTogbGFtYmRhQ29kZUNoYW5nZS5jb2RlLmltYWdlVXJpLFxuICAgICAgICAgICAgICBaaXBGaWxlOiBsYW1iZGFDb2RlQ2hhbmdlLmNvZGUuZnVuY3Rpb25Db2RlWmlwLFxuICAgICAgICAgICAgICBTM09iamVjdFZlcnNpb246IGxhbWJkYUNvZGVDaGFuZ2UuY29kZS5zM09iamVjdFZlcnNpb24sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgd2FpdEZvckxhbWJkYXNQcm9wZXJ0aWVzVXBkYXRlVG9GaW5pc2godXBkYXRlRnVuY3Rpb25Db2RlUmVzcG9uc2UsIGxhbWJkYSwgZnVuY3Rpb25OYW1lKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobGFtYmRhQ29kZUNoYW5nZS5jb25maWd1cmF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVSZXF1ZXN0OiBVcGRhdGVGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kSW5wdXQgPSB7XG4gICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChsYW1iZGFDb2RlQ2hhbmdlLmNvbmZpZ3VyYXRpb25zLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdXBkYXRlUmVxdWVzdC5EZXNjcmlwdGlvbiA9IGxhbWJkYUNvZGVDaGFuZ2UuY29uZmlndXJhdGlvbnMuZGVzY3JpcHRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGFtYmRhQ29kZUNoYW5nZS5jb25maWd1cmF0aW9ucy5lbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZVJlcXVlc3QuRW52aXJvbm1lbnQgPSBsYW1iZGFDb2RlQ2hhbmdlLmNvbmZpZ3VyYXRpb25zLmVudmlyb25tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXBkYXRlRnVuY3Rpb25Db2RlUmVzcG9uc2UgPSBhd2FpdCBsYW1iZGEudXBkYXRlRnVuY3Rpb25Db25maWd1cmF0aW9uKHVwZGF0ZVJlcXVlc3QpO1xuICAgICAgICAgICAgYXdhaXQgd2FpdEZvckxhbWJkYXNQcm9wZXJ0aWVzVXBkYXRlVG9GaW5pc2godXBkYXRlRnVuY3Rpb25Db2RlUmVzcG9uc2UsIGxhbWJkYSwgZnVuY3Rpb25OYW1lKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBvbmx5IGlmIHRoZSBjb2RlIGNoYW5nZWQgaXMgdGhlcmUgYW55IHBvaW50IGluIHB1Ymxpc2hpbmcgYSBuZXcgVmVyc2lvblxuICAgICAgICAgIGNvbnN0IHZlcnNpb25zID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZCkgPT4gZC5yZXNvdXJjZVR5cGUgPT09ICdBV1M6OkxhbWJkYTo6VmVyc2lvbicpO1xuICAgICAgICAgIGlmICh2ZXJzaW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHB1Ymxpc2hWZXJzaW9uUHJvbWlzZSA9IGxhbWJkYS5wdWJsaXNoVmVyc2lvbih7XG4gICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFsaWFzZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkKSA9PiBkLnJlc291cmNlVHlwZSA9PT0gJ0FXUzo6TGFtYmRhOjpBbGlhcycpO1xuICAgICAgICAgICAgaWYgKGFsaWFzZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIFZlcnNpb24gdG8gZmluaXNoIHB1Ymxpc2hpbmdcbiAgICAgICAgICAgICAgY29uc3QgdmVyc2lvblVwZGF0ZSA9IGF3YWl0IHB1Ymxpc2hWZXJzaW9uUHJvbWlzZTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzKSB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgbGFtYmRhLnVwZGF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIE5hbWU6IGFsaWFzLnBoeXNpY2FsTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25WZXJzaW9uOiB2ZXJzaW9uVXBkYXRlLlZlcnNpb24sXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvcGVyYXRpb25zLnB1c2gocHVibGlzaFZlcnNpb25Qcm9taXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBydW4gYWxsIG9mIG91ciB1cGRhdGVzIGluIHBhcmFsbGVsXG4gICAgICAgIC8vIExpbWl0ZWQgc2V0IG9mIHVwZGF0ZXMgcGVyIGZ1bmN0aW9uXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChvcGVyYXRpb25zKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hpY2ggY2hhbmdlcyB0byB0aGlzIEFsaWFzIGFyZSBob3Rzd2FwcGFibGUgb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGNsYXNzaWZ5QWxpYXNDaGFuZ2VzKGNoYW5nZTogUmVzb3VyY2VDaGFuZ2UpOiBIb3Rzd2FwQ2hhbmdlW10ge1xuICBjb25zdCByZXQ6IEhvdHN3YXBDaGFuZ2VbXSA9IFtdO1xuICBjb25zdCBjbGFzc2lmaWVkQ2hhbmdlcyA9IGNsYXNzaWZ5Q2hhbmdlcyhjaGFuZ2UsIFsnRnVuY3Rpb25WZXJzaW9uJ10pO1xuICBjbGFzc2lmaWVkQ2hhbmdlcy5yZXBvcnROb25Ib3Rzd2FwcGFibGVQcm9wZXJ0eUNoYW5nZXMocmV0KTtcblxuICAvLyB3ZSBvbmx5IHdhbnQgdG8gcmVwb3J0IG5vdCBob3Rzd2FwcGFibGUgY2hhbmdlcyB0byBhbGlhc2VzXG4gIC8vIHRoZSBhY3R1YWwgYWxpYXMgdXBkYXRlIHdpbGwgaGFwcGVuIGlmIHdlIGNoYW5nZSB0aGUgZnVuY3Rpb25cblxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIEV2YWx1YXRlcyB0aGUgaG90c3dhcHBhYmxlIHByb3BlcnRpZXMgb2YgYW4gQVdTOjpMYW1iZGE6OkZ1bmN0aW9uIGFuZFxuICogUmV0dXJucyBhIGBMYW1iZGFGdW5jdGlvbkNoYW5nZWAgaWYgdGhlIGNoYW5nZSBpcyBob3Rzd2FwcGFibGUuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBjaGFuZ2UgaXMgbm90IGhvdHN3YXBwYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXZhbHVhdGVMYW1iZGFGdW5jdGlvblByb3BzKFxuICBob3Rzd2FwcGFibGVQcm9wQ2hhbmdlczogUmVjb3JkPHN0cmluZywgUHJvcGVydHlEaWZmZXJlbmNlPGFueT4+LFxuICBydW50aW1lOiBzdHJpbmcsXG4gIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbik6IFByb21pc2U8TGFtYmRhRnVuY3Rpb25DaGFuZ2UgfCB1bmRlZmluZWQ+IHtcbiAgLypcbiAgICogQXQgZmlyc3QgZ2xhbmNlLCB3ZSB3b3VsZCB3YW50IHRvIGluaXRpYWxpemUgdGhlc2UgdXNpbmcgdGhlIFwicHJldmlvdXNcIiB2YWx1ZXMgKGNoYW5nZS5vbGRWYWx1ZSksXG4gICAqIGluIGNhc2Ugb25seSBvbmUgb2YgdGhlbSBjaGFuZ2VkLCBsaWtlIHRoZSBrZXksIGFuZCB0aGUgQnVja2V0IHN0YXllZCB0aGUgc2FtZS5cbiAgICogSG93ZXZlciwgdGhhdCBhY3R1YWxseSBmYWlscyBmb3Igb2xkLXN0eWxlIHN5bnRoZXNpcywgd2hpY2ggdXNlcyBDRk4gUGFyYW1ldGVycyFcbiAgICogQmVjYXVzZSB0aGUgbmFtZXMgb2YgdGhlIFBhcmFtZXRlcnMgZGVwZW5kIG9uIHRoZSBoYXNoIG9mIHRoZSBBc3NldCxcbiAgICogdGhlIFBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIFwib2xkXCIgdmFsdWVzIG5vIGxvbmdlciBleGlzdCBpbiBgYXNzZXRQYXJhbXNgIGF0IHRoaXMgcG9pbnQsXG4gICAqIHdoaWNoIG1lYW5zIHdlIGRvbid0IGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGF2YWlsYWJsZSB0byBldmFsdWF0ZSB0aGUgQ0ZOIGV4cHJlc3Npb24gd2l0aC5cbiAgICogRm9ydHVuYXRlbHksIHRoZSBkaWZmIHdpbGwgYWx3YXlzIGluY2x1ZGUgYm90aCB0aGUgczNCdWNrZXQgYW5kIHMzS2V5IHBhcnRzIG9mIHRoZSBMYW1iZGEncyBDb2RlIHByb3BlcnR5LFxuICAgKiBldmVuIGlmIG9ubHkgb25lIG9mIHRoZW0gd2FzIGFjdHVhbGx5IGNoYW5nZWQsXG4gICAqIHdoaWNoIG1lYW5zIHdlIGRvbid0IG5lZWQgdGhlIFwib2xkXCIgdmFsdWVzIGF0IGFsbCwgYW5kIHdlIGNhbiBzYWZlbHkgaW5pdGlhbGl6ZSB0aGVzZSB3aXRoIGp1c3QgYCcnYC5cbiAgICovXG4gIGxldCBjb2RlOiBMYW1iZGFGdW5jdGlvbkNvZGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBsZXQgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCB1cGRhdGVkUHJvcE5hbWUgaW4gaG90c3dhcHBhYmxlUHJvcENoYW5nZXMpIHtcbiAgICBjb25zdCB1cGRhdGVkUHJvcCA9IGhvdHN3YXBwYWJsZVByb3BDaGFuZ2VzW3VwZGF0ZWRQcm9wTmFtZV07XG5cbiAgICBzd2l0Y2ggKHVwZGF0ZWRQcm9wTmFtZSkge1xuICAgICAgY2FzZSAnQ29kZSc6XG4gICAgICAgIGxldCBzM0J1Y2tldCwgczNLZXksIHMzT2JqZWN0VmVyc2lvbiwgaW1hZ2VVcmksIGZ1bmN0aW9uQ29kZVppcDtcblxuICAgICAgICBmb3IgKGNvbnN0IG5ld1Byb3BOYW1lIGluIHVwZGF0ZWRQcm9wLm5ld1ZhbHVlKSB7XG4gICAgICAgICAgc3dpdGNoIChuZXdQcm9wTmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnUzNCdWNrZXQnOlxuICAgICAgICAgICAgICBzM0J1Y2tldCA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHVwZGF0ZWRQcm9wLm5ld1ZhbHVlW25ld1Byb3BOYW1lXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnUzNLZXknOlxuICAgICAgICAgICAgICBzM0tleSA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHVwZGF0ZWRQcm9wLm5ld1ZhbHVlW25ld1Byb3BOYW1lXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnUzNPYmplY3RWZXJzaW9uJzpcbiAgICAgICAgICAgICAgczNPYmplY3RWZXJzaW9uID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odXBkYXRlZFByb3AubmV3VmFsdWVbbmV3UHJvcE5hbWVdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdJbWFnZVVyaSc6XG4gICAgICAgICAgICAgIGltYWdlVXJpID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odXBkYXRlZFByb3AubmV3VmFsdWVbbmV3UHJvcE5hbWVdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdaaXBGaWxlJzpcbiAgICAgICAgICAgICAgLy8gV2UgbXVzdCBjcmVhdGUgYSB6aXAgcGFja2FnZSBjb250YWluaW5nIGEgZmlsZSB3aXRoIHRoZSBpbmxpbmUgY29kZVxuICAgICAgICAgICAgICBjb25zdCBmdW5jdGlvbkNvZGUgPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbih1cGRhdGVkUHJvcC5uZXdWYWx1ZVtuZXdQcm9wTmFtZV0pO1xuICAgICAgICAgICAgICBjb25zdCBmdW5jdGlvblJ1bnRpbWUgPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihydW50aW1lKTtcbiAgICAgICAgICAgICAgaWYgKCFmdW5jdGlvblJ1bnRpbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGZpbGUgZXh0ZW5zaW9uIG11c3QgYmUgY2hvc2VuIGRlcGVuZGluZyBvbiB0aGUgcnVudGltZVxuICAgICAgICAgICAgICBjb25zdCBjb2RlRmlsZUV4dCA9IGRldGVybWluZUNvZGVGaWxlRXh0RnJvbVJ1bnRpbWUoZnVuY3Rpb25SdW50aW1lKTtcbiAgICAgICAgICAgICAgZnVuY3Rpb25Db2RlWmlwID0gYXdhaXQgemlwU3RyaW5nKGBpbmRleC4ke2NvZGVGaWxlRXh0fWAsIGZ1bmN0aW9uQ29kZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb2RlID0ge1xuICAgICAgICAgIHMzQnVja2V0LFxuICAgICAgICAgIHMzS2V5LFxuICAgICAgICAgIHMzT2JqZWN0VmVyc2lvbixcbiAgICAgICAgICBpbWFnZVVyaSxcbiAgICAgICAgICBmdW5jdGlvbkNvZGVaaXAsXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRGVzY3JpcHRpb24nOlxuICAgICAgICBkZXNjcmlwdGlvbiA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHVwZGF0ZWRQcm9wLm5ld1ZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFbnZpcm9ubWVudCc6XG4gICAgICAgIGVudmlyb25tZW50ID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odXBkYXRlZFByb3AubmV3VmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIHdlIHdpbGwgbmV2ZXIgZ2V0IGhlcmUsIGJ1dCBqdXN0IGluIGNhc2Ugd2UgZG8gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgICAnd2hpbGUgYXBwbHkoKWluZywgZm91bmQgYSBwcm9wZXJ0eSB0aGF0IGNhbm5vdCBiZSBob3Rzd2FwcGVkLiBQbGVhc2UgcmVwb3J0IHRoaXMgYXQgZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvbmV3L2Nob29zZScsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbnMgPSBkZXNjcmlwdGlvbiB8fCBlbnZpcm9ubWVudCA/IHsgZGVzY3JpcHRpb24sIGVudmlyb25tZW50IH0gOiB1bmRlZmluZWQ7XG4gIHJldHVybiBjb2RlIHx8IGNvbmZpZ3VyYXRpb25zID8geyBjb2RlLCBjb25maWd1cmF0aW9ucyB9IDogdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgTGFtYmRhRnVuY3Rpb25Db2RlIHtcbiAgcmVhZG9ubHkgczNCdWNrZXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHMzS2V5Pzogc3RyaW5nO1xuICByZWFkb25seSBzM09iamVjdFZlcnNpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltYWdlVXJpPzogc3RyaW5nO1xuICByZWFkb25seSBmdW5jdGlvbkNvZGVaaXA/OiBCdWZmZXI7XG59XG5cbmludGVyZmFjZSBMYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zIHtcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuaW50ZXJmYWNlIExhbWJkYUZ1bmN0aW9uQ2hhbmdlIHtcbiAgcmVhZG9ubHkgY29kZT86IExhbWJkYUZ1bmN0aW9uQ29kZTtcbiAgcmVhZG9ubHkgY29uZmlndXJhdGlvbnM/OiBMYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zO1xufVxuXG4vKipcbiAqIENvbXByZXNzIGEgc3RyaW5nIGFzIGEgZmlsZSwgcmV0dXJuaW5nIGEgcHJvbWlzZSBmb3IgdGhlIHppcCBidWZmZXJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtYXJjaGl2ZXIvaXNzdWVzLzM0MlxuICovXG5mdW5jdGlvbiB6aXBTdHJpbmcoZmlsZU5hbWU6IHN0cmluZywgcmF3U3RyaW5nOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlcnM6IEJ1ZmZlcltdID0gW107XG5cbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBuZXcgV3JpdGFibGUoKTtcblxuICAgIGNvbnZlcnRlci5fd3JpdGUgPSAoY2h1bms6IEJ1ZmZlciwgXzogc3RyaW5nLCBjYWxsYmFjazogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgYnVmZmVycy5wdXNoKGNodW5rKTtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICBjb252ZXJ0ZXIub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgIHJlc29sdmUoQnVmZmVyLmNvbmNhdChidWZmZXJzKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhcmNoaXZlID0gYXJjaGl2ZXIoJ3ppcCcpO1xuXG4gICAgYXJjaGl2ZS5vbignZXJyb3InLCAoZXJyOiBhbnkpID0+IHtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH0pO1xuXG4gICAgYXJjaGl2ZS5waXBlKGNvbnZlcnRlcik7XG5cbiAgICBhcmNoaXZlLmFwcGVuZChyYXdTdHJpbmcsIHtcbiAgICAgIG5hbWU6IGZpbGVOYW1lLFxuICAgICAgZGF0ZTogbmV3IERhdGUoJzE5ODAtMDEtMDFUMDA6MDA6MDAuMDAwWicpLCAvLyBBZGQgZGF0ZSB0byBtYWtlIHJlc3VsdGluZyB6aXAgZmlsZSBkZXRlcm1pbmlzdGljXG4gICAgfSk7XG5cbiAgICB2b2lkIGFyY2hpdmUuZmluYWxpemUoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQWZ0ZXIgYSBMYW1iZGEgRnVuY3Rpb24gaXMgdXBkYXRlZCwgaXQgY2Fubm90IGJlIHVwZGF0ZWQgYWdhaW4gdW50aWwgdGhlXG4gKiBgU3RhdGU9QWN0aXZlYCBhbmQgdGhlIGBMYXN0VXBkYXRlU3RhdHVzPVN1Y2Nlc3NmdWxgLlxuICpcbiAqIERlcGVuZGluZyBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgTGFtYmRhIEZ1bmN0aW9uIHRoaXMgY291bGQgaGFwcGVuIHJlbGF0aXZlbHkgcXVpY2tseVxuICogb3IgdmVyeSBzbG93bHkuIEZvciBleGFtcGxlLCBaaXAgYmFzZWQgZnVuY3Rpb25zIF9ub3RfIGluIGEgVlBDIGNhbiB0YWtlIH4xIHNlY29uZCB3aGVyZWFzIFZQQ1xuICogb3IgQ29udGFpbmVyIGZ1bmN0aW9ucyBjYW4gdGFrZSB+MjUgc2Vjb25kcyAoYW5kICdpZGxlJyBWUEMgZnVuY3Rpb25zIGNhbiB0YWtlIG1pbnV0ZXMpLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yTGFtYmRhc1Byb3BlcnRpZXNVcGRhdGVUb0ZpbmlzaChcbiAgY3VycmVudEZ1bmN0aW9uQ29uZmlndXJhdGlvbjogRnVuY3Rpb25Db25maWd1cmF0aW9uLFxuICBsYW1iZGE6IElMYW1iZGFDbGllbnQsXG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZ1bmN0aW9uSXNJblZwY09yVXNlc0RvY2tlckZvckNvZGUgPVxuICAgIGN1cnJlbnRGdW5jdGlvbkNvbmZpZ3VyYXRpb24uVnBjQ29uZmlnPy5WcGNJZCB8fCBjdXJyZW50RnVuY3Rpb25Db25maWd1cmF0aW9uLlBhY2thZ2VUeXBlID09PSAnSW1hZ2UnO1xuXG4gIC8vIGlmIHRoZSBmdW5jdGlvbiBpcyBkZXBsb3llZCBpbiBhIFZQQyBvciBpZiBpdCBpcyBhIGNvbnRhaW5lciBpbWFnZSBmdW5jdGlvblxuICAvLyB0aGVuIHRoZSB1cGRhdGUgd2lsbCB0YWtlIG11Y2ggbG9uZ2VyIGFuZCB3ZSBjYW4gd2FpdCBsb25nZXIgYmV0d2VlbiBjaGVja3NcbiAgLy8gb3RoZXJ3aXNlLCB0aGUgdXBkYXRlIHdpbGwgYmUgcXVpY2ssIHNvIGEgMS1zZWNvbmQgZGVsYXkgaXMgZmluZVxuICBjb25zdCBkZWxheVNlY29uZHMgPSBmdW5jdGlvbklzSW5WcGNPclVzZXNEb2NrZXJGb3JDb2RlID8gNSA6IDE7XG5cbiAgYXdhaXQgbGFtYmRhLndhaXRVbnRpbEZ1bmN0aW9uVXBkYXRlZChkZWxheVNlY29uZHMsIHtcbiAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGZpbGUgZXh0ZW5zaW9uIGZyb20gTGFtYmRhIHJ1bnRpbWUgc3RyaW5nLlxuICogV2UgdXNlIHRoaXMgZXh0ZW5zaW9uIHRvIGNyZWF0ZSBhIGRlcGxveW1lbnQgcGFja2FnZSBmcm9tIExhbWJkYSBpbmxpbmUgY29kZS5cbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lQ29kZUZpbGVFeHRGcm9tUnVudGltZShydW50aW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocnVudGltZS5zdGFydHNXaXRoKCdub2RlJykpIHtcbiAgICByZXR1cm4gJ2pzJztcbiAgfVxuICBpZiAocnVudGltZS5zdGFydHNXaXRoKCdweXRob24nKSkge1xuICAgIHJldHVybiAncHknO1xuICB9XG4gIC8vIEN1cnJlbnRseSBpbmxpbmUgY29kZSBvbmx5IHN1cHBvcnRzIE5vZGUuanMgYW5kIFB5dGhvbiwgaWdub3Jpbmcgb3RoZXIgcnVudGltZXMuXG4gIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWxhbWJkYS1mdW5jdGlvbi1jb2RlLmh0bWwjYXdzLXByb3BlcnRpZXMtbGFtYmRhLWZ1bmN0aW9uLWNvZGUtcHJvcGVydGllc1xuICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihcbiAgICBgcnVudGltZSAke3J1bnRpbWV9IGlzIHVuc3VwcG9ydGVkLCBvbmx5IG5vZGUuanMgYW5kIHB5dGhvbiBydW50aW1lcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC5gLFxuICApO1xufVxuXG4vKipcbiAqIEZpbmRzIGFsbCBWZXJzaW9ucyB0aGF0IHJlZmVyZW5jZSBhbiBBV1M6OkxhbWJkYTo6RnVuY3Rpb24gd2l0aCBsb2dpY2FsIElEIGBsb2dpY2FsSWRgXG4gKiBhbmQgQWxpYXNlcyB0aGF0IHJlZmVyZW5jZSB0aG9zZSBWZXJzaW9ucy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdmVyc2lvbnNBbmRBbGlhc2VzKGxvZ2ljYWxJZDogc3RyaW5nLCBldmFsdWF0ZUNmblRlbXBsYXRlOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUpIHtcbiAgLy8gZmluZCBhbGwgTGFtYmRhIFZlcnNpb25zIHRoYXQgcmVmZXJlbmNlIHRoaXMgRnVuY3Rpb25cbiAgY29uc3QgdmVyc2lvbnNSZWZlcmVuY2luZ0Z1bmN0aW9uID0gZXZhbHVhdGVDZm5UZW1wbGF0ZVxuICAgIC5maW5kUmVmZXJlbmNlc1RvKGxvZ2ljYWxJZClcbiAgICAuZmlsdGVyKChyKSA9PiByLlR5cGUgPT09ICdBV1M6OkxhbWJkYTo6VmVyc2lvbicpO1xuICAvLyBmaW5kIGFsbCBMYW1iZGEgQWxpYXNlcyB0aGF0IHJlZmVyZW5jZSB0aGUgYWJvdmUgVmVyc2lvbnNcbiAgY29uc3QgYWxpYXNlc1JlZmVyZW5jaW5nVmVyc2lvbnMgPSBmbGF0TWFwKHZlcnNpb25zUmVmZXJlbmNpbmdGdW5jdGlvbiwgdiA9PlxuICAgIGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZmluZFJlZmVyZW5jZXNUbyh2LkxvZ2ljYWxJZCkpO1xuXG4gIHJldHVybiB7IHZlcnNpb25zUmVmZXJlbmNpbmdGdW5jdGlvbiwgYWxpYXNlc1JlZmVyZW5jaW5nVmVyc2lvbnMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVwZW5kYW50UmVzb3VyY2VzKFxuICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbik6IFByb21pc2U8QXJyYXk8QWZmZWN0ZWRSZXNvdXJjZT4+IHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IGF3YWl0IHZlcnNpb25zQW5kQWxpYXNlcyhsb2dpY2FsSWQsIGV2YWx1YXRlQ2ZuVGVtcGxhdGUpO1xuXG4gIC8vIExpbWl0ZWQgc2V0IG9mIHVwZGF0ZXMgcGVyIGZ1bmN0aW9uXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICBjb25zdCBhbGlhc2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2FuZGlkYXRlcy5hbGlhc2VzUmVmZXJlbmNpbmdWZXJzaW9ucy5tYXAoYXN5bmMgKGEpID0+IHtcbiAgICBjb25zdCBuYW1lID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oYS5Qcm9wZXJ0aWVzPy5OYW1lKTtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naWNhbElkOiBhLkxvZ2ljYWxJZCxcbiAgICAgIHJlc291cmNlVHlwZTogYS5UeXBlLFxuICAgICAgcGh5c2ljYWxOYW1lOiBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGAke2EuVHlwZX0gJyR7bmFtZX0nIGZvciBBV1M6OkxhbWJkYTo6RnVuY3Rpb24gJyR7ZnVuY3Rpb25OYW1lfSdgLFxuICAgICAgbWV0YWRhdGE6IGV2YWx1YXRlQ2ZuVGVtcGxhdGUubWV0YWRhdGFGb3IoYS5Mb2dpY2FsSWQpLFxuICAgIH07XG4gIH0pKTtcblxuICBjb25zdCB2ZXJzaW9ucyA9IGNhbmRpZGF0ZXMudmVyc2lvbnNSZWZlcmVuY2luZ0Z1bmN0aW9uLm1hcCgodikgPT4gKFxuICAgIHtcbiAgICAgIGxvZ2ljYWxJZDogdi5Mb2dpY2FsSWQsXG4gICAgICByZXNvdXJjZVR5cGU6IHYuVHlwZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgJHt2LlR5cGV9IGZvciBBV1M6OkxhbWJkYTo6RnVuY3Rpb24gJyR7ZnVuY3Rpb25OYW1lfSdgLFxuICAgICAgbWV0YWRhdGE6IGV2YWx1YXRlQ2ZuVGVtcGxhdGUubWV0YWRhdGFGb3Iodi5Mb2dpY2FsSWQpLFxuICAgIH1cbiAgKSk7XG5cbiAgcmV0dXJuIFtcbiAgICAuLi52ZXJzaW9ucyxcbiAgICAuLi5hbGlhc2VzLFxuICBdO1xufVxuIl19
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { HotswapChange } from './common';
|
|
2
|
-
import type { ResourceChange } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/payloads/hotswap';
|
|
3
|
-
import type { EvaluateCloudFormationTemplate } from '../cloudformation';
|
|
4
|
-
export declare function isHotswappableS3BucketDeploymentChange(logicalId: string, change: ResourceChange, evaluateCfnTemplate: EvaluateCloudFormationTemplate): Promise<HotswapChange[]>;
|
|
5
|
-
export declare function skipChangeForS3DeployCustomResourcePolicy(iamPolicyLogicalId: string, change: ResourceChange, evaluateCfnTemplate: EvaluateCloudFormationTemplate): Promise<boolean>;
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isHotswappableS3BucketDeploymentChange = isHotswappableS3BucketDeploymentChange;
|
|
4
|
-
exports.skipChangeForS3DeployCustomResourcePolicy = skipChangeForS3DeployCustomResourcePolicy;
|
|
5
|
-
/**
|
|
6
|
-
* This means that the value is required to exist by CloudFormation's Custom Resource API (or our S3 Bucket Deployment Lambda's API)
|
|
7
|
-
* but the actual value specified is irrelevant
|
|
8
|
-
*/
|
|
9
|
-
const REQUIRED_BY_CFN = 'required-to-be-present-by-cfn';
|
|
10
|
-
const CDK_BUCKET_DEPLOYMENT_CFN_TYPE = 'Custom::CDKBucketDeployment';
|
|
11
|
-
async function isHotswappableS3BucketDeploymentChange(logicalId, change, evaluateCfnTemplate) {
|
|
12
|
-
// In old-style synthesis, the policy used by the lambda to copy assets Ref's the assets directly,
|
|
13
|
-
// meaning that the changes made to the Policy are artifacts that can be safely ignored
|
|
14
|
-
const ret = [];
|
|
15
|
-
if (change.newValue.Type !== CDK_BUCKET_DEPLOYMENT_CFN_TYPE) {
|
|
16
|
-
return [];
|
|
17
|
-
}
|
|
18
|
-
// no classification to be done here; all the properties of this custom resource thing are hotswappable
|
|
19
|
-
const customResourceProperties = await evaluateCfnTemplate.evaluateCfnExpression({
|
|
20
|
-
...change.newValue.Properties,
|
|
21
|
-
ServiceToken: undefined,
|
|
22
|
-
});
|
|
23
|
-
// note that this gives the ARN of the lambda, not the name. This is fine though, the invoke() sdk call will take either
|
|
24
|
-
const functionName = await evaluateCfnTemplate.evaluateCfnExpression(change.newValue.Properties?.ServiceToken);
|
|
25
|
-
if (!functionName) {
|
|
26
|
-
return ret;
|
|
27
|
-
}
|
|
28
|
-
ret.push({
|
|
29
|
-
change: {
|
|
30
|
-
cause: change,
|
|
31
|
-
resources: [{
|
|
32
|
-
logicalId,
|
|
33
|
-
physicalName: customResourceProperties.DestinationBucketName,
|
|
34
|
-
resourceType: CDK_BUCKET_DEPLOYMENT_CFN_TYPE,
|
|
35
|
-
description: `Contents of AWS::S3::Bucket '${customResourceProperties.DestinationBucketName}'`,
|
|
36
|
-
metadata: evaluateCfnTemplate.metadataFor(logicalId),
|
|
37
|
-
}],
|
|
38
|
-
},
|
|
39
|
-
hotswappable: true,
|
|
40
|
-
service: 'custom-s3-deployment',
|
|
41
|
-
apply: async (sdk) => {
|
|
42
|
-
await sdk.lambda().invokeCommand({
|
|
43
|
-
FunctionName: functionName,
|
|
44
|
-
// Lambda refuses to take a direct JSON object and requires it to be stringify()'d
|
|
45
|
-
Payload: JSON.stringify({
|
|
46
|
-
RequestType: 'Update',
|
|
47
|
-
ResponseURL: REQUIRED_BY_CFN,
|
|
48
|
-
PhysicalResourceId: REQUIRED_BY_CFN,
|
|
49
|
-
StackId: REQUIRED_BY_CFN,
|
|
50
|
-
RequestId: REQUIRED_BY_CFN,
|
|
51
|
-
LogicalResourceId: REQUIRED_BY_CFN,
|
|
52
|
-
ResourceProperties: stringifyObject(customResourceProperties), // JSON.stringify() doesn't turn the actual objects to strings, but the lambda expects strings
|
|
53
|
-
}),
|
|
54
|
-
});
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
return ret;
|
|
58
|
-
}
|
|
59
|
-
async function skipChangeForS3DeployCustomResourcePolicy(iamPolicyLogicalId, change, evaluateCfnTemplate) {
|
|
60
|
-
if (change.newValue.Type !== 'AWS::IAM::Policy') {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
const roles = change.newValue.Properties?.Roles;
|
|
64
|
-
// If no roles are referenced, the policy is definitely not used for a S3Deployment
|
|
65
|
-
if (!roles || !roles.length) {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
// Check if every role this policy is referenced by is only used for a S3Deployment
|
|
69
|
-
for (const role of roles) {
|
|
70
|
-
const roleArn = await evaluateCfnTemplate.evaluateCfnExpression(role);
|
|
71
|
-
const roleLogicalId = await evaluateCfnTemplate.findLogicalIdForPhysicalName(roleArn);
|
|
72
|
-
// We must assume this role is used for something else, because we can't check it
|
|
73
|
-
if (!roleLogicalId) {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
// Find all interesting reference to the role
|
|
77
|
-
const roleRefs = evaluateCfnTemplate
|
|
78
|
-
.findReferencesTo(roleLogicalId)
|
|
79
|
-
// we are not interested in the reference from the original policy - it always exists
|
|
80
|
-
.filter((roleRef) => !(roleRef.Type == 'AWS::IAM::Policy' && roleRef.LogicalId === iamPolicyLogicalId));
|
|
81
|
-
// Check if the role is only used for S3Deployment
|
|
82
|
-
// We know this is the case, if S3Deployment -> Lambda -> Role is satisfied for every reference
|
|
83
|
-
// And we have at least one reference.
|
|
84
|
-
const isRoleOnlyForS3Deployment = roleRefs.length >= 1 &&
|
|
85
|
-
roleRefs.every((roleRef) => {
|
|
86
|
-
if (roleRef.Type === 'AWS::Lambda::Function') {
|
|
87
|
-
const lambdaRefs = evaluateCfnTemplate.findReferencesTo(roleRef.LogicalId);
|
|
88
|
-
// Every reference must be to the custom resource and at least one reference must be present
|
|
89
|
-
return (lambdaRefs.length >= 1 && lambdaRefs.every((lambdaRef) => lambdaRef.Type === 'Custom::CDKBucketDeployment'));
|
|
90
|
-
}
|
|
91
|
-
return false;
|
|
92
|
-
});
|
|
93
|
-
// We have determined this role is used for something else, so we can't skip the change
|
|
94
|
-
if (!isRoleOnlyForS3Deployment) {
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
// We have checked that any use of this policy is only for S3Deployment and we can safely skip it
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
function stringifyObject(obj) {
|
|
102
|
-
if (obj == null) {
|
|
103
|
-
return obj;
|
|
104
|
-
}
|
|
105
|
-
if (Array.isArray(obj)) {
|
|
106
|
-
return obj.map(stringifyObject);
|
|
107
|
-
}
|
|
108
|
-
if (typeof obj !== 'object') {
|
|
109
|
-
return obj.toString();
|
|
110
|
-
}
|
|
111
|
-
const ret = {};
|
|
112
|
-
for (const [k, v] of Object.entries(obj)) {
|
|
113
|
-
ret[k] = stringifyObject(v);
|
|
114
|
-
}
|
|
115
|
-
return ret;
|
|
116
|
-
}
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMtYnVja2V0LWRlcGxveW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiczMtYnVja2V0LWRlcGxveW1lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsd0ZBd0RDO0FBRUQsOEZBdURDO0FBekhEOzs7R0FHRztBQUNILE1BQU0sZUFBZSxHQUFHLCtCQUErQixDQUFDO0FBRXhELE1BQU0sOEJBQThCLEdBQUcsNkJBQTZCLENBQUM7QUFFOUQsS0FBSyxVQUFVLHNDQUFzQyxDQUMxRCxTQUFpQixFQUNqQixNQUFzQixFQUN0QixtQkFBbUQ7SUFFbkQsa0dBQWtHO0lBQ2xHLHVGQUF1RjtJQUN2RixNQUFNLEdBQUcsR0FBb0IsRUFBRSxDQUFDO0lBRWhDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssOEJBQThCLEVBQUUsQ0FBQztRQUM1RCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCx1R0FBdUc7SUFDdkcsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDO1FBQy9FLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVO1FBQzdCLFlBQVksRUFBRSxTQUFTO0tBQ3hCLENBQUMsQ0FBQztJQUVILHdIQUF3SDtJQUN4SCxNQUFNLFlBQVksR0FBRyxNQUFNLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQy9HLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ1AsTUFBTSxFQUFFO1lBQ04sS0FBSyxFQUFFLE1BQU07WUFDYixTQUFTLEVBQUUsQ0FBQztvQkFDVixTQUFTO29CQUNULFlBQVksRUFBRSx3QkFBd0IsQ0FBQyxxQkFBcUI7b0JBQzVELFlBQVksRUFBRSw4QkFBOEI7b0JBQzVD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Q0FBQyxDQUFDO1FBRUwsdUZBQXVGO1FBQ3ZGLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxpR0FBaUc7SUFDakcsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsR0FBUTtJQUMvQixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNoQixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUIsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUF5QixFQUFFLENBQUM7SUFDckMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEhvdHN3YXBDaGFuZ2UgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vLi4vLi4vQGF3cy1jZGsvdG1wLXRvb2xraXQtaGVscGVycy9zcmMvYXBpL2lvL3BheWxvYWRzL2hvdHN3YXAnO1xuaW1wb3J0IHR5cGUgeyBTREsgfSBmcm9tICcuLi9hd3MtYXV0aCc7XG5pbXBvcnQgdHlwZSB7IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSB9IGZyb20gJy4uL2Nsb3VkZm9ybWF0aW9uJztcblxuLyoqXG4gKiBUaGlzIG1lYW5zIHRoYXQgdGhlIHZhbHVlIGlzIHJlcXVpcmVkIHRvIGV4aXN0IGJ5IENsb3VkRm9ybWF0aW9uJ3MgQ3VzdG9tIFJlc291cmNlIEFQSSAob3Igb3VyIFMzIEJ1Y2tldCBEZXBsb3ltZW50IExhbWJkYSdzIEFQSSlcbiAqIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHNwZWNpZmllZCBpcyBpcnJlbGV2YW50XG4gKi9cbmNvbnN0IFJFUVVJUkVEX0JZX0NGTiA9ICdyZXF1aXJlZC10by1iZS1wcmVzZW50LWJ5LWNmbic7XG5cbmNvbnN0IENES19CVUNLRVRfREVQTE9ZTUVOVF9DRk5fVFlQRSA9ICdDdXN0b206OkNES0J1Y2tldERlcGxveW1lbnQnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNIb3Rzd2FwcGFibGVTM0J1Y2tldERlcGxveW1lbnRDaGFuZ2UoXG4gIGxvZ2ljYWxJZDogc3RyaW5nLFxuICBjaGFuZ2U6IFJlc291cmNlQ2hhbmdlLFxuICBldmFsdWF0ZUNmblRlbXBsYXRlOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUsXG4pOiBQcm9taXNlPEhvdHN3YXBDaGFuZ2VbXT4ge1xuICAvLyBJbiBvbGQtc3R5bGUgc3ludGhlc2lzLCB0aGUgcG9saWN5IHVzZWQgYnkgdGhlIGxhbWJkYSB0byBjb3B5IGFzc2V0cyBSZWYncyB0aGUgYXNzZXRzIGRpcmVjdGx5LFxuICAvLyBtZWFuaW5nIHRoYXQgdGhlIGNoYW5nZXMgbWFkZSB0byB0aGUgUG9saWN5IGFyZSBhcnRpZmFjdHMgdGhhdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWRcbiAgY29uc3QgcmV0OiBIb3Rzd2FwQ2hhbmdlW10gPSBbXTtcblxuICBpZiAoY2hhbmdlLm5ld1ZhbHVlLlR5cGUgIT09IENES19CVUNLRVRfREVQTE9ZTUVOVF9DRk5fVFlQRSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIG5vIGNsYXNzaWZpY2F0aW9uIHRvIGJlIGRvbmUgaGVyZTsgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgY3VzdG9tIHJlc291cmNlIHRoaW5nIGFyZSBob3Rzd2FwcGFibGVcbiAgY29uc3QgY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oe1xuICAgIC4uLmNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzLFxuICAgIFNlcnZpY2VUb2tlbjogdW5kZWZpbmVkLFxuICB9KTtcblxuICAvLyBub3RlIHRoYXQgdGhpcyBnaXZlcyB0aGUgQVJOIG9mIHRoZSBsYW1iZGEsIG5vdCB0aGUgbmFtZS4gVGhpcyBpcyBmaW5lIHRob3VnaCwgdGhlIGludm9rZSgpIHNkayBjYWxsIHdpbGwgdGFrZSBlaXRoZXJcbiAgY29uc3QgZnVuY3Rpb25OYW1lID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlNlcnZpY2VUb2tlbik7XG4gIGlmICghZnVuY3Rpb25OYW1lKSB7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHJldC5wdXNoKHtcbiAgICBjaGFuZ2U6IHtcbiAgICAgIGNhdXNlOiBjaGFuZ2UsXG4gICAgICByZXNvdXJjZXM6IFt7XG4gICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgcGh5c2ljYWxOYW1lOiBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXMuRGVzdGluYXRpb25CdWNrZXROYW1lLFxuICAgICAgICByZXNvdXJjZVR5cGU6IENES19CVUNLRVRfREVQTE9ZTUVOVF9DRk5fVFlQRSxcbiAgICAgICAgZGVzY3JpcHRpb246IGBDb250ZW50cyBvZiBBV1M6OlMzOjpCdWNrZXQgJyR7Y3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzLkRlc3RpbmF0aW9uQnVja2V0TmFtZX0nYCxcbiAgICAgICAgbWV0YWRhdGE6IGV2YWx1YXRlQ2ZuVGVtcGxhdGUubWV0YWRhdGFGb3IobG9naWNhbElkKSxcbiAgICAgIH1dLFxuICAgIH0sXG4gICAgaG90c3dhcHBhYmxlOiB0cnVlLFxuICAgIHNlcnZpY2U6ICdjdXN0b20tczMtZGVwbG95bWVudCcsXG4gICAgYXBwbHk6IGFzeW5jIChzZGs6IFNESykgPT4ge1xuICAgICAgYXdhaXQgc2RrLmxhbWJkYSgpLmludm9rZUNvbW1hbmQoe1xuICAgICAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgLy8gTGFtYmRhIHJlZnVzZXMgdG8gdGFrZSBhIGRpcmVjdCBKU09OIG9iamVjdCBhbmQgcmVxdWlyZXMgaXQgdG8gYmUgc3RyaW5naWZ5KCknZFxuICAgICAgICBQYXlsb2FkOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgUmVxdWVzdFR5cGU6ICdVcGRhdGUnLFxuICAgICAgICAgIFJlc3BvbnNlVVJMOiBSRVFVSVJFRF9CWV9DRk4sXG4gICAgICAgICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBSRVFVSVJFRF9CWV9DRk4sXG4gICAgICAgICAgU3RhY2tJZDogUkVRVUlSRURfQllfQ0ZOLFxuICAgICAgICAgIFJlcXVlc3RJZDogUkVRVUlSRURfQllfQ0ZOLFxuICAgICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBSRVFVSVJFRF9CWV9DRk4sXG4gICAgICAgICAgUmVzb3VyY2VQcm9wZXJ0aWVzOiBzdHJpbmdpZnlPYmplY3QoY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzKSwgLy8gSlNPTi5zdHJpbmdpZnkoKSBkb2Vzbid0IHR1cm4gdGhlIGFjdHVhbCBvYmplY3RzIHRvIHN0cmluZ3MsIGJ1dCB0aGUgbGFtYmRhIGV4cGVjdHMgc3RyaW5nc1xuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBza2lwQ2hhbmdlRm9yUzNEZXBsb3lDdXN0b21SZXNvdXJjZVBvbGljeShcbiAgaWFtUG9saWN5TG9naWNhbElkOiBzdHJpbmcsXG4gIGNoYW5nZTogUmVzb3VyY2VDaGFuZ2UsXG4gIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoY2hhbmdlLm5ld1ZhbHVlLlR5cGUgIT09ICdBV1M6OklBTTo6UG9saWN5Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCByb2xlczogc3RyaW5nW10gPSBjaGFuZ2UubmV3VmFsdWUuUHJvcGVydGllcz8uUm9sZXM7XG5cbiAgLy8gSWYgbm8gcm9sZXMgYXJlIHJlZmVyZW5jZWQsIHRoZSBwb2xpY3kgaXMgZGVmaW5pdGVseSBub3QgdXNlZCBmb3IgYSBTM0RlcGxveW1lbnRcbiAgaWYgKCFyb2xlcyB8fCAhcm9sZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgZXZlcnkgcm9sZSB0aGlzIHBvbGljeSBpcyByZWZlcmVuY2VkIGJ5IGlzIG9ubHkgdXNlZCBmb3IgYSBTM0RlcGxveW1lbnRcbiAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgY29uc3Qgcm9sZUFybiA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHJvbGUpO1xuICAgIGNvbnN0IHJvbGVMb2dpY2FsSWQgPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmZpbmRMb2dpY2FsSWRGb3JQaHlzaWNhbE5hbWUocm9sZUFybik7XG5cbiAgICAvLyBXZSBtdXN0IGFzc3VtZSB0aGlzIHJvbGUgaXMgdXNlZCBmb3Igc29tZXRoaW5nIGVsc2UsIGJlY2F1c2Ugd2UgY2FuJ3QgY2hlY2sgaXRcbiAgICBpZiAoIXJvbGVMb2dpY2FsSWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIGFsbCBpbnRlcmVzdGluZyByZWZlcmVuY2UgdG8gdGhlIHJvbGVcbiAgICBjb25zdCByb2xlUmVmcyA9IGV2YWx1YXRlQ2ZuVGVtcGxhdGVcbiAgICAgIC5maW5kUmVmZXJlbmNlc1RvKHJvbGVMb2dpY2FsSWQpXG4gICAgICAvLyB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBvcmlnaW5hbCBwb2xpY3kgLSBpdCBhbHdheXMgZXhpc3RzXG4gICAgICAuZmlsdGVyKChyb2xlUmVmKSA9PiAhKHJvbGVSZWYuVHlwZSA9PSAnQVdTOjpJQU06OlBvbGljeScgJiYgcm9sZVJlZi5Mb2dpY2FsSWQgPT09IGlhbVBvbGljeUxvZ2ljYWxJZCkpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJvbGUgaXMgb25seSB1c2VkIGZvciBTM0RlcGxveW1lbnRcbiAgICAvLyBXZSBrbm93IHRoaXMgaXMgdGhlIGNhc2UsIGlmIFMzRGVwbG95bWVudCAtPiBMYW1iZGEgLT4gUm9sZSBpcyBzYXRpc2ZpZWQgZm9yIGV2ZXJ5IHJlZmVyZW5jZVxuICAgIC8vIEFuZCB3ZSBoYXZlIGF0IGxlYXN0IG9uZSByZWZlcmVuY2UuXG4gICAgY29uc3QgaXNSb2xlT25seUZvclMzRGVwbG95bWVudCA9XG4gICAgICByb2xlUmVmcy5sZW5ndGggPj0gMSAmJlxuICAgICAgcm9sZVJlZnMuZXZlcnkoKHJvbGVSZWYpID0+IHtcbiAgICAgICAgaWYgKHJvbGVSZWYuVHlwZSA9PT0gJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zdCBsYW1iZGFSZWZzID0gZXZhbHVhdGVDZm5UZW1wbGF0ZS5maW5kUmVmZXJlbmNlc1RvKHJvbGVSZWYuTG9naWNhbElkKTtcbiAgICAgICAgICAvLyBFdmVyeSByZWZlcmVuY2UgbXVzdCBiZSB0byB0aGUgY3VzdG9tIHJlc291cmNlIGFuZCBhdCBsZWFzdCBvbmUgcmVmZXJlbmNlIG11c3QgYmUgcHJlc2VudFxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBsYW1iZGFSZWZzLmxlbmd0aCA+PSAxICYmIGxhbWJkYVJlZnMuZXZlcnkoKGxhbWJkYVJlZikgPT4gbGFtYmRhUmVmLlR5cGUgPT09ICdDdXN0b206OkNES0J1Y2tldERlcGxveW1lbnQnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAvLyBXZSBoYXZlIGRldGVybWluZWQgdGhpcyByb2xlIGlzIHVzZWQgZm9yIHNvbWV0aGluZyBlbHNlLCBzbyB3ZSBjYW4ndCBza2lwIHRoZSBjaGFuZ2VcbiAgICBpZiAoIWlzUm9sZU9ubHlGb3JTM0RlcGxveW1lbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBXZSBoYXZlIGNoZWNrZWQgdGhhdCBhbnkgdXNlIG9mIHRoaXMgcG9saWN5IGlzIG9ubHkgZm9yIFMzRGVwbG95bWVudCBhbmQgd2UgY2FuIHNhZmVseSBza2lwIGl0XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3Qob2JqOiBhbnkpOiBhbnkge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLm1hcChzdHJpbmdpZnlPYmplY3QpO1xuICB9XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvYmoudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGNvbnN0IHJldDogeyBbazogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIHJldFtrXSA9IHN0cmluZ2lmeU9iamVjdCh2KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIl19
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { type HotswapChange } from './common';
|
|
2
|
-
import type { ResourceChange } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/payloads/hotswap';
|
|
3
|
-
import type { EvaluateCloudFormationTemplate } from '../cloudformation';
|
|
4
|
-
export declare function isHotswappableStateMachineChange(logicalId: string, change: ResourceChange, evaluateCfnTemplate: EvaluateCloudFormationTemplate): Promise<HotswapChange[]>;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isHotswappableStateMachineChange = isHotswappableStateMachineChange;
|
|
4
|
-
const common_1 = require("./common");
|
|
5
|
-
async function isHotswappableStateMachineChange(logicalId, change, evaluateCfnTemplate) {
|
|
6
|
-
if (change.newValue.Type !== 'AWS::StepFunctions::StateMachine') {
|
|
7
|
-
return [];
|
|
8
|
-
}
|
|
9
|
-
const ret = [];
|
|
10
|
-
const classifiedChanges = (0, common_1.classifyChanges)(change, ['DefinitionString']);
|
|
11
|
-
classifiedChanges.reportNonHotswappablePropertyChanges(ret);
|
|
12
|
-
const namesOfHotswappableChanges = Object.keys(classifiedChanges.hotswappableProps);
|
|
13
|
-
if (namesOfHotswappableChanges.length > 0) {
|
|
14
|
-
const stateMachineNameInCfnTemplate = change.newValue?.Properties?.StateMachineName;
|
|
15
|
-
const stateMachineArn = stateMachineNameInCfnTemplate
|
|
16
|
-
? await evaluateCfnTemplate.evaluateCfnExpression({
|
|
17
|
-
'Fn::Sub': 'arn:${AWS::Partition}:states:${AWS::Region}:${AWS::AccountId}:stateMachine:' +
|
|
18
|
-
stateMachineNameInCfnTemplate,
|
|
19
|
-
})
|
|
20
|
-
: await evaluateCfnTemplate.findPhysicalNameFor(logicalId);
|
|
21
|
-
// nothing to do
|
|
22
|
-
if (!stateMachineArn) {
|
|
23
|
-
return ret;
|
|
24
|
-
}
|
|
25
|
-
ret.push({
|
|
26
|
-
change: {
|
|
27
|
-
cause: change,
|
|
28
|
-
resources: [{
|
|
29
|
-
logicalId,
|
|
30
|
-
resourceType: change.newValue.Type,
|
|
31
|
-
physicalName: stateMachineArn?.split(':')[6],
|
|
32
|
-
metadata: evaluateCfnTemplate.metadataFor(logicalId),
|
|
33
|
-
}],
|
|
34
|
-
},
|
|
35
|
-
hotswappable: true,
|
|
36
|
-
service: 'stepfunctions-service',
|
|
37
|
-
apply: async (sdk) => {
|
|
38
|
-
// not passing the optional properties leaves them unchanged
|
|
39
|
-
await sdk.stepFunctions().updateStateMachine({
|
|
40
|
-
stateMachineArn,
|
|
41
|
-
definition: await evaluateCfnTemplate.evaluateCfnExpression(change.propertyUpdates.DefinitionString.newValue),
|
|
42
|
-
});
|
|
43
|
-
},
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
return ret;
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcGZ1bmN0aW9ucy1zdGF0ZS1tYWNoaW5lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0ZXBmdW5jdGlvbnMtc3RhdGUtbWFjaGluZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSw0RUFtREM7QUF4REQscUNBQStEO0FBS3hELEtBQUssVUFBVSxnQ0FBZ0MsQ0FDcEQsU0FBaUIsRUFDakIsTUFBc0IsRUFDdEIsbUJBQW1EO0lBRW5ELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssa0NBQWtDLEVBQUUsQ0FBQztRQUNoRSxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBb0IsRUFBRSxDQUFDO0lBQ2hDLE1BQU0saUJBQWlCLEdBQUcsSUFBQSx3QkFBZSxFQUFDLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUN4RSxpQkFBaUIsQ0FBQyxvQ0FBb0MsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU1RCxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwRixJQUFJLDBCQUEwQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxQyxNQUFNLDZCQUE2QixHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixDQUFDO1FBQ3BGLE1BQU0sZUFBZSxHQUFHLDZCQUE2QjtZQUNuRCxDQUFDLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDaEQsU0FBUyxFQUNMLDZFQUE2RTtvQkFDN0UsNkJBQTZCO2FBQ2xDLENBQUM7WUFDRixDQUFDLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU3RCxnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDUCxNQUFNLEVBQUU7Z0JBQ04sS0FBSyxFQUFFLE1BQU07Z0JBQ2IsU0FBUyxFQUFFLENBQUM7d0JBQ1YsU0FBUzt3QkFDVCxZQUFZLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJO3dCQUNsQyxZQUFZLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzVDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO3FCQUNyRCxDQUFDO2FBQ0g7WUFDRCxZQUFZLEVBQUUsSUFBSTtZQUNsQixPQUFPLEVBQUUsdUJBQXVCO1lBQ2hDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7Z0JBQ3hCLDREQUE0RDtnQkFDNUQsTUFBTSxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsa0JBQWtCLENBQUM7b0JBQzNDLGVBQWU7b0JBQ2YsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7aUJBQzlHLENBQUMsQ0FBQztZQUNMLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBIb3Rzd2FwQ2hhbmdlLCBjbGFzc2lmeUNoYW5nZXMgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vLi4vLi4vQGF3cy1jZGsvdG1wLXRvb2xraXQtaGVscGVycy9zcmMvYXBpL2lvL3BheWxvYWRzL2hvdHN3YXAnO1xuaW1wb3J0IHR5cGUgeyBTREsgfSBmcm9tICcuLi9hd3MtYXV0aCc7XG5pbXBvcnQgdHlwZSB7IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSB9IGZyb20gJy4uL2Nsb3VkZm9ybWF0aW9uJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzSG90c3dhcHBhYmxlU3RhdGVNYWNoaW5lQ2hhbmdlKFxuICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgY2hhbmdlOiBSZXNvdXJjZUNoYW5nZSxcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuKTogUHJvbWlzZTxIb3Rzd2FwQ2hhbmdlW10+IHtcbiAgaWYgKGNoYW5nZS5uZXdWYWx1ZS5UeXBlICE9PSAnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHJldDogSG90c3dhcENoYW5nZVtdID0gW107XG4gIGNvbnN0IGNsYXNzaWZpZWRDaGFuZ2VzID0gY2xhc3NpZnlDaGFuZ2VzKGNoYW5nZSwgWydEZWZpbml0aW9uU3RyaW5nJ10pO1xuICBjbGFzc2lmaWVkQ2hhbmdlcy5yZXBvcnROb25Ib3Rzd2FwcGFibGVQcm9wZXJ0eUNoYW5nZXMocmV0KTtcblxuICBjb25zdCBuYW1lc09mSG90c3dhcHBhYmxlQ2hhbmdlcyA9IE9iamVjdC5rZXlzKGNsYXNzaWZpZWRDaGFuZ2VzLmhvdHN3YXBwYWJsZVByb3BzKTtcbiAgaWYgKG5hbWVzT2ZIb3Rzd2FwcGFibGVDaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBzdGF0ZU1hY2hpbmVOYW1lSW5DZm5UZW1wbGF0ZSA9IGNoYW5nZS5uZXdWYWx1ZT8uUHJvcGVydGllcz8uU3RhdGVNYWNoaW5lTmFtZTtcbiAgICBjb25zdCBzdGF0ZU1hY2hpbmVBcm4gPSBzdGF0ZU1hY2hpbmVOYW1lSW5DZm5UZW1wbGF0ZVxuICAgICAgPyBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbih7XG4gICAgICAgICdGbjo6U3ViJzpcbiAgICAgICAgICAgICdhcm46JHtBV1M6OlBhcnRpdGlvbn06c3RhdGVzOiR7QVdTOjpSZWdpb259OiR7QVdTOjpBY2NvdW50SWR9OnN0YXRlTWFjaGluZTonICtcbiAgICAgICAgICAgIHN0YXRlTWFjaGluZU5hbWVJbkNmblRlbXBsYXRlLFxuICAgICAgfSlcbiAgICAgIDogYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5maW5kUGh5c2ljYWxOYW1lRm9yKGxvZ2ljYWxJZCk7XG5cbiAgICAvLyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCFzdGF0ZU1hY2hpbmVBcm4pIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgcmV0LnB1c2goe1xuICAgICAgY2hhbmdlOiB7XG4gICAgICAgIGNhdXNlOiBjaGFuZ2UsXG4gICAgICAgIHJlc291cmNlczogW3tcbiAgICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgICAgcmVzb3VyY2VUeXBlOiBjaGFuZ2UubmV3VmFsdWUuVHlwZSxcbiAgICAgICAgICBwaHlzaWNhbE5hbWU6IHN0YXRlTWFjaGluZUFybj8uc3BsaXQoJzonKVs2XSxcbiAgICAgICAgICBtZXRhZGF0YTogZXZhbHVhdGVDZm5UZW1wbGF0ZS5tZXRhZGF0YUZvcihsb2dpY2FsSWQpLFxuICAgICAgICB9XSxcbiAgICAgIH0sXG4gICAgICBob3Rzd2FwcGFibGU6IHRydWUsXG4gICAgICBzZXJ2aWNlOiAnc3RlcGZ1bmN0aW9ucy1zZXJ2aWNlJyxcbiAgICAgIGFwcGx5OiBhc3luYyAoc2RrOiBTREspID0+IHtcbiAgICAgICAgLy8gbm90IHBhc3NpbmcgdGhlIG9wdGlvbmFsIHByb3BlcnRpZXMgbGVhdmVzIHRoZW0gdW5jaGFuZ2VkXG4gICAgICAgIGF3YWl0IHNkay5zdGVwRnVuY3Rpb25zKCkudXBkYXRlU3RhdGVNYWNoaW5lKHtcbiAgICAgICAgICBzdGF0ZU1hY2hpbmVBcm4sXG4gICAgICAgICAgZGVmaW5pdGlvbjogYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oY2hhbmdlLnByb3BlcnR5VXBkYXRlcy5EZWZpbml0aW9uU3RyaW5nLm5ld1ZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ==
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { CloudFormationStackArtifact, Environment } from '@aws-cdk/cx-api';
|
|
2
|
-
import type { IoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
|
|
3
|
-
import type { SDK, SdkProvider } from '../aws-auth';
|
|
4
|
-
/**
|
|
5
|
-
* Configuration needed to monitor CloudWatch Log Groups
|
|
6
|
-
* found in a given CloudFormation Stack
|
|
7
|
-
*/
|
|
8
|
-
export interface FoundLogGroupsResult {
|
|
9
|
-
/**
|
|
10
|
-
* The resolved environment (account/region) that the log
|
|
11
|
-
* groups are deployed in
|
|
12
|
-
*/
|
|
13
|
-
readonly env: Environment;
|
|
14
|
-
/**
|
|
15
|
-
* The SDK that can be used to read events from the CloudWatch
|
|
16
|
-
* Log Groups in the given environment
|
|
17
|
-
*/
|
|
18
|
-
readonly sdk: SDK;
|
|
19
|
-
/**
|
|
20
|
-
* The names of the relevant CloudWatch Log Groups
|
|
21
|
-
* in the given CloudFormation template
|
|
22
|
-
*/
|
|
23
|
-
readonly logGroupNames: string[];
|
|
24
|
-
}
|
|
25
|
-
export declare function findCloudWatchLogGroups(sdkProvider: SdkProvider, ioHelper: IoHelper, stackArtifact: CloudFormationStackArtifact): Promise<FoundLogGroupsResult>;
|