cdk8s-plus-36 0.0.1 → 2.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.
Files changed (156) hide show
  1. package/.jsii +105714 -0
  2. package/CODE_OF_CONDUCT.md +3 -0
  3. package/CONTRIBUTING.md +185 -0
  4. package/DCO +34 -0
  5. package/LICENSE +202 -0
  6. package/NOTICE +1 -0
  7. package/OWNERS.md +5 -0
  8. package/README.md +21 -34
  9. package/SECURITY.md +5 -0
  10. package/cdk8s.yaml +13 -0
  11. package/docs/java.md +156096 -0
  12. package/docs/plus/config-map.md +98 -0
  13. package/docs/plus/container.md +133 -0
  14. package/docs/plus/cronjob.md +67 -0
  15. package/docs/plus/deployment.md +232 -0
  16. package/docs/plus/horizontal-pod-autoscaler.md +226 -0
  17. package/docs/plus/ingress.md +68 -0
  18. package/docs/plus/job.md +48 -0
  19. package/docs/plus/namespace.md +58 -0
  20. package/docs/plus/network-policy.md +341 -0
  21. package/docs/plus/pod.md +455 -0
  22. package/docs/plus/pv.md +82 -0
  23. package/docs/plus/pvc.md +77 -0
  24. package/docs/plus/rbac.md +104 -0
  25. package/docs/plus/secret.md +32 -0
  26. package/docs/plus/service-account.md +35 -0
  27. package/docs/plus/service.md +41 -0
  28. package/docs/plus/volume.md +84 -0
  29. package/docs/python.md +167536 -0
  30. package/docs/typescript.md +145485 -0
  31. package/git-hooks/README.md +9 -0
  32. package/git-hooks/prepare-commit-msg +18 -0
  33. package/git-hooks/setup.sh +10 -0
  34. package/lib/_action.d.ts +26 -0
  35. package/lib/_action.js +72 -0
  36. package/lib/api-resource.d.ts +298 -0
  37. package/lib/api-resource.js +438 -0
  38. package/lib/base.d.ts +79 -0
  39. package/lib/base.js +124 -0
  40. package/lib/config-map.d.ts +126 -0
  41. package/lib/config-map.js +199 -0
  42. package/lib/container.d.ts +1057 -0
  43. package/lib/container.js +944 -0
  44. package/lib/cron-job.d.ts +138 -0
  45. package/lib/cron-job.js +170 -0
  46. package/lib/daemon-set.d.ts +45 -0
  47. package/lib/daemon-set.js +91 -0
  48. package/lib/deployment.d.ts +235 -0
  49. package/lib/deployment.js +274 -0
  50. package/lib/handler.d.ts +62 -0
  51. package/lib/handler.js +88 -0
  52. package/lib/horizontal-pod-autoscaler.d.ts +500 -0
  53. package/lib/horizontal-pod-autoscaler.js +629 -0
  54. package/lib/imports/k8s.d.ts +27283 -0
  55. package/lib/imports/k8s.js +20112 -0
  56. package/lib/index.d.ts +26 -0
  57. package/lib/index.js +66 -0
  58. package/lib/ingress.d.ts +230 -0
  59. package/lib/ingress.js +282 -0
  60. package/lib/job.d.ts +64 -0
  61. package/lib/job.js +101 -0
  62. package/lib/namespace.d.ts +128 -0
  63. package/lib/namespace.js +148 -0
  64. package/lib/network-policy.d.ts +311 -0
  65. package/lib/network-policy.js +383 -0
  66. package/lib/pod.d.ts +1097 -0
  67. package/lib/pod.js +1227 -0
  68. package/lib/probe.d.ts +181 -0
  69. package/lib/probe.js +124 -0
  70. package/lib/pv.d.ts +375 -0
  71. package/lib/pv.js +387 -0
  72. package/lib/pvc.d.ts +163 -0
  73. package/lib/pvc.js +204 -0
  74. package/lib/role-binding.d.ts +138 -0
  75. package/lib/role-binding.js +207 -0
  76. package/lib/role.d.ts +268 -0
  77. package/lib/role.js +441 -0
  78. package/lib/secret.d.ts +195 -0
  79. package/lib/secret.js +221 -0
  80. package/lib/service-account.d.ts +83 -0
  81. package/lib/service-account.js +148 -0
  82. package/lib/service.d.ts +289 -0
  83. package/lib/service.js +235 -0
  84. package/lib/stateful-set.d.ts +206 -0
  85. package/lib/stateful-set.js +291 -0
  86. package/lib/utils.d.ts +4 -0
  87. package/lib/utils.js +33 -0
  88. package/lib/volume.d.ts +577 -0
  89. package/lib/volume.js +410 -0
  90. package/lib/workload.d.ts +121 -0
  91. package/lib/workload.js +158 -0
  92. package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
  93. package/node_modules/balanced-match/LICENSE.md +21 -0
  94. package/node_modules/balanced-match/README.md +97 -0
  95. package/node_modules/balanced-match/index.js +62 -0
  96. package/node_modules/balanced-match/package.json +48 -0
  97. package/node_modules/brace-expansion/.github/FUNDING.yml +2 -0
  98. package/node_modules/brace-expansion/LICENSE +21 -0
  99. package/node_modules/brace-expansion/README.md +157 -0
  100. package/node_modules/brace-expansion/index.js +394 -0
  101. package/node_modules/brace-expansion/package.json +49 -0
  102. package/node_modules/minimatch/LICENSE +15 -0
  103. package/node_modules/minimatch/README.md +491 -0
  104. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +2 -0
  105. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -0
  106. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +14 -0
  107. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -0
  108. package/node_modules/minimatch/dist/commonjs/ast.d.ts +20 -0
  109. package/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -0
  110. package/node_modules/minimatch/dist/commonjs/ast.js +747 -0
  111. package/node_modules/minimatch/dist/commonjs/ast.js.map +1 -0
  112. package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +8 -0
  113. package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -0
  114. package/node_modules/minimatch/dist/commonjs/brace-expressions.js +152 -0
  115. package/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -0
  116. package/node_modules/minimatch/dist/commonjs/escape.d.ts +12 -0
  117. package/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -0
  118. package/node_modules/minimatch/dist/commonjs/escape.js +22 -0
  119. package/node_modules/minimatch/dist/commonjs/escape.js.map +1 -0
  120. package/node_modules/minimatch/dist/commonjs/index.d.ts +98 -0
  121. package/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -0
  122. package/node_modules/minimatch/dist/commonjs/index.js +1023 -0
  123. package/node_modules/minimatch/dist/commonjs/index.js.map +1 -0
  124. package/node_modules/minimatch/dist/commonjs/package.json +3 -0
  125. package/node_modules/minimatch/dist/commonjs/unescape.d.ts +17 -0
  126. package/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -0
  127. package/node_modules/minimatch/dist/commonjs/unescape.js +24 -0
  128. package/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -0
  129. package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +2 -0
  130. package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -0
  131. package/node_modules/minimatch/dist/esm/assert-valid-pattern.js +10 -0
  132. package/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
  133. package/node_modules/minimatch/dist/esm/ast.d.ts +20 -0
  134. package/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -0
  135. package/node_modules/minimatch/dist/esm/ast.js +743 -0
  136. package/node_modules/minimatch/dist/esm/ast.js.map +1 -0
  137. package/node_modules/minimatch/dist/esm/brace-expressions.d.ts +8 -0
  138. package/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -0
  139. package/node_modules/minimatch/dist/esm/brace-expressions.js +148 -0
  140. package/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
  141. package/node_modules/minimatch/dist/esm/escape.d.ts +12 -0
  142. package/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -0
  143. package/node_modules/minimatch/dist/esm/escape.js +18 -0
  144. package/node_modules/minimatch/dist/esm/escape.js.map +1 -0
  145. package/node_modules/minimatch/dist/esm/index.d.ts +98 -0
  146. package/node_modules/minimatch/dist/esm/index.d.ts.map +1 -0
  147. package/node_modules/minimatch/dist/esm/index.js +1007 -0
  148. package/node_modules/minimatch/dist/esm/index.js.map +1 -0
  149. package/node_modules/minimatch/dist/esm/package.json +3 -0
  150. package/node_modules/minimatch/dist/esm/unescape.d.ts +17 -0
  151. package/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -0
  152. package/node_modules/minimatch/dist/esm/unescape.js +20 -0
  153. package/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
  154. package/node_modules/minimatch/package.json +82 -0
  155. package/package.json +172 -6
  156. package/rotate.md +82 -0
