specmatic
Version:
Node wrapper for Specmatic
139 lines (138 loc) • 22.4 kB
JavaScript
;
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
Object.defineProperty(exports, "__esModule", {
value: true
});
var regExpToParseExpressPathRegExp = /^\/\^\\?\/?(?:(:?[\w\\.-]*(?:\\\/:?[\w\\.-]*)*)|(\(\?:\\?\/?\([^)]+\)\)))\\\/.*/;
var regExpToReplaceExpressPathRegExpParams = /\(\?:\\?\/?\([^)]+\)\)/;
var regexpExpressParamRegexp = /\(\?:\\?\\?\/?\([^)]+\)\)/g;
var regexpExpressPathParamRegexp = /(:[^)]+)\([^)]+\)/g;
var EXPRESS_ROOT_PATH_REGEXP_VALUE = '/^\\/?(?=\\/|$)/i';
var STACK_ITEM_VALID_NAMES = ['router', 'bound dispatch', 'mounted_app'];
var getRouteMethods = function getRouteMethods(route) {
var methods = Object.keys(route.methods);
methods = methods.filter(function (method) {
return method !== '_all';
});
methods = methods.map(function (method) {
return method.toUpperCase();
});
return methods;
};
var getRouteMiddlewares = function getRouteMiddlewares(route) {
return route.stack.map(function (item) {
return item.handle.name || 'anonymous';
});
};
var hasParams = function hasParams(expressPathRegExp) {
return regexpExpressParamRegexp.test(expressPathRegExp);
};
function combinePaths(base, path) {
return (base + path).replace(/\/+/g, "/").replace(/\/$/, "") || "/";
}
var parseExpressRoute = function parseExpressRoute(route, basePath) {
var paths = [];
if (Array.isArray(route.path)) {
paths.push.apply(paths, _toConsumableArray(route.path));
} else {
paths.push(route.path);
}
var endpoints = paths.map(function (path) {
var completePath = combinePaths(basePath, path);
var endpoint = {
path: completePath.replace(regexpExpressPathParamRegexp, '$1'),
methods: getRouteMethods(route),
middlewares: getRouteMiddlewares(route)
};
return endpoint;
});
return endpoints;
};
var parseExpressPath = function parseExpressPath(expressPathRegExp, params) {
var parsedRegExp = expressPathRegExp.toString();
var expressPathRegExpExec = regExpToParseExpressPathRegExp.exec(parsedRegExp);
var paramIndex = 0;
var _loop = function _loop() {
var paramName = params[paramIndex].name;
var paramId = ":".concat(paramName);
parsedRegExp = parsedRegExp.replace(regExpToReplaceExpressPathRegExpParams, function (str) {
if (str.startsWith('(?:\\/')) {
return "\\/".concat(paramId);
}
return paramId;
});
paramIndex++;
};
while (hasParams(parsedRegExp)) {
_loop();
}
if (parsedRegExp !== expressPathRegExp.toString()) {
expressPathRegExpExec = regExpToParseExpressPathRegExp.exec(parsedRegExp);
}
var parsedPath = expressPathRegExpExec[1].replace(/\\\//g, '/');
return parsedPath;
};
var parseEndpoints = function parseEndpoints(app, basePath, endpoints) {
var stack = app.stack || app._router && app._router.stack;
endpoints = endpoints || [];
basePath = basePath || '';
if (!stack) {
if (endpoints.length) {
endpoints = addEndpoints(endpoints, [{
path: basePath,
methods: [],
middlewares: []
}]);
}
} else {
endpoints = parseStack(stack, basePath, endpoints);
}
return endpoints;
};
var addEndpoints = function addEndpoints(currentEndpoints, endpointsToAdd) {
endpointsToAdd.forEach(function (newEndpoint) {
var existingEndpoint = currentEndpoints.find(function (endpoint) {
return endpoint.path === newEndpoint.path;
});
if (existingEndpoint !== undefined) {
var newMethods = newEndpoint.methods.filter(function (method) {
return !existingEndpoint.methods.includes(method);
});
existingEndpoint.methods = existingEndpoint.methods.concat(newMethods);
} else {
currentEndpoints.push(newEndpoint);
}
});
return currentEndpoints;
};
var parseStack = function parseStack(stack, basePath, endpoints) {
stack.forEach(function (stackItem) {
if (stackItem.route) {
var newEndpoints = parseExpressRoute(stackItem.route, basePath);
endpoints = addEndpoints(endpoints, newEndpoints);
} else if (STACK_ITEM_VALID_NAMES.includes(stackItem.name)) {
var isExpressPathRegexp = regExpToParseExpressPathRegExp.test(stackItem.regexp);
var newBasePath = basePath;
if (isExpressPathRegexp) {
var parsedPath = parseExpressPath(stackItem.regexp, stackItem.keys);
newBasePath += "/".concat(parsedPath);
} else if (!stackItem.path && stackItem.regexp && stackItem.regexp.toString() !== EXPRESS_ROOT_PATH_REGEXP_VALUE) {
var regExpPath = " RegExp(".concat(stackItem.regexp, ") ");
newBasePath += "/".concat(regExpPath);
}
endpoints = parseEndpoints(stackItem.handle, newBasePath, endpoints);
}
});
return endpoints;
};
var expressListEndpoints = function expressListEndpoints(app) {
var endpoints = parseEndpoints(app);
return endpoints;
};
module.exports = expressListEndpoints;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdG9Db25zdW1hYmxlQXJyYXkiLCJyIiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIlR5cGVFcnJvciIsImEiLCJfYXJyYXlMaWtlVG9BcnJheSIsInQiLCJ0b1N0cmluZyIsImNhbGwiLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJTeW1ib2wiLCJpdGVyYXRvciIsImlzQXJyYXkiLCJsZW5ndGgiLCJlIiwibiIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZXhwb3J0cyIsInZhbHVlIiwicmVnRXhwVG9QYXJzZUV4cHJlc3NQYXRoUmVnRXhwIiwicmVnRXhwVG9SZXBsYWNlRXhwcmVzc1BhdGhSZWdFeHBQYXJhbXMiLCJyZWdleHBFeHByZXNzUGFyYW1SZWdleHAiLCJyZWdleHBFeHByZXNzUGF0aFBhcmFtUmVnZXhwIiwiRVhQUkVTU19ST09UX1BBVEhfUkVHRVhQX1ZBTFVFIiwiU1RBQ0tfSVRFTV9WQUxJRF9OQU1FUyIsImdldFJvdXRlTWV0aG9kcyIsInJvdXRlIiwibWV0aG9kcyIsImtleXMiLCJmaWx0ZXIiLCJtZXRob2QiLCJtYXAiLCJ0b1VwcGVyQ2FzZSIsImdldFJvdXRlTWlkZGxld2FyZXMiLCJzdGFjayIsIml0ZW0iLCJoYW5kbGUiLCJoYXNQYXJhbXMiLCJleHByZXNzUGF0aFJlZ0V4cCIsImNvbWJpbmVQYXRocyIsImJhc2UiLCJwYXRoIiwicmVwbGFjZSIsInBhcnNlRXhwcmVzc1JvdXRlIiwiYmFzZVBhdGgiLCJwYXRocyIsInB1c2giLCJhcHBseSIsImVuZHBvaW50cyIsImNvbXBsZXRlUGF0aCIsImVuZHBvaW50IiwibWlkZGxld2FyZXMiLCJwYXJzZUV4cHJlc3NQYXRoIiwicGFyYW1zIiwicGFyc2VkUmVnRXhwIiwiZXhwcmVzc1BhdGhSZWdFeHBFeGVjIiwiZXhlYyIsInBhcmFtSW5kZXgiLCJfbG9vcCIsInBhcmFtTmFtZSIsInBhcmFtSWQiLCJjb25jYXQiLCJzdHIiLCJzdGFydHNXaXRoIiwicGFyc2VkUGF0aCIsInBhcnNlRW5kcG9pbnRzIiwiYXBwIiwiX3JvdXRlciIsImFkZEVuZHBvaW50cyIsInBhcnNlU3RhY2siLCJjdXJyZW50RW5kcG9pbnRzIiwiZW5kcG9pbnRzVG9BZGQiLCJmb3JFYWNoIiwibmV3RW5kcG9pbnQiLCJleGlzdGluZ0VuZHBvaW50IiwiZmluZCIsInVuZGVmaW5lZCIsIm5ld01ldGhvZHMiLCJpbmNsdWRlcyIsInN0YWNrSXRlbSIsIm5ld0VuZHBvaW50cyIsImlzRXhwcmVzc1BhdGhSZWdleHAiLCJyZWdleHAiLCJuZXdCYXNlUGF0aCIsInJlZ0V4cFBhdGgiLCJleHByZXNzTGlzdEVuZHBvaW50cyIsIm1vZHVsZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvZXhwcmVzcy1saXN0LWVuZHBvaW50cy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHJlZ0V4cFRvUGFyc2VFeHByZXNzUGF0aFJlZ0V4cCA9IC9eXFwvXFxeXFxcXD9cXC8/KD86KDo/W1xcd1xcXFwuLV0qKD86XFxcXFxcLzo/W1xcd1xcXFwuLV0qKSopfChcXChcXD86XFxcXD9cXC8/XFwoW14pXStcXClcXCkpKVxcXFxcXC8uKi87XG5jb25zdCByZWdFeHBUb1JlcGxhY2VFeHByZXNzUGF0aFJlZ0V4cFBhcmFtcyA9IC9cXChcXD86XFxcXD9cXC8/XFwoW14pXStcXClcXCkvO1xuY29uc3QgcmVnZXhwRXhwcmVzc1BhcmFtUmVnZXhwID0gL1xcKFxcPzpcXFxcP1xcXFw/XFwvP1xcKFteKV0rXFwpXFwpL2c7XG5jb25zdCByZWdleHBFeHByZXNzUGF0aFBhcmFtUmVnZXhwID0gLyg6W14pXSspXFwoW14pXStcXCkvZztcbmNvbnN0IEVYUFJFU1NfUk9PVF9QQVRIX1JFR0VYUF9WQUxVRSA9ICcvXlxcXFwvPyg/PVxcXFwvfCQpL2knO1xuY29uc3QgU1RBQ0tfSVRFTV9WQUxJRF9OQU1FUyA9IFtcbiAgICAncm91dGVyJyxcbiAgICAnYm91bmQgZGlzcGF0Y2gnLFxuICAgICdtb3VudGVkX2FwcCdcbl07XG5jb25zdCBnZXRSb3V0ZU1ldGhvZHMgPSBmdW5jdGlvbiAocm91dGUpIHtcbiAgICBsZXQgbWV0aG9kcyA9IE9iamVjdC5rZXlzKHJvdXRlLm1ldGhvZHMpO1xuICAgIG1ldGhvZHMgPSBtZXRob2RzLmZpbHRlcigobWV0aG9kKSA9PiBtZXRob2QgIT09ICdfYWxsJyk7XG4gICAgbWV0aG9kcyA9IG1ldGhvZHMubWFwKChtZXRob2QpID0+IG1ldGhvZC50b1VwcGVyQ2FzZSgpKTtcbiAgICByZXR1cm4gbWV0aG9kcztcbn07XG5jb25zdCBnZXRSb3V0ZU1pZGRsZXdhcmVzID0gZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgcmV0dXJuIHJvdXRlLnN0YWNrLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5oYW5kbGUubmFtZSB8fCAnYW5vbnltb3VzJztcbiAgICB9KTtcbn07XG5jb25zdCBoYXNQYXJhbXMgPSBmdW5jdGlvbiAoZXhwcmVzc1BhdGhSZWdFeHApIHtcbiAgICByZXR1cm4gcmVnZXhwRXhwcmVzc1BhcmFtUmVnZXhwLnRlc3QoZXhwcmVzc1BhdGhSZWdFeHApO1xufTtcbmZ1bmN0aW9uIGNvbWJpbmVQYXRocyhiYXNlLCBwYXRoKSB7XG4gICAgcmV0dXJuIChiYXNlICsgcGF0aCkucmVwbGFjZSgvXFwvKy9nLCBcIi9cIikucmVwbGFjZSgvXFwvJC8sIFwiXCIpIHx8IFwiL1wiO1xufVxuY29uc3QgcGFyc2VFeHByZXNzUm91dGUgPSBmdW5jdGlvbiAocm91dGUsIGJhc2VQYXRoKSB7XG4gICAgY29uc3QgcGF0aHMgPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyb3V0ZS5wYXRoKSkge1xuICAgICAgICBwYXRocy5wdXNoKC4uLnJvdXRlLnBhdGgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcGF0aHMucHVzaChyb3V0ZS5wYXRoKTtcbiAgICB9XG4gICAgY29uc3QgZW5kcG9pbnRzID0gcGF0aHMubWFwKChwYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBsZXRlUGF0aCA9IGNvbWJpbmVQYXRocyhiYXNlUGF0aCwgcGF0aCk7XG4gICAgICAgIGNvbnN0IGVuZHBvaW50ID0ge1xuICAgICAgICAgICAgcGF0aDogY29tcGxldGVQYXRoLnJlcGxhY2UocmVnZXhwRXhwcmVzc1BhdGhQYXJhbVJlZ2V4cCwgJyQxJyksXG4gICAgICAgICAgICBtZXRob2RzOiBnZXRSb3V0ZU1ldGhvZHMocm91dGUpLFxuICAgICAgICAgICAgbWlkZGxld2FyZXM6IGdldFJvdXRlTWlkZGxld2FyZXMocm91dGUpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBlbmRwb2ludDtcbiAgICB9KTtcbiAgICByZXR1cm4gZW5kcG9pbnRzO1xufTtcbmNvbnN0IHBhcnNlRXhwcmVzc1BhdGggPSBmdW5jdGlvbiAoZXhwcmVzc1BhdGhSZWdFeHAsIHBhcmFtcykge1xuICAgIGxldCBwYXJzZWRSZWdFeHAgPSBleHByZXNzUGF0aFJlZ0V4cC50b1N0cmluZygpO1xuICAgIGxldCBleHByZXNzUGF0aFJlZ0V4cEV4ZWMgPSByZWdFeHBUb1BhcnNlRXhwcmVzc1BhdGhSZWdFeHAuZXhlYyhwYXJzZWRSZWdFeHApO1xuICAgIGxldCBwYXJhbUluZGV4ID0gMDtcbiAgICB3aGlsZSAoaGFzUGFyYW1zKHBhcnNlZFJlZ0V4cCkpIHtcbiAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcGFyYW1zW3BhcmFtSW5kZXhdLm5hbWU7XG4gICAgICAgIGNvbnN0IHBhcmFtSWQgPSBgOiR7cGFyYW1OYW1lfWA7XG4gICAgICAgIHBhcnNlZFJlZ0V4cCA9IHBhcnNlZFJlZ0V4cFxuICAgICAgICAgICAgLnJlcGxhY2UocmVnRXhwVG9SZXBsYWNlRXhwcmVzc1BhdGhSZWdFeHBQYXJhbXMsIChzdHIpID0+IHtcbiAgICAgICAgICAgIGlmIChzdHIuc3RhcnRzV2l0aCgnKD86XFxcXC8nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgXFxcXC8ke3BhcmFtSWR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJhbUlkO1xuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1JbmRleCsrO1xuICAgIH1cbiAgICBpZiAocGFyc2VkUmVnRXhwICE9PSBleHByZXNzUGF0aFJlZ0V4cC50b1N0cmluZygpKSB7XG4gICAgICAgIGV4cHJlc3NQYXRoUmVnRXhwRXhlYyA9IHJlZ0V4cFRvUGFyc2VFeHByZXNzUGF0aFJlZ0V4cC5leGVjKHBhcnNlZFJlZ0V4cCk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZFBhdGggPSBleHByZXNzUGF0aFJlZ0V4cEV4ZWNbMV0ucmVwbGFjZSgvXFxcXFxcLy9nLCAnLycpO1xuICAgIHJldHVybiBwYXJzZWRQYXRoO1xufTtcbmNvbnN0IHBhcnNlRW5kcG9pbnRzID0gZnVuY3Rpb24gKGFwcCwgYmFzZVBhdGgsIGVuZHBvaW50cykge1xuICAgIGNvbnN0IHN0YWNrID0gYXBwLnN0YWNrIHx8IChhcHAuX3JvdXRlciAmJiBhcHAuX3JvdXRlci5zdGFjayk7XG4gICAgZW5kcG9pbnRzID0gZW5kcG9pbnRzIHx8IFtdO1xuICAgIGJhc2VQYXRoID0gYmFzZVBhdGggfHwgJyc7XG4gICAgaWYgKCFzdGFjaykge1xuICAgICAgICBpZiAoZW5kcG9pbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZW5kcG9pbnRzID0gYWRkRW5kcG9pbnRzKGVuZHBvaW50cywgW3tcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogYmFzZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBtaWRkbGV3YXJlczogW11cbiAgICAgICAgICAgICAgICB9XSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVuZHBvaW50cyA9IHBhcnNlU3RhY2soc3RhY2ssIGJhc2VQYXRoLCBlbmRwb2ludHMpO1xuICAgIH1cbiAgICByZXR1cm4gZW5kcG9pbnRzO1xufTtcbmNvbnN0IGFkZEVuZHBvaW50cyA9IGZ1bmN0aW9uIChjdXJyZW50RW5kcG9pbnRzLCBlbmRwb2ludHNUb0FkZCkge1xuICAgIGVuZHBvaW50c1RvQWRkLmZvckVhY2goKG5ld0VuZHBvaW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRW5kcG9pbnQgPSBjdXJyZW50RW5kcG9pbnRzLmZpbmQoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5wYXRoID09PSBuZXdFbmRwb2ludC5wYXRoKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nRW5kcG9pbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbmV3TWV0aG9kcyA9IG5ld0VuZHBvaW50Lm1ldGhvZHMuZmlsdGVyKChtZXRob2QpID0+ICFleGlzdGluZ0VuZHBvaW50Lm1ldGhvZHMuaW5jbHVkZXMobWV0aG9kKSk7XG4gICAgICAgICAgICBleGlzdGluZ0VuZHBvaW50Lm1ldGhvZHMgPSBleGlzdGluZ0VuZHBvaW50Lm1ldGhvZHMuY29uY2F0KG5ld01ldGhvZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudEVuZHBvaW50cy5wdXNoKG5ld0VuZHBvaW50KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjdXJyZW50RW5kcG9pbnRzO1xufTtcbmNvbnN0IHBhcnNlU3RhY2sgPSBmdW5jdGlvbiAoc3RhY2ssIGJhc2VQYXRoLCBlbmRwb2ludHMpIHtcbiAgICBzdGFjay5mb3JFYWNoKChzdGFja0l0ZW0pID0+IHtcbiAgICAgICAgaWYgKHN0YWNrSXRlbS5yb3V0ZSkge1xuICAgICAgICAgICAgY29uc3QgbmV3RW5kcG9pbnRzID0gcGFyc2VFeHByZXNzUm91dGUoc3RhY2tJdGVtLnJvdXRlLCBiYXNlUGF0aCk7XG4gICAgICAgICAgICBlbmRwb2ludHMgPSBhZGRFbmRwb2ludHMoZW5kcG9pbnRzLCBuZXdFbmRwb2ludHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFNUQUNLX0lURU1fVkFMSURfTkFNRVMuaW5jbHVkZXMoc3RhY2tJdGVtLm5hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCBpc0V4cHJlc3NQYXRoUmVnZXhwID0gcmVnRXhwVG9QYXJzZUV4cHJlc3NQYXRoUmVnRXhwLnRlc3Qoc3RhY2tJdGVtLnJlZ2V4cCk7XG4gICAgICAgICAgICBsZXQgbmV3QmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICAgICAgICAgIGlmIChpc0V4cHJlc3NQYXRoUmVnZXhwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUGF0aCA9IHBhcnNlRXhwcmVzc1BhdGgoc3RhY2tJdGVtLnJlZ2V4cCwgc3RhY2tJdGVtLmtleXMpO1xuICAgICAgICAgICAgICAgIG5ld0Jhc2VQYXRoICs9IGAvJHtwYXJzZWRQYXRofWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghc3RhY2tJdGVtLnBhdGggJiYgc3RhY2tJdGVtLnJlZ2V4cCAmJiBzdGFja0l0ZW0ucmVnZXhwLnRvU3RyaW5nKCkgIT09IEVYUFJFU1NfUk9PVF9QQVRIX1JFR0VYUF9WQUxVRSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ0V4cFBhdGggPSBgIFJlZ0V4cCgke3N0YWNrSXRlbS5yZWdleHB9KSBgO1xuICAgICAgICAgICAgICAgIG5ld0Jhc2VQYXRoICs9IGAvJHtyZWdFeHBQYXRofWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbmRwb2ludHMgPSBwYXJzZUVuZHBvaW50cyhzdGFja0l0ZW0uaGFuZGxlLCBuZXdCYXNlUGF0aCwgZW5kcG9pbnRzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBlbmRwb2ludHM7XG59O1xuY29uc3QgZXhwcmVzc0xpc3RFbmRwb2ludHMgPSBmdW5jdGlvbiAoYXBwKSB7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gcGFyc2VFbmRwb2ludHMoYXBwKTtcbiAgICByZXR1cm4gZW5kcG9pbnRzO1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwcmVzc0xpc3RFbmRwb2ludHM7XG4iXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7O0FBQUMsU0FBQUEsbUJBQUFDLENBQUEsV0FBQUMsa0JBQUEsQ0FBQUQsQ0FBQSxLQUFBRSxnQkFBQSxDQUFBRixDQUFBLEtBQUFHLDJCQUFBLENBQUFILENBQUEsS0FBQUksa0JBQUE7QUFBQSxTQUFBQSxtQkFBQSxjQUFBQyxTQUFBO0FBQUEsU0FBQUYsNEJBQUFILENBQUEsRUFBQU0sQ0FBQSxRQUFBTixDQUFBLDJCQUFBQSxDQUFBLFNBQUFPLGlCQUFBLENBQUFQLENBQUEsRUFBQU0sQ0FBQSxPQUFBRSxDQUFBLE1BQUFDLFFBQUEsQ0FBQUMsSUFBQSxDQUFBVixDQUFBLEVBQUFXLEtBQUEsNkJBQUFILENBQUEsSUFBQVIsQ0FBQSxDQUFBWSxXQUFBLEtBQUFKLENBQUEsR0FBQVIsQ0FBQSxDQUFBWSxXQUFBLENBQUFDLElBQUEsYUFBQUwsQ0FBQSxjQUFBQSxDQUFBLEdBQUFNLEtBQUEsQ0FBQUMsSUFBQSxDQUFBZixDQUFBLG9CQUFBUSxDQUFBLCtDQUFBUSxJQUFBLENBQUFSLENBQUEsSUFBQUQsaUJBQUEsQ0FBQVAsQ0FBQSxFQUFBTSxDQUFBO0FBQUEsU0FBQUosaUJBQUFGLENBQUEsOEJBQUFpQixNQUFBLFlBQUFqQixDQUFBLENBQUFpQixNQUFBLENBQUFDLFFBQUEsYUFBQWxCLENBQUEsdUJBQUFjLEtBQUEsQ0FBQUMsSUFBQSxDQUFBZixDQUFBO0FBQUEsU0FBQUMsbUJBQUFELENBQUEsUUFBQWMsS0FBQSxDQUFBSyxPQUFBLENBQUFuQixDQUFBLFVBQUFPLGlCQUFBLENBQUFQLENBQUE7QUFBQSxT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