@dbx-tools/shared-core 0.9.37 → 0.9.40
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 +5 -0
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/function-utils.d.ts +11 -0
- package/lib/src/function-utils.js +12 -1
- package/lib/src/json.d.ts +3 -0
- package/lib/src/json.js +4 -1
- package/lib/src/log.d.ts +3 -0
- package/lib/src/log.js +4 -1
- package/lib/src/net.d.ts +2 -0
- package/lib/src/net.js +3 -1
- package/lib/src/object.d.ts +4 -1
- package/lib/src/object.js +5 -2
- package/package.json +2 -2
- package/src/function-utils.ts +12 -0
- package/src/json.ts +3 -0
- package/src/log.ts +3 -0
- package/src/net.ts +2 -0
- package/src/object.ts +4 -1
package/lib/src/object.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dependency-free object + iterable utilities
|
|
2
|
+
* Dependency-free object + iterable utilities and the canonical repository
|
|
3
|
+
* owner for stable identity, loose scalar coercion, record guards, sequences,
|
|
4
|
+
* and common object transforms. Reuse these helpers across packages instead of
|
|
5
|
+
* adding local equivalents with different edge-case behavior.
|
|
3
6
|
*
|
|
4
7
|
* Value guards / coercions / shape types: {@link isRecord} narrows parsed JSON
|
|
5
8
|
* to a record, {@link toNumber} coerces a hand-typed numeral, {@link toBoolean}
|
|
@@ -1182,4 +1185,4 @@ export function deepEqual(a, b, comparator) {
|
|
|
1182
1185
|
}
|
|
1183
1186
|
return true;
|
|
1184
1187
|
}
|
|
1185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUE0Qkgsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxXQUFXLENBQWMsS0FBbUI7SUFDMUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBY0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFjLEtBQWM7SUFDdEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxHQUFHLElBQUksS0FBSyxZQUFZLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixVQUF5RCxFQUN6RCxPQUFpQztJQUVqQyxTQUFTLEtBQUssQ0FBQyxLQUFjLEVBQUUsSUFBbUI7UUFDaEQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FB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Q0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2hFLElBQ0UsQ0FBQyxTQUFTLENBQ1AsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbEMsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbkMsVUFBVSxDQUNYLEVBQ0QsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlcGVuZGVuY3ktZnJlZSBvYmplY3QgKyBpdGVyYWJsZSB1dGlsaXRpZXMuXG4gKlxuICogVmFsdWUgZ3VhcmRzIC8gY29lcmNpb25zIC8gc2hhcGUgdHlwZXM6IHtAbGluayBpc1JlY29yZH0gbmFycm93cyBwYXJzZWQgSlNPTlxuICogdG8gYSByZWNvcmQsIHtAbGluayB0b051bWJlcn0gY29lcmNlcyBhIGhhbmQtdHlwZWQgbnVtZXJhbCwge0BsaW5rIHRvQm9vbGVhbn1cbiAqIGNvZXJjZXMgbG9vc2UgdHJ1dGh5L2ZhbHN5IHZhbHVlcywge0BsaW5rIHRvRHVyYXRpb259IHBhcnNlcyBgMWgzMG1gIC9cbiAqIGAyIG1pbGxpc2Vjb25kc2AgdG8gbWlsbGlzLCB7QGxpbmsgdG9EYXRlfSBjb2VyY2VzIGEgZGF0ZS9JU08gc3RyaW5nL2Vwb2NoXG4gKiBudW1iZXIvcmVsYXRpdmUgZHVyYXRpb24gKGB0b0RhdGVgIGFuZCBgdG9EdXJhdGlvbmAgZmFsbCBiYWNrIHRvIGVhY2ggb3RoZXIsIHNvXG4gKiBlaXRoZXIgYWNjZXB0cyBib3RoIHJlYWRpbmdzKSwge0BsaW5rIG9wdGlvbmFsfVxuICogc3ByZWFkcyBhIGZpZWxkIG9ubHkgd2hlbiBpdCBpcyBwcmVzZW50LCB7QGxpbmsgZGVlcEVxdWFsfSBjb21wYXJlc1xuICogc3RydWN0dXJhbGx5LCB7QGxpbmsgaXNTZXJpYWxpemFibGVWYWx1ZX0gcmVqZWN0cyBhbnl0aGluZyBhIEpTT04gcm91bmQgdHJpcFxuICogd291bGQgbG9zZSBvciBjb2VyY2UsIHtAbGluayB0b1N0YWJsZUtleX0gY2Fub25pY2FsaXplcyBhIHZhbHVlIHNvIGFuIGlkZW50aXR5XG4gKiBjYW4gYmUgZGVyaXZlZCBmcm9tIGl0LCBhbmQge0BsaW5rIE5hbWVMaWtlfS97QGxpbmsgTm9uRnVuY3Rpb25LZXlzfSBkZXNjcmliZVxuICogb2JqZWN0IHNoYXBlcy5cbiAqXG4gKiBJdGVyYWJsZSBoZWxwZXJzOiB7QGxpbmsgZ2VuZXJhdG9yfSBmbGF0dGVucyBtaXhlZCBhcmd1bWVudHM7IHtAbGluayBzZXF1ZW5jZX1cbiAqIHdyYXBzIHNvdXJjZShzKSBpbiBhIGxhenksIGBBcnJheWAtY29tcGF0aWJsZSB7QGxpbmsgU2VxdWVuY2V9LiBFdmVyeVxuICogdHJhbnNmb3JtL3Rlcm1pbmFsIGlzIGEgc3RhbmRhbG9uZSBmdW5jdGlvbiBvcGVyYXRpbmcgb24gcGxhaW4ge0BsaW5rXG4gKiBDb250YWluZXJ9cyAoc2VlIHtAbGluayBtYXB9LCB7QGxpbmsgZmlsdGVyfSwge0BsaW5rIGdyb3VwfSwgLi4uKTsgdGhlIHtAbGlua1xuICogU2VxdWVuY2V9IG1ldGhvZHMgYXJlIHRoaW4gZm9yd2FyZGVycyBvdmVyIHRoZW0gc28gdGhlIHNhbWUgbG9naWMgYmFja3MgYm90aFxuICogdGhlIGZyZWUtZnVuY3Rpb24gYW5kIHRoZSBmbHVlbnQvY2hhaW5lZCBzdHlsZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKiBMYXp5IHNlcXVlbmNlIG92ZXIgaXRlcmFibGUgc291cmNlKHMpLiBTZWUge0BsaW5rIHNlcXVlbmNlfS4gKi9cbmV4cG9ydCB0eXBlIFNlcXVlbmNlPFQ+ID0gU2VxdWVuY2VJbXBsPFQ+O1xuXG50eXBlIFNlcXVlbmNlU291cmNlPFQ+ID1cbiAgSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPiB8IE9uZU9yTWFueTxUPiB8IEV4dHJhY3Q8VCwgc3RyaW5nPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBub24tc2NhbGFyIHtAbGluayBJdGVyYWJsZX0gLSBvbmUgdG8gdHJlYXQgYXMgYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzXG4gKiByYXRoZXIgdGhhbiBhIHNjYWxhci4ge0BsaW5rIGlzQ29udGFpbmVyfSBuYXJyb3dzIHRvIHRoaXMsIGV4Y2x1ZGluZyBzdHJpbmdzLFxuICogYFN0cmluZ2AvYFJlZ0V4cGAgb2JqZWN0cywgYW5kIGZ1bmN0aW9ucy4ge0BsaW5rIENvbGxlY3Rpb259IGlzIHRoZSBlYWdlcmx5LVxuICogc2l6ZWQgc3Vic2V0LiBUaGUgZWxlbWVudCBkZWZhdWx0cyB0byBgdW5rbm93bmAgc28gYW55IGBDb2xsZWN0aW9uYCBpc1xuICogYXNzaWduYWJsZSB0byBhIGJhcmUgYENvbnRhaW5lcmAuXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRhaW5lcjxUID0gdW5rbm93bj4gPSBJdGVyYWJsZTxUPjtcblxuLyoqXG4gKiBBIGJ1aWx0LWluLCBlYWdlcmx5LXNpemVkIHtAbGluayBDb250YWluZXJ9OiBhbiB7QGxpbmsgQXJyYXl9LCB7QGxpbmsgU2V0fSwgb3JcbiAqIHtAbGluayBNYXB9ICh3aG9zZSAqdmFsdWVzKiBhcmUgYFRgIC0gYSBNYXAgaXRlcmF0ZXMgYFtrZXksIHZhbHVlXWAgZW50cmllcyxcbiAqIHNvIGl0cyBlbGVtZW50IHR5cGUgZGlmZmVycywgYnV0IGl0cyB2YWx1ZSB0eXBlIGlzIGBUYCkuIEFsbCBzaGFyZSBhIGNoZWFwXG4gKiBlbXB0aW5lc3MgY2hlY2sgKHtAbGluayBpc0VtcHR5fSkuXG4gKi9cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb248VD4gPSBSZWFkb25seUFycmF5PFQ+IHwgUmVhZG9ubHlTZXQ8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPjtcblxuLyoqIE5vbi1lbXB0eSB0dXBsZSB1c2VkIHdoZXJlIGFuIEFQSSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWUuICovXG5leHBvcnQgdHlwZSBPbmVPck1hbnk8VD4gPSBbVCwgLi4uVFtdXTtcblxuLyoqIE5hcnJvdyBhIHJlYWRvbmx5IGFycmF5IHRvIGEgbm9uLWVtcHR5IHtAbGluayBPbmVPck1hbnl9IHR1cGxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT25lT3JNYW55PFQgPSB1bmtub3duPih2YWx1ZTogcmVhZG9ubHkgVFtdKTogdmFsdWUgaXMgT25lT3JNYW55PFQ+IHtcbiAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IDA7XG59XG5cbi8qKiBBIHNvdXJjZSBhY2NlcHRlZCBieSBhIHZhcmlhZGljIG9wOiBhIHtAbGluayBDb250YWluZXJ9IG9mIGBUYCwgb3Igbm90aGluZy4gKi9cbnR5cGUgU291cmNlPFQ+ID0gQ29udGFpbmVyPFQ+IHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFbGVtZW50IHR5cGUgb2YgYSB7QGxpbmsgZ3JvdXB9IGJ1Y2tldCBhcnJheTogd2hlbiB0aGUgcHJlZGljYXRlIGBQYCBpcyBhIHR5cGVcbiAqIGd1YXJkIChgdmFsdWUgaXMgU2ApLCB0aGUgYnVja2V0IGlzIG5hcnJvd2VkIHRvIGBTICYgVGA7IG90aGVyd2lzZSBpdCBzdGF5cyBgVGAuXG4gKi9cbnR5cGUgR3JvdXBWYWx1ZTxULCBQPiA9IFAgZXh0ZW5kcyAodmFsdWU6IGFueSwgLi4ucmVzdDogYW55W10pID0+IHZhbHVlIGlzIGluZmVyIFMgPyBTICYgVCA6IFQ7XG5cbi8qKiBBIG1hcCBvZiBncm91cCBuYW1lIC0+IHByZWRpY2F0ZSwgYXMgYWNjZXB0ZWQgYnkge0BsaW5rIGdyb3VwfS4gKi9cbnR5cGUgR3JvdXBQcmVkaWNhdGVzPFQ+ID0gUmVjb3JkPHN0cmluZywgKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuPjtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBhIHtAbGluayBDb2xsZWN0aW9ufTogYW4ge0BsaW5rIEFycmF5fSwge0BsaW5rIFNldH0sIG9yXG4gKiB7QGxpbmsgTWFwfS4gTmFycm93cyBgdmFsdWVgIHNvIGl0cyBlbGVtZW50L3ZhbHVlIHR5cGUgaXMgdHJlYXRlZCBhcyBgVGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCAob3IgTWFwIHZhbHVlKSB0eXBlIGFzc2VydGVkIGZvciB0aGUgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgKG5hcnJvd2luZyBgdmFsdWVgIHRvIHtAbGluayBDb2xsZWN0aW9ufTxgVGA+KSBmb3IgYVxuICogICBidWlsdC1pbiBhcnJheS9zZXQvbWFwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xsZWN0aW9uPFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbGxlY3Rpb248VD4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXA7XG59XG5cbi8qKlxuICogYHRydWVgIHdoZW4gYSB7QGxpbmsgQ29sbGVjdGlvbn0gaGFzIG5vIGVsZW1lbnRzLiBVc2VzIGBsZW5ndGhgIGZvciBhcnJheXNcbiAqIGFuZCBgc2l6ZWAgZm9yIHtAbGluayBTZXR9L3tAbGluayBNYXB9LlxuICpcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIC0gVGhlIGFycmF5LCBzZXQsIG9yIG1hcCB0byB0ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvbjx1bmtub3duPiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zPzogeyByZWN1cnNpdmU/OiBib29sZWFuIH0sXG4pOiBib29sZWFuIHtcbiAgZnVuY3Rpb24gdmlzaXQodmFsdWU6IHVua25vd24sIHNlZW4/OiBTZXQ8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChzZWVuPy5oYXModmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHNlZW4/LmFkZCh2YWx1ZSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMCB8fCAoc2VlbiA/IHZhbHVlLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNpemUgPT09IDAgfHwgKHNlZW4gPyBbLi4udmFsdWVdLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB2YWx1ZS5zaXplID09PSAwIHx8XG4gICAgICAgICAgKHNlZW4gPyBbLi4udmFsdWUudmFsdWVzKCldLmV2ZXJ5KChpdGVtKSA9PiB2aXNpdChpdGVtLCBzZWVuKSkgOiBmYWxzZSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHNlZW4pIHtcbiAgICAgICAgcmV0dXJuIGtleXMuZXZlcnkoKGtleSkgPT4gdmlzaXQoKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBzZWVuKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZpc2l0KGNvbGxlY3Rpb24sIG9wdGlvbnM/LnJlY3Vyc2l2ZSA/IG5ldyBTZXQoKSA6IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNvdXJjZSB0byBhbiBpdGVyYWJsZSBvZiBpdHMgYFRgIHZhbHVlcywgc28gTWFwcyBhcmUgdHJlYXRlZFxuICogdW5pZm9ybWx5IHdpdGggYXJyYXlzL3NldHM6IGEge0BsaW5rIE1hcH0geWllbGRzIGl0cyAqdmFsdWVzKiAobWF0Y2hpbmdcbiAqIHtAbGluayBDb2xsZWN0aW9ufSdzIHZhbHVlLXR5cGVkIGBUYCksIGFueSBvdGhlciBpdGVyYWJsZSB5aWVsZHMgaXRzZWxmLiBUaGlzXG4gKiBpcyB3aGF0IHtAbGluayBzZXF1ZW5jZX0gY29uc3VtZXMsIHNvIGEgYE1hcGAgY29udHJpYnV0ZXMgdmFsdWVzIGV2ZXJ5d2hlcmVcbiAqIHJhdGhlciB0aGFuIGBba2V5LCB2YWx1ZV1gIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZXM8VD4oc291cmNlOiBJdGVyYWJsZTxUPiB8IFJlYWRvbmx5TWFwPHVua25vd24sIFQ+KTogSXRlcmFibGU8VD4ge1xuICByZXR1cm4gc291cmNlIGluc3RhbmNlb2YgTWFwID8gc291cmNlLnZhbHVlcygpIDogKHNvdXJjZSBhcyBJdGVyYWJsZTxUPik7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYSB7QGxpbmsgQ29udGFpbmVyfSAtIGFuIGl0ZXJhYmxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb2xsZWN0aW9uXG4gKiByYXRoZXIgdGhhbiBhIHNjYWxhci5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgZXhjbHVkZXMgdmFsdWVzIHRoYXQgYXJlIHRlY2huaWNhbGx5IGl0ZXJhYmxlIGJ1dCBzaG91bGQgYmVcbiAqIHRyZWF0ZWQgYXMgc2NhbGFycyBoZXJlIC0gc3RyaW5ncywgYFN0cmluZ2AvYFJlZ0V4cGAgb2JqZWN0cywgYW5kIGZ1bmN0aW9ucyAtXG4gKiBzbyBhIGxvbmUgc3RyaW5nIGlzIG5ldmVyIHNwcmVhZCBjaGFyYWN0ZXItYnktY2hhcmFjdGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgdHlwZSBhc3NlcnRlZCBmb3IgdGhlIGl0ZXJhYmxlLlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCAobmFycm93aW5nIGB2YWx1ZWAgdG8ge0BsaW5rIENvbnRhaW5lcn08YFRgPikgZm9yIGEgbm9uLXN0cmluZ1xuICogICBpdGVyYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGFpbmVyPFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnRhaW5lcjxUPiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJlxuICAgICEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpICYmXG4gICAgISh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkgJiZcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgeyBbU3ltYm9sLml0ZXJhdG9yXT86IHVua25vd24gfSlbU3ltYm9sLml0ZXJhdG9yXSA9PT0gXCJmdW5jdGlvblwiXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNlcXVlbmNlU291cmNlczxUPiguLi5zb3VyY2VzOiBTZXF1ZW5jZVNvdXJjZTxUPltdKTogSXRlcmFibGU8VD5bXSB7XG4gIGNvbnN0IHNvdXJjZUl0ZXJhYmxlczogSXRlcmFibGU8VD5bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsIHx8IChpc0NvbGxlY3Rpb24oc291cmNlKSAmJiBpc0VtcHR5KHNvdXJjZSkpKSBjb250aW51ZTtcbiAgICBzb3VyY2VJdGVyYWJsZXMucHVzaChpc0NvbnRhaW5lcjxUPihzb3VyY2UpID8gdmFsdWVzKHNvdXJjZSkgOiBbc291cmNlIGFzIFRdKTtcbiAgfVxuICByZXR1cm4gc291cmNlSXRlcmFibGVzO1xufVxuXG4vKipcbiAqIEZsYXR0ZW5zIG5lc3RlZCBhcnJheXMgZm9yIHtAbGluayBmbGF0fS4gTm9uLWFycmF5IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBhXG4gKiBzaW5nbGUtZWxlbWVudCBpdGVyYWJsZTsgZGVwdGggZGVjcmVtZW50cyBwZXIgYXJyYXkgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5WYWx1ZSh2YWx1ZTogdW5rbm93biwgZGVwdGg6IG51bWJlcik6IEl0ZXJhYmxlPHVua25vd24+IHtcbiAgaWYgKGRlcHRoID4gMCAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IG5leHREZXB0aCA9IE51bWJlci5pc0Zpbml0ZShkZXB0aCkgPyBkZXB0aCAtIDEgOiBkZXB0aDtcbiAgICByZXR1cm4ge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHlpZWxkKiBmbGF0dGVuVmFsdWUoaXRlbSwgbmV4dERlcHRoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gW3ZhbHVlXTtcbn1cblxuLyoqIFdyYXAgYSBwZXItZWxlbWVudCB0cmFuc2Zvcm0gKGVhY2ggZWxlbWVudCAtPiBhbiBpdGVyYWJsZSkgYXMgYSBsYXp5IHtAbGluayBTZXF1ZW5jZX0uICovXG5mdW5jdGlvbiBkZXJpdmU8VCwgVT4oXG4gIHNvdXJjZTogSXRlcmFibGU8VD4sXG4gIGZuOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IEl0ZXJhYmxlPFU+LFxuKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNvdXJjZSkgeWllbGQqIGZuKHZhbHVlLCBpbmRleCsrKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIExpa2Uge0BsaW5rIGRlcml2ZX0sIGJ1dCB5aWVsZHMgb25lIHZhbHVlIHBlciBzb3VyY2UgZWxlbWVudCAobm8gd3JhcHBlciBpdGVyYWJsZSkuICovXG5mdW5jdGlvbiBkZXJpdmVPbmU8VCwgVT4oc291cmNlOiBJdGVyYWJsZTxUPiwgZm46ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSk6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHlpZWxkIGZuKHZhbHVlLCBpbmRleCsrKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLm1hcGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjb250YWluZXIgdG8gbWFwIChudWxsaXNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSkuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBDYWxsZWQgcGVyIGVsZW1lbnQgd2l0aCBpdHMgaW5kZXg7IGl0cyByZXN1bHQgaXMgZW1pdHRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcDxULCBVPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUsXG4pOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBkZXJpdmVPbmUoc2VxdWVuY2Uoc291cmNlKSwgY2FsbGJhY2spO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIEEgdHlwZS1ndWFyZCBwcmVkaWNhdGUgbmFycm93cyB0aGUgcmVzdWx0aW5nIGVsZW1lbnQgdHlwZS5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGNvbnRhaW5lciB0byBmaWx0ZXIgKG51bGxpc2ggeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlKS5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBLZWVwcyBlbGVtZW50cyBmb3Igd2hpY2ggaXQgcmV0dXJucyBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBTZXF1ZW5jZTxTPjtcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFNlcXVlbmNlPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcjxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogU2VxdWVuY2U8VD4ge1xuICByZXR1cm4gZGVyaXZlKHNlcXVlbmNlKHNvdXJjZSksIGZ1bmN0aW9uKiAodmFsdWUsIGluZGV4KSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSB5aWVsZCB2YWx1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHRoZSBzb3VyY2VzIGFuZCB5aWVsZHMgb25seSBlbGVtZW50cyB0aGF0IGFyZSBub3QgYG51bGxgIG9yXG4gKiBgdW5kZWZpbmVkYCwgbmFycm93aW5nIHRoZSBlbGVtZW50IHR5cGUgdG8ge0BsaW5rIE5vbk51bGxhYmxlfTxgVGA+LlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vbk51bGw8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxOb25OdWxsYWJsZTxUPj4ge1xuICByZXR1cm4gZmlsdGVyKHNlcXVlbmNlKC4uLnNvdXJjZXMpLCAodmFsdWUpOiB2YWx1ZSBpcyBOb25OdWxsYWJsZTxUPiA9PiB2YWx1ZSAhPSBudWxsKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZsYXRNYXBgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY29udGFpbmVyIHRvIG1hcCAobnVsbGlzaCB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UpLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gUmV0dXJucyBhIHZhbHVlIG9yIGFycmF5IG9mIHZhbHVlcywgZmxhdHRlbmVkIG9uZSBsZXZlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXRNYXA8VCwgVT4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVIHwgUmVhZG9ubHlBcnJheTxVPixcbik6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIGRlcml2ZShzZXF1ZW5jZShzb3VyY2UpLCBmdW5jdGlvbiogKHZhbHVlLCBpbmRleCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlLCBpbmRleCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkgeWllbGQqIHJlc3VsdDtcbiAgICBlbHNlIHlpZWxkIHJlc3VsdCBhcyBVO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZsYXRgIChhcnJheXMgb25seSkuIGBkZXB0aGAgbGVhZHMgc28gdGhlXG4gKiBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljOyB1c2UgYGRlcHRoIDwgMWAgZm9yIGEgbm8tb3AgcGFzc3Rocm91Z2guXG4gKlxuICogQHBhcmFtIGRlcHRoIC0gSG93IG1hbnkgYXJyYXkgbGV2ZWxzIHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUsIHRoZW4gZmxhdHRlbiAobnVsbGlzaCBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXQ8VD4oZGVwdGg6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKC4uLnNvdXJjZXMpO1xuICBpZiAoZGVwdGggPCAxKSByZXR1cm4gc3JjO1xuICByZXR1cm4gZGVyaXZlKHNyYywgKHZhbHVlKSA9PiBmbGF0dGVuVmFsdWUodmFsdWUsIGRlcHRoKSkgYXMgU2VxdWVuY2U8VD47XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIHRoZSBzb3VyY2VzLCB0aGVuIGxhemlseSB5aWVsZHMgdmFsdWVzIGluIGVuY291bnRlciBvcmRlcixcbiAqIHNraXBwaW5nIGEgdmFsdWUgb25seSB3aGVuIGFuIGVxdWFsIG9uZSB3YXMgYWxyZWFkeSB5aWVsZGVkIChgU2V0YCAvXG4gKiBTYW1lVmFsdWVaZXJvKS4gVW5pcXVlbmVzcyBpcyBjaGVja2VkIHBlciBlbGVtZW50IGFzIGl0IGlzIGNvbnN1bWVkLlxuICpcbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RpbmN0PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxUPigpO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogWWllbGRzIGBzb3VyY2VgLCB0aGVuIGVhY2ggYXBwZW5kZWQgYGl0ZW1gIGluIG9yZGVyIChhcnJheXMgc3ByZWFkIG9uZSBsZXZlbCksXG4gKiBtaXJyb3JpbmcgYEFycmF5LnByb3RvdHlwZS5jb25jYXRgLiBgaXRlbXNgIGFyZSBzY2FsYXIgdmFsdWVzL2FycmF5cywgbm90XG4gKiBjb250YWluZXJzLCBzbyBgc291cmNlYCBzdGF5cyBhIHNpbmdsZSBsZWFkaW5nIGFyZ3VtZW50LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgbGVhZGluZyBjb250YWluZXIgKG51bGxpc2ggeWllbGRzIGp1c3QgdGhlIGl0ZW1zKS5cbiAqIEBwYXJhbSBpdGVtcyAtIFZhbHVlcyAob3IgYXJyYXlzIG9mIHZhbHVlcykgYXBwZW5kZWQgYWZ0ZXIgdGhlIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIC4uLml0ZW1zOiByZWFkb25seSAoVCB8IFJlYWRvbmx5QXJyYXk8VD4pW11cbik6IFNlcXVlbmNlPFQ+IHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2Uoc291cmNlKTtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHNyYztcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICB5aWVsZCogc3JjO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB5aWVsZCogaXRlbTtcbiAgICAgICAgZWxzZSB5aWVsZCBpdGVtIGFzIFQ7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogWWllbGRzIGF0IG1vc3QgYGNvdW50YCBlbGVtZW50cyBmcm9tIHRoZSBmcm9udCBvZiB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMuXG4gKiBgY291bnRgIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEBwYXJhbSBjb3VudCAtIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHlpZWxkIChgPD0gMGAgeWllbGRzIG5vbmUpLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFrZTxUPihjb3VudDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgaWYgKGNvdW50IDw9IDApIHJldHVybiBlbXB0eVNlcXVlbmNlIGFzIFNlcXVlbmNlPFQ+O1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgdGFrZW4gPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICAgIGlmICgrK3Rha2VuID49IGNvdW50KSByZXR1cm47XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogU3BsaXRzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIG9uZSBhcnJheSBwZXIgbmFtZWQgcHJlZGljYXRlLiBDb25zdW1lc1xuICogdGhlIGlucHV0IG9uY2UsIHJvdXRpbmcgZWFjaCBlbGVtZW50IHRvIHRoZSBGSVJTVCBwcmVkaWNhdGUgaXQgc2F0aXNmaWVzIChzb1xuICogZ3JvdXBzIGFyZSBkaXNqb2ludCk7IGVsZW1lbnRzIG1hdGNoaW5nIG5vIHByZWRpY2F0ZSBhcmUgZHJvcHBlZC4gVHlwZS1ndWFyZFxuICogcHJlZGljYXRlcyBuYXJyb3cgdGhlaXIgZ3JvdXAncyBlbGVtZW50IHR5cGUgKHNlZSB7QGxpbmsgR3JvdXBWYWx1ZX0pLlxuICogYHByZWRpY2F0ZXNgIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEB0eXBlUGFyYW0gRyAtIFRoZSBtYXAgb2YgZ3JvdXAgbmFtZSAtPiBwcmVkaWNhdGUuXG4gKiBAcGFyYW0gcHJlZGljYXRlcyAtIE5hbWVkIHByZWRpY2F0ZXM7IGV2YWx1YXRlZCBpbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMsIGVhY2ggYW4gYXJyYXkgb2YgaXRzIGdyb3VwJ3MgZWxlbWVudHMuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgY29uc3QgeyBzdHJpbmdzLCBmbnMgfSA9IGdyb3VwKHsgc3RyaW5nczogaXNTdHJpbmcsIGZuczogaXNGdW5jdGlvbiB9LCB4cyk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cDxULCBHIGV4dGVuZHMgR3JvdXBQcmVkaWNhdGVzPFQ+PihcbiAgcHJlZGljYXRlczogRyxcbiAgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W11cbik6IHsgW0sgaW4ga2V5b2YgR106IEdyb3VwVmFsdWU8VCwgR1tLXT5bXSB9IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByZWRpY2F0ZXMpIGFzIChrZXlvZiBHKVtdO1xuICBjb25zdCBidWNrZXRzID0gbmV3IE1hcDxrZXlvZiBHLCBUW10+KGtleXMubWFwKChrZXkpID0+IFtrZXksIFtdXSkpO1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKC4uLnNvdXJjZXMpKSB7XG4gICAgY29uc3QgaSA9IGluZGV4Kys7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHByZWRpY2F0ZXNba2V5XSEodmFsdWUsIGkpKSB7XG4gICAgICAgIGJ1Y2tldHMuZ2V0KGtleSkhLnB1c2godmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgeyBbSyBpbiBrZXlvZiBHXTogR3JvdXBWYWx1ZTxULCBHW0tdPltdIH07XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICByZXN1bHRba2V5XSA9IGJ1Y2tldHMuZ2V0KGtleSkhIGFzIEdyb3VwVmFsdWU8VCwgR1t0eXBlb2Yga2V5XT5bXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyBlbGVtZW50cyB1bnRpbCBhIG1hdGNoLiBBIHR5cGUgZ3VhcmQgbmFycm93cyB0aGUgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogUyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmQ8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5maW5kTGFzdGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyB0aGUgZnVsbCBzb3VyY2UuIEEgdHlwZSBndWFyZCBuYXJyb3dzIHRoZSByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogUyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBtYXRjaDogVCB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIG1hdGNoID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIGVsZW1lbnRzIHVudGlsIGEgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kSW5kZXg8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RJbmRleGAsIG92ZXIgYSBzaW5nbGVcbiAqIHtAbGluayBDb250YWluZXJ9LiBDb25zdW1lcyB0aGUgZnVsbCBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdEluZGV4PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgbWF0Y2ggPSAtMTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpKSBtYXRjaCA9IGluZGV4O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIG1hdGNoO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuc29tZWAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBTaG9ydC1jaXJjdWl0cyBvbiB0aGUgZmlyc3QgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb21lPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCsrKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIFNob3J0LWNpcmN1aXRzIG9uIHRoZSBmaXJzdCBmYWlsdXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlcnk8VCwgUyBleHRlbmRzIFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMsXG4pOiBib29sZWFuO1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuO1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSBpZiAoIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqIENvbnN1bWVzIHRoZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoPFQ+KHNvdXJjZTogU291cmNlPFQ+LCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgY2FsbGJhY2sodmFsdWUsIGluZGV4KyspO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuYXRgIG92ZXIgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzLlxuICogTm9uLW5lZ2F0aXZlIGluZGljZXMgc2NhbiBsYXppbHk7IG5lZ2F0aXZlIGluZGljZXMgbWF0ZXJpYWxpemUgZmlyc3QuIGBpbmRleGBcbiAqIGxlYWRzIHNvIHRoZSBzb3VyY2VzIGNhbiBzdGF5IHZhcmlhZGljLlxuICpcbiAqIEBwYXJhbSBpbmRleCAtIFplcm8tYmFzZWQgcG9zaXRpb247IG5lZ2F0aXZlIGNvdW50cyBmcm9tIHRoZSBlbmQuXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdDxUPihpbmRleDogbnVtYmVyLCAuLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIHRvQXJyYXkoc3JjKS5hdChpbmRleCk7XG4gIGxldCBpID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzcmMpIHtcbiAgICBpZiAoaSsrID09PSBpbmRleCkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBOb3JtYWxpemUgb25lIHZhbHVlIG9yIGFuIGV4aXN0aW5nIHZhbHVlIGxpc3QgaW50byBhIHZhbHVlIGxpc3QuICovXG5leHBvcnQgZnVuY3Rpb24gdG9PbmVPck1hbnk8VD4oaW5wdXQ6IFQgfCBPbmVPck1hbnk8VD4pOiBPbmVPck1hbnk8VD4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF07XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemVzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBzaW5nbGUtcGFzc1xuICogc291cmNlcy5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogcmVhZG9ubHkgVFtdIHtcbiAgcmV0dXJuIFsuLi5zZXF1ZW5jZSguLi5zb3VyY2VzKV07XG59XG5cbi8qKlxuICogTGF6eSBpdGVyYWJsZSBzZXF1ZW5jZSB3aXRoIGBBcnJheWAtY29tcGF0aWJsZSB0cmFuc2Zvcm1zIGFuZCB0ZXJtaW5hbFxuICogbWV0aG9kcy4gU2luZ2xlLXBhc3MgYnkgZGVmYXVsdDsgY2FsbCB7QGxpbmsgU2VxdWVuY2VJbXBsLmNhY2hlfSB0byByZXRhaW5cbiAqIHB1bGxlZCB2YWx1ZXMgZm9yIHJlLWl0ZXJhdGlvbi4gQnVpbHQgZm9yIGdlbmVyYXRvcnMgYW5kIG90aGVyIHNvdXJjZXMgd2hlcmVcbiAqIGEgc2Vjb25kIHBhc3MgaXMgbm90IGd1YXJhbnRlZWQuXG4gKlxuICogVGhlIG1ldGhvZHMgZm9yd2FyZCB0byB0aGUgc3RhbmRhbG9uZSBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSAtIHNlZSBlYWNoXG4gKiBtZXRob2QncyBgQHNlZWAgLSBzbyB0aGUgZnJlZS1mdW5jdGlvbiBhbmQgY2hhaW5lZCBzdHlsZXMgc2hhcmUgb25lIGltcGwuXG4gKi9cbmNsYXNzIFNlcXVlbmNlSW1wbDxUPiB7XG4gIHByaXZhdGUgaXRlcmF0b3I/OiBJdGVyYXRvcjxUPjtcbiAgcHJpdmF0ZSBleGhhdXN0ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2U6IEl0ZXJhYmxlPFQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBUW10gfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IHsgcmVhZG9ubHkgZXhoYXVzdGVkPzogYm9vbGVhbiB9ID0ge30sXG4gICkge1xuICAgIHRoaXMuZXhoYXVzdGVkID0gc3RhdGUuZXhoYXVzdGVkID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FjaGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBZHZhbmNlIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBvbmNlLCBjcmVhdGluZyB0aGUgaXRlcmF0b3Igb24gZmlyc3QgdXNlLiAqL1xuICBwcml2YXRlIHB1bGwoKTogSXRlcmF0b3JSZXN1bHQ8VD4ge1xuICAgIHRoaXMuaXRlcmF0b3IgPz89IHRoaXMuc291cmNlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICByZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gIH1cblxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VD4ge1xuICAgIGlmICghdGhpcy5jYWNoaW5nKSB7XG4gICAgICBpZiAodGhpcy5leGhhdXN0ZWQpIHJldHVybjtcbiAgICAgIGZvciAobGV0IG5leHQgPSB0aGlzLnB1bGwoKTsgIW5leHQuZG9uZTsgbmV4dCA9IHRoaXMucHVsbCgpKSB7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICB9XG4gICAgICB0aGlzLmV4aGF1c3RlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhY2hlZDogaXRlcmF0ZSBsaWtlIGEgbGlzdC4gQWx3YXlzIHJlcGxheSB0aGUgYnVmZmVyIGZyb20gdGhlIHN0YXJ0LFxuICAgICAgLy8gZXh0ZW5kaW5nIGl0IGZyb20gdGhlIHNvdXJjZSBvbiBkZW1hbmQgdW50aWwgZXhoYXVzdGVkLiBBIGJyb2tlbiBsb29wXG4gICAgICAvLyBsZWF2ZXMgdGhlIGJ1ZmZlciBpbnRhY3QsIHNvIHRoZSBuZXh0IGl0ZXJhdGlvbiBzdGFydHMgb3ZlciBmcm9tIHRoZVxuICAgICAgLy8gYmVnaW5uaW5nLlxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIhO1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKGluZGV4IDwgYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIHlpZWxkIGJ1ZmZlcltpbmRleCsrXSE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhoYXVzdGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnB1bGwoKTtcbiAgICAgICAgaWYgKG5leHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuZXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLnB1c2gobmV4dC52YWx1ZSk7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG1hcH0gKi9cbiAgbWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBTZXF1ZW5jZTxVPiB7XG4gICAgcmV0dXJuIG1hcCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmlsdGVyfSAqL1xuICBmaWx0ZXI8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogU2VxdWVuY2U8Uz47XG4gIGZpbHRlcihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFNlcXVlbmNlPFQ+O1xuICBmaWx0ZXIocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGZpbHRlcih0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG5vbk51bGx9ICovXG4gIG5vbk51bGwoKTogU2VxdWVuY2U8Tm9uTnVsbGFibGU8VD4+IHtcbiAgICByZXR1cm4gbm9uTnVsbCh0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0TWFwfSAqL1xuICBmbGF0TWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUgfCBSZWFkb25seUFycmF5PFU+KTogU2VxdWVuY2U8VT4ge1xuICAgIHJldHVybiBmbGF0TWFwKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0fSAqL1xuICBmbGF0KGRlcHRoID0gMSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZmxhdChkZXB0aCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZGlzdGluY3R9ICovXG4gIGRpc3RpbmN0KCk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZGlzdGluY3QodGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgY29uY2F0fSAqL1xuICBjb25jYXQoLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgUmVhZG9ubHlBcnJheTxUPilbXSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gY29uY2F0KHRoaXMsIC4uLml0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXppbHkgeWllbGRzIHRoaXMgc2VxdWVuY2UgZm9sbG93ZWQgYnkgZWFjaCBpdGVyYWJsZSBgc291cmNlYCBpbiBvcmRlci5cbiAgICogTGlrZSB7QGxpbmsgY29uY2F0fSwgYnV0IGZvciBpdGVyYWJsZSBzb3VyY2VzIChnZW5lcmF0b3JzLCBvdGhlciBzZXF1ZW5jZXMsXG4gICAqIGBTZXRgLCBgTWFwYCwgZXRjLikgcmF0aGVyIHRoYW4gc2NhbGFyIHZhbHVlcyBvciBhcnJheXMuIEEge0BsaW5rIE1hcH1cbiAgICogc291cmNlIGNvbnRyaWJ1dGVzIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHNlcXVlbmNlfVxuICAgKi9cbiAgam9pbiguLi5zb3VyY2VzOiByZWFkb25seSBTZXF1ZW5jZVNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICAgIGNvbnN0IHNvdXJjZUl0ZXJhYmxlcyA9IHNlcXVlbmNlU291cmNlcyh0aGlzLCAuLi5zb3VyY2VzKTtcbiAgICByZXR1cm4gc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMSA/IHRoaXMgOiBzZXF1ZW5jZSguLi5zb3VyY2VJdGVyYWJsZXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIHRha2V9ICovXG4gIHRha2UoY291bnQ6IG51bWJlcik6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gdGFrZShjb3VudCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZ3JvdXB9ICovXG4gIGdyb3VwPEcgZXh0ZW5kcyBHcm91cFByZWRpY2F0ZXM8VD4+KHByZWRpY2F0ZXM6IEcpOiB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfSB7XG4gICAgcmV0dXJuIGdyb3VwKHByZWRpY2F0ZXMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjYWNoZWQsIHJlLWl0ZXJhYmxlIHZpZXcgb2YgdGhpcyBzZXF1ZW5jZS4gQW4gYWxyZWFkeS1jYWNoaW5nXG4gICAqIHNlcXVlbmNlIHJldHVybnMgaXRzZWxmOyBvdGhlcndpc2UgdGhpcyBvbmUtcGFzcyBzZXF1ZW5jZSBpcyB3cmFwcGVkIGluIGFcbiAgICogbmV3IGluc3RhbmNlIHRoYXQgcmV0YWlucyBwdWxsZWQgdmFsdWVzLiBJdGVyYXRlIHRoZSByZXR1cm5lZCBpbnN0YW5jZSwgbm90XG4gICAqIHRoZSBvcmlnaW5hbCwgdG8gYXZvaWQgY29tcGV0aW5nIGZvciB0aGUgc2FtZSBzaW5nbGUtcGFzcyBzb3VyY2UuXG4gICAqL1xuICBjYWNoZSgpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGluZyA/IHRoaXMgOiBuZXcgU2VxdWVuY2VJbXBsKHRoaXMsIFtdKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kfSAqL1xuICBmaW5kPFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFMgfCB1bmRlZmluZWQ7XG4gIGZpbmQocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZpbmQodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kTGFzdH0gKi9cbiAgZmluZExhc3Q8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogUyB8IHVuZGVmaW5lZDtcbiAgZmluZExhc3QocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kTGFzdChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmaW5kTGFzdCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRJbmRleH0gKi9cbiAgZmluZEluZGV4KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZmluZEluZGV4KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZExhc3RJbmRleH0gKi9cbiAgZmluZExhc3RJbmRleChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGZpbmRMYXN0SW5kZXgodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBzb21lfSAqL1xuICBzb21lKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNvbWUodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBldmVyeX0gKHRoZSBgUyBleHRlbmRzIFRgIG92ZXJsb2FkIG5hcnJvd3MgYXQgY29tcGlsZSB0aW1lIG9ubHkpLiAqL1xuICBldmVyeTxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiB0aGlzIGlzIFNlcXVlbmNlPFM+O1xuICBldmVyeShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW47XG4gIGV2ZXJ5KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZXJ5KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZm9yRWFjaH0gKi9cbiAgZm9yRWFjaChjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgZm9yRWFjaCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgYXR9ICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYXQoaW5kZXgsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBzZXF1ZW5jZSBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBhIHNpbmdsZS1wYXNzIHNvdXJjZTsgYVxuICAgKiBjYWNoZWQsIGV4aGF1c3RlZCBzZXF1ZW5jZSBjb3BpZXMgaXRzIGJ1ZmZlciBkaXJlY3RseS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgdG9BcnJheX1cbiAgICovXG4gIHRvQXJyYXkoKTogcmVhZG9ubHkgVFtdIHtcbiAgICBpZiAodGhpcy5jYWNoaW5nICYmIHRoaXMuZXhoYXVzdGVkKSByZXR1cm4gWy4uLnRoaXMuYnVmZmVyIV07XG4gICAgcmV0dXJuIHRvQXJyYXkodGhpcyk7XG4gIH1cbn1cblxuLyoqIFNoYXJlZCBlbXB0eSBzZXF1ZW5jZSBzaW5nbGV0b24sIHJldXNhYmxlIGZvciBhbnkgZWxlbWVudCB0eXBlLiAqL1xuY29uc3QgZW1wdHlTZXF1ZW5jZTogU2VxdWVuY2U8bmV2ZXI+ID0gbmV3IFNlcXVlbmNlSW1wbChbXSwgdW5kZWZpbmVkLCB7XG4gIGV4aGF1c3RlZDogdHJ1ZSxcbn0pO1xuXG4vKipcbiAqIFdyYXAgb25lIG9yIG1vcmUgaXRlcmFibGUgYHNvdXJjZXNgIGluIGEgc2luZ2xlIGxhenkge0BsaW5rIFNlcXVlbmNlfSxcbiAqIGl0ZXJhdGVkIGluIG9yZGVyLiBgbnVsbGAvYHVuZGVmaW5lZGAgc291cmNlcyBhcmUgc2tpcHBlZDsgd2hlbiBub3RoaW5nXG4gKiByZW1haW5zIChldmVyeSBzb3VyY2Ugb21pdHRlZCwgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgYW4gZW1wdHkgYXJyYXkgL1xuICogYFNldGAgLyBgTWFwYCksIHtAbGluayBlbXB0eVNlcXVlbmNlfSBpcyByZXR1cm5lZC4gVGhlIHJlc3VsdCBpcyBzaW5nbGUtcGFzc1xuICogLSBjYWxsIGAuY2FjaGUoKWAgdG8gbWFrZSBpdCByZS1pdGVyYWJsZS5cbiAqXG4gKiBBIHtAbGluayBNYXB9IHNvdXJjZSBjb250cmlidXRlcyBpdHMgdmFsdWVzIChzZWUge0BsaW5rIHZhbHVlc30pLCBjb25zaXN0ZW50XG4gKiB3aXRoIHtAbGluayBDb2xsZWN0aW9ufSdzIHZhbHVlLXR5cGVkIGBUYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHNvdXJjZXMgLSBJdGVyYWJsZXMgdG8gY29uY2F0ZW5hdGUsIGluIG9yZGVyIChgTWFwYCBzb3VyY2VzIHVzZSB2YWx1ZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2U8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU2VxdWVuY2VTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgLy8gU2tpcCBudWxsaXNoIHNvdXJjZXMgYW5kIGtub3duLWVtcHR5IGNvbGxlY3Rpb25zOyBub3JtYWxpemUgdGhlIHJlc3QgdG9cbiAgLy8gdGhlaXIgdmFsdWVzIHNvIGEgTWFwIGNvbnRyaWJ1dGVzIHZhbHVlcyByYXRoZXIgdGhhbiBba2V5LCB2YWx1ZV0gZW50cmllcy5cbiAgY29uc3Qgc291cmNlSXRlcmFibGVzID0gc2VxdWVuY2VTb3VyY2VzKC4uLnNvdXJjZXMpO1xuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGVtcHR5U2VxdWVuY2UgYXMgU2VxdWVuY2U8VD47XG4gIC8vIFJldXNlIGFuIGV4aXN0aW5nIHNlcXVlbmNlIGFzLWlzIHJhdGhlciB0aGFuIHJlLXdyYXBwaW5nIGl0LlxuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG9ubHkgPSBzb3VyY2VJdGVyYWJsZXNbMF0hO1xuICAgIHJldHVybiBvbmx5IGluc3RhbmNlb2YgU2VxdWVuY2VJbXBsID8gKG9ubHkgYXMgU2VxdWVuY2U8VD4pIDogbmV3IFNlcXVlbmNlSW1wbChvbmx5LCB1bmRlZmluZWQpO1xuICB9XG4gIHJldHVybiBuZXcgU2VxdWVuY2VJbXBsKFxuICAgIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlSXRlcmFibGVzKSB5aWVsZCogc291cmNlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHVuZGVmaW5lZCxcbiAgKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBhIG1peCBvZiBzaW5nbGUgaXRlbXMgYW5kIGl0ZXJhYmxlcyBpbnRvIG9uZSBsYXp5IHtAbGluayBHZW5lcmF0b3J9LlxuICpcbiAqIEFyZ3VtZW50cyBhcmUgZW1pdHRlZCBpbiBvcmRlcjogYG51bGxgL2B1bmRlZmluZWRgIGFyZSBza2lwcGVkLCBub24tc3RyaW5nXG4gKiBpdGVyYWJsZXMgKHBlciB7QGxpbmsgaXNDb250YWluZXJ9KSBhcmUgeWllbGRlZCBlbGVtZW50LWJ5LWVsZW1lbnQsIGFuZFxuICogYW55dGhpbmcgZWxzZSAoaW5jbHVkaW5nIHN0cmluZ3MpIGlzIHlpZWxkZWQgYXMgYSBzaW5nbGUgaXRlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvci5cbiAqIEBwYXJhbSBpdGVtcyAtIEl0ZW1zIGFuZC9vciBpdGVyYWJsZXMgdG8gZmxhdHRlbiwgaW4gb3JkZXIuXG4gKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvdmVyIHRoZSBmbGF0dGVuZWQgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2VuZXJhdG9yPFQ+KFxuICAuLi5pdGVtczogcmVhZG9ubHkgKFQgfCBJdGVyYWJsZTxUPiB8IG51bGwgfCB1bmRlZmluZWQpW11cbik6IEdlbmVyYXRvcjxUPiB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGlmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChpc0NvbnRhaW5lcihpdGVtKSkge1xuICAgICAgeWllbGQqIGl0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHlpZWxkIGl0ZW07XG4gICAgfVxuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gT2JqZWN0IHZhbHVlIGd1YXJkcywgY29lcmNpb25zLCBhbmQgc3RydWN0dXJhbCBlcXVhbGl0eVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNaW5pbWFsIHNoYXBlIGZvciBvYmplY3RzIHRoYXQgZXhwb3NlIGFuIG9wdGlvbmFsIGBuYW1lYCAoZS5nLiBBcHBLaXQgcGx1Z2lucykuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVMaWtlIHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqIFByb3BlcnR5IGtleXMgb2YgYFRgIHdob3NlIHZhbHVlcyBhcmUgbm90IGNhbGxhYmxlLiAqL1xuZXhwb3J0IHR5cGUgTm9uRnVuY3Rpb25LZXlzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gbmV2ZXIgOiBLO1xufVtrZXlvZiBUXTtcblxuLyoqXG4gKiBOYXJyb3cgYHZhbHVlYCB0byBhIHBsYWluIChub24tYXJyYXkpIG9iamVjdC4gVXNlIGFzIGEgdHlwZSBndWFyZFxuICogYmVmb3JlIGluZGV4aW5nIGludG8gLyBtdXRhdGluZyBwYXJzZWQgSlNPTiBzbyB0aGUgYWNjZXNzIGlzXG4gKiB0eXBlLXNhZmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlmIChpc1JlY29yZChwYXJzZWQpKSBwYXJzZWQuZm9vID0gMTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqIEEgSlNPTiBzY2FsYXIuIGB1bmRlZmluZWRgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgLSBgSlNPTi5zdHJpbmdpZnlgIGRyb3BzIGl0LiAqL1xuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlUHJpbWl0aXZlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG5cbi8qKlxuICogQW55IHZhbHVlIHRoYXQgc3Vydml2ZXMgYSBgSlNPTi5zdHJpbmdpZnlgL2BKU09OLnBhcnNlYCByb3VuZCB0cmlwIHVuY2hhbmdlZC5cbiAqXG4gKiBVc2UgaXQgaW5zdGVhZCBvZiBgdW5rbm93bmAgb24gYSBib3VuZGFyeSB0aGF0IHdpbGwgc2VyaWFsaXplIGl0cyBpbnB1dCAtIGFcbiAqIG1lc3NhZ2UgcGF5bG9hZCwgYSBjYWNoZSBlbnRyeSwgYSBjb25maWcgYmxvYiB3cml0dGVuIHRvIGRpc2sgLSBzbyBhIGBEYXRlYCxcbiAqIGEgYE1hcGAsIG9yIGEgY2xhc3MgaW5zdGFuY2UgaXMgYSBjb21waWxlIGVycm9yIGF0IHRoZSBjYWxsIHNpdGUgcmF0aGVyIHRoYW4gYVxuICogcmVjZWl2ZXIgcXVpZXRseSBnZXR0aW5nIGEgc3RyaW5nIG9yIGB7fWAuIHtAbGluayBpc1NlcmlhbGl6YWJsZVZhbHVlfSBpcyB0aGVcbiAqIHJ1bnRpbWUgaGFsZiwgZm9yIGlucHV0IHRoZSBjb21waWxlciBjYW5ub3Qgdm91Y2ggZm9yLlxuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9XG4gIFNlcmlhbGl6YWJsZVByaW1pdGl2ZSB8IFNlcmlhbGl6YWJsZVZhbHVlW10gfCB7IFtrZXk6IHN0cmluZ106IFNlcmlhbGl6YWJsZVZhbHVlIH07XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGB2YWx1ZWAgc3Vydml2ZXMgYSBKU09OIHJvdW5kIHRyaXAgd2l0aCBubyBsb3NzIGFuZCBubyBjb2VyY2lvbi5cbiAqXG4gKiBTdHJpY3RlciB0aGFuIFwiYEpTT04uc3RyaW5naWZ5YCBkaWQgbm90IHRocm93XCIsIGJlY2F1c2UgdGhhdCBzdWNjZWVkcyB3aGlsZVxuICogc2lsZW50bHkgQ0hBTkdJTkcgdGhlIHZhbHVlOiBhIGBEYXRlYCBiZWNvbWVzIGEgc3RyaW5nLCBgTmFOYCBhbmQgYEluZmluaXR5YFxuICogYmVjb21lIGBudWxsYCwgYSBgTWFwYCBiZWNvbWVzIGB7fWAsIGFuZCBgdW5kZWZpbmVkYCBkaXNhcHBlYXJzIGZyb20gYW4gb2JqZWN0XG4gKiBvciB0dXJucyBpbnRvIGBudWxsYCBpbnNpZGUgYW4gYXJyYXkuIEVhY2ggb2YgdGhvc2UgcmVhY2hlcyB0aGUgZmFyIHNpZGUgYXNcbiAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoYXQgd2FzIHNlbnQsIHNvIGFsbCBvZiB0aGVtIGFyZSByZWplY3RlZCBoZXJlLlxuICpcbiAqIFJlamVjdGVkOiBub24tZmluaXRlIG51bWJlcnMsIGB1bmRlZmluZWRgLCBmdW5jdGlvbnMsIHN5bWJvbHMsIGJpZ2ludHMsIGNsYXNzXG4gKiBpbnN0YW5jZXMgYW5kIGFueXRoaW5nIGVsc2Ugd2l0aCBhIHByb3RvdHlwZSBvdGhlciB0aGFuIGBPYmplY3QucHJvdG90eXBlYCBvclxuICogYG51bGxgIChgRGF0ZWAsIGBNYXBgLCBgU2V0YCwgYFJlZ0V4cGAsIGBCdWZmZXJgKSwgYW5kIGFueSBvYmplY3QgZ3JhcGhcbiAqIGNvbnRhaW5pbmcgYSBjeWNsZS4gQWNjZXB0ZWQ6IHN0cmluZ3MsIGJvb2xlYW5zLCBgbnVsbGAsIGZpbml0ZSBudW1iZXJzLCBwbGFpblxuICogb2JqZWN0cywgYXJyYXlzLCBhbmQgbmVzdGluZ3Mgb2YgdGhvc2UuXG4gKlxuICogTmFycm93cyB0byB7QGxpbmsgU2VyaWFsaXphYmxlVmFsdWV9IHJhdGhlciB0aGFuIGFzc2VydGluZywgc28gaXQgYWxzbyBzZXJ2ZXNcbiAqIGFzIHRoZSB2YWxpZGF0b3IgZm9yIHVudHJ1c3RlZCBpbnB1dCAtIGEgcmVxdWVzdCBib2R5LCBhIGRlY29kZWQgbm90aWZpY2F0aW9uXG4gKiBwYXlsb2FkIC0gd2hlcmUgdGhlIGFuc3dlciBzaG91bGQgYmUgYSA0MDAgYW5kIG5vdCBhIHRocm93LiBOZXZlciB0aHJvd3MuXG4gKlxuICogRGlzdGluY3QgZnJvbSB7QGxpbmsgZGVlcEVxdWFsfSdzIG5vdGlvbiBvZiBjb21wYXJhYmxlOiB0aGF0IG9uZSBIQU5ETEVTXG4gKiBgRGF0ZWAvYE1hcGAvYFNldGAgc3RydWN0dXJhbGx5LCB3aGlsZSB0aGlzIG9uZSByZWplY3RzIHRoZW0gcHJlY2lzZWx5IGJlY2F1c2VcbiAqIEpTT04gY2Fubm90IGNhcnJ5IHRoZW0uXG4gKlxuICogQHBhcmFtIGFuY2VzdG9ycyBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpc1NlcmlhbGl6YWJsZVZhbHVlKHsgYTogWzEsIFwieFwiLCBudWxsXSB9KTsgLy8gdHJ1ZVxuICogaXNTZXJpYWxpemFibGVWYWx1ZSh7IGF0OiBuZXcgRGF0ZSgpIH0pOyAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBhIHN0cmluZ1xuICogaXNTZXJpYWxpemFibGVWYWx1ZShOdW1iZXIuTmFOKTsgICAgICAgICAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcmlhbGl6YWJsZVZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHZhbHVlIGlzIFNlcmlhbGl6YWJsZVZhbHVlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGFuY2VzdG9ycy5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSk7XG4gIGNvbnN0IHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICA/IHZhbHVlLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSlcbiAgICA6IE9iamVjdC52YWx1ZXModmFsdWUpLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSk7XG4gIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpO1xuICByZXR1cm4gdmFsaWQ7XG59XG5cbi8qKlxuICogQ2Fub25pY2FsIHN0cmluZyBmb3IgYSBzdHJ1Y3R1cmVkIHZhbHVlLCBmb3IgZGVyaXZpbmcgYSBTVEFCTEUgSURFTlRJVFkgZnJvbVxuICogaXQgLSBhbiBhZHZpc29yeS1sb2NrIGlkLCBhIGNoYW5uZWwgbmFtZSwgYSBjYWNoZSBrZXkuXG4gKlxuICogVGhlIGd1YXJhbnRlZSBpcyB0d28td2F5LCB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHNhZmUgdG8gaGFzaDogdmFsdWVzIHRoYXRcbiAqIHNob3VsZCBzaGFyZSBhbiBpZGVudGl0eSBwcm9kdWNlIHRoZSBzYW1lIHN0cmluZyAob2JqZWN0IGtleSBvcmRlciBkb2VzIG5vdFxuICogbWF0dGVyKSwgYW5kIHZhbHVlcyB0aGF0IHNob3VsZCBub3QgYXJlIG5ldmVyIGNvbmZsYXRlZC4gRXZlcnkgdG9rZW4gY2Fycmllc1xuICogaXRzIHR5cGUsIHNvIGAxYCBhbmQgYFwiMVwiYCBkaWZmZXI7IGEgc3RyaW5nIGNhcnJpZXMgaXRzIGxlbmd0aCwgc29cbiAqIGBbXCJhXCIsIFwiYmNcIl1gIGFuZCBgW1wiYWJcIiwgXCJjXCJdYCBkaWZmZXI7IGFycmF5cyBrZWVwIG9yZGVyIHdoaWxlIG9iamVjdCBrZXlzXG4gKiBhcmUgc29ydGVkLlxuICpcbiAqIGBKU09OLnN0cmluZ2lmeWAgY2Fubm90IGRvIHRoaXMgam9iIC0ga2V5IG9yZGVyIGxlYWtzIGluLCBgdW5kZWZpbmVkYCB2YW5pc2hlcyxcbiAqIGAxYCBhbmQgYFwiMVwiYCBjb2xsaWRlIGFmdGVyIHF1b3RpbmcgaXMgc3RyaXBwZWQsIGFuZCBhIGN5Y2xlIHRocm93cyBhXG4gKiBgVHlwZUVycm9yYCBuYW1pbmcgbmVpdGhlciB0aGUgdmFsdWUgbm9yIHRoZSBjYWxsZXIncyBpbnRlbnQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IHN0cmljdCB3aGVyZSBhIHNpbGVudCBhbnN3ZXIgd291bGQgYmUgYSBXUk9ORyBpZGVudGl0eSByYXRoZXJcbiAqIHRoYW4gYSBtaXNzaW5nIG9uZSwgc2luY2UgdHdvIGNhbGxlcnMgZGlzYWdyZWVpbmcgYWJvdXQgYSBsb2NrIG9yIGEgY2hhbm5lbCBpc1xuICogaW52aXNpYmxlIHVudGlsIGl0IGNvcnJ1cHRzIHNvbWV0aGluZy4gVGhyb3dzIGBUeXBlRXJyb3JgIG9uIGEgY3ljbGUsIG9uIGFcbiAqIG5vbi1maW5pdGUgbnVtYmVyIChgTmFOYCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLCBzbyBpdCBjYW5ub3QgaGF2ZSBhIHN0YWJsZVxuICogaWRlbnRpdHkpLCBhbmQgb24gYSBgZnVuY3Rpb25gIG9yIGBzeW1ib2xgIChubyBtZWFuaW5nZnVsIHZhbHVlIGlkZW50aXR5KS5cbiAqIGB1bmRlZmluZWRgIGFuZCBgbnVsbGAgYXJlIGFjY2VwdGVkIGFzIGRpc3RpbmN0IHRva2Vucy5cbiAqXG4gKiBgRGF0ZWAgaXMgY2Fub25pY2FsaXplZCBieSBpbnN0YW50LCB1bmxpa2UgdGhlIGhhc2ggY2Fub25pY2FsaXplciBpblxuICogYC4vaGFzaC50c2AsIHdoaWNoIGZvbGRzIGV2ZXJ5IGBEYXRlYCBvbnRvIG9uZSB0b2tlbi4gUHJlZmVyIHRoaXMgZnVuY3Rpb24gd2hlblxuICogZGlzdGluY3RuZXNzIGlzIGEgY29ycmVjdG5lc3MgcmVxdWlyZW1lbnQ7IHByZWZlciBgaGFzaC5mbnZIYXNoYCB3aGVuIGEgc2hvcnQsXG4gKiBjb2xsaXNpb24tdG9sZXJhbnQgZGlnZXN0IGlzIGVub3VnaC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2Fub25pY2FsaXplLlxuICogQHBhcmFtIHNlZW4gLSBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b1N0YWJsZUtleSh7IGE6IDEsIGI6IDIgfSkgPT09IHRvU3RhYmxlS2V5KHsgYjogMiwgYTogMSB9KTsgLy8gdHJ1ZVxuICogdG9TdGFibGVLZXkoMSkgIT09IHRvU3RhYmxlS2V5KFwiMVwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TdGFibGVLZXkodmFsdWU6IHVua25vd24sIHNlZW46IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gXCJudWxsXCI7XG5cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAvLyBMZW5ndGgtcHJlZml4ZWQgc28gY29uY2F0ZW5hdGVkIG5laWdoYm91cnMgY2Fubm90IGJlIHJlLXNwbGl0XG4gICAgICAvLyBkaWZmZXJlbnRseTogYFtcImFcIixcImJjXCJdYCBhbmQgYFtcImFiXCIsXCJjXCJdYCBtdXN0IG5vdCBhZ3JlZS5cbiAgICAgIHJldHVybiBgc3RyaW5nOiR7dmFsdWUubGVuZ3RofToke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBgYm9vbGVhbjoke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIGBiaWdpbnQ6JHt2YWx1ZX1gO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN0YWJsZSBrZXlzIHJlcXVpcmUgZmluaXRlIG51bWJlcnNcIik7XG4gICAgICAvLyBgLTAgPT09IDBgIGJ1dCB0aGV5IHN0cmluZ2lmeSBkaWZmZXJlbnRseSwgc28gcGljayBvbmUgc3BlbGxpbmcuXG4gICAgICByZXR1cm4gYG51bWJlcjoke09iamVjdC5pcyh2YWx1ZSwgLTApID8gXCItMFwiIDogdmFsdWV9YDtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdGFibGUga2V5cyBjYW5ub3QgY29udGFpbiBjeWNsZXNcIik7XG4gICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gYGRhdGU6JHt2YWx1ZS50b0lTT1N0cmluZygpfWA7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBgYXJyYXk6WyR7dmFsdWUubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSkuam9pbihcIixcIil9XWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgLy8gU29ydGVkIGJ5IGNhbm9uaWNhbCBmb3JtLCBzbyBpbnNlcnRpb24gb3JkZXIgZG9lcyBub3QgbGVhay5cbiAgICAgICAgICByZXR1cm4gYHNldDpbJHtbLi4udmFsdWVdXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSlcbiAgICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAgIC5qb2luKFwiLFwiKX1dYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyaWVzOiBJdGVyYWJsZTxbdW5rbm93biwgdW5rbm93bl0+ID1cbiAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IHZhbHVlIDogT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICAgICAgICByZXR1cm4gYCR7dmFsdWUgaW5zdGFuY2VvZiBNYXAgPyBcIm1hcFwiIDogXCJvYmplY3RcIn06eyR7Wy4uLmVudHJpZXNdXG4gICAgICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IGAke3RvU3RhYmxlS2V5KGtleSwgc2Vlbil9PSR7dG9TdGFibGVLZXkoaXRlbSwgc2Vlbil9YClcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgLmpvaW4oXCIsXCIpfX1gO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vlbi5kZWxldGUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgc3RhYmxlIGtleSB0eXBlOiAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIGB7IFtrZXldOiB2YWx1ZSB9YCB3aGVuIGB2YWx1ZWAgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgIC0gc28gYW5cbiAqIGFic2VudCBvcHRpb25hbCBmaWVsZCBzdGF5cyBBQlNFTlQgd2hlbiBzcHJlYWQsIHJhdGhlciB0aGFuIGJlY29taW5nIGFuXG4gKiBleHBsaWNpdCBgdW5kZWZpbmVkYCB0aGF0IGBleGFjdE9wdGlvbmFsUHJvcGVydHlUeXBlc2AgcmVqZWN0cy5cbiAqXG4gKiBTcGVsbGluZyB0aGF0IGlubGluZSBjb3N0cyBhIHJlcGVhdGVkLCBkb3VibGUtZXZhbHVhdGVkIHRlcm5hcnkgcGVyIGZpZWxkXG4gKiAoYC4uLih2ID8geyBrZXk6IHYgfSA6IHt9KWApLCB3aGljaCBpcyBob3cgY29uZmlnIHJlc29sdmVycyBlbmQgdXAgY29tcHV0aW5nXG4gKiB0aGUgc2FtZSB2YWx1ZSB0d2ljZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogcmV0dXJuIHtcbiAqICAgLi4ub3B0aW9uYWwoXCJhcHBJZFwiLCBjb25maWd1cmVkQXBwSWQpLFxuICogICAuLi5vcHRpb25hbChcImVuZHBvaW50XCIsIGNvbmZpZy5lbmRwb2ludCksXG4gKiB9O1xuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWw8SyBleHRlbmRzIHN0cmluZywgVj4oXG4gIGtleTogSyxcbiAgdmFsdWU6IFYgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPEssIFY+IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAoeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8SywgVj4pO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b051bWJlcn0uXG4gKlxuICogQm90aCBzd2l0Y2hlcyB0dXJuIE9GRiBhIGxlbmllbmN5IHRoYXQgaXMgaGVscGZ1bCBmb3IgYSBoYW5kLXR5cGVkIHNldHRpbmcgYnV0XG4gKiB3cm9uZyB3aGVuIHRoZSBzdHJpbmcncyBvdGhlciBjaGFyYWN0ZXJzIGNhcnJ5IG1lYW5pbmcuIHtAbGluayB0b0RhdGV9IGFuZFxuICoge0BsaW5rIHRvRHVyYXRpb259IGRpc2FibGUgYm90aCwgc2luY2UgYSBzcGFjZSBpbnNpZGUgYDIwMjYgMDggMDJgIGlzIGEgZmllbGRcbiAqIHNlcGFyYXRvciBhbmQgYSBwZXJjZW50IGhhcyBubyBlcG9jaCBvciBtaWxsaXNlY29uZCByZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvTnVtYmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGludGVybmFsIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgYXJlIHN0cmlwcGVkLCBzbyBgXCIxLDAwMFwiYCBhbmRcbiAgICogYFwiMSAwMDBcImAgcmVhZCBhcyBgMTAwMGAuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogUGxhY2VtZW50IGlzIG5vdCB2YWxpZGF0ZWQgd2hlbiBlbmFibGVkLCBzbyBgXCIxLDAwLDBcImAgYWxzbyByZWFkcyBhcyBgMTAwMGAuXG4gICAqIERpc2FibGUgaXQgd2hlbiB3aGl0ZXNwYWNlIG9yIGEgY29tbWEgZGVsaW1pdHMgRklFTERTIHJhdGhlciB0aGFuIGdyb3VwaW5nXG4gICAqIGRpZ2l0cywgYmVjYXVzZSBzdHJpcHBpbmcgdGhlbSBzaWxlbnRseSBmdXNlcyB0aG9zZSBmaWVsZHMgaW50byBvbmUgbnVtYmVyLlxuICAgKi9cbiAgc2VwYXJhdG9ycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgdHJhaWxpbmcgcGVyY2VudCBzaWduIGRpdmlkZXMgdGhlIHJlc3VsdCBieSBgMTAwYCwgc28gYFwiMjUlXCJgIHJlYWRzXG4gICAqIGFzIGAwLjI1YC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBEaXNhYmxlIGl0IHdoZXJlIGEgcGVyY2VudGFnZSBoYXMgbm8gbWVhbmluZywgc28gYFwiMjUlXCJgIGlzIGEgbWlzcyByYXRoZXJcbiAgICogdGhhbiBhIG51bWJlciB0d28gb3JkZXJzIG9mIG1hZ25pdHVkZSBhd2F5IGZyb20gd2hhdCB0aGUgdGV4dCBzYXlzLlxuICAgKi9cbiAgcGVyY2VudD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgbnVtZXJpYyB2YWx1ZSB0byBhIHJlYWwsIEZJTklURSBgbnVtYmVyYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdFxuICogY2FycmllcyBubyBudW1lcmljIG1lYW5pbmcuXG4gKlxuICogVGhlIG9uZSBwbGFjZSBhIGhhbmQtdHlwZWQgbnVtYmVyIGlzIGludGVycHJldGVkLCBhbG9uZ3NpZGUge0BsaW5rIHRvQm9vbGVhbn0sXG4gKiB7QGxpbmsgdG9EYXRlfSwgYW5kIHtAbGluayB0b0R1cmF0aW9ufS4gUmVhY2ggZm9yIGl0IGluc3RlYWQgb2YgYE51bWJlcih4KWAgb3IgYVxuICogaGFuZC1yb2xsZWQgbnVtZXJpYyByZWdleDogYmFyZSBgTnVtYmVyYCBtYXBzIGBcIlwiYCwgYG51bGxgLCBgW11gLCBhbmRcbiAqIHdoaXRlc3BhY2UgdG8gYDBgIGFuZCBhbnl0aGluZyBlbHNlIHRvIGBOYU5gLCBzbyBhIGNhbGxlciBoYXMgdG8gcmUtY2hlY2sgdGhlXG4gKiByZXN1bHQgZXZlcnkgdGltZSwgYW5kIGFkIGhvYyByZWdleGVzIHRlbmQgdG8gZHJpZnQgaW4gd2hhdCB0aGV5IGFjY2VwdC5cbiAqXG4gKiBBY2NlcHRzOiBhIGZpbml0ZSBgbnVtYmVyYDsgYSBgYmlnaW50YDsgb3IgYSBkZWNpbWFsIHN0cmluZyB3aXRoIGFuIG9wdGlvbmFsXG4gKiBsZWFkaW5nIHNpZ24sIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciB0aGUgc2lnbixcbiAqIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgKGBcIjEsMDAwXCJgLCBgXCIxIDAwMFwiYCksIGEgYmFyZSBmcmFjdGlvbiAoYFwiLjVcImApLCBhXG4gKiB0cmFpbGluZyBwb2ludCAoYFwiMS5cImApLCBzY2llbnRpZmljIG5vdGF0aW9uIChgXCIxZTNcImApLCBhbmQgYW4gb3B0aW9uYWxcbiAqIHRyYWlsaW5nIHBlcmNlbnQgc2lnbiAoYFwiMjUlXCJgLCBgXCIxLjUgJVwiYCkuIEEgdHJhaWxpbmcgYCVgIGRpdmlkZXMgdGhlIHBhcnNlZFxuICogdmFsdWUgYnkgYDEwMGAsIHNvIGBcIjI1JVwiYCBiZWNvbWVzIGAwLjI1YC5cbiAqXG4gKiBTZXBhcmF0b3JzIGFyZSBzdHJpcHBlZCB3aXRob3V0IHZhbGlkYXRpbmcgdGhlaXIgcGxhY2VtZW50LCBzbyBgXCIxLDAwLDBcImAgcmVhZHNcbiAqIGFzIGAxMDAwYDsgdGhpcyBpcyBhIGNvZXJjaW9uIGZvciBoYW5kLXR5cGVkIGNvbmZpZ3VyYXRpb24sIG5vdCBhIGxvY2FsZS1hd2FyZVxuICogdmFsaWRhdG9yLiBBbnl0aGluZyBlbHNlLCBpbmNsdWRpbmcgYE5hTmAsIGBJbmZpbml0eWAsIGFuIGVtcHR5IG9yXG4gKiB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5nLCBgbnVsbGAsIGB1bmRlZmluZWRgLCBhIGJvb2xlYW4sIG11bHRpcGxlIHNpZ25zLFxuICogbWFsZm9ybWVkIGV4cG9uZW50cywgbWlzcGxhY2VkIHBlcmNlbnQgc2lnbnMsIG9yIGBcIjEycHhcImAsIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCByYXRoZXIgdGhhbiB0aHJvd2luZywgbWF0Y2hpbmcgdGhlIG90aGVyIGNvZXJjaW9ucywgc28gaXRcbiAqIGNvbXBvc2VzIG5hdHVyYWxseSB3aXRoIGA/P2AgZmFsbGJhY2tzLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b051bWJlcihcIjEsMDAwXCIpOyAgIC8vIDEwMDBcbiAqIHRvTnVtYmVyKFwiIC0yLjUgXCIpOyAgLy8gLTIuNVxuICogdG9OdW1iZXIoXCIxZTNcIik7ICAgICAvLyAxMDAwXG4gKiB0b051bWJlcihcIjEyLjUgJVwiKTsgIC8vIDAuMTI1XG4gKiB0b051bWJlcihcIlwiKTsgICAgICAgIC8vIHVuZGVmaW5lZCAgKE51bWJlcihcIlwiKSB3b3VsZCBiZSAwKVxuICogdG9OdW1iZXIoXCIxMnB4XCIpOyAgICAvLyB1bmRlZmluZWRcbiAqIHRvTnVtYmVyKFwiMSAwMDBcIiwgeyBzZXBhcmF0b3JzOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcih2YWx1ZTogdW5rbm93biwgb3B0aW9uczogVG9OdW1iZXJPcHRpb25zID0ge30pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICByZXR1cm4gdG9OdW1iZXIoTnVtYmVyKHZhbHVlKSwgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgLy8gU3RyaXAgc3Vycm91bmRpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciBhIGxlYWRpbmcgc2lnbiwgZGlnaXQtZ3JvdXBcbiAgICAvLyBzZXBhcmF0b3JzIChib3RoIGAsYCBhbmQgdGhlIHNwYWNlIGluIGBcIjEgMDAwXCJgKSwgbGVhdmluZyBhIGJhcmUgbnVtZXJhbCBmb3JcbiAgICAvLyB0aGUgc2hhcGUgdGVzdCBiZWxvdyB0byBhY2NlcHQgb3IgcmVqZWN0LlxuICAgIGNvbnN0IHRleHQgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgb3B0aW9ucy5zZXBhcmF0b3JzID09PSBmYWxzZSA/IC8oXlxccyt8XFxzKyQpL2cgOiAvKF5cXHMrfFxccyskfCg/PD1eWystXSlcXHMrfCg/PD1cXGQpXFxzK3wsKS9nLFxuICAgICAgXCJcIixcbiAgICApO1xuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL14oWystXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KSglKT8kL2kpO1xuICAgICAgaWYgKG1hdGNoICYmICEobWF0Y2hbMl0gJiYgb3B0aW9ucy5wZXJjZW50ID09PSBmYWxzZSkpIHtcbiAgICAgICAgY29uc3QgbnVtYmVyID0gTnVtYmVyKG1hdGNoWzFdKTtcbiAgICAgICAgcmV0dXJuIHRvTnVtYmVyKG1hdGNoWzJdID8gbnVtYmVyIC8gMTAwIDogbnVtYmVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gQSBib3hlZCBgTnVtYmVyYCwgb3IgYW55dGhpbmcgd2l0aCBhIG51bWVyaWMgYHRvU3RyaW5nYC4gYFN0cmluZyh2YWx1ZSlgXG4gICAgLy8gcm91dGVzIGl0IGJhY2sgdGhyb3VnaCB0aGUgc3RyaW5nIGJyYW5jaCwgd2hpY2ggcmVqZWN0cyB3aGF0IGlzIG5vdCBudW1lcmljLlxuICAgIHJldHVybiB0b051bWJlcihTdHJpbmcodmFsdWUpLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGJvb2xlYW4taXNoIHZhbHVlIHRvIGEgcmVhbCBgYm9vbGVhbmAsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIGl0IGNhbid0IGJlIGludGVycHJldGVkLiBSZWNvZ25pemVzIGB0cnVlYC9gdGAvYG9uYC9gMWAvYHllc2AvYHlgXG4gKiBhbmQgdGhlaXIgbmVnYXRpdmVzIChjYXNlLSBhbmQgd2hpdGVzcGFjZS1pbnNlbnNpdGl2ZSBmb3Igc3RyaW5ncyksIGFzXG4gKiB3ZWxsIGFzIHRoZSBudW1iZXJzIGAxYCBhbmQgYDBgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Cb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT09IFwidHJ1ZVwiIHx8XG4gICAgICB2YWx1ZSA9PSBcInRcIiB8fFxuICAgICAgdmFsdWUgPT09IFwib25cIiB8fFxuICAgICAgdmFsdWUgPT09IFwiMVwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJ5ZXNcIiB8fFxuICAgICAgdmFsdWUgPT09IFwieVwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdmFsdWUgPT09IFwiZmFsc2VcIiB8fFxuICAgICAgdmFsdWUgPT0gXCJmXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm9mZlwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCIwXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5vXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5cIlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiB0cnVlO1xuICAgIGVsc2UgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBMYXJnZXN0IHZhbHVlIHJlYWQgYXMgZXBvY2ggU0VDT05EUyByYXRoZXIgdGhhbiBtaWxsaXNlY29uZHMuXG4gKlxuICogYDFlMTFgIHNlY29uZHMgaXMgdGhlIHllYXIgNTEzOCBhbmQgYDFlMTFgIG1zIGlzIDE5NzMtMDMtMDMsIHNvIGV2ZXJ5IHZhbHVlIGFcbiAqIGNhbGxlciByZWFsaXN0aWNhbGx5IG1lYW5zIGFzIG1pbGxpcyBpcyBhYm92ZSB0aGUgbGluZSBhbmQgZXZlcnkgdmFsdWUgdGhleVxuICogbWVhbiBhcyBzZWNvbmRzIGlzIGJlbG93IGl0LiBUaGUgYW1iaWd1aXR5IGlzIHVuYXZvaWRhYmxlIC0gdGhlIHR3byB1bml0cyBzaGFyZVxuICogYSBudW1iZXIgbGluZSAtIHNvIHRoZSBzcGxpdCBpcyBwbGFjZWQgd2hlcmUgbmVpdGhlciBzaWRlIGhhcyBhIHBsYXVzaWJsZVxuICogY2xhaW0uXG4gKi9cbmNvbnN0IFNFQ09ORFNfQ0VJTElORyA9IDFlMTE7XG5cbi8qKlxuICogQSBudW1iZXIgZm9yIHtAbGluayB0b0RhdGV9IGFuZCB7QGxpbmsgdG9EdXJhdGlvbn0sIHJlYWQgd2l0aCBub25lIG9mXG4gKiB7QGxpbmsgdG9OdW1iZXJ9J3Mgc3RyaW5nIGxlbmllbmNpZXMuXG4gKlxuICogQm90aCBsZW5pZW5jaWVzIGFyZSBhY3RpdmVseSBoYXJtZnVsIGhlcmUuIEEgc3BhY2Ugb3IgY29tbWEgc2VwYXJhdGVzIEZJRUxEUyBpblxuICogYSBkYXRlIChgMjAyNiAwOCAwMmAgd291bGQgZnVzZSBpbnRvIHRoZSBlcG9jaCBgMjAyNjA4MDJgKSwgYW5kIGEgcGVyY2VudGFnZSBoYXNcbiAqIG5vIHJlYWRpbmcgYXMgYW4gaW5zdGFudCBvciBhIGxlbmd0aCBvZiB0aW1lLCBzbyBgMjUlYCBtdXN0IGJlIGEgbWlzcyByYXRoZXJcbiAqIHRoYW4gYDI1MG1zYC5cbiAqL1xuZnVuY3Rpb24gdG9CYXJlTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlLCB7IHNlcGFyYXRvcnM6IGZhbHNlLCBwZXJjZW50OiBmYWxzZSB9KTtcbn1cblxuLyoqXG4gKiBNaWxsaXNlY29uZHMgcGVyIHVuaXQsIGtleWVkIGJ5IFNJTkdVTEFSIGFsaWFzLiB7QGxpbmsgdG9EdXJhdGlvbn0gcmV0cmllcyBhXG4gKiBsb29rdXAgd2l0aG91dCBhIHRyYWlsaW5nIGBzYCwgc28gZXZlcnkgcGx1cmFsIHNwZWxsaW5nIGlzIGNvdmVyZWQgd2l0aG91dFxuICogbGlzdGluZyBpdCAoYG1zYCBpcyBhbHJlYWR5IHNpbmd1bGFyLCBoZW5jZSBpdHMgb3duIGVudHJ5KS5cbiAqXG4gKiBgbWAgaXMgTUlOVVRFUyBhbmQgbW9udGhzIG5lZWQgYG1vYCwgZm9sbG93aW5nIHRoZSBuZWFyLXVuaXZlcnNhbCBjb252ZW50aW9uXG4gKiAoYG1zYCwgYGRhdGVgLCBjcm9uIHByb3NlKTsgbW9udGggYW5kIHllYXIgYXJlIGNhbGVuZGFyIGFwcHJveGltYXRpb25zICgzMCAvXG4gKiAzNjUgZGF5cykgYmVjYXVzZSBhIGR1cmF0aW9uIGhhcyBubyBhbmNob3IgZGF0ZSB0byBiZSBleGFjdCBhZ2FpbnN0LlxuICovXG5jb25zdCBEVVJBVElPTl9VTklUUzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbbXM6IG51bWJlciwgYWxpYXNlczogcmVhZG9ubHkgc3RyaW5nW11dPiA9IFtcbiAgWzEsIFtcIm1zXCIsIFwibXNlY1wiLCBcIm1pbGxpc2Vjb25kXCIsIFwibWlsbGlcIl1dLFxuICBbMTAwMCwgW1wic1wiLCBcInNlY1wiLCBcInNlY29uZFwiXV0sXG4gIFs2MF8wMDAsIFtcIm1cIiwgXCJtaW5cIiwgXCJtaW51dGVcIl1dLFxuICBbM182MDBfMDAwLCBbXCJoXCIsIFwiaHJcIiwgXCJob3VyXCJdXSxcbiAgWzg2XzQwMF8wMDAsIFtcImRcIiwgXCJkYXlcIl1dLFxuICBbNjA0XzgwMF8wMDAsIFtcIndcIiwgXCJ3a1wiLCBcIndlZWtcIl1dLFxuICBbMl81OTJfMDAwXzAwMCwgW1wibW9cIiwgXCJtb25cIiwgXCJtb250aFwiXV0sXG4gIFszMV81MzZfMDAwXzAwMCwgW1wieVwiLCBcInlyXCIsIFwieWVhclwiXV0sXG5dO1xuXG5jb25zdCBEVVJBVElPTl9VTklUX01TOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKFxuICBEVVJBVElPTl9VTklUUy5mbGF0TWFwKChbbXMsIGFsaWFzZXNdKSA9PiBhbGlhc2VzLm1hcCgoYWxpYXMpID0+IFthbGlhcywgbXNdIGFzIGNvbnN0KSksXG4pO1xuXG4vKiogT25lIGA8YW1vdW50Pjx1bml0PmAgdGVybSBpbnNpZGUgYSBkdXJhdGlvbiBzdHJpbmcuICovXG5jb25zdCBEVVJBVElPTl9URVJNID0gLyhbKy1dPykoXFxkKyg/OlxcLlxcZCspPylcXHMqKFthLXpdKykvZztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdG9EYXRlfS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0R1cmF0aW9uT3B0aW9uc306IGVhY2ggZnVuY3Rpb24gY2FuIGZhbGwgYmFjayB0byB0aGVcbiAqIG90aGVyLCBzbyBlYWNoIGhhcyBvbmUgc3dpdGNoIHR1cm5pbmcgdGhhdCBmYWxsYmFjayBvZmYuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9EYXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24gaXMgcmVhZCBhcyBhbiBpbnN0YW50IHJlbGF0aXZlIHRvXG4gICAqIG5vdywgc28gYC03ZGAgYW5kIGA3IGRheXMgYWdvYCBiZWNvbWUgYG5vdyAtIDcgZGF5c2AuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogU2V0IGBmYWxzZWAgd2hlbiB0aGUgdmFsdWUgbXVzdCBiZSBhIHJlYWwgZGF0ZSBhbmQgYSByZWxhdGl2ZSBleHByZXNzaW9uXG4gICAqIHNob3VsZCBiZSBhIG1pc3MgLSBhIHN0b3JlZCB0aW1lc3RhbXAsIGEgdXNlci1zdXBwbGllZCBgRGF0ZWAgaGVhZGVyLCBhblxuICAgKiBgZXhwaXJlc19hdGAgZmllbGQgLSBzaW5jZSBhIGR1cmF0aW9uIHNpbGVudGx5IHJlc29sdmluZyBhZ2FpbnN0IHRoZSBjdXJyZW50XG4gICAqIGNsb2NrIG1ha2VzIHRoZSBzYW1lIGlucHV0IG1lYW4gc29tZXRoaW5nIGRpZmZlcmVudCBvbiBldmVyeSBjYWxsLiBBbHNvIHdoYXRcbiAgICoge0BsaW5rIHRvRHVyYXRpb259IHBhc3NlcyB3aGVuIGl0IHJlY3Vyc2VzLCBzbyB0aGUgdHdvIGNhbm5vdCBib3VuY2UgYSB2YWx1ZVxuICAgKiBiZXR3ZWVuIHRoZW0gZm9yZXZlci5cbiAgICovXG4gIHBhcnNlRHVyYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b0R1cmF0aW9ufS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0RhdGVPcHRpb25zfTogZWFjaCBmdW5jdGlvbiBjYW4gZmFsbCBiYWNrIHRvIHRoZSBvdGhlcixcbiAqIHNvIGVhY2ggaGFzIG9uZSBzd2l0Y2ggdHVybmluZyB0aGF0IGZhbGxiYWNrIG9mZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb0R1cmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRGF0ZX0gdmFsdWUgaXMgcmVhZCBhcyB0aGUgc2lnbmVkIG9mZnNldCBmcm9tIG5vdywgc29cbiAgICogYDIwMjYtMDgtMDJgIGJlY29tZXMgaG93ZXZlciBsb25nIHVudGlsIChvciBzaW5jZSkgdGhhdCBpbnN0YW50LiBEZWZhdWx0cyB0b1xuICAgKiBgdHJ1ZWAuXG4gICAqXG4gICAqIFNldCBgZmFsc2VgIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIGlzIG1lYW5pbmdmdWwgLSBhIHRpbWVvdXQsIGEgcG9sbFxuICAgKiBpbnRlcnZhbCwgYSBjYWNoZSBUVEwgLSBiZWNhdXNlIGEgZGF0ZSB3b3VsZCBvdGhlcndpc2UgeWllbGQgYSBwbGF1c2libGUgYnV0XG4gICAqIHdyb25nIG51bWJlciB0aGF0IGFsc28gZHJpZnRzIHdpdGggdGhlIGNsb2NrLiBBbHNvIHdoYXQge0BsaW5rIHRvRGF0ZX0gcGFzc2VzXG4gICAqIHdoZW4gaXQgcmVjdXJzZXMuXG4gICAqL1xuICBwYXJzZURhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGR1cmF0aW9uIHRvIE1JTExJU0VDT05EUywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGxlbmllbnQsIGJlY2F1c2UgdGhlc2UgdmFsdWVzIGFyZSB0eXBlZCBieSBoYW5kIGludG8gZW52IHZhcnMsXG4gKiBDTEkgZmxhZ3MsIGFuZCBjb25maWcgZmlsZXM6IHdoaXRlc3BhY2UgYmV0d2VlbiBhbW91bnQgYW5kIHVuaXQgaXMgb3B0aW9uYWwgYW5kXG4gKiB1bmxpbWl0ZWQsIHVuaXRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBwbHVyYWxzIGFuZCB0aGUgY29tbW9uIGFiYnJldmlhdGlvbnMgYXJlXG4gKiBlcXVpdmFsZW50IChgMm1zYCA9PT0gYDIgbWlsbGlzZWNvbmRzYCwgYDFoYCA9PT0gYDEgaHJgID09PSBgMSBIb3VyYCksIGBhbmRgIGFuZFxuICogdGhvdXNhbmRzIHNlcGFyYXRvcnMgYXJlIGlnbm9yZWQgKGAxLDUwMCBtc2AsIGAxIGhvdXIgYW5kIDMwIG1pbnV0ZXNgKSwgYW5kXG4gKiB0ZXJtcyBjb21wb3NlIChgMWgzMG1gKS4gQSBwbGFpbiBgbnVtYmVyYCBwYXNzZXMgdGhyb3VnaCBhcyBtaWxsaXNlY29uZHMuXG4gKlxuICogU2lnbnMgYXJlIHN1cHBvcnRlZCBzbyBhIGR1cmF0aW9uIGNhbiBleHByZXNzIGFuIE9GRlNFVCByYXRoZXIgdGhhbiBvbmx5IGFcbiAqIGxlbmd0aDogYSBsZWFkaW5nIGAtYCAob3IgYSB0cmFpbGluZyBgYWdvYCkgbWFrZXMgdGhlIHJlc3VsdCBuZWdhdGl2ZSwgYW5kIGFuXG4gKiB1bnNpZ25lZCB0ZXJtIGluaGVyaXRzIHRoZSBwcmV2aW91cyB0ZXJtJ3Mgc2lnbiwgc28gYC0xaDMwbWAgaXMgLTkwIG1pbnV0ZXNcbiAqIHJhdGhlciB0aGFuIC02MCArIDMwLiB7QGxpbmsgdG9EYXRlfSB1c2VzIHRoYXQgdG8gdHVybiBgLTdkYCAvIGA3IGRheXMgYWdvYFxuICogaW50byBhbiBpbnN0YW50IHJlbGF0aXZlIHRvIG5vdy5cbiAqXG4gKiBBbiBVTktOT1dOIHVuaXQgZmFpbHMgdGhlIHdob2xlIHBhcnNlIHJhdGhlciB0aGFuIGJlaW5nIHNraXBwZWQgLSBgMSBmb3J0bmlnaHRgXG4gKiByZXR1cm5pbmcgYDFgIHNpbGVudGx5IHdvdWxkIGJlIHdvcnNlIHRoYW4gcmV0dXJuaW5nIG5vdGhpbmcgLSB3aGljaCBpcyBhbHNvXG4gKiB3aGF0IGtlZXBzIHtAbGluayB0b0RhdGV9IGZyb20gbWlzdGFraW5nIGAxIEphbiAyMDI2YCBmb3IgYSBkdXJhdGlvbi5cbiAqXG4gKiBBIHZhbHVlIHRoYXQgaXMgbm90IGEgZHVyYXRpb24gYXQgYWxsIGlzIG9mZmVyZWQgdG8ge0BsaW5rIHRvRGF0ZX0gYW5kLCB3aGVuIGl0XG4gKiBJUyBhIGRhdGUsIHJlYWQgYXMgdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSBub3cgKGBkYXRlIC0gbm93YCksIHdoaWNoIG1ha2VzIHRoZVxuICogdHdvIGZ1bmN0aW9ucyBpbnZlcnNlczogYSBwYXN0IGluc3RhbnQgaXMgbmVnYXRpdmUsIGEgZnV0dXJlIG9uZSBwb3NpdGl2ZS5cbiAqIGBvcHRpb25zLnBhcnNlRGF0ZTogZmFsc2VgIHR1cm5zIHRoYXQgb2ZmIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIG1ha2VzXG4gKiBzZW5zZSAtIHNlZSB7QGxpbmsgVG9EdXJhdGlvbk9wdGlvbnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0R1cmF0aW9uKFwiMzBzXCIpOyAgICAgICAgICAgICAgICAgICAgLy8gMzBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMSBob3VyIDMwIG1pbnV0ZXNcIik7ICAgICAgLy8gNV80MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiLTcgZGF5c1wiKTsgICAgICAgICAgICAgICAgLy8gLTYwNF84MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMiB3ZWVrcyBhZ29cIik7ICAgICAgICAgICAgLy8gLTFfMjA5XzYwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgICAgICAvLyBtcyBmcm9tIG5vdyB0byB0aGF0IGluc3RhbnRcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIsIHsgcGFyc2VEYXRlOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKiB0b0R1cmF0aW9uKFwic29vblwiKTsgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0R1cmF0aW9uKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0R1cmF0aW9uT3B0aW9ucyA9IHt9KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgLy8gQSBiYXJlIG51bWJlciBpcyBhbHJlYWR5IG1pbGxpc2Vjb25kcywgdGhlIHNhbWUgcmVhZGluZyBgdG9EYXRlYCBnaXZlcyBhblxuICAvLyBlcG9jaCB2YWx1ZSwgc28gdGhpcyBtdXN0IHJ1biBiZWZvcmUgYW55IGRhdGUgaW50ZXJwcmV0YXRpb24uXG4gIGNvbnN0IG51bSA9IHRvQmFyZU51bWJlcih2YWx1ZSk7XG4gIGlmIChudW0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gIH1cbiAgbGV0IHRleHQgPSB2YWx1ZVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2VBbGwoL1ssX10vZywgXCJcIilcbiAgICAucmVwbGFjZUFsbCgvXFxiYW5kXFxiL2csIFwiIFwiKVxuICAgIC50cmltKCk7XG4gIGxldCBuZWdhdGUgPSBmYWxzZTtcbiAgaWYgKHRleHQuZW5kc1dpdGgoXCJhZ29cIikpIHtcbiAgICBuZWdhdGUgPSB0cnVlO1xuICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIC1cImFnb1wiLmxlbmd0aCk7XG4gIH1cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXmluXFxiLywgXCJcIikudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdGVybXMgPSBbLi4udGV4dC5tYXRjaEFsbChEVVJBVElPTl9URVJNKV07XG4gIGlmICh0ZXJtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgLy8gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBtYXRjaGVkIHRlcm1zIG11c3QgYmUgc2VwYXJhdG9ycyBvbmx5OyBvdGhlcndpc2UgdGhlXG4gIC8vIHN0cmluZyBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IG1lcmVseSBDT05UQUlOUyBhIGR1cmF0aW9uLXNoYXBlZCBmcmFnbWVudC5cbiAgbGV0IGxlZnRvdmVyID0gdGV4dDtcbiAgZm9yIChjb25zdCB0ZXJtIG9mIHRlcm1zKSBsZWZ0b3ZlciA9IGxlZnRvdmVyLnJlcGxhY2UodGVybVswXSwgXCIgXCIpO1xuICBpZiAobGVmdG92ZXIudHJpbSgpKSB7XG4gICAgLy8gQSBkdXJhdGlvbi1zaGFwZWQgZnJhZ21lbnQgaW5zaWRlIG90aGVyIHRleHQgaXMgdXN1YWxseSBhIERBVEUgLSBgXCIyMDI2LTA4LTAyXCJgXG4gICAgLy8gbWF0Y2hlcyB0d28gdGVybXMgYW5kIGxlYXZlcyBzZXBhcmF0b3JzIGJlaGluZC5cbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgbGV0IHRvdGFsID0gMDtcbiAgbGV0IHNpZ24gPSAxO1xuICBmb3IgKGNvbnN0IFssIGV4cGxpY2l0U2lnbiwgYW1vdW50LCB1bml0XSBvZiB0ZXJtcykge1xuICAgIGlmIChleHBsaWNpdFNpZ24pIHNpZ24gPSBleHBsaWNpdFNpZ24gPT09IFwiLVwiID8gLTEgOiAxO1xuICAgIGNvbnN0IHVuaXRNcyA9IERVUkFUSU9OX1VOSVRfTVMuZ2V0KHVuaXQhKSA/PyBEVVJBVElPTl9VTklUX01TLmdldCh1bml0IS5yZXBsYWNlKC9zJC8sIFwiXCIpKTtcbiAgICBpZiAodW5pdE1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gICAgfVxuICAgIHRvdGFsICs9IHNpZ24gKiBOdW1iZXIoYW1vdW50ISkgKiB1bml0TXM7XG4gIH1cbiAgcmV0dXJuIG5lZ2F0ZSA/IC10b3RhbCA6IHRvdGFsO1xufVxuXG4vKipcbiAqIEEgZGF0ZSByZWFkIGFzIHRoZSBzaWduZWQgb2Zmc2V0IGZyb20gbm93IChgZGF0ZSAtIG5vd2ApLCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gKiB7QGxpbmsgdG9EdXJhdGlvbn0gYW5kIHtAbGluayB0b0RhdGV9IGludmVyc2VzIG9mIGVhY2ggb3RoZXIuIFJlY3Vyc2VzIHdpdGhcbiAqIGR1cmF0aW9uIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kIGZvcnRoXG4gKiBmb3JldmVyLlxuICovXG5mdW5jdGlvbiBkYXRlQXNEdXJhdGlvbih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGUgPSB0b0RhdGUodmFsdWUsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7XG4gIHJldHVybiBkYXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkYXRlLmdldFRpbWUoKSAtIERhdGUubm93KCk7XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgZGF0ZS1pc2ggdmFsdWUgdG8gYSByZWFsIGBEYXRlYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuIEFjY2VwdHMsIGluIHRoaXMgb3JkZXI6XG4gKlxuICogICAtIGEgYERhdGVgIChwYXNzZWQgdGhyb3VnaDsgYW4gaW52YWxpZCBvbmUgaXMgYSBtaXNzKTtcbiAqICAgLSBhbiBlcG9jaCBOVU1CRVIgb3IgbnVtZXJpYyBzdHJpbmcsIGluIHNlY29uZHMgb3IgbWlsbGlzZWNvbmRzIChzZWVcbiAqICAgICB7QGxpbmsgU0VDT05EU19DRUlMSU5HfSk7XG4gKiAgIC0gYG5vd2AgKGFuZCBpdHMgYHRvZGF5YCBzcGVsbGluZyksIGZvciB0aGUgY3VycmVudCBpbnN0YW50O1xuICogICAtIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24sIHJlc29sdmVkIFJFTEFUSVZFIFRPIE5PVywgc28gYC03ZGAsXG4gKiAgICAgYDcgZGF5cyBhZ29gLCBhbmQgYGluIDMwIG1pbnV0ZXNgIGFyZSBhbGwgdmFsaWQgaW5zdGFudHM7XG4gKiAgIC0gYW55dGhpbmcgYERhdGUucGFyc2VgIHVuZGVyc3RhbmRzIChgMjAyNi0wOC0wMmAsIGFuIElTTy9VVEMgaW5zdGFudCkuXG4gKlxuICogVGhlIGVwb2NoIHVuaXQgaW5mZXJlbmNlIGlzIHRoZSByZWFzb24gdGhpcyBleGlzdHMgcmF0aGVyIHRoYW5cbiAqIGBuZXcgRGF0ZSh2YWx1ZSlgOiBhIGJhcmUgZXBvY2ggYXJyaXZlcyBhcyBhIFNUUklORyBmcm9tIGFuIGVudiB2YXIgb3IgYSBDTElcbiAqIGZsYWcgYXMgb2Z0ZW4gYXMgaXQgYXJyaXZlcyBhcyBhIG51bWJlciAoYGRhdGUgKyVzYCwgYSBKU09OIGZpZWxkLCBhIGNvcGllZCBsb2dcbiAqIGxpbmUpLCBhbmQgYERhdGUucGFyc2UoXCIxNzg1Njk3ODk5XCIpYCByZWFkcyB0aGF0IGFzIGEgWUVBUiwgc2lsZW50bHkgbGFuZGluZ1xuICogMS43IGJpbGxpb24geWVhcnMgb3V0LiBOdW1lcmljIHN0cmluZ3MgYXJlIHRoZXJlZm9yZSByb3V0ZWQgdG8gdGhlIGVwb2NoIHBhdGgsXG4gKiBuZXZlciB0byBgRGF0ZS5wYXJzZWAuXG4gKlxuICogVGhlIGR1cmF0aW9uIGZhbGxiYWNrIHJ1bnMgTEFTVCwgYWZ0ZXIgYERhdGUucGFyc2VgLCBzbyBhIHJlYWwgZGF0ZSBpcyBuZXZlclxuICogbWlzdGFrZW4gZm9yIGFuIG9mZnNldC4gYG9wdGlvbnMucGFyc2VEdXJhdGlvbjogZmFsc2VgIHJlbW92ZXMgaXQgZW50aXJlbHkgd2hlblxuICogdGhlIHZhbHVlIG11c3QgYmUgYW4gYWJzb2x1dGUgaW5zdGFudCAtIHNlZSB7QGxpbmsgVG9EYXRlT3B0aW9uc30uXG4gKlxuICogTGlrZSB7QGxpbmsgdG9Cb29sZWFufSB0aGlzIE5FVkVSIHRocm93cyBhbmQgcmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYW55dGhpbmdcbiAqIHVuaW50ZXJwcmV0YWJsZSwgc28gYSBjYWxsZXIgZGVjaWRlcyB3aGV0aGVyIGEgYmFkIHZhbHVlIGlzIGZhdGFsLCBhIHdhcm5pbmcsXG4gKiBvciBhIGZhbGxiYWNrLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0RhdGUoXCJub3dcIik7ICAgICAgICAgICAgICAgLy8gdGhpcyBpbnN0YW50XG4gKiB0b0RhdGUoXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgLy8gMjAyNi0wOC0wMlQwMDowMDowMC4wMDBaXG4gKiB0b0RhdGUoXCIxNzg1Njk3ODk5XCIpOyAgICAgICAgLy8gc2Vjb25kcyAtPiAyMDI2LTA4LTAyVC4uLlxuICogdG9EYXRlKDE3ODU2OTc4OTkwMDApOyAgICAgICAvLyBtaWxsaXMgIC0+IHRoZSBzYW1lIGluc3RhbnRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIpOyAgICAgICAvLyBub3cgLSAzMGRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7IC8vIHVuZGVmaW5lZFxuICogdG9EYXRlKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0RhdGVPcHRpb25zID0ge30pOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXBvY2hNcyA9IHRvRXBvY2hNcyh2YWx1ZSk7XG4gIGlmIChlcG9jaE1zICE9PSB1bmRlZmluZWQpIHJldHVybiBmcm9tTXMoZXBvY2hNcyk7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCB0ZXh0ID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0ZXh0ID09PSBcIm5vd1wiIHx8IHRleHQgPT09IFwidG9kYXlcIikgcmV0dXJuIG5ldyBEYXRlKCk7XG5cbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh2YWx1ZS50cmltKCkpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQpKSByZXR1cm4gbmV3IERhdGUocGFyc2VkKTtcblxuICBpZiAob3B0aW9ucy5wYXJzZUR1cmF0aW9uID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gUmVjdXJzZXMgd2l0aCBkYXRlIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kXG4gIC8vIGZvcnRoIGZvcmV2ZXIuXG4gIGNvbnN0IG9mZnNldE1zID0gdG9EdXJhdGlvbih2YWx1ZSwgeyBwYXJzZURhdGU6IGZhbHNlIH0pO1xuICByZXR1cm4gb2Zmc2V0TXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGZyb21NcyhEYXRlLm5vdygpICsgb2Zmc2V0TXMpO1xufVxuXG4vKiogQSBgRGF0ZWAgZm9yIGVwb2NoIGBtc2AsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgb3V0IG9mIHJlcHJlc2VudGFibGUgcmFuZ2UuICovXG5mdW5jdGlvbiBmcm9tTXMobXM6IG51bWJlcik6IERhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUobXMpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IGRhdGU7XG59XG5cbi8qKlxuICogRXBvY2ggbWlsbGlzZWNvbmRzIGZvciBhIG51bWVyaWMgdmFsdWUvc3RyaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vdCBvbmUsXG4gKiBhcHBseWluZyB0aGUgc2Vjb25kcy12cy1taWxsaXMgaW5mZXJlbmNlIGF0IHtAbGluayBTRUNPTkRTX0NFSUxJTkd9LlxuICovXG5mdW5jdGlvbiB0b0Vwb2NoTXModmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBudW1lcmljID0gdG9CYXJlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGguYWJzKG51bWVyaWMpIDwgU0VDT05EU19DRUlMSU5HID8gbnVtZXJpYyAqIDEwMDAgOiBudW1lcmljO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcC1lcXVhbGl0eSB3aXRoIGFuIG9wdGlvbmFsIGN1c3RvbSBjb21wYXJhdG9yLlxuICpcbiAqIHtAbGluayBkZWVwRXF1YWx9IG1pcnJvcnMgdGhlIHNlbWFudGljcyBvZiB0aGUgYGZhc3QtZGVlcC1lcXVhbGBcbiAqIHBhY2thZ2UgKGhhbmRsZWQ6IG5lc3RlZCBwbGFpbiBvYmplY3RzL2FycmF5cywgYE1hcGAsIGBTZXRgLCBgRGF0ZWAsXG4gKiBgUmVnRXhwYCwgdHlwZWQgYXJyYXlzLCBgTmFOYCwgYW5kIGArMGAvYC0wYCB0cmVhdGVkIGFzIGVxdWFsKSBidXQgaXNcbiAqIGRlcGVuZGVuY3ktZnJlZSBzbyBgQGRieC10b29scy9zaGFyZWQtY29yZWAga2VlcHMgbm8gcnVudGltZSBkZXBzLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgY29tcGFyYXRvcmAgc2hvcnQtY2lyY3VpdHMgdGhlIHN0cnVjdHVyYWwgd2FsayBhdCBhbnlcbiAqIG5vZGU6IHJldHVybiBgdHJ1ZWAvYGZhbHNlYCB0byBmb3JjZSB0aGUgcmVzdWx0IGZvciB0aGF0IHBhaXIsIG9yXG4gKiBgdW5kZWZpbmVkYCB0byBkZWZlciB0byB0aGUgYnVpbHQtaW4gY29tcGFyaXNvbi4gSXQgaXMgaW52b2tlZCBmb3IgdGhlXG4gKiByb290IHBhaXIgYW5kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIG5lc3RlZCBwYWlyLCBzbyBhIGNhbGxlciBjYW4sIGUuZy4sXG4gKiBjb21wYXJlIHR3byBkb21haW4gb2JqZWN0cyBieSBpZCB3aGlsZSBsZXR0aW5nIGV2ZXJ5dGhpbmcgZWxzZSBmYWxsXG4gKiBiYWNrIHRvIHN0cnVjdHVyYWwgZXF1YWxpdHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGRlZXBFcXVhbCh7IGE6IDEgfSwgeyBhOiAxIH0pOyAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKFsxLCAyXSwgWzEsIDJdKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKGEsIGIsICh4LCB5KSA9PlxuICogICBpc0VudGl0eSh4KSAmJiBpc0VudGl0eSh5KSA/IHguaWQgPT09IHkuaWQgOiB1bmRlZmluZWQpO1xuICovXG5leHBvcnQgdHlwZSBEZWVwRXF1YWxDb21wYXJhdG9yID0gKGE6IHVua25vd24sIGI6IHVua25vd24pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbi8qKiBDb21wYXJlIG5lc3RlZCB2YWx1ZXMgc3RydWN0dXJhbGx5IHdpdGggYW4gb3B0aW9uYWwgcmVjdXJzaXZlIG92ZXJyaWRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChhOiB1bmtub3duLCBiOiB1bmtub3duLCBjb21wYXJhdG9yPzogRGVlcEVxdWFsQ29tcGFyYXRvcik6IGJvb2xlYW4ge1xuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGNvbnN0IGRlY2lkZWQgPSBjb21wYXJhdG9yKGEsIGIpO1xuICAgIGlmIChkZWNpZGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWNpZGVkO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiB8fCBhID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiIHx8IGIgPT09IG51bGwpIHtcbiAgICAvLyBOYU4gaXMgdGhlIG9ubHkgdmFsdWUgbm90IGVxdWFsIHRvIGl0c2VsZiB1bmRlciBgPT09YC5cbiAgICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xuICB9XG5cbiAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd25bXTtcbiAgICBpZiAoYS5sZW5ndGggIT09IGJBcnIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiQXJyW2ldLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgYk1hcCA9IGIgYXMgTWFwPHVua25vd24sIHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJNYXAuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICAgIGlmICghYk1hcC5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFkZWVwRXF1YWwodmFsdWUsIGJNYXAuZ2V0KGtleSksIGNvbXBhcmF0b3IpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBiU2V0ID0gYiBhcyBTZXQ8dW5rbm93bj47XG4gICAgaWYgKGEuc2l6ZSAhPT0gYlNldC5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhKSB7XG4gICAgICBpZiAoIWJTZXQuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gKGIgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICBjb25zdCBiUmUgPSBiIGFzIFJlZ0V4cDtcbiAgICByZXR1cm4gYS5zb3VyY2UgPT09IGJSZS5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYlJlLmZsYWdzO1xuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiAhKGEgaW5zdGFuY2VvZiBEYXRhVmlldykpIHtcbiAgICBjb25zdCBhQXJyID0gYSBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGNvbnN0IGJBcnIgPSBiIGFzIHVua25vd24gYXMgQXJyYXlMaWtlPG51bWJlcj47XG4gICAgaWYgKGFBcnIubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFBcnJbaV0gIT09IGJBcnJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgYUtleXMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgIWRlZXBFcXVhbChcbiAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgIChiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICBjb21wYXJhdG9yLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
|
|
1188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUE0Qkgsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxXQUFXLENBQWMsS0FBbUI7SUFDMUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBY0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFjLEtBQWM7SUFDdEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxHQUFHLElBQUksS0FBSyxZQUFZLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixVQUF5RCxFQUN6RCxPQUFpQztJQUVqQyxTQUFTLEtBQUssQ0FBQyxLQUFjLEVBQUUsSUFBbUI7UUFDaEQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2hFLElBQ0UsQ0FBQyxTQUFTLENBQ1AsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbEMsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbkMsVUFBVSxDQUNYLEVBQ0QsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlcGVuZGVuY3ktZnJlZSBvYmplY3QgKyBpdGVyYWJsZSB1dGlsaXRpZXMgYW5kIHRoZSBjYW5vbmljYWwgcmVwb3NpdG9yeVxuICogb3duZXIgZm9yIHN0YWJsZSBpZGVudGl0eSwgbG9vc2Ugc2NhbGFyIGNvZXJjaW9uLCByZWNvcmQgZ3VhcmRzLCBzZXF1ZW5jZXMsXG4gKiBhbmQgY29tbW9uIG9iamVjdCB0cmFuc2Zvcm1zLiBSZXVzZSB0aGVzZSBoZWxwZXJzIGFjcm9zcyBwYWNrYWdlcyBpbnN0ZWFkIG9mXG4gKiBhZGRpbmcgbG9jYWwgZXF1aXZhbGVudHMgd2l0aCBkaWZmZXJlbnQgZWRnZS1jYXNlIGJlaGF2aW9yLlxuICpcbiAqIFZhbHVlIGd1YXJkcyAvIGNvZXJjaW9ucyAvIHNoYXBlIHR5cGVzOiB7QGxpbmsgaXNSZWNvcmR9IG5hcnJvd3MgcGFyc2VkIEpTT05cbiAqIHRvIGEgcmVjb3JkLCB7QGxpbmsgdG9OdW1iZXJ9IGNvZXJjZXMgYSBoYW5kLXR5cGVkIG51bWVyYWwsIHtAbGluayB0b0Jvb2xlYW59XG4gKiBjb2VyY2VzIGxvb3NlIHRydXRoeS9mYWxzeSB2YWx1ZXMsIHtAbGluayB0b0R1cmF0aW9ufSBwYXJzZXMgYDFoMzBtYCAvXG4gKiBgMiBtaWxsaXNlY29uZHNgIHRvIG1pbGxpcywge0BsaW5rIHRvRGF0ZX0gY29lcmNlcyBhIGRhdGUvSVNPIHN0cmluZy9lcG9jaFxuICogbnVtYmVyL3JlbGF0aXZlIGR1cmF0aW9uIChgdG9EYXRlYCBhbmQgYHRvRHVyYXRpb25gIGZhbGwgYmFjayB0byBlYWNoIG90aGVyLCBzb1xuICogZWl0aGVyIGFjY2VwdHMgYm90aCByZWFkaW5ncyksIHtAbGluayBvcHRpb25hbH1cbiAqIHNwcmVhZHMgYSBmaWVsZCBvbmx5IHdoZW4gaXQgaXMgcHJlc2VudCwge0BsaW5rIGRlZXBFcXVhbH0gY29tcGFyZXNcbiAqIHN0cnVjdHVyYWxseSwge0BsaW5rIGlzU2VyaWFsaXphYmxlVmFsdWV9IHJlamVjdHMgYW55dGhpbmcgYSBKU09OIHJvdW5kIHRyaXBcbiAqIHdvdWxkIGxvc2Ugb3IgY29lcmNlLCB7QGxpbmsgdG9TdGFibGVLZXl9IGNhbm9uaWNhbGl6ZXMgYSB2YWx1ZSBzbyBhbiBpZGVudGl0eVxuICogY2FuIGJlIGRlcml2ZWQgZnJvbSBpdCwgYW5kIHtAbGluayBOYW1lTGlrZX0ve0BsaW5rIE5vbkZ1bmN0aW9uS2V5c30gZGVzY3JpYmVcbiAqIG9iamVjdCBzaGFwZXMuXG4gKlxuICogSXRlcmFibGUgaGVscGVyczoge0BsaW5rIGdlbmVyYXRvcn0gZmxhdHRlbnMgbWl4ZWQgYXJndW1lbnRzOyB7QGxpbmsgc2VxdWVuY2V9XG4gKiB3cmFwcyBzb3VyY2UocykgaW4gYSBsYXp5LCBgQXJyYXlgLWNvbXBhdGlibGUge0BsaW5rIFNlcXVlbmNlfS4gRXZlcnlcbiAqIHRyYW5zZm9ybS90ZXJtaW5hbCBpcyBhIHN0YW5kYWxvbmUgZnVuY3Rpb24gb3BlcmF0aW5nIG9uIHBsYWluIHtAbGlua1xuICogQ29udGFpbmVyfXMgKHNlZSB7QGxpbmsgbWFwfSwge0BsaW5rIGZpbHRlcn0sIHtAbGluayBncm91cH0sIC4uLik7IHRoZSB7QGxpbmtcbiAqIFNlcXVlbmNlfSBtZXRob2RzIGFyZSB0aGluIGZvcndhcmRlcnMgb3ZlciB0aGVtIHNvIHRoZSBzYW1lIGxvZ2ljIGJhY2tzIGJvdGhcbiAqIHRoZSBmcmVlLWZ1bmN0aW9uIGFuZCB0aGUgZmx1ZW50L2NoYWluZWQgc3R5bGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG4vKiogTGF6eSBzZXF1ZW5jZSBvdmVyIGl0ZXJhYmxlIHNvdXJjZShzKS4gU2VlIHtAbGluayBzZXF1ZW5jZX0uICovXG5leHBvcnQgdHlwZSBTZXF1ZW5jZTxUPiA9IFNlcXVlbmNlSW1wbDxUPjtcblxudHlwZSBTZXF1ZW5jZVNvdXJjZTxUPiA9XG4gIEl0ZXJhYmxlPFQ+IHwgUmVhZG9ubHlNYXA8dW5rbm93biwgVD4gfCBPbmVPck1hbnk8VD4gfCBFeHRyYWN0PFQsIHN0cmluZz4gfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgbm9uLXNjYWxhciB7QGxpbmsgSXRlcmFibGV9IC0gb25lIHRvIHRyZWF0IGFzIGEgY29sbGVjdGlvbiBvZiBlbGVtZW50c1xuICogcmF0aGVyIHRoYW4gYSBzY2FsYXIuIHtAbGluayBpc0NvbnRhaW5lcn0gbmFycm93cyB0byB0aGlzLCBleGNsdWRpbmcgc3RyaW5ncyxcbiAqIGBTdHJpbmdgL2BSZWdFeHBgIG9iamVjdHMsIGFuZCBmdW5jdGlvbnMuIHtAbGluayBDb2xsZWN0aW9ufSBpcyB0aGUgZWFnZXJseS1cbiAqIHNpemVkIHN1YnNldC4gVGhlIGVsZW1lbnQgZGVmYXVsdHMgdG8gYHVua25vd25gIHNvIGFueSBgQ29sbGVjdGlvbmAgaXNcbiAqIGFzc2lnbmFibGUgdG8gYSBiYXJlIGBDb250YWluZXJgLlxuICovXG5leHBvcnQgdHlwZSBDb250YWluZXI8VCA9IHVua25vd24+ID0gSXRlcmFibGU8VD47XG5cbi8qKlxuICogQSBidWlsdC1pbiwgZWFnZXJseS1zaXplZCB7QGxpbmsgQ29udGFpbmVyfTogYW4ge0BsaW5rIEFycmF5fSwge0BsaW5rIFNldH0sIG9yXG4gKiB7QGxpbmsgTWFwfSAod2hvc2UgKnZhbHVlcyogYXJlIGBUYCAtIGEgTWFwIGl0ZXJhdGVzIGBba2V5LCB2YWx1ZV1gIGVudHJpZXMsXG4gKiBzbyBpdHMgZWxlbWVudCB0eXBlIGRpZmZlcnMsIGJ1dCBpdHMgdmFsdWUgdHlwZSBpcyBgVGApLiBBbGwgc2hhcmUgYSBjaGVhcFxuICogZW1wdGluZXNzIGNoZWNrICh7QGxpbmsgaXNFbXB0eX0pLlxuICovXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uPFQ+ID0gUmVhZG9ubHlBcnJheTxUPiB8IFJlYWRvbmx5U2V0PFQ+IHwgUmVhZG9ubHlNYXA8dW5rbm93biwgVD47XG5cbi8qKiBOb24tZW1wdHkgdHVwbGUgdXNlZCB3aGVyZSBhbiBBUEkgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHZhbHVlLiAqL1xuZXhwb3J0IHR5cGUgT25lT3JNYW55PFQ+ID0gW1QsIC4uLlRbXV07XG5cbi8qKiBOYXJyb3cgYSByZWFkb25seSBhcnJheSB0byBhIG5vbi1lbXB0eSB7QGxpbmsgT25lT3JNYW55fSB0dXBsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09uZU9yTWFueTxUID0gdW5rbm93bj4odmFsdWU6IHJlYWRvbmx5IFRbXSk6IHZhbHVlIGlzIE9uZU9yTWFueTxUPiB7XG4gIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwO1xufVxuXG4vKiogQSBzb3VyY2UgYWNjZXB0ZWQgYnkgYSB2YXJpYWRpYyBvcDogYSB7QGxpbmsgQ29udGFpbmVyfSBvZiBgVGAsIG9yIG5vdGhpbmcuICovXG50eXBlIFNvdXJjZTxUPiA9IENvbnRhaW5lcjxUPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRWxlbWVudCB0eXBlIG9mIGEge0BsaW5rIGdyb3VwfSBidWNrZXQgYXJyYXk6IHdoZW4gdGhlIHByZWRpY2F0ZSBgUGAgaXMgYSB0eXBlXG4gKiBndWFyZCAoYHZhbHVlIGlzIFNgKSwgdGhlIGJ1Y2tldCBpcyBuYXJyb3dlZCB0byBgUyAmIFRgOyBvdGhlcndpc2UgaXQgc3RheXMgYFRgLlxuICovXG50eXBlIEdyb3VwVmFsdWU8VCwgUD4gPSBQIGV4dGVuZHMgKHZhbHVlOiBhbnksIC4uLnJlc3Q6IGFueVtdKSA9PiB2YWx1ZSBpcyBpbmZlciBTID8gUyAmIFQgOiBUO1xuXG4vKiogQSBtYXAgb2YgZ3JvdXAgbmFtZSAtPiBwcmVkaWNhdGUsIGFzIGFjY2VwdGVkIGJ5IHtAbGluayBncm91cH0uICovXG50eXBlIEdyb3VwUHJlZGljYXRlczxUPiA9IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbj47XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYSB7QGxpbmsgQ29sbGVjdGlvbn06IGFuIHtAbGluayBBcnJheX0sIHtAbGluayBTZXR9LCBvclxuICoge0BsaW5rIE1hcH0uIE5hcnJvd3MgYHZhbHVlYCBzbyBpdHMgZWxlbWVudC92YWx1ZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYFRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgKG9yIE1hcCB2YWx1ZSkgdHlwZSBhc3NlcnRlZCBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMgYHRydWVgIChuYXJyb3dpbmcgYHZhbHVlYCB0byB7QGxpbmsgQ29sbGVjdGlvbn08YFRgPikgZm9yIGFcbiAqICAgYnVpbHQtaW4gYXJyYXkvc2V0L21hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sbGVjdGlvbjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb2xsZWN0aW9uPFQ+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0IHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwO1xufVxuXG4vKipcbiAqIGB0cnVlYCB3aGVuIGEge0BsaW5rIENvbGxlY3Rpb259IGhhcyBubyBlbGVtZW50cy4gVXNlcyBgbGVuZ3RoYCBmb3IgYXJyYXlzXG4gKiBhbmQgYHNpemVgIGZvciB7QGxpbmsgU2V0fS97QGxpbmsgTWFwfS5cbiAqXG4gKiBAcGFyYW0gY29sbGVjdGlvbiAtIFRoZSBhcnJheSwgc2V0LCBvciBtYXAgdG8gdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb248dW5rbm93bj4gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9LFxuKTogYm9vbGVhbiB7XG4gIGZ1bmN0aW9uIHZpc2l0KHZhbHVlOiB1bmtub3duLCBzZWVuPzogU2V0PHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoc2Vlbj8uaGFzKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgICBzZWVuPy5hZGQodmFsdWUpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPT09IDAgfHwgKHNlZW4gPyB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zaXplID09PSAwIHx8IChzZWVuID8gWy4uLnZhbHVlXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdmFsdWUuc2l6ZSA9PT0gMCB8fFxuICAgICAgICAgIChzZWVuID8gWy4uLnZhbHVlLnZhbHVlcygpXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChzZWVuKSB7XG4gICAgICAgIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+IHZpc2l0KCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSwgc2VlbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB2aXNpdChjb2xsZWN0aW9uLCBvcHRpb25zPy5yZWN1cnNpdmUgPyBuZXcgU2V0KCkgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzb3VyY2UgdG8gYW4gaXRlcmFibGUgb2YgaXRzIGBUYCB2YWx1ZXMsIHNvIE1hcHMgYXJlIHRyZWF0ZWRcbiAqIHVuaWZvcm1seSB3aXRoIGFycmF5cy9zZXRzOiBhIHtAbGluayBNYXB9IHlpZWxkcyBpdHMgKnZhbHVlcyogKG1hdGNoaW5nXG4gKiB7QGxpbmsgQ29sbGVjdGlvbn0ncyB2YWx1ZS10eXBlZCBgVGApLCBhbnkgb3RoZXIgaXRlcmFibGUgeWllbGRzIGl0c2VsZi4gVGhpc1xuICogaXMgd2hhdCB7QGxpbmsgc2VxdWVuY2V9IGNvbnN1bWVzLCBzbyBhIGBNYXBgIGNvbnRyaWJ1dGVzIHZhbHVlcyBldmVyeXdoZXJlXG4gKiByYXRoZXIgdGhhbiBgW2tleSwgdmFsdWVdYCBlbnRyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVzPFQ+KHNvdXJjZTogSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPik6IEl0ZXJhYmxlPFQ+IHtcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIE1hcCA/IHNvdXJjZS52YWx1ZXMoKSA6IChzb3VyY2UgYXMgSXRlcmFibGU8VD4pO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIGEge0BsaW5rIENvbnRhaW5lcn0gLSBhbiBpdGVyYWJsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29sbGVjdGlvblxuICogcmF0aGVyIHRoYW4gYSBzY2FsYXIuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGV4Y2x1ZGVzIHZhbHVlcyB0aGF0IGFyZSB0ZWNobmljYWxseSBpdGVyYWJsZSBidXQgc2hvdWxkIGJlXG4gKiB0cmVhdGVkIGFzIHNjYWxhcnMgaGVyZSAtIHN0cmluZ3MsIGBTdHJpbmdgL2BSZWdFeHBgIG9iamVjdHMsIGFuZCBmdW5jdGlvbnMgLVxuICogc28gYSBsb25lIHN0cmluZyBpcyBuZXZlciBzcHJlYWQgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rlci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgYXNzZXJ0ZWQgZm9yIHRoZSBpdGVyYWJsZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgKG5hcnJvd2luZyBgdmFsdWVgIHRvIHtAbGluayBDb250YWluZXJ9PGBUYD4pIGZvciBhIG5vbi1zdHJpbmdcbiAqICAgaXRlcmFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRhaW5lcjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb250YWluZXI8VD4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiZcbiAgICAhKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSAmJlxuICAgICEodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApICYmXG4gICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgW1N5bWJvbC5pdGVyYXRvcl0/OiB1bmtub3duIH0pW1N5bWJvbC5pdGVyYXRvcl0gPT09IFwiZnVuY3Rpb25cIlxuICApO1xufVxuXG5mdW5jdGlvbiBzZXF1ZW5jZVNvdXJjZXM8VD4oLi4uc291cmNlczogU2VxdWVuY2VTb3VyY2U8VD5bXSk6IEl0ZXJhYmxlPFQ+W10ge1xuICBjb25zdCBzb3VyY2VJdGVyYWJsZXM6IEl0ZXJhYmxlPFQ+W10gPSBbXTtcbiAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fCAoaXNDb2xsZWN0aW9uKHNvdXJjZSkgJiYgaXNFbXB0eShzb3VyY2UpKSkgY29udGludWU7XG4gICAgc291cmNlSXRlcmFibGVzLnB1c2goaXNDb250YWluZXI8VD4oc291cmNlKSA/IHZhbHVlcyhzb3VyY2UpIDogW3NvdXJjZSBhcyBUXSk7XG4gIH1cbiAgcmV0dXJuIHNvdXJjZUl0ZXJhYmxlcztcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBuZXN0ZWQgYXJyYXlzIGZvciB7QGxpbmsgZmxhdH0uIE5vbi1hcnJheSB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgYVxuICogc2luZ2xlLWVsZW1lbnQgaXRlcmFibGU7IGRlcHRoIGRlY3JlbWVudHMgcGVyIGFycmF5IGxldmVsLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuVmFsdWUodmFsdWU6IHVua25vd24sIGRlcHRoOiBudW1iZXIpOiBJdGVyYWJsZTx1bmtub3duPiB7XG4gIGlmIChkZXB0aCA+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+W10pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIGlmIChpbmRleCA8IDApIHJldHVybiB0b0FycmF5KHNyYykuYXQoaW5kZXgpO1xuICBsZXQgaSA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgaWYgKGkrKyA9PT0gaW5kZXgpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogTm9ybWFsaXplIG9uZSB2YWx1ZSBvciBhbiBleGlzdGluZyB2YWx1ZSBsaXN0IGludG8gYSB2YWx1ZSBsaXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvT25lT3JNYW55PFQ+KGlucHV0OiBUIHwgT25lT3JNYW55PFQ+KTogT25lT3JNYW55PFQ+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpID8gaW5wdXQgOiBbaW5wdXRdO1xufVxuXG4vKipcbiAqIE1hdGVyaWFsaXplcyB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMgaW50byBhIG5ldyBhcnJheS4gQ29uc3VtZXMgc2luZ2xlLXBhc3NcbiAqIHNvdXJjZXMuXG4gKlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheTxUPiguLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IHJlYWRvbmx5IFRbXSB7XG4gIHJldHVybiBbLi4uc2VxdWVuY2UoLi4uc291cmNlcyldO1xufVxuXG4vKipcbiAqIExhenkgaXRlcmFibGUgc2VxdWVuY2Ugd2l0aCBgQXJyYXlgLWNvbXBhdGlibGUgdHJhbnNmb3JtcyBhbmQgdGVybWluYWxcbiAqIG1ldGhvZHMuIFNpbmdsZS1wYXNzIGJ5IGRlZmF1bHQ7IGNhbGwge0BsaW5rIFNlcXVlbmNlSW1wbC5jYWNoZX0gdG8gcmV0YWluXG4gKiBwdWxsZWQgdmFsdWVzIGZvciByZS1pdGVyYXRpb24uIEJ1aWx0IGZvciBnZW5lcmF0b3JzIGFuZCBvdGhlciBzb3VyY2VzIHdoZXJlXG4gKiBhIHNlY29uZCBwYXNzIGlzIG5vdCBndWFyYW50ZWVkLlxuICpcbiAqIFRoZSBtZXRob2RzIGZvcndhcmQgdG8gdGhlIHN0YW5kYWxvbmUgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgLSBzZWUgZWFjaFxuICogbWV0aG9kJ3MgYEBzZWVgIC0gc28gdGhlIGZyZWUtZnVuY3Rpb24gYW5kIGNoYWluZWQgc3R5bGVzIHNoYXJlIG9uZSBpbXBsLlxuICovXG5jbGFzcyBTZXF1ZW5jZUltcGw8VD4ge1xuICBwcml2YXRlIGl0ZXJhdG9yPzogSXRlcmF0b3I8VD47XG4gIHByaXZhdGUgZXhoYXVzdGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc291cmNlOiBJdGVyYWJsZTxUPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ1ZmZlcjogVFtdIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiB7IHJlYWRvbmx5IGV4aGF1c3RlZD86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLmV4aGF1c3RlZCA9IHN0YXRlLmV4aGF1c3RlZCA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNhY2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQWR2YW5jZSB0aGUgdW5kZXJseWluZyBzb3VyY2Ugb25jZSwgY3JlYXRpbmcgdGhlIGl0ZXJhdG9yIG9uIGZpcnN0IHVzZS4gKi9cbiAgcHJpdmF0ZSBwdWxsKCk6IEl0ZXJhdG9yUmVzdWx0PFQ+IHtcbiAgICB0aGlzLml0ZXJhdG9yID8/PSB0aGlzLnNvdXJjZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpO1xuICB9XG5cbiAgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFQ+IHtcbiAgICBpZiAoIXRoaXMuY2FjaGluZykge1xuICAgICAgaWYgKHRoaXMuZXhoYXVzdGVkKSByZXR1cm47XG4gICAgICBmb3IgKGxldCBuZXh0ID0gdGhpcy5wdWxsKCk7ICFuZXh0LmRvbmU7IG5leHQgPSB0aGlzLnB1bGwoKSkge1xuICAgICAgICB5aWVsZCBuZXh0LnZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy5leGhhdXN0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYWNoZWQ6IGl0ZXJhdGUgbGlrZSBhIGxpc3QuIEFsd2F5cyByZXBsYXkgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdGFydCxcbiAgICAgIC8vIGV4dGVuZGluZyBpdCBmcm9tIHRoZSBzb3VyY2Ugb24gZGVtYW5kIHVudGlsIGV4aGF1c3RlZC4gQSBicm9rZW4gbG9vcFxuICAgICAgLy8gbGVhdmVzIHRoZSBidWZmZXIgaW50YWN0LCBzbyB0aGUgbmV4dCBpdGVyYXRpb24gc3RhcnRzIG92ZXIgZnJvbSB0aGVcbiAgICAgIC8vIGJlZ2lubmluZy5cbiAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyITtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChpbmRleCA8IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICB5aWVsZCBidWZmZXJbaW5kZXgrK10hO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmV4aGF1c3RlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5wdWxsKCk7XG4gICAgICAgIGlmIChuZXh0LmRvbmUpIHtcbiAgICAgICAgICB0aGlzLmV4aGF1c3RlZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlci5wdXNoKG5leHQudmFsdWUpO1xuICAgICAgICB5aWVsZCBuZXh0LnZhbHVlO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBtYXB9ICovXG4gIG1hcDxVPihjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVKTogU2VxdWVuY2U8VT4ge1xuICAgIHJldHVybiBtYXAodGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbHRlcn0gKi9cbiAgZmlsdGVyPFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFNlcXVlbmNlPFM+O1xuICBmaWx0ZXIocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBTZXF1ZW5jZTxUPjtcbiAgZmlsdGVyKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiBmaWx0ZXIodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBub25OdWxsfSAqL1xuICBub25OdWxsKCk6IFNlcXVlbmNlPE5vbk51bGxhYmxlPFQ+PiB7XG4gICAgcmV0dXJuIG5vbk51bGwodGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmxhdE1hcH0gKi9cbiAgZmxhdE1hcDxVPihjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVIHwgUmVhZG9ubHlBcnJheTxVPik6IFNlcXVlbmNlPFU+IHtcbiAgICByZXR1cm4gZmxhdE1hcCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmxhdH0gKi9cbiAgZmxhdChkZXB0aCA9IDEpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGZsYXQoZGVwdGgsIHRoaXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGRpc3RpbmN0fSAqL1xuICBkaXN0aW5jdCgpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGRpc3RpbmN0KHRoaXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGNvbmNhdH0gKi9cbiAgY29uY2F0KC4uLml0ZW1zOiByZWFkb25seSAoVCB8IFJlYWRvbmx5QXJyYXk8VD4pW10pOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGNvbmNhdCh0aGlzLCAuLi5pdGVtcyk7XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IHlpZWxkcyB0aGlzIHNlcXVlbmNlIGZvbGxvd2VkIGJ5IGVhY2ggaXRlcmFibGUgYHNvdXJjZWAgaW4gb3JkZXIuXG4gICAqIExpa2Uge0BsaW5rIGNvbmNhdH0sIGJ1dCBmb3IgaXRlcmFibGUgc291cmNlcyAoZ2VuZXJhdG9ycywgb3RoZXIgc2VxdWVuY2VzLFxuICAgKiBgU2V0YCwgYE1hcGAsIGV0Yy4pIHJhdGhlciB0aGFuIHNjYWxhciB2YWx1ZXMgb3IgYXJyYXlzLiBBIHtAbGluayBNYXB9XG4gICAqIHNvdXJjZSBjb250cmlidXRlcyBpdHMgdmFsdWVzLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBzZXF1ZW5jZX1cbiAgICovXG4gIGpvaW4oLi4uc291cmNlczogcmVhZG9ubHkgU2VxdWVuY2VTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgICBjb25zdCBzb3VyY2VJdGVyYWJsZXMgPSBzZXF1ZW5jZVNvdXJjZXModGhpcywgLi4uc291cmNlcyk7XG4gICAgcmV0dXJuIHNvdXJjZUl0ZXJhYmxlcy5sZW5ndGggPT09IDEgPyB0aGlzIDogc2VxdWVuY2UoLi4uc291cmNlSXRlcmFibGVzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayB0YWtlfSAqL1xuICB0YWtlKGNvdW50OiBudW1iZXIpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIHRha2UoY291bnQsIHRoaXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGdyb3VwfSAqL1xuICBncm91cDxHIGV4dGVuZHMgR3JvdXBQcmVkaWNhdGVzPFQ+PihwcmVkaWNhdGVzOiBHKTogeyBbSyBpbiBrZXlvZiBHXTogR3JvdXBWYWx1ZTxULCBHW0tdPltdIH0ge1xuICAgIHJldHVybiBncm91cChwcmVkaWNhdGVzLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY2FjaGVkLCByZS1pdGVyYWJsZSB2aWV3IG9mIHRoaXMgc2VxdWVuY2UuIEFuIGFscmVhZHktY2FjaGluZ1xuICAgKiBzZXF1ZW5jZSByZXR1cm5zIGl0c2VsZjsgb3RoZXJ3aXNlIHRoaXMgb25lLXBhc3Mgc2VxdWVuY2UgaXMgd3JhcHBlZCBpbiBhXG4gICAqIG5ldyBpbnN0YW5jZSB0aGF0IHJldGFpbnMgcHVsbGVkIHZhbHVlcy4gSXRlcmF0ZSB0aGUgcmV0dXJuZWQgaW5zdGFuY2UsIG5vdFxuICAgKiB0aGUgb3JpZ2luYWwsIHRvIGF2b2lkIGNvbXBldGluZyBmb3IgdGhlIHNhbWUgc2luZ2xlLXBhc3Mgc291cmNlLlxuICAgKi9cbiAgY2FjaGUoKTogU2VxdWVuY2U8VD4ge1xuICAgIHJldHVybiB0aGlzLmNhY2hpbmcgPyB0aGlzIDogbmV3IFNlcXVlbmNlSW1wbCh0aGlzLCBbXSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZH0gKi9cbiAgZmluZDxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiBTIHwgdW5kZWZpbmVkO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZDtcbiAgZmluZChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmaW5kKHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZExhc3R9ICovXG4gIGZpbmRMYXN0PFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFMgfCB1bmRlZmluZWQ7XG4gIGZpbmRMYXN0KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZDtcbiAgZmluZExhc3QocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZmluZExhc3QodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kSW5kZXh9ICovXG4gIGZpbmRJbmRleChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGZpbmRJbmRleCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRMYXN0SW5kZXh9ICovXG4gIGZpbmRMYXN0SW5kZXgocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBmaW5kTGFzdEluZGV4KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgc29tZX0gKi9cbiAgc29tZShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzb21lKHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZXZlcnl9ICh0aGUgYFMgZXh0ZW5kcyBUYCBvdmVybG9hZCBuYXJyb3dzIGF0IGNvbXBpbGUgdGltZSBvbmx5KS4gKi9cbiAgZXZlcnk8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogdGhpcyBpcyBTZXF1ZW5jZTxTPjtcbiAgZXZlcnkocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuO1xuICBldmVyeShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmVyeSh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZvckVhY2h9ICovXG4gIGZvckVhY2goY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGZvckVhY2godGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGF0fSAqL1xuICBhdChpbmRleDogbnVtYmVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGF0KGluZGV4LCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRlcmlhbGl6ZSB0aGUgc2VxdWVuY2UgaW50byBhIG5ldyBhcnJheS4gQ29uc3VtZXMgYSBzaW5nbGUtcGFzcyBzb3VyY2U7IGFcbiAgICogY2FjaGVkLCBleGhhdXN0ZWQgc2VxdWVuY2UgY29waWVzIGl0cyBidWZmZXIgZGlyZWN0bHkuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHRvQXJyYXl9XG4gICAqL1xuICB0b0FycmF5KCk6IHJlYWRvbmx5IFRbXSB7XG4gICAgaWYgKHRoaXMuY2FjaGluZyAmJiB0aGlzLmV4aGF1c3RlZCkgcmV0dXJuIFsuLi50aGlzLmJ1ZmZlciFdO1xuICAgIHJldHVybiB0b0FycmF5KHRoaXMpO1xuICB9XG59XG5cbi8qKiBTaGFyZWQgZW1wdHkgc2VxdWVuY2Ugc2luZ2xldG9uLCByZXVzYWJsZSBmb3IgYW55IGVsZW1lbnQgdHlwZS4gKi9cbmNvbnN0IGVtcHR5U2VxdWVuY2U6IFNlcXVlbmNlPG5ldmVyPiA9IG5ldyBTZXF1ZW5jZUltcGwoW10sIHVuZGVmaW5lZCwge1xuICBleGhhdXN0ZWQ6IHRydWUsXG59KTtcblxuLyoqXG4gKiBXcmFwIG9uZSBvciBtb3JlIGl0ZXJhYmxlIGBzb3VyY2VzYCBpbiBhIHNpbmdsZSBsYXp5IHtAbGluayBTZXF1ZW5jZX0sXG4gKiBpdGVyYXRlZCBpbiBvcmRlci4gYG51bGxgL2B1bmRlZmluZWRgIHNvdXJjZXMgYXJlIHNraXBwZWQ7IHdoZW4gbm90aGluZ1xuICogcmVtYWlucyAoZXZlcnkgc291cmNlIG9taXR0ZWQsIGBudWxsYCwgYHVuZGVmaW5lZGAsIG9yIGFuIGVtcHR5IGFycmF5IC9cbiAqIGBTZXRgIC8gYE1hcGApLCB7QGxpbmsgZW1wdHlTZXF1ZW5jZX0gaXMgcmV0dXJuZWQuIFRoZSByZXN1bHQgaXMgc2luZ2xlLXBhc3NcbiAqIC0gY2FsbCBgLmNhY2hlKClgIHRvIG1ha2UgaXQgcmUtaXRlcmFibGUuXG4gKlxuICogQSB7QGxpbmsgTWFwfSBzb3VyY2UgY29udHJpYnV0ZXMgaXRzIHZhbHVlcyAoc2VlIHtAbGluayB2YWx1ZXN9KSwgY29uc2lzdGVudFxuICogd2l0aCB7QGxpbmsgQ29sbGVjdGlvbn0ncyB2YWx1ZS10eXBlZCBgVGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCB0eXBlIG9mIHRoZSBzZXF1ZW5jZS5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gSXRlcmFibGVzIHRvIGNvbmNhdGVuYXRlLCBpbiBvcmRlciAoYE1hcGAgc291cmNlcyB1c2UgdmFsdWVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlPFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNlcXVlbmNlU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIC8vIFNraXAgbnVsbGlzaCBzb3VyY2VzIGFuZCBrbm93bi1lbXB0eSBjb2xsZWN0aW9uczsgbm9ybWFsaXplIHRoZSByZXN0IHRvXG4gIC8vIHRoZWlyIHZhbHVlcyBzbyBhIE1hcCBjb250cmlidXRlcyB2YWx1ZXMgcmF0aGVyIHRoYW4gW2tleSwgdmFsdWVdIGVudHJpZXMuXG4gIGNvbnN0IHNvdXJjZUl0ZXJhYmxlcyA9IHNlcXVlbmNlU291cmNlcyguLi5zb3VyY2VzKTtcbiAgaWYgKHNvdXJjZUl0ZXJhYmxlcy5sZW5ndGggPT09IDApIHJldHVybiBlbXB0eVNlcXVlbmNlIGFzIFNlcXVlbmNlPFQ+O1xuICAvLyBSZXVzZSBhbiBleGlzdGluZyBzZXF1ZW5jZSBhcy1pcyByYXRoZXIgdGhhbiByZS13cmFwcGluZyBpdC5cbiAgaWYgKHNvdXJjZUl0ZXJhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCBvbmx5ID0gc291cmNlSXRlcmFibGVzWzBdITtcbiAgICByZXR1cm4gb25seSBpbnN0YW5jZW9mIFNlcXVlbmNlSW1wbCA/IChvbmx5IGFzIFNlcXVlbmNlPFQ+KSA6IG5ldyBTZXF1ZW5jZUltcGwob25seSwgdW5kZWZpbmVkKTtcbiAgfVxuICByZXR1cm4gbmV3IFNlcXVlbmNlSW1wbChcbiAgICB7XG4gICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZUl0ZXJhYmxlcykgeWllbGQqIHNvdXJjZTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB1bmRlZmluZWQsXG4gICk7XG59XG5cbi8qKlxuICogRmxhdHRlbnMgYSBtaXggb2Ygc2luZ2xlIGl0ZW1zIGFuZCBpdGVyYWJsZXMgaW50byBvbmUgbGF6eSB7QGxpbmsgR2VuZXJhdG9yfS5cbiAqXG4gKiBBcmd1bWVudHMgYXJlIGVtaXR0ZWQgaW4gb3JkZXI6IGBudWxsYC9gdW5kZWZpbmVkYCBhcmUgc2tpcHBlZCwgbm9uLXN0cmluZ1xuICogaXRlcmFibGVzIChwZXIge0BsaW5rIGlzQ29udGFpbmVyfSkgYXJlIHlpZWxkZWQgZWxlbWVudC1ieS1lbGVtZW50LCBhbmRcbiAqIGFueXRoaW5nIGVsc2UgKGluY2x1ZGluZyBzdHJpbmdzKSBpcyB5aWVsZGVkIGFzIGEgc2luZ2xlIGl0ZW0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRWxlbWVudCB0eXBlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IuXG4gKiBAcGFyYW0gaXRlbXMgLSBJdGVtcyBhbmQvb3IgaXRlcmFibGVzIHRvIGZsYXR0ZW4sIGluIG9yZGVyLlxuICogQHJldHVybnMgQSBnZW5lcmF0b3Igb3ZlciB0aGUgZmxhdHRlbmVkIGVsZW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGdlbmVyYXRvcjxUPihcbiAgLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgSXRlcmFibGU8VD4gfCBudWxsIHwgdW5kZWZpbmVkKVtdXG4pOiBHZW5lcmF0b3I8VD4ge1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBpZiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoaXNDb250YWluZXIoaXRlbSkpIHtcbiAgICAgIHlpZWxkKiBpdGVtO1xuICAgIH0gZWxzZSB7XG4gICAgICB5aWVsZCBpdGVtO1xuICAgIH1cbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE9iamVjdCB2YWx1ZSBndWFyZHMsIGNvZXJjaW9ucywgYW5kIHN0cnVjdHVyYWwgZXF1YWxpdHlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTWluaW1hbCBzaGFwZSBmb3Igb2JqZWN0cyB0aGF0IGV4cG9zZSBhbiBvcHRpb25hbCBgbmFtZWAgKGUuZy4gQXBwS2l0IHBsdWdpbnMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYW1lTGlrZSB7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKiBQcm9wZXJ0eSBrZXlzIG9mIGBUYCB3aG9zZSB2YWx1ZXMgYXJlIG5vdCBjYWxsYWJsZS4gKi9cbmV4cG9ydCB0eXBlIE5vbkZ1bmN0aW9uS2V5czxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IG5ldmVyIDogSztcbn1ba2V5b2YgVF07XG5cbi8qKlxuICogTmFycm93IGB2YWx1ZWAgdG8gYSBwbGFpbiAobm9uLWFycmF5KSBvYmplY3QuIFVzZSBhcyBhIHR5cGUgZ3VhcmRcbiAqIGJlZm9yZSBpbmRleGluZyBpbnRvIC8gbXV0YXRpbmcgcGFyc2VkIEpTT04gc28gdGhlIGFjY2VzcyBpc1xuICogdHlwZS1zYWZlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpZiAoaXNSZWNvcmQocGFyc2VkKSkgcGFyc2VkLmZvbyA9IDE7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbi8qKiBBIEpTT04gc2NhbGFyLiBgdW5kZWZpbmVkYCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50IC0gYEpTT04uc3RyaW5naWZ5YCBkcm9wcyBpdC4gKi9cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVByaW1pdGl2ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuXG4vKipcbiAqIEFueSB2YWx1ZSB0aGF0IHN1cnZpdmVzIGEgYEpTT04uc3RyaW5naWZ5YC9gSlNPTi5wYXJzZWAgcm91bmQgdHJpcCB1bmNoYW5nZWQuXG4gKlxuICogVXNlIGl0IGluc3RlYWQgb2YgYHVua25vd25gIG9uIGEgYm91bmRhcnkgdGhhdCB3aWxsIHNlcmlhbGl6ZSBpdHMgaW5wdXQgLSBhXG4gKiBtZXNzYWdlIHBheWxvYWQsIGEgY2FjaGUgZW50cnksIGEgY29uZmlnIGJsb2Igd3JpdHRlbiB0byBkaXNrIC0gc28gYSBgRGF0ZWAsXG4gKiBhIGBNYXBgLCBvciBhIGNsYXNzIGluc3RhbmNlIGlzIGEgY29tcGlsZSBlcnJvciBhdCB0aGUgY2FsbCBzaXRlIHJhdGhlciB0aGFuIGFcbiAqIHJlY2VpdmVyIHF1aWV0bHkgZ2V0dGluZyBhIHN0cmluZyBvciBge31gLiB7QGxpbmsgaXNTZXJpYWxpemFibGVWYWx1ZX0gaXMgdGhlXG4gKiBydW50aW1lIGhhbGYsIGZvciBpbnB1dCB0aGUgY29tcGlsZXIgY2Fubm90IHZvdWNoIGZvci5cbiAqL1xuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlVmFsdWUgPVxuICBTZXJpYWxpemFibGVQcmltaXRpdmUgfCBTZXJpYWxpemFibGVWYWx1ZVtdIHwgeyBba2V5OiBzdHJpbmddOiBTZXJpYWxpemFibGVWYWx1ZSB9O1xuXG4vKipcbiAqIFRydWUgd2hlbiBgdmFsdWVgIHN1cnZpdmVzIGEgSlNPTiByb3VuZCB0cmlwIHdpdGggbm8gbG9zcyBhbmQgbm8gY29lcmNpb24uXG4gKlxuICogU3RyaWN0ZXIgdGhhbiBcImBKU09OLnN0cmluZ2lmeWAgZGlkIG5vdCB0aHJvd1wiLCBiZWNhdXNlIHRoYXQgc3VjY2VlZHMgd2hpbGVcbiAqIHNpbGVudGx5IENIQU5HSU5HIHRoZSB2YWx1ZTogYSBgRGF0ZWAgYmVjb21lcyBhIHN0cmluZywgYE5hTmAgYW5kIGBJbmZpbml0eWBcbiAqIGJlY29tZSBgbnVsbGAsIGEgYE1hcGAgYmVjb21lcyBge31gLCBhbmQgYHVuZGVmaW5lZGAgZGlzYXBwZWFycyBmcm9tIGFuIG9iamVjdFxuICogb3IgdHVybnMgaW50byBgbnVsbGAgaW5zaWRlIGFuIGFycmF5LiBFYWNoIG9mIHRob3NlIHJlYWNoZXMgdGhlIGZhciBzaWRlIGFzXG4gKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGF0IHdhcyBzZW50LCBzbyBhbGwgb2YgdGhlbSBhcmUgcmVqZWN0ZWQgaGVyZS5cbiAqXG4gKiBSZWplY3RlZDogbm9uLWZpbml0ZSBudW1iZXJzLCBgdW5kZWZpbmVkYCwgZnVuY3Rpb25zLCBzeW1ib2xzLCBiaWdpbnRzLCBjbGFzc1xuICogaW5zdGFuY2VzIGFuZCBhbnl0aGluZyBlbHNlIHdpdGggYSBwcm90b3R5cGUgb3RoZXIgdGhhbiBgT2JqZWN0LnByb3RvdHlwZWAgb3JcbiAqIGBudWxsYCAoYERhdGVgLCBgTWFwYCwgYFNldGAsIGBSZWdFeHBgLCBgQnVmZmVyYCksIGFuZCBhbnkgb2JqZWN0IGdyYXBoXG4gKiBjb250YWluaW5nIGEgY3ljbGUuIEFjY2VwdGVkOiBzdHJpbmdzLCBib29sZWFucywgYG51bGxgLCBmaW5pdGUgbnVtYmVycywgcGxhaW5cbiAqIG9iamVjdHMsIGFycmF5cywgYW5kIG5lc3RpbmdzIG9mIHRob3NlLlxuICpcbiAqIE5hcnJvd3MgdG8ge0BsaW5rIFNlcmlhbGl6YWJsZVZhbHVlfSByYXRoZXIgdGhhbiBhc3NlcnRpbmcsIHNvIGl0IGFsc28gc2VydmVzXG4gKiBhcyB0aGUgdmFsaWRhdG9yIGZvciB1bnRydXN0ZWQgaW5wdXQgLSBhIHJlcXVlc3QgYm9keSwgYSBkZWNvZGVkIG5vdGlmaWNhdGlvblxuICogcGF5bG9hZCAtIHdoZXJlIHRoZSBhbnN3ZXIgc2hvdWxkIGJlIGEgNDAwIGFuZCBub3QgYSB0aHJvdy4gTmV2ZXIgdGhyb3dzLlxuICpcbiAqIERpc3RpbmN0IGZyb20ge0BsaW5rIGRlZXBFcXVhbH0ncyBub3Rpb24gb2YgY29tcGFyYWJsZTogdGhhdCBvbmUgSEFORExFU1xuICogYERhdGVgL2BNYXBgL2BTZXRgIHN0cnVjdHVyYWxseSwgd2hpbGUgdGhpcyBvbmUgcmVqZWN0cyB0aGVtIHByZWNpc2VseSBiZWNhdXNlXG4gKiBKU09OIGNhbm5vdCBjYXJyeSB0aGVtLlxuICpcbiAqIEBwYXJhbSBhbmNlc3RvcnMgQ3ljbGUtZGV0ZWN0aW9uIHNldCBmb3IgdGhlIHJlY3Vyc2l2ZSB3YWxrLiBJbnRlcm5hbDsgY2FsbGVyc1xuICogICBwYXNzIG9uZSB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaXNTZXJpYWxpemFibGVWYWx1ZSh7IGE6IFsxLCBcInhcIiwgbnVsbF0gfSk7IC8vIHRydWVcbiAqIGlzU2VyaWFsaXphYmxlVmFsdWUoeyBhdDogbmV3IERhdGUoKSB9KTsgICAgLy8gZmFsc2UgLSB3b3VsZCBiZWNvbWUgYSBzdHJpbmdcbiAqIGlzU2VyaWFsaXphYmxlVmFsdWUoTnVtYmVyLk5hTik7ICAgICAgICAgICAgLy8gZmFsc2UgLSB3b3VsZCBiZWNvbWUgbnVsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJpYWxpemFibGVWYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIGFuY2VzdG9yczogU2V0PG9iamVjdD4gPSBuZXcgU2V0KCksXG4pOiB2YWx1ZSBpcyBTZXJpYWxpemFibGVWYWx1ZSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHRydWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgcHJvdG90eXBlICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChhbmNlc3RvcnMuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGFuY2VzdG9ycy5hZGQodmFsdWUpO1xuICBjb25zdCB2YWxpZCA9IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgPyB2YWx1ZS5ldmVyeSgoZW50cnkpID0+IGlzU2VyaWFsaXphYmxlVmFsdWUoZW50cnksIGFuY2VzdG9ycykpXG4gICAgOiBPYmplY3QudmFsdWVzKHZhbHVlKS5ldmVyeSgoZW50cnkpID0+IGlzU2VyaWFsaXphYmxlVmFsdWUoZW50cnksIGFuY2VzdG9ycykpO1xuICBhbmNlc3RvcnMuZGVsZXRlKHZhbHVlKTtcbiAgcmV0dXJuIHZhbGlkO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBzdHJpbmcgZm9yIGEgc3RydWN0dXJlZCB2YWx1ZSwgZm9yIGRlcml2aW5nIGEgU1RBQkxFIElERU5USVRZIGZyb21cbiAqIGl0IC0gYW4gYWR2aXNvcnktbG9jayBpZCwgYSBjaGFubmVsIG5hbWUsIGEgY2FjaGUga2V5LlxuICpcbiAqIFRoZSBndWFyYW50ZWUgaXMgdHdvLXdheSwgd2hpY2ggaXMgd2hhdCBtYWtlcyBpdCBzYWZlIHRvIGhhc2g6IHZhbHVlcyB0aGF0XG4gKiBzaG91bGQgc2hhcmUgYW4gaWRlbnRpdHkgcHJvZHVjZSB0aGUgc2FtZSBzdHJpbmcgKG9iamVjdCBrZXkgb3JkZXIgZG9lcyBub3RcbiAqIG1hdHRlciksIGFuZCB2YWx1ZXMgdGhhdCBzaG91bGQgbm90IGFyZSBuZXZlciBjb25mbGF0ZWQuIEV2ZXJ5IHRva2VuIGNhcnJpZXNcbiAqIGl0cyB0eXBlLCBzbyBgMWAgYW5kIGBcIjFcImAgZGlmZmVyOyBhIHN0cmluZyBjYXJyaWVzIGl0cyBsZW5ndGgsIHNvXG4gKiBgW1wiYVwiLCBcImJjXCJdYCBhbmQgYFtcImFiXCIsIFwiY1wiXWAgZGlmZmVyOyBhcnJheXMga2VlcCBvcmRlciB3aGlsZSBvYmplY3Qga2V5c1xuICogYXJlIHNvcnRlZC5cbiAqXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGNhbm5vdCBkbyB0aGlzIGpvYiAtIGtleSBvcmRlciBsZWFrcyBpbiwgYHVuZGVmaW5lZGAgdmFuaXNoZXMsXG4gKiBgMWAgYW5kIGBcIjFcImAgY29sbGlkZSBhZnRlciBxdW90aW5nIGlzIHN0cmlwcGVkLCBhbmQgYSBjeWNsZSB0aHJvd3MgYVxuICogYFR5cGVFcnJvcmAgbmFtaW5nIG5laXRoZXIgdGhlIHZhbHVlIG5vciB0aGUgY2FsbGVyJ3MgaW50ZW50LlxuICpcbiAqIERlbGliZXJhdGVseSBzdHJpY3Qgd2hlcmUgYSBzaWxlbnQgYW5zd2VyIHdvdWxkIGJlIGEgV1JPTkcgaWRlbnRpdHkgcmF0aGVyXG4gKiB0aGFuIGEgbWlzc2luZyBvbmUsIHNpbmNlIHR3byBjYWxsZXJzIGRpc2FncmVlaW5nIGFib3V0IGEgbG9jayBvciBhIGNoYW5uZWwgaXNcbiAqIGludmlzaWJsZSB1bnRpbCBpdCBjb3JydXB0cyBzb21ldGhpbmcuIFRocm93cyBgVHlwZUVycm9yYCBvbiBhIGN5Y2xlLCBvbiBhXG4gKiBub24tZmluaXRlIG51bWJlciAoYE5hTmAgaXMgbm90IGVxdWFsIHRvIGl0c2VsZiwgc28gaXQgY2Fubm90IGhhdmUgYSBzdGFibGVcbiAqIGlkZW50aXR5KSwgYW5kIG9uIGEgYGZ1bmN0aW9uYCBvciBgc3ltYm9sYCAobm8gbWVhbmluZ2Z1bCB2YWx1ZSBpZGVudGl0eSkuXG4gKiBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIGFyZSBhY2NlcHRlZCBhcyBkaXN0aW5jdCB0b2tlbnMuXG4gKlxuICogYERhdGVgIGlzIGNhbm9uaWNhbGl6ZWQgYnkgaW5zdGFudCwgdW5saWtlIHRoZSBoYXNoIGNhbm9uaWNhbGl6ZXIgaW5cbiAqIGAuL2hhc2gudHNgLCB3aGljaCBmb2xkcyBldmVyeSBgRGF0ZWAgb250byBvbmUgdG9rZW4uIFByZWZlciB0aGlzIGZ1bmN0aW9uIHdoZW5cbiAqIGRpc3RpbmN0bmVzcyBpcyBhIGNvcnJlY3RuZXNzIHJlcXVpcmVtZW50OyBwcmVmZXIgYGhhc2guZm52SGFzaGAgd2hlbiBhIHNob3J0LFxuICogY29sbGlzaW9uLXRvbGVyYW50IGRpZ2VzdCBpcyBlbm91Z2guXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNhbm9uaWNhbGl6ZS5cbiAqIEBwYXJhbSBzZWVuIC0gQ3ljbGUtZGV0ZWN0aW9uIHNldCBmb3IgdGhlIHJlY3Vyc2l2ZSB3YWxrLiBJbnRlcm5hbDsgY2FsbGVyc1xuICogICBwYXNzIG9uZSB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogdG9TdGFibGVLZXkoeyBhOiAxLCBiOiAyIH0pID09PSB0b1N0YWJsZUtleSh7IGI6IDIsIGE6IDEgfSk7IC8vIHRydWVcbiAqIHRvU3RhYmxlS2V5KDEpICE9PSB0b1N0YWJsZUtleShcIjFcIik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU3RhYmxlS2V5KHZhbHVlOiB1bmtub3duLCBzZWVuOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSk6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIFwibnVsbFwiO1xuXG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgLy8gTGVuZ3RoLXByZWZpeGVkIHNvIGNvbmNhdGVuYXRlZCBuZWlnaGJvdXJzIGNhbm5vdCBiZSByZS1zcGxpdFxuICAgICAgLy8gZGlmZmVyZW50bHk6IGBbXCJhXCIsXCJiY1wiXWAgYW5kIGBbXCJhYlwiLFwiY1wiXWAgbXVzdCBub3QgYWdyZWUuXG4gICAgICByZXR1cm4gYHN0cmluZzoke3ZhbHVlLmxlbmd0aH06JHt2YWx1ZX1gO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gYGJvb2xlYW46JHt2YWx1ZX1gO1xuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgIHJldHVybiBgYmlnaW50OiR7dmFsdWV9YDtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdGFibGUga2V5cyByZXF1aXJlIGZpbml0ZSBudW1iZXJzXCIpO1xuICAgICAgLy8gYC0wID09PSAwYCBidXQgdGhleSBzdHJpbmdpZnkgZGlmZmVyZW50bHksIHNvIHBpY2sgb25lIHNwZWxsaW5nLlxuICAgICAgcmV0dXJuIGBudW1iZXI6JHtPYmplY3QuaXModmFsdWUsIC0wKSA/IFwiLTBcIiA6IHZhbHVlfWA7XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RhYmxlIGtleXMgY2Fubm90IGNvbnRhaW4gY3ljbGVzXCIpO1xuICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGBkYXRlOiR7dmFsdWUudG9JU09TdHJpbmcoKX1gO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gYGFycmF5Olske3ZhbHVlLm1hcCgoaXRlbSkgPT4gdG9TdGFibGVLZXkoaXRlbSwgc2VlbikpLmpvaW4oXCIsXCIpfV1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgIC8vIFNvcnRlZCBieSBjYW5vbmljYWwgZm9ybSwgc28gaW5zZXJ0aW9uIG9yZGVyIGRvZXMgbm90IGxlYWsuXG4gICAgICAgICAgcmV0dXJuIGBzZXQ6WyR7Wy4uLnZhbHVlXVxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gdG9TdGFibGVLZXkoaXRlbSwgc2VlbikpXG4gICAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgICAuam9pbihcIixcIil9XWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cmllczogSXRlcmFibGU8W3Vua25vd24sIHVua25vd25dPiA9XG4gICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBNYXAgPyB2YWx1ZSA6IE9iamVjdC5lbnRyaWVzKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlIGluc3RhbmNlb2YgTWFwID8gXCJtYXBcIiA6IFwib2JqZWN0XCJ9Onske1suLi5lbnRyaWVzXVxuICAgICAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiBgJHt0b1N0YWJsZUtleShrZXksIHNlZW4pfT0ke3RvU3RhYmxlS2V5KGl0ZW0sIHNlZW4pfWApXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICAgIC5qb2luKFwiLFwiKX19YDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNlZW4uZGVsZXRlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHN0YWJsZSBrZXkgdHlwZTogJHt0eXBlb2YgdmFsdWV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBgeyBba2V5XTogdmFsdWUgfWAgd2hlbiBgdmFsdWVgIGlzIHByZXNlbnQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYCAtIHNvIGFuXG4gKiBhYnNlbnQgb3B0aW9uYWwgZmllbGQgc3RheXMgQUJTRU5UIHdoZW4gc3ByZWFkLCByYXRoZXIgdGhhbiBiZWNvbWluZyBhblxuICogZXhwbGljaXQgYHVuZGVmaW5lZGAgdGhhdCBgZXhhY3RPcHRpb25hbFByb3BlcnR5VHlwZXNgIHJlamVjdHMuXG4gKlxuICogU3BlbGxpbmcgdGhhdCBpbmxpbmUgY29zdHMgYSByZXBlYXRlZCwgZG91YmxlLWV2YWx1YXRlZCB0ZXJuYXJ5IHBlciBmaWVsZFxuICogKGAuLi4odiA/IHsga2V5OiB2IH0gOiB7fSlgKSwgd2hpY2ggaXMgaG93IGNvbmZpZyByZXNvbHZlcnMgZW5kIHVwIGNvbXB1dGluZ1xuICogdGhlIHNhbWUgdmFsdWUgdHdpY2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIHJldHVybiB7XG4gKiAgIC4uLm9wdGlvbmFsKFwiYXBwSWRcIiwgY29uZmlndXJlZEFwcElkKSxcbiAqICAgLi4ub3B0aW9uYWwoXCJlbmRwb2ludFwiLCBjb25maWcuZW5kcG9pbnQpLFxuICogfTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsPEsgZXh0ZW5kcyBzdHJpbmcsIFY+KFxuICBrZXk6IEssXG4gIHZhbHVlOiBWIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IFJlY29yZDxLLCBWPiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogKHsgW2tleV06IHZhbHVlIH0gYXMgUmVjb3JkPEssIFY+KTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdG9OdW1iZXJ9LlxuICpcbiAqIEJvdGggc3dpdGNoZXMgdHVybiBPRkYgYSBsZW5pZW5jeSB0aGF0IGlzIGhlbHBmdWwgZm9yIGEgaGFuZC10eXBlZCBzZXR0aW5nIGJ1dFxuICogd3Jvbmcgd2hlbiB0aGUgc3RyaW5nJ3Mgb3RoZXIgY2hhcmFjdGVycyBjYXJyeSBtZWFuaW5nLiB7QGxpbmsgdG9EYXRlfSBhbmRcbiAqIHtAbGluayB0b0R1cmF0aW9ufSBkaXNhYmxlIGJvdGgsIHNpbmNlIGEgc3BhY2UgaW5zaWRlIGAyMDI2IDA4IDAyYCBpcyBhIGZpZWxkXG4gKiBzZXBhcmF0b3IgYW5kIGEgcGVyY2VudCBoYXMgbm8gZXBvY2ggb3IgbWlsbGlzZWNvbmQgcmVhZGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb051bWJlck9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciBpbnRlcm5hbCBkaWdpdC1ncm91cCBzZXBhcmF0b3JzIGFyZSBzdHJpcHBlZCwgc28gYFwiMSwwMDBcImAgYW5kXG4gICAqIGBcIjEgMDAwXCJgIHJlYWQgYXMgYDEwMDBgLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIFBsYWNlbWVudCBpcyBub3QgdmFsaWRhdGVkIHdoZW4gZW5hYmxlZCwgc28gYFwiMSwwMCwwXCJgIGFsc28gcmVhZHMgYXMgYDEwMDBgLlxuICAgKiBEaXNhYmxlIGl0IHdoZW4gd2hpdGVzcGFjZSBvciBhIGNvbW1hIGRlbGltaXRzIEZJRUxEUyByYXRoZXIgdGhhbiBncm91cGluZ1xuICAgKiBkaWdpdHMsIGJlY2F1c2Ugc3RyaXBwaW5nIHRoZW0gc2lsZW50bHkgZnVzZXMgdGhvc2UgZmllbGRzIGludG8gb25lIG51bWJlci5cbiAgICovXG4gIHNlcGFyYXRvcnM/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciBhIHRyYWlsaW5nIHBlcmNlbnQgc2lnbiBkaXZpZGVzIHRoZSByZXN1bHQgYnkgYDEwMGAsIHNvIGBcIjI1JVwiYCByZWFkc1xuICAgKiBhcyBgMC4yNWAuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogRGlzYWJsZSBpdCB3aGVyZSBhIHBlcmNlbnRhZ2UgaGFzIG5vIG1lYW5pbmcsIHNvIGBcIjI1JVwiYCBpcyBhIG1pc3MgcmF0aGVyXG4gICAqIHRoYW4gYSBudW1iZXIgdHdvIG9yZGVycyBvZiBtYWduaXR1ZGUgYXdheSBmcm9tIHdoYXQgdGhlIHRleHQgc2F5cy5cbiAgICovXG4gIHBlcmNlbnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIG51bWVyaWMgdmFsdWUgdG8gYSByZWFsLCBGSU5JVEUgYG51bWJlcmAsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXRcbiAqIGNhcnJpZXMgbm8gbnVtZXJpYyBtZWFuaW5nLlxuICpcbiAqIFRoZSBvbmUgcGxhY2UgYSBoYW5kLXR5cGVkIG51bWJlciBpcyBpbnRlcnByZXRlZCwgYWxvbmdzaWRlIHtAbGluayB0b0Jvb2xlYW59LFxuICoge0BsaW5rIHRvRGF0ZX0sIGFuZCB7QGxpbmsgdG9EdXJhdGlvbn0uIFJlYWNoIGZvciBpdCBpbnN0ZWFkIG9mIGBOdW1iZXIoeClgIG9yIGFcbiAqIGhhbmQtcm9sbGVkIG51bWVyaWMgcmVnZXg6IGJhcmUgYE51bWJlcmAgbWFwcyBgXCJcImAsIGBudWxsYCwgYFtdYCwgYW5kXG4gKiB3aGl0ZXNwYWNlIHRvIGAwYCBhbmQgYW55dGhpbmcgZWxzZSB0byBgTmFOYCwgc28gYSBjYWxsZXIgaGFzIHRvIHJlLWNoZWNrIHRoZVxuICogcmVzdWx0IGV2ZXJ5IHRpbWUsIGFuZCBhZCBob2MgcmVnZXhlcyB0ZW5kIHRvIGRyaWZ0IGluIHdoYXQgdGhleSBhY2NlcHQuXG4gKlxuICogQWNjZXB0czogYSBmaW5pdGUgYG51bWJlcmA7IGEgYGJpZ2ludGA7IG9yIGEgZGVjaW1hbCBzdHJpbmcgd2l0aCBhbiBvcHRpb25hbFxuICogbGVhZGluZyBzaWduLCBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UsIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIHNpZ24sXG4gKiBkaWdpdC1ncm91cCBzZXBhcmF0b3JzIChgXCIxLDAwMFwiYCwgYFwiMSAwMDBcImApLCBhIGJhcmUgZnJhY3Rpb24gKGBcIi41XCJgKSwgYVxuICogdHJhaWxpbmcgcG9pbnQgKGBcIjEuXCJgKSwgc2NpZW50aWZpYyBub3RhdGlvbiAoYFwiMWUzXCJgKSwgYW5kIGFuIG9wdGlvbmFsXG4gKiB0cmFpbGluZyBwZXJjZW50IHNpZ24gKGBcIjI1JVwiYCwgYFwiMS41ICVcImApLiBBIHRyYWlsaW5nIGAlYCBkaXZpZGVzIHRoZSBwYXJzZWRcbiAqIHZhbHVlIGJ5IGAxMDBgLCBzbyBgXCIyNSVcImAgYmVjb21lcyBgMC4yNWAuXG4gKlxuICogU2VwYXJhdG9ycyBhcmUgc3RyaXBwZWQgd2l0aG91dCB2YWxpZGF0aW5nIHRoZWlyIHBsYWNlbWVudCwgc28gYFwiMSwwMCwwXCJgIHJlYWRzXG4gKiBhcyBgMTAwMGA7IHRoaXMgaXMgYSBjb2VyY2lvbiBmb3IgaGFuZC10eXBlZCBjb25maWd1cmF0aW9uLCBub3QgYSBsb2NhbGUtYXdhcmVcbiAqIHZhbGlkYXRvci4gQW55dGhpbmcgZWxzZSwgaW5jbHVkaW5nIGBOYU5gLCBgSW5maW5pdHlgLCBhbiBlbXB0eSBvclxuICogd2hpdGVzcGFjZS1vbmx5IHN0cmluZywgYG51bGxgLCBgdW5kZWZpbmVkYCwgYSBib29sZWFuLCBtdWx0aXBsZSBzaWducyxcbiAqIG1hbGZvcm1lZCBleHBvbmVudHMsIG1pc3BsYWNlZCBwZXJjZW50IHNpZ25zLCBvciBgXCIxMnB4XCJgLCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgcmF0aGVyIHRoYW4gdGhyb3dpbmcsIG1hdGNoaW5nIHRoZSBvdGhlciBjb2VyY2lvbnMsIHNvIGl0XG4gKiBjb21wb3NlcyBuYXR1cmFsbHkgd2l0aCBgPz9gIGZhbGxiYWNrcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogdG9OdW1iZXIoXCIxLDAwMFwiKTsgICAvLyAxMDAwXG4gKiB0b051bWJlcihcIiAtMi41IFwiKTsgIC8vIC0yLjVcbiAqIHRvTnVtYmVyKFwiMWUzXCIpOyAgICAgLy8gMTAwMFxuICogdG9OdW1iZXIoXCIxMi41ICVcIik7ICAvLyAwLjEyNVxuICogdG9OdW1iZXIoXCJcIik7ICAgICAgICAvLyB1bmRlZmluZWQgIChOdW1iZXIoXCJcIikgd291bGQgYmUgMClcbiAqIHRvTnVtYmVyKFwiMTJweFwiKTsgICAgLy8gdW5kZWZpbmVkXG4gKiB0b051bWJlcihcIjEgMDAwXCIsIHsgc2VwYXJhdG9yczogZmFsc2UgfSk7IC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IFRvTnVtYmVyT3B0aW9ucyA9IHt9KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgcmV0dXJuIHRvTnVtYmVyKE51bWJlcih2YWx1ZSksIG9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIFN0cmlwIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UsIHdoaXRlc3BhY2UgYWZ0ZXIgYSBsZWFkaW5nIHNpZ24sIGRpZ2l0LWdyb3VwXG4gICAgLy8gc2VwYXJhdG9ycyAoYm90aCBgLGAgYW5kIHRoZSBzcGFjZSBpbiBgXCIxIDAwMFwiYCksIGxlYXZpbmcgYSBiYXJlIG51bWVyYWwgZm9yXG4gICAgLy8gdGhlIHNoYXBlIHRlc3QgYmVsb3cgdG8gYWNjZXB0IG9yIHJlamVjdC5cbiAgICBjb25zdCB0ZXh0ID0gdmFsdWUucmVwbGFjZShcbiAgICAgIG9wdGlvbnMuc2VwYXJhdG9ycyA9PT0gZmFsc2UgPyAvKF5cXHMrfFxccyskKS9nIDogLyheXFxzK3xcXHMrJHwoPzw9XlsrLV0pXFxzK3woPzw9XFxkKVxccyt8LCkvZyxcbiAgICAgIFwiXCIsXG4gICAgKTtcbiAgICBpZiAodGV4dCkge1xuICAgICAgY29uc3QgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC9eKFsrLV0/KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbKy1dP1xcZCspPykoJSk/JC9pKTtcbiAgICAgIGlmIChtYXRjaCAmJiAhKG1hdGNoWzJdICYmIG9wdGlvbnMucGVyY2VudCA9PT0gZmFsc2UpKSB7XG4gICAgICAgIGNvbnN0IG51bWJlciA9IE51bWJlcihtYXRjaFsxXSk7XG4gICAgICAgIHJldHVybiB0b051bWJlcihtYXRjaFsyXSA/IG51bWJlciAvIDEwMCA6IG51bWJlciwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEEgYm94ZWQgYE51bWJlcmAsIG9yIGFueXRoaW5nIHdpdGggYSBudW1lcmljIGB0b1N0cmluZ2AuIGBTdHJpbmcodmFsdWUpYFxuICAgIC8vIHJvdXRlcyBpdCBiYWNrIHRocm91Z2ggdGhlIHN0cmluZyBicmFuY2gsIHdoaWNoIHJlamVjdHMgd2hhdCBpcyBub3QgbnVtZXJpYy5cbiAgICByZXR1cm4gdG9OdW1iZXIoU3RyaW5nKHZhbHVlKSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYSBsb29zZSBib29sZWFuLWlzaCB2YWx1ZSB0byBhIHJlYWwgYGJvb2xlYW5gLCBvciBgdW5kZWZpbmVkYFxuICogd2hlbiBpdCBjYW4ndCBiZSBpbnRlcnByZXRlZC4gUmVjb2duaXplcyBgdHJ1ZWAvYHRgL2BvbmAvYDFgL2B5ZXNgL2B5YFxuICogYW5kIHRoZWlyIG5lZ2F0aXZlcyAoY2FzZS0gYW5kIHdoaXRlc3BhY2UtaW5zZW5zaXRpdmUgZm9yIHN0cmluZ3MpLCBhc1xuICogd2VsbCBhcyB0aGUgbnVtYmVycyBgMWAgYW5kIGAwYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHZhbHVlID09PSBcInRydWVcIiB8fFxuICAgICAgdmFsdWUgPT0gXCJ0XCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm9uXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIjFcIiB8fFxuICAgICAgdmFsdWUgPT09IFwieWVzXCIgfHxcbiAgICAgIHZhbHVlID09PSBcInlcIlxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHZhbHVlID09PSBcImZhbHNlXCIgfHxcbiAgICAgIHZhbHVlID09IFwiZlwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJvZmZcIiB8fFxuICAgICAgdmFsdWUgPT09IFwiMFwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJub1wiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJuXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgaWYgKHZhbHVlID09PSAxKSByZXR1cm4gdHJ1ZTtcbiAgICBlbHNlIGlmICh2YWx1ZSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTGFyZ2VzdCB2YWx1ZSByZWFkIGFzIGVwb2NoIFNFQ09ORFMgcmF0aGVyIHRoYW4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIGAxZTExYCBzZWNvbmRzIGlzIHRoZSB5ZWFyIDUxMzggYW5kIGAxZTExYCBtcyBpcyAxOTczLTAzLTAzLCBzbyBldmVyeSB2YWx1ZSBhXG4gKiBjYWxsZXIgcmVhbGlzdGljYWxseSBtZWFucyBhcyBtaWxsaXMgaXMgYWJvdmUgdGhlIGxpbmUgYW5kIGV2ZXJ5IHZhbHVlIHRoZXlcbiAqIG1lYW4gYXMgc2Vjb25kcyBpcyBiZWxvdyBpdC4gVGhlIGFtYmlndWl0eSBpcyB1bmF2b2lkYWJsZSAtIHRoZSB0d28gdW5pdHMgc2hhcmVcbiAqIGEgbnVtYmVyIGxpbmUgLSBzbyB0aGUgc3BsaXQgaXMgcGxhY2VkIHdoZXJlIG5laXRoZXIgc2lkZSBoYXMgYSBwbGF1c2libGVcbiAqIGNsYWltLlxuICovXG5jb25zdCBTRUNPTkRTX0NFSUxJTkcgPSAxZTExO1xuXG4vKipcbiAqIEEgbnVtYmVyIGZvciB7QGxpbmsgdG9EYXRlfSBhbmQge0BsaW5rIHRvRHVyYXRpb259LCByZWFkIHdpdGggbm9uZSBvZlxuICoge0BsaW5rIHRvTnVtYmVyfSdzIHN0cmluZyBsZW5pZW5jaWVzLlxuICpcbiAqIEJvdGggbGVuaWVuY2llcyBhcmUgYWN0aXZlbHkgaGFybWZ1bCBoZXJlLiBBIHNwYWNlIG9yIGNvbW1hIHNlcGFyYXRlcyBGSUVMRFMgaW5cbiAqIGEgZGF0ZSAoYDIwMjYgMDggMDJgIHdvdWxkIGZ1c2UgaW50byB0aGUgZXBvY2ggYDIwMjYwODAyYCksIGFuZCBhIHBlcmNlbnRhZ2UgaGFzXG4gKiBubyByZWFkaW5nIGFzIGFuIGluc3RhbnQgb3IgYSBsZW5ndGggb2YgdGltZSwgc28gYDI1JWAgbXVzdCBiZSBhIG1pc3MgcmF0aGVyXG4gKiB0aGFuIGAyNTBtc2AuXG4gKi9cbmZ1bmN0aW9uIHRvQmFyZU51bWJlcih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0b051bWJlcih2YWx1ZSwgeyBzZXBhcmF0b3JzOiBmYWxzZSwgcGVyY2VudDogZmFsc2UgfSk7XG59XG5cbi8qKlxuICogTWlsbGlzZWNvbmRzIHBlciB1bml0LCBrZXllZCBieSBTSU5HVUxBUiBhbGlhcy4ge0BsaW5rIHRvRHVyYXRpb259IHJldHJpZXMgYVxuICogbG9va3VwIHdpdGhvdXQgYSB0cmFpbGluZyBgc2AsIHNvIGV2ZXJ5IHBsdXJhbCBzcGVsbGluZyBpcyBjb3ZlcmVkIHdpdGhvdXRcbiAqIGxpc3RpbmcgaXQgKGBtc2AgaXMgYWxyZWFkeSBzaW5ndWxhciwgaGVuY2UgaXRzIG93biBlbnRyeSkuXG4gKlxuICogYG1gIGlzIE1JTlVURVMgYW5kIG1vbnRocyBuZWVkIGBtb2AsIGZvbGxvd2luZyB0aGUgbmVhci11bml2ZXJzYWwgY29udmVudGlvblxuICogKGBtc2AsIGBkYXRlYCwgY3JvbiBwcm9zZSk7IG1vbnRoIGFuZCB5ZWFyIGFyZSBjYWxlbmRhciBhcHByb3hpbWF0aW9ucyAoMzAgL1xuICogMzY1IGRheXMpIGJlY2F1c2UgYSBkdXJhdGlvbiBoYXMgbm8gYW5jaG9yIGRhdGUgdG8gYmUgZXhhY3QgYWdhaW5zdC5cbiAqL1xuY29uc3QgRFVSQVRJT05fVU5JVFM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW21zOiBudW1iZXIsIGFsaWFzZXM6IHJlYWRvbmx5IHN0cmluZ1tdXT4gPSBbXG4gIFsxLCBbXCJtc1wiLCBcIm1zZWNcIiwgXCJtaWxsaXNlY29uZFwiLCBcIm1pbGxpXCJdXSxcbiAgWzEwMDAsIFtcInNcIiwgXCJzZWNcIiwgXCJzZWNvbmRcIl1dLFxuICBbNjBfMDAwLCBbXCJtXCIsIFwibWluXCIsIFwibWludXRlXCJdXSxcbiAgWzNfNjAwXzAwMCwgW1wiaFwiLCBcImhyXCIsIFwiaG91clwiXV0sXG4gIFs4Nl80MDBfMDAwLCBbXCJkXCIsIFwiZGF5XCJdXSxcbiAgWzYwNF84MDBfMDAwLCBbXCJ3XCIsIFwid2tcIiwgXCJ3ZWVrXCJdXSxcbiAgWzJfNTkyXzAwMF8wMDAsIFtcIm1vXCIsIFwibW9uXCIsIFwibW9udGhcIl1dLFxuICBbMzFfNTM2XzAwMF8wMDAsIFtcInlcIiwgXCJ5clwiLCBcInllYXJcIl1dLFxuXTtcblxuY29uc3QgRFVSQVRJT05fVU5JVF9NUzogUmVhZG9ubHlNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcChcbiAgRFVSQVRJT05fVU5JVFMuZmxhdE1hcCgoW21zLCBhbGlhc2VzXSkgPT4gYWxpYXNlcy5tYXAoKGFsaWFzKSA9PiBbYWxpYXMsIG1zXSBhcyBjb25zdCkpLFxuKTtcblxuLyoqIE9uZSBgPGFtb3VudD48dW5pdD5gIHRlcm0gaW5zaWRlIGEgZHVyYXRpb24gc3RyaW5nLiAqL1xuY29uc3QgRFVSQVRJT05fVEVSTSA9IC8oWystXT8pKFxcZCsoPzpcXC5cXGQrKT8pXFxzKihbYS16XSspL2c7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHRvRGF0ZX0uXG4gKlxuICogVGhlIG1pcnJvciBvZiB7QGxpbmsgVG9EdXJhdGlvbk9wdGlvbnN9OiBlYWNoIGZ1bmN0aW9uIGNhbiBmYWxsIGJhY2sgdG8gdGhlXG4gKiBvdGhlciwgc28gZWFjaCBoYXMgb25lIHN3aXRjaCB0dXJuaW5nIHRoYXQgZmFsbGJhY2sgb2ZmLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvRGF0ZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciBhIHtAbGluayB0b0R1cmF0aW9ufSBleHByZXNzaW9uIGlzIHJlYWQgYXMgYW4gaW5zdGFudCByZWxhdGl2ZSB0b1xuICAgKiBub3csIHNvIGAtN2RgIGFuZCBgNyBkYXlzIGFnb2AgYmVjb21lIGBub3cgLSA3IGRheXNgLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIFNldCBgZmFsc2VgIHdoZW4gdGhlIHZhbHVlIG11c3QgYmUgYSByZWFsIGRhdGUgYW5kIGEgcmVsYXRpdmUgZXhwcmVzc2lvblxuICAgKiBzaG91bGQgYmUgYSBtaXNzIC0gYSBzdG9yZWQgdGltZXN0YW1wLCBhIHVzZXItc3VwcGxpZWQgYERhdGVgIGhlYWRlciwgYW5cbiAgICogYGV4cGlyZXNfYXRgIGZpZWxkIC0gc2luY2UgYSBkdXJhdGlvbiBzaWxlbnRseSByZXNvbHZpbmcgYWdhaW5zdCB0aGUgY3VycmVudFxuICAgKiBjbG9jayBtYWtlcyB0aGUgc2FtZSBpbnB1dCBtZWFuIHNvbWV0aGluZyBkaWZmZXJlbnQgb24gZXZlcnkgY2FsbC4gQWxzbyB3aGF0XG4gICAqIHtAbGluayB0b0R1cmF0aW9ufSBwYXNzZXMgd2hlbiBpdCByZWN1cnNlcywgc28gdGhlIHR3byBjYW5ub3QgYm91bmNlIGEgdmFsdWVcbiAgICogYmV0d2VlbiB0aGVtIGZvcmV2ZXIuXG4gICAqL1xuICBwYXJzZUR1cmF0aW9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdG9EdXJhdGlvbn0uXG4gKlxuICogVGhlIG1pcnJvciBvZiB7QGxpbmsgVG9EYXRlT3B0aW9uc306IGVhY2ggZnVuY3Rpb24gY2FuIGZhbGwgYmFjayB0byB0aGUgb3RoZXIsXG4gKiBzbyBlYWNoIGhhcyBvbmUgc3dpdGNoIHR1cm5pbmcgdGhhdCBmYWxsYmFjayBvZmYuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9EdXJhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciBhIHtAbGluayB0b0RhdGV9IHZhbHVlIGlzIHJlYWQgYXMgdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSBub3csIHNvXG4gICAqIGAyMDI2LTA4LTAyYCBiZWNvbWVzIGhvd2V2ZXIgbG9uZyB1bnRpbCAob3Igc2luY2UpIHRoYXQgaW5zdGFudC4gRGVmYXVsdHMgdG9cbiAgICogYHRydWVgLlxuICAgKlxuICAgKiBTZXQgYGZhbHNlYCB3aGVuIG9ubHkgYSBsZW5ndGggb2YgdGltZSBpcyBtZWFuaW5nZnVsIC0gYSB0aW1lb3V0LCBhIHBvbGxcbiAgICogaW50ZXJ2YWwsIGEgY2FjaGUgVFRMIC0gYmVjYXVzZSBhIGRhdGUgd291bGQgb3RoZXJ3aXNlIHlpZWxkIGEgcGxhdXNpYmxlIGJ1dFxuICAgKiB3cm9uZyBudW1iZXIgdGhhdCBhbHNvIGRyaWZ0cyB3aXRoIHRoZSBjbG9jay4gQWxzbyB3aGF0IHtAbGluayB0b0RhdGV9IHBhc3Nlc1xuICAgKiB3aGVuIGl0IHJlY3Vyc2VzLlxuICAgKi9cbiAgcGFyc2VEYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYSBsb29zZSBkdXJhdGlvbiB0byBNSUxMSVNFQ09ORFMsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2FuJ3QgYmVcbiAqIGludGVycHJldGVkLlxuICpcbiAqIERlbGliZXJhdGVseSBsZW5pZW50LCBiZWNhdXNlIHRoZXNlIHZhbHVlcyBhcmUgdHlwZWQgYnkgaGFuZCBpbnRvIGVudiB2YXJzLFxuICogQ0xJIGZsYWdzLCBhbmQgY29uZmlnIGZpbGVzOiB3aGl0ZXNwYWNlIGJldHdlZW4gYW1vdW50IGFuZCB1bml0IGlzIG9wdGlvbmFsIGFuZFxuICogdW5saW1pdGVkLCB1bml0cyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgcGx1cmFscyBhbmQgdGhlIGNvbW1vbiBhYmJyZXZpYXRpb25zIGFyZVxuICogZXF1aXZhbGVudCAoYDJtc2AgPT09IGAyIG1pbGxpc2Vjb25kc2AsIGAxaGAgPT09IGAxIGhyYCA9PT0gYDEgSG91cmApLCBgYW5kYCBhbmRcbiAqIHRob3VzYW5kcyBzZXBhcmF0b3JzIGFyZSBpZ25vcmVkIChgMSw1MDAgbXNgLCBgMSBob3VyIGFuZCAzMCBtaW51dGVzYCksIGFuZFxuICogdGVybXMgY29tcG9zZSAoYDFoMzBtYCkuIEEgcGxhaW4gYG51bWJlcmAgcGFzc2VzIHRocm91Z2ggYXMgbWlsbGlzZWNvbmRzLlxuICpcbiAqIFNpZ25zIGFyZSBzdXBwb3J0ZWQgc28gYSBkdXJhdGlvbiBjYW4gZXhwcmVzcyBhbiBPRkZTRVQgcmF0aGVyIHRoYW4gb25seSBhXG4gKiBsZW5ndGg6IGEgbGVhZGluZyBgLWAgKG9yIGEgdHJhaWxpbmcgYGFnb2ApIG1ha2VzIHRoZSByZXN1bHQgbmVnYXRpdmUsIGFuZCBhblxuICogdW5zaWduZWQgdGVybSBpbmhlcml0cyB0aGUgcHJldmlvdXMgdGVybSdzIHNpZ24sIHNvIGAtMWgzMG1gIGlzIC05MCBtaW51dGVzXG4gKiByYXRoZXIgdGhhbiAtNjAgKyAzMC4ge0BsaW5rIHRvRGF0ZX0gdXNlcyB0aGF0IHRvIHR1cm4gYC03ZGAgLyBgNyBkYXlzIGFnb2BcbiAqIGludG8gYW4gaW5zdGFudCByZWxhdGl2ZSB0byBub3cuXG4gKlxuICogQW4gVU5LTk9XTiB1bml0IGZhaWxzIHRoZSB3aG9sZSBwYXJzZSByYXRoZXIgdGhhbiBiZWluZyBza2lwcGVkIC0gYDEgZm9ydG5pZ2h0YFxuICogcmV0dXJuaW5nIGAxYCBzaWxlbnRseSB3b3VsZCBiZSB3b3JzZSB0aGFuIHJldHVybmluZyBub3RoaW5nIC0gd2hpY2ggaXMgYWxzb1xuICogd2hhdCBrZWVwcyB7QGxpbmsgdG9EYXRlfSBmcm9tIG1pc3Rha2luZyBgMSBKYW4gMjAyNmAgZm9yIGEgZHVyYXRpb24uXG4gKlxuICogQSB2YWx1ZSB0aGF0IGlzIG5vdCBhIGR1cmF0aW9uIGF0IGFsbCBpcyBvZmZlcmVkIHRvIHtAbGluayB0b0RhdGV9IGFuZCwgd2hlbiBpdFxuICogSVMgYSBkYXRlLCByZWFkIGFzIHRoZSBzaWduZWQgb2Zmc2V0IGZyb20gbm93IChgZGF0ZSAtIG5vd2ApLCB3aGljaCBtYWtlcyB0aGVcbiAqIHR3byBmdW5jdGlvbnMgaW52ZXJzZXM6IGEgcGFzdCBpbnN0YW50IGlzIG5lZ2F0aXZlLCBhIGZ1dHVyZSBvbmUgcG9zaXRpdmUuXG4gKiBgb3B0aW9ucy5wYXJzZURhdGU6IGZhbHNlYCB0dXJucyB0aGF0IG9mZiB3aGVuIG9ubHkgYSBsZW5ndGggb2YgdGltZSBtYWtlc1xuICogc2Vuc2UgLSBzZWUge0BsaW5rIFRvRHVyYXRpb25PcHRpb25zfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogdG9EdXJhdGlvbihcIjMwc1wiKTsgICAgICAgICAgICAgICAgICAgIC8vIDMwXzAwMFxuICogdG9EdXJhdGlvbihcIjEgaG91ciAzMCBtaW51dGVzXCIpOyAgICAgIC8vIDVfNDAwXzAwMFxuICogdG9EdXJhdGlvbihcIi03IGRheXNcIik7ICAgICAgICAgICAgICAgIC8vIC02MDRfODAwXzAwMFxuICogdG9EdXJhdGlvbihcIjIgd2Vla3MgYWdvXCIpOyAgICAgICAgICAgIC8vIC0xXzIwOV82MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMjAyNi0wOC0wMlwiKTsgICAgICAgICAgICAgLy8gbXMgZnJvbSBub3cgdG8gdGhhdCBpbnN0YW50XG4gKiB0b0R1cmF0aW9uKFwiMjAyNi0wOC0wMlwiLCB7IHBhcnNlRGF0ZTogZmFsc2UgfSk7IC8vIHVuZGVmaW5lZFxuICogdG9EdXJhdGlvbihcInNvb25cIik7ICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EdXJhdGlvbih2YWx1ZTogdW5rbm93biwgb3B0aW9uczogVG9EdXJhdGlvbk9wdGlvbnMgPSB7fSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIC8vIEEgYmFyZSBudW1iZXIgaXMgYWxyZWFkeSBtaWxsaXNlY29uZHMsIHRoZSBzYW1lIHJlYWRpbmcgYHRvRGF0ZWAgZ2l2ZXMgYW5cbiAgLy8gZXBvY2ggdmFsdWUsIHNvIHRoaXMgbXVzdCBydW4gYmVmb3JlIGFueSBkYXRlIGludGVycHJldGF0aW9uLlxuICBjb25zdCBudW0gPSB0b0JhcmVOdW1iZXIodmFsdWUpO1xuICBpZiAobnVtICE9PSB1bmRlZmluZWQpIHJldHVybiBudW07XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG4gIGxldCB0ZXh0ID0gdmFsdWVcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlQWxsKC9bLF9dL2csIFwiXCIpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmFuZFxcYi9nLCBcIiBcIilcbiAgICAudHJpbSgpO1xuICBsZXQgbmVnYXRlID0gZmFsc2U7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiYWdvXCIpKSB7XG4gICAgbmVnYXRlID0gdHJ1ZTtcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCAtXCJhZ29cIi5sZW5ndGgpO1xuICB9XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15pblxcYi8sIFwiXCIpLnRyaW0oKTtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHRlcm1zID0gWy4uLnRleHQubWF0Y2hBbGwoRFVSQVRJT05fVEVSTSldO1xuICBpZiAodGVybXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMucGFyc2VEYXRlID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGRhdGVBc0R1cmF0aW9uKHZhbHVlKTtcbiAgfVxuXG4gIC8vIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgbWF0Y2hlZCB0ZXJtcyBtdXN0IGJlIHNlcGFyYXRvcnMgb25seTsgb3RoZXJ3aXNlIHRoZVxuICAvLyBzdHJpbmcgaXMgc29tZXRoaW5nIGVsc2UgdGhhdCBtZXJlbHkgQ09OVEFJTlMgYSBkdXJhdGlvbi1zaGFwZWQgZnJhZ21lbnQuXG4gIGxldCBsZWZ0b3ZlciA9IHRleHQ7XG4gIGZvciAoY29uc3QgdGVybSBvZiB0ZXJtcykgbGVmdG92ZXIgPSBsZWZ0b3Zlci5yZXBsYWNlKHRlcm1bMF0sIFwiIFwiKTtcbiAgaWYgKGxlZnRvdmVyLnRyaW0oKSkge1xuICAgIC8vIEEgZHVyYXRpb24tc2hhcGVkIGZyYWdtZW50IGluc2lkZSBvdGhlciB0ZXh0IGlzIHVzdWFsbHkgYSBEQVRFIC0gYFwiMjAyNi0wOC0wMlwiYFxuICAgIC8vIG1hdGNoZXMgdHdvIHRlcm1zIGFuZCBsZWF2ZXMgc2VwYXJhdG9ycyBiZWhpbmQuXG4gICAgcmV0dXJuIG9wdGlvbnMucGFyc2VEYXRlID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGRhdGVBc0R1cmF0aW9uKHZhbHVlKTtcbiAgfVxuXG4gIGxldCB0b3RhbCA9IDA7XG4gIGxldCBzaWduID0gMTtcbiAgZm9yIChjb25zdCBbLCBleHBsaWNpdFNpZ24sIGFtb3VudCwgdW5pdF0gb2YgdGVybXMpIHtcbiAgICBpZiAoZXhwbGljaXRTaWduKSBzaWduID0gZXhwbGljaXRTaWduID09PSBcIi1cIiA/IC0xIDogMTtcbiAgICBjb25zdCB1bml0TXMgPSBEVVJBVElPTl9VTklUX01TLmdldCh1bml0ISkgPz8gRFVSQVRJT05fVU5JVF9NUy5nZXQodW5pdCEucmVwbGFjZSgvcyQvLCBcIlwiKSk7XG4gICAgaWYgKHVuaXRNcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICAgIH1cbiAgICB0b3RhbCArPSBzaWduICogTnVtYmVyKGFtb3VudCEpICogdW5pdE1zO1xuICB9XG4gIHJldHVybiBuZWdhdGUgPyAtdG90YWwgOiB0b3RhbDtcbn1cblxuLyoqXG4gKiBBIGRhdGUgcmVhZCBhcyB0aGUgc2lnbmVkIG9mZnNldCBmcm9tIG5vdyAoYGRhdGUgLSBub3dgKSwgd2hpY2ggaXMgd2hhdCBtYWtlc1xuICoge0BsaW5rIHRvRHVyYXRpb259IGFuZCB7QGxpbmsgdG9EYXRlfSBpbnZlcnNlcyBvZiBlYWNoIG90aGVyLiBSZWN1cnNlcyB3aXRoXG4gKiBkdXJhdGlvbiBwYXJzaW5nIERJU0FCTEVEIHNvIHRoZSB0d28gY2Fubm90IGhhbmQgYSB2YWx1ZSBiYWNrIGFuZCBmb3J0aFxuICogZm9yZXZlci5cbiAqL1xuZnVuY3Rpb24gZGF0ZUFzRHVyYXRpb24odmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRlID0gdG9EYXRlKHZhbHVlLCB7IHBhcnNlRHVyYXRpb246IGZhbHNlIH0pO1xuICByZXR1cm4gZGF0ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZGF0ZS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGRhdGUtaXNoIHZhbHVlIHRvIGEgcmVhbCBgRGF0ZWAsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2FuJ3QgYmVcbiAqIGludGVycHJldGVkLiBBY2NlcHRzLCBpbiB0aGlzIG9yZGVyOlxuICpcbiAqICAgLSBhIGBEYXRlYCAocGFzc2VkIHRocm91Z2g7IGFuIGludmFsaWQgb25lIGlzIGEgbWlzcyk7XG4gKiAgIC0gYW4gZXBvY2ggTlVNQkVSIG9yIG51bWVyaWMgc3RyaW5nLCBpbiBzZWNvbmRzIG9yIG1pbGxpc2Vjb25kcyAoc2VlXG4gKiAgICAge0BsaW5rIFNFQ09ORFNfQ0VJTElOR30pO1xuICogICAtIGBub3dgIChhbmQgaXRzIGB0b2RheWAgc3BlbGxpbmcpLCBmb3IgdGhlIGN1cnJlbnQgaW5zdGFudDtcbiAqICAgLSBhIHtAbGluayB0b0R1cmF0aW9ufSBleHByZXNzaW9uLCByZXNvbHZlZCBSRUxBVElWRSBUTyBOT1csIHNvIGAtN2RgLFxuICogICAgIGA3IGRheXMgYWdvYCwgYW5kIGBpbiAzMCBtaW51dGVzYCBhcmUgYWxsIHZhbGlkIGluc3RhbnRzO1xuICogICAtIGFueXRoaW5nIGBEYXRlLnBhcnNlYCB1bmRlcnN0YW5kcyAoYDIwMjYtMDgtMDJgLCBhbiBJU08vVVRDIGluc3RhbnQpLlxuICpcbiAqIFRoZSBlcG9jaCB1bml0IGluZmVyZW5jZSBpcyB0aGUgcmVhc29uIHRoaXMgZXhpc3RzIHJhdGhlciB0aGFuXG4gKiBgbmV3IERhdGUodmFsdWUpYDogYSBiYXJlIGVwb2NoIGFycml2ZXMgYXMgYSBTVFJJTkcgZnJvbSBhbiBlbnYgdmFyIG9yIGEgQ0xJXG4gKiBmbGFnIGFzIG9mdGVuIGFzIGl0IGFycml2ZXMgYXMgYSBudW1iZXIgKGBkYXRlICslc2AsIGEgSlNPTiBmaWVsZCwgYSBjb3BpZWQgbG9nXG4gKiBsaW5lKSwgYW5kIGBEYXRlLnBhcnNlKFwiMTc4NTY5Nzg5OVwiKWAgcmVhZHMgdGhhdCBhcyBhIFlFQVIsIHNpbGVudGx5IGxhbmRpbmdcbiAqIDEuNyBiaWxsaW9uIHllYXJzIG91dC4gTnVtZXJpYyBzdHJpbmdzIGFyZSB0aGVyZWZvcmUgcm91dGVkIHRvIHRoZSBlcG9jaCBwYXRoLFxuICogbmV2ZXIgdG8gYERhdGUucGFyc2VgLlxuICpcbiAqIFRoZSBkdXJhdGlvbiBmYWxsYmFjayBydW5zIExBU1QsIGFmdGVyIGBEYXRlLnBhcnNlYCwgc28gYSByZWFsIGRhdGUgaXMgbmV2ZXJcbiAqIG1pc3Rha2VuIGZvciBhbiBvZmZzZXQuIGBvcHRpb25zLnBhcnNlRHVyYXRpb246IGZhbHNlYCByZW1vdmVzIGl0IGVudGlyZWx5IHdoZW5cbiAqIHRoZSB2YWx1ZSBtdXN0IGJlIGFuIGFic29sdXRlIGluc3RhbnQgLSBzZWUge0BsaW5rIFRvRGF0ZU9wdGlvbnN9LlxuICpcbiAqIExpa2Uge0BsaW5rIHRvQm9vbGVhbn0gdGhpcyBORVZFUiB0aHJvd3MgYW5kIHJldHVybnMgYHVuZGVmaW5lZGAgZm9yIGFueXRoaW5nXG4gKiB1bmludGVycHJldGFibGUsIHNvIGEgY2FsbGVyIGRlY2lkZXMgd2hldGhlciBhIGJhZCB2YWx1ZSBpcyBmYXRhbCwgYSB3YXJuaW5nLFxuICogb3IgYSBmYWxsYmFjay5cbiAqXG4gKiBAZXhhbXBsZVxuICogdG9EYXRlKFwibm93XCIpOyAgICAgICAgICAgICAgIC8vIHRoaXMgaW5zdGFudFxuICogdG9EYXRlKFwiMjAyNi0wOC0wMlwiKTsgICAgICAgIC8vIDIwMjYtMDgtMDJUMDA6MDA6MDAuMDAwWlxuICogdG9EYXRlKFwiMTc4NTY5Nzg5OVwiKTsgICAgICAgIC8vIHNlY29uZHMgLT4gMjAyNi0wOC0wMlQuLi5cbiAqIHRvRGF0ZSgxNzg1Njk3ODk5MDAwKTsgICAgICAgLy8gbWlsbGlzICAtPiB0aGUgc2FtZSBpbnN0YW50XG4gKiB0b0RhdGUoXCIzMCBkYXlzIGFnb1wiKTsgICAgICAgLy8gbm93IC0gMzBkXG4gKiB0b0RhdGUoXCIzMCBkYXlzIGFnb1wiLCB7IHBhcnNlRHVyYXRpb246IGZhbHNlIH0pOyAvLyB1bmRlZmluZWRcbiAqIHRvRGF0ZShcIm5vcGVcIik7ICAgICAgICAgICAgICAvLyB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRGF0ZSh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogVG9EYXRlT3B0aW9ucyA9IHt9KTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGVwb2NoTXMgPSB0b0Vwb2NoTXModmFsdWUpO1xuICBpZiAoZXBvY2hNcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZnJvbU1zKGVwb2NoTXMpO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdGV4dCA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAodGV4dCA9PT0gXCJub3dcIiB8fCB0ZXh0ID09PSBcInRvZGF5XCIpIHJldHVybiBuZXcgRGF0ZSgpO1xuXG4gIGNvbnN0IHBhcnNlZCA9IERhdGUucGFyc2UodmFsdWUudHJpbSgpKTtcbiAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkKSkgcmV0dXJuIG5ldyBEYXRlKHBhcnNlZCk7XG5cbiAgaWYgKG9wdGlvbnMucGFyc2VEdXJhdGlvbiA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIFJlY3Vyc2VzIHdpdGggZGF0ZSBwYXJzaW5nIERJU0FCTEVEIHNvIHRoZSB0d28gY2Fubm90IGhhbmQgYSB2YWx1ZSBiYWNrIGFuZFxuICAvLyBmb3J0aCBmb3JldmVyLlxuICBjb25zdCBvZmZzZXRNcyA9IHRvRHVyYXRpb24odmFsdWUsIHsgcGFyc2VEYXRlOiBmYWxzZSB9KTtcbiAgcmV0dXJuIG9mZnNldE1zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBmcm9tTXMoRGF0ZS5ub3coKSArIG9mZnNldE1zKTtcbn1cblxuLyoqIEEgYERhdGVgIGZvciBlcG9jaCBgbXNgLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGlzIG91dCBvZiByZXByZXNlbnRhYmxlIHJhbmdlLiAqL1xuZnVuY3Rpb24gZnJvbU1zKG1zOiBudW1iZXIpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG1zKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyB1bmRlZmluZWQgOiBkYXRlO1xufVxuXG4vKipcbiAqIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3IgYSBudW1lcmljIHZhbHVlL3N0cmluZywgb3IgYHVuZGVmaW5lZGAgd2hlbiBub3Qgb25lLFxuICogYXBwbHlpbmcgdGhlIHNlY29uZHMtdnMtbWlsbGlzIGluZmVyZW5jZSBhdCB7QGxpbmsgU0VDT05EU19DRUlMSU5HfS5cbiAqL1xuZnVuY3Rpb24gdG9FcG9jaE1zKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbnVtZXJpYyA9IHRvQmFyZU51bWJlcih2YWx1ZSk7XG4gIGlmIChudW1lcmljID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBNYXRoLmFicyhudW1lcmljKSA8IFNFQ09ORFNfQ0VJTElORyA/IG51bWVyaWMgKiAxMDAwIDogbnVtZXJpYztcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRlZXAtZXF1YWxpdHkgd2l0aCBhbiBvcHRpb25hbCBjdXN0b20gY29tcGFyYXRvci5cbiAqXG4gKiB7QGxpbmsgZGVlcEVxdWFsfSBtaXJyb3JzIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGBmYXN0LWRlZXAtZXF1YWxgXG4gKiBwYWNrYWdlIChoYW5kbGVkOiBuZXN0ZWQgcGxhaW4gb2JqZWN0cy9hcnJheXMsIGBNYXBgLCBgU2V0YCwgYERhdGVgLFxuICogYFJlZ0V4cGAsIHR5cGVkIGFycmF5cywgYE5hTmAsIGFuZCBgKzBgL2AtMGAgdHJlYXRlZCBhcyBlcXVhbCkgYnV0IGlzXG4gKiBkZXBlbmRlbmN5LWZyZWUgc28gYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgIGtlZXBzIG5vIHJ1bnRpbWUgZGVwcy5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYGNvbXBhcmF0b3JgIHNob3J0LWNpcmN1aXRzIHRoZSBzdHJ1Y3R1cmFsIHdhbGsgYXQgYW55XG4gKiBub2RlOiByZXR1cm4gYHRydWVgL2BmYWxzZWAgdG8gZm9yY2UgdGhlIHJlc3VsdCBmb3IgdGhhdCBwYWlyLCBvclxuICogYHVuZGVmaW5lZGAgdG8gZGVmZXIgdG8gdGhlIGJ1aWx0LWluIGNvbXBhcmlzb24uIEl0IGlzIGludm9rZWQgZm9yIHRoZVxuICogcm9vdCBwYWlyIGFuZCByZWN1cnNpdmVseSBmb3IgZWFjaCBuZXN0ZWQgcGFpciwgc28gYSBjYWxsZXIgY2FuLCBlLmcuLFxuICogY29tcGFyZSB0d28gZG9tYWluIG9iamVjdHMgYnkgaWQgd2hpbGUgbGV0dGluZyBldmVyeXRoaW5nIGVsc2UgZmFsbFxuICogYmFjayB0byBzdHJ1Y3R1cmFsIGVxdWFsaXR5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBkZWVwRXF1YWwoeyBhOiAxIH0sIHsgYTogMSB9KTsgICAgICAgICAgICAgICAgIC8vIHRydWVcbiAqIGRlZXBFcXVhbChbMSwgMl0sIFsxLCAyXSk7ICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWVcbiAqIGRlZXBFcXVhbChhLCBiLCAoeCwgeSkgPT5cbiAqICAgaXNFbnRpdHkoeCkgJiYgaXNFbnRpdHkoeSkgPyB4LmlkID09PSB5LmlkIDogdW5kZWZpbmVkKTtcbiAqL1xuZXhwb3J0IHR5cGUgRGVlcEVxdWFsQ29tcGFyYXRvciA9IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4vKiogQ29tcGFyZSBuZXN0ZWQgdmFsdWVzIHN0cnVjdHVyYWxseSB3aXRoIGFuIG9wdGlvbmFsIHJlY3Vyc2l2ZSBvdmVycmlkZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwoYTogdW5rbm93biwgYjogdW5rbm93biwgY29tcGFyYXRvcj86IERlZXBFcXVhbENvbXBhcmF0b3IpOiBib29sZWFuIHtcbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICBjb25zdCBkZWNpZGVkID0gY29tcGFyYXRvcihhLCBiKTtcbiAgICBpZiAoZGVjaWRlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZGVjaWRlZDtcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgYSA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gXCJvYmplY3RcIiB8fCBiID09PSBudWxsKSB7XG4gICAgLy8gTmFOIGlzIHRoZSBvbmx5IHZhbHVlIG5vdCBlcXVhbCB0byBpdHNlbGYgdW5kZXIgYD09PWAuXG4gICAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbiAgfVxuXG4gIGlmIChhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICBjb25zdCBiQXJyID0gYiBhcyB1bmtub3duW107XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYkFycltpXSwgY29tcGFyYXRvcikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGNvbnN0IGJNYXAgPSBiIGFzIE1hcDx1bmtub3duLCB1bmtub3duPjtcbiAgICBpZiAoYS5zaXplICE9PSBiTWFwLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgICBpZiAoIWJNYXAuaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghZGVlcEVxdWFsKHZhbHVlLCBiTWFwLmdldChrZXkpLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgY29uc3QgYlNldCA9IGIgYXMgU2V0PHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJTZXQuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYSkge1xuICAgICAgaWYgKCFiU2V0Lmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IChiIGFzIERhdGUpLmdldFRpbWUoKTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgY29uc3QgYlJlID0gYiBhcyBSZWdFeHA7XG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiUmUuc291cmNlICYmIGEuZmxhZ3MgPT09IGJSZS5mbGFncztcbiAgfVxuXG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgIShhIGluc3RhbmNlb2YgRGF0YVZpZXcpKSB7XG4gICAgY29uc3QgYUFyciA9IGEgYXMgdW5rbm93biBhcyBBcnJheUxpa2U8bnVtYmVyPjtcbiAgICBjb25zdCBiQXJyID0gYiBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGlmIChhQXJyLmxlbmd0aCAhPT0gYkFyci5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhQXJyW2ldICE9PSBiQXJyW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IG9mIGFLZXlzKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChcbiAgICAgICFkZWVwRXF1YWwoXG4gICAgICAgIChhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICAoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICAgY29tcGFyYXRvcixcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"projen": "projen"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@dbx-tools/test-polyglot": "^0.9.
|
|
22
|
+
"@dbx-tools/test-polyglot": "^0.9.40",
|
|
23
23
|
"typescript": "^5.9.3"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
"./package.json": "./package.json"
|
|
104
104
|
}
|
|
105
105
|
},
|
|
106
|
-
"version": "0.9.
|
|
106
|
+
"version": "0.9.40",
|
|
107
107
|
"types": "./lib/index.d.ts",
|
|
108
108
|
"dbxToolsConfig": {
|
|
109
109
|
"tags": [
|
package/src/function-utils.ts
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe function lifecycle helpers shared across dbx-tools packages.
|
|
3
|
+
*
|
|
4
|
+
* This module is the repository owner for zero-argument memoization, including
|
|
5
|
+
* in-flight promise sharing, TTL expiry, and rejection eviction. Reuse
|
|
6
|
+
* {@link memoize} instead of adding package-local once/cache wrappers; add a new
|
|
7
|
+
* primitive here when it is dependency-free and useful in both browser and
|
|
8
|
+
* server code.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
|
|
1
13
|
/** Cache lifetime controls for {@link memoize}; failures are always evicted. */
|
|
2
14
|
export interface MemoizeOptions {
|
|
3
15
|
/**
|
package/src/json.ts
CHANGED
|
@@ -16,6 +16,9 @@
|
|
|
16
16
|
* a zod schema when the payload has a contract; these only get you from `string`
|
|
17
17
|
* to a safely typed starting point.
|
|
18
18
|
*
|
|
19
|
+
* This is the repository-wide owner for non-throwing JSON parsing. Reuse these
|
|
20
|
+
* helpers instead of repeating local `try { JSON.parse(...) }` wrappers.
|
|
21
|
+
*
|
|
19
22
|
* @module
|
|
20
23
|
*/
|
|
21
24
|
|
package/src/log.ts
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* Tagged, leveled logging for every runtime - the one logger the whole
|
|
3
3
|
* monorepo shares.
|
|
4
4
|
*
|
|
5
|
+
* Import this module instead of constructing package-local console wrappers so
|
|
6
|
+
* log levels, tags, formatting, and browser behavior remain consistent.
|
|
7
|
+
*
|
|
5
8
|
* {@link logger} resolves a tagged {@link Logger} through a synchronous console
|
|
6
9
|
* sink, then upgrades its server-side formatter when `node:util` resolves.
|
|
7
10
|
* Keeping the sink dependency-free prevents browser bundlers from retaining an
|
package/src/net.ts
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* home for anything URL-, IP-, or email-shaped that also has to run in
|
|
11
11
|
* a Vite / Webpack / esbuild client bundle. Node-only network helpers
|
|
12
12
|
* (e.g. DNS resolution) belong in a node-tagged package, not here.
|
|
13
|
+
* Reuse this module for URL, IP/CIDR, and email parsing instead of introducing
|
|
14
|
+
* package-local normalizers with subtly different rules.
|
|
13
15
|
*
|
|
14
16
|
* @module
|
|
15
17
|
*/
|
package/src/object.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dependency-free object + iterable utilities
|
|
2
|
+
* Dependency-free object + iterable utilities and the canonical repository
|
|
3
|
+
* owner for stable identity, loose scalar coercion, record guards, sequences,
|
|
4
|
+
* and common object transforms. Reuse these helpers across packages instead of
|
|
5
|
+
* adding local equivalents with different edge-case behavior.
|
|
3
6
|
*
|
|
4
7
|
* Value guards / coercions / shape types: {@link isRecord} narrows parsed JSON
|
|
5
8
|
* to a record, {@link toNumber} coerces a hand-typed numeral, {@link toBoolean}
|