@dbx-tools/shared-core 0.6.50 → 0.6.52
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 +38 -3
- package/lib/src/env.d.ts +12 -0
- package/lib/src/env.js +15 -1
- package/lib/src/object.d.ts +64 -1
- package/lib/src/object.js +177 -2
- package/package.json +1 -1
- package/src/env.ts +15 -0
- package/src/object.ts +179 -1
package/README.md
CHANGED
|
@@ -206,6 +206,38 @@ const isRunnable = predicate
|
|
|
206
206
|
short-circuits. `predicate.create()` returns composable predicates with `and`,
|
|
207
207
|
`or`, and `negate`, used heavily by the projen engine.
|
|
208
208
|
|
|
209
|
+
## Dates And Durations
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
object.toDate("2026-08-02"); // a date or ISO instant
|
|
213
|
+
object.toDate("1785697899"); // epoch SECONDS (not the year 1785697899)
|
|
214
|
+
object.toDate(1785697899000); // epoch millis
|
|
215
|
+
object.toDate("30 days ago"); // relative to now
|
|
216
|
+
object.toDate("now");
|
|
217
|
+
object.toDate("nope"); // undefined - never throws
|
|
218
|
+
|
|
219
|
+
object.toDuration("1 hour 30 minutes"); // 5_400_000
|
|
220
|
+
object.toDuration("2ms"); // 2
|
|
221
|
+
object.toDuration("-7d"); // -604_800_000
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Both are for values typed by HAND into env vars, CLI flags, and config files, so
|
|
225
|
+
they are deliberately lenient: whitespace between amount and unit is optional,
|
|
226
|
+
units are case-insensitive, and plurals and abbreviations are equivalent (`2ms`
|
|
227
|
+
=== `2 milliseconds`, `1h` === `1 hr` === `1 Hour`). Signs make a duration an
|
|
228
|
+
OFFSET, which is what lets `toDate` read `-30d` / `12 hours ago` / `in 45s` as
|
|
229
|
+
instants.
|
|
230
|
+
|
|
231
|
+
`toDate` exists rather than `new Date(value)` because a bare epoch usually
|
|
232
|
+
arrives as a STRING (`date +%s`, a JSON field, a copied log line) and
|
|
233
|
+
`Date.parse("1785697899")` reads that as a YEAR, landing 1.7 billion years out.
|
|
234
|
+
Numeric input is therefore routed to the epoch path, with values under `1e11`
|
|
235
|
+
read as seconds and the rest as milliseconds. An unknown unit fails the whole
|
|
236
|
+
duration parse instead of being skipped, so `1 fortnight` is `undefined` rather
|
|
237
|
+
than `1`. Neither function throws - like `toBoolean` they return `undefined`, so
|
|
238
|
+
the caller decides whether a bad value is fatal, a warning, or a fallback
|
|
239
|
+
(`@dbx-tools/cli-tunnel`'s `--session-cutoff` warns and carries on).
|
|
240
|
+
|
|
209
241
|
## Iterables
|
|
210
242
|
|
|
211
243
|
```ts
|
|
@@ -337,10 +369,13 @@ without paying formatting cost when disabled.
|
|
|
337
369
|
- `json` - non-throwing `parse()` and record-narrowing `parseRecord()`.
|
|
338
370
|
- `string` - tokenization, slugs, identifiers, human labels, string coercion,
|
|
339
371
|
config lists, descriptions, pluralization, and HTML escaping.
|
|
340
|
-
- `object` - record checks, boolean coercion, present-only field
|
|
341
|
-
equality, shape types, and lazy sequence transforms +
|
|
372
|
+
- `object` - record checks, boolean/date/duration coercion, present-only field
|
|
373
|
+
spreading, deep equality, shape types, and lazy sequence transforms +
|
|
374
|
+
collection helpers.
|
|
342
375
|
- `env` - config-over-environment resolution: strings, booleans, positive
|
|
343
|
-
numbers/integers, and lists, with env-name fallback chains.
|
|
376
|
+
numbers/integers, and lists, with env-name fallback chains. `name()` gives the
|
|
377
|
+
primary variable name for a log line or error - an `EnvKey` may be a bare
|
|
378
|
+
string, so indexing `keys[0]` yields a character, not a name.
|
|
344
379
|
- `predicate` - composable boolean/type predicates.
|
|
345
380
|
- `pattern` - literal / glob / `/regex/` allow-list matching compiled to a
|
|
346
381
|
predicate.
|
package/lib/src/env.d.ts
CHANGED
|
@@ -16,6 +16,18 @@
|
|
|
16
16
|
*/
|
|
17
17
|
/** One env var name, or several tried in order. */
|
|
18
18
|
export type EnvKey = string | readonly string[];
|
|
19
|
+
/**
|
|
20
|
+
* The PRIMARY (current, non-deprecated) name in an {@link EnvKey}.
|
|
21
|
+
*
|
|
22
|
+
* Use this when naming a variable in a log line or error rather than indexing
|
|
23
|
+
* `keys[0]`: an {@link EnvKey} may be a bare string, and `"TUNNEL_X"[0]` is the
|
|
24
|
+
* character `"T"`, which produces a message naming a variable that does not
|
|
25
|
+
* exist. Returns `""` only for an empty list, which no caller should have.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* logger.warn(`${env.name(JWT_SECRET_ENV)} is not set`);
|
|
29
|
+
*/
|
|
30
|
+
export declare function name(keys: EnvKey): string;
|
|
19
31
|
/**
|
|
20
32
|
* First non-empty value among `keys`, trimmed, else `null`.
|
|
21
33
|
*
|
package/lib/src/env.js
CHANGED
|
@@ -20,6 +20,20 @@ import { parseList, trimToNull } from "./string.js";
|
|
|
20
20
|
function environment() {
|
|
21
21
|
return globalThis.process?.env ?? {};
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* The PRIMARY (current, non-deprecated) name in an {@link EnvKey}.
|
|
25
|
+
*
|
|
26
|
+
* Use this when naming a variable in a log line or error rather than indexing
|
|
27
|
+
* `keys[0]`: an {@link EnvKey} may be a bare string, and `"TUNNEL_X"[0]` is the
|
|
28
|
+
* character `"T"`, which produces a message naming a variable that does not
|
|
29
|
+
* exist. Returns `""` only for an empty list, which no caller should have.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* logger.warn(`${env.name(JWT_SECRET_ENV)} is not set`);
|
|
33
|
+
*/
|
|
34
|
+
export function name(keys) {
|
|
35
|
+
return typeof keys === "string" ? keys : (keys[0] ?? "");
|
|
36
|
+
}
|
|
23
37
|
/**
|
|
24
38
|
* First non-empty value among `keys`, trimmed, else `null`.
|
|
25
39
|
*
|
|
@@ -111,4 +125,4 @@ export function list(configured, keys, transform) {
|
|
|
111
125
|
const fromConfig = parseList(configured, transform);
|
|
112
126
|
return fromConfig.length > 0 ? fromConfig : parseList(text(keys), transform);
|
|
113
127
|
}
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBVXBELGdFQUFnRTtBQUNoRSxTQUFTLFdBQVc7SUFDbEIsT0FBUSxVQUF3QyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUMsSUFBWTtJQUMvQixNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQztJQUMxQixLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0QsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxVQUFtQixFQUFFLElBQVk7SUFDdEQsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsVUFBbUIsRUFBRSxJQUFZO0lBQ3ZELE9BQU8sU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsVUFBbUIsRUFBRSxJQUFZLEVBQUUsUUFBZ0I7SUFDaEYsT0FBTyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUM7QUFDbEYsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxVQUFtQixFQUFFLElBQVksRUFBRSxRQUFnQjtJQUM3RSxPQUFPLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDO0FBQzVFLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQWM7SUFDdEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1RSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FDbEIsVUFBeUQsRUFDekQsSUFBWSxFQUNaLFNBQXFDO0lBRXJDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDcEQsT0FBTyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9FLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlYWRpbmcgY29uZmlndXJhdGlvbiBvdXQgb2YgdGhlIGVudmlyb25tZW50LlxuICpcbiAqIEV2ZXJ5IHBsdWdpbiBjb25maWcgaW4gdGhpcyByZXBvIHJlc29sdmVzIHRoZSBzYW1lIHdheTogdGFrZSB0aGUgdHlwZWRcbiAqIGNvbmZpZyB2YWx1ZSB3aGVuIHRoZSBjYWxsZXIgc2V0IG9uZSwgZWxzZSBmYWxsIGJhY2sgdG8gb25lIG9yIG1vcmVcbiAqIGVudmlyb25tZW50IHZhcmlhYmxlcywgZWxzZSBhIGRlZmF1bHQuIFdyaXR0ZW4gYnkgaGFuZCB0aGF0IGJlY29tZXMgYVxuICogYGNvbmZpZy54ID8/IE51bWJlcihwcm9jZXNzLmVudi5YKWAgY2hhaW4gcGVyIGZpZWxkLCBhbmQgZWFjaCBwYWNrYWdlIGdyZXdcbiAqIGl0cyBvd24gYGZyb21FbnZgIC8gYHJlc29sdmVQb3NpdGl2ZUludGAgaGVscGVyIHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50XG4gKiBjb2VyY2lvbiBydWxlcy4gVGhlc2UgYXJlIHRob3NlIGhlbHBlcnMsIG9uY2UuXG4gKlxuICogQnJvd3Nlci1zYWZlOiBgcHJvY2Vzc2AgaXMgcmVhY2hlZCB0aHJvdWdoIGBnbG9iYWxUaGlzYCBhbmQgZ3VhcmRlZCwgc28gdGhpc1xuICogbW9kdWxlIG5lZWRzIG5vIE5vZGUgdHlwZXMgYW5kIGlzIGluZXJ0IGluIGEgYnJvd3NlciAoZXZlcnkgbG9va3VwIG1pc3NlcyBhbmRcbiAqIHRoZSBjYWxsZXIncyBmYWxsYmFjayBhcHBsaWVzKS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5pbXBvcnQgeyBwYXJzZUxpc3QsIHRyaW1Ub051bGwgfSBmcm9tIFwiLi9zdHJpbmcudHNcIjtcblxuLyoqIGBwcm9jZXNzYC1zaGFwZWQgdmlldyBvZmYgYGdsb2JhbFRoaXNgLCBzbyBubyBub2RlIHR5cGVzIGFyZSBuZWVkZWQuICovXG5pbnRlcmZhY2UgUHJvY2Vzc0xpa2Uge1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xufVxuXG4vKiogT25lIGVudiB2YXIgbmFtZSwgb3Igc2V2ZXJhbCB0cmllZCBpbiBvcmRlci4gKi9cbmV4cG9ydCB0eXBlIEVudktleSA9IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4vKiogVGhlIGFtYmllbnQgZW52aXJvbm1lbnQsIG9yIGB7fWAgb2ZmLXByb2Nlc3MgKGEgYnJvd3NlcikuICovXG5mdW5jdGlvbiBlbnZpcm9ubWVudCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIHsgcHJvY2Vzcz86IFByb2Nlc3NMaWtlIH0pLnByb2Nlc3M/LmVudiA/PyB7fTtcbn1cblxuLyoqXG4gKiBGaXJzdCBub24tZW1wdHkgdmFsdWUgYW1vbmcgYGtleXNgLCB0cmltbWVkLCBlbHNlIGBudWxsYC5cbiAqXG4gKiBTZXZlcmFsIG5hbWVzIGZvciBvbmUgc2V0dGluZyBpcyB0aGUgbm9ybSAoYSBwYWNrYWdlLXNwZWNpZmljIHZhcmlhYmxlIHBsdXNcbiAqIHRoZSBEYXRhYnJpY2tzLXN0YW5kYXJkIG9uZSksIHNvIGBrZXlzYCBpcyBvcmRlci1zZW5zaXRpdmU6IGVhcmxpZXIgbmFtZXMgd2luLlxuICpcbiAqIEBleGFtcGxlXG4gKiBlbnYudGV4dChbXCJURUFNU19BUFBfSURcIiwgXCJNSUNST1NPRlRfQVBQX0lEXCJdKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRleHQoa2V5czogRW52S2V5KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGVudiA9IGVudmlyb25tZW50KCk7XG4gIGZvciAoY29uc3Qga2V5IG9mIHR5cGVvZiBrZXlzID09PSBcInN0cmluZ1wiID8gW2tleXNdIDoga2V5cykge1xuICAgIGNvbnN0IHZhbHVlID0gdHJpbVRvTnVsbChlbnZba2V5XSk7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHN0cmluZyBzZXR0aW5nOiBgY29uZmlndXJlZGAgd2hlbiBzZXQgYW5kIG5vbi1lbXB0eSwgZWxzZSB0aGUgZmlyc3RcbiAqIG5vbi1lbXB0eSB2YXJpYWJsZSBhbW9uZyBga2V5c2AsIGVsc2UgYG51bGxgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBlbnYuc3RyaW5nKGNvbmZpZy5ob3N0LCBcIlNNVFBfSE9TVFwiKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZyhjb25maWd1cmVkOiB1bmtub3duLCBrZXlzOiBFbnZLZXkpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHRyaW1Ub051bGwoY29uZmlndXJlZCkgPz8gdGV4dChrZXlzKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgYm9vbGVhbiBzZXR0aW5nIHRocm91Z2gge0BsaW5rIHRvQm9vbGVhbn0sIHNvIHRoZSBsb29zZSBzcGVsbGluZ3MgYW5cbiAqIGVudiB2YXIgYWN0dWFsbHkgY2FycmllcyAoYDFgLCBgb25gLCBgeWVzYCwgLi4uKSBhcmUgYWNjZXB0ZWQuIFJldHVybnNcbiAqIGB1bmRlZmluZWRgIHdoZW4gbmVpdGhlciBzb3VyY2UgaXMgaW50ZXJwcmV0YWJsZSwgbGV0dGluZyB0aGUgY2FsbGVyIHBpY2sgYVxuICogZGVmYXVsdCB3aXRoIGA/P2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGVudi5ib29sZWFuKGNvbmZpZy5mdXp6eSwgXCJXRUJfU0VBUkNIX0ZVWlpZXCIpID8/IHRydWU7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib29sZWFuKGNvbmZpZ3VyZWQ6IHVua25vd24sIGtleXM6IEVudktleSk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdG9Cb29sZWFuKGNvbmZpZ3VyZWQpID8/IHRvQm9vbGVhbih0ZXh0KGtleXMpKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgcG9zaXRpdmUtbnVtYmVyIHNldHRpbmcgdGhhdCBtYXkgYmUgZnJhY3Rpb25hbCAoYSBzY29yZSB0aHJlc2hvbGQsXG4gKiBhIHJhdGlvKTogYGNvbmZpZ3VyZWRgIHdoZW4gaXQgaXMgYSBmaW5pdGUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvLCBlbHNlIHRoZVxuICogZmlyc3QgdmFyaWFibGUgYW1vbmcgYGtleXNgIHRoYXQgcGFyc2VzIHRoYXQgd2F5LCBlbHNlIGBmYWxsYmFja2AuXG4gKlxuICoge0BsaW5rIHBvc2l0aXZlSW50fSBpcyB0aGUgcmlnaHQgY2hvaWNlIGZvciBhIGNvdW50OyB0aGlzIG9uZSBrZWVwcyB0aGVcbiAqIGZyYWN0aW9uLCBzbyBhIGAwLjRgIHRocmVzaG9sZCBkb2VzIG5vdCBmbG9vciB0byBgMGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGVudi5wb3NpdGl2ZU51bWJlcihjb25maWcuZnV6enlUaHJlc2hvbGQsIFwiU0VBUkNIX0ZVWlpZX1RIUkVTSE9MRFwiLCAwLjQpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpdmVOdW1iZXIoY29uZmlndXJlZDogdW5rbm93biwga2V5czogRW52S2V5LCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRvUG9zaXRpdmVOdW1iZXIoY29uZmlndXJlZCkgPz8gdG9Qb3NpdGl2ZU51bWJlcih0ZXh0KGtleXMpKSA/PyBmYWxsYmFjaztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgcG9zaXRpdmUtaW50ZWdlciBzZXR0aW5nIChhIHBvcnQsIHRpbWVvdXQsIHBhZ2Ugc2l6ZSwgb3IgY2FwKTpcbiAqIGBjb25maWd1cmVkYCB3aGVuIGl0IGlzIGEgZmluaXRlIG51bWJlciBncmVhdGVyIHRoYW4gemVybywgZWxzZSB0aGUgZmlyc3RcbiAqIHZhcmlhYmxlIGFtb25nIGBrZXlzYCB0aGF0IHBhcnNlcyB0aGF0IHdheSwgZWxzZSBgZmFsbGJhY2tgLiBGbG9vcmVkLCBzbyBhXG4gKiBmcmFjdGlvbmFsIHZhbHVlIGNhbid0IGxlYWsgaW50byBhIGNvdW50LlxuICpcbiAqIEEgbm9uLW51bWVyaWMgb3Igbm9uLXBvc2l0aXZlIHZhbHVlIGlzIHRyZWF0ZWQgYXMgYWJzZW50IHJhdGhlciB0aGFuIGZhdGFsIC1cbiAqIHRoZXNlIGFyZSBjZWlsaW5ncyBhbmQgdGltZW91dHMgd2hlcmUgYSBzYW5lIGRlZmF1bHQgYmVhdHMgYSBib290IGZhaWx1cmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGVudi5wb3NpdGl2ZUludChjb25maWcudGltZW91dE1zLCBcIlNFQVJDSF9USU1FT1VUX01TXCIsIDMwXzAwMCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGl2ZUludChjb25maWd1cmVkOiB1bmtub3duLCBrZXlzOiBFbnZLZXksIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdG9Qb3NpdGl2ZUludChjb25maWd1cmVkKSA/PyB0b1Bvc2l0aXZlSW50KHRleHQoa2V5cykpID8/IGZhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiB0b1Bvc2l0aXZlTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPiAwID8gcGFyc2VkIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB0b1Bvc2l0aXZlSW50KHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkID0gdG9Qb3NpdGl2ZU51bWJlcih2YWx1ZSk7XG4gIHJldHVybiBwYXJzZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE1hdGguZmxvb3IocGFyc2VkKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgbGlzdCBzZXR0aW5nIHRocm91Z2gge0BsaW5rIHBhcnNlTGlzdH0sIHNvIGFuIGFycmF5IGZyb20gdHlwZWRcbiAqIGNvbmZpZyBhbmQgYSBgXCJhLCBiIGNcImAgZW52IHN0cmluZyBub3JtYWxpemUgaWRlbnRpY2FsbHkuIFJldHVybnMgYFtdYCB3aGVuXG4gKiBuZWl0aGVyIHNvdXJjZSBoYXMgZW50cmllcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogZW52Lmxpc3QoY29uZmlnLm1vZGVsRmFsbGJhY2tzLCBcIldFQl9TRUFSQ0hfTU9ERUxfRkFMTEJBQ0tTXCIpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdChcbiAgY29uZmlndXJlZDogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBudWxsLFxuICBrZXlzOiBFbnZLZXksXG4gIHRyYW5zZm9ybT86IChlbnRyeTogc3RyaW5nKSA9PiBzdHJpbmcsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGZyb21Db25maWcgPSBwYXJzZUxpc3QoY29uZmlndXJlZCwgdHJhbnNmb3JtKTtcbiAgcmV0dXJuIGZyb21Db25maWcubGVuZ3RoID4gMCA/IGZyb21Db25maWcgOiBwYXJzZUxpc3QodGV4dChrZXlzKSwgdHJhbnNmb3JtKTtcbn1cbiJdfQ==
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBVXBELGdFQUFnRTtBQUNoRSxTQUFTLFdBQVc7SUFDbEIsT0FBUSxVQUF3QyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFZO0lBQy9CLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUMsSUFBWTtJQUMvQixNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQztJQUMxQixLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0QsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxVQUFtQixFQUFFLElBQVk7SUFDdEQsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsVUFBbUIsRUFBRSxJQUFZO0lBQ3ZELE9BQU8sU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsVUFBbUIsRUFBRSxJQUFZLEVBQUUsUUFBZ0I7SUFDaEYsT0FBTyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUM7QUFDbEYsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxVQUFtQixFQUFFLElBQVksRUFBRSxRQUFnQjtJQUM3RSxPQUFPLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDO0FBQzVFLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQWM7SUFDdEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1RSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FDbEIsVUFBeUQsRUFDekQsSUFBWSxFQUNaLFNBQXFDO0lBRXJDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDcEQsT0FBTyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9FLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlYWRpbmcgY29uZmlndXJhdGlvbiBvdXQgb2YgdGhlIGVudmlyb25tZW50LlxuICpcbiAqIEV2ZXJ5IHBsdWdpbiBjb25maWcgaW4gdGhpcyByZXBvIHJlc29sdmVzIHRoZSBzYW1lIHdheTogdGFrZSB0aGUgdHlwZWRcbiAqIGNvbmZpZyB2YWx1ZSB3aGVuIHRoZSBjYWxsZXIgc2V0IG9uZSwgZWxzZSBmYWxsIGJhY2sgdG8gb25lIG9yIG1vcmVcbiAqIGVudmlyb25tZW50IHZhcmlhYmxlcywgZWxzZSBhIGRlZmF1bHQuIFdyaXR0ZW4gYnkgaGFuZCB0aGF0IGJlY29tZXMgYVxuICogYGNvbmZpZy54ID8/IE51bWJlcihwcm9jZXNzLmVudi5YKWAgY2hhaW4gcGVyIGZpZWxkLCBhbmQgZWFjaCBwYWNrYWdlIGdyZXdcbiAqIGl0cyBvd24gYGZyb21FbnZgIC8gYHJlc29sdmVQb3NpdGl2ZUludGAgaGVscGVyIHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50XG4gKiBjb2VyY2lvbiBydWxlcy4gVGhlc2UgYXJlIHRob3NlIGhlbHBlcnMsIG9uY2UuXG4gKlxuICogQnJvd3Nlci1zYWZlOiBgcHJvY2Vzc2AgaXMgcmVhY2hlZCB0aHJvdWdoIGBnbG9iYWxUaGlzYCBhbmQgZ3VhcmRlZCwgc28gdGhpc1xuICogbW9kdWxlIG5lZWRzIG5vIE5vZGUgdHlwZXMgYW5kIGlzIGluZXJ0IGluIGEgYnJvd3NlciAoZXZlcnkgbG9va3VwIG1pc3NlcyBhbmRcbiAqIHRoZSBjYWxsZXIncyBmYWxsYmFjayBhcHBsaWVzKS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5pbXBvcnQgeyBwYXJzZUxpc3QsIHRyaW1Ub051bGwgfSBmcm9tIFwiLi9zdHJpbmcudHNcIjtcblxuLyoqIGBwcm9jZXNzYC1zaGFwZWQgdmlldyBvZmYgYGdsb2JhbFRoaXNgLCBzbyBubyBub2RlIHR5cGVzIGFyZSBuZWVkZWQuICovXG5pbnRlcmZhY2UgUHJvY2Vzc0xpa2Uge1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xufVxuXG4vKiogT25lIGVudiB2YXIgbmFtZSwgb3Igc2V2ZXJhbCB0cmllZCBpbiBvcmRlci4gKi9cbmV4cG9ydCB0eXBlIEVudktleSA9IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4vKiogVGhlIGFtYmllbnQgZW52aXJvbm1lbnQsIG9yIGB7fWAgb2ZmLXByb2Nlc3MgKGEgYnJvd3NlcikuICovXG5mdW5jdGlvbiBlbnZpcm9ubWVudCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIHsgcHJvY2Vzcz86IFByb2Nlc3NMaWtlIH0pLnByb2Nlc3M/LmVudiA/PyB7fTtcbn1cblxuLyoqXG4gKiBUaGUgUFJJTUFSWSAoY3VycmVudCwgbm9uLWRlcHJlY2F0ZWQpIG5hbWUgaW4gYW4ge0BsaW5rIEVudktleX0uXG4gKlxuICogVXNlIHRoaXMgd2hlbiBuYW1pbmcgYSB2YXJpYWJsZSBpbiBhIGxvZyBsaW5lIG9yIGVycm9yIHJhdGhlciB0aGFuIGluZGV4aW5nXG4gKiBga2V5c1swXWA6IGFuIHtAbGluayBFbnZLZXl9IG1heSBiZSBhIGJhcmUgc3RyaW5nLCBhbmQgYFwiVFVOTkVMX1hcIlswXWAgaXMgdGhlXG4gKiBjaGFyYWN0ZXIgYFwiVFwiYCwgd2hpY2ggcHJvZHVjZXMgYSBtZXNzYWdlIG5hbWluZyBhIHZhcmlhYmxlIHRoYXQgZG9lcyBub3RcbiAqIGV4aXN0LiBSZXR1cm5zIGBcIlwiYCBvbmx5IGZvciBhbiBlbXB0eSBsaXN0LCB3aGljaCBubyBjYWxsZXIgc2hvdWxkIGhhdmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxvZ2dlci53YXJuKGAke2Vudi5uYW1lKEpXVF9TRUNSRVRfRU5WKX0gaXMgbm90IHNldGApO1xuICovXG5leHBvcnQgZnVuY3Rpb24gbmFtZShrZXlzOiBFbnZLZXkpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGtleXMgPT09IFwic3RyaW5nXCIgPyBrZXlzIDogKGtleXNbMF0gPz8gXCJcIik7XG59XG5cbi8qKlxuICogRmlyc3Qgbm9uLWVtcHR5IHZhbHVlIGFtb25nIGBrZXlzYCwgdHJpbW1lZCwgZWxzZSBgbnVsbGAuXG4gKlxuICogU2V2ZXJhbCBuYW1lcyBmb3Igb25lIHNldHRpbmcgaXMgdGhlIG5vcm0gKGEgcGFja2FnZS1zcGVjaWZpYyB2YXJpYWJsZSBwbHVzXG4gKiB0aGUgRGF0YWJyaWNrcy1zdGFuZGFyZCBvbmUpLCBzbyBga2V5c2AgaXMgb3JkZXItc2Vuc2l0aXZlOiBlYXJsaWVyIG5hbWVzIHdpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogZW52LnRleHQoW1wiVEVBTVNfQVBQX0lEXCIsIFwiTUlDUk9TT0ZUX0FQUF9JRFwiXSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KGtleXM6IEVudktleSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlbnYgPSBlbnZpcm9ubWVudCgpO1xuICBmb3IgKGNvbnN0IGtleSBvZiB0eXBlb2Yga2V5cyA9PT0gXCJzdHJpbmdcIiA/IFtrZXlzXSA6IGtleXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRyaW1Ub051bGwoZW52W2tleV0pO1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBzdHJpbmcgc2V0dGluZzogYGNvbmZpZ3VyZWRgIHdoZW4gc2V0IGFuZCBub24tZW1wdHksIGVsc2UgdGhlIGZpcnN0XG4gKiBub24tZW1wdHkgdmFyaWFibGUgYW1vbmcgYGtleXNgLCBlbHNlIGBudWxsYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogZW52LnN0cmluZyhjb25maWcuaG9zdCwgXCJTTVRQX0hPU1RcIik7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcoY29uZmlndXJlZDogdW5rbm93biwga2V5czogRW52S2V5KTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiB0cmltVG9OdWxsKGNvbmZpZ3VyZWQpID8/IHRleHQoa2V5cyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGJvb2xlYW4gc2V0dGluZyB0aHJvdWdoIHtAbGluayB0b0Jvb2xlYW59LCBzbyB0aGUgbG9vc2Ugc3BlbGxpbmdzIGFuXG4gKiBlbnYgdmFyIGFjdHVhbGx5IGNhcnJpZXMgKGAxYCwgYG9uYCwgYHllc2AsIC4uLikgYXJlIGFjY2VwdGVkLiBSZXR1cm5zXG4gKiBgdW5kZWZpbmVkYCB3aGVuIG5laXRoZXIgc291cmNlIGlzIGludGVycHJldGFibGUsIGxldHRpbmcgdGhlIGNhbGxlciBwaWNrIGFcbiAqIGRlZmF1bHQgd2l0aCBgPz9gLlxuICpcbiAqIEBleGFtcGxlXG4gKiBlbnYuYm9vbGVhbihjb25maWcuZnV6enksIFwiV0VCX1NFQVJDSF9GVVpaWVwiKSA/PyB0cnVlO1xuICovXG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbihjb25maWd1cmVkOiB1bmtub3duLCBrZXlzOiBFbnZLZXkpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRvQm9vbGVhbihjb25maWd1cmVkKSA/PyB0b0Jvb2xlYW4odGV4dChrZXlzKSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHBvc2l0aXZlLW51bWJlciBzZXR0aW5nIHRoYXQgbWF5IGJlIGZyYWN0aW9uYWwgKGEgc2NvcmUgdGhyZXNob2xkLFxuICogYSByYXRpbyk6IGBjb25maWd1cmVkYCB3aGVuIGl0IGlzIGEgZmluaXRlIG51bWJlciBncmVhdGVyIHRoYW4gemVybywgZWxzZSB0aGVcbiAqIGZpcnN0IHZhcmlhYmxlIGFtb25nIGBrZXlzYCB0aGF0IHBhcnNlcyB0aGF0IHdheSwgZWxzZSBgZmFsbGJhY2tgLlxuICpcbiAqIHtAbGluayBwb3NpdGl2ZUludH0gaXMgdGhlIHJpZ2h0IGNob2ljZSBmb3IgYSBjb3VudDsgdGhpcyBvbmUga2VlcHMgdGhlXG4gKiBmcmFjdGlvbiwgc28gYSBgMC40YCB0aHJlc2hvbGQgZG9lcyBub3QgZmxvb3IgdG8gYDBgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBlbnYucG9zaXRpdmVOdW1iZXIoY29uZmlnLmZ1enp5VGhyZXNob2xkLCBcIlNFQVJDSF9GVVpaWV9USFJFU0hPTERcIiwgMC40KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aXZlTnVtYmVyKGNvbmZpZ3VyZWQ6IHVua25vd24sIGtleXM6IEVudktleSwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0b1Bvc2l0aXZlTnVtYmVyKGNvbmZpZ3VyZWQpID8/IHRvUG9zaXRpdmVOdW1iZXIodGV4dChrZXlzKSkgPz8gZmFsbGJhY2s7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHBvc2l0aXZlLWludGVnZXIgc2V0dGluZyAoYSBwb3J0LCB0aW1lb3V0LCBwYWdlIHNpemUsIG9yIGNhcCk6XG4gKiBgY29uZmlndXJlZGAgd2hlbiBpdCBpcyBhIGZpbml0ZSBudW1iZXIgZ3JlYXRlciB0aGFuIHplcm8sIGVsc2UgdGhlIGZpcnN0XG4gKiB2YXJpYWJsZSBhbW9uZyBga2V5c2AgdGhhdCBwYXJzZXMgdGhhdCB3YXksIGVsc2UgYGZhbGxiYWNrYC4gRmxvb3JlZCwgc28gYVxuICogZnJhY3Rpb25hbCB2YWx1ZSBjYW4ndCBsZWFrIGludG8gYSBjb3VudC5cbiAqXG4gKiBBIG5vbi1udW1lcmljIG9yIG5vbi1wb3NpdGl2ZSB2YWx1ZSBpcyB0cmVhdGVkIGFzIGFic2VudCByYXRoZXIgdGhhbiBmYXRhbCAtXG4gKiB0aGVzZSBhcmUgY2VpbGluZ3MgYW5kIHRpbWVvdXRzIHdoZXJlIGEgc2FuZSBkZWZhdWx0IGJlYXRzIGEgYm9vdCBmYWlsdXJlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBlbnYucG9zaXRpdmVJbnQoY29uZmlnLnRpbWVvdXRNcywgXCJTRUFSQ0hfVElNRU9VVF9NU1wiLCAzMF8wMDApO1xuICovXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpdmVJbnQoY29uZmlndXJlZDogdW5rbm93biwga2V5czogRW52S2V5LCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRvUG9zaXRpdmVJbnQoY29uZmlndXJlZCkgPz8gdG9Qb3NpdGl2ZUludCh0ZXh0KGtleXMpKSA/PyBmYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gdG9Qb3NpdGl2ZU51bWJlcih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgJiYgcGFyc2VkID4gMCA/IHBhcnNlZCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdG9Qb3NpdGl2ZUludCh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZCA9IHRvUG9zaXRpdmVOdW1iZXIodmFsdWUpO1xuICByZXR1cm4gcGFyc2VkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBNYXRoLmZsb29yKHBhcnNlZCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGxpc3Qgc2V0dGluZyB0aHJvdWdoIHtAbGluayBwYXJzZUxpc3R9LCBzbyBhbiBhcnJheSBmcm9tIHR5cGVkXG4gKiBjb25maWcgYW5kIGEgYFwiYSwgYiBjXCJgIGVudiBzdHJpbmcgbm9ybWFsaXplIGlkZW50aWNhbGx5LiBSZXR1cm5zIGBbXWAgd2hlblxuICogbmVpdGhlciBzb3VyY2UgaGFzIGVudHJpZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGVudi5saXN0KGNvbmZpZy5tb2RlbEZhbGxiYWNrcywgXCJXRUJfU0VBUkNIX01PREVMX0ZBTExCQUNLU1wiKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3QoXG4gIGNvbmZpZ3VyZWQ6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAga2V5czogRW52S2V5LFxuICB0cmFuc2Zvcm0/OiAoZW50cnk6IHN0cmluZykgPT4gc3RyaW5nLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBmcm9tQ29uZmlnID0gcGFyc2VMaXN0KGNvbmZpZ3VyZWQsIHRyYW5zZm9ybSk7XG4gIHJldHVybiBmcm9tQ29uZmlnLmxlbmd0aCA+IDAgPyBmcm9tQ29uZmlnIDogcGFyc2VMaXN0KHRleHQoa2V5cyksIHRyYW5zZm9ybSk7XG59XG4iXX0=
|
package/lib/src/object.d.ts
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Value guards / coercions / shape types: {@link isRecord} narrows parsed JSON
|
|
5
5
|
* to a record, {@link toBoolean} coerces loose truthy/falsy values, {@link
|
|
6
|
-
*
|
|
6
|
+
* toDuration} parses `1h30m` / `2 milliseconds` to millis, {@link toDate}
|
|
7
|
+
* coerces a date/ISO string/epoch number/relative duration, {@link optional}
|
|
8
|
+
* spreads a field only when it is present, {@link deepEqual} compares
|
|
7
9
|
* structurally, and {@link NameLike}/{@link NonFunctionKeys} describe object
|
|
8
10
|
* shapes.
|
|
9
11
|
*
|
|
@@ -373,6 +375,67 @@ export declare function optional<K extends string, V>(key: K, value: V | null |
|
|
|
373
375
|
* well as the numbers `1` and `0`.
|
|
374
376
|
*/
|
|
375
377
|
export declare function toBoolean(value: unknown): boolean | undefined;
|
|
378
|
+
/**
|
|
379
|
+
* Coerce a loose duration to MILLISECONDS, or `undefined` when it can't be
|
|
380
|
+
* interpreted.
|
|
381
|
+
*
|
|
382
|
+
* Deliberately lenient, because these values are typed by hand into env vars,
|
|
383
|
+
* CLI flags, and config files: whitespace between amount and unit is optional and
|
|
384
|
+
* unlimited, units are case-insensitive, plurals and the common abbreviations are
|
|
385
|
+
* equivalent (`2ms` === `2 milliseconds`, `1h` === `1 hr` === `1 Hour`), `and` and
|
|
386
|
+
* thousands separators are ignored (`1,500 ms`, `1 hour and 30 minutes`), and
|
|
387
|
+
* terms compose (`1h30m`). A plain `number` passes through as milliseconds.
|
|
388
|
+
*
|
|
389
|
+
* Signs are supported so a duration can express an OFFSET rather than only a
|
|
390
|
+
* length: a leading `-` (or a trailing `ago`) makes the result negative, and an
|
|
391
|
+
* unsigned term inherits the previous term's sign, so `-1h30m` is -90 minutes
|
|
392
|
+
* rather than -60 + 30. {@link toDate} uses that to turn `-7d` / `7 days ago`
|
|
393
|
+
* into an instant relative to now.
|
|
394
|
+
*
|
|
395
|
+
* An UNKNOWN unit fails the whole parse rather than being skipped - `1 fortnight`
|
|
396
|
+
* returning `1` silently would be worse than returning nothing - which is also
|
|
397
|
+
* what keeps {@link toDate} from mistaking `1 Jan 2026` for a duration.
|
|
398
|
+
*
|
|
399
|
+
* @example
|
|
400
|
+
* toDuration("30s"); // 30_000
|
|
401
|
+
* toDuration("1 hour 30 minutes"); // 5_400_000
|
|
402
|
+
* toDuration("-7 days"); // -604_800_000
|
|
403
|
+
* toDuration("2 weeks ago"); // -1_209_600_000
|
|
404
|
+
* toDuration("soon"); // undefined
|
|
405
|
+
*/
|
|
406
|
+
export declare function toDuration(value: unknown): number | undefined;
|
|
407
|
+
/**
|
|
408
|
+
* Coerce a loose date-ish value to a real `Date`, or `undefined` when it can't be
|
|
409
|
+
* interpreted. Accepts, in this order:
|
|
410
|
+
*
|
|
411
|
+
* - a `Date` (passed through; an invalid one is a miss);
|
|
412
|
+
* - an epoch NUMBER or numeric string, in seconds or milliseconds (see
|
|
413
|
+
* {@link SECONDS_CEILING});
|
|
414
|
+
* - `now` (and its `today` spelling), for the current instant;
|
|
415
|
+
* - a {@link toDuration} expression, resolved RELATIVE TO NOW, so `-7d`,
|
|
416
|
+
* `7 days ago`, and `in 30 minutes` are all valid instants;
|
|
417
|
+
* - anything `Date.parse` understands (`2026-08-02`, an ISO/UTC instant).
|
|
418
|
+
*
|
|
419
|
+
* The epoch unit inference is the reason this exists rather than
|
|
420
|
+
* `new Date(value)`: a bare epoch arrives as a STRING from an env var or a CLI
|
|
421
|
+
* flag as often as it arrives as a number (`date +%s`, a JSON field, a copied log
|
|
422
|
+
* line), and `Date.parse("1785697899")` reads that as a YEAR, silently landing
|
|
423
|
+
* 1.7 billion years out. Numeric strings are therefore routed to the epoch path,
|
|
424
|
+
* never to `Date.parse`.
|
|
425
|
+
*
|
|
426
|
+
* Like {@link toBoolean} this NEVER throws and returns `undefined` for anything
|
|
427
|
+
* uninterpretable, so a caller decides whether a bad value is fatal, a warning,
|
|
428
|
+
* or a fallback.
|
|
429
|
+
*
|
|
430
|
+
* @example
|
|
431
|
+
* toDate("now"); // this instant
|
|
432
|
+
* toDate("2026-08-02"); // 2026-08-02T00:00:00.000Z
|
|
433
|
+
* toDate("1785697899"); // seconds -> 2026-08-02T...
|
|
434
|
+
* toDate(1785697899000); // millis -> the same instant
|
|
435
|
+
* toDate("30 days ago"); // now - 30d
|
|
436
|
+
* toDate("nope"); // undefined
|
|
437
|
+
*/
|
|
438
|
+
export declare function toDate(value: unknown): Date | undefined;
|
|
376
439
|
/**
|
|
377
440
|
* Structural deep-equality with an optional custom comparator.
|
|
378
441
|
*
|
package/lib/src/object.js
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Value guards / coercions / shape types: {@link isRecord} narrows parsed JSON
|
|
5
5
|
* to a record, {@link toBoolean} coerces loose truthy/falsy values, {@link
|
|
6
|
-
*
|
|
6
|
+
* toDuration} parses `1h30m` / `2 milliseconds` to millis, {@link toDate}
|
|
7
|
+
* coerces a date/ISO string/epoch number/relative duration, {@link optional}
|
|
8
|
+
* spreads a field only when it is present, {@link deepEqual} compares
|
|
7
9
|
* structurally, and {@link NameLike}/{@link NonFunctionKeys} describe object
|
|
8
10
|
* shapes.
|
|
9
11
|
*
|
|
@@ -688,6 +690,179 @@ export function toBoolean(value) {
|
|
|
688
690
|
}
|
|
689
691
|
return undefined;
|
|
690
692
|
}
|
|
693
|
+
/**
|
|
694
|
+
* Largest value read as epoch SECONDS rather than milliseconds.
|
|
695
|
+
*
|
|
696
|
+
* `1e11` seconds is the year 5138 and `1e11` ms is 1973-03-03, so every value a
|
|
697
|
+
* caller realistically means as millis is above the line and every value they
|
|
698
|
+
* mean as seconds is below it. The ambiguity is unavoidable - the two units share
|
|
699
|
+
* a number line - so the split is placed where neither side has a plausible
|
|
700
|
+
* claim.
|
|
701
|
+
*/
|
|
702
|
+
const SECONDS_CEILING = 1e11;
|
|
703
|
+
/**
|
|
704
|
+
* Milliseconds per unit, keyed by SINGULAR alias. {@link toDuration} retries a
|
|
705
|
+
* lookup without a trailing `s`, so every plural spelling is covered without
|
|
706
|
+
* listing it (`ms` is already singular, hence its own entry).
|
|
707
|
+
*
|
|
708
|
+
* `m` is MINUTES and months need `mo`, following the near-universal convention
|
|
709
|
+
* (`ms`, `date`, cron prose); month and year are calendar approximations (30 /
|
|
710
|
+
* 365 days) because a duration has no anchor date to be exact against.
|
|
711
|
+
*/
|
|
712
|
+
const DURATION_UNITS = [
|
|
713
|
+
[1, ["ms", "msec", "millisecond", "milli"]],
|
|
714
|
+
[1000, ["s", "sec", "second"]],
|
|
715
|
+
[60_000, ["m", "min", "minute"]],
|
|
716
|
+
[3_600_000, ["h", "hr", "hour"]],
|
|
717
|
+
[86_400_000, ["d", "day"]],
|
|
718
|
+
[604_800_000, ["w", "wk", "week"]],
|
|
719
|
+
[2_592_000_000, ["mo", "mon", "month"]],
|
|
720
|
+
[31_536_000_000, ["y", "yr", "year"]],
|
|
721
|
+
];
|
|
722
|
+
const DURATION_UNIT_MS = new Map(DURATION_UNITS.flatMap(([ms, aliases]) => aliases.map((alias) => [alias, ms])));
|
|
723
|
+
/** One `<amount><unit>` term inside a duration string. */
|
|
724
|
+
const DURATION_TERM = /([+-]?)(\d+(?:\.\d+)?)\s*([a-z]+)/g;
|
|
725
|
+
/**
|
|
726
|
+
* Coerce a loose duration to MILLISECONDS, or `undefined` when it can't be
|
|
727
|
+
* interpreted.
|
|
728
|
+
*
|
|
729
|
+
* Deliberately lenient, because these values are typed by hand into env vars,
|
|
730
|
+
* CLI flags, and config files: whitespace between amount and unit is optional and
|
|
731
|
+
* unlimited, units are case-insensitive, plurals and the common abbreviations are
|
|
732
|
+
* equivalent (`2ms` === `2 milliseconds`, `1h` === `1 hr` === `1 Hour`), `and` and
|
|
733
|
+
* thousands separators are ignored (`1,500 ms`, `1 hour and 30 minutes`), and
|
|
734
|
+
* terms compose (`1h30m`). A plain `number` passes through as milliseconds.
|
|
735
|
+
*
|
|
736
|
+
* Signs are supported so a duration can express an OFFSET rather than only a
|
|
737
|
+
* length: a leading `-` (or a trailing `ago`) makes the result negative, and an
|
|
738
|
+
* unsigned term inherits the previous term's sign, so `-1h30m` is -90 minutes
|
|
739
|
+
* rather than -60 + 30. {@link toDate} uses that to turn `-7d` / `7 days ago`
|
|
740
|
+
* into an instant relative to now.
|
|
741
|
+
*
|
|
742
|
+
* An UNKNOWN unit fails the whole parse rather than being skipped - `1 fortnight`
|
|
743
|
+
* returning `1` silently would be worse than returning nothing - which is also
|
|
744
|
+
* what keeps {@link toDate} from mistaking `1 Jan 2026` for a duration.
|
|
745
|
+
*
|
|
746
|
+
* @example
|
|
747
|
+
* toDuration("30s"); // 30_000
|
|
748
|
+
* toDuration("1 hour 30 minutes"); // 5_400_000
|
|
749
|
+
* toDuration("-7 days"); // -604_800_000
|
|
750
|
+
* toDuration("2 weeks ago"); // -1_209_600_000
|
|
751
|
+
* toDuration("soon"); // undefined
|
|
752
|
+
*/
|
|
753
|
+
export function toDuration(value) {
|
|
754
|
+
if (typeof value === "number")
|
|
755
|
+
return Number.isFinite(value) ? value : undefined;
|
|
756
|
+
if (typeof value !== "string")
|
|
757
|
+
return undefined;
|
|
758
|
+
// A unitless string means the same as the unitless number: milliseconds.
|
|
759
|
+
if (/^[+-]?\d+(\.\d+)?$/.test(value.trim()))
|
|
760
|
+
return toDuration(Number(value.trim()));
|
|
761
|
+
let text = value
|
|
762
|
+
.toLowerCase()
|
|
763
|
+
.replaceAll(/[,_]/g, "")
|
|
764
|
+
.replaceAll(/\band\b/g, " ")
|
|
765
|
+
.trim();
|
|
766
|
+
let negate = false;
|
|
767
|
+
if (text.endsWith("ago")) {
|
|
768
|
+
negate = true;
|
|
769
|
+
text = text.slice(0, -"ago".length);
|
|
770
|
+
}
|
|
771
|
+
text = text.replace(/^in\b/, "").trim();
|
|
772
|
+
if (!text)
|
|
773
|
+
return undefined;
|
|
774
|
+
const terms = [...text.matchAll(DURATION_TERM)];
|
|
775
|
+
if (terms.length === 0)
|
|
776
|
+
return undefined;
|
|
777
|
+
// Everything outside the matched terms must be separators only; otherwise the
|
|
778
|
+
// string is something else that merely CONTAINS a duration-shaped fragment.
|
|
779
|
+
let leftover = text;
|
|
780
|
+
for (const term of terms)
|
|
781
|
+
leftover = leftover.replace(term[0], " ");
|
|
782
|
+
if (leftover.trim())
|
|
783
|
+
return undefined;
|
|
784
|
+
let total = 0;
|
|
785
|
+
let sign = 1;
|
|
786
|
+
for (const [, explicitSign, amount, unit] of terms) {
|
|
787
|
+
if (explicitSign)
|
|
788
|
+
sign = explicitSign === "-" ? -1 : 1;
|
|
789
|
+
const unitMs = DURATION_UNIT_MS.get(unit) ?? DURATION_UNIT_MS.get(unit.replace(/s$/, ""));
|
|
790
|
+
if (unitMs === undefined)
|
|
791
|
+
return undefined;
|
|
792
|
+
total += sign * Number(amount) * unitMs;
|
|
793
|
+
}
|
|
794
|
+
return negate ? -total : total;
|
|
795
|
+
}
|
|
796
|
+
/**
|
|
797
|
+
* Coerce a loose date-ish value to a real `Date`, or `undefined` when it can't be
|
|
798
|
+
* interpreted. Accepts, in this order:
|
|
799
|
+
*
|
|
800
|
+
* - a `Date` (passed through; an invalid one is a miss);
|
|
801
|
+
* - an epoch NUMBER or numeric string, in seconds or milliseconds (see
|
|
802
|
+
* {@link SECONDS_CEILING});
|
|
803
|
+
* - `now` (and its `today` spelling), for the current instant;
|
|
804
|
+
* - a {@link toDuration} expression, resolved RELATIVE TO NOW, so `-7d`,
|
|
805
|
+
* `7 days ago`, and `in 30 minutes` are all valid instants;
|
|
806
|
+
* - anything `Date.parse` understands (`2026-08-02`, an ISO/UTC instant).
|
|
807
|
+
*
|
|
808
|
+
* The epoch unit inference is the reason this exists rather than
|
|
809
|
+
* `new Date(value)`: a bare epoch arrives as a STRING from an env var or a CLI
|
|
810
|
+
* flag as often as it arrives as a number (`date +%s`, a JSON field, a copied log
|
|
811
|
+
* line), and `Date.parse("1785697899")` reads that as a YEAR, silently landing
|
|
812
|
+
* 1.7 billion years out. Numeric strings are therefore routed to the epoch path,
|
|
813
|
+
* never to `Date.parse`.
|
|
814
|
+
*
|
|
815
|
+
* Like {@link toBoolean} this NEVER throws and returns `undefined` for anything
|
|
816
|
+
* uninterpretable, so a caller decides whether a bad value is fatal, a warning,
|
|
817
|
+
* or a fallback.
|
|
818
|
+
*
|
|
819
|
+
* @example
|
|
820
|
+
* toDate("now"); // this instant
|
|
821
|
+
* toDate("2026-08-02"); // 2026-08-02T00:00:00.000Z
|
|
822
|
+
* toDate("1785697899"); // seconds -> 2026-08-02T...
|
|
823
|
+
* toDate(1785697899000); // millis -> the same instant
|
|
824
|
+
* toDate("30 days ago"); // now - 30d
|
|
825
|
+
* toDate("nope"); // undefined
|
|
826
|
+
*/
|
|
827
|
+
export function toDate(value) {
|
|
828
|
+
if (value instanceof Date) {
|
|
829
|
+
return Number.isNaN(value.getTime()) ? undefined : value;
|
|
830
|
+
}
|
|
831
|
+
const epochMs = toEpochMs(value);
|
|
832
|
+
if (epochMs !== undefined)
|
|
833
|
+
return fromMs(epochMs);
|
|
834
|
+
if (typeof value !== "string")
|
|
835
|
+
return undefined;
|
|
836
|
+
const text = value.trim().toLowerCase();
|
|
837
|
+
if (text === "now" || text === "today")
|
|
838
|
+
return new Date();
|
|
839
|
+
const offsetMs = toDuration(value);
|
|
840
|
+
if (offsetMs !== undefined)
|
|
841
|
+
return fromMs(Date.now() + offsetMs);
|
|
842
|
+
const parsed = Date.parse(value.trim());
|
|
843
|
+
return Number.isNaN(parsed) ? undefined : new Date(parsed);
|
|
844
|
+
}
|
|
845
|
+
/** A `Date` for epoch `ms`, or `undefined` when it is out of representable range. */
|
|
846
|
+
function fromMs(ms) {
|
|
847
|
+
const date = new Date(ms);
|
|
848
|
+
return Number.isNaN(date.getTime()) ? undefined : date;
|
|
849
|
+
}
|
|
850
|
+
/** Epoch milliseconds for a numeric value/string, or `undefined` when not one. */
|
|
851
|
+
function toEpochMs(value) {
|
|
852
|
+
let numeric;
|
|
853
|
+
if (typeof value === "number") {
|
|
854
|
+
numeric = value;
|
|
855
|
+
}
|
|
856
|
+
else if (typeof value === "string" && /^[+-]?\d+(\.\d+)?$/.test(value.trim())) {
|
|
857
|
+
numeric = Number(value.trim());
|
|
858
|
+
}
|
|
859
|
+
else {
|
|
860
|
+
return undefined;
|
|
861
|
+
}
|
|
862
|
+
if (!Number.isFinite(numeric))
|
|
863
|
+
return undefined;
|
|
864
|
+
return Math.abs(numeric) < SECONDS_CEILING ? numeric * 1000 : numeric;
|
|
865
|
+
}
|
|
691
866
|
export function deepEqual(a, b, comparator) {
|
|
692
867
|
if (comparator) {
|
|
693
868
|
const decided = comparator(a, b);
|
|
@@ -765,4 +940,4 @@ export function deepEqual(a, b, comparator) {
|
|
|
765
940
|
}
|
|
766
941
|
return true;
|
|
767
942
|
}
|
|
768
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUEwQkgsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxXQUFXLENBQWMsS0FBbUI7SUFDMUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBY0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFjLEtBQWM7SUFDdEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxHQUFHLElBQUksS0FBSyxZQUFZLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixVQUF5RCxFQUN6RCxPQUFpQztJQUVqQyxTQUFTLEtBQUssQ0FBQyxLQUFjLEVBQUUsSUFBbUI7UUFDaEQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFD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LENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVwZW5kZW5jeS1mcmVlIG9iamVjdCArIGl0ZXJhYmxlIHV0aWxpdGllcy5cbiAqXG4gKiBWYWx1ZSBndWFyZHMgLyBjb2VyY2lvbnMgLyBzaGFwZSB0eXBlczoge0BsaW5rIGlzUmVjb3JkfSBuYXJyb3dzIHBhcnNlZCBKU09OXG4gKiB0byBhIHJlY29yZCwge0BsaW5rIHRvQm9vbGVhbn0gY29lcmNlcyBsb29zZSB0cnV0aHkvZmFsc3kgdmFsdWVzLCB7QGxpbmtcbiAqIG9wdGlvbmFsfSBzcHJlYWRzIGEgZmllbGQgb25seSB3aGVuIGl0IGlzIHByZXNlbnQsIHtAbGluayBkZWVwRXF1YWx9IGNvbXBhcmVzXG4gKiBzdHJ1Y3R1cmFsbHksIGFuZCB7QGxpbmsgTmFtZUxpa2V9L3tAbGluayBOb25GdW5jdGlvbktleXN9IGRlc2NyaWJlIG9iamVjdFxuICogc2hhcGVzLlxuICpcbiAqIEl0ZXJhYmxlIGhlbHBlcnM6IHtAbGluayBnZW5lcmF0b3J9IGZsYXR0ZW5zIG1peGVkIGFyZ3VtZW50czsge0BsaW5rIHNlcXVlbmNlfVxuICogd3JhcHMgc291cmNlKHMpIGluIGEgbGF6eSwgYEFycmF5YC1jb21wYXRpYmxlIHtAbGluayBTZXF1ZW5jZX0uIEV2ZXJ5XG4gKiB0cmFuc2Zvcm0vdGVybWluYWwgaXMgYSBzdGFuZGFsb25lIGZ1bmN0aW9uIG9wZXJhdGluZyBvbiBwbGFpbiB7QGxpbmtcbiAqIENvbnRhaW5lcn1zIChzZWUge0BsaW5rIG1hcH0sIHtAbGluayBmaWx0ZXJ9LCB7QGxpbmsgZ3JvdXB9LCAuLi4pOyB0aGUge0BsaW5rXG4gKiBTZXF1ZW5jZX0gbWV0aG9kcyBhcmUgdGhpbiBmb3J3YXJkZXJzIG92ZXIgdGhlbSBzbyB0aGUgc2FtZSBsb2dpYyBiYWNrcyBib3RoXG4gKiB0aGUgZnJlZS1mdW5jdGlvbiBhbmQgdGhlIGZsdWVudC9jaGFpbmVkIHN0eWxlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLyoqIExhenkgc2VxdWVuY2Ugb3ZlciBpdGVyYWJsZSBzb3VyY2UocykuIFNlZSB7QGxpbmsgc2VxdWVuY2V9LiAqL1xuZXhwb3J0IHR5cGUgU2VxdWVuY2U8VD4gPSBTZXF1ZW5jZUltcGw8VD47XG5cbnR5cGUgU2VxdWVuY2VTb3VyY2U8VD4gPSBJdGVyYWJsZTxUPiB8IFJlYWRvbmx5TWFwPHVua25vd24sIFQ+IHwgT25lT3JNYW55PFQ+IHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIG5vbi1zY2FsYXIge0BsaW5rIEl0ZXJhYmxlfSAtIG9uZSB0byB0cmVhdCBhcyBhIGNvbGxlY3Rpb24gb2YgZWxlbWVudHNcbiAqIHJhdGhlciB0aGFuIGEgc2NhbGFyLiB7QGxpbmsgaXNDb250YWluZXJ9IG5hcnJvd3MgdG8gdGhpcywgZXhjbHVkaW5nIHN0cmluZ3MsXG4gKiBgU3RyaW5nYC9gUmVnRXhwYCBvYmplY3RzLCBhbmQgZnVuY3Rpb25zLiB7QGxpbmsgQ29sbGVjdGlvbn0gaXMgdGhlIGVhZ2VybHktXG4gKiBzaXplZCBzdWJzZXQuIFRoZSBlbGVtZW50IGRlZmF1bHRzIHRvIGB1bmtub3duYCBzbyBhbnkgYENvbGxlY3Rpb25gIGlzXG4gKiBhc3NpZ25hYmxlIHRvIGEgYmFyZSBgQ29udGFpbmVyYC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29udGFpbmVyPFQgPSB1bmtub3duPiA9IEl0ZXJhYmxlPFQ+O1xuXG4vKipcbiAqIEEgYnVpbHQtaW4sIGVhZ2VybHktc2l6ZWQge0BsaW5rIENvbnRhaW5lcn06IGFuIHtAbGluayBBcnJheX0sIHtAbGluayBTZXR9LCBvclxuICoge0BsaW5rIE1hcH0gKHdob3NlICp2YWx1ZXMqIGFyZSBgVGAgLSBhIE1hcCBpdGVyYXRlcyBgW2tleSwgdmFsdWVdYCBlbnRyaWVzLFxuICogc28gaXRzIGVsZW1lbnQgdHlwZSBkaWZmZXJzLCBidXQgaXRzIHZhbHVlIHR5cGUgaXMgYFRgKS4gQWxsIHNoYXJlIGEgY2hlYXBcbiAqIGVtcHRpbmVzcyBjaGVjayAoe0BsaW5rIGlzRW1wdHl9KS5cbiAqL1xuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbjxUPiA9IFJlYWRvbmx5QXJyYXk8VD4gfCBSZWFkb25seVNldDxUPiB8IFJlYWRvbmx5TWFwPHVua25vd24sIFQ+O1xuXG5leHBvcnQgdHlwZSBPbmVPck1hbnk8VD4gPSBbVCwgLi4uVFtdXTtcblxuLyoqIE5hcnJvdyBhIHJlYWRvbmx5IGFycmF5IHRvIGEgbm9uLWVtcHR5IHtAbGluayBPbmVPck1hbnl9IHR1cGxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT25lT3JNYW55PFQgPSB1bmtub3duPih2YWx1ZTogcmVhZG9ubHkgVFtdKTogdmFsdWUgaXMgT25lT3JNYW55PFQ+IHtcbiAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IDA7XG59XG5cbi8qKiBBIHNvdXJjZSBhY2NlcHRlZCBieSBhIHZhcmlhZGljIG9wOiBhIHtAbGluayBDb250YWluZXJ9IG9mIGBUYCwgb3Igbm90aGluZy4gKi9cbnR5cGUgU291cmNlPFQ+ID0gQ29udGFpbmVyPFQ+IHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFbGVtZW50IHR5cGUgb2YgYSB7QGxpbmsgZ3JvdXB9IGJ1Y2tldCBhcnJheTogd2hlbiB0aGUgcHJlZGljYXRlIGBQYCBpcyBhIHR5cGVcbiAqIGd1YXJkIChgdmFsdWUgaXMgU2ApLCB0aGUgYnVja2V0IGlzIG5hcnJvd2VkIHRvIGBTICYgVGA7IG90aGVyd2lzZSBpdCBzdGF5cyBgVGAuXG4gKi9cbnR5cGUgR3JvdXBWYWx1ZTxULCBQPiA9IFAgZXh0ZW5kcyAodmFsdWU6IGFueSwgLi4ucmVzdDogYW55W10pID0+IHZhbHVlIGlzIGluZmVyIFMgPyBTICYgVCA6IFQ7XG5cbi8qKiBBIG1hcCBvZiBncm91cCBuYW1lIC0+IHByZWRpY2F0ZSwgYXMgYWNjZXB0ZWQgYnkge0BsaW5rIGdyb3VwfS4gKi9cbnR5cGUgR3JvdXBQcmVkaWNhdGVzPFQ+ID0gUmVjb3JkPHN0cmluZywgKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuPjtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBhIHtAbGluayBDb2xsZWN0aW9ufTogYW4ge0BsaW5rIEFycmF5fSwge0BsaW5rIFNldH0sIG9yXG4gKiB7QGxpbmsgTWFwfS4gTmFycm93cyBgdmFsdWVgIHNvIGl0cyBlbGVtZW50L3ZhbHVlIHR5cGUgaXMgdHJlYXRlZCBhcyBgVGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCAob3IgTWFwIHZhbHVlKSB0eXBlIGFzc2VydGVkIGZvciB0aGUgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgKG5hcnJvd2luZyBgdmFsdWVgIHRvIHtAbGluayBDb2xsZWN0aW9ufTxgVGA+KSBmb3IgYVxuICogICBidWlsdC1pbiBhcnJheS9zZXQvbWFwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xsZWN0aW9uPFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbGxlY3Rpb248VD4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXA7XG59XG5cbi8qKlxuICogYHRydWVgIHdoZW4gYSB7QGxpbmsgQ29sbGVjdGlvbn0gaGFzIG5vIGVsZW1lbnRzLiBVc2VzIGBsZW5ndGhgIGZvciBhcnJheXNcbiAqIGFuZCBgc2l6ZWAgZm9yIHtAbGluayBTZXR9L3tAbGluayBNYXB9LlxuICpcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIC0gVGhlIGFycmF5LCBzZXQsIG9yIG1hcCB0byB0ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvbjx1bmtub3duPiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zPzogeyByZWN1cnNpdmU/OiBib29sZWFuIH0sXG4pOiBib29sZWFuIHtcbiAgZnVuY3Rpb24gdmlzaXQodmFsdWU6IHVua25vd24sIHNlZW4/OiBTZXQ8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChzZWVuPy5oYXModmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHNlZW4/LmFkZCh2YWx1ZSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMCB8fCAoc2VlbiA/IHZhbHVlLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNpemUgPT09IDAgfHwgKHNlZW4gPyBbLi4udmFsdWVdLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB2YWx1ZS5zaXplID09PSAwIHx8XG4gICAgICAgICAgKHNlZW4gPyBbLi4udmFsdWUudmFsdWVzKCldLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHNlZW4pIHtcbiAgICAgICAgcmV0dXJuIGtleXMuZXZlcnkoKGtleSkgPT4gdmlzaXQoKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBzZWVuKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZpc2l0KGNvbGxlY3Rpb24sIG9wdGlvbnM/LnJlY3Vyc2l2ZSA/IG5ldyBTZXQoKSA6IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNvdXJjZSB0byBhbiBpdGVyYWJsZSBvZiBpdHMgYFRgIHZhbHVlcywgc28gTWFwcyBhcmUgdHJlYXRlZFxuICogdW5pZm9ybWx5IHdpdGggYXJyYXlzL3NldHM6IGEge0BsaW5rIE1hcH0geWllbGRzIGl0cyAqdmFsdWVzKiAobWF0Y2hpbmdcbiAqIHtAbGluayBDb2xsZWN0aW9ufSdzIHZhbHVlLXR5cGVkIGBUYCksIGFueSBvdGhlciBpdGVyYWJsZSB5aWVsZHMgaXRzZWxmLiBUaGlzXG4gKiBpcyB3aGF0IHtAbGluayBzZXF1ZW5jZX0gY29uc3VtZXMsIHNvIGEgYE1hcGAgY29udHJpYnV0ZXMgdmFsdWVzIGV2ZXJ5d2hlcmVcbiAqIHJhdGhlciB0aGFuIGBba2V5LCB2YWx1ZV1gIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZXM8VD4oc291cmNlOiBJdGVyYWJsZTxUPiB8IFJlYWRvbmx5TWFwPHVua25vd24sIFQ+KTogSXRlcmFibGU8VD4ge1xuICByZXR1cm4gc291cmNlIGluc3RhbmNlb2YgTWFwID8gc291cmNlLnZhbHVlcygpIDogKHNvdXJjZSBhcyBJdGVyYWJsZTxUPik7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYSB7QGxpbmsgQ29udGFpbmVyfSAtIGFuIGl0ZXJhYmxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb2xsZWN0aW9uXG4gKiByYXRoZXIgdGhhbiBhIHNjYWxhci5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgZXhjbHVkZXMgdmFsdWVzIHRoYXQgYXJlIHRlY2huaWNhbGx5IGl0ZXJhYmxlIGJ1dCBzaG91bGQgYmVcbiAqIHRyZWF0ZWQgYXMgc2NhbGFycyBoZXJlIC0gc3RyaW5ncywgYFN0cmluZ2AvYFJlZ0V4cGAgb2JqZWN0cywgYW5kIGZ1bmN0aW9ucyAtXG4gKiBzbyBhIGxvbmUgc3RyaW5nIGlzIG5ldmVyIHNwcmVhZCBjaGFyYWN0ZXItYnktY2hhcmFjdGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgdHlwZSBhc3NlcnRlZCBmb3IgdGhlIGl0ZXJhYmxlLlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCAobmFycm93aW5nIGB2YWx1ZWAgdG8ge0BsaW5rIENvbnRhaW5lcn08YFRgPikgZm9yIGEgbm9uLXN0cmluZ1xuICogICBpdGVyYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGFpbmVyPFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnRhaW5lcjxUPiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJlxuICAgICEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpICYmXG4gICAgISh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkgJiZcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgeyBbU3ltYm9sLml0ZXJhdG9yXT86IHVua25vd24gfSlbU3ltYm9sLml0ZXJhdG9yXSA9PT0gXCJmdW5jdGlvblwiXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNlcXVlbmNlU291cmNlczxUPiguLi5zb3VyY2VzOiBTZXF1ZW5jZVNvdXJjZTxUPltdKTogSXRlcmFibGU8VD5bXSB7XG4gIGNvbnN0IHNvdXJjZUl0ZXJhYmxlczogSXRlcmFibGU8VD5bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsIHx8IChpc0NvbGxlY3Rpb24oc291cmNlKSAmJiBpc0VtcHR5KHNvdXJjZSkpKSBjb250aW51ZTtcbiAgICBzb3VyY2VJdGVyYWJsZXMucHVzaCh2YWx1ZXMoc291cmNlKSk7XG4gIH1cbiAgcmV0dXJuIHNvdXJjZUl0ZXJhYmxlcztcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBuZXN0ZWQgYXJyYXlzIGZvciB7QGxpbmsgZmxhdH0uIE5vbi1hcnJheSB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgYVxuICogc2luZ2xlLWVsZW1lbnQgaXRlcmFibGU7IGRlcHRoIGRlY3JlbWVudHMgcGVyIGFycmF5IGxldmVsLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuVmFsdWUodmFsdWU6IHVua25vd24sIGRlcHRoOiBudW1iZXIpOiBJdGVyYWJsZTx1bmtub3duPiB7XG4gIGlmIChkZXB0aCA+IDAgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBuZXh0RGVwdGggPSBOdW1iZXIuaXNGaW5pdGUoZGVwdGgpID8gZGVwdGggLSAxIDogZGVwdGg7XG4gICAgcmV0dXJuIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB5aWVsZCogZmxhdHRlblZhbHVlKGl0ZW0sIG5leHREZXB0aCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIFt2YWx1ZV07XG59XG5cbi8qKiBXcmFwIGEgcGVyLWVsZW1lbnQgdHJhbnNmb3JtIChlYWNoIGVsZW1lbnQgLT4gYW4gaXRlcmFibGUpIGFzIGEgbGF6eSB7QGxpbmsgU2VxdWVuY2V9LiAqL1xuZnVuY3Rpb24gZGVyaXZlPFQsIFU+KFxuICBzb3VyY2U6IEl0ZXJhYmxlPFQ+LFxuICBmbjogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBJdGVyYWJsZTxVPixcbik6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHlpZWxkKiBmbih2YWx1ZSwgaW5kZXgrKyk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKiBMaWtlIHtAbGluayBkZXJpdmV9LCBidXQgeWllbGRzIG9uZSB2YWx1ZSBwZXIgc291cmNlIGVsZW1lbnQgKG5vIHdyYXBwZXIgaXRlcmFibGUpLiAqL1xuZnVuY3Rpb24gZGVyaXZlT25lPFQsIFU+KHNvdXJjZTogSXRlcmFibGU8VD4sIGZuOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc291cmNlKSB5aWVsZCBmbih2YWx1ZSwgaW5kZXgrKyk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5tYXBgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY29udGFpbmVyIHRvIG1hcCAobnVsbGlzaCB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UpLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGVkIHBlciBlbGVtZW50IHdpdGggaXRzIGluZGV4OyBpdHMgcmVzdWx0IGlzIGVtaXR0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXA8VCwgVT4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVLFxuKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gZGVyaXZlT25lKHNlcXVlbmNlKHNvdXJjZSksIGNhbGxiYWNrKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBBIHR5cGUtZ3VhcmQgcHJlZGljYXRlIG5hcnJvd3MgdGhlIHJlc3VsdGluZyBlbGVtZW50IHR5cGUuXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjb250YWluZXIgdG8gZmlsdGVyIChudWxsaXNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSkuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gS2VlcHMgZWxlbWVudHMgZm9yIHdoaWNoIGl0IHJldHVybnMgYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogU2VxdWVuY2U8Uz47XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBTZXF1ZW5jZTxUPjtcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFNlcXVlbmNlPFQ+IHtcbiAgcmV0dXJuIGRlcml2ZShzZXF1ZW5jZShzb3VyY2UpLCBmdW5jdGlvbiogKHZhbHVlLCBpbmRleCkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgeWllbGQgdmFsdWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlcyB0aGUgc291cmNlcyBhbmQgeWllbGRzIG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgbm90IGBudWxsYCBvclxuICogYHVuZGVmaW5lZGAsIG5hcnJvd2luZyB0aGUgZWxlbWVudCB0eXBlIHRvIHtAbGluayBOb25OdWxsYWJsZX08YFRgPi5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub25OdWxsPFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8Tm9uTnVsbGFibGU8VD4+IHtcbiAgcmV0dXJuIGZpbHRlcihzZXF1ZW5jZSguLi5zb3VyY2VzKSwgKHZhbHVlKTogdmFsdWUgaXMgTm9uTnVsbGFibGU8VD4gPT4gdmFsdWUgIT0gbnVsbCk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mbGF0TWFwYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGNvbnRhaW5lciB0byBtYXAgKG51bGxpc2ggeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlKS5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFJldHVybnMgYSB2YWx1ZSBvciBhcnJheSBvZiB2YWx1ZXMsIGZsYXR0ZW5lZCBvbmUgbGV2ZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0TWFwPFQsIFU+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSB8IFJlYWRvbmx5QXJyYXk8VT4sXG4pOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBkZXJpdmUoc2VxdWVuY2Uoc291cmNlKSwgZnVuY3Rpb24qICh2YWx1ZSwgaW5kZXgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHlpZWxkKiByZXN1bHQ7XG4gICAgZWxzZSB5aWVsZCByZXN1bHQgYXMgVTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mbGF0YCAoYXJyYXlzIG9ubHkpLiBgZGVwdGhgIGxlYWRzIHNvIHRoZVxuICogc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYzsgdXNlIGBkZXB0aCA8IDFgIGZvciBhIG5vLW9wIHBhc3N0aHJvdWdoLlxuICpcbiAqIEBwYXJhbSBkZXB0aCAtIEhvdyBtYW55IGFycmF5IGxldmVscyB0byBmbGF0dGVuLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlLCB0aGVuIGZsYXR0ZW4gKG51bGxpc2ggc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0PFQ+KGRlcHRoOiBudW1iZXIsIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgaWYgKGRlcHRoIDwgMSkgcmV0dXJuIHNyYztcbiAgcmV0dXJuIGRlcml2ZShzcmMsICh2YWx1ZSkgPT4gZmxhdHRlblZhbHVlKHZhbHVlLCBkZXB0aCkpIGFzIFNlcXVlbmNlPFQ+O1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlcyB0aGUgc291cmNlcywgdGhlbiBsYXppbHkgeWllbGRzIHZhbHVlcyBpbiBlbmNvdW50ZXIgb3JkZXIsXG4gKiBza2lwcGluZyBhIHZhbHVlIG9ubHkgd2hlbiBhbiBlcXVhbCBvbmUgd2FzIGFscmVhZHkgeWllbGRlZCAoYFNldGAgL1xuICogU2FtZVZhbHVlWmVybykuIFVuaXF1ZW5lc3MgaXMgY2hlY2tlZCBwZXIgZWxlbWVudCBhcyBpdCBpcyBjb25zdW1lZC5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0aW5jdDxUPiguLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8VD4oKTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFlpZWxkcyBgc291cmNlYCwgdGhlbiBlYWNoIGFwcGVuZGVkIGBpdGVtYCBpbiBvcmRlciAoYXJyYXlzIHNwcmVhZCBvbmUgbGV2ZWwpLFxuICogbWlycm9yaW5nIGBBcnJheS5wcm90b3R5cGUuY29uY2F0YC4gYGl0ZW1zYCBhcmUgc2NhbGFyIHZhbHVlcy9hcnJheXMsIG5vdFxuICogY29udGFpbmVycywgc28gYHNvdXJjZWAgc3RheXMgYSBzaW5nbGUgbGVhZGluZyBhcmd1bWVudC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGxlYWRpbmcgY29udGFpbmVyIChudWxsaXNoIHlpZWxkcyBqdXN0IHRoZSBpdGVtcykuXG4gKiBAcGFyYW0gaXRlbXMgLSBWYWx1ZXMgKG9yIGFycmF5cyBvZiB2YWx1ZXMpIGFwcGVuZGVkIGFmdGVyIHRoZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQ8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICAuLi5pdGVtczogcmVhZG9ubHkgKFQgfCBSZWFkb25seUFycmF5PFQ+KVtdXG4pOiBTZXF1ZW5jZTxUPiB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKHNvdXJjZSk7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHJldHVybiBzcmM7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgeWllbGQqIHNyYztcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkgeWllbGQqIGl0ZW07XG4gICAgICAgIGVsc2UgeWllbGQgaXRlbSBhcyBUO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFlpZWxkcyBhdCBtb3N0IGBjb3VudGAgZWxlbWVudHMgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzLlxuICogYGNvdW50YCBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAcGFyYW0gY291bnQgLSBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byB5aWVsZCAoYDw9IDBgIHlpZWxkcyBub25lKS5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRha2U8VD4oY291bnQ6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIGlmIChjb3VudCA8PSAwKSByZXR1cm4gZW1wdHlTZXF1ZW5jZSBhcyBTZXF1ZW5jZTxUPjtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgbGV0IHRha2VuID0gMDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgICBpZiAoKyt0YWtlbiA+PSBjb3VudCkgcmV0dXJuO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0cyB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMgaW50byBvbmUgYXJyYXkgcGVyIG5hbWVkIHByZWRpY2F0ZS4gQ29uc3VtZXNcbiAqIHRoZSBpbnB1dCBvbmNlLCByb3V0aW5nIGVhY2ggZWxlbWVudCB0byB0aGUgRklSU1QgcHJlZGljYXRlIGl0IHNhdGlzZmllcyAoc29cbiAqIGdyb3VwcyBhcmUgZGlzam9pbnQpOyBlbGVtZW50cyBtYXRjaGluZyBubyBwcmVkaWNhdGUgYXJlIGRyb3BwZWQuIFR5cGUtZ3VhcmRcbiAqIHByZWRpY2F0ZXMgbmFycm93IHRoZWlyIGdyb3VwJ3MgZWxlbWVudCB0eXBlIChzZWUge0BsaW5rIEdyb3VwVmFsdWV9KS5cbiAqIGBwcmVkaWNhdGVzYCBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAdHlwZVBhcmFtIEcgLSBUaGUgbWFwIG9mIGdyb3VwIG5hbWUgLT4gcHJlZGljYXRlLlxuICogQHBhcmFtIHByZWRpY2F0ZXMgLSBOYW1lZCBwcmVkaWNhdGVzOyBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIuXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzLCBlYWNoIGFuIGFycmF5IG9mIGl0cyBncm91cCdzIGVsZW1lbnRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGNvbnN0IHsgc3RyaW5ncywgZm5zIH0gPSBncm91cCh7IHN0cmluZ3M6IGlzU3RyaW5nLCBmbnM6IGlzRnVuY3Rpb24gfSwgeHMpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXA8VCwgRyBleHRlbmRzIEdyb3VwUHJlZGljYXRlczxUPj4oXG4gIHByZWRpY2F0ZXM6IEcsXG4gIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdXG4pOiB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcmVkaWNhdGVzKSBhcyAoa2V5b2YgRylbXTtcbiAgY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8a2V5b2YgRywgVFtdPihrZXlzLm1hcCgoa2V5KSA9PiBba2V5LCBbXV0pKTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZSguLi5zb3VyY2VzKSkge1xuICAgIGNvbnN0IGkgPSBpbmRleCsrO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChwcmVkaWNhdGVzW2tleV0hKHZhbHVlLCBpKSkge1xuICAgICAgICBidWNrZXRzLmdldChrZXkpIS5wdXNoKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHt9IGFzIHsgW0sgaW4ga2V5b2YgR106IEdyb3VwVmFsdWU8VCwgR1tLXT5bXSB9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgcmVzdWx0W2tleV0gPSBidWNrZXRzLmdldChrZXkpISBhcyBHcm91cFZhbHVlPFQsIEdbdHlwZW9mIGtleV0+W107XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgZWxlbWVudHMgdW50aWwgYSBtYXRjaC4gQSB0eXBlIGd1YXJkIG5hcnJvd3MgdGhlIHJldHVybiB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZDxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IFMgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgdGhlIGZ1bGwgc291cmNlLiBBIHR5cGUgZ3VhcmQgbmFycm93cyB0aGUgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IFMgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgbWF0Y2g6IFQgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSBtYXRjaCA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBtYXRjaDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyBlbGVtZW50cyB1bnRpbCBhIG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEluZGV4PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCkpIHJldHVybiBpbmRleDtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0SW5kZXhgLCBvdmVyIGEgc2luZ2xlXG4gKiB7QGxpbmsgQ29udGFpbmVyfS4gQ29uc3VtZXMgdGhlIGZ1bGwgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RJbmRleDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IG1hdGNoID0gLTE7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgbWF0Y2ggPSBpbmRleDtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiBtYXRjaDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLnNvbWVgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogU2hvcnQtY2lyY3VpdHMgb24gdGhlIGZpcnN0IG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29tZTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5ldmVyeWAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBTaG9ydC1jaXJjdWl0cyBvbiB0aGUgZmlyc3QgZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogYm9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBldmVyeTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBldmVyeTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgaWYgKCFwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyB0aGUgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yRWFjaDxUPihzb3VyY2U6IFNvdXJjZTxUPiwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIGNhbGxiYWNrKHZhbHVlLCBpbmRleCsrKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmF0YCBvdmVyIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcy5cbiAqIE5vbi1uZWdhdGl2ZSBpbmRpY2VzIHNjYW4gbGF6aWx5OyBuZWdhdGl2ZSBpbmRpY2VzIG1hdGVyaWFsaXplIGZpcnN0LiBgaW5kZXhgXG4gKiBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAcGFyYW0gaW5kZXggLSBaZXJvLWJhc2VkIHBvc2l0aW9uOyBuZWdhdGl2ZSBjb3VudHMgZnJvbSB0aGUgZW5kLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXQ8VD4oaW5kZXg6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIGlmIChpbmRleCA8IDApIHJldHVybiB0b0FycmF5KHNyYykuYXQoaW5kZXgpO1xuICBsZXQgaSA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgaWYgKGkrKyA9PT0gaW5kZXgpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9PbmVPck1hbnk8VD4oaW5wdXQ6IFQgfCBPbmVPck1hbnk8VD4pOiBPbmVPck1hbnk8VD4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF07XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemVzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBzaW5nbGUtcGFzc1xuICogc291cmNlcy5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogcmVhZG9ubHkgVFtdIHtcbiAgcmV0dXJuIFsuLi5zZXF1ZW5jZSguLi5zb3VyY2VzKV07XG59XG5cbi8qKlxuICogTGF6eSBpdGVyYWJsZSBzZXF1ZW5jZSB3aXRoIGBBcnJheWAtY29tcGF0aWJsZSB0cmFuc2Zvcm1zIGFuZCB0ZXJtaW5hbFxuICogbWV0aG9kcy4gU2luZ2xlLXBhc3MgYnkgZGVmYXVsdDsgY2FsbCB7QGxpbmsgU2VxdWVuY2VJbXBsLmNhY2hlfSB0byByZXRhaW5cbiAqIHB1bGxlZCB2YWx1ZXMgZm9yIHJlLWl0ZXJhdGlvbi4gQnVpbHQgZm9yIGdlbmVyYXRvcnMgYW5kIG90aGVyIHNvdXJjZXMgd2hlcmVcbiAqIGEgc2Vjb25kIHBhc3MgaXMgbm90IGd1YXJhbnRlZWQuXG4gKlxuICogVGhlIG1ldGhvZHMgZm9yd2FyZCB0byB0aGUgc3RhbmRhbG9uZSBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSAtIHNlZSBlYWNoXG4gKiBtZXRob2QncyBgQHNlZWAgLSBzbyB0aGUgZnJlZS1mdW5jdGlvbiBhbmQgY2hhaW5lZCBzdHlsZXMgc2hhcmUgb25lIGltcGwuXG4gKi9cbmNsYXNzIFNlcXVlbmNlSW1wbDxUPiB7XG4gIHByaXZhdGUgaXRlcmF0b3I/OiBJdGVyYXRvcjxUPjtcbiAgcHJpdmF0ZSBleGhhdXN0ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2U6IEl0ZXJhYmxlPFQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBUW10gfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IHsgcmVhZG9ubHkgZXhoYXVzdGVkPzogYm9vbGVhbiB9ID0ge30sXG4gICkge1xuICAgIHRoaXMuZXhoYXVzdGVkID0gc3RhdGUuZXhoYXVzdGVkID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FjaGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBZHZhbmNlIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBvbmNlLCBjcmVhdGluZyB0aGUgaXRlcmF0b3Igb24gZmlyc3QgdXNlLiAqL1xuICBwcml2YXRlIHB1bGwoKTogSXRlcmF0b3JSZXN1bHQ8VD4ge1xuICAgIHRoaXMuaXRlcmF0b3IgPz89IHRoaXMuc291cmNlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICByZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gIH1cblxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VD4ge1xuICAgIGlmICghdGhpcy5jYWNoaW5nKSB7XG4gICAgICBpZiAodGhpcy5leGhhdXN0ZWQpIHJldHVybjtcbiAgICAgIGZvciAobGV0IG5leHQgPSB0aGlzLnB1bGwoKTsgIW5leHQuZG9uZTsgbmV4dCA9IHRoaXMucHVsbCgpKSB7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICB9XG4gICAgICB0aGlzLmV4aGF1c3RlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhY2hlZDogaXRlcmF0ZSBsaWtlIGEgbGlzdC4gQWx3YXlzIHJlcGxheSB0aGUgYnVmZmVyIGZyb20gdGhlIHN0YXJ0LFxuICAgICAgLy8gZXh0ZW5kaW5nIGl0IGZyb20gdGhlIHNvdXJjZSBvbiBkZW1hbmQgdW50aWwgZXhoYXVzdGVkLiBBIGJyb2tlbiBsb29wXG4gICAgICAvLyBsZWF2ZXMgdGhlIGJ1ZmZlciBpbnRhY3QsIHNvIHRoZSBuZXh0IGl0ZXJhdGlvbiBzdGFydHMgb3ZlciBmcm9tIHRoZVxuICAgICAgLy8gYmVnaW5uaW5nLlxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIhO1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKGluZGV4IDwgYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIHlpZWxkIGJ1ZmZlcltpbmRleCsrXSE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhoYXVzdGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnB1bGwoKTtcbiAgICAgICAgaWYgKG5leHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuZXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLnB1c2gobmV4dC52YWx1ZSk7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG1hcH0gKi9cbiAgbWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBTZXF1ZW5jZTxVPiB7XG4gICAgcmV0dXJuIG1hcCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmlsdGVyfSAqL1xuICBmaWx0ZXI8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogU2VxdWVuY2U8Uz47XG4gIGZpbHRlcihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFNlcXVlbmNlPFQ+O1xuICBmaWx0ZXIocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGZpbHRlcih0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG5vbk51bGx9ICovXG4gIG5vbk51bGwoKTogU2VxdWVuY2U8Tm9uTnVsbGFibGU8VD4+IHtcbiAgICByZXR1cm4gbm9uTnVsbCh0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0TWFwfSAqL1xuICBmbGF0TWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUgfCBSZWFkb25seUFycmF5PFU+KTogU2VxdWVuY2U8VT4ge1xuICAgIHJldHVybiBmbGF0TWFwKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0fSAqL1xuICBmbGF0KGRlcHRoID0gMSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZmxhdChkZXB0aCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZGlzdGluY3R9ICovXG4gIGRpc3RpbmN0KCk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZGlzdGluY3QodGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgY29uY2F0fSAqL1xuICBjb25jYXQoLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgUmVhZG9ubHlBcnJheTxUPilbXSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gY29uY2F0KHRoaXMsIC4uLml0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXppbHkgeWllbGRzIHRoaXMgc2VxdWVuY2UgZm9sbG93ZWQgYnkgZWFjaCBpdGVyYWJsZSBgc291cmNlYCBpbiBvcmRlci5cbiAgICogTGlrZSB7QGxpbmsgY29uY2F0fSwgYnV0IGZvciBpdGVyYWJsZSBzb3VyY2VzIChnZW5lcmF0b3JzLCBvdGhlciBzZXF1ZW5jZXMsXG4gICAqIGBTZXRgLCBgTWFwYCwgZXRjLikgcmF0aGVyIHRoYW4gc2NhbGFyIHZhbHVlcyBvciBhcnJheXMuIEEge0BsaW5rIE1hcH1cbiAgICogc291cmNlIGNvbnRyaWJ1dGVzIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHNlcXVlbmNlfVxuICAgKi9cbiAgam9pbiguLi5zb3VyY2VzOiByZWFkb25seSBTZXF1ZW5jZVNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICAgIGNvbnN0IHNvdXJjZUl0ZXJhYmxlcyA9IHNlcXVlbmNlU291cmNlcyh0aGlzLCAuLi5zb3VyY2VzKTtcbiAgICByZXR1cm4gc2VxdWVuY2VTb3VyY2VzLmxlbmd0aCA9PT0gMCA/IHRoaXMgOiBzZXF1ZW5jZSguLi5zb3VyY2VJdGVyYWJsZXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIHRha2V9ICovXG4gIHRha2UoY291bnQ6IG51bWJlcik6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gdGFrZShjb3VudCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZ3JvdXB9ICovXG4gIGdyb3VwPEcgZXh0ZW5kcyBHcm91cFByZWRpY2F0ZXM8VD4+KHByZWRpY2F0ZXM6IEcpOiB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfSB7XG4gICAgcmV0dXJuIGdyb3VwKHByZWRpY2F0ZXMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjYWNoZWQsIHJlLWl0ZXJhYmxlIHZpZXcgb2YgdGhpcyBzZXF1ZW5jZS4gQW4gYWxyZWFkeS1jYWNoaW5nXG4gICAqIHNlcXVlbmNlIHJldHVybnMgaXRzZWxmOyBvdGhlcndpc2UgdGhpcyBvbmUtcGFzcyBzZXF1ZW5jZSBpcyB3cmFwcGVkIGluIGFcbiAgICogbmV3IGluc3RhbmNlIHRoYXQgcmV0YWlucyBwdWxsZWQgdmFsdWVzLiBJdGVyYXRlIHRoZSByZXR1cm5lZCBpbnN0YW5jZSwgbm90XG4gICAqIHRoZSBvcmlnaW5hbCwgdG8gYXZvaWQgY29tcGV0aW5nIGZvciB0aGUgc2FtZSBzaW5nbGUtcGFzcyBzb3VyY2UuXG4gICAqL1xuICBjYWNoZSgpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGluZyA/IHRoaXMgOiBuZXcgU2VxdWVuY2VJbXBsKHRoaXMsIFtdKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kfSAqL1xuICBmaW5kPFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFMgfCB1bmRlZmluZWQ7XG4gIGZpbmQocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZpbmQodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kTGFzdH0gKi9cbiAgZmluZExhc3Q8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogUyB8IHVuZGVmaW5lZDtcbiAgZmluZExhc3QocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kTGFzdChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmaW5kTGFzdCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRJbmRleH0gKi9cbiAgZmluZEluZGV4KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZmluZEluZGV4KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZExhc3RJbmRleH0gKi9cbiAgZmluZExhc3RJbmRleChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGZpbmRMYXN0SW5kZXgodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBzb21lfSAqL1xuICBzb21lKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNvbWUodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBldmVyeX0gKHRoZSBgUyBleHRlbmRzIFRgIG92ZXJsb2FkIG5hcnJvd3MgYXQgY29tcGlsZSB0aW1lIG9ubHkpLiAqL1xuICBldmVyeTxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiB0aGlzIGlzIFNlcXVlbmNlPFM+O1xuICBldmVyeShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW47XG4gIGV2ZXJ5KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZXJ5KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZm9yRWFjaH0gKi9cbiAgZm9yRWFjaChjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgZm9yRWFjaCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgYXR9ICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYXQoaW5kZXgsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBzZXF1ZW5jZSBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBhIHNpbmdsZS1wYXNzIHNvdXJjZTsgYVxuICAgKiBjYWNoZWQsIGV4aGF1c3RlZCBzZXF1ZW5jZSBjb3BpZXMgaXRzIGJ1ZmZlciBkaXJlY3RseS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgdG9BcnJheX1cbiAgICovXG4gIHRvQXJyYXkoKTogcmVhZG9ubHkgVFtdIHtcbiAgICBpZiAodGhpcy5jYWNoaW5nICYmIHRoaXMuZXhoYXVzdGVkKSByZXR1cm4gWy4uLnRoaXMuYnVmZmVyIV07XG4gICAgcmV0dXJuIHRvQXJyYXkodGhpcyk7XG4gIH1cbn1cblxuLyoqIFNoYXJlZCBlbXB0eSBzZXF1ZW5jZSBzaW5nbGV0b24sIHJldXNhYmxlIGZvciBhbnkgZWxlbWVudCB0eXBlLiAqL1xuY29uc3QgZW1wdHlTZXF1ZW5jZTogU2VxdWVuY2U8bmV2ZXI+ID0gbmV3IFNlcXVlbmNlSW1wbChbXSwgdW5kZWZpbmVkLCB7XG4gIGV4aGF1c3RlZDogdHJ1ZSxcbn0pO1xuXG4vKipcbiAqIFdyYXAgb25lIG9yIG1vcmUgaXRlcmFibGUgYHNvdXJjZXNgIGluIGEgc2luZ2xlIGxhenkge0BsaW5rIFNlcXVlbmNlfSxcbiAqIGl0ZXJhdGVkIGluIG9yZGVyLiBgbnVsbGAvYHVuZGVmaW5lZGAgc291cmNlcyBhcmUgc2tpcHBlZDsgd2hlbiBub3RoaW5nXG4gKiByZW1haW5zIChldmVyeSBzb3VyY2Ugb21pdHRlZCwgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgYW4gZW1wdHkgYXJyYXkgL1xuICogYFNldGAgLyBgTWFwYCksIHtAbGluayBlbXB0eVNlcXVlbmNlfSBpcyByZXR1cm5lZC4gVGhlIHJlc3VsdCBpcyBzaW5nbGUtcGFzc1xuICogLSBjYWxsIGAuY2FjaGUoKWAgdG8gbWFrZSBpdCByZS1pdGVyYWJsZS5cbiAqXG4gKiBBIHtAbGluayBNYXB9IHNvdXJjZSBjb250cmlidXRlcyBpdHMgdmFsdWVzIChzZWUge0BsaW5rIHZhbHVlc30pLCBjb25zaXN0ZW50XG4gKiB3aXRoIHtAbGluayBDb2xsZWN0aW9ufSdzIHZhbHVlLXR5cGVkIGBUYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHNvdXJjZXMgLSBJdGVyYWJsZXMgdG8gY29uY2F0ZW5hdGUsIGluIG9yZGVyIChgTWFwYCBzb3VyY2VzIHVzZSB2YWx1ZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2U8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU2VxdWVuY2VTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgLy8gU2tpcCBudWxsaXNoIHNvdXJjZXMgYW5kIGtub3duLWVtcHR5IGNvbGxlY3Rpb25zOyBub3JtYWxpemUgdGhlIHJlc3QgdG9cbiAgLy8gdGhlaXIgdmFsdWVzIHNvIGEgTWFwIGNvbnRyaWJ1dGVzIHZhbHVlcyByYXRoZXIgdGhhbiBba2V5LCB2YWx1ZV0gZW50cmllcy5cbiAgY29uc3Qgc291cmNlSXRlcmFibGVzID0gc2VxdWVuY2VTb3VyY2VzKC4uLnNvdXJjZXMpO1xuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGVtcHR5U2VxdWVuY2UgYXMgU2VxdWVuY2U8VD47XG4gIC8vIFJldXNlIGFuIGV4aXN0aW5nIHNlcXVlbmNlIGFzLWlzIHJhdGhlciB0aGFuIHJlLXdyYXBwaW5nIGl0LlxuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG9ubHkgPSBzb3VyY2VJdGVyYWJsZXNbMF0hO1xuICAgIHJldHVybiBvbmx5IGluc3RhbmNlb2YgU2VxdWVuY2VJbXBsID8gKG9ubHkgYXMgU2VxdWVuY2U8VD4pIDogbmV3IFNlcXVlbmNlSW1wbChvbmx5LCB1bmRlZmluZWQpO1xuICB9XG4gIHJldHVybiBuZXcgU2VxdWVuY2VJbXBsKFxuICAgIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlSXRlcmFibGVzKSB5aWVsZCogc291cmNlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHVuZGVmaW5lZCxcbiAgKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBhIG1peCBvZiBzaW5nbGUgaXRlbXMgYW5kIGl0ZXJhYmxlcyBpbnRvIG9uZSBsYXp5IHtAbGluayBHZW5lcmF0b3J9LlxuICpcbiAqIEFyZ3VtZW50cyBhcmUgZW1pdHRlZCBpbiBvcmRlcjogYG51bGxgL2B1bmRlZmluZWRgIGFyZSBza2lwcGVkLCBub24tc3RyaW5nXG4gKiBpdGVyYWJsZXMgKHBlciB7QGxpbmsgaXNDb250YWluZXJ9KSBhcmUgeWllbGRlZCBlbGVtZW50LWJ5LWVsZW1lbnQsIGFuZFxuICogYW55dGhpbmcgZWxzZSAoaW5jbHVkaW5nIHN0cmluZ3MpIGlzIHlpZWxkZWQgYXMgYSBzaW5nbGUgaXRlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvci5cbiAqIEBwYXJhbSBpdGVtcyAtIEl0ZW1zIGFuZC9vciBpdGVyYWJsZXMgdG8gZmxhdHRlbiwgaW4gb3JkZXIuXG4gKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvdmVyIHRoZSBmbGF0dGVuZWQgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2VuZXJhdG9yPFQ+KFxuICAuLi5pdGVtczogcmVhZG9ubHkgKFQgfCBJdGVyYWJsZTxUPiB8IG51bGwgfCB1bmRlZmluZWQpW11cbik6IEdlbmVyYXRvcjxUPiB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGlmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChpc0NvbnRhaW5lcihpdGVtKSkge1xuICAgICAgeWllbGQqIGl0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHlpZWxkIGl0ZW07XG4gICAgfVxuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gT2JqZWN0IHZhbHVlIGd1YXJkcywgY29lcmNpb25zLCBhbmQgc3RydWN0dXJhbCBlcXVhbGl0eVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNaW5pbWFsIHNoYXBlIGZvciBvYmplY3RzIHRoYXQgZXhwb3NlIGFuIG9wdGlvbmFsIGBuYW1lYCAoZS5nLiBBcHBLaXQgcGx1Z2lucykuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVMaWtlIHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTm9uRnVuY3Rpb25LZXlzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gbmV2ZXIgOiBLO1xufVtrZXlvZiBUXTtcblxuLyoqXG4gKiBOYXJyb3cgYHZhbHVlYCB0byBhIHBsYWluIChub24tYXJyYXkpIG9iamVjdC4gVXNlIGFzIGEgdHlwZSBndWFyZFxuICogYmVmb3JlIGluZGV4aW5nIGludG8gLyBtdXRhdGluZyBwYXJzZWQgSlNPTiBzbyB0aGUgYWNjZXNzIGlzXG4gKiB0eXBlLXNhZmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlmIChpc1JlY29yZChwYXJzZWQpKSBwYXJzZWQuZm9vID0gMTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBgeyBba2V5XTogdmFsdWUgfWAgd2hlbiBgdmFsdWVgIGlzIHByZXNlbnQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYCAtIHNvIGFuXG4gKiBhYnNlbnQgb3B0aW9uYWwgZmllbGQgc3RheXMgQUJTRU5UIHdoZW4gc3ByZWFkLCByYXRoZXIgdGhhbiBiZWNvbWluZyBhblxuICogZXhwbGljaXQgYHVuZGVmaW5lZGAgdGhhdCBgZXhhY3RPcHRpb25hbFByb3BlcnR5VHlwZXNgIHJlamVjdHMuXG4gKlxuICogU3BlbGxpbmcgdGhhdCBpbmxpbmUgY29zdHMgYSByZXBlYXRlZCwgZG91YmxlLWV2YWx1YXRlZCB0ZXJuYXJ5IHBlciBmaWVsZFxuICogKGAuLi4odiA/IHsga2V5OiB2IH0gOiB7fSlgKSwgd2hpY2ggaXMgaG93IGNvbmZpZyByZXNvbHZlcnMgZW5kIHVwIGNvbXB1dGluZ1xuICogdGhlIHNhbWUgdmFsdWUgdHdpY2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIHJldHVybiB7XG4gKiAgIC4uLm9wdGlvbmFsKFwiYXBwSWRcIiwgZW52LnRleHQoXCJNSUNST1NPRlRfQVBQX0lEXCIpKSxcbiAqICAgLi4ub3B0aW9uYWwoXCJlbmRwb2ludFwiLCBjb25maWcuZW5kcG9pbnQpLFxuICogfTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsPEsgZXh0ZW5kcyBzdHJpbmcsIFY+KFxuICBrZXk6IEssXG4gIHZhbHVlOiBWIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IFJlY29yZDxLLCBWPiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogKHsgW2tleV06IHZhbHVlIH0gYXMgUmVjb3JkPEssIFY+KTtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYSBsb29zZSBib29sZWFuLWlzaCB2YWx1ZSB0byBhIHJlYWwgYGJvb2xlYW5gLCBvciBgdW5kZWZpbmVkYFxuICogd2hlbiBpdCBjYW4ndCBiZSBpbnRlcnByZXRlZC4gUmVjb2duaXplcyBgdHJ1ZWAvYHRgL2BvbmAvYDFgL2B5ZXNgL2B5YFxuICogYW5kIHRoZWlyIG5lZ2F0aXZlcyAoY2FzZS0gYW5kIHdoaXRlc3BhY2UtaW5zZW5zaXRpdmUgZm9yIHN0cmluZ3MpLCBhc1xuICogd2VsbCBhcyB0aGUgbnVtYmVycyBgMWAgYW5kIGAwYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHZhbHVlID09PSBcInRydWVcIiB8fFxuICAgICAgdmFsdWUgPT0gXCJ0XCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm9uXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIjFcIiB8fFxuICAgICAgdmFsdWUgPT09IFwieWVzXCIgfHxcbiAgICAgIHZhbHVlID09PSBcInlcIlxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHZhbHVlID09PSBcImZhbHNlXCIgfHxcbiAgICAgIHZhbHVlID09IFwiZlwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJvZmZcIiB8fFxuICAgICAgdmFsdWUgPT09IFwiMFwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJub1wiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJuXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgaWYgKHZhbHVlID09PSAxKSByZXR1cm4gdHJ1ZTtcbiAgICBlbHNlIGlmICh2YWx1ZSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3RydWN0dXJhbCBkZWVwLWVxdWFsaXR5IHdpdGggYW4gb3B0aW9uYWwgY3VzdG9tIGNvbXBhcmF0b3IuXG4gKlxuICoge0BsaW5rIGRlZXBFcXVhbH0gbWlycm9ycyB0aGUgc2VtYW50aWNzIG9mIHRoZSBgZmFzdC1kZWVwLWVxdWFsYFxuICogcGFja2FnZSAoaGFuZGxlZDogbmVzdGVkIHBsYWluIG9iamVjdHMvYXJyYXlzLCBgTWFwYCwgYFNldGAsIGBEYXRlYCxcbiAqIGBSZWdFeHBgLCB0eXBlZCBhcnJheXMsIGBOYU5gLCBhbmQgYCswYC9gLTBgIHRyZWF0ZWQgYXMgZXF1YWwpIGJ1dCBpc1xuICogZGVwZW5kZW5jeS1mcmVlIHNvIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCBrZWVwcyBubyBydW50aW1lIGRlcHMuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBjb21wYXJhdG9yYCBzaG9ydC1jaXJjdWl0cyB0aGUgc3RydWN0dXJhbCB3YWxrIGF0IGFueVxuICogbm9kZTogcmV0dXJuIGB0cnVlYC9gZmFsc2VgIHRvIGZvcmNlIHRoZSByZXN1bHQgZm9yIHRoYXQgcGFpciwgb3JcbiAqIGB1bmRlZmluZWRgIHRvIGRlZmVyIHRvIHRoZSBidWlsdC1pbiBjb21wYXJpc29uLiBJdCBpcyBpbnZva2VkIGZvciB0aGVcbiAqIHJvb3QgcGFpciBhbmQgcmVjdXJzaXZlbHkgZm9yIGVhY2ggbmVzdGVkIHBhaXIsIHNvIGEgY2FsbGVyIGNhbiwgZS5nLixcbiAqIGNvbXBhcmUgdHdvIGRvbWFpbiBvYmplY3RzIGJ5IGlkIHdoaWxlIGxldHRpbmcgZXZlcnl0aGluZyBlbHNlIGZhbGxcbiAqIGJhY2sgdG8gc3RydWN0dXJhbCBlcXVhbGl0eS5cbiAqXG4gKiBAZXhhbXBsZVxuICogZGVlcEVxdWFsKHsgYTogMSB9LCB7IGE6IDEgfSk7ICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBkZWVwRXF1YWwoWzEsIDJdLCBbMSwgMl0pOyAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBkZWVwRXF1YWwoYSwgYiwgKHgsIHkpID0+XG4gKiAgIGlzRW50aXR5KHgpICYmIGlzRW50aXR5KHkpID8geC5pZCA9PT0geS5pZCA6IHVuZGVmaW5lZCk7XG4gKi9cbmV4cG9ydCB0eXBlIERlZXBFcXVhbENvbXBhcmF0b3IgPSAoYTogdW5rbm93biwgYjogdW5rbm93bikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChhOiB1bmtub3duLCBiOiB1bmtub3duLCBjb21wYXJhdG9yPzogRGVlcEVxdWFsQ29tcGFyYXRvcik6IGJvb2xlYW4ge1xuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGNvbnN0IGRlY2lkZWQgPSBjb21wYXJhdG9yKGEsIGIpO1xuICAgIGlmIChkZWNpZGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWNpZGVkO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiB8fCBhID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiIHx8IGIgPT09IG51bGwpIHtcbiAgICAvLyBOYU4gaXMgdGhlIG9ubHkgdmFsdWUgbm90IGVxdWFsIHRvIGl0c2VsZiB1bmRlciBgPT09YC5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG5cbiAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd25bXTtcbiAgICBpZiAoYS5sZW5ndGggIT09IGJBcnIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiQXJyW2ldLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgYk1hcCA9IGIgYXMgTWFwPHVua25vd24sIHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJNYXAuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICAgIGlmICghYk1hcC5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFkZWVwRXF1YWwodmFsdWUsIGJNYXAuZ2V0KGtleSksIGNvbXBhcmF0b3IpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBiU2V0ID0gYiBhcyBTZXQ8dW5rbm93bj47XG4gICAgaWYgKGEuc2l6ZSAhPT0gYlNldC5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhKSB7XG4gICAgICBpZiAoIWJTZXQuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gKGIgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICBjb25zdCBiUmUgPSBiIGFzIFJlZ0V4cDtcbiAgICByZXR1cm4gYS5zb3VyY2UgPT09IGJSZS5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYlJlLmZsYWdzO1xuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiAhKGEgaW5zdGFuY2VvZiBEYXRhVmlldykpIHtcbiAgICBjb25zdCBhQXJyID0gYSBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd24gYXMgQXJyYXlMaWtlPG51bWJlcj47XG4gICAgaWYgKGFBcnIubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFBcnJbaV0gIT09IGJBcnJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgYUtleXMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgIWRlZXBFcXVhbChcbiAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgIChiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICBjb21wYXJhdG9yLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
|
|
943
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQTBCSCxzRUFBc0U7QUFDdEUsTUFBTSxVQUFVLFdBQVcsQ0FBYyxLQUFtQjtJQUMxRCxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFjRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQWMsS0FBYztJQUN0RCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLEdBQUcsSUFBSSxLQUFLLFlBQVksR0FBRyxDQUFDO0FBQzlFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQ3JCLFVBQXlELEVBQ3pELE9BQWlDO0lBRWpDLFNBQVMsS0FBSyxDQUFDLEtBQWMsRUFBRSxJQUFtQjtRQUNoRCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDbEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENB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QUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBNEIsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBNEIsQ0FBQyxDQUFDO0lBQ3hELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2hELEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDaEUsSUFDRSxDQUFDLFNBQVMsQ0FDUCxDQUE2QixDQUFDLEdBQUcsQ0FBQyxFQUNsQyxDQUE2QixDQUFDLEdBQUcsQ0FBQyxFQUNuQyxVQUFVLENBQ1gsRUFDRCxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVwZW5kZW5jeS1mcmVlIG9iamVjdCArIGl0ZXJhYmxlIHV0aWxpdGllcy5cbiAqXG4gKiBWYWx1ZSBndWFyZHMgLyBjb2VyY2lvbnMgLyBzaGFwZSB0eXBlczoge0BsaW5rIGlzUmVjb3JkfSBuYXJyb3dzIHBhcnNlZCBKU09OXG4gKiB0byBhIHJlY29yZCwge0BsaW5rIHRvQm9vbGVhbn0gY29lcmNlcyBsb29zZSB0cnV0aHkvZmFsc3kgdmFsdWVzLCB7QGxpbmtcbiAqIHRvRHVyYXRpb259IHBhcnNlcyBgMWgzMG1gIC8gYDIgbWlsbGlzZWNvbmRzYCB0byBtaWxsaXMsIHtAbGluayB0b0RhdGV9XG4gKiBjb2VyY2VzIGEgZGF0ZS9JU08gc3RyaW5nL2Vwb2NoIG51bWJlci9yZWxhdGl2ZSBkdXJhdGlvbiwge0BsaW5rIG9wdGlvbmFsfVxuICogc3ByZWFkcyBhIGZpZWxkIG9ubHkgd2hlbiBpdCBpcyBwcmVzZW50LCB7QGxpbmsgZGVlcEVxdWFsfSBjb21wYXJlc1xuICogc3RydWN0dXJhbGx5LCBhbmQge0BsaW5rIE5hbWVMaWtlfS97QGxpbmsgTm9uRnVuY3Rpb25LZXlzfSBkZXNjcmliZSBvYmplY3RcbiAqIHNoYXBlcy5cbiAqXG4gKiBJdGVyYWJsZSBoZWxwZXJzOiB7QGxpbmsgZ2VuZXJhdG9yfSBmbGF0dGVucyBtaXhlZCBhcmd1bWVudHM7IHtAbGluayBzZXF1ZW5jZX1cbiAqIHdyYXBzIHNvdXJjZShzKSBpbiBhIGxhenksIGBBcnJheWAtY29tcGF0aWJsZSB7QGxpbmsgU2VxdWVuY2V9LiBFdmVyeVxuICogdHJhbnNmb3JtL3Rlcm1pbmFsIGlzIGEgc3RhbmRhbG9uZSBmdW5jdGlvbiBvcGVyYXRpbmcgb24gcGxhaW4ge0BsaW5rXG4gKiBDb250YWluZXJ9cyAoc2VlIHtAbGluayBtYXB9LCB7QGxpbmsgZmlsdGVyfSwge0BsaW5rIGdyb3VwfSwgLi4uKTsgdGhlIHtAbGlua1xuICogU2VxdWVuY2V9IG1ldGhvZHMgYXJlIHRoaW4gZm9yd2FyZGVycyBvdmVyIHRoZW0gc28gdGhlIHNhbWUgbG9naWMgYmFja3MgYm90aFxuICogdGhlIGZyZWUtZnVuY3Rpb24gYW5kIHRoZSBmbHVlbnQvY2hhaW5lZCBzdHlsZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKiBMYXp5IHNlcXVlbmNlIG92ZXIgaXRlcmFibGUgc291cmNlKHMpLiBTZWUge0BsaW5rIHNlcXVlbmNlfS4gKi9cbmV4cG9ydCB0eXBlIFNlcXVlbmNlPFQ+ID0gU2VxdWVuY2VJbXBsPFQ+O1xuXG50eXBlIFNlcXVlbmNlU291cmNlPFQ+ID0gSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPiB8IE9uZU9yTWFueTxUPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBub24tc2NhbGFyIHtAbGluayBJdGVyYWJsZX0gLSBvbmUgdG8gdHJlYXQgYXMgYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzXG4gKiByYXRoZXIgdGhhbiBhIHNjYWxhci4ge0BsaW5rIGlzQ29udGFpbmVyfSBuYXJyb3dzIHRvIHRoaXMsIGV4Y2x1ZGluZyBzdHJpbmdzLFxuICogYFN0cmluZ2AvYFJlZ0V4cGAgb2JqZWN0cywgYW5kIGZ1bmN0aW9ucy4ge0BsaW5rIENvbGxlY3Rpb259IGlzIHRoZSBlYWdlcmx5LVxuICogc2l6ZWQgc3Vic2V0LiBUaGUgZWxlbWVudCBkZWZhdWx0cyB0byBgdW5rbm93bmAgc28gYW55IGBDb2xsZWN0aW9uYCBpc1xuICogYXNzaWduYWJsZSB0byBhIGJhcmUgYENvbnRhaW5lcmAuXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRhaW5lcjxUID0gdW5rbm93bj4gPSBJdGVyYWJsZTxUPjtcblxuLyoqXG4gKiBBIGJ1aWx0LWluLCBlYWdlcmx5LXNpemVkIHtAbGluayBDb250YWluZXJ9OiBhbiB7QGxpbmsgQXJyYXl9LCB7QGxpbmsgU2V0fSwgb3JcbiAqIHtAbGluayBNYXB9ICh3aG9zZSAqdmFsdWVzKiBhcmUgYFRgIC0gYSBNYXAgaXRlcmF0ZXMgYFtrZXksIHZhbHVlXWAgZW50cmllcyxcbiAqIHNvIGl0cyBlbGVtZW50IHR5cGUgZGlmZmVycywgYnV0IGl0cyB2YWx1ZSB0eXBlIGlzIGBUYCkuIEFsbCBzaGFyZSBhIGNoZWFwXG4gKiBlbXB0aW5lc3MgY2hlY2sgKHtAbGluayBpc0VtcHR5fSkuXG4gKi9cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb248VD4gPSBSZWFkb25seUFycmF5PFQ+IHwgUmVhZG9ubHlTZXQ8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPjtcblxuZXhwb3J0IHR5cGUgT25lT3JNYW55PFQ+ID0gW1QsIC4uLlRbXV07XG5cbi8qKiBOYXJyb3cgYSByZWFkb25seSBhcnJheSB0byBhIG5vbi1lbXB0eSB7QGxpbmsgT25lT3JNYW55fSB0dXBsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09uZU9yTWFueTxUID0gdW5rbm93bj4odmFsdWU6IHJlYWRvbmx5IFRbXSk6IHZhbHVlIGlzIE9uZU9yTWFueTxUPiB7XG4gIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwO1xufVxuXG4vKiogQSBzb3VyY2UgYWNjZXB0ZWQgYnkgYSB2YXJpYWRpYyBvcDogYSB7QGxpbmsgQ29udGFpbmVyfSBvZiBgVGAsIG9yIG5vdGhpbmcuICovXG50eXBlIFNvdXJjZTxUPiA9IENvbnRhaW5lcjxUPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRWxlbWVudCB0eXBlIG9mIGEge0BsaW5rIGdyb3VwfSBidWNrZXQgYXJyYXk6IHdoZW4gdGhlIHByZWRpY2F0ZSBgUGAgaXMgYSB0eXBlXG4gKiBndWFyZCAoYHZhbHVlIGlzIFNgKSwgdGhlIGJ1Y2tldCBpcyBuYXJyb3dlZCB0byBgUyAmIFRgOyBvdGhlcndpc2UgaXQgc3RheXMgYFRgLlxuICovXG50eXBlIEdyb3VwVmFsdWU8VCwgUD4gPSBQIGV4dGVuZHMgKHZhbHVlOiBhbnksIC4uLnJlc3Q6IGFueVtdKSA9PiB2YWx1ZSBpcyBpbmZlciBTID8gUyAmIFQgOiBUO1xuXG4vKiogQSBtYXAgb2YgZ3JvdXAgbmFtZSAtPiBwcmVkaWNhdGUsIGFzIGFjY2VwdGVkIGJ5IHtAbGluayBncm91cH0uICovXG50eXBlIEdyb3VwUHJlZGljYXRlczxUPiA9IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbj47XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYSB7QGxpbmsgQ29sbGVjdGlvbn06IGFuIHtAbGluayBBcnJheX0sIHtAbGluayBTZXR9LCBvclxuICoge0BsaW5rIE1hcH0uIE5hcnJvd3MgYHZhbHVlYCBzbyBpdHMgZWxlbWVudC92YWx1ZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYFRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgKG9yIE1hcCB2YWx1ZSkgdHlwZSBhc3NlcnRlZCBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMgYHRydWVgIChuYXJyb3dpbmcgYHZhbHVlYCB0byB7QGxpbmsgQ29sbGVjdGlvbn08YFRgPikgZm9yIGFcbiAqICAgYnVpbHQtaW4gYXJyYXkvc2V0L21hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sbGVjdGlvbjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb2xsZWN0aW9uPFQ+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0IHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwO1xufVxuXG4vKipcbiAqIGB0cnVlYCB3aGVuIGEge0BsaW5rIENvbGxlY3Rpb259IGhhcyBubyBlbGVtZW50cy4gVXNlcyBgbGVuZ3RoYCBmb3IgYXJyYXlzXG4gKiBhbmQgYHNpemVgIGZvciB7QGxpbmsgU2V0fS97QGxpbmsgTWFwfS5cbiAqXG4gKiBAcGFyYW0gY29sbGVjdGlvbiAtIFRoZSBhcnJheSwgc2V0LCBvciBtYXAgdG8gdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb248dW5rbm93bj4gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9LFxuKTogYm9vbGVhbiB7XG4gIGZ1bmN0aW9uIHZpc2l0KHZhbHVlOiB1bmtub3duLCBzZWVuPzogU2V0PHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoc2Vlbj8uaGFzKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgICBzZWVuPy5hZGQodmFsdWUpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPT09IDAgfHwgKHNlZW4gPyB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zaXplID09PSAwIHx8IChzZWVuID8gWy4uLnZhbHVlXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdmFsdWUuc2l6ZSA9PT0gMCB8fFxuICAgICAgICAgIChzZWVuID8gWy4uLnZhbHVlLnZhbHVlcygpXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChzZWVuKSB7XG4gICAgICAgIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+IHZpc2l0KCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSwgc2VlbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB2aXNpdChjb2xsZWN0aW9uLCBvcHRpb25zPy5yZWN1cnNpdmUgPyBuZXcgU2V0KCkgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzb3VyY2UgdG8gYW4gaXRlcmFibGUgb2YgaXRzIGBUYCB2YWx1ZXMsIHNvIE1hcHMgYXJlIHRyZWF0ZWRcbiAqIHVuaWZvcm1seSB3aXRoIGFycmF5cy9zZXRzOiBhIHtAbGluayBNYXB9IHlpZWxkcyBpdHMgKnZhbHVlcyogKG1hdGNoaW5nXG4gKiB7QGxpbmsgQ29sbGVjdGlvbn0ncyB2YWx1ZS10eXBlZCBgVGApLCBhbnkgb3RoZXIgaXRlcmFibGUgeWllbGRzIGl0c2VsZi4gVGhpc1xuICogaXMgd2hhdCB7QGxpbmsgc2VxdWVuY2V9IGNvbnN1bWVzLCBzbyBhIGBNYXBgIGNvbnRyaWJ1dGVzIHZhbHVlcyBldmVyeXdoZXJlXG4gKiByYXRoZXIgdGhhbiBgW2tleSwgdmFsdWVdYCBlbnRyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVzPFQ+KHNvdXJjZTogSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPik6IEl0ZXJhYmxlPFQ+IHtcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIE1hcCA/IHNvdXJjZS52YWx1ZXMoKSA6IChzb3VyY2UgYXMgSXRlcmFibGU8VD4pO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIGEge0BsaW5rIENvbnRhaW5lcn0gLSBhbiBpdGVyYWJsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29sbGVjdGlvblxuICogcmF0aGVyIHRoYW4gYSBzY2FsYXIuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGV4Y2x1ZGVzIHZhbHVlcyB0aGF0IGFyZSB0ZWNobmljYWxseSBpdGVyYWJsZSBidXQgc2hvdWxkIGJlXG4gKiB0cmVhdGVkIGFzIHNjYWxhcnMgaGVyZSAtIHN0cmluZ3MsIGBTdHJpbmdgL2BSZWdFeHBgIG9iamVjdHMsIGFuZCBmdW5jdGlvbnMgLVxuICogc28gYSBsb25lIHN0cmluZyBpcyBuZXZlciBzcHJlYWQgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rlci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgYXNzZXJ0ZWQgZm9yIHRoZSBpdGVyYWJsZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgKG5hcnJvd2luZyBgdmFsdWVgIHRvIHtAbGluayBDb250YWluZXJ9PGBUYD4pIGZvciBhIG5vbi1zdHJpbmdcbiAqICAgaXRlcmFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRhaW5lcjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb250YWluZXI8VD4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiZcbiAgICAhKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSAmJlxuICAgICEodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApICYmXG4gICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgW1N5bWJvbC5pdGVyYXRvcl0/OiB1bmtub3duIH0pW1N5bWJvbC5pdGVyYXRvcl0gPT09IFwiZnVuY3Rpb25cIlxuICApO1xufVxuXG5mdW5jdGlvbiBzZXF1ZW5jZVNvdXJjZXM8VD4oLi4uc291cmNlczogU2VxdWVuY2VTb3VyY2U8VD5bXSk6IEl0ZXJhYmxlPFQ+W10ge1xuICBjb25zdCBzb3VyY2VJdGVyYWJsZXM6IEl0ZXJhYmxlPFQ+W10gPSBbXTtcbiAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fCAoaXNDb2xsZWN0aW9uKHNvdXJjZSkgJiYgaXNFbXB0eShzb3VyY2UpKSkgY29udGludWU7XG4gICAgc291cmNlSXRlcmFibGVzLnB1c2godmFsdWVzKHNvdXJjZSkpO1xuICB9XG4gIHJldHVybiBzb3VyY2VJdGVyYWJsZXM7XG59XG5cbi8qKlxuICogRmxhdHRlbnMgbmVzdGVkIGFycmF5cyBmb3Ige0BsaW5rIGZsYXR9LiBOb24tYXJyYXkgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIGFcbiAqIHNpbmdsZS1lbGVtZW50IGl0ZXJhYmxlOyBkZXB0aCBkZWNyZW1lbnRzIHBlciBhcnJheSBsZXZlbC5cbiAqL1xuZnVuY3Rpb24gZmxhdHRlblZhbHVlKHZhbHVlOiB1bmtub3duLCBkZXB0aDogbnVtYmVyKTogSXRlcmFibGU8dW5rbm93bj4ge1xuICBpZiAoZGVwdGggPiAwICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgbmV4dERlcHRoID0gTnVtYmVyLmlzRmluaXRlKGRlcHRoKSA/IGRlcHRoIC0gMSA6IGRlcHRoO1xuICAgIHJldHVybiB7XG4gICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkgeWllbGQqIGZsYXR0ZW5WYWx1ZShpdGVtLCBuZXh0RGVwdGgpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBbdmFsdWVdO1xufVxuXG4vKiogV3JhcCBhIHBlci1lbGVtZW50IHRyYW5zZm9ybSAoZWFjaCBlbGVtZW50IC0+IGFuIGl0ZXJhYmxlKSBhcyBhIGxhenkge0BsaW5rIFNlcXVlbmNlfS4gKi9cbmZ1bmN0aW9uIGRlcml2ZTxULCBVPihcbiAgc291cmNlOiBJdGVyYWJsZTxUPixcbiAgZm46ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gSXRlcmFibGU8VT4sXG4pOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc291cmNlKSB5aWVsZCogZm4odmFsdWUsIGluZGV4KyspO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKiogTGlrZSB7QGxpbmsgZGVyaXZlfSwgYnV0IHlpZWxkcyBvbmUgdmFsdWUgcGVyIHNvdXJjZSBlbGVtZW50IChubyB3cmFwcGVyIGl0ZXJhYmxlKS4gKi9cbmZ1bmN0aW9uIGRlcml2ZU9uZTxULCBVPihzb3VyY2U6IEl0ZXJhYmxlPFQ+LCBmbjogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNvdXJjZSkgeWllbGQgZm4odmFsdWUsIGluZGV4KyspO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUubWFwYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGNvbnRhaW5lciB0byBtYXAgKG51bGxpc2ggeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlKS5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIENhbGxlZCBwZXIgZWxlbWVudCB3aXRoIGl0cyBpbmRleDsgaXRzIHJlc3VsdCBpcyBlbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwPFQsIFU+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSxcbik6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIGRlcml2ZU9uZShzZXF1ZW5jZShzb3VyY2UpLCBjYWxsYmFjayk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maWx0ZXJgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQSB0eXBlLWd1YXJkIHByZWRpY2F0ZSBuYXJyb3dzIHRoZSByZXN1bHRpbmcgZWxlbWVudCB0eXBlLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY29udGFpbmVyIHRvIGZpbHRlciAobnVsbGlzaCB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UpLlxuICogQHBhcmFtIHByZWRpY2F0ZSAtIEtlZXBzIGVsZW1lbnRzIGZvciB3aGljaCBpdCByZXR1cm5zIGB0cnVlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcjxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IFNlcXVlbmNlPFM+O1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcjxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogU2VxdWVuY2U8VD47XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBTZXF1ZW5jZTxUPiB7XG4gIHJldHVybiBkZXJpdmUoc2VxdWVuY2Uoc291cmNlKSwgZnVuY3Rpb24qICh2YWx1ZSwgaW5kZXgpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCkpIHlpZWxkIHZhbHVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZXMgdGhlIHNvdXJjZXMgYW5kIHlpZWxkcyBvbmx5IGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBgbnVsbGAgb3JcbiAqIGB1bmRlZmluZWRgLCBuYXJyb3dpbmcgdGhlIGVsZW1lbnQgdHlwZSB0byB7QGxpbmsgTm9uTnVsbGFibGV9PGBUYD4uXG4gKlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9uTnVsbDxUPiguLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPE5vbk51bGxhYmxlPFQ+PiB7XG4gIHJldHVybiBmaWx0ZXIoc2VxdWVuY2UoLi4uc291cmNlcyksICh2YWx1ZSk6IHZhbHVlIGlzIE5vbk51bGxhYmxlPFQ+ID0+IHZhbHVlICE9IG51bGwpO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmxhdE1hcGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjb250YWluZXIgdG8gbWFwIChudWxsaXNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSkuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBSZXR1cm5zIGEgdmFsdWUgb3IgYXJyYXkgb2YgdmFsdWVzLCBmbGF0dGVuZWQgb25lIGxldmVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdE1hcDxULCBVPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUgfCBSZWFkb25seUFycmF5PFU+LFxuKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gZGVyaXZlKHNlcXVlbmNlKHNvdXJjZSksIGZ1bmN0aW9uKiAodmFsdWUsIGluZGV4KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2sodmFsdWUsIGluZGV4KTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB5aWVsZCogcmVzdWx0O1xuICAgIGVsc2UgeWllbGQgcmVzdWx0IGFzIFU7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmxhdGAgKGFycmF5cyBvbmx5KS4gYGRlcHRoYCBsZWFkcyBzbyB0aGVcbiAqIHNvdXJjZXMgY2FuIHN0YXkgdmFyaWFkaWM7IHVzZSBgZGVwdGggPCAxYCBmb3IgYSBuby1vcCBwYXNzdGhyb3VnaC5cbiAqXG4gKiBAcGFyYW0gZGVwdGggLSBIb3cgbWFueSBhcnJheSBsZXZlbHMgdG8gZmxhdHRlbi5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSwgdGhlbiBmbGF0dGVuIChudWxsaXNoIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdDxUPihkZXB0aDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIGlmIChkZXB0aCA8IDEpIHJldHVybiBzcmM7XG4gIHJldHVybiBkZXJpdmUoc3JjLCAodmFsdWUpID0+IGZsYXR0ZW5WYWx1ZSh2YWx1ZSwgZGVwdGgpKSBhcyBTZXF1ZW5jZTxUPjtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZXMgdGhlIHNvdXJjZXMsIHRoZW4gbGF6aWx5IHlpZWxkcyB2YWx1ZXMgaW4gZW5jb3VudGVyIG9yZGVyLFxuICogc2tpcHBpbmcgYSB2YWx1ZSBvbmx5IHdoZW4gYW4gZXF1YWwgb25lIHdhcyBhbHJlYWR5IHlpZWxkZWQgKGBTZXRgIC9cbiAqIFNhbWVWYWx1ZVplcm8pLiBVbmlxdWVuZXNzIGlzIGNoZWNrZWQgcGVyIGVsZW1lbnQgYXMgaXQgaXMgY29uc3VtZWQuXG4gKlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdGluY3Q8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKC4uLnNvdXJjZXMpO1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PFQ+KCk7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNyYykge1xuICAgICAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSBjb250aW51ZTtcbiAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBZaWVsZHMgYHNvdXJjZWAsIHRoZW4gZWFjaCBhcHBlbmRlZCBgaXRlbWAgaW4gb3JkZXIgKGFycmF5cyBzcHJlYWQgb25lIGxldmVsKSxcbiAqIG1pcnJvcmluZyBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAuIGBpdGVtc2AgYXJlIHNjYWxhciB2YWx1ZXMvYXJyYXlzLCBub3RcbiAqIGNvbnRhaW5lcnMsIHNvIGBzb3VyY2VgIHN0YXlzIGEgc2luZ2xlIGxlYWRpbmcgYXJndW1lbnQuXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBsZWFkaW5nIGNvbnRhaW5lciAobnVsbGlzaCB5aWVsZHMganVzdCB0aGUgaXRlbXMpLlxuICogQHBhcmFtIGl0ZW1zIC0gVmFsdWVzIChvciBhcnJheXMgb2YgdmFsdWVzKSBhcHBlbmRlZCBhZnRlciB0aGUgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgUmVhZG9ubHlBcnJheTxUPilbXVxuKTogU2VxdWVuY2U8VD4ge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZShzb3VyY2UpO1xuICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm4gc3JjO1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIHlpZWxkKiBzcmM7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHlpZWxkKiBpdGVtO1xuICAgICAgICBlbHNlIHlpZWxkIGl0ZW0gYXMgVDtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBZaWVsZHMgYXQgbW9zdCBgY291bnRgIGVsZW1lbnRzIGZyb20gdGhlIGZyb250IG9mIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcy5cbiAqIGBjb3VudGAgbGVhZHMgc28gdGhlIHNvdXJjZXMgY2FuIHN0YXkgdmFyaWFkaWMuXG4gKlxuICogQHBhcmFtIGNvdW50IC0gTWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8geWllbGQgKGA8PSAwYCB5aWVsZHMgbm9uZSkuXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWtlPFQ+KGNvdW50OiBudW1iZXIsIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICBpZiAoY291bnQgPD0gMCkgcmV0dXJuIGVtcHR5U2VxdWVuY2UgYXMgU2VxdWVuY2U8VD47XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKC4uLnNvdXJjZXMpO1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGxldCB0YWtlbiA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNyYykge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgICAgaWYgKCsrdGFrZW4gPj0gY291bnQpIHJldHVybjtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzIGludG8gb25lIGFycmF5IHBlciBuYW1lZCBwcmVkaWNhdGUuIENvbnN1bWVzXG4gKiB0aGUgaW5wdXQgb25jZSwgcm91dGluZyBlYWNoIGVsZW1lbnQgdG8gdGhlIEZJUlNUIHByZWRpY2F0ZSBpdCBzYXRpc2ZpZXMgKHNvXG4gKiBncm91cHMgYXJlIGRpc2pvaW50KTsgZWxlbWVudHMgbWF0Y2hpbmcgbm8gcHJlZGljYXRlIGFyZSBkcm9wcGVkLiBUeXBlLWd1YXJkXG4gKiBwcmVkaWNhdGVzIG5hcnJvdyB0aGVpciBncm91cCdzIGVsZW1lbnQgdHlwZSAoc2VlIHtAbGluayBHcm91cFZhbHVlfSkuXG4gKiBgcHJlZGljYXRlc2AgbGVhZHMgc28gdGhlIHNvdXJjZXMgY2FuIHN0YXkgdmFyaWFkaWMuXG4gKlxuICogQHR5cGVQYXJhbSBHIC0gVGhlIG1hcCBvZiBncm91cCBuYW1lIC0+IHByZWRpY2F0ZS5cbiAqIEBwYXJhbSBwcmVkaWNhdGVzIC0gTmFtZWQgcHJlZGljYXRlczsgZXZhbHVhdGVkIGluIGRlY2xhcmF0aW9uIG9yZGVyLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cywgZWFjaCBhbiBhcnJheSBvZiBpdHMgZ3JvdXAncyBlbGVtZW50cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBjb25zdCB7IHN0cmluZ3MsIGZucyB9ID0gZ3JvdXAoeyBzdHJpbmdzOiBpc1N0cmluZywgZm5zOiBpc0Z1bmN0aW9uIH0sIHhzKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwPFQsIEcgZXh0ZW5kcyBHcm91cFByZWRpY2F0ZXM8VD4+KFxuICBwcmVkaWNhdGVzOiBHLFxuICAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXVxuKTogeyBbSyBpbiBrZXlvZiBHXTogR3JvdXBWYWx1ZTxULCBHW0tdPltdIH0ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJlZGljYXRlcykgYXMgKGtleW9mIEcpW107XG4gIGNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPGtleW9mIEcsIFRbXT4oa2V5cy5tYXAoKGtleSkgPT4gW2tleSwgW11dKSk7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2UoLi4uc291cmNlcykpIHtcbiAgICBjb25zdCBpID0gaW5kZXgrKztcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAocHJlZGljYXRlc1trZXldISh2YWx1ZSwgaSkpIHtcbiAgICAgICAgYnVja2V0cy5nZXQoa2V5KSEucHVzaCh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCByZXN1bHQgPSB7fSBhcyB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIHJlc3VsdFtrZXldID0gYnVja2V0cy5nZXQoa2V5KSEgYXMgR3JvdXBWYWx1ZTxULCBHW3R5cGVvZiBrZXldPltdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maW5kYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIGVsZW1lbnRzIHVudGlsIGEgbWF0Y2guIEEgdHlwZSBndWFyZCBuYXJyb3dzIHRoZSByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmQ8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBTIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmQ8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIHRoZSBmdWxsIHNvdXJjZS4gQSB0eXBlIGd1YXJkIG5hcnJvd3MgdGhlIHJldHVybiB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBTIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IG1hdGNoOiBUIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgbWF0Y2ggPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gbWF0Y2g7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgZWxlbWVudHMgdW50aWwgYSBtYXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRJbmRleDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSByZXR1cm4gaW5kZXg7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maW5kTGFzdEluZGV4YCwgb3ZlciBhIHNpbmdsZVxuICoge0BsaW5rIENvbnRhaW5lcn0uIENvbnN1bWVzIHRoZSBmdWxsIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXg8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBtYXRjaCA9IC0xO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCkpIG1hdGNoID0gaW5kZXg7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gbWF0Y2g7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5zb21lYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIFNob3J0LWNpcmN1aXRzIG9uIHRoZSBmaXJzdCBtYXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvbWU8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogU2hvcnQtY2lyY3VpdHMgb24gdGhlIGZpcnN0IGZhaWx1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVyeTxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IGJvb2xlYW47XG5leHBvcnQgZnVuY3Rpb24gZXZlcnk8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IGJvb2xlYW47XG5leHBvcnQgZnVuY3Rpb24gZXZlcnk8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIGlmICghcHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgdGhlIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2g8VD4oc291cmNlOiBTb3VyY2U8VD4sIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgrKyk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5hdGAgb3ZlciB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMuXG4gKiBOb24tbmVnYXRpdmUgaW5kaWNlcyBzY2FuIGxhemlseTsgbmVnYXRpdmUgaW5kaWNlcyBtYXRlcmlhbGl6ZSBmaXJzdC4gYGluZGV4YFxuICogbGVhZHMgc28gdGhlIHNvdXJjZXMgY2FuIHN0YXkgdmFyaWFkaWMuXG4gKlxuICogQHBhcmFtIGluZGV4IC0gWmVyby1iYXNlZCBwb3NpdGlvbjsgbmVnYXRpdmUgY291bnRzIGZyb20gdGhlIGVuZC5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0PFQ+KGluZGV4OiBudW1iZXIsIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKC4uLnNvdXJjZXMpO1xuICBpZiAoaW5kZXggPCAwKSByZXR1cm4gdG9BcnJheShzcmMpLmF0KGluZGV4KTtcbiAgbGV0IGkgPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNyYykge1xuICAgIGlmIChpKysgPT09IGluZGV4KSByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvT25lT3JNYW55PFQ+KGlucHV0OiBUIHwgT25lT3JNYW55PFQ+KTogT25lT3JNYW55PFQ+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpID8gaW5wdXQgOiBbaW5wdXRdO1xufVxuXG4vKipcbiAqIE1hdGVyaWFsaXplcyB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMgaW50byBhIG5ldyBhcnJheS4gQ29uc3VtZXMgc2luZ2xlLXBhc3NcbiAqIHNvdXJjZXMuXG4gKlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheTxUPiguLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IHJlYWRvbmx5IFRbXSB7XG4gIHJldHVybiBbLi4uc2VxdWVuY2UoLi4uc291cmNlcyldO1xufVxuXG4vKipcbiAqIExhenkgaXRlcmFibGUgc2VxdWVuY2Ugd2l0aCBgQXJyYXlgLWNvbXBhdGlibGUgdHJhbnNmb3JtcyBhbmQgdGVybWluYWxcbiAqIG1ldGhvZHMuIFNpbmdsZS1wYXNzIGJ5IGRlZmF1bHQ7IGNhbGwge0BsaW5rIFNlcXVlbmNlSW1wbC5jYWNoZX0gdG8gcmV0YWluXG4gKiBwdWxsZWQgdmFsdWVzIGZvciByZS1pdGVyYXRpb24uIEJ1aWx0IGZvciBnZW5lcmF0b3JzIGFuZCBvdGhlciBzb3VyY2VzIHdoZXJlXG4gKiBhIHNlY29uZCBwYXNzIGlzIG5vdCBndWFyYW50ZWVkLlxuICpcbiAqIFRoZSBtZXRob2RzIGZvcndhcmQgdG8gdGhlIHN0YW5kYWxvbmUgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgLSBzZWUgZWFjaFxuICogbWV0aG9kJ3MgYEBzZWVgIC0gc28gdGhlIGZyZWUtZnVuY3Rpb24gYW5kIGNoYWluZWQgc3R5bGVzIHNoYXJlIG9uZSBpbXBsLlxuICovXG5jbGFzcyBTZXF1ZW5jZUltcGw8VD4ge1xuICBwcml2YXRlIGl0ZXJhdG9yPzogSXRlcmF0b3I8VD47XG4gIHByaXZhdGUgZXhoYXVzdGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc291cmNlOiBJdGVyYWJsZTxUPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ1ZmZlcjogVFtdIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiB7IHJlYWRvbmx5IGV4aGF1c3RlZD86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLmV4aGF1c3RlZCA9IHN0YXRlLmV4aGF1c3RlZCA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNhY2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQWR2YW5jZSB0aGUgdW5kZXJseWluZyBzb3VyY2Ugb25jZSwgY3JlYXRpbmcgdGhlIGl0ZXJhdG9yIG9uIGZpcnN0IHVzZS4gKi9cbiAgcHJpdmF0ZSBwdWxsKCk6IEl0ZXJhdG9yUmVzdWx0PFQ+IHtcbiAgICB0aGlzLml0ZXJhdG9yID8/PSB0aGlzLnNvdXJjZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpO1xuICB9XG5cbiAgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFQ+IHtcbiAgICBpZiAoIXRoaXMuY2FjaGluZykge1xuICAgICAgaWYgKHRoaXMuZXhoYXVzdGVkKSByZXR1cm47XG4gICAgICBmb3IgKGxldCBuZXh0ID0gdGhpcy5wdWxsKCk7ICFuZXh0LmRvbmU7IG5leHQgPSB0aGlzLnB1bGwoKSkge1xuICAgICAgICB5aWVsZCBuZXh0LnZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy5leGhhdXN0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYWNoZWQ6IGl0ZXJhdGUgbGlrZSBhIGxpc3QuIEFsd2F5cyByZXBsYXkgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdGFydCxcbiAgICAgIC8vIGV4dGVuZGluZyBpdCBmcm9tIHRoZSBzb3VyY2Ugb24gZGVtYW5kIHVudGlsIGV4aGF1c3RlZC4gQSBicm9rZW4gbG9vcFxuICAgICAgLy8gbGVhdmVzIHRoZSBidWZmZXIgaW50YWN0LCBzbyB0aGUgbmV4dCBpdGVyYXRpb24gc3RhcnRzIG92ZXIgZnJvbSB0aGVcbiAgICAgIC8vIGJlZ2lubmluZy5cbiAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyITtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChpbmRleCA8IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICB5aWVsZCBidWZmZXJbaW5kZXgrK10hO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmV4aGF1c3RlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5wdWxsKCk7XG4gICAgICAgIGlmIChuZXh0LmRvbmUpIHtcbiAgICAgICAgICB0aGlzLmV4aGF1c3RlZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlci5wdXNoKG5leHQudmFsdWUpO1xuICAgICAgICB5aWVsZCBuZXh0LnZhbHVlO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBtYXB9ICovXG4gIG1hcDxVPihjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVKTogU2VxdWVuY2U8VT4ge1xuICAgIHJldHVybiBtYXAodGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbHRlcn0gKi9cbiAgZmlsdGVyPFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFNlcXVlbmNlPFM+O1xuICBmaWx0ZXIocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBTZXF1ZW5jZTxUPjtcbiAgZmlsdGVyKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiBmaWx0ZXIodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBub25OdWxsfSAqL1xuICBub25OdWxsKCk6IFNlcXVlbmNlPE5vbk51bGxhYmxlPFQ+PiB7XG4gICAgcmV0dXJuIG5vbk51bGwodGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmxhdE1hcH0gKi9cbiAgZmxhdE1hcDxVPihjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVIHwgUmVhZG9ubHlBcnJheTxVPik6IFNlcXVlbmNlPFU+IHtcbiAgICByZXR1cm4gZmxhdE1hcCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmxhdH0gKi9cbiAgZmxhdChkZXB0aCA9IDEpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGZsYXQoZGVwdGgsIHRoaXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGRpc3RpbmN0fSAqL1xuICBkaXN0aW5jdCgpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGRpc3RpbmN0KHRoaXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGNvbmNhdH0gKi9cbiAgY29uY2F0KC4uLml0ZW1zOiByZWFkb25seSAoVCB8IFJlYWRvbmx5QXJyYXk8VD4pW10pOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGNvbmNhdCh0aGlzLCAuLi5pdGVtcyk7XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IHlpZWxkcyB0aGlzIHNlcXVlbmNlIGZvbGxvd2VkIGJ5IGVhY2ggaXRlcmFibGUgYHNvdXJjZWAgaW4gb3JkZXIuXG4gICAqIExpa2Uge0BsaW5rIGNvbmNhdH0sIGJ1dCBmb3IgaXRlcmFibGUgc291cmNlcyAoZ2VuZXJhdG9ycywgb3RoZXIgc2VxdWVuY2VzLFxuICAgKiBgU2V0YCwgYE1hcGAsIGV0Yy4pIHJhdGhlciB0aGFuIHNjYWxhciB2YWx1ZXMgb3IgYXJyYXlzLiBBIHtAbGluayBNYXB9XG4gICAqIHNvdXJjZSBjb250cmlidXRlcyBpdHMgdmFsdWVzLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBzZXF1ZW5jZX1cbiAgICovXG4gIGpvaW4oLi4uc291cmNlczogcmVhZG9ubHkgU2VxdWVuY2VTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgICBjb25zdCBzb3VyY2VJdGVyYWJsZXMgPSBzZXF1ZW5jZVNvdXJjZXModGhpcywgLi4uc291cmNlcyk7XG4gICAgcmV0dXJuIHNlcXVlbmNlU291cmNlcy5sZW5ndGggPT09IDAgPyB0aGlzIDogc2VxdWVuY2UoLi4uc291cmNlSXRlcmFibGVzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayB0YWtlfSAqL1xuICB0YWtlKGNvdW50OiBudW1iZXIpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIHRha2UoY291bnQsIHRoaXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGdyb3VwfSAqL1xuICBncm91cDxHIGV4dGVuZHMgR3JvdXBQcmVkaWNhdGVzPFQ+PihwcmVkaWNhdGVzOiBHKTogeyBbSyBpbiBrZXlvZiBHXTogR3JvdXBWYWx1ZTxULCBHW0tdPltdIH0ge1xuICAgIHJldHVybiBncm91cChwcmVkaWNhdGVzLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY2FjaGVkLCByZS1pdGVyYWJsZSB2aWV3IG9mIHRoaXMgc2VxdWVuY2UuIEFuIGFscmVhZHktY2FjaGluZ1xuICAgKiBzZXF1ZW5jZSByZXR1cm5zIGl0c2VsZjsgb3RoZXJ3aXNlIHRoaXMgb25lLXBhc3Mgc2VxdWVuY2UgaXMgd3JhcHBlZCBpbiBhXG4gICAqIG5ldyBpbnN0YW5jZSB0aGF0IHJldGFpbnMgcHVsbGVkIHZhbHVlcy4gSXRlcmF0ZSB0aGUgcmV0dXJuZWQgaW5zdGFuY2UsIG5vdFxuICAgKiB0aGUgb3JpZ2luYWwsIHRvIGF2b2lkIGNvbXBldGluZyBmb3IgdGhlIHNhbWUgc2luZ2xlLXBhc3Mgc291cmNlLlxuICAgKi9cbiAgY2FjaGUoKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiB0aGlzLmNhY2hpbmcgPyB0aGlzIDogbmV3IFNlcXVlbmNlSW1wbCh0aGlzLCBbXSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZH0gKi9cbiAgZmluZDxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiBTIHwgdW5kZWZpbmVkO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZDtcbiAgZmluZChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmaW5kKHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZExhc3R9ICovXG4gIGZpbmRMYXN0PFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFMgfCB1bmRlZmluZWQ7XG4gIGZpbmRMYXN0KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZDtcbiAgZmluZExhc3QocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZmluZExhc3QodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kSW5kZXh9ICovXG4gIGZpbmRJbmRleChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGZpbmRJbmRleCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRMYXN0SW5kZXh9ICovXG4gIGZpbmRMYXN0SW5kZXgocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBmaW5kTGFzdEluZGV4KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgc29tZX0gKi9cbiAgc29tZShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzb21lKHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZXZlcnl9ICh0aGUgYFMgZXh0ZW5kcyBUYCBvdmVybG9hZCBuYXJyb3dzIGF0IGNvbXBpbGUgdGltZSBvbmx5KS4gKi9cbiAgZXZlcnk8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogdGhpcyBpcyBTZXF1ZW5jZTxTPjtcbiAgZXZlcnkocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuO1xuICBldmVyeShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmVyeSh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZvckVhY2h9ICovXG4gIGZvckVhY2goY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGZvckVhY2godGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGF0fSAqL1xuICBhdChpbmRleDogbnVtYmVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGF0KGluZGV4LCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRlcmlhbGl6ZSB0aGUgc2VxdWVuY2UgaW50byBhIG5ldyBhcnJheS4gQ29uc3VtZXMgYSBzaW5nbGUtcGFzcyBzb3VyY2U7IGFcbiAgICogY2FjaGVkLCBleGhhdXN0ZWQgc2VxdWVuY2UgY29waWVzIGl0cyBidWZmZXIgZGlyZWN0bHkuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHRvQXJyYXl9XG4gICAqL1xuICB0b0FycmF5KCk6IHJlYWRvbmx5IFRbXSB7XG4gICAgaWYgKHRoaXMuY2FjaGluZyAmJiB0aGlzLmV4aGF1c3RlZCkgcmV0dXJuIFsuLi50aGlzLmJ1ZmZlciFdO1xuICAgIHJldHVybiB0b0FycmF5KHRoaXMpO1xuICB9XG59XG5cbi8qKiBTaGFyZWQgZW1wdHkgc2VxdWVuY2Ugc2luZ2xldG9uLCByZXVzYWJsZSBmb3IgYW55IGVsZW1lbnQgdHlwZS4gKi9cbmNvbnN0IGVtcHR5U2VxdWVuY2U6IFNlcXVlbmNlPG5ldmVyPiA9IG5ldyBTZXF1ZW5jZUltcGwoW10sIHVuZGVmaW5lZCwge1xuICBleGhhdXN0ZWQ6IHRydWUsXG59KTtcblxuLyoqXG4gKiBXcmFwIG9uZSBvciBtb3JlIGl0ZXJhYmxlIGBzb3VyY2VzYCBpbiBhIHNpbmdsZSBsYXp5IHtAbGluayBTZXF1ZW5jZX0sXG4gKiBpdGVyYXRlZCBpbiBvcmRlci4gYG51bGxgL2B1bmRlZmluZWRgIHNvdXJjZXMgYXJlIHNraXBwZWQ7IHdoZW4gbm90aGluZ1xuICogcmVtYWlucyAoZXZlcnkgc291cmNlIG9taXR0ZWQsIGBudWxsYCwgYHVuZGVmaW5lZGAsIG9yIGFuIGVtcHR5IGFycmF5IC9cbiAqIGBTZXRgIC8gYE1hcGApLCB7QGxpbmsgZW1wdHlTZXF1ZW5jZX0gaXMgcmV0dXJuZWQuIFRoZSByZXN1bHQgaXMgc2luZ2xlLXBhc3NcbiAqIC0gY2FsbCBgLmNhY2hlKClgIHRvIG1ha2UgaXQgcmUtaXRlcmFibGUuXG4gKlxuICogQSB7QGxpbmsgTWFwfSBzb3VyY2UgY29udHJpYnV0ZXMgaXRzIHZhbHVlcyAoc2VlIHtAbGluayB2YWx1ZXN9KSwgY29uc2lzdGVudFxuICogd2l0aCB7QGxpbmsgQ29sbGVjdGlvbn0ncyB2YWx1ZS10eXBlZCBgVGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCB0eXBlIG9mIHRoZSBzZXF1ZW5jZS5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gSXRlcmFibGVzIHRvIGNvbmNhdGVuYXRlLCBpbiBvcmRlciAoYE1hcGAgc291cmNlcyB1c2UgdmFsdWVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlPFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNlcXVlbmNlU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIC8vIFNraXAgbnVsbGlzaCBzb3VyY2VzIGFuZCBrbm93bi1lbXB0eSBjb2xsZWN0aW9uczsgbm9ybWFsaXplIHRoZSByZXN0IHRvXG4gIC8vIHRoZWlyIHZhbHVlcyBzbyBhIE1hcCBjb250cmlidXRlcyB2YWx1ZXMgcmF0aGVyIHRoYW4gW2tleSwgdmFsdWVdIGVudHJpZXMuXG4gIGNvbnN0IHNvdXJjZUl0ZXJhYmxlcyA9IHNlcXVlbmNlU291cmNlcyguLi5zb3VyY2VzKTtcbiAgaWYgKHNvdXJjZUl0ZXJhYmxlcy5sZW5ndGggPT09IDApIHJldHVybiBlbXB0eVNlcXVlbmNlIGFzIFNlcXVlbmNlPFQ+O1xuICAvLyBSZXVzZSBhbiBleGlzdGluZyBzZXF1ZW5jZSBhcy1pcyByYXRoZXIgdGhhbiByZS13cmFwcGluZyBpdC5cbiAgaWYgKHNvdXJjZUl0ZXJhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCBvbmx5ID0gc291cmNlSXRlcmFibGVzWzBdITtcbiAgICByZXR1cm4gb25seSBpbnN0YW5jZW9mIFNlcXVlbmNlSW1wbCA/IChvbmx5IGFzIFNlcXVlbmNlPFQ+KSA6IG5ldyBTZXF1ZW5jZUltcGwob25seSwgdW5kZWZpbmVkKTtcbiAgfVxuICByZXR1cm4gbmV3IFNlcXVlbmNlSW1wbChcbiAgICB7XG4gICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZUl0ZXJhYmxlcykgeWllbGQqIHNvdXJjZTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB1bmRlZmluZWQsXG4gICk7XG59XG5cbi8qKlxuICogRmxhdHRlbnMgYSBtaXggb2Ygc2luZ2xlIGl0ZW1zIGFuZCBpdGVyYWJsZXMgaW50byBvbmUgbGF6eSB7QGxpbmsgR2VuZXJhdG9yfS5cbiAqXG4gKiBBcmd1bWVudHMgYXJlIGVtaXR0ZWQgaW4gb3JkZXI6IGBudWxsYC9gdW5kZWZpbmVkYCBhcmUgc2tpcHBlZCwgbm9uLXN0cmluZ1xuICogaXRlcmFibGVzIChwZXIge0BsaW5rIGlzQ29udGFpbmVyfSkgYXJlIHlpZWxkZWQgZWxlbWVudC1ieS1lbGVtZW50LCBhbmRcbiAqIGFueXRoaW5nIGVsc2UgKGluY2x1ZGluZyBzdHJpbmdzKSBpcyB5aWVsZGVkIGFzIGEgc2luZ2xlIGl0ZW0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCB0eXBlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IuXG4gKiBAcGFyYW0gaXRlbXMgLSBJdGVtcyBhbmQvb3IgaXRlcmFibGVzIHRvIGZsYXR0ZW4sIGluIG9yZGVyLlxuICogQHJldHVybnMgQSBnZW5lcmF0b3Igb3ZlciB0aGUgZmxhdHRlbmVkIGVsZW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGdlbmVyYXRvcjxUPihcbiAgLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgSXRlcmFibGU8VD4gfCBudWxsIHwgdW5kZWZpbmVkKVtdXG4pOiBHZW5lcmF0b3I8VD4ge1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBpZiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoaXNDb250YWluZXIoaXRlbSkpIHtcbiAgICAgIHlpZWxkKiBpdGVtO1xuICAgIH0gZWxzZSB7XG4gICAgICB5aWVsZCBpdGVtO1xuICAgIH1cbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE9iamVjdCB2YWx1ZSBndWFyZHMsIGNvZXJjaW9ucywgYW5kIHN0cnVjdHVyYWwgZXF1YWxpdHlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTWluaW1hbCBzaGFwZSBmb3Igb2JqZWN0cyB0aGF0IGV4cG9zZSBhbiBvcHRpb25hbCBgbmFtZWAgKGUuZy4gQXBwS2l0IHBsdWdpbnMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYW1lTGlrZSB7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE5vbkZ1bmN0aW9uS2V5czxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IG5ldmVyIDogSztcbn1ba2V5b2YgVF07XG5cbi8qKlxuICogTmFycm93IGB2YWx1ZWAgdG8gYSBwbGFpbiAobm9uLWFycmF5KSBvYmplY3QuIFVzZSBhcyBhIHR5cGUgZ3VhcmRcbiAqIGJlZm9yZSBpbmRleGluZyBpbnRvIC8gbXV0YXRpbmcgcGFyc2VkIEpTT04gc28gdGhlIGFjY2VzcyBpc1xuICogdHlwZS1zYWZlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpZiAoaXNSZWNvcmQocGFyc2VkKSkgcGFyc2VkLmZvbyA9IDE7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbi8qKlxuICogYHsgW2tleV06IHZhbHVlIH1gIHdoZW4gYHZhbHVlYCBpcyBwcmVzZW50LCBvdGhlcndpc2UgYHVuZGVmaW5lZGAgLSBzbyBhblxuICogYWJzZW50IG9wdGlvbmFsIGZpZWxkIHN0YXlzIEFCU0VOVCB3aGVuIHNwcmVhZCwgcmF0aGVyIHRoYW4gYmVjb21pbmcgYW5cbiAqIGV4cGxpY2l0IGB1bmRlZmluZWRgIHRoYXQgYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYCByZWplY3RzLlxuICpcbiAqIFNwZWxsaW5nIHRoYXQgaW5saW5lIGNvc3RzIGEgcmVwZWF0ZWQsIGRvdWJsZS1ldmFsdWF0ZWQgdGVybmFyeSBwZXIgZmllbGRcbiAqIChgLi4uKHYgPyB7IGtleTogdiB9IDoge30pYCksIHdoaWNoIGlzIGhvdyBjb25maWcgcmVzb2x2ZXJzIGVuZCB1cCBjb21wdXRpbmdcbiAqIHRoZSBzYW1lIHZhbHVlIHR3aWNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiByZXR1cm4ge1xuICogICAuLi5vcHRpb25hbChcImFwcElkXCIsIGVudi50ZXh0KFwiTUlDUk9TT0ZUX0FQUF9JRFwiKSksXG4gKiAgIC4uLm9wdGlvbmFsKFwiZW5kcG9pbnRcIiwgY29uZmlnLmVuZHBvaW50KSxcbiAqIH07XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbDxLIGV4dGVuZHMgc3RyaW5nLCBWPihcbiAga2V5OiBLLFxuICB2YWx1ZTogViB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8SywgVj4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICh7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxLLCBWPik7XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgYm9vbGVhbi1pc2ggdmFsdWUgdG8gYSByZWFsIGBib29sZWFuYCwgb3IgYHVuZGVmaW5lZGBcbiAqIHdoZW4gaXQgY2FuJ3QgYmUgaW50ZXJwcmV0ZWQuIFJlY29nbml6ZXMgYHRydWVgL2B0YC9gb25gL2AxYC9geWVzYC9geWBcbiAqIGFuZCB0aGVpciBuZWdhdGl2ZXMgKGNhc2UtIGFuZCB3aGl0ZXNwYWNlLWluc2Vuc2l0aXZlIGZvciBzdHJpbmdzKSwgYXNcbiAqIHdlbGwgYXMgdGhlIG51bWJlcnMgYDFgIGFuZCBgMGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PT0gXCJ0cnVlXCIgfHxcbiAgICAgIHZhbHVlID09IFwidFwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJvblwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCIxXCIgfHxcbiAgICAgIHZhbHVlID09PSBcInllc1wiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJ5XCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB2YWx1ZSA9PT0gXCJmYWxzZVwiIHx8XG4gICAgICB2YWx1ZSA9PSBcImZcIiB8fFxuICAgICAgdmFsdWUgPT09IFwib2ZmXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIjBcIiB8fFxuICAgICAgdmFsdWUgPT09IFwibm9cIiB8fFxuICAgICAgdmFsdWUgPT09IFwiblwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmICh2YWx1ZSA9PT0gMSkgcmV0dXJuIHRydWU7XG4gICAgZWxzZSBpZiAodmFsdWUgPT09IDApIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIExhcmdlc3QgdmFsdWUgcmVhZCBhcyBlcG9jaCBTRUNPTkRTIHJhdGhlciB0aGFuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBgMWUxMWAgc2Vjb25kcyBpcyB0aGUgeWVhciA1MTM4IGFuZCBgMWUxMWAgbXMgaXMgMTk3My0wMy0wMywgc28gZXZlcnkgdmFsdWUgYVxuICogY2FsbGVyIHJlYWxpc3RpY2FsbHkgbWVhbnMgYXMgbWlsbGlzIGlzIGFib3ZlIHRoZSBsaW5lIGFuZCBldmVyeSB2YWx1ZSB0aGV5XG4gKiBtZWFuIGFzIHNlY29uZHMgaXMgYmVsb3cgaXQuIFRoZSBhbWJpZ3VpdHkgaXMgdW5hdm9pZGFibGUgLSB0aGUgdHdvIHVuaXRzIHNoYXJlXG4gKiBhIG51bWJlciBsaW5lIC0gc28gdGhlIHNwbGl0IGlzIHBsYWNlZCB3aGVyZSBuZWl0aGVyIHNpZGUgaGFzIGEgcGxhdXNpYmxlXG4gKiBjbGFpbS5cbiAqL1xuY29uc3QgU0VDT05EU19DRUlMSU5HID0gMWUxMTtcblxuLyoqXG4gKiBNaWxsaXNlY29uZHMgcGVyIHVuaXQsIGtleWVkIGJ5IFNJTkdVTEFSIGFsaWFzLiB7QGxpbmsgdG9EdXJhdGlvbn0gcmV0cmllcyBhXG4gKiBsb29rdXAgd2l0aG91dCBhIHRyYWlsaW5nIGBzYCwgc28gZXZlcnkgcGx1cmFsIHNwZWxsaW5nIGlzIGNvdmVyZWQgd2l0aG91dFxuICogbGlzdGluZyBpdCAoYG1zYCBpcyBhbHJlYWR5IHNpbmd1bGFyLCBoZW5jZSBpdHMgb3duIGVudHJ5KS5cbiAqXG4gKiBgbWAgaXMgTUlOVVRFUyBhbmQgbW9udGhzIG5lZWQgYG1vYCwgZm9sbG93aW5nIHRoZSBuZWFyLXVuaXZlcnNhbCBjb252ZW50aW9uXG4gKiAoYG1zYCwgYGRhdGVgLCBjcm9uIHByb3NlKTsgbW9udGggYW5kIHllYXIgYXJlIGNhbGVuZGFyIGFwcHJveGltYXRpb25zICgzMCAvXG4gKiAzNjUgZGF5cykgYmVjYXVzZSBhIGR1cmF0aW9uIGhhcyBubyBhbmNob3IgZGF0ZSB0byBiZSBleGFjdCBhZ2FpbnN0LlxuICovXG5jb25zdCBEVVJBVElPTl9VTklUUzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbbXM6IG51bWJlciwgYWxpYXNlczogcmVhZG9ubHkgc3RyaW5nW11dPiA9IFtcbiAgWzEsIFtcIm1zXCIsIFwibXNlY1wiLCBcIm1pbGxpc2Vjb25kXCIsIFwibWlsbGlcIl1dLFxuICBbMTAwMCwgW1wic1wiLCBcInNlY1wiLCBcInNlY29uZFwiXV0sXG4gIFs2MF8wMDAsIFtcIm1cIiwgXCJtaW5cIiwgXCJtaW51dGVcIl1dLFxuICBbM182MDBfMDAwLCBbXCJoXCIsIFwiaHJcIiwgXCJob3VyXCJdXSxcbiAgWzg2XzQwMF8wMDAsIFtcImRcIiwgXCJkYXlcIl1dLFxuICBbNjA0XzgwMF8wMDAsIFtcIndcIiwgXCJ3a1wiLCBcIndlZWtcIl1dLFxuICBbMl81OTJfMDAwXzAwMCwgW1wibW9cIiwgXCJtb25cIiwgXCJtb250aFwiXV0sXG4gIFszMV81MzZfMDAwXzAwMCwgW1wieVwiLCBcInlyXCIsIFwieWVhclwiXV0sXG5dO1xuXG5jb25zdCBEVVJBVElPTl9VTklUX01TOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKFxuICBEVVJBVElPTl9VTklUUy5mbGF0TWFwKChbbXMsIGFsaWFzZXNdKSA9PiBhbGlhc2VzLm1hcCgoYWxpYXMpID0+IFthbGlhcywgbXNdIGFzIGNvbnN0KSksXG4pO1xuXG4vKiogT25lIGA8YW1vdW50Pjx1bml0PmAgdGVybSBpbnNpZGUgYSBkdXJhdGlvbiBzdHJpbmcuICovXG5jb25zdCBEVVJBVElPTl9URVJNID0gLyhbKy1dPykoXFxkKyg/OlxcLlxcZCspPylcXHMqKFthLXpdKykvZztcblxuLyoqXG4gKiBDb2VyY2UgYSBsb29zZSBkdXJhdGlvbiB0byBNSUxMSVNFQ09ORFMsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2FuJ3QgYmVcbiAqIGludGVycHJldGVkLlxuICpcbiAqIERlbGliZXJhdGVseSBsZW5pZW50LCBiZWNhdXNlIHRoZXNlIHZhbHVlcyBhcmUgdHlwZWQgYnkgaGFuZCBpbnRvIGVudiB2YXJzLFxuICogQ0xJIGZsYWdzLCBhbmQgY29uZmlnIGZpbGVzOiB3aGl0ZXNwYWNlIGJldHdlZW4gYW1vdW50IGFuZCB1bml0IGlzIG9wdGlvbmFsIGFuZFxuICogdW5saW1pdGVkLCB1bml0cyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgcGx1cmFscyBhbmQgdGhlIGNvbW1vbiBhYmJyZXZpYXRpb25zIGFyZVxuICogZXF1aXZhbGVudCAoYDJtc2AgPT09IGAyIG1pbGxpc2Vjb25kc2AsIGAxaGAgPT09IGAxIGhyYCA9PT0gYDEgSG91cmApLCBgYW5kYCBhbmRcbiAqIHRob3VzYW5kcyBzZXBhcmF0b3JzIGFyZSBpZ25vcmVkIChgMSw1MDAgbXNgLCBgMSBob3VyIGFuZCAzMCBtaW51dGVzYCksIGFuZFxuICogdGVybXMgY29tcG9zZSAoYDFoMzBtYCkuIEEgcGxhaW4gYG51bWJlcmAgcGFzc2VzIHRocm91Z2ggYXMgbWlsbGlzZWNvbmRzLlxuICpcbiAqIFNpZ25zIGFyZSBzdXBwb3J0ZWQgc28gYSBkdXJhdGlvbiBjYW4gZXhwcmVzcyBhbiBPRkZTRVQgcmF0aGVyIHRoYW4gb25seSBhXG4gKiBsZW5ndGg6IGEgbGVhZGluZyBgLWAgKG9yIGEgdHJhaWxpbmcgYGFnb2ApIG1ha2VzIHRoZSByZXN1bHQgbmVnYXRpdmUsIGFuZCBhblxuICogdW5zaWduZWQgdGVybSBpbmhlcml0cyB0aGUgcHJldmlvdXMgdGVybSdzIHNpZ24sIHNvIGAtMWgzMG1gIGlzIC05MCBtaW51dGVzXG4gKiByYXRoZXIgdGhhbiAtNjAgKyAzMC4ge0BsaW5rIHRvRGF0ZX0gdXNlcyB0aGF0IHRvIHR1cm4gYC03ZGAgLyBgNyBkYXlzIGFnb2BcbiAqIGludG8gYW4gaW5zdGFudCByZWxhdGl2ZSB0byBub3cuXG4gKlxuICogQW4gVU5LTk9XTiB1bml0IGZhaWxzIHRoZSB3aG9sZSBwYXJzZSByYXRoZXIgdGhhbiBiZWluZyBza2lwcGVkIC0gYDEgZm9ydG5pZ2h0YFxuICogcmV0dXJuaW5nIGAxYCBzaWxlbnRseSB3b3VsZCBiZSB3b3JzZSB0aGFuIHJldHVybmluZyBub3RoaW5nIC0gd2hpY2ggaXMgYWxzb1xuICogd2hhdCBrZWVwcyB7QGxpbmsgdG9EYXRlfSBmcm9tIG1pc3Rha2luZyBgMSBKYW4gMjAyNmAgZm9yIGEgZHVyYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvRHVyYXRpb24oXCIzMHNcIik7ICAgICAgICAgICAgICAgICAgICAvLyAzMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIxIGhvdXIgMzAgbWludXRlc1wiKTsgICAgICAvLyA1XzQwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCItNyBkYXlzXCIpOyAgICAgICAgICAgICAgICAvLyAtNjA0XzgwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIyIHdlZWtzIGFnb1wiKTsgICAgICAgICAgICAvLyAtMV8yMDlfNjAwXzAwMFxuICogdG9EdXJhdGlvbihcInNvb25cIik7ICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EdXJhdGlvbih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEEgdW5pdGxlc3Mgc3RyaW5nIG1lYW5zIHRoZSBzYW1lIGFzIHRoZSB1bml0bGVzcyBudW1iZXI6IG1pbGxpc2Vjb25kcy5cbiAgaWYgKC9eWystXT9cXGQrKFxcLlxcZCspPyQvLnRlc3QodmFsdWUudHJpbSgpKSkgcmV0dXJuIHRvRHVyYXRpb24oTnVtYmVyKHZhbHVlLnRyaW0oKSkpO1xuXG4gIGxldCB0ZXh0ID0gdmFsdWVcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlQWxsKC9bLF9dL2csIFwiXCIpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmFuZFxcYi9nLCBcIiBcIilcbiAgICAudHJpbSgpO1xuICBsZXQgbmVnYXRlID0gZmFsc2U7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiYWdvXCIpKSB7XG4gICAgbmVnYXRlID0gdHJ1ZTtcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCAtXCJhZ29cIi5sZW5ndGgpO1xuICB9XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15pblxcYi8sIFwiXCIpLnRyaW0oKTtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHRlcm1zID0gWy4uLnRleHQubWF0Y2hBbGwoRFVSQVRJT05fVEVSTSldO1xuICBpZiAodGVybXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgbWF0Y2hlZCB0ZXJtcyBtdXN0IGJlIHNlcGFyYXRvcnMgb25seTsgb3RoZXJ3aXNlIHRoZVxuICAvLyBzdHJpbmcgaXMgc29tZXRoaW5nIGVsc2UgdGhhdCBtZXJlbHkgQ09OVEFJTlMgYSBkdXJhdGlvbi1zaGFwZWQgZnJhZ21lbnQuXG4gIGxldCBsZWZ0b3ZlciA9IHRleHQ7XG4gIGZvciAoY29uc3QgdGVybSBvZiB0ZXJtcykgbGVmdG92ZXIgPSBsZWZ0b3Zlci5yZXBsYWNlKHRlcm1bMF0sIFwiIFwiKTtcbiAgaWYgKGxlZnRvdmVyLnRyaW0oKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBsZXQgdG90YWwgPSAwO1xuICBsZXQgc2lnbiA9IDE7XG4gIGZvciAoY29uc3QgWywgZXhwbGljaXRTaWduLCBhbW91bnQsIHVuaXRdIG9mIHRlcm1zKSB7XG4gICAgaWYgKGV4cGxpY2l0U2lnbikgc2lnbiA9IGV4cGxpY2l0U2lnbiA9PT0gXCItXCIgPyAtMSA6IDE7XG4gICAgY29uc3QgdW5pdE1zID0gRFVSQVRJT05fVU5JVF9NUy5nZXQodW5pdCkgPz8gRFVSQVRJT05fVU5JVF9NUy5nZXQodW5pdC5yZXBsYWNlKC9zJC8sIFwiXCIpKTtcbiAgICBpZiAodW5pdE1zID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdG90YWwgKz0gc2lnbiAqIE51bWJlcihhbW91bnQpICogdW5pdE1zO1xuICB9XG4gIHJldHVybiBuZWdhdGUgPyAtdG90YWwgOiB0b3RhbDtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYSBsb29zZSBkYXRlLWlzaCB2YWx1ZSB0byBhIHJlYWwgYERhdGVgLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbid0IGJlXG4gKiBpbnRlcnByZXRlZC4gQWNjZXB0cywgaW4gdGhpcyBvcmRlcjpcbiAqXG4gKiAgIC0gYSBgRGF0ZWAgKHBhc3NlZCB0aHJvdWdoOyBhbiBpbnZhbGlkIG9uZSBpcyBhIG1pc3MpO1xuICogICAtIGFuIGVwb2NoIE5VTUJFUiBvciBudW1lcmljIHN0cmluZywgaW4gc2Vjb25kcyBvciBtaWxsaXNlY29uZHMgKHNlZVxuICogICAgIHtAbGluayBTRUNPTkRTX0NFSUxJTkd9KTtcbiAqICAgLSBgbm93YCAoYW5kIGl0cyBgdG9kYXlgIHNwZWxsaW5nKSwgZm9yIHRoZSBjdXJyZW50IGluc3RhbnQ7XG4gKiAgIC0gYSB7QGxpbmsgdG9EdXJhdGlvbn0gZXhwcmVzc2lvbiwgcmVzb2x2ZWQgUkVMQVRJVkUgVE8gTk9XLCBzbyBgLTdkYCxcbiAqICAgICBgNyBkYXlzIGFnb2AsIGFuZCBgaW4gMzAgbWludXRlc2AgYXJlIGFsbCB2YWxpZCBpbnN0YW50cztcbiAqICAgLSBhbnl0aGluZyBgRGF0ZS5wYXJzZWAgdW5kZXJzdGFuZHMgKGAyMDI2LTA4LTAyYCwgYW4gSVNPL1VUQyBpbnN0YW50KS5cbiAqXG4gKiBUaGUgZXBvY2ggdW5pdCBpbmZlcmVuY2UgaXMgdGhlIHJlYXNvbiB0aGlzIGV4aXN0cyByYXRoZXIgdGhhblxuICogYG5ldyBEYXRlKHZhbHVlKWA6IGEgYmFyZSBlcG9jaCBhcnJpdmVzIGFzIGEgU1RSSU5HIGZyb20gYW4gZW52IHZhciBvciBhIENMSVxuICogZmxhZyBhcyBvZnRlbiBhcyBpdCBhcnJpdmVzIGFzIGEgbnVtYmVyIChgZGF0ZSArJXNgLCBhIEpTT04gZmllbGQsIGEgY29waWVkIGxvZ1xuICogbGluZSksIGFuZCBgRGF0ZS5wYXJzZShcIjE3ODU2OTc4OTlcIilgIHJlYWRzIHRoYXQgYXMgYSBZRUFSLCBzaWxlbnRseSBsYW5kaW5nXG4gKiAxLjcgYmlsbGlvbiB5ZWFycyBvdXQuIE51bWVyaWMgc3RyaW5ncyBhcmUgdGhlcmVmb3JlIHJvdXRlZCB0byB0aGUgZXBvY2ggcGF0aCxcbiAqIG5ldmVyIHRvIGBEYXRlLnBhcnNlYC5cbiAqXG4gKiBMaWtlIHtAbGluayB0b0Jvb2xlYW59IHRoaXMgTkVWRVIgdGhyb3dzIGFuZCByZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhbnl0aGluZ1xuICogdW5pbnRlcnByZXRhYmxlLCBzbyBhIGNhbGxlciBkZWNpZGVzIHdoZXRoZXIgYSBiYWQgdmFsdWUgaXMgZmF0YWwsIGEgd2FybmluZyxcbiAqIG9yIGEgZmFsbGJhY2suXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvRGF0ZShcIm5vd1wiKTsgICAgICAgICAgICAgICAvLyB0aGlzIGluc3RhbnRcbiAqIHRvRGF0ZShcIjIwMjYtMDgtMDJcIik7ICAgICAgICAvLyAyMDI2LTA4LTAyVDAwOjAwOjAwLjAwMFpcbiAqIHRvRGF0ZShcIjE3ODU2OTc4OTlcIik7ICAgICAgICAvLyBzZWNvbmRzIC0+IDIwMjYtMDgtMDJULi4uXG4gKiB0b0RhdGUoMTc4NTY5Nzg5OTAwMCk7ICAgICAgIC8vIG1pbGxpcyAgLT4gdGhlIHNhbWUgaW5zdGFudFxuICogdG9EYXRlKFwiMzAgZGF5cyBhZ29cIik7ICAgICAgIC8vIG5vdyAtIDMwZFxuICogdG9EYXRlKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKHZhbHVlOiB1bmtub3duKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGVwb2NoTXMgPSB0b0Vwb2NoTXModmFsdWUpO1xuICBpZiAoZXBvY2hNcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZnJvbU1zKGVwb2NoTXMpO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdGV4dCA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAodGV4dCA9PT0gXCJub3dcIiB8fCB0ZXh0ID09PSBcInRvZGF5XCIpIHJldHVybiBuZXcgRGF0ZSgpO1xuXG4gIGNvbnN0IG9mZnNldE1zID0gdG9EdXJhdGlvbih2YWx1ZSk7XG4gIGlmIChvZmZzZXRNcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZnJvbU1zKERhdGUubm93KCkgKyBvZmZzZXRNcyk7XG5cbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh2YWx1ZS50cmltKCkpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKHBhcnNlZCkgPyB1bmRlZmluZWQgOiBuZXcgRGF0ZShwYXJzZWQpO1xufVxuXG4vKiogQSBgRGF0ZWAgZm9yIGVwb2NoIGBtc2AsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgb3V0IG9mIHJlcHJlc2VudGFibGUgcmFuZ2UuICovXG5mdW5jdGlvbiBmcm9tTXMobXM6IG51bWJlcik6IERhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUobXMpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IGRhdGU7XG59XG5cbi8qKiBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIGEgbnVtZXJpYyB2YWx1ZS9zdHJpbmcsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IG9uZS4gKi9cbmZ1bmN0aW9uIHRvRXBvY2hNcyh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGxldCBudW1lcmljOiBudW1iZXI7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBudW1lcmljID0gdmFsdWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIC9eWystXT9cXGQrKFxcLlxcZCspPyQvLnRlc3QodmFsdWUudHJpbSgpKSkge1xuICAgIG51bWVyaWMgPSBOdW1iZXIodmFsdWUudHJpbSgpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5hYnMobnVtZXJpYykgPCBTRUNPTkRTX0NFSUxJTkcgPyBudW1lcmljICogMTAwMCA6IG51bWVyaWM7XG59XG5cbi8qKlxuICogU3RydWN0dXJhbCBkZWVwLWVxdWFsaXR5IHdpdGggYW4gb3B0aW9uYWwgY3VzdG9tIGNvbXBhcmF0b3IuXG4gKlxuICoge0BsaW5rIGRlZXBFcXVhbH0gbWlycm9ycyB0aGUgc2VtYW50aWNzIG9mIHRoZSBgZmFzdC1kZWVwLWVxdWFsYFxuICogcGFja2FnZSAoaGFuZGxlZDogbmVzdGVkIHBsYWluIG9iamVjdHMvYXJyYXlzLCBgTWFwYCwgYFNldGAsIGBEYXRlYCxcbiAqIGBSZWdFeHBgLCB0eXBlZCBhcnJheXMsIGBOYU5gLCBhbmQgYCswYC9gLTBgIHRyZWF0ZWQgYXMgZXF1YWwpIGJ1dCBpc1xuICogZGVwZW5kZW5jeS1mcmVlIHNvIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCBrZWVwcyBubyBydW50aW1lIGRlcHMuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBjb21wYXJhdG9yYCBzaG9ydC1jaXJjdWl0cyB0aGUgc3RydWN0dXJhbCB3YWxrIGF0IGFueVxuICogbm9kZTogcmV0dXJuIGB0cnVlYC9gZmFsc2VgIHRvIGZvcmNlIHRoZSByZXN1bHQgZm9yIHRoYXQgcGFpciwgb3JcbiAqIGB1bmRlZmluZWRgIHRvIGRlZmVyIHRvIHRoZSBidWlsdC1pbiBjb21wYXJpc29uLiBJdCBpcyBpbnZva2VkIGZvciB0aGVcbiAqIHJvb3QgcGFpciBhbmQgcmVjdXJzaXZlbHkgZm9yIGVhY2ggbmVzdGVkIHBhaXIsIHNvIGEgY2FsbGVyIGNhbiwgZS5nLixcbiAqIGNvbXBhcmUgdHdvIGRvbWFpbiBvYmplY3RzIGJ5IGlkIHdoaWxlIGxldHRpbmcgZXZlcnl0aGluZyBlbHNlIGZhbGxcbiAqIGJhY2sgdG8gc3RydWN0dXJhbCBlcXVhbGl0eS5cbiAqXG4gKiBAZXhhbXBsZVxuICogZGVlcEVxdWFsKHsgYTogMSB9LCB7IGE6IDEgfSk7ICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBkZWVwRXF1YWwoWzEsIDJdLCBbMSwgMl0pOyAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBkZWVwRXF1YWwoYSwgYiwgKHgsIHkpID0+XG4gKiAgIGlzRW50aXR5KHgpICYmIGlzRW50aXR5KHkpID8geC5pZCA9PT0geS5pZCA6IHVuZGVmaW5lZCk7XG4gKi9cbmV4cG9ydCB0eXBlIERlZXBFcXVhbENvbXBhcmF0b3IgPSAoYTogdW5rbm93biwgYjogdW5rbm93bikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChhOiB1bmtub3duLCBiOiB1bmtub3duLCBjb21wYXJhdG9yPzogRGVlcEVxdWFsQ29tcGFyYXRvcik6IGJvb2xlYW4ge1xuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGNvbnN0IGRlY2lkZWQgPSBjb21wYXJhdG9yKGEsIGIpO1xuICAgIGlmIChkZWNpZGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWNpZGVkO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiB8fCBhID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiIHx8IGIgPT09IG51bGwpIHtcbiAgICAvLyBOYU4gaXMgdGhlIG9ubHkgdmFsdWUgbm90IGVxdWFsIHRvIGl0c2VsZiB1bmRlciBgPT09YC5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG5cbiAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd25bXTtcbiAgICBpZiAoYS5sZW5ndGggIT09IGJBcnIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiQXJyW2ldLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgYk1hcCA9IGIgYXMgTWFwPHVua25vd24sIHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJNYXAuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICAgIGlmICghYk1hcC5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFkZWVwRXF1YWwodmFsdWUsIGJNYXAuZ2V0KGtleSksIGNvbXBhcmF0b3IpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBiU2V0ID0gYiBhcyBTZXQ8dW5rbm93bj47XG4gICAgaWYgKGEuc2l6ZSAhPT0gYlNldC5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhKSB7XG4gICAgICBpZiAoIWJTZXQuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gKGIgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICBjb25zdCBiUmUgPSBiIGFzIFJlZ0V4cDtcbiAgICByZXR1cm4gYS5zb3VyY2UgPT09IGJSZS5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYlJlLmZsYWdzO1xuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiAhKGEgaW5zdGFuY2VvZiBEYXRhVmlldykpIHtcbiAgICBjb25zdCBhQXJyID0gYSBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd24gYXMgQXJyYXlMaWtlPG51bWJlcj47XG4gICAgaWYgKGFBcnIubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFBcnJbaV0gIT09IGJBcnJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgYUtleXMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgIWRlZXBFcXVhbChcbiAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgIChiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICBjb21wYXJhdG9yLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
package/src/env.ts
CHANGED
|
@@ -31,6 +31,21 @@ function environment(): Record<string, string | undefined> {
|
|
|
31
31
|
return (globalThis as { process?: ProcessLike }).process?.env ?? {};
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
/**
|
|
35
|
+
* The PRIMARY (current, non-deprecated) name in an {@link EnvKey}.
|
|
36
|
+
*
|
|
37
|
+
* Use this when naming a variable in a log line or error rather than indexing
|
|
38
|
+
* `keys[0]`: an {@link EnvKey} may be a bare string, and `"TUNNEL_X"[0]` is the
|
|
39
|
+
* character `"T"`, which produces a message naming a variable that does not
|
|
40
|
+
* exist. Returns `""` only for an empty list, which no caller should have.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* logger.warn(`${env.name(JWT_SECRET_ENV)} is not set`);
|
|
44
|
+
*/
|
|
45
|
+
export function name(keys: EnvKey): string {
|
|
46
|
+
return typeof keys === "string" ? keys : (keys[0] ?? "");
|
|
47
|
+
}
|
|
48
|
+
|
|
34
49
|
/**
|
|
35
50
|
* First non-empty value among `keys`, trimmed, else `null`.
|
|
36
51
|
*
|
package/src/object.ts
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Value guards / coercions / shape types: {@link isRecord} narrows parsed JSON
|
|
5
5
|
* to a record, {@link toBoolean} coerces loose truthy/falsy values, {@link
|
|
6
|
-
*
|
|
6
|
+
* toDuration} parses `1h30m` / `2 milliseconds` to millis, {@link toDate}
|
|
7
|
+
* coerces a date/ISO string/epoch number/relative duration, {@link optional}
|
|
8
|
+
* spreads a field only when it is present, {@link deepEqual} compares
|
|
7
9
|
* structurally, and {@link NameLike}/{@link NonFunctionKeys} describe object
|
|
8
10
|
* shapes.
|
|
9
11
|
*
|
|
@@ -872,6 +874,182 @@ export function toBoolean(value: unknown): boolean | undefined {
|
|
|
872
874
|
return undefined;
|
|
873
875
|
}
|
|
874
876
|
|
|
877
|
+
/**
|
|
878
|
+
* Largest value read as epoch SECONDS rather than milliseconds.
|
|
879
|
+
*
|
|
880
|
+
* `1e11` seconds is the year 5138 and `1e11` ms is 1973-03-03, so every value a
|
|
881
|
+
* caller realistically means as millis is above the line and every value they
|
|
882
|
+
* mean as seconds is below it. The ambiguity is unavoidable - the two units share
|
|
883
|
+
* a number line - so the split is placed where neither side has a plausible
|
|
884
|
+
* claim.
|
|
885
|
+
*/
|
|
886
|
+
const SECONDS_CEILING = 1e11;
|
|
887
|
+
|
|
888
|
+
/**
|
|
889
|
+
* Milliseconds per unit, keyed by SINGULAR alias. {@link toDuration} retries a
|
|
890
|
+
* lookup without a trailing `s`, so every plural spelling is covered without
|
|
891
|
+
* listing it (`ms` is already singular, hence its own entry).
|
|
892
|
+
*
|
|
893
|
+
* `m` is MINUTES and months need `mo`, following the near-universal convention
|
|
894
|
+
* (`ms`, `date`, cron prose); month and year are calendar approximations (30 /
|
|
895
|
+
* 365 days) because a duration has no anchor date to be exact against.
|
|
896
|
+
*/
|
|
897
|
+
const DURATION_UNITS: ReadonlyArray<readonly [ms: number, aliases: readonly string[]]> = [
|
|
898
|
+
[1, ["ms", "msec", "millisecond", "milli"]],
|
|
899
|
+
[1000, ["s", "sec", "second"]],
|
|
900
|
+
[60_000, ["m", "min", "minute"]],
|
|
901
|
+
[3_600_000, ["h", "hr", "hour"]],
|
|
902
|
+
[86_400_000, ["d", "day"]],
|
|
903
|
+
[604_800_000, ["w", "wk", "week"]],
|
|
904
|
+
[2_592_000_000, ["mo", "mon", "month"]],
|
|
905
|
+
[31_536_000_000, ["y", "yr", "year"]],
|
|
906
|
+
];
|
|
907
|
+
|
|
908
|
+
const DURATION_UNIT_MS: ReadonlyMap<string, number> = new Map(
|
|
909
|
+
DURATION_UNITS.flatMap(([ms, aliases]) => aliases.map((alias) => [alias, ms] as const)),
|
|
910
|
+
);
|
|
911
|
+
|
|
912
|
+
/** One `<amount><unit>` term inside a duration string. */
|
|
913
|
+
const DURATION_TERM = /([+-]?)(\d+(?:\.\d+)?)\s*([a-z]+)/g;
|
|
914
|
+
|
|
915
|
+
/**
|
|
916
|
+
* Coerce a loose duration to MILLISECONDS, or `undefined` when it can't be
|
|
917
|
+
* interpreted.
|
|
918
|
+
*
|
|
919
|
+
* Deliberately lenient, because these values are typed by hand into env vars,
|
|
920
|
+
* CLI flags, and config files: whitespace between amount and unit is optional and
|
|
921
|
+
* unlimited, units are case-insensitive, plurals and the common abbreviations are
|
|
922
|
+
* equivalent (`2ms` === `2 milliseconds`, `1h` === `1 hr` === `1 Hour`), `and` and
|
|
923
|
+
* thousands separators are ignored (`1,500 ms`, `1 hour and 30 minutes`), and
|
|
924
|
+
* terms compose (`1h30m`). A plain `number` passes through as milliseconds.
|
|
925
|
+
*
|
|
926
|
+
* Signs are supported so a duration can express an OFFSET rather than only a
|
|
927
|
+
* length: a leading `-` (or a trailing `ago`) makes the result negative, and an
|
|
928
|
+
* unsigned term inherits the previous term's sign, so `-1h30m` is -90 minutes
|
|
929
|
+
* rather than -60 + 30. {@link toDate} uses that to turn `-7d` / `7 days ago`
|
|
930
|
+
* into an instant relative to now.
|
|
931
|
+
*
|
|
932
|
+
* An UNKNOWN unit fails the whole parse rather than being skipped - `1 fortnight`
|
|
933
|
+
* returning `1` silently would be worse than returning nothing - which is also
|
|
934
|
+
* what keeps {@link toDate} from mistaking `1 Jan 2026` for a duration.
|
|
935
|
+
*
|
|
936
|
+
* @example
|
|
937
|
+
* toDuration("30s"); // 30_000
|
|
938
|
+
* toDuration("1 hour 30 minutes"); // 5_400_000
|
|
939
|
+
* toDuration("-7 days"); // -604_800_000
|
|
940
|
+
* toDuration("2 weeks ago"); // -1_209_600_000
|
|
941
|
+
* toDuration("soon"); // undefined
|
|
942
|
+
*/
|
|
943
|
+
export function toDuration(value: unknown): number | undefined {
|
|
944
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : undefined;
|
|
945
|
+
if (typeof value !== "string") return undefined;
|
|
946
|
+
// A unitless string means the same as the unitless number: milliseconds.
|
|
947
|
+
if (/^[+-]?\d+(\.\d+)?$/.test(value.trim())) return toDuration(Number(value.trim()));
|
|
948
|
+
|
|
949
|
+
let text = value
|
|
950
|
+
.toLowerCase()
|
|
951
|
+
.replaceAll(/[,_]/g, "")
|
|
952
|
+
.replaceAll(/\band\b/g, " ")
|
|
953
|
+
.trim();
|
|
954
|
+
let negate = false;
|
|
955
|
+
if (text.endsWith("ago")) {
|
|
956
|
+
negate = true;
|
|
957
|
+
text = text.slice(0, -"ago".length);
|
|
958
|
+
}
|
|
959
|
+
text = text.replace(/^in\b/, "").trim();
|
|
960
|
+
if (!text) return undefined;
|
|
961
|
+
|
|
962
|
+
const terms = [...text.matchAll(DURATION_TERM)];
|
|
963
|
+
if (terms.length === 0) return undefined;
|
|
964
|
+
|
|
965
|
+
// Everything outside the matched terms must be separators only; otherwise the
|
|
966
|
+
// string is something else that merely CONTAINS a duration-shaped fragment.
|
|
967
|
+
let leftover = text;
|
|
968
|
+
for (const term of terms) leftover = leftover.replace(term[0], " ");
|
|
969
|
+
if (leftover.trim()) return undefined;
|
|
970
|
+
|
|
971
|
+
let total = 0;
|
|
972
|
+
let sign = 1;
|
|
973
|
+
for (const [, explicitSign, amount, unit] of terms) {
|
|
974
|
+
if (explicitSign) sign = explicitSign === "-" ? -1 : 1;
|
|
975
|
+
const unitMs = DURATION_UNIT_MS.get(unit) ?? DURATION_UNIT_MS.get(unit.replace(/s$/, ""));
|
|
976
|
+
if (unitMs === undefined) return undefined;
|
|
977
|
+
total += sign * Number(amount) * unitMs;
|
|
978
|
+
}
|
|
979
|
+
return negate ? -total : total;
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
/**
|
|
983
|
+
* Coerce a loose date-ish value to a real `Date`, or `undefined` when it can't be
|
|
984
|
+
* interpreted. Accepts, in this order:
|
|
985
|
+
*
|
|
986
|
+
* - a `Date` (passed through; an invalid one is a miss);
|
|
987
|
+
* - an epoch NUMBER or numeric string, in seconds or milliseconds (see
|
|
988
|
+
* {@link SECONDS_CEILING});
|
|
989
|
+
* - `now` (and its `today` spelling), for the current instant;
|
|
990
|
+
* - a {@link toDuration} expression, resolved RELATIVE TO NOW, so `-7d`,
|
|
991
|
+
* `7 days ago`, and `in 30 minutes` are all valid instants;
|
|
992
|
+
* - anything `Date.parse` understands (`2026-08-02`, an ISO/UTC instant).
|
|
993
|
+
*
|
|
994
|
+
* The epoch unit inference is the reason this exists rather than
|
|
995
|
+
* `new Date(value)`: a bare epoch arrives as a STRING from an env var or a CLI
|
|
996
|
+
* flag as often as it arrives as a number (`date +%s`, a JSON field, a copied log
|
|
997
|
+
* line), and `Date.parse("1785697899")` reads that as a YEAR, silently landing
|
|
998
|
+
* 1.7 billion years out. Numeric strings are therefore routed to the epoch path,
|
|
999
|
+
* never to `Date.parse`.
|
|
1000
|
+
*
|
|
1001
|
+
* Like {@link toBoolean} this NEVER throws and returns `undefined` for anything
|
|
1002
|
+
* uninterpretable, so a caller decides whether a bad value is fatal, a warning,
|
|
1003
|
+
* or a fallback.
|
|
1004
|
+
*
|
|
1005
|
+
* @example
|
|
1006
|
+
* toDate("now"); // this instant
|
|
1007
|
+
* toDate("2026-08-02"); // 2026-08-02T00:00:00.000Z
|
|
1008
|
+
* toDate("1785697899"); // seconds -> 2026-08-02T...
|
|
1009
|
+
* toDate(1785697899000); // millis -> the same instant
|
|
1010
|
+
* toDate("30 days ago"); // now - 30d
|
|
1011
|
+
* toDate("nope"); // undefined
|
|
1012
|
+
*/
|
|
1013
|
+
export function toDate(value: unknown): Date | undefined {
|
|
1014
|
+
if (value instanceof Date) {
|
|
1015
|
+
return Number.isNaN(value.getTime()) ? undefined : value;
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
const epochMs = toEpochMs(value);
|
|
1019
|
+
if (epochMs !== undefined) return fromMs(epochMs);
|
|
1020
|
+
|
|
1021
|
+
if (typeof value !== "string") return undefined;
|
|
1022
|
+
|
|
1023
|
+
const text = value.trim().toLowerCase();
|
|
1024
|
+
if (text === "now" || text === "today") return new Date();
|
|
1025
|
+
|
|
1026
|
+
const offsetMs = toDuration(value);
|
|
1027
|
+
if (offsetMs !== undefined) return fromMs(Date.now() + offsetMs);
|
|
1028
|
+
|
|
1029
|
+
const parsed = Date.parse(value.trim());
|
|
1030
|
+
return Number.isNaN(parsed) ? undefined : new Date(parsed);
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
/** A `Date` for epoch `ms`, or `undefined` when it is out of representable range. */
|
|
1034
|
+
function fromMs(ms: number): Date | undefined {
|
|
1035
|
+
const date = new Date(ms);
|
|
1036
|
+
return Number.isNaN(date.getTime()) ? undefined : date;
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
/** Epoch milliseconds for a numeric value/string, or `undefined` when not one. */
|
|
1040
|
+
function toEpochMs(value: unknown): number | undefined {
|
|
1041
|
+
let numeric: number;
|
|
1042
|
+
if (typeof value === "number") {
|
|
1043
|
+
numeric = value;
|
|
1044
|
+
} else if (typeof value === "string" && /^[+-]?\d+(\.\d+)?$/.test(value.trim())) {
|
|
1045
|
+
numeric = Number(value.trim());
|
|
1046
|
+
} else {
|
|
1047
|
+
return undefined;
|
|
1048
|
+
}
|
|
1049
|
+
if (!Number.isFinite(numeric)) return undefined;
|
|
1050
|
+
return Math.abs(numeric) < SECONDS_CEILING ? numeric * 1000 : numeric;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
875
1053
|
/**
|
|
876
1054
|
* Structural deep-equality with an optional custom comparator.
|
|
877
1055
|
*
|