@aws-cdk/toolkit-lib 1.24.0 → 1.25.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/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/actions/deploy/index.d.ts +15 -1
- package/lib/actions/deploy/index.js +1 -1
- package/lib/actions/deploy/private/deployment-method.d.ts +5 -9
- package/lib/actions/deploy/private/deployment-method.js +8 -1
- package/lib/actions/diagnose/index.d.ts +89 -0
- package/lib/actions/diagnose/index.js +3 -0
- package/lib/actions/diff/private/helpers.js +12 -15
- package/lib/actions/index.d.ts +2 -0
- package/lib/actions/index.js +3 -1
- package/lib/actions/orphan/index.d.ts +18 -0
- package/lib/actions/orphan/index.js +3 -0
- package/lib/api/aws-auth/sdk.d.ts +2 -1
- package/lib/api/aws-auth/sdk.js +2 -1
- package/lib/api/bootstrap/bootstrap-environment.js +4 -4
- package/lib/api/bootstrap/bootstrap-template.yaml +5 -16
- package/lib/api/bootstrap/deploy-bootstrap.js +9 -1
- package/lib/api/cloud-assembly/stack-selector.d.ts +1 -1
- package/lib/api/cloud-assembly/stack-selector.js +1 -1
- package/lib/api/cloudformation/index.d.ts +1 -0
- package/lib/api/cloudformation/index.js +2 -1
- package/lib/api/cloudformation/logical-id-map.d.ts +24 -0
- package/lib/api/cloudformation/logical-id-map.js +45 -0
- package/lib/api/cloudformation/stack-helpers.d.ts +6 -0
- package/lib/api/cloudformation/stack-helpers.js +12 -1
- package/lib/api/deployments/cfn-api.d.ts +8 -17
- package/lib/api/deployments/cfn-api.js +60 -71
- package/lib/api/deployments/deploy-stack.d.ts +6 -2
- package/lib/api/deployments/deploy-stack.js +43 -61
- package/lib/api/deployments/deployments.d.ts +3 -2
- package/lib/api/deployments/deployments.js +31 -7
- package/lib/api/diagnosing/changeset-error-fetcher.d.ts +51 -0
- package/lib/api/diagnosing/changeset-error-fetcher.js +83 -0
- package/lib/api/diagnosing/diagnosis-formatting.d.ts +13 -0
- package/lib/api/diagnosing/diagnosis-formatting.js +140 -0
- package/lib/api/diagnosing/stack-diagnoser.d.ts +106 -0
- package/lib/api/diagnosing/stack-diagnoser.js +354 -0
- package/lib/api/diagnosing/tree-builder.d.ts +13 -0
- package/lib/api/diagnosing/tree-builder.js +86 -0
- package/lib/api/diagnosing/tree.d.ts +19 -0
- package/lib/api/diagnosing/tree.js +72 -0
- package/lib/api/diff/diff-formatter.js +8 -12
- package/lib/api/drift/drift-formatter.d.ts +0 -1
- package/lib/api/drift/drift-formatter.js +3 -10
- package/lib/api/hotswap/hotswap-deployments.js +14 -2
- package/lib/api/hotswap/hotswap-template-cache.d.ts +19 -0
- package/lib/api/hotswap/hotswap-template-cache.js +96 -0
- package/lib/api/index.d.ts +1 -0
- package/lib/api/index.js +2 -1
- package/lib/api/io/private/messages.d.ts +5 -0
- package/lib/api/io/private/messages.js +23 -1
- package/lib/api/io/toolkit-action.d.ts +1 -1
- package/lib/api/io/toolkit-action.js +1 -1
- package/lib/api/orphan/orphaner.d.ts +75 -0
- package/lib/api/orphan/orphaner.js +246 -0
- package/lib/api/orphan/private/helpers.d.ts +56 -0
- package/lib/api/orphan/private/helpers.js +219 -0
- package/lib/api/orphan/private/index.d.ts +2 -0
- package/lib/api/orphan/private/index.js +18 -0
- package/lib/api/resource-import/importer.d.ts +5 -1
- package/lib/api/resource-import/importer.js +26 -6
- package/lib/api/settings.d.ts +3 -1
- package/lib/api/settings.js +16 -3
- package/lib/api/source-tracing/index.d.ts +2 -0
- package/lib/api/source-tracing/index.js +18 -0
- package/lib/api/source-tracing/private/source-tracing.d.ts +16 -0
- package/lib/api/source-tracing/private/source-tracing.js +8 -0
- package/lib/api/source-tracing/private/stack-source-tracing.d.ts +32 -0
- package/lib/api/source-tracing/private/stack-source-tracing.js +134 -0
- package/lib/api/source-tracing/types.d.ts +9 -0
- package/lib/api/source-tracing/types.js +3 -0
- package/lib/api/stack-events/resource-errors.d.ts +82 -0
- package/lib/api/stack-events/resource-errors.js +129 -0
- package/lib/api/stack-events/stack-activity-monitor.d.ts +2 -29
- package/lib/api/stack-events/stack-activity-monitor.js +6 -95
- package/lib/api/stack-events/stack-event-poller.d.ts +71 -8
- package/lib/api/stack-events/stack-event-poller.js +107 -13
- package/lib/api/stack-events/stack-progress-monitor.d.ts +2 -2
- package/lib/api/stack-events/stack-progress-monitor.js +8 -2
- package/lib/api/work-graph/work-graph.d.ts +4 -0
- package/lib/api/work-graph/work-graph.js +6 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/index_bg.wasm +0 -0
- package/lib/toolkit/toolkit.d.ts +17 -1
- package/lib/toolkit/toolkit.js +194 -57
- package/lib/util/arrays.d.ts +1 -0
- package/lib/util/arrays.js +23 -1
- package/lib/util/type-brands.d.ts +1 -1
- package/lib/util/type-brands.js +1 -1
- package/package.json +13 -13
- package/lib/api/deployments/early-validation.d.ts +0 -19
- package/lib/api/deployments/early-validation.js +0 -57
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { StackEvent } from '@aws-sdk/client-cloudformation';
|
|
2
|
+
import type { ResourceEvent } from './stack-event-poller';
|
|
3
|
+
export interface ResourceError {
|
|
4
|
+
/**
|
|
5
|
+
* The stack this resource error occurred in
|
|
6
|
+
*
|
|
7
|
+
* NOTE: This will be a stack ID (which is a full ARN including the unique identifier),
|
|
8
|
+
* not just a name.
|
|
9
|
+
*/
|
|
10
|
+
readonly stackArn: string;
|
|
11
|
+
/**
|
|
12
|
+
* IDs of parent stacks of the resource, in case of resources in nested stacks
|
|
13
|
+
*/
|
|
14
|
+
readonly parentStackLogicalIds: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Logical ID of the resource
|
|
17
|
+
*
|
|
18
|
+
* (May be absent in case this message is about the stack itself)
|
|
19
|
+
*/
|
|
20
|
+
readonly logicalId?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Resource type
|
|
23
|
+
*/
|
|
24
|
+
readonly resourceType?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Physical ID of the resource
|
|
27
|
+
*/
|
|
28
|
+
readonly physicalId?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Error message of the resource
|
|
31
|
+
*/
|
|
32
|
+
readonly message: string;
|
|
33
|
+
/**
|
|
34
|
+
* Error code of the resource
|
|
35
|
+
*/
|
|
36
|
+
readonly errorCode?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Class used to send stack event errors into, to come up with root causes.
|
|
40
|
+
*/
|
|
41
|
+
export declare class ResourceErrors {
|
|
42
|
+
/**
|
|
43
|
+
* A list of all non-cancellation errors we have seen.
|
|
44
|
+
*
|
|
45
|
+
* By the nature of the order we see events in, will be ordered from oldest to newest.
|
|
46
|
+
*/
|
|
47
|
+
private readonly _errors;
|
|
48
|
+
isEmpty(): boolean;
|
|
49
|
+
get all(): ReadonlyArray<ResourceError>;
|
|
50
|
+
/**
|
|
51
|
+
* Update the error collection with the given stack activity
|
|
52
|
+
*
|
|
53
|
+
* May be from a nested stack as well.
|
|
54
|
+
*
|
|
55
|
+
* This class expects to see all events in chronological order.
|
|
56
|
+
*/
|
|
57
|
+
update(...events: ResourceEvent[]): void;
|
|
58
|
+
/**
|
|
59
|
+
* Take our best guess at the error code of the root cause
|
|
60
|
+
*
|
|
61
|
+
* The first error that occurs is the root cause.
|
|
62
|
+
*/
|
|
63
|
+
get rootCauseErrorCode(): string | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Return error messages of all encountered errors (that aren't cancellations)
|
|
66
|
+
*/
|
|
67
|
+
get allErrorMessages(): string[];
|
|
68
|
+
/**
|
|
69
|
+
* Return error codeds of all encountered errors (that aren't cancellations nor stack errors)
|
|
70
|
+
*
|
|
71
|
+
* We don't need to include nested stack errors because our poller will poll the nested stack,
|
|
72
|
+
* and have returned the actual error as well.
|
|
73
|
+
*/
|
|
74
|
+
get allErrorCodes(): string[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Extract an error code from the given stack event.
|
|
78
|
+
*
|
|
79
|
+
* Always contains the services, and includes the handler error code if available.
|
|
80
|
+
*/
|
|
81
|
+
export declare function extractErrorCode(event: StackEvent): string;
|
|
82
|
+
//# sourceMappingURL=resource-errors.d.ts.map
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResourceErrors = void 0;
|
|
4
|
+
exports.extractErrorCode = extractErrorCode;
|
|
5
|
+
const toolkit_error_1 = require("../../toolkit/toolkit-error");
|
|
6
|
+
const cloudformation_1 = require("../../util/cloudformation");
|
|
7
|
+
/**
|
|
8
|
+
* Class used to send stack event errors into, to come up with root causes.
|
|
9
|
+
*/
|
|
10
|
+
class ResourceErrors {
|
|
11
|
+
/**
|
|
12
|
+
* A list of all non-cancellation errors we have seen.
|
|
13
|
+
*
|
|
14
|
+
* By the nature of the order we see events in, will be ordered from oldest to newest.
|
|
15
|
+
*/
|
|
16
|
+
_errors = [];
|
|
17
|
+
isEmpty() {
|
|
18
|
+
return this._errors.length === 0;
|
|
19
|
+
}
|
|
20
|
+
get all() {
|
|
21
|
+
return this._errors;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Update the error collection with the given stack activity
|
|
25
|
+
*
|
|
26
|
+
* May be from a nested stack as well.
|
|
27
|
+
*
|
|
28
|
+
* This class expects to see all events in chronological order.
|
|
29
|
+
*/
|
|
30
|
+
update(...events) {
|
|
31
|
+
for (const event of events) {
|
|
32
|
+
if ((0, cloudformation_1.isErrorEvent)(event.event)) {
|
|
33
|
+
// Cancelled is not an interesting failure reason, nor is the stack message (stack
|
|
34
|
+
// message will just say something like "stack failed to update")
|
|
35
|
+
if (!(0, cloudformation_1.isCancellationEvent)(event.event) && (0, cloudformation_1.isRegularResourceEvent)(event.event)) {
|
|
36
|
+
this._errors.push(errorFromEvent(event));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Take our best guess at the error code of the root cause
|
|
43
|
+
*
|
|
44
|
+
* The first error that occurs is the root cause.
|
|
45
|
+
*/
|
|
46
|
+
get rootCauseErrorCode() {
|
|
47
|
+
return this.allErrorCodes[0];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Return error messages of all encountered errors (that aren't cancellations)
|
|
51
|
+
*/
|
|
52
|
+
get allErrorMessages() {
|
|
53
|
+
return this._errors.map(e => e.message);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Return error codeds of all encountered errors (that aren't cancellations nor stack errors)
|
|
57
|
+
*
|
|
58
|
+
* We don't need to include nested stack errors because our poller will poll the nested stack,
|
|
59
|
+
* and have returned the actual error as well.
|
|
60
|
+
*/
|
|
61
|
+
get allErrorCodes() {
|
|
62
|
+
return this._errors.map(e => e.errorCode).filter(x => typeof x === 'string');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.ResourceErrors = ResourceErrors;
|
|
66
|
+
function errorFromEvent(ev) {
|
|
67
|
+
// FIXME: Check hooks
|
|
68
|
+
return {
|
|
69
|
+
logicalId: ev.event.LogicalResourceId ?? '',
|
|
70
|
+
message: ev.event.ResourceStatusReason ?? '',
|
|
71
|
+
parentStackLogicalIds: ev.parentStackLogicalIds,
|
|
72
|
+
resourceType: ev.event.ResourceType ?? '',
|
|
73
|
+
stackArn: ev.event.StackId ?? '',
|
|
74
|
+
errorCode: extractErrorCode(ev.event),
|
|
75
|
+
physicalId: ev.event.PhysicalResourceId,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Extract an error code from the given stack event.
|
|
80
|
+
*
|
|
81
|
+
* Always contains the services, and includes the handler error code if available.
|
|
82
|
+
*/
|
|
83
|
+
function extractErrorCode(event) {
|
|
84
|
+
const isOurCustomResource = OUR_CUSTOM_RESOURCE_TYPES.includes(event.ResourceType ?? '');
|
|
85
|
+
// Get the resource type; if it is non-AWS then we are done.
|
|
86
|
+
const resourceTypeParts = (event.ResourceType ?? '').split('::');
|
|
87
|
+
if (resourceTypeParts[0] !== 'AWS' && !isOurCustomResource) {
|
|
88
|
+
return toolkit_error_1.DeploymentErrorCodes.PRIVATE_RESOURCE_ERROR;
|
|
89
|
+
}
|
|
90
|
+
const resourceType = isOurCustomResource ? resourceTypeParts.join('') : resourceTypeParts.slice(1).join('');
|
|
91
|
+
const reason = event.ResourceStatusReason ?? '';
|
|
92
|
+
const errorRe = /(?:HandlerErrorCode:|Error Code:) ([a-zA-Z0-9:-]+)/;
|
|
93
|
+
const handlerCode = reason.match(errorRe);
|
|
94
|
+
return `${resourceType}:${handlerCode ? handlerCode[1] : toolkit_error_1.DeploymentErrorCodes.UNKNOWN_ERROR}`;
|
|
95
|
+
}
|
|
96
|
+
// Some custom resource types that the CDK standard library creates that we
|
|
97
|
+
// would like to see it if they fail.
|
|
98
|
+
const OUR_CUSTOM_RESOURCE_TYPES = [
|
|
99
|
+
'Custom::AWS',
|
|
100
|
+
'Custom::AWSCDK-EKS-Cluster',
|
|
101
|
+
'Custom::AWSCDK-EKS-FargateProfile',
|
|
102
|
+
'Custom::AWSCDK-EKS-HelmChart',
|
|
103
|
+
'Custom::AWSCDK-EKS-KubernetesObjectValue',
|
|
104
|
+
'Custom::AWSCDK-EKS-KubernetesPatch',
|
|
105
|
+
'Custom::AWSCDK-EKS-KubernetesResource',
|
|
106
|
+
'Custom::AWSCDKCfnJson',
|
|
107
|
+
'Custom::AWSCDKCfnJsonStringify',
|
|
108
|
+
'Custom::AWSCDKOpenIdConnectProvider',
|
|
109
|
+
'Custom::CDKBucketDeployment',
|
|
110
|
+
'Custom::CloudwatchLogResourcePolicy',
|
|
111
|
+
'Custom::CrossAccountZoneDelegation',
|
|
112
|
+
'Custom::CrossRegionExportReader',
|
|
113
|
+
'Custom::CrossRegionExportWriter',
|
|
114
|
+
'Custom::CrossRegionStringParameterReader',
|
|
115
|
+
'Custom::DeleteExistingRecordSet',
|
|
116
|
+
'Custom::DescribeCognitoUserPoolClient',
|
|
117
|
+
'Custom::DynamoDBReplica',
|
|
118
|
+
'Custom::ECRAutoDeleteImages',
|
|
119
|
+
'Custom::ElasticsearchAccessPolicy',
|
|
120
|
+
'Custom::LogRetention',
|
|
121
|
+
'Custom::OpenSearchAccessPolicy',
|
|
122
|
+
'Custom::S3AutoDeleteObjects',
|
|
123
|
+
'Custom::S3BucketNotifications',
|
|
124
|
+
'Custom::SyntheticsAutoDeleteUnderlyingResources',
|
|
125
|
+
'Custom::Trigger',
|
|
126
|
+
'Custom::UserPoolCloudFrontDomainName',
|
|
127
|
+
'Custom::VpcRestrictDefaultSG',
|
|
128
|
+
];
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVzb3VyY2UtZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW1JQSw0Q0FpQkM7QUFsSkQsK0RBQW1FO0FBQ25FLDhEQUFzRztBQTRDdEc7O0dBRUc7QUFDSCxNQUFhLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNjLE9BQU8sR0FBb0IsRUFBRSxDQUFDO0lBRXhDLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsR0FBRyxNQUF1QjtRQUN0QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksSUFBQSw2QkFBWSxFQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixrRkFBa0Y7Z0JBQ2xGLGlFQUFpRTtnQkFDakUsSUFBSSxDQUFDLElBQUEsb0NBQW1CLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUEsdUNBQXNCLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzdFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxF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SUFDakIsc0NBQXNDO0lBQ3RDLDhCQUE4QjtDQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdGFja0V2ZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VFdmVudCB9IGZyb20gJy4vc3RhY2stZXZlbnQtcG9sbGVyJztcbmltcG9ydCB7IERlcGxveW1lbnRFcnJvckNvZGVzIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcbmltcG9ydCB7IGlzQ2FuY2VsbGF0aW9uRXZlbnQsIGlzRXJyb3JFdmVudCwgaXNSZWd1bGFyUmVzb3VyY2VFdmVudCB9IGZyb20gJy4uLy4uL3V0aWwvY2xvdWRmb3JtYXRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlRXJyb3Ige1xuICAvKipcbiAgICogVGhlIHN0YWNrIHRoaXMgcmVzb3VyY2UgZXJyb3Igb2NjdXJyZWQgaW5cbiAgICpcbiAgICogTk9URTogVGhpcyB3aWxsIGJlIGEgc3RhY2sgSUQgKHdoaWNoIGlzIGEgZnVsbCBBUk4gaW5jbHVkaW5nIHRoZSB1bmlxdWUgaWRlbnRpZmllciksXG4gICAqIG5vdCBqdXN0IGEgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElEcyBvZiBwYXJlbnQgc3RhY2tzIG9mIHRoZSByZXNvdXJjZSwgaW4gY2FzZSBvZiByZXNvdXJjZXMgaW4gbmVzdGVkIHN0YWNrc1xuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTG9naWNhbCBJRCBvZiB0aGUgcmVzb3VyY2VcbiAgICpcbiAgICogKE1heSBiZSBhYnNlbnQgaW4gY2FzZSB0aGlzIG1lc3NhZ2UgaXMgYWJvdXQgdGhlIHN0YWNrIGl0c2VsZilcbiAgICovXG4gIHJlYWRvbmx5IGxvZ2ljYWxJZD86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaHlzaWNhbCBJRCBvZiB0aGUgcmVzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IHBoeXNpY2FsSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVycm9yIG1lc3NhZ2Ugb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVycm9yIGNvZGUgb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSBlcnJvckNvZGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2xhc3MgdXNlZCB0byBzZW5kIHN0YWNrIGV2ZW50IGVycm9ycyBpbnRvLCB0byBjb21lIHVwIHdpdGggcm9vdCBjYXVzZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUVycm9ycyB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgYWxsIG5vbi1jYW5jZWxsYXRpb24gZXJyb3JzIHdlIGhhdmUgc2Vlbi5cbiAgICpcbiAgICogQnkgdGhlIG5hdHVyZSBvZiB0aGUgb3JkZXIgd2Ugc2VlIGV2ZW50cyBpbiwgd2lsbCBiZSBvcmRlcmVkIGZyb20gb2xkZXN0IHRvIG5ld2VzdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Vycm9yczogUmVzb3VyY2VFcnJvcltdID0gW107XG5cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Vycm9ycy5sZW5ndGggPT09IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbCgpOiBSZWFkb25seUFycmF5PFJlc291cmNlRXJyb3I+IHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZXJyb3IgY29sbGVjdGlvbiB3aXRoIHRoZSBnaXZlbiBzdGFjayBhY3Rpdml0eVxuICAgKlxuICAgKiBNYXkgYmUgZnJvbSBhIG5lc3RlZCBzdGFjayBhcyB3ZWxsLlxuICAgKlxuICAgKiBUaGlzIGNsYXNzIGV4cGVjdHMgdG8gc2VlIGFsbCBldmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGUoLi4uZXZlbnRzOiBSZXNvdXJjZUV2ZW50W10pIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgaWYgKGlzRXJyb3JFdmVudChldmVudC5ldmVudCkpIHtcbiAgICAgICAgLy8gQ2FuY2VsbGVkIGlzIG5vdCBhbiBpbnRlcmVzdGluZyBmYWlsdXJlIHJlYXNvbiwgbm9yIGlzIHRoZSBzdGFjayBtZXNzYWdlIChzdGFja1xuICAgICAgICAvLyBtZXNzYWdlIHdpbGwganVzdCBzYXkgc29tZXRoaW5nIGxpa2UgXCJzdGFjayBmYWlsZWQgdG8gdXBkYXRlXCIpXG4gICAgICAgIGlmICghaXNDYW5jZWxsYXRpb25FdmVudChldmVudC5ldmVudCkgJiYgaXNSZWd1bGFyUmVzb3VyY2VFdmVudChldmVudC5ldmVudCkpIHtcbiAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChlcnJvckZyb21FdmVudChldmVudCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2Ugb3VyIGJlc3QgZ3Vlc3MgYXQgdGhlIGVycm9yIGNvZGUgb2YgdGhlIHJvb3QgY2F1c2VcbiAgICpcbiAgICogVGhlIGZpcnN0IGVycm9yIHRoYXQgb2NjdXJzIGlzIHRoZSByb290IGNhdXNlLlxuICAgKi9cbiAgcHVibGljIGdldCByb290Q2F1c2VFcnJvckNvZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hbGxFcnJvckNvZGVzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBlcnJvciBtZXNzYWdlcyBvZiBhbGwgZW5jb3VudGVyZWQgZXJyb3JzICh0aGF0IGFyZW4ndCBjYW5jZWxsYXRpb25zKVxuICAgKi9cbiAgcHVibGljIGdldCBhbGxFcnJvck1lc3NhZ2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzLm1hcChlID0+IGUubWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGVycm9yIGNvZGVkcyBvZiBhbGwgZW5jb3VudGVyZWQgZXJyb3JzICh0aGF0IGFyZW4ndCBjYW5jZWxsYXRpb25zIG5vciBzdGFjayBlcnJvcnMpXG4gICAqXG4gICAqIFdlIGRvbid0IG5lZWQgdG8gaW5jbHVkZSBuZXN0ZWQgc3RhY2sgZXJyb3JzIGJlY2F1c2Ugb3VyIHBvbGxlciB3aWxsIHBvbGwgdGhlIG5lc3RlZCBzdGFjayxcbiAgICogYW5kIGhhdmUgcmV0dXJuZWQgdGhlIGFjdHVhbCBlcnJvciBhcyB3ZWxsLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxFcnJvckNvZGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzLm1hcChlID0+IGUuZXJyb3JDb2RlKS5maWx0ZXIoeCA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVycm9yRnJvbUV2ZW50KGV2OiBSZXNvdXJjZUV2ZW50KTogUmVzb3VyY2VFcnJvciB7XG4gIC8vIEZJWE1FOiBDaGVjayBob29rc1xuXG4gIHJldHVybiB7XG4gICAgbG9naWNhbElkOiBldi5ldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCA/PyAnJyxcbiAgICBtZXNzYWdlOiBldi5ldmVudC5SZXNvdXJjZVN0YXR1c1JlYXNvbiA/PyAnJyxcbiAgICBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IGV2LnBhcmVudFN0YWNrTG9naWNhbElkcyxcbiAgICByZXNvdXJjZVR5cGU6IGV2LmV2ZW50LlJlc291cmNlVHlwZSA/PyAnJyxcbiAgICBzdGFja0FybjogZXYuZXZlbnQuU3RhY2tJZCA/PyAnJyxcbiAgICBlcnJvckNvZGU6IGV4dHJhY3RFcnJvckNvZGUoZXYuZXZlbnQpLFxuICAgIHBoeXNpY2FsSWQ6IGV2LmV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGFuIGVycm9yIGNvZGUgZnJvbSB0aGUgZ2l2ZW4gc3RhY2sgZXZlbnQuXG4gKlxuICogQWx3YXlzIGNvbnRhaW5zIHRoZSBzZXJ2aWNlcywgYW5kIGluY2x1ZGVzIHRoZSBoYW5kbGVyIGVycm9yIGNvZGUgaWYgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEVycm9yQ29kZShldmVudDogU3RhY2tFdmVudCk6IHN0cmluZyB7XG4gIGNvbnN0IGlzT3VyQ3VzdG9tUmVzb3VyY2UgPSBPVVJfQ1VTVE9NX1JFU09VUkNFX1RZUEVTLmluY2x1ZGVzKGV2ZW50LlJlc291cmNlVHlwZSA/PyAnJyk7XG5cbiAgLy8gR2V0IHRoZSByZXNvdXJjZSB0eXBlOyBpZiBpdCBpcyBub24tQVdTIHRoZW4gd2UgYXJlIGRvbmUuXG4gIGNvbnN0IHJlc291cmNlVHlwZVBhcnRzID0gKGV2ZW50LlJlc291cmNlVHlwZSA/PyAnJykuc3BsaXQoJzo6Jyk7XG4gIGlmIChyZXNvdXJjZVR5cGVQYXJ0c1swXSAhPT0gJ0FXUycgJiYgIWlzT3VyQ3VzdG9tUmVzb3VyY2UpIHtcbiAgICByZXR1cm4gRGVwbG95bWVudEVycm9yQ29kZXMuUFJJVkFURV9SRVNPVVJDRV9FUlJPUjtcbiAgfVxuXG4gIGNvbnN0IHJlc291cmNlVHlwZSA9IGlzT3VyQ3VzdG9tUmVzb3VyY2UgPyByZXNvdXJjZVR5cGVQYXJ0cy5qb2luKCcnKSA6IHJlc291cmNlVHlwZVBhcnRzLnNsaWNlKDEpLmpvaW4oJycpO1xuXG4gIGNvbnN0IHJlYXNvbiA9IGV2ZW50LlJlc291cmNlU3RhdHVzUmVhc29uID8/ICcnO1xuXG4gIGNvbnN0IGVycm9yUmUgPSAvKD86SGFuZGxlckVycm9yQ29kZTp8RXJyb3IgQ29kZTopIChbYS16QS1aMC05Oi1dKykvO1xuICBjb25zdCBoYW5kbGVyQ29kZSA9IHJlYXNvbi5tYXRjaChlcnJvclJlKTtcblxuICByZXR1cm4gYCR7cmVzb3VyY2VUeXBlfToke2hhbmRsZXJDb2RlID8gaGFuZGxlckNvZGVbMV0gOiBEZXBsb3ltZW50RXJyb3JDb2Rlcy5VTktOT1dOX0VSUk9SfWA7XG59XG5cbi8vIFNvbWUgY3VzdG9tIHJlc291cmNlIHR5cGVzIHRoYXQgdGhlIENESyBzdGFuZGFyZCBsaWJyYXJ5IGNyZWF0ZXMgdGhhdCB3ZVxuLy8gd291bGQgbGlrZSB0byBzZWUgaXQgaWYgdGhleSBmYWlsLlxuY29uc3QgT1VSX0NVU1RPTV9SRVNPVVJDRV9UWVBFUyA9IFtcbiAgJ0N1c3RvbTo6QVdTJyxcbiAgJ0N1c3RvbTo6QVdTQ0RLLUVLUy1DbHVzdGVyJyxcbiAgJ0N1c3RvbTo6QVdTQ0RLLUVLUy1GYXJnYXRlUHJvZmlsZScsXG4gICdDdXN0b206OkFXU0NESy1FS1MtSGVsbUNoYXJ0JyxcbiAgJ0N1c3RvbTo6QVdTQ0RLLUVLUy1LdWJlcm5ldGVzT2JqZWN0VmFsdWUnLFxuICAnQ3VzdG9tOjpBV1NDREstRUtTLUt1YmVybmV0ZXNQYXRjaCcsXG4gICdDdXN0b206OkFXU0NESy1FS1MtS3ViZXJuZXRlc1Jlc291cmNlJyxcbiAgJ0N1c3RvbTo6QVdTQ0RLQ2ZuSnNvbicsXG4gICdDdXN0b206OkFXU0NES0Nmbkpzb25TdHJpbmdpZnknLFxuICAnQ3VzdG9tOjpBV1NDREtPcGVuSWRDb25uZWN0UHJvdmlkZXInLFxuICAnQ3VzdG9tOjpDREtCdWNrZXREZXBsb3ltZW50JyxcbiAgJ0N1c3RvbTo6Q2xvdWR3YXRjaExvZ1Jlc291cmNlUG9saWN5JyxcbiAgJ0N1c3RvbTo6Q3Jvc3NBY2NvdW50Wm9uZURlbGVnYXRpb24nLFxuICAnQ3VzdG9tOjpDcm9zc1JlZ2lvbkV4cG9ydFJlYWRlcicsXG4gICdDdXN0b206OkNyb3NzUmVnaW9uRXhwb3J0V3JpdGVyJyxcbiAgJ0N1c3RvbTo6Q3Jvc3NSZWdpb25TdHJpbmdQYXJhbWV0ZXJSZWFkZXInLFxuICAnQ3VzdG9tOjpEZWxldGVFeGlzdGluZ1JlY29yZFNldCcsXG4gICdDdXN0b206OkRlc2NyaWJlQ29nbml0b1VzZXJQb29sQ2xpZW50JyxcbiAgJ0N1c3RvbTo6RHluYW1vREJSZXBsaWNhJyxcbiAgJ0N1c3RvbTo6RUNSQXV0b0RlbGV0ZUltYWdlcycsXG4gICdDdXN0b206OkVsYXN0aWNzZWFyY2hBY2Nlc3NQb2xpY3knLFxuICAnQ3VzdG9tOjpMb2dSZXRlbnRpb24nLFxuICAnQ3VzdG9tOjpPcGVuU2VhcmNoQWNjZXNzUG9saWN5JyxcbiAgJ0N1c3RvbTo6UzNBdXRvRGVsZXRlT2JqZWN0cycsXG4gICdDdXN0b206OlMzQnVja2V0Tm90aWZpY2F0aW9ucycsXG4gICdDdXN0b206OlN5bnRoZXRpY3NBdXRvRGVsZXRlVW5kZXJseWluZ1Jlc291cmNlcycsXG4gICdDdXN0b206OlRyaWdnZXInLFxuICAnQ3VzdG9tOjpVc2VyUG9vbENsb3VkRnJvbnREb21haW5OYW1lJyxcbiAgJ0N1c3RvbTo6VnBjUmVzdHJpY3REZWZhdWx0U0cnLFxuXTtcbiJdfQ==
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { CloudFormationStackArtifact } from '@aws-cdk/cloud-assembly-api';
|
|
2
|
-
import type { StackEvent } from '@aws-sdk/client-cloudformation';
|
|
3
2
|
import type { ICloudFormationClient } from '../aws-auth/private';
|
|
4
3
|
import type { EnvironmentResources } from '../environment';
|
|
5
4
|
import { type IoHelper } from '../io/private';
|
|
@@ -76,12 +75,6 @@ export declare class StackActivityMonitor {
|
|
|
76
75
|
* Printers can decide to update a view less frequently if desired
|
|
77
76
|
*/
|
|
78
77
|
private readonly pollingInterval;
|
|
79
|
-
/**
|
|
80
|
-
* A list of all non-cancellation errors we have seen.
|
|
81
|
-
*
|
|
82
|
-
* By the nature of the order we see events in, will be ordered from oldest to newest.
|
|
83
|
-
*/
|
|
84
|
-
private readonly _errors;
|
|
85
78
|
private monitorId?;
|
|
86
79
|
private readonly progressMonitor;
|
|
87
80
|
/**
|
|
@@ -99,22 +92,9 @@ export declare class StackActivityMonitor {
|
|
|
99
92
|
private readonly envResources?;
|
|
100
93
|
constructor({ cfn, ioHelper, stack, stackName, resourcesTotal, changeSetCreationTime, pollingInterval, envResources, }: StackActivityMonitorProps);
|
|
101
94
|
/**
|
|
102
|
-
*
|
|
103
|
-
*/
|
|
104
|
-
get allErrorMessages(): string[];
|
|
105
|
-
/**
|
|
106
|
-
* Return error codeds of all encountered errors (that aren't cancellations nor stack errors)
|
|
107
|
-
*
|
|
108
|
-
* We don't need to include nested stack errors because our poller will poll the nested stack,
|
|
109
|
-
* and have returned the actual error as well.
|
|
110
|
-
*/
|
|
111
|
-
get allErrorCodes(): string[];
|
|
112
|
-
/**
|
|
113
|
-
* Take our best guess at the error code of the root cause
|
|
114
|
-
*
|
|
115
|
-
* The first error that occurs is the root cause.
|
|
95
|
+
* The resource errors that were discovered during monitoring of this stack
|
|
116
96
|
*/
|
|
117
|
-
get
|
|
97
|
+
get errors(): import("./resource-errors").ResourceErrors;
|
|
118
98
|
start(): Promise<this>;
|
|
119
99
|
stop(): Promise<void>;
|
|
120
100
|
private scheduleNextTick;
|
|
@@ -149,12 +129,5 @@ export declare class StackActivityMonitor {
|
|
|
149
129
|
* Formats a stack activity into a basic string
|
|
150
130
|
*/
|
|
151
131
|
private formatActivity;
|
|
152
|
-
private checkForErrors;
|
|
153
132
|
}
|
|
154
|
-
/**
|
|
155
|
-
* Extract an error code from the given stack event.
|
|
156
|
-
*
|
|
157
|
-
* Always contains the services, and includes the handler error code if available.
|
|
158
|
-
*/
|
|
159
|
-
export declare function extractErrorCode(event: StackEvent): string;
|
|
160
133
|
//# sourceMappingURL=stack-activity-monitor.d.ts.map
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.StackActivityMonitor = void 0;
|
|
4
|
-
exports.extractErrorCode = extractErrorCode;
|
|
5
4
|
const util = require("util");
|
|
6
5
|
const uuid = require("uuid");
|
|
7
6
|
const stack_event_poller_1 = require("./stack-event-poller");
|
|
8
7
|
const stack_progress_monitor_1 = require("./stack-progress-monitor");
|
|
9
|
-
const toolkit_error_1 = require("../../toolkit/toolkit-error");
|
|
10
|
-
const util_1 = require("../../util");
|
|
11
8
|
const private_1 = require("../io/private");
|
|
12
9
|
const resource_metadata_1 = require("../resource-metadata/resource-metadata");
|
|
13
10
|
/**
|
|
@@ -30,12 +27,6 @@ class StackActivityMonitor {
|
|
|
30
27
|
* Printers can decide to update a view less frequently if desired
|
|
31
28
|
*/
|
|
32
29
|
pollingInterval;
|
|
33
|
-
/**
|
|
34
|
-
* A list of all non-cancellation errors we have seen.
|
|
35
|
-
*
|
|
36
|
-
* By the nature of the order we see events in, will be ordered from oldest to newest.
|
|
37
|
-
*/
|
|
38
|
-
_errors = [];
|
|
39
30
|
monitorId;
|
|
40
31
|
progressMonitor;
|
|
41
32
|
/**
|
|
@@ -61,33 +52,14 @@ class StackActivityMonitor {
|
|
|
61
52
|
this.pollingInterval = pollingInterval;
|
|
62
53
|
this.poller = new stack_event_poller_1.StackEventPoller(cfn, {
|
|
63
54
|
stackName,
|
|
64
|
-
|
|
55
|
+
initialPollRange: stack_event_poller_1.PollRange.sinceTimestamp(changeSetCreationTime?.getTime() ?? Date.now()),
|
|
65
56
|
});
|
|
66
57
|
}
|
|
67
58
|
/**
|
|
68
|
-
*
|
|
69
|
-
*/
|
|
70
|
-
get allErrorMessages() {
|
|
71
|
-
return this._errors.map(e => e.ResourceStatusReason ?? '');
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Return error codeds of all encountered errors (that aren't cancellations nor stack errors)
|
|
75
|
-
*
|
|
76
|
-
* We don't need to include nested stack errors because our poller will poll the nested stack,
|
|
77
|
-
* and have returned the actual error as well.
|
|
59
|
+
* The resource errors that were discovered during monitoring of this stack
|
|
78
60
|
*/
|
|
79
|
-
get
|
|
80
|
-
return this.
|
|
81
|
-
.filter(util_1.isRegularResourceEvent)
|
|
82
|
-
.map(extractErrorCode);
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Take our best guess at the error code of the root cause
|
|
86
|
-
*
|
|
87
|
-
* The first error that occurs is the root cause.
|
|
88
|
-
*/
|
|
89
|
-
get rootCauseErrorCode() {
|
|
90
|
-
return this.allErrorCodes[0];
|
|
61
|
+
get errors() {
|
|
62
|
+
return this.poller.errors;
|
|
91
63
|
}
|
|
92
64
|
async start() {
|
|
93
65
|
this.monitorId = uuid.v4();
|
|
@@ -216,7 +188,7 @@ class StackActivityMonitor {
|
|
|
216
188
|
async readNewEvents(monitorId) {
|
|
217
189
|
const pollEvents = await this.poller.poll();
|
|
218
190
|
for (const resourceEvent of pollEvents) {
|
|
219
|
-
this.progressMonitor.process(resourceEvent
|
|
191
|
+
this.progressMonitor.process(resourceEvent);
|
|
220
192
|
// If this is a failed Guard Hook event with an invocation ID, fetch annotations
|
|
221
193
|
if (resourceEvent.event.HookInvocationId) {
|
|
222
194
|
const annotations = await this.fetchGuardHookAnnotations(resourceEvent.event.HookInvocationId);
|
|
@@ -230,7 +202,6 @@ class StackActivityMonitor {
|
|
|
230
202
|
metadata: this.findMetadataFor(resourceEvent.event.LogicalResourceId),
|
|
231
203
|
progress: this.progressMonitor.progress,
|
|
232
204
|
};
|
|
233
|
-
this.checkForErrors(activity);
|
|
234
205
|
await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5502.msg(this.formatActivity(activity, true), activity));
|
|
235
206
|
}
|
|
236
207
|
}
|
|
@@ -260,66 +231,6 @@ class StackActivityMonitor {
|
|
|
260
231
|
const logicalId = resourceName !== event.LogicalResourceId ? `(${event.LogicalResourceId}) ` : '';
|
|
261
232
|
return util.format('%s | %s%s | %s | %s | %s %s%s%s', event.StackName, progress !== false ? `${activity.progress.formatted} | ` : '', new Date(event.Timestamp).toLocaleTimeString(), event.ResourceStatus || '', event.ResourceType, resourceName, logicalId, event.ResourceStatusReason ? event.ResourceStatusReason : '', metadata?.entry.trace ? `\n\t${metadata.entry.trace.join('\n\t\\_ ')}` : '');
|
|
262
233
|
}
|
|
263
|
-
checkForErrors(activity) {
|
|
264
|
-
if ((0, util_1.isErrorEvent)(activity.event)) {
|
|
265
|
-
// Cancelled is not an interesting failure reason, nor is the stack message (stack
|
|
266
|
-
// message will just say something like "stack failed to update")
|
|
267
|
-
if (!(0, util_1.isCancellationEvent)(activity.event) && (0, util_1.isRegularResourceEvent)(activity.event)) {
|
|
268
|
-
this._errors.push(activity.event);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
234
|
}
|
|
273
235
|
exports.StackActivityMonitor = StackActivityMonitor;
|
|
274
|
-
// Some custom resource types that the CDK standard library creates that we
|
|
275
|
-
// would like to see it if they fail.
|
|
276
|
-
const OUR_CUSTOM_RESOURCE_TYPES = [
|
|
277
|
-
'Custom::AWS',
|
|
278
|
-
'Custom::AWSCDK-EKS-Cluster',
|
|
279
|
-
'Custom::AWSCDK-EKS-FargateProfile',
|
|
280
|
-
'Custom::AWSCDK-EKS-HelmChart',
|
|
281
|
-
'Custom::AWSCDK-EKS-KubernetesObjectValue',
|
|
282
|
-
'Custom::AWSCDK-EKS-KubernetesPatch',
|
|
283
|
-
'Custom::AWSCDK-EKS-KubernetesResource',
|
|
284
|
-
'Custom::AWSCDKCfnJson',
|
|
285
|
-
'Custom::AWSCDKCfnJsonStringify',
|
|
286
|
-
'Custom::AWSCDKOpenIdConnectProvider',
|
|
287
|
-
'Custom::CDKBucketDeployment',
|
|
288
|
-
'Custom::CloudwatchLogResourcePolicy',
|
|
289
|
-
'Custom::CrossAccountZoneDelegation',
|
|
290
|
-
'Custom::CrossRegionExportReader',
|
|
291
|
-
'Custom::CrossRegionExportWriter',
|
|
292
|
-
'Custom::CrossRegionStringParameterReader',
|
|
293
|
-
'Custom::DeleteExistingRecordSet',
|
|
294
|
-
'Custom::DescribeCognitoUserPoolClient',
|
|
295
|
-
'Custom::DynamoDBReplica',
|
|
296
|
-
'Custom::ECRAutoDeleteImages',
|
|
297
|
-
'Custom::ElasticsearchAccessPolicy',
|
|
298
|
-
'Custom::LogRetention',
|
|
299
|
-
'Custom::OpenSearchAccessPolicy',
|
|
300
|
-
'Custom::S3AutoDeleteObjects',
|
|
301
|
-
'Custom::S3BucketNotifications',
|
|
302
|
-
'Custom::SyntheticsAutoDeleteUnderlyingResources',
|
|
303
|
-
'Custom::Trigger',
|
|
304
|
-
'Custom::UserPoolCloudFrontDomainName',
|
|
305
|
-
'Custom::VpcRestrictDefaultSG',
|
|
306
|
-
];
|
|
307
|
-
/**
|
|
308
|
-
* Extract an error code from the given stack event.
|
|
309
|
-
*
|
|
310
|
-
* Always contains the services, and includes the handler error code if available.
|
|
311
|
-
*/
|
|
312
|
-
function extractErrorCode(event) {
|
|
313
|
-
const isOurCustomResource = OUR_CUSTOM_RESOURCE_TYPES.includes(event.ResourceType ?? '');
|
|
314
|
-
// Get the resource type; if it is non-AWS then we are done.
|
|
315
|
-
const resourceTypeParts = (event.ResourceType ?? '').split('::');
|
|
316
|
-
if (resourceTypeParts[0] !== 'AWS' && !isOurCustomResource) {
|
|
317
|
-
return toolkit_error_1.DeploymentErrorCodes.PRIVATE_RESOURCE_ERROR;
|
|
318
|
-
}
|
|
319
|
-
const resourceType = isOurCustomResource ? resourceTypeParts.join('') : resourceTypeParts.slice(1).join('');
|
|
320
|
-
const reason = event.ResourceStatusReason ?? '';
|
|
321
|
-
const errorRe = /(?:HandlerErrorCode:|Error Code:) ([a-zA-Z0-9:-]+)/;
|
|
322
|
-
const handlerCode = reason.match(errorRe);
|
|
323
|
-
return `${resourceType}:${handlerCode ? handlerCode[1] : toolkit_error_1.DeploymentErrorCodes.UNKNOWN_ERROR}`;
|
|
324
|
-
}
|
|
325
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stYWN0aXZpdHktbW9uaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0YWNrLWFjdGl2aXR5LW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBeWJBLDRDQWlCQztBQTFjRCw2QkFBNkI7QUFHN0IsNkJBQTZCO0FBQzdCLDZEQUF3RDtBQUN4RCxxRUFBZ0U7QUFFaEUsK0RBQW1FO0FBQ25FLHFDQUF1RjtBQUd2RiwyQ0FBa0Q7QUFDbEQsOEVBQTBFO0FBK0QxRTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLG9CQUFvQjtJQUMvQjs7T0FFRztJQUNjLE1BQU0sQ0FBbUI7SUFFMUM7OztPQUdHO0lBQ2MsZUFBZSxDQUFTO0lBRXpDOzs7O09BSUc7SUFDYyxPQUFPLEdBQWlCLEVBQUUsQ0FBQztJQUVwQyxTQUFTLENBQVU7SUFFVixlQUFlLENBQXVCO0lBRXZEOztPQUVHO0lBQ0ssU0FBUyxDQUFpQztJQUVsRDs7T0FFRztJQUNLLFdBQVcsQ0FBZ0I7SUFFbEIsUUFBUSxDQUFXO0lBQ25CLFNBQVMsQ0FBUztJQUNsQixLQUFLLENBQThCO0lBQ25DLEdBQUcsQ0FBd0I7SUFDM0IsWUFBWSxDQUF3QjtJQUVyRCxZQUFZLEVBQ1YsR0FBRyxFQUNILFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsZUFBZSxHQUFHLEtBQUssRUFDdkIsWUFBWSxHQUNjO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFFakMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLDZDQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxxQ0FBZ0IsQ0FBQyxHQUFHLEVBQUU7WUFDdEMsU0FBUztZQUNULFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1NBQzFELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU87YUFDaEIsTUFBTSxDQUFDLDZCQUFzQixDQUFDO2FBQzlCLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyxrQkFBa0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDakYsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQzFCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztTQUMzQyxDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFFRCw0RkFBNEY7UUFDNUYseUZBQXlGO1FBQ3pGLCtDQUErQztRQUMvQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ2pGLFVBQVUsRUFBRSxZQUFZO1lBQ3hCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztTQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU8sS0FBSyxDQUFDLElBQUk7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEQsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBRTdCLHVFQUF1RTtZQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNwQixPQUFPO1lBQ1QsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLDJDQUEyQyxFQUFFLENBQUMsQ0FBQyxFQUMzRCxFQUFFLEtBQUssRUFBRSxDQUFRLEVBQUUsQ0FDcEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxlQUFlLENBQUMsU0FBNkI7UUFDbkQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDckMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLElBQUEsb0NBQWdCLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQixDQUFDLE9BQWUsRUFBRSxXQUFtQixHQUFHO1FBQzlELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sVUFBVSxDQUFDLE1BQU0sR0FBRyxRQUFRO1lBQ2pDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxnQkFBZ0I7WUFDdEQsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxnQkFBd0I7UUFDOUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDaEYsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDN0MsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDO1lBQzNFLElBQUksaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQWEsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwRCxLQUFLLE1BQU0sVUFBVSxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQzNDLElBQUksVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7Z0JBQy9DLENBQUM7Z0JBQ0QsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQzdCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckUsQ0FBQztnQkFDRCxJQUFJLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRixDQUFDO2dCQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakIsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLFlBQVksR0FBRyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEUsTUFBTSxrQkFBa0IsR0FDdEIsQ0FBQyxDQUFDLElBQUksS0FBSyx1QkFBdUI7Z0JBQ2xDLENBQUMsT0FBTyxZQUFZLEtBQUssUUFBUSxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMseURBQXlELENBQUMsQ0FBQyxDQUFDO1lBRXZJLElBQUksa0JBQWtCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUM1QyxJQUFJLGNBQWMsR0FBdUIsU0FBUyxDQUFDO2dCQUNuRCxJQUFJLENBQUM7b0JBQ0gsY0FBYyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUNyRSxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxpREFBaUQ7Z0JBQ25ELENBQUM7Z0JBRUQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQy9CLElBQUksQ0FBQyxNQUFNLENBQ1Qsc0RBQXNELGdCQUFnQixLQUFLLFlBQVk7dUZBQ1osY0FBYyxJQUFJLFNBQVMsR0FBRyxDQUMxRyxDQUNGLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsMERBQTBELEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQ3hHLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFpQjtRQUMzQyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFNUMsS0FBSyxNQUFNLGFBQWEsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFbEQsZ0ZBQWdGO1lBQ2hGLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQy9GLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLGFBQWEsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO2dCQUNyRCxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFrQjtnQkFDOUIsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSztnQkFDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztnQkFDckUsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUTthQUN4QyxDQUFDO1lBRUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN0RyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFpQjtRQUM1QyxvRUFBb0U7UUFDcEUseUVBQXlFO1FBQ3pFLHNFQUFzRTtRQUN0RSx3Q0FBd0M7UUFDeEMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssY0FBYyxDQUFDLFFBQXVCLEVBQUUsUUFBaUI7UUFDL0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUM3QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBRW5DLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztRQUN2RixNQUFNLFNBQVMsR0FBRyxZQUFZLEtBQUssS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFbEcsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUNoQixpQ0FBaUMsRUFDakMsS0FBSyxDQUFDLFNBQVMsRUFDZixRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDN0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVUsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLEVBQy9DLEtBQUssQ0FBQyxjQUFjLElBQUksRUFBRSxFQUMxQixLQUFLLENBQUMsWUFBWSxFQUNsQixZQUFZLEVBQ1osU0FBUyxFQUNULEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQzVELFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzVFLENBQUM7SUFDSixDQUFDO0lBRU8sY0FBYyxDQUFDLFFBQXVCO1FBQzVDLElBQUksSUFBQSxtQkFBWSxFQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLGtGQUFrRjtZQUNsRixpRUFBaUU7WUFDakUsSUFBSSxDQUFDLElBQUEsMEJBQW1CLEVBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUEsNkJBQXNCLEVBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ25GLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTNURCxvREEyVEM7QUFFRCwyRUFBMkU7QUFDM0UscUNBQXFDO0FBQ3JDLE1BQU0seUJBQXlCLEdBQUc7SUFDaEMsYUFBYTtJQUNiLDRCQUE0QjtJQUM1QixtQ0FBbUM7SUFDbkMsOEJBQThCO0lBQzlCLDBDQUEwQztJQUMxQyxvQ0FBb0M7SUFDcEMsdUNBQXVDO0lBQ3ZDLHVCQUF1QjtJQUN2QixnQ0FBZ0M7SUFDaEMscUNBQXFDO0lBQ3JDLDZCQUE2QjtJQUM3QixxQ0FBcUM7SUFDckMsb0NBQW9DO0lBQ3BDLGlDQUFpQztJQUNqQyxpQ0FBaUM7SUFDakMsMENBQTBDO0lBQzFDLGlDQUFpQztJQUNqQyx1Q0FBdUM7SUFDdkMseUJBQXlCO0lBQ3pCLDZCQUE2QjtJQUM3QixtQ0FBbUM7SUFDbkMsc0JBQXNCO0lBQ3RCLGdDQUFnQztJQUNoQyw2QkFBNkI7SUFDN0IsK0JBQStCO0lBQy9CLGlEQUFpRDtJQUNqRCxpQkFBaUI7SUFDakIsc0NBQXNDO0lBQ3RDLDhCQUE4QjtDQUMvQixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLEtBQWlCO0lBQ2hELE1BQU0sbUJBQW1CLEdBQUcseUJBQXlCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7SUFFekYsNERBQTREO0lBQzVELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRSxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0QsT0FBTyxvQ0FBb0IsQ0FBQyxzQkFBc0IsQ0FBQztJQUNyRCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUU1RyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDO0lBRWhELE1BQU0sT0FBTyxHQUFHLG9EQUFvRCxDQUFDO0lBQ3JFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFMUMsT0FBTyxHQUFHLFlBQVksSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0NBQW9CLENBQUMsYUFBYSxFQUFFLENBQUM7QUFDaEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgdHlwZSB7IFN0YWNrRXZlbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0ICogYXMgdXVpZCBmcm9tICd1dWlkJztcbmltcG9ydCB7IFN0YWNrRXZlbnRQb2xsZXIgfSBmcm9tICcuL3N0YWNrLWV2ZW50LXBvbGxlcic7XG5pbXBvcnQgeyBTdGFja1Byb2dyZXNzTW9uaXRvciB9IGZyb20gJy4vc3RhY2stcHJvZ3Jlc3MtbW9uaXRvcic7XG5pbXBvcnQgdHlwZSB7IFN0YWNrQWN0aXZpdHkgfSBmcm9tICcuLi8uLi9wYXlsb2Fkcy9zdGFjay1hY3Rpdml0eSc7XG5pbXBvcnQgeyBEZXBsb3ltZW50RXJyb3JDb2RlcyB9IGZyb20gJy4uLy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5pbXBvcnQgeyBpc0NhbmNlbGxhdGlvbkV2ZW50LCBpc0Vycm9yRXZlbnQsIGlzUmVndWxhclJlc291cmNlRXZlbnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgSUNsb3VkRm9ybWF0aW9uQ2xpZW50IH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IEVudmlyb25tZW50UmVzb3VyY2VzIH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgSU8sIHR5cGUgSW9IZWxwZXIgfSBmcm9tICcuLi9pby9wcml2YXRlJztcbmltcG9ydCB7IHJlc291cmNlTWV0YWRhdGEgfSBmcm9tICcuLi9yZXNvdXJjZS1tZXRhZGF0YS9yZXNvdXJjZS1tZXRhZGF0YSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tBY3Rpdml0eU1vbml0b3JQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgQ2xvdWRGb3JtYXRpb24gY2xpZW50XG4gICAqL1xuICByZWFkb25seSBjZm46IElDbG91ZEZvcm1hdGlvbkNsaWVudDtcblxuICAvKipcbiAgICogVGhlIElvSGVscGVyIHVzZWQgZm9yIG1lc3NhZ2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgYXJ0aWZhY3QgdGhhdCBpcyBnZXR0aW5nIGRlcGxveWVkXG4gICAqL1xuICByZWFkb25seSBzdGFjazogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgU3RhY2sgdGhhdCBpcyBnZXR0aW5nIGRlcGxveWVkXG4gICAqL1xuICByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVG90YWwgbnVtYmVyIG9mIHJlc291cmNlcyB0byB1cGRhdGVcbiAgICpcbiAgICogVXNlZCB0byBjYWxjdWxhdGUgYSBwcm9ncmVzcyBiYXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcHJvZ3Jlc3MgcmVwb3J0aW5nXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZXNUb3RhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRpb24gdGltZSBvZiB0aGUgY2hhbmdlIHNldFxuICAgKlxuICAgKiBUaGlzIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgZXZlbnRzLCBvbmx5IHNob3dpbmcgdGhvc2UgZnJvbSBhZnRlciB0aGUgY2hhbmdlXG4gICAqIHNldCBjcmVhdGlvbiB0aW1lLlxuICAgKlxuICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcywgb3RoZXJ3aXNlIHRoZSBmaWx0ZXJpbmcgd2lsbCBiZSBzdWJqZWN0XG4gICAqIHRvIGNsb2NrIGRyaWZ0IGJldHdlZW4gbG9jYWwgYW5kIGNsb3VkIG1hY2hpbmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIExvY2FsIG1hY2hpbmUncyBjdXJyZW50IHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZVNldENyZWF0aW9uVGltZT86IERhdGU7XG5cbiAgLyoqXG4gICAqIFRpbWUgdG8gd2FpdCBiZXR3ZWVuIGZldGNoaW5nIG5ldyBhY3Rpdml0aWVzLlxuICAgKlxuICAgKiBNdXN0IHdhaXQgYSByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gcG9sbHMsIHNpbmNlIHdlIG5lZWQgdG8gY29uc2lkZXIgQ2xvdWRGb3JtYXRpb24gQVBJIGxpbWl0c1xuICAgKlxuICAgKiBAZGVmYXVsdCAyXzAwMFxuICAgKi9cbiAgcmVhZG9ubHkgcG9sbGluZ0ludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCByZXNvdXJjZXMsIHVzZWQgdG8gbG9vayB1cCB0aGUgYm9vdHN0cmFwIHRvb2xraXQgdmVyc2lvbiB3aGVuXG4gICAqIGRpYWdub3NpbmcgR3VhcmQgSG9vayBhbm5vdGF0aW9uIGZldGNoIGZhaWx1cmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEJvb3RzdHJhcCB2ZXJzaW9uIGlzIG5vdCByZXBvcnRlZCBpbiBlcnJvciBtZXNzYWdlc1xuICAgKi9cbiAgcmVhZG9ubHkgZW52UmVzb3VyY2VzPzogRW52aXJvbm1lbnRSZXNvdXJjZXM7XG59XG5cbi8qKlxuICogRHJpdmVzIHRoZSBtb25pdG9yaW5nIG9mIGEgU3RhY2sgZGVwbG95bWVudFxuICpcbiAqIGBgYFxuICog4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICog4pSCICAgICAgICAgU3RhY2sgICAgICAgICDilIIgcG9sbCgpIOKUgiAgICAgICAgIFN0YWNrICAgICAgICAg4pSCICBwcm9jZXNzKGV2KSDilIIgICAgICAgICBTdGFjayAgICAgICAgIOKUglxuICog4pSCICAgICAgRXZlbnRQb2xsZXIgICAgICDilILil4DilIDilIDilIDilIDilIDilIDilIDilIIgICAgQWN0aXZpdHlNb25pdG9yICAgIOKUguKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKWtuKUgiAgICBQcm9ncmVzc01vbml0b3IgICAg4pSCXG4gKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YWNrQWN0aXZpdHlNb25pdG9yIHtcbiAgLyoqXG4gICAqIFRoZSBwb2xsZXIgdXNlZCB0byByZWFkIHN0YWNrIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwb2xsZXI6IFN0YWNrRXZlbnRQb2xsZXI7XG5cbiAgLyoqXG4gICAqIEZldGNoIG5ldyBhY3Rpdml0eSBldmVyeSAxIHNlY29uZFxuICAgKiBQcmludGVycyBjYW4gZGVjaWRlIHRvIHVwZGF0ZSBhIHZpZXcgbGVzcyBmcmVxdWVudGx5IGlmIGRlc2lyZWRcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcG9sbGluZ0ludGVydmFsOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBhbGwgbm9uLWNhbmNlbGxhdGlvbiBlcnJvcnMgd2UgaGF2ZSBzZWVuLlxuICAgKlxuICAgKiBCeSB0aGUgbmF0dXJlIG9mIHRoZSBvcmRlciB3ZSBzZWUgZXZlbnRzIGluLCB3aWxsIGJlIG9yZGVyZWQgZnJvbSBvbGRlc3QgdG8gbmV3ZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZXJyb3JzOiBTdGFja0V2ZW50W10gPSBbXTtcblxuICBwcml2YXRlIG1vbml0b3JJZD86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb2dyZXNzTW9uaXRvcjogU3RhY2tQcm9ncmVzc01vbml0b3I7XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdGljayB0aW1lclxuICAgKi9cbiAgcHJpdmF0ZSB0aWNrVGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcblxuICAvKipcbiAgICogU2V0IHRvIHRoZSBhY3Rpdml0eSBvZiByZWFkaW5nIHRoZSBjdXJyZW50IGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkUHJvbWlzZT86IFByb21pc2U8YW55PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFjazogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IGNmbjogSUNsb3VkRm9ybWF0aW9uQ2xpZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGVudlJlc291cmNlcz86IEVudmlyb25tZW50UmVzb3VyY2VzO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjZm4sXG4gICAgaW9IZWxwZXIsXG4gICAgc3RhY2ssXG4gICAgc3RhY2tOYW1lLFxuICAgIHJlc291cmNlc1RvdGFsLFxuICAgIGNoYW5nZVNldENyZWF0aW9uVGltZSxcbiAgICBwb2xsaW5nSW50ZXJ2YWwgPSAyXzAwMCxcbiAgICBlbnZSZXNvdXJjZXMsXG4gIH06IFN0YWNrQWN0aXZpdHlNb25pdG9yUHJvcHMpIHtcbiAgICB0aGlzLmlvSGVscGVyID0gaW9IZWxwZXI7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuc3RhY2tOYW1lID0gc3RhY2tOYW1lO1xuICAgIHRoaXMuY2ZuID0gY2ZuO1xuICAgIHRoaXMuZW52UmVzb3VyY2VzID0gZW52UmVzb3VyY2VzO1xuXG4gICAgdGhpcy5wcm9ncmVzc01vbml0b3IgPSBuZXcgU3RhY2tQcm9ncmVzc01vbml0b3IocmVzb3VyY2VzVG90YWwpO1xuICAgIHRoaXMucG9sbGluZ0ludGVydmFsID0gcG9sbGluZ0ludGVydmFsO1xuICAgIHRoaXMucG9sbGVyID0gbmV3IFN0YWNrRXZlbnRQb2xsZXIoY2ZuLCB7XG4gICAgICBzdGFja05hbWUsXG4gICAgICBzdGFydFRpbWU6IGNoYW5nZVNldENyZWF0aW9uVGltZT8uZ2V0VGltZSgpID8/IERhdGUubm93KCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGVycm9yIG1lc3NhZ2VzIG9mIGFsbCBlbmNvdW50ZXJlZCBlcnJvcnMgKHRoYXQgYXJlbid0IGNhbmNlbGxhdGlvbnMpXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbEVycm9yTWVzc2FnZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9lcnJvcnMubWFwKGUgPT4gZS5SZXNvdXJjZVN0YXR1c1JlYXNvbiA/PyAnJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGVycm9yIGNvZGVkcyBvZiBhbGwgZW5jb3VudGVyZWQgZXJyb3JzICh0aGF0IGFyZW4ndCBjYW5jZWxsYXRpb25zIG5vciBzdGFjayBlcnJvcnMpXG4gICAqXG4gICAqIFdlIGRvbid0IG5lZWQgdG8gaW5jbHVkZSBuZXN0ZWQgc3RhY2sgZXJyb3JzIGJlY2F1c2Ugb3VyIHBvbGxlciB3aWxsIHBvbGwgdGhlIG5lc3RlZCBzdGFjayxcbiAgICogYW5kIGhhdmUgcmV0dXJuZWQgdGhlIGFjdHVhbCBlcnJvciBhcyB3ZWxsLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxFcnJvckNvZGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzXG4gICAgICAuZmlsdGVyKGlzUmVndWxhclJlc291cmNlRXZlbnQpXG4gICAgICAubWFwKGV4dHJhY3RFcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2Ugb3VyIGJlc3QgZ3Vlc3MgYXQgdGhlIGVycm9yIGNvZGUgb2YgdGhlIHJvb3QgY2F1c2VcbiAgICpcbiAgICogVGhlIGZpcnN0IGVycm9yIHRoYXQgb2NjdXJzIGlzIHRoZSByb290IGNhdXNlLlxuICAgKi9cbiAgcHVibGljIGdldCByb290Q2F1c2VFcnJvckNvZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hbGxFcnJvckNvZGVzWzBdO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0KCkge1xuICAgIHRoaXMubW9uaXRvcklkID0gdXVpZC52NCgpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1NTAxLm1zZyhgRGVwbG95aW5nICR7dGhpcy5zdGFja05hbWV9YCwge1xuICAgICAgZGVwbG95bWVudDogdGhpcy5tb25pdG9ySWQsXG4gICAgICBzdGFjazogdGhpcy5zdGFjayxcbiAgICAgIHN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICByZXNvdXJjZXNUb3RhbDogdGhpcy5wcm9ncmVzc01vbml0b3IudG90YWwsXG4gICAgfSkpO1xuICAgIHRoaXMuc2NoZWR1bGVOZXh0VGljaygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0b3AoKSB7XG4gICAgY29uc3Qgb2xkTW9uaXRvcklkID0gdGhpcy5tb25pdG9ySWQhO1xuICAgIHRoaXMubW9uaXRvcklkID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnRpY2tUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGlja1RpbWVyKTtcbiAgICB9XG5cbiAgICAvLyBEbyBhIGZpbmFsIHBvbGwgZm9yIGFsbCBldmVudHMuIFRoaXMgaXMgdG8gaGFuZGxlIHRoZSBzaXR1YXRpb24gd2hlcmUgRGVzY3JpYmVTdGFja1N0YXR1c1xuICAgIC8vIGFscmVhZHkgcmV0dXJuZWQgYW4gZXJyb3IsIGJ1dCB0aGUgbW9uaXRvciBoYXNuJ3Qgc2VlbiBhbGwgdGhlIGV2ZW50cyB5ZXQgYW5kIHdlJ2QgZW5kXG4gICAgLy8gdXAgbm90IHByaW50aW5nIHRoZSBmYWlsdXJlIHJlYXNvbiB0byB1c2Vycy5cbiAgICBhd2FpdCB0aGlzLmZpbmFsUG9sbFRvRW5kKG9sZE1vbml0b3JJZCk7XG5cbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTUwMy5tc2coYENvbXBsZXRlZCAke3RoaXMuc3RhY2tOYW1lfWAsIHtcbiAgICAgIGRlcGxveW1lbnQ6IG9sZE1vbml0b3JJZCxcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgc3RhY2tOYW1lOiB0aGlzLnN0YWNrTmFtZSxcbiAgICAgIHJlc291cmNlc1RvdGFsOiB0aGlzLnByb2dyZXNzTW9uaXRvci50b3RhbCxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlTmV4dFRpY2soKSB7XG4gICAgaWYgKCF0aGlzLm1vbml0b3JJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudGlja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMudGljaygpLCB0aGlzLnBvbGxpbmdJbnRlcnZhbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRpY2soKSB7XG4gICAgaWYgKCF0aGlzLm1vbml0b3JJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlYWRQcm9taXNlID0gdGhpcy5yZWFkTmV3RXZlbnRzKHRoaXMubW9uaXRvcklkKTtcbiAgICAgIGF3YWl0IHRoaXMucmVhZFByb21pc2U7XG4gICAgICB0aGlzLnJlYWRQcm9taXNlID0gdW5kZWZpbmVkO1xuXG4gICAgICAvLyBXZSBtaWdodCBoYXZlIGJlZW4gc3RvcCgpcGVkIHdoaWxlIHRoZSBuZXR3b3JrIGNhbGwgd2FzIGluIHByb2dyZXNzLlxuICAgICAgaWYgKCF0aGlzLm1vbml0b3JJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTU1MDAubXNnKFxuICAgICAgICB1dGlsLmZvcm1hdCgnRXJyb3Igb2NjdXJyZWQgd2hpbGUgbW9uaXRvcmluZyBzdGFjazogJXMnLCBlKSxcbiAgICAgICAgeyBlcnJvcjogZSBhcyBhbnkgfSxcbiAgICAgICkpO1xuICAgIH1cbiAgICB0aGlzLnNjaGVkdWxlTmV4dFRpY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE1ldGFkYXRhRm9yKGxvZ2ljYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnN0YWNrLm1ldGFkYXRhO1xuICAgIGlmICghbG9naWNhbElkIHx8ICFtZXRhZGF0YSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc291cmNlTWV0YWRhdGEodGhpcy5zdGFjaywgbG9naWNhbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmltcyBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UsIGNvbGxhcHNlcyBhbGwgaW50ZXJuYWwgd2hpdGVzcGFjZVxuICAgKiAoaW5jbHVkaW5nIG5ld2xpbmVzKSB0byBhIHNpbmdsZSBzcGFjZSwgYW5kIHRydW5jYXRlcyB0byBgbWF4Q2hhcnNgXG4gICAqIGNoYXJhY3RlcnMsIGFwcGVuZGluZyBgWy4uLnRydW5jYXRlZF1gIHdoZW4gdGhlIG9yaWdpbmFsIHdhcyBsb25nZXIuXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCBtYXhDaGFyczogbnVtYmVyID0gNDAwKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gbWVzc2FnZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIHJldHVybiBub3JtYWxpemVkLmxlbmd0aCA+IG1heENoYXJzXG4gICAgICA/IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIG1heENoYXJzKSArICdbLi4udHJ1bmNhdGVkXSdcbiAgICAgIDogbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIEd1YXJkIEhvb2sgYW5ub3RhdGlvbiBkZXRhaWxzIHZpYSBHZXRIb29rUmVzdWx0IEFQSSBhbmQgZm9ybWF0cyB0aGVtXG4gICAqIGludG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBmZXRjaCBmYWlscyBvciB0aGVyZVxuICAgKiBhcmUgbm8gZmFpbGVkIGFubm90YXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEd1YXJkSG9va0Fubm90YXRpb25zKGhvb2tJbnZvY2F0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2ZuLmdldEhvb2tSZXN1bHQoeyBIb29rUmVzdWx0SWQ6IGhvb2tJbnZvY2F0aW9uSWQgfSk7XG4gICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IHJlc3VsdC5Bbm5vdGF0aW9ucyA/PyBbXTtcbiAgICAgIGNvbnN0IGZhaWxlZEFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuZmlsdGVyKChhKSA9PiBhLlN0YXR1cyA9PT0gJ0ZBSUxFRCcpO1xuICAgICAgaWYgKGZhaWxlZEFubm90YXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbJ05vbkNvbXBsaWFudCBSdWxlczonLCAnJ107XG4gICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgZmFpbGVkQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgaWYgKGFubm90YXRpb24uQW5ub3RhdGlvbk5hbWUpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGBbJHthbm5vdGF0aW9uLkFubm90YXRpb25OYW1lfV1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbi5TdGF0dXNNZXNzYWdlKSB7XG4gICAgICAgICAgbGluZXMucHVzaChg4oCiICR7dGhpcy5ub3JtYWxpemVNZXNzYWdlKGFubm90YXRpb24uU3RhdHVzTWVzc2FnZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24uUmVtZWRpYXRpb25NZXNzYWdlKSB7XG4gICAgICAgICAgbGluZXMucHVzaChgUmVtZWRpYXRpb246ICR7dGhpcy5ub3JtYWxpemVNZXNzYWdlKGFubm90YXRpb24uUmVtZWRpYXRpb25NZXNzYWdlKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKS50cmltRW5kKCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSk7XG5cbiAgICAgIGNvbnN0IGlzUGVybWlzc2lvbnNFcnJvciA9XG4gICAgICAgIGUubmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicgfHxcbiAgICAgICAgKHR5cGVvZiBlcnJvck1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdub3QgYXV0aG9yaXplZCB0byBwZXJmb3JtOiBjbG91ZGZvcm1hdGlvbjpnZXRob29rcmVzdWx0JykpO1xuXG4gICAgICBpZiAoaXNQZXJtaXNzaW9uc0Vycm9yICYmIHRoaXMuZW52UmVzb3VyY2VzKSB7XG4gICAgICAgIGxldCBjdXJyZW50VmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGN1cnJlbnRWZXJzaW9uID0gKGF3YWl0IHRoaXMuZW52UmVzb3VyY2VzLmxvb2t1cFRvb2xraXQoKSkudmVyc2lvbjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gaWdub3JlIGVycm9ycyBsb29raW5nIHVwIHRoZSBib290c3RyYXAgdmVyc2lvblxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy53YXJuKFxuICAgICAgICAgIHV0aWwuZm9ybWF0KFxuICAgICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCByZXN1bHQgZGV0YWlscyBmb3IgSG9vayBpbnZvY2F0aW9uICR7aG9va0ludm9jYXRpb25JZH06ICR7ZXJyb3JNZXNzYWdlfS4gTWFrZSBzdXJlIHlvdSBoYXZlIHBlcm1pc3Npb25zIHRvIGNhbGwgdGhlIEdldEhvb2tSZXN1bHQgQVBJLCBvciByZS1ib290c3RyYXAgeW91ciBlbnZpcm9ubWVudCBieSBydW5uaW5nICdjZGsgYm9vdHN0cmFwJyB0byB1cGRhdGUgdGhlIEJvb3RzdHJhcCBDREsgVG9vbGtpdCBzdGFjay5cbiAgICAgICAgICAgICdCb290c3RyYXAgdG9vbGtpdCBzdGFjayB2ZXJzaW9uIDMxIG9yIGxhdGVyIGlzIG5lZWRlZDsgY3VycmVudCB2ZXJzaW9uOiAke2N1cnJlbnRWZXJzaW9uID8/ICd1bmtub3duJ30uYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy53YXJuKFxuICAgICAgICAgIHV0aWwuZm9ybWF0KCdGYWlsZWQgdG8gZmV0Y2ggR3VhcmQgSG9vayBkZXRhaWxzIGZvciBpbnZvY2F0aW9uICVzOiAlcycsIGhvb2tJbnZvY2F0aW9uSWQsIGVycm9yTWVzc2FnZSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFsbCBuZXcgZXZlbnRzIGZyb20gdGhlIHN0YWNrIGhpc3RvcnlcbiAgICpcbiAgICogVGhlIGV2ZW50cyBhcmUgcmV0dXJuZWQgaW4gY2hyb25vbG9naWNhbCBvcmRlciBieSB0aGUgdW5kZXJseWluZyBwb2xsZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWROZXdFdmVudHMobW9uaXRvcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb2xsRXZlbnRzID0gYXdhaXQgdGhpcy5wb2xsZXIucG9sbCgpO1xuXG4gICAgZm9yIChjb25zdCByZXNvdXJjZUV2ZW50IG9mIHBvbGxFdmVudHMpIHtcbiAgICAgIHRoaXMucHJvZ3Jlc3NNb25pdG9yLnByb2Nlc3MocmVzb3VyY2VFdmVudC5ldmVudCk7XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgYSBmYWlsZWQgR3VhcmQgSG9vayBldmVudCB3aXRoIGFuIGludm9jYXRpb24gSUQsIGZldGNoIGFubm90YXRpb25zXG4gICAgICBpZiAocmVzb3VyY2VFdmVudC5ldmVudC5Ib29rSW52b2NhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25zID0gYXdhaXQgdGhpcy5mZXRjaEd1YXJkSG9va0Fubm90YXRpb25zKHJlc291cmNlRXZlbnQuZXZlbnQuSG9va0ludm9jYXRpb25JZCk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9ucykge1xuICAgICAgICAgIHJlc291cmNlRXZlbnQuZXZlbnQuSG9va1N0YXR1c1JlYXNvbiA9IGFubm90YXRpb25zO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdGl2aXR5OiBTdGFja0FjdGl2aXR5ID0ge1xuICAgICAgICBkZXBsb3ltZW50OiBtb25pdG9ySWQsXG4gICAgICAgIGV2ZW50OiByZXNvdXJjZUV2ZW50LmV2ZW50LFxuICAgICAgICBtZXRhZGF0YTogdGhpcy5maW5kTWV0YWRhdGFGb3IocmVzb3VyY2VFdmVudC5ldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCksXG4gICAgICAgIHByb2dyZXNzOiB0aGlzLnByb2dyZXNzTW9uaXRvci5wcm9ncmVzcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2hlY2tGb3JFcnJvcnMoYWN0aXZpdHkpO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTU1MDIubXNnKHRoaXMuZm9ybWF0QWN0aXZpdHkoYWN0aXZpdHksIHRydWUpLCBhY3Rpdml0eSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgZmluYWwgcG9sbCB0byB0aGUgZW5kIGFuZCBmbHVzaCBvdXQgYWxsIGV2ZW50cyB0byB0aGUgcHJpbnRlclxuICAgKlxuICAgKiBGaW5pc2ggYW55IHBvbGwgY3VycmVudGx5IGluIHByb2dyZXNzLCB0aGVuIGRvIGEgZmluYWwgb25lIHVudGlsIHdlJ3ZlXG4gICAqIHJlYWNoZWQgdGhlIGxhc3QgcGFnZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluYWxQb2xsVG9FbmQobW9uaXRvcklkOiBzdHJpbmcpIHtcbiAgICAvLyBJZiB3ZSB3ZXJlIGRvaW5nIGEgcG9sbCwgZmluaXNoIHRoYXQgZmlyc3QuIEl0IHdhcyBzdGFydGVkIGJlZm9yZVxuICAgIC8vIHRoZSBtb21lbnQgd2Ugd2VyZSBzdXJlIHdlIHdlcmVuJ3QgZ29pbmcgdG8gZ2V0IGFueSBuZXcgZXZlbnRzIGFueW1vcmVcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGRvIGEgbmV3IG9uZSBhbnl3YXkuIE5lZWQgdG8gd2FpdCBmb3IgdGhpcyBvbmUgdGhvdWdoXG4gICAgLy8gYmVjYXVzZSBvdXIgc3RhdGUgaXMgc2luZ2xlLXRocmVhZGVkLlxuICAgIGlmICh0aGlzLnJlYWRQcm9taXNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlYWRQcm9taXNlO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVhZE5ld0V2ZW50cyhtb25pdG9ySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBzdGFjayBhY3Rpdml0eSBpbnRvIGEgYmFzaWMgc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdEFjdGl2aXR5KGFjdGl2aXR5OiBTdGFja0FjdGl2aXR5LCBwcm9ncmVzczogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgY29uc3QgZXZlbnQgPSBhY3Rpdml0eS5ldmVudDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGFjdGl2aXR5Lm1ldGFkYXRhO1xuXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gbWV0YWRhdGEgPyBtZXRhZGF0YS5jb25zdHJ1Y3RQYXRoIDogZXZlbnQuTG9naWNhbFJlc291cmNlSWQgfHwgJyc7XG4gICAgY29uc3QgbG9naWNhbElkID0gcmVzb3VyY2VOYW1lICE9PSBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCA/IGAoJHtldmVudC5Mb2dpY2FsUmVzb3VyY2VJZH0pIGAgOiAnJztcblxuICAgIHJldHVybiB1dGlsLmZvcm1hdChcbiAgICAgICclcyB8ICVzJXMgfCAlcyB8ICVzIHwgJXMgJXMlcyVzJyxcbiAgICAgIGV2ZW50LlN0YWNrTmFtZSxcbiAgICAgIHByb2dyZXNzICE9PSBmYWxzZSA/IGAke2FjdGl2aXR5LnByb2dyZXNzLmZvcm1hdHRlZH0gfCBgIDogJycsXG4gICAgICBuZXcgRGF0ZShldmVudC5UaW1lc3RhbXAhKS50b0xvY2FsZVRpbWVTdHJpbmcoKSxcbiAgICAgIGV2ZW50LlJlc291cmNlU3RhdHVzIHx8ICcnLFxuICAgICAgZXZlbnQuUmVzb3VyY2VUeXBlLFxuICAgICAgcmVzb3VyY2VOYW1lLFxuICAgICAgbG9naWNhbElkLFxuICAgICAgZXZlbnQuUmVzb3VyY2VTdGF0dXNSZWFzb24gPyBldmVudC5SZXNvdXJjZVN0YXR1c1JlYXNvbiA6ICcnLFxuICAgICAgbWV0YWRhdGE/LmVudHJ5LnRyYWNlID8gYFxcblxcdCR7bWV0YWRhdGEuZW50cnkudHJhY2Uuam9pbignXFxuXFx0XFxcXF8gJyl9YCA6ICcnLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yRXJyb3JzKGFjdGl2aXR5OiBTdGFja0FjdGl2aXR5KSB7XG4gICAgaWYgKGlzRXJyb3JFdmVudChhY3Rpdml0eS5ldmVudCkpIHtcbiAgICAgIC8vIENhbmNlbGxlZCBpcyBub3QgYW4gaW50ZXJlc3RpbmcgZmFpbHVyZSByZWFzb24sIG5vciBpcyB0aGUgc3RhY2sgbWVzc2FnZSAoc3RhY2tcbiAgICAgIC8vIG1lc3NhZ2Ugd2lsbCBqdXN0IHNheSBzb21ldGhpbmcgbGlrZSBcInN0YWNrIGZhaWxlZCB0byB1cGRhdGVcIilcbiAgICAgIGlmICghaXNDYW5jZWxsYXRpb25FdmVudChhY3Rpdml0eS5ldmVudCkgJiYgaXNSZWd1bGFyUmVzb3VyY2VFdmVudChhY3Rpdml0eS5ldmVudCkpIHtcbiAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2goYWN0aXZpdHkuZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBTb21lIGN1c3RvbSByZXNvdXJjZSB0eXBlcyB0aGF0IHRoZSBDREsgc3RhbmRhcmQgbGlicmFyeSBjcmVhdGVzIHRoYXQgd2Vcbi8vIHdvdWxkIGxpa2UgdG8gc2VlIGl0IGlmIHRoZXkgZmFpbC5cbmNvbnN0IE9VUl9DVVNUT01fUkVTT1VSQ0VfVFlQRVMgPSBbXG4gICdDdXN0b206OkFXUycsXG4gICdDdXN0b206OkFXU0NESy1FS1MtQ2x1c3RlcicsXG4gICdDdXN0b206OkFXU0NESy1FS1MtRmFyZ2F0ZVByb2ZpbGUnLFxuICAnQ3VzdG9tOjpBV1NDREstRUtTLUhlbG1DaGFydCcsXG4gICdDdXN0b206OkFXU0NESy1FS1MtS3ViZXJuZXRlc09iamVjdFZhbHVlJyxcbiAgJ0N1c3RvbTo6QVdTQ0RLLUVLUy1LdWJlcm5ldGVzUGF0Y2gnLFxuICAnQ3VzdG9tOjpBV1NDREstRUtTLUt1YmVybmV0ZXNSZXNvdXJjZScsXG4gICdDdXN0b206OkFXU0NES0Nmbkpzb24nLFxuICAnQ3VzdG9tOjpBV1NDREtDZm5Kc29uU3RyaW5naWZ5JyxcbiAgJ0N1c3RvbTo6QVdTQ0RLT3BlbklkQ29ubmVjdFByb3ZpZGVyJyxcbiAgJ0N1c3RvbTo6Q0RLQnVja2V0RGVwbG95bWVudCcsXG4gICdDdXN0b206OkNsb3Vkd2F0Y2hMb2dSZXNvdXJjZVBvbGljeScsXG4gICdDdXN0b206OkNyb3NzQWNjb3VudFpvbmVEZWxlZ2F0aW9uJyxcbiAgJ0N1c3RvbTo6Q3Jvc3NSZWdpb25FeHBvcnRSZWFkZXInLFxuICAnQ3VzdG9tOjpDcm9zc1JlZ2lvbkV4cG9ydFdyaXRlcicsXG4gICdDdXN0b206OkNyb3NzUmVnaW9uU3RyaW5nUGFyYW1ldGVyUmVhZGVyJyxcbiAgJ0N1c3RvbTo6RGVsZXRlRXhpc3RpbmdSZWNvcmRTZXQnLFxuICAnQ3VzdG9tOjpEZXNjcmliZUNvZ25pdG9Vc2VyUG9vbENsaWVudCcsXG4gICdDdXN0b206OkR5bmFtb0RCUmVwbGljYScsXG4gICdDdXN0b206OkVDUkF1dG9EZWxldGVJbWFnZXMnLFxuICAnQ3VzdG9tOjpFbGFzdGljc2VhcmNoQWNjZXNzUG9saWN5JyxcbiAgJ0N1c3RvbTo6TG9nUmV0ZW50aW9uJyxcbiAgJ0N1c3RvbTo6T3BlblNlYXJjaEFjY2Vzc1BvbGljeScsXG4gICdDdXN0b206OlMzQXV0b0RlbGV0ZU9iamVjdHMnLFxuICAnQ3VzdG9tOjpTM0J1Y2tldE5vdGlmaWNhdGlvbnMnLFxuICAnQ3VzdG9tOjpTeW50aGV0aWNzQXV0b0RlbGV0ZVVuZGVybHlpbmdSZXNvdXJjZXMnLFxuICAnQ3VzdG9tOjpUcmlnZ2VyJyxcbiAgJ0N1c3RvbTo6VXNlclBvb2xDbG91ZEZyb250RG9tYWluTmFtZScsXG4gICdDdXN0b206OlZwY1Jlc3RyaWN0RGVmYXVsdFNHJyxcbl07XG5cbi8qKlxuICogRXh0cmFjdCBhbiBlcnJvciBjb2RlIGZyb20gdGhlIGdpdmVuIHN0YWNrIGV2ZW50LlxuICpcbiAqIEFsd2F5cyBjb250YWlucyB0aGUgc2VydmljZXMsIGFuZCBpbmNsdWRlcyB0aGUgaGFuZGxlciBlcnJvciBjb2RlIGlmIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RFcnJvckNvZGUoZXZlbnQ6IFN0YWNrRXZlbnQpOiBzdHJpbmcge1xuICBjb25zdCBpc091ckN1c3RvbVJlc291cmNlID0gT1VSX0NVU1RPTV9SRVNPVVJDRV9UWVBFUy5pbmNsdWRlcyhldmVudC5SZXNvdXJjZVR5cGUgPz8gJycpO1xuXG4gIC8vIEdldCB0aGUgcmVzb3VyY2UgdHlwZTsgaWYgaXQgaXMgbm9uLUFXUyB0aGVuIHdlIGFyZSBkb25lLlxuICBjb25zdCByZXNvdXJjZVR5cGVQYXJ0cyA9IChldmVudC5SZXNvdXJjZVR5cGUgPz8gJycpLnNwbGl0KCc6OicpO1xuICBpZiAocmVzb3VyY2VUeXBlUGFydHNbMF0gIT09ICdBV1MnICYmICFpc091ckN1c3RvbVJlc291cmNlKSB7XG4gICAgcmV0dXJuIERlcGxveW1lbnRFcnJvckNvZGVzLlBSSVZBVEVfUkVTT1VSQ0VfRVJST1I7XG4gIH1cblxuICBjb25zdCByZXNvdXJjZVR5cGUgPSBpc091ckN1c3RvbVJlc291cmNlID8gcmVzb3VyY2VUeXBlUGFydHMuam9pbignJykgOiByZXNvdXJjZVR5cGVQYXJ0cy5zbGljZSgxKS5qb2luKCcnKTtcblxuICBjb25zdCByZWFzb24gPSBldmVudC5SZXNvdXJjZVN0YXR1c1JlYXNvbiA/PyAnJztcblxuICBjb25zdCBlcnJvclJlID0gLyg/OkhhbmRsZXJFcnJvckNvZGU6fEVycm9yIENvZGU6KSAoW2EtekEtWjAtOTotXSspLztcbiAgY29uc3QgaGFuZGxlckNvZGUgPSByZWFzb24ubWF0Y2goZXJyb3JSZSk7XG5cbiAgcmV0dXJuIGAke3Jlc291cmNlVHlwZX06JHtoYW5kbGVyQ29kZSA/IGhhbmRsZXJDb2RlWzFdIDogRGVwbG95bWVudEVycm9yQ29kZXMuVU5LTk9XTl9FUlJPUn1gO1xufVxuIl19
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stYWN0aXZpdHktbW9uaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0YWNrLWFjdGl2aXR5LW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBRTdCLDZCQUE2QjtBQUM3Qiw2REFBbUU7QUFDbkUscUVBQWdFO0FBSWhFLDJDQUFrRDtBQUNsRCw4RUFBMEU7QUErRDFFOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsb0JBQW9CO0lBQy9COztPQUVHO0lBQ2MsTUFBTSxDQUFtQjtJQUUxQzs7O09BR0c7SUFDYyxlQUFlLENBQVM7SUFFakMsU0FBUyxDQUFVO0lBRVYsZUFBZSxDQUF1QjtJQUV2RDs7T0FFRztJQUNLLFNBQVMsQ0FBaUM7SUFFbEQ7O09BRUc7SUFDSyxXQUFXLENBQWdCO0lBRWxCLFFBQVEsQ0FBVztJQUNuQixTQUFTLENBQVM7SUFDbEIsS0FBSyxDQUE4QjtJQUNuQyxHQUFHLENBQXdCO0lBQzNCLFlBQVksQ0FBd0I7SUFFckQsWUFBWSxFQUNWLEdBQUcsRUFDSCxRQUFRLEVBQ1IsS0FBSyxFQUNMLFNBQVMsRUFDVCxjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLGVBQWUsR0FBRyxLQUFLLEVBQ3ZCLFlBQVksR0FDYztRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBRWpDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSw2Q0FBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUN2QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUkscUNBQWdCLENBQUMsR0FB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QVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7UUFDdkYsTUFBTSxTQUFTLEdBQUcsWUFBWSxLQUFLLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRWxHLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FDaEIsaUNBQWlDLEVBQ2pDLEtBQUssQ0FBQyxTQUFTLEVBQ2YsUUFBUSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQzdELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFVLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxFQUMvQyxLQUFLLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFDMUIsS0FBSyxDQUFDLFlBQVksRUFDbEIsWUFBWSxFQUNaLFNBQVMsRUFDVCxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUM1RCxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUM1RSxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBcFJELG9EQW9SQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgU3RhY2tFdmVudFBvbGxlciwgUG9sbFJhbmdlIH0gZnJvbSAnLi9zdGFjay1ldmVudC1wb2xsZXInO1xuaW1wb3J0IHsgU3RhY2tQcm9ncmVzc01vbml0b3IgfSBmcm9tICcuL3N0YWNrLXByb2dyZXNzLW1vbml0b3InO1xuaW1wb3J0IHR5cGUgeyBTdGFja0FjdGl2aXR5IH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMvc3RhY2stYWN0aXZpdHknO1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRGb3JtYXRpb25DbGllbnQgfSBmcm9tICcuLi9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgRW52aXJvbm1lbnRSZXNvdXJjZXMgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBJTywgdHlwZSBJb0hlbHBlciB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHsgcmVzb3VyY2VNZXRhZGF0YSB9IGZyb20gJy4uL3Jlc291cmNlLW1ldGFkYXRhL3Jlc291cmNlLW1ldGFkYXRhJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGFja0FjdGl2aXR5TW9uaXRvclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBDbG91ZEZvcm1hdGlvbiBjbGllbnRcbiAgICovXG4gIHJlYWRvbmx5IGNmbjogSUNsb3VkRm9ybWF0aW9uQ2xpZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgSW9IZWxwZXIgdXNlZCBmb3IgbWVzc2FnaW5nXG4gICAqL1xuICByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFjayBhcnRpZmFjdCB0aGF0IGlzIGdldHRpbmcgZGVwbG95ZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrOiBDbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBTdGFjayB0aGF0IGlzIGdldHRpbmcgZGVwbG95ZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUb3RhbCBudW1iZXIgb2YgcmVzb3VyY2VzIHRvIHVwZGF0ZVxuICAgKlxuICAgKiBVc2VkIHRvIGNhbGN1bGF0ZSBhIHByb2dyZXNzIGJhci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9ncmVzcyByZXBvcnRpbmdcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlc1RvdGFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGlvbiB0aW1lIG9mIHRoZSBjaGFuZ2Ugc2V0XG4gICAqXG4gICAqIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciBldmVudHMsIG9ubHkgc2hvd2luZyB0aG9zZSBmcm9tIGFmdGVyIHRoZSBjaGFuZ2VcbiAgICogc2V0IGNyZWF0aW9uIHRpbWUuXG4gICAqXG4gICAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzLCBvdGhlcndpc2UgdGhlIGZpbHRlcmluZyB3aWxsIGJlIHN1YmplY3RcbiAgICogdG8gY2xvY2sgZHJpZnQgYmV0d2VlbiBsb2NhbCBhbmQgY2xvdWQgbWFjaGluZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTG9jYWwgbWFjaGluZSdzIGN1cnJlbnQgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlU2V0Q3JlYXRpb25UaW1lPzogRGF0ZTtcblxuICAvKipcbiAgICogVGltZSB0byB3YWl0IGJldHdlZW4gZmV0Y2hpbmcgbmV3IGFjdGl2aXRpZXMuXG4gICAqXG4gICAqIE11c3Qgd2FpdCBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiBwb2xscywgc2luY2Ugd2UgbmVlZCB0byBjb25zaWRlciBDbG91ZEZvcm1hdGlvbiBBUEkgbGltaXRzXG4gICAqXG4gICAqIEBkZWZhdWx0IDJfMDAwXG4gICAqL1xuICByZWFkb25seSBwb2xsaW5nSW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHJlc291cmNlcywgdXNlZCB0byBsb29rIHVwIHRoZSBib290c3RyYXAgdG9vbGtpdCB2ZXJzaW9uIHdoZW5cbiAgICogZGlhZ25vc2luZyBHdWFyZCBIb29rIGFubm90YXRpb24gZmV0Y2ggZmFpbHVyZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQm9vdHN0cmFwIHZlcnNpb24gaXMgbm90IHJlcG9ydGVkIGluIGVycm9yIG1lc3NhZ2VzXG4gICAqL1xuICByZWFkb25seSBlbnZSZXNvdXJjZXM/OiBFbnZpcm9ubWVudFJlc291cmNlcztcbn1cblxuLyoqXG4gKiBEcml2ZXMgdGhlIG1vbml0b3Jpbmcgb2YgYSBTdGFjayBkZXBsb3ltZW50XG4gKlxuICogYGBgXG4gKiDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gKiDilIIgICAgICAgICBTdGFjayAgICAgICAgIOKUgiBwb2xsKCkg4pSCICAgICAgICAgU3RhY2sgICAgICAgICDilIIgIHByb2Nlc3MoZXYpIOKUgiAgICAgICAgIFN0YWNrICAgICAgICAg4pSCXG4gKiDilIIgICAgICBFdmVudFBvbGxlciAgICAgIOKUguKXgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgiAgICBBY3Rpdml0eU1vbml0b3IgICAg4pSC4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pa24pSCICAgIFByb2dyZXNzTW9uaXRvciAgICDilIJcbiAqIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAgICAgICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU3RhY2tBY3Rpdml0eU1vbml0b3Ige1xuICAvKipcbiAgICogVGhlIHBvbGxlciB1c2VkIHRvIHJlYWQgc3RhY2sgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBvbGxlcjogU3RhY2tFdmVudFBvbGxlcjtcblxuICAvKipcbiAgICogRmV0Y2ggbmV3IGFjdGl2aXR5IGV2ZXJ5IDEgc2Vjb25kXG4gICAqIFByaW50ZXJzIGNhbiBkZWNpZGUgdG8gdXBkYXRlIGEgdmlldyBsZXNzIGZyZXF1ZW50bHkgaWYgZGVzaXJlZFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwb2xsaW5nSW50ZXJ2YWw6IG51bWJlcjtcblxuICBwcml2YXRlIG1vbml0b3JJZD86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb2dyZXNzTW9uaXRvcjogU3RhY2tQcm9ncmVzc01vbml0b3I7XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdGljayB0aW1lclxuICAgKi9cbiAgcHJpdmF0ZSB0aWNrVGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcblxuICAvKipcbiAgICogU2V0IHRvIHRoZSBhY3Rpdml0eSBvZiByZWFkaW5nIHRoZSBjdXJyZW50IGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkUHJvbWlzZT86IFByb21pc2U8YW55PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFjazogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IGNmbjogSUNsb3VkRm9ybWF0aW9uQ2xpZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGVudlJlc291cmNlcz86IEVudmlyb25tZW50UmVzb3VyY2VzO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjZm4sXG4gICAgaW9IZWxwZXIsXG4gICAgc3RhY2ssXG4gICAgc3RhY2tOYW1lLFxuICAgIHJlc291cmNlc1RvdGFsLFxuICAgIGNoYW5nZVNldENyZWF0aW9uVGltZSxcbiAgICBwb2xsaW5nSW50ZXJ2YWwgPSAyXzAwMCxcbiAgICBlbnZSZXNvdXJjZXMsXG4gIH06IFN0YWNrQWN0aXZpdHlNb25pdG9yUHJvcHMpIHtcbiAgICB0aGlzLmlvSGVscGVyID0gaW9IZWxwZXI7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuc3RhY2tOYW1lID0gc3RhY2tOYW1lO1xuICAgIHRoaXMuY2ZuID0gY2ZuO1xuICAgIHRoaXMuZW52UmVzb3VyY2VzID0gZW52UmVzb3VyY2VzO1xuXG4gICAgdGhpcy5wcm9ncmVzc01vbml0b3IgPSBuZXcgU3RhY2tQcm9ncmVzc01vbml0b3IocmVzb3VyY2VzVG90YWwpO1xuICAgIHRoaXMucG9sbGluZ0ludGVydmFsID0gcG9sbGluZ0ludGVydmFsO1xuICAgIHRoaXMucG9sbGVyID0gbmV3IFN0YWNrRXZlbnRQb2xsZXIoY2ZuLCB7XG4gICAgICBzdGFja05hbWUsXG4gICAgICBpbml0aWFsUG9sbFJhbmdlOiBQb2xsUmFuZ2Uuc2luY2VUaW1lc3RhbXAoY2hhbmdlU2V0Q3JlYXRpb25UaW1lPy5nZXRUaW1lKCkgPz8gRGF0ZS5ub3coKSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIGVycm9ycyB0aGF0IHdlcmUgZGlzY292ZXJlZCBkdXJpbmcgbW9uaXRvcmluZyBvZiB0aGlzIHN0YWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVycm9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5wb2xsZXIuZXJyb3JzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0KCkge1xuICAgIHRoaXMubW9uaXRvcklkID0gdXVpZC52NCgpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1NTAxLm1zZyhgRGVwbG95aW5nICR7dGhpcy5zdGFja05hbWV9YCwge1xuICAgICAgZGVwbG95bWVudDogdGhpcy5tb25pdG9ySWQsXG4gICAgICBzdGFjazogdGhpcy5zdGFjayxcbiAgICAgIHN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICByZXNvdXJjZXNUb3RhbDogdGhpcy5wcm9ncmVzc01vbml0b3IudG90YWwsXG4gICAgfSkpO1xuICAgIHRoaXMuc2NoZWR1bGVOZXh0VGljaygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0b3AoKSB7XG4gICAgY29uc3Qgb2xkTW9uaXRvcklkID0gdGhpcy5tb25pdG9ySWQhO1xuICAgIHRoaXMubW9uaXRvcklkID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnRpY2tUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGlja1RpbWVyKTtcbiAgICB9XG5cbiAgICAvLyBEbyBhIGZpbmFsIHBvbGwgZm9yIGFsbCBldmVudHMuIFRoaXMgaXMgdG8gaGFuZGxlIHRoZSBzaXR1YXRpb24gd2hlcmUgRGVzY3JpYmVTdGFja1N0YXR1c1xuICAgIC8vIGFscmVhZHkgcmV0dXJuZWQgYW4gZXJyb3IsIGJ1dCB0aGUgbW9uaXRvciBoYXNuJ3Qgc2VlbiBhbGwgdGhlIGV2ZW50cyB5ZXQgYW5kIHdlJ2QgZW5kXG4gICAgLy8gdXAgbm90IHByaW50aW5nIHRoZSBmYWlsdXJlIHJlYXNvbiB0byB1c2Vycy5cbiAgICBhd2FpdCB0aGlzLmZpbmFsUG9sbFRvRW5kKG9sZE1vbml0b3JJZCk7XG5cbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTUwMy5tc2coYENvbXBsZXRlZCAke3RoaXMuc3RhY2tOYW1lfWAsIHtcbiAgICAgIGRlcGxveW1lbnQ6IG9sZE1vbml0b3JJZCxcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgc3RhY2tOYW1lOiB0aGlzLnN0YWNrTmFtZSxcbiAgICAgIHJlc291cmNlc1RvdGFsOiB0aGlzLnByb2dyZXNzTW9uaXRvci50b3RhbCxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlTmV4dFRpY2soKSB7XG4gICAgaWYgKCF0aGlzLm1vbml0b3JJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudGlja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMudGljaygpLCB0aGlzLnBvbGxpbmdJbnRlcnZhbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRpY2soKSB7XG4gICAgaWYgKCF0aGlzLm1vbml0b3JJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlYWRQcm9taXNlID0gdGhpcy5yZWFkTmV3RXZlbnRzKHRoaXMubW9uaXRvcklkKTtcbiAgICAgIGF3YWl0IHRoaXMucmVhZFByb21pc2U7XG4gICAgICB0aGlzLnJlYWRQcm9taXNlID0gdW5kZWZpbmVkO1xuXG4gICAgICAvLyBXZSBtaWdodCBoYXZlIGJlZW4gc3RvcCgpcGVkIHdoaWxlIHRoZSBuZXR3b3JrIGNhbGwgd2FzIGluIHByb2dyZXNzLlxuICAgICAgaWYgKCF0aGlzLm1vbml0b3JJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTU1MDAubXNnKFxuICAgICAgICB1dGlsLmZvcm1hdCgnRXJyb3Igb2NjdXJyZWQgd2hpbGUgbW9uaXRvcmluZyBzdGFjazogJXMnLCBlKSxcbiAgICAgICAgeyBlcnJvcjogZSBhcyBhbnkgfSxcbiAgICAgICkpO1xuICAgIH1cbiAgICB0aGlzLnNjaGVkdWxlTmV4dFRpY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE1ldGFkYXRhRm9yKGxvZ2ljYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnN0YWNrLm1ldGFkYXRhO1xuICAgIGlmICghbG9naWNhbElkIHx8ICFtZXRhZGF0YSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc291cmNlTWV0YWRhdGEodGhpcy5zdGFjaywgbG9naWNhbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmltcyBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UsIGNvbGxhcHNlcyBhbGwgaW50ZXJuYWwgd2hpdGVzcGFjZVxuICAgKiAoaW5jbHVkaW5nIG5ld2xpbmVzKSB0byBhIHNpbmdsZSBzcGFjZSwgYW5kIHRydW5jYXRlcyB0byBgbWF4Q2hhcnNgXG4gICAqIGNoYXJhY3RlcnMsIGFwcGVuZGluZyBgWy4uLnRydW5jYXRlZF1gIHdoZW4gdGhlIG9yaWdpbmFsIHdhcyBsb25nZXIuXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCBtYXhDaGFyczogbnVtYmVyID0gNDAwKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gbWVzc2FnZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIHJldHVybiBub3JtYWxpemVkLmxlbmd0aCA+IG1heENoYXJzXG4gICAgICA/IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIG1heENoYXJzKSArICdbLi4udHJ1bmNhdGVkXSdcbiAgICAgIDogbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIEd1YXJkIEhvb2sgYW5ub3RhdGlvbiBkZXRhaWxzIHZpYSBHZXRIb29rUmVzdWx0IEFQSSBhbmQgZm9ybWF0cyB0aGVtXG4gICAqIGludG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBmZXRjaCBmYWlscyBvciB0aGVyZVxuICAgKiBhcmUgbm8gZmFpbGVkIGFubm90YXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEd1YXJkSG9va0Fubm90YXRpb25zKGhvb2tJbnZvY2F0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2ZuLmdldEhvb2tSZXN1bHQoeyBIb29rUmVzdWx0SWQ6IGhvb2tJbnZvY2F0aW9uSWQgfSk7XG4gICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IHJlc3VsdC5Bbm5vdGF0aW9ucyA/PyBbXTtcbiAgICAgIGNvbnN0IGZhaWxlZEFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuZmlsdGVyKChhKSA9PiBhLlN0YXR1cyA9PT0gJ0ZBSUxFRCcpO1xuICAgICAgaWYgKGZhaWxlZEFubm90YXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbJ05vbkNvbXBsaWFudCBSdWxlczonLCAnJ107XG4gICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgZmFpbGVkQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgaWYgKGFubm90YXRpb24uQW5ub3RhdGlvbk5hbWUpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGBbJHthbm5vdGF0aW9uLkFubm90YXRpb25OYW1lfV1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbi5TdGF0dXNNZXNzYWdlKSB7XG4gICAgICAgICAgbGluZXMucHVzaChg4oCiICR7dGhpcy5ub3JtYWxpemVNZXNzYWdlKGFubm90YXRpb24uU3RhdHVzTWVzc2FnZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24uUmVtZWRpYXRpb25NZXNzYWdlKSB7XG4gICAgICAgICAgbGluZXMucHVzaChgUmVtZWRpYXRpb246ICR7dGhpcy5ub3JtYWxpemVNZXNzYWdlKGFubm90YXRpb24uUmVtZWRpYXRpb25NZXNzYWdlKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKS50cmltRW5kKCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSk7XG5cbiAgICAgIGNvbnN0IGlzUGVybWlzc2lvbnNFcnJvciA9XG4gICAgICAgIGUubmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicgfHxcbiAgICAgICAgKHR5cGVvZiBlcnJvck1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdub3QgYXV0aG9yaXplZCB0byBwZXJmb3JtOiBjbG91ZGZvcm1hdGlvbjpnZXRob29rcmVzdWx0JykpO1xuXG4gICAgICBpZiAoaXNQZXJtaXNzaW9uc0Vycm9yICYmIHRoaXMuZW52UmVzb3VyY2VzKSB7XG4gICAgICAgIGxldCBjdXJyZW50VmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGN1cnJlbnRWZXJzaW9uID0gKGF3YWl0IHRoaXMuZW52UmVzb3VyY2VzLmxvb2t1cFRvb2xraXQoKSkudmVyc2lvbjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gaWdub3JlIGVycm9ycyBsb29raW5nIHVwIHRoZSBib290c3RyYXAgdmVyc2lvblxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy53YXJuKFxuICAgICAgICAgIHV0aWwuZm9ybWF0KFxuICAgICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCByZXN1bHQgZGV0YWlscyBmb3IgSG9vayBpbnZvY2F0aW9uICR7aG9va0ludm9jYXRpb25JZH06ICR7ZXJyb3JNZXNzYWdlfS4gTWFrZSBzdXJlIHlvdSBoYXZlIHBlcm1pc3Npb25zIHRvIGNhbGwgdGhlIEdldEhvb2tSZXN1bHQgQVBJLCBvciByZS1ib290c3RyYXAgeW91ciBlbnZpcm9ubWVudCBieSBydW5uaW5nICdjZGsgYm9vdHN0cmFwJyB0byB1cGRhdGUgdGhlIEJvb3RzdHJhcCBDREsgVG9vbGtpdCBzdGFjay5cbiAgICAgICAgICAgICdCb290c3RyYXAgdG9vbGtpdCBzdGFjayB2ZXJzaW9uIDMxIG9yIGxhdGVyIGlzIG5lZWRlZDsgY3VycmVudCB2ZXJzaW9uOiAke2N1cnJlbnRWZXJzaW9uID8/ICd1bmtub3duJ30uYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy53YXJuKFxuICAgICAgICAgIHV0aWwuZm9ybWF0KCdGYWlsZWQgdG8gZmV0Y2ggR3VhcmQgSG9vayBkZXRhaWxzIGZvciBpbnZvY2F0aW9uICVzOiAlcycsIGhvb2tJbnZvY2F0aW9uSWQsIGVycm9yTWVzc2FnZSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFsbCBuZXcgZXZlbnRzIGZyb20gdGhlIHN0YWNrIGhpc3RvcnlcbiAgICpcbiAgICogVGhlIGV2ZW50cyBhcmUgcmV0dXJuZWQgaW4gY2hyb25vbG9naWNhbCBvcmRlciBieSB0aGUgdW5kZXJseWluZyBwb2xsZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWROZXdFdmVudHMobW9uaXRvcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb2xsRXZlbnRzID0gYXdhaXQgdGhpcy5wb2xsZXIucG9sbCgpO1xuXG4gICAgZm9yIChjb25zdCByZXNvdXJjZUV2ZW50IG9mIHBvbGxFdmVudHMpIHtcbiAgICAgIHRoaXMucHJvZ3Jlc3NNb25pdG9yLnByb2Nlc3MocmVzb3VyY2VFdmVudCk7XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgYSBmYWlsZWQgR3VhcmQgSG9vayBldmVudCB3aXRoIGFuIGludm9jYXRpb24gSUQsIGZldGNoIGFubm90YXRpb25zXG4gICAgICBpZiAocmVzb3VyY2VFdmVudC5ldmVudC5Ib29rSW52b2NhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25zID0gYXdhaXQgdGhpcy5mZXRjaEd1YXJkSG9va0Fubm90YXRpb25zKHJlc291cmNlRXZlbnQuZXZlbnQuSG9va0ludm9jYXRpb25JZCk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9ucykge1xuICAgICAgICAgIHJlc291cmNlRXZlbnQuZXZlbnQuSG9va1N0YXR1c1JlYXNvbiA9IGFubm90YXRpb25zO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdGl2aXR5OiBTdGFja0FjdGl2aXR5ID0ge1xuICAgICAgICBkZXBsb3ltZW50OiBtb25pdG9ySWQsXG4gICAgICAgIGV2ZW50OiByZXNvdXJjZUV2ZW50LmV2ZW50LFxuICAgICAgICBtZXRhZGF0YTogdGhpcy5maW5kTWV0YWRhdGFGb3IocmVzb3VyY2VFdmVudC5ldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCksXG4gICAgICAgIHByb2dyZXNzOiB0aGlzLnByb2dyZXNzTW9uaXRvci5wcm9ncmVzcyxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1NTAyLm1zZyh0aGlzLmZvcm1hdEFjdGl2aXR5KGFjdGl2aXR5LCB0cnVlKSwgYWN0aXZpdHkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIGZpbmFsIHBvbGwgdG8gdGhlIGVuZCBhbmQgZmx1c2ggb3V0IGFsbCBldmVudHMgdG8gdGhlIHByaW50ZXJcbiAgICpcbiAgICogRmluaXNoIGFueSBwb2xsIGN1cnJlbnRseSBpbiBwcm9ncmVzcywgdGhlbiBkbyBhIGZpbmFsIG9uZSB1bnRpbCB3ZSd2ZVxuICAgKiByZWFjaGVkIHRoZSBsYXN0IHBhZ2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmFsUG9sbFRvRW5kKG1vbml0b3JJZDogc3RyaW5nKSB7XG4gICAgLy8gSWYgd2Ugd2VyZSBkb2luZyBhIHBvbGwsIGZpbmlzaCB0aGF0IGZpcnN0LiBJdCB3YXMgc3RhcnRlZCBiZWZvcmVcbiAgICAvLyB0aGUgbW9tZW50IHdlIHdlcmUgc3VyZSB3ZSB3ZXJlbid0IGdvaW5nIHRvIGdldCBhbnkgbmV3IGV2ZW50cyBhbnltb3JlXG4gICAgLy8gc28gd2UgbmVlZCB0byBkbyBhIG5ldyBvbmUgYW55d2F5LiBOZWVkIHRvIHdhaXQgZm9yIHRoaXMgb25lIHRob3VnaFxuICAgIC8vIGJlY2F1c2Ugb3VyIHN0YXRlIGlzIHNpbmdsZS10aHJlYWRlZC5cbiAgICBpZiAodGhpcy5yZWFkUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5yZWFkUHJvbWlzZTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnJlYWROZXdFdmVudHMobW9uaXRvcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGEgc3RhY2sgYWN0aXZpdHkgaW50byBhIGJhc2ljIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRBY3Rpdml0eShhY3Rpdml0eTogU3RhY2tBY3Rpdml0eSwgcHJvZ3Jlc3M6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGV2ZW50ID0gYWN0aXZpdHkuZXZlbnQ7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBhY3Rpdml0eS5tZXRhZGF0YTtcblxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IG1ldGFkYXRhID8gbWV0YWRhdGEuY29uc3RydWN0UGF0aCA6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkIHx8ICcnO1xuICAgIGNvbnN0IGxvZ2ljYWxJZCA9IHJlc291cmNlTmFtZSAhPT0gZXZlbnQuTG9naWNhbFJlc291cmNlSWQgPyBgKCR7ZXZlbnQuTG9naWNhbFJlc291cmNlSWR9KSBgIDogJyc7XG5cbiAgICByZXR1cm4gdXRpbC5mb3JtYXQoXG4gICAgICAnJXMgfCAlcyVzIHwgJXMgfCAlcyB8ICVzICVzJXMlcycsXG4gICAgICBldmVudC5TdGFja05hbWUsXG4gICAgICBwcm9ncmVzcyAhPT0gZmFsc2UgPyBgJHthY3Rpdml0eS5wcm9ncmVzcy5mb3JtYXR0ZWR9IHwgYCA6ICcnLFxuICAgICAgbmV3IERhdGUoZXZlbnQuVGltZXN0YW1wISkudG9Mb2NhbGVUaW1lU3RyaW5nKCksXG4gICAgICBldmVudC5SZXNvdXJjZVN0YXR1cyB8fCAnJyxcbiAgICAgIGV2ZW50LlJlc291cmNlVHlwZSxcbiAgICAgIHJlc291cmNlTmFtZSxcbiAgICAgIGxvZ2ljYWxJZCxcbiAgICAgIGV2ZW50LlJlc291cmNlU3RhdHVzUmVhc29uID8gZXZlbnQuUmVzb3VyY2VTdGF0dXNSZWFzb24gOiAnJyxcbiAgICAgIG1ldGFkYXRhPy5lbnRyeS50cmFjZSA/IGBcXG5cXHQke21ldGFkYXRhLmVudHJ5LnRyYWNlLmpvaW4oJ1xcblxcdFxcXFxfICcpfWAgOiAnJyxcbiAgICApO1xuICB9XG59XG5cbiJdfQ==
|