@rusticarcade/palette 0.3.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -17
- package/dist/dev/index.js +1178 -1052
- package/dist/prod/index.d.ts +245 -547
- package/dist/prod/index.js +1 -3
- package/dist/test/index.d.ts +202 -481
- package/dist/test/index.js +15 -196
- package/package.json +1 -1
package/dist/dev/index.js
CHANGED
|
@@ -11,12 +11,11 @@ INVALID_ENV
|
|
|
11
11
|
Failed to find a custom elements registry in this environment. Is a window
|
|
12
12
|
global available with a customElements property?
|
|
13
13
|
`,
|
|
14
|
-
[
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
custom element is already defined with that name.
|
|
14
|
+
[2 /* INVALID_CALLSITE */]: `
|
|
15
|
+
INVALID_CALLSITE
|
|
16
|
+
A function was invoked with an invalid set of parameters.
|
|
18
17
|
`,
|
|
19
|
-
[
|
|
18
|
+
[100 /* INVALID_TAGNAME */]: `
|
|
20
19
|
INVALID_TAGNAME
|
|
21
20
|
Failed to determine a valid HTML Tag to use when registering a component as a
|
|
22
21
|
custom element. Specify a static readonly tagName property on your component
|
|
@@ -41,44 +40,39 @@ type. Values must be a string, HTMLElement.
|
|
|
41
40
|
|
|
42
41
|
Instead, got %s: %s.
|
|
43
42
|
`,
|
|
44
|
-
[200 /*
|
|
43
|
+
[200 /* TEMPLATE_INVALID_VALUE */]: `
|
|
45
44
|
TEMPLATE_INVALID
|
|
46
45
|
The value %s cannot be interpolated via the Template html string helper.
|
|
47
46
|
Values may only be HTMLTemplateElements (template content is adopted) or
|
|
48
47
|
strings (shorthand for a ::swap directive on an element)
|
|
49
48
|
`,
|
|
50
|
-
[201 /*
|
|
49
|
+
[201 /* TEMPLATE_INVALID_NOTATION_SYNTAX */]: `
|
|
51
50
|
TEMPLATE_INVALID_NOTATION
|
|
52
51
|
A template value notation failed to parse. Notations must begin with one of
|
|
53
52
|
@, $, *, or #, followed by a dot-separated path of accessor names. Optionally,
|
|
54
|
-
notations may have modifiers
|
|
53
|
+
notations may have modifiers such as the ! modifier.
|
|
55
54
|
|
|
56
55
|
The notation that failed to parse was "%s"
|
|
57
56
|
`,
|
|
58
|
-
[
|
|
57
|
+
[203 /* TEMPLATE_INVALID_COMPONENT */]: `
|
|
59
58
|
TEMPLATE_INVALID_COMPONENT
|
|
60
59
|
Failed to interpolate a Component in an html template string due to the
|
|
61
60
|
Component having an invalid tagName property.
|
|
62
61
|
|
|
63
62
|
Component "%s" has an invalid tagName property "%s"
|
|
64
63
|
`,
|
|
65
|
-
[
|
|
66
|
-
TEMPLATE_MISSING_LIST_PARENT
|
|
67
|
-
A template failed to prepare an ::each directive because no valid parent node
|
|
68
|
-
was found for the list to render into.
|
|
69
|
-
`,
|
|
70
|
-
[203 /* TEMPLATE_INVALID_LIST */]: `
|
|
64
|
+
[204 /* TEMPLATE_INVALID_LIST_DATA */]: `
|
|
71
65
|
TEMPLATE_INVALID_LIST
|
|
72
66
|
A template failed to render because an ::each directive fetched a value which
|
|
73
67
|
was not an array of actionable data.
|
|
74
68
|
`,
|
|
75
|
-
[
|
|
69
|
+
[3 /* MISSING_NODE_REF */]: `
|
|
76
70
|
TEMPLATE_INVALID_NODE_REF
|
|
77
71
|
A template failed to prepare a node from a compiled source. Typically, this
|
|
78
72
|
means something is broken within the compiled template rather than an error with
|
|
79
73
|
the template content itself.
|
|
80
74
|
`,
|
|
81
|
-
[
|
|
75
|
+
[205 /* TEMPLATE_MISSING_LIST_KEY */]: `
|
|
82
76
|
TEMPLATE_MISSING_LIST_KEY
|
|
83
77
|
A template failed to compile because an ::each directive was found on an element
|
|
84
78
|
without a corresponding ::key directive. ::each directives must have a ::key
|
|
@@ -87,11 +81,27 @@ value for each item in the list.
|
|
|
87
81
|
|
|
88
82
|
Example: <li ::each="$items" ::key="#id"> ... </li>
|
|
89
83
|
`,
|
|
90
|
-
[
|
|
84
|
+
[206 /* TEMPLATE_DUPLICATE_LIST_KEY */]: `
|
|
91
85
|
TEMPLATE_DUPLICATE_LIST_KEY
|
|
92
86
|
A list failed to render because item key %s appeared multiple times when
|
|
93
87
|
resolving list item keys. Each ::key directive must reference a notation whose
|
|
94
88
|
value is unique for each list item.
|
|
89
|
+
`,
|
|
90
|
+
[207 /* TEMPLATE_INVALID_CONDITIONAL */]: `
|
|
91
|
+
TEMPLATE_INVALID_CONDITIONAL
|
|
92
|
+
A template failed to compile due to an invalid use of conditional directives.
|
|
93
|
+
|
|
94
|
+
Conditional elements must be siblings. The first conditional branch must use an
|
|
95
|
+
::if directive, followed by zero or more ::else-if directives, and finally zero
|
|
96
|
+
or one ::else directive.
|
|
97
|
+
|
|
98
|
+
::if and ::else-if directives must specify a notation to evaluate. ::else does
|
|
99
|
+
not take any values and is just a binary attribute.
|
|
100
|
+
`,
|
|
101
|
+
[202 /* TEMPLATE_MISSING_NOTATION */]: `
|
|
102
|
+
TEMPLATE_MISSING_NOTATION
|
|
103
|
+
A template failed to compile because a %s directive did not have an associated
|
|
104
|
+
notation despite requiring one.
|
|
95
105
|
`,
|
|
96
106
|
[303 /* INVALID_STATE_KEY */]: `
|
|
97
107
|
INVALID_STATE_KEY
|
|
@@ -126,6 +136,19 @@ during a render lifecycle method such as beforeUpdate() or afterUpdate(). If
|
|
|
126
136
|
state changes unconditionally during a render, the render will infinitely loop.
|
|
127
137
|
Updating render source data during a render cycle is supported, but infinite
|
|
128
138
|
update loops may occur if unchecked.
|
|
139
|
+
`,
|
|
140
|
+
[208 /* TEMPLATE_INVALID_KEY_DIRECTIVE */]: `
|
|
141
|
+
TEMPLATE_INVALID_KEY_DIRECTIVE
|
|
142
|
+
A template failed to compile because a ::key directive was found on an element
|
|
143
|
+
with no associated ::each directive. ::key directives can only be used in
|
|
144
|
+
association with list rendering via ::each.
|
|
145
|
+
`,
|
|
146
|
+
[209 /* TEMPLATE_PARENT_REQUIRED */]: `
|
|
147
|
+
TEMPLATE_PARENT_REQUIRED
|
|
148
|
+
A template failed to compile due to an element which requires a parent having
|
|
149
|
+
no available parent in the template.
|
|
150
|
+
|
|
151
|
+
::each and ::if/::else-if/::else elements must have a parent node.
|
|
129
152
|
`
|
|
130
153
|
};
|
|
131
154
|
return DEV_ERROR_INFO[code];
|
|
@@ -147,279 +170,7 @@ class PaletteError extends Error {
|
|
|
147
170
|
}
|
|
148
171
|
}
|
|
149
172
|
|
|
150
|
-
// src/helper/css.ts
|
|
151
|
-
function css(strings, ...values) {
|
|
152
|
-
let result = strings[0] ?? "";
|
|
153
|
-
for (let i = 0;i < values.length; i++) {
|
|
154
|
-
const nextVal = values[i] ?? "";
|
|
155
|
-
const nextStr = strings[i + 1] ?? "";
|
|
156
|
-
result += `${nextVal}${nextStr}`;
|
|
157
|
-
}
|
|
158
|
-
const sheet = new CSSStyleSheet;
|
|
159
|
-
sheet.replaceSync(result);
|
|
160
|
-
return sheet;
|
|
161
|
-
}
|
|
162
|
-
function classify(...args) {
|
|
163
|
-
let resultString = "";
|
|
164
|
-
for (let index = 0;index < args.length; index++) {
|
|
165
|
-
const argument = args[index];
|
|
166
|
-
if (!argument) {
|
|
167
|
-
continue;
|
|
168
|
-
}
|
|
169
|
-
if (typeof argument === "string" || typeof argument === "number") {
|
|
170
|
-
if (resultString) {
|
|
171
|
-
resultString += " ";
|
|
172
|
-
}
|
|
173
|
-
resultString += argument;
|
|
174
|
-
continue;
|
|
175
|
-
}
|
|
176
|
-
if (Array.isArray(argument)) {
|
|
177
|
-
const nestedResult = classify(...argument);
|
|
178
|
-
if (nestedResult) {
|
|
179
|
-
if (resultString) {
|
|
180
|
-
resultString += " ";
|
|
181
|
-
}
|
|
182
|
-
resultString += nestedResult;
|
|
183
|
-
}
|
|
184
|
-
continue;
|
|
185
|
-
}
|
|
186
|
-
if (typeof argument === "object") {
|
|
187
|
-
for (const className in argument) {
|
|
188
|
-
if (argument[className]) {
|
|
189
|
-
if (resultString) {
|
|
190
|
-
resultString += " ";
|
|
191
|
-
}
|
|
192
|
-
resultString += className;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
return resultString;
|
|
198
|
-
}
|
|
199
|
-
// src/util/attributes.ts
|
|
200
|
-
function serializeAttribute(value) {
|
|
201
|
-
if (typeof value === "string" || typeof value === "number") {
|
|
202
|
-
return `${value}`;
|
|
203
|
-
}
|
|
204
|
-
if (value === true) {
|
|
205
|
-
return "";
|
|
206
|
-
}
|
|
207
|
-
if (value === null || value === false || value === undefined) {
|
|
208
|
-
return null;
|
|
209
|
-
}
|
|
210
|
-
return value.toString();
|
|
211
|
-
}
|
|
212
|
-
function createAttributeMap(source) {
|
|
213
|
-
const map = new Map;
|
|
214
|
-
if (source instanceof HTMLElement) {
|
|
215
|
-
for (const name of source.getAttributeNames()) {
|
|
216
|
-
map.set(name, serializeAttribute(source.getAttribute(name)));
|
|
217
|
-
}
|
|
218
|
-
return map;
|
|
219
|
-
}
|
|
220
|
-
if (source instanceof Map) {
|
|
221
|
-
for (const [key, val] of source) {
|
|
222
|
-
map.set(key, serializeAttribute(val));
|
|
223
|
-
}
|
|
224
|
-
return map;
|
|
225
|
-
}
|
|
226
|
-
if (typeof source === "object" && source !== null) {
|
|
227
|
-
for (const [key, val] of Object.entries(source)) {
|
|
228
|
-
map.set(key, serializeAttribute(val));
|
|
229
|
-
}
|
|
230
|
-
return map;
|
|
231
|
-
}
|
|
232
|
-
throw new PaletteError(0 /* INVARIANT */);
|
|
233
|
-
}
|
|
234
|
-
function applyAttributeMap(target, attrs) {
|
|
235
|
-
const currentNames = new Set(target.getAttributeNames());
|
|
236
|
-
const incomingNames = new Set(attrs.keys());
|
|
237
|
-
const attributesToRemove = currentNames.difference(incomingNames);
|
|
238
|
-
for (const attr of attributesToRemove) {
|
|
239
|
-
target.removeAttribute(attr);
|
|
240
|
-
}
|
|
241
|
-
for (const [name, val] of attrs) {
|
|
242
|
-
if (val === null) {
|
|
243
|
-
target.removeAttribute(name);
|
|
244
|
-
} else {
|
|
245
|
-
target.setAttribute(name, val);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
// src/util/change-tag.ts
|
|
250
|
-
function changeTag($target, newTag) {
|
|
251
|
-
const $newEl = document.createElement(newTag);
|
|
252
|
-
while ($target.firstChild !== null) {
|
|
253
|
-
$newEl.appendChild($target.firstChild);
|
|
254
|
-
}
|
|
255
|
-
for (const attrName of $target.getAttributeNames()) {
|
|
256
|
-
const val = $target.getAttribute(attrName);
|
|
257
|
-
if (val !== null) {
|
|
258
|
-
$newEl.setAttribute(attrName, val);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
$target.replaceWith($newEl);
|
|
262
|
-
return $newEl;
|
|
263
|
-
}
|
|
264
|
-
// src/util/element-match.ts
|
|
265
|
-
function isTagName(str) {
|
|
266
|
-
for (let i = 0;i < str.length; i++) {
|
|
267
|
-
const char = str.charCodeAt(i);
|
|
268
|
-
if (!(char === 45 /* Hyphen */ || char >= 65 /* A */ && char <= 90 /* Z */ || char >= 97 /* a */ && char <= 122 /* z */)) {
|
|
269
|
-
return false;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
return true;
|
|
273
|
-
}
|
|
274
|
-
function elementMatches(element, query) {
|
|
275
|
-
if (query[0] === "#" && query.indexOf(" ") === -1 && query.indexOf(".") === -1 && query.indexOf("[") === -1 && query.indexOf(":") === -1 && query.indexOf(">") === -1) {
|
|
276
|
-
return element.id === query.slice(1);
|
|
277
|
-
}
|
|
278
|
-
if (query[0] === "." && query.indexOf(" ") === -1 && query.indexOf("#") === -1 && query.indexOf("[") === -1 && query.indexOf(":") === -1 && query.indexOf(">") === -1) {
|
|
279
|
-
return element.classList.contains(query.slice(1));
|
|
280
|
-
}
|
|
281
|
-
if (isTagName(query)) {
|
|
282
|
-
return element.tagName.toLowerCase() === query.toLowerCase();
|
|
283
|
-
}
|
|
284
|
-
if (query[0] === "[" && query[query.length - 1] === "]" && query.indexOf(" ") === -1 && query.indexOf(":") === -1) {
|
|
285
|
-
const attr = query.slice(1, -1);
|
|
286
|
-
const eqIndex = attr.indexOf("=");
|
|
287
|
-
if (eqIndex === -1) {
|
|
288
|
-
return element.hasAttribute(attr);
|
|
289
|
-
}
|
|
290
|
-
const attrName = attr.slice(0, eqIndex);
|
|
291
|
-
const attrValue = attr.slice(eqIndex + 1).replace(/^["']|["']$/g, "");
|
|
292
|
-
return element.getAttribute(attrName) === attrValue;
|
|
293
|
-
}
|
|
294
|
-
return element.matches(query);
|
|
295
|
-
}
|
|
296
|
-
// src/util/lru-cache.ts
|
|
297
|
-
class LRUCache {
|
|
298
|
-
_maxSize;
|
|
299
|
-
_data;
|
|
300
|
-
_metrics = { hits: 0, misses: 0 };
|
|
301
|
-
constructor(maxSize = 500) {
|
|
302
|
-
if (maxSize <= 0) {
|
|
303
|
-
throw new Error("LRU Cache capacity must be >= 1");
|
|
304
|
-
}
|
|
305
|
-
if (true) {
|
|
306
|
-
this._metrics = { hits: 0, misses: 0 };
|
|
307
|
-
}
|
|
308
|
-
this._maxSize = maxSize;
|
|
309
|
-
this._data = new Map;
|
|
310
|
-
}
|
|
311
|
-
_trim = () => {
|
|
312
|
-
while (this._data.size > this._maxSize) {
|
|
313
|
-
const firstKey = this._data.keys().next().value;
|
|
314
|
-
if (firstKey === undefined) {
|
|
315
|
-
throw new Error("Absurd");
|
|
316
|
-
}
|
|
317
|
-
this._data.delete(firstKey);
|
|
318
|
-
}
|
|
319
|
-
};
|
|
320
|
-
get metrics() {
|
|
321
|
-
if (true) {
|
|
322
|
-
const { hits = 0, misses = 0 } = this._metrics ?? {};
|
|
323
|
-
const lookups = hits + misses;
|
|
324
|
-
const hitRate = lookups === 0 ? 0 : hits / lookups;
|
|
325
|
-
return {
|
|
326
|
-
lookups,
|
|
327
|
-
hits,
|
|
328
|
-
misses,
|
|
329
|
-
capacity: this._maxSize,
|
|
330
|
-
entries: this._data.size,
|
|
331
|
-
hitRate
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
return {
|
|
335
|
-
lookups: 0,
|
|
336
|
-
hits: 0,
|
|
337
|
-
misses: 0,
|
|
338
|
-
capacity: 0,
|
|
339
|
-
entries: 0,
|
|
340
|
-
hitRate: 0
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
setCapacity = (maxSize) => {
|
|
344
|
-
if (maxSize <= 0 && true) {
|
|
345
|
-
console.warn("[Palette LRU Cache] Cache size is <= 0. Cache is disabled.");
|
|
346
|
-
}
|
|
347
|
-
this._maxSize = maxSize;
|
|
348
|
-
this._trim();
|
|
349
|
-
};
|
|
350
|
-
get(key) {
|
|
351
|
-
const value = this._data.get(key);
|
|
352
|
-
if (value === undefined) {
|
|
353
|
-
if (true) {
|
|
354
|
-
this._metrics.misses += 1;
|
|
355
|
-
}
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
this._data.delete(key);
|
|
359
|
-
this._data.set(key, value);
|
|
360
|
-
if (true) {
|
|
361
|
-
this._metrics.hits += 1;
|
|
362
|
-
}
|
|
363
|
-
return value;
|
|
364
|
-
}
|
|
365
|
-
set(key, value) {
|
|
366
|
-
if (this._data.has(key)) {
|
|
367
|
-
this._data.delete(key);
|
|
368
|
-
}
|
|
369
|
-
this._data.set(key, value);
|
|
370
|
-
if (this._data.size > this._maxSize) {
|
|
371
|
-
this._trim();
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
clear() {
|
|
375
|
-
this._data.clear();
|
|
376
|
-
}
|
|
377
|
-
get size() {
|
|
378
|
-
return this._data.size;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
var lru_cache_default = LRUCache;
|
|
382
|
-
|
|
383
|
-
// src/util/fragments.ts
|
|
384
|
-
var fragmentCache = new lru_cache_default;
|
|
385
|
-
function htmlToFragment(html) {
|
|
386
|
-
const lookup = fragmentCache.get(html);
|
|
387
|
-
if (lookup !== undefined) {
|
|
388
|
-
return lookup.cloneNode(true);
|
|
389
|
-
}
|
|
390
|
-
const temp = document.createElement("template");
|
|
391
|
-
temp.innerHTML = html;
|
|
392
|
-
fragmentCache.set(html, temp.content);
|
|
393
|
-
return temp.content.cloneNode(true);
|
|
394
|
-
}
|
|
395
|
-
// src/helper/html.ts
|
|
396
|
-
function parseTemplateStringValue(val) {
|
|
397
|
-
if (val instanceof HTMLTemplateElement) {
|
|
398
|
-
return val.innerHTML;
|
|
399
|
-
}
|
|
400
|
-
if (typeof val === "function" && (val.prototype instanceof Component || val === Component)) {
|
|
401
|
-
const tagName = val.tagName;
|
|
402
|
-
if (!isTagName(tagName)) {
|
|
403
|
-
throw new PaletteError(202 /* TEMPLATE_INVALID_COMPONENT */, val.name, val.tagName);
|
|
404
|
-
}
|
|
405
|
-
return tagName;
|
|
406
|
-
}
|
|
407
|
-
if (typeof val === "string") {
|
|
408
|
-
return `<span ::swap="${val}"></span>`;
|
|
409
|
-
}
|
|
410
|
-
throw new PaletteError(200 /* TEMPLATE_INVALID */, String(val));
|
|
411
|
-
}
|
|
412
|
-
function html(strings, ...values) {
|
|
413
|
-
const fullString = strings.reduce((acc, str, i) => {
|
|
414
|
-
const parsedValue = values[i] ? `${parseTemplateStringValue(values[i])}` : "";
|
|
415
|
-
return acc + str + parsedValue;
|
|
416
|
-
}, "");
|
|
417
|
-
const templateElement = document.createElement("template");
|
|
418
|
-
templateElement.innerHTML = fullString;
|
|
419
|
-
return templateElement;
|
|
420
|
-
}
|
|
421
173
|
// src/state/state.ts
|
|
422
|
-
var PROXY_DEPTH_WARNING_LIMIT = 4;
|
|
423
174
|
var ArrayMutatorFunctions = new Set([
|
|
424
175
|
"push",
|
|
425
176
|
"pop",
|
|
@@ -439,18 +190,18 @@ var DataStructureMutatorFunctions = new Set([
|
|
|
439
190
|
]);
|
|
440
191
|
|
|
441
192
|
class State {
|
|
193
|
+
static isState(value) {
|
|
194
|
+
return value !== null && typeof value === "object" && value instanceof State;
|
|
195
|
+
}
|
|
442
196
|
_data;
|
|
443
197
|
_listeners = new Set;
|
|
444
198
|
_proxy;
|
|
445
199
|
_proxyCache = new WeakMap;
|
|
446
200
|
_reverseProxyCache = new WeakMap;
|
|
447
|
-
|
|
448
|
-
_hasWarned = false;
|
|
449
|
-
constructor(initialData, onChange) {
|
|
201
|
+
constructor(initialData, listener) {
|
|
450
202
|
this._data = initialData;
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
this._listeners.add(onChange);
|
|
203
|
+
if (listener) {
|
|
204
|
+
this._listeners.add(listener);
|
|
454
205
|
}
|
|
455
206
|
}
|
|
456
207
|
_createProxy(target, path = []) {
|
|
@@ -461,16 +212,6 @@ class State {
|
|
|
461
212
|
if (cached) {
|
|
462
213
|
return cached;
|
|
463
214
|
}
|
|
464
|
-
if (true) {
|
|
465
|
-
if (!this._hasWarned && path.length > PROXY_DEPTH_WARNING_LIMIT) {
|
|
466
|
-
this._hasWarned = true;
|
|
467
|
-
console.warn(`
|
|
468
|
-
[State] Deeply nested live state access may have performance impacts. For deeply
|
|
469
|
-
nested or complex state updates, use .mutate(), .patch(), or .transaction() for
|
|
470
|
-
optimal performance (Warning while evaluating live access to ${path.join(".")})
|
|
471
|
-
`);
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
215
|
const proxy = new Proxy(target, {
|
|
475
216
|
get: (obj, key) => {
|
|
476
217
|
if (typeof key === "symbol") {
|
|
@@ -488,9 +229,6 @@ optimal performance (Warning while evaluating live access to ${path.join(".")})
|
|
|
488
229
|
}
|
|
489
230
|
const res = current[key](...args);
|
|
490
231
|
if (isMutation) {
|
|
491
|
-
if (this._isLocked) {
|
|
492
|
-
throw new PaletteError(305 /* STATE_LOCKED */);
|
|
493
|
-
}
|
|
494
232
|
this._processIncomingState(snapshot);
|
|
495
233
|
}
|
|
496
234
|
return res;
|
|
@@ -502,9 +240,6 @@ optimal performance (Warning while evaluating live access to ${path.join(".")})
|
|
|
502
240
|
return value;
|
|
503
241
|
},
|
|
504
242
|
set: (_obj, key, value) => {
|
|
505
|
-
if (this._isLocked) {
|
|
506
|
-
throw new PaletteError(305 /* STATE_LOCKED */);
|
|
507
|
-
}
|
|
508
243
|
if (typeof key === "symbol") {
|
|
509
244
|
return false;
|
|
510
245
|
}
|
|
@@ -567,18 +302,18 @@ optimal performance (Warning while evaluating live access to ${path.join(".")})
|
|
|
567
302
|
let current = this._data;
|
|
568
303
|
for (let i = 0;i < path.length - 1; i++) {
|
|
569
304
|
const key = path[i] ?? "";
|
|
570
|
-
if (
|
|
305
|
+
if (current === undefined) {
|
|
571
306
|
throw new PaletteError(303 /* INVALID_STATE_KEY */, path.join("."));
|
|
572
307
|
}
|
|
573
308
|
current = current[key];
|
|
574
309
|
}
|
|
575
310
|
const finalKey = path[path.length - 1] ?? "";
|
|
576
|
-
if (
|
|
311
|
+
if (current === undefined) {
|
|
577
312
|
throw new PaletteError(303 /* INVALID_STATE_KEY */, path.join("."));
|
|
578
313
|
}
|
|
579
314
|
if (current[finalKey] !== value && !Object.is(current[finalKey], value)) {
|
|
580
315
|
current[finalKey] = value;
|
|
581
|
-
this._emit(this.
|
|
316
|
+
this._emit(this.raw);
|
|
582
317
|
}
|
|
583
318
|
}
|
|
584
319
|
_processIncomingState = (incomingState) => {
|
|
@@ -596,13 +331,14 @@ optimal performance (Warning while evaluating live access to ${path.join(".")})
|
|
|
596
331
|
if (hasChanges) {
|
|
597
332
|
this._emit(this._data);
|
|
598
333
|
}
|
|
334
|
+
return this;
|
|
599
335
|
};
|
|
600
336
|
_emit = (data) => {
|
|
601
337
|
for (const listener of this._listeners) {
|
|
602
338
|
listener(data);
|
|
603
339
|
}
|
|
604
340
|
};
|
|
605
|
-
get
|
|
341
|
+
get raw() {
|
|
606
342
|
return this._data;
|
|
607
343
|
}
|
|
608
344
|
get live() {
|
|
@@ -611,9 +347,6 @@ optimal performance (Warning while evaluating live access to ${path.join(".")})
|
|
|
611
347
|
}
|
|
612
348
|
return this._proxy;
|
|
613
349
|
}
|
|
614
|
-
get isLocked() {
|
|
615
|
-
return this._isLocked;
|
|
616
|
-
}
|
|
617
350
|
addListener = (listener) => {
|
|
618
351
|
this._listeners.add(listener);
|
|
619
352
|
};
|
|
@@ -627,114 +360,233 @@ optimal performance (Warning while evaluating live access to ${path.join(".")})
|
|
|
627
360
|
return structuredClone(this._data);
|
|
628
361
|
};
|
|
629
362
|
set = (key, value) => {
|
|
630
|
-
if (this._isLocked) {
|
|
631
|
-
throw new PaletteError(305 /* STATE_LOCKED */);
|
|
632
|
-
}
|
|
633
363
|
const partial = {};
|
|
634
364
|
partial[key] = value;
|
|
635
|
-
this._processIncomingState(partial);
|
|
365
|
+
return this._processIncomingState(partial);
|
|
636
366
|
};
|
|
637
367
|
patch = (patch) => {
|
|
638
|
-
|
|
639
|
-
throw new PaletteError(305 /* STATE_LOCKED */);
|
|
640
|
-
}
|
|
641
|
-
this._processIncomingState(patch);
|
|
642
|
-
return this;
|
|
368
|
+
return this._processIncomingState(patch);
|
|
643
369
|
};
|
|
644
370
|
replace = (state) => {
|
|
645
|
-
if (this._isLocked) {
|
|
646
|
-
throw new PaletteError(305 /* STATE_LOCKED */);
|
|
647
|
-
}
|
|
648
371
|
this._data = state;
|
|
649
372
|
this._emit(this._data);
|
|
650
373
|
return this;
|
|
651
374
|
};
|
|
652
|
-
lock = () => {
|
|
653
|
-
if (this._isLocked) {
|
|
654
|
-
throw new PaletteError(305 /* STATE_LOCKED */);
|
|
655
|
-
}
|
|
656
|
-
this._isLocked = true;
|
|
657
|
-
return this;
|
|
658
|
-
};
|
|
659
|
-
unlock = () => {
|
|
660
|
-
this._isLocked = false;
|
|
661
|
-
return this;
|
|
662
|
-
};
|
|
663
375
|
mutate = (mutator) => {
|
|
664
|
-
|
|
665
|
-
throw new PaletteError(305 /* STATE_LOCKED */);
|
|
666
|
-
}
|
|
667
|
-
this._processIncomingState(mutator(this.snapshot()));
|
|
668
|
-
return this;
|
|
376
|
+
return this._processIncomingState(mutator(this.snapshot()));
|
|
669
377
|
};
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
378
|
+
}
|
|
379
|
+
// src/util/lru-cache.ts
|
|
380
|
+
class LRUCache {
|
|
381
|
+
_maxSize;
|
|
382
|
+
_data;
|
|
383
|
+
_metrics = { hits: 0, misses: 0 };
|
|
384
|
+
constructor(maxSize = 500) {
|
|
385
|
+
if (maxSize <= 0) {
|
|
386
|
+
throw new Error("LRU Cache capacity must be >= 1");
|
|
673
387
|
}
|
|
674
|
-
if (
|
|
675
|
-
this.
|
|
388
|
+
if (true) {
|
|
389
|
+
this._metrics = { hits: 0, misses: 0 };
|
|
676
390
|
}
|
|
677
|
-
|
|
678
|
-
this.
|
|
679
|
-
|
|
680
|
-
|
|
391
|
+
this._maxSize = maxSize;
|
|
392
|
+
this._data = new Map;
|
|
393
|
+
}
|
|
394
|
+
_trim = () => {
|
|
395
|
+
while (this._data.size > this._maxSize) {
|
|
396
|
+
const firstKey = this._data.keys().next().value;
|
|
397
|
+
if (firstKey === undefined) {
|
|
398
|
+
throw new Error("Absurd");
|
|
399
|
+
}
|
|
400
|
+
this._data.delete(firstKey);
|
|
681
401
|
}
|
|
682
|
-
return this;
|
|
683
402
|
};
|
|
684
|
-
|
|
685
|
-
if (
|
|
686
|
-
|
|
403
|
+
getMetrics() {
|
|
404
|
+
if (true) {
|
|
405
|
+
const { hits = 0, misses = 0 } = this._metrics ?? {};
|
|
406
|
+
const lookups = hits + misses;
|
|
407
|
+
const hitRate = lookups === 0 ? 0 : hits / lookups;
|
|
408
|
+
return {
|
|
409
|
+
lookups,
|
|
410
|
+
hits,
|
|
411
|
+
misses,
|
|
412
|
+
capacity: this._maxSize,
|
|
413
|
+
entries: this._data.size,
|
|
414
|
+
hitRate
|
|
415
|
+
};
|
|
687
416
|
}
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
fn(transactionState);
|
|
693
|
-
this._processIncomingState(transactionState.current);
|
|
694
|
-
} catch (error) {
|
|
695
|
-
if (true) {
|
|
696
|
-
console.warn("[State] Transaction failed due to caught error", error);
|
|
697
|
-
}
|
|
698
|
-
success = false;
|
|
699
|
-
} finally {
|
|
700
|
-
this._isLocked = false;
|
|
417
|
+
}
|
|
418
|
+
setCapacity = (maxSize) => {
|
|
419
|
+
if (maxSize <= 0 && true) {
|
|
420
|
+
console.warn("[Palette LRU Cache] Cache size is <= 0. Cache is disabled.");
|
|
701
421
|
}
|
|
702
|
-
|
|
422
|
+
this._maxSize = maxSize;
|
|
423
|
+
this._trim();
|
|
703
424
|
};
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
}
|
|
708
|
-
this._isLocked = true;
|
|
709
|
-
let success = true;
|
|
710
|
-
try {
|
|
711
|
-
const transactionState = new State(this.snapshot());
|
|
712
|
-
await fn(transactionState);
|
|
713
|
-
this._processIncomingState(transactionState.current);
|
|
714
|
-
} catch (error) {
|
|
425
|
+
get(key) {
|
|
426
|
+
const value = this._data.get(key);
|
|
427
|
+
if (value === undefined) {
|
|
715
428
|
if (true) {
|
|
716
|
-
|
|
429
|
+
this._metrics.misses += 1;
|
|
717
430
|
}
|
|
718
|
-
|
|
719
|
-
} finally {
|
|
720
|
-
this._isLocked = false;
|
|
431
|
+
return;
|
|
721
432
|
}
|
|
722
|
-
|
|
723
|
-
|
|
433
|
+
this._data.delete(key);
|
|
434
|
+
this._data.set(key, value);
|
|
435
|
+
if (true) {
|
|
436
|
+
this._metrics.hits += 1;
|
|
437
|
+
}
|
|
438
|
+
return value;
|
|
439
|
+
}
|
|
440
|
+
set(key, value) {
|
|
441
|
+
if (this._data.has(key)) {
|
|
442
|
+
this._data.delete(key);
|
|
443
|
+
}
|
|
444
|
+
this._data.set(key, value);
|
|
445
|
+
if (this._data.size > this._maxSize) {
|
|
446
|
+
this._trim();
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
clear() {
|
|
450
|
+
this._data.clear();
|
|
451
|
+
}
|
|
452
|
+
get size() {
|
|
453
|
+
return this._data.size;
|
|
454
|
+
}
|
|
724
455
|
}
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
456
|
+
var lru_cache_default = LRUCache;
|
|
457
|
+
|
|
458
|
+
// src/util/fragments.ts
|
|
459
|
+
var fragmentCache = new lru_cache_default;
|
|
460
|
+
function htmlToFragment(html) {
|
|
461
|
+
const lookup = fragmentCache.get(html);
|
|
462
|
+
if (lookup !== undefined) {
|
|
463
|
+
return lookup.cloneNode(true);
|
|
464
|
+
}
|
|
465
|
+
const temp = document.createElement("template");
|
|
466
|
+
temp.innerHTML = html;
|
|
467
|
+
fragmentCache.set(html, temp.content);
|
|
468
|
+
return temp.content.cloneNode(true);
|
|
469
|
+
}
|
|
470
|
+
function saveFragment(html, fragment) {
|
|
471
|
+
fragmentCache.set(html, fragment);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// src/util/attributes.ts
|
|
475
|
+
function serializeAttribute(value) {
|
|
476
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
477
|
+
return `${value}`;
|
|
478
|
+
}
|
|
479
|
+
if (value === true) {
|
|
480
|
+
return "";
|
|
481
|
+
}
|
|
482
|
+
if (value === null || value === false || value === undefined) {
|
|
483
|
+
return null;
|
|
484
|
+
}
|
|
485
|
+
return value.toString();
|
|
486
|
+
}
|
|
487
|
+
function applyAttribute(element, name, value) {
|
|
488
|
+
if (value === null) {
|
|
489
|
+
element.removeAttribute(name);
|
|
490
|
+
} else {
|
|
491
|
+
element.setAttribute(name, value);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
function getElementAttributes(source) {
|
|
495
|
+
const attrs = {};
|
|
496
|
+
for (const name of source.getAttributeNames()) {
|
|
497
|
+
attrs[name] = serializeAttribute(source.getAttribute(name));
|
|
498
|
+
}
|
|
499
|
+
return attrs;
|
|
500
|
+
}
|
|
501
|
+
function applyElementAttributes(target, attrs) {
|
|
502
|
+
const currentNames = new Set(target.getAttributeNames());
|
|
503
|
+
const incomingNames = new Set(Object.keys(attrs));
|
|
504
|
+
const attributesToRemove = currentNames.difference(incomingNames);
|
|
505
|
+
for (const attr of attributesToRemove) {
|
|
506
|
+
target.removeAttribute(attr);
|
|
507
|
+
}
|
|
508
|
+
for (const [name, val] of Object.entries(attrs)) {
|
|
509
|
+
applyAttribute(target, name, serializeAttribute(val));
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
function formatAttributeRecord(record) {
|
|
513
|
+
const out = {};
|
|
514
|
+
for (const [key, val] of Object.entries(record)) {
|
|
515
|
+
out[key] = serializeAttribute(val);
|
|
729
516
|
}
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
517
|
+
return out;
|
|
518
|
+
}
|
|
519
|
+
// src/util/element-match.ts
|
|
520
|
+
function isTagName(str) {
|
|
521
|
+
for (let i = 0;i < str.length; i++) {
|
|
522
|
+
const char = str.charAt(i);
|
|
523
|
+
if (!(char === "-" || char >= "A" && char <= "Z" || char >= "a" && char <= "z")) {
|
|
733
524
|
return false;
|
|
734
525
|
}
|
|
735
526
|
}
|
|
736
527
|
return true;
|
|
737
528
|
}
|
|
529
|
+
function elementMatches(element, query) {
|
|
530
|
+
if (query[0] === "#" && query.indexOf(" ") === -1 && query.indexOf(".") === -1 && query.indexOf("[") === -1 && query.indexOf(":") === -1 && query.indexOf(">") === -1) {
|
|
531
|
+
return element.id === query.slice(1);
|
|
532
|
+
}
|
|
533
|
+
if (query[0] === "." && query.indexOf(" ") === -1 && query.indexOf("#") === -1 && query.indexOf("[") === -1 && query.indexOf(":") === -1 && query.indexOf(">") === -1) {
|
|
534
|
+
return element.classList.contains(query.slice(1));
|
|
535
|
+
}
|
|
536
|
+
if (isTagName(query)) {
|
|
537
|
+
return element.tagName.toLowerCase() === query.toLowerCase();
|
|
538
|
+
}
|
|
539
|
+
if (query[0] === "[" && query[query.length - 1] === "]" && query.indexOf(" ") === -1 && query.indexOf(":") === -1) {
|
|
540
|
+
const attr = query.slice(1, -1);
|
|
541
|
+
const eqIndex = attr.indexOf("=");
|
|
542
|
+
if (eqIndex === -1) {
|
|
543
|
+
return element.hasAttribute(attr);
|
|
544
|
+
}
|
|
545
|
+
const attrName = attr.slice(0, eqIndex);
|
|
546
|
+
const attrValue = attr.slice(eqIndex + 1).replace(/^["']|["']$/g, "");
|
|
547
|
+
return element.getAttribute(attrName) === attrValue;
|
|
548
|
+
}
|
|
549
|
+
return element.matches(query);
|
|
550
|
+
}
|
|
551
|
+
// src/util/dom.ts
|
|
552
|
+
function walkParents(target, fn) {
|
|
553
|
+
let current = target.parentNode;
|
|
554
|
+
while (current !== null) {
|
|
555
|
+
const result = fn(current);
|
|
556
|
+
if (result) {
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
if (isShadowRoot(current)) {
|
|
560
|
+
current = current.host;
|
|
561
|
+
} else {
|
|
562
|
+
current = current.parentNode;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
return false;
|
|
566
|
+
}
|
|
567
|
+
function isElement(value) {
|
|
568
|
+
return value !== null && typeof value === "object" && value instanceof Element;
|
|
569
|
+
}
|
|
570
|
+
function isHTMLElement(value) {
|
|
571
|
+
return value !== null && typeof value === "object" && value instanceof HTMLElement;
|
|
572
|
+
}
|
|
573
|
+
function isHTMLTemplateElement(value) {
|
|
574
|
+
return value !== null && typeof value === "object" && value instanceof HTMLTemplateElement;
|
|
575
|
+
}
|
|
576
|
+
function isShadowRoot(value) {
|
|
577
|
+
return value !== null && typeof value === "object" && value instanceof ShadowRoot;
|
|
578
|
+
}
|
|
579
|
+
function isNode(value) {
|
|
580
|
+
return value !== null && typeof value === "object" && value instanceof Node;
|
|
581
|
+
}
|
|
582
|
+
function isComment(value) {
|
|
583
|
+
return value !== null && typeof value === "object" && value instanceof Comment;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// src/template/constant.ts
|
|
587
|
+
var REF_ATTR = "data-node-ref";
|
|
588
|
+
|
|
589
|
+
// src/template/syntax.ts
|
|
738
590
|
var PREFIX_MAPPING = {
|
|
739
591
|
["@" /* Attributes */]: "attr",
|
|
740
592
|
["$" /* State */]: "state",
|
|
@@ -742,7 +594,12 @@ var PREFIX_MAPPING = {
|
|
|
742
594
|
["#" /* Item */]: "item"
|
|
743
595
|
};
|
|
744
596
|
var prefixMapping = new Map(Object.entries(PREFIX_MAPPING));
|
|
597
|
+
var parsedNotationCache = new LRUCache;
|
|
745
598
|
function parseNotation(notation) {
|
|
599
|
+
const cached = parsedNotationCache.get(notation);
|
|
600
|
+
if (cached) {
|
|
601
|
+
return cached;
|
|
602
|
+
}
|
|
746
603
|
let notModifier = false;
|
|
747
604
|
let pathPart = "";
|
|
748
605
|
const computedPath = [];
|
|
@@ -753,7 +610,7 @@ function parseNotation(notation) {
|
|
|
753
610
|
} else if (isFirst) {
|
|
754
611
|
const prefix = prefixMapping.get(char);
|
|
755
612
|
if (!prefix) {
|
|
756
|
-
throw new PaletteError(201 /*
|
|
613
|
+
throw new PaletteError(201 /* TEMPLATE_INVALID_NOTATION_SYNTAX */, notation);
|
|
757
614
|
}
|
|
758
615
|
computedPath.push(prefix);
|
|
759
616
|
isFirst = false;
|
|
@@ -762,63 +619,38 @@ function parseNotation(notation) {
|
|
|
762
619
|
computedPath.push(pathPart);
|
|
763
620
|
pathPart = "";
|
|
764
621
|
} else {
|
|
765
|
-
throw new PaletteError(201 /*
|
|
622
|
+
throw new PaletteError(201 /* TEMPLATE_INVALID_NOTATION_SYNTAX */, notation);
|
|
766
623
|
}
|
|
767
624
|
} else {
|
|
768
625
|
pathPart += char;
|
|
769
626
|
}
|
|
770
627
|
}
|
|
771
628
|
if (!pathPart.length) {
|
|
772
|
-
throw new PaletteError(201 /*
|
|
629
|
+
throw new PaletteError(201 /* TEMPLATE_INVALID_NOTATION_SYNTAX */, notation);
|
|
773
630
|
}
|
|
774
631
|
computedPath.push(pathPart);
|
|
775
632
|
if (computedPath.length < 2) {
|
|
776
|
-
throw new PaletteError(201 /*
|
|
633
|
+
throw new PaletteError(201 /* TEMPLATE_INVALID_NOTATION_SYNTAX */, notation);
|
|
777
634
|
}
|
|
778
|
-
|
|
635
|
+
const parsedNotation = {
|
|
779
636
|
base: notation,
|
|
780
637
|
path: computedPath,
|
|
781
638
|
modifiers: notModifier ? { not: true } : undefined
|
|
782
639
|
};
|
|
640
|
+
parsedNotationCache.set(notation, parsedNotation);
|
|
641
|
+
return parsedNotation;
|
|
783
642
|
}
|
|
643
|
+
var valueAccessorCache = new LRUCache;
|
|
784
644
|
function buildValueAccessor(notation) {
|
|
785
|
-
const { path, modifiers } = notation;
|
|
645
|
+
const { path, modifiers, base } = notation;
|
|
646
|
+
const cached = valueAccessorCache.get(base);
|
|
647
|
+
if (cached) {
|
|
648
|
+
return cached;
|
|
649
|
+
}
|
|
786
650
|
if (path.length < 2) {
|
|
787
651
|
throw new PaletteError(0 /* INVARIANT */);
|
|
788
652
|
}
|
|
789
|
-
|
|
790
|
-
const [firstKey, secondKey] = path;
|
|
791
|
-
if (firstKey === undefined || secondKey === undefined) {
|
|
792
|
-
throw new PaletteError(0 /* INVARIANT */);
|
|
793
|
-
}
|
|
794
|
-
return (source) => {
|
|
795
|
-
const value = source?.[firstKey]?.[secondKey] ?? null;
|
|
796
|
-
if (modifiers?.not) {
|
|
797
|
-
if (firstKey === "attr") {
|
|
798
|
-
return value !== "" && !value;
|
|
799
|
-
}
|
|
800
|
-
return !value;
|
|
801
|
-
}
|
|
802
|
-
return value;
|
|
803
|
-
};
|
|
804
|
-
}
|
|
805
|
-
if (path.length === 3) {
|
|
806
|
-
const [firstKey, secondKey, thirdKey] = path;
|
|
807
|
-
if (firstKey === undefined || secondKey === undefined || thirdKey === undefined) {
|
|
808
|
-
throw new PaletteError(0 /* INVARIANT */);
|
|
809
|
-
}
|
|
810
|
-
return (source) => {
|
|
811
|
-
const value = source?.[firstKey]?.[secondKey]?.[thirdKey] ?? null;
|
|
812
|
-
if (modifiers?.not) {
|
|
813
|
-
if (firstKey === "attr") {
|
|
814
|
-
return value !== "" && !value;
|
|
815
|
-
}
|
|
816
|
-
return !value;
|
|
817
|
-
}
|
|
818
|
-
return value;
|
|
819
|
-
};
|
|
820
|
-
}
|
|
821
|
-
return (source) => {
|
|
653
|
+
const accessor = (source) => {
|
|
822
654
|
let current = source;
|
|
823
655
|
for (const part of path) {
|
|
824
656
|
if (!current || typeof current !== "object") {
|
|
@@ -834,45 +666,67 @@ function buildValueAccessor(notation) {
|
|
|
834
666
|
}
|
|
835
667
|
return current;
|
|
836
668
|
};
|
|
669
|
+
valueAccessorCache.set(base, accessor);
|
|
670
|
+
return accessor;
|
|
837
671
|
}
|
|
838
672
|
|
|
839
|
-
// src/template/
|
|
840
|
-
|
|
673
|
+
// src/template/util.ts
|
|
674
|
+
function htmlStringToTemplate(html) {
|
|
675
|
+
const fragment = htmlToFragment(html);
|
|
676
|
+
const templateElement = document.createElement("template");
|
|
677
|
+
templateElement.content.appendChild(fragment);
|
|
678
|
+
return new Template(templateElement);
|
|
679
|
+
}
|
|
841
680
|
function collectOperableNodes(fragment) {
|
|
842
681
|
const walker = document.createTreeWalker(fragment, NodeFilter.SHOW_ELEMENT);
|
|
843
682
|
const knownIgnores = new Set;
|
|
844
683
|
const nodes = [];
|
|
845
684
|
let currentNode = walker.nextNode();
|
|
846
685
|
while (currentNode) {
|
|
847
|
-
if (!(currentNode
|
|
686
|
+
if (!isHTMLElement(currentNode)) {
|
|
848
687
|
currentNode = walker.nextNode();
|
|
849
688
|
continue;
|
|
850
689
|
}
|
|
851
690
|
let parent = currentNode.parentNode;
|
|
852
|
-
let
|
|
853
|
-
while (parent && !
|
|
854
|
-
if (knownIgnores.has(parent) || parent
|
|
855
|
-
|
|
691
|
+
let isInoperable = false;
|
|
692
|
+
while (parent && !isInoperable) {
|
|
693
|
+
if (knownIgnores.has(parent) || isHTMLElement(parent) && (parent.hasAttribute("::each" /* Each */) || parent.hasAttribute("::if" /* If */) || parent.hasAttribute("::else" /* Else */) || parent.hasAttribute("::else-if" /* ElseIf */))) {
|
|
694
|
+
isInoperable = true;
|
|
856
695
|
knownIgnores.add(currentNode);
|
|
857
696
|
break;
|
|
858
697
|
}
|
|
859
698
|
parent = parent.parentNode;
|
|
860
699
|
}
|
|
861
|
-
if (!
|
|
700
|
+
if (!isInoperable) {
|
|
862
701
|
nodes.push(currentNode);
|
|
863
702
|
}
|
|
864
703
|
currentNode = walker.nextNode();
|
|
865
704
|
}
|
|
866
705
|
return nodes;
|
|
867
706
|
}
|
|
707
|
+
|
|
708
|
+
// src/template/compile.ts
|
|
709
|
+
var requiresNotation = new Set([
|
|
710
|
+
"::each" /* Each */,
|
|
711
|
+
"::if" /* If */,
|
|
712
|
+
"::else-if" /* ElseIf */,
|
|
713
|
+
"::key" /* Key */,
|
|
714
|
+
"::swap" /* Swap */,
|
|
715
|
+
"::tag" /* Tag */
|
|
716
|
+
]);
|
|
717
|
+
var compiledTemplateCache = new LRUCache;
|
|
868
718
|
function compileTemplate(source) {
|
|
719
|
+
const cachedTemplate = compiledTemplateCache.get(source);
|
|
720
|
+
if (cachedTemplate) {
|
|
721
|
+
return cachedTemplate;
|
|
722
|
+
}
|
|
869
723
|
const parsedNotations = new Map;
|
|
870
|
-
const
|
|
871
|
-
let
|
|
724
|
+
const compiledSchemes = [];
|
|
725
|
+
let nextNodeRef = 0;
|
|
872
726
|
const ensureNodeRef = (el) => {
|
|
873
727
|
let ref = el.getAttribute(REF_ATTR);
|
|
874
728
|
if (!ref) {
|
|
875
|
-
ref = `el-${
|
|
729
|
+
ref = `el-${nextNodeRef++}`;
|
|
876
730
|
el.setAttribute(REF_ATTR, ref);
|
|
877
731
|
}
|
|
878
732
|
return ref;
|
|
@@ -880,26 +734,39 @@ function compileTemplate(source) {
|
|
|
880
734
|
const clonedTemplateElement = source.content.cloneNode(true);
|
|
881
735
|
const nodes = collectOperableNodes(clonedTemplateElement);
|
|
882
736
|
for (const node of nodes) {
|
|
883
|
-
const
|
|
884
|
-
for (const
|
|
885
|
-
|
|
886
|
-
}
|
|
887
|
-
for (const [attributeName, attributeValue] of attributes2) {
|
|
737
|
+
const allAttributesForNode = node.getAttributeNames();
|
|
738
|
+
for (const attributeName of allAttributesForNode) {
|
|
739
|
+
const attributeValue = node.getAttribute(attributeName);
|
|
888
740
|
if (attributeValue === null || attributeName[0] !== ":") {
|
|
889
741
|
continue;
|
|
890
742
|
}
|
|
743
|
+
if (attributeName === "::key" /* Key */) {
|
|
744
|
+
if (!allAttributesForNode.includes("::each" /* Each */)) {
|
|
745
|
+
throw new PaletteError(208 /* TEMPLATE_INVALID_KEY_DIRECTIVE */);
|
|
746
|
+
}
|
|
747
|
+
continue;
|
|
748
|
+
}
|
|
749
|
+
if (requiresNotation.has(attributeName) && attributeValue === "") {
|
|
750
|
+
throw new PaletteError(202 /* TEMPLATE_MISSING_NOTATION */, attributeName);
|
|
751
|
+
}
|
|
891
752
|
let notation = parsedNotations.get(attributeValue);
|
|
892
753
|
if (notation === undefined) {
|
|
893
754
|
notation = parseNotation(attributeValue);
|
|
894
755
|
parsedNotations.set(attributeValue, notation);
|
|
895
756
|
}
|
|
896
757
|
node.removeAttribute(attributeName);
|
|
897
|
-
if (attributeName
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
758
|
+
if (attributeName[1] !== ":") {
|
|
759
|
+
const bindName = attributeName.slice(1);
|
|
760
|
+
const scheme = {
|
|
761
|
+
type: "attr" /* Attribute */,
|
|
762
|
+
notation: parseNotation(attributeValue),
|
|
763
|
+
attribute: bindName,
|
|
764
|
+
nodeRef: ensureNodeRef(node)
|
|
765
|
+
};
|
|
766
|
+
compiledSchemes.push(scheme);
|
|
767
|
+
} else if (attributeName === "::tag" /* Tag */) {
|
|
768
|
+
compiledSchemes.push({
|
|
769
|
+
type: "tag" /* Tag */,
|
|
903
770
|
notation,
|
|
904
771
|
nodeRef: ensureNodeRef(node)
|
|
905
772
|
});
|
|
@@ -907,7 +774,7 @@ function compileTemplate(source) {
|
|
|
907
774
|
const nodeRef = ensureNodeRef(node);
|
|
908
775
|
const keyNotation = node.getAttribute("::key" /* Key */);
|
|
909
776
|
if (keyNotation === null) {
|
|
910
|
-
throw new PaletteError(
|
|
777
|
+
throw new PaletteError(205 /* TEMPLATE_MISSING_LIST_KEY */);
|
|
911
778
|
}
|
|
912
779
|
node.removeAttribute("::key" /* Key */);
|
|
913
780
|
const listContentHtml = node.innerHTML;
|
|
@@ -915,31 +782,72 @@ function compileTemplate(source) {
|
|
|
915
782
|
node.removeChild(node.firstChild);
|
|
916
783
|
}
|
|
917
784
|
const scheme = {
|
|
918
|
-
type: "
|
|
785
|
+
type: "list" /* List */,
|
|
919
786
|
notation,
|
|
920
787
|
keyNotation: parseNotation(keyNotation),
|
|
921
788
|
nodeRef,
|
|
922
789
|
listContentHtml
|
|
923
790
|
};
|
|
924
|
-
|
|
791
|
+
compiledSchemes.push(scheme);
|
|
925
792
|
} else if (attributeName === "::swap" /* Swap */) {
|
|
926
793
|
const scheme = {
|
|
927
|
-
type: "swap"
|
|
794
|
+
type: "swap" /* Swap */,
|
|
928
795
|
notation,
|
|
929
796
|
nodeRef: ensureNodeRef(node)
|
|
930
797
|
};
|
|
931
|
-
|
|
932
|
-
} else if (
|
|
933
|
-
const bindName = attributeName.slice(1);
|
|
798
|
+
compiledSchemes.push(scheme);
|
|
799
|
+
} else if (attributeName === "::if" /* If */) {
|
|
934
800
|
const scheme = {
|
|
935
|
-
type: "
|
|
801
|
+
type: "cond" /* Conditional */,
|
|
802
|
+
branches: []
|
|
803
|
+
};
|
|
804
|
+
node.removeAttribute("::if" /* If */);
|
|
805
|
+
const ifBranch = {
|
|
806
|
+
type: "::if" /* If */,
|
|
936
807
|
notation,
|
|
937
|
-
|
|
938
|
-
|
|
808
|
+
branchRootRef: ensureNodeRef(node),
|
|
809
|
+
branchTemplateHTML: node.innerHTML
|
|
939
810
|
};
|
|
940
|
-
|
|
811
|
+
scheme.branches.push(ifBranch);
|
|
812
|
+
let condNode = node.nextElementSibling;
|
|
813
|
+
while (condNode?.hasAttribute("::else-if" /* ElseIf */)) {
|
|
814
|
+
if (!isHTMLElement(condNode)) {
|
|
815
|
+
break;
|
|
816
|
+
}
|
|
817
|
+
const baseElseIfNotation = condNode.getAttribute("::else-if" /* ElseIf */);
|
|
818
|
+
if (!baseElseIfNotation) {
|
|
819
|
+
throw new PaletteError(202 /* TEMPLATE_MISSING_NOTATION */, "::else-if" /* ElseIf */);
|
|
820
|
+
}
|
|
821
|
+
let parsedElseIfNotation = parsedNotations.get(baseElseIfNotation);
|
|
822
|
+
if (parsedElseIfNotation === undefined) {
|
|
823
|
+
parsedElseIfNotation = parseNotation(baseElseIfNotation);
|
|
824
|
+
parsedNotations.set(baseElseIfNotation, parsedElseIfNotation);
|
|
825
|
+
}
|
|
826
|
+
condNode.removeAttribute("::else-if" /* ElseIf */);
|
|
827
|
+
const elseIfBranch = {
|
|
828
|
+
type: "::else-if" /* ElseIf */,
|
|
829
|
+
notation: parsedElseIfNotation,
|
|
830
|
+
branchRootRef: ensureNodeRef(condNode),
|
|
831
|
+
branchTemplateHTML: condNode.innerHTML
|
|
832
|
+
};
|
|
833
|
+
scheme.branches.push(elseIfBranch);
|
|
834
|
+
condNode = condNode.nextElementSibling;
|
|
835
|
+
}
|
|
836
|
+
if (condNode && isHTMLElement(condNode) && condNode?.hasAttribute("::else" /* Else */)) {
|
|
837
|
+
condNode.removeAttribute("::else" /* Else */);
|
|
838
|
+
const elseBranch = {
|
|
839
|
+
type: "::else" /* Else */,
|
|
840
|
+
branchRootRef: ensureNodeRef(condNode),
|
|
841
|
+
branchTemplateHTML: condNode.innerHTML
|
|
842
|
+
};
|
|
843
|
+
scheme.branches.push(elseBranch);
|
|
844
|
+
}
|
|
845
|
+
compiledSchemes.push(scheme);
|
|
941
846
|
} else {
|
|
942
847
|
if (true) {
|
|
848
|
+
if (attributeName === "::else" /* Else */ || attributeName === "::else-if" /* ElseIf */) {
|
|
849
|
+
throw new PaletteError(207 /* TEMPLATE_INVALID_CONDITIONAL */);
|
|
850
|
+
}
|
|
943
851
|
console.warn(`Template: ${attributeName} is not a valid directive`);
|
|
944
852
|
}
|
|
945
853
|
}
|
|
@@ -951,117 +859,110 @@ function compileTemplate(source) {
|
|
|
951
859
|
}
|
|
952
860
|
const temp = document.createElement("div");
|
|
953
861
|
temp.appendChild(clonedTemplateElement.cloneNode(true));
|
|
954
|
-
const
|
|
862
|
+
const html = temp.innerHTML;
|
|
955
863
|
const compiled = {
|
|
956
|
-
html
|
|
957
|
-
schemes,
|
|
864
|
+
html,
|
|
865
|
+
schemes: compiledSchemes,
|
|
958
866
|
notations
|
|
959
867
|
};
|
|
868
|
+
compiledTemplateCache.set(source, compiled);
|
|
869
|
+
saveFragment(html, clonedTemplateElement);
|
|
960
870
|
return compiled;
|
|
961
871
|
}
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
const fragment = prototypeFragment ?? htmlToFragment(compiled.html);
|
|
970
|
-
const walker = document.createTreeWalker(fragment, NodeFilter.SHOW_ELEMENT, {
|
|
971
|
-
acceptNode(node) {
|
|
972
|
-
return node.hasAttribute(REF_ATTR) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
|
|
872
|
+
|
|
873
|
+
// src/helper/css.ts
|
|
874
|
+
function parseCSSTemplateStringValue(val) {
|
|
875
|
+
if (typeof val === "function") {
|
|
876
|
+
const tagName = val.tagName;
|
|
877
|
+
if (!isTagName(tagName)) {
|
|
878
|
+
throw new PaletteError(203 /* TEMPLATE_INVALID_COMPONENT */, val.name, val.tagName);
|
|
973
879
|
}
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
880
|
+
return tagName;
|
|
881
|
+
}
|
|
882
|
+
if (typeof val === "string") {
|
|
883
|
+
return val;
|
|
884
|
+
}
|
|
885
|
+
throw new PaletteError(200 /* TEMPLATE_INVALID_VALUE */, String(val));
|
|
886
|
+
}
|
|
887
|
+
function css(strings, ...values) {
|
|
888
|
+
let result = strings[0] ?? "";
|
|
889
|
+
for (let i = 0;i < values.length; i++) {
|
|
890
|
+
const nextVal = values[i] ?? "";
|
|
891
|
+
const nextStr = strings[i + 1] ?? "";
|
|
892
|
+
result += parseCSSTemplateStringValue(nextVal);
|
|
893
|
+
result += nextStr;
|
|
894
|
+
}
|
|
895
|
+
const sheet = new CSSStyleSheet;
|
|
896
|
+
sheet.replaceSync(result);
|
|
897
|
+
return sheet;
|
|
898
|
+
}
|
|
899
|
+
function classify(...args) {
|
|
900
|
+
let resultString = "";
|
|
901
|
+
for (let index = 0;index < args.length; index++) {
|
|
902
|
+
const argument = args[index];
|
|
903
|
+
if (!argument) {
|
|
978
904
|
continue;
|
|
979
905
|
}
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
markNode = walker.nextNode();
|
|
987
|
-
}
|
|
988
|
-
const associatePlan = (plan, notation) => {
|
|
989
|
-
let notationPlans = plansByNotation.get(notation);
|
|
990
|
-
if (!notationPlans) {
|
|
991
|
-
notationPlans = new Set;
|
|
992
|
-
plansByNotation.set(notation, notationPlans);
|
|
906
|
+
if (typeof argument === "string" || typeof argument === "number") {
|
|
907
|
+
if (resultString) {
|
|
908
|
+
resultString += " ";
|
|
909
|
+
}
|
|
910
|
+
resultString += argument;
|
|
911
|
+
continue;
|
|
993
912
|
}
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
913
|
+
if (Array.isArray(argument)) {
|
|
914
|
+
const nestedResult = classify(...argument);
|
|
915
|
+
if (nestedResult) {
|
|
916
|
+
if (resultString) {
|
|
917
|
+
resultString += " ";
|
|
918
|
+
}
|
|
919
|
+
resultString += nestedResult;
|
|
920
|
+
}
|
|
921
|
+
continue;
|
|
1000
922
|
}
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
923
|
+
if (typeof argument === "object") {
|
|
924
|
+
for (const className in argument) {
|
|
925
|
+
if (argument[className]) {
|
|
926
|
+
if (resultString) {
|
|
927
|
+
resultString += " ";
|
|
928
|
+
}
|
|
929
|
+
resultString += className;
|
|
930
|
+
}
|
|
1009
931
|
}
|
|
1010
|
-
const startMarker = document.createComment("list-start");
|
|
1011
|
-
const endMarker = document.createComment("list-end");
|
|
1012
|
-
listContainer.insertBefore(startMarker, itemPrototype);
|
|
1013
|
-
listContainer.insertBefore(endMarker, itemPrototype.nextSibling);
|
|
1014
|
-
const rowRootElement = itemPrototype.cloneNode(false);
|
|
1015
|
-
const templateContentFragment = htmlToFragment(scheme.listContentHtml);
|
|
1016
|
-
const rowTemplateElement = document.createElement("template");
|
|
1017
|
-
rowTemplateElement.content.appendChild(templateContentFragment);
|
|
1018
|
-
itemPrototype.remove();
|
|
1019
|
-
const plan = {
|
|
1020
|
-
type: "each",
|
|
1021
|
-
notation: scheme.notation,
|
|
1022
|
-
keyNotation: scheme.keyNotation,
|
|
1023
|
-
listContainerElement: listContainer,
|
|
1024
|
-
rowTemplateElement,
|
|
1025
|
-
rowRootElement,
|
|
1026
|
-
startMarker,
|
|
1027
|
-
endMarker,
|
|
1028
|
-
rowTemplatesByRoot: new WeakMap,
|
|
1029
|
-
rowRootsByKey: new Map
|
|
1030
|
-
};
|
|
1031
|
-
associatePlan(plan, scheme.notation.base);
|
|
1032
|
-
} else if (scheme.type === "swap") {
|
|
1033
|
-
const plan = {
|
|
1034
|
-
type: "swap",
|
|
1035
|
-
notation: scheme.notation,
|
|
1036
|
-
node: getByNodeRef(scheme.nodeRef)
|
|
1037
|
-
};
|
|
1038
|
-
associatePlan(plan, scheme.notation.base);
|
|
1039
|
-
} else if (scheme.type === "tag") {
|
|
1040
|
-
const plan = {
|
|
1041
|
-
type: "tag",
|
|
1042
|
-
notation: scheme.notation,
|
|
1043
|
-
node: getByNodeRef(scheme.nodeRef)
|
|
1044
|
-
};
|
|
1045
|
-
associatePlan(plan, plan.notation.base);
|
|
1046
|
-
} else if (scheme.type === "attr") {
|
|
1047
|
-
const plan = {
|
|
1048
|
-
type: "attr",
|
|
1049
|
-
attribute: scheme.attribute,
|
|
1050
|
-
notation: scheme.notation,
|
|
1051
|
-
node: getByNodeRef(scheme.nodeRef)
|
|
1052
|
-
};
|
|
1053
|
-
associatePlan(plan, plan.notation.base);
|
|
1054
932
|
}
|
|
1055
933
|
}
|
|
1056
|
-
return
|
|
1057
|
-
plansByNotation,
|
|
1058
|
-
notationAccessors,
|
|
1059
|
-
fragment
|
|
1060
|
-
};
|
|
934
|
+
return resultString;
|
|
1061
935
|
}
|
|
1062
|
-
|
|
1063
|
-
|
|
936
|
+
// src/helper/html.ts
|
|
937
|
+
function parseTemplateStringValue(val) {
|
|
938
|
+
if (isHTMLTemplateElement(val)) {
|
|
939
|
+
return val.innerHTML;
|
|
940
|
+
}
|
|
941
|
+
if (Component.isComponentClass(val)) {
|
|
942
|
+
const tagName = val.tagName;
|
|
943
|
+
if (!isTagName(tagName)) {
|
|
944
|
+
throw new PaletteError(203 /* TEMPLATE_INVALID_COMPONENT */, val.name, val.tagName);
|
|
945
|
+
}
|
|
946
|
+
return tagName;
|
|
947
|
+
}
|
|
948
|
+
if (typeof val === "string") {
|
|
949
|
+
return `<span ::swap="${val}"></span>`;
|
|
950
|
+
}
|
|
951
|
+
throw new PaletteError(200 /* TEMPLATE_INVALID_VALUE */, String(val));
|
|
952
|
+
}
|
|
953
|
+
function html(strings, ...values) {
|
|
954
|
+
const fullString = strings.reduce((acc, str, i) => {
|
|
955
|
+
const parsedValue = values[i] ? `${parseTemplateStringValue(values[i])}` : "";
|
|
956
|
+
return acc + str + parsedValue;
|
|
957
|
+
}, "");
|
|
958
|
+
const templateElement = document.createElement("template");
|
|
959
|
+
templateElement.innerHTML = fullString;
|
|
960
|
+
return templateElement;
|
|
961
|
+
}
|
|
962
|
+
// src/template/jobs/common.ts
|
|
1064
963
|
var SKIPPED_JOB = Symbol("noop");
|
|
964
|
+
|
|
965
|
+
// src/template/jobs/attribute.ts
|
|
1065
966
|
function prepareAttributeJob(plan, values) {
|
|
1066
967
|
const rawValue = values.get(plan.notation.base);
|
|
1067
968
|
let value = typeof rawValue === "function" ? rawValue(plan.node) : rawValue;
|
|
@@ -1077,13 +978,165 @@ function prepareAttributeJob(plan, values) {
|
|
|
1077
978
|
}
|
|
1078
979
|
function runAttributeJobs(jobs) {
|
|
1079
980
|
for (const [node, name, value] of jobs) {
|
|
1080
|
-
|
|
1081
|
-
|
|
981
|
+
applyAttribute(node, name, value);
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
// src/template/jobs/conditional.ts
|
|
986
|
+
function prepareConditionalRenderJob(plan, values) {
|
|
987
|
+
let displayedBranch = null;
|
|
988
|
+
for (const branch of plan.branches) {
|
|
989
|
+
if (branch.type === "::else" /* Else */) {
|
|
990
|
+
displayedBranch = branch;
|
|
991
|
+
break;
|
|
1082
992
|
} else {
|
|
1083
|
-
|
|
993
|
+
const rawValue = values.get(branch.notation.base);
|
|
994
|
+
const value = typeof rawValue === "function" ? rawValue(plan.start) : rawValue;
|
|
995
|
+
if (value) {
|
|
996
|
+
displayedBranch = branch;
|
|
997
|
+
break;
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
return [plan, displayedBranch, values];
|
|
1002
|
+
}
|
|
1003
|
+
function runConditionalRenderJobs(jobs) {
|
|
1004
|
+
for (const [plan, branch, values] of jobs) {
|
|
1005
|
+
const parent = plan.start.parentNode;
|
|
1006
|
+
if (!parent) {
|
|
1007
|
+
throw new PaletteError(209 /* TEMPLATE_PARENT_REQUIRED */);
|
|
1008
|
+
}
|
|
1009
|
+
if (branch === null || !Object.is(plan.currentRoot, branch.branchRoot)) {
|
|
1010
|
+
const nodesToRemove = new Set;
|
|
1011
|
+
let node = plan.start;
|
|
1012
|
+
while (node && node !== plan.end) {
|
|
1013
|
+
if (isHTMLElement(node)) {
|
|
1014
|
+
nodesToRemove.add(node);
|
|
1015
|
+
}
|
|
1016
|
+
node = node.nextSibling;
|
|
1017
|
+
}
|
|
1018
|
+
for (const toRemove of nodesToRemove) {
|
|
1019
|
+
parent.removeChild(toRemove);
|
|
1020
|
+
}
|
|
1021
|
+
if (branch) {
|
|
1022
|
+
parent.insertBefore(branch.branchRoot, plan.end);
|
|
1023
|
+
}
|
|
1084
1024
|
}
|
|
1025
|
+
if (branch === null) {
|
|
1026
|
+
continue;
|
|
1027
|
+
}
|
|
1028
|
+
branch.branchTemplate.renderWithValues(branch.branchRoot, values);
|
|
1085
1029
|
}
|
|
1086
1030
|
}
|
|
1031
|
+
|
|
1032
|
+
// src/template/jobs/list.ts
|
|
1033
|
+
function fetchListData(plan, values) {
|
|
1034
|
+
const notationValue = values.get(plan.notation.base);
|
|
1035
|
+
const evaluatedValue = typeof notationValue === "function" ? notationValue(plan.startMarker.parentNode) : notationValue;
|
|
1036
|
+
if (evaluatedValue === null || evaluatedValue === undefined) {
|
|
1037
|
+
return [];
|
|
1038
|
+
}
|
|
1039
|
+
if (Array.isArray(evaluatedValue)) {
|
|
1040
|
+
return evaluatedValue;
|
|
1041
|
+
}
|
|
1042
|
+
throw new PaletteError(204 /* TEMPLATE_INVALID_LIST_DATA */);
|
|
1043
|
+
}
|
|
1044
|
+
function collectHTMLElements(start, end) {
|
|
1045
|
+
let node = start;
|
|
1046
|
+
const nodeSet = new Set;
|
|
1047
|
+
while (node && node !== end) {
|
|
1048
|
+
if (isHTMLElement(node)) {
|
|
1049
|
+
nodeSet.add(node);
|
|
1050
|
+
}
|
|
1051
|
+
node = node.nextSibling;
|
|
1052
|
+
}
|
|
1053
|
+
return nodeSet;
|
|
1054
|
+
}
|
|
1055
|
+
function prepareListRenderJob(plan, values) {
|
|
1056
|
+
const listData = fetchListData(plan, values);
|
|
1057
|
+
if (listData.length === 0) {
|
|
1058
|
+
return [plan, []];
|
|
1059
|
+
}
|
|
1060
|
+
const {
|
|
1061
|
+
rowTemplatesByRoot,
|
|
1062
|
+
rowTemplateElement,
|
|
1063
|
+
rowRootPrototype: rowRootElement
|
|
1064
|
+
} = plan;
|
|
1065
|
+
const keyAccessor = buildValueAccessor(plan.keyNotation);
|
|
1066
|
+
const listRenderContexts = new Map;
|
|
1067
|
+
for (const item of listData) {
|
|
1068
|
+
const context = {
|
|
1069
|
+
item
|
|
1070
|
+
};
|
|
1071
|
+
const key = keyAccessor(context);
|
|
1072
|
+
if (listRenderContexts.has(key)) {
|
|
1073
|
+
throw new PaletteError(206 /* TEMPLATE_DUPLICATE_LIST_KEY */, String(key));
|
|
1074
|
+
}
|
|
1075
|
+
let rowRoot = plan.rowRootsByKey.get(key);
|
|
1076
|
+
if (rowRoot === undefined) {
|
|
1077
|
+
rowRoot = rowRootElement.cloneNode(false);
|
|
1078
|
+
plan.rowRootsByKey.set(key, rowRoot);
|
|
1079
|
+
}
|
|
1080
|
+
let rowTemplate = rowTemplatesByRoot.get(rowRoot);
|
|
1081
|
+
if (rowTemplate === undefined) {
|
|
1082
|
+
rowTemplate = new Template(rowTemplateElement);
|
|
1083
|
+
rowTemplatesByRoot.set(rowRoot, rowTemplate);
|
|
1084
|
+
}
|
|
1085
|
+
const jobItem = {
|
|
1086
|
+
context,
|
|
1087
|
+
root: rowRoot,
|
|
1088
|
+
template: rowTemplate,
|
|
1089
|
+
attrs: formatAttributeRecord(item)
|
|
1090
|
+
};
|
|
1091
|
+
listRenderContexts.set(key, jobItem);
|
|
1092
|
+
}
|
|
1093
|
+
for (const [key, root] of plan.rowRootsByKey) {
|
|
1094
|
+
if (!listRenderContexts.has(key)) {
|
|
1095
|
+
plan.rowRootsByKey.delete(key);
|
|
1096
|
+
plan.rowTemplatesByRoot.delete(root);
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
return [plan, Array.from(listRenderContexts.values())];
|
|
1100
|
+
}
|
|
1101
|
+
function runListRenderJobs(jobs) {
|
|
1102
|
+
for (const [plan, renderItems] of jobs) {
|
|
1103
|
+
const { endMarker, listContainer: listContainerElement } = plan;
|
|
1104
|
+
if (renderItems.length === 0) {
|
|
1105
|
+
for (const root of plan.rowRootsByKey.values()) {
|
|
1106
|
+
root.remove();
|
|
1107
|
+
}
|
|
1108
|
+
plan.rowRootsByKey.clear();
|
|
1109
|
+
continue;
|
|
1110
|
+
}
|
|
1111
|
+
const existingDOMNodes = Array.from(collectHTMLElements(plan.startMarker, plan.endMarker));
|
|
1112
|
+
const rootsToKeep = new Set;
|
|
1113
|
+
let existingDOMNodeIdx = 0;
|
|
1114
|
+
for (const renderItem of renderItems) {
|
|
1115
|
+
const { root, attrs: attrMap, context, template } = renderItem;
|
|
1116
|
+
const existingDOMNode = existingDOMNodes[existingDOMNodeIdx];
|
|
1117
|
+
applyElementAttributes(root, attrMap);
|
|
1118
|
+
template.render(root, context);
|
|
1119
|
+
rootsToKeep.add(root);
|
|
1120
|
+
if (Object.is(existingDOMNode, root)) {
|
|
1121
|
+
existingDOMNodeIdx += 1;
|
|
1122
|
+
continue;
|
|
1123
|
+
}
|
|
1124
|
+
if (!existingDOMNode) {
|
|
1125
|
+
listContainerElement.insertBefore(root, endMarker);
|
|
1126
|
+
continue;
|
|
1127
|
+
}
|
|
1128
|
+
listContainerElement.insertBefore(root, existingDOMNode);
|
|
1129
|
+
}
|
|
1130
|
+
for (const root of existingDOMNodes) {
|
|
1131
|
+
if (!rootsToKeep.has(root)) {
|
|
1132
|
+
root.remove();
|
|
1133
|
+
plan.rowTemplatesByRoot.delete(root);
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
// src/template/jobs/swap.ts
|
|
1087
1140
|
function prepareContentSwapJob(plan, values) {
|
|
1088
1141
|
const rawValue = values.get(plan.notation.base);
|
|
1089
1142
|
const value = typeof rawValue === "function" ? rawValue(plan.node) : rawValue;
|
|
@@ -1094,11 +1147,11 @@ function prepareContentSwapJob(plan, values) {
|
|
|
1094
1147
|
}
|
|
1095
1148
|
return [plan, document.createTextNode(asStr)];
|
|
1096
1149
|
} else if (value === null || value === undefined) {
|
|
1097
|
-
if (plan.node
|
|
1150
|
+
if (isComment(plan.node)) {
|
|
1098
1151
|
return SKIPPED_JOB;
|
|
1099
1152
|
}
|
|
1100
1153
|
return [plan, document.createComment("empty")];
|
|
1101
|
-
} else if (value
|
|
1154
|
+
} else if (isHTMLElement(value)) {
|
|
1102
1155
|
if (Object.is(plan.node, value)) {
|
|
1103
1156
|
return SKIPPED_JOB;
|
|
1104
1157
|
}
|
|
@@ -1117,6 +1170,22 @@ function runContentSwapJobs(jobs) {
|
|
|
1117
1170
|
plan.node = replace;
|
|
1118
1171
|
}
|
|
1119
1172
|
}
|
|
1173
|
+
|
|
1174
|
+
// src/template/jobs/tag.ts
|
|
1175
|
+
function changeTag($target, newTag) {
|
|
1176
|
+
const $newEl = document.createElement(newTag);
|
|
1177
|
+
while ($target.firstChild !== null) {
|
|
1178
|
+
$newEl.appendChild($target.firstChild);
|
|
1179
|
+
}
|
|
1180
|
+
for (const attrName of $target.getAttributeNames()) {
|
|
1181
|
+
const val = $target.getAttribute(attrName);
|
|
1182
|
+
if (val !== null) {
|
|
1183
|
+
$newEl.setAttribute(attrName, val);
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
$target.replaceWith($newEl);
|
|
1187
|
+
return $newEl;
|
|
1188
|
+
}
|
|
1120
1189
|
function prepareTagChangeJob(plan, values) {
|
|
1121
1190
|
const rawValue = values.get(plan.notation.base) ?? "";
|
|
1122
1191
|
const value = typeof rawValue === "function" ? rawValue(plan.node) : rawValue;
|
|
@@ -1132,128 +1201,231 @@ function runTagChangeJobs(jobs) {
|
|
|
1132
1201
|
plan.node = changeTag(plan.node, nextTag);
|
|
1133
1202
|
}
|
|
1134
1203
|
}
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1204
|
+
|
|
1205
|
+
// src/template/jobs/index.ts
|
|
1206
|
+
function createJobsFromPlans(plans, newValues) {
|
|
1207
|
+
const jobs = {
|
|
1208
|
+
conditionals: [],
|
|
1209
|
+
attributes: [],
|
|
1210
|
+
swaps: [],
|
|
1211
|
+
tags: [],
|
|
1212
|
+
lists: []
|
|
1213
|
+
};
|
|
1214
|
+
for (const plan of plans) {
|
|
1215
|
+
switch (plan.type) {
|
|
1216
|
+
case "cond" /* Conditional */: {
|
|
1217
|
+
const job = prepareConditionalRenderJob(plan, newValues);
|
|
1218
|
+
if (job !== SKIPPED_JOB) {
|
|
1219
|
+
jobs.conditionals.push(job);
|
|
1220
|
+
}
|
|
1221
|
+
break;
|
|
1222
|
+
}
|
|
1223
|
+
case "attr" /* Attribute */: {
|
|
1224
|
+
const job = prepareAttributeJob(plan, newValues);
|
|
1225
|
+
if (job !== SKIPPED_JOB) {
|
|
1226
|
+
jobs.attributes.push(job);
|
|
1227
|
+
}
|
|
1228
|
+
break;
|
|
1229
|
+
}
|
|
1230
|
+
case "list" /* List */: {
|
|
1231
|
+
const job = prepareListRenderJob(plan, newValues);
|
|
1232
|
+
if (job !== SKIPPED_JOB) {
|
|
1233
|
+
jobs.lists.push(job);
|
|
1234
|
+
}
|
|
1235
|
+
break;
|
|
1236
|
+
}
|
|
1237
|
+
case "swap" /* Swap */: {
|
|
1238
|
+
const job = prepareContentSwapJob(plan, newValues);
|
|
1239
|
+
if (job !== SKIPPED_JOB) {
|
|
1240
|
+
jobs.swaps.push(job);
|
|
1241
|
+
}
|
|
1242
|
+
break;
|
|
1243
|
+
}
|
|
1244
|
+
case "tag" /* Tag */: {
|
|
1245
|
+
const job = prepareTagChangeJob(plan, newValues);
|
|
1246
|
+
if (job !== SKIPPED_JOB) {
|
|
1247
|
+
jobs.tags.push(job);
|
|
1248
|
+
}
|
|
1249
|
+
break;
|
|
1250
|
+
}
|
|
1251
|
+
default:
|
|
1252
|
+
throw new PaletteError(0 /* INVARIANT */);
|
|
1152
1253
|
}
|
|
1153
|
-
node = node.nextSibling;
|
|
1154
1254
|
}
|
|
1155
|
-
return
|
|
1255
|
+
return jobs;
|
|
1156
1256
|
}
|
|
1157
|
-
function
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1257
|
+
function executeRenderJobs(jobs) {
|
|
1258
|
+
runConditionalRenderJobs(jobs.conditionals);
|
|
1259
|
+
runAttributeJobs(jobs.attributes);
|
|
1260
|
+
runListRenderJobs(jobs.lists);
|
|
1261
|
+
runContentSwapJobs(jobs.swaps);
|
|
1262
|
+
runTagChangeJobs(jobs.tags);
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
// src/template/prepare.ts
|
|
1266
|
+
var requireParentNode = (node) => {
|
|
1267
|
+
if (!node.parentNode) {
|
|
1268
|
+
throw new PaletteError(209 /* TEMPLATE_PARENT_REQUIRED */);
|
|
1161
1269
|
}
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1270
|
+
return node.parentNode;
|
|
1271
|
+
};
|
|
1272
|
+
var createCommentBefore = (node, text = "") => {
|
|
1273
|
+
const parent = requireParentNode(node);
|
|
1274
|
+
const comment = document.createComment(text);
|
|
1275
|
+
parent.insertBefore(comment, node);
|
|
1276
|
+
return comment;
|
|
1277
|
+
};
|
|
1278
|
+
var createCommentAfter = (node, text = "") => {
|
|
1279
|
+
const parent = requireParentNode(node);
|
|
1280
|
+
const comment = document.createComment(text);
|
|
1281
|
+
parent.insertBefore(comment, node.nextSibling);
|
|
1282
|
+
return comment;
|
|
1283
|
+
};
|
|
1284
|
+
function prepareCompiledTemplate(compiled, prototypeFragment) {
|
|
1285
|
+
const plansByNotation = new Map;
|
|
1286
|
+
const notationAccessors = new Map;
|
|
1287
|
+
const subtemplates = new Set;
|
|
1288
|
+
const nodeRefs = new Map;
|
|
1289
|
+
for (const [notation, parsed] of Object.entries(compiled.notations)) {
|
|
1290
|
+
notationAccessors.set(notation, buildValueAccessor(parsed));
|
|
1291
|
+
}
|
|
1292
|
+
const fragment = prototypeFragment ?? htmlToFragment(compiled.html);
|
|
1293
|
+
const walker = document.createTreeWalker(fragment, NodeFilter.SHOW_ELEMENT, {
|
|
1294
|
+
acceptNode(node) {
|
|
1295
|
+
return node.hasAttribute(REF_ATTR) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
|
|
1172
1296
|
}
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1297
|
+
});
|
|
1298
|
+
let markNode = walker.nextNode();
|
|
1299
|
+
while (markNode) {
|
|
1300
|
+
if (!isHTMLElement(markNode)) {
|
|
1301
|
+
continue;
|
|
1177
1302
|
}
|
|
1178
|
-
|
|
1179
|
-
if (
|
|
1180
|
-
|
|
1181
|
-
rowTemplatesByRoot.set(rowRoot, rowTemplate);
|
|
1303
|
+
const ref = markNode.getAttribute(REF_ATTR);
|
|
1304
|
+
if (ref === null) {
|
|
1305
|
+
throw new PaletteError(0 /* INVARIANT */);
|
|
1182
1306
|
}
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
template: rowTemplate,
|
|
1187
|
-
attrMap: createAttributeMap(item)
|
|
1188
|
-
};
|
|
1189
|
-
listRenderContexts.set(key, jobItem);
|
|
1307
|
+
nodeRefs.set(ref, markNode);
|
|
1308
|
+
markNode.removeAttribute(REF_ATTR);
|
|
1309
|
+
markNode = walker.nextNode();
|
|
1190
1310
|
}
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1311
|
+
const associatePlan = (plan, notation) => {
|
|
1312
|
+
let notationPlans = plansByNotation.get(notation);
|
|
1313
|
+
if (!notationPlans) {
|
|
1314
|
+
notationPlans = new Set;
|
|
1315
|
+
plansByNotation.set(notation, notationPlans);
|
|
1195
1316
|
}
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
if (renderItems.length === 0) {
|
|
1203
|
-
for (const root of plan.rowRootsByKey.values()) {
|
|
1204
|
-
root.remove();
|
|
1205
|
-
}
|
|
1206
|
-
plan.rowRootsByKey.clear();
|
|
1207
|
-
continue;
|
|
1317
|
+
notationPlans.add(plan);
|
|
1318
|
+
};
|
|
1319
|
+
const getByNodeRef = (nodeRef) => {
|
|
1320
|
+
const cached = nodeRefs.get(nodeRef);
|
|
1321
|
+
if (cached) {
|
|
1322
|
+
return cached;
|
|
1208
1323
|
}
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
const
|
|
1214
|
-
const
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1324
|
+
throw new PaletteError(3 /* MISSING_NODE_REF */);
|
|
1325
|
+
};
|
|
1326
|
+
for (const scheme of compiled.schemes) {
|
|
1327
|
+
if (scheme.type === "list" /* List */) {
|
|
1328
|
+
const itemPrototype = getByNodeRef(scheme.nodeRef);
|
|
1329
|
+
const listParentNode = requireParentNode(itemPrototype);
|
|
1330
|
+
const rowRootPrototype = itemPrototype.cloneNode(false);
|
|
1331
|
+
const startMarker = createCommentBefore(itemPrototype);
|
|
1332
|
+
const endMarker = createCommentAfter(itemPrototype);
|
|
1333
|
+
itemPrototype.remove();
|
|
1334
|
+
const templateContentFragment = htmlToFragment(scheme.listContentHtml);
|
|
1335
|
+
const rowTemplateElement = document.createElement("template");
|
|
1336
|
+
rowTemplateElement.content.appendChild(templateContentFragment);
|
|
1337
|
+
const plan = {
|
|
1338
|
+
type: "list" /* List */,
|
|
1339
|
+
notation: scheme.notation,
|
|
1340
|
+
keyNotation: scheme.keyNotation,
|
|
1341
|
+
listContainer: listParentNode,
|
|
1342
|
+
rowTemplateElement,
|
|
1343
|
+
rowRootPrototype,
|
|
1344
|
+
startMarker,
|
|
1345
|
+
endMarker,
|
|
1346
|
+
rowTemplatesByRoot: new WeakMap,
|
|
1347
|
+
rowRootsByKey: new Map
|
|
1348
|
+
};
|
|
1349
|
+
associatePlan(plan, scheme.notation.base);
|
|
1350
|
+
} else if (scheme.type === "cond" /* Conditional */) {
|
|
1351
|
+
const firstBranch = scheme.branches[0];
|
|
1352
|
+
if (!firstBranch) {
|
|
1353
|
+
throw new PaletteError(0 /* INVARIANT */);
|
|
1225
1354
|
}
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1355
|
+
const firstBranchRoot = getByNodeRef(firstBranch.branchRootRef);
|
|
1356
|
+
const startComment = createCommentBefore(firstBranchRoot);
|
|
1357
|
+
const lastBranch = scheme.branches[scheme.branches.length - 1];
|
|
1358
|
+
const lastBranchRoot = getByNodeRef(lastBranch.branchRootRef);
|
|
1359
|
+
const endComment = createCommentAfter(lastBranchRoot);
|
|
1360
|
+
const plan = {
|
|
1361
|
+
type: "cond" /* Conditional */,
|
|
1362
|
+
start: startComment,
|
|
1363
|
+
end: endComment,
|
|
1364
|
+
branches: []
|
|
1365
|
+
};
|
|
1366
|
+
for (const branch of scheme.branches) {
|
|
1367
|
+
if (branch.type === "::if" /* If */ || branch.type === "::else-if" /* ElseIf */) {
|
|
1368
|
+
const branchRoot = getByNodeRef(branch.branchRootRef);
|
|
1369
|
+
const branchTemplate = htmlStringToTemplate(branch.branchTemplateHTML);
|
|
1370
|
+
subtemplates.add(branchTemplate);
|
|
1371
|
+
plan.branches.push({
|
|
1372
|
+
type: branch.type,
|
|
1373
|
+
notation: branch.notation,
|
|
1374
|
+
branchRoot: getByNodeRef(branch.branchRootRef),
|
|
1375
|
+
branchTemplate: htmlStringToTemplate(branch.branchTemplateHTML)
|
|
1376
|
+
});
|
|
1377
|
+
associatePlan(plan, branch.notation.base);
|
|
1378
|
+
branchRoot.remove();
|
|
1379
|
+
} else {
|
|
1380
|
+
plan.branches.push({
|
|
1381
|
+
type: branch.type,
|
|
1382
|
+
branchRoot: getByNodeRef(branch.branchRootRef),
|
|
1383
|
+
branchTemplate: htmlStringToTemplate(branch.branchTemplateHTML)
|
|
1384
|
+
});
|
|
1385
|
+
}
|
|
1232
1386
|
}
|
|
1387
|
+
} else if (scheme.type === "swap" /* Swap */ || scheme.type === "tag" /* Tag */) {
|
|
1388
|
+
const plan = {
|
|
1389
|
+
type: scheme.type,
|
|
1390
|
+
notation: scheme.notation,
|
|
1391
|
+
node: getByNodeRef(scheme.nodeRef)
|
|
1392
|
+
};
|
|
1393
|
+
associatePlan(plan, scheme.notation.base);
|
|
1394
|
+
} else if (scheme.type === "attr" /* Attribute */) {
|
|
1395
|
+
const plan = {
|
|
1396
|
+
type: "attr" /* Attribute */,
|
|
1397
|
+
attribute: scheme.attribute,
|
|
1398
|
+
notation: scheme.notation,
|
|
1399
|
+
node: getByNodeRef(scheme.nodeRef)
|
|
1400
|
+
};
|
|
1401
|
+
associatePlan(plan, plan.notation.base);
|
|
1233
1402
|
}
|
|
1234
1403
|
}
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
window.__PALETTE_DEVTOOLS__ = {
|
|
1241
|
-
dumpCacheMetrics: () => {
|
|
1242
|
-
console.log("Compiled Templates Cache", compileCache.metrics);
|
|
1243
|
-
console.log("HTML Fragments Cache", fragmentCache.metrics);
|
|
1244
|
-
}
|
|
1404
|
+
return {
|
|
1405
|
+
plansByNotation,
|
|
1406
|
+
notationAccessors,
|
|
1407
|
+
fragment,
|
|
1408
|
+
subtemplates
|
|
1245
1409
|
};
|
|
1246
1410
|
}
|
|
1247
1411
|
|
|
1412
|
+
// src/template/template.ts
|
|
1248
1413
|
class Template {
|
|
1414
|
+
static isTemplate(value) {
|
|
1415
|
+
return value !== null && typeof value === "object" && value instanceof Template;
|
|
1416
|
+
}
|
|
1249
1417
|
static cache = {
|
|
1250
1418
|
clear: () => {
|
|
1251
1419
|
fragmentCache.clear();
|
|
1252
|
-
|
|
1420
|
+
compiledTemplateCache.clear();
|
|
1421
|
+
valueAccessorCache.clear();
|
|
1422
|
+
parsedNotationCache.clear();
|
|
1253
1423
|
},
|
|
1254
1424
|
setCapacity: (maxSize) => {
|
|
1255
1425
|
fragmentCache.setCapacity(maxSize);
|
|
1256
|
-
|
|
1426
|
+
compiledTemplateCache.setCapacity(maxSize);
|
|
1427
|
+
valueAccessorCache.setCapacity(maxSize);
|
|
1428
|
+
parsedNotationCache.setCapacity(maxSize);
|
|
1257
1429
|
}
|
|
1258
1430
|
};
|
|
1259
1431
|
_compiled;
|
|
@@ -1263,21 +1435,29 @@ class Template {
|
|
|
1263
1435
|
_fragment;
|
|
1264
1436
|
_plansByNotation = new Map;
|
|
1265
1437
|
_notationAccessors = new Map;
|
|
1438
|
+
_subtemplates = new Set;
|
|
1266
1439
|
constructor(template) {
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
const cached = compileCache.get(template);
|
|
1270
|
-
const compiled = cached ?? compileTemplate(template);
|
|
1271
|
-
this._compiled = compiled;
|
|
1272
|
-
compileCache.set(template, compiled);
|
|
1273
|
-
} else {
|
|
1274
|
-
this._compiled = template;
|
|
1275
|
-
}
|
|
1440
|
+
this._templateElement = template;
|
|
1441
|
+
this._compiled = compileTemplate(template);
|
|
1276
1442
|
const fragment = htmlToFragment(this._compiled.html);
|
|
1277
1443
|
const hydrated = prepareCompiledTemplate(this._compiled, fragment);
|
|
1278
1444
|
this._plansByNotation = hydrated.plansByNotation;
|
|
1279
1445
|
this._notationAccessors = hydrated.notationAccessors;
|
|
1280
1446
|
this._fragment = hydrated.fragment;
|
|
1447
|
+
this._subtemplates = hydrated.subtemplates;
|
|
1448
|
+
const allRelevantAccessors = new Map(this._notationAccessors);
|
|
1449
|
+
for (const child of this._subtemplates) {
|
|
1450
|
+
for (const [key, val] of child.notationMap) {
|
|
1451
|
+
allRelevantAccessors.set(key, val);
|
|
1452
|
+
}
|
|
1453
|
+
}
|
|
1454
|
+
this._notationAccessors = allRelevantAccessors;
|
|
1455
|
+
}
|
|
1456
|
+
get compiled() {
|
|
1457
|
+
return this._compiled;
|
|
1458
|
+
}
|
|
1459
|
+
get notationMap() {
|
|
1460
|
+
return this._notationAccessors;
|
|
1281
1461
|
}
|
|
1282
1462
|
clone = () => {
|
|
1283
1463
|
return new Template(this.element());
|
|
@@ -1292,70 +1472,32 @@ class Template {
|
|
|
1292
1472
|
};
|
|
1293
1473
|
_collectUpdatedValues = (context) => {
|
|
1294
1474
|
const updatedValues = new Map;
|
|
1475
|
+
let hasChanges = false;
|
|
1295
1476
|
for (const [rawNotation, accessor] of this._notationAccessors) {
|
|
1296
1477
|
const previousValue = this._latestRenderedValues.get(rawNotation);
|
|
1297
1478
|
const newValue = accessor(context);
|
|
1479
|
+
updatedValues.set(rawNotation, newValue);
|
|
1298
1480
|
if (previousValue !== newValue && !Object.is(previousValue, newValue)) {
|
|
1299
|
-
|
|
1481
|
+
hasChanges = true;
|
|
1300
1482
|
}
|
|
1301
1483
|
}
|
|
1302
|
-
return updatedValues;
|
|
1484
|
+
return [hasChanges, updatedValues];
|
|
1303
1485
|
};
|
|
1304
1486
|
_update(newValues) {
|
|
1305
|
-
const
|
|
1306
|
-
const attributeJobs = [];
|
|
1307
|
-
const contentSwapJobs = [];
|
|
1308
|
-
const tagChangeJobs = [];
|
|
1309
|
-
const listRenderJobs = [];
|
|
1487
|
+
const allAffectedPlans = new Set;
|
|
1310
1488
|
for (const [notation] of newValues) {
|
|
1311
1489
|
const affectedPlans = this._plansByNotation.get(notation);
|
|
1312
|
-
if (affectedPlans) {
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
scheduledPlans.add(plan);
|
|
1318
|
-
switch (plan.type) {
|
|
1319
|
-
case "attr": {
|
|
1320
|
-
const job = prepareAttributeJob(plan, newValues);
|
|
1321
|
-
if (job !== SKIPPED_JOB) {
|
|
1322
|
-
attributeJobs.push(job);
|
|
1323
|
-
}
|
|
1324
|
-
break;
|
|
1325
|
-
}
|
|
1326
|
-
case "each": {
|
|
1327
|
-
const job = prepareListRenderJob(plan, newValues);
|
|
1328
|
-
if (job !== SKIPPED_JOB) {
|
|
1329
|
-
listRenderJobs.push(job);
|
|
1330
|
-
}
|
|
1331
|
-
break;
|
|
1332
|
-
}
|
|
1333
|
-
case "swap": {
|
|
1334
|
-
const job = prepareContentSwapJob(plan, newValues);
|
|
1335
|
-
if (job !== SKIPPED_JOB) {
|
|
1336
|
-
contentSwapJobs.push(job);
|
|
1337
|
-
}
|
|
1338
|
-
break;
|
|
1339
|
-
}
|
|
1340
|
-
case "tag": {
|
|
1341
|
-
const job = prepareTagChangeJob(plan, newValues);
|
|
1342
|
-
if (job !== SKIPPED_JOB) {
|
|
1343
|
-
tagChangeJobs.push(job);
|
|
1344
|
-
}
|
|
1345
|
-
break;
|
|
1346
|
-
}
|
|
1347
|
-
default:
|
|
1348
|
-
throw new PaletteError(0 /* INVARIANT */);
|
|
1349
|
-
}
|
|
1350
|
-
}
|
|
1490
|
+
if (!affectedPlans) {
|
|
1491
|
+
continue;
|
|
1492
|
+
}
|
|
1493
|
+
for (const plan of affectedPlans) {
|
|
1494
|
+
allAffectedPlans.add(plan);
|
|
1351
1495
|
}
|
|
1352
1496
|
}
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
runContentSwapJobs(contentSwapJobs);
|
|
1356
|
-
runTagChangeJobs(tagChangeJobs);
|
|
1497
|
+
const jobs = createJobsFromPlans(allAffectedPlans, newValues);
|
|
1498
|
+
executeRenderJobs(jobs);
|
|
1357
1499
|
}
|
|
1358
|
-
|
|
1500
|
+
renderWithValues = (root, values) => {
|
|
1359
1501
|
if (root !== this._mountedRoot) {
|
|
1360
1502
|
this._mountedRoot = root;
|
|
1361
1503
|
while (root.firstChild) {
|
|
@@ -1363,37 +1505,78 @@ class Template {
|
|
|
1363
1505
|
}
|
|
1364
1506
|
root.append(this._fragment);
|
|
1365
1507
|
}
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1508
|
+
this._update(values);
|
|
1509
|
+
};
|
|
1510
|
+
render = (root, context) => {
|
|
1511
|
+
const [hasChanges, resolvedValues] = this._collectUpdatedValues(context);
|
|
1512
|
+
if (root === this._mountedRoot && !hasChanges) {
|
|
1513
|
+
return;
|
|
1372
1514
|
}
|
|
1515
|
+
this.renderWithValues(root, resolvedValues);
|
|
1516
|
+
this._latestRenderedValues = resolvedValues;
|
|
1373
1517
|
};
|
|
1374
1518
|
}
|
|
1375
|
-
// src/
|
|
1376
|
-
class
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1519
|
+
// src/task-scheduler.ts
|
|
1520
|
+
class TaskScheduler {
|
|
1521
|
+
_queues = {
|
|
1522
|
+
tasks: [],
|
|
1523
|
+
frames: []
|
|
1524
|
+
};
|
|
1525
|
+
_promises = {};
|
|
1526
|
+
_resolvers = {};
|
|
1527
|
+
_onError;
|
|
1528
|
+
constructor(onError) {
|
|
1529
|
+
this._onError = onError;
|
|
1530
|
+
}
|
|
1531
|
+
_flushQueue = (queueType) => {
|
|
1532
|
+
const queue = this._queues[queueType];
|
|
1533
|
+
try {
|
|
1534
|
+
while (queue.length) {
|
|
1535
|
+
const task = queue.shift();
|
|
1536
|
+
task?.();
|
|
1537
|
+
}
|
|
1538
|
+
} catch (error) {
|
|
1539
|
+
if (this._onError) {
|
|
1540
|
+
this._onError(error);
|
|
1382
1541
|
} else {
|
|
1383
|
-
|
|
1384
|
-
targetDescriptor.setAttribute("data-listener-id", generatedId);
|
|
1385
|
-
return `[data-listener-id="${generatedId}"]`;
|
|
1542
|
+
throw error;
|
|
1386
1543
|
}
|
|
1387
|
-
}
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1544
|
+
} finally {
|
|
1545
|
+
this._resolvers[queueType]?.();
|
|
1546
|
+
this._resolvers[queueType] = undefined;
|
|
1547
|
+
this._promises[queueType] = undefined;
|
|
1548
|
+
}
|
|
1549
|
+
};
|
|
1550
|
+
_schedule = (type, task, prioritize = false) => {
|
|
1551
|
+
const queue = this._queues[type];
|
|
1552
|
+
if (prioritize) {
|
|
1553
|
+
queue.unshift(task);
|
|
1554
|
+
} else {
|
|
1555
|
+
queue.push(task);
|
|
1556
|
+
}
|
|
1557
|
+
if (!this._promises[type]) {
|
|
1558
|
+
this._promises[type] = new Promise((resolve) => {
|
|
1559
|
+
this._resolvers[type] = resolve;
|
|
1560
|
+
});
|
|
1561
|
+
if (type === "frames") {
|
|
1562
|
+
requestAnimationFrame(this._flushQueue.bind(this, "frames"));
|
|
1563
|
+
} else {
|
|
1564
|
+
queueMicrotask(this._flushQueue.bind(this, "tasks"));
|
|
1392
1565
|
}
|
|
1393
|
-
return targetDescriptor.tagName;
|
|
1394
1566
|
}
|
|
1395
|
-
return
|
|
1396
|
-
}
|
|
1567
|
+
return this._promises[type];
|
|
1568
|
+
};
|
|
1569
|
+
scheduleMicrotask = (task, prioritize = false) => {
|
|
1570
|
+
return this._schedule("tasks", task, prioritize);
|
|
1571
|
+
};
|
|
1572
|
+
scheduleFrameTask = (task, prioritize = false) => {
|
|
1573
|
+
return this._schedule("frames", task, prioritize);
|
|
1574
|
+
};
|
|
1575
|
+
}
|
|
1576
|
+
var asyncTasks = new TaskScheduler;
|
|
1577
|
+
|
|
1578
|
+
// src/component/delegator.ts
|
|
1579
|
+
class EventDelegator {
|
|
1397
1580
|
_root;
|
|
1398
1581
|
_rootListeners = new Map;
|
|
1399
1582
|
_events = new Map;
|
|
@@ -1424,7 +1607,7 @@ class EventDelegator {
|
|
|
1424
1607
|
const listener = (event) => {
|
|
1425
1608
|
const handlersForEvent = this._handlersForEvent(eventName);
|
|
1426
1609
|
const { target } = event;
|
|
1427
|
-
if (target === null || !(target
|
|
1610
|
+
if (target === null || !isNode(target)) {
|
|
1428
1611
|
return;
|
|
1429
1612
|
}
|
|
1430
1613
|
let node = target;
|
|
@@ -1438,7 +1621,7 @@ class EventDelegator {
|
|
|
1438
1621
|
if (node === this._root) {
|
|
1439
1622
|
break;
|
|
1440
1623
|
}
|
|
1441
|
-
if (!(node
|
|
1624
|
+
if (!isElement(node)) {
|
|
1442
1625
|
node = node.parentNode;
|
|
1443
1626
|
continue;
|
|
1444
1627
|
}
|
|
@@ -1456,7 +1639,7 @@ class EventDelegator {
|
|
|
1456
1639
|
return;
|
|
1457
1640
|
}
|
|
1458
1641
|
node = node.parentNode;
|
|
1459
|
-
if (node === this._root || node
|
|
1642
|
+
if (node === this._root || isShadowRoot(node)) {
|
|
1460
1643
|
break;
|
|
1461
1644
|
}
|
|
1462
1645
|
}
|
|
@@ -1485,214 +1668,171 @@ class EventDelegator {
|
|
|
1485
1668
|
}
|
|
1486
1669
|
|
|
1487
1670
|
// src/component/component.ts
|
|
1488
|
-
var MAX_SEQUENTIAL_RENDERS =
|
|
1671
|
+
var MAX_SEQUENTIAL_RENDERS = 1e4;
|
|
1489
1672
|
var BLANK_TEMPLATE = document.createElement("template");
|
|
1673
|
+
var HOST_TARGET = ":host";
|
|
1674
|
+
var RootMode;
|
|
1675
|
+
((RootMode2) => {
|
|
1676
|
+
RootMode2["Closed"] = "closed";
|
|
1677
|
+
RootMode2["Open"] = "open";
|
|
1678
|
+
})(RootMode ||= {});
|
|
1490
1679
|
|
|
1491
1680
|
class Component extends HTMLElement {
|
|
1492
|
-
static
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1681
|
+
static isComponent(value) {
|
|
1682
|
+
return typeof value === "object" && value !== null && value instanceof Component;
|
|
1683
|
+
}
|
|
1684
|
+
static isComponentClass(value) {
|
|
1685
|
+
return value !== null && typeof value === "function" && (value.prototype instanceof Component || value === Component);
|
|
1686
|
+
}
|
|
1687
|
+
static readComponentTagName(componentClass) {
|
|
1688
|
+
const { tagName } = componentClass;
|
|
1689
|
+
if (true) {
|
|
1690
|
+
if (tagName === "") {
|
|
1691
|
+
console.warn(`[Component] Empty tag name when reading from component ${componentClass.name}`);
|
|
1692
|
+
}
|
|
1503
1693
|
}
|
|
1504
|
-
|
|
1694
|
+
return tagName;
|
|
1505
1695
|
}
|
|
1506
1696
|
static tagName = "";
|
|
1507
1697
|
static template = BLANK_TEMPLATE;
|
|
1508
|
-
static
|
|
1698
|
+
static style = [];
|
|
1509
1699
|
static observedAttributes = [];
|
|
1510
|
-
static
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
_state;
|
|
1518
|
-
_delegator;
|
|
1519
|
-
_ownListeners = new Set;
|
|
1520
|
-
_liveAttributeConfigs = new Map;
|
|
1521
|
-
_cleanupFn;
|
|
1522
|
-
_renderInternals = {
|
|
1523
|
-
willRender: false,
|
|
1700
|
+
static rootMode = "closed" /* Closed */;
|
|
1701
|
+
root;
|
|
1702
|
+
template;
|
|
1703
|
+
_cmp = {
|
|
1704
|
+
isFinalized: false,
|
|
1705
|
+
isInitialRenderComplete: false,
|
|
1706
|
+
isRenderScheduled: false,
|
|
1524
1707
|
isRendering: false,
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
trackedAttributeChanges: new Map
|
|
1708
|
+
sequentialRenderCount: 0,
|
|
1709
|
+
lastRenderedAttributes: {},
|
|
1710
|
+
pendingAttributeChanges: {}
|
|
1529
1711
|
};
|
|
1530
1712
|
constructor() {
|
|
1531
1713
|
super();
|
|
1532
|
-
const {
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1714
|
+
const {
|
|
1715
|
+
template: template2,
|
|
1716
|
+
style,
|
|
1717
|
+
rootMode: mode
|
|
1718
|
+
} = this.constructor;
|
|
1719
|
+
this.root = this.attachShadow({ mode });
|
|
1720
|
+
let adoptStyles = [];
|
|
1721
|
+
if (Array.isArray(style)) {
|
|
1722
|
+
adoptStyles = style;
|
|
1723
|
+
} else if (style instanceof CSSStyleSheet) {
|
|
1724
|
+
adoptStyles = [style];
|
|
1725
|
+
} else {
|
|
1726
|
+
const adoptSheet = new CSSStyleSheet;
|
|
1727
|
+
adoptSheet.replaceSync(style);
|
|
1728
|
+
adoptStyles = [adoptSheet];
|
|
1729
|
+
}
|
|
1730
|
+
this.root.adoptedStyleSheets.push(...adoptStyles);
|
|
1731
|
+
this.template = Template.isTemplate(template2) ? template2 : new Template(template2);
|
|
1537
1732
|
}
|
|
1538
1733
|
_getRenderContext(attr) {
|
|
1734
|
+
const state = this._cmp.state?.raw ?? {};
|
|
1735
|
+
const computed = this.computedProperties?.call(this, attr, state);
|
|
1539
1736
|
return {
|
|
1540
|
-
attr
|
|
1541
|
-
data:
|
|
1542
|
-
state
|
|
1737
|
+
attr,
|
|
1738
|
+
data: computed,
|
|
1739
|
+
state
|
|
1543
1740
|
};
|
|
1544
1741
|
}
|
|
1545
1742
|
_escalateError(error) {
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
if (node instanceof Component && "onError" in node && typeof node.onError === "function") {
|
|
1743
|
+
const isErrorHandled = walkParents(this, (node) => {
|
|
1744
|
+
if (node instanceof Component && node.onError) {
|
|
1549
1745
|
node.onError(error);
|
|
1550
|
-
return;
|
|
1551
|
-
} else if (node instanceof ShadowRoot) {
|
|
1552
|
-
node = node.host;
|
|
1553
|
-
} else {
|
|
1554
|
-
node = node.parentNode;
|
|
1746
|
+
return true;
|
|
1555
1747
|
}
|
|
1748
|
+
});
|
|
1749
|
+
if (!isErrorHandled) {
|
|
1750
|
+
throw error;
|
|
1556
1751
|
}
|
|
1557
|
-
throw error;
|
|
1558
1752
|
}
|
|
1559
1753
|
_reportError(error) {
|
|
1560
|
-
|
|
1561
|
-
this._escalateError(error);
|
|
1562
|
-
} else {
|
|
1563
|
-
this.onError(error);
|
|
1564
|
-
}
|
|
1754
|
+
this.onError ? this.onError(error) : this._escalateError(error);
|
|
1565
1755
|
}
|
|
1566
|
-
|
|
1567
|
-
const prevAttrs = this._renderInternals.lastRenderedAttributeMap;
|
|
1568
|
-
const trackedChanges = new Map(this._renderInternals.trackedAttributeChanges);
|
|
1569
|
-
this._renderInternals.trackedAttributeChanges.clear();
|
|
1570
|
-
for (const [name, val] of trackedChanges) {
|
|
1571
|
-
const config = this._liveAttributeConfigs.get(name);
|
|
1572
|
-
if (!config) {
|
|
1573
|
-
continue;
|
|
1574
|
-
}
|
|
1575
|
-
if ("onChange" in config) {
|
|
1576
|
-
const previousValue = prevAttrs.get(name) ?? null;
|
|
1577
|
-
if (config && previousValue !== val) {
|
|
1578
|
-
config.onChange?.call(this, val, previousValue);
|
|
1579
|
-
}
|
|
1580
|
-
}
|
|
1581
|
-
}
|
|
1582
|
-
};
|
|
1583
|
-
_reflectLiveAttributes = () => {
|
|
1584
|
-
const toSet = [];
|
|
1585
|
-
for (const [name, config] of this._liveAttributeConfigs) {
|
|
1586
|
-
if ("reflect" in config) {
|
|
1587
|
-
const val = serializeAttribute(config.reflect?.call(this));
|
|
1588
|
-
const current = this.getAttribute(name);
|
|
1589
|
-
if (val !== current) {
|
|
1590
|
-
toSet.push([name, val]);
|
|
1591
|
-
}
|
|
1592
|
-
}
|
|
1593
|
-
}
|
|
1594
|
-
for (const [name, val] of toSet) {
|
|
1595
|
-
this.reflectAttribute(name, val);
|
|
1596
|
-
}
|
|
1597
|
-
};
|
|
1598
|
-
_performUpdate = () => {
|
|
1756
|
+
_render = () => {
|
|
1599
1757
|
try {
|
|
1600
|
-
this.
|
|
1601
|
-
this.
|
|
1602
|
-
this.
|
|
1603
|
-
|
|
1604
|
-
this
|
|
1605
|
-
|
|
1606
|
-
this.
|
|
1607
|
-
this._renderInternals.lastRenderedAttributeMap = newAttributes;
|
|
1758
|
+
this._cmp.isRendering = true;
|
|
1759
|
+
this._cmp.isRenderScheduled = false;
|
|
1760
|
+
const prevAttrs = this._cmp.lastRenderedAttributes;
|
|
1761
|
+
this.beforeUpdate?.(this._cmp.pendingAttributeChanges);
|
|
1762
|
+
const newAttributes = getElementAttributes(this);
|
|
1763
|
+
this.template.render(this.root, this._getRenderContext(newAttributes));
|
|
1764
|
+
this._cmp.lastRenderedAttributes = newAttributes;
|
|
1608
1765
|
this.afterUpdate?.(prevAttrs);
|
|
1609
|
-
this.
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
for (const fn of callbacks) {
|
|
1614
|
-
fn();
|
|
1615
|
-
}
|
|
1616
|
-
}
|
|
1617
|
-
if (this._renderInternals.willRender) {
|
|
1618
|
-
this._renderInternals.sequentialRenders += 1;
|
|
1619
|
-
if (this._renderInternals.sequentialRenders >= MAX_SEQUENTIAL_RENDERS) {
|
|
1620
|
-
throw new PaletteError(306 /* MAX_SEQUENTIAL_RENDERS */, `${this._renderInternals.sequentialRenders}`);
|
|
1766
|
+
if (this._cmp.isRenderScheduled) {
|
|
1767
|
+
this._cmp.sequentialRenderCount += 1;
|
|
1768
|
+
if (this._cmp.sequentialRenderCount >= MAX_SEQUENTIAL_RENDERS) {
|
|
1769
|
+
throw new PaletteError(306 /* MAX_SEQUENTIAL_RENDERS */, `${this._cmp.sequentialRenderCount}`);
|
|
1621
1770
|
}
|
|
1622
|
-
this.
|
|
1771
|
+
this._render();
|
|
1623
1772
|
} else {
|
|
1624
|
-
this.
|
|
1773
|
+
this._cmp.sequentialRenderCount = 0;
|
|
1625
1774
|
}
|
|
1626
1775
|
} catch (error) {
|
|
1627
|
-
this.
|
|
1776
|
+
this._cmp.isRenderScheduled = false;
|
|
1628
1777
|
this._reportError(error);
|
|
1629
1778
|
} finally {
|
|
1630
|
-
this.
|
|
1631
|
-
}
|
|
1632
|
-
};
|
|
1633
|
-
_scheduleUpdate = () => {
|
|
1634
|
-
if (this._renderInternals.willRender) {
|
|
1635
|
-
return;
|
|
1779
|
+
this._cmp.isRendering = false;
|
|
1636
1780
|
}
|
|
1637
|
-
this._renderInternals.willRender = true;
|
|
1638
|
-
if (this._renderInternals.isRendering) {
|
|
1639
|
-
return;
|
|
1640
|
-
}
|
|
1641
|
-
requestAnimationFrame(this._performUpdate);
|
|
1642
1781
|
};
|
|
1643
1782
|
_adoptState(state) {
|
|
1644
|
-
if (Object.is(this.
|
|
1783
|
+
if (Object.is(this._cmp.state, state)) {
|
|
1645
1784
|
return;
|
|
1646
1785
|
}
|
|
1647
|
-
if (this.
|
|
1648
|
-
this.
|
|
1649
|
-
this.
|
|
1786
|
+
if (this._cmp.state) {
|
|
1787
|
+
this._cmp.state.removeListener(this.render);
|
|
1788
|
+
this.render();
|
|
1650
1789
|
}
|
|
1651
|
-
const incomingStateObj = state
|
|
1652
|
-
this.
|
|
1653
|
-
this.
|
|
1654
|
-
this.
|
|
1790
|
+
const incomingStateObj = State.isState(state) ? state : new State(state);
|
|
1791
|
+
this._cmp.state = incomingStateObj;
|
|
1792
|
+
this._cmp.state.removeListener(this.render);
|
|
1793
|
+
this._cmp.state.addListener(this.render);
|
|
1655
1794
|
}
|
|
1656
1795
|
connectedCallback() {
|
|
1657
|
-
if (this.
|
|
1796
|
+
if (this._cmp.isInitialRenderComplete) {
|
|
1658
1797
|
return;
|
|
1659
1798
|
}
|
|
1660
|
-
|
|
1799
|
+
asyncTasks.scheduleMicrotask(() => {
|
|
1661
1800
|
try {
|
|
1662
|
-
this.
|
|
1663
|
-
this.
|
|
1664
|
-
const attributes2 =
|
|
1665
|
-
this._liveAttributeConfigs = new Map(Object.entries(this.liveAttributes ?? {}));
|
|
1801
|
+
this._cmp.isRendering = true;
|
|
1802
|
+
this._cmp.isRenderScheduled = false;
|
|
1803
|
+
const attributes2 = getElementAttributes(this);
|
|
1666
1804
|
if (this.initialState) {
|
|
1667
|
-
|
|
1668
|
-
this._adoptState(init);
|
|
1805
|
+
this._adoptState(this.initialState());
|
|
1669
1806
|
}
|
|
1670
|
-
this.
|
|
1671
|
-
this.
|
|
1672
|
-
this.
|
|
1673
|
-
this.
|
|
1674
|
-
this._cleanupFn = this.script?.() ?? undefined;
|
|
1807
|
+
this.template.render(this.root, this._getRenderContext(attributes2));
|
|
1808
|
+
this._cmp.lastRenderedAttributes = attributes2;
|
|
1809
|
+
this._cmp.isInitialRenderComplete = true;
|
|
1810
|
+
this._cmp.cleanupFn = this.script?.() ?? undefined;
|
|
1675
1811
|
} catch (error) {
|
|
1676
1812
|
this._reportError(error);
|
|
1677
1813
|
} finally {
|
|
1678
|
-
this.
|
|
1814
|
+
this._cmp.isRendering = false;
|
|
1679
1815
|
}
|
|
1680
1816
|
});
|
|
1681
1817
|
}
|
|
1682
1818
|
disconnectedCallback() {
|
|
1683
|
-
|
|
1684
|
-
|
|
1819
|
+
if (this._cmp.isFinalized) {
|
|
1820
|
+
return;
|
|
1821
|
+
}
|
|
1822
|
+
asyncTasks.scheduleMicrotask(() => {
|
|
1823
|
+
if (this.isConnected || !this._cmp.isInitialRenderComplete) {
|
|
1685
1824
|
return;
|
|
1686
1825
|
}
|
|
1826
|
+
this._cmp.isFinalized = true;
|
|
1687
1827
|
try {
|
|
1688
|
-
this.
|
|
1689
|
-
|
|
1690
|
-
|
|
1828
|
+
const { delegator, cleanupFn, hostListeners } = this._cmp;
|
|
1829
|
+
delegator?.cleanup();
|
|
1830
|
+
if (hostListeners && hostListeners.size > 0) {
|
|
1831
|
+
for (const listener of hostListeners) {
|
|
1691
1832
|
this.removeEventListener(listener.event, listener.handler);
|
|
1692
1833
|
}
|
|
1693
1834
|
}
|
|
1694
|
-
|
|
1695
|
-
this._isComponentMounted = false;
|
|
1835
|
+
cleanupFn?.();
|
|
1696
1836
|
} catch (error) {
|
|
1697
1837
|
this._reportError(error);
|
|
1698
1838
|
} finally {
|
|
@@ -1705,200 +1845,185 @@ class Component extends HTMLElement {
|
|
|
1705
1845
|
});
|
|
1706
1846
|
}
|
|
1707
1847
|
attributeChangedCallback(name, _, newValue) {
|
|
1708
|
-
if (this.
|
|
1848
|
+
if (this._cmp.isRendering) {
|
|
1709
1849
|
return;
|
|
1710
1850
|
}
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
this._renderInternals.trackedAttributeChanges.set(name, newValue);
|
|
1715
|
-
if (!this._renderInternals.willRender) {
|
|
1716
|
-
this._scheduleUpdate();
|
|
1851
|
+
this._cmp.pendingAttributeChanges[name] = newValue;
|
|
1852
|
+
if (!this._cmp.isRenderScheduled) {
|
|
1853
|
+
this.render();
|
|
1717
1854
|
}
|
|
1718
1855
|
}
|
|
1719
|
-
get
|
|
1720
|
-
return this.
|
|
1856
|
+
get isMounted() {
|
|
1857
|
+
return this.isConnected && this._cmp.isInitialRenderComplete;
|
|
1721
1858
|
}
|
|
1722
|
-
|
|
1723
|
-
if (!this.
|
|
1859
|
+
getState() {
|
|
1860
|
+
if (!this._cmp.state) {
|
|
1724
1861
|
throw new PaletteError(301 /* MISSING_STATE */);
|
|
1725
1862
|
}
|
|
1726
|
-
return this.
|
|
1863
|
+
return this._cmp.state;
|
|
1864
|
+
}
|
|
1865
|
+
get state() {
|
|
1866
|
+
return this.getState().live;
|
|
1727
1867
|
}
|
|
1728
1868
|
set state(newState) {
|
|
1729
1869
|
this._adoptState(newState);
|
|
1730
1870
|
}
|
|
1731
|
-
|
|
1732
|
-
if (
|
|
1733
|
-
throw new PaletteError(301 /* MISSING_STATE */);
|
|
1734
|
-
}
|
|
1735
|
-
return this._state;
|
|
1736
|
-
}
|
|
1737
|
-
requestRender(callback) {
|
|
1738
|
-
if (callback) {
|
|
1739
|
-
this._renderInternals.postRenderCallbacks.add(callback);
|
|
1740
|
-
}
|
|
1741
|
-
this._scheduleUpdate();
|
|
1742
|
-
}
|
|
1743
|
-
listen(targetDescriptor, eventName, eventHandler) {
|
|
1744
|
-
const query = EventDelegator.processTargetDescriptor(targetDescriptor);
|
|
1745
|
-
if (query === ":host" || query === ":HOST") {
|
|
1746
|
-
this.addEventListener(eventName, eventHandler);
|
|
1747
|
-
this._ownListeners.add({
|
|
1748
|
-
handler: eventHandler,
|
|
1749
|
-
event: eventName
|
|
1750
|
-
});
|
|
1871
|
+
render = () => {
|
|
1872
|
+
if (this._cmp.isRenderScheduled) {
|
|
1751
1873
|
return;
|
|
1752
1874
|
}
|
|
1753
|
-
|
|
1754
|
-
|
|
1875
|
+
this._cmp.isRenderScheduled = true;
|
|
1876
|
+
if (this._cmp.isRendering) {
|
|
1877
|
+
return;
|
|
1755
1878
|
}
|
|
1756
|
-
this.
|
|
1757
|
-
}
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
for (const listener of this._ownListeners) {
|
|
1763
|
-
if (listener.event === eventName && listener.handler === eventHandler) {
|
|
1764
|
-
this._ownListeners.delete(listener);
|
|
1765
|
-
}
|
|
1879
|
+
asyncTasks.scheduleFrameTask(this._render);
|
|
1880
|
+
};
|
|
1881
|
+
listen(targetDescriptor, eventName, eventHandler) {
|
|
1882
|
+
if (targetDescriptor === HOST_TARGET || targetDescriptor === this) {
|
|
1883
|
+
if (!this._cmp.hostListeners) {
|
|
1884
|
+
this._cmp.hostListeners = new Set;
|
|
1766
1885
|
}
|
|
1767
|
-
|
|
1886
|
+
const hostListeners = this._cmp.hostListeners;
|
|
1887
|
+
const entry = {
|
|
1888
|
+
event: eventName,
|
|
1889
|
+
handler: eventHandler
|
|
1890
|
+
};
|
|
1891
|
+
hostListeners.add(entry);
|
|
1892
|
+
this.addEventListener(eventName, eventHandler);
|
|
1893
|
+
return () => {
|
|
1894
|
+
this.removeEventListener(eventName, eventHandler);
|
|
1895
|
+
hostListeners.delete(entry);
|
|
1896
|
+
};
|
|
1768
1897
|
}
|
|
1769
|
-
if (
|
|
1770
|
-
|
|
1898
|
+
if (typeof targetDescriptor === "object") {
|
|
1899
|
+
throw new PaletteError(2 /* INVALID_CALLSITE */);
|
|
1771
1900
|
}
|
|
1772
|
-
this.
|
|
1773
|
-
|
|
1774
|
-
dispatchEvent(event, detail, options) {
|
|
1775
|
-
if (event instanceof Event) {
|
|
1776
|
-
return super.dispatchEvent(event);
|
|
1901
|
+
if (!this._cmp.delegator) {
|
|
1902
|
+
this._cmp.delegator = new EventDelegator(this.root);
|
|
1777
1903
|
}
|
|
1778
|
-
const
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1904
|
+
const delegator = this._cmp.delegator;
|
|
1905
|
+
const query = typeof targetDescriptor === "string" ? targetDescriptor : Component.readComponentTagName(targetDescriptor);
|
|
1906
|
+
delegator.addListener(eventName, eventHandler, query);
|
|
1907
|
+
return () => {
|
|
1908
|
+
delegator.removeListener(eventName, eventHandler, query);
|
|
1783
1909
|
};
|
|
1784
|
-
return super.dispatchEvent(new CustomEvent(event, {
|
|
1785
|
-
detail,
|
|
1786
|
-
...opts
|
|
1787
|
-
}));
|
|
1788
|
-
}
|
|
1789
|
-
querySelector(query) {
|
|
1790
|
-
return this._root.querySelector(query);
|
|
1791
|
-
}
|
|
1792
|
-
querySelectorAll(query) {
|
|
1793
|
-
return this._root.querySelectorAll(query);
|
|
1794
1910
|
}
|
|
1795
|
-
|
|
1796
|
-
if (
|
|
1797
|
-
return
|
|
1911
|
+
dispatchEvent(a, b) {
|
|
1912
|
+
if (typeof a === "object" && typeof b === "undefined") {
|
|
1913
|
+
return super.dispatchEvent(a);
|
|
1914
|
+
} else if (typeof a === "string") {
|
|
1915
|
+
return super.dispatchEvent(new CustomEvent(a, {
|
|
1916
|
+
bubbles: true,
|
|
1917
|
+
cancelable: true,
|
|
1918
|
+
composed: true,
|
|
1919
|
+
...b
|
|
1920
|
+
}));
|
|
1798
1921
|
} else {
|
|
1799
|
-
|
|
1922
|
+
throw new PaletteError(2 /* INVALID_CALLSITE */);
|
|
1800
1923
|
}
|
|
1801
1924
|
}
|
|
1802
|
-
|
|
1803
|
-
const lookup = this.getElementById(id);
|
|
1925
|
+
ref(id) {
|
|
1926
|
+
const lookup = this.root.getElementById(id);
|
|
1804
1927
|
if (!lookup) {
|
|
1805
1928
|
throw new PaletteError(300 /* MISSING_ELEMENT */);
|
|
1806
1929
|
}
|
|
1807
1930
|
return lookup;
|
|
1808
1931
|
}
|
|
1809
|
-
|
|
1810
|
-
const
|
|
1811
|
-
|
|
1812
|
-
HTMLElement.prototype.removeAttribute.call(this, name);
|
|
1813
|
-
} else {
|
|
1814
|
-
HTMLElement.prototype.setAttribute.call(this, name, serialized);
|
|
1815
|
-
}
|
|
1816
|
-
}
|
|
1817
|
-
getAttribute(name, defaultValue) {
|
|
1818
|
-
const value = HTMLElement.prototype.getAttribute.call(this, name);
|
|
1819
|
-
if (defaultValue === undefined) {
|
|
1820
|
-
return value;
|
|
1821
|
-
}
|
|
1822
|
-
if (typeof defaultValue === "number") {
|
|
1823
|
-
if (value === null) {
|
|
1824
|
-
return defaultValue;
|
|
1825
|
-
}
|
|
1826
|
-
const parsed = Number(value);
|
|
1827
|
-
if (Number.isNaN(parsed)) {
|
|
1828
|
-
return defaultValue;
|
|
1829
|
-
}
|
|
1830
|
-
return parsed;
|
|
1831
|
-
}
|
|
1832
|
-
throw new PaletteError(0 /* INVARIANT */);
|
|
1833
|
-
}
|
|
1834
|
-
reflectAttribute(name, value) {
|
|
1835
|
-
const current = this.getAttribute(name);
|
|
1836
|
-
const reflected = serializeAttribute(value);
|
|
1837
|
-
if (current !== reflected) {
|
|
1838
|
-
this.setAttribute(name, reflected);
|
|
1839
|
-
}
|
|
1840
|
-
}
|
|
1841
|
-
toString(full = false) {
|
|
1842
|
-
const name = this.constructor.name;
|
|
1932
|
+
toString() {
|
|
1933
|
+
const { tagName, name } = this.constructor;
|
|
1934
|
+
const computedName = tagName === "" ? name : tagName;
|
|
1843
1935
|
const attrString = this.getAttributeNames().map((attrName) => {
|
|
1844
1936
|
const val = this.getAttribute(attrName);
|
|
1845
1937
|
return val ? `${attrName}="${val}"` : "";
|
|
1846
1938
|
}).join(" ");
|
|
1847
1939
|
const attrs = attrString.length > 0 ? ` ${attrString}` : "";
|
|
1848
|
-
|
|
1849
|
-
return `Component<${name}${attrs}>
|
|
1850
|
-
${this.root.innerHTML}
|
|
1851
|
-
</${name}>`;
|
|
1852
|
-
}
|
|
1853
|
-
return `Component<${name}${attrs}>`;
|
|
1940
|
+
return `<${computedName}${attrs}></${computedName}>`;
|
|
1854
1941
|
}
|
|
1855
1942
|
}
|
|
1856
1943
|
// src/component/factory.ts
|
|
1857
1944
|
var BLANK_TEMPLATE2 = document.createElement("template");
|
|
1858
|
-
function
|
|
1945
|
+
function defineFromClass(cls, tagName) {
|
|
1946
|
+
if (tagName && cls.tagName === "") {
|
|
1947
|
+
cls.tagName = tagName;
|
|
1948
|
+
}
|
|
1949
|
+
if (true) {
|
|
1950
|
+
if (tagName && tagName !== cls.tagName) {
|
|
1951
|
+
console.warn(`[COMPONENT] Component ${cls.name} was defined with tagname ${tagName} ` + `which does not match its static tagName property`);
|
|
1952
|
+
}
|
|
1953
|
+
}
|
|
1954
|
+
window.customElements.define(cls.tagName, cls);
|
|
1955
|
+
}
|
|
1956
|
+
function define(a, b) {
|
|
1957
|
+
if (typeof a === "function") {
|
|
1958
|
+
defineFromClass(a);
|
|
1959
|
+
return a;
|
|
1960
|
+
}
|
|
1961
|
+
if (typeof a === "string" && typeof b === "function") {
|
|
1962
|
+
defineFromClass(b, a);
|
|
1963
|
+
return b;
|
|
1964
|
+
}
|
|
1965
|
+
if (b === undefined) {
|
|
1966
|
+
throw new PaletteError(2 /* INVALID_CALLSITE */);
|
|
1967
|
+
}
|
|
1968
|
+
const tagName = a;
|
|
1969
|
+
const definition = b;
|
|
1970
|
+
if (typeof definition === "function") {
|
|
1971
|
+
if (definition.tagName === "") {
|
|
1972
|
+
definition.tagName = tagName;
|
|
1973
|
+
}
|
|
1974
|
+
if (true) {
|
|
1975
|
+
if (tagName !== definition.tagName) {
|
|
1976
|
+
console.warn(`[COMPONENT] Component ${definition.name} was defined with tagname ${tagName} ` + `which does not match its static tagName property`);
|
|
1977
|
+
}
|
|
1978
|
+
}
|
|
1979
|
+
window.customElements.define(tagName, definition);
|
|
1980
|
+
return definition;
|
|
1981
|
+
}
|
|
1859
1982
|
const {
|
|
1860
1983
|
template: template2 = BLANK_TEMPLATE2,
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
initialState,
|
|
1864
|
-
computedProperties
|
|
1865
|
-
|
|
1984
|
+
style = [],
|
|
1985
|
+
rootMode = "closed" /* Closed */,
|
|
1986
|
+
initialState: stateInitializer,
|
|
1987
|
+
computedProperties,
|
|
1988
|
+
observedAttributes = [],
|
|
1866
1989
|
script,
|
|
1867
1990
|
beforeUpdate,
|
|
1868
1991
|
afterUpdate,
|
|
1869
1992
|
finalize,
|
|
1870
1993
|
onError
|
|
1871
1994
|
} = definition;
|
|
1872
|
-
|
|
1995
|
+
let getInitialState;
|
|
1996
|
+
if (stateInitializer) {
|
|
1997
|
+
getInitialState = typeof stateInitializer === "function" ? stateInitializer : () => stateInitializer;
|
|
1998
|
+
}
|
|
1873
1999
|
const cls = class extends Component {
|
|
1874
|
-
static tagName =
|
|
2000
|
+
static tagName = tagName;
|
|
1875
2001
|
static template = template2;
|
|
1876
|
-
static
|
|
1877
|
-
static observedAttributes = [...
|
|
1878
|
-
static shadowRootMode =
|
|
1879
|
-
constructor() {
|
|
1880
|
-
super();
|
|
1881
|
-
this.initialState = typeof initialState === "function" ? initialState.bind(this) : initialState;
|
|
1882
|
-
this.computedProperties = typeof computedProperties === "function" ? computedProperties.bind(this) : computedProperties;
|
|
1883
|
-
this.liveAttributes = liveAttributes;
|
|
1884
|
-
for (const def of Object.values(this.liveAttributes)) {
|
|
1885
|
-
if (def.onChange) {
|
|
1886
|
-
def.onChange = def.onChange.bind(this);
|
|
1887
|
-
}
|
|
1888
|
-
if (def.reflect) {
|
|
1889
|
-
def.reflect = def.reflect.bind(this);
|
|
1890
|
-
}
|
|
1891
|
-
}
|
|
1892
|
-
this.script = script?.bind(this) ?? undefined;
|
|
1893
|
-
this.beforeUpdate = beforeUpdate?.bind(this) ?? undefined;
|
|
1894
|
-
this.afterUpdate = afterUpdate?.bind(this) ?? undefined;
|
|
1895
|
-
this.finalize = finalize?.bind(this) ?? undefined;
|
|
1896
|
-
this.onError = onError?.bind(this) ?? undefined;
|
|
1897
|
-
}
|
|
2002
|
+
static style = style;
|
|
2003
|
+
static observedAttributes = [...observedAttributes];
|
|
2004
|
+
static shadowRootMode = rootMode;
|
|
1898
2005
|
};
|
|
1899
|
-
|
|
2006
|
+
cls.prototype.initialState = getInitialState;
|
|
2007
|
+
cls.prototype.computedProperties = computedProperties;
|
|
2008
|
+
cls.prototype.script = script;
|
|
2009
|
+
cls.prototype.beforeUpdate = beforeUpdate;
|
|
2010
|
+
cls.prototype.afterUpdate = afterUpdate;
|
|
2011
|
+
cls.prototype.finalize = finalize;
|
|
2012
|
+
cls.prototype.onError = onError;
|
|
2013
|
+
customElements.define(tagName, cls);
|
|
1900
2014
|
return cls;
|
|
1901
2015
|
}
|
|
2016
|
+
// src/devtools.ts
|
|
2017
|
+
if (typeof window !== "undefined") {
|
|
2018
|
+
window.__PALETTE_DEVTOOLS__ = {
|
|
2019
|
+
dumpCacheMetrics: () => {
|
|
2020
|
+
console.log("Compiled Templates", compiledTemplateCache.getMetrics());
|
|
2021
|
+
console.log("HTML Fragments", fragmentCache.getMetrics());
|
|
2022
|
+
console.log("Notation Accessor", valueAccessorCache.getMetrics());
|
|
2023
|
+
console.log("Parsed Notations", parsedNotationCache.getMetrics());
|
|
2024
|
+
}
|
|
2025
|
+
};
|
|
2026
|
+
}
|
|
1902
2027
|
export {
|
|
1903
2028
|
html,
|
|
1904
2029
|
define,
|
|
@@ -1906,9 +2031,10 @@ export {
|
|
|
1906
2031
|
classify,
|
|
1907
2032
|
Template,
|
|
1908
2033
|
State,
|
|
2034
|
+
RootMode,
|
|
1909
2035
|
PaletteError,
|
|
1910
2036
|
Component
|
|
1911
2037
|
};
|
|
1912
2038
|
|
|
1913
|
-
//# debugId=
|
|
1914
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2Vycm9ycy50cyIsICJzcmMvaGVscGVyL2Nzcy50cyIsICJzcmMvdXRpbC9hdHRyaWJ1dGVzLnRzIiwgInNyYy91dGlsL2NoYW5nZS10YWcudHMiLCAic3JjL3V0aWwvZWxlbWVudC1tYXRjaC50cyIsICJzcmMvdXRpbC9scnUtY2FjaGUudHMiLCAic3JjL3V0aWwvZnJhZ21lbnRzLnRzIiwgInNyYy9oZWxwZXIvaHRtbC50cyIsICJzcmMvc3RhdGUvc3RhdGUudHMiLCAic3JjL3RlbXBsYXRlL3N5bnRheC50cyIsICJzcmMvdGVtcGxhdGUvYnVpbGQudHMiLCAic3JjL3RlbXBsYXRlL2pvYnMudHMiLCAic3JjL3RlbXBsYXRlL3RlbXBsYXRlLnRzIiwgInNyYy9jb21wb25lbnQvZGVsZWdhdG9yLnRzIiwgInNyYy9jb21wb25lbnQvY29tcG9uZW50LnRzIiwgInNyYy9jb21wb25lbnQvZmFjdG9yeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbi8qKlxuICogUG9zc2libGUgZXJyb3IgdHlwZXMgZm9yIHtAbGluayBQYWxldHRlRXJyb3J9XG4gKlxuICogQ29kZXMgYXJlIGNhdGVnb3JpemVkIGludG8gZ3JvdXBzIGJ5IHRoZSAxMDAnczpcbiAqXG4gKiAtIDAgLSA5OTogSW52YXJpYW50c1xuICogLSAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyAvIEVudmlyb25tZW50IEVycm9yc1xuICogLSAyMDAgLSAyOTk6IFRlbXBsYXRpbmcgRXJyb3JzXG4gKiAtIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gRXJyb3JDb2RlIHtcbiAgLy8gMCAtIDk5OiBJbnZhcmlhbnRzXG4gIElOVkFSSUFOVCA9IDAsXG4gIElOVkFMSURfRU5WID0gMSxcblxuICAvLyAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyBFcnJvcnNcbiAgRFVQRV9UQUdOQU1FID0gMTAwLFxuICBJTlZBTElEX1RBR05BTUUgPSAxMDEsXG5cbiAgLy8gMjAwIC0gMjk5OiBUZW1wbGF0ZSBFcnJvcnNcbiAgVEVNUExBVEVfSU5WQUxJRCA9IDIwMCxcbiAgVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiA9IDIwMSxcbiAgVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlQgPSAyMDIsXG4gIFRFTVBMQVRFX0lOVkFMSURfTElTVCA9IDIwMyxcbiAgVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRiA9IDIwNCxcbiAgVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVCA9IDIwNSxcbiAgVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWSA9IDIwNixcbiAgVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZID0gMjA3LFxuXG4gIC8vIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAgTUlTU0lOR19FTEVNRU5UID0gMzAwLFxuICBNSVNTSU5HX1NUQVRFID0gMzAxLFxuICBJTlZBTElEX0NPTlRFTlQgPSAzMDIsXG4gIElOVkFMSURfU1RBVEVfS0VZID0gMzAzLFxuICBJTlZBTElEX1NUQVRFX1VQREFURSA9IDMwNCxcbiAgU1RBVEVfTE9DS0VEID0gMzA1LFxuICBNQVhfU0VRVUVOVElBTF9SRU5ERVJTID0gMzA2LFxufVxuXG5mdW5jdGlvbiBnZXREZXZFcnJvcihjb2RlOiBFcnJvckNvZGUpIHtcbiAgY29uc3QgREVWX0VSUk9SX0lORk86IFJlY29yZDxFcnJvckNvZGUsIHN0cmluZz4gPSB7XG4gICAgW0Vycm9yQ29kZS5JTlZBUklBTlRdOiBgXG5JTlZBUklBTlRcbkEgY29uZGl0aW9uIGhhcyBvY2N1cnJlZCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBzdWNoIGFzIGEgY29kZSBwYXRoIHRoYXRcbnNob3VsZG4ndCBiZSByZWFjaGFibGUgd2hlbiB1c2luZyBjb3JyZWN0IHR5cGVzLCBvciBhIGRpc2FsbG93ZWQgc3RhdGUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0VOVl06IGBcbklOVkFMSURfRU5WXG5GYWlsZWQgdG8gZmluZCBhIGN1c3RvbSBlbGVtZW50cyByZWdpc3RyeSBpbiB0aGlzIGVudmlyb25tZW50LiBJcyBhIHdpbmRvd1xuZ2xvYmFsIGF2YWlsYWJsZSB3aXRoIGEgY3VzdG9tRWxlbWVudHMgcHJvcGVydHk/XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5EVVBFX1RBR05BTUVdOiBgXG5EVVBFX1RBR05BTUVcbkZhaWxlZCB0byByZWdpc3RlciBhIGN1c3RvbSBlbGVtZW50IHdpdGggdGhlIHRhZ25hbWUgJXMgYmVjYXVzZSBhbm90aGVyXG5jdXN0b20gZWxlbWVudCBpcyBhbHJlYWR5IGRlZmluZWQgd2l0aCB0aGF0IG5hbWUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1RBR05BTUVdOiBgXG5JTlZBTElEX1RBR05BTUVcbkZhaWxlZCB0byBkZXRlcm1pbmUgYSB2YWxpZCBIVE1MIFRhZyB0byB1c2Ugd2hlbiByZWdpc3RlcmluZyBhIGNvbXBvbmVudCBhcyBhXG5jdXN0b20gZWxlbWVudC4gU3BlY2lmeSBhIHN0YXRpYyByZWFkb25seSB0YWdOYW1lIHByb3BlcnR5IG9uIHlvdXIgY29tcG9uZW50XG5jbGFzcyBvciBwcm92aWRlIGEgdGFnTmFtZSBhcmd1bWVudCB0byBDb21wb25lbnQucmVnaXN0ZXIuXG5cbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gZGlyZWN0bHkgcmVnaXN0ZXIgeW91ciBlbGVtZW50IGFzIHlvdSB3b3VsZCBhbnkgb3RoZXJcbkhUTUwgY3VzdG9tIGVsZW1lbnQ6IGN1c3RvbUVsZW1lbnRzLmRlZmluZShcIm15LXRhZ1wiLCBNeUNvbXBvbmVudENsYXNzKTtcbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfRUxFTUVOVF06IGBcbk1JU1NJTkdfRUxFTUVOVFxuQW4gZWxlbWVudCB3YXMgZXhwZWN0ZWQgdG8gZXhpc3QgYnV0IHdhcyBub3QgZm91bmQgd2hlbiB0aGUgRE9NIHdhcyBxdWVyaWVkLlxuYCxcblxuICAgIFtFcnJvckNvZGUuTUlTU0lOR19TVEFURV06IGBcbk1JU1NJTkdfU1RBVEVcbkEgQ29tcG9uZW50J3MgcmVhY3RpdmUgc3RhdGUgd2FzIGFjY2Vzc2VkLCBidXQgbm8gaW5pdGlhbFN0YXRlIGlzIGRlZmluZWQgZm9yXG50aGUgQ29tcG9uZW50J3MgY2xhc3MuIEluaXRpYWwgc3RhdGUgbXVzdCBiZSBkZWZpbmVkIGFzIGFuIG9iamVjdCBvciBmdW5jdGlvbi5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfQ09OVEVOVF06IGBcbklOVkFMSURfQ09OVEVOVFxuVHJpZWQgdG8gc2V0IGEgdmFsdWUgYXMgY29udGVudCBpbiBhIHRlbXBsYXRlLCBidXQgdGhlIHZhbHVlIHdhcyBub3QgYSBzdXBwb3J0ZWRcbnR5cGUuIFZhbHVlcyBtdXN0IGJlIGEgc3RyaW5nLCBIVE1MRWxlbWVudC5cblxuSW5zdGVhZCwgZ290ICVzOiAlcy5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURdOiBgXG5URU1QTEFURV9JTlZBTElEXG5UaGUgdmFsdWUgJXMgY2Fubm90IGJlIGludGVycG9sYXRlZCB2aWEgdGhlIFRlbXBsYXRlIGh0bWwgc3RyaW5nIGhlbHBlci5cblZhbHVlcyBtYXkgb25seSBiZSBIVE1MVGVtcGxhdGVFbGVtZW50cyAodGVtcGxhdGUgY29udGVudCBpcyBhZG9wdGVkKSBvclxuc3RyaW5ncyAoc2hvcnRoYW5kIGZvciBhIDo6c3dhcCBkaXJlY3RpdmUgb24gYW4gZWxlbWVudClcbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05dOiBgXG5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OXG5BIHRlbXBsYXRlIHZhbHVlIG5vdGF0aW9uIGZhaWxlZCB0byBwYXJzZS4gTm90YXRpb25zIG11c3QgYmVnaW4gd2l0aCBvbmUgb2ZcbkAsICQsICosIG9yICMsIGZvbGxvd2VkIGJ5IGEgZG90LXNlcGFyYXRlZCBwYXRoIG9mIGFjY2Vzc29yIG5hbWVzLiBPcHRpb25hbGx5LFxubm90YXRpb25zIG1heSBoYXZlIG1vZGlmaWVycyBhcm91bmQgdGhlbSwgc3VjaCBhcyB0aGUgTk9UKCkgbW9kaWZpZXIuXG5cblRoZSBub3RhdGlvbiB0aGF0IGZhaWxlZCB0byBwYXJzZSB3YXMgXCIlc1wiXG5gLFxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlRdOiBgXG5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVFxuRmFpbGVkIHRvIGludGVycG9sYXRlIGEgQ29tcG9uZW50IGluIGFuIGh0bWwgdGVtcGxhdGUgc3RyaW5nIGR1ZSB0byB0aGVcbkNvbXBvbmVudCBoYXZpbmcgYW4gaW52YWxpZCB0YWdOYW1lIHByb3BlcnR5LlxuXG5Db21wb25lbnQgXCIlc1wiIGhhcyBhbiBpbnZhbGlkIHRhZ05hbWUgcHJvcGVydHkgXCIlc1wiXG4gICAgYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVF06IGBcblRFTVBMQVRFX01JU1NJTkdfTElTVF9QQVJFTlRcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIHByZXBhcmUgYW4gOjplYWNoIGRpcmVjdGl2ZSBiZWNhdXNlIG5vIHZhbGlkIHBhcmVudCBub2RlXG53YXMgZm91bmQgZm9yIHRoZSBsaXN0IHRvIHJlbmRlciBpbnRvLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9MSVNUXTogYFxuVEVNUExBVEVfSU5WQUxJRF9MSVNUXG5BIHRlbXBsYXRlIGZhaWxlZCB0byByZW5kZXIgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIGZldGNoZWQgYSB2YWx1ZSB3aGljaFxud2FzIG5vdCBhbiBhcnJheSBvZiBhY3Rpb25hYmxlIGRhdGEuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PREVfUkVGXTogYFxuVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRlxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gcHJlcGFyZSBhIG5vZGUgZnJvbSBhIGNvbXBpbGVkIHNvdXJjZS4gVHlwaWNhbGx5LCB0aGlzXG5tZWFucyBzb21ldGhpbmcgaXMgYnJva2VuIHdpdGhpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUgcmF0aGVyIHRoYW4gYW4gZXJyb3Igd2l0aFxudGhlIHRlbXBsYXRlIGNvbnRlbnQgaXRzZWxmLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWV06IGBcblRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVlcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIHdhcyBmb3VuZCBvbiBhbiBlbGVtZW50XG53aXRob3V0IGEgY29ycmVzcG9uZGluZyA6OmtleSBkaXJlY3RpdmUuIDo6ZWFjaCBkaXJlY3RpdmVzIG11c3QgaGF2ZSBhIDo6a2V5XG5kaXJlY3RpdmUgc3BlY2lmaWVkIG9uIHRoZSBzYW1lIGVsZW1lbnQsIHdob3NlIG5vdGF0aW9uIGV2YWx1YXRlcyB0byBhIHVuaXF1ZVxudmFsdWUgZm9yIGVhY2ggaXRlbSBpbiB0aGUgbGlzdC5cblxuRXhhbXBsZTogPGxpIDo6ZWFjaD1cIiRpdGVtc1wiIDo6a2V5PVwiI2lkXCI+IC4uLiA8L2xpPlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXTogYFxuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXG5BIGxpc3QgZmFpbGVkIHRvIHJlbmRlciBiZWNhdXNlIGl0ZW0ga2V5ICVzIGFwcGVhcmVkIG11bHRpcGxlIHRpbWVzIHdoZW5cbnJlc29sdmluZyBsaXN0IGl0ZW0ga2V5cy4gRWFjaCA6OmtleSBkaXJlY3RpdmUgbXVzdCByZWZlcmVuY2UgYSBub3RhdGlvbiB3aG9zZVxudmFsdWUgaXMgdW5pcXVlIGZvciBlYWNoIGxpc3QgaXRlbS5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfS0VZXTogYFxuSU5WQUxJRF9TVEFURV9LRVlcblRyaWVkIHRvIGFjY2VzcyBhIHN0YXRlIHByb3BlcnR5IHdoaWNoIGRvZXMgbm90IGV4aXN0XG5cbktleSBwYXRoOiAlc1xuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9VUERBVEVdOiBgXG5JTlZBTElEX1NUQVRFX1VQREFURVxuQSBDb21wb25lbnQncyBzZXRTdGF0ZSgpIHdhcyBjYWxsZWQgd2l0aCBhIHZhbHVlIHdoaWNoIGNvdWxkIG5vdCBiZSBwYXRjaGVkIGluXG50byB0aGUgZXhpc3RpbmcgY29tcG9uZW50IHN0YXRlLlxuXG5zZXRTdGF0ZSgpIHRha2VzIGEgcGFydGlhbCBvYmplY3QgZGVzY3JpYmluZyBzdGF0ZSBrZXlzIHRvIHVwZGF0ZS5cblxuSW5zdGVhZCwgcmVjZWl2ZWQ6ICVzXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5TVEFURV9MT0NLRURdOiBgXG5TVEFURV9MT0NLRURcbkEgU3RhdGUgcmVjZWl2ZWQgYSByZXF1ZXN0IHRvIHVwZGF0ZSBvciBsb2NrIHdoaWxlIGFscmVhZHkgbG9ja2VkLlxuU3RhdGVzIG1heSBiZSBsb2NrZWQgdXNpbmcgdGhlIC5sb2NrKCkgbWV0aG9kIGFuZCB1bmxvY2tlZCB1c2luZyB0aGUgLnVubG9jaygpXG5tZXRob2QuIFN0YXRlcyBsb2NrIGR1cmluZyBhc3luYyBtdXRhdGlvbnMgZG9uZSB0aHJvdWdoIHRoZSAubXV0YXRlQXN5bmMoKVxubWV0aG9kIGlmIFwidHJ1ZVwiIGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci5cblxuWW91IGNhbiBjaGVjayB0aGUgbG9jayBzdGF0dXMgb2YgYSBTdGF0ZSBpbnN0YW5jZSB3aXRoIC5pc0xvY2tlZFxuYCxcblxuICAgIFtFcnJvckNvZGUuTUFYX1NFUVVFTlRJQUxfUkVOREVSU106IGBcbk1BWF9TRVFVRU5USUFMX1JFTkRFUlNcbkEgY29tcG9uZW50IGhhcyBlcnJvcmVkIGFmdGVyIHJlLXJlbmRlcmluZyBtb3JlIHRoYW4gJXMgdGltZXMgaW4gdGhlIHNhbWUgZnJhbWUuXG5cblRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgYmVjYXVzZSBzdGF0ZSBvciBsaXZlIGF0dHJpYnV0ZXMgYXJlIGJlaW5nIG1vZGlmaWVkXG5kdXJpbmcgYSByZW5kZXIgbGlmZWN5Y2xlIG1ldGhvZCBzdWNoIGFzIGJlZm9yZVVwZGF0ZSgpIG9yIGFmdGVyVXBkYXRlKCkuIElmXG5zdGF0ZSBjaGFuZ2VzIHVuY29uZGl0aW9uYWxseSBkdXJpbmcgYSByZW5kZXIsIHRoZSByZW5kZXIgd2lsbCBpbmZpbml0ZWx5IGxvb3AuXG5VcGRhdGluZyByZW5kZXIgc291cmNlIGRhdGEgZHVyaW5nIGEgcmVuZGVyIGN5Y2xlIGlzIHN1cHBvcnRlZCwgYnV0IGluZmluaXRlXG51cGRhdGUgbG9vcHMgbWF5IG9jY3VyIGlmIHVuY2hlY2tlZC5cbmAsXG4gIH07XG5cbiAgcmV0dXJuIERFVl9FUlJPUl9JTkZPW2NvZGVdO1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9yaWdpbmF0aW5nIGZyb20gd2l0aGluIGEgUGFsZXR0ZSBzdWJzeXN0ZW0uXG4gKlxuICogSW4gdGhlIGBkZXZlbG9wbWVudGAgZW52aXJvbm1lbnQsIHRoZSBlcnJvciB3aWxsIHN1cmZhY2Ugd2l0aCBleHRlbmRlZCBpbmZvXG4gKiBhYm91dCB0aGUgZXJyb3IgYW5kIGFueSBkZXRhaWxzIHdoaWNoIG1heSBiZSByZWxldmFudCB0byBoZWxwIHdpdGggZGVidWdnaW5nLlxuICpcbiAqIEluIHRoZSBgcHJvZHVjdGlvbmAgZW52aXJvbm1lbnQsIGEgbWluaW1hbCBlcnJvciBvbmx5IHN1cmZhY2luZyB0aGUgbnVtZXJpY1xuICogZXJyb3IgY29kZSBpcyB0aHJvd24gaW5zdGVhZC5cbiAqXG4gKiBDb2RlcyBhcmUgY2F0ZWdvcml6ZWQgaW50byBncm91cHMgYnkgdGhlIDEwMCdzOlxuICpcbiAqIC0gMCAtIDk5OiBJbnZhcmlhbnRzXG4gKiAtIDEwMCAtIDE5OTogQ3VzdG9tIEVsZW1lbnRzIC8gRW52aXJvbm1lbnQgRXJyb3JzXG4gKiAtIDIwMCAtIDI5OTogVGVtcGxhdGluZyBFcnJvcnNcbiAqIC0gMzAwIC0gMzk5OiBSdW50aW1lIEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUGFsZXR0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBuYW1lID0gXCJQYWxldHRlRXJyb3JcIjtcbiAgY29kZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvZGU6IG51bWJlciwgLi4udmFsdWVzOiBzdHJpbmdbXSkge1xuICAgIGxldCBtZXNzYWdlID0gYENvZGU6ICR7Y29kZX1gO1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBtZXNzYWdlICs9IGdldERldkVycm9yKGNvZGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShgJXNgLCBTdHJpbmcodmFsKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbi8qKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Yge0BsaW5rIENTU1N0eWxlU2hlZXR9cyBjb250YWluaW5nIHRoZSBwcm92aWRlZCBDU1NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzcyhcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIC4uLnZhbHVlczogdW5rbm93bltdXG4pOiBDU1NTdHlsZVNoZWV0IHtcbiAgbGV0IHJlc3VsdCA9IHN0cmluZ3NbMF0gPz8gXCJcIjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5leHRWYWwgPSB2YWx1ZXNbaV0gPz8gXCJcIjtcbiAgICBjb25zdCBuZXh0U3RyID0gc3RyaW5nc1tpICsgMV0gPz8gXCJcIjtcbiAgICByZXN1bHQgKz0gYCR7bmV4dFZhbH0ke25leHRTdHJ9YDtcbiAgfVxuXG4gIGNvbnN0IHNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcbiAgc2hlZXQucmVwbGFjZVN5bmMocmVzdWx0KTtcbiAgcmV0dXJuIHNoZWV0O1xufVxuXG50eXBlIENsYXNzVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCB1bmRlZmluZWRcbiAgfCBudWxsXG4gIHwgQ2xhc3NBcnJheVxuICB8IENsYXNzT2JqZWN0O1xudHlwZSBDbGFzc0FycmF5ID0gQ2xhc3NWYWx1ZVtdO1xudHlwZSBDbGFzc09iamVjdCA9IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbi8qKlxuICogR2l2ZW4gZmxleGlibGUgaW5wdXQsIGdlbmVyYXRlIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBzZXR0aW5nIGFzIGFuIGh0bWwgY2xhc3NcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzaWZ5KFwibXktY2xhc3NcIiwgXCJhbm90aGVyLWNsYXNzXCIpIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeShbXCJteS1jbGFzc1wiLCBcImFub3RoZXItY2xhc3NcIl0pIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeSh7IGVuYWJsZWQ6IHRydWUsIGRpc2FibGVkOiBmYWxzZSB9KSAvLyBcImVuYWJsZWRcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeSguLi5hcmdzOiBDbGFzc1ZhbHVlW10pOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0U3RyaW5nID0gXCJcIjtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IGFyZ3NbaW5kZXhdO1xuXG4gICAgaWYgKCFhcmd1bWVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gU3RyaW5ncy9udW1zIC0+IERpcmVjdCBhcHBlbmRcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBhcmd1bWVudCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICB9XG4gICAgICByZXN1bHRTdHJpbmcgKz0gYXJndW1lbnQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYXJyYXlzIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnQpKSB7XG4gICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSBjbGFzc2lmeSguLi5hcmd1bWVudCk7XG4gICAgICBpZiAobmVzdGVkUmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHRTdHJpbmcpIHtcbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0U3RyaW5nICs9IG5lc3RlZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvYmplY3RzIHdpdGggY29uZGl0aW9uYWwgY2xhc3MgbmFtZXNcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGNsYXNzTmFtZSBpbiBhcmd1bWVudCkge1xuICAgICAgICAvLyBPbmx5IGluY2x1ZGUgY2xhc3MgbmFtZSBpZiBpdHMgdmFsdWUgaXMgdHJ1dGh5XG4gICAgICAgIGlmIChhcmd1bWVudFtjbGFzc05hbWVdKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0U3RyaW5nICs9IFwiIFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFN0cmluZztcbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5cbi8qKiBBbiBhdHRyaWJ1dGUgdmFsdWUgYXMgcmVhZCBmcm9tIGEgRE9NIGVsZW1lbnQgKi9cbnR5cGUgQXR0cmlidXRlVmFsdWUgPSBzdHJpbmcgfCBudWxsO1xuXG4vKiogQSBNYXAgb2Ygc3RyaW5nIGF0dHJpYnV0ZSBuYW1lcyB0byB7QGxpbmsgQXR0cmlidXRlVmFsdWV9ICovXG50eXBlIEF0dHJpYnV0ZU1hcCA9IE1hcDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWx1ZTogdW5rbm93bik6IEF0dHJpYnV0ZVZhbHVlIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF0dHJpYnV0ZU1hcChcbiAgc291cmNlOiBvYmplY3QgfCBNYXA8c3RyaW5nLCB1bmtub3duPiB8IEhUTUxFbGVtZW50LFxuKTogQXR0cmlidXRlTWFwIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHNvdXJjZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBtYXAuc2V0KG5hbWUsIHNlcmlhbGl6ZUF0dHJpYnV0ZShzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBpZiAoc291cmNlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHNvdXJjZSkge1xuICAgICAgbWFwLnNldChrZXksIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG4gICAgICBtYXAuc2V0KGtleSwgc2VyaWFsaXplQXR0cmlidXRlKHZhbCkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXR0cmlidXRlTWFwKFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBhdHRyczogQXR0cmlidXRlTWFwLFxuKTogdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnROYW1lcyA9IG5ldyBTZXQodGFyZ2V0LmdldEF0dHJpYnV0ZU5hbWVzKCkpO1xuICBjb25zdCBpbmNvbWluZ05hbWVzID0gbmV3IFNldChhdHRycy5rZXlzKCkpO1xuICBjb25zdCBhdHRyaWJ1dGVzVG9SZW1vdmUgPSBjdXJyZW50TmFtZXMuZGlmZmVyZW5jZShpbmNvbWluZ05hbWVzKTtcblxuICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cmlidXRlc1RvUmVtb3ZlKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbF0gb2YgYXR0cnMpIHtcbiAgICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbCk7XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgcmVwbGFjZSBpdCB3aXRoIGEgZGlmZmVyZW50IHRhZywgYWRvcHRpbmcgYWxsIGF0dHJpYnV0ZXNcbiAqIGFuZCBjaGlsZCBlbGVtZW50cy5cbiAqIEBwYXJhbSAkdGFyZ2V0IFRoZSBlbGVtZW50IHRvIHN3YXAgb3V0XG4gKiBAcGFyYW0gbmV3VGFnIFRoZSBuZXcgSFRNTCB0YWdOYW1lIHRvIHVzZVxuICogQHJldHVybnMgVGhlIG5ld2x5IHN3YXBwZWQtaW4gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlVGFnKCR0YXJnZXQ6IEhUTUxFbGVtZW50LCBuZXdUYWc6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgJG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuZXdUYWcpO1xuXG4gIHdoaWxlICgkdGFyZ2V0LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAkbmV3RWwuYXBwZW5kQ2hpbGQoJHRhcmdldC5maXJzdENoaWxkKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgYXR0ck5hbWUgb2YgJHRhcmdldC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgY29uc3QgdmFsID0gJHRhcmdldC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuXG4gICAgaWYgKHZhbCAhPT0gbnVsbCkge1xuICAgICAgJG5ld0VsLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsKTtcbiAgICB9XG4gIH1cblxuICAkdGFyZ2V0LnJlcGxhY2VXaXRoKCRuZXdFbCk7XG4gIHJldHVybiAkbmV3RWw7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IHsgQ2hhckNvZGVzIH0gZnJvbSBcIi4vY2hhcmFjdGVyLWNvZGVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RhZ05hbWUoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBFbnN1cmUgdGhlIGNoYXJhY3RlciBjb2RlIGlzIGEgbGV0dGVyIG9yIGh5cGhlblxuICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGNoYXIgPT09IENoYXJDb2Rlcy5IeXBoZW4gfHxcbiAgICAgICAgKGNoYXIgPj0gQ2hhckNvZGVzLkEgJiYgY2hhciA8PSBDaGFyQ29kZXMuWikgfHxcbiAgICAgICAgKGNoYXIgPj0gQ2hhckNvZGVzLmEgJiYgY2hhciA8PSBDaGFyQ29kZXMueilcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBIHBlcmZvcm1hbmNlIG9wdGltaXplZCB2ZXJzaW9uIG9mIGAubWF0Y2hlcygpYCB3aGljaCBpbmNsdWRlcyBmYXN0ZXJcbiAqIG1hdGNoaW5nIHN0cmF0ZWdpZXMgZm9yIGNvbW1vbiBxdWVyaWVzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPcHRpbWl6ZWQgcXVlcnkgdHlwZXM6XG4gKlxuICogLSBTaW5nbGUgSUQgc2VsZWN0b3IgYFwiI2lkZW50aWZpZXJcImBcbiAqIC0gU2luZ2xlIGNsYXNzIHNlbGVjdG9yIGBcIi5jbGFzc25hbWVcImBcbiAqIC0gVGFnbmFtZSBzZWxlY3RvciBgXCJidXR0b25cImBcbiAqIC0gU2ltcGxlIGF0dHJpYnV0ZSBzZWxlY3RvciBgXCJbYXR0cj0ndmFsdWUnXVwiYFxuICpcbiAqIEFsbCBvdGhlciB0eXBlcyBvZiBxdWVyaWVzIHVzZSB0aGUgYmFzZSAubWF0Y2hlcygpIGZvciBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50TWF0Y2hlcyhlbGVtZW50OiBFbGVtZW50LCBxdWVyeTogc3RyaW5nKSB7XG4gIC8vIElmIHRoZSBxdWVyeSBpcyBhIHNpbXBsZSBJRCwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKFxuICAgIHF1ZXJ5WzBdID09PSBcIiNcIiAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIgXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIuXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCJbXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI6XCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI+XCIpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gZWxlbWVudC5pZCA9PT0gcXVlcnkuc2xpY2UoMSk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgYSBzaW1wbGUgY2xhc3NuYW1lLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoXG4gICAgcXVlcnlbMF0gPT09IFwiLlwiICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiBcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiNcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIltcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIjpcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIj5cIikgPT09IC0xXG4gICkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhxdWVyeS5zbGljZSgxKSk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgZm9yIGp1c3QgYSB0YWduYW1lLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoaXNUYWdOYW1lKHF1ZXJ5KSkge1xuICAgIHJldHVybiBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIElmIHRoZSBxdWVyeSBpcyBmb3IgYSBzaW5nbGUgc2VsZWN0b3IgdmFsdWUsIGNoZWNrIGl0IGRpcmVjdGx5XG4gIGlmIChcbiAgICBxdWVyeVswXSA9PT0gXCJbXCIgJiZcbiAgICBxdWVyeVtxdWVyeS5sZW5ndGggLSAxXSA9PT0gXCJdXCIgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiOlwiKSA9PT0gLTFcbiAgKSB7XG4gICAgY29uc3QgYXR0ciA9IHF1ZXJ5LnNsaWNlKDEsIC0xKTtcbiAgICBjb25zdCBlcUluZGV4ID0gYXR0ci5pbmRleE9mKFwiPVwiKTtcbiAgICBpZiAoZXFJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKTtcbiAgICB9XG4gICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyLnNsaWNlKDAsIGVxSW5kZXgpO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGF0dHIuc2xpY2UoZXFJbmRleCArIDEpLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG4gICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKSA9PT0gYXR0clZhbHVlO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCB1c2UgbmF0aXZlIGAubWF0Y2hlc2AgZm9yIGNvbXBsZXggc3R1ZmZcbiAgcmV0dXJuIGVsZW1lbnQubWF0Y2hlcyhxdWVyeSk7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xudHlwZSBNZXRyaWNzID0ge1xuICBoaXRzOiBudW1iZXI7XG4gIG1pc3NlczogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTFJVQ2FjaGVNZXRyaWNzID0ge1xuICBsb29rdXBzOiBudW1iZXI7XG4gIGhpdHM6IG51bWJlcjtcbiAgbWlzc2VzOiBudW1iZXI7XG4gIGNhcGFjaXR5OiBudW1iZXI7XG4gIGVudHJpZXM6IG51bWJlcjtcbiAgaGl0UmF0ZTogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBBIHNpbXBsZSBpbi1tZW1vcnkgTFJVIENhY2hlIHVzaW5nIEphdmFTY3JpcHQgbWFwcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIENhY2hlZCBuZXR3b3JrIHJlcXVlc3RcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBIGNhY2hlIG9mIEFQSSBVUkxzIHRvIHRoZWlyIHJldHVybmVkIHBheWxvYWRzXG4gKiBjb25zdCBjYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIEFQSVBheWxvYWQ+KCk7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gbWFrZVJlcXVlc3QodXJsOiBzdHJpbmcpIHtcbiAqICAgbGV0IGNhY2hlZCA9IGNhY2hlLmdldCh1cmwpO1xuICogICBpZiAoY2FjaGVkKSB7XG4gKiAgICAgcmV0dXJuIGNhY2hlZDtcbiAqICAgfVxuICpcbiAqICAgLy8gLi4uIE1ha2UgdGhlIHJlcXVlc3QgYW5kIGNhY2hlLnNldCgpIHRoZSByZXNwb25zZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZTxLLCBWPiB7XG4gIHByaXZhdGUgX21heFNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGF0YTogTWFwPEssIFY+O1xuICBwcml2YXRlIF9tZXRyaWNzOiBNZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplOiBudW1iZXIgPSA1MDApIHtcbiAgICBpZiAobWF4U2l6ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMUlUgQ2FjaGUgY2FwYWNpdHkgbXVzdCBiZSA+PSAxXCIpO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl9kYXRhID0gbmV3IE1hcDxLLCBWPigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJpbSA9ICgpID0+IHtcbiAgICB3aGlsZSAodGhpcy5fZGF0YS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLl9kYXRhLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN1cmRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLl9kYXRhLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgcGVyZm9ybWFuY2UgbWV0cmljcyBmcm9tIHRoaXMgTFJVIENhY2hlIGluc3RhbmNlLlxuICAgKlxuICAgKiBJbiBkZXZlbG9wbWVudCBtb2RlLCB0aGlzIHJldHVybnMgaW5zaWdodHMgaW50byBoaXRzL21pc3NlcyBvZiB0aGUgY2FjaGUsXG4gICAqIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgZW50cnkgY291bnQuXG4gICAqXG4gICAqIEluIHByb2R1Y3Rpb24gbW9kZSwgdGhpcyByZXR1cm5zIGEgcGxhY2Vob2xkZXIgb2JqZWN0LCBhcyBtZXRyaWMgY29sbGVjdGlvblxuICAgKiBpcyBub3QgYWN0aXZlIGluIHByb2R1Y3Rpb24uXG4gICAqL1xuICBnZXQgbWV0cmljcygpOiBMUlVDYWNoZU1ldHJpY3Mge1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBjb25zdCB7IGhpdHMgPSAwLCBtaXNzZXMgPSAwIH0gPSB0aGlzLl9tZXRyaWNzID8/IHt9O1xuICAgICAgY29uc3QgbG9va3VwcyA9IGhpdHMgKyBtaXNzZXM7XG4gICAgICBjb25zdCBoaXRSYXRlID0gbG9va3VwcyA9PT0gMCA/IDAgOiBoaXRzIC8gbG9va3VwcztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9va3VwcyxcbiAgICAgICAgaGl0czogaGl0cyxcbiAgICAgICAgbWlzc2VzOiBtaXNzZXMsXG4gICAgICAgIGNhcGFjaXR5OiB0aGlzLl9tYXhTaXplLFxuICAgICAgICBlbnRyaWVzOiB0aGlzLl9kYXRhLnNpemUsXG4gICAgICAgIGhpdFJhdGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsb29rdXBzOiAwLFxuICAgICAgaGl0czogMCxcbiAgICAgIG1pc3NlczogMCxcbiAgICAgIGNhcGFjaXR5OiAwLFxuICAgICAgZW50cmllczogMCxcbiAgICAgIGhpdFJhdGU6IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIG1heGltdW0gY2FjaGUgc2l6ZSBmb3IgdGhpcyBpbnN0YW5jZS4gSW1tZWRpYXRlbHkgdHJpZ2dlcnMgYVxuICAgKiBwdXJnZSBvZiBjYWNoZWQgY29udGVudHMgaWYgdGhlIG5ldyBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnRcbiAgICogbnVtYmVyIG9mIGNhY2hlZCBlbnRyaWVzLlxuICAgKi9cbiAgc2V0Q2FwYWNpdHkgPSAobWF4U2l6ZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgaWYgKG1heFNpemUgPD0gMCAmJiBfX0RFVl9fKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW1BhbGV0dGUgTFJVIENhY2hlXSBDYWNoZSBzaXplIGlzIDw9IDAuIENhY2hlIGlzIGRpc2FibGVkLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl90cmltKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdmFsdWUgZnJvbSB0aGUgY2FjaGUsIHJldHVybmluZyBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSB3YXMgZm91bmRcbiAgICovXG4gIGdldChrZXk6IEspOiBWIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGEuZ2V0KGtleSk7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgdGhpcy5fbWV0cmljcy5taXNzZXMgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIGFuZCByZS1zZXQgdGhlIHZhbHVlIHRvIG1vdmUgdGhlIGtleSB0byB0aGUgZW5kIG9mIHRoZSBrZXkgbGlzdFxuICAgIHRoaXMuX2RhdGEuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5fZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgdGhpcy5fbWV0cmljcy5oaXRzICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGluIHRoZSBjYWNoZS4gVGhpcyBhbHNvIG1vdmVzIHRoZSB2YWx1ZSB0byB0aGUgYmFjayBvZiB0aGUgbGlzdFxuICAgKiBvZiB2YWx1ZXMgdG8gY29uc2lkZXIgZXZpY3Rpbmcgd2hlbiB0aGUgY2FjaGUgaXMgZnVsbC5cbiAgICovXG4gIHNldChrZXk6IEssIHZhbHVlOiBWKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGlmIGV4aXN0cyB0byB1cGRhdGUgcG9zaXRpb25cbiAgICBpZiAodGhpcy5fZGF0YS5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5fZGF0YS5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhLnNldChrZXksIHZhbHVlKTtcblxuICAgIGlmICh0aGlzLl9kYXRhLnNpemUgPiB0aGlzLl9tYXhTaXplKSB7XG4gICAgICB0aGlzLl90cmltKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjb250ZW50cyBvZiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnNpemU7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTFJVQ2FjaGU7XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IExSVUNhY2hlIGZyb20gXCIuL2xydS1jYWNoZVwiO1xuXG5leHBvcnQgY29uc3QgZnJhZ21lbnRDYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIERvY3VtZW50RnJhZ21lbnQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBodG1sVG9GcmFnbWVudChodG1sOiBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgY29uc3QgbG9va3VwID0gZnJhZ21lbnRDYWNoZS5nZXQoaHRtbCk7XG5cbiAgaWYgKGxvb2t1cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvb2t1cC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgfVxuXG4gIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXAuaW5uZXJIVE1MID0gaHRtbDtcbiAgZnJhZ21lbnRDYWNoZS5zZXQoaHRtbCwgdGVtcC5jb250ZW50KTtcbiAgcmV0dXJuIHRlbXAuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiI2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgeyBpc1RhZ05hbWUgfSBmcm9tIFwiI3V0aWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGVtcGxhdGVTdHJpbmdWYWx1ZShcbiAgdmFsOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50IHwgSFRNTFRlbXBsYXRlRWxlbWVudCxcbik6IHN0cmluZyB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgcmV0dXJuIHZhbC5pbm5lckhUTUw7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgKHZhbC5wcm90b3R5cGUgaW5zdGFuY2VvZiBDb21wb25lbnQgfHwgdmFsID09PSBDb21wb25lbnQpXG4gICkge1xuICAgIGNvbnN0IHRhZ05hbWUgPSB2YWwudGFnTmFtZTtcbiAgICBpZiAoIWlzVGFnTmFtZSh0YWdOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5ULFxuICAgICAgICB2YWwubmFtZSxcbiAgICAgICAgdmFsLnRhZ05hbWUsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnTmFtZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGA8c3BhbiA6OnN3YXA9XCIke3ZhbH1cIj48L3NwYW4+YDtcbiAgfVxuXG4gIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSUQsIFN0cmluZyh2YWwpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4ge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IGZyb20gdGhlIHByb3ZpZGVkIEhUTUwgc3RyaW5nLlxuICpcbiAqIFRoZXNlIEhUTUwgVGVtcGxhdGVzIGNhbiBiZSB1c2VkIGFzIHN0YW5kYXJkIEhUTUwgVGVtcGxhdGVzLCBvciBhcyB0aGVcbiAqIGZvdW5kYXRpb24gZm9yIGEge0BsaW5rIENvbXBvbmVudH0gb3Igc3RhbmRhbG9uZSB7QGxpbmsgVGVtcGxhdGV9XG4gKlxuICogSW50ZXJwb2xhdGVzIHZhbHVlcyBpbiB0aGUgdGVtcGxhdGUgc3RyaW5nIHRvIHByb3ZpZGUgaGVscGVycyBmb3IgY29tcG9zaW5nXG4gKiB0ZW1wbGF0ZXM6XG4gKlxuICogLSBIVE1MVGVtcGxhdGVFbGVtZW50IHJlZmVyZW5jZXMgYXJlIHNlcmlhbGl6ZWQgdG8gSFRNTCBhbmQgaW5saW5lZFxuICogLSBTdHJpbmdzIGFyZSBtb2RpZmllZCB0byBiZWNvbWUgPHNwYW4+IHRhZ3Mgd2l0aCB0aGUgOjpzd2FwIGRpcmVjdGl2ZSBzZXRcbiAqICAgdG8gdGhlIHN0cmluZyB2YWx1ZS4gVGhpcyBpcyBoZWxwZnVsIHNob3J0aGFuZCBmb3IgY29udGVudCBwbGFjZWhvbGRlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBUaGlzIHRlbXBsYXRlIHN0cmluZ1xuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0ICR0ZW1wbGF0ZSA9IGh0bWxgXG4gKiA8ZGl2IDpjbGFzcz1cIipjbGFzc25hbWVzXCI+XG4gKiAgICR7XCJAY29udGVudFwifVxuICogPC9kaXY+XG4gKiBgXG4gKiBgYGBcbiAqXG4gKiBQcm9kdWNlcyB0aGlzIHRlbXBsYXRlIGVsZW1lbnQgKHBvcnRyYXllZCBhcyBIVE1MKVxuICpcbiAqIGBgYGh0bWxcbiAqIDx0ZW1wbGF0ZT5cbiAqICAgPGRpdiA6Y2xhc3M9XCIqY2xhc3NuYW1lc1wiPlxuICogICAgIDxzcGFuIDo6c3dhcD1cIkBjb250ZW50XCI+PC9zcGFuPlxuICogICA8L2Rpdj5cbiAqIDwvdGVtcGxhdGU+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh0bWwoXG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi52YWx1ZXM6IChcbiAgICB8IGBAJHtzdHJpbmd9YFxuICAgIHwgYCQke3N0cmluZ31gXG4gICAgfCBgIyR7c3RyaW5nfWBcbiAgICB8IGAqJHtzdHJpbmd9YFxuICAgIHwgSFRNTFRlbXBsYXRlRWxlbWVudFxuICAgIHwgdHlwZW9mIENvbXBvbmVudDxhbnk+XG4gIClbXVxuKTogSFRNTFRlbXBsYXRlRWxlbWVudCB7XG4gIGNvbnN0IGZ1bGxTdHJpbmcgPSBzdHJpbmdzLnJlZHVjZSgoYWNjLCBzdHIsIGkpID0+IHtcbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IHZhbHVlc1tpXVxuICAgICAgPyBgJHtwYXJzZVRlbXBsYXRlU3RyaW5nVmFsdWUodmFsdWVzW2ldKX1gXG4gICAgICA6IFwiXCI7XG4gICAgcmV0dXJuIGFjYyArIHN0ciArIHBhcnNlZFZhbHVlO1xuICB9LCBcIlwiKTtcblxuICBjb25zdCB0ZW1wbGF0ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSBmdWxsU3RyaW5nO1xuICByZXR1cm4gdGVtcGxhdGVFbGVtZW50O1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5cbmV4cG9ydCB0eXBlIFN0YXRlTGlzdGVuZXI8U2hhcGU+ID0gKHN0YXRlOiBTaGFwZSkgPT4gdm9pZDtcblxuY29uc3QgUFJPWFlfREVQVEhfV0FSTklOR19MSU1JVCA9IDQ7XG5cbmNvbnN0IEFycmF5TXV0YXRvckZ1bmN0aW9ucyA9IG5ldyBTZXQoW1xuICBcInB1c2hcIixcbiAgXCJwb3BcIixcbiAgXCJzaGlmdFwiLFxuICBcInVuc2hpZnRcIixcbiAgXCJzcGxpY2VcIixcbiAgXCJzb3J0XCIsXG4gIFwicmV2ZXJzZVwiLFxuICBcImZpbGxcIixcbiAgXCJjb3B5V2l0aGluXCIsXG5dKTtcblxuY29uc3QgRGF0YVN0cnVjdHVyZU11dGF0b3JGdW5jdGlvbnMgPSBuZXcgU2V0KFtcbiAgXCJhZGRcIixcbiAgXCJkZWxldGVcIixcbiAgXCJjbGVhclwiLFxuICBcInNldFwiLFxuXSk7XG5cbi8qKlxuICogUG93ZXJmdWwgYW5kIGZsZXhpYmxlIHN0YXRlIG1hbmFnZW1lbnQgd2l0aCBkZWVwIHJlYWN0aXZpdHksIHRyYW5zYWN0aW9uLCBhbmRcbiAqIGxvY2tpbmcgc3VwcG9ydC5cbiAqXG4gKiBUaGUgU3RhdGUgY2xhc3Mgd3JhcHMgc3RhdGVmdWwgZGF0YSBhbmQgcHJvdmlkZXMgYW4gQVBJIGZvciBtdXRhdGluZyB0aGUgZGF0YVxuICogd2hpbGUgbGlzdGVuZXJzIHN1YnNjcmliZSB0byBtZWFuaW5nZnVsIHVwZGF0ZXMuXG4gKlxuICogTW9kaWZ5IHN0YXRlIHdpdGggc2V0dGVycywgbXV0YXRvcnMsIHRyYW5zYWN0aW9ucywgb3IgcHJveGllZCB1cGRhdGVzIHdpdGhcbiAqIGRlZXAgcmVhY3Rpdml0eSBhbmQgYXJyYXkgbXV0YXRpb24gc3VwcG9ydCBidWlsdCBpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHtjb3VudDogMX0pO1xuICogc3RhdGUuYWRkTGlzdGVuZXIoZGF0YSA9PiBjb25zb2xlLmxvZyhkYXRhKSlcbiAqXG4gKiBzdGF0ZS5zZXQoXCJjb3VudFwiLCAyKTsgLy8gUHJpbnRzIFwiMlwiXG4gKiBzdGF0ZS5zZXQoXCJjb3VudFwiLCAyKTsgLy8gTm90aGluZyBoYXBwZW5zLCBubyBjaGFuZ2VcbiAqIHN0YXRlLmxpdmUuY291bnQgPSAzOyAvLyBQcmludHMgXCIzXCJcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU3RhdGU8U2hhcGUgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgcHJpdmF0ZSBfZGF0YTogU2hhcGU7XG4gIHByaXZhdGUgX2xpc3RlbmVyczogU2V0PFN0YXRlTGlzdGVuZXI8U2hhcGU+PiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBfcHJveHk/OiBTaGFwZTtcbiAgcHJpdmF0ZSBfcHJveHlDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgYW55PigpO1xuICBwcml2YXRlIF9yZXZlcnNlUHJveHlDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgb2JqZWN0PigpO1xuICBwcml2YXRlIF9pc0xvY2tlZCA9IGZhbHNlO1xuXG4gIC8vIE9ubHkgYWxsb3cgd2FybmluZyBpbiBkZXYgbW9kZSwgYW5kIG9ubHkgcHJpbnQgdGhlIHdhcm5pbmcgb25jZSBwZXIgaW5zdFxuICBwcml2YXRlIF9oYXNXYXJuZWQgPSAhX19ERVZfXztcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGF0YTogU2hhcGUsIG9uQ2hhbmdlPzogU3RhdGVMaXN0ZW5lcjxTaGFwZT4pIHtcbiAgICB0aGlzLl9kYXRhID0gaW5pdGlhbERhdGE7XG4gICAgdGhpcy5nZXQgPSB0aGlzLmdldC5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKG9uQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IGNyZWF0ZSBhbmQgY2FjaGUgcHJveGllcyBpbnRvIHRoZSBzdGF0ZSBmb3IgcmVhY3RpdmUgdXBkYXRlcyBvblxuICAgKiBuZXN0ZWQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlUHJveHk8VD4odGFyZ2V0OiBULCBwYXRoOiBzdHJpbmdbXSA9IFtdKTogVCB7XG4gICAgLy8gUmV0dXJuIHByaW1pdGl2ZXMgaW1tZWRpYXRlbHlcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGEgY2FjaGVkIHByb3h5IGZvciB0aGlzIG9iamVjdFxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuX3Byb3h5Q2FjaGUuZ2V0KHRhcmdldCBhcyBvYmplY3QpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIGlmICghdGhpcy5faGFzV2FybmVkICYmIHBhdGgubGVuZ3RoID4gUFJPWFlfREVQVEhfV0FSTklOR19MSU1JVCkge1xuICAgICAgICB0aGlzLl9oYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLndhcm4oYFxuW1N0YXRlXSBEZWVwbHkgbmVzdGVkIGxpdmUgc3RhdGUgYWNjZXNzIG1heSBoYXZlIHBlcmZvcm1hbmNlIGltcGFjdHMuIEZvciBkZWVwbHlcbm5lc3RlZCBvciBjb21wbGV4IHN0YXRlIHVwZGF0ZXMsIHVzZSAubXV0YXRlKCksIC5wYXRjaCgpLCBvciAudHJhbnNhY3Rpb24oKSBmb3Jcbm9wdGltYWwgcGVyZm9ybWFuY2UgKFdhcm5pbmcgd2hpbGUgZXZhbHVhdGluZyBsaXZlIGFjY2VzcyB0byAke3BhdGguam9pbihcIi5cIil9KVxuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBwcm94eSBhbmQgY2FjaGUgaXRcbiAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQgYXMgb2JqZWN0LCB7XG4gICAgICBnZXQ6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIC8vIFN5bWJvbHMgLT4gRGlyZWN0IHJldHVyblxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIHJldHVybiAob2JqIGFzIGFueSlba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKG9iaiBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgLy8gRm9yIEFycmF5cywgTWFwcywgYW5kIFNldHMsIGhhbmRsZSBtdXRhdG9yIGZ1bmN0aW9ucyBjb3JyZWN0bHlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChvYmogaW5zdGFuY2VvZiBTZXQgfHwgb2JqIGluc3RhbmNlb2YgTWFwIHx8IEFycmF5LmlzQXJyYXkob2JqKSkgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtdXRhdGlvbkZucyA9IEFycmF5LmlzQXJyYXkob2JqKVxuICAgICAgICAgICAgPyBBcnJheU11dGF0b3JGdW5jdGlvbnNcbiAgICAgICAgICAgIDogRGF0YVN0cnVjdHVyZU11dGF0b3JGdW5jdGlvbnM7XG4gICAgICAgICAgY29uc3QgaXNNdXRhdGlvbiA9IG11dGF0aW9uRm5zLmhhcyhrZXkpO1xuXG4gICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnNuYXBzaG90KCk7XG5cbiAgICAgICAgICAgIGxldCBjdXJyZW50OiBhbnkgPSBzbmFwc2hvdDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhdGgpIHtcbiAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IChjdXJyZW50IGFzIGFueSlba2V5XSguLi5hcmdzKTtcblxuICAgICAgICAgICAgaWYgKGlzTXV0YXRpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShzbmFwc2hvdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9iamVjdHMgLT4gcmVjdXJzaXZlbHkgY3JlYXRlIGEgcHJveHlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVQcm94eSh2YWx1ZSwgWy4uLnBhdGgsIGtleV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJpbWl0aXZlcyAtPiBSZXR1cm4gdmFsdWVcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcblxuICAgICAgc2V0OiAoX29iaiwga2V5OiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICAgICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FsbG93IHNldHRpbmcgc3ltYm9sIHByb3BlcnRpZXMgb24gdGFyZ2V0IGRhdGEgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBhbmQgdXBkYXRlIHRoZSBwYXRoIHdpdGggdGhlIHZhbHVlXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucGF0aCwga2V5XTtcbiAgICAgICAgdGhpcy5fc2V0TmVzdGVkKG5ld1BhdGgsIHRoaXMuX3Vud3JhcFByb3h5KHZhbHVlKSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICBoYXM6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gb2JqO1xuICAgICAgfSxcblxuICAgICAgb3duS2V5czogKG9iaikgPT4ge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKG9iaik7XG4gICAgICB9LFxuXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTtcblxuICAgICAgICBpZiAoZGVzYykge1xuICAgICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjO1xuICAgICAgfSxcblxuICAgICAgZGVsZXRlUHJvcGVydHk6IChvYmosIGtleSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiB8fCAhKGtleSBpbiBvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBhbmQgdXBkYXRlIHRoZSBwYXRoIHdpdGggdGhlIHZhbHVlXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucGF0aCwga2V5XTtcblxuICAgICAgICB0aGlzLl9zZXROZXN0ZWQobmV3UGF0aCwgdW5kZWZpbmVkKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfSkgYXMgVDtcblxuICAgIHRoaXMuX3Byb3h5Q2FjaGUuc2V0KHRhcmdldCBhcyBvYmplY3QsIHByb3h5KTtcbiAgICB0aGlzLl9yZXZlcnNlUHJveHlDYWNoZS5zZXQocHJveHkgYXMgb2JqZWN0LCB0YXJnZXQgYXMgb2JqZWN0KTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cblxuICBwcml2YXRlIF91bndyYXBQcm94eTxUPih2YWx1ZTogVCk6IFQge1xuICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGZvciBwcmltaXRpdmVzXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgb25lIG9mIG91ciBwcm94aWVzXG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdGhpcy5fcmV2ZXJzZVByb3h5Q2FjaGUuZ2V0KHZhbHVlIGFzIG9iamVjdCk7XG4gICAgaWYgKHJhd1RhcmdldCkge1xuICAgICAgcmV0dXJuIHJhd1RhcmdldCBhcyBUO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuX3Vud3JhcFByb3h5KGl0ZW0pKSBhcyBUO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwbGFpbiBvYmplY3RzXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgIGNvbnN0IHVud3JhcHBlZDogYW55ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICAgIHVud3JhcHBlZFtrZXldID0gdGhpcy5fdW53cmFwUHJveHkoKHZhbHVlIGFzIGFueSlba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bndyYXBwZWQ7XG4gICAgfVxuXG4gICAgLy8gT3RoZXIgb2JqZWN0cyAoRGF0ZSwgTWFwLCBTZXQsIGV0Yy4pIHBhc3MgdGhyb3VnaFxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2V0dGluZyBuZXN0ZWQgdmFsdWVzIGFuZCBlbWl0dGluZyB1cGRhdGVkIGRhdGEgaWYgdGhlIHZhbHVlIGNoYW5nZWRcbiAgICovXG4gIHByaXZhdGUgX3NldE5lc3RlZChwYXRoOiBzdHJpbmdbXSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgdG8gZG8gd2l0aCBlbXB0eSBwYXRoc1xuICAgIGlmICghcGF0aC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBhdCB0aGUgcm9vdCBhbmQgc2VlayB0byB0aGUgdmFsdWUgYmVpbmcgc2V0XG4gICAgbGV0IGN1cnJlbnQ6IGFueSA9IHRoaXMuX2RhdGE7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRoW2ldID8/IFwiXCI7XG4gICAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9LRVksIHBhdGguam9pbihcIi5cIikpO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbEtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA/PyBcIlwiO1xuICAgIGlmICghKGZpbmFsS2V5IGluIGN1cnJlbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX1NUQVRFX0tFWSwgcGF0aC5qb2luKFwiLlwiKSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFuZCBlbWl0IG9ubHkgaWYgdGhlIHZhbHVlIGlzIGRpZmZlcmVudC4gT3RoZXJ3aXNlIG5vLW9wLlxuICAgIGlmIChjdXJyZW50W2ZpbmFsS2V5XSAhPT0gdmFsdWUgJiYgIU9iamVjdC5pcyhjdXJyZW50W2ZpbmFsS2V5XSwgdmFsdWUpKSB7XG4gICAgICBjdXJyZW50W2ZpbmFsS2V5XSA9IHZhbHVlO1xuICAgICAgdGhpcy5fZW1pdCh0aGlzLmN1cnJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFuIGluY29taW5nIHBhcnRpYWwgc3RhdGUgYW5kIGVtaXQgdXBkYXRlcyB0byBsaXN0ZW5lcnMgaWYgdGhlcmVcbiAgICogYXJlIGFueSBjaGFuZ2VzIGRldGVjdGVkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBPYmplY3QuaXMoKSB0byBjaGVjayBmb3IgZGlmZmVyZW5jZXMuIERvZXMgbm90IGF0dGVtcHQgZGVlcCBkaWZmaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc0luY29taW5nU3RhdGUgPSAoaW5jb21pbmdTdGF0ZTogUGFydGlhbDxTaGFwZT4pOiB2b2lkID0+IHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgaW5jb21pbmdTdGF0ZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgaW5jb21pbmdTdGF0ZSA9PT0gbnVsbCB8fFxuICAgICAgQXJyYXkuaXNBcnJheShpbmNvbWluZ1N0YXRlKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfVVBEQVRFLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShpbmNvbWluZ1N0YXRlKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiBhbnkga2V5L3ZhbHVlIHBhaXIgb24gdGhlIGluY29taW5nIHN0YXRlIGRpZmZlcnMgZnJvbSB0aGVcbiAgICAvLyBleGlzdGluZyBkYXRhXG4gICAgZm9yIChjb25zdCBba2V5LCBuZXdWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5jb21pbmdTdGF0ZSkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuX2RhdGFba2V5IGFzIGtleW9mIFNoYXBlXTtcbiAgICAgIGlmICghT2JqZWN0LmlzKGN1cnJlbnRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICAodGhpcy5fZGF0YSBhcyBhbnkpW2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgdGhpcy5fZW1pdCh0aGlzLl9kYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gYWxsIGxpc3RlbmVyc1xuICAgKi9cbiAgcHJpdmF0ZSBfZW1pdCA9IChkYXRhOiBTaGFwZSk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXRlXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBzdGF0ZS4gSXQgaXMgbWFya2VkIGFzIFJlYWRvbmx5XG4gICAqIHRvIGhlbHAgcHJldmVudCBhY2NpZGVudGFsIGNoYW5nZXMuIE5ldmVyIGVkaXQgdGhpcyB2YWx1ZSBkaXJlY3RseS5cbiAgICovXG4gIGdldCBjdXJyZW50KCk6IFJlYWRvbmx5PFNoYXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogUHJveGllZCBhY2Nlc3MgdG8gc3RhdGUgcHJvcGVydGllcyB3aXRoIGF1dG9tYXRpYyByZWNvbmNpbGlhdGlvbi5cbiAgICpcbiAgICogQWxsb3dzIGRpcmVjdCBwcm9wZXJ0eSBhY2Nlc3MgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyBzdGF0ZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIERlZXAgcmVhY3Rpdml0eSB3aXRoIHRoZSBgLmxpdmVgIGFjY2Vzc29yXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoe1xuICAgKiAgIG5lc3RlZDoge1xuICAgKiAgICAgdmFsdWVzOiBbMSwgMiwgM10sXG4gICAqICAgfVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gRGVlcCB2YWx1ZSBhc3NpZ25tZW50IHRyaWdnZXJzIHN0YXRlIHVwZGF0ZXNcbiAgICogc3RhdGUubGl2ZS5uZXN0ZWQudmFsdWVzWzFdID0gNTtcbiAgICpcbiAgICogLy8gQXJyYXkgbXV0YXRvcnMgYXJlIGF1dG9tYXRpY2FsbHkgcmVhY3RpdmUgYXMgd2VsbFxuICAgKiBzdGF0ZS5saXZlLm5lc3RlZC52YWx1ZXMucHVzaCg0KTtcbiAgICogc3RhdGUubGl2ZS5uZXN0ZWQudmFsdWVzLnJldmVyc2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQgbGl2ZSgpOiBTaGFwZSB7XG4gICAgaWYgKCF0aGlzLl9wcm94eSkge1xuICAgICAgdGhpcy5fcHJveHkgPSB0aGlzLl9jcmVhdGVQcm94eSh0aGlzLl9kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Byb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGlzIHN0YXRlIGlzIGN1cnJlbnRseSBsb2NrZWQgKHRydWUpIG9yIG5vdCAoZmFsc2UpXG4gICAqL1xuICBnZXQgaXNMb2NrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTG9ja2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHdoZW4gdGhpcyBzdGF0ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBMaXN0ZW5lcnMgYXJlIGludm9rZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHJlZ2lzdGVyZWQgYW5kIGFyZSBwYXNzZWQgYVxuICAgKiByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsbHkgbWFuYWdlZCBzdGF0ZSBvYmplY3QgYXMgYSByZWFkb25seSBvYmplY3QuXG4gICAqXG4gICAqICoqRG8gbm90IG1vZGlmeSBzdGF0ZSB2YWx1ZXMgZGlyZWN0bHkqKi4gSW5zdGVhZCwgdXNlIHtAbGluayBzZXR9IG9yXG4gICAqIHtAbGluayBwYXRjaH0gdG8gbWFrZSBpbW11dGFibGUgdXBkYXRlcy5cbiAgICovXG4gIGFkZExpc3RlbmVyID0gKGxpc3RlbmVyOiBTdGF0ZUxpc3RlbmVyPFNoYXBlPik6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgc3RhdGUgaGFuZGxlclxuICAgKi9cbiAgcmVtb3ZlTGlzdGVuZXIgPSAobGlzdGVuZXI6IFN0YXRlTGlzdGVuZXI8U2hhcGU+KTogdm9pZCA9PiB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB2YWx1ZSBmcm9tIHRoZSBzdGF0ZSBvYmplY3RcbiAgICpcbiAgICogVGhlIHZhbHVlIGlzIHJldHVybmVkIGFzIFJlYWRvbmx5IHRvIHByZXZlbnQgYWNjaWRlbnRhbCBzdGF0ZSBtdXRhdGlvbnMuXG4gICAqIFRvIG11dGF0ZSBzdGF0ZWZ1bCBwcm9wZXJ0aWVzLCB1c2Uge0BsaW5rIHNldH0gb3Ige0BsaW5rIHBhdGNofSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHsgY291bnQ6IDEgfSk7XG4gICAqIGNvbnNvbGUubG9nKHN0YXRlLmdldChcImNvdW50XCIpKTsgLy8gMVxuICAgKiBgYGBcbiAgICpcbiAgICovXG4gIGdldCA9IDxLIGV4dGVuZHMga2V5b2YgU2hhcGU+KGtleTogSyk6IFJlYWRvbmx5PFNoYXBlW0tdPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFba2V5XSBhcyBSZWFkb25seTxTaGFwZVtLXT47XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHRoZSBjdXJyZW50IHN0YXRlIGRhdGEgdXNpbmcgYHN0cnVjdHVyZWRDbG9uZSgpYCB0b1xuICAgKiBtYWtlIHRoZSBjb3B5LlxuICAgKlxuICAgKiBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiBjYW4gYmUgZWRpdGVkIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZVxuICAgKiBhY3R1YWwgaW50ZXJuYWwgc3RhdGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc25hcCA9IHN0YXRlLnNuYXBzaG90KCk7XG4gICAqIHNuYXAuY291bnQgKz0gMTtcbiAgICogc3RhdGUucGF0Y2goc25hcCk7XG4gICAqIGBgYFxuICAgKi9cbiAgc25hcHNob3QgPSAoKTogU2hhcGUgPT4ge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fZGF0YSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBhIHNpbmdsZSBzdGF0ZWZ1bCBwcm9wZXJ0eSB3aGlsZSBsZWF2aW5nIG90aGVyIHByb3BlcnRpZXMgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUcmlnZ2VycyBhbiB1cGRhdGUgdG8gYWxsIGxpc3RlbmVycyBpZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gYmVmb3JlXG4gICAqIHdoZW4gY29tcGFyZWQgdXNpbmcgc2hhbGxvdyBlcXVhbGl0eS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7IGNvdW50OiAxLCBjb2xvcjogXCJyZWRcIiB9KTtcbiAgICogc3RhdGUuc2V0KFwiY291bnRcIiwgMik7IC8vIFN0YXRlIGlzIG5vdyB7IGNvdW50OiAyLCBjb2xvcjogXCJyZWRcIiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0ID0gPEsgZXh0ZW5kcyBrZXlvZiBTaGFwZT4oa2V5OiBLLCB2YWx1ZTogU2hhcGVbS10pOiB2b2lkID0+IHtcbiAgICAvLyBSZWplY3QgaWYgY3VycmVudGx5IGxvY2tlZFxuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWFsOiBQYXJ0aWFsPFNoYXBlPiA9IHt9O1xuICAgIHBhcnRpYWxba2V5XSA9IHZhbHVlO1xuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUocGFydGlhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBtdWx0aXBsZSBzdGF0ZWZ1bCBwcm9wZXJ0aWVzIGF0IG9uY2UsIGxlYXZpbmcgb21pdHRlZCBwcm9wZXJ0aWVzXG4gICAqIHVuY2hhbmdlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogUGF0Y2ggYSBwYXJ0aWFsIHN0YXRlLCB1cGRhdGluZyBhbGwgbGlzdGVkIHByb3BlcnRpZXMgYXQgb25jZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHtcbiAgICogICB3ZWF0aGVyOiBcInN1bm55XCIsXG4gICAqICAgdGVtcGVyYXR1cmU6IDMwLFxuICAgKiAgIGh1bWlkaXR5OiA3MCxcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIExlYXZlcyBgdGVtcGVyYXR1cmVgIHVuY2hhbmdlZFxuICAgKiBzdGF0ZS5wYXRjaCh7XG4gICAqICAgd2VhdGhlcjogXCJjbG91ZHlcIixcbiAgICogICBodW1pZGl0eTogNTAsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHBhdGNoID0gKHBhdGNoOiBQYXJ0aWFsPFNoYXBlPik6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUocGF0Y2gpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGdWxseSByZXBsYWNlIHRoZSBjdXJyZW50IHN0YXRlIGRhdGEgYW5kIGZvcmNlIGxpc3RlbmVycyB0byByZWNlaXZlIHRoZVxuICAgKiB1cGRhdGVkIGRhdGEgaW1tZWRpYXRlbHkuXG4gICAqL1xuICByZXBsYWNlID0gKHN0YXRlOiBTaGFwZSk6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YSA9IHN0YXRlO1xuICAgIHRoaXMuX2VtaXQodGhpcy5fZGF0YSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIExvY2sgdGhpcyBTdGF0ZSBpbnN0YW5jZSwgcHJldmVudGluZyBmdXJ0aGVyIGV4dGVybmFsIGNoYW5nZXNcbiAgICovXG4gIGxvY2sgPSAoKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNMb2NrZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmxvY2sgdGhpcyBTdGF0ZSBpbnN0YW5jZSwgYWxsb3dpbmcgZnVydGhlciBleHRlcm5hbCBjaGFuZ2VzXG4gICAqL1xuICB1bmxvY2sgPSAoKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICB0aGlzLl9pc0xvY2tlZCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBcHBseSBjb21wbGV4IHVwZGF0ZXMgdG8gdGhlIHN0YXRlIHVzaW5nIGEgbXV0YXRvciBmdW5jdGlvbi5cbiAgICpcbiAgICogVGhlIG11dGF0b3IgZnVuY3Rpb24gdGFrZXMgb25lIHBhcmFtZXRlciB3aGljaCBpcyBhIHN0cnVjdHVyZWRDbG9uZSBjb3B5IG9mXG4gICAqIHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC4gV2hhdGV2ZXIgaXMgcmV0dXJuZWQgYnkgdGhlIG11dGF0b3IgaXMgdGhlblxuICAgKiBwYXRjaGVkIGluIHRvIHRoZSBzdGF0ZS5cbiAgICovXG4gIG11dGF0ZSA9IChtdXRhdG9yOiAoY3VycmVudDogU2hhcGUpID0+IFNoYXBlKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUobXV0YXRvcih0aGlzLnNuYXBzaG90KCkpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUGVyZm9ybSBhbiBhc3luYyBtdXRhdGlvbiBvZiB0aGUgc3RhdGUsIG9wdGlvbmFsbHkgbG9ja2luZyB0aGUgc3RhdGUgZHVyaW5nXG4gICAqIHRoZSBwcm9jZXNzLlxuICAgKiBAcGFyYW0gbXV0YXRvciBBIGZ1bmN0aW9uIHRvIG11dGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXcgc3RhdGVcbiAgICogQHBhcmFtIGxvY2sgSWYgYHRydWVgLCBsb2NrIHRoZSBzdGF0ZSB1bnRpbCB0aGUgbXV0YXRvciBjb21wbGV0ZXNcbiAgICovXG4gIG11dGF0ZUFzeW5jID0gYXN5bmMgKFxuICAgIG11dGF0b3I6IChjdXJyZW50OiBTaGFwZSkgPT4gUHJvbWlzZTxTaGFwZT4sXG4gICAgbG9jayA9IGZhbHNlLFxuICApOiBQcm9taXNlPFN0YXRlPFNoYXBlPj4gPT4ge1xuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICBpZiAobG9jaykge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG11dGF0aW9uUmVzdWx0ID0gYXdhaXQgbXV0YXRvcih0aGlzLnNuYXBzaG90KCkpO1xuICAgIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKG11dGF0aW9uUmVzdWx0KTtcblxuICAgIGlmIChsb2NrKSB7XG4gICAgICB0aGlzLl9pc0xvY2tlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgdHJhbnNhY3Rpb24tc3R5bGUgc2V0IG9mIGFjdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBmdW5jdGlvbi5cbiAgICpcbiAgICogVGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGNhbiBkbyBhbnl0aGluZywgYmV5b25kIGp1c3Qgc2V0dGluZyBzdGF0ZS4gQW55XG4gICAqIHVuY2F1Z2h0IGVycm9ycyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIGZ1bmN0aW9uIHdpbGwgY2F1c2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIHRvIGZhaWwgYW5kIHRoZSBzdGF0ZSB0byBhdXRvbWF0aWNhbGx5IHJvbGwgYmFjayB0byB0aGUgbGFzdCB2YWxpZCBzdGF0ZS5cbiAgICpcbiAgICogRHVyaW5nIGEgdHJhbnNhY3Rpb24sIHRoaXMgc3RhdGUgaW5zdGFuY2Ugd2lsbCBiZSBsb2NrZWQsIHByZXZlbnRpbmcgb3RoZXJcbiAgICogY2hhbmdlcy5cbiAgICpcbiAgICogVHJhbnNhY3Rpb25zIHdpbGwgYWx3YXlzIHJlc3VsdCBpbiBhIHN0YXRlIHVwZGF0ZSB3aGVuIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFRyYW5zYWN0aW9ucyB3aXRoIGxvY2tpbmcgYW5kIHJvbGxiYWNrIHN1cHBvcnRcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7Y291bnQ6IDF9KTtcbiAgICpcbiAgICogc3RhdGUudHJhbnNhY3Rpb24oYXN5bmMgKHMpID0+IHtcbiAgICogICAvLyBgc2AgaXMgYSBmdWxsIFN0YXRlIG9iamVjdCB5b3UgY2FuIHNhZmVseSBtYW5pcHVsYXRlXG4gICAqICAgcy5zZXQoXCJjb3VudFwiLCAxMCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqXG4gICAqIC8vIEVycm9ycyBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uIHJvbGwgYmFjayB0aGUgc3RhdGVcbiAgICogc3RhdGUudHJhbnNhY3Rpb24oYXN5bmMgKHMpID0+IHtcbiAgICogICBzLnNldChcImNvdW50XCIsIDEwMCk7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqL1xuICB0cmFuc2FjdGlvbiA9IChmbjogKHN0YXRlOiBTdGF0ZTxTaGFwZT4pID0+IHZvaWQpOiBib29sZWFuID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgLy8gTG9jayBvdXRzaWRlIG9mIHRoZSB0cnkvY2F0Y2ggdG8gdGhyb3cgaW1tZWRpYXRlbHksIHNlcGFyYXRpbmcgdGhlXG4gICAgLy8gdHJhbnNhY3Rpb24gZnVuY3Rpb24gZXJyb3IgZnJvbSB0aGUgYWN0dWFsIGNhbGwgc2l0ZSBlcnJvcnNcbiAgICB0aGlzLl9pc0xvY2tlZCA9IHRydWU7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHN0YXRlIG9iamVjdCB0byB1c2Ugd2l0aGluIHRoZSB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25TdGF0ZSA9IG5ldyBTdGF0ZTxTaGFwZT4odGhpcy5zbmFwc2hvdCgpKTtcblxuICAgICAgLy8gUnVuIHRoZSB0cmFuc2FjdGlvbiBpdHNlbGZcbiAgICAgIGZuKHRyYW5zYWN0aW9uU3RhdGUpO1xuXG4gICAgICAvLyBBZG9wdCB0aGUgcmVzdWx0aW5nIHN0YXRlIG9mIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZSh0cmFuc2FjdGlvblN0YXRlLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbU3RhdGVdIFRyYW5zYWN0aW9uIGZhaWxlZCBkdWUgdG8gY2F1Z2h0IGVycm9yXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogUGVyZm9ybSBhIHRyYW5zYWN0aW9uLXN0eWxlIHNldCBvZiBhY3Rpb25zIGRlZmluZWQgd2l0aGluIGFuIGFzeW5jIGZ1bmN0aW9uXG4gICAqXG4gICAqIFRoZSBwcm92aWRlZCBmdW5jdGlvbiBjYW4gZG8gYW55dGhpbmcsIGJleW9uZCBqdXN0IHNldHRpbmcgc3RhdGUuIEFueVxuICAgKiB1bmNhdWdodCBlcnJvcnMgdGhyb3duIGZyb20gd2l0aGluIHRoZSBmdW5jdGlvbiB3aWxsIGNhdXNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiB0byBmYWlsIGFuZCB0aGUgc3RhdGUgdG8gYXV0b21hdGljYWxseSByb2xsIGJhY2sgdG8gdGhlIGxhc3QgdmFsaWQgc3RhdGUuXG4gICAqXG4gICAqIER1cmluZyBhIHRyYW5zYWN0aW9uLCB0aGlzIHN0YXRlIGluc3RhbmNlIHdpbGwgYmUgbG9ja2VkLCBwcmV2ZW50aW5nIG90aGVyXG4gICAqIGNoYW5nZXMuXG4gICAqXG4gICAqIFRyYW5zYWN0aW9ucyB3aWxsIGFsd2F5cyByZXN1bHQgaW4gYSBzdGF0ZSB1cGRhdGUgd2hlbiBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBUcmFuc2FjdGlvbnMgd2l0aCBsb2NraW5nIGFuZCByb2xsYmFjayBzdXBwb3J0XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoe2NvdW50OiAxfSk7XG4gICAqXG4gICAqIC8vIEF3YWl0aW5nIHRoZSByZXN1bHQgb2YgYSB0cmFuc2FjdGlvblxuICAgKiBhd2FpdCBzdGF0ZS50cmFuc2FjdGlvbkFzeW5jKGFzeW5jIChzKSA9PiB7XG4gICAqICAgLy8gYHNgIGlzIGEgZnVsbCBTdGF0ZSBvYmplY3QgeW91IGNhbiBzYWZlbHkgbWFuaXB1bGF0ZVxuICAgKiAgIHMuc2V0KFwiY291bnRcIiwgMTApO1xuICAgKiB9KTtcbiAgICogc3RhdGUuZ2V0KFwiY291bnRcIik7IC8vID0+IDEwO1xuICAgKlxuICAgKiAvLyBFcnJvcnMgaW5zaWRlIHRoZSB0cmFuc2FjdGlvbiByb2xsIGJhY2sgdGhlIHN0YXRlXG4gICAqIGF3YWl0IHN0YXRlLnRyYW5zYWN0aW9uQXN5bmMoYXN5bmMgKHMpID0+IHtcbiAgICogICBzLnNldChcImNvdW50XCIsIDEwMCk7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqXG4gICAqIC8vIElmIHlvdSBmb3JnZXQgdG8gYXdhaXQgdGhlIHRyYW5zYWN0aW9uLCBpdHMgc3RpbGwgbG9ja2VkXG4gICAqIHN0YXRlLnRyYW5zYWN0aW9uQXN5bmMoYXN5bmMgKHMpID0+IHtcbiAgICogICBhd2FpdCB3YWl0U2Vjb25kcygxKTtcbiAgICogfSk7XG4gICAqIHN0YXRlLnNldChcImNvdW50XCIsIDEpOyAvLyBFcnJvcjogU3RhdGUgaXMgbG9ja2VkIVxuICAgKiBgYGBcbiAgICovXG4gIHRyYW5zYWN0aW9uQXN5bmMgPSBhc3luYyAoXG4gICAgZm46IChzdGF0ZTogU3RhdGU8U2hhcGU+KSA9PiBQcm9taXNlPHZvaWQ+LFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgLy8gTG9jayBvdXRzaWRlIG9mIHRoZSB0cnkvY2F0Y2ggdG8gdGhyb3cgaW1tZWRpYXRlbHksIHNlcGFyYXRpbmcgdGhlXG4gICAgLy8gdHJhbnNhY3Rpb24gZnVuY3Rpb24gZXJyb3IgZnJvbSB0aGUgYWN0dWFsIGNhbGwgc2l0ZSBlcnJvcnNcbiAgICB0aGlzLl9pc0xvY2tlZCA9IHRydWU7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHN0YXRlIG9iamVjdCB0byB1c2Ugd2l0aGluIHRoZSB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25TdGF0ZSA9IG5ldyBTdGF0ZTxTaGFwZT4odGhpcy5zbmFwc2hvdCgpKTtcblxuICAgICAgLy8gUnVuIHRoZSB0cmFuc2FjdGlvbiBpdHNlbGZcbiAgICAgIGF3YWl0IGZuKHRyYW5zYWN0aW9uU3RhdGUpO1xuXG4gICAgICAvLyBBZG9wdCB0aGUgcmVzdWx0aW5nIHN0YXRlIG9mIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZSh0cmFuc2FjdGlvblN0YXRlLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbU3RhdGVdIFRyYW5zYWN0aW9uIGZhaWxlZCBkdWUgdG8gY2F1Z2h0IGVycm9yXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgQ2hhckNvZGVzIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgdHlwZSB7IFBhcnNlZE5vdGF0aW9uIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBtYXRjaGVzIHRoZSBcImJvdW5kIGF0dHJpYnV0ZVwiIHN5bnRheFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpc0JvdW5kQXR0cmlidXRlKFwiOmNsYXNzXCIpIC8vIHRydWVcbiAqIGlzQm91bmRBdHRyaWJ1dGUoXCI6OmNsYXNzXCIpIC8vIGZhbHNlXG4gKiBpc0JvdW5kQXR0cmlidXRlKFwiY2xhc3NcIikgLy8gZmFsc2VcbiAqIGBgYFxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGZ1bmN0aW9uIHVzZXMgbG9vcHMgYW5kIGNoYXJhY3RlciBjb2RlIGNoZWNrcyBpbnN0ZWFkIG9mIGEgcmVnZXggdG9cbiAqIG9wdGltaXplIGZvciBob3QgcGF0aHMgZHVyaW5nIGluaXRpYWwgcGFyc2luZyBhbmQgcmVuZGVyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCb3VuZEF0dHJpYnV0ZShhdHRyTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChhdHRyTmFtZVswXSAhPT0gXCI6XCIgfHwgYXR0ck5hbWUubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXR0ck5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBFbnN1cmUgdGhlIGNoYXJhY3RlciBjb2RlIGlzIGEgbGV0dGVyIG9yIGh5cGhlblxuICAgIGNvbnN0IGNoYXIgPSBhdHRyTmFtZS5jaGFyQ29kZUF0KGkpO1xuXG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgY2hhciA9PT0gQ2hhckNvZGVzLkh5cGhlbiB8fFxuICAgICAgICAoY2hhciA+PSBDaGFyQ29kZXMuQSAmJiBjaGFyIDw9IENoYXJDb2Rlcy5aKSB8fFxuICAgICAgICAoY2hhciA+PSBDaGFyQ29kZXMuYSAmJiBjaGFyIDw9IENoYXJDb2Rlcy56KVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBlbnVtIE5vdGF0aW9uUHJlZml4IHtcbiAgQXR0cmlidXRlcyA9IFwiQFwiLFxuICBTdGF0ZSA9IFwiJFwiLFxuICBEYXRhID0gXCIqXCIsXG4gIEl0ZW0gPSBcIiNcIixcbn1cblxuY29uc3QgUFJFRklYX01BUFBJTkc6IFJlY29yZDxOb3RhdGlvblByZWZpeCwgc3RyaW5nPiA9IHtcbiAgW05vdGF0aW9uUHJlZml4LkF0dHJpYnV0ZXNdOiBcImF0dHJcIixcbiAgW05vdGF0aW9uUHJlZml4LlN0YXRlXTogXCJzdGF0ZVwiLFxuICBbTm90YXRpb25QcmVmaXguRGF0YV06IFwiZGF0YVwiLFxuICBbTm90YXRpb25QcmVmaXguSXRlbV06IFwiaXRlbVwiLFxufTtcblxuY29uc3QgcHJlZml4TWFwcGluZyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoUFJFRklYX01BUFBJTkcpKTtcblxuLyoqXG4gKiBQYXJzZSBhIG5vdGF0aW9uIGludG8gYW4gb2JqZWN0IHdpdGggcnVudGltZSBpbmZvcm1hdGlvblxuICpcbiAqIEByZW1hcmtzXG4gKiBGb3VyIG5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkOlxuICpcbiAqIC0gYEBhdHRybmFtZWAgLT4gUm9vdCBlbGVtZW50IGF0dHJpYnV0ZXNcbiAqIC0gYCRzdGF0ZXZhbHVlYCAtPiBTdGF0ZWZ1bCBjb250ZW50XG4gKiAtIGAqcHJvcGVydHkub3Iud2hhdGV2ZXJgIC0+IENvbXB1dGVkIGRhdGEgcHJvcGVydGllc1xuICogLSBgI2NvbG9yYCAtPiBMaXN0IGl0ZW0gcHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOb3RhdGlvbihub3RhdGlvbjogc3RyaW5nKTogUGFyc2VkTm90YXRpb24ge1xuICAvLyBDaGVjayBmb3IgcHJlZml4IG1vZGlmaWVyc1xuICBsZXQgbm90TW9kaWZpZXIgPSBmYWxzZTtcblxuICBsZXQgcGF0aFBhcnQgPSBcIlwiO1xuICBjb25zdCBjb21wdXRlZFBhdGg6IHN0cmluZ1tdID0gW107XG5cbiAgbGV0IGlzRmlyc3QgPSB0cnVlO1xuICBmb3IgKGNvbnN0IGNoYXIgb2Ygbm90YXRpb24pIHtcbiAgICAvLyAhIGF0IHBvc2l0aW9uIDAgLT4gRW5hYmxlIE5PVCBtb2RpZmllciwgZG9udCBjb3VudCB0b3dhcmRzIGlkeFxuICAgIGlmIChpc0ZpcnN0ICYmIGNoYXIgPT09IFwiIVwiKSB7XG4gICAgICBub3RNb2RpZmllciA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBwb3NpdGlvbiAwIG11c3QgYmUgYSBwcmVmaXhcbiAgICBlbHNlIGlmIChpc0ZpcnN0KSB7XG4gICAgICBjb25zdCBwcmVmaXggPSBwcmVmaXhNYXBwaW5nLmdldChjaGFyKTtcblxuICAgICAgaWYgKCFwcmVmaXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiwgbm90YXRpb24pO1xuICAgICAgfVxuXG4gICAgICBjb21wdXRlZFBhdGgucHVzaChwcmVmaXgpO1xuICAgICAgaXNGaXJzdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3QgY2hhcmFjdGVycyBhbmQgcHVzaCB3aGVuIGhpdHRpbmcgYSBkb3Qgb3IgZW5kXG4gICAgZWxzZSBpZiAoY2hhciA9PT0gXCIuXCIpIHtcbiAgICAgIGlmIChwYXRoUGFydC5sZW5ndGgpIHtcbiAgICAgICAgY29tcHV0ZWRQYXRoLnB1c2gocGF0aFBhcnQpO1xuICAgICAgICBwYXRoUGFydCA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OLCBub3RhdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhQYXJ0ICs9IGNoYXI7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHRoZSBmaW5hbCBwYXJ0IHdoaWNoIG11c3QgZXhpc3QgKG90aGVyd2lzZSwgaXQgZW5kZWQgaW4gYSBkb3QpXG4gIGlmICghcGF0aFBhcnQubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiwgbm90YXRpb24pO1xuICB9XG5cbiAgY29tcHV0ZWRQYXRoLnB1c2gocGF0aFBhcnQpO1xuXG4gIGlmIChjb21wdXRlZFBhdGgubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT04sIG5vdGF0aW9uKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmFzZTogbm90YXRpb24sXG4gICAgcGF0aDogY29tcHV0ZWRQYXRoLFxuICAgIG1vZGlmaWVyczogbm90TW9kaWZpZXIgPyB7IG5vdDogdHJ1ZSB9IDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG5leHBvcnQgdHlwZSBOb3RhdGlvbkFjY2Vzc29yID0gKHNvdXJjZTogdW5rbm93bikgPT4gdW5rbm93bjtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVmFsdWVBY2Nlc3Nvcihub3RhdGlvbjogUGFyc2VkTm90YXRpb24pOiBOb3RhdGlvbkFjY2Vzc29yIHtcbiAgY29uc3QgeyBwYXRoLCBtb2RpZmllcnMgfSA9IG5vdGF0aW9uO1xuXG4gIGlmIChwYXRoLmxlbmd0aCA8IDIpIHtcbiAgICAvLyBOb3RhdGlvbnMgbXVzdCBhbHdheXMgaGF2ZSBhdCBsZWFzdCAyIHBhcnRzOiB0aGUgbmFtZXNwYWNlLCBhbmQgYXQgbGVhc3RcbiAgICAvLyBvbmUgcHJvcGVydHkgbmFtZSBvbiB0aGUgbmFtZXNwYWNlIChleGFtcGxlOiBbXCJzdGF0ZVwiLCBcInZpc2libGVcIl0pXG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgfVxuXG4gIC8vIEZvciAyIGFuZCAzIGxlbmd0aCBwYXRocywgcHJlLWJha2UgYWNjZXNzb3JzIHRvIG9wdGltaXplIGZvciBjb21tb24gY2FzZXNcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgW2ZpcnN0S2V5LCBzZWNvbmRLZXldID0gcGF0aDtcblxuICAgIGlmIChmaXJzdEtleSA9PT0gdW5kZWZpbmVkIHx8IHNlY29uZEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IChzb3VyY2UgYXMgYW55KT8uW2ZpcnN0S2V5XT8uW3NlY29uZEtleV0gPz8gbnVsbDtcbiAgICAgIGlmIChtb2RpZmllcnM/Lm5vdCkge1xuICAgICAgICAvLyBBdHRyaWJ1dGUgdmFsdWVzIG11c3QgdHJlYXQgdGhlIGVtcHR5IHN0cmluZyBhcyB0cnV0aHkgcGVyIERPTSBydWxlc1xuICAgICAgICBpZiAoZmlyc3RLZXkgPT09IFwiYXR0clwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiICYmICF2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMykge1xuICAgIGNvbnN0IFtmaXJzdEtleSwgc2Vjb25kS2V5LCB0aGlyZEtleV0gPSBwYXRoO1xuXG4gICAgaWYgKFxuICAgICAgZmlyc3RLZXkgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgc2Vjb25kS2V5ID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXJkS2V5ID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2U6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgKHNvdXJjZSBhcyBhbnkpPy5bZmlyc3RLZXldPy5bc2Vjb25kS2V5XT8uW3RoaXJkS2V5XSA/PyBudWxsO1xuICAgICAgaWYgKG1vZGlmaWVycz8ubm90KSB7XG4gICAgICAgIGlmIChmaXJzdEtleSA9PT0gXCJhdHRyXCIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IFwiXCIgJiYgIXZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICF2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgLy8gRm9yIGxvbmdlciBwYXRocywgb3B0IGZvciBhIHByZS1idWlsdCBsb29wXG4gIHJldHVybiAoc291cmNlOiB1bmtub3duKSA9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSBzb3VyY2U7XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aCkge1xuICAgICAgaWYgKCFjdXJyZW50IHx8IHR5cGVvZiBjdXJyZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0IGFzIGtleW9mIHR5cGVvZiBjdXJyZW50XTtcbiAgICB9XG5cbiAgICBpZiAobW9kaWZpZXJzPy5ub3QpIHtcbiAgICAgIGlmIChwYXRoWzBdID09PSBcImF0dHJcIikge1xuICAgICAgICByZXR1cm4gY3VycmVudCAhPT0gXCJcIiAmJiAhY3VycmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhY3VycmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQge1xuICBidWlsZFZhbHVlQWNjZXNzb3IsXG4gIGlzQm91bmRBdHRyaWJ1dGUsXG4gIHR5cGUgTm90YXRpb25BY2Nlc3NvcixcbiAgcGFyc2VOb3RhdGlvbixcbn0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQge1xuICB0eXBlIEFueVJlbmRlclBsYW4sXG4gIHR5cGUgQW55U2NoZW1lLFxuICB0eXBlIEF0dHJpYnV0ZVVwZGF0ZVBsYW4sXG4gIHR5cGUgQXR0cmlidXRlVXBkYXRlU2NoZW1lLFxuICB0eXBlIENvbXBpbGVkVGVtcGxhdGUsXG4gIHR5cGUgQ29udGVudFN3YXBQbGFuLFxuICB0eXBlIENvbnRlbnRTd2FwU2NoZW1lLFxuICBEaXJlY3RpdmUsXG4gIHR5cGUgTGlzdFJlbmRlclBsYW4sXG4gIHR5cGUgTGlzdFJlbmRlclNjaGVtZSxcbiAgdHlwZSBQYXJzZWROb3RhdGlvbixcbiAgdHlwZSBQcmVwYXJlZFRlbXBsYXRlLFxuICB0eXBlIFRhZ0NoYW5nZVBsYW4sXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IFJFRl9BVFRSID0gXCJkYXRhLW5vZGUtcmVmXCI7XG5cbmZ1bmN0aW9uIGNvbGxlY3RPcGVyYWJsZU5vZGVzKGZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KTogSFRNTEVsZW1lbnRbXSB7XG4gIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZnJhZ21lbnQsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgY29uc3Qga25vd25JZ25vcmVzID0gbmV3IFNldDxOb2RlPigpO1xuICBjb25zdCBub2RlczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gIGxldCBjdXJyZW50Tm9kZTogTm9kZSB8IG51bGwgPSB3YWxrZXIubmV4dE5vZGUoKTtcblxuICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICBpZiAoIShjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgY3VycmVudE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCBwYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIGxldCBpc0luTGlzdCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHBhcmVudCAmJiAhaXNJbkxpc3QpIHtcbiAgICAgIGlmIChcbiAgICAgICAga25vd25JZ25vcmVzLmhhcyhwYXJlbnQpIHx8XG4gICAgICAgIChwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBwYXJlbnQuaGFzQXR0cmlidXRlKERpcmVjdGl2ZS5FYWNoKSlcbiAgICAgICkge1xuICAgICAgICBpc0luTGlzdCA9IHRydWU7XG4gICAgICAgIGtub3duSWdub3Jlcy5hZGQoY3VycmVudE5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0luTGlzdCkge1xuICAgICAgbm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgfVxuXG4gICAgY3VycmVudE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgfVxuXG4gIHJldHVybiBub2Rlcztcbn1cblxuLyoqXG4gKiBDb21waWxlIGFuIHtAbGluayBIVE1MVGVtcGxhdGVFbGVtZW50fSBpbnRvIGEge0BsaW5rIENvbXBpbGVkVGVtcGxhdGV9IGZvclxuICogY2FjaGluZywgY2xvbmluZywgb3Igc3RvcmFnZS5cbiAqXG4gKiBDb21waWxlZCB0ZW1wbGF0ZSBvYmplY3RzIGNvbnRhaW4gYSBKU09OLXNlcmlhbGl6YWJsZSBkYXRhIHJlcHJlc2VudGF0aW9uIG9mXG4gKiBhIHRlbXBsYXRlIGFuZCBjYW4gYmUgcHJlcGFyZWQgdXNpbmcge0BsaW5rIHByZXBhcmVDb21waWxlZFRlbXBsYXRlfSB0b1xuICogY3JlYXRlIG5ldyBUZW1wbGF0ZSBpbnN0YW5jZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb21waWxlZCA9IGNvbXBpbGVUZW1wbGF0ZSgkdGVtcGxhdGVFbGVtZW50KTtcbiAqIGNvbnN0IHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkoY29tcGlsZWQpOyAvLyBhIEpTT04gdGVtcGxhdGUgYnVuZGxlXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVUZW1wbGF0ZShzb3VyY2U6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpOiBDb21waWxlZFRlbXBsYXRlIHtcbiAgY29uc3QgcGFyc2VkTm90YXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFBhcnNlZE5vdGF0aW9uPigpO1xuICBjb25zdCBzY2hlbWVzOiBBbnlTY2hlbWVbXSA9IFtdO1xuICBsZXQgZWxlbWVudElkID0gMDtcblxuICBjb25zdCBlbnN1cmVOb2RlUmVmID0gKGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyA9PiB7XG4gICAgbGV0IHJlZiA9IGVsLmdldEF0dHJpYnV0ZShSRUZfQVRUUik7XG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIHJlZiA9IGBlbC0ke2VsZW1lbnRJZCsrfWA7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUkVGX0FUVFIsIHJlZik7XG4gICAgfVxuICAgIHJldHVybiByZWY7XG4gIH07XG5cbiAgY29uc3QgY2xvbmVkVGVtcGxhdGVFbGVtZW50ID0gc291cmNlLmNvbnRlbnQuY2xvbmVOb2RlKFxuICAgIHRydWUsXG4gICkgYXMgRG9jdW1lbnRGcmFnbWVudDtcblxuICBjb25zdCBub2RlczogSFRNTEVsZW1lbnRbXSA9IGNvbGxlY3RPcGVyYWJsZU5vZGVzKGNsb25lZFRlbXBsYXRlRWxlbWVudCk7XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgYXR0cmlidXRlcyBvbiB0aGlzIG5vZGVcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBub2RlLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGF0dHJpYnV0ZXMuc2V0KG5hbWUsIG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZGlyZWN0aXZlIGF0dHJpYnV0ZXNcbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZV0gb2YgYXR0cmlidXRlcykge1xuICAgICAgLy8gQmFpbCBxdWlja2x5IGlmIHRoaXMgaXNuJ3QgYSBkaXJlY3RpdmVcbiAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSA9PT0gbnVsbCB8fCBhdHRyaWJ1dGVOYW1lWzBdICE9PSBcIjpcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIG5vdGF0aW9uIGhhcyBiZWVuIHBhcnNlZCBiZWZvcmUsIHJldXNlIHRoYXRcbiAgICAgIGxldCBub3RhdGlvbiA9IHBhcnNlZE5vdGF0aW9ucy5nZXQoYXR0cmlidXRlVmFsdWUpO1xuXG4gICAgICBpZiAobm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBub3RhdGlvbiA9IHBhcnNlTm90YXRpb24oYXR0cmlidXRlVmFsdWUpO1xuICAgICAgICBwYXJzZWROb3RhdGlvbnMuc2V0KGF0dHJpYnV0ZVZhbHVlLCBub3RhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAvLyA6OmtleSBpcyBoYW5kbGVkIGluIHRoZSA6OmVhY2ggcm91dGVcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuS2V5KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUQUcgQ0hBTkdFIFNDSEVNRVNcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuVGFnKSB7XG4gICAgICAgIHNjaGVtZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJ0YWdcIixcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBub2RlUmVmOiBlbnN1cmVOb2RlUmVmKG5vZGUpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTElTVCBSRU5ERVIgU0NIRU1FU1xuICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZSA9PT0gRGlyZWN0aXZlLkVhY2gpIHtcbiAgICAgICAgY29uc3Qgbm9kZVJlZiA9IGVuc3VyZU5vZGVSZWYobm9kZSk7XG5cbiAgICAgICAgLy8gQSA6OmtleSBkaXJlY3RpdmUgaXMgcmVxdWlyZWQgd2l0aCBhbnkgOjplYWNoXG4gICAgICAgIGNvbnN0IGtleU5vdGF0aW9uID0gbm9kZS5nZXRBdHRyaWJ1dGUoRGlyZWN0aXZlLktleSk7XG4gICAgICAgIGlmIChrZXlOb3RhdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoRGlyZWN0aXZlLktleSk7XG5cbiAgICAgICAgY29uc3QgbGlzdENvbnRlbnRIdG1sID0gbm9kZS5pbm5lckhUTUw7XG5cbiAgICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjaGVtZTogTGlzdFJlbmRlclNjaGVtZSA9IHtcbiAgICAgICAgICB0eXBlOiBcImVhY2hcIixcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBrZXlOb3RhdGlvbjogcGFyc2VOb3RhdGlvbihrZXlOb3RhdGlvbiksXG4gICAgICAgICAgbm9kZVJlZixcbiAgICAgICAgICBsaXN0Q29udGVudEh0bWwsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2NoZW1lcy5wdXNoKHNjaGVtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENPTlRFTlQgU1dBUCBTQ0hFTUVTXG4gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuU3dhcCkge1xuICAgICAgICBjb25zdCBzY2hlbWU6IENvbnRlbnRTd2FwU2NoZW1lID0ge1xuICAgICAgICAgIHR5cGU6IFwic3dhcFwiLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIG5vZGVSZWY6IGVuc3VyZU5vZGVSZWYobm9kZSksXG4gICAgICAgIH07XG5cbiAgICAgICAgc2NoZW1lcy5wdXNoKHNjaGVtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFUVFJJQlVURSBVUERBVEUgU0NIRU1FU1xuICAgICAgZWxzZSBpZiAoaXNCb3VuZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICBjb25zdCBiaW5kTmFtZSA9IGF0dHJpYnV0ZU5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgY29uc3Qgc2NoZW1lOiBBdHRyaWJ1dGVVcGRhdGVTY2hlbWUgPSB7XG4gICAgICAgICAgdHlwZTogXCJhdHRyXCIsXG4gICAgICAgICAgbm90YXRpb24sXG4gICAgICAgICAgYXR0cmlidXRlOiBiaW5kTmFtZSxcbiAgICAgICAgICBub2RlUmVmOiBlbnN1cmVOb2RlUmVmKG5vZGUpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNjaGVtZXMucHVzaChzY2hlbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFRlbXBsYXRlOiAke2F0dHJpYnV0ZU5hbWV9IGlzIG5vdCBhIHZhbGlkIGRpcmVjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgbm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWROb3RhdGlvbj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgcGFyc2VkTm90YXRpb25zKSB7XG4gICAgbm90YXRpb25zW2tleV0gPSB2YWw7XG4gIH1cblxuICBjb25zdCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgdGVtcC5hcHBlbmRDaGlsZChjbG9uZWRUZW1wbGF0ZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgY29uc3QgaHRtbCA9IHRlbXAuaW5uZXJIVE1MO1xuXG4gIGNvbnN0IGNvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlID0ge1xuICAgIGh0bWwsXG4gICAgc2NoZW1lcyxcbiAgICBub3RhdGlvbnMsXG4gIH07XG5cbiAgcmV0dXJuIGNvbXBpbGVkO1xufVxuXG4vKipcbiAqIEdpdmVuIGEge0BsaW5rIENvbXBpbGVkVGVtcGxhdGV9IHN0cnVjdHVyZSwgcmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIHRoZVxuICogZGF0YSBuZWVkZWQgdG8gY3JlYXRlIG5ldyBUZW1wbGF0ZSBpbnN0YW5jZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb21waWxlZFRlbXBsYXRlID0gZ2V0Q29tcGlsZWRUZW1wbGF0ZUpTT04oKTtcbiAqIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29tcGlsZWRUZW1wbGF0ZSk7XG4gKiBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVDb21waWxlZFRlbXBsYXRlKHBhcnNlZCk7XG4gKlxuICogLy8gRWxzZXdoZXJlLi4uXG4gKlxuICogY29uc3QgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocHJlcGFyZWQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZShcbiAgY29tcGlsZWQ6IENvbXBpbGVkVGVtcGxhdGUsXG4gIHByb3RvdHlwZUZyYWdtZW50PzogRG9jdW1lbnRGcmFnbWVudCxcbik6IFByZXBhcmVkVGVtcGxhdGUge1xuICBjb25zdCBwbGFuc0J5Tm90YXRpb246IE1hcDxzdHJpbmcsIFNldDxBbnlSZW5kZXJQbGFuPj4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG5vdGF0aW9uQWNjZXNzb3JzOiBNYXA8c3RyaW5nLCBOb3RhdGlvbkFjY2Vzc29yPiA9IG5ldyBNYXAoKTtcbiAgY29uc3Qgbm9kZVJlZnM6IE1hcDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IFtub3RhdGlvbiwgcGFyc2VkXSBvZiBPYmplY3QuZW50cmllcyhjb21waWxlZC5ub3RhdGlvbnMpKSB7XG4gICAgbm90YXRpb25BY2Nlc3NvcnMuc2V0KG5vdGF0aW9uLCBidWlsZFZhbHVlQWNjZXNzb3IocGFyc2VkKSk7XG4gIH1cblxuICBjb25zdCBmcmFnbWVudCA9IHByb3RvdHlwZUZyYWdtZW50ID8/IGh0bWxUb0ZyYWdtZW50KGNvbXBpbGVkLmh0bWwpO1xuXG4gIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZnJhZ21lbnQsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCB7XG4gICAgYWNjZXB0Tm9kZShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5vZGUuaGFzQXR0cmlidXRlKFJFRl9BVFRSKVxuICAgICAgICA/IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVFxuICAgICAgICA6IE5vZGVGaWx0ZXIuRklMVEVSX1NLSVA7XG4gICAgfSxcbiAgfSk7XG5cbiAgbGV0IG1hcmtOb2RlOiBOb2RlIHwgbnVsbCA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuXG4gIHdoaWxlIChtYXJrTm9kZSkge1xuICAgIGlmICghKG1hcmtOb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWYgPSBtYXJrTm9kZS5nZXRBdHRyaWJ1dGUoUkVGX0FUVFIpO1xuXG4gICAgaWYgKHJlZiA9PT0gbnVsbCkge1xuICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiBpbiBwcmFjdGljZSwgYXMgdGhlIHRyZWUgd2Fsa2VyIG9ubHkgc3VyZmFjZXNcbiAgICAgIC8vIGVsZW1lbnRzIHdpdGggYW4gZXh0YW50IG5vZGUgcmVmIGF0dHJpYnV0ZVxuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgICB9XG5cbiAgICBub2RlUmVmcy5zZXQocmVmLCBtYXJrTm9kZSk7XG4gICAgbWFya05vZGUucmVtb3ZlQXR0cmlidXRlKFJFRl9BVFRSKTtcbiAgICBtYXJrTm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuICB9XG5cbiAgY29uc3QgYXNzb2NpYXRlUGxhbiA9IChwbGFuOiBBbnlSZW5kZXJQbGFuLCBub3RhdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgbGV0IG5vdGF0aW9uUGxhbnMgPSBwbGFuc0J5Tm90YXRpb24uZ2V0KG5vdGF0aW9uKTtcbiAgICBpZiAoIW5vdGF0aW9uUGxhbnMpIHtcbiAgICAgIG5vdGF0aW9uUGxhbnMgPSBuZXcgU2V0KCk7XG4gICAgICBwbGFuc0J5Tm90YXRpb24uc2V0KG5vdGF0aW9uLCBub3RhdGlvblBsYW5zKTtcbiAgICB9XG4gICAgbm90YXRpb25QbGFucy5hZGQocGxhbik7XG4gIH07XG5cbiAgY29uc3QgZ2V0QnlOb2RlUmVmID0gKG5vZGVSZWY6IHN0cmluZyk6IEhUTUxFbGVtZW50ID0+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBub2RlUmVmcy5nZXQobm9kZVJlZik7XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9ERV9SRUYpO1xuICB9O1xuXG4gIGZvciAoY29uc3Qgc2NoZW1lIG9mIGNvbXBpbGVkLnNjaGVtZXMpIHtcbiAgICAvLyBIeWRyYXRlIExpc3Qgc2NoZW1lcyBpbnRvIExpc3QgcGxhbnNcbiAgICBpZiAoc2NoZW1lLnR5cGUgPT09IFwiZWFjaFwiKSB7XG4gICAgICBjb25zdCBpdGVtUHJvdG90eXBlID0gZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKTtcbiAgICAgIGNvbnN0IGxpc3RDb250YWluZXIgPSBpdGVtUHJvdG90eXBlLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgIGlmICghbGlzdENvbnRhaW5lcikge1xuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9NSVNTSU5HX0xJU1RfUEFSRU5UKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGxpc3Qgc3RhcnQvZW5kIG1hcmtlcnNcbiAgICAgIGNvbnN0IHN0YXJ0TWFya2VyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcImxpc3Qtc3RhcnRcIik7XG4gICAgICBjb25zdCBlbmRNYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwibGlzdC1lbmRcIik7XG5cbiAgICAgIGxpc3RDb250YWluZXIuaW5zZXJ0QmVmb3JlKHN0YXJ0TWFya2VyLCBpdGVtUHJvdG90eXBlKTtcbiAgICAgIGxpc3RDb250YWluZXIuaW5zZXJ0QmVmb3JlKGVuZE1hcmtlciwgaXRlbVByb3RvdHlwZS5uZXh0U2libGluZyk7XG5cbiAgICAgIC8vIFNoYWxsb3cgY29weSBvZiB0aGUgcm93IHJvb3RcbiAgICAgIGNvbnN0IHJvd1Jvb3RFbGVtZW50ID0gaXRlbVByb3RvdHlwZS5jbG9uZU5vZGUoZmFsc2UpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAvLyBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgcm93IGludG8gYSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGVDb250ZW50RnJhZ21lbnQgPSBodG1sVG9GcmFnbWVudChzY2hlbWUubGlzdENvbnRlbnRIdG1sKTtcbiAgICAgIGNvbnN0IHJvd1RlbXBsYXRlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICAgIHJvd1RlbXBsYXRlRWxlbWVudC5jb250ZW50LmFwcGVuZENoaWxkKHRlbXBsYXRlQ29udGVudEZyYWdtZW50KTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBvcmlnaW5hbCByb290IHByb3RvdHlwZSBzaW5jZSB3ZSB3aWxsIGJlIHJlbmRlcmluZyBuZXcgaXRlbXNcbiAgICAgIGl0ZW1Qcm90b3R5cGUucmVtb3ZlKCk7XG5cbiAgICAgIGNvbnN0IHBsYW46IExpc3RSZW5kZXJQbGFuID0ge1xuICAgICAgICB0eXBlOiBcImVhY2hcIixcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAga2V5Tm90YXRpb246IHNjaGVtZS5rZXlOb3RhdGlvbixcbiAgICAgICAgbGlzdENvbnRhaW5lckVsZW1lbnQ6IGxpc3RDb250YWluZXIsXG4gICAgICAgIHJvd1RlbXBsYXRlRWxlbWVudCxcbiAgICAgICAgcm93Um9vdEVsZW1lbnQsXG4gICAgICAgIHN0YXJ0TWFya2VyLFxuICAgICAgICBlbmRNYXJrZXIsXG4gICAgICAgIHJvd1RlbXBsYXRlc0J5Um9vdDogbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgcm93Um9vdHNCeUtleTogbmV3IE1hcCgpLFxuICAgICAgfTtcblxuICAgICAgYXNzb2NpYXRlUGxhbihwbGFuLCBzY2hlbWUubm90YXRpb24uYmFzZSk7XG4gICAgfVxuICAgIC8vIEh5ZHJhdGUgU3dhcCBzY2hlbWVzIGludG8gU3dhcCBwbGFuc1xuICAgIGVsc2UgaWYgKHNjaGVtZS50eXBlID09PSBcInN3YXBcIikge1xuICAgICAgY29uc3QgcGxhbjogQ29udGVudFN3YXBQbGFuID0ge1xuICAgICAgICB0eXBlOiBcInN3YXBcIixcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAgbm9kZTogZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKSxcbiAgICAgIH07XG5cbiAgICAgIGFzc29jaWF0ZVBsYW4ocGxhbiwgc2NoZW1lLm5vdGF0aW9uLmJhc2UpO1xuICAgIH1cblxuICAgIC8vIEh5ZHJhdGUgVGFnIGNoYW5nZSBwbGFuc1xuICAgIGVsc2UgaWYgKHNjaGVtZS50eXBlID09PSBcInRhZ1wiKSB7XG4gICAgICBjb25zdCBwbGFuOiBUYWdDaGFuZ2VQbGFuID0ge1xuICAgICAgICB0eXBlOiBcInRhZ1wiLFxuICAgICAgICBub3RhdGlvbjogc2NoZW1lLm5vdGF0aW9uLFxuICAgICAgICBub2RlOiBnZXRCeU5vZGVSZWYoc2NoZW1lLm5vZGVSZWYpLFxuICAgICAgfTtcblxuICAgICAgYXNzb2NpYXRlUGxhbihwbGFuLCBwbGFuLm5vdGF0aW9uLmJhc2UpO1xuICAgIH1cblxuICAgIC8vIEh5ZHJhdGUgQXR0cmlidXRlIHVwZGF0ZSBwbGFuc1xuICAgIGVsc2UgaWYgKHNjaGVtZS50eXBlID09PSBcImF0dHJcIikge1xuICAgICAgY29uc3QgcGxhbjogQXR0cmlidXRlVXBkYXRlUGxhbiA9IHtcbiAgICAgICAgdHlwZTogXCJhdHRyXCIsXG4gICAgICAgIGF0dHJpYnV0ZTogc2NoZW1lLmF0dHJpYnV0ZSxcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAgbm9kZTogZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKSxcbiAgICAgIH07XG5cbiAgICAgIGFzc29jaWF0ZVBsYW4ocGxhbiwgcGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBsYW5zQnlOb3RhdGlvbixcbiAgICBub3RhdGlvbkFjY2Vzc29ycyxcbiAgICBmcmFnbWVudCxcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgY2xhc3NpZnkgfSBmcm9tIFwiI2hlbHBlclwiO1xuaW1wb3J0IHtcbiAgYXBwbHlBdHRyaWJ1dGVNYXAsXG4gIGNoYW5nZVRhZyxcbiAgY3JlYXRlQXR0cmlidXRlTWFwLFxuICBzZXJpYWxpemVBdHRyaWJ1dGUsXG59IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgYnVpbGRWYWx1ZUFjY2Vzc29yIH0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgdHlwZSBUZW1wbGF0ZUNvbnRleHQgfSBmcm9tIFwiLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHR5cGUge1xuICBBdHRyaWJ1dGVVcGRhdGVKb2IsXG4gIEF0dHJpYnV0ZVVwZGF0ZVBsYW4sXG4gIENvbnRlbnRTd2FwSm9iLFxuICBDb250ZW50U3dhcFBsYW4sXG4gIExpc3RSZW5kZXJKb2IsXG4gIExpc3RSZW5kZXJKb2JJdGVtLFxuICBMaXN0UmVuZGVyUGxhbixcbiAgVGFnQ2hhbmdlSm9iLFxuICBUYWdDaGFuZ2VQbGFuLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgU0tJUFBFRF9KT0IgPSBTeW1ib2woXCJub29wXCIpO1xuZXhwb3J0IHR5cGUgU2tpcHBlZEpvYiA9IHR5cGVvZiBTS0lQUEVEX0pPQjtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBBVFRSSUJVVEUgVVBEQVRFIEpPQlMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUF0dHJpYnV0ZUpvYihcbiAgcGxhbjogQXR0cmlidXRlVXBkYXRlUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IEF0dHJpYnV0ZVVwZGF0ZUpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgbGV0IHZhbHVlID0gdHlwZW9mIHJhd1ZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyByYXdWYWx1ZShwbGFuLm5vZGUpIDogcmF3VmFsdWU7XG5cbiAgLy8gUGFyc2UgdGhlIHZhbHVlIHdpdGggYGNsYXNzaWZ5YCBpZiBzZXR0aW5nIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgaWYgKHBsYW4uYXR0cmlidXRlID09PSBcImNsYXNzXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSBjbGFzc2lmeSh2YWx1ZSk7XG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVkVmFsdWUgPSBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWUpO1xuICBjb25zdCBjdXJyZW50ID0gcGxhbi5ub2RlLmdldEF0dHJpYnV0ZShwbGFuLmF0dHJpYnV0ZSk7XG5cbiAgaWYgKHNlcmlhbGl6ZWRWYWx1ZSAhPT0gY3VycmVudCkge1xuICAgIHJldHVybiBbcGxhbi5ub2RlLCBwbGFuLmF0dHJpYnV0ZSwgc2VyaWFsaXplZFZhbHVlXTtcbiAgfVxuXG4gIHJldHVybiBTS0lQUEVEX0pPQjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkF0dHJpYnV0ZUpvYnMoam9iczogQXR0cmlidXRlVXBkYXRlSm9iW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbm9kZSwgbmFtZSwgdmFsdWVdIG9mIGpvYnMpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBDT05URU5UIFNXQVAgSk9CUyAvL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVDb250ZW50U3dhcEpvYihcbiAgcGxhbjogQ29udGVudFN3YXBQbGFuLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuKTogQ29udGVudFN3YXBKb2IgfCBTa2lwcGVkSm9iIHtcbiAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSk7XG4gIGNvbnN0IHZhbHVlID0gdHlwZW9mIHJhd1ZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyByYXdWYWx1ZShwbGFuLm5vZGUpIDogcmF3VmFsdWU7XG5cbiAgLy8gU3RyaW5nLCBOdW1iZXIsIEJvb2xlYW4gLT4gVGV4dCBOb2RlXG4gIGlmIChcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiXG4gICkge1xuICAgIGNvbnN0IGFzU3RyID0gYCR7dmFsdWV9YDtcbiAgICBpZiAocGxhbi5ub2RlLnRleHRDb250ZW50ID09PSBhc1N0cikge1xuICAgICAgcmV0dXJuIFNLSVBQRURfSk9CO1xuICAgIH1cblxuICAgIHJldHVybiBbcGxhbiwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYXNTdHIpXTtcbiAgfVxuXG4gIC8vIE51bGxpc2ggdmFsdWVzIC0+IENvbW1lbnRcbiAgZWxzZSBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwbGFuLm5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSB7XG4gICAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtwbGFuLCBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwiZW1wdHlcIildO1xuICB9XG5cbiAgLy8gSFRNTEVsZW1lbnQgLT4gU3dhcCBub2Rlc1xuICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKE9iamVjdC5pcyhwbGFuLm5vZGUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFNLSVBQRURfSk9CO1xuICAgIH1cblxuICAgIHJldHVybiBbcGxhbiwgdmFsdWUuY2xvbmVOb2RlKHRydWUpXTtcbiAgfVxuXG4gIC8vIEFueXRoaW5nIGVsc2UgLT4gVW5zdXBwb3J0ZWRcbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgIEVycm9yQ29kZS5JTlZBTElEX0NPTlRFTlQsXG4gICAgICB0eXBlb2YgdmFsdWUsXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWx1ZSksXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29udGVudFN3YXBKb2JzKGpvYnM6IENvbnRlbnRTd2FwSm9iW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbcGxhbiwgcmVwbGFjZV0gb2Ygam9icykge1xuICAgIGNvbnN0IHBhcmVudCA9IHBsYW4ubm9kZS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gaW4gcHJhY3RpY2VcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgfVxuXG4gICAgcGFyZW50LnJlcGxhY2VDaGlsZChyZXBsYWNlLCBwbGFuLm5vZGUpO1xuICAgIHBsYW4ubm9kZSA9IHJlcGxhY2U7XG4gIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBUQUcgQ0hBTkdFIEpPQlMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVRhZ0NoYW5nZUpvYihcbiAgcGxhbjogVGFnQ2hhbmdlUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IFRhZ0NoYW5nZUpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKSA/PyBcIlwiO1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmF3VmFsdWUocGxhbi5ub2RlKSA6IHJhd1ZhbHVlO1xuICBjb25zdCBuZXh0VGFnID0gYCR7dmFsdWV9YC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBjdXJyZW50VGFnID0gcGxhbi5ub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAoIW5leHRUYWcgfHwgbmV4dFRhZyA9PT0gY3VycmVudFRhZykge1xuICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgfVxuXG4gIHJldHVybiBbcGxhbiwgbmV4dFRhZ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5UYWdDaGFuZ2VKb2JzKGpvYnM6IFRhZ0NoYW5nZUpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIG5leHRUYWddIG9mIGpvYnMpIHtcbiAgICBwbGFuLm5vZGUgPSBjaGFuZ2VUYWcocGxhbi5ub2RlLCBuZXh0VGFnKTtcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBMSVNUIFJFTkRFUiBKT0JTIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmZ1bmN0aW9uIGZldGNoTGlzdERhdGEoXG4gIHBsYW46IExpc3RSZW5kZXJQbGFuLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSB7XG4gIGNvbnN0IG5vdGF0aW9uVmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSk7XG4gIGNvbnN0IGV2YWx1YXRlZFZhbHVlID1cbiAgICB0eXBlb2Ygbm90YXRpb25WYWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IG5vdGF0aW9uVmFsdWUocGxhbi5zdGFydE1hcmtlci5wYXJlbnROb2RlKVxuICAgICAgOiBub3RhdGlvblZhbHVlO1xuXG4gIGlmIChldmFsdWF0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBldmFsdWF0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZXZhbHVhdGVkVmFsdWUpKSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlZFZhbHVlO1xuICB9XG5cbiAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9MSVNUKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEhUTUxFbGVtZW50cyhzdGFydDogTm9kZSwgZW5kOiBOb2RlKTogU2V0PEhUTUxFbGVtZW50PiB7XG4gIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHN0YXJ0O1xuICBjb25zdCBub2RlU2V0ID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcblxuICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBlbmQpIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBub2RlU2V0LmFkZChub2RlKTtcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfVxuXG4gIHJldHVybiBub2RlU2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUxpc3RSZW5kZXJKb2IoXG4gIHBsYW46IExpc3RSZW5kZXJQbGFuLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuKTogTGlzdFJlbmRlckpvYiB8IFNraXBwZWRKb2Ige1xuICAvLyBGZXRjaCB0aGUgZGF0YSBmb3IgcmVuZGVyaW5nIHRoZSB1cGRhdGVkIGxpc3QgaXRlbXNcbiAgY29uc3QgbGlzdERhdGEgPSBmZXRjaExpc3REYXRhKHBsYW4sIHZhbHVlcyk7XG5cbiAgLy8gRW1wdHkgLT4gUmVtb3ZlIHRoZSBsaXN0IGNvbnRlbnRzIGVudGlyZWx5IGFuZCBleGl0XG4gIGlmIChsaXN0RGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW3BsYW4sIFtdXTtcbiAgfVxuXG4gIC8vIENvbGxlY3QgZXhpc3RpbmcgZWxlbWVudHMgZnJvbSB0aGUgRE9NIGZvciBhc3Nlc3NtZW50XG4gIGNvbnN0IHsgcm93VGVtcGxhdGVzQnlSb290LCByb3dUZW1wbGF0ZUVsZW1lbnQsIHJvd1Jvb3RFbGVtZW50IH0gPSBwbGFuO1xuICBjb25zdCBrZXlBY2Nlc3NvciA9IGJ1aWxkVmFsdWVBY2Nlc3NvcihwbGFuLmtleU5vdGF0aW9uKTtcbiAgY29uc3QgbGlzdFJlbmRlckNvbnRleHRzOiBNYXA8dW5rbm93biwgTGlzdFJlbmRlckpvYkl0ZW0+ID0gbmV3IE1hcCgpO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0RGF0YSkge1xuICAgIGNvbnN0IGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCA9IHtcbiAgICAgIGl0ZW0sXG4gICAgfTtcblxuICAgIGNvbnN0IGtleSA9IGtleUFjY2Vzc29yKGNvbnRleHQpO1xuXG4gICAgaWYgKGxpc3RSZW5kZXJDb250ZXh0cy5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWSxcbiAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIEhUTUwgRWxlbWVudCB3ZSBleHBlY3QgdG8gc2VlIGhlcmVcbiAgICBsZXQgcm93Um9vdCA9IHBsYW4ucm93Um9vdHNCeUtleS5nZXQoa2V5KTtcblxuICAgIGlmIChyb3dSb290ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1Jvb3QgPSByb3dSb290RWxlbWVudC5jbG9uZU5vZGUoZmFsc2UpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LnNldChrZXksIHJvd1Jvb3QpO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIHRlbXBsYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm93IHJvb3RcbiAgICBsZXQgcm93VGVtcGxhdGUgPSByb3dUZW1wbGF0ZXNCeVJvb3QuZ2V0KHJvd1Jvb3QpO1xuXG4gICAgaWYgKHJvd1RlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1RlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJvd1RlbXBsYXRlRWxlbWVudCk7XG4gICAgICByb3dUZW1wbGF0ZXNCeVJvb3Quc2V0KHJvd1Jvb3QsIHJvd1RlbXBsYXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2JJdGVtOiBMaXN0UmVuZGVySm9iSXRlbSA9IHtcbiAgICAgIGNvbnRleHQsXG4gICAgICByb290OiByb3dSb290LFxuICAgICAgdGVtcGxhdGU6IHJvd1RlbXBsYXRlLFxuICAgICAgYXR0ck1hcDogY3JlYXRlQXR0cmlidXRlTWFwKGl0ZW0pLFxuICAgIH07XG5cbiAgICBsaXN0UmVuZGVyQ29udGV4dHMuc2V0KGtleSwgam9iSXRlbSk7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBjYWNoZWQgZGF0YVxuICBmb3IgKGNvbnN0IFtrZXksIHJvb3RdIG9mIHBsYW4ucm93Um9vdHNCeUtleSkge1xuICAgIGlmICghbGlzdFJlbmRlckNvbnRleHRzLmhhcyhrZXkpKSB7XG4gICAgICBwbGFuLnJvd1Jvb3RzQnlLZXkuZGVsZXRlKGtleSk7XG4gICAgICBwbGFuLnJvd1RlbXBsYXRlc0J5Um9vdC5kZWxldGUocm9vdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtwbGFuLCBBcnJheS5mcm9tKGxpc3RSZW5kZXJDb250ZXh0cy52YWx1ZXMoKSldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuTGlzdFJlbmRlckpvYnMoam9iczogTGlzdFJlbmRlckpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIHJlbmRlckl0ZW1zXSBvZiBqb2JzKSB7XG4gICAgY29uc3QgeyBlbmRNYXJrZXIsIGxpc3RDb250YWluZXJFbGVtZW50IH0gPSBwbGFuO1xuXG4gICAgLy8gRmFzdCBwYXRoIGZvciBlbXB0eSBsaXN0cyAtPiBSZW1vdmUgZXZlcnl0aGluZyBhbmQgY29udGludWVcbiAgICBpZiAocmVuZGVySXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgcGxhbi5yb3dSb290c0J5S2V5LnZhbHVlcygpKSB7XG4gICAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICBwbGFuLnJvd1Jvb3RzQnlLZXkuY2xlYXIoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgc2NhbiB0aGUgY3VycmVudCBub2RlcyBhbmQgbW9kaWZ5IGFzIG5lZWRlZFxuICAgIGNvbnN0IGV4aXN0aW5nRE9NTm9kZXMgPSBBcnJheS5mcm9tKFxuICAgICAgY29sbGVjdEhUTUxFbGVtZW50cyhwbGFuLnN0YXJ0TWFya2VyLCBwbGFuLmVuZE1hcmtlciksXG4gICAgKTtcblxuICAgIGNvbnN0IHJvb3RzVG9LZWVwID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcblxuICAgIGxldCBleGlzdGluZ0RPTU5vZGVJZHggPSAwO1xuXG4gICAgZm9yIChjb25zdCByZW5kZXJJdGVtIG9mIHJlbmRlckl0ZW1zKSB7XG4gICAgICBjb25zdCB7IHJvb3QsIGF0dHJNYXAsIGNvbnRleHQsIHRlbXBsYXRlIH0gPSByZW5kZXJJdGVtO1xuICAgICAgY29uc3QgZXhpc3RpbmdET01Ob2RlID0gZXhpc3RpbmdET01Ob2Rlc1tleGlzdGluZ0RPTU5vZGVJZHhdO1xuXG4gICAgICAvLyBTcHJlYWQgaXRlbSBhcyBhdHRyaWJ1dGVzIG9uIHRoZSByb290IGFuZCB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICBhcHBseUF0dHJpYnV0ZU1hcChyb290LCBhdHRyTWFwKTtcbiAgICAgIHRlbXBsYXRlLnJlbmRlcihyb290LCBjb250ZXh0KTtcblxuICAgICAgcm9vdHNUb0tlZXAuYWRkKHJvb3QpO1xuXG4gICAgICAvLyBOb2RlIGlzIHRoZSBleGlzdGluZyBET00gTm9kZSwgY29udGludWVcbiAgICAgIGlmIChPYmplY3QuaXMoZXhpc3RpbmdET01Ob2RlLCByb290KSkge1xuICAgICAgICBleGlzdGluZ0RPTU5vZGVJZHggKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vIGV4aXN0aW5nIG5vZGUgLT4gYXBwZW5kIGl0ZW1cbiAgICAgIGlmICghZXhpc3RpbmdET01Ob2RlKSB7XG4gICAgICAgIGxpc3RDb250YWluZXJFbGVtZW50Lmluc2VydEJlZm9yZShyb290LCBlbmRNYXJrZXIpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRE9NIG5vZGUgZXhpc3RzIGJ1dCBpc24ndCB0aGUgb25lIHdlJ3JlIGxvb2tpbmcgZm9yLiBJbnNlcnQgYmVmb3JlLlxuICAgICAgbGlzdENvbnRhaW5lckVsZW1lbnQuaW5zZXJ0QmVmb3JlKHJvb3QsIGV4aXN0aW5nRE9NTm9kZSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgb2xkIGVsZW1lbnRzXG4gICAgZm9yIChjb25zdCByb290IG9mIGV4aXN0aW5nRE9NTm9kZXMpIHtcbiAgICAgIGlmICghcm9vdHNUb0tlZXAuaGFzKHJvb3QpKSB7XG4gICAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgICAgIHBsYW4ucm93VGVtcGxhdGVzQnlSb290LmRlbGV0ZShyb290KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IGZyYWdtZW50Q2FjaGUsIGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIi4uL3V0aWwvZnJhZ21lbnRzXCI7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gXCIuLi91dGlsL2xydS1jYWNoZVwiO1xuaW1wb3J0IHsgY29tcGlsZVRlbXBsYXRlLCBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZSB9IGZyb20gXCIuL2J1aWxkXCI7XG5pbXBvcnQge1xuICBwcmVwYXJlQXR0cmlidXRlSm9iLFxuICBwcmVwYXJlQ29udGVudFN3YXBKb2IsXG4gIHByZXBhcmVMaXN0UmVuZGVySm9iLFxuICBwcmVwYXJlVGFnQ2hhbmdlSm9iLFxuICBydW5BdHRyaWJ1dGVKb2JzLFxuICBydW5Db250ZW50U3dhcEpvYnMsXG4gIHJ1bkxpc3RSZW5kZXJKb2JzLFxuICBydW5UYWdDaGFuZ2VKb2JzLFxuICBTS0lQUEVEX0pPQixcbn0gZnJvbSBcIi4vam9ic1wiO1xuaW1wb3J0IHR5cGUgeyBOb3RhdGlvbkFjY2Vzc29yIH0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFueVJlbmRlclBsYW4sXG4gIEF0dHJpYnV0ZVVwZGF0ZUpvYixcbiAgQ29tcGlsZWRUZW1wbGF0ZSxcbiAgQ29udGVudFN3YXBKb2IsXG4gIExpc3RSZW5kZXJKb2IsXG4gIFRhZ0NoYW5nZUpvYixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgVGVtcGxhdGVSb290ID0gSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290O1xuZXhwb3J0IHR5cGUgVGVtcGxhdGVDb250ZXh0ID0ge1xuICBhdHRyPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG4gIHN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaXRlbT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpbmRleD86IG51bWJlcjtcbn07XG5cbmNvbnN0IGNvbXBpbGVDYWNoZSA9IG5ldyBMUlVDYWNoZTxIVE1MVGVtcGxhdGVFbGVtZW50LCBDb21waWxlZFRlbXBsYXRlPigpO1xuXG5pZiAoX19ERVZfXyAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICh3aW5kb3cgYXMgYW55KS5fX1BBTEVUVEVfREVWVE9PTFNfXyA9IHtcbiAgICBkdW1wQ2FjaGVNZXRyaWNzOiAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNvbXBpbGVkIFRlbXBsYXRlcyBDYWNoZVwiLCBjb21waWxlQ2FjaGUubWV0cmljcyk7XG4gICAgICBjb25zb2xlLmxvZyhcIkhUTUwgRnJhZ21lbnRzIENhY2hlXCIsIGZyYWdtZW50Q2FjaGUubWV0cmljcyk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBBIHJlbmRlcmFibGUgdGVtcGxhdGUgZnJvbSBhbiBIVE1MVGVtcGxhdGVFbGVtZW50XG4gKlxuICogTGV2ZXJhZ2VzIGEgc2ltcGxlIHN5bnRheCB0byBwcm92aWRlIGFjY2Vzc29ycyB0byB0ZW1wbGF0ZSBkYXRhIGZyb20gb25lIG9mXG4gKiBmb3VyIGNhdGVnb3JpZXMsIGJhc2VkIG9uIHVzZSBjYXNlOlxuICpcbiAqIGBgYFxuICogYEBgIC0+IFRoZSBgYXR0cmAgbmFtZXNwYWNlICh0aGUgaG9zdCBlbGVtZW50J3MgYXR0cmlidXRlcylcbiAqIGAkYCAtPiBUaGUgYHN0YXRlYCBuYW1lc3BhY2UgKHRoZSBob3N0IGVsZW1lbnQncyByZWFjdGl2ZSBzdGF0ZSlcbiAqIGAqYCAtPiBUaGUgYGRhdGFgIG5hbWVzcGFjZSAodGhlIGhvc3QgZWxlbWVudCdzIGNvbXB1dGVkIGRhdGEpXG4gKiBgI2AgLT4gVGhlIGBpdGVtYCBuYW1lc3BhY2UgKGxpc3QgaXRlbSBhY2Nlc3Mgd2l0aCA6OmVhY2gpXG4gKiBgYGBcbiAqXG4gKiBCaW5kIGF0dHJpYnV0ZXMgdG8gYSB2YWx1ZSB1c2luZyB0aGUgYDphdHRyaWJ1dGVgIHN5bnRheDpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IDppZD1cIiRpZFwiIDpjbGFzcz1cIkBjbGFzc25hbWVcIj48L2Rpdj5cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGUge1xuICAvKipcbiAgICogUHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBnbG9iYWwgVGVtcGxhdGUgYnVpbGQgY2FjaGUuXG4gICAqXG4gICAqIFRoaXMgaXMgbm90IHNvbWV0aGluZyB0eXBpY2FsbHkgbmVlZGVkIGZvciBnZW5lcmFsIGFwcCBkZXZlbG9wbWVudCwgYnV0XG4gICAqIGFsbG93cyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiB0byB0dW5lIHRoZSBjYWNoaW5nIHN5c3RlbSBpZiBuZWVkIGJlLlxuICAgKlxuICAgKiBDYWNoZSBzaXplcyBkZWZhdWx0IHRvIDUwMCBIVE1MIFRlbXBsYXRlIEZyYWdtZW50cyBhbmQgY29tcGlsZWQgUGFsZXR0ZVxuICAgKiB0ZW1wbGF0ZXMgKGluY2x1ZGVzIG5lc3RlZCB0ZW1wbGF0ZXMgbGlrZSBsaXN0cykgdG8gY292ZXIgbW9zdCBhcHBsaWNhdGlvblxuICAgKiBuZWVkcyB3aXRob3V0IHVzaW5nIG11Y2ggbWVtb3J5LlxuICAgKi9cbiAgc3RhdGljIGNhY2hlID0ge1xuICAgIC8qKlxuICAgICAqIFdpcGUgYWxsIGNhY2hlZCB0ZW1wbGF0ZXMgYW5kIEhUTUwgZnJhZ21lbnRzXG4gICAgICovXG4gICAgY2xlYXI6ICgpOiB2b2lkID0+IHtcbiAgICAgIGZyYWdtZW50Q2FjaGUuY2xlYXIoKTtcbiAgICAgIGNvbXBpbGVDYWNoZS5jbGVhcigpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB0aGUgZGVmYXVsdCBjYWNoZSBjYXBhY2l0eSBvZiA1MDAgaXRlbXMgcGVyIGNhY2hlXG4gICAgICpcbiAgICAgKiBHZW5lcmFsIGNhY2hpbmcgZ3VpZGFuY2U6XG4gICAgICogLSA5NSUgb2YgdGhlIHRpbWUsIDUwMCB3b3JrcyBmaW5lXG4gICAgICogLSBGb3IgdmVyeSBsYXJnZSBhcHBsaWNhdGlvbnMsIHVwIHRvIDEwMDAgaXMgcmVhc29uYWJsZVxuICAgICAqIC0gRm9yIHNtYWxsZXIgYXBwcywgZHJvcHBpbmcgZG93biB0byAxMDAgLSAyNTAgbWF5IHNhdmUgbWVtb3J5XG4gICAgICpcbiAgICAgKiBVbHRpbWF0ZWx5IHRoZSBpbXBhY3Qgd2lsbCBiZSBtaW5pbWFsIHVubGVzcyB5b3VyIGFwcCBoYXMgdmVyeSBzcGVjaWZpY1xuICAgICAqIHJlbmRlcmluZyBuZWVkcy5cbiAgICAgKi9cbiAgICBzZXRDYXBhY2l0eTogKG1heFNpemU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgZnJhZ21lbnRDYWNoZS5zZXRDYXBhY2l0eShtYXhTaXplKTtcbiAgICAgIGNvbXBpbGVDYWNoZS5zZXRDYXBhY2l0eShtYXhTaXplKTtcbiAgICB9LFxuICB9O1xuXG4gIHByaXZhdGUgX2NvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IHVzZWQgdG8gY3JlYXRlIHRoaXMgVGVtcGxhdGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIE1ha2Ugc3VyZSB0byBuZXZlciBvcGVyYXRlIGRpcmVjdGx5IG9uIHRoaXMgZWxlbWVudC4gQWx3YXlzIGNsb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBfdGVtcGxhdGVFbGVtZW50PzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvKiogVGhlIGN1cnJlbnQga25vd24gcm9vdCBlbGVtZW50IHRoYXQgdGhpcyBUZW1wbGF0ZSBpcyByZW5kZXJlZCBpbnRvICovXG4gIHByaXZhdGUgX21vdW50ZWRSb290PzogVGVtcGxhdGVSb290O1xuXG4gIC8qKiBUaGUgbW9zdCByZWNlbnQgc2V0IHZhbHVlIGZvciBlYWNoIG5vdGF0aW9uIHRoYXQgaGFzIHJlbmRlcmVkICovXG4gIHByaXZhdGUgX2xhdGVzdFJlbmRlcmVkVmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPiA9IG5ldyBNYXAoKTtcblxuICAvKiogVGhlIGFjdGl2ZSBIVE1MRWxlbWVudCB3aGljaCB0aGUgdGVtcGxhdGUgaXMgdXBkYXRpbmcgb24gcmVuZGVycyAqL1xuICBwcml2YXRlIF9mcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudDtcblxuICAvKiogVmFsdWUgTm90YXRpb25zIC0+IFNldDxSZW5kZXIgUGxhbnM+ICovXG4gIHByaXZhdGUgX3BsYW5zQnlOb3RhdGlvbjogTWFwPHN0cmluZywgU2V0PEFueVJlbmRlclBsYW4+PiA9IG5ldyBNYXAoKTtcblxuICAvKiogVmFsdWUgTm90YXRpb25zIC0+IEFjY2Vzc29yIGZ1bmN0aW9ucyAqL1xuICBwcml2YXRlIF9ub3RhdGlvbkFjY2Vzc29yczogTWFwPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IodGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICBpZiAodGVtcGxhdGUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQgPSB0ZW1wbGF0ZTtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IGNvbXBpbGVDYWNoZS5nZXQodGVtcGxhdGUpO1xuICAgICAgY29uc3QgY29tcGlsZWQgPSBjYWNoZWQgPz8gY29tcGlsZVRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICAgIHRoaXMuX2NvbXBpbGVkID0gY29tcGlsZWQ7XG5cbiAgICAgIC8vIEFsd2F5cyBzZXQgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIHRvIG1vdmUgaXQgdG8gdGhlIGZyb250IG9mIHRoZSBjYWNoZVxuICAgICAgY29tcGlsZUNhY2hlLnNldCh0ZW1wbGF0ZSwgY29tcGlsZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb21waWxlZCA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgYSBmcmFnbWVudCBmcm9tIHRoZSBjb21waWxlZCBIVE1MIChjYWNoZWQpXG4gICAgY29uc3QgZnJhZ21lbnQgPSBodG1sVG9GcmFnbWVudCh0aGlzLl9jb21waWxlZC5odG1sKTtcbiAgICBjb25zdCBoeWRyYXRlZCA9IHByZXBhcmVDb21waWxlZFRlbXBsYXRlKHRoaXMuX2NvbXBpbGVkLCBmcmFnbWVudCk7XG5cbiAgICB0aGlzLl9wbGFuc0J5Tm90YXRpb24gPSBoeWRyYXRlZC5wbGFuc0J5Tm90YXRpb247XG4gICAgdGhpcy5fbm90YXRpb25BY2Nlc3NvcnMgPSBoeWRyYXRlZC5ub3RhdGlvbkFjY2Vzc29ycztcbiAgICB0aGlzLl9mcmFnbWVudCA9IGh5ZHJhdGVkLmZyYWdtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZ1bGwgY29weSBvZiB0aGlzIHRlbXBsYXRlIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRvIGFub3RoZXIgcm9vdFxuICAgKi9cbiAgY2xvbmUgPSAoKTogVGVtcGxhdGUgPT4ge1xuICAgIHJldHVybiBuZXcgVGVtcGxhdGUodGhpcy5lbGVtZW50KCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBBbiB7QGxpbmsgSFRNTFRlbXBsYXRlRWxlbWVudH0gcmVwcmVzZW50aW5nIHRoaXMgdGVtcGxhdGVcbiAgICovXG4gIGVsZW1lbnQgPSAoKTogSFRNTFRlbXBsYXRlRWxlbWVudCA9PiB7XG4gICAgaWYgKHRoaXMuX3RlbXBsYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlRWxlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSB0aGlzLl9jb21waWxlZC5odG1sO1xuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfTtcblxuICBwcml2YXRlIF9jb2xsZWN0VXBkYXRlZFZhbHVlcyA9IChcbiAgICBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQsXG4gICk6IE1hcDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBjb25zdCB1cGRhdGVkVmFsdWVzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtyYXdOb3RhdGlvbiwgYWNjZXNzb3JdIG9mIHRoaXMuX25vdGF0aW9uQWNjZXNzb3JzKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5fbGF0ZXN0UmVuZGVyZWRWYWx1ZXMuZ2V0KHJhd05vdGF0aW9uKTtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYWNjZXNzb3IoY29udGV4dCk7XG5cbiAgICAgIGlmIChwcmV2aW91c1ZhbHVlICE9PSBuZXdWYWx1ZSAmJiAhT2JqZWN0LmlzKHByZXZpb3VzVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICB1cGRhdGVkVmFsdWVzLnNldChyYXdOb3RhdGlvbiwgbmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkVmFsdWVzO1xuICB9O1xuXG4gIHByaXZhdGUgX3VwZGF0ZShuZXdWYWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgY29uc3Qgc2NoZWR1bGVkUGxhbnM6IFNldDxBbnlSZW5kZXJQbGFuPiA9IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZUpvYnM6IEF0dHJpYnV0ZVVwZGF0ZUpvYltdID0gW107XG4gICAgY29uc3QgY29udGVudFN3YXBKb2JzOiBDb250ZW50U3dhcEpvYltdID0gW107XG4gICAgY29uc3QgdGFnQ2hhbmdlSm9iczogVGFnQ2hhbmdlSm9iW10gPSBbXTtcbiAgICBjb25zdCBsaXN0UmVuZGVySm9iczogTGlzdFJlbmRlckpvYltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtub3RhdGlvbl0gb2YgbmV3VmFsdWVzKSB7XG4gICAgICBjb25zdCBhZmZlY3RlZFBsYW5zID0gdGhpcy5fcGxhbnNCeU5vdGF0aW9uLmdldChub3RhdGlvbik7XG5cbiAgICAgIGlmIChhZmZlY3RlZFBsYW5zKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGxhbiBvZiBhZmZlY3RlZFBsYW5zKSB7XG4gICAgICAgICAgaWYgKHNjaGVkdWxlZFBsYW5zLmhhcyhwbGFuKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZWR1bGVkUGxhbnMuYWRkKHBsYW4pO1xuXG4gICAgICAgICAgc3dpdGNoIChwbGFuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhdHRyXCI6IHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUF0dHJpYnV0ZUpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUpvYnMucHVzaChqb2IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImVhY2hcIjoge1xuICAgICAgICAgICAgICBjb25zdCBqb2IgPSBwcmVwYXJlTGlzdFJlbmRlckpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgICAgICAgIGxpc3RSZW5kZXJKb2JzLnB1c2goam9iKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJzd2FwXCI6IHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUNvbnRlbnRTd2FwSm9iKHBsYW4sIG5ld1ZhbHVlcyk7XG4gICAgICAgICAgICAgIGlmIChqb2IgIT09IFNLSVBQRURfSk9CKSB7XG4gICAgICAgICAgICAgICAgY29udGVudFN3YXBKb2JzLnB1c2goam9iKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJ0YWdcIjoge1xuICAgICAgICAgICAgICBjb25zdCBqb2IgPSBwcmVwYXJlVGFnQ2hhbmdlSm9iKHBsYW4sIG5ld1ZhbHVlcyk7XG4gICAgICAgICAgICAgIGlmIChqb2IgIT09IFNLSVBQRURfSk9CKSB7XG4gICAgICAgICAgICAgICAgdGFnQ2hhbmdlSm9icy5wdXNoKGpvYik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgaW1wb3NzaWJsZSBnaXZlbiBhbiBleGhhdXN0aXZlIHN3aXRjaCBjYXNlXG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcnVuQXR0cmlidXRlSm9icyhhdHRyaWJ1dGVKb2JzKTtcbiAgICBydW5MaXN0UmVuZGVySm9icyhsaXN0UmVuZGVySm9icyk7XG4gICAgcnVuQ29udGVudFN3YXBKb2JzKGNvbnRlbnRTd2FwSm9icyk7XG4gICAgcnVuVGFnQ2hhbmdlSm9icyh0YWdDaGFuZ2VKb2JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhpcyB0ZW1wbGF0ZSBpbnRvIGEgdGFyZ2V0IGhvc3QgZWxlbWVudC5cbiAgICovXG4gIHJlbmRlciA9IChyb290OiBUZW1wbGF0ZVJvb3QsIGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCk6IHZvaWQgPT4ge1xuICAgIGlmIChyb290ICE9PSB0aGlzLl9tb3VudGVkUm9vdCkge1xuICAgICAgdGhpcy5fbW91bnRlZFJvb3QgPSByb290O1xuICAgICAgd2hpbGUgKHJvb3QuZmlyc3RDaGlsZCkge1xuICAgICAgICByb290LnJlbW92ZUNoaWxkKHJvb3QuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHJvb3QuYXBwZW5kKHRoaXMuX2ZyYWdtZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFZhbHVlcyA9IHRoaXMuX2NvbGxlY3RVcGRhdGVkVmFsdWVzKGNvbnRleHQpO1xuXG4gICAgaWYgKHJlc29sdmVkVmFsdWVzLnNpemUgIT09IDApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZShyZXNvbHZlZFZhbHVlcyk7XG5cbiAgICAgIC8vIFNhdmUgdGhlIHZhbHVlcyB0aGF0IHdlcmUgdXNlZCBmb3IgdGhpcyByZW5kZXIgaWYgdGhlIHJlbmRlciBzdWNjZWVkZWRcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiByZXNvbHZlZFZhbHVlcykge1xuICAgICAgICB0aGlzLl9sYXRlc3RSZW5kZXJlZFZhbHVlcy5zZXQoa2V5LCB2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBlbGVtZW50TWF0Y2hlcyB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcblxuZXhwb3J0IHR5cGUgRXZlbnROYW1lID0ga2V5b2YgR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwO1xuZXhwb3J0IHR5cGUgRXZlbnRIYW5kbGVyPEsgZXh0ZW5kcyBFdmVudE5hbWUgPSBFdmVudE5hbWU+ID0gKFxuICBldmVudDogR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwW0tdLFxuKSA9PiB2b2lkO1xuXG50eXBlIEV2ZW50SGFuZGxlck1hcCA9IE1hcDxzdHJpbmcsIEV2ZW50SGFuZGxlcj47XG5cbi8qKlxuICogTWFuYWdlZCBldmVudCBkZWxlZ2F0aW9uIHRvIGNvYWxlc2NlIGV2ZW50IGxpc3RlbmVycyBmb3IgYW4gZW50aXJlIHRyZWUgaW50b1xuICogc2luZ2xlIHJvb3QtbGV2ZWwgbGlzdGVuZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBMaXN0ZW4gZm9yIGV2ZW50cyBmcm9tIGFueSBjaGlsZCBlbGVtZW50IG9mIHRoZSBkZWxlZ2F0ZWQgcm9vdFxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlbGVnYXRvciA9IG5ldyBFdmVudERlbGVnYXRvcigkcm9vdCk7XG4gKiBkZWxlZ2F0b3IuYWRkRGVsZWdhdGVkTGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljayk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogTGlzdGVuIGZvciBldmVudHMgZnJvbSBjaGlsZCBlbGVtZW50cyBtYXRjaGluZyBgLmFjdGlvbmBcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkZWxlZ2F0b3IgPSBuZXcgRXZlbnREZWxlZ2F0b3IoJHJvb3QpO1xuICogZGVsZWdhdG9yLmFkZERlbGVnYXRlZExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2ssIFwiLmFjdGlvblwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnREZWxlZ2F0b3Ige1xuICBzdGF0aWMgbmV4dExpc3RlbmVySWQgPSAwO1xuXG4gIHN0YXRpYyBwcm9jZXNzVGFyZ2V0RGVzY3JpcHRvcihcbiAgICB0YXJnZXREZXNjcmlwdG9yOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PGFueT4gfCBIVE1MRWxlbWVudCxcbiAgKTogc3RyaW5nIHtcbiAgICAvLyBDcmVhdGUgYSBxdWVyeSBmaWx0ZXIgZnJvbSB0aGUgdGFyZ2V0IGRlc2NyaXB0b3JcbiAgICBpZiAodGFyZ2V0RGVzY3JpcHRvciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYW4gSUQsIHVzZSB0aGF0XG4gICAgICBpZiAodGFyZ2V0RGVzY3JpcHRvci5pZC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGAjJHt0YXJnZXREZXNjcmlwdG9yLmlkfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBnZW5lcmF0ZWRJZCA9IGBsaXN0ZW4tJHtFdmVudERlbGVnYXRvci5uZXh0TGlzdGVuZXJJZCsrfWA7XG4gICAgICAgIHRhcmdldERlc2NyaXB0b3Iuc2V0QXR0cmlidXRlKFwiZGF0YS1saXN0ZW5lci1pZFwiLCBnZW5lcmF0ZWRJZCk7XG4gICAgICAgIHJldHVybiBgW2RhdGEtbGlzdGVuZXItaWQ9XCIke2dlbmVyYXRlZElkfVwiXWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0RGVzY3JpcHRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBpZiAodGFyZ2V0RGVzY3JpcHRvci50YWdOYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbQ29tcG9uZW50XSBBdXRvbWF0aWMgbGlzdGVuZXIgc2V0dXAgZmFpbHVyZTogQ29tcG9uZW50ICR7dGFyZ2V0RGVzY3JpcHRvci5uYW1lfSBoYXMgbm8gZGVmaW5lZCB0YWduYW1lYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB0YXJnZXQgZGVzY3JpcHRvciBpcyBhIENvbXBvbmVudCBjbGFzcywgcHVsbCB0aGUgdGFnbmFtZVxuICAgICAgcmV0dXJuIHRhcmdldERlc2NyaXB0b3IudGFnTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0RGVzY3JpcHRvcjtcbiAgfVxuXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgU2hhZG93Um9vdCB8IERvY3VtZW50O1xuICBwcml2YXRlIF9yb290TGlzdGVuZXJzOiBFdmVudEhhbmRsZXJNYXAgPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX2V2ZW50czogTWFwPHN0cmluZywgTWFwPHN0cmluZywgU2V0PEV2ZW50SGFuZGxlcj4+PiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihyb290OiBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3QgfCBEb2N1bWVudCA9IGRvY3VtZW50KSB7XG4gICAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50OiBzdHJpbmcpOiBNYXA8c3RyaW5nLCBTZXQ8RXZlbnRIYW5kbGVyPj4ge1xuICAgIGxldCBoYW5kbGVyTWFwID0gdGhpcy5fZXZlbnRzLmdldChldmVudCk7XG5cbiAgICBpZiAoaGFuZGxlck1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYW5kbGVyTWFwID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5fZXZlbnRzLnNldChldmVudCwgaGFuZGxlck1hcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJNYXA7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVyc0ZvckV2ZW50QW5kUXVlcnk8RSBleHRlbmRzIEV2ZW50TmFtZT4oXG4gICAgZXZlbnQ6IEUsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU2V0PEV2ZW50SGFuZGxlcjxFPj4ge1xuICAgIGNvbnN0IGhhbmRsZXJNYXAgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50KTtcbiAgICBsZXQgaGFuZGxlclNldCA9IGhhbmRsZXJNYXAuZ2V0KHF1ZXJ5KTtcblxuICAgIGlmIChoYW5kbGVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhbmRsZXJTZXQgPSBuZXcgU2V0KCk7XG4gICAgICBoYW5kbGVyTWFwLnNldChxdWVyeSwgaGFuZGxlclNldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJTZXQ7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVSb290TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcm9vdExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlcnNGb3JFdmVudCA9IHRoaXMuX2hhbmRsZXJzRm9yRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBldmVudDtcblxuICAgICAgaWYgKHRhcmdldCA9PT0gbnVsbCB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gdGFyZ2V0O1xuXG4gICAgICBsZXQgc3RvcEltbWVkaWF0ZUNhbGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgb3JpZ2luYWxGbiA9IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9ICgpID0+IHtcbiAgICAgICAgb3JpZ2luYWxGbi5jYWxsKGV2ZW50KTtcbiAgICAgICAgc3RvcEltbWVkaWF0ZUNhbGxlZCA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gdGhpcy5fcm9vdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBpbnZhbGlkIGVsZW1lbnRzXG4gICAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbnZva2UgaGFuZGxlcnNcbiAgICAgICAgZm9yIChjb25zdCBbcXVlcnksIGhhbmRsZXJzXSBvZiBoYW5kbGVyc0ZvckV2ZW50KSB7XG4gICAgICAgICAgaWYgKHF1ZXJ5ID09PSBcIipcIiB8fCBlbGVtZW50TWF0Y2hlcyhub2RlLCBxdWVyeSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwobm9kZSwgZXZlbnQpO1xuXG4gICAgICAgICAgICAgIC8vIFJlc3BlY3QgLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIGFuZCAucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICBpZiAoc3RvcEltbWVkaWF0ZUNhbGxlZCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzcGVjdCAuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgaWYgKGV2ZW50LmNhbmNlbEJ1YmJsZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMuX3Jvb3QgfHwgbm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLl9yb290TGlzdGVuZXJzLnNldChldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB0aGlzLl9yb290LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBhZGRMaXN0ZW5lcjxFIGV4dGVuZHMgRXZlbnROYW1lPihcbiAgICBldmVudE5hbWU6IEUsXG4gICAgaGFuZGxlcjogRXZlbnRIYW5kbGVyPEU+LFxuICAgIHF1ZXJ5RmlsdGVyOiBzdHJpbmcgPSBcIipcIixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5faGFuZGxlcnNGb3JFdmVudEFuZFF1ZXJ5KGV2ZW50TmFtZSwgcXVlcnlGaWx0ZXIpLmFkZChoYW5kbGVyKTtcbiAgICB0aGlzLl9jcmVhdGVSb290TGlzdGVuZXIoZXZlbnROYW1lKTtcbiAgfVxuXG4gIHJlbW92ZUxpc3RlbmVyKFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIGhhbmRsZXI6IEV2ZW50SGFuZGxlcixcbiAgICBxdWVyeUZpbHRlcjogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyU2V0ID0gdGhpcy5faGFuZGxlcnNGb3JFdmVudEFuZFF1ZXJ5KGV2ZW50TmFtZSwgcXVlcnlGaWx0ZXIpO1xuICAgIGhhbmRsZXJTZXQuZGVsZXRlKGhhbmRsZXIpO1xuXG4gICAgLy8gSWYgdGhhdCB3YXMgdGhlIGxhc3QgaGFuZGxlciBmb3IgdGhhdCBldmVudC9xdWVyeSBjb21ibywgZGVsZXRlIHRoZSBzZXRcbiAgICBpZiAoaGFuZGxlclNldC5zaXplID09PSAwKSB7XG4gICAgICBjb25zdCBldmVudEhhbmRsZXJTZXRzID0gdGhpcy5faGFuZGxlcnNGb3JFdmVudChldmVudE5hbWUpO1xuICAgICAgZXZlbnRIYW5kbGVyU2V0cy5kZWxldGUocXVlcnlGaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFudXAgPSAoKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBbZXZlbnQsIGhhbmRsZXJdIG9mIHRoaXMuX3Jvb3RMaXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX3Jvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgfVxuXG4gICAgdGhpcy5fcm9vdExpc3RlbmVycy5jbGVhcigpO1xuICB9O1xufVxuIiwKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGNzcyB9IGZyb20gXCIjaGVscGVyXCI7XG5pbXBvcnQgeyBTdGF0ZSB9IGZyb20gXCIjc3RhdGVcIjtcbmltcG9ydCB7IFRlbXBsYXRlLCB0eXBlIFRlbXBsYXRlQ29udGV4dCB9IGZyb20gXCIjdGVtcGxhdGVcIjtcbmltcG9ydCB7IGNyZWF0ZUF0dHJpYnV0ZU1hcCwgc2VyaWFsaXplQXR0cmlidXRlIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgeyBFdmVudERlbGVnYXRvciwgdHlwZSBFdmVudEhhbmRsZXIsIHR5cGUgRXZlbnROYW1lIH0gZnJvbSBcIi4vZGVsZWdhdG9yXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dHJpYnV0ZU1hcCxcbiAgQ29tcG9uZW50U3R5bGVzLFxuICBDb21wdXRlZFByb3BlcnRpZXMsXG4gIExpdmVBdHRyaWJ1dGVzLFxuICBTdGF0ZUluaXRpYWxpemVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBNQVhfU0VRVUVOVElBTF9SRU5ERVJTID0gMTAwO1xuY29uc3QgQkxBTktfVEVNUExBVEUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbnR5cGUgSW50ZXJuYWxSZW5kZXJTdGF0dXMgPSB7XG4gIHdpbGxSZW5kZXI6IGJvb2xlYW47XG4gIGlzUmVuZGVyaW5nOiBib29sZWFuO1xuICBzZXF1ZW50aWFsUmVuZGVyczogbnVtYmVyO1xuICBwb3N0UmVuZGVyQ2FsbGJhY2tzOiBTZXQ8Vm9pZEZ1bmN0aW9uPjtcbiAgbGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwOiBBdHRyaWJ1dGVNYXA7XG4gIHRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzOiBBdHRyaWJ1dGVNYXA7XG59O1xuXG4vKipcbiAqIFRoZSAqKkNvbXBvbmVudCoqIGNsYXNzIGV4dGVuZHMgdGhlIGJhc2UgSFRNTEVsZW1lbnQgY2xhc3MgdG8gcHJvdmlkZSBhblxuICogZXJnb25vbWljIHdheSB0byBkZXNpZ24gYW5kIGRldmVsb3AgV2ViIENvbXBvbmVudHMgd2l0aCByZWFjdGl2ZSBzdGF0ZSxcbiAqIG1hbmFnZWQgYXR0cmlidXRlcywgYW5kIGR5bmFtaWMgdGVtcGxhdGluZy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbXBvbmVudDxcbiAgU3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9LFxuPiBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgICAgICAgU3RhdGljIEhlbHBlciBNZXRob2RzICAgICAgICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIENvbXBvbmVudCB3aXRoIHRoZSBicm93c2VyLiBPcHRpb25hbGx5IHByb3ZpZGUgYW4gb3ZlcnJpZGluZ1xuICAgKiB0YWcgbmFtZS5cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcihcbiAgICBjb21wb25lbnQ6IEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvciB8IHR5cGVvZiBDb21wb25lbnQsXG4gICAgdGFnTmFtZT86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgdHlwZW9mIHdpbmRvdy5jdXN0b21FbGVtZW50cyA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9FTlYpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudFRhZ25hbWUgPVxuICAgICAgXCJ0YWdOYW1lXCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQudGFnTmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNvbXBvbmVudC50YWdOYW1lXG4gICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBjb21wdXRlZFRhZ25hbWUgPSB0YWdOYW1lID8/IGNvbXBvbmVudFRhZ25hbWU7XG5cbiAgICBpZiAoXG4gICAgICBjb21wdXRlZFRhZ25hbWUgPT09IG51bGwgfHxcbiAgICAgIGNvbXB1dGVkVGFnbmFtZS5sZW5ndGggPT09IDAgfHxcbiAgICAgICFjb21wdXRlZFRhZ25hbWUuaW5jbHVkZXMoXCItXCIpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX1RBR05BTUUpO1xuICAgIH1cblxuICAgIGlmICh3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KGNvbXB1dGVkVGFnbmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLkRVUEVfVEFHTkFNRSwgdGFnTmFtZSA/PyBcIlwiKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgYW55IGxpdmUgYXR0cmlidXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG9ic2VydmVkQXR0cmlidXRlc1xuXG4gICAgd2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgICAgIGNvbXB1dGVkVGFnbmFtZSxcbiAgICAgIGNvbXBvbmVudCBhcyBDdXN0b21FbGVtZW50Q29uc3RydWN0b3IsXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgU3RhdGljIENvbXBvbmVudCBDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICAvKipcbiAgICogVGhlIEhUTUwgdGFnIG5hbWUgdG8gdXNlIGZvciB0aGlzIENvbXBvbmVudFxuICAgKi9cbiAgc3RhdGljIHRhZ05hbWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgLyoqXG4gICAqIEFuIEhUTUwgVGVtcGxhdGUgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHRvIHVzZS5cbiAgICovXG4gIHN0YXRpYyB0ZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudCB8IFRlbXBsYXRlID0gQkxBTktfVEVNUExBVEU7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIENTU1N0eWxlU2hlZXR9IGFycmF5IG9yIHN0cmluZyB0byBhZG9wdCBhcyB0aGUgY29tcG9uZW50J3Mgc2NvcGVkIHN0eWxlc1xuICAgKi9cbiAgc3RhdGljIHN0eWxlczogQ29tcG9uZW50U3R5bGVzID0gW107XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGh0bWwgYXR0cmlidXRlIG5hbWVzIHRvIG9ic2VydmUgdG8gdHJpZ2dlciB1cGRhdGVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiB5b3UgdXNlIHRoZSB7QGxpbmsgZGVmaW5lfSBmYWN0b3J5IGhlbHBlciwgdGhpcyB2YWx1ZSB3aWxsIGJlXG4gICAqIGF1dG9tYXRpY2FsbHkgbWVyZ2VkIHdpdGggYSBsaXN0IG9mIGFueSBkZWZpbmVkIHtAbGluayBsaXZlQXR0cmlidXRlc30uXG4gICAqL1xuICBzdGF0aWMgb2JzZXJ2ZWRBdHRyaWJ1dGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBmb3IgdGhpcyBDb21wb25lbnQncyBTaGFkb3dSb290LlxuICAgKlxuICAgKiAtIGBcIm9wZW5cImAgYWxsb3dzIEpTIGFjY2VzcyB0byB0aGUgY2hpbGRyZW4gb2YgdGhpcyBjb21wb25lbnRcbiAgICogLSBgXCJjbG9zZWRcImAgKGRlZmF1bHQpIGRpc2FsbG93cyBpbnRlcm5hbCBKUyBhY2Nlc3NcbiAgICovXG4gIHN0YXRpYyBzaGFkb3dSb290TW9kZTogXCJjbG9zZWRcIiB8IFwib3BlblwiID0gXCJjbG9zZWRcIjtcblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlIFByb3BlcnRpZXMgICAgICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgLyoqXG4gICAqIFByaW1hcnkgc2NyaXB0aW5nIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICpcbiAgICogVXNlIGBzY3JpcHQoKWAgdG8gZGVmaW5lIHByaW1hcnkgYmVoYXZpb3JzLCBsaXN0ZW5lcnMsIGFuZCBpbml0aWFsaXphdGlvbnMuXG4gICAqXG4gICAqIElmIG5lZWQgYmUsIHJldHVybiBhIGZ1bmN0aW9uIHRvIGF1dG9tYXRpY2FsbHkgY2FsbCB3aGVuIHRoZSBjb21wb25lbnQgaXNcbiAgICogdW5tb3VudGluZyBmb3IgY2xlYW51cCBzY3JpcHRzLiBBbHRlcm5hdGl2ZWx5LCB1c2Uge0BsaW5rIGZpbmFsaXplfSBmb3JcbiAgICogY2xlYW51cCB0YXNrcywgd2hpY2ggd2lsbCBhbHdheXMgcnVuIGxhc3QsIGV2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIGZ1bmN0aW9uXG4gICAqIGZyb20gc2NyaXB0KCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2NyaXB0PygpOiBWb2lkRnVuY3Rpb24gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGVhY2ggdGVtcGxhdGUgdXBkYXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgYmVmb3JlVXBkYXRlPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCB0ZW1wbGF0ZSB1cGRhdGVcbiAgICovXG4gIHByb3RlY3RlZCBhZnRlclVwZGF0ZT8ocHJldmlvdXNBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNYXApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXMgdGhlIGZpbmFsIGxpZmVjeWNsZSBtZXRob2QgYXQgdGhlIGVuZCBvZiB0aGUgdW5tb3VudGluZyBwcm9jZXNzLlxuICAgKlxuICAgKiBDb250ZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGFuZCB0aGUgY29tcG9uZW50IGlzIG5vIGxvbmdlclxuICAgKiBjb25zaWRlcmVkIG1vdW50ZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIHJ1bnMuXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBmaW5hbCBjbGVhbnVwIHRhc2tzIGFuZCBmcmVlaW5nIHJlc291cmNlcy5cbiAgICovXG4gIHByb3RlY3RlZCBmaW5hbGl6ZT8oKTogdm9pZDtcblxuICAvKipcbiAgICogSWYgZGVmaW5lZCwgcmVjZWl2ZXMgZXJyb3JzIGNhdWdodCBkdXJpbmcgdGhlIGxpZmVjeWNsZSBtZXRob2RzIG9mIHRoaXNcbiAgICogY29tcG9uZW50IGFuZCBpdCdzIGNoaWxkcmVuLiBJZiBub3QgZGVmaW5lZCwgdGhpcyBjb21wb25lbnQgd2lsbCBpbnN0ZWFkXG4gICAqIHRocm93IGVycm9ycyBhcyB0aGV5IGFyZSBmb3VuZC5cbiAgICpcbiAgICogSWYgdGhlIGVycm9yIGNhbm5vdCBiZSBoYW5kbGVkLCBgb25FcnJvcigpYCBzaG91bGQgcmUtdGhyb3cgaXQgZm9yIGEgaGlnaGVyXG4gICAqIHVwIGNvbXBvbmVudCB0byBldmFsdWF0ZS5cbiAgICpcbiAgICogVG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHdoaWxlIHJlbW92aW5nIGFuIGVycm9yaW5nIGNvbXBvbmVudCBmcm9tIHRoZVxuICAgKiBET00sIHVzZSBgdGhpcy5yZXBsYWNlV2l0aCgpYCBhbmQgYSBuZXdseSBjb25zdHJ1Y3RlZCBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBSZWNvdmVyaW5nIGZyb20gZXJyb3JzIG9yIGRpc3BsYXlpbmcgYSBmYWxsYmFja1xuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG9uRXJyb3IoZXJyb3IpIHtcbiAgICogICAvLyBIYW5kbGUga25vd24gZXJyb3JzXG4gICAqICAgaWYgKGVycm9yLm1lc3NhZ2UgPSBcIkludmFsaWQgSW5wdXRcIikge1xuICAgKiAgICAgdGhpcy5zdGF0ZS5pbnB1dCA9IFwiXCI7XG4gICAqICAgICByZXR1cm47XG4gICAqICAgfVxuICAgKlxuICAgKiAgIC8vIERpc3BsYXkgYSBmYWxsYmFjayBiYW5uZXJcbiAgICogICBjb25zdCBiYW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgKiAgIGJhbm5lci50ZXh0Q29udGVudCA9IFwiQW4gdW5leHBlY3RlZCBlcnJvciBkb25lIGRpZFwiO1xuICAgKiAgIHRoaXMucmVwbGFjZVdpdGgoYmFubmVyKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHByb3RlY3RlZCBvbkVycm9yPyhlcnJvcjogdW5rbm93bik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGlzIENvbXBvbmVudCdzIHJlYWN0aXZlIGludGVybmFsIHN0YXRlLCBpZiBhbnkuXG4gICAqXG4gICAqIElmIGBpbml0aWFsU3RhdGVgIGlzIGRlZmluZWQgYXMgYSBmdW5jdGlvbiwgdGhlIGZ1bmN0aW9uIGlzIGV2YWx1YXRlZCBhdFxuICAgKiBtb3VudGluZyB0aW1lIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGluaXRpYWwgc3RhdGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdGlhbFN0YXRlPzogU3RhdGVJbml0aWFsaXplcjxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHJldHVybmluZyBhbiBvYmplY3Qgd2hpY2ggcG9wdWxhdGVzIHRoZSBgZGF0YWAgdmFsdWVzXG4gICAqIGluIHRoZSB0ZW1wbGF0aW5nIGVuZ2luZS4gU3VjaCB2YWx1ZXMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBgKmAgbm90YXRpb24uXG4gICAqXG4gICAqIFdoZW4gYSBob3N0ZWQgdmFsdWUgaXMgYWNjZXNzZWQsIGl0J3MgdmFsdWUgaXMgY29lcmNlZCBiYXNlZCBvbiB0aGUgd2F5IGl0XG4gICAqIGlzIGJlaW5nIHVzZWQuIEZvciBhdHRyaWJ1dGVzLCB2YWx1ZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYSBzdHJpbmcgb3IgbnVsbCxcbiAgICogd2hpY2ggd2lsbCBzZXQgdGhlIGF0dHJpYnV0ZSAoc3RyaW5nKSBvciByZW1vdmUgaXQgKG51bGwpLlxuICAgKlxuICAgKiBGb3IgY29udGVudCBzd2Fwcywgc3RyaW5ncywgbnVtYmVycyBhbmQgYm9vbGVhbnMgYXJlIHJlbmRlcmVkIGFzIHN0cmluZ3NcbiAgICogYW5kIHNldCBhcyB0ZXh0Q29udGVudC4gbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcyByZW5kZXIgbm90aGluZyAod2l0aCBhXG4gICAqIGNvbW1lbnQgcGxhY2Vob2xkZXIpLCBhbiBIVE1MRWxlbWVudCB3aWxsIGJlIHN3YXBwZWQgaW4gYXMgYSBjbG9uZWQgbm9kZS5cbiAgICpcbiAgICogRnVuY3Rpb25zIGFyZSBldmFsdWF0ZWQgYXQgcmVuZGVyL3VwZGF0ZSB0aW1lLCBhbmQgdGhlaXIgcmV0dXJuIHZhbHVlIGlzXG4gICAqIHVzZWQgaW5zdGVhZC4gRnVuY3Rpb25zIGFyZSBwYXNzZWQgdGhlIGN1cnJlbnQgdGFyZ2V0IG5vZGUgYWNjZXNzaW5nIHRoZVxuICAgKiBwcm9wZXJ0eSBhcyBpdHMgZmlyc3QgYW5kIG9ubHkgYXJndW1lbnQuXG4gICAqXG4gICAqIE90aGVyIHR5cGVzIGFyZSB1bnN1cHBvcnRlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBob3N0ID0ge1xuICAgKiAgIGF2YXRhclVybDogXCJodHRwOi8vLi4uXCIsXG4gICAqICAgcmVuZGVyVGltZTogKCkgPT4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBgYGBodG1sXG4gICAqIDxpbWcgOnNyYz1cIiphdmF0YXJVcmxcIiAvPlxuICAgKiA8c3Bhbj5SZW5kZXJlZCBhdCAke1wiKnJlbmRlclRpbWVcIn08L3NwYW4+XG4gICAqIGBgYFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbXB1dGVkUHJvcGVydGllcz86IENvbXB1dGVkUHJvcGVydGllczxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogRGVjbGFyYXRpb24gb2YgYXR0cmlidXRlIGJlaGF2aW9ycyBkdXJpbmcgdXBkYXRlcy5cbiAgICpcbiAgICogRWFjaCBrZXkgaXMgdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLiBWYWx1ZXMgYXJlIGFuIG9iamVjdCB3aXRoIHR3b1xuICAgKiBvcHRpb25hbCBmdW5jdGlvbiBkZWZpbml0aW9uczpcbiAgICpcbiAgICogYG9uQ2hhbmdlKG5ld1ZhbHVlLCBvbGRWYWx1ZSk6IHZvaWRgLCBhIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHdoZW4gdGhlIHZhbHVlXG4gICAqIG9mIHRoaXMgYXR0cmlidXRlIGhhcyBjaGFuZ2VkLiBSdW5zIG9uY2UgcGVyIHVwZGF0ZSBjeWNsZSwgKmJlZm9yZSogdGhlXG4gICAqIHVwZGF0ZSBvY2N1cnMuXG4gICAqXG4gICAqIGByZWZsZWN0KCk6IHVua25vd25gLCBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSB2YWx1ZSB0byBzZXJpYWxpemUgYW5kIHNldFxuICAgKiBhcyB0aGlzIGF0dHJpYnV0ZSAqYWZ0ZXIqIGFuIHVwZGF0ZSBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbGl2ZUF0dHJpYnV0ZXMgPSB7XG4gICAqICAgZG9uZToge1xuICAgKiAgICAgb25DaGFuZ2UobmV3VmFsdWUpIHtcbiAgICogICAgICAgdGhpcy5zdGF0ZS5zZXQoXCJkb25lXCIsICEhbmV3VmFsdWUpO1xuICAgKiAgICAgfSxcbiAgICogICAgIHJlZmxlY3QoKSB7IHJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnQuZG9uZSB9XG4gICAqICAgfVxuICAgKiB9O1xuICAgKiBgYGBcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICpcbiAgICogSWYgdXNpbmcgdGhlIHtAbGluayBkZWZpbmV9IGhlbHBlciwgdGhlIGtleXMgb2YgdGhpcyBwcm9wZXJ0eSBhcmVcbiAgICogYXV0b21hdGljYWxseSBtZXJnZWQgd2l0aCBhbnkgZGVmaW5lZCB7QGxpbmsgb2JzZXJ2ZWRBdHRyaWJ1dGVzfS5cbiAgICpcbiAgICogSWYgeW91IGFyZSBkaXJlY3RseSBleHRlbmRpbmcgdGhlIGNsYXNzLCBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBtdXN0IGJlXG4gICAqIGV4cGxpY2l0bHkgZGVmaW5lZCB3aXRoIGFueSBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIG1vbml0b3JlZCwgcmVnYXJkbGVzc1xuICAgKiBvZiBpZiB0aGV5J3JlIGRlZmluZWQgaGVyZS5cbiAgICovXG4gIHByb3RlY3RlZCBsaXZlQXR0cmlidXRlcz86IExpdmVBdHRyaWJ1dGVzPFN0YXRlU2hhcGU+O1xuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgICBJbnRlcm5hbCBTdGF0ZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICBwcml2YXRlIF9pc0NvbXBvbmVudE1vdW50ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBwcml2YXRlIF9yb290OiBTaGFkb3dSb290O1xuICBwcml2YXRlIF9zdGF0ZT86IFN0YXRlPFN0YXRlU2hhcGU+O1xuICBwcml2YXRlIF9kZWxlZ2F0b3I/OiBFdmVudERlbGVnYXRvcjtcbiAgcHJpdmF0ZSBfb3duTGlzdGVuZXJzOiBTZXQ8e1xuICAgIGhhbmRsZXI6IEV2ZW50SGFuZGxlcjtcbiAgICBldmVudDogRXZlbnROYW1lO1xuICB9PiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBfbGl2ZUF0dHJpYnV0ZUNvbmZpZ3M6IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgTGl2ZUF0dHJpYnV0ZXM8U3RhdGVTaGFwZT5bc3RyaW5nXVxuICA+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9jbGVhbnVwRm4/OiBWb2lkRnVuY3Rpb247XG5cbiAgcHJpdmF0ZSBfcmVuZGVySW50ZXJuYWxzOiBJbnRlcm5hbFJlbmRlclN0YXR1cyA9IHtcbiAgICB3aWxsUmVuZGVyOiBmYWxzZSxcblxuICAgIC8qKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSByZW5kZXIvdXBkYXRlIHByb2Nlc3MgaXMgYWN0aXZlbHkgcnVubmluZyAqL1xuICAgIGlzUmVuZGVyaW5nOiBmYWxzZSxcbiAgICBzZXF1ZW50aWFsUmVuZGVyczogMCxcbiAgICBwb3N0UmVuZGVyQ2FsbGJhY2tzOiBuZXcgU2V0KCksXG4gICAgbGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwOiBuZXcgTWFwKCksXG4gICAgdHJhY2tlZEF0dHJpYnV0ZUNoYW5nZXM6IG5ldyBNYXAoKSxcbiAgfTtcblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgIEludGVybmFscyBhbmQgUHJpdmF0ZSBNZXRob2RzICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IHsgdGVtcGxhdGUsIHN0eWxlcywgc2hhZG93Um9vdE1vZGUgfSA9IHRoaXNcbiAgICAgIC5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQ29tcG9uZW50O1xuXG4gICAgLy8gTm9ybWFsaXplIHN0eWxlcyB0byBhbiBhcnJheSBvZiBDU1NTdHlsZVNoZWV0IG9iamVjdHNcbiAgICBjb25zdCBuZXdTdHlsZXMgPSBBcnJheS5pc0FycmF5KHN0eWxlcylcbiAgICAgID8gc3R5bGVzXG4gICAgICA6IHR5cGVvZiBzdHlsZXMgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBbc3R5bGVzXVxuICAgICAgICA6IFtjc3NgJHtzdHlsZXN9YF07XG5cbiAgICB0aGlzLl9yb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiBzaGFkb3dSb290TW9kZSB9KTtcbiAgICB0aGlzLl9yb290LmFkb3B0ZWRTdHlsZVNoZWV0cy5wdXNoKC4uLm5ld1N0eWxlcyk7XG4gICAgdGhpcy5fdGVtcGxhdGUgPVxuICAgICAgdGVtcGxhdGUgaW5zdGFuY2VvZiBUZW1wbGF0ZSA/IHRlbXBsYXRlIDogbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgfVxuXG4gIC8qKiBQcm9kdWNlIHRoZSBkYXRhIG9iamVjdCB0byBwYXNzIHRvIHRoZSB0ZW1wbGF0ZSdzIHJlbmRlciBmdW5jdGlvbiAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJDb250ZXh0KGF0dHI6IEF0dHJpYnV0ZU1hcCk6IFRlbXBsYXRlQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHI6IE9iamVjdC5mcm9tRW50cmllcyhhdHRyKSxcbiAgICAgIGRhdGE6XG4gICAgICAgIHR5cGVvZiB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0aGlzLmNvbXB1dGVkUHJvcGVydGllcygpXG4gICAgICAgICAgOiB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyxcbiAgICAgIHN0YXRlOiB0aGlzLl9zdGF0ZSA/IHRoaXMuX3N0YXRlLmN1cnJlbnQgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2VzY2FsYXRlRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSB0aGlzLnBhcmVudE5vZGU7XG5cbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgaWYgKFxuICAgICAgICBub2RlIGluc3RhbmNlb2YgQ29tcG9uZW50ICYmXG4gICAgICAgIFwib25FcnJvclwiIGluIG5vZGUgJiZcbiAgICAgICAgdHlwZW9mIG5vZGUub25FcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICBub2RlID0gbm9kZS5ob3N0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCB0byBlc2NhbGF0ZSB0bywgdGhyb3cgdGhlIGVycm9yXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIF9yZXBvcnRFcnJvcihlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vbkVycm9yKSB7XG4gICAgICB0aGlzLl9lc2NhbGF0ZUVycm9yKGVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9leGVjdXRlQXR0cmlidXRlQ2hhbmdlSGFuZGxlcnMgPSAoKSA9PiB7XG4gICAgY29uc3QgcHJldkF0dHJzID0gdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcDtcblxuICAgIC8vIENvcHkgdGhlIGNoYW5nZXMgdG8gYSBuZXcgbWFwIGFuZCBjbGVhciB0aGUgdHJhY2tpbmcgbWFwXG4gICAgY29uc3QgdHJhY2tlZENoYW5nZXMgPSBuZXcgTWFwKFxuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLFxuICAgICk7XG4gICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLmNsZWFyKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIHRyYWNrZWRDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLl9saXZlQXR0cmlidXRlQ29uZmlncy5nZXQobmFtZSk7XG4gICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFwib25DaGFuZ2VcIiBpbiBjb25maWcpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHByZXZBdHRycy5nZXQobmFtZSkgPz8gbnVsbDtcblxuICAgICAgICBpZiAoY29uZmlnICYmIHByZXZpb3VzVmFsdWUgIT09IHZhbCkge1xuICAgICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uY2FsbCh0aGlzLCB2YWwsIHByZXZpb3VzVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX3JlZmxlY3RMaXZlQXR0cmlidXRlcyA9ICgpID0+IHtcbiAgICBjb25zdCB0b1NldDogW25hbWU6IHN0cmluZywgdmFsOiBzdHJpbmcgfCBudWxsXVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb25maWddIG9mIHRoaXMuX2xpdmVBdHRyaWJ1dGVDb25maWdzKSB7XG4gICAgICBpZiAoXCJyZWZsZWN0XCIgaW4gY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHNlcmlhbGl6ZUF0dHJpYnV0ZShjb25maWcucmVmbGVjdD8uY2FsbCh0aGlzKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgICAgICBpZiAodmFsICE9PSBjdXJyZW50KSB7XG4gICAgICAgICAgdG9TZXQucHVzaChbbmFtZSwgdmFsXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIHRvU2V0KSB7XG4gICAgICB0aGlzLnJlZmxlY3RBdHRyaWJ1dGUobmFtZSwgdmFsKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFRoZSBhY3R1YWwgdXBkYXRlIGJlaGF2aW9yICovXG4gIHByaXZhdGUgX3BlcmZvcm1VcGRhdGUgPSAoKTogdm9pZCA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEltbWVkaWF0ZWx5IGZsaXAgZmxhZ3MgdG8gZGVub3RlIGEgcmVuZGVyIGlzIGluIHByb2dyZXNzIGFuZCBhbGxvd1xuICAgICAgLy8gcXVldWVpbmcgYW5vdGhlciByZW5kZXIgcmVxdWVzdC5cbiAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5pc1JlbmRlcmluZyA9IHRydWU7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlciA9IGZhbHNlO1xuXG4gICAgICAvLyBBdHRyaWJ1dGVzOiBSdW4gYW55IGByZWFkYCBob29rcyBmb3IgY2hhbmdlZCBhdHRyaWJ1dGVzXG4gICAgICB0aGlzLl9leGVjdXRlQXR0cmlidXRlQ2hhbmdlSGFuZGxlcnMoKTtcblxuICAgICAgLy8gQ2FjaGUgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgcHJldmlvdXMgcmVuZGVyXG4gICAgICBjb25zdCBwcmV2QXR0cnMgPSB0aGlzLl9yZW5kZXJJbnRlcm5hbHMubGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwO1xuXG4gICAgICB0aGlzLmJlZm9yZVVwZGF0ZT8uKCk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBzbmFwc2hvdCBvZiBhdHRyaWJ1dGVzXG4gICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gY3JlYXRlQXR0cmlidXRlTWFwKHRoaXMpO1xuICAgICAgdGhpcy5fdGVtcGxhdGUucmVuZGVyKHRoaXMucm9vdCwgdGhpcy5fZ2V0UmVuZGVyQ29udGV4dChuZXdBdHRyaWJ1dGVzKSk7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMubGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwID0gbmV3QXR0cmlidXRlcztcbiAgICAgIHRoaXMuYWZ0ZXJVcGRhdGU/LihwcmV2QXR0cnMpO1xuXG4gICAgICAvLyBBdHRyaWJ1dGVzOiBSdW4gYW55IGB3cml0ZWAgaG9va3MgZm9yIHVwZGF0ZWQgdmFsdWVzXG4gICAgICB0aGlzLl9yZWZsZWN0TGl2ZUF0dHJpYnV0ZXMoKTtcblxuICAgICAgLy8gUnVuIGFueSByZXF1ZXN0ZWQgcmVuZGVyIGNhbGxiYWNrc1xuICAgICAgLy8gVGhlc2UgYXJlIGNvbnNpZGVyZWQgbGlmZWN5Y2xlIG1ldGhvZHMgYXMgd2VsbCwgYW5kIHdpbGwgcmVwb3J0IGVycm9yc1xuICAgICAgLy8gYXMgYW55IG90aGVyIGxpZmVjeWNsZSBtZXRob2Qgd291bGRcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5zaXplKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IEFycmF5LmZyb20odGhpcy5fcmVuZGVySW50ZXJuYWxzLnBvc3RSZW5kZXJDYWxsYmFja3MpO1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5jbGVhcigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZm4gb2YgY2FsbGJhY2tzKSB7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgYHdpbGxSZW5kZXJgIGZsYWcgd2FzIGZsaXBwZWQsIGltbWVkaWF0ZWx5IHBlcmZvcm0gYSByZW5kZXJcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlcikge1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMuc2VxdWVudGlhbFJlbmRlcnMgKz0gMTtcblxuICAgICAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzID49IE1BWF9TRVFVRU5USUFMX1JFTkRFUlMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgICAgRXJyb3JDb2RlLk1BWF9TRVFVRU5USUFMX1JFTkRFUlMsXG4gICAgICAgICAgICBgJHt0aGlzLl9yZW5kZXJJbnRlcm5hbHMuc2VxdWVudGlhbFJlbmRlcnN9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGVyZm9ybVVwZGF0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzID0gMDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBTYWZlbHkgcmVxdWVzdCBmb3IgYW4gdXBkYXRlIHRvIHJ1biBvbiB0aGUgbmV4dCBmcmFtZSAqL1xuICBwcml2YXRlIF9zY2hlZHVsZVVwZGF0ZSA9ICgpID0+IHtcbiAgICAvLyBQcmV2ZW50IHNjaGVkdWxpbmcgbXVsdGlwbGUgcmVuZGVyc1xuICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlbmRlckludGVybmFscy53aWxsUmVuZGVyID0gdHJ1ZTtcblxuICAgIC8vIElmIGN1cnJlbnRseSByZW5kZXJpbmcsIGRvbid0IHJlcXVlc3QgYSByZW5kZXIsIGl0IHdpbGwgYXV0by1jb250aW51ZVxuICAgIC8vIHVudGlsIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRvIHJlbmRlclxuICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNSZW5kZXJpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHJlbmRlciBpcyByZXF1ZXN0ZWQgYW5kIHdlJ3JlIG5vdCByZW5kZXJpbmcsIHJlcXVlc3QgYSByZW5kZXIgZnJhbWVcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fcGVyZm9ybVVwZGF0ZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBfYWRvcHRTdGF0ZShzdGF0ZTogU3RhdGVTaGFwZSB8IFN0YXRlPFN0YXRlU2hhcGU+KSB7XG4gICAgLy8gSWYgdGhpcyBpcyBleGFjdGx5IG91ciBvd24gc3RhdGUgb2JqZWN0LCBkbyBub3RoaW5nXG4gICAgaWYgKE9iamVjdC5pcyh0aGlzLl9zdGF0ZSwgc3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgc3RhdGUgZXhpc3RzLCByZW1vdmUgdGhlIGxpc3RlbmVyIGFuZCBzY2hlZHVsZSBhIHJlbmRlclxuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhpcy5fc3RhdGUucmVtb3ZlTGlzdGVuZXIodGhpcy5fc2NoZWR1bGVVcGRhdGUpO1xuICAgICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBBZG9wdCB0aGUgaW5jb21pbmcgc3RhdGUgb2JqIG9yIHdyYXAgYW5kIGFkb3B0IGl0XG4gICAgY29uc3QgaW5jb21pbmdTdGF0ZU9iaiA9IHN0YXRlIGluc3RhbmNlb2YgU3RhdGUgPyBzdGF0ZSA6IG5ldyBTdGF0ZShzdGF0ZSk7XG4gICAgdGhpcy5fc3RhdGUgPSBpbmNvbWluZ1N0YXRlT2JqO1xuXG4gICAgLy8gRW5zdXJlIHRoZXJlIGlzIG5vdCBhY2NpZGVudGFsbHkgdHdvIG9mIHRoZSBzYW1lIHJlbmRlciBsaXN0ZW5lcnNcbiAgICB0aGlzLl9zdGF0ZS5yZW1vdmVMaXN0ZW5lcih0aGlzLl9zY2hlZHVsZVVwZGF0ZSk7XG4gICAgdGhpcy5fc3RhdGUuYWRkTGlzdGVuZXIodGhpcy5fc2NoZWR1bGVVcGRhdGUpO1xuICB9XG5cbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgQ3VzdG9tIEVsZW1lbnQgQ2FsbGJhY2sgT3ZlcnJpZGVzICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNjcmlwdH0gaW5zdGVhZFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0NvbXBvbmVudE1vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlciA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjcmVhdGVBdHRyaWJ1dGVNYXAodGhpcyk7XG4gICAgICAgIHRoaXMuX2xpdmVBdHRyaWJ1dGVDb25maWdzID0gbmV3IE1hcChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmxpdmVBdHRyaWJ1dGVzID8/IHt9KSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3RhdGVmdWwgY29tcG9uZW50LCBzZXQgdXAgdGhhdCBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5pbml0aWFsU3RhdGUpIHtcbiAgICAgICAgICBjb25zdCBpbml0ID1cbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmluaXRpYWxTdGF0ZSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICA/IHRoaXMuaW5pdGlhbFN0YXRlXG4gICAgICAgICAgICAgIDogdGhpcy5pbml0aWFsU3RhdGUoKTtcblxuICAgICAgICAgIHRoaXMuX2Fkb3B0U3RhdGUoaW5pdCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90ZW1wbGF0ZS5yZW5kZXIodGhpcy5yb290LCB0aGlzLl9nZXRSZW5kZXJDb250ZXh0KGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgdGhpcy5fcmVmbGVjdExpdmVBdHRyaWJ1dGVzKCk7XG4gICAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5sYXN0UmVuZGVyZWRBdHRyaWJ1dGVNYXAgPSBhdHRyaWJ1dGVzO1xuICAgICAgICB0aGlzLl9pc0NvbXBvbmVudE1vdW50ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jbGVhbnVwRm4gPSB0aGlzLnNjcmlwdD8uKCkgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoZXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBmaW5hbGl6ZX1cbiAgICovXG4gIHByb3RlY3RlZCBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAvLyBJZiB0aGlzIHRhc2sgcnVucyBidXQgdGhlIGNvbXBvbmVudCBpcyBzdGlsbCBjb25uZWN0ZWQsIHRoZW4gZG8gbm90aGluZ1xuICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IHdhcyBqdXN0IG1vdmVkIGluIHRoZSBET00uXG4gICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCB8fCAhdGhpcy5faXNDb21wb25lbnRNb3VudGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBydW4gdGhlIGRpc2Nvbm5lY3QgaWYgdGhlIGVsZW1lbnQgaXMgYWN0dWFsbHkgdW5tb3VudGVkIGFuZCBub3RcbiAgICAgIC8vIGp1c3QgbW92ZWQuIFVzaW5nIHRoaXMgaW4gcGxhY2Ugb2YgY29ubmVjdGVkTW92ZUNhbGxiYWNrKCkgZm9yIGNvbXBhdFxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fZGVsZWdhdG9yPy5jbGVhbnVwKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IGxpc3RlbmVycyBzZXQgdXAgb24gc2VsZlxuICAgICAgICBpZiAodGhpcy5fb3duTGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9vd25MaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lci5ldmVudCwgbGlzdGVuZXIuaGFuZGxlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xlYW51cEZuPy4oKTtcbiAgICAgICAgdGhpcy5faXNDb21wb25lbnRNb3VudGVkID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBSdW4gdGhlIGZpbmFsaXplIGNhbGwgYWZ0ZXIgZXZlcnl0aGluZywgZXZlbiBpZiB0aGUgY2xlYW51cCBmbiBmYWlsZWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXplPy4oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGxpdmVBdHRyaWJ1dGVzfSBpbnN0ZWFkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBfOiBzdHJpbmcgfCBudWxsLFxuICAgIG5ld1ZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICApOiB2b2lkIHtcbiAgICAvLyBJZ25vcmUgYXR0cmlidXRlIGNoYW5nZXMgdGhhdCBvY2N1ciBkdXJpbmcgYW4gdXBkYXRlLCBhcyB0aGV5IGFyZVxuICAgIC8vIGNvbWluZyBmcm9tIGluc2lkZSB0aGUgaG91c2VcbiAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2tpcCBub24tY2hhbmdlcyB1c2luZyB0aGUgc3RvcmVkIGF0dHJpYnV0ZXMgYXMgcmVmZXJlbmNlIHRvIGNvbXBhcmVcbiAgICAvLyB0byB0aGUgcmVuZGVyIHN0YXRlIHJhdGhlciB0aGFuIHRoZSBkb21cbiAgICBpZiAoXG4gICAgICBuZXdWYWx1ZSA9PT0gdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcD8uZ2V0KG5hbWUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FjaGUgdGhlIHVwZGF0ZWQgYXR0cmlidXRlIHZhbHVlXG4gICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLnNldChuYW1lLCBuZXdWYWx1ZSk7XG5cbiAgICAvLyBTY2hlZHVsZSBhIHJlbmRlclxuICAgIGlmICghdGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIpIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgICAgICAgICAgUHVibGljIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBUaGUgU2hhZG93Um9vdCBub2RlIG9mIHRoaXMgZWxlbWVudFxuICAgKi9cbiAgZ2V0IHJvb3QoKTogU2hhZG93Um9vdCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gIH1cblxuICAvKipcbiAgICogRGlyZWN0bHkgYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoaXMgQ29tcG9uZW50J3MgcmVhY3RpdmUgc3RhdGUgd2l0aCBkZWVwXG4gICAqIHJlYWN0aXZpdHkgZW5hYmxlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbml0aWFsU3RhdGUgPSB7IHZhbHVlczogeyBjb3VudDogMSwgdGltZTogMCB9IH07XG4gICAqXG4gICAqIGluY3JlbWVudCgpIHtcbiAgICogICB0aGlzLnN0YXRlLnZhbHVlcy5jb3VudCA9IDI7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgYSBzaG9ydGhhbmQgZ2V0dGVyIGZvciBgdGhpcy5nZXRTdGF0ZSgpLmxpdmVgXG4gICAqL1xuICBnZXQgc3RhdGUoKTogU3RhdGVTaGFwZSB7XG4gICAgaWYgKCF0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19TVEFURSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLmxpdmU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgY3VycmVudCBzdGF0ZSB3aXRoIGEgbmV3IHZhbHVlIG9yIGFkb3B0IGEgd2hvbGUgZGlmZmVyZW50IFN0YXRlXG4gICAqIGluc3RhbmNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFN0YXRlIHJlcGxhY2VtZW50XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQWx3YXlzIHRyaWdnZXJzIGEgcmVuZGVyXG4gICAqIHRoaXMuc3RhdGUgPSB7IHNvbWU6IFwibmV3U3RhdGVcIiB9XG4gICAqXG4gICAqIC8vIEFkb3B0IGEgbmV3IHN0YXRlIGluc3RhbmNlIGFsdG9nZXRoZXJcbiAgICogY29uc3Qgb3RoZXJTdGF0ZSA9IG5ldyBTdGF0ZSh7c29tZTogXCJuZXdTdGF0ZVwifSk7XG4gICAqIHRoaXMuc3RhdGUgPSBvdGhlclN0YXRlO1xuICAgKlxuICAgKiAvLyBDYXVzZXMgYSByZW5kZXJcbiAgICogb3RoZXJTdGF0ZS5zZXQoXCJzb21lXCIsIFwidmFsdWVcIik7XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0IHN0YXRlKG5ld1N0YXRlOiBTdGF0ZVNoYXBlIHwgU3RhdGU8U3RhdGVTaGFwZT4pIHtcbiAgICB0aGlzLl9hZG9wdFN0YXRlKG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIGZ1bGwge0BsaW5rIFN0YXRlfSBpbnN0YW5jZSBmb3IgdGhpcyBDb21wb25lbnQuXG4gICAqXG4gICAqIFVzaW5nIHRoaXMgbWV0aG9kIG9uIGEgY29tcG9uZW50IHdoaWNoIGlzIG5vdCB1c2luZyByZWFjdGl2ZSBzdGF0ZVxuICAgKiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBiZWluZyB0aHJvd24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFJldHJpZXZlIHN0YXRlZnVsIHZhbHVlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY2xhc3MgRXhhbXBsZSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAqICAgaW5pdGlhbFN0YXRlID0geyBjb3VudDogMSB9O1xuICAgKlxuICAgKiAgIHNjcmlwdCgpIHtcbiAgICogICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgKiAgICAgY29uc29sZS5sb2coYFRoZSBjb3VudCBpcyAke3N0YXRlLmdldChcImNvdW50XCIpfWApO1xuICAgKiAgIH1cbiAgICpcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogU2V0IGEgc3RhdGVmdWwgdmFsdWVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBFeGFtcGxlIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICogICBpbml0aWFsU3RhdGUgPSB7IGNvdW50OiAxIH07XG4gICAqXG4gICAqICAgaW5jcmVtZW50KCkge1xuICAgKiAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAqICAgICBjb25zdCBjdXJyZW50ID0gc3RhdGUuZ2V0KFwiY291bnRcIik7XG4gICAqICAgICBzdGF0ZS5zZXQoXCJjb3VudFwiLCBjdXJyZW50ICsgMSk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0U3RhdGUoKTogU3RhdGU8U3RhdGVTaGFwZT4ge1xuICAgIGlmICghdGhpcy5fc3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBzY2hlZHVsZSBhIHJlbmRlciB0byBvY2N1clxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBDYWxsaW5nIHtAbGluayByZXF1ZXN0UmVuZGVyfSBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBldmVudCBsb29wIHdvbid0XG4gICAqIHNjaGVkdWxlIG11bHRpcGxlIHJlbmRlcnMuIFJlbmRlcnMgYXJlIHNjaGVkdWxlZCB0byBvY2N1ciBvbiB0aGUgbmV4dFxuICAgKiBhbmltYXRpb24gZnJhbWUuXG4gICAqL1xuICByZXF1ZXN0UmVuZGVyKGNhbGxiYWNrPzogVm9pZEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWFuYWdlZCBldmVudCBsaXN0ZW5lciBvbiB0aGlzIENvbXBvbmVudCB3aXRoIGFuIG9wdGlvbmFsIHF1ZXJ5XG4gICAqIGZpbHRlciBzdHJpbmcgdG8gc3BlY2lmeSB3aGljaCBlbGVtZW50cyB0byBsaXN0ZW4gdG8gZXZlbnRzIGZyb20uXG4gICAqXG4gICAqIEV2ZW50IGhhbmRsZXJzIHNldCB1cCB3aXRoIGBsaXN0ZW4oKWAgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cCB3aGVuXG4gICAqIHRoZSBjb21wb25lbnQgaXMgdW5tb3VudGVkLlxuICAgKlxuICAgKiBIYW5kbGVycyBhcmUgZGVsZWdhdGVkIHRvIGEgc2luZ2xlIGxpc3RlbmVyIHBlciBldmVudCBvbiB0aGUgcm9vdCBvZiB0aGVcbiAgICogQ29tcG9uZW50LCB3aGljaCBpcyB0aGUgY2xvc2VkIFNoYWRvd1Jvb3QgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogU2V0IHVwIGFuIGV2ZW50IGxpc3RlbmVyIGZvciBhIGNsaWNrIGV2ZW50IGZyb20gYSBidXR0b24gd2l0aCBJRCBcInN1Ym1pdFwiXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5saXN0ZW4oXCIjc3VibWl0XCIsIFwiY2xpY2tcIiwgdGhpcy5oYW5kbGVDbGljayk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBTZXQgdXAgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIGhvc3QgZWxlbWVudCBpdHNlbGYgKGB0aGlzYCkuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXNlIFwiOmhvc3RcIiBvciBcIjpIT1NUXCIgYXMgdGhlIHF1ZXJ5IHNlbGVjdG9yIHRvIHRhcmdlIHRoZSBob3N0IGVsZW1lbnRcbiAgICogdGhpcy5saXN0ZW4oXCI6aG9zdFwiLCBcImFuaW1hdGlvbmVuZFwiLCB0aGlzLmhhbmRsZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGxpc3RlbjxFIGV4dGVuZHMgRXZlbnROYW1lPihcbiAgICB0YXJnZXREZXNjcmlwdG9yOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PGFueT4gfCBIVE1MRWxlbWVudCxcbiAgICBldmVudE5hbWU6IEUsXG4gICAgZXZlbnRIYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXJ5ID0gRXZlbnREZWxlZ2F0b3IucHJvY2Vzc1RhcmdldERlc2NyaXB0b3IodGFyZ2V0RGVzY3JpcHRvcik7XG5cbiAgICAvLyBJZiB0aGUgcXVlcnkgZmlsdGVyIGlzIGBcIjpob3N0XCJgLCBzZXQgdXAgYW4gb3duTGlzdGVuZXJcbiAgICBpZiAocXVlcnkgPT09IFwiOmhvc3RcIiB8fCBxdWVyeSA9PT0gXCI6SE9TVFwiKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICAgICAgdGhpcy5fb3duTGlzdGVuZXJzLmFkZCh7XG4gICAgICAgIGhhbmRsZXI6IGV2ZW50SGFuZGxlciBhcyBFdmVudEhhbmRsZXIsXG4gICAgICAgIGV2ZW50OiBldmVudE5hbWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHNldCB1cCBhIHJvb3QgbGlzdGVuZXJcbiAgICBpZiAoIXRoaXMuX2RlbGVnYXRvcikge1xuICAgICAgdGhpcy5fZGVsZWdhdG9yID0gbmV3IEV2ZW50RGVsZWdhdG9yKHRoaXMucm9vdCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGVsZWdhdG9yLmFkZExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyLCBxdWVyeSk7XG4gIH1cblxuICBzdG9wTGlzdGVuaW5nPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIHRhcmdldERlc2NyaXB0b3I6IHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQ8YW55PiB8IEhUTUxFbGVtZW50LFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBldmVudEhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnkgPSBFdmVudERlbGVnYXRvci5wcm9jZXNzVGFyZ2V0RGVzY3JpcHRvcih0YXJnZXREZXNjcmlwdG9yKTtcblxuICAgIC8vIElmIHRoZSBxdWVyeSBmaWx0ZXIgaXMgYFwiOmhvc3RcImAsIHJlbW92ZSBmcm9tIHRoZSBvd25MaXN0ZW5lciBsaXN0XG4gICAgaWYgKHF1ZXJ5ID09PSBcIjpob3N0XCIgfHwgcXVlcnkgPT09IFwiOkhPU1RcIikge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyIGFzIEV2ZW50SGFuZGxlcik7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX293bkxpc3RlbmVycykge1xuICAgICAgICBpZiAobGlzdGVuZXIuZXZlbnQgPT09IGV2ZW50TmFtZSAmJiBsaXN0ZW5lci5oYW5kbGVyID09PSBldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLl9vd25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBkZWxlZ2F0b3IgaXMgbm90IHNldCB1cCwgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCF0aGlzLl9kZWxlZ2F0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWxlZ2F0b3IucmVtb3ZlTGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICBldmVudEhhbmRsZXIgYXMgRXZlbnRIYW5kbGVyLFxuICAgICAgcXVlcnksXG4gICAgKTtcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSB7QGxpbmsgQ3VzdG9tRXZlbnR9IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBkZXRhaWxcbiAgICpcbiAgICogQGV4YW1wbGUgRGVmaW5pbmcgY3VzdG9tIGV2ZW50c1xuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlZmluZSB0eXBlcy4gVGhpcyBjYW4gaGFwcGVuIGluIHRoZSBzYW1lIGZpbGUgb3IgZWxzZXdoZXJlIGZvciBjb21tb25cbiAgICogLy8gYW5kIHNoYXJlZCBldmVudHMuXG4gICAqIGV4cG9ydCB0eXBlIE15RXZlbnQgPSBDdXN0b21FdmVudDxUPiAvLyBTZXQgYFRgIHRvIHRoZSBldmVudCBkZXRhaWwgdHlwZVxuICAgKlxuICAgKiBkZWNsYXJlIGdsb2JhbCB7XG4gICAqICBpbnRlcmZhY2UgR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwIHtcbiAgICogICAgXCJteS1ldmVudC1uYW1lXCI6IE15RXZlbnRcbiAgICogIH1cbiAgICogfVxuICAgKlxuICAgKiAvLyBEaXNwYXRjaCBhIGN1c3RvbSBldmVudFxuICAgKiB0aGlzLmRpc3BhdGNoRXZlbnQoXCJteS1ldmVudC1uYW1lXCIsIFQpO1xuICAgKlxuICAgKiAvLyBMaXN0ZW4gdG8gYSBjdXN0b20gZXZlbnRcbiAgICogJGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJteS1ldmVudC1uYW1lXCIsIC4uLik7XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzcGF0Y2hFdmVudDxUPihcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRldGFpbD86IFQsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGJ1YmJsZXM6IGJvb2xlYW47XG4gICAgICBjYW5jZWxhYmxlOiBib29sZWFuO1xuICAgICAgY29tcG9zZWQ6IGJvb2xlYW47XG4gICAgfSxcbiAgKTogYm9vbGVhbjtcbiAgZGlzcGF0Y2hFdmVudDxUPihcbiAgICBldmVudDogc3RyaW5nIHwgRXZlbnQsXG4gICAgZGV0YWlsPzogVCxcbiAgICBvcHRpb25zPzoge1xuICAgICAgYnViYmxlczogYm9vbGVhbjtcbiAgICAgIGNhbmNlbGFibGU6IGJvb2xlYW47XG4gICAgICBjb21wb3NlZDogYm9vbGVhbjtcbiAgICB9LFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgLi4uKG9wdGlvbnMgPz8ge30pLFxuICAgIH07XG5cbiAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihldmVudCwge1xuICAgICAgICBkZXRhaWwsXG4gICAgICAgIC4uLm9wdHMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcXVlcnlTZWxlY3RvcjxFIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KHF1ZXJ5OiBzdHJpbmcpOiBFIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3QucXVlcnlTZWxlY3RvcihxdWVyeSk7XG4gIH1cblxuICBxdWVyeVNlbGVjdG9yQWxsPEUgZXh0ZW5kcyBIVE1MRWxlbWVudD4ocXVlcnk6IHN0cmluZyk6IE5vZGVMaXN0T2Y8RT4ge1xuICAgIHJldHVybiB0aGlzLl9yb290LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpIGFzIE5vZGVMaXN0T2Y8RT47XG4gIH1cblxuICBnZXRFbGVtZW50QnlJZDxFIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KGlkOiBzdHJpbmcpOiBFIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX3Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gdGhpcy5fcm9vdC5nZXRFbGVtZW50QnlJZChpZCkgYXMgRSB8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBIVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3Rvci5jYWxsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgIyR7aWR9YCxcbiAgICAgICkgYXMgRSB8IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVxdWlyZUVsZW1lbnRCeUlkPEUgZXh0ZW5kcyBIVE1MRWxlbWVudD4oaWQ6IHN0cmluZyk6IEUge1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMuZ2V0RWxlbWVudEJ5SWQ8RT4oaWQpO1xuICAgIGlmICghbG9va3VwKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5NSVNTSU5HX0VMRU1FTlQpO1xuICAgIH1cbiAgICByZXR1cm4gbG9va3VwO1xuICB9XG5cbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGFzIGFuIGF0dHJpYnV0ZSwgc2VyaWFsaXppbmcgdG8gYSBzdHJpbmcgb3IgYG51bGxgLlxuICAgKlxuICAgKiBudWxsIHZhbHVlcyBjYXVzZSB0aGUgYXR0cmlidXRlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGlzIGVsZW1lbnRcbiAgICovXG4gIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlKTtcbiAgICBpZiAoc2VyaWFsaXplZCA9PT0gbnVsbCkge1xuICAgICAgSFRNTEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZS5jYWxsKHRoaXMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSwgc2VyaWFsaXplZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhdHRyaWJ1dGUgYXMgYSBudW1iZXIsIGZhbGxpbmcgYmFjayB0byBhIHNwZWNpZmllZCBkZWZhdWx0LlxuICAgKlxuICAgKlxuICAgKiBgbnVsbGAgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQgYXMgYG51bGxgLCB3aGlsZSBzdHJpbmcgYXR0cmlidXRlcyBhcmVcbiAgICogcGFyc2VkIHVzaW5nIHRoZSBgTnVtYmVyKClgIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBWYWx1ZXMgd2hpY2ggZXZhbHVhdGUgdG8gTmFOIGFyZSByZXR1cm5lZCBhcyBgbnVsbGAuXG4gICAqL1xuICBnZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IG51bWJlcik6IG51bWJlcjtcblxuICAvKipcbiAgICogR2V0IGFuIGF0dHJpYnV0ZSBhcyBhIHN0cmluZywgZmFsbGluZyBiYWNrIHRvIGEgc3BlY2lmaWVkIGRlZmF1bHRcbiAgICovXG4gIGdldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRBdHRyaWJ1dGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bWJlcixcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSBIVE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG5cbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cblxuICAgIC8vIEludmFsaWQgZnVuY3Rpb24gaW52b2NhdGlvblxuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgb24gdGhpcyBlbGVtZW50IGlmIHRoZSBwcm92aWRlZCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGF0dHJpYnV0ZSB3aGVuIHNlcmlhbGl6ZWRcbiAgICovXG4gIHJlZmxlY3RBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBjb25zdCByZWZsZWN0ZWQgPSBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWUpO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IHJlZmxlY3RlZCkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgcmVmbGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoaXMgZWxlbWVudCB0byBhIHN0cmluZ1xuICAgKi9cbiAgdG9TdHJpbmcoZnVsbDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIENvbXBvbmVudCkubmFtZTtcbiAgICBjb25zdCBhdHRyU3RyaW5nID0gdGhpcy5nZXRBdHRyaWJ1dGVOYW1lcygpXG4gICAgICAubWFwKChhdHRyTmFtZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgIHJldHVybiB2YWwgPyBgJHthdHRyTmFtZX09XCIke3ZhbH1cImAgOiBcIlwiO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiIFwiKTtcbiAgICBjb25zdCBhdHRycyA9IGF0dHJTdHJpbmcubGVuZ3RoID4gMCA/IGAgJHthdHRyU3RyaW5nfWAgOiBcIlwiO1xuXG4gICAgaWYgKGZ1bGwpIHtcbiAgICAgIHJldHVybiBgQ29tcG9uZW50PCR7bmFtZX0ke2F0dHJzfT5cXG4ke3RoaXMucm9vdC5pbm5lckhUTUx9XFxuPC8ke25hbWV9PmA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBDb21wb25lbnQ8JHtuYW1lfSR7YXR0cnN9PmA7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUge1xuICBBdHRyaWJ1dGVNYXAsXG4gIENvbXBvbmVudFN0eWxlcyxcbiAgQ29tcHV0ZWRQcm9wZXJ0aWVzLFxuICBMaXZlQXR0cmlidXRlcyxcbiAgU3RhdGVJbml0aWFsaXplcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgQkxBTktfVEVNUExBVEUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50U2hvcnRoYW5kPFN0YXRlU2hhcGUgZXh0ZW5kcyBvYmplY3QgPSB7fT4ge1xuICAvKipcbiAgICogQW4gSFRNTCBUZW1wbGF0ZSBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgdG8gdXNlLlxuICAgKi9cbiAgdGVtcGxhdGU/OiBIVE1MVGVtcGxhdGVFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBBIHtAbGluayBDU1NTdHlsZVNoZWV0fSBhcnJheSB0byBhZG9wdCB0byB0aGUgZWxlbWVudCdzIHNoYWRvdyBET01cbiAgICovXG4gIHN0eWxlcz86IENvbXBvbmVudFN0eWxlcztcblxuICAvKipcbiAgICogVGhlIG1vZGUgZm9yIHRoaXMgQ29tcG9uZW50J3MgU2hhZG93Um9vdC5cbiAgICpcbiAgICogLSBgXCJvcGVuXCJgIGFsbG93cyBKUyBhY2Nlc3MgdG8gdGhlIGNoaWxkcmVuIG9mIHRoaXMgY29tcG9uZW50XG4gICAqIC0gYFwiY2xvc2VkXCJgIChkZWZhdWx0KSBkaXNhbGxvd3MgaW50ZXJuYWwgSlMgYWNjZXNzXG4gICAqL1xuICBzaGFkb3dSb290TW9kZT86IFwiY2xvc2VkXCIgfCBcIm9wZW5cIjtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoaXMgQ29tcG9uZW50J3MgcmVhY3RpdmUgaW50ZXJuYWwgc3RhdGUsIGlmIGFueS5cbiAgICovXG4gIGluaXRpYWxTdGF0ZT86IFN0YXRlSW5pdGlhbGl6ZXI8U3RhdGVTaGFwZT47XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdoaWNoIHBvcHVsYXRlcyB0aGUgYGRhdGFgIHZhbHVlc1xuICAgKiBpbiB0aGUgdGVtcGxhdGluZyBlbmdpbmUuIFN1Y2ggdmFsdWVzIGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgYCpgIG5vdGF0aW9uLlxuICAgKi9cbiAgY29tcHV0ZWRQcm9wZXJ0aWVzPzogQ29tcHV0ZWRQcm9wZXJ0aWVzPFN0YXRlU2hhcGU+O1xuXG4gIC8qKlxuICAgKiBEZWNsYXJhdGlvbiBvZiBhdHRyaWJ1dGUgYmVoYXZpb3JzIGR1cmluZyB1cGRhdGVzLlxuICAgKi9cbiAgbGl2ZUF0dHJpYnV0ZXM/OiBMaXZlQXR0cmlidXRlczxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gc2NyaXB0aW5nIGZvciB0aGlzIENvbXBvbmVudFxuICAgKi9cbiAgc2NyaXB0PzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPikgPT4gVm9pZEZ1bmN0aW9uIHwgdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBlYWNoIHRlbXBsYXRlIHVwZGF0ZVxuICAgKi9cbiAgYmVmb3JlVXBkYXRlPzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVtcGxhdGUgdXBkYXRlXG4gICAqL1xuICBhZnRlclVwZGF0ZT86IChcbiAgICB0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sXG4gICAgcHJldmlvdXNBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNYXAsXG4gICkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGFzIHRoZSBmaW5hbCBsaWZlY3ljbGUgbWV0aG9kIGF0IHRoZSBlbmQgb2YgdGhlIHVubW91bnRpbmcgcHJvY2Vzcy5cbiAgICpcbiAgICogQ29udGVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIERPTSBhbmQgdGhlIGNvbXBvbmVudCBpcyBubyBsb25nZXJcbiAgICogY29uc2lkZXJlZCBtb3VudGVkIHdoZW4gdGhpcyBmdW5jdGlvbiBydW5zLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgZmluYWwgY2xlYW51cCB0YXNrcyBhbmQgZnJlZWluZyByZXNvdXJjZXMuXG4gICAqL1xuICBmaW5hbGl6ZT86ICh0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIElmIGRlZmluZWQsIHJlY2VpdmVzIGVycm9ycyBjYXVnaHQgZHVyaW5nIHRoZSBsaWZlY3ljbGUgbWV0aG9kcyBvZiB0aGlzXG4gICAqIGNvbXBvbmVudCBhbmQgaXQncyBjaGlsZHJlbi4gSWYgbm90IGRlZmluZWQsIHRoaXMgY29tcG9uZW50IHdpbGwgaW5zdGVhZFxuICAgKiB0aHJvdyBlcnJvcnMgYXMgdGhleSBhcmUgZm91bmQuXG4gICAqXG4gICAqIElmIHRoZSBlcnJvciBjYW5ub3QgYmUgaGFuZGxlZCwgYG9uRXJyb3IoKWAgc2hvdWxkIHJlLXRocm93IGl0IGZvciBhIGhpZ2hlclxuICAgKiB1cCBjb21wb25lbnQgdG8gZXZhbHVhdGUuXG4gICAqXG4gICAqIFRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSB3aGlsZSByZW1vdmluZyBhbiBlcnJvcmluZyBjb21wb25lbnQgZnJvbSB0aGVcbiAgICogRE9NLCB1c2UgYHRoaXMucmVwbGFjZVdpdGgoKWAgYW5kIGEgbmV3bHkgY29uc3RydWN0ZWQgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogUmVjb3ZlcmluZyBmcm9tIGVycm9ycyBvciBkaXNwbGF5aW5nIGEgZmFsbGJhY2tcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBvbkVycm9yKGVycm9yKSB7XG4gICAqICAgLy8gSGFuZGxlIGtub3duIGVycm9yc1xuICAgKiAgIGlmIChlcnJvci5tZXNzYWdlID0gXCJJbnZhbGlkIElucHV0XCIpIHtcbiAgICogICAgIHRoaXMuc3RhdGUuaW5wdXQgPSBcIlwiO1xuICAgKiAgICAgcmV0dXJuO1xuICAgKiAgIH1cbiAgICpcbiAgICogICAvLyBEaXNwbGF5IGEgZmFsbGJhY2sgYmFubmVyXG4gICAqICAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICogICBiYW5uZXIudGV4dENvbnRlbnQgPSBcIkFuIHVuZXhwZWN0ZWQgZXJyb3IgZG9uZSBkaWRcIjtcbiAgICogICB0aGlzLnJlcGxhY2VXaXRoKGJhbm5lcik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBvbkVycm9yPzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPiwgZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmU8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PihcbiAgdGFnbmFtZTogc3RyaW5nLFxuICBkZWZpbml0aW9uOiBDb21wb25lbnRTaG9ydGhhbmQ8U3RhdGVTaGFwZT4sXG4pOiB0eXBlb2YgQ29tcG9uZW50PFN0YXRlU2hhcGU+IHtcbiAgY29uc3Qge1xuICAgIC8vIENvbmZpZ1xuICAgIHRlbXBsYXRlID0gQkxBTktfVEVNUExBVEUsXG4gICAgc3R5bGVzID0gW10sXG4gICAgc2hhZG93Um9vdE1vZGUgPSBcImNsb3NlZFwiLFxuICAgIGluaXRpYWxTdGF0ZSxcbiAgICBjb21wdXRlZFByb3BlcnRpZXMgPSB7fSxcbiAgICBsaXZlQXR0cmlidXRlcyA9IHt9LFxuXG4gICAgLy8gTGlmZWN5Y2xlXG4gICAgc2NyaXB0LFxuICAgIGJlZm9yZVVwZGF0ZSxcbiAgICBhZnRlclVwZGF0ZSxcbiAgICBmaW5hbGl6ZSxcbiAgICBvbkVycm9yLFxuICB9ID0gZGVmaW5pdGlvbjtcblxuICBjb25zdCBmdWxsT2JzZXJ2ZWRBdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhsaXZlQXR0cmlidXRlcyldKSxcbiAgKTtcblxuICBjb25zdCBjbHMgPSBjbGFzcyBleHRlbmRzIENvbXBvbmVudDxTdGF0ZVNoYXBlPiB7XG4gICAgc3RhdGljIHRhZ05hbWUgPSB0YWduYW1lO1xuICAgIHN0YXRpYyB0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHN0YXRpYyBzdHlsZXMgPSBzdHlsZXM7XG4gICAgc3RhdGljIG9ic2VydmVkQXR0cmlidXRlcyA9IFsuLi5mdWxsT2JzZXJ2ZWRBdHRyaWJ1dGVzXTtcbiAgICBzdGF0aWMgc2hhZG93Um9vdE1vZGUgPSBzaGFkb3dSb290TW9kZTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcblxuICAgICAgdGhpcy5pbml0aWFsU3RhdGUgPVxuICAgICAgICB0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGluaXRpYWxTdGF0ZS5iaW5kKHRoaXMpXG4gICAgICAgICAgOiBpbml0aWFsU3RhdGU7XG4gICAgICB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyA9XG4gICAgICAgIHR5cGVvZiBjb21wdXRlZFByb3BlcnRpZXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gY29tcHV0ZWRQcm9wZXJ0aWVzLmJpbmQodGhpcylcbiAgICAgICAgICA6IGNvbXB1dGVkUHJvcGVydGllcztcbiAgICAgIHRoaXMubGl2ZUF0dHJpYnV0ZXMgPSBsaXZlQXR0cmlidXRlcztcblxuICAgICAgZm9yIChjb25zdCBkZWYgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmxpdmVBdHRyaWJ1dGVzKSkge1xuICAgICAgICBpZiAoZGVmLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgZGVmLm9uQ2hhbmdlID0gZGVmLm9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVmLnJlZmxlY3QpIHtcbiAgICAgICAgICBkZWYucmVmbGVjdCA9IGRlZi5yZWZsZWN0LmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ/LmJpbmQodGhpcykgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5iZWZvcmVVcGRhdGUgPSBiZWZvcmVVcGRhdGU/LmJpbmQodGhpcykgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5hZnRlclVwZGF0ZSA9IGFmdGVyVXBkYXRlPy5iaW5kKHRoaXMpID8/IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZmluYWxpemUgPSBmaW5hbGl6ZT8uYmluZCh0aGlzKSA/PyB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm9uRXJyb3IgPSBvbkVycm9yPy5iaW5kKHRoaXMpID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgQ29tcG9uZW50LnJlZ2lzdGVyKGNscywgdGFnbmFtZSk7XG5cbiAgcmV0dXJuIGNscztcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUE0Q0EsU0FBUyxXQUFXLENBQUMsTUFBaUI7QUFBQSxFQUNwQyxNQUFNLGlCQUE0QztBQUFBLEtBQy9DLG9CQUFzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNdEIsc0JBQXdCO0FBQUE7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
|
|
2039
|
+
//# debugId=D9A90808356EA17464756E2164756E21
|
|
2040
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2Vycm9ycy50cyIsICJzcmMvc3RhdGUvc3RhdGUudHMiLCAic3JjL3V0aWwvbHJ1LWNhY2hlLnRzIiwgInNyYy91dGlsL2ZyYWdtZW50cy50cyIsICJzcmMvdXRpbC9hdHRyaWJ1dGVzLnRzIiwgInNyYy91dGlsL2VsZW1lbnQtbWF0Y2gudHMiLCAic3JjL3V0aWwvZG9tLnRzIiwgInNyYy90ZW1wbGF0ZS9jb25zdGFudC50cyIsICJzcmMvdGVtcGxhdGUvc3ludGF4LnRzIiwgInNyYy90ZW1wbGF0ZS91dGlsLnRzIiwgInNyYy90ZW1wbGF0ZS9jb21waWxlLnRzIiwgInNyYy9oZWxwZXIvY3NzLnRzIiwgInNyYy9oZWxwZXIvaHRtbC50cyIsICJzcmMvdGVtcGxhdGUvam9icy9jb21tb24udHMiLCAic3JjL3RlbXBsYXRlL2pvYnMvYXR0cmlidXRlLnRzIiwgInNyYy90ZW1wbGF0ZS9qb2JzL2NvbmRpdGlvbmFsLnRzIiwgInNyYy90ZW1wbGF0ZS9qb2JzL2xpc3QudHMiLCAic3JjL3RlbXBsYXRlL2pvYnMvc3dhcC50cyIsICJzcmMvdGVtcGxhdGUvam9icy90YWcudHMiLCAic3JjL3RlbXBsYXRlL2pvYnMvaW5kZXgudHMiLCAic3JjL3RlbXBsYXRlL3ByZXBhcmUudHMiLCAic3JjL3RlbXBsYXRlL3RlbXBsYXRlLnRzIiwgInNyYy90YXNrLXNjaGVkdWxlci50cyIsICJzcmMvY29tcG9uZW50L2RlbGVnYXRvci50cyIsICJzcmMvY29tcG9uZW50L2NvbXBvbmVudC50cyIsICJzcmMvY29tcG9uZW50L2ZhY3RvcnkudHMiLCAic3JjL2RldnRvb2xzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuLyoqXG4gKiBQb3NzaWJsZSBlcnJvciB0eXBlcyBmb3Ige0BsaW5rIFBhbGV0dGVFcnJvcn1cbiAqXG4gKiBDb2RlcyBhcmUgY2F0ZWdvcml6ZWQgaW50byBncm91cHMgYnkgdGhlIDEwMCdzOlxuICpcbiAqIC0gMCAtIDk5OiBJbnZhcmlhbnRzXG4gKiAtIDEwMCAtIDE5OTogQ3VzdG9tIEVsZW1lbnRzIC8gRW52aXJvbm1lbnQgRXJyb3JzXG4gKiAtIDIwMCAtIDI5OTogVGVtcGxhdGluZyBFcnJvcnNcbiAqIC0gMzAwIC0gMzk5OiBSdW50aW1lIEVycm9yc1xuICovXG5leHBvcnQgY29uc3QgZW51bSBFcnJvckNvZGUge1xuICAvLyAwIC0gOTk6IEludmFyaWFudHNcbiAgSU5WQVJJQU5UID0gMCxcbiAgSU5WQUxJRF9FTlYgPSAxLFxuICBJTlZBTElEX0NBTExTSVRFID0gMixcbiAgTUlTU0lOR19OT0RFX1JFRiA9IDMsXG5cbiAgLy8gMTAwIC0gMTk5OiBDdXN0b20gRWxlbWVudHMgRXJyb3JzXG4gIElOVkFMSURfVEFHTkFNRSA9IDEwMCxcblxuICAvLyAyMDAgLSAyOTk6IFRlbXBsYXRlIEVycm9yc1xuICBURU1QTEFURV9JTlZBTElEX1ZBTFVFID0gMjAwLFxuICBURU1QTEFURV9JTlZBTElEX05PVEFUSU9OX1NZTlRBWCA9IDIwMSxcbiAgVEVNUExBVEVfTUlTU0lOR19OT1RBVElPTiA9IDIwMixcbiAgVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlQgPSAyMDMsXG4gIFRFTVBMQVRFX0lOVkFMSURfTElTVF9EQVRBID0gMjA0LFxuICBURU1QTEFURV9NSVNTSU5HX0xJU1RfS0VZID0gMjA1LFxuICBURU1QTEFURV9EVVBMSUNBVEVfTElTVF9LRVkgPSAyMDYsXG4gIFRFTVBMQVRFX0lOVkFMSURfQ09ORElUSU9OQUwgPSAyMDcsXG4gIFRFTVBMQVRFX0lOVkFMSURfS0VZX0RJUkVDVElWRSA9IDIwOCxcbiAgVEVNUExBVEVfUEFSRU5UX1JFUVVJUkVEID0gMjA5LFxuXG4gIC8vIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAgTUlTU0lOR19FTEVNRU5UID0gMzAwLFxuICBNSVNTSU5HX1NUQVRFID0gMzAxLFxuICBJTlZBTElEX0NPTlRFTlQgPSAzMDIsXG4gIElOVkFMSURfU1RBVEVfS0VZID0gMzAzLFxuICBJTlZBTElEX1NUQVRFX1VQREFURSA9IDMwNCxcbiAgU1RBVEVfTE9DS0VEID0gMzA1LFxuICBNQVhfU0VRVUVOVElBTF9SRU5ERVJTID0gMzA2LFxufVxuXG5mdW5jdGlvbiBnZXREZXZFcnJvcihjb2RlOiBFcnJvckNvZGUpIHtcbiAgY29uc3QgREVWX0VSUk9SX0lORk86IFJlY29yZDxFcnJvckNvZGUsIHN0cmluZz4gPSB7XG4gICAgW0Vycm9yQ29kZS5JTlZBUklBTlRdOiBgXG5JTlZBUklBTlRcbkEgY29uZGl0aW9uIGhhcyBvY2N1cnJlZCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBzdWNoIGFzIGEgY29kZSBwYXRoIHRoYXRcbnNob3VsZG4ndCBiZSByZWFjaGFibGUgd2hlbiB1c2luZyBjb3JyZWN0IHR5cGVzLCBvciBhIGRpc2FsbG93ZWQgc3RhdGUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0VOVl06IGBcbklOVkFMSURfRU5WXG5GYWlsZWQgdG8gZmluZCBhIGN1c3RvbSBlbGVtZW50cyByZWdpc3RyeSBpbiB0aGlzIGVudmlyb25tZW50LiBJcyBhIHdpbmRvd1xuZ2xvYmFsIGF2YWlsYWJsZSB3aXRoIGEgY3VzdG9tRWxlbWVudHMgcHJvcGVydHk/XG5gLFxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9DQUxMU0lURV06IGBcbklOVkFMSURfQ0FMTFNJVEVcbkEgZnVuY3Rpb24gd2FzIGludm9rZWQgd2l0aCBhbiBpbnZhbGlkIHNldCBvZiBwYXJhbWV0ZXJzLiAgIFxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9UQUdOQU1FXTogYFxuSU5WQUxJRF9UQUdOQU1FXG5GYWlsZWQgdG8gZGV0ZXJtaW5lIGEgdmFsaWQgSFRNTCBUYWcgdG8gdXNlIHdoZW4gcmVnaXN0ZXJpbmcgYSBjb21wb25lbnQgYXMgYVxuY3VzdG9tIGVsZW1lbnQuIFNwZWNpZnkgYSBzdGF0aWMgcmVhZG9ubHkgdGFnTmFtZSBwcm9wZXJ0eSBvbiB5b3VyIGNvbXBvbmVudFxuY2xhc3Mgb3IgcHJvdmlkZSBhIHRhZ05hbWUgYXJndW1lbnQgdG8gQ29tcG9uZW50LnJlZ2lzdGVyLlxuXG5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRpcmVjdGx5IHJlZ2lzdGVyIHlvdXIgZWxlbWVudCBhcyB5b3Ugd291bGQgYW55IG90aGVyXG5IVE1MIGN1c3RvbSBlbGVtZW50OiBjdXN0b21FbGVtZW50cy5kZWZpbmUoXCJteS10YWdcIiwgTXlDb21wb25lbnRDbGFzcyk7XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5NSVNTSU5HX0VMRU1FTlRdOiBgXG5NSVNTSU5HX0VMRU1FTlRcbkFuIGVsZW1lbnQgd2FzIGV4cGVjdGVkIHRvIGV4aXN0IGJ1dCB3YXMgbm90IGZvdW5kIHdoZW4gdGhlIERPTSB3YXMgcXVlcmllZC5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEVdOiBgXG5NSVNTSU5HX1NUQVRFXG5BIENvbXBvbmVudCdzIHJlYWN0aXZlIHN0YXRlIHdhcyBhY2Nlc3NlZCwgYnV0IG5vIGluaXRpYWxTdGF0ZSBpcyBkZWZpbmVkIGZvclxudGhlIENvbXBvbmVudCdzIGNsYXNzLiBJbml0aWFsIHN0YXRlIG11c3QgYmUgZGVmaW5lZCBhcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24uXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0NPTlRFTlRdOiBgXG5JTlZBTElEX0NPTlRFTlRcblRyaWVkIHRvIHNldCBhIHZhbHVlIGFzIGNvbnRlbnQgaW4gYSB0ZW1wbGF0ZSwgYnV0IHRoZSB2YWx1ZSB3YXMgbm90IGEgc3VwcG9ydGVkXG50eXBlLiBWYWx1ZXMgbXVzdCBiZSBhIHN0cmluZywgSFRNTEVsZW1lbnQuXG5cbkluc3RlYWQsIGdvdCAlczogJXMuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX1ZBTFVFXTogYFxuVEVNUExBVEVfSU5WQUxJRFxuVGhlIHZhbHVlICVzIGNhbm5vdCBiZSBpbnRlcnBvbGF0ZWQgdmlhIHRoZSBUZW1wbGF0ZSBodG1sIHN0cmluZyBoZWxwZXIuXG5WYWx1ZXMgbWF5IG9ubHkgYmUgSFRNTFRlbXBsYXRlRWxlbWVudHMgKHRlbXBsYXRlIGNvbnRlbnQgaXMgYWRvcHRlZCkgb3JcbnN0cmluZ3MgKHNob3J0aGFuZCBmb3IgYSA6OnN3YXAgZGlyZWN0aXZlIG9uIGFuIGVsZW1lbnQpXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OX1NZTlRBWF06IGBcblRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05cbkEgdGVtcGxhdGUgdmFsdWUgbm90YXRpb24gZmFpbGVkIHRvIHBhcnNlLiBOb3RhdGlvbnMgbXVzdCBiZWdpbiB3aXRoIG9uZSBvZlxuQCwgJCwgKiwgb3IgIywgZm9sbG93ZWQgYnkgYSBkb3Qtc2VwYXJhdGVkIHBhdGggb2YgYWNjZXNzb3IgbmFtZXMuIE9wdGlvbmFsbHksXG5ub3RhdGlvbnMgbWF5IGhhdmUgbW9kaWZpZXJzIHN1Y2ggYXMgdGhlICEgbW9kaWZpZXIuXG5cblRoZSBub3RhdGlvbiB0aGF0IGZhaWxlZCB0byBwYXJzZSB3YXMgXCIlc1wiXG5gLFxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlRdOiBgXG5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVFxuRmFpbGVkIHRvIGludGVycG9sYXRlIGEgQ29tcG9uZW50IGluIGFuIGh0bWwgdGVtcGxhdGUgc3RyaW5nIGR1ZSB0byB0aGVcbkNvbXBvbmVudCBoYXZpbmcgYW4gaW52YWxpZCB0YWdOYW1lIHByb3BlcnR5LlxuXG5Db21wb25lbnQgXCIlc1wiIGhhcyBhbiBpbnZhbGlkIHRhZ05hbWUgcHJvcGVydHkgXCIlc1wiXG4gICAgYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9MSVNUX0RBVEFdOiBgXG5URU1QTEFURV9JTlZBTElEX0xJU1RcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIHJlbmRlciBiZWNhdXNlIGFuIDo6ZWFjaCBkaXJlY3RpdmUgZmV0Y2hlZCBhIHZhbHVlIHdoaWNoXG53YXMgbm90IGFuIGFycmF5IG9mIGFjdGlvbmFibGUgZGF0YS5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfTk9ERV9SRUZdOiBgXG5URU1QTEFURV9JTlZBTElEX05PREVfUkVGXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBwcmVwYXJlIGEgbm9kZSBmcm9tIGEgY29tcGlsZWQgc291cmNlLiBUeXBpY2FsbHksIHRoaXNcbm1lYW5zIHNvbWV0aGluZyBpcyBicm9rZW4gd2l0aGluIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSByYXRoZXIgdGhhbiBhbiBlcnJvciB3aXRoXG50aGUgdGVtcGxhdGUgY29udGVudCBpdHNlbGYuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9NSVNTSU5HX0xJU1RfS0VZXTogYFxuVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWVxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gY29tcGlsZSBiZWNhdXNlIGFuIDo6ZWFjaCBkaXJlY3RpdmUgd2FzIGZvdW5kIG9uIGFuIGVsZW1lbnRcbndpdGhvdXQgYSBjb3JyZXNwb25kaW5nIDo6a2V5IGRpcmVjdGl2ZS4gOjplYWNoIGRpcmVjdGl2ZXMgbXVzdCBoYXZlIGEgOjprZXlcbmRpcmVjdGl2ZSBzcGVjaWZpZWQgb24gdGhlIHNhbWUgZWxlbWVudCwgd2hvc2Ugbm90YXRpb24gZXZhbHVhdGVzIHRvIGEgdW5pcXVlXG52YWx1ZSBmb3IgZWFjaCBpdGVtIGluIHRoZSBsaXN0LlxuXG5FeGFtcGxlOiA8bGkgOjplYWNoPVwiJGl0ZW1zXCIgOjprZXk9XCIjaWRcIj4gLi4uIDwvbGk+XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9EVVBMSUNBVEVfTElTVF9LRVldOiBgXG5URU1QTEFURV9EVVBMSUNBVEVfTElTVF9LRVlcbkEgbGlzdCBmYWlsZWQgdG8gcmVuZGVyIGJlY2F1c2UgaXRlbSBrZXkgJXMgYXBwZWFyZWQgbXVsdGlwbGUgdGltZXMgd2hlblxucmVzb2x2aW5nIGxpc3QgaXRlbSBrZXlzLiBFYWNoIDo6a2V5IGRpcmVjdGl2ZSBtdXN0IHJlZmVyZW5jZSBhIG5vdGF0aW9uIHdob3NlXG52YWx1ZSBpcyB1bmlxdWUgZm9yIGVhY2ggbGlzdCBpdGVtLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9DT05ESVRJT05BTF06IGBcblRFTVBMQVRFX0lOVkFMSURfQ09ORElUSU9OQUxcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgZHVlIHRvIGFuIGludmFsaWQgdXNlIG9mIGNvbmRpdGlvbmFsIGRpcmVjdGl2ZXMuXG5cbkNvbmRpdGlvbmFsIGVsZW1lbnRzIG11c3QgYmUgc2libGluZ3MuIFRoZSBmaXJzdCBjb25kaXRpb25hbCBicmFuY2ggbXVzdCB1c2UgYW5cbjo6aWYgZGlyZWN0aXZlLCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgOjplbHNlLWlmIGRpcmVjdGl2ZXMsIGFuZCBmaW5hbGx5IHplcm9cbm9yIG9uZSA6OmVsc2UgZGlyZWN0aXZlLlxuXG46OmlmIGFuZCA6OmVsc2UtaWYgZGlyZWN0aXZlcyBtdXN0IHNwZWNpZnkgYSBub3RhdGlvbiB0byBldmFsdWF0ZS4gOjplbHNlIGRvZXNcbm5vdCB0YWtlIGFueSB2YWx1ZXMgYW5kIGlzIGp1c3QgYSBiaW5hcnkgYXR0cmlidXRlLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19OT1RBVElPTl06IGBcblRFTVBMQVRFX01JU1NJTkdfTk9UQVRJT05cbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgYmVjYXVzZSBhICVzIGRpcmVjdGl2ZSBkaWQgbm90IGhhdmUgYW4gYXNzb2NpYXRlZFxubm90YXRpb24gZGVzcGl0ZSByZXF1aXJpbmcgb25lLlxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9LRVldOiBgXG5JTlZBTElEX1NUQVRFX0tFWVxuVHJpZWQgdG8gYWNjZXNzIGEgc3RhdGUgcHJvcGVydHkgd2hpY2ggZG9lcyBub3QgZXhpc3RcblxuS2V5IHBhdGg6ICVzXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1NUQVRFX1VQREFURV06IGBcbklOVkFMSURfU1RBVEVfVVBEQVRFXG5BIENvbXBvbmVudCdzIHNldFN0YXRlKCkgd2FzIGNhbGxlZCB3aXRoIGEgdmFsdWUgd2hpY2ggY291bGQgbm90IGJlIHBhdGNoZWQgaW5cbnRvIHRoZSBleGlzdGluZyBjb21wb25lbnQgc3RhdGUuXG5cbnNldFN0YXRlKCkgdGFrZXMgYSBwYXJ0aWFsIG9iamVjdCBkZXNjcmliaW5nIHN0YXRlIGtleXMgdG8gdXBkYXRlLlxuXG5JbnN0ZWFkLCByZWNlaXZlZDogJXNcbmAsXG5cbiAgICBbRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRF06IGBcblNUQVRFX0xPQ0tFRFxuQSBTdGF0ZSByZWNlaXZlZCBhIHJlcXVlc3QgdG8gdXBkYXRlIG9yIGxvY2sgd2hpbGUgYWxyZWFkeSBsb2NrZWQuXG5TdGF0ZXMgbWF5IGJlIGxvY2tlZCB1c2luZyB0aGUgLmxvY2soKSBtZXRob2QgYW5kIHVubG9ja2VkIHVzaW5nIHRoZSAudW5sb2NrKClcbm1ldGhvZC4gU3RhdGVzIGxvY2sgZHVyaW5nIGFzeW5jIG11dGF0aW9ucyBkb25lIHRocm91Z2ggdGhlIC5tdXRhdGVBc3luYygpXG5tZXRob2QgaWYgXCJ0cnVlXCIgaXMgcGFzc2VkIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLlxuXG5Zb3UgY2FuIGNoZWNrIHRoZSBsb2NrIHN0YXR1cyBvZiBhIFN0YXRlIGluc3RhbmNlIHdpdGggLmlzTG9ja2VkXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5NQVhfU0VRVUVOVElBTF9SRU5ERVJTXTogYFxuTUFYX1NFUVVFTlRJQUxfUkVOREVSU1xuQSBjb21wb25lbnQgaGFzIGVycm9yZWQgYWZ0ZXIgcmUtcmVuZGVyaW5nIG1vcmUgdGhhbiAlcyB0aW1lcyBpbiB0aGUgc2FtZSBmcmFtZS5cblxuVGhpcyB0eXBpY2FsbHkgaGFwcGVucyBiZWNhdXNlIHN0YXRlIG9yIGxpdmUgYXR0cmlidXRlcyBhcmUgYmVpbmcgbW9kaWZpZWRcbmR1cmluZyBhIHJlbmRlciBsaWZlY3ljbGUgbWV0aG9kIHN1Y2ggYXMgYmVmb3JlVXBkYXRlKCkgb3IgYWZ0ZXJVcGRhdGUoKS4gSWZcbnN0YXRlIGNoYW5nZXMgdW5jb25kaXRpb25hbGx5IGR1cmluZyBhIHJlbmRlciwgdGhlIHJlbmRlciB3aWxsIGluZmluaXRlbHkgbG9vcC5cblVwZGF0aW5nIHJlbmRlciBzb3VyY2UgZGF0YSBkdXJpbmcgYSByZW5kZXIgY3ljbGUgaXMgc3VwcG9ydGVkLCBidXQgaW5maW5pdGVcbnVwZGF0ZSBsb29wcyBtYXkgb2NjdXIgaWYgdW5jaGVja2VkLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9LRVlfRElSRUNUSVZFXTogYFxuVEVNUExBVEVfSU5WQUxJRF9LRVlfRElSRUNUSVZFXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBjb21waWxlIGJlY2F1c2UgYSA6OmtleSBkaXJlY3RpdmUgd2FzIGZvdW5kIG9uIGFuIGVsZW1lbnRcbndpdGggbm8gYXNzb2NpYXRlZCA6OmVhY2ggZGlyZWN0aXZlLiA6OmtleSBkaXJlY3RpdmVzIGNhbiBvbmx5IGJlIHVzZWQgaW5cbmFzc29jaWF0aW9uIHdpdGggbGlzdCByZW5kZXJpbmcgdmlhIDo6ZWFjaC5cbmAsXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9QQVJFTlRfUkVRVUlSRURdOiBgXG5URU1QTEFURV9QQVJFTlRfUkVRVUlSRURcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgZHVlIHRvIGFuIGVsZW1lbnQgd2hpY2ggcmVxdWlyZXMgYSBwYXJlbnQgaGF2aW5nXG5ubyBhdmFpbGFibGUgcGFyZW50IGluIHRoZSB0ZW1wbGF0ZS5cblxuOjplYWNoIGFuZCA6OmlmLzo6ZWxzZS1pZi86OmVsc2UgZWxlbWVudHMgbXVzdCBoYXZlIGEgcGFyZW50IG5vZGUuXG5gLFxuICB9O1xuXG4gIHJldHVybiBERVZfRVJST1JfSU5GT1tjb2RlXTtcbn1cblxuLyoqXG4gKiBBbiBlcnJvciBvcmlnaW5hdGluZyBmcm9tIHdpdGhpbiBhIFBhbGV0dGUgc3Vic3lzdGVtLlxuICpcbiAqIEluIHRoZSBgZGV2ZWxvcG1lbnRgIGVudmlyb25tZW50LCB0aGUgZXJyb3Igd2lsbCBzdXJmYWNlIHdpdGggZXh0ZW5kZWQgaW5mb1xuICogYWJvdXQgdGhlIGVycm9yIGFuZCBhbnkgZGV0YWlscyB3aGljaCBtYXkgYmUgcmVsZXZhbnQgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAqXG4gKiBJbiB0aGUgYHByb2R1Y3Rpb25gIGVudmlyb25tZW50LCBhIG1pbmltYWwgZXJyb3Igb25seSBzdXJmYWNpbmcgdGhlIG51bWVyaWNcbiAqIGVycm9yIGNvZGUgaXMgdGhyb3duIGluc3RlYWQuXG4gKlxuICogQ29kZXMgYXJlIGNhdGVnb3JpemVkIGludG8gZ3JvdXBzIGJ5IHRoZSAxMDAnczpcbiAqXG4gKiAtIDAgLSA5OTogSW52YXJpYW50c1xuICogLSAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyAvIEVudmlyb25tZW50IEVycm9yc1xuICogLSAyMDAgLSAyOTk6IFRlbXBsYXRpbmcgRXJyb3JzXG4gKiAtIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFBhbGV0dGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgbmFtZSA9IFwiUGFsZXR0ZUVycm9yXCI7XG4gIGNvZGU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb2RlOiBudW1iZXIsIC4uLnZhbHVlczogc3RyaW5nW10pIHtcbiAgICBsZXQgbWVzc2FnZSA9IGBDb2RlOiAke2NvZGV9YDtcbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgbWVzc2FnZSArPSBnZXREZXZFcnJvcihjb2RlKTtcblxuICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoYCVzYCwgU3RyaW5nKHZhbCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5cbmV4cG9ydCB0eXBlIFN0YXRlTGlzdGVuZXI8U2hhcGU+ID0gKHN0YXRlOiBTaGFwZSkgPT4gdm9pZDtcblxuY29uc3QgQXJyYXlNdXRhdG9yRnVuY3Rpb25zID0gbmV3IFNldChbXG4gIFwicHVzaFwiLFxuICBcInBvcFwiLFxuICBcInNoaWZ0XCIsXG4gIFwidW5zaGlmdFwiLFxuICBcInNwbGljZVwiLFxuICBcInNvcnRcIixcbiAgXCJyZXZlcnNlXCIsXG4gIFwiZmlsbFwiLFxuICBcImNvcHlXaXRoaW5cIixcbl0pO1xuXG5jb25zdCBEYXRhU3RydWN0dXJlTXV0YXRvckZ1bmN0aW9ucyA9IG5ldyBTZXQoW1xuICBcImFkZFwiLFxuICBcImRlbGV0ZVwiLFxuICBcImNsZWFyXCIsXG4gIFwic2V0XCIsXG5dKTtcblxuLyoqXG4gKiBQb3dlcmZ1bCBhbmQgZmxleGlibGUgc3RhdGUgbWFuYWdlbWVudCB3aXRoIGRlZXAgcmVhY3Rpdml0eSwgdHJhbnNhY3Rpb24sIGFuZFxuICogbG9ja2luZyBzdXBwb3J0LlxuICpcbiAqIFRoZSBTdGF0ZSBjbGFzcyB3cmFwcyBzdGF0ZWZ1bCBkYXRhIGFuZCBwcm92aWRlcyBhbiBBUEkgZm9yIG11dGF0aW5nIHRoZSBkYXRhXG4gKiB3aGlsZSBsaXN0ZW5lcnMgc3Vic2NyaWJlIHRvIG1lYW5pbmdmdWwgdXBkYXRlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXRlPFNoYXBlIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHN0YXRpYyBpc1N0YXRlPFQgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU3RhdGU8VD4ge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdGF0ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9kYXRhOiBTaGFwZTtcbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBTZXQ8U3RhdGVMaXN0ZW5lcjxTaGFwZT4+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIF9wcm94eT86IFNoYXBlO1xuICBwcml2YXRlIF9wcm94eUNhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBhbnk+KCk7XG4gIHByaXZhdGUgX3JldmVyc2VQcm94eUNhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBvYmplY3Q+KCk7XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbERhdGE6IFNoYXBlLCBsaXN0ZW5lcj86IFN0YXRlTGlzdGVuZXI8U2hhcGU+KSB7XG4gICAgdGhpcy5fZGF0YSA9IGluaXRpYWxEYXRhO1xuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExhemlseSBjcmVhdGUgYW5kIGNhY2hlIHByb3hpZXMgaW50byB0aGUgc3RhdGUgZm9yIHJlYWN0aXZlIHVwZGF0ZXMgb25cbiAgICogbmVzdGVkIHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZVByb3h5PFQ+KHRhcmdldDogVCwgcGF0aDogc3RyaW5nW10gPSBbXSk6IFQge1xuICAgIC8vIFJldHVybiBwcmltaXRpdmVzIGltbWVkaWF0ZWx5XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBhIGNhY2hlZCBwcm94eSBmb3IgdGhpcyBvYmplY3RcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLl9wcm94eUNhY2hlLmdldCh0YXJnZXQgYXMgb2JqZWN0KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgcHJveHkgYW5kIGNhY2hlIGl0XG4gICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0IGFzIG9iamVjdCwge1xuICAgICAgZ2V0OiAob2JqLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICAvLyBTeW1ib2xzIC0+IERpcmVjdCByZXR1cm5cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgICByZXR1cm4gKG9iaiBhcyBhbnkpW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IChvYmogYXMgYW55KVtrZXldO1xuXG4gICAgICAgIC8vIEZvciBBcnJheXMsIE1hcHMsIGFuZCBTZXRzLCBoYW5kbGUgbXV0YXRvciBmdW5jdGlvbnMgY29ycmVjdGx5XG4gICAgICAgIGlmIChcbiAgICAgICAgICAob2JqIGluc3RhbmNlb2YgU2V0IHx8IG9iaiBpbnN0YW5jZW9mIE1hcCB8fCBBcnJheS5pc0FycmF5KG9iaikpICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbXV0YXRpb25GbnMgPSBBcnJheS5pc0FycmF5KG9iailcbiAgICAgICAgICAgID8gQXJyYXlNdXRhdG9yRnVuY3Rpb25zXG4gICAgICAgICAgICA6IERhdGFTdHJ1Y3R1cmVNdXRhdG9yRnVuY3Rpb25zO1xuICAgICAgICAgIGNvbnN0IGlzTXV0YXRpb24gPSBtdXRhdGlvbkZucy5oYXMoa2V5KTtcblxuICAgICAgICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5zbmFwc2hvdCgpO1xuXG4gICAgICAgICAgICBsZXQgY3VycmVudDogYW55ID0gc25hcHNob3Q7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBwYXRoKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXMgPSAoY3VycmVudCBhcyBhbnkpW2tleV0oLi4uYXJncyk7XG5cbiAgICAgICAgICAgIGlmIChpc011dGF0aW9uKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKHNuYXBzaG90KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT2JqZWN0cyAtPiByZWN1cnNpdmVseSBjcmVhdGUgYSBwcm94eVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVByb3h5KHZhbHVlLCBbLi4ucGF0aCwga2V5XSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmltaXRpdmVzIC0+IFJldHVybiB2YWx1ZVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuXG4gICAgICBzZXQ6IChfb2JqLCBrZXk6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBEaXNhbGxvdyBzZXR0aW5nIHN5bWJvbCBwcm9wZXJ0aWVzIG9uIHRhcmdldCBkYXRhIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgYW5kIHVwZGF0ZSB0aGUgcGF0aCB3aXRoIHRoZSB2YWx1ZVxuICAgICAgICBjb25zdCBuZXdQYXRoID0gWy4uLnBhdGgsIGtleV07XG4gICAgICAgIHRoaXMuX3NldE5lc3RlZChuZXdQYXRoLCB0aGlzLl91bndyYXBQcm94eSh2YWx1ZSkpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgaGFzOiAob2JqLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICByZXR1cm4ga2V5IGluIG9iajtcbiAgICAgIH0sXG5cbiAgICAgIG93bktleXM6IChvYmopID0+IHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhvYmopO1xuICAgICAgfSxcblxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAob2JqLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSk7XG5cbiAgICAgICAgaWYgKGRlc2MpIHtcbiAgICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgIH0sXG5cbiAgICAgIGRlbGV0ZVByb3BlcnR5OiAob2JqLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgfHwgIShrZXkgaW4gb2JqKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgYW5kIHVwZGF0ZSB0aGUgcGF0aCB3aXRoIHRoZSB2YWx1ZVxuICAgICAgICBjb25zdCBuZXdQYXRoID0gWy4uLnBhdGgsIGtleV07XG5cbiAgICAgICAgdGhpcy5fc2V0TmVzdGVkKG5ld1BhdGgsIHVuZGVmaW5lZCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgIH0pIGFzIFQ7XG5cbiAgICB0aGlzLl9wcm94eUNhY2hlLnNldCh0YXJnZXQgYXMgb2JqZWN0LCBwcm94eSk7XG4gICAgdGhpcy5fcmV2ZXJzZVByb3h5Q2FjaGUuc2V0KHByb3h5IGFzIG9iamVjdCwgdGFyZ2V0IGFzIG9iamVjdCk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG5cbiAgcHJpdmF0ZSBfdW53cmFwUHJveHk8VD4odmFsdWU6IFQpOiBUIHtcbiAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgcHJpbWl0aXZlc1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG9uZSBvZiBvdXIgcHJveGllc1xuICAgIGNvbnN0IHJhd1RhcmdldCA9IHRoaXMuX3JldmVyc2VQcm94eUNhY2hlLmdldCh2YWx1ZSBhcyBvYmplY3QpO1xuICAgIGlmIChyYXdUYXJnZXQpIHtcbiAgICAgIHJldHVybiByYXdUYXJnZXQgYXMgVDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiB0aGlzLl91bndyYXBQcm94eShpdGVtKSkgYXMgVDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcGxhaW4gb2JqZWN0c1xuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICBjb25zdCB1bndyYXBwZWQ6IGFueSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24odmFsdWUsIGtleSkpIHtcbiAgICAgICAgICB1bndyYXBwZWRba2V5XSA9IHRoaXMuX3Vud3JhcFByb3h5KCh2YWx1ZSBhcyBhbnkpW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdW53cmFwcGVkO1xuICAgIH1cblxuICAgIC8vIE90aGVyIG9iamVjdHMgKERhdGUsIE1hcCwgU2V0LCBldGMuKSBwYXNzIHRocm91Z2hcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNldHRpbmcgbmVzdGVkIHZhbHVlcyBhbmQgZW1pdHRpbmcgdXBkYXRlZCBkYXRhIGlmIHRoZSB2YWx1ZSBjaGFuZ2VkXG4gICAqL1xuICBwcml2YXRlIF9zZXROZXN0ZWQocGF0aDogc3RyaW5nW10sIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBOb3RoaW5nIHRvIGRvIHdpdGggZW1wdHkgcGF0aHNcbiAgICBpZiAoIXBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgYXQgdGhlIHJvb3QgYW5kIHNlZWsgdG8gdGhlIHZhbHVlIGJlaW5nIHNldFxuICAgIGxldCBjdXJyZW50OiBhbnkgPSB0aGlzLl9kYXRhO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcGF0aFtpXSA/PyBcIlwiO1xuXG4gICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfS0VZLCBwYXRoLmpvaW4oXCIuXCIpKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbEtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA/PyBcIlwiO1xuXG4gICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9LRVksIHBhdGguam9pbihcIi5cIikpO1xuICAgIH1cblxuICAgIC8vIFNldCBhbmQgZW1pdCBvbmx5IGlmIHRoZSB2YWx1ZSBpcyBkaWZmZXJlbnQuIE90aGVyd2lzZSBuby1vcC5cbiAgICBpZiAoY3VycmVudFtmaW5hbEtleV0gIT09IHZhbHVlICYmICFPYmplY3QuaXMoY3VycmVudFtmaW5hbEtleV0sIHZhbHVlKSkge1xuICAgICAgY3VycmVudFtmaW5hbEtleV0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX2VtaXQodGhpcy5yYXcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFuIGluY29taW5nIHBhcnRpYWwgc3RhdGUgYW5kIGVtaXQgdXBkYXRlcyB0byBsaXN0ZW5lcnMgaWYgdGhlcmVcbiAgICogYXJlIGFueSBjaGFuZ2VzIGRldGVjdGVkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBPYmplY3QuaXMoKSB0byBjaGVjayBmb3IgZGlmZmVyZW5jZXMuIERvZXMgbm90IGF0dGVtcHQgZGVlcCBkaWZmaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc0luY29taW5nU3RhdGUgPSAoXG4gICAgaW5jb21pbmdTdGF0ZTogUGFydGlhbDxTaGFwZT4sXG4gICk6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGluY29taW5nU3RhdGUgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgIGluY29taW5nU3RhdGUgPT09IG51bGwgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkoaW5jb21pbmdTdGF0ZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5JTlZBTElEX1NUQVRFX1VQREFURSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoaW5jb21pbmdTdGF0ZSksXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgaWYgYW55IGtleS92YWx1ZSBwYWlyIG9uIHRoZSBpbmNvbWluZyBzdGF0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAgLy8gZXhpc3RpbmcgZGF0YVxuICAgIGZvciAoY29uc3QgW2tleSwgbmV3VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluY29taW5nU3RhdGUpKSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLl9kYXRhW2tleSBhcyBrZXlvZiBTaGFwZV07XG4gICAgICBpZiAoIU9iamVjdC5pcyhjdXJyZW50VmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgKHRoaXMuX2RhdGEgYXMgYW55KVtrZXldID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIHRoaXMuX2VtaXQodGhpcy5fZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gYWxsIGxpc3RlbmVyc1xuICAgKi9cbiAgcHJpdmF0ZSBfZW1pdCA9IChkYXRhOiBTaGFwZSk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXRlXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBzdGF0ZS4gSXQgaXMgbWFya2VkIGFzIFJlYWRvbmx5XG4gICAqIHRvIGhlbHAgcHJldmVudCBhY2NpZGVudGFsIGNoYW5nZXMuIE5ldmVyIGVkaXQgdGhpcyB2YWx1ZSBkaXJlY3RseS5cbiAgICovXG4gIGdldCByYXcoKTogUmVhZG9ubHk8U2hhcGU+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXZlIHJlYWN0aXZlIGFjY2Vzc29yIGZvciBzdGF0ZSBkYXRhLiBEZWVwbHkgbmVzdGVkIGNoYW5nZXMgdHJpZ2dlclxuICAgKiBhdXRvbWF0aWMgdXBkYXRlcywgaW5jbHVkaW5nIGFycmF5LCBNYXAsIGFuZCBTZXQgbXV0YXRpb25zLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGb3IgZGVlcGx5IG5lc3RlZCB2YWx1ZXMsIHRoZSBgLmxpdmVgIGFjY2Vzc29yIG1heSBhZGQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWRcbiAgICogY29tcGFyZWQgdG8gZGlyZWN0bHkgYWNjZXNzaW5nIHRoZSB2YWx1ZSB2aWEgYC5jdXJyZW50YFxuICAgKi9cbiAgZ2V0IGxpdmUoKTogU2hhcGUge1xuICAgIGlmICghdGhpcy5fcHJveHkpIHtcbiAgICAgIHRoaXMuX3Byb3h5ID0gdGhpcy5fY3JlYXRlUHJveHkodGhpcy5fZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcm94eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciB3aGVuIHRoaXMgc3RhdGUgY2hhbmdlcy5cbiAgICpcbiAgICogTGlzdGVuZXJzIGFyZSBpbnZva2VkIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZWdpc3RlcmVkIGFuZCBhcmUgcGFzc2VkIGFcbiAgICogcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbGx5IG1hbmFnZWQgc3RhdGUgb2JqZWN0IGFzIGEgcmVhZG9ubHkgb2JqZWN0LlxuICAgKlxuICAgKiAqKkRvIG5vdCBtb2RpZnkgc3RhdGUgdmFsdWVzIGRpcmVjdGx5KiouIEluc3RlYWQsIHVzZSB7QGxpbmsgc2V0fSBvclxuICAgKiB7QGxpbmsgcGF0Y2h9IHRvIG1ha2UgaW1tdXRhYmxlIHVwZGF0ZXMuXG4gICAqL1xuICBhZGRMaXN0ZW5lciA9IChsaXN0ZW5lcjogU3RhdGVMaXN0ZW5lcjxTaGFwZT4pOiB2b2lkID0+IHtcbiAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHN0YXRlIGhhbmRsZXJcbiAgICovXG4gIHJlbW92ZUxpc3RlbmVyID0gKGxpc3RlbmVyOiBTdGF0ZUxpc3RlbmVyPFNoYXBlPik6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2xpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgYSBzaW5nbGUgdmFsdWUgZnJvbSB0aGUgc3RhdGUgb2JqZWN0XG4gICAqXG4gICAqIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBhcyBSZWFkb25seSB0byBwcmV2ZW50IGFjY2lkZW50YWwgc3RhdGUgbXV0YXRpb25zLlxuICAgKiBUbyBtdXRhdGUgc3RhdGVmdWwgcHJvcGVydGllcywgdXNlIHtAbGluayBzZXR9IG9yIHtAbGluayBwYXRjaH0gaW5zdGVhZC5cbiAgICovXG4gIGdldCA9IDxLIGV4dGVuZHMga2V5b2YgU2hhcGU+KGtleTogSyk6IFJlYWRvbmx5PFNoYXBlW0tdPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFba2V5XSBhcyBSZWFkb25seTxTaGFwZVtLXT47XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHRoZSBjdXJyZW50IHN0YXRlIGRhdGEgdXNpbmcgYHN0cnVjdHVyZWRDbG9uZSgpYCB0b1xuICAgKiBtYWtlIHRoZSBjb3B5LlxuICAgKlxuICAgKiBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiBjYW4gYmUgZWRpdGVkIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZVxuICAgKiBhY3R1YWwgaW50ZXJuYWwgc3RhdGUuXG4gICAqIGBgYFxuICAgKi9cbiAgc25hcHNob3QgPSAoKTogU2hhcGUgPT4ge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fZGF0YSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBhIHNpbmdsZSBzdGF0ZWZ1bCBwcm9wZXJ0eSB3aGlsZSBsZWF2aW5nIG90aGVyIHByb3BlcnRpZXMgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUcmlnZ2VycyBhbiB1cGRhdGUgdG8gYWxsIGxpc3RlbmVycyBpZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gYmVmb3JlXG4gICAqIHdoZW4gY29tcGFyZWQgdXNpbmcgc2hhbGxvdyBlcXVhbGl0eS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7IGNvdW50OiAxLCBjb2xvcjogXCJyZWRcIiB9KTtcbiAgICogc3RhdGUuc2V0KFwiY291bnRcIiwgMik7IC8vIFN0YXRlIGlzIG5vdyB7IGNvdW50OiAyLCBjb2xvcjogXCJyZWRcIiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0ID0gPEsgZXh0ZW5kcyBrZXlvZiBTaGFwZT4oa2V5OiBLLCB2YWx1ZTogU2hhcGVbS10pOiBTdGF0ZTxTaGFwZT4gPT4ge1xuICAgIGNvbnN0IHBhcnRpYWw6IFBhcnRpYWw8U2hhcGU+ID0ge307XG4gICAgcGFydGlhbFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKHBhcnRpYWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgbXVsdGlwbGUgc3RhdGVmdWwgcHJvcGVydGllcyBhdCBvbmNlLCBsZWF2aW5nIG9taXR0ZWQgcHJvcGVydGllc1xuICAgKiB1bmNoYW5nZWQuXG4gICAqL1xuICBwYXRjaCA9IChwYXRjaDogUGFydGlhbDxTaGFwZT4pOiBTdGF0ZTxTaGFwZT4gPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShwYXRjaCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHJlcGxhY2UgdGhlIGN1cnJlbnQgc3RhdGUgZGF0YSBhbmQgZm9yY2UgYW4gdXBkYXRlXG4gICAqL1xuICByZXBsYWNlID0gKHN0YXRlOiBTaGFwZSk6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgdGhpcy5fZGF0YSA9IHN0YXRlO1xuICAgIHRoaXMuX2VtaXQodGhpcy5fZGF0YSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFwcGx5IGNvbXBsZXggdXBkYXRlcyB0byB0aGUgc3RhdGUgdXNpbmcgYSBtdXRhdG9yIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUaGUgbXV0YXRvciBmdW5jdGlvbiB0YWtlcyBvbmUgcGFyYW1ldGVyIHdoaWNoIGlzIGEgc3RydWN0dXJlZENsb25lIGNvcHkgb2ZcbiAgICogdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LiBXaGF0ZXZlciBpcyByZXR1cm5lZCBieSB0aGUgbXV0YXRvciBpcyB0aGVuXG4gICAqIHBhdGNoZWQgaW4gdG8gdGhlIHN0YXRlLlxuICAgKi9cbiAgbXV0YXRlID0gKG11dGF0b3I6IChjdXJyZW50OiBTaGFwZSkgPT4gU2hhcGUpOiBTdGF0ZTxTaGFwZT4gPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShtdXRhdG9yKHRoaXMuc25hcHNob3QoKSkpO1xuICB9O1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbnR5cGUgTWV0cmljcyA9IHtcbiAgaGl0czogbnVtYmVyO1xuICBtaXNzZXM6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIExSVUNhY2hlTWV0cmljcyA9IHtcbiAgbG9va3VwczogbnVtYmVyO1xuICBoaXRzOiBudW1iZXI7XG4gIG1pc3NlczogbnVtYmVyO1xuICBjYXBhY2l0eTogbnVtYmVyO1xuICBlbnRyaWVzOiBudW1iZXI7XG4gIGhpdFJhdGU6IG51bWJlcjtcbn07XG5cbi8qKlxuICogQSBzaW1wbGUgaW4tbWVtb3J5IExSVSBDYWNoZSB1c2luZyBKYXZhU2NyaXB0IG1hcHMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBDYWNoZWQgbmV0d29yayByZXF1ZXN0XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQSBjYWNoZSBvZiBBUEkgVVJMcyB0byB0aGVpciByZXR1cm5lZCBwYXlsb2Fkc1xuICogY29uc3QgY2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBBUElQYXlsb2FkPigpO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0KHVybDogc3RyaW5nKSB7XG4gKiAgIGxldCBjYWNoZWQgPSBjYWNoZS5nZXQodXJsKTtcbiAqICAgaWYgKGNhY2hlZCkge1xuICogICAgIHJldHVybiBjYWNoZWQ7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIC4uLiBNYWtlIHRoZSByZXF1ZXN0IGFuZCBjYWNoZS5zZXQoKSB0aGUgcmVzcG9uc2VcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTFJVQ2FjaGU8SywgVj4ge1xuICBwcml2YXRlIF9tYXhTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgX2RhdGE6IE1hcDxLLCBWPjtcbiAgcHJpdmF0ZSBfbWV0cmljczogTWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG5cbiAgY29uc3RydWN0b3IobWF4U2l6ZTogbnVtYmVyID0gNTAwKSB7XG4gICAgaWYgKG1heFNpemUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTFJVIENhY2hlIGNhcGFjaXR5IG11c3QgYmUgPj0gMVwiKTtcbiAgICB9XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgdGhpcy5fbWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy5fZGF0YSA9IG5ldyBNYXA8SywgVj4oKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyaW0gPSAoKSA9PiB7XG4gICAgd2hpbGUgKHRoaXMuX2RhdGEuc2l6ZSA+IHRoaXMuX21heFNpemUpIHtcbiAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5fZGF0YS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKGZpcnN0S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdXJkXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YS5kZWxldGUoZmlyc3RLZXkpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IGNhY2hlIHBlcmZvcm1hbmNlIG1ldHJpY3MgZnJvbSB0aGlzIExSVSBDYWNoZSBpbnN0YW5jZS5cbiAgICpcbiAgICogSW4gZGV2ZWxvcG1lbnQgbW9kZSwgdGhpcyByZXR1cm5zIGluc2lnaHRzIGludG8gaGl0cy9taXNzZXMgb2YgdGhlIGNhY2hlLFxuICAgKiBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYW5kIGVudHJ5IGNvdW50LlxuICAgKlxuICAgKiBJbiBwcm9kdWN0aW9uIG1vZGUsIHRoaXMgcmV0dXJucyBhIHBsYWNlaG9sZGVyIG9iamVjdCwgYXMgbWV0cmljIGNvbGxlY3Rpb25cbiAgICogaXMgbm90IGFjdGl2ZSBpbiBwcm9kdWN0aW9uLlxuICAgKi9cbiAgZ2V0TWV0cmljcygpOiBMUlVDYWNoZU1ldHJpY3MgfCB2b2lkIHtcbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgY29uc3QgeyBoaXRzID0gMCwgbWlzc2VzID0gMCB9ID0gdGhpcy5fbWV0cmljcyA/PyB7fTtcbiAgICAgIGNvbnN0IGxvb2t1cHMgPSBoaXRzICsgbWlzc2VzO1xuICAgICAgY29uc3QgaGl0UmF0ZSA9IGxvb2t1cHMgPT09IDAgPyAwIDogaGl0cyAvIGxvb2t1cHM7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvb2t1cHMsXG4gICAgICAgIGhpdHM6IGhpdHMsXG4gICAgICAgIG1pc3NlczogbWlzc2VzLFxuICAgICAgICBjYXBhY2l0eTogdGhpcy5fbWF4U2l6ZSxcbiAgICAgICAgZW50cmllczogdGhpcy5fZGF0YS5zaXplLFxuICAgICAgICBoaXRSYXRlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBtYXhpbXVtIGNhY2hlIHNpemUgZm9yIHRoaXMgaW5zdGFuY2UuIEltbWVkaWF0ZWx5IHRyaWdnZXJzIGFcbiAgICogcHVyZ2Ugb2YgY2FjaGVkIGNvbnRlbnRzIGlmIHRoZSBuZXcgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50XG4gICAqIG51bWJlciBvZiBjYWNoZWQgZW50cmllcy5cbiAgICovXG4gIHNldENhcGFjaXR5ID0gKG1heFNpemU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChtYXhTaXplIDw9IDAgJiYgX19ERVZfXykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltQYWxldHRlIExSVSBDYWNoZV0gQ2FjaGUgc2l6ZSBpcyA8PSAwLiBDYWNoZSBpcyBkaXNhYmxlZC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy5fdHJpbSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHZhbHVlIGZyb20gdGhlIGNhY2hlLCByZXR1cm5pbmcgYHVuZGVmaW5lZGAgaWYgbm8gdmFsdWUgd2FzIGZvdW5kXG4gICAqL1xuICBnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9kYXRhLmdldChrZXkpO1xuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIHRoaXMuX21ldHJpY3MubWlzc2VzICs9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBhbmQgcmUtc2V0IHRoZSB2YWx1ZSB0byBtb3ZlIHRoZSBrZXkgdG8gdGhlIGVuZCBvZiB0aGUga2V5IGxpc3RcbiAgICB0aGlzLl9kYXRhLmRlbGV0ZShrZXkpO1xuICAgIHRoaXMuX2RhdGEuc2V0KGtleSwgdmFsdWUpO1xuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHRoaXMuX21ldHJpY3MuaGl0cyArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSB2YWx1ZSBpbiB0aGUgY2FjaGUuIFRoaXMgYWxzbyBtb3ZlcyB0aGUgdmFsdWUgdG8gdGhlIGJhY2sgb2YgdGhlIGxpc3RcbiAgICogb2YgdmFsdWVzIHRvIGNvbnNpZGVyIGV2aWN0aW5nIHdoZW4gdGhlIGNhY2hlIGlzIGZ1bGwuXG4gICAqL1xuICBzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBpZiBleGlzdHMgdG8gdXBkYXRlIHBvc2l0aW9uXG4gICAgaWYgKHRoaXMuX2RhdGEuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuX2RhdGEuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICBpZiAodGhpcy5fZGF0YS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xuICAgICAgdGhpcy5fdHJpbSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgY29udGVudHMgb2YgdGhpcyBjYWNoZSBpbnN0YW5jZVxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBjYWNoZSBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zaXplO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExSVUNhY2hlO1xuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCBMUlVDYWNoZSBmcm9tIFwiLi9scnUtY2FjaGVcIjtcblxuZXhwb3J0IGNvbnN0IGZyYWdtZW50Q2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBEb2N1bWVudEZyYWdtZW50PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gaHRtbFRvRnJhZ21lbnQoaHRtbDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIGNvbnN0IGxvb2t1cCA9IGZyYWdtZW50Q2FjaGUuZ2V0KGh0bWwpO1xuXG4gIGlmIChsb29rdXAgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBsb29rdXAuY2xvbmVOb2RlKHRydWUpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gIH1cblxuICBjb25zdCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wLmlubmVySFRNTCA9IGh0bWw7XG4gIGZyYWdtZW50Q2FjaGUuc2V0KGh0bWwsIHRlbXAuY29udGVudCk7XG4gIHJldHVybiB0ZW1wLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYXZlRnJhZ21lbnQoaHRtbDogc3RyaW5nLCBmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICBmcmFnbWVudENhY2hlLnNldChodG1sLCBmcmFnbWVudCk7XG59XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUF0dHJpYnV0ZShcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG4pOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50QXR0cmlidXRlcyhcbiAgc291cmNlOiBIVE1MRWxlbWVudCxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge307XG5cbiAgZm9yIChjb25zdCBuYW1lIG9mIHNvdXJjZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgYXR0cnNbbmFtZV0gPSBzZXJpYWxpemVBdHRyaWJ1dGUoc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gIH1cblxuICByZXR1cm4gYXR0cnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUVsZW1lbnRBdHRyaWJ1dGVzKFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBhdHRyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudE5hbWVzID0gbmV3IFNldCh0YXJnZXQuZ2V0QXR0cmlidXRlTmFtZXMoKSk7XG4gIGNvbnN0IGluY29taW5nTmFtZXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKGF0dHJzKSk7XG4gIGNvbnN0IGF0dHJpYnV0ZXNUb1JlbW92ZSA9IGN1cnJlbnROYW1lcy5kaWZmZXJlbmNlKGluY29taW5nTmFtZXMpO1xuXG4gIGZvciAoY29uc3QgYXR0ciBvZiBhdHRyaWJ1dGVzVG9SZW1vdmUpIHtcbiAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhhdHRycykpIHtcbiAgICBhcHBseUF0dHJpYnV0ZSh0YXJnZXQsIG5hbWUsIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QXR0cmlidXRlUmVjb3JkKFxuICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICBvdXRba2V5XSA9IHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuLyoqXG4gKiBDaGVjayBpZiBhIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIGh0bWwgdGFnbmFtZSwgb3B0aW1pemVkIGZvciBob3QgcGF0aHMuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZnVuY3Rpb24gYXZvaWRzIHVzaW5nIHRoZSByZWdleCBlbmdpbmUgZm9yIHBlcmZvcm1hbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RhZ05hbWUoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJBdChpKTtcblxuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGNoYXIgPT09IFwiLVwiIHx8XG4gICAgICAgIChjaGFyID49IFwiQVwiICYmIGNoYXIgPD0gXCJaXCIpIHx8XG4gICAgICAgIChjaGFyID49IFwiYVwiICYmIGNoYXIgPD0gXCJ6XCIpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQSBwZXJmb3JtYW5jZSBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBgLm1hdGNoZXMoKWAgd2hpY2ggaW5jbHVkZXMgZmFzdGVyXG4gKiBtYXRjaGluZyBzdHJhdGVnaWVzIGZvciBjb21tb24gcXVlcmllcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogT3B0aW1pemVkIHF1ZXJ5IHR5cGVzOlxuICpcbiAqIC0gU2luZ2xlIElEIHNlbGVjdG9yIGBcIiNpZGVudGlmaWVyXCJgXG4gKiAtIFNpbmdsZSBjbGFzcyBzZWxlY3RvciBgXCIuY2xhc3NuYW1lXCJgXG4gKiAtIFRhZ25hbWUgc2VsZWN0b3IgYFwiYnV0dG9uXCJgXG4gKiAtIFNpbXBsZSBhdHRyaWJ1dGUgc2VsZWN0b3IgYFwiW2F0dHI9J3ZhbHVlJ11cImBcbiAqXG4gKiBBbGwgb3RoZXIgdHlwZXMgb2YgcXVlcmllcyB1c2UgdGhlIGJhc2UgLm1hdGNoZXMoKSBmb3IgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudE1hdGNoZXMoZWxlbWVudDogRWxlbWVudCwgcXVlcnk6IHN0cmluZykge1xuICAvLyBJZiB0aGUgcXVlcnkgaXMgYSBzaW1wbGUgSUQsIGNoZWNrIGl0IGRpcmVjdGx5XG4gIGlmIChcbiAgICBxdWVyeVswXSA9PT0gXCIjXCIgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiLlwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiW1wiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiOlwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiPlwiKSA9PT0gLTFcbiAgKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuaWQgPT09IHF1ZXJ5LnNsaWNlKDEpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHF1ZXJ5IGlzIGEgc2ltcGxlIGNsYXNzbmFtZSwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKFxuICAgIHF1ZXJ5WzBdID09PSBcIi5cIiAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIgXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIjXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCJbXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI6XCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI+XCIpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMocXVlcnkuc2xpY2UoMSkpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHF1ZXJ5IGlzIGZvciBqdXN0IGEgdGFnbmFtZSwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKGlzVGFnTmFtZShxdWVyeSkpIHtcbiAgICByZXR1cm4gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2luZ2xlIHNlbGVjdG9yIHZhbHVlLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoXG4gICAgcXVlcnlbMF0gPT09IFwiW1wiICYmXG4gICAgcXVlcnlbcXVlcnkubGVuZ3RoIC0gMV0gPT09IFwiXVwiICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiBcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIjpcIikgPT09IC0xXG4gICkge1xuICAgIGNvbnN0IGF0dHIgPSBxdWVyeS5zbGljZSgxLCAtMSk7XG4gICAgY29uc3QgZXFJbmRleCA9IGF0dHIuaW5kZXhPZihcIj1cIik7XG4gICAgaWYgKGVxSW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cik7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0ci5zbGljZSgwLCBlcUluZGV4KTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhdHRyLnNsaWNlKGVxSW5kZXggKyAxKS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpO1xuICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyTmFtZSkgPT09IGF0dHJWYWx1ZTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwgdXNlIG5hdGl2ZSBgLm1hdGNoZXNgIGZvciBjb21wbGV4IHN0dWZmXG4gIHJldHVybiBlbGVtZW50Lm1hdGNoZXMocXVlcnkpO1xufVxuIiwKICAgICJ0eXBlIFdhbGtlckZuID0gKG5vZGU6IE5vZGUpID0+IGJvb2xlYW4gfCB2b2lkO1xuXG4vKipcbiAqIFdhbGsgdXAgdGhlIHBhcmVudCBub2RlcyBmcm9tIGEgdGFyZ2V0IGNoaWxkIGVsZW1lbnQgYW5kIGludm9rZSBhIGZ1bmN0aW9uXG4gKiBvbiBlYWNoIG5vZGUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgYSBub2RlLCBleGVjdXRpb24gd2lsbFxuICogc3RvcCBhbmQgdGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gcmV0dXJuIGB0cnVlYC4gSWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90XG4gKiByZXR1cm4gdHJ1ZSwgaXQgd2lsbCBjb250aW51ZSB3YWxraW5nIHVwIHRoZSBwYXJlbnQgbm9kZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWxrUGFyZW50cyh0YXJnZXQ6IE5vZGUsIGZuOiBXYWxrZXJGbik6IGJvb2xlYW4ge1xuICBsZXQgY3VycmVudDogTm9kZSB8IG51bGwgPSB0YXJnZXQucGFyZW50Tm9kZTtcblxuICB3aGlsZSAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGZuKGN1cnJlbnQpO1xuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzU2hhZG93Um9vdChjdXJyZW50KSkge1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQuaG9zdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFbGVtZW50IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hUTUxFbGVtZW50KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSFRNTEVsZW1lbnQge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hUTUxUZW1wbGF0ZUVsZW1lbnQoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgSFRNTFRlbXBsYXRlRWxlbWVudCB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnRcbiAgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NoYWRvd1Jvb3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTaGFkb3dSb290IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBTaGFkb3dSb290XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBOb2RlIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1lbnQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb21tZW50IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBDb21tZW50XG4gICk7XG59XG4iLAogICAgImV4cG9ydCBjb25zdCBSRUZfQVRUUiA9IFwiZGF0YS1ub2RlLXJlZlwiO1xuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gXCIjdXRpbFwiO1xuXG5jb25zdCBlbnVtIE5vdGF0aW9uUHJlZml4IHtcbiAgQXR0cmlidXRlcyA9IFwiQFwiLFxuICBTdGF0ZSA9IFwiJFwiLFxuICBEYXRhID0gXCIqXCIsXG4gIEl0ZW0gPSBcIiNcIixcbn1cblxuY29uc3QgUFJFRklYX01BUFBJTkc6IFJlY29yZDxOb3RhdGlvblByZWZpeCwgc3RyaW5nPiA9IHtcbiAgW05vdGF0aW9uUHJlZml4LkF0dHJpYnV0ZXNdOiBcImF0dHJcIixcbiAgW05vdGF0aW9uUHJlZml4LlN0YXRlXTogXCJzdGF0ZVwiLFxuICBbTm90YXRpb25QcmVmaXguRGF0YV06IFwiZGF0YVwiLFxuICBbTm90YXRpb25QcmVmaXguSXRlbV06IFwiaXRlbVwiLFxufTtcblxuY29uc3QgcHJlZml4TWFwcGluZyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoUFJFRklYX01BUFBJTkcpKTtcblxuZXhwb3J0IHR5cGUgUGFyc2VkTm90YXRpb24gPSB7XG4gIC8qKiBUaGUgcmF3IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyc2VkIG5vdGF0aW9uICovXG4gIGJhc2U6IHN0cmluZztcblxuICAvKiogQW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgZm9ybWluZyBhIHBhdGggdG8gdGhlIG5vdGF0aW9uIHZhbHVlICovXG4gIHBhdGg6IHN0cmluZ1tdO1xuXG4gIG1vZGlmaWVycz86IHtcbiAgICBub3Q/OiBib29sZWFuO1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlZE5vdGF0aW9uQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBQYXJzZWROb3RhdGlvbj4oKTtcblxuLyoqXG4gKiBQYXJzZSBhIG5vdGF0aW9uIGludG8gYW4gb2JqZWN0IHdpdGggcnVudGltZSBpbmZvcm1hdGlvblxuICpcbiAqIEByZW1hcmtzXG4gKiBGb3VyIG5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkOlxuICpcbiAqIC0gYEBhdHRybmFtZWAgLT4gUm9vdCBlbGVtZW50IGF0dHJpYnV0ZXNcbiAqIC0gYCRzdGF0ZXZhbHVlYCAtPiBTdGF0ZWZ1bCBjb250ZW50XG4gKiAtIGAqcHJvcGVydHkub3Iud2hhdGV2ZXJgIC0+IENvbXB1dGVkIGRhdGEgcHJvcGVydGllc1xuICogLSBgI2NvbG9yYCAtPiBMaXN0IGl0ZW0gcHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOb3RhdGlvbihub3RhdGlvbjogc3RyaW5nKTogUGFyc2VkTm90YXRpb24ge1xuICBjb25zdCBjYWNoZWQgPSBwYXJzZWROb3RhdGlvbkNhY2hlLmdldChub3RhdGlvbik7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIHByZWZpeCBtb2RpZmllcnNcbiAgbGV0IG5vdE1vZGlmaWVyID0gZmFsc2U7XG5cbiAgbGV0IHBhdGhQYXJ0ID0gXCJcIjtcbiAgY29uc3QgY29tcHV0ZWRQYXRoOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGxldCBpc0ZpcnN0ID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBjaGFyIG9mIG5vdGF0aW9uKSB7XG4gICAgLy8gISBhdCBwb3NpdGlvbiAwIC0+IEVuYWJsZSBOT1QgbW9kaWZpZXIsIGRvbnQgY291bnQgdG93YXJkcyBpZHhcbiAgICBpZiAoaXNGaXJzdCAmJiBjaGFyID09PSBcIiFcIikge1xuICAgICAgbm90TW9kaWZpZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgcG9zaXRpb24gMCBtdXN0IGJlIGEgcHJlZml4XG4gICAgZWxzZSBpZiAoaXNGaXJzdCkge1xuICAgICAgY29uc3QgcHJlZml4ID0gcHJlZml4TWFwcGluZy5nZXQoY2hhcik7XG5cbiAgICAgIGlmICghcHJlZml4KSB7XG4gICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05fU1lOVEFYLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb21wdXRlZFBhdGgucHVzaChwcmVmaXgpO1xuICAgICAgaXNGaXJzdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3QgY2hhcmFjdGVycyBhbmQgcHVzaCB3aGVuIGhpdHRpbmcgYSBkb3Qgb3IgZW5kXG4gICAgZWxzZSBpZiAoY2hhciA9PT0gXCIuXCIpIHtcbiAgICAgIGlmIChwYXRoUGFydC5sZW5ndGgpIHtcbiAgICAgICAgY29tcHV0ZWRQYXRoLnB1c2gocGF0aFBhcnQpO1xuICAgICAgICBwYXRoUGFydCA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgIEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OX1NZTlRBWCxcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aFBhcnQgKz0gY2hhcjtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdGhlIGZpbmFsIHBhcnQgd2hpY2ggbXVzdCBleGlzdCAob3RoZXJ3aXNlLCBpdCBlbmRlZCBpbiBhIGRvdClcbiAgaWYgKCFwYXRoUGFydC5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05fU1lOVEFYLFxuICAgICAgbm90YXRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGNvbXB1dGVkUGF0aC5wdXNoKHBhdGhQYXJ0KTtcblxuICBpZiAoY29tcHV0ZWRQYXRoLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05fU1lOVEFYLFxuICAgICAgbm90YXRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZE5vdGF0aW9uOiBQYXJzZWROb3RhdGlvbiA9IHtcbiAgICBiYXNlOiBub3RhdGlvbixcbiAgICBwYXRoOiBjb21wdXRlZFBhdGgsXG4gICAgbW9kaWZpZXJzOiBub3RNb2RpZmllciA/IHsgbm90OiB0cnVlIH0gOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgcGFyc2VkTm90YXRpb25DYWNoZS5zZXQobm90YXRpb24sIHBhcnNlZE5vdGF0aW9uKTtcblxuICByZXR1cm4gcGFyc2VkTm90YXRpb247XG59XG5cbmV4cG9ydCB0eXBlIE5vdGF0aW9uQWNjZXNzb3IgPSAoc291cmNlOiB1bmtub3duKSA9PiB1bmtub3duO1xuXG5leHBvcnQgY29uc3QgdmFsdWVBY2Nlc3NvckNhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVmFsdWVBY2Nlc3Nvcihub3RhdGlvbjogUGFyc2VkTm90YXRpb24pOiBOb3RhdGlvbkFjY2Vzc29yIHtcbiAgY29uc3QgeyBwYXRoLCBtb2RpZmllcnMsIGJhc2UgfSA9IG5vdGF0aW9uO1xuXG4gIGNvbnN0IGNhY2hlZCA9IHZhbHVlQWNjZXNzb3JDYWNoZS5nZXQoYmFzZSk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgaWYgKHBhdGgubGVuZ3RoIDwgMikge1xuICAgIC8vIE5vdGF0aW9ucyBtdXN0IGFsd2F5cyBoYXZlIGF0IGxlYXN0IDIgcGFydHM6IHRoZSBuYW1lc3BhY2UsIGFuZCBhdCBsZWFzdFxuICAgIC8vIG9uZSBwcm9wZXJ0eSBuYW1lIG9uIHRoZSBuYW1lc3BhY2UgKGV4YW1wbGU6IFtcInN0YXRlXCIsIFwidmlzaWJsZVwiXSlcbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICB9XG5cbiAgY29uc3QgYWNjZXNzb3IgPSAoc291cmNlOiB1bmtub3duKSA9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSBzb3VyY2U7XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aCkge1xuICAgICAgaWYgKCFjdXJyZW50IHx8IHR5cGVvZiBjdXJyZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0IGFzIGtleW9mIHR5cGVvZiBjdXJyZW50XTtcbiAgICB9XG5cbiAgICBpZiAobW9kaWZpZXJzPy5ub3QpIHtcbiAgICAgIGlmIChwYXRoWzBdID09PSBcImF0dHJcIikge1xuICAgICAgICByZXR1cm4gY3VycmVudCAhPT0gXCJcIiAmJiAhY3VycmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhY3VycmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfTtcblxuICB2YWx1ZUFjY2Vzc29yQ2FjaGUuc2V0KGJhc2UsIGFjY2Vzc29yKTtcblxuICByZXR1cm4gYWNjZXNzb3I7XG59XG4iLAogICAgImltcG9ydCB7IGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4vdGVtcGxhdGVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGh0bWxTdHJpbmdUb1RlbXBsYXRlKGh0bWw6IHN0cmluZyk6IFRlbXBsYXRlIHtcbiAgY29uc3QgZnJhZ21lbnQgPSBodG1sVG9GcmFnbWVudChodG1sKTtcbiAgY29uc3QgdGVtcGxhdGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wbGF0ZUVsZW1lbnQuY29udGVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gIHJldHVybiBuZXcgVGVtcGxhdGUodGVtcGxhdGVFbGVtZW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RPcGVyYWJsZU5vZGVzKFxuICBmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCxcbik6IEhUTUxFbGVtZW50W10ge1xuICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGZyYWdtZW50LCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gIGNvbnN0IGtub3duSWdub3JlcyA9IG5ldyBTZXQ8Tm9kZT4oKTtcbiAgY29uc3Qgbm9kZXM6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsID0gd2Fsa2VyLm5leHROb2RlKCk7XG5cbiAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XG4gICAgaWYgKCFpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSkge1xuICAgICAgY3VycmVudE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCBwYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIGxldCBpc0lub3BlcmFibGUgPSBmYWxzZTtcblxuICAgIHdoaWxlIChwYXJlbnQgJiYgIWlzSW5vcGVyYWJsZSkge1xuICAgICAgaWYgKFxuICAgICAgICBrbm93bklnbm9yZXMuaGFzKHBhcmVudCkgfHxcbiAgICAgICAgKGlzSFRNTEVsZW1lbnQocGFyZW50KSAmJlxuICAgICAgICAgIChwYXJlbnQuaGFzQXR0cmlidXRlKERpcmVjdGl2ZS5FYWNoKSB8fFxuICAgICAgICAgICAgcGFyZW50Lmhhc0F0dHJpYnV0ZShEaXJlY3RpdmUuSWYpIHx8XG4gICAgICAgICAgICBwYXJlbnQuaGFzQXR0cmlidXRlKERpcmVjdGl2ZS5FbHNlKSB8fFxuICAgICAgICAgICAgcGFyZW50Lmhhc0F0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZUlmKSkpXG4gICAgICApIHtcbiAgICAgICAgaXNJbm9wZXJhYmxlID0gdHJ1ZTtcbiAgICAgICAga25vd25JZ25vcmVzLmFkZChjdXJyZW50Tm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzSW5vcGVyYWJsZSkge1xuICAgICAgbm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgfVxuXG4gICAgY3VycmVudE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgfVxuXG4gIHJldHVybiBub2Rlcztcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgTFJVQ2FjaGUsIHNhdmVGcmFnbWVudCB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi91dGlsL2RvbVwiO1xuaW1wb3J0IHsgUkVGX0FUVFIgfSBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyB0eXBlIFBhcnNlZE5vdGF0aW9uLCBwYXJzZU5vdGF0aW9uIH0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQge1xuICB0eXBlIEFueVNjaGVtZSxcbiAgdHlwZSBBdHRyaWJ1dGVVcGRhdGVTY2hlbWUsXG4gIHR5cGUgQ29uZGl0aW9uYWxSZW5kZXJTY2hlbWUsXG4gIHR5cGUgQ29uZGl0aW9uYWxSZW5kZXJTY2hlbWVCcmFuY2gsXG4gIHR5cGUgQ29udGVudFN3YXBTY2hlbWUsXG4gIHR5cGUgTGlzdFJlbmRlclNjaGVtZSxcbiAgVXBkYXRlVHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNvbGxlY3RPcGVyYWJsZU5vZGVzIH0gZnJvbSBcIi4vdXRpbFwiO1xuXG5jb25zdCByZXF1aXJlc05vdGF0aW9uID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgRGlyZWN0aXZlLkVhY2gsXG4gIERpcmVjdGl2ZS5JZixcbiAgRGlyZWN0aXZlLkVsc2VJZixcbiAgRGlyZWN0aXZlLktleSxcbiAgRGlyZWN0aXZlLlN3YXAsXG4gIERpcmVjdGl2ZS5UYWcsXG5dKTtcblxuLyoqXG4gKiBBIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIFRlbXBsYXRlfSBpbnN0YW5jZSwgaW5jbHVkaW5nXG4gKiBldmVyeXRoaW5nIG5lZWRlZCB0byByZWNyZWF0ZSB0aGUgdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRUZW1wbGF0ZSB7XG4gIGh0bWw6IHN0cmluZztcbiAgc2NoZW1lczogQW55U2NoZW1lW107XG4gIG5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgUGFyc2VkTm90YXRpb24+O1xufVxuXG5leHBvcnQgY29uc3QgY29tcGlsZWRUZW1wbGF0ZUNhY2hlID0gbmV3IExSVUNhY2hlPFxuICBIVE1MVGVtcGxhdGVFbGVtZW50LFxuICBDb21waWxlZFRlbXBsYXRlXG4+KCk7XG5cbi8qKlxuICogQ29tcGlsZSBhbiB7QGxpbmsgSFRNTFRlbXBsYXRlRWxlbWVudH0gaW50byBhIHtAbGluayBDb21waWxlZFRlbXBsYXRlfSBmb3JcbiAqIGNhY2hpbmcsIGNsb25pbmcsIG9yIHN0b3JhZ2UuXG4gKlxuICogQ29tcGlsZWQgdGVtcGxhdGUgb2JqZWN0cyBjb250YWluIGEgSlNPTi1zZXJpYWxpemFibGUgZGF0YSByZXByZXNlbnRhdGlvbiBvZlxuICogYSB0ZW1wbGF0ZSBhbmQgY2FuIGJlIHByZXBhcmVkIHVzaW5nIHtAbGluayBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZX0gdG9cbiAqIGNyZWF0ZSBuZXcgVGVtcGxhdGUgaW5zdGFuY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcGlsZWQgPSBjb21waWxlVGVtcGxhdGUoJHRlbXBsYXRlRWxlbWVudCk7XG4gKiBjb25zdCBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KGNvbXBpbGVkKTsgLy8gYSBKU09OIHRlbXBsYXRlIGJ1bmRsZVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlVGVtcGxhdGUoc291cmNlOiBIVE1MVGVtcGxhdGVFbGVtZW50KTogQ29tcGlsZWRUZW1wbGF0ZSB7XG4gIC8vIENoZWNrIGlmIHRoZSB0ZW1wbGF0ZSBpcyBhbHJlYWR5IGNhY2hlZFxuICBjb25zdCBjYWNoZWRUZW1wbGF0ZSA9IGNvbXBpbGVkVGVtcGxhdGVDYWNoZS5nZXQoc291cmNlKTtcbiAgaWYgKGNhY2hlZFRlbXBsYXRlKSB7XG4gICAgcmV0dXJuIGNhY2hlZFRlbXBsYXRlO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkTm90YXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFBhcnNlZE5vdGF0aW9uPigpO1xuICBjb25zdCBjb21waWxlZFNjaGVtZXM6IEFueVNjaGVtZVtdID0gW107XG5cbiAgbGV0IG5leHROb2RlUmVmID0gMDtcbiAgY29uc3QgZW5zdXJlTm9kZVJlZiA9IChlbDogSFRNTEVsZW1lbnQpOiBzdHJpbmcgPT4ge1xuICAgIGxldCByZWYgPSBlbC5nZXRBdHRyaWJ1dGUoUkVGX0FUVFIpO1xuICAgIGlmICghcmVmKSB7XG4gICAgICByZWYgPSBgZWwtJHtuZXh0Tm9kZVJlZisrfWA7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUkVGX0FUVFIsIHJlZik7XG4gICAgfVxuICAgIHJldHVybiByZWY7XG4gIH07XG5cbiAgY29uc3QgY2xvbmVkVGVtcGxhdGVFbGVtZW50ID0gc291cmNlLmNvbnRlbnQuY2xvbmVOb2RlKFxuICAgIHRydWUsXG4gICkgYXMgRG9jdW1lbnRGcmFnbWVudDtcblxuICBjb25zdCBub2RlczogSFRNTEVsZW1lbnRbXSA9IGNvbGxlY3RPcGVyYWJsZU5vZGVzKGNsb25lZFRlbXBsYXRlRWxlbWVudCk7XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgY29uc3QgYWxsQXR0cmlidXRlc0Zvck5vZGUgPSBub2RlLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYWxsQXR0cmlidXRlc0Zvck5vZGUpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgIC8vIEJhaWwgcXVpY2tseSBpZiB0aGlzIGlzbid0IGEgZGlyZWN0aXZlXG4gICAgICBpZiAoYXR0cmlidXRlVmFsdWUgPT09IG51bGwgfHwgYXR0cmlidXRlTmFtZVswXSAhPT0gXCI6XCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4cGVjdCBhbnkgOjprZXkgdG8gaGF2ZSBhbiA6OmVhY2hcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuS2V5KSB7XG4gICAgICAgIGlmICghYWxsQXR0cmlidXRlc0Zvck5vZGUuaW5jbHVkZXMoRGlyZWN0aXZlLkVhY2gpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9LRVlfRElSRUNUSVZFKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIHJlcXVpcmVkIG5vdGF0aW9ucyBleGlzdFxuICAgICAgaWYgKHJlcXVpcmVzTm90YXRpb24uaGFzKGF0dHJpYnV0ZU5hbWUpICYmIGF0dHJpYnV0ZVZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTk9UQVRJT04sXG4gICAgICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5vdGF0aW9uID0gcGFyc2VkTm90YXRpb25zLmdldChhdHRyaWJ1dGVWYWx1ZSk7XG5cbiAgICAgIGlmIChub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vdGF0aW9uID0gcGFyc2VOb3RhdGlvbihhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgICAgIHBhcnNlZE5vdGF0aW9ucy5zZXQoYXR0cmlidXRlVmFsdWUsIG5vdGF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgIC8vIElmIHRoZSBzZWNvbmQgY2hhcmFjdGVyIGlzIG5vdCBhIGNvbG9uLCBpdCBpcyBhIGJpbmRpbmdcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lWzFdICE9PSBcIjpcIikge1xuICAgICAgICBjb25zdCBiaW5kTmFtZSA9IGF0dHJpYnV0ZU5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgY29uc3Qgc2NoZW1lOiBBdHRyaWJ1dGVVcGRhdGVTY2hlbWUgPSB7XG4gICAgICAgICAgdHlwZTogVXBkYXRlVHlwZS5BdHRyaWJ1dGUsXG4gICAgICAgICAgbm90YXRpb246IHBhcnNlTm90YXRpb24oYXR0cmlidXRlVmFsdWUpLFxuICAgICAgICAgIGF0dHJpYnV0ZTogYmluZE5hbWUsXG4gICAgICAgICAgbm9kZVJlZjogZW5zdXJlTm9kZVJlZihub2RlKSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb21waWxlZFNjaGVtZXMucHVzaChzY2hlbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBUQUcgQ0hBTkdFIFNDSEVNRVNcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgPT09IERpcmVjdGl2ZS5UYWcpIHtcbiAgICAgICAgY29tcGlsZWRTY2hlbWVzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuVGFnLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIG5vZGVSZWY6IGVuc3VyZU5vZGVSZWYobm9kZSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMSVNUIFJFTkRFUiBTQ0hFTUVTXG4gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuRWFjaCkge1xuICAgICAgICBjb25zdCBub2RlUmVmID0gZW5zdXJlTm9kZVJlZihub2RlKTtcblxuICAgICAgICAvLyBBIDo6a2V5IGRpcmVjdGl2ZSBpcyByZXF1aXJlZCB3aXRoIGFueSA6OmVhY2hcbiAgICAgICAgY29uc3Qga2V5Tm90YXRpb24gPSBub2RlLmdldEF0dHJpYnV0ZShEaXJlY3RpdmUuS2V5KTtcbiAgICAgICAgaWYgKGtleU5vdGF0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShEaXJlY3RpdmUuS2V5KTtcblxuICAgICAgICBjb25zdCBsaXN0Q29udGVudEh0bWwgPSBub2RlLmlubmVySFRNTDtcblxuICAgICAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NoZW1lOiBMaXN0UmVuZGVyU2NoZW1lID0ge1xuICAgICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuTGlzdCxcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBrZXlOb3RhdGlvbjogcGFyc2VOb3RhdGlvbihrZXlOb3RhdGlvbiksXG4gICAgICAgICAgbm9kZVJlZixcbiAgICAgICAgICBsaXN0Q29udGVudEh0bWwsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29tcGlsZWRTY2hlbWVzLnB1c2goc2NoZW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ09OVEVOVCBTV0FQIFNDSEVNRVNcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgPT09IERpcmVjdGl2ZS5Td2FwKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtZTogQ29udGVudFN3YXBTY2hlbWUgPSB7XG4gICAgICAgICAgdHlwZTogVXBkYXRlVHlwZS5Td2FwLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIG5vZGVSZWY6IGVuc3VyZU5vZGVSZWYobm9kZSksXG4gICAgICAgIH07XG5cbiAgICAgICAgY29tcGlsZWRTY2hlbWVzLnB1c2goc2NoZW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ09ORElUSU9OQUwgUkVOREVSIFNDSEVNRVNcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgPT09IERpcmVjdGl2ZS5JZikge1xuICAgICAgICBjb25zdCBzY2hlbWU6IENvbmRpdGlvbmFsUmVuZGVyU2NoZW1lID0ge1xuICAgICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuQ29uZGl0aW9uYWwsXG4gICAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEZpcnN0IGJyYW5jaCAtIHRoaXMgSUZcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoRGlyZWN0aXZlLklmKTtcbiAgICAgICAgY29uc3QgaWZCcmFuY2g6IENvbmRpdGlvbmFsUmVuZGVyU2NoZW1lQnJhbmNoID0ge1xuICAgICAgICAgIHR5cGU6IERpcmVjdGl2ZS5JZixcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBicmFuY2hSb290UmVmOiBlbnN1cmVOb2RlUmVmKG5vZGUpLFxuICAgICAgICAgIGJyYW5jaFRlbXBsYXRlSFRNTDogbm9kZS5pbm5lckhUTUwsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2NoZW1lLmJyYW5jaGVzLnB1c2goaWZCcmFuY2gpO1xuXG4gICAgICAgIGxldCBjb25kTm9kZSA9IG5vZGUubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgIC8vIENoZWNrIGZ1dHVyZSBub2RlcyBmb3IgZWxzZS1pZlxuICAgICAgICB3aGlsZSAoY29uZE5vZGU/Lmhhc0F0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZUlmKSkge1xuICAgICAgICAgIGlmICghaXNIVE1MRWxlbWVudChjb25kTm9kZSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJhc2VFbHNlSWZOb3RhdGlvbiA9IGNvbmROb2RlLmdldEF0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZUlmKTtcblxuICAgICAgICAgIGlmICghYmFzZUVsc2VJZk5vdGF0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgICAgICBFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19OT1RBVElPTixcbiAgICAgICAgICAgICAgRGlyZWN0aXZlLkVsc2VJZixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIG5vdGF0aW9uIGhhcyBiZWVuIHBhcnNlZCBiZWZvcmUsIHJldXNlIHRoYXRcbiAgICAgICAgICBsZXQgcGFyc2VkRWxzZUlmTm90YXRpb24gPSBwYXJzZWROb3RhdGlvbnMuZ2V0KGJhc2VFbHNlSWZOb3RhdGlvbik7XG5cbiAgICAgICAgICBpZiAocGFyc2VkRWxzZUlmTm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGFyc2VkRWxzZUlmTm90YXRpb24gPSBwYXJzZU5vdGF0aW9uKGJhc2VFbHNlSWZOb3RhdGlvbik7XG4gICAgICAgICAgICBwYXJzZWROb3RhdGlvbnMuc2V0KGJhc2VFbHNlSWZOb3RhdGlvbiwgcGFyc2VkRWxzZUlmTm90YXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbmROb2RlLnJlbW92ZUF0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZUlmKTtcblxuICAgICAgICAgIGNvbnN0IGVsc2VJZkJyYW5jaDogQ29uZGl0aW9uYWxSZW5kZXJTY2hlbWVCcmFuY2ggPSB7XG4gICAgICAgICAgICB0eXBlOiBEaXJlY3RpdmUuRWxzZUlmLFxuICAgICAgICAgICAgbm90YXRpb246IHBhcnNlZEVsc2VJZk5vdGF0aW9uLFxuICAgICAgICAgICAgYnJhbmNoUm9vdFJlZjogZW5zdXJlTm9kZVJlZihjb25kTm9kZSksXG4gICAgICAgICAgICBicmFuY2hUZW1wbGF0ZUhUTUw6IGNvbmROb2RlLmlubmVySFRNTCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2NoZW1lLmJyYW5jaGVzLnB1c2goZWxzZUlmQnJhbmNoKTtcbiAgICAgICAgICBjb25kTm9kZSA9IGNvbmROb2RlLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVsc2VcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmROb2RlICYmXG4gICAgICAgICAgaXNIVE1MRWxlbWVudChjb25kTm9kZSkgJiZcbiAgICAgICAgICBjb25kTm9kZT8uaGFzQXR0cmlidXRlKERpcmVjdGl2ZS5FbHNlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25kTm9kZS5yZW1vdmVBdHRyaWJ1dGUoRGlyZWN0aXZlLkVsc2UpO1xuXG4gICAgICAgICAgY29uc3QgZWxzZUJyYW5jaDogQ29uZGl0aW9uYWxSZW5kZXJTY2hlbWVCcmFuY2ggPSB7XG4gICAgICAgICAgICB0eXBlOiBEaXJlY3RpdmUuRWxzZSxcbiAgICAgICAgICAgIGJyYW5jaFJvb3RSZWY6IGVuc3VyZU5vZGVSZWYoY29uZE5vZGUpLFxuICAgICAgICAgICAgYnJhbmNoVGVtcGxhdGVIVE1MOiBjb25kTm9kZS5pbm5lckhUTUwsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHNjaGVtZS5icmFuY2hlcy5wdXNoKGVsc2VCcmFuY2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcGlsZWRTY2hlbWVzLnB1c2goc2NoZW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgYXR0cmlidXRlTmFtZSA9PT0gRGlyZWN0aXZlLkVsc2UgfHxcbiAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPT09IERpcmVjdGl2ZS5FbHNlSWZcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09ORElUSU9OQUwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUud2FybihgVGVtcGxhdGU6ICR7YXR0cmlidXRlTmFtZX0gaXMgbm90IGEgdmFsaWQgZGlyZWN0aXZlYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZE5vdGF0aW9uPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBwYXJzZWROb3RhdGlvbnMpIHtcbiAgICBub3RhdGlvbnNba2V5XSA9IHZhbDtcbiAgfVxuXG4gIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB0ZW1wLmFwcGVuZENoaWxkKGNsb25lZFRlbXBsYXRlRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICBjb25zdCBodG1sID0gdGVtcC5pbm5lckhUTUw7XG5cbiAgY29uc3QgY29tcGlsZWQ6IENvbXBpbGVkVGVtcGxhdGUgPSB7XG4gICAgaHRtbCxcbiAgICBzY2hlbWVzOiBjb21waWxlZFNjaGVtZXMsXG4gICAgbm90YXRpb25zLFxuICB9O1xuXG4gIC8vIENhY2hlIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBhbmQgaHRtbC9mcmFnbWVudCBjb21ibyB0byBwcmV2ZW50IG5lZWRpbmdcbiAgLy8gdG8gcmUtY3JlYXRlIHRoZSBmcmFnbWVudCBmcm9tIEhUTUwgYWdhaW4gd2hlbiBjb21waWxpbmcgYXQgcnVudGltZVxuICBjb21waWxlZFRlbXBsYXRlQ2FjaGUuc2V0KHNvdXJjZSwgY29tcGlsZWQpO1xuICBzYXZlRnJhZ21lbnQoaHRtbCwgY2xvbmVkVGVtcGxhdGVFbGVtZW50KTtcblxuICByZXR1cm4gY29tcGlsZWQ7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudCB9IGZyb20gXCIjY29tcG9uZW50XCI7XG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGlzVGFnTmFtZSB9IGZyb20gXCIjdXRpbFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDU1NUZW1wbGF0ZVN0cmluZ1ZhbHVlKFxuICB2YWw6IHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQsXG4pOiBzdHJpbmcge1xuICAvLyBDb252ZXJ0IGNvbXBvbmVudCByZWZzIHRvIHRoZWlyIHRhZ25hbWVzXG4gIGlmICh0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCB0YWdOYW1lID0gdmFsLnRhZ05hbWU7XG4gICAgaWYgKCFpc1RhZ05hbWUodGFnTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVCxcbiAgICAgICAgdmFsLm5hbWUsXG4gICAgICAgIHZhbC50YWdOYW1lLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ05hbWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX1ZBTFVFLCBTdHJpbmcodmFsKSk7XG59XG5cbi8qKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Yge0BsaW5rIENTU1N0eWxlU2hlZXR9cyBjb250YWluaW5nIHRoZSBwcm92aWRlZCBDU1NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzcyhcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIC4uLnZhbHVlczogKHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQ8YW55PilbXVxuKTogQ1NTU3R5bGVTaGVldCB7XG4gIGxldCByZXN1bHQgPSBzdHJpbmdzWzBdID8/IFwiXCI7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBuZXh0VmFsID0gdmFsdWVzW2ldID8/IFwiXCI7XG4gICAgY29uc3QgbmV4dFN0ciA9IHN0cmluZ3NbaSArIDFdID8/IFwiXCI7XG4gICAgcmVzdWx0ICs9IHBhcnNlQ1NTVGVtcGxhdGVTdHJpbmdWYWx1ZShuZXh0VmFsKTtcbiAgICByZXN1bHQgKz0gbmV4dFN0cjtcbiAgfVxuXG4gIGNvbnN0IHNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcbiAgc2hlZXQucmVwbGFjZVN5bmMocmVzdWx0KTtcbiAgcmV0dXJuIHNoZWV0O1xufVxuXG5leHBvcnQgdHlwZSBDbGFzc2lmeUlucHV0ID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgdW5kZWZpbmVkXG4gIHwgbnVsbFxuICB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgfCBDbGFzc2lmeUlucHV0W107XG5cbi8qKlxuICogR2l2ZW4gZmxleGlibGUgaW5wdXQsIGdlbmVyYXRlIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBzZXR0aW5nIGFzIGFuIGh0bWwgY2xhc3NcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzaWZ5KFwibXktY2xhc3NcIiwgXCJhbm90aGVyLWNsYXNzXCIpIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeShbXCJteS1jbGFzc1wiLCBcImFub3RoZXItY2xhc3NcIl0pIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeSh7IGVuYWJsZWQ6IHRydWUsIGRpc2FibGVkOiBmYWxzZSB9KSAvLyBcImVuYWJsZWRcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeSguLi5hcmdzOiBDbGFzc2lmeUlucHV0W10pOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0U3RyaW5nID0gXCJcIjtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IGFyZ3NbaW5kZXhdO1xuXG4gICAgaWYgKCFhcmd1bWVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gU3RyaW5ncy9udW1zIC0+IERpcmVjdCBhcHBlbmRcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBhcmd1bWVudCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICB9XG4gICAgICByZXN1bHRTdHJpbmcgKz0gYXJndW1lbnQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYXJyYXlzIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnQpKSB7XG4gICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSBjbGFzc2lmeSguLi5hcmd1bWVudCk7XG4gICAgICBpZiAobmVzdGVkUmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHRTdHJpbmcpIHtcbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0U3RyaW5nICs9IG5lc3RlZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvYmplY3RzIHdpdGggY29uZGl0aW9uYWwgY2xhc3MgbmFtZXNcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGNsYXNzTmFtZSBpbiBhcmd1bWVudCkge1xuICAgICAgICAvLyBPbmx5IGluY2x1ZGUgY2xhc3MgbmFtZSBpZiBpdHMgdmFsdWUgaXMgdHJ1dGh5XG4gICAgICAgIGlmIChhcmd1bWVudFtjbGFzc05hbWVdKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0U3RyaW5nICs9IFwiIFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFN0cmluZztcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiI2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgeyBpc1RhZ05hbWUgfSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB7IGlzSFRNTFRlbXBsYXRlRWxlbWVudCB9IGZyb20gXCIuLi91dGlsL2RvbVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUZW1wbGF0ZVN0cmluZ1ZhbHVlKFxuICB2YWw6IHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQgfCBIVE1MVGVtcGxhdGVFbGVtZW50LFxuKTogc3RyaW5nIHtcbiAgaWYgKGlzSFRNTFRlbXBsYXRlRWxlbWVudCh2YWwpKSB7XG4gICAgcmV0dXJuIHZhbC5pbm5lckhUTUw7XG4gIH1cblxuICBpZiAoQ29tcG9uZW50LmlzQ29tcG9uZW50Q2xhc3ModmFsKSkge1xuICAgIGNvbnN0IHRhZ05hbWUgPSB2YWwudGFnTmFtZTtcbiAgICBpZiAoIWlzVGFnTmFtZSh0YWdOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5ULFxuICAgICAgICB2YWwubmFtZSxcbiAgICAgICAgdmFsLnRhZ05hbWUsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnTmFtZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGA8c3BhbiA6OnN3YXA9XCIke3ZhbH1cIj48L3NwYW4+YDtcbiAgfVxuXG4gIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfVkFMVUUsIFN0cmluZyh2YWwpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4ge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IGZyb20gdGhlIHByb3ZpZGVkIEhUTUwgc3RyaW5nLlxuICpcbiAqIFRoZXNlIEhUTUwgVGVtcGxhdGVzIGNhbiBiZSB1c2VkIGFzIHN0YW5kYXJkIEhUTUwgVGVtcGxhdGVzLCBvciBhcyB0aGVcbiAqIGZvdW5kYXRpb24gZm9yIGEge0BsaW5rIENvbXBvbmVudH0gb3Igc3RhbmRhbG9uZSB7QGxpbmsgVGVtcGxhdGV9XG4gKlxuICogSW50ZXJwb2xhdGVzIHZhbHVlcyBpbiB0aGUgdGVtcGxhdGUgc3RyaW5nIHRvIHByb3ZpZGUgaGVscGVycyBmb3IgY29tcG9zaW5nXG4gKiB0ZW1wbGF0ZXM6XG4gKlxuICogLSBIVE1MVGVtcGxhdGVFbGVtZW50IHJlZmVyZW5jZXMgYXJlIHNlcmlhbGl6ZWQgdG8gSFRNTCBhbmQgaW5saW5lZFxuICogLSBTdHJpbmdzIGFyZSBtb2RpZmllZCB0byBiZWNvbWUgPHNwYW4+IHRhZ3Mgd2l0aCB0aGUgOjpzd2FwIGRpcmVjdGl2ZSBzZXRcbiAqICAgdG8gdGhlIHN0cmluZyB2YWx1ZS4gVGhpcyBpcyBoZWxwZnVsIHNob3J0aGFuZCBmb3IgY29udGVudCBwbGFjZWhvbGRlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBUaGlzIHRlbXBsYXRlIHN0cmluZ1xuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0ICR0ZW1wbGF0ZSA9IGh0bWxgXG4gKiA8ZGl2IDpjbGFzcz1cIipjbGFzc25hbWVzXCI+XG4gKiAgICR7XCJAY29udGVudFwifVxuICogPC9kaXY+XG4gKiBgXG4gKiBgYGBcbiAqXG4gKiBQcm9kdWNlcyB0aGlzIHRlbXBsYXRlIGVsZW1lbnQgKHBvcnRyYXllZCBhcyBIVE1MKVxuICpcbiAqIGBgYGh0bWxcbiAqIDx0ZW1wbGF0ZT5cbiAqICAgPGRpdiA6Y2xhc3M9XCIqY2xhc3NuYW1lc1wiPlxuICogICAgIDxzcGFuIDo6c3dhcD1cIkBjb250ZW50XCI+PC9zcGFuPlxuICogICA8L2Rpdj5cbiAqIDwvdGVtcGxhdGU+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh0bWwoXG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi52YWx1ZXM6IChcbiAgICB8IGBAJHtzdHJpbmd9YFxuICAgIHwgYCQke3N0cmluZ31gXG4gICAgfCBgIyR7c3RyaW5nfWBcbiAgICB8IGAqJHtzdHJpbmd9YFxuICAgIHwgSFRNTFRlbXBsYXRlRWxlbWVudFxuICAgIHwgdHlwZW9mIENvbXBvbmVudDxhbnk+XG4gIClbXVxuKTogSFRNTFRlbXBsYXRlRWxlbWVudCB7XG4gIGNvbnN0IGZ1bGxTdHJpbmcgPSBzdHJpbmdzLnJlZHVjZSgoYWNjLCBzdHIsIGkpID0+IHtcbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IHZhbHVlc1tpXVxuICAgICAgPyBgJHtwYXJzZVRlbXBsYXRlU3RyaW5nVmFsdWUodmFsdWVzW2ldKX1gXG4gICAgICA6IFwiXCI7XG4gICAgcmV0dXJuIGFjYyArIHN0ciArIHBhcnNlZFZhbHVlO1xuICB9LCBcIlwiKTtcblxuICBjb25zdCB0ZW1wbGF0ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSBmdWxsU3RyaW5nO1xuICByZXR1cm4gdGVtcGxhdGVFbGVtZW50O1xufVxuIiwKICAgICJleHBvcnQgY29uc3QgU0tJUFBFRF9KT0IgPSBTeW1ib2woXCJub29wXCIpO1xuZXhwb3J0IHR5cGUgU2tpcHBlZEpvYiA9IHR5cGVvZiBTS0lQUEVEX0pPQjtcbiIsCiAgICAiaW1wb3J0IHsgY2xhc3NpZnkgfSBmcm9tIFwiI2hlbHBlclwiO1xuaW1wb3J0IHsgYXBwbHlBdHRyaWJ1dGUsIHNlcmlhbGl6ZUF0dHJpYnV0ZSB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVVcGRhdGVQbGFuIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTS0lQUEVEX0pPQiwgdHlwZSBTa2lwcGVkSm9iIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5cbmV4cG9ydCB0eXBlIEF0dHJpYnV0ZVVwZGF0ZUpvYiA9IFtcbiAgbm9kZTogSFRNTEVsZW1lbnQsXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUF0dHJpYnV0ZUpvYihcbiAgcGxhbjogQXR0cmlidXRlVXBkYXRlUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IEF0dHJpYnV0ZVVwZGF0ZUpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgbGV0IHZhbHVlID0gdHlwZW9mIHJhd1ZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyByYXdWYWx1ZShwbGFuLm5vZGUpIDogcmF3VmFsdWU7XG5cbiAgLy8gUGFyc2UgdGhlIHZhbHVlIHdpdGggYGNsYXNzaWZ5YCBpZiBzZXR0aW5nIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgaWYgKHBsYW4uYXR0cmlidXRlID09PSBcImNsYXNzXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSBjbGFzc2lmeSh2YWx1ZSk7XG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVkVmFsdWUgPSBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWUpO1xuICBjb25zdCBjdXJyZW50ID0gcGxhbi5ub2RlLmdldEF0dHJpYnV0ZShwbGFuLmF0dHJpYnV0ZSk7XG5cbiAgaWYgKHNlcmlhbGl6ZWRWYWx1ZSAhPT0gY3VycmVudCkge1xuICAgIHJldHVybiBbcGxhbi5ub2RlLCBwbGFuLmF0dHJpYnV0ZSwgc2VyaWFsaXplZFZhbHVlXTtcbiAgfVxuXG4gIHJldHVybiBTS0lQUEVEX0pPQjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkF0dHJpYnV0ZUpvYnMoam9iczogQXR0cmlidXRlVXBkYXRlSm9iW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbm9kZSwgbmFtZSwgdmFsdWVdIG9mIGpvYnMpIHtcbiAgICBhcHBseUF0dHJpYnV0ZShub2RlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uLy4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tIFwiLi4vZGlyZWN0aXZlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbmRpdGlvbmFsUmVuZGVyUGxhbixcbiAgQ29uZGl0aW9uYWxSZW5kZXJQbGFuQnJhbmNoLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2tpcHBlZEpvYiB9IGZyb20gXCIuL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25hbFJlbmRlckpvYiA9IFtcbiAgcGxhbjogQ29uZGl0aW9uYWxSZW5kZXJQbGFuLFxuICBicmFuY2g6IENvbmRpdGlvbmFsUmVuZGVyUGxhbkJyYW5jaCB8IG51bGwsXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUNvbmRpdGlvbmFsUmVuZGVySm9iKFxuICBwbGFuOiBDb25kaXRpb25hbFJlbmRlclBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBDb25kaXRpb25hbFJlbmRlckpvYiB8IFNraXBwZWRKb2Ige1xuICAvLyBEZXRlcm1pbmUgd2hpY2ggYnJhbmNoIHRvIGRpcHNsYXlcbiAgbGV0IGRpc3BsYXllZEJyYW5jaDogQ29uZGl0aW9uYWxSZW5kZXJQbGFuQnJhbmNoIHwgbnVsbCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBicmFuY2ggb2YgcGxhbi5icmFuY2hlcykge1xuICAgIGlmIChicmFuY2gudHlwZSA9PT0gRGlyZWN0aXZlLkVsc2UpIHtcbiAgICAgIGRpc3BsYXllZEJyYW5jaCA9IGJyYW5jaDtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQoYnJhbmNoLm5vdGF0aW9uLmJhc2UpO1xuICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICB0eXBlb2YgcmF3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHJhd1ZhbHVlKHBsYW4uc3RhcnQpIDogcmF3VmFsdWU7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkaXNwbGF5ZWRCcmFuY2ggPSBicmFuY2g7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbcGxhbiwgZGlzcGxheWVkQnJhbmNoLCB2YWx1ZXNdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29uZGl0aW9uYWxSZW5kZXJKb2JzKGpvYnM6IENvbmRpdGlvbmFsUmVuZGVySm9iW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbcGxhbiwgYnJhbmNoLCB2YWx1ZXNdIG9mIGpvYnMpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwbGFuLnN0YXJ0LnBhcmVudE5vZGU7XG5cbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfUEFSRU5UX1JFUVVJUkVEKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgY3VycmVudCByb290IGFuZCBicmFuY2ggcm9vdCBkaWZmZXIsIHJlbW92ZSBjb250ZW50XG4gICAgaWYgKGJyYW5jaCA9PT0gbnVsbCB8fCAhT2JqZWN0LmlzKHBsYW4uY3VycmVudFJvb3QsIGJyYW5jaC5icmFuY2hSb290KSkge1xuICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGNvbnRlbnQgaWYgdGhlIGJyYW5jaCBoYXMgY2hhbmdlZFxuICAgICAgY29uc3Qgbm9kZXNUb1JlbW92ZSA9IG5ldyBTZXQ8Tm9kZT4oKTtcblxuICAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gcGxhbi5zdGFydDtcbiAgICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IHBsYW4uZW5kKSB7XG4gICAgICAgIGlmIChpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgbm9kZXNUb1JlbW92ZS5hZGQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgdG9SZW1vdmUgb2Ygbm9kZXNUb1JlbW92ZSkge1xuICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodG9SZW1vdmUpO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIGFkZCB0aGUgYnJhbmNoIHJvb3QgaWYgbmVlZCBiZVxuICAgICAgaWYgKGJyYW5jaCkge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGJyYW5jaC5icmFuY2hSb290LCBwbGFuLmVuZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTnVsbCBicmFuY2ggLT4gUmVuZGVyIG5vdGhpbmdcbiAgICBpZiAoYnJhbmNoID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcmVuZGVyIGJyYW5jaCB0ZW1wbGF0ZVxuICAgIGJyYW5jaC5icmFuY2hUZW1wbGF0ZS5yZW5kZXJXaXRoVmFsdWVzKGJyYW5jaC5icmFuY2hSb290LCB2YWx1ZXMpO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgYXBwbHlFbGVtZW50QXR0cmlidXRlcywgZm9ybWF0QXR0cmlidXRlUmVjb3JkIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uLy4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgeyBidWlsZFZhbHVlQWNjZXNzb3IgfSBmcm9tIFwiLi4vc3ludGF4XCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgdHlwZSBUZW1wbGF0ZUNvbnRleHQgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcbmltcG9ydCB0eXBlIHsgTGlzdFJlbmRlclBsYW4gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2tpcHBlZEpvYiB9IGZyb20gXCIuL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBMaXN0UmVuZGVySm9iSXRlbSA9IHtcbiAgY29udGV4dDogVGVtcGxhdGVDb250ZXh0O1xuICBhdHRyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG4gIHJvb3Q6IEhUTUxFbGVtZW50O1xuICB0ZW1wbGF0ZTogVGVtcGxhdGU7XG59O1xuXG5leHBvcnQgdHlwZSBMaXN0UmVuZGVySm9iID0gW3BsYW46IExpc3RSZW5kZXJQbGFuLCBsaXN0OiBMaXN0UmVuZGVySm9iSXRlbVtdXTtcblxuZnVuY3Rpb24gZmV0Y2hMaXN0RGF0YShcbiAgcGxhbjogTGlzdFJlbmRlclBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIHtcbiAgY29uc3Qgbm90YXRpb25WYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgY29uc3QgZXZhbHVhdGVkVmFsdWUgPVxuICAgIHR5cGVvZiBub3RhdGlvblZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gbm90YXRpb25WYWx1ZShwbGFuLnN0YXJ0TWFya2VyLnBhcmVudE5vZGUpXG4gICAgICA6IG5vdGF0aW9uVmFsdWU7XG5cbiAgaWYgKGV2YWx1YXRlZFZhbHVlID09PSBudWxsIHx8IGV2YWx1YXRlZFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShldmFsdWF0ZWRWYWx1ZSkpIHtcbiAgICByZXR1cm4gZXZhbHVhdGVkVmFsdWU7XG4gIH1cblxuICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX0xJU1RfREFUQSk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RIVE1MRWxlbWVudHMoc3RhcnQ6IE5vZGUsIGVuZDogTm9kZSk6IFNldDxIVE1MRWxlbWVudD4ge1xuICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSBzdGFydDtcbiAgY29uc3Qgbm9kZVNldCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZW5kKSB7XG4gICAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZSkpIHtcbiAgICAgIG5vZGVTZXQuYWRkKG5vZGUpO1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG5vZGVTZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlTGlzdFJlbmRlckpvYihcbiAgcGxhbjogTGlzdFJlbmRlclBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBMaXN0UmVuZGVySm9iIHwgU2tpcHBlZEpvYiB7XG4gIC8vIEZldGNoIHRoZSBkYXRhIGZvciByZW5kZXJpbmcgdGhlIHVwZGF0ZWQgbGlzdCBpdGVtc1xuICBjb25zdCBsaXN0RGF0YSA9IGZldGNoTGlzdERhdGEocGxhbiwgdmFsdWVzKTtcblxuICAvLyBFbXB0eSAtPiBSZW1vdmUgdGhlIGxpc3QgY29udGVudHMgZW50aXJlbHkgYW5kIGV4aXRcbiAgaWYgKGxpc3REYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbcGxhbiwgW11dO1xuICB9XG5cbiAgLy8gQ29sbGVjdCBleGlzdGluZyBlbGVtZW50cyBmcm9tIHRoZSBET00gZm9yIGFzc2Vzc21lbnRcbiAgY29uc3Qge1xuICAgIHJvd1RlbXBsYXRlc0J5Um9vdCxcbiAgICByb3dUZW1wbGF0ZUVsZW1lbnQsXG4gICAgcm93Um9vdFByb3RvdHlwZTogcm93Um9vdEVsZW1lbnQsXG4gIH0gPSBwbGFuO1xuICBjb25zdCBrZXlBY2Nlc3NvciA9IGJ1aWxkVmFsdWVBY2Nlc3NvcihwbGFuLmtleU5vdGF0aW9uKTtcbiAgY29uc3QgbGlzdFJlbmRlckNvbnRleHRzOiBNYXA8dW5rbm93biwgTGlzdFJlbmRlckpvYkl0ZW0+ID0gbmV3IE1hcCgpO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0RGF0YSkge1xuICAgIGNvbnN0IGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCA9IHtcbiAgICAgIGl0ZW0sXG4gICAgfTtcblxuICAgIGNvbnN0IGtleSA9IGtleUFjY2Vzc29yKGNvbnRleHQpO1xuXG4gICAgaWYgKGxpc3RSZW5kZXJDb250ZXh0cy5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWSxcbiAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIEhUTUwgRWxlbWVudCB3ZSBleHBlY3QgdG8gc2VlIGhlcmVcbiAgICBsZXQgcm93Um9vdCA9IHBsYW4ucm93Um9vdHNCeUtleS5nZXQoa2V5KTtcblxuICAgIGlmIChyb3dSb290ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1Jvb3QgPSByb3dSb290RWxlbWVudC5jbG9uZU5vZGUoZmFsc2UpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LnNldChrZXksIHJvd1Jvb3QpO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIHRlbXBsYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm93IHJvb3RcbiAgICBsZXQgcm93VGVtcGxhdGUgPSByb3dUZW1wbGF0ZXNCeVJvb3QuZ2V0KHJvd1Jvb3QpO1xuXG4gICAgaWYgKHJvd1RlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1RlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJvd1RlbXBsYXRlRWxlbWVudCk7XG4gICAgICByb3dUZW1wbGF0ZXNCeVJvb3Quc2V0KHJvd1Jvb3QsIHJvd1RlbXBsYXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2JJdGVtOiBMaXN0UmVuZGVySm9iSXRlbSA9IHtcbiAgICAgIGNvbnRleHQsXG4gICAgICByb290OiByb3dSb290LFxuICAgICAgdGVtcGxhdGU6IHJvd1RlbXBsYXRlLFxuICAgICAgYXR0cnM6IGZvcm1hdEF0dHJpYnV0ZVJlY29yZChpdGVtKSxcbiAgICB9O1xuXG4gICAgbGlzdFJlbmRlckNvbnRleHRzLnNldChrZXksIGpvYkl0ZW0pO1xuICB9XG5cbiAgLy8gQ2xlYW4gdXAgY2FjaGVkIGRhdGFcbiAgZm9yIChjb25zdCBba2V5LCByb290XSBvZiBwbGFuLnJvd1Jvb3RzQnlLZXkpIHtcbiAgICBpZiAoIWxpc3RSZW5kZXJDb250ZXh0cy5oYXMoa2V5KSkge1xuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LmRlbGV0ZShrZXkpO1xuICAgICAgcGxhbi5yb3dUZW1wbGF0ZXNCeVJvb3QuZGVsZXRlKHJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbcGxhbiwgQXJyYXkuZnJvbShsaXN0UmVuZGVyQ29udGV4dHMudmFsdWVzKCkpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkxpc3RSZW5kZXJKb2JzKGpvYnM6IExpc3RSZW5kZXJKb2JbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtwbGFuLCByZW5kZXJJdGVtc10gb2Ygam9icykge1xuICAgIGNvbnN0IHsgZW5kTWFya2VyLCBsaXN0Q29udGFpbmVyOiBsaXN0Q29udGFpbmVyRWxlbWVudCB9ID0gcGxhbjtcblxuICAgIC8vIEZhc3QgcGF0aCBmb3IgZW1wdHkgbGlzdHMgLT4gUmVtb3ZlIGV2ZXJ5dGhpbmcgYW5kIGNvbnRpbnVlXG4gICAgaWYgKHJlbmRlckl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZm9yIChjb25zdCByb290IG9mIHBsYW4ucm93Um9vdHNCeUtleS52YWx1ZXMoKSkge1xuICAgICAgICByb290LnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LmNsZWFyKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHNjYW4gdGhlIGN1cnJlbnQgbm9kZXMgYW5kIG1vZGlmeSBhcyBuZWVkZWRcbiAgICBjb25zdCBleGlzdGluZ0RPTU5vZGVzID0gQXJyYXkuZnJvbShcbiAgICAgIGNvbGxlY3RIVE1MRWxlbWVudHMocGxhbi5zdGFydE1hcmtlciwgcGxhbi5lbmRNYXJrZXIpLFxuICAgICk7XG5cbiAgICBjb25zdCByb290c1RvS2VlcCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgICBsZXQgZXhpc3RpbmdET01Ob2RlSWR4ID0gMDtcblxuICAgIGZvciAoY29uc3QgcmVuZGVySXRlbSBvZiByZW5kZXJJdGVtcykge1xuICAgICAgY29uc3QgeyByb290LCBhdHRyczogYXR0ck1hcCwgY29udGV4dCwgdGVtcGxhdGUgfSA9IHJlbmRlckl0ZW07XG4gICAgICBjb25zdCBleGlzdGluZ0RPTU5vZGUgPSBleGlzdGluZ0RPTU5vZGVzW2V4aXN0aW5nRE9NTm9kZUlkeF07XG5cbiAgICAgIC8vIFNwcmVhZCBpdGVtIGFzIGF0dHJpYnV0ZXMgb24gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgdGVtcGxhdGVcbiAgICAgIGFwcGx5RWxlbWVudEF0dHJpYnV0ZXMocm9vdCwgYXR0ck1hcCk7XG4gICAgICB0ZW1wbGF0ZS5yZW5kZXIocm9vdCwgY29udGV4dCk7XG5cbiAgICAgIHJvb3RzVG9LZWVwLmFkZChyb290KTtcblxuICAgICAgLy8gTm9kZSBpcyB0aGUgZXhpc3RpbmcgRE9NIE5vZGUsIGNvbnRpbnVlXG4gICAgICBpZiAoT2JqZWN0LmlzKGV4aXN0aW5nRE9NTm9kZSwgcm9vdCkpIHtcbiAgICAgICAgZXhpc3RpbmdET01Ob2RlSWR4ICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBObyBleGlzdGluZyBub2RlIC0+IGFwcGVuZCBpdGVtXG4gICAgICBpZiAoIWV4aXN0aW5nRE9NTm9kZSkge1xuICAgICAgICBsaXN0Q29udGFpbmVyRWxlbWVudC5pbnNlcnRCZWZvcmUocm9vdCwgZW5kTWFya2VyKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIERPTSBub2RlIGV4aXN0cyBidXQgaXNuJ3QgdGhlIG9uZSB3ZSdyZSBsb29raW5nIGZvci4gSW5zZXJ0IGJlZm9yZS5cbiAgICAgIGxpc3RDb250YWluZXJFbGVtZW50Lmluc2VydEJlZm9yZShyb290LCBleGlzdGluZ0RPTU5vZGUpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG9sZCBlbGVtZW50c1xuICAgIGZvciAoY29uc3Qgcm9vdCBvZiBleGlzdGluZ0RPTU5vZGVzKSB7XG4gICAgICBpZiAoIXJvb3RzVG9LZWVwLmhhcyhyb290KSkge1xuICAgICAgICByb290LnJlbW92ZSgpO1xuICAgICAgICBwbGFuLnJvd1RlbXBsYXRlc0J5Um9vdC5kZWxldGUocm9vdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgaXNDb21tZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uLy4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRlbnRTd2FwUGxhbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgU0tJUFBFRF9KT0IsIHR5cGUgU2tpcHBlZEpvYiB9IGZyb20gXCIuL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBDb250ZW50U3dhcEpvYiA9IFtwbGFuOiBDb250ZW50U3dhcFBsYW4sIHN3YXA6IE5vZGVdO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUNvbnRlbnRTd2FwSm9iKFxuICBwbGFuOiBDb250ZW50U3dhcFBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBDb250ZW50U3dhcEpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgY29uc3QgdmFsdWUgPSB0eXBlb2YgcmF3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHJhd1ZhbHVlKHBsYW4ubm9kZSkgOiByYXdWYWx1ZTtcblxuICAvLyBTdHJpbmcsIE51bWJlciwgQm9vbGVhbiAtPiBUZXh0IE5vZGVcbiAgaWYgKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgKSB7XG4gICAgY29uc3QgYXNTdHIgPSBgJHt2YWx1ZX1gO1xuICAgIGlmIChwbGFuLm5vZGUudGV4dENvbnRlbnQgPT09IGFzU3RyKSB7XG4gICAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtwbGFuLCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhc1N0cildO1xuICB9XG5cbiAgLy8gTnVsbGlzaCB2YWx1ZXMgLT4gQ29tbWVudFxuICBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlzQ29tbWVudChwbGFuLm5vZGUpKSB7XG4gICAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtwbGFuLCBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwiZW1wdHlcIildO1xuICB9XG5cbiAgLy8gSFRNTEVsZW1lbnQgLT4gU3dhcCBub2Rlc1xuICBlbHNlIGlmIChpc0hUTUxFbGVtZW50KHZhbHVlKSkge1xuICAgIGlmIChPYmplY3QuaXMocGxhbi5ub2RlLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgICB9XG5cbiAgICByZXR1cm4gW3BsYW4sIHZhbHVlLmNsb25lTm9kZSh0cnVlKV07XG4gIH1cblxuICAvLyBBbnl0aGluZyBlbHNlIC0+IFVuc3VwcG9ydGVkXG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICBFcnJvckNvZGUuSU5WQUxJRF9DT05URU5ULFxuICAgICAgdHlwZW9mIHZhbHVlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsdWUpLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbnRlbnRTd2FwSm9icyhqb2JzOiBDb250ZW50U3dhcEpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIHJlcGxhY2VdIG9mIGpvYnMpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwbGFuLm5vZGUucGFyZW50Tm9kZTtcblxuICAgIGlmICghcGFyZW50KSB7XG4gICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIGluIHByYWN0aWNlXG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cblxuICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQocmVwbGFjZSwgcGxhbi5ub2RlKTtcbiAgICBwbGFuLm5vZGUgPSByZXBsYWNlO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVGFnQ2hhbmdlUGxhbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgU0tJUFBFRF9KT0IsIHR5cGUgU2tpcHBlZEpvYiB9IGZyb20gXCIuL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBUYWdDaGFuZ2VKb2IgPSBbcGxhbjogVGFnQ2hhbmdlUGxhbiwgbmV3VGFnOiBzdHJpbmddO1xuXG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHJlcGxhY2UgaXQgd2l0aCBhIGRpZmZlcmVudCB0YWcsIGFkb3B0aW5nIGFsbCBhdHRyaWJ1dGVzXG4gKiBhbmQgY2hpbGQgZWxlbWVudHMuXG4gKiBAcGFyYW0gJHRhcmdldCBUaGUgZWxlbWVudCB0byBzd2FwIG91dFxuICogQHBhcmFtIG5ld1RhZyBUaGUgbmV3IEhUTUwgdGFnTmFtZSB0byB1c2VcbiAqIEByZXR1cm5zIFRoZSBuZXdseSBzd2FwcGVkLWluIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZVRhZygkdGFyZ2V0OiBIVE1MRWxlbWVudCwgbmV3VGFnOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0ICRuZXdFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmV3VGFnKTtcblxuICB3aGlsZSAoJHRhcmdldC5maXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgJG5ld0VsLmFwcGVuZENoaWxkKCR0YXJnZXQuZmlyc3RDaGlsZCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGF0dHJOYW1lIG9mICR0YXJnZXQuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgIGNvbnN0IHZhbCA9ICR0YXJnZXQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgIGlmICh2YWwgIT09IG51bGwpIHtcbiAgICAgICRuZXdFbC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIHZhbCk7XG4gICAgfVxuICB9XG5cbiAgJHRhcmdldC5yZXBsYWNlV2l0aCgkbmV3RWwpO1xuICByZXR1cm4gJG5ld0VsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVRhZ0NoYW5nZUpvYihcbiAgcGxhbjogVGFnQ2hhbmdlUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IFRhZ0NoYW5nZUpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKSA/PyBcIlwiO1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmF3VmFsdWUocGxhbi5ub2RlKSA6IHJhd1ZhbHVlO1xuICBjb25zdCBuZXh0VGFnID0gYCR7dmFsdWV9YC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBjdXJyZW50VGFnID0gcGxhbi5ub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAoIW5leHRUYWcgfHwgbmV4dFRhZyA9PT0gY3VycmVudFRhZykge1xuICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgfVxuXG4gIHJldHVybiBbcGxhbiwgbmV4dFRhZ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5UYWdDaGFuZ2VKb2JzKGpvYnM6IFRhZ0NoYW5nZUpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIG5leHRUYWddIG9mIGpvYnMpIHtcbiAgICBwbGFuLm5vZGUgPSBjaGFuZ2VUYWcocGxhbi5ub2RlLCBuZXh0VGFnKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IHR5cGUgQW55UmVuZGVyUGxhbiwgVXBkYXRlVHlwZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBdHRyaWJ1dGVVcGRhdGVKb2IsXG4gIHByZXBhcmVBdHRyaWJ1dGVKb2IsXG4gIHJ1bkF0dHJpYnV0ZUpvYnMsXG59IGZyb20gXCIuL2F0dHJpYnV0ZVwiO1xuaW1wb3J0IHsgU0tJUFBFRF9KT0IgfSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uZGl0aW9uYWxSZW5kZXJKb2IsXG4gIHByZXBhcmVDb25kaXRpb25hbFJlbmRlckpvYixcbiAgcnVuQ29uZGl0aW9uYWxSZW5kZXJKb2JzLFxufSBmcm9tIFwiLi9jb25kaXRpb25hbFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBMaXN0UmVuZGVySm9iLFxuICBwcmVwYXJlTGlzdFJlbmRlckpvYixcbiAgcnVuTGlzdFJlbmRlckpvYnMsXG59IGZyb20gXCIuL2xpc3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29udGVudFN3YXBKb2IsXG4gIHByZXBhcmVDb250ZW50U3dhcEpvYixcbiAgcnVuQ29udGVudFN3YXBKb2JzLFxufSBmcm9tIFwiLi9zd2FwXCI7XG5pbXBvcnQge1xuICBwcmVwYXJlVGFnQ2hhbmdlSm9iLFxuICBydW5UYWdDaGFuZ2VKb2JzLFxuICB0eXBlIFRhZ0NoYW5nZUpvYixcbn0gZnJvbSBcIi4vdGFnXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2F0dHJpYnV0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tbW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25kaXRpb25hbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGlzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3dhcFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGFnXCI7XG5cbmludGVyZmFjZSBSZW5kZXJKb2JzIHtcbiAgY29uZGl0aW9uYWxzOiBDb25kaXRpb25hbFJlbmRlckpvYltdO1xuICBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVVcGRhdGVKb2JbXTtcbiAgc3dhcHM6IENvbnRlbnRTd2FwSm9iW107XG4gIHRhZ3M6IFRhZ0NoYW5nZUpvYltdO1xuICBsaXN0czogTGlzdFJlbmRlckpvYltdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSm9ic0Zyb21QbGFucyhcbiAgcGxhbnM6IFNldDxBbnlSZW5kZXJQbGFuPixcbiAgbmV3VmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IFJlbmRlckpvYnMge1xuICBjb25zdCBqb2JzOiBSZW5kZXJKb2JzID0ge1xuICAgIGNvbmRpdGlvbmFsczogW10sXG4gICAgYXR0cmlidXRlczogW10sXG4gICAgc3dhcHM6IFtdLFxuICAgIHRhZ3M6IFtdLFxuICAgIGxpc3RzOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHBsYW4gb2YgcGxhbnMpIHtcbiAgICBzd2l0Y2ggKHBsYW4udHlwZSkge1xuICAgICAgY2FzZSBVcGRhdGVUeXBlLkNvbmRpdGlvbmFsOiB7XG4gICAgICAgIGNvbnN0IGpvYiA9IHByZXBhcmVDb25kaXRpb25hbFJlbmRlckpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgIGpvYnMuY29uZGl0aW9uYWxzLnB1c2goam9iKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVXBkYXRlVHlwZS5BdHRyaWJ1dGU6IHtcbiAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUF0dHJpYnV0ZUpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgIGpvYnMuYXR0cmlidXRlcy5wdXNoKGpvYik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFVwZGF0ZVR5cGUuTGlzdDoge1xuICAgICAgICBjb25zdCBqb2IgPSBwcmVwYXJlTGlzdFJlbmRlckpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgIGpvYnMubGlzdHMucHVzaChqb2IpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBVcGRhdGVUeXBlLlN3YXA6IHtcbiAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUNvbnRlbnRTd2FwSm9iKHBsYW4sIG5ld1ZhbHVlcyk7XG4gICAgICAgIGlmIChqb2IgIT09IFNLSVBQRURfSk9CKSB7XG4gICAgICAgICAgam9icy5zd2Fwcy5wdXNoKGpvYik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFVwZGF0ZVR5cGUuVGFnOiB7XG4gICAgICAgIGNvbnN0IGpvYiA9IHByZXBhcmVUYWdDaGFuZ2VKb2IocGxhbiwgbmV3VmFsdWVzKTtcbiAgICAgICAgaWYgKGpvYiAhPT0gU0tJUFBFRF9KT0IpIHtcbiAgICAgICAgICBqb2JzLnRhZ3MucHVzaChqb2IpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gU2hvdWxkIGJlIGltcG9zc2libGUgZ2l2ZW4gYW4gZXhoYXVzdGl2ZSBzd2l0Y2ggY2FzZVxuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBqb2JzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVJlbmRlckpvYnMoam9iczogUmVuZGVySm9icyk6IHZvaWQge1xuICBydW5Db25kaXRpb25hbFJlbmRlckpvYnMoam9icy5jb25kaXRpb25hbHMpO1xuICBydW5BdHRyaWJ1dGVKb2JzKGpvYnMuYXR0cmlidXRlcyk7XG4gIHJ1bkxpc3RSZW5kZXJKb2JzKGpvYnMubGlzdHMpO1xuICBydW5Db250ZW50U3dhcEpvYnMoam9icy5zd2Fwcyk7XG4gIHJ1blRhZ0NoYW5nZUpvYnMoam9icy50YWdzKTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgdHlwZSB7IENvbXBpbGVkVGVtcGxhdGUgfSBmcm9tIFwiLi9jb21waWxlXCI7XG5pbXBvcnQgeyBSRUZfQVRUUiB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVcIjtcbmltcG9ydCB7IGJ1aWxkVmFsdWVBY2Nlc3NvciwgdHlwZSBOb3RhdGlvbkFjY2Vzc29yIH0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcIi4vdGVtcGxhdGVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQW55UmVuZGVyUGxhbixcbiAgdHlwZSBBdHRyaWJ1dGVVcGRhdGVQbGFuLFxuICB0eXBlIENvbmRpdGlvbmFsUmVuZGVyUGxhbixcbiAgdHlwZSBDb250ZW50U3dhcFBsYW4sXG4gIHR5cGUgTGlzdFJlbmRlclBsYW4sXG4gIHR5cGUgVGFnQ2hhbmdlUGxhbixcbiAgVXBkYXRlVHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGh0bWxTdHJpbmdUb1RlbXBsYXRlIH0gZnJvbSBcIi4vdXRpbFwiO1xuXG4vKipcbiAqIEEgcHJlLXByb2Nlc3NlZCB7QGxpbmsgQ29tcGlsZWRUZW1wbGF0ZX0gcmVzdWx0IGNvbnRhaW5pbmcgdGhlIGJ1bGsgb2YgdGhlXG4gKiBkYXRhIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSB0ZW1wbGF0ZSBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlZFRlbXBsYXRlIHtcbiAgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQ7XG4gIHBsYW5zQnlOb3RhdGlvbjogTWFwPHN0cmluZywgU2V0PEFueVJlbmRlclBsYW4+PjtcbiAgbm90YXRpb25BY2Nlc3NvcnM6IE1hcDxzdHJpbmcsIE5vdGF0aW9uQWNjZXNzb3I+O1xuICBzdWJ0ZW1wbGF0ZXM6IFNldDxUZW1wbGF0ZT47XG59XG5cbmNvbnN0IHJlcXVpcmVQYXJlbnROb2RlID0gKG5vZGU6IE5vZGUpOiBOb2RlID0+IHtcbiAgaWYgKCFub2RlLnBhcmVudE5vZGUpIHtcbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9QQVJFTlRfUkVRVUlSRUQpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZTtcbn07XG5cbmNvbnN0IGNyZWF0ZUNvbW1lbnRCZWZvcmUgPSAobm9kZTogTm9kZSwgdGV4dCA9IFwiXCIpOiBDb21tZW50ID0+IHtcbiAgY29uc3QgcGFyZW50ID0gcmVxdWlyZVBhcmVudE5vZGUobm9kZSk7XG4gIGNvbnN0IGNvbW1lbnQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KHRleHQpO1xuICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNvbW1lbnQsIG5vZGUpO1xuICByZXR1cm4gY29tbWVudDtcbn07XG5cbmNvbnN0IGNyZWF0ZUNvbW1lbnRBZnRlciA9IChub2RlOiBOb2RlLCB0ZXh0ID0gXCJcIik6IENvbW1lbnQgPT4ge1xuICBjb25zdCBwYXJlbnQgPSByZXF1aXJlUGFyZW50Tm9kZShub2RlKTtcbiAgY29uc3QgY29tbWVudCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQodGV4dCk7XG4gIHBhcmVudC5pbnNlcnRCZWZvcmUoY29tbWVudCwgbm9kZS5uZXh0U2libGluZyk7XG4gIHJldHVybiBjb21tZW50O1xufTtcblxuLyoqXG4gKiBHaXZlbiBhIHtAbGluayBDb21waWxlZFRlbXBsYXRlfSBzdHJ1Y3R1cmUsIHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyB0aGVcbiAqIGRhdGEgbmVlZGVkIHRvIGNyZWF0ZSBuZXcgVGVtcGxhdGUgaW5zdGFuY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcGlsZWRUZW1wbGF0ZSA9IGdldENvbXBpbGVkVGVtcGxhdGVKU09OKCk7XG4gKiBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbXBpbGVkVGVtcGxhdGUpO1xuICogY29uc3QgcHJlcGFyZWQgPSBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZShwYXJzZWQpO1xuICpcbiAqIC8vIEVsc2V3aGVyZS4uLlxuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHByZXBhcmVkKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUNvbXBpbGVkVGVtcGxhdGUoXG4gIGNvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlLFxuICBwcm90b3R5cGVGcmFnbWVudD86IERvY3VtZW50RnJhZ21lbnQsXG4pOiBQcmVwYXJlZFRlbXBsYXRlIHtcbiAgY29uc3QgcGxhbnNCeU5vdGF0aW9uOiBNYXA8c3RyaW5nLCBTZXQ8QW55UmVuZGVyUGxhbj4+ID0gbmV3IE1hcCgpO1xuICBjb25zdCBub3RhdGlvbkFjY2Vzc29yczogTWFwPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IHN1YnRlbXBsYXRlczogU2V0PFRlbXBsYXRlPiA9IG5ldyBTZXQoKTtcbiAgY29uc3Qgbm9kZVJlZnM6IE1hcDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IFtub3RhdGlvbiwgcGFyc2VkXSBvZiBPYmplY3QuZW50cmllcyhjb21waWxlZC5ub3RhdGlvbnMpKSB7XG4gICAgbm90YXRpb25BY2Nlc3NvcnMuc2V0KG5vdGF0aW9uLCBidWlsZFZhbHVlQWNjZXNzb3IocGFyc2VkKSk7XG4gIH1cblxuICBjb25zdCBmcmFnbWVudCA9IHByb3RvdHlwZUZyYWdtZW50ID8/IGh0bWxUb0ZyYWdtZW50KGNvbXBpbGVkLmh0bWwpO1xuXG4gIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZnJhZ21lbnQsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCB7XG4gICAgYWNjZXB0Tm9kZShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5vZGUuaGFzQXR0cmlidXRlKFJFRl9BVFRSKVxuICAgICAgICA/IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVFxuICAgICAgICA6IE5vZGVGaWx0ZXIuRklMVEVSX1NLSVA7XG4gICAgfSxcbiAgfSk7XG5cbiAgbGV0IG1hcmtOb2RlOiBOb2RlIHwgbnVsbCA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuXG4gIHdoaWxlIChtYXJrTm9kZSkge1xuICAgIGlmICghaXNIVE1MRWxlbWVudChtYXJrTm9kZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZiA9IG1hcmtOb2RlLmdldEF0dHJpYnV0ZShSRUZfQVRUUik7XG5cbiAgICBpZiAocmVmID09PSBudWxsKSB7XG4gICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIGluIHByYWN0aWNlLCBhcyB0aGUgdHJlZSB3YWxrZXIgb25seSBzdXJmYWNlc1xuICAgICAgLy8gZWxlbWVudHMgd2l0aCBhbiBleHRhbnQgbm9kZSByZWYgYXR0cmlidXRlXG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cblxuICAgIG5vZGVSZWZzLnNldChyZWYsIG1hcmtOb2RlKTtcbiAgICBtYXJrTm9kZS5yZW1vdmVBdHRyaWJ1dGUoUkVGX0FUVFIpO1xuICAgIG1hcmtOb2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XG4gIH1cblxuICBjb25zdCBhc3NvY2lhdGVQbGFuID0gKHBsYW46IEFueVJlbmRlclBsYW4sIG5vdGF0aW9uOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbm90YXRpb25QbGFucyA9IHBsYW5zQnlOb3RhdGlvbi5nZXQobm90YXRpb24pO1xuICAgIGlmICghbm90YXRpb25QbGFucykge1xuICAgICAgbm90YXRpb25QbGFucyA9IG5ldyBTZXQoKTtcbiAgICAgIHBsYW5zQnlOb3RhdGlvbi5zZXQobm90YXRpb24sIG5vdGF0aW9uUGxhbnMpO1xuICAgIH1cbiAgICBub3RhdGlvblBsYW5zLmFkZChwbGFuKTtcbiAgfTtcblxuICBjb25zdCBnZXRCeU5vZGVSZWYgPSAobm9kZVJlZjogc3RyaW5nKTogSFRNTEVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IG5vZGVSZWZzLmdldChub2RlUmVmKTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19OT0RFX1JFRik7XG4gIH07XG5cbiAgZm9yIChjb25zdCBzY2hlbWUgb2YgY29tcGlsZWQuc2NoZW1lcykge1xuICAgIC8vIEh5ZHJhdGUgTGlzdCBzY2hlbWVzIGludG8gTGlzdCBwbGFuc1xuICAgIGlmIChzY2hlbWUudHlwZSA9PT0gVXBkYXRlVHlwZS5MaXN0KSB7XG4gICAgICAvLyBVc2UgdGhlIHByb3RvdHlwZSByb3cgcm9vdCB0byBjcmVhdGUgdGhlIHBsYW5cbiAgICAgIGNvbnN0IGl0ZW1Qcm90b3R5cGUgPSBnZXRCeU5vZGVSZWYoc2NoZW1lLm5vZGVSZWYpO1xuICAgICAgY29uc3QgbGlzdFBhcmVudE5vZGUgPSByZXF1aXJlUGFyZW50Tm9kZShpdGVtUHJvdG90eXBlKTtcbiAgICAgIGNvbnN0IHJvd1Jvb3RQcm90b3R5cGUgPSBpdGVtUHJvdG90eXBlLmNsb25lTm9kZShmYWxzZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBzdGFydE1hcmtlciA9IGNyZWF0ZUNvbW1lbnRCZWZvcmUoaXRlbVByb3RvdHlwZSk7XG4gICAgICBjb25zdCBlbmRNYXJrZXIgPSBjcmVhdGVDb21tZW50QWZ0ZXIoaXRlbVByb3RvdHlwZSk7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgb3JpZ2luYWwgcm9vdCBwcm90b3R5cGUgc2luY2Ugd2Ugd2lsbCBiZSByZW5kZXJpbmcgbmV3IGl0ZW1zXG4gICAgICBpdGVtUHJvdG90eXBlLnJlbW92ZSgpO1xuXG4gICAgICAvLyBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgcm93IGludG8gYSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGVDb250ZW50RnJhZ21lbnQgPSBodG1sVG9GcmFnbWVudChzY2hlbWUubGlzdENvbnRlbnRIdG1sKTtcbiAgICAgIGNvbnN0IHJvd1RlbXBsYXRlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICAgIHJvd1RlbXBsYXRlRWxlbWVudC5jb250ZW50LmFwcGVuZENoaWxkKHRlbXBsYXRlQ29udGVudEZyYWdtZW50KTtcblxuICAgICAgY29uc3QgcGxhbjogTGlzdFJlbmRlclBsYW4gPSB7XG4gICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuTGlzdCxcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAga2V5Tm90YXRpb246IHNjaGVtZS5rZXlOb3RhdGlvbixcbiAgICAgICAgbGlzdENvbnRhaW5lcjogbGlzdFBhcmVudE5vZGUsXG4gICAgICAgIHJvd1RlbXBsYXRlRWxlbWVudCxcbiAgICAgICAgcm93Um9vdFByb3RvdHlwZSxcbiAgICAgICAgc3RhcnRNYXJrZXIsXG4gICAgICAgIGVuZE1hcmtlcixcbiAgICAgICAgcm93VGVtcGxhdGVzQnlSb290OiBuZXcgV2Vha01hcCgpLFxuICAgICAgICByb3dSb290c0J5S2V5OiBuZXcgTWFwKCksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHNjaGVtZS5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG5cbiAgICAvLyBIeWRyYXRlIGNvbmRpdGlvbmFsIHJlbmRlciBzY2hlbWVzIGludG8gcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gVXBkYXRlVHlwZS5Db25kaXRpb25hbCkge1xuICAgICAgLy8gR3JhYiB0aGUgZmlyc3QgYnJhbmNoIGFuZCBpbnNlcnQgdGhlIHN0YXJ0IGNvbW1lbnQgYmVmb3JlIGl0XG4gICAgICBjb25zdCBmaXJzdEJyYW5jaCA9IHNjaGVtZS5icmFuY2hlc1swXTtcbiAgICAgIGlmICghZmlyc3RCcmFuY2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RCcmFuY2hSb290ID0gZ2V0QnlOb2RlUmVmKGZpcnN0QnJhbmNoLmJyYW5jaFJvb3RSZWYpO1xuICAgICAgY29uc3Qgc3RhcnRDb21tZW50ID0gY3JlYXRlQ29tbWVudEJlZm9yZShmaXJzdEJyYW5jaFJvb3QpO1xuXG4gICAgICAvLyBHcmFiIHRoZSBsYXN0IGJyYW5jaCBhbmQgaW5zZXJ0IHRoZSBlbmQgY29tbWVudCBhZnRlciBpdFxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBMb2dpY2FsbHkgZ3VhcmFudGVlZFxuICAgICAgY29uc3QgbGFzdEJyYW5jaCA9IHNjaGVtZS5icmFuY2hlc1tzY2hlbWUuYnJhbmNoZXMubGVuZ3RoIC0gMV0hO1xuICAgICAgY29uc3QgbGFzdEJyYW5jaFJvb3QgPSBnZXRCeU5vZGVSZWYobGFzdEJyYW5jaC5icmFuY2hSb290UmVmKTtcbiAgICAgIGNvbnN0IGVuZENvbW1lbnQgPSBjcmVhdGVDb21tZW50QWZ0ZXIobGFzdEJyYW5jaFJvb3QpO1xuXG4gICAgICBjb25zdCBwbGFuOiBDb25kaXRpb25hbFJlbmRlclBsYW4gPSB7XG4gICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuQ29uZGl0aW9uYWwsXG4gICAgICAgIHN0YXJ0OiBzdGFydENvbW1lbnQsXG4gICAgICAgIGVuZDogZW5kQ29tbWVudCxcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfTtcblxuICAgICAgLy8gSHlkcmF0ZSB0aGUgYnJhbmNoZXNcbiAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIHNjaGVtZS5icmFuY2hlcykge1xuICAgICAgICAvLyBJZiBhbmQgRWxzZS1JZiBoYXZlIG5vdGF0aW9uc1xuICAgICAgICBpZiAoYnJhbmNoLnR5cGUgPT09IERpcmVjdGl2ZS5JZiB8fCBicmFuY2gudHlwZSA9PT0gRGlyZWN0aXZlLkVsc2VJZikge1xuICAgICAgICAgIGNvbnN0IGJyYW5jaFJvb3QgPSBnZXRCeU5vZGVSZWYoYnJhbmNoLmJyYW5jaFJvb3RSZWYpO1xuICAgICAgICAgIGNvbnN0IGJyYW5jaFRlbXBsYXRlID0gaHRtbFN0cmluZ1RvVGVtcGxhdGUoXG4gICAgICAgICAgICBicmFuY2guYnJhbmNoVGVtcGxhdGVIVE1MLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIGNoaWxkIHRlbXBsYXRlXG4gICAgICAgICAgc3VidGVtcGxhdGVzLmFkZChicmFuY2hUZW1wbGF0ZSk7XG5cbiAgICAgICAgICBwbGFuLmJyYW5jaGVzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogYnJhbmNoLnR5cGUsXG4gICAgICAgICAgICBub3RhdGlvbjogYnJhbmNoLm5vdGF0aW9uLFxuICAgICAgICAgICAgYnJhbmNoUm9vdDogZ2V0QnlOb2RlUmVmKGJyYW5jaC5icmFuY2hSb290UmVmKSxcbiAgICAgICAgICAgIGJyYW5jaFRlbXBsYXRlOiBodG1sU3RyaW5nVG9UZW1wbGF0ZShicmFuY2guYnJhbmNoVGVtcGxhdGVIVE1MKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIGJyYW5jaC5ub3RhdGlvbi5iYXNlKTtcbiAgICAgICAgICBicmFuY2hSb290LnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRWxzZSBpcyBiaW5hcnksIG5vIG5vdGF0aW9uIGFzc29jaWF0ZWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgcGxhbi5icmFuY2hlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IGJyYW5jaC50eXBlLFxuICAgICAgICAgICAgYnJhbmNoUm9vdDogZ2V0QnlOb2RlUmVmKGJyYW5jaC5icmFuY2hSb290UmVmKSxcbiAgICAgICAgICAgIGJyYW5jaFRlbXBsYXRlOiBodG1sU3RyaW5nVG9UZW1wbGF0ZShicmFuY2guYnJhbmNoVGVtcGxhdGVIVE1MKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN3YXAvVGFnIGFyZSB0aGUgc2FtZSBzaWduYXR1cmVcbiAgICBlbHNlIGlmIChcbiAgICAgIHNjaGVtZS50eXBlID09PSBVcGRhdGVUeXBlLlN3YXAgfHxcbiAgICAgIHNjaGVtZS50eXBlID09PSBVcGRhdGVUeXBlLlRhZ1xuICAgICkge1xuICAgICAgY29uc3QgcGxhbjogQ29udGVudFN3YXBQbGFuIHwgVGFnQ2hhbmdlUGxhbiA9IHtcbiAgICAgICAgdHlwZTogc2NoZW1lLnR5cGUsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIG5vZGU6IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZiksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHNjaGVtZS5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG5cbiAgICAvLyBIeWRyYXRlIEF0dHJpYnV0ZSB1cGRhdGUgcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gVXBkYXRlVHlwZS5BdHRyaWJ1dGUpIHtcbiAgICAgIGNvbnN0IHBsYW46IEF0dHJpYnV0ZVVwZGF0ZVBsYW4gPSB7XG4gICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuQXR0cmlidXRlLFxuICAgICAgICBhdHRyaWJ1dGU6IHNjaGVtZS5hdHRyaWJ1dGUsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIG5vZGU6IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZiksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHBsYW4ubm90YXRpb24uYmFzZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwbGFuc0J5Tm90YXRpb24sXG4gICAgbm90YXRpb25BY2Nlc3NvcnMsXG4gICAgZnJhZ21lbnQsXG4gICAgc3VidGVtcGxhdGVzLFxuICB9O1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCB7IGZyYWdtZW50Q2FjaGUsIGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIi4uL3V0aWwvZnJhZ21lbnRzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbXBpbGVkVGVtcGxhdGUsXG4gIGNvbXBpbGVkVGVtcGxhdGVDYWNoZSxcbiAgY29tcGlsZVRlbXBsYXRlLFxufSBmcm9tIFwiLi9jb21waWxlXCI7XG5pbXBvcnQgeyBjcmVhdGVKb2JzRnJvbVBsYW5zLCBleGVjdXRlUmVuZGVySm9icyB9IGZyb20gXCIuL2pvYnNcIjtcbmltcG9ydCB7IHByZXBhcmVDb21waWxlZFRlbXBsYXRlIH0gZnJvbSBcIi4vcHJlcGFyZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBOb3RhdGlvbkFjY2Vzc29yLFxuICBwYXJzZWROb3RhdGlvbkNhY2hlLFxuICB2YWx1ZUFjY2Vzc29yQ2FjaGUsXG59IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHR5cGUgeyBBbnlSZW5kZXJQbGFuIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgVGVtcGxhdGVSb290ID0gSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290O1xuZXhwb3J0IHR5cGUgVGVtcGxhdGVDb250ZXh0ID0ge1xuICBhdHRyPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG4gIHN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaXRlbT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpbmRleD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogQSByZW5kZXJhYmxlIHRlbXBsYXRlIGZyb20gYW4gSFRNTFRlbXBsYXRlRWxlbWVudFxuICpcbiAqIExldmVyYWdlcyBhIHNpbXBsZSBzeW50YXggdG8gcHJvdmlkZSBhY2Nlc3NvcnMgdG8gdGVtcGxhdGUgZGF0YSBmcm9tIG9uZSBvZlxuICogZm91ciBjYXRlZ29yaWVzLCBiYXNlZCBvbiB1c2UgY2FzZTpcbiAqXG4gKiB8IFByZWZpeCB8IE5hbWVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IC0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gKiB8IGBAYCAgICB8IFRoZSBgYXR0cmAgbmFtZXNwYWNlIChob3N0IGVsZW1lbnQgYXR0cmlidXRlcykgICB8XG4gKiB8IGAkYCAgICB8IFRoZSBgc3RhdGVgIG5hbWVzcGFjZSAoY29tcG9uZW50IHJlYWN0aXZlIHN0YXRlKSB8XG4gKiB8IGAqYCAgICB8IFRoZSBgZGF0YWAgbmFtZXNwYWNlIChjb21wb25lbnQgY29tcHV0ZWQgcHJvcHMpICB8XG4gKiB8IGAjYCAgICB8IFRoZSBgaXRlbWAgbmFtZXNwYWNlIChsaXN0IGl0ZW0gY29udGV4dCkgICAgICAgICB8XG4gKlxuICogQmluZCBhdHRyaWJ1dGVzIHRvIGEgdmFsdWUgdXNpbmcgdGhlIGA6YXR0cmlidXRlYCBzeW50YXg6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiA6aWQ9XCIkaWRcIiA6Y2xhc3M9XCJAY2xhc3NuYW1lXCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBPciB1c2UgZGlyZWN0aXZlcyB3aXRoIG5vdGF0aW9ucyBmb3IgYWR2YW5jZWQgdGVtcGxhdGluZzpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IDo6aWY9XCIqc2hvd0xpc3RcIj5cbiAqICAgPHVsPlxuICogICAgIDxsaSA6OmVhY2g9XCIkaXRlbXNcIiA6OmtleT1cIiNpZFwiPlxuICogICAgICAgPHNwYW4gOjpzd2FwPVwiI2NvbnRlbnRcIj48L3NwYW4+XG4gKiAgICAgPC9saT5cbiAqICAgPC91bD5cbiAqIDwvZGl2PlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZSB7XG4gIHN0YXRpYyBpc1RlbXBsYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVGVtcGxhdGUge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBnbG9iYWwgVGVtcGxhdGUgYnVpbGQgY2FjaGUuXG4gICAqXG4gICAqIFRoaXMgaXMgbm90IHNvbWV0aGluZyB0eXBpY2FsbHkgbmVlZGVkIGZvciBnZW5lcmFsIGFwcCBkZXZlbG9wbWVudCwgYnV0XG4gICAqIGFsbG93cyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiB0byB0dW5lIHRoZSBjYWNoaW5nIHN5c3RlbSBpZiBuZWVkIGJlLlxuICAgKlxuICAgKiBDYWNoZSBzaXplcyBkZWZhdWx0IHRvIDUwMCBIVE1MIFRlbXBsYXRlIEZyYWdtZW50cyBhbmQgY29tcGlsZWQgUGFsZXR0ZVxuICAgKiB0ZW1wbGF0ZXMgKGluY2x1ZGVzIG5lc3RlZCB0ZW1wbGF0ZXMgbGlrZSBsaXN0cykgdG8gY292ZXIgbW9zdCBhcHBsaWNhdGlvblxuICAgKiBuZWVkcyB3aXRob3V0IHVzaW5nIG11Y2ggbWVtb3J5LlxuICAgKi9cbiAgc3RhdGljIGNhY2hlID0ge1xuICAgIC8qKlxuICAgICAqIFdpcGUgYWxsIGNhY2hlZCB0ZW1wbGF0ZXMgYW5kIEhUTUwgZnJhZ21lbnRzXG4gICAgICovXG4gICAgY2xlYXI6ICgpOiB2b2lkID0+IHtcbiAgICAgIGZyYWdtZW50Q2FjaGUuY2xlYXIoKTtcbiAgICAgIGNvbXBpbGVkVGVtcGxhdGVDYWNoZS5jbGVhcigpO1xuICAgICAgdmFsdWVBY2Nlc3NvckNhY2hlLmNsZWFyKCk7XG4gICAgICBwYXJzZWROb3RhdGlvbkNhY2hlLmNsZWFyKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHRoZSBkZWZhdWx0IGNhY2hlIGNhcGFjaXR5IG9mIDUwMCBpdGVtcyBwZXIgY2FjaGVcbiAgICAgKlxuICAgICAqIEdlbmVyYWwgY2FjaGluZyBndWlkYW5jZTpcbiAgICAgKiAtIDk1JSBvZiB0aGUgdGltZSwgNTAwIHdvcmtzIGZpbmVcbiAgICAgKiAtIEZvciB2ZXJ5IGxhcmdlIGFwcGxpY2F0aW9ucywgdXAgdG8gMTAwMCBpcyByZWFzb25hYmxlXG4gICAgICogLSBGb3Igc21hbGxlciBhcHBzLCBkcm9wcGluZyBkb3duIHRvIDEwMCAtIDI1MCBtYXkgc2F2ZSBtZW1vcnlcbiAgICAgKlxuICAgICAqIFVsdGltYXRlbHkgdGhlIGltcGFjdCB3aWxsIGJlIG1pbmltYWwgdW5sZXNzIHlvdXIgYXBwIGhhcyB2ZXJ5IHNwZWNpZmljXG4gICAgICogcmVuZGVyaW5nIG5lZWRzLlxuICAgICAqL1xuICAgIHNldENhcGFjaXR5OiAobWF4U2l6ZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBmcmFnbWVudENhY2hlLnNldENhcGFjaXR5KG1heFNpemUpO1xuICAgICAgY29tcGlsZWRUZW1wbGF0ZUNhY2hlLnNldENhcGFjaXR5KG1heFNpemUpO1xuICAgICAgdmFsdWVBY2Nlc3NvckNhY2hlLnNldENhcGFjaXR5KG1heFNpemUpO1xuICAgICAgcGFyc2VkTm90YXRpb25DYWNoZS5zZXRDYXBhY2l0eShtYXhTaXplKTtcbiAgICB9LFxuICB9O1xuXG4gIHByaXZhdGUgX2NvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IHVzZWQgdG8gY3JlYXRlIHRoaXMgVGVtcGxhdGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIE1ha2Ugc3VyZSB0byBuZXZlciBvcGVyYXRlIGRpcmVjdGx5IG9uIHRoaXMgZWxlbWVudC4gQWx3YXlzIGNsb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBfdGVtcGxhdGVFbGVtZW50PzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvKiogVGhlIGN1cnJlbnQga25vd24gcm9vdCBlbGVtZW50IHRoYXQgdGhpcyBUZW1wbGF0ZSBpcyByZW5kZXJlZCBpbnRvICovXG4gIHByaXZhdGUgX21vdW50ZWRSb290PzogVGVtcGxhdGVSb290O1xuXG4gIC8qKiBUaGUgbW9zdCByZWNlbnQgc2V0IHZhbHVlIGZvciBlYWNoIG5vdGF0aW9uIHRoYXQgaGFzIHJlbmRlcmVkICovXG4gIHByaXZhdGUgX2xhdGVzdFJlbmRlcmVkVmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPiA9IG5ldyBNYXAoKTtcblxuICAvKiogVGhlIGFjdGl2ZSBIVE1MRWxlbWVudCB3aGljaCB0aGUgdGVtcGxhdGUgaXMgdXBkYXRpbmcgb24gcmVuZGVycyAqL1xuICBwcml2YXRlIF9mcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudDtcblxuICAvKiogVmFsdWUgTm90YXRpb25zIC0+IFNldDxSZW5kZXIgUGxhbnM+ICovXG4gIHByaXZhdGUgX3BsYW5zQnlOb3RhdGlvbjogTWFwPHN0cmluZywgU2V0PEFueVJlbmRlclBsYW4+PiA9IG5ldyBNYXAoKTtcblxuICAvKiogVmFsdWUgTm90YXRpb25zIC0+IEFjY2Vzc29yIGZ1bmN0aW9ucyAqL1xuICBwcml2YXRlIF9ub3RhdGlvbkFjY2Vzc29yczogTWFwPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSBfc3VidGVtcGxhdGVzOiBTZXQ8VGVtcGxhdGU+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgdGhpcy5fdGVtcGxhdGVFbGVtZW50ID0gdGVtcGxhdGU7XG4gICAgdGhpcy5fY29tcGlsZWQgPSBjb21waWxlVGVtcGxhdGUodGVtcGxhdGUpO1xuXG4gICAgLy8gUHJlcGFyZSBhIGZyYWdtZW50IGZyb20gdGhlIGNvbXBpbGVkIEhUTUwgKGNhY2hlZClcbiAgICBjb25zdCBmcmFnbWVudCA9IGh0bWxUb0ZyYWdtZW50KHRoaXMuX2NvbXBpbGVkLmh0bWwpO1xuICAgIGNvbnN0IGh5ZHJhdGVkID0gcHJlcGFyZUNvbXBpbGVkVGVtcGxhdGUodGhpcy5fY29tcGlsZWQsIGZyYWdtZW50KTtcblxuICAgIHRoaXMuX3BsYW5zQnlOb3RhdGlvbiA9IGh5ZHJhdGVkLnBsYW5zQnlOb3RhdGlvbjtcbiAgICB0aGlzLl9ub3RhdGlvbkFjY2Vzc29ycyA9IGh5ZHJhdGVkLm5vdGF0aW9uQWNjZXNzb3JzO1xuICAgIHRoaXMuX2ZyYWdtZW50ID0gaHlkcmF0ZWQuZnJhZ21lbnQ7XG4gICAgdGhpcy5fc3VidGVtcGxhdGVzID0gaHlkcmF0ZWQuc3VidGVtcGxhdGVzO1xuXG4gICAgY29uc3QgYWxsUmVsZXZhbnRBY2Nlc3NvcnMgPSBuZXcgTWFwPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4oXG4gICAgICB0aGlzLl9ub3RhdGlvbkFjY2Vzc29ycyxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLl9zdWJ0ZW1wbGF0ZXMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBjaGlsZC5ub3RhdGlvbk1hcCkge1xuICAgICAgICBhbGxSZWxldmFudEFjY2Vzc29ycy5zZXQoa2V5LCB2YWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX25vdGF0aW9uQWNjZXNzb3JzID0gYWxsUmVsZXZhbnRBY2Nlc3NvcnM7XG4gIH1cblxuICBnZXQgY29tcGlsZWQoKTogQ29tcGlsZWRUZW1wbGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBpbGVkO1xuICB9XG5cbiAgZ2V0IG5vdGF0aW9uTWFwKCk6IE1hcDxzdHJpbmcsIE5vdGF0aW9uQWNjZXNzb3I+IHtcbiAgICByZXR1cm4gdGhpcy5fbm90YXRpb25BY2Nlc3NvcnM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZnVsbCBjb3B5IG9mIHRoaXMgdGVtcGxhdGUgZm9yIHVzZSBpbiByZW5kZXJpbmcgdG8gYW5vdGhlciByb290XG4gICAqL1xuICBjbG9uZSA9ICgpOiBUZW1wbGF0ZSA9PiB7XG4gICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSh0aGlzLmVsZW1lbnQoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIEFuIHtAbGluayBIVE1MVGVtcGxhdGVFbGVtZW50fSByZXByZXNlbnRpbmcgdGhpcyB0ZW1wbGF0ZVxuICAgKi9cbiAgZWxlbWVudCA9ICgpOiBIVE1MVGVtcGxhdGVFbGVtZW50ID0+IHtcbiAgICBpZiAodGhpcy5fdGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVFbGVtZW50O1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHRoaXMuX2NvbXBpbGVkLmh0bWw7XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9O1xuXG4gIHByaXZhdGUgX2NvbGxlY3RVcGRhdGVkVmFsdWVzID0gKFxuICAgIGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCxcbiAgKTogW2hhc0NoYW5nZXM6IGJvb2xlYW4sIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj5dID0+IHtcbiAgICBjb25zdCB1cGRhdGVkVmFsdWVzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgW3Jhd05vdGF0aW9uLCBhY2Nlc3Nvcl0gb2YgdGhpcy5fbm90YXRpb25BY2Nlc3NvcnMpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLl9sYXRlc3RSZW5kZXJlZFZhbHVlcy5nZXQocmF3Tm90YXRpb24pO1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBhY2Nlc3Nvcihjb250ZXh0KTtcbiAgICAgIHVwZGF0ZWRWYWx1ZXMuc2V0KHJhd05vdGF0aW9uLCBuZXdWYWx1ZSk7XG5cbiAgICAgIGlmIChwcmV2aW91c1ZhbHVlICE9PSBuZXdWYWx1ZSAmJiAhT2JqZWN0LmlzKHByZXZpb3VzVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW2hhc0NoYW5nZXMsIHVwZGF0ZWRWYWx1ZXNdO1xuICB9O1xuXG4gIHByaXZhdGUgX3VwZGF0ZShuZXdWYWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgLy8gQ29sbGVjdCBhZmZlY3RlZCBwbGFuc1xuICAgIGNvbnN0IGFsbEFmZmVjdGVkUGxhbnM6IFNldDxBbnlSZW5kZXJQbGFuPiA9IG5ldyBTZXQoKTtcblxuICAgIGZvciAoY29uc3QgW25vdGF0aW9uXSBvZiBuZXdWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IGFmZmVjdGVkUGxhbnMgPSB0aGlzLl9wbGFuc0J5Tm90YXRpb24uZ2V0KG5vdGF0aW9uKTtcblxuICAgICAgaWYgKCFhZmZlY3RlZFBsYW5zKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHBsYW4gb2YgYWZmZWN0ZWRQbGFucykge1xuICAgICAgICBhbGxBZmZlY3RlZFBsYW5zLmFkZChwbGFuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBqb2JzID0gY3JlYXRlSm9ic0Zyb21QbGFucyhhbGxBZmZlY3RlZFBsYW5zLCBuZXdWYWx1ZXMpO1xuICAgIGV4ZWN1dGVSZW5kZXJKb2JzKGpvYnMpO1xuICB9XG5cbiAgcmVuZGVyV2l0aFZhbHVlcyA9IChcbiAgICByb290OiBUZW1wbGF0ZVJvb3QsXG4gICAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKHJvb3QgIT09IHRoaXMuX21vdW50ZWRSb290KSB7XG4gICAgICB0aGlzLl9tb3VudGVkUm9vdCA9IHJvb3Q7XG4gICAgICB3aGlsZSAocm9vdC5maXJzdENoaWxkKSB7XG4gICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQocm9vdC5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgcm9vdC5hcHBlbmQodGhpcy5fZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZSh2YWx1ZXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhpcyB0ZW1wbGF0ZSBpbnRvIGEgdGFyZ2V0IGhvc3QgZWxlbWVudC5cbiAgICovXG4gIHJlbmRlciA9IChyb290OiBUZW1wbGF0ZVJvb3QsIGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IFtoYXNDaGFuZ2VzLCByZXNvbHZlZFZhbHVlc10gPSB0aGlzLl9jb2xsZWN0VXBkYXRlZFZhbHVlcyhjb250ZXh0KTtcblxuICAgIC8vIElmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIGV4aXQgZWFybHlcbiAgICBpZiAocm9vdCA9PT0gdGhpcy5fbW91bnRlZFJvb3QgJiYgIWhhc0NoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcldpdGhWYWx1ZXMocm9vdCwgcmVzb2x2ZWRWYWx1ZXMpO1xuICAgIHRoaXMuX2xhdGVzdFJlbmRlcmVkVmFsdWVzID0gcmVzb2x2ZWRWYWx1ZXM7XG4gIH07XG59XG4iLAogICAgInR5cGUgVGFza1F1ZXVlID0gXCJ0YXNrc1wiIHwgXCJmcmFtZXNcIjtcbnR5cGUgVGFza1F1ZXVlcyA9IFJlY29yZDxUYXNrUXVldWUsIFZvaWRGdW5jdGlvbltdPjtcbnR5cGUgVGFza1Byb21pc2VzID0gUGFydGlhbDxSZWNvcmQ8VGFza1F1ZXVlLCBQcm9taXNlPHZvaWQ+Pj47XG50eXBlIFRhc2tSZXNvbHZlcnMgPSBQYXJ0aWFsPFJlY29yZDxUYXNrUXVldWUsIFZvaWRGdW5jdGlvbj4+O1xuXG5leHBvcnQgY2xhc3MgVGFza1NjaGVkdWxlciB7XG4gIHByaXZhdGUgX3F1ZXVlczogVGFza1F1ZXVlcyA9IHtcbiAgICB0YXNrczogW10sXG4gICAgZnJhbWVzOiBbXSxcbiAgfTtcbiAgcHJpdmF0ZSBfcHJvbWlzZXM6IFRhc2tQcm9taXNlcyA9IHt9O1xuICBwcml2YXRlIF9yZXNvbHZlcnM6IFRhc2tSZXNvbHZlcnMgPSB7fTtcbiAgcHJpdmF0ZSBfb25FcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihvbkVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fb25FcnJvciA9IG9uRXJyb3I7XG4gIH1cblxuICBwcml2YXRlIF9mbHVzaFF1ZXVlID0gKHF1ZXVlVHlwZTogVGFza1F1ZXVlKSA9PiB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLl9xdWV1ZXNbcXVldWVUeXBlXTtcbiAgICB0cnkge1xuICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB0YXNrID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgdGFzaz8uKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgIHRoaXMuX29uRXJyb3IoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlc29sdmUgdGhlIHRhc2sgcHJvbWlzZVxuICAgICAgdGhpcy5fcmVzb2x2ZXJzW3F1ZXVlVHlwZV0/LigpO1xuICAgICAgdGhpcy5fcmVzb2x2ZXJzW3F1ZXVlVHlwZV0gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wcm9taXNlc1txdWV1ZVR5cGVdID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9zY2hlZHVsZSA9IChcbiAgICB0eXBlOiBUYXNrUXVldWUsXG4gICAgdGFzazogVm9pZEZ1bmN0aW9uLFxuICAgIHByaW9yaXRpemUgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLl9xdWV1ZXNbdHlwZV07XG4gICAgaWYgKHByaW9yaXRpemUpIHtcbiAgICAgIHF1ZXVlLnVuc2hpZnQodGFzayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlLnB1c2godGFzayk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9wcm9taXNlc1t0eXBlXSkge1xuICAgICAgdGhpcy5fcHJvbWlzZXNbdHlwZV0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLl9yZXNvbHZlcnNbdHlwZV0gPSByZXNvbHZlO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlID09PSBcImZyYW1lc1wiKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9mbHVzaFF1ZXVlLmJpbmQodGhpcywgXCJmcmFtZXNcIikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2sodGhpcy5fZmx1c2hRdWV1ZS5iaW5kKHRoaXMsIFwidGFza3NcIikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wcm9taXNlc1t0eXBlXTtcbiAgfTtcblxuICBzY2hlZHVsZU1pY3JvdGFzayA9IChcbiAgICB0YXNrOiBWb2lkRnVuY3Rpb24sXG4gICAgcHJpb3JpdGl6ZSA9IGZhbHNlLFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5fc2NoZWR1bGUoXCJ0YXNrc1wiLCB0YXNrLCBwcmlvcml0aXplKTtcbiAgfTtcblxuICBzY2hlZHVsZUZyYW1lVGFzayA9IChcbiAgICB0YXNrOiBWb2lkRnVuY3Rpb24sXG4gICAgcHJpb3JpdGl6ZSA9IGZhbHNlLFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5fc2NoZWR1bGUoXCJmcmFtZXNcIiwgdGFzaywgcHJpb3JpdGl6ZSk7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBhc3luY1Rhc2tzID0gbmV3IFRhc2tTY2hlZHVsZXIoKTtcbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBlbGVtZW50TWF0Y2hlcyB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc05vZGUsIGlzU2hhZG93Um9vdCB9IGZyb20gXCIuLi91dGlsL2RvbVwiO1xuXG5leHBvcnQgdHlwZSBFdmVudE5hbWUgPSBrZXlvZiBHbG9iYWxFdmVudEhhbmRsZXJzRXZlbnRNYXA7XG5leHBvcnQgdHlwZSBFdmVudEhhbmRsZXI8SyBleHRlbmRzIEV2ZW50TmFtZSA9IEV2ZW50TmFtZT4gPSAoXG4gIGV2ZW50OiBHbG9iYWxFdmVudEhhbmRsZXJzRXZlbnRNYXBbS10sXG4pID0+IHZvaWQ7XG5cbnR5cGUgRXZlbnRIYW5kbGVyTWFwID0gTWFwPHN0cmluZywgRXZlbnRIYW5kbGVyPjtcblxuLyoqXG4gKiBNYW5hZ2VkIGV2ZW50IGRlbGVnYXRpb24gdG8gY29hbGVzY2UgZXZlbnQgbGlzdGVuZXJzIGZvciBhbiBlbnRpcmUgdHJlZSBpbnRvXG4gKiBzaW5nbGUgcm9vdC1sZXZlbCBsaXN0ZW5lcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIExpc3RlbiBmb3IgZXZlbnRzIGZyb20gYW55IGNoaWxkIGVsZW1lbnQgb2YgdGhlIGRlbGVnYXRlZCByb290XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGVsZWdhdG9yID0gbmV3IEV2ZW50RGVsZWdhdG9yKCRyb290KTtcbiAqIGRlbGVnYXRvci5hZGREZWxlZ2F0ZWRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBMaXN0ZW4gZm9yIGV2ZW50cyBmcm9tIGNoaWxkIGVsZW1lbnRzIG1hdGNoaW5nIGAuYWN0aW9uYFxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlbGVnYXRvciA9IG5ldyBFdmVudERlbGVnYXRvcigkcm9vdCk7XG4gKiBkZWxlZ2F0b3IuYWRkRGVsZWdhdGVkTGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljaywgXCIuYWN0aW9uXCIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudERlbGVnYXRvciB7XG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgU2hhZG93Um9vdCB8IERvY3VtZW50O1xuICBwcml2YXRlIF9yb290TGlzdGVuZXJzOiBFdmVudEhhbmRsZXJNYXAgPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX2V2ZW50czogTWFwPHN0cmluZywgTWFwPHN0cmluZywgU2V0PEV2ZW50SGFuZGxlcj4+PiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihyb290OiBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3QgfCBEb2N1bWVudCA9IGRvY3VtZW50KSB7XG4gICAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50OiBzdHJpbmcpOiBNYXA8c3RyaW5nLCBTZXQ8RXZlbnRIYW5kbGVyPj4ge1xuICAgIGxldCBoYW5kbGVyTWFwID0gdGhpcy5fZXZlbnRzLmdldChldmVudCk7XG5cbiAgICBpZiAoaGFuZGxlck1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYW5kbGVyTWFwID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5fZXZlbnRzLnNldChldmVudCwgaGFuZGxlck1hcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJNYXA7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVyc0ZvckV2ZW50QW5kUXVlcnk8RSBleHRlbmRzIEV2ZW50TmFtZT4oXG4gICAgZXZlbnQ6IEUsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU2V0PEV2ZW50SGFuZGxlcjxFPj4ge1xuICAgIGNvbnN0IGhhbmRsZXJNYXAgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50KTtcbiAgICBsZXQgaGFuZGxlclNldCA9IGhhbmRsZXJNYXAuZ2V0KHF1ZXJ5KTtcblxuICAgIGlmIChoYW5kbGVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhbmRsZXJTZXQgPSBuZXcgU2V0KCk7XG4gICAgICBoYW5kbGVyTWFwLnNldChxdWVyeSwgaGFuZGxlclNldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJTZXQ7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVSb290TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcm9vdExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlcnNGb3JFdmVudCA9IHRoaXMuX2hhbmRsZXJzRm9yRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBldmVudDtcblxuICAgICAgaWYgKHRhcmdldCA9PT0gbnVsbCB8fCAhaXNOb2RlKHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSB0YXJnZXQ7XG5cbiAgICAgIGxldCBzdG9wSW1tZWRpYXRlQ2FsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBvcmlnaW5hbEZuID0gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4ge1xuICAgICAgICBvcmlnaW5hbEZuLmNhbGwoZXZlbnQpO1xuICAgICAgICBzdG9wSW1tZWRpYXRlQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLl9yb290KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIGludmFsaWQgZWxlbWVudHNcbiAgICAgICAgaWYgKCFpc0VsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW52b2tlIGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgW3F1ZXJ5LCBoYW5kbGVyc10gb2YgaGFuZGxlcnNGb3JFdmVudCkge1xuICAgICAgICAgIGlmIChxdWVyeSA9PT0gXCIqXCIgfHwgZWxlbWVudE1hdGNoZXMobm9kZSwgcXVlcnkpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKG5vZGUsIGV2ZW50KTtcblxuICAgICAgICAgICAgICAvLyBSZXNwZWN0IC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBhbmQgLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgaWYgKHN0b3BJbW1lZGlhdGVDYWxsZWQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc3BlY3QgLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIGlmIChldmVudC5jYW5jZWxCdWJibGUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLl9yb290IHx8IGlzU2hhZG93Um9vdChub2RlKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuX3Jvb3RMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIHRoaXMuX3Jvb3QuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIGFkZExpc3RlbmVyPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBoYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICAgcXVlcnlGaWx0ZXI6IHN0cmluZyA9IFwiKlwiLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50QW5kUXVlcnkoZXZlbnROYW1lLCBxdWVyeUZpbHRlcikuYWRkKGhhbmRsZXIpO1xuICAgIHRoaXMuX2NyZWF0ZVJvb3RMaXN0ZW5lcihldmVudE5hbWUpO1xuICB9XG5cbiAgcmVtb3ZlTGlzdGVuZXIoXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWUsXG4gICAgaGFuZGxlcjogRXZlbnRIYW5kbGVyLFxuICAgIHF1ZXJ5RmlsdGVyOiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGhhbmRsZXJTZXQgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50QW5kUXVlcnkoZXZlbnROYW1lLCBxdWVyeUZpbHRlcik7XG4gICAgaGFuZGxlclNldC5kZWxldGUoaGFuZGxlcik7XG5cbiAgICAvLyBJZiB0aGF0IHdhcyB0aGUgbGFzdCBoYW5kbGVyIGZvciB0aGF0IGV2ZW50L3F1ZXJ5IGNvbWJvLCBkZWxldGUgdGhlIHNldFxuICAgIGlmIChoYW5kbGVyU2V0LnNpemUgPT09IDApIHtcbiAgICAgIGNvbnN0IGV2ZW50SGFuZGxlclNldHMgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICBldmVudEhhbmRsZXJTZXRzLmRlbGV0ZShxdWVyeUZpbHRlcik7XG4gICAgfVxuICB9XG5cbiAgY2xlYW51cCA9ICgpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IFtldmVudCwgaGFuZGxlcl0gb2YgdGhpcy5fcm9vdExpc3RlbmVycykge1xuICAgICAgdGhpcy5fcm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yb290TGlzdGVuZXJzLmNsZWFyKCk7XG4gIH07XG59XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IFN0YXRlIH0gZnJvbSBcIiNzdGF0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGUsIHR5cGUgVGVtcGxhdGVDb250ZXh0IH0gZnJvbSBcIiN0ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEF0dHJpYnV0ZXMgfSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB7IGFzeW5jVGFza3MgfSBmcm9tIFwiLi4vdGFzay1zY2hlZHVsZXJcIjtcbmltcG9ydCB7IHdhbGtQYXJlbnRzIH0gZnJvbSBcIi4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgeyBFdmVudERlbGVnYXRvciwgdHlwZSBFdmVudEhhbmRsZXIsIHR5cGUgRXZlbnROYW1lIH0gZnJvbSBcIi4vZGVsZWdhdG9yXCI7XG5cbmNvbnN0IE1BWF9TRVFVRU5USUFMX1JFTkRFUlMgPSAxMDAwMDtcbmNvbnN0IEJMQU5LX1RFTVBMQVRFID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuY29uc3QgSE9TVF9UQVJHRVQgPSBcIjpob3N0XCI7XG5cbmV4cG9ydCBlbnVtIFJvb3RNb2RlIHtcbiAgQ2xvc2VkID0gXCJjbG9zZWRcIixcbiAgT3BlbiA9IFwib3BlblwiLFxufVxuXG50eXBlIEludGVybmFsczxTdGF0ZVNoYXBlIGV4dGVuZHMgb2JqZWN0ID0ge30+ID0ge1xuICBpc0ZpbmFsaXplZDogYm9vbGVhbjtcbiAgaXNJbml0aWFsUmVuZGVyQ29tcGxldGU6IGJvb2xlYW47XG4gIGlzUmVuZGVyU2NoZWR1bGVkOiBib29sZWFuO1xuICBpc1JlbmRlcmluZzogYm9vbGVhbjtcbiAgc2VxdWVudGlhbFJlbmRlckNvdW50OiBudW1iZXI7XG4gIGxhc3RSZW5kZXJlZEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+O1xuICBwZW5kaW5nQXR0cmlidXRlQ2hhbmdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG5cbiAgc3RhdGU/OiBTdGF0ZTxTdGF0ZVNoYXBlPjtcbiAgZGVsZWdhdG9yPzogRXZlbnREZWxlZ2F0b3I7XG4gIGhvc3RMaXN0ZW5lcnM/OiBTZXQ8Q29tcG9uZW50SG9zdExpc3RlbmVyPjtcbiAgY2xlYW51cEZuPzogVm9pZEZ1bmN0aW9uO1xufTtcblxudHlwZSBDb21wb25lbnRIb3N0TGlzdGVuZXIgPSB7XG4gIGhhbmRsZXI6IEV2ZW50SGFuZGxlcjtcbiAgZXZlbnQ6IEV2ZW50TmFtZTtcbn07XG5cbi8qKlxuICogVGhlICoqQ29tcG9uZW50KiogY2xhc3MgZXh0ZW5kcyB0aGUgYmFzZSBIVE1MRWxlbWVudCBjbGFzcyB0byBwcm92aWRlIGFuXG4gKiBlcmdvbm9taWMgd2F5IHRvIGRlc2lnbiBhbmQgZGV2ZWxvcCBXZWIgQ29tcG9uZW50cyB3aXRoIHJlYWN0aXZlIHN0YXRlLFxuICogbWFuYWdlZCBhdHRyaWJ1dGVzLCBhbmQgZHluYW1pYyB0ZW1wbGF0aW5nLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50PFxuICBTdGF0ZVNoYXBlIGV4dGVuZHMgb2JqZWN0ID0ge30sXG4+IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAvKipcbiAgICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIENvbXBvbmVudCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGlzQ29tcG9uZW50KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29tcG9uZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgQ29tcG9uZW50XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgQ29tcG9uZW50IGNsYXNzXG4gICAqL1xuICBzdGF0aWMgaXNDb21wb25lbnRDbGFzcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHR5cGVvZiBDb21wb25lbnQge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICh2YWx1ZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBDb21wb25lbnQgfHwgdmFsdWUgPT09IENvbXBvbmVudClcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHJlYWRDb21wb25lbnRUYWdOYW1lKGNvbXBvbmVudENsYXNzOiB0eXBlb2YgQ29tcG9uZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHRhZ05hbWUgfSA9IGNvbXBvbmVudENsYXNzO1xuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIGlmICh0YWdOYW1lID09PSBcIlwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW0NvbXBvbmVudF0gRW1wdHkgdGFnIG5hbWUgd2hlbiByZWFkaW5nIGZyb20gY29tcG9uZW50ICR7Y29tcG9uZW50Q2xhc3MubmFtZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YWdOYW1lO1xuICB9XG5cbiAgLyoqIFRoZSBIVE1MIHRhZyBuYW1lIHRvIHVzZSBmb3IgdGhpcyBDb21wb25lbnQgKi9cbiAgc3RhdGljIHRhZ05hbWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgLyoqIEFuIEhUTUwgVGVtcGxhdGUgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHRvIHVzZS4gKi9cbiAgc3RhdGljIHRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50IHwgVGVtcGxhdGUgPSBCTEFOS19URU1QTEFURTtcblxuICAvKiogU3R5bGVzIHRvIGVuY2Fwc3VsYXRlIHRvIHRoaXMgY29tcG9uZW50J3Mgcm9vdC4gKi9cbiAgc3RhdGljIHN0eWxlOiBDU1NTdHlsZVNoZWV0IHwgQ1NTU3R5bGVTaGVldFtdIHwgc3RyaW5nID0gW107XG5cbiAgLyoqIEF0dHJpYnV0ZXMgdG8gd2F0Y2ggZm9yIGNoYW5nZXMgZm9yIHVwZGF0ZXMuICovXG4gIHN0YXRpYyBvYnNlcnZlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlIGZvciB0aGlzIENvbXBvbmVudCdzIFNoYWRvd1Jvb3QuXG4gICAqXG4gICAqIE1ETjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NoYWRvd1Jvb3QvbW9kZVxuICAgKi9cbiAgc3RhdGljIHJvb3RNb2RlOiBSb290TW9kZSA9IFJvb3RNb2RlLkNsb3NlZDtcblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gbGlmZWN5Y2xlIG1ldGhvZC4gTWFpbiBzY3JpcHRpbmcgYW5kIGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHJldHVybnMgYSBmdW5jdGlvbiB0byBoYW5kbGUgY2xlYW51cCB0YXNrcyB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAgICovXG4gIHB1YmxpYyBzY3JpcHQ/KCk6IFZvaWRGdW5jdGlvbiB8IHZvaWQ7XG5cbiAgLyoqIENhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgZWFjaCB0ZW1wbGF0ZSB1cGRhdGUgKi9cbiAgcHVibGljIGJlZm9yZVVwZGF0ZT8oY2hhbmdlZEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KTogdm9pZDtcblxuICAvKiogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVtcGxhdGUgdXBkYXRlICovXG4gIHB1YmxpYyBhZnRlclVwZGF0ZT8ocHJldmlvdXNBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPik6IHZvaWQ7XG5cbiAgLyoqIEZpbmFsIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIHVubW91bnRpbmcgcHJvY2Vzcy4gKi9cbiAgcHVibGljIGZpbmFsaXplPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXJyb3JzIHRocm93biBkdXJpbmcgbGlmZWN5Y2xlIG1ldGhvZHMgb2YgdGhpcyBjb21wb25lbnQgb3IgYW55XG4gICAqIHVuaGFuZGxlZCBlcnJvcnMgZnJvbSBjaGlsZCBjb21wb25lbnRzLlxuICAgKi9cbiAgcHVibGljIG9uRXJyb3I/KGVycm9yOiB1bmtub3duKTogdm9pZDtcblxuICAvKiogVGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoaXMgQ29tcG9uZW50ICovXG4gIHB1YmxpYyBpbml0aWFsU3RhdGU/KCk6IFN0YXRlPFN0YXRlU2hhcGU+IHwgU3RhdGVTaGFwZTtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHJldHVybmluZyBhbiBvYmplY3Qgd2hpY2ggcG9wdWxhdGVzIHRoZSBgZGF0YWAgdmFsdWVzXG4gICAqIGluIHRoZSB0ZW1wbGF0aW5nIGVuZ2luZS4gU3VjaCB2YWx1ZXMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBgKmAgbm90YXRpb24uXG4gICAqL1xuICBwdWJsaWMgY29tcHV0ZWRQcm9wZXJ0aWVzPyhcbiAgICB0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sXG4gICAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4sXG4gICAgc3RhdGU6IFN0YXRlU2hhcGUsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIHB1YmxpYyByZWFkb25seSByb290OiBTaGFkb3dSb290O1xuICBwdWJsaWMgcmVhZG9ubHkgdGVtcGxhdGU6IFRlbXBsYXRlO1xuXG4gIHByaXZhdGUgX2NtcDogSW50ZXJuYWxzPFN0YXRlU2hhcGU+ID0ge1xuICAgIGlzRmluYWxpemVkOiBmYWxzZSxcbiAgICBpc0luaXRpYWxSZW5kZXJDb21wbGV0ZTogZmFsc2UsXG4gICAgaXNSZW5kZXJTY2hlZHVsZWQ6IGZhbHNlLFxuICAgIGlzUmVuZGVyaW5nOiBmYWxzZSxcbiAgICBzZXF1ZW50aWFsUmVuZGVyQ291bnQ6IDAsXG4gICAgbGFzdFJlbmRlcmVkQXR0cmlidXRlczoge30sXG4gICAgcGVuZGluZ0F0dHJpYnV0ZUNoYW5nZXM6IHt9LFxuICB9O1xuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgSW50ZXJuYWxzIGFuZCBQcml2YXRlIE1ldGhvZHMgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3Qge1xuICAgICAgdGVtcGxhdGUsXG4gICAgICBzdHlsZSxcbiAgICAgIHJvb3RNb2RlOiBtb2RlLFxuICAgIH0gPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBDb21wb25lbnQ7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGVsZW1lbnQncyBzaGFkb3cgZG9tXG4gICAgdGhpcy5yb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlIH0pO1xuXG4gICAgLy8gQ29lcmNlIGFuZCBhZG9wdCBzdHlsZXNcbiAgICBsZXQgYWRvcHRTdHlsZXM6IENTU1N0eWxlU2hlZXRbXSA9IFtdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUpKSB7XG4gICAgICBhZG9wdFN0eWxlcyA9IHN0eWxlO1xuICAgIH0gZWxzZSBpZiAoc3R5bGUgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0KSB7XG4gICAgICBhZG9wdFN0eWxlcyA9IFtzdHlsZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFkb3B0U2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldCgpO1xuICAgICAgYWRvcHRTaGVldC5yZXBsYWNlU3luYyhzdHlsZSk7XG4gICAgICBhZG9wdFN0eWxlcyA9IFthZG9wdFNoZWV0XTtcbiAgICB9XG5cbiAgICB0aGlzLnJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzLnB1c2goLi4uYWRvcHRTdHlsZXMpO1xuXG4gICAgLy8gQWRvcHQgdGVtcGxhdGVcbiAgICB0aGlzLnRlbXBsYXRlID0gVGVtcGxhdGUuaXNUZW1wbGF0ZSh0ZW1wbGF0ZSlcbiAgICAgID8gdGVtcGxhdGVcbiAgICAgIDogbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgfVxuXG4gIC8qKiBQcm9kdWNlIHRoZSBkYXRhIG9iamVjdCB0byBwYXNzIHRvIHRoZSB0ZW1wbGF0ZSdzIHJlbmRlciBmdW5jdGlvbiAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJDb250ZXh0KFxuICAgIGF0dHI6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+LFxuICApOiBUZW1wbGF0ZUNvbnRleHQge1xuICAgIGNvbnN0IHN0YXRlID0gKHRoaXMuX2NtcC5zdGF0ZT8ucmF3ID8/IHt9KSBhcyBTdGF0ZVNoYXBlO1xuICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5jb21wdXRlZFByb3BlcnRpZXM/LmNhbGwodGhpcywgYXR0ciwgc3RhdGUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHI6IGF0dHIsXG4gICAgICBkYXRhOiBjb21wdXRlZCxcbiAgICAgIHN0YXRlOiBzdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfZXNjYWxhdGVFcnJvcihlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGlzRXJyb3JIYW5kbGVkID0gd2Fsa1BhcmVudHModGhpcywgKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ29tcG9uZW50ICYmIG5vZGUub25FcnJvcikge1xuICAgICAgICBub2RlLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaXNFcnJvckhhbmRsZWQpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlcG9ydEVycm9yKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5vbkVycm9yID8gdGhpcy5vbkVycm9yKGVycm9yKSA6IHRoaXMuX2VzY2FsYXRlRXJyb3IoZXJyb3IpO1xuICB9XG5cbiAgLyoqIFRoZSBhY3R1YWwgdXBkYXRlIGJlaGF2aW9yICovXG4gIHByaXZhdGUgX3JlbmRlciA9ICgpOiB2b2lkID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gSW1tZWRpYXRlbHkgZmxpcCBmbGFncyB0byBkZW5vdGUgYSByZW5kZXIgaXMgaW4gcHJvZ3Jlc3MgYW5kIGFsbG93XG4gICAgICAvLyBxdWV1ZWluZyBhbm90aGVyIHJlbmRlciByZXF1ZXN0LlxuICAgICAgdGhpcy5fY21wLmlzUmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NtcC5pc1JlbmRlclNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBDYWNoZSB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSBwcmV2aW91cyByZW5kZXJcbiAgICAgIGNvbnN0IHByZXZBdHRycyA9IHRoaXMuX2NtcC5sYXN0UmVuZGVyZWRBdHRyaWJ1dGVzO1xuXG4gICAgICB0aGlzLmJlZm9yZVVwZGF0ZT8uKHRoaXMuX2NtcC5wZW5kaW5nQXR0cmlidXRlQ2hhbmdlcyk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBzbmFwc2hvdCBvZiBhdHRyaWJ1dGVzXG4gICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gZ2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcyk7XG4gICAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcih0aGlzLnJvb3QsIHRoaXMuX2dldFJlbmRlckNvbnRleHQobmV3QXR0cmlidXRlcykpO1xuICAgICAgdGhpcy5fY21wLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZXMgPSBuZXdBdHRyaWJ1dGVzO1xuXG4gICAgICB0aGlzLmFmdGVyVXBkYXRlPy4ocHJldkF0dHJzKTtcblxuICAgICAgLy8gSWYgdGhlIGB3aWxsUmVuZGVyYCBmbGFnIHdhcyBmbGlwcGVkLCBpbW1lZGlhdGVseSBwZXJmb3JtIGEgcmVuZGVyXG4gICAgICBpZiAodGhpcy5fY21wLmlzUmVuZGVyU2NoZWR1bGVkKSB7XG4gICAgICAgIHRoaXMuX2NtcC5zZXF1ZW50aWFsUmVuZGVyQ291bnQgKz0gMTtcblxuICAgICAgICBpZiAodGhpcy5fY21wLnNlcXVlbnRpYWxSZW5kZXJDb3VudCA+PSBNQVhfU0VRVUVOVElBTF9SRU5ERVJTKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgICAgIEVycm9yQ29kZS5NQVhfU0VRVUVOVElBTF9SRU5ERVJTLFxuICAgICAgICAgICAgYCR7dGhpcy5fY21wLnNlcXVlbnRpYWxSZW5kZXJDb3VudH1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NtcC5zZXF1ZW50aWFsUmVuZGVyQ291bnQgPSAwO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9jbXAuaXNSZW5kZXJTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fY21wLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX2Fkb3B0U3RhdGUoc3RhdGU6IFN0YXRlU2hhcGUgfCBTdGF0ZTxTdGF0ZVNoYXBlPikge1xuICAgIC8vIElmIHRoaXMgaXMgZXhhY3RseSBvdXIgb3duIHN0YXRlIG9iamVjdCwgZG8gbm90aGluZ1xuICAgIGlmIChPYmplY3QuaXModGhpcy5fY21wLnN0YXRlLCBzdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBzdGF0ZSBleGlzdHMsIHJlbW92ZSB0aGUgbGlzdGVuZXIgYW5kIHNjaGVkdWxlIGEgcmVuZGVyXG4gICAgaWYgKHRoaXMuX2NtcC5zdGF0ZSkge1xuICAgICAgdGhpcy5fY21wLnN0YXRlLnJlbW92ZUxpc3RlbmVyKHRoaXMucmVuZGVyKTtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgLy8gQWRvcHQgdGhlIGluY29taW5nIHN0YXRlIG9iaiBvciB3cmFwIGFuZCBhZG9wdCBpdFxuICAgIGNvbnN0IGluY29taW5nU3RhdGVPYmogPSBTdGF0ZS5pc1N0YXRlPFN0YXRlU2hhcGU+KHN0YXRlKVxuICAgICAgPyBzdGF0ZVxuICAgICAgOiBuZXcgU3RhdGUoc3RhdGUpO1xuICAgIHRoaXMuX2NtcC5zdGF0ZSA9IGluY29taW5nU3RhdGVPYmo7XG5cbiAgICAvLyBFbnN1cmUgdGhlcmUgaXMgbm90IGFjY2lkZW50YWxseSB0d28gb2YgdGhlIHNhbWUgcmVuZGVyIGxpc3RlbmVyc1xuICAgIHRoaXMuX2NtcC5zdGF0ZS5yZW1vdmVMaXN0ZW5lcih0aGlzLnJlbmRlcik7XG4gICAgdGhpcy5fY21wLnN0YXRlLmFkZExpc3RlbmVyKHRoaXMucmVuZGVyKTtcbiAgfVxuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgIEN1c3RvbSBFbGVtZW50IENhbGxiYWNrIE92ZXJyaWRlcyAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzY3JpcHR9IGluc3RlYWRcbiAgICovXG4gIHByb3RlY3RlZCBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY21wLmlzSW5pdGlhbFJlbmRlckNvbXBsZXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXN5bmNUYXNrcy5zY2hlZHVsZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jbXAuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jbXAuaXNSZW5kZXJTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZ2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcyk7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0YXRlZnVsIGNvbXBvbmVudCwgc2V0IHVwIHRoYXQgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgICAgdGhpcy5fYWRvcHRTdGF0ZSh0aGlzLmluaXRpYWxTdGF0ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKHRoaXMucm9vdCwgdGhpcy5fZ2V0UmVuZGVyQ29udGV4dChhdHRyaWJ1dGVzKSk7XG5cbiAgICAgICAgdGhpcy5fY21wLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgICAgICB0aGlzLl9jbXAuaXNJbml0aWFsUmVuZGVyQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jbXAuY2xlYW51cEZuID0gdGhpcy5zY3JpcHQ/LigpID8/IHVuZGVmaW5lZDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuX2NtcC5pc1JlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgZmluYWxpemV9XG4gICAqL1xuICBwcm90ZWN0ZWQgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NtcC5pc0ZpbmFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFzeW5jVGFza3Muc2NoZWR1bGVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgLy8gSWYgdGhpcyB0YXNrIHJ1bnMgYnV0IHRoZSBjb21wb25lbnQgaXMgc3RpbGwgY29ubmVjdGVkLCB0aGVuIGRvIG5vdGhpbmdcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGNvbXBvbmVudCB3YXMganVzdCBtb3ZlZCBpbiB0aGUgRE9NLlxuICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQgfHwgIXRoaXMuX2NtcC5pc0luaXRpYWxSZW5kZXJDb21wbGV0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NtcC5pc0ZpbmFsaXplZCA9IHRydWU7XG5cbiAgICAgIC8vIE9ubHkgcnVuIHRoZSBkaXNjb25uZWN0IGlmIHRoZSBlbGVtZW50IGlzIGFjdHVhbGx5IHVubW91bnRlZCBhbmQgbm90XG4gICAgICAvLyBqdXN0IG1vdmVkLiBVc2luZyB0aGlzIGluIHBsYWNlIG9mIGNvbm5lY3RlZE1vdmVDYWxsYmFjaygpIGZvciBjb21wYXRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZGVsZWdhdG9yLCBjbGVhbnVwRm4sIGhvc3RMaXN0ZW5lcnMgfSA9IHRoaXMuX2NtcDtcbiAgICAgICAgZGVsZWdhdG9yPy5jbGVhbnVwKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IGxpc3RlbmVycyBzZXQgdXAgb24gc2VsZlxuICAgICAgICBpZiAoaG9zdExpc3RlbmVycyAmJiBob3N0TGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBob3N0TGlzdGVuZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobGlzdGVuZXIuZXZlbnQsIGxpc3RlbmVyLmhhbmRsZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNsZWFudXBGbj8uKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBSdW4gdGhlIGZpbmFsaXplIGNhbGwgYWZ0ZXIgZXZlcnl0aGluZywgZXZlbiBpZiB0aGUgY2xlYW51cCBmbiBmYWlsZWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXplPy4oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGJlZm9yZVVwZGF0ZX0gYW5kIHtAbGluayBhZnRlclVwZGF0ZX0gaW5zdGVhZFxuICAgKi9cbiAgcHJvdGVjdGVkIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgXzogc3RyaW5nIHwgbnVsbCxcbiAgICBuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgLy8gSWdub3JlIGF0dHJpYnV0ZSBjaGFuZ2VzIHRoYXQgb2NjdXIgZHVyaW5nIGFuIHVwZGF0ZSwgYXMgdGhleSBhcmVcbiAgICAvLyBjb21pbmcgZnJvbSBpbnNpZGUgdGhlIGhvdXNlXG4gICAgaWYgKHRoaXMuX2NtcC5pc1JlbmRlcmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhY2hlIHRoZSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZVxuICAgIHRoaXMuX2NtcC5wZW5kaW5nQXR0cmlidXRlQ2hhbmdlc1tuYW1lXSA9IG5ld1ZhbHVlO1xuXG4gICAgLy8gU2NoZWR1bGUgYSByZW5kZXJcbiAgICBpZiAoIXRoaXMuX2NtcC5pc1JlbmRlclNjaGVkdWxlZCkge1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgICAgICAgICBQdWJsaWMgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgZ2V0IGlzTW91bnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCAmJiB0aGlzLl9jbXAuaXNJbml0aWFsUmVuZGVyQ29tcGxldGU7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXNzIHRoZSBmdWxsIHtAbGluayBTdGF0ZX0gaW5zdGFuY2UgZm9yIHRoaXMgQ29tcG9uZW50LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGEgY29tcG9uZW50IHdoaWNoIGlzIG5vdCB1c2luZyByZWFjdGl2ZSBzdGF0ZVxuICAgKiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBiZWluZyB0aHJvd24uXG4gICAqL1xuICBnZXRTdGF0ZSgpOiBTdGF0ZTxTdGF0ZVNoYXBlPiB7XG4gICAgaWYgKCF0aGlzLl9jbXAuc3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jbXAuc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXNzb3IgZm9yIGxpdmUgcmVhY3RpdmUgc3RhdGUuXG4gICAqXG4gICAqIEZvciB0aGUgZnVsbCBzdGF0ZSBtYW5pcHVsYXRpb24gQVBJLCB1c2Uge0BsaW5rIGdldFN0YXRlfVxuICAgKi9cbiAgZ2V0IHN0YXRlKCk6IFN0YXRlU2hhcGUge1xuICAgIHJldHVybiB0aGlzLmdldFN0YXRlKCkubGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBjdXJyZW50IHN0YXRlIHdpdGggYSBuZXcgdmFsdWUgb3IgYWRvcHQgYSB3aG9sZSBkaWZmZXJlbnQgU3RhdGVcbiAgICogaW5zdGFuY2VcbiAgICovXG4gIHNldCBzdGF0ZShuZXdTdGF0ZTogU3RhdGVTaGFwZSB8IFN0YXRlPFN0YXRlU2hhcGU+KSB7XG4gICAgdGhpcy5fYWRvcHRTdGF0ZShuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgc2NoZWR1bGUgYSByZW5kZXIgdG8gb2NjdXIsIG9wdGlvbmFsbHkgcHJvdmlkaW5nIGEgY2FsbGJhY2sgdG9cbiAgICogaW52b2tlIGFmdGVyIHRoZSByZW5kZXIgY29tcGxldGVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBDYWxsaW5nIHtAbGluayByZW5kZXJ9IG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIGV2ZW50IGxvb3Agd29uJ3RcbiAgICogc2NoZWR1bGUgbXVsdGlwbGUgcmVuZGVycy4gUmVuZGVycyBhcmUgc2NoZWR1bGVkIHRvIG9jY3VyIG9uIHRoZSBuZXh0XG4gICAqIGFuaW1hdGlvbiBmcmFtZS5cbiAgICovXG4gIHJlbmRlciA9ICgpOiB2b2lkID0+IHtcbiAgICAvLyBQcmV2ZW50IHNjaGVkdWxpbmcgbXVsdGlwbGUgcmVuZGVyc1xuICAgIGlmICh0aGlzLl9jbXAuaXNSZW5kZXJTY2hlZHVsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jbXAuaXNSZW5kZXJTY2hlZHVsZWQgPSB0cnVlO1xuXG4gICAgLy8gSWYgY3VycmVudGx5IHJlbmRlcmluZywgZG9uJ3QgcmVxdWVzdCBhIHJlbmRlciwgaXQgd2lsbCBhdXRvLWNvbnRpbnVlXG4gICAgLy8gdW50aWwgdGhlcmUgYXJlIG5vIGNoYW5nZXMgdG8gcmVuZGVyXG4gICAgaWYgKHRoaXMuX2NtcC5pc1JlbmRlcmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgcmVuZGVyIGlzIHJlcXVlc3RlZCBhbmQgd2UncmUgbm90IHJlbmRlcmluZywgcmVxdWVzdCBhIHJlbmRlciBmcmFtZVxuICAgIGFzeW5jVGFza3Muc2NoZWR1bGVGcmFtZVRhc2sodGhpcy5fcmVuZGVyKTtcbiAgfTtcblxuICAvKipcbiAgICogTGlzdGVuIGZvciBldmVudHMgb24gYSBjaGlsZCBlbGVtZW50IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeVxuICAgKlxuICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHdoaWNoIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHdoZW4gY2FsbGVkXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEV2ZW50IGxpc3RlbmVycyBjcmVhdGVkIHdpdGggdGhpcyBtZXRob2QgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cCB3aGVuXG4gICAqIHRoZSBjb21wb25lbnQgdW5tb3VudHMuIFlvdSBjYW4gbWFudWFsbHkgcmVtb3ZlIHRoZSBsaXN0ZW5lciBkdXJpbmcgdGhlXG4gICAqIGNvbXBvbmVudCdzIGxpZmVjeWNsZSBieSBjYWxsaW5nIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpZiBuZWVkIGJlLlxuICAgKi9cbiAgbGlzdGVuPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIHRhcmdldDogc3RyaW5nLFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBldmVudEhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgKTogVm9pZEZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGV2ZW50cyBvbiBhIGNoaWxkIGVsZW1lbnQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbXBvbmVudCdzIHRhZ1xuICAgKlxuICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHdoaWNoIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHdoZW4gY2FsbGVkXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEV2ZW50IGxpc3RlbmVycyBjcmVhdGVkIHdpdGggdGhpcyBtZXRob2QgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cCB3aGVuXG4gICAqIHRoZSBjb21wb25lbnQgdW5tb3VudHMuIFlvdSBjYW4gbWFudWFsbHkgcmVtb3ZlIHRoZSBsaXN0ZW5lciBkdXJpbmcgdGhlXG4gICAqIGNvbXBvbmVudCdzIGxpZmVjeWNsZSBieSBjYWxsaW5nIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpZiBuZWVkIGJlLlxuICAgKi9cbiAgbGlzdGVuPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIHRhcmdldDogdHlwZW9mIENvbXBvbmVudDxhbnk+LFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBldmVudEhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgKTogVm9pZEZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGV2ZW50cyBvbiB0aGUgaG9zdCBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gd2hpY2ggcmVtb3ZlcyB0aGUgbGlzdGVuZXIgd2hlbiBjYWxsZWRcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRXZlbnQgbGlzdGVuZXJzIGNyZWF0ZWQgd2l0aCB0aGlzIG1ldGhvZCBhcmUgYXV0b21hdGljYWxseSBjbGVhbmVkIHVwIHdoZW5cbiAgICogdGhlIGNvbXBvbmVudCB1bm1vdW50cy4gWW91IGNhbiBtYW51YWxseSByZW1vdmUgdGhlIGxpc3RlbmVyIGR1cmluZyB0aGVcbiAgICogY29tcG9uZW50J3MgbGlmZWN5Y2xlIGJ5IGNhbGxpbmcgdGhlIHJldHVybmVkIGZ1bmN0aW9uIGlmIG5lZWQgYmUuXG4gICAqL1xuICBsaXN0ZW48RSBleHRlbmRzIEV2ZW50TmFtZT4oXG4gICAgdGFyZ2V0OiB0eXBlb2YgdGhpcyxcbiAgICBldmVudE5hbWU6IEUsXG4gICAgZXZlbnRIYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICk6IFZvaWRGdW5jdGlvbjtcblxuICAvKipcbiAgICogTGlzdGVuIGZvciBldmVudHMgb24gdGhlIGhvc3QgZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHdoaWNoIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHdoZW4gY2FsbGVkXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEV2ZW50IGxpc3RlbmVycyBjcmVhdGVkIHdpdGggdGhpcyBtZXRob2QgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cCB3aGVuXG4gICAqIHRoZSBjb21wb25lbnQgdW5tb3VudHMuIFlvdSBjYW4gbWFudWFsbHkgcmVtb3ZlIHRoZSBsaXN0ZW5lciBkdXJpbmcgdGhlXG4gICAqIGNvbXBvbmVudCdzIGxpZmVjeWNsZSBieSBjYWxsaW5nIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpZiBuZWVkIGJlLlxuICAgKi9cbiAgbGlzdGVuPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIHRhcmdldDogXCI6aG9zdFwiLFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBldmVudEhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgKTogVm9pZEZ1bmN0aW9uO1xuXG4gIGxpc3RlbjxFIGV4dGVuZHMgRXZlbnROYW1lPihcbiAgICB0YXJnZXREZXNjcmlwdG9yOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PGFueT4gfCB0eXBlb2YgdGhpcyxcbiAgICBldmVudE5hbWU6IEUsXG4gICAgZXZlbnRIYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICk6IFZvaWRGdW5jdGlvbiB7XG4gICAgLy8gSG9zdCBlbGVtZW50IGV2ZW50c1xuICAgIGlmICh0YXJnZXREZXNjcmlwdG9yID09PSBIT1NUX1RBUkdFVCB8fCB0YXJnZXREZXNjcmlwdG9yID09PSB0aGlzKSB7XG4gICAgICBpZiAoIXRoaXMuX2NtcC5ob3N0TGlzdGVuZXJzKSB7XG4gICAgICAgIHRoaXMuX2NtcC5ob3N0TGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBob3N0TGlzdGVuZXJzID0gdGhpcy5fY21wLmhvc3RMaXN0ZW5lcnM7XG5cbiAgICAgIGNvbnN0IGVudHJ5OiBDb21wb25lbnRIb3N0TGlzdGVuZXIgPSB7XG4gICAgICAgIGV2ZW50OiBldmVudE5hbWUsXG4gICAgICAgIGhhbmRsZXI6IGV2ZW50SGFuZGxlciBhcyBFdmVudEhhbmRsZXIsXG4gICAgICB9O1xuXG4gICAgICBob3N0TGlzdGVuZXJzLmFkZChlbnRyeSk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICAgICAgICBob3N0TGlzdGVuZXJzLmRlbGV0ZShlbnRyeSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE90aGVyIG9iamVjdHMgYXMgYSBkZXNjcmlwdG9yIGluZGljYXRlIGFuIGVycm9yXG4gICAgaWYgKHR5cGVvZiB0YXJnZXREZXNjcmlwdG9yID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX0NBTExTSVRFKTtcbiAgICB9XG5cbiAgICAvLyBDaGlsZCBlbGVtZW50IGV2ZW50c1xuICAgIGlmICghdGhpcy5fY21wLmRlbGVnYXRvcikge1xuICAgICAgdGhpcy5fY21wLmRlbGVnYXRvciA9IG5ldyBFdmVudERlbGVnYXRvcih0aGlzLnJvb3QpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbGVnYXRvciA9IHRoaXMuX2NtcC5kZWxlZ2F0b3I7XG5cbiAgICBjb25zdCBxdWVyeSA9XG4gICAgICB0eXBlb2YgdGFyZ2V0RGVzY3JpcHRvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IHRhcmdldERlc2NyaXB0b3JcbiAgICAgICAgOiBDb21wb25lbnQucmVhZENvbXBvbmVudFRhZ05hbWUodGFyZ2V0RGVzY3JpcHRvcik7XG5cbiAgICBkZWxlZ2F0b3IuYWRkTGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIsIHF1ZXJ5KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkZWxlZ2F0b3IucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIgYXMgRXZlbnRIYW5kbGVyLCBxdWVyeSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGEge0BsaW5rIEN1c3RvbUV2ZW50fSB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIGFuZCBvcHRpb25zLlxuICAgKlxuICAgKiBEZWZhdWx0IG9wdGlvbnMgYXJlOlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHtcbiAgICogICBidWJibGVzOiB0cnVlLFxuICAgKiAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAqICAgY29tcG9zZWQ6IHRydWUsXG4gICAqICAgZGV0YWlsOiB1bmRlZmluZWQsXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gZXZlbnQgdG8gcHVibGlzaFxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgY3VzdG9tIGV2ZW50XG4gICAqL1xuICBkaXNwYXRjaEV2ZW50PFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogQ3VzdG9tRXZlbnRJbml0PFQ+KTogYm9vbGVhbjtcbiAgZGlzcGF0Y2hFdmVudChldmVudDogRXZlbnQpOiBib29sZWFuO1xuICBkaXNwYXRjaEV2ZW50PFQ+KGE6IEV2ZW50IHwgc3RyaW5nLCBiPzogQ3VzdG9tRXZlbnRJbml0PFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBhID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBiID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hFdmVudChhKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGEsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgLi4uYixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX0NBTExTSVRFKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgSFRNTCBFbGVtZW50IHdpdGggdGhlIHByb3ZpZGVkIElEIHdpdGhpbiB0aGVcbiAgICogc2hhZG93IHJvb3Qgb2YgdGhpcyBjb21wb25lbnQuXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBubyBlbGVtZW50IHdpdGggdGhlIHByb3ZpZGVkIElEIGlzIGZvdW5kXG4gICAqL1xuICByZWY8RSBleHRlbmRzIEhUTUxFbGVtZW50PihpZDogc3RyaW5nKTogRSB7XG4gICAgY29uc3QgbG9va3VwID0gdGhpcy5yb290LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoIWxvb2t1cCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19FTEVNRU5UKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvb2t1cCBhcyBFO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGlzIGVsZW1lbnQgdG8gYSBzdHJpbmdcbiAgICovXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyB0YWdOYW1lLCBuYW1lIH0gPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBDb21wb25lbnQ7XG4gICAgY29uc3QgY29tcHV0ZWROYW1lID0gdGFnTmFtZSA9PT0gXCJcIiA/IG5hbWUgOiB0YWdOYW1lO1xuICAgIGNvbnN0IGF0dHJTdHJpbmcgPSB0aGlzLmdldEF0dHJpYnV0ZU5hbWVzKClcbiAgICAgIC5tYXAoKGF0dHJOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgcmV0dXJuIHZhbCA/IGAke2F0dHJOYW1lfT1cIiR7dmFsfVwiYCA6IFwiXCI7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIGNvbnN0IGF0dHJzID0gYXR0clN0cmluZy5sZW5ndGggPiAwID8gYCAke2F0dHJTdHJpbmd9YCA6IFwiXCI7XG4gICAgcmV0dXJuIGA8JHtjb21wdXRlZE5hbWV9JHthdHRyc30+PC8ke2NvbXB1dGVkTmFtZX0+YDtcbiAgfVxufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlIH0gZnJvbSBcIiNzdGF0ZVwiO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBSb290TW9kZSB9IGZyb20gXCIuL2NvbXBvbmVudFwiO1xuXG5jb25zdCBCTEFOS19URU1QTEFURSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRTaG9ydGhhbmQ8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PiB7XG4gIC8qKiBBbiBIVE1MIFRlbXBsYXRlIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCB0byB1c2UuICovXG4gIHRlbXBsYXRlPzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvKiogU3R5bGVzIHRvIGVuY2Fwc3VsYXRlIHRvIHRoaXMgY29tcG9uZW50J3Mgcm9vdC4gKi9cbiAgc3R5bGU/OiBDU1NTdHlsZVNoZWV0IHwgQ1NTU3R5bGVTaGVldFtdIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBmb3IgdGhpcyBDb21wb25lbnQncyBTaGFkb3dSb290LlxuICAgKlxuICAgKiBNRE46IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TaGFkb3dSb290L21vZGVcbiAgICovXG4gIHJvb3RNb2RlPzogUm9vdE1vZGU7XG5cbiAgLyoqIEF0dHJpYnV0ZXMgdG8gd2F0Y2ggZm9yIGNoYW5nZXMgZm9yIHVwZGF0ZXMuICovXG4gIG9ic2VydmVkQXR0cmlidXRlcz86IHN0cmluZ1tdO1xuXG4gIC8qKiBUaGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhpcyBDb21wb25lbnQgKi9cbiAgaW5pdGlhbFN0YXRlPzpcbiAgICB8IFN0YXRlPFN0YXRlU2hhcGU+XG4gICAgfCBTdGF0ZVNoYXBlXG4gICAgfCAoKCkgPT4gU3RhdGU8U3RhdGVTaGFwZT4pXG4gICAgfCAoKCkgPT4gU3RhdGVTaGFwZSk7XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdoaWNoIHBvcHVsYXRlcyB0aGUgYGRhdGFgIHZhbHVlc1xuICAgKiBpbiB0aGUgdGVtcGxhdGluZyBlbmdpbmUuIFN1Y2ggdmFsdWVzIGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgYCpgIG5vdGF0aW9uLlxuICAgKi9cbiAgY29tcHV0ZWRQcm9wZXJ0aWVzPyhcbiAgICB0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sXG4gICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+LFxuICAgIHN0YXRlPzogU3RhdGVTaGFwZSxcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEluaXRpYWxpemF0aW9uIHNjcmlwdGluZyBmb3IgdGhpcyBDb21wb25lbnQgKi9cbiAgc2NyaXB0PzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPikgPT4gVm9pZEZ1bmN0aW9uIHwgdm9pZDtcblxuICAvKiogQ2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBlYWNoIHRlbXBsYXRlIHVwZGF0ZSAqL1xuICBiZWZvcmVVcGRhdGU/OiAoXG4gICAgdGhpczogQ29tcG9uZW50PFN0YXRlU2hhcGU+LFxuICAgIGNoYW5nZWRBdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4sXG4gICkgPT4gdm9pZDtcblxuICAvKiogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVtcGxhdGUgdXBkYXRlICovXG4gIGFmdGVyVXBkYXRlPzogKFxuICAgIHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPixcbiAgICBwcmV2aW91c0F0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPixcbiAgKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXMgdGhlIGZpbmFsIGxpZmVjeWNsZSBtZXRob2QgYXQgdGhlIGVuZCBvZiB0aGUgdW5tb3VudGluZyBwcm9jZXNzLlxuICAgKi9cbiAgZmluYWxpemU/OiAodGhpczogQ29tcG9uZW50PFN0YXRlU2hhcGU+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBJZiBkZWZpbmVkLCByZWNlaXZlcyBlcnJvcnMgY2F1Z2h0IGR1cmluZyB0aGUgbGlmZWN5Y2xlIG1ldGhvZHMgb2YgdGhpc1xuICAgKiBjb21wb25lbnQgYW5kIGl0J3MgY2hpbGRyZW4uIElmIG5vdCBkZWZpbmVkLCB0aGlzIGNvbXBvbmVudCB3aWxsIGluc3RlYWRcbiAgICogdGhyb3cgZXJyb3JzIGFzIHRoZXkgYXJlIGZvdW5kLlxuICAgKi9cbiAgb25FcnJvcj86ICh0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sIGVycm9yOiB1bmtub3duKSA9PiB2b2lkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVGcm9tQ2xhc3M8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PihcbiAgY2xzOiB0eXBlb2YgQ29tcG9uZW50PFN0YXRlU2hhcGU+LFxuICB0YWdOYW1lPzogc3RyaW5nLFxuKSB7XG4gIC8vIFNldCB0aGUgdGFnTmFtZSBzdGF0aWMgaWYgaXRzIG5vdCBhbHJlYWR5IHNldFxuICBpZiAodGFnTmFtZSAmJiBjbHMudGFnTmFtZSA9PT0gXCJcIikge1xuICAgIGNscy50YWdOYW1lID0gdGFnTmFtZTtcbiAgfVxuXG4gIGlmIChfX0RFVl9fKSB7XG4gICAgaWYgKHRhZ05hbWUgJiYgdGFnTmFtZSAhPT0gY2xzLnRhZ05hbWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtDT01QT05FTlRdIENvbXBvbmVudCAke2Nscy5uYW1lfSB3YXMgZGVmaW5lZCB3aXRoIHRhZ25hbWUgJHt0YWdOYW1lfSBgICtcbiAgICAgICAgICBgd2hpY2ggZG9lcyBub3QgbWF0Y2ggaXRzIHN0YXRpYyB0YWdOYW1lIHByb3BlcnR5YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgd2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgICBjbHMudGFnTmFtZSxcbiAgICBjbHMgYXMgdW5rbm93biBhcyBDdXN0b21FbGVtZW50Q29uc3RydWN0b3IsXG4gICk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgUGFsZXR0ZSBDb21wb25lbnQgdXNpbmcgdGhlIHNob3J0aGFuZCBzeW50YXhcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGRlZmluZShcIm15LWNvbXBvbmVudFwiLCB7XG4gKiAgIHRlbXBsYXRlOiBodG1sYC4uLmAsXG4gKiAgIHN0eWxlOiBjc3NgLi4uYCxcbiAqICAgaW5pdGlhbFN0YXRlOiB7IC4uLiB9LFxuICogICBjb21wdXRlZFByb3BlcnRpZXMoKSB7IC4uLiB9LFxuICogICBzY3JpcHQoKSB7IC4uLiB9LFxuICogICAvLyBhbmQgYW55IG90aGVyIGxpZmVjeWNsZSBtZXRob2RzXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lPFN0YXRlU2hhcGUgZXh0ZW5kcyBvYmplY3QgPSB7fT4oXG4gIHRhZ05hbWU6IHN0cmluZyxcbiAgZGVmaW5pdGlvbjogQ29tcG9uZW50U2hvcnRoYW5kPFN0YXRlU2hhcGU+LFxuKTogdHlwZW9mIENvbXBvbmVudDxTdGF0ZVNoYXBlPjtcblxuLyoqXG4gKiBSZWdpc3RlciBhIFBhbGV0dGUgQ29tcG9uZW50IGFzIGEgY3VzdG9tIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZTxDbHMgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50PGFueT4+KGRlZmluaXRpb246IENscyk6IENscztcblxuLyoqXG4gKiBSZWdpc3RlciBhIFBhbGV0dGUgQ29tcG9uZW50IGFzIGEgY3VzdG9tIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZTxDbHMgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50PGFueT4+KFxuICB0YWdOYW1lOiBzdHJpbmcsXG4gIGRlZmluaXRpb246IENscyxcbik6IENscztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZTxTdGF0ZVNoYXBlIGV4dGVuZHMgb2JqZWN0ID0ge30+KFxuICBhOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PFN0YXRlU2hhcGU+LFxuICBiPzogQ29tcG9uZW50U2hvcnRoYW5kPFN0YXRlU2hhcGU+IHwgdHlwZW9mIENvbXBvbmVudDxTdGF0ZVNoYXBlPixcbik6IHR5cGVvZiBDb21wb25lbnQ8U3RhdGVTaGFwZT4ge1xuICAvLyBIYW5kbGUgY29tcG9uZW50IGNsYXNzIHBhdGhzXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZGVmaW5lRnJvbUNsYXNzKGEpO1xuICAgIHJldHVybiBhO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBkZWZpbmVGcm9tQ2xhc3MoYiwgYSk7XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9DQUxMU0lURSk7XG4gIH1cblxuICAvLyBIYW5kbGUgc2hvcnRoYW5kXG4gIGNvbnN0IHRhZ05hbWUgPSBhO1xuICBjb25zdCBkZWZpbml0aW9uID0gYjtcblxuICAvLyBDb21wb25lbnQgY29uc3RydWN0b3JzIGFyZSBmdW5jdGlvbnMgLT4gRGVmaW5lIHRoZW0gd2l0aCB0aGVpciB0YWduYW1lIGlmIHByZXNlbnRcbiAgaWYgKHR5cGVvZiBkZWZpbml0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyBTZXQgdGhlIHRhZ05hbWUgc3RhdGljIGlmIGl0cyBub3QgYWxyZWFkeSBzZXRcbiAgICBpZiAoZGVmaW5pdGlvbi50YWdOYW1lID09PSBcIlwiKSB7XG4gICAgICBkZWZpbml0aW9uLnRhZ05hbWUgPSB0YWdOYW1lO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBpZiAodGFnTmFtZSAhPT0gZGVmaW5pdGlvbi50YWdOYW1lKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW0NPTVBPTkVOVF0gQ29tcG9uZW50ICR7ZGVmaW5pdGlvbi5uYW1lfSB3YXMgZGVmaW5lZCB3aXRoIHRhZ25hbWUgJHt0YWdOYW1lfSBgICtcbiAgICAgICAgICAgIGB3aGljaCBkb2VzIG5vdCBtYXRjaCBpdHMgc3RhdGljIHRhZ05hbWUgcHJvcGVydHlgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gICAgICB0YWdOYW1lLFxuICAgICAgZGVmaW5pdGlvbiBhcyB1bmtub3duIGFzIEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvcixcbiAgICApO1xuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIC8vIENvbmZpZ1xuICAgIHRlbXBsYXRlID0gQkxBTktfVEVNUExBVEUsXG4gICAgc3R5bGUgPSBbXSxcbiAgICByb290TW9kZSA9IFJvb3RNb2RlLkNsb3NlZCxcbiAgICBpbml0aWFsU3RhdGU6IHN0YXRlSW5pdGlhbGl6ZXIsXG4gICAgY29tcHV0ZWRQcm9wZXJ0aWVzLFxuICAgIG9ic2VydmVkQXR0cmlidXRlcyA9IFtdLFxuXG4gICAgLy8gTGlmZWN5Y2xlXG4gICAgc2NyaXB0LFxuICAgIGJlZm9yZVVwZGF0ZSxcbiAgICBhZnRlclVwZGF0ZSxcbiAgICBmaW5hbGl6ZSxcbiAgICBvbkVycm9yLFxuICB9ID0gZGVmaW5pdGlvbjtcblxuICBsZXQgZ2V0SW5pdGlhbFN0YXRlOiAoKCkgPT4gU3RhdGU8U3RhdGVTaGFwZT4gfCBTdGF0ZVNoYXBlKSB8IHVuZGVmaW5lZDtcblxuICBpZiAoc3RhdGVJbml0aWFsaXplcikge1xuICAgIGdldEluaXRpYWxTdGF0ZSA9XG4gICAgICB0eXBlb2Ygc3RhdGVJbml0aWFsaXplciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gc3RhdGVJbml0aWFsaXplclxuICAgICAgICA6ICgpID0+IHN0YXRlSW5pdGlhbGl6ZXI7XG4gIH1cblxuICBjb25zdCBjbHMgPSBjbGFzcyBleHRlbmRzIENvbXBvbmVudDxTdGF0ZVNoYXBlPiB7XG4gICAgc3RhdGljIHRhZ05hbWUgPSB0YWdOYW1lO1xuICAgIHN0YXRpYyB0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHN0YXRpYyBzdHlsZSA9IHN0eWxlO1xuICAgIHN0YXRpYyBvYnNlcnZlZEF0dHJpYnV0ZXMgPSBbLi4ub2JzZXJ2ZWRBdHRyaWJ1dGVzXTtcbiAgICBzdGF0aWMgc2hhZG93Um9vdE1vZGUgPSByb290TW9kZTtcbiAgfTtcblxuICBjbHMucHJvdG90eXBlLmluaXRpYWxTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZTtcbiAgY2xzLnByb3RvdHlwZS5jb21wdXRlZFByb3BlcnRpZXMgPSBjb21wdXRlZFByb3BlcnRpZXM7XG5cbiAgY2xzLnByb3RvdHlwZS5zY3JpcHQgPSBzY3JpcHQ7XG4gIGNscy5wcm90b3R5cGUuYmVmb3JlVXBkYXRlID0gYmVmb3JlVXBkYXRlO1xuICBjbHMucHJvdG90eXBlLmFmdGVyVXBkYXRlID0gYWZ0ZXJVcGRhdGU7XG4gIGNscy5wcm90b3R5cGUuZmluYWxpemUgPSBmaW5hbGl6ZTtcbiAgY2xzLnByb3RvdHlwZS5vbkVycm9yID0gb25FcnJvcjtcblxuICBjdXN0b21FbGVtZW50cy5kZWZpbmUodGFnTmFtZSwgY2xzKTtcbiAgcmV0dXJuIGNscztcbn1cbiIsCiAgICAiaW1wb3J0IHsgZnJhZ21lbnRDYWNoZSB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgY29tcGlsZWRUZW1wbGF0ZUNhY2hlIH0gZnJvbSBcIi4vdGVtcGxhdGUvY29tcGlsZVwiO1xuaW1wb3J0IHsgcGFyc2VkTm90YXRpb25DYWNoZSwgdmFsdWVBY2Nlc3NvckNhY2hlIH0gZnJvbSBcIi4vdGVtcGxhdGUvc3ludGF4XCI7XG5cbmlmIChfX0RFVl9fICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgKHdpbmRvdyBhcyBhbnkpLl9fUEFMRVRURV9ERVZUT09MU19fID0ge1xuICAgIGR1bXBDYWNoZU1ldHJpY3M6ICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ29tcGlsZWQgVGVtcGxhdGVzXCIsIGNvbXBpbGVkVGVtcGxhdGVDYWNoZS5nZXRNZXRyaWNzKCkpO1xuICAgICAgY29uc29sZS5sb2coXCJIVE1MIEZyYWdtZW50c1wiLCBmcmFnbWVudENhY2hlLmdldE1ldHJpY3MoKSk7XG4gICAgICBjb25zb2xlLmxvZyhcIk5vdGF0aW9uIEFjY2Vzc29yXCIsIHZhbHVlQWNjZXNzb3JDYWNoZS5nZXRNZXRyaWNzKCkpO1xuICAgICAgY29uc29sZS5sb2coXCJQYXJzZWQgTm90YXRpb25zXCIsIHBhcnNlZE5vdGF0aW9uQ2FjaGUuZ2V0TWV0cmljcygpKTtcbiAgICB9LFxuICB9O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQStDQSxTQUFTLFdBQVcsQ0FBQyxNQUFpQjtBQUFBLEVBQ3BDLE1BQU0saUJBQTRDO0FBQUEsS0FDL0Msb0JBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQU10QixzQkFBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBS3hCLDJCQUE2QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBSzdCLDRCQUE0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQVU1Qiw0QkFBNEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQUs1QiwwQkFBMEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBTTFCLDRCQUE0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBUTVCLG1DQUFtQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQU9uQyw2Q0FBNkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBUTdDLHVDQUF1QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBUXZDLHVDQUF1QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNdkMsMkJBQTZCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBTzdCLHNDQUFzQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQVV0Qyx3Q0FBd0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FPeEMseUNBQXlDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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RUFDaEIsTUFBTSxhQUFhO0FBQUEsRUFHbkIsSUFBSSxPQUFPLGVBQWUsWUFBWTtBQUFBLElBRXBDLElBQUksV0FBVyxZQUFZLElBQUk7QUFBQSxNQUM3QixXQUFXLFVBQVU7QUFBQSxJQUN2QjtBQUFBLElBRUEsSUFBSSxNQUFTO0FBQUEsTUFDWCxJQUFJLFlBQVksV0FBVyxTQUFTO0FBQUEsUUFDbEMsUUFBUSxLQUNOLHlCQUF5QixXQUFXLGlDQUFpQyxhQUNuRSxrREFDSjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFFQSxPQUFPLGVBQWUsT0FDcEIsU0FDQSxVQUNGO0FBQUEsSUFDQSxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUE7QUFBQSxJQUVFLHNCQUFXO0FBQUEsSUFDWCxRQUFRLENBQUM7QUFBQSxJQUNUO0FBQUEsSUFDQSxjQUFjO0FBQUEsSUFDZDtBQUFBLElBQ0EscUJBQXFCLENBQUM7QUFBQSxJQUd0QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxNQUNFO0FBQUEsRUFFSixJQUFJO0FBQUEsRUFFSixJQUFJLGtCQUFrQjtBQUFBLElBQ3BCLGtCQUNFLE9BQU8scUJBQXFCLGFBQ3hCLG1CQUNBLE1BQU07QUFBQSxFQUNkO0FBQUEsRUFFQSxNQUFNLE1BQU0sY0FBYyxVQUFzQjtBQUFBLFdBQ3ZDLFVBQVU7QUFBQSxXQUNWLFdBQVc7QUFBQSxXQUNYLFFBQVE7QUFBQSxXQUNSLHFCQUFxQixDQUFDLEdBQUcsa0JBQWtCO0FBQUEsV0FDM0MsaUJBQWlCO0FBQUEsRUFDMUI7QUFBQSxFQUVBLElBQUksVUFBVSxlQUFlO0FBQUEsRUFDN0IsSUFBSSxVQUFVLHFCQUFxQjtBQUFBLEVBRW5DLElBQUksVUFBVSxTQUFTO0FBQUEsRUFDdkIsSUFBSSxVQUFVLGVBQWU7QUFBQSxFQUM3QixJQUFJLFVBQVUsY0FBYztBQUFBLEVBQzVCLElBQUksVUFBVSxXQUFXO0FBQUEsRUFDekIsSUFBSSxVQUFVLFVBQVU7QUFBQSxFQUV4QixlQUFlLE9BQU8sU0FBUyxHQUFHO0FBQUEsRUFDbEMsT0FBTztBQUFBOztBQzFOVCxJQUFlLE9BQU8sV0FBVyxhQUFhO0FBQUEsRUFDM0MsT0FBZSx1QkFBdUI7QUFBQSxJQUNyQyxrQkFBa0IsTUFBTTtBQUFBLE1BQ3RCLFFBQVEsSUFBSSxzQkFBc0Isc0JBQXNCLFdBQVcsQ0FBQztBQUFBLE1BQ3BFLFFBQVEsSUFBSSxrQkFBa0IsY0FBYyxXQUFXLENBQUM7QUFBQSxNQUN4RCxRQUFRLElBQUkscUJBQXFCLG1CQUFtQixXQUFXLENBQUM7QUFBQSxNQUNoRSxRQUFRLElBQUksb0JBQW9CLG9CQUFvQixXQUFXLENBQUM7QUFBQTtBQUFBLEVBRXBFO0FBQ0Y7IiwKICAiZGVidWdJZCI6ICJEOUE5MDgwODM1NkVBMTc0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|