@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
|
});
|
|
@@ -30,6 +28,8 @@ var _asyncLock = _interopRequireDefault(require("async-lock"));
|
|
|
30
28
|
|
|
31
29
|
var _axios = _interopRequireDefault(require("axios"));
|
|
32
30
|
|
|
31
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
32
|
+
|
|
33
33
|
const IPA_EXT = '.ipa';
|
|
34
34
|
const ZIP_EXTS = ['.zip', IPA_EXT];
|
|
35
35
|
const ZIP_MIME_TYPES = ['application/zip', 'application/x-zip-compressed', 'multipart/x-zip'];
|
|
@@ -543,4 +543,4 @@ var _default = {
|
|
|
543
543
|
generateDriverLogPrefix
|
|
544
544
|
};
|
|
545
545
|
exports.default = _default;
|
|
546
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJUEFfRVhUIiwiWklQX0VYVFMiLCJaSVBfTUlNRV9UWVBFUyIsIkNBQ0hFRF9BUFBTX01BWF9BR0UiLCJNQVhfQ0FDSEVEX0FQUFMiLCJBUFBMSUNBVElPTlNfQ0FDSEUiLCJMUlUiLCJtYXgiLCJ0dGwiLCJ1cGRhdGVBZ2VPbkdldCIsImRpc3Bvc2UiLCJhcHAiLCJmdWxsUGF0aCIsImxvZ2dlciIsImluZm8iLCJmcyIsInJpbXJhZiIsIm5vRGlzcG9zZU9uU2V0IiwiQVBQTElDQVRJT05TX0NBQ0hFX0dVQVJEIiwiQXN5bmNMb2NrIiwiU0FOSVRJWkVfUkVQTEFDRU1FTlQiLCJERUZBVUxUX0JBU0VOQU1FIiwiQVBQX0RPV05MT0FEX1RJTUVPVVRfTVMiLCJwcm9jZXNzIiwib24iLCJzaXplIiwiYXBwUGF0aHMiLCJ2YWx1ZXMiLCJtYXAiLCJkZWJ1ZyIsImxlbmd0aCIsInV0aWwiLCJwbHVyYWxpemUiLCJhcHBQYXRoIiwicmltcmFmU3luYyIsImUiLCJ3YXJuIiwibWVzc2FnZSIsInJldHJpZXZlSGVhZGVycyIsImxpbmsiLCJheGlvcyIsInVybCIsIm1ldGhvZCIsInRpbWVvdXQiLCJoZWFkZXJzIiwiZ2V0Q2FjaGVkQXBwbGljYXRpb25QYXRoIiwiY3VycmVudEFwcFByb3BzIiwiY2FjaGVkQXBwSW5mbyIsInJlZnJlc2giLCJfIiwiaXNQbGFpbk9iamVjdCIsImxhc3RNb2RpZmllZCIsImN1cnJlbnRNb2RpZmllZCIsImltbXV0YWJsZSIsImN1cnJlbnRJbW11dGFibGUiLCJtYXhBZ2UiLCJjdXJyZW50TWF4QWdlIiwidGltZXN0YW1wIiwiZ2V0VGltZSIsIm1zTGVmdCIsIkRhdGUiLCJub3ciLCJwYXRoIiwiYmFzZW5hbWUiLCJ2ZXJpZnlBcHBFeHRlbnNpb24iLCJzdXBwb3J0ZWRBcHBFeHRlbnNpb25zIiwidG9Mb3dlciIsImluY2x1ZGVzIiwiZXh0bmFtZSIsIkVycm9yIiwiY2FsY3VsYXRlRm9sZGVySW50ZWdyaXR5IiwiZm9sZGVyUGF0aCIsImdsb2IiLCJjd2QiLCJzdHJpY3QiLCJub3NvcnQiLCJjYWxjdWxhdGVGaWxlSW50ZWdyaXR5IiwiZmlsZVBhdGgiLCJoYXNoIiwiaXNBcHBJbnRlZ3JpdHlPayIsImN1cnJlbnRQYXRoIiwiZXhwZWN0ZWRJbnRlZ3JpdHkiLCJleGlzdHMiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJmb2xkZXIiLCJmaWxlIiwiY29uZmlndXJlQXBwIiwib3B0aW9ucyIsImlzU3RyaW5nIiwib25Qb3N0UHJvY2VzcyIsImlzQXJyYXkiLCJ1bmRlZmluZWQiLCJzdXBwb3J0ZWRFeHRlbnNpb25zIiwiaXNFbXB0eSIsIm5ld0FwcCIsInNob3VsZFVuemlwQXBwIiwicGFja2FnZUhhc2giLCJyZW1vdGVBcHBQcm9wcyIsInByb3RvY29sIiwicGF0aG5hbWUiLCJwYXJzZSIsImlzVXJsIiwiZ2V0IiwiYWNxdWlyZSIsInRlc3QiLCJtYXhBZ2VNYXRjaCIsImV4ZWMiLCJwYXJzZUludCIsImNhY2hlZFBhdGgiLCJpbnRlZ3JpdHkiLCJkZWxldGUiLCJmaWxlTmFtZSIsInNhbml0aXplTmFtZSIsImRlY29kZVVSSUNvbXBvbmVudCIsInJlcGxhY2VtZW50IiwiY3QiLCJzb21lIiwibWltZVR5cGUiLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJtYXRjaCIsInJlc3VsdGluZ05hbWUiLCJzdWJzdHJpbmciLCJyZXN1bHRpbmdFeHQiLCJmaXJzdCIsInRhcmdldFBhdGgiLCJ0ZW1wRGlyIiwicHJlZml4Iiwic3VmZml4IiwiZG93bmxvYWRBcHAiLCJlcnJvck1lc3NhZ2UiLCJpc1BhY2thZ2VBRmlsZSIsImlzRmlsZSIsImlzRnVuY3Rpb24iLCJhcmNoaXZlUGF0aCIsInRtcFJvb3QiLCJvcGVuRGlyIiwidW56aXBBcHAiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsInN0b3JlQXBwSW5DYWNoZSIsImFwcFBhdGhUb0NhY2hlIiwiY2FjaGVkRnVsbFBhdGgiLCJzZXQiLCJyZXN1bHQiLCJjbG9uZSIsIkJvb2xlYW4iLCJocmVmIiwibmV0IiwiZG93bmxvYWRGaWxlIiwiZXJyIiwiemlwUGF0aCIsImRzdFJvb3QiLCJ6aXAiLCJhc3NlcnRWYWxpZFppcCIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsInVzZVN5c3RlbVVuemlwRW52IiwiZW52IiwiQVBQSVVNX1BSRUZFUl9TWVNURU1fVU5aSVAiLCJ1c2VTeXN0ZW1VbnppcCIsImV4dHJhY3Rpb25PcHRzIiwiZmlsZU5hbWVzRW5jb2RpbmciLCJleHRyYWN0QWxsVG8iLCJnbG9iUGF0dGVybiIsImV4dCIsInJlcGxhY2UiLCJqb2luIiwic29ydGVkQnVuZGxlSXRlbXMiLCJzb3J0IiwiYSIsImIiLCJzcGxpdCIsInNlcCIsImVycm9yQW5kVGhyb3ciLCJNYXRoIiwicm91bmQiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwibWF0Y2hlZEJ1bmRsZSIsImRzdFBhdGgiLCJtdiIsIm1rZGlycCIsImlzUGFja2FnZU9yQnVuZGxlIiwiZHVwbGljYXRlS2V5cyIsImlucHV0IiwiZmlyc3RLZXkiLCJzZWNvbmRLZXkiLCJpdGVtIiwicmVzdWx0T2JqIiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwicmVjdXJzaXZlbHlDYWxsZWRWYWx1ZSIsInBhcnNlQ2Fwc0FycmF5IiwiY2FwIiwicGFyc2VkQ2FwcyIsIkpTT04iLCJpZ24iLCJnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCIsIm9iaiIsInNlc3Npb25JZCIsImluc3RhbmNlTmFtZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm5vZGUiLCJnZXRPYmplY3RJZCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9iYXNlZHJpdmVyL2hlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge3RlbXBEaXIsIGZzLCB1dGlsLCB6aXAsIG5ldCwgdGltaW5nLCBub2RlfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5cbmNvbnN0IElQQV9FWFQgPSAnLmlwYSc7XG5jb25zdCBaSVBfRVhUUyA9IFsnLnppcCcsIElQQV9FWFRdO1xuY29uc3QgWklQX01JTUVfVFlQRVMgPSBbJ2FwcGxpY2F0aW9uL3ppcCcsICdhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkJywgJ211bHRpcGFydC94LXppcCddO1xuY29uc3QgQ0FDSEVEX0FQUFNfTUFYX0FHRSA9IDEwMDAgKiA2MCAqIDYwICogMjQ7IC8vIG1zXG5jb25zdCBNQVhfQ0FDSEVEX0FQUFMgPSAxMDI0O1xuY29uc3QgQVBQTElDQVRJT05TX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogTUFYX0NBQ0hFRF9BUFBTLFxuICB0dGw6IENBQ0hFRF9BUFBTX01BWF9BR0UsIC8vIGV4cGlyZSBhZnRlciAyNCBob3Vyc1xuICB1cGRhdGVBZ2VPbkdldDogdHJ1ZSxcbiAgZGlzcG9zZTogKGFwcCwge2Z1bGxQYXRofSkgPT4ge1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYFRoZSBhcHBsaWNhdGlvbiAnJHthcHB9JyBjYWNoZWQgYXQgJyR7ZnVsbFBhdGh9JyBoYXMgYCArXG4gICAgICAgIGBleHBpcmVkIGFmdGVyICR7Q0FDSEVEX0FQUFNfTUFYX0FHRX1tc2BcbiAgICApO1xuICAgIGlmIChmdWxsUGF0aCkge1xuICAgICAgZnMucmltcmFmKGZ1bGxQYXRoKTtcbiAgICB9XG4gIH0sXG4gIG5vRGlzcG9zZU9uU2V0OiB0cnVlLFxufSk7XG5jb25zdCBBUFBMSUNBVElPTlNfQ0FDSEVfR1VBUkQgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBTQU5JVElaRV9SRVBMQUNFTUVOVCA9ICctJztcbmNvbnN0IERFRkFVTFRfQkFTRU5BTUUgPSAnYXBwaXVtLWFwcCc7XG5jb25zdCBBUFBfRE9XTkxPQURfVElNRU9VVF9NUyA9IDEyMCAqIDEwMDA7XG5cbnByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gIGlmIChBUFBMSUNBVElPTlNfQ0FDSEUuc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFwcFBhdGhzID0gWy4uLkFQUExJQ0FUSU9OU19DQUNIRS52YWx1ZXMoKV0ubWFwKCh7ZnVsbFBhdGh9KSA9PiBmdWxsUGF0aCk7XG4gIGxvZ2dlci5kZWJ1ZyhcbiAgICBgUGVyZm9ybWluZyBjbGVhbnVwIG9mICR7YXBwUGF0aHMubGVuZ3RofSBjYWNoZWQgYCArXG4gICAgICB1dGlsLnBsdXJhbGl6ZSgnYXBwbGljYXRpb24nLCBhcHBQYXRocy5sZW5ndGgpXG4gICk7XG4gIGZvciAoY29uc3QgYXBwUGF0aCBvZiBhcHBQYXRocykge1xuICAgIHRyeSB7XG4gICAgICAvLyBBc3luY2hyb25vdXMgY2FsbHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gb25FeGl0IGhhbmRsZXJcbiAgICAgIGZzLnJpbXJhZlN5bmMoYXBwUGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZUhlYWRlcnMobGluaykge1xuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogbGluayxcbiAgICAgICAgbWV0aG9kOiAnSEVBRCcsXG4gICAgICAgIHRpbWVvdXQ6IDUwMDAsXG4gICAgICB9KVxuICAgICkuaGVhZGVycztcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5pbmZvKGBDYW5ub3Qgc2VuZCBIRUFEIHJlcXVlc3QgdG8gJyR7bGlua30nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBnZXRDYWNoZWRBcHBsaWNhdGlvblBhdGgobGluaywgY3VycmVudEFwcFByb3BzID0ge30sIGNhY2hlZEFwcEluZm8gPSB7fSkge1xuICBjb25zdCByZWZyZXNoID0gKCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQSBmcmVzaCBjb3B5IG9mIHRoZSBhcHBsaWNhdGlvbiBpcyBnb2luZyB0byBiZSBkb3dubG9hZGVkIGZyb20gJHtsaW5rfWApO1xuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGNhY2hlZEFwcEluZm8pIHx8ICFfLmlzUGxhaW5PYmplY3QoY3VycmVudEFwcFByb3BzKSkge1xuICAgIC8vIGlmIGFuIGludmFsaWQgYXJnIGlzIHBhc3NlZCB0aGVuIGFzc3VtZSBjYWNoZSBtaXNzXG4gICAgcmV0dXJuIHJlZnJlc2goKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBsYXN0TW9kaWZpZWQ6IGN1cnJlbnRNb2RpZmllZCxcbiAgICBpbW11dGFibGU6IGN1cnJlbnRJbW11dGFibGUsXG4gICAgLy8gbWF4QWdlIGlzIGluIHNlY29uZHNcbiAgICBtYXhBZ2U6IGN1cnJlbnRNYXhBZ2UsXG4gIH0gPSBjdXJyZW50QXBwUHJvcHM7XG4gIGNvbnN0IHtcbiAgICAvLyBEYXRlIGluc3RhbmNlXG4gICAgbGFzdE1vZGlmaWVkLFxuICAgIC8vIGJvb2xlYW5cbiAgICBpbW11dGFibGUsXG4gICAgLy8gVW5peCB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICAgIHRpbWVzdGFtcCxcbiAgICBmdWxsUGF0aCxcbiAgfSA9IGNhY2hlZEFwcEluZm87XG4gIGlmIChsYXN0TW9kaWZpZWQgJiYgY3VycmVudE1vZGlmaWVkKSB7XG4gICAgaWYgKGN1cnJlbnRNb2RpZmllZC5nZXRUaW1lKCkgPD0gbGFzdE1vZGlmaWVkLmdldFRpbWUoKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBUaGUgYXBwbGljYXRpb24gYXQgJHtsaW5rfSBoYXMgbm90IGJlZW4gbW9kaWZpZWQgc2luY2UgJHtsYXN0TW9kaWZpZWR9YCk7XG4gICAgICByZXR1cm4gZnVsbFBhdGg7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIGFwcGxpY2F0aW9uIGF0ICR7bGlua30gaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgJHtsYXN0TW9kaWZpZWR9YCk7XG4gICAgcmV0dXJuIHJlZnJlc2goKTtcbiAgfVxuICBpZiAoaW1tdXRhYmxlICYmIGN1cnJlbnRJbW11dGFibGUpIHtcbiAgICBsb2dnZXIuZGVidWcoYFRoZSBhcHBsaWNhdGlvbiBhdCAke2xpbmt9IGlzIGltbXV0YWJsZWApO1xuICAgIHJldHVybiBmdWxsUGF0aDtcbiAgfVxuICBpZiAoY3VycmVudE1heEFnZSAmJiB0aW1lc3RhbXApIHtcbiAgICBjb25zdCBtc0xlZnQgPSB0aW1lc3RhbXAgKyBjdXJyZW50TWF4QWdlICogMTAwMCAtIERhdGUubm93KCk7XG4gICAgaWYgKG1zTGVmdCA+IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFRoZSBjYWNoZWQgYXBwbGljYXRpb24gJyR7cGF0aC5iYXNlbmFtZShmdWxsUGF0aCl9JyB3aWxsIGV4cGlyZSBpbiAke21zTGVmdCAvIDEwMDB9c2BcbiAgICAgICk7XG4gICAgICByZXR1cm4gZnVsbFBhdGg7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIGNhY2hlZCBhcHBsaWNhdGlvbiAnJHtwYXRoLmJhc2VuYW1lKGZ1bGxQYXRoKX0nIGhhcyBleHBpcmVkYCk7XG4gIH1cbiAgcmV0dXJuIHJlZnJlc2goKTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5QXBwRXh0ZW5zaW9uKGFwcCwgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucykge1xuICBpZiAoc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucy5tYXAoXy50b0xvd2VyKS5pbmNsdWRlcyhfLnRvTG93ZXIocGF0aC5leHRuYW1lKGFwcCkpKSkge1xuICAgIHJldHVybiBhcHA7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBOZXcgYXBwIHBhdGggJyR7YXBwfScgZGlkIG5vdCBoYXZlIGAgK1xuICAgICAgYCR7dXRpbC5wbHVyYWxpemUoJ2V4dGVuc2lvbicsIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMubGVuZ3RoLCBmYWxzZSl9OiBgICtcbiAgICAgIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnNcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlRm9sZGVySW50ZWdyaXR5KGZvbGRlclBhdGgpIHtcbiAgcmV0dXJuIChhd2FpdCBmcy5nbG9iKCcqKi8qJywge2N3ZDogZm9sZGVyUGF0aCwgc3RyaWN0OiBmYWxzZSwgbm9zb3J0OiB0cnVlfSkpLmxlbmd0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlRmlsZUludGVncml0eShmaWxlUGF0aCkge1xuICByZXR1cm4gYXdhaXQgZnMuaGFzaChmaWxlUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzQXBwSW50ZWdyaXR5T2soY3VycmVudFBhdGgsIGV4cGVjdGVkSW50ZWdyaXR5ID0ge30pIHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGN1cnJlbnRQYXRoKSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBGb2xkZXIgaW50ZWdyaXR5IGNoZWNrIGlzIHNpbXBsZTpcbiAgLy8gVmVyaWZ5IHRoZSBwcmV2aW91cyBhbW91bnQgb2YgZmlsZXMgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBvbmUuXG4gIC8vIFdlIGRvbid0IHdhbnQgdG8gdXNlIGVxdWFsaXR5IGNvbXBhcmlzb24gYmVjYXVzZSBvZiBhbiBhc3N1bXB0aW9uIHRoYXQgdGhlIE9TIG1pZ2h0XG4gIC8vIGNyZWF0ZSBzb21lIHVud2FudGVkIHNlcnZpY2UgZmlsZXMvY2FjaGVkIGluc2lkZSBvZiB0aGF0IGZvbGRlciBvciBpdHMgc3ViZm9sZGVycy5cbiAgLy8gT2ZjLCB2YWxpZGF0aW5nIHRoZSBoYXNoIHN1bSBvZiBlYWNoIGZpbGUgKG9yIGF0IGxlYXN0IG9mIGZpbGUgcGF0aCkgd291bGQgYmUgbXVjaFxuICAvLyBtb3JlIHByZWNpc2UsIGJ1dCB3ZSBkb24ndCBuZWVkIHRvIGJlIHZlcnkgcHJlY2lzZSBoZXJlIGFuZCBhbHNvIGRvbid0IHdhbnQgdG9cbiAgLy8gb3ZlcnVzZSBSQU0gYW5kIGhhdmUgYSBwZXJmb3JtYW5jZSBkcm9wLlxuICByZXR1cm4gKGF3YWl0IGZzLnN0YXQoY3VycmVudFBhdGgpKS5pc0RpcmVjdG9yeSgpXG4gICAgPyAoYXdhaXQgY2FsY3VsYXRlRm9sZGVySW50ZWdyaXR5KGN1cnJlbnRQYXRoKSkgPj0gZXhwZWN0ZWRJbnRlZ3JpdHk/LmZvbGRlclxuICAgIDogKGF3YWl0IGNhbGN1bGF0ZUZpbGVJbnRlZ3JpdHkoY3VycmVudFBhdGgpKSA9PT0gZXhwZWN0ZWRJbnRlZ3JpdHk/LmZpbGU7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgUG9zdFByb2Nlc3NPcHRpb25zXG4gKiBAcHJvcGVydHkgez9PYmplY3R9IGNhY2hlZEFwcEluZm8gVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91c2x5IGNhY2hlZCBhcHAgaW5zdGFuY2UgKGlmIGV4aXN0cyk6XG4gKiAgICAtIHBhY2thZ2VIYXNoOiBTSEExIGhhc2ggb2YgdGhlIHBhY2thZ2UgaWYgaXQgaXMgYSBmaWxlIGFuZCBub3QgYSBmb2xkZXJcbiAqICAgIC0gbGFzdE1vZGlmaWVkOiBPcHRpb25hbCBEYXRlIGluc3RhbmNlLCB0aGUgdmFsdWUgb2YgZmlsZSdzIGBMYXN0LU1vZGlmaWVkYCBoZWFkZXJcbiAqICAgIC0gaW1tdXRhYmxlOiBPcHRpb25hbCBib29sZWFuIHZhbHVlLiBDb250YWlucyB0cnVlIGlmIHRoZSBmaWxlIGhhcyBhbiBgaW1tdXRhYmxlYCBtYXJrXG4gKiAgICAgICAgICAgICAgICAgaW4gYENhY2hlLWNvbnRyb2xgIGhlYWRlclxuICogICAgLSBtYXhBZ2U6IE9wdGlvbmFsIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYG1heEFnZWAgcGFyYW1ldGVyIGluIGBDYWNoZS1jb250cm9sYCBoZWFkZXJcbiAqICAgIC0gdGltZXN0YW1wOiBUaGUgdGltZXN0YW1wIHRoaXMgaXRlbSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgY2FjaGUgKG1lYXN1cmVkIGluIFVuaXggZXBvY2hcbiAqICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMpXG4gKiAgICAtIGludGVncml0eTogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZWl0aGVyIGBmaWxlYCBwcm9wZXJ0eSB3aXRoIFNIQTEgaGFzaCBvZiB0aGUgZmlsZVxuICogICAgICAgICAgICAgICAgIG9yIGBmb2xkZXJgIHByb3BlcnR5IHdpdGggdG90YWwgYW1vdW50IG9mIGNhY2hlZCBmaWxlcyBhbmQgc3ViZm9sZGVyc1xuICogICAgLSBmdWxsUGF0aDogdGhlIGZ1bGwgcGF0aCB0byB0aGUgY2FjaGVkIGFwcFxuICogQHByb3BlcnR5IHtib29sZWFufSBpc1VybCBXaGV0aGVyIHRoZSBhcHAgaGFzIGJlZW4gZG93bmxvYWRlZCBmcm9tIGEgcmVtb3RlIFVSTFxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBoZWFkZXJzIE9wdGlvbmFsIGhlYWRlcnMgb2JqZWN0LiBPbmx5IHByZXNlbnQgaWYgYGlzVXJsYCBpcyB0cnVlIGFuZCBpZiB0aGUgc2VydmVyXG4gKiByZXNwb25kcyB0byBIRUFEIHJlcXVlc3RzLiBBbGwgaGVhZGVyIG5hbWVzIGFyZSBub3JtYWxpemVkIHRvIGxvd2VyY2FzZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYXRoIEEgc3RyaW5nIGNvbnRhaW5pbmcgZnVsbCBwYXRoIHRvIHRoZSBwcmVwcm9jZXNzZWQgYXBwbGljYXRpb24gcGFja2FnZSAoZWl0aGVyXG4gKiBkb3dubG9hZGVkIG9yIGEgbG9jYWwgb25lKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUG9zdFByb2Nlc3NSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYXRoIFRoZSBmdWxsIHBhc3QgdG8gdGhlIHBvc3QtcHJvY2Vzc2VkIGFwcGxpY2F0aW9uIHBhY2thZ2Ugb24gdGhlXG4gKiBsb2NhbCBmaWxlIHN5c3RlbSAobWlnaHQgYmUgYSBmaWxlIG9yIGEgZm9sZGVyIHBhdGgpXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb25maWd1cmVBcHBPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhvYmo6IFBvc3RQcm9jZXNzT3B0aW9ucykgPT4gKFByb21pc2U8UG9zdFByb2Nlc3NSZXN1bHR8dW5kZWZpbmVkPnxQb3N0UHJvY2Vzc1Jlc3VsdHx1bmRlZmluZWQpfSBbb25Qb3N0UHJvY2Vzc11cbiAqIE9wdGlvbmFsIGZ1bmN0aW9uLCB3aGljaCBzaG91bGQgYmUgYXBwbGllZFxuICogdG8gdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGl0IGlzIGRvd25sb2FkZWQvcHJlcHJvY2Vzc2VkLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBhc3luY1xuICogYW5kIGlzIGV4cGVjdGVkIHRvIGFjY2VwdCBzaW5nbGUgb2JqZWN0IHBhcmFtZXRlci5cbiAqIFRoZSBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBlaXRoZXIgcmV0dXJuIGEgZmFsc3kgdmFsdWUsIHdoaWNoIG1lYW5zIHRoZSBhcHAgbXVzdCBub3QgYmVcbiAqIGNhY2hlZCBhbmQgYSBmcmVzaCBjb3B5IG9mIGl0IGlzIGRvd25sb2FkZWQgZWFjaCB0aW1lLiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gb2JqZWN0XG4gKiBjb250YWluaW5nIGBhcHBQYXRoYCBwcm9wZXJ0eSB0aGVuIHRoZSBpbnRlZ3JpdHkgb2YgaXQgd2lsbCBiZSB2ZXJpZmllZCBhbmQgc3RvcmVkIGludG9cbiAqIHRoZSBjYWNoZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHN1cHBvcnRlZEV4dGVuc2lvbnMgTGlzdCBvZiBzdXBwb3J0ZWQgYXBwbGljYXRpb24gZXh0ZW5zaW9ucyAoXG4gKiBpbmNsdWRpbmcgc3RhcnRpbmcgZG90cykuIFRoaXMgcHJvcGVydHkgaXMgbWFuZGF0b3J5IGFuZCBtdXN0IG5vdCBiZSBlbXB0eS5cbiAqL1xuXG4vKipcbiAqIFByZXBhcmVzIGFuIGFwcCB0byBiZSB1c2VkIGluIGFuIGF1dG9tYXRlZCB0ZXN0LiBUaGUgYXBwIGdldHMgY2FjaGVkIGF1dG9tYXRpY2FsbHlcbiAqIGlmIGl0IGlzIGFuIGFyY2hpdmUgb3IgaWYgaXQgaXMgZG93bmxvYWRlZCBmcm9tIGFuIFVSTC5cbiAqIElmIHRoZSBkb3dubG9hZGVkIGFwcCBoYXMgYC56aXBgIGV4dGVuc2lvbiwgdGhpcyBtZXRob2Qgd2lsbCB1bnppcCBpdC5cbiAqIFRoZSB1bnppcCBkb2VzIG5vdCB3b3JrIHdoZW4gYG9uUG9zdFByb2Nlc3NgIGlzIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHAgRWl0aGVyIGEgZnVsbCBwYXRoIHRvIHRoZSBhcHAgb3IgYSByZW1vdGUgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXXxDb25maWd1cmVBcHBPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZXN1bHRpbmcgYXBwbGljYXRpb24gYnVuZGxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbmZpZ3VyZUFwcChhcHAsIG9wdGlvbnMgPSAvKiogQHR5cGUge0NvbmZpZ3VyZUFwcE9wdGlvbnN9ICovICh7fSkpIHtcbiAgaWYgKCFfLmlzU3RyaW5nKGFwcCkpIHtcbiAgICAvLyBpbW1lZGlhdGVseSBzaG9ydGNpcmN1aXQgaWYgbm90IGdpdmVuIGFuIGFwcFxuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zO1xuICBjb25zdCBvblBvc3RQcm9jZXNzID1cbiAgICAhXy5pc1N0cmluZyhvcHRpb25zKSAmJiAhXy5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucy5vblBvc3RQcm9jZXNzIDogdW5kZWZpbmVkO1xuXG4gIGlmIChfLmlzU3RyaW5nKG9wdGlvbnMpKSB7XG4gICAgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyA9IFtvcHRpb25zXTtcbiAgfSBlbHNlIGlmIChfLmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zID0gb3B0aW9ucztcbiAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zID0gb3B0aW9ucy5zdXBwb3J0ZWRFeHRlbnNpb25zO1xuICB9XG4gIGlmIChfLmlzRW1wdHkoc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9uZSBvciBtb3JlIHN1cHBvcnRlZCBhcHAgZXh0ZW5zaW9ucyBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gIH1cblxuICBsZXQgbmV3QXBwID0gYXBwO1xuICBsZXQgc2hvdWxkVW56aXBBcHAgPSBmYWxzZTtcbiAgbGV0IHBhY2thZ2VIYXNoID0gbnVsbDtcbiAgbGV0IGhlYWRlcnMgPSBudWxsO1xuICAvKiogQHR5cGUge1JlbW90ZUFwcFByb3BzfSAqL1xuICBjb25zdCByZW1vdGVBcHBQcm9wcyA9IHtcbiAgICBsYXN0TW9kaWZpZWQ6IG51bGwsXG4gICAgaW1tdXRhYmxlOiBmYWxzZSxcbiAgICBtYXhBZ2U6IG51bGwsXG4gIH07XG4gIGNvbnN0IHtwcm90b2NvbCwgcGF0aG5hbWV9ID0gdXJsLnBhcnNlKG5ld0FwcCk7XG4gIGNvbnN0IGlzVXJsID0gcHJvdG9jb2wgPT09IG51bGwgPyBmYWxzZSA6IFsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXMocHJvdG9jb2wpO1xuXG4gIGNvbnN0IGNhY2hlZEFwcEluZm8gPSBBUFBMSUNBVElPTlNfQ0FDSEUuZ2V0KGFwcCk7XG5cbiAgcmV0dXJuIGF3YWl0IEFQUExJQ0FUSU9OU19DQUNIRV9HVUFSRC5hY3F1aXJlKGFwcCwgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1VybCkge1xuICAgICAgLy8gVXNlIHRoZSBhcHAgZnJvbSByZW1vdGUgVVJMXG4gICAgICBsb2dnZXIuaW5mbyhgVXNpbmcgZG93bmxvYWRhYmxlIGFwcCAnJHtuZXdBcHB9J2ApO1xuICAgICAgaGVhZGVycyA9IGF3YWl0IHJldHJpZXZlSGVhZGVycyhuZXdBcHApO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoaGVhZGVycykpIHtcbiAgICAgICAgaWYgKGhlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXSkge1xuICAgICAgICAgIHJlbW90ZUFwcFByb3BzLmxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKGhlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXSk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBMYXN0LU1vZGlmaWVkOiAke2hlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXX1gKTtcbiAgICAgICAgaWYgKGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSkge1xuICAgICAgICAgIHJlbW90ZUFwcFByb3BzLmltbXV0YWJsZSA9IC9cXGJpbW11dGFibGVcXGIvaS50ZXN0KGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSk7XG4gICAgICAgICAgY29uc3QgbWF4QWdlTWF0Y2ggPSAvXFxibWF4LWFnZT0oXFxkKylcXGIvaS5leGVjKGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSk7XG4gICAgICAgICAgaWYgKG1heEFnZU1hdGNoKSB7XG4gICAgICAgICAgICByZW1vdGVBcHBQcm9wcy5tYXhBZ2UgPSBwYXJzZUludChtYXhBZ2VNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZGVidWcoYENhY2hlLUNvbnRyb2w6ICR7aGVhZGVyc1snY2FjaGUtY29udHJvbCddfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgY2FjaGVkUGF0aCA9IGdldENhY2hlZEFwcGxpY2F0aW9uUGF0aChhcHAsIHJlbW90ZUFwcFByb3BzLCBjYWNoZWRBcHBJbmZvKTtcbiAgICAgIGlmIChjYWNoZWRQYXRoKSB7XG4gICAgICAgIGlmIChhd2FpdCBpc0FwcEludGVncml0eU9rKGNhY2hlZFBhdGgsIGNhY2hlZEFwcEluZm8/LmludGVncml0eSkpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgUmV1c2luZyBwcmV2aW91c2x5IGRvd25sb2FkZWQgYXBwbGljYXRpb24gYXQgJyR7Y2FjaGVkUGF0aH0nYCk7XG4gICAgICAgICAgcmV0dXJuIHZlcmlmeUFwcEV4dGVuc2lvbihjYWNoZWRQYXRoLCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgVGhlIGFwcGxpY2F0aW9uIGF0ICcke2NhY2hlZFBhdGh9JyBkb2VzIG5vdCBleGlzdCBhbnltb3JlIGAgK1xuICAgICAgICAgICAgYG9yIGl0cyBpbnRlZ3JpdHkgaGFzIGJlZW4gZGFtYWdlZC4gRGVsZXRpbmcgaXQgZnJvbSB0aGUgaW50ZXJuYWwgY2FjaGVgXG4gICAgICAgICk7XG4gICAgICAgIEFQUExJQ0FUSU9OU19DQUNIRS5kZWxldGUoYXBwKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbGVOYW1lID0gbnVsbDtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gZnMuc2FuaXRpemVOYW1lKHBhdGguYmFzZW5hbWUoZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhuYW1lID8/ICcnKSksIHtcbiAgICAgICAgcmVwbGFjZW1lbnQ6IFNBTklUSVpFX1JFUExBQ0VNRU5ULFxuICAgICAgfSk7XG4gICAgICBjb25zdCBleHRuYW1lID0gcGF0aC5leHRuYW1lKGJhc2VuYW1lKTtcbiAgICAgIC8vIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHVuemlwIHRoZSBhcHAsIHdlIGhhdmUgYSBudW1iZXIgb2YgcGxhY2VzXG4gICAgICAvLyB0byBsb29rOiBjb250ZW50IHR5cGUsIGNvbnRlbnQgZGlzcG9zaXRpb24sIG9yIHRoZSBmaWxlIGV4dGVuc2lvblxuICAgICAgaWYgKFpJUF9FWFRTLmluY2x1ZGVzKGV4dG5hbWUpKSB7XG4gICAgICAgIGZpbGVOYW1lID0gYmFzZW5hbWU7XG4gICAgICAgIHNob3VsZFVuemlwQXBwID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChoZWFkZXJzWydjb250ZW50LXR5cGUnXSkge1xuICAgICAgICBjb25zdCBjdCA9IGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddO1xuICAgICAgICBsb2dnZXIuZGVidWcoYENvbnRlbnQtVHlwZTogJHtjdH1gKTtcbiAgICAgICAgLy8gdGhlIGZpbGV0eXBlIG1heSBub3QgYmUgb2J2aW91cyBmb3IgY2VydGFpbiB1cmxzLCBzbyBjaGVjayB0aGUgbWltZSB0eXBlIHRvb1xuICAgICAgICBpZiAoXG4gICAgICAgICAgWklQX01JTUVfVFlQRVMuc29tZSgobWltZVR5cGUpID0+XG4gICAgICAgICAgICBuZXcgUmVnRXhwKGBcXFxcYiR7Xy5lc2NhcGVSZWdFeHAobWltZVR5cGUpfVxcXFxiYCkudGVzdChjdClcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICghZmlsZU5hbWUpIHtcbiAgICAgICAgICAgIGZpbGVOYW1lID0gYCR7REVGQVVMVF9CQVNFTkFNRX0uemlwYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2hvdWxkVW56aXBBcHAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddICYmIC9eYXR0YWNobWVudC9pLnRlc3QoaGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYENvbnRlbnQtRGlzcG9zaXRpb246ICR7aGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddfWApO1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9maWxlbmFtZT1cIihbXlwiXSspL2kuZXhlYyhoZWFkZXJzWydjb250ZW50LWRpc3Bvc2l0aW9uJ10pO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBmaWxlTmFtZSA9IGZzLnNhbml0aXplTmFtZShtYXRjaFsxXSwge1xuICAgICAgICAgICAgcmVwbGFjZW1lbnQ6IFNBTklUSVpFX1JFUExBQ0VNRU5ULFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNob3VsZFVuemlwQXBwID0gc2hvdWxkVW56aXBBcHAgfHwgWklQX0VYVFMuaW5jbHVkZXMocGF0aC5leHRuYW1lKGZpbGVOYW1lKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZmlsZU5hbWUpIHtcbiAgICAgICAgLy8gYXNzaWduIHRoZSBkZWZhdWx0IGZpbGUgbmFtZSBhbmQgdGhlIGV4dGVuc2lvbiBpZiBub25lIGhhcyBiZWVuIGRldGVjdGVkXG4gICAgICAgIGNvbnN0IHJlc3VsdGluZ05hbWUgPSBiYXNlbmFtZVxuICAgICAgICAgID8gYmFzZW5hbWUuc3Vic3RyaW5nKDAsIGJhc2VuYW1lLmxlbmd0aCAtIGV4dG5hbWUubGVuZ3RoKVxuICAgICAgICAgIDogREVGQVVMVF9CQVNFTkFNRTtcbiAgICAgICAgbGV0IHJlc3VsdGluZ0V4dCA9IGV4dG5hbWU7XG4gICAgICAgIGlmICghc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucy5pbmNsdWRlcyhyZXN1bHRpbmdFeHQpKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgVGhlIGN1cnJlbnQgZmlsZSBleHRlbnNpb24gJyR7cmVzdWx0aW5nRXh0fScgaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgICAgICAgIGBEZWZhdWx0aW5nIHRvICcke18uZmlyc3Qoc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyl9J2BcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc3VsdGluZ0V4dCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoXy5maXJzdChzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmlsZU5hbWUgPSBgJHtyZXN1bHRpbmdOYW1lfSR7cmVzdWx0aW5nRXh0fWA7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXRQYXRoID0gYXdhaXQgdGVtcERpci5wYXRoKHtcbiAgICAgICAgcHJlZml4OiBmaWxlTmFtZSxcbiAgICAgICAgc3VmZml4OiAnJyxcbiAgICAgIH0pO1xuICAgICAgbmV3QXBwID0gYXdhaXQgZG93bmxvYWRBcHAobmV3QXBwLCB0YXJnZXRQYXRoKTtcbiAgICB9IGVsc2UgaWYgKGF3YWl0IGZzLmV4aXN0cyhuZXdBcHApKSB7XG4gICAgICAvLyBVc2UgdGhlIGxvY2FsIGFwcFxuICAgICAgbG9nZ2VyLmluZm8oYFVzaW5nIGxvY2FsIGFwcCAnJHtuZXdBcHB9J2ApO1xuICAgICAgc2hvdWxkVW56aXBBcHAgPSBaSVBfRVhUUy5pbmNsdWRlcyhwYXRoLmV4dG5hbWUobmV3QXBwKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBgVGhlIGFwcGxpY2F0aW9uIGF0ICcke25ld0FwcH0nIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlYDtcbiAgICAgIC8vIHByb3RvY29sIHZhbHVlIGZvciAnQzpcXFxcdGVtcCcgaXMgJ2M6Jywgc28gd2UgY2hlY2sgdGhlIGxlbmd0aCBhcyB3ZWxsXG4gICAgICBpZiAoXy5pc1N0cmluZyhwcm90b2NvbCkgJiYgcHJvdG9jb2wubGVuZ3RoID4gMikge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgIGBUaGUgcHJvdG9jb2wgJyR7cHJvdG9jb2x9JyB1c2VkIGluICcke25ld0FwcH0nIGlzIG5vdCBzdXBwb3J0ZWQuIGAgK1xuICAgICAgICAgIGBPbmx5IGh0dHA6IGFuZCBodHRwczogcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWRgO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNQYWNrYWdlQUZpbGUgPSAoYXdhaXQgZnMuc3RhdChuZXdBcHApKS5pc0ZpbGUoKTtcbiAgICBpZiAoaXNQYWNrYWdlQUZpbGUpIHtcbiAgICAgIHBhY2thZ2VIYXNoID0gYXdhaXQgY2FsY3VsYXRlRmlsZUludGVncml0eShuZXdBcHApO1xuICAgIH1cblxuICAgIGlmIChpc1BhY2thZ2VBRmlsZSAmJiBzaG91bGRVbnppcEFwcCAmJiAhXy5pc0Z1bmN0aW9uKG9uUG9zdFByb2Nlc3MpKSB7XG4gICAgICBjb25zdCBhcmNoaXZlUGF0aCA9IG5ld0FwcDtcbiAgICAgIGlmIChwYWNrYWdlSGFzaCA9PT0gY2FjaGVkQXBwSW5mbz8ucGFja2FnZUhhc2gpIHtcbiAgICAgICAgY29uc3Qge2Z1bGxQYXRofSA9IGNhY2hlZEFwcEluZm87XG4gICAgICAgIGlmIChhd2FpdCBpc0FwcEludGVncml0eU9rKGZ1bGxQYXRoLCBjYWNoZWRBcHBJbmZvPy5pbnRlZ3JpdHkpKSB7XG4gICAgICAgICAgaWYgKGFyY2hpdmVQYXRoICE9PSBhcHApIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZihhcmNoaXZlUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ2dlci5pbmZvKGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIGFwcGxpY2F0aW9uIGF0ICcke2Z1bGxQYXRofSdgKTtcbiAgICAgICAgICByZXR1cm4gdmVyaWZ5QXBwRXh0ZW5zaW9uKGZ1bGxQYXRoLCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgVGhlIGFwcGxpY2F0aW9uIGF0ICcke2Z1bGxQYXRofScgZG9lcyBub3QgZXhpc3QgYW55bW9yZSBgICtcbiAgICAgICAgICAgIGBvciBpdHMgaW50ZWdyaXR5IGhhcyBiZWVuIGRhbWFnZWQuIERlbGV0aW5nIGl0IGZyb20gdGhlIGNhY2hlYFxuICAgICAgICApO1xuICAgICAgICBBUFBMSUNBVElPTlNfQ0FDSEUuZGVsZXRlKGFwcCk7XG4gICAgICB9XG4gICAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgICB0cnkge1xuICAgICAgICBuZXdBcHAgPSBhd2FpdCB1bnppcEFwcChhcmNoaXZlUGF0aCwgdG1wUm9vdCwgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobmV3QXBwICE9PSBhcmNoaXZlUGF0aCAmJiBhcmNoaXZlUGF0aCAhPT0gYXBwKSB7XG4gICAgICAgICAgYXdhaXQgZnMucmltcmFmKGFyY2hpdmVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9nZ2VyLmluZm8oYFVuemlwcGVkIGxvY2FsIGFwcCB0byAnJHtuZXdBcHB9J2ApO1xuICAgIH0gZWxzZSBpZiAoIXBhdGguaXNBYnNvbHV0ZShuZXdBcHApKSB7XG4gICAgICBuZXdBcHAgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgbmV3QXBwKTtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgVGhlIGN1cnJlbnQgYXBwbGljYXRpb24gcGF0aCAnJHthcHB9JyBpcyBub3QgYWJzb2x1dGUgYCArXG4gICAgICAgICAgYGFuZCBoYXMgYmVlbiByZXdyaXR0ZW4gdG8gJyR7bmV3QXBwfScuIENvbnNpZGVyIHVzaW5nIGFic29sdXRlIHBhdGhzIHJhdGhlciB0aGFuIHJlbGF0aXZlYFxuICAgICAgKTtcbiAgICAgIGFwcCA9IG5ld0FwcDtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZUFwcEluQ2FjaGUgPSBhc3luYyAoYXBwUGF0aFRvQ2FjaGUpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlZEZ1bGxQYXRoID0gY2FjaGVkQXBwSW5mbz8uZnVsbFBhdGg7XG4gICAgICBpZiAoY2FjaGVkRnVsbFBhdGggJiYgY2FjaGVkRnVsbFBhdGggIT09IGFwcFBhdGhUb0NhY2hlKSB7XG4gICAgICAgIGF3YWl0IGZzLnJpbXJhZihjYWNoZWRGdWxsUGF0aCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnRlZ3JpdHkgPSB7fTtcbiAgICAgIGlmICgoYXdhaXQgZnMuc3RhdChhcHBQYXRoVG9DYWNoZSkpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaW50ZWdyaXR5LmZvbGRlciA9IGF3YWl0IGNhbGN1bGF0ZUZvbGRlckludGVncml0eShhcHBQYXRoVG9DYWNoZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlZ3JpdHkuZmlsZSA9IGF3YWl0IGNhbGN1bGF0ZUZpbGVJbnRlZ3JpdHkoYXBwUGF0aFRvQ2FjaGUpO1xuICAgICAgfVxuICAgICAgQVBQTElDQVRJT05TX0NBQ0hFLnNldChhcHAsIHtcbiAgICAgICAgLi4ucmVtb3RlQXBwUHJvcHMsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgcGFja2FnZUhhc2gsXG4gICAgICAgIGludGVncml0eSxcbiAgICAgICAgZnVsbFBhdGg6IGFwcFBhdGhUb0NhY2hlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYXBwUGF0aFRvQ2FjaGU7XG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ob25Qb3N0UHJvY2VzcykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9uUG9zdFByb2Nlc3Moe1xuICAgICAgICBjYWNoZWRBcHBJbmZvOiBfLmNsb25lKGNhY2hlZEFwcEluZm8pLFxuICAgICAgICBpc1VybCxcbiAgICAgICAgaGVhZGVyczogXy5jbG9uZShoZWFkZXJzKSxcbiAgICAgICAgYXBwUGF0aDogbmV3QXBwLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gIXJlc3VsdD8uYXBwUGF0aCB8fCBhcHAgPT09IHJlc3VsdD8uYXBwUGF0aCB8fCAhKGF3YWl0IGZzLmV4aXN0cyhyZXN1bHQ/LmFwcFBhdGgpKVxuICAgICAgICA/IG5ld0FwcFxuICAgICAgICA6IGF3YWl0IHN0b3JlQXBwSW5DYWNoZShyZXN1bHQuYXBwUGF0aCk7XG4gICAgfVxuXG4gICAgdmVyaWZ5QXBwRXh0ZW5zaW9uKG5ld0FwcCwgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyk7XG4gICAgcmV0dXJuIGFwcCAhPT0gbmV3QXBwICYmIChwYWNrYWdlSGFzaCB8fCBfLnZhbHVlcyhyZW1vdGVBcHBQcm9wcykuc29tZShCb29sZWFuKSlcbiAgICAgID8gYXdhaXQgc3RvcmVBcHBJbkNhY2hlKG5ld0FwcClcbiAgICAgIDogbmV3QXBwO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRBcHAoYXBwLCB0YXJnZXRQYXRoKSB7XG4gIGNvbnN0IHtocmVmfSA9IHVybC5wYXJzZShhcHApO1xuICB0cnkge1xuICAgIGF3YWl0IG5ldC5kb3dubG9hZEZpbGUoaHJlZiwgdGFyZ2V0UGF0aCwge1xuICAgICAgdGltZW91dDogQVBQX0RPV05MT0FEX1RJTUVPVVRfTVMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRvd25sb2FkIHRoZSBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHRhcmdldFBhdGg7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGJ1bmRsZSBmcm9tIGFuIGFyY2hpdmUgaW50byB0aGUgZ2l2ZW4gZm9sZGVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHppcFBhdGggRnVsbCBwYXRoIHRvIHRoZSBhcmNoaXZlIGNvbnRhaW5pbmcgdGhlIGJ1bmRsZVxuICogQHBhcmFtIHtzdHJpbmd9IGRzdFJvb3QgRnVsbCBwYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIGV4dHJhY3RlZCBidW5kbGVcbiAqIHNob3VsZCBiZSBwbGFjZWRcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPnxzdHJpbmd9IHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMgVGhlIGxpc3Qgb2YgZXh0ZW5zaW9uc1xuICogdGhlIHRhcmdldCBhcHBsaWNhdGlvbiBidW5kbGUgc3VwcG9ydHMsIGZvciBleGFtcGxlIFsnLmFwaycsICcuYXBrcyddIGZvclxuICogQW5kcm9pZCBwYWNrYWdlc1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gRnVsbCBwYXRoIHRvIHRoZSBidW5kbGUgaW4gdGhlIGRlc3RpbmF0aW9uIGZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBhcmNoaXZlIGlzIGludmFsaWQgb3Igbm8gYXBwbGljYXRpb24gYnVuZGxlc1xuICogaGF2ZSBiZWVuIGZvdW5kIGluc2lkZVxuICovXG5hc3luYyBmdW5jdGlvbiB1bnppcEFwcCh6aXBQYXRoLCBkc3RSb290LCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKSB7XG4gIGF3YWl0IHppcC5hc3NlcnRWYWxpZFppcCh6aXBQYXRoKTtcblxuICBpZiAoIV8uaXNBcnJheShzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKSkge1xuICAgIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMgPSBbc3VwcG9ydGVkQXBwRXh0ZW5zaW9uc107XG4gIH1cblxuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIHRyeSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBVbnppcHBpbmcgJyR7emlwUGF0aH0nYCk7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBjb25zdCB1c2VTeXN0ZW1VbnppcEVudiA9IHByb2Nlc3MuZW52LkFQUElVTV9QUkVGRVJfU1lTVEVNX1VOWklQO1xuICAgIGNvbnN0IHVzZVN5c3RlbVVuemlwID1cbiAgICAgIF8uaXNFbXB0eSh1c2VTeXN0ZW1VbnppcEVudikgfHwgIVsnMCcsICdmYWxzZSddLmluY2x1ZGVzKF8udG9Mb3dlcih1c2VTeXN0ZW1VbnppcEVudikpO1xuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgdG8gdXNlIHVzZSB0aGUgc3lzdGVtIGB1bnppcGAgKGUuZy4sIGAvdXNyL2Jpbi91bnppcGApIGR1ZVxuICAgICAqIHRvIHRoZSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpdCBwcm92aWRlcyBvdmVyIHRoZSBuYXRpdmVcbiAgICAgKiBKUyBcInVuemlwXCIgaW1wbGVtZW50YXRpb24uXG4gICAgICogQHR5cGUge2ltcG9ydCgnQGFwcGl1bS9zdXBwb3J0L2xpYi96aXAnKS5FeHRyYWN0QWxsT3B0aW9uc31cbiAgICAgKi9cbiAgICBjb25zdCBleHRyYWN0aW9uT3B0cyA9IHt1c2VTeXN0ZW1VbnppcH07XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE0MTAwXG4gICAgaWYgKHBhdGguZXh0bmFtZSh6aXBQYXRoKSA9PT0gSVBBX0VYVCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgRW5mb3JjaW5nIFVURi04IGVuY29kaW5nIG9uIHRoZSBleHRyYWN0ZWQgZmlsZSBuYW1lcyBmb3IgJyR7cGF0aC5iYXNlbmFtZSh6aXBQYXRoKX0nYFxuICAgICAgKTtcbiAgICAgIGV4dHJhY3Rpb25PcHRzLmZpbGVOYW1lc0VuY29kaW5nID0gJ3V0ZjgnO1xuICAgIH1cbiAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHppcFBhdGgsIHRtcFJvb3QsIGV4dHJhY3Rpb25PcHRzKTtcbiAgICBjb25zdCBnbG9iUGF0dGVybiA9IGAqKi8qLisoJHtzdXBwb3J0ZWRBcHBFeHRlbnNpb25zXG4gICAgICAubWFwKChleHQpID0+IGV4dC5yZXBsYWNlKC9eXFwuLywgJycpKVxuICAgICAgLmpvaW4oJ3wnKX0pYDtcbiAgICBjb25zdCBzb3J0ZWRCdW5kbGVJdGVtcyA9IChcbiAgICAgIGF3YWl0IGZzLmdsb2IoZ2xvYlBhdHRlcm4sIHtcbiAgICAgICAgY3dkOiB0bXBSb290LFxuICAgICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgICAvLyBHZXQgdGhlIHRvcCBsZXZlbCBtYXRjaFxuICAgICAgfSlcbiAgICApLnNvcnQoKGEsIGIpID0+IGEuc3BsaXQocGF0aC5zZXApLmxlbmd0aCAtIGIuc3BsaXQocGF0aC5zZXApLmxlbmd0aCk7XG4gICAgaWYgKF8uaXNFbXB0eShzb3J0ZWRCdW5kbGVJdGVtcykpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KFxuICAgICAgICBgQXBwIHVuemlwcGVkIE9LLCBidXQgd2UgY291bGQgbm90IGZpbmQgYW55ICcke3N1cHBvcnRlZEFwcEV4dGVuc2lvbnN9JyBgICtcbiAgICAgICAgICB1dGlsLnBsdXJhbGl6ZSgnYnVuZGxlJywgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucy5sZW5ndGgsIGZhbHNlKSArXG4gICAgICAgICAgYCBpbiBpdC4gTWFrZSBzdXJlIHlvdXIgYXJjaGl2ZSBjb250YWlucyBhdCBsZWFzdCBvbmUgcGFja2FnZSBoYXZpbmcgYCArXG4gICAgICAgICAgYCcke3N1cHBvcnRlZEFwcEV4dGVuc2lvbnN9JyAke3V0aWwucGx1cmFsaXplKFxuICAgICAgICAgICAgJ2V4dGVuc2lvbicsXG4gICAgICAgICAgICBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zLmxlbmd0aCxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgKX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgRXh0cmFjdGVkICR7dXRpbC5wbHVyYWxpemUoJ2J1bmRsZSBpdGVtJywgc29ydGVkQnVuZGxlSXRlbXMubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICAgIGBmcm9tICcke3ppcFBhdGh9JyBpbiAke01hdGgucm91bmQoXG4gICAgICAgICAgdGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kc1xuICAgICAgICApfW1zOiAke3NvcnRlZEJ1bmRsZUl0ZW1zfWBcbiAgICApO1xuICAgIGNvbnN0IG1hdGNoZWRCdW5kbGUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKF8uZmlyc3Qoc29ydGVkQnVuZGxlSXRlbXMpKTtcbiAgICBsb2dnZXIuaW5mbyhgQXNzdW1pbmcgJyR7bWF0Y2hlZEJ1bmRsZX0nIGlzIHRoZSBjb3JyZWN0IGJ1bmRsZWApO1xuICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUoZHN0Um9vdCwgcGF0aC5iYXNlbmFtZShtYXRjaGVkQnVuZGxlKSk7XG4gICAgYXdhaXQgZnMubXYocGF0aC5yZXNvbHZlKHRtcFJvb3QsIG1hdGNoZWRCdW5kbGUpLCBkc3RQYXRoLCB7bWtkaXJwOiB0cnVlfSk7XG4gICAgcmV0dXJuIGRzdFBhdGg7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUGFja2FnZU9yQnVuZGxlKGFwcCkge1xuICByZXR1cm4gL14oW2EtekEtWjAtOVxcLV9dK1xcLlthLXpBLVowLTlcXC1fXSspKyQvLnRlc3QoYXBwKTtcbn1cblxuLyoqXG4gKiBGaW5kcyBhbGwgaW5zdGFuY2VzICdmaXJzdEtleScgYW5kIGNyZWF0ZSBhIGR1cGxpY2F0ZSB3aXRoIHRoZSBrZXkgJ3NlY29uZEtleScsXG4gKiBEbyB0aGUgc2FtZSB0aGluZyBpbiByZXZlcnNlLiBJZiB3ZSBmaW5kICdzZWNvbmRLZXknLCBjcmVhdGUgYSBkdXBsaWNhdGUgd2l0aCB0aGUga2V5ICdmaXJzdEtleScuXG4gKlxuICogVGhpcyB3aWxsIGNhdXNlIGtleXMgdG8gYmUgb3ZlcndyaXR0ZW4gaWYgdGhlIG9iamVjdCBjb250YWlucyAnZmlyc3RLZXknIGFuZCAnc2Vjb25kS2V5Jy5cblxuICogQHBhcmFtIHsqfSBpbnB1dCBBbnkgdHlwZSBvZiBpbnB1dFxuICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0S2V5IFRoZSBmaXJzdCBrZXkgdG8gZHVwbGljYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gc2Vjb25kS2V5IFRoZSBzZWNvbmQga2V5IHRvIGR1cGxpY2F0ZVxuICovXG5mdW5jdGlvbiBkdXBsaWNhdGVLZXlzKGlucHV0LCBmaXJzdEtleSwgc2Vjb25kS2V5KSB7XG4gIC8vIElmIGFycmF5IHByb3ZpZGVkLCByZWN1cnNpdmVseSBjYWxsIG9uIGFsbCBlbGVtZW50c1xuICBpZiAoXy5pc0FycmF5KGlucHV0KSkge1xuICAgIHJldHVybiBpbnB1dC5tYXAoKGl0ZW0pID0+IGR1cGxpY2F0ZUtleXMoaXRlbSwgZmlyc3RLZXksIHNlY29uZEtleSkpO1xuICB9XG5cbiAgLy8gSWYgb2JqZWN0LCBjcmVhdGUgZHVwbGljYXRlcyBmb3Iga2V5cyBhbmQgdGhlbiByZWN1cnNpdmVseSBjYWxsIG9uIHZhbHVlc1xuICBpZiAoXy5pc1BsYWluT2JqZWN0KGlucHV0KSkge1xuICAgIGNvbnN0IHJlc3VsdE9iaiA9IHt9O1xuICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoaW5wdXQpKSB7XG4gICAgICBjb25zdCByZWN1cnNpdmVseUNhbGxlZFZhbHVlID0gZHVwbGljYXRlS2V5cyh2YWx1ZSwgZmlyc3RLZXksIHNlY29uZEtleSk7XG4gICAgICBpZiAoa2V5ID09PSBmaXJzdEtleSkge1xuICAgICAgICByZXN1bHRPYmpbc2Vjb25kS2V5XSA9IHJlY3Vyc2l2ZWx5Q2FsbGVkVmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gc2Vjb25kS2V5KSB7XG4gICAgICAgIHJlc3VsdE9ialtmaXJzdEtleV0gPSByZWN1cnNpdmVseUNhbGxlZFZhbHVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0T2JqW2tleV0gPSByZWN1cnNpdmVseUNhbGxlZFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0T2JqO1xuICB9XG5cbiAgLy8gQmFzZSBjYXNlLiBSZXR1cm4gcHJpbWl0aXZlcyB3aXRob3V0IGRvaW5nIGFueXRoaW5nLlxuICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogVGFrZXMgYSBkZXNpcmVkIGNhcGFiaWxpdHkgYW5kIHRyaWVzIHRvIEpTT04ucGFyc2UgaXQgYXMgYW4gYXJyYXksXG4gKiBhbmQgZWl0aGVyIHJldHVybnMgdGhlIHBhcnNlZCBhcnJheSBvciBhIHNpbmdsZXRvbiBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxTdHJpbmc+fSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqL1xuZnVuY3Rpb24gcGFyc2VDYXBzQXJyYXkoY2FwKSB7XG4gIGlmIChfLmlzQXJyYXkoY2FwKSkge1xuICAgIHJldHVybiBjYXA7XG4gIH1cblxuICBsZXQgcGFyc2VkQ2FwcztcbiAgdHJ5IHtcbiAgICBwYXJzZWRDYXBzID0gSlNPTi5wYXJzZShjYXApO1xuICAgIGlmIChfLmlzQXJyYXkocGFyc2VkQ2FwcykpIHtcbiAgICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICAgIH1cbiAgfSBjYXRjaCAoaWduKSB7XG4gICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBjYXBhYmlsaXR5IGFzIEpTT04gYXJyYXlgKTtcbiAgfVxuICBpZiAoXy5pc1N0cmluZyhjYXApKSB7XG4gICAgcmV0dXJuIFtjYXBdO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgZGVzY3JpYmVzIGRyaXZlciBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29yZX0gb2JqIGRyaXZlciBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmc/fSBzZXNzaW9uSWQgc2Vzc2lvbiBpZGVudGlmaWVyIChpZiBleGlzdHMpXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeChvYmosIHNlc3Npb25JZCA9IG51bGwpIHtcbiAgY29uc3QgaW5zdGFuY2VOYW1lID0gYCR7b2JqLmNvbnN0cnVjdG9yLm5hbWV9QCR7bm9kZS5nZXRPYmplY3RJZChvYmopLnN1YnN0cmluZygwLCA0KX1gO1xuICByZXR1cm4gc2Vzc2lvbklkID8gYCR7aW5zdGFuY2VOYW1lfSAoJHtzZXNzaW9uSWQuc3Vic3RyaW5nKDAsIDgpfSlgIDogaW5zdGFuY2VOYW1lO1xufVxuXG4vKiogQHR5cGUge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckhlbHBlcnN9ICovXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbmZpZ3VyZUFwcCxcbiAgaXNQYWNrYWdlT3JCdW5kbGUsXG4gIGR1cGxpY2F0ZUtleXMsXG4gIHBhcnNlQ2Fwc0FycmF5LFxuICBnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCxcbn07XG5leHBvcnQge2NvbmZpZ3VyZUFwcCwgaXNQYWNrYWdlT3JCdW5kbGUsIGR1cGxpY2F0ZUtleXMsIHBhcnNlQ2Fwc0FycmF5LCBnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeH07XG5cbi8qKlxuICogQHR5cGVkZWYgUmVtb3RlQXBwUHJvcHNcbiAqIEBwcm9wZXJ0eSB7RGF0ZT99IGxhc3RNb2RpZmllZFxuICogQHByb3BlcnR5IHtib29sZWFufSBpbW11dGFibGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyP30gbWF4QWdlXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLE9BQU8sR0FBRyxNQUFoQjtBQUNBLE1BQU1DLFFBQVEsR0FBRyxDQUFDLE1BQUQsRUFBU0QsT0FBVCxDQUFqQjtBQUNBLE1BQU1FLGNBQWMsR0FBRyxDQUFDLGlCQUFELEVBQW9CLDhCQUFwQixFQUFvRCxpQkFBcEQsQ0FBdkI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxPQUFPLEVBQVAsR0FBWSxFQUFaLEdBQWlCLEVBQTdDO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLElBQXhCO0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsSUFBSUMsaUJBQUosQ0FBUTtFQUNqQ0MsR0FBRyxFQUFFSCxlQUQ0QjtFQUVqQ0ksR0FBRyxFQUFFTCxtQkFGNEI7RUFHakNNLGNBQWMsRUFBRSxJQUhpQjtFQUlqQ0MsT0FBTyxFQUFFLENBQUNDLEdBQUQsRUFBTTtJQUFDQztFQUFELENBQU4sS0FBcUI7SUFDNUJDLGVBQUEsQ0FBT0MsSUFBUCxDQUNHLG9CQUFtQkgsR0FBSSxnQkFBZUMsUUFBUyxRQUFoRCxH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
|
|
546
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJUEFfRVhUIiwiWklQX0VYVFMiLCJaSVBfTUlNRV9UWVBFUyIsIkNBQ0hFRF9BUFBTX01BWF9BR0UiLCJNQVhfQ0FDSEVEX0FQUFMiLCJBUFBMSUNBVElPTlNfQ0FDSEUiLCJMUlUiLCJtYXgiLCJ0dGwiLCJ1cGRhdGVBZ2VPbkdldCIsImRpc3Bvc2UiLCJhcHAiLCJmdWxsUGF0aCIsImxvZ2dlciIsImluZm8iLCJmcyIsInJpbXJhZiIsIm5vRGlzcG9zZU9uU2V0IiwiQVBQTElDQVRJT05TX0NBQ0hFX0dVQVJEIiwiQXN5bmNMb2NrIiwiU0FOSVRJWkVfUkVQTEFDRU1FTlQiLCJERUZBVUxUX0JBU0VOQU1FIiwiQVBQX0RPV05MT0FEX1RJTUVPVVRfTVMiLCJwcm9jZXNzIiwib24iLCJzaXplIiwiYXBwUGF0aHMiLCJ2YWx1ZXMiLCJtYXAiLCJkZWJ1ZyIsImxlbmd0aCIsInV0aWwiLCJwbHVyYWxpemUiLCJhcHBQYXRoIiwicmltcmFmU3luYyIsImUiLCJ3YXJuIiwibWVzc2FnZSIsInJldHJpZXZlSGVhZGVycyIsImxpbmsiLCJheGlvcyIsInVybCIsIm1ldGhvZCIsInRpbWVvdXQiLCJoZWFkZXJzIiwiZ2V0Q2FjaGVkQXBwbGljYXRpb25QYXRoIiwiY3VycmVudEFwcFByb3BzIiwiY2FjaGVkQXBwSW5mbyIsInJlZnJlc2giLCJfIiwiaXNQbGFpbk9iamVjdCIsImxhc3RNb2RpZmllZCIsImN1cnJlbnRNb2RpZmllZCIsImltbXV0YWJsZSIsImN1cnJlbnRJbW11dGFibGUiLCJtYXhBZ2UiLCJjdXJyZW50TWF4QWdlIiwidGltZXN0YW1wIiwiZ2V0VGltZSIsIm1zTGVmdCIsIkRhdGUiLCJub3ciLCJwYXRoIiwiYmFzZW5hbWUiLCJ2ZXJpZnlBcHBFeHRlbnNpb24iLCJzdXBwb3J0ZWRBcHBFeHRlbnNpb25zIiwidG9Mb3dlciIsImluY2x1ZGVzIiwiZXh0bmFtZSIsIkVycm9yIiwiY2FsY3VsYXRlRm9sZGVySW50ZWdyaXR5IiwiZm9sZGVyUGF0aCIsImdsb2IiLCJjd2QiLCJzdHJpY3QiLCJub3NvcnQiLCJjYWxjdWxhdGVGaWxlSW50ZWdyaXR5IiwiZmlsZVBhdGgiLCJoYXNoIiwiaXNBcHBJbnRlZ3JpdHlPayIsImN1cnJlbnRQYXRoIiwiZXhwZWN0ZWRJbnRlZ3JpdHkiLCJleGlzdHMiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJmb2xkZXIiLCJmaWxlIiwiY29uZmlndXJlQXBwIiwib3B0aW9ucyIsImlzU3RyaW5nIiwib25Qb3N0UHJvY2VzcyIsImlzQXJyYXkiLCJ1bmRlZmluZWQiLCJzdXBwb3J0ZWRFeHRlbnNpb25zIiwiaXNFbXB0eSIsIm5ld0FwcCIsInNob3VsZFVuemlwQXBwIiwicGFja2FnZUhhc2giLCJyZW1vdGVBcHBQcm9wcyIsInByb3RvY29sIiwicGF0aG5hbWUiLCJwYXJzZSIsImlzVXJsIiwiZ2V0IiwiYWNxdWlyZSIsInRlc3QiLCJtYXhBZ2VNYXRjaCIsImV4ZWMiLCJwYXJzZUludCIsImNhY2hlZFBhdGgiLCJpbnRlZ3JpdHkiLCJkZWxldGUiLCJmaWxlTmFtZSIsInNhbml0aXplTmFtZSIsImRlY29kZVVSSUNvbXBvbmVudCIsInJlcGxhY2VtZW50IiwiY3QiLCJzb21lIiwibWltZVR5cGUiLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJtYXRjaCIsInJlc3VsdGluZ05hbWUiLCJzdWJzdHJpbmciLCJyZXN1bHRpbmdFeHQiLCJmaXJzdCIsInRhcmdldFBhdGgiLCJ0ZW1wRGlyIiwicHJlZml4Iiwic3VmZml4IiwiZG93bmxvYWRBcHAiLCJlcnJvck1lc3NhZ2UiLCJpc1BhY2thZ2VBRmlsZSIsImlzRmlsZSIsImlzRnVuY3Rpb24iLCJhcmNoaXZlUGF0aCIsInRtcFJvb3QiLCJvcGVuRGlyIiwidW56aXBBcHAiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsInN0b3JlQXBwSW5DYWNoZSIsImFwcFBhdGhUb0NhY2hlIiwiY2FjaGVkRnVsbFBhdGgiLCJzZXQiLCJyZXN1bHQiLCJjbG9uZSIsIkJvb2xlYW4iLCJocmVmIiwibmV0IiwiZG93bmxvYWRGaWxlIiwiZXJyIiwiemlwUGF0aCIsImRzdFJvb3QiLCJ6aXAiLCJhc3NlcnRWYWxpZFppcCIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsInVzZVN5c3RlbVVuemlwRW52IiwiZW52IiwiQVBQSVVNX1BSRUZFUl9TWVNURU1fVU5aSVAiLCJ1c2VTeXN0ZW1VbnppcCIsImV4dHJhY3Rpb25PcHRzIiwiZmlsZU5hbWVzRW5jb2RpbmciLCJleHRyYWN0QWxsVG8iLCJnbG9iUGF0dGVybiIsImV4dCIsInJlcGxhY2UiLCJqb2luIiwic29ydGVkQnVuZGxlSXRlbXMiLCJzb3J0IiwiYSIsImIiLCJzcGxpdCIsInNlcCIsImVycm9yQW5kVGhyb3ciLCJNYXRoIiwicm91bmQiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwibWF0Y2hlZEJ1bmRsZSIsImRzdFBhdGgiLCJtdiIsIm1rZGlycCIsImlzUGFja2FnZU9yQnVuZGxlIiwiZHVwbGljYXRlS2V5cyIsImlucHV0IiwiZmlyc3RLZXkiLCJzZWNvbmRLZXkiLCJpdGVtIiwicmVzdWx0T2JqIiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwicmVjdXJzaXZlbHlDYWxsZWRWYWx1ZSIsInBhcnNlQ2Fwc0FycmF5IiwiY2FwIiwicGFyc2VkQ2FwcyIsIkpTT04iLCJpZ24iLCJnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCIsIm9iaiIsInNlc3Npb25JZCIsImluc3RhbmNlTmFtZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm5vZGUiLCJnZXRPYmplY3RJZCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9iYXNlZHJpdmVyL2hlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge3RlbXBEaXIsIGZzLCB1dGlsLCB6aXAsIG5ldCwgdGltaW5nLCBub2RlfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5cbmNvbnN0IElQQV9FWFQgPSAnLmlwYSc7XG5jb25zdCBaSVBfRVhUUyA9IFsnLnppcCcsIElQQV9FWFRdO1xuY29uc3QgWklQX01JTUVfVFlQRVMgPSBbJ2FwcGxpY2F0aW9uL3ppcCcsICdhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkJywgJ211bHRpcGFydC94LXppcCddO1xuY29uc3QgQ0FDSEVEX0FQUFNfTUFYX0FHRSA9IDEwMDAgKiA2MCAqIDYwICogMjQ7IC8vIG1zXG5jb25zdCBNQVhfQ0FDSEVEX0FQUFMgPSAxMDI0O1xuY29uc3QgQVBQTElDQVRJT05TX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogTUFYX0NBQ0hFRF9BUFBTLFxuICB0dGw6IENBQ0hFRF9BUFBTX01BWF9BR0UsIC8vIGV4cGlyZSBhZnRlciAyNCBob3Vyc1xuICB1cGRhdGVBZ2VPbkdldDogdHJ1ZSxcbiAgZGlzcG9zZTogKGFwcCwge2Z1bGxQYXRofSkgPT4ge1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYFRoZSBhcHBsaWNhdGlvbiAnJHthcHB9JyBjYWNoZWQgYXQgJyR7ZnVsbFBhdGh9JyBoYXMgYCArXG4gICAgICAgIGBleHBpcmVkIGFmdGVyICR7Q0FDSEVEX0FQUFNfTUFYX0FHRX1tc2BcbiAgICApO1xuICAgIGlmIChmdWxsUGF0aCkge1xuICAgICAgZnMucmltcmFmKGZ1bGxQYXRoKTtcbiAgICB9XG4gIH0sXG4gIG5vRGlzcG9zZU9uU2V0OiB0cnVlLFxufSk7XG5jb25zdCBBUFBMSUNBVElPTlNfQ0FDSEVfR1VBUkQgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBTQU5JVElaRV9SRVBMQUNFTUVOVCA9ICctJztcbmNvbnN0IERFRkFVTFRfQkFTRU5BTUUgPSAnYXBwaXVtLWFwcCc7XG5jb25zdCBBUFBfRE9XTkxPQURfVElNRU9VVF9NUyA9IDEyMCAqIDEwMDA7XG5cbnByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gIGlmIChBUFBMSUNBVElPTlNfQ0FDSEUuc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFwcFBhdGhzID0gWy4uLkFQUExJQ0FUSU9OU19DQUNIRS52YWx1ZXMoKV0ubWFwKCh7ZnVsbFBhdGh9KSA9PiBmdWxsUGF0aCk7XG4gIGxvZ2dlci5kZWJ1ZyhcbiAgICBgUGVyZm9ybWluZyBjbGVhbnVwIG9mICR7YXBwUGF0aHMubGVuZ3RofSBjYWNoZWQgYCArXG4gICAgICB1dGlsLnBsdXJhbGl6ZSgnYXBwbGljYXRpb24nLCBhcHBQYXRocy5sZW5ndGgpXG4gICk7XG4gIGZvciAoY29uc3QgYXBwUGF0aCBvZiBhcHBQYXRocykge1xuICAgIHRyeSB7XG4gICAgICAvLyBBc3luY2hyb25vdXMgY2FsbHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gb25FeGl0IGhhbmRsZXJcbiAgICAgIGZzLnJpbXJhZlN5bmMoYXBwUGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZUhlYWRlcnMobGluaykge1xuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogbGluayxcbiAgICAgICAgbWV0aG9kOiAnSEVBRCcsXG4gICAgICAgIHRpbWVvdXQ6IDUwMDAsXG4gICAgICB9KVxuICAgICkuaGVhZGVycztcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5pbmZvKGBDYW5ub3Qgc2VuZCBIRUFEIHJlcXVlc3QgdG8gJyR7bGlua30nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBnZXRDYWNoZWRBcHBsaWNhdGlvblBhdGgobGluaywgY3VycmVudEFwcFByb3BzID0ge30sIGNhY2hlZEFwcEluZm8gPSB7fSkge1xuICBjb25zdCByZWZyZXNoID0gKCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQSBmcmVzaCBjb3B5IG9mIHRoZSBhcHBsaWNhdGlvbiBpcyBnb2luZyB0byBiZSBkb3dubG9hZGVkIGZyb20gJHtsaW5rfWApO1xuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGNhY2hlZEFwcEluZm8pIHx8ICFfLmlzUGxhaW5PYmplY3QoY3VycmVudEFwcFByb3BzKSkge1xuICAgIC8vIGlmIGFuIGludmFsaWQgYXJnIGlzIHBhc3NlZCB0aGVuIGFzc3VtZSBjYWNoZSBtaXNzXG4gICAgcmV0dXJuIHJlZnJlc2goKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBsYXN0TW9kaWZpZWQ6IGN1cnJlbnRNb2RpZmllZCxcbiAgICBpbW11dGFibGU6IGN1cnJlbnRJbW11dGFibGUsXG4gICAgLy8gbWF4QWdlIGlzIGluIHNlY29uZHNcbiAgICBtYXhBZ2U6IGN1cnJlbnRNYXhBZ2UsXG4gIH0gPSBjdXJyZW50QXBwUHJvcHM7XG4gIGNvbnN0IHtcbiAgICAvLyBEYXRlIGluc3RhbmNlXG4gICAgbGFzdE1vZGlmaWVkLFxuICAgIC8vIGJvb2xlYW5cbiAgICBpbW11dGFibGUsXG4gICAgLy8gVW5peCB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICAgIHRpbWVzdGFtcCxcbiAgICBmdWxsUGF0aCxcbiAgfSA9IGNhY2hlZEFwcEluZm87XG4gIGlmIChsYXN0TW9kaWZpZWQgJiYgY3VycmVudE1vZGlmaWVkKSB7XG4gICAgaWYgKGN1cnJlbnRNb2RpZmllZC5nZXRUaW1lKCkgPD0gbGFzdE1vZGlmaWVkLmdldFRpbWUoKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBUaGUgYXBwbGljYXRpb24gYXQgJHtsaW5rfSBoYXMgbm90IGJlZW4gbW9kaWZpZWQgc2luY2UgJHtsYXN0TW9kaWZpZWR9YCk7XG4gICAgICByZXR1cm4gZnVsbFBhdGg7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIGFwcGxpY2F0aW9uIGF0ICR7bGlua30gaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgJHtsYXN0TW9kaWZpZWR9YCk7XG4gICAgcmV0dXJuIHJlZnJlc2goKTtcbiAgfVxuICBpZiAoaW1tdXRhYmxlICYmIGN1cnJlbnRJbW11dGFibGUpIHtcbiAgICBsb2dnZXIuZGVidWcoYFRoZSBhcHBsaWNhdGlvbiBhdCAke2xpbmt9IGlzIGltbXV0YWJsZWApO1xuICAgIHJldHVybiBmdWxsUGF0aDtcbiAgfVxuICBpZiAoY3VycmVudE1heEFnZSAmJiB0aW1lc3RhbXApIHtcbiAgICBjb25zdCBtc0xlZnQgPSB0aW1lc3RhbXAgKyBjdXJyZW50TWF4QWdlICogMTAwMCAtIERhdGUubm93KCk7XG4gICAgaWYgKG1zTGVmdCA+IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFRoZSBjYWNoZWQgYXBwbGljYXRpb24gJyR7cGF0aC5iYXNlbmFtZShmdWxsUGF0aCl9JyB3aWxsIGV4cGlyZSBpbiAke21zTGVmdCAvIDEwMDB9c2BcbiAgICAgICk7XG4gICAgICByZXR1cm4gZnVsbFBhdGg7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIGNhY2hlZCBhcHBsaWNhdGlvbiAnJHtwYXRoLmJhc2VuYW1lKGZ1bGxQYXRoKX0nIGhhcyBleHBpcmVkYCk7XG4gIH1cbiAgcmV0dXJuIHJlZnJlc2goKTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5QXBwRXh0ZW5zaW9uKGFwcCwgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucykge1xuICBpZiAoc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucy5tYXAoXy50b0xvd2VyKS5pbmNsdWRlcyhfLnRvTG93ZXIocGF0aC5leHRuYW1lKGFwcCkpKSkge1xuICAgIHJldHVybiBhcHA7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBOZXcgYXBwIHBhdGggJyR7YXBwfScgZGlkIG5vdCBoYXZlIGAgK1xuICAgICAgYCR7dXRpbC5wbHVyYWxpemUoJ2V4dGVuc2lvbicsIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMubGVuZ3RoLCBmYWxzZSl9OiBgICtcbiAgICAgIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnNcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlRm9sZGVySW50ZWdyaXR5KGZvbGRlclBhdGgpIHtcbiAgcmV0dXJuIChhd2FpdCBmcy5nbG9iKCcqKi8qJywge2N3ZDogZm9sZGVyUGF0aCwgc3RyaWN0OiBmYWxzZSwgbm9zb3J0OiB0cnVlfSkpLmxlbmd0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlRmlsZUludGVncml0eShmaWxlUGF0aCkge1xuICByZXR1cm4gYXdhaXQgZnMuaGFzaChmaWxlUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzQXBwSW50ZWdyaXR5T2soY3VycmVudFBhdGgsIGV4cGVjdGVkSW50ZWdyaXR5ID0ge30pIHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGN1cnJlbnRQYXRoKSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBGb2xkZXIgaW50ZWdyaXR5IGNoZWNrIGlzIHNpbXBsZTpcbiAgLy8gVmVyaWZ5IHRoZSBwcmV2aW91cyBhbW91bnQgb2YgZmlsZXMgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBvbmUuXG4gIC8vIFdlIGRvbid0IHdhbnQgdG8gdXNlIGVxdWFsaXR5IGNvbXBhcmlzb24gYmVjYXVzZSBvZiBhbiBhc3N1bXB0aW9uIHRoYXQgdGhlIE9TIG1pZ2h0XG4gIC8vIGNyZWF0ZSBzb21lIHVud2FudGVkIHNlcnZpY2UgZmlsZXMvY2FjaGVkIGluc2lkZSBvZiB0aGF0IGZvbGRlciBvciBpdHMgc3ViZm9sZGVycy5cbiAgLy8gT2ZjLCB2YWxpZGF0aW5nIHRoZSBoYXNoIHN1bSBvZiBlYWNoIGZpbGUgKG9yIGF0IGxlYXN0IG9mIGZpbGUgcGF0aCkgd291bGQgYmUgbXVjaFxuICAvLyBtb3JlIHByZWNpc2UsIGJ1dCB3ZSBkb24ndCBuZWVkIHRvIGJlIHZlcnkgcHJlY2lzZSBoZXJlIGFuZCBhbHNvIGRvbid0IHdhbnQgdG9cbiAgLy8gb3ZlcnVzZSBSQU0gYW5kIGhhdmUgYSBwZXJmb3JtYW5jZSBkcm9wLlxuICByZXR1cm4gKGF3YWl0IGZzLnN0YXQoY3VycmVudFBhdGgpKS5pc0RpcmVjdG9yeSgpXG4gICAgPyAoYXdhaXQgY2FsY3VsYXRlRm9sZGVySW50ZWdyaXR5KGN1cnJlbnRQYXRoKSkgPj0gZXhwZWN0ZWRJbnRlZ3JpdHk/LmZvbGRlclxuICAgIDogKGF3YWl0IGNhbGN1bGF0ZUZpbGVJbnRlZ3JpdHkoY3VycmVudFBhdGgpKSA9PT0gZXhwZWN0ZWRJbnRlZ3JpdHk/LmZpbGU7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgUG9zdFByb2Nlc3NPcHRpb25zXG4gKiBAcHJvcGVydHkgez9PYmplY3R9IGNhY2hlZEFwcEluZm8gVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91c2x5IGNhY2hlZCBhcHAgaW5zdGFuY2UgKGlmIGV4aXN0cyk6XG4gKiAgICAtIHBhY2thZ2VIYXNoOiBTSEExIGhhc2ggb2YgdGhlIHBhY2thZ2UgaWYgaXQgaXMgYSBmaWxlIGFuZCBub3QgYSBmb2xkZXJcbiAqICAgIC0gbGFzdE1vZGlmaWVkOiBPcHRpb25hbCBEYXRlIGluc3RhbmNlLCB0aGUgdmFsdWUgb2YgZmlsZSdzIGBMYXN0LU1vZGlmaWVkYCBoZWFkZXJcbiAqICAgIC0gaW1tdXRhYmxlOiBPcHRpb25hbCBib29sZWFuIHZhbHVlLiBDb250YWlucyB0cnVlIGlmIHRoZSBmaWxlIGhhcyBhbiBgaW1tdXRhYmxlYCBtYXJrXG4gKiAgICAgICAgICAgICAgICAgaW4gYENhY2hlLWNvbnRyb2xgIGhlYWRlclxuICogICAgLSBtYXhBZ2U6IE9wdGlvbmFsIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYG1heEFnZWAgcGFyYW1ldGVyIGluIGBDYWNoZS1jb250cm9sYCBoZWFkZXJcbiAqICAgIC0gdGltZXN0YW1wOiBUaGUgdGltZXN0YW1wIHRoaXMgaXRlbSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgY2FjaGUgKG1lYXN1cmVkIGluIFVuaXggZXBvY2hcbiAqICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMpXG4gKiAgICAtIGludGVncml0eTogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZWl0aGVyIGBmaWxlYCBwcm9wZXJ0eSB3aXRoIFNIQTEgaGFzaCBvZiB0aGUgZmlsZVxuICogICAgICAgICAgICAgICAgIG9yIGBmb2xkZXJgIHByb3BlcnR5IHdpdGggdG90YWwgYW1vdW50IG9mIGNhY2hlZCBmaWxlcyBhbmQgc3ViZm9sZGVyc1xuICogICAgLSBmdWxsUGF0aDogdGhlIGZ1bGwgcGF0aCB0byB0aGUgY2FjaGVkIGFwcFxuICogQHByb3BlcnR5IHtib29sZWFufSBpc1VybCBXaGV0aGVyIHRoZSBhcHAgaGFzIGJlZW4gZG93bmxvYWRlZCBmcm9tIGEgcmVtb3RlIFVSTFxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBoZWFkZXJzIE9wdGlvbmFsIGhlYWRlcnMgb2JqZWN0LiBPbmx5IHByZXNlbnQgaWYgYGlzVXJsYCBpcyB0cnVlIGFuZCBpZiB0aGUgc2VydmVyXG4gKiByZXNwb25kcyB0byBIRUFEIHJlcXVlc3RzLiBBbGwgaGVhZGVyIG5hbWVzIGFyZSBub3JtYWxpemVkIHRvIGxvd2VyY2FzZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYXRoIEEgc3RyaW5nIGNvbnRhaW5pbmcgZnVsbCBwYXRoIHRvIHRoZSBwcmVwcm9jZXNzZWQgYXBwbGljYXRpb24gcGFja2FnZSAoZWl0aGVyXG4gKiBkb3dubG9hZGVkIG9yIGEgbG9jYWwgb25lKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUG9zdFByb2Nlc3NSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYXRoIFRoZSBmdWxsIHBhc3QgdG8gdGhlIHBvc3QtcHJvY2Vzc2VkIGFwcGxpY2F0aW9uIHBhY2thZ2Ugb24gdGhlXG4gKiBsb2NhbCBmaWxlIHN5c3RlbSAobWlnaHQgYmUgYSBmaWxlIG9yIGEgZm9sZGVyIHBhdGgpXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb25maWd1cmVBcHBPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhvYmo6IFBvc3RQcm9jZXNzT3B0aW9ucykgPT4gKFByb21pc2U8UG9zdFByb2Nlc3NSZXN1bHR8dW5kZWZpbmVkPnxQb3N0UHJvY2Vzc1Jlc3VsdHx1bmRlZmluZWQpfSBbb25Qb3N0UHJvY2Vzc11cbiAqIE9wdGlvbmFsIGZ1bmN0aW9uLCB3aGljaCBzaG91bGQgYmUgYXBwbGllZFxuICogdG8gdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGl0IGlzIGRvd25sb2FkZWQvcHJlcHJvY2Vzc2VkLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBhc3luY1xuICogYW5kIGlzIGV4cGVjdGVkIHRvIGFjY2VwdCBzaW5nbGUgb2JqZWN0IHBhcmFtZXRlci5cbiAqIFRoZSBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBlaXRoZXIgcmV0dXJuIGEgZmFsc3kgdmFsdWUsIHdoaWNoIG1lYW5zIHRoZSBhcHAgbXVzdCBub3QgYmVcbiAqIGNhY2hlZCBhbmQgYSBmcmVzaCBjb3B5IG9mIGl0IGlzIGRvd25sb2FkZWQgZWFjaCB0aW1lLiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gb2JqZWN0XG4gKiBjb250YWluaW5nIGBhcHBQYXRoYCBwcm9wZXJ0eSB0aGVuIHRoZSBpbnRlZ3JpdHkgb2YgaXQgd2lsbCBiZSB2ZXJpZmllZCBhbmQgc3RvcmVkIGludG9cbiAqIHRoZSBjYWNoZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHN1cHBvcnRlZEV4dGVuc2lvbnMgTGlzdCBvZiBzdXBwb3J0ZWQgYXBwbGljYXRpb24gZXh0ZW5zaW9ucyAoXG4gKiBpbmNsdWRpbmcgc3RhcnRpbmcgZG90cykuIFRoaXMgcHJvcGVydHkgaXMgbWFuZGF0b3J5IGFuZCBtdXN0IG5vdCBiZSBlbXB0eS5cbiAqL1xuXG4vKipcbiAqIFByZXBhcmVzIGFuIGFwcCB0byBiZSB1c2VkIGluIGFuIGF1dG9tYXRlZCB0ZXN0LiBUaGUgYXBwIGdldHMgY2FjaGVkIGF1dG9tYXRpY2FsbHlcbiAqIGlmIGl0IGlzIGFuIGFyY2hpdmUgb3IgaWYgaXQgaXMgZG93bmxvYWRlZCBmcm9tIGFuIFVSTC5cbiAqIElmIHRoZSBkb3dubG9hZGVkIGFwcCBoYXMgYC56aXBgIGV4dGVuc2lvbiwgdGhpcyBtZXRob2Qgd2lsbCB1bnppcCBpdC5cbiAqIFRoZSB1bnppcCBkb2VzIG5vdCB3b3JrIHdoZW4gYG9uUG9zdFByb2Nlc3NgIGlzIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHAgRWl0aGVyIGEgZnVsbCBwYXRoIHRvIHRoZSBhcHAgb3IgYSByZW1vdGUgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXXxDb25maWd1cmVBcHBPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZXN1bHRpbmcgYXBwbGljYXRpb24gYnVuZGxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbmZpZ3VyZUFwcChhcHAsIG9wdGlvbnMgPSAvKiogQHR5cGUge0NvbmZpZ3VyZUFwcE9wdGlvbnN9ICovICh7fSkpIHtcbiAgaWYgKCFfLmlzU3RyaW5nKGFwcCkpIHtcbiAgICAvLyBpbW1lZGlhdGVseSBzaG9ydGNpcmN1aXQgaWYgbm90IGdpdmVuIGFuIGFwcFxuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zO1xuICBjb25zdCBvblBvc3RQcm9jZXNzID1cbiAgICAhXy5pc1N0cmluZyhvcHRpb25zKSAmJiAhXy5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucy5vblBvc3RQcm9jZXNzIDogdW5kZWZpbmVkO1xuXG4gIGlmIChfLmlzU3RyaW5nKG9wdGlvbnMpKSB7XG4gICAgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyA9IFtvcHRpb25zXTtcbiAgfSBlbHNlIGlmIChfLmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zID0gb3B0aW9ucztcbiAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zID0gb3B0aW9ucy5zdXBwb3J0ZWRFeHRlbnNpb25zO1xuICB9XG4gIGlmIChfLmlzRW1wdHkoc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9uZSBvciBtb3JlIHN1cHBvcnRlZCBhcHAgZXh0ZW5zaW9ucyBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gIH1cblxuICBsZXQgbmV3QXBwID0gYXBwO1xuICBsZXQgc2hvdWxkVW56aXBBcHAgPSBmYWxzZTtcbiAgbGV0IHBhY2thZ2VIYXNoID0gbnVsbDtcbiAgbGV0IGhlYWRlcnMgPSBudWxsO1xuICAvKiogQHR5cGUge1JlbW90ZUFwcFByb3BzfSAqL1xuICBjb25zdCByZW1vdGVBcHBQcm9wcyA9IHtcbiAgICBsYXN0TW9kaWZpZWQ6IG51bGwsXG4gICAgaW1tdXRhYmxlOiBmYWxzZSxcbiAgICBtYXhBZ2U6IG51bGwsXG4gIH07XG4gIGNvbnN0IHtwcm90b2NvbCwgcGF0aG5hbWV9ID0gdXJsLnBhcnNlKG5ld0FwcCk7XG4gIGNvbnN0IGlzVXJsID0gcHJvdG9jb2wgPT09IG51bGwgPyBmYWxzZSA6IFsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXMocHJvdG9jb2wpO1xuXG4gIGNvbnN0IGNhY2hlZEFwcEluZm8gPSBBUFBMSUNBVElPTlNfQ0FDSEUuZ2V0KGFwcCk7XG5cbiAgcmV0dXJuIGF3YWl0IEFQUExJQ0FUSU9OU19DQUNIRV9HVUFSRC5hY3F1aXJlKGFwcCwgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1VybCkge1xuICAgICAgLy8gVXNlIHRoZSBhcHAgZnJvbSByZW1vdGUgVVJMXG4gICAgICBsb2dnZXIuaW5mbyhgVXNpbmcgZG93bmxvYWRhYmxlIGFwcCAnJHtuZXdBcHB9J2ApO1xuICAgICAgaGVhZGVycyA9IGF3YWl0IHJldHJpZXZlSGVhZGVycyhuZXdBcHApO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoaGVhZGVycykpIHtcbiAgICAgICAgaWYgKGhlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXSkge1xuICAgICAgICAgIHJlbW90ZUFwcFByb3BzLmxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKGhlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXSk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBMYXN0LU1vZGlmaWVkOiAke2hlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXX1gKTtcbiAgICAgICAgaWYgKGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSkge1xuICAgICAgICAgIHJlbW90ZUFwcFByb3BzLmltbXV0YWJsZSA9IC9cXGJpbW11dGFibGVcXGIvaS50ZXN0KGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSk7XG4gICAgICAgICAgY29uc3QgbWF4QWdlTWF0Y2ggPSAvXFxibWF4LWFnZT0oXFxkKylcXGIvaS5leGVjKGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSk7XG4gICAgICAgICAgaWYgKG1heEFnZU1hdGNoKSB7XG4gICAgICAgICAgICByZW1vdGVBcHBQcm9wcy5tYXhBZ2UgPSBwYXJzZUludChtYXhBZ2VNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZGVidWcoYENhY2hlLUNvbnRyb2w6ICR7aGVhZGVyc1snY2FjaGUtY29udHJvbCddfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgY2FjaGVkUGF0aCA9IGdldENhY2hlZEFwcGxpY2F0aW9uUGF0aChhcHAsIHJlbW90ZUFwcFByb3BzLCBjYWNoZWRBcHBJbmZvKTtcbiAgICAgIGlmIChjYWNoZWRQYXRoKSB7XG4gICAgICAgIGlmIChhd2FpdCBpc0FwcEludGVncml0eU9rKGNhY2hlZFBhdGgsIGNhY2hlZEFwcEluZm8/LmludGVncml0eSkpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgUmV1c2luZyBwcmV2aW91c2x5IGRvd25sb2FkZWQgYXBwbGljYXRpb24gYXQgJyR7Y2FjaGVkUGF0aH0nYCk7XG4gICAgICAgICAgcmV0dXJuIHZlcmlmeUFwcEV4dGVuc2lvbihjYWNoZWRQYXRoLCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgVGhlIGFwcGxpY2F0aW9uIGF0ICcke2NhY2hlZFBhdGh9JyBkb2VzIG5vdCBleGlzdCBhbnltb3JlIGAgK1xuICAgICAgICAgICAgYG9yIGl0cyBpbnRlZ3JpdHkgaGFzIGJlZW4gZGFtYWdlZC4gRGVsZXRpbmcgaXQgZnJvbSB0aGUgaW50ZXJuYWwgY2FjaGVgXG4gICAgICAgICk7XG4gICAgICAgIEFQUExJQ0FUSU9OU19DQUNIRS5kZWxldGUoYXBwKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbGVOYW1lID0gbnVsbDtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gZnMuc2FuaXRpemVOYW1lKHBhdGguYmFzZW5hbWUoZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhuYW1lID8/ICcnKSksIHtcbiAgICAgICAgcmVwbGFjZW1lbnQ6IFNBTklUSVpFX1JFUExBQ0VNRU5ULFxuICAgICAgfSk7XG4gICAgICBjb25zdCBleHRuYW1lID0gcGF0aC5leHRuYW1lKGJhc2VuYW1lKTtcbiAgICAgIC8vIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHVuemlwIHRoZSBhcHAsIHdlIGhhdmUgYSBudW1iZXIgb2YgcGxhY2VzXG4gICAgICAvLyB0byBsb29rOiBjb250ZW50IHR5cGUsIGNvbnRlbnQgZGlzcG9zaXRpb24sIG9yIHRoZSBmaWxlIGV4dGVuc2lvblxuICAgICAgaWYgKFpJUF9FWFRTLmluY2x1ZGVzKGV4dG5hbWUpKSB7XG4gICAgICAgIGZpbGVOYW1lID0gYmFzZW5hbWU7XG4gICAgICAgIHNob3VsZFVuemlwQXBwID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChoZWFkZXJzWydjb250ZW50LXR5cGUnXSkge1xuICAgICAgICBjb25zdCBjdCA9IGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddO1xuICAgICAgICBsb2dnZXIuZGVidWcoYENvbnRlbnQtVHlwZTogJHtjdH1gKTtcbiAgICAgICAgLy8gdGhlIGZpbGV0eXBlIG1heSBub3QgYmUgb2J2aW91cyBmb3IgY2VydGFpbiB1cmxzLCBzbyBjaGVjayB0aGUgbWltZSB0eXBlIHRvb1xuICAgICAgICBpZiAoXG4gICAgICAgICAgWklQX01JTUVfVFlQRVMuc29tZSgobWltZVR5cGUpID0+XG4gICAgICAgICAgICBuZXcgUmVnRXhwKGBcXFxcYiR7Xy5lc2NhcGVSZWdFeHAobWltZVR5cGUpfVxcXFxiYCkudGVzdChjdClcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICghZmlsZU5hbWUpIHtcbiAgICAgICAgICAgIGZpbGVOYW1lID0gYCR7REVGQVVMVF9CQVNFTkFNRX0uemlwYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2hvdWxkVW56aXBBcHAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddICYmIC9eYXR0YWNobWVudC9pLnRlc3QoaGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYENvbnRlbnQtRGlzcG9zaXRpb246ICR7aGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddfWApO1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9maWxlbmFtZT1cIihbXlwiXSspL2kuZXhlYyhoZWFkZXJzWydjb250ZW50LWRpc3Bvc2l0aW9uJ10pO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBmaWxlTmFtZSA9IGZzLnNhbml0aXplTmFtZShtYXRjaFsxXSwge1xuICAgICAgICAgICAgcmVwbGFjZW1lbnQ6IFNBTklUSVpFX1JFUExBQ0VNRU5ULFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNob3VsZFVuemlwQXBwID0gc2hvdWxkVW56aXBBcHAgfHwgWklQX0VYVFMuaW5jbHVkZXMocGF0aC5leHRuYW1lKGZpbGVOYW1lKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZmlsZU5hbWUpIHtcbiAgICAgICAgLy8gYXNzaWduIHRoZSBkZWZhdWx0IGZpbGUgbmFtZSBhbmQgdGhlIGV4dGVuc2lvbiBpZiBub25lIGhhcyBiZWVuIGRldGVjdGVkXG4gICAgICAgIGNvbnN0IHJlc3VsdGluZ05hbWUgPSBiYXNlbmFtZVxuICAgICAgICAgID8gYmFzZW5hbWUuc3Vic3RyaW5nKDAsIGJhc2VuYW1lLmxlbmd0aCAtIGV4dG5hbWUubGVuZ3RoKVxuICAgICAgICAgIDogREVGQVVMVF9CQVNFTkFNRTtcbiAgICAgICAgbGV0IHJlc3VsdGluZ0V4dCA9IGV4dG5hbWU7XG4gICAgICAgIGlmICghc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucy5pbmNsdWRlcyhyZXN1bHRpbmdFeHQpKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgVGhlIGN1cnJlbnQgZmlsZSBleHRlbnNpb24gJyR7cmVzdWx0aW5nRXh0fScgaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgICAgICAgIGBEZWZhdWx0aW5nIHRvICcke18uZmlyc3Qoc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyl9J2BcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc3VsdGluZ0V4dCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoXy5maXJzdChzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmlsZU5hbWUgPSBgJHtyZXN1bHRpbmdOYW1lfSR7cmVzdWx0aW5nRXh0fWA7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXRQYXRoID0gYXdhaXQgdGVtcERpci5wYXRoKHtcbiAgICAgICAgcHJlZml4OiBmaWxlTmFtZSxcbiAgICAgICAgc3VmZml4OiAnJyxcbiAgICAgIH0pO1xuICAgICAgbmV3QXBwID0gYXdhaXQgZG93bmxvYWRBcHAobmV3QXBwLCB0YXJnZXRQYXRoKTtcbiAgICB9IGVsc2UgaWYgKGF3YWl0IGZzLmV4aXN0cyhuZXdBcHApKSB7XG4gICAgICAvLyBVc2UgdGhlIGxvY2FsIGFwcFxuICAgICAgbG9nZ2VyLmluZm8oYFVzaW5nIGxvY2FsIGFwcCAnJHtuZXdBcHB9J2ApO1xuICAgICAgc2hvdWxkVW56aXBBcHAgPSBaSVBfRVhUUy5pbmNsdWRlcyhwYXRoLmV4dG5hbWUobmV3QXBwKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBgVGhlIGFwcGxpY2F0aW9uIGF0ICcke25ld0FwcH0nIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlYDtcbiAgICAgIC8vIHByb3RvY29sIHZhbHVlIGZvciAnQzpcXFxcdGVtcCcgaXMgJ2M6Jywgc28gd2UgY2hlY2sgdGhlIGxlbmd0aCBhcyB3ZWxsXG4gICAgICBpZiAoXy5pc1N0cmluZyhwcm90b2NvbCkgJiYgcHJvdG9jb2wubGVuZ3RoID4gMikge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgIGBUaGUgcHJvdG9jb2wgJyR7cHJvdG9jb2x9JyB1c2VkIGluICcke25ld0FwcH0nIGlzIG5vdCBzdXBwb3J0ZWQuIGAgK1xuICAgICAgICAgIGBPbmx5IGh0dHA6IGFuZCBodHRwczogcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWRgO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNQYWNrYWdlQUZpbGUgPSAoYXdhaXQgZnMuc3RhdChuZXdBcHApKS5pc0ZpbGUoKTtcbiAgICBpZiAoaXNQYWNrYWdlQUZpbGUpIHtcbiAgICAgIHBhY2thZ2VIYXNoID0gYXdhaXQgY2FsY3VsYXRlRmlsZUludGVncml0eShuZXdBcHApO1xuICAgIH1cblxuICAgIGlmIChpc1BhY2thZ2VBRmlsZSAmJiBzaG91bGRVbnppcEFwcCAmJiAhXy5pc0Z1bmN0aW9uKG9uUG9zdFByb2Nlc3MpKSB7XG4gICAgICBjb25zdCBhcmNoaXZlUGF0aCA9IG5ld0FwcDtcbiAgICAgIGlmIChwYWNrYWdlSGFzaCA9PT0gY2FjaGVkQXBwSW5mbz8ucGFja2FnZUhhc2gpIHtcbiAgICAgICAgY29uc3Qge2Z1bGxQYXRofSA9IGNhY2hlZEFwcEluZm87XG4gICAgICAgIGlmIChhd2FpdCBpc0FwcEludGVncml0eU9rKGZ1bGxQYXRoLCBjYWNoZWRBcHBJbmZvPy5pbnRlZ3JpdHkpKSB7XG4gICAgICAgICAgaWYgKGFyY2hpdmVQYXRoICE9PSBhcHApIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZihhcmNoaXZlUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ2dlci5pbmZvKGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIGFwcGxpY2F0aW9uIGF0ICcke2Z1bGxQYXRofSdgKTtcbiAgICAgICAgICByZXR1cm4gdmVyaWZ5QXBwRXh0ZW5zaW9uKGZ1bGxQYXRoLCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgVGhlIGFwcGxpY2F0aW9uIGF0ICcke2Z1bGxQYXRofScgZG9lcyBub3QgZXhpc3QgYW55bW9yZSBgICtcbiAgICAgICAgICAgIGBvciBpdHMgaW50ZWdyaXR5IGhhcyBiZWVuIGRhbWFnZWQuIERlbGV0aW5nIGl0IGZyb20gdGhlIGNhY2hlYFxuICAgICAgICApO1xuICAgICAgICBBUFBMSUNBVElPTlNfQ0FDSEUuZGVsZXRlKGFwcCk7XG4gICAgICB9XG4gICAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgICB0cnkge1xuICAgICAgICBuZXdBcHAgPSBhd2FpdCB1bnppcEFwcChhcmNoaXZlUGF0aCwgdG1wUm9vdCwgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobmV3QXBwICE9PSBhcmNoaXZlUGF0aCAmJiBhcmNoaXZlUGF0aCAhPT0gYXBwKSB7XG4gICAgICAgICAgYXdhaXQgZnMucmltcmFmKGFyY2hpdmVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9nZ2VyLmluZm8oYFVuemlwcGVkIGxvY2FsIGFwcCB0byAnJHtuZXdBcHB9J2ApO1xuICAgIH0gZWxzZSBpZiAoIXBhdGguaXNBYnNvbHV0ZShuZXdBcHApKSB7XG4gICAgICBuZXdBcHAgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgbmV3QXBwKTtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgVGhlIGN1cnJlbnQgYXBwbGljYXRpb24gcGF0aCAnJHthcHB9JyBpcyBub3QgYWJzb2x1dGUgYCArXG4gICAgICAgICAgYGFuZCBoYXMgYmVlbiByZXdyaXR0ZW4gdG8gJyR7bmV3QXBwfScuIENvbnNpZGVyIHVzaW5nIGFic29sdXRlIHBhdGhzIHJhdGhlciB0aGFuIHJlbGF0aXZlYFxuICAgICAgKTtcbiAgICAgIGFwcCA9IG5ld0FwcDtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZUFwcEluQ2FjaGUgPSBhc3luYyAoYXBwUGF0aFRvQ2FjaGUpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlZEZ1bGxQYXRoID0gY2FjaGVkQXBwSW5mbz8uZnVsbFBhdGg7XG4gICAgICBpZiAoY2FjaGVkRnVsbFBhdGggJiYgY2FjaGVkRnVsbFBhdGggIT09IGFwcFBhdGhUb0NhY2hlKSB7XG4gICAgICAgIGF3YWl0IGZzLnJpbXJhZihjYWNoZWRGdWxsUGF0aCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnRlZ3JpdHkgPSB7fTtcbiAgICAgIGlmICgoYXdhaXQgZnMuc3RhdChhcHBQYXRoVG9DYWNoZSkpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaW50ZWdyaXR5LmZvbGRlciA9IGF3YWl0IGNhbGN1bGF0ZUZvbGRlckludGVncml0eShhcHBQYXRoVG9DYWNoZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlZ3JpdHkuZmlsZSA9IGF3YWl0IGNhbGN1bGF0ZUZpbGVJbnRlZ3JpdHkoYXBwUGF0aFRvQ2FjaGUpO1xuICAgICAgfVxuICAgICAgQVBQTElDQVRJT05TX0NBQ0hFLnNldChhcHAsIHtcbiAgICAgICAgLi4ucmVtb3RlQXBwUHJvcHMsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgcGFja2FnZUhhc2gsXG4gICAgICAgIGludGVncml0eSxcbiAgICAgICAgZnVsbFBhdGg6IGFwcFBhdGhUb0NhY2hlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYXBwUGF0aFRvQ2FjaGU7XG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ob25Qb3N0UHJvY2VzcykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9uUG9zdFByb2Nlc3Moe1xuICAgICAgICBjYWNoZWRBcHBJbmZvOiBfLmNsb25lKGNhY2hlZEFwcEluZm8pLFxuICAgICAgICBpc1VybCxcbiAgICAgICAgaGVhZGVyczogXy5jbG9uZShoZWFkZXJzKSxcbiAgICAgICAgYXBwUGF0aDogbmV3QXBwLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gIXJlc3VsdD8uYXBwUGF0aCB8fCBhcHAgPT09IHJlc3VsdD8uYXBwUGF0aCB8fCAhKGF3YWl0IGZzLmV4aXN0cyhyZXN1bHQ/LmFwcFBhdGgpKVxuICAgICAgICA/IG5ld0FwcFxuICAgICAgICA6IGF3YWl0IHN0b3JlQXBwSW5DYWNoZShyZXN1bHQuYXBwUGF0aCk7XG4gICAgfVxuXG4gICAgdmVyaWZ5QXBwRXh0ZW5zaW9uKG5ld0FwcCwgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyk7XG4gICAgcmV0dXJuIGFwcCAhPT0gbmV3QXBwICYmIChwYWNrYWdlSGFzaCB8fCBfLnZhbHVlcyhyZW1vdGVBcHBQcm9wcykuc29tZShCb29sZWFuKSlcbiAgICAgID8gYXdhaXQgc3RvcmVBcHBJbkNhY2hlKG5ld0FwcClcbiAgICAgIDogbmV3QXBwO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRBcHAoYXBwLCB0YXJnZXRQYXRoKSB7XG4gIGNvbnN0IHtocmVmfSA9IHVybC5wYXJzZShhcHApO1xuICB0cnkge1xuICAgIGF3YWl0IG5ldC5kb3dubG9hZEZpbGUoaHJlZiwgdGFyZ2V0UGF0aCwge1xuICAgICAgdGltZW91dDogQVBQX0RPV05MT0FEX1RJTUVPVVRfTVMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRvd25sb2FkIHRoZSBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHRhcmdldFBhdGg7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGJ1bmRsZSBmcm9tIGFuIGFyY2hpdmUgaW50byB0aGUgZ2l2ZW4gZm9sZGVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHppcFBhdGggRnVsbCBwYXRoIHRvIHRoZSBhcmNoaXZlIGNvbnRhaW5pbmcgdGhlIGJ1bmRsZVxuICogQHBhcmFtIHtzdHJpbmd9IGRzdFJvb3QgRnVsbCBwYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIGV4dHJhY3RlZCBidW5kbGVcbiAqIHNob3VsZCBiZSBwbGFjZWRcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPnxzdHJpbmd9IHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMgVGhlIGxpc3Qgb2YgZXh0ZW5zaW9uc1xuICogdGhlIHRhcmdldCBhcHBsaWNhdGlvbiBidW5kbGUgc3VwcG9ydHMsIGZvciBleGFtcGxlIFsnLmFwaycsICcuYXBrcyddIGZvclxuICogQW5kcm9pZCBwYWNrYWdlc1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gRnVsbCBwYXRoIHRvIHRoZSBidW5kbGUgaW4gdGhlIGRlc3RpbmF0aW9uIGZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBhcmNoaXZlIGlzIGludmFsaWQgb3Igbm8gYXBwbGljYXRpb24gYnVuZGxlc1xuICogaGF2ZSBiZWVuIGZvdW5kIGluc2lkZVxuICovXG5hc3luYyBmdW5jdGlvbiB1bnppcEFwcCh6aXBQYXRoLCBkc3RSb290LCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKSB7XG4gIGF3YWl0IHppcC5hc3NlcnRWYWxpZFppcCh6aXBQYXRoKTtcblxuICBpZiAoIV8uaXNBcnJheShzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKSkge1xuICAgIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMgPSBbc3VwcG9ydGVkQXBwRXh0ZW5zaW9uc107XG4gIH1cblxuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIHRyeSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBVbnppcHBpbmcgJyR7emlwUGF0aH0nYCk7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBjb25zdCB1c2VTeXN0ZW1VbnppcEVudiA9IHByb2Nlc3MuZW52LkFQUElVTV9QUkVGRVJfU1lTVEVNX1VOWklQO1xuICAgIGNvbnN0IHVzZVN5c3RlbVVuemlwID1cbiAgICAgIF8uaXNFbXB0eSh1c2VTeXN0ZW1VbnppcEVudikgfHwgIVsnMCcsICdmYWxzZSddLmluY2x1ZGVzKF8udG9Mb3dlcih1c2VTeXN0ZW1VbnppcEVudikpO1xuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgdG8gdXNlIHVzZSB0aGUgc3lzdGVtIGB1bnppcGAgKGUuZy4sIGAvdXNyL2Jpbi91bnppcGApIGR1ZVxuICAgICAqIHRvIHRoZSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpdCBwcm92aWRlcyBvdmVyIHRoZSBuYXRpdmVcbiAgICAgKiBKUyBcInVuemlwXCIgaW1wbGVtZW50YXRpb24uXG4gICAgICogQHR5cGUge2ltcG9ydCgnQGFwcGl1bS9zdXBwb3J0L2xpYi96aXAnKS5FeHRyYWN0QWxsT3B0aW9uc31cbiAgICAgKi9cbiAgICBjb25zdCBleHRyYWN0aW9uT3B0cyA9IHt1c2VTeXN0ZW1VbnppcH07XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE0MTAwXG4gICAgaWYgKHBhdGguZXh0bmFtZSh6aXBQYXRoKSA9PT0gSVBBX0VYVCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgRW5mb3JjaW5nIFVURi04IGVuY29kaW5nIG9uIHRoZSBleHRyYWN0ZWQgZmlsZSBuYW1lcyBmb3IgJyR7cGF0aC5iYXNlbmFtZSh6aXBQYXRoKX0nYFxuICAgICAgKTtcbiAgICAgIGV4dHJhY3Rpb25PcHRzLmZpbGVOYW1lc0VuY29kaW5nID0gJ3V0ZjgnO1xuICAgIH1cbiAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHppcFBhdGgsIHRtcFJvb3QsIGV4dHJhY3Rpb25PcHRzKTtcbiAgICBjb25zdCBnbG9iUGF0dGVybiA9IGAqKi8qLisoJHtzdXBwb3J0ZWRBcHBFeHRlbnNpb25zXG4gICAgICAubWFwKChleHQpID0+IGV4dC5yZXBsYWNlKC9eXFwuLywgJycpKVxuICAgICAgLmpvaW4oJ3wnKX0pYDtcbiAgICBjb25zdCBzb3J0ZWRCdW5kbGVJdGVtcyA9IChcbiAgICAgIGF3YWl0IGZzLmdsb2IoZ2xvYlBhdHRlcm4sIHtcbiAgICAgICAgY3dkOiB0bXBSb290LFxuICAgICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgICAvLyBHZXQgdGhlIHRvcCBsZXZlbCBtYXRjaFxuICAgICAgfSlcbiAgICApLnNvcnQoKGEsIGIpID0+IGEuc3BsaXQocGF0aC5zZXApLmxlbmd0aCAtIGIuc3BsaXQocGF0aC5zZXApLmxlbmd0aCk7XG4gICAgaWYgKF8uaXNFbXB0eShzb3J0ZWRCdW5kbGVJdGVtcykpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KFxuICAgICAgICBgQXBwIHVuemlwcGVkIE9LLCBidXQgd2UgY291bGQgbm90IGZpbmQgYW55ICcke3N1cHBvcnRlZEFwcEV4dGVuc2lvbnN9JyBgICtcbiAgICAgICAgICB1dGlsLnBsdXJhbGl6ZSgnYnVuZGxlJywgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucy5sZW5ndGgsIGZhbHNlKSArXG4gICAgICAgICAgYCBpbiBpdC4gTWFrZSBzdXJlIHlvdXIgYXJjaGl2ZSBjb250YWlucyBhdCBsZWFzdCBvbmUgcGFja2FnZSBoYXZpbmcgYCArXG4gICAgICAgICAgYCcke3N1cHBvcnRlZEFwcEV4dGVuc2lvbnN9JyAke3V0aWwucGx1cmFsaXplKFxuICAgICAgICAgICAgJ2V4dGVuc2lvbicsXG4gICAgICAgICAgICBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zLmxlbmd0aCxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgKX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgRXh0cmFjdGVkICR7dXRpbC5wbHVyYWxpemUoJ2J1bmRsZSBpdGVtJywgc29ydGVkQnVuZGxlSXRlbXMubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICAgIGBmcm9tICcke3ppcFBhdGh9JyBpbiAke01hdGgucm91bmQoXG4gICAgICAgICAgdGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kc1xuICAgICAgICApfW1zOiAke3NvcnRlZEJ1bmRsZUl0ZW1zfWBcbiAgICApO1xuICAgIGNvbnN0IG1hdGNoZWRCdW5kbGUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKF8uZmlyc3Qoc29ydGVkQnVuZGxlSXRlbXMpKTtcbiAgICBsb2dnZXIuaW5mbyhgQXNzdW1pbmcgJyR7bWF0Y2hlZEJ1bmRsZX0nIGlzIHRoZSBjb3JyZWN0IGJ1bmRsZWApO1xuICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUoZHN0Um9vdCwgcGF0aC5iYXNlbmFtZShtYXRjaGVkQnVuZGxlKSk7XG4gICAgYXdhaXQgZnMubXYocGF0aC5yZXNvbHZlKHRtcFJvb3QsIG1hdGNoZWRCdW5kbGUpLCBkc3RQYXRoLCB7bWtkaXJwOiB0cnVlfSk7XG4gICAgcmV0dXJuIGRzdFBhdGg7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUGFja2FnZU9yQnVuZGxlKGFwcCkge1xuICByZXR1cm4gL14oW2EtekEtWjAtOVxcLV9dK1xcLlthLXpBLVowLTlcXC1fXSspKyQvLnRlc3QoYXBwKTtcbn1cblxuLyoqXG4gKiBGaW5kcyBhbGwgaW5zdGFuY2VzICdmaXJzdEtleScgYW5kIGNyZWF0ZSBhIGR1cGxpY2F0ZSB3aXRoIHRoZSBrZXkgJ3NlY29uZEtleScsXG4gKiBEbyB0aGUgc2FtZSB0aGluZyBpbiByZXZlcnNlLiBJZiB3ZSBmaW5kICdzZWNvbmRLZXknLCBjcmVhdGUgYSBkdXBsaWNhdGUgd2l0aCB0aGUga2V5ICdmaXJzdEtleScuXG4gKlxuICogVGhpcyB3aWxsIGNhdXNlIGtleXMgdG8gYmUgb3ZlcndyaXR0ZW4gaWYgdGhlIG9iamVjdCBjb250YWlucyAnZmlyc3RLZXknIGFuZCAnc2Vjb25kS2V5Jy5cblxuICogQHBhcmFtIHsqfSBpbnB1dCBBbnkgdHlwZSBvZiBpbnB1dFxuICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0S2V5IFRoZSBmaXJzdCBrZXkgdG8gZHVwbGljYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gc2Vjb25kS2V5IFRoZSBzZWNvbmQga2V5IHRvIGR1cGxpY2F0ZVxuICovXG5mdW5jdGlvbiBkdXBsaWNhdGVLZXlzKGlucHV0LCBmaXJzdEtleSwgc2Vjb25kS2V5KSB7XG4gIC8vIElmIGFycmF5IHByb3ZpZGVkLCByZWN1cnNpdmVseSBjYWxsIG9uIGFsbCBlbGVtZW50c1xuICBpZiAoXy5pc0FycmF5KGlucHV0KSkge1xuICAgIHJldHVybiBpbnB1dC5tYXAoKGl0ZW0pID0+IGR1cGxpY2F0ZUtleXMoaXRlbSwgZmlyc3RLZXksIHNlY29uZEtleSkpO1xuICB9XG5cbiAgLy8gSWYgb2JqZWN0LCBjcmVhdGUgZHVwbGljYXRlcyBmb3Iga2V5cyBhbmQgdGhlbiByZWN1cnNpdmVseSBjYWxsIG9uIHZhbHVlc1xuICBpZiAoXy5pc1BsYWluT2JqZWN0KGlucHV0KSkge1xuICAgIGNvbnN0IHJlc3VsdE9iaiA9IHt9O1xuICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoaW5wdXQpKSB7XG4gICAgICBjb25zdCByZWN1cnNpdmVseUNhbGxlZFZhbHVlID0gZHVwbGljYXRlS2V5cyh2YWx1ZSwgZmlyc3RLZXksIHNlY29uZEtleSk7XG4gICAgICBpZiAoa2V5ID09PSBmaXJzdEtleSkge1xuICAgICAgICByZXN1bHRPYmpbc2Vjb25kS2V5XSA9IHJlY3Vyc2l2ZWx5Q2FsbGVkVmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gc2Vjb25kS2V5KSB7XG4gICAgICAgIHJlc3VsdE9ialtmaXJzdEtleV0gPSByZWN1cnNpdmVseUNhbGxlZFZhbHVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0T2JqW2tleV0gPSByZWN1cnNpdmVseUNhbGxlZFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0T2JqO1xuICB9XG5cbiAgLy8gQmFzZSBjYXNlLiBSZXR1cm4gcHJpbWl0aXZlcyB3aXRob3V0IGRvaW5nIGFueXRoaW5nLlxuICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogVGFrZXMgYSBkZXNpcmVkIGNhcGFiaWxpdHkgYW5kIHRyaWVzIHRvIEpTT04ucGFyc2UgaXQgYXMgYW4gYXJyYXksXG4gKiBhbmQgZWl0aGVyIHJldHVybnMgdGhlIHBhcnNlZCBhcnJheSBvciBhIHNpbmdsZXRvbiBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxTdHJpbmc+fSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqL1xuZnVuY3Rpb24gcGFyc2VDYXBzQXJyYXkoY2FwKSB7XG4gIGlmIChfLmlzQXJyYXkoY2FwKSkge1xuICAgIHJldHVybiBjYXA7XG4gIH1cblxuICBsZXQgcGFyc2VkQ2FwcztcbiAgdHJ5IHtcbiAgICBwYXJzZWRDYXBzID0gSlNPTi5wYXJzZShjYXApO1xuICAgIGlmIChfLmlzQXJyYXkocGFyc2VkQ2FwcykpIHtcbiAgICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICAgIH1cbiAgfSBjYXRjaCAoaWduKSB7XG4gICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBjYXBhYmlsaXR5IGFzIEpTT04gYXJyYXlgKTtcbiAgfVxuICBpZiAoXy5pc1N0cmluZyhjYXApKSB7XG4gICAgcmV0dXJuIFtjYXBdO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgZGVzY3JpYmVzIGRyaXZlciBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29yZX0gb2JqIGRyaXZlciBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmc/fSBzZXNzaW9uSWQgc2Vzc2lvbiBpZGVudGlmaWVyIChpZiBleGlzdHMpXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeChvYmosIHNlc3Npb25JZCA9IG51bGwpIHtcbiAgY29uc3QgaW5zdGFuY2VOYW1lID0gYCR7b2JqLmNvbnN0cnVjdG9yLm5hbWV9QCR7bm9kZS5nZXRPYmplY3RJZChvYmopLnN1YnN0cmluZygwLCA0KX1gO1xuICByZXR1cm4gc2Vzc2lvbklkID8gYCR7aW5zdGFuY2VOYW1lfSAoJHtzZXNzaW9uSWQuc3Vic3RyaW5nKDAsIDgpfSlgIDogaW5zdGFuY2VOYW1lO1xufVxuXG4vKiogQHR5cGUge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckhlbHBlcnN9ICovXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbmZpZ3VyZUFwcCxcbiAgaXNQYWNrYWdlT3JCdW5kbGUsXG4gIGR1cGxpY2F0ZUtleXMsXG4gIHBhcnNlQ2Fwc0FycmF5LFxuICBnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCxcbn07XG5leHBvcnQge2NvbmZpZ3VyZUFwcCwgaXNQYWNrYWdlT3JCdW5kbGUsIGR1cGxpY2F0ZUtleXMsIHBhcnNlQ2Fwc0FycmF5LCBnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeH07XG5cbi8qKlxuICogQHR5cGVkZWYgUmVtb3RlQXBwUHJvcHNcbiAqIEBwcm9wZXJ0eSB7RGF0ZT99IGxhc3RNb2RpZmllZFxuICogQHByb3BlcnR5IHtib29sZWFufSBpbW11dGFibGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyP30gbWF4QWdlXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLE9BQU8sR0FBRyxNQUFoQjtBQUNBLE1BQU1DLFFBQVEsR0FBRyxDQUFDLE1BQUQsRUFBU0QsT0FBVCxDQUFqQjtBQUNBLE1BQU1FLGNBQWMsR0FBRyxDQUFDLGlCQUFELEVBQW9CLDhCQUFwQixFQUFvRCxpQkFBcEQsQ0FBdkI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxPQUFPLEVBQVAsR0FBWSxFQUFaLEdBQWlCLEVBQTdDO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLElBQXhCO0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsSUFBSUMsaUJBQUosQ0FBUTtFQUNqQ0MsR0FBRyxFQUFFSCxlQUQ0QjtFQUVqQ0ksR0FBRyxFQUFFTCxtQkFGNEI7RUFHakNNLGNBQWMsRUFBRSxJQUhpQjtFQUlqQ0MsT0FBTyxFQUFFLENBQUNDLEdBQUQsRUFBTTtJQUFDQztFQUFELENBQU4sS0FBcUI7SUFDNUJDLGVBQUEsQ0FBT0MsSUFBUCxDQUNHLG9CQUFtQkgsR0FBSSxnQkFBZUMsUUFBUyxRQUFoRCxH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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","names":["IPA_EXT","ZIP_EXTS","ZIP_MIME_TYPES","CACHED_APPS_MAX_AGE","MAX_CACHED_APPS","APPLICATIONS_CACHE","LRU","max","ttl","updateAgeOnGet","dispose","app","fullPath","logger","info","fs","rimraf","noDisposeOnSet","APPLICATIONS_CACHE_GUARD","AsyncLock","SANITIZE_REPLACEMENT","DEFAULT_BASENAME","APP_DOWNLOAD_TIMEOUT_MS","process","on","size","appPaths","values","map","debug","length","util","pluralize","appPath","rimrafSync","e","warn","message","retrieveHeaders","link","axios","url","method","timeout","headers","getCachedApplicationPath","currentAppProps","cachedAppInfo","refresh","_","isPlainObject","lastModified","currentModified","immutable","currentImmutable","maxAge","currentMaxAge","timestamp","getTime","msLeft","Date","now","path","basename","verifyAppExtension","supportedAppExtensions","toLower","includes","extname","Error","calculateFolderIntegrity","folderPath","glob","cwd","strict","nosort","calculateFileIntegrity","filePath","hash","isAppIntegrityOk","currentPath","expectedIntegrity","exists","stat","isDirectory","folder","file","configureApp","options","isString","onPostProcess","isArray","undefined","supportedExtensions","isEmpty","newApp","shouldUnzipApp","packageHash","remoteAppProps","protocol","pathname","parse","isUrl","get","acquire","test","maxAgeMatch","exec","parseInt","cachedPath","integrity","delete","fileName","sanitizeName","decodeURIComponent","replacement","ct","some","mimeType","RegExp","escapeRegExp","match","resultingName","substring","resultingExt","first","targetPath","tempDir","prefix","suffix","downloadApp","errorMessage","isPackageAFile","isFile","isFunction","archivePath","tmpRoot","openDir","unzipApp","isAbsolute","resolve","storeAppInCache","appPathToCache","cachedFullPath","set","result","clone","Boolean","href","net","downloadFile","err","zipPath","dstRoot","zip","assertValidZip","timer","timing","Timer","start","useSystemUnzipEnv","env","APPIUM_PREFER_SYSTEM_UNZIP","useSystemUnzip","extractionOpts","fileNamesEncoding","extractAllTo","globPattern","ext","replace","join","sortedBundleItems","sort","a","b","split","sep","errorAndThrow","Math","round","getDuration","asMilliSeconds","matchedBundle","dstPath","mv","mkdirp","isPackageOrBundle","duplicateKeys","input","firstKey","secondKey","item","resultObj","key","value","toPairs","recursivelyCalledValue","parseCapsArray","cap","parsedCaps","JSON","ign","generateDriverLogPrefix","obj","sessionId","instanceName","constructor","name","node","getObjectId"],"sources":["../../../lib/basedriver/helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport url from 'url';\nimport logger from './logger';\nimport {tempDir, fs, util, zip, net, timing, node} from '@appium/support';\nimport LRU from 'lru-cache';\nimport AsyncLock from 'async-lock';\nimport axios from 'axios';\n\nconst IPA_EXT = '.ipa';\nconst ZIP_EXTS = ['.zip', IPA_EXT];\nconst ZIP_MIME_TYPES = ['application/zip', 'application/x-zip-compressed', 'multipart/x-zip'];\nconst CACHED_APPS_MAX_AGE = 1000 * 60 * 60 * 24; // ms\nconst MAX_CACHED_APPS = 1024;\nconst APPLICATIONS_CACHE = new LRU({\n max: MAX_CACHED_APPS,\n ttl: CACHED_APPS_MAX_AGE, // expire after 24 hours\n updateAgeOnGet: true,\n dispose: (app, {fullPath}) => {\n logger.info(\n `The application '${app}' cached at '${fullPath}' has ` +\n `expired after ${CACHED_APPS_MAX_AGE}ms`\n );\n if (fullPath) {\n fs.rimraf(fullPath);\n }\n },\n noDisposeOnSet: true,\n});\nconst APPLICATIONS_CACHE_GUARD = new AsyncLock();\nconst SANITIZE_REPLACEMENT = '-';\nconst DEFAULT_BASENAME = 'appium-app';\nconst APP_DOWNLOAD_TIMEOUT_MS = 120 * 1000;\n\nprocess.on('exit', () => {\n if (APPLICATIONS_CACHE.size === 0) {\n return;\n }\n\n const appPaths = [...APPLICATIONS_CACHE.values()].map(({fullPath}) => fullPath);\n logger.debug(\n `Performing cleanup of ${appPaths.length} cached ` +\n util.pluralize('application', appPaths.length)\n );\n for (const appPath of appPaths) {\n try {\n // Asynchronous calls are not supported in onExit handler\n fs.rimrafSync(appPath);\n } catch (e) {\n logger.warn(e.message);\n }\n }\n});\n\nasync function retrieveHeaders(link) {\n try {\n return (\n await axios({\n url: link,\n method: 'HEAD',\n timeout: 5000,\n })\n ).headers;\n } catch (e) {\n logger.info(`Cannot send HEAD request to '${link}'. Original error: ${e.message}`);\n }\n return {};\n}\n\nfunction getCachedApplicationPath(link, currentAppProps = {}, cachedAppInfo = {}) {\n const refresh = () => {\n logger.debug(`A fresh copy of the application is going to be downloaded from ${link}`);\n return null;\n };\n\n if (!_.isPlainObject(cachedAppInfo) || !_.isPlainObject(currentAppProps)) {\n // if an invalid arg is passed then assume cache miss\n return refresh();\n }\n\n const {\n lastModified: currentModified,\n immutable: currentImmutable,\n // maxAge is in seconds\n maxAge: currentMaxAge,\n } = currentAppProps;\n const {\n // Date instance\n lastModified,\n // boolean\n immutable,\n // Unix time in milliseconds\n timestamp,\n fullPath,\n } = cachedAppInfo;\n if (lastModified && currentModified) {\n if (currentModified.getTime() <= lastModified.getTime()) {\n logger.debug(`The application at ${link} has not been modified since ${lastModified}`);\n return fullPath;\n }\n logger.debug(`The application at ${link} has been modified since ${lastModified}`);\n return refresh();\n }\n if (immutable && currentImmutable) {\n logger.debug(`The application at ${link} is immutable`);\n return fullPath;\n }\n if (currentMaxAge && timestamp) {\n const msLeft = timestamp + currentMaxAge * 1000 - Date.now();\n if (msLeft > 0) {\n logger.debug(\n `The cached application '${path.basename(fullPath)}' will expire in ${msLeft / 1000}s`\n );\n return fullPath;\n }\n logger.debug(`The cached application '${path.basename(fullPath)}' has expired`);\n }\n return refresh();\n}\n\nfunction verifyAppExtension(app, supportedAppExtensions) {\n if (supportedAppExtensions.map(_.toLower).includes(_.toLower(path.extname(app)))) {\n return app;\n }\n throw new Error(\n `New app path '${app}' did not have ` +\n `${util.pluralize('extension', supportedAppExtensions.length, false)}: ` +\n supportedAppExtensions\n );\n}\n\nasync function calculateFolderIntegrity(folderPath) {\n return (await fs.glob('**/*', {cwd: folderPath, strict: false, nosort: true})).length;\n}\n\nasync function calculateFileIntegrity(filePath) {\n return await fs.hash(filePath);\n}\n\nasync function isAppIntegrityOk(currentPath, expectedIntegrity = {}) {\n if (!(await fs.exists(currentPath))) {\n return false;\n }\n\n // Folder integrity check is simple:\n // Verify the previous amount of files is not greater than the current one.\n // We don't want to use equality comparison because of an assumption that the OS might\n // create some unwanted service files/cached inside of that folder or its subfolders.\n // Ofc, validating the hash sum of each file (or at least of file path) would be much\n // more precise, but we don't need to be very precise here and also don't want to\n // overuse RAM and have a performance drop.\n return (await fs.stat(currentPath)).isDirectory()\n ? (await calculateFolderIntegrity(currentPath)) >= expectedIntegrity?.folder\n : (await calculateFileIntegrity(currentPath)) === expectedIntegrity?.file;\n}\n\n/**\n * @typedef PostProcessOptions\n * @property {?Object} cachedAppInfo The information about the previously cached app instance (if exists):\n * - packageHash: SHA1 hash of the package if it is a file and not a folder\n * - lastModified: Optional Date instance, the value of file's `Last-Modified` header\n * - immutable: Optional boolean value. Contains true if the file has an `immutable` mark\n * in `Cache-control` header\n * - maxAge: Optional integer representation of `maxAge` parameter in `Cache-control` header\n * - timestamp: The timestamp this item has been added to the cache (measured in Unix epoch\n * milliseconds)\n * - integrity: An object containing either `file` property with SHA1 hash of the file\n * or `folder` property with total amount of cached files and subfolders\n * - fullPath: the full path to the cached app\n * @property {boolean} isUrl Whether the app has been downloaded from a remote URL\n * @property {?Object} headers Optional headers object. Only present if `isUrl` is true and if the server\n * responds to HEAD requests. All header names are normalized to lowercase.\n * @property {string} appPath A string containing full path to the preprocessed application package (either\n * downloaded or a local one)\n */\n\n/**\n * @typedef PostProcessResult\n * @property {string} appPath The full past to the post-processed application package on the\n * local file system (might be a file or a folder path)\n */\n\n/**\n * @typedef ConfigureAppOptions\n * @property {(obj: PostProcessOptions) => (Promise<PostProcessResult|undefined>|PostProcessResult|undefined)} [onPostProcess]\n * Optional function, which should be applied\n * to the application after it is downloaded/preprocessed. This function may be async\n * and is expected to accept single object parameter.\n * The function is expected to either return a falsy value, which means the app must not be\n * cached and a fresh copy of it is downloaded each time. If this function returns an object\n * containing `appPath` property then the integrity of it will be verified and stored into\n * the cache.\n * @property {string[]} supportedExtensions List of supported application extensions (\n * including starting dots). This property is mandatory and must not be empty.\n */\n\n/**\n * Prepares an app to be used in an automated test. The app gets cached automatically\n * if it is an archive or if it is downloaded from an URL.\n * If the downloaded app has `.zip` extension, this method will unzip it.\n * The unzip does not work when `onPostProcess` is provided.\n *\n * @param {string} app Either a full path to the app or a remote URL\n * @param {string|string[]|ConfigureAppOptions} options\n * @returns The full path to the resulting application bundle\n */\nasync function configureApp(app, options = /** @type {ConfigureAppOptions} */ ({})) {\n if (!_.isString(app)) {\n // immediately shortcircuit if not given an app\n return;\n }\n\n let supportedAppExtensions;\n const onPostProcess =\n !_.isString(options) && !_.isArray(options) ? options.onPostProcess : undefined;\n\n if (_.isString(options)) {\n supportedAppExtensions = [options];\n } else if (_.isArray(options)) {\n supportedAppExtensions = options;\n } else if (_.isPlainObject(options)) {\n supportedAppExtensions = options.supportedExtensions;\n }\n if (_.isEmpty(supportedAppExtensions)) {\n throw new Error(`One or more supported app extensions must be provided`);\n }\n\n let newApp = app;\n let shouldUnzipApp = false;\n let packageHash = null;\n let headers = null;\n /** @type {RemoteAppProps} */\n const remoteAppProps = {\n lastModified: null,\n immutable: false,\n maxAge: null,\n };\n const {protocol, pathname} = url.parse(newApp);\n const isUrl = protocol === null ? false : ['http:', 'https:'].includes(protocol);\n\n const cachedAppInfo = APPLICATIONS_CACHE.get(app);\n\n return await APPLICATIONS_CACHE_GUARD.acquire(app, async () => {\n if (isUrl) {\n // Use the app from remote URL\n logger.info(`Using downloadable app '${newApp}'`);\n headers = await retrieveHeaders(newApp);\n if (!_.isEmpty(headers)) {\n if (headers['last-modified']) {\n remoteAppProps.lastModified = new Date(headers['last-modified']);\n }\n logger.debug(`Last-Modified: ${headers['last-modified']}`);\n if (headers['cache-control']) {\n remoteAppProps.immutable = /\\bimmutable\\b/i.test(headers['cache-control']);\n const maxAgeMatch = /\\bmax-age=(\\d+)\\b/i.exec(headers['cache-control']);\n if (maxAgeMatch) {\n remoteAppProps.maxAge = parseInt(maxAgeMatch[1], 10);\n }\n }\n logger.debug(`Cache-Control: ${headers['cache-control']}`);\n }\n const cachedPath = getCachedApplicationPath(app, remoteAppProps, cachedAppInfo);\n if (cachedPath) {\n if (await isAppIntegrityOk(cachedPath, cachedAppInfo?.integrity)) {\n logger.info(`Reusing previously downloaded application at '${cachedPath}'`);\n return verifyAppExtension(cachedPath, supportedAppExtensions);\n }\n logger.info(\n `The application at '${cachedPath}' does not exist anymore ` +\n `or its integrity has been damaged. Deleting it from the internal cache`\n );\n APPLICATIONS_CACHE.delete(app);\n }\n\n let fileName = null;\n const basename = fs.sanitizeName(path.basename(decodeURIComponent(pathname ?? '')), {\n replacement: SANITIZE_REPLACEMENT,\n });\n const extname = path.extname(basename);\n // to determine if we need to unzip the app, we have a number of places\n // to look: content type, content disposition, or the file extension\n if (ZIP_EXTS.includes(extname)) {\n fileName = basename;\n shouldUnzipApp = true;\n }\n if (headers['content-type']) {\n const ct = headers['content-type'];\n logger.debug(`Content-Type: ${ct}`);\n // the filetype may not be obvious for certain urls, so check the mime type too\n if (\n ZIP_MIME_TYPES.some((mimeType) =>\n new RegExp(`\\\\b${_.escapeRegExp(mimeType)}\\\\b`).test(ct)\n )\n ) {\n if (!fileName) {\n fileName = `${DEFAULT_BASENAME}.zip`;\n }\n shouldUnzipApp = true;\n }\n }\n if (headers['content-disposition'] && /^attachment/i.test(headers['content-disposition'])) {\n logger.debug(`Content-Disposition: ${headers['content-disposition']}`);\n const match = /filename=\"([^\"]+)/i.exec(headers['content-disposition']);\n if (match) {\n fileName = fs.sanitizeName(match[1], {\n replacement: SANITIZE_REPLACEMENT,\n });\n shouldUnzipApp = shouldUnzipApp || ZIP_EXTS.includes(path.extname(fileName));\n }\n }\n if (!fileName) {\n // assign the default file name and the extension if none has been detected\n const resultingName = basename\n ? basename.substring(0, basename.length - extname.length)\n : DEFAULT_BASENAME;\n let resultingExt = extname;\n if (!supportedAppExtensions.includes(resultingExt)) {\n logger.info(\n `The current file extension '${resultingExt}' is not supported. ` +\n `Defaulting to '${_.first(supportedAppExtensions)}'`\n );\n resultingExt = /** @type {string} */ (_.first(supportedAppExtensions));\n }\n fileName = `${resultingName}${resultingExt}`;\n }\n const targetPath = await tempDir.path({\n prefix: fileName,\n suffix: '',\n });\n newApp = await downloadApp(newApp, targetPath);\n } else if (await fs.exists(newApp)) {\n // Use the local app\n logger.info(`Using local app '${newApp}'`);\n shouldUnzipApp = ZIP_EXTS.includes(path.extname(newApp));\n } else {\n let errorMessage = `The application at '${newApp}' does not exist or is not accessible`;\n // protocol value for 'C:\\\\temp' is 'c:', so we check the length as well\n if (_.isString(protocol) && protocol.length > 2) {\n errorMessage =\n `The protocol '${protocol}' used in '${newApp}' is not supported. ` +\n `Only http: and https: protocols are supported`;\n }\n throw new Error(errorMessage);\n }\n\n const isPackageAFile = (await fs.stat(newApp)).isFile();\n if (isPackageAFile) {\n packageHash = await calculateFileIntegrity(newApp);\n }\n\n if (isPackageAFile && shouldUnzipApp && !_.isFunction(onPostProcess)) {\n const archivePath = newApp;\n if (packageHash === cachedAppInfo?.packageHash) {\n const {fullPath} = cachedAppInfo;\n if (await isAppIntegrityOk(fullPath, cachedAppInfo?.integrity)) {\n if (archivePath !== app) {\n await fs.rimraf(archivePath);\n }\n logger.info(`Will reuse previously cached application at '${fullPath}'`);\n return verifyAppExtension(fullPath, supportedAppExtensions);\n }\n logger.info(\n `The application at '${fullPath}' does not exist anymore ` +\n `or its integrity has been damaged. Deleting it from the cache`\n );\n APPLICATIONS_CACHE.delete(app);\n }\n const tmpRoot = await tempDir.openDir();\n try {\n newApp = await unzipApp(archivePath, tmpRoot, supportedAppExtensions);\n } finally {\n if (newApp !== archivePath && archivePath !== app) {\n await fs.rimraf(archivePath);\n }\n }\n logger.info(`Unzipped local app to '${newApp}'`);\n } else if (!path.isAbsolute(newApp)) {\n newApp = path.resolve(process.cwd(), newApp);\n logger.warn(\n `The current application path '${app}' is not absolute ` +\n `and has been rewritten to '${newApp}'. Consider using absolute paths rather than relative`\n );\n app = newApp;\n }\n\n const storeAppInCache = async (appPathToCache) => {\n const cachedFullPath = cachedAppInfo?.fullPath;\n if (cachedFullPath && cachedFullPath !== appPathToCache) {\n await fs.rimraf(cachedFullPath);\n }\n const integrity = {};\n if ((await fs.stat(appPathToCache)).isDirectory()) {\n integrity.folder = await calculateFolderIntegrity(appPathToCache);\n } else {\n integrity.file = await calculateFileIntegrity(appPathToCache);\n }\n APPLICATIONS_CACHE.set(app, {\n ...remoteAppProps,\n timestamp: Date.now(),\n packageHash,\n integrity,\n fullPath: appPathToCache,\n });\n return appPathToCache;\n };\n\n if (_.isFunction(onPostProcess)) {\n const result = await onPostProcess({\n cachedAppInfo: _.clone(cachedAppInfo),\n isUrl,\n headers: _.clone(headers),\n appPath: newApp,\n });\n return !result?.appPath || app === result?.appPath || !(await fs.exists(result?.appPath))\n ? newApp\n : await storeAppInCache(result.appPath);\n }\n\n verifyAppExtension(newApp, supportedAppExtensions);\n return app !== newApp && (packageHash || _.values(remoteAppProps).some(Boolean))\n ? await storeAppInCache(newApp)\n : newApp;\n });\n}\n\nasync function downloadApp(app, targetPath) {\n const {href} = url.parse(app);\n try {\n await net.downloadFile(href, targetPath, {\n timeout: APP_DOWNLOAD_TIMEOUT_MS,\n });\n } catch (err) {\n throw new Error(`Unable to download the app: ${err.message}`);\n }\n return targetPath;\n}\n\n/**\n * Extracts the bundle from an archive into the given folder\n *\n * @param {string} zipPath Full path to the archive containing the bundle\n * @param {string} dstRoot Full path to the folder where the extracted bundle\n * should be placed\n * @param {Array<string>|string} supportedAppExtensions The list of extensions\n * the target application bundle supports, for example ['.apk', '.apks'] for\n * Android packages\n * @returns {Promise<string>} Full path to the bundle in the destination folder\n * @throws {Error} If the given archive is invalid or no application bundles\n * have been found inside\n */\nasync function unzipApp(zipPath, dstRoot, supportedAppExtensions) {\n await zip.assertValidZip(zipPath);\n\n if (!_.isArray(supportedAppExtensions)) {\n supportedAppExtensions = [supportedAppExtensions];\n }\n\n const tmpRoot = await tempDir.openDir();\n try {\n logger.debug(`Unzipping '${zipPath}'`);\n const timer = new timing.Timer().start();\n const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;\n const useSystemUnzip =\n _.isEmpty(useSystemUnzipEnv) || !['0', 'false'].includes(_.toLower(useSystemUnzipEnv));\n /**\n * Attempt to use use the system `unzip` (e.g., `/usr/bin/unzip`) due\n * to the significant performance improvement it provides over the native\n * JS \"unzip\" implementation.\n * @type {import('@appium/support/lib/zip').ExtractAllOptions}\n */\n const extractionOpts = {useSystemUnzip};\n // https://github.com/appium/appium/issues/14100\n if (path.extname(zipPath) === IPA_EXT) {\n logger.debug(\n `Enforcing UTF-8 encoding on the extracted file names for '${path.basename(zipPath)}'`\n );\n extractionOpts.fileNamesEncoding = 'utf8';\n }\n await zip.extractAllTo(zipPath, tmpRoot, extractionOpts);\n const globPattern = `**/*.+(${supportedAppExtensions\n .map((ext) => ext.replace(/^\\./, ''))\n .join('|')})`;\n const sortedBundleItems = (\n await fs.glob(globPattern, {\n cwd: tmpRoot,\n strict: false,\n // Get the top level match\n })\n ).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);\n if (_.isEmpty(sortedBundleItems)) {\n logger.errorAndThrow(\n `App unzipped OK, but we could not find any '${supportedAppExtensions}' ` +\n util.pluralize('bundle', supportedAppExtensions.length, false) +\n ` in it. Make sure your archive contains at least one package having ` +\n `'${supportedAppExtensions}' ${util.pluralize(\n 'extension',\n supportedAppExtensions.length,\n false\n )}`\n );\n }\n logger.debug(\n `Extracted ${util.pluralize('bundle item', sortedBundleItems.length, true)} ` +\n `from '${zipPath}' in ${Math.round(\n timer.getDuration().asMilliSeconds\n )}ms: ${sortedBundleItems}`\n );\n const matchedBundle = /** @type {string} */ (_.first(sortedBundleItems));\n logger.info(`Assuming '${matchedBundle}' is the correct bundle`);\n const dstPath = path.resolve(dstRoot, path.basename(matchedBundle));\n await fs.mv(path.resolve(tmpRoot, matchedBundle), dstPath, {mkdirp: true});\n return dstPath;\n } finally {\n await fs.rimraf(tmpRoot);\n }\n}\n\nfunction isPackageOrBundle(app) {\n return /^([a-zA-Z0-9\\-_]+\\.[a-zA-Z0-9\\-_]+)+$/.test(app);\n}\n\n/**\n * Finds all instances 'firstKey' and create a duplicate with the key 'secondKey',\n * Do the same thing in reverse. If we find 'secondKey', create a duplicate with the key 'firstKey'.\n *\n * This will cause keys to be overwritten if the object contains 'firstKey' and 'secondKey'.\n\n * @param {*} input Any type of input\n * @param {String} firstKey The first key to duplicate\n * @param {String} secondKey The second key to duplicate\n */\nfunction duplicateKeys(input, firstKey, secondKey) {\n // If array provided, recursively call on all elements\n if (_.isArray(input)) {\n return input.map((item) => duplicateKeys(item, firstKey, secondKey));\n }\n\n // If object, create duplicates for keys and then recursively call on values\n if (_.isPlainObject(input)) {\n const resultObj = {};\n for (let [key, value] of _.toPairs(input)) {\n const recursivelyCalledValue = duplicateKeys(value, firstKey, secondKey);\n if (key === firstKey) {\n resultObj[secondKey] = recursivelyCalledValue;\n } else if (key === secondKey) {\n resultObj[firstKey] = recursivelyCalledValue;\n }\n resultObj[key] = recursivelyCalledValue;\n }\n return resultObj;\n }\n\n // Base case. Return primitives without doing anything.\n return input;\n}\n\n/**\n * Takes a desired capability and tries to JSON.parse it as an array,\n * and either returns the parsed array or a singleton array.\n *\n * @param {string|Array<String>} cap A desired capability\n */\nfunction parseCapsArray(cap) {\n if (_.isArray(cap)) {\n return cap;\n }\n\n let parsedCaps;\n try {\n parsedCaps = JSON.parse(cap);\n if (_.isArray(parsedCaps)) {\n return parsedCaps;\n }\n } catch (ign) {\n logger.warn(`Failed to parse capability as JSON array`);\n }\n if (_.isString(cap)) {\n return [cap];\n }\n throw new Error(`must provide a string or JSON Array; received ${cap}`);\n}\n\n/**\n * Generate a string that uniquely describes driver instance\n *\n * @param {import('@appium/types').Core} obj driver instance\n * @param {string?} sessionId session identifier (if exists)\n * @returns {string}\n */\nfunction generateDriverLogPrefix(obj, sessionId = null) {\n const instanceName = `${obj.constructor.name}@${node.getObjectId(obj).substring(0, 4)}`;\n return sessionId ? `${instanceName} (${sessionId.substring(0, 8)})` : instanceName;\n}\n\n/** @type {import('@appium/types').DriverHelpers} */\nexport default {\n configureApp,\n isPackageOrBundle,\n duplicateKeys,\n parseCapsArray,\n generateDriverLogPrefix,\n};\nexport {configureApp, isPackageOrBundle, duplicateKeys, parseCapsArray, generateDriverLogPrefix};\n\n/**\n * @typedef RemoteAppProps\n * @property {Date?} lastModified\n * @property {boolean} immutable\n * @property {number?} maxAge\n */\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","names":["log","logger","getLogger"],"sources":["../../../lib/basedriver/logger.js"],"sourcesContent":["import {logger} from '@appium/support';\n\nconst log = logger.getLogger('BaseDriver');\nexport default log;\n"],"mappings":";;;;;;;;;AAAA;;AAEA,MAAMA,GAAG,GAAGC,eAAA,CAAOC,SAAP,CAAiB,YAAjB,CAAZ;;eACeF,G"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","names":["MAX_LOG_BODY_LENGTH","MJSONWP_ELEMENT_KEY","W3C_ELEMENT_KEY","util","W3C_WEB_ELEMENT_IDENTIFIER","PROTOCOLS","W3C","MJSONWP","DEFAULT_BASE_PATH"],"sources":["../../lib/constants.js"],"sourcesContent":["import {util} from '@appium/support';\n\n// The default maximum length of a single log record\n// containing http request/response body\n// This value could be globally customized using the --log-filters\n// server feature. Example rule:\n// \t{\"pattern\": \"(.{1,150}).*\", \"flags\": \"s\", \"replacer\": \"$1\"}\n// ^ cuts all log records to maximum 150 chars\nconst MAX_LOG_BODY_LENGTH = 1024;\nconst MJSONWP_ELEMENT_KEY = 'ELEMENT';\nconst W3C_ELEMENT_KEY = util.W3C_WEB_ELEMENT_IDENTIFIER;\nconst PROTOCOLS = {\n W3C: 'W3C',\n MJSONWP: 'MJSONWP',\n};\n\n// Before Appium 2.0, this default value was '/wd/hub' by historical reasons.\nconst DEFAULT_BASE_PATH = '';\n\nexport {MAX_LOG_BODY_LENGTH, MJSONWP_ELEMENT_KEY, W3C_ELEMENT_KEY, PROTOCOLS, DEFAULT_BASE_PATH};\n"],"mappings":";;;;;;;;;AAAA;;AAQA,MAAMA,mBAAmB,GAAG,IAA5B;;AACA,MAAMC,mBAAmB,GAAG,SAA5B;;AACA,MAAMC,eAAe,GAAGC,aAAA,CAAKC,0BAA7B;;AACA,MAAMC,SAAS,GAAG;EAChBC,GAAG,EAAE,KADW;EAEhBC,OAAO,EAAE;AAFO,CAAlB;;AAMA,MAAMC,iBAAiB,GAAG,EAA1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash.js","names":["produceError","errors","UnknownCommandError","produceCrash","Error"],"sources":["../../../lib/express/crash.js"],"sourcesContent":["import {errors} from '../protocol';\n\nfunction produceError() {\n throw new errors.UnknownCommandError('Produced generic error for testing');\n}\n\nfunction produceCrash() {\n throw new Error('We just tried to crash Appium!');\n}\n\nexport {produceError, produceCrash};\n"],"mappings":";;;;;;;;;;AAAA;;AAEA,SAASA,YAAT,GAAwB;EACtB,MAAM,IAAIC,gBAAA,CAAOC,mBAAX,CAA+B,oCAA/B,CAAN;AACD;;AAED,SAASC,YAAT,GAAwB;EACtB,MAAM,IAAIC,KAAJ,CAAU,gCAAV,CAAN;AACD"}
|
|
@@ -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
|
});
|
|
@@ -19,6 +17,8 @@ var _logger = _interopRequireDefault(require("./logger"));
|
|
|
19
17
|
|
|
20
18
|
var _constants = require("../constants");
|
|
21
19
|
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
22
22
|
function compile(fmt) {
|
|
23
23
|
fmt = fmt.replace(/"/g, '\\"');
|
|
24
24
|
fmt = fmt.replace(/:([-\w]{2,})(?:\[([^\]]+)\])?/g, function replace(_, name, arg) {
|
|
@@ -67,4 +67,4 @@ const startLogFormatter = (0, _morgan.default)((tokens, req, res) => {
|
|
|
67
67
|
immediate: true
|
|
68
68
|
});
|
|
69
69
|
exports.startLogFormatter = startLogFormatter;
|
|
70
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21waWxlIiwiZm10IiwicmVwbGFjZSIsIl8iLCJuYW1lIiwiYXJnIiwianMiLCJGdW5jdGlvbiIsInJlcXVlc3RFbmRMb2dnaW5nRm9ybWF0IiwidG9rZW5zIiwicmVxIiwicmVzIiwic3RhdHVzIiwic3RhdHVzQ29kZSIsInN0YXR1c1N0ciIsInJlZCIsInllbGxvdyIsImN5YW4iLCJncmVlbiIsImZuIiwid2hpdGUiLCJncmV5IiwiZW5kTG9nRm9ybWF0dGVyIiwibW9yZ2FuIiwibG9nIiwiaW5mbyIsImpzb25SZXNwIiwicmVxdWVzdFN0YXJ0TG9nZ2luZ0Zvcm1hdCIsInN0YXJ0TG9nRm9ybWF0dGVyIiwicmVxQm9keSIsImJvZHkiLCJ0cnVuY2F0ZSIsImlzU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsIk1BWF9MT0dfQk9EWV9MRU5HVEgiLCJpZ24iLCJpbW1lZGlhdGUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXhwcmVzcy9leHByZXNzLWxvZ2dpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAnQGNvbG9ycy9jb2xvcnMnO1xuaW1wb3J0IG1vcmdhbiBmcm9tICdtb3JnYW4nO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge01BWF9MT0dfQk9EWV9MRU5HVEh9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbi8vIENvcGllZCB0aGUgbW9yZ2FuIGNvbXBpbGUgZnVuY3Rpb24gb3ZlciBzbyB0aGF0IGNvb2xlciBmb3JtYXRzXG4vLyBtYXkgYmUgY29uZmlndXJlZFxuZnVuY3Rpb24gY29tcGlsZShmbXQpIHtcbiAgLy8gZXNjYXBlIHF1b3Rlc1xuICBmbXQgPSBmbXQucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpO1xuICBmbXQgPSBmbXQucmVwbGFjZSgvOihbLVxcd117Mix9KSg/OlxcWyhbXlxcXV0rKVxcXSk/L2csIGZ1bmN0aW9uIHJlcGxhY2UoXywgbmFtZSwgYXJnKSB7XG4gICAgcmV0dXJuIGBcIlxcbiAgICArICh0b2tlbnNbXCIke25hbWV9XCJdKHJlcSwgcmVzLCBcIiR7YXJnfVwiKSB8fCBcIi1cIikgKyBcImA7XG4gIH0pO1xuICBsZXQganMgPSBgICByZXR1cm4gXCIke2ZtdH1cIjtgO1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKCd0b2tlbnMsIHJlcSwgcmVzJywganMpO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0RW5kTG9nZ2luZ0Zvcm1hdCh0b2tlbnMsIHJlcSwgcmVzKSB7XG4gIGxldCBzdGF0dXMgPSByZXMuc3RhdHVzQ29kZTtcbiAgbGV0IHN0YXR1c1N0ciA9ICc6c3RhdHVzJztcbiAgaWYgKHN0YXR1cyA+PSA1MDApIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIucmVkO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIueWVsbG93O1xuICB9IGVsc2UgaWYgKHN0YXR1cyA+PSAzMDApIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIuY3lhbjtcbiAgfSBlbHNlIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIuZ3JlZW47XG4gIH1cbiAgbGV0IGZuID0gY29tcGlsZShcbiAgICBgJHsnPC0tIDptZXRob2QgOnVybCAnLndoaXRlfSR7c3RhdHVzU3RyfSAkeyc6cmVzcG9uc2UtdGltZSBtcyAtIDpyZXNbY29udGVudC1sZW5ndGhdJy5ncmV5fWBcbiAgKTtcbiAgcmV0dXJuIGZuKHRva2VucywgcmVxLCByZXMpO1xufVxuXG5jb25zdCBlbmRMb2dGb3JtYXR0ZXIgPSBtb3JnYW4oKHRva2VucywgcmVxLCByZXMpID0+
|
|
70
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21waWxlIiwiZm10IiwicmVwbGFjZSIsIl8iLCJuYW1lIiwiYXJnIiwianMiLCJGdW5jdGlvbiIsInJlcXVlc3RFbmRMb2dnaW5nRm9ybWF0IiwidG9rZW5zIiwicmVxIiwicmVzIiwic3RhdHVzIiwic3RhdHVzQ29kZSIsInN0YXR1c1N0ciIsInJlZCIsInllbGxvdyIsImN5YW4iLCJncmVlbiIsImZuIiwid2hpdGUiLCJncmV5IiwiZW5kTG9nRm9ybWF0dGVyIiwibW9yZ2FuIiwibG9nIiwiaW5mbyIsImpzb25SZXNwIiwicmVxdWVzdFN0YXJ0TG9nZ2luZ0Zvcm1hdCIsInN0YXJ0TG9nRm9ybWF0dGVyIiwicmVxQm9keSIsImJvZHkiLCJ0cnVuY2F0ZSIsImlzU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsIk1BWF9MT0dfQk9EWV9MRU5HVEgiLCJpZ24iLCJpbW1lZGlhdGUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXhwcmVzcy9leHByZXNzLWxvZ2dpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAnQGNvbG9ycy9jb2xvcnMnO1xuaW1wb3J0IG1vcmdhbiBmcm9tICdtb3JnYW4nO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge01BWF9MT0dfQk9EWV9MRU5HVEh9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbi8vIENvcGllZCB0aGUgbW9yZ2FuIGNvbXBpbGUgZnVuY3Rpb24gb3ZlciBzbyB0aGF0IGNvb2xlciBmb3JtYXRzXG4vLyBtYXkgYmUgY29uZmlndXJlZFxuZnVuY3Rpb24gY29tcGlsZShmbXQpIHtcbiAgLy8gZXNjYXBlIHF1b3Rlc1xuICBmbXQgPSBmbXQucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpO1xuICBmbXQgPSBmbXQucmVwbGFjZSgvOihbLVxcd117Mix9KSg/OlxcWyhbXlxcXV0rKVxcXSk/L2csIGZ1bmN0aW9uIHJlcGxhY2UoXywgbmFtZSwgYXJnKSB7XG4gICAgcmV0dXJuIGBcIlxcbiAgICArICh0b2tlbnNbXCIke25hbWV9XCJdKHJlcSwgcmVzLCBcIiR7YXJnfVwiKSB8fCBcIi1cIikgKyBcImA7XG4gIH0pO1xuICBsZXQganMgPSBgICByZXR1cm4gXCIke2ZtdH1cIjtgO1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKCd0b2tlbnMsIHJlcSwgcmVzJywganMpO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0RW5kTG9nZ2luZ0Zvcm1hdCh0b2tlbnMsIHJlcSwgcmVzKSB7XG4gIGxldCBzdGF0dXMgPSByZXMuc3RhdHVzQ29kZTtcbiAgbGV0IHN0YXR1c1N0ciA9ICc6c3RhdHVzJztcbiAgaWYgKHN0YXR1cyA+PSA1MDApIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIucmVkO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIueWVsbG93O1xuICB9IGVsc2UgaWYgKHN0YXR1cyA+PSAzMDApIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIuY3lhbjtcbiAgfSBlbHNlIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIuZ3JlZW47XG4gIH1cbiAgbGV0IGZuID0gY29tcGlsZShcbiAgICBgJHsnPC0tIDptZXRob2QgOnVybCAnLndoaXRlfSR7c3RhdHVzU3RyfSAkeyc6cmVzcG9uc2UtdGltZSBtcyAtIDpyZXNbY29udGVudC1sZW5ndGhdJy5ncmV5fWBcbiAgKTtcbiAgcmV0dXJuIGZuKHRva2VucywgcmVxLCByZXMpO1xufVxuXG5jb25zdCBlbmRMb2dGb3JtYXR0ZXIgPSBtb3JnYW4oKHRva2VucywgcmVxLCByZXMpID0+IHtcbiAgbG9nLmluZm8ocmVxdWVzdEVuZExvZ2dpbmdGb3JtYXQodG9rZW5zLCByZXEsIHJlcyksIChyZXMuanNvblJlc3AgfHwgJycpLmdyZXkpO1xufSk7XG5cbmNvbnN0IHJlcXVlc3RTdGFydExvZ2dpbmdGb3JtYXQgPSBjb21waWxlKGAkeyctLT4nLndoaXRlfSAkeyc6bWV0aG9kJy53aGl0ZX0gJHsnOnVybCcud2hpdGV9YCk7XG5cbmNvbnN0IHN0YXJ0TG9nRm9ybWF0dGVyID0gbW9yZ2FuKFxuICAodG9rZW5zLCByZXEsIHJlcykgPT4ge1xuICAgIC8vIG1vcmdhbiBvdXRwdXQgaXMgcmVkaXJlY3RlZCBzdHJhaWdodCB0byB3aW5zdG9uXG4gICAgbGV0IHJlcUJvZHkgPSAnJztcbiAgICBpZiAocmVxLmJvZHkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcUJvZHkgPSBfLnRydW5jYXRlKF8uaXNTdHJpbmcocmVxLmJvZHkpID8gcmVxLmJvZHkgOiBKU09OLnN0cmluZ2lmeShyZXEuYm9keSksIHtcbiAgICAgICAgICBsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEgsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgICBsb2cuaW5mbyhyZXF1ZXN0U3RhcnRMb2dnaW5nRm9ybWF0KHRva2VucywgcmVxLCByZXMpLCByZXFCb2R5LmdyZXkpO1xuICB9LFxuICB7aW1tZWRpYXRlOiB0cnVlfVxuKTtcblxuZXhwb3J0IHtlbmRMb2dGb3JtYXR0ZXIsIHN0YXJ0TG9nRm9ybWF0dGVyfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFJQSxTQUFTQSxPQUFULENBQWlCQyxHQUFqQixFQUFzQjtFQUVwQkEsR0FBRyxHQUFHQSxHQUFHLENBQUNDLE9BQUosQ0FBWSxJQUFaLEVBQWtCLEtBQWxCLENBQU47RUFDQUQsR0FBRyxHQUFHQSxHQUFHLENBQUNDLE9BQUosQ0FBWSxnQ0FBWixFQUE4QyxTQUFTQSxPQUFULENBQWlCQyxDQUFqQixFQUFvQkMsSUFBcEIsRUFBMEJDLEdBQTFCLEVBQStCO0lBQ2pGLE9BQVEscUJBQW9CRCxJQUFLLGlCQUFnQkMsR0FBSSxnQkFBckQ7RUFDRCxDQUZLLENBQU47RUFHQSxJQUFJQyxFQUFFLEdB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-logging.js","names":["compile","fmt","replace","_","name","arg","js","Function","requestEndLoggingFormat","tokens","req","res","status","statusCode","statusStr","red","yellow","cyan","green","fn","white","grey","endLogFormatter","morgan","log","info","jsonResp","requestStartLoggingFormat","startLogFormatter","reqBody","body","truncate","isString","JSON","stringify","length","MAX_LOG_BODY_LENGTH","ign","immediate"],"sources":["../../../lib/express/express-logging.js"],"sourcesContent":["import _ from 'lodash';\nimport '@colors/colors';\nimport morgan from 'morgan';\nimport log from './logger';\nimport {MAX_LOG_BODY_LENGTH} from '../constants';\n\n// Copied the morgan compile function over so that cooler formats\n// may be configured\nfunction compile(fmt) {\n // escape quotes\n fmt = fmt.replace(/\"/g, '\\\\\"');\n fmt = fmt.replace(/:([-\\w]{2,})(?:\\[([^\\]]+)\\])?/g, function replace(_, name, arg) {\n return `\"\\n + (tokens[\"${name}\"](req, res, \"${arg}\") || \"-\") + \"`;\n });\n let js = ` return \"${fmt}\";`;\n return new Function('tokens, req, res', js);\n}\n\nfunction requestEndLoggingFormat(tokens, req, res) {\n let status = res.statusCode;\n let statusStr = ':status';\n if (status >= 500) {\n statusStr = statusStr.red;\n } else if (status >= 400) {\n statusStr = statusStr.yellow;\n } else if (status >= 300) {\n statusStr = statusStr.cyan;\n } else {\n statusStr = statusStr.green;\n }\n let fn = compile(\n `${'<-- :method :url '.white}${statusStr} ${':response-time ms - :res[content-length]'.grey}`\n );\n return fn(tokens, req, res);\n}\n\nconst endLogFormatter = morgan((tokens, req, res) => {\n log.info(requestEndLoggingFormat(tokens, req, res), (res.jsonResp || '').grey);\n});\n\nconst requestStartLoggingFormat = compile(`${'-->'.white} ${':method'.white} ${':url'.white}`);\n\nconst startLogFormatter = morgan(\n (tokens, req, res) => {\n // morgan output is redirected straight to winston\n let reqBody = '';\n if (req.body) {\n try {\n reqBody = _.truncate(_.isString(req.body) ? req.body : JSON.stringify(req.body), {\n length: MAX_LOG_BODY_LENGTH,\n });\n } catch (ign) {}\n }\n log.info(requestStartLoggingFormat(tokens, req, res), reqBody.grey);\n },\n {immediate: true}\n);\n\nexport {endLogFormatter, startLogFormatter};\n"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;AAIA,SAASA,OAAT,CAAiBC,GAAjB,EAAsB;EAEpBA,GAAG,GAAGA,GAAG,CAACC,OAAJ,CAAY,IAAZ,EAAkB,KAAlB,CAAN;EACAD,GAAG,GAAGA,GAAG,CAACC,OAAJ,CAAY,gCAAZ,EAA8C,SAASA,OAAT,CAAiBC,CAAjB,EAAoBC,IAApB,EAA0BC,GAA1B,EAA+B;IACjF,OAAQ,qBAAoBD,IAAK,iBAAgBC,GAAI,gBAArD;EACD,CAFK,CAAN;EAGA,IAAIC,EAAE,GAAI,aAAYL,GAAI,IAA1B;EACA,OAAO,IAAIM,QAAJ,CAAa,kBAAb,EAAiCD,EAAjC,CAAP;AACD;;AAED,SAASE,uBAAT,CAAiCC,MAAjC,EAAyCC,GAAzC,EAA8CC,GAA9C,EAAmD;EACjD,IAAIC,MAAM,GAAGD,GAAG,CAACE,UAAjB;EACA,IAAIC,SAAS,GAAG,SAAhB;;EACA,IAAIF,MAAM,IAAI,GAAd,EAAmB;IACjBE,SAAS,GAAGA,SAAS,CAACC,GAAtB;EACD,CAFD,MAEO,IAAIH,MAAM,IAAI,GAAd,EAAmB;IACxBE,SAAS,GAAGA,SAAS,CAACE,MAAtB;EACD,CAFM,MAEA,IAAIJ,MAAM,IAAI,GAAd,EAAmB;IACxBE,SAAS,GAAGA,SAAS,CAACG,IAAtB;EACD,CAFM,MAEA;IACLH,SAAS,GAAGA,SAAS,CAACI,KAAtB;EACD;;EACD,IAAIC,EAAE,GAAGnB,OAAO,CACb,GAAE,oBAAoBoB,KAAM,GAAEN,SAAU,IAAG,2CAA2CO,IAAK,EAD9E,CAAhB;EAGA,OAAOF,EAAE,CAACV,MAAD,EAASC,GAAT,EAAcC,GAAd,CAAT;AACD;;AAED,MAAMW,eAAe,GAAG,IAAAC,eAAA,EAAO,CAACd,MAAD,EAASC,GAAT,EAAcC,GAAd,KAAsB;EACnDa,eAAA,CAAIC,IAAJ,CAASjB,uBAAuB,CAACC,MAAD,EAASC,GAAT,EAAcC,GAAd,CAAhC,EAAoD,CAACA,GAAG,CAACe,QAAJ,IAAgB,EAAjB,EAAqBL,IAAzE;AACD,CAFuB,CAAxB;;AAIA,MAAMM,yBAAyB,GAAG3B,OAAO,CAAE,GAAE,MAAMoB,KAAM,IAAG,UAAUA,KAAM,IAAG,OAAOA,KAAM,EAAnD,CAAzC;AAEA,MAAMQ,iBAAiB,GAAG,IAAAL,eAAA,EACxB,CAACd,MAAD,EAASC,GAAT,EAAcC,GAAd,KAAsB;EAEpB,IAAIkB,OAAO,GAAG,EAAd;;EACA,IAAInB,GAAG,CAACoB,IAAR,EAAc;IACZ,IAAI;MACFD,OAAO,GAAG1B,eAAA,CAAE4B,QAAF,CAAW5B,eAAA,CAAE6B,QAAF,CAAWtB,GAAG,CAACoB,IAAf,IAAuBpB,GAAG,CAACoB,IAA3B,GAAkCG,IAAI,CAACC,SAAL,CAAexB,GAAG,CAACoB,IAAnB,CAA7C,EAAuE;QAC/EK,MAAM,EAAEC;MADuE,CAAvE,CAAV;IAGD,CAJD,CAIE,OAAOC,GAAP,EAAY,CAAE;EACjB;;EACDb,eAAA,CAAIC,IAAJ,CAASE,yBAAyB,CAAClB,MAAD,EAASC,GAAT,EAAcC,GAAd,CAAlC,EAAsDkB,OAAO,CAACR,IAA9D;AACD,CAZuB,EAaxB;EAACiB,SAAS,EAAE;AAAZ,CAbwB,CAA1B"}
|
|
@@ -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
|
});
|
|
@@ -21,6 +19,8 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
21
19
|
|
|
22
20
|
var _events = require("events");
|
|
23
21
|
|
|
22
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
+
|
|
24
24
|
const CACHE_SIZE = 1024;
|
|
25
25
|
const IDEMPOTENT_RESPONSES = new _lruCache.default({
|
|
26
26
|
max: CACHE_SIZE,
|
|
@@ -190,4 +190,4 @@ async function handleIdempotency(req, res, next) {
|
|
|
190
190
|
});
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDQUNIRV9TSVpFIiwiSURFTVBPVEVOVF9SRVNQT05TRVMiLCJMUlUiLCJtYXgiLCJ1cGRhdGVBZ2VPbkdldCIsImRpc3Bvc2UiLCJrZXkiLCJyZXNwb25zZSIsImZzIiwicmltcmFmU3luYyIsIk1PTklUT1JFRF9NRVRIT0RTIiwiSURFTVBPVEVOQ1lfS0VZX0hFQURFUiIsInByb2Nlc3MiLCJvbiIsInJlc1BhdGhzIiwidmFsdWVzIiwibWFwIiwiZmlsdGVyIiwiQm9vbGVhbiIsInJlc1BhdGgiLCJpZ24iLCJjYWNoZVJlc3BvbnNlIiwicmVxIiwicmVzIiwicmVzcG9uc2VTdGF0ZUxpc3RlbmVyIiwiRXZlbnRFbWl0dGVyIiwic2V0IiwibWV0aG9kIiwicGF0aCIsInRtcEZpbGUiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJ1dGlsIiwidXVpZFY0IiwicmVzcG9uc2VMaXN0ZW5lciIsImNyZWF0ZVdyaXRlU3RyZWFtIiwiZW1pdENsb3NlIiwib3JpZ2luYWxTb2NrZXRXcml0ZXIiLCJzb2NrZXQiLCJ3cml0ZSIsImJpbmQiLCJwYXRjaGVkV3JpdGVyIiwiY2h1bmsiLCJlbmNvZGluZyIsIm5leHQiLCJ3cml0YWJsZSIsIndyaXRlRXJyb3IiLCJpc1Jlc3BvbnNlRnVsbHlTZW50Iiwib25jZSIsImUiLCJlbmQiLCJoYXMiLCJsb2ciLCJpbmZvIiwiZW1pdCIsIm1lc3NhZ2UiLCJkZWxldGUiLCJnZXQiLCJoYW5kbGVJZGVtcG90ZW5jeSIsImhlYWRlcnMiLCJpbmNsdWRlcyIsImRlYnVnIiwic3RvcmVkTWV0aG9kIiwic3RvcmVkUGF0aCIsIndhcm4iLCJyZXJvdXRlQ2FjaGVkUmVzcG9uc2UiLCJjYWNoZWRSZXNQYXRoIiwiZXhpc3RzIiwiY3JlYXRlUmVhZFN0cmVhbSIsInBpcGUiLCJjYWNoZWRSZXNwb25zZVBhdGgiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXhwcmVzcy9pZGVtcG90ZW5jeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCB7ZnMsIHV0aWx9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcblxuY29uc3QgQ0FDSEVfU0laRSA9IDEwMjQ7XG5jb25zdCBJREVNUE9URU5UX1JFU1BPTlNFUyA9IG5ldyBMUlUoe1xuICBtYXg6IENBQ0hFX1NJWkUsXG4gIHVwZGF0ZUFnZU9uR2V0OiB0cnVlLFxuICBkaXNwb3NlKGtleSwge3Jlc3BvbnNlfSkge1xuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgZnMucmltcmFmU3luYyhyZXNwb25zZSk7XG4gICAgfVxuICB9LFxufSk7XG5jb25zdCBNT05JVE9SRURfTUVUSE9EUyA9IFsnUE9TVCcsICdQQVRDSCddO1xuY29uc3QgSURFTVBPVEVOQ1lfS0VZX0hFQURFUiA9ICd4LWlkZW1wb3RlbmN5LWtleSc7XG5cbnByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gIGNvbnN0IHJlc1BhdGhzID0gWy4uLklERU1QT1RFTlRfUkVTUE9OU0VTLnZhbHVlcygpXS5tYXAoKHtyZXNwb25zZX0pID0+IHJlc3BvbnNlKS5maWx0ZXIoQm9vbGVhbik7XG4gIGZvciAoY29uc3QgcmVzUGF0aCBvZiByZXNQYXRocykge1xuICAgIHRyeSB7XG4gICAgICAvLyBBc3luY2hyb25vdXMgY2FsbHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gb25FeGl0IGhhbmRsZXJcbiAgICAgIGZzLnJpbXJhZlN5bmMocmVzUGF0aCk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG59KTtcblxuZnVuY3Rpb24gY2FjaGVSZXNwb25zZShrZXksIHJlcSwgcmVzKSB7XG4gIGNvbnN0IHJlc3BvbnNlU3RhdGVMaXN0ZW5lciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgSURFTVBPVEVOVF9SRVNQT05TRVMuc2V0KGtleSwge1xuICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICBwYXRoOiByZXEucGF0aCxcbiAgICByZXNwb25zZTogbnVsbCxcbiAgICByZXNwb25zZVN0YXRlTGlzdGVuZXIsXG4gIH0pO1xuICBjb25zdCB0bXBGaWxlID0gcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCBgJHt1dGlsLnV1aWRWNCgpfS5yZXNwb25zZWApO1xuICBjb25zdCByZXNwb25zZUxpc3RlbmVyID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odG1wRmlsZSwge1xuICAgIGVtaXRDbG9zZTogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IG9yaWdpbmFsU29ja2V0V3JpdGVyID0gcmVzLnNvY2tldC53cml0ZS5iaW5kKHJlcy5zb2NrZXQpO1xuICBjb25zdCBwYXRjaGVkV3JpdGVyID0gKGNodW5rLCBlbmNvZGluZywgbmV4dCkgPT4ge1xuICAgIGlmIChyZXNwb25zZUxpc3RlbmVyLndyaXRhYmxlKSB7XG4gICAgICByZXNwb25zZUxpc3RlbmVyLndyaXRlKGNodW5rKTtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbmFsU29ja2V0V3JpdGVyKGNodW5rLCBlbmNvZGluZywgbmV4dCk7XG4gIH07XG4gIHJlcy5zb2NrZXQud3JpdGUgPSBwYXRjaGVkV3JpdGVyO1xuICBsZXQgd3JpdGVFcnJvciA9IG51bGw7XG4gIGxldCBpc1Jlc3BvbnNlRnVsbHlTZW50ID0gZmFsc2U7XG4gIHJlc3BvbnNlTGlzdGVuZXIub25jZSgnZXJyb3InLCAoZSkgPT4ge1xuICAgIHdyaXRlRXJyb3IgPSBlO1xuICB9KTtcbiAgcmVzLm9uY2UoJ2ZpbmlzaCcsICgpID0+IHtcbiAgICBpc1Jlc3BvbnNlRnVsbHlTZW50ID0gdHJ1ZTtcbiAgICByZXNwb25zZUxpc3RlbmVyLmVuZCgpO1xuICB9KTtcbiAgcmVzLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmICghaXNSZXNwb25zZUZ1bGx5U2VudCkge1xuICAgICAgcmVzcG9uc2VMaXN0ZW5lci5lbmQoKTtcbiAgICB9XG4gIH0pO1xuICByZXNwb25zZUxpc3RlbmVyLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmIChyZXMuc29ja2V0Py53cml0ZSA9PT0gcGF0Y2hlZFdyaXRlcikge1xuICAgICAgcmVzLnNvY2tldC53cml0ZSA9IG9yaWdpbmFsU29ja2V0V3JpdGVyO1xuICAgIH1cblxuICAgIGlmICghSURFTVBPVEVOVF9SRVNQT05TRVMuaGFzKGtleSkpIHtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgQ291bGQgbm90IGNhY2hlIHRoZSByZXNwb25zZSBpZGVudGlmaWVkIGJ5ICcke2tleX0nLiBgICtcbiAgICAgICAgICBgQ2FjaGUgY29uc2lzdGVuY3kgaGFzIGJlZW4gZGFtYWdlZGBcbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzcG9uc2VTdGF0ZUxpc3RlbmVyLmVtaXQoJ3JlYWR5JywgbnVsbCk7XG4gICAgfVxuICAgIGlmICh3cml0ZUVycm9yKSB7XG4gICAgICBsb2cuaW5mbyhgQ291bGQgbm90IGNhY2hlIHRoZSByZXNwb25zZSBpZGVudGlmaWVkIGJ5ICcke2tleX0nOiAke3dyaXRlRXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIElERU1QT1RFTlRfUkVTUE9OU0VTLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlU3RhdGVMaXN0ZW5lci5lbWl0KCdyZWFkeScsIG51bGwpO1xuICAgIH1cbiAgICBpZiAoIWlzUmVzcG9uc2VGdWxseVNlbnQpIHtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgQ291bGQgbm90IGNhY2hlIHRoZSByZXNwb25zZSBpZGVudGlmaWVkIGJ5ICcke2tleX0nLCBgICtcbiAgICAgICAgICBgYmVjYXVzZSBpdCBoYXMgbm90IGJlZW4gY29tcGxldGVkYFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKCdEb2VzIHRoZSBjbGllbnQgdGVybWluYXRlIGNvbm5lY3Rpb25zIHRvbyBlYXJseT8nKTtcbiAgICAgIElERU1QT1RFTlRfUkVTUE9OU0VTLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlU3RhdGVMaXN0ZW5lci5lbWl0KCdyZWFkeScsIG51bGwpO1xuICAgIH1cblxuICAgIElERU1QT1RFTlRfUkVTUE9OU0VTLmdldChrZXkpLnJlc3BvbnNlID0gdG1wRmlsZTtcbiAgICByZXNwb25zZVN0YXRlTGlzdGVuZXIuZW1pdCgncmVhZHknLCB0bXBGaWxlKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUlkZW1wb3RlbmN5KHJlcSwgcmVzLCBuZXh0KSB7XG4gIGNvbnN0IGtleSA9IHJlcS5oZWFkZXJzW0lERU1QT1RFTkNZX0tFWV9IRUFERVJdO1xuICBpZiAoIWtleSkge1xuICAgIHJldHVybiBuZXh0KCk7XG4gIH1cbiAgaWYgKCFNT05JVE9SRURfTUVUSE9EUy5pbmNsdWRlcyhyZXEubWV0aG9kKSkge1xuICAgIC8vIEdFVCwgREVMRVRFLCBldGMuIHJlcXVlc3RzIGFyZSBpZGVtcG90ZW50IGJ5IGRlZmF1bHRcbiAgICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGNhY2hlIHRoZW1cbiAgICByZXR1cm4gbmV4dCgpO1xuICB9XG5cbiAgbG9nLmRlYnVnKGBSZXF1ZXN0IGlkZW1wb3RlbmN5IGtleTogJHtrZXl9YCk7XG4gIGlmICghSURFTVBPVEVOVF9SRVNQT05TRVMuaGFzKGtleSkpIHtcbiAgICBjYWNoZVJlc3BvbnNlKGtleSwgcmVxLCByZXMpO1xuICAgIHJldHVybiBuZXh0KCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgbWV0aG9kOiBzdG9yZWRNZXRob2QsXG4gICAgcGF0aDogc3RvcmVkUGF0aCxcbiAgICByZXNwb25zZSxcbiAgICByZXNwb25zZVN0YXRlTGlzdGVuZXIsXG4gIH0gPSBJREVNUE9URU5UX1JFU1BPTlNFUy5nZXQoa2V5KTtcbiAgaWYgKHJlcS5tZXRob2QgIT09IHN0b3JlZE1ldGhvZCB8fCByZXEucGF0aCAhPT0gc3RvcmVkUGF0aCkge1xuICAgIGxvZy53YXJuKGBHb3QgdHdvIGRpZmZlcmVudCByZXF1ZXN0cyB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSAnJHtrZXl9J2ApO1xuICAgIGxvZy53YXJuKCdJcyB0aGUgY2xpZW50IGdlbmVyYXRpbmcgaWRlbXBvdGVuY3kga2V5cyBwcm9wZXJseT8nKTtcbiAgICByZXR1cm4gbmV4dCgpO1xuICB9XG5cbiAgY29uc3QgcmVyb3V0ZUNhY2hlZFJlc3BvbnNlID0gYXN5bmMgKGNhY2hlZFJlc1BhdGgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHMoY2FjaGVkUmVzUGF0aCkpKSB7XG4gICAgICBJREVNUE9URU5UX1JFU1BPTlNFUy5kZWxldGUoa2V5KTtcbiAgICAgIGxvZy53YXJuKGBDb3VsZCBub3QgcmVhZCB0aGUgY2FjaGVkIHJlc3BvbnNlIGlkZW50aWZpZWQgYnkga2V5ICcke2tleX0nYCk7XG4gICAgICBsb2cud2FybignVGhlIHRlbXBvcmFyeSBzdG9yYWdlIGlzIG5vdCBhY2Nlc3NpYmxlIGFueW1vcmUnKTtcbiAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfVxuICAgIGZzLmNyZWF0ZVJlYWRTdHJlYW0oY2FjaGVkUmVzUGF0aCkucGlwZShyZXMuc29ja2V0KTtcbiAgfTtcblxuICBpZiAocmVzcG9uc2UpIHtcbiAgICBsb2cuaW5mbyhgVGhlIHNhbWUgcmVxdWVzdCB3aXRoIHRoZSBpZGVtcG90ZW5jeSBrZXkgJyR7a2V5fScgaGFzIGJlZW4gYWxyZWFkeSBwcm9jZXNzZWRgKTtcbiAgICBsb2cuaW5mbyhgUmVyb3V0aW5nIGl0cyByZXNwb25zZSB0byB0aGUgY3VycmVudCByZXF1ZXN0YCk7XG4gICAgYXdhaXQgcmVyb3V0ZUNhY2hlZFJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbyhgVGhlIHNhbWUgcmVxdWVzdCB3aXRoIHRoZSBpZGVtcG90ZW5jeSBrZXkgJyR7a2V5fScgaXMgYmVpbmcgcHJvY2Vzc2VkYCk7XG4gICAgbG9nLmluZm8oYFdhaXRpbmcgZm9yIHRoZSByZXNwb25zZSB0byBiZSByZXJvdXRlZCB0byB0aGUgY3VycmVudCByZXF1ZXN0YCk7XG4gICAgcmVzcG9uc2VTdGF0ZUxpc3RlbmVyLm9uY2UoJ3JlYWR5JywgYXN5bmMgKGNhY2hlZFJlc3BvbnNlUGF0aCkgPT4ge1xuICAgICAgaWYgKCFjYWNoZWRSZXNwb25zZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJlcm91dGVDYWNoZWRSZXNwb25zZShjYWNoZWRSZXNwb25zZVBhdGgpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7aGFuZGxlSWRlbXBvdGVuY3l9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLFVBQVUsR0FBRyxJQUFuQjtBQUNBLE1BQU1DLG9CQUFvQixHQUFHLElBQUlDLGlCQUFKLENBQVE7RUFDbkNDLEdBQUcsRUFBRUgsVUFEOEI7RUFFbkNJLGNBQWMsRUFBRSxJQUZtQjs7RUFHbkNDLE9BQU8sQ0FBQ0MsR0FBRCxFQUFNO0lBQUNDO0VBQUQsQ0FBTixFQUFrQjtJQUN2QixJQUFJQSxRQUFKLEVBQWM7TUFDWkMsV0FBQSxDQUFHQyxVQUFILENBQWNGLFFBQWQ7SUFDRDtFQUNGOztBQVBrQyxDQUFSLENBQTdCO0FBU0EsTUFBTUcsaUJBQWlCLEdBQUcsQ0FBQyxNQUFELEVBQVMsT0FBVCxDQUExQjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLG1CQUEvQjtBQUVBQyxPQUFPLENBQUNDLEVBQVIsQ0FBVyxNQUFYLEVBQW1CLE1BQU07RUFDdkIsTUFBTUMsUUFBUSxHQUFHLENBQUMsR0FBR2Isb0JBQW9CLENBQUNjLE1BQXJCLEVBQUosRUFBbUNDLEdBQW5DLENBQXVDLENBQUM7SUFBQ1Q7RUFBRCxDQUFELEtBQWdCQSxRQUF2RCxFQUFpRVUsTUFBakUsQ0FBd0VDLE9BQXhF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
|
|
193
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDQUNIRV9TSVpFIiwiSURFTVBPVEVOVF9SRVNQT05TRVMiLCJMUlUiLCJtYXgiLCJ1cGRhdGVBZ2VPbkdldCIsImRpc3Bvc2UiLCJrZXkiLCJyZXNwb25zZSIsImZzIiwicmltcmFmU3luYyIsIk1PTklUT1JFRF9NRVRIT0RTIiwiSURFTVBPVEVOQ1lfS0VZX0hFQURFUiIsInByb2Nlc3MiLCJvbiIsInJlc1BhdGhzIiwidmFsdWVzIiwibWFwIiwiZmlsdGVyIiwiQm9vbGVhbiIsInJlc1BhdGgiLCJpZ24iLCJjYWNoZVJlc3BvbnNlIiwicmVxIiwicmVzIiwicmVzcG9uc2VTdGF0ZUxpc3RlbmVyIiwiRXZlbnRFbWl0dGVyIiwic2V0IiwibWV0aG9kIiwicGF0aCIsInRtcEZpbGUiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJ1dGlsIiwidXVpZFY0IiwicmVzcG9uc2VMaXN0ZW5lciIsImNyZWF0ZVdyaXRlU3RyZWFtIiwiZW1pdENsb3NlIiwib3JpZ2luYWxTb2NrZXRXcml0ZXIiLCJzb2NrZXQiLCJ3cml0ZSIsImJpbmQiLCJwYXRjaGVkV3JpdGVyIiwiY2h1bmsiLCJlbmNvZGluZyIsIm5leHQiLCJ3cml0YWJsZSIsIndyaXRlRXJyb3IiLCJpc1Jlc3BvbnNlRnVsbHlTZW50Iiwib25jZSIsImUiLCJlbmQiLCJoYXMiLCJsb2ciLCJpbmZvIiwiZW1pdCIsIm1lc3NhZ2UiLCJkZWxldGUiLCJnZXQiLCJoYW5kbGVJZGVtcG90ZW5jeSIsImhlYWRlcnMiLCJpbmNsdWRlcyIsImRlYnVnIiwic3RvcmVkTWV0aG9kIiwic3RvcmVkUGF0aCIsIndhcm4iLCJyZXJvdXRlQ2FjaGVkUmVzcG9uc2UiLCJjYWNoZWRSZXNQYXRoIiwiZXhpc3RzIiwiY3JlYXRlUmVhZFN0cmVhbSIsInBpcGUiLCJjYWNoZWRSZXNwb25zZVBhdGgiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXhwcmVzcy9pZGVtcG90ZW5jeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCB7ZnMsIHV0aWx9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcblxuY29uc3QgQ0FDSEVfU0laRSA9IDEwMjQ7XG5jb25zdCBJREVNUE9URU5UX1JFU1BPTlNFUyA9IG5ldyBMUlUoe1xuICBtYXg6IENBQ0hFX1NJWkUsXG4gIHVwZGF0ZUFnZU9uR2V0OiB0cnVlLFxuICBkaXNwb3NlKGtleSwge3Jlc3BvbnNlfSkge1xuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgZnMucmltcmFmU3luYyhyZXNwb25zZSk7XG4gICAgfVxuICB9LFxufSk7XG5jb25zdCBNT05JVE9SRURfTUVUSE9EUyA9IFsnUE9TVCcsICdQQVRDSCddO1xuY29uc3QgSURFTVBPVEVOQ1lfS0VZX0hFQURFUiA9ICd4LWlkZW1wb3RlbmN5LWtleSc7XG5cbnByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gIGNvbnN0IHJlc1BhdGhzID0gWy4uLklERU1QT1RFTlRfUkVTUE9OU0VTLnZhbHVlcygpXS5tYXAoKHtyZXNwb25zZX0pID0+IHJlc3BvbnNlKS5maWx0ZXIoQm9vbGVhbik7XG4gIGZvciAoY29uc3QgcmVzUGF0aCBvZiByZXNQYXRocykge1xuICAgIHRyeSB7XG4gICAgICAvLyBBc3luY2hyb25vdXMgY2FsbHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gb25FeGl0IGhhbmRsZXJcbiAgICAgIGZzLnJpbXJhZlN5bmMocmVzUGF0aCk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG59KTtcblxuZnVuY3Rpb24gY2FjaGVSZXNwb25zZShrZXksIHJlcSwgcmVzKSB7XG4gIGNvbnN0IHJlc3BvbnNlU3RhdGVMaXN0ZW5lciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgSURFTVBPVEVOVF9SRVNQT05TRVMuc2V0KGtleSwge1xuICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICBwYXRoOiByZXEucGF0aCxcbiAgICByZXNwb25zZTogbnVsbCxcbiAgICByZXNwb25zZVN0YXRlTGlzdGVuZXIsXG4gIH0pO1xuICBjb25zdCB0bXBGaWxlID0gcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCBgJHt1dGlsLnV1aWRWNCgpfS5yZXNwb25zZWApO1xuICBjb25zdCByZXNwb25zZUxpc3RlbmVyID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odG1wRmlsZSwge1xuICAgIGVtaXRDbG9zZTogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IG9yaWdpbmFsU29ja2V0V3JpdGVyID0gcmVzLnNvY2tldC53cml0ZS5iaW5kKHJlcy5zb2NrZXQpO1xuICBjb25zdCBwYXRjaGVkV3JpdGVyID0gKGNodW5rLCBlbmNvZGluZywgbmV4dCkgPT4ge1xuICAgIGlmIChyZXNwb25zZUxpc3RlbmVyLndyaXRhYmxlKSB7XG4gICAgICByZXNwb25zZUxpc3RlbmVyLndyaXRlKGNodW5rKTtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbmFsU29ja2V0V3JpdGVyKGNodW5rLCBlbmNvZGluZywgbmV4dCk7XG4gIH07XG4gIHJlcy5zb2NrZXQud3JpdGUgPSBwYXRjaGVkV3JpdGVyO1xuICBsZXQgd3JpdGVFcnJvciA9IG51bGw7XG4gIGxldCBpc1Jlc3BvbnNlRnVsbHlTZW50ID0gZmFsc2U7XG4gIHJlc3BvbnNlTGlzdGVuZXIub25jZSgnZXJyb3InLCAoZSkgPT4ge1xuICAgIHdyaXRlRXJyb3IgPSBlO1xuICB9KTtcbiAgcmVzLm9uY2UoJ2ZpbmlzaCcsICgpID0+IHtcbiAgICBpc1Jlc3BvbnNlRnVsbHlTZW50ID0gdHJ1ZTtcbiAgICByZXNwb25zZUxpc3RlbmVyLmVuZCgpO1xuICB9KTtcbiAgcmVzLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmICghaXNSZXNwb25zZUZ1bGx5U2VudCkge1xuICAgICAgcmVzcG9uc2VMaXN0ZW5lci5lbmQoKTtcbiAgICB9XG4gIH0pO1xuICByZXNwb25zZUxpc3RlbmVyLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmIChyZXMuc29ja2V0Py53cml0ZSA9PT0gcGF0Y2hlZFdyaXRlcikge1xuICAgICAgcmVzLnNvY2tldC53cml0ZSA9IG9yaWdpbmFsU29ja2V0V3JpdGVyO1xuICAgIH1cblxuICAgIGlmICghSURFTVBPVEVOVF9SRVNQT05TRVMuaGFzKGtleSkpIHtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgQ291bGQgbm90IGNhY2hlIHRoZSByZXNwb25zZSBpZGVudGlmaWVkIGJ5ICcke2tleX0nLiBgICtcbiAgICAgICAgICBgQ2FjaGUgY29uc2lzdGVuY3kgaGFzIGJlZW4gZGFtYWdlZGBcbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzcG9uc2VTdGF0ZUxpc3RlbmVyLmVtaXQoJ3JlYWR5JywgbnVsbCk7XG4gICAgfVxuICAgIGlmICh3cml0ZUVycm9yKSB7XG4gICAgICBsb2cuaW5mbyhgQ291bGQgbm90IGNhY2hlIHRoZSByZXNwb25zZSBpZGVudGlmaWVkIGJ5ICcke2tleX0nOiAke3dyaXRlRXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIElERU1QT1RFTlRfUkVTUE9OU0VTLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlU3RhdGVMaXN0ZW5lci5lbWl0KCdyZWFkeScsIG51bGwpO1xuICAgIH1cbiAgICBpZiAoIWlzUmVzcG9uc2VGdWxseVNlbnQpIHtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgQ291bGQgbm90IGNhY2hlIHRoZSByZXNwb25zZSBpZGVudGlmaWVkIGJ5ICcke2tleX0nLCBgICtcbiAgICAgICAgICBgYmVjYXVzZSBpdCBoYXMgbm90IGJlZW4gY29tcGxldGVkYFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKCdEb2VzIHRoZSBjbGllbnQgdGVybWluYXRlIGNvbm5lY3Rpb25zIHRvbyBlYXJseT8nKTtcbiAgICAgIElERU1QT1RFTlRfUkVTUE9OU0VTLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlU3RhdGVMaXN0ZW5lci5lbWl0KCdyZWFkeScsIG51bGwpO1xuICAgIH1cblxuICAgIElERU1QT1RFTlRfUkVTUE9OU0VTLmdldChrZXkpLnJlc3BvbnNlID0gdG1wRmlsZTtcbiAgICByZXNwb25zZVN0YXRlTGlzdGVuZXIuZW1pdCgncmVhZHknLCB0bXBGaWxlKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUlkZW1wb3RlbmN5KHJlcSwgcmVzLCBuZXh0KSB7XG4gIGNvbnN0IGtleSA9IHJlcS5oZWFkZXJzW0lERU1QT1RFTkNZX0tFWV9IRUFERVJdO1xuICBpZiAoIWtleSkge1xuICAgIHJldHVybiBuZXh0KCk7XG4gIH1cbiAgaWYgKCFNT05JVE9SRURfTUVUSE9EUy5pbmNsdWRlcyhyZXEubWV0aG9kKSkge1xuICAgIC8vIEdFVCwgREVMRVRFLCBldGMuIHJlcXVlc3RzIGFyZSBpZGVtcG90ZW50IGJ5IGRlZmF1bHRcbiAgICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGNhY2hlIHRoZW1cbiAgICByZXR1cm4gbmV4dCgpO1xuICB9XG5cbiAgbG9nLmRlYnVnKGBSZXF1ZXN0IGlkZW1wb3RlbmN5IGtleTogJHtrZXl9YCk7XG4gIGlmICghSURFTVBPVEVOVF9SRVNQT05TRVMuaGFzKGtleSkpIHtcbiAgICBjYWNoZVJlc3BvbnNlKGtleSwgcmVxLCByZXMpO1xuICAgIHJldHVybiBuZXh0KCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgbWV0aG9kOiBzdG9yZWRNZXRob2QsXG4gICAgcGF0aDogc3RvcmVkUGF0aCxcbiAgICByZXNwb25zZSxcbiAgICByZXNwb25zZVN0YXRlTGlzdGVuZXIsXG4gIH0gPSBJREVNUE9URU5UX1JFU1BPTlNFUy5nZXQoa2V5KTtcbiAgaWYgKHJlcS5tZXRob2QgIT09IHN0b3JlZE1ldGhvZCB8fCByZXEucGF0aCAhPT0gc3RvcmVkUGF0aCkge1xuICAgIGxvZy53YXJuKGBHb3QgdHdvIGRpZmZlcmVudCByZXF1ZXN0cyB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSAnJHtrZXl9J2ApO1xuICAgIGxvZy53YXJuKCdJcyB0aGUgY2xpZW50IGdlbmVyYXRpbmcgaWRlbXBvdGVuY3kga2V5cyBwcm9wZXJseT8nKTtcbiAgICByZXR1cm4gbmV4dCgpO1xuICB9XG5cbiAgY29uc3QgcmVyb3V0ZUNhY2hlZFJlc3BvbnNlID0gYXN5bmMgKGNhY2hlZFJlc1BhdGgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHMoY2FjaGVkUmVzUGF0aCkpKSB7XG4gICAgICBJREVNUE9URU5UX1JFU1BPTlNFUy5kZWxldGUoa2V5KTtcbiAgICAgIGxvZy53YXJuKGBDb3VsZCBub3QgcmVhZCB0aGUgY2FjaGVkIHJlc3BvbnNlIGlkZW50aWZpZWQgYnkga2V5ICcke2tleX0nYCk7XG4gICAgICBsb2cud2FybignVGhlIHRlbXBvcmFyeSBzdG9yYWdlIGlzIG5vdCBhY2Nlc3NpYmxlIGFueW1vcmUnKTtcbiAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfVxuICAgIGZzLmNyZWF0ZVJlYWRTdHJlYW0oY2FjaGVkUmVzUGF0aCkucGlwZShyZXMuc29ja2V0KTtcbiAgfTtcblxuICBpZiAocmVzcG9uc2UpIHtcbiAgICBsb2cuaW5mbyhgVGhlIHNhbWUgcmVxdWVzdCB3aXRoIHRoZSBpZGVtcG90ZW5jeSBrZXkgJyR7a2V5fScgaGFzIGJlZW4gYWxyZWFkeSBwcm9jZXNzZWRgKTtcbiAgICBsb2cuaW5mbyhgUmVyb3V0aW5nIGl0cyByZXNwb25zZSB0byB0aGUgY3VycmVudCByZXF1ZXN0YCk7XG4gICAgYXdhaXQgcmVyb3V0ZUNhY2hlZFJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbyhgVGhlIHNhbWUgcmVxdWVzdCB3aXRoIHRoZSBpZGVtcG90ZW5jeSBrZXkgJyR7a2V5fScgaXMgYmVpbmcgcHJvY2Vzc2VkYCk7XG4gICAgbG9nLmluZm8oYFdhaXRpbmcgZm9yIHRoZSByZXNwb25zZSB0byBiZSByZXJvdXRlZCB0byB0aGUgY3VycmVudCByZXF1ZXN0YCk7XG4gICAgcmVzcG9uc2VTdGF0ZUxpc3RlbmVyLm9uY2UoJ3JlYWR5JywgYXN5bmMgKGNhY2hlZFJlc3BvbnNlUGF0aCkgPT4ge1xuICAgICAgaWYgKCFjYWNoZWRSZXNwb25zZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJlcm91dGVDYWNoZWRSZXNwb25zZShjYWNoZWRSZXNwb25zZVBhdGgpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7aGFuZGxlSWRlbXBvdGVuY3l9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFVBQVUsR0FBRyxJQUFuQjtBQUNBLE1BQU1DLG9CQUFvQixHQUFHLElBQUlDLGlCQUFKLENBQVE7RUFDbkNDLEdBQUcsRUFBRUgsVUFEOEI7RUFFbkNJLGNBQWMsRUFBRSxJQUZtQjs7RUFHbkNDLE9BQU8sQ0FBQ0MsR0FBRCxFQUFNO0lBQUNDO0VBQUQsQ0FBTixFQUFrQjtJQUN2QixJQUFJQSxRQUFKLEVBQWM7TUFDWkMsV0FBQSxDQUFHQyxVQUFILENBQWNGLFFBQWQ7SUFDRDtFQUNGOztBQVBrQyxDQUFSLENBQTdCO0FBU0EsTUFBTUcsaUJBQWlCLEdBQUcsQ0FBQyxNQUFELEVBQVMsT0FBVCxDQUExQjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLG1CQUEvQjtBQUVBQyxPQUFPLENBQUNDLEVBQVIsQ0FBVyxNQUFYLEVBQW1CLE1BQU07RUFDdkIsTUFBTUMsUUFBUSxHQUFHLENBQUMsR0FBR2Isb0JBQW9CLENBQUNjLE1BQXJCLEVBQUosRUFBbUNDLEdBQW5DLENBQXVDLENBQUM7SUFBQ1Q7RUFBRCxDQUFELEtBQWdCQSxRQUF2RCxFQUFpRVUsTUFBakUsQ0FBd0VDLE9BQXhF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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.js","names":["CACHE_SIZE","IDEMPOTENT_RESPONSES","LRU","max","updateAgeOnGet","dispose","key","response","fs","rimrafSync","MONITORED_METHODS","IDEMPOTENCY_KEY_HEADER","process","on","resPaths","values","map","filter","Boolean","resPath","ign","cacheResponse","req","res","responseStateListener","EventEmitter","set","method","path","tmpFile","resolve","os","tmpdir","util","uuidV4","responseListener","createWriteStream","emitClose","originalSocketWriter","socket","write","bind","patchedWriter","chunk","encoding","next","writable","writeError","isResponseFullySent","once","e","end","has","log","info","emit","message","delete","get","handleIdempotency","headers","includes","debug","storedMethod","storedPath","warn","rerouteCachedResponse","cachedResPath","exists","createReadStream","pipe","cachedResponsePath"],"sources":["../../../lib/express/idempotency.js"],"sourcesContent":["import log from './logger';\nimport LRU from 'lru-cache';\nimport {fs, util} from '@appium/support';\nimport os from 'os';\nimport path from 'path';\nimport {EventEmitter} from 'events';\n\nconst CACHE_SIZE = 1024;\nconst IDEMPOTENT_RESPONSES = new LRU({\n max: CACHE_SIZE,\n updateAgeOnGet: true,\n dispose(key, {response}) {\n if (response) {\n fs.rimrafSync(response);\n }\n },\n});\nconst MONITORED_METHODS = ['POST', 'PATCH'];\nconst IDEMPOTENCY_KEY_HEADER = 'x-idempotency-key';\n\nprocess.on('exit', () => {\n const resPaths = [...IDEMPOTENT_RESPONSES.values()].map(({response}) => response).filter(Boolean);\n for (const resPath of resPaths) {\n try {\n // Asynchronous calls are not supported in onExit handler\n fs.rimrafSync(resPath);\n } catch (ign) {}\n }\n});\n\nfunction cacheResponse(key, req, res) {\n const responseStateListener = new EventEmitter();\n IDEMPOTENT_RESPONSES.set(key, {\n method: req.method,\n path: req.path,\n response: null,\n responseStateListener,\n });\n const tmpFile = path.resolve(os.tmpdir(), `${util.uuidV4()}.response`);\n const responseListener = fs.createWriteStream(tmpFile, {\n emitClose: true,\n });\n const originalSocketWriter = res.socket.write.bind(res.socket);\n const patchedWriter = (chunk, encoding, next) => {\n if (responseListener.writable) {\n responseListener.write(chunk);\n }\n return originalSocketWriter(chunk, encoding, next);\n };\n res.socket.write = patchedWriter;\n let writeError = null;\n let isResponseFullySent = false;\n responseListener.once('error', (e) => {\n writeError = e;\n });\n res.once('finish', () => {\n isResponseFullySent = true;\n responseListener.end();\n });\n res.once('close', () => {\n if (!isResponseFullySent) {\n responseListener.end();\n }\n });\n responseListener.once('close', () => {\n if (res.socket?.write === patchedWriter) {\n res.socket.write = originalSocketWriter;\n }\n\n if (!IDEMPOTENT_RESPONSES.has(key)) {\n log.info(\n `Could not cache the response identified by '${key}'. ` +\n `Cache consistency has been damaged`\n );\n return responseStateListener.emit('ready', null);\n }\n if (writeError) {\n log.info(`Could not cache the response identified by '${key}': ${writeError.message}`);\n IDEMPOTENT_RESPONSES.delete(key);\n return responseStateListener.emit('ready', null);\n }\n if (!isResponseFullySent) {\n log.info(\n `Could not cache the response identified by '${key}', ` +\n `because it has not been completed`\n );\n log.info('Does the client terminate connections too early?');\n IDEMPOTENT_RESPONSES.delete(key);\n return responseStateListener.emit('ready', null);\n }\n\n IDEMPOTENT_RESPONSES.get(key).response = tmpFile;\n responseStateListener.emit('ready', tmpFile);\n });\n}\n\nasync function handleIdempotency(req, res, next) {\n const key = req.headers[IDEMPOTENCY_KEY_HEADER];\n if (!key) {\n return next();\n }\n if (!MONITORED_METHODS.includes(req.method)) {\n // GET, DELETE, etc. requests are idempotent by default\n // there is no need to cache them\n return next();\n }\n\n log.debug(`Request idempotency key: ${key}`);\n if (!IDEMPOTENT_RESPONSES.has(key)) {\n cacheResponse(key, req, res);\n return next();\n }\n\n const {\n method: storedMethod,\n path: storedPath,\n response,\n responseStateListener,\n } = IDEMPOTENT_RESPONSES.get(key);\n if (req.method !== storedMethod || req.path !== storedPath) {\n log.warn(`Got two different requests with the same idempotency key '${key}'`);\n log.warn('Is the client generating idempotency keys properly?');\n return next();\n }\n\n const rerouteCachedResponse = async (cachedResPath) => {\n if (!(await fs.exists(cachedResPath))) {\n IDEMPOTENT_RESPONSES.delete(key);\n log.warn(`Could not read the cached response identified by key '${key}'`);\n log.warn('The temporary storage is not accessible anymore');\n return next();\n }\n fs.createReadStream(cachedResPath).pipe(res.socket);\n };\n\n if (response) {\n log.info(`The same request with the idempotency key '${key}' has been already processed`);\n log.info(`Rerouting its response to the current request`);\n await rerouteCachedResponse(response);\n } else {\n log.info(`The same request with the idempotency key '${key}' is being processed`);\n log.info(`Waiting for the response to be rerouted to the current request`);\n responseStateListener.once('ready', async (cachedResponsePath) => {\n if (!cachedResponsePath) {\n return next();\n }\n await rerouteCachedResponse(cachedResponsePath);\n });\n }\n}\n\nexport {handleIdempotency};\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","names":["log","logger","getLogger"],"sources":["../../../lib/express/logger.js"],"sourcesContent":["import {logger} from '@appium/support';\n\nconst log = logger.getLogger('HTTP');\nexport default log;\n"],"mappings":";;;;;;;;;AAAA;;AAEA,MAAMA,GAAG,GAAGC,eAAA,CAAOC,SAAP,CAAiB,MAAjB,CAAZ;;eACeF,G"}
|