@appium/base-driver 8.7.0 → 8.7.2
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/build/lib/basedriver/capabilities.d.ts +207 -42
- package/build/lib/basedriver/capabilities.d.ts.map +1 -1
- package/build/lib/basedriver/capabilities.js +39 -44
- package/build/lib/basedriver/capabilities.js.map +1 -0
- package/build/lib/basedriver/commands/event.js +3 -3
- package/build/lib/basedriver/commands/event.js.map +1 -0
- package/build/lib/basedriver/commands/execute.js +3 -3
- package/build/lib/basedriver/commands/execute.js.map +1 -0
- package/build/lib/basedriver/commands/find.js.map +1 -0
- package/build/lib/basedriver/commands/index.js.map +1 -0
- package/build/lib/basedriver/commands/log.js +3 -3
- package/build/lib/basedriver/commands/log.js.map +1 -0
- package/build/lib/basedriver/commands/session.js +3 -3
- package/build/lib/basedriver/commands/session.js.map +1 -0
- package/build/lib/basedriver/commands/settings.js.map +1 -0
- package/build/lib/basedriver/commands/timeout.js +3 -3
- package/build/lib/basedriver/commands/timeout.js.map +1 -0
- package/build/lib/basedriver/core.d.ts +173 -22
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +4 -6
- package/build/lib/basedriver/core.js.map +1 -0
- package/build/lib/basedriver/desired-caps.d.ts +0 -2
- package/build/lib/basedriver/desired-caps.d.ts.map +1 -1
- package/build/lib/basedriver/desired-caps.js +4 -53
- package/build/lib/basedriver/desired-caps.js.map +1 -0
- package/build/lib/basedriver/device-settings.js +3 -3
- package/build/lib/basedriver/device-settings.js.map +1 -0
- package/build/lib/basedriver/driver.d.ts +318 -28
- package/build/lib/basedriver/driver.d.ts.map +1 -1
- package/build/lib/basedriver/driver.js +23 -30
- package/build/lib/basedriver/driver.js.map +1 -0
- package/build/lib/basedriver/helpers.d.ts +1 -1
- package/build/lib/basedriver/helpers.d.ts.map +1 -1
- package/build/lib/basedriver/helpers.js +3 -3
- package/build/lib/basedriver/helpers.js.map +1 -0
- package/build/lib/basedriver/logger.js.map +1 -0
- package/build/lib/constants.js.map +1 -0
- package/build/lib/express/crash.js.map +1 -0
- package/build/lib/express/express-logging.js +3 -3
- package/build/lib/express/express-logging.js.map +1 -0
- package/build/lib/express/idempotency.js +3 -3
- package/build/lib/express/idempotency.js.map +1 -0
- package/build/lib/express/logger.js.map +1 -0
- package/build/lib/express/middleware.js +3 -3
- package/build/lib/express/middleware.js.map +1 -0
- package/build/lib/express/server.js +3 -3
- package/build/lib/express/server.js.map +1 -0
- package/build/lib/express/static.js +3 -3
- package/build/lib/express/static.js.map +1 -0
- package/build/lib/express/websocket.js +3 -3
- package/build/lib/express/websocket.js.map +1 -0
- package/build/lib/helpers/capabilities.d.ts +66 -5
- package/build/lib/helpers/capabilities.d.ts.map +1 -1
- package/build/lib/helpers/capabilities.js +7 -7
- package/build/lib/helpers/capabilities.js.map +1 -0
- package/build/lib/index.d.ts +1 -1
- package/build/lib/index.d.ts.map +1 -1
- package/build/lib/index.js +10 -3
- package/build/lib/index.js.map +1 -0
- package/build/lib/jsonwp-proxy/protocol-converter.js +3 -3
- package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -0
- package/build/lib/jsonwp-proxy/proxy.js +3 -3
- package/build/lib/jsonwp-proxy/proxy.js.map +1 -0
- package/build/lib/jsonwp-status/status.js +3 -3
- package/build/lib/jsonwp-status/status.js.map +1 -0
- package/build/lib/protocol/errors.js +3 -3
- package/build/lib/protocol/errors.js.map +1 -0
- package/build/lib/protocol/helpers.js +3 -3
- package/build/lib/protocol/helpers.js.map +1 -0
- package/build/lib/protocol/index.js.map +1 -0
- package/build/lib/protocol/protocol.js +3 -3
- package/build/lib/protocol/protocol.js.map +1 -0
- package/build/lib/protocol/routes.js +3 -3
- package/build/lib/protocol/routes.js.map +1 -0
- package/build/lib/protocol/validators.js +3 -3
- package/build/lib/protocol/validators.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/capabilities.js +151 -93
- package/lib/basedriver/core.js +35 -19
- package/lib/basedriver/desired-caps.js +1 -53
- package/lib/basedriver/driver.js +98 -51
- package/lib/helpers/capabilities.js +19 -9
- package/lib/index.js +1 -0
- package/package.json +10 -11
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
@@ -33,6 +31,8 @@ var _constants = require("../constants");
|
|
|
33
31
|
|
|
34
32
|
var _capabilities = require("../helpers/capabilities");
|
|
35
33
|
|
|
34
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
35
|
+
|
|
36
36
|
const CREATE_SESSION_COMMAND = 'createSession';
|
|
37
37
|
exports.CREATE_SESSION_COMMAND = CREATE_SESSION_COMMAND;
|
|
38
38
|
const DELETE_SESSION_COMMAND = 'deleteSession';
|
|
@@ -391,4 +391,4 @@ async function doJwpProxy(driver, req, res) {
|
|
|
391
391
|
}
|
|
392
392
|
}
|
|
393
393
|
}
|
|
394
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIkdFVF9TVEFUVVNfQ09NTUFORCIsImRldGVybWluZVByb3RvY29sIiwiY3JlYXRlU2Vzc2lvbkFyZ3MiLCJfIiwic29tZSIsImlzVzNjQ2FwcyIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiaXNTZXNzaW9uQ29tbWFuZCIsImNvbW1hbmQiLCJpbmNsdWRlcyIsIk5PX1NFU1NJT05fSURfQ09NTUFORFMiLCJnZXRMb2dnZXIiLCJsb2ciLCJpbmZvIiwibG9nUHJlZml4IiwiY29uc3RydWN0b3IiLCJuYW1lIiwibm9kZSIsImdldE9iamVjdElkIiwic3Vic3RyaW5nIiwibG9nZ2VyIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsImRpZFBsdWdpbk92ZXJyaWRlUHJveHkiLCJuZXZlclByb3h5IiwiZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImRvSndwUHJveHkiLCJkZWJ1ZyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJkcml2ZXJSZXMiLCJ2YWxpZGF0b3JzIiwidHJ1bmNhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiTUFYX0xPR19CT0RZX0xFTkdUSCIsInJlcUZvclByb3h5IiwiaXNQbGFpbk9iamVjdCIsImhhcyIsImVycm9yIiwidmFsdWUiLCJjYXBhYmlsaXRpZXMiLCJmb3JtYXRSZXNwb25zZVZhbHVlIiwidXRpbCIsImhhc1ZhbHVlIiwic3RhdHVzIiwiaXNOYU4iLCJwYXJzZUludCIsImVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlIiwiZXJyb3JGcm9tVzNDSnNvbkNvZGUiLCJzdGFja3RyYWNlIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJpc0Vycm9yVHlwZSIsIlByb3h5UmVxdWVzdEVycm9yIiwiZ2V0QWN0dWFsRXJyb3IiLCJnZXRSZXNwb25zZUZvclczQ0Vycm9yIiwiaXNTdHJpbmciLCJzZW5kIiwiZm9ybWF0U3RhdHVzIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJjYW5Qcm94eSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHt1dGlsLCBsb2dnZXIsIG5vZGV9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQge3ZhbGlkYXRvcnN9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuICBlcnJvcnMsXG4gIGlzRXJyb3JUeXBlLFxuICBnZXRSZXNwb25zZUZvclczQ0Vycm9yLFxuICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSxcbiAgZXJyb3JGcm9tVzNDSnNvbkNvZGUsXG59IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7TUVUSE9EX01BUCwgTk9fU0VTU0lPTl9JRF9DT01NQU5EU30gZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtmb3JtYXRSZXNwb25zZVZhbHVlLCBmb3JtYXRTdGF0dXN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge01BWF9MT0dfQk9EWV9MRU5HVEgsIFBST1RPQ09MUywgREVGQVVMVF9CQVNFX1BBVEh9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge2lzVzNjQ2Fwc30gZnJvbSAnLi4vaGVscGVycy9jYXBhYmlsaXRpZXMnO1xuXG5jb25zdCBDUkVBVEVfU0VTU0lPTl9DT01NQU5EID0gJ2NyZWF0ZVNlc3Npb24nO1xuY29uc3QgREVMRVRFX1NFU1NJT05fQ09NTUFORCA9ICdkZWxldGVTZXNzaW9uJztcbmNvbnN0IEdFVF9TVEFUVVNfQ09NTUFORCA9ICdnZXRTdGF0dXMnO1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVQcm90b2NvbChjcmVhdGVTZXNzaW9uQXJncykge1xuICByZXR1cm4gXy5zb21lKGNyZWF0ZVNlc3Npb25BcmdzLCBpc1czY0NhcHMpID8gUFJPVE9DT0xTLlczQyA6IFBST1RPQ09MUy5NSlNPTldQO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9IF8uaXNGdW5jdGlvbihkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbilcbiAgICA/IGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKHNlc3Npb25JZClcbiAgICA6IGRyaXZlcjtcbiAgaWYgKGRzdERyaXZlciA9PT0gZHJpdmVyKSB7XG4gICAgLy8gU2hvcnRjaXJjdWl0IGlmIHRoZSBkcml2ZXIgaW5zdGFuY2UgaXMgbm90IGFuIHVtYnJlbGxhIGRyaXZlclxuICAgIC8vIG9yIGl0IGlzIEZha2UgZHJpdmVyIGluc3RhbmNlLCB3aGVyZSBgZHJpdmVyLmRyaXZlckZvclNlc3Npb25gXG4gICAgLy8gYWx3YXlzIHJldHVybnMgc2VsZiBpbnN0YW5jZVxuICAgIHJldHVybiBkcml2ZXIucHJvdG9jb2w7XG4gIH1cblxuICAvLyBFeHRyYWN0IHRoZSBwcm90b2NvbCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZiB0aGUgZ2l2ZW4gZHJpdmVyIGlzIHRoZSB1bWJyZWxsYSBvbmVcbiAgcmV0dXJuIGRzdERyaXZlcj8ucHJvdG9jb2wgPz8gUFJPVE9DT0xTLlczQztcbn1cblxuZnVuY3Rpb24gaXNTZXNzaW9uQ29tbWFuZChjb21tYW5kKSB7XG4gIHJldHVybiAhXy5pbmNsdWRlcyhOT19TRVNTSU9OX0lEX0NPTU1BTkRTLCBjb21tYW5kKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlcm5hbERyaXZlcn0gZHJpdmVyXG4gKiBAcGFyYW0ge3N0cmluZz99IFtzZXNzaW9uSWRdXG4gKiBAcmV0dXJucyB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtTG9nZ2VyfVxuICovXG5mdW5jdGlvbiBnZXRMb2dnZXIoZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9XG4gICAgc2Vzc2lvbklkICYmIF8uaXNGdW5jdGlvbihkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbilcbiAgICAgID8gZHJpdmVyLmRyaXZlckZvclNlc3Npb24oc2Vzc2lvbklkKSA/PyBkcml2ZXJcbiAgICAgIDogZHJpdmVyO1xuICBpZiAoXy5pc0Z1bmN0aW9uKGRzdERyaXZlci5sb2c/LmluZm8pKSB7XG4gICAgcmV0dXJuIGRzdERyaXZlci5sb2c7XG4gIH1cblxuICBsZXQgbG9nUHJlZml4ID0gZHN0RHJpdmVyLmNvbnN0cnVjdG9yXG4gICAgPyBgJHtkc3REcml2ZXIuY29uc3RydWN0b3IubmFtZX1AJHtub2RlLmdldE9iamVjdElkKGRzdERyaXZlcikuc3Vic3RyaW5nKDAsIDgpfWBcbiAgICA6ICdBcHBpdW1Ecml2ZXInO1xuICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgbG9nUHJlZml4ICs9IGAgKCR7c2Vzc2lvbklkLnN1YnN0cmluZygwLCA4KX0pYDtcbiAgfVxuICByZXR1cm4gbG9nZ2VyLmdldExvZ2dlcihsb2dQcmVmaXgpO1xufVxuXG5mdW5jdGlvbiB3cmFwUGFyYW1zKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBwZXJmb3JtVG91Y2ggd2hpY2ggdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIgKHByaW1pdGl2ZSB0eXBlIG9yIGFycmF5KS5cbiAgICogU29tZSBkcml2ZXJzIGNob29zZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFzIGEgdmFsdWUgKGVnLiBbYWN0aW9uMSwgYWN0aW9uMi4uLl0pIHdoaWxlIG90aGVycyB0b1xuICAgKiB3cmFwIGl0IHdpdGhpbiBhbiBvYmplY3QoZWcnIHtnZXN0dXJlOiAgW2FjdGlvbjEsIGFjdGlvbjIuLi5dfSksIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gdmFsaWRhdGUuXG4gICAqIFRoZSB3cmFwIG9wdGlvbiBpbiB0aGUgc3BlYyBlbmZvcmNlIHdyYXBwaW5nIGJlZm9yZSB2YWxpZGF0aW9uLCBzbyB0aGF0IGFsbCBwYXJhbXMgYXJlIHdyYXBwZWQgYXRcbiAgICogdGhlIHRpbWUgdGhleSBhcmUgdmFsaWRhdGVkIGFuZCBsYXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmRzLlxuICAgKi9cbiAgbGV0IHJlcyA9IGpzb25PYmo7XG4gIGlmIChfLmlzQXJyYXkoanNvbk9iaikgfHwgIV8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICByZXMgPSB7fTtcbiAgICByZXNbcGFyYW1TZXRzLndyYXBdID0ganNvbk9iajtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJhbXMocGFyYW1TZXRzLCBqc29uT2JqKSB7XG4gIC8qIFRoZXJlIGFyZSBjb21tYW5kcyBsaWtlIHNldE5ldHdvcmtDb25uZWN0aW9uIHdoaWNoIHNlbmQgcGFyYW1ldGVycyB3cmFwcGVkIGluc2lkZSBhIGtleSBzdWNoIGFzXG4gICAqIFwicGFyYW1ldGVyc1wiLiBUaGlzIGZ1bmN0aW9uIHVud3JhcHMgdGhlbSAoZWcuIHtcInBhcmFtZXRlcnNcIjoge1widHlwZVwiOiAxfX0gYmVjb21lcyB7XCJ0eXBlXCI6IDF9KS5cbiAgICovXG4gIGxldCByZXMgPSBqc29uT2JqO1xuICBpZiAoXy5pc09iamVjdChqc29uT2JqKSkge1xuICAgIC8vIHNvbWUgY2xpZW50cywgbGlrZSBydWJ5LCBkb24ndCB3cmFwXG4gICAgaWYgKGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF0pIHtcbiAgICAgIHJlcyA9IGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BhcmFtcyhwYXJhbVNldHMsIGpzb25PYmosIHByb3RvY29sKSB7XG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IFtdO1xuICBsZXQgb3B0aW9uYWxQYXJhbXMgPSBbXTtcbiAgbGV0IHJlY2VpdmVkUGFyYW1zID0gXy5rZXlzKGpzb25PYmopO1xuXG4gIGlmIChwYXJhbVNldHMpIHtcbiAgICBpZiAocGFyYW1TZXRzLnJlcXVpcmVkKSB7XG4gICAgICAvLyB3ZSBtaWdodCBoYXZlIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMsXG4gICAgICAvLyBvciBhbiBhcnJheSBvZiBhcnJheXMgb2YgcGFyYW1ldGVycywgc28gc3RhbmRhcmRpemVcbiAgICAgIGlmICghXy5pc0FycmF5KF8uZmlyc3QocGFyYW1TZXRzLnJlcXVpcmVkKSkpIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBbcGFyYW1TZXRzLnJlcXVpcmVkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1TZXRzLnJlcXVpcmVkO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBqdXN0IGFuIGFycmF5XG4gICAgaWYgKHBhcmFtU2V0cy5vcHRpb25hbCkge1xuICAgICAgb3B0aW9uYWxQYXJhbXMgPSBwYXJhbVNldHMub3B0aW9uYWw7XG4gICAgfVxuXG4gICAgLy8gSWYgYSBmdW5jdGlvbiB3YXMgcHJvdmlkZWQgYXMgdGhlICd2YWxpZGF0ZScga2V5LCBpdCB3aWxsIGhlcmUgYmUgY2FsbGVkIHdpdGhcbiAgICAvLyBqc29uT2JqIGFzIHRoZSBwYXJhbS4gSWYgaXQgcmV0dXJucyBzb21ldGhpbmcgZmFsc3ksIHZlcmlmaWNhdGlvbiB3aWxsIGJlXG4gICAgLy8gY29uc2lkZXJlZCB0byBoYXZlIHBhc3NlZC4gSWYgaXQgcmV0dXJucyBzb21ldGhpbmcgZWxzZSwgdGhhdCB3aWxsIGJlIHRoZVxuICAgIC8vIGFyZ3VtZW50IHRvIGFuIGVycm9yIHdoaWNoIGlzIHRocm93biB0byB0aGUgdXNlclxuICAgIGlmIChwYXJhbVNldHMudmFsaWRhdGUpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gcGFyYW1TZXRzLnZhbGlkYXRlKGpzb25PYmosIHByb3RvY29sKTtcbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKG1lc3NhZ2UsIGpzb25PYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGhhdmUgbm8gcmVxdWlyZWQgcGFyYW1ldGVycywgYWxsIGlzIHdlbGxcbiAgaWYgKHJlcXVpcmVkUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHNvbWUgY2xpZW50cyBwYXNzIGluIHRoZSBzZXNzaW9uIGlkIGluIHRoZSBwYXJhbXNcbiAgaWYgKG9wdGlvbmFsUGFyYW1zLmluZGV4T2YoJ3Nlc3Npb25JZCcpID09PSAtMSkge1xuICAgIG9wdGlvbmFsUGFyYW1zLnB1c2goJ3Nlc3Npb25JZCcpO1xuICB9XG5cbiAgLy8gc29tZSBjbGllbnRzIHBhc3MgaW4gYW4gZWxlbWVudCBpZCBpbiB0aGUgcGFyYW1zXG4gIGlmIChvcHRpb25hbFBhcmFtcy5pbmRleE9mKCdpZCcpID09PSAtMSkge1xuICAgIG9wdGlvbmFsUGFyYW1zLnB1c2goJ2lkJyk7XG4gIH1cblxuICAvLyBnbyB0aHJvdWdoIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzIGFuZCBjaGVjayBhZ2FpbnN0IG91ciBhcmd1bWVudHNcbiAgZm9yIChsZXQgcGFyYW1zIG9mIHJlcXVpcmVkUGFyYW1zKSB7XG4gICAgaWYgKFxuICAgICAgXy5kaWZmZXJlbmNlKHJlY2VpdmVkUGFyYW1zLCBwYXJhbXMsIG9wdGlvbmFsUGFyYW1zKS5sZW5ndGggPT09IDAgJiZcbiAgICAgIF8uZGlmZmVyZW5jZShwYXJhbXMsIHJlY2VpdmVkUGFyYW1zKS5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIC8vIHdlIGhhdmUgYSBzZXQgb2YgcGFyYW1ldGVycyB0aGF0IGlzIGNvcnJlY3RcbiAgICAgIC8vIHNvIHNob3J0LWNpcmN1aXRcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IGVycm9ycy5CYWRQYXJhbWV0ZXJzRXJyb3IocGFyYW1TZXRzLCByZWNlaXZlZFBhcmFtcyk7XG59XG5cbi8qXG4gKiBUaGlzIG1ldGhvZCB0YWtlcyAzIHBpZWNlcyBvZiBkYXRhOiByZXF1ZXN0IHBhcmFtZXRlcnMgKCdyZXF1ZXN0UGFyYW1zJyksXG4gKiBhIHJlcXVlc3QgSlNPTiBib2R5ICgnanNvbk9iaicpLCBhbmQgJ3BheWxvYWRQYXJhbXMnLCB3aGljaCBpcyB0aGUgc2VjdGlvblxuICogZnJvbSB0aGUgcm91dGUgZGVmaW5pdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZHBvaW50IHdoaWNoIGhhcyBpbnN0cnVjdGlvbnNcbiAqIG9uIGhhbmRsaW5nIHBhcmFtZXRlcnMuIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgb2YgYXJndW1lbnRzIHdoaWNoIHdpbGxcbiAqIGJlIGFwcGxpZWQgdG8gYSBjb21tYW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUFyZ3MocmVxdWVzdFBhcmFtcywganNvbk9iaiwgcGF5bG9hZFBhcmFtcywgcHJvdG9jb2wpIHtcbiAgLy8gV2Ugd2FudCB0byBwYXNzIHRoZSBcInVybFwiIHBhcmFtZXRlcnMgdG8gdGhlIGNvbW1hbmRzIGluIHJldmVyc2Ugb3JkZXJcbiAgLy8gc2luY2UgdGhlIGNvbW1hbmQgd2lsbCBzb21ldGltZXMgd2FudCB0byBpZ25vcmUsIHNheSwgdGhlIHNlc3Npb25JZC5cbiAgLy8gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBwdXR0aW5nIHNlc3Npb25JZCBsYXN0LCB3aGljaCBtZWFucyBpbiBKUyB3ZSBjYW5cbiAgLy8gb21pdCBpdCBmcm9tIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaWYgd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdC5cbiAgbGV0IHVybFBhcmFtcyA9IF8ua2V5cyhyZXF1ZXN0UGFyYW1zKS5yZXZlcnNlKCk7XG5cbiAgLy8gSW4gdGhlIHNpbXBsZSBjYXNlLCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgYSBiYXNpYyBhcnJheSBpblxuICAvLyBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkLCBzbyBzdGFydCB0aGVyZS4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXJlIGFyZVxuICAvLyBtdWx0aXBsZSBvcHRpb25hbCBzZXRzIG9mIHJlcXVpcmVkIHBhcmFtcywgdGhvdWdoLCBzbyBoYW5kbGUgdGhhdCBjYXNlXG4gIC8vIHRvby5cbiAgbGV0IHJlcXVpcmVkUGFyYW1zID0gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZDtcbiAgaWYgKF8uaXNBcnJheShfLmZpcnN0KHBheWxvYWRQYXJhbXMucmVxdWlyZWQpKSkge1xuICAgIC8vIElmIHRoZXJlIGFyZSBvcHRpb25hbCBzZXRzIG9mIHJlcXVpcmVkIHBhcmFtcywgdGhlbiB3ZSB3aWxsIGhhdmUgYW5cbiAgICAvLyBhcnJheSBvZiBhcnJheXMgaW4gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gbG9vcCB0aHJvdWdoIGVhY2ggc2V0IGFuZFxuICAgIC8vIHBpY2sgdGhlIG9uZSB0aGF0IG1hdGNoZXMgd2hpY2ggSlNPTiBwYXJhbXMgd2VyZSBhY3R1YWxseSBzZW50LiBXZSd2ZVxuICAgIC8vIGFscmVhZHkgYmVlbiB0aHJvdWdoIHZhbGlkYXRpb24gc28gd2UncmUgZ3VhcmFudGVlZCB0byBmaW5kIGEgbWF0Y2guXG4gICAgbGV0IGtleXMgPSBfLmtleXMoanNvbk9iaik7XG4gICAgZm9yIChsZXQgcGFyYW1zIG9mIHBheWxvYWRQYXJhbXMucmVxdWlyZWQpIHtcbiAgICAgIGlmIChfLndpdGhvdXQocGFyYW1zLCAuLi5rZXlzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB3ZSBjb25zdHJ1Y3Qgb3VyIGxpc3Qgb2YgYXJndW1lbnRzIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kXG4gIGxldCBhcmdzO1xuICBpZiAoXy5pc0Z1bmN0aW9uKHBheWxvYWRQYXJhbXMubWFrZUFyZ3MpKSB7XG4gICAgLy8gSW4gdGhlIHJvdXRlIHNwZWMsIGEgcGFydGljdWxhciByb3V0ZSBtaWdodCBkZWZpbmUgYSAnbWFrZUFyZ3MnIGZ1bmN0aW9uXG4gICAgLy8gaWYgaXQgd2FudHMgZnVsbCBjb250cm9sIG92ZXIgaG93IHRvIHR1cm4gSlNPTiBwYXJhbWV0ZXJzIGludG8gY29tbWFuZFxuICAgIC8vIGFyZ3VtZW50cy4gU28gd2UgcGFzcyBpdCB0aGUgSlNPTiBwYXJhbWV0ZXJzIGFuZCBpdCByZXR1cm5zIGFuIGFycmF5XG4gICAgLy8gd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBoYW5kbGluZyBjb21tYW5kLiBGb3IgZXhhbXBsZSBpZiBpdCByZXR1cm5zXG4gICAgLy8gWzEsIDIsIDNdLCB3ZSB3aWxsIGNhbGwgYGNvbW1hbmQoMSwgMiwgMywgLi4uKWAgKHVybCBwYXJhbXMgYXJlIHNlcGFyYXRlXG4gICAgLy8gZnJvbSBKU09OIHBhcmFtcyBhbmQgZ2V0IGNvbmNhdGVuYXRlZCBiZWxvdykuXG4gICAgYXJncyA9IHBheWxvYWRQYXJhbXMubWFrZUFyZ3MoanNvbk9iaiwgcHJvdG9jb2wpO1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSwgY29sbGVjdCBhbGwgdGhlIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBwYXJhbXMgYW5kIGZsYXR0ZW4gdGhlbVxuICAgIC8vIGludG8gYW4gYXJndW1lbnQgYXJyYXlcbiAgICBhcmdzID0gXy5mbGF0dGVuKHJlcXVpcmVkUGFyYW1zKS5tYXAoKHApID0+IGpzb25PYmpbcF0pO1xuICAgIGlmIChwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKSB7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoXy5mbGF0dGVuKHBheWxvYWRQYXJhbXMub3B0aW9uYWwpLm1hcCgocCkgPT4ganNvbk9ialtwXSkpO1xuICAgIH1cbiAgfVxuICAvLyBGaW5hbGx5LCBnZXQgb3VyIHVybCBwYXJhbXMgKHNlc3Npb24gaWQsIGVsZW1lbnQgaWQsIGV0Yy4uLikgb24gdGhlIGVuZCBvZlxuICAvLyB0aGUgbGlzdFxuICBhcmdzID0gYXJncy5jb25jYXQodXJsUGFyYW1zLm1hcCgodSkgPT4gcmVxdWVzdFBhcmFtc1t1XSkpO1xuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Db3JlfSBkcml2ZXJcbiAqIEByZXR1cm5zIHtpbXBvcnQoJy4uL2V4cHJlc3Mvc2VydmVyJykuUm91dGVDb25maWd1cmluZ0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24oZHJpdmVyKSB7XG4gIGlmICghZHJpdmVyLnNlc3Npb25FeGlzdHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgbXVzdCBpbXBsZW1lbnQgYHNlc3Npb25FeGlzdHNgIHByb3BlcnR5Jyk7XG4gIH1cblxuICAvLyBcImV4ZWN1dGVcIiBpc24ndCBkZWZpbmVkIGFueXdoZXJlXG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgaWYgKCEoZHJpdmVyLmV4ZWN1dGVDb21tYW5kIHx8IGRyaXZlci5leGVjdXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRHJpdmVycyBtdXN0IGltcGxlbWVudCBgZXhlY3V0ZUNvbW1hbmRgIG9yIGBleGVjdXRlYCBtZXRob2QnKTtcbiAgfVxuXG4gIC8vIHJldHVybiBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYWRkIGFsbCB0aGUgcm91dGVzIHRvIHRoZSBkcml2ZXIuIEhlcmUgZXh0cmFNZXRob2RzIG1pZ2h0IGJlXG4gIC8vIHBhc3NlZCBpbiBhcyBkZWZpbmVkIGJ5IEFwcGl1bSBwbHVnaW5zLCBzbyB3ZSBuZWVkIHRvIGFkZCB0aG9zZSB0byB0aGUgZGVmYXVsdCBsaXN0XG4gIHJldHVybiBmdW5jdGlvbiBhZGRSb3V0ZXMoYXBwLCB7YmFzZVBhdGggPSBERUZBVUxUX0JBU0VfUEFUSCwgZXh0cmFNZXRob2RNYXAgPSB7fX0gPSB7fSkge1xuICAgIC8vIHN0b3JlIGJhc2VQYXRoIG9uIHRoZSBkcml2ZXIgaW5zdGFuY2Ugc28gaXQgY2FuIHVzZSBpdCBpZiBuZWNlc3NhcnlcbiAgICAvLyBmb3IgZXhhbXBsZSBpbiBkZXRlcm1pbmluZyBwcm94eSBhdm9pZGFuY2VcbiAgICBkcml2ZXIuYmFzZVBhdGggPSBiYXNlUGF0aDtcblxuICAgIGNvbnN0IGFsbE1ldGhvZHMgPSB7Li4uTUVUSE9EX01BUCwgLi4uZXh0cmFNZXRob2RNYXB9O1xuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgbWV0aG9kc10gb2YgXy50b1BhaXJzKGFsbE1ldGhvZHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2QsIHNwZWNdIG9mIF8udG9QYWlycyhtZXRob2RzKSkge1xuICAgICAgICAvLyBzZXQgdXAgdGhlIGV4cHJlc3Mgcm91dGUgaGFuZGxlclxuICAgICAgICBidWlsZEhhbmRsZXIoXG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBgJHtiYXNlUGF0aH0ke3BhdGh9YCxcbiAgICAgICAgICBzcGVjLFxuICAgICAgICAgIGRyaXZlcixcbiAgICAgICAgICBpc1Nlc3Npb25Db21tYW5kKHNwZWMuY29tbWFuZClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSGFuZGxlcihhcHAsIG1ldGhvZCwgcGF0aCwgc3BlYywgZHJpdmVyLCBpc1Nlc3NDbWQpIHtcbiAgbGV0IGFzeW5jSGFuZGxlciA9IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGxldCBqc29uT2JqID0gcmVxLmJvZHk7XG4gICAgbGV0IGh0dHBSZXNCb2R5ID0ge307XG4gICAgbGV0IGh0dHBTdGF0dXMgPSAyMDA7XG4gICAgbGV0IG5ld1Nlc3Npb25JZDtcbiAgICBsZXQgY3VycmVudFByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGlmIHRoaXMgaXMgYSBzZXNzaW9uIGNvbW1hbmQgYnV0IHdlIGRvbid0IGhhdmUgYSBzZXNzaW9uLFxuICAgICAgLy8gZXJyb3Igb3V0IGVhcmx5IChlc3BlY2lhbGx5IGJlZm9yZSBwcm94eWluZylcbiAgICAgIGlmIChpc1Nlc3NDbWQgJiYgIWRyaXZlci5zZXNzaW9uRXhpc3RzKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaERyaXZlckVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBkcml2ZXIgaXMgY3VycmVudGx5IHByb3h5aW5nIGNvbW1hbmRzIHRvIGFub3RoZXIgSlNPTldQIHNlcnZlciwgYnlwYXNzIGFsbCBvdXJcbiAgICAgIC8vIGNoZWNrcyBhbmQgYXNzdW1lIHRoZSB1cHN0cmVhbSBzZXJ2ZXIga25vd3Mgd2hhdCBpdCdzIGRvaW5nLiBCdXQga2VlcCB0aGlzIGluIHRoZVxuICAgICAgLy8gdHJ5L2NhdGNoIGJsb2NrIHNvIGlmIHByb3h5aW5nIGl0c2VsZiBmYWlscywgd2UgZ2l2ZSBhIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4gT2YgY291cnNlIHdlXG4gICAgICAvLyBvbmx5IHdhbnQgdG8gZG8gdGhlc2Ugd2hlbiB3ZSBoYXZlIGEgc2Vzc2lvbiBjb21tYW5kOyB0aGUgQXBwaXVtIGRyaXZlciBtdXN0IGJlXG4gICAgICAvLyByZXNwb25zaWJsZSBmb3Igc3RhcnQvc3RvcCBzZXNzaW9uLCBldGMuLi4gV2UgYWxzbyBhbGxvdyB0aGUgY29tbWFuZCBzcGVjIHRvIGRlY2xhcmUgdGhhdFxuICAgICAgLy8gdGhpcyBjb21tYW5kIHNob3VsZCBuZXZlciBiZSBwcm94aWVkICh3aGljaCBpcyB1c2VmdWwgZm9yIHBsdWdpbiBkZXZlbG9wZXJzIHdobyBhZGRcbiAgICAgIC8vIGNvbW1hbmRzIGFuZCBnZW5lcmFsbHkgd291bGQgbm90IHdhbnQgdGhhdCBjb21tYW5kIHRvIGJlIHByb3hpZWQgaW5zdGVhZCBvZiBoYW5kbGVkIGJ5IHRoZVxuICAgICAgLy8gcGx1Z2luKVxuICAgICAgbGV0IGRpZFBsdWdpbk92ZXJyaWRlUHJveHkgPSBmYWxzZTtcbiAgICAgIGlmIChpc1Nlc3NDbWQgJiYgIXNwZWMubmV2ZXJQcm94eSAmJiBkcml2ZXJTaG91bGREb0p3cFByb3h5KGRyaXZlciwgcmVxLCBzcGVjLmNvbW1hbmQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZHJpdmVyLnBsdWdpbnNUb0hhbmRsZUNtZCB8fFxuICAgICAgICAgIGRyaXZlci5wbHVnaW5zVG9IYW5kbGVDbWQoc3BlYy5jb21tYW5kLCByZXEucGFyYW1zLnNlc3Npb25JZCkubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IGRvSndwUHJveHkoZHJpdmVyLCByZXEsIHJlcyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5kZWJ1ZyhcbiAgICAgICAgICBgV291bGQgaGF2ZSBwcm94aWVkIGAgK1xuICAgICAgICAgICAgYGNvbW1hbmQgZGlyZWN0bHksIGJ1dCBhIHBsdWdpbiBleGlzdHMgd2hpY2ggbWlnaHQgcmVxdWlyZSBpdHMgdmFsdWUsIHNvIHdpbGwgbGV0IGAgK1xuICAgICAgICAgICAgYGl0cyB2YWx1ZSBiZSBjb2xsZWN0ZWQgaW50ZXJuYWxseSBhbmQgbWFkZSBwYXJ0IG9mIHBsdWdpbiBjaGFpbmBcbiAgICAgICAgKTtcbiAgICAgICAgZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIGEgY29tbWFuZCBpcyBub3QgaW4gb3VyIG1ldGhvZCBtYXAsIGl0J3MgYmVjYXVzZSB3ZVxuICAgICAgLy8gaGF2ZSBubyBwbGFucyB0byBldmVyIGltcGxlbWVudCBpdFxuICAgICAgaWYgKCFzcGVjLmNvbW1hbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIHdyYXAgcGFyYW1zIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHNwZWMucGF5bG9hZFBhcmFtcyAmJiBzcGVjLnBheWxvYWRQYXJhbXMud3JhcCkge1xuICAgICAgICBqc29uT2JqID0gd3JhcFBhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmopO1xuICAgICAgfVxuXG4gICAgICAvLyB1bndyYXAgcGFyYW1zIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHNwZWMucGF5bG9hZFBhcmFtcyAmJiBzcGVjLnBheWxvYWRQYXJhbXMudW53cmFwKSB7XG4gICAgICAgIGpzb25PYmogPSB1bndyYXBQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICAvLyB0cnkgdG8gZGV0ZXJtaW5lIHByb3RvY29sIGJ5IHNlc3Npb24gY3JlYXRpb24gYXJncywgc28gd2UgY2FuIHRocm93IGFcbiAgICAgICAgLy8gcHJvcGVybHkgZm9ybWF0dGVkIGVycm9yIGlmIGFyZ3VtZW50cyB2YWxpZGF0aW9uIGZhaWxzXG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKFxuICAgICAgICAgIG1ha2VBcmdzKHJlcS5wYXJhbXMsIGpzb25PYmosIHNwZWMucGF5bG9hZFBhcmFtcyB8fCB7fSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIGpzb24gcGF5bG9hZCBjb25mb3JtcyB0byB0aGUgc3BlY1xuICAgICAgY2hlY2tQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqLCBjdXJyZW50UHJvdG9jb2wpO1xuXG4gICAgICAvLyB0dXJuIHRoZSBjb21tYW5kIGFuZCBqc29uIHBheWxvYWQgaW50byBhbiBhcmd1bWVudCBsaXN0IGZvclxuICAgICAgLy8gdGhlIGRyaXZlciBtZXRob2RzXG4gICAgICBsZXQgYXJncyA9IG1ha2VBcmdzKHJlcS5wYXJhbXMsIGpzb25PYmosIHNwZWMucGF5bG9hZFBhcmFtcyB8fCB7fSwgY3VycmVudFByb3RvY29sKTtcbiAgICAgIGxldCBkcml2ZXJSZXM7XG4gICAgICAvLyB2YWxpZGF0ZSBjb21tYW5kIGFyZ3MgYWNjb3JkaW5nIHRvIE1KU09OV1BcbiAgICAgIGlmICh2YWxpZGF0b3JzW3NwZWMuY29tbWFuZF0pIHtcbiAgICAgICAgdmFsaWRhdG9yc1tzcGVjLmNvbW1hbmRdKC4uLmFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBydW4gdGhlIGRyaXZlciBjb21tYW5kIHdyYXBwZWQgaW5zaWRlIHRoZSBhcmd1bWVudCB2YWxpZGF0b3JzXG4gICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkuZGVidWcoXG4gICAgICAgIGBDYWxsaW5nIGAgK1xuICAgICAgICAgIGAke2RyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfS4ke3NwZWMuY29tbWFuZH0oKSB3aXRoIGFyZ3M6IGAgK1xuICAgICAgICAgIF8udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoYXJncyksIHtsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEh9KVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpZFBsdWdpbk92ZXJyaWRlUHJveHkpIHtcbiAgICAgICAgLy8gVE9ETyBmb3Igbm93IHdlIGFkZCB0aGlzIGluZm9ybWF0aW9uIG9uIHRoZSBhcmdzIGxpc3QsIGJ1dCB0aGF0J3MgbWl4aW5nIHB1cnBvc2VzIGhlcmUuXG4gICAgICAgIC8vIFdlIHJlYWxseSBzaG91bGQgYWRkIGFub3RoZXIgJ29wdGlvbnMnIHBhcmFtZXRlciB0byAnZXhlY3V0ZUNvbW1hbmQnLCBidXQgdGhpcyB3b3VsZCBiZVxuICAgICAgICAvLyBhIGJyZWFraW5nIGNoYW5nZSBmb3IgYWxsIGRyaXZlcnMgc28gd291bGQgbmVlZCB0byBiZSBoYW5kbGVkIGNhcmVmdWxseS5cbiAgICAgICAgYXJncy5wdXNoKHtyZXFGb3JQcm94eTogcmVxfSk7XG4gICAgICB9XG5cbiAgICAgIGRyaXZlclJlcyA9IGF3YWl0IGRyaXZlci5leGVjdXRlQ29tbWFuZChzcGVjLmNvbW1hbmQsIC4uLmFyZ3MpO1xuXG4gICAgICAvLyBHZXQgdGhlIHByb3RvY29sIGFmdGVyIGV4ZWN1dGVDb21tYW5kXG4gICAgICBjdXJyZW50UHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkgfHwgY3VycmVudFByb3RvY29sO1xuXG4gICAgICAvLyBJZiBgZXhlY3V0ZUNvbW1hbmRgIHdhcyBvdmVycmlkZGVuIGFuZCB0aGUgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0XG4gICAgICAvLyB3aXRoIGEgcHJvdG9jb2wgYW5kIHZhbHVlL2Vycm9yIHByb3BlcnR5LCByZS1hc3NpZ24gdGhlIHByb3RvY29sXG4gICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGRyaXZlclJlcykgJiYgXy5oYXMoZHJpdmVyUmVzLCAncHJvdG9jb2wnKSkge1xuICAgICAgICBjdXJyZW50UHJvdG9jb2wgPSBkcml2ZXJSZXMucHJvdG9jb2wgfHwgY3VycmVudFByb3RvY29sO1xuICAgICAgICBpZiAoZHJpdmVyUmVzLmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZHJpdmVyUmVzLmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGRyaXZlclJlcyA9IGRyaXZlclJlcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdW5wYWNrIGNyZWF0ZVNlc3Npb24gcmVzcG9uc2VcbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgbmV3U2Vzc2lvbklkID0gZHJpdmVyUmVzWzBdO1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCBuZXdTZXNzaW9uSWQpLmRlYnVnKFxuICAgICAgICAgIGBDYWNoZWQgdGhlIHByb3RvY29sIHZhbHVlICcke2N1cnJlbnRQcm90b2NvbH0nIGZvciB0aGUgbmV3IHNlc3Npb24gJHtuZXdTZXNzaW9uSWR9YFxuICAgICAgICApO1xuICAgICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuTUpTT05XUCkge1xuICAgICAgICAgIGRyaXZlclJlcyA9IGRyaXZlclJlc1sxXTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBkcml2ZXJSZXMgPSB7XG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IGRyaXZlclJlc1sxXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRyaXZlclJlcyA9IGZvcm1hdFJlc3BvbnNlVmFsdWUoZHJpdmVyUmVzKTtcblxuICAgICAgLy8gZGVsZXRlIHNob3VsZCBub3QgcmV0dXJuIGFueXRoaW5nIGV2ZW4gaWYgc3VjY2Vzc2Z1bFxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkuZGVidWcoXG4gICAgICAgICAgYFJlY2VpdmVkIHJlc3BvbnNlOiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge1xuICAgICAgICAgICAgbGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RILFxuICAgICAgICAgIH0pfWBcbiAgICAgICAgKTtcbiAgICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmRlYnVnKCdCdXQgZGVsZXRpbmcgc2Vzc2lvbiwgc28gbm90IHJldHVybmluZycpO1xuICAgICAgICBkcml2ZXJSZXMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgc3RhdHVzIGlzIG5vdCAwLCAgdGhyb3cgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGZvciBzdGF0dXMgY29kZS5cbiAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGRyaXZlclJlcykpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHV0aWwuaGFzVmFsdWUoZHJpdmVyUmVzLnN0YXR1cykgJiZcbiAgICAgICAgICAhaXNOYU4oZHJpdmVyUmVzLnN0YXR1cykgJiZcbiAgICAgICAgICBwYXJzZUludChkcml2ZXJSZXMuc3RhdHVzLCAxMCkgIT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUoZHJpdmVyUmVzLnN0YXR1cywgZHJpdmVyUmVzLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3QoZHJpdmVyUmVzLnZhbHVlKSAmJiBkcml2ZXJSZXMudmFsdWUuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21XM0NKc29uQ29kZShcbiAgICAgICAgICAgIGRyaXZlclJlcy52YWx1ZS5lcnJvcixcbiAgICAgICAgICAgIGRyaXZlclJlcy52YWx1ZS5tZXNzYWdlLFxuICAgICAgICAgICAgZHJpdmVyUmVzLnZhbHVlLnN0YWNrdHJhY2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGh0dHBSZXNCb2R5LnZhbHVlID0gZHJpdmVyUmVzO1xuICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkKS5kZWJ1ZyhcbiAgICAgICAgYFJlc3BvbmRpbmcgYCArXG4gICAgICAgICAgYHRvIGNsaWVudCB3aXRoIGRyaXZlci4ke3NwZWMuY29tbWFuZH0oKSByZXN1bHQ6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkcml2ZXJSZXMpLCB7XG4gICAgICAgICAgICBsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEgsXG4gICAgICAgICAgfSl9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIGZpZ3VyZSBvdXQgd2hhdCBvdXIgcmVzcG9uc2Ugc2hvdWxkIGJlXG4gICAgICAvLyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBlcnJvciB0aGF0IHdlIGVuY291bnRlcmVkXG4gICAgICBsZXQgYWN0dWFsRXJyID0gZXJyO1xuXG4gICAgICBjdXJyZW50UHJvdG9jb2wgPVxuICAgICAgICBjdXJyZW50UHJvdG9jb2wgfHwgZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkKTtcblxuICAgICAgbGV0IGVyck1zZyA9IGVyci5zdGFja3RyYWNlIHx8IGVyci5zdGFjaztcbiAgICAgIGlmICghXy5pbmNsdWRlcyhlcnJNc2csIGVyci5tZXNzYWdlKSkge1xuICAgICAgICAvLyBpZiB0aGUgbWVzc2FnZSBoYXMgbW9yZSBpbmZvcm1hdGlvbiwgYWRkIGl0LiBidXQgb2Z0ZW4gdGhlIG1lc3NhZ2VcbiAgICAgICAgLy8gaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHN0YWNrIHRyYWNlXG4gICAgICAgIGVyck1zZyA9IGAke2Vyci5tZXNzYWdlfSR7ZXJyTXNnID8gJ1xcbicgKyBlcnJNc2cgOiAnJ31gO1xuICAgICAgfVxuICAgICAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKSkge1xuICAgICAgICBhY3R1YWxFcnIgPSBlcnIuZ2V0QWN0dWFsRXJyb3IoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkIHx8IG5ld1Nlc3Npb25JZCkuZGVidWcoXG4gICAgICAgICAgYEVuY291bnRlcmVkIGludGVybmFsIGVycm9yIHJ1bm5pbmcgY29tbWFuZDogJHtlcnJNc2d9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBbaHR0cFN0YXR1cywgaHR0cFJlc0JvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihhY3R1YWxFcnIpO1xuICAgIH1cblxuICAgIC8vIGRlY29kZSB0aGUgcmVzcG9uc2UsIHdoaWNoIGlzIGVpdGhlciBhIHN0cmluZyBvciBqc29uXG4gICAgaWYgKF8uaXNTdHJpbmcoaHR0cFJlc0JvZHkpKSB7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLnNlbmQoaHR0cFJlc0JvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3U2Vzc2lvbklkKSB7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBodHRwUmVzQm9keS52YWx1ZS5zZXNzaW9uSWQgPSBuZXdTZXNzaW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodHRwUmVzQm9keS5zZXNzaW9uSWQgPSByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBudWxsO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBzZXNzaW9uSWQgaW4gVzNDIHJlc3BvbnNlc1xuICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICBkZWxldGUgaHR0cFJlc0JvZHkuc2Vzc2lvbklkO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keSA9IGZvcm1hdFN0YXR1cyhodHRwUmVzQm9keSk7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLmpzb24oaHR0cFJlc0JvZHkpO1xuICAgIH1cbiAgfTtcbiAgLy8gYWRkIHRoZSBtZXRob2QgdG8gdGhlIGFwcFxuICBhcHBbbWV0aG9kLnRvTG93ZXJDYXNlKCldKHBhdGgsIChyZXEsIHJlcykgPT4ge1xuICAgIEIucmVzb2x2ZShhc3luY0hhbmRsZXIocmVxLCByZXMpKS5kb25lKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkcml2ZXJTaG91bGREb0p3cFByb3h5KGRyaXZlciwgcmVxLCBjb21tYW5kKSB7XG4gIC8vIGRyaXZlcnMgbmVlZCB0byBleHBsaWNpdGx5IHNheSB3aGVuIHRoZSBwcm94eSBpcyBhY3RpdmVcbiAgaWYgKCFkcml2ZXIucHJveHlBY3RpdmUocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gd2Ugc2hvdWxkIG5ldmVyIHByb3h5IGRlbGV0ZVNlc3Npb24gYmVjYXVzZSB3ZSBuZWVkIHRvIGdpdmUgdGhlIGNvbnRhaW5pbmdcbiAgLy8gZHJpdmVyIGFuIG9wcG9ydHVuaXR5IHRvIGNsZWFuIGl0c2VsZiB1cFxuICBpZiAoY29tbWFuZCA9PT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHZhbGlkYXRlIGF2b2lkYW5jZSBzY2hlbWEsIGFuZCBzYXkgd2Ugc2hvdWxkbid0IHByb3h5IGlmIGFueXRoaW5nIGluIHRoZVxuICAvLyBhdm9pZCBsaXN0IG1hdGNoZXMgb3VyIHJlcVxuICBpZiAoZHJpdmVyLnByb3h5Um91dGVJc0F2b2lkZWQocmVxLnBhcmFtcy5zZXNzaW9uSWQsIHJlcS5tZXRob2QsIHJlcS5vcmlnaW5hbFVybCwgcmVxLmJvZHkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvSndwUHJveHkoZHJpdmVyLCByZXEsIHJlcykge1xuICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkuaW5mbyhcbiAgICAnRHJpdmVyIHByb3h5IGFjdGl2ZSwgcGFzc2luZyByZXF1ZXN0IG9uIHZpYSBIVFRQIHByb3h5J1xuICApO1xuXG4gIC8vIGNoZWNrIHRoYXQgdGhlIGlubmVyIGRyaXZlciBoYXMgYSBwcm94eSBmdW5jdGlvblxuICBpZiAoIWRyaXZlci5jYW5Qcm94eShyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyeWluZyB0byBwcm94eSB0byBhIHNlcnZlciBidXQgdGhlIGRyaXZlciBpcyB1bmFibGUgdG8gcHJveHknKTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGRyaXZlci5leGVjdXRlQ29tbWFuZCgncHJveHlSZXFSZXMnLCByZXEsIHJlcywgcmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IpKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHByb3h5LiBQcm94eSBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLFxuICBpc1Nlc3Npb25Db21tYW5kLFxuICBkcml2ZXJTaG91bGREb0p3cFByb3h5LFxuICBkZXRlcm1pbmVQcm90b2NvbCxcbiAgQ1JFQVRFX1NFU1NJT05fQ09NTUFORCxcbiAgREVMRVRFX1NFU1NJT05fQ09NTUFORCxcbiAgR0VUX1NUQVRVU19DT01NQU5ELFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxzQkFBc0IsR0FBRyxlQUEvQjs7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxlQUEvQjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxXQUEzQjs7O0FBRUEsU0FBU0MsaUJBQVQsQ0FBMkJDLGlCQUEzQixFQUE4QztFQUM1QyxPQUFPQyxlQUFBLENBQUVDLElBQUYsQ0FBT0YsaUJBQVAsRUFBMEJHLHVCQUExQixJQUF1Q0Msb0JBQUEs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
|
|
394
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIkdFVF9TVEFUVVNfQ09NTUFORCIsImRldGVybWluZVByb3RvY29sIiwiY3JlYXRlU2Vzc2lvbkFyZ3MiLCJfIiwic29tZSIsImlzVzNjQ2FwcyIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiaXNTZXNzaW9uQ29tbWFuZCIsImNvbW1hbmQiLCJpbmNsdWRlcyIsIk5PX1NFU1NJT05fSURfQ09NTUFORFMiLCJnZXRMb2dnZXIiLCJsb2ciLCJpbmZvIiwibG9nUHJlZml4IiwiY29uc3RydWN0b3IiLCJuYW1lIiwibm9kZSIsImdldE9iamVjdElkIiwic3Vic3RyaW5nIiwibG9nZ2VyIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsImRpZFBsdWdpbk92ZXJyaWRlUHJveHkiLCJuZXZlclByb3h5IiwiZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImRvSndwUHJveHkiLCJkZWJ1ZyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJkcml2ZXJSZXMiLCJ2YWxpZGF0b3JzIiwidHJ1bmNhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiTUFYX0xPR19CT0RZX0xFTkdUSCIsInJlcUZvclByb3h5IiwiaXNQbGFpbk9iamVjdCIsImhhcyIsImVycm9yIiwidmFsdWUiLCJjYXBhYmlsaXRpZXMiLCJmb3JtYXRSZXNwb25zZVZhbHVlIiwidXRpbCIsImhhc1ZhbHVlIiwic3RhdHVzIiwiaXNOYU4iLCJwYXJzZUludCIsImVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlIiwiZXJyb3JGcm9tVzNDSnNvbkNvZGUiLCJzdGFja3RyYWNlIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJpc0Vycm9yVHlwZSIsIlByb3h5UmVxdWVzdEVycm9yIiwiZ2V0QWN0dWFsRXJyb3IiLCJnZXRSZXNwb25zZUZvclczQ0Vycm9yIiwiaXNTdHJpbmciLCJzZW5kIiwiZm9ybWF0U3RhdHVzIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJjYW5Qcm94eSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHt1dGlsLCBsb2dnZXIsIG5vZGV9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQge3ZhbGlkYXRvcnN9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuICBlcnJvcnMsXG4gIGlzRXJyb3JUeXBlLFxuICBnZXRSZXNwb25zZUZvclczQ0Vycm9yLFxuICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSxcbiAgZXJyb3JGcm9tVzNDSnNvbkNvZGUsXG59IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7TUVUSE9EX01BUCwgTk9fU0VTU0lPTl9JRF9DT01NQU5EU30gZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtmb3JtYXRSZXNwb25zZVZhbHVlLCBmb3JtYXRTdGF0dXN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge01BWF9MT0dfQk9EWV9MRU5HVEgsIFBST1RPQ09MUywgREVGQVVMVF9CQVNFX1BBVEh9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge2lzVzNjQ2Fwc30gZnJvbSAnLi4vaGVscGVycy9jYXBhYmlsaXRpZXMnO1xuXG5jb25zdCBDUkVBVEVfU0VTU0lPTl9DT01NQU5EID0gJ2NyZWF0ZVNlc3Npb24nO1xuY29uc3QgREVMRVRFX1NFU1NJT05fQ09NTUFORCA9ICdkZWxldGVTZXNzaW9uJztcbmNvbnN0IEdFVF9TVEFUVVNfQ09NTUFORCA9ICdnZXRTdGF0dXMnO1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVQcm90b2NvbChjcmVhdGVTZXNzaW9uQXJncykge1xuICByZXR1cm4gXy5zb21lKGNyZWF0ZVNlc3Npb25BcmdzLCBpc1czY0NhcHMpID8gUFJPVE9DT0xTLlczQyA6IFBST1RPQ09MUy5NSlNPTldQO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9IF8uaXNGdW5jdGlvbihkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbilcbiAgICA/IGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKHNlc3Npb25JZClcbiAgICA6IGRyaXZlcjtcbiAgaWYgKGRzdERyaXZlciA9PT0gZHJpdmVyKSB7XG4gICAgLy8gU2hvcnRjaXJjdWl0IGlmIHRoZSBkcml2ZXIgaW5zdGFuY2UgaXMgbm90IGFuIHVtYnJlbGxhIGRyaXZlclxuICAgIC8vIG9yIGl0IGlzIEZha2UgZHJpdmVyIGluc3RhbmNlLCB3aGVyZSBgZHJpdmVyLmRyaXZlckZvclNlc3Npb25gXG4gICAgLy8gYWx3YXlzIHJldHVybnMgc2VsZiBpbnN0YW5jZVxuICAgIHJldHVybiBkcml2ZXIucHJvdG9jb2w7XG4gIH1cblxuICAvLyBFeHRyYWN0IHRoZSBwcm90b2NvbCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZiB0aGUgZ2l2ZW4gZHJpdmVyIGlzIHRoZSB1bWJyZWxsYSBvbmVcbiAgcmV0dXJuIGRzdERyaXZlcj8ucHJvdG9jb2wgPz8gUFJPVE9DT0xTLlczQztcbn1cblxuZnVuY3Rpb24gaXNTZXNzaW9uQ29tbWFuZChjb21tYW5kKSB7XG4gIHJldHVybiAhXy5pbmNsdWRlcyhOT19TRVNTSU9OX0lEX0NPTU1BTkRTLCBjb21tYW5kKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlcm5hbERyaXZlcn0gZHJpdmVyXG4gKiBAcGFyYW0ge3N0cmluZz99IFtzZXNzaW9uSWRdXG4gKiBAcmV0dXJucyB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtTG9nZ2VyfVxuICovXG5mdW5jdGlvbiBnZXRMb2dnZXIoZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9XG4gICAgc2Vzc2lvbklkICYmIF8uaXNGdW5jdGlvbihkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbilcbiAgICAgID8gZHJpdmVyLmRyaXZlckZvclNlc3Npb24oc2Vzc2lvbklkKSA/PyBkcml2ZXJcbiAgICAgIDogZHJpdmVyO1xuICBpZiAoXy5pc0Z1bmN0aW9uKGRzdERyaXZlci5sb2c/LmluZm8pKSB7XG4gICAgcmV0dXJuIGRzdERyaXZlci5sb2c7XG4gIH1cblxuICBsZXQgbG9nUHJlZml4ID0gZHN0RHJpdmVyLmNvbnN0cnVjdG9yXG4gICAgPyBgJHtkc3REcml2ZXIuY29uc3RydWN0b3IubmFtZX1AJHtub2RlLmdldE9iamVjdElkKGRzdERyaXZlcikuc3Vic3RyaW5nKDAsIDgpfWBcbiAgICA6ICdBcHBpdW1Ecml2ZXInO1xuICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgbG9nUHJlZml4ICs9IGAgKCR7c2Vzc2lvbklkLnN1YnN0cmluZygwLCA4KX0pYDtcbiAgfVxuICByZXR1cm4gbG9nZ2VyLmdldExvZ2dlcihsb2dQcmVmaXgpO1xufVxuXG5mdW5jdGlvbiB3cmFwUGFyYW1zKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBwZXJmb3JtVG91Y2ggd2hpY2ggdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIgKHByaW1pdGl2ZSB0eXBlIG9yIGFycmF5KS5cbiAgICogU29tZSBkcml2ZXJzIGNob29zZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFzIGEgdmFsdWUgKGVnLiBbYWN0aW9uMSwgYWN0aW9uMi4uLl0pIHdoaWxlIG90aGVycyB0b1xuICAgKiB3cmFwIGl0IHdpdGhpbiBhbiBvYmplY3QoZWcnIHtnZXN0dXJlOiAgW2FjdGlvbjEsIGFjdGlvbjIuLi5dfSksIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gdmFsaWRhdGUuXG4gICAqIFRoZSB3cmFwIG9wdGlvbiBpbiB0aGUgc3BlYyBlbmZvcmNlIHdyYXBwaW5nIGJlZm9yZSB2YWxpZGF0aW9uLCBzbyB0aGF0IGFsbCBwYXJhbXMgYXJlIHdyYXBwZWQgYXRcbiAgICogdGhlIHRpbWUgdGhleSBhcmUgdmFsaWRhdGVkIGFuZCBsYXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmRzLlxuICAgKi9cbiAgbGV0IHJlcyA9IGpzb25PYmo7XG4gIGlmIChfLmlzQXJyYXkoanNvbk9iaikgfHwgIV8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICByZXMgPSB7fTtcbiAgICByZXNbcGFyYW1TZXRzLndyYXBdID0ganNvbk9iajtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJhbXMocGFyYW1TZXRzLCBqc29uT2JqKSB7XG4gIC8qIFRoZXJlIGFyZSBjb21tYW5kcyBsaWtlIHNldE5ldHdvcmtDb25uZWN0aW9uIHdoaWNoIHNlbmQgcGFyYW1ldGVycyB3cmFwcGVkIGluc2lkZSBhIGtleSBzdWNoIGFzXG4gICAqIFwicGFyYW1ldGVyc1wiLiBUaGlzIGZ1bmN0aW9uIHVud3JhcHMgdGhlbSAoZWcuIHtcInBhcmFtZXRlcnNcIjoge1widHlwZVwiOiAxfX0gYmVjb21lcyB7XCJ0eXBlXCI6IDF9KS5cbiAgICovXG4gIGxldCByZXMgPSBqc29uT2JqO1xuICBpZiAoXy5pc09iamVjdChqc29uT2JqKSkge1xuICAgIC8vIHNvbWUgY2xpZW50cywgbGlrZSBydWJ5LCBkb24ndCB3cmFwXG4gICAgaWYgKGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF0pIHtcbiAgICAgIHJlcyA9IGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BhcmFtcyhwYXJhbVNldHMsIGpzb25PYmosIHByb3RvY29sKSB7XG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IFtdO1xuICBsZXQgb3B0aW9uYWxQYXJhbXMgPSBbXTtcbiAgbGV0IHJlY2VpdmVkUGFyYW1zID0gXy5rZXlzKGpzb25PYmopO1xuXG4gIGlmIChwYXJhbVNldHMpIHtcbiAgICBpZiAocGFyYW1TZXRzLnJlcXVpcmVkKSB7XG4gICAgICAvLyB3ZSBtaWdodCBoYXZlIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMsXG4gICAgICAvLyBvciBhbiBhcnJheSBvZiBhcnJheXMgb2YgcGFyYW1ldGVycywgc28gc3RhbmRhcmRpemVcbiAgICAgIGlmICghXy5pc0FycmF5KF8uZmlyc3QocGFyYW1TZXRzLnJlcXVpcmVkKSkpIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBbcGFyYW1TZXRzLnJlcXVpcmVkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1TZXRzLnJlcXVpcmVkO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBqdXN0IGFuIGFycmF5XG4gICAgaWYgKHBhcmFtU2V0cy5vcHRpb25hbCkge1xuICAgICAgb3B0aW9uYWxQYXJhbXMgPSBwYXJhbVNldHMub3B0aW9uYWw7XG4gICAgfVxuXG4gICAgLy8gSWYgYSBmdW5jdGlvbiB3YXMgcHJvdmlkZWQgYXMgdGhlICd2YWxpZGF0ZScga2V5LCBpdCB3aWxsIGhlcmUgYmUgY2FsbGVkIHdpdGhcbiAgICAvLyBqc29uT2JqIGFzIHRoZSBwYXJhbS4gSWYgaXQgcmV0dXJucyBzb21ldGhpbmcgZmFsc3ksIHZlcmlmaWNhdGlvbiB3aWxsIGJlXG4gICAgLy8gY29uc2lkZXJlZCB0byBoYXZlIHBhc3NlZC4gSWYgaXQgcmV0dXJucyBzb21ldGhpbmcgZWxzZSwgdGhhdCB3aWxsIGJlIHRoZVxuICAgIC8vIGFyZ3VtZW50IHRvIGFuIGVycm9yIHdoaWNoIGlzIHRocm93biB0byB0aGUgdXNlclxuICAgIGlmIChwYXJhbVNldHMudmFsaWRhdGUpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gcGFyYW1TZXRzLnZhbGlkYXRlKGpzb25PYmosIHByb3RvY29sKTtcbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKG1lc3NhZ2UsIGpzb25PYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGhhdmUgbm8gcmVxdWlyZWQgcGFyYW1ldGVycywgYWxsIGlzIHdlbGxcbiAgaWYgKHJlcXVpcmVkUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHNvbWUgY2xpZW50cyBwYXNzIGluIHRoZSBzZXNzaW9uIGlkIGluIHRoZSBwYXJhbXNcbiAgaWYgKG9wdGlvbmFsUGFyYW1zLmluZGV4T2YoJ3Nlc3Npb25JZCcpID09PSAtMSkge1xuICAgIG9wdGlvbmFsUGFyYW1zLnB1c2goJ3Nlc3Npb25JZCcpO1xuICB9XG5cbiAgLy8gc29tZSBjbGllbnRzIHBhc3MgaW4gYW4gZWxlbWVudCBpZCBpbiB0aGUgcGFyYW1zXG4gIGlmIChvcHRpb25hbFBhcmFtcy5pbmRleE9mKCdpZCcpID09PSAtMSkge1xuICAgIG9wdGlvbmFsUGFyYW1zLnB1c2goJ2lkJyk7XG4gIH1cblxuICAvLyBnbyB0aHJvdWdoIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzIGFuZCBjaGVjayBhZ2FpbnN0IG91ciBhcmd1bWVudHNcbiAgZm9yIChsZXQgcGFyYW1zIG9mIHJlcXVpcmVkUGFyYW1zKSB7XG4gICAgaWYgKFxuICAgICAgXy5kaWZmZXJlbmNlKHJlY2VpdmVkUGFyYW1zLCBwYXJhbXMsIG9wdGlvbmFsUGFyYW1zKS5sZW5ndGggPT09IDAgJiZcbiAgICAgIF8uZGlmZmVyZW5jZShwYXJhbXMsIHJlY2VpdmVkUGFyYW1zKS5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIC8vIHdlIGhhdmUgYSBzZXQgb2YgcGFyYW1ldGVycyB0aGF0IGlzIGNvcnJlY3RcbiAgICAgIC8vIHNvIHNob3J0LWNpcmN1aXRcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IGVycm9ycy5CYWRQYXJhbWV0ZXJzRXJyb3IocGFyYW1TZXRzLCByZWNlaXZlZFBhcmFtcyk7XG59XG5cbi8qXG4gKiBUaGlzIG1ldGhvZCB0YWtlcyAzIHBpZWNlcyBvZiBkYXRhOiByZXF1ZXN0IHBhcmFtZXRlcnMgKCdyZXF1ZXN0UGFyYW1zJyksXG4gKiBhIHJlcXVlc3QgSlNPTiBib2R5ICgnanNvbk9iaicpLCBhbmQgJ3BheWxvYWRQYXJhbXMnLCB3aGljaCBpcyB0aGUgc2VjdGlvblxuICogZnJvbSB0aGUgcm91dGUgZGVmaW5pdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZHBvaW50IHdoaWNoIGhhcyBpbnN0cnVjdGlvbnNcbiAqIG9uIGhhbmRsaW5nIHBhcmFtZXRlcnMuIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgb2YgYXJndW1lbnRzIHdoaWNoIHdpbGxcbiAqIGJlIGFwcGxpZWQgdG8gYSBjb21tYW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUFyZ3MocmVxdWVzdFBhcmFtcywganNvbk9iaiwgcGF5bG9hZFBhcmFtcywgcHJvdG9jb2wpIHtcbiAgLy8gV2Ugd2FudCB0byBwYXNzIHRoZSBcInVybFwiIHBhcmFtZXRlcnMgdG8gdGhlIGNvbW1hbmRzIGluIHJldmVyc2Ugb3JkZXJcbiAgLy8gc2luY2UgdGhlIGNvbW1hbmQgd2lsbCBzb21ldGltZXMgd2FudCB0byBpZ25vcmUsIHNheSwgdGhlIHNlc3Npb25JZC5cbiAgLy8gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBwdXR0aW5nIHNlc3Npb25JZCBsYXN0LCB3aGljaCBtZWFucyBpbiBKUyB3ZSBjYW5cbiAgLy8gb21pdCBpdCBmcm9tIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaWYgd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdC5cbiAgbGV0IHVybFBhcmFtcyA9IF8ua2V5cyhyZXF1ZXN0UGFyYW1zKS5yZXZlcnNlKCk7XG5cbiAgLy8gSW4gdGhlIHNpbXBsZSBjYXNlLCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgYSBiYXNpYyBhcnJheSBpblxuICAvLyBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkLCBzbyBzdGFydCB0aGVyZS4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXJlIGFyZVxuICAvLyBtdWx0aXBsZSBvcHRpb25hbCBzZXRzIG9mIHJlcXVpcmVkIHBhcmFtcywgdGhvdWdoLCBzbyBoYW5kbGUgdGhhdCBjYXNlXG4gIC8vIHRvby5cbiAgbGV0IHJlcXVpcmVkUGFyYW1zID0gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZDtcbiAgaWYgKF8uaXNBcnJheShfLmZpcnN0KHBheWxvYWRQYXJhbXMucmVxdWlyZWQpKSkge1xuICAgIC8vIElmIHRoZXJlIGFyZSBvcHRpb25hbCBzZXRzIG9mIHJlcXVpcmVkIHBhcmFtcywgdGhlbiB3ZSB3aWxsIGhhdmUgYW5cbiAgICAvLyBhcnJheSBvZiBhcnJheXMgaW4gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gbG9vcCB0aHJvdWdoIGVhY2ggc2V0IGFuZFxuICAgIC8vIHBpY2sgdGhlIG9uZSB0aGF0IG1hdGNoZXMgd2hpY2ggSlNPTiBwYXJhbXMgd2VyZSBhY3R1YWxseSBzZW50LiBXZSd2ZVxuICAgIC8vIGFscmVhZHkgYmVlbiB0aHJvdWdoIHZhbGlkYXRpb24gc28gd2UncmUgZ3VhcmFudGVlZCB0byBmaW5kIGEgbWF0Y2guXG4gICAgbGV0IGtleXMgPSBfLmtleXMoanNvbk9iaik7XG4gICAgZm9yIChsZXQgcGFyYW1zIG9mIHBheWxvYWRQYXJhbXMucmVxdWlyZWQpIHtcbiAgICAgIGlmIChfLndpdGhvdXQocGFyYW1zLCAuLi5rZXlzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB3ZSBjb25zdHJ1Y3Qgb3VyIGxpc3Qgb2YgYXJndW1lbnRzIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kXG4gIGxldCBhcmdzO1xuICBpZiAoXy5pc0Z1bmN0aW9uKHBheWxvYWRQYXJhbXMubWFrZUFyZ3MpKSB7XG4gICAgLy8gSW4gdGhlIHJvdXRlIHNwZWMsIGEgcGFydGljdWxhciByb3V0ZSBtaWdodCBkZWZpbmUgYSAnbWFrZUFyZ3MnIGZ1bmN0aW9uXG4gICAgLy8gaWYgaXQgd2FudHMgZnVsbCBjb250cm9sIG92ZXIgaG93IHRvIHR1cm4gSlNPTiBwYXJhbWV0ZXJzIGludG8gY29tbWFuZFxuICAgIC8vIGFyZ3VtZW50cy4gU28gd2UgcGFzcyBpdCB0aGUgSlNPTiBwYXJhbWV0ZXJzIGFuZCBpdCByZXR1cm5zIGFuIGFycmF5XG4gICAgLy8gd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBoYW5kbGluZyBjb21tYW5kLiBGb3IgZXhhbXBsZSBpZiBpdCByZXR1cm5zXG4gICAgLy8gWzEsIDIsIDNdLCB3ZSB3aWxsIGNhbGwgYGNvbW1hbmQoMSwgMiwgMywgLi4uKWAgKHVybCBwYXJhbXMgYXJlIHNlcGFyYXRlXG4gICAgLy8gZnJvbSBKU09OIHBhcmFtcyBhbmQgZ2V0IGNvbmNhdGVuYXRlZCBiZWxvdykuXG4gICAgYXJncyA9IHBheWxvYWRQYXJhbXMubWFrZUFyZ3MoanNvbk9iaiwgcHJvdG9jb2wpO1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSwgY29sbGVjdCBhbGwgdGhlIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBwYXJhbXMgYW5kIGZsYXR0ZW4gdGhlbVxuICAgIC8vIGludG8gYW4gYXJndW1lbnQgYXJyYXlcbiAgICBhcmdzID0gXy5mbGF0dGVuKHJlcXVpcmVkUGFyYW1zKS5tYXAoKHApID0+IGpzb25PYmpbcF0pO1xuICAgIGlmIChwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKSB7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoXy5mbGF0dGVuKHBheWxvYWRQYXJhbXMub3B0aW9uYWwpLm1hcCgocCkgPT4ganNvbk9ialtwXSkpO1xuICAgIH1cbiAgfVxuICAvLyBGaW5hbGx5LCBnZXQgb3VyIHVybCBwYXJhbXMgKHNlc3Npb24gaWQsIGVsZW1lbnQgaWQsIGV0Yy4uLikgb24gdGhlIGVuZCBvZlxuICAvLyB0aGUgbGlzdFxuICBhcmdzID0gYXJncy5jb25jYXQodXJsUGFyYW1zLm1hcCgodSkgPT4gcmVxdWVzdFBhcmFtc1t1XSkpO1xuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Db3JlfSBkcml2ZXJcbiAqIEByZXR1cm5zIHtpbXBvcnQoJy4uL2V4cHJlc3Mvc2VydmVyJykuUm91dGVDb25maWd1cmluZ0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24oZHJpdmVyKSB7XG4gIGlmICghZHJpdmVyLnNlc3Npb25FeGlzdHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgbXVzdCBpbXBsZW1lbnQgYHNlc3Npb25FeGlzdHNgIHByb3BlcnR5Jyk7XG4gIH1cblxuICAvLyBcImV4ZWN1dGVcIiBpc24ndCBkZWZpbmVkIGFueXdoZXJlXG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgaWYgKCEoZHJpdmVyLmV4ZWN1dGVDb21tYW5kIHx8IGRyaXZlci5leGVjdXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRHJpdmVycyBtdXN0IGltcGxlbWVudCBgZXhlY3V0ZUNvbW1hbmRgIG9yIGBleGVjdXRlYCBtZXRob2QnKTtcbiAgfVxuXG4gIC8vIHJldHVybiBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYWRkIGFsbCB0aGUgcm91dGVzIHRvIHRoZSBkcml2ZXIuIEhlcmUgZXh0cmFNZXRob2RzIG1pZ2h0IGJlXG4gIC8vIHBhc3NlZCBpbiBhcyBkZWZpbmVkIGJ5IEFwcGl1bSBwbHVnaW5zLCBzbyB3ZSBuZWVkIHRvIGFkZCB0aG9zZSB0byB0aGUgZGVmYXVsdCBsaXN0XG4gIHJldHVybiBmdW5jdGlvbiBhZGRSb3V0ZXMoYXBwLCB7YmFzZVBhdGggPSBERUZBVUxUX0JBU0VfUEFUSCwgZXh0cmFNZXRob2RNYXAgPSB7fX0gPSB7fSkge1xuICAgIC8vIHN0b3JlIGJhc2VQYXRoIG9uIHRoZSBkcml2ZXIgaW5zdGFuY2Ugc28gaXQgY2FuIHVzZSBpdCBpZiBuZWNlc3NhcnlcbiAgICAvLyBmb3IgZXhhbXBsZSBpbiBkZXRlcm1pbmluZyBwcm94eSBhdm9pZGFuY2VcbiAgICBkcml2ZXIuYmFzZVBhdGggPSBiYXNlUGF0aDtcblxuICAgIGNvbnN0IGFsbE1ldGhvZHMgPSB7Li4uTUVUSE9EX01BUCwgLi4uZXh0cmFNZXRob2RNYXB9O1xuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgbWV0aG9kc10gb2YgXy50b1BhaXJzKGFsbE1ldGhvZHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2QsIHNwZWNdIG9mIF8udG9QYWlycyhtZXRob2RzKSkge1xuICAgICAgICAvLyBzZXQgdXAgdGhlIGV4cHJlc3Mgcm91dGUgaGFuZGxlclxuICAgICAgICBidWlsZEhhbmRsZXIoXG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBgJHtiYXNlUGF0aH0ke3BhdGh9YCxcbiAgICAgICAgICBzcGVjLFxuICAgICAgICAgIGRyaXZlcixcbiAgICAgICAgICBpc1Nlc3Npb25Db21tYW5kKHNwZWMuY29tbWFuZClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSGFuZGxlcihhcHAsIG1ldGhvZCwgcGF0aCwgc3BlYywgZHJpdmVyLCBpc1Nlc3NDbWQpIHtcbiAgbGV0IGFzeW5jSGFuZGxlciA9IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGxldCBqc29uT2JqID0gcmVxLmJvZHk7XG4gICAgbGV0IGh0dHBSZXNCb2R5ID0ge307XG4gICAgbGV0IGh0dHBTdGF0dXMgPSAyMDA7XG4gICAgbGV0IG5ld1Nlc3Npb25JZDtcbiAgICBsZXQgY3VycmVudFByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGlmIHRoaXMgaXMgYSBzZXNzaW9uIGNvbW1hbmQgYnV0IHdlIGRvbid0IGhhdmUgYSBzZXNzaW9uLFxuICAgICAgLy8gZXJyb3Igb3V0IGVhcmx5IChlc3BlY2lhbGx5IGJlZm9yZSBwcm94eWluZylcbiAgICAgIGlmIChpc1Nlc3NDbWQgJiYgIWRyaXZlci5zZXNzaW9uRXhpc3RzKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaERyaXZlckVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBkcml2ZXIgaXMgY3VycmVudGx5IHByb3h5aW5nIGNvbW1hbmRzIHRvIGFub3RoZXIgSlNPTldQIHNlcnZlciwgYnlwYXNzIGFsbCBvdXJcbiAgICAgIC8vIGNoZWNrcyBhbmQgYXNzdW1lIHRoZSB1cHN0cmVhbSBzZXJ2ZXIga25vd3Mgd2hhdCBpdCdzIGRvaW5nLiBCdXQga2VlcCB0aGlzIGluIHRoZVxuICAgICAgLy8gdHJ5L2NhdGNoIGJsb2NrIHNvIGlmIHByb3h5aW5nIGl0c2VsZiBmYWlscywgd2UgZ2l2ZSBhIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4gT2YgY291cnNlIHdlXG4gICAgICAvLyBvbmx5IHdhbnQgdG8gZG8gdGhlc2Ugd2hlbiB3ZSBoYXZlIGEgc2Vzc2lvbiBjb21tYW5kOyB0aGUgQXBwaXVtIGRyaXZlciBtdXN0IGJlXG4gICAgICAvLyByZXNwb25zaWJsZSBmb3Igc3RhcnQvc3RvcCBzZXNzaW9uLCBldGMuLi4gV2UgYWxzbyBhbGxvdyB0aGUgY29tbWFuZCBzcGVjIHRvIGRlY2xhcmUgdGhhdFxuICAgICAgLy8gdGhpcyBjb21tYW5kIHNob3VsZCBuZXZlciBiZSBwcm94aWVkICh3aGljaCBpcyB1c2VmdWwgZm9yIHBsdWdpbiBkZXZlbG9wZXJzIHdobyBhZGRcbiAgICAgIC8vIGNvbW1hbmRzIGFuZCBnZW5lcmFsbHkgd291bGQgbm90IHdhbnQgdGhhdCBjb21tYW5kIHRvIGJlIHByb3hpZWQgaW5zdGVhZCBvZiBoYW5kbGVkIGJ5IHRoZVxuICAgICAgLy8gcGx1Z2luKVxuICAgICAgbGV0IGRpZFBsdWdpbk92ZXJyaWRlUHJveHkgPSBmYWxzZTtcbiAgICAgIGlmIChpc1Nlc3NDbWQgJiYgIXNwZWMubmV2ZXJQcm94eSAmJiBkcml2ZXJTaG91bGREb0p3cFByb3h5KGRyaXZlciwgcmVxLCBzcGVjLmNvbW1hbmQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZHJpdmVyLnBsdWdpbnNUb0hhbmRsZUNtZCB8fFxuICAgICAgICAgIGRyaXZlci5wbHVnaW5zVG9IYW5kbGVDbWQoc3BlYy5jb21tYW5kLCByZXEucGFyYW1zLnNlc3Npb25JZCkubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IGRvSndwUHJveHkoZHJpdmVyLCByZXEsIHJlcyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5kZWJ1ZyhcbiAgICAgICAgICBgV291bGQgaGF2ZSBwcm94aWVkIGAgK1xuICAgICAgICAgICAgYGNvbW1hbmQgZGlyZWN0bHksIGJ1dCBhIHBsdWdpbiBleGlzdHMgd2hpY2ggbWlnaHQgcmVxdWlyZSBpdHMgdmFsdWUsIHNvIHdpbGwgbGV0IGAgK1xuICAgICAgICAgICAgYGl0cyB2YWx1ZSBiZSBjb2xsZWN0ZWQgaW50ZXJuYWxseSBhbmQgbWFkZSBwYXJ0IG9mIHBsdWdpbiBjaGFpbmBcbiAgICAgICAgKTtcbiAgICAgICAgZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIGEgY29tbWFuZCBpcyBub3QgaW4gb3VyIG1ldGhvZCBtYXAsIGl0J3MgYmVjYXVzZSB3ZVxuICAgICAgLy8gaGF2ZSBubyBwbGFucyB0byBldmVyIGltcGxlbWVudCBpdFxuICAgICAgaWYgKCFzcGVjLmNvbW1hbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIHdyYXAgcGFyYW1zIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHNwZWMucGF5bG9hZFBhcmFtcyAmJiBzcGVjLnBheWxvYWRQYXJhbXMud3JhcCkge1xuICAgICAgICBqc29uT2JqID0gd3JhcFBhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmopO1xuICAgICAgfVxuXG4gICAgICAvLyB1bndyYXAgcGFyYW1zIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHNwZWMucGF5bG9hZFBhcmFtcyAmJiBzcGVjLnBheWxvYWRQYXJhbXMudW53cmFwKSB7XG4gICAgICAgIGpzb25PYmogPSB1bndyYXBQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICAvLyB0cnkgdG8gZGV0ZXJtaW5lIHByb3RvY29sIGJ5IHNlc3Npb24gY3JlYXRpb24gYXJncywgc28gd2UgY2FuIHRocm93IGFcbiAgICAgICAgLy8gcHJvcGVybHkgZm9ybWF0dGVkIGVycm9yIGlmIGFyZ3VtZW50cyB2YWxpZGF0aW9uIGZhaWxzXG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKFxuICAgICAgICAgIG1ha2VBcmdzKHJlcS5wYXJhbXMsIGpzb25PYmosIHNwZWMucGF5bG9hZFBhcmFtcyB8fCB7fSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIGpzb24gcGF5bG9hZCBjb25mb3JtcyB0byB0aGUgc3BlY1xuICAgICAgY2hlY2tQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqLCBjdXJyZW50UHJvdG9jb2wpO1xuXG4gICAgICAvLyB0dXJuIHRoZSBjb21tYW5kIGFuZCBqc29uIHBheWxvYWQgaW50byBhbiBhcmd1bWVudCBsaXN0IGZvclxuICAgICAgLy8gdGhlIGRyaXZlciBtZXRob2RzXG4gICAgICBsZXQgYXJncyA9IG1ha2VBcmdzKHJlcS5wYXJhbXMsIGpzb25PYmosIHNwZWMucGF5bG9hZFBhcmFtcyB8fCB7fSwgY3VycmVudFByb3RvY29sKTtcbiAgICAgIGxldCBkcml2ZXJSZXM7XG4gICAgICAvLyB2YWxpZGF0ZSBjb21tYW5kIGFyZ3MgYWNjb3JkaW5nIHRvIE1KU09OV1BcbiAgICAgIGlmICh2YWxpZGF0b3JzW3NwZWMuY29tbWFuZF0pIHtcbiAgICAgICAgdmFsaWRhdG9yc1tzcGVjLmNvbW1hbmRdKC4uLmFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBydW4gdGhlIGRyaXZlciBjb21tYW5kIHdyYXBwZWQgaW5zaWRlIHRoZSBhcmd1bWVudCB2YWxpZGF0b3JzXG4gICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkuZGVidWcoXG4gICAgICAgIGBDYWxsaW5nIGAgK1xuICAgICAgICAgIGAke2RyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfS4ke3NwZWMuY29tbWFuZH0oKSB3aXRoIGFyZ3M6IGAgK1xuICAgICAgICAgIF8udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoYXJncyksIHtsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEh9KVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpZFBsdWdpbk92ZXJyaWRlUHJveHkpIHtcbiAgICAgICAgLy8gVE9ETyBmb3Igbm93IHdlIGFkZCB0aGlzIGluZm9ybWF0aW9uIG9uIHRoZSBhcmdzIGxpc3QsIGJ1dCB0aGF0J3MgbWl4aW5nIHB1cnBvc2VzIGhlcmUuXG4gICAgICAgIC8vIFdlIHJlYWxseSBzaG91bGQgYWRkIGFub3RoZXIgJ29wdGlvbnMnIHBhcmFtZXRlciB0byAnZXhlY3V0ZUNvbW1hbmQnLCBidXQgdGhpcyB3b3VsZCBiZVxuICAgICAgICAvLyBhIGJyZWFraW5nIGNoYW5nZSBmb3IgYWxsIGRyaXZlcnMgc28gd291bGQgbmVlZCB0byBiZSBoYW5kbGVkIGNhcmVmdWxseS5cbiAgICAgICAgYXJncy5wdXNoKHtyZXFGb3JQcm94eTogcmVxfSk7XG4gICAgICB9XG5cbiAgICAgIGRyaXZlclJlcyA9IGF3YWl0IGRyaXZlci5leGVjdXRlQ29tbWFuZChzcGVjLmNvbW1hbmQsIC4uLmFyZ3MpO1xuXG4gICAgICAvLyBHZXQgdGhlIHByb3RvY29sIGFmdGVyIGV4ZWN1dGVDb21tYW5kXG4gICAgICBjdXJyZW50UHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkgfHwgY3VycmVudFByb3RvY29sO1xuXG4gICAgICAvLyBJZiBgZXhlY3V0ZUNvbW1hbmRgIHdhcyBvdmVycmlkZGVuIGFuZCB0aGUgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0XG4gICAgICAvLyB3aXRoIGEgcHJvdG9jb2wgYW5kIHZhbHVlL2Vycm9yIHByb3BlcnR5LCByZS1hc3NpZ24gdGhlIHByb3RvY29sXG4gICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGRyaXZlclJlcykgJiYgXy5oYXMoZHJpdmVyUmVzLCAncHJvdG9jb2wnKSkge1xuICAgICAgICBjdXJyZW50UHJvdG9jb2wgPSBkcml2ZXJSZXMucHJvdG9jb2wgfHwgY3VycmVudFByb3RvY29sO1xuICAgICAgICBpZiAoZHJpdmVyUmVzLmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZHJpdmVyUmVzLmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGRyaXZlclJlcyA9IGRyaXZlclJlcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdW5wYWNrIGNyZWF0ZVNlc3Npb24gcmVzcG9uc2VcbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgbmV3U2Vzc2lvbklkID0gZHJpdmVyUmVzWzBdO1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCBuZXdTZXNzaW9uSWQpLmRlYnVnKFxuICAgICAgICAgIGBDYWNoZWQgdGhlIHByb3RvY29sIHZhbHVlICcke2N1cnJlbnRQcm90b2NvbH0nIGZvciB0aGUgbmV3IHNlc3Npb24gJHtuZXdTZXNzaW9uSWR9YFxuICAgICAgICApO1xuICAgICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuTUpTT05XUCkge1xuICAgICAgICAgIGRyaXZlclJlcyA9IGRyaXZlclJlc1sxXTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBkcml2ZXJSZXMgPSB7XG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IGRyaXZlclJlc1sxXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRyaXZlclJlcyA9IGZvcm1hdFJlc3BvbnNlVmFsdWUoZHJpdmVyUmVzKTtcblxuICAgICAgLy8gZGVsZXRlIHNob3VsZCBub3QgcmV0dXJuIGFueXRoaW5nIGV2ZW4gaWYgc3VjY2Vzc2Z1bFxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkuZGVidWcoXG4gICAgICAgICAgYFJlY2VpdmVkIHJlc3BvbnNlOiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge1xuICAgICAgICAgICAgbGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RILFxuICAgICAgICAgIH0pfWBcbiAgICAgICAgKTtcbiAgICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmRlYnVnKCdCdXQgZGVsZXRpbmcgc2Vzc2lvbiwgc28gbm90IHJldHVybmluZycpO1xuICAgICAgICBkcml2ZXJSZXMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgc3RhdHVzIGlzIG5vdCAwLCAgdGhyb3cgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGZvciBzdGF0dXMgY29kZS5cbiAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGRyaXZlclJlcykpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHV0aWwuaGFzVmFsdWUoZHJpdmVyUmVzLnN0YXR1cykgJiZcbiAgICAgICAgICAhaXNOYU4oZHJpdmVyUmVzLnN0YXR1cykgJiZcbiAgICAgICAgICBwYXJzZUludChkcml2ZXJSZXMuc3RhdHVzLCAxMCkgIT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUoZHJpdmVyUmVzLnN0YXR1cywgZHJpdmVyUmVzLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3QoZHJpdmVyUmVzLnZhbHVlKSAmJiBkcml2ZXJSZXMudmFsdWUuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21XM0NKc29uQ29kZShcbiAgICAgICAgICAgIGRyaXZlclJlcy52YWx1ZS5lcnJvcixcbiAgICAgICAgICAgIGRyaXZlclJlcy52YWx1ZS5tZXNzYWdlLFxuICAgICAgICAgICAgZHJpdmVyUmVzLnZhbHVlLnN0YWNrdHJhY2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGh0dHBSZXNCb2R5LnZhbHVlID0gZHJpdmVyUmVzO1xuICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkKS5kZWJ1ZyhcbiAgICAgICAgYFJlc3BvbmRpbmcgYCArXG4gICAgICAgICAgYHRvIGNsaWVudCB3aXRoIGRyaXZlci4ke3NwZWMuY29tbWFuZH0oKSByZXN1bHQ6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkcml2ZXJSZXMpLCB7XG4gICAgICAgICAgICBsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEgsXG4gICAgICAgICAgfSl9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIGZpZ3VyZSBvdXQgd2hhdCBvdXIgcmVzcG9uc2Ugc2hvdWxkIGJlXG4gICAgICAvLyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBlcnJvciB0aGF0IHdlIGVuY291bnRlcmVkXG4gICAgICBsZXQgYWN0dWFsRXJyID0gZXJyO1xuXG4gICAgICBjdXJyZW50UHJvdG9jb2wgPVxuICAgICAgICBjdXJyZW50UHJvdG9jb2wgfHwgZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkKTtcblxuICAgICAgbGV0IGVyck1zZyA9IGVyci5zdGFja3RyYWNlIHx8IGVyci5zdGFjaztcbiAgICAgIGlmICghXy5pbmNsdWRlcyhlcnJNc2csIGVyci5tZXNzYWdlKSkge1xuICAgICAgICAvLyBpZiB0aGUgbWVzc2FnZSBoYXMgbW9yZSBpbmZvcm1hdGlvbiwgYWRkIGl0LiBidXQgb2Z0ZW4gdGhlIG1lc3NhZ2VcbiAgICAgICAgLy8gaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHN0YWNrIHRyYWNlXG4gICAgICAgIGVyck1zZyA9IGAke2Vyci5tZXNzYWdlfSR7ZXJyTXNnID8gJ1xcbicgKyBlcnJNc2cgOiAnJ31gO1xuICAgICAgfVxuICAgICAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKSkge1xuICAgICAgICBhY3R1YWxFcnIgPSBlcnIuZ2V0QWN0dWFsRXJyb3IoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkIHx8IG5ld1Nlc3Npb25JZCkuZGVidWcoXG4gICAgICAgICAgYEVuY291bnRlcmVkIGludGVybmFsIGVycm9yIHJ1bm5pbmcgY29tbWFuZDogJHtlcnJNc2d9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBbaHR0cFN0YXR1cywgaHR0cFJlc0JvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihhY3R1YWxFcnIpO1xuICAgIH1cblxuICAgIC8vIGRlY29kZSB0aGUgcmVzcG9uc2UsIHdoaWNoIGlzIGVpdGhlciBhIHN0cmluZyBvciBqc29uXG4gICAgaWYgKF8uaXNTdHJpbmcoaHR0cFJlc0JvZHkpKSB7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLnNlbmQoaHR0cFJlc0JvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3U2Vzc2lvbklkKSB7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBodHRwUmVzQm9keS52YWx1ZS5zZXNzaW9uSWQgPSBuZXdTZXNzaW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodHRwUmVzQm9keS5zZXNzaW9uSWQgPSByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBudWxsO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBzZXNzaW9uSWQgaW4gVzNDIHJlc3BvbnNlc1xuICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICBkZWxldGUgaHR0cFJlc0JvZHkuc2Vzc2lvbklkO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keSA9IGZvcm1hdFN0YXR1cyhodHRwUmVzQm9keSk7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLmpzb24oaHR0cFJlc0JvZHkpO1xuICAgIH1cbiAgfTtcbiAgLy8gYWRkIHRoZSBtZXRob2QgdG8gdGhlIGFwcFxuICBhcHBbbWV0aG9kLnRvTG93ZXJDYXNlKCldKHBhdGgsIChyZXEsIHJlcykgPT4ge1xuICAgIEIucmVzb2x2ZShhc3luY0hhbmRsZXIocmVxLCByZXMpKS5kb25lKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkcml2ZXJTaG91bGREb0p3cFByb3h5KGRyaXZlciwgcmVxLCBjb21tYW5kKSB7XG4gIC8vIGRyaXZlcnMgbmVlZCB0byBleHBsaWNpdGx5IHNheSB3aGVuIHRoZSBwcm94eSBpcyBhY3RpdmVcbiAgaWYgKCFkcml2ZXIucHJveHlBY3RpdmUocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gd2Ugc2hvdWxkIG5ldmVyIHByb3h5IGRlbGV0ZVNlc3Npb24gYmVjYXVzZSB3ZSBuZWVkIHRvIGdpdmUgdGhlIGNvbnRhaW5pbmdcbiAgLy8gZHJpdmVyIGFuIG9wcG9ydHVuaXR5IHRvIGNsZWFuIGl0c2VsZiB1cFxuICBpZiAoY29tbWFuZCA9PT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHZhbGlkYXRlIGF2b2lkYW5jZSBzY2hlbWEsIGFuZCBzYXkgd2Ugc2hvdWxkbid0IHByb3h5IGlmIGFueXRoaW5nIGluIHRoZVxuICAvLyBhdm9pZCBsaXN0IG1hdGNoZXMgb3VyIHJlcVxuICBpZiAoZHJpdmVyLnByb3h5Um91dGVJc0F2b2lkZWQocmVxLnBhcmFtcy5zZXNzaW9uSWQsIHJlcS5tZXRob2QsIHJlcS5vcmlnaW5hbFVybCwgcmVxLmJvZHkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvSndwUHJveHkoZHJpdmVyLCByZXEsIHJlcykge1xuICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkuaW5mbyhcbiAgICAnRHJpdmVyIHByb3h5IGFjdGl2ZSwgcGFzc2luZyByZXF1ZXN0IG9uIHZpYSBIVFRQIHByb3h5J1xuICApO1xuXG4gIC8vIGNoZWNrIHRoYXQgdGhlIGlubmVyIGRyaXZlciBoYXMgYSBwcm94eSBmdW5jdGlvblxuICBpZiAoIWRyaXZlci5jYW5Qcm94eShyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyeWluZyB0byBwcm94eSB0byBhIHNlcnZlciBidXQgdGhlIGRyaXZlciBpcyB1bmFibGUgdG8gcHJveHknKTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGRyaXZlci5leGVjdXRlQ29tbWFuZCgncHJveHlSZXFSZXMnLCByZXEsIHJlcywgcmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IpKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHByb3h5LiBQcm94eSBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLFxuICBpc1Nlc3Npb25Db21tYW5kLFxuICBkcml2ZXJTaG91bGREb0p3cFByb3h5LFxuICBkZXRlcm1pbmVQcm90b2NvbCxcbiAgQ1JFQVRFX1NFU1NJT05fQ09NTUFORCxcbiAgREVMRVRFX1NFU1NJT05fQ09NTUFORCxcbiAgR0VUX1NUQVRVU19DT01NQU5ELFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBT0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxzQkFBc0IsR0FBRyxlQUEvQjs7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxlQUEvQjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxXQUEzQjs7O0FBRUEsU0FBU0MsaUJBQVQsQ0FBMkJDLGlCQUEzQixFQUE4QztFQUM1QyxPQUFPQyxlQUFBLENBQUVDLElBQUYsQ0FBT0YsaUJBQVAsRUFBMEJHLHVCQUExQixJQUF1Q0Msb0JBQUEsQ0FBVUMsR0FBakQsR0FBdURELG9CQUFBLENBQVVFLE9BQXhFO0FBQ0Q7O0FBRUQsU0FBU0MsZUFBVCxDQUF5QkMsTUFBekIsRUFBaUNDLFNBQVMsR0FBRyxJQUE3QyxFQUFtRDtFQUNqRCxNQUFNQyxTQUFTLEdBQUdULGVBQUEsQ0FBRVUsVUFBRixDQUFhSCxNQUFNLENBQUNJLGdCQUFwQixJQUNkSixNQUFNLENBQUNJLGdCQUFQLENBQXdCSCxTQUF4QixDQURjLEdBRWRELE1BRko7O0VBR0EsSUFBSUUsU0FBUyxLQUFLRixNQUFsQixFQUEwQjtJQUl4QixPQUFPQSxNQUFNLENBQUNLLFFBQWQ7RUFDRDs7RUFHRCxPQUFPLENBQUFILFNBQVMsU0FBVCxJQUFBQSxTQUFTLFdBQVQsWUFBQUEsU0FBUyxDQUFFRyxRQUFYLEtBQXVCVCxvQkFBQSxDQUFVQyxHQUF4QztBQUNEOztBQUVELFNBQVNTLGdCQUFULENBQTBCQyxPQUExQixFQUFtQztFQUNqQyxPQUFPLENBQUNkLGVBQUEsQ0FBRWUsUUFBRixDQUFXQyw4QkFBWCxFQUFtQ0YsT0FBbkMsQ0FBUjtBQUNEOztBQVFELFNBQVNHLFNBQVQsQ0FBbUJWLE1BQW5CLEVBQTJCQyxTQUFTLEdBQUcsSUFBdkMsRUFBNkM7RUFBQTs7RUFDM0MsTUFBTUMsU0FBUyxHQUNiRCxTQUFTLElBQUlSLGVBQUEsQ0FBRVUsVUFBRixDQUFhSCxNQUFNLENBQUNJLGdCQUFwQixDQUFiLEdBQ0lKLE1BQU0sQ0FBQ0ksZ0JBQVAsQ0FBd0JILFNBQXhCLEtBQXNDRCxNQUQxQyxHQUVJQSxNQUhOOztFQUlBLElBQUlQLGVBQUEsQ0FBRVUsVUFBRixtQkFBYUQsU0FBUyxDQUFDUyxHQUF2QixtREFBYSxlQUFlQyxJQUE1QixDQUFKLEVBQXVDO0lBQ3JDLE9BQU9WLFNBQVMsQ0FBQ1MsR0FBakI7RUFDRDs7RUFFRCxJQUFJRSxTQUFTLEdBQUdYLFNBQVMsQ0FBQ1ksV0FBVixHQUNYLEdBQUVaLFNBQVMsQ0FBQ1ksV0FBVixDQUFzQkMsSUFBSyxJQUFHQyxhQUFBLENBQUtDLFdBQUwsQ0FBaUJmLFNBQWpCLEVBQTRCZ0IsU0FBNUIsQ0FBc0MsQ0FBdEMsRUFBeUMsQ0FBekMsQ0FBNEMsRUFEakUsR0FFWixjQUZKOztFQUdBLElBQUlqQixTQUFKLEVBQWU7SUFDYlksU0FBUyxJQUFLLEtBQUlaLFNBQVMsQ0FBQ2lCLFNBQVYsQ0FBb0IsQ0FBcEIsRUFBdUIsQ0FBdkIsQ0FBMEIsR0FBNUM7RUFDRDs7RUFDRCxPQUFPQyxlQUFBLENBQU9ULFNBQVAsQ0FBaUJHLFNBQWpCLENBQVA7QUFDRDs7QUFFRCxTQUFTTyxVQUFULENBQW9CQyxTQUFwQixFQUErQkMsT0FBL0IsRUFBd0M7RUFPdEMsSUFBSUMsR0FBRyxHQUFHRCxPQUFWOztFQUNBLElBQUk3QixlQUFBLENBQUUrQixPQUFGLENBQVVGLE9BQVYsS0FBc0IsQ0FBQzdCLGVBQUEsQ0FBRWdDLFFBQUYsQ0FBV0gsT0FBWCxDQUEzQixFQUFnRDtJQUM5Q0MsR0FBRyxHQUFHLEVBQU47SUFDQUEsR0FBRyxDQUFDRixTQUFTLENBQUNLLElBQVgsQ0FBSCxHQUFzQkosT0FBdEI7RUFDRDs7RUFDRCxPQUFPQyxHQUFQO0FBQ0Q7O0FBRUQsU0FBU0ksWUFBVCxDQUFzQk4sU0FBdEIsRUFBaUNDLE9BQWpDLEVBQTBDO0VBSXhDLElBQUlDLEdBQUcsR0FBR0QsT0FBVjs7RUFDQSxJQUFJN0IsZUFBQSxDQUFFZ0MsUUFBRixDQUFXSCxPQUFYLENBQUosRUFBeUI7SUFFdkIsSUFBSUEsT0FBTyxDQUFDRCxTQUFTLENBQUNPLE1BQVgsQ0FBWCxFQUErQjtNQUM3QkwsR0FBRyxHQUFHRCxPQUFPLENBQUNELFNBQVMsQ0FBQ08sTUFBWCxDQUFiO0lBQ0Q7RUFDRjs7RUFDRCxPQUFPTCxHQUFQO0FBQ0Q7O0FBRU0sU0FBU00sV0FBVCxDQUFxQlIsU0FBckIsRUFBZ0NDLE9BQWhDLEVBQXlDakIsUUFBekMsRUFBbUQ7RUFDeEQsSUFBSXlCLGNBQWMsR0FBRyxFQUFyQjtFQUNBLElBQUlDLGNBQWMsR0FBRyxFQUFyQjs7RUFDQSxJQUFJQyxjQUFjLEdBQUd2QyxlQUFBLENBQUV3QyxJQUFGLENBQU9YLE9BQVAsQ0FBckI7O0VBRUEsSUFBSUQsU0FBSixFQUFlO0lBQ2IsSUFBSUEsU0FBUyxDQUFDYSxRQUFkLEVBQXdCO01BR3RCLElBQUksQ0FBQ3pDLGVBQUEsQ0FBRStCLE9BQUYsQ0FBVS9CLGVBQUEsQ0FBRTBDLEtBQUYsQ0FBUWQsU0FBUyxDQUFDYSxRQUFsQixDQUFWLENBQUwsRUFBNkM7UUFDM0NKLGNBQWMsR0FBRyxDQUFDVCxTQUFTLENBQUNhLFFBQVgsQ0FBakI7TUFDRCxDQUZELE1BRU87UUFDTEosY0FBYyxHQUFHVCxTQUFTLENBQUNhLFFBQTNCO01BQ0Q7SUFDRjs7SUFFRCxJQUFJYixTQUFTLENBQUNlLFFBQWQsRUFBd0I7TUFDdEJMLGNBQWMsR0FBR1YsU0FBUyxDQUFDZSxRQUEzQjtJQUNEOztJQU1ELElBQUlmLFNBQVMsQ0FBQ2dCLFFBQWQsRUFBd0I7TUFDdEIsSUFBSUMsT0FBTyxHQUFHakIsU0FBUyxDQUFDZ0IsUUFBVixDQUFtQmYsT0FBbkIsRUFBNEJqQixRQUE1QixDQUFkOztNQUNBLElBQUlpQyxPQUFKLEVBQWE7UUFDWCxNQUFNLElBQUlDLGNBQUEsQ0FBT0Msa0JBQVgsQ0FBOEJGLE9BQTlCLEVBQXVDaEIsT0FBdkMsQ0FBTjtNQUNEO0lBQ0Y7RUFDRjs7RUFHRCxJQUFJUSxjQUFjLENBQUNXLE1BQWYsS0FBMEIsQ0FBOUIsRUFBaUM7SUFDL0I7RUFDRDs7RUFHRCxJQUFJVixjQUFjLENBQUNXLE9BQWYsQ0FBdUIsV0FBdkIsTUFBd0MsQ0FBQyxDQUE3QyxFQUFnRDtJQUM5Q1gsY0FBYyxDQUFDWSxJQUFmLENBQW9CLFdBQXBCO0VBQ0Q7O0VBR0QsSUFBSVosY0FBYyxDQUFDVyxPQUFmLENBQXVCLElBQXZCLE1BQWlDLENBQUMsQ0FBdEMsRUFBeUM7SUFDdkNYLGNBQWMsQ0FBQ1ksSUFBZixDQUFvQixJQUFwQjtFQUNEOztFQUdELEtBQUssSUFBSUMsTUFBVCxJQUFtQmQsY0FBbkIsRUFBbUM7SUFDakMsSUFDRXJDLGVBQUEsQ0FBRW9ELFVBQUYsQ0FBYWIsY0FBYixFQUE2QlksTUFBN0IsRUFBcUNiLGNBQXJDLEVBQXFEVSxNQUFyRCxLQUFnRSxDQUFoRSxJQUNBaEQsZUFBQSxDQUFFb0QsVUFBRixDQUFhRCxNQUFiLEVBQXFCWixjQUFyQixFQUFxQ1MsTUFBckMsS0FBZ0QsQ0FGbEQsRUFHRTtNQUdBO0lBQ0Q7RUFDRjs7RUFDRCxNQUFNLElBQUlGLGNBQUEsQ0FBT0Msa0JBQVgsQ0FBOEJuQixTQUE5QixFQUF5Q1csY0FBekMsQ0FBTjtBQUNEOztBQVNNLFNBQVNjLFFBQVQsQ0FBa0JDLGFBQWxCLEVBQWlDekIsT0FBakMsRUFBMEMwQixhQUExQyxFQUF5RDNDLFFBQXpELEVBQW1FO0VBS3hFLElBQUk0QyxTQUFTLEdBQUd4RCxlQUFBLENBQUV3QyxJQUFGLENBQU9jLGFBQVAsRUFBc0JHLE9BQXRCLEVBQWhCOztFQU1BLElBQUlwQixjQUFjLEdBQUdrQixhQUFhLENBQUNkLFFBQW5DOztFQUNBLElBQUl6QyxlQUFBLENBQUUrQixPQUFGLENBQVUvQixlQUFBLENBQUUwQyxLQUFGLENBQVFhLGFBQWEsQ0FBQ2QsUUFBdEIsQ0FBVixDQUFKLEVBQWdEO0lBSzlDLElBQUlELElBQUksR0FBR3hDLGVBQUEsQ0FBRXdDLElBQUYsQ0FBT1gsT0FBUCxDQUFYOztJQUNBLEtBQUssSUFBSXNCLE1BQVQsSUFBbUJJLGFBQWEsQ0FBQ2QsUUFBakMsRUFBMkM7TUFDekMsSUFBSXpDLGVBQUEsQ0FBRTBELE9BQUYsQ0FBVVAsTUFBVixFQUFrQixHQUFHWCxJQUFyQixFQUEyQlEsTUFBM0IsS0FBc0MsQ0FBMUMsRUFBNkM7UUFDM0NYLGNBQWMsR0FBR2MsTUFBakI7UUFDQTtNQUNEO0lBQ0Y7RUFDRjs7RUFHRCxJQUFJUSxJQUFKOztFQUNBLElBQUkzRCxlQUFBLENBQUVVLFVBQUYsQ0FBYTZDLGFBQWEsQ0FBQ0YsUUFBM0IsQ0FBSixFQUEwQztJQU94Q00sSUFBSSxHQUFHSixhQUFhLENBQUNGLFFBQWQsQ0FBdUJ4QixPQUF2QixFQUFnQ2pCLFFBQWhDLENBQVA7RUFDRCxDQVJELE1BUU87SUFHTCtDLElBQUksR0FBRzNELGVBQUEsQ0FBRTRELE9BQUYsQ0FBVXZCLGNBQVYsRUFBMEJ3QixHQUExQixDQUErQkMsQ0FBRCxJQUFPakMsT0FBTyxDQUFDaUMsQ0FBRCxDQUE1QyxDQUFQOztJQUNBLElBQUlQLGFBQWEsQ0FBQ1osUUFBbEIsRUFBNEI7TUFDMUJnQixJQUFJLEdBQUdBLElBQUksQ0FBQ0ksTUFBTCxDQUFZL0QsZUFBQSxDQUFFNEQsT0FBRixDQUFVTCxhQUFhLENBQUNaLFFBQXhCLEVBQWtDa0IsR0FBbEMsQ0FBdUNDLENBQUQsSUFBT2pDLE9BQU8sQ0FBQ2lDLENBQUQsQ0FBcEQsQ0FBWixDQUFQO0lBQ0Q7RUFDRjs7RUFHREgsSUFBSSxHQUFHQSxJQUFJLENBQUNJLE1BQUwsQ0FBWVAsU0FBUyxDQUFDSyxHQUFWLENBQWVHLENBQUQsSUFBT1YsYUFBYSxDQUFDVSxDQUFELENBQWxDLENBQVosQ0FBUDtFQUNBLE9BQU9MLElBQVA7QUFDRDs7QUFPRCxTQUFTTSx3QkFBVCxDQUFrQzFELE1BQWxDLEVBQTBDO0VBQ3hDLElBQUksQ0FBQ0EsTUFBTSxDQUFDMkQsYUFBWixFQUEyQjtJQUN6QixNQUFNLElBQUlDLEtBQUosQ0FBVSxpREFBVixDQUFOO0VBQ0Q7O0VBSUQsSUFBSSxFQUFFNUQsTUFBTSxDQUFDNkQsY0FBUCxJQUF5QjdELE1BQU0sQ0FBQzhELE9BQWxDLENBQUosRUFBZ0Q7SUFDOUMsTUFBTSxJQUFJRixLQUFKLENBQVUsNkRBQVYsQ0FBTjtFQUNEOztFQUlELE9BQU8sU0FBU0csU0FBVCxDQUFtQkMsR0FBbkIsRUFBd0I7SUFBQ0MsUUFBUSxHQUFHQyw0QkFBWjtJQUErQkMsY0FBYyxHQUFHO0VBQWhELElBQXNELEVBQTlFLEVBQWtGO0lBR3ZGbkUsTUFBTSxDQUFDaUUsUUFBUCxHQUFrQkEsUUFBbEI7SUFFQSxNQUFNRyxVQUFVLEdBQUcsRUFBQyxHQUFHQyxrQkFBSjtNQUFnQixHQUFHRjtJQUFuQixDQUFuQjs7SUFFQSxLQUFLLE1BQU0sQ0FBQ0csSUFBRCxFQUFPQyxPQUFQLENBQVgsSUFBOEI5RSxlQUFBLENBQUUrRSxPQUFGLENBQVVKLFVBQVYsQ0FBOUIsRUFBcUQ7TUFDbkQsS0FBSyxNQUFNLENBQUNLLE1BQUQsRUFBU0MsSUFBVCxDQUFYLElBQTZCakYsZUFBQSxDQUFFK0UsT0FBRixDQUFVRCxPQUFWLENBQTdCLEVBQWlEO1FBRS9DSSxZQUFZLENBQ1ZYLEdBRFUsRUFFVlMsTUFGVSxFQUdULEdBQUVSLFFBQVMsR0FBRUssSUFBSyxFQUhULEVBSVZJLElBSlUsRUFLVjFFLE1BTFUsRUFNVk0sZ0JBQWdCLENBQUNvRSxJQUFJLENBQUNuRSxPQUFOLENBTk4sQ0FBWjtNQVFEO0lBQ0Y7RUFDRixDQXBCRDtBQXFCRDs7QUFFRCxTQUFTb0UsWUFBVCxDQUFzQlgsR0FBdEIsRUFBMkJTLE1BQTNCLEVBQW1DSCxJQUFuQyxFQUF5Q0ksSUFBekMsRUFBK0MxRSxNQUEvQyxFQUF1RDRFLFNBQXZELEVBQWtFO0VBQ2hFLElBQUlDLFlBQVksR0FBRyxPQUFPQyxHQUFQLEVBQVl2RCxHQUFaLEtBQW9CO0lBQ3JDLElBQUlELE9BQU8sR0FBR3dELEdBQUcsQ0FBQ0MsSUFBbEI7SUFDQSxJQUFJQyxXQUFXLEdBQUcsRUFBbEI7SUFDQSxJQUFJQyxVQUFVLEdBQUcsR0FBakI7SUFDQSxJQUFJQyxZQUFKO0lBQ0EsSUFBSUMsZUFBZSxHQUFHcEYsZUFBZSxDQUFDQyxNQUFELEVBQVM4RSxHQUFHLENBQUNsQyxNQUFKLENBQVczQyxTQUFwQixDQUFyQzs7SUFFQSxJQUFJO01BR0YsSUFBSTJFLFNBQVMsSUFBSSxDQUFDNUUsTUFBTSxDQUFDMkQsYUFBUCxDQUFxQm1CLEdBQUcsQ0FBQ2xDLE1BQUosQ0FBVzNDLFNBQWhDLENBQWxCLEVBQThEO1FBQzVELE1BQU0sSUFBSXNDLGNBQUEsQ0FBTzZDLGlCQUFYLEVBQU47TUFDRDs7TUFVRCxJQUFJQyxzQkFBc0IsR0FBRyxLQUE3Qjs7TUFDQSxJQUFJVCxTQUFTLElBQUksQ0FBQ0YsSUFBSSxDQUFDWSxVQUFuQixJQUFpQ0Msc0JBQXNCLENBQUN2RixNQUFELEVBQVM4RSxHQUFULEVBQWNKLElBQUksQ0FBQ25FLE9BQW5CLENBQTNELEVBQXdGO1FBQ3RGLElBQ0UsQ0FBQ1AsTUFBTSxDQUFDd0Ysa0JBQVIsSUFDQXhGLE1BQU0sQ0FBQ3dGLGtCQUFQLENBQTBCZCxJQUFJLENBQUNuRSxPQUEvQixFQUF3Q3VFLEdBQUcsQ0FBQ2xDLE1BQUosQ0FBVzNDLFNBQW5ELEVBQThEd0MsTUFBOUQsS0FBeUUsQ0FGM0UsRUFHRTtVQUNBLE1BQU1nRCxVQUFVLENBQUN6RixNQUFELEVBQVM4RSxHQUFULEVBQWN2RCxHQUFkLENBQWhCO1VBQ0E7UUFDRDs7UUFDRGIsU0FBUyxDQUFDVixNQUFELEVBQVM4RSxHQUFHLENBQUNsQyxNQUFKLENBQVczQyxTQUFwQixDQUFULENBQXdDeUYsS0FBeEMsQ0FDRyxxQkFBRCxHQUNHLG1GQURILEdBRUcsaUVBSEw7UUFLQUwsc0JBQXNCLEdBQUcsSUFBekI7TUFDRDs7TUFJRCxJQUFJLENBQUNYLElBQUksQ0FBQ25FLE9BQVYsRUFBbUI7UUFDakIsTUFBTSxJQUFJZ0MsY0FBQSxDQUFPb0QsbUJBQVgsRUFBTjtNQUNEOztNQUdELElBQUlqQixJQUFJLENBQUMxQixhQUFMLElBQXNCMEIsSUFBSSxDQUFDMUIsYUFBTCxDQUFtQnRCLElBQTdDLEVBQW1EO1FBQ2pESixPQUFPLEdBQUdGLFVBQVUsQ0FBQ3NELElBQUksQ0FBQzFCLGFBQU4sRUFBcUIxQixPQUFyQixDQUFwQjtNQUNEOztNQUdELElBQUlvRCxJQUFJLENBQUMxQixhQUFMLElBQXNCMEIsSUFBSSxDQUFDMUIsYUFBTCxDQUFtQnBCLE1BQTdDLEVBQXFEO1FBQ25ETixPQUFPLEdBQUdLLFlBQVksQ0FBQytDLElBQUksQ0FBQzFCLGFBQU4sRUFBcUIxQixPQUFyQixDQUF0QjtNQUNEOztNQUVELElBQUlvRCxJQUFJLENBQUNuRSxPQUFMLEtBQWlCbkIsc0JBQXJCLEVBQTZDO1FBRzNDK0YsZUFBZSxHQUFHNUYsaUJBQWlCLENBQ2pDdUQsUUFBUSxDQUFDZ0MsR0FBRyxDQUFDbEMsTUFBTCxFQUFhdEIsT0FBYixFQUFzQm9ELElBQUksQ0FBQzFCLGFBQUwsSUFBc0IsRUFBNUMsQ0FEeUIsQ0FBbkM7TUFHRDs7TUFHRG5CLFdBQVcsQ0FBQzZDLElBQUksQ0FBQzFCLGFBQU4sRUFBcUIxQixPQUFyQixFQUE4QjZELGVBQTlCLENBQVg7TUFJQSxJQUFJL0IsSUFBSSxHQUFHTixRQUFRLENBQUNnQyxHQUFHLENBQUNsQyxNQUFMLEVBQWF0QixPQUFiLEVBQXNCb0QsSUFBSSxDQUFDMUIsYUFBTCxJQUFzQixFQUE1QyxFQUFnRG1DLGVBQWhELENBQW5CO01BQ0EsSUFBSVMsU0FBSjs7TUFFQSxJQUFJQyxzQkFBQSxDQUFXbkIsSUFBSSxDQUFDbkUsT0FBaEIsQ0FBSixFQUE4QjtRQUM1QnNGLHNCQUFBLENBQVduQixJQUFJLENBQUNuRSxPQUFoQixFQUF5QixHQUFHNkMsSUFBNUI7TUFDRDs7TUFHRDFDLFNBQVMsQ0FBQ1YsTUFBRCxFQUFTOEUsR0FBRyxDQUFDbEMsTUFBSixDQUFXM0MsU0FBcEIsQ0FBVCxDQUF3Q3lGLEtBQXhDLENBQ0csVUFBRCxHQUNHLEdBQUUxRixNQUFNLENBQUNjLFdBQVAsQ0FBbUJDLElBQUssSUFBRzJELElBQUksQ0FBQ25FLE9BQVEsZ0JBRDdDLEdBRUVkLGVBQUEsQ0FBRXFHLFFBQUYsQ0FBV0MsSUFBSSxDQUFDQyxTQUFMLENBQWU1QyxJQUFmLENBQVgsRUFBaUM7UUFBQ1gsTUFBTSxFQUFFd0Q7TUFBVCxDQUFqQyxDQUhKOztNQU1BLElBQUlaLHNCQUFKLEVBQTRCO1FBSTFCakMsSUFBSSxDQUFDVCxJQUFMLENBQVU7VUFBQ3VELFdBQVcsRUFBRXBCO1FBQWQsQ0FBVjtNQUNEOztNQUVEYyxTQUFTLEdBQUcsTUFBTTVGLE1BQU0sQ0FBQzZELGNBQVAsQ0FBc0JhLElBQUksQ0FBQ25FLE9BQTNCLEVBQW9DLEdBQUc2QyxJQUF2QyxDQUFsQjtNQUdBK0IsZUFBZSxHQUFHcEYsZUFBZSxDQUFDQyxNQUFELEVBQVM4RSxHQUFHLENBQUNsQyxNQUFKLENBQVczQyxTQUFwQixDQUFmLElBQWlEa0YsZUFBbkU7O01BSUEsSUFBSTFGLGVBQUEsQ0FBRTBHLGFBQUYsQ0FBZ0JQLFNBQWhCLEtBQThCbkcsZUFBQSxDQUFFMkcsR0FBRixDQUFNUixTQUFOLEVBQWlCLFVBQWpCLENBQWxDLEVBQWdFO1FBQzlEVCxlQUFlLEdBQUdTLFNBQVMsQ0FBQ3ZGLFFBQVYsSUFBc0I4RSxlQUF4Qzs7UUFDQSxJQUFJUyxTQUFTLENBQUNTLEtBQWQsRUFBcUI7VUFDbkIsTUFBTVQsU0FBUyxDQUFDUyxLQUFoQjtRQUNEOztRQUNEVCxTQUFTLEdBQUdBLFNBQVMsQ0FBQ1UsS0FBdEI7TUFDRDs7TUFHRCxJQUFJNUIsSUFBSSxDQUFDbkUsT0FBTCxLQUFpQm5CLHNCQUFyQixFQUE2QztRQUMzQzhGLFlBQVksR0FBR1UsU0FBUyxDQUFDLENBQUQsQ0FBeEI7UUFDQWxGLFNBQVMsQ0FBQ1YsTUFBRCxFQUFTa0YsWUFBVCxDQUFULENBQWdDUSxLQUFoQyxDQUNHLDhCQUE2QlAsZUFBZ0IseUJBQXdCRCxZQUFhLEVBRHJGOztRQUdBLElBQUlDLGVBQWUsS0FBS3ZGLG9CQUFBLENBQVVFLE9BQWxDLEVBQTJDO1VBQ3pDOEYsU0FBUyxHQUFHQSxTQUFTLENBQUMsQ0FBRCxDQUFyQjtRQUNELENBRkQsTUFFTyxJQUFJVCxlQUFlLEtBQUt2RixvQkFBQSxDQUFVQyxHQUFsQyxFQUF1QztVQUM1QytGLFNBQVMsR0FBRztZQUNWVyxZQUFZLEVBQUVYLFNBQVMsQ0FBQyxDQUFEO1VBRGIsQ0FBWjtRQUdEO01BQ0Y7O01BRURBLFNBQVMsR0FBRyxJQUFBWSw0QkFBQSxFQUFvQlosU0FBcEIsQ0FBWjs7TUFHQSxJQUFJbEIsSUFBSSxDQUFDbkUsT0FBTCxLQUFpQmxCLHNCQUFyQixFQUE2QztRQUMzQ3FCLFNBQVMsQ0FBQ1YsTUFBRCxFQUFTOEUsR0FBRyxDQUFDbEMsTUFBSixDQUFXM0MsU0FBcEIsQ0FBVCxDQUF3Q3lGLEtBQXhDLENBQ0csc0JBQXFCakcsZUFBQSxDQUFFcUcsUUFBRixDQUFXQyxJQUFJLENBQUNDLFNBQUwsQ0FBZUosU0FBZixDQUFYLEVBQXNDO1VBQzFEbkQsTUFBTSxFQUFFd0Q7UUFEa0QsQ0FBdEMsQ0FFbkIsRUFITDtRQUtBdkYsU0FBUyxDQUFDVixNQUFELEVBQVM4RSxHQUFHLENBQUNsQyxNQUFKLENBQVczQyxTQUFwQixDQUFULENBQXdDeUYsS0FBeEMsQ0FBOEMsd0NBQTlDO1FBQ0FFLFNBQVMsR0FBRyxJQUFaO01BQ0Q7O01BR0QsSUFBSWEsYUFBQSxDQUFLQyxRQUFMLENBQWNkLFNBQWQsQ0FBSixFQUE4QjtRQUM1QixJQUNFYSxhQUFBLENBQUtDLFFBQUwsQ0FBY2QsU0FBUyxDQUFDZSxNQUF4QixLQUNBLENBQUNDLEtBQUssQ0FBQ2hCLFNBQVMsQ0FBQ2UsTUFBWCxDQUROLElBRUFFLFFBQVEsQ0FBQ2pCLFNBQVMsQ0FBQ2UsTUFBWCxFQUFtQixFQUFuQixDQUFSLEtBQW1DLENBSHJDLEVBSUU7VUFDQSxNQUFNLElBQUFHLGtDQUFBLEVBQTJCbEIsU0FBUyxDQUFDZSxNQUFyQyxFQUE2Q2YsU0FBUyxDQUFDVSxLQUF2RCxDQUFOO1FBQ0QsQ0FORCxNQU1PLElBQUk3RyxlQUFBLENBQUUwRyxhQUFGLENBQWdCUCxTQUFTLENBQUNVLEtBQTFCLEtBQW9DVixTQUFTLENBQUNVLEtBQVYsQ0FBZ0JELEtBQXhELEVBQStEO1VBQ3BFLE1BQU0sSUFBQVUsNEJBQUEsRUFDSm5CLFNBQVMsQ0FBQ1UsS0FBVixDQUFnQkQsS0FEWixFQUVKVCxTQUFTLENBQUNVLEtBQVYsQ0FBZ0JoRSxPQUZaLEVBR0pzRCxTQUFTLENBQUNVLEtBQVYsQ0FBZ0JVLFVBSFosQ0FBTjtRQUtEO01BQ0Y7O01BRURoQyxXQUFXLENBQUNzQixLQUFaLEdBQW9CVixTQUFwQjtNQUNBbEYsU0FBUyxDQUFDVixNQUFELEVBQVM4RSxHQUFHLENBQUNsQyxNQUFKLENBQVczQyxTQUFYLElBQXdCaUYsWUFBakMsQ0FBVCxDQUF3RFEsS0FBeEQsQ0FDRyxhQUFELEdBQ0cseUJBQXdCaEIsSUFBSSxDQUFDbkUsT0FBUSxjQUFhZCxlQUFBLENBQUVxRyxRQUFGLENBQVdDLElBQUksQ0FBQ0MsU0FBTCxDQUFlSixTQUFmLENBQVgsRUFBc0M7UUFDdkZuRCxNQUFNLEVBQUV3RDtNQUQrRSxDQUF0QyxDQUVoRCxFQUpQO0lBTUQsQ0FySkQsQ0FxSkUsT0FBT2dCLEdBQVAsRUFBWTtNQUdaLElBQUlDLFNBQVMsR0FBR0QsR0FBaEI7TUFFQTlCLGVBQWUsR0FDYkEsZUFBZSxJQUFJcEYsZUFBZSxDQUFDQyxNQUFELEVBQVM4RSxHQUFHLENBQUNsQyxNQUFKLENBQVczQyxTQUFYLElBQXdCaUYsWUFBakMsQ0FEcEM7TUFHQSxJQUFJaUMsTUFBTSxHQUFHRixHQUFHLENBQUNELFVBQUosSUFBa0JDLEdBQUcsQ0FBQ0csS0FBbkM7O01BQ0EsSUFBSSxDQUFDM0gsZUFBQSxDQUFFZSxRQUFGLENBQVcyRyxNQUFYLEVBQW1CRixHQUFHLENBQUMzRSxPQUF2QixDQUFMLEVBQXNDO1FBR3BDNkUsTUFBTSxHQUFJLEdBQUVGLEdBQUcsQ0FBQzNFLE9BQVEsR0FBRTZFLE1BQU0sR0FBRyxPQUFPQSxNQUFWLEdBQW1CLEVBQUcsRUFBdEQ7TUFDRDs7TUFDRCxJQUFJLElBQUFFLG1CQUFBLEVBQVlKLEdBQVosRUFBaUIxRSxjQUFBLENBQU8rRSxpQkFBeEIsQ0FBSixFQUFnRDtRQUM5Q0osU0FBUyxHQUFHRCxHQUFHLENBQUNNLGNBQUosRUFBWjtNQUNELENBRkQsTUFFTztRQUNMN0csU0FBUyxDQUFDVixNQUFELEVBQVM4RSxHQUFHLENBQUNsQyxNQUFKLENBQVczQyxTQUFYLElBQXdCaUYsWUFBakMsQ0FBVCxDQUF3RFEsS0FBeEQsQ0FDRywrQ0FBOEN5QixNQUFPLEVBRHhEO01BR0Q7O01BRUQsQ0FBQ2xDLFVBQUQsRUFBYUQsV0FBYixJQUE0QixJQUFBd0MsOEJBQUEsRUFBdUJOLFNBQXZCLENBQTVCO0lBQ0Q7O0lBR0QsSUFBSXpILGVBQUEsQ0FBRWdJLFFBQUYsQ0FBV3pDLFdBQVgsQ0FBSixFQUE2QjtNQUMzQnpELEdBQUcsQ0FBQ29GLE1BQUosQ0FBVzFCLFVBQVgsRUFBdUJ5QyxJQUF2QixDQUE0QjFDLFdBQTVCO0lBQ0QsQ0FGRCxNQUVPO01BQ0wsSUFBSUUsWUFBSixFQUFrQjtRQUNoQixJQUFJQyxlQUFlLEtBQUt2RixvQkFBQSxDQUFVQyxHQUFsQyxFQUF1QztVQUNyQ21GLFdBQVcsQ0FBQ3NCLEtBQVosQ0FBa0JyRyxTQUFsQixHQUE4QmlGLFlBQTlCO1FBQ0QsQ0FGRCxNQUVPO1VBQ0xGLFdBQVcsQ0FBQy9FLFNBQVosR0FBd0JpRixZQUF4QjtRQUNEO01BQ0YsQ0FORCxNQU1PO1FBQ0xGLFdBQVcsQ0FBQy9FLFNBQVosR0FBd0I2RSxHQUFHLENBQUNsQyxNQUFKLENBQVczQyxTQUFYLElBQXdCLElBQWhEO01BQ0Q7O01BRUQsSUFBSWtGLGVBQWUsS0FBS3ZGLG9CQUFBLENBQVVDLEdBQWxDLEVBQXVDO1FBQ3JDLE9BQU9tRixXQUFXLENBQUMvRSxTQUFuQjtNQUNEOztNQUVEK0UsV0FBVyxHQUFHLElBQUEyQyxxQkFBQSxFQUFhM0MsV0FBYixDQUFkO01BQ0F6RCxHQUFHLENBQUNvRixNQUFKLENBQVcxQixVQUFYLEVBQXVCMkMsSUFBdkIsQ0FBNEI1QyxXQUE1QjtJQUNEO0VBQ0YsQ0ExTUQ7O0VBNE1BaEIsR0FBRyxDQUFDUyxNQUFNLENBQUNvRCxXQUFQLEVBQUQsQ0FBSCxDQUEwQnZELElBQTFCLEVBQWdDLENBQUNRLEdBQUQsRUFBTXZELEdBQU4sS0FBYztJQUM1Q3VHLGlCQUFBLENBQUVDLE9BQUYsQ0FBVWxELFlBQVksQ0FBQ0MsR0FBRCxFQUFNdkQsR0FBTixDQUF0QixFQUFrQ3lHLElBQWxDO0VBQ0QsQ0FGRDtBQUdEOztBQUVELFNBQVN6QyxzQkFBVCxDQUFnQ3ZGLE1BQWhDLEVBQXdDOEUsR0FBeEMsRUFBNkN2RSxPQUE3QyxFQUFzRDtFQUVwRCxJQUFJLENBQUNQLE1BQU0sQ0FBQ2lJLFdBQVAsQ0FBbUJuRCxHQUFHLENBQUNsQyxNQUFKLENBQVczQyxTQUE5QixDQUFMLEVBQStDO0lBQzdDLE9BQU8sS0FBUDtFQUNEOztFQUlELElBQUlNLE9BQU8sS0FBS2xCLHNCQUFoQixFQUF3QztJQUN0QyxPQUFPLEtBQVA7RUFDRDs7RUFJRCxJQUFJVyxNQUFNLENBQUNrSSxtQkFBUCxDQUEyQnBELEdBQUcsQ0FBQ2xDLE1BQUosQ0FBVzNDLFNBQXRDLEVBQWlENkUsR0FBRyxDQUFDTCxNQUFyRCxFQUE2REssR0FBRyxDQUFDcUQsV0FBakUsRUFBOEVyRCxHQUFHLENBQUNDLElBQWxGLENBQUosRUFBNkY7SUFDM0YsT0FBTyxLQUFQO0VBQ0Q7O0VBRUQsT0FBTyxJQUFQO0FBQ0Q7O0FBRUQsZUFBZVUsVUFBZixDQUEwQnpGLE1BQTFCLEVBQWtDOEUsR0FBbEMsRUFBdUN2RCxHQUF2QyxFQUE0QztFQUMxQ2IsU0FBUyxDQUFDVixNQUFELEVBQVM4RSxHQUFHLENBQUNsQyxNQUFKLENBQVczQyxTQUFwQixDQUFULENBQXdDVyxJQUF4QyxDQUNFLHdEQURGOztFQUtBLElBQUksQ0FBQ1osTUFBTSxDQUFDb0ksUUFBUCxDQUFnQnRELEdBQUcsQ0FBQ2xDLE1BQUosQ0FBVzNDLFNBQTNCLENBQUwsRUFBNEM7SUFDMUMsTUFBTSxJQUFJMkQsS0FBSixDQUFVLCtEQUFWLENBQU47RUFDRDs7RUFDRCxJQUFJO0lBQ0YsTUFBTTVELE1BQU0sQ0FBQzZELGNBQVAsQ0FBc0IsYUFBdEIsRUFBcUNpQixHQUFyQyxFQUEwQ3ZELEdBQTFDLEVBQStDdUQsR0FBRyxDQUFDbEMsTUFBSixDQUFXM0MsU0FBMUQsQ0FBTjtFQUNELENBRkQsQ0FFRSxPQUFPZ0gsR0FBUCxFQUFZO0lBQ1osSUFBSSxJQUFBSSxtQkFBQSxFQUFZSixHQUFaLEVBQWlCMUUsY0FBQSxDQUFPK0UsaUJBQXhCLENBQUosRUFBZ0Q7TUFDOUMsTUFBTUwsR0FBTjtJQUNELENBRkQsTUFFTztNQUNMLE1BQU0sSUFBSXJELEtBQUosQ0FBVyxpQ0FBZ0NxRCxHQUFHLENBQUMzRSxPQUFRLEVBQXZELENBQU47SUFDRDtFQUNGO0FBQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","names":["CREATE_SESSION_COMMAND","DELETE_SESSION_COMMAND","GET_STATUS_COMMAND","determineProtocol","createSessionArgs","_","some","isW3cCaps","PROTOCOLS","W3C","MJSONWP","extractProtocol","driver","sessionId","dstDriver","isFunction","driverForSession","protocol","isSessionCommand","command","includes","NO_SESSION_ID_COMMANDS","getLogger","log","info","logPrefix","constructor","name","node","getObjectId","substring","logger","wrapParams","paramSets","jsonObj","res","isArray","isObject","wrap","unwrapParams","unwrap","checkParams","requiredParams","optionalParams","receivedParams","keys","required","first","optional","validate","message","errors","BadParametersError","length","indexOf","push","params","difference","makeArgs","requestParams","payloadParams","urlParams","reverse","without","args","flatten","map","p","concat","u","routeConfiguringFunction","sessionExists","Error","executeCommand","execute","addRoutes","app","basePath","DEFAULT_BASE_PATH","extraMethodMap","allMethods","METHOD_MAP","path","methods","toPairs","method","spec","buildHandler","isSessCmd","asyncHandler","req","body","httpResBody","httpStatus","newSessionId","currentProtocol","NoSuchDriverError","didPluginOverrideProxy","neverProxy","driverShouldDoJwpProxy","pluginsToHandleCmd","doJwpProxy","debug","NotImplementedError","driverRes","validators","truncate","JSON","stringify","MAX_LOG_BODY_LENGTH","reqForProxy","isPlainObject","has","error","value","capabilities","formatResponseValue","util","hasValue","status","isNaN","parseInt","errorFromMJSONWPStatusCode","errorFromW3CJsonCode","stacktrace","err","actualErr","errMsg","stack","isErrorType","ProxyRequestError","getActualError","getResponseForW3CError","isString","send","formatStatus","json","toLowerCase","B","resolve","done","proxyActive","proxyRouteIsAvoided","originalUrl","canProxy"],"sources":["../../../lib/protocol/protocol.js"],"sourcesContent":["import _ from 'lodash';\nimport {util, logger, node} from '@appium/support';\nimport {validators} from './validators';\nimport {\n errors,\n isErrorType,\n getResponseForW3CError,\n errorFromMJSONWPStatusCode,\n errorFromW3CJsonCode,\n} from './errors';\nimport {METHOD_MAP, NO_SESSION_ID_COMMANDS} from './routes';\nimport B from 'bluebird';\nimport {formatResponseValue, formatStatus} from './helpers';\nimport {MAX_LOG_BODY_LENGTH, PROTOCOLS, DEFAULT_BASE_PATH} from '../constants';\nimport {isW3cCaps} from '../helpers/capabilities';\n\nconst CREATE_SESSION_COMMAND = 'createSession';\nconst DELETE_SESSION_COMMAND = 'deleteSession';\nconst GET_STATUS_COMMAND = 'getStatus';\n\nfunction determineProtocol(createSessionArgs) {\n return _.some(createSessionArgs, isW3cCaps) ? PROTOCOLS.W3C : PROTOCOLS.MJSONWP;\n}\n\nfunction extractProtocol(driver, sessionId = null) {\n const dstDriver = _.isFunction(driver.driverForSession)\n ? driver.driverForSession(sessionId)\n : driver;\n if (dstDriver === driver) {\n // Shortcircuit if the driver instance is not an umbrella driver\n // or it is Fake driver instance, where `driver.driverForSession`\n // always returns self instance\n return driver.protocol;\n }\n\n // Extract the protocol for the current session if the given driver is the umbrella one\n return dstDriver?.protocol ?? PROTOCOLS.W3C;\n}\n\nfunction isSessionCommand(command) {\n return !_.includes(NO_SESSION_ID_COMMANDS, command);\n}\n\n/**\n *\n * @param {import('@appium/types').ExternalDriver} driver\n * @param {string?} [sessionId]\n * @returns {import('@appium/types').AppiumLogger}\n */\nfunction getLogger(driver, sessionId = null) {\n const dstDriver =\n sessionId && _.isFunction(driver.driverForSession)\n ? driver.driverForSession(sessionId) ?? driver\n : driver;\n if (_.isFunction(dstDriver.log?.info)) {\n return dstDriver.log;\n }\n\n let logPrefix = dstDriver.constructor\n ? `${dstDriver.constructor.name}@${node.getObjectId(dstDriver).substring(0, 8)}`\n : 'AppiumDriver';\n if (sessionId) {\n logPrefix += ` (${sessionId.substring(0, 8)})`;\n }\n return logger.getLogger(logPrefix);\n}\n\nfunction wrapParams(paramSets, jsonObj) {\n /* There are commands like performTouch which take a single parameter (primitive type or array).\n * Some drivers choose to pass this parameter as a value (eg. [action1, action2...]) while others to\n * wrap it within an object(eg' {gesture: [action1, action2...]}), which makes it hard to validate.\n * The wrap option in the spec enforce wrapping before validation, so that all params are wrapped at\n * the time they are validated and later passed to the commands.\n */\n let res = jsonObj;\n if (_.isArray(jsonObj) || !_.isObject(jsonObj)) {\n res = {};\n res[paramSets.wrap] = jsonObj;\n }\n return res;\n}\n\nfunction unwrapParams(paramSets, jsonObj) {\n /* There are commands like setNetworkConnection which send parameters wrapped inside a key such as\n * \"parameters\". This function unwraps them (eg. {\"parameters\": {\"type\": 1}} becomes {\"type\": 1}).\n */\n let res = jsonObj;\n if (_.isObject(jsonObj)) {\n // some clients, like ruby, don't wrap\n if (jsonObj[paramSets.unwrap]) {\n res = jsonObj[paramSets.unwrap];\n }\n }\n return res;\n}\n\nexport function checkParams(paramSets, jsonObj, protocol) {\n let requiredParams = [];\n let optionalParams = [];\n let receivedParams = _.keys(jsonObj);\n\n if (paramSets) {\n if (paramSets.required) {\n // we might have an array of parameters,\n // or an array of arrays of parameters, so standardize\n if (!_.isArray(_.first(paramSets.required))) {\n requiredParams = [paramSets.required];\n } else {\n requiredParams = paramSets.required;\n }\n }\n // optional parameters are just an array\n if (paramSets.optional) {\n optionalParams = paramSets.optional;\n }\n\n // If a function was provided as the 'validate' key, it will here be called with\n // jsonObj as the param. If it returns something falsy, verification will be\n // considered to have passed. If it returns something else, that will be the\n // argument to an error which is thrown to the user\n if (paramSets.validate) {\n let message = paramSets.validate(jsonObj, protocol);\n if (message) {\n throw new errors.BadParametersError(message, jsonObj);\n }\n }\n }\n\n // if we have no required parameters, all is well\n if (requiredParams.length === 0) {\n return;\n }\n\n // some clients pass in the session id in the params\n if (optionalParams.indexOf('sessionId') === -1) {\n optionalParams.push('sessionId');\n }\n\n // some clients pass in an element id in the params\n if (optionalParams.indexOf('id') === -1) {\n optionalParams.push('id');\n }\n\n // go through the required parameters and check against our arguments\n for (let params of requiredParams) {\n if (\n _.difference(receivedParams, params, optionalParams).length === 0 &&\n _.difference(params, receivedParams).length === 0\n ) {\n // we have a set of parameters that is correct\n // so short-circuit\n return;\n }\n }\n throw new errors.BadParametersError(paramSets, receivedParams);\n}\n\n/*\n * This method takes 3 pieces of data: request parameters ('requestParams'),\n * a request JSON body ('jsonObj'), and 'payloadParams', which is the section\n * from the route definition for a particular endpoint which has instructions\n * on handling parameters. This method returns an array of arguments which will\n * be applied to a command.\n */\nexport function makeArgs(requestParams, jsonObj, payloadParams, protocol) {\n // We want to pass the \"url\" parameters to the commands in reverse order\n // since the command will sometimes want to ignore, say, the sessionId.\n // This has the effect of putting sessionId last, which means in JS we can\n // omit it from the function signature if we're not going to use it.\n let urlParams = _.keys(requestParams).reverse();\n\n // In the simple case, the required parameters are a basic array in\n // payloadParams.required, so start there. It's possible that there are\n // multiple optional sets of required params, though, so handle that case\n // too.\n let requiredParams = payloadParams.required;\n if (_.isArray(_.first(payloadParams.required))) {\n // If there are optional sets of required params, then we will have an\n // array of arrays in payloadParams.required, so loop through each set and\n // pick the one that matches which JSON params were actually sent. We've\n // already been through validation so we're guaranteed to find a match.\n let keys = _.keys(jsonObj);\n for (let params of payloadParams.required) {\n if (_.without(params, ...keys).length === 0) {\n requiredParams = params;\n break;\n }\n }\n }\n\n // Now we construct our list of arguments which will be passed to the command\n let args;\n if (_.isFunction(payloadParams.makeArgs)) {\n // In the route spec, a particular route might define a 'makeArgs' function\n // if it wants full control over how to turn JSON parameters into command\n // arguments. So we pass it the JSON parameters and it returns an array\n // which will be applied to the handling command. For example if it returns\n // [1, 2, 3], we will call `command(1, 2, 3, ...)` (url params are separate\n // from JSON params and get concatenated below).\n args = payloadParams.makeArgs(jsonObj, protocol);\n } else {\n // Otherwise, collect all the required and optional params and flatten them\n // into an argument array\n args = _.flatten(requiredParams).map((p) => jsonObj[p]);\n if (payloadParams.optional) {\n args = args.concat(_.flatten(payloadParams.optional).map((p) => jsonObj[p]));\n }\n }\n // Finally, get our url params (session id, element id, etc...) on the end of\n // the list\n args = args.concat(urlParams.map((u) => requestParams[u]));\n return args;\n}\n\n/**\n *\n * @param {import('@appium/types').Core} driver\n * @returns {import('../express/server').RouteConfiguringFunction}\n */\nfunction routeConfiguringFunction(driver) {\n if (!driver.sessionExists) {\n throw new Error('Drivers must implement `sessionExists` property');\n }\n\n // \"execute\" isn't defined anywhere\n // @ts-expect-error\n if (!(driver.executeCommand || driver.execute)) {\n throw new Error('Drivers must implement `executeCommand` or `execute` method');\n }\n\n // return a function which will add all the routes to the driver. Here extraMethods might be\n // passed in as defined by Appium plugins, so we need to add those to the default list\n return function addRoutes(app, {basePath = DEFAULT_BASE_PATH, extraMethodMap = {}} = {}) {\n // store basePath on the driver instance so it can use it if necessary\n // for example in determining proxy avoidance\n driver.basePath = basePath;\n\n const allMethods = {...METHOD_MAP, ...extraMethodMap};\n\n for (const [path, methods] of _.toPairs(allMethods)) {\n for (const [method, spec] of _.toPairs(methods)) {\n // set up the express route handler\n buildHandler(\n app,\n method,\n `${basePath}${path}`,\n spec,\n driver,\n isSessionCommand(spec.command)\n );\n }\n }\n };\n}\n\nfunction buildHandler(app, method, path, spec, driver, isSessCmd) {\n let asyncHandler = async (req, res) => {\n let jsonObj = req.body;\n let httpResBody = {};\n let httpStatus = 200;\n let newSessionId;\n let currentProtocol = extractProtocol(driver, req.params.sessionId);\n\n try {\n // if this is a session command but we don't have a session,\n // error out early (especially before proxying)\n if (isSessCmd && !driver.sessionExists(req.params.sessionId)) {\n throw new errors.NoSuchDriverError();\n }\n\n // if the driver is currently proxying commands to another JSONWP server, bypass all our\n // checks and assume the upstream server knows what it's doing. But keep this in the\n // try/catch block so if proxying itself fails, we give a message to the client. Of course we\n // only want to do these when we have a session command; the Appium driver must be\n // responsible for start/stop session, etc... We also allow the command spec to declare that\n // this command should never be proxied (which is useful for plugin developers who add\n // commands and generally would not want that command to be proxied instead of handled by the\n // plugin)\n let didPluginOverrideProxy = false;\n if (isSessCmd && !spec.neverProxy && driverShouldDoJwpProxy(driver, req, spec.command)) {\n if (\n !driver.pluginsToHandleCmd ||\n driver.pluginsToHandleCmd(spec.command, req.params.sessionId).length === 0\n ) {\n await doJwpProxy(driver, req, res);\n return;\n }\n getLogger(driver, req.params.sessionId).debug(\n `Would have proxied ` +\n `command directly, but a plugin exists which might require its value, so will let ` +\n `its value be collected internally and made part of plugin chain`\n );\n didPluginOverrideProxy = true;\n }\n\n // if a command is not in our method map, it's because we\n // have no plans to ever implement it\n if (!spec.command) {\n throw new errors.NotImplementedError();\n }\n\n // wrap params if necessary\n if (spec.payloadParams && spec.payloadParams.wrap) {\n jsonObj = wrapParams(spec.payloadParams, jsonObj);\n }\n\n // unwrap params if necessary\n if (spec.payloadParams && spec.payloadParams.unwrap) {\n jsonObj = unwrapParams(spec.payloadParams, jsonObj);\n }\n\n if (spec.command === CREATE_SESSION_COMMAND) {\n // try to determine protocol by session creation args, so we can throw a\n // properly formatted error if arguments validation fails\n currentProtocol = determineProtocol(\n makeArgs(req.params, jsonObj, spec.payloadParams || {})\n );\n }\n\n // ensure that the json payload conforms to the spec\n checkParams(spec.payloadParams, jsonObj, currentProtocol);\n\n // turn the command and json payload into an argument list for\n // the driver methods\n let args = makeArgs(req.params, jsonObj, spec.payloadParams || {}, currentProtocol);\n let driverRes;\n // validate command args according to MJSONWP\n if (validators[spec.command]) {\n validators[spec.command](...args);\n }\n\n // run the driver command wrapped inside the argument validators\n getLogger(driver, req.params.sessionId).debug(\n `Calling ` +\n `${driver.constructor.name}.${spec.command}() with args: ` +\n _.truncate(JSON.stringify(args), {length: MAX_LOG_BODY_LENGTH})\n );\n\n if (didPluginOverrideProxy) {\n // TODO for now we add this information on the args list, but that's mixing purposes here.\n // We really should add another 'options' parameter to 'executeCommand', but this would be\n // a breaking change for all drivers so would need to be handled carefully.\n args.push({reqForProxy: req});\n }\n\n driverRes = await driver.executeCommand(spec.command, ...args);\n\n // Get the protocol after executeCommand\n currentProtocol = extractProtocol(driver, req.params.sessionId) || currentProtocol;\n\n // If `executeCommand` was overridden and the method returns an object\n // with a protocol and value/error property, re-assign the protocol\n if (_.isPlainObject(driverRes) && _.has(driverRes, 'protocol')) {\n currentProtocol = driverRes.protocol || currentProtocol;\n if (driverRes.error) {\n throw driverRes.error;\n }\n driverRes = driverRes.value;\n }\n\n // unpack createSession response\n if (spec.command === CREATE_SESSION_COMMAND) {\n newSessionId = driverRes[0];\n getLogger(driver, newSessionId).debug(\n `Cached the protocol value '${currentProtocol}' for the new session ${newSessionId}`\n );\n if (currentProtocol === PROTOCOLS.MJSONWP) {\n driverRes = driverRes[1];\n } else if (currentProtocol === PROTOCOLS.W3C) {\n driverRes = {\n capabilities: driverRes[1],\n };\n }\n }\n\n driverRes = formatResponseValue(driverRes);\n\n // delete should not return anything even if successful\n if (spec.command === DELETE_SESSION_COMMAND) {\n getLogger(driver, req.params.sessionId).debug(\n `Received response: ${_.truncate(JSON.stringify(driverRes), {\n length: MAX_LOG_BODY_LENGTH,\n })}`\n );\n getLogger(driver, req.params.sessionId).debug('But deleting session, so not returning');\n driverRes = null;\n }\n\n // if the status is not 0, throw the appropriate error for status code.\n if (util.hasValue(driverRes)) {\n if (\n util.hasValue(driverRes.status) &&\n !isNaN(driverRes.status) &&\n parseInt(driverRes.status, 10) !== 0\n ) {\n throw errorFromMJSONWPStatusCode(driverRes.status, driverRes.value);\n } else if (_.isPlainObject(driverRes.value) && driverRes.value.error) {\n throw errorFromW3CJsonCode(\n driverRes.value.error,\n driverRes.value.message,\n driverRes.value.stacktrace\n );\n }\n }\n\n httpResBody.value = driverRes;\n getLogger(driver, req.params.sessionId || newSessionId).debug(\n `Responding ` +\n `to client with driver.${spec.command}() result: ${_.truncate(JSON.stringify(driverRes), {\n length: MAX_LOG_BODY_LENGTH,\n })}`\n );\n } catch (err) {\n // if anything goes wrong, figure out what our response should be\n // based on the type of error that we encountered\n let actualErr = err;\n\n currentProtocol =\n currentProtocol || extractProtocol(driver, req.params.sessionId || newSessionId);\n\n let errMsg = err.stacktrace || err.stack;\n if (!_.includes(errMsg, err.message)) {\n // if the message has more information, add it. but often the message\n // is the first part of the stack trace\n errMsg = `${err.message}${errMsg ? '\\n' + errMsg : ''}`;\n }\n if (isErrorType(err, errors.ProxyRequestError)) {\n actualErr = err.getActualError();\n } else {\n getLogger(driver, req.params.sessionId || newSessionId).debug(\n `Encountered internal error running command: ${errMsg}`\n );\n }\n\n [httpStatus, httpResBody] = getResponseForW3CError(actualErr);\n }\n\n // decode the response, which is either a string or json\n if (_.isString(httpResBody)) {\n res.status(httpStatus).send(httpResBody);\n } else {\n if (newSessionId) {\n if (currentProtocol === PROTOCOLS.W3C) {\n httpResBody.value.sessionId = newSessionId;\n } else {\n httpResBody.sessionId = newSessionId;\n }\n } else {\n httpResBody.sessionId = req.params.sessionId || null;\n }\n // Don't include sessionId in W3C responses\n if (currentProtocol === PROTOCOLS.W3C) {\n delete httpResBody.sessionId;\n }\n\n httpResBody = formatStatus(httpResBody);\n res.status(httpStatus).json(httpResBody);\n }\n };\n // add the method to the app\n app[method.toLowerCase()](path, (req, res) => {\n B.resolve(asyncHandler(req, res)).done();\n });\n}\n\nfunction driverShouldDoJwpProxy(driver, req, command) {\n // drivers need to explicitly say when the proxy is active\n if (!driver.proxyActive(req.params.sessionId)) {\n return false;\n }\n\n // we should never proxy deleteSession because we need to give the containing\n // driver an opportunity to clean itself up\n if (command === DELETE_SESSION_COMMAND) {\n return false;\n }\n\n // validate avoidance schema, and say we shouldn't proxy if anything in the\n // avoid list matches our req\n if (driver.proxyRouteIsAvoided(req.params.sessionId, req.method, req.originalUrl, req.body)) {\n return false;\n }\n\n return true;\n}\n\nasync function doJwpProxy(driver, req, res) {\n getLogger(driver, req.params.sessionId).info(\n 'Driver proxy active, passing request on via HTTP proxy'\n );\n\n // check that the inner driver has a proxy function\n if (!driver.canProxy(req.params.sessionId)) {\n throw new Error('Trying to proxy to a server but the driver is unable to proxy');\n }\n try {\n await driver.executeCommand('proxyReqRes', req, res, req.params.sessionId);\n } catch (err) {\n if (isErrorType(err, errors.ProxyRequestError)) {\n throw err;\n } else {\n throw new Error(`Could not proxy. Proxy error: ${err.message}`);\n }\n }\n}\n\nexport {\n routeConfiguringFunction,\n isSessionCommand,\n driverShouldDoJwpProxy,\n determineProtocol,\n CREATE_SESSION_COMMAND,\n DELETE_SESSION_COMMAND,\n GET_STATUS_COMMAND,\n};\n"],"mappings":"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"}
|