@aws-cdk/cloudformation-diff 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/NOTICE +2 -0
- package/README.md +12 -0
- package/lib/diff/index.d.ts +9 -0
- package/lib/diff/index.js +92 -0
- package/lib/diff/maybe-parsed.d.ts +14 -0
- package/lib/diff/maybe-parsed.js +14 -0
- package/lib/diff/template-and-changeset-diff-merger.d.ts +33 -0
- package/lib/diff/template-and-changeset-diff-merger.js +128 -0
- package/lib/diff/types.d.ts +368 -0
- package/lib/diff/types.js +498 -0
- package/lib/diff/util.d.ts +57 -0
- package/lib/diff/util.js +199 -0
- package/lib/diff-template.d.ts +25 -0
- package/lib/diff-template.js +212 -0
- package/lib/diffable.d.ts +22 -0
- package/lib/diffable.js +47 -0
- package/lib/format-table.d.ts +6 -0
- package/lib/format-table.js +108 -0
- package/lib/format.d.ts +106 -0
- package/lib/format.js +436 -0
- package/lib/iam/iam-changes.d.ts +66 -0
- package/lib/iam/iam-changes.js +421 -0
- package/lib/iam/iam-identity-center.d.ts +78 -0
- package/lib/iam/iam-identity-center.js +46 -0
- package/lib/iam/managed-policy.d.ts +11 -0
- package/lib/iam/managed-policy.js +33 -0
- package/lib/iam/statement.d.ts +113 -0
- package/lib/iam/statement.js +270 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +24 -0
- package/lib/network/security-group-changes.d.ts +32 -0
- package/lib/network/security-group-changes.js +99 -0
- package/lib/network/security-group-rule.d.ts +50 -0
- package/lib/network/security-group-rule.js +97 -0
- package/lib/render-intrinsics.d.ts +21 -0
- package/lib/render-intrinsics.js +78 -0
- package/lib/util.d.ts +7 -0
- package/lib/util.js +62 -0
- package/package.json +80 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IamChanges = void 0;
|
|
4
|
+
const service_spec_types_1 = require("@aws-cdk/service-spec-types");
|
|
5
|
+
const chalk = require("chalk");
|
|
6
|
+
const iam_identity_center_1 = require("./iam-identity-center");
|
|
7
|
+
const managed_policy_1 = require("./managed-policy");
|
|
8
|
+
const statement_1 = require("./statement");
|
|
9
|
+
const diffable_1 = require("../diffable");
|
|
10
|
+
const render_intrinsics_1 = require("../render-intrinsics");
|
|
11
|
+
const util_1 = require("../util");
|
|
12
|
+
/**
|
|
13
|
+
* Changes to IAM statements and IAM identity center
|
|
14
|
+
*/
|
|
15
|
+
class IamChanges {
|
|
16
|
+
constructor(props) {
|
|
17
|
+
// each entry in a DiffableCollection is used to generate a single row of the security changes table that is presented for cdk diff and cdk deploy.
|
|
18
|
+
this.statements = new diffable_1.DiffableCollection();
|
|
19
|
+
this.managedPolicies = new diffable_1.DiffableCollection();
|
|
20
|
+
this.ssoPermissionSets = new diffable_1.DiffableCollection();
|
|
21
|
+
this.ssoAssignments = new diffable_1.DiffableCollection();
|
|
22
|
+
this.ssoInstanceACAConfigs = new diffable_1.DiffableCollection();
|
|
23
|
+
for (const propertyChange of props.propertyChanges) {
|
|
24
|
+
this.readPropertyChange(propertyChange);
|
|
25
|
+
}
|
|
26
|
+
for (const resourceChange of props.resourceChanges) {
|
|
27
|
+
this.readResourceChange(resourceChange);
|
|
28
|
+
}
|
|
29
|
+
this.statements.calculateDiff();
|
|
30
|
+
this.managedPolicies.calculateDiff();
|
|
31
|
+
this.ssoPermissionSets.calculateDiff();
|
|
32
|
+
this.ssoAssignments.calculateDiff();
|
|
33
|
+
this.ssoInstanceACAConfigs.calculateDiff();
|
|
34
|
+
}
|
|
35
|
+
get hasChanges() {
|
|
36
|
+
return (this.statements.hasChanges
|
|
37
|
+
|| this.managedPolicies.hasChanges
|
|
38
|
+
|| this.ssoPermissionSets.hasChanges
|
|
39
|
+
|| this.ssoAssignments.hasChanges
|
|
40
|
+
|| this.ssoInstanceACAConfigs.hasChanges);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Return whether the changes include broadened permissions
|
|
44
|
+
*
|
|
45
|
+
* Permissions are broadened if positive statements are added or
|
|
46
|
+
* negative statements are removed, or if managed policies are added.
|
|
47
|
+
*/
|
|
48
|
+
get permissionsBroadened() {
|
|
49
|
+
return this.statements.additions.some(s => !s.isNegativeStatement)
|
|
50
|
+
|| this.statements.removals.some(s => s.isNegativeStatement)
|
|
51
|
+
|| this.managedPolicies.hasAdditions
|
|
52
|
+
|| this.ssoPermissionSets.hasAdditions
|
|
53
|
+
|| this.ssoAssignments.hasAdditions
|
|
54
|
+
|| this.ssoInstanceACAConfigs.hasAdditions;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Return a summary table of changes
|
|
58
|
+
*/
|
|
59
|
+
summarizeStatements() {
|
|
60
|
+
const ret = [];
|
|
61
|
+
const header = ['', 'Resource', 'Effect', 'Action', 'Principal', 'Condition'];
|
|
62
|
+
// First generate all lines, then sort on Resource so that similar resources are together
|
|
63
|
+
for (const statement of this.statements.additions) {
|
|
64
|
+
const renderedStatement = statement.render();
|
|
65
|
+
ret.push([
|
|
66
|
+
'+',
|
|
67
|
+
renderedStatement.resource,
|
|
68
|
+
renderedStatement.effect,
|
|
69
|
+
renderedStatement.action,
|
|
70
|
+
renderedStatement.principal,
|
|
71
|
+
renderedStatement.condition,
|
|
72
|
+
].map(s => chalk.green(s)));
|
|
73
|
+
}
|
|
74
|
+
for (const statement of this.statements.removals) {
|
|
75
|
+
const renderedStatement = statement.render();
|
|
76
|
+
ret.push([
|
|
77
|
+
'-',
|
|
78
|
+
renderedStatement.resource,
|
|
79
|
+
renderedStatement.effect,
|
|
80
|
+
renderedStatement.action,
|
|
81
|
+
renderedStatement.principal,
|
|
82
|
+
renderedStatement.condition,
|
|
83
|
+
].map(s => chalk.red(s)));
|
|
84
|
+
}
|
|
85
|
+
// Sort by 2nd column
|
|
86
|
+
ret.sort((0, util_1.makeComparator)((row) => [row[1]]));
|
|
87
|
+
ret.splice(0, 0, header);
|
|
88
|
+
return ret;
|
|
89
|
+
}
|
|
90
|
+
summarizeManagedPolicies() {
|
|
91
|
+
const ret = [];
|
|
92
|
+
const header = ['', 'Resource', 'Managed Policy ARN'];
|
|
93
|
+
for (const att of this.managedPolicies.additions) {
|
|
94
|
+
ret.push([
|
|
95
|
+
'+',
|
|
96
|
+
att.identityArn,
|
|
97
|
+
att.managedPolicyArn,
|
|
98
|
+
].map(s => chalk.green(s)));
|
|
99
|
+
}
|
|
100
|
+
for (const att of this.managedPolicies.removals) {
|
|
101
|
+
ret.push([
|
|
102
|
+
'-',
|
|
103
|
+
att.identityArn,
|
|
104
|
+
att.managedPolicyArn,
|
|
105
|
+
].map(s => chalk.red(s)));
|
|
106
|
+
}
|
|
107
|
+
// Sort by 2nd column
|
|
108
|
+
ret.sort((0, util_1.makeComparator)((row) => [row[1]]));
|
|
109
|
+
ret.splice(0, 0, header);
|
|
110
|
+
return ret;
|
|
111
|
+
}
|
|
112
|
+
summarizeSsoAssignments() {
|
|
113
|
+
const ret = [];
|
|
114
|
+
const header = ['', 'Resource', 'InstanceArn', 'PermissionSetArn', 'PrincipalId', 'PrincipalType', 'TargetId', 'TargetType'];
|
|
115
|
+
for (const att of this.ssoAssignments.additions) {
|
|
116
|
+
ret.push([
|
|
117
|
+
'+',
|
|
118
|
+
att.cfnLogicalId || '',
|
|
119
|
+
att.ssoInstanceArn || '',
|
|
120
|
+
att.permissionSetArn || '',
|
|
121
|
+
att.principalId || '',
|
|
122
|
+
att.principalType || '',
|
|
123
|
+
att.targetId || '',
|
|
124
|
+
att.targetType || '',
|
|
125
|
+
].map(s => chalk.green(s)));
|
|
126
|
+
}
|
|
127
|
+
for (const att of this.ssoAssignments.removals) {
|
|
128
|
+
ret.push([
|
|
129
|
+
'-',
|
|
130
|
+
att.cfnLogicalId || '',
|
|
131
|
+
att.ssoInstanceArn || '',
|
|
132
|
+
att.permissionSetArn || '',
|
|
133
|
+
att.principalId || '',
|
|
134
|
+
att.principalType || '',
|
|
135
|
+
att.targetId || '',
|
|
136
|
+
att.targetType || '',
|
|
137
|
+
].map(s => chalk.red(s)));
|
|
138
|
+
}
|
|
139
|
+
// Sort by resource name to ensure a unique value is used for sorting
|
|
140
|
+
ret.sort((0, util_1.makeComparator)((row) => [row[1]]));
|
|
141
|
+
ret.splice(0, 0, header);
|
|
142
|
+
return ret;
|
|
143
|
+
}
|
|
144
|
+
summarizeSsoInstanceACAConfigs() {
|
|
145
|
+
var _a, _b;
|
|
146
|
+
const ret = [];
|
|
147
|
+
const header = ['', 'Resource', 'InstanceArn', 'AccessControlAttributes'];
|
|
148
|
+
function formatAccessControlAttribute(aca) {
|
|
149
|
+
var _a;
|
|
150
|
+
return `Key: ${aca === null || aca === void 0 ? void 0 : aca.Key}, Values: [${(_a = aca === null || aca === void 0 ? void 0 : aca.Value) === null || _a === void 0 ? void 0 : _a.Source.join(', ')}]`;
|
|
151
|
+
}
|
|
152
|
+
for (const att of this.ssoInstanceACAConfigs.additions) {
|
|
153
|
+
ret.push([
|
|
154
|
+
'+',
|
|
155
|
+
att.cfnLogicalId || '',
|
|
156
|
+
att.ssoInstanceArn || '',
|
|
157
|
+
((_a = att.accessControlAttributes) === null || _a === void 0 ? void 0 : _a.map(formatAccessControlAttribute).join('\n')) || '',
|
|
158
|
+
].map(s => chalk.green(s)));
|
|
159
|
+
}
|
|
160
|
+
for (const att of this.ssoInstanceACAConfigs.removals) {
|
|
161
|
+
ret.push([
|
|
162
|
+
'-',
|
|
163
|
+
att.cfnLogicalId || '',
|
|
164
|
+
att.ssoInstanceArn || '',
|
|
165
|
+
((_b = att.accessControlAttributes) === null || _b === void 0 ? void 0 : _b.map(formatAccessControlAttribute).join('\n')) || '',
|
|
166
|
+
].map(s => chalk.red(s)));
|
|
167
|
+
}
|
|
168
|
+
// Sort by resource name to ensure a unique value is used for sorting
|
|
169
|
+
ret.sort((0, util_1.makeComparator)((row) => [row[1]]));
|
|
170
|
+
ret.splice(0, 0, header);
|
|
171
|
+
return ret;
|
|
172
|
+
}
|
|
173
|
+
summarizeSsoPermissionSets() {
|
|
174
|
+
var _a, _b;
|
|
175
|
+
const ret = [];
|
|
176
|
+
const header = ['', 'Resource', 'InstanceArn', 'PermissionSet name', 'PermissionsBoundary', 'CustomerManagedPolicyReferences'];
|
|
177
|
+
function formatManagedPolicyRef(s) {
|
|
178
|
+
return `Name: ${(s === null || s === void 0 ? void 0 : s.Name) || ''}, Path: ${(s === null || s === void 0 ? void 0 : s.Path) || ''}`;
|
|
179
|
+
}
|
|
180
|
+
function formatSsoPermissionsBoundary(ssoPb) {
|
|
181
|
+
// ManagedPolicyArn OR CustomerManagedPolicyReference can be specified -- but not both.
|
|
182
|
+
if ((ssoPb === null || ssoPb === void 0 ? void 0 : ssoPb.ManagedPolicyArn) !== undefined) {
|
|
183
|
+
return `ManagedPolicyArn: ${(ssoPb === null || ssoPb === void 0 ? void 0 : ssoPb.ManagedPolicyArn) || ''}`;
|
|
184
|
+
}
|
|
185
|
+
else if ((ssoPb === null || ssoPb === void 0 ? void 0 : ssoPb.CustomerManagedPolicyReference) !== undefined) {
|
|
186
|
+
return `CustomerManagedPolicyReference: {\n ${formatManagedPolicyRef(ssoPb === null || ssoPb === void 0 ? void 0 : ssoPb.CustomerManagedPolicyReference)}\n}`;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
return '';
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
for (const att of this.ssoPermissionSets.additions) {
|
|
193
|
+
ret.push([
|
|
194
|
+
'+',
|
|
195
|
+
att.cfnLogicalId || '',
|
|
196
|
+
att.ssoInstanceArn || '',
|
|
197
|
+
att.name || '',
|
|
198
|
+
formatSsoPermissionsBoundary(att.ssoPermissionsBoundary),
|
|
199
|
+
((_a = att.ssoCustomerManagedPolicyReferences) === null || _a === void 0 ? void 0 : _a.map(formatManagedPolicyRef).join('\n')) || '',
|
|
200
|
+
].map(s => chalk.green(s)));
|
|
201
|
+
}
|
|
202
|
+
for (const att of this.ssoPermissionSets.removals) {
|
|
203
|
+
ret.push([
|
|
204
|
+
'-',
|
|
205
|
+
att.cfnLogicalId || '',
|
|
206
|
+
att.ssoInstanceArn || '',
|
|
207
|
+
att.name || '',
|
|
208
|
+
formatSsoPermissionsBoundary(att.ssoPermissionsBoundary),
|
|
209
|
+
((_b = att.ssoCustomerManagedPolicyReferences) === null || _b === void 0 ? void 0 : _b.map(formatManagedPolicyRef).join('\n')) || '',
|
|
210
|
+
].map(s => chalk.red(s)));
|
|
211
|
+
}
|
|
212
|
+
// Sort by resource name to ensure a unique value is used for sorting
|
|
213
|
+
ret.sort((0, util_1.makeComparator)((row) => [row[1]]));
|
|
214
|
+
ret.splice(0, 0, header);
|
|
215
|
+
return ret;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Return a machine-readable version of the changes.
|
|
219
|
+
* This is only used in tests.
|
|
220
|
+
*
|
|
221
|
+
* @internal
|
|
222
|
+
*/
|
|
223
|
+
_toJson() {
|
|
224
|
+
return (0, util_1.deepRemoveUndefined)({
|
|
225
|
+
statementAdditions: (0, util_1.dropIfEmpty)(this.statements.additions.map(s => s._toJson())),
|
|
226
|
+
statementRemovals: (0, util_1.dropIfEmpty)(this.statements.removals.map(s => s._toJson())),
|
|
227
|
+
managedPolicyAdditions: (0, util_1.dropIfEmpty)(this.managedPolicies.additions.map(s => s._toJson())),
|
|
228
|
+
managedPolicyRemovals: (0, util_1.dropIfEmpty)(this.managedPolicies.removals.map(s => s._toJson())),
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
readPropertyChange(propertyChange) {
|
|
232
|
+
switch (propertyChange.scrutinyType) {
|
|
233
|
+
case service_spec_types_1.PropertyScrutinyType.InlineIdentityPolicies:
|
|
234
|
+
// AWS::IAM::{ Role | User | Group }.Policies
|
|
235
|
+
this.statements.addOld(...this.readIdentityPolicies(propertyChange.oldValue, propertyChange.resourceLogicalId));
|
|
236
|
+
this.statements.addNew(...this.readIdentityPolicies(propertyChange.newValue, propertyChange.resourceLogicalId));
|
|
237
|
+
break;
|
|
238
|
+
case service_spec_types_1.PropertyScrutinyType.InlineResourcePolicy:
|
|
239
|
+
// Any PolicyDocument on a resource (including AssumeRolePolicyDocument)
|
|
240
|
+
this.statements.addOld(...this.readResourceStatements(propertyChange.oldValue, propertyChange.resourceLogicalId));
|
|
241
|
+
this.statements.addNew(...this.readResourceStatements(propertyChange.newValue, propertyChange.resourceLogicalId));
|
|
242
|
+
break;
|
|
243
|
+
case service_spec_types_1.PropertyScrutinyType.ManagedPolicies:
|
|
244
|
+
// Just a list of managed policies
|
|
245
|
+
this.managedPolicies.addOld(...this.readManagedPolicies(propertyChange.oldValue, propertyChange.resourceLogicalId));
|
|
246
|
+
this.managedPolicies.addNew(...this.readManagedPolicies(propertyChange.newValue, propertyChange.resourceLogicalId));
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
readResourceChange(resourceChange) {
|
|
251
|
+
switch (resourceChange.scrutinyType) {
|
|
252
|
+
case service_spec_types_1.ResourceScrutinyType.IdentityPolicyResource:
|
|
253
|
+
// AWS::IAM::Policy
|
|
254
|
+
this.statements.addOld(...this.readIdentityPolicyResource(resourceChange.oldProperties));
|
|
255
|
+
this.statements.addNew(...this.readIdentityPolicyResource(resourceChange.newProperties));
|
|
256
|
+
break;
|
|
257
|
+
case service_spec_types_1.ResourceScrutinyType.ResourcePolicyResource:
|
|
258
|
+
// AWS::*::{Bucket,Queue,Topic}Policy
|
|
259
|
+
this.statements.addOld(...this.readResourcePolicyResource(resourceChange.oldProperties));
|
|
260
|
+
this.statements.addNew(...this.readResourcePolicyResource(resourceChange.newProperties));
|
|
261
|
+
break;
|
|
262
|
+
case service_spec_types_1.ResourceScrutinyType.LambdaPermission:
|
|
263
|
+
this.statements.addOld(...this.readLambdaStatements(resourceChange.oldProperties));
|
|
264
|
+
this.statements.addNew(...this.readLambdaStatements(resourceChange.newProperties));
|
|
265
|
+
break;
|
|
266
|
+
case service_spec_types_1.ResourceScrutinyType.SsoPermissionSet:
|
|
267
|
+
this.ssoPermissionSets.addOld(...this.readSsoPermissionSet(resourceChange.oldProperties, resourceChange.resourceLogicalId));
|
|
268
|
+
this.ssoPermissionSets.addNew(...this.readSsoPermissionSet(resourceChange.newProperties, resourceChange.resourceLogicalId));
|
|
269
|
+
break;
|
|
270
|
+
case service_spec_types_1.ResourceScrutinyType.SsoAssignmentResource:
|
|
271
|
+
this.ssoAssignments.addOld(...this.readSsoAssignments(resourceChange.oldProperties, resourceChange.resourceLogicalId));
|
|
272
|
+
this.ssoAssignments.addNew(...this.readSsoAssignments(resourceChange.newProperties, resourceChange.resourceLogicalId));
|
|
273
|
+
break;
|
|
274
|
+
case service_spec_types_1.ResourceScrutinyType.SsoInstanceACAConfigResource:
|
|
275
|
+
this.ssoInstanceACAConfigs.addOld(...this.readSsoInstanceACAConfigs(resourceChange.oldProperties, resourceChange.resourceLogicalId));
|
|
276
|
+
this.ssoInstanceACAConfigs.addNew(...this.readSsoInstanceACAConfigs(resourceChange.newProperties, resourceChange.resourceLogicalId));
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Parse a list of policies on an identity
|
|
282
|
+
*/
|
|
283
|
+
readIdentityPolicies(policies, logicalId) {
|
|
284
|
+
if (policies === undefined || !Array.isArray(policies)) {
|
|
285
|
+
return [];
|
|
286
|
+
}
|
|
287
|
+
const appliesToPrincipal = 'AWS:${' + logicalId + '}';
|
|
288
|
+
return (0, util_1.flatMap)(policies, (policy) => {
|
|
289
|
+
var _a;
|
|
290
|
+
// check if the Policy itself is not an intrinsic, like an Fn::If
|
|
291
|
+
const unparsedStatement = ((_a = policy.PolicyDocument) === null || _a === void 0 ? void 0 : _a.Statement)
|
|
292
|
+
? policy.PolicyDocument.Statement
|
|
293
|
+
: policy;
|
|
294
|
+
return defaultPrincipal(appliesToPrincipal, (0, statement_1.parseStatements)((0, render_intrinsics_1.renderIntrinsics)(unparsedStatement)));
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Parse an IAM::Policy resource
|
|
299
|
+
*/
|
|
300
|
+
readIdentityPolicyResource(properties) {
|
|
301
|
+
if (properties === undefined) {
|
|
302
|
+
return [];
|
|
303
|
+
}
|
|
304
|
+
properties = (0, render_intrinsics_1.renderIntrinsics)(properties);
|
|
305
|
+
const principals = (properties.Groups || []).concat(properties.Users || []).concat(properties.Roles || []);
|
|
306
|
+
return (0, util_1.flatMap)(principals, (principal) => {
|
|
307
|
+
const ref = 'AWS:' + principal;
|
|
308
|
+
return defaultPrincipal(ref, (0, statement_1.parseStatements)(properties.PolicyDocument.Statement));
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
readSsoInstanceACAConfigs(properties, logicalId) {
|
|
312
|
+
if (properties === undefined) {
|
|
313
|
+
return [];
|
|
314
|
+
}
|
|
315
|
+
properties = (0, render_intrinsics_1.renderIntrinsics)(properties);
|
|
316
|
+
return [new iam_identity_center_1.SsoInstanceACAConfig({
|
|
317
|
+
cfnLogicalId: '${' + logicalId + '}',
|
|
318
|
+
ssoInstanceArn: properties.InstanceArn,
|
|
319
|
+
accessControlAttributes: properties.AccessControlAttributes,
|
|
320
|
+
})];
|
|
321
|
+
}
|
|
322
|
+
readSsoAssignments(properties, logicalId) {
|
|
323
|
+
if (properties === undefined) {
|
|
324
|
+
return [];
|
|
325
|
+
}
|
|
326
|
+
properties = (0, render_intrinsics_1.renderIntrinsics)(properties);
|
|
327
|
+
return [new iam_identity_center_1.SsoAssignment({
|
|
328
|
+
cfnLogicalId: '${' + logicalId + '}',
|
|
329
|
+
ssoInstanceArn: properties.InstanceArn,
|
|
330
|
+
permissionSetArn: properties.PermissionSetArn,
|
|
331
|
+
principalId: properties.PrincipalId,
|
|
332
|
+
principalType: properties.PrincipalType,
|
|
333
|
+
targetId: properties.TargetId,
|
|
334
|
+
targetType: properties.TargetType,
|
|
335
|
+
})];
|
|
336
|
+
}
|
|
337
|
+
readSsoPermissionSet(properties, logicalId) {
|
|
338
|
+
if (properties === undefined) {
|
|
339
|
+
return [];
|
|
340
|
+
}
|
|
341
|
+
properties = (0, render_intrinsics_1.renderIntrinsics)(properties);
|
|
342
|
+
return [new iam_identity_center_1.SsoPermissionSet({
|
|
343
|
+
cfnLogicalId: '${' + logicalId + '}',
|
|
344
|
+
name: properties.Name,
|
|
345
|
+
ssoInstanceArn: properties.InstanceArn,
|
|
346
|
+
ssoCustomerManagedPolicyReferences: properties.CustomerManagedPolicyReferences,
|
|
347
|
+
ssoPermissionsBoundary: properties.PermissionsBoundary,
|
|
348
|
+
})];
|
|
349
|
+
}
|
|
350
|
+
readResourceStatements(policy, logicalId) {
|
|
351
|
+
if (policy === undefined) {
|
|
352
|
+
return [];
|
|
353
|
+
}
|
|
354
|
+
const appliesToResource = '${' + logicalId + '.Arn}';
|
|
355
|
+
return defaultResource(appliesToResource, (0, statement_1.parseStatements)((0, render_intrinsics_1.renderIntrinsics)(policy.Statement)));
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Parse an AWS::*::{Bucket,Topic,Queue}policy
|
|
359
|
+
*/
|
|
360
|
+
readResourcePolicyResource(properties) {
|
|
361
|
+
if (properties === undefined) {
|
|
362
|
+
return [];
|
|
363
|
+
}
|
|
364
|
+
properties = (0, render_intrinsics_1.renderIntrinsics)(properties);
|
|
365
|
+
const policyKeys = Object.keys(properties).filter(key => key.indexOf('Policy') > -1);
|
|
366
|
+
// Find the key that identifies the resource(s) this policy applies to
|
|
367
|
+
const resourceKeys = Object.keys(properties).filter(key => !policyKeys.includes(key) && !key.endsWith('Name'));
|
|
368
|
+
let resources = resourceKeys.length === 1 ? properties[resourceKeys[0]] : ['???'];
|
|
369
|
+
// For some resources, this is a singleton string, for some it's an array
|
|
370
|
+
if (!Array.isArray(resources)) {
|
|
371
|
+
resources = [resources];
|
|
372
|
+
}
|
|
373
|
+
return (0, util_1.flatMap)(resources, (resource) => {
|
|
374
|
+
return defaultResource(resource, (0, statement_1.parseStatements)(properties[policyKeys[0]].Statement));
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
readManagedPolicies(policyArns, logicalId) {
|
|
378
|
+
if (!policyArns) {
|
|
379
|
+
return [];
|
|
380
|
+
}
|
|
381
|
+
const rep = '${' + logicalId + '}';
|
|
382
|
+
return managed_policy_1.ManagedPolicyAttachment.parseManagedPolicies(rep, (0, render_intrinsics_1.renderIntrinsics)(policyArns));
|
|
383
|
+
}
|
|
384
|
+
readLambdaStatements(properties) {
|
|
385
|
+
if (!properties) {
|
|
386
|
+
return [];
|
|
387
|
+
}
|
|
388
|
+
return [(0, statement_1.parseLambdaPermission)((0, render_intrinsics_1.renderIntrinsics)(properties))];
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
exports.IamChanges = IamChanges;
|
|
392
|
+
IamChanges.IamPropertyScrutinies = [
|
|
393
|
+
service_spec_types_1.PropertyScrutinyType.InlineIdentityPolicies,
|
|
394
|
+
service_spec_types_1.PropertyScrutinyType.InlineResourcePolicy,
|
|
395
|
+
service_spec_types_1.PropertyScrutinyType.ManagedPolicies,
|
|
396
|
+
];
|
|
397
|
+
IamChanges.IamResourceScrutinies = [
|
|
398
|
+
service_spec_types_1.ResourceScrutinyType.ResourcePolicyResource,
|
|
399
|
+
service_spec_types_1.ResourceScrutinyType.IdentityPolicyResource,
|
|
400
|
+
service_spec_types_1.ResourceScrutinyType.LambdaPermission,
|
|
401
|
+
service_spec_types_1.ResourceScrutinyType.SsoAssignmentResource,
|
|
402
|
+
service_spec_types_1.ResourceScrutinyType.SsoInstanceACAConfigResource,
|
|
403
|
+
service_spec_types_1.ResourceScrutinyType.SsoPermissionSet,
|
|
404
|
+
];
|
|
405
|
+
/**
|
|
406
|
+
* Set an undefined or wildcarded principal on these statements
|
|
407
|
+
*/
|
|
408
|
+
function defaultPrincipal(principal, statements) {
|
|
409
|
+
statements.forEach(s => s.principals.replaceEmpty(principal));
|
|
410
|
+
statements.forEach(s => s.principals.replaceStar(principal));
|
|
411
|
+
return statements;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Set an undefined or wildcarded resource on these statements
|
|
415
|
+
*/
|
|
416
|
+
function defaultResource(resource, statements) {
|
|
417
|
+
statements.forEach(s => s.resources.replaceEmpty(resource));
|
|
418
|
+
statements.forEach(s => s.resources.replaceStar(resource));
|
|
419
|
+
return statements;
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWNoYW5nZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpYW0tY2hhbmdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvRUFBeUY7QUFDekYsK0JBQStCO0FBQy9CLCtEQUF3STtBQUN4SSxxREFBOEU7QUFDOUUsMkNBQStGO0FBRy9GLDBDQUFpRDtBQUNqRCw0REFBd0Q7QUFDeEQsa0NBQW9GO0FBT3BGOztHQUVHO0FBQ0gsTUFBYSxVQUFVO0lBdUJyQixZQUFZLEtBQXNCO1FBUGxDLG1KQUFtSjtRQUNuSSxlQUFVLEdBQUcsSUFBSSw2QkFBa0IsRUFBYSxDQUFDO1FBQ2pELG9CQUFlLEdBQUcsSUFBSSw2QkFBa0IsRUFBMkIsQ0FBQztRQUNwRSxzQkFBaUIsR0FBRyxJQUFJLDZCQUFrQixFQUFvQixDQUFDO1FBQy9ELG1CQUFjLEdBQUcsSUFBSSw2QkFBa0IsRUFBaUIsQ0FBQztRQUN6RCwwQkFBcUIsR0FBRyxJQUFJLDZCQUFrQixFQUF3QixDQUFDO1FBR3JGLEtBQUssTUFBTSxjQUFjLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsS0FBSyxNQUFNLGNBQWMsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFF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UyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm9wZXJ0eVNjcnV0aW55VHlwZSwgUmVzb3VyY2VTY3J1dGlueVR5cGUgfSBmcm9tICdAYXdzLWNkay9zZXJ2aWNlLXNwZWMtdHlwZXMnO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgSVNzb0luc3RhbmNlQUNBQ29uZmlnLCBJU3NvUGVybWlzc2lvblNldCwgU3NvQXNzaWdubWVudCwgU3NvSW5zdGFuY2VBQ0FDb25maWcsIFNzb1Blcm1pc3Npb25TZXQgfSBmcm9tICcuL2lhbS1pZGVudGl0eS1jZW50ZXInO1xuaW1wb3J0IHsgTWFuYWdlZFBvbGljeUF0dGFjaG1lbnQsIE1hbmFnZWRQb2xpY3lKc29uIH0gZnJvbSAnLi9tYW5hZ2VkLXBvbGljeSc7XG5pbXBvcnQgeyBwYXJzZUxhbWJkYVBlcm1pc3Npb24sIHBhcnNlU3RhdGVtZW50cywgU3RhdGVtZW50LCBTdGF0ZW1lbnRKc29uIH0gZnJvbSAnLi9zdGF0ZW1lbnQnO1xuaW1wb3J0IHsgTWF5YmVQYXJzZWQgfSBmcm9tICcuLi9kaWZmL21heWJlLXBhcnNlZCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUNoYW5nZSwgUHJvcGVydHlNYXAsIFJlc291cmNlQ2hhbmdlIH0gZnJvbSAnLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBEaWZmYWJsZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9kaWZmYWJsZSc7XG5pbXBvcnQgeyByZW5kZXJJbnRyaW5zaWNzIH0gZnJvbSAnLi4vcmVuZGVyLWludHJpbnNpY3MnO1xuaW1wb3J0IHsgZGVlcFJlbW92ZVVuZGVmaW5lZCwgZHJvcElmRW1wdHksIGZsYXRNYXAsIG1ha2VDb21wYXJhdG9yIH0gZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWFtQ2hhbmdlc1Byb3BzIHtcbiAgcHJvcGVydHlDaGFuZ2VzOiBQcm9wZXJ0eUNoYW5nZVtdO1xuICByZXNvdXJjZUNoYW5nZXM6IFJlc291cmNlQ2hhbmdlW107XG59XG5cbi8qKlxuICogQ2hhbmdlcyB0byBJQU0gc3RhdGVtZW50cyBhbmQgSUFNIGlkZW50aXR5IGNlbnRlclxuICovXG5leHBvcnQgY2xhc3MgSWFtQ2hhbmdlcyB7XG4gIHB1YmxpYyBzdGF0aWMgSWFtUHJvcGVydHlTY3J1dGluaWVzID0gW1xuICAgIFByb3BlcnR5U2NydXRpbnlUeXBlLklubGluZUlkZW50aXR5UG9saWNpZXMsXG4gICAgUHJvcGVydHlTY3J1dGlueVR5cGUuSW5saW5lUmVzb3VyY2VQb2xpY3ksXG4gICAgUHJvcGVydHlTY3J1dGlueVR5cGUuTWFuYWdlZFBvbGljaWVzLFxuICBdO1xuXG4gIHB1YmxpYyBzdGF0aWMgSWFtUmVzb3VyY2VTY3J1dGluaWVzID0gW1xuICAgIFJlc291cmNlU2NydXRpbnlUeXBlLlJlc291cmNlUG9saWN5UmVzb3VyY2UsXG4gICAgUmVzb3VyY2VTY3J1dGlueVR5cGUuSWRlbnRpdHlQb2xpY3lSZXNvdXJjZSxcbiAgICBSZXNvdXJjZVNjcnV0aW55VHlwZS5MYW1iZGFQZXJtaXNzaW9uLFxuICAgIFJlc291cmNlU2NydXRpbnlUeXBlLlNzb0Fzc2lnbm1lbnRSZXNvdXJjZSxcbiAgICBSZXNvdXJjZVNjcnV0aW55VHlwZS5Tc29JbnN0YW5jZUFDQUNvbmZpZ1Jlc291cmNlLFxuICAgIFJlc291cmNlU2NydXRpbnlUeXBlLlNzb1Blcm1pc3Npb25TZXQsXG4gIF07XG5cbiAgLy8gZWFjaCBlbnRyeSBpbiBhIERpZmZhYmxlQ29sbGVjdGlvbiBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgc2luZ2xlIHJvdyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlcyB0YWJsZSB0aGF0IGlzIHByZXNlbnRlZCBmb3IgY2RrIGRpZmYgYW5kIGNkayBkZXBsb3kuXG4gIHB1YmxpYyByZWFkb25seSBzdGF0ZW1lbnRzID0gbmV3IERpZmZhYmxlQ29sbGVjdGlvbjxTdGF0ZW1lbnQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBtYW5hZ2VkUG9saWNpZXMgPSBuZXcgRGlmZmFibGVDb2xsZWN0aW9uPE1hbmFnZWRQb2xpY3lBdHRhY2htZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgc3NvUGVybWlzc2lvblNldHMgPSBuZXcgRGlmZmFibGVDb2xsZWN0aW9uPFNzb1Blcm1pc3Npb25TZXQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBzc29Bc3NpZ25tZW50cyA9IG5ldyBEaWZmYWJsZUNvbGxlY3Rpb248U3NvQXNzaWdubWVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IHNzb0luc3RhbmNlQUNBQ29uZmlncyA9IG5ldyBEaWZmYWJsZUNvbGxlY3Rpb248U3NvSW5zdGFuY2VBQ0FDb25maWc+KCk7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IElhbUNoYW5nZXNQcm9wcykge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlDaGFuZ2Ugb2YgcHJvcHMucHJvcGVydHlDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUNoYW5nZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VDaGFuZ2Ugb2YgcHJvcHMucmVzb3VyY2VDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRSZXNvdXJjZUNoYW5nZShyZXNvdXJjZUNoYW5nZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZW1lbnRzLmNhbGN1bGF0ZURpZmYoKTtcbiAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5jYWxjdWxhdGVEaWZmKCk7XG4gICAgdGhpcy5zc29QZXJtaXNzaW9uU2V0cy5jYWxjdWxhdGVEaWZmKCk7XG4gICAgdGhpcy5zc29Bc3NpZ25tZW50cy5jYWxjdWxhdGVEaWZmKCk7XG4gICAgdGhpcy5zc29JbnN0YW5jZUFDQUNvbmZpZ3MuY2FsY3VsYXRlRGlmZigpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNDaGFuZ2VzKCkge1xuICAgIHJldHVybiAodGhpcy5zdGF0ZW1lbnRzLmhhc0NoYW5nZXNcbiAgICAgIHx8IHRoaXMubWFuYWdlZFBvbGljaWVzLmhhc0NoYW5nZXNcbiAgICAgIHx8IHRoaXMuc3NvUGVybWlzc2lvblNldHMuaGFzQ2hhbmdlc1xuICAgICAgfHwgdGhpcy5zc29Bc3NpZ25tZW50cy5oYXNDaGFuZ2VzXG4gICAgICB8fCB0aGlzLnNzb0luc3RhbmNlQUNBQ29uZmlncy5oYXNDaGFuZ2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgY2hhbmdlcyBpbmNsdWRlIGJyb2FkZW5lZCBwZXJtaXNzaW9uc1xuICAgKlxuICAgKiBQZXJtaXNzaW9ucyBhcmUgYnJvYWRlbmVkIGlmIHBvc2l0aXZlIHN0YXRlbWVudHMgYXJlIGFkZGVkIG9yXG4gICAqIG5lZ2F0aXZlIHN0YXRlbWVudHMgYXJlIHJlbW92ZWQsIG9yIGlmIG1hbmFnZWQgcG9saWNpZXMgYXJlIGFkZGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBwZXJtaXNzaW9uc0Jyb2FkZW5lZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnRzLmFkZGl0aW9ucy5zb21lKHMgPT4gIXMuaXNOZWdhdGl2ZVN0YXRlbWVudClcbiAgICAgICAgfHwgdGhpcy5zdGF0ZW1lbnRzLnJlbW92YWxzLnNvbWUocyA9PiBzLmlzTmVnYXRpdmVTdGF0ZW1lbnQpXG4gICAgICAgIHx8IHRoaXMubWFuYWdlZFBvbGljaWVzLmhhc0FkZGl0aW9uc1xuICAgICAgICB8fCB0aGlzLnNzb1Blcm1pc3Npb25TZXRzLmhhc0FkZGl0aW9uc1xuICAgICAgICB8fCB0aGlzLnNzb0Fzc2lnbm1lbnRzLmhhc0FkZGl0aW9uc1xuICAgICAgICB8fCB0aGlzLnNzb0luc3RhbmNlQUNBQ29uZmlncy5oYXNBZGRpdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3VtbWFyeSB0YWJsZSBvZiBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgc3VtbWFyaXplU3RhdGVtZW50cygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcblxuICAgIGNvbnN0IGhlYWRlciA9IFsnJywgJ1Jlc291cmNlJywgJ0VmZmVjdCcsICdBY3Rpb24nLCAnUHJpbmNpcGFsJywgJ0NvbmRpdGlvbiddO1xuXG4gICAgLy8gRmlyc3QgZ2VuZXJhdGUgYWxsIGxpbmVzLCB0aGVuIHNvcnQgb24gUmVzb3VyY2Ugc28gdGhhdCBzaW1pbGFyIHJlc291cmNlcyBhcmUgdG9nZXRoZXJcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMuYWRkaXRpb25zKSB7XG4gICAgICBjb25zdCByZW5kZXJlZFN0YXRlbWVudCA9IHN0YXRlbWVudC5yZW5kZXIoKTtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJysnLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5yZXNvdXJjZSxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuZWZmZWN0LFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5hY3Rpb24sXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LnByaW5jaXBhbCxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuY29uZGl0aW9uLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMucmVtb3ZhbHMpIHtcbiAgICAgIGNvbnN0IHJlbmRlcmVkU3RhdGVtZW50ID0gc3RhdGVtZW50LnJlbmRlcigpO1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICAnLScsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LnJlc291cmNlLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5lZmZlY3QsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LmFjdGlvbixcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQucHJpbmNpcGFsLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5jb25kaXRpb24sXG4gICAgICBdLm1hcChzID0+IGNoYWxrLnJlZChzKSkpO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYnkgMm5kIGNvbHVtblxuICAgIHJldC5zb3J0KG1ha2VDb21wYXJhdG9yKChyb3c6IHN0cmluZ1tdKSA9PiBbcm93WzFdXSkpO1xuXG4gICAgcmV0LnNwbGljZSgwLCAwLCBoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBzdW1tYXJpemVNYW5hZ2VkUG9saWNpZXMoKTogc3RyaW5nW11bXSB7XG4gICAgY29uc3QgcmV0OiBzdHJpbmdbXVtdID0gW107XG4gICAgY29uc3QgaGVhZGVyID0gWycnLCAnUmVzb3VyY2UnLCAnTWFuYWdlZCBQb2xpY3kgQVJOJ107XG5cbiAgICBmb3IgKGNvbnN0IGF0dCBvZiB0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGRpdGlvbnMpIHtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJysnLFxuICAgICAgICBhdHQuaWRlbnRpdHlBcm4sXG4gICAgICAgIGF0dC5tYW5hZ2VkUG9saWN5QXJuLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGF0dCBvZiB0aGlzLm1hbmFnZWRQb2xpY2llcy5yZW1vdmFscykge1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICAnLScsXG4gICAgICAgIGF0dC5pZGVudGl0eUFybixcbiAgICAgICAgYXR0Lm1hbmFnZWRQb2xpY3lBcm4sXG4gICAgICBdLm1hcChzID0+IGNoYWxrLnJlZChzKSkpO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYnkgMm5kIGNvbHVtblxuICAgIHJldC5zb3J0KG1ha2VDb21wYXJhdG9yKChyb3c6IHN0cmluZ1tdKSA9PiBbcm93WzFdXSkpO1xuXG4gICAgcmV0LnNwbGljZSgwLCAwLCBoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBzdW1tYXJpemVTc29Bc3NpZ25tZW50cygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcbiAgICBjb25zdCBoZWFkZXIgPSBbJycsICdSZXNvdXJjZScsICdJbnN0YW5jZUFybicsICdQZXJtaXNzaW9uU2V0QXJuJywgJ1ByaW5jaXBhbElkJywgJ1ByaW5jaXBhbFR5cGUnLCAnVGFyZ2V0SWQnLCAnVGFyZ2V0VHlwZSddO1xuXG4gICAgZm9yIChjb25zdCBhdHQgb2YgdGhpcy5zc29Bc3NpZ25tZW50cy5hZGRpdGlvbnMpIHtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJysnLFxuICAgICAgICBhdHQuY2ZuTG9naWNhbElkIHx8ICcnLFxuICAgICAgICBhdHQuc3NvSW5zdGFuY2VBcm4gfHwgJycsXG4gICAgICAgIGF0dC5wZXJtaXNzaW9uU2V0QXJuIHx8ICcnLFxuICAgICAgICBhdHQucHJpbmNpcGFsSWQgfHwgJycsXG4gICAgICAgIGF0dC5wcmluY2lwYWxUeXBlIHx8ICcnLFxuICAgICAgICBhdHQudGFyZ2V0SWQgfHwgJycsXG4gICAgICAgIGF0dC50YXJnZXRUeXBlIHx8ICcnLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGF0dCBvZiB0aGlzLnNzb0Fzc2lnbm1lbnRzLnJlbW92YWxzKSB7XG4gICAgICByZXQucHVzaChbXG4gICAgICAgICctJyxcbiAgICAgICAgYXR0LmNmbkxvZ2ljYWxJZCB8fCAnJyxcbiAgICAgICAgYXR0LnNzb0luc3RhbmNlQXJuIHx8ICcnLFxuICAgICAgICBhdHQucGVybWlzc2lvblNldEFybiB8fCAnJyxcbiAgICAgICAgYXR0LnByaW5jaXBhbElkIHx8ICcnLFxuICAgICAgICBhdHQucHJpbmNpcGFsVHlwZSB8fCAnJyxcbiAgICAgICAgYXR0LnRhcmdldElkIHx8ICcnLFxuICAgICAgICBhdHQudGFyZ2V0VHlwZSB8fCAnJyxcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsucmVkKHMpKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSByZXNvdXJjZSBuYW1lIHRvIGVuc3VyZSBhIHVuaXF1ZSB2YWx1ZSBpcyB1c2VkIGZvciBzb3J0aW5nXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV1dKSk7XG4gICAgcmV0LnNwbGljZSgwLCAwLCBoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBzdW1tYXJpemVTc29JbnN0YW5jZUFDQUNvbmZpZ3MoKTogc3RyaW5nW11bXSB7XG4gICAgY29uc3QgcmV0OiBzdHJpbmdbXVtdID0gW107XG4gICAgY29uc3QgaGVhZGVyID0gWycnLCAnUmVzb3VyY2UnLCAnSW5zdGFuY2VBcm4nLCAnQWNjZXNzQ29udHJvbEF0dHJpYnV0ZXMnXTtcblxuICAgIGZ1bmN0aW9uIGZvcm1hdEFjY2Vzc0NvbnRyb2xBdHRyaWJ1dGUoYWNhOiBJU3NvSW5zdGFuY2VBQ0FDb25maWcuQWNjZXNzQ29udHJvbEF0dHJpYnV0ZSk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gYEtleTogJHthY2E/LktleX0sIFZhbHVlczogWyR7YWNhPy5WYWx1ZT8uU291cmNlLmpvaW4oJywgJyl9XWA7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdHQgb2YgdGhpcy5zc29JbnN0YW5jZUFDQUNvbmZpZ3MuYWRkaXRpb25zKSB7XG4gICAgICByZXQucHVzaChbXG4gICAgICAgICcrJyxcbiAgICAgICAgYXR0LmNmbkxvZ2ljYWxJZCB8fCAnJyxcbiAgICAgICAgYXR0LnNzb0luc3RhbmNlQXJuIHx8ICcnLFxuICAgICAgICBhdHQuYWNjZXNzQ29udHJvbEF0dHJpYnV0ZXM/Lm1hcChmb3JtYXRBY2Nlc3NDb250cm9sQXR0cmlidXRlKS5qb2luKCdcXG4nKSB8fCAnJyxcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsuZ3JlZW4ocykpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBhdHQgb2YgdGhpcy5zc29JbnN0YW5jZUFDQUNvbmZpZ3MucmVtb3ZhbHMpIHtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJy0nLFxuICAgICAgICBhdHQuY2ZuTG9naWNhbElkIHx8ICcnLFxuICAgICAgICBhdHQuc3NvSW5zdGFuY2VBcm4gfHwgJycsXG4gICAgICAgIGF0dC5hY2Nlc3NDb250cm9sQXR0cmlidXRlcz8ubWFwKGZvcm1hdEFjY2Vzc0NvbnRyb2xBdHRyaWJ1dGUpLmpvaW4oJ1xcbicpIHx8ICcnLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5yZWQocykpKTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGJ5IHJlc291cmNlIG5hbWUgdG8gZW5zdXJlIGEgdW5pcXVlIHZhbHVlIGlzIHVzZWQgZm9yIHNvcnRpbmdcbiAgICByZXQuc29ydChtYWtlQ29tcGFyYXRvcigocm93OiBzdHJpbmdbXSkgPT4gW3Jvd1sxXV0pKTtcbiAgICByZXQuc3BsaWNlKDAsIDAsIGhlYWRlcik7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIHN1bW1hcml6ZVNzb1Blcm1pc3Npb25TZXRzKCk6IHN0cmluZ1tdW10ge1xuICAgIGNvbnN0IHJldDogc3RyaW5nW11bXSA9IFtdO1xuICAgIGNvbnN0IGhlYWRlciA9IFsnJywgJ1Jlc291cmNlJywgJ0luc3RhbmNlQXJuJywgJ1Blcm1pc3Npb25TZXQgbmFtZScsICdQZXJtaXNzaW9uc0JvdW5kYXJ5JywgJ0N1c3RvbWVyTWFuYWdlZFBvbGljeVJlZmVyZW5jZXMnXTtcblxuICAgIGZ1bmN0aW9uIGZvcm1hdE1hbmFnZWRQb2xpY3lSZWYoczogSVNzb1Blcm1pc3Npb25TZXQuQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBgTmFtZTogJHtzPy5OYW1lIHx8ICcnfSwgUGF0aDogJHtzPy5QYXRoIHx8ICcnfWA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm9ybWF0U3NvUGVybWlzc2lvbnNCb3VuZGFyeShzc29QYjogSVNzb1Blcm1pc3Npb25TZXQuUGVybWlzc2lvbnNCb3VuZGFyeSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgICAvLyBNYW5hZ2VkUG9saWN5QXJuIE9SIEN1c3RvbWVyTWFuYWdlZFBvbGljeVJlZmVyZW5jZSBjYW4gYmUgc3BlY2lmaWVkIC0tIGJ1dCBub3QgYm90aC5cbiAgICAgIGlmIChzc29QYj8uTWFuYWdlZFBvbGljeUFybiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBgTWFuYWdlZFBvbGljeUFybjogJHtzc29QYj8uTWFuYWdlZFBvbGljeUFybiB8fCAnJ31gO1xuICAgICAgfSBlbHNlIGlmIChzc29QYj8uQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGBDdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2U6IHtcXG4gICR7Zm9ybWF0TWFuYWdlZFBvbGljeVJlZihzc29QYj8uQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlKX1cXG59YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGF0dCBvZiB0aGlzLnNzb1Blcm1pc3Npb25TZXRzLmFkZGl0aW9ucykge1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICAnKycsXG4gICAgICAgIGF0dC5jZm5Mb2dpY2FsSWQgfHwgJycsXG4gICAgICAgIGF0dC5zc29JbnN0YW5jZUFybiB8fCAnJyxcbiAgICAgICAgYXR0Lm5hbWUgfHwgJycsXG4gICAgICAgIGZvcm1hdFNzb1Blcm1pc3Npb25zQm91bmRhcnkoYXR0LnNzb1Blcm1pc3Npb25zQm91bmRhcnkpLFxuICAgICAgICBhdHQuc3NvQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlcz8ubWFwKGZvcm1hdE1hbmFnZWRQb2xpY3lSZWYpLmpvaW4oJ1xcbicpIHx8ICcnLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGF0dCBvZiB0aGlzLnNzb1Blcm1pc3Npb25TZXRzLnJlbW92YWxzKSB7XG4gICAgICByZXQucHVzaChbXG4gICAgICAgICctJyxcbiAgICAgICAgYXR0LmNmbkxvZ2ljYWxJZCB8fCAnJyxcbiAgICAgICAgYXR0LnNzb0luc3RhbmNlQXJuIHx8ICcnLFxuICAgICAgICBhdHQubmFtZSB8fCAnJyxcbiAgICAgICAgZm9ybWF0U3NvUGVybWlzc2lvbnNCb3VuZGFyeShhdHQuc3NvUGVybWlzc2lvbnNCb3VuZGFyeSksXG4gICAgICAgIGF0dC5zc29DdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2VzPy5tYXAoZm9ybWF0TWFuYWdlZFBvbGljeVJlZikuam9pbignXFxuJykgfHwgJycsXG4gICAgICBdLm1hcChzID0+IGNoYWxrLnJlZChzKSkpO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYnkgcmVzb3VyY2UgbmFtZSB0byBlbnN1cmUgYSB1bmlxdWUgdmFsdWUgaXMgdXNlZCBmb3Igc29ydGluZ1xuICAgIHJldC5zb3J0KG1ha2VDb21wYXJhdG9yKChyb3c6IHN0cmluZ1tdKSA9PiBbcm93WzFdXSkpO1xuICAgIHJldC5zcGxpY2UoMCwgMCwgaGVhZGVyKTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbWFjaGluZS1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjaGFuZ2VzLlxuICAgKiBUaGlzIGlzIG9ubHkgdXNlZCBpbiB0ZXN0cy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3RvSnNvbigpOiBJYW1DaGFuZ2VzSnNvbiB7XG4gICAgcmV0dXJuIGRlZXBSZW1vdmVVbmRlZmluZWQoe1xuICAgICAgc3RhdGVtZW50QWRkaXRpb25zOiBkcm9wSWZFbXB0eSh0aGlzLnN0YXRlbWVudHMuYWRkaXRpb25zLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgICBzdGF0ZW1lbnRSZW1vdmFsczogZHJvcElmRW1wdHkodGhpcy5zdGF0ZW1lbnRzLnJlbW92YWxzLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgICBtYW5hZ2VkUG9saWN5QWRkaXRpb25zOiBkcm9wSWZFbXB0eSh0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGRpdGlvbnMubWFwKHMgPT4gcy5fdG9Kc29uKCkpKSxcbiAgICAgIG1hbmFnZWRQb2xpY3lSZW1vdmFsczogZHJvcElmRW1wdHkodGhpcy5tYW5hZ2VkUG9saWNpZXMucmVtb3ZhbHMubWFwKHMgPT4gcy5fdG9Kc29uKCkpKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5Q2hhbmdlOiBQcm9wZXJ0eUNoYW5nZSkge1xuICAgIHN3aXRjaCAocHJvcGVydHlDaGFuZ2Uuc2NydXRpbnlUeXBlKSB7XG4gICAgICBjYXNlIFByb3BlcnR5U2NydXRpbnlUeXBlLklubGluZUlkZW50aXR5UG9saWNpZXM6XG4gICAgICAgIC8vIEFXUzo6SUFNOjp7IFJvbGUgfCBVc2VyIHwgR3JvdXAgfS5Qb2xpY2llc1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkT2xkKC4uLnRoaXMucmVhZElkZW50aXR5UG9saWNpZXMocHJvcGVydHlDaGFuZ2Uub2xkVmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkSWRlbnRpdHlQb2xpY2llcyhwcm9wZXJ0eUNoYW5nZS5uZXdWYWx1ZSwgcHJvcGVydHlDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByb3BlcnR5U2NydXRpbnlUeXBlLklubGluZVJlc291cmNlUG9saWN5OlxuICAgICAgICAvLyBBbnkgUG9saWN5RG9jdW1lbnQgb24gYSByZXNvdXJjZSAoaW5jbHVkaW5nIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudClcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE9sZCguLi50aGlzLnJlYWRSZXNvdXJjZVN0YXRlbWVudHMocHJvcGVydHlDaGFuZ2Uub2xkVmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkUmVzb3VyY2VTdGF0ZW1lbnRzKHByb3BlcnR5Q2hhbmdlLm5ld1ZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJvcGVydHlTY3J1dGlueVR5cGUuTWFuYWdlZFBvbGljaWVzOlxuICAgICAgICAvLyBKdXN0IGEgbGlzdCBvZiBtYW5hZ2VkIHBvbGljaWVzXG4gICAgICAgIHRoaXMubWFuYWdlZFBvbGljaWVzLmFkZE9sZCguLi50aGlzLnJlYWRNYW5hZ2VkUG9saWNpZXMocHJvcGVydHlDaGFuZ2Uub2xkVmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIHRoaXMubWFuYWdlZFBvbGljaWVzLmFkZE5ldyguLi50aGlzLnJlYWRNYW5hZ2VkUG9saWNpZXMocHJvcGVydHlDaGFuZ2UubmV3VmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVhZFJlc291cmNlQ2hhbmdlKHJlc291cmNlQ2hhbmdlOiBSZXNvdXJjZUNoYW5nZSkge1xuICAgIHN3aXRjaCAocmVzb3VyY2VDaGFuZ2Uuc2NydXRpbnlUeXBlKSB7XG4gICAgICBjYXNlIFJlc291cmNlU2NydXRpbnlUeXBlLklkZW50aXR5UG9saWN5UmVzb3VyY2U6XG4gICAgICAgIC8vIEFXUzo6SUFNOjpQb2xpY3lcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE9sZCguLi50aGlzLnJlYWRJZGVudGl0eVBvbGljeVJlc291cmNlKHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMpKTtcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE5ldyguLi50aGlzLnJlYWRJZGVudGl0eVBvbGljeVJlc291cmNlKHJlc291cmNlQ2hhbmdlLm5ld1Byb3BlcnRpZXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlc291cmNlU2NydXRpbnlUeXBlLlJlc291cmNlUG9saWN5UmVzb3VyY2U6XG4gICAgICAgIC8vIEFXUzo6Kjo6e0J1Y2tldCxRdWV1ZSxUb3BpY31Qb2xpY3lcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE9sZCguLi50aGlzLnJlYWRSZXNvdXJjZVBvbGljeVJlc291cmNlKHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMpKTtcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE5ldyguLi50aGlzLnJlYWRSZXNvdXJjZVBvbGljeVJlc291cmNlKHJlc291cmNlQ2hhbmdlLm5ld1Byb3BlcnRpZXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlc291cmNlU2NydXRpbnlUeXBlLkxhbWJkYVBlcm1pc3Npb246XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkTGFtYmRhU3RhdGVtZW50cyhyZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkTGFtYmRhU3RhdGVtZW50cyhyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSZXNvdXJjZVNjcnV0aW55VHlwZS5Tc29QZXJtaXNzaW9uU2V0OlxuICAgICAgICB0aGlzLnNzb1Blcm1pc3Npb25TZXRzLmFkZE9sZCguLi50aGlzLnJlYWRTc29QZXJtaXNzaW9uU2V0KHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMsIHJlc291cmNlQ2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIHRoaXMuc3NvUGVybWlzc2lvblNldHMuYWRkTmV3KC4uLnRoaXMucmVhZFNzb1Blcm1pc3Npb25TZXQocmVzb3VyY2VDaGFuZ2UubmV3UHJvcGVydGllcywgcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlc291cmNlU2NydXRpbnlUeXBlLlNzb0Fzc2lnbm1lbnRSZXNvdXJjZTpcbiAgICAgICAgdGhpcy5zc29Bc3NpZ25tZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkU3NvQXNzaWdubWVudHMocmVzb3VyY2VDaGFuZ2Uub2xkUHJvcGVydGllcywgcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgdGhpcy5zc29Bc3NpZ25tZW50cy5hZGROZXcoLi4udGhpcy5yZWFkU3NvQXNzaWdubWVudHMocmVzb3VyY2VDaGFuZ2UubmV3UHJvcGVydGllcywgcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlc291cmNlU2NydXRpbnlUeXBlLlNzb0luc3RhbmNlQUNBQ29uZmlnUmVzb3VyY2U6XG4gICAgICAgIHRoaXMuc3NvSW5zdGFuY2VBQ0FDb25maWdzLmFkZE9sZCguLi50aGlzLnJlYWRTc29JbnN0YW5jZUFDQUNvbmZpZ3MocmVzb3VyY2VDaGFuZ2Uub2xkUHJvcGVydGllcywgcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgdGhpcy5zc29JbnN0YW5jZUFDQUNvbmZpZ3MuYWRkTmV3KC4uLnRoaXMucmVhZFNzb0luc3RhbmNlQUNBQ29uZmlncyhyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzLCByZXNvdXJjZUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYSBsaXN0IG9mIHBvbGljaWVzIG9uIGFuIGlkZW50aXR5XG4gICAqL1xuICBwcml2YXRlIHJlYWRJZGVudGl0eVBvbGljaWVzKHBvbGljaWVzOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwb2xpY2llcyA9PT0gdW5kZWZpbmVkIHx8ICFBcnJheS5pc0FycmF5KHBvbGljaWVzKSkgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IGFwcGxpZXNUb1ByaW5jaXBhbCA9ICdBV1M6JHsnICsgbG9naWNhbElkICsgJ30nO1xuXG4gICAgcmV0dXJuIGZsYXRNYXAocG9saWNpZXMsIChwb2xpY3k6IGFueSkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIFBvbGljeSBpdHNlbGYgaXMgbm90IGFuIGludHJpbnNpYywgbGlrZSBhbiBGbjo6SWZcbiAgICAgIGNvbnN0IHVucGFyc2VkU3RhdGVtZW50ID0gcG9saWN5LlBvbGljeURvY3VtZW50Py5TdGF0ZW1lbnRcbiAgICAgICAgPyBwb2xpY3kuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50XG4gICAgICAgIDogcG9saWN5O1xuICAgICAgcmV0dXJuIGRlZmF1bHRQcmluY2lwYWwoYXBwbGllc1RvUHJpbmNpcGFsLCBwYXJzZVN0YXRlbWVudHMocmVuZGVySW50cmluc2ljcyh1bnBhcnNlZFN0YXRlbWVudCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbiBJQU06OlBvbGljeSByZXNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShwcm9wZXJ0aWVzOiBhbnkpOiBTdGF0ZW1lbnRbXSB7XG4gICAgaWYgKHByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIHByb3BlcnRpZXMgPSByZW5kZXJJbnRyaW5zaWNzKHByb3BlcnRpZXMpO1xuXG4gICAgY29uc3QgcHJpbmNpcGFscyA9IChwcm9wZXJ0aWVzLkdyb3VwcyB8fCBbXSkuY29uY2F0KHByb3BlcnRpZXMuVXNlcnMgfHwgW10pLmNvbmNhdChwcm9wZXJ0aWVzLlJvbGVzIHx8IFtdKTtcbiAgICByZXR1cm4gZmxhdE1hcChwcmluY2lwYWxzLCAocHJpbmNpcGFsOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHJlZiA9ICdBV1M6JyArIHByaW5jaXBhbDtcbiAgICAgIHJldHVybiBkZWZhdWx0UHJpbmNpcGFsKHJlZiwgcGFyc2VTdGF0ZW1lbnRzKHByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50KSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRTc29JbnN0YW5jZUFDQUNvbmZpZ3MocHJvcGVydGllczogYW55LCBsb2dpY2FsSWQ6IHN0cmluZyk6IFNzb0luc3RhbmNlQUNBQ29uZmlnW10ge1xuICAgIGlmIChwcm9wZXJ0aWVzID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIFtdOyB9XG5cbiAgICBwcm9wZXJ0aWVzID0gcmVuZGVySW50cmluc2ljcyhwcm9wZXJ0aWVzKTtcblxuICAgIHJldHVybiBbbmV3IFNzb0luc3RhbmNlQUNBQ29uZmlnKHtcbiAgICAgIGNmbkxvZ2ljYWxJZDogJyR7JyArIGxvZ2ljYWxJZCArICd9JyxcbiAgICAgIHNzb0luc3RhbmNlQXJuOiBwcm9wZXJ0aWVzLkluc3RhbmNlQXJuLFxuICAgICAgYWNjZXNzQ29udHJvbEF0dHJpYnV0ZXM6IHByb3BlcnRpZXMuQWNjZXNzQ29udHJvbEF0dHJpYnV0ZXMsXG4gICAgfSldO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkU3NvQXNzaWdubWVudHMocHJvcGVydGllczogYW55LCBsb2dpY2FsSWQ6IHN0cmluZyk6IFNzb0Fzc2lnbm1lbnRbXSB7XG4gICAgaWYgKHByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIHByb3BlcnRpZXMgPSByZW5kZXJJbnRyaW5zaWNzKHByb3BlcnRpZXMpO1xuXG4gICAgcmV0dXJuIFtuZXcgU3NvQXNzaWdubWVudCh7XG4gICAgICBjZm5Mb2dpY2FsSWQ6ICckeycgKyBsb2dpY2FsSWQgKyAnfScsXG4gICAgICBzc29JbnN0YW5jZUFybjogcHJvcGVydGllcy5JbnN0YW5jZUFybixcbiAgICAgIHBlcm1pc3Npb25TZXRBcm46IHByb3BlcnRpZXMuUGVybWlzc2lvblNldEFybixcbiAgICAgIHByaW5jaXBhbElkOiBwcm9wZXJ0aWVzLlByaW5jaXBhbElkLFxuICAgICAgcHJpbmNpcGFsVHlwZTogcHJvcGVydGllcy5QcmluY2lwYWxUeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHByb3BlcnRpZXMuVGFyZ2V0SWQsXG4gICAgICB0YXJnZXRUeXBlOiBwcm9wZXJ0aWVzLlRhcmdldFR5cGUsXG4gICAgfSldO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkU3NvUGVybWlzc2lvblNldChwcm9wZXJ0aWVzOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3NvUGVybWlzc2lvblNldFtdIHtcbiAgICBpZiAocHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBbXTsgfVxuXG4gICAgcHJvcGVydGllcyA9IHJlbmRlckludHJpbnNpY3MocHJvcGVydGllcyk7XG5cbiAgICByZXR1cm4gW25ldyBTc29QZXJtaXNzaW9uU2V0KHtcbiAgICAgIGNmbkxvZ2ljYWxJZDogJyR7JyArIGxvZ2ljYWxJZCArICd9JyxcbiAgICAgIG5hbWU6IHByb3BlcnRpZXMuTmFtZSxcbiAgICAgIHNzb0luc3RhbmNlQXJuOiBwcm9wZXJ0aWVzLkluc3RhbmNlQXJuLFxuICAgICAgc3NvQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlczogcHJvcGVydGllcy5DdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2VzLFxuICAgICAgc3NvUGVybWlzc2lvbnNCb3VuZGFyeTogcHJvcGVydGllcy5QZXJtaXNzaW9uc0JvdW5kYXJ5LFxuICAgIH0pXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZFJlc291cmNlU3RhdGVtZW50cyhwb2xpY3k6IGFueSwgbG9naWNhbElkOiBzdHJpbmcpOiBTdGF0ZW1lbnRbXSB7XG4gICAgaWYgKHBvbGljeSA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBbXTsgfVxuXG4gICAgY29uc3QgYXBwbGllc1RvUmVzb3VyY2UgPSAnJHsnICsgbG9naWNhbElkICsgJy5Bcm59JztcbiAgICByZXR1cm4gZGVmYXVsdFJlc291cmNlKGFwcGxpZXNUb1Jlc291cmNlLCBwYXJzZVN0YXRlbWVudHMocmVuZGVySW50cmluc2ljcyhwb2xpY3kuU3RhdGVtZW50KSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFuIEFXUzo6Kjo6e0J1Y2tldCxUb3BpYyxRdWV1ZX1wb2xpY3lcbiAgICovXG4gIHByaXZhdGUgcmVhZFJlc291cmNlUG9saWN5UmVzb3VyY2UocHJvcGVydGllczogYW55KTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwcm9wZXJ0aWVzID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIFtdOyB9XG5cbiAgICBwcm9wZXJ0aWVzID0gcmVuZGVySW50cmluc2ljcyhwcm9wZXJ0aWVzKTtcblxuICAgIGNvbnN0IHBvbGljeUtleXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5maWx0ZXIoa2V5ID0+IGtleS5pbmRleE9mKCdQb2xpY3knKSA+IC0xKTtcblxuICAgIC8vIEZpbmQgdGhlIGtleSB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlKHMpIHRoaXMgcG9saWN5IGFwcGxpZXMgdG9cbiAgICBjb25zdCByZXNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5maWx0ZXIoa2V5ID0+ICFwb2xpY3lLZXlzLmluY2x1ZGVzKGtleSkgJiYgIWtleS5lbmRzV2l0aCgnTmFtZScpKTtcbiAgICBsZXQgcmVzb3VyY2VzID0gcmVzb3VyY2VLZXlzLmxlbmd0aCA9PT0gMSA/IHByb3BlcnRpZXNbcmVzb3VyY2VLZXlzWzBdXSA6IFsnPz8/J107XG5cbiAgICAvLyBGb3Igc29tZSByZXNvdXJjZXMsIHRoaXMgaXMgYSBzaW5nbGV0b24gc3RyaW5nLCBmb3Igc29tZSBpdCdzIGFuIGFycmF5XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc291cmNlcykpIHtcbiAgICAgIHJlc291cmNlcyA9IFtyZXNvdXJjZXNdO1xuICAgIH1cblxuICAgIHJldHVybiBmbGF0TWFwKHJlc291cmNlcywgKHJlc291cmNlOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBkZWZhdWx0UmVzb3VyY2UocmVzb3VyY2UsIHBhcnNlU3RhdGVtZW50cyhwcm9wZXJ0aWVzW3BvbGljeUtleXNbMF1dLlN0YXRlbWVudCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkTWFuYWdlZFBvbGljaWVzKHBvbGljeUFybnM6IGFueSwgbG9naWNhbElkOiBzdHJpbmcpOiBNYW5hZ2VkUG9saWN5QXR0YWNobWVudFtdIHtcbiAgICBpZiAoIXBvbGljeUFybnMpIHsgcmV0dXJuIFtdOyB9XG5cbiAgICBjb25zdCByZXAgPSAnJHsnICsgbG9naWNhbElkICsgJ30nO1xuICAgIHJldHVybiBNYW5hZ2VkUG9saWN5QXR0YWNobWVudC5wYXJzZU1hbmFnZWRQb2xpY2llcyhyZXAsIHJlbmRlckludHJpbnNpY3MocG9saWN5QXJucykpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkTGFtYmRhU3RhdGVtZW50cyhwcm9wZXJ0aWVzPzogUHJvcGVydHlNYXApOiBTdGF0ZW1lbnRbXSB7XG4gICAgaWYgKCFwcm9wZXJ0aWVzKSB7IHJldHVybiBbXTsgfVxuXG4gICAgcmV0dXJuIFtwYXJzZUxhbWJkYVBlcm1pc3Npb24ocmVuZGVySW50cmluc2ljcyhwcm9wZXJ0aWVzKSldO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGFuIHVuZGVmaW5lZCBvciB3aWxkY2FyZGVkIHByaW5jaXBhbCBvbiB0aGVzZSBzdGF0ZW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRQcmluY2lwYWwocHJpbmNpcGFsOiBzdHJpbmcsIHN0YXRlbWVudHM6IFN0YXRlbWVudFtdKSB7XG4gIHN0YXRlbWVudHMuZm9yRWFjaChzID0+IHMucHJpbmNpcGFscy5yZXBsYWNlRW1wdHkocHJpbmNpcGFsKSk7XG4gIHN0YXRlbWVudHMuZm9yRWFjaChzID0+IHMucHJpbmNpcGFscy5yZXBsYWNlU3RhcihwcmluY2lwYWwpKTtcbiAgcmV0dXJuIHN0YXRlbWVudHM7XG59XG5cbi8qKlxuICogU2V0IGFuIHVuZGVmaW5lZCBvciB3aWxkY2FyZGVkIHJlc291cmNlIG9uIHRoZXNlIHN0YXRlbWVudHNcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFJlc291cmNlKHJlc291cmNlOiBzdHJpbmcsIHN0YXRlbWVudHM6IFN0YXRlbWVudFtdKSB7XG4gIHN0YXRlbWVudHMuZm9yRWFjaChzID0+IHMucmVzb3VyY2VzLnJlcGxhY2VFbXB0eShyZXNvdXJjZSkpO1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnJlc291cmNlcy5yZXBsYWNlU3RhcihyZXNvdXJjZSkpO1xuICByZXR1cm4gc3RhdGVtZW50cztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJYW1DaGFuZ2VzSnNvbiB7XG4gIHN0YXRlbWVudEFkZGl0aW9ucz86IEFycmF5PE1heWJlUGFyc2VkPFN0YXRlbWVudEpzb24+PjtcbiAgc3RhdGVtZW50UmVtb3ZhbHM/OiBBcnJheTxNYXliZVBhcnNlZDxTdGF0ZW1lbnRKc29uPj47XG4gIG1hbmFnZWRQb2xpY3lBZGRpdGlvbnM/OiBBcnJheTxNYXliZVBhcnNlZDxNYW5hZ2VkUG9saWN5SnNvbj4+O1xuICBtYW5hZ2VkUG9saWN5UmVtb3ZhbHM/OiBBcnJheTxNYXliZVBhcnNlZDxNYW5hZ2VkUG9saWN5SnNvbj4+O1xufVxuIl19
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This namespace should be a subset of the L1 CfnPermissionSet, other than
|
|
3
|
+
* capitalization, since the values come from from a parsed CFN template.
|
|
4
|
+
*/
|
|
5
|
+
export declare namespace ISsoPermissionSet {
|
|
6
|
+
interface Props {
|
|
7
|
+
readonly name: string | undefined;
|
|
8
|
+
readonly cfnLogicalId: string | undefined;
|
|
9
|
+
readonly ssoInstanceArn: string | undefined;
|
|
10
|
+
readonly ssoPermissionsBoundary: ISsoPermissionSet.PermissionsBoundary | undefined;
|
|
11
|
+
readonly ssoCustomerManagedPolicyReferences: ISsoPermissionSet.CustomerManagedPolicyReference[] | undefined;
|
|
12
|
+
}
|
|
13
|
+
interface PermissionsBoundary {
|
|
14
|
+
readonly CustomerManagedPolicyReference?: CustomerManagedPolicyReference;
|
|
15
|
+
readonly ManagedPolicyArn?: string;
|
|
16
|
+
}
|
|
17
|
+
interface CustomerManagedPolicyReference {
|
|
18
|
+
readonly Name: string | undefined;
|
|
19
|
+
readonly Path: string | undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export declare class SsoPermissionSet implements ISsoPermissionSet.Props {
|
|
23
|
+
readonly name: string | undefined;
|
|
24
|
+
readonly cfnLogicalId: string | undefined;
|
|
25
|
+
readonly ssoInstanceArn: string | undefined;
|
|
26
|
+
readonly ssoPermissionsBoundary: ISsoPermissionSet.PermissionsBoundary | undefined;
|
|
27
|
+
readonly ssoCustomerManagedPolicyReferences: ISsoPermissionSet.CustomerManagedPolicyReference[] | undefined;
|
|
28
|
+
constructor(props: ISsoPermissionSet.Props);
|
|
29
|
+
equal(other: SsoPermissionSet): boolean;
|
|
30
|
+
}
|
|
31
|
+
export declare namespace ISsoAssignment {
|
|
32
|
+
interface Props {
|
|
33
|
+
readonly ssoInstanceArn: string | undefined;
|
|
34
|
+
readonly cfnLogicalId: string | undefined;
|
|
35
|
+
readonly permissionSetArn: string | undefined;
|
|
36
|
+
readonly principalId: string | undefined;
|
|
37
|
+
readonly principalType: string | undefined;
|
|
38
|
+
readonly targetId: string | undefined;
|
|
39
|
+
readonly targetType: string | undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export declare class SsoAssignment implements ISsoAssignment.Props {
|
|
43
|
+
readonly cfnLogicalId: string | undefined;
|
|
44
|
+
readonly ssoInstanceArn: string | undefined;
|
|
45
|
+
readonly permissionSetArn: string | undefined;
|
|
46
|
+
readonly principalId: string | undefined;
|
|
47
|
+
readonly principalType: string | undefined;
|
|
48
|
+
readonly targetId: string | undefined;
|
|
49
|
+
readonly targetType: string | undefined;
|
|
50
|
+
constructor(props: ISsoAssignment.Props);
|
|
51
|
+
equal(other: SsoAssignment): boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* AWS::SSO::InstanceAccessControlAttributeConfiguration
|
|
55
|
+
*/
|
|
56
|
+
export interface ISsoInstanceACAConfigProps {
|
|
57
|
+
ssoInstanceArn: string;
|
|
58
|
+
}
|
|
59
|
+
export declare namespace ISsoInstanceACAConfig {
|
|
60
|
+
type AccessControlAttribute = {
|
|
61
|
+
Key: string | undefined;
|
|
62
|
+
Value: {
|
|
63
|
+
Source: string[];
|
|
64
|
+
} | undefined;
|
|
65
|
+
} | undefined;
|
|
66
|
+
interface Props {
|
|
67
|
+
readonly ssoInstanceArn: string | undefined;
|
|
68
|
+
readonly cfnLogicalId: string | undefined;
|
|
69
|
+
readonly accessControlAttributes?: AccessControlAttribute[] | undefined;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export declare class SsoInstanceACAConfig implements ISsoInstanceACAConfig.Props {
|
|
73
|
+
readonly cfnLogicalId: string | undefined;
|
|
74
|
+
readonly ssoInstanceArn: string | undefined;
|
|
75
|
+
readonly accessControlAttributes?: ISsoInstanceACAConfig.AccessControlAttribute[] | undefined;
|
|
76
|
+
constructor(props: ISsoInstanceACAConfig.Props);
|
|
77
|
+
equal(other: SsoInstanceACAConfig): boolean;
|
|
78
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SsoInstanceACAConfig = exports.SsoAssignment = exports.SsoPermissionSet = void 0;
|
|
4
|
+
// namespace object imports won't work in the bundle for function exports
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
6
|
+
const deepEqual = require('fast-deep-equal');
|
|
7
|
+
class SsoPermissionSet {
|
|
8
|
+
constructor(props) {
|
|
9
|
+
this.cfnLogicalId = props.cfnLogicalId;
|
|
10
|
+
this.name = props.name;
|
|
11
|
+
this.ssoInstanceArn = props.ssoInstanceArn;
|
|
12
|
+
this.ssoPermissionsBoundary = props.ssoPermissionsBoundary;
|
|
13
|
+
this.ssoCustomerManagedPolicyReferences = props.ssoCustomerManagedPolicyReferences;
|
|
14
|
+
}
|
|
15
|
+
equal(other) {
|
|
16
|
+
return deepEqual(this, other);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.SsoPermissionSet = SsoPermissionSet;
|
|
20
|
+
class SsoAssignment {
|
|
21
|
+
constructor(props) {
|
|
22
|
+
this.cfnLogicalId = props.cfnLogicalId;
|
|
23
|
+
this.ssoInstanceArn = props.ssoInstanceArn;
|
|
24
|
+
this.permissionSetArn = props.permissionSetArn;
|
|
25
|
+
this.principalId = props.principalId;
|
|
26
|
+
this.principalType = props.principalType;
|
|
27
|
+
this.targetId = props.targetId;
|
|
28
|
+
this.targetType = props.targetType;
|
|
29
|
+
}
|
|
30
|
+
equal(other) {
|
|
31
|
+
return deepEqual(this, other);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.SsoAssignment = SsoAssignment;
|
|
35
|
+
class SsoInstanceACAConfig {
|
|
36
|
+
constructor(props) {
|
|
37
|
+
this.cfnLogicalId = props.cfnLogicalId;
|
|
38
|
+
this.ssoInstanceArn = props.ssoInstanceArn;
|
|
39
|
+
this.accessControlAttributes = props.accessControlAttributes;
|
|
40
|
+
}
|
|
41
|
+
equal(other) {
|
|
42
|
+
return deepEqual(this, other);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.SsoInstanceACAConfig = SsoInstanceACAConfig;
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWlkZW50aXR5LWNlbnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImlhbS1pZGVudGl0eS1jZW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXlFO0FBQ3pFLGlFQUFpRTtBQUNqRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQXdCN0MsTUFBYSxnQkFBZ0I7SUFPM0IsWUFBWSxLQUE4QjtRQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztRQUMzQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1FBQzNELElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxLQUFLLENBQUMsa0NBQWtDLENBQUM7SUFDckYsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUF1QjtRQUNsQyxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBbEJELDRDQWtCQztBQWNELE1BQWEsYUFBYTtJQVN4QixZQUFZLEtBQTJCO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFvQjtRQUMvQixPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBdEJELHNDQXNCQztBQXNCRCxNQUFhLG9CQUFvQjtJQUsvQixZQUFZLEtBQWtDO1FBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDM0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQztJQUMvRCxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQTJCO1FBQ3RDLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFkRCxvREFjQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIG5hbWVzcGFjZSBvYmplY3QgaW1wb3J0cyB3b24ndCB3b3JrIGluIHRoZSBidW5kbGUgZm9yIGZ1bmN0aW9uIGV4cG9ydHNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBkZWVwRXF1YWwgPSByZXF1aXJlKCdmYXN0LWRlZXAtZXF1YWwnKTtcblxuLyoqXG4gKiBUaGlzIG5hbWVzcGFjZSBzaG91bGQgYmUgYSBzdWJzZXQgb2YgdGhlIEwxIENmblBlcm1pc3Npb25TZXQsIG90aGVyIHRoYW5cbiAqIGNhcGl0YWxpemF0aW9uLCBzaW5jZSB0aGUgdmFsdWVzIGNvbWUgZnJvbSBmcm9tIGEgcGFyc2VkIENGTiB0ZW1wbGF0ZS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBJU3NvUGVybWlzc2lvblNldCB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgUHJvcHMge1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBjZm5Mb2dpY2FsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBzc29JbnN0YW5jZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHJlYWRvbmx5IHNzb1Blcm1pc3Npb25zQm91bmRhcnk6IElTc29QZXJtaXNzaW9uU2V0LlBlcm1pc3Npb25zQm91bmRhcnkgfCB1bmRlZmluZWQ7XG4gICAgcmVhZG9ubHkgc3NvQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlczogSVNzb1Blcm1pc3Npb25TZXQuQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlW10gfCB1bmRlZmluZWQ7XG4gIH1cbiAgZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uc0JvdW5kYXJ5IHtcbiAgICByZWFkb25seSBDdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2U/OiBDdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2U7XG4gICAgcmVhZG9ubHkgTWFuYWdlZFBvbGljeUFybj86IHN0cmluZztcbiAgfVxuICBleHBvcnQgaW50ZXJmYWNlIEN1c3RvbWVyTWFuYWdlZFBvbGljeVJlZmVyZW5jZSB7XG4gICAgcmVhZG9ubHkgTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHJlYWRvbmx5IFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3NvUGVybWlzc2lvblNldCBpbXBsZW1lbnRzIElTc29QZXJtaXNzaW9uU2V0LlByb3BzIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IGNmbkxvZ2ljYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgc3NvSW5zdGFuY2VBcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IHNzb1Blcm1pc3Npb25zQm91bmRhcnk6IElTc29QZXJtaXNzaW9uU2V0LlBlcm1pc3Npb25zQm91bmRhcnkgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBzc29DdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2VzOiBJU3NvUGVybWlzc2lvblNldC5DdXN0b21lck1hbmFnZWRQb2xpY3lSZWZlcmVuY2VbXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSVNzb1Blcm1pc3Npb25TZXQuUHJvcHMpIHtcbiAgICB0aGlzLmNmbkxvZ2ljYWxJZCA9IHByb3BzLmNmbkxvZ2ljYWxJZDtcbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5uYW1lO1xuICAgIHRoaXMuc3NvSW5zdGFuY2VBcm4gPSBwcm9wcy5zc29JbnN0YW5jZUFybjtcbiAgICB0aGlzLnNzb1Blcm1pc3Npb25zQm91bmRhcnkgPSBwcm9wcy5zc29QZXJtaXNzaW9uc0JvdW5kYXJ5O1xuICAgIHRoaXMuc3NvQ3VzdG9tZXJNYW5hZ2VkUG9saWN5UmVmZXJlbmNlcyA9IHByb3BzLnNzb0N1c3RvbWVyTWFuYWdlZFBvbGljeVJlZmVyZW5jZXM7XG4gIH1cblxuICBwdWJsaWMgZXF1YWwob3RoZXI6IFNzb1Blcm1pc3Npb25TZXQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGVlcEVxdWFsKHRoaXMsIG90aGVyKTtcbiAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIElTc29Bc3NpZ25tZW50IHtcbiAgZXhwb3J0IGludGVyZmFjZSBQcm9wcyB7XG4gICAgcmVhZG9ubHkgc3NvSW5zdGFuY2VBcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBjZm5Mb2dpY2FsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBwZXJtaXNzaW9uU2V0QXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmVhZG9ubHkgcHJpbmNpcGFsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBwcmluY2lwYWxUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmVhZG9ubHkgdGFyZ2V0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSB0YXJnZXRUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNzb0Fzc2lnbm1lbnQgaW1wbGVtZW50cyBJU3NvQXNzaWdubWVudC5Qcm9wcyB7XG4gIHB1YmxpYyByZWFkb25seSBjZm5Mb2dpY2FsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IHNzb0luc3RhbmNlQXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uU2V0QXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpbmNpcGFsVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldFR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSVNzb0Fzc2lnbm1lbnQuUHJvcHMpIHtcbiAgICB0aGlzLmNmbkxvZ2ljYWxJZCA9IHByb3BzLmNmbkxvZ2ljYWxJZDtcbiAgICB0aGlzLnNzb0luc3RhbmNlQXJuID0gcHJvcHMuc3NvSW5zdGFuY2VBcm47XG4gICAgdGhpcy5wZXJtaXNzaW9uU2V0QXJuID0gcHJvcHMucGVybWlzc2lvblNldEFybjtcbiAgICB0aGlzLnByaW5jaXBhbElkID0gcHJvcHMucHJpbmNpcGFsSWQ7XG4gICAgdGhpcy5wcmluY2lwYWxUeXBlID0gcHJvcHMucHJpbmNpcGFsVHlwZTtcbiAgICB0aGlzLnRhcmdldElkID0gcHJvcHMudGFyZ2V0SWQ7XG4gICAgdGhpcy50YXJnZXRUeXBlID0gcHJvcHMudGFyZ2V0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBlcXVhbChvdGhlcjogU3NvQXNzaWdubWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkZWVwRXF1YWwodGhpcywgb3RoZXIpO1xuICB9XG59XG5cbi8qKlxuICogQVdTOjpTU086Okluc3RhbmNlQWNjZXNzQ29udHJvbEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3NvSW5zdGFuY2VBQ0FDb25maWdQcm9wcyB7XG4gIHNzb0luc3RhbmNlQXJuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgSVNzb0luc3RhbmNlQUNBQ29uZmlnIHtcbiAgZXhwb3J0IHR5cGUgQWNjZXNzQ29udHJvbEF0dHJpYnV0ZSA9IHtcbiAgICBLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBWYWx1ZTogeyBTb3VyY2U6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG4gIH0gfCB1bmRlZmluZWQ7XG5cbiAgZXhwb3J0IGludGVyZmFjZSBQcm9wcyB7XG4gICAgcmVhZG9ubHkgc3NvSW5zdGFuY2VBcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBjZm5Mb2dpY2FsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBhY2Nlc3NDb250cm9sQXR0cmlidXRlcz86IEFjY2Vzc0NvbnRyb2xBdHRyaWJ1dGVbXSB8IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3NvSW5zdGFuY2VBQ0FDb25maWcgaW1wbGVtZW50cyBJU3NvSW5zdGFuY2VBQ0FDb25maWcuUHJvcHMge1xuICBwdWJsaWMgcmVhZG9ubHkgY2ZuTG9naWNhbElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBzc29JbnN0YW5jZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgYWNjZXNzQ29udHJvbEF0dHJpYnV0ZXM/OiBJU3NvSW5zdGFuY2VBQ0FDb25maWcuQWNjZXNzQ29udHJvbEF0dHJpYnV0ZVtdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJU3NvSW5zdGFuY2VBQ0FDb25maWcuUHJvcHMpIHtcbiAgICB0aGlzLmNmbkxvZ2ljYWxJZCA9IHByb3BzLmNmbkxvZ2ljYWxJZDtcbiAgICB0aGlzLnNzb0luc3RhbmNlQXJuID0gcHJvcHMuc3NvSW5zdGFuY2VBcm47XG4gICAgdGhpcy5hY2Nlc3NDb250cm9sQXR0cmlidXRlcyA9IHByb3BzLmFjY2Vzc0NvbnRyb2xBdHRyaWJ1dGVzO1xuICB9XG5cbiAgcHVibGljIGVxdWFsKG90aGVyOiBTc29JbnN0YW5jZUFDQUNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkZWVwRXF1YWwodGhpcywgb3RoZXIpO1xuICB9XG59XG4iXX0=
|