@aligent/cdk-aspects 0.6.2 → 0.6.3
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/CHANGELOG.md +6 -0
- package/lib/resource-prefix.d.ts +9 -8
- package/lib/resource-prefix.js +37 -29
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @aligent/cdk-aspects
|
|
2
2
|
|
|
3
|
+
## 0.6.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#1696](https://github.com/aligent/cdk-constructs/pull/1696) [`d05f4f8`](https://github.com/aligent/cdk-constructs/commit/d05f4f895fb10ec388a981c36c532f428869c98c) Thanks [@kai-nguyen-aligent](https://github.com/kai-nguyen-aligent)! - Fix ResourcePrefixAspect to gracefully handle CDK tokens (e.g. `Fn.ref`, `Lazy.string`) in resource name properties by falling back to the sanitised logical ID.
|
|
8
|
+
|
|
3
9
|
## 0.6.2
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
package/lib/resource-prefix.d.ts
CHANGED
|
@@ -56,18 +56,19 @@ export declare class ResourcePrefixAspect implements IAspect {
|
|
|
56
56
|
private shouldSkipResource;
|
|
57
57
|
private isAlreadyPrefixed;
|
|
58
58
|
/**
|
|
59
|
-
* Resolves the
|
|
60
|
-
*
|
|
61
|
-
*
|
|
59
|
+
* Resolves the name components for a resource: the explicitly set raw name (if any)
|
|
60
|
+
* and a sanitised logical ID derived from the construct tree.
|
|
61
|
+
*
|
|
62
|
+
* The raw name is looked up from the CFN properties in both PascalCase and camelCase
|
|
63
|
+
* (CDK stores L1 properties in camelCase internally). When no explicit name is set,
|
|
64
|
+
* `rawName` is `undefined`.
|
|
62
65
|
*/
|
|
63
|
-
private
|
|
66
|
+
private resolveResourceNames;
|
|
64
67
|
/**
|
|
65
68
|
* Builds the prefixed name, handling special cases for specific resource types.
|
|
66
69
|
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* @param cfnProperties - The CloudFormation resource properties
|
|
70
|
-
* @returns The final prefixed name with any special case handling applied
|
|
70
|
+
* Uses the raw name when it is a concrete string, falling back to the logical
|
|
71
|
+
* name when the raw name is an unresolved CDK token.
|
|
71
72
|
*/
|
|
72
73
|
private buildPrefixedName;
|
|
73
74
|
/**
|
package/lib/resource-prefix.js
CHANGED
|
@@ -101,14 +101,14 @@ class ResourcePrefixAspect {
|
|
|
101
101
|
}
|
|
102
102
|
const { cfnName, maxLength } = config;
|
|
103
103
|
const cfnProperties = (_b = (_a = node._cfnProperties) !== null && _a !== void 0 ? _a : node.cfnProperties) !== null && _b !== void 0 ? _b : {};
|
|
104
|
-
const
|
|
105
|
-
if (this.shouldSkipResource(resourceType,
|
|
104
|
+
const names = this.resolveResourceNames(node, cfnName, cfnProperties);
|
|
105
|
+
if (this.shouldSkipResource(resourceType, names)) {
|
|
106
106
|
return;
|
|
107
107
|
}
|
|
108
|
-
if (this.isAlreadyPrefixed(
|
|
108
|
+
if (this.isAlreadyPrefixed(names)) {
|
|
109
109
|
return;
|
|
110
110
|
}
|
|
111
|
-
const prefixedName = this.buildPrefixedName(
|
|
111
|
+
const prefixedName = this.buildPrefixedName(names, resourceType, cfnProperties);
|
|
112
112
|
// Truncation applies to all overflows — including user-set names — because L3
|
|
113
113
|
// constructs can generate names the user has no direct control over.
|
|
114
114
|
const finalName = this.truncateToFit(prefixedName, maxLength, node);
|
|
@@ -121,60 +121,68 @@ class ResourcePrefixAspect {
|
|
|
121
121
|
* Determines whether a resource should be skipped from prefixing based on
|
|
122
122
|
* resource-type-specific rules (e.g., AWS-reserved naming conventions).
|
|
123
123
|
*/
|
|
124
|
-
shouldSkipResource(cfnResourceType,
|
|
125
|
-
|
|
124
|
+
shouldSkipResource(cfnResourceType, names) {
|
|
125
|
+
var _a;
|
|
126
|
+
const name = (_a = names.rawName) !== null && _a !== void 0 ? _a : names.logicalName;
|
|
127
|
+
return (cfnResourceType === "AWS::Logs::LogGroup" && name.startsWith("/aws/"));
|
|
126
128
|
}
|
|
127
|
-
isAlreadyPrefixed(
|
|
129
|
+
isAlreadyPrefixed(names) {
|
|
130
|
+
var _a;
|
|
131
|
+
const name = (_a = names.rawName) !== null && _a !== void 0 ? _a : names.logicalName;
|
|
128
132
|
return (name.startsWith(`${this.prefix}-`) || name.startsWith(`/${this.prefix}/`));
|
|
129
133
|
}
|
|
130
134
|
/**
|
|
131
|
-
* Resolves the
|
|
132
|
-
*
|
|
133
|
-
*
|
|
135
|
+
* Resolves the name components for a resource: the explicitly set raw name (if any)
|
|
136
|
+
* and a sanitised logical ID derived from the construct tree.
|
|
137
|
+
*
|
|
138
|
+
* The raw name is looked up from the CFN properties in both PascalCase and camelCase
|
|
139
|
+
* (CDK stores L1 properties in camelCase internally). When no explicit name is set,
|
|
140
|
+
* `rawName` is `undefined`.
|
|
134
141
|
*/
|
|
135
|
-
|
|
142
|
+
resolveResourceNames(node, cfnName, cfnProperties) {
|
|
136
143
|
var _a;
|
|
137
144
|
const camelCfnName = cfnName.charAt(0).toLowerCase() + cfnName.slice(1);
|
|
138
145
|
const rawName = (_a = cfnProperties[cfnName]) !== null && _a !== void 0 ? _a : cfnProperties[camelCfnName];
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
const logicalId = aws_cdk_lib_1.Stack.of(node).getLogicalId(node);
|
|
143
|
-
return logicalId
|
|
146
|
+
const logicalName = aws_cdk_lib_1.Stack.of(node)
|
|
147
|
+
.getLogicalId(node)
|
|
144
148
|
.replace(/[^a-zA-Z0-9]+/g, "-") // non-alphanumeric → dash
|
|
145
149
|
.replace(/^-+|-+$/g, ""); // trim leading/trailing dashes
|
|
150
|
+
return typeof rawName === "string"
|
|
151
|
+
? { logicalName, rawName }
|
|
152
|
+
: { logicalName, rawName: undefined };
|
|
146
153
|
}
|
|
147
154
|
/**
|
|
148
155
|
* Builds the prefixed name, handling special cases for specific resource types.
|
|
149
156
|
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
* @param cfnProperties - The CloudFormation resource properties
|
|
153
|
-
* @returns The final prefixed name with any special case handling applied
|
|
157
|
+
* Uses the raw name when it is a concrete string, falling back to the logical
|
|
158
|
+
* name when the raw name is an unresolved CDK token.
|
|
154
159
|
*/
|
|
155
|
-
buildPrefixedName(
|
|
160
|
+
buildPrefixedName(names, cfnResourceType, cfnProperties) {
|
|
161
|
+
const name = !names.rawName || aws_cdk_lib_1.Token.isUnresolved(names.rawName)
|
|
162
|
+
? names.logicalName
|
|
163
|
+
: names.rawName;
|
|
156
164
|
// Special case: FIFO queues must end with .fifo suffix
|
|
157
165
|
if (cfnResourceType === "AWS::SQS::Queue" &&
|
|
158
166
|
cfnProperties.fifoQueue === true &&
|
|
159
|
-
!
|
|
160
|
-
return `${this.prefix}-${
|
|
167
|
+
!name.endsWith(".fifo")) {
|
|
168
|
+
return `${this.prefix}-${name}.fifo`;
|
|
161
169
|
}
|
|
162
170
|
// Special case: FIFO topics must end with .fifo suffix
|
|
163
171
|
if (cfnResourceType === "AWS::SNS::Topic" &&
|
|
164
172
|
cfnProperties.fifoTopic === true &&
|
|
165
|
-
!
|
|
166
|
-
return `${this.prefix}-${
|
|
173
|
+
!name.endsWith(".fifo")) {
|
|
174
|
+
return `${this.prefix}-${name}.fifo`;
|
|
167
175
|
}
|
|
168
176
|
// Special case: SSM parameter names use path-style prefix
|
|
169
177
|
if (cfnResourceType === "AWS::SSM::Parameter") {
|
|
170
|
-
return `/${this.prefix}/${
|
|
178
|
+
return `/${this.prefix}/${name}`;
|
|
171
179
|
}
|
|
172
180
|
// Special case: S3 bucket name be lowercase only
|
|
173
181
|
if (cfnResourceType === "AWS::S3::Bucket") {
|
|
174
|
-
return `${this.prefix}-${
|
|
182
|
+
return `${this.prefix}-${name}`.toLowerCase();
|
|
175
183
|
}
|
|
176
184
|
// Default: simple prefix
|
|
177
|
-
return `${this.prefix}-${
|
|
185
|
+
return `${this.prefix}-${name}`;
|
|
178
186
|
}
|
|
179
187
|
/**
|
|
180
188
|
* Truncates a prefixed name to fit within maxLength by hashing the original
|
|
@@ -216,4 +224,4 @@ class ResourcePrefixAspect {
|
|
|
216
224
|
}
|
|
217
225
|
}
|
|
218
226
|
exports.ResourcePrefixAspect = ResourcePrefixAspect;
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcHJlZml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVzb3VyY2UtcHJlZml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1RTtBQUV2RSxtQ0FBb0M7QUErQnBDOzs7R0FHRztBQUNILE1BQU0sZUFBZSxHQUF1QztJQUMxRCxVQUFVO0lBQ1YsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFFbkUsVUFBVTtJQUNWLGlCQUFpQixFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQzNELHNCQUFzQixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ2hFLDRCQUE0QixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBRXRFLFlBQVk7SUFDWixpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMxRCxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtJQUUzRCwyQkFBMkI7SUFDM0IsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFDNUQsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDdkQseUJBQXlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDN0Qsa0JBQWtCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDdEQsa0NBQWtDLEVBQUU7UUFDbEMsT0FBTyxFQUFFLGtCQUFrQjtRQUMzQixTQUFTLEVBQUUsRUFBRTtLQUNkO0lBQ0QsOEJBQThCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDbEUsMEJBQTBCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDOUQsK0JBQStCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFFbkUsTUFBTTtJQUNOLDBCQUEwQixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQy9ELDRCQUE0QixFQUFFLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQzFFLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQzlELHdCQUF3QixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQzdELCtCQUErQixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBRXBFLG1CQUFtQjtJQUNuQiw2QkFBNkIsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtJQUNsRSxxQkFBcUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTtJQUMzRCw2QkFBNkIsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUNqRSw2QkFBNkIsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUVqRSxnQkFBZ0I7SUFDaEIsK0NBQStDLEVBQUU7UUFDL0MsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsRUFBRTtLQUNkO0lBRUQsZ0JBQWdCO0lBQ2hCLHFCQUFxQixFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ2xFLHdCQUF3QixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBRWxFLE1BQU07SUFDTixnQkFBZ0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtDQUN6RCxDQUFDO0FBaUJGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFhLG9CQUFvQjtJQUkvQixZQUFZLEtBQWdDOztRQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLHNHQUFzRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQ3RILENBQUM7UUFFSixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFBLEtBQUssQ0FBQyxPQUFPLG1DQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBZ0I7O1FBQ3BCLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSx5QkFBVyxDQUFDO1lBQUUsT0FBTztRQUUzQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDOUMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUN0QyxNQUFNLGFBQWEsR0FDakIsTUFBQSxNQUFDLElBQTZCLENBQUMsY0FBYyxtQ0FDNUMsSUFBNkIsQ0FBQyxhQUFhLG1DQUM1QyxFQUFFLENBQUM7UUFFTCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFcEUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDcEQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUN6QyxRQUFRLEVBQ1IsWUFBWSxFQUNaLGFBQWEsQ0FDZCxDQUFDO1FBRUYsOEVBQThFO1FBQzlFLHFFQUFxRTtRQUNyRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFcEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFMUUsSUFBSSxRQUFRO1lBQUUsT0FBTztRQUVyQixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7O09BR0c7SUFDSyxrQkFBa0IsQ0FBQyxlQUF1QixFQUFFLFFBQWdCO1FBQ2xFLE9BQU8sQ0FDTCxlQUFlLEtBQUsscUJBQXFCLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FDMUUsQ0FBQztJQUNKLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxJQUFZO1FBQ3BDLE9BQU8sQ0FDTCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxlQUFlLENBQ3JCLElBQWlCLEVBQ2pCLE9BQWUsRUFDZixhQUFzQzs7UUFFdEMsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sT0FBTyxHQUFHLE1BQUEsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQ0FBSSxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEUsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELE9BQU8sU0FBUzthQUNiLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQywwQkFBMEI7YUFDekQsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtJQUM3RCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLGlCQUFpQixDQUN2QixRQUFnQixFQUNoQixlQUF1QixFQUN2QixhQUFzQztRQUV0Qyx1REFBdUQ7UUFDdkQsSUFDRSxlQUFlLEtBQUssaUJBQWlCO1lBQ3JDLGFBQWEsQ0FBQyxTQUFTLEtBQUssSUFBSTtZQUNoQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQzNCLENBQUM7WUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxRQUFRLE9BQU8sQ0FBQztRQUMzQyxDQUFDO1FBRUQsdURBQXVEO1FBQ3ZELElBQ0UsZUFBZSxLQUFLLGlCQUFpQjtZQUNyQyxhQUFhLENBQUMsU0FBUyxLQUFLLElBQUk7WUFDaEMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUMzQixDQUFDO1lBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxPQUFPLENBQUM7UUFDM0MsQ0FBQztRQUVELDBEQUEwRDtRQUMxRCxJQUFJLGVBQWUsS0FBSyxxQkFBcUIsRUFBRSxDQUFDO1lBQzlDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxpREFBaUQ7UUFDakQsSUFBSSxlQUFlLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztZQUMxQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwRCxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxhQUFhLENBQ25CLElBQVksRUFDWixTQUFpQixFQUNqQixJQUFnQjtRQUVoQixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTFDLE1BQU0sSUFBSSxHQUFHLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFekUsNEVBQTRFO1FBQzVFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRXhFLG9EQUFvRDtRQUNwRCxNQUFNLE1BQU0sR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMzRCxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDO1FBRTNFLHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FDN0IsMkJBQTJCLElBQUksTUFBTSxJQUFJLENBQUMsTUFBTSxpREFBaUQsU0FBUyxJQUFJO1lBQzVHLCtCQUErQixTQUFTLHNEQUFzRCxJQUFJLENBQUMsTUFBTSx5QkFBeUIsQ0FDckksQ0FBQztRQUVGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSyxvQkFBb0IsQ0FDMUIsSUFBWSxFQUNaLGVBQXVCLEVBQ3ZCLElBQWdCO1FBRWhCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztRQUVyQixJQUFJLGVBQWUsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQzFDLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNoQyx5QkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQzNCLDBDQUEwQyxJQUFJLGdDQUFnQztvQkFDNUUsc0NBQXNDLENBQ3pDLENBQUM7Z0JBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNsQixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FDM0IsMENBQTBDLElBQUksMEJBQTBCO29CQUN0RSwrREFBK0QsQ0FDbEUsQ0FBQztnQkFDRixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBeE1ELG9EQXdNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBDZm5SZXNvdXJjZSwgSUFzcGVjdCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIjtcblxuaW50ZXJmYWNlIFJlc291cmNlTmFtZUNvbmZpZyB7XG4gIC8qKiBUaGUgQ2xvdWRGb3JtYXRpb24gcHJvcGVydHkgdGhhdCBob2xkcyB0aGUgcmVzb3VyY2UncyBwaHlzaWNhbCBuYW1lICovXG4gIGNmbk5hbWU6IHN0cmluZztcbiAgLyoqIE1heGltdW0gYWxsb3dlZCBjaGFyYWN0ZXIgbGVuZ3RoIGZvciB0aGlzIHJlc291cmNlIHR5cGUgKi9cbiAgbWF4TGVuZ3RoOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXh0ZW5zaW9uIHR5cGUgdG8gYWNjZXNzIGludGVybmFsIENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXMgb24gQ2ZuUmVzb3VyY2UuXG4gKlxuICogQ0RLIGRvZXMgbm90IHByb3ZpZGUgYSBwdWJsaWMgQVBJIHRvIHJlYWQgcmF3IENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXMgdGhhdCBoYXZlXG4gKiBiZWVuIHNldCBvbiBhIENmblJlc291cmNlLiBUaGUgcHJvcGVydGllcyBgX2NmblByb3BlcnRpZXNgIGFuZCBgY2ZuUHJvcGVydGllc2AgYXJlXG4gKiBwcm90ZWN0ZWQgYW5kIG9ubHkgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIENmblJlc291cmNlIGNsYXNzIGhpZXJhcmNoeS5cbiAqXG4gKiBXZSBpbnZlc3RpZ2F0ZWQgdXNpbmcgQ0RLJ3MgcHVibGljIEFQSXMsIGJ1dCB0aGVyZSBpcyBubyBwdWJsaWMgbWV0aG9kIHRvIHJldHJpZXZlXG4gKiB0aGUgcmF3IHByb3BlcnR5IHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBzZXQgKGUuZy4sIHZpYSBjb25zdHJ1Y3RvciBwcm9wcyBvciBhZGRQcm9wZXJ0eU92ZXJyaWRlKS5cbiAqIFRoZSBvbmx5IHB1YmxpYyBBUElzIGFyZSBmb3Igd3JpdGluZyAoYWRkUHJvcGVydHlPdmVycmlkZSwgYWRkUHJvcGVydHlEZWxldGlvbk92ZXJyaWRlKSBvclxuICogZ2V0dGluZyBhdHRyaWJ1dGUgcmVmZXJlbmNlcyAoZ2V0QXR0KSwgbm90IGZvciByZWFkaW5nIGxpdGVyYWwgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIFRoaXMgdHlwZSBhc3NlcnRpb24gaXMgc2FmZSBiZWNhdXNlOlxuICogLSBXZSBvbmx5IHJlYWQgdGhlc2UgcHJvcGVydGllcywgbmV2ZXIgbW9kaWZ5IHRoZW1cbiAqIC0gV2UgbmVlZCB0byBjaGVjayBpZiBhIHVzZXIgZXhwbGljaXRseSBzZXQgYSBuYW1lIHByb3BlcnR5IGJlZm9yZSBhcHBseWluZyBvdXIgcHJlZml4XG4gKiAtIFRoZSBwcm9wZXJ0aWVzIGV4aXN0IGF0IHJ1bnRpbWUgYW5kIGFyZSBwYXJ0IG9mIENESydzIGludGVybmFsIGltcGxlbWVudGF0aW9uXG4gKi9cbnR5cGUgQ2ZuUmVzb3VyY2VXaXRoUHJvcHMgPSBDZm5SZXNvdXJjZSAmIHtcbiAgcmVhZG9ubHkgX2NmblByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgY2ZuUHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuLyoqXG4gKiBNYXBzIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGVzIHRvIHRoZWlyIG5hbWUgcHJvcGVydHkgYW5kIEFXUyBsZW5ndGggbGltaXRzLlxuICogU291cmNlczogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXRlbXBsYXRlLXJlc291cmNlLXR5cGUtcmVmLmh0bWxcbiAqL1xuY29uc3QgUkVTT1VSQ0VfQ09ORklHOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU5hbWVDb25maWc+ID0ge1xuICAvLyBDb21wdXRlXG4gIFwiQVdTOjpMYW1iZGE6OkZ1bmN0aW9uXCI6IHsgY2ZuTmFtZTogXCJGdW5jdGlvbk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuXG4gIC8vIFN0b3JhZ2VcbiAgXCJBV1M6OlMzOjpCdWNrZXRcIjogeyBjZm5OYW1lOiBcIkJ1Y2tldE5hbWVcIiwgbWF4TGVuZ3RoOiA2MyB9LFxuICBcIkFXUzo6RHluYW1vREI6OlRhYmxlXCI6IHsgY2ZuTmFtZTogXCJUYWJsZU5hbWVcIiwgbWF4TGVuZ3RoOiAyNTUgfSxcbiAgXCJBV1M6OkR5bmFtb0RCOjpHbG9iYWxUYWJsZVwiOiB7IGNmbk5hbWU6IFwiVGFibGVOYW1lXCIsIG1heExlbmd0aDogMjU1IH0sXG5cbiAgLy8gTWVzc2FnaW5nXG4gIFwiQVdTOjpTUVM6OlF1ZXVlXCI6IHsgY2ZuTmFtZTogXCJRdWV1ZU5hbWVcIiwgbWF4TGVuZ3RoOiA4MCB9LFxuICBcIkFXUzo6U05TOjpUb3BpY1wiOiB7IGNmbk5hbWU6IFwiVG9waWNOYW1lXCIsIG1heExlbmd0aDogMjU2IH0sXG5cbiAgLy8gRXZlbnRpbmcgJiBPcmNoZXN0cmF0aW9uXG4gIFwiQVdTOjpFdmVudHM6OkV2ZW50QnVzXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMjU2IH0sXG4gIFwiQVdTOjpFdmVudHM6OlJ1bGVcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6RXZlbnRzOjpDb25uZWN0aW9uXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbiAgXCJBV1M6OlBpcGVzOjpQaXBlXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbiAgXCJBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZVwiOiB7XG4gICAgY2ZuTmFtZTogXCJTdGF0ZU1hY2hpbmVOYW1lXCIsXG4gICAgbWF4TGVuZ3RoOiA4MCxcbiAgfSxcbiAgXCJBV1M6OlN0ZXBGdW5jdGlvbnM6OkFjdGl2aXR5XCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogODAgfSxcbiAgXCJBV1M6OlNjaGVkdWxlcjo6U2NoZWR1bGVcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6U2NoZWR1bGVyOjpTY2hlZHVsZUdyb3VwXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcblxuICAvLyBBUElcbiAgXCJBV1M6OkFwaUdhdGV3YXk6OlJlc3RBcGlcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAxMjggfSxcbiAgXCJBV1M6OkFwaUdhdGV3YXk6OlVzYWdlUGxhblwiOiB7IGNmbk5hbWU6IFwiVXNhZ2VQbGFuTmFtZVwiLCBtYXhMZW5ndGg6IDEyOCB9LFxuICBcIkFXUzo6QXBpR2F0ZXdheTo6QXBpS2V5XCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG4gIFwiQVdTOjpBcGlHYXRld2F5VjI6OkFwaVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDEyOCB9LFxuICBcIkFXUzo6QXBpR2F0ZXdheVYyOjpBdXRob3JpemVyXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG5cbiAgLy8gU2VjcmV0cyAmIENvbmZpZ1xuICBcIkFXUzo6U2VjcmV0c01hbmFnZXI6OlNlY3JldFwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDUxMiB9LFxuICBcIkFXUzo6U1NNOjpQYXJhbWV0ZXJcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAyMDQ4IH0sXG4gIFwiQVdTOjpBcHBDb25maWc6OkFwcGxpY2F0aW9uXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbiAgXCJBV1M6OkFwcENvbmZpZzo6RW52aXJvbm1lbnRcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuXG4gIC8vIE5vdGlmaWNhdGlvbnNcbiAgXCJBV1M6Ok5vdGlmaWNhdGlvbnM6Ok5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb25cIjoge1xuICAgIGNmbk5hbWU6IFwiTmFtZVwiLFxuICAgIG1heExlbmd0aDogNjQsXG4gIH0sXG5cbiAgLy8gT2JzZXJ2YWJpbGl0eVxuICBcIkFXUzo6TG9nczo6TG9nR3JvdXBcIjogeyBjZm5OYW1lOiBcIkxvZ0dyb3VwTmFtZVwiLCBtYXhMZW5ndGg6IDUxMiB9LFxuICBcIkFXUzo6Q2xvdWRXYXRjaDo6QWxhcm1cIjogeyBjZm5OYW1lOiBcIkFsYXJtTmFtZVwiLCBtYXhMZW5ndGg6IDI1NSB9LFxuXG4gIC8vIElBTVxuICBcIkFXUzo6SUFNOjpSb2xlXCI6IHsgY2ZuTmFtZTogXCJSb2xlTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUHJlZml4QXNwZWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIHByZWZpeCB0byBhcHBseSB0byBhbGwgcmVzb3VyY2UgbmFtZXMuXG4gICAqIGUuZy4gJ215YXBwLXByb2QnIOKGkiAnbXlhcHAtcHJvZC1vcmRlcnMnXG4gICAqL1xuICBwcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgdHlwZXMgdG8gc2tpcCBlbnRpcmVseS5cbiAgICogZS5nLiBbJ0FXUzo6SUFNOjpSb2xlJ10gdG8gbGVhdmUgSUFNIHJvbGUgbmFtZXMgdW50b3VjaGVkLlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgZXhjbHVkZT86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENESyBBc3BlY3QgdGhhdCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIHBoeXNpY2FsIHJlc291cmNlIG5hbWVzIGFjcm9zcyBBV1MgcmVzb3VyY2VzLlxuICpcbiAqIEByZW1hcmtzXG4gKiAqKkNyaXRpY2FsIEltcGxlbWVudGF0aW9uIE5vdGVzOioqXG4gKlxuICogMS4gKipTdGFnZSBTeW50aGVzaXMgQm91bmRhcmllcyoqOlxuICogICAgLSBDREsgYFN0YWdlYCBjb25zdHJ1Y3RzIGNyZWF0ZSBzeW50aGVzaXMgYm91bmRhcmllcyB0aGF0IHByZXZlbnQgQXBwLWxldmVsIGFzcGVjdHNcbiAqICAgICAgZnJvbSB0cmF2ZXJzaW5nIGludG8gdGhlbVxuICogICAgLSBUaGlzIGFzcGVjdCBNVVNUIGJlIGFwcGxpZWQgdG8gZWFjaCBTdGFnZSBpbmRpdmlkdWFsbHksIG5vdCB0byB0aGUgQXBwXG4gKiAgICAtIEV4YW1wbGU6IGBBc3BlY3RzLm9mKHN0YWdlKS5hZGQobmV3IFJlc291cmNlUHJlZml4QXNwZWN0KHsuLi59KSlgXG4gKlxuICogMi4gKipQcm9wZXJ0eSBOYW1lIENhc2luZyoqOlxuICogICAgLSBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0aWVzIHVzZSBQYXNjYWxDYXNlIChlLmcuLCBgRnVuY3Rpb25OYW1lYCwgYEJ1Y2tldE5hbWVgKVxuICogICAgLSBVc2luZyBjYW1lbENhc2UgKGUuZy4sIGBmdW5jdGlvbk5hbWVgKSB3aWxsIGNhdXNlIGVycm9ycyB3aXRoIHZlcnNpb25pbmcgYXNwZWN0c1xuICogICAgLSBXaGVuIHVzaW5nIGBhZGRQcm9wZXJ0eU92ZXJyaWRlKClgLCBhbHdheXMgdXNlIHRoZSBleGFjdCBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0eSBuYW1lXG4gKlxuICogMy4gKipBc3BlY3QgUHJpb3JpdHkgd2l0aCBWZXJzaW9uaW5nKio6XG4gKiAgICAtIFdoZW4gY29tYmluaW5nIHdpdGggTGFtYmRhQW5kU3RlcEZ1bmN0aW9uVmVyc2lvbmluZ0FzcGVjdCwgYXBwbHkgdGhpcyBhc3BlY3QgQkVGT1JFIHZlcnNpb25pbmdcbiAqICAgIC0gVXNlIENESydzIHByaW9yaXR5IHN5c3RlbTogYEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChwcmVmaXhBc3BlY3QsIHsgcHJpb3JpdHk6IDEwMCB9KWBcbiAqICAgIC0gVGhlbjogYEFzcGVjdHMub2Yoc3RhZ2UpLmFkZCh2ZXJzaW9uaW5nQXNwZWN0LCB7IHByaW9yaXR5OiAyMDAgfSlgXG4gKiAgICAtIExvd2VyIHByaW9yaXR5IG51bWJlcnMgcnVuIGZpcnN0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENvcnJlY3QgdXNhZ2Ugd2l0aCBzdGFnaW5nXG4gKiBjb25zdCBzdGFnZSA9IG5ldyBBcHBsaWNhdGlvblN0YWdlKGFwcCwgJ3Byb2QnKTtcbiAqIEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChuZXcgUmVzb3VyY2VQcmVmaXhBc3BlY3QoeyBwcmVmaXg6ICdteWFwcCcgfSksIHsgcHJpb3JpdHk6IDEwMCB9KTtcbiAqIEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChuZXcgTGFtYmRhQW5kU3RlcEZ1bmN0aW9uVmVyc2lvbmluZ0FzcGVjdCgpLCB7IHByaW9yaXR5OiAyMDAgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlUHJlZml4QXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhjbHVkZTogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFJlc291cmNlUHJlZml4QXNwZWN0UHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnByZWZpeCB8fCAhL15bYS16MC05LV0rJC8udGVzdChwcm9wcy5wcmVmaXgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUmVzb3VyY2VQcmVmaXhBc3BlY3Q6IHByZWZpeCBtdXN0IGNvbnRhaW4gb25seSBsb3dlcmNhc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIGh5cGhlbnMsIGdvdCBcIiR7cHJvcHMucHJlZml4fVwiYFxuICAgICAgKTtcblxuICAgIHRoaXMucHJlZml4ID0gcHJvcHMucHJlZml4O1xuICAgIHRoaXMuZXhjbHVkZSA9IG5ldyBTZXQocHJvcHMuZXhjbHVkZSA/PyBbXSk7XG4gIH1cblxuICB2aXNpdChub2RlOiBJQ29uc3RydWN0KSB7XG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIENmblJlc291cmNlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gbm9kZS5jZm5SZXNvdXJjZVR5cGU7XG4gICAgY29uc3QgY29uZmlnID0gUkVTT1VSQ0VfQ09ORklHW3Jlc291cmNlVHlwZV07XG5cbiAgICBpZiAoIWNvbmZpZyB8fCB0aGlzLmV4Y2x1ZGUuaGFzKHJlc291cmNlVHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNmbk5hbWUsIG1heExlbmd0aCB9ID0gY29uZmlnO1xuICAgIGNvbnN0IGNmblByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID1cbiAgICAgIChub2RlIGFzIENmblJlc291cmNlV2l0aFByb3BzKS5fY2ZuUHJvcGVydGllcyA/P1xuICAgICAgKG5vZGUgYXMgQ2ZuUmVzb3VyY2VXaXRoUHJvcHMpLmNmblByb3BlcnRpZXMgPz9cbiAgICAgIHt9O1xuXG4gICAgY29uc3QgYmFzZU5hbWUgPSB0aGlzLnJlc29sdmVCYXNlTmFtZShub2RlLCBjZm5OYW1lLCBjZm5Qcm9wZXJ0aWVzKTtcblxuICAgIGlmICh0aGlzLnNob3VsZFNraXBSZXNvdXJjZShyZXNvdXJjZVR5cGUsIGJhc2VOYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQWxyZWFkeVByZWZpeGVkKGJhc2VOYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeGVkTmFtZSA9IHRoaXMuYnVpbGRQcmVmaXhlZE5hbWUoXG4gICAgICBiYXNlTmFtZSxcbiAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgIGNmblByb3BlcnRpZXNcbiAgICApO1xuXG4gICAgLy8gVHJ1bmNhdGlvbiBhcHBsaWVzIHRvIGFsbCBvdmVyZmxvd3Mg4oCUIGluY2x1ZGluZyB1c2VyLXNldCBuYW1lcyDigJQgYmVjYXVzZSBMM1xuICAgIC8vIGNvbnN0cnVjdHMgY2FuIGdlbmVyYXRlIG5hbWVzIHRoZSB1c2VyIGhhcyBubyBkaXJlY3QgY29udHJvbCBvdmVyLlxuICAgIGNvbnN0IGZpbmFsTmFtZSA9IHRoaXMudHJ1bmNhdGVUb0ZpdChwcmVmaXhlZE5hbWUsIG1heExlbmd0aCwgbm9kZSk7XG5cbiAgICBjb25zdCBoYXNFcnJvciA9IHRoaXMudmFsaWRhdGVSZXNvdXJjZU5hbWUoZmluYWxOYW1lLCByZXNvdXJjZVR5cGUsIG5vZGUpO1xuXG4gICAgaWYgKGhhc0Vycm9yKSByZXR1cm47XG5cbiAgICBub2RlLmFkZFByb3BlcnR5T3ZlcnJpZGUoY2ZuTmFtZSwgZmluYWxOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSByZXNvdXJjZSBzaG91bGQgYmUgc2tpcHBlZCBmcm9tIHByZWZpeGluZyBiYXNlZCBvblxuICAgKiByZXNvdXJjZS10eXBlLXNwZWNpZmljIHJ1bGVzIChlLmcuLCBBV1MtcmVzZXJ2ZWQgbmFtaW5nIGNvbnZlbnRpb25zKS5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkU2tpcFJlc291cmNlKGNmblJlc291cmNlVHlwZTogc3RyaW5nLCBiYXNlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OkxvZ3M6OkxvZ0dyb3VwXCIgJiYgYmFzZU5hbWUuc3RhcnRzV2l0aChcIi9hd3MvXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNBbHJlYWR5UHJlZml4ZWQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5hbWUuc3RhcnRzV2l0aChgJHt0aGlzLnByZWZpeH0tYCkgfHwgbmFtZS5zdGFydHNXaXRoKGAvJHt0aGlzLnByZWZpeH0vYClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBiYXNlIG5hbWUgZm9yIGEgcmVzb3VyY2UgYnkgY2hlY2tpbmcgZXhwbGljaXRseSBzZXQgQ0ZOIHByb3BlcnRpZXNcbiAgICogZmlyc3QsIHRoZW4gZmFsbGluZyBiYWNrIHRvIGRlcml2aW5nIGEgbmFtZSBmcm9tIHRoZSBsb2dpY2FsIElELlxuICAgKiBDREsgc3RvcmVzIEwxIHByb3BlcnRpZXMgaW4gY2FtZWxDYXNlIGludGVybmFsbHksIHNvIGJvdGggY2FzaW5ncyBhcmUgY2hlY2tlZC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUJhc2VOYW1lKFxuICAgIG5vZGU6IENmblJlc291cmNlLFxuICAgIGNmbk5hbWU6IHN0cmluZyxcbiAgICBjZm5Qcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApIHtcbiAgICBjb25zdCBjYW1lbENmbk5hbWUgPSBjZm5OYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgY2ZuTmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCByYXdOYW1lID0gY2ZuUHJvcGVydGllc1tjZm5OYW1lXSA/PyBjZm5Qcm9wZXJ0aWVzW2NhbWVsQ2ZuTmFtZV07XG4gICAgaWYgKHR5cGVvZiByYXdOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gcmF3TmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dpY2FsSWQgPSBTdGFjay5vZihub2RlKS5nZXRMb2dpY2FsSWQobm9kZSk7XG4gICAgcmV0dXJuIGxvZ2ljYWxJZFxuICAgICAgLnJlcGxhY2UoL1teYS16QS1aMC05XSsvZywgXCItXCIpIC8vIG5vbi1hbHBoYW51bWVyaWMg4oaSIGRhc2hcbiAgICAgIC5yZXBsYWNlKC9eLSt8LSskL2csIFwiXCIpOyAvLyB0cmltIGxlYWRpbmcvdHJhaWxpbmcgZGFzaGVzXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBwcmVmaXhlZCBuYW1lLCBoYW5kbGluZyBzcGVjaWFsIGNhc2VzIGZvciBzcGVjaWZpYyByZXNvdXJjZSB0eXBlcy5cbiAgICpcbiAgICogQHBhcmFtIGJhc2VOYW1lIC0gVGhlIGJhc2UgcmVzb3VyY2UgbmFtZSAod2l0aG91dCBwcmVmaXgpXG4gICAqIEBwYXJhbSBjZm5SZXNvdXJjZVR5cGUgLSBUaGUgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZVxuICAgKiBAcGFyYW0gY2ZuUHJvcGVydGllcyAtIFRoZSBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBwcm9wZXJ0aWVzXG4gICAqIEByZXR1cm5zIFRoZSBmaW5hbCBwcmVmaXhlZCBuYW1lIHdpdGggYW55IHNwZWNpYWwgY2FzZSBoYW5kbGluZyBhcHBsaWVkXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUHJlZml4ZWROYW1lKFxuICAgIGJhc2VOYW1lOiBzdHJpbmcsXG4gICAgY2ZuUmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4gICAgY2ZuUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBGSUZPIHF1ZXVlcyBtdXN0IGVuZCB3aXRoIC5maWZvIHN1ZmZpeFxuICAgIGlmIChcbiAgICAgIGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlNRUzo6UXVldWVcIiAmJlxuICAgICAgY2ZuUHJvcGVydGllcy5maWZvUXVldWUgPT09IHRydWUgJiZcbiAgICAgICFiYXNlTmFtZS5lbmRzV2l0aChcIi5maWZvXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LSR7YmFzZU5hbWV9LmZpZm9gO1xuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgY2FzZTogRklGTyB0b3BpY3MgbXVzdCBlbmQgd2l0aCAuZmlmbyBzdWZmaXhcbiAgICBpZiAoXG4gICAgICBjZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpTTlM6OlRvcGljXCIgJiZcbiAgICAgIGNmblByb3BlcnRpZXMuZmlmb1RvcGljID09PSB0cnVlICYmXG4gICAgICAhYmFzZU5hbWUuZW5kc1dpdGgoXCIuZmlmb1wiKVxuICAgICkge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfS5maWZvYDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IFNTTSBwYXJhbWV0ZXIgbmFtZXMgdXNlIHBhdGgtc3R5bGUgcHJlZml4XG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlNTTTo6UGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiBgLyR7dGhpcy5wcmVmaXh9LyR7YmFzZU5hbWV9YDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IFMzIGJ1Y2tldCBuYW1lIGJlIGxvd2VyY2FzZSBvbmx5XG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlMzOjpCdWNrZXRcIikge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfWAudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBzaW1wbGUgcHJlZml4XG4gICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVHJ1bmNhdGVzIGEgcHJlZml4ZWQgbmFtZSB0byBmaXQgd2l0aGluIG1heExlbmd0aCBieSBoYXNoaW5nIHRoZSBvcmlnaW5hbFxuICAgKiBmb3IgdW5pcXVlbmVzcy4gRW1pdHMgYSBDREsgd2FybmluZyB3aGVuIHRydW5jYXRpb24gb2NjdXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB0cnVuY2F0ZVRvRml0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBtYXhMZW5ndGg6IG51bWJlcixcbiAgICBub2RlOiBJQ29uc3RydWN0XG4gICk6IHN0cmluZyB7XG4gICAgaWYgKG5hbWUubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIG5hbWU7XG5cbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUobmFtZSkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDgpO1xuXG4gICAgLy8gUHJlc2VydmUgLmZpZm8gc3VmZml4IOKAlCBBV1MgcmVxdWlyZXMgaXQgYXQgdGhlIGVuZCBvZiBGSUZPIHJlc291cmNlIG5hbWVzXG4gICAgY29uc3Qgc3VmZml4ID0gbmFtZS5lbmRzV2l0aChcIi5maWZvXCIpID8gXCIuZmlmb1wiIDogXCJcIjtcbiAgICBjb25zdCBuYW1lV2l0aG91dFN1ZmZpeCA9IHN1ZmZpeCA/IG5hbWUuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpIDogbmFtZTtcblxuICAgIC8vIDEgYWNjb3VudHMgZm9yIHRoZSBkYXNoIHNlcGFyYXRvciBiZWZvcmUgdGhlIGhhc2hcbiAgICBjb25zdCBidWRnZXQgPSBtYXhMZW5ndGggLSBoYXNoLmxlbmd0aCAtIDEgLSBzdWZmaXgubGVuZ3RoO1xuICAgIGNvbnN0IHRydW5jYXRlZCA9IG5hbWVXaXRob3V0U3VmZml4LnNsaWNlKDAsIGJ1ZGdldCkgKyBcIi1cIiArIGhhc2ggKyBzdWZmaXg7XG5cbiAgICBBbm5vdGF0aW9ucy5vZihub2RlKS5hZGRXYXJuaW5nKFxuICAgICAgYFtSZXNvdXJjZVByZWZpeEFzcGVjdF0gXCIke25hbWV9XCIgKCR7bmFtZS5sZW5ndGh9IGNoYXJzKSBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mICR7bWF4TGVuZ3RofS4gYCArXG4gICAgICAgIGBOYW1lIGhhcyBiZWVuIHRydW5jYXRlZCB0byBcIiR7dHJ1bmNhdGVkfVwiLiBTaG9ydGVuIHRoZSByZXNvdXJjZSBiYXNlIG5hbWUgb3IgeW91ciBwcmVmaXggKFwiJHt0aGlzLnByZWZpeH1cIikgdG8gYXZvaWQgdHJ1bmNhdGlvbi5gXG4gICAgKTtcblxuICAgIHJldHVybiB0cnVuY2F0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHJlc291cmNlLXNwZWNpZmljIHN0cnVjdHVyYWwgbmFtaW5nIHJlcXVpcmVtZW50cyB0aGF0IEFXUyBlbmZvcmNlcy5cbiAgICogTGVuZ3RoIHZpb2xhdGlvbnMgYXJlIGhhbmRsZWQgdXBzdHJlYW0gYnkgdHJ1bmNhdGVUb0ZpdC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZXNvdXJjZU5hbWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNmblJlc291cmNlVHlwZTogc3RyaW5nLFxuICAgIG5vZGU6IElDb25zdHJ1Y3RcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG5cbiAgICBpZiAoY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6UzM6OkJ1Y2tldFwiKSB7XG4gICAgICBpZiAobmFtZSAhPT0gbmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKG5vZGUpLmFkZEVycm9yKFxuICAgICAgICAgIGBbUmVzb3VyY2VQcmVmaXhBc3BlY3RdIFMzIGJ1Y2tldCBuYW1lIFwiJHtuYW1lfVwiIGNvbnRhaW5zIHVwcGVyY2FzZSBsZXR0ZXJzLiBgICtcbiAgICAgICAgICAgIGBCdWNrZXQgbmFtZXMgbXVzdCBiZSBsb3dlcmNhc2Ugb25seS5gXG4gICAgICAgICk7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoXCJfXCIpKSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKG5vZGUpLmFkZEVycm9yKFxuICAgICAgICAgIGBbUmVzb3VyY2VQcmVmaXhBc3BlY3RdIFMzIGJ1Y2tldCBuYW1lIFwiJHtuYW1lfVwiIGNvbnRhaW5zIHVuZGVyc2NvcmVzLiBgICtcbiAgICAgICAgICAgIGBCdWNrZXQgbmFtZXMgY2Fubm90IGNvbnRhaW4gdW5kZXJzY29yZXMuIFVzZSBoeXBoZW5zIGluc3RlYWQuYFxuICAgICAgICApO1xuICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc0Vycm9yO1xuICB9XG59XG4iXX0=
|
|
227
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcHJlZml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVzb3VyY2UtcHJlZml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4RTtBQUU5RSxtQ0FBb0M7QUFvQ3BDOzs7R0FHRztBQUNILE1BQU0sZUFBZSxHQUF1QztJQUMxRCxVQUFVO0lBQ1YsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFFbkUsVUFBVTtJQUNWLGlCQUFpQixFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQzNELHNCQUFzQixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ2hFLDRCQUE0QixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBRXRFLFlBQVk7SUFDWixpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMxRCxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtJQUUzRCwyQkFBMkI7SUFDM0IsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFDNUQsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDdkQseUJBQXlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDN0Qsa0JBQWtCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDdEQsa0NBQWtDLEVBQUU7UUFDbEMsT0FBTyxFQUFFLGtCQUFrQjtRQUMzQixTQUFT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QUFJLENBQUMsQ0FBQyxRQUFRLENBQzNCLDBDQUEwQyxJQUFJLGdDQUFnQztvQkFDNUUsc0NBQXNDLENBQ3pDLENBQUM7Z0JBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNsQixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FDM0IsMENBQTBDLElBQUksMEJBQTBCO29CQUN0RSwrREFBK0QsQ0FDbEUsQ0FBQztnQkFDRixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBaE5ELG9EQWdOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBDZm5SZXNvdXJjZSwgSUFzcGVjdCwgU3RhY2ssIFRva2VuIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG5cbmludGVyZmFjZSBSZXNvdXJjZU5hbWVDb25maWcge1xuICAvKiogVGhlIENsb3VkRm9ybWF0aW9uIHByb3BlcnR5IHRoYXQgaG9sZHMgdGhlIHJlc291cmNlJ3MgcGh5c2ljYWwgbmFtZSAqL1xuICBjZm5OYW1lOiBzdHJpbmc7XG4gIC8qKiBNYXhpbXVtIGFsbG93ZWQgY2hhcmFjdGVyIGxlbmd0aCBmb3IgdGhpcyByZXNvdXJjZSB0eXBlICovXG4gIG1heExlbmd0aDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4dGVuc2lvbiB0eXBlIHRvIGFjY2VzcyBpbnRlcm5hbCBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0aWVzIG9uIENmblJlc291cmNlLlxuICpcbiAqIENESyBkb2VzIG5vdCBwcm92aWRlIGEgcHVibGljIEFQSSB0byByZWFkIHJhdyBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZVxuICogYmVlbiBzZXQgb24gYSBDZm5SZXNvdXJjZS4gVGhlIHByb3BlcnRpZXMgYF9jZm5Qcm9wZXJ0aWVzYCBhbmQgYGNmblByb3BlcnRpZXNgIGFyZVxuICogcHJvdGVjdGVkIGFuZCBvbmx5IGFjY2Vzc2libGUgd2l0aGluIHRoZSBDZm5SZXNvdXJjZSBjbGFzcyBoaWVyYXJjaHkuXG4gKlxuICogV2UgaW52ZXN0aWdhdGVkIHVzaW5nIENESydzIHB1YmxpYyBBUElzLCBidXQgdGhlcmUgaXMgbm8gcHVibGljIG1ldGhvZCB0byByZXRyaWV2ZVxuICogdGhlIHJhdyBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gc2V0IChlLmcuLCB2aWEgY29uc3RydWN0b3IgcHJvcHMgb3IgYWRkUHJvcGVydHlPdmVycmlkZSkuXG4gKiBUaGUgb25seSBwdWJsaWMgQVBJcyBhcmUgZm9yIHdyaXRpbmcgKGFkZFByb3BlcnR5T3ZlcnJpZGUsIGFkZFByb3BlcnR5RGVsZXRpb25PdmVycmlkZSkgb3JcbiAqIGdldHRpbmcgYXR0cmlidXRlIHJlZmVyZW5jZXMgKGdldEF0dCksIG5vdCBmb3IgcmVhZGluZyBsaXRlcmFsIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBUaGlzIHR5cGUgYXNzZXJ0aW9uIGlzIHNhZmUgYmVjYXVzZTpcbiAqIC0gV2Ugb25seSByZWFkIHRoZXNlIHByb3BlcnRpZXMsIG5ldmVyIG1vZGlmeSB0aGVtXG4gKiAtIFdlIG5lZWQgdG8gY2hlY2sgaWYgYSB1c2VyIGV4cGxpY2l0bHkgc2V0IGEgbmFtZSBwcm9wZXJ0eSBiZWZvcmUgYXBwbHlpbmcgb3VyIHByZWZpeFxuICogLSBUaGUgcHJvcGVydGllcyBleGlzdCBhdCBydW50aW1lIGFuZCBhcmUgcGFydCBvZiBDREsncyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvblxuICovXG50eXBlIENmblJlc291cmNlV2l0aFByb3BzID0gQ2ZuUmVzb3VyY2UgJiB7XG4gIHJlYWRvbmx5IF9jZm5Qcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IGNmblByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG5cbmludGVyZmFjZSBSZXNvdXJjZU5hbWVzIHtcbiAgbG9naWNhbE5hbWU6IHN0cmluZztcbiAgcmF3TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE1hcHMgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZXMgdG8gdGhlaXIgbmFtZSBwcm9wZXJ0eSBhbmQgQVdTIGxlbmd0aCBsaW1pdHMuXG4gKiBTb3VyY2VzOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtdGVtcGxhdGUtcmVzb3VyY2UtdHlwZS1yZWYuaHRtbFxuICovXG5jb25zdCBSRVNPVVJDRV9DT05GSUc6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTmFtZUNvbmZpZz4gPSB7XG4gIC8vIENvbXB1dGVcbiAgXCJBV1M6OkxhbWJkYTo6RnVuY3Rpb25cIjogeyBjZm5OYW1lOiBcIkZ1bmN0aW9uTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG5cbiAgLy8gU3RvcmFnZVxuICBcIkFXUzo6UzM6OkJ1Y2tldFwiOiB7IGNmbk5hbWU6IFwiQnVja2V0TmFtZVwiLCBtYXhMZW5ndGg6IDYzIH0sXG4gIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIjogeyBjZm5OYW1lOiBcIlRhYmxlTmFtZVwiLCBtYXhMZW5ndGg6IDI1NSB9LFxuICBcIkFXUzo6RHluYW1vREI6Okdsb2JhbFRhYmxlXCI6IHsgY2ZuTmFtZTogXCJUYWJsZU5hbWVcIiwgbWF4TGVuZ3RoOiAyNTUgfSxcblxuICAvLyBNZXNzYWdpbmdcbiAgXCJBV1M6OlNRUzo6UXVldWVcIjogeyBjZm5OYW1lOiBcIlF1ZXVlTmFtZVwiLCBtYXhMZW5ndGg6IDgwIH0sXG4gIFwiQVdTOjpTTlM6OlRvcGljXCI6IHsgY2ZuTmFtZTogXCJUb3BpY05hbWVcIiwgbWF4TGVuZ3RoOiAyNTYgfSxcblxuICAvLyBFdmVudGluZyAmIE9yY2hlc3RyYXRpb25cbiAgXCJBV1M6OkV2ZW50czo6RXZlbnRCdXNcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAyNTYgfSxcbiAgXCJBV1M6OkV2ZW50czo6UnVsZVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG4gIFwiQVdTOjpFdmVudHM6OkNvbm5lY3Rpb25cIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6UGlwZXM6OlBpcGVcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lXCI6IHtcbiAgICBjZm5OYW1lOiBcIlN0YXRlTWFjaGluZU5hbWVcIixcbiAgICBtYXhMZW5ndGg6IDgwLFxuICB9LFxuICBcIkFXUzo6U3RlcEZ1bmN0aW9uczo6QWN0aXZpdHlcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA4MCB9LFxuICBcIkFXUzo6U2NoZWR1bGVyOjpTY2hlZHVsZVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG4gIFwiQVdTOjpTY2hlZHVsZXI6OlNjaGVkdWxlR3JvdXBcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuXG4gIC8vIEFQSVxuICBcIkFXUzo6QXBpR2F0ZXdheTo6UmVzdEFwaVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDEyOCB9LFxuICBcIkFXUzo6QXBpR2F0ZXdheTo6VXNhZ2VQbGFuXCI6IHsgY2ZuTmFtZTogXCJVc2FnZVBsYW5OYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG4gIFwiQVdTOjpBcGlHYXRld2F5OjpBcGlLZXlcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAxMjggfSxcbiAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6QXBpXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG4gIFwiQVdTOjpBcGlHYXRld2F5VjI6OkF1dGhvcml6ZXJcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAxMjggfSxcblxuICAvLyBTZWNyZXRzICYgQ29uZmlnXG4gIFwiQVdTOjpTZWNyZXRzTWFuYWdlcjo6U2VjcmV0XCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNTEyIH0sXG4gIFwiQVdTOjpTU006OlBhcmFtZXRlclwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDIwNDggfSxcbiAgXCJBV1M6OkFwcENvbmZpZzo6QXBwbGljYXRpb25cIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6QXBwQ29uZmlnOjpFbnZpcm9ubWVudFwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG5cbiAgLy8gTm90aWZpY2F0aW9uc1xuICBcIkFXUzo6Tm90aWZpY2F0aW9uczo6Tm90aWZpY2F0aW9uQ29uZmlndXJhdGlvblwiOiB7XG4gICAgY2ZuTmFtZTogXCJOYW1lXCIsXG4gICAgbWF4TGVuZ3RoOiA2NCxcbiAgfSxcblxuICAvLyBPYnNlcnZhYmlsaXR5XG4gIFwiQVdTOjpMb2dzOjpMb2dHcm91cFwiOiB7IGNmbk5hbWU6IFwiTG9nR3JvdXBOYW1lXCIsIG1heExlbmd0aDogNTEyIH0sXG4gIFwiQVdTOjpDbG91ZFdhdGNoOjpBbGFybVwiOiB7IGNmbk5hbWU6IFwiQWxhcm1OYW1lXCIsIG1heExlbmd0aDogMjU1IH0sXG5cbiAgLy8gSUFNXG4gIFwiQVdTOjpJQU06OlJvbGVcIjogeyBjZm5OYW1lOiBcIlJvbGVOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQcmVmaXhBc3BlY3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IHRvIGFwcGx5IHRvIGFsbCByZXNvdXJjZSBuYW1lcy5cbiAgICogZS5nLiAnbXlhcHAtcHJvZCcg4oaSICdteWFwcC1wcm9kLW9yZGVycydcbiAgICovXG4gIHByZWZpeDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSB0eXBlcyB0byBza2lwIGVudGlyZWx5LlxuICAgKiBlLmcuIFsnQVdTOjpJQU06OlJvbGUnXSB0byBsZWF2ZSBJQU0gcm9sZSBuYW1lcyB1bnRvdWNoZWQuXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICBleGNsdWRlPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ0RLIEFzcGVjdCB0aGF0IGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgcGh5c2ljYWwgcmVzb3VyY2UgbmFtZXMgYWNyb3NzIEFXUyByZXNvdXJjZXMuXG4gKlxuICogQHJlbWFya3NcbiAqICoqQ3JpdGljYWwgSW1wbGVtZW50YXRpb24gTm90ZXM6KipcbiAqXG4gKiAxLiAqKlN0YWdlIFN5bnRoZXNpcyBCb3VuZGFyaWVzKio6XG4gKiAgICAtIENESyBgU3RhZ2VgIGNvbnN0cnVjdHMgY3JlYXRlIHN5bnRoZXNpcyBib3VuZGFyaWVzIHRoYXQgcHJldmVudCBBcHAtbGV2ZWwgYXNwZWN0c1xuICogICAgICBmcm9tIHRyYXZlcnNpbmcgaW50byB0aGVtXG4gKiAgICAtIFRoaXMgYXNwZWN0IE1VU1QgYmUgYXBwbGllZCB0byBlYWNoIFN0YWdlIGluZGl2aWR1YWxseSwgbm90IHRvIHRoZSBBcHBcbiAqICAgIC0gRXhhbXBsZTogYEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChuZXcgUmVzb3VyY2VQcmVmaXhBc3BlY3Qoey4uLn0pKWBcbiAqXG4gKiAyLiAqKlByb3BlcnR5IE5hbWUgQ2FzaW5nKio6XG4gKiAgICAtIENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXMgdXNlIFBhc2NhbENhc2UgKGUuZy4sIGBGdW5jdGlvbk5hbWVgLCBgQnVja2V0TmFtZWApXG4gKiAgICAtIFVzaW5nIGNhbWVsQ2FzZSAoZS5nLiwgYGZ1bmN0aW9uTmFtZWApIHdpbGwgY2F1c2UgZXJyb3JzIHdpdGggdmVyc2lvbmluZyBhc3BlY3RzXG4gKiAgICAtIFdoZW4gdXNpbmcgYGFkZFByb3BlcnR5T3ZlcnJpZGUoKWAsIGFsd2F5cyB1c2UgdGhlIGV4YWN0IENsb3VkRm9ybWF0aW9uIHByb3BlcnR5IG5hbWVcbiAqXG4gKiAzLiAqKkFzcGVjdCBQcmlvcml0eSB3aXRoIFZlcnNpb25pbmcqKjpcbiAqICAgIC0gV2hlbiBjb21iaW5pbmcgd2l0aCBMYW1iZGFBbmRTdGVwRnVuY3Rpb25WZXJzaW9uaW5nQXNwZWN0LCBhcHBseSB0aGlzIGFzcGVjdCBCRUZPUkUgdmVyc2lvbmluZ1xuICogICAgLSBVc2UgQ0RLJ3MgcHJpb3JpdHkgc3lzdGVtOiBgQXNwZWN0cy5vZihzdGFnZSkuYWRkKHByZWZpeEFzcGVjdCwgeyBwcmlvcml0eTogMTAwIH0pYFxuICogICAgLSBUaGVuOiBgQXNwZWN0cy5vZihzdGFnZSkuYWRkKHZlcnNpb25pbmdBc3BlY3QsIHsgcHJpb3JpdHk6IDIwMCB9KWBcbiAqICAgIC0gTG93ZXIgcHJpb3JpdHkgbnVtYmVycyBydW4gZmlyc3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ29ycmVjdCB1c2FnZSB3aXRoIHN0YWdpbmdcbiAqIGNvbnN0IHN0YWdlID0gbmV3IEFwcGxpY2F0aW9uU3RhZ2UoYXBwLCAncHJvZCcpO1xuICogQXNwZWN0cy5vZihzdGFnZSkuYWRkKG5ldyBSZXNvdXJjZVByZWZpeEFzcGVjdCh7IHByZWZpeDogJ215YXBwJyB9KSwgeyBwcmlvcml0eTogMTAwIH0pO1xuICogQXNwZWN0cy5vZihzdGFnZSkuYWRkKG5ldyBMYW1iZGFBbmRTdGVwRnVuY3Rpb25WZXJzaW9uaW5nQXNwZWN0KCksIHsgcHJpb3JpdHk6IDIwMCB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VQcmVmaXhBc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmaXg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBleGNsdWRlOiBTZXQ8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogUmVzb3VyY2VQcmVmaXhBc3BlY3RQcm9wcykge1xuICAgIGlmICghcHJvcHMucHJlZml4IHx8ICEvXlthLXowLTktXSskLy50ZXN0KHByb3BzLnByZWZpeCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBSZXNvdXJjZVByZWZpeEFzcGVjdDogcHJlZml4IG11c3QgY29udGFpbiBvbmx5IGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVucywgZ290IFwiJHtwcm9wcy5wcmVmaXh9XCJgXG4gICAgICApO1xuXG4gICAgdGhpcy5wcmVmaXggPSBwcm9wcy5wcmVmaXg7XG4gICAgdGhpcy5leGNsdWRlID0gbmV3IFNldChwcm9wcy5leGNsdWRlID8/IFtdKTtcbiAgfVxuXG4gIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpIHtcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgQ2ZuUmVzb3VyY2UpKSByZXR1cm47XG5cbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBub2RlLmNmblJlc291cmNlVHlwZTtcbiAgICBjb25zdCBjb25maWcgPSBSRVNPVVJDRV9DT05GSUdbcmVzb3VyY2VUeXBlXTtcblxuICAgIGlmICghY29uZmlnIHx8IHRoaXMuZXhjbHVkZS5oYXMocmVzb3VyY2VUeXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY2ZuTmFtZSwgbWF4TGVuZ3RoIH0gPSBjb25maWc7XG4gICAgY29uc3QgY2ZuUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPVxuICAgICAgKG5vZGUgYXMgQ2ZuUmVzb3VyY2VXaXRoUHJvcHMpLl9jZm5Qcm9wZXJ0aWVzID8/XG4gICAgICAobm9kZSBhcyBDZm5SZXNvdXJjZVdpdGhQcm9wcykuY2ZuUHJvcGVydGllcyA/P1xuICAgICAge307XG5cbiAgICBjb25zdCBuYW1lcyA9IHRoaXMucmVzb2x2ZVJlc291cmNlTmFtZXMobm9kZSwgY2ZuTmFtZSwgY2ZuUHJvcGVydGllcyk7XG5cbiAgICBpZiAodGhpcy5zaG91bGRTa2lwUmVzb3VyY2UocmVzb3VyY2VUeXBlLCBuYW1lcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0FscmVhZHlQcmVmaXhlZChuYW1lcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmaXhlZE5hbWUgPSB0aGlzLmJ1aWxkUHJlZml4ZWROYW1lKFxuICAgICAgbmFtZXMsXG4gICAgICByZXNvdXJjZVR5cGUsXG4gICAgICBjZm5Qcm9wZXJ0aWVzXG4gICAgKTtcblxuICAgIC8vIFRydW5jYXRpb24gYXBwbGllcyB0byBhbGwgb3ZlcmZsb3dzIOKAlCBpbmNsdWRpbmcgdXNlci1zZXQgbmFtZXMg4oCUIGJlY2F1c2UgTDNcbiAgICAvLyBjb25zdHJ1Y3RzIGNhbiBnZW5lcmF0ZSBuYW1lcyB0aGUgdXNlciBoYXMgbm8gZGlyZWN0IGNvbnRyb2wgb3Zlci5cbiAgICBjb25zdCBmaW5hbE5hbWUgPSB0aGlzLnRydW5jYXRlVG9GaXQocHJlZml4ZWROYW1lLCBtYXhMZW5ndGgsIG5vZGUpO1xuXG4gICAgY29uc3QgaGFzRXJyb3IgPSB0aGlzLnZhbGlkYXRlUmVzb3VyY2VOYW1lKGZpbmFsTmFtZSwgcmVzb3VyY2VUeXBlLCBub2RlKTtcblxuICAgIGlmIChoYXNFcnJvcikgcmV0dXJuO1xuXG4gICAgbm9kZS5hZGRQcm9wZXJ0eU92ZXJyaWRlKGNmbk5hbWUsIGZpbmFsTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcmVzb3VyY2Ugc2hvdWxkIGJlIHNraXBwZWQgZnJvbSBwcmVmaXhpbmcgYmFzZWQgb25cbiAgICogcmVzb3VyY2UtdHlwZS1zcGVjaWZpYyBydWxlcyAoZS5nLiwgQVdTLXJlc2VydmVkIG5hbWluZyBjb252ZW50aW9ucykuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZFNraXBSZXNvdXJjZShjZm5SZXNvdXJjZVR5cGU6IHN0cmluZywgbmFtZXM6IFJlc291cmNlTmFtZXMpIHtcbiAgICBjb25zdCBuYW1lID0gbmFtZXMucmF3TmFtZSA/PyBuYW1lcy5sb2dpY2FsTmFtZTtcbiAgICByZXR1cm4gKFxuICAgICAgY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6TG9nczo6TG9nR3JvdXBcIiAmJiBuYW1lLnN0YXJ0c1dpdGgoXCIvYXdzL1wiKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGlzQWxyZWFkeVByZWZpeGVkKG5hbWVzOiBSZXNvdXJjZU5hbWVzKSB7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzLnJhd05hbWUgPz8gbmFtZXMubG9naWNhbE5hbWU7XG4gICAgcmV0dXJuIChcbiAgICAgIG5hbWUuc3RhcnRzV2l0aChgJHt0aGlzLnByZWZpeH0tYCkgfHwgbmFtZS5zdGFydHNXaXRoKGAvJHt0aGlzLnByZWZpeH0vYClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBuYW1lIGNvbXBvbmVudHMgZm9yIGEgcmVzb3VyY2U6IHRoZSBleHBsaWNpdGx5IHNldCByYXcgbmFtZSAoaWYgYW55KVxuICAgKiBhbmQgYSBzYW5pdGlzZWQgbG9naWNhbCBJRCBkZXJpdmVkIGZyb20gdGhlIGNvbnN0cnVjdCB0cmVlLlxuICAgKlxuICAgKiBUaGUgcmF3IG5hbWUgaXMgbG9va2VkIHVwIGZyb20gdGhlIENGTiBwcm9wZXJ0aWVzIGluIGJvdGggUGFzY2FsQ2FzZSBhbmQgY2FtZWxDYXNlXG4gICAqIChDREsgc3RvcmVzIEwxIHByb3BlcnRpZXMgaW4gY2FtZWxDYXNlIGludGVybmFsbHkpLiBXaGVuIG5vIGV4cGxpY2l0IG5hbWUgaXMgc2V0LFxuICAgKiBgcmF3TmFtZWAgaXMgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVSZXNvdXJjZU5hbWVzKFxuICAgIG5vZGU6IENmblJlc291cmNlLFxuICAgIGNmbk5hbWU6IHN0cmluZyxcbiAgICBjZm5Qcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBSZXNvdXJjZU5hbWVzIHtcbiAgICBjb25zdCBjYW1lbENmbk5hbWUgPSBjZm5OYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgY2ZuTmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCByYXdOYW1lID0gY2ZuUHJvcGVydGllc1tjZm5OYW1lXSA/PyBjZm5Qcm9wZXJ0aWVzW2NhbWVsQ2ZuTmFtZV07XG4gICAgY29uc3QgbG9naWNhbE5hbWUgPSBTdGFjay5vZihub2RlKVxuICAgICAgLmdldExvZ2ljYWxJZChub2RlKVxuICAgICAgLnJlcGxhY2UoL1teYS16QS1aMC05XSsvZywgXCItXCIpIC8vIG5vbi1hbHBoYW51bWVyaWMg4oaSIGRhc2hcbiAgICAgIC5yZXBsYWNlKC9eLSt8LSskL2csIFwiXCIpOyAvLyB0cmltIGxlYWRpbmcvdHJhaWxpbmcgZGFzaGVzXG5cbiAgICByZXR1cm4gdHlwZW9mIHJhd05hbWUgPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBsb2dpY2FsTmFtZSwgcmF3TmFtZSB9XG4gICAgICA6IHsgbG9naWNhbE5hbWUsIHJhd05hbWU6IHVuZGVmaW5lZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcHJlZml4ZWQgbmFtZSwgaGFuZGxpbmcgc3BlY2lhbCBjYXNlcyBmb3Igc3BlY2lmaWMgcmVzb3VyY2UgdHlwZXMuXG4gICAqXG4gICAqIFVzZXMgdGhlIHJhdyBuYW1lIHdoZW4gaXQgaXMgYSBjb25jcmV0ZSBzdHJpbmcsIGZhbGxpbmcgYmFjayB0byB0aGUgbG9naWNhbFxuICAgKiBuYW1lIHdoZW4gdGhlIHJhdyBuYW1lIGlzIGFuIHVucmVzb2x2ZWQgQ0RLIHRva2VuLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFByZWZpeGVkTmFtZShcbiAgICBuYW1lczogUmVzb3VyY2VOYW1lcyxcbiAgICBjZm5SZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgICBjZm5Qcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApIHtcbiAgICBjb25zdCBuYW1lID1cbiAgICAgICFuYW1lcy5yYXdOYW1lIHx8IFRva2VuLmlzVW5yZXNvbHZlZChuYW1lcy5yYXdOYW1lKVxuICAgICAgICA/IG5hbWVzLmxvZ2ljYWxOYW1lXG4gICAgICAgIDogbmFtZXMucmF3TmFtZTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZTogRklGTyBxdWV1ZXMgbXVzdCBlbmQgd2l0aCAuZmlmbyBzdWZmaXhcbiAgICBpZiAoXG4gICAgICBjZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpTUVM6OlF1ZXVlXCIgJiZcbiAgICAgIGNmblByb3BlcnRpZXMuZmlmb1F1ZXVlID09PSB0cnVlICYmXG4gICAgICAhbmFtZS5lbmRzV2l0aChcIi5maWZvXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LSR7bmFtZX0uZmlmb2A7XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBjYXNlOiBGSUZPIHRvcGljcyBtdXN0IGVuZCB3aXRoIC5maWZvIHN1ZmZpeFxuICAgIGlmIChcbiAgICAgIGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlNOUzo6VG9waWNcIiAmJlxuICAgICAgY2ZuUHJvcGVydGllcy5maWZvVG9waWMgPT09IHRydWUgJiZcbiAgICAgICFuYW1lLmVuZHNXaXRoKFwiLmZpZm9cIilcbiAgICApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLnByZWZpeH0tJHtuYW1lfS5maWZvYDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IFNTTSBwYXJhbWV0ZXIgbmFtZXMgdXNlIHBhdGgtc3R5bGUgcHJlZml4XG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlNTTTo6UGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiBgLyR7dGhpcy5wcmVmaXh9LyR7bmFtZX1gO1xuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgY2FzZTogUzMgYnVja2V0IG5hbWUgYmUgbG93ZXJjYXNlIG9ubHlcbiAgICBpZiAoY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6UzM6OkJ1Y2tldFwiKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LSR7bmFtZX1gLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdDogc2ltcGxlIHByZWZpeFxuICAgIHJldHVybiBgJHt0aGlzLnByZWZpeH0tJHtuYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVHJ1bmNhdGVzIGEgcHJlZml4ZWQgbmFtZSB0byBmaXQgd2l0aGluIG1heExlbmd0aCBieSBoYXNoaW5nIHRoZSBvcmlnaW5hbFxuICAgKiBmb3IgdW5pcXVlbmVzcy4gRW1pdHMgYSBDREsgd2FybmluZyB3aGVuIHRydW5jYXRpb24gb2NjdXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB0cnVuY2F0ZVRvRml0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBtYXhMZW5ndGg6IG51bWJlcixcbiAgICBub2RlOiBJQ29uc3RydWN0XG4gICk6IHN0cmluZyB7XG4gICAgaWYgKG5hbWUubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIG5hbWU7XG5cbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUobmFtZSkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDgpO1xuXG4gICAgLy8gUHJlc2VydmUgLmZpZm8gc3VmZml4IOKAlCBBV1MgcmVxdWlyZXMgaXQgYXQgdGhlIGVuZCBvZiBGSUZPIHJlc291cmNlIG5hbWVzXG4gICAgY29uc3Qgc3VmZml4ID0gbmFtZS5lbmRzV2l0aChcIi5maWZvXCIpID8gXCIuZmlmb1wiIDogXCJcIjtcbiAgICBjb25zdCBuYW1lV2l0aG91dFN1ZmZpeCA9IHN1ZmZpeCA/IG5hbWUuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpIDogbmFtZTtcblxuICAgIC8vIDEgYWNjb3VudHMgZm9yIHRoZSBkYXNoIHNlcGFyYXRvciBiZWZvcmUgdGhlIGhhc2hcbiAgICBjb25zdCBidWRnZXQgPSBtYXhMZW5ndGggLSBoYXNoLmxlbmd0aCAtIDEgLSBzdWZmaXgubGVuZ3RoO1xuICAgIGNvbnN0IHRydW5jYXRlZCA9IG5hbWVXaXRob3V0U3VmZml4LnNsaWNlKDAsIGJ1ZGdldCkgKyBcIi1cIiArIGhhc2ggKyBzdWZmaXg7XG5cbiAgICBBbm5vdGF0aW9ucy5vZihub2RlKS5hZGRXYXJuaW5nKFxuICAgICAgYFtSZXNvdXJjZVByZWZpeEFzcGVjdF0gXCIke25hbWV9XCIgKCR7bmFtZS5sZW5ndGh9IGNoYXJzKSBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mICR7bWF4TGVuZ3RofS4gYCArXG4gICAgICAgIGBOYW1lIGhhcyBiZWVuIHRydW5jYXRlZCB0byBcIiR7dHJ1bmNhdGVkfVwiLiBTaG9ydGVuIHRoZSByZXNvdXJjZSBiYXNlIG5hbWUgb3IgeW91ciBwcmVmaXggKFwiJHt0aGlzLnByZWZpeH1cIikgdG8gYXZvaWQgdHJ1bmNhdGlvbi5gXG4gICAgKTtcblxuICAgIHJldHVybiB0cnVuY2F0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHJlc291cmNlLXNwZWNpZmljIHN0cnVjdHVyYWwgbmFtaW5nIHJlcXVpcmVtZW50cyB0aGF0IEFXUyBlbmZvcmNlcy5cbiAgICogTGVuZ3RoIHZpb2xhdGlvbnMgYXJlIGhhbmRsZWQgdXBzdHJlYW0gYnkgdHJ1bmNhdGVUb0ZpdC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZXNvdXJjZU5hbWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNmblJlc291cmNlVHlwZTogc3RyaW5nLFxuICAgIG5vZGU6IElDb25zdHJ1Y3RcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG5cbiAgICBpZiAoY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6UzM6OkJ1Y2tldFwiKSB7XG4gICAgICBpZiAobmFtZSAhPT0gbmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKG5vZGUpLmFkZEVycm9yKFxuICAgICAgICAgIGBbUmVzb3VyY2VQcmVmaXhBc3BlY3RdIFMzIGJ1Y2tldCBuYW1lIFwiJHtuYW1lfVwiIGNvbnRhaW5zIHVwcGVyY2FzZSBsZXR0ZXJzLiBgICtcbiAgICAgICAgICAgIGBCdWNrZXQgbmFtZXMgbXVzdCBiZSBsb3dlcmNhc2Ugb25seS5gXG4gICAgICAgICk7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoXCJfXCIpKSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKG5vZGUpLmFkZEVycm9yKFxuICAgICAgICAgIGBbUmVzb3VyY2VQcmVmaXhBc3BlY3RdIFMzIGJ1Y2tldCBuYW1lIFwiJHtuYW1lfVwiIGNvbnRhaW5zIHVuZGVyc2NvcmVzLiBgICtcbiAgICAgICAgICAgIGBCdWNrZXQgbmFtZXMgY2Fubm90IGNvbnRhaW4gdW5kZXJzY29yZXMuIFVzZSBoeXBoZW5zIGluc3RlYWQuYFxuICAgICAgICApO1xuICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc0Vycm9yO1xuICB9XG59XG4iXX0=
|