@bluedynamics/cdk8s-plone 0.1.6 → 0.1.8

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.
@@ -0,0 +1,1042 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion = exports.ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion = exports.ServiceMonitorSpecEndpointsTlsConfigMinVersion = exports.ServiceMonitorSpecEndpointsTlsConfigMaxVersion = exports.ServiceMonitorSpecEndpointsRelabelingsAction = exports.ServiceMonitorSpecEndpointsMetricRelabelingsAction = exports.ServiceMonitorSpecEndpointsTargetPort = exports.ServiceMonitorSpecEndpointsScheme = exports.ServiceMonitorSpecServiceDiscoveryRole = exports.ServiceMonitorSpecSelectorMechanism = exports.ServiceMonitorSpecScrapeProtocols = exports.ServiceMonitorSpecNativeHistogramMinBucketFactor = exports.ServiceMonitorSpecFallbackScrapeProtocol = exports.ServiceMonitor = void 0;
4
+ exports.toJson_ServiceMonitorProps = toJson_ServiceMonitorProps;
5
+ exports.toJson_ServiceMonitorSpec = toJson_ServiceMonitorSpec;
6
+ exports.toJson_ServiceMonitorSpecAttachMetadata = toJson_ServiceMonitorSpecAttachMetadata;
7
+ exports.toJson_ServiceMonitorSpecEndpoints = toJson_ServiceMonitorSpecEndpoints;
8
+ exports.toJson_ServiceMonitorSpecNamespaceSelector = toJson_ServiceMonitorSpecNamespaceSelector;
9
+ exports.toJson_ServiceMonitorSpecSelector = toJson_ServiceMonitorSpecSelector;
10
+ exports.toJson_ServiceMonitorSpecEndpointsAuthorization = toJson_ServiceMonitorSpecEndpointsAuthorization;
11
+ exports.toJson_ServiceMonitorSpecEndpointsBasicAuth = toJson_ServiceMonitorSpecEndpointsBasicAuth;
12
+ exports.toJson_ServiceMonitorSpecEndpointsBearerTokenSecret = toJson_ServiceMonitorSpecEndpointsBearerTokenSecret;
13
+ exports.toJson_ServiceMonitorSpecEndpointsMetricRelabelings = toJson_ServiceMonitorSpecEndpointsMetricRelabelings;
14
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2 = toJson_ServiceMonitorSpecEndpointsOauth2;
15
+ exports.toJson_ServiceMonitorSpecEndpointsProxyConnectHeader = toJson_ServiceMonitorSpecEndpointsProxyConnectHeader;
16
+ exports.toJson_ServiceMonitorSpecEndpointsRelabelings = toJson_ServiceMonitorSpecEndpointsRelabelings;
17
+ exports.toJson_ServiceMonitorSpecEndpointsTlsConfig = toJson_ServiceMonitorSpecEndpointsTlsConfig;
18
+ exports.toJson_ServiceMonitorSpecSelectorMatchExpressions = toJson_ServiceMonitorSpecSelectorMatchExpressions;
19
+ exports.toJson_ServiceMonitorSpecEndpointsAuthorizationCredentials = toJson_ServiceMonitorSpecEndpointsAuthorizationCredentials;
20
+ exports.toJson_ServiceMonitorSpecEndpointsBasicAuthPassword = toJson_ServiceMonitorSpecEndpointsBasicAuthPassword;
21
+ exports.toJson_ServiceMonitorSpecEndpointsBasicAuthUsername = toJson_ServiceMonitorSpecEndpointsBasicAuthUsername;
22
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2ClientId = toJson_ServiceMonitorSpecEndpointsOauth2ClientId;
23
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2ClientSecret = toJson_ServiceMonitorSpecEndpointsOauth2ClientSecret;
24
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2ProxyConnectHeader = toJson_ServiceMonitorSpecEndpointsOauth2ProxyConnectHeader;
25
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfig = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfig;
26
+ exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCa = toJson_ServiceMonitorSpecEndpointsTlsConfigCa;
27
+ exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCert = toJson_ServiceMonitorSpecEndpointsTlsConfigCert;
28
+ exports.toJson_ServiceMonitorSpecEndpointsTlsConfigKeySecret = toJson_ServiceMonitorSpecEndpointsTlsConfigKeySecret;
29
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2ClientIdConfigMap = toJson_ServiceMonitorSpecEndpointsOauth2ClientIdConfigMap;
30
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2ClientIdSecret = toJson_ServiceMonitorSpecEndpointsOauth2ClientIdSecret;
31
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCa = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCa;
32
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCert = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCert;
33
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigKeySecret = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigKeySecret;
34
+ exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCaConfigMap = toJson_ServiceMonitorSpecEndpointsTlsConfigCaConfigMap;
35
+ exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCaSecret = toJson_ServiceMonitorSpecEndpointsTlsConfigCaSecret;
36
+ exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCertConfigMap = toJson_ServiceMonitorSpecEndpointsTlsConfigCertConfigMap;
37
+ exports.toJson_ServiceMonitorSpecEndpointsTlsConfigCertSecret = toJson_ServiceMonitorSpecEndpointsTlsConfigCertSecret;
38
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaConfigMap = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaConfigMap;
39
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaSecret = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaSecret;
40
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertConfigMap = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertConfigMap;
41
+ exports.toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertSecret = toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertSecret;
42
+ // generated by cdk8s
43
+ const cdk8s_1 = require("cdk8s");
44
+ /**
45
+ * The `ServiceMonitor` custom resource definition (CRD) defines how `Prometheus` and `PrometheusAgent` can scrape metrics from a group of services.
46
+ Among other things, it allows to specify:
47
+ * The services to scrape via label selectors.
48
+ * The container ports to scrape.
49
+ * Authentication credentials to use.
50
+ * Target and metric relabeling.
51
+
52
+ `Prometheus` and `PrometheusAgent` objects select `ServiceMonitor` objects using label and namespace selectors.
53
+ *
54
+ * @schema ServiceMonitor
55
+ */
56
+ class ServiceMonitor extends cdk8s_1.ApiObject {
57
+ /**
58
+ * Renders a Kubernetes manifest for "ServiceMonitor".
59
+ *
60
+ * This can be used to inline resource manifests inside other objects (e.g. as templates).
61
+ *
62
+ * @param props initialization props
63
+ */
64
+ static manifest(props) {
65
+ return {
66
+ ...ServiceMonitor.GVK,
67
+ ...toJson_ServiceMonitorProps(props),
68
+ };
69
+ }
70
+ /**
71
+ * Defines a "ServiceMonitor" API object
72
+ * @param scope the scope in which to define this object
73
+ * @param id a scope-local name for the object
74
+ * @param props initialization props
75
+ */
76
+ constructor(scope, id, props) {
77
+ super(scope, id, {
78
+ ...ServiceMonitor.GVK,
79
+ ...props,
80
+ });
81
+ }
82
+ /**
83
+ * Renders the object to Kubernetes JSON.
84
+ */
85
+ toJson() {
86
+ const resolved = super.toJson();
87
+ return {
88
+ ...ServiceMonitor.GVK,
89
+ ...toJson_ServiceMonitorProps(resolved),
90
+ };
91
+ }
92
+ }
93
+ exports.ServiceMonitor = ServiceMonitor;
94
+ /**
95
+ * Returns the apiVersion and kind for "ServiceMonitor"
96
+ */
97
+ ServiceMonitor.GVK = {
98
+ apiVersion: 'monitoring.coreos.com/v1',
99
+ kind: 'ServiceMonitor',
100
+ };
101
+ /**
102
+ * Converts an object of type 'ServiceMonitorProps' to JSON representation.
103
+ */
104
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
105
+ function toJson_ServiceMonitorProps(obj) {
106
+ if (obj === undefined) {
107
+ return undefined;
108
+ }
109
+ const result = {
110
+ 'metadata': obj.metadata,
111
+ 'spec': toJson_ServiceMonitorSpec(obj.spec),
112
+ };
113
+ // filter undefined values
114
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
115
+ }
116
+ /**
117
+ * Converts an object of type 'ServiceMonitorSpec' to JSON representation.
118
+ */
119
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
120
+ function toJson_ServiceMonitorSpec(obj) {
121
+ if (obj === undefined) {
122
+ return undefined;
123
+ }
124
+ const result = {
125
+ 'attachMetadata': toJson_ServiceMonitorSpecAttachMetadata(obj.attachMetadata),
126
+ 'bodySizeLimit': obj.bodySizeLimit,
127
+ 'convertClassicHistogramsToNHCB': obj.convertClassicHistogramsToNhcb,
128
+ 'endpoints': obj.endpoints?.map(y => toJson_ServiceMonitorSpecEndpoints(y)),
129
+ 'fallbackScrapeProtocol': obj.fallbackScrapeProtocol,
130
+ 'jobLabel': obj.jobLabel,
131
+ 'keepDroppedTargets': obj.keepDroppedTargets,
132
+ 'labelLimit': obj.labelLimit,
133
+ 'labelNameLengthLimit': obj.labelNameLengthLimit,
134
+ 'labelValueLengthLimit': obj.labelValueLengthLimit,
135
+ 'namespaceSelector': toJson_ServiceMonitorSpecNamespaceSelector(obj.namespaceSelector),
136
+ 'nativeHistogramBucketLimit': obj.nativeHistogramBucketLimit,
137
+ 'nativeHistogramMinBucketFactor': obj.nativeHistogramMinBucketFactor?.value,
138
+ 'podTargetLabels': obj.podTargetLabels?.map(y => y),
139
+ 'sampleLimit': obj.sampleLimit,
140
+ 'scrapeClass': obj.scrapeClass,
141
+ 'scrapeClassicHistograms': obj.scrapeClassicHistograms,
142
+ 'scrapeProtocols': obj.scrapeProtocols?.map(y => y),
143
+ 'selector': toJson_ServiceMonitorSpecSelector(obj.selector),
144
+ 'selectorMechanism': obj.selectorMechanism,
145
+ 'serviceDiscoveryRole': obj.serviceDiscoveryRole,
146
+ 'targetLabels': obj.targetLabels?.map(y => y),
147
+ 'targetLimit': obj.targetLimit,
148
+ };
149
+ // filter undefined values
150
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
151
+ }
152
+ /**
153
+ * Converts an object of type 'ServiceMonitorSpecAttachMetadata' to JSON representation.
154
+ */
155
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
156
+ function toJson_ServiceMonitorSpecAttachMetadata(obj) {
157
+ if (obj === undefined) {
158
+ return undefined;
159
+ }
160
+ const result = {
161
+ 'node': obj.node,
162
+ };
163
+ // filter undefined values
164
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
165
+ }
166
+ /**
167
+ * Converts an object of type 'ServiceMonitorSpecEndpoints' to JSON representation.
168
+ */
169
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
170
+ function toJson_ServiceMonitorSpecEndpoints(obj) {
171
+ if (obj === undefined) {
172
+ return undefined;
173
+ }
174
+ const result = {
175
+ 'authorization': toJson_ServiceMonitorSpecEndpointsAuthorization(obj.authorization),
176
+ 'basicAuth': toJson_ServiceMonitorSpecEndpointsBasicAuth(obj.basicAuth),
177
+ 'bearerTokenFile': obj.bearerTokenFile,
178
+ 'bearerTokenSecret': toJson_ServiceMonitorSpecEndpointsBearerTokenSecret(obj.bearerTokenSecret),
179
+ 'enableHttp2': obj.enableHttp2,
180
+ 'filterRunning': obj.filterRunning,
181
+ 'followRedirects': obj.followRedirects,
182
+ 'honorLabels': obj.honorLabels,
183
+ 'honorTimestamps': obj.honorTimestamps,
184
+ 'interval': obj.interval,
185
+ 'metricRelabelings': obj.metricRelabelings?.map(y => toJson_ServiceMonitorSpecEndpointsMetricRelabelings(y)),
186
+ 'noProxy': obj.noProxy,
187
+ 'oauth2': toJson_ServiceMonitorSpecEndpointsOauth2(obj.oauth2),
188
+ 'params': ((obj.params) === undefined) ? undefined : (Object.entries(obj.params).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.map(y => y) }), {})),
189
+ 'path': obj.path,
190
+ 'port': obj.port,
191
+ 'proxyConnectHeader': ((obj.proxyConnectHeader) === undefined) ? undefined : (Object.entries(obj.proxyConnectHeader).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.map(y => toJson_ServiceMonitorSpecEndpointsProxyConnectHeader(y)) }), {})),
192
+ 'proxyFromEnvironment': obj.proxyFromEnvironment,
193
+ 'proxyUrl': obj.proxyUrl,
194
+ 'relabelings': obj.relabelings?.map(y => toJson_ServiceMonitorSpecEndpointsRelabelings(y)),
195
+ 'scheme': obj.scheme,
196
+ 'scrapeTimeout': obj.scrapeTimeout,
197
+ 'targetPort': obj.targetPort?.value,
198
+ 'tlsConfig': toJson_ServiceMonitorSpecEndpointsTlsConfig(obj.tlsConfig),
199
+ 'trackTimestampsStaleness': obj.trackTimestampsStaleness,
200
+ };
201
+ // filter undefined values
202
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
203
+ }
204
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
205
+ /**
206
+ * fallbackScrapeProtocol defines the protocol to use if a scrape returns blank, unparseable, or otherwise invalid Content-Type.
207
+ *
208
+ * It requires Prometheus >= v3.0.0.
209
+ *
210
+ * @schema ServiceMonitorSpecFallbackScrapeProtocol
211
+ */
212
+ var ServiceMonitorSpecFallbackScrapeProtocol;
213
+ (function (ServiceMonitorSpecFallbackScrapeProtocol) {
214
+ /** PrometheusProto */
215
+ ServiceMonitorSpecFallbackScrapeProtocol["PROMETHEUS_PROTO"] = "PrometheusProto";
216
+ /** OpenMetricsText0.0.1 */
217
+ ServiceMonitorSpecFallbackScrapeProtocol["OPEN_METRICS_TEXT0_0_1"] = "OpenMetricsText0.0.1";
218
+ /** OpenMetricsText1.0.0 */
219
+ ServiceMonitorSpecFallbackScrapeProtocol["OPEN_METRICS_TEXT1_0_0"] = "OpenMetricsText1.0.0";
220
+ /** PrometheusText0.0.4 */
221
+ ServiceMonitorSpecFallbackScrapeProtocol["PROMETHEUS_TEXT0_0_4"] = "PrometheusText0.0.4";
222
+ /** PrometheusText1.0.0 */
223
+ ServiceMonitorSpecFallbackScrapeProtocol["PROMETHEUS_TEXT1_0_0"] = "PrometheusText1.0.0";
224
+ })(ServiceMonitorSpecFallbackScrapeProtocol || (exports.ServiceMonitorSpecFallbackScrapeProtocol = ServiceMonitorSpecFallbackScrapeProtocol = {}));
225
+ /**
226
+ * Converts an object of type 'ServiceMonitorSpecNamespaceSelector' to JSON representation.
227
+ */
228
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
229
+ function toJson_ServiceMonitorSpecNamespaceSelector(obj) {
230
+ if (obj === undefined) {
231
+ return undefined;
232
+ }
233
+ const result = {
234
+ 'any': obj.any,
235
+ 'matchNames': obj.matchNames?.map(y => y),
236
+ };
237
+ // filter undefined values
238
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
239
+ }
240
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
241
+ /**
242
+ * nativeHistogramMinBucketFactor defines if the growth factor of one bucket to the next is smaller than this,
243
+ * buckets will be merged to increase the factor sufficiently.
244
+ * It requires Prometheus >= v2.50.0.
245
+ *
246
+ * @schema ServiceMonitorSpecNativeHistogramMinBucketFactor
247
+ */
248
+ class ServiceMonitorSpecNativeHistogramMinBucketFactor {
249
+ static fromNumber(value) {
250
+ return new ServiceMonitorSpecNativeHistogramMinBucketFactor(value);
251
+ }
252
+ static fromString(value) {
253
+ return new ServiceMonitorSpecNativeHistogramMinBucketFactor(value);
254
+ }
255
+ constructor(value) {
256
+ this.value = value;
257
+ }
258
+ }
259
+ exports.ServiceMonitorSpecNativeHistogramMinBucketFactor = ServiceMonitorSpecNativeHistogramMinBucketFactor;
260
+ /**
261
+ * ScrapeProtocol represents a protocol used by Prometheus for scraping metrics.
262
+ * Supported values are:
263
+ * * `OpenMetricsText0.0.1`
264
+ * * `OpenMetricsText1.0.0`
265
+ * * `PrometheusProto`
266
+ * * `PrometheusText0.0.4`
267
+ * * `PrometheusText1.0.0`
268
+ *
269
+ * @schema ServiceMonitorSpecScrapeProtocols
270
+ */
271
+ var ServiceMonitorSpecScrapeProtocols;
272
+ (function (ServiceMonitorSpecScrapeProtocols) {
273
+ /** PrometheusProto */
274
+ ServiceMonitorSpecScrapeProtocols["PROMETHEUS_PROTO"] = "PrometheusProto";
275
+ /** OpenMetricsText0.0.1 */
276
+ ServiceMonitorSpecScrapeProtocols["OPEN_METRICS_TEXT0_0_1"] = "OpenMetricsText0.0.1";
277
+ /** OpenMetricsText1.0.0 */
278
+ ServiceMonitorSpecScrapeProtocols["OPEN_METRICS_TEXT1_0_0"] = "OpenMetricsText1.0.0";
279
+ /** PrometheusText0.0.4 */
280
+ ServiceMonitorSpecScrapeProtocols["PROMETHEUS_TEXT0_0_4"] = "PrometheusText0.0.4";
281
+ /** PrometheusText1.0.0 */
282
+ ServiceMonitorSpecScrapeProtocols["PROMETHEUS_TEXT1_0_0"] = "PrometheusText1.0.0";
283
+ })(ServiceMonitorSpecScrapeProtocols || (exports.ServiceMonitorSpecScrapeProtocols = ServiceMonitorSpecScrapeProtocols = {}));
284
+ /**
285
+ * Converts an object of type 'ServiceMonitorSpecSelector' to JSON representation.
286
+ */
287
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
288
+ function toJson_ServiceMonitorSpecSelector(obj) {
289
+ if (obj === undefined) {
290
+ return undefined;
291
+ }
292
+ const result = {
293
+ 'matchExpressions': obj.matchExpressions?.map(y => toJson_ServiceMonitorSpecSelectorMatchExpressions(y)),
294
+ 'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
295
+ };
296
+ // filter undefined values
297
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
298
+ }
299
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
300
+ /**
301
+ * selectorMechanism defines the mechanism used to select the endpoints to scrape.
302
+ * By default, the selection process relies on relabel configurations to filter the discovered targets.
303
+ * Alternatively, you can opt in for role selectors, which may offer better efficiency in large clusters.
304
+ * Which strategy is best for your use case needs to be carefully evaluated.
305
+ *
306
+ * It requires Prometheus >= v2.17.0.
307
+ *
308
+ * @schema ServiceMonitorSpecSelectorMechanism
309
+ */
310
+ var ServiceMonitorSpecSelectorMechanism;
311
+ (function (ServiceMonitorSpecSelectorMechanism) {
312
+ /** RelabelConfig */
313
+ ServiceMonitorSpecSelectorMechanism["RELABEL_CONFIG"] = "RelabelConfig";
314
+ /** RoleSelector */
315
+ ServiceMonitorSpecSelectorMechanism["ROLE_SELECTOR"] = "RoleSelector";
316
+ })(ServiceMonitorSpecSelectorMechanism || (exports.ServiceMonitorSpecSelectorMechanism = ServiceMonitorSpecSelectorMechanism = {}));
317
+ /**
318
+ * serviceDiscoveryRole defines the service discovery role used to discover targets.
319
+ *
320
+ * If set, the value should be either "Endpoints" or "EndpointSlice".
321
+ * Otherwise it defaults to the value defined in the
322
+ * Prometheus/PrometheusAgent resource.
323
+ *
324
+ * @schema ServiceMonitorSpecServiceDiscoveryRole
325
+ */
326
+ var ServiceMonitorSpecServiceDiscoveryRole;
327
+ (function (ServiceMonitorSpecServiceDiscoveryRole) {
328
+ /** Endpoints */
329
+ ServiceMonitorSpecServiceDiscoveryRole["ENDPOINTS"] = "Endpoints";
330
+ /** EndpointSlice */
331
+ ServiceMonitorSpecServiceDiscoveryRole["ENDPOINT_SLICE"] = "EndpointSlice";
332
+ })(ServiceMonitorSpecServiceDiscoveryRole || (exports.ServiceMonitorSpecServiceDiscoveryRole = ServiceMonitorSpecServiceDiscoveryRole = {}));
333
+ /**
334
+ * Converts an object of type 'ServiceMonitorSpecEndpointsAuthorization' to JSON representation.
335
+ */
336
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
337
+ function toJson_ServiceMonitorSpecEndpointsAuthorization(obj) {
338
+ if (obj === undefined) {
339
+ return undefined;
340
+ }
341
+ const result = {
342
+ 'credentials': toJson_ServiceMonitorSpecEndpointsAuthorizationCredentials(obj.credentials),
343
+ 'type': obj.type,
344
+ };
345
+ // filter undefined values
346
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
347
+ }
348
+ /**
349
+ * Converts an object of type 'ServiceMonitorSpecEndpointsBasicAuth' to JSON representation.
350
+ */
351
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
352
+ function toJson_ServiceMonitorSpecEndpointsBasicAuth(obj) {
353
+ if (obj === undefined) {
354
+ return undefined;
355
+ }
356
+ const result = {
357
+ 'password': toJson_ServiceMonitorSpecEndpointsBasicAuthPassword(obj.password),
358
+ 'username': toJson_ServiceMonitorSpecEndpointsBasicAuthUsername(obj.username),
359
+ };
360
+ // filter undefined values
361
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
362
+ }
363
+ /**
364
+ * Converts an object of type 'ServiceMonitorSpecEndpointsBearerTokenSecret' to JSON representation.
365
+ */
366
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
367
+ function toJson_ServiceMonitorSpecEndpointsBearerTokenSecret(obj) {
368
+ if (obj === undefined) {
369
+ return undefined;
370
+ }
371
+ const result = {
372
+ 'key': obj.key,
373
+ 'name': obj.name,
374
+ 'optional': obj.optional,
375
+ };
376
+ // filter undefined values
377
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
378
+ }
379
+ /**
380
+ * Converts an object of type 'ServiceMonitorSpecEndpointsMetricRelabelings' to JSON representation.
381
+ */
382
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
383
+ function toJson_ServiceMonitorSpecEndpointsMetricRelabelings(obj) {
384
+ if (obj === undefined) {
385
+ return undefined;
386
+ }
387
+ const result = {
388
+ 'action': obj.action,
389
+ 'modulus': obj.modulus,
390
+ 'regex': obj.regex,
391
+ 'replacement': obj.replacement,
392
+ 'separator': obj.separator,
393
+ 'sourceLabels': obj.sourceLabels?.map(y => y),
394
+ 'targetLabel': obj.targetLabel,
395
+ };
396
+ // filter undefined values
397
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
398
+ }
399
+ /**
400
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2' to JSON representation.
401
+ */
402
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
403
+ function toJson_ServiceMonitorSpecEndpointsOauth2(obj) {
404
+ if (obj === undefined) {
405
+ return undefined;
406
+ }
407
+ const result = {
408
+ 'clientId': toJson_ServiceMonitorSpecEndpointsOauth2ClientId(obj.clientId),
409
+ 'clientSecret': toJson_ServiceMonitorSpecEndpointsOauth2ClientSecret(obj.clientSecret),
410
+ 'endpointParams': ((obj.endpointParams) === undefined) ? undefined : (Object.entries(obj.endpointParams).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
411
+ 'noProxy': obj.noProxy,
412
+ 'proxyConnectHeader': ((obj.proxyConnectHeader) === undefined) ? undefined : (Object.entries(obj.proxyConnectHeader).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.map(y => toJson_ServiceMonitorSpecEndpointsOauth2ProxyConnectHeader(y)) }), {})),
413
+ 'proxyFromEnvironment': obj.proxyFromEnvironment,
414
+ 'proxyUrl': obj.proxyUrl,
415
+ 'scopes': obj.scopes?.map(y => y),
416
+ 'tlsConfig': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfig(obj.tlsConfig),
417
+ 'tokenUrl': obj.tokenUrl,
418
+ };
419
+ // filter undefined values
420
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
421
+ }
422
+ /**
423
+ * Converts an object of type 'ServiceMonitorSpecEndpointsProxyConnectHeader' to JSON representation.
424
+ */
425
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
426
+ function toJson_ServiceMonitorSpecEndpointsProxyConnectHeader(obj) {
427
+ if (obj === undefined) {
428
+ return undefined;
429
+ }
430
+ const result = {
431
+ 'key': obj.key,
432
+ 'name': obj.name,
433
+ 'optional': obj.optional,
434
+ };
435
+ // filter undefined values
436
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
437
+ }
438
+ /**
439
+ * Converts an object of type 'ServiceMonitorSpecEndpointsRelabelings' to JSON representation.
440
+ */
441
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
442
+ function toJson_ServiceMonitorSpecEndpointsRelabelings(obj) {
443
+ if (obj === undefined) {
444
+ return undefined;
445
+ }
446
+ const result = {
447
+ 'action': obj.action,
448
+ 'modulus': obj.modulus,
449
+ 'regex': obj.regex,
450
+ 'replacement': obj.replacement,
451
+ 'separator': obj.separator,
452
+ 'sourceLabels': obj.sourceLabels?.map(y => y),
453
+ 'targetLabel': obj.targetLabel,
454
+ };
455
+ // filter undefined values
456
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
457
+ }
458
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
459
+ /**
460
+ * scheme defines the HTTP scheme to use when scraping the metrics.
461
+ *
462
+ * @schema ServiceMonitorSpecEndpointsScheme
463
+ */
464
+ var ServiceMonitorSpecEndpointsScheme;
465
+ (function (ServiceMonitorSpecEndpointsScheme) {
466
+ /** http */
467
+ ServiceMonitorSpecEndpointsScheme["HTTP"] = "http";
468
+ /** https */
469
+ ServiceMonitorSpecEndpointsScheme["HTTPS"] = "https";
470
+ })(ServiceMonitorSpecEndpointsScheme || (exports.ServiceMonitorSpecEndpointsScheme = ServiceMonitorSpecEndpointsScheme = {}));
471
+ /**
472
+ * targetPort defines the name or number of the target port of the `Pod` object behind the
473
+ * Service. The port must be specified with the container's port property.
474
+ *
475
+ * @schema ServiceMonitorSpecEndpointsTargetPort
476
+ */
477
+ class ServiceMonitorSpecEndpointsTargetPort {
478
+ static fromNumber(value) {
479
+ return new ServiceMonitorSpecEndpointsTargetPort(value);
480
+ }
481
+ static fromString(value) {
482
+ return new ServiceMonitorSpecEndpointsTargetPort(value);
483
+ }
484
+ constructor(value) {
485
+ this.value = value;
486
+ }
487
+ }
488
+ exports.ServiceMonitorSpecEndpointsTargetPort = ServiceMonitorSpecEndpointsTargetPort;
489
+ /**
490
+ * Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfig' to JSON representation.
491
+ */
492
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
493
+ function toJson_ServiceMonitorSpecEndpointsTlsConfig(obj) {
494
+ if (obj === undefined) {
495
+ return undefined;
496
+ }
497
+ const result = {
498
+ 'ca': toJson_ServiceMonitorSpecEndpointsTlsConfigCa(obj.ca),
499
+ 'caFile': obj.caFile,
500
+ 'cert': toJson_ServiceMonitorSpecEndpointsTlsConfigCert(obj.cert),
501
+ 'certFile': obj.certFile,
502
+ 'insecureSkipVerify': obj.insecureSkipVerify,
503
+ 'keyFile': obj.keyFile,
504
+ 'keySecret': toJson_ServiceMonitorSpecEndpointsTlsConfigKeySecret(obj.keySecret),
505
+ 'maxVersion': obj.maxVersion,
506
+ 'minVersion': obj.minVersion,
507
+ 'serverName': obj.serverName,
508
+ };
509
+ // filter undefined values
510
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
511
+ }
512
+ /**
513
+ * Converts an object of type 'ServiceMonitorSpecSelectorMatchExpressions' to JSON representation.
514
+ */
515
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
516
+ function toJson_ServiceMonitorSpecSelectorMatchExpressions(obj) {
517
+ if (obj === undefined) {
518
+ return undefined;
519
+ }
520
+ const result = {
521
+ 'key': obj.key,
522
+ 'operator': obj.operator,
523
+ 'values': obj.values?.map(y => y),
524
+ };
525
+ // filter undefined values
526
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
527
+ }
528
+ /**
529
+ * Converts an object of type 'ServiceMonitorSpecEndpointsAuthorizationCredentials' to JSON representation.
530
+ */
531
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
532
+ function toJson_ServiceMonitorSpecEndpointsAuthorizationCredentials(obj) {
533
+ if (obj === undefined) {
534
+ return undefined;
535
+ }
536
+ const result = {
537
+ 'key': obj.key,
538
+ 'name': obj.name,
539
+ 'optional': obj.optional,
540
+ };
541
+ // filter undefined values
542
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
543
+ }
544
+ /**
545
+ * Converts an object of type 'ServiceMonitorSpecEndpointsBasicAuthPassword' to JSON representation.
546
+ */
547
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
548
+ function toJson_ServiceMonitorSpecEndpointsBasicAuthPassword(obj) {
549
+ if (obj === undefined) {
550
+ return undefined;
551
+ }
552
+ const result = {
553
+ 'key': obj.key,
554
+ 'name': obj.name,
555
+ 'optional': obj.optional,
556
+ };
557
+ // filter undefined values
558
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
559
+ }
560
+ /**
561
+ * Converts an object of type 'ServiceMonitorSpecEndpointsBasicAuthUsername' to JSON representation.
562
+ */
563
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
564
+ function toJson_ServiceMonitorSpecEndpointsBasicAuthUsername(obj) {
565
+ if (obj === undefined) {
566
+ return undefined;
567
+ }
568
+ const result = {
569
+ 'key': obj.key,
570
+ 'name': obj.name,
571
+ 'optional': obj.optional,
572
+ };
573
+ // filter undefined values
574
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
575
+ }
576
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
577
+ /**
578
+ * action to perform based on the regex matching.
579
+ *
580
+ * `Uppercase` and `Lowercase` actions require Prometheus >= v2.36.0.
581
+ * `DropEqual` and `KeepEqual` actions require Prometheus >= v2.41.0.
582
+ *
583
+ * Default: "Replace"
584
+ *
585
+ * @schema ServiceMonitorSpecEndpointsMetricRelabelingsAction
586
+ */
587
+ var ServiceMonitorSpecEndpointsMetricRelabelingsAction;
588
+ (function (ServiceMonitorSpecEndpointsMetricRelabelingsAction) {
589
+ /** replace */
590
+ ServiceMonitorSpecEndpointsMetricRelabelingsAction["REPLACE"] = "replace";
591
+ /** keep */
592
+ ServiceMonitorSpecEndpointsMetricRelabelingsAction["KEEP"] = "keep";
593
+ /** drop */
594
+ ServiceMonitorSpecEndpointsMetricRelabelingsAction["DROP"] = "drop";
595
+ /** hashmod */
596
+ ServiceMonitorSpecEndpointsMetricRelabelingsAction["HASHMOD"] = "hashmod";
597
+ /** labelmap */
598
+ ServiceMonitorSpecEndpointsMetricRelabelingsAction["LABELMAP"] = "labelmap";
599
+ /** labeldrop */
600
+ ServiceMonitorSpecEndpointsMetricRelabelingsAction["LABELDROP"] = "labeldrop";
601
+ /** labelkeep */
602
+ ServiceMonitorSpecEndpointsMetricRelabelingsAction["LABELKEEP"] = "labelkeep";
603
+ /** lowercase */
604
+ ServiceMonitorSpecEndpointsMetricRelabelingsAction["LOWERCASE"] = "lowercase";
605
+ /** uppercase */
606
+ ServiceMonitorSpecEndpointsMetricRelabelingsAction["UPPERCASE"] = "uppercase";
607
+ /** keepequal */
608
+ ServiceMonitorSpecEndpointsMetricRelabelingsAction["KEEPEQUAL"] = "keepequal";
609
+ /** dropequal */
610
+ ServiceMonitorSpecEndpointsMetricRelabelingsAction["DROPEQUAL"] = "dropequal";
611
+ })(ServiceMonitorSpecEndpointsMetricRelabelingsAction || (exports.ServiceMonitorSpecEndpointsMetricRelabelingsAction = ServiceMonitorSpecEndpointsMetricRelabelingsAction = {}));
612
+ /**
613
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2ClientId' to JSON representation.
614
+ */
615
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
616
+ function toJson_ServiceMonitorSpecEndpointsOauth2ClientId(obj) {
617
+ if (obj === undefined) {
618
+ return undefined;
619
+ }
620
+ const result = {
621
+ 'configMap': toJson_ServiceMonitorSpecEndpointsOauth2ClientIdConfigMap(obj.configMap),
622
+ 'secret': toJson_ServiceMonitorSpecEndpointsOauth2ClientIdSecret(obj.secret),
623
+ };
624
+ // filter undefined values
625
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
626
+ }
627
+ /**
628
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2ClientSecret' to JSON representation.
629
+ */
630
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
631
+ function toJson_ServiceMonitorSpecEndpointsOauth2ClientSecret(obj) {
632
+ if (obj === undefined) {
633
+ return undefined;
634
+ }
635
+ const result = {
636
+ 'key': obj.key,
637
+ 'name': obj.name,
638
+ 'optional': obj.optional,
639
+ };
640
+ // filter undefined values
641
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
642
+ }
643
+ /**
644
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2ProxyConnectHeader' to JSON representation.
645
+ */
646
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
647
+ function toJson_ServiceMonitorSpecEndpointsOauth2ProxyConnectHeader(obj) {
648
+ if (obj === undefined) {
649
+ return undefined;
650
+ }
651
+ const result = {
652
+ 'key': obj.key,
653
+ 'name': obj.name,
654
+ 'optional': obj.optional,
655
+ };
656
+ // filter undefined values
657
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
658
+ }
659
+ /**
660
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfig' to JSON representation.
661
+ */
662
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
663
+ function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfig(obj) {
664
+ if (obj === undefined) {
665
+ return undefined;
666
+ }
667
+ const result = {
668
+ 'ca': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCa(obj.ca),
669
+ 'cert': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCert(obj.cert),
670
+ 'insecureSkipVerify': obj.insecureSkipVerify,
671
+ 'keySecret': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigKeySecret(obj.keySecret),
672
+ 'maxVersion': obj.maxVersion,
673
+ 'minVersion': obj.minVersion,
674
+ 'serverName': obj.serverName,
675
+ };
676
+ // filter undefined values
677
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
678
+ }
679
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
680
+ /**
681
+ * action to perform based on the regex matching.
682
+ *
683
+ * `Uppercase` and `Lowercase` actions require Prometheus >= v2.36.0.
684
+ * `DropEqual` and `KeepEqual` actions require Prometheus >= v2.41.0.
685
+ *
686
+ * Default: "Replace"
687
+ *
688
+ * @schema ServiceMonitorSpecEndpointsRelabelingsAction
689
+ */
690
+ var ServiceMonitorSpecEndpointsRelabelingsAction;
691
+ (function (ServiceMonitorSpecEndpointsRelabelingsAction) {
692
+ /** replace */
693
+ ServiceMonitorSpecEndpointsRelabelingsAction["REPLACE"] = "replace";
694
+ /** keep */
695
+ ServiceMonitorSpecEndpointsRelabelingsAction["KEEP"] = "keep";
696
+ /** drop */
697
+ ServiceMonitorSpecEndpointsRelabelingsAction["DROP"] = "drop";
698
+ /** hashmod */
699
+ ServiceMonitorSpecEndpointsRelabelingsAction["HASHMOD"] = "hashmod";
700
+ /** labelmap */
701
+ ServiceMonitorSpecEndpointsRelabelingsAction["LABELMAP"] = "labelmap";
702
+ /** labeldrop */
703
+ ServiceMonitorSpecEndpointsRelabelingsAction["LABELDROP"] = "labeldrop";
704
+ /** labelkeep */
705
+ ServiceMonitorSpecEndpointsRelabelingsAction["LABELKEEP"] = "labelkeep";
706
+ /** lowercase */
707
+ ServiceMonitorSpecEndpointsRelabelingsAction["LOWERCASE"] = "lowercase";
708
+ /** uppercase */
709
+ ServiceMonitorSpecEndpointsRelabelingsAction["UPPERCASE"] = "uppercase";
710
+ /** keepequal */
711
+ ServiceMonitorSpecEndpointsRelabelingsAction["KEEPEQUAL"] = "keepequal";
712
+ /** dropequal */
713
+ ServiceMonitorSpecEndpointsRelabelingsAction["DROPEQUAL"] = "dropequal";
714
+ })(ServiceMonitorSpecEndpointsRelabelingsAction || (exports.ServiceMonitorSpecEndpointsRelabelingsAction = ServiceMonitorSpecEndpointsRelabelingsAction = {}));
715
+ /**
716
+ * Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCa' to JSON representation.
717
+ */
718
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
719
+ function toJson_ServiceMonitorSpecEndpointsTlsConfigCa(obj) {
720
+ if (obj === undefined) {
721
+ return undefined;
722
+ }
723
+ const result = {
724
+ 'configMap': toJson_ServiceMonitorSpecEndpointsTlsConfigCaConfigMap(obj.configMap),
725
+ 'secret': toJson_ServiceMonitorSpecEndpointsTlsConfigCaSecret(obj.secret),
726
+ };
727
+ // filter undefined values
728
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
729
+ }
730
+ /**
731
+ * Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCert' to JSON representation.
732
+ */
733
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
734
+ function toJson_ServiceMonitorSpecEndpointsTlsConfigCert(obj) {
735
+ if (obj === undefined) {
736
+ return undefined;
737
+ }
738
+ const result = {
739
+ 'configMap': toJson_ServiceMonitorSpecEndpointsTlsConfigCertConfigMap(obj.configMap),
740
+ 'secret': toJson_ServiceMonitorSpecEndpointsTlsConfigCertSecret(obj.secret),
741
+ };
742
+ // filter undefined values
743
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
744
+ }
745
+ /**
746
+ * Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigKeySecret' to JSON representation.
747
+ */
748
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
749
+ function toJson_ServiceMonitorSpecEndpointsTlsConfigKeySecret(obj) {
750
+ if (obj === undefined) {
751
+ return undefined;
752
+ }
753
+ const result = {
754
+ 'key': obj.key,
755
+ 'name': obj.name,
756
+ 'optional': obj.optional,
757
+ };
758
+ // filter undefined values
759
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
760
+ }
761
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
762
+ /**
763
+ * maxVersion defines the maximum acceptable TLS version.
764
+ *
765
+ * It requires Prometheus >= v2.41.0 or Thanos >= v0.31.0.
766
+ *
767
+ * @schema ServiceMonitorSpecEndpointsTlsConfigMaxVersion
768
+ */
769
+ var ServiceMonitorSpecEndpointsTlsConfigMaxVersion;
770
+ (function (ServiceMonitorSpecEndpointsTlsConfigMaxVersion) {
771
+ /** TLS10 */
772
+ ServiceMonitorSpecEndpointsTlsConfigMaxVersion["TLS10"] = "TLS10";
773
+ /** TLS11 */
774
+ ServiceMonitorSpecEndpointsTlsConfigMaxVersion["TLS11"] = "TLS11";
775
+ /** TLS12 */
776
+ ServiceMonitorSpecEndpointsTlsConfigMaxVersion["TLS12"] = "TLS12";
777
+ /** TLS13 */
778
+ ServiceMonitorSpecEndpointsTlsConfigMaxVersion["TLS13"] = "TLS13";
779
+ })(ServiceMonitorSpecEndpointsTlsConfigMaxVersion || (exports.ServiceMonitorSpecEndpointsTlsConfigMaxVersion = ServiceMonitorSpecEndpointsTlsConfigMaxVersion = {}));
780
+ /**
781
+ * minVersion defines the minimum acceptable TLS version.
782
+ *
783
+ * It requires Prometheus >= v2.35.0 or Thanos >= v0.28.0.
784
+ *
785
+ * @schema ServiceMonitorSpecEndpointsTlsConfigMinVersion
786
+ */
787
+ var ServiceMonitorSpecEndpointsTlsConfigMinVersion;
788
+ (function (ServiceMonitorSpecEndpointsTlsConfigMinVersion) {
789
+ /** TLS10 */
790
+ ServiceMonitorSpecEndpointsTlsConfigMinVersion["TLS10"] = "TLS10";
791
+ /** TLS11 */
792
+ ServiceMonitorSpecEndpointsTlsConfigMinVersion["TLS11"] = "TLS11";
793
+ /** TLS12 */
794
+ ServiceMonitorSpecEndpointsTlsConfigMinVersion["TLS12"] = "TLS12";
795
+ /** TLS13 */
796
+ ServiceMonitorSpecEndpointsTlsConfigMinVersion["TLS13"] = "TLS13";
797
+ })(ServiceMonitorSpecEndpointsTlsConfigMinVersion || (exports.ServiceMonitorSpecEndpointsTlsConfigMinVersion = ServiceMonitorSpecEndpointsTlsConfigMinVersion = {}));
798
+ /**
799
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2ClientIdConfigMap' to JSON representation.
800
+ */
801
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
802
+ function toJson_ServiceMonitorSpecEndpointsOauth2ClientIdConfigMap(obj) {
803
+ if (obj === undefined) {
804
+ return undefined;
805
+ }
806
+ const result = {
807
+ 'key': obj.key,
808
+ 'name': obj.name,
809
+ 'optional': obj.optional,
810
+ };
811
+ // filter undefined values
812
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
813
+ }
814
+ /**
815
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2ClientIdSecret' to JSON representation.
816
+ */
817
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
818
+ function toJson_ServiceMonitorSpecEndpointsOauth2ClientIdSecret(obj) {
819
+ if (obj === undefined) {
820
+ return undefined;
821
+ }
822
+ const result = {
823
+ 'key': obj.key,
824
+ 'name': obj.name,
825
+ 'optional': obj.optional,
826
+ };
827
+ // filter undefined values
828
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
829
+ }
830
+ /**
831
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCa' to JSON representation.
832
+ */
833
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
834
+ function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCa(obj) {
835
+ if (obj === undefined) {
836
+ return undefined;
837
+ }
838
+ const result = {
839
+ 'configMap': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaConfigMap(obj.configMap),
840
+ 'secret': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaSecret(obj.secret),
841
+ };
842
+ // filter undefined values
843
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
844
+ }
845
+ /**
846
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCert' to JSON representation.
847
+ */
848
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
849
+ function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCert(obj) {
850
+ if (obj === undefined) {
851
+ return undefined;
852
+ }
853
+ const result = {
854
+ 'configMap': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertConfigMap(obj.configMap),
855
+ 'secret': toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertSecret(obj.secret),
856
+ };
857
+ // filter undefined values
858
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
859
+ }
860
+ /**
861
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigKeySecret' to JSON representation.
862
+ */
863
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
864
+ function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigKeySecret(obj) {
865
+ if (obj === undefined) {
866
+ return undefined;
867
+ }
868
+ const result = {
869
+ 'key': obj.key,
870
+ 'name': obj.name,
871
+ 'optional': obj.optional,
872
+ };
873
+ // filter undefined values
874
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
875
+ }
876
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
877
+ /**
878
+ * maxVersion defines the maximum acceptable TLS version.
879
+ *
880
+ * It requires Prometheus >= v2.41.0 or Thanos >= v0.31.0.
881
+ *
882
+ * @schema ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion
883
+ */
884
+ var ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion;
885
+ (function (ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion) {
886
+ /** TLS10 */
887
+ ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion["TLS10"] = "TLS10";
888
+ /** TLS11 */
889
+ ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion["TLS11"] = "TLS11";
890
+ /** TLS12 */
891
+ ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion["TLS12"] = "TLS12";
892
+ /** TLS13 */
893
+ ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion["TLS13"] = "TLS13";
894
+ })(ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion || (exports.ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion = ServiceMonitorSpecEndpointsOauth2TlsConfigMaxVersion = {}));
895
+ /**
896
+ * minVersion defines the minimum acceptable TLS version.
897
+ *
898
+ * It requires Prometheus >= v2.35.0 or Thanos >= v0.28.0.
899
+ *
900
+ * @schema ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion
901
+ */
902
+ var ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion;
903
+ (function (ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion) {
904
+ /** TLS10 */
905
+ ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion["TLS10"] = "TLS10";
906
+ /** TLS11 */
907
+ ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion["TLS11"] = "TLS11";
908
+ /** TLS12 */
909
+ ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion["TLS12"] = "TLS12";
910
+ /** TLS13 */
911
+ ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion["TLS13"] = "TLS13";
912
+ })(ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion || (exports.ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion = ServiceMonitorSpecEndpointsOauth2TlsConfigMinVersion = {}));
913
+ /**
914
+ * Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCaConfigMap' to JSON representation.
915
+ */
916
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
917
+ function toJson_ServiceMonitorSpecEndpointsTlsConfigCaConfigMap(obj) {
918
+ if (obj === undefined) {
919
+ return undefined;
920
+ }
921
+ const result = {
922
+ 'key': obj.key,
923
+ 'name': obj.name,
924
+ 'optional': obj.optional,
925
+ };
926
+ // filter undefined values
927
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
928
+ }
929
+ /**
930
+ * Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCaSecret' to JSON representation.
931
+ */
932
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
933
+ function toJson_ServiceMonitorSpecEndpointsTlsConfigCaSecret(obj) {
934
+ if (obj === undefined) {
935
+ return undefined;
936
+ }
937
+ const result = {
938
+ 'key': obj.key,
939
+ 'name': obj.name,
940
+ 'optional': obj.optional,
941
+ };
942
+ // filter undefined values
943
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
944
+ }
945
+ /**
946
+ * Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCertConfigMap' to JSON representation.
947
+ */
948
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
949
+ function toJson_ServiceMonitorSpecEndpointsTlsConfigCertConfigMap(obj) {
950
+ if (obj === undefined) {
951
+ return undefined;
952
+ }
953
+ const result = {
954
+ 'key': obj.key,
955
+ 'name': obj.name,
956
+ 'optional': obj.optional,
957
+ };
958
+ // filter undefined values
959
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
960
+ }
961
+ /**
962
+ * Converts an object of type 'ServiceMonitorSpecEndpointsTlsConfigCertSecret' to JSON representation.
963
+ */
964
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
965
+ function toJson_ServiceMonitorSpecEndpointsTlsConfigCertSecret(obj) {
966
+ if (obj === undefined) {
967
+ return undefined;
968
+ }
969
+ const result = {
970
+ 'key': obj.key,
971
+ 'name': obj.name,
972
+ 'optional': obj.optional,
973
+ };
974
+ // filter undefined values
975
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
976
+ }
977
+ /**
978
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCaConfigMap' to JSON representation.
979
+ */
980
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
981
+ function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaConfigMap(obj) {
982
+ if (obj === undefined) {
983
+ return undefined;
984
+ }
985
+ const result = {
986
+ 'key': obj.key,
987
+ 'name': obj.name,
988
+ 'optional': obj.optional,
989
+ };
990
+ // filter undefined values
991
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
992
+ }
993
+ /**
994
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCaSecret' to JSON representation.
995
+ */
996
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
997
+ function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCaSecret(obj) {
998
+ if (obj === undefined) {
999
+ return undefined;
1000
+ }
1001
+ const result = {
1002
+ 'key': obj.key,
1003
+ 'name': obj.name,
1004
+ 'optional': obj.optional,
1005
+ };
1006
+ // filter undefined values
1007
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1008
+ }
1009
+ /**
1010
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCertConfigMap' to JSON representation.
1011
+ */
1012
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1013
+ function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertConfigMap(obj) {
1014
+ if (obj === undefined) {
1015
+ return undefined;
1016
+ }
1017
+ const result = {
1018
+ 'key': obj.key,
1019
+ 'name': obj.name,
1020
+ 'optional': obj.optional,
1021
+ };
1022
+ // filter undefined values
1023
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1024
+ }
1025
+ /**
1026
+ * Converts an object of type 'ServiceMonitorSpecEndpointsOauth2TlsConfigCertSecret' to JSON representation.
1027
+ */
1028
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1029
+ function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertSecret(obj) {
1030
+ if (obj === undefined) {
1031
+ return undefined;
1032
+ }
1033
+ const result = {
1034
+ 'key': obj.key,
1035
+ 'name': obj.name,
1036
+ 'optional': obj.optional,
1037
+ };
1038
+ // filter undefined values
1039
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1040
+ }
1041
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1042
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmluZy5jb3Jlb3MuY29tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydHMvbW9uaXRvcmluZy5jb3Jlb3MuY29tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlHQSxnRUFRQztBQXVPRCw4REE2QkM7QUE0QkQsMEZBT0M7QUFzUEQsZ0ZBK0JDO0FBa0RELGdHQVFDO0FBd0VELDhFQVFDO0FBb0VELDBHQVFDO0FBaUNELGtHQVFDO0FBMkNELGtIQVNDO0FBbUZELGtIQWFDO0FBcUdELDRGQWdCQztBQXVDRCxvSEFTQztBQW1GRCxzR0FhQztBQXFIRCxrR0FnQkM7QUF3Q0QsOEdBU0M7QUF1Q0QsZ0lBU0M7QUF3Q0Qsa0hBU0M7QUF3Q0Qsa0hBU0M7QUFnRUQsNEdBUUM7QUF3Q0Qsb0hBU0M7QUF1Q0QsZ0lBU0M7QUFvRUQsOEdBYUM7QUErREQsc0dBUUM7QUE0QkQsMEdBUUM7QUF1Q0Qsb0hBU0M7QUEyRUQsOEhBU0M7QUF1Q0Qsd0hBU0M7QUE0QkQsa0hBUUM7QUE0QkQsc0hBUUM7QUF1Q0QsZ0lBU0M7QUEyRUQsd0hBU0M7QUF1Q0Qsa0hBU0M7QUF1Q0QsNEhBU0M7QUF1Q0Qsc0hBU0M7QUF1Q0Qsb0lBU0M7QUF1Q0QsOEhBU0M7QUF1Q0Qsd0lBU0M7QUF1Q0Qsa0lBU0M7QUExckZELHFCQUFxQjtBQUNyQixpQ0FBdUU7QUFJdkU7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFhLGNBQWUsU0FBUSxpQkFBUztJQVMzQzs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQTBCO1FBQy9DLE9BQU87WUFDTCxHQUFHLGNBQWMsQ0FBQyxHQUFHO1lBQ3JCLEdBQUcsMEJBQTBCLENBQUMsS0FBSyxDQUFDO1NBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFtQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUs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QUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFDRCxvRkFBb0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgY2RrOHNcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBpT2JqZWN0TWV0YWRhdGEsIEdyb3VwVmVyc2lvbktpbmQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIFRoZSBgU2VydmljZU1vbml0b3JgIGN1c3RvbSByZXNvdXJjZSBkZWZpbml0aW9uIChDUkQpIGRlZmluZXMgaG93IGBQcm9tZXRoZXVzYCBhbmQgYFByb21ldGhldXNBZ2VudGAgY2FuIHNjcmFwZSBtZXRyaWNzIGZyb20gYSBncm91cCBvZiBzZXJ2aWNlcy5cbkFtb25nIG90aGVyIHRoaW5ncywgaXQgYWxsb3dzIHRvIHNwZWNpZnk6XG4qIFRoZSBzZXJ2aWNlcyB0byBzY3JhcGUgdmlhIGxhYmVsIHNlbGVjdG9ycy5cbiogVGhlIGNvbnRhaW5lciBwb3J0cyB0byBzY3JhcGUuXG4qIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZS5cbiogVGFyZ2V0IGFuZCBtZXRyaWMgcmVsYWJlbGluZy5cblxuYFByb21ldGhldXNgIGFuZCBgUHJvbWV0aGV1c0FnZW50YCBvYmplY3RzIHNlbGVjdCBgU2VydmljZU1vbml0b3JgIG9iamVjdHMgdXNpbmcgbGFiZWwgYW5kIG5hbWVzcGFjZSBzZWxlY3RvcnMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclxuICovXG5leHBvcnQgY2xhc3MgU2VydmljZU1vbml0b3IgZXh0ZW5kcyBBcGlPYmplY3Qge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXBpVmVyc2lvbiBhbmQga2luZCBmb3IgXCJTZXJ2aWNlTW9uaXRvclwiXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdWSzogR3JvdXBWZXJzaW9uS2luZCA9IHtcbiAgICBhcGlWZXJzaW9uOiAnbW9uaXRvcmluZy5jb3Jlb3MuY29tL3YxJyxcbiAgICBraW5kOiAnU2VydmljZU1vbml0b3InLFxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSBLdWJlcm5ldGVzIG1hbmlmZXN0IGZvciBcIlNlcnZpY2VNb25pdG9yXCIuXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5saW5lIHJlc291cmNlIG1hbmlmZXN0cyBpbnNpZGUgb3RoZXIgb2JqZWN0cyAoZS5nLiBhcyB0ZW1wbGF0ZXMpLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgaW5pdGlhbGl6YXRpb24gcHJvcHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWFuaWZlc3QocHJvcHM6IFNlcnZpY2VNb25pdG9yUHJvcHMpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5TZXJ2aWNlTW9uaXRvci5HVkssXG4gICAgICAuLi50b0pzb25fU2VydmljZU1vbml0b3JQcm9wcyhwcm9wcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgXCJTZXJ2aWNlTW9uaXRvclwiIEFQSSBvYmplY3RcbiAgICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBvYmplY3RcbiAgICogQHBhcmFtIGlkIGEgc2NvcGUtbG9jYWwgbmFtZSBmb3IgdGhlIG9iamVjdFxuICAgKiBAcGFyYW0gcHJvcHMgaW5pdGlhbGl6YXRpb24gcHJvcHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2VydmljZU1vbml0b3JQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uU2VydmljZU1vbml0b3IuR1ZLLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgb2JqZWN0IHRvIEt1YmVybmV0ZXMgSlNPTi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB0b0pzb24oKTogYW55IHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHN1cGVyLnRvSnNvbigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLlNlcnZpY2VNb25pdG9yLkdWSyxcbiAgICAgIC4uLnRvSnNvbl9TZXJ2aWNlTW9uaXRvclByb3BzKHJlc29sdmVkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVGhlIGBTZXJ2aWNlTW9uaXRvcmAgY3VzdG9tIHJlc291cmNlIGRlZmluaXRpb24gKENSRCkgZGVmaW5lcyBob3cgYFByb21ldGhldXNgIGFuZCBgUHJvbWV0aGV1c0FnZW50YCBjYW4gc2NyYXBlIG1ldHJpY3MgZnJvbSBhIGdyb3VwIG9mIHNlcnZpY2VzLlxuICogQW1vbmcgb3RoZXIgdGhpbmdzLCBpdCBhbGxvd3MgdG8gc3BlY2lmeTpcbiAqICogVGhlIHNlcnZpY2VzIHRvIHNjcmFwZSB2aWEgbGFiZWwgc2VsZWN0b3JzLlxuICogKiBUaGUgY29udGFpbmVyIHBvcnRzIHRvIHNjcmFwZS5cbiAqICogQXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgdG8gdXNlLlxuICogKiBUYXJnZXQgYW5kIG1ldHJpYyByZWxhYmVsaW5nLlxuICpcbiAqIGBQcm9tZXRoZXVzYCBhbmQgYFByb21ldGhldXNBZ2VudGAgb2JqZWN0cyBzZWxlY3QgYFNlcnZpY2VNb25pdG9yYCBvYmplY3RzIHVzaW5nIGxhYmVsIGFuZCBuYW1lc3BhY2Ugc2VsZWN0b3JzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclByb3BzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3IjbWV0YWRhdGFcbiAgICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogQXBpT2JqZWN0TWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIHNwZWMgZGVmaW5lcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBkZXNpcmVkIFNlcnZpY2Ugc2VsZWN0aW9uIGZvciB0YXJnZXQgZGlzY292ZXJ5IGJ5XG4gICAqIFByb21ldGhldXMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3Ijc3BlY1xuICAgKi9cbiAgcmVhZG9ubHkgc3BlYzogU2VydmljZU1vbml0b3JTcGVjO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yUHJvcHMob2JqOiBTZXJ2aWNlTW9uaXRvclByb3BzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWV0YWRhdGEnOiBvYmoubWV0YWRhdGEsXG4gICAgJ3NwZWMnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjKG9iai5zcGVjKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNwZWMgZGVmaW5lcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBkZXNpcmVkIFNlcnZpY2Ugc2VsZWN0aW9uIGZvciB0YXJnZXQgZGlzY292ZXJ5IGJ5XG4gKiBQcm9tZXRoZXVzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjIHtcbiAgLyoqXG4gICAqIGF0dGFjaE1ldGFkYXRhIGRlZmluZXMgYWRkaXRpb25hbCBtZXRhZGF0YSB3aGljaCBpcyBhZGRlZCB0byB0aGVcbiAgICogZGlzY292ZXJlZCB0YXJnZXRzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjM3LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI2F0dGFjaE1ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBhdHRhY2hNZXRhZGF0YT86IFNlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBib2R5U2l6ZUxpbWl0IHdoZW4gZGVmaW5lZCwgYm9keVNpemVMaW1pdCBzcGVjaWZpZXMgYSBqb2IgbGV2ZWwgbGltaXQgb24gdGhlIHNpemVcbiAgICogb2YgdW5jb21wcmVzc2VkIHJlc3BvbnNlIGJvZHkgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGJ5IFByb21ldGhldXMuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMjguMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjYm9keVNpemVMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgYm9keVNpemVMaW1pdD86IHN0cmluZztcblxuICAvKipcbiAgICogY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OSENCIGRlZmluZXMgd2hldGhlciB0byBjb252ZXJ0IGFsbCBzY3JhcGVkIGNsYXNzaWMgaGlzdG9ncmFtcyBpbnRvIGEgbmF0aXZlIGhpc3RvZ3JhbSB3aXRoIGN1c3RvbSBidWNrZXRzLlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYzLjAuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OSENCXG4gICAqL1xuICByZWFkb25seSBjb252ZXJ0Q2xhc3NpY0hpc3RvZ3JhbXNUb05oY2I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBlbmRwb2ludHMgZGVmaW5lcyB0aGUgbGlzdCBvZiBlbmRwb2ludHMgcGFydCBvZiB0aGlzIFNlcnZpY2VNb25pdG9yLlxuICAgKiBEZWZpbmVzIGhvdyB0byBzY3JhcGUgbWV0cmljcyBmcm9tIEt1YmVybmV0ZXMgW0VuZHBvaW50c10oaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc2VydmljZXMtbmV0d29ya2luZy9zZXJ2aWNlLyNlbmRwb2ludHMpIG9iamVjdHMuXG4gICAqIEluIG1vc3QgY2FzZXMsIGFuIEVuZHBvaW50cyBvYmplY3QgaXMgYmFja2VkIGJ5IGEgS3ViZXJuZXRlcyBbU2VydmljZV0oaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc2VydmljZXMtbmV0d29ya2luZy9zZXJ2aWNlLykgb2JqZWN0IHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbGFiZWxzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNlbmRwb2ludHNcbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50czogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzW107XG5cbiAgLyoqXG4gICAqIGZhbGxiYWNrU2NyYXBlUHJvdG9jb2wgZGVmaW5lcyB0aGUgcHJvdG9jb2wgdG8gdXNlIGlmIGEgc2NyYXBlIHJldHVybnMgYmxhbmssIHVucGFyc2VhYmxlLCBvciBvdGhlcndpc2UgaW52YWxpZCBDb250ZW50LVR5cGUuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjMuMC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNmYWxsYmFja1NjcmFwZVByb3RvY29sXG4gICAqL1xuICByZWFkb25seSBmYWxsYmFja1NjcmFwZVByb3RvY29sPzogU2VydmljZU1vbml0b3JTcGVjRmFsbGJhY2tTY3JhcGVQcm90b2NvbDtcblxuICAvKipcbiAgICogam9iTGFiZWwgc2VsZWN0cyB0aGUgbGFiZWwgZnJvbSB0aGUgYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBTZXJ2aWNlYFxuICAgKiBvYmplY3Qgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBgam9iYCBsYWJlbCBmb3IgYWxsIG1ldHJpY3MuXG4gICAqXG4gICAqIEZvciBleGFtcGxlIGlmIGBqb2JMYWJlbGAgaXMgc2V0IHRvIGBmb29gIGFuZCB0aGUgS3ViZXJuZXRlcyBgU2VydmljZWBcbiAgICogb2JqZWN0IGlzIGxhYmVsZWQgd2l0aCBgZm9vOiBiYXJgLCB0aGVuIFByb21ldGhldXMgYWRkcyB0aGUgYGpvYj1cImJhclwiYFxuICAgKiBsYWJlbCB0byBhbGwgaW5nZXN0ZWQgbWV0cmljcy5cbiAgICpcbiAgICogSWYgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgZW1wdHkgb3IgaWYgdGhlIGxhYmVsIGRvZXNuJ3QgZXhpc3QgZm9yXG4gICAqIHRoZSBnaXZlbiBTZXJ2aWNlLCB0aGUgYGpvYmAgbGFiZWwgb2YgdGhlIG1ldHJpY3MgZGVmYXVsdHMgdG8gdGhlIG5hbWVcbiAgICogb2YgdGhlIGFzc29jaWF0ZWQgS3ViZXJuZXRlcyBgU2VydmljZWAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI2pvYkxhYmVsXG4gICAqL1xuICByZWFkb25seSBqb2JMYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICoga2VlcERyb3BwZWRUYXJnZXRzIGRlZmluZXMgdGhlIHBlci1zY3JhcGUgbGltaXQgb24gdGhlIG51bWJlciBvZiB0YXJnZXRzIGRyb3BwZWQgYnkgcmVsYWJlbGluZ1xuICAgKiB0aGF0IHdpbGwgYmUga2VwdCBpbiBtZW1vcnkuIDAgbWVhbnMgbm8gbGltaXQuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDcuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMja2VlcERyb3BwZWRUYXJnZXRzXG4gICAqL1xuICByZWFkb25seSBrZWVwRHJvcHBlZFRhcmdldHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIGxhYmVsTGltaXQgZGVmaW5lcyB0aGUgcGVyLXNjcmFwZSBsaW1pdCBvbiBudW1iZXIgb2YgbGFiZWxzIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBmb3IgYSBzYW1wbGUuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMjcuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjbGFiZWxMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbGFiZWxOYW1lTGVuZ3RoTGltaXQgZGVmaW5lcyB0aGUgcGVyLXNjcmFwZSBsaW1pdCBvbiBsZW5ndGggb2YgbGFiZWxzIG5hbWUgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGZvciBhIHNhbXBsZS5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4yNy4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNsYWJlbE5hbWVMZW5ndGhMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxOYW1lTGVuZ3RoTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIGxhYmVsVmFsdWVMZW5ndGhMaW1pdCBkZWZpbmVzIHRoZSBwZXItc2NyYXBlIGxpbWl0IG9uIGxlbmd0aCBvZiBsYWJlbHMgdmFsdWUgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGZvciBhIHNhbXBsZS5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4yNy4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNsYWJlbFZhbHVlTGVuZ3RoTGltaXRcbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsVmFsdWVMZW5ndGhMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbmFtZXNwYWNlU2VsZWN0b3IgZGVmaW5lcyBpbiB3aGljaCBuYW1lc3BhY2UocykgUHJvbWV0aGV1cyBzaG91bGQgZGlzY292ZXIgdGhlIHNlcnZpY2VzLlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc2VydmljZXMgYXJlIGRpc2NvdmVyZWQgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBgU2VydmljZU1vbml0b3JgIG9iamVjdCBidXQgaXQgaXMgcG9zc2libGUgdG8gc2VsZWN0IHBvZHMgYWNyb3NzIGRpZmZlcmVudC9hbGwgbmFtZXNwYWNlcy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hdGl2ZUhpc3RvZ3JhbUJ1Y2tldExpbWl0IGRlZmluZXMgZmYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0aGlzIG1hbnkgYnVja2V0cyBpbiBhIG5hdGl2ZSBoaXN0b2dyYW0sXG4gICAqIGJ1Y2tldHMgd2lsbCBiZSBtZXJnZWQgdG8gc3RheSB3aXRoaW4gdGhlIGxpbWl0LlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQ1LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI25hdGl2ZUhpc3RvZ3JhbUJ1Y2tldExpbWl0XG4gICAqL1xuICByZWFkb25seSBuYXRpdmVIaXN0b2dyYW1CdWNrZXRMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIGRlZmluZXMgaWYgdGhlIGdyb3d0aCBmYWN0b3Igb2Ygb25lIGJ1Y2tldCB0byB0aGUgbmV4dCBpcyBzbWFsbGVyIHRoYW4gdGhpcyxcbiAgICogYnVja2V0cyB3aWxsIGJlIG1lcmdlZCB0byBpbmNyZWFzZSB0aGUgZmFjdG9yIHN1ZmZpY2llbnRseS5cbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi41MC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNuYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcj86IFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3RvcjtcblxuICAvKipcbiAgICogcG9kVGFyZ2V0TGFiZWxzIGRlZmluZXMgdGhlIGxhYmVscyB3aGljaCBhcmUgdHJhbnNmZXJyZWQgZnJvbSB0aGVcbiAgICogYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBQb2RgIG9iamVjdCBvbnRvIHRoZSBpbmdlc3RlZCBtZXRyaWNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNwb2RUYXJnZXRMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IHBvZFRhcmdldExhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBzYW1wbGVMaW1pdCBkZWZpbmVzIGEgcGVyLXNjcmFwZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNjcmFwZWQgc2FtcGxlc1xuICAgKiB0aGF0IHdpbGwgYmUgYWNjZXB0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NhbXBsZUxpbWl0XG4gICAqL1xuICByZWFkb25seSBzYW1wbGVMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogc2NyYXBlQ2xhc3MgZGVmaW5lcyB0aGUgc2NyYXBlIGNsYXNzIHRvIGFwcGx5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNzY3JhcGVDbGFzc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlQ2xhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNjcmFwZUNsYXNzaWNIaXN0b2dyYW1zIGRlZmluZXMgd2hldGhlciB0byBzY3JhcGUgYSBjbGFzc2ljIGhpc3RvZ3JhbSB0aGF0IGlzIGFsc28gZXhwb3NlZCBhcyBhIG5hdGl2ZSBoaXN0b2dyYW0uXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDUuMC5cbiAgICpcbiAgICogTm90aWNlOiBgc2NyYXBlQ2xhc3NpY0hpc3RvZ3JhbXNgIGNvcnJlc3BvbmRzIHRvIHRoZSBgYWx3YXlzX3NjcmFwZV9jbGFzc2ljX2hpc3RvZ3JhbXNgIGZpZWxkIGluIHRoZSBQcm9tZXRoZXVzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NjcmFwZUNsYXNzaWNIaXN0b2dyYW1zXG4gICAqL1xuICByZWFkb25seSBzY3JhcGVDbGFzc2ljSGlzdG9ncmFtcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNjcmFwZVByb3RvY29scyBkZWZpbmVzIHRoZSBwcm90b2NvbHMgdG8gbmVnb3RpYXRlIGR1cmluZyBhIHNjcmFwZS4gSXQgdGVsbHMgY2xpZW50cyB0aGVcbiAgICogcHJvdG9jb2xzIHN1cHBvcnRlZCBieSBQcm9tZXRoZXVzIGluIG9yZGVyIG9mIHByZWZlcmVuY2UgKGZyb20gbW9zdCB0byBsZWFzdCBwcmVmZXJyZWQpLlxuICAgKlxuICAgKiBJZiB1bnNldCwgUHJvbWV0aGV1cyB1c2VzIGl0cyBkZWZhdWx0IHZhbHVlLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQ5LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NjcmFwZVByb3RvY29sc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlUHJvdG9jb2xzPzogU2VydmljZU1vbml0b3JTcGVjU2NyYXBlUHJvdG9jb2xzW107XG5cbiAgLyoqXG4gICAqIHNlbGVjdG9yIGRlZmluZXMgdGhlIGxhYmVsIHNlbGVjdG9yIHRvIHNlbGVjdCB0aGUgS3ViZXJuZXRlcyBgRW5kcG9pbnRzYCBvYmplY3RzIHRvIHNjcmFwZSBtZXRyaWNzIGZyb20uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBzZWxlY3RvcjogU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIHNlbGVjdG9yTWVjaGFuaXNtIGRlZmluZXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHNlbGVjdCB0aGUgZW5kcG9pbnRzIHRvIHNjcmFwZS5cbiAgICogQnkgZGVmYXVsdCwgdGhlIHNlbGVjdGlvbiBwcm9jZXNzIHJlbGllcyBvbiByZWxhYmVsIGNvbmZpZ3VyYXRpb25zIHRvIGZpbHRlciB0aGUgZGlzY292ZXJlZCB0YXJnZXRzLlxuICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIG9wdCBpbiBmb3Igcm9sZSBzZWxlY3RvcnMsIHdoaWNoIG1heSBvZmZlciBiZXR0ZXIgZWZmaWNpZW5jeSBpbiBsYXJnZSBjbHVzdGVycy5cbiAgICogV2hpY2ggc3RyYXRlZ3kgaXMgYmVzdCBmb3IgeW91ciB1c2UgY2FzZSBuZWVkcyB0byBiZSBjYXJlZnVsbHkgZXZhbHVhdGVkLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjE3LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NlbGVjdG9yTWVjaGFuaXNtXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Rvck1lY2hhbmlzbT86IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtO1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlRGlzY292ZXJ5Um9sZSBkZWZpbmVzIHRoZSBzZXJ2aWNlIGRpc2NvdmVyeSByb2xlIHVzZWQgdG8gZGlzY292ZXIgdGFyZ2V0cy5cbiAgICpcbiAgICogSWYgc2V0LCB0aGUgdmFsdWUgc2hvdWxkIGJlIGVpdGhlciBcIkVuZHBvaW50c1wiIG9yIFwiRW5kcG9pbnRTbGljZVwiLlxuICAgKiBPdGhlcndpc2UgaXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIGRlZmluZWQgaW4gdGhlXG4gICAqIFByb21ldGhldXMvUHJvbWV0aGV1c0FnZW50IHJlc291cmNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNzZXJ2aWNlRGlzY292ZXJ5Um9sZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZURpc2NvdmVyeVJvbGU/OiBTZXJ2aWNlTW9uaXRvclNwZWNTZXJ2aWNlRGlzY292ZXJ5Um9sZTtcblxuICAvKipcbiAgICogdGFyZ2V0TGFiZWxzIGRlZmluZXMgdGhlIGxhYmVscyB3aGljaCBhcmUgdHJhbnNmZXJyZWQgZnJvbSB0aGVcbiAgICogYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBTZXJ2aWNlYCBvYmplY3Qgb250byB0aGUgaW5nZXN0ZWQgbWV0cmljcy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjdGFyZ2V0TGFiZWxzXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRMYWJlbHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogdGFyZ2V0TGltaXQgZGVmaW5lcyBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc2NyYXBlZCB0YXJnZXRzIHRoYXQgd2lsbFxuICAgKiBiZSBhY2NlcHRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjdGFyZ2V0TGltaXRcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldExpbWl0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjKG9iajogU2VydmljZU1vbml0b3JTcGVjIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXR0YWNoTWV0YWRhdGEnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEob2JqLmF0dGFjaE1ldGFkYXRhKSxcbiAgICAnYm9keVNpemVMaW1pdCc6IG9iai5ib2R5U2l6ZUxpbWl0LFxuICAgICdjb252ZXJ0Q2xhc3NpY0hpc3RvZ3JhbXNUb05IQ0InOiBvYmouY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OaGNiLFxuICAgICdlbmRwb2ludHMnOiBvYmouZW5kcG9pbnRzPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzKHkpKSxcbiAgICAnZmFsbGJhY2tTY3JhcGVQcm90b2NvbCc6IG9iai5mYWxsYmFja1NjcmFwZVByb3RvY29sLFxuICAgICdqb2JMYWJlbCc6IG9iai5qb2JMYWJlbCxcbiAgICAna2VlcERyb3BwZWRUYXJnZXRzJzogb2JqLmtlZXBEcm9wcGVkVGFyZ2V0cyxcbiAgICAnbGFiZWxMaW1pdCc6IG9iai5sYWJlbExpbWl0LFxuICAgICdsYWJlbE5hbWVMZW5ndGhMaW1pdCc6IG9iai5sYWJlbE5hbWVMZW5ndGhMaW1pdCxcbiAgICAnbGFiZWxWYWx1ZUxlbmd0aExpbWl0Jzogb2JqLmxhYmVsVmFsdWVMZW5ndGhMaW1pdCxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3Iob2JqLm5hbWVzcGFjZVNlbGVjdG9yKSxcbiAgICAnbmF0aXZlSGlzdG9ncmFtQnVja2V0TGltaXQnOiBvYmoubmF0aXZlSGlzdG9ncmFtQnVja2V0TGltaXQsXG4gICAgJ25hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcic6IG9iai5uYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3I/LnZhbHVlLFxuICAgICdwb2RUYXJnZXRMYWJlbHMnOiBvYmoucG9kVGFyZ2V0TGFiZWxzPy5tYXAoeSA9PiB5KSxcbiAgICAnc2FtcGxlTGltaXQnOiBvYmouc2FtcGxlTGltaXQsXG4gICAgJ3NjcmFwZUNsYXNzJzogb2JqLnNjcmFwZUNsYXNzLFxuICAgICdzY3JhcGVDbGFzc2ljSGlzdG9ncmFtcyc6IG9iai5zY3JhcGVDbGFzc2ljSGlzdG9ncmFtcyxcbiAgICAnc2NyYXBlUHJvdG9jb2xzJzogb2JqLnNjcmFwZVByb3RvY29scz8ubWFwKHkgPT4geSksXG4gICAgJ3NlbGVjdG9yJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yKG9iai5zZWxlY3RvciksXG4gICAgJ3NlbGVjdG9yTWVjaGFuaXNtJzogb2JqLnNlbGVjdG9yTWVjaGFuaXNtLFxuICAgICdzZXJ2aWNlRGlzY292ZXJ5Um9sZSc6IG9iai5zZXJ2aWNlRGlzY292ZXJ5Um9sZSxcbiAgICAndGFyZ2V0TGFiZWxzJzogb2JqLnRhcmdldExhYmVscz8ubWFwKHkgPT4geSksXG4gICAgJ3RhcmdldExpbWl0Jzogb2JqLnRhcmdldExpbWl0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYXR0YWNoTWV0YWRhdGEgZGVmaW5lcyBhZGRpdGlvbmFsIG1ldGFkYXRhIHdoaWNoIGlzIGFkZGVkIHRvIHRoZVxuICogZGlzY292ZXJlZCB0YXJnZXRzLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMzcuMC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEge1xuICAvKipcbiAgICogbm9kZSB3aGVuIHNldCB0byB0cnVlLCBQcm9tZXRoZXVzIGF0dGFjaGVzIG5vZGUgbWV0YWRhdGEgdG8gdGhlIGRpc2NvdmVyZWRcbiAgICogdGFyZ2V0cy5cbiAgICpcbiAgICogVGhlIFByb21ldGhldXMgc2VydmljZSBhY2NvdW50IG11c3QgaGF2ZSB0aGUgYGxpc3RgIGFuZCBgd2F0Y2hgXG4gICAqIHBlcm1pc3Npb25zIG9uIHRoZSBgTm9kZXNgIG9iamVjdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEjbm9kZVxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhKG9iajogU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdub2RlJzogb2JqLm5vZGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBFbmRwb2ludCBkZWZpbmVzIGFuIGVuZHBvaW50IHNlcnZpbmcgUHJvbWV0aGV1cyBtZXRyaWNzIHRvIGJlIHNjcmFwZWQgYnlcbiAqIFByb21ldGhldXMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMge1xuICAvKipcbiAgICogYXV0aG9yaXphdGlvbiBjb25maWd1cmVzIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjcmVkZW50aWFscyB0byB1c2Ugd2hlblxuICAgKiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiBDYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMgYGJhc2ljQXV0aGAsIG9yIGBvYXV0aDJgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNhdXRob3JpemF0aW9uXG4gICAqL1xuICByZWFkb25seSBhdXRob3JpemF0aW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbjtcblxuICAvKipcbiAgICogYmFzaWNBdXRoIGRlZmluZXMgdGhlIEJhc2ljIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZSB3aGVuXG4gICAqIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBvYXV0aDJgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNiYXNpY0F1dGhcbiAgICovXG4gIHJlYWRvbmx5IGJhc2ljQXV0aD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aDtcblxuICAvKipcbiAgICogYmVhcmVyVG9rZW5GaWxlIGRlZmluZXMgdGhlIGZpbGUgdG8gcmVhZCBiZWFyZXIgdG9rZW4gZm9yIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIERlcHJlY2F0ZWQ6IHVzZSBgYXV0aG9yaXphdGlvbmAgaW5zdGVhZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjYmVhcmVyVG9rZW5GaWxlXG4gICAqL1xuICByZWFkb25seSBiZWFyZXJUb2tlbkZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGJlYXJlclRva2VuU2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgYmVhcmVyXG4gICAqIHRva2VuIGZvciBzY3JhcGluZyB0YXJnZXRzLiBUaGUgc2VjcmV0IG5lZWRzIHRvIGJlIGluIHRoZSBzYW1lIG5hbWVzcGFjZVxuICAgKiBhcyB0aGUgU2VydmljZU1vbml0b3Igb2JqZWN0IGFuZCByZWFkYWJsZSBieSB0aGUgUHJvbWV0aGV1cyBPcGVyYXRvci5cbiAgICpcbiAgICogRGVwcmVjYXRlZDogdXNlIGBhdXRob3JpemF0aW9uYCBpbnN0ZWFkLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNiZWFyZXJUb2tlblNlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgYmVhcmVyVG9rZW5TZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldDtcblxuICAvKipcbiAgICogZW5hYmxlSHR0cDIgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBIVFRQMiB3aGVuIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI2VuYWJsZUh0dHAyXG4gICAqL1xuICByZWFkb25seSBlbmFibGVIdHRwMj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGZpbHRlclJ1bm5pbmcgd2hlbiB0cnVlLCB0aGUgcG9kcyB3aGljaCBhcmUgbm90IHJ1bm5pbmcgKGUuZy4gZWl0aGVyIGluIEZhaWxlZCBvclxuICAgKiBTdWNjZWVkZWQgc3RhdGUpIGFyZSBkcm9wcGVkIGR1cmluZyB0aGUgdGFyZ2V0IGRpc2NvdmVyeS5cbiAgICpcbiAgICogSWYgdW5zZXQsIHRoZSBmaWx0ZXJpbmcgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy93b3JrbG9hZHMvcG9kcy9wb2QtbGlmZWN5Y2xlLyNwb2QtcGhhc2VcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjZmlsdGVyUnVubmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyUnVubmluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGZvbGxvd1JlZGlyZWN0cyBkZWZpbmVzIHdoZXRoZXIgdGhlIHNjcmFwZSByZXF1ZXN0cyBzaG91bGQgZm9sbG93IEhUVFBcbiAgICogM3h4IHJlZGlyZWN0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjZm9sbG93UmVkaXJlY3RzXG4gICAqL1xuICByZWFkb25seSBmb2xsb3dSZWRpcmVjdHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBob25vckxhYmVscyBkZWZpbmVzIHdoZW4gdHJ1ZSB0aGUgbWV0cmljJ3MgbGFiZWxzIHdoZW4gdGhleSBjb2xsaWRlXG4gICAqIHdpdGggdGhlIHRhcmdldCdzIGxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjaG9ub3JMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IGhvbm9yTGFiZWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogaG9ub3JUaW1lc3RhbXBzIGRlZmluZXMgd2hldGhlciBQcm9tZXRoZXVzIHByZXNlcnZlcyB0aGUgdGltZXN0YW1wc1xuICAgKiB3aGVuIGV4cG9zZWQgYnkgdGhlIHRhcmdldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjaG9ub3JUaW1lc3RhbXBzXG4gICAqL1xuICByZWFkb25seSBob25vclRpbWVzdGFtcHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBpbnRlcnZhbCBhdCB3aGljaCBQcm9tZXRoZXVzIHNjcmFwZXMgdGhlIG1ldHJpY3MgZnJvbSB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBnbG9iYWwgc2NyYXBlIGludGVydmFsLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1ldHJpY1JlbGFiZWxpbmdzIGRlZmluZXMgdGhlIHJlbGFiZWxpbmcgcnVsZXMgdG8gYXBwbHkgdG8gdGhlXG4gICAqIHNhbXBsZXMgYmVmb3JlIGluZ2VzdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjbWV0cmljUmVsYWJlbGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IG1ldHJpY1JlbGFiZWxpbmdzPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NbXTtcblxuICAvKipcbiAgICogbm9Qcm94eSBkZWZpbmVzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyB0aGF0IGNhbiBjb250YWluIElQcywgQ0lEUiBub3RhdGlvbiwgZG9tYWluIG5hbWVzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gcHJveHlpbmcuIElQIGFuZCBkb21haW4gbmFtZXMgY2FuXG4gICAqIGNvbnRhaW4gcG9ydCBudW1iZXJzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNub1Byb3h5XG4gICAqL1xuICByZWFkb25seSBub1Byb3h5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvYXV0aDIgZGVmaW5lcyB0aGUgT0F1dGgyIHNldHRpbmdzIHRvIHVzZSB3aGVuIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gMi4yNy4wLlxuICAgKlxuICAgKiBDYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMgYGF1dGhvcml6YXRpb25gLCBvciBgYmFzaWNBdXRoYC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjb2F1dGgyXG4gICAqL1xuICByZWFkb25seSBvYXV0aDI/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDI7XG5cbiAgLyoqXG4gICAqIHBhcmFtcyBkZWZpbmUgb3B0aW9uYWwgSFRUUCBVUkwgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcGFyYW1zXG4gICAqL1xuICByZWFkb25seSBwYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH07XG5cbiAgLyoqXG4gICAqIHBhdGggZGVmaW5lcyB0aGUgSFRUUCBwYXRoIGZyb20gd2hpY2ggdG8gc2NyYXBlIGZvciBtZXRyaWNzLlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBkZWZhdWx0IHZhbHVlIChlLmcuIGAvbWV0cmljc2ApLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNwYXRoXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBwb3J0IGRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIFNlcnZpY2UgcG9ydCB3aGljaCB0aGlzIGVuZHBvaW50IHJlZmVycyB0by5cbiAgICpcbiAgICogSXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGB0YXJnZXRQb3J0YC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcG9ydFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IHN0cmluZztcblxuICAvKipcbiAgICogcHJveHlDb25uZWN0SGVhZGVyIG9wdGlvbmFsbHkgc3BlY2lmaWVzIGhlYWRlcnMgdG8gc2VuZCB0b1xuICAgKiBwcm94aWVzIGR1cmluZyBDT05ORUNUIHJlcXVlc3RzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNwcm94eUNvbm5lY3RIZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5Q29ubmVjdEhlYWRlcj86IHsgW2tleTogc3RyaW5nXTogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyW10gfTtcblxuICAvKipcbiAgICogcHJveHlGcm9tRW52aXJvbm1lbnQgZGVmaW5lcyB3aGV0aGVyIHRvIHVzZSB0aGUgcHJveHkgY29uZmlndXJhdGlvbiBkZWZpbmVkIGJ5IGVudmlyb25tZW50IHZhcmlhYmxlcyAoSFRUUF9QUk9YWSwgSFRUUFNfUFJPWFksIGFuZCBOT19QUk9YWSkuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDMuMCwgQWxlcnRtYW5hZ2VyID49IHYwLjI1LjAgb3IgVGhhbm9zID49IHYwLjMyLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI3Byb3h5RnJvbUVudmlyb25tZW50XG4gICAqL1xuICByZWFkb25seSBwcm94eUZyb21FbnZpcm9ubWVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHByb3h5VXJsIGRlZmluZXMgdGhlIEhUVFAgcHJveHkgc2VydmVyIHRvIHVzZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcHJveHlVcmxcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5VXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZWxhYmVsaW5ncyBkZWZpbmVzIHRoZSByZWxhYmVsaW5nIHJ1bGVzIHRvIGFwcGx5IHRoZSB0YXJnZXQnc1xuICAgKiBtZXRhZGF0YSBsYWJlbHMuXG4gICAqXG4gICAqIFRoZSBPcGVyYXRvciBhdXRvbWF0aWNhbGx5IGFkZHMgcmVsYWJlbGluZ3MgZm9yIGEgZmV3IHN0YW5kYXJkIEt1YmVybmV0ZXMgZmllbGRzLlxuICAgKlxuICAgKiBUaGUgb3JpZ2luYWwgc2NyYXBlIGpvYidzIG5hbWUgaXMgYXZhaWxhYmxlIHZpYSB0aGUgYF9fdG1wX3Byb21ldGhldXNfam9iX25hbWVgIGxhYmVsLlxuICAgKlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8vcHJvbWV0aGV1cy5pby9kb2NzL3Byb21ldGhldXMvbGF0ZXN0L2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi8jcmVsYWJlbF9jb25maWdcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcmVsYWJlbGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IHJlbGFiZWxpbmdzPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3NbXTtcblxuICAvKipcbiAgICogc2NoZW1lIGRlZmluZXMgdGhlIEhUVFAgc2NoZW1lIHRvIHVzZSB3aGVuIHNjcmFwaW5nIHRoZSBtZXRyaWNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNzY2hlbWVcbiAgICovXG4gIHJlYWRvbmx5IHNjaGVtZT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1NjaGVtZTtcblxuICAvKipcbiAgICogc2NyYXBlVGltZW91dCBkZWZpbmVzIHRoZSB0aW1lb3V0IGFmdGVyIHdoaWNoIFByb21ldGhldXMgY29uc2lkZXJzIHRoZSBzY3JhcGUgdG8gYmUgZmFpbGVkLlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBnbG9iYWwgc2NyYXBlIHRpbWVvdXQgdW5sZXNzIGl0IGlzIGxlc3NcbiAgICogdGhhbiB0aGUgdGFyZ2V0J3Mgc2NyYXBlIGludGVydmFsIHZhbHVlIGluIHdoaWNoIHRoZSBsYXR0ZXIgaXMgdXNlZC5cbiAgICogVGhlIHZhbHVlIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIHNjcmFwZSBpbnRlcnZhbCBvdGhlcndpc2UgdGhlIG9wZXJhdG9yIHdpbGwgcmVqZWN0IHRoZSByZXNvdXJjZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjc2NyYXBlVGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlVGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogdGFyZ2V0UG9ydCBkZWZpbmVzIHRoZSBuYW1lIG9yIG51bWJlciBvZiB0aGUgdGFyZ2V0IHBvcnQgb2YgdGhlIGBQb2RgIG9iamVjdCBiZWhpbmQgdGhlXG4gICAqIFNlcnZpY2UuIFRoZSBwb3J0IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggdGhlIGNvbnRhaW5lcidzIHBvcnQgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI3RhcmdldFBvcnRcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBvcnQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0O1xuXG4gIC8qKlxuICAgKiB0bHNDb25maWcgZGVmaW5lcyB0aGUgVExTIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc2NyYXBpbmcgdGhlIHRhcmdldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjdGxzQ29uZmlnXG4gICAqL1xuICByZWFkb25seSB0bHNDb25maWc/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWc7XG5cbiAgLyoqXG4gICAqIHRyYWNrVGltZXN0YW1wc1N0YWxlbmVzcyBkZWZpbmVzIHdoZXRoZXIgUHJvbWV0aGV1cyB0cmFja3Mgc3RhbGVuZXNzIG9mXG4gICAqIHRoZSBtZXRyaWNzIHRoYXQgaGF2ZSBhbiBleHBsaWNpdCB0aW1lc3RhbXAgcHJlc2VudCBpbiBzY3JhcGVkIGRhdGEuXG4gICAqIEhhcyBubyBlZmZlY3QgaWYgYGhvbm9yVGltZXN0YW1wc2AgaXMgZmFsc2UuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDguMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjdHJhY2tUaW1lc3RhbXBzU3RhbGVuZXNzXG4gICAqL1xuICByZWFkb25seSB0cmFja1RpbWVzdGFtcHNTdGFsZW5lc3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXV0aG9yaXphdGlvbic6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uKG9iai5hdXRob3JpemF0aW9uKSxcbiAgICAnYmFzaWNBdXRoJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aChvYmouYmFzaWNBdXRoKSxcbiAgICAnYmVhcmVyVG9rZW5GaWxlJzogb2JqLmJlYXJlclRva2VuRmlsZSxcbiAgICAnYmVhcmVyVG9rZW5TZWNyZXQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQob2JqLmJlYXJlclRva2VuU2VjcmV0KSxcbiAgICAnZW5hYmxlSHR0cDInOiBvYmouZW5hYmxlSHR0cDIsXG4gICAgJ2ZpbHRlclJ1bm5pbmcnOiBvYmouZmlsdGVyUnVubmluZyxcbiAgICAnZm9sbG93UmVkaXJlY3RzJzogb2JqLmZvbGxvd1JlZGlyZWN0cyxcbiAgICAnaG9ub3JMYWJlbHMnOiBvYmouaG9ub3JMYWJlbHMsXG4gICAgJ2hvbm9yVGltZXN0YW1wcyc6IG9iai5ob25vclRpbWVzdGFtcHMsXG4gICAgJ2ludGVydmFsJzogb2JqLmludGVydmFsLFxuICAgICdtZXRyaWNSZWxhYmVsaW5ncyc6IG9iai5tZXRyaWNSZWxhYmVsaW5ncz8ubWFwKHkgPT4gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzKHkpKSxcbiAgICAnbm9Qcm94eSc6IG9iai5ub1Byb3h5LFxuICAgICdvYXV0aDInOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyKG9iai5vYXV0aDIpLFxuICAgICdwYXJhbXMnOiAoKG9iai5wYXJhbXMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5wYXJhbXMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy5tYXAoeSA9PiB5KSB9KSwge30pKSxcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICAgICdwb3J0Jzogb2JqLnBvcnQsXG4gICAgJ3Byb3h5Q29ubmVjdEhlYWRlcic6ICgob2JqLnByb3h5Q29ubmVjdEhlYWRlcikgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnByb3h5Q29ubmVjdEhlYWRlcikucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/Lm1hcCh5ID0+IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIoeSkpIH0pLCB7fSkpLFxuICAgICdwcm94eUZyb21FbnZpcm9ubWVudCc6IG9iai5wcm94eUZyb21FbnZpcm9ubWVudCxcbiAgICAncHJveHlVcmwnOiBvYmoucHJveHlVcmwsXG4gICAgJ3JlbGFiZWxpbmdzJzogb2JqLnJlbGFiZWxpbmdzPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3MoeSkpLFxuICAgICdzY2hlbWUnOiBvYmouc2NoZW1lLFxuICAgICdzY3JhcGVUaW1lb3V0Jzogb2JqLnNjcmFwZVRpbWVvdXQsXG4gICAgJ3RhcmdldFBvcnQnOiBvYmoudGFyZ2V0UG9ydD8udmFsdWUsXG4gICAgJ3Rsc0NvbmZpZyc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcob2JqLnRsc0NvbmZpZyksXG4gICAgJ3RyYWNrVGltZXN0YW1wc1N0YWxlbmVzcyc6IG9iai50cmFja1RpbWVzdGFtcHNTdGFsZW5lc3MsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBmYWxsYmFja1NjcmFwZVByb3RvY29sIGRlZmluZXMgdGhlIHByb3RvY29sIHRvIHVzZSBpZiBhIHNjcmFwZSByZXR1cm5zIGJsYW5rLCB1bnBhcnNlYWJsZSwgb3Igb3RoZXJ3aXNlIGludmFsaWQgQ29udGVudC1UeXBlLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjMuMC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRmFsbGJhY2tTY3JhcGVQcm90b2NvbFxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNGYWxsYmFja1NjcmFwZVByb3RvY29sIHtcbiAgLyoqIFByb21ldGhldXNQcm90byAqL1xuICBQUk9NRVRIRVVTX1BST1RPID0gXCJQcm9tZXRoZXVzUHJvdG9cIixcbiAgLyoqIE9wZW5NZXRyaWNzVGV4dDAuMC4xICovXG4gIE9QRU5fTUVUUklDU19URVhUMF8wXzEgPSBcIk9wZW5NZXRyaWNzVGV4dDAuMC4xXCIsXG4gIC8qKiBPcGVuTWV0cmljc1RleHQxLjAuMCAqL1xuICBPUEVOX01FVFJJQ1NfVEVYVDFfMF8wID0gXCJPcGVuTWV0cmljc1RleHQxLjAuMFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQwLjAuNCAqL1xuICBQUk9NRVRIRVVTX1RFWFQwXzBfNCA9IFwiUHJvbWV0aGV1c1RleHQwLjAuNFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQxLjAuMCAqL1xuICBQUk9NRVRIRVVTX1RFWFQxXzBfMCA9IFwiUHJvbWV0aGV1c1RleHQxLjAuMFwiLFxufVxuXG4vKipcbiAqIG5hbWVzcGFjZVNlbGVjdG9yIGRlZmluZXMgaW4gd2hpY2ggbmFtZXNwYWNlKHMpIFByb21ldGhldXMgc2hvdWxkIGRpc2NvdmVyIHRoZSBzZXJ2aWNlcy5cbiAqIEJ5IGRlZmF1bHQsIHRoZSBzZXJ2aWNlcyBhcmUgZGlzY292ZXJlZCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGBTZXJ2aWNlTW9uaXRvcmAgb2JqZWN0IGJ1dCBpdCBpcyBwb3NzaWJsZSB0byBzZWxlY3QgcG9kcyBhY3Jvc3MgZGlmZmVyZW50L2FsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNOYW1lc3BhY2VTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBhbnkgZGVmaW5lcyB0aGUgYm9vbGVhbiBkZXNjcmliaW5nIHdoZXRoZXIgYWxsIG5hbWVzcGFjZXMgYXJlIHNlbGVjdGVkIGluIGNvbnRyYXN0IHRvIGFcbiAgICogbGlzdCByZXN0cmljdGluZyB0aGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yI2FueVxuICAgKi9cbiAgcmVhZG9ubHkgYW55PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogbWF0Y2hOYW1lcyBkZWZpbmVzIHRoZSBsaXN0IG9mIG5hbWVzcGFjZSBuYW1lcyB0byBzZWxlY3QgZnJvbS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNOYW1lc3BhY2VTZWxlY3RvciNtYXRjaE5hbWVzXG4gICAqL1xuICByZWFkb25seSBtYXRjaE5hbWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yKG9iajogU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbnknOiBvYmouYW55LFxuICAgICdtYXRjaE5hbWVzJzogb2JqLm1hdGNoTmFtZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogbmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIGRlZmluZXMgaWYgdGhlIGdyb3d0aCBmYWN0b3Igb2Ygb25lIGJ1Y2tldCB0byB0aGUgbmV4dCBpcyBzbWFsbGVyIHRoYW4gdGhpcyxcbiAqIGJ1Y2tldHMgd2lsbCBiZSBtZXJnZWQgdG8gaW5jcmVhc2UgdGhlIGZhY3RvciBzdWZmaWNpZW50bHkuXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjUwLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNOYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3RvciB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogU2VydmljZU1vbml0b3JTcGVjTmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIHtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcih2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBTZXJ2aWNlTW9uaXRvclNwZWNOYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3Ige1xuICAgIHJldHVybiBuZXcgU2VydmljZU1vbml0b3JTcGVjTmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiBTY3JhcGVQcm90b2NvbCByZXByZXNlbnRzIGEgcHJvdG9jb2wgdXNlZCBieSBQcm9tZXRoZXVzIGZvciBzY3JhcGluZyBtZXRyaWNzLlxuICogU3VwcG9ydGVkIHZhbHVlcyBhcmU6XG4gKiAqIGBPcGVuTWV0cmljc1RleHQwLjAuMWBcbiAqICogYE9wZW5NZXRyaWNzVGV4dDEuMC4wYFxuICogKiBgUHJvbWV0aGV1c1Byb3RvYFxuICogKiBgUHJvbWV0aGV1c1RleHQwLjAuNGBcbiAqICogYFByb21ldGhldXNUZXh0MS4wLjBgXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTY3JhcGVQcm90b2NvbHNcbiAqL1xuZXhwb3J0IGVudW0gU2VydmljZU1vbml0b3JTcGVjU2NyYXBlUHJvdG9jb2xzIHtcbiAgLyoqIFByb21ldGhldXNQcm90byAqL1xuICBQUk9NRVRIRVVTX1BST1RPID0gXCJQcm9tZXRoZXVzUHJvdG9cIixcbiAgLyoqIE9wZW5NZXRyaWNzVGV4dDAuMC4xICovXG4gIE9QRU5fTUVUUklDU19URVhUMF8wXzEgPSBcIk9wZW5NZXRyaWNzVGV4dDAuMC4xXCIsXG4gIC8qKiBPcGVuTWV0cmljc1RleHQxLjAuMCAqL1xuICBPUEVOX01FVFJJQ1NfVEVYVDFfMF8wID0gXCJPcGVuTWV0cmljc1RleHQxLjAuMFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQwLjAuNCAqL1xuICBQUk9NRVRIRVVTX1RFWFQwXzBfNCA9IFwiUHJvbWV0aGV1c1RleHQwLjAuNFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQxLjAuMCAqL1xuICBQUk9NRVRIRVVTX1RFWFQxXzBfMCA9IFwiUHJvbWV0aGV1c1RleHQxLjAuMFwiLFxufVxuXG4vKipcbiAqIHNlbGVjdG9yIGRlZmluZXMgdGhlIGxhYmVsIHNlbGVjdG9yIHRvIHNlbGVjdCB0aGUgS3ViZXJuZXRlcyBgRW5kcG9pbnRzYCBvYmplY3RzIHRvIHNjcmFwZSBtZXRyaWNzIGZyb20uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvcihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlbGVjdG9yTWVjaGFuaXNtIGRlZmluZXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHNlbGVjdCB0aGUgZW5kcG9pbnRzIHRvIHNjcmFwZS5cbiAqIEJ5IGRlZmF1bHQsIHRoZSBzZWxlY3Rpb24gcHJvY2VzcyByZWxpZXMgb24gcmVsYWJlbCBjb25maWd1cmF0aW9ucyB0byBmaWx0ZXIgdGhlIGRpc2NvdmVyZWQgdGFyZ2V0cy5cbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gb3B0IGluIGZvciByb2xlIHNlbGVjdG9ycywgd2hpY2ggbWF5IG9mZmVyIGJldHRlciBlZmZpY2llbmN5IGluIGxhcmdlIGNsdXN0ZXJzLlxuICogV2hpY2ggc3RyYXRlZ3kgaXMgYmVzdCBmb3IgeW91ciB1c2UgY2FzZSBuZWVkcyB0byBiZSBjYXJlZnVsbHkgZXZhbHVhdGVkLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMTcuMC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtIHtcbiAgLyoqIFJlbGFiZWxDb25maWcgKi9cbiAgUkVMQUJFTF9DT05GSUcgPSBcIlJlbGFiZWxDb25maWdcIixcbiAgLyoqIFJvbGVTZWxlY3RvciAqL1xuICBST0xFX1NFTEVDVE9SID0gXCJSb2xlU2VsZWN0b3JcIixcbn1cblxuLyoqXG4gKiBzZXJ2aWNlRGlzY292ZXJ5Um9sZSBkZWZpbmVzIHRoZSBzZXJ2aWNlIGRpc2NvdmVyeSByb2xlIHVzZWQgdG8gZGlzY292ZXIgdGFyZ2V0cy5cbiAqXG4gKiBJZiBzZXQsIHRoZSB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIFwiRW5kcG9pbnRzXCIgb3IgXCJFbmRwb2ludFNsaWNlXCIuXG4gKiBPdGhlcndpc2UgaXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIGRlZmluZWQgaW4gdGhlXG4gKiBQcm9tZXRoZXVzL1Byb21ldGhldXNBZ2VudCByZXNvdXJjZS5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlcnZpY2VEaXNjb3ZlcnlSb2xlXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY1NlcnZpY2VEaXNjb3ZlcnlSb2xlIHtcbiAgLyoqIEVuZHBvaW50cyAqL1xuICBFTkRQT0lOVFMgPSBcIkVuZHBvaW50c1wiLFxuICAvKiogRW5kcG9pbnRTbGljZSAqL1xuICBFTkRQT0lOVF9TTElDRSA9IFwiRW5kcG9pbnRTbGljZVwiLFxufVxuXG4vKipcbiAqIGF1dGhvcml6YXRpb24gY29uZmlndXJlcyB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgY3JlZGVudGlhbHMgdG8gdXNlIHdoZW5cbiAqIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gKlxuICogQ2Fubm90IGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lIGFzIGBiYXNpY0F1dGhgLCBvciBgb2F1dGgyYC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uIHtcbiAgLyoqXG4gICAqIGNyZWRlbnRpYWxzIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgaW4gdGhlIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIHRoZSBjcmVkZW50aWFscyBmb3IgYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbiNjcmVkZW50aWFsc1xuICAgKi9cbiAgcmVhZG9ubHkgY3JlZGVudGlhbHM/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHM7XG5cbiAgLyoqXG4gICAqIHR5cGUgZGVmaW5lcyB0aGUgYXV0aGVudGljYXRpb24gdHlwZS4gVGhlIHZhbHVlIGlzIGNhc2UtaW5zZW5zaXRpdmUuXG4gICAqXG4gICAqIFwiQmFzaWNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUuXG4gICAqXG4gICAqIERlZmF1bHQ6IFwiQmVhcmVyXCJcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjcmVkZW50aWFscyc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMob2JqLmNyZWRlbnRpYWxzKSxcbiAgICAndHlwZSc6IG9iai50eXBlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYmFzaWNBdXRoIGRlZmluZXMgdGhlIEJhc2ljIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZSB3aGVuXG4gKiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICpcbiAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBvYXV0aDJgLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoIHtcbiAgLyoqXG4gICAqIHBhc3N3b3JkIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgcGFzc3dvcmQgZm9yXG4gICAqIGF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aCNwYXNzd29yZFxuICAgKi9cbiAgcmVhZG9ubHkgcGFzc3dvcmQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZDtcblxuICAvKipcbiAgICogdXNlcm5hbWUgZGVmaW5lcyBhIGtleSBvZiBhIFNlY3JldCBjb250YWluaW5nIHRoZSB1c2VybmFtZSBmb3JcbiAgICogYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoI3VzZXJuYW1lXG4gICAqL1xuICByZWFkb25seSB1c2VybmFtZT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGgnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncGFzc3dvcmQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQob2JqLnBhc3N3b3JkKSxcbiAgICAndXNlcm5hbWUnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUob2JqLnVzZXJuYW1lKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGJlYXJlclRva2VuU2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgYmVhcmVyXG4gKiB0b2tlbiBmb3Igc2NyYXBpbmcgdGFyZ2V0cy4gVGhlIHNlY3JldCBuZWVkcyB0byBiZSBpbiB0aGUgc2FtZSBuYW1lc3BhY2VcbiAqIGFzIHRoZSBTZXJ2aWNlTW9uaXRvciBvYmplY3QgYW5kIHJlYWRhYmxlIGJ5IHRoZSBQcm9tZXRoZXVzIE9wZXJhdG9yLlxuICpcbiAqIERlcHJlY2F0ZWQ6IHVzZSBgYXV0aG9yaXphdGlvbmAgaW5zdGVhZC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0JlYXJlclRva2VuU2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0JlYXJlclRva2VuU2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlbGFiZWxDb25maWcgYWxsb3dzIGR5bmFtaWMgcmV3cml0aW5nIG9mIHRoZSBsYWJlbCBzZXQgZm9yIHRhcmdldHMsIGFsZXJ0cyxcbiAqIHNjcmFwZWQgc2FtcGxlcyBhbmQgcmVtb3RlIHdyaXRlIHNhbXBsZXMuXG4gKlxuICogTW9yZSBpbmZvOiBodHRwczovL3Byb21ldGhldXMuaW8vZG9jcy9wcm9tZXRoZXVzL2xhdGVzdC9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24vI3JlbGFiZWxfY29uZmlnXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzIHtcbiAgLyoqXG4gICAqIGFjdGlvbiB0byBwZXJmb3JtIGJhc2VkIG9uIHRoZSByZWdleCBtYXRjaGluZy5cbiAgICpcbiAgICogYFVwcGVyY2FzZWAgYW5kIGBMb3dlcmNhc2VgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjM2LjAuXG4gICAqIGBEcm9wRXF1YWxgIGFuZCBgS2VlcEVxdWFsYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi40MS4wLlxuICAgKlxuICAgKiBEZWZhdWx0OiBcIlJlcGxhY2VcIlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI2FjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb247XG5cbiAgLyoqXG4gICAqIG1vZHVsdXMgdG8gdGFrZSBvZiB0aGUgaGFzaCBvZiB0aGUgc291cmNlIGxhYmVsIHZhbHVlcy5cbiAgICpcbiAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gdGhlIGFjdGlvbiBpcyBgSGFzaE1vZGAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MjbW9kdWx1c1xuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWx1cz86IG51bWJlcjtcblxuICAvKipcbiAgICogcmVnZXggZGVmaW5lcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGFnYWluc3Qgd2hpY2ggdGhlIGV4dHJhY3RlZCB2YWx1ZSBpcyBtYXRjaGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI3JlZ2V4XG4gICAqL1xuICByZWFkb25seSByZWdleD86IHN0cmluZztcblxuICAvKipcbiAgICogcmVwbGFjZW1lbnQgdmFsdWUgYWdhaW5zdCB3aGljaCBhIFJlcGxhY2UgYWN0aW9uIGlzIHBlcmZvcm1lZCBpZiB0aGVcbiAgICogcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXMuXG4gICAqXG4gICAqIFJlZ2V4IGNhcHR1cmUgZ3JvdXBzIGFyZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MjcmVwbGFjZW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxhY2VtZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBzZXBhcmF0b3IgZGVmaW5lcyB0aGUgc3RyaW5nIGJldHdlZW4gY29uY2F0ZW5hdGVkIFNvdXJjZUxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5ncyNzZXBhcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IHNlcGFyYXRvcj86IHN0cmluZztcblxuICAvKipcbiAgICogc291cmNlTGFiZWxzIGRlZmluZXMgdGhlIHNvdXJjZSBsYWJlbHMgc2VsZWN0IHZhbHVlcyBmcm9tIGV4aXN0aW5nIGxhYmVscy4gVGhlaXIgY29udGVudCBpc1xuICAgKiBjb25jYXRlbmF0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgU2VwYXJhdG9yIGFuZCBtYXRjaGVkIGFnYWluc3QgdGhlXG4gICAqIGNvbmZpZ3VyZWQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI3NvdXJjZUxhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTGFiZWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIHRhcmdldExhYmVsIGRlZmluZXMgdGhlIGxhYmVsIHRvIHdoaWNoIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIHdyaXR0ZW4gaW4gYSByZXBsYWNlbWVudC5cbiAgICpcbiAgICogSXQgaXMgbWFuZGF0b3J5IGZvciBgUmVwbGFjZWAsIGBIYXNoTW9kYCwgYExvd2VyY2FzZWAsIGBVcHBlcmNhc2VgLFxuICAgKiBgS2VlcEVxdWFsYCBhbmQgYERyb3BFcXVhbGAgYWN0aW9ucy5cbiAgICpcbiAgICogUmVnZXggY2FwdHVyZSBncm91cHMgYXJlIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5ncyN0YXJnZXRMYWJlbFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0TGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhY3Rpb24nOiBvYmouYWN0aW9uLFxuICAgICdtb2R1bHVzJzogb2JqLm1vZHVsdXMsXG4gICAgJ3JlZ2V4Jzogb2JqLnJlZ2V4LFxuICAgICdyZXBsYWNlbWVudCc6IG9iai5yZXBsYWNlbWVudCxcbiAgICAnc2VwYXJhdG9yJzogb2JqLnNlcGFyYXRvcixcbiAgICAnc291cmNlTGFiZWxzJzogb2JqLnNvdXJjZUxhYmVscz8ubWFwKHkgPT4geSksXG4gICAgJ3RhcmdldExhYmVsJzogb2JqLnRhcmdldExhYmVsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogb2F1dGgyIGRlZmluZXMgdGhlIE9BdXRoMiBzZXR0aW5ncyB0byB1c2Ugd2hlbiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gMi4yNy4wLlxuICpcbiAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBiYXNpY0F1dGhgLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyIHtcbiAgLyoqXG4gICAqIGNsaWVudElkIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgb3IgQ29uZmlnTWFwIGNvbnRhaW5pbmcgdGhlXG4gICAqIE9BdXRoMiBjbGllbnQncyBJRC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjY2xpZW50SWRcbiAgICovXG4gIHJlYWRvbmx5IGNsaWVudElkOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZDtcblxuICAvKipcbiAgICogY2xpZW50U2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgT0F1dGgyXG4gICAqIGNsaWVudCdzIHNlY3JldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjY2xpZW50U2VjcmV0XG4gICAqL1xuICByZWFkb25seSBjbGllbnRTZWNyZXQ6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldDtcblxuICAvKipcbiAgICogZW5kcG9pbnRQYXJhbXMgY29uZmlndXJlcyB0aGUgSFRUUCBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byB0aGUgdG9rZW5cbiAgICogVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMiNlbmRwb2ludFBhcmFtc1xuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRQYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBub1Byb3h5IGRlZmluZXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIHRoYXQgY2FuIGNvbnRhaW4gSVBzLCBDSURSIG5vdGF0aW9uLCBkb21haW4gbmFtZXNcbiAgICogdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBwcm94eWluZy4gSVAgYW5kIGRvbWFpbiBuYW1lcyBjYW5cbiAgICogY29udGFpbiBwb3J0IG51bWJlcnMuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDMuMCwgQWxlcnRtYW5hZ2VyID49IHYwLjI1LjAgb3IgVGhhbm9zID49IHYwLjMyLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI25vUHJveHlcbiAgICovXG4gIHJlYWRvbmx5IG5vUHJveHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHByb3h5Q29ubmVjdEhlYWRlciBvcHRpb25hbGx5IHNwZWNpZmllcyBoZWFkZXJzIHRvIHNlbmQgdG9cbiAgICogcHJveGllcyBkdXJpbmcgQ09OTkVDVCByZXF1ZXN0cy5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi40My4wLCBBbGVydG1hbmFnZXIgPj0gdjAuMjUuMCBvciBUaGFub3MgPj0gdjAuMzIuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjcHJveHlDb25uZWN0SGVhZGVyXG4gICAqL1xuICByZWFkb25seSBwcm94eUNvbm5lY3RIZWFkZXI/OiB7IFtrZXk6IHN0cmluZ106IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlcltdIH07XG5cbiAgLyoqXG4gICAqIHByb3h5RnJvbUVudmlyb25tZW50IGRlZmluZXMgd2hldGhlciB0byB1c2UgdGhlIHByb3h5IGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBieSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKEhUVFBfUFJPWFksIEhUVFBTX1BST1hZLCBhbmQgTk9fUFJPWFkpLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMiNwcm94eUZyb21FbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlGcm9tRW52aXJvbm1lbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBwcm94eVVybCBkZWZpbmVzIHRoZSBIVFRQIHByb3h5IHNlcnZlciB0byB1c2UuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Byb3h5VXJsXG4gICAqL1xuICByZWFkb25seSBwcm94eVVybD86IHN0cmluZztcblxuICAvKipcbiAgICogc2NvcGVzIGRlZmluZXMgdGhlIE9BdXRoMiBzY29wZXMgdXNlZCBmb3IgdGhlIHRva2VuIHJlcXVlc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Njb3Blc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIHRsc0NvbmZpZyBkZWZpbmVzIHRoZSBUTFMgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBPQXV0aDIgc2VydmVyLlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Rsc0NvbmZpZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGxzQ29uZmlnPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnO1xuXG4gIC8qKlxuICAgKiB0b2tlblVybCBkZWZpbmVzIHRoZSBVUkwgdG8gZmV0Y2ggdGhlIHRva2VuIGZyb20uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Rva2VuVXJsXG4gICAqL1xuICByZWFkb25seSB0b2tlblVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2xpZW50SWQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQob2JqLmNsaWVudElkKSxcbiAgICAnY2xpZW50U2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldChvYmouY2xpZW50U2VjcmV0KSxcbiAgICAnZW5kcG9pbnRQYXJhbXMnOiAoKG9iai5lbmRwb2ludFBhcmFtcykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmVuZHBvaW50UGFyYW1zKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbm9Qcm94eSc6IG9iai5ub1Byb3h5LFxuICAgICdwcm94eUNvbm5lY3RIZWFkZXInOiAoKG9iai5wcm94eUNvbm5lY3RIZWFkZXIpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5wcm94eUNvbm5lY3RIZWFkZXIpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyKHkpKSB9KSwge30pKSxcbiAgICAncHJveHlGcm9tRW52aXJvbm1lbnQnOiBvYmoucHJveHlGcm9tRW52aXJvbm1lbnQsXG4gICAgJ3Byb3h5VXJsJzogb2JqLnByb3h5VXJsLFxuICAgICdzY29wZXMnOiBvYmouc2NvcGVzPy5tYXAoeSA9PiB5KSxcbiAgICAndGxzQ29uZmlnJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyhvYmoudGxzQ29uZmlnKSxcbiAgICAndG9rZW5VcmwnOiBvYmoudG9rZW5VcmwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTZWNyZXRLZXlTZWxlY3RvciBzZWxlY3RzIGEga2V5IG9mIGEgU2VjcmV0LlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlciNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlcihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZWxhYmVsQ29uZmlnIGFsbG93cyBkeW5hbWljIHJld3JpdGluZyBvZiB0aGUgbGFiZWwgc2V0IGZvciB0YXJnZXRzLCBhbGVydHMsXG4gKiBzY3JhcGVkIHNhbXBsZXMgYW5kIHJlbW90ZSB3cml0ZSBzYW1wbGVzLlxuICpcbiAqIE1vcmUgaW5mbzogaHR0cHM6Ly9wcm9tZXRoZXVzLmlvL2RvY3MvcHJvbWV0aGV1cy9sYXRlc3QvY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLyNyZWxhYmVsX2NvbmZpZ1xuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyB7XG4gIC8qKlxuICAgKiBhY3Rpb24gdG8gcGVyZm9ybSBiYXNlZCBvbiB0aGUgcmVnZXggbWF0Y2hpbmcuXG4gICAqXG4gICAqIGBVcHBlcmNhc2VgIGFuZCBgTG93ZXJjYXNlYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi4zNi4wLlxuICAgKiBgRHJvcEVxdWFsYCBhbmQgYEtlZXBFcXVhbGAgYWN0aW9ucyByZXF1aXJlIFByb21ldGhldXMgPj0gdjIuNDEuMC5cbiAgICpcbiAgICogRGVmYXVsdDogXCJSZXBsYWNlXCJcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNhY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbj86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uO1xuXG4gIC8qKlxuICAgKiBtb2R1bHVzIHRvIHRha2Ugb2YgdGhlIGhhc2ggb2YgdGhlIHNvdXJjZSBsYWJlbCB2YWx1ZXMuXG4gICAqXG4gICAqIE9ubHkgYXBwbGljYWJsZSB3aGVuIHRoZSBhY3Rpb24gaXMgYEhhc2hNb2RgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzI21vZHVsdXNcbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsdXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHJlZ2V4IGRlZmluZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhZ2FpbnN0IHdoaWNoIHRoZSBleHRyYWN0ZWQgdmFsdWUgaXMgbWF0Y2hlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNyZWdleFxuICAgKi9cbiAgcmVhZG9ubHkgcmVnZXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHJlcGxhY2VtZW50IHZhbHVlIGFnYWluc3Qgd2hpY2ggYSBSZXBsYWNlIGFjdGlvbiBpcyBwZXJmb3JtZWQgaWYgdGhlXG4gICAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzLlxuICAgKlxuICAgKiBSZWdleCBjYXB0dXJlIGdyb3VwcyBhcmUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzI3JlcGxhY2VtZW50XG4gICAqL1xuICByZWFkb25seSByZXBsYWNlbWVudD86IHN0cmluZztcblxuICAvKipcbiAgICogc2VwYXJhdG9yIGRlZmluZXMgdGhlIHN0cmluZyBiZXR3ZWVuIGNvbmNhdGVuYXRlZCBTb3VyY2VMYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3Mjc2VwYXJhdG9yXG4gICAqL1xuICByZWFkb25seSBzZXBhcmF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNvdXJjZUxhYmVscyBkZWZpbmVzIHRoZSBzb3VyY2UgbGFiZWxzIHNlbGVjdCB2YWx1ZXMgZnJvbSBleGlzdGluZyBsYWJlbHMuIFRoZWlyIGNvbnRlbnQgaXNcbiAgICogY29uY2F0ZW5hdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkIFNlcGFyYXRvciBhbmQgbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBjb25maWd1cmVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNzb3VyY2VMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUxhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiB0YXJnZXRMYWJlbCBkZWZpbmVzIHRoZSBsYWJlbCB0byB3aGljaCB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyB3cml0dGVuIGluIGEgcmVwbGFjZW1lbnQuXG4gICAqXG4gICAqIEl0IGlzIG1hbmRhdG9yeSBmb3IgYFJlcGxhY2VgLCBgSGFzaE1vZGAsIGBMb3dlcmNhc2VgLCBgVXBwZXJjYXNlYCxcbiAgICogYEtlZXBFcXVhbGAgYW5kIGBEcm9wRXF1YWxgIGFjdGlvbnMuXG4gICAqXG4gICAqIFJlZ2V4IGNhcHR1cmUgZ3JvdXBzIGFyZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3MjdGFyZ2V0TGFiZWxcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldExhYmVsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyhvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWN0aW9uJzogb2JqLmFjdGlvbixcbiAgICAnbW9kdWx1cyc6IG9iai5tb2R1bHVzLFxuICAgICdyZWdleCc6IG9iai5yZWdleCxcbiAgICAncmVwbGFjZW1lbnQnOiBvYmoucmVwbGFjZW1lbnQsXG4gICAgJ3NlcGFyYXRvcic6IG9iai5zZXBhcmF0b3IsXG4gICAgJ3NvdXJjZUxhYmVscyc6IG9iai5zb3VyY2VMYWJlbHM/Lm1hcCh5ID0+IHkpLFxuICAgICd0YXJnZXRMYWJlbCc6IG9iai50YXJnZXRMYWJlbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNjaGVtZSBkZWZpbmVzIHRoZSBIVFRQIHNjaGVtZSB0byB1c2Ugd2hlbiBzY3JhcGluZyB0aGUgbWV0cmljcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1NjaGVtZVxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNTY2hlbWUge1xuICAvKiogaHR0cCAqL1xuICBIVFRQID0gXCJodHRwXCIsXG4gIC8qKiBodHRwcyAqL1xuICBIVFRQUyA9IFwiaHR0cHNcIixcbn1cblxuLyoqXG4gKiB0YXJnZXRQb3J0IGRlZmluZXMgdGhlIG5hbWUgb3IgbnVtYmVyIG9mIHRoZSB0YXJnZXQgcG9ydCBvZiB0aGUgYFBvZGAgb2JqZWN0IGJlaGluZCB0aGVcbiAqIFNlcnZpY2UuIFRoZSBwb3J0IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggdGhlIGNvbnRhaW5lcidzIHBvcnQgcHJvcGVydHkuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0IHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0IHtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1RhcmdldFBvcnQodmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGFyZ2V0UG9ydCB7XG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiB0bHNDb25maWcgZGVmaW5lcyB0aGUgVExTIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc2NyYXBpbmcgdGhlIHRhcmdldC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyB7XG4gIC8qKlxuICAgKiBjYSBkZWZpbmVzIHRoZSBDZXJ0aWZpY2F0ZSBhdXRob3JpdHkgdXNlZCB3aGVuIHZlcmlmeWluZyBzZXJ2ZXIgY2VydGlmaWNhdGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjYVxuICAgKi9cbiAgcmVhZG9ubHkgY2E/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYTtcblxuICAvKipcbiAgICogY2FGaWxlIGRlZmluZXMgdGhlIHBhdGggdG8gdGhlIENBIGNlcnQgaW4gdGhlIFByb21ldGhldXMgY29udGFpbmVyIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI2NhRmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBjZXJ0IGRlZmluZXMgdGhlIENsaWVudCBjZXJ0aWZpY2F0ZSB0byBwcmVzZW50IHdoZW4gZG9pbmcgY2xpZW50LWF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjZXJ0XG4gICAqL1xuICByZWFkb25seSBjZXJ0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydDtcblxuICAvKipcbiAgICogY2VydEZpbGUgZGVmaW5lcyB0aGUgcGF0aCB0byB0aGUgY2xpZW50IGNlcnQgZmlsZSBpbiB0aGUgUHJvbWV0aGV1cyBjb250YWluZXIgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjZXJ0RmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2VydEZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGluc2VjdXJlU2tpcFZlcmlmeSBkZWZpbmVzIGhvdyB0byBkaXNhYmxlIHRhcmdldCBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNpbnNlY3VyZVNraXBWZXJpZnlcbiAgICovXG4gIHJlYWRvbmx5IGluc2VjdXJlU2tpcFZlcmlmeT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGtleUZpbGUgZGVmaW5lcyB0aGUgcGF0aCB0byB0aGUgY2xpZW50IGtleSBmaWxlIGluIHRoZSBQcm9tZXRoZXVzIGNvbnRhaW5lciBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI2tleUZpbGVcbiAgICovXG4gIHJlYWRvbmx5IGtleUZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGtleVNlY3JldCBkZWZpbmVzIHRoZSBTZWNyZXQgY29udGFpbmluZyB0aGUgY2xpZW50IGtleSBmaWxlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcja2V5U2VjcmV0XG4gICAqL1xuICByZWFkb25seSBrZXlTZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIG1heFZlcnNpb24gZGVmaW5lcyB0aGUgbWF4aW11bSBhY2NlcHRhYmxlIFRMUyB2ZXJzaW9uLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI21heFZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1heFZlcnNpb24/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNYXhWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBtaW5WZXJzaW9uIGRlZmluZXMgdGhlIG1pbmltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNtaW5WZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBtaW5WZXJzaW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnTWluVmVyc2lvbjtcblxuICAvKipcbiAgICogc2VydmVyTmFtZSBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgaG9zdG5hbWUgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNzZXJ2ZXJOYW1lXG4gICAqL1xuICByZWFkb25seSBzZXJ2ZXJOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2EnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2Eob2JqLmNhKSxcbiAgICAnY2FGaWxlJzogb2JqLmNhRmlsZSxcbiAgICAnY2VydCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0KG9iai5jZXJ0KSxcbiAgICAnY2VydEZpbGUnOiBvYmouY2VydEZpbGUsXG4gICAgJ2luc2VjdXJlU2tpcFZlcmlmeSc6IG9iai5pbnNlY3VyZVNraXBWZXJpZnksXG4gICAgJ2tleUZpbGUnOiBvYmoua2V5RmlsZSxcbiAgICAna2V5U2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldChvYmoua2V5U2VjcmV0KSxcbiAgICAnbWF4VmVyc2lvbic6IG9iai5tYXhWZXJzaW9uLFxuICAgICdtaW5WZXJzaW9uJzogb2JqLm1pblZlcnNpb24sXG4gICAgJ3NlcnZlck5hbWUnOiBvYmouc2VydmVyTmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBjcmVkZW50aWFscyBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGluIHRoZSBuYW1lc3BhY2UgdGhhdCBjb250YWlucyB0aGUgY3JlZGVudGlhbHMgZm9yIGF1dGhlbnRpY2F0aW9uLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyhvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwYXNzd29yZCBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGNvbnRhaW5pbmcgdGhlIHBhc3N3b3JkIGZvclxuICogYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiB1c2VybmFtZSBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lIGZvclxuICogYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhVc2VybmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhVc2VybmFtZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBhY3Rpb24gdG8gcGVyZm9ybSBiYXNlZCBvbiB0aGUgcmVnZXggbWF0Y2hpbmcuXG4gKlxuICogYFVwcGVyY2FzZWAgYW5kIGBMb3dlcmNhc2VgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjM2LjAuXG4gKiBgRHJvcEVxdWFsYCBhbmQgYEtlZXBFcXVhbGAgYWN0aW9ucyByZXF1aXJlIFByb21ldGhldXMgPj0gdjIuNDEuMC5cbiAqXG4gKiBEZWZhdWx0OiBcIlJlcGxhY2VcIlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb25cbiAqL1xuZXhwb3J0IGVudW0gU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb24ge1xuICAvKiogcmVwbGFjZSAqL1xuICBSRVBMQUNFID0gXCJyZXBsYWNlXCIsXG4gIC8qKiBrZWVwICovXG4gIEtFRVAgPSBcImtlZXBcIixcbiAgLyoqIGRyb3AgKi9cbiAgRFJPUCA9IFwiZHJvcFwiLFxuICAvKiogaGFzaG1vZCAqL1xuICBIQVNITU9EID0gXCJoYXNobW9kXCIsXG4gIC8qKiBsYWJlbG1hcCAqL1xuICBMQUJFTE1BUCA9IFwibGFiZWxtYXBcIixcbiAgLyoqIGxhYmVsZHJvcCAqL1xuICBMQUJFTERST1AgPSBcImxhYmVsZHJvcFwiLFxuICAvKiogbGFiZWxrZWVwICovXG4gIExBQkVMS0VFUCA9IFwibGFiZWxrZWVwXCIsXG4gIC8qKiBsb3dlcmNhc2UgKi9cbiAgTE9XRVJDQVNFID0gXCJsb3dlcmNhc2VcIixcbiAgLyoqIHVwcGVyY2FzZSAqL1xuICBVUFBFUkNBU0UgPSBcInVwcGVyY2FzZVwiLFxuICAvKioga2VlcGVxdWFsICovXG4gIEtFRVBFUVVBTCA9IFwia2VlcGVxdWFsXCIsXG4gIC8qKiBkcm9wZXF1YWwgKi9cbiAgRFJPUEVRVUFMID0gXCJkcm9wZXF1YWxcIixcbn1cblxuLyoqXG4gKiBjbGllbnRJZCBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IG9yIENvbmZpZ01hcCBjb250YWluaW5nIHRoZVxuICogT0F1dGgyIGNsaWVudCdzIElELlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkI2NvbmZpZ01hcFxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnTWFwPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXA7XG5cbiAgLyoqXG4gICAqIHNlY3JldCBkZWZpbmVzIHRoZSBTZWNyZXQgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NvbmZpZ01hcCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcChvYmouY29uZmlnTWFwKSxcbiAgICAnc2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY2xpZW50U2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgT0F1dGgyXG4gKiBjbGllbnQncyBzZWNyZXQuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0I2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNlY3JldEtleVNlbGVjdG9yIHNlbGVjdHMgYSBrZXkgb2YgYSBTZWNyZXQuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXIge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlciNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlciNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHRsc0NvbmZpZyBkZWZpbmVzIHRoZSBUTFMgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBPQXV0aDIgc2VydmVyLlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi40My4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnIHtcbiAgLyoqXG4gICAqIGNhIGRlZmluZXMgdGhlIENlcnRpZmljYXRlIGF1dGhvcml0eSB1c2VkIHdoZW4gdmVyaWZ5aW5nIHNlcnZlciBjZXJ0aWZpY2F0ZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI2NhXG4gICAqL1xuICByZWFkb25seSBjYT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhO1xuXG4gIC8qKlxuICAgKiBjZXJ0IGRlZmluZXMgdGhlIENsaWVudCBjZXJ0aWZpY2F0ZSB0byBwcmVzZW50IHdoZW4gZG9pbmcgY2xpZW50LWF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyNjZXJ0XG4gICAqL1xuICByZWFkb25seSBjZXJ0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydDtcblxuICAvKipcbiAgICogaW5zZWN1cmVTa2lwVmVyaWZ5IGRlZmluZXMgaG93IHRvIGRpc2FibGUgdGFyZ2V0IGNlcnRpZmljYXRlIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI2luc2VjdXJlU2tpcFZlcmlmeVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zZWN1cmVTa2lwVmVyaWZ5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyNrZXlTZWNyZXRcbiAgICovXG4gIHJlYWRvbmx5IGtleVNlY3JldD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldDtcblxuICAvKipcbiAgICogbWF4VmVyc2lvbiBkZWZpbmVzIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDEuMCBvciBUaGFub3MgPj0gdjAuMzEuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcjbWF4VmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgbWF4VmVyc2lvbj86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ01heFZlcnNpb247XG5cbiAgLyoqXG4gICAqIG1pblZlcnNpb24gZGVmaW5lcyB0aGUgbWluaW11bSBhY2NlcHRhYmxlIFRMUyB2ZXJzaW9uLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjM1LjAgb3IgVGhhbm9zID49IHYwLjI4LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI21pblZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1pblZlcnNpb24/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNaW5WZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBzZXJ2ZXJOYW1lIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBob3N0bmFtZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI3NlcnZlck5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZlck5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjYSc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYShvYmouY2EpLFxuICAgICdjZXJ0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQob2JqLmNlcnQpLFxuICAgICdpbnNlY3VyZVNraXBWZXJpZnknOiBvYmouaW5zZWN1cmVTa2lwVmVyaWZ5LFxuICAgICdrZXlTZWNyZXQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0KG9iai5rZXlTZWNyZXQpLFxuICAgICdtYXhWZXJzaW9uJzogb2JqLm1heFZlcnNpb24sXG4gICAgJ21pblZlcnNpb24nOiBvYmoubWluVmVyc2lvbixcbiAgICAnc2VydmVyTmFtZSc6IG9iai5zZXJ2ZXJOYW1lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYWN0aW9uIHRvIHBlcmZvcm0gYmFzZWQgb24gdGhlIHJlZ2V4IG1hdGNoaW5nLlxuICpcbiAqIGBVcHBlcmNhc2VgIGFuZCBgTG93ZXJjYXNlYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi4zNi4wLlxuICogYERyb3BFcXVhbGAgYW5kIGBLZWVwRXF1YWxgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjQxLjAuXG4gKlxuICogRGVmYXVsdDogXCJSZXBsYWNlXCJcbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uIHtcbiAgLyoqIHJlcGxhY2UgKi9cbiAgUkVQTEFDRSA9IFwicmVwbGFjZVwiLFxuICAvKioga2VlcCAqL1xuICBLRUVQID0gXCJrZWVwXCIsXG4gIC8qKiBkcm9wICovXG4gIERST1AgPSBcImRyb3BcIixcbiAgLyoqIGhhc2htb2QgKi9cbiAgSEFTSE1PRCA9IFwiaGFzaG1vZFwiLFxuICAvKiogbGFiZWxtYXAgKi9cbiAgTEFCRUxNQVAgPSBcImxhYmVsbWFwXCIsXG4gIC8qKiBsYWJlbGRyb3AgKi9cbiAgTEFCRUxEUk9QID0gXCJsYWJlbGRyb3BcIixcbiAgLyoqIGxhYmVsa2VlcCAqL1xuICBMQUJFTEtFRVAgPSBcImxhYmVsa2VlcFwiLFxuICAvKiogbG93ZXJjYXNlICovXG4gIExPV0VSQ0FTRSA9IFwibG93ZXJjYXNlXCIsXG4gIC8qKiB1cHBlcmNhc2UgKi9cbiAgVVBQRVJDQVNFID0gXCJ1cHBlcmNhc2VcIixcbiAgLyoqIGtlZXBlcXVhbCAqL1xuICBLRUVQRVFVQUwgPSBcImtlZXBlcXVhbFwiLFxuICAvKiogZHJvcGVxdWFsICovXG4gIERST1BFUVVBTCA9IFwiZHJvcGVxdWFsXCIsXG59XG5cbi8qKlxuICogY2EgZGVmaW5lcyB0aGUgQ2VydGlmaWNhdGUgYXV0aG9yaXR5IHVzZWQgd2hlbiB2ZXJpZnlpbmcgc2VydmVyIGNlcnRpZmljYXRlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2Ege1xuICAvKipcbiAgICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYSNjb25maWdNYXBcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ01hcD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhI3NlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2EgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb25maWdNYXAnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldChvYmouc2VjcmV0KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNlcnQgZGVmaW5lcyB0aGUgQ2xpZW50IGNlcnRpZmljYXRlIHRvIHByZXNlbnQgd2hlbiBkb2luZyBjbGllbnQtYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQjY29uZmlnTWFwXG4gICAqL1xuICByZWFkb25seSBjb25maWdNYXA/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29uZmlnTWFwJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBtYXhWZXJzaW9uIGRlZmluZXMgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAqXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNYXhWZXJzaW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ01heFZlcnNpb24ge1xuICAvKiogVExTMTAgKi9cbiAgVExTMTAgPSBcIlRMUzEwXCIsXG4gIC8qKiBUTFMxMSAqL1xuICBUTFMxMSA9IFwiVExTMTFcIixcbiAgLyoqIFRMUzEyICovXG4gIFRMUzEyID0gXCJUTFMxMlwiLFxuICAvKiogVExTMTMgKi9cbiAgVExTMTMgPSBcIlRMUzEzXCIsXG59XG5cbi8qKlxuICogbWluVmVyc2lvbiBkZWZpbmVzIHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gKlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnTWluVmVyc2lvblxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNaW5WZXJzaW9uIHtcbiAgLyoqIFRMUzEwICovXG4gIFRMUzEwID0gXCJUTFMxMFwiLFxuICAvKiogVExTMTEgKi9cbiAgVExTMTEgPSBcIlRMUzExXCIsXG4gIC8qKiBUTFMxMiAqL1xuICBUTFMxMiA9IFwiVExTMTJcIixcbiAgLyoqIFRMUzEzICovXG4gIFRMUzEzID0gXCJUTFMxM1wiLFxufVxuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY2EgZGVmaW5lcyB0aGUgQ2VydGlmaWNhdGUgYXV0aG9yaXR5IHVzZWQgd2hlbiB2ZXJpZnlpbmcgc2VydmVyIGNlcnRpZmljYXRlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2Ege1xuICAvKipcbiAgICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYSNjb25maWdNYXBcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ01hcD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhI3NlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2EgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb25maWdNYXAnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldChvYmouc2VjcmV0KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNlcnQgZGVmaW5lcyB0aGUgQ2xpZW50IGNlcnRpZmljYXRlIHRvIHByZXNlbnQgd2hlbiBkb2luZyBjbGllbnQtYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQjY29uZmlnTWFwXG4gICAqL1xuICByZWFkb25seSBjb25maWdNYXA/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29uZmlnTWFwJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdLZXlTZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdLZXlTZWNyZXQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBtYXhWZXJzaW9uIGRlZmluZXMgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAqXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNYXhWZXJzaW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ01heFZlcnNpb24ge1xuICAvKiogVExTMTAgKi9cbiAgVExTMTAgPSBcIlRMUzEwXCIsXG4gIC8qKiBUTFMxMSAqL1xuICBUTFMxMSA9IFwiVExTMTFcIixcbiAgLyoqIFRMUzEyICovXG4gIFRMUzEyID0gXCJUTFMxMlwiLFxuICAvKiogVExTMTMgKi9cbiAgVExTMTMgPSBcIlRMUzEzXCIsXG59XG5cbi8qKlxuICogbWluVmVyc2lvbiBkZWZpbmVzIHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gKlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnTWluVmVyc2lvblxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNaW5WZXJzaW9uIHtcbiAgLyoqIFRMUzEwICovXG4gIFRMUzEwID0gXCJUTFMxMFwiLFxuICAvKiogVExTMTEgKi9cbiAgVExTMTEgPSBcIlRMUzExXCIsXG4gIC8qKiBUTFMxMiAqL1xuICBUTFMxMiA9IFwiVExTMTJcIixcbiAgLyoqIFRMUzEzICovXG4gIFRMUzEzID0gXCJUTFMxM1wiLFxufVxuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYUNvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYUNvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIENvbmZpZ01hcCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0I25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRTZWNyZXQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYUNvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYUNvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIENvbmZpZ01hcCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0I25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRTZWNyZXQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4iXX0=