raindancers-cloudfront 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +176 -0
- package/lib/bicep/deploy/deploy.d.ts +46 -0
- package/lib/bicep/deploy/deploy.js +123 -0
- package/lib/bicep/deploy/index.d.ts +3 -0
- package/lib/bicep/deploy/index.js +20 -0
- package/lib/bicep/deploy/template.d.ts +75 -0
- package/lib/bicep/deploy/template.js +364 -0
- package/lib/bicep/deploy/templateBuilder.d.ts +16 -0
- package/lib/bicep/deploy/templateBuilder.js +35 -0
- package/lib/bicep/index.d.ts +3 -0
- package/lib/bicep/index.js +40 -0
- package/lib/bicep/patterns/azureAdApplicationFederated.d.ts +58 -0
- package/lib/bicep/patterns/azureAdApplicationFederated.js +317 -0
- package/lib/bicep/patterns/index.d.ts +1 -0
- package/lib/bicep/patterns/index.js +18 -0
- package/lib/bicep/resources/azure/appServicePlan.d.ts +11 -0
- package/lib/bicep/resources/azure/appServicePlan.js +24 -0
- package/lib/bicep/resources/azure/applicationInsights.d.ts +13 -0
- package/lib/bicep/resources/azure/applicationInsights.js +27 -0
- package/lib/bicep/resources/azure/deploymentScript.d.ts +16 -0
- package/lib/bicep/resources/azure/deploymentScript.js +43 -0
- package/lib/bicep/resources/azure/functionApp.d.ts +20 -0
- package/lib/bicep/resources/azure/functionApp.js +54 -0
- package/lib/bicep/resources/azure/index.d.ts +8 -0
- package/lib/bicep/resources/azure/index.js +25 -0
- package/lib/bicep/resources/azure/logAnalyticsWorkspace.d.ts +11 -0
- package/lib/bicep/resources/azure/logAnalyticsWorkspace.js +26 -0
- package/lib/bicep/resources/azure/managedIdentity.d.ts +13 -0
- package/lib/bicep/resources/azure/managedIdentity.js +24 -0
- package/lib/bicep/resources/azure/roleAssignment.d.ts +18 -0
- package/lib/bicep/resources/azure/roleAssignment.js +34 -0
- package/lib/bicep/resources/azure/storageAccount.d.ts +11 -0
- package/lib/bicep/resources/azure/storageAccount.js +28 -0
- package/lib/bicep/resources/graph/appRoleAssignment.d.ts +25 -0
- package/lib/bicep/resources/graph/appRoleAssignment.js +33 -0
- package/lib/bicep/resources/graph/application.d.ts +51 -0
- package/lib/bicep/resources/graph/application.js +88 -0
- package/lib/bicep/resources/graph/bicepConstruct.d.ts +14 -0
- package/lib/bicep/resources/graph/bicepConstruct.js +29 -0
- package/lib/bicep/resources/graph/existingServicePrincipal.d.ts +19 -0
- package/lib/bicep/resources/graph/existingServicePrincipal.js +26 -0
- package/lib/bicep/resources/graph/federatedIdentityCredential.d.ts +29 -0
- package/lib/bicep/resources/graph/federatedIdentityCredential.js +31 -0
- package/lib/bicep/resources/graph/group.d.ts +26 -0
- package/lib/bicep/resources/graph/group.js +31 -0
- package/lib/bicep/resources/graph/index.d.ts +8 -0
- package/lib/bicep/resources/graph/index.js +25 -0
- package/lib/bicep/resources/graph/servicePrincipal.d.ts +22 -0
- package/lib/bicep/resources/graph/servicePrincipal.js +27 -0
- package/lib/bicep/resources/graph/types/index.d.ts +1 -0
- package/lib/bicep/resources/graph/types/index.js +18 -0
- package/lib/bicep/resources/graph/types/permissions.d.ts +54 -0
- package/lib/bicep/resources/graph/types/permissions.js +73 -0
- package/lib/bicep/resources/index.d.ts +2 -0
- package/lib/bicep/resources/index.js +39 -0
- package/lib/cloudfront/auth/authLambdaFunctions.d.ts +20 -0
- package/lib/cloudfront/auth/authLambdaFunctions.js +159 -0
- package/lib/cloudfront/auth/authSecretManager.d.ts +19 -0
- package/lib/cloudfront/auth/authSecretManager.js +92 -0
- package/lib/cloudfront/auth/cognitoAuthSecretManager.d.ts +20 -0
- package/lib/cloudfront/auth/cognitoAuthSecretManager.js +93 -0
- package/lib/cloudfront/auth/index.d.ts +3 -0
- package/lib/cloudfront/auth/index.js +20 -0
- package/lib/cloudfront/authSecurityTable.d.ts +10 -0
- package/lib/cloudfront/authSecurityTable.js +78 -0
- package/lib/cloudfront/cloudfront-functions/function-composer.d.ts +21 -0
- package/lib/cloudfront/cloudfront-functions/function-composer.js +132 -0
- package/lib/cloudfront/cloudfrontCertificate.d.ts +40 -0
- package/lib/cloudfront/cloudfrontCertificate.js +116 -0
- package/lib/cloudfront/cloudfrontWebAcl.d.ts +72 -0
- package/lib/cloudfront/cloudfrontWebAcl.js +249 -0
- package/lib/cloudfront/countries.d.ts +260 -0
- package/lib/cloudfront/countries.js +263 -0
- package/lib/cloudfront/deployment/viteFrontendDeployment.d.ts +12 -0
- package/lib/cloudfront/deployment/viteFrontendDeployment.js +63 -0
- package/lib/cloudfront/index.d.ts +11 -0
- package/lib/cloudfront/index.js +28 -0
- package/lib/cloudfront/jwtDecoder.d.ts +5 -0
- package/lib/cloudfront/jwtDecoder.js +57 -0
- package/lib/cloudfront/logging/auditLogArchive.d.ts +18 -0
- package/lib/cloudfront/logging/auditLogArchive.js +205 -0
- package/lib/cloudfront/logging/index.d.ts +1 -0
- package/lib/cloudfront/logging/index.js +18 -0
- package/lib/cloudfront/oauthEdgeRole.d.ts +9 -0
- package/lib/cloudfront/oauthEdgeRole.js +56 -0
- package/lib/cloudfront/patterns/authInfrastructure.d.ts +34 -0
- package/lib/cloudfront/patterns/authInfrastructure.js +140 -0
- package/lib/cloudfront/patterns/cognito-secured-cloudfront.d.ts +36 -0
- package/lib/cloudfront/patterns/cognito-secured-cloudfront.js +285 -0
- package/lib/cloudfront/patterns/cognitoAuthInfrastructure.d.ts +28 -0
- package/lib/cloudfront/patterns/cognitoAuthInfrastructure.js +157 -0
- package/lib/cloudfront/patterns/index.d.ts +4 -0
- package/lib/cloudfront/patterns/index.js +21 -0
- package/lib/cloudfront/patterns/securedCloudFront.d.ts +73 -0
- package/lib/cloudfront/patterns/securedCloudFront.js +416 -0
- package/lib/cloudfront/ssmCrossRegionWriter.d.ts +9 -0
- package/lib/cloudfront/ssmCrossRegionWriter.js +65 -0
- package/lib/cloudfront/syncSecretToKvs.d.ts +9 -0
- package/lib/cloudfront/syncSecretToKvs.js +89 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +19 -0
- package/package.json +105 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Lightweight Bicep synthesizer for generating Bicep templates from TypeScript.
|
|
4
|
+
* Provides type-safe Bicep generation without requiring external dependencies.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.BicepTemplate = exports.BicepExtension = exports.BicepParameterType = void 0;
|
|
8
|
+
const types_1 = require("../resources/graph/types");
|
|
9
|
+
var BicepParameterType;
|
|
10
|
+
(function (BicepParameterType) {
|
|
11
|
+
BicepParameterType["STRING"] = "string";
|
|
12
|
+
BicepParameterType["INT"] = "int";
|
|
13
|
+
BicepParameterType["BOOL"] = "bool";
|
|
14
|
+
BicepParameterType["OBJECT"] = "object";
|
|
15
|
+
BicepParameterType["ARRAY"] = "array";
|
|
16
|
+
})(BicepParameterType || (exports.BicepParameterType = BicepParameterType = {}));
|
|
17
|
+
var BicepExtension;
|
|
18
|
+
(function (BicepExtension) {
|
|
19
|
+
BicepExtension["MICROSOFT_GRAPH_STABLE"] = "br:mcr.microsoft.com/bicep/extensions/microsoftgraph/v1.0:1.0.0";
|
|
20
|
+
BicepExtension["KUBERNETES_STABLE"] = "Microsoft.KubernetesConfiguration/stable";
|
|
21
|
+
})(BicepExtension || (exports.BicepExtension = BicepExtension = {}));
|
|
22
|
+
class BicepTemplate {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.parameters = new Map();
|
|
25
|
+
this.resources = new Map();
|
|
26
|
+
this.outputs = new Map();
|
|
27
|
+
this.extensions = new Map();
|
|
28
|
+
this.metadata = {};
|
|
29
|
+
}
|
|
30
|
+
addStringParameter(name, description, defaultValue) {
|
|
31
|
+
this.parameters.set(name, { type: BicepParameterType.STRING, description: description, defaultValue: defaultValue });
|
|
32
|
+
}
|
|
33
|
+
addIntParameter(name, description, defaultValue) {
|
|
34
|
+
this.parameters.set(name, { type: BicepParameterType.INT, description: description, defaultValue: defaultValue });
|
|
35
|
+
}
|
|
36
|
+
addBoolParameter(name, description, defaultValue) {
|
|
37
|
+
this.parameters.set(name, { type: BicepParameterType.BOOL, description: description, defaultValue: defaultValue });
|
|
38
|
+
}
|
|
39
|
+
addObjectParameter(name, description, defaultValue) {
|
|
40
|
+
this.parameters.set(name, { type: BicepParameterType.OBJECT, description: description, defaultValue: defaultValue });
|
|
41
|
+
}
|
|
42
|
+
addArrayParameter(name, description, defaultValue) {
|
|
43
|
+
this.parameters.set(name, { type: BicepParameterType.ARRAY, description: description, defaultValue: defaultValue });
|
|
44
|
+
}
|
|
45
|
+
addExtension(extension) {
|
|
46
|
+
this.extensions.set(extension, extension);
|
|
47
|
+
}
|
|
48
|
+
setMetadata(metadata) {
|
|
49
|
+
this.metadata = metadata;
|
|
50
|
+
}
|
|
51
|
+
addResource(name, resource) {
|
|
52
|
+
const pascalCaseName = this.toPascalCase(name);
|
|
53
|
+
this.resources.set(pascalCaseName, resource);
|
|
54
|
+
}
|
|
55
|
+
addStringOutput(name, value) {
|
|
56
|
+
this.outputs.set(name, { type: BicepParameterType.STRING, value: value });
|
|
57
|
+
}
|
|
58
|
+
addIntOutput(name, value) {
|
|
59
|
+
this.outputs.set(name, { type: BicepParameterType.INT, value: value });
|
|
60
|
+
}
|
|
61
|
+
addBoolOutput(name, value) {
|
|
62
|
+
this.outputs.set(name, { type: BicepParameterType.BOOL, value: value });
|
|
63
|
+
}
|
|
64
|
+
addObjectOutput(name, value) {
|
|
65
|
+
this.outputs.set(name, { type: BicepParameterType.OBJECT, value: value });
|
|
66
|
+
}
|
|
67
|
+
addArrayOutput(name, value) {
|
|
68
|
+
this.outputs.set(name, { type: BicepParameterType.ARRAY, value: value });
|
|
69
|
+
}
|
|
70
|
+
synthesize() {
|
|
71
|
+
const lines = [];
|
|
72
|
+
// Add header comment
|
|
73
|
+
lines.push('// This template has been automatically synthesized by bicep-cdk');
|
|
74
|
+
lines.push('');
|
|
75
|
+
// Metadata
|
|
76
|
+
lines.push('metadata generator = {');
|
|
77
|
+
lines.push(' name: \'bicep-cdk\'');
|
|
78
|
+
lines.push(' version: \'1.0.0\'');
|
|
79
|
+
lines.push('}');
|
|
80
|
+
lines.push('');
|
|
81
|
+
if (this.metadata.name || this.metadata.description) {
|
|
82
|
+
lines.push('metadata template = {');
|
|
83
|
+
if (this.metadata.name) {
|
|
84
|
+
lines.push(` name: '${this.metadata.name}'`);
|
|
85
|
+
}
|
|
86
|
+
if (this.metadata.description) {
|
|
87
|
+
lines.push(` description: '${this.metadata.description}'`);
|
|
88
|
+
}
|
|
89
|
+
lines.push('}');
|
|
90
|
+
lines.push('');
|
|
91
|
+
}
|
|
92
|
+
if (this.metadata.cloudformation?.stackArn) {
|
|
93
|
+
lines.push('metadata cloudformation = {');
|
|
94
|
+
lines.push(` stackArn: '${this.metadata.cloudformation.stackArn}'`);
|
|
95
|
+
lines.push('}');
|
|
96
|
+
lines.push('');
|
|
97
|
+
}
|
|
98
|
+
// Extensions
|
|
99
|
+
for (const [name] of this.extensions) {
|
|
100
|
+
lines.push(`extension '${name}'`);
|
|
101
|
+
}
|
|
102
|
+
if (this.extensions.size > 0) {
|
|
103
|
+
lines.push('');
|
|
104
|
+
}
|
|
105
|
+
// Parameters
|
|
106
|
+
for (const [name, param] of this.parameters) {
|
|
107
|
+
if (param.description) {
|
|
108
|
+
lines.push(`@description('${param.description}')`);
|
|
109
|
+
}
|
|
110
|
+
if (param.allowedValues) {
|
|
111
|
+
lines.push('@allowed([');
|
|
112
|
+
param.allowedValues.forEach(v => lines.push(` '${v}'`));
|
|
113
|
+
lines.push('])');
|
|
114
|
+
}
|
|
115
|
+
const defaultVal = param.defaultValue !== undefined
|
|
116
|
+
? ` = ${this.formatValue(param.defaultValue)}`
|
|
117
|
+
: '';
|
|
118
|
+
lines.push(`param ${name} ${param.type}${defaultVal}`);
|
|
119
|
+
lines.push('');
|
|
120
|
+
}
|
|
121
|
+
// Resources grouped by section
|
|
122
|
+
const resourcesBySection = new Map();
|
|
123
|
+
for (const [name, resource] of this.resources) {
|
|
124
|
+
const section = this.getResourceSection(resource.type);
|
|
125
|
+
if (!resourcesBySection.has(section)) {
|
|
126
|
+
resourcesBySection.set(section, []);
|
|
127
|
+
}
|
|
128
|
+
resourcesBySection.get(section).push([name, resource]);
|
|
129
|
+
}
|
|
130
|
+
// Output resources grouped by section
|
|
131
|
+
for (const [section, resources] of resourcesBySection) {
|
|
132
|
+
lines.push(...this.formatSectionHeader(section));
|
|
133
|
+
lines.push('');
|
|
134
|
+
for (const [name, resource] of resources) {
|
|
135
|
+
if (resource.linterSuppressions && resource.linterSuppressions.length > 0) {
|
|
136
|
+
resource.linterSuppressions.forEach(code => {
|
|
137
|
+
lines.push(`#disable-next-line ${code}`);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
if (resource.comment) {
|
|
141
|
+
lines.push(`// ${resource.comment}`);
|
|
142
|
+
}
|
|
143
|
+
const resourceType = resource.type.includes('@') ? resource.type : `${resource.type}@${resource.apiVersion}`;
|
|
144
|
+
const resourceDeclaration = resource.existing ? `resource ${name} '${resourceType}' existing = {` : `resource ${name} '${resourceType}' = {`;
|
|
145
|
+
lines.push(resourceDeclaration);
|
|
146
|
+
const knownProps = ['type', 'apiVersion', 'dependsOn', 'comment', 'linterSuppressions', 'propertySuppressions', 'existing'];
|
|
147
|
+
for (const [key, value] of Object.entries(resource)) {
|
|
148
|
+
if (knownProps.includes(key))
|
|
149
|
+
continue;
|
|
150
|
+
if (value === undefined)
|
|
151
|
+
continue;
|
|
152
|
+
if (this.isEmptyValue(value))
|
|
153
|
+
continue;
|
|
154
|
+
const camelKey = this.toCamelCase(key);
|
|
155
|
+
// Add property-level linter suppressions
|
|
156
|
+
if (resource.propertySuppressions && resource.propertySuppressions[key]) {
|
|
157
|
+
resource.propertySuppressions[key].forEach(code => {
|
|
158
|
+
lines.push(` #disable-next-line ${code}`);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if (key === 'properties' && value) {
|
|
162
|
+
lines.push(` ${camelKey}: ${this.formatValue(value, 2)}`);
|
|
163
|
+
}
|
|
164
|
+
else if (key === 'kind') {
|
|
165
|
+
lines.push(` ${camelKey}: '${value}'`);
|
|
166
|
+
}
|
|
167
|
+
else if (key === 'location') {
|
|
168
|
+
lines.push(` ${camelKey}: ${value}`);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
lines.push(` ${camelKey}: ${this.formatValue(value, 2)}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (resource.dependsOn && resource.dependsOn.length > 0) {
|
|
175
|
+
lines.push(' dependsOn: [');
|
|
176
|
+
resource.dependsOn.forEach(dep => lines.push(` ${dep}`));
|
|
177
|
+
lines.push(' ]');
|
|
178
|
+
}
|
|
179
|
+
lines.push('}');
|
|
180
|
+
lines.push('');
|
|
181
|
+
}
|
|
182
|
+
lines.push('');
|
|
183
|
+
}
|
|
184
|
+
// Outputs
|
|
185
|
+
if (this.outputs.size > 0) {
|
|
186
|
+
lines.push(...this.formatSectionHeader('Outputs'));
|
|
187
|
+
lines.push('');
|
|
188
|
+
}
|
|
189
|
+
for (const [name, output] of this.outputs) {
|
|
190
|
+
lines.push(`output ${name} ${output.type} = ${output.value}`);
|
|
191
|
+
}
|
|
192
|
+
return lines.join('\n');
|
|
193
|
+
}
|
|
194
|
+
formatValue(value, indent = 0) {
|
|
195
|
+
if (typeof value === 'string') {
|
|
196
|
+
// Check if it's already a quoted Bicep expression with interpolation
|
|
197
|
+
if (value.startsWith("'") && value.endsWith("'")) {
|
|
198
|
+
return value;
|
|
199
|
+
}
|
|
200
|
+
// Check if it's a multi-line script (contains newlines)
|
|
201
|
+
if (value.includes('\n')) {
|
|
202
|
+
// Multi-line string literal
|
|
203
|
+
return `'''\n${value}\n'''`;
|
|
204
|
+
}
|
|
205
|
+
// Check if it's a Bicep function call (e.g., guid(...), tenant(), resourceGroup().location)
|
|
206
|
+
if (/^[a-zA-Z][a-zA-Z0-9]*\(.*\)/.test(value)) {
|
|
207
|
+
return value;
|
|
208
|
+
}
|
|
209
|
+
// Check if it's a nested resource name pattern (e.g., ResourceName.uniqueName/childName)
|
|
210
|
+
if (/^[a-zA-Z][a-zA-Z0-9]*\.[a-zA-Z][a-zA-Z0-9]*\/[^']+$/.test(value)) {
|
|
211
|
+
const [parentRef, childName] = value.split('/');
|
|
212
|
+
return `'\${${parentRef}}/${childName}'`;
|
|
213
|
+
}
|
|
214
|
+
// Check if it's a Bicep property reference (e.g., resourceName.property, resourceName.properties.subProperty)
|
|
215
|
+
if (/^[a-zA-Z][a-zA-Z0-9]*(?:\.[a-zA-Z][a-zA-Z0-9]*)+$/.test(value)) {
|
|
216
|
+
return value;
|
|
217
|
+
}
|
|
218
|
+
// Check if it's a Bicep parameter or simple identifier (e.g., parameterName, location)
|
|
219
|
+
if (/^[a-zA-Z][a-zA-Z0-9]*$/.test(value) && this.parameters.has(value)) {
|
|
220
|
+
return value;
|
|
221
|
+
}
|
|
222
|
+
// Check if it's a known Bicep expression
|
|
223
|
+
if (['location', 'utcValue', 'appName', 'redirectUri', 'signInAudience'].includes(value)) {
|
|
224
|
+
return value;
|
|
225
|
+
}
|
|
226
|
+
// Check if it contains unresolved CDK tokens
|
|
227
|
+
if (value.includes('Token[')) {
|
|
228
|
+
return `'${value}'`;
|
|
229
|
+
}
|
|
230
|
+
// Check if it's a GUID and add comment if known
|
|
231
|
+
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) {
|
|
232
|
+
const comment = this.getGuidComment(value);
|
|
233
|
+
return comment ? `'${value}' // ${comment}` : `'${value}'`;
|
|
234
|
+
}
|
|
235
|
+
// Check if string contains single quotes AND looks like a shell script - use multi-line string
|
|
236
|
+
if (value.includes("'") && (value.includes('az ') || value.includes('echo ') || value.length > 100)) {
|
|
237
|
+
return `'''${value}'''`;
|
|
238
|
+
}
|
|
239
|
+
return `'${value}'`;
|
|
240
|
+
}
|
|
241
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
242
|
+
return String(value);
|
|
243
|
+
}
|
|
244
|
+
if (Array.isArray(value)) {
|
|
245
|
+
if (value.length === 0) {
|
|
246
|
+
return '[]';
|
|
247
|
+
}
|
|
248
|
+
const itemIndent = ' '.repeat(indent + 2);
|
|
249
|
+
const closeIndent = ' '.repeat(indent);
|
|
250
|
+
const items = value.map(v => `${itemIndent}${this.formatValue(v, indent + 2)}`).join('\n');
|
|
251
|
+
return `[\n${items}\n${closeIndent}]`;
|
|
252
|
+
}
|
|
253
|
+
if (typeof value === 'object') {
|
|
254
|
+
return this.formatObject(value, indent);
|
|
255
|
+
}
|
|
256
|
+
return String(value);
|
|
257
|
+
}
|
|
258
|
+
formatObject(obj, indent) {
|
|
259
|
+
const propIndent = ' '.repeat(indent + 2);
|
|
260
|
+
const closeIndent = ' '.repeat(indent);
|
|
261
|
+
const lines = ['{'];
|
|
262
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
263
|
+
// Special handling for Bicep interpolated keys (e.g., '${Managedidentity.id}' or ${Managedidentity.id})
|
|
264
|
+
if ((key.startsWith("'${") && key.endsWith("}'"))) {
|
|
265
|
+
lines.push(`${propIndent}${key}: ${this.formatValue(value, indent + 2)}`);
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (key.startsWith('${') && key.endsWith('}')) {
|
|
269
|
+
lines.push(`${propIndent}'${key}': ${this.formatValue(value, indent + 2)}`);
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
if (this.isEmptyValue(value))
|
|
273
|
+
continue;
|
|
274
|
+
const camelKey = (key.includes('_') || key.charAt(0) === key.charAt(0).toUpperCase()) ? key : this.toCamelCase(key);
|
|
275
|
+
lines.push(`${propIndent}${camelKey}: ${this.formatValue(value, indent + 2)}`);
|
|
276
|
+
}
|
|
277
|
+
lines.push(`${closeIndent}}`);
|
|
278
|
+
return lines.join('\n');
|
|
279
|
+
}
|
|
280
|
+
isEmptyValue(value) {
|
|
281
|
+
if (value === null || value === undefined)
|
|
282
|
+
return true;
|
|
283
|
+
if (value === '')
|
|
284
|
+
return true;
|
|
285
|
+
if (Array.isArray(value) && value.length === 0)
|
|
286
|
+
return true;
|
|
287
|
+
if (typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length === 0)
|
|
288
|
+
return true;
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
toCamelCase(str) {
|
|
292
|
+
return str.charAt(0).toLowerCase() + str.slice(1);
|
|
293
|
+
}
|
|
294
|
+
toPascalCase(str) {
|
|
295
|
+
return str
|
|
296
|
+
.split(/[-_\s]+/)
|
|
297
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
298
|
+
.join('')
|
|
299
|
+
.replace(/[^a-zA-Z0-9]/g, '')
|
|
300
|
+
.replace(/^[0-9]/, '_$&');
|
|
301
|
+
}
|
|
302
|
+
getGuidComment(guid) {
|
|
303
|
+
const lowerGuid = guid.toLowerCase();
|
|
304
|
+
if (lowerGuid === types_1.ResourceAppId.MICROSOFT_GRAPH.toLowerCase()) {
|
|
305
|
+
return 'Microsoft Graph';
|
|
306
|
+
}
|
|
307
|
+
const permissionMap = {
|
|
308
|
+
[types_1.MicrosoftGraphPermission.USER_READ]: 'User.Read',
|
|
309
|
+
[types_1.MicrosoftGraphPermission.USER_READ_WRITE]: 'User.ReadWrite',
|
|
310
|
+
[types_1.MicrosoftGraphPermission.USER_READ_ALL]: 'User.Read.All',
|
|
311
|
+
[types_1.MicrosoftGraphPermission.USER_READ_WRITE_ALL]: 'User.ReadWrite.All',
|
|
312
|
+
[types_1.MicrosoftGraphPermission.DIRECTORY_READ_ALL]: 'Directory.Read.All',
|
|
313
|
+
[types_1.MicrosoftGraphPermission.DIRECTORY_READ_WRITE_ALL]: 'Directory.ReadWrite.All',
|
|
314
|
+
[types_1.MicrosoftGraphPermission.GROUP_READ_ALL]: 'Group.Read.All',
|
|
315
|
+
[types_1.MicrosoftGraphPermission.GROUP_READ_WRITE_ALL]: 'Group.ReadWrite.All',
|
|
316
|
+
[types_1.MicrosoftGraphPermission.MAIL_READ]: 'Mail.Read',
|
|
317
|
+
[types_1.MicrosoftGraphPermission.MAIL_READ_WRITE]: 'Mail.ReadWrite',
|
|
318
|
+
[types_1.MicrosoftGraphPermission.MAIL_SEND]: 'Mail.Send',
|
|
319
|
+
[types_1.MicrosoftGraphPermission.CALENDARS_READ]: 'Calendars.Read',
|
|
320
|
+
[types_1.MicrosoftGraphPermission.CALENDARS_READ_WRITE]: 'Calendars.ReadWrite',
|
|
321
|
+
[types_1.MicrosoftGraphPermission.FILES_READ]: 'Files.Read',
|
|
322
|
+
[types_1.MicrosoftGraphPermission.FILES_READ_WRITE]: 'Files.ReadWrite',
|
|
323
|
+
[types_1.MicrosoftGraphPermission.FILES_READ_ALL]: 'Files.Read.All',
|
|
324
|
+
[types_1.MicrosoftGraphPermission.FILES_READ_WRITE_ALL]: 'Files.ReadWrite.All',
|
|
325
|
+
};
|
|
326
|
+
for (const [permGuid, name] of Object.entries(permissionMap)) {
|
|
327
|
+
if (permGuid.toLowerCase() === lowerGuid) {
|
|
328
|
+
return name;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
getResourceSection(resourceType) {
|
|
334
|
+
if (resourceType.includes('Microsoft.Graph/groups'))
|
|
335
|
+
return 'Azure AD Groups';
|
|
336
|
+
if (resourceType.includes('Microsoft.Graph/appRoleAssignedTo'))
|
|
337
|
+
return 'Group Role Assignments';
|
|
338
|
+
if (resourceType.includes('Microsoft.Graph/applications/federatedIdentityCredentials'))
|
|
339
|
+
return 'Federated Identity Credentials';
|
|
340
|
+
if (resourceType.includes('Microsoft.Graph/applications'))
|
|
341
|
+
return 'Azure AD Application';
|
|
342
|
+
if (resourceType.includes('Microsoft.Graph/servicePrincipals'))
|
|
343
|
+
return 'Service Principal';
|
|
344
|
+
if (resourceType.includes('Microsoft.Compute'))
|
|
345
|
+
return 'Compute Resources';
|
|
346
|
+
if (resourceType.includes('Microsoft.Network'))
|
|
347
|
+
return 'Network Resources';
|
|
348
|
+
if (resourceType.includes('Microsoft.Storage'))
|
|
349
|
+
return 'Storage Resources';
|
|
350
|
+
return 'Resources';
|
|
351
|
+
}
|
|
352
|
+
formatSectionHeader(title) {
|
|
353
|
+
const border = '// ========================================================================';
|
|
354
|
+
const totalWidth = border.length;
|
|
355
|
+
const contentWidth = totalWidth - 5;
|
|
356
|
+
const padding = contentWidth - title.length;
|
|
357
|
+
const leftPad = Math.floor(padding / 2);
|
|
358
|
+
const rightPad = padding - leftPad;
|
|
359
|
+
const centeredTitle = `// =${' '.repeat(leftPad)}${title}${' '.repeat(rightPad)}=`;
|
|
360
|
+
return [border, centeredTitle, border];
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
exports.BicepTemplate = BicepTemplate;
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmljZXAvZGVwbG95L3RlbXBsYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILG9EQUFtRjtBQUVuRixJQUFZLGtCQU1YO0FBTkQsV0FBWSxrQkFBa0I7SUFDNUIsdUNBQWlCLENBQUE7SUFDakIsaUNBQVcsQ0FBQTtJQUNYLG1DQUFhLENBQUE7SUFDYix1Q0FBaUIsQ0FBQTtJQUNqQixxQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFOVyxrQkFBa0Isa0NBQWxCLGtCQUFrQixRQU03QjtBQUVELElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN4Qiw0R0FBMEYsQ0FBQTtJQUMxRixnRkFBOEQsQ0FBQTtBQUNoRSxDQUFDLEVBSFcsY0FBYyw4QkFBZCxjQUFjLFFBR3pCO0FBcUNELE1BQWEsYUFBYTtJQUExQjtRQUNVLGVBQVUsR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNwRCxjQUFTLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbEQsWUFBTyxHQUE2QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzlDLGVBQVUsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM1QyxhQUFRLEdBQWtCLEVBQUUsQ0FBQztJQXVXdkMsQ0FBQztJQXJXQyxrQkFBa0IsQ0FBQyxJQUFZLEVBQUUsV0FBb0IsRUFBRSxZQUFxQjtRQUMxRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDdkgsQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUFZLEVBQUUsV0FBb0IsRUFBRSxZQUFxQjtRQUN2RSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDcEgsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVksRUFBRSxXQUFvQixFQUFFLFlBQXNCO1FBQ3pFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUNySCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBWSxFQUFFLFdBQW9CLEVBQUUsWUFBa0M7UUFDdkYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsV0FBb0IsRUFBRSxZQUFvQjtRQUN4RSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUF5QjtRQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELFdBQVcsQ0FBQyxRQUF1QjtRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsV0FBVyxDQUFDLElBQVksRUFBRSxRQUF1QjtRQUMvQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUN4QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBRTNCLHFCQUFxQjtRQUNyQixLQUFLLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxDQUFDLENBQUM7UUFDL0UsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVmLFdBQVc7UUFDWCxLQUFLLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDckMsS0FBSyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNuQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFZixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEQsS0FBSyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNyRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUVELGFBQWE7UUFDYixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksR0FBRyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBRUQsYUFBYTtRQUNiLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDNUMsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDekIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUM7WUFDRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsWUFBWSxLQUFLLFNBQVM7Z0JBQ2pELENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUM5QyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDdkQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBRUQsK0JBQStCO1FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQTBDLENBQUM7UUFFN0UsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQ0Qsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdEQsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2pELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFZixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksUUFBUSxDQUFDLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzFFLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ3pDLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQXNCLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzNDLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3JCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztnQkFFRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDN0csTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksS0FBSyxZQUFZLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksS0FBSyxZQUFZLE9BQU8sQ0FBQztnQkFDN0ksS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUVoQyxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDNUgsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDcEQsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQzt3QkFBRSxTQUFTO29CQUN2QyxJQUFJLEtBQUssS0FBSyxTQUFTO3dCQUFFLFNBQVM7b0JBQ2xDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7d0JBQUUsU0FBUztvQkFFdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFFdkMseUNBQXlDO29CQUN6QyxJQUFJLFFBQVEsQ0FBQyxvQkFBb0IsSUFBSSxRQUFRLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDeEUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDaEQsS0FBSyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFDN0MsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQztvQkFFRCxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksS0FBSyxFQUFFLENBQUM7d0JBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxRQUFRLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM3RCxDQUFDO3lCQUFNLElBQUksR0FBRyxLQUFLLE1BQU0sRUFBRSxDQUFDO3dCQUMxQixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssUUFBUSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUM7b0JBQzFDLENBQUM7eUJBQU0sSUFBSSxHQUFHLEtBQUssVUFBVSxFQUFFLENBQUM7d0JBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxRQUFRLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztvQkFDeEMsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxRQUFRLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM3RCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN4RCxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQzdCLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDNUQsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEIsQ0FBQztnQkFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pCLENBQUM7WUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxVQUFVO1FBQ1YsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbkQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQVUsRUFBRSxTQUFpQixDQUFDO1FBQ2hELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIscUVBQXFFO1lBQ3JFLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELHdEQUF3RDtZQUN4RCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDekIsNEJBQTRCO2dCQUM1QixPQUFPLFFBQVEsS0FBSyxPQUFPLENBQUM7WUFDOUIsQ0FBQztZQUNELDRGQUE0RjtZQUM1RixJQUFJLDZCQUE2QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCx5RkFBeUY7WUFDekYsSUFBSSxxREFBcUQsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRCxPQUFPLE9BQU8sU0FBUyxLQUFLLFNBQVMsR0FBRyxDQUFDO1lBQzNDLENBQUM7WUFDRCw4R0FBOEc7WUFDOUcsSUFBSSxtREFBbUQsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEUsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsdUZBQXVGO1lBQ3ZGLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZFLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELHlDQUF5QztZQUN6QyxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pGLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELDZDQUE2QztZQUM3QyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLEtBQUssR0FBRyxDQUFDO1lBQ3RCLENBQUM7WUFDRCxnREFBZ0Q7WUFDaEQsSUFBSSxpRUFBaUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0MsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDO1lBQzdELENBQUM7WUFDRCwrRkFBK0Y7WUFDL0YsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEcsT0FBTyxNQUFNLEtBQUssS0FBSyxDQUFDO1lBQzFCLENBQUM7WUFDRCxPQUFPLElBQUksS0FBSyxHQUFHLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNGLE9BQU8sTUFBTSxLQUFLLEtBQUssV0FBVyxHQUFHLENBQUM7UUFDeEMsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVPLFlBQVksQ0FBQyxHQUF3QixFQUFFLE1BQWM7UUFDM0QsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0Msd0dBQXdHO1lBQ3hHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxHQUFHLEdBQUcsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRSxTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzVFLFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztnQkFBRSxTQUFTO1lBQ3ZDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BILEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsUUFBUSxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakYsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQVU7UUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkQsSUFBSSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM1RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZHLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLFdBQVcsQ0FBQyxHQUFXO1FBQzdCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTyxZQUFZLENBQUMsR0FBVztRQUM5QixPQUFPLEdBQUc7YUFDUCxLQUFLLENBQUMsU0FBUyxDQUFDO2FBQ2hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUN2RSxJQUFJLENBQUMsRUFBRSxDQUFDO2FBQ1IsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7YUFDNUIsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU8sY0FBYyxDQUFDLElBQVk7UUFDakMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXJDLElBQUksU0FBUyxLQUFLLHFCQUFhLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDOUQsT0FBTyxpQkFBaUIsQ0FBQztRQUMzQixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQTJCO1lBQzVDLENBQUMsZ0NBQXdCLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVztZQUNqRCxDQUFDLGdDQUF3QixDQUFDLGVBQWUsQ0FBQyxFQUFFLGdCQUFnQjtZQUM1RCxDQUFDLGdDQUF3QixDQUFDLGFBQWEsQ0FBQyxFQUFFLGVBQWU7WUFDekQsQ0FBQyxnQ0FBd0IsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLG9CQUFvQjtZQUNwRSxDQUFDLGdDQUF3QixDQUFDLGtCQUFrQixDQUFDLEVBQUUsb0JBQW9CO1lBQ25FLENBQUMsZ0NBQXdCLENBQUMsd0JBQXdCLENBQUMsRUFBRSx5QkFBeUI7WUFDOUUsQ0FBQyxnQ0FBd0IsQ0FBQyxjQUFjLENBQUMsRUFBRSxnQkFBZ0I7WUFDM0QsQ0FBQyxnQ0FBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLHFCQUFxQjtZQUN0RSxDQUFDLGdDQUF3QixDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVc7WUFDakQsQ0FBQyxnQ0FBd0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxnQkFBZ0I7WUFDNUQsQ0FBQyxnQ0FBd0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxXQUFXO1lBQ2pELENBQUMsZ0NBQXdCLENBQUMsY0FBYyxDQUFDLEVBQUUsZ0JBQWdCO1lBQzNELENBQUMsZ0NBQXdCLENBQUMsb0JBQW9CLENBQUMsRUFBRSxxQkFBcUI7WUFDdEUsQ0FBQyxnQ0FBd0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxZQUFZO1lBQ25ELENBQUMsZ0NBQXdCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxpQkFBaUI7WUFDOUQsQ0FBQyxnQ0FBd0IsQ0FBQyxjQUFjLENBQUMsRUFBRSxnQkFBZ0I7WUFDM0QsQ0FBQyxnQ0FBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLHFCQUFxQjtTQUN2RSxDQUFDO1FBRUYsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUM3RCxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFlBQW9CO1FBQzdDLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQztZQUFFLE9BQU8saUJBQWlCLENBQUM7UUFDOUUsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLG1DQUFtQyxDQUFDO1lBQUUsT0FBTyx3QkFBd0IsQ0FBQztRQUNoRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsMkRBQTJELENBQUM7WUFBRSxPQUFPLGdDQUFnQyxDQUFDO1FBQ2hJLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQztZQUFFLE9BQU8sc0JBQXNCLENBQUM7UUFDekYsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLG1DQUFtQyxDQUFDO1lBQUUsT0FBTyxtQkFBbUIsQ0FBQztRQUMzRixJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7WUFBRSxPQUFPLG1CQUFtQixDQUFDO1FBQzNFLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztZQUFFLE9BQU8sbUJBQW1CLENBQUM7UUFDM0UsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDO1lBQUUsT0FBTyxtQkFBbUIsQ0FBQztRQUMzRSxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRU8sbUJBQW1CLENBQUMsS0FBYTtRQUN2QyxNQUFNLE1BQU0sR0FBRyw2RUFBNkUsQ0FBQztRQUM3RixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2pDLE1BQU0sWUFBWSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUNuQyxNQUFNLGFBQWEsR0FBRyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUNuRixPQUFPLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUE1V0Qsc0NBNFdDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMaWdodHdlaWdodCBCaWNlcCBzeW50aGVzaXplciBmb3IgZ2VuZXJhdGluZyBCaWNlcCB0ZW1wbGF0ZXMgZnJvbSBUeXBlU2NyaXB0LlxuICogUHJvdmlkZXMgdHlwZS1zYWZlIEJpY2VwIGdlbmVyYXRpb24gd2l0aG91dCByZXF1aXJpbmcgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IFJlc291cmNlQXBwSWQsIE1pY3Jvc29mdEdyYXBoUGVybWlzc2lvbiB9IGZyb20gJy4uL3Jlc291cmNlcy9ncmFwaC90eXBlcyc7XG5cbmV4cG9ydCBlbnVtIEJpY2VwUGFyYW1ldGVyVHlwZSB7XG4gIFNUUklORyA9ICdzdHJpbmcnLFxuICBJTlQgPSAnaW50JyxcbiAgQk9PTCA9ICdib29sJyxcbiAgT0JKRUNUID0gJ29iamVjdCcsXG4gIEFSUkFZID0gJ2FycmF5Jyxcbn1cblxuZXhwb3J0IGVudW0gQmljZXBFeHRlbnNpb24ge1xuICBNSUNST1NPRlRfR1JBUEhfU1RBQkxFID0gJ2JyOm1jci5taWNyb3NvZnQuY29tL2JpY2VwL2V4dGVuc2lvbnMvbWljcm9zb2Z0Z3JhcGgvdjEuMDoxLjAuMCcsXG4gIEtVQkVSTkVURVNfU1RBQkxFID0gJ01pY3Jvc29mdC5LdWJlcm5ldGVzQ29uZmlndXJhdGlvbi9zdGFibGUnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJpY2VwUGFyYW1ldGVyIHtcbiAgdHlwZTogQmljZXBQYXJhbWV0ZXJUeXBlO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZGVmYXVsdFZhbHVlPzogYW55O1xuICBhbGxvd2VkVmFsdWVzPzogYW55W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmljZXBSZXNvdXJjZSB7XG4gIHR5cGU6IHN0cmluZztcbiAgYXBpVmVyc2lvbjogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICBraW5kPzogc3RyaW5nO1xuICBsb2NhdGlvbj86IHN0cmluZztcbiAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGRlcGVuZHNPbj86IHN0cmluZ1tdO1xuICBjb21tZW50Pzogc3RyaW5nO1xuICBsaW50ZXJTdXBwcmVzc2lvbnM/OiBzdHJpbmdbXTsgLy8gQmljZXAgbGludGVyIHJ1bGUgY29kZXMgdG8gc3VwcHJlc3MgZm9yIHRoZSByZXNvdXJjZSBkZWNsYXJhdGlvblxuICBwcm9wZXJ0eVN1cHByZXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjsgLy8gUHJvcGVydHkgbmFtZSAtPiBsaW50ZXIgY29kZXMgdG8gc3VwcHJlc3NcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJpY2VwT3V0cHV0IHtcbiAgdHlwZTogQmljZXBQYXJhbWV0ZXJUeXBlO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJpY2VwTWV0YWRhdGEge1xuICBuYW1lPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgY2xvdWRmb3JtYXRpb24/OiB7XG4gICAgc3RhY2tBcm4/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBCaWNlcFRlbXBsYXRlIHtcbiAgcHJpdmF0ZSBwYXJhbWV0ZXJzOiBNYXA8c3RyaW5nLCBCaWNlcFBhcmFtZXRlcj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVzb3VyY2VzOiBNYXA8c3RyaW5nLCBCaWNlcFJlc291cmNlPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBvdXRwdXRzOiBNYXA8c3RyaW5nLCBCaWNlcE91dHB1dD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgZXh0ZW5zaW9uczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBtZXRhZGF0YTogQmljZXBNZXRhZGF0YSA9IHt9O1xuXG4gIGFkZFN0cmluZ1BhcmFtZXRlcihuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KG5hbWUsIHsgdHlwZTogQmljZXBQYXJhbWV0ZXJUeXBlLlNUUklORywgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLCBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSB9KTtcbiAgfVxuXG4gIGFkZEludFBhcmFtZXRlcihuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KG5hbWUsIHsgdHlwZTogQmljZXBQYXJhbWV0ZXJUeXBlLklOVCwgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLCBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSB9KTtcbiAgfVxuXG4gIGFkZEJvb2xQYXJhbWV0ZXIobmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucGFyYW1ldGVycy5zZXQobmFtZSwgeyB0eXBlOiBCaWNlcFBhcmFtZXRlclR5cGUuQk9PTCwgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLCBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSB9KTtcbiAgfVxuXG4gIGFkZE9iamVjdFBhcmFtZXRlcihuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbWV0ZXJzLnNldChuYW1lLCB7IHR5cGU6IEJpY2VwUGFyYW1ldGVyVHlwZS5PQkpFQ1QsIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiwgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUgfSk7XG4gIH1cblxuICBhZGRBcnJheVBhcmFtZXRlcihuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnlbXSk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1ldGVycy5zZXQobmFtZSwgeyB0eXBlOiBCaWNlcFBhcmFtZXRlclR5cGUuQVJSQVksIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiwgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUgfSk7XG4gIH1cblxuICBhZGRFeHRlbnNpb24oZXh0ZW5zaW9uOiBCaWNlcEV4dGVuc2lvbik6IHZvaWQge1xuICAgIHRoaXMuZXh0ZW5zaW9ucy5zZXQoZXh0ZW5zaW9uLCBleHRlbnNpb24pO1xuICB9XG5cbiAgc2V0TWV0YWRhdGEobWV0YWRhdGE6IEJpY2VwTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gIH1cblxuICBhZGRSZXNvdXJjZShuYW1lOiBzdHJpbmcsIHJlc291cmNlOiBCaWNlcFJlc291cmNlKTogdm9pZCB7XG4gICAgY29uc3QgcGFzY2FsQ2FzZU5hbWUgPSB0aGlzLnRvUGFzY2FsQ2FzZShuYW1lKTtcbiAgICB0aGlzLnJlc291cmNlcy5zZXQocGFzY2FsQ2FzZU5hbWUsIHJlc291cmNlKTtcbiAgfVxuXG4gIGFkZFN0cmluZ091dHB1dChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm91dHB1dHMuc2V0KG5hbWUsIHsgdHlwZTogQmljZXBQYXJhbWV0ZXJUeXBlLlNUUklORywgdmFsdWU6IHZhbHVlIH0pO1xuICB9XG5cbiAgYWRkSW50T3V0cHV0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub3V0cHV0cy5zZXQobmFtZSwgeyB0eXBlOiBCaWNlcFBhcmFtZXRlclR5cGUuSU5ULCB2YWx1ZTogdmFsdWUgfSk7XG4gIH1cblxuICBhZGRCb29sT3V0cHV0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub3V0cHV0cy5zZXQobmFtZSwgeyB0eXBlOiBCaWNlcFBhcmFtZXRlclR5cGUuQk9PTCwgdmFsdWU6IHZhbHVlIH0pO1xuICB9XG5cbiAgYWRkT2JqZWN0T3V0cHV0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub3V0cHV0cy5zZXQobmFtZSwgeyB0eXBlOiBCaWNlcFBhcmFtZXRlclR5cGUuT0JKRUNULCB2YWx1ZTogdmFsdWUgfSk7XG4gIH1cblxuICBhZGRBcnJheU91dHB1dChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm91dHB1dHMuc2V0KG5hbWUsIHsgdHlwZTogQmljZXBQYXJhbWV0ZXJUeXBlLkFSUkFZLCB2YWx1ZTogdmFsdWUgfSk7XG4gIH1cblxuICBzeW50aGVzaXplKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBBZGQgaGVhZGVyIGNvbW1lbnRcbiAgICBsaW5lcy5wdXNoKCcvLyBUaGlzIHRlbXBsYXRlIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgc3ludGhlc2l6ZWQgYnkgYmljZXAtY2RrJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBNZXRhZGF0YVxuICAgIGxpbmVzLnB1c2goJ21ldGFkYXRhIGdlbmVyYXRvciA9IHsnKTtcbiAgICBsaW5lcy5wdXNoKCcgIG5hbWU6IFxcJ2JpY2VwLWNka1xcJycpO1xuICAgIGxpbmVzLnB1c2goJyAgdmVyc2lvbjogXFwnMS4wLjBcXCcnKTtcbiAgICBsaW5lcy5wdXNoKCd9Jyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICBpZiAodGhpcy5tZXRhZGF0YS5uYW1lIHx8IHRoaXMubWV0YWRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmVzLnB1c2goJ21ldGFkYXRhIHRlbXBsYXRlID0geycpO1xuICAgICAgaWYgKHRoaXMubWV0YWRhdGEubmFtZSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAgIG5hbWU6ICcke3RoaXMubWV0YWRhdGEubmFtZX0nYCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tZXRhZGF0YS5kZXNjcmlwdGlvbikge1xuICAgICAgICBsaW5lcy5wdXNoKGAgIGRlc2NyaXB0aW9uOiAnJHt0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9ufSdgKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJ30nKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1ldGFkYXRhLmNsb3VkZm9ybWF0aW9uPy5zdGFja0Fybikge1xuICAgICAgbGluZXMucHVzaCgnbWV0YWRhdGEgY2xvdWRmb3JtYXRpb24gPSB7Jyk7XG4gICAgICBsaW5lcy5wdXNoKGAgIHN0YWNrQXJuOiAnJHt0aGlzLm1ldGFkYXRhLmNsb3VkZm9ybWF0aW9uLnN0YWNrQXJufSdgKTtcbiAgICAgIGxpbmVzLnB1c2goJ30nKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIC8vIEV4dGVuc2lvbnNcbiAgICBmb3IgKGNvbnN0IFtuYW1lXSBvZiB0aGlzLmV4dGVuc2lvbnMpIHtcbiAgICAgIGxpbmVzLnB1c2goYGV4dGVuc2lvbiAnJHtuYW1lfSdgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZXh0ZW5zaW9ucy5zaXplID4gMCkge1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gUGFyYW1ldGVyc1xuICAgIGZvciAoY29uc3QgW25hbWUsIHBhcmFtXSBvZiB0aGlzLnBhcmFtZXRlcnMpIHtcbiAgICAgIGlmIChwYXJhbS5kZXNjcmlwdGlvbikge1xuICAgICAgICBsaW5lcy5wdXNoKGBAZGVzY3JpcHRpb24oJyR7cGFyYW0uZGVzY3JpcHRpb259JylgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbS5hbGxvd2VkVmFsdWVzKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJ0BhbGxvd2VkKFsnKTtcbiAgICAgICAgcGFyYW0uYWxsb3dlZFZhbHVlcy5mb3JFYWNoKHYgPT4gbGluZXMucHVzaChgICAnJHt2fSdgKSk7XG4gICAgICAgIGxpbmVzLnB1c2goJ10pJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWZhdWx0VmFsID0gcGFyYW0uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBgID0gJHt0aGlzLmZvcm1hdFZhbHVlKHBhcmFtLmRlZmF1bHRWYWx1ZSl9YFxuICAgICAgICA6ICcnO1xuICAgICAgbGluZXMucHVzaChgcGFyYW0gJHtuYW1lfSAke3BhcmFtLnR5cGV9JHtkZWZhdWx0VmFsfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gUmVzb3VyY2VzIGdyb3VwZWQgYnkgc2VjdGlvblxuICAgIGNvbnN0IHJlc291cmNlc0J5U2VjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxbc3RyaW5nLCBCaWNlcFJlc291cmNlXT4+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCByZXNvdXJjZV0gb2YgdGhpcy5yZXNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLmdldFJlc291cmNlU2VjdGlvbihyZXNvdXJjZS50eXBlKTtcbiAgICAgIGlmICghcmVzb3VyY2VzQnlTZWN0aW9uLmhhcyhzZWN0aW9uKSkge1xuICAgICAgICByZXNvdXJjZXNCeVNlY3Rpb24uc2V0KHNlY3Rpb24sIFtdKTtcbiAgICAgIH1cbiAgICAgIHJlc291cmNlc0J5U2VjdGlvbi5nZXQoc2VjdGlvbikhLnB1c2goW25hbWUsIHJlc291cmNlXSk7XG4gICAgfVxuXG4gICAgLy8gT3V0cHV0IHJlc291cmNlcyBncm91cGVkIGJ5IHNlY3Rpb25cbiAgICBmb3IgKGNvbnN0IFtzZWN0aW9uLCByZXNvdXJjZXNdIG9mIHJlc291cmNlc0J5U2VjdGlvbikge1xuICAgICAgbGluZXMucHVzaCguLi50aGlzLmZvcm1hdFNlY3Rpb25IZWFkZXIoc2VjdGlvbikpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHJlc291cmNlXSBvZiByZXNvdXJjZXMpIHtcbiAgICAgICAgaWYgKHJlc291cmNlLmxpbnRlclN1cHByZXNzaW9ucyAmJiByZXNvdXJjZS5saW50ZXJTdXBwcmVzc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc291cmNlLmxpbnRlclN1cHByZXNzaW9ucy5mb3JFYWNoKGNvZGUgPT4ge1xuICAgICAgICAgICAgbGluZXMucHVzaChgI2Rpc2FibGUtbmV4dC1saW5lICR7Y29kZX1gKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzb3VyY2UuY29tbWVudCkge1xuICAgICAgICAgIGxpbmVzLnB1c2goYC8vICR7cmVzb3VyY2UuY29tbWVudH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHJlc291cmNlLnR5cGUuaW5jbHVkZXMoJ0AnKSA/IHJlc291cmNlLnR5cGUgOiBgJHtyZXNvdXJjZS50eXBlfUAke3Jlc291cmNlLmFwaVZlcnNpb259YDtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VEZWNsYXJhdGlvbiA9IHJlc291cmNlLmV4aXN0aW5nID8gYHJlc291cmNlICR7bmFtZX0gJyR7cmVzb3VyY2VUeXBlfScgZXhpc3RpbmcgPSB7YCA6IGByZXNvdXJjZSAke25hbWV9ICcke3Jlc291cmNlVHlwZX0nID0ge2A7XG4gICAgICAgIGxpbmVzLnB1c2gocmVzb3VyY2VEZWNsYXJhdGlvbik7XG5cbiAgICAgICAgY29uc3Qga25vd25Qcm9wcyA9IFsndHlwZScsICdhcGlWZXJzaW9uJywgJ2RlcGVuZHNPbicsICdjb21tZW50JywgJ2xpbnRlclN1cHByZXNzaW9ucycsICdwcm9wZXJ0eVN1cHByZXNzaW9ucycsICdleGlzdGluZyddO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXNvdXJjZSkpIHtcbiAgICAgICAgICBpZiAoa25vd25Qcm9wcy5pbmNsdWRlcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbXB0eVZhbHVlKHZhbHVlKSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBjYW1lbEtleSA9IHRoaXMudG9DYW1lbENhc2Uoa2V5KTtcblxuICAgICAgICAgIC8vIEFkZCBwcm9wZXJ0eS1sZXZlbCBsaW50ZXIgc3VwcHJlc3Npb25zXG4gICAgICAgICAgaWYgKHJlc291cmNlLnByb3BlcnR5U3VwcHJlc3Npb25zICYmIHJlc291cmNlLnByb3BlcnR5U3VwcHJlc3Npb25zW2tleV0pIHtcbiAgICAgICAgICAgIHJlc291cmNlLnByb3BlcnR5U3VwcHJlc3Npb25zW2tleV0uZm9yRWFjaChjb2RlID0+IHtcbiAgICAgICAgICAgICAgbGluZXMucHVzaChgICAjZGlzYWJsZS1uZXh0LWxpbmUgJHtjb2RlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3Byb3BlcnRpZXMnICYmIHZhbHVlKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGAgICR7Y2FtZWxLZXl9OiAke3RoaXMuZm9ybWF0VmFsdWUodmFsdWUsIDIpfWApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAna2luZCcpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goYCAgJHtjYW1lbEtleX06ICcke3ZhbHVlfSdgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2xvY2F0aW9uJykge1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAke2NhbWVsS2V5fTogJHt2YWx1ZX1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAke2NhbWVsS2V5fTogJHt0aGlzLmZvcm1hdFZhbHVlKHZhbHVlLCAyKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzb3VyY2UuZGVwZW5kc09uICYmIHJlc291cmNlLmRlcGVuZHNPbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGluZXMucHVzaCgnICBkZXBlbmRzT246IFsnKTtcbiAgICAgICAgICByZXNvdXJjZS5kZXBlbmRzT24uZm9yRWFjaChkZXAgPT4gbGluZXMucHVzaChgICAgICR7ZGVwfWApKTtcbiAgICAgICAgICBsaW5lcy5wdXNoKCcgIF0nKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5lcy5wdXNoKCd9Jyk7XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgfVxuXG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICAvLyBPdXRwdXRzXG4gICAgaWYgKHRoaXMub3V0cHV0cy5zaXplID4gMCkge1xuICAgICAgbGluZXMucHVzaCguLi50aGlzLmZvcm1hdFNlY3Rpb25IZWFkZXIoJ091dHB1dHMnKSk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbbmFtZSwgb3V0cHV0XSBvZiB0aGlzLm91dHB1dHMpIHtcbiAgICAgIGxpbmVzLnB1c2goYG91dHB1dCAke25hbWV9ICR7b3V0cHV0LnR5cGV9ID0gJHtvdXRwdXQudmFsdWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZSh2YWx1ZTogYW55LCBpbmRlbnQ6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGFscmVhZHkgYSBxdW90ZWQgQmljZXAgZXhwcmVzc2lvbiB3aXRoIGludGVycG9sYXRpb25cbiAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIidcIikpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIG11bHRpLWxpbmUgc2NyaXB0IChjb250YWlucyBuZXdsaW5lcylcbiAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgICAgLy8gTXVsdGktbGluZSBzdHJpbmcgbGl0ZXJhbFxuICAgICAgICByZXR1cm4gYCcnJ1xcbiR7dmFsdWV9XFxuJycnYDtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBCaWNlcCBmdW5jdGlvbiBjYWxsIChlLmcuLCBndWlkKC4uLiksIHRlbmFudCgpLCByZXNvdXJjZUdyb3VwKCkubG9jYXRpb24pXG4gICAgICBpZiAoL15bYS16QS1aXVthLXpBLVowLTldKlxcKC4qXFwpLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgbmVzdGVkIHJlc291cmNlIG5hbWUgcGF0dGVybiAoZS5nLiwgUmVzb3VyY2VOYW1lLnVuaXF1ZU5hbWUvY2hpbGROYW1lKVxuICAgICAgaWYgKC9eW2EtekEtWl1bYS16QS1aMC05XSpcXC5bYS16QS1aXVthLXpBLVowLTldKlxcL1teJ10rJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgW3BhcmVudFJlZiwgY2hpbGROYW1lXSA9IHZhbHVlLnNwbGl0KCcvJyk7XG4gICAgICAgIHJldHVybiBgJ1xcJHske3BhcmVudFJlZn19LyR7Y2hpbGROYW1lfSdgO1xuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIEJpY2VwIHByb3BlcnR5IHJlZmVyZW5jZSAoZS5nLiwgcmVzb3VyY2VOYW1lLnByb3BlcnR5LCByZXNvdXJjZU5hbWUucHJvcGVydGllcy5zdWJQcm9wZXJ0eSlcbiAgICAgIGlmICgvXlthLXpBLVpdW2EtekEtWjAtOV0qKD86XFwuW2EtekEtWl1bYS16QS1aMC05XSopKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBCaWNlcCBwYXJhbWV0ZXIgb3Igc2ltcGxlIGlkZW50aWZpZXIgKGUuZy4sIHBhcmFtZXRlck5hbWUsIGxvY2F0aW9uKVxuICAgICAgaWYgKC9eW2EtekEtWl1bYS16QS1aMC05XSokLy50ZXN0KHZhbHVlKSAmJiB0aGlzLnBhcmFtZXRlcnMuaGFzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEga25vd24gQmljZXAgZXhwcmVzc2lvblxuICAgICAgaWYgKFsnbG9jYXRpb24nLCAndXRjVmFsdWUnLCAnYXBwTmFtZScsICdyZWRpcmVjdFVyaScsICdzaWduSW5BdWRpZW5jZSddLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBpZiBpdCBjb250YWlucyB1bnJlc29sdmVkIENESyB0b2tlbnNcbiAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnVG9rZW5bJykpIHtcbiAgICAgICAgcmV0dXJuIGAnJHt2YWx1ZX0nYDtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBHVUlEIGFuZCBhZGQgY29tbWVudCBpZiBrbm93blxuICAgICAgaWYgKC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC9pLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmdldEd1aWRDb21tZW50KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGNvbW1lbnQgPyBgJyR7dmFsdWV9JyAvLyAke2NvbW1lbnR9YCA6IGAnJHt2YWx1ZX0nYDtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGlmIHN0cmluZyBjb250YWlucyBzaW5nbGUgcXVvdGVzIEFORCBsb29rcyBsaWtlIGEgc2hlbGwgc2NyaXB0IC0gdXNlIG11bHRpLWxpbmUgc3RyaW5nXG4gICAgICBpZiAodmFsdWUuaW5jbHVkZXMoXCInXCIpICYmICh2YWx1ZS5pbmNsdWRlcygnYXogJykgfHwgdmFsdWUuaW5jbHVkZXMoJ2VjaG8gJykgfHwgdmFsdWUubGVuZ3RoID4gMTAwKSkge1xuICAgICAgICByZXR1cm4gYCcnJyR7dmFsdWV9JycnYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJyR7dmFsdWV9J2A7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnW10nO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbUluZGVudCA9ICcgJy5yZXBlYXQoaW5kZW50ICsgMik7XG4gICAgICBjb25zdCBjbG9zZUluZGVudCA9ICcgJy5yZXBlYXQoaW5kZW50KTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gdmFsdWUubWFwKHYgPT4gYCR7aXRlbUluZGVudH0ke3RoaXMuZm9ybWF0VmFsdWUodiwgaW5kZW50ICsgMil9YCkuam9pbignXFxuJyk7XG4gICAgICByZXR1cm4gYFtcXG4ke2l0ZW1zfVxcbiR7Y2xvc2VJbmRlbnR9XWA7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRPYmplY3QodmFsdWUsIGluZGVudCk7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRPYmplY3Qob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpbmRlbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgcHJvcEluZGVudCA9ICcgJy5yZXBlYXQoaW5kZW50ICsgMik7XG4gICAgY29uc3QgY2xvc2VJbmRlbnQgPSAnICcucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgbGluZXMgPSBbJ3snXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBCaWNlcCBpbnRlcnBvbGF0ZWQga2V5cyAoZS5nLiwgJyR7TWFuYWdlZGlkZW50aXR5LmlkfScgb3IgJHtNYW5hZ2VkaWRlbnRpdHkuaWR9KVxuICAgICAgaWYgKChrZXkuc3RhcnRzV2l0aChcIicke1wiKSAmJiBrZXkuZW5kc1dpdGgoXCJ9J1wiKSkpIHtcbiAgICAgICAgbGluZXMucHVzaChgJHtwcm9wSW5kZW50fSR7a2V5fTogJHt0aGlzLmZvcm1hdFZhbHVlKHZhbHVlLCBpbmRlbnQgKyAyKX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJyR7JykgJiYga2V5LmVuZHNXaXRoKCd9JykpIHtcbiAgICAgICAgbGluZXMucHVzaChgJHtwcm9wSW5kZW50fScke2tleX0nOiAke3RoaXMuZm9ybWF0VmFsdWUodmFsdWUsIGluZGVudCArIDIpfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzRW1wdHlWYWx1ZSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2FtZWxLZXkgPSAoa2V5LmluY2x1ZGVzKCdfJykgfHwga2V5LmNoYXJBdCgwKSA9PT0ga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpKSA/IGtleSA6IHRoaXMudG9DYW1lbENhc2Uoa2V5KTtcbiAgICAgIGxpbmVzLnB1c2goYCR7cHJvcEluZGVudH0ke2NhbWVsS2V5fTogJHt0aGlzLmZvcm1hdFZhbHVlKHZhbHVlLCBpbmRlbnQgKyAyKX1gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaChgJHtjbG9zZUluZGVudH19YCk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0VtcHR5VmFsdWUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodmFsdWUgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0NhbWVsQ2FzZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9QYXNjYWxDYXNlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAuc3BsaXQoL1stX1xcc10rLylcbiAgICAgIC5tYXAod29yZCA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKVxuICAgICAgLmpvaW4oJycpXG4gICAgICAucmVwbGFjZSgvW15hLXpBLVowLTldL2csICcnKVxuICAgICAgLnJlcGxhY2UoL15bMC05XS8sICdfJCYnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3VpZENvbW1lbnQoZ3VpZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgbG93ZXJHdWlkID0gZ3VpZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGxvd2VyR3VpZCA9PT0gUmVzb3VyY2VBcHBJZC5NSUNST1NPRlRfR1JBUEgudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuICdNaWNyb3NvZnQgR3JhcGgnO1xuICAgIH1cblxuICAgIGNvbnN0IHBlcm1pc3Npb25NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBbTWljcm9zb2Z0R3JhcGhQZXJtaXNzaW9uLlVTRVJfUkVBRF06ICdVc2VyLlJlYWQnLFxuICAgICAgW01pY3Jvc29mdEdyYXBoUGVybWlzc2lvbi5VU0VSX1JFQURfV1JJVEVdOiAnVXNlci5SZWFkV3JpdGUnLFxuICAgICAgW01pY3Jvc29mdEdyYXBoUGVybWlzc2lvbi5VU0VSX1JFQURfQUxMXTogJ1VzZXIuUmVhZC5BbGwnLFxuICAgICAgW01pY3Jvc29mdEdyYXBoUGVybWlzc2lvbi5VU0VSX1JFQURfV1JJVEVfQUxMXTogJ1VzZXIuUmVhZFdyaXRlLkFsbCcsXG4gICAgICBbTWljcm9zb2Z0R3JhcGhQZXJtaXNzaW9uLkRJUkVDVE9SWV9SRUFEX0FMTF06ICdEaXJlY3RvcnkuUmVhZC5BbGwnLFxuICAgICAgW01pY3Jvc29mdEdyYXBoUGVybWlzc2lvbi5ESVJFQ1RPUllfUkVBRF9XUklURV9BTExdOiAnRGlyZWN0b3J5LlJlYWRXcml0ZS5BbGwnLFxuICAgICAgW01pY3Jvc29mdEdyYXBoUGVybWlzc2lvbi5HUk9VUF9SRUFEX0FMTF06ICdHcm91cC5SZWFkLkFsbCcsXG4gICAgICBbTWljcm9zb2Z0R3JhcGhQZXJtaXNzaW9uLkdST1VQX1JFQURfV1JJVEVfQUxMXTogJ0dyb3VwLlJlYWRXcml0ZS5BbGwnLFxuICAgICAgW01pY3Jvc29mdEdyYXBoUGVybWlzc2lvbi5NQUlMX1JFQURdOiAnTWFpbC5SZWFkJyxcbiAgICAgIFtNaWNyb3NvZnRHcmFwaFBlcm1pc3Npb24uTUFJTF9SRUFEX1dSSVRFXTogJ01haWwuUmVhZFdyaXRlJyxcbiAgICAgIFtNaWNyb3NvZnRHcmFwaFBlcm1pc3Npb24uTUFJTF9TRU5EXTogJ01haWwuU2VuZCcsXG4gICAgICBbTWljcm9zb2Z0R3JhcGhQZXJtaXNzaW9uLkNBTEVOREFSU19SRUFEXTogJ0NhbGVuZGFycy5SZWFkJyxcbiAgICAgIFtNaWNyb3NvZnRHcmFwaFBlcm1pc3Npb24uQ0FMRU5EQVJTX1JFQURfV1JJVEVdOiAnQ2FsZW5kYXJzLlJlYWRXcml0ZScsXG4gICAgICBbTWljcm9zb2Z0R3JhcGhQZXJtaXNzaW9uLkZJTEVTX1JFQURdOiAnRmlsZXMuUmVhZCcsXG4gICAgICBbTWljcm9zb2Z0R3JhcGhQZXJtaXNzaW9uLkZJTEVTX1JFQURfV1JJVEVdOiAnRmlsZXMuUmVhZFdyaXRlJyxcbiAgICAgIFtNaWNyb3NvZnRHcmFwaFBlcm1pc3Npb24uRklMRVNfUkVBRF9BTExdOiAnRmlsZXMuUmVhZC5BbGwnLFxuICAgICAgW01pY3Jvc29mdEdyYXBoUGVybWlzc2lvbi5GSUxFU19SRUFEX1dSSVRFX0FMTF06ICdGaWxlcy5SZWFkV3JpdGUuQWxsJyxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBbcGVybUd1aWQsIG5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHBlcm1pc3Npb25NYXApKSB7XG4gICAgICBpZiAocGVybUd1aWQudG9Mb3dlckNhc2UoKSA9PT0gbG93ZXJHdWlkKSB7XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXNvdXJjZVNlY3Rpb24ocmVzb3VyY2VUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChyZXNvdXJjZVR5cGUuaW5jbHVkZXMoJ01pY3Jvc29mdC5HcmFwaC9ncm91cHMnKSkgcmV0dXJuICdBenVyZSBBRCBHcm91cHMnO1xuICAgIGlmIChyZXNvdXJjZVR5cGUuaW5jbHVkZXMoJ01pY3Jvc29mdC5HcmFwaC9hcHBSb2xlQXNzaWduZWRUbycpKSByZXR1cm4gJ0dyb3VwIFJvbGUgQXNzaWdubWVudHMnO1xuICAgIGlmIChyZXNvdXJjZVR5cGUuaW5jbHVkZXMoJ01pY3Jvc29mdC5HcmFwaC9hcHBsaWNhdGlvbnMvZmVkZXJhdGVkSWRlbnRpdHlDcmVkZW50aWFscycpKSByZXR1cm4gJ0ZlZGVyYXRlZCBJZGVudGl0eSBDcmVkZW50aWFscyc7XG4gICAgaWYgKHJlc291cmNlVHlwZS5pbmNsdWRlcygnTWljcm9zb2Z0LkdyYXBoL2FwcGxpY2F0aW9ucycpKSByZXR1cm4gJ0F6dXJlIEFEIEFwcGxpY2F0aW9uJztcbiAgICBpZiAocmVzb3VyY2VUeXBlLmluY2x1ZGVzKCdNaWNyb3NvZnQuR3JhcGgvc2VydmljZVByaW5jaXBhbHMnKSkgcmV0dXJuICdTZXJ2aWNlIFByaW5jaXBhbCc7XG4gICAgaWYgKHJlc291cmNlVHlwZS5pbmNsdWRlcygnTWljcm9zb2Z0LkNvbXB1dGUnKSkgcmV0dXJuICdDb21wdXRlIFJlc291cmNlcyc7XG4gICAgaWYgKHJlc291cmNlVHlwZS5pbmNsdWRlcygnTWljcm9zb2Z0Lk5ldHdvcmsnKSkgcmV0dXJuICdOZXR3b3JrIFJlc291cmNlcyc7XG4gICAgaWYgKHJlc291cmNlVHlwZS5pbmNsdWRlcygnTWljcm9zb2Z0LlN0b3JhZ2UnKSkgcmV0dXJuICdTdG9yYWdlIFJlc291cmNlcyc7XG4gICAgcmV0dXJuICdSZXNvdXJjZXMnO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRTZWN0aW9uSGVhZGVyKHRpdGxlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYm9yZGVyID0gJy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSc7XG4gICAgY29uc3QgdG90YWxXaWR0aCA9IGJvcmRlci5sZW5ndGg7XG4gICAgY29uc3QgY29udGVudFdpZHRoID0gdG90YWxXaWR0aCAtIDU7XG4gICAgY29uc3QgcGFkZGluZyA9IGNvbnRlbnRXaWR0aCAtIHRpdGxlLmxlbmd0aDtcbiAgICBjb25zdCBsZWZ0UGFkID0gTWF0aC5mbG9vcihwYWRkaW5nIC8gMik7XG4gICAgY29uc3QgcmlnaHRQYWQgPSBwYWRkaW5nIC0gbGVmdFBhZDtcbiAgICBjb25zdCBjZW50ZXJlZFRpdGxlID0gYC8vID0keycgJy5yZXBlYXQobGVmdFBhZCl9JHt0aXRsZX0keycgJy5yZXBlYXQocmlnaHRQYWQpfT1gO1xuICAgIHJldHVybiBbYm9yZGVyLCBjZW50ZXJlZFRpdGxlLCBib3JkZXJdO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BicepTemplate, BicepExtension, BicepMetadata } from './template';
|
|
2
|
+
/**
|
|
3
|
+
* Fluent builder for creating Bicep templates with a CDK-idiomatic approach
|
|
4
|
+
*/
|
|
5
|
+
export declare class BicepTemplateBuilder {
|
|
6
|
+
private template;
|
|
7
|
+
private outputKeys;
|
|
8
|
+
withMetadata(metadata: BicepMetadata): this;
|
|
9
|
+
withExtensions(...extensions: BicepExtension[]): this;
|
|
10
|
+
withResources(buildFn: (template: BicepTemplate) => void): this;
|
|
11
|
+
withOutputs(outputs: Record<string, string>): this;
|
|
12
|
+
build(): {
|
|
13
|
+
template: BicepTemplate;
|
|
14
|
+
outputKeys: string[];
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BicepTemplateBuilder = void 0;
|
|
4
|
+
const template_1 = require("./template");
|
|
5
|
+
/**
|
|
6
|
+
* Fluent builder for creating Bicep templates with a CDK-idiomatic approach
|
|
7
|
+
*/
|
|
8
|
+
class BicepTemplateBuilder {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.template = new template_1.BicepTemplate();
|
|
11
|
+
this.outputKeys = [];
|
|
12
|
+
}
|
|
13
|
+
withMetadata(metadata) {
|
|
14
|
+
this.template.setMetadata(metadata);
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
withExtensions(...extensions) {
|
|
18
|
+
extensions.forEach(ext => this.template.addExtension(ext));
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
withResources(buildFn) {
|
|
22
|
+
buildFn(this.template);
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
withOutputs(outputs) {
|
|
26
|
+
this.outputKeys = Object.keys(outputs);
|
|
27
|
+
Object.entries(outputs).forEach(([name, value]) => this.template.addStringOutput(name, value));
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
build() {
|
|
31
|
+
return { template: this.template, outputKeys: this.outputKeys };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.BicepTemplateBuilder = BicepTemplateBuilder;
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpY2VwL2RlcGxveS90ZW1wbGF0ZUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQTBFO0FBRTFFOztHQUVHO0FBQ0gsTUFBYSxvQkFBb0I7SUFBakM7UUFDVSxhQUFRLEdBQUcsSUFBSSx3QkFBYSxFQUFFLENBQUM7UUFDL0IsZUFBVSxHQUFhLEVBQUUsQ0FBQztJQTRCcEMsQ0FBQztJQTFCQyxZQUFZLENBQUMsUUFBdUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsY0FBYyxDQUFDLEdBQUcsVUFBNEI7UUFDNUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQTBDO1FBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQStCO1FBQ3pDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUMzQyxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ2xFLENBQUM7Q0FDRjtBQTlCRCxvREE4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaWNlcFRlbXBsYXRlLCBCaWNlcEV4dGVuc2lvbiwgQmljZXBNZXRhZGF0YSB9IGZyb20gJy4vdGVtcGxhdGUnO1xuXG4vKipcbiAqIEZsdWVudCBidWlsZGVyIGZvciBjcmVhdGluZyBCaWNlcCB0ZW1wbGF0ZXMgd2l0aCBhIENESy1pZGlvbWF0aWMgYXBwcm9hY2hcbiAqL1xuZXhwb3J0IGNsYXNzIEJpY2VwVGVtcGxhdGVCdWlsZGVyIHtcbiAgcHJpdmF0ZSB0ZW1wbGF0ZSA9IG5ldyBCaWNlcFRlbXBsYXRlKCk7XG4gIHByaXZhdGUgb3V0cHV0S2V5czogc3RyaW5nW10gPSBbXTtcblxuICB3aXRoTWV0YWRhdGEobWV0YWRhdGE6IEJpY2VwTWV0YWRhdGEpOiB0aGlzIHtcbiAgICB0aGlzLnRlbXBsYXRlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdpdGhFeHRlbnNpb25zKC4uLmV4dGVuc2lvbnM6IEJpY2VwRXh0ZW5zaW9uW10pOiB0aGlzIHtcbiAgICBleHRlbnNpb25zLmZvckVhY2goZXh0ID0+IHRoaXMudGVtcGxhdGUuYWRkRXh0ZW5zaW9uKGV4dCkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2l0aFJlc291cmNlcyhidWlsZEZuOiAodGVtcGxhdGU6IEJpY2VwVGVtcGxhdGUpID0+IHZvaWQpOiB0aGlzIHtcbiAgICBidWlsZEZuKHRoaXMudGVtcGxhdGUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2l0aE91dHB1dHMob3V0cHV0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHRoaXMge1xuICAgIHRoaXMub3V0cHV0S2V5cyA9IE9iamVjdC5rZXlzKG91dHB1dHMpO1xuICAgIE9iamVjdC5lbnRyaWVzKG91dHB1dHMpLmZvckVhY2goKFtuYW1lLCB2YWx1ZV0pID0+XG4gICAgICB0aGlzLnRlbXBsYXRlLmFkZFN0cmluZ091dHB1dChuYW1lLCB2YWx1ZSksXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJ1aWxkKCk6IHsgdGVtcGxhdGU6IEJpY2VwVGVtcGxhdGU7IG91dHB1dEtleXM6IHN0cmluZ1tdIH0ge1xuICAgIHJldHVybiB7IHRlbXBsYXRlOiB0aGlzLnRlbXBsYXRlLCBvdXRwdXRLZXlzOiB0aGlzLm91dHB1dEtleXMgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.resources = exports.deploy = exports.patterns = void 0;
|
|
37
|
+
exports.patterns = __importStar(require("./patterns"));
|
|
38
|
+
exports.deploy = __importStar(require("./deploy"));
|
|
39
|
+
exports.resources = __importStar(require("./resources"));
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmljZXAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXVDO0FBQ3ZDLG1EQUFtQztBQUNuQyx5REFBeUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBwYXR0ZXJucyBmcm9tICcuL3BhdHRlcm5zJztcbmV4cG9ydCAqIGFzIGRlcGxveSBmcm9tICcuL2RlcGxveSc7XG5leHBvcnQgKiBhcyByZXNvdXJjZXMgZnJvbSAnLi9yZXNvdXJjZXMnO1xuIl19
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Construct } from 'constructs';
|
|
2
|
+
import * as bicep from '../deploy';
|
|
3
|
+
import * as graph from '../resources/graph';
|
|
4
|
+
/**
|
|
5
|
+
* Well-known OIDC audience values for common providers
|
|
6
|
+
*/
|
|
7
|
+
export declare enum OidcAudience {
|
|
8
|
+
/** AWS Security Token Service */
|
|
9
|
+
AWS_STS = "sts.amazonaws.com",
|
|
10
|
+
/** Azure AD Token Exchange for Workload Identity Federation */
|
|
11
|
+
AZURE_AD_TOKEN_EXCHANGE = "api://AzureADTokenExchange",
|
|
12
|
+
/** Microsoft Graph API */
|
|
13
|
+
MICROSOFT_GRAPH = "https://graph.microsoft.com",
|
|
14
|
+
/** Kubernetes default service account */
|
|
15
|
+
KUBERNETES = "https://kubernetes.default.svc"
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Configuration for external identity trusted to request tokens
|
|
19
|
+
*/
|
|
20
|
+
export interface TrustedTokenRequesterConfig {
|
|
21
|
+
/** OIDC issuer URL that Azure AD trusts */
|
|
22
|
+
readonly issuer: string;
|
|
23
|
+
/** Subject (sub) claim identifying the trusted workload */
|
|
24
|
+
readonly sub: string;
|
|
25
|
+
/** Audience (aud) values for token validation - use OidcAudience enum or custom strings */
|
|
26
|
+
readonly aud: string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Properties for Azure AD application with federated credentials.
|
|
30
|
+
*/
|
|
31
|
+
export interface AzureAdApplicationFederatedProps {
|
|
32
|
+
/** Name of the Azure AD application */
|
|
33
|
+
readonly appName: string;
|
|
34
|
+
/** Redirect URIs for OAuth callbacks */
|
|
35
|
+
readonly redirectUris: string[];
|
|
36
|
+
/** Supported account types for sign-in (defaults to single tenant) */
|
|
37
|
+
readonly signInAudience?: graph.SignInAudience;
|
|
38
|
+
/** Azure resource group name */
|
|
39
|
+
readonly resourceGroupName: string;
|
|
40
|
+
/** Azure AD groups to create */
|
|
41
|
+
readonly groups?: string[];
|
|
42
|
+
/** Azure federated credentials for deployment */
|
|
43
|
+
readonly deploymentCredentials: bicep.AzureFederatedCredentials;
|
|
44
|
+
/** External identity trusted to request tokens */
|
|
45
|
+
readonly trustedTokenRequester: TrustedTokenRequesterConfig;
|
|
46
|
+
/** Enable AWS session tag mapping via Custom Claims Provider (requires groups to be defined) */
|
|
47
|
+
readonly enableAwsSessionTagMapping?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export declare class AzureAdApplicationFederated extends Construct {
|
|
50
|
+
/** All deployment outputs */
|
|
51
|
+
readonly outputs: Record<string, string>;
|
|
52
|
+
/** Trusted token requester configuration */
|
|
53
|
+
readonly trustedTokenRequester: TrustedTokenRequesterConfig;
|
|
54
|
+
constructor(scope: Construct, id: string, props: AzureAdApplicationFederatedProps);
|
|
55
|
+
private buildResources;
|
|
56
|
+
private buildCustomClaimsProvider;
|
|
57
|
+
private sanitizeIdentifier;
|
|
58
|
+
}
|