@lskjs/server
Version:
LSK server.
669 lines (556 loc) • 47.6 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _get3 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _applyDecoratedDescriptor2 = _interopRequireDefault(require("@babel/runtime/helpers/applyDecoratedDescriptor"));
var _express = _interopRequireDefault(require("express"));
var _path2 = _interopRequireDefault(require("path"));
var _mapValues = _interopRequireDefault(require("lodash/mapValues"));
var _get4 = _interopRequireDefault(require("lodash/get"));
var _forEach = _interopRequireDefault(require("lodash/forEach"));
var _flattenDeep = _interopRequireDefault(require("lodash/flattenDeep"));
var _map = _interopRequireDefault(require("lodash/map"));
var _connectStaticFile = _interopRequireDefault(require("connect-static-file"));
var _apiquery = _interopRequireDefault(require("@lskjs/apiquery"));
var _autobind = _interopRequireDefault(require("@lskjs/utils/autobind"));
var _i = _interopRequireDefault(require("@lskjs/i18"));
var _server = _interopRequireDefault(require("@lskjs/db/server"));
var _e2 = _interopRequireDefault(require("@lskjs/utils/e"));
var _module = _interopRequireDefault(require("@lskjs/module"));
var _http = _interopRequireDefault(require("http"));
var _config = _interopRequireDefault(require("./config"));
var _ws = _interopRequireDefault(require("./ws"));
var _class, _temp;
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function () { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
var DEBUG = __DEV__ && false;
var ServerApp = (_class = (_temp = /*#__PURE__*/function (_Module) {
(0, _inherits2["default"])(ServerApp, _Module);
var _super = _createSuper(ServerApp);
function ServerApp() {
var _this;
(0, _classCallCheck2["default"])(this, ServerApp);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
_this._module = 'app';
_this.name = 'App';
_this.i18 = new _i["default"]({
ctx: (0, _assertThisInitialized2["default"])(_this)
});
_this.getDocsRouter = require('./methods/getDocsRouter')["default"];
_this.getDocsTemplate = function () {
return 'deprecated';
};
_this.expressResolve = require('./methods/expressResolve')["default"];
_this.runRedis = require('./methods/runRedis')["default"];
_this.runRoutes = require('./methods/runRoutes')["default"];
return _this;
}
(0, _createClass2["default"])(ServerApp, [{
key: "init",
value: function () {
var _init = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
var _this2 = this;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return (0, _get3["default"])((0, _getPrototypeOf2["default"])(ServerApp.prototype), "init", this).call(this);
case 2:
if (DEBUG) this.log.trace('ServerApp init');
this.express = this.createExpress(); // this.app = this.express; // Fallback
this.serverConfig = this.config.server || _config["default"];
this.httpServer = _http["default"].createServer(this.express);
if (this.serverConfig.express && Object.keys(this.serverConfig.express).length) {
this.log.trace('serverConfig.express:', this.serverConfig.express);
(0, _forEach["default"])(this.serverConfig.express || {}, function (value, key) {
_this2.express.set(key, value);
});
}
_context.next = 9;
return this.getDatabase();
case 9:
this.db = _context.sent;
this.responses = this.getResponses();
if (DEBUG) this.log.debug('responses', Object.keys(this.responses));
if (DEBUG) this.log.debug('serverConfig.middlewares', this.serverConfig.middlewares);
this.middlewares = this.getMiddlewares();
this.log.debug('middlewares', Object.keys(this.middlewares));
this.helpers = this.getHelpers();
if (DEBUG) this.log.debug('helpers', Object.keys(this.helpers));
this.statics = this._getStatics();
this.log.debug('statics', this.statics);
this.api = new _apiquery["default"]({
url: this.url('/'),
log: this.log
});
if (this.serverConfig.ws) this.initWs();
if (!this.i18) {
_context.next = 24;
break;
}
_context.next = 24;
return this.i18.setState({
log: this.log,
config: this.config.i18,
getLocale: this.getLocale
}).init();
case 24:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function init() {
return _init.apply(this, arguments);
}
return init;
}()
}, {
key: "afterInit",
value: function () {
var _afterInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
// super.afterInit(...arguments);
this.models = this.getMongooseModels();
this.log.debug('models', Object.keys(this.models));
_context2.next = 4;
return this.runModels();
case 4:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function afterInit() {
return _afterInit.apply(this, arguments);
}
return afterInit;
}()
}, {
key: "url",
value: function url(str) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
var query = '';
if (params && Object.keys(params.length)) {
query = "?".concat((0, _map["default"])(params, function (val, key) {
return "".concat(key, "=").concat(val);
}).join('&'));
} // `http://127.0.0.1:${this.config.port || this.serverConfig.port}`,
return "".concat(this.config.url || this.serverConfig.url || '/').concat(str).concat(query);
}
}, {
key: "e",
value: function e() {
for (var _len2 = arguments.length, params = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
params[_key2] = arguments[_key2];
}
return _e2["default"].call.apply(_e2["default"], [this].concat(params));
} // emit(...args) {
// this.modules && this.modules.events && this.modules.events.emit(...args); // eslint-disable-line
// }
// on(...args) {
// this.modules && this.modules.events && this.modules.events.on(...args); // eslint-disable-line
// }
// once(...args) {
// this.modules && this.modules.events && this.modules.events.once(...args); // eslint-disable-line
// }
}, {
key: "getMiddlewares",
value: function getMiddlewares() {
return require('./middlewares')["default"](this); // eslint-disable-line
}
}, {
key: "getMongooseModels",
value: function getMongooseModels() {
var _this3 = this;
var models = this.getModels();
(0, _forEach["default"])(this.modules, function (mdl, moduleName) {
var models2 = {};
if (mdl.getModels) {
models2 = mdl.getModels();
} else if (mdl.models) {
models2 = mdl.models;
} // console.log('models2', Object.keys(models2));
(0, _forEach["default"])(models2, function (model, modelName) {
if (models[modelName]) {
_this3.log.error("ServerApp.getMongooseModels: CONFLICT modules/".concat(moduleName, "/").concat(modelName)); // eslint-disable-line no-console
return;
}
models[modelName] = models2[modelName];
});
});
return (0, _mapValues["default"])(models, function (model) {
if (model._universal) {
return model.getMongooseModel(_this3.db);
}
return model;
});
}
}, {
key: "getModels",
value: function getModels() {
return {};
}
}, {
key: "getDatabase",
value: function getDatabase() {
return this.config.db ? (0, _server["default"])(this, this.config.db) : null;
}
}, {
key: "getErrors",
value: function getErrors() {
return require('./getErrors')["default"](this);
}
}, {
key: "getResponses",
value: function getResponses() {
return require('./responses')["default"](this);
}
}, {
key: "getHelpers",
value: function getHelpers() {
return require('./helpers')["default"](this);
}
}, {
key: "getStaticsDir",
value: function getStaticsDir(dirPath) {
var fs = require('fs');
var readdirSync = fs.readdirSync;
var files = readdirSync(dirPath).filter(function (p) {
return p !== '.' && p !== '..';
});
var res = {};
files.forEach(function (file) {
res["/".concat(file)] = "".concat(dirPath, "/").concat(file);
});
return res;
}
}, {
key: "getEnv",
value: function getEnv(req) {
return {
__ROOT_STATE__: {
token: req.token,
user: req.user,
req: {
token: req.token,
user: req.user
},
config: this.config.client || {}
},
__DEV__: __DEV__,
__STAGE__: global.__STAGE__
};
}
}, {
key: "getStatics",
value: function getStatics() {
if (this.serverConfig && this.serverConfig["public"]) {
return this.getStaticsDir(this.serverConfig["public"]);
}
return {};
}
}, {
key: "_getStatics",
value: function _getStatics() {
return (0, _mapValues["default"])(this.getStatics() || {}, function (p) {
return _path2["default"].resolve(p);
});
}
}, {
key: "runStatics",
value: function runStatics() {
var _this4 = this;
(0, _forEach["default"])(this.statics, function (_path, url) {
_this4.express.use(url, _express["default"]["static"](_path));
_this4.express.use(url, (0, _connectStaticFile["default"])(_path));
});
}
}, {
key: "getUsingMiddlewares",
value: function getUsingMiddlewares() {
return [this.middlewares.extendReqRes, this.middlewares.reqLog, this.middlewares.accessLogger, this.middlewares.reqParser, this.middlewares.reqData, this.middlewares.parseToken, this.middlewares.parseUser, this.middlewares.i18];
}
}, {
key: "initWs",
value: function initWs() {
this.ws = (0, _ws["default"])(this);
this.ws.wrapExpress(this.express);
}
}, {
key: "runWs",
value: function () {
var _runWs = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
var transports;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
if (this.serverConfig.ws) {
_context3.next = 2;
break;
}
return _context3.abrupt("return");
case 2:
if (DEBUG) this.log.trace('ServerApp.runWs');
this.ws.serveClient(false);
this.ws.attach(this.httpServer);
transports = this.serverConfig.ws.transports || ['websocket'];
this.ws.set('transports', transports);
if (this.serverConfig.ws.origins) this.ws.set('origins', this.serverConfig.ws.origins);
case 8:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
}));
function runWs() {
return _runWs.apply(this, arguments);
}
return runWs;
}()
}, {
key: "runMiddlewares",
value: function runMiddlewares() {
var _this5 = this;
if (DEBUG) this.log.trace('ServerApp.runMiddlewares');
var middlewares = (0, _flattenDeep["default"])(this.getUsingMiddlewares());
middlewares.forEach(function (middleware) {
if (middleware && typeof middleware === 'function') _this5.express.use(middleware);
});
}
}, {
key: "runDefaultRoute",
value: function runDefaultRoute() {
var _this6 = this;
if (DEBUG) this.log.trace('ServerApp.runDefaultRoute');
this.express.use(function (req, res, next) {
next(_this6.e('ROUTE_NOT_FOUND', {
status: 404
}));
});
}
}, {
key: "runCatchErrors",
value: function runCatchErrors() {
if (this.middlewares.catchError) this.express.use(this.middlewares.catchError);
}
}, {
key: "runModels",
value: function runModels() {
var _this7 = this;
var promises = (0, _map["default"])(this.models, /*#__PURE__*/function () {
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(model, name) {
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
if (!model.run) {
_context4.next = 4;
break;
}
_context4.next = 3;
return model.run(_this7);
case 3:
_this7.models[name] = _context4.sent;
case 4:
case "end":
return _context4.stop();
}
}
}, _callee4);
}));
return function (_x, _x2) {
return _ref.apply(this, arguments);
};
}());
return Promise.all(promises);
}
}, {
key: "run",
// getI18 = require('../Uapp/i18/getI18').default;
// getI18Params = require('../Uapp/i18/getI18Params').default;
// getLocale = require('../Uapp/i18/getLocale').default;
// initI18 = require('../Uapp/i18/initI18').default;
value: function () {
var _run = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
var _get2;
var _len3,
args,
_key3,
_args5 = arguments;
return _regenerator["default"].wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
for (_len3 = _args5.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = _args5[_key3];
}
_context5.next = 3;
return (_get2 = (0, _get3["default"])((0, _getPrototypeOf2["default"])(ServerApp.prototype), "run", this)).call.apply(_get2, [this].concat(args));
case 3:
if (DEBUG) this.log.trace('ServerApp.run');
if (!this.db) {
_context5.next = 7;
break;
}
_context5.next = 7;
return this.db.run();
case 7:
if (!this.serverConfig.ws) {
_context5.next = 10;
break;
}
_context5.next = 10;
return this.runWs();
case 10:
if (!this.config.redis) {
_context5.next = 13;
break;
}
_context5.next = 13;
return this.runRedis();
case 13:
this.runStatics();
this.runMiddlewares();
case 15:
case "end":
return _context5.stop();
}
}
}, _callee5, this);
}));
function run() {
return _run.apply(this, arguments);
}
return run;
}()
}, {
key: "createExpress",
value: function createExpress() {
return (0, _express["default"])();
}
}, {
key: "afterRun",
value: function () {
var _afterRun = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
var _this8 = this;
return _regenerator["default"].wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
if (DEBUG) this.log.trace('ServerApp afterRun');
this.runRoutes();
this.runDefaultRoute();
this.runCatchErrors();
return _context6.abrupt("return", new Promise(function (resolve) {
_this8.httpInstance = _this8.httpServer.listen(_this8.config.port || _this8.serverConfig.port, function () {
resolve(_this8);
});
}));
case 5:
case "end":
return _context6.stop();
}
}
}, _callee6, this);
}));
function afterRun() {
return _afterRun.apply(this, arguments);
}
return afterRun;
}()
}, {
key: "stop",
value: function () {
var _stop = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
var _this9 = this;
return _regenerator["default"].wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
_context7.next = 2;
return (0, _get3["default"])((0, _getPrototypeOf2["default"])(ServerApp.prototype), "stop", this).call(this);
case 2:
if (!this.db) {
_context7.next = 5;
break;
}
_context7.next = 5;
return this.db.stop();
case 5:
_context7.next = 7;
return new Promise(function (resolved) {
if (_this9.httpInstance) {
_this9.httpInstance.close(resolved);
} else {
resolved();
}
});
case 7:
case "end":
return _context7.stop();
}
}
}, _callee7, this);
}));
function stop() {
return _stop.apply(this, arguments);
}
return stop;
}()
}, {
key: "started",
value: function () {
var _started = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
var timing, str;
return _regenerator["default"].wrap(function _callee8$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
timing = global.timing ? "[".concat(global.timing(), "ms]") : '';
str = "\uD83C\uDF83 The server is running at http://127.0.0.1:".concat(this.httpInstance.address().port, "/ ").concat(timing);
if (__DEV__) {
console.log(str); // eslint-disable-line no-console
} else {
this.log.warn(str);
}
case 3:
case "end":
return _context8.stop();
}
}
}, _callee8, this);
}));
function started() {
return _started.apply(this, arguments);
}
return started;
}()
}]);
return ServerApp;
}(_module["default"]), _temp), ((0, _applyDecoratedDescriptor2["default"])(_class.prototype, "url", [_autobind["default"]], Object.getOwnPropertyDescriptor(_class.prototype, "url"), _class.prototype)), _class);
exports["default"] = ServerApp;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TZXJ2ZXJBcHAuanMiXSwibmFtZXMiOlsiREVCVUciLCJfX0RFVl9fIiwiU2VydmVyQXBwIiwiX21vZHVsZSIsIm5hbWUiLCJpMTgiLCJJMTgiLCJjdHgiLCJnZXREb2NzUm91dGVyIiwicmVxdWlyZSIsImdldERvY3NUZW1wbGF0ZSIsImV4cHJlc3NSZXNvbHZlIiwicnVuUmVkaXMiLCJydW5Sb3V0ZXMiLCJsb2ciLCJ0cmFjZSIsImV4cHJlc3MiLCJjcmVhdGVFeHByZXNzIiwic2VydmVyQ29uZmlnIiwiY29uZmlnIiwic2VydmVyIiwiZGVmYXVsdFNlcnZlckNvbmZpZyIsImh0dHBTZXJ2ZXIiLCJodHRwIiwiY3JlYXRlU2VydmVyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsInZhbHVlIiwia2V5Iiwic2V0IiwiZ2V0RGF0YWJhc2UiLCJkYiIsInJlc3BvbnNlcyIsImdldFJlc3BvbnNlcyIsImRlYnVnIiwibWlkZGxld2FyZXMiLCJnZXRNaWRkbGV3YXJlcyIsImhlbHBlcnMiLCJnZXRIZWxwZXJzIiwic3RhdGljcyIsIl9nZXRTdGF0aWNzIiwiYXBpIiwiQXBpcXVlcnkiLCJ1cmwiLCJ3cyIsImluaXRXcyIsInNldFN0YXRlIiwiZ2V0TG9jYWxlIiwiaW5pdCIsIm1vZGVscyIsImdldE1vbmdvb3NlTW9kZWxzIiwicnVuTW9kZWxzIiwic3RyIiwicGFyYW1zIiwicXVlcnkiLCJ2YWwiLCJqb2luIiwiZSIsImNhbGwiLCJnZXRNb2RlbHMiLCJtb2R1bGVzIiwibWRsIiwibW9kdWxlTmFtZSIsIm1vZGVsczIiLCJtb2RlbCIsIm1vZGVsTmFtZSIsImVycm9yIiwiX3VuaXZlcnNhbCIsImdldE1vbmdvb3NlTW9kZWwiLCJkaXJQYXRoIiwiZnMiLCJyZWFkZGlyU3luYyIsImZpbGVzIiwiZmlsdGVyIiwicCIsInJlcyIsImZvckVhY2giLCJmaWxlIiwicmVxIiwiX19ST09UX1NUQVRFX18iLCJ0b2tlbiIsInVzZXIiLCJjbGllbnQiLCJfX1NUQUdFX18iLCJnbG9iYWwiLCJnZXRTdGF0aWNzRGlyIiwiZ2V0U3RhdGljcyIsInBhdGgiLCJyZXNvbHZlIiwiX3BhdGgiLCJ1c2UiLCJleHRlbmRSZXFSZXMiLCJyZXFMb2ciLCJhY2Nlc3NMb2dnZXIiLCJyZXFQYXJzZXIiLCJyZXFEYXRhIiwicGFyc2VUb2tlbiIsInBhcnNlVXNlciIsIndyYXBFeHByZXNzIiwic2VydmVDbGllbnQiLCJhdHRhY2giLCJ0cmFuc3BvcnRzIiwib3JpZ2lucyIsImdldFVzaW5nTWlkZGxld2FyZXMiLCJtaWRkbGV3YXJlIiwibmV4dCIsInN0YXR1cyIsImNhdGNoRXJyb3IiLCJwcm9taXNlcyIsInJ1biIsIlByb21pc2UiLCJhbGwiLCJhcmdzIiwicnVuV3MiLCJyZWRpcyIsInJ1blN0YXRpY3MiLCJydW5NaWRkbGV3YXJlcyIsInJ1bkRlZmF1bHRSb3V0ZSIsInJ1bkNhdGNoRXJyb3JzIiwiaHR0cEluc3RhbmNlIiwibGlzdGVuIiwicG9ydCIsInN0b3AiLCJyZXNvbHZlZCIsImNsb3NlIiwidGltaW5nIiwiYWRkcmVzcyIsImNvbnNvbGUiLCJ3YXJuIiwiTW9kdWxlIiwiYXV0b2JpbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7Ozs7Ozs7O0FBRUEsSUFBTUEsS0FBSyxHQUFHQyxPQUFPLElBQUksS0FBekI7SUFDcUJDLFM7Ozs7Ozs7Ozs7Ozs7OztVQUNuQkMsTyxHQUFVLEs7VUFDVkMsSSxHQUFPLEs7VUFFUEMsRyxHQUFNLElBQUlDLGFBQUosQ0FBUTtBQUFFQyxNQUFBQSxHQUFHO0FBQUwsS0FBUixDO1VBcU5OQyxhLEdBQWdCQyxPQUFPLENBQUMseUJBQUQsQ0FBUCxXOztVQUNoQkMsZSxHQUFrQjtBQUFBLGFBQU0sWUFBTjtBQUFBLEs7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RSxHQUFkO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWhSa0M2RSxrQixpRkFtRHBDQyxvQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGdsb2JhbC1yZXF1aXJlICovXG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IG1hcFZhbHVlcyBmcm9tICdsb2Rhc2gvbWFwVmFsdWVzJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2dldCc7XG5pbXBvcnQgZm9yRWFjaCBmcm9tICdsb2Rhc2gvZm9yRWFjaCc7XG5pbXBvcnQgZmxhdHRlbkRlZXAgZnJvbSAnbG9kYXNoL2ZsYXR0ZW5EZWVwJztcbmltcG9ydCBtYXAgZnJvbSAnbG9kYXNoL21hcCc7XG5pbXBvcnQgc3RhdGljRmlsZU1pZGRsZXdhcmUgZnJvbSAnY29ubmVjdC1zdGF0aWMtZmlsZSc7XG5pbXBvcnQgQXBpcXVlcnkgZnJvbSAnQGxza2pzL2FwaXF1ZXJ5JztcbmltcG9ydCBhdXRvYmluZCBmcm9tICdAbHNranMvdXRpbHMvYXV0b2JpbmQnO1xuaW1wb3J0IEkxOCBmcm9tICdAbHNranMvaTE4JztcbmltcG9ydCBkYiBmcm9tICdAbHNranMvZGIvc2VydmVyJztcbmltcG9ydCBlIGZyb20gJ0Bsc2tqcy91dGlscy9lJztcbmltcG9ydCBNb2R1bGUgZnJvbSAnQGxza2pzL21vZHVsZSc7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCBkZWZhdWx0U2VydmVyQ29uZmlnIGZyb20gJy4vY29uZmlnJztcblxuaW1wb3J0IGNyZWF0ZVdzIGZyb20gJy4vd3MnO1xuXG5jb25zdCBERUJVRyA9IF9fREVWX18gJiYgZmFsc2U7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJ2ZXJBcHAgZXh0ZW5kcyBNb2R1bGUge1xuICBfbW9kdWxlID0gJ2FwcCc7XG4gIG5hbWUgPSAnQXBwJztcbiAgLy8gQXBpID0gQXBpO1xuICBpMTggPSBuZXcgSTE4KHsgY3R4OiB0aGlzIH0pO1xuICBhc3luYyBpbml0KCkge1xuICAgIGF3YWl0IHN1cGVyLmluaXQoKTtcbiAgICBpZiAoREVCVUcpIHRoaXMubG9nLnRyYWNlKCdTZXJ2ZXJBcHAgaW5pdCcpO1xuICAgIHRoaXMuZXhwcmVzcyA9IHRoaXMuY3JlYXRlRXhwcmVzcygpO1xuICAgIC8vIHRoaXMuYXBwID0gdGhpcy5leHByZXNzOyAvLyBGYWxsYmFja1xuICAgIHRoaXMuc2VydmVyQ29uZmlnID0gdGhpcy5jb25maWcuc2VydmVyIHx8IGRlZmF1bHRTZXJ2ZXJDb25maWc7XG4gICAgdGhpcy5odHRwU2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIodGhpcy5leHByZXNzKTtcbiAgICBpZiAodGhpcy5zZXJ2ZXJDb25maWcuZXhwcmVzcyAmJiBPYmplY3Qua2V5cyh0aGlzLnNlcnZlckNvbmZpZy5leHByZXNzKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMubG9nLnRyYWNlKCdzZXJ2ZXJDb25maWcuZXhwcmVzczonLCB0aGlzLnNlcnZlckNvbmZpZy5leHByZXNzKTtcbiAgICAgIGZvckVhY2godGhpcy5zZXJ2ZXJDb25maWcuZXhwcmVzcyB8fCB7fSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgdGhpcy5leHByZXNzLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmRiID0gYXdhaXQgdGhpcy5nZXREYXRhYmFzZSgpO1xuICAgIHRoaXMucmVzcG9uc2VzID0gdGhpcy5nZXRSZXNwb25zZXMoKTtcbiAgICBpZiAoREVCVUcpIHRoaXMubG9nLmRlYnVnKCdyZXNwb25zZXMnLCBPYmplY3Qua2V5cyh0aGlzLnJlc3BvbnNlcykpO1xuICAgIGlmIChERUJVRykgdGhpcy5sb2cuZGVidWcoJ3NlcnZlckNvbmZpZy5taWRkbGV3YXJlcycsIHRoaXMuc2VydmVyQ29uZmlnLm1pZGRsZXdhcmVzKTtcbiAgICB0aGlzLm1pZGRsZXdhcmVzID0gdGhpcy5nZXRNaWRkbGV3YXJlcygpO1xuICAgIHRoaXMubG9nLmRlYnVnKCdtaWRkbGV3YXJlcycsIE9iamVjdC5rZXlzKHRoaXMubWlkZGxld2FyZXMpKTtcbiAgICB0aGlzLmhlbHBlcnMgPSB0aGlzLmdldEhlbHBlcnMoKTtcbiAgICBpZiAoREVCVUcpIHRoaXMubG9nLmRlYnVnKCdoZWxwZXJzJywgT2JqZWN0LmtleXModGhpcy5oZWxwZXJzKSk7XG4gICAgdGhpcy5zdGF0aWNzID0gdGhpcy5fZ2V0U3RhdGljcygpO1xuICAgIHRoaXMubG9nLmRlYnVnKCdzdGF0aWNzJywgdGhpcy5zdGF0aWNzKTtcbiAgICB0aGlzLmFwaSA9IG5ldyBBcGlxdWVyeSh7XG4gICAgICB1cmw6IHRoaXMudXJsKCcvJyksXG4gICAgICBsb2c6IHRoaXMubG9nLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLnNlcnZlckNvbmZpZy53cykgdGhpcy5pbml0V3MoKTtcbiAgICBpZiAodGhpcy5pMTgpIHtcbiAgICAgIGF3YWl0IHRoaXMuaTE4XG4gICAgICAgIC5zZXRTdGF0ZSh7XG4gICAgICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnLmkxOCxcbiAgICAgICAgICBnZXRMb2NhbGU6IHRoaXMuZ2V0TG9jYWxlLFxuICAgICAgICB9KVxuICAgICAgICAuaW5pdCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFmdGVySW5pdCgpIHtcbiAgICAvLyBzdXBlci5hZnRlckluaXQoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLm1vZGVscyA9IHRoaXMuZ2V0TW9uZ29vc2VNb2RlbHMoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnbW9kZWxzJywgT2JqZWN0LmtleXModGhpcy5tb2RlbHMpKTtcbiAgICBhd2FpdCB0aGlzLnJ1bk1vZGVscygpO1xuICB9XG5cbiAgQGF1dG9iaW5kXG4gIHVybChzdHIsIHBhcmFtcyA9IG51bGwpIHtcbiAgICBsZXQgcXVlcnkgPSAnJztcbiAgICBpZiAocGFyYW1zICYmIE9iamVjdC5rZXlzKHBhcmFtcy5sZW5ndGgpKSB7XG4gICAgICBxdWVyeSA9IGA/JHttYXAocGFyYW1zLCAodmFsLCBrZXkpID0+IGAke2tleX09JHt2YWx9YCkuam9pbignJicpfWA7XG4gICAgfVxuICAgIC8vIGBodHRwOi8vMTI3LjAuMC4xOiR7dGhpcy5jb25maWcucG9ydCB8fCB0aGlzLnNlcnZlckNvbmZpZy5wb3J0fWAsXG4gICAgcmV0dXJuIGAke3RoaXMuY29uZmlnLnVybCB8fCB0aGlzLnNlcnZlckNvbmZpZy51cmwgfHwgJy8nfSR7c3RyfSR7cXVlcnl9YDtcbiAgfVxuXG4gIGUoLi4ucGFyYW1zKSB7XG4gICAgcmV0dXJuIGUuY2FsbCh0aGlzLCAuLi5wYXJhbXMpO1xuICB9XG5cbiAgLy8gZW1pdCguLi5hcmdzKSB7XG4gIC8vICAgdGhpcy5tb2R1bGVzICYmIHRoaXMubW9kdWxlcy5ldmVudHMgJiYgdGhpcy5tb2R1bGVzLmV2ZW50cy5lbWl0KC4uLmFyZ3MpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIC8vIH1cbiAgLy8gb24oLi4uYXJncykge1xuICAvLyAgIHRoaXMubW9kdWxlcyAmJiB0aGlzLm1vZHVsZXMuZXZlbnRzICYmIHRoaXMubW9kdWxlcy5ldmVudHMub24oLi4uYXJncyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgLy8gfVxuICAvLyBvbmNlKC4uLmFyZ3MpIHtcbiAgLy8gICB0aGlzLm1vZHVsZXMgJiYgdGhpcy5tb2R1bGVzLmV2ZW50cyAmJiB0aGlzLm1vZHVsZXMuZXZlbnRzLm9uY2UoLi4uYXJncyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgLy8gfVxuXG4gIGdldE1pZGRsZXdhcmVzKCkge1xuICAgIHJldHVybiByZXF1aXJlKCcuL21pZGRsZXdhcmVzJykuZGVmYXVsdCh0aGlzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICB9XG4gIGdldE1vbmdvb3NlTW9kZWxzKCkge1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMuZ2V0TW9kZWxzKCk7XG4gICAgZm9yRWFjaCh0aGlzLm1vZHVsZXMsIChtZGwsIG1vZHVsZU5hbWUpID0+IHtcbiAgICAgIGxldCBtb2RlbHMyID0ge307XG4gICAgICBpZiAobWRsLmdldE1vZGVscykge1xuICAgICAgICBtb2RlbHMyID0gbWRsLmdldE1vZGVscygpO1xuICAgICAgfSBlbHNlIGlmIChtZGwubW9kZWxzKSB7XG4gICAgICAgIG1vZGVsczIgPSBtZGwubW9kZWxzO1xuICAgICAgfVxuICAgICAgLy8gY29uc29sZS5sb2coJ21vZGVsczInLCBPYmplY3Qua2V5cyhtb2RlbHMyKSk7XG4gICAgICBmb3JFYWNoKG1vZGVsczIsIChtb2RlbCwgbW9kZWxOYW1lKSA9PiB7XG4gICAgICAgIGlmIChtb2RlbHNbbW9kZWxOYW1lXSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBTZXJ2ZXJBcHAuZ2V0TW9uZ29vc2VNb2RlbHM6IENPTkZMSUNUIG1vZHVsZXMvJHttb2R1bGVOYW1lfS8ke21vZGVsTmFtZX1gKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG1vZGVsc1ttb2RlbE5hbWVdID0gbW9kZWxzMlttb2RlbE5hbWVdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hcFZhbHVlcyhtb2RlbHMsIG1vZGVsID0+IHtcbiAgICAgIGlmIChtb2RlbC5fdW5pdmVyc2FsKSB7XG4gICAgICAgIHJldHVybiBtb2RlbC5nZXRNb25nb29zZU1vZGVsKHRoaXMuZGIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH0pO1xuICB9XG4gIGdldE1vZGVscygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0RGF0YWJhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRiID8gZGIodGhpcywgdGhpcy5jb25maWcuZGIpIDogbnVsbDtcbiAgfVxuICBnZXRFcnJvcnMoKSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJy4vZ2V0RXJyb3JzJykuZGVmYXVsdCh0aGlzKTtcbiAgfVxuICBnZXRSZXNwb25zZXMoKSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJy4vcmVzcG9uc2VzJykuZGVmYXVsdCh0aGlzKTtcbiAgfVxuICBnZXRIZWxwZXJzKCkge1xuICAgIHJldHVybiByZXF1aXJlKCcuL2hlbHBlcnMnKS5kZWZhdWx0KHRoaXMpO1xuICB9XG4gIGdldFN0YXRpY3NEaXIoZGlyUGF0aCkge1xuICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgICBjb25zdCB7IHJlYWRkaXJTeW5jIH0gPSBmcztcbiAgICBjb25zdCBmaWxlcyA9IHJlYWRkaXJTeW5jKGRpclBhdGgpLmZpbHRlcihwID0+IHAgIT09ICcuJyAmJiBwICE9PSAnLi4nKTtcbiAgICBjb25zdCByZXMgPSB7fTtcbiAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgcmVzW2AvJHtmaWxlfWBdID0gYCR7ZGlyUGF0aH0vJHtmaWxlfWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGdldEVudihyZXEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19ST09UX1NUQVRFX186IHtcbiAgICAgICAgdG9rZW46IHJlcS50b2tlbixcbiAgICAgICAgdXNlcjogcmVxLnVzZXIsXG4gICAgICAgIHJlcToge1xuICAgICAgICAgIHRva2VuOiByZXEudG9rZW4sXG4gICAgICAgICAgdXNlcjogcmVxLnVzZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZzogdGhpcy5jb25maWcuY2xpZW50IHx8IHt9LFxuICAgICAgfSxcbiAgICAgIF9fREVWX18sXG4gICAgICBfX1NUQUdFX186IGdsb2JhbC5fX1NUQUdFX18sXG4gICAgfTtcbiAgfVxuXG4gIGdldFN0YXRpY3MoKSB7XG4gICAgaWYgKHRoaXMuc2VydmVyQ29uZmlnICYmIHRoaXMuc2VydmVyQ29uZmlnLnB1YmxpYykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGljc0Rpcih0aGlzLnNlcnZlckNvbmZpZy5wdWJsaWMpO1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBfZ2V0U3RhdGljcygpIHtcbiAgICByZXR1cm4gbWFwVmFsdWVzKHRoaXMuZ2V0U3RhdGljcygpIHx8IHt9LCBwID0+IHBhdGgucmVzb2x2ZShwKSk7XG4gIH1cblxuICBydW5TdGF0aWNzKCkge1xuICAgIGZvckVhY2godGhpcy5zdGF0aWNzLCAoX3BhdGgsIHVybCkgPT4ge1xuICAgICAgdGhpcy5leHByZXNzLnVzZSh1cmwsIGV4cHJlc3Muc3RhdGljKF9wYXRoKSk7XG4gICAgICB0aGlzLmV4cHJlc3MudXNlKHVybCwgc3RhdGljRmlsZU1pZGRsZXdhcmUoX3BhdGgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFVzaW5nTWlkZGxld2FyZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMubWlkZGxld2FyZXMuZXh0ZW5kUmVxUmVzLFxuICAgICAgdGhpcy5taWRkbGV3YXJlcy5yZXFMb2csXG4gICAgICB0aGlzLm1pZGRsZXdhcmVzLmFjY2Vzc0xvZ2dlcixcbiAgICAgIHRoaXMubWlkZGxld2FyZXMucmVxUGFyc2VyLFxuICAgICAgdGhpcy5taWRkbGV3YXJlcy5yZXFEYXRhLFxuICAgICAgdGhpcy5taWRkbGV3YXJlcy5wYXJzZVRva2VuLFxuICAgICAgdGhpcy5taWRkbGV3YXJlcy5wYXJzZVVzZXIsXG4gICAgICB0aGlzLm1pZGRsZXdhcmVzLmkxOCxcbiAgICBdO1xuICB9XG5cbiAgaW5pdFdzKCkge1xuICAgIHRoaXMud3MgPSBjcmVhdGVXcyh0aGlzKTtcbiAgICB0aGlzLndzLndyYXBFeHByZXNzKHRoaXMuZXhwcmVzcyk7XG4gIH1cbiAgYXN5bmMgcnVuV3MoKSB7XG4gICAgaWYgKCF0aGlzLnNlcnZlckNvbmZpZy53cykgcmV0dXJuO1xuICAgIGlmIChERUJVRykgdGhpcy5sb2cudHJhY2UoJ1NlcnZlckFwcC5ydW5XcycpO1xuICAgIHRoaXMud3Muc2VydmVDbGllbnQoZmFsc2UpO1xuICAgIHRoaXMud3MuYXR0YWNoKHRoaXMuaHR0cFNlcnZlcik7XG4gICAgY29uc3QgdHJhbnNwb3J0cyA9IHRoaXMuc2VydmVyQ29uZmlnLndzLnRyYW5zcG9ydHMgfHwgWyd3ZWJzb2NrZXQnXTtcbiAgICB0aGlzLndzLnNldCgndHJhbnNwb3J0cycsIHRyYW5zcG9ydHMpO1xuICAgIGlmICh0aGlzLnNlcnZlckNvbmZpZy53cy5vcmlnaW5zKSB0aGlzLndzLnNldCgnb3JpZ2lucycsIHRoaXMuc2VydmVyQ29uZmlnLndzLm9yaWdpbnMpO1xuICB9XG5cbiAgcnVuTWlkZGxld2FyZXMoKSB7XG4gICAgaWYgKERFQlVHKSB0aGlzLmxvZy50cmFjZSgnU2VydmVyQXBwLnJ1bk1pZGRsZXdhcmVzJyk7XG4gICAgY29uc3QgbWlkZGxld2FyZXMgPSBmbGF0dGVuRGVlcCh0aGlzLmdldFVzaW5nTWlkZGxld2FyZXMoKSk7XG4gICAgbWlkZGxld2FyZXMuZm9yRWFjaChtaWRkbGV3YXJlID0+IHtcbiAgICAgIGlmIChtaWRkbGV3YXJlICYmIHR5cGVvZiBtaWRkbGV3YXJlID09PSAnZnVuY3Rpb24nKSB0aGlzLmV4cHJlc3MudXNlKG1pZGRsZXdhcmUpO1xuICAgIH0pO1xuICB9XG4gIHJ1bkRlZmF1bHRSb3V0ZSgpIHtcbiAgICBpZiAoREVCVUcpIHRoaXMubG9nLnRyYWNlKCdTZXJ2ZXJBcHAucnVuRGVmYXVsdFJvdXRlJyk7XG4gICAgdGhpcy5leHByZXNzLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIG5leHQodGhpcy5lKCdST1VURV9OT1RfRk9VTkQnLCB7IHN0YXR1czogNDA0IH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bkNhdGNoRXJyb3JzKCkge1xuICAgIGlmICh0aGlzLm1pZGRsZXdhcmVzLmNhdGNoRXJyb3IpIHRoaXMuZXhwcmVzcy51c2UodGhpcy5taWRkbGV3YXJlcy5jYXRjaEVycm9yKTtcbiAgfVxuXG4gIHJ1bk1vZGVscygpIHtcbiAgICBjb25zdCBwcm9taXNlcyA9IG1hcCh0aGlzLm1vZGVscywgYXN5bmMgKG1vZGVsLCBuYW1lKSA9PiB7XG4gICAgICBpZiAobW9kZWwucnVuKSB7XG4gICAgICAgIHRoaXMubW9kZWxzW25hbWVdID0gYXdhaXQgbW9kZWwucnVuKHRoaXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH1cblxuICBnZXREb2NzUm91dGVyID0gcmVxdWlyZSgnLi9tZXRob2RzL2dldERvY3NSb3V0ZXInKS5kZWZhdWx0O1xuICBnZXREb2NzVGVtcGxhdGUgPSAoKSA9PiAnZGVwcmVjYXRlZCc7XG5cbiAgZXhwcmVzc1Jlc29sdmUgPSByZXF1aXJlKCcuL21ldGhvZHMvZXhwcmVzc1Jlc29sdmUnKS5kZWZhdWx0O1xuICBydW5SZWRpcyA9IHJlcXVpcmUoJy4vbWV0aG9kcy9ydW5SZWRpcycpLmRlZmF1bHQ7XG4gIHJ1blJvdXRlcyA9IHJlcXVpcmUoJy4vbWV0aG9kcy9ydW5Sb3V0ZXMnKS5kZWZhdWx0O1xuICAvLyBnZXRJMTggPSByZXF1aXJlKCcuLi9VYXBwL2kxOC9nZXRJMTgnKS5kZWZhdWx0O1xuICAvLyBnZXRJMThQYXJhbXMgPSByZXF1aXJlKCcuLi9VYXBwL2kxOC9nZXRJMThQYXJhbXMnKS5kZWZhdWx0O1xuICAvLyBnZXRMb2NhbGUgPSByZXF1aXJlKCcuLi9VYXBwL2kxOC9nZXRMb2NhbGUnKS5kZWZhdWx0O1xuICAvLyBpbml0STE4ID0gcmVxdWlyZSgnLi4vVWFwcC9pMTgvaW5pdEkxOCcpLmRlZmF1bHQ7XG5cbiAgYXN5bmMgcnVuKC4uLmFyZ3MpIHtcbiAgICBhd2FpdCBzdXBlci5ydW4oLi4uYXJncyk7XG4gICAgaWYgKERFQlVHKSB0aGlzLmxvZy50cmFjZSgnU2VydmVyQXBwLnJ1bicpO1xuICAgIGlmICh0aGlzLmRiKSBhd2FpdCB0aGlzLmRiLnJ1bigpO1xuICAgIGlmICh0aGlzLnNlcnZlckNvbmZpZy53cykgYXdhaXQgdGhpcy5ydW5XcygpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5yZWRpcykgYXdhaXQgdGhpcy5ydW5SZWRpcygpO1xuICAgIHRoaXMucnVuU3RhdGljcygpO1xuICAgIHRoaXMucnVuTWlkZGxld2FyZXMoKTtcbiAgfVxuXG4gIGNyZWF0ZUV4cHJlc3MoKSB7XG4gICAgcmV0dXJuIGV4cHJlc3MoKTtcbiAgfVxuXG4gIGFzeW5jIGFmdGVyUnVuKCkge1xuICAgIGlmIChERUJVRykgdGhpcy5sb2cudHJhY2UoJ1NlcnZlckFwcCBhZnRlclJ1bicpO1xuICAgIHRoaXMucnVuUm91dGVzKCk7XG4gICAgdGhpcy5ydW5EZWZhdWx0Um91dGUoKTtcbiAgICB0aGlzLnJ1bkNhdGNoRXJyb3JzKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5odHRwSW5zdGFuY2UgPSB0aGlzLmh0dHBTZXJ2ZXIubGlzdGVuKHRoaXMuY29uZmlnLnBvcnQgfHwgdGhpcy5zZXJ2ZXJDb25maWcucG9ydCwgKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICBhd2FpdCBzdXBlci5zdG9wKCk7XG4gICAgaWYgKHRoaXMuZGIpIGF3YWl0IHRoaXMuZGIuc3RvcCgpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmVkID0+IHtcbiAgICAgIGlmICh0aGlzLmh0dHBJbnN0YW5jZSkge1xuICAgICAgICB0aGlzLmh0dHBJbnN0YW5jZS5jbG9zZShyZXNvbHZlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRlZCgpIHtcbiAgICBjb25zdCB0aW1pbmcgPSBnbG9iYWwudGltaW5nID8gYFske2dsb2JhbC50aW1pbmcoKX1tc11gIDogJyc7XG4gICAgY29uc3Qgc3RyID0gYPCfjoMgIFRoZSBzZXJ2ZXIgaXMgcnVubmluZyBhdCBodHRwOi8vMTI3LjAuMC4xOiR7dGhpcy5odHRwSW5zdGFuY2UuYWRkcmVzcygpLnBvcnR9LyAke3RpbWluZ31gO1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBjb25zb2xlLmxvZyhzdHIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cud2FybihzdHIpO1xuICAgIH1cbiAgfVxufVxuIl19
//# sourceMappingURL=ServerApp.js.map