cdk8s-plus-36 0.0.1 → 2.0.1

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,944 @@
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.Env = exports.EnvFrom = exports.Cpu = exports.MountPropagation = exports.Container = exports.ContainerRestartPolicy = exports.ImagePullPolicy = exports.EnvValue = exports.ResourceFieldPaths = exports.EnvFieldPaths = exports.ContainerSecurityContext = exports.Protocol = exports.SeccompProfileType = exports.Capability = void 0;
37
+ exports.extractContainerPorts = extractContainerPorts;
38
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
39
+ const cdk8s_1 = require("cdk8s");
40
+ const k8s = __importStar(require("./imports/k8s"));
41
+ const probe = __importStar(require("./probe"));
42
+ const utils_1 = require("./utils");
43
+ /**
44
+ * Capability - complete list of POSIX capabilities
45
+ */
46
+ var Capability;
47
+ (function (Capability) {
48
+ /**
49
+ * ALL
50
+ */
51
+ Capability["ALL"] = "ALL";
52
+ /**
53
+ * CAP_AUDIT_CONTROL
54
+ */
55
+ Capability["AUDIT_CONTROL"] = "AUDIT_CONTROL";
56
+ /**
57
+ * CAP_AUDIT_READ
58
+ */
59
+ Capability["AUDIT_READ"] = "AUDIT_READ";
60
+ /**
61
+ * CAP_AUDIT_WRITE
62
+ */
63
+ Capability["AUDIT_WRITE"] = "AUDIT_WRITE";
64
+ /**
65
+ * CAP_BLOCK_SUSPEND
66
+ */
67
+ Capability["BLOCK_SUSPEND"] = "BLOCK_SUSPEND";
68
+ /**
69
+ * CAP_BPF
70
+ */
71
+ Capability["BPF"] = "BPF";
72
+ /**
73
+ * CAP_CHECKPOINT_RESTORE
74
+ */
75
+ Capability["CHECKPOINT_RESTORE"] = "CHECKPOINT_RESTORE";
76
+ /**
77
+ * CAP_CHOWN
78
+ */
79
+ Capability["CHOWN"] = "CHOWN";
80
+ /**
81
+ * CAP_DAC_OVERRIDE
82
+ */
83
+ Capability["DAC_OVERRIDE"] = "DAC_OVERRIDE";
84
+ /**
85
+ * CAP_DAC_READ_SEARCH
86
+ */
87
+ Capability["DAC_READ_SEARCH"] = "DAC_READ_SEARCH";
88
+ /**
89
+ * CAP_FOWNER
90
+ */
91
+ Capability["FOWNER"] = "FOWNER";
92
+ /**
93
+ * CAP_FSETID
94
+ */
95
+ Capability["FSETID"] = "FSETID";
96
+ /**
97
+ * CAP_IPC_LOCK
98
+ */
99
+ Capability["IPC_LOCK"] = "IPC_LOCK";
100
+ /**
101
+ * CAP_IPC_OWNER
102
+ */
103
+ Capability["IPC_OWNER"] = "IPC_OWNER";
104
+ /**
105
+ * CAP_KILL
106
+ */
107
+ Capability["KILL"] = "KILL";
108
+ /**
109
+ * CAP_LEASE
110
+ */
111
+ Capability["LEASE"] = "LEASE";
112
+ /**
113
+ * CAP_LINUX_IMMUTABLE
114
+ */
115
+ Capability["LINUX_IMMUTABLE"] = "LINUX_IMMUTABLE";
116
+ /**
117
+ * CAP_MAC_ADMIN
118
+ */
119
+ Capability["MAC_ADMIN"] = "MAC_ADMIN";
120
+ /**
121
+ * CAP_MAC_OVERRIDE
122
+ */
123
+ Capability["MAC_OVERRIDE"] = "MAC_OVERRIDE";
124
+ /**
125
+ * CAP_MKNOD
126
+ */
127
+ Capability["MKNOD"] = "MKNOD";
128
+ /**
129
+ * CAP_NET_ADMIN
130
+ */
131
+ Capability["NET_ADMIN"] = "NET_ADMIN";
132
+ /**
133
+ * CAP_NET_BIND_SERVICE
134
+ */
135
+ Capability["NET_BIND_SERVICE"] = "NET_BIND_SERVICE";
136
+ /**
137
+ * CAP_NET_BROADCAST
138
+ */
139
+ Capability["NET_BROADCAST"] = "NET_BROADCAST";
140
+ /**
141
+ * CAP_NET_RAW
142
+ */
143
+ Capability["NET_RAW"] = "NET_RAW";
144
+ /**
145
+ * CAP_PERFMON
146
+ */
147
+ Capability["PERFMON"] = "PERFMON";
148
+ /**
149
+ * CAP_SETGID
150
+ */
151
+ Capability["SETGID"] = "SETGID";
152
+ /**
153
+ * CAP_SETFCAP
154
+ */
155
+ Capability["SETFCAP"] = "SETFCAP";
156
+ /**
157
+ * CAP_SETPCAP
158
+ */
159
+ Capability["SETPCAP"] = "SETPCAP";
160
+ /**
161
+ * CAP_SETUID
162
+ */
163
+ Capability["SETUID"] = "SETUID";
164
+ /**
165
+ * CAP_SYS_ADMIN
166
+ */
167
+ Capability["SYS_ADMIN"] = "SYS_ADMIN";
168
+ /**
169
+ * CAP_SYS_BOOT
170
+ */
171
+ Capability["SYS_BOOT"] = "SYS_BOOT";
172
+ /**
173
+ * CAP_SYS_CHROOT
174
+ */
175
+ Capability["SYS_CHROOT"] = "SYS_CHROOT";
176
+ /**
177
+ * CAP_SYS_MODULE
178
+ */
179
+ Capability["SYS_MODULE"] = "SYS_MODULE";
180
+ /**
181
+ * CAP_SYS_NICE
182
+ */
183
+ Capability["SYS_NICE"] = "SYS_NICE";
184
+ /**
185
+ * CAP_SYS_PACCT
186
+ */
187
+ Capability["SYS_PACCT"] = "SYS_PACCT";
188
+ /**
189
+ * CAP_SYS_PTRACE
190
+ */
191
+ Capability["SYS_PTRACE"] = "SYS_PTRACE";
192
+ /**
193
+ * CAP_SYS_RAWIO
194
+ */
195
+ Capability["SYS_RAWIO"] = "SYS_RAWIO";
196
+ /**
197
+ * CAP_SYS_RESOURCE
198
+ */
199
+ Capability["SYS_RESOURCE"] = "SYS_RESOURCE";
200
+ /**
201
+ * CAP_SYS_TIME
202
+ */
203
+ Capability["SYS_TIME"] = "SYS_TIME";
204
+ /**
205
+ * CAP_SYS_TTY_CONFIG
206
+ */
207
+ Capability["SYS_TTY_CONFIG"] = "SYS_TTY_CONFIG";
208
+ /**
209
+ * CAP_SYSLOG
210
+ */
211
+ Capability["SYSLOG"] = "SYSLOG";
212
+ /**
213
+ * CAP_WAKE_ALARM
214
+ */
215
+ Capability["WAKE_ALARM"] = "WAKE_ALARM";
216
+ })(Capability || (exports.Capability = Capability = {}));
217
+ var SeccompProfileType;
218
+ (function (SeccompProfileType) {
219
+ /**
220
+ * A profile defined in a file on the node should be used
221
+ */
222
+ SeccompProfileType["LOCALHOST"] = "Localhost";
223
+ /**
224
+ * The container runtime default profile should be used
225
+ */
226
+ SeccompProfileType["RUNTIME_DEFAULT"] = "RuntimeDefault";
227
+ /**
228
+ * No profile should be applied
229
+ */
230
+ SeccompProfileType["UNCONFINED"] = "Unconfined";
231
+ })(SeccompProfileType || (exports.SeccompProfileType = SeccompProfileType = {}));
232
+ /**
233
+ * Network protocols.
234
+ */
235
+ var Protocol;
236
+ (function (Protocol) {
237
+ /**
238
+ * TCP.
239
+ */
240
+ Protocol["TCP"] = "TCP";
241
+ /**
242
+ * UDP.
243
+ */
244
+ Protocol["UDP"] = "UDP";
245
+ /**
246
+ * SCTP.
247
+ */
248
+ Protocol["SCTP"] = "SCTP";
249
+ })(Protocol || (exports.Protocol = Protocol = {}));
250
+ /**
251
+ * Container security attributes and settings.
252
+ */
253
+ class ContainerSecurityContext {
254
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.ContainerSecurityContext", version: "2.0.1" };
255
+ ensureNonRoot;
256
+ privileged;
257
+ readOnlyRootFilesystem;
258
+ user;
259
+ group;
260
+ allowPrivilegeEscalation;
261
+ capabilities;
262
+ seccompProfile;
263
+ constructor(props = {}) {
264
+ if (props.seccompProfile?.localhostProfile && props.seccompProfile.type != SeccompProfileType.LOCALHOST) {
265
+ throw new Error('localhostProfile must only be set if type is "Localhost"');
266
+ }
267
+ this.ensureNonRoot = props.ensureNonRoot ?? true;
268
+ this.privileged = props.privileged ?? false;
269
+ this.readOnlyRootFilesystem = props.readOnlyRootFilesystem ?? true;
270
+ this.user = props.user;
271
+ this.group = props.group;
272
+ this.allowPrivilegeEscalation = props.allowPrivilegeEscalation ?? false;
273
+ this.capabilities = props.capabilities;
274
+ this.seccompProfile = props.seccompProfile;
275
+ }
276
+ /**
277
+ * @internal
278
+ */
279
+ _toKube() {
280
+ return {
281
+ runAsGroup: this.group,
282
+ runAsUser: this.user,
283
+ runAsNonRoot: this.ensureNonRoot,
284
+ privileged: this.privileged,
285
+ readOnlyRootFilesystem: this.readOnlyRootFilesystem,
286
+ allowPrivilegeEscalation: this.allowPrivilegeEscalation,
287
+ capabilities: this.capabilities,
288
+ seccompProfile: this.seccompProfile,
289
+ };
290
+ }
291
+ }
292
+ exports.ContainerSecurityContext = ContainerSecurityContext;
293
+ var EnvFieldPaths;
294
+ (function (EnvFieldPaths) {
295
+ /**
296
+ * The name of the pod.
297
+ */
298
+ EnvFieldPaths["POD_NAME"] = "metadata.name";
299
+ /**
300
+ * The namespace of the pod.
301
+ */
302
+ EnvFieldPaths["POD_NAMESPACE"] = "metadata.namespace";
303
+ /**
304
+ * The uid of the pod.
305
+ */
306
+ EnvFieldPaths["POD_UID"] = "metadata.uid";
307
+ /**
308
+ * The labels of the pod.
309
+ */
310
+ EnvFieldPaths["POD_LABEL"] = "metadata.labels";
311
+ /**
312
+ * The annotations of the pod.
313
+ */
314
+ EnvFieldPaths["POD_ANNOTATION"] = "metadata.annotations";
315
+ /**
316
+ * The ipAddress of the pod.
317
+ */
318
+ EnvFieldPaths["POD_IP"] = "status.podIP";
319
+ /**
320
+ * The service account name of the pod.
321
+ */
322
+ EnvFieldPaths["SERVICE_ACCOUNT_NAME"] = "spec.serviceAccountName";
323
+ /**
324
+ * The name of the node.
325
+ */
326
+ EnvFieldPaths["NODE_NAME"] = "spec.nodeName";
327
+ /**
328
+ * The ipAddress of the node.
329
+ */
330
+ EnvFieldPaths["NODE_IP"] = "status.hostIP";
331
+ /**
332
+ * The ipAddresess of the pod.
333
+ */
334
+ EnvFieldPaths["POD_IPS"] = "status.podIPs";
335
+ })(EnvFieldPaths || (exports.EnvFieldPaths = EnvFieldPaths = {}));
336
+ var ResourceFieldPaths;
337
+ (function (ResourceFieldPaths) {
338
+ /**
339
+ * CPU limit of the container.
340
+ */
341
+ ResourceFieldPaths["CPU_LIMIT"] = "limits.cpu";
342
+ /**
343
+ * Memory limit of the container.
344
+ */
345
+ ResourceFieldPaths["MEMORY_LIMIT"] = "limits.memory";
346
+ /**
347
+ * CPU request of the container.
348
+ */
349
+ ResourceFieldPaths["CPU_REQUEST"] = "requests.cpu";
350
+ /**
351
+ * Memory request of the container.
352
+ */
353
+ ResourceFieldPaths["MEMORY_REQUEST"] = "requests.memory";
354
+ /**
355
+ * Ephemeral storage limit of the container.
356
+ */
357
+ ResourceFieldPaths["STORAGE_LIMIT"] = "limits.ephemeral-storage";
358
+ /**
359
+ * Ephemeral storage request of the container.
360
+ */
361
+ ResourceFieldPaths["STORAGE_REQUEST"] = "requests.ephemeral-storage";
362
+ })(ResourceFieldPaths || (exports.ResourceFieldPaths = ResourceFieldPaths = {}));
363
+ /**
364
+ * Utility class for creating reading env values from various sources.
365
+ */
366
+ class EnvValue {
367
+ value;
368
+ valueFrom;
369
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.EnvValue", version: "2.0.1" };
370
+ /**
371
+ * Create a value by reading a specific key inside a config map.
372
+ *
373
+ * @param configMap - The config map.
374
+ * @param key - The key to extract the value from.
375
+ * @param options - Additional options.
376
+ */
377
+ static fromConfigMap(configMap, key, options = {}) {
378
+ const source = {
379
+ configMapKeyRef: {
380
+ name: configMap.name,
381
+ key,
382
+ optional: options.optional,
383
+ },
384
+ };
385
+ return new EnvValue(undefined, source);
386
+ }
387
+ /**
388
+ * Defines an environment value from a secret JSON value.
389
+ *
390
+ * @param secretValue The secret value (secrent + key)
391
+ * @param options Additional options
392
+ */
393
+ static fromSecretValue(secretValue, options = {}) {
394
+ const source = {
395
+ secretKeyRef: {
396
+ name: secretValue.secret.name,
397
+ key: secretValue.key,
398
+ optional: options.optional,
399
+ },
400
+ };
401
+ return new EnvValue(undefined, source);
402
+ }
403
+ /**
404
+ * Create a value from the given argument.
405
+ *
406
+ * @param value - The value.
407
+ */
408
+ static fromValue(value) {
409
+ return new EnvValue(value);
410
+ }
411
+ /**
412
+ *
413
+ * Create a value from a field reference.
414
+ *
415
+ * @param fieldPath: The field reference.
416
+ * @param options: Additional options.
417
+ */
418
+ static fromFieldRef(fieldPath, options = {}) {
419
+ let needsKey = false;
420
+ if (fieldPath === EnvFieldPaths.POD_LABEL || fieldPath === EnvFieldPaths.POD_ANNOTATION) {
421
+ needsKey = true;
422
+ }
423
+ if (needsKey && options.key === undefined) {
424
+ throw new Error(`${fieldPath} requires a key`);
425
+ }
426
+ const source = {
427
+ fieldRef: {
428
+ fieldPath: (`${fieldPath}` + (needsKey ? `['${options.key}']` : '')),
429
+ ...(options.apiVersion ? { apiVersion: options.apiVersion } : {}),
430
+ },
431
+ };
432
+ return new EnvValue(undefined, source);
433
+ }
434
+ /**
435
+ * Create a value from a resource.
436
+ *
437
+ * @param resource: Resource to select the value from.
438
+ * @param options: Additional options.
439
+ */
440
+ static fromResource(resource, options = {}) {
441
+ const source = {
442
+ resourceFieldRef: {
443
+ resource: `${resource}`,
444
+ ...(options.divisor ? { divisor: k8s.IntOrString.fromString(options.divisor) } : {}),
445
+ ...(options.container ? { containerName: options.container.name } : {}),
446
+ },
447
+ };
448
+ return new EnvValue(undefined, source);
449
+ }
450
+ /**
451
+ * Create a value from a key in the current process environment.
452
+ *
453
+ * @param key - The key to read.
454
+ * @param options - Additional options.
455
+ */
456
+ static fromProcess(key, options = {}) {
457
+ const value = process.env[key];
458
+ if (options.required && !value) {
459
+ throw new Error(`Missing ${key} env variable`);
460
+ }
461
+ return EnvValue.fromValue(value);
462
+ }
463
+ constructor(value, valueFrom) {
464
+ this.value = value;
465
+ this.valueFrom = valueFrom;
466
+ }
467
+ }
468
+ exports.EnvValue = EnvValue;
469
+ var ImagePullPolicy;
470
+ (function (ImagePullPolicy) {
471
+ /**
472
+ * Every time the kubelet launches a container, the kubelet queries the container image registry
473
+ * to resolve the name to an image digest. If the kubelet has a container image with that exact
474
+ * digest cached locally, the kubelet uses its cached image; otherwise, the kubelet downloads
475
+ * (pulls) the image with the resolved digest, and uses that image to launch the container.
476
+ *
477
+ * Default is Always if ImagePullPolicy is omitted and either the image tag is :latest or
478
+ * the image tag is omitted.
479
+ */
480
+ ImagePullPolicy["ALWAYS"] = "Always";
481
+ /**
482
+ * The image is pulled only if it is not already present locally.
483
+ *
484
+ * Default is IfNotPresent if ImagePullPolicy is omitted and the image tag is present but
485
+ * not :latest
486
+ */
487
+ ImagePullPolicy["IF_NOT_PRESENT"] = "IfNotPresent";
488
+ /**
489
+ * The image is assumed to exist locally. No attempt is made to pull the image.
490
+ */
491
+ ImagePullPolicy["NEVER"] = "Never";
492
+ })(ImagePullPolicy || (exports.ImagePullPolicy = ImagePullPolicy = {}));
493
+ /**
494
+ * RestartPolicy defines the restart behavior of individual containers in a pod.
495
+ * This field may only be set for init containers, and the only allowed value is "Always".
496
+ * For non-init containers or when this field is not specified,
497
+ * the restart behavior is defined by the Pod's restart policy and the container type.
498
+ * Setting the RestartPolicy as "Always" for the init container will have the following effect:
499
+ * this init container will be continually restarted on exit until all regular containers have terminated.
500
+ * Once all regular containers have completed, all init containers with restartPolicy "Always" will be shut down.
501
+ * This lifecycle differs from normal init containers and is often referred to as a "sidecar" container.
502
+ *
503
+ * @see https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/
504
+ */
505
+ var ContainerRestartPolicy;
506
+ (function (ContainerRestartPolicy) {
507
+ /**
508
+ * If an init container is created with its restartPolicy set to Always,
509
+ * it will start and remain running during the entire life of the Pod.
510
+ * For regular containers, this is ignored by Kubernetes.
511
+ */
512
+ ContainerRestartPolicy["ALWAYS"] = "Always";
513
+ })(ContainerRestartPolicy || (exports.ContainerRestartPolicy = ContainerRestartPolicy = {}));
514
+ /**
515
+ * A single application container that you want to run within a pod.
516
+ */
517
+ class Container {
518
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.Container", version: "2.0.1" };
519
+ /**
520
+ * The port number that was configured for this container.
521
+ * If undefined, either the container doesn't expose a port, or its
522
+ * port configuration is stored in the `ports` field.
523
+ */
524
+ portNumber;
525
+ /**
526
+ * Volume mounts configured for this container.
527
+ */
528
+ mounts;
529
+ /**
530
+ * Image pull policy for this container
531
+ */
532
+ imagePullPolicy;
533
+ /**
534
+ * The container image.
535
+ */
536
+ image;
537
+ /**
538
+ * The name of the container.
539
+ */
540
+ name;
541
+ /**
542
+ * The working directory inside the container.
543
+ */
544
+ workingDir;
545
+ /**
546
+ * Compute resources (CPU and memory requests and limits) required by the container
547
+ * @see https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
548
+ */
549
+ resources;
550
+ /**
551
+ * The security context of the container.
552
+ */
553
+ securityContext;
554
+ /**
555
+ * The environment of the container.
556
+ */
557
+ env;
558
+ /**
559
+ * The restart policy of the container.
560
+ */
561
+ restartPolicy;
562
+ _command;
563
+ _args;
564
+ _ports = [];
565
+ _readiness;
566
+ _liveness;
567
+ _startup;
568
+ _lifecycle;
569
+ constructor(props) {
570
+ if (props instanceof Container) {
571
+ throw new Error('Attempted to construct a container from a Container object.');
572
+ }
573
+ const defaultResourceSpec = {
574
+ cpu: {
575
+ request: Cpu.millis(1000),
576
+ limit: Cpu.millis(1500),
577
+ },
578
+ memory: {
579
+ request: cdk8s_1.Size.mebibytes(512),
580
+ limit: cdk8s_1.Size.mebibytes(2048),
581
+ },
582
+ };
583
+ if (props.port && props.portNumber) {
584
+ throw new Error('Either \'port\' or \'portNumber\' is allowed. Use \'portNumber\' since \'port\' is deprecated');
585
+ }
586
+ const portNumber = props.portNumber ?? props.port;
587
+ const defaultProbeConfiguration = probe.Probe.fromTcpSocket({ port: portNumber });
588
+ this.name = props.name ?? 'main';
589
+ this.image = props.image;
590
+ this.portNumber = portNumber;
591
+ this._command = props.command;
592
+ this._args = props.args;
593
+ this._readiness = props.readiness;
594
+ this._liveness = props.liveness;
595
+ this._startup = props.startup ?? (this.portNumber ? defaultProbeConfiguration : undefined);
596
+ this._lifecycle = props.lifecycle;
597
+ this.resources = props.resources ?? defaultResourceSpec;
598
+ this.workingDir = props.workingDir;
599
+ this.mounts = props.volumeMounts ?? [];
600
+ this.imagePullPolicy = props.imagePullPolicy ?? ImagePullPolicy.ALWAYS;
601
+ this.securityContext = new ContainerSecurityContext(props.securityContext);
602
+ this.env = new Env(props.envFrom ?? [], props.envVariables ?? {});
603
+ this.restartPolicy = props.restartPolicy;
604
+ if (this.portNumber) {
605
+ this.addPort({
606
+ number: this.portNumber,
607
+ });
608
+ }
609
+ for (const port of props.ports ?? []) {
610
+ this.addPort(port);
611
+ }
612
+ }
613
+ /**
614
+ * @deprecated - use `portNumber`.
615
+ */
616
+ get port() {
617
+ return this.portNumber;
618
+ }
619
+ /**
620
+ * Ports exposed by this containers.
621
+ * Returns a copy, use `addPort` to modify.
622
+ */
623
+ get ports() {
624
+ return [...this._ports];
625
+ }
626
+ /**
627
+ * Entrypoint array (the command to execute when the container starts).
628
+ * @returns a copy of the entrypoint array, cannot be modified
629
+ */
630
+ get command() {
631
+ return this._command ? [...this._command] : undefined;
632
+ }
633
+ /**
634
+ * Arguments to the entrypoint.
635
+ *
636
+ * @returns a copy of the arguments array, cannot be modified.
637
+ */
638
+ get args() {
639
+ return this._args ? [...this._args] : undefined;
640
+ }
641
+ /**
642
+ * Mount a volume to a specific path so that it is accessible by the container.
643
+ * Every pod that is configured to use this container will autmoatically have access to the volume.
644
+ *
645
+ * @param path - The desired path in the container.
646
+ * @param storage - The storage to mount.
647
+ */
648
+ mount(path, storage, options = {}) {
649
+ this.mounts.push({ path, volume: storage.asVolume(), ...options });
650
+ }
651
+ /**
652
+ * Add a port to expose from this container.
653
+ */
654
+ addPort(port) {
655
+ const names = this._ports.map(p => p.name).filter(x => x);
656
+ const numberProtocols = this._ports.map(p => `${p.number}/${p.protocol || Protocol.TCP}`);
657
+ if (port.name && names.includes(port.name)) {
658
+ throw new Error(`Port with name ${port.name} already exists`);
659
+ }
660
+ const protocol = `${port.number}/${port.protocol || Protocol.TCP}`;
661
+ if (numberProtocols.includes(protocol)) {
662
+ throw new Error(`Port with number ${port.number} and protocol ${port.protocol || Protocol.TCP} already exists`);
663
+ }
664
+ this._ports.push(port);
665
+ }
666
+ /**
667
+ * @internal
668
+ */
669
+ _toKube() {
670
+ const volumeMounts = [];
671
+ for (const mount of this.mounts) {
672
+ volumeMounts.push({
673
+ name: mount.volume.name,
674
+ mountPath: mount.path,
675
+ readOnly: mount.readOnly,
676
+ mountPropagation: mount.propagation,
677
+ subPath: mount.subPath,
678
+ subPathExpr: mount.subPathExpr,
679
+ });
680
+ }
681
+ const ports = new Array();
682
+ for (const port of this.ports) {
683
+ ports.push({
684
+ containerPort: port.number,
685
+ protocol: port.protocol?.toString(),
686
+ name: port.name,
687
+ hostPort: port.hostPort,
688
+ hostIp: port.hostIp,
689
+ });
690
+ }
691
+ // Resource requests and limits
692
+ const cpuLimit = this.resources?.cpu?.limit?.amount;
693
+ const cpuRequest = this.resources?.cpu?.request?.amount;
694
+ const memoryLimit = this.resources?.memory?.limit;
695
+ const memoryRequest = this.resources?.memory?.request;
696
+ const ephemeralStorageLimit = this.resources?.ephemeralStorage?.limit;
697
+ const ephemeralStorageRequest = this.resources?.ephemeralStorage?.request;
698
+ const limits = {};
699
+ const requests = {};
700
+ if (cpuLimit) {
701
+ limits.cpu = k8s.Quantity.fromString(cpuLimit);
702
+ }
703
+ if (memoryLimit) {
704
+ limits.memory = k8s.Quantity.fromString(memoryLimit.toMebibytes().toString() + 'Mi');
705
+ }
706
+ if (ephemeralStorageLimit) {
707
+ limits['ephemeral-storage'] = k8s.Quantity.fromString(ephemeralStorageLimit.toGibibytes().toString() + 'Gi');
708
+ }
709
+ if (cpuRequest) {
710
+ requests.cpu = k8s.Quantity.fromString(cpuRequest);
711
+ }
712
+ if (memoryRequest) {
713
+ requests.memory = k8s.Quantity.fromString(memoryRequest.toMebibytes().toString() + 'Mi');
714
+ }
715
+ if (ephemeralStorageRequest) {
716
+ requests['ephemeral-storage'] = k8s.Quantity.fromString(ephemeralStorageRequest.toGibibytes().toString() + 'Gi');
717
+ }
718
+ let resourceRequirements = undefined;
719
+ if (Object.keys(limits).length > 0 || Object.keys(requests).length > 0) {
720
+ resourceRequirements = {
721
+ limits: (0, utils_1.undefinedIfEmpty)(limits),
722
+ requests: (0, utils_1.undefinedIfEmpty)(requests),
723
+ };
724
+ }
725
+ const env = this.env._toKube();
726
+ return {
727
+ name: this.name,
728
+ image: this.image,
729
+ imagePullPolicy: this.imagePullPolicy,
730
+ ports: (0, utils_1.undefinedIfEmpty)(ports),
731
+ volumeMounts: (0, utils_1.undefinedIfEmpty)(volumeMounts),
732
+ command: this.command,
733
+ args: this.args,
734
+ workingDir: this.workingDir,
735
+ env: env.variables,
736
+ envFrom: env.from,
737
+ readinessProbe: this._readiness?._toKube(this),
738
+ livenessProbe: this._liveness?._toKube(this),
739
+ startupProbe: this._startup?._toKube(this),
740
+ lifecycle: this._lifecycle ? {
741
+ postStart: this._lifecycle.postStart?._toKube(this),
742
+ preStop: this._lifecycle.preStop?._toKube(this),
743
+ } : undefined,
744
+ resources: resourceRequirements,
745
+ restartPolicy: this.restartPolicy,
746
+ securityContext: this.securityContext._toKube(),
747
+ };
748
+ }
749
+ }
750
+ exports.Container = Container;
751
+ var MountPropagation;
752
+ (function (MountPropagation) {
753
+ /**
754
+ * This volume mount will not receive any subsequent mounts that are mounted
755
+ * to this volume or any of its subdirectories by the host. In similar
756
+ * fashion, no mounts created by the Container will be visible on the host.
757
+ *
758
+ * This is the default mode.
759
+ *
760
+ * This mode is equal to `private` mount propagation as described in the Linux
761
+ * kernel documentation
762
+ */
763
+ MountPropagation["NONE"] = "None";
764
+ /**
765
+ * This volume mount will receive all subsequent mounts that are mounted to
766
+ * this volume or any of its subdirectories.
767
+ *
768
+ * In other words, if the host mounts anything inside the volume mount, the
769
+ * Container will see it mounted there.
770
+ *
771
+ * Similarly, if any Pod with Bidirectional mount propagation to the same
772
+ * volume mounts anything there, the Container with HostToContainer mount
773
+ * propagation will see it.
774
+ *
775
+ * This mode is equal to `rslave` mount propagation as described in the Linux
776
+ * kernel documentation
777
+ */
778
+ MountPropagation["HOST_TO_CONTAINER"] = "HostToContainer";
779
+ /**
780
+ * This volume mount behaves the same the HostToContainer mount. In addition,
781
+ * all volume mounts created by the Container will be propagated back to the
782
+ * host and to all Containers of all Pods that use the same volume
783
+ *
784
+ * A typical use case for this mode is a Pod with a FlexVolume or CSI driver
785
+ * or a Pod that needs to mount something on the host using a hostPath volume.
786
+ *
787
+ * This mode is equal to `rshared` mount propagation as described in the Linux
788
+ * kernel documentation
789
+ *
790
+ * Caution: Bidirectional mount propagation can be dangerous. It can damage
791
+ * the host operating system and therefore it is allowed only in privileged
792
+ * Containers. Familiarity with Linux kernel behavior is strongly recommended.
793
+ * In addition, any volume mounts created by Containers in Pods must be
794
+ * destroyed (unmounted) by the Containers on termination.
795
+ *
796
+ */
797
+ MountPropagation["BIDIRECTIONAL"] = "Bidirectional";
798
+ })(MountPropagation || (exports.MountPropagation = MountPropagation = {}));
799
+ /**
800
+ * Represents the amount of CPU.
801
+ * The amount can be passed as millis or units.
802
+ */
803
+ class Cpu {
804
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.Cpu", version: "2.0.1" };
805
+ static millis(amount) {
806
+ return new Cpu(amount + 'm');
807
+ }
808
+ static units(amount) {
809
+ return new Cpu(amount.toString());
810
+ }
811
+ amount;
812
+ constructor(amount) {
813
+ this.amount = amount;
814
+ }
815
+ }
816
+ exports.Cpu = Cpu;
817
+ /**
818
+ * A collection of env variables defined in other resources.
819
+ */
820
+ class EnvFrom {
821
+ configMap;
822
+ prefix;
823
+ sec;
824
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.EnvFrom", version: "2.0.1" };
825
+ constructor(configMap, prefix, sec) {
826
+ this.configMap = configMap;
827
+ this.prefix = prefix;
828
+ this.sec = sec;
829
+ }
830
+ ;
831
+ /**
832
+ * @internal
833
+ */
834
+ _toKube() {
835
+ // a single `k8s.EnvFromSource` may only specify one of `configMapRef` / `secretRef`.
836
+ // if both a config map and a secret are configured on this instance, they must be
837
+ // rendered as separate entries, otherwise the resulting manifest is invalid.
838
+ const sources = new Array();
839
+ if (this.configMap) {
840
+ sources.push({
841
+ configMapRef: { name: this.configMap.name },
842
+ prefix: this.prefix,
843
+ });
844
+ }
845
+ if (this.sec) {
846
+ sources.push({
847
+ secretRef: { name: this.sec.name },
848
+ prefix: this.prefix,
849
+ });
850
+ }
851
+ return sources;
852
+ }
853
+ }
854
+ exports.EnvFrom = EnvFrom;
855
+ function extractContainerPorts(selector) {
856
+ if (!selector) {
857
+ return [];
858
+ }
859
+ // we don't use instanceof intentionally since it can create
860
+ // cyclic import problems.
861
+ const containers = selector.containers ?? [];
862
+ return containers.flatMap(c => c.ports);
863
+ }
864
+ /**
865
+ * Container environment variables.
866
+ */
867
+ class Env {
868
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.Env", version: "2.0.1" };
869
+ /**
870
+ * Selects a ConfigMap to populate the environment variables with.
871
+ * The contents of the target ConfigMap's Data field will represent
872
+ * the key-value pairs as environment variables.
873
+ */
874
+ static fromConfigMap(configMap, prefix) {
875
+ return new EnvFrom(configMap, prefix, undefined);
876
+ }
877
+ /**
878
+ * Selects a Secret to populate the environment variables with.
879
+ * The contents of the target Secret's Data field will represent
880
+ * the key-value pairs as environment variables.
881
+ */
882
+ static fromSecret(secr) {
883
+ return new EnvFrom(undefined, undefined, secr);
884
+ }
885
+ _sources;
886
+ _variables;
887
+ constructor(sources, variables) {
888
+ this._sources = sources;
889
+ this._variables = variables;
890
+ }
891
+ /**
892
+ * Add a single variable by name and value.
893
+ * The variable value can come from various dynamic sources such a secrets of config maps.
894
+ * Use `EnvValue.fromXXX` to select sources.
895
+ */
896
+ addVariable(name, value) {
897
+ this._variables[name] = value;
898
+ }
899
+ /**
900
+ * The environment variables for this container.
901
+ * Returns a copy. To add environment variables use `container.env.addVariable()`.
902
+ */
903
+ get variables() {
904
+ return { ...this._variables };
905
+ }
906
+ /**
907
+ * Add a collection of variables by copying from another source.
908
+ * Use `Env.fromXXX` functions to select sources.
909
+ */
910
+ copyFrom(from) {
911
+ this._sources.push(from);
912
+ }
913
+ /**
914
+ * The list of sources used to populate the container environment,
915
+ * in addition to the `variables`.
916
+ *
917
+ * Returns a copy. To add a source use `container.env.copyFrom()`.
918
+ */
919
+ get sources() {
920
+ return [...this._sources];
921
+ }
922
+ renderEnv(env) {
923
+ const result = new Array();
924
+ for (const [name, v] of Object.entries(env)) {
925
+ result.push({
926
+ name,
927
+ value: v.value,
928
+ valueFrom: v.valueFrom,
929
+ });
930
+ }
931
+ return result;
932
+ }
933
+ /**
934
+ * @internal
935
+ */
936
+ _toKube() {
937
+ return {
938
+ from: (0, utils_1.undefinedIfEmpty)(this._sources.flatMap(s => s._toKube())),
939
+ variables: (0, utils_1.undefinedIfEmpty)(this.renderEnv(this._variables)),
940
+ };
941
+ }
942
+ }
943
+ exports.Env = Env;
944
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyM0NBLHNEQVNDOztBQXA0Q0QsaUNBQTZCO0FBRzdCLG1EQUFxQztBQUNyQywrQ0FBaUM7QUFFakMsbUNBQTJDO0FBRzNDOztHQUVHO0FBQ0gsSUFBWSxVQXlLWDtBQXpLRCxXQUFZLFVBQVU7SUFDcEI7O09BRUc7SUFDSCx5QkFBVyxDQUFBO0lBQ1g7O09BRUc7SUFDSCw2Q0FBK0IsQ0FBQTtJQUMvQjs7T0FFRztJQUNILHVDQUF5QixDQUFBO0lBQ3pCOztPQUVHO0lBQ0gseUNBQTJCLENBQUE7SUFDM0I7O09BRUc7SUFDSCw2Q0FBK0IsQ0FBQTtJQUMvQjs7T0FFRztJQUNILHlCQUFXLENBQUE7SUFDWDs7T0FFRztJQUNILHVEQUF5QyxDQUFBO0lBQ3pDOztPQUVHO0lBQ0gsNkJBQWUsQ0FBQTtJQUNmOztPQUVHO0lBQ0gsMkNBQTZCLENBQUE7SUFDN0I7O09BRUc7SUFDSCxpREFBbUMsQ0FBQTtJQUNuQzs7T0FFRztJQUNILCtCQUFpQixDQUFBO0lBQ2pCOztPQUVHO0lBQ0gsK0JBQWlCLENBQUE7SUFDakI7O09BRUc7SUFDSCxtQ0FBcUIsQ0FBQTtJQUNyQjs7T0FFRztJQUNILHFDQUF1QixDQUFBO0lBQ3ZCOztPQUVHO0lBQ0gsMkJBQWEsQ0FBQTtJQUNiOztPQUVHO0lBQ0gsNkJBQWUsQ0FBQTtJQUNmOztPQUVHO0lBQ0gsaURBQW1DLENBQUE7SUFDbkM7O09BRUc7SUFDSCxxQ0FBdUIsQ0FBQTtJQUN2Qjs7T0FFRztJQUNILDJDQUE2QixDQUFBO0lBQzdCOztPQUVHO0lBQ0gsNkJBQWUsQ0FBQTtJQUNmOztPQUVHO0lBQ0gscUNBQXVCLENBQUE7SUFDdkI7O09BRUc7SUFDSCxtREFBcUMsQ0FBQTtJQUNyQzs7T0FFRztJQUNILDZD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O2FBQ3ZCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1osT0FBTztZQUNMLElBQUksRUFBRSxJQUFBLHdCQUFnQixFQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDL0QsU0FBUyxFQUFFLElBQUEsd0JBQWdCLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDN0QsQ0FBQztJQUNKLENBQUM7O0FBbkZILGtCQW9GQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpemUgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgKiBhcyBjb25maWdtYXAgZnJvbSAnLi9jb25maWctbWFwJztcbmltcG9ydCAqIGFzIGhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyJztcbmltcG9ydCAqIGFzIGs4cyBmcm9tICcuL2ltcG9ydHMvazhzJztcbmltcG9ydCAqIGFzIHByb2JlIGZyb20gJy4vcHJvYmUnO1xuaW1wb3J0ICogYXMgc2VjcmV0IGZyb20gJy4vc2VjcmV0JztcbmltcG9ydCB7IHVuZGVmaW5lZElmRW1wdHkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCAqIGFzIHZvbHVtZSBmcm9tICcuL3ZvbHVtZSc7XG5cbi8qKlxuICogQ2FwYWJpbGl0eSAtIGNvbXBsZXRlIGxpc3Qgb2YgUE9TSVggY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBlbnVtIENhcGFiaWxpdHkge1xuICAvKipcbiAgICogQUxMXG4gICAqL1xuICBBTEwgPSAnQUxMJyxcbiAgLyoqXG4gICAqIENBUF9BVURJVF9DT05UUk9MXG4gICAqL1xuICBBVURJVF9DT05UUk9MID0gJ0FVRElUX0NPTlRST0wnLFxuICAvKipcbiAgICogQ0FQX0FVRElUX1JFQURcbiAgICovXG4gIEFVRElUX1JFQUQgPSAnQVVESVRfUkVBRCcsXG4gIC8qKlxuICAgKiBDQVBfQVVESVRfV1JJVEVcbiAgICovXG4gIEFVRElUX1dSSVRFID0gJ0FVRElUX1dSSVRFJyxcbiAgLyoqXG4gICAqIENBUF9CTE9DS19TVVNQRU5EXG4gICAqL1xuICBCTE9DS19TVVNQRU5EID0gJ0JMT0NLX1NVU1BFTkQnLFxuICAvKipcbiAgICogQ0FQX0JQRlxuICAgKi9cbiAgQlBGID0gJ0JQRicsXG4gIC8qKlxuICAgKiBDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFXG4gICAqL1xuICBDSEVDS1BPSU5UX1JFU1RPUkUgPSAnQ0hFQ0tQT0lOVF9SRVNUT1JFJyxcbiAgLyoqXG4gICAqIENBUF9DSE9XTlxuICAgKi9cbiAgQ0hPV04gPSAnQ0hPV04nLFxuICAvKipcbiAgICogQ0FQX0RBQ19PVkVSUklERVxuICAgKi9cbiAgREFDX09WRVJSSURFID0gJ0RBQ19PVkVSUklERScsXG4gIC8qKlxuICAgKiBDQVBfREFDX1JFQURfU0VBUkNIXG4gICAqL1xuICBEQUNfUkVBRF9TRUFSQ0ggPSAnREFDX1JFQURfU0VBUkNIJyxcbiAgLyoqXG4gICAqIENBUF9GT1dORVJcbiAgICovXG4gIEZPV05FUiA9ICdGT1dORVInLFxuICAvKipcbiAgICogQ0FQX0ZTRVRJRFxuICAgKi9cbiAgRlNFVElEID0gJ0ZTRVRJRCcsXG4gIC8qKlxuICAgKiBDQVBfSVBDX0xPQ0tcbiAgICovXG4gIElQQ19MT0NLID0gJ0lQQ19MT0NLJyxcbiAgLyoqXG4gICAqIENBUF9JUENfT1dORVJcbiAgICovXG4gIElQQ19PV05FUiA9ICdJUENfT1dORVInLFxuICAvKipcbiAgICogQ0FQX0tJTExcbiAgICovXG4gIEtJTEwgPSAnS0lMTCcsXG4gIC8qKlxuICAgKiBDQVBfTEVBU0VcbiAgICovXG4gIExFQVNFID0gJ0xFQVNFJyxcbiAgLyoqXG4gICAqIENBUF9MSU5VWF9JTU1VVEFCTEVcbiAgICovXG4gIExJTlVYX0lNTVVUQUJMRSA9ICdMSU5VWF9JTU1VVEFCTEUnLFxuICAvKipcbiAgICogQ0FQX01BQ19BRE1JTlxuICAgKi9cbiAgTUFDX0FETUlOID0gJ01BQ19BRE1JTicsXG4gIC8qKlxuICAgKiBDQVBfTUFDX09WRVJSSURFXG4gICAqL1xuICBNQUNfT1ZFUlJJREUgPSAnTUFDX09WRVJSSURFJyxcbiAgLyoqXG4gICAqIENBUF9NS05PRFxuICAgKi9cbiAgTUtOT0QgPSAnTUtOT0QnLFxuICAvKipcbiAgICogQ0FQX05FVF9BRE1JTlxuICAgKi9cbiAgTkVUX0FETUlOID0gJ05FVF9BRE1JTicsXG4gIC8qKlxuICAgKiBDQVBfTkVUX0JJTkRfU0VSVklDRVxuICAgKi9cbiAgTkVUX0JJTkRfU0VSVklDRSA9ICdORVRfQklORF9TRVJWSUNFJyxcbiAgLyoqXG4gICAqIENBUF9ORVRfQlJPQURDQVNUXG4gICAqL1xuICBORVRfQlJPQURDQVNUID0gJ05FVF9CUk9BRENBU1QnLFxuICAvKipcbiAgICogQ0FQX05FVF9SQVdcbiAgICovXG4gIE5FVF9SQVcgPSAnTkVUX1JBVycsXG4gIC8qKlxuICAgKiBDQVBfUEVSRk1PTlxuICAgKi9cbiAgUEVSRk1PTiA9ICdQRVJGTU9OJyxcbiAgLyoqXG4gICAqIENBUF9TRVRHSURcbiAgICovXG4gIFNFVEdJRCA9ICdTRVRHSUQnLFxuICAvKipcbiAgICogQ0FQX1NFVEZDQVBcbiAgICovXG4gIFNFVEZDQVAgPSAnU0VURkNBUCcsXG4gIC8qKlxuICAgKiBDQVBfU0VUUENBUFxuICAgKi9cbiAgU0VUUENBUCA9ICdTRVRQQ0FQJyxcbiAgLyoqXG4gICAqIENBUF9TRVRVSURcbiAgICovXG4gIFNFVFVJRCA9ICdTRVRVSUQnLFxuICAvKipcbiAgICogQ0FQX1NZU19BRE1JTlxuICAgKi9cbiAgU1lTX0FETUlOID0gJ1NZU19BRE1JTicsXG4gIC8qKlxuICAgKiBDQVBfU1lTX0JPT1RcbiAgICovXG4gIFNZU19CT09UID0gJ1NZU19CT09UJyxcbiAgLyoqXG4gICAqIENBUF9TWVNfQ0hST09UXG4gICAqL1xuICBTWVNfQ0hST09UID0gJ1NZU19DSFJPT1QnLFxuICAvKipcbiAgICogQ0FQX1NZU19NT0RVTEVcbiAgICovXG4gIFNZU19NT0RVTEUgPSAnU1lTX01PRFVMRScsXG4gIC8qKlxuICAgKiBDQVBfU1lTX05JQ0VcbiAgICovXG4gIFNZU19OSUNFID0gJ1NZU19OSUNFJyxcbiAgLyoqXG4gICAqIENBUF9TWVNfUEFDQ1RcbiAgICovXG4gIFNZU19QQUNDVCA9ICdTWVNfUEFDQ1QnLFxuICAvKipcbiAgICogQ0FQX1NZU19QVFJBQ0VcbiAgICovXG4gIFNZU19QVFJBQ0UgPSAnU1lTX1BUUkFDRScsXG4gIC8qKlxuICAgKiBDQVBfU1lTX1JBV0lPXG4gICAqL1xuICBTWVNfUkFXSU8gPSAnU1lTX1JBV0lPJyxcbiAgLyoqXG4gICAqIENBUF9TWVNfUkVTT1VSQ0VcbiAgICovXG4gIFNZU19SRVNPVVJDRSA9ICdTWVNfUkVTT1VSQ0UnLFxuICAvKipcbiAgICogQ0FQX1NZU19USU1FXG4gICAqL1xuICBTWVNfVElNRSA9ICdTWVNfVElNRScsXG4gIC8qKlxuICAgKiBDQVBfU1lTX1RUWV9DT05GSUdcbiAgICovXG4gIFNZU19UVFlfQ09ORklHID0gJ1NZU19UVFlfQ09ORklHJyxcbiAgLyoqXG4gICAqIENBUF9TWVNMT0dcbiAgICovXG4gIFNZU0xPRyA9ICdTWVNMT0cnLFxuICAvKipcbiAgICogQ0FQX1dBS0VfQUxBUk1cbiAgICovXG4gIFdBS0VfQUxBUk0gPSAnV0FLRV9BTEFSTScsXG59XG5cbmV4cG9ydCBlbnVtIFNlY2NvbXBQcm9maWxlVHlwZSB7XG4gIC8qKlxuICAqIEEgcHJvZmlsZSBkZWZpbmVkIGluIGEgZmlsZSBvbiB0aGUgbm9kZSBzaG91bGQgYmUgdXNlZFxuICAqL1xuICBMT0NBTEhPU1QgPSAnTG9jYWxob3N0JyxcbiAgLyoqXG4gICogVGhlIGNvbnRhaW5lciBydW50aW1lIGRlZmF1bHQgcHJvZmlsZSBzaG91bGQgYmUgdXNlZFxuICAqL1xuICBSVU5USU1FX0RFRkFVTFQgPSAnUnVudGltZURlZmF1bHQnLFxuICAvKipcbiAgKiBObyBwcm9maWxlIHNob3VsZCBiZSBhcHBsaWVkXG4gICovXG4gIFVOQ09ORklORUQgPSAnVW5jb25maW5lZCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjY29tcFByb2ZpbGUge1xuICAvKipcbiAgICogbG9jYWxob3N0UHJvZmlsZSBpbmRpY2F0ZXMgYSBwcm9maWxlIGRlZmluZWQgaW4gYSBmaWxlIG9uIHRoZSBub2RlIHNob3VsZCBiZSB1c2VkLlxuICAgKiBUaGUgcHJvZmlsZSBtdXN0IGJlIHByZWNvbmZpZ3VyZWQgb24gdGhlIG5vZGUgdG8gd29yay4gTXVzdCBiZSBhIGRlc2NlbmRpbmcgcGF0aCxcbiAgICogcmVsYXRpdmUgdG8gdGhlIGt1YmVsZXQncyBjb25maWd1cmVkIHNlY2NvbXAgcHJvZmlsZSBsb2NhdGlvbi5cbiAgICogTXVzdCBvbmx5IGJlIHNldCBpZiB0eXBlIGlzIFwiTG9jYWxob3N0XCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZW1wdHkgc3RyaW5nXG4gICAqL1xuICByZWFkb25seSBsb2NhbGhvc3RQcm9maWxlPzogc3RyaW5nO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoaWNoIGtpbmQgb2Ygc2VjY29tcCBwcm9maWxlIHdpbGwgYmUgYXBwbGllZFxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogU2VjY29tcFByb2ZpbGVUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lclNlY3V0aXJ5Q29udGV4dENhcGFiaWxpdGllcyB7XG4gIC8qKlxuICAgKiBBZGRlZCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIHJlYWRvbmx5IGFkZD86IENhcGFiaWxpdHlbXTtcblxuICAvKipcbiAgICogUmVtb3ZlZCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIHJlYWRvbmx5IGRyb3A/OiBDYXBhYmlsaXR5W107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYENvbnRhaW5lclNlY3VyaXR5Q29udGV4dGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJTZWN1cml0eUNvbnRleHRQcm9wcyB7XG5cbiAgLyoqXG4gICAgKiBUaGUgVUlEIHRvIHJ1biB0aGUgZW50cnlwb2ludCBvZiB0aGUgY29udGFpbmVyIHByb2Nlc3MuXG4gICAgKlxuICAgICogQGRlZmF1bHQgLSAyNTAwMC4gQW4gYXJiaXRyYXJ5IG51bWJlciBiaWdnZXIgdGhhbiA5OTk5IGlzIHNlbGVjdGVkIGhlcmUuXG4gICAgKiBUaGlzIGlzIHNvIHRoYXQgdGhlIGNvbnRhaW5lciBpcyBibG9ja2VkIHRvIGFjY2VzcyBob3N0IGZpbGVzIGV2ZW4gaWZcbiAgICAqIHNvbWVob3cgaXQgbWFuYWdlcyB0byBnZXQgYWNjZXNzIHRvIGhvc3QgZmlsZSBzeXN0ZW0uXG4gICAgKi9cbiAgcmVhZG9ubHkgdXNlcj86IG51bWJlcjtcblxuICAvKipcbiAgICAqIFRoZSBHSUQgdG8gcnVuIHRoZSBlbnRyeXBvaW50IG9mIHRoZSBjb250YWluZXIgcHJvY2Vzcy5cbiAgICAqXG4gICAgKiBAZGVmYXVsdCAtIDI2MDAwLiBBbiBhcmJpdHJhcnkgbnVtYmVyIGJpZ2dlciB0aGFuIDk5OTkgaXMgc2VsZWN0ZWQgaGVyZS5cbiAgICAqIFRoaXMgaXMgc28gdGhhdCB0aGUgY29udGFpbmVyIGlzIGJsb2NrZWQgdG8gYWNjZXNzIGhvc3QgZmlsZXMgZXZlbiBpZlxuICAgICogc29tZWhvdyBpdCBtYW5hZ2VzIHRvIGdldCBhY2Nlc3MgdG8gaG9zdCBmaWxlIHN5c3RlbS5cbiAgICAqL1xuICByZWFkb25seSBncm91cD86IG51bWJlcjtcblxuICAvKipcbiAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBjb250YWluZXIgbXVzdCBydW4gYXMgYSBub24tcm9vdCB1c2VyLlxuICAgICogSWYgdHJ1ZSwgdGhlIEt1YmVsZXQgd2lsbCB2YWxpZGF0ZSB0aGUgaW1hZ2UgYXQgcnVudGltZSB0byBlbnN1cmUgdGhhdCBpdCBkb2VzXG4gICAgKiBub3QgcnVuIGFzIFVJRCAwIChyb290KSBhbmQgZmFpbCB0byBzdGFydCB0aGUgY29udGFpbmVyIGlmIGl0IGRvZXMuXG4gICAgKlxuICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICovXG4gIHJlYWRvbmx5IGVuc3VyZU5vblJvb3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSdW4gY29udGFpbmVyIGluIHByaXZpbGVnZWQgbW9kZS4gUHJvY2Vzc2VzIGluIHByaXZpbGVnZWQgY29udGFpbmVycyBhcmUgZXNzZW50aWFsbHkgZXF1aXZhbGVudCB0byByb290IG9uIHRoZSBob3N0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJpdmlsZWdlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb250YWluZXIgaGFzIGEgcmVhZC1vbmx5IHJvb3QgZmlsZXN5c3RlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHlSb290RmlsZXN5c3RlbT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBwcm9jZXNzIGNhbiBnYWluIG1vcmUgcHJpdmlsZWdlcyB0aGFuIGl0cyBwYXJlbnQgcHJvY2Vzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBPU0lYIGNhcGFiaWxpdGllcyBmb3IgcnVubmluZyBjb250YWluZXJzXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllcz86IENvbnRhaW5lclNlY3V0aXJ5Q29udGV4dENhcGFiaWxpdGllcztcblxuICAvKipcbiAgKiBDb250YWluZXIncyBzZWNjb21wIHByb2ZpbGUgc2V0dGluZ3MuIE9ubHkgb25lIHByb2ZpbGUgc291cmNlIG1heSBiZSBzZXRcbiAgKlxuICAqIEBkZWZhdWx0IG5vbmVcbiAgKi9cbiAgcmVhZG9ubHkgc2VjY29tcFByb2ZpbGU/OiBTZWNjb21wUHJvZmlsZTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbmV0d29yayBwb3J0IGluIGEgc2luZ2xlIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJQb3J0IHtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHBvcnQgdG8gZXhwb3NlIG9uIHRoZSBwb2QncyBJUCBhZGRyZXNzLiBUaGlzIG11c3QgYmUgYSB2YWxpZCBwb3J0IG51bWJlciwgMCA8IHggPCA2NTUzNi5cbiAgICovXG4gIHJlYWRvbmx5IG51bWJlcjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGF0IGhvc3QgSVAgdG8gYmluZCB0aGUgZXh0ZXJuYWwgcG9ydCB0by5cbiAgICpcbiAgICogQGRlZmF1bHQgLSAxMjcuMC4wLjEuXG4gICAqL1xuICByZWFkb25seSBob3N0SXA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBwb3J0IHRvIGV4cG9zZSBvbiB0aGUgaG9zdC4gSWYgc3BlY2lmaWVkLCB0aGlzIG11c3QgYmUgYSB2YWxpZCBwb3J0IG51bWJlciwgMCA8IHggPCA2NTUzNi5cbiAgICogTW9zdCBjb250YWluZXJzIGRvIG5vdCBuZWVkIHRoaXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0byBnZW5lcmF0ZWQgYnkga3ViZXJuZXRlcyBhbmQgbWlnaHQgY2hhbmdlIG9uIHJlc3RhcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdFBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElmIHNwZWNpZmllZCwgdGhpcyBtdXN0IGJlIGFuIElBTkFfU1ZDX05BTUUgYW5kIHVuaXF1ZSB3aXRoaW4gdGhlIHBvZC5cbiAgICogRWFjaCBuYW1lZCBwb3J0IGluIGEgcG9kIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLlxuICAgKiBOYW1lIGZvciB0aGUgcG9ydCB0aGF0IGNhbiBiZSByZWZlcnJlZCB0byBieSBzZXJ2aWNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBwb3J0IGlzIG5vdCBuYW1lZC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb3RvY29sIGZvciBwb3J0LiBNdXN0IGJlIFVEUCwgVENQLCBvciBTQ1RQLiBEZWZhdWx0cyB0byBcIlRDUFwiLlxuICAgKlxuICAgKiBAZGVmYXVsdCBQcm90b2NvbC5UQ1BcbiAgICovXG4gIHJlYWRvbmx5IHByb3RvY29sPzogUHJvdG9jb2w7XG5cbn1cblxuLyoqXG4gKiBOZXR3b3JrIHByb3RvY29scy5cbiAqL1xuZXhwb3J0IGVudW0gUHJvdG9jb2wge1xuXG4gIC8qKlxuICAgKiBUQ1AuXG4gICAqL1xuICBUQ1AgPSAnVENQJyxcblxuICAvKipcbiAgICogVURQLlxuICAgKi9cbiAgVURQID0gJ1VEUCcsXG5cbiAgLyoqXG4gICAqIFNDVFAuXG4gICAqL1xuICBTQ1RQID0gJ1NDVFAnLFxufVxuXG5cbi8qKlxuICogQ29udGFpbmVyIHNlY3VyaXR5IGF0dHJpYnV0ZXMgYW5kIHNldHRpbmdzLlxuICovXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyU2VjdXJpdHlDb250ZXh0IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgZW5zdXJlTm9uUm9vdDogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IHByaXZpbGVnZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSByZWFkT25seVJvb3RGaWxlc3lzdGVtOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcj86IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IGdyb3VwPzogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uPzogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGNhcGFiaWxpdGllcz86IENvbnRhaW5lclNlY3V0aXJ5Q29udGV4dENhcGFiaWxpdGllcztcbiAgcHVibGljIHJlYWRvbmx5IHNlY2NvbXBQcm9maWxlPzogU2VjY29tcFByb2ZpbGU7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IENvbnRhaW5lclNlY3VyaXR5Q29udGV4dFByb3BzID0ge30pIHtcbiAgICBpZiAocHJvcHMuc2VjY29tcFByb2ZpbGU/LmxvY2FsaG9zdFByb2ZpbGUgJiYgcHJvcHMuc2VjY29tcFByb2ZpbGUudHlwZSAhPSBTZWNjb21wUHJvZmlsZVR5cGUuTE9DQUxIT1NUKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvY2FsaG9zdFByb2ZpbGUgbXVzdCBvbmx5IGJlIHNldCBpZiB0eXBlIGlzIFwiTG9jYWxob3N0XCInKTtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVOb25Sb290ID0gcHJvcHMuZW5zdXJlTm9uUm9vdCA/PyB0cnVlO1xuICAgIHRoaXMucHJpdmlsZWdlZCA9IHByb3BzLnByaXZpbGVnZWQgPz8gZmFsc2U7XG4gICAgdGhpcy5yZWFkT25seVJvb3RGaWxlc3lzdGVtID0gcHJvcHMucmVhZE9ubHlSb290RmlsZXN5c3RlbSA/PyB0cnVlO1xuICAgIHRoaXMudXNlciA9IHByb3BzLnVzZXI7XG4gICAgdGhpcy5ncm91cCA9IHByb3BzLmdyb3VwO1xuICAgIHRoaXMuYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uID0gcHJvcHMuYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uID8/IGZhbHNlO1xuICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gcHJvcHMuY2FwYWJpbGl0aWVzO1xuICAgIHRoaXMuc2VjY29tcFByb2ZpbGUgPSBwcm9wcy5zZWNjb21wUHJvZmlsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9LdWJlKCk6IGs4cy5TZWN1cml0eUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBydW5Bc0dyb3VwOiB0aGlzLmdyb3VwLFxuICAgICAgcnVuQXNVc2VyOiB0aGlzLnVzZXIsXG4gICAgICBydW5Bc05vblJvb3Q6IHRoaXMuZW5zdXJlTm9uUm9vdCxcbiAgICAgIHByaXZpbGVnZWQ6IHRoaXMucHJpdmlsZWdlZCxcbiAgICAgIHJlYWRPbmx5Um9vdEZpbGVzeXN0ZW06IHRoaXMucmVhZE9ubHlSb290RmlsZXN5c3RlbSxcbiAgICAgIGFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbjogdGhpcy5hbGxvd1ByaXZpbGVnZUVzY2FsYXRpb24sXG4gICAgICBjYXBhYmlsaXRpZXM6IHRoaXMuY2FwYWJpbGl0aWVzLFxuICAgICAgc2VjY29tcFByb2ZpbGU6IHRoaXMuc2VjY29tcFByb2ZpbGUsXG4gICAgfTtcbiAgfVxuXG59XG5cbmV4cG9ydCBlbnVtIEVudkZpZWxkUGF0aHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHBvZC5cbiAgICovXG4gIFBPRF9OQU1FID0gJ21ldGFkYXRhLm5hbWUnLFxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwb2QuXG4gICAqL1xuICBQT0RfTkFNRVNQQUNFID0gJ21ldGFkYXRhLm5hbWVzcGFjZScsXG5cbiAgLyoqXG4gICAqIFRoZSB1aWQgb2YgdGhlIHBvZC5cbiAgICovXG4gIFBPRF9VSUQgPSAnbWV0YWRhdGEudWlkJyxcblxuICAvKipcbiAgICogVGhlIGxhYmVscyBvZiB0aGUgcG9kLlxuICAgKi9cbiAgUE9EX0xBQkVMID0gJ21ldGFkYXRhLmxhYmVscycsXG5cbiAgLyoqXG4gICAqIFRoZSBhbm5vdGF0aW9ucyBvZiB0aGUgcG9kLlxuICAgKi9cbiAgUE9EX0FOTk9UQVRJT04gPSAnbWV0YWRhdGEuYW5ub3RhdGlvbnMnLFxuXG4gIC8qKlxuICAgKiBUaGUgaXBBZGRyZXNzIG9mIHRoZSBwb2QuXG4gICAqL1xuICBQT0RfSVAgPSAnc3RhdHVzLnBvZElQJyxcblxuICAvKipcbiAgICogVGhlIHNlcnZpY2UgYWNjb3VudCBuYW1lIG9mIHRoZSBwb2QuXG4gICAqL1xuICBTRVJWSUNFX0FDQ09VTlRfTkFNRSA9ICdzcGVjLnNlcnZpY2VBY2NvdW50TmFtZScsXG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBub2RlLlxuICAgKi9cbiAgTk9ERV9OQU1FID0gJ3NwZWMubm9kZU5hbWUnLFxuXG4gIC8qKlxuICAgKiBUaGUgaXBBZGRyZXNzIG9mIHRoZSBub2RlLlxuICAgKi9cbiAgTk9ERV9JUCA9ICdzdGF0dXMuaG9zdElQJyxcblxuICAvKipcbiAgICogVGhlIGlwQWRkcmVzZXNzIG9mIHRoZSBwb2QuXG4gICAqL1xuICBQT0RfSVBTID0gJ3N0YXR1cy5wb2RJUHMnLFxufVxuXG5leHBvcnQgZW51bSBSZXNvdXJjZUZpZWxkUGF0aHMge1xuICAvKipcbiAgICogQ1BVIGxpbWl0IG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBDUFVfTElNSVQgPSAnbGltaXRzLmNwdScsXG5cbiAgLyoqXG4gICAqIE1lbW9yeSBsaW1pdCBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgTUVNT1JZX0xJTUlUID0gJ2xpbWl0cy5tZW1vcnknLFxuXG4gIC8qKlxuICAgKiBDUFUgcmVxdWVzdCBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgQ1BVX1JFUVVFU1QgPSAncmVxdWVzdHMuY3B1JyxcblxuICAvKipcbiAgICogTWVtb3J5IHJlcXVlc3Qgb2YgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIE1FTU9SWV9SRVFVRVNUID0gJ3JlcXVlc3RzLm1lbW9yeScsXG5cbiAgLyoqXG4gICAqIEVwaGVtZXJhbCBzdG9yYWdlIGxpbWl0IG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBTVE9SQUdFX0xJTUlUID0gJ2xpbWl0cy5lcGhlbWVyYWwtc3RvcmFnZScsXG5cbiAgLyoqXG4gICAqIEVwaGVtZXJhbCBzdG9yYWdlIHJlcXVlc3Qgb2YgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIFNUT1JBR0VfUkVRVUVTVCA9ICdyZXF1ZXN0cy5lcGhlbWVyYWwtc3RvcmFnZScsXG59XG5cbi8qKlxuICogT3B0aW9ucyB0byBzcGVjaWZ5IGFuIGVudmlvbm1lbnQgdmFyaWFibGUgdmFsdWUgZnJvbSBhIENvbmZpZ01hcCBrZXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52VmFsdWVGcm9tQ29uZmlnTWFwT3B0aW9ucyB7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gc3BlY2lmeSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBmcm9tIGEgU2VjcmV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudlZhbHVlRnJvbVNlY3JldE9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gc3BlY2lmeSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBmcm9tIHRoZSBwcm9jZXNzIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudlZhbHVlRnJvbVByb2Nlc3NPcHRpb25zIHtcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBrZXkgbXVzdCBleGlzdCBpbiB0aGUgZW52aXJvbm1lbnQuXG4gICAqIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIGFuZCB0aGUga2V5IGRvZXMgbm90IGV4aXN0LCBhbiBlcnJvciB3aWxsIHRocm93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIHNwZWNpZnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgZnJvbSBhIGZpZWxkIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnZWYWx1ZUZyb21GaWVsZFJlZk9wdGlvbnMge1xuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUgc2NoZW1hIHRoZSBGaWVsZFBhdGggaXMgd3JpdHRlbiBpbiB0ZXJtcyBvZi5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0IHRoZSBwb2QgbGFiZWwgb3IgYW5ub3RhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGtleT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIHNwZWNpZnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgZnJvbSBhIHJlc291cmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudlZhbHVlRnJvbVJlc291cmNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHRvIHNlbGVjdCB0aGUgdmFsdWUgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lcj86IENvbnRhaW5lcjtcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBmb3JtYXQgb2YgdGhlIGV4cG9zZWQgcmVzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBkaXZpc29yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZm9yIGNyZWF0aW5nIHJlYWRpbmcgZW52IHZhbHVlcyBmcm9tIHZhcmlvdXMgc291cmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudlZhbHVlIHtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgdmFsdWUgYnkgcmVhZGluZyBhIHNwZWNpZmljIGtleSBpbnNpZGUgYSBjb25maWcgbWFwLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnTWFwIC0gVGhlIGNvbmZpZyBtYXAuXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29uZmlnTWFwKGNvbmZpZ01hcDogY29uZmlnbWFwLklDb25maWdNYXAsIGtleTogc3RyaW5nLCBvcHRpb25zOiBFbnZWYWx1ZUZyb21Db25maWdNYXBPcHRpb25zID0ge30pOiBFbnZWYWx1ZSB7XG5cbiAgICBjb25zdCBzb3VyY2U6IGs4cy5FbnZWYXJTb3VyY2UgPSB7XG4gICAgICBjb25maWdNYXBLZXlSZWY6IHtcbiAgICAgICAgbmFtZTogY29uZmlnTWFwLm5hbWUsXG4gICAgICAgIGtleSxcbiAgICAgICAgb3B0aW9uYWw6IG9wdGlvbnMub3B0aW9uYWwsXG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBFbnZWYWx1ZSh1bmRlZmluZWQsIHNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBhbiBlbnZpcm9ubWVudCB2YWx1ZSBmcm9tIGEgc2VjcmV0IEpTT04gdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBzZWNyZXRWYWx1ZSBUaGUgc2VjcmV0IHZhbHVlIChzZWNyZW50ICsga2V5KVxuICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlY3JldFZhbHVlKHNlY3JldFZhbHVlOiBzZWNyZXQuU2VjcmV0VmFsdWUsIG9wdGlvbnM6IEVudlZhbHVlRnJvbVNlY3JldE9wdGlvbnMgPSB7fSk6IEVudlZhbHVlIHtcbiAgICBjb25zdCBzb3VyY2U6IGs4cy5FbnZWYXJTb3VyY2UgPSB7XG4gICAgICBzZWNyZXRLZXlSZWY6IHtcbiAgICAgICAgbmFtZTogc2VjcmV0VmFsdWUuc2VjcmV0Lm5hbWUsXG4gICAgICAgIGtleTogc2VjcmV0VmFsdWUua2V5LFxuICAgICAgICBvcHRpb25hbDogb3B0aW9ucy5vcHRpb25hbCxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgRW52VmFsdWUodW5kZWZpbmVkLCBzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZhbHVlIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21WYWx1ZSh2YWx1ZTogc3RyaW5nKTogRW52VmFsdWUge1xuICAgIHJldHVybiBuZXcgRW52VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIENyZWF0ZSBhIHZhbHVlIGZyb20gYSBmaWVsZCByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZFBhdGg6IFRoZSBmaWVsZCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSBvcHRpb25zOiBBZGRpdGlvbmFsIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21GaWVsZFJlZihmaWVsZFBhdGg6IEVudkZpZWxkUGF0aHMsIG9wdGlvbnM6IEVudlZhbHVlRnJvbUZpZWxkUmVmT3B0aW9ucyA9IHt9KTogRW52VmFsdWUge1xuICAgIGxldCBuZWVkc0tleTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgaWYgKGZpZWxkUGF0aCA9PT0gRW52RmllbGRQYXRocy5QT0RfTEFCRUwgfHwgZmllbGRQYXRoID09PSBFbnZGaWVsZFBhdGhzLlBPRF9BTk5PVEFUSU9OKSB7XG4gICAgICBuZWVkc0tleSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzS2V5ICYmIG9wdGlvbnMua2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZFBhdGh9IHJlcXVpcmVzIGEga2V5YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlOiBrOHMuRW52VmFyU291cmNlID0ge1xuICAgICAgZmllbGRSZWY6IHtcbiAgICAgICAgZmllbGRQYXRoOiAoYCR7ZmllbGRQYXRofWAgKyAobmVlZHNLZXkgPyBgWycke29wdGlvbnMua2V5fSddYCA6ICcnKSksXG4gICAgICAgIC4uLihvcHRpb25zLmFwaVZlcnNpb24gPyB7IGFwaVZlcnNpb246IG9wdGlvbnMuYXBpVmVyc2lvbiB9IDoge30pLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBFbnZWYWx1ZSh1bmRlZmluZWQsIHNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdmFsdWUgZnJvbSBhIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2U6IFJlc291cmNlIHRvIHNlbGVjdCB0aGUgdmFsdWUgZnJvbS5cbiAgICogQHBhcmFtIG9wdGlvbnM6IEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVJlc291cmNlKHJlc291cmNlOiBSZXNvdXJjZUZpZWxkUGF0aHMsIG9wdGlvbnM6IEVudlZhbHVlRnJvbVJlc291cmNlT3B0aW9ucyA9IHt9KTogRW52VmFsdWUge1xuICAgIGNvbnN0IHNvdXJjZTogazhzLkVudlZhclNvdXJjZSA9IHtcbiAgICAgIHJlc291cmNlRmllbGRSZWY6IHtcbiAgICAgICAgcmVzb3VyY2U6IGAke3Jlc291cmNlfWAsXG4gICAgICAgIC4uLiAob3B0aW9ucy5kaXZpc29yID8geyBkaXZpc29yOiBrOHMuSW50T3JTdHJpbmcuZnJvbVN0cmluZyhvcHRpb25zLmRpdmlzb3IpIH0gOiB7fSksXG4gICAgICAgIC4uLiAob3B0aW9ucy5jb250YWluZXIgPyB7IGNvbnRhaW5lck5hbWU6IG9wdGlvbnMuY29udGFpbmVyLm5hbWUgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgRW52VmFsdWUodW5kZWZpbmVkLCBzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZhbHVlIGZyb20gYSBrZXkgaW4gdGhlIGN1cnJlbnQgcHJvY2VzcyBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gcmVhZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBBZGRpdGlvbmFsIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Qcm9jZXNzKGtleTogc3RyaW5nLCBvcHRpb25zOiBFbnZWYWx1ZUZyb21Qcm9jZXNzT3B0aW9ucyA9IHt9KTogRW52VmFsdWUge1xuXG4gICAgY29uc3QgdmFsdWUgPSBwcm9jZXNzLmVudltrZXldO1xuXG4gICAgaWYgKG9wdGlvbnMucmVxdWlyZWQgJiYgIXZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgJHtrZXl9IGVudiB2YXJpYWJsZWApO1xuICAgIH1cblxuICAgIHJldHVybiBFbnZWYWx1ZS5mcm9tVmFsdWUodmFsdWUhKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlPzogYW55LCBwdWJsaWMgcmVhZG9ubHkgdmFsdWVGcm9tPzogYW55KSB7IH1cbn1cblxuZXhwb3J0IGVudW0gSW1hZ2VQdWxsUG9saWN5IHtcbiAgLyoqXG4gICAqIEV2ZXJ5IHRpbWUgdGhlIGt1YmVsZXQgbGF1bmNoZXMgYSBjb250YWluZXIsIHRoZSBrdWJlbGV0IHF1ZXJpZXMgdGhlIGNvbnRhaW5lciBpbWFnZSByZWdpc3RyeVxuICAgKiB0byByZXNvbHZlIHRoZSBuYW1lIHRvIGFuIGltYWdlIGRpZ2VzdC4gSWYgdGhlIGt1YmVsZXQgaGFzIGEgY29udGFpbmVyIGltYWdlIHdpdGggdGhhdCBleGFjdFxuICAgKiBkaWdlc3QgY2FjaGVkIGxvY2FsbHksIHRoZSBrdWJlbGV0IHVzZXMgaXRzIGNhY2hlZCBpbWFnZTsgb3RoZXJ3aXNlLCB0aGUga3ViZWxldCBkb3dubG9hZHNcbiAgICogKHB1bGxzKSB0aGUgaW1hZ2Ugd2l0aCB0aGUgcmVzb2x2ZWQgZGlnZXN0LCBhbmQgdXNlcyB0aGF0IGltYWdlIHRvIGxhdW5jaCB0aGUgY29udGFpbmVyLlxuICAgKlxuICAgKiBEZWZhdWx0IGlzIEFsd2F5cyBpZiBJbWFnZVB1bGxQb2xpY3kgaXMgb21pdHRlZCBhbmQgZWl0aGVyIHRoZSBpbWFnZSB0YWcgaXMgOmxhdGVzdCBvclxuICAgKiB0aGUgaW1hZ2UgdGFnIGlzIG9taXR0ZWQuXG4gICAqL1xuICBBTFdBWVMgPSAnQWx3YXlzJyxcblxuICAvKipcbiAgICogVGhlIGltYWdlIGlzIHB1bGxlZCBvbmx5IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgbG9jYWxseS5cbiAgICpcbiAgICogRGVmYXVsdCBpcyBJZk5vdFByZXNlbnQgaWYgSW1hZ2VQdWxsUG9saWN5IGlzIG9taXR0ZWQgYW5kIHRoZSBpbWFnZSB0YWcgaXMgcHJlc2VudCBidXRcbiAgICogbm90IDpsYXRlc3RcbiAgICovXG4gIElGX05PVF9QUkVTRU5UID0gJ0lmTm90UHJlc2VudCcsXG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBpcyBhc3N1bWVkIHRvIGV4aXN0IGxvY2FsbHkuIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBwdWxsIHRoZSBpbWFnZS5cbiAgICovXG4gIE5FVkVSID0gJ05ldmVyJyxcbn1cblxuLyoqXG4gKiBDb250YWluZXIgbGlmZWN5Y2xlIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyTGlmZWN5Y2xlIHtcblxuICAvKipcbiAgICogVGhpcyBob29rIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY29udGFpbmVyIGlzIGNyZWF0ZWQuIEhvd2V2ZXIsXG4gICAqIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBob29rIHdpbGwgZXhlY3V0ZSBiZWZvcmUgdGhlIGNvbnRhaW5lciBFTlRSWVBPSU5ULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHBvc3Qgc3RhcnQgaGFuZGxlci5cbiAgICovXG4gIHJlYWRvbmx5IHBvc3RTdGFydD86IGhhbmRsZXIuSGFuZGxlcjtcblxuICAvKipcbiAgICogVGhpcyBob29rIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgYSBjb250YWluZXIgaXMgdGVybWluYXRlZCBkdWUgdG8gYW4gQVBJIHJlcXVlc3Qgb3IgbWFuYWdlbWVudFxuICAgKiBldmVudCBzdWNoIGFzIGEgbGl2ZW5lc3Mvc3RhcnR1cCBwcm9iZSBmYWlsdXJlLCBwcmVlbXB0aW9uLCByZXNvdXJjZSBjb250ZW50aW9uIGFuZCBvdGhlcnMuXG4gICAqIEEgY2FsbCB0byB0aGUgUHJlU3RvcCBob29rIGZhaWxzIGlmIHRoZSBjb250YWluZXIgaXMgYWxyZWFkeSBpbiBhIHRlcm1pbmF0ZWQgb3IgY29tcGxldGVkIHN0YXRlXG4gICAqIGFuZCB0aGUgaG9vayBtdXN0IGNvbXBsZXRlIGJlZm9yZSB0aGUgVEVSTSBzaWduYWwgdG8gc3RvcCB0aGUgY29udGFpbmVyIGNhbiBiZSBzZW50LlxuICAgKiBUaGUgUG9kJ3MgdGVybWluYXRpb24gZ3JhY2UgcGVyaW9kIGNvdW50ZG93biBiZWdpbnMgYmVmb3JlIHRoZSBQcmVTdG9wIGhvb2sgaXMgZXhlY3V0ZWQsXG4gICAqIHNvIHJlZ2FyZGxlc3Mgb2YgdGhlIG91dGNvbWUgb2YgdGhlIGhhbmRsZXIsIHRoZSBjb250YWluZXIgd2lsbCBldmVudHVhbGx5IHRlcm1pbmF0ZVxuICAgKiB3aXRoaW4gdGhlIFBvZCdzIHRlcm1pbmF0aW9uIGdyYWNlIHBlcmlvZC4gTm8gcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3dvcmtsb2Fkcy9wb2RzL3BvZC1saWZlY3ljbGUvI3BvZC10ZXJtaW5hdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHByZSBzdG9wIGhhbmRsZXIuXG4gICAqL1xuICByZWFkb25seSBwcmVTdG9wPzogaGFuZGxlci5IYW5kbGVyO1xuXG59XG5cbi8qKlxuICogUmVzdGFydFBvbGljeSBkZWZpbmVzIHRoZSByZXN0YXJ0IGJlaGF2aW9yIG9mIGluZGl2aWR1YWwgY29udGFpbmVycyBpbiBhIHBvZC5cbiAqIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgc2V0IGZvciBpbml0IGNvbnRhaW5lcnMsIGFuZCB0aGUgb25seSBhbGxvd2VkIHZhbHVlIGlzIFwiQWx3YXlzXCIuXG4gKiBGb3Igbm9uLWluaXQgY29udGFpbmVycyBvciB3aGVuIHRoaXMgZmllbGQgaXMgbm90IHNwZWNpZmllZCxcbiAqIHRoZSByZXN0YXJ0IGJlaGF2aW9yIGlzIGRlZmluZWQgYnkgdGhlIFBvZCdzIHJlc3RhcnQgcG9saWN5IGFuZCB0aGUgY29udGFpbmVyIHR5cGUuXG4gKiBTZXR0aW5nIHRoZSBSZXN0YXJ0UG9saWN5IGFzIFwiQWx3YXlzXCIgZm9yIHRoZSBpbml0IGNvbnRhaW5lciB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBlZmZlY3Q6XG4gKiB0aGlzIGluaXQgY29udGFpbmVyIHdpbGwgYmUgY29udGludWFsbHkgcmVzdGFydGVkIG9uIGV4aXQgdW50aWwgYWxsIHJlZ3VsYXIgY29udGFpbmVycyBoYXZlIHRlcm1pbmF0ZWQuXG4gKiBPbmNlIGFsbCByZWd1bGFyIGNvbnRhaW5lcnMgaGF2ZSBjb21wbGV0ZWQsIGFsbCBpbml0IGNvbnRhaW5lcnMgd2l0aCByZXN0YXJ0UG9saWN5IFwiQWx3YXlzXCIgd2lsbCBiZSBzaHV0IGRvd24uXG4gKiBUaGlzIGxpZmVjeWNsZSBkaWZmZXJzIGZyb20gbm9ybWFsIGluaXQgY29udGFpbmVycyBhbmQgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgYSBcInNpZGVjYXJcIiBjb250YWluZXIuXG4gKlxuICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy93b3JrbG9hZHMvcG9kcy9zaWRlY2FyLWNvbnRhaW5lcnMvXG4gKi9cbmV4cG9ydCBlbnVtIENvbnRhaW5lclJlc3RhcnRQb2xpY3kge1xuXG4gIC8qKlxuICAgKiBJZiBhbiBpbml0IGNvbnRhaW5lciBpcyBjcmVhdGVkIHdpdGggaXRzIHJlc3RhcnRQb2xpY3kgc2V0IHRvIEFsd2F5cyxcbiAgICogaXQgd2lsbCBzdGFydCBhbmQgcmVtYWluIHJ1bm5pbmcgZHVyaW5nIHRoZSBlbnRpcmUgbGlmZSBvZiB0aGUgUG9kLlxuICAgKiBGb3IgcmVndWxhciBjb250YWluZXJzLCB0aGlzIGlzIGlnbm9yZWQgYnkgS3ViZXJuZXRlcy5cbiAgICovXG4gIEFMV0FZUyA9ICdBbHdheXMnLFxufVxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJQcm9wcyBleHRlbmRzIENvbnRhaW5lck9wdHMge1xuXG4gIC8qKlxuICAgKiBEb2NrZXIgaW1hZ2UgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9uYWwgcHJvcGVydGllcyBvZiBhIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJPcHRzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGNvbnRhaW5lciBzcGVjaWZpZWQgYXMgYSBETlNfTEFCRUwuIEVhY2ggY29udGFpbmVyIGluIGEgcG9kIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lIChETlNfTEFCRUwpLiBDYW5ub3QgYmUgdXBkYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgJ21haW4nXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBgcG9ydE51bWJlcmAuXG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcG9ydCB0byBleHBvc2Ugb24gdGhlIHBvZCdzIElQIGFkZHJlc3MuIFRoaXMgbXVzdCBiZSBhIHZhbGlkIHBvcnQgbnVtYmVyLCAwIDwgeCA8IDY1NTM2LlxuICAgKlxuICAgKiBUaGlzIGlzIGEgY29udmluaWVuY2UgcHJvcGVydHkgaWYgYWxsIHlvdSBuZWVkIGEgc2luZ2xlIFRDUCBudW1iZXJlZCBwb3J0LlxuICAgKiBJbiBjYXNlIG1vcmUgYWR2YW5jZWQgY29uZmlndWFydGlvbiBpcyByZXF1aXJlZCwgdXNlIHRoZSBgcG9ydHNgIHByb3BlcnR5LlxuICAgKlxuICAgKiBUaGlzIHBvcnQgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcG9ydHMgbWVudGlvbmVkIGluIHRoZSBgcG9ydHNgIHByb3BlcnR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE9ubHkgdGhlIHBvcnRzIG1lbnRpb25kIGluIHRoZSBgcG9ydHNgIHByb3BlcnR5IGFyZSBleHBvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydE51bWJlcj86IG51bWJlcjtcblxuICAvKipcbiAgICogTGlzdCBvZiBwb3J0cyB0byBleHBvc2UgZnJvbSB0aGlzIGNvbnRhaW5lci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBPbmx5IHRoZSBwb3J0IG1lbnRpb25lZCBpbiB0aGUgYHBvcnROdW1iZXJgIHByb3BlcnR5IGlzIGV4cG9zZWQuXG4gICAqL1xuICByZWFkb25seSBwb3J0cz86IENvbnRhaW5lclBvcnRbXTtcblxuICAvKipcbiAgICogRW50cnlwb2ludCBhcnJheS4gTm90IGV4ZWN1dGVkIHdpdGhpbiBhIHNoZWxsLiBUaGUgZG9ja2VyIGltYWdlJ3MgRU5UUllQT0lOVCBpcyB1c2VkIGlmIHRoaXMgaXMgbm90IHByb3ZpZGVkLiBWYXJpYWJsZSByZWZlcmVuY2VzICQoVkFSX05BTUUpIGFyZSBleHBhbmRlZCB1c2luZyB0aGUgY29udGFpbmVyJ3MgZW52aXJvbm1lbnQuXG4gICAqIElmIGEgdmFyaWFibGUgY2Fubm90IGJlIHJlc29sdmVkLCB0aGUgcmVmZXJlbmNlIGluIHRoZSBpbnB1dCBzdHJpbmcgd2lsbCBiZSB1bmNoYW5nZWQuIFRoZSAkKFZBUl9OQU1FKSBzeW50YXggY2FuIGJlIGVzY2FwZWQgd2l0aCBhIGRvdWJsZSAkJCwgaWU6ICQkKFZBUl9OQU1FKS5cbiAgICogRXNjYXBlZCByZWZlcmVuY2VzIHdpbGwgbmV2ZXIgYmUgZXhwYW5kZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdmFyaWFibGUgZXhpc3RzIG9yIG5vdC4gQ2Fubm90IGJlIHVwZGF0ZWQuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvdGFza3MvaW5qZWN0LWRhdGEtYXBwbGljYXRpb24vZGVmaW5lLWNvbW1hbmQtYXJndW1lbnQtY29udGFpbmVyLyNydW5uaW5nLWEtY29tbWFuZC1pbi1hLXNoZWxsXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIGRvY2tlciBpbWFnZSdzIEVOVFJZUE9JTlQuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFyZ3VtZW50cyB0byB0aGUgZW50cnlwb2ludC4gVGhlIGRvY2tlciBpbWFnZSdzIENNRCBpcyB1c2VkIGlmIGBjb21tYW5kYCBpc1xuICAgKiBub3QgcHJvdmlkZWQuXG4gICAqXG4gICAqIFZhcmlhYmxlIHJlZmVyZW5jZXMgJChWQVJfTkFNRSkgYXJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjb250YWluZXInc1xuICAgKiBlbnZpcm9ubWVudC4gSWYgYSB2YXJpYWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQsIHRoZSByZWZlcmVuY2UgaW4gdGhlIGlucHV0XG4gICAqIHN0cmluZyB3aWxsIGJlIHVuY2hhbmdlZC4gVGhlICQoVkFSX05BTUUpIHN5bnRheCBjYW4gYmUgZXNjYXBlZCB3aXRoIGFcbiAgICogZG91YmxlICQkLCBpZTogJCQoVkFSX05BTUUpLiBFc2NhcGVkIHJlZmVyZW5jZXMgd2lsbCBuZXZlciBiZSBleHBhbmRlZCxcbiAgICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB2YXJpYWJsZSBleGlzdHMgb3Igbm90LlxuICAgKlxuICAgKiBDYW5ub3QgYmUgdXBkYXRlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy90YXNrcy9pbmplY3QtZGF0YS1hcHBsaWNhdGlvbi9kZWZpbmUtY29tbWFuZC1hcmd1bWVudC1jb250YWluZXIvI3J1bm5pbmctYS1jb21tYW5kLWluLWEtc2hlbGxcbiAgICogQGRlZmF1bHQgW11cbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ29udGFpbmVyJ3Mgd29ya2luZyBkaXJlY3RvcnkuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIgcnVudGltZSdzIGRlZmF1bHQgd2lsbCBiZSB1c2VkLCB3aGljaCBtaWdodCBiZSBjb25maWd1cmVkIGluIHRoZSBjb250YWluZXIgaW1hZ2UuIENhbm5vdCBiZSB1cGRhdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBjb250YWluZXIgcnVudGltZSdzIGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSB3b3JraW5nRGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0IGluIHRoZSBjb250YWluZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52VmFyaWFibGVzPzogeyBbbmFtZTogc3RyaW5nXTogRW52VmFsdWUgfTtcblxuICAvKipcbiAgICogTGlzdCBvZiBzb3VyY2VzIHRvIHBvcHVsYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiB0aGUgY29udGFpbmVyLlxuICAgKiBXaGVuIGEga2V5IGV4aXN0cyBpbiBtdWx0aXBsZSBzb3VyY2VzLCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoXG4gICAqIHRoZSBsYXN0IHNvdXJjZSB3aWxsIHRha2UgcHJlY2VkZW5jZS4gVmFsdWVzIGRlZmluZWQgYnkgdGhlIGBlbnZWYXJpYWJsZXNgIHByb3BlcnR5XG4gICAqIHdpdGggYSBkdXBsaWNhdGUga2V5IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHNvdXJjZXMuXG4gICAqL1xuICByZWFkb25seSBlbnZGcm9tPzogRW52RnJvbVtdO1xuXG4gIC8qKlxuICAgKiBQb2Qgdm9sdW1lcyB0byBtb3VudCBpbnRvIHRoZSBjb250YWluZXIncyBmaWxlc3lzdGVtLiBDYW5ub3QgYmUgdXBkYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZU1vdW50cz86IFZvbHVtZU1vdW50W107XG5cbiAgLyoqXG4gICAqIEltYWdlIHB1bGwgcG9saWN5IGZvciB0aGlzIGNvbnRhaW5lclxuICAgKiBAZGVmYXVsdCBJbWFnZVB1bGxQb2xpY3kuQUxXQVlTXG4gICAqL1xuICByZWFkb25seSBpbWFnZVB1bGxQb2xpY3k/OiBJbWFnZVB1bGxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hlbiB0aGUgY29udGFpbmVyIGlzIHJlYWR5IHRvIHNlcnZlIHRyYWZmaWMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcmVhZGluZXNzIHByb2JlIGlzIGRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlYWRpbmVzcz86IHByb2JlLlByb2JlO1xuXG4gIC8qKlxuICAgKiBQZXJpb2RpYyBwcm9iZSBvZiBjb250YWluZXIgbGl2ZW5lc3MuIENvbnRhaW5lciB3aWxsIGJlIHJlc3RhcnRlZCBpZiB0aGUgcHJvYmUgZmFpbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbGl2ZW5lc3MgcHJvYmUgaXMgZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgbGl2ZW5lc3M/OiBwcm9iZS5Qcm9iZTtcblxuICAvKipcbiAgICogU3RhcnR1cFByb2JlIGluZGljYXRlcyB0aGF0IHRoZSBQb2QgaGFzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC5cbiAgICogSWYgc3BlY2lmaWVkLCBubyBvdGhlciBwcm9iZXMgYXJlIGV4ZWN1dGVkIHVudGlsIHRoaXMgY29tcGxldGVzIHN1Y2Nlc3NmdWxseVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIGEgcG9ydCBpcyBwcm92aWRlZCwgdGhlbiBrbm9ja3Mgb24gdGhhdCBwb3J0XG4gICAqIHRvIGRldGVybWluZSB3aGVuIHRoZSBjb250YWluZXIgaXMgcmVhZHkgZm9yIHJlYWRpbmVzcyBhbmRcbiAgICogbGl2ZW5lc3MgcHJvYmUgY2hlY2tzLlxuICAgKiBPdGhlcndpc2UsIG5vIHN0YXJ0dXAgcHJvYmUgaXMgZGVmaW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0dXA/OiBwcm9iZS5Qcm9iZTtcblxuICAvKipcbiAgICogRGVzY3JpYmVzIGFjdGlvbnMgdGhhdCB0aGUgbWFuYWdlbWVudCBzeXN0ZW0gc2hvdWxkIHRha2UgaW4gcmVzcG9uc2UgdG8gY29udGFpbmVyIGxpZmVjeWNsZSBldmVudHMuXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGU/OiBDb250YWluZXJMaWZlY3ljbGU7XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgcmVzb3VyY2VzIChDUFUgYW5kIG1lbW9yeSByZXF1ZXN0cyBhbmQgbGltaXRzKSByZXF1aXJlZCBieSB0aGUgY29udGFpbmVyXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvY29uZmlndXJhdGlvbi9tYW5hZ2UtcmVzb3VyY2VzLWNvbnRhaW5lcnMvXG4gICAqXG4gICAqIEBkZWZhdWx0XG4gICAqICAgIGNwdTpcbiAgICogICAgICByZXF1ZXN0OiAxMDAwIG1pbGxpc1xuICAgKiAgICAgIGxpbWl0OiAxNTAwIG1pbGxpc1xuICAgKiAgICBtZW1vcnk6XG4gICAqICAgICAgcmVxdWVzdDogNTEyIG1lYmlieXRlc1xuICAgKiAgICAgIGxpbWl0OiAyMDQ4IG1lYmlieXRlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzPzogQ29udGFpbmVyUmVzb3VyY2VzO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eUNvbnRleHQgZGVmaW5lcyB0aGUgc2VjdXJpdHkgb3B0aW9ucyB0aGUgY29udGFpbmVyIHNob3VsZCBiZSBydW4gd2l0aC5cbiAgICogSWYgc2V0LCB0aGUgZmllbGRzIG92ZXJyaWRlIGVxdWl2YWxlbnQgZmllbGRzIG9mIHRoZSBwb2QncyBzZWN1cml0eSBjb250ZXh0LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL3Rhc2tzL2NvbmZpZ3VyZS1wb2QtY29udGFpbmVyL3NlY3VyaXR5LWNvbnRleHQvXG4gICAqIEBkZWZhdWx0XG4gICAqXG4gICAqICAgZW5zdXJlTm9uUm9vdDogdHJ1ZVxuICAgKiAgIHByaXZpbGVnZWQ6IGZhbHNlXG4gICAqICAgcmVhZE9ubHlSb290RmlsZXN5c3RlbTogdHJ1ZVxuICAgKiAgIGFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbjogZmFsc2VcbiAgICogICB1c2VyOiAyNTAwMFxuICAgKiAgIGdyb3VwOiAyNjAwMFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlDb250ZXh0PzogQ29udGFpbmVyU2VjdXJpdHlDb250ZXh0UHJvcHM7XG5cbiAgLyoqXG4gICAqIEt1YmVsZXQgd2lsbCBzdGFydCBpbml0IGNvbnRhaW5lcnMgd2l0aCByZXN0YXJ0UG9saWN5PUFsd2F5cyBpbiB0aGUgb3JkZXIgd2l0aCBvdGhlciBpbml0IGNvbnRhaW5lcnMsXG4gICAqIGJ1dCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIGl0cyBjb21wbGV0aW9uLCBpdCB3aWxsIHdhaXQgZm9yIHRoZSBjb250YWluZXIgc3RhcnR1cCBjb21wbGV0aW9uXG4gICAqIEN1cnJlbnRseSwgb25seSBhY2NlcHRlZCB2YWx1ZSBpcyBBbHdheXNcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy93b3JrbG9hZHMvcG9kcy9zaWRlY2FyLWNvbnRhaW5lcnMvXG4gICAqIEBkZWZhdWx0IC0gbm8gcmVzdGFydCBwb2xpY3kgaXMgZGVmaW5lZCBhbmQgdGhlIHBvZCByZXN0YXJ0IHBvbGljeSBpcyBhcHBsaWVkXG4gICAqL1xuICByZWFkb25seSByZXN0YXJ0UG9saWN5PzogQ29udGFpbmVyUmVzdGFydFBvbGljeTtcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBhcHBsaWNhdGlvbiBjb250YWluZXIgdGhhdCB5b3Ugd2FudCB0byBydW4gd2l0aGluIGEgcG9kLlxuICovXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyIHtcblxuICAvKipcbiAgICogVGhlIHBvcnQgbnVtYmVyIHRoYXQgd2FzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgY29udGFpbmVyLlxuICAgKiBJZiB1bmRlZmluZWQsIGVpdGhlciB0aGUgY29udGFpbmVyIGRvZXNuJ3QgZXhwb3NlIGEgcG9ydCwgb3IgaXRzXG4gICAqIHBvcnQgY29uZmlndXJhdGlvbiBpcyBzdG9yZWQgaW4gdGhlIGBwb3J0c2AgZmllbGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcG9ydE51bWJlcj86IG51bWJlcjtcblxuICAvKipcbiAgICogVm9sdW1lIG1vdW50cyBjb25maWd1cmVkIGZvciB0aGlzIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb3VudHM6IFZvbHVtZU1vdW50W107XG5cbiAgLyoqXG4gICAqIEltYWdlIHB1bGwgcG9saWN5IGZvciB0aGlzIGNvbnRhaW5lclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGltYWdlUHVsbFBvbGljeTogSW1hZ2VQdWxsUG9saWN5O1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIGltYWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgaW5zaWRlIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2luZ0Rpcj86IHN0cmluZztcblxuICAvKipcbiAgICogQ29tcHV0ZSByZXNvdXJjZXMgKENQVSBhbmQgbWVtb3J5IHJlcXVlc3RzIGFuZCBsaW1pdHMpIHJlcXVpcmVkIGJ5IHRoZSBjb250YWluZXJcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9jb25maWd1cmF0aW9uL21hbmFnZS1yZXNvdXJjZXMtY29udGFpbmVycy9cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZXM/OiBDb250YWluZXJSZXNvdXJjZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjdXJpdHlDb250ZXh0OiBDb250YWluZXJTZWN1cml0eUNvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudjogRW52O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzdGFydCBwb2xpY3kgb2YgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXN0YXJ0UG9saWN5PzogQ29udGFpbmVyUmVzdGFydFBvbGljeTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9jb21tYW5kPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FyZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcG9ydHM6IENvbnRhaW5lclBvcnRbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZWFkaW5lc3M/OiBwcm9iZS5Qcm9iZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbGl2ZW5lc3M/OiBwcm9iZS5Qcm9iZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhcnR1cD86IHByb2JlLlByb2JlO1xuICBwcml2YXRlIHJlYWRvbmx5IF9saWZlY3ljbGU/OiBDb250YWluZXJMaWZlY3ljbGU7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IENvbnRhaW5lclByb3BzKSB7XG4gICAgaWYgKHByb3BzIGluc3RhbmNlb2YgQ29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byBjb25zdHJ1Y3QgYSBjb250YWluZXIgZnJvbSBhIENvbnRhaW5lciBvYmplY3QuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFJlc291cmNlU3BlYzogQ29udGFpbmVyUmVzb3VyY2VzID0ge1xuICAgICAgY3B1OiB7XG4gICAgICAgIHJlcXVlc3Q6IENwdS5taWxsaXMoMTAwMCksXG4gICAgICAgIGxpbWl0OiBDcHUubWlsbGlzKDE1MDApLFxuICAgICAgfSxcbiAgICAgIG1lbW9yeToge1xuICAgICAgICByZXF1ZXN0OiBTaXplLm1lYmlieXRlcyg1MTIpLFxuICAgICAgICBsaW1pdDogU2l6ZS5tZWJpYnl0ZXMoMjA0OCksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAocHJvcHMucG9ydCAmJiBwcm9wcy5wb3J0TnVtYmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VpdGhlciBcXCdwb3J0XFwnIG9yIFxcJ3BvcnROdW1iZXJcXCcgaXMgYWxsb3dlZC4gVXNlIFxcJ3BvcnROdW1iZXJcXCcgc2luY2UgXFwncG9ydFxcJyBpcyBkZXByZWNhdGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydE51bWJlciA9IHByb3BzLnBvcnROdW1iZXIgPz8gcHJvcHMucG9ydDtcbiAgICBjb25zdCBkZWZhdWx0UHJvYmVDb25maWd1cmF0aW9uOiBwcm9iZS5Qcm9iZSA9IHByb2JlLlByb2JlLmZyb21UY3BTb2NrZXQoeyBwb3J0OiBwb3J0TnVtYmVyIH0pO1xuXG4gICAgdGhpcy5uYW1lID0gcHJvcHMubmFtZSA/PyAnbWFpbic7XG4gICAgdGhpcy5pbWFnZSA9IHByb3BzLmltYWdlO1xuICAgIHRoaXMucG9ydE51bWJlciA9IHBvcnROdW1iZXI7XG4gICAgdGhpcy5fY29tbWFuZCA9IHByb3BzLmNvbW1hbmQ7XG4gICAgdGhpcy5fYXJncyA9IHByb3BzLmFyZ3M7XG4gICAgdGhpcy5fcmVhZGluZXNzID0gcHJvcHMucmVhZGluZXNzO1xuICAgIHRoaXMuX2xpdmVuZXNzID0gcHJvcHMubGl2ZW5lc3M7XG4gICAgdGhpcy5fc3RhcnR1cCA9IHByb3BzLnN0YXJ0dXAgPz8gKHRoaXMucG9ydE51bWJlciA/IGRlZmF1bHRQcm9iZUNvbmZpZ3VyYXRpb24gOiB1bmRlZmluZWQpO1xuICAgIHRoaXMuX2xpZmVjeWNsZSA9IHByb3BzLmxpZmVjeWNsZTtcbiAgICB0aGlzLnJlc291cmNlcyA9IHByb3BzLnJlc291cmNlcyA/PyBkZWZhdWx0UmVzb3VyY2VTcGVjO1xuICAgIHRoaXMud29ya2luZ0RpciA9IHByb3BzLndvcmtpbmdEaXI7XG4gICAgdGhpcy5tb3VudHMgPSBwcm9wcy52b2x1bWVNb3VudHMgPz8gW107XG4gICAgdGhpcy5pbWFnZVB1bGxQb2xpY3kgPSBwcm9wcy5pbWFnZVB1bGxQb2xpY3kgPz8gSW1hZ2VQdWxsUG9saWN5LkFMV0FZUztcbiAgICB0aGlzLnNlY3VyaXR5Q29udGV4dCA9IG5ldyBDb250YWluZXJTZWN1cml0eUNvbnRleHQocHJvcHMuc2VjdXJpdHlDb250ZXh0KTtcbiAgICB0aGlzLmVudiA9IG5ldyBFbnYocHJvcHMuZW52RnJvbSA/PyBbXSwgcHJvcHMuZW52VmFyaWFibGVzID8/IHt9KTtcbiAgICB0aGlzLnJlc3RhcnRQb2xpY3kgPSBwcm9wcy5yZXN0YXJ0UG9saWN5O1xuXG4gICAgaWYgKHRoaXMucG9ydE51bWJlcikge1xuICAgICAgdGhpcy5hZGRQb3J0KHtcbiAgICAgICAgbnVtYmVyOiB0aGlzLnBvcnROdW1iZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBvcnQgb2YgcHJvcHMucG9ydHMgPz8gW10pIHtcbiAgICAgIHRoaXMuYWRkUG9ydChwb3J0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgYHBvcnROdW1iZXJgLlxuICAgKi9cbiAgcHVibGljIGdldCBwb3J0KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9ydE51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3J0cyBleHBvc2VkIGJ5IHRoaXMgY29udGFpbmVycy5cbiAgICogUmV0dXJucyBhIGNvcHksIHVzZSBgYWRkUG9ydGAgdG8gbW9kaWZ5LlxuICAgKi9cbiAgcHVibGljIGdldCBwb3J0cygpOiBDb250YWluZXJQb3J0W10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fcG9ydHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudHJ5cG9pbnQgYXJyYXkgKHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgd2hlbiB0aGUgY29udGFpbmVyIHN0YXJ0cykuXG4gICAqIEByZXR1cm5zIGEgY29weSBvZiB0aGUgZW50cnlwb2ludCBhcnJheSwgY2Fubm90IGJlIG1vZGlmaWVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1hbmQoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb21tYW5kID8gWy4uLnRoaXMuX2NvbW1hbmRdIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFyZ3VtZW50cyB0byB0aGUgZW50cnlwb2ludC5cbiAgICpcbiAgICogQHJldHVybnMgYSBjb3B5IG9mIHRoZSBhcmd1bWVudHMgYXJyYXksIGNhbm5vdCBiZSBtb2RpZmllZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYXJncygpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyZ3MgPyBbLi4udGhpcy5fYXJnc10gOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgYSB2b2x1bWUgdG8gYSBzcGVjaWZpYyBwYXRoIHNvIHRoYXQgaXQgaXMgYWNjZXNzaWJsZSBieSB0aGUgY29udGFpbmVyLlxuICAgKiBFdmVyeSBwb2QgdGhhdCBpcyBjb25maWd1cmVkIHRvIHVzZSB0aGlzIGNvbnRhaW5lciB3aWxsIGF1dG1vYXRpY2FsbHkgaGF2ZSBhY2Nlc3MgdG8gdGhlIHZvbHVtZS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgZGVzaXJlZCBwYXRoIGluIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBzdG9yYWdlIC0gVGhlIHN0b3JhZ2UgdG8gbW91bnQuXG4gICAqL1xuICBwdWJsaWMgbW91bnQocGF0aDogc3RyaW5nLCBzdG9yYWdlOiB2b2x1bWUuSVN0b3JhZ2UsIG9wdGlvbnM6IE1vdW50T3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5tb3VudHMucHVzaCh7IHBhdGgsIHZvbHVtZTogc3RvcmFnZS5hc1ZvbHVtZSgpLCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBvcnQgdG8gZXhwb3NlIGZyb20gdGhpcyBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgYWRkUG9ydChwb3J0OiBDb250YWluZXJQb3J0KSB7XG5cbiAgICBjb25zdCBuYW1lcyA9IHRoaXMuX3BvcnRzLm1hcChwID0+IHAubmFtZSkuZmlsdGVyKHggPT4geCk7XG4gICAgY29uc3QgbnVtYmVyUHJvdG9jb2xzID0gdGhpcy5fcG9ydHMubWFwKHAgPT4gYCR7cC5udW1iZXJ9LyR7cC5wcm90b2NvbCB8fCBQcm90b2NvbC5UQ1B9YCk7XG5cbiAgICBpZiAocG9ydC5uYW1lICYmIG5hbWVzLmluY2x1ZGVzKHBvcnQubmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUG9ydCB3aXRoIG5hbWUgJHtwb3J0Lm5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG9jb2wgPSBgJHtwb3J0Lm51bWJlcn0vJHtwb3J0LnByb3RvY29sIHx8IFByb3RvY29sLlRDUH1gO1xuICAgIGlmIChudW1iZXJQcm90b2NvbHMuaW5jbHVkZXMocHJvdG9jb2wpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBvcnQgd2l0aCBudW1iZXIgJHtwb3J0Lm51bWJlcn0gYW5kIHByb3RvY29sICR7cG9ydC5wcm90b2NvbCB8fCBQcm90b2NvbC5UQ1B9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcG9ydHMucHVzaChwb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9LdWJlKCk6IGs4cy5Db250YWluZXIge1xuICAgIGNvbnN0IHZvbHVtZU1vdW50czogazhzLlZvbHVtZU1vdW50W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbW91bnQgb2YgdGhpcy5tb3VudHMpIHtcbiAgICAgIHZvbHVtZU1vdW50cy5wdXNoKHtcbiAgICAgICAgbmFtZTogbW91bnQudm9sdW1lLm5hbWUsXG4gICAgICAgIG1vdW50UGF0aDogbW91bnQucGF0aCxcbiAgICAgICAgcmVhZE9ubHk6IG1vdW50LnJlYWRPbmx5LFxuICAgICAgICBtb3VudFByb3BhZ2F0aW9uOiBtb3VudC5wcm9wYWdhdGlvbixcbiAgICAgICAgc3ViUGF0aDogbW91bnQuc3ViUGF0aCxcbiAgICAgICAgc3ViUGF0aEV4cHI6IG1vdW50LnN1YlBhdGhFeHByLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydHMgPSBuZXcgQXJyYXk8azhzLkNvbnRhaW5lclBvcnQ+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHBvcnQgb2YgdGhpcy5wb3J0cykge1xuICAgICAgcG9ydHMucHVzaCh7XG4gICAgICAgIGNvbnRhaW5lclBvcnQ6IHBvcnQubnVtYmVyLFxuICAgICAgICBwcm90b2NvbDogcG9ydC5wcm90b2NvbD8udG9TdHJpbmcoKSxcbiAgICAgICAgbmFtZTogcG9ydC5uYW1lLFxuICAgICAgICBob3N0UG9ydDogcG9ydC5ob3N0UG9ydCxcbiAgICAgICAgaG9zdElwOiBwb3J0Lmhvc3RJcCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc291cmNlIHJlcXVlc3RzIGFuZCBsaW1pdHNcbiAgICBjb25zdCBjcHVMaW1pdCA9IHRoaXMucmVzb3VyY2VzPy5jcHU/LmxpbWl0Py5hbW91bnQ7XG4gICAgY29uc3QgY3B1UmVxdWVzdCA9IHRoaXMucmVzb3VyY2VzPy5jcHU/LnJlcXVlc3Q/LmFtb3VudDtcbiAgICBjb25zdCBtZW1vcnlMaW1pdCA9IHRoaXMucmVzb3VyY2VzPy5tZW1vcnk/LmxpbWl0O1xuICAgIGNvbnN0IG1lbW9yeVJlcXVlc3QgPSB0aGlzLnJlc291cmNlcz8ubWVtb3J5Py5yZXF1ZXN0O1xuICAgIGNvbnN0IGVwaGVtZXJhbFN0b3JhZ2VMaW1pdCA9IHRoaXMucmVzb3VyY2VzPy5lcGhlbWVyYWxTdG9yYWdlPy5saW1pdDtcbiAgICBjb25zdCBlcGhlbWVyYWxTdG9yYWdlUmVxdWVzdCA9IHRoaXMucmVzb3VyY2VzPy5lcGhlbWVyYWxTdG9yYWdlPy5yZXF1ZXN0O1xuXG4gICAgY29uc3QgbGltaXRzOiB7IFtrZXk6IHN0cmluZ106IGs4cy5RdWFudGl0eSB9ID0ge307XG4gICAgY29uc3QgcmVxdWVzdHM6IHsgW2tleTogc3RyaW5nXTogazhzLlF1YW50aXR5IH0gPSB7fTtcblxuICAgIGlmIChjcHVMaW1pdCkge1xuICAgICAgbGltaXRzLmNwdSA9IGs4cy5RdWFudGl0eS5mcm9tU3RyaW5nKGNwdUxpbWl0KTtcbiAgICB9XG4gICAgaWYgKG1lbW9yeUxpbWl0KSB7XG4gICAgICBsaW1pdHMubWVtb3J5ID0gazhzLlF1YW50aXR5LmZyb21TdHJpbmcobWVtb3J5TGltaXQudG9NZWJpYnl0ZXMoKS50b1N0cmluZygpICsgJ01pJyk7XG4gICAgfVxuICAgIGlmIChlcGhlbWVyYWxTdG9yYWdlTGltaXQpIHtcbiAgICAgIGxpbWl0c1snZXBoZW1lcmFsLXN0b3JhZ2UnXSA9IGs4cy5RdWFudGl0eS5mcm9tU3RyaW5nKGVwaGVtZXJhbFN0b3JhZ2VMaW1pdC50b0dpYmlieXRlcygpLnRvU3RyaW5nKCkgKyAnR2knKTtcbiAgICB9XG4gICAgaWYgKGNwdVJlcXVlc3QpIHtcbiAgICAgIHJlcXVlc3RzLmNwdSA9IGs4cy5RdWFudGl0eS5mcm9tU3RyaW5nKGNwdVJlcXVlc3QpO1xuICAgIH1cbiAgICBpZiAobWVtb3J5UmVxdWVzdCkge1xuICAgICAgcmVxdWVzdHMubWVtb3J5ID0gazhzLlF1YW50aXR5LmZyb21TdHJpbmcobWVtb3J5UmVxdWVzdC50b01lYmlieXRlcygpLnRvU3RyaW5nKCkgKyAnTWknKTtcbiAgICB9XG4gICAgaWYgKGVwaGVtZXJhbFN0b3JhZ2VSZXF1ZXN0KSB7XG4gICAgICByZXF1ZXN0c1snZXBoZW1lcmFsLXN0b3JhZ2UnXSA9IGs4cy5RdWFudGl0eS5mcm9tU3RyaW5nKGVwaGVtZXJhbFN0b3JhZ2VSZXF1ZXN0LnRvR2liaWJ5dGVzKCkudG9TdHJpbmcoKSArICdHaScpO1xuICAgIH1cblxuICAgIGxldCByZXNvdXJjZVJlcXVpcmVtZW50czogazhzLlJlc291cmNlUmVxdWlyZW1lbnRzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChPYmplY3Qua2V5cyhsaW1pdHMpLmxlbmd0aCA+IDAgfHwgT2JqZWN0LmtleXMocmVxdWVzdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc291cmNlUmVxdWlyZW1lbnRzID0ge1xuICAgICAgICBsaW1pdHM6IHVuZGVmaW5lZElmRW1wdHkobGltaXRzKSxcbiAgICAgICAgcmVxdWVzdHM6IHVuZGVmaW5lZElmRW1wdHkocmVxdWVzdHMpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnYgPSB0aGlzLmVudi5fdG9LdWJlKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgaW1hZ2U6IHRoaXMuaW1hZ2UsXG4gICAgICBpbWFnZVB1bGxQb2xpY3k6IHRoaXMuaW1hZ2VQdWxsUG9saWN5LFxuICAgICAgcG9ydHM6IHVuZGVmaW5lZElmRW1wdHkocG9ydHMpLFxuICAgICAgdm9sdW1lTW91bnRzOiB1bmRlZmluZWRJZkVtcHR5KHZvbHVtZU1vdW50cyksXG4gICAgICBjb21tYW5kOiB0aGlzLmNvbW1hbmQsXG4gICAgICBhcmdzOiB0aGlzLmFyZ3MsXG4gICAgICB3b3JraW5nRGlyOiB0aGlzLndvcmtpbmdEaXIsXG4gICAgICBlbnY6IGVudi52YXJpYWJsZXMsXG4gICAgICBlbnZGcm9tOiBlbnYuZnJvbSxcbiAgICAgIHJlYWRpbmVzc1Byb2JlOiB0aGlzLl9yZWFkaW5lc3M/Ll90b0t1YmUodGhpcyksXG4gICAgICBsaXZlbmVzc1Byb2JlOiB0aGlzLl9saXZlbmVzcz8uX3RvS3ViZSh0aGlzKSxcbiAgICAgIHN0YXJ0dXBQcm9iZTogdGhpcy5fc3RhcnR1cD8uX3RvS3ViZSh0aGlzKSxcbiAgICAgIGxpZmVjeWNsZTogdGhpcy5fbGlmZWN5Y2xlID8ge1xuICAgICAgICBwb3N0U3RhcnQ6IHRoaXMuX2xpZmVjeWNsZS5wb3N0U3RhcnQ/Ll90b0t1YmUodGhpcyksXG4gICAgICAgIHByZVN0b3A6IHRoaXMuX2xpZmVjeWNsZS5wcmVTdG9wPy5fdG9LdWJlKHRoaXMpLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHJlc291cmNlczogcmVzb3VyY2VSZXF1aXJlbWVudHMsXG4gICAgICByZXN0YXJ0UG9saWN5OiB0aGlzLnJlc3RhcnRQb2xpY3ksXG4gICAgICBzZWN1cml0eUNvbnRleHQ6IHRoaXMuc2VjdXJpdHlDb250ZXh0Ll90b0t1YmUoKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbW91bnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vdW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGhvdyBtb3VudHMgYXJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgaG9zdCB0byBjb250YWluZXIgYW5kIHRoZVxuICAgKiBvdGhlciB3YXkgYXJvdW5kLiBXaGVuIG5vdCBzZXQsIE1vdW50UHJvcGFnYXRpb25Ob25lIGlzIHVzZWQuXG4gICAqXG4gICAqIE1vdW50IHByb3BhZ2F0aW9uIGFsbG93cyBmb3Igc2hhcmluZyB2b2x1bWVzIG1vdW50ZWQgYnkgYSBDb250YWluZXIgdG9cbiAgICogb3RoZXIgQ29udGFpbmVycyBpbiB0aGUgc2FtZSBQb2QsIG9yIGV2ZW4gdG8gb3RoZXIgUG9kcyBvbiB0aGUgc2FtZSBub2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBNb3VudFByb3BhZ2F0aW9uLk5PTkVcbiAgICovXG4gIHJlYWRvbmx5IHByb3BhZ2F0aW9uPzogTW91bnRQcm9wYWdhdGlvbjtcblxuICAvKipcbiAgICogTW91bnRlZCByZWFkLW9ubHkgaWYgdHJ1ZSwgcmVhZC13cml0ZSBvdGhlcndpc2UgKGZhbHNlIG9yIHVuc3BlY2lmaWVkKS5cbiAgICogRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhdGggd2l0aGluIHRoZSB2b2x1bWUgZnJvbSB3aGljaCB0aGUgY29udGFpbmVyJ3Mgdm9sdW1lIHNob3VsZCBiZSBtb3VudGVkLikuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiXCIgdGhlIHZvbHVtZSdzIHJvb3RcbiAgICovXG4gIHJlYWRvbmx5IHN1YlBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4cGFuZGVkIHBhdGggd2l0aGluIHRoZSB2b2x1bWUgZnJvbSB3aGljaCB0aGUgY29udGFpbmVyJ3Mgdm9sdW1lIHNob3VsZCBiZVxuICAgKiBtb3VudGVkLiBCZWhhdmVzIHNpbWlsYXJseSB0byBTdWJQYXRoIGJ1dCBlbnZpcm9ubWVudCB2YXJpYWJsZSByZWZlcmVuY2VzXG4gICAqICQoVkFSX05BTUUpIGFyZSBleHBhbmRlZCB1c2luZyB0aGUgY29udGFpbmVyJ3MgZW52aXJvbm1lbnQuIERlZmF1bHRzIHRvIFwiXCJcbiAgICogKHZvbHVtZSdzIHJvb3QpLlxuICAgKlxuICAgKiBgc3ViUGF0aEV4cHJgIGFuZCBgc3ViUGF0aGAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJcIiB2b2x1bWUncyByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViUGF0aEV4cHI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTW91bnQgYSB2b2x1bWUgZnJvbSB0aGUgcG9kIHRvIHRoZSBjb250YWluZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdW1lTW91bnQgZXh0ZW5kcyBNb3VudE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHZvbHVtZSB0byBtb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZTogdm9sdW1lLlZvbHVtZTtcblxuICAvKipcbiAgICogUGF0aCB3aXRoaW4gdGhlIGNvbnRhaW5lciBhdCB3aGljaCB0aGUgdm9sdW1lIHNob3VsZCBiZSBtb3VudGVkLiBNdXN0IG5vdFxuICAgKiBjb250YWluICc6Jy5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gTW91bnRQcm9wYWdhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGlzIHZvbHVtZSBtb3VudCB3aWxsIG5vdCByZWNlaXZlIGFueSBzdWJzZXF1ZW50IG1vdW50cyB0aGF0IGFyZSBtb3VudGVkXG4gICAqIHRvIHRoaXMgdm9sdW1lIG9yIGFueSBvZiBpdHMgc3ViZGlyZWN0b3JpZXMgYnkgdGhlIGhvc3QuIEluIHNpbWlsYXJcbiAgICogZmFzaGlvbiwgbm8gbW91bnRzIGNyZWF0ZWQgYnkgdGhlIENvbnRhaW5lciB3aWxsIGJlIHZpc2libGUgb24gdGhlIGhvc3QuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgbW9kZS5cbiAgICpcbiAgICogVGhpcyBtb2RlIGlzIGVxdWFsIHRvIGBwcml2YXRlYCBtb3VudCBwcm9wYWdhdGlvbiBhcyBkZXNjcmliZWQgaW4gdGhlIExpbnV4XG4gICAqIGtlcm5lbCBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBOT05FID0gJ05vbmUnLFxuXG4gIC8qKlxuICAgKiBUaGlzIHZvbHVtZSBtb3VudCB3aWxsIHJlY2VpdmUgYWxsIHN1YnNlcXVlbnQgbW91bnRzIHRoYXQgYXJlIG1vdW50ZWQgdG9cbiAgICogdGhpcyB2b2x1bWUgb3IgYW55IG9mIGl0cyBzdWJkaXJlY3Rvcmllcy5cbiAgICpcbiAgICogSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBob3N0IG1vdW50cyBhbnl0aGluZyBpbnNpZGUgdGhlIHZvbHVtZSBtb3VudCwgdGhlXG4gICAqIENvbnRhaW5lciB3aWxsIHNlZSBpdCBtb3VudGVkIHRoZXJlLlxuICAgKlxuICAgKiBTaW1pbGFybHksIGlmIGFueSBQb2Qgd2l0aCBCaWRpcmVjdGlvbmFsIG1vdW50IHByb3BhZ2F0aW9uIHRvIHRoZSBzYW1lXG4gICAqIHZvbHVtZSBtb3VudHMgYW55dGhpbmcgdGhlcmUsIHRoZSBDb250YWluZXIgd2l0aCBIb3N0VG9Db250YWluZXIgbW91bnRcbiAgICogcHJvcGFnYXRpb24gd2lsbCBzZWUgaXQuXG4gICAqXG4gICAqIFRoaXMgbW9kZSBpcyBlcXVhbCB0byBgcnNsYXZlYCBtb3VudCBwcm9wYWdhdGlvbiBhcyBkZXNjcmliZWQgaW4gdGhlIExpbnV4XG4gICAqIGtlcm5lbCBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBIT1NUX1RPX0NPTlRBSU5FUiA9ICdIb3N0VG9Db250YWluZXInLFxuXG4gIC8qKlxuICAgKiBUaGlzIHZvbHVtZSBtb3VudCBiZWhhdmVzIHRoZSBzYW1lIHRoZSBIb3N0VG9Db250YWluZXIgbW91bnQuIEluIGFkZGl0aW9uLFxuICAgKiBhbGwgdm9sdW1lIG1vdW50cyBjcmVhdGVkIGJ5IHRoZSBDb250YWluZXIgd2lsbCBiZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlXG4gICAqIGhvc3QgYW5kIHRvIGFsbCBDb250YWluZXJzIG9mIGFsbCBQb2RzIHRoYXQgdXNlIHRoZSBzYW1lIHZvbHVtZVxuICAgKlxuICAgKiBBIHR5cGljYWwgdXNlIGNhc2UgZm9yIHRoaXMgbW9kZSBpcyBhIFBvZCB3aXRoIGEgRmxleFZvbHVtZSBvciBDU0kgZHJpdmVyXG4gICAqIG9yIGEgUG9kIHRoYXQgbmVlZHMgdG8gbW91bnQgc29tZXRoaW5nIG9uIHRoZSBob3N0IHVzaW5nIGEgaG9zdFBhdGggdm9sdW1lLlxuICAgKlxuICAgKiBUaGlzIG1vZGUgaXMgZXF1YWwgdG8gYHJzaGFyZWRgIG1vdW50IHByb3BhZ2F0aW9uIGFzIGRlc2NyaWJlZCBpbiB0aGUgTGludXhcbiAgICoga2VybmVsIGRvY3VtZW50YXRpb25cbiAgICpcbiAgICogQ2F1dGlvbjogQmlkaXJlY3Rpb25hbCBtb3VudCBwcm9wYWdhdGlvbiBjYW4gYmUgZGFuZ2Vyb3VzLiBJdCBjYW4gZGFtYWdlXG4gICAqIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBpdCBpcyBhbGxvd2VkIG9ubHkgaW4gcHJpdmlsZWdlZFxuICAgKiBDb250YWluZXJzLiBGYW1pbGlhcml0eSB3aXRoIExpbnV4IGtlcm5lbCBiZWhhdmlvciBpcyBzdHJvbmdseSByZWNvbW1lbmRlZC5cbiAgICogSW4gYWRkaXRpb24sIGFueSB2b2x1bWUgbW91bnRzIGNyZWF0ZWQgYnkgQ29udGFpbmVycyBpbiBQb2RzIG11c3QgYmVcbiAgICogZGVzdHJveWVkICh1bm1vdW50ZWQpIGJ5IHRoZSBDb250YWluZXJzIG9uIHRlcm1pbmF0aW9uLlxuICAgKlxuICAgKi9cbiAgQklESVJFQ1RJT05BTCA9ICdCaWRpcmVjdGlvbmFsJyxcbn1cblxuLyoqXG4gKiBDUFUgYW5kIG1lbW9yeSBjb21wdXRlIHJlc291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lclJlc291cmNlcyB7XG4gIHJlYWRvbmx5IGNwdT86IENwdVJlc291cmNlcztcbiAgcmVhZG9ubHkgbWVtb3J5PzogTWVtb3J5UmVzb3VyY2VzO1xuICByZWFkb25seSBlcGhlbWVyYWxTdG9yYWdlPzogRXBoZW1lcmFsU3RvcmFnZVJlc291cmNlcztcbn1cblxuLyoqXG4gKiBDUFUgcmVxdWVzdCBhbmQgbGltaXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcHVSZXNvdXJjZXMge1xuICByZWFkb25seSByZXF1ZXN0PzogQ3B1O1xuICByZWFkb25seSBsaW1pdD86IENwdTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgQ1BVLlxuICogVGhlIGFtb3VudCBjYW4gYmUgcGFzc2VkIGFzIG1pbGxpcyBvciB1bml0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIENwdSB7XG4gIHN0YXRpYyBtaWxsaXMoYW1vdW50OiBudW1iZXIpOiBDcHUge1xuICAgIHJldHVybiBuZXcgQ3B1KGFtb3VudCArICdtJyk7XG4gIH1cbiAgc3RhdGljIHVuaXRzKGFtb3VudDogbnVtYmVyKTogQ3B1IHtcbiAgICByZXR1cm4gbmV3IENwdShhbW91bnQudG9TdHJpbmcoKSk7XG4gIH1cbiAgYW1vdW50OiBzdHJpbmc7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoYW1vdW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFtb3VudCA9IGFtb3VudDtcbiAgfVxufVxuXG4vKipcbiAqIE1lbW9yeSByZXF1ZXN0IGFuZCBsaW1pdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVJlc291cmNlcyB7XG4gIHJlYWRvbmx5IHJlcXVlc3Q/OiBTaXplO1xuICByZWFkb25seSBsaW1pdD86IFNpemU7XG59XG5cbi8qKlxuICogRW1waGVtZXJhbCBzdG9yYWdlIHJlcXVlc3QgYW5kIGxpbWl0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXBoZW1lcmFsU3RvcmFnZVJlc291cmNlcyB7XG4gIHJlYWRvbmx5IHJlcXVlc3Q/OiBTaXplO1xuICByZWFkb25seSBsaW1pdD86IFNpemU7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGVudiB2YXJpYWJsZXMgZGVmaW5lZCBpbiBvdGhlciByZXNvdXJjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZGcm9tIHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ01hcD86IGNvbmZpZ21hcC5JQ29uZmlnTWFwLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VjPzogc2VjcmV0LklTZWNyZXQpIHsgfTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3RvS3ViZSgpOiBrOHMuRW52RnJvbVNvdXJjZVtdIHtcbiAgICAvLyBhIHNpbmdsZSBgazhzLkVudkZyb21Tb3VyY2VgIG1heSBvbmx5IHNwZWNpZnkgb25lIG9mIGBjb25maWdNYXBSZWZgIC8gYHNlY3JldFJlZmAuXG4gICAgLy8gaWYgYm90aCBhIGNvbmZpZyBtYXAgYW5kIGEgc2VjcmV0IGFyZSBjb25maWd1cmVkIG9uIHRoaXMgaW5zdGFuY2UsIHRoZXkgbXVzdCBiZVxuICAgIC8vIHJlbmRlcmVkIGFzIHNlcGFyYXRlIGVudHJpZXMsIG90aGVyd2lzZSB0aGUgcmVzdWx0aW5nIG1hbmlmZXN0IGlzIGludmFsaWQuXG4gICAgY29uc3Qgc291cmNlcyA9IG5ldyBBcnJheTxrOHMuRW52RnJvbVNvdXJjZT4oKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZ01hcCkge1xuICAgICAgc291cmNlcy5wdXNoKHtcbiAgICAgICAgY29uZmlnTWFwUmVmOiB7IG5hbWU6IHRoaXMuY29uZmlnTWFwLm5hbWUgfSxcbiAgICAgICAgcHJlZml4OiB0aGlzLnByZWZpeCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlYykge1xuICAgICAgc291cmNlcy5wdXNoKHtcbiAgICAgICAgc2VjcmV0UmVmOiB7IG5hbWU6IHRoaXMuc2VjLm5hbWUgfSxcbiAgICAgICAgcHJlZml4OiB0aGlzLnByZWZpeCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RDb250YWluZXJQb3J0cyhzZWxlY3Rvcj86IGFueSk6IENvbnRhaW5lclBvcnRbXSB7XG5cbiAgaWYgKCFzZWxlY3RvcikgeyByZXR1cm4gW107IH1cblxuICAvLyB3ZSBkb24ndCB1c2UgaW5zdGFuY2VvZiBpbnRlbnRpb25hbGx5IHNpbmNlIGl0IGNhbiBjcmVhdGVcbiAgLy8gY3ljbGljIGltcG9ydCBwcm9ibGVtcy5cbiAgY29uc3QgY29udGFpbmVyczogQ29udGFpbmVyW10gPSAoc2VsZWN0b3IgYXMgYW55KS5jb250YWluZXJzID8/IFtdO1xuXG4gIHJldHVybiBjb250YWluZXJzLmZsYXRNYXAoYyA9PiBjLnBvcnRzKTtcbn1cblxuLyoqXG4gKiBDb250YWluZXIgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICovXG5leHBvcnQgY2xhc3MgRW52IHtcblxuICAvKipcbiAgICogU2VsZWN0cyBhIENvbmZpZ01hcCB0byBwb3B1bGF0ZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGguXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgdGFyZ2V0IENvbmZpZ01hcCdzIERhdGEgZmllbGQgd2lsbCByZXByZXNlbnRcbiAgICogdGhlIGtleS12YWx1ZSBwYWlycyBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Db25maWdNYXAoY29uZmlnTWFwOiBjb25maWdtYXAuSUNvbmZpZ01hcCwgcHJlZml4Pzogc3RyaW5nKTogRW52RnJvbSB7XG4gICAgcmV0dXJuIG5ldyBFbnZGcm9tKGNvbmZpZ01hcCwgcHJlZml4LCB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBTZWNyZXQgdG8gcG9wdWxhdGUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aXRoLlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHRhcmdldCBTZWNyZXQncyBEYXRhIGZpZWxkIHdpbGwgcmVwcmVzZW50XG4gICAqIHRoZSBrZXktdmFsdWUgcGFpcnMgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VjcmV0KHNlY3I6IHNlY3JldC5JU2VjcmV0KTogRW52RnJvbSB7XG4gICAgcmV0dXJuIG5ldyBFbnZGcm9tKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBzZWNyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NvdXJjZXM6IEVudkZyb21bXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdmFyaWFibGVzOiB7IFtrZXk6IHN0cmluZ106IEVudlZhbHVlIH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNvdXJjZXM6IEVudkZyb21bXSwgdmFyaWFibGVzOiB7IFtuYW1lOiBzdHJpbmddOiBFbnZWYWx1ZSB9KSB7XG4gICAgdGhpcy5fc291cmNlcyA9IHNvdXJjZXM7XG4gICAgdGhpcy5fdmFyaWFibGVzID0gdmFyaWFibGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNpbmdsZSB2YXJpYWJsZSBieSBuYW1lIGFuZCB2YWx1ZS5cbiAgICogVGhlIHZhcmlhYmxlIHZhbHVlIGNhbiBjb21lIGZyb20gdmFyaW91cyBkeW5hbWljIHNvdXJjZXMgc3VjaCBhIHNlY3JldHMgb2YgY29uZmlnIG1hcHMuXG4gICAqIFVzZSBgRW52VmFsdWUuZnJvbVhYWGAgdG8gc2VsZWN0IHNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgYWRkVmFyaWFibGUobmFtZTogc3RyaW5nLCB2YWx1ZTogRW52VmFsdWUpIHtcbiAgICB0aGlzLl92YXJpYWJsZXNbbmFtZV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGlzIGNvbnRhaW5lci5cbiAgICogUmV0dXJucyBhIGNvcHkuIFRvIGFkZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlIGBjb250YWluZXIuZW52LmFkZFZhcmlhYmxlKClgLlxuICAgKi9cbiAgcHVibGljIGdldCB2YXJpYWJsZXMoKTogeyBbbmFtZTogc3RyaW5nXTogRW52VmFsdWUgfSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fdmFyaWFibGVzIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29sbGVjdGlvbiBvZiB2YXJpYWJsZXMgYnkgY29weWluZyBmcm9tIGFub3RoZXIgc291cmNlLlxuICAgKiBVc2UgYEVudi5mcm9tWFhYYCBmdW5jdGlvbnMgdG8gc2VsZWN0IHNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgY29weUZyb20oZnJvbTogRW52RnJvbSkge1xuICAgIHRoaXMuX3NvdXJjZXMucHVzaChmcm9tKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBzb3VyY2VzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGNvbnRhaW5lciBlbnZpcm9ubWVudCxcbiAgICogaW4gYWRkaXRpb24gdG8gdGhlIGB2YXJpYWJsZXNgLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgY29weS4gVG8gYWRkIGEgc291cmNlIHVzZSBgY29udGFpbmVyLmVudi5jb3B5RnJvbSgpYC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc291cmNlcygpOiBFbnZGcm9tW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fc291cmNlc107XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckVudihlbnY6IHsgW25hbWU6IHN0cmluZ106IEVudlZhbHVlIH0pOiBrOHMuRW52VmFyW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxrOHMuRW52VmFyPigpO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZdIG9mIE9iamVjdC5lbnRyaWVzKGVudikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdmFsdWU6IHYudmFsdWUsXG4gICAgICAgIHZhbHVlRnJvbTogdi52YWx1ZUZyb20sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9LdWJlKCk6IHsgdmFyaWFibGVzPzogazhzLkVudlZhcltdOyBmcm9tPzogazhzLkVudkZyb21Tb3VyY2VbXSB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgZnJvbTogdW5kZWZpbmVkSWZFbXB0eSh0aGlzLl9zb3VyY2VzLmZsYXRNYXAocyA9PiBzLl90b0t1YmUoKSkpLFxuICAgICAgdmFyaWFibGVzOiB1bmRlZmluZWRJZkVtcHR5KHRoaXMucmVuZGVyRW52KHRoaXMuX3ZhcmlhYmxlcykpLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==