@bluedynamics/cdk8s-plone 0.1.22 → 0.1.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +417 -5
- package/API.md +455 -0
- package/README.md +1 -1
- package/documentation/sources/explanation/architecture.md +18 -0
- package/documentation/sources/explanation/features.md +10 -2
- package/documentation/sources/how-to/deploy-with-vinyl-cache.md +115 -0
- package/documentation/sources/how-to/index.md +1 -0
- package/documentation/sources/reference/configuration-options.md +56 -0
- package/lib/httpcache.js +1 -1
- package/lib/imports/vinyl.bluedynamics.eu.d.ts +2419 -0
- package/lib/imports/vinyl.bluedynamics.eu.js +1281 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +4 -2
- package/lib/plone.js +1 -1
- package/lib/vinylcache.d.ts +128 -0
- package/lib/vinylcache.js +132 -0
- package/package.json +6 -5
|
@@ -0,0 +1,1281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VinylCacheSpecDirectorShardHealthy = exports.VinylCacheSpecDirectorShardBy = exports.VinylCacheSpecClusterPeerRoutingType = exports.VinylCacheSpecStorageType = exports.VinylCacheSpecStorageSize = exports.VinylCacheSpecServiceType = exports.VinylCacheSpecResourcesRequests = exports.VinylCacheSpecResourcesLimits = exports.VinylCacheSpecDirectorType = exports.VinylCache = void 0;
|
|
4
|
+
exports.toJson_VinylCacheProps = toJson_VinylCacheProps;
|
|
5
|
+
exports.toJson_VinylCacheSpec = toJson_VinylCacheSpec;
|
|
6
|
+
exports.toJson_VinylCacheSpecBackends = toJson_VinylCacheSpecBackends;
|
|
7
|
+
exports.toJson_VinylCacheSpecCluster = toJson_VinylCacheSpecCluster;
|
|
8
|
+
exports.toJson_VinylCacheSpecDebounce = toJson_VinylCacheSpecDebounce;
|
|
9
|
+
exports.toJson_VinylCacheSpecDirector = toJson_VinylCacheSpecDirector;
|
|
10
|
+
exports.toJson_VinylCacheSpecInvalidation = toJson_VinylCacheSpecInvalidation;
|
|
11
|
+
exports.toJson_VinylCacheSpecMonitoring = toJson_VinylCacheSpecMonitoring;
|
|
12
|
+
exports.toJson_VinylCacheSpecPod = toJson_VinylCacheSpecPod;
|
|
13
|
+
exports.toJson_VinylCacheSpecProxyProtocol = toJson_VinylCacheSpecProxyProtocol;
|
|
14
|
+
exports.toJson_VinylCacheSpecResources = toJson_VinylCacheSpecResources;
|
|
15
|
+
exports.toJson_VinylCacheSpecRetry = toJson_VinylCacheSpecRetry;
|
|
16
|
+
exports.toJson_VinylCacheSpecService = toJson_VinylCacheSpecService;
|
|
17
|
+
exports.toJson_VinylCacheSpecStorage = toJson_VinylCacheSpecStorage;
|
|
18
|
+
exports.toJson_VinylCacheSpecVcl = toJson_VinylCacheSpecVcl;
|
|
19
|
+
exports.toJson_VinylCacheSpecBackendsConnectionParameters = toJson_VinylCacheSpecBackendsConnectionParameters;
|
|
20
|
+
exports.toJson_VinylCacheSpecBackendsProbe = toJson_VinylCacheSpecBackendsProbe;
|
|
21
|
+
exports.toJson_VinylCacheSpecBackendsServiceRef = toJson_VinylCacheSpecBackendsServiceRef;
|
|
22
|
+
exports.toJson_VinylCacheSpecClusterPeerRouting = toJson_VinylCacheSpecClusterPeerRouting;
|
|
23
|
+
exports.toJson_VinylCacheSpecDirectorHash = toJson_VinylCacheSpecDirectorHash;
|
|
24
|
+
exports.toJson_VinylCacheSpecDirectorShard = toJson_VinylCacheSpecDirectorShard;
|
|
25
|
+
exports.toJson_VinylCacheSpecInvalidationBan = toJson_VinylCacheSpecInvalidationBan;
|
|
26
|
+
exports.toJson_VinylCacheSpecInvalidationPurge = toJson_VinylCacheSpecInvalidationPurge;
|
|
27
|
+
exports.toJson_VinylCacheSpecInvalidationXkey = toJson_VinylCacheSpecInvalidationXkey;
|
|
28
|
+
exports.toJson_VinylCacheSpecMonitoringPrometheusRules = toJson_VinylCacheSpecMonitoringPrometheusRules;
|
|
29
|
+
exports.toJson_VinylCacheSpecMonitoringServiceMonitor = toJson_VinylCacheSpecMonitoringServiceMonitor;
|
|
30
|
+
exports.toJson_VinylCacheSpecPodAffinity = toJson_VinylCacheSpecPodAffinity;
|
|
31
|
+
exports.toJson_VinylCacheSpecPodTolerations = toJson_VinylCacheSpecPodTolerations;
|
|
32
|
+
exports.toJson_VinylCacheSpecResourcesClaims = toJson_VinylCacheSpecResourcesClaims;
|
|
33
|
+
exports.toJson_VinylCacheSpecVclSnippets = toJson_VinylCacheSpecVclSnippets;
|
|
34
|
+
exports.toJson_VinylCacheSpecPodAffinityNodeAffinity = toJson_VinylCacheSpecPodAffinityNodeAffinity;
|
|
35
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinity = toJson_VinylCacheSpecPodAffinityPodAffinity;
|
|
36
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinity = toJson_VinylCacheSpecPodAffinityPodAntiAffinity;
|
|
37
|
+
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution;
|
|
38
|
+
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution;
|
|
39
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution;
|
|
40
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution;
|
|
41
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution;
|
|
42
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution;
|
|
43
|
+
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference;
|
|
44
|
+
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms = toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms;
|
|
45
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm;
|
|
46
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector = toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector;
|
|
47
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector = toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector;
|
|
48
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm;
|
|
49
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector;
|
|
50
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector;
|
|
51
|
+
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions;
|
|
52
|
+
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields;
|
|
53
|
+
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions = toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions;
|
|
54
|
+
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields = toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields;
|
|
55
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector;
|
|
56
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector;
|
|
57
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions;
|
|
58
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions;
|
|
59
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector;
|
|
60
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector;
|
|
61
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions;
|
|
62
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions;
|
|
63
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions;
|
|
64
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions;
|
|
65
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions;
|
|
66
|
+
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions;
|
|
67
|
+
// generated by cdk8s
|
|
68
|
+
const cdk8s_1 = require("cdk8s");
|
|
69
|
+
/**
|
|
70
|
+
* VinylCache is the Schema for the vinylcaches API.
|
|
71
|
+
It describes a complete Varnish cache cluster: replicas, backends, VCL configuration,
|
|
72
|
+
clustering, and cache invalidation strategy.
|
|
73
|
+
*
|
|
74
|
+
* @schema VinylCache
|
|
75
|
+
*/
|
|
76
|
+
class VinylCache extends cdk8s_1.ApiObject {
|
|
77
|
+
/**
|
|
78
|
+
* Renders a Kubernetes manifest for "VinylCache".
|
|
79
|
+
*
|
|
80
|
+
* This can be used to inline resource manifests inside other objects (e.g. as templates).
|
|
81
|
+
*
|
|
82
|
+
* @param props initialization props
|
|
83
|
+
*/
|
|
84
|
+
static manifest(props = {}) {
|
|
85
|
+
return {
|
|
86
|
+
...VinylCache.GVK,
|
|
87
|
+
...toJson_VinylCacheProps(props),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Defines a "VinylCache" API object
|
|
92
|
+
* @param scope the scope in which to define this object
|
|
93
|
+
* @param id a scope-local name for the object
|
|
94
|
+
* @param props initialization props
|
|
95
|
+
*/
|
|
96
|
+
constructor(scope, id, props = {}) {
|
|
97
|
+
super(scope, id, {
|
|
98
|
+
...VinylCache.GVK,
|
|
99
|
+
...props,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Renders the object to Kubernetes JSON.
|
|
104
|
+
*/
|
|
105
|
+
toJson() {
|
|
106
|
+
const resolved = super.toJson();
|
|
107
|
+
return {
|
|
108
|
+
...VinylCache.GVK,
|
|
109
|
+
...toJson_VinylCacheProps(resolved),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.VinylCache = VinylCache;
|
|
114
|
+
/**
|
|
115
|
+
* Returns the apiVersion and kind for "VinylCache"
|
|
116
|
+
*/
|
|
117
|
+
VinylCache.GVK = {
|
|
118
|
+
apiVersion: 'vinyl.bluedynamics.eu/v1alpha1',
|
|
119
|
+
kind: 'VinylCache',
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Converts an object of type 'VinylCacheProps' to JSON representation.
|
|
123
|
+
*/
|
|
124
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
125
|
+
function toJson_VinylCacheProps(obj) {
|
|
126
|
+
if (obj === undefined) {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
const result = {
|
|
130
|
+
'metadata': obj.metadata,
|
|
131
|
+
'spec': toJson_VinylCacheSpec(obj.spec),
|
|
132
|
+
};
|
|
133
|
+
// filter undefined values
|
|
134
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Converts an object of type 'VinylCacheSpec' to JSON representation.
|
|
138
|
+
*/
|
|
139
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
140
|
+
function toJson_VinylCacheSpec(obj) {
|
|
141
|
+
if (obj === undefined) {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
const result = {
|
|
145
|
+
'backends': obj.backends?.map(y => toJson_VinylCacheSpecBackends(y)),
|
|
146
|
+
'cluster': toJson_VinylCacheSpecCluster(obj.cluster),
|
|
147
|
+
'debounce': toJson_VinylCacheSpecDebounce(obj.debounce),
|
|
148
|
+
'director': toJson_VinylCacheSpecDirector(obj.director),
|
|
149
|
+
'image': obj.image,
|
|
150
|
+
'invalidation': toJson_VinylCacheSpecInvalidation(obj.invalidation),
|
|
151
|
+
'monitoring': toJson_VinylCacheSpecMonitoring(obj.monitoring),
|
|
152
|
+
'pod': toJson_VinylCacheSpecPod(obj.pod),
|
|
153
|
+
'proxyProtocol': toJson_VinylCacheSpecProxyProtocol(obj.proxyProtocol),
|
|
154
|
+
'replicas': obj.replicas,
|
|
155
|
+
'resources': toJson_VinylCacheSpecResources(obj.resources),
|
|
156
|
+
'retry': toJson_VinylCacheSpecRetry(obj.retry),
|
|
157
|
+
'service': toJson_VinylCacheSpecService(obj.service),
|
|
158
|
+
'storage': obj.storage?.map(y => toJson_VinylCacheSpecStorage(y)),
|
|
159
|
+
'varnishParameters': ((obj.varnishParameters) === undefined) ? undefined : (Object.entries(obj.varnishParameters).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
160
|
+
'vcl': toJson_VinylCacheSpecVcl(obj.vcl),
|
|
161
|
+
};
|
|
162
|
+
// filter undefined values
|
|
163
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Converts an object of type 'VinylCacheSpecBackends' to JSON representation.
|
|
167
|
+
*/
|
|
168
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
169
|
+
function toJson_VinylCacheSpecBackends(obj) {
|
|
170
|
+
if (obj === undefined) {
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
const result = {
|
|
174
|
+
'connectionParameters': toJson_VinylCacheSpecBackendsConnectionParameters(obj.connectionParameters),
|
|
175
|
+
'name': obj.name,
|
|
176
|
+
'port': obj.port,
|
|
177
|
+
'probe': toJson_VinylCacheSpecBackendsProbe(obj.probe),
|
|
178
|
+
'serviceRef': toJson_VinylCacheSpecBackendsServiceRef(obj.serviceRef),
|
|
179
|
+
'weight': obj.weight,
|
|
180
|
+
};
|
|
181
|
+
// filter undefined values
|
|
182
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Converts an object of type 'VinylCacheSpecCluster' to JSON representation.
|
|
186
|
+
*/
|
|
187
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
188
|
+
function toJson_VinylCacheSpecCluster(obj) {
|
|
189
|
+
if (obj === undefined) {
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
const result = {
|
|
193
|
+
'enabled': obj.enabled,
|
|
194
|
+
'peerRouting': toJson_VinylCacheSpecClusterPeerRouting(obj.peerRouting),
|
|
195
|
+
};
|
|
196
|
+
// filter undefined values
|
|
197
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Converts an object of type 'VinylCacheSpecDebounce' to JSON representation.
|
|
201
|
+
*/
|
|
202
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
203
|
+
function toJson_VinylCacheSpecDebounce(obj) {
|
|
204
|
+
if (obj === undefined) {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
const result = {
|
|
208
|
+
'duration': obj.duration,
|
|
209
|
+
};
|
|
210
|
+
// filter undefined values
|
|
211
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Converts an object of type 'VinylCacheSpecDirector' to JSON representation.
|
|
215
|
+
*/
|
|
216
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
217
|
+
function toJson_VinylCacheSpecDirector(obj) {
|
|
218
|
+
if (obj === undefined) {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
const result = {
|
|
222
|
+
'hash': toJson_VinylCacheSpecDirectorHash(obj.hash),
|
|
223
|
+
'shard': toJson_VinylCacheSpecDirectorShard(obj.shard),
|
|
224
|
+
'type': obj.type,
|
|
225
|
+
};
|
|
226
|
+
// filter undefined values
|
|
227
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Converts an object of type 'VinylCacheSpecInvalidation' to JSON representation.
|
|
231
|
+
*/
|
|
232
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
233
|
+
function toJson_VinylCacheSpecInvalidation(obj) {
|
|
234
|
+
if (obj === undefined) {
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
const result = {
|
|
238
|
+
'ban': toJson_VinylCacheSpecInvalidationBan(obj.ban),
|
|
239
|
+
'purge': toJson_VinylCacheSpecInvalidationPurge(obj.purge),
|
|
240
|
+
'xkey': toJson_VinylCacheSpecInvalidationXkey(obj.xkey),
|
|
241
|
+
};
|
|
242
|
+
// filter undefined values
|
|
243
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Converts an object of type 'VinylCacheSpecMonitoring' to JSON representation.
|
|
247
|
+
*/
|
|
248
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
249
|
+
function toJson_VinylCacheSpecMonitoring(obj) {
|
|
250
|
+
if (obj === undefined) {
|
|
251
|
+
return undefined;
|
|
252
|
+
}
|
|
253
|
+
const result = {
|
|
254
|
+
'enabled': obj.enabled,
|
|
255
|
+
'prometheusRules': toJson_VinylCacheSpecMonitoringPrometheusRules(obj.prometheusRules),
|
|
256
|
+
'serviceMonitor': toJson_VinylCacheSpecMonitoringServiceMonitor(obj.serviceMonitor),
|
|
257
|
+
};
|
|
258
|
+
// filter undefined values
|
|
259
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Converts an object of type 'VinylCacheSpecPod' to JSON representation.
|
|
263
|
+
*/
|
|
264
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
265
|
+
function toJson_VinylCacheSpecPod(obj) {
|
|
266
|
+
if (obj === undefined) {
|
|
267
|
+
return undefined;
|
|
268
|
+
}
|
|
269
|
+
const result = {
|
|
270
|
+
'affinity': toJson_VinylCacheSpecPodAffinity(obj.affinity),
|
|
271
|
+
'annotations': ((obj.annotations) === undefined) ? undefined : (Object.entries(obj.annotations).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
272
|
+
'labels': ((obj.labels) === undefined) ? undefined : (Object.entries(obj.labels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
273
|
+
'nodeSelector': ((obj.nodeSelector) === undefined) ? undefined : (Object.entries(obj.nodeSelector).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
274
|
+
'priorityClassName': obj.priorityClassName,
|
|
275
|
+
'tolerations': obj.tolerations?.map(y => toJson_VinylCacheSpecPodTolerations(y)),
|
|
276
|
+
};
|
|
277
|
+
// filter undefined values
|
|
278
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Converts an object of type 'VinylCacheSpecProxyProtocol' to JSON representation.
|
|
282
|
+
*/
|
|
283
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
284
|
+
function toJson_VinylCacheSpecProxyProtocol(obj) {
|
|
285
|
+
if (obj === undefined) {
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
const result = {
|
|
289
|
+
'enabled': obj.enabled,
|
|
290
|
+
'port': obj.port,
|
|
291
|
+
};
|
|
292
|
+
// filter undefined values
|
|
293
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Converts an object of type 'VinylCacheSpecResources' to JSON representation.
|
|
297
|
+
*/
|
|
298
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
299
|
+
function toJson_VinylCacheSpecResources(obj) {
|
|
300
|
+
if (obj === undefined) {
|
|
301
|
+
return undefined;
|
|
302
|
+
}
|
|
303
|
+
const result = {
|
|
304
|
+
'claims': obj.claims?.map(y => toJson_VinylCacheSpecResourcesClaims(y)),
|
|
305
|
+
'limits': ((obj.limits) === undefined) ? undefined : (Object.entries(obj.limits).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
|
|
306
|
+
'requests': ((obj.requests) === undefined) ? undefined : (Object.entries(obj.requests).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
|
|
307
|
+
};
|
|
308
|
+
// filter undefined values
|
|
309
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Converts an object of type 'VinylCacheSpecRetry' to JSON representation.
|
|
313
|
+
*/
|
|
314
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
315
|
+
function toJson_VinylCacheSpecRetry(obj) {
|
|
316
|
+
if (obj === undefined) {
|
|
317
|
+
return undefined;
|
|
318
|
+
}
|
|
319
|
+
const result = {
|
|
320
|
+
'backoffBase': obj.backoffBase,
|
|
321
|
+
'backoffMax': obj.backoffMax,
|
|
322
|
+
'maxAttempts': obj.maxAttempts,
|
|
323
|
+
};
|
|
324
|
+
// filter undefined values
|
|
325
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Converts an object of type 'VinylCacheSpecService' to JSON representation.
|
|
329
|
+
*/
|
|
330
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
331
|
+
function toJson_VinylCacheSpecService(obj) {
|
|
332
|
+
if (obj === undefined) {
|
|
333
|
+
return undefined;
|
|
334
|
+
}
|
|
335
|
+
const result = {
|
|
336
|
+
'annotations': ((obj.annotations) === undefined) ? undefined : (Object.entries(obj.annotations).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
337
|
+
'type': obj.type,
|
|
338
|
+
};
|
|
339
|
+
// filter undefined values
|
|
340
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Converts an object of type 'VinylCacheSpecStorage' to JSON representation.
|
|
344
|
+
*/
|
|
345
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
346
|
+
function toJson_VinylCacheSpecStorage(obj) {
|
|
347
|
+
if (obj === undefined) {
|
|
348
|
+
return undefined;
|
|
349
|
+
}
|
|
350
|
+
const result = {
|
|
351
|
+
'name': obj.name,
|
|
352
|
+
'path': obj.path,
|
|
353
|
+
'size': obj.size?.value,
|
|
354
|
+
'type': obj.type,
|
|
355
|
+
};
|
|
356
|
+
// filter undefined values
|
|
357
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Converts an object of type 'VinylCacheSpecVcl' to JSON representation.
|
|
361
|
+
*/
|
|
362
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
363
|
+
function toJson_VinylCacheSpecVcl(obj) {
|
|
364
|
+
if (obj === undefined) {
|
|
365
|
+
return undefined;
|
|
366
|
+
}
|
|
367
|
+
const result = {
|
|
368
|
+
'fullOverride': obj.fullOverride,
|
|
369
|
+
'snippets': toJson_VinylCacheSpecVclSnippets(obj.snippets),
|
|
370
|
+
};
|
|
371
|
+
// filter undefined values
|
|
372
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Converts an object of type 'VinylCacheSpecBackendsConnectionParameters' to JSON representation.
|
|
376
|
+
*/
|
|
377
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
378
|
+
function toJson_VinylCacheSpecBackendsConnectionParameters(obj) {
|
|
379
|
+
if (obj === undefined) {
|
|
380
|
+
return undefined;
|
|
381
|
+
}
|
|
382
|
+
const result = {
|
|
383
|
+
'betweenBytesTimeout': obj.betweenBytesTimeout,
|
|
384
|
+
'connectTimeout': obj.connectTimeout,
|
|
385
|
+
'firstByteTimeout': obj.firstByteTimeout,
|
|
386
|
+
'idleTimeout': obj.idleTimeout,
|
|
387
|
+
'maxConnections': obj.maxConnections,
|
|
388
|
+
};
|
|
389
|
+
// filter undefined values
|
|
390
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Converts an object of type 'VinylCacheSpecBackendsProbe' to JSON representation.
|
|
394
|
+
*/
|
|
395
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
396
|
+
function toJson_VinylCacheSpecBackendsProbe(obj) {
|
|
397
|
+
if (obj === undefined) {
|
|
398
|
+
return undefined;
|
|
399
|
+
}
|
|
400
|
+
const result = {
|
|
401
|
+
'expectedResponse': obj.expectedResponse,
|
|
402
|
+
'interval': obj.interval,
|
|
403
|
+
'threshold': obj.threshold,
|
|
404
|
+
'timeout': obj.timeout,
|
|
405
|
+
'url': obj.url,
|
|
406
|
+
'window': obj.window,
|
|
407
|
+
};
|
|
408
|
+
// filter undefined values
|
|
409
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Converts an object of type 'VinylCacheSpecBackendsServiceRef' to JSON representation.
|
|
413
|
+
*/
|
|
414
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
415
|
+
function toJson_VinylCacheSpecBackendsServiceRef(obj) {
|
|
416
|
+
if (obj === undefined) {
|
|
417
|
+
return undefined;
|
|
418
|
+
}
|
|
419
|
+
const result = {
|
|
420
|
+
'name': obj.name,
|
|
421
|
+
};
|
|
422
|
+
// filter undefined values
|
|
423
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Converts an object of type 'VinylCacheSpecClusterPeerRouting' to JSON representation.
|
|
427
|
+
*/
|
|
428
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
429
|
+
function toJson_VinylCacheSpecClusterPeerRouting(obj) {
|
|
430
|
+
if (obj === undefined) {
|
|
431
|
+
return undefined;
|
|
432
|
+
}
|
|
433
|
+
const result = {
|
|
434
|
+
'type': obj.type,
|
|
435
|
+
};
|
|
436
|
+
// filter undefined values
|
|
437
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Converts an object of type 'VinylCacheSpecDirectorHash' to JSON representation.
|
|
441
|
+
*/
|
|
442
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
443
|
+
function toJson_VinylCacheSpecDirectorHash(obj) {
|
|
444
|
+
if (obj === undefined) {
|
|
445
|
+
return undefined;
|
|
446
|
+
}
|
|
447
|
+
const result = {
|
|
448
|
+
'header': obj.header,
|
|
449
|
+
};
|
|
450
|
+
// filter undefined values
|
|
451
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Converts an object of type 'VinylCacheSpecDirectorShard' to JSON representation.
|
|
455
|
+
*/
|
|
456
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
457
|
+
function toJson_VinylCacheSpecDirectorShard(obj) {
|
|
458
|
+
if (obj === undefined) {
|
|
459
|
+
return undefined;
|
|
460
|
+
}
|
|
461
|
+
const result = {
|
|
462
|
+
'by': obj.by,
|
|
463
|
+
'healthy': obj.healthy,
|
|
464
|
+
'rampup': obj.rampup,
|
|
465
|
+
'replicas': obj.replicas,
|
|
466
|
+
'warmup': obj.warmup,
|
|
467
|
+
};
|
|
468
|
+
// filter undefined values
|
|
469
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
470
|
+
}
|
|
471
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
472
|
+
/**
|
|
473
|
+
* type selects the Varnish director algorithm.
|
|
474
|
+
* "shard" (default) provides consistent hashing; "round_robin", "random", and "hash"
|
|
475
|
+
* are also supported.
|
|
476
|
+
*
|
|
477
|
+
* @schema VinylCacheSpecDirectorType
|
|
478
|
+
*/
|
|
479
|
+
var VinylCacheSpecDirectorType;
|
|
480
|
+
(function (VinylCacheSpecDirectorType) {
|
|
481
|
+
/** shard */
|
|
482
|
+
VinylCacheSpecDirectorType["SHARD"] = "shard";
|
|
483
|
+
/** round_robin */
|
|
484
|
+
VinylCacheSpecDirectorType["ROUND_UNDERSCORE_ROBIN"] = "round_robin";
|
|
485
|
+
/** random */
|
|
486
|
+
VinylCacheSpecDirectorType["RANDOM"] = "random";
|
|
487
|
+
/** hash */
|
|
488
|
+
VinylCacheSpecDirectorType["HASH"] = "hash";
|
|
489
|
+
})(VinylCacheSpecDirectorType || (exports.VinylCacheSpecDirectorType = VinylCacheSpecDirectorType = {}));
|
|
490
|
+
/**
|
|
491
|
+
* Converts an object of type 'VinylCacheSpecInvalidationBan' to JSON representation.
|
|
492
|
+
*/
|
|
493
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
494
|
+
function toJson_VinylCacheSpecInvalidationBan(obj) {
|
|
495
|
+
if (obj === undefined) {
|
|
496
|
+
return undefined;
|
|
497
|
+
}
|
|
498
|
+
const result = {
|
|
499
|
+
'allowedSources': obj.allowedSources?.map(y => y),
|
|
500
|
+
'enabled': obj.enabled,
|
|
501
|
+
'rateLimitPerMinute': obj.rateLimitPerMinute,
|
|
502
|
+
};
|
|
503
|
+
// filter undefined values
|
|
504
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Converts an object of type 'VinylCacheSpecInvalidationPurge' to JSON representation.
|
|
508
|
+
*/
|
|
509
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
510
|
+
function toJson_VinylCacheSpecInvalidationPurge(obj) {
|
|
511
|
+
if (obj === undefined) {
|
|
512
|
+
return undefined;
|
|
513
|
+
}
|
|
514
|
+
const result = {
|
|
515
|
+
'allowedSources': obj.allowedSources?.map(y => y),
|
|
516
|
+
'enabled': obj.enabled,
|
|
517
|
+
'soft': obj.soft,
|
|
518
|
+
};
|
|
519
|
+
// filter undefined values
|
|
520
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Converts an object of type 'VinylCacheSpecInvalidationXkey' to JSON representation.
|
|
524
|
+
*/
|
|
525
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
526
|
+
function toJson_VinylCacheSpecInvalidationXkey(obj) {
|
|
527
|
+
if (obj === undefined) {
|
|
528
|
+
return undefined;
|
|
529
|
+
}
|
|
530
|
+
const result = {
|
|
531
|
+
'allowedSources': obj.allowedSources?.map(y => y),
|
|
532
|
+
'enabled': obj.enabled,
|
|
533
|
+
'softPurge': obj.softPurge,
|
|
534
|
+
};
|
|
535
|
+
// filter undefined values
|
|
536
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Converts an object of type 'VinylCacheSpecMonitoringPrometheusRules' to JSON representation.
|
|
540
|
+
*/
|
|
541
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
542
|
+
function toJson_VinylCacheSpecMonitoringPrometheusRules(obj) {
|
|
543
|
+
if (obj === undefined) {
|
|
544
|
+
return undefined;
|
|
545
|
+
}
|
|
546
|
+
const result = {
|
|
547
|
+
'enabled': obj.enabled,
|
|
548
|
+
};
|
|
549
|
+
// filter undefined values
|
|
550
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Converts an object of type 'VinylCacheSpecMonitoringServiceMonitor' to JSON representation.
|
|
554
|
+
*/
|
|
555
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
556
|
+
function toJson_VinylCacheSpecMonitoringServiceMonitor(obj) {
|
|
557
|
+
if (obj === undefined) {
|
|
558
|
+
return undefined;
|
|
559
|
+
}
|
|
560
|
+
const result = {
|
|
561
|
+
'enabled': obj.enabled,
|
|
562
|
+
'interval': obj.interval,
|
|
563
|
+
};
|
|
564
|
+
// filter undefined values
|
|
565
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Converts an object of type 'VinylCacheSpecPodAffinity' to JSON representation.
|
|
569
|
+
*/
|
|
570
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
571
|
+
function toJson_VinylCacheSpecPodAffinity(obj) {
|
|
572
|
+
if (obj === undefined) {
|
|
573
|
+
return undefined;
|
|
574
|
+
}
|
|
575
|
+
const result = {
|
|
576
|
+
'nodeAffinity': toJson_VinylCacheSpecPodAffinityNodeAffinity(obj.nodeAffinity),
|
|
577
|
+
'podAffinity': toJson_VinylCacheSpecPodAffinityPodAffinity(obj.podAffinity),
|
|
578
|
+
'podAntiAffinity': toJson_VinylCacheSpecPodAffinityPodAntiAffinity(obj.podAntiAffinity),
|
|
579
|
+
};
|
|
580
|
+
// filter undefined values
|
|
581
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Converts an object of type 'VinylCacheSpecPodTolerations' to JSON representation.
|
|
585
|
+
*/
|
|
586
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
587
|
+
function toJson_VinylCacheSpecPodTolerations(obj) {
|
|
588
|
+
if (obj === undefined) {
|
|
589
|
+
return undefined;
|
|
590
|
+
}
|
|
591
|
+
const result = {
|
|
592
|
+
'effect': obj.effect,
|
|
593
|
+
'key': obj.key,
|
|
594
|
+
'operator': obj.operator,
|
|
595
|
+
'tolerationSeconds': obj.tolerationSeconds,
|
|
596
|
+
'value': obj.value,
|
|
597
|
+
};
|
|
598
|
+
// filter undefined values
|
|
599
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
600
|
+
}
|
|
601
|
+
/**
|
|
602
|
+
* Converts an object of type 'VinylCacheSpecResourcesClaims' to JSON representation.
|
|
603
|
+
*/
|
|
604
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
605
|
+
function toJson_VinylCacheSpecResourcesClaims(obj) {
|
|
606
|
+
if (obj === undefined) {
|
|
607
|
+
return undefined;
|
|
608
|
+
}
|
|
609
|
+
const result = {
|
|
610
|
+
'name': obj.name,
|
|
611
|
+
'request': obj.request,
|
|
612
|
+
};
|
|
613
|
+
// filter undefined values
|
|
614
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
615
|
+
}
|
|
616
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
617
|
+
/**
|
|
618
|
+
* @schema VinylCacheSpecResourcesLimits
|
|
619
|
+
*/
|
|
620
|
+
class VinylCacheSpecResourcesLimits {
|
|
621
|
+
static fromNumber(value) {
|
|
622
|
+
return new VinylCacheSpecResourcesLimits(value);
|
|
623
|
+
}
|
|
624
|
+
static fromString(value) {
|
|
625
|
+
return new VinylCacheSpecResourcesLimits(value);
|
|
626
|
+
}
|
|
627
|
+
constructor(value) {
|
|
628
|
+
this.value = value;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
exports.VinylCacheSpecResourcesLimits = VinylCacheSpecResourcesLimits;
|
|
632
|
+
/**
|
|
633
|
+
* @schema VinylCacheSpecResourcesRequests
|
|
634
|
+
*/
|
|
635
|
+
class VinylCacheSpecResourcesRequests {
|
|
636
|
+
static fromNumber(value) {
|
|
637
|
+
return new VinylCacheSpecResourcesRequests(value);
|
|
638
|
+
}
|
|
639
|
+
static fromString(value) {
|
|
640
|
+
return new VinylCacheSpecResourcesRequests(value);
|
|
641
|
+
}
|
|
642
|
+
constructor(value) {
|
|
643
|
+
this.value = value;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
exports.VinylCacheSpecResourcesRequests = VinylCacheSpecResourcesRequests;
|
|
647
|
+
/**
|
|
648
|
+
* type sets the Kubernetes Service type (ClusterIP, NodePort, LoadBalancer).
|
|
649
|
+
*
|
|
650
|
+
* @schema VinylCacheSpecServiceType
|
|
651
|
+
*/
|
|
652
|
+
var VinylCacheSpecServiceType;
|
|
653
|
+
(function (VinylCacheSpecServiceType) {
|
|
654
|
+
/** ClusterIP */
|
|
655
|
+
VinylCacheSpecServiceType["CLUSTER_IP"] = "ClusterIP";
|
|
656
|
+
/** NodePort */
|
|
657
|
+
VinylCacheSpecServiceType["NODE_PORT"] = "NodePort";
|
|
658
|
+
/** LoadBalancer */
|
|
659
|
+
VinylCacheSpecServiceType["LOAD_BALANCER"] = "LoadBalancer";
|
|
660
|
+
})(VinylCacheSpecServiceType || (exports.VinylCacheSpecServiceType = VinylCacheSpecServiceType = {}));
|
|
661
|
+
/**
|
|
662
|
+
* size is the storage allocation as a Kubernetes resource quantity (e.g. "1Gi").
|
|
663
|
+
* The operator converts to bytes for varnishd.
|
|
664
|
+
*
|
|
665
|
+
* @schema VinylCacheSpecStorageSize
|
|
666
|
+
*/
|
|
667
|
+
class VinylCacheSpecStorageSize {
|
|
668
|
+
static fromNumber(value) {
|
|
669
|
+
return new VinylCacheSpecStorageSize(value);
|
|
670
|
+
}
|
|
671
|
+
static fromString(value) {
|
|
672
|
+
return new VinylCacheSpecStorageSize(value);
|
|
673
|
+
}
|
|
674
|
+
constructor(value) {
|
|
675
|
+
this.value = value;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
exports.VinylCacheSpecStorageSize = VinylCacheSpecStorageSize;
|
|
679
|
+
/**
|
|
680
|
+
* type is the storage backend type. Only "malloc" and "file" are permitted.
|
|
681
|
+
* "persistent", "umem", and "default" are rejected by the admission webhook.
|
|
682
|
+
*
|
|
683
|
+
* @schema VinylCacheSpecStorageType
|
|
684
|
+
*/
|
|
685
|
+
var VinylCacheSpecStorageType;
|
|
686
|
+
(function (VinylCacheSpecStorageType) {
|
|
687
|
+
/** malloc */
|
|
688
|
+
VinylCacheSpecStorageType["MALLOC"] = "malloc";
|
|
689
|
+
/** file */
|
|
690
|
+
VinylCacheSpecStorageType["FILE"] = "file";
|
|
691
|
+
})(VinylCacheSpecStorageType || (exports.VinylCacheSpecStorageType = VinylCacheSpecStorageType = {}));
|
|
692
|
+
/**
|
|
693
|
+
* Converts an object of type 'VinylCacheSpecVclSnippets' to JSON representation.
|
|
694
|
+
*/
|
|
695
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
696
|
+
function toJson_VinylCacheSpecVclSnippets(obj) {
|
|
697
|
+
if (obj === undefined) {
|
|
698
|
+
return undefined;
|
|
699
|
+
}
|
|
700
|
+
const result = {
|
|
701
|
+
'header': obj.header,
|
|
702
|
+
'vclBackendError': obj.vclBackendError,
|
|
703
|
+
'vclBackendFetch': obj.vclBackendFetch,
|
|
704
|
+
'vclBackendResponse': obj.vclBackendResponse,
|
|
705
|
+
'vclDeliver': obj.vclDeliver,
|
|
706
|
+
'vclFini': obj.vclFini,
|
|
707
|
+
'vclHash': obj.vclHash,
|
|
708
|
+
'vclHit': obj.vclHit,
|
|
709
|
+
'vclInit': obj.vclInit,
|
|
710
|
+
'vclMiss': obj.vclMiss,
|
|
711
|
+
'vclPass': obj.vclPass,
|
|
712
|
+
'vclPipe': obj.vclPipe,
|
|
713
|
+
'vclPurge': obj.vclPurge,
|
|
714
|
+
'vclRecv': obj.vclRecv,
|
|
715
|
+
'vclSynth': obj.vclSynth,
|
|
716
|
+
};
|
|
717
|
+
// filter undefined values
|
|
718
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
719
|
+
}
|
|
720
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
721
|
+
/**
|
|
722
|
+
* type is the routing strategy between Varnish pods. Only "shard" is supported.
|
|
723
|
+
*
|
|
724
|
+
* @schema VinylCacheSpecClusterPeerRoutingType
|
|
725
|
+
*/
|
|
726
|
+
var VinylCacheSpecClusterPeerRoutingType;
|
|
727
|
+
(function (VinylCacheSpecClusterPeerRoutingType) {
|
|
728
|
+
/** shard */
|
|
729
|
+
VinylCacheSpecClusterPeerRoutingType["SHARD"] = "shard";
|
|
730
|
+
})(VinylCacheSpecClusterPeerRoutingType || (exports.VinylCacheSpecClusterPeerRoutingType = VinylCacheSpecClusterPeerRoutingType = {}));
|
|
731
|
+
/**
|
|
732
|
+
* by determines what value is hashed for shard selection. "HASH" uses the Varnish
|
|
733
|
+
* hash (default); "URL" uses the request URL.
|
|
734
|
+
*
|
|
735
|
+
* @schema VinylCacheSpecDirectorShardBy
|
|
736
|
+
*/
|
|
737
|
+
var VinylCacheSpecDirectorShardBy;
|
|
738
|
+
(function (VinylCacheSpecDirectorShardBy) {
|
|
739
|
+
/** HASH */
|
|
740
|
+
VinylCacheSpecDirectorShardBy["HASH"] = "HASH";
|
|
741
|
+
/** URL */
|
|
742
|
+
VinylCacheSpecDirectorShardBy["URL"] = "URL";
|
|
743
|
+
})(VinylCacheSpecDirectorShardBy || (exports.VinylCacheSpecDirectorShardBy = VinylCacheSpecDirectorShardBy = {}));
|
|
744
|
+
/**
|
|
745
|
+
* healthy controls which backends the director considers when selecting a shard.
|
|
746
|
+
* "CHOSEN" (default) only considers the chosen backend healthy; "ALL" requires all
|
|
747
|
+
* backends to be healthy.
|
|
748
|
+
*
|
|
749
|
+
* @schema VinylCacheSpecDirectorShardHealthy
|
|
750
|
+
*/
|
|
751
|
+
var VinylCacheSpecDirectorShardHealthy;
|
|
752
|
+
(function (VinylCacheSpecDirectorShardHealthy) {
|
|
753
|
+
/** CHOSEN */
|
|
754
|
+
VinylCacheSpecDirectorShardHealthy["CHOSEN"] = "CHOSEN";
|
|
755
|
+
/** ALL */
|
|
756
|
+
VinylCacheSpecDirectorShardHealthy["ALL"] = "ALL";
|
|
757
|
+
})(VinylCacheSpecDirectorShardHealthy || (exports.VinylCacheSpecDirectorShardHealthy = VinylCacheSpecDirectorShardHealthy = {}));
|
|
758
|
+
/**
|
|
759
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinity' to JSON representation.
|
|
760
|
+
*/
|
|
761
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
762
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinity(obj) {
|
|
763
|
+
if (obj === undefined) {
|
|
764
|
+
return undefined;
|
|
765
|
+
}
|
|
766
|
+
const result = {
|
|
767
|
+
'preferredDuringSchedulingIgnoredDuringExecution': obj.preferredDuringSchedulingIgnoredDuringExecution?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution(y)),
|
|
768
|
+
'requiredDuringSchedulingIgnoredDuringExecution': toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution(obj.requiredDuringSchedulingIgnoredDuringExecution),
|
|
769
|
+
};
|
|
770
|
+
// filter undefined values
|
|
771
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
772
|
+
}
|
|
773
|
+
/**
|
|
774
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinity' to JSON representation.
|
|
775
|
+
*/
|
|
776
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
777
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinity(obj) {
|
|
778
|
+
if (obj === undefined) {
|
|
779
|
+
return undefined;
|
|
780
|
+
}
|
|
781
|
+
const result = {
|
|
782
|
+
'preferredDuringSchedulingIgnoredDuringExecution': obj.preferredDuringSchedulingIgnoredDuringExecution?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution(y)),
|
|
783
|
+
'requiredDuringSchedulingIgnoredDuringExecution': obj.requiredDuringSchedulingIgnoredDuringExecution?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution(y)),
|
|
784
|
+
};
|
|
785
|
+
// filter undefined values
|
|
786
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinity' to JSON representation.
|
|
790
|
+
*/
|
|
791
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
792
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinity(obj) {
|
|
793
|
+
if (obj === undefined) {
|
|
794
|
+
return undefined;
|
|
795
|
+
}
|
|
796
|
+
const result = {
|
|
797
|
+
'preferredDuringSchedulingIgnoredDuringExecution': obj.preferredDuringSchedulingIgnoredDuringExecution?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution(y)),
|
|
798
|
+
'requiredDuringSchedulingIgnoredDuringExecution': obj.requiredDuringSchedulingIgnoredDuringExecution?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution(y)),
|
|
799
|
+
};
|
|
800
|
+
// filter undefined values
|
|
801
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
805
|
+
*/
|
|
806
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
807
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
808
|
+
if (obj === undefined) {
|
|
809
|
+
return undefined;
|
|
810
|
+
}
|
|
811
|
+
const result = {
|
|
812
|
+
'preference': toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference(obj.preference),
|
|
813
|
+
'weight': obj.weight,
|
|
814
|
+
};
|
|
815
|
+
// filter undefined values
|
|
816
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
817
|
+
}
|
|
818
|
+
/**
|
|
819
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
820
|
+
*/
|
|
821
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
822
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
823
|
+
if (obj === undefined) {
|
|
824
|
+
return undefined;
|
|
825
|
+
}
|
|
826
|
+
const result = {
|
|
827
|
+
'nodeSelectorTerms': obj.nodeSelectorTerms?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms(y)),
|
|
828
|
+
};
|
|
829
|
+
// filter undefined values
|
|
830
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
831
|
+
}
|
|
832
|
+
/**
|
|
833
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
834
|
+
*/
|
|
835
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
836
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
837
|
+
if (obj === undefined) {
|
|
838
|
+
return undefined;
|
|
839
|
+
}
|
|
840
|
+
const result = {
|
|
841
|
+
'podAffinityTerm': toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj.podAffinityTerm),
|
|
842
|
+
'weight': obj.weight,
|
|
843
|
+
};
|
|
844
|
+
// filter undefined values
|
|
845
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
846
|
+
}
|
|
847
|
+
/**
|
|
848
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
849
|
+
*/
|
|
850
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
851
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
852
|
+
if (obj === undefined) {
|
|
853
|
+
return undefined;
|
|
854
|
+
}
|
|
855
|
+
const result = {
|
|
856
|
+
'labelSelector': toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj.labelSelector),
|
|
857
|
+
'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
|
|
858
|
+
'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
|
|
859
|
+
'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj.namespaceSelector),
|
|
860
|
+
'namespaces': obj.namespaces?.map(y => y),
|
|
861
|
+
'topologyKey': obj.topologyKey,
|
|
862
|
+
};
|
|
863
|
+
// filter undefined values
|
|
864
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
865
|
+
}
|
|
866
|
+
/**
|
|
867
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
868
|
+
*/
|
|
869
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
870
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
871
|
+
if (obj === undefined) {
|
|
872
|
+
return undefined;
|
|
873
|
+
}
|
|
874
|
+
const result = {
|
|
875
|
+
'podAffinityTerm': toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj.podAffinityTerm),
|
|
876
|
+
'weight': obj.weight,
|
|
877
|
+
};
|
|
878
|
+
// filter undefined values
|
|
879
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
883
|
+
*/
|
|
884
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
885
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
886
|
+
if (obj === undefined) {
|
|
887
|
+
return undefined;
|
|
888
|
+
}
|
|
889
|
+
const result = {
|
|
890
|
+
'labelSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj.labelSelector),
|
|
891
|
+
'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
|
|
892
|
+
'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
|
|
893
|
+
'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj.namespaceSelector),
|
|
894
|
+
'namespaces': obj.namespaces?.map(y => y),
|
|
895
|
+
'topologyKey': obj.topologyKey,
|
|
896
|
+
};
|
|
897
|
+
// filter undefined values
|
|
898
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
899
|
+
}
|
|
900
|
+
/**
|
|
901
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference' to JSON representation.
|
|
902
|
+
*/
|
|
903
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
904
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference(obj) {
|
|
905
|
+
if (obj === undefined) {
|
|
906
|
+
return undefined;
|
|
907
|
+
}
|
|
908
|
+
const result = {
|
|
909
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions(y)),
|
|
910
|
+
'matchFields': obj.matchFields?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields(y)),
|
|
911
|
+
};
|
|
912
|
+
// filter undefined values
|
|
913
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
914
|
+
}
|
|
915
|
+
/**
|
|
916
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms' to JSON representation.
|
|
917
|
+
*/
|
|
918
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
919
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms(obj) {
|
|
920
|
+
if (obj === undefined) {
|
|
921
|
+
return undefined;
|
|
922
|
+
}
|
|
923
|
+
const result = {
|
|
924
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions(y)),
|
|
925
|
+
'matchFields': obj.matchFields?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields(y)),
|
|
926
|
+
};
|
|
927
|
+
// filter undefined values
|
|
928
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
929
|
+
}
|
|
930
|
+
/**
|
|
931
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm' to JSON representation.
|
|
932
|
+
*/
|
|
933
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
934
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj) {
|
|
935
|
+
if (obj === undefined) {
|
|
936
|
+
return undefined;
|
|
937
|
+
}
|
|
938
|
+
const result = {
|
|
939
|
+
'labelSelector': toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj.labelSelector),
|
|
940
|
+
'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
|
|
941
|
+
'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
|
|
942
|
+
'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj.namespaceSelector),
|
|
943
|
+
'namespaces': obj.namespaces?.map(y => y),
|
|
944
|
+
'topologyKey': obj.topologyKey,
|
|
945
|
+
};
|
|
946
|
+
// filter undefined values
|
|
947
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
948
|
+
}
|
|
949
|
+
/**
|
|
950
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector' to JSON representation.
|
|
951
|
+
*/
|
|
952
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
953
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj) {
|
|
954
|
+
if (obj === undefined) {
|
|
955
|
+
return undefined;
|
|
956
|
+
}
|
|
957
|
+
const result = {
|
|
958
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(y)),
|
|
959
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
960
|
+
};
|
|
961
|
+
// filter undefined values
|
|
962
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
963
|
+
}
|
|
964
|
+
/**
|
|
965
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector' to JSON representation.
|
|
966
|
+
*/
|
|
967
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
968
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj) {
|
|
969
|
+
if (obj === undefined) {
|
|
970
|
+
return undefined;
|
|
971
|
+
}
|
|
972
|
+
const result = {
|
|
973
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions(y)),
|
|
974
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
975
|
+
};
|
|
976
|
+
// filter undefined values
|
|
977
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
978
|
+
}
|
|
979
|
+
/**
|
|
980
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm' to JSON representation.
|
|
981
|
+
*/
|
|
982
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
983
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj) {
|
|
984
|
+
if (obj === undefined) {
|
|
985
|
+
return undefined;
|
|
986
|
+
}
|
|
987
|
+
const result = {
|
|
988
|
+
'labelSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj.labelSelector),
|
|
989
|
+
'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
|
|
990
|
+
'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
|
|
991
|
+
'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj.namespaceSelector),
|
|
992
|
+
'namespaces': obj.namespaces?.map(y => y),
|
|
993
|
+
'topologyKey': obj.topologyKey,
|
|
994
|
+
};
|
|
995
|
+
// filter undefined values
|
|
996
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
997
|
+
}
|
|
998
|
+
/**
|
|
999
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector' to JSON representation.
|
|
1000
|
+
*/
|
|
1001
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1002
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj) {
|
|
1003
|
+
if (obj === undefined) {
|
|
1004
|
+
return undefined;
|
|
1005
|
+
}
|
|
1006
|
+
const result = {
|
|
1007
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(y)),
|
|
1008
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
1009
|
+
};
|
|
1010
|
+
// filter undefined values
|
|
1011
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1012
|
+
}
|
|
1013
|
+
/**
|
|
1014
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector' to JSON representation.
|
|
1015
|
+
*/
|
|
1016
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1017
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj) {
|
|
1018
|
+
if (obj === undefined) {
|
|
1019
|
+
return undefined;
|
|
1020
|
+
}
|
|
1021
|
+
const result = {
|
|
1022
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions(y)),
|
|
1023
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
1024
|
+
};
|
|
1025
|
+
// filter undefined values
|
|
1026
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1027
|
+
}
|
|
1028
|
+
/**
|
|
1029
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions' to JSON representation.
|
|
1030
|
+
*/
|
|
1031
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1032
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions(obj) {
|
|
1033
|
+
if (obj === undefined) {
|
|
1034
|
+
return undefined;
|
|
1035
|
+
}
|
|
1036
|
+
const result = {
|
|
1037
|
+
'key': obj.key,
|
|
1038
|
+
'operator': obj.operator,
|
|
1039
|
+
'values': obj.values?.map(y => y),
|
|
1040
|
+
};
|
|
1041
|
+
// filter undefined values
|
|
1042
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1043
|
+
}
|
|
1044
|
+
/**
|
|
1045
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields' to JSON representation.
|
|
1046
|
+
*/
|
|
1047
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1048
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields(obj) {
|
|
1049
|
+
if (obj === undefined) {
|
|
1050
|
+
return undefined;
|
|
1051
|
+
}
|
|
1052
|
+
const result = {
|
|
1053
|
+
'key': obj.key,
|
|
1054
|
+
'operator': obj.operator,
|
|
1055
|
+
'values': obj.values?.map(y => y),
|
|
1056
|
+
};
|
|
1057
|
+
// filter undefined values
|
|
1058
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1059
|
+
}
|
|
1060
|
+
/**
|
|
1061
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions' to JSON representation.
|
|
1062
|
+
*/
|
|
1063
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1064
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions(obj) {
|
|
1065
|
+
if (obj === undefined) {
|
|
1066
|
+
return undefined;
|
|
1067
|
+
}
|
|
1068
|
+
const result = {
|
|
1069
|
+
'key': obj.key,
|
|
1070
|
+
'operator': obj.operator,
|
|
1071
|
+
'values': obj.values?.map(y => y),
|
|
1072
|
+
};
|
|
1073
|
+
// filter undefined values
|
|
1074
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1075
|
+
}
|
|
1076
|
+
/**
|
|
1077
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields' to JSON representation.
|
|
1078
|
+
*/
|
|
1079
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1080
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields(obj) {
|
|
1081
|
+
if (obj === undefined) {
|
|
1082
|
+
return undefined;
|
|
1083
|
+
}
|
|
1084
|
+
const result = {
|
|
1085
|
+
'key': obj.key,
|
|
1086
|
+
'operator': obj.operator,
|
|
1087
|
+
'values': obj.values?.map(y => y),
|
|
1088
|
+
};
|
|
1089
|
+
// filter undefined values
|
|
1090
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1091
|
+
}
|
|
1092
|
+
/**
|
|
1093
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector' to JSON representation.
|
|
1094
|
+
*/
|
|
1095
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1096
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj) {
|
|
1097
|
+
if (obj === undefined) {
|
|
1098
|
+
return undefined;
|
|
1099
|
+
}
|
|
1100
|
+
const result = {
|
|
1101
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions(y)),
|
|
1102
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
1103
|
+
};
|
|
1104
|
+
// filter undefined values
|
|
1105
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1106
|
+
}
|
|
1107
|
+
/**
|
|
1108
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector' to JSON representation.
|
|
1109
|
+
*/
|
|
1110
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1111
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj) {
|
|
1112
|
+
if (obj === undefined) {
|
|
1113
|
+
return undefined;
|
|
1114
|
+
}
|
|
1115
|
+
const result = {
|
|
1116
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions(y)),
|
|
1117
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
1118
|
+
};
|
|
1119
|
+
// filter undefined values
|
|
1120
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1121
|
+
}
|
|
1122
|
+
/**
|
|
1123
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions' to JSON representation.
|
|
1124
|
+
*/
|
|
1125
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1126
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(obj) {
|
|
1127
|
+
if (obj === undefined) {
|
|
1128
|
+
return undefined;
|
|
1129
|
+
}
|
|
1130
|
+
const result = {
|
|
1131
|
+
'key': obj.key,
|
|
1132
|
+
'operator': obj.operator,
|
|
1133
|
+
'values': obj.values?.map(y => y),
|
|
1134
|
+
};
|
|
1135
|
+
// filter undefined values
|
|
1136
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1137
|
+
}
|
|
1138
|
+
/**
|
|
1139
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions' to JSON representation.
|
|
1140
|
+
*/
|
|
1141
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1142
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions(obj) {
|
|
1143
|
+
if (obj === undefined) {
|
|
1144
|
+
return undefined;
|
|
1145
|
+
}
|
|
1146
|
+
const result = {
|
|
1147
|
+
'key': obj.key,
|
|
1148
|
+
'operator': obj.operator,
|
|
1149
|
+
'values': obj.values?.map(y => y),
|
|
1150
|
+
};
|
|
1151
|
+
// filter undefined values
|
|
1152
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1153
|
+
}
|
|
1154
|
+
/**
|
|
1155
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector' to JSON representation.
|
|
1156
|
+
*/
|
|
1157
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1158
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj) {
|
|
1159
|
+
if (obj === undefined) {
|
|
1160
|
+
return undefined;
|
|
1161
|
+
}
|
|
1162
|
+
const result = {
|
|
1163
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions(y)),
|
|
1164
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
1165
|
+
};
|
|
1166
|
+
// filter undefined values
|
|
1167
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1168
|
+
}
|
|
1169
|
+
/**
|
|
1170
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector' to JSON representation.
|
|
1171
|
+
*/
|
|
1172
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1173
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj) {
|
|
1174
|
+
if (obj === undefined) {
|
|
1175
|
+
return undefined;
|
|
1176
|
+
}
|
|
1177
|
+
const result = {
|
|
1178
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions(y)),
|
|
1179
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
1180
|
+
};
|
|
1181
|
+
// filter undefined values
|
|
1182
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1183
|
+
}
|
|
1184
|
+
/**
|
|
1185
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions' to JSON representation.
|
|
1186
|
+
*/
|
|
1187
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1188
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(obj) {
|
|
1189
|
+
if (obj === undefined) {
|
|
1190
|
+
return undefined;
|
|
1191
|
+
}
|
|
1192
|
+
const result = {
|
|
1193
|
+
'key': obj.key,
|
|
1194
|
+
'operator': obj.operator,
|
|
1195
|
+
'values': obj.values?.map(y => y),
|
|
1196
|
+
};
|
|
1197
|
+
// filter undefined values
|
|
1198
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1199
|
+
}
|
|
1200
|
+
/**
|
|
1201
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions' to JSON representation.
|
|
1202
|
+
*/
|
|
1203
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1204
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions(obj) {
|
|
1205
|
+
if (obj === undefined) {
|
|
1206
|
+
return undefined;
|
|
1207
|
+
}
|
|
1208
|
+
const result = {
|
|
1209
|
+
'key': obj.key,
|
|
1210
|
+
'operator': obj.operator,
|
|
1211
|
+
'values': obj.values?.map(y => y),
|
|
1212
|
+
};
|
|
1213
|
+
// filter undefined values
|
|
1214
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1215
|
+
}
|
|
1216
|
+
/**
|
|
1217
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions' to JSON representation.
|
|
1218
|
+
*/
|
|
1219
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1220
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions(obj) {
|
|
1221
|
+
if (obj === undefined) {
|
|
1222
|
+
return undefined;
|
|
1223
|
+
}
|
|
1224
|
+
const result = {
|
|
1225
|
+
'key': obj.key,
|
|
1226
|
+
'operator': obj.operator,
|
|
1227
|
+
'values': obj.values?.map(y => y),
|
|
1228
|
+
};
|
|
1229
|
+
// filter undefined values
|
|
1230
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1231
|
+
}
|
|
1232
|
+
/**
|
|
1233
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions' to JSON representation.
|
|
1234
|
+
*/
|
|
1235
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1236
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions(obj) {
|
|
1237
|
+
if (obj === undefined) {
|
|
1238
|
+
return undefined;
|
|
1239
|
+
}
|
|
1240
|
+
const result = {
|
|
1241
|
+
'key': obj.key,
|
|
1242
|
+
'operator': obj.operator,
|
|
1243
|
+
'values': obj.values?.map(y => y),
|
|
1244
|
+
};
|
|
1245
|
+
// filter undefined values
|
|
1246
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1247
|
+
}
|
|
1248
|
+
/**
|
|
1249
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions' to JSON representation.
|
|
1250
|
+
*/
|
|
1251
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1252
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions(obj) {
|
|
1253
|
+
if (obj === undefined) {
|
|
1254
|
+
return undefined;
|
|
1255
|
+
}
|
|
1256
|
+
const result = {
|
|
1257
|
+
'key': obj.key,
|
|
1258
|
+
'operator': obj.operator,
|
|
1259
|
+
'values': obj.values?.map(y => y),
|
|
1260
|
+
};
|
|
1261
|
+
// filter undefined values
|
|
1262
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1263
|
+
}
|
|
1264
|
+
/**
|
|
1265
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions' to JSON representation.
|
|
1266
|
+
*/
|
|
1267
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1268
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions(obj) {
|
|
1269
|
+
if (obj === undefined) {
|
|
1270
|
+
return undefined;
|
|
1271
|
+
}
|
|
1272
|
+
const result = {
|
|
1273
|
+
'key': obj.key,
|
|
1274
|
+
'operator': obj.operator,
|
|
1275
|
+
'values': obj.values?.map(y => y),
|
|
1276
|
+
};
|
|
1277
|
+
// filter undefined values
|
|
1278
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1279
|
+
}
|
|
1280
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlueWwuYmx1ZWR5bmFtaWNzLmV1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydHMvdmlueWwuYmx1ZWR5bmFtaWNzLmV1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNGQSx3REFRQztBQWtJRCxzREFzQkM7QUF3REQsc0VBWUM7QUE0QkQsb0VBUUM7QUF1QkQsc0VBT0M7QUFxQ0Qsc0VBU0M7QUFtQ0QsOEVBU0M7QUFtQ0QsMEVBU0M7QUF3REQsNERBWUM7QUE0QkQsZ0ZBUUM7QUE2Q0Qsd0VBU0M7QUFvQ0QsZ0VBU0M7QUE0QkQsb0VBUUM7QUE0Q0Qsb0VBVUM7QUE4QkQsNERBUUM7QUFrREQsOEdBV0M7QUEwREQsZ0ZBWUM7QUFxQkQsMEZBT0M7QUFxQkQsMEZBT0M7QUFxQkQsOEVBT0M7QUFzREQsZ0ZBV0M7QUFxREQsb0ZBU0M7QUFxQ0Qsd0ZBU0M7QUFtQ0Qsc0ZBU0M7QUFxQkQsd0dBT0M7QUE2QkQsc0dBUUM7QUFtQ0QsNEVBU0M7QUE2REQsa0ZBV0M7QUFnQ0Qsb0ZBUUM7QUFnTUQsNEVBcUJDO0FBNkVELG9HQVFDO0FBMENELGtHQVFDO0FBMENELDBHQVFDO0FBNkJELGtNQVFDO0FBeUJELGdNQU9DO0FBNkJELGdNQVFDO0FBdUZELDhMQVlDO0FBNkJELHdNQVFDO0FBdUZELHNNQVlDO0FBNEJELHNOQVFDO0FBOEJELGtPQVFDO0FBa0ZELDhOQVlDO0FBK0JELHdOQVFDO0FBa0NELGdPQVFDO0FBa0ZELHNPQVlDO0FBK0JELGdPQVFDO0FBa0NELHdPQVFDO0FBeUNELHNQQVNDO0FBeUNELDRPQVNDO0FBeUNELGtRQVNDO0FBeUNELHdQQVNDO0FBK0JELHdQQVFDO0FBa0NELGdRQVFDO0FBd0NELHdQQVNDO0FBd0NELGdRQVNDO0FBK0JELGdRQVFDO0FBa0NELHdRQVFDO0FBd0NELGdRQVNDO0FBd0NELHdRQVNDO0FBd0NELHdSQVNDO0FBd0NELGdTQVNDO0FBd0NELGdTQVNDO0FBd0NELHdT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QUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixVQUFVLEVBQUUsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUMxRCxhQUFhLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUssUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNKLGNBQWMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVks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LENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBb0NEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDhJQUE4SSxDQUFDLEdBQXdKO0lBQ3JULElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ2QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFDRCxvRkFBb0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgY2RrOHNcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBpT2JqZWN0TWV0YWRhdGEsIEdyb3VwVmVyc2lvbktpbmQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIFZpbnlsQ2FjaGUgaXMgdGhlIFNjaGVtYSBmb3IgdGhlIHZpbnlsY2FjaGVzIEFQSS5cbkl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIFZhcm5pc2ggY2FjaGUgY2x1c3RlcjogcmVwbGljYXMsIGJhY2tlbmRzLCBWQ0wgY29uZmlndXJhdGlvbixcbmNsdXN0ZXJpbmcsIGFuZCBjYWNoZSBpbnZhbGlkYXRpb24gc3RyYXRlZ3kuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlIGV4dGVuZHMgQXBpT2JqZWN0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwaVZlcnNpb24gYW5kIGtpbmQgZm9yIFwiVmlueWxDYWNoZVwiXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdWSzogR3JvdXBWZXJzaW9uS2luZCA9IHtcbiAgICBhcGlWZXJzaW9uOiAndmlueWwuYmx1ZWR5bmFtaWNzLmV1L3YxYWxwaGExJyxcbiAgICBraW5kOiAnVmlueWxDYWNoZScsXG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIEt1YmVybmV0ZXMgbWFuaWZlc3QgZm9yIFwiVmlueWxDYWNoZVwiLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlubGluZSByZXNvdXJjZSBtYW5pZmVzdHMgaW5zaWRlIG90aGVyIG9iamVjdHMgKGUuZy4gYXMgdGVtcGxhdGVzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIGluaXRpYWxpemF0aW9uIHByb3BzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1hbmlmZXN0KHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLlZpbnlsQ2FjaGUuR1ZLLFxuICAgICAgLi4udG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhwcm9wcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgXCJWaW55bENhY2hlXCIgQVBJIG9iamVjdFxuICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIG9iamVjdFxuICAgKiBAcGFyYW0gaWQgYSBzY29wZS1sb2NhbCBuYW1lIGZvciB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSBwcm9wcyBpbml0aWFsaXphdGlvbiBwcm9wc1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBvYmplY3QgdG8gS3ViZXJuZXRlcyBKU09OLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHRvSnNvbigpOiBhbnkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gc3VwZXIudG9Kc29uKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi50b0pzb25fVmlueWxDYWNoZVByb3BzKHJlc29sdmVkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVmlueWxDYWNoZSBpcyB0aGUgU2NoZW1hIGZvciB0aGUgdmlueWxjYWNoZXMgQVBJLlxuICogSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgVmFybmlzaCBjYWNoZSBjbHVzdGVyOiByZXBsaWNhcywgYmFja2VuZHMsIFZDTCBjb25maWd1cmF0aW9uLFxuICogY2x1c3RlcmluZywgYW5kIGNhY2hlIGludmFsaWRhdGlvbiBzdHJhdGVneS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlUHJvcHMge1xuICAvKipcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI21ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IEFwaU9iamVjdE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBzcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgdGhlIFZpbnlsQ2FjaGUgY2x1c3Rlci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI3NwZWNcbiAgICovXG4gIHJlYWRvbmx5IHNwZWM/OiBWaW55bENhY2hlU3BlYztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhvYmo6IFZpbnlsQ2FjaGVQcm9wcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21ldGFkYXRhJzogb2JqLm1ldGFkYXRhLFxuICAgICdzcGVjJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjKG9iai5zcGVjKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNwZWMgZGVmaW5lcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiB0aGUgVmlueWxDYWNoZSBjbHVzdGVyLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlYyB7XG4gIC8qKlxuICAgKiBiYWNrZW5kcyBkZWZpbmVzIHRoZSB1cHN0cmVhbSBzZXJ2aWNlcyBWYXJuaXNoIHdpbGwgcHJveHkgdG8uXG4gICAqIEF0IGxlYXN0IG9uZSBiYWNrZW5kIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2JhY2tlbmRzXG4gICAqL1xuICByZWFkb25seSBiYWNrZW5kczogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1tdO1xuXG4gIC8qKlxuICAgKiBjbHVzdGVyIGNvbmZpZ3VyZXMgVmFybmlzaCBjbHVzdGVyaW5nIGJldHdlZW4gcG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNjbHVzdGVyXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyPzogVmlueWxDYWNoZVNwZWNDbHVzdGVyO1xuXG4gIC8qKlxuICAgKiBkZWJvdW5jZSBjb25maWd1cmVzIGEgZ3JhY2UgcGVyaW9kIGJlZm9yZSBhcHBseWluZyBlbmRwb2ludCBjaGFuZ2VzIHRvIFZhcm5pc2gsXG4gICAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkIG9uIHJhcGlkIGVuZHBvaW50IGNodXJuLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RlYm91bmNlXG4gICAqL1xuICByZWFkb25seSBkZWJvdW5jZT86IFZpbnlsQ2FjaGVTcGVjRGVib3VuY2U7XG5cbiAgLyoqXG4gICAqIGRpcmVjdG9yIGNvbmZpZ3VyZXMgaG93IFZhcm5pc2ggZGlzdHJpYnV0ZXMgcmVxdWVzdHMgYWNyb3NzIGJhY2tlbmQgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RpcmVjdG9yXG4gICAqL1xuICByZWFkb25seSBkaXJlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3I7XG5cbiAgLyoqXG4gICAqIGltYWdlIGlzIHRoZSBjb250YWluZXIgaW1hZ2UgZm9yIHRoZSBWYXJuaXNoIHBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjaW1hZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGludmFsaWRhdGlvbiBjb25maWd1cmVzIGNhY2hlIGludmFsaWRhdGlvbiBtZXRob2RzIChQVVJHRSwgQkFOLCB4a2V5KS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNpbnZhbGlkYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWRhdGlvbj86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uO1xuXG4gIC8qKlxuICAgKiBtb25pdG9yaW5nIGNvbmZpZ3VyZXMgUHJvbWV0aGV1cyBtZXRyaWNzIGFuZCBhbGVydGluZyBydWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNtb25pdG9yaW5nXG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nPzogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nO1xuXG4gIC8qKlxuICAgKiBwb2QgY29uZmlndXJlcyBwb2QtbGV2ZWwgc2NoZWR1bGluZyBhbmQgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcG9kXG4gICAqL1xuICByZWFkb25seSBwb2Q/OiBWaW55bENhY2hlU3BlY1BvZDtcblxuICAvKipcbiAgICogcHJveHlQcm90b2NvbCBlbmFibGVzIFBST1hZIHByb3RvY29sIG9uIGEgZGVkaWNhdGVkIHBvcnQgZm9yIHBhc3NpbmcgY2xpZW50IElQLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Byb3h5UHJvdG9jb2xcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5UHJvdG9jb2w/OiBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2w7XG5cbiAgLyoqXG4gICAqIHJlcGxpY2FzIGlzIHRoZSBkZXNpcmVkIG51bWJlciBvZiBWYXJuaXNoIHBvZHMgaW4gdGhlIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcmVwbGljYXNcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHJlc291cmNlcyBzZXRzIENQVSBhbmQgbWVtb3J5IHJlcXVlc3RzL2xpbWl0cyBmb3IgdGhlIFZhcm5pc2ggY29udGFpbmVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Jlc291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzPzogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXM7XG5cbiAgLyoqXG4gICAqIHJldHJ5IGNvbmZpZ3VyZXMgcmV0cnkgYmVoYXZpb3VyIHdoZW4gVkNMIHVwZGF0ZXMgZmFpbCB0byBhcHBseS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNyZXRyeVxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnk/OiBWaW55bENhY2hlU3BlY1JldHJ5O1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlIGNvbmZpZ3VyZXMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSBjcmVhdGVkIGZvciB0cmFmZmljIGluZ3Jlc3MuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjc2VydmljZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZT86IFZpbnlsQ2FjaGVTcGVjU2VydmljZTtcblxuICAvKipcbiAgICogc3RvcmFnZSBjb25maWd1cmVzIG9uZSBvciBtb3JlIFZhcm5pc2ggc3RvcmFnZSBiYWNrZW5kcyAobWFsbG9jIG9yIGZpbGUpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3N0b3JhZ2VcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2U/OiBWaW55bENhY2hlU3BlY1N0b3JhZ2VbXTtcblxuICAvKipcbiAgICogdmFybmlzaFBhcmFtZXRlcnMgYXJlIHJ1bnRpbWUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdmFybmlzaGQgdmlhIC1wIGZsYWdzLlxuICAgKiBDZXJ0YWluIHNlY3VyaXR5LXNlbnNpdGl2ZSBwYXJhbWV0ZXJzIGFyZSBibG9ja2VkIGJ5IHRoZSBhZG1pc3Npb24gd2ViaG9vay5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyN2YXJuaXNoUGFyYW1ldGVyc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFybmlzaFBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB2Y2wgY29uZmlndXJlcyBWQ0wgZ2VuZXJhdGlvbjogc25pcHBldHMgaW5qZWN0ZWQgaW50byBnZW5lcmF0ZWQgVkNMIHN1YnJvdXRpbmVzLFxuICAgKiBvciBhIGZ1bGwgVkNMIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3ZjbFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsPzogVmlueWxDYWNoZVNwZWNWY2w7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjKG9iajogVmlueWxDYWNoZVNwZWMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYWNrZW5kcyc6IG9iai5iYWNrZW5kcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHMoeSkpLFxuICAgICdjbHVzdGVyJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlcihvYmouY2x1c3RlciksXG4gICAgJ2RlYm91bmNlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGVib3VuY2Uob2JqLmRlYm91bmNlKSxcbiAgICAnZGlyZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvcihvYmouZGlyZWN0b3IpLFxuICAgICdpbWFnZSc6IG9iai5pbWFnZSxcbiAgICAnaW52YWxpZGF0aW9uJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uKG9iai5pbnZhbGlkYXRpb24pLFxuICAgICdtb25pdG9yaW5nJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyhvYmoubW9uaXRvcmluZyksXG4gICAgJ3BvZCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZChvYmoucG9kKSxcbiAgICAncHJveHlQcm90b2NvbCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wob2JqLnByb3h5UHJvdG9jb2wpLFxuICAgICdyZXBsaWNhcyc6IG9iai5yZXBsaWNhcyxcbiAgICAncmVzb3VyY2VzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzKG9iai5yZXNvdXJjZXMpLFxuICAgICdyZXRyeSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1JldHJ5KG9iai5yZXRyeSksXG4gICAgJ3NlcnZpY2UnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNTZXJ2aWNlKG9iai5zZXJ2aWNlKSxcbiAgICAnc3RvcmFnZSc6IG9iai5zdG9yYWdlPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNTdG9yYWdlKHkpKSxcbiAgICAndmFybmlzaFBhcmFtZXRlcnMnOiAoKG9iai52YXJuaXNoUGFyYW1ldGVycykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnZhcm5pc2hQYXJhbWV0ZXJzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAndmNsJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVmNsKG9iai52Y2wpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQmFja2VuZFNwZWMgZGVzY3JpYmVzIGFuIHVwc3RyZWFtIEt1YmVybmV0ZXMgc2VydmljZSB1c2VkIGFzIGEgVmFybmlzaCBiYWNrZW5kLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMge1xuICAvKipcbiAgICogY29ubmVjdGlvblBhcmFtZXRlcnMgY29uZmlndXJlcyBiYWNrZW5kIGNvbm5lY3Rpb24gcG9vbCB0aW1lb3V0cyBhbmQgbGltaXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjY29ubmVjdGlvblBhcmFtZXRlcnNcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25QYXJhbWV0ZXJzPzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzO1xuXG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBWQ0wgaWRlbnRpZmllciBmb3IgdGhpcyBiYWNrZW5kLiBNdXN0IG1hdGNoIF5bYS16QS1aXVthLXpBLVowLTlfXSokLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBwb3J0IG92ZXJyaWRlcyB0aGUgc2VydmljZSBwb3J0IHVzZWQgZm9yIHRoaXMgYmFja2VuZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3BvcnRcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHByb2JlIGNvbmZpZ3VyZXMgdGhlIFZhcm5pc2ggYmFja2VuZCBoZWFsdGggcHJvYmUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kcyNwcm9iZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmU/OiBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmU7XG5cbiAgLyoqXG4gICAqIHNlcnZpY2VSZWYgcmVmZXJlbmNlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGluIHRoZSBzYW1lIG5hbWVzcGFjZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3NlcnZpY2VSZWZcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VSZWY6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmO1xuXG4gIC8qKlxuICAgKiB3ZWlnaHQgaXMgdGhlIHJlbGF0aXZlIHdlaWdodCBmb3IgdGhlIGRpcmVjdG9yLiAwIG1lYW5zIHN0YW5kYnkgKGZhbGxiYWNrIGRpcmVjdG9yKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3dlaWdodFxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHMob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29ubmVjdGlvblBhcmFtZXRlcnMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzKG9iai5jb25uZWN0aW9uUGFyYW1ldGVycyksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAncG9ydCc6IG9iai5wb3J0LFxuICAgICdwcm9iZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUob2JqLnByb2JlKSxcbiAgICAnc2VydmljZVJlZic6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZihvYmouc2VydmljZVJlZiksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBjbHVzdGVyIGNvbmZpZ3VyZXMgVmFybmlzaCBjbHVzdGVyaW5nIGJldHdlZW4gcG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciB7XG4gIC8qKlxuICAgKiBlbmFibGVkIGFjdGl2YXRlcyBpbnRlci1wb2QgY2x1c3RlcmluZyB2aWEgYSBzaGFyZCBkaXJlY3Rvci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXIjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHBlZXJSb3V0aW5nIGNvbmZpZ3VyZXMgaG93IHJlcXVlc3RzIGFyZSByb3V0ZWQgYmV0d2VlbiBWYXJuaXNoIHBlZXJzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciNwZWVyUm91dGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgcGVlclJvdXRpbmc/OiBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNDbHVzdGVyJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlcihvYmo6IFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncGVlclJvdXRpbmcnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmcob2JqLnBlZXJSb3V0aW5nKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRlYm91bmNlIGNvbmZpZ3VyZXMgYSBncmFjZSBwZXJpb2QgYmVmb3JlIGFwcGx5aW5nIGVuZHBvaW50IGNoYW5nZXMgdG8gVmFybmlzaCxcbiAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkIG9uIHJhcGlkIGVuZHBvaW50IGNodXJuLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEZWJvdW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjRGVib3VuY2Uge1xuICAvKipcbiAgICogZHVyYXRpb24gaXMgdGhlIHRpbWUgdG8gd2FpdCBhZnRlciB0aGUgbGFzdCBlbmRwb2ludCBjaGFuZ2UgYmVmb3JlIHB1c2hpbmcgYSBWQ0wgdXBkYXRlLlxuICAgKiBUaGlzIHByZXZlbnRzIHRodW5kZXJpbmctaGVyZCBvbiByYXBpZCBlbmRwb2ludCBjaHVybi4gRGVmYXVsdDogNXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEZWJvdW5jZSNkdXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZHVyYXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGVib3VuY2UnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEZWJvdW5jZShvYmo6IFZpbnlsQ2FjaGVTcGVjRGVib3VuY2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkdXJhdGlvbic6IG9iai5kdXJhdGlvbixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRpcmVjdG9yIGNvbmZpZ3VyZXMgaG93IFZhcm5pc2ggZGlzdHJpYnV0ZXMgcmVxdWVzdHMgYWNyb3NzIGJhY2tlbmQgZW5kcG9pbnRzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3Ige1xuICAvKipcbiAgICogaGFzaCBjb25maWd1cmVzIHRoZSBoYXNoIGRpcmVjdG9yLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwiaGFzaFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3IjaGFzaFxuICAgKi9cbiAgcmVhZG9ubHkgaGFzaD86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoO1xuXG4gIC8qKlxuICAgKiBzaGFyZCBjb25maWd1cmVzIHRoZSBzaGFyZCBkaXJlY3RvciAoY29uc2lzdGVudC1oYXNoKS4gT25seSB1c2VkIHdoZW4gdHlwZSBpcyBcInNoYXJkXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvciNzaGFyZFxuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmQ/OiBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQ7XG5cbiAgLyoqXG4gICAqIHR5cGUgc2VsZWN0cyB0aGUgVmFybmlzaCBkaXJlY3RvciBhbGdvcml0aG0uXG4gICAqIFwic2hhcmRcIiAoZGVmYXVsdCkgcHJvdmlkZXMgY29uc2lzdGVudCBoYXNoaW5nOyBcInJvdW5kX3JvYmluXCIsIFwicmFuZG9tXCIsIGFuZCBcImhhc2hcIlxuICAgKiBhcmUgYWxzbyBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvciN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoYXNoJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoKG9iai5oYXNoKSxcbiAgICAnc2hhcmQnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkKG9iai5zaGFyZCksXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGludmFsaWRhdGlvbiBjb25maWd1cmVzIGNhY2hlIGludmFsaWRhdGlvbiBtZXRob2RzIChQVVJHRSwgQkFOLCB4a2V5KS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb24ge1xuICAvKipcbiAgICogYmFuIGNvbmZpZ3VyZXMgQkFOLWJhc2VkIGNhY2hlIGludmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbiNiYW5cbiAgICovXG4gIHJlYWRvbmx5IGJhbj86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuO1xuXG4gIC8qKlxuICAgKiBwdXJnZSBjb25maWd1cmVzIEhUVFAgUFVSR0UtYmFzZWQgY2FjaGUgaW52YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uI3B1cmdlXG4gICAqL1xuICByZWFkb25seSBwdXJnZT86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2U7XG5cbiAgLyoqXG4gICAqIHhrZXkgY29uZmlndXJlcyB4a2V5LWJhc2VkIHN1cnJvZ2F0ZSBrZXkgaW52YWxpZGF0aW9uIChyZXF1aXJlcyB2bW9kX3hrZXkpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uI3hrZXlcbiAgICovXG4gIHJlYWRvbmx5IHhrZXk/OiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uKG9iajogVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYW4nOiB0b0pzb25fVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4ob2JqLmJhbiksXG4gICAgJ3B1cmdlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Uob2JqLnB1cmdlKSxcbiAgICAneGtleSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkob2JqLnhrZXkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogbW9uaXRvcmluZyBjb25maWd1cmVzIFByb21ldGhldXMgbWV0cmljcyBhbmQgYWxlcnRpbmcgcnVsZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY01vbml0b3Jpbmcge1xuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgUHJvbWV0aGV1cyBtZXRyaWNzIHNjcmFwaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogcHJvbWV0aGV1c1J1bGVzIGNvbmZpZ3VyZXMgUHJvbWV0aGV1c1J1bGUgb2JqZWN0cyBmb3IgYWxlcnRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nI3Byb21ldGhldXNSdWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcHJvbWV0aGV1c1J1bGVzPzogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzO1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlTW9uaXRvciBjb25maWd1cmVzIGEgU2VydmljZU1vbml0b3IgZm9yIFByb21ldGhldXMgT3BlcmF0b3Igc2NyYXBpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nI3NlcnZpY2VNb25pdG9yXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTW9uaXRvcj86IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY01vbml0b3JpbmcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nKG9iajogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdwcm9tZXRoZXVzUnVsZXMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzKG9iai5wcm9tZXRoZXVzUnVsZXMpLFxuICAgICdzZXJ2aWNlTW9uaXRvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvcihvYmouc2VydmljZU1vbml0b3IpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcG9kIGNvbmZpZ3VyZXMgcG9kLWxldmVsIHNjaGVkdWxpbmcgYW5kIG1ldGFkYXRhLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZCB7XG4gIC8qKlxuICAgKiBhZmZpbml0eSBjb25maWd1cmVzIHBvZCBhZmZpbml0eSBhbmQgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2FmZmluaXR5XG4gICAqL1xuICByZWFkb25seSBhZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHk7XG5cbiAgLyoqXG4gICAqIGFubm90YXRpb25zIGFyZSBhZGRlZCB0byBlYWNoIFZhcm5pc2ggcG9kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2Fubm90YXRpb25zXG4gICAqL1xuICByZWFkb25seSBhbm5vdGF0aW9ucz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIGxhYmVscyBhcmUgYWRkZWQgdG8gZWFjaCBWYXJuaXNoIHBvZCAobWVyZ2VkIHdpdGggb3BlcmF0b3ItbWFuYWdlZCBsYWJlbHMpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2xhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogbm9kZVNlbGVjdG9yIGNvbnN0cmFpbnMgcG9kcyB0byBub2RlcyBtYXRjaGluZyBhbGwgc3BlY2lmaWVkIGxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCNub2RlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5vZGVTZWxlY3Rvcj86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIHByaW9yaXR5Q2xhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBQcmlvcml0eUNsYXNzIGZvciBWYXJuaXNoIHBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2QjcHJpb3JpdHlDbGFzc05hbWVcbiAgICovXG4gIHJlYWRvbmx5IHByaW9yaXR5Q2xhc3NOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB0b2xlcmF0aW9ucyBhbGxvdyBwb2RzIHRvIGJlIHNjaGVkdWxlZCBvbiB0YWludGVkIG5vZGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI3RvbGVyYXRpb25zXG4gICAqL1xuICByZWFkb25seSB0b2xlcmF0aW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2QnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2Qob2JqOiBWaW55bENhY2hlU3BlY1BvZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FmZmluaXR5JzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHkob2JqLmFmZmluaXR5KSxcbiAgICAnYW5ub3RhdGlvbnMnOiAoKG9iai5hbm5vdGF0aW9ucykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmFubm90YXRpb25zKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbGFiZWxzJzogKChvYmoubGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbm9kZVNlbGVjdG9yJzogKChvYmoubm9kZVNlbGVjdG9yKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubm9kZVNlbGVjdG9yKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAncHJpb3JpdHlDbGFzc05hbWUnOiBvYmoucHJpb3JpdHlDbGFzc05hbWUsXG4gICAgJ3RvbGVyYXRpb25zJzogb2JqLnRvbGVyYXRpb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyh5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwcm94eVByb3RvY29sIGVuYWJsZXMgUFJPWFkgcHJvdG9jb2wgb24gYSBkZWRpY2F0ZWQgcG9ydCBmb3IgcGFzc2luZyBjbGllbnQgSVAuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2xcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wge1xuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgUFJPWFkgcHJvdG9jb2wgc3VwcG9ydC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHBvcnQgaXMgdGhlIHBvcnQgb24gd2hpY2ggUFJPWFkgcHJvdG9jb2wgY29ubmVjdGlvbnMgYXJlIGFjY2VwdGVkLiBEZWZhdWx0OiA4MDgxLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUHJveHlQcm90b2NvbCNwb3J0XG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sKG9iajogVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdwb3J0Jzogb2JqLnBvcnQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiByZXNvdXJjZXMgc2V0cyBDUFUgYW5kIG1lbW9yeSByZXF1ZXN0cy9saW1pdHMgZm9yIHRoZSBWYXJuaXNoIGNvbnRhaW5lci5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMge1xuICAvKipcbiAgICogQ2xhaW1zIGxpc3RzIHRoZSBuYW1lcyBvZiByZXNvdXJjZXMsIGRlZmluZWQgaW4gc3BlYy5yZXNvdXJjZUNsYWltcyxcbiAgICogdGhhdCBhcmUgdXNlZCBieSB0aGlzIGNvbnRhaW5lci5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBkZXBlbmRzIG9uIHRoZVxuICAgKiBEeW5hbWljUmVzb3VyY2VBbGxvY2F0aW9uIGZlYXR1cmUgZ2F0ZS5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBpcyBpbW11dGFibGUuIEl0IGNhbiBvbmx5IGJlIHNldCBmb3IgY29udGFpbmVycy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlcyNjbGFpbXNcbiAgICovXG4gIHJlYWRvbmx5IGNsYWltcz86IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zW107XG5cbiAgLyoqXG4gICAqIExpbWl0cyBkZXNjcmliZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGNvbXB1dGUgcmVzb3VyY2VzIGFsbG93ZWQuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvY29uZmlndXJhdGlvbi9tYW5hZ2UtcmVzb3VyY2VzLWNvbnRhaW5lcnMvXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMjbGltaXRzXG4gICAqL1xuICByZWFkb25seSBsaW1pdHM/OiB7IFtrZXk6IHN0cmluZ106IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzIH07XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGRlc2NyaWJlcyB0aGUgbWluaW11bSBhbW91bnQgb2YgY29tcHV0ZSByZXNvdXJjZXMgcmVxdWlyZWQuXG4gICAqIElmIFJlcXVlc3RzIGlzIG9taXR0ZWQgZm9yIGEgY29udGFpbmVyLCBpdCBkZWZhdWx0cyB0byBMaW1pdHMgaWYgdGhhdCBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCxcbiAgICogb3RoZXJ3aXNlIHRvIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdmFsdWUuIFJlcXVlc3RzIGNhbm5vdCBleGNlZWQgTGltaXRzLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL2NvbmZpZ3VyYXRpb24vbWFuYWdlLXJlc291cmNlcy1jb250YWluZXJzL1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzI3JlcXVlc3RzXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0cz86IHsgW2tleTogc3RyaW5nXTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1Jlc291cmNlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1Jlc291cmNlcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2xhaW1zJzogb2JqLmNsYWltcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zKHkpKSxcbiAgICAnbGltaXRzJzogKChvYmoubGltaXRzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubGltaXRzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXT8udmFsdWUgfSksIHt9KSksXG4gICAgJ3JlcXVlc3RzJzogKChvYmoucmVxdWVzdHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5yZXF1ZXN0cykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/LnZhbHVlIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcmV0cnkgY29uZmlndXJlcyByZXRyeSBiZWhhdmlvdXIgd2hlbiBWQ0wgdXBkYXRlcyBmYWlsIHRvIGFwcGx5LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXRyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUmV0cnkge1xuICAvKipcbiAgICogYmFja29mZkJhc2UgaXMgdGhlIGluaXRpYWwgYmFja29mZiBkdXJhdGlvbiBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzLiBEZWZhdWx0OiA1cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1JldHJ5I2JhY2tvZmZCYXNlXG4gICAqL1xuICByZWFkb25seSBiYWNrb2ZmQmFzZT86IHN0cmluZztcblxuICAvKipcbiAgICogYmFja29mZk1heCBpcyB0aGUgbWF4aW11bSBiYWNrb2ZmIGR1cmF0aW9uIChleHBvbmVudGlhbCBiYWNrb2ZmIGNhcCkuIERlZmF1bHQ6IDVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmV0cnkjYmFja29mZk1heFxuICAgKi9cbiAgcmVhZG9ubHkgYmFja29mZk1heD86IHN0cmluZztcblxuICAvKipcbiAgICogbWF4QXR0ZW1wdHMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIFZDTCBwdXNoIGF0dGVtcHRzIGJlZm9yZSB0aGUgb3BlcmF0b3JcbiAgICogdHJhbnNpdGlvbnMgdG8gRXJyb3IgcGhhc2UuIERlZmF1bHQ6IDMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXRyeSNtYXhBdHRlbXB0c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUmV0cnknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNSZXRyeShvYmo6IFZpbnlsQ2FjaGVTcGVjUmV0cnkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYWNrb2ZmQmFzZSc6IG9iai5iYWNrb2ZmQmFzZSxcbiAgICAnYmFja29mZk1heCc6IG9iai5iYWNrb2ZmTWF4LFxuICAgICdtYXhBdHRlbXB0cyc6IG9iai5tYXhBdHRlbXB0cyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlcnZpY2UgY29uZmlndXJlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGNyZWF0ZWQgZm9yIHRyYWZmaWMgaW5ncmVzcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjU2VydmljZSB7XG4gIC8qKlxuICAgKiBhbm5vdGF0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIFNlcnZpY2Ugb2JqZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZSNhbm5vdGF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYW5ub3RhdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB0eXBlIHNldHMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSB0eXBlIChDbHVzdGVySVAsIE5vZGVQb3J0LCBMb2FkQmFsYW5jZXIpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZSN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVmlueWxDYWNoZVNwZWNTZXJ2aWNlVHlwZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNTZXJ2aWNlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjU2VydmljZShvYmo6IFZpbnlsQ2FjaGVTcGVjU2VydmljZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Fubm90YXRpb25zJzogKChvYmouYW5ub3RhdGlvbnMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5hbm5vdGF0aW9ucykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFN0b3JhZ2VTcGVjIGNvbmZpZ3VyZXMgYSBWYXJuaXNoIHN0b3JhZ2UgYmFja2VuZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBpbnRlcm5hbCBzdG9yYWdlIGlkZW50aWZpZXIgdXNlZCBpbiB2YXJuaXNoZCAtcyBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogcGF0aCBpcyB0aGUgZmlsZXN5c3RlbSBwYXRoIGZvciBmaWxlLXR5cGUgc3RvcmFnZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2UjcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogc2l6ZSBpcyB0aGUgc3RvcmFnZSBhbGxvY2F0aW9uIGFzIGEgS3ViZXJuZXRlcyByZXNvdXJjZSBxdWFudGl0eSAoZS5nLiBcIjFHaVwiKS5cbiAgICogVGhlIG9wZXJhdG9yIGNvbnZlcnRzIHRvIGJ5dGVzIGZvciB2YXJuaXNoZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2Ujc2l6ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2l6ZT86IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemU7XG5cbiAgLyoqXG4gICAqIHR5cGUgaXMgdGhlIHN0b3JhZ2UgYmFja2VuZCB0eXBlLiBPbmx5IFwibWFsbG9jXCIgYW5kIFwiZmlsZVwiIGFyZSBwZXJtaXR0ZWQuXG4gICAqIFwicGVyc2lzdGVudFwiLCBcInVtZW1cIiwgYW5kIFwiZGVmYXVsdFwiIGFyZSByZWplY3RlZCBieSB0aGUgYWRtaXNzaW9uIHdlYmhvb2suXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjU3RvcmFnZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1N0b3JhZ2Uob2JqOiBWaW55bENhY2hlU3BlY1N0b3JhZ2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3BhdGgnOiBvYmoucGF0aCxcbiAgICAnc2l6ZSc6IG9iai5zaXplPy52YWx1ZSxcbiAgICAndHlwZSc6IG9iai50eXBlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogdmNsIGNvbmZpZ3VyZXMgVkNMIGdlbmVyYXRpb246IHNuaXBwZXRzIGluamVjdGVkIGludG8gZ2VuZXJhdGVkIFZDTCBzdWJyb3V0aW5lcyxcbiAqIG9yIGEgZnVsbCBWQ0wgb3ZlcnJpZGUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjVmNsIHtcbiAgLyoqXG4gICAqIGZ1bGxPdmVycmlkZSByZXBsYWNlcyB0aGUgZW50aXJlIGdlbmVyYXRlZCBWQ0wgd2l0aCBhIGN1c3RvbSBWQ0wgc3RyaW5nLlxuICAgKiBVc2Ugd2l0aCBjYXV0aW9uIOKAlCB0aGlzIGRpc2FibGVzIGFsbCBzdHJ1Y3R1cmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2wjZnVsbE92ZXJyaWRlXG4gICAqL1xuICByZWFkb25seSBmdWxsT3ZlcnJpZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNuaXBwZXRzIHByb3ZpZGVzIFZDTCBjb2RlIGluamVjdGVkIGludG8gZWFjaCBnZW5lcmF0ZWQgc3Vicm91dGluZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbCNzbmlwcGV0c1xuICAgKi9cbiAgcmVhZG9ubHkgc25pcHBldHM/OiBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1ZjbCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1ZjbChvYmo6IFZpbnlsQ2FjaGVTcGVjVmNsIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZnVsbE92ZXJyaWRlJzogb2JqLmZ1bGxPdmVycmlkZSxcbiAgICAnc25pcHBldHMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyhvYmouc25pcHBldHMpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY29ubmVjdGlvblBhcmFtZXRlcnMgY29uZmlndXJlcyBiYWNrZW5kIGNvbm5lY3Rpb24gcG9vbCB0aW1lb3V0cyBhbmQgbGltaXRzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzIHtcbiAgLyoqXG4gICAqIGJldHdlZW5CeXRlc1RpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGJldHdlZW4gYnl0ZXMgb2YgdGhlIHJlc3BvbnNlIGJvZHkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2JldHdlZW5CeXRlc1RpbWVvdXRcbiAgICovXG4gIHJlYWRvbmx5IGJldHdlZW5CeXRlc1RpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGNvbm5lY3RUaW1lb3V0IGlzIHRoZSBtYXhpbXVtIHRpbWUgdG8gZXN0YWJsaXNoIGEgVENQIGNvbm5lY3Rpb24gdG8gdGhlIGJhY2tlbmQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2Nvbm5lY3RUaW1lb3V0XG4gICAqL1xuICByZWFkb25seSBjb25uZWN0VGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogZmlyc3RCeXRlVGltZW91dCBpcyB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXNwb25zZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzQ29ubmVjdGlvblBhcmFtZXRlcnMjZmlyc3RCeXRlVGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgZmlyc3RCeXRlVGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogaWRsZVRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSBhbiBpZGxlIGNvbm5lY3Rpb24gbWF5IGJlIHJldXNlZC4gU2hvdWxkIGJlIGxlc3NcbiAgICogdGhhbiB0aGUgYmFja2VuZCdzIGtlZXAtYWxpdmUgdGltZW91dCB0byBhdm9pZCA1MDMgcmFjZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2lkbGVUaW1lb3V0XG4gICAqL1xuICByZWFkb25seSBpZGxlVGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogbWF4Q29ubmVjdGlvbnMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgY29ubmVjdGlvbnMgdG8gdGhlIGJhY2tlbmQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI21heENvbm5lY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBtYXhDb25uZWN0aW9ucz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyhvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2JldHdlZW5CeXRlc1RpbWVvdXQnOiBvYmouYmV0d2VlbkJ5dGVzVGltZW91dCxcbiAgICAnY29ubmVjdFRpbWVvdXQnOiBvYmouY29ubmVjdFRpbWVvdXQsXG4gICAgJ2ZpcnN0Qnl0ZVRpbWVvdXQnOiBvYmouZmlyc3RCeXRlVGltZW91dCxcbiAgICAnaWRsZVRpbWVvdXQnOiBvYmouaWRsZVRpbWVvdXQsXG4gICAgJ21heENvbm5lY3Rpb25zJzogb2JqLm1heENvbm5lY3Rpb25zLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcHJvYmUgY29uZmlndXJlcyB0aGUgVmFybmlzaCBiYWNrZW5kIGhlYWx0aCBwcm9iZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSB7XG4gIC8qKlxuICAgKiBleHBlY3RlZFJlc3BvbnNlIGlzIHRoZSBleHBlY3RlZCBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlLiBEZWZhdWx0cyB0byAyMDAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDIwMC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUjZXhwZWN0ZWRSZXNwb25zZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZWN0ZWRSZXNwb25zZT86IG51bWJlcjtcblxuICAvKipcbiAgICogaW50ZXJ2YWwgaXMgaG93IG9mdGVuIHRvIHByb2JlIHRoZSBiYWNrZW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSNpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHRocmVzaG9sZCBpcyB0aGUgbWluaW11bSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBwcm9iZXMgd2l0aGluIHRoZSB3aW5kb3cgZm9yIHRoZSBiYWNrZW5kXG4gICAqIHRvIGJlIGNvbnNpZGVyZWQgaGVhbHRoeS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUjdGhyZXNob2xkXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGZvciBhIHByb2JlIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSN0aW1lb3V0XG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB1cmwgaXMgdGhlIFVSTCB0byBwcm9iZS4gSWYgZW1wdHksIHRoZSBiYWNrZW5kJ3Mgcm9vdCBwYXRoIGlzIHVzZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI3VybFxuICAgKi9cbiAgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB3aW5kb3cgaXMgdGhlIG51bWJlciBvZiBtb3N0IHJlY2VudCBwcm9iZXMgdG8gY29uc2lkZXIgZm9yIHRocmVzaG9sZCBldmFsdWF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSN3aW5kb3dcbiAgICovXG4gIHJlYWRvbmx5IHdpbmRvdz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZShvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2V4cGVjdGVkUmVzcG9uc2UnOiBvYmouZXhwZWN0ZWRSZXNwb25zZSxcbiAgICAnaW50ZXJ2YWwnOiBvYmouaW50ZXJ2YWwsXG4gICAgJ3RocmVzaG9sZCc6IG9iai50aHJlc2hvbGQsXG4gICAgJ3RpbWVvdXQnOiBvYmoudGltZW91dCxcbiAgICAndXJsJzogb2JqLnVybCxcbiAgICAnd2luZG93Jzogb2JqLndpbmRvdyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlcnZpY2VSZWYgcmVmZXJlbmNlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGluIHRoZSBzYW1lIG5hbWVzcGFjZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWYge1xuICAvKipcbiAgICogbmFtZSBpcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIG5hbWUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWYjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZihvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcGVlclJvdXRpbmcgY29uZmlndXJlcyBob3cgcmVxdWVzdHMgYXJlIHJvdXRlZCBiZXR3ZWVuIFZhcm5pc2ggcGVlcnMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nIHtcbiAgLyoqXG4gICAqIHR5cGUgaXMgdGhlIHJvdXRpbmcgc3RyYXRlZ3kgYmV0d2VlbiBWYXJuaXNoIHBvZHMuIE9ubHkgXCJzaGFyZFwiIGlzIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZyN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmdUeXBlO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZyhvYmo6IFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAndHlwZSc6IG9iai50eXBlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogaGFzaCBjb25maWd1cmVzIHRoZSBoYXNoIGRpcmVjdG9yLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwiaGFzaFwiLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaCB7XG4gIC8qKlxuICAgKiBoZWFkZXIgaXMgdGhlIHJlcXVlc3QgaGVhZGVyIG5hbWUgdXNlZCBhcyB0aGUgaGFzaCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2gjaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBoZWFkZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoKG9iajogVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2ggfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoZWFkZXInOiBvYmouaGVhZGVyLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2hhcmQgY29uZmlndXJlcyB0aGUgc2hhcmQgZGlyZWN0b3IgKGNvbnNpc3RlbnQtaGFzaCkuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJzaGFyZFwiLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkIHtcbiAgLyoqXG4gICAqIGJ5IGRldGVybWluZXMgd2hhdCB2YWx1ZSBpcyBoYXNoZWQgZm9yIHNoYXJkIHNlbGVjdGlvbi4gXCJIQVNIXCIgdXNlcyB0aGUgVmFybmlzaFxuICAgKiBoYXNoIChkZWZhdWx0KTsgXCJVUkxcIiB1c2VzIHRoZSByZXF1ZXN0IFVSTC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjYnlcbiAgICovXG4gIHJlYWRvbmx5IGJ5PzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkQnk7XG5cbiAgLyoqXG4gICAqIGhlYWx0aHkgY29udHJvbHMgd2hpY2ggYmFja2VuZHMgdGhlIGRpcmVjdG9yIGNvbnNpZGVycyB3aGVuIHNlbGVjdGluZyBhIHNoYXJkLlxuICAgKiBcIkNIT1NFTlwiIChkZWZhdWx0KSBvbmx5IGNvbnNpZGVycyB0aGUgY2hvc2VuIGJhY2tlbmQgaGVhbHRoeTsgXCJBTExcIiByZXF1aXJlcyBhbGxcbiAgICogYmFja2VuZHMgdG8gYmUgaGVhbHRoeS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjaGVhbHRoeVxuICAgKi9cbiAgcmVhZG9ubHkgaGVhbHRoeT86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZEhlYWx0aHk7XG5cbiAgLyoqXG4gICAqIHJhbXB1cCBpcyB0aGUgdGltZSBhZnRlciBhZGRpbmcgYSBiYWNrZW5kIGJlZm9yZSBpdCByZWNlaXZlcyBpdHMgZnVsbCBzaGFyZSBvZiB0cmFmZmljLFxuICAgKiBwcmV2ZW50aW5nIHRodW5kZXJpbmctaGVyZC4gRGVmYXVsdDogMzBzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCNyYW1wdXBcbiAgICovXG4gIHJlYWRvbmx5IHJhbXB1cD86IHN0cmluZztcblxuICAvKipcbiAgICogcmVwbGljYXMgaXMgdGhlIG51bWJlciBvZiBLZXRhbWEgcmVwbGljYXMgcGVyIGJhY2tlbmQgaW4gdGhlIGhhc2ggcmluZy4gRGVmYXVsdDogNjcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkI3JlcGxpY2FzXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhcz86IG51bWJlcjtcblxuICAvKipcbiAgICogd2FybXVwIGlzIHRoZSBwcm9wb3J0aW9uIG9mIHJlcXVlc3RzICgwLjDigJMxLjApIHNlbnQgdG8gdGhlIGFsdGVybmF0aXZlIGJhY2tlbmRcbiAgICogdG8gcHJlLXBvcHVsYXRlIGl0cyBjYWNoZS4gRGVmYXVsdDogMC4xLiBNdXN0IGJlIGJldHdlZW4gMC4wIGFuZCAxLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkI3dhcm11cFxuICAgKi9cbiAgcmVhZG9ubHkgd2FybXVwPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkKG9iajogVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYnknOiBvYmouYnksXG4gICAgJ2hlYWx0aHknOiBvYmouaGVhbHRoeSxcbiAgICAncmFtcHVwJzogb2JqLnJhbXB1cCxcbiAgICAncmVwbGljYXMnOiBvYmoucmVwbGljYXMsXG4gICAgJ3dhcm11cCc6IG9iai53YXJtdXAsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiB0eXBlIHNlbGVjdHMgdGhlIFZhcm5pc2ggZGlyZWN0b3IgYWxnb3JpdGhtLlxuICogXCJzaGFyZFwiIChkZWZhdWx0KSBwcm92aWRlcyBjb25zaXN0ZW50IGhhc2hpbmc7IFwicm91bmRfcm9iaW5cIiwgXCJyYW5kb21cIiwgYW5kIFwiaGFzaFwiXG4gKiBhcmUgYWxzbyBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0RpcmVjdG9yVHlwZSB7XG4gIC8qKiBzaGFyZCAqL1xuICBTSEFSRCA9IFwic2hhcmRcIixcbiAgLyoqIHJvdW5kX3JvYmluICovXG4gIFJPVU5EX1VOREVSU0NPUkVfUk9CSU4gPSBcInJvdW5kX3JvYmluXCIsXG4gIC8qKiByYW5kb20gKi9cbiAgUkFORE9NID0gXCJyYW5kb21cIixcbiAgLyoqIGhhc2ggKi9cbiAgSEFTSCA9IFwiaGFzaFwiLFxufVxuXG4vKipcbiAqIGJhbiBjb25maWd1cmVzIEJBTi1iYXNlZCBjYWNoZSBpbnZhbGlkYXRpb24uXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuIHtcbiAgLyoqXG4gICAqIGFsbG93ZWRTb3VyY2VzIGlzIGEgbGlzdCBvZiBDSURSIHJhbmdlcyBwZXJtaXR0ZWQgdG8gc2VuZCBCQU4gcmVxdWVzdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4jYWxsb3dlZFNvdXJjZXNcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRTb3VyY2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIGVuYWJsZWQgYWN0aXZhdGVzIHRoZSBCQU4gaW52YWxpZGF0aW9uIGhhbmRsZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHJhdGVMaW1pdFBlck1pbnV0ZSBsaW1pdHMgQkFOIHJlcXVlc3RzIHBlciBtaW51dGUuIDAgbWVhbnMgbm8gbGltaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4jcmF0ZUxpbWl0UGVyTWludXRlXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXRQZXJNaW51dGU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuKG9iajogVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbGxvd2VkU291cmNlcyc6IG9iai5hbGxvd2VkU291cmNlcz8ubWFwKHkgPT4geSksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncmF0ZUxpbWl0UGVyTWludXRlJzogb2JqLnJhdGVMaW1pdFBlck1pbnV0ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHB1cmdlIGNvbmZpZ3VyZXMgSFRUUCBQVVJHRS1iYXNlZCBjYWNoZSBpbnZhbGlkYXRpb24uXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZSB7XG4gIC8qKlxuICAgKiBhbGxvd2VkU291cmNlcyBpcyBhIGxpc3Qgb2YgQ0lEUiByYW5nZXMgcGVybWl0dGVkIHRvIHNlbmQgUFVSR0UgcmVxdWVzdHMuXG4gICAqIElmIGVtcHR5LCBubyBzb3VyY2UgcmVzdHJpY3Rpb24gaXMgYXBwbGllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlI2FsbG93ZWRTb3VyY2VzXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkU291cmNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBlbmFibGVkIGFjdGl2YXRlcyB0aGUgUFVSR0UgaW52YWxpZGF0aW9uIGhhbmRsZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZSNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogc29mdCBlbmFibGVzIHNvZnQgcHVyZ2VzLCB3aGljaCBtYXJrIG9iamVjdHMgYXMgZXhwaXJlZCByYXRoZXIgdGhhbiByZW1vdmluZyB0aGVtLlxuICAgKiBUaGlzIGFsbG93cyBWYXJuaXNoIHRvIHNlcnZlIHN0YWxlIGNvbnRlbnQgd2hpbGUgcmV2YWxpZGF0aW5nLiBEZWZhdWx0OiB0cnVlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Ujc29mdFxuICAgKi9cbiAgcmVhZG9ubHkgc29mdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2UnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZShvYmo6IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbGxvd2VkU291cmNlcyc6IG9iai5hbGxvd2VkU291cmNlcz8ubWFwKHkgPT4geSksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnc29mdCc6IG9iai5zb2Z0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogeGtleSBjb25maWd1cmVzIHhrZXktYmFzZWQgc3Vycm9nYXRlIGtleSBpbnZhbGlkYXRpb24gKHJlcXVpcmVzIHZtb2RfeGtleSkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkge1xuICAvKipcbiAgICogYWxsb3dlZFNvdXJjZXMgaXMgYSBsaXN0IG9mIENJRFIgcmFuZ2VzIHBlcm1pdHRlZCB0byBzZW5kIHhrZXkgaW52YWxpZGF0aW9uIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSNhbGxvd2VkU291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFNvdXJjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgeGtleS1iYXNlZCBpbnZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5I2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBzb2Z0UHVyZ2UgZW5hYmxlcyBzb2Z0IHB1cmdpbmcgdmlhIHhrZXkuIERlZmF1bHQ6IHRydWUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5I3NvZnRQdXJnZVxuICAgKi9cbiAgcmVhZG9ubHkgc29mdFB1cmdlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleShvYmo6IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FsbG93ZWRTb3VyY2VzJzogb2JqLmFsbG93ZWRTb3VyY2VzPy5tYXAoeSA9PiB5KSxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdzb2Z0UHVyZ2UnOiBvYmouc29mdFB1cmdlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcHJvbWV0aGV1c1J1bGVzIGNvbmZpZ3VyZXMgUHJvbWV0aGV1c1J1bGUgb2JqZWN0cyBmb3IgYWxlcnRpbmcuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMge1xuICAvKipcbiAgICogZW5hYmxlZCBjcmVhdGVzIGEgUHJvbWV0aGV1c1J1bGUgd2l0aCBkZWZhdWx0IGFsZXJ0aW5nIHJ1bGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcyNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcyhvYmo6IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlcnZpY2VNb25pdG9yIGNvbmZpZ3VyZXMgYSBTZXJ2aWNlTW9uaXRvciBmb3IgUHJvbWV0aGV1cyBPcGVyYXRvciBzY3JhcGluZy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3Ige1xuICAvKipcbiAgICogZW5hYmxlZCBjcmVhdGVzIGEgU2VydmljZU1vbml0b3IgdGFyZ2V0aW5nIHRoZSBWYXJuaXNoIG1ldHJpY3MgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3IjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGludGVydmFsIGlzIHRoZSBzY3JhcGUgaW50ZXJ2YWwgKGUuZy4gXCIzMHNcIikuIERlZmF1bHRzIHRvIHRoZSBQcm9tZXRoZXVzIGdsb2JhbCBpbnRlcnZhbC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIFByb21ldGhldXMgZ2xvYmFsIGludGVydmFsLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yI2ludGVydmFsXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3Iob2JqOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnaW50ZXJ2YWwnOiBvYmouaW50ZXJ2YWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBhZmZpbml0eSBjb25maWd1cmVzIHBvZCBhZmZpbml0eSBhbmQgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHkge1xuICAvKipcbiAgICogRGVzY3JpYmVzIG5vZGUgYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcyBmb3IgdGhlIHBvZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5I25vZGVBZmZpbml0eVxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZUFmZmluaXR5PzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eTtcblxuICAvKipcbiAgICogRGVzY3JpYmVzIHBvZCBhZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzIChlLmcuIGNvLWxvY2F0ZSB0aGlzIHBvZCBpbiB0aGUgc2FtZSBub2RlLCB6b25lLCBldGMuIGFzIHNvbWUgb3RoZXIgcG9kKHMpKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5I3BvZEFmZmluaXR5XG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eTtcblxuICAvKipcbiAgICogRGVzY3JpYmVzIHBvZCBhbnRpLWFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgKGUuZy4gYXZvaWQgcHV0dGluZyB0aGlzIHBvZCBpbiB0aGUgc2FtZSBub2RlLCB6b25lLCBldGMuIGFzIHNvbWUgb3RoZXIgcG9kKHMpKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5I3BvZEFudGlBZmZpbml0eVxuICAgKi9cbiAgcmVhZG9ubHkgcG9kQW50aUFmZmluaXR5PzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5KG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ25vZGVBZmZpbml0eSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5KG9iai5ub2RlQWZmaW5pdHkpLFxuICAgICdwb2RBZmZpbml0eSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkob2JqLnBvZEFmZmluaXR5KSxcbiAgICAncG9kQW50aUFmZmluaXR5JzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkob2JqLnBvZEFudGlBZmZpbml0eSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBUaGUgcG9kIHRoaXMgVG9sZXJhdGlvbiBpcyBhdHRhY2hlZCB0byB0b2xlcmF0ZXMgYW55IHRhaW50IHRoYXQgbWF0Y2hlc1xuICogdGhlIHRyaXBsZSA8a2V5LHZhbHVlLGVmZmVjdD4gdXNpbmcgdGhlIG1hdGNoaW5nIG9wZXJhdG9yIDxvcGVyYXRvcj4uXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyB7XG4gIC8qKlxuICAgKiBFZmZlY3QgaW5kaWNhdGVzIHRoZSB0YWludCBlZmZlY3QgdG8gbWF0Y2guIEVtcHR5IG1lYW5zIG1hdGNoIGFsbCB0YWludCBlZmZlY3RzLlxuICAgKiBXaGVuIHNwZWNpZmllZCwgYWxsb3dlZCB2YWx1ZXMgYXJlIE5vU2NoZWR1bGUsIFByZWZlck5vU2NoZWR1bGUgYW5kIE5vRXhlY3V0ZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI2VmZmVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXkgaXMgdGhlIHRhaW50IGtleSB0aGF0IHRoZSB0b2xlcmF0aW9uIGFwcGxpZXMgdG8uIEVtcHR5IG1lYW5zIG1hdGNoIGFsbCB0YWludCBrZXlzLlxuICAgKiBJZiB0aGUga2V5IGlzIGVtcHR5LCBvcGVyYXRvciBtdXN0IGJlIEV4aXN0czsgdGhpcyBjb21iaW5hdGlvbiBtZWFucyB0byBtYXRjaCBhbGwgdmFsdWVzIGFuZCBhbGwga2V5cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIHRoZSB2YWx1ZS5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBFeGlzdHMsIEVxdWFsLCBMdCwgYW5kIEd0LiBEZWZhdWx0cyB0byBFcXVhbC5cbiAgICogRXhpc3RzIGlzIGVxdWl2YWxlbnQgdG8gd2lsZGNhcmQgZm9yIHZhbHVlLCBzbyB0aGF0IGEgcG9kIGNhblxuICAgKiB0b2xlcmF0ZSBhbGwgdGFpbnRzIG9mIGEgcGFydGljdWxhciBjYXRlZ29yeS5cbiAgICogTHQgYW5kIEd0IHBlcmZvcm0gbnVtZXJpYyBjb21wYXJpc29ucyAocmVxdWlyZXMgZmVhdHVyZSBnYXRlIFRhaW50VG9sZXJhdGlvbkNvbXBhcmlzb25PcGVyYXRvcnMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBFcXVhbC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcj86IHN0cmluZztcblxuICAvKipcbiAgICogVG9sZXJhdGlvblNlY29uZHMgcmVwcmVzZW50cyB0aGUgcGVyaW9kIG9mIHRpbWUgdGhlIHRvbGVyYXRpb24gKHdoaWNoIG11c3QgYmVcbiAgICogb2YgZWZmZWN0IE5vRXhlY3V0ZSwgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgaWdub3JlZCkgdG9sZXJhdGVzIHRoZSB0YWludC4gQnkgZGVmYXVsdCxcbiAgICogaXQgaXMgbm90IHNldCwgd2hpY2ggbWVhbnMgdG9sZXJhdGUgdGhlIHRhaW50IGZvcmV2ZXIgKGRvIG5vdCBldmljdCkuIFplcm8gYW5kXG4gICAqIG5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIHRyZWF0ZWQgYXMgMCAoZXZpY3QgaW1tZWRpYXRlbHkpIGJ5IHRoZSBzeXN0ZW0uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyN0b2xlcmF0aW9uU2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgdG9sZXJhdGlvblNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFZhbHVlIGlzIHRoZSB0YWludCB2YWx1ZSB0aGUgdG9sZXJhdGlvbiBtYXRjaGVzIHRvLlxuICAgKiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGVtcHR5LCBvdGhlcndpc2UganVzdCBhIHJlZ3VsYXIgc3RyaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMjdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZWZmZWN0Jzogb2JqLmVmZmVjdCxcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3RvbGVyYXRpb25TZWNvbmRzJzogb2JqLnRvbGVyYXRpb25TZWNvbmRzLFxuICAgICd2YWx1ZSc6IG9iai52YWx1ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlc291cmNlQ2xhaW0gcmVmZXJlbmNlcyBvbmUgZW50cnkgaW4gUG9kU3BlYy5SZXNvdXJjZUNsYWltcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNDbGFpbXMge1xuICAvKipcbiAgICogTmFtZSBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIG9uZSBlbnRyeSBpbiBwb2Quc3BlYy5yZXNvdXJjZUNsYWltcyBvZlxuICAgKiB0aGUgUG9kIHdoZXJlIHRoaXMgZmllbGQgaXMgdXNlZC4gSXQgbWFrZXMgdGhhdCByZXNvdXJjZSBhdmFpbGFibGVcbiAgICogaW5zaWRlIGEgY29udGFpbmVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogUmVxdWVzdCBpcyB0aGUgbmFtZSBjaG9zZW4gZm9yIGEgcmVxdWVzdCBpbiB0aGUgcmVmZXJlbmNlZCBjbGFpbS5cbiAgICogSWYgZW1wdHksIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgY2xhaW0gaXMgbWFkZSBhdmFpbGFibGUsIG90aGVyd2lzZVxuICAgKiBvbmx5IHRoZSByZXN1bHQgb2YgdGhpcyByZXF1ZXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zI3JlcXVlc3RcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3Q/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zKG9iajogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNDbGFpbXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3JlcXVlc3QnOiBvYmoucmVxdWVzdCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICB9XG59XG5cbi8qKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzUmVxdWVzdHModmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiB0eXBlIHNldHMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSB0eXBlIChDbHVzdGVySVAsIE5vZGVQb3J0LCBMb2FkQmFsYW5jZXIpLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTZXJ2aWNlVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY1NlcnZpY2VUeXBlIHtcbiAgLyoqIENsdXN0ZXJJUCAqL1xuICBDTFVTVEVSX0lQID0gXCJDbHVzdGVySVBcIixcbiAgLyoqIE5vZGVQb3J0ICovXG4gIE5PREVfUE9SVCA9IFwiTm9kZVBvcnRcIixcbiAgLyoqIExvYWRCYWxhbmNlciAqL1xuICBMT0FEX0JBTEFOQ0VSID0gXCJMb2FkQmFsYW5jZXJcIixcbn1cblxuLyoqXG4gKiBzaXplIGlzIHRoZSBzdG9yYWdlIGFsbG9jYXRpb24gYXMgYSBLdWJlcm5ldGVzIHJlc291cmNlIHF1YW50aXR5IChlLmcuIFwiMUdpXCIpLlxuICogVGhlIG9wZXJhdG9yIGNvbnZlcnRzIHRvIGJ5dGVzIGZvciB2YXJuaXNoZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemVcbiAqL1xuZXhwb3J0IGNsYXNzIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUge1xuICBwdWJsaWMgc3RhdGljIGZyb21OdW1iZXIodmFsdWU6IG51bWJlcik6IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNTdG9yYWdlU2l6ZSh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIHR5cGUgaXMgdGhlIHN0b3JhZ2UgYmFja2VuZCB0eXBlLiBPbmx5IFwibWFsbG9jXCIgYW5kIFwiZmlsZVwiIGFyZSBwZXJtaXR0ZWQuXG4gKiBcInBlcnNpc3RlbnRcIiwgXCJ1bWVtXCIsIGFuZCBcImRlZmF1bHRcIiBhcmUgcmVqZWN0ZWQgYnkgdGhlIGFkbWlzc2lvbiB3ZWJob29rLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY1N0b3JhZ2VUeXBlIHtcbiAgLyoqIG1hbGxvYyAqL1xuICBNQUxMT0MgPSBcIm1hbGxvY1wiLFxuICAvKiogZmlsZSAqL1xuICBGSUxFID0gXCJmaWxlXCIsXG59XG5cbi8qKlxuICogc25pcHBldHMgcHJvdmlkZXMgVkNMIGNvZGUgaW5qZWN0ZWQgaW50byBlYWNoIGdlbmVyYXRlZCBzdWJyb3V0aW5lLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMge1xuICAvKipcbiAgICogaGVhZGVyIGlzIGluc2VydGVkIGF0IHRoZSB0b3Agb2YgdGhlIFZDTCBmaWxlLCBiZWZvcmUgYW55IHN1YnJvdXRpbmVzLlxuICAgKiBVc2UgZm9yIGltcG9ydCBzdGF0ZW1lbnRzIGFuZCBnbG9iYWwgZGVjbGFyYXRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBoZWFkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEJhY2tlbmRFcnJvciBpcyBpbnNlcnRlZCBpbnRvIHZjbF9iYWNrZW5kX2Vycm9yLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsQmFja2VuZEVycm9yXG4gICAqL1xuICByZWFkb25seSB2Y2xCYWNrZW5kRXJyb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEJhY2tlbmRGZXRjaCBpcyBpbnNlcnRlZCBpbnRvIHZjbF9iYWNrZW5kX2ZldGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsQmFja2VuZEZldGNoXG4gICAqL1xuICByZWFkb25seSB2Y2xCYWNrZW5kRmV0Y2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEJhY2tlbmRSZXNwb25zZSBpcyBpbnNlcnRlZCBpbnRvIHZjbF9iYWNrZW5kX3Jlc3BvbnNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsQmFja2VuZFJlc3BvbnNlXG4gICAqL1xuICByZWFkb25seSB2Y2xCYWNrZW5kUmVzcG9uc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbERlbGl2ZXIgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfZGVsaXZlci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbERlbGl2ZXJcbiAgICovXG4gIHJlYWRvbmx5IHZjbERlbGl2ZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEZpbmkgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfZmluaS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEZpbmlcbiAgICovXG4gIHJlYWRvbmx5IHZjbEZpbmk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEhhc2ggaXMgaW5zZXJ0ZWQgaW50byB2Y2xfaGFzaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEhhc2hcbiAgICovXG4gIHJlYWRvbmx5IHZjbEhhc2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEhpdCBpcyBpbnNlcnRlZCBpbnRvIHZjbF9oaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xIaXRcbiAgICovXG4gIHJlYWRvbmx5IHZjbEhpdD86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsSW5pdCBpcyBpbnNlcnRlZCBpbnRvIHRoZSB2Y2xfaW5pdCBzdWJyb3V0aW5lIGFmdGVyIGRpcmVjdG9yIGluaXRpYWxpc2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsSW5pdFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsSW5pdD86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsTWlzcyBpcyBpbnNlcnRlZCBpbnRvIHZjbF9taXNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsTWlzc1xuICAgKi9cbiAgcmVhZG9ubHkgdmNsTWlzcz86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsUGFzcyBpcyBpbnNlcnRlZCBpbnRvIHZjbF9wYXNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsUGFzc1xuICAgKi9cbiAgcmVhZG9ubHkgdmNsUGFzcz86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsUGlwZSBpcyBpbnNlcnRlZCBpbnRvIHZjbF9waXBlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsUGlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdmNsUGlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsUHVyZ2UgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfcHVyZ2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xQdXJnZVxuICAgKi9cbiAgcmVhZG9ubHkgdmNsUHVyZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbFJlY3YgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfcmVjdiBhZnRlciBnZW5lcmF0ZWQgcm91dGluZyBsb2dpYywgYmVmb3JlIHJldHVybigpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsUmVjdlxuICAgKi9cbiAgcmVhZG9ubHkgdmNsUmVjdj86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsU3ludGggaXMgaW5zZXJ0ZWQgaW50byB2Y2xfc3ludGguXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xTeW50aFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsU3ludGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyhvYmo6IFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoZWFkZXInOiBvYmouaGVhZGVyLFxuICAgICd2Y2xCYWNrZW5kRXJyb3InOiBvYmoudmNsQmFja2VuZEVycm9yLFxuICAgICd2Y2xCYWNrZW5kRmV0Y2gnOiBvYmoudmNsQmFja2VuZEZldGNoLFxuICAgICd2Y2xCYWNrZW5kUmVzcG9uc2UnOiBvYmoudmNsQmFja2VuZFJlc3BvbnNlLFxuICAgICd2Y2xEZWxpdmVyJzogb2JqLnZjbERlbGl2ZXIsXG4gICAgJ3ZjbEZpbmknOiBvYmoudmNsRmluaSxcbiAgICAndmNsSGFzaCc6IG9iai52Y2xIYXNoLFxuICAgICd2Y2xIaXQnOiBvYmoudmNsSGl0LFxuICAgICd2Y2xJbml0Jzogb2JqLnZjbEluaXQsXG4gICAgJ3ZjbE1pc3MnOiBvYmoudmNsTWlzcyxcbiAgICAndmNsUGFzcyc6IG9iai52Y2xQYXNzLFxuICAgICd2Y2xQaXBlJzogb2JqLnZjbFBpcGUsXG4gICAgJ3ZjbFB1cmdlJzogb2JqLnZjbFB1cmdlLFxuICAgICd2Y2xSZWN2Jzogb2JqLnZjbFJlY3YsXG4gICAgJ3ZjbFN5bnRoJzogb2JqLnZjbFN5bnRoLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogdHlwZSBpcyB0aGUgcm91dGluZyBzdHJhdGVneSBiZXR3ZWVuIFZhcm5pc2ggcG9kcy4gT25seSBcInNoYXJkXCIgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmdUeXBlXG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nVHlwZSB7XG4gIC8qKiBzaGFyZCAqL1xuICBTSEFSRCA9IFwic2hhcmRcIixcbn1cblxuLyoqXG4gKiBieSBkZXRlcm1pbmVzIHdoYXQgdmFsdWUgaXMgaGFzaGVkIGZvciBzaGFyZCBzZWxlY3Rpb24uIFwiSEFTSFwiIHVzZXMgdGhlIFZhcm5pc2hcbiAqIGhhc2ggKGRlZmF1bHQpOyBcIlVSTFwiIHVzZXMgdGhlIHJlcXVlc3QgVVJMLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkQnlcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkQnkge1xuICAvKiogSEFTSCAqL1xuICBIQVNIID0gXCJIQVNIXCIsXG4gIC8qKiBVUkwgKi9cbiAgVVJMID0gXCJVUkxcIixcbn1cblxuLyoqXG4gKiBoZWFsdGh5IGNvbnRyb2xzIHdoaWNoIGJhY2tlbmRzIHRoZSBkaXJlY3RvciBjb25zaWRlcnMgd2hlbiBzZWxlY3RpbmcgYSBzaGFyZC5cbiAqIFwiQ0hPU0VOXCIgKGRlZmF1bHQpIG9ubHkgY29uc2lkZXJzIHRoZSBjaG9zZW4gYmFja2VuZCBoZWFsdGh5OyBcIkFMTFwiIHJlcXVpcmVzIGFsbFxuICogYmFja2VuZHMgdG8gYmUgaGVhbHRoeS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZEhlYWx0aHlcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkSGVhbHRoeSB7XG4gIC8qKiBDSE9TRU4gKi9cbiAgQ0hPU0VOID0gXCJDSE9TRU5cIixcbiAgLyoqIEFMTCAqL1xuICBBTEwgPSBcIkFMTFwiLFxufVxuXG4vKipcbiAqIERlc2NyaWJlcyBub2RlIGFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgZm9yIHRoZSBwb2QuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eSB7XG4gIC8qKlxuICAgKiBUaGUgc2NoZWR1bGVyIHdpbGwgcHJlZmVyIHRvIHNjaGVkdWxlIHBvZHMgdG8gbm9kZXMgdGhhdCBzYXRpc2Z5XG4gICAqIHRoZSBhZmZpbml0eSBleHByZXNzaW9ucyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCwgYnV0IGl0IG1heSBjaG9vc2VcbiAgICogYSBub2RlIHRoYXQgdmlvbGF0ZXMgb25lIG9yIG1vcmUgb2YgdGhlIGV4cHJlc3Npb25zLiBUaGUgbm9kZSB0aGF0IGlzXG4gICAqIG1vc3QgcHJlZmVycmVkIGlzIHRoZSBvbmUgd2l0aCB0aGUgZ3JlYXRlc3Qgc3VtIG9mIHdlaWdodHMsIGkuZS5cbiAgICogZm9yIGVhY2ggbm9kZSB0aGF0IG1lZXRzIGFsbCBvZiB0aGUgc2NoZWR1bGluZyByZXF1aXJlbWVudHMgKHJlc291cmNlXG4gICAqIHJlcXVlc3QsIHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZyBhZmZpbml0eSBleHByZXNzaW9ucywgZXRjLiksXG4gICAqIGNvbXB1dGUgYSBzdW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGVsZW1lbnRzIG9mIHRoaXMgZmllbGQgYW5kIGFkZGluZ1xuICAgKiBcIndlaWdodFwiIHRvIHRoZSBzdW0gaWYgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29ycmVzcG9uZGluZyBtYXRjaEV4cHJlc3Npb25zOyB0aGVcbiAgICogbm9kZShzKSB3aXRoIHRoZSBoaWdoZXN0IHN1bSBhcmUgdGhlIG1vc3QgcHJlZmVycmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHkjcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uW107XG5cbiAgLyoqXG4gICAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAgICogc2NoZWR1bGluZyB0aW1lLCB0aGUgcG9kIHdpbGwgbm90IGJlIHNjaGVkdWxlZCBvbnRvIHRoZSBub2RlLlxuICAgKiBJZiB0aGUgYWZmaW5pdHkgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkIGNlYXNlIHRvIGJlIG1ldFxuICAgKiBhdCBzb21lIHBvaW50IGR1cmluZyBwb2QgZXhlY3V0aW9uIChlLmcuIGR1ZSB0byBhbiB1cGRhdGUpLCB0aGUgc3lzdGVtXG4gICAqIG1heSBvciBtYXkgbm90IHRyeSB0byBldmVudHVhbGx5IGV2aWN0IHRoZSBwb2QgZnJvbSBpdHMgbm9kZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5I3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5KG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKHkpKSxcbiAgICAncmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmoucmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZXNjcmliZXMgcG9kIGFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgKGUuZy4gY28tbG9jYXRlIHRoaXMgcG9kIGluIHRoZSBzYW1lIG5vZGUsIHpvbmUsIGV0Yy4gYXMgc29tZSBvdGhlciBwb2QocykpLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBzY2hlZHVsZXIgd2lsbCBwcmVmZXIgdG8gc2NoZWR1bGUgcG9kcyB0byBub2RlcyB0aGF0IHNhdGlzZnlcbiAgICogdGhlIGFmZmluaXR5IGV4cHJlc3Npb25zIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkLCBidXQgaXQgbWF5IGNob29zZVxuICAgKiBhIG5vZGUgdGhhdCB2aW9sYXRlcyBvbmUgb3IgbW9yZSBvZiB0aGUgZXhwcmVzc2lvbnMuIFRoZSBub2RlIHRoYXQgaXNcbiAgICogbW9zdCBwcmVmZXJyZWQgaXMgdGhlIG9uZSB3aXRoIHRoZSBncmVhdGVzdCBzdW0gb2Ygd2VpZ2h0cywgaS5lLlxuICAgKiBmb3IgZWFjaCBub2RlIHRoYXQgbWVldHMgYWxsIG9mIHRoZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cyAocmVzb3VyY2VcbiAgICogcmVxdWVzdCwgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nIGFmZmluaXR5IGV4cHJlc3Npb25zLCBldGMuKSxcbiAgICogY29tcHV0ZSBhIHN1bSBieSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMgb2YgdGhpcyBmaWVsZCBhbmQgYWRkaW5nXG4gICAqIFwid2VpZ2h0XCIgdG8gdGhlIHN1bSBpZiB0aGUgbm9kZSBoYXMgcG9kcyB3aGljaCBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybTsgdGhlXG4gICAqIG5vZGUocykgd2l0aCB0aGUgaGlnaGVzdCBzdW0gYXJlIHRoZSBtb3N0IHByZWZlcnJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkjcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25bXTtcblxuICAvKipcbiAgICogSWYgdGhlIGFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBhcmUgbm90IG1ldCBhdFxuICAgKiBzY2hlZHVsaW5nIHRpbWUsIHRoZSBwb2Qgd2lsbCBub3QgYmUgc2NoZWR1bGVkIG9udG8gdGhlIG5vZGUuXG4gICAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gICAqIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHBvZCBleGVjdXRpb24gKGUuZy4gZHVlIHRvIGEgcG9kIGxhYmVsIHVwZGF0ZSksIHRoZVxuICAgKiBzeXN0ZW0gbWF5IG9yIG1heSBub3QgdHJ5IHRvIGV2ZW50dWFsbHkgZXZpY3QgdGhlIHBvZCBmcm9tIGl0cyBub2RlLlxuICAgKiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cywgdGhlIGxpc3RzIG9mIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaFxuICAgKiBwb2RBZmZpbml0eVRlcm0gYXJlIGludGVyc2VjdGVkLCBpLmUuIGFsbCB0ZXJtcyBtdXN0IGJlIHNhdGlzZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkjcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25bXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICAgICdyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERlc2NyaWJlcyBwb2QgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzIChlLmcuIGF2b2lkIHB1dHRpbmcgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eSB7XG4gIC8qKlxuICAgKiBUaGUgc2NoZWR1bGVyIHdpbGwgcHJlZmVyIHRvIHNjaGVkdWxlIHBvZHMgdG8gbm9kZXMgdGhhdCBzYXRpc2Z5XG4gICAqIHRoZSBhbnRpLWFmZmluaXR5IGV4cHJlc3Npb25zIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkLCBidXQgaXQgbWF5IGNob29zZVxuICAgKiBhIG5vZGUgdGhhdCB2aW9sYXRlcyBvbmUgb3IgbW9yZSBvZiB0aGUgZXhwcmVzc2lvbnMuIFRoZSBub2RlIHRoYXQgaXNcbiAgICogbW9zdCBwcmVmZXJyZWQgaXMgdGhlIG9uZSB3aXRoIHRoZSBncmVhdGVzdCBzdW0gb2Ygd2VpZ2h0cywgaS5lLlxuICAgKiBmb3IgZWFjaCBub2RlIHRoYXQgbWVldHMgYWxsIG9mIHRoZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cyAocmVzb3VyY2VcbiAgICogcmVxdWVzdCwgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nIGFudGktYWZmaW5pdHkgZXhwcmVzc2lvbnMsIGV0Yy4pLFxuICAgKiBjb21wdXRlIGEgc3VtIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBlbGVtZW50cyBvZiB0aGlzIGZpZWxkIGFuZCBzdWJ0cmFjdGluZ1xuICAgKiBcIndlaWdodFwiIGZyb20gdGhlIHN1bSBpZiB0aGUgbm9kZSBoYXMgcG9kcyB3aGljaCBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybTsgdGhlXG4gICAqIG5vZGUocykgd2l0aCB0aGUgaGlnaGVzdCBzdW0gYXJlIHRoZSBtb3N0IHByZWZlcnJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5I3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gICAqL1xuICByZWFkb25seSBwcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYW50aS1hZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAgICogc2NoZWR1bGluZyB0aW1lLCB0aGUgcG9kIHdpbGwgbm90IGJlIHNjaGVkdWxlZCBvbnRvIHRoZSBub2RlLlxuICAgKiBJZiB0aGUgYW50aS1hZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gICAqIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHBvZCBleGVjdXRpb24gKGUuZy4gZHVlIHRvIGEgcG9kIGxhYmVsIHVwZGF0ZSksIHRoZVxuICAgKiBzeXN0ZW0gbWF5IG9yIG1heSBub3QgdHJ5IHRvIGV2ZW50dWFsbHkgZXZpY3QgdGhlIHBvZCBmcm9tIGl0cyBub2RlLlxuICAgKiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cywgdGhlIGxpc3RzIG9mIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaFxuICAgKiBwb2RBZmZpbml0eVRlcm0gYXJlIGludGVyc2VjdGVkLCBpLmUuIGFsbCB0ZXJtcyBtdXN0IGJlIHNhdGlzZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5I3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICAgICdyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbih5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBbiBlbXB0eSBwcmVmZXJyZWQgc2NoZWR1bGluZyB0ZXJtIG1hdGNoZXMgYWxsIG9iamVjdHMgd2l0aCBpbXBsaWNpdCB3ZWlnaHQgMFxuICogKGkuZS4gaXQncyBhIG5vLW9wKS4gQSBudWxsIHByZWZlcnJlZCBzY2hlZHVsaW5nIHRlcm0gbWF0Y2hlcyBubyBvYmplY3RzIChpLmUuIGlzIGFsc28gYSBuby1vcCkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogQSBub2RlIHNlbGVjdG9yIHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3ByZWZlcmVuY2VcbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcmVuY2U6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdlaWdodCBhc3NvY2lhdGVkIHdpdGggbWF0Y2hpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZVNlbGVjdG9yVGVybSwgaW4gdGhlIHJhbmdlIDEtMTAwLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiN3ZWlnaHRcbiAgICovXG4gIHJlYWRvbmx5IHdlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVyZW5jZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlKG9iai5wcmVmZXJlbmNlKSxcbiAgICAnd2VpZ2h0Jzogb2JqLndlaWdodCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAqIHNjaGVkdWxpbmcgdGltZSwgdGhlIHBvZCB3aWxsIG5vdCBiZSBzY2hlZHVsZWQgb250byB0aGUgbm9kZS5cbiAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gKiBhdCBzb21lIHBvaW50IGR1cmluZyBwb2QgZXhlY3V0aW9uIChlLmcuIGR1ZSB0byBhbiB1cGRhdGUpLCB0aGUgc3lzdGVtXG4gKiBtYXkgb3IgbWF5IG5vdCB0cnkgdG8gZXZlbnR1YWxseSBldmljdCB0aGUgcG9kIGZyb20gaXRzIG5vZGUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHtcbiAgLyoqXG4gICAqIFJlcXVpcmVkLiBBIGxpc3Qgb2Ygbm9kZSBzZWxlY3RvciB0ZXJtcy4gVGhlIHRlcm1zIGFyZSBPUmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI25vZGVTZWxlY3RvclRlcm1zXG4gICAqL1xuICByZWFkb25seSBub2RlU2VsZWN0b3JUZXJtczogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbm9kZVNlbGVjdG9yVGVybXMnOiBvYmoubm9kZVNlbGVjdG9yVGVybXM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSB3ZWlnaHRzIG9mIGFsbCBvZiB0aGUgbWF0Y2hlZCBXZWlnaHRlZFBvZEFmZmluaXR5VGVybSBmaWVsZHMgYXJlIGFkZGVkIHBlci1ub2RlIHRvIGZpbmQgdGhlIG1vc3QgcHJlZmVycmVkIG5vZGUocylcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogUmVxdWlyZWQuIEEgcG9kIGFmZmluaXR5IHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jcG9kQWZmaW5pdHlUZXJtXG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eVRlcm06IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtO1xuXG4gIC8qKlxuICAgKiB3ZWlnaHQgYXNzb2NpYXRlZCB3aXRoIG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybSxcbiAgICogaW4gdGhlIHJhbmdlIDEtMTAwLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3dlaWdodFxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwb2RBZmZpbml0eVRlcm0nOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqLnBvZEFmZmluaXR5VGVybSksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgc2V0IG9mIHBvZHMgKG5hbWVseSB0aG9zZSBtYXRjaGluZyB0aGUgbGFiZWxTZWxlY3RvclxuICogcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZShzKSkgdGhhdCB0aGlzIHBvZCBzaG91bGQgYmVcbiAqIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCxcbiAqIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZSB3aG9zZSB2YWx1ZSBvZlxuICogdGhlIGxhYmVsIHdpdGgga2V5IDx0b3BvbG9neUtleT4gbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoXG4gKiBhIHBvZCBvZiB0aGUgc2V0IG9mIHBvZHMgaXMgcnVubmluZ1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gICAqIElmIGl0J3MgbnVsbCwgdGhpcyBQb2RBZmZpbml0eVRlcm0gbWF0Y2hlcyB3aXRoIG5vIFBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1pc21hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IG5vdGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtaXNtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWlzbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBuYW1lc3BhY2VzIHNwZWNpZmllcyBhIHN0YXRpYyBsaXN0IG9mIG5hbWVzcGFjZSBuYW1lcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gICAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBzZWxlY3RlZCBieSBuYW1lc3BhY2VTZWxlY3Rvci5cbiAgICogbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgYW5kIG51bGwgbmFtZXNwYWNlU2VsZWN0b3IgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yKG9iai5sYWJlbFNlbGVjdG9yKSxcbiAgICAnbWF0Y2hMYWJlbEtleXMnOiBvYmoubWF0Y2hMYWJlbEtleXM/Lm1hcCh5ID0+IHkpLFxuICAgICdtaXNtYXRjaExhYmVsS2V5cyc6IG9iai5taXNtYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ25hbWVzcGFjZVNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSB3ZWlnaHRzIG9mIGFsbCBvZiB0aGUgbWF0Y2hlZCBXZWlnaHRlZFBvZEFmZmluaXR5VGVybSBmaWVsZHMgYXJlIGFkZGVkIHBlci1ub2RlIHRvIGZpbmQgdGhlIG1vc3QgcHJlZmVycmVkIG5vZGUocylcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBSZXF1aXJlZC4gQSBwb2QgYWZmaW5pdHkgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jcG9kQWZmaW5pdHlUZXJtXG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eVRlcm06IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybTtcblxuICAvKipcbiAgICogd2VpZ2h0IGFzc29jaWF0ZWQgd2l0aCBtYXRjaGluZyB0aGUgY29ycmVzcG9uZGluZyBwb2RBZmZpbml0eVRlcm0sXG4gICAqIGluIHRoZSByYW5nZSAxLTEwMC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jd2VpZ2h0XG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3BvZEFmZmluaXR5VGVybSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqLnBvZEFmZmluaXR5VGVybSksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgc2V0IG9mIHBvZHMgKG5hbWVseSB0aG9zZSBtYXRjaGluZyB0aGUgbGFiZWxTZWxlY3RvclxuICogcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZShzKSkgdGhhdCB0aGlzIHBvZCBzaG91bGQgYmVcbiAqIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCxcbiAqIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZSB3aG9zZSB2YWx1ZSBvZlxuICogdGhlIGxhYmVsIHdpdGgga2V5IDx0b3BvbG9neUtleT4gbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoXG4gKiBhIHBvZCBvZiB0aGUgc2V0IG9mIHBvZHMgaXMgcnVubmluZ1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBNYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI25hbWVzcGFjZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3RvcG9sb2d5S2V5XG4gICAqL1xuICByZWFkb25seSB0b3BvbG9neUtleTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbGFiZWxTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbm9kZSBzZWxlY3RvciB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2Uge1xuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBsYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBmaWVsZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSNtYXRjaEZpZWxkc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hGaWVsZHM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hGaWVsZHMnOiBvYmoubWF0Y2hGaWVsZHM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBudWxsIG9yIGVtcHR5IG5vZGUgc2VsZWN0b3IgdGVybSBtYXRjaGVzIG5vIG9iamVjdHMuIFRoZSByZXF1aXJlbWVudHMgb2ZcbiAqIHRoZW0gYXJlIEFORGVkLlxuICogVGhlIFRvcG9sb2d5U2VsZWN0b3JUZXJtIHR5cGUgaW1wbGVtZW50cyBhIHN1YnNldCBvZiB0aGUgTm9kZVNlbGVjdG9yVGVybS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50cyBieSBub2RlJ3MgbGFiZWxzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50cyBieSBub2RlJ3MgZmllbGRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMjbWF0Y2hGaWVsZHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRmllbGRzPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoRmllbGRzJzogb2JqLm1hdGNoRmllbGRzPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlcXVpcmVkLiBBIHBvZCBhZmZpbml0eSB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBNYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI25hbWVzcGFjZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI3RvcG9sb2d5S2V5XG4gICAqL1xuICByZWFkb25seSB0b3BvbG9neUtleTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbGFiZWxTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIG1hdGNoTGFiZWxzIGlzIGEgbWFwIG9mIHtrZXksdmFsdWV9IHBhaXJzLiBBIHNpbmdsZSB7a2V5LHZhbHVlfSBpbiB0aGUgbWF0Y2hMYWJlbHNcbiAgICogbWFwIGlzIGVxdWl2YWxlbnQgdG8gYW4gZWxlbWVudCBvZiBtYXRjaEV4cHJlc3Npb25zLCB3aG9zZSBrZXkgZmllbGQgaXMgXCJrZXlcIiwgdGhlXG4gICAqIG9wZXJhdG9yIGlzIFwiSW5cIiwgYW5kIHRoZSB2YWx1ZXMgYXJyYXkgY29udGFpbnMgb25seSBcInZhbHVlXCIuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIG1hdGNoTGFiZWxzIGlzIGEgbWFwIG9mIHtrZXksdmFsdWV9IHBhaXJzLiBBIHNpbmdsZSB7a2V5LHZhbHVlfSBpbiB0aGUgbWF0Y2hMYWJlbHNcbiAgICogbWFwIGlzIGVxdWl2YWxlbnQgdG8gYW4gZWxlbWVudCBvZiBtYXRjaEV4cHJlc3Npb25zLCB3aG9zZSBrZXkgZmllbGQgaXMgXCJrZXlcIiwgdGhlXG4gICAqIG9wZXJhdG9yIGlzIFwiSW5cIiwgYW5kIHRoZSB2YWx1ZXMgYXJyYXkgY29udGFpbnMgb25seSBcInZhbHVlXCIuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZXF1aXJlZC4gQSBwb2QgYWZmaW5pdHkgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbGFiZWxTZWxlY3RvclxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI21pc21hdGNoTGFiZWxLZXlzXG4gICAqL1xuICByZWFkb25seSBtaXNtYXRjaExhYmVsS2V5cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgc2VsZWN0ZWQgYnkgdGhpcyBmaWVsZFxuICAgKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICAgKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqIEFuIGVtcHR5IHNlbGVjdG9yICh7fSkgbWF0Y2hlcyBhbGwgbmFtZXNwYWNlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI25hbWVzcGFjZXNcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhpcyBwb2Qgc2hvdWxkIGJlIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCB0aGUgcG9kcyBtYXRjaGluZ1xuICAgKiB0aGUgbGFiZWxTZWxlY3RvciBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZXMsIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZVxuICAgKiB3aG9zZSB2YWx1ZSBvZiB0aGUgbGFiZWwgd2l0aCBrZXkgdG9wb2xvZ3lLZXkgbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoIGFueSBvZiB0aGVcbiAgICogc2VsZWN0ZWQgcG9kcyBpcyBydW5uaW5nLlxuICAgKiBFbXB0eSB0b3BvbG9neUtleSBpcyBub3QgYWxsb3dlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3Iob2JqLm5hbWVzcGFjZVNlbGVjdG9yKSxcbiAgICAnbmFtZXNwYWNlcyc6IG9iai5uYW1lc3BhY2VzPy5tYXAoeSA9PiB5KSxcbiAgICAndG9wb2xvZ3lLZXknOiBvYmoudG9wb2xvZ3lLZXksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAqIElmIGl0J3MgbnVsbCwgdGhpcyBQb2RBZmZpbml0eVRlcm0gbWF0Y2hlcyB3aXRoIG5vIFBvZHMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgc2VsZWN0ZWQgYnkgdGhpcyBmaWVsZFxuICogYW5kIHRoZSBvbmVzIGxpc3RlZCBpbiB0aGUgbmFtZXNwYWNlcyBmaWVsZC5cbiAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAqIEFuIGVtcHR5IHNlbGVjdG9yICh7fSkgbWF0Y2hlcyBhbGwgbmFtZXNwYWNlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIFRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgR3Qgb3IgTHQsIHRoZSB2YWx1ZXNcbiAgICogYXJyYXkgbXVzdCBoYXZlIGEgc2luZ2xlIGVsZW1lbnQsIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlci5cbiAgICogVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWMgbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRmllbGRzI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEd0IG9yIEx0LCB0aGUgdmFsdWVzXG4gICAqIGFycmF5IG11c3QgaGF2ZSBhIHNpbmdsZSBlbGVtZW50LCB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIGludGVnZXIuXG4gICAqIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB7XG4gIC8qKlxuICAgKiBUaGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hGaWVsZHMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBtYXRjaEV4cHJlc3Npb25zIGlzIGEgbGlzdCBvZiBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudHMuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IjbWF0Y2hMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gKiBJZiBpdCdzIG51bGwsIHRoaXMgUG9kQWZmaW5pdHlUZXJtIG1hdGNoZXMgd2l0aCBubyBQb2RzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIHNlbGVjdGVkIGJ5IHRoaXMgZmllbGRcbiAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gKiBBbiBlbXB0eSBzZWxlY3RvciAoe30pIG1hdGNoZXMgYWxsIG5hbWVzcGFjZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2YWx1ZXMgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpY1xuICAgKiBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuIl19
|