@jsii/kernel 1.57.0 → 1.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api.d.ts +1 -0
- package/lib/api.js +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +7 -3
- package/lib/kernel.d.ts +1 -0
- package/lib/kernel.js +26 -42
- package/lib/objects.d.ts +1 -0
- package/lib/objects.js +4 -7
- package/lib/on-exit.d.ts +1 -0
- package/lib/on-exit.js +1 -1
- package/{test → lib}/recording.d.ts +2 -1
- package/lib/recording.js +73 -0
- package/lib/serialization.d.ts +1 -0
- package/lib/serialization.js +56 -57
- package/package.json +8 -15
- package/test/kernel.test.d.ts +0 -1
- package/test/kernel.test.js +0 -1805
- package/test/objects.test.d.ts +0 -1
- package/test/objects.test.js +0 -20
- package/test/recording.js +0 -73
- package/test/serialization.test.d.ts +0 -1
- package/test/serialization.test.js +0 -93
package/lib/api.d.ts
CHANGED
package/lib/api.js
CHANGED
|
@@ -35,4 +35,4 @@ function isPropertyOverride(value) {
|
|
|
35
35
|
return value.property != null; // Python passes "null"
|
|
36
36
|
}
|
|
37
37
|
exports.isPropertyOverride = isPropertyOverride;
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFhLFFBQUEsU0FBUyxHQUFHLGFBQWEsQ0FBQztBQUMxQixRQUFBLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBQ3RDLFFBQUEsVUFBVSxHQUFHLFlBQVksQ0FBQztBQUMxQixRQUFBLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFDMUIsUUFBQSxTQUFTLEdBQUcsV0FBVyxDQUFDO0FBQ3hCLFFBQUEsWUFBWSxHQUFHLGNBQWMsQ0FBQztBQU8zQyxTQUFnQixRQUFRLENBQUMsS0FBVTtJQUNqQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLGlCQUFTLElBQUksS0FBSyxDQUFDO0FBQzNFLENBQUM7QUFGRCw0QkFFQztBQU1ELFNBQWdCLFVBQVUsQ0FBQyxLQUFVO0lBQ25DLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksa0JBQVUsSUFBSSxLQUFLLENBQUM7QUFDNUUsQ0FBQztBQUZELGdDQUVDO0FBTUQsU0FBZ0IsVUFBVSxDQUFDLEtBQVU7SUFDbkMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxrQkFBVSxJQUFJLEtBQUssQ0FBQztBQUM1RSxDQUFDO0FBRkQsZ0NBRUM7QUFNRCxTQUFnQixTQUFTLENBQUMsS0FBVTtJQUNsQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLGlCQUFTLElBQUksS0FBSyxDQUFDO0FBQzNFLENBQUM7QUFGRCw4QkFFQztBQVNELFNBQWdCLFlBQVksQ0FBQyxLQUFVO0lBQ3JDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksb0JBQVksSUFBSSxLQUFLLENBQUM7QUFDOUUsQ0FBQztBQUZELG9DQUVDO0FBU0QsU0FBZ0IsZ0JBQWdCLENBQUMsS0FBZTtJQUM5QyxPQUFRLEtBQWEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsdUJBQXVCO0FBQy9ELENBQUM7QUFGRCw0Q0FFQztBQU9ELFNBQWdCLGtCQUFrQixDQUFDLEtBQWU7SUFDaEQsT0FBUSxLQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLHVCQUF1QjtBQUNqRSxDQUFDO0FBRkQsZ0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgVE9LRU5fUkVGID0gJyRqc2lpLmJ5cmVmJztcbmV4cG9ydCBjb25zdCBUT0tFTl9JTlRFUkZBQ0VTID0gJyRqc2lpLmludGVyZmFjZXMnO1xuZXhwb3J0IGNvbnN0IFRPS0VOX0RBVEUgPSAnJGpzaWkuZGF0ZSc7XG5leHBvcnQgY29uc3QgVE9LRU5fRU5VTSA9ICckanNpaS5lbnVtJztcbmV4cG9ydCBjb25zdCBUT0tFTl9NQVAgPSAnJGpzaWkubWFwJztcbmV4cG9ydCBjb25zdCBUT0tFTl9TVFJVQ1QgPSAnJGpzaWkuc3RydWN0JztcblxuZXhwb3J0IGludGVyZmFjZSBPYmpSZWYge1xuICByZWFkb25seSBbVE9LRU5fUkVGXTogc3RyaW5nO1xuICBbVE9LRU5fSU5URVJGQUNFU10/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqUmVmKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBPYmpSZWYge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBUT0tFTl9SRUYgaW4gdmFsdWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2lyZURhdGUge1xuICByZWFkb25seSBbVE9LRU5fREFURV06IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV2lyZURhdGUodmFsdWU6IGFueSk6IHZhbHVlIGlzIFdpcmVEYXRlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgVE9LRU5fREFURSBpbiB2YWx1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXJlRW51bSB7XG4gIHJlYWRvbmx5IFtUT0tFTl9FTlVNXTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXaXJlRW51bSh2YWx1ZTogYW55KTogdmFsdWUgaXMgV2lyZUVudW0ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBUT0tFTl9FTlVNIGluIHZhbHVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpcmVNYXAge1xuICByZWFkb25seSBbVE9LRU5fTUFQXTogeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBhbnkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV2lyZU1hcCh2YWx1ZTogYW55KTogdmFsdWUgaXMgV2lyZU1hcCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIFRPS0VOX01BUCBpbiB2YWx1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXJlU3RydWN0IHtcbiAgcmVhZG9ubHkgW1RPS0VOX1NUUlVDVF06IHtcbiAgICByZWFkb25seSBmcW46IHN0cmluZztcbiAgICByZWFkb25seSBkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXaXJlU3RydWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBXaXJlU3RydWN0IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgVE9LRU5fU1RSVUNUIGluIHZhbHVlO1xufVxuXG5leHBvcnQgdHlwZSBPdmVycmlkZSA9IE1ldGhvZE92ZXJyaWRlIHwgUHJvcGVydHlPdmVycmlkZTtcblxuZXhwb3J0IGludGVyZmFjZSBNZXRob2RPdmVycmlkZSB7XG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuICByZWFkb25seSBjb29raWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01ldGhvZE92ZXJyaWRlKHZhbHVlOiBPdmVycmlkZSk6IHZhbHVlIGlzIE1ldGhvZE92ZXJyaWRlIHtcbiAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLm1ldGhvZCAhPSBudWxsOyAvLyBQeXRob24gcGFzc2VzIFwibnVsbFwiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcGVydHlPdmVycmlkZSB7XG4gIHJlYWRvbmx5IHByb3BlcnR5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvb2tpZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvcGVydHlPdmVycmlkZSh2YWx1ZTogT3ZlcnJpZGUpOiB2YWx1ZSBpcyBQcm9wZXJ0eU92ZXJyaWRlIHtcbiAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLnByb3BlcnR5ICE9IG51bGw7IC8vIFB5dGhvbiBwYXNzZXMgXCJudWxsXCJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxsYmFjayB7XG4gIHJlYWRvbmx5IGNiaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY29va2llOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGludm9rZT86IEludm9rZVJlcXVlc3Q7XG4gIHJlYWRvbmx5IGdldD86IEdldFJlcXVlc3Q7XG4gIHJlYWRvbmx5IHNldD86IFNldFJlcXVlc3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVsbG9SZXNwb25zZSB7XG4gIHJlYWRvbmx5IGhlbGxvOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZFJlcXVlc3Qge1xuICAvKiogVGhlIG5hbWUgb2YgdGhlIGFzc2VtYmx5ICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKiogQXNzZW1ibHkgdmVyc2lvbiAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSB0YXJiYWxsIG9mIHRoZSBwYWNrYWdlICovXG4gIHJlYWRvbmx5IHRhcmJhbGw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2FkUmVzcG9uc2Uge1xuICByZWFkb25seSBhc3NlbWJseTogc3RyaW5nO1xuICByZWFkb25seSB0eXBlczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludm9rZVNjcmlwdFJlcXVlc3Qge1xuICByZWFkb25seSBhc3NlbWJseTogc3RyaW5nO1xuICByZWFkb25seSBzY3JpcHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJncz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludm9rZVNjcmlwdFJlc3BvbnNlIHtcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIgfCBudWxsO1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNpZ25hbDogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBGUU4gb2YgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIGlzIHJlcXVlc3RlZCAob3IgXCJPYmplY3RcIilcbiAgICovXG4gIHJlYWRvbmx5IGZxbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRlFOcyBvZiBpbnRlcmZhY2VzIHRoZSBpbnN0YW5jZSBpbXBsZW1lbnRzLCBpZiBhbnkuIERlY2xhcmluZ1xuICAgKiBpbnRlcmZhY2VzIHRoYXQgdGhlIGNsYXNzIGRlbm90ZWQgYnkgYGZxbmAgaW1wbGVtZW50cyBpcyBub3QgbmVjZXNzYXJ5LlxuICAgKiBUaGlzIG1lYW5zIHRoYXQgbWVtZWJlcnMgb2YgaW50ZXJmYWNlcyBmb3VuZCBpbiB0aGlzIHByb3BlcnR5IHNob3VsZFxuICAgKiBkZWNsYXJlIG1lbWJlcnMgdGhhdCBhcmUgZm91bmQgaW4gdGhlIGBvdmVycmlkZXNgIHByb3BlcnR5LlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3Igb2YgYGZxbmAuIChcIk9iamVjdFwiIGFjY2VwdHMgbm9uZSlcbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M/OiBhbnlbXTtcblxuICAvKipcbiAgICogRGVjbGFyYXRpb25zIG9mIG1ldGhvZCBvdmVycmlkZXMgdGhhdCBzaG91bGQgdHJpZ2dlciBjYWxsYmFja3NcbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE92ZXJyaWRlW107XG59XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVJlc3BvbnNlID0gT2JqUmVmO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlbFJlcXVlc3Qge1xuICByZWFkb25seSBvYmpyZWY6IE9ialJlZjtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgRGVsUmVzcG9uc2Uge31cblxuZXhwb3J0IGludGVyZmFjZSBHZXRSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgb2JqcmVmOiBPYmpSZWY7XG4gIHJlYWRvbmx5IHByb3BlcnR5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGljR2V0UmVxdWVzdCB7XG4gIHJlYWRvbmx5IGZxbjogc3RyaW5nO1xuICByZWFkb25seSBwcm9wZXJ0eTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlc3BvbnNlIHtcbiAgcmVhZG9ubHkgdmFsdWU6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0aWNTZXRSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgZnFuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb3BlcnR5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZhbHVlOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0UmVxdWVzdCB7XG4gIHJlYWRvbmx5IG9ianJlZjogT2JqUmVmO1xuICByZWFkb25seSBwcm9wZXJ0eTogc3RyaW5nO1xuICByZWFkb25seSB2YWx1ZTogYW55O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBTZXRSZXNwb25zZSB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY0ludm9rZVJlcXVlc3Qge1xuICByZWFkb25seSBmcW46IHN0cmluZztcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M/OiBhbnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZva2VSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgb2JqcmVmOiBPYmpSZWY7XG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuICByZWFkb25seSBhcmdzPzogYW55W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2tlUmVzcG9uc2Uge1xuICByZWFkb25seSByZXN1bHQ6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCZWdpblJlcXVlc3Qge1xuICByZWFkb25seSBvYmpyZWY6IE9ialJlZjtcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M/OiBhbnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCZWdpblJlc3BvbnNlIHtcbiAgcmVhZG9ubHkgcHJvbWlzZWlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5kUmVxdWVzdCB7XG4gIHJlYWRvbmx5IHByb21pc2VpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVuZFJlc3BvbnNlIHtcbiAgcmVhZG9ubHkgcmVzdWx0OiBhbnk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIENhbGxiYWNrc1JlcXVlc3Qge31cblxuZXhwb3J0IGludGVyZmFjZSBDYWxsYmFja3NSZXNwb25zZSB7XG4gIHJlYWRvbmx5IGNhbGxiYWNrczogQ2FsbGJhY2tbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0ZVJlcXVlc3Qge1xuICByZWFkb25seSBjYmlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVycj86IHN0cmluZztcbiAgcmVhZG9ubHkgcmVzdWx0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRlUmVzcG9uc2Uge1xuICByZWFkb25seSBjYmlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFtaW5nUmVxdWVzdCB7XG4gIHJlYWRvbmx5IGFzc2VtYmx5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFtaW5nUmVzcG9uc2Uge1xuICByZWFkb25seSBuYW1pbmc6IHtcbiAgICByZWFkb25seSBbbGFuZ3VhZ2U6IHN0cmluZ106IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQ7XG4gIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRzUmVxdWVzdCB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRzUmVzcG9uc2Uge1xuICByZWFkb25seSBvYmplY3RDb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBLZXJuZWxSZXF1ZXN0ID1cbiAgfCBMb2FkUmVxdWVzdFxuICB8IENyZWF0ZVJlcXVlc3RcbiAgfCBEZWxSZXF1ZXN0XG4gIHwgR2V0UmVxdWVzdFxuICB8IFNldFJlcXVlc3RcbiAgfCBJbnZva2VSZXF1ZXN0XG4gIHwgQmVnaW5SZXF1ZXN0XG4gIHwgRW5kUmVxdWVzdFxuICB8IENhbGxiYWNrc1JlcXVlc3RcbiAgfCBDb21wbGV0ZVJlcXVlc3RcbiAgfCBOYW1pbmdSZXF1ZXN0XG4gIHwgU3RhdHNSZXF1ZXN0O1xuXG5leHBvcnQgdHlwZSBLZXJuZWxSZXNwb25zZSA9XG4gIHwgSGVsbG9SZXNwb25zZVxuICB8IExvYWRSZXNwb25zZVxuICB8IENyZWF0ZVJlc3BvbnNlXG4gIHwgRGVsUmVzcG9uc2VcbiAgfCBHZXRSZXNwb25zZVxuICB8IFNldFJlc3BvbnNlXG4gIHwgSW52b2tlUmVzcG9uc2VcbiAgfCBCZWdpblJlc3BvbnNlXG4gIHwgRW5kUmVzcG9uc2VcbiAgfCBDYWxsYmFja3NSZXNwb25zZVxuICB8IENvbXBsZXRlUmVzcG9uc2VcbiAgfCBOYW1pbmdSZXNwb25zZVxuICB8IFN0YXRzUmVzcG9uc2U7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2theVJlc3BvbnNlIHtcbiAgcmVhZG9ubHkgb2s6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvclJlc3BvbnNlIHtcbiAgcmVhZG9ubHkgZXJyb3I6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhY2s/OiBzdHJpbmc7XG59XG4iXX0=
|
|
38
|
+
//# sourceMappingURL=api.js.map
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
8
12
|
}));
|
|
9
13
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
-
for (var p in m) if (p !== "default" && !
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
15
|
};
|
|
12
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
17
|
exports.api = void 0;
|
|
14
18
|
__exportStar(require("./kernel"), exports);
|
|
15
19
|
const api = require("./api");
|
|
16
20
|
exports.api = api;
|
|
17
|
-
//# sourceMappingURL=
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
package/lib/kernel.d.ts
CHANGED
package/lib/kernel.js
CHANGED
|
@@ -47,11 +47,10 @@ class Kernel {
|
|
|
47
47
|
this.sandbox = vm.createContext({
|
|
48
48
|
Buffer,
|
|
49
49
|
setImmediate,
|
|
50
|
-
require: nodeRequire,
|
|
50
|
+
require: nodeRequire, // modules need to "require"
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
load(req) {
|
|
54
|
-
var _a, _b;
|
|
55
54
|
this._debug('load', req);
|
|
56
55
|
if ('assembly' in req) {
|
|
57
56
|
throw new Error('`assembly` field is deprecated for "load", use `name`, `version` and `tarball` instead');
|
|
@@ -73,7 +72,7 @@ class Kernel {
|
|
|
73
72
|
const assm = this.assemblies[pkgname];
|
|
74
73
|
return {
|
|
75
74
|
assembly: assm.metadata.name,
|
|
76
|
-
types: Object.keys(
|
|
75
|
+
types: Object.keys(assm.metadata.types ?? {}).length,
|
|
77
76
|
};
|
|
78
77
|
}
|
|
79
78
|
// Create the install directory (there may be several path components for @scoped/packages)
|
|
@@ -107,11 +106,10 @@ class Kernel {
|
|
|
107
106
|
this._addAssembly(assm);
|
|
108
107
|
return {
|
|
109
108
|
assembly: assmSpec.name,
|
|
110
|
-
types: Object.keys(
|
|
109
|
+
types: Object.keys(assmSpec.types ?? {}).length,
|
|
111
110
|
};
|
|
112
111
|
}
|
|
113
112
|
invokeBinScript(req) {
|
|
114
|
-
var _a;
|
|
115
113
|
const packageDir = this._getPackageDir(req.assembly);
|
|
116
114
|
if (fs.pathExistsSync(packageDir)) {
|
|
117
115
|
// module exists, verify version
|
|
@@ -123,7 +121,7 @@ class Kernel {
|
|
|
123
121
|
if (!epkg.bin) {
|
|
124
122
|
throw new Error(`Script with name ${req.script} was not defined.`);
|
|
125
123
|
}
|
|
126
|
-
const result = cp.spawnSync(path.join(packageDir, scriptPath),
|
|
124
|
+
const result = cp.spawnSync(path.join(packageDir, scriptPath), req.args ?? [], {
|
|
127
125
|
encoding: 'utf-8',
|
|
128
126
|
env: {
|
|
129
127
|
...process.env,
|
|
@@ -214,9 +212,8 @@ class Kernel {
|
|
|
214
212
|
return {};
|
|
215
213
|
}
|
|
216
214
|
invoke(req) {
|
|
217
|
-
var _a, _b;
|
|
218
215
|
const { objref, method } = req;
|
|
219
|
-
const args =
|
|
216
|
+
const args = req.args ?? [];
|
|
220
217
|
this._debug('invoke', objref, method, args);
|
|
221
218
|
const { ti, obj, fn } = this._findInvokeTarget(objref, method, args);
|
|
222
219
|
// verify this is not an async method
|
|
@@ -226,14 +223,13 @@ class Kernel {
|
|
|
226
223
|
const ret = this._ensureSync(`method '${objref[api_1.TOKEN_REF]}.${method}'`, () => {
|
|
227
224
|
return this._wrapSandboxCode(() => fn.apply(obj, this._toSandboxValues(args, ti.parameters)));
|
|
228
225
|
});
|
|
229
|
-
const result = this._fromSandbox(ret,
|
|
226
|
+
const result = this._fromSandbox(ret, ti.returns ?? 'void');
|
|
230
227
|
this._debug('invoke result', result);
|
|
231
228
|
return { result };
|
|
232
229
|
}
|
|
233
230
|
sinvoke(req) {
|
|
234
|
-
var _a, _b;
|
|
235
231
|
const { fqn, method } = req;
|
|
236
|
-
const args =
|
|
232
|
+
const args = req.args ?? [];
|
|
237
233
|
this._debug('sinvoke', fqn, method, args);
|
|
238
234
|
const ti = this._typeInfoForMethod(method, fqn);
|
|
239
235
|
if (!ti.static) {
|
|
@@ -249,12 +245,11 @@ class Kernel {
|
|
|
249
245
|
return this._wrapSandboxCode(() => fn.apply(prototype, this._toSandboxValues(args, ti.parameters)));
|
|
250
246
|
});
|
|
251
247
|
this._debug('method returned:', ret);
|
|
252
|
-
return { result: this._fromSandbox(ret,
|
|
248
|
+
return { result: this._fromSandbox(ret, ti.returns ?? 'void') };
|
|
253
249
|
}
|
|
254
250
|
begin(req) {
|
|
255
|
-
var _a;
|
|
256
251
|
const { objref, method } = req;
|
|
257
|
-
const args =
|
|
252
|
+
const args = req.args ?? [];
|
|
258
253
|
this._debug('begin', objref, method, args);
|
|
259
254
|
if (this.syncInProgress) {
|
|
260
255
|
throw new Error(`Cannot invoke async method '${req.objref[api_1.TOKEN_REF]}.${req.method}' while sync ${this.syncInProgress} is being processed`);
|
|
@@ -277,7 +272,6 @@ class Kernel {
|
|
|
277
272
|
return { promiseid: prid };
|
|
278
273
|
}
|
|
279
274
|
async end(req) {
|
|
280
|
-
var _a;
|
|
281
275
|
const { promiseid } = req;
|
|
282
276
|
this._debug('end', promiseid);
|
|
283
277
|
const { promise, method } = this.promises[promiseid];
|
|
@@ -293,7 +287,7 @@ class Kernel {
|
|
|
293
287
|
this._debug('promise error:', e);
|
|
294
288
|
throw e;
|
|
295
289
|
}
|
|
296
|
-
return { result: this._fromSandbox(result,
|
|
290
|
+
return { result: this._fromSandbox(result, method.returns ?? 'void') };
|
|
297
291
|
}
|
|
298
292
|
callbacks(_req) {
|
|
299
293
|
this._debug('callbacks');
|
|
@@ -316,7 +310,6 @@ class Kernel {
|
|
|
316
310
|
return { callbacks: ret };
|
|
317
311
|
}
|
|
318
312
|
complete(req) {
|
|
319
|
-
var _a;
|
|
320
313
|
const { cbid, err, result } = req;
|
|
321
314
|
this._debug('complete', cbid, err, result);
|
|
322
315
|
if (!(cbid in this.waiting)) {
|
|
@@ -328,7 +321,7 @@ class Kernel {
|
|
|
328
321
|
cb.fail(new Error(err));
|
|
329
322
|
}
|
|
330
323
|
else {
|
|
331
|
-
const sandoxResult = this._toSandbox(result,
|
|
324
|
+
const sandoxResult = this._toSandbox(result, cb.expectedReturnType ?? 'void');
|
|
332
325
|
this._debug('completed with result:', sandoxResult);
|
|
333
326
|
cb.succeed(sandoxResult);
|
|
334
327
|
}
|
|
@@ -355,11 +348,10 @@ class Kernel {
|
|
|
355
348
|
};
|
|
356
349
|
}
|
|
357
350
|
_addAssembly(assm) {
|
|
358
|
-
var _a;
|
|
359
351
|
this.assemblies[assm.metadata.name] = assm;
|
|
360
352
|
// add the __jsii__.fqn property on every constructor. this allows
|
|
361
353
|
// traversing between the javascript and jsii worlds given any object.
|
|
362
|
-
for (const fqn of Object.keys(
|
|
354
|
+
for (const fqn of Object.keys(assm.metadata.types ?? {})) {
|
|
363
355
|
const typedef = assm.metadata.types[fqn];
|
|
364
356
|
switch (typedef.kind) {
|
|
365
357
|
case spec.TypeKind.Interface:
|
|
@@ -367,7 +359,7 @@ class Kernel {
|
|
|
367
359
|
case spec.TypeKind.Class:
|
|
368
360
|
case spec.TypeKind.Enum:
|
|
369
361
|
const constructor = this._findSymbol(fqn);
|
|
370
|
-
objects_1.tagJsiiConstructor(constructor, fqn);
|
|
362
|
+
(0, objects_1.tagJsiiConstructor)(constructor, fqn);
|
|
371
363
|
}
|
|
372
364
|
}
|
|
373
365
|
}
|
|
@@ -403,14 +395,13 @@ class Kernel {
|
|
|
403
395
|
// prefixed with _ to allow calling this method internally without
|
|
404
396
|
// getting it recorded for testing.
|
|
405
397
|
_create(req) {
|
|
406
|
-
var _a, _b;
|
|
407
398
|
this._debug('create', req);
|
|
408
399
|
const { fqn, interfaces, overrides } = req;
|
|
409
|
-
const requestArgs =
|
|
400
|
+
const requestArgs = req.args ?? [];
|
|
410
401
|
const ctorResult = this._findCtor(fqn, requestArgs);
|
|
411
402
|
const ctor = ctorResult.ctor;
|
|
412
403
|
const obj = this._wrapSandboxCode(() => new ctor(...this._toSandboxValues(requestArgs, ctorResult.parameters)));
|
|
413
|
-
const objref = this.objects.registerObject(obj, fqn,
|
|
404
|
+
const objref = this.objects.registerObject(obj, fqn, req.interfaces ?? []);
|
|
414
405
|
// overrides: for each one of the override method names, installs a
|
|
415
406
|
// method on the newly created object which represents the remote "reverse proxy".
|
|
416
407
|
if (overrides) {
|
|
@@ -475,12 +466,11 @@ class Kernel {
|
|
|
475
466
|
this._defineOverridenProperty(obj, objref, override, propInfo);
|
|
476
467
|
}
|
|
477
468
|
_defineOverridenProperty(obj, objref, override, propInfo) {
|
|
478
|
-
var _a;
|
|
479
469
|
const propertyName = override.property;
|
|
480
470
|
this._debug('apply override', propertyName);
|
|
481
471
|
// save the old property under $jsii$super$<prop>$ so that property overrides
|
|
482
472
|
// can still access it via `super.<prop>`.
|
|
483
|
-
const prev =
|
|
473
|
+
const prev = getPropertyDescriptor(obj, propertyName) ?? {
|
|
484
474
|
value: obj[propertyName],
|
|
485
475
|
writable: true,
|
|
486
476
|
enumerable: true,
|
|
@@ -578,14 +568,13 @@ class Kernel {
|
|
|
578
568
|
this._debug('invoke async method override', override);
|
|
579
569
|
const args = this._toSandboxValues(methodArgs, methodInfo.parameters);
|
|
580
570
|
return new Promise((succeed, fail) => {
|
|
581
|
-
var _a;
|
|
582
571
|
const cbid = this._makecbid();
|
|
583
572
|
this._debug('adding callback to queue', cbid);
|
|
584
573
|
this.cbs[cbid] = {
|
|
585
574
|
objref,
|
|
586
575
|
override,
|
|
587
576
|
args,
|
|
588
|
-
expectedReturnType:
|
|
577
|
+
expectedReturnType: methodInfo.returns ?? 'void',
|
|
589
578
|
succeed,
|
|
590
579
|
fail,
|
|
591
580
|
};
|
|
@@ -600,7 +589,6 @@ class Kernel {
|
|
|
600
589
|
configurable: false,
|
|
601
590
|
writable: false,
|
|
602
591
|
value: (...methodArgs) => {
|
|
603
|
-
var _a;
|
|
604
592
|
this._debug('invoke sync method override', override, 'args', methodArgs);
|
|
605
593
|
// We should be validating the actual arguments according to the
|
|
606
594
|
// declared parameters here, but let's just assume the JSII runtime on the
|
|
@@ -615,7 +603,7 @@ class Kernel {
|
|
|
615
603
|
},
|
|
616
604
|
});
|
|
617
605
|
this._debug('Result', result);
|
|
618
|
-
return this._toSandbox(result,
|
|
606
|
+
return this._toSandbox(result, methodInfo.returns ?? 'void');
|
|
619
607
|
},
|
|
620
608
|
});
|
|
621
609
|
}
|
|
@@ -641,8 +629,7 @@ class Kernel {
|
|
|
641
629
|
return { ti, obj: instance, fn };
|
|
642
630
|
}
|
|
643
631
|
_validateMethodArguments(method, args) {
|
|
644
|
-
|
|
645
|
-
const params = (_a = method === null || method === void 0 ? void 0 : method.parameters) !== null && _a !== void 0 ? _a : [];
|
|
632
|
+
const params = method?.parameters ?? [];
|
|
646
633
|
// error if args > params
|
|
647
634
|
if (args.length > params.length && !(method && method.variadic)) {
|
|
648
635
|
throw new Error(`Too many arguments (method accepts ${params.length} parameters, got ${args.length} arguments)`);
|
|
@@ -689,14 +676,13 @@ class Kernel {
|
|
|
689
676
|
return curr;
|
|
690
677
|
}
|
|
691
678
|
_typeInfoForFqn(fqn) {
|
|
692
|
-
var _a;
|
|
693
679
|
const components = fqn.split('.');
|
|
694
680
|
const moduleName = components[0];
|
|
695
681
|
const assembly = this.assemblies[moduleName];
|
|
696
682
|
if (!assembly) {
|
|
697
683
|
throw new Error(`Module '${moduleName}' not found`);
|
|
698
684
|
}
|
|
699
|
-
const types =
|
|
685
|
+
const types = assembly.metadata.types ?? {};
|
|
700
686
|
const fqnInfo = types[fqn];
|
|
701
687
|
if (!fqnInfo) {
|
|
702
688
|
throw new Error(`Type '${fqn}' not found`);
|
|
@@ -714,13 +700,12 @@ class Kernel {
|
|
|
714
700
|
return ti;
|
|
715
701
|
}
|
|
716
702
|
_tryTypeInfoForMethod(methodName, classFqn, interfaces = []) {
|
|
717
|
-
var _a, _b;
|
|
718
703
|
for (const fqn of [classFqn, ...interfaces]) {
|
|
719
704
|
if (fqn === wire.EMPTY_OBJECT_FQN) {
|
|
720
705
|
continue;
|
|
721
706
|
}
|
|
722
707
|
const typeinfo = this._typeInfoForFqn(fqn);
|
|
723
|
-
const methods =
|
|
708
|
+
const methods = typeinfo.methods ?? [];
|
|
724
709
|
for (const m of methods) {
|
|
725
710
|
if (m.name === methodName) {
|
|
726
711
|
return m;
|
|
@@ -729,7 +714,7 @@ class Kernel {
|
|
|
729
714
|
// recursion to parent type (if exists)
|
|
730
715
|
const bases = [
|
|
731
716
|
typeinfo.base,
|
|
732
|
-
...(
|
|
717
|
+
...(typeinfo.interfaces ?? []),
|
|
733
718
|
];
|
|
734
719
|
for (const base of bases) {
|
|
735
720
|
if (!base) {
|
|
@@ -744,7 +729,6 @@ class Kernel {
|
|
|
744
729
|
return undefined;
|
|
745
730
|
}
|
|
746
731
|
_tryTypeInfoForProperty(property, classFqn, interfaces = []) {
|
|
747
|
-
var _a;
|
|
748
732
|
for (const fqn of [classFqn, ...interfaces]) {
|
|
749
733
|
if (fqn === wire.EMPTY_OBJECT_FQN) {
|
|
750
734
|
continue;
|
|
@@ -760,12 +744,12 @@ class Kernel {
|
|
|
760
744
|
else if (spec.isInterfaceType(typeInfo)) {
|
|
761
745
|
const interfaceTypeInfo = typeInfo;
|
|
762
746
|
properties = interfaceTypeInfo.properties;
|
|
763
|
-
bases =
|
|
747
|
+
bases = interfaceTypeInfo.interfaces ?? [];
|
|
764
748
|
}
|
|
765
749
|
else {
|
|
766
750
|
throw new Error(`Type of kind ${typeInfo.kind} does not have properties`);
|
|
767
751
|
}
|
|
768
|
-
for (const p of properties
|
|
752
|
+
for (const p of properties ?? []) {
|
|
769
753
|
if (p.name === property) {
|
|
770
754
|
return p;
|
|
771
755
|
}
|
|
@@ -847,7 +831,7 @@ class Kernel {
|
|
|
847
831
|
return this._boxUnboxParameters(xs, parameters, this._fromSandbox.bind(this));
|
|
848
832
|
}
|
|
849
833
|
_boxUnboxParameters(xs, parameters, boxUnbox) {
|
|
850
|
-
parameters = [...(parameters
|
|
834
|
+
parameters = [...(parameters ?? [])];
|
|
851
835
|
const variadic = parameters.length > 0 && !!parameters[parameters.length - 1].variadic;
|
|
852
836
|
// Repeat the last (variadic) type to match the number of actual arguments
|
|
853
837
|
while (variadic && parameters.length < xs.length) {
|
|
@@ -917,4 +901,4 @@ class Assembly {
|
|
|
917
901
|
this.closure = closure;
|
|
918
902
|
}
|
|
919
903
|
}
|
|
920
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VybmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsia2VybmVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUNuQyxvQ0FBb0M7QUFDcEMsK0JBQStCO0FBQy9CLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsMkJBQTJCO0FBQzNCLHlCQUF5QjtBQUV6Qiw2QkFBNkI7QUFDN0IsK0JBQWtDO0FBQ2xDLHVDQUE0RDtBQUM1RCxvQ0FBb0M7QUFDcEMsd0NBQXdDO0FBRXhDLE1BQWEsTUFBTTtJQWlCakI7Ozs7OztPQU1HO0lBQ0gsWUFBMEIsZUFBZ0Q7UUFDeEUsZ0VBQWdFO1FBQ2hFLHFEQUFxRDtRQUY3QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUM7UUF2QjFFOztXQUVHO1FBQ0ksaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFcEIsZUFBVSxHQUFpQyxFQUFFLENBQUM7UUFDckMsWUFBTyxHQUFHLElBQUkscUJBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLFFBQUcsR0FBaUMsRUFBRSxDQUFDO1FBQ3ZDLFlBQU8sR0FBaUMsRUFBRSxDQUFDO1FBQzNDLGFBQVEsR0FBd0MsRUFBRSxDQUFDO1FBQ25ELFdBQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxrREFBa0Q7UUFpQnhFLDJEQUEyRDtRQUUzRCxnRkFBZ0Y7UUFDaEYsZ0ZBQWdGO1FBQ2hGLDhEQUE4RDtRQUM5RCwrRUFBK0U7UUFDL0UsZUFBZTtRQUNmLG9HQUFvRztRQUNwRyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNsRCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFF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UixRQUFRLENBQWU7UUFDdkIsWUFBTyxHQUFQLE9BQU8sQ0FBSztJQUMzQixDQUFDO0NBQ0wiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzcGVjIGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0ICogYXMgY3AgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgdGFyIGZyb20gJ3Rhcic7XG5pbXBvcnQgKiBhcyB2bSBmcm9tICd2bSc7XG5cbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBUT0tFTl9SRUYgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBPYmplY3RUYWJsZSwgdGFnSnNpaUNvbnN0cnVjdG9yIH0gZnJvbSAnLi9vYmplY3RzJztcbmltcG9ydCAqIGFzIG9uRXhpdCBmcm9tICcuL29uLWV4aXQnO1xuaW1wb3J0ICogYXMgd2lyZSBmcm9tICcuL3NlcmlhbGl6YXRpb24nO1xuXG5leHBvcnQgY2xhc3MgS2VybmVsIHtcbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIGZvciB2ZXJib3NlIGRlYnVnZ2luZy5cbiAgICovXG4gIHB1YmxpYyB0cmFjZUVuYWJsZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGFzc2VtYmxpZXM6IHsgW25hbWU6IHN0cmluZ106IEFzc2VtYmx5IH0gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBvYmplY3RzID0gbmV3IE9iamVjdFRhYmxlKHRoaXMuX3R5cGVJbmZvRm9yRnFuLmJpbmQodGhpcykpO1xuICBwcml2YXRlIGNiczogeyBbY2JpZDogc3RyaW5nXTogQ2FsbGJhY2sgfSA9IHt9O1xuICBwcml2YXRlIHdhaXRpbmc6IHsgW2NiaWQ6IHN0cmluZ106IENhbGxiYWNrIH0gPSB7fTtcbiAgcHJpdmF0ZSBwcm9taXNlczogeyBbcHJpZDogc3RyaW5nXTogQXN5bmNJbnZvY2F0aW9uIH0gPSB7fTtcbiAgcHJpdmF0ZSBuZXh0aWQgPSAyMDAwMDsgLy8gaW5jcmVtZW50aW5nIGNvdW50ZXIgZm9yIG9iamlkLCBjYmlkLCBwcm9taXNlaWRcbiAgcHJpdmF0ZSBzeW5jSW5Qcm9ncmVzcz86IHN0cmluZzsgLy8gZm9yYmlkcyBhc3luYyBjYWxscyAoYmVnaW4pIHdoaWxlIHByb2Nlc3Npbmcgc3luYyBjYWxscyAoZ2V0L3NldC9pbnZva2UpXG4gIHByaXZhdGUgaW5zdGFsbERpcj86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHNhbmRib3g6IHZtLkNvbnRleHQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBqc2lpIGtlcm5lbCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja0hhbmRsZXIgVGhpcyBoYW5kbGVyIGlzIGludm9rZWQgd2hlbiBhIHN5bmNocm9ub3VzIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICBJdCdzIHJlc3BvbnNpYmlsaXR5IGlzIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGFuZCByZXR1cm4gaXQnc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAob3IgdGhyb3cgYW4gZXJyb3IpLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjYWxsYmFja0hhbmRsZXI6IChjYWxsYmFjazogYXBpLkNhbGxiYWNrKSA9PiBhbnkpIHtcbiAgICAvLyBgc2V0SW1tZWRpYXRlYCBpcyByZXF1aXJlZCBmb3IgdGVzdHMgdG8gcGFzcyAoaXQgaXMgb3RoZXJ3aXNlXG4gICAgLy8gaW1wb3NzaWJsZSB0byB3YWl0IGZvciBpbi1WTSBwcm9taXNlcyB0byBjb21wbGV0ZSlcblxuICAgIC8vIGBCdWZmZXJgIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgc2ltcGxlLXJlc291cmNlLWJ1bmRsZXIuXG5cbiAgICAvLyBIQUNLOiB3aGVuIHdlIHdlYnBhY2sgQGpzaWkvcnVudGltZSwgYWxsIFwicmVxdWlyZVwiIHN0YXRlbWVudHMgZ2V0IHRyYW5zcGlsZWQsXG4gICAgLy8gc28gbW9kdWxlcyBjYW4gYmUgcmVzb2x2ZWQgd2l0aGluIHRoZSBwYWNrLiBIb3dldmVyLCBoZXJlIHdlIGFjdHVhbGx5IHdhbnQgdG9cbiAgICAvLyBsZXQgbG9hZGVkIG1vZHVsZXMgdG8gdXNlIHRoZSBuYXRpdmUgbm9kZSBcInJlcXVpcmVcIiBtZXRob2QuXG4gICAgLy8gSSB3b25kZXIgaWYgd2VicGFjayBoYXMgc29tZSBwcmFnbWEgdGhhdCBhbGxvd3Mgb3B0aW5nLW91dCBhdCBjZXJ0YWluIHBvaW50c1xuICAgIC8vIGluIHRoZSBjb2RlLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICBjb25zdCBtb2R1bGVMb2FkID0gcmVxdWlyZSgnbW9kdWxlJykuTW9kdWxlLl9sb2FkO1xuICAgIGNvbnN0IG5vZGVSZXF1aXJlID0gKHA6IHN0cmluZykgPT4gbW9kdWxlTG9hZChwLCBtb2R1bGUsIGZhbHNlKTtcblxuICAgIHRoaXMuc2FuZGJveCA9IHZtLmNyZWF0ZUNvbnRleHQoe1xuICAgICAgQnVmZmVyLCAvLyB0byB1c2Ugc2ltcGxlLXJlc291cmNlLWJ1bmRsZXJcbiAgICAgIHNldEltbWVkaWF0ZSwgLy8gYXN5bmMgdGVzdHNcbiAgICAgIHJlcXVpcmU6IG5vZGVSZXF1aXJlLCAvLyBtb2R1bGVzIG5lZWQgdG8gXCJyZXF1aXJlXCJcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkKHJlcTogYXBpLkxvYWRSZXF1ZXN0KTogYXBpLkxvYWRSZXNwb25zZSB7XG4gICAgdGhpcy5fZGVidWcoJ2xvYWQnLCByZXEpO1xuXG4gICAgaWYgKCdhc3NlbWJseScgaW4gcmVxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdgYXNzZW1ibHlgIGZpZWxkIGlzIGRlcHJlY2F0ZWQgZm9yIFwibG9hZFwiLCB1c2UgYG5hbWVgLCBgdmVyc2lvbmAgYW5kIGB0YXJiYWxsYCBpbnN0ZWFkJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGtnbmFtZSA9IHJlcS5uYW1lO1xuICAgIGNvbnN0IHBrZ3ZlciA9IHJlcS52ZXJzaW9uO1xuXG4gICAgLy8gY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHN1Y2ggYSBtb2R1bGVcbiAgICBjb25zdCBwYWNrYWdlRGlyID0gdGhpcy5fZ2V0UGFja2FnZURpcihwa2duYW1lKTtcbiAgICBpZiAoZnMucGF0aEV4aXN0c1N5bmMocGFja2FnZURpcikpIHtcbiAgICAgIC8vIG1vZHVsZSBleGlzdHMsIHZlcmlmeSB2ZXJzaW9uXG4gICAgICBjb25zdCBlcGtnID0gZnMucmVhZEpzb25TeW5jKHBhdGguam9pbihwYWNrYWdlRGlyLCAncGFja2FnZS5qc29uJykpO1xuICAgICAgaWYgKGVwa2cudmVyc2lvbiAhPT0gcGtndmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTXVsdGlwbGUgdmVyc2lvbnMgJHtwa2d2ZXJ9IGFuZCAke2Vwa2cudmVyc2lvbn0gb2YgdGhlIGAgK1xuICAgICAgICAgICAgYHBhY2thZ2UgJyR7cGtnbmFtZX0nIGNhbm5vdCBiZSBsb2FkZWQgdG9nZXRoZXIgc2luY2UgdGhpcyBpcyB1bnN1cHBvcnRlZCBieSBgICtcbiAgICAgICAgICAgICdzb21lIHJ1bnRpbWUgZW52aXJvbm1lbnRzJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gc2FtZSB2ZXJzaW9uLCBuby1vcFxuICAgICAgdGhpcy5fZGVidWcoJ2xvb2sgdXAgYWxyZWFkeS1sb2FkZWQgYXNzZW1ibHknLCBwa2duYW1lKTtcbiAgICAgIGNvbnN0IGFzc20gPSB0aGlzLmFzc2VtYmxpZXNbcGtnbmFtZV07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFzc2VtYmx5OiBhc3NtLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgIHR5cGVzOiBPYmplY3Qua2V5cyhhc3NtLm1ldGFkYXRhLnR5cGVzID8/IHt9KS5sZW5ndGgsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgaW5zdGFsbCBkaXJlY3RvcnkgKHRoZXJlIG1heSBiZSBzZXZlcmFsIHBhdGggY29tcG9uZW50cyBmb3IgQHNjb3BlZC9wYWNrYWdlcylcbiAgICBmcy5ta2RpcnBTeW5jKHBhY2thZ2VEaXIpO1xuXG4gICAgLy8gRm9yY2UgdW1hc2sgdG8gaGF2ZSBucG0taW5zdGFsbC1saWtlIHBlcm1pc3Npb25zXG4gICAgY29uc3Qgb3JpZ2luYWxVbWFzayA9IHByb2Nlc3MudW1hc2soMG8wMjIpO1xuICAgIHRyeSB7XG4gICAgICAvLyB1bnRhciB0aGUgYXJjaGl2ZSB0byBpdHMgZmluYWwgbG9jYXRpb25cbiAgICAgIHRhci5leHRyYWN0KHtcbiAgICAgICAgY3dkOiBwYWNrYWdlRGlyLFxuICAgICAgICBmaWxlOiByZXEudGFyYmFsbCxcbiAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICBzdHJpcDogMSwgLy8gUmVtb3ZlcyB0aGUgJ3BhY2thZ2UvJyBwYXRoIGVsZW1lbnQgZnJvbSBlbnRyaWVzXG4gICAgICAgIHN5bmM6IHRydWUsXG4gICAgICAgIHVubGluazogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXNldCB1bWFzayB0byB0aGUgaW5pdGlhbCB2YWx1ZVxuICAgICAgcHJvY2Vzcy51bWFzayhvcmlnaW5hbFVtYXNrKTtcbiAgICB9XG5cbiAgICAvLyByZWFkIC5qc2lpIG1ldGFkYXRhIGZyb20gdGhlIHJvb3Qgb2YgdGhlIHBhY2thZ2VcbiAgICBjb25zdCBqc2lpTWV0YWRhdGFGaWxlID0gcGF0aC5qb2luKHBhY2thZ2VEaXIsIHNwZWMuU1BFQ19GSUxFX05BTUUpO1xuICAgIGlmICghZnMucGF0aEV4aXN0c1N5bmMoanNpaU1ldGFkYXRhRmlsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFBhY2thZ2UgdGFyYmFsbCAke3JlcS50YXJiYWxsfSBtdXN0IGhhdmUgYSBmaWxlIG5hbWVkICR7c3BlYy5TUEVDX0ZJTEVfTkFNRX0gYXQgdGhlIHJvb3RgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYXNzbVNwZWMgPSBmcy5yZWFkSnNvblN5bmMoanNpaU1ldGFkYXRhRmlsZSkgYXMgc3BlYy5Bc3NlbWJseTtcblxuICAgIC8vIGxvYWQgdGhlIG1vZHVsZSBhbmQgY2FwdHVyZSBpdCdzIGNsb3N1cmVcbiAgICBjb25zdCBjbG9zdXJlID0gdGhpcy5fZXhlY3V0ZShcbiAgICAgIGByZXF1aXJlKFN0cmluZy5yYXdcXGAke3BhY2thZ2VEaXJ9XFxgKWAsXG4gICAgICBwYWNrYWdlRGlyLFxuICAgICk7XG4gICAgY29uc3QgYXNzbSA9IG5ldyBBc3NlbWJseShhc3NtU3BlYywgY2xvc3VyZSk7XG4gICAgdGhpcy5fYWRkQXNzZW1ibHkoYXNzbSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXNzZW1ibHk6IGFzc21TcGVjLm5hbWUsXG4gICAgICB0eXBlczogT2JqZWN0LmtleXMoYXNzbVNwZWMudHlwZXMgPz8ge30pLmxlbmd0aCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGludm9rZUJpblNjcmlwdChcbiAgICByZXE6IGFwaS5JbnZva2VTY3JpcHRSZXF1ZXN0LFxuICApOiBhcGkuSW52b2tlU2NyaXB0UmVzcG9uc2Uge1xuICAgIGNvbnN0IHBhY2thZ2VEaXIgPSB0aGlzLl9nZXRQYWNrYWdlRGlyKHJlcS5hc3NlbWJseSk7XG4gICAgaWYgKGZzLnBhdGhFeGlzdHNTeW5jKHBhY2thZ2VEaXIpKSB7XG4gICAgICAvLyBtb2R1bGUgZXhpc3RzLCB2ZXJpZnkgdmVyc2lvblxuICAgICAgY29uc3QgZXBrZyA9IGZzLnJlYWRKc29uU3luYyhwYXRoLmpvaW4ocGFja2FnZURpciwgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgICAgaWYgKCFlcGtnLmJpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIGJpbiBzY3JpcHRzIGRlZmluZWQgZm9yIHRoaXMgcGFja2FnZS4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2NyaXB0UGF0aCA9IGVwa2cuYmluW3JlcS5zY3JpcHRdO1xuXG4gICAgICBpZiAoIWVwa2cuYmluKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IHdpdGggbmFtZSAke3JlcS5zY3JpcHR9IHdhcyBub3QgZGVmaW5lZC5gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY3Auc3Bhd25TeW5jKFxuICAgICAgICBwYXRoLmpvaW4ocGFja2FnZURpciwgc2NyaXB0UGF0aCksXG4gICAgICAgIHJlcS5hcmdzID8/IFtdLFxuICAgICAgICB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGYtOCcsXG4gICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY3VycmVudCBOT0RFX09QVElPTlMgYXJlIGhvbm9yZWQgaWYgd2Ugc2hlbGwgb3V0IHRvIG5vZGVcbiAgICAgICAgICAgIE5PREVfT1BUSU9OUzogcHJvY2Vzcy5leGVjQXJndi5qb2luKCcgJyksXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgXCJ0aGlzXCIgbm9kZSBpcyBhaGVhZCBvZiAkUEFUSCBqdXN0IGluIGNhc2VcbiAgICAgICAgICAgIFBBVEg6IGAke3BhdGguZGlybmFtZShwcm9jZXNzLmV4ZWNQYXRoKX06JHtwcm9jZXNzLmVudi5QQVRIfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0ZG91dDogcmVzdWx0LnN0ZG91dCxcbiAgICAgICAgc3RkZXJyOiByZXN1bHQuc3RkZXJyLFxuICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgICAgIHNpZ25hbDogcmVzdWx0LnNpZ25hbCxcbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgUGFja2FnZSB3aXRoIG5hbWUgJHtyZXEuYXNzZW1ibHl9IHdhcyBub3QgbG9hZGVkLmApO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZShyZXE6IGFwaS5DcmVhdGVSZXF1ZXN0KTogYXBpLkNyZWF0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlKHJlcSk7XG4gIH1cblxuICBwdWJsaWMgZGVsKHJlcTogYXBpLkRlbFJlcXVlc3QpOiBhcGkuRGVsUmVzcG9uc2Uge1xuICAgIGNvbnN0IHsgb2JqcmVmIH0gPSByZXE7XG5cbiAgICB0aGlzLl9kZWJ1ZygnZGVsJywgb2JqcmVmKTtcbiAgICB0aGlzLm9iamVjdHMuZGVsZXRlT2JqZWN0KG9ianJlZik7XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBwdWJsaWMgc2dldChyZXE6IGFwaS5TdGF0aWNHZXRSZXF1ZXN0KTogYXBpLkdldFJlc3BvbnNlIHtcbiAgICBjb25zdCB7IGZxbiwgcHJvcGVydHkgfSA9IHJlcTtcbiAgICBjb25zdCBzeW1ib2wgPSBgJHtmcW59LiR7cHJvcGVydHl9YDtcbiAgICB0aGlzLl9kZWJ1Zygnc2dldCcsIHN5bWJvbCk7XG4gICAgY29uc3QgdGkgPSB0aGlzLl90eXBlSW5mb0ZvclByb3BlcnR5KHByb3BlcnR5LCBmcW4pO1xuXG4gICAgaWYgKCF0aS5zdGF0aWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcHJvcGVydHkgJHtzeW1ib2x9IGlzIG5vdCBzdGF0aWNgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm90b3R5cGUgPSB0aGlzLl9maW5kU3ltYm9sKGZxbik7XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2Vuc3VyZVN5bmMoYHByb3BlcnR5ICR7cHJvcGVydHl9YCwgKCkgPT5cbiAgICAgIHRoaXMuX3dyYXBTYW5kYm94Q29kZSgoKSA9PiBwcm90b3R5cGVbcHJvcGVydHldKSxcbiAgICApO1xuXG4gICAgdGhpcy5fZGVidWcoJ3ZhbHVlOicsIHZhbHVlKTtcbiAgICBjb25zdCByZXQgPSB0aGlzLl9mcm9tU2FuZGJveCh2YWx1ZSwgdGkpO1xuICAgIHRoaXMuX2RlYnVnKCdyZXQnLCByZXQpO1xuICAgIHJldHVybiB7IHZhbHVlOiByZXQgfTtcbiAgfVxuXG4gIHB1YmxpYyBzc2V0KHJlcTogYXBpLlN0YXRpY1NldFJlcXVlc3QpOiBhcGkuU2V0UmVzcG9uc2Uge1xuICAgIGNvbnN0IHsgZnFuLCBwcm9wZXJ0eSwgdmFsdWUgfSA9IHJlcTtcbiAgICBjb25zdCBzeW1ib2wgPSBgJHtmcW59LiR7cHJvcGVydHl9YDtcbiAgICB0aGlzLl9kZWJ1Zygnc3NldCcsIHN5bWJvbCk7XG4gICAgY29uc3QgdGkgPSB0aGlzLl90eXBlSW5mb0ZvclByb3BlcnR5KHByb3BlcnR5LCBmcW4pO1xuXG4gICAgaWYgKCF0aS5zdGF0aWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcHJvcGVydHkgJHtzeW1ib2x9IGlzIG5vdCBzdGF0aWNgKTtcbiAgICB9XG5cbiAgICBpZiAodGkuaW1tdXRhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0YXRpYyBwcm9wZXJ0eSAke3N5bWJvbH0gaXMgcmVhZG9ubHlgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm90b3R5cGUgPSB0aGlzLl9maW5kU3ltYm9sKGZxbik7XG5cbiAgICB0aGlzLl9lbnN1cmVTeW5jKGBwcm9wZXJ0eSAke3Byb3BlcnR5fWAsICgpID0+XG4gICAgICB0aGlzLl93cmFwU2FuZGJveENvZGUoXG4gICAgICAgICgpID0+IChwcm90b3R5cGVbcHJvcGVydHldID0gdGhpcy5fdG9TYW5kYm94KHZhbHVlLCB0aSkpLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHVibGljIGdldChyZXE6IGFwaS5HZXRSZXF1ZXN0KTogYXBpLkdldFJlc3BvbnNlIHtcbiAgICBjb25zdCB7IG9ianJlZiwgcHJvcGVydHkgfSA9IHJlcTtcbiAgICB0aGlzLl9kZWJ1ZygnZ2V0Jywgb2JqcmVmLCBwcm9wZXJ0eSk7XG4gICAgY29uc3QgeyBpbnN0YW5jZSwgZnFuLCBpbnRlcmZhY2VzIH0gPSB0aGlzLm9iamVjdHMuZmluZE9iamVjdChvYmpyZWYpO1xuICAgIGNvbnN0IHRpID0gdGhpcy5fdHlwZUluZm9Gb3JQcm9wZXJ0eShwcm9wZXJ0eSwgZnFuLCBpbnRlcmZhY2VzKTtcblxuICAgIC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBvdmVycmlkZGVuIGJ5IHRoZSBuYXRpdmUgY29kZSBhbmQgXCJnZXRcIiBpcyBjYWxsZWQgb24gdGhlIG9iamVjdCwgaXRcbiAgICAvLyBtZWFucyB0aGF0IHRoZSBuYXRpdmUgY29kZSBpcyB0cnlpbmcgdG8gYWNjZXNzIHRoZSBcInN1cGVyXCIgcHJvcGVydHkuIGluIG9yZGVyIHRvIGVuYWJsZVxuICAgIC8vIHRoYXQsIHdlIGFjdHVhbGx5IGtlZXAgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSBkZXNjcmlwdG9yIHdoZW4gd2Ugb3ZlcnJpZGUsXG4gICAgLy8gc28gYGZpbmRQcm9wZXJ0eVRhcmdldGAgd2lsbCByZXR1cm4gZWl0aGVyIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSBuYW1lIChcInByb3BlcnR5XCIpIG9yXG4gICAgLy8gdGhlIFwic3VwZXJcIiBwcm9wZXJ0eSBuYW1lIChzb21laGluZyBsaWtlIFwiJGpzaWkkc3VwZXIkPHByb3BlcnR5PiRcIikuXG4gICAgY29uc3QgcHJvcGVydHlUb0dldCA9IHRoaXMuX2ZpbmRQcm9wZXJ0eVRhcmdldChpbnN0YW5jZSwgcHJvcGVydHkpO1xuXG4gICAgLy8gbWFrZSB0aGUgYWN0dWFsIFwiZ2V0XCIsIGFuZCBibG9jayBhbnkgYXN5bmMgY2FsbHMgdGhhdCBtaWdodCBiZSBwZXJmb3JtZWRcbiAgICAvLyBieSBqc2lpIG92ZXJyaWRlcy5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2Vuc3VyZVN5bmMoXG4gICAgICBgcHJvcGVydHkgJyR7b2JqcmVmW1RPS0VOX1JFRl19LiR7cHJvcGVydHlUb0dldH0nYCxcbiAgICAgICgpID0+IHRoaXMuX3dyYXBTYW5kYm94Q29kZSgoKSA9PiBpbnN0YW5jZVtwcm9wZXJ0eVRvR2V0XSksXG4gICAgKTtcbiAgICB0aGlzLl9kZWJ1ZygndmFsdWU6JywgdmFsdWUpO1xuICAgIGNvbnN0IHJldCA9IHRoaXMuX2Zyb21TYW5kYm94KHZhbHVlLCB0aSk7XG4gICAgdGhpcy5fZGVidWcoJ3JldDonLCByZXQpO1xuICAgIHJldHVybiB7IHZhbHVlOiByZXQgfTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQocmVxOiBhcGkuU2V0UmVxdWVzdCk6IGFwaS5TZXRSZXNwb25zZSB7XG4gICAgY29uc3QgeyBvYmpyZWYsIHByb3BlcnR5LCB2YWx1ZSB9ID0gcmVxO1xuICAgIHRoaXMuX2RlYnVnKCdzZXQnLCBvYmpyZWYsIHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgY29uc3QgeyBpbnN0YW5jZSwgZnFuLCBpbnRlcmZhY2VzIH0gPSB0aGlzLm9iamVjdHMuZmluZE9iamVjdChvYmpyZWYpO1xuXG4gICAgY29uc3QgcHJvcEluZm8gPSB0aGlzLl90eXBlSW5mb0ZvclByb3BlcnR5KHJlcS5wcm9wZXJ0eSwgZnFuLCBpbnRlcmZhY2VzKTtcblxuICAgIGlmIChwcm9wSW5mby5pbW11dGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBzZXQgdmFsdWUgb2YgaW1tdXRhYmxlIHByb3BlcnR5ICR7cmVxLnByb3BlcnR5fSB0byAke3JlcS52YWx1ZX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eVRvU2V0ID0gdGhpcy5fZmluZFByb3BlcnR5VGFyZ2V0KGluc3RhbmNlLCBwcm9wZXJ0eSk7XG5cbiAgICB0aGlzLl9lbnN1cmVTeW5jKGBwcm9wZXJ0eSAnJHtvYmpyZWZbVE9LRU5fUkVGXX0uJHtwcm9wZXJ0eVRvU2V0fSdgLCAoKSA9PlxuICAgICAgdGhpcy5fd3JhcFNhbmRib3hDb2RlKFxuICAgICAgICAoKSA9PiAoaW5zdGFuY2VbcHJvcGVydHlUb1NldF0gPSB0aGlzLl90b1NhbmRib3godmFsdWUsIHByb3BJbmZvKSksXG4gICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBwdWJsaWMgaW52b2tlKHJlcTogYXBpLkludm9rZVJlcXVlc3QpOiBhcGkuSW52b2tlUmVzcG9uc2Uge1xuICAgIGNvbnN0IHsgb2JqcmVmLCBtZXRob2QgfSA9IHJlcTtcbiAgICBjb25zdCBhcmdzID0gcmVxLmFyZ3MgPz8gW107XG5cbiAgICB0aGlzLl9kZWJ1ZygnaW52b2tlJywgb2JqcmVmLCBtZXRob2QsIGFyZ3MpO1xuICAgIGNvbnN0IHsgdGksIG9iaiwgZm4gfSA9IHRoaXMuX2ZpbmRJbnZva2VUYXJnZXQob2JqcmVmLCBtZXRob2QsIGFyZ3MpO1xuXG4gICAgLy8gdmVyaWZ5IHRoaXMgaXMgbm90IGFuIGFzeW5jIG1ldGhvZFxuICAgIGlmICh0aS5hc3luYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21ldGhvZH0gaXMgYW4gYXN5bmMgbWV0aG9kLCB1c2UgXCJiZWdpblwiIGluc3RlYWRgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSB0aGlzLl9lbnN1cmVTeW5jKFxuICAgICAgYG1ldGhvZCAnJHtvYmpyZWZbVE9LRU5fUkVGXX0uJHttZXRob2R9J2AsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cmFwU2FuZGJveENvZGUoKCkgPT5cbiAgICAgICAgICBmbi5hcHBseShvYmosIHRoaXMuX3RvU2FuZGJveFZhbHVlcyhhcmdzLCB0aS5wYXJhbWV0ZXJzKSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9mcm9tU2FuZGJveChyZXQsIHRpLnJldHVybnMgPz8gJ3ZvaWQnKTtcbiAgICB0aGlzLl9kZWJ1ZygnaW52b2tlIHJlc3VsdCcsIHJlc3VsdCk7XG5cbiAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgfVxuXG4gIHB1YmxpYyBzaW52b2tlKHJlcTogYXBpLlN0YXRpY0ludm9rZVJlcXVlc3QpOiBhcGkuSW52b2tlUmVzcG9uc2Uge1xuICAgIGNvbnN0IHsgZnFuLCBtZXRob2QgfSA9IHJlcTtcbiAgICBjb25zdCBhcmdzID0gcmVxLmFyZ3MgPz8gW107XG5cbiAgICB0aGlzLl9kZWJ1Zygnc2ludm9rZScsIGZxbiwgbWV0aG9kLCBhcmdzKTtcblxuICAgIGNvbnN0IHRpID0gdGhpcy5fdHlwZUluZm9Gb3JNZXRob2QobWV0aG9kLCBmcW4pO1xuXG4gICAgaWYgKCF0aS5zdGF0aWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtmcW59LiR7bWV0aG9kfSBpcyBub3QgYSBzdGF0aWMgbWV0aG9kYCk7XG4gICAgfVxuXG4gICAgLy8gdmVyaWZ5IHRoaXMgaXMgbm90IGFuIGFzeW5jIG1ldGhvZFxuICAgIGlmICh0aS5hc3luYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21ldGhvZH0gaXMgYW4gYXN5bmMgbWV0aG9kLCB1c2UgXCJiZWdpblwiIGluc3RlYWRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm90b3R5cGUgPSB0aGlzLl9maW5kU3ltYm9sKGZxbik7XG4gICAgY29uc3QgZm4gPSBwcm90b3R5cGVbbWV0aG9kXSBhcyAoLi4ucGFyYW1zOiBhbnlbXSkgPT4gYW55O1xuXG4gICAgY29uc3QgcmV0ID0gdGhpcy5fZW5zdXJlU3luYyhgbWV0aG9kICcke2Zxbn0uJHttZXRob2R9J2AsICgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLl93cmFwU2FuZGJveENvZGUoKCkgPT5cbiAgICAgICAgZm4uYXBwbHkocHJvdG90eXBlLCB0aGlzLl90b1NhbmRib3hWYWx1ZXMoYXJncywgdGkucGFyYW1ldGVycykpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2RlYnVnKCdtZXRob2QgcmV0dXJuZWQ6JywgcmV0KTtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRoaXMuX2Zyb21TYW5kYm94KHJldCwgdGkucmV0dXJucyA/PyAndm9pZCcpIH07XG4gIH1cblxuICBwdWJsaWMgYmVnaW4ocmVxOiBhcGkuQmVnaW5SZXF1ZXN0KTogYXBpLkJlZ2luUmVzcG9uc2Uge1xuICAgIGNvbnN0IHsgb2JqcmVmLCBtZXRob2QgfSA9IHJlcTtcbiAgICBjb25zdCBhcmdzID0gcmVxLmFyZ3MgPz8gW107XG5cbiAgICB0aGlzLl9kZWJ1ZygnYmVnaW4nLCBvYmpyZWYsIG1ldGhvZCwgYXJncyk7XG5cbiAgICBpZiAodGhpcy5zeW5jSW5Qcm9ncmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGludm9rZSBhc3luYyBtZXRob2QgJyR7cmVxLm9ianJlZltUT0tFTl9SRUZdfS4ke3JlcS5tZXRob2R9JyB3aGlsZSBzeW5jICR7dGhpcy5zeW5jSW5Qcm9ncmVzc30gaXMgYmVpbmcgcHJvY2Vzc2VkYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0aSwgb2JqLCBmbiB9ID0gdGhpcy5fZmluZEludm9rZVRhcmdldChvYmpyZWYsIG1ldGhvZCwgYXJncyk7XG5cbiAgICAvLyB2ZXJpZnkgdGhpcyBpcyBpbmRlZWQgYW4gYXN5bmMgbWV0aG9kXG4gICAgaWYgKCF0aS5hc3luYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRob2QgJHttZXRob2R9IGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFzeW5jIG1ldGhvZGApO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLl93cmFwU2FuZGJveENvZGUoKCkgPT5cbiAgICAgIGZuLmFwcGx5KG9iaiwgdGhpcy5fdG9TYW5kYm94VmFsdWVzKGFyZ3MsIHRpLnBhcmFtZXRlcnMpKSxcbiAgICApIGFzIFByb21pc2U8YW55PjtcblxuICAgIC8vIHNpbmNlIHdlIGFyZSBwbGFubmluZyB0byByZXNvbHZlIHRoaXMgcHJvbWlzZSBpbiBhIGRpZmZlcmVudCBzY29wZVxuICAgIC8vIHdlIG5lZWQgdG8gaGFuZGxlIHJlamVjdGlvbnMgaGVyZSBbMV1cbiAgICAvLyBbMV06IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwOTIwMTc5L3Nob3VsZC1pLXJlZnJhaW4tZnJvbS1oYW5kbGluZy1wcm9taXNlLXJlamVjdGlvbi1hc3luY2hyb25vdXNseS80MDkyMTUwNVxuICAgIHByb21pc2UuY2F0Y2goKF8pID0+IHVuZGVmaW5lZCk7XG5cbiAgICBjb25zdCBwcmlkID0gdGhpcy5fbWFrZXByaWQoKTtcbiAgICB0aGlzLnByb21pc2VzW3ByaWRdID0ge1xuICAgICAgcHJvbWlzZSxcbiAgICAgIG1ldGhvZDogdGksXG4gICAgfTtcblxuICAgIHJldHVybiB7IHByb21pc2VpZDogcHJpZCB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGVuZChyZXE6IGFwaS5FbmRSZXF1ZXN0KTogUHJvbWlzZTxhcGkuRW5kUmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IHByb21pc2VpZCB9ID0gcmVxO1xuXG4gICAgdGhpcy5fZGVidWcoJ2VuZCcsIHByb21pc2VpZCk7XG5cbiAgICBjb25zdCB7IHByb21pc2UsIG1ldGhvZCB9ID0gdGhpcy5wcm9taXNlc1twcm9taXNlaWRdO1xuICAgIGlmIChwcm9taXNlID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgcHJvbWlzZSB3aXRoIElEOiAke3Byb21pc2VpZH1gKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgdGhpcy5fZGVidWcoJ3Byb21pc2UgcmVzdWx0OicsIHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5fZGVidWcoJ3Byb21pc2UgZXJyb3I6JywgZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJlc3VsdDogdGhpcy5fZnJvbVNhbmRib3gocmVzdWx0LCBtZXRob2QucmV0dXJucyA/PyAndm9pZCcpIH07XG4gIH1cblxuICBwdWJsaWMgY2FsbGJhY2tzKF9yZXE/OiBhcGkuQ2FsbGJhY2tzUmVxdWVzdCk6IGFwaS5DYWxsYmFja3NSZXNwb25zZSB7XG4gICAgdGhpcy5fZGVidWcoJ2NhbGxiYWNrcycpO1xuICAgIGNvbnN0IHJldCA9IE9iamVjdC5rZXlzKHRoaXMuY2JzKS5tYXAoKGNiaWQpID0+IHtcbiAgICAgIGNvbnN0IGNiID0gdGhpcy5jYnNbY2JpZF07XG4gICAgICB0aGlzLndhaXRpbmdbY2JpZF0gPSBjYjsgLy8gbW92ZSB0byB3YWl0aW5nXG4gICAgICBjb25zdCBjYWxsYmFjazogYXBpLkNhbGxiYWNrID0ge1xuICAgICAgICBjYmlkLFxuICAgICAgICBjb29raWU6IGNiLm92ZXJyaWRlLmNvb2tpZSxcbiAgICAgICAgaW52b2tlOiB7XG4gICAgICAgICAgb2JqcmVmOiBjYi5vYmpyZWYsXG4gICAgICAgICAgbWV0aG9kOiBjYi5vdmVycmlkZS5tZXRob2QsXG4gICAgICAgICAgYXJnczogY2IuYXJncyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gY2FsbGJhY2s7XG4gICAgfSk7XG5cbiAgICAvLyBtb3ZlIGFsbCBjYWxsYmFja3MgdG8gdGhlIHdhaXQgcXVldWUgYW5kIGNsZWFuIHRoZSBjYWxsYmFjayBxdWV1ZS5cbiAgICB0aGlzLmNicyA9IHt9O1xuICAgIHJldHVybiB7IGNhbGxiYWNrczogcmV0IH07XG4gIH1cblxuICBwdWJsaWMgY29tcGxldGUocmVxOiBhcGkuQ29tcGxldGVSZXF1ZXN0KTogYXBpLkNvbXBsZXRlUmVzcG9uc2Uge1xuICAgIGNvbnN0IHsgY2JpZCwgZXJyLCByZXN1bHQgfSA9IHJlcTtcblxuICAgIHRoaXMuX2RlYnVnKCdjb21wbGV0ZScsIGNiaWQsIGVyciwgcmVzdWx0KTtcblxuICAgIGlmICghKGNiaWQgaW4gdGhpcy53YWl0aW5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsYmFjayAke2NiaWR9IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIGNvbnN0IGNiID0gdGhpcy53YWl0aW5nW2NiaWRdO1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHRoaXMuX2RlYnVnKCdjb21wbGV0ZWQgd2l0aCBlcnJvcjonLCBlcnIpO1xuICAgICAgY2IuZmFpbChuZXcgRXJyb3IoZXJyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNhbmRveFJlc3VsdCA9IHRoaXMuX3RvU2FuZGJveChcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBjYi5leHBlY3RlZFJldHVyblR5cGUgPz8gJ3ZvaWQnLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX2RlYnVnKCdjb21wbGV0ZWQgd2l0aCByZXN1bHQ6Jywgc2FuZG94UmVzdWx0KTtcbiAgICAgIGNiLnN1Y2NlZWQoc2FuZG94UmVzdWx0KTtcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy53YWl0aW5nW2NiaWRdO1xuXG4gICAgcmV0dXJuIHsgY2JpZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhbmd1YWdlLXNwZWNpZmljIG5hbWVzIGZvciBhIGpzaWkgbW9kdWxlLlxuICAgKiBAcGFyYW0gYXNzZW1ibHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBqc2lpIG1vZHVsZSAoaS5lLiBqc2lpJGpzaWlfY2FsY3VsYXRvcl9saWIkKVxuICAgKi9cbiAgcHVibGljIG5hbWluZyhyZXE6IGFwaS5OYW1pbmdSZXF1ZXN0KTogYXBpLk5hbWluZ1Jlc3BvbnNlIHtcbiAgICBjb25zdCBhc3NlbWJseU5hbWUgPSByZXEuYXNzZW1ibHk7XG5cbiAgICB0aGlzLl9kZWJ1ZygnbmFtaW5nJywgYXNzZW1ibHlOYW1lKTtcblxuICAgIGNvbnN0IGFzc2VtYmx5ID0gdGhpcy5fYXNzZW1ibHlGb3IoYXNzZW1ibHlOYW1lKTtcbiAgICBjb25zdCB0YXJnZXRzID0gYXNzZW1ibHkubWV0YWRhdGEudGFyZ2V0cztcbiAgICBpZiAoIXRhcmdldHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCAtIFwidGFyZ2V0c1wiIGZvciAke2Fzc2VtYmx5TmFtZX0gaXMgbWlzc2luZyFgKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBuYW1pbmc6IHRhcmdldHMgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0cyhfcmVxPzogYXBpLlN0YXRzUmVxdWVzdCk6IGFwaS5TdGF0c1Jlc3BvbnNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgb2JqZWN0Q291bnQ6IHRoaXMub2JqZWN0cy5jb3VudCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkQXNzZW1ibHkoYXNzbTogQXNzZW1ibHkpIHtcbiAgICB0aGlzLmFzc2VtYmxpZXNbYXNzbS5tZXRhZGF0YS5uYW1lXSA9IGFzc207XG5cbiAgICAvLyBhZGQgdGhlIF9fanNpaV9fLmZxbiBwcm9wZXJ0eSBvbiBldmVyeSBjb25zdHJ1Y3Rvci4gdGhpcyBhbGxvd3NcbiAgICAvLyB0cmF2ZXJzaW5nIGJldHdlZW4gdGhlIGphdmFzY3JpcHQgYW5kIGpzaWkgd29ybGRzIGdpdmVuIGFueSBvYmplY3QuXG4gICAgZm9yIChjb25zdCBmcW4gb2YgT2JqZWN0LmtleXMoYXNzbS5tZXRhZGF0YS50eXBlcyA/PyB7fSkpIHtcbiAgICAgIGNvbnN0IHR5cGVkZWYgPSBhc3NtLm1ldGFkYXRhLnR5cGVzIVtmcW5dO1xuICAgICAgc3dpdGNoICh0eXBlZGVmLmtpbmQpIHtcbiAgICAgICAgY2FzZSBzcGVjLlR5cGVLaW5kLkludGVyZmFjZTpcbiAgICAgICAgICBjb250aW51ZTsgLy8gaW50ZXJmYWNlcyBkb24ndCByZWFsbHkgZXhpc3RcbiAgICAgICAgY2FzZSBzcGVjLlR5cGVLaW5kLkNsYXNzOlxuICAgICAgICBjYXNlIHNwZWMuVHlwZUtpbmQuRW51bTpcbiAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMuX2ZpbmRTeW1ib2woZnFuKTtcbiAgICAgICAgICB0YWdKc2lpQ29uc3RydWN0b3IoY29uc3RydWN0b3IsIGZxbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZmluZCB0aGUgamF2YXNjcmlwdCBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgYSBqc2lpIEZRTi5cbiAgcHJpdmF0ZSBfZmluZEN0b3IoXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgYXJnczogYW55W10sXG4gICk6IHsgY3RvcjogYW55OyBwYXJhbWV0ZXJzPzogc3BlYy5QYXJhbWV0ZXJbXSB9IHtcbiAgICBpZiAoZnFuID09PSB3aXJlLkVNUFRZX09CSkVDVF9GUU4pIHtcbiAgICAgIHJldHVybiB7IGN0b3I6IE9iamVjdCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGVpbmZvID0gdGhpcy5fdHlwZUluZm9Gb3JGcW4oZnFuKTtcblxuICAgIHN3aXRjaCAodHlwZWluZm8ua2luZCkge1xuICAgICAgY2FzZSBzcGVjLlR5cGVLaW5kLkNsYXNzOlxuICAgICAgICBjb25zdCBjbGFzc1R5cGUgPSB0eXBlaW5mbyBhcyBzcGVjLkNsYXNzVHlwZTtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVNZXRob2RBcmd1bWVudHMoY2xhc3NUeXBlLmluaXRpYWxpemVyLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjdG9yOiB0aGlzLl9maW5kU3ltYm9sKGZxbiksXG4gICAgICAgICAgcGFyYW1ldGVyczogY2xhc3NUeXBlLmluaXRpYWxpemVyICYmIGNsYXNzVHlwZS5pbml0aWFsaXplci5wYXJhbWV0ZXJzLFxuICAgICAgICB9O1xuXG4gICAgICBjYXNlIHNwZWMuVHlwZUtpbmQuSW50ZXJmYWNlOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBjcmVhdGUgYW4gb2JqZWN0IHdpdGggYW4gRlFOIG9mIGFuIGludGVyZmFjZTogJHtmcW59YCxcbiAgICAgICAgKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIEZRTiBraW5kOiAke2Zxbn1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRQYWNrYWdlRGlyKHBrZ25hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmluc3RhbGxEaXIpIHtcbiAgICAgIHRoaXMuaW5zdGFsbERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2pzaWkta2VybmVsLScpKTtcbiAgICAgIGZzLm1rZGlycFN5bmMocGF0aC5qb2luKHRoaXMuaW5zdGFsbERpciwgJ25vZGVfbW9kdWxlcycpKTtcbiAgICAgIHRoaXMuX2RlYnVnKCdjcmVhdGluZyBqc2lpLWtlcm5lbCBtb2R1bGVzIHdvcmtkaXI6JywgdGhpcy5pbnN0YWxsRGlyKTtcblxuICAgICAgb25FeGl0LnJlbW92ZVN5bmModGhpcy5pbnN0YWxsRGlyKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmluc3RhbGxEaXIsICdub2RlX21vZHVsZXMnLCBwa2duYW1lKTtcbiAgfVxuXG4gIC8vIHByZWZpeGVkIHdpdGggXyB0byBhbGxvdyBjYWxsaW5nIHRoaXMgbWV0aG9kIGludGVybmFsbHkgd2l0aG91dFxuICAvLyBnZXR0aW5nIGl0IHJlY29yZGVkIGZvciB0ZXN0aW5nLlxuICBwcml2YXRlIF9jcmVhdGUocmVxOiBhcGkuQ3JlYXRlUmVxdWVzdCk6IGFwaS5DcmVhdGVSZXNwb25zZSB7XG4gICAgdGhpcy5fZGVidWcoJ2NyZWF0ZScsIHJlcSk7XG4gICAgY29uc3QgeyBmcW4sIGludGVyZmFjZXMsIG92ZXJyaWRlcyB9ID0gcmVxO1xuXG4gICAgY29uc3QgcmVxdWVzdEFyZ3MgPSByZXEuYXJncyA/PyBbXTtcblxuICAgIGNvbnN0IGN0b3JSZXN1bHQgPSB0aGlzLl9maW5kQ3RvcihmcW4sIHJlcXVlc3RBcmdzKTtcbiAgICBjb25zdCBjdG9yID0gY3RvclJlc3VsdC5jdG9yO1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuX3dyYXBTYW5kYm94Q29kZShcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBjdG9yKC4uLnRoaXMuX3RvU2FuZGJveFZhbHVlcyhyZXF1ZXN0QXJncywgY3RvclJlc3VsdC5wYXJhbWV0ZXJzKSksXG4gICAgKTtcbiAgICBjb25zdCBvYmpyZWYgPSB0aGlzLm9iamVjdHMucmVnaXN0ZXJPYmplY3Qob2JqLCBmcW4sIHJlcS5pbnRlcmZhY2VzID8/IFtdKTtcblxuICAgIC8vIG92ZXJyaWRlczogZm9yIGVhY2ggb25lIG9mIHRoZSBvdmVycmlkZSBtZXRob2QgbmFtZXMsIGluc3RhbGxzIGFcbiAgICAvLyBtZXRob2Qgb24gdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIHJlbW90ZSBcInJldmVyc2UgcHJveHlcIi5cblxuICAgIGlmIChvdmVycmlkZXMpIHtcbiAgICAgIHRoaXMuX2RlYnVnKCdvdmVycmlkZXMnLCBvdmVycmlkZXMpO1xuXG4gICAgICBjb25zdCBvdmVycmlkZVR5cGVFcnJvck1lc3NhZ2UgPVxuICAgICAgICAnT3ZlcnJpZGUgY2FuIGVpdGhlciBiZSBcIm1ldGhvZFwiIG9yIFwicHJvcGVydHlcIic7XG4gICAgICBjb25zdCBtZXRob2RzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgIGZvciAoY29uc3Qgb3ZlcnJpZGUgb2Ygb3ZlcnJpZGVzKSB7XG4gICAgICAgIGlmIChhcGkuaXNNZXRob2RPdmVycmlkZShvdmVycmlkZSkpIHtcbiAgICAgICAgICBpZiAoYXBpLmlzUHJvcGVydHlPdmVycmlkZShvdmVycmlkZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihvdmVycmlkZVR5cGVFcnJvck1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWV0aG9kcy5oYXMob3ZlcnJpZGUubWV0aG9kKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgRHVwbGljYXRlIG92ZXJyaWRlIGZvciBtZXRob2QgJyR7b3ZlcnJpZGUubWV0aG9kfSdgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWV0aG9kcy5hZGQob3ZlcnJpZGUubWV0aG9kKTtcblxuICAgICAgICAgIHRoaXMuX2FwcGx5TWV0aG9kT3ZlcnJpZGUob2JqLCBvYmpyZWYsIGZxbiwgaW50ZXJmYWNlcywgb3ZlcnJpZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGFwaS5pc1Byb3BlcnR5T3ZlcnJpZGUob3ZlcnJpZGUpKSB7XG4gICAgICAgICAgaWYgKGFwaS5pc01ldGhvZE92ZXJyaWRlKG92ZXJyaWRlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG92ZXJyaWRlVHlwZUVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhcyhvdmVycmlkZS5wcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICBgRHVwbGljYXRlIG92ZXJyaWRlIGZvciBwcm9wZXJ0eSAnJHtvdmVycmlkZS5wcm9wZXJ0eX0nYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByb3BlcnRpZXMuYWRkKG92ZXJyaWRlLnByb3BlcnR5KTtcblxuICAgICAgICAgIHRoaXMuX2FwcGx5UHJvcGVydHlPdmVycmlkZShvYmosIG9ianJlZiwgZnFuLCBpbnRlcmZhY2VzLCBvdmVycmlkZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG92ZXJyaWRlVHlwZUVycm9yTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqcmVmO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U3VwZXJQcm9wZXJ0eU5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAkanNpaSRzdXBlciQke25hbWV9JGA7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVByb3BlcnR5T3ZlcnJpZGUoXG4gICAgb2JqOiBhbnksXG4gICAgb2JqcmVmOiBhcGkuT2JqUmVmLFxuICAgIHR5cGVGcW46IHN0cmluZyxcbiAgICBpbnRlcmZhY2VzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICBvdmVycmlkZTogYXBpLlByb3BlcnR5T3ZlcnJpZGUsXG4gICkge1xuICAgIC8vIGVycm9yIGlmIHdlIGNhbiBmaW5kIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lXG4gICAgaWYgKHRoaXMuX3RyeVR5cGVJbmZvRm9yTWV0aG9kKG92ZXJyaWRlLnByb3BlcnR5LCB0eXBlRnFuLCBpbnRlcmZhY2VzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJ5aW5nIHRvIG92ZXJyaWRlIG1ldGhvZCAnJHtvdmVycmlkZS5wcm9wZXJ0eX0nIGFzIGEgcHJvcGVydHlgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvcEluZm8gPSB0aGlzLl90cnlUeXBlSW5mb0ZvclByb3BlcnR5KFxuICAgICAgb3ZlcnJpZGUucHJvcGVydHksXG4gICAgICB0eXBlRnFuLFxuICAgICAgaW50ZXJmYWNlcyxcbiAgICApO1xuICAgIC8vIGlmIHRoaXMgaXMgYSBwcml2YXRlIHByb3BlcnR5IChpLmUuIGRvZXNuJ3QgaGF2ZSBgcHJvcEluZm9gIHRoZSBvYmplY3QgaGFzIGEga2V5KVxuICAgIGlmICghcHJvcEluZm8gJiYgb3ZlcnJpZGUucHJvcGVydHkgaW4gb2JqKSB7XG4gICAgICB0aGlzLl9kZWJ1ZyhgU2tpcHBpbmcgb3ZlcnJpZGUgb2YgcHJpdmF0ZSBwcm9wZXJ0eSAke292ZXJyaWRlLnByb3BlcnR5fWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghcHJvcEluZm8pIHtcbiAgICAgIC8vIFdlJ3ZlIG92ZXJyaWRpbmcgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3Qgd2UgaGF2ZSBOTyB0eXBlIGluZm9ybWF0aW9uIG9uIChwcm9iYWJseVxuICAgICAgLy8gYmVjYXVzZSBpdCdzIGFuIGFub255bW91cyBvYmplY3QpLlxuICAgICAgLy8gUHJldGVuZCBpdCdzICdwcm9wOiBhbnknO1xuICAgICAgLy9cbiAgICAgIC8vIEZJWE1FOiBXZSBjb3VsZCBkbyBiZXR0ZXIgdHlwZSBjaGVja2luZyBkdXJpbmcgdGhlIGNvbnZlcnNpb24gaWYgSlNJSSBjbGllbnRzXG4gICAgICAvLyB3b3VsZCB0ZWxsIHVzIHRoZSBpbnRlbmRlZCBpbnRlcmZhY2UgdHlwZS5cbiAgICAgIHByb3BJbmZvID0ge1xuICAgICAgICBuYW1lOiBvdmVycmlkZS5wcm9wZXJ0eSxcbiAgICAgICAgdHlwZTogc3BlYy5DQU5PTklDQUxfQU5ZLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWZpbmVPdmVycmlkZW5Qcm9wZXJ0eShvYmosIG9ianJlZiwgb3ZlcnJpZGUsIHByb3BJbmZvKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RlZmluZU92ZXJyaWRlblByb3BlcnR5KFxuICAgIG9iajogYW55LFxuICAgIG9ianJlZjogYXBpLk9ialJlZixcbiAgICBvdmVycmlkZTogYXBpLlByb3BlcnR5T3ZlcnJpZGUsXG4gICAgcHJvcEluZm86IHNwZWMuUHJvcGVydHksXG4gICkge1xuICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IG92ZXJyaWRlLnByb3BlcnR5O1xuXG4gICAgdGhpcy5fZGVidWcoJ2FwcGx5IG92ZXJyaWRlJywgcHJvcGVydHlOYW1lKTtcblxuICAgIC8vIHNhdmUgdGhlIG9sZCBwcm9wZXJ0eSB1bmRlciAkanNpaSRzdXBlciQ8cHJvcD4kIHNvIHRoYXQgcHJvcGVydHkgb3ZlcnJpZGVzXG4gICAgLy8gY2FuIHN0aWxsIGFjY2VzcyBpdCB2aWEgYHN1cGVyLjxwcm9wPmAuXG4gICAgY29uc3QgcHJldiA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3BlcnR5TmFtZSkgPz8ge1xuICAgICAgdmFsdWU6IG9ialtwcm9wZXJ0eU5hbWVdLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH07XG5cbiAgICBjb25zdCBwcmV2RW51bWVyYWJsZSA9IHByZXYuZW51bWVyYWJsZTtcbiAgICBwcmV2LmVudW1lcmFibGUgPSBmYWxzZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCB0aGlzLl9nZXRTdXBlclByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpLCBwcmV2KTtcblxuICAgIC8vIHdlIGFkZCBjYWxsYmFja3MgZm9yIGJvdGggJ2dldCcgYW5kICdzZXQnLCBldmVuIGlmIHRoZSBwcm9wZXJ0eVxuICAgIC8vIGlzIHJlYWRvbmx5LiB0aGlzIGlzIGZpbmUgYmVjYXVzZSBpZiB5b3UgdHJ5IHRvIHNldCgpIGEgcmVhZG9ubHlcbiAgICAvLyBwcm9wZXJ0eSwgaXQgd2lsbCBmYWlsLlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5TmFtZSwge1xuICAgICAgZW51bWVyYWJsZTogcHJldkVudW1lcmFibGUsXG4gICAgICBjb25maWd1cmFibGU6IHByZXYuY29uZmlndXJhYmxlLFxuICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCd2aXJ0dWFsIGdldCcsIG9ianJlZiwgcHJvcGVydHlOYW1lLCB7XG4gICAgICAgICAgY29va2llOiBvdmVycmlkZS5jb29raWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNhbGxiYWNrSGFuZGxlcih7XG4gICAgICAgICAgY29va2llOiBvdmVycmlkZS5jb29raWUsXG4gICAgICAgICAgY2JpZDogdGhpcy5fbWFrZWNiaWQoKSxcbiAgICAgICAgICBnZXQ6IHsgb2JqcmVmLCBwcm9wZXJ0eTogcHJvcGVydHlOYW1lIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9kZWJ1ZygnY2FsbGJhY2sgcmV0dXJuZWQnLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdG9TYW5kYm94KHJlc3VsdCwgcHJvcEluZm8pO1xuICAgICAgfSxcbiAgICAgIHNldDogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5fZGVidWcoJ3ZpcnR1YWwgc2V0Jywgb2JqcmVmLCBwcm9wZXJ0eU5hbWUsIHtcbiAgICAgICAgICBjb29raWU6IG92ZXJyaWRlLmNvb2tpZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tIYW5kbGVyKHtcbiAgICAgICAgICBjb29raWU6IG92ZXJyaWRlLmNvb2tpZSxcbiAgICAgICAgICBjYmlkOiB0aGlzLl9tYWtlY2JpZCgpLFxuICAgICAgICAgIHNldDoge1xuICAgICAgICAgICAgb2JqcmVmLFxuICAgICAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9mcm9tU2FuZGJveCh2YWx1ZSwgcHJvcEluZm8pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGdldFByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgIG9iajogYW55LFxuICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgKTogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcbiAgICAgIGNvbnN0IGRpcmVjdCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wZXJ0eU5hbWUpO1xuICAgICAgaWYgKGRpcmVjdCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBkaXJlY3Q7XG4gICAgICB9XG4gICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAgICAgaWYgKHByb3RvID09IG51bGwgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgLy8gV2UgcmVhY2hlZCBPYmplY3Qgb3IgdGhlIHByb3RvdHlwZSBjaGFpbiByb290LCBhbGwgaG9wZSBpcyBsb3N0IVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdldFByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgcHJvcGVydHlOYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcHBseU1ldGhvZE92ZXJyaWRlKFxuICAgIG9iajogYW55LFxuICAgIG9ianJlZjogYXBpLk9ialJlZixcbiAgICB0eXBlRnFuOiBzdHJpbmcsXG4gICAgaW50ZXJmYWNlczogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gICAgb3ZlcnJpZGU6IGFwaS5NZXRob2RPdmVycmlkZSxcbiAgKSB7XG4gICAgLy8gZXJyb3IgaWYgd2UgY2FuIGZpbmQgYSBwcm9wZXJ0eSB3aXRoIHRoaXMgbmFtZVxuICAgIGlmICh0aGlzLl90cnlUeXBlSW5mb0ZvclByb3BlcnR5KG92ZXJyaWRlLm1ldGhvZCwgdHlwZUZxbiwgaW50ZXJmYWNlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyeWluZyB0byBvdmVycmlkZSBwcm9wZXJ0eSAnJHtvdmVycmlkZS5tZXRob2R9JyBhcyBhIG1ldGhvZGAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBtZXRob2RJbmZvID0gdGhpcy5fdHJ5VHlwZUluZm9Gb3JNZXRob2QoXG4gICAgICBvdmVycmlkZS5tZXRob2QsXG4gICAgICB0eXBlRnFuLFxuICAgICAgaW50ZXJmYWNlcyxcbiAgICApO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHByaXZhdGUgbWV0aG9kIChkb2Vzbid0IGhhdmUgbWV0aG9kSW5mbywga2V5IHJlc29sdmVzIG9uIHRoZSBvYmplY3QpLCB3ZVxuICAgIC8vIGFyZSBnb2luZyB0byBza2lwIHRoZSBvdmVycmlkZS5cbiAgICBpZiAoIW1ldGhvZEluZm8gJiYgb2JqW292ZXJyaWRlLm1ldGhvZF0pIHtcbiAgICAgIHRoaXMuX2RlYnVnKGBTa2lwcGluZyBvdmVycmlkZSBvZiBwcml2YXRlIG1ldGhvZCAke292ZXJyaWRlLm1ldGhvZH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW1ldGhvZEluZm8pIHtcbiAgICAgIC8vIFdlJ3ZlIG92ZXJyaWRpbmcgYSBtZXRob2Qgb24gYW4gb2JqZWN0IHdlIGhhdmUgTk8gdHlwZSBpbmZvcm1hdGlvbiBvbiAocHJvYmFibHlcbiAgICAgIC8vIGJlY2F1c2UgaXQncyBhbiBhbm9ueW1vdXMgb2JqZWN0KS5cbiAgICAgIC8vIFByZXRlbmQgaXQncyBhbiAoLi4uYXJnczogYW55W10pID0+IGFueVxuICAgICAgbWV0aG9kSW5mbyA9IHtcbiAgICAgICAgbmFtZTogb3ZlcnJpZGUubWV0aG9kLFxuICAgICAgICByZXR1cm5zOiB7IHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSB9LFxuICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2FyZ3MnLFxuICAgICAgICAgICAgdHlwZTogc3BlYy5DQU5PTklDQUxfQU5ZLFxuICAgICAgICAgICAgdmFyaWFkaWM6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgdmFyaWFkaWM6IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2RlZmluZU92ZXJyaWRlbk1ldGhvZChvYmosIG9ianJlZiwgb3ZlcnJpZGUsIG1ldGhvZEluZm8pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGVmaW5lT3ZlcnJpZGVuTWV0aG9kKFxuICAgIG9iajogYW55LFxuICAgIG9ianJlZjogYXBpLk9ialJlZixcbiAgICBvdmVycmlkZTogYXBpLk1ldGhvZE92ZXJyaWRlLFxuICAgIG1ldGhvZEluZm86IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gb3ZlcnJpZGUubWV0aG9kO1xuXG4gICAgaWYgKG1ldGhvZEluZm8uYXN5bmMpIHtcbiAgICAgIC8vIGFzeW5jIG1ldGhvZCBvdmVycmlkZVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbWV0aG9kTmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogKC4uLm1ldGhvZEFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZGVidWcoJ2ludm9rZSBhc3luYyBtZXRob2Qgb3ZlcnJpZGUnLCBvdmVycmlkZSk7XG4gICAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuX3RvU2FuZGJveFZhbHVlcyhtZXRob2RBcmdzLCBtZXRob2RJbmZvLnBhcmFtZXRlcnMpO1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChzdWNjZWVkLCBmYWlsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYmlkID0gdGhpcy5fbWFrZWNiaWQoKTtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdhZGRpbmcgY2FsbGJhY2sgdG8gcXVldWUnLCBjYmlkKTtcbiAgICAgICAgICAgIHRoaXMuY2JzW2NiaWRdID0ge1xuICAgICAgICAgICAgICBvYmpyZWYsXG4gICAgICAgICAgICAgIG92ZXJyaWRlLFxuICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICBleHBlY3RlZFJldHVyblR5cGU6IG1ldGhvZEluZm8ucmV0dXJucyA/PyAndm9pZCcsXG4gICAgICAgICAgICAgIHN1Y2NlZWQsXG4gICAgICAgICAgICAgIGZhaWwsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHN5bmMgbWV0aG9kIG92ZXJyaWRlIChtZXRob2QgaW5mbyBpcyBub3QgcmVxdWlyZWQpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBtZXRob2ROYW1lLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiAoLi4ubWV0aG9kQXJnczogYW55W10pID0+IHtcbiAgICAgICAgICB0aGlzLl9kZWJ1ZyhcbiAgICAgICAgICAgICdpbnZva2Ugc3luYyBtZXRob2Qgb3ZlcnJpZGUnLFxuICAgICAgICAgICAgb3ZlcnJpZGUsXG4gICAgICAgICAgICAnYXJncycsXG4gICAgICAgICAgICBtZXRob2RBcmdzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gV2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdGhlIGFjdHVhbCBhcmd1bWVudHMgYWNjb3JkaW5nIHRvIHRoZVxuICAgICAgICAgIC8vIGRlY2xhcmVkIHBhcmFtZXRlcnMgaGVyZSwgYnV0IGxldCdzIGp1c3QgYXNzdW1lIHRoZSBKU0lJIHJ1bnRpbWUgb24gdGhlXG4gICAgICAgICAgLy8gb3RoZXIgZW5kIGhhcyBkb25lIGl0cyB3b3JrLlxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY2FsbGJhY2tIYW5kbGVyKHtcbiAgICAgICAgICAgIGNvb2tpZTogb3ZlcnJpZGUuY29va2llLFxuICAgICAgICAgICAgY2JpZDogdGhpcy5fbWFrZWNiaWQoKSxcbiAgICAgICAgICAgIGludm9rZToge1xuICAgICAgICAgICAgICBvYmpyZWYsXG4gICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICAgICAgYXJnczogdGhpcy5fZnJvbVNhbmRib3hWYWx1ZXMobWV0aG9kQXJncywgbWV0aG9kSW5mby5wYXJhbWV0ZXJzKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fZGVidWcoJ1Jlc3VsdCcsIHJlc3VsdCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RvU2FuZGJveChyZXN1bHQsIG1ldGhvZEluZm8ucmV0dXJucyA/PyAndm9pZCcpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmluZEludm9rZVRhcmdldChcbiAgICBvYmpyZWY6IGFwaS5PYmpSZWYsXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGFyZ3M6IGFueVtdLFxuICApIHtcbiAgICBjb25zdCB7IGluc3RhbmNlLCBmcW4sIGludGVyZmFjZXMgfSA9IHRoaXMub2JqZWN0cy5maW5kT2JqZWN0KG9ianJlZik7XG4gICAgY29uc3QgdGkgPSB0aGlzLl90eXBlSW5mb0Zvck1ldGhvZChtZXRob2ROYW1lLCBmcW4sIGludGVyZmFjZXMpO1xuICAgIHRoaXMuX3ZhbGlkYXRlTWV0aG9kQXJndW1lbnRzKHRpLCBhcmdzKTtcblxuICAgIC8vIGFsd2F5cyBmaXJzdCBsb29rIHVwIHRoZSBtZXRob2QgaW4gdGhlIHByb3RvdHlwZS4gdGhpcyBwcmFjdGljYWxseSBieXBhc3Nlc1xuICAgIC8vIGFueSBtZXRob2RzIG92ZXJyaWRkZW4gYnkgZGVyaXZlZCBjbGFzc2VzICh3aGljaCBhcmUgYnkgZGVmaW5pdGlvbiBuYXRpdmVcbiAgICAvLyBtZXRob2RzKS4gdGhpcyBzZXJ2ZXMgdG8gYWxsb3cgbmF0aXZlIGNhbGwgdG8gaW52b2tlIFwic3VwZXIubWV0aG9kKClcIiB3aGVuXG4gICAgLy8gb3ZlcnJpZGluZyB0aGUgbWV0aG9kLlxuICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIHRoZSBtZXRob2Qgb24gdGhlIHByb3RvdHlwZSwgaXQgY291bGQgYmUgYSBsaXRlcmFsIG9iamVjdFxuICAgIC8vIHRoYXQgaW1wbGVtZW50cyBhbiBpbnRlcmZhY2UsIHNvIHdlIGxvb2sgaWYgd2UgaGF2ZSB0aGUgbWV0aG9kIG9uIHRoZSBvYmplY3RcbiAgICAvLyBpdHNlbGYuIGlmIHdlIGRvLCB3ZSBpbnZva2UgaXQuXG4gICAgbGV0IGZuID0gaW5zdGFuY2UuY29uc3RydWN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdO1xuICAgIGlmICghZm4pIHtcbiAgICAgIGZuID0gaW5zdGFuY2VbbWV0aG9kTmFtZV07XG4gICAgICBpZiAoIWZuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgJHttZXRob2ROYW1lfSBvbiBvYmplY3RgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdGksIG9iajogaW5zdGFuY2UsIGZuIH07XG4gIH1cblxuICBwcml2YXRlIF92YWxpZGF0ZU1ldGhvZEFyZ3VtZW50cyhcbiAgICBtZXRob2Q6IHNwZWMuQ2FsbGFibGUgfCB1bmRlZmluZWQsXG4gICAgYXJnczogYW55W10sXG4gICkge1xuICAgIGNvbnN0IHBhcmFtczogc3BlYy5QYXJhbWV0ZXJbXSA9IG1ldGhvZD8ucGFyYW1ldGVycyA/PyBbXTtcblxuICAgIC8vIGVycm9yIGlmIGFyZ3MgPiBwYXJhbXNcbiAgICBpZiAoYXJncy5sZW5ndGggPiBwYXJhbXMubGVuZ3RoICYmICEobWV0aG9kICYmIG1ldGhvZC52YXJpYWRpYykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRvbyBtYW55IGFyZ3VtZW50cyAobWV0aG9kIGFjY2VwdHMgJHtwYXJhbXMubGVuZ3RofSBwYXJhbWV0ZXJzLCBnb3QgJHthcmdzLmxlbmd0aH0gYXJndW1lbnRzKWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHBhcmFtc1tpXTtcbiAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbaV07XG5cbiAgICAgIGlmIChwYXJhbS52YXJpYWRpYykge1xuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA8PSBpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIE5vIHZhcmFyZyB3YXMgcHJvdmlkZWRcbiAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBwYXJhbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAoIXBhcmFtLm9wdGlvbmFsICYmIHBhcmFtc1tqXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBVbmV4cGVjdGVkICd1bmRlZmluZWQnIHZhbHVlIGF0IGluZGV4ICR7XG4gICAgICAgICAgICAgICAgaiAtIGlcbiAgICAgICAgICAgICAgfSBvZiB2YXJpYWRpYyBhcmd1bWVudCAnJHtcbiAgICAgICAgICAgICAgICBwYXJhbS5uYW1lXG4gICAgICAgICAgICAgIH0nIG9mIHR5cGUgJyR7c3BlYy5kZXNjcmliZVR5cGVSZWZlcmVuY2UocGFyYW0udHlwZSl9J2AsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghcGFyYW0ub3B0aW9uYWwgJiYgYXJnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBOb3QgZW5vdWdoIGFyZ3VtZW50cy4gTWlzc2luZyBhcmd1bWVudCBmb3IgdGhlIHJlcXVpcmVkIHBhcmFtZXRlciAnJHtcbiAgICAgICAgICAgIHBhcmFtLm5hbWVcbiAgICAgICAgICB9JyBvZiB0eXBlICcke3NwZWMuZGVzY3JpYmVUeXBlUmVmZXJlbmNlKHBhcmFtLnR5cGUpfSdgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Fzc2VtYmx5Rm9yKGFzc2VtYmx5TmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSB0aGlzLmFzc2VtYmxpZXNbYXNzZW1ibHlOYW1lXTtcbiAgICBpZiAoIWFzc2VtYmx5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGFzc2VtYmx5OiAke2Fzc2VtYmx5TmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzc2VtYmx5O1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZFN5bWJvbChmcW46IHN0cmluZykge1xuICAgIGNvbnN0IFthc3NlbWJseU5hbWUsIC4uLnBhcnRzXSA9IGZxbi5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gdGhpcy5fYXNzZW1ibHlGb3IoYXNzZW1ibHlOYW1lKTtcblxuICAgIGxldCBjdXJyID0gYXNzZW1ibHkuY2xvc3VyZTtcbiAgICB3aGlsZSAocGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmFtZSA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGN1cnIgPSBjdXJyW25hbWVdO1xuICAgIH1cbiAgICBpZiAoIWN1cnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgc3ltYm9sICR7ZnFufWApO1xuICAgIH1cbiAgICByZXR1cm4gY3VycjtcbiAgfVxuXG4gIHByaXZhdGUgX3R5cGVJbmZvRm9yRnFuKGZxbjogc3RyaW5nKTogc3BlYy5UeXBlIHtcbiAgICBjb25zdCBjb21wb25lbnRzID0gZnFuLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IGNvbXBvbmVudHNbMF07XG5cbiAgICBjb25zdCBhc3NlbWJseSA9IHRoaXMuYXNzZW1ibGllc1ttb2R1bGVOYW1lXTtcbiAgICBpZiAoIWFzc2VtYmx5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZHVsZSAnJHttb2R1bGVOYW1lfScgbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZXMgPSBhc3NlbWJseS5tZXRhZGF0YS50eXBlcyA/PyB7fTtcbiAgICBjb25zdCBmcW5JbmZvID0gdHlwZXNbZnFuXTtcbiAgICBpZiAoIWZxbkluZm8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZSAnJHtmcW59JyBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnFuSW5mbztcbiAgfVxuXG4gIHByaXZhdGUgX3R5cGVJbmZvRm9yTWV0aG9kKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBmcW46IHN0cmluZyxcbiAgICBpbnRlcmZhY2VzPzogc3RyaW5nW10sXG4gICk6IHNwZWMuTWV0aG9kIHtcbiAgICBjb25zdCB0aSA9IHRoaXMuX3RyeVR5cGVJbmZvRm9yTWV0aG9kKG1ldGhvZE5hbWUsIGZxbiwgaW50ZXJmYWNlcyk7XG4gICAgaWYgKCF0aSkge1xuICAgICAgY29uc3QgYWRkZW5kdW0gPVxuICAgICAgICBpbnRlcmZhY2VzICYmIGludGVyZmFjZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYCBvciBpbnRlcmZhY2UocykgJHtpbnRlcmZhY2VzLmpvaW4oJywgJyl9YFxuICAgICAgICAgIDogJyc7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDbGFzcyAke2Zxbn0ke2FkZGVuZHVtfSBkb2Vzbid0IGhhdmUgYSBtZXRob2QgJyR7bWV0aG9kTmFtZX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyeVR5cGVJbmZvRm9yTWV0aG9kKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBjbGFzc0Zxbjogc3RyaW5nLFxuICAgIGludGVyZmFjZXM6IHN0cmluZ1tdID0gW10sXG4gICk6IHNwZWMuTWV0aG9kIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IGZxbiBvZiBbY2xhc3NGcW4sIC4uLmludGVyZmFjZXNdKSB7XG4gICAgICBpZiAoZnFuID09PSB3aXJlLkVNUFRZX09CSkVDVF9GUU4pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlaW5mbyA9IHRoaXMuX3R5cGVJbmZvRm9yRnFuKGZxbik7XG5cbiAgICAgIGNvbnN0IG1ldGhvZHMgPVxuICAgICAgICAodHlwZWluZm8gYXMgc3BlYy5DbGFzc1R5cGUgfCBzcGVjLkludGVyZmFjZVR5cGUpLm1ldGhvZHMgPz8gW107XG5cbiAgICAgIGZvciAoY29uc3QgbSBvZiBtZXRob2RzKSB7XG4gICAgICAgIGlmIChtLm5hbWUgPT09IG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyByZWN1cnNpb24gdG8gcGFyZW50IHR5cGUgKGlmIGV4aXN0cylcbiAgICAgIGNvbnN0IGJhc2VzID0gW1xuICAgICAgICAodHlwZWluZm8gYXMgc3BlYy5DbGFzc1R5cGUpLmJhc2UsXG4gICAgICAgIC4uLigodHlwZWluZm8gYXMgc3BlYy5JbnRlcmZhY2VUeXBlKS5pbnRlcmZhY2VzID8/IFtdKSxcbiAgICAgIF07XG4gICAgICBmb3IgKGNvbnN0IGJhc2Ugb2YgYmFzZXMpIHtcbiAgICAgICAgaWYgKCFiYXNlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuX3RyeVR5cGVJbmZvRm9yTWV0aG9kKG1ldGhvZE5hbWUsIGJhc2UpO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJ5VHlwZUluZm9Gb3JQcm9wZXJ0eShcbiAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgIGNsYXNzRnFuOiBzdHJpbmcsXG4gICAgaW50ZXJmYWNlczogc3RyaW5nW10gPSBbXSxcbiAgKTogc3BlYy5Qcm9wZXJ0eSB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCBmcW4gb2YgW2NsYXNzRnFuLCAuLi5pbnRlcmZhY2VzXSkge1xuICAgICAgaWYgKGZxbiA9PT0gd2lyZS5FTVBUWV9PQkpFQ1RfRlFOKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdHlwZUluZm8gPSB0aGlzLl90eXBlSW5mb0ZvckZxbihmcW4pO1xuXG4gICAgICBsZXQgcHJvcGVydGllcztcbiAgICAgIGxldCBiYXNlcztcblxuICAgICAgaWYgKHNwZWMuaXNDbGFzc1R5cGUodHlwZUluZm8pKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzVHlwZUluZm8gPSB0eXBlSW5mbyBhcyBzcGVjLkNsYXNzVHlwZTtcbiAgICAgICAgcHJvcGVydGllcyA9IGNsYXNzVHlwZUluZm8ucHJvcGVydGllcztcbiAgICAgICAgYmFzZXMgPSBjbGFzc1R5cGVJbmZvLmJhc2UgPyBbY2xhc3NUeXBlSW5mby5iYXNlXSA6IFtdO1xuICAgICAgfSBlbHNlIGlmIChzcGVjLmlzSW50ZXJmYWNlVHlwZSh0eXBlSW5mbykpIHtcbiAgICAgICAgY29uc3QgaW50ZXJmYWNlVHlwZUluZm8gPSB0eXBlSW5mbyBhcyBzcGVjLkludGVyZmFjZVR5cGU7XG4gICAgICAgIHByb3BlcnRpZXMgPSBpbnRlcmZhY2VUeXBlSW5mby5wcm9wZXJ0aWVzO1xuICAgICAgICBiYXNlcyA9IGludGVyZmFjZVR5cGVJbmZvLmludGVyZmFjZXMgPz8gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFR5cGUgb2Yga2luZCAke3R5cGVJbmZvLmtpbmR9IGRvZXMgbm90IGhhdmUgcHJvcGVydGllc2AsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgcCBvZiBwcm9wZXJ0aWVzID8/IFtdKSB7XG4gICAgICAgIGlmIChwLm5hbWUgPT09IHByb3BlcnR5KSB7XG4gICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcmVjdXJzZSB0byBwYXJlbnQgdHlwZSAoaWYgZXhpc3RzKVxuICAgICAgZm9yIChjb25zdCBiYXNlRnFuIG9mIGJhc2VzKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXMuX3RyeVR5cGVJbmZvRm9yUHJvcGVydHkocHJvcGVydHksIGJhc2VGcW4pO1xuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF90eXBlSW5mb0ZvclByb3BlcnR5KFxuICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgaW50ZXJmYWNlcz86IHN0cmluZ1tdLFxuICApOiBzcGVjLlByb3BlcnR5IHtcbiAgICBjb25zdCB0eXBlSW5mbyA9IHRoaXMuX3RyeVR5cGVJbmZvRm9yUHJvcGVydHkocHJvcGVydHksIGZxbiwgaW50ZXJmYWNlcyk7XG4gICAgaWYgKCF0eXBlSW5mbykge1xuICAgICAgY29uc3QgYWRkZW5kdW0gPVxuICAgICAgICBpbnRlcmZhY2VzICYmIGludGVyZmFjZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYCBvciBpbnRlcmZhY2UocykgJHtpbnRlcmZhY2VzLmpvaW4oJywgJyl9YFxuICAgICAgICAgIDogJyc7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUeXBlICR7ZnFufSR7YWRkZW5kdW19IGRvZXNuJ3QgaGF2ZSBhIHByb3BlcnR5ICcke3Byb3BlcnR5fSdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVJbmZvO1xuICB9XG5cbiAgcHJpdmF0ZSBfdG9TYW5kYm94KHY6IGFueSwgZXhwZWN0ZWRUeXBlOiB3aXJlLk9wdGlvbmFsVmFsdWVPclZvaWQpOiBhbnkge1xuICAgIGNvbnN0IHNlclR5cGVzID0gd2lyZS5zZXJpYWxpemF0aW9uVHlwZShcbiAgICAgIGV4cGVjdGVkVHlwZSxcbiAgICAgIHRoaXMuX3R5cGVJbmZvRm9yRnFuLmJpbmQodGhpcyksXG4gICAgKTtcbiAgICB0aGlzLl9kZWJ1ZygndG9TYW5kYm94JywgdiwgSlNPTi5zdHJpbmdpZnkoc2VyVHlwZXMpKTtcblxuICAgIGNvbnN0IGhvc3Q6IHdpcmUuU2VyaWFsaXplckhvc3QgPSB7XG4gICAgICBvYmplY3RzOiB0aGlzLm9iamVjdHMsXG4gICAgICBkZWJ1ZzogdGhpcy5fZGVidWcuYmluZCh0aGlzKSxcbiAgICAgIGZpbmRTeW1ib2w6IHRoaXMuX2ZpbmRTeW1ib2wuYmluZCh0aGlzKSxcbiAgICAgIGxvb2t1cFR5cGU6IHRoaXMuX3R5cGVJbmZvRm9yRnFuLmJpbmQodGhpcyksXG4gICAgICByZWN1cnNlOiB0aGlzLl90b1NhbmRib3guYmluZCh0aGlzKSxcbiAgICB9O1xuXG4gICAgY29uc3QgZXJyb3JzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHsgc2VyaWFsaXphdGlvbkNsYXNzLCB0eXBlUmVmIH0gb2Ygc2VyVHlwZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3aXJlLlNFUklBTElaRVJTW3NlcmlhbGl6YXRpb25DbGFzc10uZGVzZXJpYWxpemUoXG4gICAgICAgICAgdixcbiAgICAgICAgICB0eXBlUmVmLFxuICAgICAgICAgIGhvc3QsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIG5vIHVuaW9uICg5OSUgY2FzZSksIHJldGhyb3cgaW1tZWRpYXRlbHkgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VcbiAgICAgICAgaWYgKHNlclR5cGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3JzLnB1c2goZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVmFsdWUgZGlkIG5vdCBtYXRjaCBhbnkgdHlwZSBpbiB1bmlvbjogJHtlcnJvcnMuam9pbignLCAnKX1gLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9mcm9tU2FuZGJveCh2OiBhbnksIHRhcmdldFR5cGU6IHdpcmUuT3B0aW9uYWxWYWx1ZU9yVm9pZCk6IGFueSB7XG4gICAgY29uc3Qgc2VyVHlwZXMgPSB3aXJlLnNlcmlhbGl6YXRpb25UeXBlKFxuICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIHRoaXMuX3R5cGVJbmZvRm9yRnFuLmJpbmQodGhpcyksXG4gICAgKTtcbiAgICB0aGlzLl9kZWJ1ZygnZnJvbVNhbmRib3gnLCB2LCBKU09OLnN0cmluZ2lmeShzZXJUeXBlcykpO1xuXG4gICAgY29uc3QgaG9zdDogd2lyZS5TZXJpYWxpemVySG9zdCA9IHtcbiAgICAgIG9iamVjdHM6IHRoaXMub2JqZWN0cyxcbiAgICAgIGRlYnVnOiB0aGlzLl9kZWJ1Zy5iaW5kKHRoaXMpLFxuICAgICAgZmluZFN5bWJvbDogdGhpcy5fZmluZFN5bWJvbC5iaW5kKHRoaXMpLFxuICAgICAgbG9va3VwVHlwZTogdGhpcy5fdHlwZUluZm9Gb3JGcW4uYmluZCh0aGlzKSxcbiAgICAgIHJlY3Vyc2U6IHRoaXMuX2Zyb21TYW5kYm94LmJpbmQodGhpcyksXG4gICAgfTtcblxuICAgIGNvbnN0IGVycm9ycyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCB7IHNlcmlhbGl6YXRpb25DbGFzcywgdHlwZVJlZiB9IG9mIHNlclR5cGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gd2lyZS5TRVJJQUxJWkVSU1tzZXJpYWxpemF0aW9uQ2xhc3NdLnNlcmlhbGl6ZSh2LCB0eXBlUmVmLCBob3N0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgbm8gdW5pb24gKDk5JSBjYXNlKSwgcmV0aHJvdyBpbW1lZGlhdGVseSB0byBwcmVzZXJ2ZSBzdGFjayB0cmFjZVxuICAgICAgICBpZiAoc2VyVHlwZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBlcnJvcnMucHVzaChlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBWYWx1ZSBkaWQgbm90IG1hdGNoIGFueSB0eXBlIGluIHVuaW9uOiAke2Vycm9ycy5qb2luKCcsICcpfWAsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RvU2FuZGJveFZhbHVlcyh4czogYW55W10sIHBhcmFtZXRlcnM/OiBzcGVjLlBhcmFtZXRlcltdKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JveFVuYm94UGFyYW1ldGVycyh4cywgcGFyYW1ldGVycywgdGhpcy5fdG9TYW5kYm94LmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZnJvbVNhbmRib3hWYWx1ZXMoeHM6IGFueVtdLCBwYXJhbWV0ZXJzPzogc3BlYy5QYXJhbWV0ZXJbXSkge1xuICAgIHJldHVybiB0aGlzLl9ib3hVbmJveFBhcmFtZXRlcnMoXG4gICAgICB4cyxcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgICB0aGlzLl9mcm9tU2FuZGJveC5iaW5kKHRoaXMpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9ib3hVbmJveFBhcmFtZXRlcnMoXG4gICAgeHM6IGFueVtdLFxuICAgIHBhcmFtZXRlcnM6IHNwZWMuUGFyYW1ldGVyW10gfCB1bmRlZmluZWQsXG4gICAgYm94VW5ib3g6ICh4OiBhbnksIHQ6IHdpcmUuT3B0aW9uYWxWYWx1ZU9yVm9pZCkgPT4gYW55LFxuICApIHtcbiAgICBwYXJhbWV0ZXJzID0gWy4uLihwYXJhbWV0ZXJzID8/IFtdKV07XG4gICAgY29uc3QgdmFyaWFkaWMgPVxuICAgICAgcGFyYW1ldGVycy5sZW5ndGggPiAwICYmICEhcGFyYW1ldGVyc1twYXJhbWV0ZXJzLmxlbmd0aCAtIDFdLnZhcmlhZGljO1xuICAgIC8vIFJlcGVhdCB0aGUgbGFzdCAodmFyaWFkaWMpIHR5cGUgdG8gbWF0Y2ggdGhlIG51bWJlciBvZiBhY3R1YWwgYXJndW1lbnRzXG4gICAgd2hpbGUgKHZhcmlhZGljICYmIHBhcmFtZXRlcnMubGVuZ3RoIDwgeHMubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzLnB1c2gocGFyYW1ldGVyc1twYXJhbWV0ZXJzLmxlbmd0aCAtIDFdKTtcbiAgICB9XG4gICAgaWYgKHhzLmxlbmd0aCA+IHBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBcmd1bWVudCBsaXN0ICgke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHhzLFxuICAgICAgICApfSkgbm90IHNhbWUgc2l6ZSBhcyBleHBlY3RlZCBhcmd1bWVudCBsaXN0IChsZW5ndGggJHtcbiAgICAgICAgICBwYXJhbWV0ZXJzLmxlbmd0aFxuICAgICAgICB9KWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4geHMubWFwKCh4LCBpKSA9PiBib3hVbmJveCh4LCBwYXJhbWV0ZXJzIVtpXSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGVidWcoLi4uYXJnczogYW55W10pIHtcbiAgICBpZiAodGhpcy50cmFjZUVuYWJsZWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tAanNpaS9rZXJuZWxdJywgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhhdCBgZm5gIGlzIGNhbGxlZCBhbmQgZGVmZW5kcyBhZ2FpbnN0IGJlZ2lubmluZyB0byBpbnZva2VcbiAgICogYXN5bmMgbWV0aG9kcyB1bnRpbCBmbiBmaW5pc2hlcyAoc3VjY2Vzc2Z1bGx5IG9yIG5vdCkuXG4gICAqL1xuICBwcml2YXRlIF9lbnN1cmVTeW5jPFQ+KGRlc2M6IHN0cmluZywgZm46ICgpID0+IFQpOiBUIHtcbiAgICB0aGlzLnN5bmNJblByb2dyZXNzID0gZGVzYztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRlbGV0ZSB0aGlzLnN5bmNJblByb2dyZXNzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRQcm9wZXJ0eVRhcmdldChvYmo6IGFueSwgcHJvcGVydHk6IHN0cmluZykge1xuICAgIGNvbnN0IHN1cGVyUHJvcCA9IHRoaXMuX2dldFN1cGVyUHJvcGVydHlOYW1lKHByb3BlcnR5KTtcbiAgICBpZiAoc3VwZXJQcm9wIGluIG9iaikge1xuICAgICAgcmV0dXJuIHN1cGVyUHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnR5O1xuICB9XG5cbiAgLy9cbiAgLy8gdHlwZSBpbmZvcm1hdGlvblxuICAvL1xuXG4gIHByaXZhdGUgX21ha2VjYmlkKCkge1xuICAgIHJldHVybiBganNpaTo6Y2FsbGJhY2s6OiR7dGhpcy5uZXh0aWQrK31gO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFrZXByaWQoKSB7XG4gICAgcmV0dXJuIGBqc2lpOjpwcm9taXNlOjoke3RoaXMubmV4dGlkKyt9YDtcbiAgfVxuXG4gIHByaXZhdGUgX3dyYXBTYW5kYm94Q29kZTxUPihmbjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBmbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFyYml0cmFyeSBjb2RlIGluIGEgVk0gc2FuZGJveC5cbiAgICpcbiAgICogQHBhcmFtIGNvZGUgICAgICAgSmF2YVNjcmlwdCBjb2RlIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSBWTVxuICAgKiBAcGFyYW0gc2FuZGJveCAgICBhIFZNIGNvbnRleHQgdG8gdXNlIGZvciBydW5uaW5nIHRoZSBjb2RlXG4gICAqIEBwYXJhbSBzb3VyY2VNYXBzIHNvdXJjZSBtYXBzIHRvIGJlIHVzZWQgaW4gY2FzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duXG4gICAqIEBwYXJhbSBmaWxlbmFtZSAgIHRoZSBmaWxlIG5hbWUgdG8gdXNlIGZvciB0aGUgZXhlY3V0ZWQgY29kZVxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGNvZGVcbiAgICovXG4gIHByaXZhdGUgX2V4ZWN1dGUoY29kZTogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2NyaXB0ID0gbmV3IHZtLlNjcmlwdChjb2RlLCB7IGZpbGVuYW1lIH0pO1xuICAgIHJldHVybiBzY3JpcHQucnVuSW5Db250ZXh0KHRoaXMuc2FuZGJveCwgeyBkaXNwbGF5RXJyb3JzOiB0cnVlIH0pO1xuICB9XG59XG5cbmludGVyZmFjZSBDYWxsYmFjayB7XG4gIG9ianJlZjogYXBpLk9ialJlZjtcbiAgb3ZlcnJpZGU6IGFwaS5NZXRob2RPdmVycmlkZTtcbiAgYXJnczogYW55W107XG4gIGV4cGVjdGVkUmV0dXJuVHlwZTogd2lyZS5PcHRpb25hbFZhbHVlT3JWb2lkO1xuXG4gIC8vIGNvbXBsZXRpb24gY2FsbGJhY2tzXG4gIHN1Y2NlZWQ6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuICBmYWlsOiAoLi4uYXJnczogYW55W10pID0+IGFueTtcbn1cblxuaW50ZXJmYWNlIEFzeW5jSW52b2NhdGlvbiB7XG4gIG1ldGhvZDogc3BlYy5NZXRob2Q7XG4gIHByb21pc2U6IFByb21pc2U8YW55Pjtcbn1cblxuY2xhc3MgQXNzZW1ibHkge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhOiBzcGVjLkFzc2VtYmx5LFxuICAgIHB1YmxpYyByZWFkb25seSBjbG9zdXJlOiBhbnksXG4gICkge31cbn1cbiJdfQ==
|
|
904
|
+
//# sourceMappingURL=kernel.js.map
|
package/lib/objects.d.ts
CHANGED