@jsii/kernel 1.59.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.js +1 -1
- package/lib/index.js +7 -3
- package/lib/kernel.js +26 -42
- package/lib/objects.js +4 -7
- package/lib/on-exit.js +1 -1
- package/lib/recording.js +2 -2
- package/lib/serialization.js +56 -57
- package/package.json +8 -15
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLFNBQVMsR0FBRyxhQUFhLENBQUM7QUFDMUIsUUFBQSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQztBQUN0QyxRQUFBLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFDMUIsUUFBQSxVQUFVLEdBQUcsWUFBWSxDQUFDO0FBQzFCLFFBQUEsU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUN4QixRQUFBLFlBQVksR0FBRyxjQUFjLENBQUM7QUFPM0MsU0FBZ0IsUUFBUSxDQUFDLEtBQVU7SUFDakMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxpQkFBUyxJQUFJLEtBQUssQ0FBQztBQUMzRSxDQUFDO0FBRkQsNEJBRUM7QUFNRCxTQUFnQixVQUFVLENBQUMsS0FBVTtJQUNuQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLGtCQUFVLElBQUksS0FBSyxDQUFDO0FBQzVFLENBQUM7QUFGRCxnQ0FFQztBQU1ELFNBQWdCLFVBQVUsQ0FBQyxLQUFVO0lBQ25DLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksa0JBQVUsSUFBSSxLQUFLLENBQUM7QUFDNUUsQ0FBQztBQUZELGdDQUVDO0FBTUQsU0FBZ0IsU0FBUyxDQUFDLEtBQVU7SUFDbEMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxpQkFBUyxJQUFJLEtBQUssQ0FBQztBQUMzRSxDQUFDO0FBRkQsOEJBRUM7QUFTRCxTQUFnQixZQUFZLENBQUMsS0FBVTtJQUNyQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLG9CQUFZLElBQUksS0FBSyxDQUFDO0FBQzlFLENBQUM7QUFGRCxvQ0FFQztBQVNELFNBQWdCLGdCQUFnQixDQUFDLEtBQWU7SUFDOUMsT0FBUSxLQUFhLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLHVCQUF1QjtBQUMvRCxDQUFDO0FBRkQsNENBRUM7QUFPRCxTQUFnQixrQkFBa0IsQ0FBQyxLQUFlO0lBQ2hELE9BQVEsS0FBYSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyx1QkFBdUI7QUFDakUsQ0FBQztBQUZELGdEQUVDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFRPS0VOX1JFRiA9ICckanNpaS5ieXJlZic7XG5leHBvcnQgY29uc3QgVE9LRU5fSU5URVJGQUNFUyA9ICckanNpaS5pbnRlcmZhY2VzJztcbmV4cG9ydCBjb25zdCBUT0tFTl9EQVRFID0gJyRqc2lpLmRhdGUnO1xuZXhwb3J0IGNvbnN0IFRPS0VOX0VOVU0gPSAnJGpzaWkuZW51bSc7XG5leHBvcnQgY29uc3QgVE9LRU5fTUFQID0gJyRqc2lpLm1hcCc7XG5leHBvcnQgY29uc3QgVE9LRU5fU1RSVUNUID0gJyRqc2lpLnN0cnVjdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqUmVmIHtcbiAgcmVhZG9ubHkgW1RPS0VOX1JFRl06IHN0cmluZztcbiAgW1RPS0VOX0lOVEVSRkFDRVNdPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09ialJlZih2YWx1ZTogYW55KTogdmFsdWUgaXMgT2JqUmVmIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgVE9LRU5fUkVGIGluIHZhbHVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpcmVEYXRlIHtcbiAgcmVhZG9ubHkgW1RPS0VOX0RBVEVdOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dpcmVEYXRlKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBXaXJlRGF0ZSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIFRPS0VOX0RBVEUgaW4gdmFsdWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2lyZUVudW0ge1xuICByZWFkb25seSBbVE9LRU5fRU5VTV06IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV2lyZUVudW0odmFsdWU6IGFueSk6IHZhbHVlIGlzIFdpcmVFbnVtIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgVE9LRU5fRU5VTSBpbiB2YWx1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXJlTWFwIHtcbiAgcmVhZG9ubHkgW1RPS0VOX01BUF06IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogYW55IH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dpcmVNYXAodmFsdWU6IGFueSk6IHZhbHVlIGlzIFdpcmVNYXAge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBUT0tFTl9NQVAgaW4gdmFsdWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2lyZVN0cnVjdCB7XG4gIHJlYWRvbmx5IFtUT0tFTl9TVFJVQ1RdOiB7XG4gICAgcmVhZG9ubHkgZnFuOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV2lyZVN0cnVjdCh2YWx1ZTogYW55KTogdmFsdWUgaXMgV2lyZVN0cnVjdCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIFRPS0VOX1NUUlVDVCBpbiB2YWx1ZTtcbn1cblxuZXhwb3J0IHR5cGUgT3ZlcnJpZGUgPSBNZXRob2RPdmVycmlkZSB8IFByb3BlcnR5T3ZlcnJpZGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWV0aG9kT3ZlcnJpZGUge1xuICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcbiAgcmVhZG9ubHkgY29va2llPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNZXRob2RPdmVycmlkZSh2YWx1ZTogT3ZlcnJpZGUpOiB2YWx1ZSBpcyBNZXRob2RPdmVycmlkZSB7XG4gIHJldHVybiAodmFsdWUgYXMgYW55KS5tZXRob2QgIT0gbnVsbDsgLy8gUHl0aG9uIHBhc3NlcyBcIm51bGxcIlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5T3ZlcnJpZGUge1xuICByZWFkb25seSBwcm9wZXJ0eTogc3RyaW5nO1xuICByZWFkb25seSBjb29raWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3BlcnR5T3ZlcnJpZGUodmFsdWU6IE92ZXJyaWRlKTogdmFsdWUgaXMgUHJvcGVydHlPdmVycmlkZSB7XG4gIHJldHVybiAodmFsdWUgYXMgYW55KS5wcm9wZXJ0eSAhPSBudWxsOyAvLyBQeXRob24gcGFzc2VzIFwibnVsbFwiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsbGJhY2sge1xuICByZWFkb25seSBjYmlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvb2tpZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBpbnZva2U/OiBJbnZva2VSZXF1ZXN0O1xuICByZWFkb25seSBnZXQ/OiBHZXRSZXF1ZXN0O1xuICByZWFkb25seSBzZXQ/OiBTZXRSZXF1ZXN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhlbGxvUmVzcG9uc2Uge1xuICByZWFkb25seSBoZWxsbzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRSZXF1ZXN0IHtcbiAgLyoqIFRoZSBuYW1lIG9mIHRoZSBhc3NlbWJseSAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIEFzc2VtYmx5IHZlcnNpb24gKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdGFyYmFsbCBvZiB0aGUgcGFja2FnZSAqL1xuICByZWFkb25seSB0YXJiYWxsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZFJlc3BvbnNlIHtcbiAgcmVhZG9ubHkgYXNzZW1ibHk6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZva2VTY3JpcHRSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgYXNzZW1ibHk6IHN0cmluZztcbiAgcmVhZG9ubHkgc2NyaXB0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZva2VTY3JpcHRSZXNwb25zZSB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyIHwgbnVsbDtcbiAgcmVhZG9ubHkgc3Rkb3V0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBzaWduYWw6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBUaGUgRlFOIG9mIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSBpcyByZXF1ZXN0ZWQgKG9yIFwiT2JqZWN0XCIpXG4gICAqL1xuICByZWFkb25seSBmcW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEZRTnMgb2YgaW50ZXJmYWNlcyB0aGUgaW5zdGFuY2UgaW1wbGVtZW50cywgaWYgYW55LiBEZWNsYXJpbmdcbiAgICogaW50ZXJmYWNlcyB0aGF0IHRoZSBjbGFzcyBkZW5vdGVkIGJ5IGBmcW5gIGltcGxlbWVudHMgaXMgbm90IG5lY2Vzc2FyeS5cbiAgICogVGhpcyBtZWFucyB0aGF0IG1lbWViZXJzIG9mIGludGVyZmFjZXMgZm91bmQgaW4gdGhpcyBwcm9wZXJ0eSBzaG91bGRcbiAgICogZGVjbGFyZSBtZW1iZXJzIHRoYXQgYXJlIGZvdW5kIGluIHRoZSBgb3ZlcnJpZGVzYCBwcm9wZXJ0eS5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIGBmcW5gLiAoXCJPYmplY3RcIiBhY2NlcHRzIG5vbmUpXG4gICAqL1xuICByZWFkb25seSBhcmdzPzogYW55W107XG5cbiAgLyoqXG4gICAqIERlY2xhcmF0aW9ucyBvZiBtZXRob2Qgb3ZlcnJpZGVzIHRoYXQgc2hvdWxkIHRyaWdnZXIgY2FsbGJhY2tzXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBPdmVycmlkZVtdO1xufVxuXG5leHBvcnQgdHlwZSBDcmVhdGVSZXNwb25zZSA9IE9ialJlZjtcblxuZXhwb3J0IGludGVyZmFjZSBEZWxSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgb2JqcmVmOiBPYmpSZWY7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIERlbFJlc3BvbnNlIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmVxdWVzdCB7XG4gIHJlYWRvbmx5IG9ianJlZjogT2JqUmVmO1xuICByZWFkb25seSBwcm9wZXJ0eTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY0dldFJlcXVlc3Qge1xuICByZWFkb25seSBmcW46IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvcGVydHk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRSZXNwb25zZSB7XG4gIHJlYWRvbmx5IHZhbHVlOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGljU2V0UmVxdWVzdCB7XG4gIHJlYWRvbmx5IGZxbjogc3RyaW5nO1xuICByZWFkb25seSBwcm9wZXJ0eTogc3RyaW5nO1xuICByZWFkb25seSB2YWx1ZTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldFJlcXVlc3Qge1xuICByZWFkb25seSBvYmpyZWY6IE9ialJlZjtcbiAgcmVhZG9ubHkgcHJvcGVydHk6IHN0cmluZztcbiAgcmVhZG9ubHkgdmFsdWU6IGFueTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgU2V0UmVzcG9uc2Uge31cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0aWNJbnZva2VSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgZnFuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuICByZWFkb25seSBhcmdzPzogYW55W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2tlUmVxdWVzdCB7XG4gIHJlYWRvbmx5IG9ianJlZjogT2JqUmVmO1xuICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJncz86IGFueVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludm9rZVJlc3BvbnNlIHtcbiAgcmVhZG9ubHkgcmVzdWx0OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmVnaW5SZXF1ZXN0IHtcbiAgcmVhZG9ubHkgb2JqcmVmOiBPYmpSZWY7XG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuICByZWFkb25seSBhcmdzPzogYW55W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmVnaW5SZXNwb25zZSB7XG4gIHJlYWRvbmx5IHByb21pc2VpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVuZFJlcXVlc3Qge1xuICByZWFkb25seSBwcm9taXNlaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbmRSZXNwb25zZSB7XG4gIHJlYWRvbmx5IHJlc3VsdDogYW55O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBDYWxsYmFja3NSZXF1ZXN0IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsbGJhY2tzUmVzcG9uc2Uge1xuICByZWFkb25seSBjYWxsYmFja3M6IENhbGxiYWNrW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGVSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgY2JpZDogc3RyaW5nO1xuICByZWFkb25seSBlcnI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc3VsdD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0ZVJlc3BvbnNlIHtcbiAgcmVhZG9ubHkgY2JpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hbWluZ1JlcXVlc3Qge1xuICByZWFkb25seSBhc3NlbWJseTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hbWluZ1Jlc3BvbnNlIHtcbiAgcmVhZG9ubHkgbmFtaW5nOiB7XG4gICAgcmVhZG9ubHkgW2xhbmd1YWdlOiBzdHJpbmddOiB7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkO1xuICB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBTdGF0c1JlcXVlc3Qge31cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0c1Jlc3BvbnNlIHtcbiAgcmVhZG9ubHkgb2JqZWN0Q291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgS2VybmVsUmVxdWVzdCA9XG4gIHwgTG9hZFJlcXVlc3RcbiAgfCBDcmVhdGVSZXF1ZXN0XG4gIHwgRGVsUmVxdWVzdFxuICB8IEdldFJlcXVlc3RcbiAgfCBTZXRSZXF1ZXN0XG4gIHwgSW52b2tlUmVxdWVzdFxuICB8IEJlZ2luUmVxdWVzdFxuICB8IEVuZFJlcXVlc3RcbiAgfCBDYWxsYmFja3NSZXF1ZXN0XG4gIHwgQ29tcGxldGVSZXF1ZXN0XG4gIHwgTmFtaW5nUmVxdWVzdFxuICB8IFN0YXRzUmVxdWVzdDtcblxuZXhwb3J0IHR5cGUgS2VybmVsUmVzcG9uc2UgPVxuICB8IEhlbGxvUmVzcG9uc2VcbiAgfCBMb2FkUmVzcG9uc2VcbiAgfCBDcmVhdGVSZXNwb25zZVxuICB8IERlbFJlc3BvbnNlXG4gIHwgR2V0UmVzcG9uc2VcbiAgfCBTZXRSZXNwb25zZVxuICB8IEludm9rZVJlc3BvbnNlXG4gIHwgQmVnaW5SZXNwb25zZVxuICB8IEVuZFJlc3BvbnNlXG4gIHwgQ2FsbGJhY2tzUmVzcG9uc2VcbiAgfCBDb21wbGV0ZVJlc3BvbnNlXG4gIHwgTmFtaW5nUmVzcG9uc2VcbiAgfCBTdGF0c1Jlc3BvbnNlO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9rYXlSZXNwb25zZSB7XG4gIHJlYWRvbmx5IG9rOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JSZXNwb25zZSB7XG4gIHJlYWRvbmx5IGVycm9yOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YWNrPzogc3RyaW5nO1xufVxuIl19
|
|
38
|
+
//# sourceMappingURL=api.js.map
|
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.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VybmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2tlcm5lbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBbUM7QUFDbkMsb0NBQW9DO0FBQ3BDLCtCQUErQjtBQUMvQix5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDJCQUEyQjtBQUMzQix5QkFBeUI7QUFFekIsNkJBQTZCO0FBQzdCLCtCQUFrQztBQUNsQyx1Q0FBNEQ7QUFDNUQsb0NBQW9DO0FBQ3BDLHdDQUF3QztBQUV4QyxNQUFhLE1BQU07SUFpQmpCOzs7Ozs7T0FNRztJQUNILFlBQTBCLGVBQWdEO1FBQ3hFLGdFQUFnRTtRQUNoRSxxREFBcUQ7UUFGN0Isb0JBQWUsR0FBZixlQUFlLENBQWlDO1FBdkIxRTs7V0FFRztRQUNJLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXBCLGVBQVUsR0FBaUMsRUFBRSxDQUFDO1FBQ3JDLFlBQU8sR0FBRyxJQUFJLHFCQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwRSxRQUFHLEdBQWlDLEVBQUUsQ0FBQztRQUN2QyxZQUFPLEdBQWlDLEVBQUUsQ0FBQztRQUMzQyxhQUFRLEdBQXdDLEVBQUUsQ0FBQztRQUNuRCxXQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsa0RBQWtEO1FBaUJ4RSwyREFBMkQ7UUFFM0QsZ0ZBQWdGO1FBQ2hGLGdGQUFnRjtRQUNoRiw4REFBOEQ7UUFDOUQsK0VBQStFO1FBQy9FLGVBQWU7UUFDZixvR0FBb0c7UUFDcEcsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUM5QixNQUFNO1lBQ04sWUFBWTtZQUNaLE9BQU8sRUFBRSxXQUFXO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxJQUFJLENBQUMsR0FBb0I7O1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXpCLElBQUksVUFBVSxJQUFJLEdBQUcsRUFBRTtZQUNyQixNQUFNLElBQUksS0FBSyxDQUNiLHdGQUF3RixDQUN6RixDQUFDO1NBQ0g7UUFFRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFFM0IseUNBQXlDO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEQsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pDLGdDQUFnQztZQUNoQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FDYixxQkFBcUIsTUFBTSxRQUFRLElBQUksQ0FBQyxPQUFPLFVBQVU7b0JBQ3ZELFlBQVksT0FBTywyREFBMkQ7b0JBQzlFLDJCQUEyQixDQUM5QixDQUFDO2FBQ0g7WUFFRCxzQkFBc0I7WUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQ0FBaUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN4RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXRDLE9BQU87Z0JBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSTtnQkFDNUIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLE9BQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLG1DQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU07YUFDckQsQ0FBQztTQUNIO1FBRUQsMkZBQTJGO1FBQzNGLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUIsbURBQW1EO1FBQ25ELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSTtZQUNGLDBDQUEwQztZQUMxQyxHQUFHLENBQUMsT0FBTyxDQUFDO2dCQUNWLEdBQUcsRUFBRSxVQUFVO2dCQUNmLElBQUksRUFBRSxHQUFHLENBQUMsT0FBTztnQkFDakIsTUFBTSxFQUFFLElBQUk7Z0JBQ1osS0FBSyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsTUFBTSxFQUFFLElBQUk7YUFDYixDQUFDLENBQUM7U0FDSjtnQkFBUztZQUNSLG1DQUFtQztZQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzlCO1FBRUQsbURBQW1EO1FBQ25ELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FDYixtQkFBbUIsR0FBRyxDQUFDLE9BQU8sMkJBQTJCLElBQUksQ0FBQyxjQUFjLGNBQWMsQ0FDM0YsQ0FBQztTQUNIO1FBQ0QsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBa0IsQ0FBQztRQUVwRSwyQ0FBMkM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FDM0IsdUJBQXVCLFVBQVUsS0FBSyxFQUN0QyxVQUFVLENBQ1gsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhCLE9BQU87WUFDTCxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDdkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLE9BQUMsUUFBUSxDQUFDLEtBQUssbUNBQUksRUFBRSxDQUFDLENBQUMsTUFBTTtTQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVNLGVBQWUsQ0FDcEIsR0FBNEI7O1FBRTVCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELElBQUksRUFBRSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNqQyxnQ0FBZ0M7WUFDaEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBRXBFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQzthQUN0RTtZQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXhDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxNQUFNLG1CQUFtQixDQUFDLENBQUM7YUFDcEU7WUFFRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsU0FBUyxDQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFDakMsR0FBRyxDQUFDLElBQUksbUNBQUksRUFBRSxFQUNkO2dCQUNFLFFBQVEsRUFBRSxPQUFPO2dCQUNqQixHQUFHLEVBQUU7b0JBQ0gsR0FBRyxPQUFPLENBQUMsR0FBRztvQkFDZCx5RUFBeUU7b0JBQ3pFLFlBQVksRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7b0JBQ3hDLHVEQUF1RDtvQkFDdkQsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7aUJBQzlEO2dCQUNELEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FDRixDQUFDO1lBRUYsT0FBTztnQkFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtnQkFDckIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2dCQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07YUFDdEIsQ0FBQztTQUNIO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLFFBQVEsa0JBQWtCLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU0sTUFBTSxDQUFDLEdBQXNCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU0sR0FBRyxDQUFDLEdBQW1CO1FBQzVCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFFdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sSUFBSSxDQUFDLEdBQXlCO1FBQ25DLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQzlCLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksTUFBTSxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV4QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQzFELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FDakQsQ0FBQztRQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVNLElBQUksQ0FBQyxHQUF5QjtRQUNuQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVwRCxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxNQUFNLGdCQUFnQixDQUFDLENBQUM7U0FDckQ7UUFFRCxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsTUFBTSxjQUFjLENBQUMsQ0FBQztTQUMxRDtRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQ25CLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQ3pELENBQ0YsQ0FBQztRQUVGLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLEdBQUcsQ0FBQyxHQUFtQjtRQUM1QixNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDckMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFaEUseUZBQXlGO1FBQ3pGLDBGQUEwRjtRQUMxRixzRkFBc0Y7UUFDdEYsd0ZBQXdGO1FBQ3hGLHVFQUF1RTtRQUN2RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRW5FLDJFQUEyRTtRQUMzRSxxQkFBcUI7UUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FDNUIsYUFBYSxNQUFNLENBQUMsZUFBUyxDQUFDLElBQUksYUFBYSxHQUFHLEVBQ2xELEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FDM0QsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVNLEdBQUcsQ0FBQyxHQUFtQjtRQUM1QixNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFMUUsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQ2IsMENBQTBDLEdBQUcsQ0FBQyxRQUFRLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxDQUN6RSxDQUFDO1NBQ0g7UUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxNQUFNLENBQUMsZUFBUyxDQUFDLElBQUksYUFBYSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQ3hFLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkIsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FDbkUsQ0FDRixDQUFDO1FBRUYsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sTUFBTSxDQUFDLEdBQXNCOztRQUNsQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUMvQixNQUFNLElBQUksU0FBRyxHQUFHLENBQUMsSUFBSSxtQ0FBSSxFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVyRSxxQ0FBcUM7UUFDckMsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLE1BQU0sMENBQTBDLENBQUMsQ0FBQztTQUN0RTtRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQzFCLFdBQVcsTUFBTSxDQUFDLGVBQVMsQ0FBQyxJQUFJLE1BQU0sR0FBRyxFQUN6QyxHQUFHLEVBQUU7WUFDSCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FDaEMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FDMUQsQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLFFBQUUsRUFBRSxDQUFDLE9BQU8sbUNBQUksTUFBTSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFTSxPQUFPLENBQUMsR0FBNEI7O1FBQ3pDLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQzVCLE1BQU0sSUFBSSxTQUFHLEdBQUcsQ0FBQyxJQUFJLG1DQUFJLEVBQUUsQ0FBQztRQUU1QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLE1BQU0seUJBQXlCLENBQUMsQ0FBQztTQUM1RDtRQUVELHFDQUFxQztRQUNyQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUU7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSwwQ0FBMEMsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUE4QixDQUFDO1FBRTFELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxHQUFHLElBQUksTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUNoQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUNoRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLFFBQUUsRUFBRSxDQUFDLE9BQU8sbUNBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQXFCOztRQUNoQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUMvQixNQUFNLElBQUksU0FBRyxHQUFHLENBQUMsSUFBSSxtQ0FBSSxFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUzQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDYiwrQkFBK0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxnQkFBZ0IsSUFBSSxDQUFDLGNBQWMscUJBQXFCLENBQzNILENBQUM7U0FDSDtRQUVELE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXJFLHdDQUF3QztRQUN4QyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRTtZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxNQUFNLG9DQUFvQyxDQUFDLENBQUM7U0FDdkU7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQ3pDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQzFDLENBQUM7UUFFbEIscUVBQXFFO1FBQ3JFLHdDQUF3QztRQUN4Qyw2SEFBNkg7UUFDN0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFDcEIsT0FBTztZQUNQLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUVGLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBbUI7O1FBQ2xDLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFFMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFOUIsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsSUFBSSxNQUFNLENBQUM7UUFDWCxJQUFJO1lBQ0YsTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDeEM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLENBQUM7U0FDVDtRQUVELE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLFFBQUUsTUFBTSxDQUFDLE9BQU8sbUNBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRU0sU0FBUyxDQUFDLElBQTJCO1FBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDN0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtZQUMzQyxNQUFNLFFBQVEsR0FBaUI7Z0JBQzdCLElBQUk7Z0JBQ0osTUFBTSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTTtnQkFDMUIsTUFBTSxFQUFFO29CQUNOLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTTtvQkFDakIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTTtvQkFDMUIsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJO2lCQUNkO2FBQ0YsQ0FBQztZQUNGLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBRUgscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sUUFBUSxDQUFDLEdBQXdCOztRQUN0QyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFFbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxDQUFDO1NBQy9DO1FBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLEdBQUcsRUFBRTtZQUNQLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDMUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3pCO2FBQU07WUFDTCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUNsQyxNQUFNLFFBQ04sRUFBRSxDQUFDLGtCQUFrQixtQ0FBSSxNQUFNLENBQ2hDLENBQUM7WUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3BELEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDMUI7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFMUIsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsR0FBc0I7UUFDbEMsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUVsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixZQUFZLGNBQWMsQ0FBQyxDQUFDO1NBQzNFO1FBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sS0FBSyxDQUFDLElBQXVCO1FBQ2xDLE9BQU87WUFDTCxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBRU8sWUFBWSxDQUFDLElBQWM7O1FBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFM0Msa0VBQWtFO1FBQ2xFLHNFQUFzRTtRQUN0RSxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLE9BQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLG1DQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRTtnQkFDcEIsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVM7b0JBQzFCLFNBQVMsQ0FBQyxnQ0FBZ0M7Z0JBQzVDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ3pCLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJO29CQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMxQyw0QkFBa0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDeEM7U0FDRjtJQUNILENBQUM7SUFFRCwyREFBMkQ7SUFDbkQsU0FBUyxDQUNmLEdBQVcsRUFDWCxJQUFXO1FBRVgsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7U0FDekI7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTNDLFFBQVEsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNyQixLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSztnQkFDdEIsTUFBTSxTQUFTLEdBQUcsUUFBMEIsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNELE9BQU87b0JBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO29CQUMzQixVQUFVLEVBQUUsU0FBUyxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVU7aUJBQ3RFLENBQUM7WUFFSixLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUztnQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FDYix3REFBd0QsR0FBRyxFQUFFLENBQzlELENBQUM7WUFFSjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQztJQUVPLGNBQWMsQ0FBQyxPQUFlO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1Q0FBdUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFdEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDcEM7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELGtFQUFrRTtJQUNsRSxtQ0FBbUM7SUFDM0IsT0FBTyxDQUFDLEdBQXNCOztRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzQixNQUFNLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFFM0MsTUFBTSxXQUFXLFNBQUcsR0FBRyxDQUFDLElBQUksbUNBQUksRUFBRSxDQUFDO1FBRW5DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUMvQixHQUFHLEVBQUUsQ0FDSCxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQ3pFLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFFLEdBQUcsQ0FBQyxVQUFVLG1DQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTNFLG1FQUFtRTtRQUNuRSxrRkFBa0Y7UUFFbEYsSUFBSSxTQUFTLEVBQUU7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVwQyxNQUFNLHdCQUF3QixHQUM1QiwrQ0FBK0MsQ0FBQztZQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1lBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7WUFFckMsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUU7Z0JBQ2hDLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNsQyxJQUFJLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO3FCQUMzQztvQkFDRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLGtDQUFrQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQ3JELENBQUM7cUJBQ0g7b0JBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBRTdCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQ25FO3FCQUFNLElBQUksR0FBRyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUMzQyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO3FCQUMzQztvQkFDRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO3dCQUNyQyxNQUFNLEtBQUssQ0FDVCxvQ0FBb0MsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUN6RCxDQUFDO3FCQUNIO29CQUNELFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUVsQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUNyRTtxQkFBTTtvQkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7aUJBQzNDO2FBQ0Y7U0FDRjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxJQUFZO1FBQ3hDLE9BQU8sZUFBZSxJQUFJLEdBQUcsQ0FBQztJQUNoQyxDQUFDO0lBRU8sc0JBQXNCLENBQzVCLEdBQVEsRUFDUixNQUFrQixFQUNsQixPQUFlLEVBQ2YsVUFBZ0MsRUFDaEMsUUFBOEI7UUFFOUIsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFO1lBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQ2IsOEJBQThCLFFBQVEsQ0FBQyxRQUFRLGlCQUFpQixDQUNqRSxDQUFDO1NBQ0g7UUFFRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQ3pDLFFBQVEsQ0FBQyxRQUFRLEVBQ2pCLE9BQU8sRUFDUCxVQUFVLENBQ1gsQ0FBQztRQUNGLG9GQUFvRjtRQUNwRixJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksR0FBRyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMseUNBQXlDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixvRkFBb0Y7WUFDcEYscUNBQXFDO1lBQ3JDLDRCQUE0QjtZQUM1QixFQUFFO1lBQ0YsZ0ZBQWdGO1lBQ2hGLDZDQUE2QztZQUM3QyxRQUFRLEdBQUc7Z0JBQ1QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxRQUFRO2dCQUN2QixJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWE7YUFDekIsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTyx3QkFBd0IsQ0FDOUIsR0FBUSxFQUNSLE1BQWtCLEVBQ2xCLFFBQThCLEVBQzlCLFFBQXVCOztRQUV2QixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBRXZDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFNUMsNkVBQTZFO1FBQzdFLDBDQUEwQztRQUMxQyxNQUFNLElBQUksU0FBRyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLG1DQUFJO1lBQ3ZELEtBQUssRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDO1lBQ3hCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLElBQUk7WUFDaEIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQztRQUVGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTNFLGtFQUFrRTtRQUNsRSxtRUFBbUU7UUFDbkUsMEJBQTBCO1FBQzFCLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRTtZQUN2QyxVQUFVLEVBQUUsY0FBYztZQUMxQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsR0FBRyxFQUFFLEdBQUcsRUFBRTtnQkFDUixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFO29CQUMvQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07aUJBQ3hCLENBQUMsQ0FBQztnQkFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO29CQUNsQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07b0JBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUN0QixHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTtpQkFDeEMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELEdBQUcsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFO29CQUMvQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07aUJBQ3hCLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsZUFBZSxDQUFDO29CQUNuQixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07b0JBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUN0QixHQUFHLEVBQUU7d0JBQ0gsTUFBTTt3QkFDTixRQUFRLEVBQUUsWUFBWTt3QkFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztxQkFDMUM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILFNBQVMscUJBQXFCLENBQzVCLEdBQVEsRUFDUixZQUFvQjtZQUVwQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2xFLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtnQkFDbEIsT0FBTyxNQUFNLENBQUM7YUFDZjtZQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUMvQyxtRUFBbUU7Z0JBQ25FLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1lBQ0QsT0FBTyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFTyxvQkFBb0IsQ0FDMUIsR0FBUSxFQUNSLE1BQWtCLEVBQ2xCLE9BQWUsRUFDZixVQUFnQyxFQUNoQyxRQUE0QjtRQUU1QixpREFBaUQ7UUFDakQsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUU7WUFDdEUsTUFBTSxJQUFJLEtBQUssQ0FDYixnQ0FBZ0MsUUFBUSxDQUFDLE1BQU0sZUFBZSxDQUMvRCxDQUFDO1NBQ0g7UUFFRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQ3pDLFFBQVEsQ0FBQyxNQUFNLEVBQ2YsT0FBTyxFQUNQLFVBQVUsQ0FDWCxDQUFDO1FBRUYsd0ZBQXdGO1FBQ3hGLGtDQUFrQztRQUNsQyxJQUFJLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1Q0FBdUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDdEUsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLGtGQUFrRjtZQUNsRixxQ0FBcUM7WUFDckMsMENBQTBDO1lBQzFDLFVBQVUsR0FBRztnQkFDWCxJQUFJLEVBQUUsUUFBUSxDQUFDLE1BQU07Z0JBQ3JCLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNyQyxVQUFVLEVBQUU7b0JBQ1Y7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhO3dCQUN4QixRQUFRLEVBQUUsSUFBSTtxQkFDZjtpQkFDRjtnQkFDRCxRQUFRLEVBQUUsSUFBSTthQUNmLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sc0JBQXNCLENBQzVCLEdBQVEsRUFDUixNQUFrQixFQUNsQixRQUE0QixFQUM1QixVQUF1QjtRQUV2QixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBRW5DLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRTtZQUNwQix3QkFBd0I7WUFDeEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFO2dCQUNyQyxVQUFVLEVBQUUsS0FBSztnQkFDakIsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLFFBQVEsRUFBRSxLQUFLO2dCQUNmLEtBQUssRUFBRSxDQUFDLEdBQUcsVUFBaUIsRUFBRSxFQUFFO29CQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLDhCQUE4QixFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDdEUsT0FBTyxJQUFJLE9BQU8sQ0FBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRTs7d0JBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRzs0QkFDZixNQUFNOzRCQUNOLFFBQVE7NEJBQ1IsSUFBSTs0QkFDSixrQkFBa0IsUUFBRSxVQUFVLENBQUMsT0FBTyxtQ0FBSSxNQUFNOzRCQUNoRCxPQUFPOzRCQUNQLElBQUk7eUJBQ0wsQ0FBQztvQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLHFEQUFxRDtZQUNyRCxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUU7Z0JBQ3JDLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixZQUFZLEVBQUUsS0FBSztnQkFDbkIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsS0FBSyxFQUFFLENBQUMsR0FBRyxVQUFpQixFQUFFLEVBQUU7O29CQUM5QixJQUFJLENBQUMsTUFBTSxDQUNULDZCQUE2QixFQUM3QixRQUFRLEVBQ1IsTUFBTSxFQUNOLFVBQVUsQ0FDWCxDQUFDO29CQUNGLGdFQUFnRTtvQkFDaEUsMEVBQTBFO29CQUMxRSwrQkFBK0I7b0JBQy9CLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7d0JBQ2xDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTt3QkFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7d0JBQ3RCLE1BQU0sRUFBRTs0QkFDTixNQUFNOzRCQUNOLE1BQU0sRUFBRSxVQUFVOzRCQUNsQixJQUFJLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDO3lCQUNqRTtxQkFDRixDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQzlCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLFFBQUUsVUFBVSxDQUFDLE9BQU8sbUNBQUksTUFBTSxDQUFDLENBQUM7Z0JBQy9ELENBQUM7YUFDRixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFTyxpQkFBaUIsQ0FDdkIsTUFBa0IsRUFDbEIsVUFBa0IsRUFDbEIsSUFBVztRQUVYLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFeEMsOEVBQThFO1FBQzlFLDRFQUE0RTtRQUM1RSw2RUFBNkU7UUFDN0UseUJBQXlCO1FBQ3pCLDhFQUE4RTtRQUM5RSwrRUFBK0U7UUFDL0Usa0NBQWtDO1FBQ2xDLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUCxFQUFFLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLFVBQVUsWUFBWSxDQUFDLENBQUM7YUFDeEQ7U0FDRjtRQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU8sd0JBQXdCLENBQzlCLE1BQWlDLEVBQ2pDLElBQVc7O1FBRVgsTUFBTSxNQUFNLFNBQXFCLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxVQUFVLG1DQUFJLEVBQUUsQ0FBQztRQUUxRCx5QkFBeUI7UUFDekIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FDYixzQ0FBc0MsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLElBQUksQ0FBQyxNQUFNLGFBQWEsQ0FDaEcsQ0FBQztTQUNIO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDdEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVwQixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ2xCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7b0JBQ3RCLE9BQU87aUJBQ1IsQ0FBQyx5QkFBeUI7Z0JBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUFFO3dCQUM5QyxNQUFNLElBQUksS0FBSyxDQUNiLHlDQUNFLENBQUMsR0FBRyxDQUNOLDBCQUNFLEtBQUssQ0FBQyxJQUNSLGNBQWMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUN4RCxDQUFDO3FCQUNIO2lCQUNGO2FBQ0Y7aUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTtnQkFDL0MsTUFBTSxJQUFJLEtBQUssQ0FDYixzRUFDRSxLQUFLLENBQUMsSUFDUixjQUFjLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDeEQsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLFlBQW9CO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLFlBQVksRUFBRSxDQUFDLENBQUM7U0FDN0Q7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU8sV0FBVyxDQUFDLEdBQVc7UUFDN0IsTUFBTSxDQUFDLFlBQVksRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVqRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQzVCLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsTUFBTTthQUNQO1lBRUQsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQjtRQUNELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sZUFBZSxDQUFDLEdBQVc7O1FBQ2pDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxVQUFVLGFBQWEsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsTUFBTSxLQUFLLFNBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLG1DQUFJLEVBQUUsQ0FBQztRQUM1QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLGtCQUFrQixDQUN4QixVQUFrQixFQUNsQixHQUFXLEVBQ1gsVUFBcUI7UUFFckIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNQLE1BQU0sUUFBUSxHQUNaLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxvQkFBb0IsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDN0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQ2IsU0FBUyxHQUFHLEdBQUcsUUFBUSwyQkFBMkIsVUFBVSxHQUFHLENBQ2hFLENBQUM7U0FDSDtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVPLHFCQUFxQixDQUMzQixVQUFrQixFQUNsQixRQUFnQixFQUNoQixhQUF1QixFQUFFOztRQUV6QixLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsVUFBVSxDQUFDLEVBQUU7WUFDM0MsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNqQyxTQUFTO2FBQ1Y7WUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTNDLE1BQU0sT0FBTyxTQUNWLFFBQWdELENBQUMsT0FBTyxtQ0FBSSxFQUFFLENBQUM7WUFFbEUsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7b0JBQ3pCLE9BQU8sQ0FBQyxDQUFDO2lCQUNWO2FBQ0Y7WUFFRCx1Q0FBdUM7WUFDdkMsTUFBTSxLQUFLLEdBQUc7Z0JBQ1gsUUFBMkIsQ0FBQyxJQUFJO2dCQUNqQyxHQUFHLE9BQUUsUUFBK0IsQ0FBQyxVQUFVLG1DQUFJLEVBQUUsQ0FBQzthQUN2RCxDQUFDO1lBQ0YsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1QsU0FBUztpQkFDVjtnQkFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLEtBQUssRUFBRTtvQkFDVCxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1NBQ0Y7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sdUJBQXVCLENBQzdCLFFBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLGFBQXVCLEVBQUU7O1FBRXpCLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxVQUFVLENBQUMsRUFBRTtZQUMzQyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ2pDLFNBQVM7YUFDVjtZQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFM0MsSUFBSSxVQUFVLENBQUM7WUFDZixJQUFJLEtBQUssQ0FBQztZQUVWLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxhQUFhLEdBQUcsUUFBMEIsQ0FBQztnQkFDakQsVUFBVSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUM7Z0JBQ3RDLEtBQUssR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3hEO2lCQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDekMsTUFBTSxpQkFBaUIsR0FBRyxRQUE4QixDQUFDO2dCQUN6RCxVQUFVLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDO2dCQUMxQyxLQUFLLFNBQUcsaUJBQWlCLENBQUMsVUFBVSxtQ0FBSSxFQUFFLENBQUM7YUFDNUM7aUJBQU07Z0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDYixnQkFBZ0IsUUFBUSxDQUFDLElBQUksMkJBQTJCLENBQ3pELENBQUM7YUFDSDtZQUVELEtBQUssTUFBTSxDQUFDLElBQUksVUFBVSxhQUFWLFVBQVUsY0FBVixVQUFVLEdBQUksRUFBRSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29CQUN2QixPQUFPLENBQUMsQ0FBQztpQkFDVjthQUNGO1lBRUQscUNBQXFDO1lBQ3JDLEtBQUssTUFBTSxPQUFPLElBQUksS0FBSyxFQUFFO2dCQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLEdBQUcsRUFBRTtvQkFDUCxPQUFPLEdBQUcsQ0FBQztpQkFDWjthQUNGO1NBQ0Y7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sb0JBQW9CLENBQzFCLFFBQWdCLEVBQ2hCLEdBQVcsRUFDWCxVQUFxQjtRQUVyQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsTUFBTSxRQUFRLEdBQ1osVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLG9CQUFvQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM3QyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FDYixRQUFRLEdBQUcsR0FBRyxRQUFRLDZCQUE2QixRQUFRLEdBQUcsQ0FDL0QsQ0FBQztTQUNIO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVPLFVBQVUsQ0FBQyxDQUFNLEVBQUUsWUFBc0M7UUFDL0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUNyQyxZQUFZLEVBQ1osSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ2hDLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRXRELE1BQU0sSUFBSSxHQUF3QjtZQUNoQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUM3QixVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3ZDLFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDM0MsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNwQyxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNuQyxLQUFLLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxRQUFRLEVBQUU7WUFDdEQsSUFBSTtnQkFDRixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxXQUFXLENBQ3JELENBQUMsRUFDRCxPQUFPLEVBQ1AsSUFBSSxDQUNMLENBQUM7YUFDSDtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLHNFQUFzRTtnQkFDdEUsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDekIsTUFBTSxDQUFDLENBQUM7aUJBQ1Q7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDeEI7U0FDRjtRQUVELE1BQU0sSUFBSSxLQUFLLENBQ2IsMENBQTBDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUQsQ0FBQztJQUNKLENBQUM7SUFFTyxZQUFZLENBQUMsQ0FBTSxFQUFFLFVBQW9DO1FBQy9ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDckMsVUFBVSxFQUNWLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNoQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUV4RCxNQUFNLElBQUksR0FBd0I7WUFDaEMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN2QyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzNDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDdEMsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDbkMsS0FBSyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLElBQUksUUFBUSxFQUFFO1lBQ3RELElBQUk7Z0JBQ0YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDekU7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixzRUFBc0U7Z0JBQ3RFLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ3pCLE1BQU0sQ0FBQyxDQUFDO2lCQUNUO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3hCO1NBQ0Y7UUFFRCxNQUFNLElBQUksS0FBSyxDQUNiLDBDQUEwQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQzlELENBQUM7SUFDSixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsRUFBUyxFQUFFLFVBQTZCO1FBQy9ELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU8sa0JBQWtCLENBQUMsRUFBUyxFQUFFLFVBQTZCO1FBQ2pFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixFQUFFLEVBQ0YsVUFBVSxFQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQixDQUN6QixFQUFTLEVBQ1QsVUFBd0MsRUFDeEMsUUFBc0Q7UUFFdEQsVUFBVSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsYUFBVixVQUFVLGNBQVYsVUFBVSxHQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxRQUFRLEdBQ1osVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN4RSwwRUFBMEU7UUFDMUUsT0FBTyxRQUFRLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQ2hELFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwRDtRQUNELElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0JBQWtCLElBQUksQ0FBQyxTQUFTLENBQzlCLEVBQUUsQ0FDSCxxREFDQyxVQUFVLENBQUMsTUFDYixHQUFHLENBQ0osQ0FBQztTQUNIO1FBQ0QsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxVQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyxNQUFNLENBQUMsR0FBRyxJQUFXO1FBQzNCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDMUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssV0FBVyxDQUFJLElBQVksRUFBRSxFQUFXO1FBQzlDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUk7WUFDRixPQUFPLEVBQUUsRUFBRSxDQUFDO1NBQ2I7Z0JBQVM7WUFDUixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsR0FBUSxFQUFFLFFBQWdCO1FBQ3BELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RCxJQUFJLFNBQVMsSUFBSSxHQUFHLEVBQUU7WUFDcEIsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsRUFBRTtJQUNGLG1CQUFtQjtJQUNuQixFQUFFO0lBRU0sU0FBUztRQUNmLE9BQU8sbUJBQW1CLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFTyxTQUFTO1FBQ2YsT0FBTyxrQkFBa0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVPLGdCQUFnQixDQUFJLEVBQVc7UUFDckMsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxRQUFRLENBQUMsSUFBWSxFQUFFLFFBQWdCO1FBQzdDLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGO0FBOXJDRCx3QkE4ckNDO0FBa0JELE1BQU0sUUFBUTtJQUNaLFlBQ2tCLFFBQXVCLEVBQ3ZCLE9BQVk7UUFEWixhQUFRLEdBQVIsUUFBUSxDQUFlO1FBQ3ZCLFlBQU8sR0FBUCxPQUFPLENBQUs7SUFDM0IsQ0FBQztDQUNMIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc3BlYyBmcm9tICdAanNpaS9zcGVjJztcbmltcG9ydCAqIGFzIGNwIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHRhciBmcm9tICd0YXInO1xuaW1wb3J0ICogYXMgdm0gZnJvbSAndm0nO1xuXG5pbXBvcnQgKiBhcyBhcGkgZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgVE9LRU5fUkVGIH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgT2JqZWN0VGFibGUsIHRhZ0pzaWlDb25zdHJ1Y3RvciB9IGZyb20gJy4vb2JqZWN0cyc7XG5pbXBvcnQgKiBhcyBvbkV4aXQgZnJvbSAnLi9vbi1leGl0JztcbmltcG9ydCAqIGFzIHdpcmUgZnJvbSAnLi9zZXJpYWxpemF0aW9uJztcblxuZXhwb3J0IGNsYXNzIEtlcm5lbCB7XG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSBmb3IgdmVyYm9zZSBkZWJ1Z2dpbmcuXG4gICAqL1xuICBwdWJsaWMgdHJhY2VFbmFibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBhc3NlbWJsaWVzOiB7IFtuYW1lOiBzdHJpbmddOiBBc3NlbWJseSB9ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0cyA9IG5ldyBPYmplY3RUYWJsZSh0aGlzLl90eXBlSW5mb0ZvckZxbi5iaW5kKHRoaXMpKTtcbiAgcHJpdmF0ZSBjYnM6IHsgW2NiaWQ6IHN0cmluZ106IENhbGxiYWNrIH0gPSB7fTtcbiAgcHJpdmF0ZSB3YWl0aW5nOiB7IFtjYmlkOiBzdHJpbmddOiBDYWxsYmFjayB9ID0ge307XG4gIHByaXZhdGUgcHJvbWlzZXM6IHsgW3ByaWQ6IHN0cmluZ106IEFzeW5jSW52b2NhdGlvbiB9ID0ge307XG4gIHByaXZhdGUgbmV4dGlkID0gMjAwMDA7IC8vIGluY3JlbWVudGluZyBjb3VudGVyIGZvciBvYmppZCwgY2JpZCwgcHJvbWlzZWlkXG4gIHByaXZhdGUgc3luY0luUHJvZ3Jlc3M/OiBzdHJpbmc7IC8vIGZvcmJpZHMgYXN5bmMgY2FsbHMgKGJlZ2luKSB3aGlsZSBwcm9jZXNzaW5nIHN5bmMgY2FsbHMgKGdldC9zZXQvaW52b2tlKVxuICBwcml2YXRlIGluc3RhbGxEaXI/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzYW5kYm94OiB2bS5Db250ZXh0O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEganNpaSBrZXJuZWwgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyIFRoaXMgaGFuZGxlciBpcyBpbnZva2VkIHdoZW4gYSBzeW5jaHJvbm91cyBjYWxsYmFjayBpcyBjYWxsZWQuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgSXQncyByZXNwb25zaWJpbGl0eSBpcyB0byBleGVjdXRlIHRoZSBjYWxsYmFjayBhbmQgcmV0dXJuIGl0J3NcbiAgICogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKG9yIHRocm93IGFuIGVycm9yKS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgY2FsbGJhY2tIYW5kbGVyOiAoY2FsbGJhY2s6IGFwaS5DYWxsYmFjaykgPT4gYW55KSB7XG4gICAgLy8gYHNldEltbWVkaWF0ZWAgaXMgcmVxdWlyZWQgZm9yIHRlc3RzIHRvIHBhc3MgKGl0IGlzIG90aGVyd2lzZVxuICAgIC8vIGltcG9zc2libGUgdG8gd2FpdCBmb3IgaW4tVk0gcHJvbWlzZXMgdG8gY29tcGxldGUpXG5cbiAgICAvLyBgQnVmZmVyYCBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIHNpbXBsZS1yZXNvdXJjZS1idW5kbGVyLlxuXG4gICAgLy8gSEFDSzogd2hlbiB3ZSB3ZWJwYWNrIEBqc2lpL3J1bnRpbWUsIGFsbCBcInJlcXVpcmVcIiBzdGF0ZW1lbnRzIGdldCB0cmFuc3BpbGVkLFxuICAgIC8vIHNvIG1vZHVsZXMgY2FuIGJlIHJlc29sdmVkIHdpdGhpbiB0aGUgcGFjay4gSG93ZXZlciwgaGVyZSB3ZSBhY3R1YWxseSB3YW50IHRvXG4gICAgLy8gbGV0IGxvYWRlZCBtb2R1bGVzIHRvIHVzZSB0aGUgbmF0aXZlIG5vZGUgXCJyZXF1aXJlXCIgbWV0aG9kLlxuICAgIC8vIEkgd29uZGVyIGlmIHdlYnBhY2sgaGFzIHNvbWUgcHJhZ21hIHRoYXQgYWxsb3dzIG9wdGluZy1vdXQgYXQgY2VydGFpbiBwb2ludHNcbiAgICAvLyBpbiB0aGUgY29kZS5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgY29uc3QgbW9kdWxlTG9hZCA9IHJlcXVpcmUoJ21vZHVsZScpLk1vZHVsZS5fbG9hZDtcbiAgICBjb25zdCBub2RlUmVxdWlyZSA9IChwOiBzdHJpbmcpID0+IG1vZHVsZUxvYWQocCwgbW9kdWxlLCBmYWxzZSk7XG5cbiAgICB0aGlzLnNhbmRib3ggPSB2bS5jcmVhdGVDb250ZXh0KHtcbiAgICAgIEJ1ZmZlciwgLy8gdG8gdXNlIHNpbXBsZS1yZXNvdXJjZS1idW5kbGVyXG4gICAgICBzZXRJbW1lZGlhdGUsIC8vIGFzeW5jIHRlc3RzXG4gICAgICByZXF1aXJlOiBub2RlUmVxdWlyZSwgLy8gbW9kdWxlcyBuZWVkIHRvIFwicmVxdWlyZVwiXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbG9hZChyZXE6IGFwaS5Mb2FkUmVxdWVzdCk6IGFwaS5Mb2FkUmVzcG9uc2Uge1xuICAgIHRoaXMuX2RlYnVnKCdsb2FkJywgcmVxKTtcblxuICAgIGlmICgnYXNzZW1ibHknIGluIHJlcSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnYGFzc2VtYmx5YCBmaWVsZCBpcyBkZXByZWNhdGVkIGZvciBcImxvYWRcIiwgdXNlIGBuYW1lYCwgYHZlcnNpb25gIGFuZCBgdGFyYmFsbGAgaW5zdGVhZCcsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBrZ25hbWUgPSByZXEubmFtZTtcbiAgICBjb25zdCBwa2d2ZXIgPSByZXEudmVyc2lvbjtcblxuICAgIC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBzdWNoIGEgbW9kdWxlXG4gICAgY29uc3QgcGFja2FnZURpciA9IHRoaXMuX2dldFBhY2thZ2VEaXIocGtnbmFtZSk7XG4gICAgaWYgKGZzLnBhdGhFeGlzdHNTeW5jKHBhY2thZ2VEaXIpKSB7XG4gICAgICAvLyBtb2R1bGUgZXhpc3RzLCB2ZXJpZnkgdmVyc2lvblxuICAgICAgY29uc3QgZXBrZyA9IGZzLnJlYWRKc29uU3luYyhwYXRoLmpvaW4ocGFja2FnZURpciwgJ3BhY2thZ2UuanNvbicpKTtcbiAgICAgIGlmIChlcGtnLnZlcnNpb24gIT09IHBrZ3Zlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIHZlcnNpb25zICR7cGtndmVyfSBhbmQgJHtlcGtnLnZlcnNpb259IG9mIHRoZSBgICtcbiAgICAgICAgICAgIGBwYWNrYWdlICcke3BrZ25hbWV9JyBjYW5ub3QgYmUgbG9hZGVkIHRvZ2V0aGVyIHNpbmNlIHRoaXMgaXMgdW5zdXBwb3J0ZWQgYnkgYCArXG4gICAgICAgICAgICAnc29tZSBydW50aW1lIGVudmlyb25tZW50cycsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIHNhbWUgdmVyc2lvbiwgbm8tb3BcbiAgICAgIHRoaXMuX2RlYnVnKCdsb29rIHVwIGFscmVhZHktbG9hZGVkIGFzc2VtYmx5JywgcGtnbmFtZSk7XG4gICAgICBjb25zdCBhc3NtID0gdGhpcy5hc3NlbWJsaWVzW3BrZ25hbWVdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhc3NlbWJseTogYXNzbS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICB0eXBlczogT2JqZWN0LmtleXMoYXNzbS5tZXRhZGF0YS50eXBlcyA/PyB7fSkubGVuZ3RoLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGluc3RhbGwgZGlyZWN0b3J5ICh0aGVyZSBtYXkgYmUgc2V2ZXJhbCBwYXRoIGNvbXBvbmVudHMgZm9yIEBzY29wZWQvcGFja2FnZXMpXG4gICAgZnMubWtkaXJwU3luYyhwYWNrYWdlRGlyKTtcblxuICAgIC8vIEZvcmNlIHVtYXNrIHRvIGhhdmUgbnBtLWluc3RhbGwtbGlrZSBwZXJtaXNzaW9uc1xuICAgIGNvbnN0IG9yaWdpbmFsVW1hc2sgPSBwcm9jZXNzLnVtYXNrKDBvMDIyKTtcbiAgICB0cnkge1xuICAgICAgLy8gdW50YXIgdGhlIGFyY2hpdmUgdG8gaXRzIGZpbmFsIGxvY2F0aW9uXG4gICAgICB0YXIuZXh0cmFjdCh7XG4gICAgICAgIGN3ZDogcGFja2FnZURpcixcbiAgICAgICAgZmlsZTogcmVxLnRhcmJhbGwsXG4gICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgc3RyaXA6IDEsIC8vIFJlbW92ZXMgdGhlICdwYWNrYWdlLycgcGF0aCBlbGVtZW50IGZyb20gZW50cmllc1xuICAgICAgICBzeW5jOiB0cnVlLFxuICAgICAgICB1bmxpbms6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVzZXQgdW1hc2sgdG8gdGhlIGluaXRpYWwgdmFsdWVcbiAgICAgIHByb2Nlc3MudW1hc2sob3JpZ2luYWxVbWFzayk7XG4gICAgfVxuXG4gICAgLy8gcmVhZCAuanNpaSBtZXRhZGF0YSBmcm9tIHRoZSByb290IG9mIHRoZSBwYWNrYWdlXG4gICAgY29uc3QganNpaU1ldGFkYXRhRmlsZSA9IHBhdGguam9pbihwYWNrYWdlRGlyLCBzcGVjLlNQRUNfRklMRV9OQU1FKTtcbiAgICBpZiAoIWZzLnBhdGhFeGlzdHNTeW5jKGpzaWlNZXRhZGF0YUZpbGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQYWNrYWdlIHRhcmJhbGwgJHtyZXEudGFyYmFsbH0gbXVzdCBoYXZlIGEgZmlsZSBuYW1lZCAke3NwZWMuU1BFQ19GSUxFX05BTUV9IGF0IHRoZSByb290YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGFzc21TcGVjID0gZnMucmVhZEpzb25TeW5jKGpzaWlNZXRhZGF0YUZpbGUpIGFzIHNwZWMuQXNzZW1ibHk7XG5cbiAgICAvLyBsb2FkIHRoZSBtb2R1bGUgYW5kIGNhcHR1cmUgaXQncyBjbG9zdXJlXG4gICAgY29uc3QgY2xvc3VyZSA9IHRoaXMuX2V4ZWN1dGUoXG4gICAgICBgcmVxdWlyZShTdHJpbmcucmF3XFxgJHtwYWNrYWdlRGlyfVxcYClgLFxuICAgICAgcGFja2FnZURpcixcbiAgICApO1xuICAgIGNvbnN0IGFzc20gPSBuZXcgQXNzZW1ibHkoYXNzbVNwZWMsIGNsb3N1cmUpO1xuICAgIHRoaXMuX2FkZEFzc2VtYmx5KGFzc20pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFzc2VtYmx5OiBhc3NtU3BlYy5uYW1lLFxuICAgICAgdHlwZXM6IE9iamVjdC5rZXlzKGFzc21TcGVjLnR5cGVzID8/IHt9KS5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBpbnZva2VCaW5TY3JpcHQoXG4gICAgcmVxOiBhcGkuSW52b2tlU2NyaXB0UmVxdWVzdCxcbiAgKTogYXBpLkludm9rZVNjcmlwdFJlc3BvbnNlIHtcbiAgICBjb25zdCBwYWNrYWdlRGlyID0gdGhpcy5fZ2V0UGFja2FnZURpcihyZXEuYXNzZW1ibHkpO1xuICAgIGlmIChmcy5wYXRoRXhpc3RzU3luYyhwYWNrYWdlRGlyKSkge1xuICAgICAgLy8gbW9kdWxlIGV4aXN0cywgdmVyaWZ5IHZlcnNpb25cbiAgICAgIGNvbnN0IGVwa2cgPSBmcy5yZWFkSnNvblN5bmMocGF0aC5qb2luKHBhY2thZ2VEaXIsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICAgIGlmICghZXBrZy5iaW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBubyBiaW4gc2NyaXB0cyBkZWZpbmVkIGZvciB0aGlzIHBhY2thZ2UuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcmlwdFBhdGggPSBlcGtnLmJpbltyZXEuc2NyaXB0XTtcblxuICAgICAgaWYgKCFlcGtnLmJpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmlwdCB3aXRoIG5hbWUgJHtyZXEuc2NyaXB0fSB3YXMgbm90IGRlZmluZWQuYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNwLnNwYXduU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHBhY2thZ2VEaXIsIHNjcmlwdFBhdGgpLFxuICAgICAgICByZXEuYXJncyA/PyBbXSxcbiAgICAgICAge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmLTgnLFxuICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGN1cnJlbnQgTk9ERV9PUFRJT05TIGFyZSBob25vcmVkIGlmIHdlIHNoZWxsIG91dCB0byBub2RlXG4gICAgICAgICAgICBOT0RFX09QVElPTlM6IHByb2Nlc3MuZXhlY0FyZ3Yuam9pbignICcpLFxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIFwidGhpc1wiIG5vZGUgaXMgYWhlYWQgb2YgJFBBVEgganVzdCBpbiBjYXNlXG4gICAgICAgICAgICBQQVRIOiBgJHtwYXRoLmRpcm5hbWUocHJvY2Vzcy5leGVjUGF0aCl9OiR7cHJvY2Vzcy5lbnYuUEFUSH1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2hlbGw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGRvdXQ6IHJlc3VsdC5zdGRvdXQsXG4gICAgICAgIHN0ZGVycjogcmVzdWx0LnN0ZGVycixcbiAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICBzaWduYWw6IHJlc3VsdC5zaWduYWwsXG4gICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBhY2thZ2Ugd2l0aCBuYW1lICR7cmVxLmFzc2VtYmx5fSB3YXMgbm90IGxvYWRlZC5gKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUocmVxOiBhcGkuQ3JlYXRlUmVxdWVzdCk6IGFwaS5DcmVhdGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZShyZXEpO1xuICB9XG5cbiAgcHVibGljIGRlbChyZXE6IGFwaS5EZWxSZXF1ZXN0KTogYXBpLkRlbFJlc3BvbnNlIHtcbiAgICBjb25zdCB7IG9ianJlZiB9ID0gcmVxO1xuXG4gICAgdGhpcy5fZGVidWcoJ2RlbCcsIG9ianJlZik7XG4gICAgdGhpcy5vYmplY3RzLmRlbGV0ZU9iamVjdChvYmpyZWYpO1xuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHVibGljIHNnZXQocmVxOiBhcGkuU3RhdGljR2V0UmVxdWVzdCk6IGFwaS5HZXRSZXNwb25zZSB7XG4gICAgY29uc3QgeyBmcW4sIHByb3BlcnR5IH0gPSByZXE7XG4gICAgY29uc3Qgc3ltYm9sID0gYCR7ZnFufS4ke3Byb3BlcnR5fWA7XG4gICAgdGhpcy5fZGVidWcoJ3NnZXQnLCBzeW1ib2wpO1xuICAgIGNvbnN0IHRpID0gdGhpcy5fdHlwZUluZm9Gb3JQcm9wZXJ0eShwcm9wZXJ0eSwgZnFuKTtcblxuICAgIGlmICghdGkuc3RhdGljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3BlcnR5ICR7c3ltYm9sfSBpcyBub3Qgc3RhdGljYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5fZmluZFN5bWJvbChmcW4pO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9lbnN1cmVTeW5jKGBwcm9wZXJ0eSAke3Byb3BlcnR5fWAsICgpID0+XG4gICAgICB0aGlzLl93cmFwU2FuZGJveENvZGUoKCkgPT4gcHJvdG90eXBlW3Byb3BlcnR5XSksXG4gICAgKTtcblxuICAgIHRoaXMuX2RlYnVnKCd2YWx1ZTonLCB2YWx1ZSk7XG4gICAgY29uc3QgcmV0ID0gdGhpcy5fZnJvbVNhbmRib3godmFsdWUsIHRpKTtcbiAgICB0aGlzLl9kZWJ1ZygncmV0JywgcmV0KTtcbiAgICByZXR1cm4geyB2YWx1ZTogcmV0IH07XG4gIH1cblxuICBwdWJsaWMgc3NldChyZXE6IGFwaS5TdGF0aWNTZXRSZXF1ZXN0KTogYXBpLlNldFJlc3BvbnNlIHtcbiAgICBjb25zdCB7IGZxbiwgcHJvcGVydHksIHZhbHVlIH0gPSByZXE7XG4gICAgY29uc3Qgc3ltYm9sID0gYCR7ZnFufS4ke3Byb3BlcnR5fWA7XG4gICAgdGhpcy5fZGVidWcoJ3NzZXQnLCBzeW1ib2wpO1xuICAgIGNvbnN0IHRpID0gdGhpcy5fdHlwZUluZm9Gb3JQcm9wZXJ0eShwcm9wZXJ0eSwgZnFuKTtcblxuICAgIGlmICghdGkuc3RhdGljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3BlcnR5ICR7c3ltYm9sfSBpcyBub3Qgc3RhdGljYCk7XG4gICAgfVxuXG4gICAgaWYgKHRpLmltbXV0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdGF0aWMgcHJvcGVydHkgJHtzeW1ib2x9IGlzIHJlYWRvbmx5YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5fZmluZFN5bWJvbChmcW4pO1xuXG4gICAgdGhpcy5fZW5zdXJlU3luYyhgcHJvcGVydHkgJHtwcm9wZXJ0eX1gLCAoKSA9PlxuICAgICAgdGhpcy5fd3JhcFNhbmRib3hDb2RlKFxuICAgICAgICAoKSA9PiAocHJvdG90eXBlW3Byb3BlcnR5XSA9IHRoaXMuX3RvU2FuZGJveCh2YWx1ZSwgdGkpKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQocmVxOiBhcGkuR2V0UmVxdWVzdCk6IGFwaS5HZXRSZXNwb25zZSB7XG4gICAgY29uc3QgeyBvYmpyZWYsIHByb3BlcnR5IH0gPSByZXE7XG4gICAgdGhpcy5fZGVidWcoJ2dldCcsIG9ianJlZiwgcHJvcGVydHkpO1xuICAgIGNvbnN0IHsgaW5zdGFuY2UsIGZxbiwgaW50ZXJmYWNlcyB9ID0gdGhpcy5vYmplY3RzLmZpbmRPYmplY3Qob2JqcmVmKTtcbiAgICBjb25zdCB0aSA9IHRoaXMuX3R5cGVJbmZvRm9yUHJvcGVydHkocHJvcGVydHksIGZxbiwgaW50ZXJmYWNlcyk7XG5cbiAgICAvLyBpZiB0aGUgcHJvcGVydHkgaXMgb3ZlcnJpZGRlbiBieSB0aGUgbmF0aXZlIGNvZGUgYW5kIFwiZ2V0XCIgaXMgY2FsbGVkIG9uIHRoZSBvYmplY3QsIGl0XG4gICAgLy8gbWVhbnMgdGhhdCB0aGUgbmF0aXZlIGNvZGUgaXMgdHJ5aW5nIHRvIGFjY2VzcyB0aGUgXCJzdXBlclwiIHByb3BlcnR5LiBpbiBvcmRlciB0byBlbmFibGVcbiAgICAvLyB0aGF0LCB3ZSBhY3R1YWxseSBrZWVwIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydHkgZGVzY3JpcHRvciB3aGVuIHdlIG92ZXJyaWRlLFxuICAgIC8vIHNvIGBmaW5kUHJvcGVydHlUYXJnZXRgIHdpbGwgcmV0dXJuIGVpdGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgbmFtZSAoXCJwcm9wZXJ0eVwiKSBvclxuICAgIC8vIHRoZSBcInN1cGVyXCIgcHJvcGVydHkgbmFtZSAoc29tZWhpbmcgbGlrZSBcIiRqc2lpJHN1cGVyJDxwcm9wZXJ0eT4kXCIpLlxuICAgIGNvbnN0IHByb3BlcnR5VG9HZXQgPSB0aGlzLl9maW5kUHJvcGVydHlUYXJnZXQoaW5zdGFuY2UsIHByb3BlcnR5KTtcblxuICAgIC8vIG1ha2UgdGhlIGFjdHVhbCBcImdldFwiLCBhbmQgYmxvY2sgYW55IGFzeW5jIGNhbGxzIHRoYXQgbWlnaHQgYmUgcGVyZm9ybWVkXG4gICAgLy8gYnkganNpaSBvdmVycmlkZXMuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9lbnN1cmVTeW5jKFxuICAgICAgYHByb3BlcnR5ICcke29ianJlZltUT0tFTl9SRUZdfS4ke3Byb3BlcnR5VG9HZXR9J2AsXG4gICAgICAoKSA9PiB0aGlzLl93cmFwU2FuZGJveENvZGUoKCkgPT4gaW5zdGFuY2VbcHJvcGVydHlUb0dldF0pLFxuICAgICk7XG4gICAgdGhpcy5fZGVidWcoJ3ZhbHVlOicsIHZhbHVlKTtcbiAgICBjb25zdCByZXQgPSB0aGlzLl9mcm9tU2FuZGJveCh2YWx1ZSwgdGkpO1xuICAgIHRoaXMuX2RlYnVnKCdyZXQ6JywgcmV0KTtcbiAgICByZXR1cm4geyB2YWx1ZTogcmV0IH07XG4gIH1cblxuICBwdWJsaWMgc2V0KHJlcTogYXBpLlNldFJlcXVlc3QpOiBhcGkuU2V0UmVzcG9uc2Uge1xuICAgIGNvbnN0IHsgb2JqcmVmLCBwcm9wZXJ0eSwgdmFsdWUgfSA9IHJlcTtcbiAgICB0aGlzLl9kZWJ1Zygnc2V0Jywgb2JqcmVmLCBwcm9wZXJ0eSwgdmFsdWUpO1xuICAgIGNvbnN0IHsgaW5zdGFuY2UsIGZxbiwgaW50ZXJmYWNlcyB9ID0gdGhpcy5vYmplY3RzLmZpbmRPYmplY3Qob2JqcmVmKTtcblxuICAgIGNvbnN0IHByb3BJbmZvID0gdGhpcy5fdHlwZUluZm9Gb3JQcm9wZXJ0eShyZXEucHJvcGVydHksIGZxbiwgaW50ZXJmYWNlcyk7XG5cbiAgICBpZiAocHJvcEluZm8uaW1tdXRhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3Qgc2V0IHZhbHVlIG9mIGltbXV0YWJsZSBwcm9wZXJ0eSAke3JlcS5wcm9wZXJ0eX0gdG8gJHtyZXEudmFsdWV9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHlUb1NldCA9IHRoaXMuX2ZpbmRQcm9wZXJ0eVRhcmdldChpbnN0YW5jZSwgcHJvcGVydHkpO1xuXG4gICAgdGhpcy5fZW5zdXJlU3luYyhgcHJvcGVydHkgJyR7b2JqcmVmW1RPS0VOX1JFRl19LiR7cHJvcGVydHlUb1NldH0nYCwgKCkgPT5cbiAgICAgIHRoaXMuX3dyYXBTYW5kYm94Q29kZShcbiAgICAgICAgKCkgPT4gKGluc3RhbmNlW3Byb3BlcnR5VG9TZXRdID0gdGhpcy5fdG9TYW5kYm94KHZhbHVlLCBwcm9wSW5mbykpLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHVibGljIGludm9rZShyZXE6IGFwaS5JbnZva2VSZXF1ZXN0KTogYXBpLkludm9rZVJlc3BvbnNlIHtcbiAgICBjb25zdCB7IG9ianJlZiwgbWV0aG9kIH0gPSByZXE7XG4gICAgY29uc3QgYXJncyA9IHJlcS5hcmdzID8/IFtdO1xuXG4gICAgdGhpcy5fZGVidWcoJ2ludm9rZScsIG9ianJlZiwgbWV0aG9kLCBhcmdzKTtcbiAgICBjb25zdCB7IHRpLCBvYmosIGZuIH0gPSB0aGlzLl9maW5kSW52b2tlVGFyZ2V0KG9ianJlZiwgbWV0aG9kLCBhcmdzKTtcblxuICAgIC8vIHZlcmlmeSB0aGlzIGlzIG5vdCBhbiBhc3luYyBtZXRob2RcbiAgICBpZiAodGkuYXN5bmMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHttZXRob2R9IGlzIGFuIGFzeW5jIG1ldGhvZCwgdXNlIFwiYmVnaW5cIiBpbnN0ZWFkYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gdGhpcy5fZW5zdXJlU3luYyhcbiAgICAgIGBtZXRob2QgJyR7b2JqcmVmW1RPS0VOX1JFRl19LiR7bWV0aG9kfSdgLFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JhcFNhbmRib3hDb2RlKCgpID0+XG4gICAgICAgICAgZm4uYXBwbHkob2JqLCB0aGlzLl90b1NhbmRib3hWYWx1ZXMoYXJncywgdGkucGFyYW1ldGVycykpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZnJvbVNhbmRib3gocmV0LCB0aS5yZXR1cm5zID8/ICd2b2lkJyk7XG4gICAgdGhpcy5fZGVidWcoJ2ludm9rZSByZXN1bHQnLCByZXN1bHQpO1xuXG4gICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gIH1cblxuICBwdWJsaWMgc2ludm9rZShyZXE6IGFwaS5TdGF0aWNJbnZva2VSZXF1ZXN0KTogYXBpLkludm9rZVJlc3BvbnNlIHtcbiAgICBjb25zdCB7IGZxbiwgbWV0aG9kIH0gPSByZXE7XG4gICAgY29uc3QgYXJncyA9IHJlcS5hcmdzID8/IFtdO1xuXG4gICAgdGhpcy5fZGVidWcoJ3NpbnZva2UnLCBmcW4sIG1ldGhvZCwgYXJncyk7XG5cbiAgICBjb25zdCB0aSA9IHRoaXMuX3R5cGVJbmZvRm9yTWV0aG9kKG1ldGhvZCwgZnFuKTtcblxuICAgIGlmICghdGkuc3RhdGljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZnFufS4ke21ldGhvZH0gaXMgbm90IGEgc3RhdGljIG1ldGhvZGApO1xuICAgIH1cblxuICAgIC8vIHZlcmlmeSB0aGlzIGlzIG5vdCBhbiBhc3luYyBtZXRob2RcbiAgICBpZiAodGkuYXN5bmMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHttZXRob2R9IGlzIGFuIGFzeW5jIG1ldGhvZCwgdXNlIFwiYmVnaW5cIiBpbnN0ZWFkYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5fZmluZFN5bWJvbChmcW4pO1xuICAgIGNvbnN0IGZuID0gcHJvdG90eXBlW21ldGhvZF0gYXMgKC4uLnBhcmFtczogYW55W10pID0+IGFueTtcblxuICAgIGNvbnN0IHJldCA9IHRoaXMuX2Vuc3VyZVN5bmMoYG1ldGhvZCAnJHtmcW59LiR7bWV0aG9kfSdgLCAoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JhcFNhbmRib3hDb2RlKCgpID0+XG4gICAgICAgIGZuLmFwcGx5KHByb3RvdHlwZSwgdGhpcy5fdG9TYW5kYm94VmFsdWVzKGFyZ3MsIHRpLnBhcmFtZXRlcnMpKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9kZWJ1ZygnbWV0aG9kIHJldHVybmVkOicsIHJldCk7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0aGlzLl9mcm9tU2FuZGJveChyZXQsIHRpLnJldHVybnMgPz8gJ3ZvaWQnKSB9O1xuICB9XG5cbiAgcHVibGljIGJlZ2luKHJlcTogYXBpLkJlZ2luUmVxdWVzdCk6IGFwaS5CZWdpblJlc3BvbnNlIHtcbiAgICBjb25zdCB7IG9ianJlZiwgbWV0aG9kIH0gPSByZXE7XG4gICAgY29uc3QgYXJncyA9IHJlcS5hcmdzID8/IFtdO1xuXG4gICAgdGhpcy5fZGVidWcoJ2JlZ2luJywgb2JqcmVmLCBtZXRob2QsIGFyZ3MpO1xuXG4gICAgaWYgKHRoaXMuc3luY0luUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBpbnZva2UgYXN5bmMgbWV0aG9kICcke3JlcS5vYmpyZWZbVE9LRU5fUkVGXX0uJHtyZXEubWV0aG9kfScgd2hpbGUgc3luYyAke3RoaXMuc3luY0luUHJvZ3Jlc3N9IGlzIGJlaW5nIHByb2Nlc3NlZGAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdGksIG9iaiwgZm4gfSA9IHRoaXMuX2ZpbmRJbnZva2VUYXJnZXQob2JqcmVmLCBtZXRob2QsIGFyZ3MpO1xuXG4gICAgLy8gdmVyaWZ5IHRoaXMgaXMgaW5kZWVkIGFuIGFzeW5jIG1ldGhvZFxuICAgIGlmICghdGkuYXN5bmMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0aG9kICR7bWV0aG9kfSBpcyBleHBlY3RlZCB0byBiZSBhbiBhc3luYyBtZXRob2RgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5fd3JhcFNhbmRib3hDb2RlKCgpID0+XG4gICAgICBmbi5hcHBseShvYmosIHRoaXMuX3RvU2FuZGJveFZhbHVlcyhhcmdzLCB0aS5wYXJhbWV0ZXJzKSksXG4gICAgKSBhcyBQcm9taXNlPGFueT47XG5cbiAgICAvLyBzaW5jZSB3ZSBhcmUgcGxhbm5pbmcgdG8gcmVzb2x2ZSB0aGlzIHByb21pc2UgaW4gYSBkaWZmZXJlbnQgc2NvcGVcbiAgICAvLyB3ZSBuZWVkIHRvIGhhbmRsZSByZWplY3Rpb25zIGhlcmUgWzFdXG4gICAgLy8gWzFdOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDkyMDE3OS9zaG91bGQtaS1yZWZyYWluLWZyb20taGFuZGxpbmctcHJvbWlzZS1yZWplY3Rpb24tYXN5bmNocm9ub3VzbHkvNDA5MjE1MDVcbiAgICBwcm9taXNlLmNhdGNoKChfKSA9PiB1bmRlZmluZWQpO1xuXG4gICAgY29uc3QgcHJpZCA9IHRoaXMuX21ha2VwcmlkKCk7XG4gICAgdGhpcy5wcm9taXNlc1twcmlkXSA9IHtcbiAgICAgIHByb21pc2UsXG4gICAgICBtZXRob2Q6IHRpLFxuICAgIH07XG5cbiAgICByZXR1cm4geyBwcm9taXNlaWQ6IHByaWQgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlbmQocmVxOiBhcGkuRW5kUmVxdWVzdCk6IFByb21pc2U8YXBpLkVuZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBwcm9taXNlaWQgfSA9IHJlcTtcblxuICAgIHRoaXMuX2RlYnVnKCdlbmQnLCBwcm9taXNlaWQpO1xuXG4gICAgY29uc3QgeyBwcm9taXNlLCBtZXRob2QgfSA9IHRoaXMucHJvbWlzZXNbcHJvbWlzZWlkXTtcbiAgICBpZiAocHJvbWlzZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIHByb21pc2Ugd2l0aCBJRDogJHtwcm9taXNlaWR9YCk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcHJvbWlzZTtcbiAgICAgIHRoaXMuX2RlYnVnKCdwcm9taXNlIHJlc3VsdDonLCByZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX2RlYnVnKCdwcm9taXNlIGVycm9yOicsIGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4geyByZXN1bHQ6IHRoaXMuX2Zyb21TYW5kYm94KHJlc3VsdCwgbWV0aG9kLnJldHVybnMgPz8gJ3ZvaWQnKSB9O1xuICB9XG5cbiAgcHVibGljIGNhbGxiYWNrcyhfcmVxPzogYXBpLkNhbGxiYWNrc1JlcXVlc3QpOiBhcGkuQ2FsbGJhY2tzUmVzcG9uc2Uge1xuICAgIHRoaXMuX2RlYnVnKCdjYWxsYmFja3MnKTtcbiAgICBjb25zdCByZXQgPSBPYmplY3Qua2V5cyh0aGlzLmNicykubWFwKChjYmlkKSA9PiB7XG4gICAgICBjb25zdCBjYiA9IHRoaXMuY2JzW2NiaWRdO1xuICAgICAgdGhpcy53YWl0aW5nW2NiaWRdID0gY2I7IC8vIG1vdmUgdG8gd2FpdGluZ1xuICAgICAgY29uc3QgY2FsbGJhY2s6IGFwaS5DYWxsYmFjayA9IHtcbiAgICAgICAgY2JpZCxcbiAgICAgICAgY29va2llOiBjYi5vdmVycmlkZS5jb29raWUsXG4gICAgICAgIGludm9rZToge1xuICAgICAgICAgIG9ianJlZjogY2Iub2JqcmVmLFxuICAgICAgICAgIG1ldGhvZDogY2Iub3ZlcnJpZGUubWV0aG9kLFxuICAgICAgICAgIGFyZ3M6IGNiLmFyZ3MsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGNhbGxiYWNrO1xuICAgIH0pO1xuXG4gICAgLy8gbW92ZSBhbGwgY2FsbGJhY2tzIHRvIHRoZSB3YWl0IHF1ZXVlIGFuZCBjbGVhbiB0aGUgY2FsbGJhY2sgcXVldWUuXG4gICAgdGhpcy5jYnMgPSB7fTtcbiAgICByZXR1cm4geyBjYWxsYmFja3M6IHJldCB9O1xuICB9XG5cbiAgcHVibGljIGNvbXBsZXRlKHJlcTogYXBpLkNvbXBsZXRlUmVxdWVzdCk6IGFwaS5Db21wbGV0ZVJlc3BvbnNlIHtcbiAgICBjb25zdCB7IGNiaWQsIGVyciwgcmVzdWx0IH0gPSByZXE7XG5cbiAgICB0aGlzLl9kZWJ1ZygnY29tcGxldGUnLCBjYmlkLCBlcnIsIHJlc3VsdCk7XG5cbiAgICBpZiAoIShjYmlkIGluIHRoaXMud2FpdGluZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FsbGJhY2sgJHtjYmlkfSBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjYiA9IHRoaXMud2FpdGluZ1tjYmlkXTtcbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aGlzLl9kZWJ1ZygnY29tcGxldGVkIHdpdGggZXJyb3I6JywgZXJyKTtcbiAgICAgIGNiLmZhaWwobmV3IEVycm9yKGVycikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzYW5kb3hSZXN1bHQgPSB0aGlzLl90b1NhbmRib3goXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgY2IuZXhwZWN0ZWRSZXR1cm5UeXBlID8/ICd2b2lkJyxcbiAgICAgICk7XG4gICAgICB0aGlzLl9kZWJ1ZygnY29tcGxldGVkIHdpdGggcmVzdWx0OicsIHNhbmRveFJlc3VsdCk7XG4gICAgICBjYi5zdWNjZWVkKHNhbmRveFJlc3VsdCk7XG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXMud2FpdGluZ1tjYmlkXTtcblxuICAgIHJldHVybiB7IGNiaWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBuYW1lcyBmb3IgYSBqc2lpIG1vZHVsZS5cbiAgICogQHBhcmFtIGFzc2VtYmx5TmFtZSBUaGUgbmFtZSBvZiB0aGUganNpaSBtb2R1bGUgKGkuZS4ganNpaSRqc2lpX2NhbGN1bGF0b3JfbGliJClcbiAgICovXG4gIHB1YmxpYyBuYW1pbmcocmVxOiBhcGkuTmFtaW5nUmVxdWVzdCk6IGFwaS5OYW1pbmdSZXNwb25zZSB7XG4gICAgY29uc3QgYXNzZW1ibHlOYW1lID0gcmVxLmFzc2VtYmx5O1xuXG4gICAgdGhpcy5fZGVidWcoJ25hbWluZycsIGFzc2VtYmx5TmFtZSk7XG5cbiAgICBjb25zdCBhc3NlbWJseSA9IHRoaXMuX2Fzc2VtYmx5Rm9yKGFzc2VtYmx5TmFtZSk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFzc2VtYmx5Lm1ldGFkYXRhLnRhcmdldHM7XG4gICAgaWYgKCF0YXJnZXRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgLSBcInRhcmdldHNcIiBmb3IgJHthc3NlbWJseU5hbWV9IGlzIG1pc3NpbmchYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbmFtaW5nOiB0YXJnZXRzIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdHMoX3JlcT86IGFwaS5TdGF0c1JlcXVlc3QpOiBhcGkuU3RhdHNSZXNwb25zZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9iamVjdENvdW50OiB0aGlzLm9iamVjdHMuY291bnQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZEFzc2VtYmx5KGFzc206IEFzc2VtYmx5KSB7XG4gICAgdGhpcy5hc3NlbWJsaWVzW2Fzc20ubWV0YWRhdGEubmFtZV0gPSBhc3NtO1xuXG4gICAgLy8gYWRkIHRoZSBfX2pzaWlfXy5mcW4gcHJvcGVydHkgb24gZXZlcnkgY29uc3RydWN0b3IuIHRoaXMgYWxsb3dzXG4gICAgLy8gdHJhdmVyc2luZyBiZXR3ZWVuIHRoZSBqYXZhc2NyaXB0IGFuZCBqc2lpIHdvcmxkcyBnaXZlbiBhbnkgb2JqZWN0LlxuICAgIGZvciAoY29uc3QgZnFuIG9mIE9iamVjdC5rZXlzKGFzc20ubWV0YWRhdGEudHlwZXMgPz8ge30pKSB7XG4gICAgICBjb25zdCB0eXBlZGVmID0gYXNzbS5tZXRhZGF0YS50eXBlcyFbZnFuXTtcbiAgICAgIHN3aXRjaCAodHlwZWRlZi5raW5kKSB7XG4gICAgICAgIGNhc2Ugc3BlYy5UeXBlS2luZC5JbnRlcmZhY2U6XG4gICAgICAgICAgY29udGludWU7IC8vIGludGVyZmFjZXMgZG9uJ3QgcmVhbGx5IGV4aXN0XG4gICAgICAgIGNhc2Ugc3BlYy5UeXBlS2luZC5DbGFzczpcbiAgICAgICAgY2FzZSBzcGVjLlR5cGVLaW5kLkVudW06XG4gICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzLl9maW5kU3ltYm9sKGZxbik7XG4gICAgICAgICAgdGFnSnNpaUNvbnN0cnVjdG9yKGNvbnN0cnVjdG9yLCBmcW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgdGhlIGphdmFzY3JpcHQgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGEganNpaSBGUU4uXG4gIHByaXZhdGUgX2ZpbmRDdG9yKFxuICAgIGZxbjogc3RyaW5nLFxuICAgIGFyZ3M6IGFueVtdLFxuICApOiB7IGN0b3I6IGFueTsgcGFyYW1ldGVycz86IHNwZWMuUGFyYW1ldGVyW10gfSB7XG4gICAgaWYgKGZxbiA9PT0gd2lyZS5FTVBUWV9PQkpFQ1RfRlFOKSB7XG4gICAgICByZXR1cm4geyBjdG9yOiBPYmplY3QgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlaW5mbyA9IHRoaXMuX3R5cGVJbmZvRm9yRnFuKGZxbik7XG5cbiAgICBzd2l0Y2ggKHR5cGVpbmZvLmtpbmQpIHtcbiAgICAgIGNhc2Ugc3BlYy5UeXBlS2luZC5DbGFzczpcbiAgICAgICAgY29uc3QgY2xhc3NUeXBlID0gdHlwZWluZm8gYXMgc3BlYy5DbGFzc1R5cGU7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlTWV0aG9kQXJndW1lbnRzKGNsYXNzVHlwZS5pbml0aWFsaXplciwgYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY3RvcjogdGhpcy5fZmluZFN5bWJvbChmcW4pLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IGNsYXNzVHlwZS5pbml0aWFsaXplciAmJiBjbGFzc1R5cGUuaW5pdGlhbGl6ZXIucGFyYW1ldGVycyxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSBzcGVjLlR5cGVLaW5kLkludGVyZmFjZTpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgY3JlYXRlIGFuIG9iamVjdCB3aXRoIGFuIEZRTiBvZiBhbiBpbnRlcmZhY2U6ICR7ZnFufWAsXG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBGUU4ga2luZDogJHtmcW59YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UGFja2FnZURpcihwa2duYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5pbnN0YWxsRGlyKSB7XG4gICAgICB0aGlzLmluc3RhbGxEaXIgPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICdqc2lpLWtlcm5lbC0nKSk7XG4gICAgICBmcy5ta2RpcnBTeW5jKHBhdGguam9pbih0aGlzLmluc3RhbGxEaXIsICdub2RlX21vZHVsZXMnKSk7XG4gICAgICB0aGlzLl9kZWJ1ZygnY3JlYXRpbmcganNpaS1rZXJuZWwgbW9kdWxlcyB3b3JrZGlyOicsIHRoaXMuaW5zdGFsbERpcik7XG5cbiAgICAgIG9uRXhpdC5yZW1vdmVTeW5jKHRoaXMuaW5zdGFsbERpcik7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5pbnN0YWxsRGlyLCAnbm9kZV9tb2R1bGVzJywgcGtnbmFtZSk7XG4gIH1cblxuICAvLyBwcmVmaXhlZCB3aXRoIF8gdG8gYWxsb3cgY2FsbGluZyB0aGlzIG1ldGhvZCBpbnRlcm5hbGx5IHdpdGhvdXRcbiAgLy8gZ2V0dGluZyBpdCByZWNvcmRlZCBmb3IgdGVzdGluZy5cbiAgcHJpdmF0ZSBfY3JlYXRlKHJlcTogYXBpLkNyZWF0ZVJlcXVlc3QpOiBhcGkuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIHRoaXMuX2RlYnVnKCdjcmVhdGUnLCByZXEpO1xuICAgIGNvbnN0IHsgZnFuLCBpbnRlcmZhY2VzLCBvdmVycmlkZXMgfSA9IHJlcTtcblxuICAgIGNvbnN0IHJlcXVlc3RBcmdzID0gcmVxLmFyZ3MgPz8gW107XG5cbiAgICBjb25zdCBjdG9yUmVzdWx0ID0gdGhpcy5fZmluZEN0b3IoZnFuLCByZXF1ZXN0QXJncyk7XG4gICAgY29uc3QgY3RvciA9IGN0b3JSZXN1bHQuY3RvcjtcbiAgICBjb25zdCBvYmogPSB0aGlzLl93cmFwU2FuZGJveENvZGUoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgY3RvciguLi50aGlzLl90b1NhbmRib3hWYWx1ZXMocmVxdWVzdEFyZ3MsIGN0b3JSZXN1bHQucGFyYW1ldGVycykpLFxuICAgICk7XG4gICAgY29uc3Qgb2JqcmVmID0gdGhpcy5vYmplY3RzLnJlZ2lzdGVyT2JqZWN0KG9iaiwgZnFuLCByZXEuaW50ZXJmYWNlcyA/PyBbXSk7XG5cbiAgICAvLyBvdmVycmlkZXM6IGZvciBlYWNoIG9uZSBvZiB0aGUgb3ZlcnJpZGUgbWV0aG9kIG5hbWVzLCBpbnN0YWxscyBhXG4gICAgLy8gbWV0aG9kIG9uIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSByZW1vdGUgXCJyZXZlcnNlIHByb3h5XCIuXG5cbiAgICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLl9kZWJ1Zygnb3ZlcnJpZGVzJywgb3ZlcnJpZGVzKTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGVUeXBlRXJyb3JNZXNzYWdlID1cbiAgICAgICAgJ092ZXJyaWRlIGNhbiBlaXRoZXIgYmUgXCJtZXRob2RcIiBvciBcInByb3BlcnR5XCInO1xuICAgICAgY29uc3QgbWV0aG9kcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICBmb3IgKGNvbnN0IG92ZXJyaWRlIG9mIG92ZXJyaWRlcykge1xuICAgICAgICBpZiAoYXBpLmlzTWV0aG9kT3ZlcnJpZGUob3ZlcnJpZGUpKSB7XG4gICAgICAgICAgaWYgKGFwaS5pc1Byb3BlcnR5T3ZlcnJpZGUob3ZlcnJpZGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Iob3ZlcnJpZGVUeXBlRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1ldGhvZHMuaGFzKG92ZXJyaWRlLm1ldGhvZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYER1cGxpY2F0ZSBvdmVycmlkZSBmb3IgbWV0aG9kICcke292ZXJyaWRlLm1ldGhvZH0nYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1ldGhvZHMuYWRkKG92ZXJyaWRlLm1ldGhvZCk7XG5cbiAgICAgICAgICB0aGlzLl9hcHBseU1ldGhvZE92ZXJyaWRlKG9iaiwgb2JqcmVmLCBmcW4sIGludGVyZmFjZXMsIG92ZXJyaWRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChhcGkuaXNQcm9wZXJ0eU92ZXJyaWRlKG92ZXJyaWRlKSkge1xuICAgICAgICAgIGlmIChhcGkuaXNNZXRob2RPdmVycmlkZShvdmVycmlkZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihvdmVycmlkZVR5cGVFcnJvck1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXMob3ZlcnJpZGUucHJvcGVydHkpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgYER1cGxpY2F0ZSBvdmVycmlkZSBmb3IgcHJvcGVydHkgJyR7b3ZlcnJpZGUucHJvcGVydHl9J2AsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChvdmVycmlkZS5wcm9wZXJ0eSk7XG5cbiAgICAgICAgICB0aGlzLl9hcHBseVByb3BlcnR5T3ZlcnJpZGUob2JqLCBvYmpyZWYsIGZxbiwgaW50ZXJmYWNlcywgb3ZlcnJpZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihvdmVycmlkZVR5cGVFcnJvck1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ianJlZjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFN1cGVyUHJvcGVydHlOYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBgJGpzaWkkc3VwZXIkJHtuYW1lfSRgO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlQcm9wZXJ0eU92ZXJyaWRlKFxuICAgIG9iajogYW55LFxuICAgIG9ianJlZjogYXBpLk9ialJlZixcbiAgICB0eXBlRnFuOiBzdHJpbmcsXG4gICAgaW50ZXJmYWNlczogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gICAgb3ZlcnJpZGU6IGFwaS5Qcm9wZXJ0eU92ZXJyaWRlLFxuICApIHtcbiAgICAvLyBlcnJvciBpZiB3ZSBjYW4gZmluZCBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZVxuICAgIGlmICh0aGlzLl90cnlUeXBlSW5mb0Zvck1ldGhvZChvdmVycmlkZS5wcm9wZXJ0eSwgdHlwZUZxbiwgaW50ZXJmYWNlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyeWluZyB0byBvdmVycmlkZSBtZXRob2QgJyR7b3ZlcnJpZGUucHJvcGVydHl9JyBhcyBhIHByb3BlcnR5YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHByb3BJbmZvID0gdGhpcy5fdHJ5VHlwZUluZm9Gb3JQcm9wZXJ0eShcbiAgICAgIG92ZXJyaWRlLnByb3BlcnR5LFxuICAgICAgdHlwZUZxbixcbiAgICAgIGludGVyZmFjZXMsXG4gICAgKTtcbiAgICAvLyBpZiB0aGlzIGlzIGEgcHJpdmF0ZSBwcm9wZXJ0eSAoaS5lLiBkb2Vzbid0IGhhdmUgYHByb3BJbmZvYCB0aGUgb2JqZWN0IGhhcyBhIGtleSlcbiAgICBpZiAoIXByb3BJbmZvICYmIG92ZXJyaWRlLnByb3BlcnR5IGluIG9iaikge1xuICAgICAgdGhpcy5fZGVidWcoYFNraXBwaW5nIG92ZXJyaWRlIG9mIHByaXZhdGUgcHJvcGVydHkgJHtvdmVycmlkZS5wcm9wZXJ0eX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXByb3BJbmZvKSB7XG4gICAgICAvLyBXZSd2ZSBvdmVycmlkaW5nIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0IHdlIGhhdmUgTk8gdHlwZSBpbmZvcm1hdGlvbiBvbiAocHJvYmFibHlcbiAgICAgIC8vIGJlY2F1c2UgaXQncyBhbiBhbm9ueW1vdXMgb2JqZWN0KS5cbiAgICAgIC8vIFByZXRlbmQgaXQncyAncHJvcDogYW55JztcbiAgICAgIC8vXG4gICAgICAvLyBGSVhNRTogV2UgY291bGQgZG8gYmV0dGVyIHR5cGUgY2hlY2tpbmcgZHVyaW5nIHRoZSBjb252ZXJzaW9uIGlmIEpTSUkgY2xpZW50c1xuICAgICAgLy8gd291bGQgdGVsbCB1cyB0aGUgaW50ZW5kZWQgaW50ZXJmYWNlIHR5cGUuXG4gICAgICBwcm9wSW5mbyA9IHtcbiAgICAgICAgbmFtZTogb3ZlcnJpZGUucHJvcGVydHksXG4gICAgICAgIHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fZGVmaW5lT3ZlcnJpZGVuUHJvcGVydHkob2JqLCBvYmpyZWYsIG92ZXJyaWRlLCBwcm9wSW5mbyk7XG4gIH1cblxuICBwcml2YXRlIF9kZWZpbmVPdmVycmlkZW5Qcm9wZXJ0eShcbiAgICBvYmo6IGFueSxcbiAgICBvYmpyZWY6IGFwaS5PYmpSZWYsXG4gICAgb3ZlcnJpZGU6IGFwaS5Qcm9wZXJ0eU92ZXJyaWRlLFxuICAgIHByb3BJbmZvOiBzcGVjLlByb3BlcnR5LFxuICApIHtcbiAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBvdmVycmlkZS5wcm9wZXJ0eTtcblxuICAgIHRoaXMuX2RlYnVnKCdhcHBseSBvdmVycmlkZScsIHByb3BlcnR5TmFtZSk7XG5cbiAgICAvLyBzYXZlIHRoZSBvbGQgcHJvcGVydHkgdW5kZXIgJGpzaWkkc3VwZXIkPHByb3A+JCBzbyB0aGF0IHByb3BlcnR5IG92ZXJyaWRlc1xuICAgIC8vIGNhbiBzdGlsbCBhY2Nlc3MgaXQgdmlhIGBzdXBlci48cHJvcD5gLlxuICAgIGNvbnN0IHByZXYgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wZXJ0eU5hbWUpID8/IHtcbiAgICAgIHZhbHVlOiBvYmpbcHJvcGVydHlOYW1lXSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcHJldkVudW1lcmFibGUgPSBwcmV2LmVudW1lcmFibGU7XG4gICAgcHJldi5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgdGhpcy5fZ2V0U3VwZXJQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSwgcHJldik7XG5cbiAgICAvLyB3ZSBhZGQgY2FsbGJhY2tzIGZvciBib3RoICdnZXQnIGFuZCAnc2V0JywgZXZlbiBpZiB0aGUgcHJvcGVydHlcbiAgICAvLyBpcyByZWFkb25seS4gdGhpcyBpcyBmaW5lIGJlY2F1c2UgaWYgeW91IHRyeSB0byBzZXQoKSBhIHJlYWRvbmx5XG4gICAgLy8gcHJvcGVydHksIGl0IHdpbGwgZmFpbC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wZXJ0eU5hbWUsIHtcbiAgICAgIGVudW1lcmFibGU6IHByZXZFbnVtZXJhYmxlLFxuICAgICAgY29uZmlndXJhYmxlOiBwcmV2LmNvbmZpZ3VyYWJsZSxcbiAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICB0aGlzLl9kZWJ1ZygndmlydHVhbCBnZXQnLCBvYmpyZWYsIHByb3BlcnR5TmFtZSwge1xuICAgICAgICAgIGNvb2tpZTogb3ZlcnJpZGUuY29va2llLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jYWxsYmFja0hhbmRsZXIoe1xuICAgICAgICAgIGNvb2tpZTogb3ZlcnJpZGUuY29va2llLFxuICAgICAgICAgIGNiaWQ6IHRoaXMuX21ha2VjYmlkKCksXG4gICAgICAgICAgZ2V0OiB7IG9ianJlZiwgcHJvcGVydHk6IHByb3BlcnR5TmFtZSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZGVidWcoJ2NhbGxiYWNrIHJldHVybmVkJywgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvU2FuZGJveChyZXN1bHQsIHByb3BJbmZvKTtcbiAgICAgIH0sXG4gICAgICBzZXQ6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCd2aXJ0dWFsIHNldCcsIG9ianJlZiwgcHJvcGVydHlOYW1lLCB7XG4gICAgICAgICAgY29va2llOiBvdmVycmlkZS5jb29raWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhbGxiYWNrSGFuZGxlcih7XG4gICAgICAgICAgY29va2llOiBvdmVycmlkZS5jb29raWUsXG4gICAgICAgICAgY2JpZDogdGhpcy5fbWFrZWNiaWQoKSxcbiAgICAgICAgICBzZXQ6IHtcbiAgICAgICAgICAgIG9ianJlZixcbiAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5fZnJvbVNhbmRib3godmFsdWUsIHByb3BJbmZvKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBvYmo6IGFueSxcbiAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgICk6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gICAgICBjb25zdCBkaXJlY3QgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcGVydHlOYW1lKTtcbiAgICAgIGlmIChkaXJlY3QgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZGlyZWN0O1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgICAgIGlmIChwcm90byA9PSBudWxsICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIC8vIFdlIHJlYWNoZWQgT2JqZWN0IG9yIHRoZSBwcm90b3R5cGUgY2hhaW4gcm9vdCwgYWxsIGhvcGUgaXMgbG9zdCFcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBnZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHByb3BlcnR5TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlNZXRob2RPdmVycmlkZShcbiAgICBvYmo6IGFueSxcbiAgICBvYmpyZWY6IGFwaS5PYmpSZWYsXG4gICAgdHlwZUZxbjogc3RyaW5nLFxuICAgIGludGVyZmFjZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgIG92ZXJyaWRlOiBhcGkuTWV0aG9kT3ZlcnJpZGUsXG4gICkge1xuICAgIC8vIGVycm9yIGlmIHdlIGNhbiBmaW5kIGEgcHJvcGVydHkgd2l0aCB0aGlzIG5hbWVcbiAgICBpZiAodGhpcy5fdHJ5VHlwZUluZm9Gb3JQcm9wZXJ0eShvdmVycmlkZS5tZXRob2QsIHR5cGVGcW4sIGludGVyZmFjZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcnlpbmcgdG8gb3ZlcnJpZGUgcHJvcGVydHkgJyR7b3ZlcnJpZGUubWV0aG9kfScgYXMgYSBtZXRob2RgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgbWV0aG9kSW5mbyA9IHRoaXMuX3RyeVR5cGVJbmZvRm9yTWV0aG9kKFxuICAgICAgb3ZlcnJpZGUubWV0aG9kLFxuICAgICAgdHlwZUZxbixcbiAgICAgIGludGVyZmFjZXMsXG4gICAgKTtcblxuICAgIC8vIElmIHRoaXMgaXMgYSBwcml2YXRlIG1ldGhvZCAoZG9lc24ndCBoYXZlIG1ldGhvZEluZm8sIGtleSByZXNvbHZlcyBvbiB0aGUgb2JqZWN0KSwgd2VcbiAgICAvLyBhcmUgZ29pbmcgdG8gc2tpcCB0aGUgb3ZlcnJpZGUuXG4gICAgaWYgKCFtZXRob2RJbmZvICYmIG9ialtvdmVycmlkZS5tZXRob2RdKSB7XG4gICAgICB0aGlzLl9kZWJ1ZyhgU2tpcHBpbmcgb3ZlcnJpZGUgb2YgcHJpdmF0ZSBtZXRob2QgJHtvdmVycmlkZS5tZXRob2R9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFtZXRob2RJbmZvKSB7XG4gICAgICAvLyBXZSd2ZSBvdmVycmlkaW5nIGEgbWV0aG9kIG9uIGFuIG9iamVjdCB3ZSBoYXZlIE5PIHR5cGUgaW5mb3JtYXRpb24gb24gKHByb2JhYmx5XG4gICAgICAvLyBiZWNhdXNlIGl0J3MgYW4gYW5vbnltb3VzIG9iamVjdCkuXG4gICAgICAvLyBQcmV0ZW5kIGl0J3MgYW4gKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgICAgIG1ldGhvZEluZm8gPSB7XG4gICAgICAgIG5hbWU6IG92ZXJyaWRlLm1ldGhvZCxcbiAgICAgICAgcmV0dXJuczogeyB0eXBlOiBzcGVjLkNBTk9OSUNBTF9BTlkgfSxcbiAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdhcmdzJyxcbiAgICAgICAgICAgIHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSxcbiAgICAgICAgICAgIHZhcmlhZGljOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHZhcmlhZGljOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWZpbmVPdmVycmlkZW5NZXRob2Qob2JqLCBvYmpyZWYsIG92ZXJyaWRlLCBtZXRob2RJbmZvKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RlZmluZU92ZXJyaWRlbk1ldGhvZChcbiAgICBvYmo6IGFueSxcbiAgICBvYmpyZWY6IGFwaS5PYmpSZWYsXG4gICAgb3ZlcnJpZGU6IGFwaS5NZXRob2RPdmVycmlkZSxcbiAgICBtZXRob2RJbmZvOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IG92ZXJyaWRlLm1ldGhvZDtcblxuICAgIGlmIChtZXRob2RJbmZvLmFzeW5jKSB7XG4gICAgICAvLyBhc3luYyBtZXRob2Qgb3ZlcnJpZGVcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZE5hbWUsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6ICguLi5tZXRob2RBcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIHRoaXMuX2RlYnVnKCdpbnZva2UgYXN5bmMgbWV0aG9kIG92ZXJyaWRlJywgb3ZlcnJpZGUpO1xuICAgICAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl90b1NhbmRib3hWYWx1ZXMobWV0aG9kQXJncywgbWV0aG9kSW5mby5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pigoc3VjY2VlZCwgZmFpbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2JpZCA9IHRoaXMuX21ha2VjYmlkKCk7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnYWRkaW5nIGNhbGxiYWNrIHRvIHF1ZXVlJywgY2JpZCk7XG4gICAgICAgICAgICB0aGlzLmNic1tjYmlkXSA9IHtcbiAgICAgICAgICAgICAgb2JqcmVmLFxuICAgICAgICAgICAgICBvdmVycmlkZSxcbiAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgZXhwZWN0ZWRSZXR1cm5UeXBlOiBtZXRob2RJbmZvLnJldHVybnMgPz8gJ3ZvaWQnLFxuICAgICAgICAgICAgICBzdWNjZWVkLFxuICAgICAgICAgICAgICBmYWlsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzeW5jIG1ldGhvZCBvdmVycmlkZSAobWV0aG9kIGluZm8gaXMgbm90IHJlcXVpcmVkKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbWV0aG9kTmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogKC4uLm1ldGhvZEFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZGVidWcoXG4gICAgICAgICAgICAnaW52b2tlIHN5bmMgbWV0aG9kIG92ZXJyaWRlJyxcbiAgICAgICAgICAgIG92ZXJyaWRlLFxuICAgICAgICAgICAgJ2FyZ3MnLFxuICAgICAgICAgICAgbWV0aG9kQXJncyxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFdlIHNob3VsZCBiZSB2YWxpZGF0aW5nIHRoZSBhY3R1YWwgYXJndW1lbnRzIGFjY29yZGluZyB0byB0aGVcbiAgICAgICAgICAvLyBkZWNsYXJlZCBwYXJhbWV0ZXJzIGhlcmUsIGJ1dCBsZXQncyBqdXN0IGFzc3VtZSB0aGUgSlNJSSBydW50aW1lIG9uIHRoZVxuICAgICAgICAgIC8vIG90aGVyIGVuZCBoYXMgZG9uZSBpdHMgd29yay5cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNhbGxiYWNrSGFuZGxlcih7XG4gICAgICAgICAgICBjb29raWU6IG92ZXJyaWRlLmNvb2tpZSxcbiAgICAgICAgICAgIGNiaWQ6IHRoaXMuX21ha2VjYmlkKCksXG4gICAgICAgICAgICBpbnZva2U6IHtcbiAgICAgICAgICAgICAgb2JqcmVmLFxuICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgICAgIGFyZ3M6IHRoaXMuX2Zyb21TYW5kYm94VmFsdWVzKG1ldGhvZEFyZ3MsIG1ldGhvZEluZm8ucGFyYW1ldGVycyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX2RlYnVnKCdSZXN1bHQnLCByZXN1bHQpO1xuICAgICAgICAgIHJldHVybiB0aGlzLl90b1NhbmRib3gocmVzdWx0LCBtZXRob2RJbmZvLnJldHVybnMgPz8gJ3ZvaWQnKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRJbnZva2VUYXJnZXQoXG4gICAgb2JqcmVmOiBhcGkuT2JqUmVmLFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBhcmdzOiBhbnlbXSxcbiAgKSB7XG4gICAgY29uc3QgeyBpbnN0YW5jZSwgZnFuLCBpbnRlcmZhY2VzIH0gPSB0aGlzLm9iamVjdHMuZmluZE9iamVjdChvYmpyZWYpO1xuICAgIGNvbnN0IHRpID0gdGhpcy5fdHlwZUluZm9Gb3JNZXRob2QobWV0aG9kTmFtZSwgZnFuLCBpbnRlcmZhY2VzKTtcbiAgICB0aGlzLl92YWxpZGF0ZU1ldGhvZEFyZ3VtZW50cyh0aSwgYXJncyk7XG5cbiAgICAvLyBhbHdheXMgZmlyc3QgbG9vayB1cCB0aGUgbWV0aG9kIGluIHRoZSBwcm90b3R5cGUuIHRoaXMgcHJhY3RpY2FsbHkgYnlwYXNzZXNcbiAgICAvLyBhbnkgbWV0aG9kcyBvdmVycmlkZGVuIGJ5IGRlcml2ZWQgY2xhc3NlcyAod2hpY2ggYXJlIGJ5IGRlZmluaXRpb24gbmF0aXZlXG4gICAgLy8gbWV0aG9kcykuIHRoaXMgc2VydmVzIHRvIGFsbG93IG5hdGl2ZSBjYWxsIHRvIGludm9rZSBcInN1cGVyLm1ldGhvZCgpXCIgd2hlblxuICAgIC8vIG92ZXJyaWRpbmcgdGhlIG1ldGhvZC5cbiAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCB0aGUgbWV0aG9kIG9uIHRoZSBwcm90b3R5cGUsIGl0IGNvdWxkIGJlIGEgbGl0ZXJhbCBvYmplY3RcbiAgICAvLyB0aGF0IGltcGxlbWVudHMgYW4gaW50ZXJmYWNlLCBzbyB3ZSBsb29rIGlmIHdlIGhhdmUgdGhlIG1ldGhvZCBvbiB0aGUgb2JqZWN0XG4gICAgLy8gaXRzZWxmLiBpZiB3ZSBkbywgd2UgaW52b2tlIGl0LlxuICAgIGxldCBmbiA9IGluc3RhbmNlLmNvbnN0cnVjdG9yLnByb3RvdHlwZVttZXRob2ROYW1lXTtcbiAgICBpZiAoIWZuKSB7XG4gICAgICBmbiA9IGluc3RhbmNlW21ldGhvZE5hbWVdO1xuICAgICAgaWYgKCFmbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kICR7bWV0aG9kTmFtZX0gb24gb2JqZWN0YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHRpLCBvYmo6IGluc3RhbmNlLCBmbiB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfdmFsaWRhdGVNZXRob2RBcmd1bWVudHMoXG4gICAgbWV0aG9kOiBzcGVjLkNhbGxhYmxlIHwgdW5kZWZpbmVkLFxuICAgIGFyZ3M6IGFueVtdLFxuICApIHtcbiAgICBjb25zdCBwYXJhbXM6IHNwZWMuUGFyYW1ldGVyW10gPSBtZXRob2Q/LnBhcmFtZXRlcnMgPz8gW107XG5cbiAgICAvLyBlcnJvciBpZiBhcmdzID4gcGFyYW1zXG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gcGFyYW1zLmxlbmd0aCAmJiAhKG1ldGhvZCAmJiBtZXRob2QudmFyaWFkaWMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUb28gbWFueSBhcmd1bWVudHMgKG1ldGhvZCBhY2NlcHRzICR7cGFyYW1zLmxlbmd0aH0gcGFyYW1ldGVycywgZ290ICR7YXJncy5sZW5ndGh9IGFyZ3VtZW50cylgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgcGFyYW0gPSBwYXJhbXNbaV07XG4gICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuXG4gICAgICBpZiAocGFyYW0udmFyaWFkaWMpIHtcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPD0gaSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBObyB2YXJhcmcgd2FzIHByb3ZpZGVkXG4gICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKCFwYXJhbS5vcHRpb25hbCAmJiBwYXJhbXNbal0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVW5leHBlY3RlZCAndW5kZWZpbmVkJyB2YWx1ZSBhdCBpbmRleCAke1xuICAgICAgICAgICAgICAgIGogLSBpXG4gICAgICAgICAgICAgIH0gb2YgdmFyaWFkaWMgYXJndW1lbnQgJyR7XG4gICAgICAgICAgICAgICAgcGFyYW0ubmFtZVxuICAgICAgICAgICAgICB9JyBvZiB0eXBlICcke3NwZWMuZGVzY3JpYmVUeXBlUmVmZXJlbmNlKHBhcmFtLnR5cGUpfSdgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXBhcmFtLm9wdGlvbmFsICYmIGFyZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm90IGVub3VnaCBhcmd1bWVudHMuIE1pc3NpbmcgYXJndW1lbnQgZm9yIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXIgJyR7XG4gICAgICAgICAgICBwYXJhbS5uYW1lXG4gICAgICAgICAgfScgb2YgdHlwZSAnJHtzcGVjLmRlc2NyaWJlVHlwZVJlZmVyZW5jZShwYXJhbS50eXBlKX0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hc3NlbWJseUZvcihhc3NlbWJseU5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gdGhpcy5hc3NlbWJsaWVzW2Fzc2VtYmx5TmFtZV07XG4gICAgaWYgKCFhc3NlbWJseSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBhc3NlbWJseTogJHthc3NlbWJseU5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBhc3NlbWJseTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRTeW1ib2woZnFuOiBzdHJpbmcpIHtcbiAgICBjb25zdCBbYXNzZW1ibHlOYW1lLCAuLi5wYXJ0c10gPSBmcW4uc3BsaXQoJy4nKTtcbiAgICBjb25zdCBhc3NlbWJseSA9IHRoaXMuX2Fzc2VtYmx5Rm9yKGFzc2VtYmx5TmFtZSk7XG5cbiAgICBsZXQgY3VyciA9IGFzc2VtYmx5LmNsb3N1cmU7XG4gICAgd2hpbGUgKHBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjdXJyID0gY3VycltuYW1lXTtcbiAgICB9XG4gICAgaWYgKCFjdXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHN5bWJvbCAke2Zxbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnI7XG4gIH1cblxuICBwcml2YXRlIF90eXBlSW5mb0ZvckZxbihmcW46IHN0cmluZyk6IHNwZWMuVHlwZSB7XG4gICAgY29uc3QgY29tcG9uZW50cyA9IGZxbi5zcGxpdCgnLicpO1xuICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBjb21wb25lbnRzWzBdO1xuXG4gICAgY29uc3QgYXNzZW1ibHkgPSB0aGlzLmFzc2VtYmxpZXNbbW9kdWxlTmFtZV07XG4gICAgaWYgKCFhc3NlbWJseSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2R1bGUgJyR7bW9kdWxlTmFtZX0nIG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGVzID0gYXNzZW1ibHkubWV0YWRhdGEudHlwZXMgPz8ge307XG4gICAgY29uc3QgZnFuSW5mbyA9IHR5cGVzW2Zxbl07XG4gICAgaWYgKCFmcW5JbmZvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFR5cGUgJyR7ZnFufScgbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZxbkluZm87XG4gIH1cblxuICBwcml2YXRlIF90eXBlSW5mb0Zvck1ldGhvZChcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgaW50ZXJmYWNlcz86IHN0cmluZ1tdLFxuICApOiBzcGVjLk1ldGhvZCB7XG4gICAgY29uc3QgdGkgPSB0aGlzLl90cnlUeXBlSW5mb0Zvck1ldGhvZChtZXRob2ROYW1lLCBmcW4sIGludGVyZmFjZXMpO1xuICAgIGlmICghdGkpIHtcbiAgICAgIGNvbnN0IGFkZGVuZHVtID1cbiAgICAgICAgaW50ZXJmYWNlcyAmJiBpbnRlcmZhY2VzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGAgb3IgaW50ZXJmYWNlKHMpICR7aW50ZXJmYWNlcy5qb2luKCcsICcpfWBcbiAgICAgICAgICA6ICcnO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2xhc3MgJHtmcW59JHthZGRlbmR1bX0gZG9lc24ndCBoYXZlIGEgbWV0aG9kICcke21ldGhvZE5hbWV9J2AsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGk7XG4gIH1cblxuICBwcml2YXRlIF90cnlUeXBlSW5mb0Zvck1ldGhvZChcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgY2xhc3NGcW46IHN0cmluZyxcbiAgICBpbnRlcmZhY2VzOiBzdHJpbmdbXSA9IFtdLFxuICApOiBzcGVjLk1ldGhvZCB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCBmcW4gb2YgW2NsYXNzRnFuLCAuLi5pbnRlcmZhY2VzXSkge1xuICAgICAgaWYgKGZxbiA9PT0gd2lyZS5FTVBUWV9PQkpFQ1RfRlFOKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdHlwZWluZm8gPSB0aGlzLl90eXBlSW5mb0ZvckZxbihmcW4pO1xuXG4gICAgICBjb25zdCBtZXRob2RzID1cbiAgICAgICAgKHR5cGVpbmZvIGFzIHNwZWMuQ2xhc3NUeXBlIHwgc3BlYy5JbnRlcmZhY2VUeXBlKS5tZXRob2RzID8/IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IG0gb2YgbWV0aG9kcykge1xuICAgICAgICBpZiAobS5uYW1lID09PSBtZXRob2ROYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcmVjdXJzaW9uIHRvIHBhcmVudCB0eXBlIChpZiBleGlzdHMpXG4gICAgICBjb25zdCBiYXNlcyA9IFtcbiAgICAgICAgKHR5cGVpbmZvIGFzIHNwZWMuQ2xhc3NUeXBlKS5iYXNlLFxuICAgICAgICAuLi4oKHR5cGVpbmZvIGFzIHNwZWMuSW50ZXJmYWNlVHlwZSkuaW50ZXJmYWNlcyA/PyBbXSksXG4gICAgICBdO1xuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIGJhc2VzKSB7XG4gICAgICAgIGlmICghYmFzZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLl90cnlUeXBlSW5mb0Zvck1ldGhvZChtZXRob2ROYW1lLCBiYXNlKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX3RyeVR5cGVJbmZvRm9yUHJvcGVydHkoXG4gICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICBjbGFzc0Zxbjogc3RyaW5nLFxuICAgIGludGVyZmFjZXM6IHN0cmluZ1tdID0gW10sXG4gICk6IHNwZWMuUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgZnFuIG9mIFtjbGFzc0ZxbiwgLi4uaW50ZXJmYWNlc10pIHtcbiAgICAgIGlmIChmcW4gPT09IHdpcmUuRU1QVFlfT0JKRUNUX0ZRTikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHR5cGVJbmZvID0gdGhpcy5fdHlwZUluZm9Gb3JGcW4oZnFuKTtcblxuICAgICAgbGV0IHByb3BlcnRpZXM7XG4gICAgICBsZXQgYmFzZXM7XG5cbiAgICAgIGlmIChzcGVjLmlzQ2xhc3NUeXBlKHR5cGVJbmZvKSkge1xuICAgICAgICBjb25zdCBjbGFzc1R5cGVJbmZvID0gdHlwZUluZm8gYXMgc3BlYy5DbGFzc1R5cGU7XG4gICAgICAgIHByb3BlcnRpZXMgPSBjbGFzc1R5cGVJbmZvLnByb3BlcnRpZXM7XG4gICAgICAgIGJhc2VzID0gY2xhc3NUeXBlSW5mby5iYXNlID8gW2NsYXNzVHlwZUluZm8uYmFzZV0gOiBbXTtcbiAgICAgIH0gZWxzZSBpZiAoc3BlYy5pc0ludGVyZmFjZVR5cGUodHlwZUluZm8pKSB7XG4gICAgICAgIGNvbnN0IGludGVyZmFjZVR5cGVJbmZvID0gdHlwZUluZm8gYXMgc3BlYy5JbnRlcmZhY2VUeXBlO1xuICAgICAgICBwcm9wZXJ0aWVzID0gaW50ZXJmYWNlVHlwZUluZm8ucHJvcGVydGllcztcbiAgICAgICAgYmFzZXMgPSBpbnRlcmZhY2VUeXBlSW5mby5pbnRlcmZhY2VzID8/IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUeXBlIG9mIGtpbmQgJHt0eXBlSW5mby5raW5kfSBkb2VzIG5vdCBoYXZlIHByb3BlcnRpZXNgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHAgb2YgcHJvcGVydGllcyA/PyBbXSkge1xuICAgICAgICBpZiAocC5uYW1lID09PSBwcm9wZXJ0eSkge1xuICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHJlY3Vyc2UgdG8gcGFyZW50IHR5cGUgKGlmIGV4aXN0cylcbiAgICAgIGZvciAoY29uc3QgYmFzZUZxbiBvZiBiYXNlcykge1xuICAgICAgICBjb25zdCByZXQgPSB0aGlzLl90cnlUeXBlSW5mb0ZvclByb3BlcnR5KHByb3BlcnR5LCBiYXNlRnFuKTtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHlwZUluZm9Gb3JQcm9wZXJ0eShcbiAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgIGZxbjogc3RyaW5nLFxuICAgIGludGVyZmFjZXM/OiBzdHJpbmdbXSxcbiAgKTogc3BlYy5Qcm9wZXJ0eSB7XG4gICAgY29uc3QgdHlwZUluZm8gPSB0aGlzLl90cnlUeXBlSW5mb0ZvclByb3BlcnR5KHByb3BlcnR5LCBmcW4sIGludGVyZmFjZXMpO1xuICAgIGlmICghdHlwZUluZm8pIHtcbiAgICAgIGNvbnN0IGFkZGVuZHVtID1cbiAgICAgICAgaW50ZXJmYWNlcyAmJiBpbnRlcmZhY2VzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGAgb3IgaW50ZXJmYWNlKHMpICR7aW50ZXJmYWNlcy5qb2luKCcsICcpfWBcbiAgICAgICAgICA6ICcnO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHlwZSAke2Zxbn0ke2FkZGVuZHVtfSBkb2Vzbid0IGhhdmUgYSBwcm9wZXJ0eSAnJHtwcm9wZXJ0eX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlSW5mbztcbiAgfVxuXG4gIHByaXZhdGUgX3RvU2FuZGJveCh2OiBhbnksIGV4cGVjdGVkVHlwZTogd2lyZS5PcHRpb25hbFZhbHVlT3JWb2lkKTogYW55IHtcbiAgICBjb25zdCBzZXJUeXBlcyA9IHdpcmUuc2VyaWFsaXphdGlvblR5cGUoXG4gICAgICBleHBlY3RlZFR5cGUsXG4gICAgICB0aGlzLl90eXBlSW5mb0ZvckZxbi5iaW5kKHRoaXMpLFxuICAgICk7XG4gICAgdGhpcy5fZGVidWcoJ3RvU2FuZGJveCcsIHYsIEpTT04uc3RyaW5naWZ5KHNlclR5cGVzKSk7XG5cbiAgICBjb25zdCBob3N0OiB3aXJlLlNlcmlhbGl6ZXJIb3N0ID0ge1xuICAgICAgb2JqZWN0czogdGhpcy5vYmplY3RzLFxuICAgICAgZGVidWc6IHRoaXMuX2RlYnVnLmJpbmQodGhpcyksXG4gICAgICBmaW5kU3ltYm9sOiB0aGlzLl9maW5kU3ltYm9sLmJpbmQodGhpcyksXG4gICAgICBsb29rdXBUeXBlOiB0aGlzLl90eXBlSW5mb0ZvckZxbi5iaW5kKHRoaXMpLFxuICAgICAgcmVjdXJzZTogdGhpcy5fdG9TYW5kYm94LmJpbmQodGhpcyksXG4gICAgfTtcblxuICAgIGNvbnN0IGVycm9ycyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCB7IHNlcmlhbGl6YXRpb25DbGFzcywgdHlwZVJlZiB9IG9mIHNlclR5cGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gd2lyZS5TRVJJQUxJWkVSU1tzZXJpYWxpemF0aW9uQ2xhc3NdLmRlc2VyaWFsaXplKFxuICAgICAgICAgIHYsXG4gICAgICAgICAgdHlwZVJlZixcbiAgICAgICAgICBob3N0LFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiBubyB1bmlvbiAoOTklIGNhc2UpLCByZXRocm93IGltbWVkaWF0ZWx5IHRvIHByZXNlcnZlIHN0YWNrIHRyYWNlXG4gICAgICAgIGlmIChzZXJUeXBlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGVycm9ycy5wdXNoKGUubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFZhbHVlIGRpZCBub3QgbWF0Y2ggYW55IHR5cGUgaW4gdW5pb246ICR7ZXJyb3JzLmpvaW4oJywgJyl9YCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZnJvbVNhbmRib3godjogYW55LCB0YXJnZXRUeXBlOiB3aXJlLk9wdGlvbmFsVmFsdWVPclZvaWQpOiBhbnkge1xuICAgIGNvbnN0IHNlclR5cGVzID0gd2lyZS5zZXJpYWxpemF0aW9uVHlwZShcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0aGlzLl90eXBlSW5mb0ZvckZxbi5iaW5kKHRoaXMpLFxuICAgICk7XG4gICAgdGhpcy5fZGVidWcoJ2Zyb21TYW5kYm94JywgdiwgSlNPTi5zdHJpbmdpZnkoc2VyVHlwZXMpKTtcblxuICAgIGNvbnN0IGhvc3Q6IHdpcmUuU2VyaWFsaXplckhvc3QgPSB7XG4gICAgICBvYmplY3RzOiB0aGlzLm9iamVjdHMsXG4gICAgICBkZWJ1ZzogdGhpcy5fZGVidWcuYmluZCh0aGlzKSxcbiAgICAgIGZpbmRTeW1ib2w6IHRoaXMuX2ZpbmRTeW1ib2wuYmluZCh0aGlzKSxcbiAgICAgIGxvb2t1cFR5cGU6IHRoaXMuX3R5cGVJbmZvRm9yRnFuLmJpbmQodGhpcyksXG4gICAgICByZWN1cnNlOiB0aGlzLl9mcm9tU2FuZGJveC5iaW5kKHRoaXMpLFxuICAgIH07XG5cbiAgICBjb25zdCBlcnJvcnMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgeyBzZXJpYWxpemF0aW9uQ2xhc3MsIHR5cGVSZWYgfSBvZiBzZXJUeXBlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHdpcmUuU0VSSUFMSVpFUlNbc2VyaWFsaXphdGlvbkNsYXNzXS5zZXJpYWxpemUodiwgdHlwZVJlZiwgaG9zdCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIG5vIHVuaW9uICg5OSUgY2FzZSksIHJldGhyb3cgaW1tZWRpYXRlbHkgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VcbiAgICAgICAgaWYgKHNlclR5cGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3JzLnB1c2goZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVmFsdWUgZGlkIG5vdCBtYXRjaCBhbnkgdHlwZSBpbiB1bmlvbjogJHtlcnJvcnMuam9pbignLCAnKX1gLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF90b1NhbmRib3hWYWx1ZXMoeHM6IGFueVtdLCBwYXJhbWV0ZXJzPzogc3BlYy5QYXJhbWV0ZXJbXSkge1xuICAgIHJldHVybiB0aGlzLl9ib3hVbmJveFBhcmFtZXRlcnMoeHMsIHBhcmFtZXRlcnMsIHRoaXMuX3RvU2FuZGJveC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Zyb21TYW5kYm94VmFsdWVzKHhzOiBhbnlbXSwgcGFyYW1ldGVycz86IHNwZWMuUGFyYW1ldGVyW10pIHtcbiAgICByZXR1cm4gdGhpcy5fYm94VW5ib3hQYXJhbWV0ZXJzKFxuICAgICAgeHMsXG4gICAgICBwYXJhbWV0ZXJzLFxuICAgICAgdGhpcy5fZnJvbVNhbmRib3guYmluZCh0aGlzKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfYm94VW5ib3hQYXJhbWV0ZXJzKFxuICAgIHhzOiBhbnlbXSxcbiAgICBwYXJhbWV0ZXJzOiBzcGVjLlBhcmFtZXRlcltdIHwgdW5kZWZpbmVkLFxuICAgIGJveFVuYm94OiAoeDogYW55LCB0OiB3aXJlLk9wdGlvbmFsVmFsdWVPclZvaWQpID0+IGFueSxcbiAgKSB7XG4gICAgcGFyYW1ldGVycyA9IFsuLi4ocGFyYW1ldGVycyA/PyBbXSldO1xuICAgIGNvbnN0IHZhcmlhZGljID1cbiAgICAgIHBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiAhIXBhcmFtZXRlcnNbcGFyYW1ldGVycy5sZW5ndGggLSAxXS52YXJpYWRpYztcbiAgICAvLyBSZXBlYXQgdGhlIGxhc3QgKHZhcmlhZGljKSB0eXBlIHRvIG1hdGNoIHRoZSBudW1iZXIgb2YgYWN0dWFsIGFyZ3VtZW50c1xuICAgIHdoaWxlICh2YXJpYWRpYyAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA8IHhzLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVycy5wdXNoKHBhcmFtZXRlcnNbcGFyYW1ldGVycy5sZW5ndGggLSAxXSk7XG4gICAgfVxuICAgIGlmICh4cy5sZW5ndGggPiBwYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQXJndW1lbnQgbGlzdCAoJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB4cyxcbiAgICAgICAgKX0pIG5vdCBzYW1lIHNpemUgYXMgZXhwZWN0ZWQgYXJndW1lbnQgbGlzdCAobGVuZ3RoICR7XG4gICAgICAgICAgcGFyYW1ldGVycy5sZW5ndGhcbiAgICAgICAgfSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHhzLm1hcCgoeCwgaSkgPT4gYm94VW5ib3goeCwgcGFyYW1ldGVycyFbaV0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RlYnVnKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMudHJhY2VFbmFibGVkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbQGpzaWkva2VybmVsXScsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoYXQgYGZuYCBpcyBjYWxsZWQgYW5kIGRlZmVuZHMgYWdhaW5zdCBiZWdpbm5pbmcgdG8gaW52b2tlXG4gICAqIGFzeW5jIG1ldGhvZHMgdW50aWwgZm4gZmluaXNoZXMgKHN1Y2Nlc3NmdWxseSBvciBub3QpLlxuICAgKi9cbiAgcHJpdmF0ZSBfZW5zdXJlU3luYzxUPihkZXNjOiBzdHJpbmcsIGZuOiAoKSA9PiBUKTogVCB7XG4gICAgdGhpcy5zeW5jSW5Qcm9ncmVzcyA9IGRlc2M7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkZWxldGUgdGhpcy5zeW5jSW5Qcm9ncmVzcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9maW5kUHJvcGVydHlUYXJnZXQob2JqOiBhbnksIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBzdXBlclByb3AgPSB0aGlzLl9nZXRTdXBlclByb3BlcnR5TmFtZShwcm9wZXJ0eSk7XG4gICAgaWYgKHN1cGVyUHJvcCBpbiBvYmopIHtcbiAgICAgIHJldHVybiBzdXBlclByb3A7XG4gICAgfVxuICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgfVxuXG4gIC8vXG4gIC8vIHR5cGUgaW5mb3JtYXRpb25cbiAgLy9cblxuICBwcml2YXRlIF9tYWtlY2JpZCgpIHtcbiAgICByZXR1cm4gYGpzaWk6OmNhbGxiYWNrOjoke3RoaXMubmV4dGlkKyt9YDtcbiAgfVxuXG4gIHByaXZhdGUgX21ha2VwcmlkKCkge1xuICAgIHJldHVybiBganNpaTo6cHJvbWlzZTo6JHt0aGlzLm5leHRpZCsrfWA7XG4gIH1cblxuICBwcml2YXRlIF93cmFwU2FuZGJveENvZGU8VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhcmJpdHJhcnkgY29kZSBpbiBhIFZNIHNhbmRib3guXG4gICAqXG4gICAqIEBwYXJhbSBjb2RlICAgICAgIEphdmFTY3JpcHQgY29kZSB0byBiZSBleGVjdXRlZCBpbiB0aGUgVk1cbiAgICogQHBhcmFtIHNhbmRib3ggICAgYSBWTSBjb250ZXh0IHRvIHVzZSBmb3IgcnVubmluZyB0aGUgY29kZVxuICAgKiBAcGFyYW0gc291cmNlTWFwcyBzb3VyY2UgbWFwcyB0byBiZSB1c2VkIGluIGNhc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93blxuICAgKiBAcGFyYW0gZmlsZW5hbWUgICB0aGUgZmlsZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGV4ZWN1dGVkIGNvZGVcbiAgICpcbiAgICogQHJldHVybnMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBjb2RlXG4gICAqL1xuICBwcml2YXRlIF9leGVjdXRlKGNvZGU6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHNjcmlwdCA9IG5ldyB2bS5TY3JpcHQoY29kZSwgeyBmaWxlbmFtZSB9KTtcbiAgICByZXR1cm4gc2NyaXB0LnJ1bkluQ29udGV4dCh0aGlzLnNhbmRib3gsIHsgZGlzcGxheUVycm9yczogdHJ1ZSB9KTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2FsbGJhY2sge1xuICBvYmpyZWY6IGFwaS5PYmpSZWY7XG4gIG92ZXJyaWRlOiBhcGkuTWV0aG9kT3ZlcnJpZGU7XG4gIGFyZ3M6IGFueVtdO1xuICBleHBlY3RlZFJldHVyblR5cGU6IHdpcmUuT3B0aW9uYWxWYWx1ZU9yVm9pZDtcblxuICAvLyBjb21wbGV0aW9uIGNhbGxiYWNrc1xuICBzdWNjZWVkOiAoLi4uYXJnczogYW55W10pID0+IGFueTtcbiAgZmFpbDogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG59XG5cbmludGVyZmFjZSBBc3luY0ludm9jYXRpb24ge1xuICBtZXRob2Q6IHNwZWMuTWV0aG9kO1xuICBwcm9taXNlOiBQcm9taXNlPGFueT47XG59XG5cbmNsYXNzIEFzc2VtYmx5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YTogc3BlYy5Bc3NlbWJseSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2xvc3VyZTogYW55LFxuICApIHt9XG59XG4iXX0=
|
|
904
|
+
//# sourceMappingURL=kernel.js.map
|
package/lib/objects.js
CHANGED
|
@@ -24,8 +24,7 @@ const JSII_SYMBOL = Symbol.for('__jsii__');
|
|
|
24
24
|
* information.
|
|
25
25
|
*/
|
|
26
26
|
function jsiiTypeFqn(obj) {
|
|
27
|
-
|
|
28
|
-
return (_a = obj.constructor[JSII_SYMBOL]) === null || _a === void 0 ? void 0 : _a.fqn;
|
|
27
|
+
return obj.constructor[JSII_SYMBOL]?.fqn;
|
|
29
28
|
}
|
|
30
29
|
exports.jsiiTypeFqn = jsiiTypeFqn;
|
|
31
30
|
/**
|
|
@@ -99,7 +98,6 @@ class ObjectTable {
|
|
|
99
98
|
* Return the existing registration if available.
|
|
100
99
|
*/
|
|
101
100
|
registerObject(obj, fqn, interfaces) {
|
|
102
|
-
var _a;
|
|
103
101
|
if (fqn === undefined) {
|
|
104
102
|
throw new Error('FQN cannot be undefined');
|
|
105
103
|
}
|
|
@@ -107,7 +105,7 @@ class ObjectTable {
|
|
|
107
105
|
if (existingRef) {
|
|
108
106
|
if (interfaces) {
|
|
109
107
|
const allIfaces = new Set(interfaces);
|
|
110
|
-
for (const iface of
|
|
108
|
+
for (const iface of existingRef[api.TOKEN_INTERFACES] ?? []) {
|
|
111
109
|
allIfaces.add(iface);
|
|
112
110
|
}
|
|
113
111
|
// Note - obj[INTERFACES_SYMBOL] should already have been declared as a
|
|
@@ -133,7 +131,6 @@ class ObjectTable {
|
|
|
133
131
|
* Find the object and registered type for the given ObjRef
|
|
134
132
|
*/
|
|
135
133
|
findObject(objref) {
|
|
136
|
-
var _a;
|
|
137
134
|
if (typeof objref !== 'object' || !(api.TOKEN_REF in objref)) {
|
|
138
135
|
throw new Error(`Malformed object reference: ${JSON.stringify(objref)}`);
|
|
139
136
|
}
|
|
@@ -153,7 +150,7 @@ class ObjectTable {
|
|
|
153
150
|
return {
|
|
154
151
|
...obj,
|
|
155
152
|
interfaces: [
|
|
156
|
-
...(
|
|
153
|
+
...(obj.interfaces ?? []),
|
|
157
154
|
// We append at the end so "registered" interface information has
|
|
158
155
|
// precedence over client-declared ones.
|
|
159
156
|
...additionalInterfaces,
|
|
@@ -235,4 +232,4 @@ class InterfaceCollection {
|
|
|
235
232
|
return this.interfaces[Symbol.iterator]();
|
|
236
233
|
}
|
|
237
234
|
}
|
|
238
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vYmplY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUVuQyw2QkFBNkI7QUFDN0IsbURBQW1EO0FBRW5EOztHQUVHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXJEOztHQUVHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBRTNEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxTQUFnQixXQUFXLENBQUMsR0FBUTs7SUFDbEMsYUFBTyxHQUFHLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQywwQ0FBRSxHQUFHLENBQUM7QUFDM0MsQ0FBQztBQUZELGtDQUVDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxHQUFZO0lBQzFDLHFDQUFxQztJQUNyQyxJQUFLLEdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRTtRQUM5QixPQUFPO1lBQ0wsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUcsR0FBcUIsQ0FBQyxZQUFZLENBQUM7WUFDckQsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRyxHQUFxQixDQUFDLGFBQWEsQ0FBQztTQUM5RCxDQUFDO0tBQ0g7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBVkQsMENBVUM7QUFPRCxTQUFTLFNBQVMsQ0FBQyxHQUFZLEVBQUUsS0FBYSxFQUFFLFVBQXFCO0lBQ25FLE1BQU0sWUFBWSxHQUFzRDtRQUN0RSw0RUFBNEU7UUFDNUUsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSxnQ0FBZ0M7UUFDaEMsVUFBVSxFQUFFLEtBQUs7UUFDakIseUVBQXlFO1FB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QUssQ0FBQyxDQUFDO2FBQzlCO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsR0FBVztRQUNqQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQ2IsdUNBQXVDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUN4RSxDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRTtZQUNsQixPQUFPO1NBQ1I7UUFDRCxLQUFLLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUU7WUFDakMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDOUIsU0FBUzthQUNWO1lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFDNUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc3BlYyBmcm9tICdAanNpaS9zcGVjJztcblxuaW1wb3J0ICogYXMgYXBpIGZyb20gJy4vYXBpJztcbmltcG9ydCB7IEVNUFRZX09CSkVDVF9GUU4gfSBmcm9tICcuL3NlcmlhbGl6YXRpb24nO1xuXG4vKipcbiAqIFN5bWJvbCB1bmRlciB3aGljaCB3ZSBzdG9yZSB0aGUgeyB0eXBlIC0+IG9iamlkIH0gbWFwIG9uIG9iamVjdCBpbnN0YW5jZXNcbiAqL1xuY29uc3QgT0JKSURfU1lNQk9MID0gU3ltYm9sLmZvcignJF9fanNpaV9fb2JqaWRfXyQnKTtcblxuLyoqXG4gKiBTeW1ib2wgdW5kZXIgd2hpY2ggd2Ugc3RvcmUgdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgaW5zdGFuY2VzXG4gKi9cbmNvbnN0IElGQUNFU19TWU1CT0wgPSBTeW1ib2wuZm9yKCckX19qc2lpX19pbnRlcmZhY2VzX18kJyk7XG5cbi8qKlxuICogU3ltYm9sIHdlIHVzZSB0byB0YWcgdGhlIGNvbnN0cnVjdG9yIG9mIGEgSlNJSSBjbGFzc1xuICovXG5jb25zdCBKU0lJX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ19fanNpaV9fJyk7XG5cbi8qKlxuICogR2V0IHRoZSBKU0lJIGZxbiBmb3IgYW4gb2JqZWN0IChpZiBhdmFpbGFibGUpXG4gKlxuICogVGhpcyB3aWxsIHJldHVybiBzb21ldGhpbmcgaWYgdGhlIG9iamVjdCB3YXMgY29uc3RydWN0ZWQgZnJvbSBhIEpTSUktZW5hYmxlZFxuICogY2xhc3MvY29uc3RydWN0b3IsIG9yIGlmIGEgbGl0ZXJhbCBvYmplY3Qgd2FzIGFubm90YXRlZCB3aXRoIHR5cGVcbiAqIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNpaVR5cGVGcW4ob2JqOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gb2JqLmNvbnN0cnVjdG9yW0pTSUlfU1lNQk9MXT8uZnFuO1xufVxuXG4vKipcbiAqIElmIHRoaXMgb2JqZWN0IHdhcyBwcmV2aW91c2x5IHNlcmlhbGl6ZWQgdW5kZXIgYSBnaXZlbiByZWZlcmVuY2UsIHJldHVybiB0aGUgc2FtZSByZWZlcmVuY2VcbiAqXG4gKiBUaGlzIGlzIHRvIHJldGFpbiBvYmplY3QgaWRlbnRpdHkgYWNyb3NzIGludm9jYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0UmVmZXJlbmNlKG9iajogdW5rbm93bik6IGFwaS5PYmpSZWYgfCB1bmRlZmluZWQge1xuICAvLyBJZiB0aGlzIG9iamVjdCBhcyBhbHJlYWR5IHJldHVybmVkXG4gIGlmICgob2JqIGFzIGFueSlbT0JKSURfU1lNQk9MXSkge1xuICAgIHJldHVybiB7XG4gICAgICBbYXBpLlRPS0VOX1JFRl06IChvYmogYXMgTWFuYWdlZE9iamVjdClbT0JKSURfU1lNQk9MXSxcbiAgICAgIFthcGkuVE9LRU5fSU5URVJGQUNFU106IChvYmogYXMgTWFuYWdlZE9iamVjdClbSUZBQ0VTX1NZTUJPTF0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTWFuYWdlZE9iamVjdCA9IHtcbiAgW09CSklEX1NZTUJPTF06IHN0cmluZztcbiAgW0lGQUNFU19TWU1CT0xdPzogc3RyaW5nW107XG59O1xuXG5mdW5jdGlvbiB0YWdPYmplY3Qob2JqOiB1bmtub3duLCBvYmppZDogc3RyaW5nLCBpbnRlcmZhY2VzPzogc3RyaW5nW10pIHtcbiAgY29uc3QgcHJpdmF0ZUZpZWxkOiBPbWl0PFByb3BlcnR5RGVzY3JpcHRvciwgJ3ZhbHVlJyB8ICdnZXQnIHwgJ3NldCc+ID0ge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgZmllbGQgZG9lcyBub3Qgc2hvdyBpbiBgSlNPTi5zdHJpbmdpZnlgIG91dHB1dHMsIGFuZCBpcyBub3RcbiAgICAvLyBjb3BpZWQgYnkgc3BsYXQgZXhwcmVzc2lvbnMgKGB7Li4ub2JqfWApLCBhcyB0aGlzIHdvdWxkIGJlIHByb2JsZW1hdGljLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzE3ODc2IGZvciBhbiBleGFtcGxlIG9mIHRoZVxuICAgIC8vIGNvbnNlcXVlbmNlcyB0aGlzIGNvdWxkIGhhdmUuXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgLy8gUHJvYmFibHkgbm90IG5lY2Vzc2FyeSwgYnV0IGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZSByZS1jb25maWd1cmVkIChpdFxuICAgIC8vIHdvdWxkIGJlIGdvb2QgdG8gbWFrZSB0aGlzIGBmYWxzZWAgaW4gdGhlIGZ1dHVyZSwgYnV0IG1pZ2h0IGNhdXNlIHdlaXJkXG4gICAgLy8gYnVncywgc28gbm90IGRvaW5nIGl0IG5vdy4uLilcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gIH07XG5cbiAgLy8gTG9nIGEgd2FybmluZyBpbiBjYXNlIHdlIGFyZSByZS10YWdnaW5nIHRoaXMgdmFsdWUsIHNvIHdlIGNhbiBob3BlZnVsbHlcbiAgLy8gZGlzY292ZXIgYWJvdXQgdGhlIGJ1Z3Mgd2UnZCBoYXZlIGlmIHdlIGRpZCBub3QgbWFrZSBpdCBjb25maWd1cmFibGUgbm9yXG4gIC8vIHdyaXRhYmxlLlxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgT0JKSURfU1lNQk9MKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgW2pzaWkva2VybmVsXSBXQVJOSU5HOiBvYmplY3QgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgb2JqIGFzIGFueSxcbiAgICAgICl9IHdhcyBhbHJlYWR5IHRhZ2dlZCBhcyAkeyhvYmogYXMgYW55KVtPQkpJRF9TWU1CT0xdfSFgLFxuICAgICk7XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBPQkpJRF9TWU1CT0wsIHsgLi4ucHJpdmF0ZUZpZWxkLCB2YWx1ZTogb2JqaWQgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIElGQUNFU19TWU1CT0wsIHtcbiAgICAuLi5wcml2YXRlRmllbGQsXG4gICAgdmFsdWU6IGludGVyZmFjZXMsXG4gIH0pO1xufVxuXG4vKipcbiAqIFNldCB0aGUgSlNJSSBGUU4gZm9yIGNsYXNzZXMgcHJvZHVjZWQgYnkgYSBnaXZlbiBjb25zdHJ1Y3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFnSnNpaUNvbnN0cnVjdG9yKGNvbnN0cnVjdG9yOiBhbnksIGZxbjogc3RyaW5nKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25zdHJ1Y3RvciwgSlNJSV9TWU1CT0wsIHtcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogeyBmcW4gfSxcbiAgfSk7XG59XG5cbi8qKlxuICogVGFibGUgb2YgSlNJSSBvYmplY3RzXG4gKlxuICogVGhlcmUgY2FuIGJlIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgb2JqZWN0LCBlYWNoIHVuZGVyIGEgZGlmZmVyZW50IHJlcXVlc3RlZFxuICogdHlwZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9iamVjdFRhYmxlIHtcbiAgcHJpdmF0ZSBvYmplY3RzOiB7IFtvYmppZDogc3RyaW5nXTogUmVnaXN0ZXJlZE9iamVjdCB9ID0ge307XG4gIHByaXZhdGUgbmV4dGlkID0gMTAwMDA7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZVR5cGU6IChmcW46IHN0cmluZykgPT4gc3BlYy5UeXBlLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHRoZSBnaXZlbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdHlwZVxuICAgKlxuICAgKiBSZXR1cm4gdGhlIGV4aXN0aW5nIHJlZ2lzdHJhdGlvbiBpZiBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPYmplY3QoXG4gICAgb2JqOiB1bmtub3duLFxuICAgIGZxbjogc3RyaW5nLFxuICAgIGludGVyZmFjZXM/OiBzdHJpbmdbXSxcbiAgKTogYXBpLk9ialJlZiB7XG4gICAgaWYgKGZxbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZRTiBjYW5ub3QgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdSZWYgPSBvYmplY3RSZWZlcmVuY2Uob2JqKTtcbiAgICBpZiAoZXhpc3RpbmdSZWYpIHtcbiAgICAgIGlmIChpbnRlcmZhY2VzKSB7XG4gICAgICAgIGNvbnN0IGFsbElmYWNlcyA9IG5ldyBTZXQoaW50ZXJmYWNlcyk7XG4gICAgICAgIGZvciAoY29uc3QgaWZhY2Ugb2YgZXhpc3RpbmdSZWZbYXBpLlRPS0VOX0lOVEVSRkFDRVNdID8/IFtdKSB7XG4gICAgICAgICAgYWxsSWZhY2VzLmFkZChpZmFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZSAtIG9ialtJTlRFUkZBQ0VTX1NZTUJPTF0gc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGRlY2xhcmVkIGFzIGFcbiAgICAgICAgLy8gcHJpdmF0ZSBwcm9wZXJ0eSBieSBhIHByZXZpb3VzIGNhbGwgdG8gdGFnT2JqZWN0ICBhdCB0aGlzIHN0YWdlLlxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIElGQUNFU19TWU1CT0wpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBbanNpaS9rZXJuZWxdIFdBUk5JTkc6IHJlZmVyZW5jZWQgb2JqZWN0ICR7XG4gICAgICAgICAgICAgIGV4aXN0aW5nUmVmW2FwaS5UT0tFTl9SRUZdXG4gICAgICAgICAgICB9IGRvZXMgbm90IGhhdmUgdGhlICR7U3RyaW5nKElGQUNFU19TWU1CT0wpfSBwcm9wZXJ0eSFgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9iamVjdHNbZXhpc3RpbmdSZWZbYXBpLlRPS0VOX1JFRl1dLmludGVyZmFjZXMgPVxuICAgICAgICAgIChvYmogYXMgYW55KVtJRkFDRVNfU1lNQk9MXSA9XG4gICAgICAgICAgZXhpc3RpbmdSZWZbYXBpLlRPS0VOX0lOVEVSRkFDRVNdID1cbiAgICAgICAgICBpbnRlcmZhY2VzID1cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUmVkdW5kYW50KEFycmF5LmZyb20oYWxsSWZhY2VzKSwgZnFuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleGlzdGluZ1JlZjtcbiAgICB9XG5cbiAgICBpbnRlcmZhY2VzID0gdGhpcy5yZW1vdmVSZWR1bmRhbnQoaW50ZXJmYWNlcywgZnFuKTtcblxuICAgIGNvbnN0IG9iamlkID0gdGhpcy5tYWtlSWQoZnFuKTtcbiAgICB0aGlzLm9iamVjdHNbb2JqaWRdID0geyBpbnN0YW5jZTogb2JqLCBmcW4sIGludGVyZmFjZXMgfTtcbiAgICB0YWdPYmplY3Qob2JqLCBvYmppZCwgaW50ZXJmYWNlcyk7XG5cbiAgICByZXR1cm4geyBbYXBpLlRPS0VOX1JFRl06IG9iamlkLCBbYXBpLlRPS0VOX0lOVEVSRkFDRVNdOiBpbnRlcmZhY2VzIH07XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgb2JqZWN0IGFuZCByZWdpc3RlcmVkIHR5cGUgZm9yIHRoZSBnaXZlbiBPYmpSZWZcbiAgICovXG4gIHB1YmxpYyBmaW5kT2JqZWN0KG9ianJlZjogYXBpLk9ialJlZik6IFJlZ2lzdGVyZWRPYmplY3Qge1xuICAgIGlmICh0eXBlb2Ygb2JqcmVmICE9PSAnb2JqZWN0JyB8fCAhKGFwaS5UT0tFTl9SRUYgaW4gb2JqcmVmKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYWxmb3JtZWQgb2JqZWN0IHJlZmVyZW5jZTogJHtKU09OLnN0cmluZ2lmeShvYmpyZWYpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IG9iamlkID0gb2JqcmVmW2FwaS5UT0tFTl9SRUZdO1xuICAgIGNvbnN0IG9iaiA9IHRoaXMub2JqZWN0c1tvYmppZF07XG4gICAgaWYgKCFvYmopIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT2JqZWN0ICR7b2JqaWR9IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBcImFkZGl0aW9uYWxcIiBpbnRlcmZhY2VzIGRlY2xhcmVkIG9uIHRoZSBvYmpyZWYsIG1lcmdlIHRoZW1cbiAgICAvLyBpbnRvIHRoZSByZXR1cm5lZCBvYmplY3QuIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IGNsaWVudC1zaWRlIGZvcmNlZFxuICAgIC8vIGRvd24tY2FzdGluZyAoYS5rLmE6IHVuc2FmZSBjYXN0aW5nKS4gV2UgZG8gTk9UIHJlZ2lzdGVyIHRoZSBleHRyYVxuICAgIC8vIGludGVyZmFjZXMgaGVyZSBzbyB0aGF0IGlmIHRoZSBjbGllbnQgcHJvdmlkZWQgYW4gaW50ZXJmYWNlIHRoYXQgaXNcbiAgICAvLyBhY3R1YWxseSBub3QgaW1wbGVtZW50ZWQsIHdlIGFyZW4ndCBcInBvaXNvbmluZ1wiIG91ciBzdGF0ZSB3aXRoIHRoYXRcbiAgICAvLyBpbmNvcnJlY3QgaW5mb3JtYXRpb24uXG4gICAgY29uc3QgYWRkaXRpb25hbEludGVyZmFjZXMgPSBvYmpyZWZbYXBpLlRPS0VOX0lOVEVSRkFDRVNdO1xuICAgIGlmIChhZGRpdGlvbmFsSW50ZXJmYWNlcyAhPSBudWxsICYmIGFkZGl0aW9uYWxJbnRlcmZhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9iaixcbiAgICAgICAgaW50ZXJmYWNlczogW1xuICAgICAgICAgIC4uLihvYmouaW50ZXJmYWNlcyA/PyBbXSksXG4gICAgICAgICAgLy8gV2UgYXBwZW5kIGF0IHRoZSBlbmQgc28gXCJyZWdpc3RlcmVkXCIgaW50ZXJmYWNlIGluZm9ybWF0aW9uIGhhc1xuICAgICAgICAgIC8vIHByZWNlZGVuY2Ugb3ZlciBjbGllbnQtZGVjbGFyZWQgb25lcy5cbiAgICAgICAgICAuLi5hZGRpdGlvbmFsSW50ZXJmYWNlcyxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIHJlZ2lzdHJhdGlvbiB3aXRoIHRoZSBnaXZlbiBvYmpyZWZcbiAgICovXG4gIHB1YmxpYyBkZWxldGVPYmplY3Qob2JqcmVmOiBhcGkuT2JqUmVmKSB7XG4gICAgdGhpcy5maW5kT2JqZWN0KG9ianJlZik7IC8vIG1ha2Ugc3VyZSBvYmplY3QgZXhpc3RzXG4gICAgZGVsZXRlIHRoaXMub2JqZWN0c1tvYmpyZWZbYXBpLlRPS0VOX1JFRl1dO1xuICB9XG5cbiAgcHVibGljIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLm9iamVjdHMpLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZUlkKGZxbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke2Zxbn1AJHt0aGlzLm5leHRpZCsrfWA7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVJlZHVuZGFudChcbiAgICBpbnRlcmZhY2VzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICBmcW46IHN0cmluZyxcbiAgKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGlmICghaW50ZXJmYWNlcyB8fCBpbnRlcmZhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgU2V0KGludGVyZmFjZXMpO1xuICAgIGNvbnN0IGJ1aWx0SW4gPSBuZXcgSW50ZXJmYWNlQ29sbGVjdGlvbih0aGlzLnJlc29sdmVUeXBlKTtcblxuICAgIGlmIChmcW4gIT09IEVNUFRZX09CSkVDVF9GUU4pIHtcbiAgICAgIGJ1aWx0SW4uYWRkRnJvbUNsYXNzKGZxbik7XG4gICAgfVxuICAgIGludGVyZmFjZXMuZm9yRWFjaChidWlsdEluLmFkZEZyb21JbnRlcmZhY2UuYmluZChidWlsdEluKSk7XG5cbiAgICBmb3IgKGNvbnN0IGlmYWNlIG9mIGJ1aWx0SW4pIHtcbiAgICAgIHJlc3VsdC5kZWxldGUoaWZhY2UpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQuc2l6ZSA+IDAgPyBBcnJheS5mcm9tKHJlc3VsdCkuc29ydCgpIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJlZE9iamVjdCB7XG4gIGluc3RhbmNlOiBhbnk7XG4gIGZxbjogc3RyaW5nO1xuICBpbnRlcmZhY2VzPzogc3RyaW5nW107XG59XG5cbmNsYXNzIEludGVyZmFjZUNvbGxlY3Rpb24gaW1wbGVtZW50cyBJdGVyYWJsZTxzdHJpbmc+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcmZhY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZVR5cGU6IChmcW46IHN0cmluZykgPT4gc3BlYy5UeXBlLFxuICApIHt9XG5cbiAgcHVibGljIGFkZEZyb21DbGFzcyhmcW46IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRpID0gdGhpcy5yZXNvbHZlVHlwZShmcW4pO1xuICAgIGlmICghc3BlYy5pc0NsYXNzVHlwZSh0aSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEV4cGVjdGVkIGEgY2xhc3MsIGJ1dCByZWNlaXZlZCAke3NwZWMuZGVzY3JpYmVUeXBlUmVmZXJlbmNlKHRpKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRpLmJhc2UpIHtcbiAgICAgIHRoaXMuYWRkRnJvbUNsYXNzKHRpLmJhc2UpO1xuICAgIH1cbiAgICBpZiAodGkuaW50ZXJmYWNlcykge1xuICAgICAgZm9yIChjb25zdCBpZmFjZSBvZiB0aS5pbnRlcmZhY2VzKSB7XG4gICAgICAgIGlmICh0aGlzLmludGVyZmFjZXMuaGFzKGlmYWNlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJmYWNlcy5hZGQoaWZhY2UpO1xuICAgICAgICB0aGlzLmFkZEZyb21JbnRlcmZhY2UoaWZhY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRGcm9tSW50ZXJmYWNlKGZxbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdGkgPSB0aGlzLnJlc29sdmVUeXBlKGZxbik7XG4gICAgaWYgKCFzcGVjLmlzSW50ZXJmYWNlVHlwZSh0aSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEV4cGVjdGVkIGFuIGludGVyZmFjZSwgYnV0IHJlY2VpdmVkICR7c3BlYy5kZXNjcmliZVR5cGVSZWZlcmVuY2UodGkpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRpLmludGVyZmFjZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpZmFjZSBvZiB0aS5pbnRlcmZhY2VzKSB7XG4gICAgICBpZiAodGhpcy5pbnRlcmZhY2VzLmhhcyhpZmFjZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLmludGVyZmFjZXMuYWRkKGlmYWNlKTtcbiAgICAgIHRoaXMuYWRkRnJvbUludGVyZmFjZShpZmFjZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHJldHVybiB0aGlzLmludGVyZmFjZXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG59XG4iXX0=
|
|
235
|
+
//# sourceMappingURL=objects.js.map
|
package/lib/on-exit.js
CHANGED
|
@@ -29,4 +29,4 @@ function registerIfNeeded() {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
//# sourceMappingURL=
|
|
32
|
+
//# sourceMappingURL=on-exit.js.map
|
package/lib/recording.js
CHANGED
|
@@ -39,7 +39,7 @@ function recordInteraction(kernel, inputOutputLogPath) {
|
|
|
39
39
|
try {
|
|
40
40
|
const ret = old.value.apply(this, args);
|
|
41
41
|
// if this is an async function, wait for the promised value.
|
|
42
|
-
if (typeof
|
|
42
|
+
if (typeof ret?.then === 'function') {
|
|
43
43
|
return new Promise((ok, fail) => {
|
|
44
44
|
return ret
|
|
45
45
|
.then((value) => {
|
|
@@ -70,4 +70,4 @@ function recordInteraction(kernel, inputOutputLogPath) {
|
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
exports.recordInteraction = recordInteraction;
|
|
73
|
-
//# sourceMappingURL=
|
|
73
|
+
//# sourceMappingURL=recording.js.map
|
package/lib/serialization.js
CHANGED
|
@@ -39,7 +39,7 @@ exports.EMPTY_OBJECT_FQN = 'Object';
|
|
|
39
39
|
exports.SYMBOL_WIRE_TYPE = Symbol.for('$jsii$wireType$');
|
|
40
40
|
exports.SERIALIZERS = {
|
|
41
41
|
// ----------------------------------------------------------------------
|
|
42
|
-
["Void" /* Void */]: {
|
|
42
|
+
["Void" /* SerializationClass.Void */]: {
|
|
43
43
|
serialize(value, _type, host) {
|
|
44
44
|
if (value != null) {
|
|
45
45
|
host.debug('Expected void, got', value);
|
|
@@ -54,7 +54,7 @@ exports.SERIALIZERS = {
|
|
|
54
54
|
},
|
|
55
55
|
},
|
|
56
56
|
// ----------------------------------------------------------------------
|
|
57
|
-
["Date" /* Date */]: {
|
|
57
|
+
["Date" /* SerializationClass.Date */]: {
|
|
58
58
|
serialize(value, optionalValue) {
|
|
59
59
|
if (nullAndOk(value, optionalValue)) {
|
|
60
60
|
return undefined;
|
|
@@ -71,14 +71,14 @@ exports.SERIALIZERS = {
|
|
|
71
71
|
if (nullAndOk(value, optionalValue)) {
|
|
72
72
|
return undefined;
|
|
73
73
|
}
|
|
74
|
-
if (!api_1.isWireDate(value)) {
|
|
74
|
+
if (!(0, api_1.isWireDate)(value)) {
|
|
75
75
|
throw new Error(`Expected Date, got ${JSON.stringify(value)}`);
|
|
76
76
|
}
|
|
77
77
|
return deserializeDate(value);
|
|
78
78
|
},
|
|
79
79
|
},
|
|
80
80
|
// ----------------------------------------------------------------------
|
|
81
|
-
["Scalar" /* Scalar */]: {
|
|
81
|
+
["Scalar" /* SerializationClass.Scalar */]: {
|
|
82
82
|
serialize(value, optionalValue) {
|
|
83
83
|
if (nullAndOk(value, optionalValue)) {
|
|
84
84
|
return undefined;
|
|
@@ -113,7 +113,7 @@ exports.SERIALIZERS = {
|
|
|
113
113
|
},
|
|
114
114
|
},
|
|
115
115
|
// ----------------------------------------------------------------------
|
|
116
|
-
["Json" /* Json */]: {
|
|
116
|
+
["Json" /* SerializationClass.Json */]: {
|
|
117
117
|
serialize(value) {
|
|
118
118
|
// Just whatever. Dates will automatically serialize themselves to strings.
|
|
119
119
|
return value;
|
|
@@ -127,8 +127,8 @@ exports.SERIALIZERS = {
|
|
|
127
127
|
// is passed into a JSON transfer point. Indeed, those are also valid JSON! For example, Python "dicts" will be
|
|
128
128
|
// serialized (by the Python runtime) as a $jsii.map (the mapping object). We need to de-serialize that as a
|
|
129
129
|
// Map<string, JSON> in order to obtain the correct output behavior here!
|
|
130
|
-
if (api_1.isWireMap(value)) {
|
|
131
|
-
return exports.SERIALIZERS["Map" /* Map */].deserialize(value, {
|
|
130
|
+
if ((0, api_1.isWireMap)(value)) {
|
|
131
|
+
return exports.SERIALIZERS["Map" /* SerializationClass.Map */].deserialize(value, {
|
|
132
132
|
optional: false,
|
|
133
133
|
type: {
|
|
134
134
|
collection: {
|
|
@@ -156,7 +156,7 @@ exports.SERIALIZERS = {
|
|
|
156
156
|
},
|
|
157
157
|
},
|
|
158
158
|
// ----------------------------------------------------------------------
|
|
159
|
-
["Enum" /* Enum */]: {
|
|
159
|
+
["Enum" /* SerializationClass.Enum */]: {
|
|
160
160
|
serialize(value, optionalValue, host) {
|
|
161
161
|
if (nullAndOk(value, optionalValue)) {
|
|
162
162
|
return undefined;
|
|
@@ -180,14 +180,14 @@ exports.SERIALIZERS = {
|
|
|
180
180
|
if (nullAndOk(value, optionalValue)) {
|
|
181
181
|
return undefined;
|
|
182
182
|
}
|
|
183
|
-
if (!api_1.isWireEnum(value)) {
|
|
183
|
+
if (!(0, api_1.isWireEnum)(value)) {
|
|
184
184
|
throw new Error(`Expected enum value, got ${JSON.stringify(value)}`);
|
|
185
185
|
}
|
|
186
186
|
return deserializeEnum(value, host.findSymbol);
|
|
187
187
|
},
|
|
188
188
|
},
|
|
189
189
|
// ----------------------------------------------------------------------
|
|
190
|
-
["Array" /* Array */]: {
|
|
190
|
+
["Array" /* SerializationClass.Array */]: {
|
|
191
191
|
serialize(value, optionalValue, host) {
|
|
192
192
|
if (nullAndOk(value, optionalValue)) {
|
|
193
193
|
return undefined;
|
|
@@ -216,7 +216,7 @@ exports.SERIALIZERS = {
|
|
|
216
216
|
},
|
|
217
217
|
},
|
|
218
218
|
// ----------------------------------------------------------------------
|
|
219
|
-
["Map" /* Map */]: {
|
|
219
|
+
["Map" /* SerializationClass.Map */]: {
|
|
220
220
|
serialize(value, optionalValue, host) {
|
|
221
221
|
if (nullAndOk(value, optionalValue)) {
|
|
222
222
|
return undefined;
|
|
@@ -237,7 +237,7 @@ exports.SERIALIZERS = {
|
|
|
237
237
|
throw new Error('Encountered unexpected `void` type');
|
|
238
238
|
}
|
|
239
239
|
const mapType = optionalValue.type;
|
|
240
|
-
if (!api_1.isWireMap(value)) {
|
|
240
|
+
if (!(0, api_1.isWireMap)(value)) {
|
|
241
241
|
// Compatibility mode with older versions that didn't wrap in [TOKEN_MAP]
|
|
242
242
|
return mapValues(value, (v) => host.recurse(v, { type: mapType.collection.elementtype }));
|
|
243
243
|
}
|
|
@@ -252,7 +252,7 @@ exports.SERIALIZERS = {
|
|
|
252
252
|
},
|
|
253
253
|
},
|
|
254
254
|
// ----------------------------------------------------------------------
|
|
255
|
-
["Struct" /* Struct */]: {
|
|
255
|
+
["Struct" /* SerializationClass.Struct */]: {
|
|
256
256
|
serialize(value, optionalValue, host) {
|
|
257
257
|
if (nullAndOk(value, optionalValue)) {
|
|
258
258
|
return undefined;
|
|
@@ -283,7 +283,7 @@ exports.SERIALIZERS = {
|
|
|
283
283
|
]);
|
|
284
284
|
},
|
|
285
285
|
deserialize(value, optionalValue, host) {
|
|
286
|
-
if (typeof value === 'object' && Object.keys(value
|
|
286
|
+
if (typeof value === 'object' && Object.keys(value ?? {}).length === 0) {
|
|
287
287
|
// Treat empty structs as `undefined` (see https://github.com/aws/jsii/issues/411)
|
|
288
288
|
value = undefined;
|
|
289
289
|
}
|
|
@@ -304,7 +304,7 @@ exports.SERIALIZERS = {
|
|
|
304
304
|
// Similarly to serialization, we might be getting a reference type where we're
|
|
305
305
|
// expecting a value type. Accept this for now (but also validate that object
|
|
306
306
|
// for presence of the right properties).
|
|
307
|
-
if (api_1.isObjRef(value)) {
|
|
307
|
+
if ((0, api_1.isObjRef)(value)) {
|
|
308
308
|
host.debug('Expected value type but got reference type, accepting for now (awslabs/jsii#400)');
|
|
309
309
|
// Return same INSTANCE (shouldn't matter but we don't know for sure that it doesn't)
|
|
310
310
|
return validateRequiredProps(host.objects.findObject(value).instance, namedType.fqn, props);
|
|
@@ -331,9 +331,8 @@ exports.SERIALIZERS = {
|
|
|
331
331
|
},
|
|
332
332
|
},
|
|
333
333
|
// ----------------------------------------------------------------------
|
|
334
|
-
["RefType" /* ReferenceType */]: {
|
|
334
|
+
["RefType" /* SerializationClass.ReferenceType */]: {
|
|
335
335
|
serialize(value, optionalValue, host) {
|
|
336
|
-
var _a;
|
|
337
336
|
if (nullAndOk(value, optionalValue)) {
|
|
338
337
|
return undefined;
|
|
339
338
|
}
|
|
@@ -347,7 +346,8 @@ exports.SERIALIZERS = {
|
|
|
347
346
|
const interfaces = spec.isInterfaceType(expectedType)
|
|
348
347
|
? [expectedType.fqn]
|
|
349
348
|
: undefined;
|
|
350
|
-
const jsiiType = (
|
|
349
|
+
const jsiiType = (0, objects_1.jsiiTypeFqn)(value) ??
|
|
350
|
+
(spec.isClassType(expectedType) ? expectedType.fqn : exports.EMPTY_OBJECT_FQN);
|
|
351
351
|
return host.objects.registerObject(value, jsiiType, interfaces);
|
|
352
352
|
},
|
|
353
353
|
deserialize(value, optionalValue, host) {
|
|
@@ -359,7 +359,7 @@ exports.SERIALIZERS = {
|
|
|
359
359
|
}
|
|
360
360
|
// The only way to pass a by-ref object is to have created it
|
|
361
361
|
// previously inside JSII kernel, so it must have an objref already.
|
|
362
|
-
if (!api_1.isObjRef(value)) {
|
|
362
|
+
if (!(0, api_1.isObjRef)(value)) {
|
|
363
363
|
throw new Error(`Expected object reference, got ${JSON.stringify(value)}`);
|
|
364
364
|
}
|
|
365
365
|
const { instance, fqn } = host.objects.findObject(value);
|
|
@@ -380,9 +380,8 @@ exports.SERIALIZERS = {
|
|
|
380
380
|
},
|
|
381
381
|
},
|
|
382
382
|
// ----------------------------------------------------------------------
|
|
383
|
-
["Any" /* Any */]: {
|
|
383
|
+
["Any" /* SerializationClass.Any */]: {
|
|
384
384
|
serialize(value, _type, host) {
|
|
385
|
-
var _a;
|
|
386
385
|
if (value == null) {
|
|
387
386
|
return undefined;
|
|
388
387
|
}
|
|
@@ -405,7 +404,7 @@ exports.SERIALIZERS = {
|
|
|
405
404
|
}
|
|
406
405
|
if (exports.SYMBOL_WIRE_TYPE in value &&
|
|
407
406
|
value[exports.SYMBOL_WIRE_TYPE] === api_1.TOKEN_MAP) {
|
|
408
|
-
return exports.SERIALIZERS["Map" /* Map */].serialize(value, {
|
|
407
|
+
return exports.SERIALIZERS["Map" /* SerializationClass.Map */].serialize(value, {
|
|
409
408
|
type: {
|
|
410
409
|
collection: {
|
|
411
410
|
kind: spec.CollectionKind.Map,
|
|
@@ -423,13 +422,14 @@ exports.SERIALIZERS = {
|
|
|
423
422
|
// Use a previous reference to maintain object identity. NOTE: this may cause us to return
|
|
424
423
|
// a different type than requested! This is just how it is right now.
|
|
425
424
|
// https://github.com/aws/jsii/issues/399
|
|
426
|
-
const prevRef = objects_1.objectReference(value);
|
|
425
|
+
const prevRef = (0, objects_1.objectReference)(value);
|
|
427
426
|
if (prevRef) {
|
|
428
427
|
return prevRef;
|
|
429
428
|
}
|
|
430
429
|
// If this is or should be a reference type, pass or make the reference
|
|
431
430
|
// (Like regular reftype serialization, but without the type derivation to an interface)
|
|
432
|
-
const jsiiType = (
|
|
431
|
+
const jsiiType = (0, objects_1.jsiiTypeFqn)(value) ??
|
|
432
|
+
(isByReferenceOnly(value) ? exports.EMPTY_OBJECT_FQN : undefined);
|
|
433
433
|
if (jsiiType) {
|
|
434
434
|
return host.objects.registerObject(value, jsiiType);
|
|
435
435
|
}
|
|
@@ -444,7 +444,7 @@ exports.SERIALIZERS = {
|
|
|
444
444
|
if (value == null) {
|
|
445
445
|
return undefined;
|
|
446
446
|
}
|
|
447
|
-
if (api_1.isWireDate(value)) {
|
|
447
|
+
if ((0, api_1.isWireDate)(value)) {
|
|
448
448
|
host.debug('ANY is a Date');
|
|
449
449
|
return deserializeDate(value);
|
|
450
450
|
}
|
|
@@ -456,11 +456,11 @@ exports.SERIALIZERS = {
|
|
|
456
456
|
host.debug('ANY is an Array');
|
|
457
457
|
return value.map((e) => host.recurse(e, { type: spec.CANONICAL_ANY }));
|
|
458
458
|
}
|
|
459
|
-
if (api_1.isWireEnum(value)) {
|
|
459
|
+
if ((0, api_1.isWireEnum)(value)) {
|
|
460
460
|
host.debug('ANY is an Enum');
|
|
461
461
|
return deserializeEnum(value, host.findSymbol);
|
|
462
462
|
}
|
|
463
|
-
if (api_1.isWireMap(value)) {
|
|
463
|
+
if ((0, api_1.isWireMap)(value)) {
|
|
464
464
|
host.debug('ANY is a Map');
|
|
465
465
|
const mapOfAny = {
|
|
466
466
|
collection: {
|
|
@@ -468,19 +468,19 @@ exports.SERIALIZERS = {
|
|
|
468
468
|
elementtype: spec.CANONICAL_ANY,
|
|
469
469
|
},
|
|
470
470
|
};
|
|
471
|
-
return exports.SERIALIZERS["Map" /* Map */].deserialize(value, { type: mapOfAny }, host);
|
|
471
|
+
return exports.SERIALIZERS["Map" /* SerializationClass.Map */].deserialize(value, { type: mapOfAny }, host);
|
|
472
472
|
}
|
|
473
|
-
if (api_1.isObjRef(value)) {
|
|
473
|
+
if ((0, api_1.isObjRef)(value)) {
|
|
474
474
|
host.debug('ANY is a Ref');
|
|
475
475
|
return host.objects.findObject(value).instance;
|
|
476
476
|
}
|
|
477
477
|
// if the value has a struct token, it was serialized by a typed jsii
|
|
478
478
|
// struct, but since the deserialization target is ANY, all we can do is
|
|
479
479
|
// strip the data from $jsii.struct and continue to deserialize as ANY.
|
|
480
|
-
if (api_1.isWireStruct(value)) {
|
|
480
|
+
if ((0, api_1.isWireStruct)(value)) {
|
|
481
481
|
const { fqn, data } = value[api_1.TOKEN_STRUCT];
|
|
482
482
|
host.debug(`ANY is a struct of type ${fqn}`);
|
|
483
|
-
return exports.SERIALIZERS["Struct" /* Struct */].deserialize(data, { type: { fqn } }, host);
|
|
483
|
+
return exports.SERIALIZERS["Struct" /* SerializationClass.Struct */].deserialize(data, { type: { fqn } }, host);
|
|
484
484
|
}
|
|
485
485
|
// At this point again, deserialize by-value.
|
|
486
486
|
host.debug('ANY is a Map');
|
|
@@ -518,20 +518,20 @@ function serializationType(typeRef, lookup) {
|
|
|
518
518
|
throw new Error("Kernel error: expected type information, got 'undefined'");
|
|
519
519
|
}
|
|
520
520
|
if (typeRef === 'void') {
|
|
521
|
-
return [{ serializationClass: "Void" /* Void */, typeRef }];
|
|
521
|
+
return [{ serializationClass: "Void" /* SerializationClass.Void */, typeRef }];
|
|
522
522
|
}
|
|
523
523
|
if (spec.isPrimitiveTypeReference(typeRef.type)) {
|
|
524
524
|
switch (typeRef.type.primitive) {
|
|
525
525
|
case spec.PrimitiveType.Any:
|
|
526
|
-
return [{ serializationClass: "Any" /* Any */, typeRef }];
|
|
526
|
+
return [{ serializationClass: "Any" /* SerializationClass.Any */, typeRef }];
|
|
527
527
|
case spec.PrimitiveType.Date:
|
|
528
|
-
return [{ serializationClass: "Date" /* Date */, typeRef }];
|
|
528
|
+
return [{ serializationClass: "Date" /* SerializationClass.Date */, typeRef }];
|
|
529
529
|
case spec.PrimitiveType.Json:
|
|
530
|
-
return [{ serializationClass: "Json" /* Json */, typeRef }];
|
|
530
|
+
return [{ serializationClass: "Json" /* SerializationClass.Json */, typeRef }];
|
|
531
531
|
case spec.PrimitiveType.Boolean:
|
|
532
532
|
case spec.PrimitiveType.Number:
|
|
533
533
|
case spec.PrimitiveType.String:
|
|
534
|
-
return [{ serializationClass: "Scalar" /* Scalar */, typeRef }];
|
|
534
|
+
return [{ serializationClass: "Scalar" /* SerializationClass.Scalar */, typeRef }];
|
|
535
535
|
}
|
|
536
536
|
throw new Error('Unknown primitive type');
|
|
537
537
|
}
|
|
@@ -539,8 +539,8 @@ function serializationType(typeRef, lookup) {
|
|
|
539
539
|
return [
|
|
540
540
|
{
|
|
541
541
|
serializationClass: typeRef.type.collection.kind === spec.CollectionKind.Array
|
|
542
|
-
? "Array" /* Array */
|
|
543
|
-
: "Map" /* Map */,
|
|
542
|
+
? "Array" /* SerializationClass.Array */
|
|
543
|
+
: "Map" /* SerializationClass.Map */,
|
|
544
544
|
typeRef,
|
|
545
545
|
},
|
|
546
546
|
];
|
|
@@ -558,12 +558,12 @@ function serializationType(typeRef, lookup) {
|
|
|
558
558
|
// The next part of the conversion is lookup-dependent
|
|
559
559
|
const type = lookup(typeRef.type.fqn);
|
|
560
560
|
if (spec.isEnumType(type)) {
|
|
561
|
-
return [{ serializationClass: "Enum" /* Enum */, typeRef }];
|
|
561
|
+
return [{ serializationClass: "Enum" /* SerializationClass.Enum */, typeRef }];
|
|
562
562
|
}
|
|
563
563
|
if (spec.isInterfaceType(type) && type.datatype) {
|
|
564
|
-
return [{ serializationClass: "Struct" /* Struct */, typeRef }];
|
|
564
|
+
return [{ serializationClass: "Struct" /* SerializationClass.Struct */, typeRef }];
|
|
565
565
|
}
|
|
566
|
-
return [{ serializationClass: "RefType" /* ReferenceType */, typeRef }];
|
|
566
|
+
return [{ serializationClass: "RefType" /* SerializationClass.ReferenceType */, typeRef }];
|
|
567
567
|
}
|
|
568
568
|
exports.serializationType = serializationType;
|
|
569
569
|
function nullAndOk(x, type) {
|
|
@@ -607,7 +607,6 @@ function mapValues(value, fn) {
|
|
|
607
607
|
return out;
|
|
608
608
|
}
|
|
609
609
|
function propertiesOf(t, lookup) {
|
|
610
|
-
var _a;
|
|
611
610
|
if (!spec.isClassOrInterfaceType(t)) {
|
|
612
611
|
return {};
|
|
613
612
|
}
|
|
@@ -620,7 +619,7 @@ function propertiesOf(t, lookup) {
|
|
|
620
619
|
if (spec.isClassType(t) && t.base) {
|
|
621
620
|
ret = { ...ret, ...propertiesOf(lookup(t.base), lookup) };
|
|
622
621
|
}
|
|
623
|
-
for (const prop of
|
|
622
|
+
for (const prop of t.properties ?? []) {
|
|
624
623
|
ret[prop.name] = prop;
|
|
625
624
|
}
|
|
626
625
|
return ret;
|
|
@@ -666,16 +665,16 @@ function validateRequiredProps(actualProps, typeName, specProps) {
|
|
|
666
665
|
}
|
|
667
666
|
function compareSerializationClasses(l, r) {
|
|
668
667
|
const order = [
|
|
669
|
-
"Void" /* Void */,
|
|
670
|
-
"Date" /* Date */,
|
|
671
|
-
"Scalar" /* Scalar */,
|
|
672
|
-
"Json" /* Json */,
|
|
673
|
-
"Enum" /* Enum */,
|
|
674
|
-
"Array" /* Array */,
|
|
675
|
-
"Map" /* Map */,
|
|
676
|
-
"Struct" /* Struct */,
|
|
677
|
-
"RefType" /* ReferenceType */,
|
|
678
|
-
"Any" /* Any */,
|
|
668
|
+
"Void" /* SerializationClass.Void */,
|
|
669
|
+
"Date" /* SerializationClass.Date */,
|
|
670
|
+
"Scalar" /* SerializationClass.Scalar */,
|
|
671
|
+
"Json" /* SerializationClass.Json */,
|
|
672
|
+
"Enum" /* SerializationClass.Enum */,
|
|
673
|
+
"Array" /* SerializationClass.Array */,
|
|
674
|
+
"Map" /* SerializationClass.Map */,
|
|
675
|
+
"Struct" /* SerializationClass.Struct */,
|
|
676
|
+
"RefType" /* SerializationClass.ReferenceType */,
|
|
677
|
+
"Any" /* SerializationClass.Any */,
|
|
679
678
|
];
|
|
680
679
|
return order.indexOf(l) - order.indexOf(r);
|
|
681
680
|
}
|
|
@@ -698,9 +697,9 @@ function isByReferenceOnly(obj) {
|
|
|
698
697
|
do {
|
|
699
698
|
for (const prop of Object.getOwnPropertyNames(curr)) {
|
|
700
699
|
const descr = Object.getOwnPropertyDescriptor(curr, prop);
|
|
701
|
-
if (
|
|
702
|
-
|
|
703
|
-
typeof
|
|
700
|
+
if (descr?.get != null ||
|
|
701
|
+
descr?.set != null ||
|
|
702
|
+
typeof descr?.value === 'function') {
|
|
704
703
|
// Property has a dynamic getter, setter or is a constructor/method, so by-ref required!
|
|
705
704
|
return true;
|
|
706
705
|
}
|
|
@@ -709,4 +708,4 @@ function isByReferenceOnly(obj) {
|
|
|
709
708
|
} while (Object.getPrototypeOf((curr = Object.getPrototypeOf(curr))) != null);
|
|
710
709
|
return false;
|
|
711
710
|
}
|
|
712
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7OztBQUVILG1DQUFtQztBQUVuQywrQkFhZTtBQUNmLHVDQUFzRTtBQUV0RSx3QkFBd0I7QUFvQnhCOztHQUVHO0FBQ1UsUUFBQSxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7QUFFNUIsUUFBQSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUEwQ2pELFFBQUEsV0FBVyxHQUFnQztJQUN0RCx5RUFBeUU7SUFDekUsbUJBQXlCLEVBQUU7UUFDekIsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSTtZQUMxQixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDekM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSTtZQUM1QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDekM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0tBQ0Y7SUFFRCx5RUFBeUU7SUFDekUsbUJBQXlCLEVBQUU7UUFDekIsU0FBUyxDQUFDLEtBQUssRUFBRSxhQUFhO1lBQzVCLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsRUFBRTtnQkFDbkMsT0FBTyxTQUFTLENBQUM7YUFDbEI7WUFDRCxJQUFJLGFBQWEsS0FBSyxNQUFNLEVBQUU7Z0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FB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SSxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFELElBQ0UsQ0FBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsR0FBRyxLQUFJLElBQUk7Z0JBQ2xCLENBQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEdBQUcsS0FBSSxJQUFJO2dCQUNsQixRQUFPLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxLQUFLLENBQUEsS0FBSyxVQUFVLEVBQ2xDO2dCQUNBLHdGQUF3RjtnQkFDeEYsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsMkVBQTJFO0tBQzVFLFFBQVEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7SUFFOUUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIYW5kbGluZyBvZiB0eXBlcyBpbiBKU0lJXG4gKlxuICogVHlwZXMgd2lsbCBiZSBzZXJpYWxpemVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRhYmxlOlxuICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICogICAgICAgICAgICAgICAgICAgICAgICAg4pSCIEpBVkFTQ1JJUFQgVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICogICAgICAgICAgICAgICAgICAgICAgICAg4pSCIHVuZGVmaW5lZC9udWxsIOKUgiAgIGRhdGUgICAg4pSCIHNjYWxhciAoKikg4pSCICAgICBhcnJheSAgICAg4pSCIEpTSUktY2xhc3Mgb2JqZWN0IOKUgiBsaXRlcmFsIG9iamVjdCAg4pSCXG4gKiDilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKRcbiAqIOKUgiBERUNMQVJFRCDilIIgdm9pZCAgICAgICDilIIgdW5kZWZpbmVkICAgICAg4pSCIHVuZGVmaW5lZCDilIIgdW5kZWZpbmVkICDilIIgdW5kZWZpbmVkICAgICDilIIgdW5kZWZpbmVkICAgICAgICAg4pSCIHVuZGVmaW5lZCAgICAgICDilIJcbiAqIOKUgiBUWVBFICAgICDilIIgZGF0ZSAgICAgICDilIIgdW5kZWZpbmVkKOKAoCkgICDilIIgeyBkYXRlIH0gIOKUgiAtICAgICAgICAgIOKUgiAtICAgICAgICAgICAgIOKUgiAtICAgICAgICAgICAgICAgICDilIIgLSAgICAgICAgICAgICAgIOKUglxuICog4pSCICAgICAgICAgIOKUgiBzY2FsYXIgKCopIOKUgiB1bmRlZmluZWQo4oCgKSAgIOKUgiAtICAgICAgICAg4pSCIHZhbHVlICAgICAg4pSCIC0gICAgICAgICAgICAg4pSCIC0gICAgICAgICAgICAgICAgIOKUgiAtICAgICAgICAgICAgICAg4pSCXG4gKiDilIIgICAgICAgICAg4pSCIGpzb24gICAgICAg4pSCIHVuZGVmaW5lZCAgICAgIOKUgiBzdHJpbmcgICAg4pSCIHZhbHVlICAgICAg4pSCIGFycmF5L1IoanNvbikg4pSCIC0gICAgICAgICAgICAgICAgIOKUgiBieXZhbHVlL1IoanNvbikg4pSCXG4gKiDilIIgICAgICAgICAg4pSCIGVudW0gICAgICAg4pSCIHVuZGVmaW5lZCjigKApICAg4pSCIC0gICAgICAgICDilIIgeyBlbnVtIH0gICDilIIgLSAgICAgICAgICAgICDilIIgLSAgICAgICAgICAgICAgICAg4pSCIC0gICAgICAgICAgICAgICDilIJcbiAqIOKUgiAgICAgICAgICDilIIgYXJyYXkgb2YgVCDilIIgdW5kZWZpbmVkKOKAoCkgICDilIIgLSAgICAgICAgIOKUgiAtICAgICAgICAgIOKUgiBhcnJheS9SKFQpICAgIOKUgiAtICAgICAgICAgICAgICAgICDilIIgLSAgICAgICAgICAgICAgIOKUglxuICog4pSCICAgICAgICAgIOKUgiBtYXAgb2YgVCAgIOKUgiB1bmRlZmluZWQo4oCgKSAgIOKUgiAtICAgICAgICAg4pSCIC0gICAgICAgICAg4pSCIC0gICAgICAgICAgICAg4pSCIC0gICAgICAgICAgICAgICAgIOKUgiBieXZhbHVlL1IoVCkgICAg4pSCXG4gKiDilIIgICAgICAgICAg4pSCIGludGVyZmFjZSAg4pSCIHVuZGVmaW5lZCjigKApICAg4pSCIC0gICAgICAgICDilIIgLSAgICAgICAgICDilIIgLSAgICAgICAgICAgICDilIIgeyByZWYgfSAgICAgICAgICAg4pSCIHsgcmVmOiBwcm94eSB9ICDilIJcbiAqIOKUgiAgICAgICAgICDilIIgc3RydWN0ICAgICDilIIgdW5kZWZpbmVkKOKAoCkgICDilIIgLSAgICAgICAgIOKUgiAtICAgICAgICAgIOKUgiAtICAgICAgICAgICAgIOKUgiAtICAgICAgICAgICAgICAgICDilIIgYnl2YWx1ZS9SKFRba10pIOKUglxuICog4pSCICAgICAgICAgIOKUgiBjbGFzcyAgICAgIOKUgiB1bmRlZmluZWQo4oCgKSAgIOKUgiAtICAgICAgICAg4pSCIC0gICAgICAgICAg4pSCIC0gICAgICAgICAgICAg4pSCIHsgcmVmIH0gICAgICAgICAgIOKUgiB7IHJlZjogcHJveHkgfSAg4pSCXG4gKiDilIIgICAgICAgICAg4pSCIGFueSAgICAgICAg4pSCIHVuZGVmaW5lZCAgICAgIOKUgiB7IGRhdGUgfSAg4pSCIHZhbHVlICAgICAg4pSCIGFycmF5L1IoYW55KSAg4pSCIHsgcmVmIH0gICAgICAgICAgIOKUgiBieXZhbHVlL1IoYW55KSAg4pSCXG4gKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAqXG4gKiAgLSAoKikgc2NhbGFyIG1lYW5zICdzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuJ1xuICogIC0gKOKAoCkgdGhyb3cgaWYgbm90IG51bGxhYmxlXG4gKiAgLSAvUih0KSByZWN1cnNlIHdpdGggZGVjbGFyZWQgdHlwZSB0XG4gKi9cblxuaW1wb3J0ICogYXMgc3BlYyBmcm9tICdAanNpaS9zcGVjJztcblxuaW1wb3J0IHtcbiAgaXNPYmpSZWYsXG4gIGlzV2lyZURhdGUsXG4gIGlzV2lyZUVudW0sXG4gIGlzV2lyZU1hcCxcbiAgT2JqUmVmLFxuICBUT0tFTl9EQVRFLFxuICBUT0tFTl9FTlVNLFxuICBUT0tFTl9NQVAsXG4gIFdpcmVEYXRlLFxuICBXaXJlRW51bSxcbiAgaXNXaXJlU3RydWN0LFxuICBUT0tFTl9TVFJVQ1QsXG59IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IGpzaWlUeXBlRnFuLCBvYmplY3RSZWZlcmVuY2UsIE9iamVjdFRhYmxlIH0gZnJvbSAnLi9vYmplY3RzJztcblxuaW1wb3J0IHsgYXBpIH0gZnJvbSAnLic7XG5cbi8qKlxuICogQSBzcGVjaWZpYyBzaW5nbGV0b24gdHlwZSB0byBiZSBleHBsaWNpdCBhYm91dCBhIFZvaWQgdHlwZVxuICpcbiAqIEluIHRoZSBzcGVjLCAndm9pZCcgaXMgcmVwcmVzZW50ZWQgYXMgJ3VuZGVmaW5lZCcoKiksIGJ1dCBhbGxvd2luZyB0aGVcbiAqIHZhbHVlICd1bmRlZmluZWQnIGluIGZ1bmN0aW9uIGNhbGxzIGhhcyBsZWFkIHRvIGNvbnN1bWVycyBmYWlsaW5nIHRvIHBhc3NcbiAqIHR5cGUgaW5mb3JtYXRpb24gdGhhdCB0aGV5IGhhZCwganVzdCBiZWNhdXNlIHRoZXkgZGlkbid0IFwiaGF2ZSB0b1wiICh0aGVcbiAqIHBhcmFtZXRlciB3YXMgb3B0aW9uYWwpLlxuICpcbiAqICgqKSBBcyBpbiwgZGVjbGFyYXRpb24gb2YgYSBtZXRob2QgbG9va3MgbGlrZSB7IHJldHVybnM/OiBUeXBlUmVmZXJlbmNlIH1cbiAqIGFuZCB0aGUgYWJzZW5jZSBvZiBhIHR5cGUgbWVhbnMgaXQgcmV0dXJucyAndm9pZCcuXG4gKi9cbmV4cG9ydCB0eXBlIFZvaWQgPSAndm9pZCc7XG5cbi8qKlxuICogQSB0eXBlIGluc3RhbmNlLCBvciBWb2lkXG4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvbmFsVmFsdWVPclZvaWQgPSBzcGVjLk9wdGlvbmFsVmFsdWUgfCBWb2lkO1xuXG4vKipcbiAqIEEgc3BlY2lhbCBGUU4gdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgZW1wdHkgamF2YXNjcmlwdCBvYmplY3RzLlxuICovXG5leHBvcnQgY29uc3QgRU1QVFlfT0JKRUNUX0ZRTiA9ICdPYmplY3QnO1xuXG5leHBvcnQgY29uc3QgU1lNQk9MX1dJUkVfVFlQRSA9IFN5bWJvbC5mb3IoJyRqc2lpJHdpcmVUeXBlJCcpO1xuXG4vKipcbiAqIFRoZSB0eXBlIGtpbmQsIHRoYXQgY29udHJvbHMgaG93IGl0IHdpbGwgYmUgc2VyaWFsaXplZCBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlIHRhYmxlXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIFNlcmlhbGl6YXRpb25DbGFzcyB7XG4gIFZvaWQgPSAnVm9pZCcsXG4gIERhdGUgPSAnRGF0ZScsXG4gIFNjYWxhciA9ICdTY2FsYXInLFxuICBKc29uID0gJ0pzb24nLFxuICBFbnVtID0gJ0VudW0nLFxuICBBcnJheSA9ICdBcnJheScsXG4gIE1hcCA9ICdNYXAnLFxuICBTdHJ1Y3QgPSAnU3RydWN0JyxcbiAgUmVmZXJlbmNlVHlwZSA9ICdSZWZUeXBlJyxcbiAgQW55ID0gJ0FueScsXG59XG5cbnR5cGUgVHlwZUxvb2t1cCA9IChmcW46IHNwZWMuRlFOKSA9PiBzcGVjLlR5cGU7XG50eXBlIFN5bWJvbExvb2t1cCA9IChmcW46IHNwZWMuRlFOKSA9PiBhbnk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplckhvc3Qge1xuICByZWFkb25seSBvYmplY3RzOiBPYmplY3RUYWJsZTtcbiAgZGVidWcoLi4uYXJnczogYW55W10pOiB2b2lkO1xuICBsb29rdXBUeXBlKGZxbjogc3RyaW5nKTogc3BlYy5UeXBlO1xuICByZWN1cnNlKHg6IGFueSwgdHlwZTogT3B0aW9uYWxWYWx1ZU9yVm9pZCk6IGFueTtcbiAgZmluZFN5bWJvbChmcW46IHNwZWMuRlFOKTogYW55O1xufVxuXG5pbnRlcmZhY2UgU2VyaWFsaXplciB7XG4gIHNlcmlhbGl6ZShcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICB0eXBlOiBPcHRpb25hbFZhbHVlT3JWb2lkLFxuICAgIGhvc3Q6IFNlcmlhbGl6ZXJIb3N0LFxuICApOiBhbnk7XG4gIGRlc2VyaWFsaXplKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHR5cGU6IE9wdGlvbmFsVmFsdWVPclZvaWQsXG4gICAgaG9zdDogU2VyaWFsaXplckhvc3QsXG4gICk6IGFueTtcbn1cblxuZXhwb3J0IGNvbnN0IFNFUklBTElaRVJTOiB7IFtrOiBzdHJpbmddOiBTZXJpYWxpemVyIH0gPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5Wb2lkXToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgX3R5cGUsIGhvc3QpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIGhvc3QuZGVidWcoJ0V4cGVjdGVkIHZvaWQsIGdvdCcsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBfdHlwZSwgaG9zdCkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgaG9zdC5kZWJ1ZygnRXhwZWN0ZWQgdm9pZCwgZ290JywgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5EYXRlXToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSk6IFdpcmVEYXRlIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmIChudWxsQW5kT2sodmFsdWUsIG9wdGlvbmFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9uYWxWYWx1ZSA9PT0gJ3ZvaWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5jb3VudGVyZWQgdW5leHBlY3RlZCBgdm9pZGAgdHlwZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBEYXRlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VyaWFsaXplRGF0ZSh2YWx1ZSk7XG4gICAgfSxcblxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlKSB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzV2lyZURhdGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgRGF0ZSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlc2VyaWFsaXplRGF0ZSh2YWx1ZSk7XG4gICAgfSxcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIFtTZXJpYWxpemF0aW9uQ2xhc3MuU2NhbGFyXToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByaW1pdGl2ZVR5cGUgPSBvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5QcmltaXRpdmVUeXBlUmVmZXJlbmNlO1xuXG4gICAgICBpZiAoIWlzU2NhbGFyKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkICR7c3BlYy5kZXNjcmliZVR5cGVSZWZlcmVuY2UoXG4gICAgICAgICAgICBvcHRpb25hbFZhbHVlLnR5cGUsXG4gICAgICAgICAgKX0sIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gcHJpbWl0aXZlVHlwZS5wcmltaXRpdmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFeHBlY3RlZCBhICR7c3BlYy5kZXNjcmliZVR5cGVSZWZlcmVuY2UoXG4gICAgICAgICAgICBvcHRpb25hbFZhbHVlLnR5cGUsXG4gICAgICAgICAgKX0sIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gKCR7dHlwZW9mIHZhbHVlfSlgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByaW1pdGl2ZVR5cGUgPSBvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5QcmltaXRpdmVUeXBlUmVmZXJlbmNlO1xuXG4gICAgICBpZiAoIWlzU2NhbGFyKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIGEgJHtzcGVjLmRlc2NyaWJlVHlwZVJlZmVyZW5jZShcbiAgICAgICAgICAgIG9wdGlvbmFsVmFsdWUudHlwZSxcbiAgICAgICAgICApfSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBwcmltaXRpdmVUeXBlLnByaW1pdGl2ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIGEgJHtzcGVjLmRlc2NyaWJlVHlwZVJlZmVyZW5jZShcbiAgICAgICAgICAgIG9wdGlvbmFsVmFsdWUudHlwZSxcbiAgICAgICAgICApfSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSAoJHt0eXBlb2YgdmFsdWV9KWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5Kc29uXToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSkge1xuICAgICAgLy8gSnVzdCB3aGF0ZXZlci4gRGF0ZXMgd2lsbCBhdXRvbWF0aWNhbGx5IHNlcmlhbGl6ZSB0aGVtc2VsdmVzIHRvIHN0cmluZ3MuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgLy8gLyFcXCBUb3AtbGV2ZWwgXCJudWxsXCIgd2lsbCB0dXJuIHRvIHVuZGVmaW5lZCwgYnV0IGFueSBudWxsIG5lc3RlZCBpbiB0aGUgdmFsdWUgaXMgdmFsaWQgSlNPTiwgc28gaXQnbGwgc3RheSFcbiAgICAgIGlmIChudWxsQW5kT2sodmFsdWUsIG9wdGlvbmFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgbWFwcGluZyBvYmplY3QgY2FuIGFycml2ZSB0aG91Z2ggaGVyZS4gVGhpcyB3b3VsZCBiZSB0aGUgY2FzZSBpZiBhbnl0aGluZyB0aGF0IGlzIHZhbGlkIGludG8gYSBNYXA8c3RyaW5nLCA/PlxuICAgICAgLy8gaXMgcGFzc2VkIGludG8gYSBKU09OIHRyYW5zZmVyIHBvaW50LiBJbmRlZWQsIHRob3NlIGFyZSBhbHNvIHZhbGlkIEpTT04hIEZvciBleGFtcGxlLCBQeXRob24gXCJkaWN0c1wiIHdpbGwgYmVcbiAgICAgIC8vIHNlcmlhbGl6ZWQgKGJ5IHRoZSBQeXRob24gcnVudGltZSkgYXMgYSAkanNpaS5tYXAgKHRoZSBtYXBwaW5nIG9iamVjdCkuIFdlIG5lZWQgdG8gZGUtc2VyaWFsaXplIHRoYXQgYXMgYVxuICAgICAgLy8gTWFwPHN0cmluZywgSlNPTj4gaW4gb3JkZXIgdG8gb2J0YWluIHRoZSBjb3JyZWN0IG91dHB1dCBiZWhhdmlvciBoZXJlIVxuICAgICAgaWYgKGlzV2lyZU1hcCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFNFUklBTElaRVJTW1NlcmlhbGl6YXRpb25DbGFzcy5NYXBdLmRlc2VyaWFsaXplKFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9wdGlvbmFsOiBmYWxzZSxcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjoge1xuICAgICAgICAgICAgICAgIGtpbmQ6IHNwZWMuQ29sbGVjdGlvbktpbmQuTWFwLFxuICAgICAgICAgICAgICAgIGVsZW1lbnR0eXBlOiB7IHByaW1pdGl2ZTogc3BlYy5QcmltaXRpdmVUeXBlLkpzb24gfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBob3N0LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubWFwKG1hcEpzb25WYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXBWYWx1ZXModmFsdWUsIG1hcEpzb25WYWx1ZSk7XG5cbiAgICAgIGZ1bmN0aW9uIG1hcEpzb25WYWx1ZSh0b01hcDogYW55KSB7XG4gICAgICAgIGlmICh0b01hcCA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRvTWFwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBob3N0LnJlY3Vyc2UodG9NYXAsIHtcbiAgICAgICAgICB0eXBlOiB7IHByaW1pdGl2ZTogc3BlYy5QcmltaXRpdmVUeXBlLkpzb24gfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIFtTZXJpYWxpemF0aW9uQ2xhc3MuRW51bV06IHtcbiAgICBzZXJpYWxpemUodmFsdWUsIG9wdGlvbmFsVmFsdWUsIGhvc3QpOiBXaXJlRW51bSB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsVmFsdWUgPT09ICd2b2lkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgYHZvaWRgIHR5cGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGVudW0gdmFsdWUsIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICAgIH1cblxuICAgICAgaG9zdC5kZWJ1ZygnU2VyaWFsaXppbmcgZW51bScpO1xuXG4gICAgICBjb25zdCBlbnVtVHlwZSA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcbiAgICAgIGNvbnN0IGVudW1NYXAgPSBob3N0LmZpbmRTeW1ib2woZW51bVR5cGUuZnFuKTtcbiAgICAgIGNvbnN0IGVudW1FbnRyeSA9IE9iamVjdC5lbnRyaWVzKGVudW1NYXApLmZpbmQoKFssIHZdKSA9PiB2ID09PSB2YWx1ZSk7XG4gICAgICBpZiAoIWVudW1FbnRyeSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGVudHJ5IGluICR7ZW51bVR5cGUuZnFufSBoYXMgdmFsdWUgJHt2YWx1ZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IFtUT0tFTl9FTlVNXTogYCR7ZW51bVR5cGUuZnFufS8ke2VudW1FbnRyeVswXX1gIH07XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc1dpcmVFbnVtKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGVudW0gdmFsdWUsIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlc2VyaWFsaXplRW51bSh2YWx1ZSwgaG9zdC5maW5kU3ltYm9sKTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5BcnJheV06IHtcbiAgICBzZXJpYWxpemUodmFsdWUsIG9wdGlvbmFsVmFsdWUsIGhvc3QpIHtcbiAgICAgIGlmIChudWxsQW5kT2sodmFsdWUsIG9wdGlvbmFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9uYWxWYWx1ZSA9PT0gJ3ZvaWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5jb3VudGVyZWQgdW5leHBlY3RlZCBgdm9pZGAgdHlwZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXJyYXkgdHlwZSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhcnJheVR5cGUgPSBvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5Db2xsZWN0aW9uVHlwZVJlZmVyZW5jZTtcblxuICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoeCkgPT5cbiAgICAgICAgaG9zdC5yZWN1cnNlKHgsIHsgdHlwZTogYXJyYXlUeXBlLmNvbGxlY3Rpb24uZWxlbWVudHR5cGUgfSksXG4gICAgICApO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbmFsVmFsdWUsIGhvc3QpIHtcbiAgICAgIGlmIChudWxsQW5kT2sodmFsdWUsIG9wdGlvbmFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9uYWxWYWx1ZSA9PT0gJ3ZvaWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5jb3VudGVyZWQgdW5leHBlY3RlZCBgdm9pZGAgdHlwZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXJyYXkgdHlwZSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhcnJheVR5cGUgPSBvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5Db2xsZWN0aW9uVHlwZVJlZmVyZW5jZTtcblxuICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoeCkgPT5cbiAgICAgICAgaG9zdC5yZWN1cnNlKHgsIHsgdHlwZTogYXJyYXlUeXBlLmNvbGxlY3Rpb24uZWxlbWVudHR5cGUgfSksXG4gICAgICApO1xuICAgIH0sXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBbU2VyaWFsaXphdGlvbkNsYXNzLk1hcF06IHtcbiAgICBzZXJpYWxpemUodmFsdWUsIG9wdGlvbmFsVmFsdWUsIGhvc3QpIHtcbiAgICAgIGlmIChudWxsQW5kT2sodmFsdWUsIG9wdGlvbmFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9uYWxWYWx1ZSA9PT0gJ3ZvaWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5jb3VudGVyZWQgdW5leHBlY3RlZCBgdm9pZGAgdHlwZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXBUeXBlID0gb3B0aW9uYWxWYWx1ZS50eXBlIGFzIHNwZWMuQ29sbGVjdGlvblR5cGVSZWZlcmVuY2U7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbVE9LRU5fTUFQXTogbWFwVmFsdWVzKHZhbHVlLCAodikgPT5cbiAgICAgICAgICBob3N0LnJlY3Vyc2UodiwgeyB0eXBlOiBtYXBUeXBlLmNvbGxlY3Rpb24uZWxlbWVudHR5cGUgfSksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbmFsVmFsdWUsIGhvc3QpIHtcbiAgICAgIGlmIChudWxsQW5kT2sodmFsdWUsIG9wdGlvbmFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9uYWxWYWx1ZSA9PT0gJ3ZvaWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5jb3VudGVyZWQgdW5leHBlY3RlZCBgdm9pZGAgdHlwZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXBUeXBlID0gb3B0aW9uYWxWYWx1ZS50eXBlIGFzIHNwZWMuQ29sbGVjdGlvblR5cGVSZWZlcmVuY2U7XG4gICAgICBpZiAoIWlzV2lyZU1hcCh2YWx1ZSkpIHtcbiAgICAgICAgLy8gQ29tcGF0aWJpbGl0eSBtb2RlIHdpdGggb2xkZXIgdmVyc2lvbnMgdGhhdCBkaWRuJ3Qgd3JhcCBpbiBbVE9LRU5fTUFQXVxuICAgICAgICByZXR1cm4gbWFwVmFsdWVzKHZhbHVlLCAodikgPT5cbiAgICAgICAgICBob3N0LnJlY3Vyc2UodiwgeyB0eXBlOiBtYXBUeXBlLmNvbGxlY3Rpb24uZWxlbWVudHR5cGUgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBtYXBWYWx1ZXModmFsdWVbVE9LRU5fTUFQXSwgKHYpID0+XG4gICAgICAgIGhvc3QucmVjdXJzZSh2LCB7IHR5cGU6IG1hcFR5cGUuY29sbGVjdGlvbi5lbGVtZW50dHlwZSB9KSxcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBTWU1CT0xfV0lSRV9UWVBFLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogVE9LRU5fTUFQLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIFtTZXJpYWxpemF0aW9uQ2xhc3MuU3RydWN0XToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvYmplY3QsIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAgVGhpcyBpcyB3aGF0IHdlJ2QgbGlrZSB0byBkbywgYnV0IHdlIGNhbid0IGJlY2F1c2UgYXQgbGVhc3QgdGhlIEphdmEgY2xpZW50XG4gICAgICAgIGRvZXMgbm90IHVuZGVyc3RhbmQgYnktdmFsdWUgc2VyaWFsaXplZCBpbnRlcmZhY2UgdHlwZXMsIHNvIHdlJ2xsIGhhdmUgdG9cbiAgICAgICAgc2VyaWFsaXplIGJ5LXJlZmVyZW5jZS4gQWRkaXRpb25hbGx5LCBzZXJpYWxpemluZyBrbm93biBwcm9wZXJ0aWVzIHdvdWxkXG4gICAgICAgIGNhdXNlIHByb2JsZW1zIHdoZW4gdGhlIHJldHVybiB0eXBlIG9mIGEgbWV0aG9kIGlzIGEgVU5JT04gb2Ygc3RydWN0cy5cbiAgICAgICAgU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzQwMFxuXG4gICAgICBjb25zdCBwcm9wcyA9IHByb3BlcnRpZXNPZihuYW1lZFR5cGUpO1xuXG4gICAgICByZXR1cm4gbWFwVmFsdWVzKHZhbHVlLCAodiwga2V5KSA9PiB7XG4gICAgICAgIGlmICghcHJvcHNba2V5XSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IC8vIERvbid0IG1hcCBpZiB1bmtub3duIHByb3BlcnR5XG4gICAgICAgIHJldHVybiBob3N0LnJlY3Vyc2UodiwgcHJvcHNba2V5XS50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgKi9cblxuICAgICAgaG9zdC5kZWJ1ZygnUmV0dXJuaW5nIHZhbHVlIHR5cGUgYnkgcmVmZXJlbmNlJyk7XG4gICAgICByZXR1cm4gaG9zdC5vYmplY3RzLnJlZ2lzdGVyT2JqZWN0KHZhbHVlLCBFTVBUWV9PQkpFQ1RfRlFOLCBbXG4gICAgICAgIChvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UpLmZxbixcbiAgICAgIF0pO1xuICAgIH0sXG4gICAgZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbmFsVmFsdWUsIGhvc3QpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHZhbHVlID8/IHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gVHJlYXQgZW1wdHkgc3RydWN0cyBhcyBgdW5kZWZpbmVkYCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvNDExKVxuICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChudWxsQW5kT2sodmFsdWUsIG9wdGlvbmFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9uYWxWYWx1ZSA9PT0gJ3ZvaWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5jb3VudGVyZWQgdW5leHBlY3RlZCBgdm9pZGAgdHlwZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgb2JqZWN0IHJlZmVyZW5jZSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWVkVHlwZSA9IGhvc3QubG9va3VwVHlwZShcbiAgICAgICAgKG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSkuZnFuLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHByb3BzID0gcHJvcGVydGllc09mKG5hbWVkVHlwZSwgaG9zdC5sb29rdXBUeXBlKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgR290IGFuIGFycmF5IHdoZXJlIGEgJHtuYW1lZFR5cGUuZnFufSB3YXMgZXhwZWN0ZWQuIERpZCB5b3UgbWVhbiB0byBwYXNzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cz9gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTaW1pbGFybHkgdG8gc2VyaWFsaXphdGlvbiwgd2UgbWlnaHQgYmUgZ2V0dGluZyBhIHJlZmVyZW5jZSB0eXBlIHdoZXJlIHdlJ3JlXG4gICAgICAvLyBleHBlY3RpbmcgYSB2YWx1ZSB0eXBlLiBBY2NlcHQgdGhpcyBmb3Igbm93IChidXQgYWxzbyB2YWxpZGF0ZSB0aGF0IG9iamVjdFxuICAgICAgLy8gZm9yIHByZXNlbmNlIG9mIHRoZSByaWdodCBwcm9wZXJ0aWVzKS5cbiAgICAgIGlmIChpc09ialJlZih2YWx1ZSkpIHtcbiAgICAgICAgaG9zdC5kZWJ1ZyhcbiAgICAgICAgICAnRXhwZWN0ZWQgdmFsdWUgdHlwZSBidXQgZ290IHJlZmVyZW5jZSB0eXBlLCBhY2NlcHRpbmcgZm9yIG5vdyAoYXdzbGFicy9qc2lpIzQwMCknLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJldHVybiBzYW1lIElOU1RBTkNFIChzaG91bGRuJ3QgbWF0dGVyIGJ1dCB3ZSBkb24ndCBrbm93IGZvciBzdXJlIHRoYXQgaXQgZG9lc24ndClcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlUmVxdWlyZWRQcm9wcyhcbiAgICAgICAgICBob3N0Lm9iamVjdHMuZmluZE9iamVjdCh2YWx1ZSkuaW5zdGFuY2UsXG4gICAgICAgICAgbmFtZWRUeXBlLmZxbixcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFwaS5pc1dpcmVTdHJ1Y3QodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHsgZnFuLCBkYXRhIH0gPSB2YWx1ZVthcGkuVE9LRU5fU1RSVUNUXTtcbiAgICAgICAgaWYgKCFpc0Fzc2lnbmFibGUoZnFuLCBuYW1lZFR5cGUsIGhvc3QubG9va3VwVHlwZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgV2lyZSBzdHJ1Y3QgdHlwZSAnJHtmcW59JyBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCAnJHtuYW1lZFR5cGUuZnFufSdgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBkYXRhO1xuICAgICAgfVxuXG4gICAgICAvLyBQeXRob24sIGZvciBleGFtcGxlLCBhbGxvd3MgdXNpbmcgcGxhaW4gbWFwcGluZyBvYmplY3RzIGluc3RlYWQgb2YgU3RydWN0cyAoZHlhbm1pYyB0eXBpbmcsIFlPTE8hKVxuICAgICAgaWYgKGFwaS5pc1dpcmVNYXAodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWVbYXBpLlRPS0VOX01BUF07XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gdmFsaWRhdGVSZXF1aXJlZFByb3BzKHZhbHVlIGFzIGFueSwgbmFtZWRUeXBlLmZxbiwgcHJvcHMpO1xuXG4gICAgICAvLyBSZXR1cm4gYSBkaWN0IENPUFksIHdlIGhhdmUgYnktdmFsdWUgc2VtYW50aWNzIGFueXdheS5cbiAgICAgIHJldHVybiBtYXBWYWx1ZXModmFsdWUsICh2LCBrZXkpID0+IHtcbiAgICAgICAgaWYgKCFwcm9wc1trZXldKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSAvLyBEb24ndCBtYXAgaWYgdW5rbm93biBwcm9wZXJ0eVxuICAgICAgICByZXR1cm4gaG9zdC5yZWN1cnNlKHYsIHByb3BzW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIFtTZXJpYWxpemF0aW9uQ2xhc3MuUmVmZXJlbmNlVHlwZV06IHtcbiAgICBzZXJpYWxpemUodmFsdWUsIG9wdGlvbmFsVmFsdWUsIGhvc3QpOiBPYmpSZWYgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFeHBlY3RlZCBvYmplY3QgcmVmZXJlbmNlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gaG9zdC5sb29rdXBUeXBlKFxuICAgICAgICAob3B0aW9uYWxWYWx1ZS50eXBlIGFzIHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKS5mcW4sXG4gICAgICApO1xuICAgICAgY29uc3QgaW50ZXJmYWNlcyA9IHNwZWMuaXNJbnRlcmZhY2VUeXBlKGV4cGVjdGVkVHlwZSlcbiAgICAgICAgPyBbZXhwZWN0ZWRUeXBlLmZxbl1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBqc2lpVHlwZSA9XG4gICAgICAgIGpzaWlUeXBlRnFuKHZhbHVlKSA/P1xuICAgICAgICAoc3BlYy5pc0NsYXNzVHlwZShleHBlY3RlZFR5cGUpID8gZXhwZWN0ZWRUeXBlLmZxbiA6IEVNUFRZX09CSkVDVF9GUU4pO1xuXG4gICAgICByZXR1cm4gaG9zdC5vYmplY3RzLnJlZ2lzdGVyT2JqZWN0KHZhbHVlLCBqc2lpVHlwZSwgaW50ZXJmYWNlcyk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBwYXNzIGEgYnktcmVmIG9iamVjdCBpcyB0byBoYXZlIGNyZWF0ZWQgaXRcbiAgICAgIC8vIHByZXZpb3VzbHkgaW5zaWRlIEpTSUkga2VybmVsLCBzbyBpdCBtdXN0IGhhdmUgYW4gb2JqcmVmIGFscmVhZHkuXG5cbiAgICAgIGlmICghaXNPYmpSZWYodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgb2JqZWN0IHJlZmVyZW5jZSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgaW5zdGFuY2UsIGZxbiB9ID0gaG9zdC5vYmplY3RzLmZpbmRPYmplY3QodmFsdWUpO1xuXG4gICAgICBjb25zdCBuYW1lZFR5cGVSZWYgPSBvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG4gICAgICBpZiAobmFtZWRUeXBlUmVmLmZxbiAhPT0gRU1QVFlfT0JKRUNUX0ZRTikge1xuICAgICAgICBjb25zdCBuYW1lZFR5cGUgPSBob3N0Lmxvb2t1cFR5cGUobmFtZWRUeXBlUmVmLmZxbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgb2JqZWN0IHdlIGdvdCBpcyBvZiB0aGUgcmlnaHQgdHlwZVxuICAgICAgICAvLyBXZSBvbmx5IGRvIHRoaXMgZm9yIGNsYXNzZXMsIG5vdCBpbnRlcmZhY2VzLCBzaW5jZSBKYXZhIG1pZ2h0IHBhc3MgdXMgb2JqZWN0cyB0aGF0XG4gICAgICAgIC8vIHByaXZhdGVseSBpbXBsZW1lbnQgc29tZSBpbnRlcmZhY2UgYW5kIHdlIGNhbid0IHByb3ZlIHRoZXkgZG9uJ3QuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMzk5XG4gICAgICAgIGNvbnN0IGRlY2xhcmVkVHlwZSA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNwZWMuaXNDbGFzc1R5cGUobmFtZWRUeXBlKSAmJlxuICAgICAgICAgICFpc0Fzc2lnbmFibGUoZnFuLCBkZWNsYXJlZFR5cGUsIGhvc3QubG9va3VwVHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYE9iamVjdCBvZiB0eXBlICR7ZnFufSBpcyBub3QgY29udmVydGlibGUgdG8gJHtkZWNsYXJlZFR5cGUuZnFufWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfSxcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIFtTZXJpYWxpemF0aW9uQ2xhc3MuQW55XToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgX3R5cGUsIGhvc3QpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVEYXRlKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NjYWxhcih2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGUpID0+IGhvc3QucmVjdXJzZShlLCB7IHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSB9KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdGU6IG5vIGNhc2UgZm9yIFwiRU5VTVwiIGhlcmUsIHdpdGhvdXQgdHlwZSBkZWNsYXJhdGlvbiB3ZSBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlXG4gICAgICAvLyBiZXR3ZWVuIGFuIGVudW0gbWVtYmVyIGFuZCBhIHNjYWxhci5cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0pTSUkgS2VybmVsIGlzIHVuYWJsZSB0byBzZXJpYWxpemUgYGZ1bmN0aW9uYC4gQW4gaW5zdGFuY2Ugd2l0aCBtZXRob2RzIG1pZ2h0IGhhdmUgYmVlbiByZXR1cm5lZCBieSBhbiBgYW55YCBtZXRob2Q/JyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEpTSUkga2VybmVsIGFzc3VtcHRpb24gdmlvbGF0ZWQsICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICApfSBpcyBub3QgYW4gb2JqZWN0YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBTWU1CT0xfV0lSRV9UWVBFIGluIHZhbHVlICYmXG4gICAgICAgICh2YWx1ZSBhcyBhbnkpW1NZTUJPTF9XSVJFX1RZUEVdID09PSBUT0tFTl9NQVBcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gU0VSSUFMSVpFUlNbU2VyaWFsaXphdGlvbkNsYXNzLk1hcF0uc2VyaWFsaXplKFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjoge1xuICAgICAgICAgICAgICAgIGtpbmQ6IHNwZWMuQ29sbGVjdGlvbktpbmQuTWFwLFxuICAgICAgICAgICAgICAgIGVsZW1lbnR0eXBlOiBzcGVjLkNBTk9OSUNBTF9BTlksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaG9zdCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVG8gbWFrZSBzdXJlIHBlb3BsZSBhcmVuJ3QgZ29pbmcgdG8gdHJ5IGFuZCByZXR1cm4gTWFwPD4gb3IgU2V0PD4gb3V0LCB0ZXN0IGZvclxuICAgICAgLy8gdGhvc2UgYW5kIHRocm93IGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZS4gV2UgY2FuJ3QgZGV0ZWN0IHRoZXNlIGNhc2VzIGFueSBvdGhlclxuICAgICAgLy8gd2F5LCBhbmQgdGhlIGJ5LXZhbHVlIHNlcmlhbGl6ZWQgb2JqZWN0IHdpbGwgYmUgcXVpdGUgdXNlbGVzcy5cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCB8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCByZXR1cm4gb2JqZWN0cyBvZiB0eXBlIFNldCBvciBNYXBcIik7XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBhIHByZXZpb3VzIHJlZmVyZW5jZSB0byBtYWludGFpbiBvYmplY3QgaWRlbnRpdHkuIE5PVEU6IHRoaXMgbWF5IGNhdXNlIHVzIHRvIHJldHVyblxuICAgICAgLy8gYSBkaWZmZXJlbnQgdHlwZSB0aGFuIHJlcXVlc3RlZCEgVGhpcyBpcyBqdXN0IGhvdyBpdCBpcyByaWdodCBub3cuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzM5OVxuICAgICAgY29uc3QgcHJldlJlZiA9IG9iamVjdFJlZmVyZW5jZSh2YWx1ZSk7XG4gICAgICBpZiAocHJldlJlZikge1xuICAgICAgICByZXR1cm4gcHJldlJlZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhpcyBpcyBvciBzaG91bGQgYmUgYSByZWZlcmVuY2UgdHlwZSwgcGFzcyBvciBtYWtlIHRoZSByZWZlcmVuY2VcbiAgICAgIC8vIChMaWtlIHJlZ3VsYXIgcmVmdHlwZSBzZXJpYWxpemF0aW9uLCBidXQgd2l0aG91dCB0aGUgdHlwZSBkZXJpdmF0aW9uIHRvIGFuIGludGVyZmFjZSlcbiAgICAgIGNvbnN0IGpzaWlUeXBlID1cbiAgICAgICAganNpaVR5cGVGcW4odmFsdWUpID8/XG4gICAgICAgIChpc0J5UmVmZXJlbmNlT25seSh2YWx1ZSkgPyBFTVBUWV9PQkpFQ1RfRlFOIDogdW5kZWZpbmVkKTtcbiAgICAgIGlmIChqc2lpVHlwZSkge1xuICAgICAgICByZXR1cm4gaG9zdC5vYmplY3RzLnJlZ2lzdGVyT2JqZWN0KHZhbHVlLCBqc2lpVHlwZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbiBvYmplY3QgdGhhdCBpcyBub3Qgb2YgYW4gZXhwb3J0ZWQgdHlwZS4gRWl0aGVyIGFuIG9iamVjdFxuICAgICAgLy8gbGl0ZXJhbCwgb3IgYW4gaW5zdGFuY2Ugb2YgYSBmdWxseSBwcml2YXRlIGNsYXNzIChjYW5ub3QgZGlzdGluZ3Vpc2ggdGhvc2UgY2FzZXMpLlxuXG4gICAgICAvLyBXZSB3aWxsIHNlcmlhbGl6ZSBieS12YWx1ZSwgYnV0IHJlY3Vyc2UgZm9yIHNlcmlhbGl6YXRpb24gc28gdGhhdCBpZlxuICAgICAgLy8gdGhlIG9iamVjdCBjb250YWlucyByZWZlcmVuY2Ugb2JqZWN0cywgdGhleSB3aWxsIGJlIHNlcmlhbGl6ZWQgYXBwcm9wcmlhdGVseS5cbiAgICAgIC8vIChCYXNpY2FsbHksIHNlcmlhbGl6ZSBhbnl0aGluZyBlbHNlIGFzIGEgbWFwIG9mICdhbnknKS5cbiAgICAgIHJldHVybiBtYXBWYWx1ZXModmFsdWUsICh2KSA9PlxuICAgICAgICBob3N0LnJlY3Vyc2UodiwgeyB0eXBlOiBzcGVjLkNBTk9OSUNBTF9BTlkgfSksXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgX3R5cGUsIGhvc3QpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1dpcmVEYXRlKHZhbHVlKSkge1xuICAgICAgICBob3N0LmRlYnVnKCdBTlkgaXMgYSBEYXRlJyk7XG4gICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZURhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKGlzU2NhbGFyKHZhbHVlKSkge1xuICAgICAgICBob3N0LmRlYnVnKCdBTlkgaXMgYSBTY2FsYXInKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGhvc3QuZGVidWcoJ0FOWSBpcyBhbiBBcnJheScpO1xuICAgICAgICByZXR1cm4gdmFsdWUubWFwKChlKSA9PiBob3N0LnJlY3Vyc2UoZSwgeyB0eXBlOiBzcGVjLkNBTk9OSUNBTF9BTlkgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNXaXJlRW51bSh2YWx1ZSkpIHtcbiAgICAgICAgaG9zdC5kZWJ1ZygnQU5ZIGlzIGFuIEVudW0nKTtcbiAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplRW51bSh2YWx1ZSwgaG9zdC5maW5kU3ltYm9sKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1dpcmVNYXAodmFsdWUpKSB7XG4gICAgICAgIGhvc3QuZGVidWcoJ0FOWSBpcyBhIE1hcCcpO1xuICAgICAgICBjb25zdCBtYXBPZkFueTogc3BlYy5Db2xsZWN0aW9uVHlwZVJlZmVyZW5jZSA9IHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgICAgICBraW5kOiBzcGVjLkNvbGxlY3Rpb25LaW5kLk1hcCxcbiAgICAgICAgICAgIGVsZW1lbnR0eXBlOiBzcGVjLkNBTk9OSUNBTF9BTlksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFNFUklBTElaRVJTW1NlcmlhbGl6YXRpb25DbGFzcy5NYXBdLmRlc2VyaWFsaXplKFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHsgdHlwZTogbWFwT2ZBbnkgfSxcbiAgICAgICAgICBob3N0LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqUmVmKHZhbHVlKSkge1xuICAgICAgICBob3N0LmRlYnVnKCdBTlkgaXMgYSBSZWYnKTtcbiAgICAgICAgcmV0dXJuIGhvc3Qub2JqZWN0cy5maW5kT2JqZWN0KHZhbHVlKS5pbnN0YW5jZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHZhbHVlIGhhcyBhIHN0cnVjdCB0b2tlbiwgaXQgd2FzIHNlcmlhbGl6ZWQgYnkgYSB0eXBlZCBqc2lpXG4gICAgICAvLyBzdHJ1Y3QsIGJ1dCBzaW5jZSB0aGUgZGVzZXJpYWxpemF0aW9uIHRhcmdldCBpcyBBTlksIGFsbCB3ZSBjYW4gZG8gaXNcbiAgICAgIC8vIHN0cmlwIHRoZSBkYXRhIGZyb20gJGpzaWkuc3RydWN0IGFuZCBjb250aW51ZSB0byBkZXNlcmlhbGl6ZSBhcyBBTlkuXG4gICAgICBpZiAoaXNXaXJlU3RydWN0KHZhbHVlKSkge1xuICAgICAgICBjb25zdCB7IGZxbiwgZGF0YSB9ID0gdmFsdWVbVE9LRU5fU1RSVUNUXTtcbiAgICAgICAgaG9zdC5kZWJ1ZyhgQU5ZIGlzIGEgc3RydWN0IG9mIHR5cGUgJHtmcW59YCk7XG4gICAgICAgIHJldHVybiBTRVJJQUxJWkVSU1tTZXJpYWxpemF0aW9uQ2xhc3MuU3RydWN0XS5kZXNlcmlhbGl6ZShcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIHsgdHlwZTogeyBmcW4gfSB9LFxuICAgICAgICAgIGhvc3QsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQgYWdhaW4sIGRlc2VyaWFsaXplIGJ5LXZhbHVlLlxuICAgICAgaG9zdC5kZWJ1ZygnQU5ZIGlzIGEgTWFwJyk7XG4gICAgICByZXR1cm4gbWFwVmFsdWVzKHZhbHVlLCAodikgPT5cbiAgICAgICAgaG9zdC5yZWN1cnNlKHYsIHsgdHlwZTogc3BlYy5DQU5PTklDQUxfQU5ZIH0pLFxuICAgICAgKTtcbiAgICB9LFxuICB9LFxufTtcblxuZnVuY3Rpb24gc2VyaWFsaXplRGF0ZSh2YWx1ZTogRGF0ZSk6IFdpcmVEYXRlIHtcbiAgcmV0dXJuIHsgW1RPS0VOX0RBVEVdOiB2YWx1ZS50b0lTT1N0cmluZygpIH07XG59XG5cbmZ1bmN0aW9uIGRlc2VyaWFsaXplRGF0ZSh2YWx1ZTogV2lyZURhdGUpOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlW1RPS0VOX0RBVEVdKTtcbn1cblxuZnVuY3Rpb24gZGVzZXJpYWxpemVFbnVtKHZhbHVlOiBXaXJlRW51bSwgbG9va3VwOiBTeW1ib2xMb29rdXApIHtcbiAgY29uc3QgZW51bUxvY2F0b3IgPSB2YWx1ZVtUT0tFTl9FTlVNXTtcbiAgY29uc3Qgc2VwID0gZW51bUxvY2F0b3IubGFzdEluZGV4T2YoJy8nKTtcbiAgaWYgKHNlcCA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1hbGZvcm1lZCBlbnVtIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGVOYW1lID0gZW51bUxvY2F0b3Iuc2xpY2UoMCwgc2VwKTtcbiAgY29uc3QgdmFsdWVOYW1lID0gZW51bUxvY2F0b3Iuc2xpY2Uoc2VwICsgMSk7XG5cbiAgY29uc3QgZW51bVZhbHVlID0gbG9va3VwKHR5cGVOYW1lKVt2YWx1ZU5hbWVdO1xuICBpZiAoZW51bVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGVudW0gbWVtYmVyIG5hbWVkICR7dmFsdWVOYW1lfSBpbiAke3R5cGVOYW1lfWApO1xuICB9XG4gIHJldHVybiBlbnVtVmFsdWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNlcmlhbGl6YXRpb24ge1xuICBzZXJpYWxpemF0aW9uQ2xhc3M6IFNlcmlhbGl6YXRpb25DbGFzcztcbiAgdHlwZVJlZjogT3B0aW9uYWxWYWx1ZU9yVm9pZDtcbn1cblxuLyoqXG4gKiBGcm9tIGEgdHlwZSByZWZlcmVuY2UsIHJldHVybiB0aGUgcG9zc2libGUgc2VyaWFsaXphdGlvbiB0eXBlc1xuICpcbiAqIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSwgYmVjYXVzZSB0aGUgdHlwZSBjYW4gYmUgYSB0eXBlIHVuaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXphdGlvblR5cGUoXG4gIHR5cGVSZWY6IE9wdGlvbmFsVmFsdWVPclZvaWQsXG4gIGxvb2t1cDogVHlwZUxvb2t1cCxcbik6IFR5cGVTZXJpYWxpemF0aW9uW10ge1xuICBpZiAodHlwZVJlZiA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiS2VybmVsIGVycm9yOiBleHBlY3RlZCB0eXBlIGluZm9ybWF0aW9uLCBnb3QgJ3VuZGVmaW5lZCdcIik7XG4gIH1cbiAgaWYgKHR5cGVSZWYgPT09ICd2b2lkJykge1xuICAgIHJldHVybiBbeyBzZXJpYWxpemF0aW9uQ2xhc3M6IFNlcmlhbGl6YXRpb25DbGFzcy5Wb2lkLCB0eXBlUmVmIH1dO1xuICB9XG4gIGlmIChzcGVjLmlzUHJpbWl0aXZlVHlwZVJlZmVyZW5jZSh0eXBlUmVmLnR5cGUpKSB7XG4gICAgc3dpdGNoICh0eXBlUmVmLnR5cGUucHJpbWl0aXZlKSB7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5Bbnk6XG4gICAgICAgIHJldHVybiBbeyBzZXJpYWxpemF0aW9uQ2xhc3M6IFNlcmlhbGl6YXRpb25DbGFzcy5BbnksIHR5cGVSZWYgfV07XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5EYXRlOlxuICAgICAgICByZXR1cm4gW3sgc2VyaWFsaXphdGlvbkNsYXNzOiBTZXJpYWxpemF0aW9uQ2xhc3MuRGF0ZSwgdHlwZVJlZiB9XTtcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkpzb246XG4gICAgICAgIHJldHVybiBbeyBzZXJpYWxpemF0aW9uQ2xhc3M6IFNlcmlhbGl6YXRpb25DbGFzcy5Kc29uLCB0eXBlUmVmIH1dO1xuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuQm9vbGVhbjpcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLk51bWJlcjpcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLlN0cmluZzpcbiAgICAgICAgcmV0dXJuIFt7IHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzLlNjYWxhciwgdHlwZVJlZiB9XTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcHJpbWl0aXZlIHR5cGUnKTtcbiAgfVxuICBpZiAoc3BlYy5pc0NvbGxlY3Rpb25UeXBlUmVmZXJlbmNlKHR5cGVSZWYudHlwZSkpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBzZXJpYWxpemF0aW9uQ2xhc3M6XG4gICAgICAgICAgdHlwZVJlZi50eXBlLmNvbGxlY3Rpb24ua2luZCA9PT0gc3BlYy5Db2xsZWN0aW9uS2luZC5BcnJheVxuICAgICAgICAgICAgPyBTZXJpYWxpemF0aW9uQ2xhc3MuQXJyYXlcbiAgICAgICAgICAgIDogU2VyaWFsaXphdGlvbkNsYXNzLk1hcCxcbiAgICAgICAgdHlwZVJlZixcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuICBpZiAoc3BlYy5pc1VuaW9uVHlwZVJlZmVyZW5jZSh0eXBlUmVmLnR5cGUpKSB7XG4gICAgY29uc3QgY29tcG91bmRUeXBlcyA9IGZsYXRNYXAodHlwZVJlZi50eXBlLnVuaW9uLnR5cGVzLCAodCkgPT5cbiAgICAgIHNlcmlhbGl6YXRpb25UeXBlKHsgdHlwZTogdCB9LCBsb29rdXApLFxuICAgICk7XG4gICAgLy8gUHJvcGFnYXRlIHRoZSB0b3AtbGV2ZWwgJ29wdGlvbmFsJyBmaWVsZCB0byBlYWNoIGluZGl2aWR1YWwgc3VidHlwZVxuICAgIGZvciAoY29uc3QgdCBvZiBjb21wb3VuZFR5cGVzKSB7XG4gICAgICBpZiAodC50eXBlUmVmICE9PSAndm9pZCcpIHtcbiAgICAgICAgdC50eXBlUmVmLm9wdGlvbmFsID0gdHlwZVJlZi5vcHRpb25hbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvdW5kVHlwZXMuc29ydCgobCwgcikgPT5cbiAgICAgIGNvbXBhcmVTZXJpYWxpemF0aW9uQ2xhc3NlcyhsLnNlcmlhbGl6YXRpb25DbGFzcywgci5zZXJpYWxpemF0aW9uQ2xhc3MpLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgbmV4dCBwYXJ0IG9mIHRoZSBjb252ZXJzaW9uIGlzIGxvb2t1cC1kZXBlbmRlbnRcbiAgY29uc3QgdHlwZSA9IGxvb2t1cCh0eXBlUmVmLnR5cGUuZnFuKTtcblxuICBpZiAoc3BlYy5pc0VudW1UeXBlKHR5cGUpKSB7XG4gICAgcmV0dXJuIFt7IHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzLkVudW0sIHR5cGVSZWYgfV07XG4gIH1cblxuICBpZiAoc3BlYy5pc0ludGVyZmFjZVR5cGUodHlwZSkgJiYgdHlwZS5kYXRhdHlwZSkge1xuICAgIHJldHVybiBbeyBzZXJpYWxpemF0aW9uQ2xhc3M6IFNlcmlhbGl6YXRpb25DbGFzcy5TdHJ1Y3QsIHR5cGVSZWYgfV07XG4gIH1cblxuICByZXR1cm4gW3sgc2VyaWFsaXphdGlvbkNsYXNzOiBTZXJpYWxpemF0aW9uQ2xhc3MuUmVmZXJlbmNlVHlwZSwgdHlwZVJlZiB9XTtcbn1cblxuZnVuY3Rpb24gbnVsbEFuZE9rKHg6IHVua25vd24sIHR5cGU6IE9wdGlvbmFsVmFsdWVPclZvaWQpOiBib29sZWFuIHtcbiAgaWYgKHggIT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAndm9pZCcgJiYgIXR5cGUub3B0aW9uYWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgR290ICd1bmRlZmluZWQnIGZvciBub24tb3B0aW9uYWwgaW5zdGFuY2Ugb2YgJHtKU09OLnN0cmluZ2lmeSh0eXBlKX1gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHg6IHVua25vd24pOiB4IGlzIERhdGUge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJlxuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgRGF0ZV0nXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzU2NhbGFyKHg6IHVua25vd24pOiB4IGlzIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB4ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgeCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHggPT09ICdib29sZWFuJ1xuICApO1xufVxuXG5mdW5jdGlvbiBmbGF0TWFwPFQsIFU+KHhzOiBUW10sIGZuOiAoeDogVCkgPT4gVVtdKTogVVtdIHtcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFU+KCk7XG4gIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgIHJldC5wdXNoKC4uLmZuKHgpKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIE1hcCBhbiBvYmplY3QncyB2YWx1ZXMsIHNraXBwaW5nICd1bmRlZmluZWQnIHZhbHVlcydcbiAqL1xuZnVuY3Rpb24gbWFwVmFsdWVzKFxuICB2YWx1ZTogdW5rbm93bixcbiAgZm46ICh2YWx1ZTogYW55LCBmaWVsZDogc3RyaW5nKSA9PiBhbnksXG4pOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb2JqZWN0IHR5cGUsIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgfVxuXG4gIGNvbnN0IG91dDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICBjb25zdCB3aXJlVmFsdWUgPSBmbih2LCBrKTtcbiAgICBpZiAod2lyZVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBvdXRba10gPSB3aXJlVmFsdWU7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gcHJvcGVydGllc09mKFxuICB0OiBzcGVjLlR5cGUsXG4gIGxvb2t1cDogVHlwZUxvb2t1cCxcbik6IHsgW25hbWU6IHN0cmluZ106IHNwZWMuUHJvcGVydHkgfSB7XG4gIGlmICghc3BlYy5pc0NsYXNzT3JJbnRlcmZhY2VUeXBlKHQpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgbGV0IHJldDogeyBbbmFtZTogc3RyaW5nXTogc3BlYy5Qcm9wZXJ0eSB9ID0ge307XG5cbiAgaWYgKHQuaW50ZXJmYWNlcykge1xuICAgIGZvciAoY29uc3QgaWZhY2Ugb2YgdC5pbnRlcmZhY2VzKSB7XG4gICAgICByZXQgPSB7IC4uLnJldCwgLi4ucHJvcGVydGllc09mKGxvb2t1cChpZmFjZSksIGxvb2t1cCkgfTtcbiAgICB9XG4gIH1cbiAgaWYgKHNwZWMuaXNDbGFzc1R5cGUodCkgJiYgdC5iYXNlKSB7XG4gICAgcmV0ID0geyAuLi5yZXQsIC4uLnByb3BlcnRpZXNPZihsb29rdXAodC5iYXNlKSwgbG9va3VwKSB9O1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIHQucHJvcGVydGllcyA/PyBbXSkge1xuICAgIHJldFtwcm9wLm5hbWVdID0gcHJvcDtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGdpdmVuIHR5cGUgKGJ5IGl0J3MgRlFOKSBjYW4gYmUgYXNzaWduZWQgdG8gYSBuYW1lZCB0eXBlIHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0gYWN0dWFsVHlwZUZxbiB0aGUgRlFOIG9mIHRoZSB0eXBlIHRoYXQgaXMgYmVpbmcgdGVzdGVkLlxuICogQHBhcmFtIHJlcXVpcmVkVHlwZSAgdGhlIHJlcXVpcmVkIHJlZmVyZW5jZSB0eXBlLlxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgYGByZXF1aXJlZFR5cGVgYCBpcyBhIHN1cGVyLXR5cGUgKGJhc2UgY2xhc3Mgb3IgaW1wbGVtZW50ZWQgaW50ZXJmYWNlKSBvZiB0aGUgdHlwZSBkZXNpZ25hdGVkIGJ5XG4gKiAgICAgICAgICBgYGFjdHVhbFR5cGVGcW5gYC5cbiAqL1xuZnVuY3Rpb24gaXNBc3NpZ25hYmxlKFxuICBhY3R1YWxUeXBlRnFuOiBzdHJpbmcsXG4gIHJlcXVpcmVkVHlwZTogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UsXG4gIGxvb2t1cDogVHlwZUxvb2t1cCxcbik6IGJvb2xlYW4ge1xuICAvLyBUaGUgZW1wdHkgb2JqZWN0IGlzIGFzc2lnbmFibGUgdG8gZXZlcnl0aGluZ1xuICBpZiAoYWN0dWFsVHlwZUZxbiA9PT0gRU1QVFlfT0JKRUNUX0ZRTikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHJlcXVpcmVkVHlwZS5mcW4gPT09IGFjdHVhbFR5cGVGcW4pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBhY3R1YWxUeXBlID0gbG9va3VwKGFjdHVhbFR5cGVGcW4pO1xuICBpZiAoc3BlYy5pc0NsYXNzVHlwZShhY3R1YWxUeXBlKSkge1xuICAgIGlmIChcbiAgICAgIGFjdHVhbFR5cGUuYmFzZSAmJlxuICAgICAgaXNBc3NpZ25hYmxlKGFjdHVhbFR5cGUuYmFzZSwgcmVxdWlyZWRUeXBlLCBsb29rdXApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHNwZWMuaXNDbGFzc09ySW50ZXJmYWNlVHlwZShhY3R1YWxUeXBlKSAmJiBhY3R1YWxUeXBlLmludGVyZmFjZXMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYWN0dWFsVHlwZS5pbnRlcmZhY2VzLmZpbmQoKGlmYWNlKSA9PlxuICAgICAgICBpc0Fzc2lnbmFibGUoaWZhY2UsIHJlcXVpcmVkVHlwZSwgbG9va3VwKSxcbiAgICAgICkgIT0gbnVsbFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJlcXVpcmVkUHJvcHMoXG4gIGFjdHVhbFByb3BzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICB0eXBlTmFtZTogc3RyaW5nLFxuICBzcGVjUHJvcHM6IHsgW2tleTogc3RyaW5nXTogc3BlYy5Qcm9wZXJ0eSB9LFxuKSB7XG4gIC8vIENoZWNrIGZvciByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gIGNvbnN0IG1pc3NpbmdSZXF1aXJlZFByb3BzID0gT2JqZWN0LmtleXMoc3BlY1Byb3BzKVxuICAgIC5maWx0ZXIoKG5hbWUpID0+ICFzcGVjUHJvcHNbbmFtZV0ub3B0aW9uYWwpXG4gICAgLmZpbHRlcigobmFtZSkgPT4gIShuYW1lIGluIGFjdHVhbFByb3BzKSk7XG5cbiAgaWYgKG1pc3NpbmdSZXF1aXJlZFByb3BzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciAke3R5cGVOYW1lfTogJHttaXNzaW5nUmVxdWlyZWRQcm9wcy5qb2luKFxuICAgICAgICAnLCAnLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gYWN0dWFsUHJvcHM7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVTZXJpYWxpemF0aW9uQ2xhc3NlcyhcbiAgbDogU2VyaWFsaXphdGlvbkNsYXNzLFxuICByOiBTZXJpYWxpemF0aW9uQ2xhc3MsXG4pOiBudW1iZXIge1xuICBjb25zdCBvcmRlciA9IFtcbiAgICBTZXJpYWxpemF0aW9uQ2xhc3MuVm9pZCxcbiAgICBTZXJpYWxpemF0aW9uQ2xhc3MuRGF0ZSxcbiAgICBTZXJpYWxpemF0aW9uQ2xhc3MuU2NhbGFyLFxuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5Kc29uLFxuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5FbnVtLFxuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5BcnJheSxcbiAgICBTZXJpYWxpemF0aW9uQ2xhc3MuTWFwLFxuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5TdHJ1Y3QsXG4gICAgU2VyaWFsaXphdGlvbkNsYXNzLlJlZmVyZW5jZVR5cGUsXG4gICAgU2VyaWFsaXphdGlvbkNsYXNzLkFueSxcbiAgXTtcbiAgcmV0dXJuIG9yZGVyLmluZGV4T2YobCkgLSBvcmRlci5pbmRleE9mKHIpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBgb2JqYCBtdXN0IGJlIHBhc3NlZCBieS1yZWZlcmVuY2Ugb3IgaWYgYnktdmFsdWUgaXMgYWNjZXB0YWJsZS4gRm9yIGV4YW1wbGUsXG4gKiBvYmplY3RzIHdpdGggbWV0aG9kcywgb3IgZHluYW1pYyBnZXR0ZXJzIChvciBzZXR0ZXJzKSBzaG91bGQgYmUgcGFzc2VkIGJ5LXJlZmVyZW5jZSBhcyBhIG1hdHRlclxuICogb2Ygc2VjdXJpdHkuIFRoZSBiZWhhdmlvciBpbiBub24tSlMgcnVudGltZXMgY291bGQgb3RoZXJ3aXNlIGRpZmZlciBmcm9tIHRoYXQgaW4gcHVyZSBKUyAoaWZcbiAqIGdldHRlcnMgYXJlIG5vdCBzdGFibGUsIGV0Yy4uLikuXG4gKlxuICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJlIHRlc3RlZC5cbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGBvYmpgIG11c3QgYmUgcGFzc2VkIGJ5LXJlZmVyZW5jZS5cbiAqL1xuZnVuY3Rpb24gaXNCeVJlZmVyZW5jZU9ubHkob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBjdXJyID0gb2JqO1xuICAvLyBDcmF3bCB1cCB0aGUgcHJvdG90eXBlIGNoYWluIHRvIGxvb2sgZm9yIGR5bmFtaWMgcHJvcGVydGllcyBvciBtZXRob2RzLlxuICBkbyB7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGN1cnIpKSB7XG4gICAgICBjb25zdCBkZXNjciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3VyciwgcHJvcCk7XG4gICAgICBpZiAoXG4gICAgICAgIGRlc2NyPy5nZXQgIT0gbnVsbCB8fFxuICAgICAgICBkZXNjcj8uc2V0ICE9IG51bGwgfHxcbiAgICAgICAgdHlwZW9mIGRlc2NyPy52YWx1ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIC8vIFByb3BlcnR5IGhhcyBhIGR5bmFtaWMgZ2V0dGVyLCBzZXR0ZXIgb3IgaXMgYSBjb25zdHJ1Y3Rvci9tZXRob2QsIHNvIGJ5LXJlZiByZXF1aXJlZCFcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEVuZCB3aGVuIHRoZSBwYXJlbnQgcHJvdG8gaXMgYE9iamVjdGAsIHdoaWNoIGhhcyBubyBwYXJlbnQgcHJvdG8gaXRzZWxmLlxuICB9IHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YoKGN1cnIgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycikpKSAhPSBudWxsKTtcblxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
|
|
711
|
+
//# sourceMappingURL=serialization.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsii/kernel",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.60.0",
|
|
4
4
|
"description": "kernel for jsii execution environment",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"directory": "packages/@jsii/kernel"
|
|
18
18
|
},
|
|
19
19
|
"engines": {
|
|
20
|
-
"node": ">=
|
|
20
|
+
"node": ">= 14.5.0"
|
|
21
21
|
},
|
|
22
22
|
"main": "lib/index.js",
|
|
23
23
|
"types": "lib/index.d.ts",
|
|
@@ -31,24 +31,17 @@
|
|
|
31
31
|
"package": "package-js"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@jsii/spec": "^1.
|
|
35
|
-
"fs-extra": "^
|
|
34
|
+
"@jsii/spec": "^1.60.0",
|
|
35
|
+
"fs-extra": "^10.1.0",
|
|
36
36
|
"tar": "^6.1.11"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@scope/jsii-calc-base": "^1.
|
|
40
|
-
"@scope/jsii-calc-lib": "^1.
|
|
39
|
+
"@scope/jsii-calc-base": "^1.60.0",
|
|
40
|
+
"@scope/jsii-calc-lib": "^1.60.0",
|
|
41
41
|
"@types/fs-extra": "^9.0.13",
|
|
42
|
-
"@types/jest": "^27.5.0",
|
|
43
|
-
"@types/node": "^12.20.50",
|
|
44
42
|
"@types/tar": "^6.1.1",
|
|
45
|
-
"eslint": "^8.15.0",
|
|
46
|
-
"jest": "^27.5.1",
|
|
47
43
|
"jest-expect-message": "^1.0.2",
|
|
48
|
-
"jsii-build-tools": "^1.
|
|
49
|
-
"jsii-calc": "^3.20.120"
|
|
50
|
-
"prettier": "^2.6.2",
|
|
51
|
-
"ts-jest": "^27.1.4",
|
|
52
|
-
"typescript": "~3.9.10"
|
|
44
|
+
"jsii-build-tools": "^1.60.0",
|
|
45
|
+
"jsii-calc": "^3.20.120"
|
|
53
46
|
}
|
|
54
47
|
}
|