package/lib/role.js ADDED
@@ -0,0 +1,441 @@
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.ClusterRole = exports.Role = void 0;
37
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
+ const cdk8s_1 = require("cdk8s");
39
+ const constructs_1 = require("constructs");
40
+ const base = __importStar(require("./base"));
41
+ const k8s = __importStar(require("./imports/k8s"));
42
+ const rb = __importStar(require("./role-binding"));
43
+ const utils_1 = require("./utils");
44
+ class ImportedRole extends constructs_1.Construct {
45
+ _name;
46
+ resourceType = 'roles';
47
+ constructor(scope, id, name) {
48
+ super(scope, id);
49
+ this._name = name;
50
+ }
51
+ get name() {
52
+ return this._name;
53
+ }
54
+ get apiVersion() {
55
+ return k8s.KubeRole.GVK.apiVersion;
56
+ }
57
+ get apiGroup() {
58
+ return 'rbac.authorization.k8s.io';
59
+ }
60
+ get kind() {
61
+ return k8s.KubeRole.GVK.kind;
62
+ }
63
+ get resourceName() {
64
+ return this.name;
65
+ }
66
+ }
67
+ /**
68
+ * Role is a namespaced, logical grouping of PolicyRules that can be referenced
69
+ * as a unit by a RoleBinding.
70
+ */
71
+ class Role extends base.Resource {
72
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.Role", version: "2.0.0" };
73
+ /**
74
+ * Imports a role from the cluster as a reference.
75
+ */
76
+ static fromRoleName(scope, id, name) {
77
+ return new ImportedRole(scope, id, name);
78
+ }
79
+ /**
80
+ * @see base.Resource.apiObject
81
+ */
82
+ apiObject;
83
+ resourceType = 'roles';
84
+ _rules = [];
85
+ constructor(scope, id, props = {}) {
86
+ super(scope, id);
87
+ this.apiObject = new k8s.KubeRole(this, 'Resource', {
88
+ metadata: props.metadata,
89
+ rules: cdk8s_1.Lazy.any({ produce: () => this.synthesizeRules() }),
90
+ });
91
+ for (const rule of props.rules ?? []) {
92
+ this.allow(rule.verbs, ...rule.resources);
93
+ }
94
+ }
95
+ /**
96
+ * Rules associaated with this Role.
97
+ * Returns a copy, use `allow` to add rules.
98
+ */
99
+ get rules() {
100
+ return [...this._rules];
101
+ }
102
+ /**
103
+ * Add permission to perform a list of HTTP verbs on a collection of
104
+ * resources.
105
+ *
106
+ * @param resources The resource(s) to apply to
107
+ * @see https://kubernetes.io/docs/reference/access-authn-authz/authorization/#determine-the-request-verb
108
+ */
109
+ allow(verbs, ...resources) {
110
+ this._rules.push({ verbs, resources });
111
+ }
112
+ /**
113
+ * Add "create" permission for the resources.
114
+ * @param resources The resource(s) to apply to
115
+ */
116
+ allowCreate(...resources) {
117
+ this.allow(['create'], ...resources);
118
+ }
119
+ /**
120
+ * Add "get" permission for the resources.
121
+ * @param resources The resource(s) to apply to
122
+ */
123
+ allowGet(...resources) {
124
+ this.allow(['get'], ...resources);
125
+ }
126
+ /**
127
+ * Add "list" permission for the resources.
128
+ * @param resources The resource(s) to apply to
129
+ */
130
+ allowList(...resources) {
131
+ this.allow(['list'], ...resources);
132
+ }
133
+ /**
134
+ * Add "watch" permission for the resources.
135
+ * @param resources The resource(s) to apply to
136
+ */
137
+ allowWatch(...resources) {
138
+ this.allow(['watch'], ...resources);
139
+ }
140
+ /**
141
+ * Add "update" permission for the resources.
142
+ * @param resources The resource(s) to apply to
143
+ */
144
+ allowUpdate(...resources) {
145
+ this.allow(['update'], ...resources);
146
+ }
147
+ /**
148
+ * Add "patch" permission for the resources.
149
+ * @param resources The resource(s) to apply to
150
+ */
151
+ allowPatch(...resources) {
152
+ this.allow(['patch'], ...resources);
153
+ }
154
+ /**
155
+ * Add "delete" permission for the resources.
156
+ * @param resources The resource(s) to apply to
157
+ */
158
+ allowDelete(...resources) {
159
+ this.allow(['delete'], ...resources);
160
+ }
161
+ /**
162
+ * Add "deletecollection" permission for the resources.
163
+ * @param resources The resource(s) to apply to
164
+ */
165
+ allowDeleteCollection(...resources) {
166
+ this.allow(['deletecollection'], ...resources);
167
+ }
168
+ /**
169
+ * Add "get", "list", and "watch" permissions for the resources.
170
+ * @param resources The resource(s) to apply to
171
+ */
172
+ allowRead(...resources) {
173
+ this.allow(['get', 'list', 'watch'], ...resources);
174
+ }
175
+ /**
176
+ * Add "get", "list", "watch", "create", "update", "patch", "delete", and
177
+ * "deletecollection" permissions for the resources.
178
+ *
179
+ * @param resources The resource(s) to apply to
180
+ */
181
+ allowReadWrite(...resources) {
182
+ this.allow(['get', 'list', 'watch', 'create', 'update', 'patch', 'delete', 'deletecollection'], ...resources);
183
+ }
184
+ /**
185
+ * Create a RoleBinding that binds the permissions in this Role
186
+ * to a list of subjects, that will only apply this role's namespace.
187
+ * @param subjects a list of subjects to bind to
188
+ */
189
+ bind(...subjects) {
190
+ const subjectsAddress = (0, utils_1.address)(...subjects);
191
+ const binding = new rb.RoleBinding(this, `RoleBinding${subjectsAddress}`, {
192
+ metadata: {
193
+ namespace: this.metadata.namespace,
194
+ },
195
+ role: this,
196
+ });
197
+ binding.addSubjects(...subjects);
198
+ return binding;
199
+ }
200
+ synthesizeRules() {
201
+ const rules = [];
202
+ for (const rule of this._rules) {
203
+ for (const resource of rule.resources) {
204
+ rules.push({
205
+ verbs: rule.verbs,
206
+ apiGroups: [resource.apiGroup === 'core' ? '' : resource.apiGroup],
207
+ resourceNames: resource.resourceName ? [resource.resourceName] : undefined,
208
+ resources: resource.resourceType ? [resource.resourceType] : undefined,
209
+ });
210
+ }
211
+ }
212
+ return rules;
213
+ }
214
+ }
215
+ exports.Role = Role;
216
+ class ImportedClusterRole extends constructs_1.Construct {
217
+ _name;
218
+ resourceType = 'clusterroles';
219
+ constructor(scope, id, name) {
220
+ super(scope, id);
221
+ this._name = name;
222
+ }
223
+ get name() {
224
+ return this._name;
225
+ }
226
+ get apiVersion() {
227
+ return k8s.KubeClusterRole.GVK.apiVersion;
228
+ }
229
+ get apiGroup() {
230
+ return 'rbac.authorization.k8s.io';
231
+ }
232
+ get kind() {
233
+ return k8s.KubeClusterRole.GVK.kind;
234
+ }
235
+ get resourceName() {
236
+ return this.name;
237
+ }
238
+ }
239
+ /**
240
+ * ClusterRole is a cluster level, logical grouping of PolicyRules that can be
241
+ * referenced as a unit by a RoleBinding or ClusterRoleBinding.
242
+ */
243
+ class ClusterRole extends base.Resource {
244
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.ClusterRole", version: "2.0.0" };
245
+ /**
246
+ * Imports a role from the cluster as a reference.
247
+ */
248
+ static fromClusterRoleName(scope, id, name) {
249
+ return new ImportedClusterRole(scope, id, name);
250
+ }
251
+ /**
252
+ * @see base.Resource.apiObject
253
+ */
254
+ apiObject;
255
+ resourceType = 'clusterroles';
256
+ _labelSelector = {};
257
+ _rules = [];
258
+ constructor(scope, id, props = {}) {
259
+ super(scope, id);
260
+ this.apiObject = new k8s.KubeClusterRole(this, 'Resource', {
261
+ metadata: props.metadata,
262
+ rules: cdk8s_1.Lazy.any({ produce: () => this.synthesizeRules() }),
263
+ aggregationRule: cdk8s_1.Lazy.any({ produce: () => this.synthesizeAggregationRules() }),
264
+ });
265
+ for (const rule of props.rules ?? []) {
266
+ this.allow(rule.verbs, ...rule.endpoints);
267
+ }
268
+ for (const [key, value] of Object.entries(props.aggregationLabels ?? {})) {
269
+ this.aggregate(key, value);
270
+ }
271
+ }
272
+ /**
273
+ * Rules associaated with this Role.
274
+ * Returns a copy, use `allow` to add rules.
275
+ */
276
+ get rules() {
277
+ return [...this._rules];
278
+ }
279
+ /**
280
+ * Add permission to perform a list of HTTP verbs on a collection of
281
+ * resources.
282
+ *
283
+ * @param endpoints The endpoints(s) to apply to
284
+ * @see https://kubernetes.io/docs/reference/access-authn-authz/authorization/#determine-the-request-verb
285
+ */
286
+ allow(verbs, ...endpoints) {
287
+ this._rules.push({ verbs, endpoints });
288
+ }
289
+ /**
290
+ * Add "create" permission for the resources.
291
+ * @param endpoints The resource(s) to apply to
292
+ */
293
+ allowCreate(...endpoints) {
294
+ this.allow(['create'], ...endpoints);
295
+ }
296
+ /**
297
+ * Add "get" permission for the resources.
298
+ * @param endpoints The resource(s) to apply to
299
+ */
300
+ allowGet(...endpoints) {
301
+ this.allow(['get'], ...endpoints);
302
+ }
303
+ /**
304
+ * Add "list" permission for the resources.
305
+ * @param endpoints The resource(s) to apply to
306
+ */
307
+ allowList(...endpoints) {
308
+ this.allow(['list'], ...endpoints);
309
+ }
310
+ /**
311
+ * Add "watch" permission for the resources.
312
+ * @param endpoints The resource(s) to apply to
313
+ */
314
+ allowWatch(...endpoints) {
315
+ this.allow(['watch'], ...endpoints);
316
+ }
317
+ /**
318
+ * Add "update" permission for the resources.
319
+ * @param endpoints The resource(s) to apply to
320
+ */
321
+ allowUpdate(...endpoints) {
322
+ this.allow(['update'], ...endpoints);
323
+ }
324
+ /**
325
+ * Add "patch" permission for the resources.
326
+ * @param endpoints The resource(s) to apply to
327
+ */
328
+ allowPatch(...endpoints) {
329
+ this.allow(['patch'], ...endpoints);
330
+ }
331
+ /**
332
+ * Add "delete" permission for the resources.
333
+ * @param endpoints The resource(s) to apply to
334
+ */
335
+ allowDelete(...endpoints) {
336
+ this.allow(['delete'], ...endpoints);
337
+ }
338
+ /**
339
+ * Add "deletecollection" permission for the resources.
340
+ * @param endpoints The resource(s) to apply to
341
+ */
342
+ allowDeleteCollection(...endpoints) {
343
+ this.allow(['deletecollection'], ...endpoints);
344
+ }
345
+ /**
346
+ * Add "get", "list", and "watch" permissions for the resources.
347
+ * @param endpoints The resource(s) to apply to
348
+ */
349
+ allowRead(...endpoints) {
350
+ this.allow(['get', 'list', 'watch'], ...endpoints);
351
+ }
352
+ /**
353
+ * Add "get", "list", "watch", "create", "update", "patch", "delete", and
354
+ * "deletecollection" permissions for the resources.
355
+ *
356
+ * @param endpoints The resource(s) to apply to
357
+ */
358
+ allowReadWrite(...endpoints) {
359
+ this.allow(['get', 'list', 'watch', 'create', 'update', 'patch', 'delete', 'deletecollection'], ...endpoints);
360
+ }
361
+ /**
362
+ * Aggregate rules from roles matching this label selector.
363
+ */
364
+ aggregate(key, value) {
365
+ this._labelSelector[key] = value;
366
+ }
367
+ /**
368
+ * Combines the rules of the argument ClusterRole into this ClusterRole
369
+ * using aggregation labels.
370
+ * @param rol
371
+ */
372
+ combine(rol) {
373
+ const key = `cdk8s.cluster-role/aggregate-to-${cdk8s_1.Names.toLabelValue(this)}`;
374
+ const value = 'true';
375
+ rol.metadata.addLabel(key, value);
376
+ this.aggregate(key, value);
377
+ }
378
+ /**
379
+ * Create a RoleBinding that binds the permissions in this ClusterRole
380
+ * to a list of subjects, that will only apply to the given namespace.
381
+ * @param namespace the namespace to limit permissions to.
382
+ * @param subjects a list of subjects to bind to
383
+ */
384
+ bindInNamespace(namespace, ...subjects) {
385
+ const binding = new rb.RoleBinding(this, `RoleBinding-${namespace}`, {
386
+ metadata: {
387
+ namespace,
388
+ },
389
+ role: this,
390
+ });
391
+ binding.addSubjects(...subjects);
392
+ return binding;
393
+ }
394
+ /**
395
+ * Create a ClusterRoleBinding that binds the permissions in this
396
+ * ClusterRole to a list of subjects, without namespace restrictions.
397
+ * @param subjects a list of subjects to bind to
398
+ */
399
+ bind(...subjects) {
400
+ const binding = new rb.ClusterRoleBinding(this, 'ClusterRoleBinding', {
401
+ role: this,
402
+ });
403
+ binding.addSubjects(...subjects);
404
+ return binding;
405
+ }
406
+ synthesizeRules() {
407
+ const rules = [];
408
+ for (const rule of this._rules) {
409
+ for (const endpoint of rule.endpoints) {
410
+ const resource = endpoint.asApiResource();
411
+ const nonResource = endpoint.asNonApiResource();
412
+ if (resource && nonResource) {
413
+ throw new Error('Endpoint must be either resource or non resource. not both.');
414
+ }
415
+ if (!resource && !nonResource) {
416
+ throw new Error('Endpoint must be either resource or non resource. not neither.');
417
+ }
418
+ if (resource) {
419
+ rules.push({
420
+ apiGroups: [resource.apiGroup === 'core' ? '' : resource.apiGroup],
421
+ resources: [resource.resourceType],
422
+ resourceNames: resource.resourceName ? [resource.resourceName] : [],
423
+ verbs: rule.verbs,
424
+ });
425
+ }
426
+ if (nonResource) {
427
+ rules.push({ verbs: rule.verbs, nonResourceUrLs: [nonResource] });
428
+ }
429
+ }
430
+ }
431
+ return rules;
432
+ }
433
+ synthesizeAggregationRules() {
434
+ if (Object.keys(this._labelSelector).length === 0) {
435
+ return undefined;
436
+ }
437
+ return { clusterRoleSelectors: [{ matchLabels: this._labelSelector }] };
438
+ }
439
+ }
440
+ exports.ClusterRole = ClusterRole;
441
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQ0FBK0M7QUFDL0MsMkNBQXVDO0FBRXZDLDZDQUErQjtBQUMvQixtREFBcUM7QUFDckMsbURBQXFDO0FBQ3JDLG1DQUFrQztBQXNDbEMsTUFBTSxZQUFhLFNBQVEsc0JBQVM7SUFFakIsS0FBSyxDQUFTO0lBRWYsWUFBWSxHQUFHLE9BQU8sQ0FBQztJQUV2QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLElBQVk7UUFDcEQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7SUFDckMsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLDJCQUEyQixDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0NBRUY7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLElBQUssU0FBUSxJQUFJLENBQUMsUUFBUTs7SUFFckM7O09BRUc7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLElBQVk7UUFDbkUsT0FBTyxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lB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Q0FBQztnQkFFRCxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNiLEtBQUssQ0FBQyxJQUFJLENBQUM7d0JBQ1QsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQzt3QkFDbEUsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQzt3QkFDbEMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUNuRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7cUJBQ2xCLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BFLENBQUM7WUFDSCxDQUFDO1FBRUgsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLDBCQUEwQjtRQUNoQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMxRSxDQUFDOztBQWpPSCxrQ0FrT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcGlPYmplY3QsIExhenksIE5hbWVzIH0gZnJvbSAnY2RrOHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJQXBpUmVzb3VyY2UsIElBcGlFbmRwb2ludCB9IGZyb20gJy4vYXBpLXJlc291cmNlJztcbmltcG9ydCAqIGFzIGJhc2UgZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIGs4cyBmcm9tICcuL2ltcG9ydHMvazhzJztcbmltcG9ydCAqIGFzIHJiIGZyb20gJy4vcm9sZS1iaW5kaW5nJztcbmltcG9ydCB7IGFkZHJlc3MgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byBhbnkgUm9sZSBvciBDbHVzdGVyUm9sZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUm9sZSBleHRlbmRzIGJhc2UuSVJlc291cmNlIHtcblxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGBSb2xlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlUHJvcHMgZXh0ZW5kcyBiYXNlLlJlc291cmNlUHJvcHMge1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgcnVsZXMgdGhlIHJvbGUgc2hvdWxkIGFsbG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgcmVhZG9ubHkgcnVsZXM/OiBSb2xlUG9saWN5UnVsZVtdO1xufVxuXG4vKipcbiAqIFBvbGljeSBydWxlIG9mIGEgYFJvbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZVBvbGljeVJ1bGUge1xuXG4gIC8qKlxuICAgKiBWZXJicyB0byBhbGxvdy4gKGUuZyBbJ2dldCcsICd3YXRjaCddKVxuICAgKi9cbiAgcmVhZG9ubHkgdmVyYnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZXMgdGhpcyBydWxlIGFwcGxpZXMgdG8uXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZXM6IElBcGlSZXNvdXJjZVtdO1xufVxuXG5jbGFzcyBJbXBvcnRlZFJvbGUgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJUm9sZSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZVR5cGUgPSAncm9sZXMnO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBrOHMuS3ViZVJvbGUuR1ZLLmFwaVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUdyb3VwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdyYmFjLmF1dGhvcml6YXRpb24uazhzLmlvJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQga2luZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBrOHMuS3ViZVJvbGUuR1ZLLmtpbmQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc291cmNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxufVxuXG4vKipcbiAqIFJvbGUgaXMgYSBuYW1lc3BhY2VkLCBsb2dpY2FsIGdyb3VwaW5nIG9mIFBvbGljeVJ1bGVzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWRcbiAqIGFzIGEgdW5pdCBieSBhIFJvbGVCaW5kaW5nLlxuICovXG5leHBvcnQgY2xhc3MgUm9sZSBleHRlbmRzIGJhc2UuUmVzb3VyY2UgaW1wbGVtZW50cyBJUm9sZSB7XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYSByb2xlIGZyb20gdGhlIGNsdXN0ZXIgYXMgYSByZWZlcmVuY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Sb2xlTmFtZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBJUm9sZSB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZFJvbGUoc2NvcGUsIGlkLCBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGJhc2UuUmVzb3VyY2UuYXBpT2JqZWN0XG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBpT2JqZWN0OiBBcGlPYmplY3Q7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlVHlwZSA9ICdyb2xlcyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcnVsZXM6IEFycmF5PFJvbGVQb2xpY3lSdWxlPiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSb2xlUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmFwaU9iamVjdCA9IG5ldyBrOHMuS3ViZVJvbGUodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbWV0YWRhdGE6IHByb3BzLm1ldGFkYXRhLFxuICAgICAgcnVsZXM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy5zeW50aGVzaXplUnVsZXMoKSB9KSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgcnVsZSBvZiBwcm9wcy5ydWxlcyA/PyBbXSkge1xuICAgICAgdGhpcy5hbGxvdyhydWxlLnZlcmJzLCAuLi5ydWxlLnJlc291cmNlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bGVzIGFzc29jaWFhdGVkIHdpdGggdGhpcyBSb2xlLlxuICAgKiBSZXR1cm5zIGEgY29weSwgdXNlIGBhbGxvd2AgdG8gYWRkIHJ1bGVzLlxuICAgKi9cbiAgcHVibGljIGdldCBydWxlcygpOiBSb2xlUG9saWN5UnVsZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3J1bGVzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgcGVybWlzc2lvbiB0byBwZXJmb3JtIGEgbGlzdCBvZiBIVFRQIHZlcmJzIG9uIGEgY29sbGVjdGlvbiBvZlxuICAgKiByZXNvdXJjZXMuXG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIHJlc291cmNlKHMpIHRvIGFwcGx5IHRvXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvcmVmZXJlbmNlL2FjY2Vzcy1hdXRobi1hdXRoei9hdXRob3JpemF0aW9uLyNkZXRlcm1pbmUtdGhlLXJlcXVlc3QtdmVyYlxuICAgKi9cbiAgcHVibGljIGFsbG93KHZlcmJzOiBzdHJpbmdbXSwgLi4ucmVzb3VyY2VzOiBJQXBpUmVzb3VyY2VbXSk6IHZvaWQge1xuICAgIHRoaXMuX3J1bGVzLnB1c2goeyB2ZXJicywgcmVzb3VyY2VzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBcImNyZWF0ZVwiIHBlcm1pc3Npb24gZm9yIHRoZSByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIHJlc291cmNlKHMpIHRvIGFwcGx5IHRvXG4gICAqL1xuICBwdWJsaWMgYWxsb3dDcmVhdGUoLi4ucmVzb3VyY2VzOiBJQXBpUmVzb3VyY2VbXSk6IHZvaWQge1xuICAgIHRoaXMuYWxsb3coWydjcmVhdGUnXSwgLi4ucmVzb3VyY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgXCJnZXRcIiBwZXJtaXNzaW9uIGZvciB0aGUgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSByZXNvdXJjZShzKSB0byBhcHBseSB0b1xuICAgKi9cbiAgcHVibGljIGFsbG93R2V0KC4uLnJlc291cmNlczogSUFwaVJlc291cmNlW10pOiB2b2lkIHtcbiAgICB0aGlzLmFsbG93KFsnZ2V0J10sIC4uLnJlc291cmNlcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFwibGlzdFwiIHBlcm1pc3Npb24gZm9yIHRoZSByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIHJlc291cmNlKHMpIHRvIGFwcGx5IHRvXG4gICAqL1xuICBwdWJsaWMgYWxsb3dMaXN0KC4uLnJlc291cmNlczogSUFwaVJlc291cmNlW10pOiB2b2lkIHtcbiAgICB0aGlzLmFsbG93KFsnbGlzdCddLCAuLi5yZXNvdXJjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBcIndhdGNoXCIgcGVybWlzc2lvbiBmb3IgdGhlIHJlc291cmNlcy5cbiAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgcmVzb3VyY2UocykgdG8gYXBwbHkgdG9cbiAgICovXG4gIHB1YmxpYyBhbGxvd1dhdGNoKC4uLnJlc291cmNlczogSUFwaVJlc291cmNlW10pOiB2b2lkIHtcbiAgICB0aGlzLmFsbG93KFsnd2F0Y2gnXSwgLi4ucmVzb3VyY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgXCJ1cGRhdGVcIiBwZXJtaXNzaW9uIGZvciB0aGUgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSByZXNvdXJjZShzKSB0byBhcHBseSB0b1xuICAgKi9cbiAgcHVibGljIGFsbG93VXBkYXRlKC4uLnJlc291cmNlczogSUFwaVJlc291cmNlW10pOiB2b2lkIHtcbiAgICB0aGlzLmFsbG93KFsndXBkYXRlJ10sIC4uLnJlc291cmNlcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFwicGF0Y2hcIiBwZXJtaXNzaW9uIGZvciB0aGUgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSByZXNvdXJjZShzKSB0byBhcHBseSB0b1xuICAgKi9cbiAgcHVibGljIGFsbG93UGF0Y2goLi4ucmVzb3VyY2VzOiBJQXBpUmVzb3VyY2VbXSk6IHZvaWQge1xuICAgIHRoaXMuYWxsb3coWydwYXRjaCddLCAuLi5yZXNvdXJjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBcImRlbGV0ZVwiIHBlcm1pc3Npb24gZm9yIHRoZSByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIHJlc291cmNlKHMpIHRvIGFwcGx5IHRvXG4gICAqL1xuICBwdWJsaWMgYWxsb3dEZWxldGUoLi4ucmVzb3VyY2VzOiBJQXBpUmVzb3VyY2VbXSk6IHZvaWQge1xuICAgIHRoaXMuYWxsb3coWydkZWxldGUnXSwgLi4ucmVzb3VyY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgXCJkZWxldGVjb2xsZWN0aW9uXCIgcGVybWlzc2lvbiBmb3IgdGhlIHJlc291cmNlcy5cbiAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgcmVzb3VyY2UocykgdG8gYXBwbHkgdG9cbiAgICovXG4gIHB1YmxpYyBhbGxvd0RlbGV0ZUNvbGxlY3Rpb24oLi4ucmVzb3VyY2VzOiBJQXBpUmVzb3VyY2VbXSk6IHZvaWQge1xuICAgIHRoaXMuYWxsb3coWydkZWxldGVjb2xsZWN0aW9uJ10sIC4uLnJlc291cmNlcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFwiZ2V0XCIsIFwibGlzdFwiLCBhbmQgXCJ3YXRjaFwiIHBlcm1pc3Npb25zIGZvciB0aGUgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSByZXNvdXJjZShzKSB0byBhcHBseSB0b1xuICAgKi9cbiAgcHVibGljIGFsbG93UmVhZCguLi5yZXNvdXJjZXM6IElBcGlSZXNvdXJjZVtdKTogdm9pZCB7XG4gICAgdGhpcy5hbGxvdyhbJ2dldCcsICdsaXN0JywgJ3dhdGNoJ10sIC4uLnJlc291cmNlcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFwiZ2V0XCIsIFwibGlzdFwiLCBcIndhdGNoXCIsIFwiY3JlYXRlXCIsIFwidXBkYXRlXCIsIFwicGF0Y2hcIiwgXCJkZWxldGVcIiwgYW5kXG4gICAqIFwiZGVsZXRlY29sbGVjdGlvblwiIHBlcm1pc3Npb25zIGZvciB0aGUgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSByZXNvdXJjZShzKSB0byBhcHBseSB0b1xuICAgKi9cbiAgcHVibGljIGFsbG93UmVhZFdyaXRlKC4uLnJlc291cmNlczogSUFwaVJlc291cmNlW10pOiB2b2lkIHtcbiAgICB0aGlzLmFsbG93KFsnZ2V0JywgJ2xpc3QnLCAnd2F0Y2gnLCAnY3JlYXRlJywgJ3VwZGF0ZScsICdwYXRjaCcsICdkZWxldGUnLCAnZGVsZXRlY29sbGVjdGlvbiddLCAuLi5yZXNvdXJjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFJvbGVCaW5kaW5nIHRoYXQgYmluZHMgdGhlIHBlcm1pc3Npb25zIGluIHRoaXMgUm9sZVxuICAgKiB0byBhIGxpc3Qgb2Ygc3ViamVjdHMsIHRoYXQgd2lsbCBvbmx5IGFwcGx5IHRoaXMgcm9sZSdzIG5hbWVzcGFjZS5cbiAgICogQHBhcmFtIHN1YmplY3RzIGEgbGlzdCBvZiBzdWJqZWN0cyB0byBiaW5kIHRvXG4gICAqL1xuICBwdWJsaWMgYmluZCguLi5zdWJqZWN0czogcmIuSVN1YmplY3RbXSk6IHJiLlJvbGVCaW5kaW5nIHtcbiAgICBjb25zdCBzdWJqZWN0c0FkZHJlc3MgPSBhZGRyZXNzKC4uLnN1YmplY3RzKTtcbiAgICBjb25zdCBiaW5kaW5nID0gbmV3IHJiLlJvbGVCaW5kaW5nKHRoaXMsIGBSb2xlQmluZGluZyR7c3ViamVjdHNBZGRyZXNzfWAsIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIG5hbWVzcGFjZTogdGhpcy5tZXRhZGF0YS5uYW1lc3BhY2UsXG4gICAgICB9LFxuICAgICAgcm9sZTogdGhpcyxcbiAgICB9KTtcbiAgICBiaW5kaW5nLmFkZFN1YmplY3RzKC4uLnN1YmplY3RzKTtcbiAgICByZXR1cm4gYmluZGluZztcbiAgfVxuXG4gIHByaXZhdGUgc3ludGhlc2l6ZVJ1bGVzKCk6IGs4cy5Qb2xpY3lSdWxlW10ge1xuICAgIGNvbnN0IHJ1bGVzOiBrOHMuUG9saWN5UnVsZVtdID0gW107XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHRoaXMuX3J1bGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJ1bGUucmVzb3VyY2VzKSB7XG4gICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgIHZlcmJzOiBydWxlLnZlcmJzLFxuICAgICAgICAgIGFwaUdyb3VwczogW3Jlc291cmNlLmFwaUdyb3VwID09PSAnY29yZScgPyAnJyA6IHJlc291cmNlLmFwaUdyb3VwXSxcbiAgICAgICAgICByZXNvdXJjZU5hbWVzOiByZXNvdXJjZS5yZXNvdXJjZU5hbWUgPyBbcmVzb3VyY2UucmVzb3VyY2VOYW1lXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlLnJlc291cmNlVHlwZSA/IFtyZXNvdXJjZS5yZXNvdXJjZVR5cGVdIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ1bGVzO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNsdXN0ZXItbGV2ZWwgcm9sZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ2x1c3RlclJvbGUgZXh0ZW5kcyBiYXNlLklSZXNvdXJjZSB7XG5cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBgQ2x1c3RlclJvbGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsdXN0ZXJSb2xlUHJvcHMgZXh0ZW5kcyBiYXNlLlJlc291cmNlUHJvcHMge1xuXG4gIC8qKlxuICAgICogQSBsaXN0IG9mIHJ1bGVzIHRoZSByb2xlIHNob3VsZCBhbGxvdy5cbiAgICAqXG4gICAgKiBAZGVmYXVsdCBbXVxuICAgICovXG4gIHJlYWRvbmx5IHJ1bGVzPzogQ2x1c3RlclJvbGVQb2xpY3lSdWxlW107XG5cbiAgLyoqXG4gICAgKiBTcGVjaWZ5IGxhYmVscyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGxvY2F0ZSBDbHVzdGVyUm9sZXMsIHdob3NlIHJ1bGVzXG4gICAgKiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZmlsbGVkIGludG8gdGhpcyBDbHVzdGVyUm9sZSdzIHJ1bGVzLlxuICAgICovXG4gIHJlYWRvbmx5IGFnZ3JlZ2F0aW9uTGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBQb2xpY3kgcnVsZSBvZiBhIGBDbHVzdGVyUm9sZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbHVzdGVyUm9sZVBvbGljeVJ1bGUge1xuXG4gIC8qKlxuICAgKiBWZXJicyB0byBhbGxvdy4gKGUuZyBbJ2dldCcsICd3YXRjaCddKVxuICAgKi9cbiAgcmVhZG9ubHkgdmVyYnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBFbmRwb2ludHMgdGhpcyBydWxlIGFwcGxpZXMgdG8uIENhbiBiZSBlaXRoZXIgYXBpIHJlc291cmNlc1xuICAgKiBvciBub24gYXBpIHJlc291cmNlcy5cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50czogSUFwaUVuZHBvaW50W107XG59XG5cbmNsYXNzIEltcG9ydGVkQ2x1c3RlclJvbGUgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ2x1c3RlclJvbGUge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX25hbWU6IHN0cmluZztcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2VUeXBlOiBzdHJpbmcgPSAnY2x1c3RlcnJvbGVzJztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gazhzLkt1YmVDbHVzdGVyUm9sZS5HVksuYXBpVmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpR3JvdXAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ3JiYWMuYXV0aG9yaXphdGlvbi5rOHMuaW8nO1xuICB9XG5cbiAgcHVibGljIGdldCBraW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGs4cy5LdWJlQ2x1c3RlclJvbGUuR1ZLLmtpbmQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc291cmNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxufVxuXG4vKipcbiAqIENsdXN0ZXJSb2xlIGlzIGEgY2x1c3RlciBsZXZlbCwgbG9naWNhbCBncm91cGluZyBvZiBQb2xpY3lSdWxlcyB0aGF0IGNhbiBiZVxuICogcmVmZXJlbmNlZCBhcyBhIHVuaXQgYnkgYSBSb2xlQmluZGluZyBvciBDbHVzdGVyUm9sZUJpbmRpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbHVzdGVyUm9sZSBleHRlbmRzIGJhc2UuUmVzb3VyY2UgaW1wbGVtZW50cyBJQ2x1c3RlclJvbGUsIElSb2xlIHtcblxuICAvKipcbiAgICogSW1wb3J0cyBhIHJvbGUgZnJvbSB0aGUgY2x1c3RlciBhcyBhIHJlZmVyZW5jZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNsdXN0ZXJSb2xlTmFtZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBJQ2x1c3RlclJvbGUge1xuICAgIHJldHVybiBuZXcgSW1wb3J0ZWRDbHVzdGVyUm9sZShzY29wZSwgaWQsIG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgYmFzZS5SZXNvdXJjZS5hcGlPYmplY3RcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcGlPYmplY3Q6IEFwaU9iamVjdDtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2VUeXBlID0gJ2NsdXN0ZXJyb2xlcyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbGFiZWxTZWxlY3RvcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IF9ydWxlczogQXJyYXk8Q2x1c3RlclJvbGVQb2xpY3lSdWxlPiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbHVzdGVyUm9sZVByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5hcGlPYmplY3QgPSBuZXcgazhzLkt1YmVDbHVzdGVyUm9sZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBtZXRhZGF0YTogcHJvcHMubWV0YWRhdGEsXG4gICAgICBydWxlczogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLnN5bnRoZXNpemVSdWxlcygpIH0pLFxuICAgICAgYWdncmVnYXRpb25SdWxlOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMuc3ludGhlc2l6ZUFnZ3JlZ2F0aW9uUnVsZXMoKSB9KSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgcnVsZSBvZiBwcm9wcy5ydWxlcyA/PyBbXSkge1xuICAgICAgdGhpcy5hbGxvdyhydWxlLnZlcmJzLCAuLi5ydWxlLmVuZHBvaW50cyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMuYWdncmVnYXRpb25MYWJlbHMgPz8ge30pKSB7XG4gICAgICB0aGlzLmFnZ3JlZ2F0ZShrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVsZXMgYXNzb2NpYWF0ZWQgd2l0aCB0aGlzIFJvbGUuXG4gICAqIFJldHVybnMgYSBjb3B5LCB1c2UgYGFsbG93YCB0byBhZGQgcnVsZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJ1bGVzKCk6IENsdXN0ZXJSb2xlUG9saWN5UnVsZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3J1bGVzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgcGVybWlzc2lvbiB0byBwZXJmb3JtIGEgbGlzdCBvZiBIVFRQIHZlcmJzIG9uIGEgY29sbGVjdGlvbiBvZlxuICAgKiByZXNvdXJjZXMuXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludHMgVGhlIGVuZHBvaW50cyhzKSB0byBhcHBseSB0b1xuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL3JlZmVyZW5jZS9hY2Nlc3MtYXV0aG4tYXV0aHovYXV0aG9yaXphdGlvbi8jZGV0ZXJtaW5lLXRoZS1yZXF1ZXN0LXZlcmJcbiAgICovXG4gIHB1YmxpYyBhbGxvdyh2ZXJiczogc3RyaW5nW10sIC4uLmVuZHBvaW50czogSUFwaUVuZHBvaW50W10pOiB2b2lkIHtcbiAgICB0aGlzLl9ydWxlcy5wdXNoKHsgdmVyYnMsIGVuZHBvaW50cyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgXCJjcmVhdGVcIiBwZXJtaXNzaW9uIGZvciB0aGUgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0gZW5kcG9pbnRzIFRoZSByZXNvdXJjZShzKSB0byBhcHBseSB0b1xuICAgKi9cbiAgcHVibGljIGFsbG93Q3JlYXRlKC4uLmVuZHBvaW50czogSUFwaUVuZHBvaW50W10pOiB2b2lkIHtcbiAgICB0aGlzLmFsbG93KFsnY3JlYXRlJ10sIC4uLmVuZHBvaW50cyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFwiZ2V0XCIgcGVybWlzc2lvbiBmb3IgdGhlIHJlc291cmNlcy5cbiAgICogQHBhcmFtIGVuZHBvaW50cyBUaGUgcmVzb3VyY2UocykgdG8gYXBwbHkgdG9cbiAgICovXG4gIHB1YmxpYyBhbGxvd0dldCguLi5lbmRwb2ludHM6IElBcGlFbmRwb2ludFtdKTogdm9pZCB7XG4gICAgdGhpcy5hbGxvdyhbJ2dldCddLCAuLi5lbmRwb2ludHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBcImxpc3RcIiBwZXJtaXNzaW9uIGZvciB0aGUgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0gZW5kcG9pbnRzIFRoZSByZXNvdXJjZShzKSB0byBhcHBseSB0b1xuICAgKi9cbiAgcHVibGljIGFsbG93TGlzdCguLi5lbmRwb2ludHM6IElBcGlFbmRwb2ludFtdKTogdm9pZCB7XG4gICAgdGhpcy5hbGxvdyhbJ2xpc3QnXSwgLi4uZW5kcG9pbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgXCJ3YXRjaFwiIHBlcm1pc3Npb24gZm9yIHRoZSByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSBlbmRwb2ludHMgVGhlIHJlc291cmNlKHMpIHRvIGFwcGx5IHRvXG4gICAqL1xuICBwdWJsaWMgYWxsb3dXYXRjaCguLi5lbmRwb2ludHM6IElBcGlFbmRwb2ludFtdKTogdm9pZCB7XG4gICAgdGhpcy5hbGxvdyhbJ3dhdGNoJ10sIC4uLmVuZHBvaW50cyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFwidXBkYXRlXCIgcGVybWlzc2lvbiBmb3IgdGhlIHJlc291cmNlcy5cbiAgICogQHBhcmFtIGVuZHBvaW50cyBUaGUgcmVzb3VyY2UocykgdG8gYXBwbHkgdG9cbiAgICovXG4gIHB1YmxpYyBhbGxvd1VwZGF0ZSguLi5lbmRwb2ludHM6IElBcGlFbmRwb2ludFtdKTogdm9pZCB7XG4gICAgdGhpcy5hbGxvdyhbJ3VwZGF0ZSddLCAuLi5lbmRwb2ludHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBcInBhdGNoXCIgcGVybWlzc2lvbiBmb3IgdGhlIHJlc291cmNlcy5cbiAgICogQHBhcmFtIGVuZHBvaW50cyBUaGUgcmVzb3VyY2UocykgdG8gYXBwbHkgdG9cbiAgICovXG4gIHB1YmxpYyBhbGxvd1BhdGNoKC4uLmVuZHBvaW50czogSUFwaUVuZHBvaW50W10pOiB2b2lkIHtcbiAgICB0aGlzLmFsbG93KFsncGF0Y2gnXSwgLi4uZW5kcG9pbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgXCJkZWxldGVcIiBwZXJtaXNzaW9uIGZvciB0aGUgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0gZW5kcG9pbnRzIFRoZSByZXNvdXJjZShzKSB0byBhcHBseSB0b1xuICAgKi9cbiAgcHVibGljIGFsbG93RGVsZXRlKC4uLmVuZHBvaW50czogSUFwaUVuZHBvaW50W10pOiB2b2lkIHtcbiAgICB0aGlzLmFsbG93KFsnZGVsZXRlJ10sIC4uLmVuZHBvaW50cyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFwiZGVsZXRlY29sbGVjdGlvblwiIHBlcm1pc3Npb24gZm9yIHRoZSByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSBlbmRwb2ludHMgVGhlIHJlc291cmNlKHMpIHRvIGFwcGx5IHRvXG4gICAqL1xuICBwdWJsaWMgYWxsb3dEZWxldGVDb2xsZWN0aW9uKC4uLmVuZHBvaW50czogSUFwaUVuZHBvaW50W10pOiB2b2lkIHtcbiAgICB0aGlzLmFsbG93KFsnZGVsZXRlY29sbGVjdGlvbiddLCAuLi5lbmRwb2ludHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBcImdldFwiLCBcImxpc3RcIiwgYW5kIFwid2F0Y2hcIiBwZXJtaXNzaW9ucyBmb3IgdGhlIHJlc291cmNlcy5cbiAgICogQHBhcmFtIGVuZHBvaW50cyBUaGUgcmVzb3VyY2UocykgdG8gYXBwbHkgdG9cbiAgICovXG4gIHB1YmxpYyBhbGxvd1JlYWQoLi4uZW5kcG9pbnRzOiBJQXBpRW5kcG9pbnRbXSk6IHZvaWQge1xuICAgIHRoaXMuYWxsb3coWydnZXQnLCAnbGlzdCcsICd3YXRjaCddLCAuLi5lbmRwb2ludHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBcImdldFwiLCBcImxpc3RcIiwgXCJ3YXRjaFwiLCBcImNyZWF0ZVwiLCBcInVwZGF0ZVwiLCBcInBhdGNoXCIsIFwiZGVsZXRlXCIsIGFuZFxuICAgKiBcImRlbGV0ZWNvbGxlY3Rpb25cIiBwZXJtaXNzaW9ucyBmb3IgdGhlIHJlc291cmNlcy5cbiAgICpcbiAgICogQHBhcmFtIGVuZHBvaW50cyBUaGUgcmVzb3VyY2UocykgdG8gYXBwbHkgdG9cbiAgICovXG4gIHB1YmxpYyBhbGxvd1JlYWRXcml0ZSguLi5lbmRwb2ludHM6IElBcGlFbmRwb2ludFtdKTogdm9pZCB7XG4gICAgdGhpcy5hbGxvdyhbJ2dldCcsICdsaXN0JywgJ3dhdGNoJywgJ2NyZWF0ZScsICd1cGRhdGUnLCAncGF0Y2gnLCAnZGVsZXRlJywgJ2RlbGV0ZWNvbGxlY3Rpb24nXSwgLi4uZW5kcG9pbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZ2dyZWdhdGUgcnVsZXMgZnJvbSByb2xlcyBtYXRjaGluZyB0aGlzIGxhYmVsIHNlbGVjdG9yLlxuICAgKi9cbiAgcHVibGljIGFnZ3JlZ2F0ZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2xhYmVsU2VsZWN0b3Jba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmVzIHRoZSBydWxlcyBvZiB0aGUgYXJndW1lbnQgQ2x1c3RlclJvbGUgaW50byB0aGlzIENsdXN0ZXJSb2xlXG4gICAqIHVzaW5nIGFnZ3JlZ2F0aW9uIGxhYmVscy5cbiAgICogQHBhcmFtIHJvbFxuICAgKi9cbiAgcHVibGljIGNvbWJpbmUocm9sOiBDbHVzdGVyUm9sZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGBjZGs4cy5jbHVzdGVyLXJvbGUvYWdncmVnYXRlLXRvLSR7TmFtZXMudG9MYWJlbFZhbHVlKHRoaXMpfWA7XG4gICAgY29uc3QgdmFsdWUgPSAndHJ1ZSc7XG4gICAgcm9sLm1ldGFkYXRhLmFkZExhYmVsKGtleSwgdmFsdWUpO1xuICAgIHRoaXMuYWdncmVnYXRlKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFJvbGVCaW5kaW5nIHRoYXQgYmluZHMgdGhlIHBlcm1pc3Npb25zIGluIHRoaXMgQ2x1c3RlclJvbGVcbiAgICogdG8gYSBsaXN0IG9mIHN1YmplY3RzLCB0aGF0IHdpbGwgb25seSBhcHBseSB0byB0aGUgZ2l2ZW4gbmFtZXNwYWNlLlxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIHRoZSBuYW1lc3BhY2UgdG8gbGltaXQgcGVybWlzc2lvbnMgdG8uXG4gICAqIEBwYXJhbSBzdWJqZWN0cyBhIGxpc3Qgb2Ygc3ViamVjdHMgdG8gYmluZCB0b1xuICAgKi9cbiAgcHVibGljIGJpbmRJbk5hbWVzcGFjZShuYW1lc3BhY2U6IHN0cmluZywgLi4uc3ViamVjdHM6IHJiLklTdWJqZWN0W10pOiByYi5Sb2xlQmluZGluZyB7XG4gICAgY29uc3QgYmluZGluZyA9IG5ldyByYi5Sb2xlQmluZGluZyh0aGlzLCBgUm9sZUJpbmRpbmctJHtuYW1lc3BhY2V9YCwge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICAgIHJvbGU6IHRoaXMsXG4gICAgfSk7XG4gICAgYmluZGluZy5hZGRTdWJqZWN0cyguLi5zdWJqZWN0cyk7XG4gICAgcmV0dXJuIGJpbmRpbmc7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2x1c3RlclJvbGVCaW5kaW5nIHRoYXQgYmluZHMgdGhlIHBlcm1pc3Npb25zIGluIHRoaXNcbiAgICogQ2x1c3RlclJvbGUgdG8gYSBsaXN0IG9mIHN1YmplY3RzLCB3aXRob3V0IG5hbWVzcGFjZSByZXN0cmljdGlvbnMuXG4gICAqIEBwYXJhbSBzdWJqZWN0cyBhIGxpc3Qgb2Ygc3ViamVjdHMgdG8gYmluZCB0b1xuICAgKi9cbiAgcHVibGljIGJpbmQoLi4uc3ViamVjdHM6IHJiLklTdWJqZWN0W10pOiByYi5DbHVzdGVyUm9sZUJpbmRpbmcge1xuICAgIGNvbnN0IGJpbmRpbmcgPSBuZXcgcmIuQ2x1c3RlclJvbGVCaW5kaW5nKHRoaXMsICdDbHVzdGVyUm9sZUJpbmRpbmcnLCB7XG4gICAgICByb2xlOiB0aGlzLFxuICAgIH0pO1xuICAgIGJpbmRpbmcuYWRkU3ViamVjdHMoLi4uc3ViamVjdHMpO1xuICAgIHJldHVybiBiaW5kaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW50aGVzaXplUnVsZXMoKTogazhzLlBvbGljeVJ1bGVbXSB7XG4gICAgY29uc3QgcnVsZXM6IGs4cy5Qb2xpY3lSdWxlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgdGhpcy5fcnVsZXMpIHtcbiAgICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgcnVsZS5lbmRwb2ludHMpIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBlbmRwb2ludC5hc0FwaVJlc291cmNlKCk7XG4gICAgICAgIGNvbnN0IG5vblJlc291cmNlID0gZW5kcG9pbnQuYXNOb25BcGlSZXNvdXJjZSgpO1xuXG4gICAgICAgIGlmIChyZXNvdXJjZSAmJiBub25SZXNvdXJjZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW5kcG9pbnQgbXVzdCBiZSBlaXRoZXIgcmVzb3VyY2Ugb3Igbm9uIHJlc291cmNlLiBub3QgYm90aC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVzb3VyY2UgJiYgIW5vblJlc291cmNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmRwb2ludCBtdXN0IGJlIGVpdGhlciByZXNvdXJjZSBvciBub24gcmVzb3VyY2UuIG5vdCBuZWl0aGVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc291cmNlKSB7XG4gICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICBhcGlHcm91cHM6IFtyZXNvdXJjZS5hcGlHcm91cCA9PT0gJ2NvcmUnID8gJycgOiByZXNvdXJjZS5hcGlHcm91cF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFtyZXNvdXJjZS5yZXNvdXJjZVR5cGVdLFxuICAgICAgICAgICAgcmVzb3VyY2VOYW1lczogcmVzb3VyY2UucmVzb3VyY2VOYW1lID8gW3Jlc291cmNlLnJlc291cmNlTmFtZV0gOiBbXSxcbiAgICAgICAgICAgIHZlcmJzOiBydWxlLnZlcmJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub25SZXNvdXJjZSkge1xuICAgICAgICAgIHJ1bGVzLnB1c2goeyB2ZXJiczogcnVsZS52ZXJicywgbm9uUmVzb3VyY2VVckxzOiBbbm9uUmVzb3VyY2VdIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIHJ1bGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW50aGVzaXplQWdncmVnYXRpb25SdWxlcygpOiBrOHMuQWdncmVnYXRpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fbGFiZWxTZWxlY3RvcikubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsdXN0ZXJSb2xlU2VsZWN0b3JzOiBbeyBtYXRjaExhYmVsczogdGhpcy5fbGFiZWxTZWxlY3RvciB9XSB9O1xuICB9XG59XG4iXX0=