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
@@ -0,0 +1,291 @@
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.StatefulSetUpdateStrategy = exports.StatefulSet = exports.PodManagementPolicy = void 0;
37
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
+ const cdk8s_1 = require("cdk8s");
39
+ const container = __importStar(require("./container"));
40
+ const k8s = __importStar(require("./imports/k8s"));
41
+ const k8s_1 = require("./imports/k8s");
42
+ const service = __importStar(require("./service"));
43
+ const workload = __importStar(require("./workload"));
44
+ /**
45
+ * Controls how pods are created during initial scale up, when replacing pods on nodes,
46
+ * or when scaling down.
47
+ *
48
+ * The default policy is `OrderedReady`, where pods are created in increasing order
49
+ * (pod-0, then pod-1, etc) and the controller will wait until each pod is ready before
50
+ * continuing. When scaling down, the pods are removed in the opposite order.
51
+ *
52
+ * The alternative policy is `Parallel` which will create pods in parallel to match the
53
+ * desired scale without waiting, and on scale down will delete all pods at once.
54
+ */
55
+ var PodManagementPolicy;
56
+ (function (PodManagementPolicy) {
57
+ PodManagementPolicy["ORDERED_READY"] = "OrderedReady";
58
+ PodManagementPolicy["PARALLEL"] = "Parallel";
59
+ })(PodManagementPolicy || (exports.PodManagementPolicy = PodManagementPolicy = {}));
60
+ /**
61
+ * StatefulSet is the workload API object used to manage stateful applications.
62
+ *
63
+ * Manages the deployment and scaling of a set of Pods, and provides guarantees
64
+ * about the ordering and uniqueness of these Pods.
65
+ *
66
+ * Like a Deployment, a StatefulSet manages Pods that are based on an identical
67
+ * container spec. Unlike a Deployment, a StatefulSet maintains a sticky identity
68
+ * for each of their Pods. These pods are created from the same spec, but are not
69
+ * interchangeable: each has a persistent identifier that it maintains across any
70
+ * rescheduling.
71
+ *
72
+ * If you want to use storage volumes to provide persistence for your workload, you
73
+ * can use a StatefulSet as part of the solution. Although individual Pods in a StatefulSet
74
+ * are susceptible to failure, the persistent Pod identifiers make it easier to match existing
75
+ * volumes to the new Pods that replace any that have failed.
76
+ *
77
+ * Using StatefulSets
78
+ * ------------------
79
+ * StatefulSets are valuable for applications that require one or more of the following.
80
+ *
81
+ * - Stable, unique network identifiers.
82
+ * - Stable, persistent storage.
83
+ * - Ordered, graceful deployment and scaling.
84
+ * - Ordered, automated rolling updates.
85
+ */
86
+ class StatefulSet extends workload.Workload {
87
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.StatefulSet", version: "2.0.0" };
88
+ /**
89
+ * Number of desired pods.
90
+ */
91
+ replicas;
92
+ /**
93
+ * Management policy to use for the set.
94
+ */
95
+ podManagementPolicy;
96
+ /**
97
+ * The update startegy of this stateful set.
98
+ */
99
+ strategy;
100
+ /**
101
+ * Minimum duration for which a newly created pod should be ready without
102
+ * any of its container crashing, for it to be considered available.
103
+ */
104
+ minReady;
105
+ /**
106
+ * @see base.Resource.apiObject
107
+ */
108
+ apiObject;
109
+ resourceType = 'statefulsets';
110
+ hasAutoscaler = false;
111
+ service;
112
+ volumeClaimTemplates;
113
+ constructor(scope, id, props) {
114
+ super(scope, id, props);
115
+ this.apiObject = new k8s.KubeStatefulSet(this, 'Resource', {
116
+ metadata: props.metadata,
117
+ spec: cdk8s_1.Lazy.any({ produce: () => this._toKube() }),
118
+ });
119
+ this.service = props.service ?? this._createHeadlessService();
120
+ this.apiObject.addDependency(this.service);
121
+ this.replicas = props.replicas;
122
+ this.strategy = props.strategy ?? StatefulSetUpdateStrategy.rollingUpdate();
123
+ this.podManagementPolicy = props.podManagementPolicy ?? PodManagementPolicy.ORDERED_READY;
124
+ this.minReady = props.minReady ?? cdk8s_1.Duration.seconds(0);
125
+ props?.volumeClaimTemplates?.forEach(template => this.addVolumeClaimTemplate(template));
126
+ this.service.select(this);
127
+ if (this.isolate) {
128
+ this.connections.isolate();
129
+ }
130
+ }
131
+ addVolumeClaimTemplate(template) {
132
+ if (this.volumeClaimTemplates?.some(t => t.name === template.name)) {
133
+ throw new Error(`A volume claim template with name "${template.name}" already exists`);
134
+ }
135
+ this.volumeClaimTemplates = this.volumeClaimTemplates
136
+ ? [...this.volumeClaimTemplates, template]
137
+ : [template];
138
+ }
139
+ _createHeadlessService() {
140
+ const myPorts = container.extractContainerPorts(this);
141
+ const myPortNumbers = myPorts.map(p => p.number);
142
+ const ports = myPorts.map(p => ({
143
+ port: p.number,
144
+ targetPort: p.number,
145
+ protocol: p.protocol,
146
+ name: p.name,
147
+ }));
148
+ if (ports.length === 0) {
149
+ throw new Error(`Unable to create a service for the stateful set ${this.name}: StatefulSet ports cannot be determined.`);
150
+ }
151
+ // validate the ports are owned by our containers
152
+ for (const port of ports) {
153
+ const targetPort = port.targetPort ?? port.port;
154
+ if (!myPortNumbers.includes(targetPort)) {
155
+ throw new Error(`Unable to expose stateful set ${this.name} via a service: Port ${targetPort} is not exposed by any container`);
156
+ }
157
+ }
158
+ const metadata = { namespace: this.metadata.namespace };
159
+ return new service.Service(this, 'Service', {
160
+ selector: this,
161
+ ports,
162
+ metadata,
163
+ clusterIP: 'None',
164
+ type: service.ServiceType.CLUSTER_IP,
165
+ });
166
+ }
167
+ /**
168
+ * @internal
169
+ */
170
+ _toKube() {
171
+ return {
172
+ replicas: this.hasAutoscaler ? undefined : (this.replicas ?? 1),
173
+ serviceName: this.service.name,
174
+ minReadySeconds: this.minReady.toSeconds(),
175
+ template: {
176
+ metadata: this.podMetadata.toJson(),
177
+ spec: this._toPodSpec(),
178
+ },
179
+ selector: this._toLabelSelector(),
180
+ podManagementPolicy: this.podManagementPolicy,
181
+ volumeClaimTemplates: this._toPersistentVolumeClaims(),
182
+ updateStrategy: this.strategy._toKube(),
183
+ };
184
+ }
185
+ /**
186
+ * @internal
187
+ */
188
+ _toPodSpec() {
189
+ const podSpec = super._toPodSpec();
190
+ return {
191
+ ...podSpec,
192
+ volumes: this._filterPodSpecVolumes(podSpec),
193
+ };
194
+ }
195
+ /**
196
+ * @internal
197
+ */
198
+ _filterPodSpecVolumes(podSpec) {
199
+ if (!this.volumeClaimTemplates || !podSpec.volumes) {
200
+ return podSpec.volumes;
201
+ }
202
+ const volumeClaimNames = this.volumeClaimTemplates.map(vct => vct.name);
203
+ const filteredVolumes = podSpec.volumes.filter(vol => !volumeClaimNames.includes(vol.name));
204
+ return filteredVolumes.length > 0 ? filteredVolumes : undefined;
205
+ }
206
+ /**
207
+ * @see IScalable.markHasAutoscaler()
208
+ */
209
+ markHasAutoscaler() {
210
+ this.hasAutoscaler = true;
211
+ }
212
+ /**
213
+ * @see IScalable.toScalingTarget()
214
+ */
215
+ toScalingTarget() {
216
+ return {
217
+ kind: this.apiObject.kind,
218
+ apiVersion: this.apiObject.apiVersion,
219
+ name: this.name,
220
+ containers: this.containers,
221
+ replicas: this.replicas,
222
+ };
223
+ }
224
+ /**
225
+ * @internal
226
+ */
227
+ _toPersistentVolumeClaims() {
228
+ const volumeNames = this.containers.flatMap(it => it.mounts).map(mount => mount.volume.name);
229
+ this.volumeClaimTemplates?.forEach(t => {
230
+ if (!volumeNames.includes(t.name)) {
231
+ throw new Error(`Volume claim template with name "${t.name}" is not used by any container mount`);
232
+ }
233
+ });
234
+ return this.volumeClaimTemplates?.map(template => {
235
+ const resources = template.storage
236
+ ? { requests: { storage: k8s_1.Quantity.fromString(template.storage.asString()) } }
237
+ : {};
238
+ return {
239
+ metadata: {
240
+ name: template.name,
241
+ },
242
+ spec: {
243
+ accessModes: template.accessModes,
244
+ storageClassName: template.storageClassName,
245
+ resources,
246
+ },
247
+ };
248
+ });
249
+ }
250
+ }
251
+ exports.StatefulSet = StatefulSet;
252
+ /**
253
+ * StatefulSet update strategies.
254
+ */
255
+ class StatefulSetUpdateStrategy {
256
+ strategy;
257
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.StatefulSetUpdateStrategy", version: "2.0.0" };
258
+ /**
259
+ * The controller will not automatically update the Pods in a StatefulSet.
260
+ * Users must manually delete Pods to cause the controller to create new Pods
261
+ * that reflect modifications.
262
+ */
263
+ static onDelete() {
264
+ return new StatefulSetUpdateStrategy({
265
+ type: 'OnDelete',
266
+ });
267
+ }
268
+ /**
269
+ * The controller will delete and recreate each Pod in the StatefulSet.
270
+ * It will proceed in the same order as Pod termination (from the largest ordinal to the smallest),
271
+ * updating each Pod one at a time. The Kubernetes control plane waits until an updated
272
+ * Pod is Running and Ready prior to updating its predecessor.
273
+ */
274
+ static rollingUpdate(options = {}) {
275
+ return new StatefulSetUpdateStrategy({
276
+ type: 'RollingUpdate',
277
+ rollingUpdate: { partition: options.partition ?? 0 },
278
+ });
279
+ }
280
+ constructor(strategy) {
281
+ this.strategy = strategy;
282
+ }
283
+ /**
284
+ * @internal
285
+ */
286
+ _toKube() {
287
+ return this.strategy;
288
+ }
289
+ }
290
+ exports.StatefulSetUpdateStrategy = StatefulSetUpdateStrategy;
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVmdWwtc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YXRlZnVsLXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaUNBQWtEO0FBRWxELHVEQUF5QztBQUV6QyxtREFBcUM7QUFDckMsdUNBQThHO0FBRTlHLG1EQUFxQztBQUNyQyxxREFBdUM7QUFFdkM7Ozs7Ozs7Ozs7R0FVRztBQUNILElBQVksbUJBR1g7QUFIRCxXQUFZLG1CQUFtQjtJQUM3QixxREFBOEIsQ0FBQTtJQUM5Qiw0Q0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBSFcsbUJBQW1CLG1DQUFuQixtQkFBbUIsUUFHOUI7QUF5REQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFhLFdBQVksU0FBUSxRQUFRLENBQUMsUUFBUTs7SUFDaEQ7O09BRUc7SUFDYSxRQUFRLENBQVU7SUFFbEM7O09BRUc7SUFDYSxtQkFBbUIsQ0FBc0I7SUFFekQ7O09BRUc7SUFDYSxRQUFRLENBQTRCO0lBRXBEOzs7T0FHRztJQUNhLFFBQVEsQ0FBVztJQUVuQzs7T0FFRztJQUNnQixTQUFTLENBQVk7SUFFeEIsWUFBWSxHQUFHLGNBQWMsQ0FBQztJQUV2QyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRWIsT0FBTyxDQUFrQjtJQUVsQyxvQkFBb0IsQ0FBd0M7SUFFbkUsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QjtRQUMvRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3pELFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixJQUFJLEVBQUUsWUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFB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Q0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUF5RCxFQUFFO1FBRXJGLE9BQU8sSUFBSSx5QkFBeUIsQ0FBQztZQUNuQyxJQUFJLEVBQUUsZUFBZTtZQUNyQixhQUFhLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLEVBQUU7U0FDckQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQXFDLFFBQXVDO1FBQXZDLGFBQVEsR0FBUixRQUFRLENBQStCO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQzs7QUFuQ0gsOERBcUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpT2JqZWN0LCBMYXp5LCBEdXJhdGlvbiB9IGZyb20gJ2NkazhzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7IElTY2FsYWJsZSwgU2NhbGluZ1RhcmdldCB9IGZyb20gJy4vaG9yaXpvbnRhbC1wb2QtYXV0b3NjYWxlcic7XG5pbXBvcnQgKiBhcyBrOHMgZnJvbSAnLi9pbXBvcnRzL2s4cyc7XG5pbXBvcnQgeyBLdWJlUGVyc2lzdGVudFZvbHVtZUNsYWltUHJvcHMsIFBvZFNwZWMsIFF1YW50aXR5LCBWb2x1bWVSZXNvdXJjZVJlcXVpcmVtZW50cyB9IGZyb20gJy4vaW1wb3J0cy9rOHMnO1xuaW1wb3J0IHsgUGVyc2lzdGVudFZvbHVtZUNsYWltUHJvcHMgfSBmcm9tICcuL3B2Yyc7XG5pbXBvcnQgKiBhcyBzZXJ2aWNlIGZyb20gJy4vc2VydmljZSc7XG5pbXBvcnQgKiBhcyB3b3JrbG9hZCBmcm9tICcuL3dvcmtsb2FkJztcblxuLyoqXG4gKiBDb250cm9scyBob3cgcG9kcyBhcmUgY3JlYXRlZCBkdXJpbmcgaW5pdGlhbCBzY2FsZSB1cCwgd2hlbiByZXBsYWNpbmcgcG9kcyBvbiBub2RlcyxcbiAqIG9yIHdoZW4gc2NhbGluZyBkb3duLlxuICpcbiAqIFRoZSBkZWZhdWx0IHBvbGljeSBpcyBgT3JkZXJlZFJlYWR5YCwgd2hlcmUgcG9kcyBhcmUgY3JlYXRlZCBpbiBpbmNyZWFzaW5nIG9yZGVyXG4gKiAocG9kLTAsIHRoZW4gcG9kLTEsIGV0YykgYW5kIHRoZSBjb250cm9sbGVyIHdpbGwgd2FpdCB1bnRpbCBlYWNoIHBvZCBpcyByZWFkeSBiZWZvcmVcbiAqIGNvbnRpbnVpbmcuIFdoZW4gc2NhbGluZyBkb3duLCB0aGUgcG9kcyBhcmUgcmVtb3ZlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gKlxuICogVGhlIGFsdGVybmF0aXZlIHBvbGljeSBpcyBgUGFyYWxsZWxgIHdoaWNoIHdpbGwgY3JlYXRlIHBvZHMgaW4gcGFyYWxsZWwgdG8gbWF0Y2ggdGhlXG4gKiBkZXNpcmVkIHNjYWxlIHdpdGhvdXQgd2FpdGluZywgYW5kIG9uIHNjYWxlIGRvd24gd2lsbCBkZWxldGUgYWxsIHBvZHMgYXQgb25jZS5cbiAqL1xuZXhwb3J0IGVudW0gUG9kTWFuYWdlbWVudFBvbGljeSB7XG4gIE9SREVSRURfUkVBRFkgPSAnT3JkZXJlZFJlYWR5JyxcbiAgUEFSQUxMRUwgPSAnUGFyYWxsZWwnLFxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGluaXRpYWxpemF0aW9uIG9mIGBTdGF0ZWZ1bFNldGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVmdWxTZXRQcm9wcyBleHRlbmRzIHdvcmtsb2FkLldvcmtsb2FkUHJvcHMge1xuICAvKipcbiAgICogU2VydmljZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc3RhdGVmdWxzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSBuZXcgaGVhZGxlc3Mgc2VydmljZSB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlPzogc2VydmljZS5TZXJ2aWNlO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGVzaXJlZCBwb2RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhcz86IG51bWJlcjtcblxuICAvKipcbiAgICogUG9kIG1hbmFnZW1lbnQgcG9saWN5IHRvIHVzZSBmb3IgdGhpcyBzdGF0ZWZ1bHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgUG9kTWFuYWdlbWVudFBvbGljeS5PUkRFUkVEX1JFQURZXG4gICAqL1xuICByZWFkb25seSBwb2RNYW5hZ2VtZW50UG9saWN5PzogUG9kTWFuYWdlbWVudFBvbGljeTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBTdGF0ZWZ1bFNldFVwZGF0ZVN0cmF0ZWd5IHRoYXQgd2lsbCBiZSBlbXBsb3llZCB0byB1cGRhdGUgUG9kcyBpbiB0aGUgU3RhdGVmdWxTZXQgd2hlbiBhIHJldmlzaW9uIGlzIG1hZGUgdG8gVGVtcGxhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUm9sbGluZ1VwZGF0ZSB3aXRoIHBhcnRpdGlvbiBzZXQgdG8gMFxuICAgKi9cbiAgcmVhZG9ubHkgc3RyYXRlZ3k/OiBTdGF0ZWZ1bFNldFVwZGF0ZVN0cmF0ZWd5O1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIGR1cmF0aW9uIGZvciB3aGljaCBhIG5ld2x5IGNyZWF0ZWQgcG9kIHNob3VsZCBiZSByZWFkeSB3aXRob3V0IGFueSBvZiBpdHMgY29udGFpbmVyIGNyYXNoaW5nLFxuICAgKiBmb3IgaXQgdG8gYmUgY29uc2lkZXJlZCBhdmFpbGFibGUuIFplcm8gbWVhbnMgdGhlIHBvZCB3aWxsIGJlIGNvbnNpZGVyZWQgYXZhaWxhYmxlIGFzIHNvb24gYXMgaXQgaXMgcmVhZHkuXG4gICAqXG4gICAqIFRoaXMgaXMgYW4gYWxwaGEgZmllbGQgYW5kIHJlcXVpcmVzIGVuYWJsaW5nIFN0YXRlZnVsU2V0TWluUmVhZHlTZWNvbmRzIGZlYXR1cmUgZ2F0ZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy93b3JrbG9hZHMvY29udHJvbGxlcnMvZGVwbG95bWVudC8jbWluLXJlYWR5LXNlY29uZHNcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygwKVxuICAgKi9cbiAgcmVhZG9ubHkgbWluUmVhZHk/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSB0ZW1wbGF0ZXMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggcG9kIGluIHRoZSBTdGF0ZWZ1bFNldC5cbiAgICogVGhlIFN0YXRlZnVsU2V0IGNvbnRyb2xsZXIgY3JlYXRlcyBhIFBWQyBhbmQgYSBQViBmb3IgZWFjaCB0ZW1wbGF0ZSBiYXNlZCBvbiB0aGUgcG9kJ3Mgb3JkaW5hbCBpbmRleCxcbiAgICogZW5zdXJpbmcgc3RhYmxlIHN0b3JhZ2UgYWNyb3NzIHBvZCByZXN0YXJ0cyBhbmQgcmVzY2hlZHVsaW5nLlxuICAgKlxuICAgKiBFYWNoIGNsYWltIGluIHRoaXMgbGlzdCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1hdGNoaW5nIChieSBuYW1lKSB2b2x1bWVNb3VudCBpbiBvbmUgb2YgdGhlIGNvbnRhaW5lcnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gdm9sdW1lIGNsYWltIHRlbXBsYXRlcyB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSB2b2x1bWVDbGFpbVRlbXBsYXRlcz86IFBlcnNpc3RlbnRWb2x1bWVDbGFpbVRlbXBsYXRlUHJvcHNbXTtcbn1cblxuLyoqXG4gKiBTdGF0ZWZ1bFNldCBpcyB0aGUgd29ya2xvYWQgQVBJIG9iamVjdCB1c2VkIHRvIG1hbmFnZSBzdGF0ZWZ1bCBhcHBsaWNhdGlvbnMuXG4gKlxuICogTWFuYWdlcyB0aGUgZGVwbG95bWVudCBhbmQgc2NhbGluZyBvZiBhIHNldCBvZiBQb2RzLCBhbmQgcHJvdmlkZXMgZ3VhcmFudGVlc1xuICogYWJvdXQgdGhlIG9yZGVyaW5nIGFuZCB1bmlxdWVuZXNzIG9mIHRoZXNlIFBvZHMuXG4gKlxuICogTGlrZSBhIERlcGxveW1lbnQsIGEgU3RhdGVmdWxTZXQgbWFuYWdlcyBQb2RzIHRoYXQgYXJlIGJhc2VkIG9uIGFuIGlkZW50aWNhbFxuICogY29udGFpbmVyIHNwZWMuIFVubGlrZSBhIERlcGxveW1lbnQsIGEgU3RhdGVmdWxTZXQgbWFpbnRhaW5zIGEgc3RpY2t5IGlkZW50aXR5XG4gKiBmb3IgZWFjaCBvZiB0aGVpciBQb2RzLiBUaGVzZSBwb2RzIGFyZSBjcmVhdGVkIGZyb20gdGhlIHNhbWUgc3BlYywgYnV0IGFyZSBub3RcbiAqIGludGVyY2hhbmdlYWJsZTogZWFjaCBoYXMgYSBwZXJzaXN0ZW50IGlkZW50aWZpZXIgdGhhdCBpdCBtYWludGFpbnMgYWNyb3NzIGFueVxuICogcmVzY2hlZHVsaW5nLlxuICpcbiAqIElmIHlvdSB3YW50IHRvIHVzZSBzdG9yYWdlIHZvbHVtZXMgdG8gcHJvdmlkZSBwZXJzaXN0ZW5jZSBmb3IgeW91ciB3b3JrbG9hZCwgeW91XG4gKiBjYW4gdXNlIGEgU3RhdGVmdWxTZXQgYXMgcGFydCBvZiB0aGUgc29sdXRpb24uIEFsdGhvdWdoIGluZGl2aWR1YWwgUG9kcyBpbiBhIFN0YXRlZnVsU2V0XG4gKiBhcmUgc3VzY2VwdGlibGUgdG8gZmFpbHVyZSwgdGhlIHBlcnNpc3RlbnQgUG9kIGlkZW50aWZpZXJzIG1ha2UgaXQgZWFzaWVyIHRvIG1hdGNoIGV4aXN0aW5nXG4gKiB2b2x1bWVzIHRvIHRoZSBuZXcgUG9kcyB0aGF0IHJlcGxhY2UgYW55IHRoYXQgaGF2ZSBmYWlsZWQuXG4gKlxuICogVXNpbmcgU3RhdGVmdWxTZXRzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFN0YXRlZnVsU2V0cyBhcmUgdmFsdWFibGUgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZy5cbiAqXG4gKiAtIFN0YWJsZSwgdW5pcXVlIG5ldHdvcmsgaWRlbnRpZmllcnMuXG4gKiAtIFN0YWJsZSwgcGVyc2lzdGVudCBzdG9yYWdlLlxuICogLSBPcmRlcmVkLCBncmFjZWZ1bCBkZXBsb3ltZW50IGFuZCBzY2FsaW5nLlxuICogLSBPcmRlcmVkLCBhdXRvbWF0ZWQgcm9sbGluZyB1cGRhdGVzLlxuICovXG5leHBvcnQgY2xhc3MgU3RhdGVmdWxTZXQgZXh0ZW5kcyB3b3JrbG9hZC5Xb3JrbG9hZCBpbXBsZW1lbnRzIElTY2FsYWJsZSB7XG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGVzaXJlZCBwb2RzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlcGxpY2FzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYW5hZ2VtZW50IHBvbGljeSB0byB1c2UgZm9yIHRoZSBzZXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcG9kTWFuYWdlbWVudFBvbGljeTogUG9kTWFuYWdlbWVudFBvbGljeTtcblxuICAvKipcbiAgICogVGhlIHVwZGF0ZSBzdGFydGVneSBvZiB0aGlzIHN0YXRlZnVsIHNldC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdHJhdGVneTogU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneTtcblxuICAvKipcbiAgICogTWluaW11bSBkdXJhdGlvbiBmb3Igd2hpY2ggYSBuZXdseSBjcmVhdGVkIHBvZCBzaG91bGQgYmUgcmVhZHkgd2l0aG91dFxuICAgKiBhbnkgb2YgaXRzIGNvbnRhaW5lciBjcmFzaGluZywgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1pblJlYWR5OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQHNlZSBiYXNlLlJlc291cmNlLmFwaU9iamVjdFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwaU9iamVjdDogQXBpT2JqZWN0O1xuXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZVR5cGUgPSAnc3RhdGVmdWxzZXRzJztcblxuICBwdWJsaWMgaGFzQXV0b3NjYWxlciA9IGZhbHNlO1xuXG4gIHB1YmxpYyByZWFkb25seSBzZXJ2aWNlOiBzZXJ2aWNlLlNlcnZpY2U7XG5cbiAgcHVibGljIHZvbHVtZUNsYWltVGVtcGxhdGVzPzogUGVyc2lzdGVudFZvbHVtZUNsYWltVGVtcGxhdGVQcm9wc1tdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTdGF0ZWZ1bFNldFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLmFwaU9iamVjdCA9IG5ldyBrOHMuS3ViZVN0YXRlZnVsU2V0KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG1ldGFkYXRhOiBwcm9wcy5tZXRhZGF0YSxcbiAgICAgIHNwZWM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy5fdG9LdWJlKCkgfSksXG4gICAgfSk7XG4gICAgdGhpcy5zZXJ2aWNlID0gcHJvcHMuc2VydmljZSA/PyB0aGlzLl9jcmVhdGVIZWFkbGVzc1NlcnZpY2UoKTtcblxuICAgIHRoaXMuYXBpT2JqZWN0LmFkZERlcGVuZGVuY3kodGhpcy5zZXJ2aWNlKTtcblxuICAgIHRoaXMucmVwbGljYXMgPSBwcm9wcy5yZXBsaWNhcztcbiAgICB0aGlzLnN0cmF0ZWd5ID0gcHJvcHMuc3RyYXRlZ3kgPz8gU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneS5yb2xsaW5nVXBkYXRlKCk7XG4gICAgdGhpcy5wb2RNYW5hZ2VtZW50UG9saWN5ID0gcHJvcHMucG9kTWFuYWdlbWVudFBvbGljeSA/PyBQb2RNYW5hZ2VtZW50UG9saWN5Lk9SREVSRURfUkVBRFk7XG4gICAgdGhpcy5taW5SZWFkeSA9IHByb3BzLm1pblJlYWR5ID8/IER1cmF0aW9uLnNlY29uZHMoMCk7XG4gICAgcHJvcHM/LnZvbHVtZUNsYWltVGVtcGxhdGVzPy5mb3JFYWNoKHRlbXBsYXRlID0+IHRoaXMuYWRkVm9sdW1lQ2xhaW1UZW1wbGF0ZSh0ZW1wbGF0ZSkpO1xuICAgIHRoaXMuc2VydmljZS5zZWxlY3QodGhpcyk7XG5cbiAgICBpZiAodGhpcy5pc29sYXRlKSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25zLmlzb2xhdGUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkVm9sdW1lQ2xhaW1UZW1wbGF0ZSh0ZW1wbGF0ZTogUGVyc2lzdGVudFZvbHVtZUNsYWltVGVtcGxhdGVQcm9wcykge1xuICAgIGlmICh0aGlzLnZvbHVtZUNsYWltVGVtcGxhdGVzPy5zb21lKHQgPT4gdC5uYW1lID09PSB0ZW1wbGF0ZS5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIHZvbHVtZSBjbGFpbSB0ZW1wbGF0ZSB3aXRoIG5hbWUgXCIke3RlbXBsYXRlLm5hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy52b2x1bWVDbGFpbVRlbXBsYXRlcyA9IHRoaXMudm9sdW1lQ2xhaW1UZW1wbGF0ZXNcbiAgICAgID8gWy4uLnRoaXMudm9sdW1lQ2xhaW1UZW1wbGF0ZXMsIHRlbXBsYXRlXVxuICAgICAgOiBbdGVtcGxhdGVdO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlSGVhZGxlc3NTZXJ2aWNlKCkge1xuICAgIGNvbnN0IG15UG9ydHMgPSBjb250YWluZXIuZXh0cmFjdENvbnRhaW5lclBvcnRzKHRoaXMpO1xuICAgIGNvbnN0IG15UG9ydE51bWJlcnMgPSBteVBvcnRzLm1hcChwID0+IHAubnVtYmVyKTtcbiAgICBjb25zdCBwb3J0czogc2VydmljZS5TZXJ2aWNlUG9ydFtdID0gbXlQb3J0cy5tYXAocCA9PiAoe1xuICAgICAgcG9ydDogcC5udW1iZXIsXG4gICAgICB0YXJnZXRQb3J0OiBwLm51bWJlcixcbiAgICAgIHByb3RvY29sOiBwLnByb3RvY29sLFxuICAgICAgbmFtZTogcC5uYW1lLFxuICAgIH0pKTtcbiAgICBpZiAocG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjcmVhdGUgYSBzZXJ2aWNlIGZvciB0aGUgc3RhdGVmdWwgc2V0ICR7dGhpcy5uYW1lfTogU3RhdGVmdWxTZXQgcG9ydHMgY2Fubm90IGJlIGRldGVybWluZWQuYCk7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgdGhlIHBvcnRzIGFyZSBvd25lZCBieSBvdXIgY29udGFpbmVyc1xuICAgIGZvciAoY29uc3QgcG9ydCBvZiBwb3J0cykge1xuICAgICAgY29uc3QgdGFyZ2V0UG9ydCA9IHBvcnQudGFyZ2V0UG9ydCA/PyBwb3J0LnBvcnQ7XG4gICAgICBpZiAoIW15UG9ydE51bWJlcnMuaW5jbHVkZXModGFyZ2V0UG9ydCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZXhwb3NlIHN0YXRlZnVsIHNldCAke3RoaXMubmFtZX0gdmlhIGEgc2VydmljZTogUG9ydCAke3RhcmdldFBvcnR9IGlzIG5vdCBleHBvc2VkIGJ5IGFueSBjb250YWluZXJgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRhZGF0YTogYW55ID0geyBuYW1lc3BhY2U6IHRoaXMubWV0YWRhdGEubmFtZXNwYWNlIH07XG4gICAgcmV0dXJuIG5ldyBzZXJ2aWNlLlNlcnZpY2UodGhpcywgJ1NlcnZpY2UnLCB7XG4gICAgICBzZWxlY3RvcjogdGhpcyxcbiAgICAgIHBvcnRzLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBjbHVzdGVySVA6ICdOb25lJyxcbiAgICAgIHR5cGU6IHNlcnZpY2UuU2VydmljZVR5cGUuQ0xVU1RFUl9JUCxcbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0t1YmUoKTogazhzLlN0YXRlZnVsU2V0U3BlYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcGxpY2FzOiB0aGlzLmhhc0F1dG9zY2FsZXIgPyB1bmRlZmluZWQgOiAodGhpcy5yZXBsaWNhcyA/PyAxKSxcbiAgICAgIHNlcnZpY2VOYW1lOiB0aGlzLnNlcnZpY2UubmFtZSxcbiAgICAgIG1pblJlYWR5U2Vjb25kczogdGhpcy5taW5SZWFkeS50b1NlY29uZHMoKSxcbiAgICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIG1ldGFkYXRhOiB0aGlzLnBvZE1ldGFkYXRhLnRvSnNvbigpLFxuICAgICAgICBzcGVjOiB0aGlzLl90b1BvZFNwZWMoKSxcbiAgICAgIH0sXG4gICAgICBzZWxlY3RvcjogdGhpcy5fdG9MYWJlbFNlbGVjdG9yKCksXG4gICAgICBwb2RNYW5hZ2VtZW50UG9saWN5OiB0aGlzLnBvZE1hbmFnZW1lbnRQb2xpY3ksXG4gICAgICB2b2x1bWVDbGFpbVRlbXBsYXRlczogdGhpcy5fdG9QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1zKCksXG4gICAgICB1cGRhdGVTdHJhdGVneTogdGhpcy5zdHJhdGVneS5fdG9LdWJlKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9Qb2RTcGVjKCk6IGs4cy5Qb2RTcGVjIHtcbiAgICBjb25zdCBwb2RTcGVjID0gc3VwZXIuX3RvUG9kU3BlYygpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5wb2RTcGVjLFxuICAgICAgdm9sdW1lczogdGhpcy5fZmlsdGVyUG9kU3BlY1ZvbHVtZXMocG9kU3BlYyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgX2ZpbHRlclBvZFNwZWNWb2x1bWVzKHBvZFNwZWM6IFBvZFNwZWMpIHtcbiAgICBpZiAoIXRoaXMudm9sdW1lQ2xhaW1UZW1wbGF0ZXMgfHwgIXBvZFNwZWMudm9sdW1lcykge1xuICAgICAgcmV0dXJuIHBvZFNwZWMudm9sdW1lcztcbiAgICB9XG5cbiAgICBjb25zdCB2b2x1bWVDbGFpbU5hbWVzID0gdGhpcy52b2x1bWVDbGFpbVRlbXBsYXRlcy5tYXAodmN0ID0+IHZjdC5uYW1lKTtcbiAgICBjb25zdCBmaWx0ZXJlZFZvbHVtZXMgPSBwb2RTcGVjLnZvbHVtZXMuZmlsdGVyKHZvbCA9PiAhdm9sdW1lQ2xhaW1OYW1lcy5pbmNsdWRlcyh2b2wubmFtZSkpO1xuXG4gICAgcmV0dXJuIGZpbHRlcmVkVm9sdW1lcy5sZW5ndGggPiAwID8gZmlsdGVyZWRWb2x1bWVzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgSVNjYWxhYmxlLm1hcmtIYXNBdXRvc2NhbGVyKClcbiAgICovXG4gIHB1YmxpYyBtYXJrSGFzQXV0b3NjYWxlcigpIHtcbiAgICB0aGlzLmhhc0F1dG9zY2FsZXIgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgSVNjYWxhYmxlLnRvU2NhbGluZ1RhcmdldCgpXG4gICAqL1xuICBwdWJsaWMgdG9TY2FsaW5nVGFyZ2V0KCk6IFNjYWxpbmdUYXJnZXQge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiB0aGlzLmFwaU9iamVjdC5raW5kLFxuICAgICAgYXBpVmVyc2lvbjogdGhpcy5hcGlPYmplY3QuYXBpVmVyc2lvbixcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGNvbnRhaW5lcnM6IHRoaXMuY29udGFpbmVycyxcbiAgICAgIHJlcGxpY2FzOiB0aGlzLnJlcGxpY2FzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIF90b1BlcnNpc3RlbnRWb2x1bWVDbGFpbXMoKTogS3ViZVBlcnNpc3RlbnRWb2x1bWVDbGFpbVByb3BzW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZvbHVtZU5hbWVzID0gdGhpcy5jb250YWluZXJzLmZsYXRNYXAoaXQgPT4gaXQubW91bnRzKS5tYXAobW91bnQgPT4gbW91bnQudm9sdW1lLm5hbWUpO1xuICAgIHRoaXMudm9sdW1lQ2xhaW1UZW1wbGF0ZXM/LmZvckVhY2godCA9PiB7XG4gICAgICBpZiAoIXZvbHVtZU5hbWVzLmluY2x1ZGVzKHQubmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWb2x1bWUgY2xhaW0gdGVtcGxhdGUgd2l0aCBuYW1lIFwiJHt0Lm5hbWV9XCIgaXMgbm90IHVzZWQgYnkgYW55IGNvbnRhaW5lciBtb3VudGApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnZvbHVtZUNsYWltVGVtcGxhdGVzPy5tYXAodGVtcGxhdGUgPT4ge1xuICAgICAgY29uc3QgcmVzb3VyY2VzOiBWb2x1bWVSZXNvdXJjZVJlcXVpcmVtZW50cyA9IHRlbXBsYXRlLnN0b3JhZ2VcbiAgICAgICAgPyB7IHJlcXVlc3RzOiB7IHN0b3JhZ2U6IFF1YW50aXR5LmZyb21TdHJpbmcodGVtcGxhdGUuc3RvcmFnZS5hc1N0cmluZygpKSB9IH1cbiAgICAgICAgOiB7fTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgbmFtZTogdGVtcGxhdGUubmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIGFjY2Vzc01vZGVzOiB0ZW1wbGF0ZS5hY2Nlc3NNb2RlcyxcbiAgICAgICAgICBzdG9yYWdlQ2xhc3NOYW1lOiB0ZW1wbGF0ZS5zdG9yYWdlQ2xhc3NOYW1lLFxuICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneS5yb2xsaW5nVXBkYXRlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZWZ1bFNldFVwZGF0ZVN0cmF0ZWd5Um9sbGluZ1VwZGF0ZU9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBJZiBzcGVjaWZpZWQsIGFsbCBQb2RzIHdpdGggYW4gb3JkaW5hbCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcGFydGl0aW9uIHdpbGxcbiAgICogYmUgdXBkYXRlZCB3aGVuIHRoZSBTdGF0ZWZ1bFNldCdzIC5zcGVjLnRlbXBsYXRlIGlzIHVwZGF0ZWQuIEFsbCBQb2RzIHdpdGggYW4gb3JkaW5hbCB0aGF0XG4gICAqIGlzIGxlc3MgdGhhbiB0aGUgcGFydGl0aW9uIHdpbGwgbm90IGJlIHVwZGF0ZWQsIGFuZCwgZXZlbiBpZiB0aGV5IGFyZSBkZWxldGVkLCB0aGV5IHdpbGwgYmVcbiAgICogcmVjcmVhdGVkIGF0IHRoZSBwcmV2aW91cyB2ZXJzaW9uLlxuICAgKlxuICAgKiBJZiB0aGUgcGFydGl0aW9uIGlzIGdyZWF0ZXIgdGhhbiByZXBsaWNhcywgdXBkYXRlcyB0byB0aGUgcG9kIHRlbXBsYXRlIHdpbGwgbm90IGJlIHByb3BhZ2F0ZWQgdG8gUG9kcy5cbiAgICogSW4gbW9zdCBjYXNlcyB5b3Ugd2lsbCBub3QgbmVlZCB0byB1c2UgYSBwYXJ0aXRpb24sIGJ1dCB0aGV5IGFyZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gc3RhZ2UgYW5cbiAgICogdXBkYXRlLCByb2xsIG91dCBhIGNhbmFyeSwgb3IgcGVyZm9ybSBhIHBoYXNlZCByb2xsIG91dC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy93b3JrbG9hZHMvY29udHJvbGxlcnMvc3RhdGVmdWxzZXQvI3BhcnRpdGlvbnNcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgcGFydGl0aW9uPzogbnVtYmVyO1xuXG59XG5cbi8qKlxuICogU3RhdGVmdWxTZXQgdXBkYXRlIHN0cmF0ZWdpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0ZWZ1bFNldFVwZGF0ZVN0cmF0ZWd5IHtcblxuICAvKipcbiAgICogVGhlIGNvbnRyb2xsZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlIFBvZHMgaW4gYSBTdGF0ZWZ1bFNldC5cbiAgICogVXNlcnMgbXVzdCBtYW51YWxseSBkZWxldGUgUG9kcyB0byBjYXVzZSB0aGUgY29udHJvbGxlciB0byBjcmVhdGUgbmV3IFBvZHNcbiAgICogdGhhdCByZWZsZWN0IG1vZGlmaWNhdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9uRGVsZXRlKCk6IFN0YXRlZnVsU2V0VXBkYXRlU3RyYXRlZ3kge1xuICAgIHJldHVybiBuZXcgU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneSh7XG4gICAgICB0eXBlOiAnT25EZWxldGUnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cm9sbGVyIHdpbGwgZGVsZXRlIGFuZCByZWNyZWF0ZSBlYWNoIFBvZCBpbiB0aGUgU3RhdGVmdWxTZXQuXG4gICAqIEl0IHdpbGwgcHJvY2VlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBQb2QgdGVybWluYXRpb24gKGZyb20gdGhlIGxhcmdlc3Qgb3JkaW5hbCB0byB0aGUgc21hbGxlc3QpLFxuICAgKiB1cGRhdGluZyBlYWNoIFBvZCBvbmUgYXQgYSB0aW1lLiBUaGUgS3ViZXJuZXRlcyBjb250cm9sIHBsYW5lIHdhaXRzIHVudGlsIGFuIHVwZGF0ZWRcbiAgICogUG9kIGlzIFJ1bm5pbmcgYW5kIFJlYWR5IHByaW9yIHRvIHVwZGF0aW5nIGl0cyBwcmVkZWNlc3Nvci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcm9sbGluZ1VwZGF0ZShvcHRpb25zOiBTdGF0ZWZ1bFNldFVwZGF0ZVN0cmF0ZWd5Um9sbGluZ1VwZGF0ZU9wdGlvbnMgPSB7fSk6IFN0YXRlZnVsU2V0VXBkYXRlU3RyYXRlZ3kge1xuXG4gICAgcmV0dXJuIG5ldyBTdGF0ZWZ1bFNldFVwZGF0ZVN0cmF0ZWd5KHtcbiAgICAgIHR5cGU6ICdSb2xsaW5nVXBkYXRlJyxcbiAgICAgIHJvbGxpbmdVcGRhdGU6IHsgcGFydGl0aW9uOiBvcHRpb25zLnBhcnRpdGlvbiA/PyAwIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc3RyYXRlZ3k6IGs4cy5TdGF0ZWZ1bFNldFVwZGF0ZVN0cmF0ZWd5KSB7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3RvS3ViZSgpOiBrOHMuU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyYXRlZ3k7XG4gIH1cblxufVxuXG4vKipcbiAqIEEgUGVyc2lzdGVudFZvbHVtZUNsYWltIHRlbXBsYXRlIGZvciBTdGF0ZWZ1bFNldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW1UZW1wbGF0ZVByb3BzIGV4dGVuZHMgUGVyc2lzdGVudFZvbHVtZUNsYWltUHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNsYWltIHRoYXQgdGhlIFN0YXRlZnVsU2V0IGNvbnRyb2xsZXIgd2lsbCBjcmVhdGUgZm9yIGVhY2ggcG9kLlxuICAgKiBUaGlzIHdpbGwgYmUgdXNlZCB0byBuYW1lIHRoZSBjcmVhdGVkIFBWQyBpbiB0aGUgZm9ybWF0IDxjbGFpbS1uYW1lPi08cG9kLW5hbWU+XG4gICAqXG4gICAqIFRoaXMgbmFtZSBzaG91bGQgbWF0Y2ggdGhlIG5hbWUgb2YgYSB2b2x1bWUgbW91bnQgaW4gb25lIG9mIHRoZSBjb250YWluZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuIl19
package/lib/utils.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { IConstruct } from 'constructs';
2
+ export declare function undefinedIfEmpty<T>(obj: T): T | undefined;
3
+ export declare function filterUndefined(obj: any): any;
4
+ export declare function address(...constructs: IConstruct[]): string;
package/lib/utils.js ADDED
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.undefinedIfEmpty = undefinedIfEmpty;
4
+ exports.filterUndefined = filterUndefined;
5
+ exports.address = address;
6
+ function undefinedIfEmpty(obj) {
7
+ if (typeof (obj) === 'string' && obj === '') {
8
+ return undefined;
9
+ }
10
+ if (Array.isArray(obj) && obj.length === 0) {
11
+ return undefined;
12
+ }
13
+ if (typeof (obj) === 'object' && (Object.keys(obj).length === 0 || Object.values(obj).filter(x => x).length === 0)) {
14
+ return undefined;
15
+ }
16
+ return obj;
17
+ }
18
+ function filterUndefined(obj) {
19
+ const ret = {};
20
+ for (const [k, v] of Object.entries(obj)) {
21
+ if (v !== undefined) {
22
+ ret[k] = v;
23
+ }
24
+ }
25
+ return ret;
26
+ }
27
+ function address(...constructs) {
28
+ const addresses = constructs
29
+ .map(c => c.node.addr)
30
+ .sort((a, b) => a.localeCompare(b));
31
+ return addresses.join('');
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSw0Q0FLQztBQUVELDBDQVFDO0FBRUQsMEJBS0M7QUF0QkQsU0FBZ0IsZ0JBQWdCLENBQUksR0FBTTtJQUN4QyxJQUFJLE9BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLElBQUksR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQ2pFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQ2pFLElBQUksT0FBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBd0IsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUF3QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDbEwsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLEdBQVE7SUFDdEMsTUFBTSxHQUFHLEdBQVEsRUFBRSxDQUFDO0lBQ3BCLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNiLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBZ0IsT0FBTyxDQUFDLEdBQUcsVUFBd0I7SUFDakQsTUFBTSxTQUFTLEdBQUcsVUFBVTtTQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNyQixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmRlZmluZWRJZkVtcHR5PFQ+KG9iajogVCk6IFQgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mKG9iaikgPT09ICdzdHJpbmcnICYmIG9iaiA9PT0gJycpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopICYmIG9iai5sZW5ndGggPT09IDApIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBpZiAodHlwZW9mKG9iaikgPT09ICdvYmplY3QnICYmIChPYmplY3Qua2V5cyhvYmogYXMgdW5rbm93biBhcyBvYmplY3QpLmxlbmd0aCA9PT0gMCB8fCBPYmplY3QudmFsdWVzKG9iaiBhcyB1bmtub3duIGFzIG9iamVjdCkuZmlsdGVyKHggPT4geCkubGVuZ3RoID09PSAwKSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJVbmRlZmluZWQob2JqOiBhbnkpOiBhbnkge1xuICBjb25zdCByZXQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0W2tdID0gdjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZHJlc3MoLi4uY29uc3RydWN0czogSUNvbnN0cnVjdFtdKSB7XG4gIGNvbnN0IGFkZHJlc3NlcyA9IGNvbnN0cnVjdHNcbiAgICAubWFwKGMgPT4gYy5ub2RlLmFkZHIpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIHJldHVybiBhZGRyZXNzZXMuam9pbignJyk7XG59XG4iXX0=