@booxood/mocker-api
Version:
This is dev support mock RESTful API.
253 lines (206 loc) • 36.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _default;
var _path = _interopRequireDefault(require("path"));
var toRegexp = _interopRequireWildcard(require("path-to-regexp"));
var _clearModule = _interopRequireDefault(require("clear-module"));
var _chokidar = _interopRequireDefault(require("chokidar"));
var _safe = _interopRequireDefault(require("colors-cli/safe"));
var _proxyHandle = require("./proxyHandle");
var _mockerHandle = require("./mockerHandle");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const pathToRegexp = toRegexp.pathToRegexp;
let mocker = {};
const watchedFilePaths = [];
function _default(app, watchFile, conf = {}) {
const watchFiles = (Array.isArray(watchFile) ? watchFile : typeof watchFile === 'string' ? [watchFile] : []).map(str => _path.default.resolve(str));
if (watchFiles.some(file => !file)) {
throw new Error('Mocker file does not exist!.');
}
/**
* Mybe watch file or pass parameters
* https://github.com/jaywcjlove/mocker-api/issues/116
*/
const isWatchFilePath = Array.isArray(watchFile) && watchFile.every(val => typeof val === 'string') || typeof watchFile === 'string';
mocker = isWatchFilePath ? getConfig() : watchFile;
if (!mocker) {
return (req, res, next) => {
next();
};
}
let options = { ...conf,
...(mocker._proxy || {})
};
const defaultOptions = {
changeHost: true,
pathRewrite: {},
proxy: {},
// proxy: proxyConf: {},
httpProxy: {},
// httpProxy: httpProxyConf: {},
bodyParserConf: {},
bodyParserJSON: {},
bodyParserText: {},
bodyParserRaw: {},
bodyParserUrlencoded: {},
watchOptions: {},
header: {},
priority: 'proxy',
withFullUrlPath: false
};
options = { ...defaultOptions,
...options
}; // changeHost = true,
// pathRewrite = {},
// proxy: proxyConf = {},
// httpProxy: httpProxyConf = {},
// bodyParserConf= {},
// bodyParserJSON = {},
// bodyParserText = {},
// bodyParserRaw = {},
// bodyParserUrlencoded = {},
// watchOptions = {},
// header = {}
if (isWatchFilePath) {
// 监听配置入口文件所在的目录,一般为认为在配置文件/mock 目录下的所有文件
// 加上require.resolve,保证 `./mock/`能够找到`./mock/index.js`,要不然就要监控到上一级目录了
// const watcher = chokidar.watch(watchFiles.map(watchFile => PATH.dirname(require.resolve(watchFile))), options.watchOptions);
const watcher = _chokidar.default.watch(watchFiles, options.watchOptions);
watcher.on('all', (event, path) => {
if (event === 'change' || event === 'add') {
if (watchedFilePaths.indexOf(path) < 0) watchedFilePaths.push(path);
try {
// 当监听的可能是多个配置文件时,需要清理掉更新文件以及入口文件的缓存,重新获取
cleanCache(path); // watchFiles.forEach(file => cleanCache(file));
mocker = getConfig();
if (mocker._proxy) {
options = { ...options,
...mocker._proxy
};
}
console.log(`${_safe.default.green_b.black(' Done: ')} Hot Mocker ${_safe.default.green(path.replace(process.cwd(), ''))} file replacement success!`);
} catch (ex) {
console.error(`${_safe.default.red_b.black(' Failed: ')} Hot Mocker ${_safe.default.red(path.replace(process.cwd(), ''))} file replacement failed!!`);
}
} else if (event === 'unlink') {
if (watchedFilePaths.indexOf(path) >= 0) watchedFilePaths.splice(watchedFilePaths.indexOf(path));
try {
mocker = getConfig();
if (mocker._proxy) {
options = { ...options,
...mocker._proxy
};
}
console.log(`${_safe.default.green_b.black(' Done: ')} Hot Mocker ${_safe.default.green(path.replace(process.cwd(), ''))} file remove success!`);
} catch (ex) {
console.error(`${_safe.default.red_b.black(' Failed: ')} Hot Mocker ${_safe.default.red(path.replace(process.cwd(), ''))} file remove failed!!`);
}
}
});
} // 监听文件修改重新加载代码
// 配置热更新
app.all('/*', (req, res, next) => {
const getExecUrlPath = req => {
return options.withFullUrlPath ? req.url : req.path;
};
/**
* Get Proxy key
*/
const proxyKey = Object.keys(options.proxy).find(kname => {
return !!pathToRegexp(kname.replace(new RegExp('^' + req.method + ' '), '')).exec(getExecUrlPath(req));
});
/**
* Get Mocker key
* => `GET /api/:owner/:repo/raw/:ref`
* => `GET /api/:owner/:repo/raw/:ref/(.*)`
*/
const mockerKey = Object.keys(mocker).find(kname => {
return !!pathToRegexp(kname.replace(new RegExp('^' + req.method + ' '), '')).exec(getExecUrlPath(req));
});
/**
* Access Control Allow options.
* https://github.com/jaywcjlove/mocker-api/issues/61
*/
const accessOptions = {
'Access-Control-Allow-Origin': req.get('Origin') || '*',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers': 'Content-Type, X-Requested-With,' + (req.header('access-control-request-headers') || ''),
'Access-Control-Allow-Credentials': 'true',
...options.header
};
Object.keys(accessOptions).forEach(keyName => {
res.setHeader(keyName, accessOptions[keyName]);
}); // fix issue 34 https://github.com/jaywcjlove/mocker-api/issues/34
// In some cross-origin http request, the browser will send the preflighted options request before sending the request methods written in the code.
if (!mockerKey && req.method.toLocaleUpperCase() === 'OPTIONS' && Object.keys(mocker).find(kname => !!pathToRegexp(kname.replace(new RegExp('^(PUT|POST|GET|DELETE) '), '')).exec(getExecUrlPath(req)))) {
return res.sendStatus(200);
}
/**
* priority 'proxy' or 'mocker' [#151](https://github.com/jaywcjlove/mocker-api/issues/151)
*/
if (options.priority === 'mocker') {
if (mocker[mockerKey]) {
return (0, _mockerHandle.mockerHandle)({
req,
res,
next,
mocker,
options,
mockerKey
});
} else if (proxyKey && options.proxy[proxyKey]) {
return (0, _proxyHandle.proxyHandle)(req, res, options, proxyKey);
}
} else {
if (proxyKey && options.proxy[proxyKey]) {
return (0, _proxyHandle.proxyHandle)(req, res, options, proxyKey);
} else if (mocker[mockerKey]) {
return (0, _mockerHandle.mockerHandle)({
req,
res,
next,
mocker,
options,
mockerKey
});
}
}
next();
});
/**
* The old module's resources to be released.
* @param modulePath
*/
function cleanCache(modulePath) {
// The entry file does not have a .js suffix,
// causing the module's resources not to be released.
// https://github.com/jaywcjlove/webpack-api-mocker/issues/30
try {
modulePath = require.resolve(modulePath);
} catch (e) {}
var module = require.cache[modulePath];
if (!module) return; // remove reference in module.parent
if (module.parent) {
module.parent.children.splice(module.parent.children.indexOf(module), 1);
} // https://github.com/jaywcjlove/mocker-api/issues/42
(0, _clearModule.default)(modulePath);
}
/**
* Merge multiple Mockers
*/
function getConfig() {
return watchedFilePaths.reduce((mocker, file) => {
const mockerItem = require(file);
return Object.assign(mocker, mockerItem.default ? mockerItem.default : mockerItem);
}, {});
}
return (req, res, next) => {
next();
};
}
module.exports = exports.default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJwYXRoVG9SZWdleHAiLCJ0b1JlZ2V4cCIsIm1vY2tlciIsIndhdGNoZWRGaWxlUGF0aHMiLCJhcHAiLCJ3YXRjaEZpbGUiLCJjb25mIiwid2F0Y2hGaWxlcyIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsInN0ciIsIlBBVEgiLCJyZXNvbHZlIiwic29tZSIsImZpbGUiLCJFcnJvciIsImlzV2F0Y2hGaWxlUGF0aCIsImV2ZXJ5IiwidmFsIiwiZ2V0Q29uZmlnIiwicmVxIiwicmVzIiwibmV4dCIsIm9wdGlvbnMiLCJfcHJveHkiLCJkZWZhdWx0T3B0aW9ucyIsImNoYW5nZUhvc3QiLCJwYXRoUmV3cml0ZSIsInByb3h5IiwiaHR0cFByb3h5IiwiYm9keVBhcnNlckNvbmYiLCJib2R5UGFyc2VySlNPTiIsImJvZHlQYXJzZXJUZXh0IiwiYm9keVBhcnNlclJhdyIsImJvZHlQYXJzZXJVcmxlbmNvZGVkIiwid2F0Y2hPcHRpb25zIiwiaGVhZGVyIiwicHJpb3JpdHkiLCJ3aXRoRnVsbFVybFBhdGgiLCJ3YXRjaGVyIiwiY2hva2lkYXIiLCJ3YXRjaCIsIm9uIiwiZXZlbnQiLCJwYXRoIiwiaW5kZXhPZiIsInB1c2giLCJjbGVhbkNhY2hlIiwiY29uc29sZSIsImxvZyIsImNvbG9yIiwiZ3JlZW5fYiIsImJsYWNrIiwiZ3JlZW4iLCJyZXBsYWNlIiwicHJvY2VzcyIsImN3ZCIsImV4IiwiZXJyb3IiLCJyZWRfYiIsInJlZCIsInNwbGljZSIsImFsbCIsImdldEV4ZWNVcmxQYXRoIiwidXJsIiwicHJveHlLZXkiLCJPYmplY3QiLCJrZXlzIiwiZmluZCIsImtuYW1lIiwiUmVnRXhwIiwibWV0aG9kIiwiZXhlYyIsIm1vY2tlcktleSIsImFjY2Vzc09wdGlvbnMiLCJnZXQiLCJmb3JFYWNoIiwia2V5TmFtZSIsInNldEhlYWRlciIsInRvTG9jYWxlVXBwZXJDYXNlIiwic2VuZFN0YXR1cyIsIm1vZHVsZVBhdGgiLCJyZXF1aXJlIiwiZSIsIm1vZHVsZSIsImNhY2hlIiwicGFyZW50IiwiY2hpbGRyZW4iLCJyZWR1Y2UiLCJtb2NrZXJJdGVtIiwiYXNzaWduIiwiZGVmYXVsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQU1BOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OztBQThLQSxNQUFNQSxZQUFZLEdBQUdDLFFBQVEsQ0FBQ0QsWUFBOUI7QUFDQSxJQUFJRSxNQUF3QixHQUFHLEVBQS9CO0FBQ0EsTUFBTUMsZ0JBQTBCLEdBQUcsRUFBbkM7O0FBRWUsa0JBQVVDLEdBQVYsRUFBNEJDLFNBQTVCLEVBQTZFQyxJQUFrQixHQUFHLEVBQWxHLEVBQXNHO0FBQ25ILFFBQU1DLFVBQVUsR0FBRyxDQUFDQyxLQUFLLENBQUNDLE9BQU4sQ0FBY0osU0FBZCxJQUEyQkEsU0FBM0IsR0FBdUMsT0FBT0EsU0FBUCxLQUFxQixRQUFyQixHQUFnQyxDQUFDQSxTQUFELENBQWhDLEdBQThDLEVBQXRGLEVBQTBGSyxHQUExRixDQUE4RkMsR0FBRyxJQUFJQyxjQUFLQyxPQUFMLENBQWFGLEdBQWIsQ0FBckcsQ0FBbkI7O0FBRUEsTUFBSUosVUFBVSxDQUFDTyxJQUFYLENBQWdCQyxJQUFJLElBQUksQ0FBQ0EsSUFBekIsQ0FBSixFQUFvQztBQUNsQyxVQUFNLElBQUlDLEtBQUosQ0FBVSw4QkFBVixDQUFOO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTs7O0FBQ0UsUUFBTUMsZUFBZSxHQUFJVCxLQUFLLENBQUNDLE9BQU4sQ0FBY0osU0FBZCxLQUE0QkEsU0FBUyxDQUFDYSxLQUFWLENBQWdCQyxHQUFHLElBQUksT0FBT0EsR0FBUCxLQUFlLFFBQXRDLENBQTdCLElBQWlGLE9BQU9kLFNBQVAsS0FBcUIsUUFBOUg7QUFDQUgsRUFBQUEsTUFBTSxHQUFHZSxlQUFlLEdBQUdHLFNBQVMsRUFBWixHQUFpQmYsU0FBekM7O0FBRUEsTUFBSSxDQUFDSCxNQUFMLEVBQWE7QUFDWCxXQUFPLENBQUNtQixHQUFE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Q0EsYUFBT29ELE1BQU0sQ0FBQ3dCLE1BQVAsQ0FBY3pGLE1BQWQsRUFBc0J3RixVQUFVLENBQUNFLE9BQVgsR0FBcUJGLFVBQVUsQ0FBQ0UsT0FBaEMsR0FBMENGLFVBQWhFLENBQVA7QUFDRCxLQUhNLEVBR0osRUFISSxDQUFQO0FBSUQ7O0FBQ0QsU0FBTyxDQUFDckUsR0FBRCxFQUFlQyxHQUFmLEVBQThCQyxJQUE5QixLQUFxRDtBQUMxREEsSUFBQUEsSUFBSTtBQUNMLEdBRkQ7QUFHRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBVUkwgZnJvbSAndXJsJztcbmltcG9ydCBQQVRIIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgbmV0IGZyb20gXCJuZXRcIjtcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSBcImh0dHBcIjtcbmltcG9ydCB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24sIEFwcGxpY2F0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgYm9keVBhcnNlciBmcm9tICdib2R5LXBhcnNlcic7XG5pbXBvcnQgaHR0cFByb3h5IGZyb20gJ2h0dHAtcHJveHknO1xuaW1wb3J0ICogYXMgdG9SZWdleHAgZnJvbSAncGF0aC10by1yZWdleHAnO1xuaW1wb3J0IGNsZWFyTW9kdWxlIGZyb20gJ2NsZWFyLW1vZHVsZSc7XG5pbXBvcnQgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInO1xuaW1wb3J0IGNvbG9yIGZyb20gJ2NvbG9ycy1jbGkvc2FmZSc7XG5pbXBvcnQgeyBwcm94eUhhbmRsZSB9IGZyb20gJy4vcHJveHlIYW5kbGUnO1xuaW1wb3J0IHsgbW9ja2VySGFuZGxlIH0gZnJvbSAnLi9tb2NrZXJIYW5kbGUnO1xuXG5leHBvcnQgdHlwZSBQcm94eVRhcmdldFVybCA9IHN0cmluZyB8IFBhcnRpYWw8VVJMLlVybD47XG5leHBvcnQgdHlwZSBNb2NrZXJSZXN1bHRGdW5jdGlvbiA9ICgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0PzogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkKTtcbmV4cG9ydCB0eXBlIE1vY2tlclJlc3VsdCA9IHN0cmluZyB8IG51bWJlcnwgQXJyYXk8YW55PiB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBNb2NrZXJSZXN1bHRGdW5jdGlvbjtcblxuLyoqXG4gKiBTZXR0aW5nIGEgcHJveHkgcm91dGVyLlxuICogQGV4YW1wbGVcbiAqIFxuICogYGBganNvblxuICoge1xuICogICAnL2FwaS91c2VyJzoge1xuICogICAgIGlkOiAxLFxuICogICAgIHVzZXJuYW1lOiAna2VubnknLFxuICogICAgIHNleDogNlxuICogICB9LFxuICogICAnREVMRVRFIC9hcGkvdXNlci86aWQnOiAocmVxLCByZXMpID0+IHtcbiAqICAgICByZXMuc2VuZCh7IHN0YXR1czogJ29rJywgbWVzc2FnZTogJ+WIoOmZpOaIkOWKn++8gScgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBNb2NrZXJQcm94eVJvdXRlID0gUmVjb3JkPHN0cmluZywgTW9ja2VyUmVzdWx0PiAmIHtcbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIG9wdGlvbiBwYXJhbWV0ZXIgc2V0dGluZyBmb3IgYXBpTW9ja2VyXG4gICAqIFByaW9yaXR5IHByb2Nlc3NpbmcuXG4gICAqIGFwaU1vY2tlcihhcHAsIHBhdGgsIG9wdGlvbilcbiAgICoge0BsaW5rIE1vY2tlck9wdGlvbn1cbiAgICovXG4gIF9wcm94eT86IE1vY2tlck9wdGlvbjtcbn1cblxuLyoqXG4gKiBMaXN0ZW5pbmcgZm9yIHByb3h5IGV2ZW50cy4gIFxuICogVGhpcyBvcHRpb25zIGNvbnRhaW5zIGxpc3RlbmVycyBmb3IgW25vZGUtaHR0cC1wcm94eV0oaHR0cHM6Ly9naXRodWIuY29tL2h0dHAtcGFydHkvbm9kZS1odHRwLXByb3h5I2xpc3RlbmluZy1mb3ItcHJveHktZXZlbnRzKS5cbiAqIHt0eXBlb2YgaHR0cFByb3h5Lm9ufVxuICoge0BsaW5rIGh0dHBQcm94eX1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwUHJveHlMaXN0ZW5lcnMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgc3RhcnQ/OiAoXG4gICAgcmVxOiBodHRwLkluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsXG4gICAgdGFyZ2V0OiBQcm94eVRhcmdldFVybFxuICApID0+IHZvaWQ7XG4gIHByb3h5UmVxPzogKFxuICAgIHByb3h5UmVxOiBodHRwLkNsaWVudFJlcXVlc3QsXG4gICAgcmVxOiBodHRwLkluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsXG4gICAgb3B0aW9uczogaHR0cFByb3h5LlNlcnZlck9wdGlvbnNcbiAgKSA9PiB2b2lkO1xuICBwcm94eVJlcz86IChcbiAgICBwcm94eVJlczogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVxOiBodHRwLkluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2VcbiAgKSA9PiB2b2lkO1xuICBwcm94eVJlcVdzPzogKFxuICAgIHByb3h5UmVxOiBodHRwLkNsaWVudFJlcXVlc3QsXG4gICAgcmVxOiBodHRwLkluY29taW5nTWVzc2FnZSxcbiAgICBzb2NrZXQ6IG5ldC5Tb2NrZXQsXG4gICAgb3B0aW9uczogaHR0cFByb3h5LlNlcnZlck9wdGlvbnMsXG4gICAgaGVhZDogYW55XG4gICkgPT4gdm9pZDtcbiAgZWNvbm5yZXNldD86IChcbiAgICBlcnI6IEVycm9yLFxuICAgIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlLFxuICAgIHRhcmdldDogUHJveHlUYXJnZXRVcmxcbiAgKSA9PiB2b2lkXG4gIGVuZD86IChcbiAgICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSxcbiAgICBwcm94eVJlczogaHR0cC5JbmNvbWluZ01lc3NhZ2VcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhpcyBldmVudCBpcyBlbWl0dGVkIG9uY2UgdGhlIHByb3h5IHdlYnNvY2tldCB3YXMgY2xvc2VkLlxuICAgKi9cbiAgY2xvc2U/OiAoXG4gICAgcHJveHlSZXM6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICAgIHByb3h5U29ja2V0OiBuZXQuU29ja2V0LFxuICAgIHByb3h5SGVhZDogYW55XG4gICkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2NrZXJPcHRpb24ge1xuICAvKipcbiAgICogcHJpb3JpdHkgJ3Byb3h5JyBvciAnbW9ja2VyJ1xuICAgKiBAZGVmYXVsdCBgcHJveHlgXG4gICAqIEBpc3N1ZSBbIzE1MV0oaHR0cHM6Ly9naXRodWIuY29tL2pheXdjamxvdmUvbW9ja2VyLWFwaS9pc3N1ZXMvMTUxKVxuICAgKi9cbiAgcHJpb3JpdHk/OiAncHJveHknIHwgJ21vY2tlcic7XG4gIC8qKlxuICAgKiBgQm9vbGVhbmAgU2V0dGluZyByZXEgaGVhZGVycyBob3N0LlxuICAgKi9cbiAgY2hhbmdlSG9zdD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiByZXdyaXRlIHRhcmdldCdzIHVybCBwYXRoLiBcbiAgICogT2JqZWN0LWtleXMgd2lsbCBiZSB1c2VkIGFzIFJlZ0V4cCB0byBtYXRjaCBwYXRocy4gWyM2Ml0oaHR0cHM6Ly9naXRodWIuY29tL2pheXdjamxvdmUvbW9ja2VyLWFwaS9pc3N1ZXMvNjIpXG4gICAqIEBkZWZhdWx0IGB7fWBcbiAgICovXG4gIHBhdGhSZXdyaXRlPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgLyoqXG4gICAqIFByb3h5IHNldHRpbmdzLCBUdXJuIGEgcGF0aCBzdHJpbmcgc3VjaCBhcyBgL3VzZXIvOm5hbWVgIGludG8gYSByZWd1bGFyIGV4cHJlc3Npb24uIFtwYXRoLXRvLXJlZ2V4cF0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvcGF0aC10by1yZWdleHApXG4gICAqIEBkZWZhdWx0IGB7fWBcbiAgICovXG4gIHByb3h5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgLyoqXG4gICAqIFNldCB0aGUgW2xpc3RlbiBldmVudF0oaHR0cHM6Ly9naXRodWIuY29tL25vZGVqaXRzdS9ub2RlLWh0dHAtcHJveHkjbGlzdGVuaW5nLWZvci1wcm94eS1ldmVudHMpIGFuZCBbY29uZmlndXJhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL25vZGVqaXRzdS9ub2RlLWh0dHAtcHJveHkjb3B0aW9ucykgb2YgW2h0dHAtcHJveHldKGh0dHBzOi8vZ2l0aHViLmNvbS9ub2Rlaml0c3Uvbm9kZS1odHRwLXByb3h5KVxuICAgKiBAZGVmYXVsdCBge31gXG4gICAqL1xuICBodHRwUHJveHk/OiB7XG4gICAgb3B0aW9ucz86IGh0dHBQcm94eS5TZXJ2ZXJPcHRpb25zO1xuICAgIGxpc3RlbmVycz86IEh0dHBQcm94eUxpc3RlbmVyc1xuICB9O1xuICAvKipcbiAgICogYm9keVBhcnNlciBzZXR0aW5ncy4gXG4gICAqIEBleGFtcGxlXG4gICAqIFxuICAgKiBgYGBqc1xuICAgKiBib2R5UGFyc2VyID0ge1widGV4dC9wbGFpblwiOiBcInRleHRcIixcInRleHQvaHRtbFwiOiBcInRleHRcIn1cbiAgICogYGBgXG4gICAqIFxuICAgKiB3aWxsIHBhcnNlZCBgQ29udGVudC1UeXBlPSd0ZXh0L3BsYWluJyBhbmQgQ29udGVudC1UeXBlPSd0ZXh0L2h0bWwnYCB3aXRoIGBib2R5UGFyc2VyLnRleHRgXG4gICAqIFxuICAgKiBAZGVmYXVsdCBge31gXG4gICAqL1xuICBib2R5UGFyc2VyQ29uZj86IHtcbiAgICBba2V5OiBzdHJpbmddOiAncmF3JyB8ICd0ZXh0JyB8ICd1cmxlbmNvZGVkJyB8ICdqc29uJztcbiAgfTtcbiAgLyoqXG4gICAqIFtgYm9keVBhcnNlckpTT05gXShodHRwczovL2dpdGh1Yi5jb20vZXhwcmVzc2pzL2JvZHktcGFyc2VyL3RyZWUvNTZhMmI3M2MyNmIyMjM4YmMzMDUwYWQ5MGFmOWFiOWM2MmY0ZWI5NyNib2R5cGFyc2VyanNvbm9wdGlvbnMpIEpTT04gYm9keSBwYXJzZXJcbiAgICogQGRlZmF1bHQgYHt9YFxuICAgKi9cbiAgYm9keVBhcnNlckpTT04/OiBib2R5UGFyc2VyLk9wdGlvbnNKc29uO1xuICAvKipcbiAgICogW2Bib2R5UGFyc2VyVGV4dGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9leHByZXNzanMvYm9keS1wYXJzZXIvdHJlZS81NmEyYjczYzI2YjIyMzhiYzMwNTBhZDkwYWY5YWI5YzYyZjRlYjk3I2JvZHlwYXJzZXJ0ZXh0b3B0aW9ucykgVGV4dCBib2R5IHBhcnNlclxuICAgKiBAZGVmYXVsdCBge31gXG4gICAqL1xuICBib2R5UGFyc2VyVGV4dD86IGJvZHlQYXJzZXIuT3B0aW9uc1RleHQ7XG4gIC8qKlxuICAgKiBbYGJvZHlQYXJzZXJSYXdgXShodHRwczovL2dpdGh1Yi5jb20vZXhwcmVzc2pzL2JvZHktcGFyc2VyL3RyZWUvNTZhMmI3M2MyNmIyMjM4YmMzMDUwYWQ5MGFmOWFiOWM2MmY0ZWI5NyNib2R5cGFyc2VycmF3b3B0aW9ucykgUmF3IGJvZHkgcGFyc2VyXG4gICAqIEBkZWZhdWx0IGB7fWBcbiAgICovXG4gIGJvZHlQYXJzZXJSYXc/OiBib2R5UGFyc2VyLk9wdGlvbnM7XG4gIC8qKlxuICAgKiBbYGJvZHlQYXJzZXJVcmxlbmNvZGVkYF0oaHR0cHM6Ly9naXRodWIuY29tL2V4cHJlc3Nqcy9ib2R5LXBhcnNlci90cmVlLzU2YTJiNzNjMjZiMjIzOGJjMzA1MGFkOTBhZjlhYjljNjJmNGViOTcjYm9keXBhcnNlcnVybGVuY29kZWRvcHRpb25zKSBVUkwtZW5jb2RlZCBmb3JtIGJvZHkgcGFyc2VyXG4gICAqIEBkZWZhdWx0IGB7fWBcbiAgICovXG4gIGJvZHlQYXJzZXJVcmxlbmNvZGVkPzogYm9keVBhcnNlci5PcHRpb25zVXJsZW5jb2RlZDtcbiAgLyoqXG4gICAqIE9wdGlvbnMgb2JqZWN0IGFzIGRlZmluZWQgW2Nob2tpZGFyIGFwaSBvcHRpb25zXShodHRwczovL2dpdGh1Yi5jb20vcGF1bG1pbGxyL2Nob2tpZGFyI2FwaSlcbiAgICogQGRlZmF1bHQgYHt9YFxuICAgKi9cbiAgd2F0Y2hPcHRpb25zPzogY2hva2lkYXIuV2F0Y2hPcHRpb25zO1xuICAvKipcbiAgICogQWNjZXNzIENvbnRyb2wgQWxsb3cgb3B0aW9ucy5cbiAgICogQGRlZmF1bHQgYHt9YFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqc1xuICAgKiB7XG4gICAqICBoZWFkZXI6IHtcbiAgICogICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiAnUE9TVCwgR0VULCBPUFRJT05TLCBQVVQsIERFTEVURScsXG4gICAqICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBoZWFkZXI/OiBSZWNvcmQ8c3RyaW5nLHN0cmluZyB8IG51bWJlciB8IHN0cmluZ1tdPixcbiAgLyoqXG4gICAqIGBCb29sZWFuYCB0aGUgcHJveHkgcmVndWxhciBleHByZXNzaW9uIHN1cHBvcnQgZnVsbCB1cmwgcGF0aC5cbiAgICogIGlmIHRoZSBwcm94eSByZWd1bGFyIGV4cHJlc3Npb24gbGlrZSAvdGVzdD9hPTEmYj0xIGNhbiBiZSBtYXRjaGVkXG4gICAqL1xuICB3aXRoRnVsbFVybFBhdGg/OiBib29sZWFuXG59XG5cbmNvbnN0IHBhdGhUb1JlZ2V4cCA9IHRvUmVnZXhwLnBhdGhUb1JlZ2V4cDtcbmxldCBtb2NrZXI6IE1vY2tlclByb3h5Um91dGUgPSB7fTtcbmNvbnN0IHdhdGNoZWRGaWxlUGF0aHM6IHN0cmluZ1tdID0gW11cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFwcDogQXBwbGljYXRpb24sIHdhdGNoRmlsZTogc3RyaW5nIHwgc3RyaW5nW10gfCBNb2NrZXJQcm94eVJvdXRlLCBjb25mOiBNb2NrZXJPcHRpb24gPSB7fSkge1xuICBjb25zdCB3YXRjaEZpbGVzID0gKEFycmF5LmlzQXJyYXkod2F0Y2hGaWxlKSA/IHdhdGNoRmlsZSA6IHR5cGVvZiB3YXRjaEZpbGUgPT09ICdzdHJpbmcnID8gW3dhdGNoRmlsZV0gOiBbXSkubWFwKHN0ciA9PiBQQVRILnJlc29sdmUoc3RyKSk7XG5cbiAgaWYgKHdhdGNoRmlsZXMuc29tZShmaWxlID0+ICFmaWxlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTW9ja2VyIGZpbGUgZG9lcyBub3QgZXhpc3QhLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIE15YmUgd2F0Y2ggZmlsZSBvciBwYXNzIHBhcmFtZXRlcnNcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2pheXdjamxvdmUvbW9ja2VyLWFwaS9pc3N1ZXMvMTE2XG4gICAqL1xuICBjb25zdCBpc1dhdGNoRmlsZVBhdGggPSAoQXJyYXkuaXNBcnJheSh3YXRjaEZpbGUpICYmIHdhdGNoRmlsZS5ldmVyeSh2YWwgPT4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpKSB8fCB0eXBlb2Ygd2F0Y2hGaWxlID09PSAnc3RyaW5nJztcbiAgbW9ja2VyID0gaXNXYXRjaEZpbGVQYXRoID8gZ2V0Q29uZmlnKCkgOiB3YXRjaEZpbGU7XG5cbiAgaWYgKCFtb2NrZXIpIHtcbiAgICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgICBuZXh0KCk7XG4gICAgfVxuICB9XG4gIGxldCBvcHRpb25zOiBNb2NrZXJPcHRpb24gPSB7Li4uY29uZiwgLi4uKG1vY2tlci5fcHJveHkgfHwge30pfVxuICBjb25zdCBkZWZhdWx0T3B0aW9uczogTW9ja2VyT3B0aW9uID0ge1xuICAgIGNoYW5nZUhvc3Q6IHRydWUsXG4gICAgcGF0aFJld3JpdGU6IHt9LFxuICAgIHByb3h5OiB7fSxcbiAgICAvLyBwcm94eTogcHJveHlDb25mOiB7fSxcbiAgICBodHRwUHJveHk6IHt9LFxuICAgIC8vIGh0dHBQcm94eTogaHR0cFByb3h5Q29uZjoge30sXG4gICAgYm9keVBhcnNlckNvbmY6IHt9LFxuICAgIGJvZHlQYXJzZXJKU09OOiB7fSxcbiAgICBib2R5UGFyc2VyVGV4dDoge30sXG4gICAgYm9keVBhcnNlclJhdzoge30sXG4gICAgYm9keVBhcnNlclVybGVuY29kZWQ6IHt9LFxuICAgIHdhdGNoT3B0aW9uczoge30sXG4gICAgaGVhZGVyOiB7fSxcbiAgICBwcmlvcml0eTogJ3Byb3h5JyxcbiAgICB3aXRoRnVsbFVybFBhdGg6IGZhbHNlXG4gIH1cblxuICBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAvLyBjaGFuZ2VIb3N0ID0gdHJ1ZSxcbiAgLy8gcGF0aFJld3JpdGUgPSB7fSxcbiAgLy8gcHJveHk6IHByb3h5Q29uZiA9IHt9LFxuICAvLyBodHRwUHJveHk6IGh0dHBQcm94eUNvbmYgPSB7fSxcbiAgLy8gYm9keVBhcnNlckNvbmY9IHt9LFxuICAvLyBib2R5UGFyc2VySlNPTiA9IHt9LFxuICAvLyBib2R5UGFyc2VyVGV4dCA9IHt9LFxuICAvLyBib2R5UGFyc2VyUmF3ID0ge30sXG4gIC8vIGJvZHlQYXJzZXJVcmxlbmNvZGVkID0ge30sXG4gIC8vIHdhdGNoT3B0aW9ucyA9IHt9LFxuICAvLyBoZWFkZXIgPSB7fVxuXG4gIGlmIChpc1dhdGNoRmlsZVBhdGgpIHtcbiAgICAvLyDnm5HlkKzphY3nva7lhaXlj6Pmlofku7bmiYDlnKjnmoTnm67lvZXvvIzkuIDoiKzkuLrorqTkuLrlnKjphY3nva7mlofku7YvbW9jayDnm67lvZXkuIvnmoTmiYDmnInmlofku7ZcbiAgICAvLyDliqDkuIpyZXF1aXJlLnJlc29sdmXvvIzkv53or4EgYC4vbW9jay9g6IO95aSf5om+5YiwYC4vbW9jay9pbmRleC5qc2DvvIzopoHkuI3nhLblsLHopoHnm5HmjqfliLDkuIrkuIDnuqfnm67lvZXkuoZcbiAgICAvLyBjb25zdCB3YXRjaGVyID0gY2hva2lkYXIud2F0Y2god2F0Y2hGaWxlcy5tYXAod2F0Y2hGaWxlID0+IFBBVEguZGlybmFtZShyZXF1aXJlLnJlc29sdmUod2F0Y2hGaWxlKSkpLCBvcHRpb25zLndhdGNoT3B0aW9ucyk7XG4gICAgY29uc3Qgd2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHdhdGNoRmlsZXMsIG9wdGlvbnMud2F0Y2hPcHRpb25zKTtcbiAgXG4gICAgd2F0Y2hlci5vbignYWxsJywgKGV2ZW50LCBwYXRoKSA9PiB7XG4gICAgICBpZiAoZXZlbnQgPT09ICdjaGFuZ2UnIHx8IGV2ZW50ID09PSAnYWRkJykge1xuICAgICAgICBpZiAod2F0Y2hlZEZpbGVQYXRocy5pbmRleE9mKHBhdGgpIDwgMCkgd2F0Y2hlZEZpbGVQYXRocy5wdXNoKHBhdGgpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDlvZPnm5HlkKznmoTlj6/og73mmK/lpJrkuKrphY3nva7mlofku7bml7bvvIzpnIDopoHmuIXnkIbmjonmm7TmlrDmlofku7bku6Xlj4rlhaXlj6Pmlofku7bnmoTnvJPlrZjvvIzph43mlrDojrflj5ZcbiAgICAgICAgICBjbGVhbkNhY2hlKHBhdGgpO1xuICAgICAgICAgIC8vIHdhdGNoRmlsZXMuZm9yRWFjaChmaWxlID0+IGNsZWFuQ2FjaGUoZmlsZSkpO1xuICAgICAgICAgIG1vY2tlciA9IGdldENvbmZpZygpO1xuICAgICAgICAgIGlmIChtb2NrZXIuX3Byb3h5KSB7XG4gICAgICAgICAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCAuLi5tb2NrZXIuX3Byb3h5IH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKGAke2NvbG9yLmdyZWVuX2IuYmxhY2soJyBEb25lOiAnKX0gSG90IE1vY2tlciAke2NvbG9yLmdyZWVuKHBhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykpfSBmaWxlIHJlcGxhY2VtZW50IHN1Y2Nlc3MhYCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgJHtjb2xvci5yZWRfYi5ibGFjaygnIEZhaWxlZDogJyl9IEhvdCBNb2NrZXIgJHtjb2xvci5yZWQocGF0aC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSl9IGZpbGUgcmVwbGFjZW1lbnQgZmFpbGVkISFgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ3VubGluaycpIHtcbiAgICAgICAgaWYgKHdhdGNoZWRGaWxlUGF0aHMuaW5kZXhPZihwYXRoKSA+PSAwKSB3YXRjaGVkRmlsZVBhdGhzLnNwbGljZSh3YXRjaGVkRmlsZVBhdGhzLmluZGV4T2YocGF0aCkpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtb2NrZXIgPSBnZXRDb25maWcoKTtcbiAgICAgICAgICBpZiAobW9ja2VyLl9wcm94eSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgLi4ubW9ja2VyLl9wcm94eSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZyhgJHtjb2xvci5ncmVlbl9iLmJsYWNrKCcgRG9uZTogJyl9IEhvdCBNb2NrZXIgJHtjb2xvci5ncmVlbihwYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpKX0gZmlsZSByZW1vdmUgc3VjY2VzcyFgKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGAke2NvbG9yLnJlZF9iLmJsYWNrKCcgRmFpbGVkOiAnKX0gSG90IE1vY2tlciAke2NvbG9yLnJlZChwYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpKX0gZmlsZSByZW1vdmUgZmFpbGVkISFgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgLy8g55uR5ZCs5paH5Lu25L+u5pS56YeN5paw5Yqg6L295Luj56CBXG4gIC8vIOmFjee9rueDreabtOaWsFxuICBhcHAuYWxsKCcvKicsIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIGNvbnN0IGdldEV4ZWNVcmxQYXRoID0gKHJlcTogUmVxdWVzdCkgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbnMud2l0aEZ1bGxVcmxQYXRoID8gcmVxLnVybCA6IHJlcS5wYXRoO1xuICAgIH0gXG4gICAgLyoqXG4gICAgICogR2V0IFByb3h5IGtleVxuICAgICAqL1xuICAgIGNvbnN0IHByb3h5S2V5ID0gT2JqZWN0LmtleXMob3B0aW9ucy5wcm94eSkuZmluZCgoa25hbWUpID0+IHtcbiAgICAgIHJldHVybiAhIXBhdGhUb1JlZ2V4cChrbmFtZS5yZXBsYWNlKChuZXcgUmVnRXhwKCdeJyArIHJlcS5tZXRob2QgKyAnICcpKSwgJycpKS5leGVjKGdldEV4ZWNVcmxQYXRoKHJlcSkpO1xuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEdldCBNb2NrZXIga2V5XG4gICAgICogPT4gYEdFVCAvYXBpLzpvd25lci86cmVwby9yYXcvOnJlZmBcbiAgICAgKiA9PiBgR0VUIC9hcGkvOm93bmVyLzpyZXBvL3Jhdy86cmVmLyguKilgXG4gICAgICovXG4gICAgY29uc3QgbW9ja2VyS2V5OiBzdHJpbmcgPSBPYmplY3Qua2V5cyhtb2NrZXIpLmZpbmQoKGtuYW1lKSA9PiB7XG4gICAgICByZXR1cm4gISFwYXRoVG9SZWdleHAoa25hbWUucmVwbGFjZSgobmV3IFJlZ0V4cCgnXicgKyByZXEubWV0aG9kICsgJyAnKSksICcnKSkuZXhlYyhnZXRFeGVjVXJsUGF0aChyZXEpKTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgQ29udHJvbCBBbGxvdyBvcHRpb25zLlxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXl3Y2psb3ZlL21vY2tlci1hcGkvaXNzdWVzLzYxXG4gICAgICovXG4gICAgY29uc3QgYWNjZXNzT3B0aW9uczogTW9ja2VyT3B0aW9uWydoZWFkZXInXSA9IHtcbiAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiByZXEuZ2V0KCdPcmlnaW4nKSB8fCAnKicsXG4gICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyc6ICdQT1NULCBHRVQsIE9QVElPTlMsIFBVVCwgREVMRVRFJyxcbiAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogJ0NvbnRlbnQtVHlwZSwgWC1SZXF1ZXN0ZWQtV2l0aCwnICsgKHJlcS5oZWFkZXIoJ2FjY2Vzcy1jb250cm9sLXJlcXVlc3QtaGVhZGVycycpIHx8ICcnKSxcbiAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyc6ICd0cnVlJyxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVyLFxuICAgIH1cbiAgICBPYmplY3Qua2V5cyhhY2Nlc3NPcHRpb25zKS5mb3JFYWNoKGtleU5hbWUgPT4ge1xuICAgICAgcmVzLnNldEhlYWRlcihrZXlOYW1lLCBhY2Nlc3NPcHRpb25zW2tleU5hbWVdKTtcbiAgICB9KTtcbiAgICAvLyBmaXggaXNzdWUgMzQgaHR0cHM6Ly9naXRodWIuY29tL2pheXdjamxvdmUvbW9ja2VyLWFwaS9pc3N1ZXMvMzRcbiAgICAvLyBJbiBzb21lIGNyb3NzLW9yaWdpbiBodHRwIHJlcXVlc3QsIHRoZSBicm93c2VyIHdpbGwgc2VuZCB0aGUgcHJlZmxpZ2h0ZWQgb3B0aW9ucyByZXF1ZXN0IGJlZm9yZSBzZW5kaW5nIHRoZSByZXF1ZXN0IG1ldGhvZHMgd3JpdHRlbiBpbiB0aGUgY29kZS5cbiAgICBpZiAoIW1vY2tlcktleSAmJiByZXEubWV0aG9kLnRvTG9jYWxlVXBwZXJDYXNlKCkgPT09ICdPUFRJT05TJ1xuICAgICAgJiYgT2JqZWN0LmtleXMobW9ja2VyKS5maW5kKChrbmFtZSkgPT4gISFwYXRoVG9SZWdleHAoa25hbWUucmVwbGFjZSgobmV3IFJlZ0V4cCgnXihQVVR8UE9TVHxHRVR8REVMRVRFKSAnKSksICcnKSkuZXhlYyhnZXRFeGVjVXJsUGF0aChyZXEpKSlcbiAgICApIHtcbiAgICAgIHJldHVybiByZXMuc2VuZFN0YXR1cygyMDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHByaW9yaXR5ICdwcm94eScgb3IgJ21vY2tlcicgWyMxNTFdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXl3Y2psb3ZlL21vY2tlci1hcGkvaXNzdWVzLzE1MSlcbiAgICAgKi9cbiAgICBpZiAob3B0aW9ucy5wcmlvcml0eSA9PT0gJ21vY2tlcicpIHtcbiAgICAgIGlmIChtb2NrZXJbbW9ja2VyS2V5XSkge1xuICAgICAgICByZXR1cm4gbW9ja2VySGFuZGxlKHsgcmVxLCByZXMsIG5leHQsIG1vY2tlciwgb3B0aW9ucywgbW9ja2VyS2V5fSlcbiAgICAgIH0gZWxzZSBpZiAocHJveHlLZXkgJiYgb3B0aW9ucy5wcm94eVtwcm94eUtleV0pIHtcbiAgICAgICAgcmV0dXJuIHByb3h5SGFuZGxlKHJlcSwgcmVzLCBvcHRpb25zLCBwcm94eUtleSk7XG4gICAgICB9IFxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJveHlLZXkgJiYgb3B0aW9ucy5wcm94eVtwcm94eUtleV0pIHtcbiAgICAgICAgcmV0dXJuIHByb3h5SGFuZGxlKHJlcSwgcmVzLCBvcHRpb25zLCBwcm94eUtleSk7XG4gICAgICB9IGVsc2UgaWYgKG1vY2tlclttb2NrZXJLZXldKSB7XG4gICAgICAgIHJldHVybiBtb2NrZXJIYW5kbGUoeyByZXEsIHJlcywgbmV4dCwgbW9ja2VyLCBvcHRpb25zLCBtb2NrZXJLZXl9KVxuICAgICAgfVxuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgbW9kdWxlJ3MgcmVzb3VyY2VzIHRvIGJlIHJlbGVhc2VkLlxuICAgKiBAcGFyYW0gbW9kdWxlUGF0aCBcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuQ2FjaGUobW9kdWxlUGF0aDogc3RyaW5nKSB7XG4gICAgLy8gVGhlIGVudHJ5IGZpbGUgZG9lcyBub3QgaGF2ZSBhIC5qcyBzdWZmaXgsXG4gICAgLy8gY2F1c2luZyB0aGUgbW9kdWxlJ3MgcmVzb3VyY2VzIG5vdCB0byBiZSByZWxlYXNlZC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vamF5d2NqbG92ZS93ZWJwYWNrLWFwaS1tb2NrZXIvaXNzdWVzLzMwXG4gICAgdHJ5IHtcbiAgICAgIG1vZHVsZVBhdGggPSByZXF1aXJlLnJlc29sdmUobW9kdWxlUGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB2YXIgbW9kdWxlID0gcmVxdWlyZS5jYWNoZVttb2R1bGVQYXRoXTtcbiAgICBpZiAoIW1vZHVsZSkgcmV0dXJuO1xuICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgaW4gbW9kdWxlLnBhcmVudFxuICAgIGlmIChtb2R1bGUucGFyZW50KSB7XG4gICAgICBtb2R1bGUucGFyZW50LmNoaWxkcmVuLnNwbGljZShtb2R1bGUucGFyZW50LmNoaWxkcmVuLmluZGV4T2YobW9kdWxlKSwgMSk7XG4gICAgfVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXl3Y2psb3ZlL21vY2tlci1hcGkvaXNzdWVzLzQyXG4gICAgY2xlYXJNb2R1bGUobW9kdWxlUGF0aCk7XG4gIH1cbiAgLyoqXG4gICAqIE1lcmdlIG11bHRpcGxlIE1vY2tlcnNcbiAgICovXG4gIGZ1bmN0aW9uIGdldENvbmZpZygpIHtcbiAgICByZXR1cm4gd2F0Y2hlZEZpbGVQYXRocy5yZWR1Y2UoKG1vY2tlciwgZmlsZSkgPT4ge1xuICAgICAgY29uc3QgbW9ja2VySXRlbSA9IHJlcXVpcmUoZmlsZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihtb2NrZXIsIG1vY2tlckl0ZW0uZGVmYXVsdCA/IG1vY2tlckl0ZW0uZGVmYXVsdCA6IG1vY2tlckl0ZW0pO1xuICAgIH0sIHt9KVxuICB9XG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBuZXh0KCk7XG4gIH1cbn1cbiJdfQ==