UNPKG

@lskjs/server

Version:

LSK server.

669 lines (556 loc) 47.6 kB
"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