/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "dist/"; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 0); /******/ }) /************************************************************************/ /******/ ({ /***/ "./config/config.js": /*!**************************!*\ !*** ./config/config.js ***! \**************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = { system: { db_client: 'mysql', db_host: '127.0.0.1', db_user: 'root', db_password: 'root', db_name: 'bigcapital_system', migrations_dir: './src/system/migrations' }, tenant: { db_client: 'mysql', db_name_prefix: 'bigcapital_tenant_', db_host: '127.0.0.1', db_user: 'root', db_password: 'root', charset: 'utf8', migrations_dir: 'src/database/migrations', seeds_dir: 'src/database/seeds' }, manager: { superUser: 'root', superPassword: 'root' }, mail: { host: 'smtp.mailtrap.io', port: 587, secure: false, username: '842f331d3dc005', password: '172f97b34f1a17' } }; /***/ }), /***/ "./config/index.js": /*!*************************!*\ !*** ./config/index.js ***! \*************************/ /*! no exports provided */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! path */ "path"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var dotenv__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dotenv */ "dotenv"); /* harmony import */ var dotenv__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dotenv__WEBPACK_IMPORTED_MODULE_1__); dotenv__WEBPACK_IMPORTED_MODULE_1___default.a.config({ path: path__WEBPACK_IMPORTED_MODULE_0___default.a.resolve(process.cwd(), '.env.test') }); /***/ }), /***/ "./config/systemKnexfile.js": /*!**********************************!*\ !*** ./config/systemKnexfile.js ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var config = __webpack_require__(/*! ./config */ "./config/config.js"); var configEnv = { client: config.system.db_client, connection: { host: config.system.db_host, user: config.system.db_user, password: config.system.db_password, database: config.system.db_name, charset: 'utf8' }, migrations: { directory: config.system.migrations_dir }, pool: { min: 0, max: 7 } }; module.exports = { development: configEnv, production: configEnv }; /***/ }), /***/ "./src/app.js": /*!********************!*\ !*** ./src/app.js ***! \********************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var helmet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! helmet */ "helmet"); /* harmony import */ var helmet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(helmet__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var express_boom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! express-boom */ "express-boom"); /* harmony import */ var express_boom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(express_boom__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! i18n */ "i18n"); /* harmony import */ var i18n__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(i18n__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var app_root_path__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! app-root-path */ "app-root-path"); /* harmony import */ var app_root_path__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(app_root_path__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var express_fileupload__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-fileupload */ "express-fileupload"); /* harmony import */ var express_fileupload__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_fileupload__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../config */ "./config/index.js"); /* harmony import */ var _database_objection__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/database/objection */ "./src/database/objection.js"); /* harmony import */ var _http__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/http */ "./src/http/index.js"); global.rootPath = app_root_path__WEBPACK_IMPORTED_MODULE_4___default.a.path; var app = express__WEBPACK_IMPORTED_MODULE_0___default()(); // i18n.configure({ // locales: ['en'], // directory: `${__dirname}/resources/locale`, // }); // // i18n init parses req for language headers, cookies, etc. // app.use(i18n.init); // Express configuration app.set('port', process.env.PORT || 3000); app.use(helmet__WEBPACK_IMPORTED_MODULE_1___default()()); app.use(express_boom__WEBPACK_IMPORTED_MODULE_2___default()()); app.use(express__WEBPACK_IMPORTED_MODULE_0___default.a.json()); app.use(express_fileupload__WEBPACK_IMPORTED_MODULE_5___default()({ createParentPath: true })); Object(_http__WEBPACK_IMPORTED_MODULE_8__["default"])(app); /* harmony default export */ __webpack_exports__["default"] = (app); /***/ }), /***/ "./src/collection/NestedSet/index.js": /*!*******************************************!*\ !*** ./src/collection/NestedSet/index.js ***! \*******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return NestedSet; }); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}var NestedSet = /*#__PURE__*/function () { /** * Constructor method. * @param {Object} options - */ function NestedSet(items, options) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, NestedSet); this.options = _objectSpread({ parentId: 'parent_id', id: 'id' }, options); this.items = items || []; this.tree = this.linkChildren(); }_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(NestedSet, [{ key: "setItems", value: function setItems( items) { this.items = items; this.tree = this.linkChildren(); } /** * Link nodes children. */ }, { key: "linkChildren", value: function linkChildren() {var _this = this; if (this.items.length <= 0) return false; var map = {}; this.items.forEach(function (item) { map[item.id] = item; map[item.id].children = {}; }); this.items.forEach(function (item) { var parentNodeId = item[_this.options.parentId]; if (parentNodeId) { map[parentNodeId].children[item.id] = item; } }); return map; } }, { key: "toArray", value: function toArray() {var _this2 = this; var stack = []; var treeNodes = this.items.map(function (i) {return _objectSpread({}, i);}); var walk = function walk(nodes) { nodes.forEach(function (node) { if (!node[_this2.options.parentId]) { stack.push(node); } if (node.children) { var childrenNodes = Object.values(node.children). map(function (i) {return _objectSpread({}, i);}); node.children = childrenNodes; walk(childrenNodes); } }); }; walk(treeNodes); return stack; } }, { key: "getTree", value: function getTree() { return this.tree; } }, { key: "getElementById", value: function getElementById( id) { return this.tree[id] || null; } }, { key: "getParents", value: function getParents( id) {var _this3 = this; var item = this.getElementById(id); var parents = []; var index = 0; var walk = function walk(_item) { if (!item) return; if (index) { parents.push(_item); } if (_item[_this3.options.parentId]) { var parentItem = _this3.getElementById(_item[_this3.options.parentId]); index++; walk(parentItem); } }; walk(item); return parents; } }, { key: "toFlattenArray", value: function toFlattenArray( nodeMapper) { var flattenTree = []; var traversal = function traversal(nodes, parentNode) { nodes.forEach(function (node) { var nodeMapped = node; if (typeof nodeMapper === 'function') { nodeMapped = nodeMapper(nodeMapped, parentNode); } flattenTree.push(nodeMapped); if (node.children && node.children.length > 0) { traversal(node.children, node); } }); }; traversal(this.collection); return flattenTree; } }]);return NestedSet;}(); /***/ }), /***/ "./src/collection/ResourceFieldMetadataCollection.js": /*!***********************************************************!*\ !*** ./src/collection/ResourceFieldMetadataCollection.js ***! \***********************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ResourceFieldMetadataCollection; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _lib_Metable_MetableCollection__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/Metable/MetableCollection */ "./src/lib/Metable/MetableCollection.js"); /* harmony import */ var _models_ResourceFieldMetadata__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/ResourceFieldMetadata */ "./src/models/ResourceFieldMetadata.js"); var ResourceFieldMetadataCollection = /*#__PURE__*/function (_MetableCollection) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default()(ResourceFieldMetadataCollection, _MetableCollection); /** * Constructor method. */ function ResourceFieldMetadataCollection() {var _this;_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ResourceFieldMetadataCollection); _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(ResourceFieldMetadataCollection).call(this)); _this.setModel(_models_ResourceFieldMetadata__WEBPACK_IMPORTED_MODULE_5__["default"]); _this.extraColumns = ['resource_id', 'resource_item_id'];return _this; }return ResourceFieldMetadataCollection;}(_lib_Metable_MetableCollection__WEBPACK_IMPORTED_MODULE_4__["default"]); /***/ }), /***/ "./src/data/ResourceFieldsKeys.js": /*!****************************************!*\ !*** ./src/data/ResourceFieldsKeys.js ***! \****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* eslint-disable quote-props */ /* harmony default export */ __webpack_exports__["default"] = ({ // Expenses. 'expenses': { 'expense_account': { column: ' ', relation: 'accounts.name' }, 'payment_account': { column: 'payment_account_id', relation: 'accounts.id' }, 'account_type': { column: 'account_type_id', relation: 'account_types.id' } }, // Accounts 'accounts': { 'name': { column: 'name' }, 'type': { column: 'account_type_id', relation: 'account_types.id', relationColumn: 'account_types.id' }, 'description': { column: 'description' }, 'code': { column: 'code' }, 'root_type': { column: 'account_type_id', relation: 'account_types.id', relationColumn: 'account_types.root_type' }, 'created_at': { column: 'created_at' } }, // Items 'items': { 'type': { column: 'type' }, 'name': { column: 'name' } }, // Manual Journals 'manual_journals': { 'type': { column: 'transaction_type' }, 'status': { column: 'status' }, 'date': { column: 'date' }, 'journal_number': { column: 'journal_number' }, 'amount': { column: 'amount' }, 'created_at': { column: 'created_at' } } }); /***/ }), /***/ "./src/data/options.js": /*!*****************************!*\ !*** ./src/data/options.js ***! \*****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony default export */ __webpack_exports__["default"] = ({ organization: [ { key: 'name', type: 'string' }, { key: 'base_currency', type: 'string' }, { key: 'industry', type: 'string' }, { key: 'location', type: 'string' }, { key: 'fiscal_year', type: 'string' }, { key: 'language', type: 'string' }, { key: 'time_zone', type: 'string' }, { key: 'date_format', type: 'string' }] }); /***/ }), /***/ "./src/database/knex.js": /*!******************************!*\ !*** ./src/database/knex.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var knex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! knex */ "knex"); /* harmony import */ var knex__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(knex__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/../config/systemKnexfile */ "./config/systemKnexfile.js"); /* harmony import */ var _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_config_systemKnexfile__WEBPACK_IMPORTED_MODULE_3__); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} var config = _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_3___default.a["development"]; var knex = knex__WEBPACK_IMPORTED_MODULE_1___default()(_objectSpread({}, config, {}, Object(objection__WEBPACK_IMPORTED_MODULE_2__["knexSnakeCaseMappers"])({ upperCase: true }))); /* harmony default export */ __webpack_exports__["default"] = (knex); /***/ }), /***/ "./src/database/manager.js": /*!*********************************!*\ !*** ./src/database/manager.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var knex_db_manager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knex-db-manager */ "knex-db-manager"); /* harmony import */ var knex_db_manager__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knex_db_manager__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/../config/systemKnexfile */ "./config/systemKnexfile.js"); /* harmony import */ var _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_systemKnexfile__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/../config/config */ "./config/config.js"); /* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_config_config__WEBPACK_IMPORTED_MODULE_2__); var knexConfig = _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_1___default.a["development"]; var dbManager = knex_db_manager__WEBPACK_IMPORTED_MODULE_0___default.a.databaseManagerFactory({ knex: knexConfig, dbManager: { collate: [], superUser: _config_config__WEBPACK_IMPORTED_MODULE_2___default.a.manager.superUser, superPassword: _config_config__WEBPACK_IMPORTED_MODULE_2___default.a.manager.superPassword } }); /* harmony default export */ __webpack_exports__["default"] = (dbManager); /***/ }), /***/ "./src/database/objection.js": /*!***********************************!*\ !*** ./src/database/objection.js ***! \***********************************/ /*! no exports provided */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _database_knex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/database/knex */ "./src/database/knex.js"); // Bind all Models to a knex instance. If you only have one database in // your server this is all you have to do. For multi database systems, see // the Model.bindKnex() method. objection__WEBPACK_IMPORTED_MODULE_0__["Model"].knex(_database_knex__WEBPACK_IMPORTED_MODULE_1__["default"]); /***/ }), /***/ "./src/http/controllers/AccountTypes.js": /*!**********************************************!*\ !*** ./src/http/controllers/AccountTypes.js ***! \**********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_2___default.a.Router(); router.get('/', this.getAccountTypesList.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_3__["default"])(this.getAccountTypesList.handler)); return router; }, /** * Retrieve accounts types list. */ getAccountTypesList: { validation: [], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var AccountType, accountTypes;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: AccountType = req.models.AccountType;_context.next = 3;return ( AccountType.query());case 3:accountTypes = _context.sent;return _context.abrupt("return", res.status(200).send({ account_types: accountTypes }));case 5:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Accounting.js": /*!********************************************!*\ !*** ./src/http/controllers/Accounting.js ***! \********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray"); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js"); /* harmony import */ var _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/services/Accounting/JournalEntry */ "./src/services/Accounting/JournalEntry.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); /* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/lib/DynamicFilter */ "./src/lib/DynamicFilter/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_5___default.a.Router(); router.get('/manual-journals/:id', this.getManualJournal.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.getManualJournal.handler)); router.get('/manual-journals', this.manualJournals.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.manualJournals.handler)); router.post('/make-journal-entries', this.validateMediaIds, this.validateContactEntries, this.makeJournalEntries.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.makeJournalEntries.handler)); router.post('/manual-journals/:id/publish', this.publishManualJournal.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.publishManualJournal.handler)); router.post('/manual-journals/:id', this.validateMediaIds, this.validateContactEntries, this.editManualJournal.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.editManualJournal.handler)); router["delete"]('/manual-journals/:id', this.deleteManualJournal.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.deleteManualJournal.handler)); router["delete"]('/manual-journals', this.deleteBulkManualJournals.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.deleteBulkManualJournals.handler)); router.post('/recurring-journal-entries', this.recurringJournalEntries.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.recurringJournalEntries.handler)); router.post('quick-journal-entries', this.quickJournalEntries.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.quickJournalEntries.handler)); return router; }, /** * Retrieve manual journals, */ manualJournals: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('custom_view_id').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('stringified_filter_roles').optional().isJSON()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(req, res) {var validationErrors, filter, _req$models, Resource, View, ManualJournal, errorReasons, manualJournalsResource, view, resourceFieldsKeys, dynamicFilter, viewFilter, filterRoles, sortByFilter, manualJournals;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: filter = _objectSpread({ filter_roles: [], page: 1, page_size: 999 }, req.query); if (filter.stringified_filter_roles) { filter.filter_roles = JSON.parse(filter.stringified_filter_roles); }_req$models = req.models, Resource = _req$models.Resource, View = _req$models.View, ManualJournal = _req$models.ManualJournal; errorReasons = [];_context.next = 9;return ( Resource.query(). where('name', 'manual_journals'). withGraphFetched('fields'). first());case 9:manualJournalsResource = _context.sent;if ( manualJournalsResource) {_context.next = 12;break;}return _context.abrupt("return", res.status(400).send({ errors: [{ type: 'MANUAL_JOURNALS.RESOURCE.NOT.FOUND', code: 200 }] }));case 12:_context.next = 14;return ( View.query().onBuild(function (builder) { if (filter.custom_view_id) { builder.where('id', filter.custom_view_id); } else { builder.where('favourite', true); } builder.where('resource_id', manualJournalsResource.id); builder.withGraphFetched('roles.field'); builder.withGraphFetched('columns'); builder.first(); builder.remember(); }));case 14:view = _context.sent; resourceFieldsKeys = manualJournalsResource.fields.map(function (c) {return c.key;}); dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilter"](ManualJournal.tableName); // Dynamic filter with view roles. if (view && view.roles.length > 0) { viewFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilterViews"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_11__["mapViewRolesToConditionals"])(view.roles), view.rolesLogicExpression); if (!viewFilter.validateFilterRoles()) { errorReasons.push({ type: 'VIEW.LOGIC.EXPRESSION.INVALID', code: 400 }); } dynamicFilter.setFilter(viewFilter); } // Dynamic filter with filter roles. if (filter.filter_roles.length > 0) { // Validate the accounts resource fields. filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilterFilterRoles"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_11__["mapFilterRolesToDynamicFilter"])(filter.filter_roles), manualJournalsResource.fields); dynamicFilter.setFilter(filterRoles); if (filterRoles.validateFilterRoles().length > 0) { errorReasons.push({ type: 'MANUAL.JOURNAL.HAS.NO.FIELDS', code: 500 }); } } // Dynamic filter with column sort order. if (filter.column_sort_order) { if (resourceFieldsKeys.indexOf(filter.column_sort_order) === -1) { errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 }); } sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilterSortBy"]( filter.column_sort_order, filter.sort_order); dynamicFilter.setFilter(sortByFilter); }if (!( errorReasons.length > 0)) {_context.next = 22;break;}return _context.abrupt("return", res.status(400).send({ errors: errorReasons }));case 22:_context.next = 24;return ( ManualJournal.query().onBuild(function (builder) { dynamicFilter.buildQuery()(builder); }).pagination(filter.page - 1, filter.page_size));case 24:manualJournals = _context.sent;return _context.abrupt("return", res.status(200).send({ manualJournals: manualJournals }));case 26:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Validate media ids. * @param {Request} req - * @param {Response} res - * @param {Function} next - */ validateMediaIds: function () {var _validateMediaIds = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2(req, res, next) {var _req$errorReasons;var form, Media, errorReasons, storedMedia, notFoundMedia;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: form = _objectSpread({ media_ids: [] }, req.body); Media = req.models.Media; errorReasons = []; // Validate if media ids was not already exists on the storage. if (!(form.media_ids.length > 0)) {_context2.next = 9;break;}_context2.next = 6;return ( Media.query().whereIn('id', form.media_ids));case 6:storedMedia = _context2.sent; notFoundMedia = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(form.media_ids, storedMedia.map(function (m) {return m.id;})); if (notFoundMedia.length > 0) { errorReasons.push({ type: 'MEDIA.IDS.NOT.FOUND', code: 400, ids: notFoundMedia }); }case 9: req.errorReasons = Array.isArray(req.errorReasons) && req.errorReasons.length ? (_req$errorReasons = req.errorReasons).push.apply(_req$errorReasons, errorReasons) : errorReasons; next();case 11:case "end":return _context2.stop();}}}, _callee2);}));function validateMediaIds(_x3, _x4, _x5) {return _validateMediaIds.apply(this, arguments);}return validateMediaIds;}(), /** * Validate form entries with contact customers and vendors. * @param {Request} req * @param {Response} res * @param {Function} next */ validateContactEntries: function () {var _validateContactEntries = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3(req, res, next) {var _req$errorReasons2;var form, _req$models2, AccountType, Vendor, Customer, errorReasons, customersContacts, vendorsContacts, accountsTypes, payableAccountsType, receivableAccountsType, customersContactsIds, storedContacts, storedContactsIds, formEntriesCustomersIds, notFoundContactsIds, notReceivableAccounts, vendorsContactsIds, _storedContacts, _storedContactsIds, formEntriesVendorsIds, _notFoundContactsIds, notPayableAccounts;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: form = _objectSpread({ entries: [] }, req.body);_req$models2 = req.models, AccountType = _req$models2.AccountType, Vendor = _req$models2.Vendor, Customer = _req$models2.Customer; errorReasons = []; // Validate the entries contact type and ids. customersContacts = form.entries.filter(function (e) {return e.contact_type === 'customer';}); vendorsContacts = form.entries.filter(function (e) {return e.contact_type === 'vendor';});_context3.next = 7;return ( AccountType.query());case 7:accountsTypes = _context3.sent; payableAccountsType = accountsTypes.find(function (t) {return t.key === 'accounts_payable';});; receivableAccountsType = accountsTypes.find(function (t) {return t.key === 'accounts_receivable';}); // Validate customers contacts. if (!(customersContacts.length > 0)) {_context3.next = 22;break;} customersContactsIds = customersContacts.map(function (c) {return c.contact_id;});_context3.next = 15;return ( Customer.query().whereIn('id', customersContactsIds));case 15:storedContacts = _context3.sent; storedContactsIds = storedContacts.map(function (c) {return c.id;}); formEntriesCustomersIds = form.entries.filter(function (e) {return e.contact_type === 'customer';}); notFoundContactsIds = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])( formEntriesCustomersIds.map(function (c) {return c.contact_id;}), storedContactsIds); if (notFoundContactsIds.length > 0) { errorReasons.push({ type: 'CUSTOMERS.CONTACTS.NOT.FOUND', code: 500, ids: notFoundContactsIds }); } notReceivableAccounts = formEntriesCustomersIds.filter( function (c) {return receivableAccountsType && c.contact_id !== receivableAccountsType.id;}); if (notReceivableAccounts.length > 0) { errorReasons.push({ type: 'CUSTOMERS.ACCOUNTS.NOT.RECEIVABLE.TYPE', code: 700, indexes: notReceivableAccounts.map(function (a) {return a.index;}) }); }case 22:if (!( vendorsContacts.length > 0)) {_context3.next = 33;break;} vendorsContactsIds = vendorsContacts.map(function (c) {return c.contact_id;});_context3.next = 26;return ( Vendor.query().where('id', vendorsContactsIds));case 26:_storedContacts = _context3.sent; _storedContactsIds = _storedContacts.map(function (c) {return c.id;}); formEntriesVendorsIds = form.entries.filter(function (e) {return e.contact_type === 'vendor';}); _notFoundContactsIds = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])( formEntriesVendorsIds.map(function (v) {return v.contact_id;}), _storedContactsIds); if (_notFoundContactsIds.length > 0) { errorReasons.push({ type: 'VENDORS.CONTACTS.NOT.FOUND', code: 600, ids: _notFoundContactsIds }); } notPayableAccounts = formEntriesVendorsIds.filter( function (v) {return payableAccountsType && v.contact_id === payableAccountsType.id;}); if (notPayableAccounts.length > 0) { errorReasons.push({ type: 'VENDORS.ACCOUNTS.NOT.PAYABLE.TYPE', code: 800, indexes: notPayableAccounts.map(function (a) {return a.index;}) }); }case 33: req.errorReasons = Array.isArray(req.errorReasons) && req.errorReasons.length ? (_req$errorReasons2 = req.errorReasons).push.apply(_req$errorReasons2, errorReasons) : errorReasons; next();case 35:case "end":return _context3.stop();}}}, _callee3);}));function validateContactEntries(_x6, _x7, _x8) {return _validateContactEntries.apply(this, arguments);}return validateContactEntries;}(), /** * Make journal entrires. */ makeJournalEntries: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('date').exists().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('journal_number').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('transaction_type').optional({ nullable: true }).trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('reference').optional({ nullable: true }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('status').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries').isArray({ min: 2 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.index').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.credit').optional({ nullable: true }).isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.debit').optional({ nullable: true }).isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.account_id').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.note').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.contact_id').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.contact_type').optional().isIn(['vendor', 'customer']), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('media_ids').optional().isArray(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('media_ids.*').exists().isNumeric().toInt()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee4(req, res) {var validationErrors, form, _req$models3, ManualJournal, Account, MediaLink, totalCredit, totalDebit, user, errorReasons, entries, formattedDate, formEntriesAccountsIds, formEntriesContactsIds, accounts, storedAccountsIds, journalNumber, manualJournal, accountsDepGraph, journalPoster, bulkSaveMediaLink;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: form = _objectSpread({ date: new Date(), transaction_type: 'journal', reference: '', media_ids: [] }, req.body);_req$models3 = req.models, ManualJournal = _req$models3.ManualJournal, Account = _req$models3.Account, MediaLink = _req$models3.MediaLink; totalCredit = 0; totalDebit = 0; user = req.user; errorReasons = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(req.errorReasons || []); entries = form.entries.filter(function (entry) {return entry.credit || entry.debit;}); formattedDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(form.date).format('YYYY-MM-DD'); entries.forEach(function (entry) { if (entry.credit > 0) { totalCredit += entry.credit; } if (entry.debit > 0) { totalDebit += entry.debit; } }); if (totalCredit <= 0 || totalDebit <= 0) { errorReasons.push({ type: 'CREDIT.DEBIT.SUMATION.SHOULD.NOT.EQUAL.ZERO', code: 400 }); } if (totalCredit !== totalDebit) { errorReasons.push({ type: 'CREDIT.DEBIT.NOT.EQUALS', code: 100 }); } formEntriesAccountsIds = entries.map(function (entry) {return entry.account_id;}); formEntriesContactsIds = entries.map(function (entry) {return entry.contact_id;});_context4.next = 18;return ( Account.query(). whereIn('id', formEntriesAccountsIds). withGraphFetched('type'). remember());case 18:accounts = _context4.sent; storedAccountsIds = accounts.map(function (account) {return account.id;}); if (Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(formEntriesAccountsIds, storedAccountsIds).length > 0) { errorReasons.push({ type: 'ACCOUNTS.IDS.NOT.FOUND', code: 200 }); }_context4.next = 23;return ( ManualJournal.query(). where('journal_number', form.journal_number));case 23:journalNumber = _context4.sent; if (journalNumber.length > 0) { errorReasons.push({ type: 'JOURNAL.NUMBER.ALREADY.EXISTS', code: 300 }); }if (!( errorReasons.length > 0)) {_context4.next = 27;break;}return _context4.abrupt("return", res.status(400).send({ errors: errorReasons }));case 27:_context4.next = 29;return ( ManualJournal.query().insert({ reference: form.reference, transaction_type: 'Journal', journal_number: form.journal_number, amount: totalCredit, date: formattedDate, description: form.description, status: form.status, user_id: user.id }));case 29:manualJournal = _context4.sent;_context4.next = 32;return ( Account.depGraph().query());case 32:accountsDepGraph = _context4.sent; journalPoster = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph); entries.forEach(function (entry) { var account = accounts.find(function (a) {return a.id === entry.account_id;}); var jouranlEntry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_10__["default"]({ debit: entry.debit, credit: entry.credit, account: account.id, referenceType: 'Journal', referenceId: manualJournal.id, accountNormal: account.type.normal, contactType: entry.contact_type, contactId: entry.contact_id, note: entry.note, date: formattedDate, userId: user.id, draft: !form.status }); if (entry.debit) { journalPoster.debit(jouranlEntry); } else { journalPoster.credit(jouranlEntry); } }); // Save linked media to the journal model. bulkSaveMediaLink = []; form.media_ids.forEach(function (mediaId) { var oper = MediaLink.query().insert({ model_name: 'Journal', model_id: manualJournal.id, media_id: mediaId }); bulkSaveMediaLink.push(oper); }); // Saves the journal entries and accounts balance changes. _context4.next = 39;return Promise.all([].concat( bulkSaveMediaLink, [ journalPoster.saveEntries(), form.status && journalPoster.saveBalance()]));case 39:return _context4.abrupt("return", res.status(200).send({ id: manualJournal.id }));case 40:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x9, _x10) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Saves recurring journal entries template. */ recurringJournalEntries: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('template_name').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('recurrence').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('active').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries').isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.credit').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.debit').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.account_id').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.note').optional()], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee5(req, res) {var validationErrors;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x11, _x12) {return _handler3.apply(this, arguments);}return handler;}() }, /** * Edit the given manual journal. */ editManualJournal: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('date').exists().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('journal_number').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('transaction_type').optional({ nullable: true }).trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('reference').optional({ nullable: true }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries').isArray({ min: 2 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.credit').optional({ nullable: true }).isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.debit').optional({ nullable: true }).isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.account_id').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.contact_id').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.contact_type').optional().isIn(['vendor', 'customer']).isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.note').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('media_ids').optional().isArray(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('media_ids.*').isNumeric().toInt()], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee6(req, res) {var validationErrors, form, id, _req$models4, ManualJournal, AccountTransaction, Account, Media, MediaLink, manualJournal, totalCredit, totalDebit, user, errorReasons, entries, formattedDate, journalNumber, accountsIds, accounts, storedAccountsIds, transactions, accountsDepGraph, journal, journalMediaIds, newInsertedMedia, bulkSaveMediaLink;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context6.next = 3;break;}return _context6.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: form = _objectSpread({ date: new Date(), transaction_type: 'journal', reference: '', media_ids: [] }, req.body); id = req.params.id;_req$models4 = req.models, ManualJournal = _req$models4.ManualJournal, AccountTransaction = _req$models4.AccountTransaction, Account = _req$models4.Account, Media = _req$models4.Media, MediaLink = _req$models4.MediaLink;_context6.next = 8;return ( ManualJournal.query(). where('id', id). withGraphFetched('media').first());case 8:manualJournal = _context6.sent;if ( manualJournal) {_context6.next = 11;break;}return _context6.abrupt("return", res.status(4040).send({ errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 100 }] }));case 11: totalCredit = 0; totalDebit = 0; user = req.user; errorReasons = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(req.errorReasons || []); entries = form.entries.filter(function (entry) {return entry.credit || entry.debit;}); formattedDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(form.date).format('YYYY-MM-DD'); entries.forEach(function (entry) { if (entry.credit > 0) { totalCredit += entry.credit; } if (entry.debit > 0) { totalDebit += entry.debit; } }); if (totalCredit <= 0 || totalDebit <= 0) { errorReasons.push({ type: 'CREDIT.DEBIT.SUMATION.SHOULD.NOT.EQUAL.ZERO', code: 400 }); } if (totalCredit !== totalDebit) { errorReasons.push({ type: 'CREDIT.DEBIT.NOT.EQUALS', code: 100 }); }_context6.next = 22;return ( ManualJournal.query(). where('journal_number', form.journal_number). whereNot('id', id). first());case 22:journalNumber = _context6.sent; if (journalNumber) { errorReasons.push({ type: 'JOURNAL.NUMBER.ALREADY.EXISTS', code: 300 }); } accountsIds = entries.map(function (entry) {return entry.account_id;});_context6.next = 27;return ( Account.query().whereIn('id', accountsIds). withGraphFetched('type'));case 27:accounts = _context6.sent; storedAccountsIds = accounts.map(function (account) {return account.id;}); if (Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(accountsIds, storedAccountsIds).length > 0) { errorReasons.push({ type: 'ACCOUNTS.IDS.NOT.FOUND', code: 200 }); }if (!( errorReasons.length > 0)) {_context6.next = 32;break;}return _context6.abrupt("return", res.status(400).send({ errors: errorReasons }));case 32:_context6.next = 34;return ( ManualJournal.query(). where('id', manualJournal.id). update({ reference: form.reference, transaction_type: 'Journal', journalNumber: form.journal_number, amount: totalCredit, date: formattedDate, description: form.description }));case 34:_context6.next = 36;return ( AccountTransaction.query(). whereIn('reference_type', ['Journal']). where('reference_id', manualJournal.id). withGraphFetched('account.type'));case 36:transactions = _context6.sent;_context6.next = 39;return ( Account.depGraph().query().remember());case 39:accountsDepGraph = _context6.sent; journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph); journal.loadEntries(transactions); journal.removeEntries(); entries.forEach(function (entry) { var account = accounts.find(function (a) {return a.id === entry.account_id;}); var jouranlEntry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_10__["default"]({ debit: entry.debit, credit: entry.credit, account: account.id, referenceType: 'Journal', referenceId: manualJournal.id, accountNormal: account.type.normal, note: entry.note, date: formattedDate, userId: user.id }); if (entry.debit) { journal.debit(jouranlEntry); } else { journal.credit(jouranlEntry); } }); // Save links of new inserted media that associated to the journal model. journalMediaIds = manualJournal.media.map(function (m) {return m.id;}); newInsertedMedia = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(form.media_ids, journalMediaIds); bulkSaveMediaLink = []; newInsertedMedia.forEach(function (mediaId) { var oper = MediaLink.query().insert({ model_name: 'Journal', model_id: manualJournal.id, media_id: mediaId }); bulkSaveMediaLink.push(oper); });_context6.next = 50;return ( Promise.all([].concat( bulkSaveMediaLink, [ journal.deleteEntries(), journal.saveEntries(), journal.saveBalance()])));case 50:return _context6.abrupt("return", res.status(200).send({}));case 51:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x13, _x14) {return _handler4.apply(this, arguments);}return handler;}() }, publishManualJournal: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee7(req, res) {var validationErrors, _req$models5, ManualJournal, AccountTransaction, Account, id, manualJournal, updateJournalTransactionOper, transactions, accountsDepGraph, journal, updateAccountsTransactionsOper;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee7$(_context7) {while (1) {switch (_context7.prev = _context7.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context7.next = 3;break;}return _context7.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:_req$models5 = req.models, ManualJournal = _req$models5.ManualJournal, AccountTransaction = _req$models5.AccountTransaction, Account = _req$models5.Account; id = req.params.id;_context7.next = 7;return ( ManualJournal.query(). where('id', id).first());case 7:manualJournal = _context7.sent;if ( manualJournal) {_context7.next = 10;break;}return _context7.abrupt("return", res.status(404).send({ errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 100 }] }));case 10:if (! manualJournal.status) {_context7.next = 12;break;}return _context7.abrupt("return", res.status(400).send({ errors: [{ type: 'MANUAL.JOURNAL.PUBLISHED.ALREADY', code: 200 }] }));case 12: updateJournalTransactionOper = ManualJournal.query(). where('id', manualJournal.id). update({ status: 1 });_context7.next = 15;return ( AccountTransaction.query(). whereIn('reference_type', ['Journal', 'ManualJournal']). where('reference_id', manualJournal.id). withGraphFetched('account.type'));case 15:transactions = _context7.sent;_context7.next = 18;return ( Account.depGraph().query().remember());case 18:accountsDepGraph = _context7.sent; journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph); journal.loadEntries(transactions); journal.calculateEntriesBalanceChange(); updateAccountsTransactionsOper = AccountTransaction.query(). whereIn('id', transactions.map(function (t) {return t.id;})). update({ draft: 0 });_context7.next = 25;return ( Promise.all([ updateJournalTransactionOper, updateAccountsTransactionsOper, journal.saveBalance()]));case 25:return _context7.abrupt("return", res.status(200).send({ id: id }));case 26:case "end":return _context7.stop();}}}, _callee7);}));function handler(_x15, _x16) {return _handler5.apply(this, arguments);}return handler;}() }, getManualJournal: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee8(req, res) {var validationErrors, _req$models6, ManualJournal, AccountTransaction, id, manualJournal, transactions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee8$(_context8) {while (1) {switch (_context8.prev = _context8.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context8.next = 3;break;}return _context8.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:_req$models6 = req.models, ManualJournal = _req$models6.ManualJournal, AccountTransaction = _req$models6.AccountTransaction; id = req.params.id;_context8.next = 7;return ( ManualJournal.query(). where('id', id). withGraphFetched('media'). first());case 7:manualJournal = _context8.sent;if ( manualJournal) {_context8.next = 10;break;}return _context8.abrupt("return", res.status(404).send({ errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 100 }] }));case 10:_context8.next = 12;return ( AccountTransaction.query(). whereIn('reference_type', ['Journal', 'ManualJournal']). where('reference_id', manualJournal.id));case 12:transactions = _context8.sent;return _context8.abrupt("return", res.status(200).send({ manual_journal: _objectSpread({}, manualJournal.toJSON(), { entries: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()( transactions) }) }));case 14:case "end":return _context8.stop();}}}, _callee8);}));function handler(_x17, _x18) {return _handler6.apply(this, arguments);}return handler;}() }, /** * Deletes manual journal transactions and associated * accounts transactions. */ deleteManualJournal: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler7 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee9(req, res) {var validationErrors, id, _req$models7, ManualJournal, AccountTransaction, MediaLink, Account, manualJournal, transactions, accountsDepGraph, journal;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee9$(_context9) {while (1) {switch (_context9.prev = _context9.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context9.next = 3;break;}return _context9.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: id = req.params.id;_req$models7 = req.models, ManualJournal = _req$models7.ManualJournal, AccountTransaction = _req$models7.AccountTransaction, MediaLink = _req$models7.MediaLink, Account = _req$models7.Account;_context9.next = 7;return ( ManualJournal.query(). where('id', id).first());case 7:manualJournal = _context9.sent;if ( manualJournal) {_context9.next = 10;break;}return _context9.abrupt("return", res.status(404).send({ errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 100 }] }));case 10:_context9.next = 12;return ( AccountTransaction.query(). whereIn('reference_type', ['Journal', 'ManualJournal']). where('reference_id', manualJournal.id). withGraphFetched('account.type'));case 12:transactions = _context9.sent;_context9.next = 15;return ( Account.depGraph().query().remember());case 15:accountsDepGraph = _context9.sent; journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph); journal.loadEntries(transactions); journal.removeEntries();_context9.next = 21;return ( MediaLink.query(). where('model_name', 'Journal'). where('model_id', manualJournal.id)["delete"]());case 21:_context9.next = 23;return ( ManualJournal.query(). where('id', manualJournal.id)["delete"]());case 23:_context9.next = 25;return ( Promise.all([ journal.deleteEntries(), journal.saveBalance()]));case 25:return _context9.abrupt("return", res.status(200).send({ id: id }));case 26:case "end":return _context9.stop();}}}, _callee9);}));function handler(_x19, _x20) {return _handler7.apply(this, arguments);}return handler;}() }, recurringJournalsList: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page_size').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('template_name').optional()], handler: function () {var _handler8 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee10(req, res) {var validationErrors;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee10$(_context10) {while (1) {switch (_context10.prev = _context10.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context10.next = 3;break;}return _context10.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:case "end":return _context10.stop();}}}, _callee10);}));function handler(_x21, _x22) {return _handler8.apply(this, arguments);}return handler;}() }, quickJournalEntries: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('date').exists().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('amount').exists().isNumeric().toFloat(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('credit_account_id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('debit_account_id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('transaction_type').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('note').optional()], handler: function () {var _handler9 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee11(req, res) {var validationErrors, errorReasons, form, Account, foundAccounts, creditAccount, debitAccount;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee11$(_context11) {while (1) {switch (_context11.prev = _context11.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context11.next = 3;break;}return _context11.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: errorReasons = []; form = _objectSpread({}, req.body); Account = req.models.Account;_context11.next = 8;return ( Account.query(). where('id', form.credit_account_id). orWhere('id', form.debit_account_id));case 8:foundAccounts = _context11.sent; creditAccount = foundAccounts.find(function (a) {return a.id === form.credit_account_id;}); debitAccount = foundAccounts.find(function (a) {return a.id === form.debit_account_id;}); if (!creditAccount) { errorReasons.push({ type: 'CREDIT_ACCOUNT.NOT.EXIST', code: 100 }); } if (!debitAccount) { errorReasons.push({ type: 'DEBIT_ACCOUNT.NOT.EXIST', code: 200 }); }if (!( errorReasons.length > 0)) {_context11.next = 15;break;}return _context11.abrupt("return", res.status(400).send({ errors: errorReasons }));case 15:return _context11.abrupt("return", res.status(200).send());case 16:case "end":return _context11.stop();}}}, _callee11);}));function handler(_x23, _x24) {return _handler9.apply(this, arguments);}return handler;}() }, /** * Deletes bulk manual journals. */ deleteBulkManualJournals: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids').isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids.*').isNumeric().toInt()], handler: function () {var _handler10 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee12(req, res) {var validationErrors, filter, _req$models8, ManualJournal, AccountTransaction, Account, MediaLink, manualJournals, notFoundManualJournals, transactions, accountsDepGraph, journal;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee12$(_context12) {while (1) {switch (_context12.prev = _context12.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context12.next = 3;break;}return _context12.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: filter = _objectSpread({}, req.query);_req$models8 = req.models, ManualJournal = _req$models8.ManualJournal, AccountTransaction = _req$models8.AccountTransaction, Account = _req$models8.Account, MediaLink = _req$models8.MediaLink;_context12.next = 7;return ( ManualJournal.query(). whereIn('id', filter.ids));case 7:manualJournals = _context12.sent; notFoundManualJournals = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(filter.ids, manualJournals.map(function (m) {return m.id;}));if (!( notFoundManualJournals.length > 0)) {_context12.next = 11;break;}return _context12.abrupt("return", res.status(404).send({ errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 200 }] }));case 11:_context12.next = 13;return ( AccountTransaction.query(). whereIn('reference_type', ['Journal', 'ManualJournal']). whereIn('reference_id', filter.ids));case 13:transactions = _context12.sent;_context12.next = 16;return ( Account.depGraph().query().remember());case 16:accountsDepGraph = _context12.sent; journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph); journal.loadEntries(transactions); journal.removeEntries();_context12.next = 22;return ( MediaLink.query(). where('model_name', 'Journal'). whereIn('model_id', filter.ids)["delete"]());case 22:_context12.next = 24;return ( ManualJournal.query(). whereIn('id', filter.ids)["delete"]());case 24:_context12.next = 26;return ( Promise.all([ journal.deleteEntries(), journal.saveBalance()]));case 26:return _context12.abrupt("return", res.status(200).send({ ids: filter.ids }));case 27:case "end":return _context12.stop();}}}, _callee12);}));function handler(_x25, _x26) {return _handler10.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Accounts.js": /*!******************************************!*\ !*** ./src/http/controllers/Accounts.js ***! \******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "@babel/runtime/helpers/slicedToArray"); /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js"); /* harmony import */ var _collection_NestedSet__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/collection/NestedSet */ "./src/collection/NestedSet/index.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); /* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/lib/DynamicFilter */ "./src/lib/DynamicFilter/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor method. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router(); router.post('/', this.newAccount.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.newAccount.handler)); router.post('/:id', this.editAccount.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.editAccount.handler)); router.get('/:id', this.getAccount.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.getAccount.handler)); router.get('/', this.getAccountsList.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.getAccountsList.handler)); router["delete"]('/', this.deleteBulkAccounts.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.deleteBulkAccounts.handler)); router["delete"]('/:id', this.deleteAccount.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.deleteAccount.handler)); router.post('/:id/active', this.activeAccount.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.activeAccount.handler)); router.post('/:id/inactive', this.inactiveAccount.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.inactiveAccount.handler)); router.post('/:id/recalculate-balance', this.recalcualteBalanace.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.recalcualteBalanace.handler)); router.post('/:id/transfer_account/:toAccount', this.transferToAnotherAccount.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.transferToAnotherAccount.handler)); router.post('/bulk/:type(activate|inactivate)', this.bulkInactivateAccounts.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.bulkInactivateAccounts.handler)); return router; }, /** * Creates a new account. */ newAccount: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('name').exists().isLength({ min: 3 }). trim(). escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('code').optional().isLength({ max: 10 }). trim(). escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('account_type_id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('description').optional().trim().escape()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, form, _req$models, AccountType, Account, foundAccountCodePromise, foundAccountTypePromise, _ref, _ref2, foundAccountCode, foundAccountType;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: form = _objectSpread({}, req.body);_req$models = req.models, AccountType = _req$models.AccountType, Account = _req$models.Account; foundAccountCodePromise = form.code ? Account.query().where('code', form.code) : null; foundAccountTypePromise = AccountType.query(). findById(form.account_type_id);_context.next = 9;return ( Promise.all([ foundAccountCodePromise, foundAccountTypePromise]));case 9:_ref = _context.sent;_ref2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_1___default()(_ref, 2);foundAccountCode = _ref2[0];foundAccountType = _ref2[1];if (!( foundAccountCodePromise && foundAccountCode.length > 0)) {_context.next = 15;break;}return _context.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'NOT_UNIQUE_CODE', code: 100 }] }));case 15:if ( foundAccountType) {_context.next = 17;break;}return _context.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'NOT_EXIST_ACCOUNT_TYPE', code: 200 }] }));case 17:_context.next = 19;return ( Account.query().insert(_objectSpread({}, form)));case 19:return _context.abrupt("return", res.status(200).send({ item: {} }));case 20:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Edit the given account details. */ editAccount: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').exists().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('name').exists().isLength({ min: 3 }). trim(). escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('code').exists().isLength({ max: 10 }). trim(). escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('account_type_id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('description').optional().trim().escape()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var id, validationErrors, _req$models2, Account, AccountType, form, account, foundAccountCodePromise, foundAccountTypePromise, _ref3, _ref4, foundAccountCode, foundAccountType;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: id = req.params.id; validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context2.next = 4;break;}return _context2.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 4:_req$models2 = req.models, Account = _req$models2.Account, AccountType = _req$models2.AccountType; form = _objectSpread({}, req.body);_context2.next = 8;return ( Account.query().findById(id));case 8:account = _context2.sent;if ( account) {_context2.next = 11;break;}return _context2.abrupt("return", res.boom.notFound());case 11: foundAccountCodePromise = form.code && form.code !== account.code ? Account.query().where('code', form.code).whereNot('id', account.id) : null; foundAccountTypePromise = form.account_type_id !== account.account_type_id ? AccountType.query().where('id', form.account_type_id) : null;_context2.next = 15;return ( Promise.all([ foundAccountCodePromise, foundAccountTypePromise]));case 15:_ref3 = _context2.sent;_ref4 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_1___default()(_ref3, 2);foundAccountCode = _ref4[0];foundAccountType = _ref4[1];if (!( foundAccountCode.length > 0 && foundAccountCodePromise)) {_context2.next = 21;break;}return _context2.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'NOT_UNIQUE_CODE', code: 100 }] }));case 21:if (!( foundAccountType.length <= 0 && foundAccountTypePromise)) {_context2.next = 23;break;}return _context2.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'NOT_EXIST_ACCOUNT_TYPE', code: 110 }] }));case 23:_context2.next = 25;return ( account.patch(_objectSpread({}, form)));case 25:return _context2.abrupt("return", res.status(200).send());case 26:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Get details of the given account. */ getAccount: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').toInt()], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var id, Account, account;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: id = req.params.id; Account = req.models.Account;_context3.next = 4;return ( Account.query().remember().where('id', id).first());case 4:account = _context3.sent;if ( account) {_context3.next = 7;break;}return _context3.abrupt("return", res.boom.notFound());case 7:return _context3.abrupt("return", res.status(200).send({ account: _objectSpread({}, account) }));case 8:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() }, /** * Delete the given account. */ deleteAccount: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').toInt()], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var id, _req$models3, Account, AccountTransaction, account, accountTransactions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: id = req.params.id;_req$models3 = req.models, Account = _req$models3.Account, AccountTransaction = _req$models3.AccountTransaction;_context4.next = 4;return ( Account.query().findById(id));case 4:account = _context4.sent;if ( account) {_context4.next = 7;break;}return _context4.abrupt("return", res.boom.notFound());case 7:if (! account.predefined) {_context4.next = 9;break;}return _context4.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'ACCOUNT.PREDEFINED', code: 200 }] }));case 9:_context4.next = 11;return ( AccountTransaction.query(). where('account_id', account.id));case 11:accountTransactions = _context4.sent;if (!( accountTransactions.length > 0)) {_context4.next = 14;break;}return _context4.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'ACCOUNT.HAS.ASSOCIATED.TRANSACTIONS', code: 100 }] }));case 14:_context4.next = 16;return ( Account.query().deleteById(account.id));case 16:return _context4.abrupt("return", res.status(200).send());case 17:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() }, /** * Retrieve accounts list. */ getAccountsList: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('display_type').optional().isIn(['tree', 'flat']), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_types').optional().isArray(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_types.*').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('custom_view_id').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('stringified_filter_roles').optional().isJSON(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('column_sort_by').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('sort_order').optional().isIn(['desc', 'asc'])], handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var validationErrors, filter, _req$models4, Resource, Account, View, errorReasons, accountsResource, resourceFieldsKeys, view, dynamicFilter, sortByFilter, viewFilter, filterRoles, accounts, nestedAccounts;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: filter = _objectSpread({ account_types: [], display_type: 'tree', filter_roles: [], sort_order: 'asc' }, req.query); if (filter.stringified_filter_roles) { filter.filter_roles = JSON.parse(filter.stringified_filter_roles); }_req$models4 = req.models, Resource = _req$models4.Resource, Account = _req$models4.Account, View = _req$models4.View; errorReasons = [];_context5.next = 9;return ( Resource.query(). remember(). where('name', 'accounts'). withGraphFetched('fields'). first());case 9:accountsResource = _context5.sent;if ( accountsResource) {_context5.next = 12;break;}return _context5.abrupt("return", res.status(400).send({ errors: [{ type: 'ACCOUNTS_RESOURCE_NOT_FOUND', code: 200 }] }));case 12: resourceFieldsKeys = accountsResource.fields.map(function (c) {return c.key;});_context5.next = 15;return ( View.query().onBuild(function (builder) { if (filter.custom_view_id) { builder.where('id', filter.custom_view_id); } else { builder.where('favourite', true); } // builder.where('resource_id', accountsResource.id); builder.withGraphFetched('roles.field'); builder.withGraphFetched('columns'); builder.first(); builder.remember(); }));case 15:view = _context5.sent; dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilter"](Account.tableName); if (filter.column_sort_by) { if (resourceFieldsKeys.indexOf(filter.column_sort_by) === -1) { errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 }); } sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterSortBy"]( filter.column_sort_by, filter.sort_order); dynamicFilter.setFilter(sortByFilter); } // View roles. if (view && view.roles.length > 0) { viewFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterViews"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["mapViewRolesToConditionals"])(view.roles), view.rolesLogicExpression); if (!viewFilter.validateFilterRoles()) { errorReasons.push({ type: 'VIEW.LOGIC.EXPRESSION.INVALID', code: 400 }); } dynamicFilter.setFilter(viewFilter); } // Filter roles. if (filter.filter_roles.length > 0) { // Validate the accounts resource fields. filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterFilterRoles"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["mapFilterRolesToDynamicFilter"])(filter.filter_roles), accountsResource.fields); dynamicFilter.setFilter(filterRoles); if (filterRoles.validateFilterRoles().length > 0) { errorReasons.push({ type: 'ACCOUNTS.RESOURCE.HAS.NO.GIVEN.FIELDS', code: 500 }); } }if (!( errorReasons.length > 0)) {_context5.next = 22;break;}return _context5.abrupt("return", res.status(400).send({ errors: errorReasons }));case 22:_context5.next = 24;return ( Account.query(). remember(). onBuild(function (builder) { builder.modify('filterAccountTypes', filter.account_types); builder.withGraphFetched('type'); builder.withGraphFetched('balance'); dynamicFilter.buildQuery()(builder); }));case 24:accounts = _context5.sent; nestedAccounts = Account.toNestedArray(accounts);return _context5.abrupt("return", res.status(200).send(_objectSpread({ accounts: nestedAccounts }, view ? { customViewId: view.id } : {})));case 27:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() }, /** * Re-calculates balance of the given account. */ recalcualteBalanace: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').isNumeric().toInt()], handler: function () {var _handler6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee6(req, res) {var id, _req$models5, Account, AccountTransaction, AccountBalance, account, accountTransactions, journalEntries;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0: id = req.params.id;_req$models5 = req.models, Account = _req$models5.Account, AccountTransaction = _req$models5.AccountTransaction, AccountBalance = _req$models5.AccountBalance;_context6.next = 4;return ( Account.findById(id));case 4:account = _context6.sent;if ( account) {_context6.next = 7;break;}return _context6.abrupt("return", res.status(400).send({ errors: [{ type: 'ACCOUNT.NOT.FOUND', code: 100 }] }));case 7: accountTransactions = AccountTransaction.query(). where('account_id', account.id); journalEntries = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](); journalEntries.loadFromCollection(accountTransactions); // Delete the balance of the given account id. _context6.next = 12;return AccountBalance.query().where('account_id', account.id)["delete"]();case 12:_context6.next = 14;return ( journalEntries.saveBalance());case 14:return _context6.abrupt("return", res.status(200).send());case 15:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x11, _x12) {return _handler6.apply(this, arguments);}return handler;}() }, /** * Active the given account. */ activeAccount: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler7 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee7(req, res) {var id, Account, account;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee7$(_context7) {while (1) {switch (_context7.prev = _context7.next) {case 0: id = req.params.id; Account = req.models.Account;_context7.next = 4;return ( Account.query().findById(id));case 4:account = _context7.sent;if ( account) {_context7.next = 7;break;}return _context7.abrupt("return", res.status(400).send({ errors: [{ type: 'ACCOUNT.NOT.FOUND', code: 100 }] }));case 7:_context7.next = 9;return ( Account.query(). where('id', id). patch({ active: true }));case 9:return _context7.abrupt("return", res.status(200).send({ id: account.id }));case 10:case "end":return _context7.stop();}}}, _callee7);}));function handler(_x13, _x14) {return _handler7.apply(this, arguments);}return handler;}() }, /** * Inactive the given account. */ inactiveAccount: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler8 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee8(req, res) {var id, Account, account;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee8$(_context8) {while (1) {switch (_context8.prev = _context8.next) {case 0: id = req.params.id; Account = req.models.Account;_context8.next = 4;return ( Account.query().findById(id));case 4:account = _context8.sent;if ( account) {_context8.next = 7;break;}return _context8.abrupt("return", res.status(400).send({ errors: [{ type: 'ACCOUNT.NOT.FOUND', code: 100 }] }));case 7:_context8.next = 9;return ( Account.query(). where('id', id). patch({ active: false }));case 9:return _context8.abrupt("return", res.status(200).send({ id: account.id }));case 10:case "end":return _context8.stop();}}}, _callee8);}));function handler(_x15, _x16) {return _handler8.apply(this, arguments);}return handler;}() }, /** * Transfer all journal entries of the given account to another account. */ transferToAnotherAccount: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('toAccount').exists().isNumeric().toInt()], handler: function () {var _handler9 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee9(req, res) {var validationErrors;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee9$(_context9) {while (1) {switch (_context9.prev = _context9.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context9.next = 3;break;}return _context9.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:case "end":return _context9.stop();}}}, _callee9);}));function handler(_x17, _x18) {return _handler9.apply(this, arguments);}return handler;}() }, deleteBulkAccounts: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('ids').isArray(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('ids.*').isNumeric().toInt()], handler: function () {var _handler10 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee10(req, res) {var validationErrors, filter, _req$models6, Account, AccountTransaction, accounts, accountsIds, notFoundAccounts, predefinedAccounts, errorReasons, accountsTransactions, accountsHasTransactions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee10$(_context10) {while (1) {switch (_context10.prev = _context10.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context10.next = 3;break;}return _context10.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: filter = _objectSpread({ ids: [] }, req.query);_req$models6 = req.models, Account = _req$models6.Account, AccountTransaction = _req$models6.AccountTransaction;_context10.next = 7;return ( Account.query().onBuild(function (builder) { if (filter.ids.length) { builder.whereIn('id', filter.ids); } }));case 7:accounts = _context10.sent; accountsIds = accounts.map(function (a) {return a.id;}); notFoundAccounts = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(filter.ids, accountsIds); predefinedAccounts = accounts.filter(function (account) {return account.predefined;}); errorReasons = [];if (!( notFoundAccounts.length > 0)) {_context10.next = 14;break;}return _context10.abrupt("return", res.status(404).send({ errors: [{ type: 'ACCOUNTS.IDS.NOT.FOUND', code: 200, ids: notFoundAccounts }] }));case 14: if (predefinedAccounts.length > 0) { errorReasons.push({ type: 'ACCOUNT.PREDEFINED', code: 200, ids: predefinedAccounts.map(function (a) {return a.id;}) }); }_context10.next = 17;return ( AccountTransaction.query(). whereIn('account_id', accountsIds). count('id as transactions_count'). groupBy('account_id'). select('account_id'));case 17:accountsTransactions = _context10.sent; accountsHasTransactions = []; accountsTransactions.forEach(function (transaction) { if (transaction.transactionsCount > 0) { accountsHasTransactions.push(transaction.accountId); } }); if (accountsHasTransactions.length > 0) { errorReasons.push({ type: 'ACCOUNT.HAS.ASSOCIATED.TRANSACTIONS', code: 300, ids: accountsHasTransactions }); }if (!( errorReasons.length > 0)) {_context10.next = 23;break;}return _context10.abrupt("return", res.status(400).send({ errors: errorReasons }));case 23:_context10.next = 25;return ( Account.query(). whereIn('id', accounts.map(function (a) {return a.id;}))["delete"]());case 25:return _context10.abrupt("return", res.status(200).send());case 26:case "end":return _context10.stop();}}}, _callee10);}));function handler(_x19, _x20) {return _handler10.apply(this, arguments);}return handler;}() }, /** * Bulk acvtivate/inactivate the given accounts. */ bulkInactivateAccounts: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('ids').isArray({ min: 2 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('ids.*').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('type').exists().isIn(['activate', 'inactivate'])], handler: function () {var _handler11 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee11(req, res) {var validationErrors, filter, Account, type, storedAccounts, storedAccountsIds, notFoundAccounts, updatedAccounts;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee11$(_context11) {while (1) {switch (_context11.prev = _context11.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context11.next = 3;break;}return _context11.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: filter = _objectSpread({ ids: [] }, req.query); Account = req.models.Account; type = req.params.type;_context11.next = 8;return ( Account.query().whereIn('id', filter.ids));case 8:storedAccounts = _context11.sent; storedAccountsIds = storedAccounts.map(function (account) {return account.id;}); notFoundAccounts = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(filter.ids, storedAccountsIds);if (!( notFoundAccounts.length > 0)) {_context11.next = 13;break;}return _context11.abrupt("return", res.status(400).send({ errors: [{ type: 'ACCOUNTS.NOT.FOUND', code: 200 }] }));case 13:_context11.next = 15;return ( Account.query(). whereIn('id', storedAccountsIds). patch({ active: type === 'activate' ? 1 : 0 }));case 15:updatedAccounts = _context11.sent;return _context11.abrupt("return", res.status(200).send({ ids: storedAccountsIds }));case 17:case "end":return _context11.stop();}}}, _callee11);}));function handler(_x21, _x22) {return _handler11.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Authentication.js": /*!************************************************!*\ !*** ./src/http/controllers/Authentication.js ***! \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! path */ "path"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! fs */ "fs"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var mustache__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! mustache */ "mustache"); /* harmony import */ var mustache__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(mustache__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var jsonwebtoken__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jsonwebtoken */ "jsonwebtoken"); /* harmony import */ var jsonwebtoken__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(jsonwebtoken__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_9__); /* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! uniqid */ "uniqid"); /* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(uniqid__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_11__); /* harmony import */ var _services_Logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/services/Logger */ "./src/services/Logger/index.js"); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/system/models/SystemUser */ "./src/system/models/SystemUser.js"); /* harmony import */ var _services_mail__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @/services/mail */ "./src/services/mail.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js"); /* harmony import */ var _database_manager__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @/database/manager */ "./src/database/manager.js"); /* harmony import */ var _system_models_Tenant__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/system/models/Tenant */ "./src/system/models/Tenant.js"); /* harmony import */ var _models_TenantUser__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @/models/TenantUser */ "./src/models/TenantUser.js"); /* harmony import */ var _system_TenantsManager__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @/system/TenantsManager */ "./src/system/TenantsManager.js"); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _system_models_PasswordReset__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @/system/models/PasswordReset */ "./src/system/models/PasswordReset.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Constructor method. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router(); router.post('/login', this.login.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.login.handler)); router.post('/register', this.register.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.register.handler)); router.post('/send_reset_password', this.sendResetPassword.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.sendResetPassword.handler)); router.post('/reset/:token', this.resetPassword.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.resetPassword.handler)); return router; }, /** * User login authentication request. */ login: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('crediential').exists().isEmail(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('password').exists().isLength({ min: 5 })], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, form, JWT_SECRET_KEY, user, lastLoginAt, updateTenantUser, updateSystemUser, token;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: form = _objectSpread({}, req.body); JWT_SECRET_KEY = process.env.JWT_SECRET_KEY; _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'Someone trying to login.', { form: form });_context.next = 8;return ( _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query(). withGraphFetched('tenant'). where('email', form.crediential). orWhere('phone_number', form.crediential). first());case 8:user = _context.sent;if ( user) {_context.next = 11;break;}return _context.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'INVALID_DETAILS', code: 100 }] }));case 11:if ( user.verifyPassword(form.password)) {_context.next = 13;break;}return _context.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'INVALID_DETAILS', code: 100 }] }));case 13:if ( user.active) {_context.next = 15;break;}return _context.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'USER_INACTIVE', code: 110 }] }));case 15: lastLoginAt = moment__WEBPACK_IMPORTED_MODULE_11___default()().format('YYYY/MM/DD HH:mm:ss'); updateTenantUser = _models_TenantUser__WEBPACK_IMPORTED_MODULE_19__["default"].tenant().query(). where('id', user.id). update({ last_login_at: lastLoginAt }); updateSystemUser = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query(). where('id', user.id). update({ last_login_at: lastLoginAt });_context.next = 20;return ( Promise.all([updateTenantUser, updateSystemUser]));case 20: token = jsonwebtoken__WEBPACK_IMPORTED_MODULE_8___default.a.sign( { email: user.email, _id: user.id }, JWT_SECRET_KEY, { expiresIn: '1d' }); _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'Logging success.', { form: form });return _context.abrupt("return", res.status(200).send({ token: token, user: user }));case 23:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Registers a new organization. */ register: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('organization_name').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('first_name').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('last_name').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('email').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('phone_number').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('password').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('country').exists().trim().escape()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var validationErrors, form, user, errorReasons, organizationId, tenantOrganization, hashedPassword, userInsert, registeredUser, tenantDb, filePath, template, rendered, mailOptions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: form = _objectSpread({}, req.body); _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'Someone trying to register.', { form: form });_context2.next = 7;return ( _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query(). where('email', form.email). orWhere('phone_number', form.phone_number). first());case 7:user = _context2.sent; errorReasons = []; if (user && user.phoneNumber === form.phone_number) { errorReasons.push({ type: 'PHONE_NUMBER_EXISTS', code: 100 }); } if (user && user.email === form.email) { errorReasons.push({ type: 'EMAIL_EXISTS', code: 200 }); }if (!( errorReasons.length > 0)) {_context2.next = 13;break;}return _context2.abrupt("return", res.status(400).send({ errors: errorReasons }));case 13: organizationId = uniqid__WEBPACK_IMPORTED_MODULE_10___default()();_context2.next = 16;return ( _system_models_Tenant__WEBPACK_IMPORTED_MODULE_18__["default"].query().insert({ organization_id: organizationId }));case 16:tenantOrganization = _context2.sent;_context2.next = 19;return ( Object(_utils__WEBPACK_IMPORTED_MODULE_16__["hashPassword"])(form.password));case 19:hashedPassword = _context2.sent; userInsert = _objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_9__["pick"])(form, ['first_name', 'last_name', 'email', 'phone_number']), { active: true });_context2.next = 23;return ( _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query().insert(_objectSpread({}, userInsert, { password: hashedPassword, tenant_id: tenantOrganization.id })));case 23:registeredUser = _context2.sent;_context2.next = 26;return ( _database_manager__WEBPACK_IMPORTED_MODULE_17__["default"].createDb("bigcapital_tenant_".concat(organizationId)));case 26: tenantDb = _system_TenantsManager__WEBPACK_IMPORTED_MODULE_20__["default"].knexInstance(organizationId);_context2.next = 29;return ( tenantDb.migrate.latest());case 29: _models_TenantModel__WEBPACK_IMPORTED_MODULE_21__["default"].knexBinded = tenantDb;_context2.next = 32;return ( _models_TenantUser__WEBPACK_IMPORTED_MODULE_19__["default"].bindKnex(tenantDb).query().insert(_objectSpread({}, userInsert, { invite_accepted_at: moment__WEBPACK_IMPORTED_MODULE_11___default()().format('YYYY/MM/DD HH:mm:ss') })));case 32: _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'New tenant has been created.', { organizationId: organizationId }); filePath = path__WEBPACK_IMPORTED_MODULE_5___default.a.join(global.rootPath, 'views/mail/Welcome.html'); template = fs__WEBPACK_IMPORTED_MODULE_6___default.a.readFileSync(filePath, 'utf8'); rendered = mustache__WEBPACK_IMPORTED_MODULE_7___default.a.render(template, _objectSpread({}, form)); mailOptions = { to: userInsert.email, from: "".concat(process.env.MAIL_FROM_NAME, " ").concat(process.env.MAIL_FROM_ADDRESS), subject: 'Welcome to Bigcapital', html: rendered }; _services_mail__WEBPACK_IMPORTED_MODULE_15__["default"].sendMail(mailOptions, function (error) { if (error) { _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('error', 'Failed send welcome mail', { error: error, form: form }); return; } _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'User has been sent welcome email successfuly.', { form: form }); });return _context2.abrupt("return", res.status(200).send({ organization_id: organizationId }));case 39:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Send reset password link via email or SMS. */ sendResetPassword: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('email').exists().isEmail()], // eslint-disable-next-line consistent-return handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var validationErrors, form, user, token, passwordReset, filePath, template, rendered, mailOptions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: form = _objectSpread({}, req.body); _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'User trying to send reset password.', { form: form });_context3.next = 7;return ( _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query().where('email', form.email).first());case 7:user = _context3.sent;if ( user) {_context3.next = 10;break;}return _context3.abrupt("return", res.status(400).send({ errors: [{ type: 'EMAIL.NOT.REGISTERED', code: 200 }] }));case 10:_context3.next = 12;return ( _system_models_PasswordReset__WEBPACK_IMPORTED_MODULE_22__["default"].query(). where('email', form.email)["delete"]());case 12: token = uniqid__WEBPACK_IMPORTED_MODULE_10___default()();_context3.next = 15;return ( _system_models_PasswordReset__WEBPACK_IMPORTED_MODULE_22__["default"].query(). insert({ email: form.email, token: token }));case 15:passwordReset = _context3.sent; filePath = path__WEBPACK_IMPORTED_MODULE_5___default.a.join(global.rootPath, 'views/mail/ResetPassword.html'); template = fs__WEBPACK_IMPORTED_MODULE_6___default.a.readFileSync(filePath, 'utf8'); rendered = mustache__WEBPACK_IMPORTED_MODULE_7___default.a.render(template, { url: "".concat(req.protocol, "://").concat(req.hostname, "/reset/").concat(passwordReset.token), first_name: user.firstName, last_name: user.lastName // contact_us_email: config.contactUsMail, }); mailOptions = { to: user.email, from: "".concat(process.env.MAIL_FROM_NAME, " ").concat(process.env.MAIL_FROM_ADDRESS), subject: 'Bigcapital - Password Reset', html: rendered }; _services_mail__WEBPACK_IMPORTED_MODULE_15__["default"].sendMail(mailOptions, function (error) { if (error) { _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('error', 'Failed send reset password mail', { error: error, form: form }); return; } _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'User has been sent reset password email successfuly.', { form: form }); }); res.status(200).send({ email: passwordReset.email });case 22:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() }, /** * Reset password. */ resetPassword: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('password').exists().isLength({ min: 5 }).custom(function (value, _ref) {var req = _ref.req; if (value !== req.body.confirm_password) { throw new Error("Passwords don't match"); } else { return value; } })], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var validationErrors, token, password, tokenModel, user, hashedPassword;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'User trying to reset password.'); token = req.params.token; password = req.body.password;_context4.next = 8;return ( _system_models_PasswordReset__WEBPACK_IMPORTED_MODULE_22__["default"].query(). where('token', token) // .where('created_at', '>=', Date.now() - 3600000) .first());case 8:tokenModel = _context4.sent;if ( tokenModel) {_context4.next = 11;break;}return _context4.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'TOKEN_INVALID', code: 100 }] }));case 11:_context4.next = 13;return ( _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query(). where('email', tokenModel.email).first());case 13:user = _context4.sent;if ( user) {_context4.next = 16;break;}return _context4.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'USER_NOT_FOUND', code: 120 }] }));case 16:_context4.next = 18;return ( Object(_utils__WEBPACK_IMPORTED_MODULE_16__["hashPassword"])(password));case 18:hashedPassword = _context4.sent;_context4.next = 21;return ( _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query(). where('email', tokenModel.email). update({ password: hashedPassword }));case 21:_context4.next = 23;return ( _system_models_PasswordReset__WEBPACK_IMPORTED_MODULE_22__["default"].query().where('token', token)["delete"]());case 23: _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'User password has been reset successfully.');return _context4.abrupt("return", res.status(200).send({}));case 25:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/BaseController.js": /*!************************************************!*\ !*** ./src/http/controllers/BaseController.js ***! \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BaseController; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); var BaseController = function BaseController() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BaseController);}; /***/ }), /***/ "./src/http/controllers/Currencies.js": /*!********************************************!*\ !*** ./src/http/controllers/Currencies.js ***! \********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray"); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router(); router.get('/', this.all.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.all.handler)); router.post('/', this.newCurrency.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.newCurrency.handler)); router.post('/:id', this.editCurrency.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.editCurrency.handler)); router["delete"]('/:currency_code', this.deleteCurrecy.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.deleteCurrecy.handler)); return router; }, /** * Retrieve all registered currency details. */ all: { validation: [], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(req, res) {var Currency, currencies;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: Currency = req.models.Currency;_context.next = 3;return ( Currency.query());case 3:currencies = _context.sent;return _context.abrupt("return", res.status(200).send({ currencies: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()( currencies) }));case 5:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, newCurrency: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('currency_name').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('currency_code').exists().trim().escape()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2(req, res) {var validationErrors, form, Currency, foundCurrency;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: form = _objectSpread({}, req.body); Currency = req.models.Currency;_context2.next = 7;return ( Currency.query(). where('currency_code', form.currency_code));case 7:foundCurrency = _context2.sent;if (!( foundCurrency.length > 0)) {_context2.next = 10;break;}return _context2.abrupt("return", res.status(400).send({ errors: [{ type: 'CURRENCY.CODE.ALREADY.EXISTS', code: 100 }] }));case 10:_context2.next = 12;return ( Currency.query(). insert(_objectSpread({}, form)));case 12:return _context2.abrupt("return", res.status(200).send({ currency: _objectSpread({}, form) }));case 13:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, deleteCurrecy: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('currency_code').exists().trim().escape()], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3(req, res) {var validationErrors, Currency, currencyCode;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: Currency = req.models.Currency; currencyCode = req.params.currency_code;_context3.next = 7;return ( Currency.query(). where('currency_code', currencyCode)["delete"]());case 7:return _context3.abrupt("return", res.status(200).send({ currency_code: currencyCode }));case 8:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() }, editCurrency: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('currency_name').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('currency_code').exists().trim().escape()], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee4(req, res) {var validationErrors, form, id, Currency, foundCurrency;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: form = _objectSpread({}, req.body); id = req.params.id; Currency = req.models.Currency;_context4.next = 8;return ( Currency.query(). where('currency_code', form.currency_code).whereNot('id', id));case 8:foundCurrency = _context4.sent;if (!( foundCurrency.length > 0)) {_context4.next = 11;break;}return _context4.abrupt("return", res.status(400).send({ errors: [{ type: 'CURRENCY.CODE.ALREADY.EXISTS', code: 100 }] }));case 11:_context4.next = 13;return ( Currency.query().where('id', id).update(_objectSpread({}, form)));case 13:return _context4.abrupt("return", res.status(200).send({ currency: _objectSpread({}, form) }));case 14:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Customers.js": /*!*******************************************!*\ !*** ./src/http/controllers/Customers.js ***! \*******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); /* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/DynamicFilter */ "./src/lib/DynamicFilter/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} var validatioRoles = [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('customer_type'). exists(). isIn(['individual', 'business']). trim(). escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('first_name').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('last_name').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('company_name').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('display_name').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('email').optional().isEmail().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('work_phone').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('personal_phone').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_city').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_country').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_email').optional().isEmail().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_zipcode').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_phone').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_state').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_city').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_country').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_email').optional().isEmail().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_zip_code').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_phone').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_state').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('note').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('active').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields').optional().isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.key').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.value').exists()]; /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router(); router.post('/', this.newCustomer.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.newCustomer.handler)); router.post('/:id', this.editCustomer.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.editCustomer.handler)); router["delete"]('/:id', this.deleteCustomer.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.deleteCustomer.handler)); router.get('/', this.listCustomers.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.listCustomers.handler)); router.get('/:id', this.getCustomer.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getCustomer.handler)); return router; }, /** * Retrieve customers list with pagination and custom view metadata. */ listCustomers: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('column_sort_order').optional().isIn(['created_at']), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('sort_order').optional().isIn(['desc', 'asc']), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page_size').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('custom_view_id').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('stringified_filter_roles').optional().isJSON()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, _req$models, Resource, View, Customer, errorReasons, customersResource, filter, view, resourceFieldsKeys, dynamicFilter, viewFilter, filterRoles, sortByFilter, customers;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:_req$models = req.models, Resource = _req$models.Resource, View = _req$models.View, Customer = _req$models.Customer; errorReasons = [];_context.next = 7;return ( Resource.query(). where('name', 'customers'). withGraphFetched('fields'). first());case 7:customersResource = _context.sent;if ( customersResource) {_context.next = 10;break;}return _context.abrupt("return", res.status(400).send({ errors: [{ type: 'CUSTOMERS.RESOURCE.NOT.FOUND', code: 200 }] }));case 10: filter = _objectSpread({ column_sort_order: '', sort_order: '', page: 1, page_size: 10, custom_view_id: null, filter_roles: [] }, req.query); if (filter.stringified_filter_roles) { filter.filter_roles = JSON.parse(filter.stringified_filter_roles); }_context.next = 14;return ( View.query().onBuild(function (builder) { if (filter.custom_view_id) { builder.where('id', filter.custom_view_id); } else { builder.where('favourite', true); } builder.where('resource_id', customersResource.id); builder.withGraphFetched('roles.field'); builder.withGraphFetched('columns'); builder.first(); }));case 14:view = _context.sent; resourceFieldsKeys = customersResource.fields.map(function (c) {return c.key;}); dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilter"](Customer.tableName); // Dynamic filter with view roles. if (view && view.roles.length > 0) { viewFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilterViews"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["mapViewRolesToConditionals"])(view.roles), view.rolesLogicExpression); if (!viewFilter.validateFilterRoles()) { errorReasons.push({ type: 'VIEW.LOGIC.EXPRESSION.INVALID', code: 400 }); } dynamicFilter.setFilter(viewFilter); } // Dynamic filter with filter roles. if (filter.filter_roles.length > 0) { // Validate the accounts resource fields. filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilterFilterRoles"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["mapFilterRolesToDynamicFilter"])(filter.filter_roles), customersResource.fields); dynamicFilter.setFilter(filterRoles); if (filterRoles.validateFilterRoles().length > 0) { errorReasons.push({ type: 'ITEMS.RESOURCE.HAS.NO.FIELDS', code: 500 }); } } // Dynamic filter with column sort order. if (filter.column_sort_order) { if (resourceFieldsKeys.indexOf(filter.column_sort_order) === -1) { errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 }); } sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilterSortBy"]( filter.column_sort_order, filter.sort_order); dynamicFilter.setFilter(sortByFilter); }if (!( errorReasons.length > 0)) {_context.next = 22;break;}return _context.abrupt("return", res.status(400).send({ errors: errorReasons }));case 22:_context.next = 24;return ( Customer.query().onBuild(function (builder) { dynamicFilter.buildQuery()(builder); }).pagination(filter.page - 1, filter.page_size));case 24:customers = _context.sent;return _context.abrupt("return", res.status(200).send(_objectSpread({ customers: customers }, view ? { customViewId: view.id } : {})));case 26:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Submit a new customer details. */ newCustomer: { validation: [].concat( validatioRoles), handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var validationErrors, Customer, form, customer;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: Customer = req.models.Customer; form = _objectSpread({}, req.body);_context2.next = 7;return ( Customer.query().insertAndFetch(_objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_5__["pick"])(form, [ 'customer_type', 'first_name', 'last_name', 'company_name', 'display_name', 'email', 'work_phone', 'personal_phone', 'billing_address_1', 'billing_address_2', 'billing_address_city', 'billing_address_country', 'billing_address_email', 'billing_address_zipcode', 'billing_address_phone', 'billing_address_state', 'shipping_address_1', 'shipping_address_2', 'shipping_address_city', 'shipping_address_country', 'shipping_address_email', 'shipping_address_zipcode', 'shipping_address_phone', 'shipping_address_state', 'note', 'active']))));case 7:customer = _context2.sent;return _context2.abrupt("return", res.status(200).send({ id: customer.id }));case 9:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Edit details of the given customer id. */ editCustomer: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()].concat( validatioRoles), handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var validationErrors, id, form, Customer, customer;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: id = req.params.id; form = _objectSpread({}, req.body); Customer = req.models.Customer;_context3.next = 8;return ( Customer.query().where('id', id).first());case 8:customer = _context3.sent;if ( customer) {_context3.next = 11;break;}return _context3.abrupt("return", res.status(404).send({ errors: [{ type: 'CUSTOMER.NOT.FOUND', code: 200 }] }));case 11:_context3.next = 13;return ( Customer.query().where('id', id).patch(_objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_5__["pick"])(form, [ 'customer_type', 'first_name', 'last_name', 'company_name', 'display_name', 'email', 'work_phone', 'personal_phone', 'billing_address_1', 'billing_address_2', 'billing_address_city', 'billing_address_country', 'billing_address_email', 'billing_address_zipcode', 'billing_address_phone', 'billing_address_state', 'shipping_address_1', 'shipping_address_2', 'shipping_address_city', 'shipping_address_country', 'shipping_address_email', 'shipping_address_zipcode', 'shipping_address_phone', 'shipping_address_state', 'note', 'active']))));case 13:return _context3.abrupt("return", res.status(200).send({ id: id }));case 14:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() }, /** * Retrieve details of the given customer id. */ getCustomer: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var validationErrors, Customer, id, customer;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: Customer = req.models.Customer; id = req.params.id;_context4.next = 7;return ( Customer.query().where('id', id).first());case 7:customer = _context4.sent;if ( customer) {_context4.next = 10;break;}return _context4.abrupt("return", res.status(404).send({ errors: [{ type: 'CUSTOMER.NOT.FOUND', code: 200 }] }));case 10:return _context4.abrupt("return", res.status(200).send({ customer: customer }));case 11:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() }, /** * Delete the given customer. */ deleteCustomer: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var validationErrors, Customer, id, customer;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: Customer = req.models.Customer; id = req.params.id;_context5.next = 7;return ( Customer.query().where('id', id).first());case 7:customer = _context5.sent;if ( customer) {_context5.next = 10;break;}return _context5.abrupt("return", res.status(404).send({ errors: [{ type: 'CUSTOMER.NOT.FOUND', code: 200 }] }));case 10:_context5.next = 12;return ( Customer.query().where('id', id)["delete"]());case 12:return _context5.abrupt("return", res.status(200).send());case 13:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/ExchangeRates.js": /*!***********************************************!*\ !*** ./src/http/controllers/ExchangeRates.js ***! \***********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Constructor method. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router(); router.get('/', this.exchangeRates.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.exchangeRates.handler)); router.post('/', this.addExchangeRate.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.addExchangeRate.handler)); router.post('/:id', this.editExchangeRate.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.editExchangeRate.handler)); router["delete"]('/bulk', this.bulkDeleteExchangeRates.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.bulkDeleteExchangeRates.handler)); router["delete"]('/:id', this.deleteExchangeRate.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.deleteExchangeRate.handler)); return router; }, /** * Retrieve exchange rates. */ exchangeRates: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page_size').optional().isNumeric().toInt()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, filter, ExchangeRate, exchangeRates;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: filter = _objectSpread({ page: 1, page_size: 10 }, req.query); ExchangeRate = req.models.ExchangeRate;_context.next = 7;return ( ExchangeRate.query(). pagination(filter.page - 1, filter.page_size));case 7:exchangeRates = _context.sent;return _context.abrupt("return", res.status(200).send({ exchange_rates: exchangeRates }));case 9:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Adds a new exchange rate on the given date. */ addExchangeRate: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('exchange_rate').exists().isNumeric().toFloat(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('currency_code').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('date').exists().isISO8601()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var validationErrors, ExchangeRate, form, foundExchangeRate;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: ExchangeRate = req.models.ExchangeRate; form = _objectSpread({}, req.body);_context2.next = 7;return ( ExchangeRate.query(). where('currency_code', form.currency_code). where('date', form.date));case 7:foundExchangeRate = _context2.sent;if (!( foundExchangeRate.length > 0)) {_context2.next = 10;break;}return _context2.abrupt("return", res.status(400).send({ errors: [{ type: 'EXCHANGE.RATE.DATE.PERIOD.DEFINED', code: 200 }] }));case 10:_context2.next = 12;return ( ExchangeRate.query().insert(_objectSpread({}, form, { date: moment__WEBPACK_IMPORTED_MODULE_5___default()(form.date).format('YYYY-MM-DD') })));case 12:return _context2.abrupt("return", res.status(200).send());case 13:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Edit the given exchange rate. */ editExchangeRate: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('exchange_rate').exists().isNumeric().toFloat()], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var validationErrors, id, form, ExchangeRate, foundExchangeRate;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: id = req.params.id; form = _objectSpread({}, req.body); ExchangeRate = req.models.ExchangeRate;_context3.next = 8;return ( ExchangeRate.query(). where('id', id));case 8:foundExchangeRate = _context3.sent;if ( foundExchangeRate.length) {_context3.next = 11;break;}return _context3.abrupt("return", res.status(400).send({ errors: [{ type: 'EXCHANGE.RATE.NOT.FOUND', code: 200 }] }));case 11:_context3.next = 13;return ( ExchangeRate.query(). where('id', id). update(_objectSpread({}, form)));case 13:return _context3.abrupt("return", res.status(200).send({ id: id }));case 14:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() }, /** * Delete the given exchange rate from the storage. */ deleteExchangeRate: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').isNumeric().toInt()], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var validationErrors, id, ExchangeRate, foundExchangeRate;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: id = req.params.id; ExchangeRate = req.models.ExchangeRate;_context4.next = 7;return ( ExchangeRate.query().where('id', id));case 7:foundExchangeRate = _context4.sent;if ( foundExchangeRate.length) {_context4.next = 10;break;}return _context4.abrupt("return", res.status(404).send({ errors: [{ type: 'EXCHANGE.RATE.NOT.FOUND', code: 200 }] }));case 10:_context4.next = 12;return ( ExchangeRate.query().where('id', id)["delete"]());case 12:return _context4.abrupt("return", res.status(200).send({ id: id }));case 13:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() }, bulkDeleteExchangeRates: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids').isArray({ min: 2 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids.*').isNumeric().toInt()], handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var validationErrors, filter, ExchangeRate, exchangeRates, exchangeRatesIds, notFoundExRates;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: filter = _objectSpread({ ids: [] }, req.query); ExchangeRate = req.models.ExchangeRate;_context5.next = 7;return ( ExchangeRate.query().whereIn('id', filter.ids));case 7:exchangeRates = _context5.sent; exchangeRatesIds = exchangeRates.map(function (category) {return category.id;}); notFoundExRates = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(filter.ids, exchangeRatesIds);if (!( notFoundExRates.length > 0)) {_context5.next = 12;break;}return _context5.abrupt("return", res.status(400).send({ errors: [{ type: 'EXCHANGE.RATES.IS.NOT.FOUND', code: 200, ids: notFoundExRates }] }));case 12:_context5.next = 14;return ( ExchangeRate.query().whereIn('id', exchangeRatesIds)["delete"]());case 14:return _context5.abrupt("return", res.status(200).send({ ids: exchangeRatesIds }));case 15:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Expenses.js": /*!******************************************!*\ !*** ./src/http/controllers/Expenses.js ***! \******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js"); /* harmony import */ var _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/services/Accounting/JournalEntry */ "./src/services/Accounting/JournalEntry.js"); /* harmony import */ var _http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/http/middleware/jwtAuth */ "./src/http/middleware/jwtAuth.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); /* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/lib/DynamicFilter */ "./src/lib/DynamicFilter/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router(); router.use(_http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_10__["default"]); router.post('/', this.newExpense.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.newExpense.handler)); router.post('/:id/publish', this.publishExpense.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.publishExpense.handler)); router["delete"]('/:id', this.deleteExpense.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.deleteExpense.handler)); router.post('/:id', this.updateExpense.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.updateExpense.handler)); router.get('/', this.listExpenses.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.listExpenses.handler)); router.get('/:id', this.getExpense.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.getExpense.handler)); return router; }, /** * Saves a new expense. */ newExpense: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('reference_no').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('payment_date').isISO8601().optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('payment_account_id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('currency_code').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('exchange_rate').optional().isNumeric().toFloat(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('publish').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories').exists().isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.index').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.expense_account_id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.amount').optional().isNumeric().toFloat(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.description').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields').optional().isArray({ min: 0 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.key').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.value').exists()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, user, _req$models, Expense, ExpenseCategory, Account, form, totalAmount, expenseAccountsIds, storedExpenseAccounts, storedExpenseAccountsIds, notStoredExpensesAccountsIds, errorReasons, paymentAccount, expenseTransaction, storeExpenseCategoriesOper, accountsDepGraph, journalPoster, mixinEntry, paymentJournalEntry;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: user = req.user;_req$models = req.models, Expense = _req$models.Expense, ExpenseCategory = _req$models.ExpenseCategory, Account = _req$models.Account; form = _objectSpread({ date: new Date(), published: false, custom_fields: [], categories: [] }, req.body); totalAmount = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["sumBy"])(form.categories, 'amount'); expenseAccountsIds = form.categories.map(function (account) {return account.expense_account_id;});_context.next = 10;return ( Account.query().whereIn('id', expenseAccountsIds));case 10:storedExpenseAccounts = _context.sent; storedExpenseAccountsIds = storedExpenseAccounts.map(function (a) {return a.id;}); notStoredExpensesAccountsIds = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(expenseAccountsIds, storedExpenseAccountsIds); errorReasons = [];_context.next = 16;return ( Account.query().where('id', form.payment_account_id).first());case 16:paymentAccount = _context.sent; if (!paymentAccount) { errorReasons.push({ type: 'PAYMENT.ACCOUNT.NOT.FOUND', code: 500 }); } if (notStoredExpensesAccountsIds.length > 0) { errorReasons.push({ type: 'EXPENSE.ACCOUNTS.IDS.NOT.STORED', code: 400, ids: notStoredExpensesAccountsIds }); } if (totalAmount <= 0) { errorReasons.push({ type: 'TOTAL.AMOUNT.EQUALS.ZERO', code: 300 }); }if (!( errorReasons.length > 0)) {_context.next = 22;break;}return _context.abrupt("return", res.status(400).send({ errors: errorReasons }));case 22:_context.next = 24;return ( Expense.query().insert({ total_amount: totalAmount, payment_account_id: form.payment_account_id, reference_no: form.reference_no, description: form.description, payment_date: moment__WEBPACK_IMPORTED_MODULE_5___default()(form.payment_date).format('YYYY-MM-DD'), user_id: user.id }));case 24:expenseTransaction = _context.sent; storeExpenseCategoriesOper = []; form.categories.forEach(function (category) { var oper = ExpenseCategory.query().insert(_objectSpread({ expense_id: expenseTransaction.id }, category)); storeExpenseCategoriesOper.push(oper); });_context.next = 29;return ( Account.depGraph().query());case 29:accountsDepGraph = _context.sent; journalPoster = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsDepGraph); mixinEntry = { referenceType: 'Expense', referenceId: expenseTransaction.id, userId: user.id, draft: !form.publish }; paymentJournalEntry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_9__["default"](_objectSpread({ credit: totalAmount, account: paymentAccount.id }, mixinEntry)); journalPoster.credit(paymentJournalEntry); form.categories.forEach(function (category) { var expenseJournalEntry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_9__["default"](_objectSpread({ account: category.expense_account_id, debit: category.amount, note: category.description }, mixinEntry)); journalPoster.debit(expenseJournalEntry); });_context.next = 37;return ( Promise.all([].concat( storeExpenseCategoriesOper, [ journalPoster.saveEntries(), form.status && journalPoster.saveBalance()])));case 37:return _context.abrupt("return", res.status(200).send({ id: expenseTransaction.id }));case 38:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Publish the given expense id. */ publishExpense: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var validationErrors, id, _req$models2, Expense, AccountTransaction, expense, errorReasons, transactions, accountsDepGraph, journal, updateAccTransactionsOper, updateExpenseOper;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: id = req.params.id;_req$models2 = req.models, Expense = _req$models2.Expense, AccountTransaction = _req$models2.AccountTransaction;_context2.next = 7;return ( Expense.query().findById(id));case 7:expense = _context2.sent; errorReasons = [];if ( expense) {_context2.next = 12;break;} errorReasons.push({ type: 'EXPENSE.NOT.FOUND', code: 100 });return _context2.abrupt("return", res.status(400).send({ errors: errorReasons }));case 12: if (expense.published) { errorReasons.push({ type: 'EXPENSE.ALREADY.PUBLISHED', code: 200 }); }if (!( errorReasons.length > 0)) {_context2.next = 15;break;}return _context2.abrupt("return", res.status(400).send({ errors: errorReasons }));case 15:_context2.next = 17;return ( AccountTransaction.query(). whereIn('reference_type', ['Expense']). where('reference_id', expense.id). withGraphFetched('account.type'));case 17:transactions = _context2.sent;_context2.next = 20;return ( Account.depGraph().query().remember());case 20:accountsDepGraph = _context2.sent; journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsDepGraph); journal.loadEntries(transactions); journal.calculateEntriesBalanceChange(); updateAccTransactionsOper = AccountTransaction.query(). where('reference_id', expense.id). where('reference_type', 'Expense'). patch({ draft: false }); updateExpenseOper = Expense.query(). where('id', expense.id). update({ published: true });_context2.next = 28;return ( Promise.all([ updateAccTransactionsOper, updateExpenseOper, journal.saveBalance()]));case 28:return _context2.abrupt("return", res.status(200).send());case 29:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Retrieve paginated expenses list. */ listExpenses: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page_size').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('custom_view_id').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('stringified_filter_roles').optional().isJSON(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('column_sort_by').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('sort_order').optional().isIn(['desc', 'asc'])], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var validationErrors, filter, errorReasons, _req$models3, Resource, Expense, View, expensesResource, expensesResourceFields, view, dynamicFilter, sortByFilter, viewFilter, filterRoles, expenses;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: filter = _objectSpread({ sort_order: 'asc', filter_roles: [], page_size: 15, page: 1 }, req.query); errorReasons = [];_req$models3 = req.models, Resource = _req$models3.Resource, Expense = _req$models3.Expense, View = _req$models3.View;_context3.next = 8;return ( Resource.query(). remember(). where('name', 'expenses'). withGraphFetched('fields'). first());case 8:expensesResource = _context3.sent; expensesResourceFields = expensesResource.fields.map(function (f) {return f.key;});if ( expensesResource) {_context3.next = 12;break;}return _context3.abrupt("return", res.status(400).send({ errors: [{ type: 'EXPENSES.RESOURCE.NOT.FOUND', code: 200 }] }));case 12:_context3.next = 14;return ( View.query().onBuild(function (builder) { if (filter.csutom_view_id) { builder.where('id', filter.csutom_view_id); } else { builder.where('favourite', true); } builder.withGraphFetched('roles.field'); builder.withGraphFetched('columns'); builder.first(); }));case 14:view = _context3.sent; dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilter"](Expense.tableName); // Column sorting. if (filter.column_sort_by) { if (expensesResourceFields.indexOf(filter.column_sort_by) === -1) { errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 }); } sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilterSortBy"]( filter.column_sort_by, filter.sort_order); dynamicFilter.setFilter(sortByFilter); } // Custom view roles. if (view && view.roles.length > 0) { viewFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilterViews"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_11__["mapViewRolesToConditionals"])(view.roles), view.rolesLogicExpression); if (viewFilter.validateFilterRoles()) { errorReasons.push({ type: 'VIEW.LOGIC.EXPRESSION.INVALID', code: 400 }); } dynamicFilter.setFilter(viewFilter); } // Filter roles. if (filter.filter_roles.length > 0) { filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilterFilterRoles"]( mapFilterRolesToDynamicFilter(filter.filter_roles), expensesResource.fields); if (filterRoles.validateFilterRoles().length > 0) { errorReasons.push({ type: 'ACCOUNTS.RESOURCE.HAS.NO.GIVEN.FIELDS', code: 500 }); } dynamicFilter.setFilter(filterRoles); }if (!( errorReasons.length > 0)) {_context3.next = 21;break;}return _context3.abrupt("return", res.status(400).send({ errors: errorReasons }));case 21:_context3.next = 23;return ( Expense.query().onBuild(function (builder) { builder.withGraphFetched('paymentAccount'); builder.withGraphFetched('categories'); builder.withGraphFetched('user'); dynamicFilter.buildQuery()(builder); }).pagination(filter.page - 1, filter.page_size));case 23:expenses = _context3.sent;;return _context3.abrupt("return", res.status(200).send(_objectSpread({ expenses: expenses, page_size: filter.page_size, page: filter.page }, view ? { viewColumns: view.columns, customViewId: view.id } : {})));case 26:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() }, /** * Delete the given expense transaction. */ deleteExpense: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').isNumeric().toInt()], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var validationErrors, id, _req$models4, Expense, ExpenseCategory, AccountTransaction, Account, expense, deleteExpenseOper, expenseTransactions, accountsDepGraph, journalEntries;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: id = req.params.id;_req$models4 = req.models, Expense = _req$models4.Expense, ExpenseCategory = _req$models4.ExpenseCategory, AccountTransaction = _req$models4.AccountTransaction, Account = _req$models4.Account;_context4.next = 7;return ( Expense.query().where('id', id).first());case 7:expense = _context4.sent;if ( expense) {_context4.next = 10;break;}return _context4.abrupt("return", res.status(404).send({ errors: [{ type: 'EXPENSE.NOT.FOUND', code: 200 }] }));case 10:_context4.next = 12;return ( ExpenseCategory.query().where('expense_id', id)["delete"]());case 12: deleteExpenseOper = Expense.query().where('id', id)["delete"]();_context4.next = 15;return ( AccountTransaction.query(). where('reference_type', 'Expense'). where('reference_id', expense.id));case 15:expenseTransactions = _context4.sent;_context4.next = 18;return ( Account.depGraph().query().remember());case 18:accountsDepGraph = _context4.sent; journalEntries = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsDepGraph); journalEntries.loadEntries(expenseTransactions); journalEntries.removeEntries();_context4.next = 24;return ( Promise.all([ deleteExpenseOper, journalEntries.deleteEntries(), journalEntries.saveBalance()]));case 24:return _context4.abrupt("return", res.status(200).send());case 25:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() }, /** * Update details of the given account. */ updateExpense: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('reference_no').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('payment_date').isISO8601().optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('payment_account_id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('currency_code').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('exchange_rate').optional().isNumeric().toFloat(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('publish').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories').exists().isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.id').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.index').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.expense_account_id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.amount').optional().isNumeric().toFloat(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.description').optional().trim().escape()], handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var validationErrors, id, user, _req$models5, Account, Expense, ExpenseCategory, AccountTransaction, form, expense, errorReasons, paymentAccount, categoriesHasNoId, categoriesHasId, expenseCategoriesIds, formExpenseCategoriesIds, categoriesIdsDeleted, categoriesShouldDelete, formExpensesAccountsIds, storedExpenseAccounts, storedExpenseAccountsIds, expenseAccountsIdsNotFound, totalAmount, expenseCategoriesMap, categoriesInsertOpers, categoriesUpdateOpers, updateExpenseOper, deleteCategoriesOper, transactions, accountsDepGraph, journal, mixinEntry, paymentJournalEntry;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: id = req.params.id; user = req.user;_req$models5 = req.models, Account = _req$models5.Account, Expense = _req$models5.Expense, ExpenseCategory = _req$models5.ExpenseCategory, AccountTransaction = _req$models5.AccountTransaction; form = _objectSpread({ categories: [] }, req.body); if (!Array.isArray(form.categories)) { form.categories = [form.categories]; }_context5.next = 10;return ( Expense.query(). where('id', id). withGraphFetched('categories'). first());case 10:expense = _context5.sent;if ( expense) {_context5.next = 13;break;}return _context5.abrupt("return", res.status(404).send({ errors: [{ type: 'EXPENSE.NOT.FOUND', code: 200 }] }));case 13: errorReasons = [];_context5.next = 16;return ( Account.query(). where('id', form.payment_account_id).first());case 16:paymentAccount = _context5.sent; if (!paymentAccount) { errorReasons.push({ type: 'PAYMENT.ACCOUNT.NOT.FOUND', code: 400 }); } categoriesHasNoId = form.categories.filter(function (c) {return !c.id;}); categoriesHasId = form.categories.filter(function (c) {return c.id;}); expenseCategoriesIds = expense.categories.map(function (c) {return c.id;}); formExpenseCategoriesIds = categoriesHasId.map(function (c) {return c.id;}); categoriesIdsDeleted = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])( formExpenseCategoriesIds, expenseCategoriesIds); categoriesShouldDelete = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])( expenseCategoriesIds, formExpenseCategoriesIds); formExpensesAccountsIds = form.categories.map(function (c) {return c.expense_account_id;});_context5.next = 27;return ( Account.query().whereIn('id', formExpensesAccountsIds));case 27:storedExpenseAccounts = _context5.sent; storedExpenseAccountsIds = storedExpenseAccounts.map(function (a) {return a.id;}); expenseAccountsIdsNotFound = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])( formExpensesAccountsIds, storedExpenseAccountsIds); totalAmount = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["sumBy"])(form.categories, 'amount'); if (expenseAccountsIdsNotFound.length > 0) { errorReasons.push({ type: 'EXPENSE.ACCOUNTS.IDS.NOT.FOUND', code: 600, ids: expenseAccountsIdsNotFound }); } if (categoriesIdsDeleted.length > 0) { errorReasons.push({ type: 'EXPENSE.CATEGORIES.IDS.NOT.FOUND', code: 300 }); } if (totalAmount <= 0) { errorReasons.push({ type: 'TOTAL.AMOUNT.EQUALS.ZERO', code: 500 }); } // Handle all error reasons. if (!(errorReasons.length > 0)) {_context5.next = 36;break;}return _context5.abrupt("return", res.status(400).send({ errors: errorReasons }));case 36: expenseCategoriesMap = new Map(expense.categories. map(function (category) {return [category.id, category];})); categoriesInsertOpers = []; categoriesUpdateOpers = []; categoriesHasNoId.forEach(function (category) { var oper = ExpenseCategory.query().insert(_objectSpread({}, category, { expense_id: expense.id })); categoriesInsertOpers.push(oper); }); categoriesHasId.forEach(function (category) { var oper = ExpenseCategory.query().where('id', category.id). patch(_objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_6__["omit"])(category, ['id']))); categoriesUpdateOpers.push(oper); }); updateExpenseOper = Expense.query().where('id', id). update({ payment_date: moment__WEBPACK_IMPORTED_MODULE_5___default()(form.payment_date).format('YYYY-MM-DD'), total_amount: totalAmount, description: form.description, payment_account_id: form.payment_account_id, reference_no: form.reference_no }); deleteCategoriesOper = categoriesShouldDelete.length > 0 ? ExpenseCategory.query().whereIn('id', categoriesShouldDelete)["delete"]() : Promise.resolve(); // Update the journal entries. _context5.next = 45;return AccountTransaction.query(). whereIn('reference_type', ['Expense']). where('reference_id', expense.id). withGraphFetched('account.type');case 45:transactions = _context5.sent;_context5.next = 48;return ( Account.depGraph().query().remember());case 48:accountsDepGraph = _context5.sent; journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsDepGraph); journal.loadEntries(transactions); journal.removeEntries(); mixinEntry = { referenceType: 'Expense', referenceId: expense.id, userId: user.id, draft: !form.publish }; paymentJournalEntry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_9__["default"](_objectSpread({ credit: totalAmount, account: paymentAccount.id }, mixinEntry)); journal.credit(paymentJournalEntry); form.categories.forEach(function (category) { var entry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_9__["default"](_objectSpread({ account: category.expense_account_id, debit: category.amount, note: category.description }, mixinEntry)); journal.debit(entry); });_context5.next = 58;return ( Promise.all([].concat( categoriesInsertOpers, categoriesUpdateOpers, [ updateExpenseOper, deleteCategoriesOper, journal.saveEntries(), form.status && journal.saveBalance()])));case 58:return _context5.abrupt("return", res.status(200).send({ id: id }));case 59:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() }, /** * Retrieve details of the given expense id. */ getExpense: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee6(req, res) {var validationErrors, id, _req$models6, Expense, AccountTransaction, expense, journalEntries;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context6.next = 3;break;}return _context6.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: id = req.params.id;_req$models6 = req.models, Expense = _req$models6.Expense, AccountTransaction = _req$models6.AccountTransaction;_context6.next = 7;return ( Expense.query(). where('id', id). withGraphFetched('categories'). withGraphFetched('paymentAccount'). withGraphFetched('user'). first());case 7:expense = _context6.sent;if ( expense) {_context6.next = 10;break;}return _context6.abrupt("return", res.status(404).send({ errors: [{ type: 'EXPENSE.NOT.FOUND', code: 200 }] }));case 10:_context6.next = 12;return ( AccountTransaction.query(). where('reference_id', expense.id). where('reference_type', 'Expense'));case 12:journalEntries = _context6.sent;return _context6.abrupt("return", res.status(200).send({ expense: _objectSpread({}, expense, { journalEntries: journalEntries }) }));case 14:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x11, _x12) {return _handler6.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/FinancialStatements.js": /*!*****************************************************!*\ !*** ./src/http/controllers/FinancialStatements.js ***! \*****************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _FinancialStatements_BalanceSheet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FinancialStatements/BalanceSheet */ "./src/http/controllers/FinancialStatements/BalanceSheet.js"); /* harmony import */ var _FinancialStatements_TrialBalanceSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FinancialStatements/TrialBalanceSheet */ "./src/http/controllers/FinancialStatements/TrialBalanceSheet.js"); /* harmony import */ var _FinancialStatements_generalLedger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FinancialStatements/generalLedger */ "./src/http/controllers/FinancialStatements/generalLedger.js"); /* harmony import */ var _FinancialStatements_JournalSheet__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FinancialStatements/JournalSheet */ "./src/http/controllers/FinancialStatements/JournalSheet.js"); /* harmony import */ var _FinancialStatements_ProfitLossSheet__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FinancialStatements/ProfitLossSheet */ "./src/http/controllers/FinancialStatements/ProfitLossSheet.js"); /* harmony import */ var _FinancialStatements_ReceivableAgingSummary__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FinancialStatements/ReceivableAgingSummary */ "./src/http/controllers/FinancialStatements/ReceivableAgingSummary.js"); /* harmony import */ var _FinancialStatements_PayableAgingSummary__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./FinancialStatements/PayableAgingSummary */ "./src/http/controllers/FinancialStatements/PayableAgingSummary.js"); /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_0___default.a.Router(); router.use('/balance_sheet', _FinancialStatements_BalanceSheet__WEBPACK_IMPORTED_MODULE_1__["default"].router()); router.use('/profit_loss_sheet', _FinancialStatements_ProfitLossSheet__WEBPACK_IMPORTED_MODULE_5__["default"].router()); router.use('/general_ledger', _FinancialStatements_generalLedger__WEBPACK_IMPORTED_MODULE_3__["default"].router()); router.use('/trial_balance_sheet', _FinancialStatements_TrialBalanceSheet__WEBPACK_IMPORTED_MODULE_2__["default"].router()); router.use('/journal', _FinancialStatements_JournalSheet__WEBPACK_IMPORTED_MODULE_4__["default"].router()); router.use('/receivable_aging_summary', _FinancialStatements_ReceivableAgingSummary__WEBPACK_IMPORTED_MODULE_6__["default"].router()); router.use('/payable_aging_summary', _FinancialStatements_PayableAgingSummary__WEBPACK_IMPORTED_MODULE_7__["default"].router()); return router; } }); /***/ }), /***/ "./src/http/controllers/FinancialStatements/AgingReport.js": /*!*****************************************************************!*\ !*** ./src/http/controllers/FinancialStatements/AgingReport.js ***! \*****************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AgingReport; }); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var _http_controllers_BaseController__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/http/controllers/BaseController */ "./src/http/controllers/BaseController.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} var AgingReport = /*#__PURE__*/function (_BaseController) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(AgingReport, _BaseController);function AgingReport() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, AgingReport);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(AgingReport).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(AgingReport, null, [{ key: "validateResults", /** * Express validator middleware. * @param {Request} req * @param {Response} res * @param {Function} next */value: function validateResults( req, res, next) { var validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_7__["validationResult"])(req); if (!validationErrors.isEmpty()) { return res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)); } next(); } /** * * @param {Array} agingPeriods * @param {Numeric} customerBalance */ }, { key: "contactAgingBalance", value: function contactAgingBalance( agingPeriods, receivableTotalCredit) { var prevAging = 0; var receivableCredit = receivableTotalCredit; var diff = receivableCredit; var periods = Object(lodash__WEBPACK_IMPORTED_MODULE_8__["reverse"])(agingPeriods).map(function (agingPeriod) { var agingAmount = agingPeriod.closingBalance - prevAging; var subtract = Math.min(diff, agingAmount); diff -= Math.min(agingAmount, diff); var total = Math.max(agingAmount - subtract, 0); var output = _objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_8__["omit"])(agingPeriod, ['closingBalance']), { total: total }); prevAging = agingPeriod.closingBalance; return output; }); return Object(lodash__WEBPACK_IMPORTED_MODULE_8__["reverse"])(periods); } /** * * @param {*} asDay * @param {*} agingDaysBefore * @param {*} agingPeriodsFreq */ }, { key: "agingRangePeriods", value: function agingRangePeriods( asDay, agingDaysBefore, agingPeriodsFreq) { var totalAgingDays = agingDaysBefore * agingPeriodsFreq; var startAging = moment__WEBPACK_IMPORTED_MODULE_6___default()(asDay).startOf('day'); var endAging = startAging.clone().subtract('days', totalAgingDays).endOf('day'); var agingPeriods = []; var startingAging = startAging.clone(); var beforeDays = 1; var toDays = 0; while (startingAging > endAging) { var currentAging = startingAging.clone(); startingAging.subtract('days', agingDaysBefore).endOf('day'); toDays += agingDaysBefore; agingPeriods.push(_objectSpread({ from_period: moment__WEBPACK_IMPORTED_MODULE_6___default()(currentAging).toDate(), to_period: moment__WEBPACK_IMPORTED_MODULE_6___default()(startingAging).toDate(), before_days: beforeDays === 1 ? 0 : beforeDays, to_days: toDays }, startingAging.valueOf() === endAging.valueOf() ? { to_period: null, to_days: null } : {})); beforeDays += agingDaysBefore; } return agingPeriods; } /** * * @param {*} filter */ }, { key: "formatNumberClosure", value: function formatNumberClosure( filter) { return function (balance) { var formattedBalance = parseFloat(balance); if (filter.no_cents) { formattedBalance = parseInt(formattedBalance, 10); } if (filter.divide_1000) { formattedBalance /= 1000; } return formattedBalance; }; } }]);return AgingReport;}(_http_controllers_BaseController__WEBPACK_IMPORTED_MODULE_9__["default"]); /***/ }), /***/ "./src/http/controllers/FinancialStatements/BalanceSheet.js": /*!******************************************************************!*\ !*** ./src/http/controllers/FinancialStatements/BalanceSheet.js ***! \******************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray"); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js"); /* harmony import */ var _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/lib/DependencyGraph */ "./src/lib/DependencyGraph/index.js"); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./FinancialStatementMixin */ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router(); router.get('/', this.balanceSheet.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_11__["default"])(this.balanceSheet.handler)); return router; }, /** * Retrieve the balance sheet. */ balanceSheet: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('accounting_method').optional().isIn(['cash', 'accural']), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('from_date').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('to_date').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('display_columns_type').optional().isIn(['date_periods', 'total']), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('display_columns_by').optional({ nullable: true, checkFalsy: true }). isIn(['year', 'month', 'week', 'day', 'quarter']), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.divide_1000').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids').isArray().optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids.*').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('none_zero').optional().isBoolean().toBoolean()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, _req$models, Account, AccountType, filter, balanceFormatter, comparatorDateType, balanceSheetTypes, accounts, accountsGraph, journalEntriesCollected, journalEntries, dateRangeSet, totalPeriods, accountsMapperToResponse, assetsAccounts, liabilitiesAccounts, assetsAccountsResponse, liabilitiesEquityResponse;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:_req$models = req.models, Account = _req$models.Account, AccountType = _req$models.AccountType; filter = _objectSpread({ display_columns_type: 'total', display_columns_by: '', from_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().startOf('year').format('YYYY-MM-DD'), to_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().endOf('year').format('YYYY-MM-DD'), number_format: { no_cents: false, divide_1000: false }, none_zero: false, basis: 'cash', account_ids: [] }, req.query); if (!Array.isArray(filter.account_ids)) { filter.account_ids = [filter.account_ids]; } // Account balance formmatter based on the given query. balanceFormatter = Object(_FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_12__["formatNumberClosure"])(filter.number_format); comparatorDateType = filter.display_columns_type === 'total' ? 'day' : filter.display_columns_by;_context.next = 10;return ( AccountType.query().where('balance_sheet', true));case 10:balanceSheetTypes = _context.sent;_context.next = 13;return ( Account.query() // .remember('balance_sheet_accounts') .whereIn('account_type_id', balanceSheetTypes.map(function (a) {return a.id;})). modify('filterAccounts', filter.account_ids). withGraphFetched('type'). withGraphFetched('transactions'). modifyGraph('transactions', function (builder) { builder.modify('filterDateRange', null, filter.to_date); }));case 13:accounts = _context.sent; // Accounts dependency graph. accountsGraph = _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_10__["default"].fromArray( accounts, { itemId: 'id', parentItemId: 'parentAccountId' }); // Load all entries that associated to the given accounts. journalEntriesCollected = Account.collectJournalEntries(accounts); journalEntries = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsGraph); journalEntries.loadEntries(journalEntriesCollected); // Date range collection. dateRangeSet = filter.display_columns_type === 'date_periods' ? Object(_utils__WEBPACK_IMPORTED_MODULE_9__["dateRangeCollection"])( filter.from_date, filter.to_date, comparatorDateType) : []; // Gets the date range set from start to end date. totalPeriods = function totalPeriods(account) {return { total_periods: dateRangeSet.map(function (date) { var amount = journalEntries.getAccountBalance(account.id, date, comparatorDateType); return { amount: amount, formatted_amount: balanceFormatter(amount), date: date }; }) };}; accountsMapperToResponse = function accountsMapperToResponse(account) { // Calculates the closing balance to the given date. var closingBalance = journalEntries.getAccountBalance(account.id, filter.to_date); return _objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_7__["pick"])(account, ['id', 'index', 'name', 'code', 'parentAccountId']), {}, filter.display_columns_type === 'date_periods' && totalPeriods(account), { total: { amount: closingBalance, formatted_amount: balanceFormatter(closingBalance), date: filter.to_date } }); }; // Retrieve all assets accounts. assetsAccounts = accounts.filter(function (account) {return ( account.type.normal === 'debit' && ( account.transactions.length > 0 || !filter.none_zero));}). map(accountsMapperToResponse); // Retrieve all liability accounts. liabilitiesAccounts = accounts.filter(function (account) {return ( account.type.normal === 'credit' && ( account.transactions.length > 0 || !filter.none_zero));}). map(accountsMapperToResponse); // Retrieve the asset balance sheet. assetsAccountsResponse = Account.toNestedArray(assetsAccounts); // Retrieve liabilities and equity balance sheet. liabilitiesEquityResponse = Account.toNestedArray(liabilitiesAccounts); // Response. return _context.abrupt("return", res.status(200).send({ query: _objectSpread({}, filter), columns: _objectSpread({}, dateRangeSet), accounts: [ { name: 'Assets', type: 'assets', children: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(assetsAccountsResponse) }, { name: 'Liabilities & Equity', type: 'liabilities_equity', children: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(liabilitiesEquityResponse) }] }));case 26:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js": /*!*****************************************************************************!*\ !*** ./src/http/controllers/FinancialStatements/FinancialStatementMixin.js ***! \*****************************************************************************/ /*! exports provided: formatNumberClosure */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatNumberClosure", function() { return formatNumberClosure; }); var formatNumberClosure = function formatNumberClosure(filter) {return function (balance) { var formattedBalance = parseFloat(balance); if (filter.no_cents) { formattedBalance = parseInt(formattedBalance, 10); } if (filter.divide_1000) { formattedBalance /= 1000; } return formattedBalance; };}; /***/ }), /***/ "./src/http/controllers/FinancialStatements/JournalSheet.js": /*!******************************************************************!*\ !*** ./src/http/controllers/FinancialStatements/JournalSheet.js ***! \******************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js"); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FinancialStatementMixin */ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router(); router.get('/', this.journal.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.journal.handler)); return router; }, /** * Retrieve the ledger report of the given account. */ journal: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('from_date').optional().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('to_date').optional().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["oneOf"])([ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('transaction_types').optional().isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('transaction_types.*').optional().isNumeric().toInt()], [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('transaction_types').optional().trim().escape()]), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["oneOf"])([ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('account_ids').optional().isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('account_ids.*').optional().isNumeric().toInt()], [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('account_ids').optional().isNumeric().toInt()]), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('from_range').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('to_range').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('number_format.divide_1000').optional().isBoolean().toBoolean()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, AccountTransaction, filter, accountsJournalEntries, formatNumber, journalGrouped, journal;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: AccountTransaction = req.models.AccountTransaction; filter = _objectSpread({ from_date: moment__WEBPACK_IMPORTED_MODULE_5___default()().startOf('year').format('YYYY-MM-DD'), to_date: moment__WEBPACK_IMPORTED_MODULE_5___default()().endOf('year').format('YYYY-MM-DD'), from_range: null, to_range: null, account_ids: [], transaction_types: [], number_format: { no_cents: false, divide_1000: false } }, req.query); if (!Array.isArray(filter.transaction_types)) { filter.transaction_types = [filter.transaction_types]; } if (!Array.isArray(filter.account_ids)) { filter.account_ids = [filter.account_ids]; } filter.account_ids = filter.account_ids.map(function (id) {return parseInt(id, 10);});_context.next = 10;return ( AccountTransaction.query() // .remember() .modify('filterDateRange', filter.from_date, filter.to_date). modify('filterAccounts', filter.account_ids). modify('filterTransactionTypes', filter.transaction_types). modify('filterAmountRange', filter.from_range, filter.to_range). withGraphFetched('account.type'));case 10:accountsJournalEntries = _context.sent; formatNumber = Object(_FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_9__["formatNumberClosure"])(filter.number_format); journalGrouped = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["groupBy"])(accountsJournalEntries, function (entry) {return "".concat(entry.referenceId, "-").concat(entry.referenceType);}); journal = Object.keys(journalGrouped).map(function (key) { var transactionsGroup = journalGrouped[key]; var journalPoster = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_7__["default"](); journalPoster.loadEntries(transactionsGroup); var trialBalance = journalPoster.getTrialBalance(); return { id: key, entries: transactionsGroup, credit: trialBalance.credit, debit: trialBalance.debit, formatted_credit: formatNumber(trialBalance.credit), formatted_debit: formatNumber(trialBalance.debit) }; });return _context.abrupt("return", res.status(200).send({ query: _objectSpread({}, filter), journal: journal }));case 15:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/FinancialStatements/PayableAgingSummary.js": /*!*************************************************************************!*\ !*** ./src/http/controllers/FinancialStatements/PayableAgingSummary.js ***! \*************************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PayableAgingSummary; }); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray"); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_9__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_11__); /* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js"); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _http_controllers_FinancialStatements_AgingReport__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/http/controllers/FinancialStatements/AgingReport */ "./src/http/controllers/FinancialStatements/AgingReport.js"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_15__); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} var PayableAgingSummary = /*#__PURE__*/function (_AgingReport) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default()(PayableAgingSummary, _AgingReport);function PayableAgingSummary() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, PayableAgingSummary);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(PayableAgingSummary).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(PayableAgingSummary, null, [{ key: "router", /** * Router constructor. */value: function router() { var router = express__WEBPACK_IMPORTED_MODULE_9___default.a.Router(); router.get( '/', this.payableAgingSummaryRoles(), this.validateResults, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.validateVendorsIds.bind(this)), Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.payableAgingSummary.bind(this))); return router; } /** * Validates the report vendors ids query. */ }, { key: "validateVendorsIds", value: function () {var _validateVendorsIds = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee( req, res, next) {var Vendor, filter, storedCustomers, storedCustomersIds, notStoredCustomersIds;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: Vendor = req.models.Vendor; filter = _objectSpread({ vendors_ids: [] }, req.query); if (!Array.isArray(filter.vendors_ids)) { filter.vendors_ids = [filter.vendors_ids]; }if (!( filter.vendors_ids.length > 0)) {_context.next = 11;break;}_context.next = 6;return ( Vendor.query().whereIn( 'id', filter.vendors_ids));case 6:storedCustomers = _context.sent; storedCustomersIds = storedCustomers.map(function (c) {return c.id;}); notStoredCustomersIds = Object(lodash__WEBPACK_IMPORTED_MODULE_11__["difference"])( storedCustomersIds, filter, vendors_ids);if (! notStoredCustomersIds.length) {_context.next = 11;break;}return _context.abrupt("return", res.status(400).send({ errors: [{ type: 'VENDORS.IDS.NOT.FOUND', code: 300 }] }));case 11: next();case 12:case "end":return _context.stop();}}}, _callee);}));function validateVendorsIds(_x, _x2, _x3) {return _validateVendorsIds.apply(this, arguments);}return validateVendorsIds;}() /** * Receivable aging summary validation roles. */ }, { key: "payableAgingSummaryRoles", value: function payableAgingSummaryRoles() { return [ Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('as_date').optional().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('aging_days_before').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('aging_periods').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('number_format.1000_divide').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('vendors_ids.*').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('none_zero').optional().isBoolean().toBoolean()]; } /** * Retrieve payable aging summary report. */ }, { key: "payableAgingSummary", value: function () {var _payableAgingSummary = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2( req, res) {var _this = this;var _req$models, Customer, Account, AccountTransaction, AccountType, storedVendors, filter, accountsReceivableType, accountsReceivable, transactions, journalPoster, agingPeriods, totalFormatter, vendors, agingClosingBalance, totalClosingBalance, agingTotal;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:_req$models = req.models, Customer = _req$models.Customer, Account = _req$models.Account, AccountTransaction = _req$models.AccountTransaction, AccountType = _req$models.AccountType;_context2.next = 3;return ( Customer.query());case 3:storedVendors = _context2.sent; filter = _objectSpread({ as_date: moment__WEBPACK_IMPORTED_MODULE_15___default()().format('YYYY-MM-DD'), aging_days_before: 30, aging_periods: 3, number_format: { no_cents: false, divide_1000: false } }, req.query);_context2.next = 7;return ( AccountType.query(). where('key', 'accounts_payable'). first());case 7:accountsReceivableType = _context2.sent;_context2.next = 10;return ( Account.query(). where('account_type_id', accountsReceivableType.id). remember(). first());case 10:accountsReceivable = _context2.sent;_context2.next = 13;return ( AccountTransaction.query(). modify('filterDateRange', null, filter.as_date). where('account_id', accountsReceivable.id). remember());case 13:transactions = _context2.sent; journalPoster = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_12__["default"](); journalPoster.loadEntries(transactions); agingPeriods = this.agingRangePeriods( filter.as_date, filter.aging_days_before, filter.aging_periods); // Total amount formmatter based on the given query. totalFormatter = formatNumberClosure(filter.number_format); vendors = storedVendors.map(function (vendor) { // Calculate the trial balance total of the given vendor. var vendorBalance = journalPoster.getContactTrialBalance( accountsReceivable.id, vendor.id, 'vendor'); var agingClosingBalance = agingPeriods.map(function (agingPeriod) { // Calculate the trial balance between the given date period. var agingTrialBalance = journalPoster.getContactTrialBalance( accountsReceivable.id, vendor.id, 'vendor', agingPeriod.from_period); return _objectSpread({}, agingPeriod, { closingBalance: agingTrialBalance.debit }); }); var aging = _this.contactAgingBalance( agingClosingBalance, vendorBalance.credit); return { vendor_name: vendor.displayName, aging: aging.map(function (item) {return _objectSpread({}, item, { formatted_total: totalFormatter(item.total) });}), total: vendorBalance.balance, formatted_total: totalFormatted(vendorBalance.balance) }; }); agingClosingBalance = agingPeriods.map(function (agingPeriod) { var closingTrialBalance = journalPoster.getContactTrialBalance( accountsReceivable.id, null, 'vendor', agingPeriod.from_period); return _objectSpread({}, agingPeriod, { closingBalance: closingTrialBalance.balance }); }); totalClosingBalance = journalPoster.getContactTrialBalance( accountsReceivable.id, null, 'vendor'); agingTotal = this.contactAgingBalance( agingClosingBalance, totalClosingBalance.credit);return _context2.abrupt("return", res.status(200).send({ columns: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(agingPeriods), aging: { vendors: vendors, total: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()( agingTotal.map(function (item) {return _objectSpread({}, item, { formatted_total: totalFormatter(item.total) });})) } }));case 23:case "end":return _context2.stop();}}}, _callee2, this);}));function payableAgingSummary(_x4, _x5) {return _payableAgingSummary.apply(this, arguments);}return payableAgingSummary;}() }]);return PayableAgingSummary;}(_http_controllers_FinancialStatements_AgingReport__WEBPACK_IMPORTED_MODULE_14__["default"]); /***/ }), /***/ "./src/http/controllers/FinancialStatements/ProfitLossSheet.js": /*!*********************************************************************!*\ !*** ./src/http/controllers/FinancialStatements/ProfitLossSheet.js ***! \*********************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray"); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js"); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./FinancialStatementMixin */ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js"); /* harmony import */ var _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/lib/DependencyGraph */ "./src/lib/DependencyGraph/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router(); router.get('/', this.profitLossSheet.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_10__["default"])(this.profitLossSheet.handler)); return router; }, /** * Retrieve profit/loss financial statement. */ profitLossSheet: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('basis').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('from_date').optional().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('to_date').optional().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.no_cents').optional().isBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.divide_1000').optional().isBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('basis').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('none_zero').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids').isArray().optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids.*').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('display_columns_type').optional().isIn([ 'total', 'date_periods']), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('display_columns_by').optional({ nullable: true, checkFalsy: true }). isIn(['year', 'month', 'week', 'day', 'quarter'])], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, _req$models, Account, AccountType, filter, incomeStatementTypes, accounts, accountsGraph, filteredAccounts, journalEntriesCollected, journalEntries, numberFormatter, comparatorDateType, dateRangeSet, accountsMapper, totalAccountsReducer, accountsIncome, accountsExpenses, totalPeriodsMapper, netIncomePeriodsMapper, netIncomeTotal, incomeResponse, expenseResponse, netIncomeResponse;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:_req$models = req.models, Account = _req$models.Account, AccountType = _req$models.AccountType; filter = _objectSpread({ from_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().startOf('year').format('YYYY-MM-DD'), to_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().endOf('year').format('YYYY-MM-DD'), number_format: { no_cents: false, divide_1000: false }, basis: 'accural', none_zero: false, display_columns_type: 'total', display_columns_by: 'month', account_ids: [] }, req.query); if (!Array.isArray(filter.account_ids)) { filter.account_ids = [filter.account_ids]; }_context.next = 8;return ( AccountType.query().where('income_sheet', true));case 8:incomeStatementTypes = _context.sent;_context.next = 11;return ( Account.query() // .remember('profit_loss_accounts') .modify('filterAccounts', filter.account_ids). whereIn('account_type_id', incomeStatementTypes.map(function (t) {return t.id;})). withGraphFetched('type'). withGraphFetched('transactions'));case 11:accounts = _context.sent; // Accounts dependency graph. accountsGraph = _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_12__["default"].fromArray( accounts, { itemId: 'id', parentItemId: 'parentAccountId' }); // Filter all none zero accounts if it was enabled. filteredAccounts = accounts.filter(function (account) {return ( account.transactions.length > 0 || !filter.none_zero);}); journalEntriesCollected = Account.collectJournalEntries(accounts); journalEntries = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsGraph); journalEntries.loadEntries(journalEntriesCollected); // Account balance formmatter based on the given query. numberFormatter = Object(_FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_11__["formatNumberClosure"])(filter.number_format); comparatorDateType = filter.display_columns_type === 'total' ? 'day' : filter.display_columns_by; // Gets the date range set from start to end date. dateRangeSet = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["dateRangeCollection"])( filter.from_date, filter.to_date, comparatorDateType); accountsMapper = function accountsMapper(incomeExpenseAccounts) {return ( incomeExpenseAccounts.map(function (account) {return _objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_7__["pick"])(account, ['id', 'index', 'name', 'code', 'parentAccountId']), {}, filter.display_columns_type === 'total' && { total: function () { var amount = journalEntries.getAccountBalance(account.id, filter.to_date); return { amount: amount, date: filter.to_date, formatted_amount: numberFormatter(amount) }; }() }, {}, filter.display_columns_type === 'date_periods' && { periods: dateRangeSet.map(function (date) { var type = comparatorDateType; var amount = journalEntries.getAccountBalance(account.id, date, type); return { date: date, amount: amount, formatted_amount: numberFormatter(amount) }; }) });}));}; totalAccountsReducer = function totalAccountsReducer(incomeExpenseAccounts) {return ( incomeExpenseAccounts.reduce(function (acc, account) { var amount = account ? account.total.amount : 0; return amount + acc; }, 0));}; accountsIncome = Account.toNestedArray(accountsMapper(filteredAccounts. filter(function (account) {return account.type.normal === 'credit';}))); accountsExpenses = Account.toNestedArray(accountsMapper(filteredAccounts. filter(function (account) {return account.type.normal === 'debit';}))); // @return {Array} totalPeriodsMapper = function totalPeriodsMapper(incomeExpenseAccounts) {return ( Object.values(dateRangeSet.reduce(function (acc, date, index) { var amount = 0; incomeExpenseAccounts.forEach(function (account) { var currentDate = account.periods[index]; amount += currentDate.amount || 0; }); acc[date] = { date: date, amount: amount, formatted_amount: numberFormatter(amount) }; return acc; }, {})));}; // Total income(date) - Total expenses(date) = Net income(date) // @return {Array} netIncomePeriodsMapper = function netIncomePeriodsMapper(totalIncomeAcocunts, totalExpenseAccounts) {return ( dateRangeSet.map(function (date, index) { var totalIncome = totalIncomeAcocunts[index]; var totalExpenses = totalExpenseAccounts[index]; var amount = totalIncome.amount || 0; amount -= totalExpenses.amount || 0; return { date: date, amount: amount, formatted_amount: numberFormatter(amount) }; }));}; // @return {Object} netIncomeTotal = function netIncomeTotal(totalIncome, totalExpenses) { var netIncomeAmount = totalIncome.amount - totalExpenses.amount; return { amount: netIncomeAmount, formatted_amount: netIncomeAmount, date: filter.to_date }; }; incomeResponse = _objectSpread({ entry_normal: 'credit', accounts: accountsIncome }, filter.display_columns_type === 'total' && function () { var totalIncomeAccounts = totalAccountsReducer(accountsIncome); return { total: { amount: totalIncomeAccounts, date: filter.to_date, formatted_amount: numberFormatter(totalIncomeAccounts) } }; }(), {}, filter.display_columns_type === 'date_periods' && { total_periods: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()( totalPeriodsMapper(accountsIncome)) }); expenseResponse = _objectSpread({ entry_normal: 'debit', accounts: accountsExpenses }, filter.display_columns_type === 'total' && function () { var totalExpensesAccounts = totalAccountsReducer(accountsExpenses); return { total: { amount: totalExpensesAccounts, date: filter.to_date, formatted_amount: numberFormatter(totalExpensesAccounts) } }; }(), {}, filter.display_columns_type === 'date_periods' && { total_periods: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()( totalPeriodsMapper(accountsExpenses)) }); netIncomeResponse = _objectSpread({}, filter.display_columns_type === 'total' && { total: _objectSpread({}, netIncomeTotal(incomeResponse.total, expenseResponse.total)) }, {}, filter.display_columns_type === 'date_periods' && { total_periods: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()( netIncomePeriodsMapper( incomeResponse.total_periods, expenseResponse.total_periods)) });return _context.abrupt("return", res.status(200).send({ query: _objectSpread({}, filter), columns: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(dateRangeSet), profitLoss: { income: incomeResponse, expenses: expenseResponse, net_income: netIncomeResponse } }));case 31:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/FinancialStatements/ReceivableAgingSummary.js": /*!****************************************************************************!*\ !*** ./src/http/controllers/FinancialStatements/ReceivableAgingSummary.js ***! \****************************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ReceivableAgingSummary; }); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray"); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_9__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_11__); /* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js"); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _http_controllers_FinancialStatements_AgingReport__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/http/controllers/FinancialStatements/AgingReport */ "./src/http/controllers/FinancialStatements/AgingReport.js"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_15__); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} var ReceivableAgingSummary = /*#__PURE__*/function (_AgingReport) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default()(ReceivableAgingSummary, _AgingReport);function ReceivableAgingSummary() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, ReceivableAgingSummary);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(ReceivableAgingSummary).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(ReceivableAgingSummary, null, [{ key: "router", /** * Router constructor. */value: function router() { var router = express__WEBPACK_IMPORTED_MODULE_9___default.a.Router(); router.get( '/', this.receivableAgingSummaryRoles, this.validateResults, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.validateCustomersIds.bind(this)), Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.receivableAgingSummary.bind(this))); return router; } /** * Validates the report customers ids query. */ }, { key: "validateCustomersIds", value: function () {var _validateCustomersIds = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee( req, res, next) {var Customer, filter, storedCustomers, storedCustomersIds, notStoredCustomersIds;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: Customer = req.models.Customer; console.log(req.query); filter = _objectSpread({ customer_ids: [] }, req.query); if (!Array.isArray(filter.customer_ids)) { filter.customer_ids = [filter.customer_ids]; }if (!( filter.customer_ids.length > 0)) {_context.next = 12;break;}_context.next = 7;return ( Customer.query().whereIn( 'id', filter.customer_ids));case 7:storedCustomers = _context.sent; storedCustomersIds = storedCustomers.map(function (c) {return parseInt(c.id, 10);}); notStoredCustomersIds = Object(lodash__WEBPACK_IMPORTED_MODULE_11__["difference"])( filter.customer_ids.map(function (a) {return parseInt(a, 10);}), storedCustomersIds);if (! notStoredCustomersIds.length) {_context.next = 12;break;}return _context.abrupt("return", res.status(400).send({ errors: [ { type: 'CUSTOMERS.IDS.NOT.FOUND', code: 300, ids: notStoredCustomersIds }] }));case 12: next();case 13:case "end":return _context.stop();}}}, _callee);}));function validateCustomersIds(_x, _x2, _x3) {return _validateCustomersIds.apply(this, arguments);}return validateCustomersIds;}() /** * Receivable aging summary validation roles. */ }, { key: "receivableAgingSummary", /** * Retrieve receivable aging summary report. */value: function () {var _receivableAgingSummary = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2( req, res) {var _this = this;var _req$models, Customer, Account, AccountTransaction, AccountType, filter, storedCustomers, accountsReceivableType, accountsReceivable, transactions, journalPoster, agingPeriods, totalFormatter, customers, agingClosingBalance, totalClosingBalance, agingTotal;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:_req$models = req.models, Customer = _req$models.Customer, Account = _req$models.Account, AccountTransaction = _req$models.AccountTransaction, AccountType = _req$models.AccountType; filter = _objectSpread({ as_date: moment__WEBPACK_IMPORTED_MODULE_15___default()().format('YYYY-MM-DD'), aging_days_before: 30, aging_periods: 3, number_format: { no_cents: false, divide_1000: false }, customer_ids: [], none_zero: false }, req.query); if (!Array.isArray(filter.customer_ids)) { filter.customer_ids = [filter.customer_ids]; }_context2.next = 5;return ( Customer.query().onBuild(function (builder) { if (filter.customer_ids) { builder.modify('filterCustomerIds', filter.customer_ids); } return builder; }));case 5:storedCustomers = _context2.sent;_context2.next = 8;return ( AccountType.query(). where('key', 'accounts_receivable'). first());case 8:accountsReceivableType = _context2.sent;_context2.next = 11;return ( Account.query(). where('account_type_id', accountsReceivableType.id). remember(). first());case 11:accountsReceivable = _context2.sent;_context2.next = 14;return ( AccountTransaction.query().onBuild(function (query) { query.modify('filterDateRange', null, filter.as_date); query.where('account_id', accountsReceivable.id); query.modify('filterContactType', 'customer'); if (filter.customer_ids.length > 0) { query.modify('filterContactIds', filter.customer_ids); } query.remember(); return query; }));case 14:transactions = _context2.sent; journalPoster = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_12__["default"](); journalPoster.loadEntries(transactions); agingPeriods = this.agingRangePeriods( filter.as_date, filter.aging_days_before, filter.aging_periods); // Total amount formmatter based on the given query. totalFormatter = this.formatNumberClosure(filter.number_format); customers = storedCustomers.map(function (customer) { // Calculate the trial balance total of the given customer. var customerBalance = journalPoster.getContactTrialBalance( accountsReceivable.id, customer.id, 'customer'); var agingClosingBalance = agingPeriods.map(function (agingPeriod) { // Calculate the trial balance between the given date period. var agingTrialBalance = journalPoster.getContactTrialBalance( accountsReceivable.id, customer.id, 'customer', agingPeriod.from_period); return _objectSpread({}, agingPeriod, { closingBalance: agingTrialBalance.debit }); }); var aging = _this.contactAgingBalance( agingClosingBalance, customerBalance.credit); return { customer_name: customer.displayName, aging: aging.map(function (item) {return _objectSpread({}, item, { formatted_total: totalFormatter(item.total) });}), total: customerBalance.balance, formatted_total: totalFormatter(customerBalance.balance) }; }); agingClosingBalance = agingPeriods.map(function (agingPeriod) { var closingTrialBalance = journalPoster.getContactTrialBalance( accountsReceivable.id, null, 'customer', agingPeriod.from_period); return _objectSpread({}, agingPeriod, { closingBalance: closingTrialBalance.balance }); }); totalClosingBalance = journalPoster.getContactTrialBalance( accountsReceivable.id, null, 'customer'); agingTotal = this.contactAgingBalance( agingClosingBalance, totalClosingBalance.credit);return _context2.abrupt("return", res.status(200).send({ columns: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(agingPeriods), aging: { customers: customers, total: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()( agingTotal.map(function (item) {return _objectSpread({}, item, { formatted_total: totalFormatter(item.total) });})) } }));case 24:case "end":return _context2.stop();}}}, _callee2, this);}));function receivableAgingSummary(_x4, _x5) {return _receivableAgingSummary.apply(this, arguments);}return receivableAgingSummary;}() }, { key: "receivableAgingSummaryRoles", get: function get() {return [Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('as_date').optional().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('aging_days_before').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('aging_periods').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('number_format.1000_divide').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["oneOf"])([Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('customer_ids').optional().isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('customer_ids.*').isNumeric().toInt()], [Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('customer_ids').optional().isNumeric().toInt()]), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('none_zero').optional().isBoolean().toBoolean()];} }]);return ReceivableAgingSummary;}(_http_controllers_FinancialStatements_AgingReport__WEBPACK_IMPORTED_MODULE_14__["default"]); /***/ }), /***/ "./src/http/controllers/FinancialStatements/TrialBalanceSheet.js": /*!***********************************************************************!*\ !*** ./src/http/controllers/FinancialStatements/TrialBalanceSheet.js ***! \***********************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray"); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js"); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/lib/DependencyGraph */ "./src/lib/DependencyGraph/index.js"); /* harmony import */ var _FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./FinancialStatementMixin */ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router(); router.get('/', this.trialBalanceSheet.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.trialBalanceSheet.handler)); return router; }, /** * Retrieve the trial balance sheet. */ trialBalanceSheet: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('basis').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('from_date').optional().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('to_date').optional().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.1000_divide').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids').isArray().optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids.*').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('basis').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('none_zero').optional().isBoolean().toBoolean()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, Account, filter, accounts, accountsGraph, journalEntriesCollect, journalEntries, balanceFormatter, accountsResponse;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: Account = req.models.Account; filter = _objectSpread({ from_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().startOf('year').format('YYYY-MM-DD'), to_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().endOf('year').format('YYYY-MM-DD'), number_format: { no_cents: false, divide_1000: false }, basis: 'accural', none_zero: false, account_ids: [] }, req.query); if (!Array.isArray(filter.account_ids)) { filter.account_ids = [filter.account_ids]; }_context.next = 8;return ( Account.query() // .remember('trial_balance_accounts') .modify('filterAccounts', filter.account_ids). withGraphFetched('type'). withGraphFetched('transactions'). modifyGraph('transactions', function (builder) { builder.modify('sumationCreditDebit'); builder.modify('filterDateRange', filter.from_date, filter.to_date); }));case 8:accounts = _context.sent; // Accounts dependency graph. accountsGraph = _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_9__["default"].fromArray( accounts, { itemId: 'id', parentItemId: 'parentAccountId' }); journalEntriesCollect = Account.collectJournalEntries(accounts); journalEntries = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_7__["default"](accountsGraph); journalEntries.loadEntries(journalEntriesCollect); // Account balance formmatter based on the given query. balanceFormatter = Object(_FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_10__["formatNumberClosure"])(filter.number_format); accountsResponse = accounts. filter(function (account) {return ( account.transactions.length > 0 || !filter.none_zero);}). map(function (account) { var trial = journalEntries.getTrialBalanceWithDepands(account.id); return { id: account.id, parentAccountId: account.parentAccountId, name: account.name, code: account.code, accountNormal: account.type.normal, credit: trial.credit, debit: trial.debit, balance: trial.balance, formatted_credit: balanceFormatter(trial.credit), formatted_debit: balanceFormatter(trial.debit), formatted_balance: balanceFormatter(trial.balance) }; });return _context.abrupt("return", res.status(200).send({ query: _objectSpread({}, filter), accounts: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(Account.toNestedArray(accountsResponse)) }));case 16:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/FinancialStatements/generalLedger.js": /*!*******************************************************************!*\ !*** ./src/http/controllers/FinancialStatements/generalLedger.js ***! \*******************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray"); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js"); /* harmony import */ var _FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FinancialStatementMixin */ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js"); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/lib/DependencyGraph */ "./src/lib/DependencyGraph/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router(); router.get('/', this.generalLedger.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_10__["default"])(this.generalLedger.handler)); return router; }, /** * Retrieve the general ledger financial statement. */ generalLedger: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('from_date').optional().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('to_date').optional().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('basis').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.divide_1000').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('none_zero').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('accounts_ids').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('accounts_ids.*').isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('orderBy').optional().isIn(['created_at', 'name', 'code']), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('order').optional().isIn(['desc', 'asc'])], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, _req$models, AccountTransaction, Account, filter, errorReasons, _accounts, accountsIds, accounts, accountsGraph, openingBalanceTransactions, closingBalanceTransactions, opeingBalanceCollection, closingBalanceCollection, formatNumber, accountsResponse;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:_req$models = req.models, AccountTransaction = _req$models.AccountTransaction, Account = _req$models.Account; filter = _objectSpread({ from_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().startOf('year').format('YYYY-MM-DD'), to_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().endOf('year').format('YYYY-MM-DD'), basis: 'cash', number_format: { no_cents: false, divide_1000: false }, none_zero: false, accounts_ids: [] }, req.query); if (!Array.isArray(filter.accounts_ids)) { filter.accounts_ids = [filter.accounts_ids]; } filter.accounts_ids = filter.accounts_ids.map(function (id) {return parseInt(id, 10);}); errorReasons = [];if (!( filter.accounts_ids.length > 0)) {_context.next = 14;break;}_context.next = 11;return ( Account.query().whereIn('id', filter.accounts_ids));case 11:_accounts = _context.sent; accountsIds = _accounts.map(function (a) {return a.id;}); if (Object(lodash__WEBPACK_IMPORTED_MODULE_7__["difference"])(filter.accounts_ids, accountsIds).length > 0) { errorReasons.push({ type: 'FILTER.ACCOUNTS.IDS.NOT.FOUND', code: 200 }); }case 14:if (!( errorReasons.length > 0)) {_context.next = 16;break;}return _context.abrupt("return", res.status(400).send({ error: errorReasons }));case 16:_context.next = 18;return ( Account.query() // .remember('general_ledger_accounts') .orderBy('index', 'DESC'). modify('filterAccounts', filter.accounts_ids). withGraphFetched('type'). withGraphFetched('transactions'). modifyGraph('transactions', function (builder) { builder.modify('filterDateRange', filter.from_date, filter.to_date); }));case 18:accounts = _context.sent; // Accounts dependency graph. accountsGraph = _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_11__["default"].fromArray( accounts, { itemId: 'id', parentItemId: 'parentAccountId' });_context.next = 22;return ( AccountTransaction.query() // .remember() .modify('filterDateRange', null, filter.from_date). modify('sumationCreditDebit'). withGraphFetched('account.type'));case 22:openingBalanceTransactions = _context.sent;_context.next = 25;return ( AccountTransaction.query() // .remember() .modify('filterDateRange', null, filter.to_date). modify('sumationCreditDebit'). withGraphFetched('account.type'));case 25:closingBalanceTransactions = _context.sent; opeingBalanceCollection = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsGraph); closingBalanceCollection = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsGraph); opeingBalanceCollection.loadEntries(openingBalanceTransactions); closingBalanceCollection.loadEntries(closingBalanceTransactions); // Transaction amount formatter based on the given query. formatNumber = Object(_FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_9__["formatNumberClosure"])(filter.number_format); accountsResponse = accounts. filter(function (account) {return ( account.transactions.length > 0 || !filter.none_zero);}). map(function (account) {return _objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_7__["pick"])(account, ['id', 'name', 'code', 'index', 'parentAccountId']), { transactions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()( account.transactions.map(function (transaction) { var amount = 0; if (account.type.normal === 'credit') { amount += transaction.credit - transaction.debit; } else if (account.type.normal === 'debit') { amount += transaction.debit - transaction.credit; } return _objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_7__["pick"])(transaction, ['id', 'note', 'transactionType', 'referenceType', 'referenceId', 'date', 'createdAt']), { amount: amount, formatted_amount: formatNumber(amount) }); })), opening: function () { var openingAmount = opeingBalanceCollection.getAccountBalance(account.id); return { date: filter.from_date, amount: openingAmount, formatted_amount: formatNumber(openingAmount) }; }(), closing: function () { var closingAmount = closingBalanceCollection.getAccountBalance(account.id); return { date: filter.to_date, amount: closingAmount, formatted_amount: formatNumber(closingAmount) }; }() });});return _context.abrupt("return", res.status(200).send({ query: _objectSpread({}, filter), accounts: Account.toNestedArray(accountsResponse) }));case 33:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/InviteUsers.js": /*!*********************************************!*\ !*** ./src/http/controllers/InviteUsers.js ***! \*********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! uniqid */ "uniqid"); /* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(uniqid__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! path */ "path"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! fs */ "fs"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var mustache__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! mustache */ "mustache"); /* harmony import */ var mustache__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(mustache__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_9__); /* harmony import */ var _services_mail__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/services/mail */ "./src/services/mail.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js"); /* harmony import */ var _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/system/models/SystemUser */ "./src/system/models/SystemUser.js"); /* harmony import */ var _system_models_Invite__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/system/models/Invite */ "./src/system/models/Invite.js"); /* harmony import */ var _models_TenantUser__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/models/TenantUser */ "./src/models/TenantUser.js"); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _system_models_Tenant__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @/system/models/Tenant */ "./src/system/models/Tenant.js"); /* harmony import */ var _system_TenantsManager__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @/system/TenantsManager */ "./src/system/TenantsManager.js"); /* harmony import */ var _http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/http/middleware/jwtAuth */ "./src/http/middleware/jwtAuth.js"); /* harmony import */ var _http_middleware_TenancyMiddleware__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @/http/middleware/TenancyMiddleware */ "./src/http/middleware/TenancyMiddleware.js"); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _services_Logger__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @/services/Logger */ "./src/services/Logger/index.js"); /* harmony import */ var _models_Option__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @/models/Option */ "./src/models/Option.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router(); router.use('/send', _http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_18__["default"]); router.use('/send', _http_middleware_TenancyMiddleware__WEBPACK_IMPORTED_MODULE_19__["default"]); router.post('/send', this.invite.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_15__["default"])(this.invite.handler)); router.post('/accept/:token', this.accept.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_15__["default"])(this.accept.handler)); router.get('/invited/:token', this.invited.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_15__["default"])(this.invited.handler)); return router; }, /** * Invite a user to the authorized user organization. */ invite: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["body"])('email').exists().trim().escape()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, form, user, TenantUser, foundUser, token, invite, tenantUser, Option, organizationOptions, filePath, template, rendered, mailOptions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: form = _objectSpread({}, req.body); user = req.user; TenantUser = req.models.TenantUser;_context.next = 8;return ( _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_12__["default"].query(). where('email', form.email).first());case 8:foundUser = _context.sent;if (! foundUser) {_context.next = 11;break;}return _context.abrupt("return", res.status(400).send({ errors: [{ type: 'USER.EMAIL.ALREADY.REGISTERED', code: 100 }] }));case 11: token = uniqid__WEBPACK_IMPORTED_MODULE_4___default()();_context.next = 14;return ( _system_models_Invite__WEBPACK_IMPORTED_MODULE_13__["default"].query().insert({ email: form.email, tenant_id: user.tenantId, token: token }));case 14:invite = _context.sent;_context.next = 17;return ( TenantUser.query().insert({ first_name: form.email, email: form.email }));case 17:tenantUser = _context.sent; Option = req.models.Option;_context.next = 21;return ( Option.query(). where('key', 'organization_name'));case 21:organizationOptions = _context.sent; filePath = path__WEBPACK_IMPORTED_MODULE_6___default.a.join(global.rootPath, 'views/mail/UserInvite.html'); template = fs__WEBPACK_IMPORTED_MODULE_7___default.a.readFileSync(filePath, 'utf8'); rendered = mustache__WEBPACK_IMPORTED_MODULE_8___default.a.render(template, { acceptUrl: "".concat(req.protocol, "://").concat(req.hostname, "/invite/accept/").concat(invite.token), fullName: "".concat(user.firstName, " ").concat(user.lastName), firstName: user.firstName, lastName: user.lastName, email: user.email, organizationName: organizationOptions.getMeta('organization_name') }); mailOptions = { to: user.email, from: "".concat(process.env.MAIL_FROM_NAME, " ").concat(process.env.MAIL_FROM_ADDRESS), subject: "".concat(user.fullName, " has invited you to join a Bigcapital"), html: rendered }; _services_mail__WEBPACK_IMPORTED_MODULE_10__["default"].sendMail(mailOptions, function (error) { if (error) { _services_Logger__WEBPACK_IMPORTED_MODULE_21__["default"].log('error', 'Failed send user invite mail', { error: error, form: form }); } _services_Logger__WEBPACK_IMPORTED_MODULE_21__["default"].log('info', 'User has been sent invite user email successfuly.', { form: form }); });return _context.abrupt("return", res.status(200).send());case 28:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Acceprt the inviation. */ accept: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('first_name').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('last_name').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('phone_number').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('password').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('token').exists().trim().escape()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var validationErrors, token, inviteToken, form, systemUser, errorReasons, tenant, tenantDb, hashedPassword, userForm, foundTenantUser, insertUserOper, insertSysUserOper, deleteInviteTokenOper;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: token = req.params.token;_context2.next = 6;return ( _system_models_Invite__WEBPACK_IMPORTED_MODULE_13__["default"].query(). where('token', token).first());case 6:inviteToken = _context2.sent;if ( inviteToken) {_context2.next = 9;break;}return _context2.abrupt("return", res.status(404).send({ errors: [{ type: 'INVITE.TOKEN.NOT.FOUND', code: 300 }] }));case 9: form = _objectSpread({ language: 'en' }, req.body);_context2.next = 12;return ( _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_12__["default"].query(). where('phone_number', form.phone_number). first());case 12:systemUser = _context2.sent; errorReasons = []; // Validate there is already registered phone number. if (systemUser && systemUser.phoneNumber === form.phone_number) { errorReasons.push({ type: 'PHONE_MUMNER.ALREADY.EXISTS', code: 400 }); }if (!( errorReasons.length > 0)) {_context2.next = 17;break;}return _context2.abrupt("return", res.status(400).send({ errors: errorReasons }));case 17:_context2.next = 19;return ( _system_models_Tenant__WEBPACK_IMPORTED_MODULE_16__["default"].query(). where('id', inviteToken.tenantId).first());case 19:tenant = _context2.sent; tenantDb = _system_TenantsManager__WEBPACK_IMPORTED_MODULE_17__["default"].knexInstance(tenant.organizationId);_context2.next = 23;return ( Object(_utils__WEBPACK_IMPORTED_MODULE_11__["hashPassword"])(form.password));case 23:hashedPassword = _context2.sent; userForm = { first_name: form.first_name, last_name: form.last_name, email: inviteToken.email, phone_number: form.phone_number, language: form.language, active: 1 }; _models_TenantModel__WEBPACK_IMPORTED_MODULE_20__["default"].knexBinded = tenantDb;_context2.next = 28;return ( _models_TenantUser__WEBPACK_IMPORTED_MODULE_14__["default"].query(). where('phone_number', form.phone_number).first());case 28:foundTenantUser = _context2.sent;if (! foundTenantUser) {_context2.next = 31;break;}return _context2.abrupt("return", res.status(400).send({ errors: [{ type: 'PHONE_NUMBER.ALREADY.EXISTS', code: 400 }] }));case 31: insertUserOper = _models_TenantUser__WEBPACK_IMPORTED_MODULE_14__["default"].bindKnex(tenantDb). query(). where('email', userForm.email). patch(_objectSpread({}, userForm, { invite_accepted_at: moment__WEBPACK_IMPORTED_MODULE_9___default()().format('YYYY/MM/DD') })); insertSysUserOper = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_12__["default"].query().insert(_objectSpread({}, userForm, { password: hashedPassword, tenant_id: inviteToken.tenantId })); deleteInviteTokenOper = _system_models_Invite__WEBPACK_IMPORTED_MODULE_13__["default"].query(). where('token', inviteToken.token)["delete"]();_context2.next = 36;return ( Promise.all([ insertUserOper, insertSysUserOper, deleteInviteTokenOper]));case 36:return _context2.abrupt("return", res.status(200).send());case 37:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Get */ invited: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('token').exists().trim().escape()], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var token, inviteToken, tenant, tenantDb, organizationOptions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: token = req.params.token;_context3.next = 3;return ( _system_models_Invite__WEBPACK_IMPORTED_MODULE_13__["default"].query(). where('token', token).first());case 3:inviteToken = _context3.sent;if ( inviteToken) {_context3.next = 6;break;}return _context3.abrupt("return", res.status(404).send({ errors: [{ type: 'INVITE.TOKEN.NOT.FOUND', code: 300 }] }));case 6:_context3.next = 8;return ( _system_models_Tenant__WEBPACK_IMPORTED_MODULE_16__["default"].query(). where('id', inviteToken.tenantId).first());case 8:tenant = _context3.sent; tenantDb = _system_TenantsManager__WEBPACK_IMPORTED_MODULE_17__["default"].knexInstance(tenant.organizationId);_context3.next = 12;return ( _models_Option__WEBPACK_IMPORTED_MODULE_22__["default"].bindKnex(tenantDb).query(). where('key', 'organization_name'));case 12:organizationOptions = _context3.sent;return _context3.abrupt("return", res.status(200).send({ data: { organization_name: organizationOptions.getMeta('organization_name', ''), invited_email: inviteToken.email } }));case 14:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/ItemCategories.js": /*!************************************************!*\ !*** ./src/http/controllers/ItemCategories.js ***! \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/DynamicFilter */ "./src/lib/DynamicFilter/index.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor method. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router(); // const permit = Authorization('items_categories'); router.post('/:id', this.editCategory.validation, Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.editCategory.handler)); router.post('/', this.newCategory.validation, Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.newCategory.handler)); router["delete"]('/bulk', this.bulkDeleteCategories.validation, Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.bulkDeleteCategories.handler)); router["delete"]('/:id', this.deleteItem.validation, Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.deleteItem.handler)); router.get('/:id', this.getCategory.validation, Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getCategory.handler)); router.get('/', this.getList.validation, Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getList.handler)); return router; }, /** * Creates a new item category. */ newCategory: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('name').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('parent_category_id'). optional({ nullable: true, checkFalsy: true }). isNumeric(). toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description'). optional(). trim(). escape()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, user, form, ItemCategory, foundParentCategory, category;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: user = req.user; form = _objectSpread({}, req.body); ItemCategory = req.models.ItemCategory;if (! form.parent_category_id) {_context.next = 12;break;}_context.next = 9;return ( ItemCategory.query(). where('id', form.parent_category_id). first());case 9:foundParentCategory = _context.sent;if ( foundParentCategory) {_context.next = 12;break;}return _context.abrupt("return", res.boom.notFound('The parent category ID is not found.', { errors: [{ type: 'PARENT_CATEGORY_NOT_FOUND', code: 100 }] }));case 12:_context.next = 14;return ( ItemCategory.query().insert(_objectSpread({}, form, { user_id: user.id })));case 14:category = _context.sent;return _context.abrupt("return", res.status(200).send({ category: category }));case 16:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Edit details of the given category item. */ editCategory: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('name').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('parent_category_id'). optional({ nullable: true, checkFalsy: true }). isNumeric(). toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description').optional().trim().escape()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var id, validationErrors, form, ItemCategory, itemCategory, foundParentCategory, updateItemCategory;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: id = req.params.id; validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context2.next = 4;break;}return _context2.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 4: form = _objectSpread({}, req.body); ItemCategory = req.models.ItemCategory;_context2.next = 8;return ( ItemCategory.query(). where('id', id). first());case 8:itemCategory = _context2.sent;if ( itemCategory) {_context2.next = 11;break;}return _context2.abrupt("return", res.boom.notFound({ errors: [{ type: 'ITEM_CATEGORY.NOT.FOUND', code: 100 }] }));case 11:if (!( form.parent_category_id && form.parent_category_id !== itemCategory.parent_category_id)) {_context2.next = 17;break;}_context2.next = 14;return ( ItemCategory.query(). where('id', form.parent_category_id). first());case 14:foundParentCategory = _context2.sent;if ( foundParentCategory) {_context2.next = 17;break;}return _context2.abrupt("return", res.boom.notFound('The parent category ID is not found.', { errors: [{ type: 'PARENT_CATEGORY_NOT_FOUND', code: 100 }] }));case 17:_context2.next = 19;return ( ItemCategory.query(). where('id', id). update(_objectSpread({}, form)));case 19:updateItemCategory = _context2.sent;return _context2.abrupt("return", res.status(200).send({ id: id }));case 21:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Delete the give item category. */ deleteItem: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().toInt()], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var id, ItemCategory, itemCategory;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: id = req.params.id; ItemCategory = req.models.ItemCategory;_context3.next = 4;return ( ItemCategory.query(). where('id', id). first());case 4:itemCategory = _context3.sent;if ( itemCategory) {_context3.next = 7;break;}return _context3.abrupt("return", res.boom.notFound());case 7:_context3.next = 9;return ( ItemCategory.query(). where('id', itemCategory.id)["delete"]());case 9:return _context3.abrupt("return", res.status(200).send());case 10:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() }, /** * Retrieve the list of items. */ getList: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('column_sort_order').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('sort_order').optional().trim().escape().isIn(['desc', 'asc']), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('stringified_filter_roles').optional().isJSON()], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var validationErrors, _req$models, Resource, ItemCategory, categoriesResource, filter, errorReasons, resourceFieldsKeys, dynamicFilter, filterRoles, sortByFilter, categories;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:_req$models = req.models, Resource = _req$models.Resource, ItemCategory = _req$models.ItemCategory;_context4.next = 6;return ( Resource.query(). where('name', 'items_categories'). withGraphFetched('fields'). first());case 6:categoriesResource = _context4.sent;if ( categoriesResource) {_context4.next = 9;break;}return _context4.abrupt("return", res.status(400).send({ errors: [{ type: 'ITEMS.CATEGORIES.RESOURCE.NOT.FOUND', code: 200 }] }));case 9: filter = _objectSpread({ column_sort_order: '', sort_order: '', filter_roles: [] }, req.query); if (filter.stringified_filter_roles) { filter.filter_roles = JSON.parse(filter.stringified_filter_roles); } errorReasons = []; resourceFieldsKeys = categoriesResource.fields.map(function (c) {return c.key;}); dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_7__["DynamicFilter"](ItemCategory.tableName); // Dynamic filter with filter roles. if (filter.filter_roles.length > 0) { // Validate the accounts resource fields. filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_7__["DynamicFilterFilterRoles"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_8__["mapFilterRolesToDynamicFilter"])(filter.filter_roles), categoriesResource.fields); categoriesResource.setFilter(filterRoles); if (filterRoles.validateFilterRoles().length > 0) { errorReasons.push({ type: 'ITEMS.RESOURCE.HAS.NO.FIELDS', code: 500 }); } } // Dynamic filter with column sort order. if (filter.column_sort_order) { if (resourceFieldsKeys.indexOf(filter.column_sort_order) === -1) { errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 }); } sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_7__["DynamicFilterSortBy"]( filter.column_sort_order, filter.sort_order); dynamicFilter.setFilter(sortByFilter); }if (!( errorReasons.length > 0)) {_context4.next = 18;break;}return _context4.abrupt("return", res.status(400).send({ errors: errorReasons }));case 18:_context4.next = 20;return ( ItemCategory.query().onBuild(function (builder) { dynamicFilter.buildQuery()(builder); builder.select([ '*', ItemCategory.relatedQuery('items').count().as('count')]); }));case 20:categories = _context4.sent;return _context4.abrupt("return", res.status(200).send({ categories: categories }));case 22:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() }, /** * Retrieve details of the given category. */ getCategory: { validation: [Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('category_id').toInt()], handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var categoryId, ItemCategory, item;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0: categoryId = req.params.category_id; ItemCategory = req.models.ItemCategory;_context5.next = 4;return ( ItemCategory.where('id', categoryId).fetch());case 4:item = _context5.sent;if ( item) {_context5.next = 7;break;}return _context5.abrupt("return", res.boom.notFound(null, { errors: [{ type: 'CATEGORY_NOT_FOUND', code: 100 }] }));case 7:return _context5.abrupt("return", res.status(200).send({ category: item.toJSON() }));case 8:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() }, /** * Bulk delete the given item categories. */ bulkDeleteCategories: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids').isArray({ min: 2 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids.*').isNumeric().toInt()], handler: function () {var _handler6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee6(req, res) {var validationErrors, filter, ItemCategory, itemCategories, itemCategoriesIds, notFoundCategories;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context6.next = 3;break;}return _context6.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: filter = _objectSpread({ ids: [] }, req.query); ItemCategory = req.models.ItemCategory;_context6.next = 7;return ( ItemCategory.query().whereIn('id', filter.ids));case 7:itemCategories = _context6.sent; itemCategoriesIds = itemCategories.map(function (category) {return category.id;}); notFoundCategories = Object(lodash__WEBPACK_IMPORTED_MODULE_5__["difference"])(filter.ids, itemCategoriesIds);if (!( notFoundCategories.length > 0)) {_context6.next = 12;break;}return _context6.abrupt("return", res.status(400).send({ errors: [{ type: 'ITEM.CATEGORIES.IDS.NOT.FOUND', code: 200 }] }));case 12:_context6.next = 14;return ( ItemCategory.query().whereIn('id', filter.ids)["delete"]());case 14:return _context6.abrupt("return", res.status(200).send({ ids: filter.ids }));case 15:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x11, _x12) {return _handler6.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Items.js": /*!***************************************!*\ !*** ./src/http/controllers/Items.js ***! \***************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray"); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "@babel/runtime/helpers/slicedToArray"); /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! fs */ "fs"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); /* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/lib/DynamicFilter */ "./src/lib/DynamicFilter/index.js"); /* harmony import */ var _services_Logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/services/Logger */ "./src/services/Logger/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} var fsPromises = fs__WEBPACK_IMPORTED_MODULE_8___default.a.promises; /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_5___default.a.Router(); router.post('/:id', this.editItem.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__["default"])(this.editItem.handler)); router.post('/', this.newItem.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__["default"])(this.newItem.handler)); router["delete"]('/:id', this.deleteItem.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__["default"])(this.deleteItem.handler)); router["delete"]('/', this.bulkDeleteItems.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__["default"])(this.bulkDeleteItems.handler)); router.get('/', this.listItems.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__["default"])(this.listItems.handler)); return router; }, /** * Creates a new item. */ newItem: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('name').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('type').exists().trim().escape(). isIn(['service', 'non-inventory', 'inventory']), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('sku').optional({ nullable: true }).trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('cost_price').exists().isNumeric().toFloat(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('sell_price').exists().isNumeric().toFloat(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('cost_account_id').exists().isInt().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('sell_account_id').exists().isInt().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('inventory_account_id')["if"]( Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('type').equals('inventory')). exists(). isInt(). toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('category_id').optional({ nullable: true }).isInt().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('custom_fields').optional().isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('custom_fields.*.key').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('custom_fields.*.value').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('note').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('media_ids').optional().isArray(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('media_ids.*').exists().isNumeric().toInt()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(req, res) {var validationErrors, user, form, _req$models, Account, Resource, ResourceField, ItemCategory, Item, MediaLink, errorReasons, costAccountPromise, sellAccountPromise, inventoryAccountPromise, itemCategoryPromise, customFieldsKeys, resource, fields, storedFieldsKey, notFoundFields, _ref, _ref2, costAccount, sellAccount, itemCategory, inventoryAccount, bulkSaveMediaLinks, item;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: user = req.user; form = _objectSpread({ custom_fields: [], media_ids: [] }, req.body);_req$models = req.models, Account = _req$models.Account, Resource = _req$models.Resource, ResourceField = _req$models.ResourceField, ItemCategory = _req$models.ItemCategory, Item = _req$models.Item, MediaLink = _req$models.MediaLink; errorReasons = []; costAccountPromise = Account.query().findById(form.cost_account_id); sellAccountPromise = Account.query().findById(form.sell_account_id); inventoryAccountPromise = form.type === 'inventory' ? Account.query().findById(form.inventory_account_id) : null; itemCategoryPromise = form.category_id ? ItemCategory.query().findById(form.category_id) : null; // Validate the custom fields key and value type. if (!(form.custom_fields.length > 0)) {_context.next = 22;break;} customFieldsKeys = form.custom_fields.map(function (field) {return field.key;}); // Get resource id than get all resource fields. _context.next = 15;return Resource.where('name', 'items').fetch();case 15:resource = _context.sent;_context.next = 18;return ( ResourceField.query(function (builder) { builder.where('resource_id', resource.id); builder.whereIn('key', customFieldsKeys); }).fetchAll());case 18:fields = _context.sent; storedFieldsKey = fields.map(function (f) {return f.attributes.key;}); // Get all not defined resource fields. notFoundFields = Object(lodash__WEBPACK_IMPORTED_MODULE_7__["difference"])(customFieldsKeys, storedFieldsKey); if (notFoundFields.length > 0) { errorReasons.push({ type: 'FIELD_KEY_NOT_FOUND', code: 150, fields: notFoundFields }); }case 22:_context.next = 24;return ( Promise.all([ costAccountPromise, sellAccountPromise, itemCategoryPromise, inventoryAccountPromise]));case 24:_ref = _context.sent;_ref2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_ref, 4);costAccount = _ref2[0];sellAccount = _ref2[1];itemCategory = _ref2[2];inventoryAccount = _ref2[3]; if (!costAccount) { errorReasons.push({ type: 'COST_ACCOUNT_NOT_FOUND', code: 100 }); } if (!sellAccount) { errorReasons.push({ type: 'SELL_ACCOUNT_NOT_FOUND', code: 120 }); } if (!itemCategory && form.category_id) { errorReasons.push({ type: 'ITEM_CATEGORY_NOT_FOUND', code: 140 }); } if (!inventoryAccount && form.type === 'inventory') { errorReasons.push({ type: 'INVENTORY_ACCOUNT_NOT_FOUND', code: 150 }); }if (!( errorReasons.length > 0)) {_context.next = 36;break;}return _context.abrupt("return", res.boom.badRequest(null, { errors: errorReasons }));case 36: bulkSaveMediaLinks = [];_context.next = 39;return ( Item.query().insertAndFetch({ name: form.name, type: form.type, sku: form.sku, cost_price: form.cost_price, sell_price: form.sell_price, sell_account_id: form.sell_account_id, cost_account_id: form.cost_account_id, currency_code: form.currency_code, category_id: form.category_id, user_id: user.id, note: form.note }));case 39:item = _context.sent; form.media_ids.forEach(function (mediaId) { var oper = MediaLink.query().insert({ model_name: 'Item', media_id: mediaId, model_id: item.id }); bulkSaveMediaLinks.push(oper); }); // Save the media links. _context.next = 43;return Promise.all([].concat( bulkSaveMediaLinks));case 43:return _context.abrupt("return", res.status(200).send({ id: item.id }));case 44:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Edit the given item. */ editItem: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('name').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('type'). exists(). trim(). escape(). isIn(['product', 'service']), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('cost_price').exists().isNumeric(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('sell_price').exists().isNumeric(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('cost_account_id').exists().isInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('sell_account_id').exists().isInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('category_id').optional({ nullable: true }).isInt().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('note').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('attachment').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('')], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2(req, res) {var validationErrors, _req$models2, Account, Item, ItemCategory, MediaLink, id, form, item, errorReasons, costAccountPromise, sellAccountPromise, itemCategoryPromise, _ref3, _ref4, costAccount, sellAccount, itemCategory, attachment, attachmentsMimes, publicPath, tenantPath, updatedItem, itemMediaIds, newInsertedMedia, bulkSaveMediaLink;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:_req$models2 = req.models, Account = _req$models2.Account, Item = _req$models2.Item, ItemCategory = _req$models2.ItemCategory, MediaLink = _req$models2.MediaLink; id = req.params.id; form = _objectSpread({ custom_fields: [] }, req.body);_context2.next = 8;return ( Item.query().findById(id).withGraphFetched('media'));case 8:item = _context2.sent;if ( item) {_context2.next = 11;break;}return _context2.abrupt("return", res.boom.notFound(null, { errors: [{ type: 'ITEM.NOT.FOUND', code: 100 }] }));case 11: errorReasons = []; costAccountPromise = Account.query().findById(form.cost_account_id); sellAccountPromise = Account.query().findById(form.sell_account_id); itemCategoryPromise = form.category_id ? ItemCategory.query().findById(form.category_id) : null;_context2.next = 17;return ( Promise.all([ costAccountPromise, sellAccountPromise, itemCategoryPromise]));case 17:_ref3 = _context2.sent;_ref4 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_ref3, 3);costAccount = _ref4[0];sellAccount = _ref4[1];itemCategory = _ref4[2]; if (!costAccount) { errorReasons.push({ type: 'COST_ACCOUNT_NOT_FOUND', code: 100 }); } if (!sellAccount) { errorReasons.push({ type: 'SELL_ACCOUNT_NOT_FOUND', code: 120 }); } if (!itemCategory && form.category_id) { errorReasons.push({ type: 'ITEM_CATEGORY_NOT_FOUND', code: 140 }); } attachment = req.files && req.files.attachment ? req.files.attachment : null; attachmentsMimes = ['image/png', 'image/jpeg']; // Validate the attachment. if (attachment && attachmentsMimes.indexOf(attachment.mimetype) === -1) { errorReasons.push({ type: 'ATTACHMENT.MINETYPE.NOT.SUPPORTED', code: 160 }); }if (!( errorReasons.length > 0)) {_context2.next = 30;break;}return _context2.abrupt("return", res.boom.badRequest(null, { errors: errorReasons }));case 30:if (! attachment) {_context2.next = 49;break;} publicPath = 'storage/app/public/'; tenantPath = "".concat(publicPath).concat(req.organizationId);_context2.prev = 33;_context2.next = 36;return ( fsPromises.unlink("".concat(tenantPath, "/").concat(item.attachmentFile)));case 36:_context2.next = 41;break;case 38:_context2.prev = 38;_context2.t0 = _context2["catch"](33); _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('error', 'Delete item attachment file delete failed.', { error: _context2.t0 });case 41:_context2.prev = 41;_context2.next = 44;return ( attachment.mv("".concat(tenantPath, "/").concat(attachment.md5, ".png")));case 44:_context2.next = 49;break;case 46:_context2.prev = 46;_context2.t1 = _context2["catch"](41);return _context2.abrupt("return", res.status(400).send({ errors: [{ type: 'ATTACHMENT.UPLOAD.FAILED', code: 600 }] }));case 49:_context2.next = 51;return ( Item.query().findById(id).patch({ name: form.name, type: form.type, cost_price: form.cost_price, sell_price: form.sell_price, currency_code: form.currency_code, sell_account_id: form.sell_account_id, cost_account_id: form.cost_account_id, category_id: form.category_id, note: form.note }));case 51:updatedItem = _context2.sent; // Save links of new inserted media that associated to the item model. itemMediaIds = item.media.map(function (m) {return m.id;}); newInsertedMedia = Object(lodash__WEBPACK_IMPORTED_MODULE_7__["difference"])(form.media_ids, itemMediaIds); bulkSaveMediaLink = []; newInsertedMedia.forEach(function (mediaId) { var oper = MediaLink.query().insert({ model_name: 'Journal', model_id: manualJournal.id, media_id: mediaId }); bulkSaveMediaLink.push(oper); });_context2.next = 58;return ( Promise.all(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(newInsertedMedia)));case 58:return _context2.abrupt("return", res.status(200).send({ id: updatedItem.id }));case 59:case "end":return _context2.stop();}}}, _callee2, null, [[33, 38], [41, 46]]);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Delete the given item from the storage. */ deleteItem: { validation: [], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3(req, res) {var id, Item, item, publicPath, tenantPath;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: id = req.params.id; Item = req.models.Item;_context3.next = 4;return ( Item.query().findById(id));case 4:item = _context3.sent;if ( item) {_context3.next = 7;break;}return _context3.abrupt("return", res.boom.notFound(null, { errors: [{ type: 'ITEM_NOT_FOUND', code: 100 }] }));case 7:_context3.next = 9;return ( Item.query().findById(item.id)["delete"]());case 9:if (! item.attachmentFile) {_context3.next = 20;break;} publicPath = 'storage/app/public/'; tenantPath = "".concat(publicPath).concat(req.organizationId);_context3.prev = 12;_context3.next = 15;return ( fsPromises.unlink("".concat(tenantPath, "/").concat(item.attachmentFile)));case 15:_context3.next = 20;break;case 17:_context3.prev = 17;_context3.t0 = _context3["catch"](12); _services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('error', 'Delete item attachment file delete failed.', { error: _context3.t0 });case 20:return _context3.abrupt("return", res.status(200).send());case 21:case "end":return _context3.stop();}}}, _callee3, null, [[12, 17]]);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() }, /** * Bulk delete the given items ids. */ bulkDeleteItems: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('ids').isArray({ min: 2 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('ids.*').isNumeric().toInt()], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee4(req, res) {var validationErrors, filter, Item, items, storedItemsIds, notFoundItems;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: filter = _objectSpread({ ids: [] }, req.query); Item = req.models.Item;_context4.next = 7;return ( Item.query().whereIn('id', filter.ids));case 7:items = _context4.sent; storedItemsIds = items.map(function (a) {return a.id;}); notFoundItems = Object(lodash__WEBPACK_IMPORTED_MODULE_7__["difference"])(filter.ids, storedItemsIds); // Validate the not found items. if (!(notFoundItems.length > 0)) {_context4.next = 12;break;}return _context4.abrupt("return", res.status(404).send({ errors: [{ type: 'ITEMS.NOT.FOUND', code: 200, ids: notFoundItems }] }));case 12:_context4.next = 14;return ( Item.query().whereIn('id', storedItemsIds)["delete"]());case 14:return _context4.abrupt("return", res.status(200).send());case 15:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() }, /** * Retrive the list items with pagination meta. */ listItems: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('column_sort_order').optional().isIn(['created_at', 'name', 'amount', 'sku']), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('sort_order').optional().isIn(['desc', 'asc']), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('page').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('page_size').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('custom_view_id').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('stringified_filter_roles').optional().isJSON()], handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee5(req, res) {var validationErrors, errorReasons, viewConditions, _req$models3, Resource, Item, View, itemsResource, filter, view, resourceFieldsKeys, dynamicFilter, viewFilter, filterRoles, sortByFilter, items;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: errorReasons = []; viewConditions = [];_req$models3 = req.models, Resource = _req$models3.Resource, Item = _req$models3.Item, View = _req$models3.View;_context5.next = 8;return ( Resource.query(). where('name', 'items'). withGraphFetched('fields'). first());case 8:itemsResource = _context5.sent;if ( itemsResource) {_context5.next = 11;break;}return _context5.abrupt("return", res.status(400).send({ errors: [{ type: 'ITEMS_RESOURCE_NOT_FOUND', code: 200 }] }));case 11: filter = _objectSpread({ column_sort_order: '', sort_order: '', page: 1, page_size: 10, custom_view_id: null, filter_roles: [] }, req.query); if (filter.stringified_filter_roles) { filter.filter_roles = JSON.parse(filter.stringified_filter_roles); }_context5.next = 15;return ( View.query().onBuild(function (builder) { if (filter.custom_view_id) { builder.where('id', filter.custom_view_id); } else { builder.where('favourite', true); } builder.where('resource_id', itemsResource.id); builder.withGraphFetched('roles.field'); builder.withGraphFetched('columns'); builder.first(); }));case 15:view = _context5.sent; resourceFieldsKeys = itemsResource.fields.map(function (c) {return c.key;}); dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilter"](Item.tableName); // Dynamic filter with view roles. if (view && view.roles.length > 0) { viewFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterViews"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["mapViewRolesToConditionals"])(view.roles), view.rolesLogicExpression); if (!viewFilter.validateFilterRoles()) { errorReasons.push({ type: 'VIEW.LOGIC.EXPRESSION.INVALID', code: 400 }); } dynamicFilter.setFilter(viewFilter); } // Dynamic filter with filter roles. if (filter.filter_roles.length > 0) { // Validate the accounts resource fields. filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterFilterRoles"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["mapFilterRolesToDynamicFilter"])(filter.filter_roles), itemsResource.fields); dynamicFilter.setFilter(filterRoles); if (filterRoles.validateFilterRoles().length > 0) { errorReasons.push({ type: 'ITEMS.RESOURCE.HAS.NO.FIELDS', code: 500 }); } } // Dynamic filter with column sort order. if (filter.column_sort_order) { if (resourceFieldsKeys.indexOf(filter.column_sort_order) === -1) { errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 }); } sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterSortBy"]( filter.column_sort_order, filter.sort_order); dynamicFilter.setFilter(sortByFilter); }if (!( errorReasons.length > 0)) {_context5.next = 23;break;}return _context5.abrupt("return", res.status(400).send({ errors: errorReasons }));case 23:_context5.next = 25;return ( Item.query().onBuild(function (builder) { builder.withGraphFetched('costAccount'); builder.withGraphFetched('sellAccount'); builder.withGraphFetched('inventoryAccount'); builder.withGraphFetched('category'); dynamicFilter.buildQuery()(builder); }).pagination(filter.page - 1, filter.page_size));case 25:items = _context5.sent;return _context5.abrupt("return", res.status(200).send(_objectSpread({ items: items }, view && { customViewId: view.id, viewColumns: view.columns, viewConditions: viewConditions })));case 27:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Media.js": /*!***************************************!*\ !*** ./src/http/controllers/Media.js ***! \***************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! fs */ "fs"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _services_Logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Logger */ "./src/services/Logger/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} var fsPromises = fs__WEBPACK_IMPORTED_MODULE_5___default.a.promises; /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router(); router.post('/upload', this.upload.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.upload.handler)); router["delete"]('/', this["delete"].validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this["delete"].handler)); router.get('/', this.get.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.get.handler)); return router; }, /** * Retrieve all or the given attachment ids. */ get: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids')], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, Media, media;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: Media = req.models.Media;_context.next = 6;return ( Media.query().onBuild(function (builder) { if (req.query.ids) { var ids = Array.isArray(req.query.ids) ? req.query.ids : [req.query.ids]; builder.whereIn('id', ids); } }));case 6:media = _context.sent;return _context.abrupt("return", res.status(200).send({ media: media }));case 8:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Uploads the given attachment file. */ upload: { validation: [ // check('attachment').exists(), ], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var publicPath, attachmentsMimes, attachment, Media, errorReasons, media;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:if ( req.files.attachment) {_context2.next = 2;break;}return _context2.abrupt("return", res.status(400).send({ errors: [{ type: 'ATTACHMENT.NOT.FOUND', code: 200 }] }));case 2: publicPath = 'storage/app/public/'; attachmentsMimes = ['image/png', 'image/jpeg']; attachment = req.files.attachment; Media = req.models.Media; errorReasons = []; // Validate the attachment. if (attachment && attachmentsMimes.indexOf(attachment.mimetype) === -1) { errorReasons.push({ type: 'ATTACHMENT.MINETYPE.NOT.SUPPORTED', code: 160 }); } // Catch all error reasons to response 400. if (!(errorReasons.length > 0)) {_context2.next = 10;break;}return _context2.abrupt("return", res.status(400).send({ errors: errorReasons }));case 10:_context2.prev = 10;_context2.next = 13;return ( attachment.mv("".concat(publicPath).concat(req.organizationId, "/").concat(attachment.md5, ".png")));case 13: _services_Logger__WEBPACK_IMPORTED_MODULE_8__["default"].log('info', 'Attachment uploaded successfully');_context2.next = 19;break;case 16:_context2.prev = 16;_context2.t0 = _context2["catch"](10); _services_Logger__WEBPACK_IMPORTED_MODULE_8__["default"].log('info', 'Attachment uploading failed.', { error: _context2.t0 });case 19:_context2.next = 21;return ( Media.query().insert({ attachment_file: "".concat(attachment.md5, ".png") }));case 21:media = _context2.sent;return _context2.abrupt("return", res.status(200).send({ media: media }));case 23:case "end":return _context2.stop();}}}, _callee2, null, [[10, 16]]);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Deletes the given attachment ids from file system and database. */ "delete": { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids').exists().isArray(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids.*').exists().isNumeric().toInt()], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var validationErrors, _req$models, Media, MediaLink, ids, media, mediaIds, notFoundMedia, publicPath, tenantPath, unlinkOpers;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:_req$models = req.models, Media = _req$models.Media, MediaLink = _req$models.MediaLink; ids = Array.isArray(req.query.ids) ? req.query.ids : [req.query.ids];_context3.next = 7;return ( Media.query().whereIn('id', ids));case 7:media = _context3.sent; mediaIds = media.map(function (m) {return m.id;}); notFoundMedia = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(ids, mediaIds);if (! notFoundMedia.length) {_context3.next = 12;break;}return _context3.abrupt("return", res.status(400).send({ errors: [{ type: 'MEDIA.IDS.NOT.FOUND', code: 200, ids: notFoundMedia }] }));case 12: publicPath = 'storage/app/public/'; tenantPath = "".concat(publicPath).concat(req.organizationId); unlinkOpers = []; media.forEach(function (mediaModel) { var oper = fsPromises.unlink("".concat(tenantPath, "/").concat(mediaModel.attachmentFile)); unlinkOpers.push(oper); });_context3.next = 18;return ( Promise.all(unlinkOpers).then(function (resolved) { resolved.forEach(function () { _services_Logger__WEBPACK_IMPORTED_MODULE_8__["default"].log('error', 'Attachment file has been deleted.'); }); })["catch"]( function (errors) { errors.forEach(function (error) { _services_Logger__WEBPACK_IMPORTED_MODULE_8__["default"].log('error', 'Delete item attachment file delete failed.', { error: error }); }); }));case 18:_context3.next = 20;return ( MediaLink.query().whereIn('media_id', mediaIds)["delete"]());case 20:_context3.next = 22;return ( Media.query().whereIn('id', mediaIds)["delete"]());case 22:return _context3.abrupt("return", res.status(200).send());case 23:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Options.js": /*!*****************************************!*\ !*** ./src/http/controllers/Options.js ***! \*****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router(); router.post('/', this.saveOptions.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.saveOptions.handler)); router.get('/', this.getOptions.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getOptions.handler)); return router; }, /** * Saves the given options to the storage. */ saveOptions: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["body"])('options').isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["body"])('options.*.key').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["body"])('options.*.value').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["body"])('options.*.group').exists()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, Option, form, optionsCollections, errorReasons, notDefinedOptions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'VALIDATION_ERROR' }, validationErrors)));case 3: Option = req.models.Option; form = _objectSpread({}, req.body);_context.next = 7;return ( Option.query());case 7:optionsCollections = _context.sent; errorReasons = []; notDefinedOptions = Option.validateDefined(form.options); if (notDefinedOptions.length) { errorReasons.push({ type: 'OPTIONS.KEY.NOT.DEFINED', code: 200, keys: notDefinedOptions.map(function (o) {return _objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_5__["pick"])(o, ['key', 'group']));}) }); }if (! errorReasons.length) {_context.next = 13;break;}return _context.abrupt("return", res.status(400).send({ errors: errorReasons }));case 13: form.options.forEach(function (option) { optionsCollections.setMeta(_objectSpread({}, option)); });_context.next = 16;return ( optionsCollections.saveMeta());case 16:return _context.abrupt("return", res.status(200).send({ options: form }));case 17:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Retrieve the application options from the storage. */ getOptions: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('key').optional(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('group').optional()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var validationErrors, Option, filter, options;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'VALIDATION_ERROR' }, validationErrors)));case 3: Option = req.models.Option; filter = _objectSpread({}, req.query);_context2.next = 7;return ( Option.query().onBuild(function (builder) { if (filter.key) { builder.where('key', filter.key); } if (filter.group) { builder.where('group', filter.group); } }));case 7:options = _context2.sent;return _context2.abrupt("return", res.status(200).send({ options: options.metadata }));case 9:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Resources.js": /*!*******************************************!*\ !*** ./src/http/controllers/Resources.js ***! \*******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_2___default.a.Router(); router.get('/:resource_slug/data', this.resourceData.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_4__["default"])(this.resourceData.handler)); router.get('/:resource_slug/columns', this.resourceColumns.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_4__["default"])(this.resourceColumns.handler)); router.get('/:resource_slug/fields', this.resourceFields.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_4__["default"])(this.resourceFields.handler)); return router; }, /** * Retrieve resource data of the given resource key/slug. */ resourceData: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_3__["param"])('resource_slug').trim().escape().exists()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var AccountType, resourceSlug, data;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: AccountType = req.models.AccountType; resourceSlug = req.params.resource_slug;_context.next = 4;return ( AccountType.query());case 4:data = _context.sent;return _context.abrupt("return", res.status(200).send({ data: data, resource_slug: resourceSlug }));case 6:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Retrieve resource columns of the given resource. */ resourceColumns: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_3__["param"])('resource_slug').trim().escape().exists()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var resourceSlug, Resource, resource, resourceFields;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: resourceSlug = req.params.resource_slug; Resource = req.models.Resource;_context2.next = 4;return ( Resource.query(). where('name', resourceSlug). withGraphFetched('fields'). first());case 4:resource = _context2.sent;if ( resource) {_context2.next = 7;break;}return _context2.abrupt("return", res.status(400).send({ errors: [{ type: 'RESOURCE.SLUG.NOT.FOUND', code: 200 }] }));case 7: resourceFields = resource.fields. filter(function (field) {return field.columnable;}). map(function (field) {return { id: field.id, label: field.labelName, key: field.key };});return _context2.abrupt("return", res.status(200).send({ resource_columns: resourceFields, resource_slug: resourceSlug }));case 9:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Retrieve resource fields of the given resource. */ resourceFields: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_3__["param"])('resource_slug').trim().escape().exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_3__["query"])('predefined').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_3__["query"])('builtin').optional().isBoolean().toBoolean()], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var resourceSlug, Resource, resource;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: resourceSlug = req.params.resource_slug; Resource = req.models.Resource;_context3.next = 4;return ( Resource.query(). where('name', resourceSlug). withGraphFetched('fields'). first());case 4:resource = _context3.sent;if ( resource) {_context3.next = 7;break;}return _context3.abrupt("return", res.status(400).send({ errors: [{ type: 'RESOURCE.SLUG.NOT.FOUND', code: 200 }] }));case 7:return _context3.abrupt("return", res.status(200).send({ resource_fields: resource.fields, resource_slug: resourceSlug }));case 8:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Users.js": /*!***************************************!*\ !*** ./src/http/controllers/Users.js ***! \***************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/system/models/SystemUser */ "./src/system/models/SystemUser.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router(); router.put('/:id/inactive', this.inactiveUser.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.inactiveUser.handler)); router.put('/:id/active', this.activeUser.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.activeUser.handler)); router.post('/:id', this.editUser.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.editUser.handler)); router.get('/', this.listUsers.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.listUsers.handler)); router.get('/:id', this.getUser.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.getUser.handler)); router["delete"]('/:id', this.deleteUser.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.deleteUser.handler)); return router; }, /** * Edit details of the given user. */ editUser: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('first_name').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('last_name').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('email').exists().isEmail(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('phone_number').optional().isMobilePhone()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var id, validationErrors, TenantUser, user, form, foundUsers, foundUserEmail, foundUserPhone, errorReasons, userForm, updateTenantUser, updateSystemUser;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: id = req.params.id; validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 4;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 4: TenantUser = req.models.TenantUser; user = req.user; form = _objectSpread({}, req.body);_context.next = 9;return ( TenantUser.query(). whereNot('id', id). andWhere(function (q) { q.where('email', form.email); q.orWhere('phone_number', form.phone_number); }));case 9:foundUsers = _context.sent; foundUserEmail = foundUsers.find(function (u) {return u.email === form.email;}); foundUserPhone = foundUsers.find(function (u) {return u.phoneNumber === form.phone_number;}); errorReasons = []; if (foundUserEmail) { errorReasons.push({ type: 'EMAIL_ALREADY_EXIST', code: 100 }); } if (foundUserPhone) { errorReasons.push({ type: 'PHONE_NUMBER_ALREADY_EXIST', code: 120 }); }if (!( errorReasons.length > 0)) {_context.next = 17;break;}return _context.abrupt("return", res.boom.badRequest(null, { errors: errorReasons }));case 17: userForm = { first_name: form.first_name, last_name: form.last_name, email: form.email, phone_number: form.phone_number }; updateTenantUser = TenantUser.query(). where('id', id).update(_objectSpread({}, userForm)); updateSystemUser = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_6__["default"].query(). where('id', user.id).update(_objectSpread({}, userForm));_context.next = 22;return ( Promise.all([ updateTenantUser, updateSystemUser]));case 22:return _context.abrupt("return", res.status(200).send());case 23:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Soft deleting the given user. */ deleteUser: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var id, TenantUser, user, tenantUserDel, systemUserDel;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: id = req.params.id; TenantUser = req.models.TenantUser;_context2.next = 4;return ( TenantUser.query().where('id', id).first());case 4:user = _context2.sent;if ( user) {_context2.next = 7;break;}return _context2.abrupt("return", res.boom.notFound(null, { errors: [{ type: 'USER_NOT_FOUND', code: 100 }] }));case 7: tenantUserDel = TenantUser.query().where('id', id)["delete"](); systemUserDel = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_6__["default"].query().where('id', id)["delete"]();_context2.next = 11;return ( Promise.all([ tenantUserDel, systemUserDel]));case 11:return _context2.abrupt("return", res.status(200).send());case 12:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Retrieve user details of the given user id. */ getUser: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var id, TenantUser, user;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: id = req.params.id; TenantUser = req.models.TenantUser;_context3.next = 4;return ( TenantUser.query().where('id', id).first());case 4:user = _context3.sent;if ( user) {_context3.next = 7;break;}return _context3.abrupt("return", res.boom.notFound());case 7:return _context3.abrupt("return", res.status(200).send({ user: user }));case 8:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() }, /** * Retrieve the list of users. */ listUsers: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page_size').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page').optional().isNumeric().toInt()], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var filter, TenantUser, users;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: filter = _objectSpread({ page_size: 10, page: 1 }, req.query); TenantUser = req.models.TenantUser;_context4.next = 4;return ( TenantUser.query(). page(filter.page - 1, filter.page_size));case 4:users = _context4.sent;return _context4.abrupt("return", res.status(200).send({ users: users }));case 6:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() }, inactiveUser: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var validationErrors, id, user, TenantUser, tenantUser, updateTenantUser, updateSystemUser;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: id = req.params.id; user = req.user; TenantUser = req.models.TenantUser; tenantUser = TenantUser.query().where('id', id).first();if ( tenantUser) {_context5.next = 9;break;}return _context5.abrupt("return", res.boom.notFound(null, { errors: [{ type: 'USER.NOT.FOUND', code: 100 }] }));case 9: updateTenantUser = TenantUser.query(). where('id', id).update({ active: false }); updateSystemUser = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_6__["default"].query(). where('id', user.id).update({ active: false });_context5.next = 13;return ( Promise.all([ updateTenantUser, updateSystemUser]));case 13:return _context5.abrupt("return", res.status(200).send({ id: tenantUser.id }));case 14:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() }, activeUser: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee6(req, res) {var validationErrors, id, user, TenantUser, tenantUser, updateTenantUser, updateSystemUser;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context6.next = 3;break;}return _context6.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: id = req.params.id; user = req.user; TenantUser = req.models.TenantUser; tenantUser = TenantUser.query().where('id', id).first();if ( tenantUser) {_context6.next = 9;break;}return _context6.abrupt("return", res.boom.notFound(null, { errors: [{ type: 'USER.NOT.FOUND', code: 100 }] }));case 9: updateTenantUser = TenantUser.query(). where('id', id).update({ active: true }); updateSystemUser = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_6__["default"].query(). where('id', user.id).update({ active: true });_context6.next = 13;return ( Promise.all([ updateTenantUser, updateSystemUser]));case 13:return _context6.abrupt("return", res.status(200).send({ id: tenantUser.id }));case 14:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x11, _x12) {return _handler6.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Vendors.js": /*!*****************************************!*\ !*** ./src/http/controllers/Vendors.js ***! \*****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); /* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/DynamicFilter */ "./src/lib/DynamicFilter/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} var validatioRoles = [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('first_name').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('last_name').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('company_name').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('display_name').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('email').optional().isEmail().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('work_phone').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('personal_phone').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_city').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_country').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_email').optional().isEmail().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_zipcode').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_phone').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_state').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_city').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_country').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_email').optional().isEmail().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_zip_code').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_phone').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_state').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('note').optional().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('active').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields').optional().isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.key').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.value').exists()]; /* harmony default export */ __webpack_exports__["default"] = ({ /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router(); router.post('/', this.newVendor.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.newVendor.handler)); router.post('/:id', this.editVendor.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.editVendor.handler)); router["delete"]('/:id', this.deleteVendor.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.deleteVendor.handler)); router.get('/', this.listVendors.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.listVendors.handler)); router.get('/:id', this.getVendor.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getVendor.handler)); return router; }, /** * Retrieve vendors list with pagination and custom view metadata. */ listVendors: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('column_sort_order').optional().isIn(['created_at']), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('sort_order').optional().isIn(['desc', 'asc']), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page_size').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('custom_view_id').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('stringified_filter_roles').optional().isJSON()], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, _req$models, Resource, View, Vendor, errorReasons, vendorsResource, filter, view, resourceFieldsKeys, dynamicFilter, viewFilter, filterRoles, sortByFilter, vendors;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:_req$models = req.models, Resource = _req$models.Resource, View = _req$models.View, Vendor = _req$models.Vendor; errorReasons = [];_context.next = 7;return ( Resource.query(). where('name', 'vendors'). withGraphFetched('fields'). first());case 7:vendorsResource = _context.sent;if ( vendorsResource) {_context.next = 10;break;}return _context.abrupt("return", res.status(400).send({ errors: [{ type: 'VENDORS.RESOURCE.NOT.FOUND', code: 200 }] }));case 10: filter = _objectSpread({ column_sort_order: '', sort_order: '', page: 1, page_size: 10, custom_view_id: null, filter_roles: [] }, req.query); if (filter.stringified_filter_roles) { filter.filter_roles = JSON.parse(filter.stringified_filter_roles); }_context.next = 14;return ( View.query().onBuild(function (builder) { if (filter.custom_view_id) { builder.where('id', filter.custom_view_id); } else { builder.where('favourite', true); } builder.where('resource_id', vendorsResource.id); builder.withGraphFetched('roles.field'); builder.withGraphFetched('columns'); builder.first(); }));case 14:view = _context.sent; resourceFieldsKeys = vendorsResource.fields.map(function (c) {return c.key;}); dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilter"](Vendor.tableName); // Dynamic filter with view roles. if (view && view.roles.length > 0) { viewFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilterViews"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["mapViewRolesToConditionals"])(view.roles), view.rolesLogicExpression); if (!viewFilter.validateFilterRoles()) { errorReasons.push({ type: 'VIEW.LOGIC.EXPRESSION.INVALID', code: 400 }); } dynamicFilter.setFilter(viewFilter); } // Dynamic filter with filter roles. if (filter.filter_roles.length > 0) { // Validate the accounts resource fields. filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilterFilterRoles"]( Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["mapFilterRolesToDynamicFilter"])(filter.filter_roles), vendorsResource.fields); dynamicFilter.setFilter(filterRoles); if (filterRoles.validateFilterRoles().length > 0) { errorReasons.push({ type: 'ITEMS.RESOURCE.HAS.NO.FIELDS', code: 500 }); } } // Dynamic filter with column sort order. if (filter.column_sort_order) { if (resourceFieldsKeys.indexOf(filter.column_sort_order) === -1) { errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 }); } sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilterSortBy"]( filter.column_sort_order, filter.sort_order); dynamicFilter.setFilter(sortByFilter); }if (!( errorReasons.length > 0)) {_context.next = 22;break;}return _context.abrupt("return", res.status(400).send({ errors: errorReasons }));case 22:_context.next = 24;return ( Vendor.query().onBuild(function (builder) { dynamicFilter.buildQuery()(builder); }).pagination(filter.page - 1, filter.page_size));case 24:vendors = _context.sent;return _context.abrupt("return", res.status(200).send(_objectSpread({ vendors: vendors }, view ? { customViewId: view.id } : {})));case 26:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Submit a new vendor details. */ newVendor: { validation: [].concat( validatioRoles), handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var validationErrors, Vendor, form, vendor;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: Vendor = req.models.Vendor; form = _objectSpread({}, req.body);_context2.next = 7;return ( Vendor.query().insertAndFetch(_objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_5__["pick"])(form, [ 'first_name', 'last_name', 'company_name', 'display_name', 'email', 'work_phone', 'personal_phone', 'billing_address_1', 'billing_address_2', 'billing_address_city', 'billing_address_country', 'billing_address_email', 'billing_address_zipcode', 'billing_address_phone', 'billing_address_state', 'shipping_address_1', 'shipping_address_2', 'shipping_address_city', 'shipping_address_country', 'shipping_address_email', 'shipping_address_zipcode', 'shipping_address_phone', 'shipping_address_state', 'note', 'active']))));case 7:vendor = _context2.sent;return _context2.abrupt("return", res.status(200).send({ id: vendor.id }));case 9:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Edit details of the given vendor id. */ editVendor: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()].concat( validatioRoles), handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var validationErrors, id, form, Vendor, vendor;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: id = req.params.id; form = _objectSpread({}, req.body); Vendor = req.models.Vendor;_context3.next = 8;return ( Vendor.query().where('id', id).first());case 8:vendor = _context3.sent;if ( vendor) {_context3.next = 11;break;}return _context3.abrupt("return", res.status(404).send({ errors: [{ type: 'VENDOR.NOT.FOUND', code: 200 }] }));case 11:_context3.next = 13;return ( Vendor.query().where('id', id).patch(_objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_5__["pick"])(form, [ 'first_name', 'last_name', 'company_name', 'display_name', 'email', 'work_phone', 'personal_phone', 'billing_address_1', 'billing_address_2', 'billing_address_city', 'billing_address_country', 'billing_address_email', 'billing_address_zipcode', 'billing_address_phone', 'billing_address_state', 'shipping_address_1', 'shipping_address_2', 'shipping_address_city', 'shipping_address_country', 'shipping_address_email', 'shipping_address_zipcode', 'shipping_address_phone', 'shipping_address_state', 'note', 'active']))));case 13:return _context3.abrupt("return", res.status(200).send({ id: id }));case 14:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() }, /** * Retrieve details of the given vendor id. */ getVendor: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var validationErrors, Vendor, id, vendor;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: Vendor = req.models.Vendor; id = req.params.id;_context4.next = 7;return ( Vendor.query().where('id', id).first());case 7:vendor = _context4.sent;if ( vendor) {_context4.next = 10;break;}return _context4.abrupt("return", res.status(404).send({ errors: [{ type: 'VENDOR.NOT.FOUND', code: 200 }] }));case 10:return _context4.abrupt("return", res.status(200).send({ vendor: vendor }));case 11:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() }, /** * Delete the given vendor. */ deleteVendor: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()], handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var validationErrors, Vendor, id, vendor;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3: Vendor = req.models.Vendor; id = req.params.id;_context5.next = 7;return ( Vendor.query().where('id', id).first());case 7:vendor = _context5.sent;if ( vendor) {_context5.next = 10;break;}return _context5.abrupt("return", res.status(404).send({ errors: [{ type: 'VENDOR.NOT.FOUND', code: 200 }] }));case 10:_context5.next = 12;return ( Vendor.query().where('id', id)["delete"]());case 12:return _context5.abrupt("return", res.status(200).send());case 13:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/controllers/Views.js": /*!***************************************!*\ !*** ./src/http/controllers/Views.js ***! \***************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator"); /* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* harmony default export */ __webpack_exports__["default"] = ({ resource: 'items', /** * Router constructor. */ router: function router() { var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router(); router.get('/', this.listViews.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.listViews.handler)); router.post('/', this.createView.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.createView.handler)); router.post('/:view_id', this.editView.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.editView.handler)); router["delete"]('/:view_id', this.deleteView.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.deleteView.handler)); router.get('/:view_id', Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getView.handler)); router.get('/:view_id/resource', this.getViewResource.validation, Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getViewResource.handler)); return router; }, /** * List all views that associated with the given resource. */ listViews: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["oneOf"])([ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('resource_name').exists().trim().escape()], [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('resource_id').exists().isNumeric().toInt()])], handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var _req$models, Resource, View, filter, resource, views;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:_req$models = req.models, Resource = _req$models.Resource, View = _req$models.View; filter = _objectSpread({}, req.query);_context.next = 4;return ( Resource.query().onBuild(function (builder) { if (filter.resource_id) { builder.where('id', filter.resource_id); } if (filter.resource_name) { builder.where('name', filter.resource_name); } builder.first(); }));case 4:resource = _context.sent;_context.next = 7;return ( View.query().where('resource_id', resource.id));case 7:views = _context.sent;return _context.abrupt("return", res.status(200).send({ views: views }));case 9:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() }, /** * Retrieve view details of the given view id. */ getView: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('view_id').exists().isNumeric().toInt()], handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var viewId, View, view;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: viewId = req.params.view_id; View = req.models.View;_context2.next = 4;return ( View.query(). where('id', viewId). withGraphFetched('resource'). withGraphFetched('columns'). withGraphFetched('roles.field'). first());case 4:view = _context2.sent;if ( view) {_context2.next = 7;break;}return _context2.abrupt("return", res.boom.notFound(null, { errors: [{ type: 'VIEW_NOT_FOUND', code: 100 }] }));case 7:return _context2.abrupt("return", res.status(200).send({ view: view.toJSON() }));case 8:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() }, /** * Delete the given view of the resource. */ deleteView: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('view_id').exists().isNumeric().toInt()], handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var View, viewId, view;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: View = req.models.View; viewId = req.params.view_id;_context3.next = 4;return ( View.query().findById(viewId));case 4:view = _context3.sent;if ( view) {_context3.next = 7;break;}return _context3.abrupt("return", res.boom.notFound(null, { errors: [{ type: 'VIEW_NOT_FOUND', code: 100 }] }));case 7:if (! view.predefined) {_context3.next = 9;break;}return _context3.abrupt("return", res.boom.badRequest(null, { errors: [{ type: 'PREDEFINED_VIEW', code: 200 }] }));case 9:_context3.next = 11;return ( Promise.all([ view.$relatedQuery('roles')["delete"](), view.$relatedQuery('columns')["delete"]()]));case 11:_context3.next = 13;return ( View.query().where('id', view.id)["delete"]());case 13:return _context3.abrupt("return", res.status(200).send({ id: view.id }));case 14:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() }, /** * Creates a new view. */ createView: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('resource_name').exists().escape().trim(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('name').exists().escape().trim(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('logic_expression').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles').isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.field_key').exists().escape().trim(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.comparator').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.value').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.index').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns').exists().isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns.*.key').exists().escape().trim(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns.*.index').exists().isNumeric().toInt()], handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var validationErrors, _req$models2, Resource, View, ViewColumn, ViewRole, form, resource, errorReasons, fieldsSlugs, resourceFields, resourceFieldsKeys, resourceFieldsKeysMap, columnsKeys, notFoundFields, notFoundColumns, view, saveViewRolesOpers;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 3:_req$models2 = req.models, Resource = _req$models2.Resource, View = _req$models2.View, ViewColumn = _req$models2.ViewColumn, ViewRole = _req$models2.ViewRole; form = _objectSpread({ roles: [] }, req.body);_context4.next = 7;return ( Resource.query().where('name', form.resource_name).first());case 7:resource = _context4.sent;if ( resource) {_context4.next = 10;break;}return _context4.abrupt("return", res.boom.notFound(null, { errors: [{ type: 'RESOURCE_NOT_FOUND', code: 100 }] }));case 10: errorReasons = []; fieldsSlugs = form.roles.map(function (role) {return role.field_key;});_context4.next = 14;return ( resource.$relatedQuery('fields'));case 14:resourceFields = _context4.sent; resourceFieldsKeys = resourceFields.map(function (f) {return f.key;}); resourceFieldsKeysMap = new Map(resourceFields.map(function (field) {return [field.key, field];})); columnsKeys = form.columns.map(function (c) {return c.key;}); // The difference between the stored resource fields and submit fields keys. notFoundFields = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(fieldsSlugs, resourceFieldsKeys); if (notFoundFields.length > 0) { errorReasons.push({ type: 'RESOURCE_FIELDS_NOT_EXIST', code: 100, fields: notFoundFields }); } // The difference between the stored resource fields and the submit columns keys. notFoundColumns = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(columnsKeys, resourceFieldsKeys); if (notFoundColumns.length > 0) { errorReasons.push({ type: 'COLUMNS_NOT_EXIST', code: 200, columns: notFoundColumns }); } // Validates the view conditional logic expression. if (!Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["validateViewRoles"])(form.roles, form.logic_expression)) { errorReasons.push({ type: 'VIEW.ROLES.LOGIC.EXPRESSION.INVALID', code: 400 }); }if (!( errorReasons.length > 0)) {_context4.next = 25;break;}return _context4.abrupt("return", res.boom.badRequest(null, { errors: errorReasons }));case 25:_context4.next = 27;return ( View.query().insert({ name: form.name, predefined: false, resource_id: resource.id, roles_logic_expression: form.logic_expression }));case 27:view = _context4.sent; // Save view roles async operations. saveViewRolesOpers = []; form.roles.forEach(function (role) { var fieldModel = resourceFieldsKeysMap.get(role.field_key); var saveViewRoleOper = ViewRole.query().insert(_objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_3__["pick"])(role, ['comparator', 'value', 'index']), { field_id: fieldModel.id, view_id: view.id })); saveViewRolesOpers.push(saveViewRoleOper); }); form.columns.forEach(function (column) { var fieldModel = resourceFieldsKeysMap.get(column.key); var saveViewColumnOper = ViewColumn.query().insert({ field_id: fieldModel.id, view_id: view.id, index: column.index }); saveViewRolesOpers.push(saveViewColumnOper); });_context4.next = 33;return ( Promise.all(saveViewRolesOpers));case 33:return _context4.abrupt("return", res.status(200).send({ id: view.id }));case 34:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() }, /** * Edit the given custom view metadata. */ editView: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('view_id').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('name').exists().escape().trim(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('logic_expression').exists().trim().escape(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns').exists().isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns.*.id').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns.*.key').exists().escape().trim(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns.*.index').exists().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles').isArray(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.id').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.field_key').exists().escape().trim(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.comparator').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.value').exists(), Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.index').exists().isNumeric().toInt()], handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var viewId, validationErrors, _req$models3, View, ViewRole, ViewColumn, Resource, view, form, resource, errorReasons, fieldsSlugs, resourceFieldsKeys, resourceFieldsKeysMap, columnsKeys, notFoundFields, notFoundColumns, viewRolesIds, viewColumnsIds, formUpdatedRoles, formInsertRoles, formRolesIds, formUpdatedColumns, formInsertedColumns, formColumnsIds, rolesIdsShouldDeleted, columnsIdsShouldDelete, notFoundViewRolesIds, notFoundViewColumnsIds, asyncOpers, deleteOper, _deleteOper;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0: viewId = req.params.view_id; validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if ( validationErrors.isEmpty()) {_context5.next = 4;break;}return _context5.abrupt("return", res.boom.badData(null, _objectSpread({ code: 'validation_error' }, validationErrors)));case 4:_req$models3 = req.models, View = _req$models3.View, ViewRole = _req$models3.ViewRole, ViewColumn = _req$models3.ViewColumn, Resource = _req$models3.Resource;_context5.next = 7;return ( View.query().where('id', viewId). withGraphFetched('roles.field'). withGraphFetched('columns'). first());case 7:view = _context5.sent;if ( view) {_context5.next = 10;break;}return _context5.abrupt("return", res.boom.notFound(null, { errors: [{ type: 'ROLE_NOT_FOUND', code: 100 }] }));case 10: form = _objectSpread({}, req.body);_context5.next = 13;return ( Resource.query(). where('id', view.resourceId). withGraphFetched('fields'). withGraphFetched('views'). first());case 13:resource = _context5.sent; errorReasons = []; fieldsSlugs = form.roles.map(function (role) {return role.field_key;}); resourceFieldsKeys = resource.fields.map(function (f) {return f.key;}); resourceFieldsKeysMap = new Map(resource.fields.map(function (field) {return [field.key, field];})); columnsKeys = form.columns.map(function (c) {return c.key;}); // The difference between the stored resource fields and submit fields keys. notFoundFields = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(fieldsSlugs, resourceFieldsKeys); // Validate not found resource fields keys. if (notFoundFields.length > 0) { errorReasons.push({ type: 'RESOURCE_FIELDS_NOT_EXIST', code: 100, fields: notFoundFields }); } // The difference between the stored resource fields and the submit columns keys. notFoundColumns = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(columnsKeys, resourceFieldsKeys); // Validate not found view columns. if (notFoundColumns.length > 0) { errorReasons.push({ type: 'RESOURCE_COLUMNS_NOT_EXIST', code: 200, columns: notFoundColumns }); } // Validates the view conditional logic expression. if (!Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["validateViewRoles"])(form.roles, form.logic_expression)) { errorReasons.push({ type: 'VIEW.ROLES.LOGIC.EXPRESSION.INVALID', code: 400 }); } viewRolesIds = view.roles.map(function (r) {return r.id;}); viewColumnsIds = view.columns.map(function (c) {return c.id;}); formUpdatedRoles = form.roles.filter(function (r) {return r.id;}); formInsertRoles = form.roles.filter(function (r) {return !r.id;}); formRolesIds = formUpdatedRoles.map(function (r) {return r.id;}); formUpdatedColumns = form.columns.filter(function (r) {return r.id;}); formInsertedColumns = form.columns.filter(function (r) {return !r.id;}); formColumnsIds = formUpdatedColumns.map(function (r) {return r.id;}); rolesIdsShouldDeleted = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(viewRolesIds, formRolesIds); columnsIdsShouldDelete = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(viewColumnsIds, formColumnsIds); notFoundViewRolesIds = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(formRolesIds, viewRolesIds); notFoundViewColumnsIds = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(viewColumnsIds, viewColumnsIds); // Validate the not found view roles ids. if (notFoundViewRolesIds.length) { errorReasons.push({ type: 'VIEW.ROLES.IDS.NOT.FOUND', code: 500, ids: notFoundViewRolesIds }); } // Validate the not found view columns ids. if (notFoundViewColumnsIds.length) { errorReasons.push({ type: 'VIEW.COLUMNS.IDS.NOT.FOUND', code: 600, ids: notFoundViewColumnsIds }); }if (!( errorReasons.length > 0)) {_context5.next = 40;break;}return _context5.abrupt("return", res.status(400).send({ errors: errorReasons }));case 40: asyncOpers = []; // Save view details. _context5.next = 43;return View.query(). where('id', view.id). patch({ name: form.name, roles_logic_expression: form.logic_expression });case 43: // Update view roles. if (formUpdatedRoles.length > 0) { formUpdatedRoles.forEach(function (role) { var fieldModel = resourceFieldsKeysMap.get(role.field_key); var updateOper = ViewRole.query(). where('id', role.id). update(_objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_3__["pick"])(role, ['comparator', 'value', 'index']), { field_id: fieldModel.id })); asyncOpers.push(updateOper); }); } // Insert a new view roles. if (formInsertRoles.length > 0) { formInsertRoles.forEach(function (role) { var fieldModel = resourceFieldsKeysMap.get(role.field_key); var insertOper = ViewRole.query(). insert(_objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_3__["pick"])(role, ['comparator', 'value', 'index']), { field_id: fieldModel.id, view_id: view.id })); asyncOpers.push(insertOper); }); } // Delete view roles. if (rolesIdsShouldDeleted.length > 0) { deleteOper = ViewRole.query(). whereIn('id', rolesIdsShouldDeleted)["delete"](); asyncOpers.push(deleteOper); } // Insert a new view columns to the storage. if (formInsertedColumns.length > 0) { formInsertedColumns.forEach(function (column) { var fieldModel = resourceFieldsKeysMap.get(column.key); var insertOper = ViewColumn.query(). insert({ field_id: fieldModel.id, index: column.index, view_id: view.id }); asyncOpers.push(insertOper); }); } // Update the view columns on the storage. if (formUpdatedColumns.length > 0) { formUpdatedColumns.forEach(function (column) { var updateOper = ViewColumn.query(). where('id', column.id). update({ index: column.index }); asyncOpers.push(updateOper); }); } // Delete the view columns from the storage. if (columnsIdsShouldDelete.length > 0) { _deleteOper = ViewColumn.query(). whereIn('id', columnsIdsShouldDelete)["delete"](); asyncOpers.push(_deleteOper); }_context5.next = 51;return ( Promise.all(asyncOpers));case 51:return _context5.abrupt("return", res.status(200).send());case 52:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() }, /** * Retrieve resource columns that associated to the given custom view. */ getViewResource: { validation: [ Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('view_id').exists().isNumeric().toInt()], handler: function () {var _handler6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee6(req, res) {var viewId, View, view, resourceColumns;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0: viewId = req.params.view_id; View = req.models.View;_context6.next = 4;return ( View.query(). where('id', viewId). withGraphFetched('resource.fields'). first());case 4:view = _context6.sent;if ( view) {_context6.next = 7;break;}return _context6.abrupt("return", res.boom.notFound(null, { errors: [{ type: 'VIEW.NOT.FOUND', code: 100 }] }));case 7:if ( view.resource) {_context6.next = 9;break;}return _context6.abrupt("return", res.boom.badData(null, { errors: [{ type: 'VIEW.HAS.NOT.ASSOCIATED.RESOURCE', code: 200 }] }));case 9: resourceColumns = view.resource.fields. filter(function (field) {return field.columnable;}). map(function (field) {return { id: field.id, label: field.labelName, key: field.key };});return _context6.abrupt("return", res.status(200).send({ resource_slug: view.resource.name, resource_columns: resourceColumns, resource_fields: view.resource.fields }));case 11:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x11, _x12) {return _handler6.apply(this, arguments);}return handler;}() } }); /***/ }), /***/ "./src/http/index.js": /*!***************************!*\ !*** ./src/http/index.js ***! \***************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! express */ "express"); /* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _http_controllers_Authentication__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/http/controllers/Authentication */ "./src/http/controllers/Authentication.js"); /* harmony import */ var _http_controllers_InviteUsers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/http/controllers/InviteUsers */ "./src/http/controllers/InviteUsers.js"); /* harmony import */ var _http_controllers_Users__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/http/controllers/Users */ "./src/http/controllers/Users.js"); /* harmony import */ var _http_controllers_Items__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/http/controllers/Items */ "./src/http/controllers/Items.js"); /* harmony import */ var _http_controllers_ItemCategories__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/http/controllers/ItemCategories */ "./src/http/controllers/ItemCategories.js"); /* harmony import */ var _http_controllers_Accounts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/http/controllers/Accounts */ "./src/http/controllers/Accounts.js"); /* harmony import */ var _http_controllers_AccountTypes__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/http/controllers/AccountTypes */ "./src/http/controllers/AccountTypes.js"); /* harmony import */ var _http_controllers_Views__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/http/controllers/Views */ "./src/http/controllers/Views.js"); /* harmony import */ var _http_controllers_Accounting__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/http/controllers/Accounting */ "./src/http/controllers/Accounting.js"); /* harmony import */ var _http_controllers_FinancialStatements__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/http/controllers/FinancialStatements */ "./src/http/controllers/FinancialStatements.js"); /* harmony import */ var _http_controllers_Expenses__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/http/controllers/Expenses */ "./src/http/controllers/Expenses.js"); /* harmony import */ var _http_controllers_Options__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/http/controllers/Options */ "./src/http/controllers/Options.js"); /* harmony import */ var _http_controllers_Currencies__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/http/controllers/Currencies */ "./src/http/controllers/Currencies.js"); /* harmony import */ var _http_controllers_Customers__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/http/controllers/Customers */ "./src/http/controllers/Customers.js"); /* harmony import */ var _http_controllers_Vendors__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @/http/controllers/Vendors */ "./src/http/controllers/Vendors.js"); /* harmony import */ var _controllers_Resources__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./controllers/Resources */ "./src/http/controllers/Resources.js"); /* harmony import */ var _http_controllers_ExchangeRates__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @/http/controllers/ExchangeRates */ "./src/http/controllers/ExchangeRates.js"); /* harmony import */ var _http_controllers_Media__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/http/controllers/Media */ "./src/http/controllers/Media.js"); /* harmony import */ var _http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @/http/middleware/jwtAuth */ "./src/http/middleware/jwtAuth.js"); /* harmony import */ var _http_middleware_TenancyMiddleware__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @/http/middleware/TenancyMiddleware */ "./src/http/middleware/TenancyMiddleware.js"); // import OAuth2 from '@/http/controllers/OAuth2'; // import Roles from '@/http/controllers/Roles'; // import AccountOpeningBalance from '@/http/controllers/AccountOpeningBalance'; // import CustomFields from '@/http/controllers/Fields'; // import Budget from '@/http/controllers/Budget'; // import BudgetReports from '@/http/controllers/BudgetReports'; // import Suppliers from '@/http/controllers/Suppliers'; // import Bills from '@/http/controllers/Bills'; // import CurrencyAdjustment from './controllers/CurrencyAdjustment'; // import SalesReports from '@/http/controllers/SalesReports'; // import PurchasesReports from '@/http/controllers/PurchasesReports'; /* harmony default export */ __webpack_exports__["default"] = (function (app) { // app.use('/api/oauth2', OAuth2.router()); app.use('/api/auth', _http_controllers_Authentication__WEBPACK_IMPORTED_MODULE_1__["default"].router()); app.use('/api/invite', _http_controllers_InviteUsers__WEBPACK_IMPORTED_MODULE_2__["default"].router()); var dashboard = express__WEBPACK_IMPORTED_MODULE_0___default.a.Router(); dashboard.use(_http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_19__["default"]); dashboard.use(_http_middleware_TenancyMiddleware__WEBPACK_IMPORTED_MODULE_20__["default"]); dashboard.use('/api/currencies', _http_controllers_Currencies__WEBPACK_IMPORTED_MODULE_13__["default"].router()); dashboard.use('/api/users', _http_controllers_Users__WEBPACK_IMPORTED_MODULE_3__["default"].router()); // app.use('/api/roles', Roles.router()); dashboard.use('/api/accounts', _http_controllers_Accounts__WEBPACK_IMPORTED_MODULE_6__["default"].router()); dashboard.use('/api/account_types', _http_controllers_AccountTypes__WEBPACK_IMPORTED_MODULE_7__["default"].router()); dashboard.use('/api/accounting', _http_controllers_Accounting__WEBPACK_IMPORTED_MODULE_9__["default"].router()); // app.use('/api/accounts_opening_balances', AccountOpeningBalance.router()); dashboard.use('/api/views', _http_controllers_Views__WEBPACK_IMPORTED_MODULE_8__["default"].router()); // app.use('/api/fields', CustomFields.router()); dashboard.use('/api/items', _http_controllers_Items__WEBPACK_IMPORTED_MODULE_4__["default"].router()); dashboard.use('/api/item_categories', _http_controllers_ItemCategories__WEBPACK_IMPORTED_MODULE_5__["default"].router()); dashboard.use('/api/expenses', _http_controllers_Expenses__WEBPACK_IMPORTED_MODULE_11__["default"].router()); dashboard.use('/api/financial_statements', _http_controllers_FinancialStatements__WEBPACK_IMPORTED_MODULE_10__["default"].router()); dashboard.use('/api/options', _http_controllers_Options__WEBPACK_IMPORTED_MODULE_12__["default"].router()); // app.use('/api/budget_reports', BudgetReports.router()); dashboard.use('/api/customers', _http_controllers_Customers__WEBPACK_IMPORTED_MODULE_14__["default"].router()); dashboard.use('/api/vendors', _http_controllers_Vendors__WEBPACK_IMPORTED_MODULE_15__["default"].router()); // app.use('/api/suppliers', Suppliers.router()); // app.use('/api/bills', Bills.router()); // app.use('/api/budget', Budget.router()); dashboard.use('/api/resources', _controllers_Resources__WEBPACK_IMPORTED_MODULE_16__["default"].router()); dashboard.use('/api/exchange_rates', _http_controllers_ExchangeRates__WEBPACK_IMPORTED_MODULE_17__["default"].router()); dashboard.use('/api/media', _http_controllers_Media__WEBPACK_IMPORTED_MODULE_18__["default"].router()); app.use('/', dashboard); // app.use('/api/currency_adjustment', CurrencyAdjustment.router()); // app.use('/api/reports/sales', SalesReports.router()); // app.use('/api/reports/purchases', PurchasesReports.router()); }); /***/ }), /***/ "./src/http/middleware/TenancyMiddleware.js": /*!**************************************************!*\ !*** ./src/http/middleware/TenancyMiddleware.js ***! \**************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* WEBPACK VAR INJECTION */(function(__dirname) {/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! fs */ "fs"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! path */ "path"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _system_TenantsManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/system/TenantsManager */ "./src/system/TenantsManager.js"); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} function loadModelsFromDirectory() { var models = {}; fs__WEBPACK_IMPORTED_MODULE_3___default.a.readdirSync('src/models/').forEach(function (filename) { var model = { path: path__WEBPACK_IMPORTED_MODULE_4___default.a.join(__dirname, 'src/models/', filename), name: filename.replace(/\.[^/.]+$/, '') }; // eslint-disable-next-line global-require model.resource = __webpack_require__("./src/models sync recursive ^\\.\\/.*$")("./".concat(model.name)); models[model.name] = model; }); return models; } /* harmony default export */ __webpack_exports__["default"] = (/*#__PURE__*/(function () {var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res, next) {var organizationId, notFoundOrganization, tenant, knex, models;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: organizationId = req.headers['organization-id'] || req.query.organization; notFoundOrganization = function notFoundOrganization() {return res.boom.unauthorized( 'Organization identication not found.', { errors: [{ type: 'ORGANIZATION.ID.NOT.FOUND', code: 100 }] });};if ( organizationId) {_context.next = 4;break;}return _context.abrupt("return", notFoundOrganization());case 4:_context.next = 6;return ( _system_TenantsManager__WEBPACK_IMPORTED_MODULE_5__["default"].getTenant(organizationId));case 6:tenant = _context.sent;if ( tenant) {_context.next = 9;break;}return _context.abrupt("return", notFoundOrganization());case 9:if (!( tenant.id !== req.user.tenantId)) {_context.next = 11;break;}return _context.abrupt("return", res.boom.unauthorized());case 11: knex = _system_TenantsManager__WEBPACK_IMPORTED_MODULE_5__["default"].knexInstance(organizationId); models = loadModelsFromDirectory(); _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"].knexBinded = knex; req.knex = knex; req.organizationId = organizationId; req.models = _objectSpread({}, Object.values(models).reduce(function (acc, model) { if (typeof model.resource["default"].requestModel === 'function' && model.resource["default"].requestModel() && model.name !== 'TenantModel') { acc[model.name] = model.resource["default"].bindKnex(knex); } return acc; }, {})); next();case 18:case "end":return _context.stop();}}}, _callee);}));return function (_x, _x2, _x3) {return _ref.apply(this, arguments);};})()); /* WEBPACK VAR INJECTION */}.call(this, "/")) /***/ }), /***/ "./src/http/middleware/asyncMiddleware.js": /*!************************************************!*\ !*** ./src/http/middleware/asyncMiddleware.js ***! \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); var asyncMiddleware = function asyncMiddleware(fn) {return function (req, res, next) { Promise.resolve(fn(req, res, next))["catch"]( function (error) { console.log(error); next(error); }); };}; /* harmony default export */ __webpack_exports__["default"] = (asyncMiddleware); /***/ }), /***/ "./src/http/middleware/jwtAuth.js": /*!****************************************!*\ !*** ./src/http/middleware/jwtAuth.js ***! \****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var jsonwebtoken__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jsonwebtoken */ "jsonwebtoken"); /* harmony import */ var jsonwebtoken__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(jsonwebtoken__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/system/models/SystemUser */ "./src/system/models/SystemUser.js"); /* eslint-disable consistent-return */ var authMiddleware = function authMiddleware(req, res, next) {var JWT_SECRET_KEY = process.env.JWT_SECRET_KEY; var token = req.headers['x-access-token'] || req.query.token; var onError = function onError() {res.boom.unauthorized();}; if (!token) {return onError();} var verify = new Promise(function (resolve, reject) { jsonwebtoken__WEBPACK_IMPORTED_MODULE_2___default.a.verify(token, JWT_SECRET_KEY, /*#__PURE__*/function () {var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(error, decoded) {return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:if (! error) {_context.next = 4;break;} reject(error);_context.next = 10;break;case 4:_context.next = 6;return ( _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_3__["default"].query().findById(decoded._id));case 6:req.user = _context.sent;if ( req.user) {_context.next = 9;break;}return _context.abrupt("return", onError());case 9: resolve(decoded);case 10:case "end":return _context.stop();}}}, _callee);}));return function (_x, _x2) {return _ref.apply(this, arguments);};}()); }); verify.then(function () {next();})["catch"](onError); }; /* harmony default export */ __webpack_exports__["default"] = (authMiddleware); /***/ }), /***/ "./src/lib/Cachable/CachableModel.js": /*!*******************************************!*\ !*** ./src/lib/Cachable/CachableModel.js ***! \*******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _models_Model__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/Model */ "./src/models/Model.js"); /* harmony import */ var _services_Cache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/services/Cache */ "./src/services/Cache/index.js"); /* harmony default export */ __webpack_exports__["default"] = (function (Model) { return (/*#__PURE__*/function (_Model) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(CachableModel, _Model);function CachableModel() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CachableModel);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(CachableModel).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(CachableModel, null, [{ key: "flushCache", value: function flushCache( key) { var modelName = this.name; if (key) { _services_Cache__WEBPACK_IMPORTED_MODULE_6__["default"].del("".concat(modelName, ".").concat(key)); } else { _services_Cache__WEBPACK_IMPORTED_MODULE_6__["default"].delStartWith(modelName); } } }]);return CachableModel;}(Model)); }); /***/ }), /***/ "./src/lib/Cachable/CachableQueryBuilder.js": /*!**************************************************!*\ !*** ./src/lib/Cachable/CachableQueryBuilder.js ***! \**************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CachableQueryBuilder; }); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get"); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! crypto */ "crypto"); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_9__); /* harmony import */ var _services_Cache__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/services/Cache */ "./src/services/Cache/index.js"); var CachableQueryBuilder = /*#__PURE__*/function (_QueryBuilder) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(CachableQueryBuilder, _QueryBuilder);function CachableQueryBuilder() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default()(this, CachableQueryBuilder);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default()(CachableQueryBuilder).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default()(CachableQueryBuilder, [{ key: "then", value: function () {var _then = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee() {var _this = this;var _this$getOrStoreCache,_promise$then,promise,_args = arguments;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: // Flush model cache after insert, delete or update transaction. if (this.isInsert() || this.isDelete() || this.isUpdate()) { this.modelClass().flushCache(); }if (!( this.cacheTag && this.isFind())) {_context.next = 6;break;} this.setCacheKey();return _context.abrupt("return", (_this$getOrStoreCache = this.getOrStoreCache()).then.apply(_this$getOrStoreCache, _args));case 6: promise = this.execute();return _context.abrupt("return", (_promise$then = promise.then(function (result) { _this.setCache(result); return result; })).then.apply(_promise$then, _args));case 8:case "end":return _context.stop();}}}, _callee, this);}));function then() {return _then.apply(this, arguments);}return then;}() }, { key: "getOrStoreCache", value: function getOrStoreCache() {var _this2 = this; var storeFunction = function storeFunction() {return _this2.execute();}; return new Promise(function (resolve, reject) { _services_Cache__WEBPACK_IMPORTED_MODULE_10__["default"].get(_this2.cacheKey, storeFunction). then(function (result) {resolve(result);}); }); } }, { key: "setCache", value: function setCache( results) { _services_Cache__WEBPACK_IMPORTED_MODULE_10__["default"].set("".concat(this.cacheKey), results, this.cacheSeconds); } }, { key: "generateCacheKey", value: function generateCacheKey() { var knexSql = this.toKnexQuery().toSQL(); var hashedQuery = crypto__WEBPACK_IMPORTED_MODULE_9___default.a.createHash('md5').update(knexSql.sql).digest("hex"); return hashedQuery; } }, { key: "remember", value: function remember( key, seconds) { var modelName = this.modelClass().name; this.cacheSeconds = seconds; this.cacheTag = key ? "".concat(modelName, ".").concat(key) : modelName; return this; } }, { key: "withGraphFetched", value: function withGraphFetched( relation, settings) { if (!this.graphAppends) { this.graphAppends = [relation]; } else { this.graphAppends.push(relation); } return _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default()(CachableQueryBuilder.prototype), "withGraphFetched", this).call(this, relation, settings); } }, { key: "setCacheKey", value: function setCacheKey() { var hashedQuery = this.generateCacheKey(); var appends = (this.graphAppends || []).join(this.graphAppends, ','); this.cacheKey = "".concat(this.cacheTag, ".").concat(hashedQuery, ".").concat(appends); } }]);return CachableQueryBuilder;}(objection__WEBPACK_IMPORTED_MODULE_8__["QueryBuilder"]); /***/ }), /***/ "./src/lib/DependencyGraph/index.js": /*!******************************************!*\ !*** ./src/lib/DependencyGraph/index.js ***! \******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /** * A simple dependency graph */ /** * Helper for creating a Topological Sort using Depth-First-Search on a set of edges. * * Detects cycles and throws an Error if one is detected (unless the "circular" * parameter is "true" in which case it ignores them). * * @param edges The set of edges to DFS through * @param leavesOnly Whether to only return "leaf" nodes (ones who have no edges) * @param result An array in which the results will be populated * @param circular A boolean to allow circular dependencies */ function createDFS(edges, leavesOnly, result, circular) { var visited = {}; return function (start) { if (visited[start]) { return; } var inCurrentPath = {}; var currentPath = []; var todo = []; // used as a stack todo.push({ node: start, processed: false }); while (todo.length > 0) { var current = todo[todo.length - 1]; // peek at the todo stack var processed = current.processed; var node = current.node; if (!processed) { // Haven't visited edges yet (visiting phase) if (visited[node]) { todo.pop(); continue; } else if (inCurrentPath[node]) { // It's not a DAG if (circular) { todo.pop(); // If we're tolerating cycles, don't revisit the node continue; } currentPath.push(node); throw new DepGraphCycleError(currentPath); } inCurrentPath[node] = true; currentPath.push(node); var nodeEdges = edges[node]; // (push edges onto the todo stack in reverse order to be order-compatible with the old DFS implementation) for (var i = nodeEdges.length - 1; i >= 0; i--) { todo.push({ node: nodeEdges[i], processed: false }); } current.processed = true; } else { // Have visited edges (stack unrolling phase) todo.pop(); currentPath.pop(); inCurrentPath[node] = false; visited[node] = true; if (!leavesOnly || edges[node].length === 0) { result.push(node); } } } }; } /** * Simple Dependency Graph */ var DepGraph = DepGraph = function DepGraph(opts) { this.nodes = {}; // Node -> Node/Data (treated like a Set) this.outgoingEdges = {}; // Node -> [Dependency Node] this.incomingEdges = {}; // Node -> [Dependant Node] this.circular = opts && !!opts.circular; // Allows circular deps }; DepGraph.fromArray = function (items) {var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { itemId: 'id', parentItemId: 'parent_id' }; var depGraph = new DepGraph(); items.forEach(function (item) { depGraph.addNode(item[options.itemId], item); }); items.forEach(function (item) { if (item[options.parentItemId]) { depGraph.addDependency(item[options.parentItemId], item[options.itemId]); } }); return depGraph; }; DepGraph.prototype = { /** * The number of nodes in the graph. */ size: function size() { return Object.keys(this.nodes).length; }, /** * Add a node to the dependency graph. If a node already exists, this method will do nothing. */ addNode: function addNode(node, data) { if (!this.hasNode(node)) { // Checking the arguments length allows the user to add a node with undefined data if (arguments.length === 2) { this.nodes[node] = data; } else { this.nodes[node] = node; } this.outgoingEdges[node] = []; this.incomingEdges[node] = []; } }, /** * Remove a node from the dependency graph. If a node does not exist, this method will do nothing. */ removeNode: function removeNode(node) { if (this.hasNode(node)) { delete this.nodes[node]; delete this.outgoingEdges[node]; delete this.incomingEdges[node]; [this.incomingEdges, this.outgoingEdges].forEach(function (edgeList) { Object.keys(edgeList).forEach(function (key) { var idx = edgeList[key].indexOf(node); if (idx >= 0) { edgeList[key].splice(idx, 1); } }, this); }); } }, /** * Check if a node exists in the graph */ hasNode: function hasNode(node) { return this.nodes.hasOwnProperty(node); }, /** * Get the data associated with a node name */ getNodeData: function getNodeData(node) { if (this.hasNode(node)) { return this.nodes[node]; } else { throw new Error("Node does not exist: " + node); } }, /** * Set the associated data for a given node name. If the node does not exist, this method will throw an error */ setNodeData: function setNodeData(node, data) { if (this.hasNode(node)) { this.nodes[node] = data; } else { throw new Error("Node does not exist: " + node); } }, /** * Add a dependency between two nodes. If either of the nodes does not exist, * an Error will be thrown. */ addDependency: function addDependency(from, to) { if (!this.hasNode(from)) { throw new Error("Node does not exist: " + from); } if (!this.hasNode(to)) { throw new Error("Node does not exist: " + to); } if (this.outgoingEdges[from].indexOf(to) === -1) { this.outgoingEdges[from].push(to); } if (this.incomingEdges[to].indexOf(from) === -1) { this.incomingEdges[to].push(from); } return true; }, /** * Remove a dependency between two nodes. */ removeDependency: function removeDependency(from, to) { var idx; if (this.hasNode(from)) { idx = this.outgoingEdges[from].indexOf(to); if (idx >= 0) { this.outgoingEdges[from].splice(idx, 1); } } if (this.hasNode(to)) { idx = this.incomingEdges[to].indexOf(from); if (idx >= 0) { this.incomingEdges[to].splice(idx, 1); } } }, /** * Return a clone of the dependency graph. If any custom data is attached * to the nodes, it will only be shallow copied. */ clone: function clone() { var source = this; var result = new DepGraph(); var keys = Object.keys(source.nodes); keys.forEach(function (n) { result.nodes[n] = source.nodes[n]; result.outgoingEdges[n] = source.outgoingEdges[n].slice(0); result.incomingEdges[n] = source.incomingEdges[n].slice(0); }); return result; }, /** * Get an array containing the nodes that the specified node depends on (transitively). * * Throws an Error if the graph has a cycle, or the specified node does not exist. * * If `leavesOnly` is true, only nodes that do not depend on any other nodes will be returned * in the array. */ dependenciesOf: function dependenciesOf(node, leavesOnly) { if (this.hasNode(node)) { var result = []; var DFS = createDFS( this.outgoingEdges, leavesOnly, result, this.circular); DFS(node); var idx = result.indexOf(node); if (idx >= 0) { result.splice(idx, 1); } return result; } else { throw new Error("Node does not exist: " + node); } }, /** * get an array containing the nodes that depend on the specified node (transitively). * * Throws an Error if the graph has a cycle, or the specified node does not exist. * * If `leavesOnly` is true, only nodes that do not have any dependants will be returned in the array. */ dependantsOf: function dependantsOf(node, leavesOnly) { if (this.hasNode(node)) { var result = []; var DFS = createDFS( this.incomingEdges, leavesOnly, result, this.circular); DFS(node); var idx = result.indexOf(node); if (idx >= 0) { result.splice(idx, 1); } return result; } else { throw new Error("Node does not exist: " + node); } }, /** * Construct the overall processing order for the dependency graph. * * Throws an Error if the graph has a cycle. * * If `leavesOnly` is true, only nodes that do not depend on any other nodes will be returned. */ overallOrder: function overallOrder(leavesOnly) { var self = this; var result = []; var keys = Object.keys(this.nodes); if (keys.length === 0) { return result; // Empty graph } else { if (!this.circular) { // Look for cycles - we run the DFS starting at all the nodes in case there // are several disconnected subgraphs inside this dependency graph. var CycleDFS = createDFS(this.outgoingEdges, false, [], this.circular); keys.forEach(function (n) { CycleDFS(n); }); } var DFS = createDFS( this.outgoingEdges, leavesOnly, result, this.circular); // Find all potential starting points (nodes with nothing depending on them) an // run a DFS starting at these points to get the order keys. filter(function (node) { return self.incomingEdges[node].length === 0; }). forEach(function (n) { DFS(n); }); // If we're allowing cycles - we need to run the DFS against any remaining // nodes that did not end up in the initial result (as they are part of a // subgraph that does not have a clear starting point) if (this.circular) { keys. filter(function (node) { return result.indexOf(node) === -1; }). forEach(function (n) { DFS(n); }); } return result; } }, mapNodes: function mapNodes(mapper) { } }; /** * Cycle error, including the path of the cycle. */ var DepGraphCycleError = exports.DepGraphCycleError = function (cyclePath) { var message = "Dependency Cycle Found: " + cyclePath.join(" -> "); var instance = new Error(message); instance.cyclePath = cyclePath; Object.setPrototypeOf(instance, Object.getPrototypeOf(this)); if (Error.captureStackTrace) { Error.captureStackTrace(instance, DepGraphCycleError); } return instance; }; DepGraphCycleError.prototype = Object.create(Error.prototype, { constructor: { value: Error, enumerable: false, writable: true, configurable: true } }); Object.setPrototypeOf(DepGraphCycleError, Error); /* harmony default export */ __webpack_exports__["default"] = (DepGraph); /***/ }), /***/ "./src/lib/DynamicFilter/DynamicFilter.js": /*!************************************************!*\ !*** ./src/lib/DynamicFilter/DynamicFilter.js ***! \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DynamicFilter; }); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray"); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); var DynamicFilter = /*#__PURE__*/function () { /** * Constructor. * @param {String} tableName - */ function DynamicFilter(tableName) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, DynamicFilter); this.tableName = tableName; this.filters = []; } /** * Set filter. * @param {*} filterRole - */_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(DynamicFilter, [{ key: "setFilter", value: function setFilter( filterRole) { filterRole.setTableName(this.tableName); this.filters.push(filterRole); } /** * Builds queries of filter roles. */ }, { key: "buildQuery", value: function buildQuery() {var _this = this; var buildersCallbacks = []; var tableColumns = []; this.filters.forEach(function (filter) {var filterRoles = filter.filterRoles; buildersCallbacks.push(filter.buildQuery()); tableColumns.push.apply(tableColumns, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(Array.isArray(filterRoles) ? filterRoles : [filterRoles])); }); return function (builder) { buildersCallbacks.forEach(function (builderCallback) { builderCallback(builder); }); Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_4__["buildFilterRolesJoins"])(_this.tableName, Object(lodash__WEBPACK_IMPORTED_MODULE_3__["uniqBy"])(tableColumns, 'columnKey'))(builder); }; } }]);return DynamicFilter;}(); /***/ }), /***/ "./src/lib/DynamicFilter/DynamicFilterFilterRoles.js": /*!***********************************************************!*\ !*** ./src/lib/DynamicFilter/DynamicFilterFilterRoles.js ***! \***********************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FilterRoles; }); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/DynamicFilter/DynamicFilterRoleAbstructor */ "./src/lib/DynamicFilter/DynamicFilterRoleAbstructor.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} var FilterRoles = /*#__PURE__*/function (_DynamicFilterRoleAbs) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(FilterRoles, _DynamicFilterRoleAbs); /** * Constructor method. * @param {Array} filterRoles - * @param {Array} resourceFields - */ function FilterRoles(filterRoles, resourceFields) {var _this;_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, FilterRoles); _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(FilterRoles).call(this)); _this.filterRoles = filterRoles.map(function (role, index) {return _objectSpread({}, role, { index: index + 1, columnKey: role.field_key, condition: role.comparator === 'AND' ? '&&' : '||' });}); _this.resourceFields = resourceFields;return _this; }_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(FilterRoles, [{ key: "validateFilterRoles", value: function validateFilterRoles() { var filterFieldsKeys = this.filterRoles.map(function (r) {return r.field_key;}); var resourceFieldsKeys = this.resourceFields.map(function (r) {return r.key;}); return Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(filterFieldsKeys, resourceFieldsKeys); } // @private }, { key: "buildLogicExpression", value: function buildLogicExpression() { var expression = ''; this.filterRoles.forEach(function (role, index) { expression += index === 0 ? "".concat( role.index, " ") : "".concat(role.condition, " ").concat(role.index, " "); }); return expression.trim(); } /** * Builds database query of view roles. */ }, { key: "buildQuery", value: function buildQuery() {var _this2 = this; return function (builder) { var logicExpression = _this2.buildLogicExpression(); Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_8__["buildFilterQuery"])(_this2.tableName, _this2.filterRoles, logicExpression)(builder); }; } }]);return FilterRoles;}(_lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_7__["default"]); /***/ }), /***/ "./src/lib/DynamicFilter/DynamicFilterRoleAbstructor.js": /*!**************************************************************!*\ !*** ./src/lib/DynamicFilter/DynamicFilterRoleAbstructor.js ***! \**************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DynamicFilterAbstructor; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); var DynamicFilterAbstructor = /*#__PURE__*/function () { function DynamicFilterAbstructor() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DynamicFilterAbstructor); this.filterRoles = []; this.tableName = ''; }_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DynamicFilterAbstructor, [{ key: "setTableName", value: function setTableName( tableName) { this.tableName = tableName; } /** * @interface */ // eslint-disable-next-line class-methods-use-this }, { key: "buildLogicExpression", value: function buildLogicExpression() {} /** * @interface */ // eslint-disable-next-line class-methods-use-this }, { key: "validateFilterRoles", value: function validateFilterRoles() {} /** * @interface */ // eslint-disable-next-line class-methods-use-this }, { key: "buildQuery", value: function buildQuery() {} }]);return DynamicFilterAbstructor;}(); /***/ }), /***/ "./src/lib/DynamicFilter/DynamicFilterSortBy.js": /*!******************************************************!*\ !*** ./src/lib/DynamicFilter/DynamicFilterSortBy.js ***! \******************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DynamicFilterSortBy; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/lib/DynamicFilter/DynamicFilterRoleAbstructor */ "./src/lib/DynamicFilter/DynamicFilterRoleAbstructor.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); var DynamicFilterSortBy = /*#__PURE__*/function (_DynamicFilterRoleAbs) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(DynamicFilterSortBy, _DynamicFilterRoleAbs); function DynamicFilterSortBy(sortByFieldKey, sortDirection) {var _this;_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DynamicFilterSortBy); _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DynamicFilterSortBy).call(this)); _this.filterRoles = { columnKey: sortByFieldKey, value: sortDirection, comparator: 'sort_by' };return _this; } /** * Builds database query of sort by column on the given direction. */_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DynamicFilterSortBy, [{ key: "buildQuery", value: function buildQuery() {var _this2 = this;var _this$filterRoles = this.filterRoles,_this$filterRoles$col = _this$filterRoles.columnKey,columnKey = _this$filterRoles$col === void 0 ? null : _this$filterRoles$col,_this$filterRoles$val = _this$filterRoles.value,value = _this$filterRoles$val === void 0 ? null : _this$filterRoles$val; return function (builder) { var fieldRelation = Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_6__["getRoleFieldColumn"])(_this2.tableName, columnKey); if (columnKey) { builder.orderBy("".concat(_this2.tableName, ".").concat(fieldRelation.column), value.toLowerCase()); } }; } }]);return DynamicFilterSortBy;}(_lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/lib/DynamicFilter/DynamicFilterViews.js": /*!*****************************************************!*\ !*** ./src/lib/DynamicFilter/DynamicFilterViews.js ***! \*****************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DynamicFilterViews; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/lib/DynamicFilter/DynamicFilterRoleAbstructor */ "./src/lib/DynamicFilter/DynamicFilterRoleAbstructor.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); var DynamicFilterViews = /*#__PURE__*/function (_DynamicFilterRoleAbs) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(DynamicFilterViews, _DynamicFilterRoleAbs); /** * Constructor method. * @param {*} filterRoles - * @param {*} logicExpression - */ function DynamicFilterViews(filterRoles, logicExpression) {var _this;_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DynamicFilterViews); _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DynamicFilterViews).call(this)); _this.filterRoles = filterRoles; _this.logicExpression = logicExpression. replace('AND', '&&'). replace('OR', '||'); _this.tableName = '';return _this; } /** * Retrieve logic expression. */_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DynamicFilterViews, [{ key: "buildLogicExpression", value: function buildLogicExpression() { return this.logicExpression; } /** * Validates filter roles. */ }, { key: "validateFilterRoles", value: function validateFilterRoles() { return Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_6__["validateViewRoles"])(this.filterRoles, this.logicExpression); } /** * Builds database query of view roles. */ }, { key: "buildQuery", value: function buildQuery() {var _this2 = this; return function (builder) { Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_6__["buildFilterQuery"])(_this2.tableName, _this2.filterRoles, _this2.logicExpression)(builder); }; } }]);return DynamicFilterViews;}(_lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/lib/DynamicFilter/index.js": /*!****************************************!*\ !*** ./src/lib/DynamicFilter/index.js ***! \****************************************/ /*! exports provided: DynamicFilter, DynamicFilterSortBy, DynamicFilterViews, DynamicFilterFilterRoles */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _DynamicFilter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DynamicFilter */ "./src/lib/DynamicFilter/DynamicFilter.js"); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DynamicFilter", function() { return _DynamicFilter__WEBPACK_IMPORTED_MODULE_0__["default"]; }); /* harmony import */ var _DynamicFilterSortBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DynamicFilterSortBy */ "./src/lib/DynamicFilter/DynamicFilterSortBy.js"); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DynamicFilterSortBy", function() { return _DynamicFilterSortBy__WEBPACK_IMPORTED_MODULE_1__["default"]; }); /* harmony import */ var _DynamicFilterViews__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DynamicFilterViews */ "./src/lib/DynamicFilter/DynamicFilterViews.js"); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DynamicFilterViews", function() { return _DynamicFilterViews__WEBPACK_IMPORTED_MODULE_2__["default"]; }); /* harmony import */ var _DynamicFilterFilterRoles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DynamicFilterFilterRoles */ "./src/lib/DynamicFilter/DynamicFilterFilterRoles.js"); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DynamicFilterFilterRoles", function() { return _DynamicFilterFilterRoles__WEBPACK_IMPORTED_MODULE_3__["default"]; }); /***/ }), /***/ "./src/lib/LogicEvaluation/Lexer.js": /*!******************************************!*\ !*** ./src/lib/LogicEvaluation/Lexer.js ***! \******************************************/ /*! exports provided: Lexer, default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Lexer", function() { return Lexer; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return token; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); var OperationType = { LOGIC: 'LOGIC', STRING: 'STRING', COMPARISON: 'COMPARISON', MATH: 'MATH' }; var Lexer = /*#__PURE__*/function () {_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Lexer, null, [{ key: "optable", // operation table get: function get() { return { '=': OperationType.LOGIC, '&': OperationType.LOGIC, '|': OperationType.LOGIC, '?': OperationType.LOGIC, ':': OperationType.LOGIC, '\'': OperationType.STRING, '"': OperationType.STRING, '!': OperationType.COMPARISON, '>': OperationType.COMPARISON, '<': OperationType.COMPARISON, '(': OperationType.MATH, ')': OperationType.MATH, '+': OperationType.MATH, '-': OperationType.MATH, '*': OperationType.MATH, '/': OperationType.MATH, '%': OperationType.MATH }; } /** * Constructor * @param {*} expression - */ }]); function Lexer(expression) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Lexer); this.currentIndex = 0; this.input = expression; this.tokenList = []; }_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Lexer, [{ key: "getTokens", value: function getTokens() { var tok; do { // read current token, so step should be -1 tok = this.pickNext(-1); var pos = this.currentIndex; switch (Lexer.optable[tok]) { case OperationType.LOGIC: // == && || === this.readLogicOpt(tok); break; case OperationType.STRING: this.readString(tok); break; case OperationType.COMPARISON: this.readCompare(tok); break; case OperationType.MATH: this.receiveToken(); break; default: this.readValue(tok);} // if the pos not changed, this loop will go into a infinite loop, every step of while loop, // we must move the pos forward // so here we should throw error, for example `1 & 2` if (pos === this.currentIndex && tok !== undefined) { var err = new Error("unkonw token ".concat(tok, " from input string ").concat(this.input)); err.name = 'UnknowToken'; throw err; } } while (tok !== undefined); return this.tokenList; } /** * read next token, the index param can set next step, default go foward 1 step * * @param index next postion */ }, { key: "pickNext", value: function pickNext() {var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return this.input[index + this.currentIndex + 1]; } /** * Store token into result tokenList, and move the pos index * * @param index */ }, { key: "receiveToken", value: function receiveToken() {var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; var tok = this.input.slice(this.currentIndex, this.currentIndex + index).trim(); // skip empty string if (tok) { this.tokenList.push(tok); } this.currentIndex += index; } // ' or " }, { key: "readString", value: function readString(tok) { var next; var index = 0; do { next = this.pickNext(index); index += 1; } while (next !== tok && next !== undefined); this.receiveToken(index + 1); } // > or < or >= or <= or !== // tok in (>, <, !) }, { key: "readCompare", value: function readCompare(tok) { if (this.pickNext() !== '=') { this.receiveToken(1); return; } // !== if (tok === '!' && this.pickNext(1) === '=') { this.receiveToken(3); return; } this.receiveToken(2); } // === or == // && || }, { key: "readLogicOpt", value: function readLogicOpt(tok) { if (this.pickNext() === tok) { // === if (tok === '=' && this.pickNext(1) === tok) { return this.receiveToken(3); } // == && || return this.receiveToken(2); } // handle as && // a ? b : c is equal to a && b || c if (tok === '?' || tok === ':') { return this.receiveToken(1); } } }, { key: "readValue", value: function readValue( tok) { if (!tok) { return; } var index = 0; while (!Lexer.optable[tok] && tok !== undefined) { tok = this.pickNext(index); index += 1; } this.receiveToken(index); } }]);return Lexer;}(); function token(expression) { var lexer = new Lexer(expression); return lexer.getTokens(); } /***/ }), /***/ "./src/lib/LogicEvaluation/Parser.js": /*!*******************************************!*\ !*** ./src/lib/LogicEvaluation/Parser.js ***! \*******************************************/ /*! exports provided: OPERATION, default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OPERATION", function() { return OPERATION; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Parser; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); var OPERATION = { '!': 5, '*': 4, '/': 4, '%': 4, '+': 3, '-': 3, '>': 2, '<': 2, '>=': 2, '<=': 2, '===': 2, '!==': 2, '==': 2, '!=': 2, '&&': 1, '||': 1, '?': 1, ':': 1 }; // export interface Node { // left: Node | string | null; // right: Node | string | null; // operation: string; // grouped?: boolean; // }; var Parser = /*#__PURE__*/function () { function Parser(token) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Parser); this.index = -1; this.blockLevel = 0; this.token = token; } /** * * @return {Node | string} =- */_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Parser, [{ key: "parse", value: function parse() { var tok; var root = { left: null, right: null, operation: null }; do { tok = this.parseStatement(); if (tok === null || tok === undefined) { break; } if (root.left === null) { root.left = tok; root.operation = this.nextToken(); if (!root.operation) { return tok; } root.right = this.parseStatement(); } else { if (typeof tok !== 'string') { throw new Error('operation must be string, but get ' + JSON.stringify(tok)); } root = this.addNode(tok, this.parseStatement(), root); } } while (tok); return root; } }, { key: "nextToken", value: function nextToken() { this.index += 1; return this.token[this.index]; } }, { key: "prevToken", value: function prevToken() { return this.token[this.index - 1]; } /** * * @param {string} operation * @param {Node|String|null} right * @param {Node} root */ }, { key: "addNode", value: function addNode( operation, right, root) { var pre = root; if (this.compare(pre.operation, operation) < 0 && !pre.grouped) { while (pre.right !== null && typeof pre.right !== 'string' && this.compare(pre.right.operation, operation) < 0 && !pre.right.grouped) { pre = pre.right; } pre.right = { operation: operation, left: pre.right, right: right }; return root; } return { left: pre, right: right, operation: operation }; } /** * * @param {String} a * @param {String} b */ }, { key: "compare", value: function compare( a, b) { if (!OPERATION.hasOwnProperty(a) || !OPERATION.hasOwnProperty(b)) { throw new Error("unknow operation ".concat(a, " or ").concat(b)); } return OPERATION[a] - OPERATION[b]; } /** * @return string | Node | null */ }, { key: "parseStatement", value: function parseStatement() { var token = this.nextToken(); if (token === '(') { this.blockLevel += 1; var node = this.parse(); this.blockLevel -= 1; if (typeof node !== 'string') { node.grouped = true; } return node; } if (token === ')') { return null; } if (token === '!') { return { left: null, operation: token, right: this.parseStatement() }; } // 3 > -12 or -12 + 10 if (token === '-' && (OPERATION[this.prevToken()] > 0 || this.prevToken() === undefined)) { return { left: '0', operation: token, right: this.parseStatement(), grouped: true }; } return token; } }]);return Parser;}(); /***/ }), /***/ "./src/lib/LogicEvaluation/QueryParser.js": /*!************************************************!*\ !*** ./src/lib/LogicEvaluation/QueryParser.js ***! \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return QueryParser; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _Parser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Parser */ "./src/lib/LogicEvaluation/Parser.js"); var QueryParser = /*#__PURE__*/function () { function QueryParser(tree, queries) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, QueryParser); this.tree = tree; this.queries = queries; this.query = null; }_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(QueryParser, [{ key: "setQuery", value: function setQuery( query) { this.query = query.clone(); } }, { key: "parse", value: function parse() { return this.parseNode(this.tree); } }, { key: "parseNode", value: function parseNode( node) { if (typeof node === 'string') { var nodeQuery = this.getQuery(node); return function (query) {nodeQuery(query);}; } if (_Parser__WEBPACK_IMPORTED_MODULE_2__["OPERATION"][node.operation] === undefined) { throw new Error("unknow expression ".concat(node.operation)); } var leftQuery = this.getQuery(node.left); var rightQuery = this.getQuery(node.right); switch (node.operation) { case '&&': case 'AND': default: return function (nodeQuery) {return nodeQuery.where(function (query) { query.where(function (q) {leftQuery(q);}); query.andWhere(function (q) {rightQuery(q);}); });}; case '||': case 'OR': return function (nodeQuery) {return nodeQuery.where(function (query) { query.where(function (q) {leftQuery(q);}); query.orWhere(function (q) {rightQuery(q);}); });};} } }, { key: "getQuery", value: function getQuery( node) { if (typeof node !== 'string' && node !== null) { return this.parseNode(node); } var value = parseFloat(node); if (!isNaN(value)) { if (typeof this.queries[node] === 'undefined') { throw new Error("unknow query under index ".concat(node)); } return this.queries[node]; } return null; } }]);return QueryParser;}(); /***/ }), /***/ "./src/lib/Metable/MetableCollection.js": /*!**********************************************!*\ !*** ./src/lib/Metable/MetableCollection.js ***! \**********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MetableCollection; }); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "@babel/runtime/helpers/typeof"); /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties"); /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_6__); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}var MetableCollection = /*#__PURE__*/function () { /** * Constructor method. */ function MetableCollection() {var _this = this;_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_5___default()(this, MetableCollection); this.metadata = []; this.KEY_COLUMN = 'key'; this.VALUE_COLUMN = 'value'; this.TYPE_COLUMN = 'type'; this.model = null; this.extraColumns = []; this.extraQuery = function (query, meta) { query.where('key', meta[_this.KEY_COLUMN]); }; } /** * Set model of this metadata collection. * @param {Object} model - */_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_6___default()(MetableCollection, [{ key: "setModel", value: function setModel( model) { this.model = model; } /** * Sets a extra columns. * @param {Array} columns - */ }, { key: "setExtraColumns", value: function setExtraColumns( columns) { this.extraColumns = columns; } /** * Find the given metadata key. * @param {String} key - * @return {object} - Metadata object. */ }, { key: "findMeta", value: function findMeta( payload) {var _this2 = this;var _this$parsePayload = this.parsePayload(payload),key = _this$parsePayload.key,extraColumns = _this$parsePayload.extraColumns; return this.allMetadata().find(function (meta) { var isSameKey = meta.key === key; var sameExtraColumns = _this2.extraColumns.some(function (extraColumn) { return !extraColumns || extraColumns[extraColumn] === meta[extraColumn]; }); return isSameKey && sameExtraColumns; }); } /** * Retrieve all metadata. */ }, { key: "allMetadata", value: function allMetadata() { return this.metadata.filter(function (meta) {return !meta.markAsDeleted;}); } /** * Retrieve metadata of the given key. * @param {String} key - * @param {Mixied} defaultValue - */ }, { key: "getMeta", value: function getMeta( payload, defaultValue) { var metadata = this.findMeta(payload); return metadata ? metadata.value : defaultValue || false; } /** * Markes the metadata to should be deleted. * @param {String} key - */ }, { key: "removeMeta", value: function removeMeta( key) { var metadata = this.findMeta(key); if (metadata) { metadata.markAsDeleted = true; } } /** * Remove all meta data of the given group. * @param {*} group */ }, { key: "removeAllMeta", value: function removeAllMeta() {var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'default'; this.metadata = this.metadata.map(function (meta) {return _objectSpread({}, meta, { markAsDeleted: true });}); } }, { key: "setExtraQuery", value: function setExtraQuery( callback) { this.extraQuery = callback; } /** * Set the meta data to the stack. * @param {String} key - * @param {String} value - */ }, { key: "setMeta", value: function setMeta( payload) {var _this3 = this; if (Array.isArray(key)) { var _metadata = key; _metadata.forEach(function (meta) { _this3.setMeta(meta.key, meta.value); }); return; }var _this$parsePayload2 = this.parsePayload(payload, arguments.length <= 1 ? undefined : arguments[1]),key = _this$parsePayload2.key,value = _this$parsePayload2.value,extraColumns = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3___default()(_this$parsePayload2, ["key", "value"]); var metadata = this.findMeta(payload); if (metadata) { metadata.value = value; metadata.markAsUpdated = true; } else { this.metadata.push(_objectSpread({ value: value, key: key }, extraColumns, { markAsInserted: true })); } } }, { key: "parsePayload", value: function parsePayload( payload, value) { return _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2___default()(payload) !== 'object' ? { key: payload, value: value } : _objectSpread({}, payload); } /** * Saved the modified/deleted and inserted metadata. */ }, { key: "saveMeta", value: function () {var _saveMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee() {var _this4 = this;var inserted, updated, deleted, opers;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: inserted = this.metadata.filter(function (m) {return m.markAsInserted === true;}); updated = this.metadata.filter(function (m) {return m.markAsUpdated === true;}); deleted = this.metadata.filter(function (m) {return m.markAsDeleted === true;}); opers = []; if (deleted.length > 0) { deleted.forEach(function (meta) { var deleteOper = _this4.model.query().onBuild(function (query, result) { _this4.extraQuery(query, meta); return result; })["delete"](); opers.push(deleteOper); }); } inserted.forEach(function (meta) {var _objectSpread2; var insertOper = _this4.model.query().insert(_objectSpread((_objectSpread2 = {}, _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(_objectSpread2, _this4.KEY_COLUMN, meta.key), _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(_objectSpread2, _this4.VALUE_COLUMN, meta.value), _objectSpread2), _this4.extraColumns.reduce(function (obj, column) { if (typeof meta[column] !== 'undefined') { obj[column] = meta[column]; } return obj; }, {}))); opers.push(insertOper); }); updated.forEach(function (meta) { var updateOper = _this4.model.query().onBuild(function (query) { _this4.extraQuery(query, meta); }).patch(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()({}, _this4.VALUE_COLUMN, meta.value)); opers.push(updateOper); });_context.next = 9;return ( Promise.all(opers));case 9:case "end":return _context.stop();}}}, _callee, this);}));function saveMeta() {return _saveMeta.apply(this, arguments);}return saveMeta;}() /** * Loads the metadata from the storage. * @param {String|Array} key - * @param {Boolean} force - */ }, { key: "load", value: function () {var _load = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2() {var _this5 = this;var metadata, metadataArray;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:_context2.next = 2;return ( this.query());case 2:metadata = _context2.sent; metadataArray = this.mapMetadataCollection(metadata); metadataArray.forEach(function (meta) { _this5.metadata.push(meta); });case 5:case "end":return _context2.stop();}}}, _callee2, this);}));function load() {return _load.apply(this, arguments);}return load;}() /** * Format the metadata before saving to the database. * @param {String|Number|Boolean} value - * @param {String} valueType - * @return {String|Number|Boolean} - */ }, { key: "mapMetadata", /** * Mapping and parse metadata to collection entries. * @param {Meta} attr - * @param {String} parseType - */value: function mapMetadata( attr) {var parseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'parse'; return _objectSpread({ key: attr[this.KEY_COLUMN], value: parseType === 'parse' ? MetableCollection.parseMetaValue( attr[this.VALUE_COLUMN], this.TYPE_COLUMN ? attr[this.TYPE_COLUMN] : false) : MetableCollection.formatMetaValue( attr[this.VALUE_COLUMN], this.TYPE_COLUMN ? attr[this.TYPE_COLUMN] : false) }, this.extraColumns.map(function (extraCol) {return _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()({}, extraCol, attr[extraCol] || null);})); } /** * Parse the metadata to the collection. * @param {Array} collection - */ }, { key: "mapMetadataToCollection", value: function mapMetadataToCollection( metadata) {var _this6 = this;var parseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'parse'; return metadata.map(function (model) {return _this6.mapMetadataToCollection(model, parseType);}); } /** * Load metadata to the metable collection. * @param {Array} meta - */ }, { key: "from", value: function from( meta) {var _this7 = this; if (Array.isArray(meta)) { meta.forEach(function (m) {_this7.from(m);}); return; } this.metadata.push(meta); } }, { key: "toArray", value: function toArray() { return this.metadata; } /** * Static method to load metadata to the collection. * @param {Array} meta */ }], [{ key: "formatMetaValue", value: function formatMetaValue(value, valueType) {var parsedValue;switch (valueType) {case 'number':parsedValue = "".concat(value);break;case 'boolean':parsedValue = value ? '1' : '0';break;case 'json':parsedValue = JSON.stringify(parsedValue);break;default:parsedValue = value;break;}return parsedValue;} }, { key: "from", value: function from( meta) { var collection = new MetableCollection(); collection.from(meta); return collection; } }]);return MetableCollection;}(); /***/ }), /***/ "./src/lib/ViewRolesBuilder/index.js": /*!*******************************************!*\ !*** ./src/lib/ViewRolesBuilder/index.js ***! \*******************************************/ /*! exports provided: getRoleFieldColumn, buildRoleQuery, getTableFromRelationColumn, buildFilterRolesJoins, buildSortColumnJoin, buildFilterRolesQuery, buildFilterQuery, validateFilterLogicExpression, validateViewRoles, mapViewRolesToConditionals, mapFilterRolesToDynamicFilter, buildSortColumnQuery */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRoleFieldColumn", function() { return getRoleFieldColumn; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildRoleQuery", function() { return buildRoleQuery; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTableFromRelationColumn", function() { return getTableFromRelationColumn; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildFilterRolesJoins", function() { return buildFilterRolesJoins; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildSortColumnJoin", function() { return buildSortColumnJoin; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildFilterRolesQuery", function() { return buildFilterRolesQuery; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildFilterQuery", function() { return buildFilterQuery; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateFilterLogicExpression", function() { return validateFilterLogicExpression; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateViewRoles", function() { return validateViewRoles; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapViewRolesToConditionals", function() { return mapViewRolesToConditionals; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapFilterRolesToDynamicFilter", function() { return mapFilterRolesToDynamicFilter; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildSortColumnQuery", function() { return buildSortColumnQuery; }); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _lib_LogicEvaluation_Lexer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/LogicEvaluation/Lexer */ "./src/lib/LogicEvaluation/Lexer.js"); /* harmony import */ var _lib_LogicEvaluation_Parser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/LogicEvaluation/Parser */ "./src/lib/LogicEvaluation/Parser.js"); /* harmony import */ var _lib_LogicEvaluation_QueryParser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/LogicEvaluation/QueryParser */ "./src/lib/LogicEvaluation/QueryParser.js"); /* harmony import */ var _data_ResourceFieldsKeys__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/data/ResourceFieldsKeys */ "./src/data/ResourceFieldsKeys.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} // const role = { // compatotor: String, // value: String, // columnKey: String, // columnSlug: String, // index: Number, // } /** * Get field column metadata and its relation with other tables. * @param {String} tableName - Table name of target column. * @param {String} columnKey - Target column key that stored in resource field. */ function getRoleFieldColumn(tableName, columnKey) { var tableFields = _data_ResourceFieldsKeys__WEBPACK_IMPORTED_MODULE_5__["default"][tableName]; return tableFields[columnKey] ? tableFields[columnKey] : null; } /** * Builds roles queries. * @param {String} tableName - * @param {Object} role - */ function buildRoleQuery(tableName, role) { var fieldRelation = getRoleFieldColumn(tableName, role.columnKey); var comparatorColumn = fieldRelation.relationColumn || "".concat(tableName, ".").concat(fieldRelation.column); switch (role.comparator) { case 'equals': default: return function (builder) { builder.where(comparatorColumn, role.value); }; case 'not_equal': case 'not_equals': return function (builder) { builder.whereNot(comparatorColumn, role.value); }; case 'contain': case 'contains': return function (builder) { builder.where(comparatorColumn, 'LIKE', "%".concat(role.value, "%")); };} } /** * Extract relation table name from relation. * @param {String} column - * @return {String} - join relation table. */ var getTableFromRelationColumn = function getTableFromRelationColumn(column) { var splitedColumn = column.split('.'); return splitedColumn.length > 0 ? splitedColumn[0] : ''; }; /** * Builds view roles join queries. * @param {String} tableName - * @param {Array} roles - */ function buildFilterRolesJoins(tableName, roles) { return function (builder) { roles.forEach(function (role) { var fieldColumn = getRoleFieldColumn(tableName, role.columnKey); if (fieldColumn.relation) { var joinTable = getTableFromRelationColumn(fieldColumn.relation); builder.join(joinTable, "".concat(tableName, ".").concat(fieldColumn.column), '=', fieldColumn.relation); } }); }; } function buildSortColumnJoin(tableName, sortColumnKey) { return function (builder) { var fieldColumn = getRoleFieldColumn(tableName, sortColumnKey); if (fieldColumn.relation) { var joinTable = getTableFromRelationColumn(fieldColumn.relation); builder.join(joinTable, "".concat(tableName, ".").concat(fieldColumn.column), '=', fieldColumn.relation); } }; } /** * Builds database query from stored view roles. * * @param {Array} roles - * @return {Function} */ function buildFilterRolesQuery(tableName, roles) {var logicExpression = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var rolesIndexSet = {}; roles.forEach(function (role) { rolesIndexSet[role.index] = buildRoleQuery(tableName, role); }); // Lexer for logic expression. var lexer = new _lib_LogicEvaluation_Lexer__WEBPACK_IMPORTED_MODULE_2__["Lexer"](logicExpression); var tokens = lexer.getTokens(); // Parse the logic expression. var parser = new _lib_LogicEvaluation_Parser__WEBPACK_IMPORTED_MODULE_3__["default"](tokens); var parsedTree = parser.parse(); var queryParser = new _lib_LogicEvaluation_QueryParser__WEBPACK_IMPORTED_MODULE_4__["default"](parsedTree, rolesIndexSet); return queryParser.parse(); } /** * Builds filter query for query builder. * @param {String} tableName - * @param {Array} roles - * @param {String} logicExpression - */ var buildFilterQuery = function buildFilterQuery(tableName, roles, logicExpression) { return function (builder) { buildFilterRolesQuery(tableName, roles, logicExpression)(builder); }; }; /** * Validates the view logic expression. * @param {String} logicExpression - * @param {Array} indexes - */ function validateFilterLogicExpression(logicExpression, indexes) { var logicExpIndexes = logicExpression.match(/\d+/g) || []; return !Object(lodash__WEBPACK_IMPORTED_MODULE_1__["difference"])(logicExpIndexes.map(Number), indexes).length; } /** * Validates view roles. * @param {Array} roles - * @param {String} logicExpression - * @return {Boolean} */ function validateViewRoles(roles, logicExpression) { return validateFilterLogicExpression(logicExpression, roles.map(function (r) {return r.index;})); } /** * Mapes the view roles to view conditionals. * @param {Array} viewRoles - * @return {Array} */ function mapViewRolesToConditionals(viewRoles) { return viewRoles.map(function (viewRole) {return { comparator: viewRole.comparator, value: viewRole.value, columnKey: viewRole.field.key, slug: viewRole.field.slug, index: viewRole.index };}); } function mapFilterRolesToDynamicFilter(roles) { return roles.map(function (role) {return _objectSpread({}, role, { columnKey: role.fieldKey });}); } /** * Builds sort column query. * @param {String} tableName - * @param {String} columnKey - * @param {String} sortDirection - */ function buildSortColumnQuery(tableName, columnKey, sortDirection) { var fieldRelation = getRoleFieldColumn(tableName, columnKey); var sortColumn = fieldRelation.relation || "".concat(tableName, ".").concat(fieldRelation.column); return function (builder) { builder.orderBy(sortColumn, sortDirection); buildSortColumnJoin(tableName, columnKey)(builder); }; } /***/ }), /***/ "./src/models sync recursive ^\\.\\/.*$": /*!**********************************!*\ !*** ./src/models sync ^\.\/.*$ ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var map = { "./Account": "./src/models/Account.js", "./Account.js": "./src/models/Account.js", "./AccountBalance": "./src/models/AccountBalance.js", "./AccountBalance.js": "./src/models/AccountBalance.js", "./AccountTransaction": "./src/models/AccountTransaction.js", "./AccountTransaction.js": "./src/models/AccountTransaction.js", "./AccountType": "./src/models/AccountType.js", "./AccountType.js": "./src/models/AccountType.js", "./Auth": "./src/models/Auth.js", "./Auth.js": "./src/models/Auth.js", "./Budget": "./src/models/Budget.js", "./Budget.js": "./src/models/Budget.js", "./BudgetEntry": "./src/models/BudgetEntry.js", "./BudgetEntry.js": "./src/models/BudgetEntry.js", "./Currency": "./src/models/Currency.js", "./Currency.js": "./src/models/Currency.js", "./Customer": "./src/models/Customer.js", "./Customer.js": "./src/models/Customer.js", "./DateSession": "./src/models/DateSession.js", "./DateSession.js": "./src/models/DateSession.js", "./ExchangeRate": "./src/models/ExchangeRate.js", "./ExchangeRate.js": "./src/models/ExchangeRate.js", "./Expense": "./src/models/Expense.js", "./Expense.js": "./src/models/Expense.js", "./ExpenseCategory": "./src/models/ExpenseCategory.js", "./ExpenseCategory.js": "./src/models/ExpenseCategory.js", "./Item": "./src/models/Item.js", "./Item.js": "./src/models/Item.js", "./ItemCategory": "./src/models/ItemCategory.js", "./ItemCategory.js": "./src/models/ItemCategory.js", "./ManualJournal": "./src/models/ManualJournal.js", "./ManualJournal.js": "./src/models/ManualJournal.js", "./Media": "./src/models/Media.js", "./Media.js": "./src/models/Media.js", "./MediaLink": "./src/models/MediaLink.js", "./MediaLink.js": "./src/models/MediaLink.js", "./Metable": "./src/models/Metable.js", "./Metable.js": "./src/models/Metable.js", "./Model": "./src/models/Model.js", "./Model.js": "./src/models/Model.js", "./Option": "./src/models/Option.js", "./Option.js": "./src/models/Option.js", "./Pagination": "./src/models/Pagination.js", "./Pagination.js": "./src/models/Pagination.js", "./Permission": "./src/models/Permission.js", "./Permission.js": "./src/models/Permission.js", "./Resource": "./src/models/Resource.js", "./Resource.js": "./src/models/Resource.js", "./ResourceField": "./src/models/ResourceField.js", "./ResourceField.js": "./src/models/ResourceField.js", "./ResourceFieldMetadata": "./src/models/ResourceFieldMetadata.js", "./ResourceFieldMetadata.js": "./src/models/ResourceFieldMetadata.js", "./Role": "./src/models/Role.js", "./Role.js": "./src/models/Role.js", "./Setting": "./src/models/Setting.js", "./Setting.js": "./src/models/Setting.js", "./TenantModel": "./src/models/TenantModel.js", "./TenantModel.js": "./src/models/TenantModel.js", "./TenantUser": "./src/models/TenantUser.js", "./TenantUser.js": "./src/models/TenantUser.js", "./Vendor": "./src/models/Vendor.js", "./Vendor.js": "./src/models/Vendor.js", "./View": "./src/models/View.js", "./View.js": "./src/models/View.js", "./ViewColumn": "./src/models/ViewColumn.js", "./ViewColumn.js": "./src/models/ViewColumn.js", "./ViewRole": "./src/models/ViewRole.js", "./ViewRole.js": "./src/models/ViewRole.js" }; function webpackContext(req) { var id = webpackContextResolve(req); return __webpack_require__(id); } function webpackContextResolve(req) { if(!__webpack_require__.o(map, req)) { var e = new Error("Cannot find module '" + req + "'"); e.code = 'MODULE_NOT_FOUND'; throw e; } return map[req]; } webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = "./src/models sync recursive ^\\.\\/.*$"; /***/ }), /***/ "./src/models/Account.js": /*!*******************************!*\ !*** ./src/models/Account.js ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Account; }); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get"); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); /* harmony import */ var _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/lib/Cachable/CachableQueryBuilder */ "./src/lib/Cachable/CachableQueryBuilder.js"); /* harmony import */ var _lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/lib/Cachable/CachableModel */ "./src/lib/Cachable/CachableModel.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js"); /* harmony import */ var _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/lib/DependencyGraph */ "./src/lib/DependencyGraph/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* eslint-disable global-require */ var Account = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default()(Account, _mixin);function Account() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, Account);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Account).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(Account, null, [{ key: "query", /** * Query return override. * @param {...any} args */value: function query() {var _get2,_this = this;for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];} return (_get2 = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Account), "query", this)).call.apply(_get2, [this].concat(args)).runAfter(function (result) { if (Array.isArray(result)) { return _this.isDepGraph ? Account.toDependencyGraph(result) : _this.collection.from(result); } return result; }); } /** * Convert the array result to dependency graph. */ }, { key: "depGraph", value: function depGraph() { this.isDepGraph = true; return this; } /** * Model modifiers. */ }, { key: "collectJournalEntries", value: function collectJournalEntries( accounts) { return Object(lodash__WEBPACK_IMPORTED_MODULE_8__["flatten"])(accounts.map(function (account) {return account.transactions.map(function (transaction) {return _objectSpread({ accountId: account.id }, transaction, { accountNormal: account.type.normal });});})); } /** * Converts flatten accounts list to nested array. * @param {Array} accounts * @param {Object} options */ }, { key: "toNestedArray", value: function toNestedArray( accounts) {var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { children: 'children' }; return Object(_utils__WEBPACK_IMPORTED_MODULE_13__["flatToNestedArray"])(accounts, { id: 'id', parentId: 'parentAccountId' }); } }, { key: "toDependencyGraph", value: function toDependencyGraph( accounts) { return _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_14__["default"].fromArray( accounts, { itemId: 'id', parentItemId: 'parentAccountId' }); } }, { key: "tableName", /** * Table name */get: function get() {return 'accounts';} /** * Timestamps columns. */ }, { key: "timestamps", get: function get() {return ['createdAt', 'updatedAt'];} /** * Extend query builder model. */ }, { key: "QueryBuilder", get: function get() {return _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_11__["default"];} }, { key: "jsonSchema", get: function get() {return { type: 'object', properties: { // id: {type: 'integer'}, // birthday: {type: ['datetime', 'null']}, created_at: { type: 'datetime' } // updated: {type: ['datetime', 'null']} } };} }, { key: "modifiers", get: function get() {var TABLE_NAME = Account.tableName;return { filterAccounts: function filterAccounts(query, accountIds) {if (accountIds.length > 0) {query.whereIn("".concat(TABLE_NAME, ".id"), accountIds);}}, filterAccountTypes: function filterAccountTypes(query, typesIds) {if (typesIds.length > 0) {query.whereIn('account_types.accoun_type_id', typesIds);}}, viewRolesBuilder: function viewRolesBuilder(query, conditionals, expression) {Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["buildFilterQuery"])(Account.tableName, conditionals, expression)(query);}, sortColumnBuilder: function sortColumnBuilder(query, columnKey, direction) {Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["buildSortColumnQuery"])(Account.tableName, columnKey, direction)(query);} };} /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() {var AccountType = __webpack_require__(/*! @/models/AccountType */ "./src/models/AccountType.js");var AccountBalance = __webpack_require__(/*! @/models/AccountBalance */ "./src/models/AccountBalance.js");var AccountTransaction = __webpack_require__(/*! @/models/AccountTransaction */ "./src/models/AccountTransaction.js");return { /** * Account model may belongs to account type. */type: { relation: objection__WEBPACK_IMPORTED_MODULE_7__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(AccountType["default"]), join: { from: 'accounts.accountTypeId', to: 'account_types.id' } }, /** * Account model may has many balances accounts. */balance: { relation: objection__WEBPACK_IMPORTED_MODULE_7__["Model"].HasOneRelation, modelClass: this.relationBindKnex(AccountBalance["default"]), join: { from: 'accounts.id', to: 'account_balances.accountId' } }, /** * Account model may has many transactions. */transactions: { relation: objection__WEBPACK_IMPORTED_MODULE_7__["Model"].HasManyRelation, modelClass: this.relationBindKnex(AccountTransaction["default"]), join: { from: 'accounts.id', to: 'accounts_transactions.accountId' } } };} }]);return Account;}(Object(objection__WEBPACK_IMPORTED_MODULE_7__["mixin"])(_models_TenantModel__WEBPACK_IMPORTED_MODULE_9__["default"], [_lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_12__["default"]])); /***/ }), /***/ "./src/models/AccountBalance.js": /*!**************************************!*\ !*** ./src/models/AccountBalance.js ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AccountBalance; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var AccountBalance = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(AccountBalance, _TenantModel);function AccountBalance() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, AccountBalance);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(AccountBalance).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(AccountBalance, null, [{ key: "tableName", /** * Table name */get: function get() { return 'account_balances'; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js"); return { account: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(Account["default"]), join: { from: 'account_balances.account_id', to: 'accounts.id' } } }; } }]);return AccountBalance;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/models/AccountTransaction.js": /*!******************************************!*\ !*** ./src/models/AccountTransaction.js ***! \******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AccountTransaction; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/Cachable/CachableQueryBuilder */ "./src/lib/Cachable/CachableQueryBuilder.js"); /* harmony import */ var _lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/lib/Cachable/CachableModel */ "./src/lib/Cachable/CachableModel.js"); var AccountTransaction = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(AccountTransaction, _mixin);function AccountTransaction() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, AccountTransaction);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(AccountTransaction).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(AccountTransaction, null, [{ key: "tableName", /** * Table name */get: function get() { return 'accounts_transactions'; } /** * Timestamps columns. */ }, { key: "timestamps", get: function get() { return ['createdAt']; } /** * Extend query builder model. */ }, { key: "QueryBuilder", get: function get() { return _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_8__["default"]; } /** * Model modifiers. */ }, { key: "modifiers", get: function get() { return { filterAccounts: function filterAccounts(query, accountsIds) { if (accountsIds.length > 0) { query.whereIn('account_id', accountsIds); } }, filterTransactionTypes: function filterTransactionTypes(query, types) { if (Array.isArray(types) && types.length > 0) { query.whereIn('reference_type', types); } else if (typeof types === 'string') { query.where('reference_type', types); } }, filterDateRange: function filterDateRange(query, startDate, endDate) {var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'day'; var dateFormat = 'YYYY-MM-DD HH:mm:ss'; var fromDate = moment__WEBPACK_IMPORTED_MODULE_6___default()(startDate).startOf(type).format(dateFormat); var toDate = moment__WEBPACK_IMPORTED_MODULE_6___default()(endDate).endOf(type).format(dateFormat); if (startDate) { query.where('date', '>=', fromDate); } if (endDate) { query.where('date', '<=', toDate); } }, filterAmountRange: function filterAmountRange(query, fromAmount, toAmount) { if (fromAmount) { query.andWhere(function (q) { q.where('credit', '>=', fromAmount); q.orWhere('debit', '>=', fromAmount); }); } if (toAmount) { query.andWhere(function (q) { q.where('credit', '<=', toAmount); q.orWhere('debit', '<=', toAmount); }); } }, sumationCreditDebit: function sumationCreditDebit(query) { query.sum('credit as credit'); query.sum('debit as debit'); query.groupBy('account_id'); }, filterContactType: function filterContactType(query, contactType) { query.where('contact_type', contactType); }, filterContactIds: function filterContactIds(query, contactIds) { query.whereIn('contact_id', contactIds); } }; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js"); return { account: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(Account["default"]), join: { from: 'accounts_transactions.accountId', to: 'accounts.id' } } }; } }]);return AccountTransaction;}(Object(objection__WEBPACK_IMPORTED_MODULE_5__["mixin"])(_models_TenantModel__WEBPACK_IMPORTED_MODULE_7__["default"], [_lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_9__["default"]])); /***/ }), /***/ "./src/models/AccountType.js": /*!***********************************!*\ !*** ./src/models/AccountType.js ***! \***********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AccountType; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/Cachable/CachableModel */ "./src/lib/Cachable/CachableModel.js"); // import path from 'path'; var AccountType = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(AccountType, _mixin);function AccountType() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, AccountType);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(AccountType).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(AccountType, null, [{ key: "tableName", /** * Table name */get: function get() { return 'account_types'; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js"); return { /** * Account type may has many associated accounts. */ accounts: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation, modelClass: this.relationBindKnex(Account["default"]), join: { from: 'account_types.id', to: 'accounts.accountTypeId' } } }; } }]);return AccountType;}(Object(objection__WEBPACK_IMPORTED_MODULE_5__["mixin"])(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"], [_lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_7__["default"]])); /***/ }), /***/ "./src/models/Auth.js": /*!****************************!*\ !*** ./src/models/Auth.js ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Auth; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); var Auth = /*#__PURE__*/function () {function Auth() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Auth);}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Auth, null, [{ key: "setAuthenticatedUser", /** * Sets the authenticated user. * @param {User} user */value: function setAuthenticatedUser( user) { this.user = user; } /** * Retrieve the authenticated user ID. */ }, { key: "userId", value: function userId() { if (!this.user) { return false; } return this.user.id; } /** * Whether the user is logged or not. */ }, { key: "isLogged", value: function isLogged() { return !!this.user; } }, { key: "loggedOut", value: function loggedOut() { this.user = null; } }, { key: "user", /** * Retrieve the authenticated user. */get: function get() {return null;} }]);return Auth;}(); /***/ }), /***/ "./src/models/Budget.js": /*!******************************!*\ !*** ./src/models/Budget.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Budget; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _models_Model__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/Model */ "./src/models/Model.js"); var Budget = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Budget, _TenantModel);function Budget() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Budget);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Budget).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Budget, [{ key: "rangeBy", get: function get() { switch (this.period) { case 'half-year': case 'quarter': return 'month'; default: return this.period;} } }, { key: "rangeIncrement", get: function get() { switch (this.period) { case 'half-year': return 6; case 'quarter': return 3; default: return 1;} } }, { key: "rangeOffset", get: function get() { switch (this.period) { case 'half-year':return 5; case 'quarter':return 2; default:return 0;} } }], [{ key: "tableName", /** * Table name */get: function get() {return 'budgets';} }, { key: "virtualAttributes", get: function get() {return ['rangeBy', 'rangeIncrement'];} /** * Model modifiers. */ }, { key: "modifiers", get: function get() {return { filterByYear: function filterByYear(query, year) {query.where('year', year);}, filterByIncomeStatement: function filterByIncomeStatement(query) {query.where('account_types', 'income_statement');}, filterByProfitLoss: function filterByProfitLoss(query) {query.where('accounts_types', 'profit_loss');} };} }]);return Budget;}(_models_Model__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/models/BudgetEntry.js": /*!***********************************!*\ !*** ./src/models/BudgetEntry.js ***! \***********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Budget; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var Budget = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Budget, _TenantModel);function Budget() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Budget);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Budget).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Budget, null, [{ key: "tableName", /** * Table name */get: function get() { return 'budget_entries'; } }]);return Budget;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/models/Currency.js": /*!********************************!*\ !*** ./src/models/Currency.js ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Currency; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var Currency = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Currency, _TenantModel);function Currency() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Currency);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Currency).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Currency, null, [{ key: "tableName", /** * Table name */get: function get() { return 'currencies'; } /** * Timestamps columns. */ }, { key: "timestamps", get: function get() { return ['createdAt', 'updatedAt']; } }]);return Currency;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/models/Customer.js": /*!********************************!*\ !*** ./src/models/Customer.js ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Customer; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var Customer = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Customer, _TenantModel);function Customer() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Customer);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Customer).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Customer, null, [{ key: "tableName", /** * Table name */get: function get() { return 'customers'; } /** * Model timestamps. */ }, { key: "timestamps", get: function get() { return ['createdAt', 'updatedAt']; } /** * Model modifiers. */ }, { key: "modifiers", get: function get() { return { filterCustomerIds: function filterCustomerIds(query, customerIds) { query.whereIn('id', customerIds); } }; } }]);return Customer;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/models/DateSession.js": /*!***********************************!*\ !*** ./src/models/DateSession.js ***! \***********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get"); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__); /* harmony default export */ __webpack_exports__["default"] = (function (Model) { return (/*#__PURE__*/function (_Model) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(DateSession, _Model);function DateSession() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DateSession);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DateSession).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DateSession, [{ key: "$beforeUpdate", value: function $beforeUpdate( opt, context) {var _this = this; var maybePromise = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DateSession.prototype), "$beforeUpdate", this).call(this, opt, context); return Promise.resolve(maybePromise).then(function () { if (DateSession.timestamps[1]) { _this[DateSession.timestamps[1]] = moment__WEBPACK_IMPORTED_MODULE_6___default()().format('YYYY/MM/DD HH:mm:ss'); } }); } }, { key: "$beforeInsert", value: function $beforeInsert( context) {var _this2 = this; var maybePromise = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DateSession.prototype), "$beforeInsert", this).call(this, context); return Promise.resolve(maybePromise).then(function () { if (DateSession.timestamps[0]) { _this2[DateSession.timestamps[0]] = moment__WEBPACK_IMPORTED_MODULE_6___default()().format('YYYY/MM/DD HH:mm:ss'); } }); } }], [{ key: "timestamps", get: function get() {return ['createdAt', 'updatedAt'];} }]);return DateSession;}(Model)); }); /***/ }), /***/ "./src/models/ExchangeRate.js": /*!************************************!*\ !*** ./src/models/ExchangeRate.js ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ExchangeRate; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! bcryptjs */ "bcryptjs"); /* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(bcryptjs__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var ExchangeRate = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ExchangeRate, _TenantModel);function ExchangeRate() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ExchangeRate);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ExchangeRate).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ExchangeRate, null, [{ key: "tableName", /** * Table name. */get: function get() { return 'exchange_rates'; } /** * Timestamps columns. */ }, { key: "timestamps", get: function get() { return ['createdAt', 'updatedAt']; } }]);return ExchangeRate;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_7__["default"]); /***/ }), /***/ "./src/models/Expense.js": /*!*******************************!*\ !*** ./src/models/Expense.js ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Expense; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); var Expense = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Expense, _TenantModel);function Expense() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Expense);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Expense).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Expense, null, [{ key: "tableName", /** * Table name */get: function get() { return 'expenses_transactions'; } /** * Account transaction reference type. */ }, { key: "referenceType", get: function get() { return 'Expense'; } /** * Model timestamps. */ }, { key: "timestamps", get: function get() { return ['createdAt', 'updatedAt']; } /** * Model modifiers. */ }, { key: "modifiers", get: function get() { return { filterByDateRange: function filterByDateRange(query, startDate, endDate) { if (startDate) { query.where('date', '>=', startDate); } if (endDate) { query.where('date', '<=', endDate); } }, filterByAmountRange: function filterByAmountRange(query, from, to) { if (from) { query.where('amount', '>=', from); } if (to) { query.where('amount', '<=', to); } }, filterByExpenseAccount: function filterByExpenseAccount(query, accountId) { if (accountId) { query.where('expense_account_id', accountId); } }, filterByPaymentAccount: function filterByPaymentAccount(query, accountId) { if (accountId) { query.where('payment_account_id', accountId); } }, viewRolesBuilder: function viewRolesBuilder(query, conditionals, expression) { Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["viewRolesBuilder"])(conditionals, expression)(query); }, orderBy: function orderBy(query) { } }; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js"); var User = __webpack_require__(/*! @/models/TenantUser */ "./src/models/TenantUser.js"); var ExpenseCategory = __webpack_require__(/*! @/models/ExpenseCategory */ "./src/models/ExpenseCategory.js"); return { paymentAccount: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(Account["default"]), join: { from: 'expenses_transactions.paymentAccountId', to: 'accounts.id' } }, categories: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation, modelClass: this.relationBindKnex(ExpenseCategory["default"]), join: { from: 'expenses_transactions.id', to: 'expense_transaction_categories.expenseId' } }, user: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(User["default"]), join: { from: 'expenses_transactions.userId', to: 'users.id' } } }; } }]);return Expense;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/models/ExpenseCategory.js": /*!***************************************!*\ !*** ./src/models/ExpenseCategory.js ***! \***************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ExpenseCategory; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var ExpenseCategory = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ExpenseCategory, _TenantModel);function ExpenseCategory() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ExpenseCategory);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ExpenseCategory).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ExpenseCategory, null, [{ key: "tableName", /** * Table name */get: function get() { return 'expense_transaction_categories'; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js"); return { expenseAccount: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(Account["default"]), join: { from: 'expense_transaction_categories.expenseAccountId', to: 'accounts.id' } } }; } }]);return ExpenseCategory;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/models/Item.js": /*!****************************!*\ !*** ./src/models/Item.js ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Item; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js"); var Item = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Item, _TenantModel);function Item() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Item);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Item).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Item, null, [{ key: "tableName", /** * Table name */get: function get() { return 'items'; } /** * Model timestamps. */ }, { key: "timestamps", get: function get() { return ['createdAt', 'updatedAt']; } /** * Model modifiers. */ }, { key: "modifiers", get: function get() { var TABLE_NAME = Item.tableName; return { sortBy: function sortBy(query, columnSort, sortDirection) { query.orderBy(columnSort, sortDirection); }, viewRolesBuilder: function viewRolesBuilder(query, conditions, logicExpression) { Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["buildFilterQuery"])(Item.tableName, conditions, logicExpression)(query); } }; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var Media = __webpack_require__(/*! @/models/Media */ "./src/models/Media.js"); var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js"); var ItemCategory = __webpack_require__(/*! @/models/ItemCategory */ "./src/models/ItemCategory.js"); return { /** * Item may belongs to cateogory model. */ category: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(ItemCategory["default"]), join: { from: 'items.categoryId', to: 'items_categories.id' } }, costAccount: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(Account["default"]), join: { from: 'items.costAccountId', to: 'accounts.id' } }, sellAccount: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(Account["default"]), join: { from: 'items.sellAccountId', to: 'accounts.id' } }, inventoryAccount: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(Account["default"]), join: { from: 'items.inventoryAccountId', to: 'accounts.id' } }, media: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation, modelClass: this.relationBindKnex(Media["default"]), join: { from: 'items.id', through: { from: 'media_links.model_id', to: 'media_links.media_id' }, to: 'media.id' } } }; } }]);return Item;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/models/ItemCategory.js": /*!************************************!*\ !*** ./src/models/ItemCategory.js ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ItemCategory; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! path */ "path"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var ItemCategory = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ItemCategory, _TenantModel);function ItemCategory() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ItemCategory);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ItemCategory).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ItemCategory, null, [{ key: "tableName", /** * Table name. */get: function get() { return 'items_categories'; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var Item = __webpack_require__(/*! @/models/Item */ "./src/models/Item.js"); return { /** * Item category may has many items. */ items: { relation: objection__WEBPACK_IMPORTED_MODULE_6__["Model"].HasManyRelation, modelClass: this.relationBindKnex(Item["default"]), join: { from: 'items_categories.id', to: 'items.categoryId' } } }; } }]);return ItemCategory;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_7__["default"]); /***/ }), /***/ "./src/models/ManualJournal.js": /*!*************************************!*\ !*** ./src/models/ManualJournal.js ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ManualJournal; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var ManualJournal = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ManualJournal, _TenantModel);function ManualJournal() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ManualJournal);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ManualJournal).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ManualJournal, null, [{ key: "tableName", /** * Table name. */get: function get() { return 'manual_journals'; } /** * Model timestamps. */ }, { key: "timestamps", get: function get() { return ['createdAt', 'updatedAt']; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var Media = __webpack_require__(/*! @/models/Media */ "./src/models/Media.js"); return { media: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation, modelClass: this.relationBindKnex(Media["default"]), join: { from: 'manual_journals.id', through: { from: 'media_links.model_id', to: 'media_links.media_id' }, to: 'media.id' } } }; } }]);return ManualJournal;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/models/Media.js": /*!*****************************!*\ !*** ./src/models/Media.js ***! \*****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Media; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var Media = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Media, _TenantModel);function Media() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Media);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Media).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Media, null, [{ key: "tableName", /** * Table name */get: function get() { return 'media'; } }]);return Media;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/models/MediaLink.js": /*!*********************************!*\ !*** ./src/models/MediaLink.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MediaLink; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var MediaLink = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(MediaLink, _TenantModel);function MediaLink() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, MediaLink);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(MediaLink).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(MediaLink, null, [{ key: "tableName", /** * Table name */get: function get() { return 'media_links'; } }]);return MediaLink;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/models/Metable.js": /*!*******************************!*\ !*** ./src/models/Metable.js ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _database_knex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/database/knex */ "./src/database/knex.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} // import cache from 'memory-cache'; // Metadata /* harmony default export */ __webpack_exports__["default"] = ({ METADATA_GROUP: 'default', KEY_COLUMN: 'key', VALUE_COLUMN: 'value', TYPE_COLUMN: 'type', extraColumns: [], metadata: [], shouldReload: true, extraMetadataQuery: function extraMetadataQuery() {}, /** * Set the value column key to query from. * @param {String} name - */ setKeyColumnName: function setKeyColumnName(name) { this.KEY_COLUMN = name; }, /** * Set the key column name to query from. * @param {String} name - */ setValueColumnName: function setValueColumnName(name) { this.VALUE_COLUMN = name; }, /** * Set extra columns to be added to the rows. * @param {Array} columns - */ setExtraColumns: function setExtraColumns(columns) { this.extraColumns = columns; }, /** * Metadata database query. * @param {Object} query - * @param {String} groupName - */ whereQuery: function whereQuery(query, key) { var groupName = this.METADATA_GROUP; if (groupName) { query.where('group', groupName); } if (key) { if (Array.isArray(key)) { query.whereIn('key', key); } else { query.where('key', key); } } }, /** * Loads the metadata from the storage. * @param {String|Array} key - * @param {Boolean} force - */ load: function () {var _load = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee() {var _this = this;var force,metadataCollection,metadataArray,_args = arguments;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:force = _args.length > 0 && _args[0] !== undefined ? _args[0] : false;if (!( this.shouldReload || force)) {_context.next = 9;break;}_context.next = 4;return ( this.query(function (query) { _this.whereQuery(query); _this.extraMetadataQuery(query); }).fetchAll());case 4:metadataCollection = _context.sent; this.shouldReload = false; this.metadata = []; metadataArray = this.mapMetadataCollection(metadataCollection); metadataArray.forEach(function (metadata) {_this.metadata.push(metadata);});case 9:case "end":return _context.stop();}}}, _callee, this);}));function load() {return _load.apply(this, arguments);}return load;}(), /** * Fetches all the metadata that associate with the current group. */ allMeta: function () {var _allMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2() {var force,_args2 = arguments;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:force = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : false;_context2.next = 3;return ( this.load(force));case 3:return _context2.abrupt("return", this.metadata);case 4:case "end":return _context2.stop();}}}, _callee2, this);}));function allMeta() {return _allMeta.apply(this, arguments);}return allMeta;}(), /** * Find the given metadata key. * @param {String} key - * @return {object} - Metadata object. */ findMeta: function findMeta(key) { return this.metadata.find(function (meta) {return meta.key === key;}); }, /** * Fetch the metadata of the current group. * @param {*} key - */ getMeta: function () {var _getMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3(key, defaultValue) {var force,metadata,_args3 = arguments;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:force = _args3.length > 2 && _args3[2] !== undefined ? _args3[2] : false;_context3.next = 3;return ( this.load(force));case 3: metadata = this.findMeta(key);return _context3.abrupt("return", metadata ? metadata.value : defaultValue || false);case 5:case "end":return _context3.stop();}}}, _callee3, this);}));function getMeta(_x, _x2) {return _getMeta.apply(this, arguments);}return getMeta;}(), /** * Markes the metadata to should be deleted. * @param {String} key - */ removeMeta: function () {var _removeMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee4(key) {var metadata;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:_context4.next = 2;return ( this.load());case 2: metadata = this.findMeta(key); if (metadata) { metadata.markAsDeleted = true; } this.shouldReload = true;case 5:case "end":return _context4.stop();}}}, _callee4, this);}));function removeMeta(_x3) {return _removeMeta.apply(this, arguments);}return removeMeta;}(), /** * Remove all meta data of the given group. * @param {*} group */ removeAllMeta: function removeAllMeta() {var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'default'; this.metdata.map(function (meta) {return _objectSpread({}, meta.group !== group ? { markAsDeleted: true } : {}, {}, meta);}); this.shouldReload = true; }, /** * Set the meta data to the stack. * @param {String} key - * @param {String} value - */ setMeta: function () {var _setMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee5(key, value, payload) {var _this2 = this;var _metadata, metadata;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:if (! Array.isArray(key)) {_context5.next = 4;break;} _metadata = key; _metadata.forEach(function (meta) { _this2.setMeta(meta.key, meta.value); });return _context5.abrupt("return");case 4:_context5.next = 6;return ( this.load());case 6: metadata = this.findMeta(key); if (metadata) { metadata.value = value; metadata.markAsUpdated = true; } else { this.metadata.push(_objectSpread({ value: value, key: key }, payload, { markAsInserted: true })); }case 8:case "end":return _context5.stop();}}}, _callee5, this);}));function setMeta(_x4, _x5, _x6) {return _setMeta.apply(this, arguments);}return setMeta;}(), /** * Saved the modified metadata. */ saveMeta: function () {var _saveMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee6() {var _this3 = this;var inserted, updated, deleted, metadataDeletedKeys, metadataInserted, metadataUpdated, batchUpdate;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0: inserted = this.metadata.filter(function (m) {return m.markAsInserted === true;}); updated = this.metadata.filter(function (m) {return m.markAsUpdated === true;}); deleted = this.metadata.filter(function (m) {return m.markAsDeleted === true;}); metadataDeletedKeys = deleted.map(function (m) {return m.key;}); metadataInserted = inserted.map(function (m) {return _this3.mapMetadata(m, 'format');}); metadataUpdated = updated.map(function (m) {return _this3.mapMetadata(m, 'format');}); batchUpdate = function batchUpdate(collection) {return _database_knex__WEBPACK_IMPORTED_MODULE_3__["default"].transaction(function (trx) { var queries = collection.map(function (tuple) { var query = Object(_database_knex__WEBPACK_IMPORTED_MODULE_3__["default"])(_this3.tableName); _this3.whereQuery(query, tuple.key); _this3.extraMetadataQuery(query); return query.update(tuple).transacting(trx); }); return Promise.all(queries).then(trx.commit)["catch"](trx.rollback); });};_context6.next = 9;return ( Promise.all([ _database_knex__WEBPACK_IMPORTED_MODULE_3__["default"].insert(metadataInserted).into(this.tableName), batchUpdate(metadataUpdated), metadataDeletedKeys.length > 0 ? this.query('whereIn', this.KEY_COLUMN, metadataDeletedKeys).destroy({ require: true }) : null]));case 9: this.shouldReload = true;case 10:case "end":return _context6.stop();}}}, _callee6, this);}));function saveMeta() {return _saveMeta.apply(this, arguments);}return saveMeta;}(), /** * Purge all the cached metadata in the memory. */ purgeMetadata: function purgeMetadata() { this.metadata = []; this.shouldReload = true; }, /** * Parses the metadata value. * @param {String} value - * @param {String} valueType - */ parseMetaValue: function parseMetaValue(value, valueType) { var parsedValue; switch (valueType) { case 'integer': parsedValue = parseInt(value, 10); break; case 'float': parsedValue = parseFloat(value); break; case 'boolean': parsedValue = Boolean(value); break; case 'json': parsedValue = JSON.parse(parsedValue); break; default: parsedValue = value; break;} return parsedValue; }, /** * Format the metadata before saving to the database. * @param {String|Number|Boolean} value - * @param {String} valueType - * @return {String|Number|Boolean} - */ formatMetaValue: function formatMetaValue(value, valueType) { var parsedValue; switch (valueType) { case 'number': parsedValue = "".concat(value); break; case 'boolean': parsedValue = value ? '1' : '0'; break; case 'json': parsedValue = JSON.stringify(parsedValue); break; default: parsedValue = value; break;} return parsedValue; }, mapMetadata: function mapMetadata(attr) {var parseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'parse'; return _objectSpread({ key: attr[this.KEY_COLUMN], value: parseType === 'parse' ? this.parseMetaValue( attr[this.VALUE_COLUMN], this.TYPE_COLUMN ? attr[this.TYPE_COLUMN] : false) : this.formatMetaValue( attr[this.VALUE_COLUMN], this.TYPE_COLUMN ? attr[this.TYPE_COLUMN] : false) }, this.extraColumns.map(function (extraCol) {return _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()({}, extraCol, attr[extraCol] || null);})); }, /** * Parse the metadata collection. * @param {Array} collection - */ mapMetadataCollection: function mapMetadataCollection(collection) {var _this4 = this;var parseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'parse'; return collection.map(function (model) {return _this4.mapMetadata(model.attributes, parseType);}); } }); /***/ }), /***/ "./src/models/Model.js": /*!*****************************!*\ !*** ./src/models/Model.js ***! \*****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ModelBase; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get"); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js"); /* harmony import */ var _models_Pagination__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/models/Pagination */ "./src/models/Pagination.js"); /* harmony import */ var _models_DateSession__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/models/DateSession */ "./src/models/DateSession.js"); var ModelBase = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(ModelBase, _mixin);function ModelBase() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ModelBase);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ModelBase).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ModelBase, [{ key: "$formatJson", value: function $formatJson( json, opt) { var transformed = Object(_utils__WEBPACK_IMPORTED_MODULE_8__["mapKeysDeep"])(json, function (value, key) { return Object(lodash__WEBPACK_IMPORTED_MODULE_7__["snakeCase"])(key); }); var parsedJson = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ModelBase.prototype), "$formatJson", this).call(this, transformed, opt); return parsedJson; } }], [{ key: "query", value: function query() {var _get2,_this = this;for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];}return (_get2 = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ModelBase), "query", this)).call.apply(_get2, [this].concat(args)).runAfter(function (result) {if (Array.isArray(result)) {return _this.collection.from(result);}return result;});} }, { key: "relationBindKnex", value: function relationBindKnex( model) { return this.knexBinded ? model.bindKnex(this.knexBinded) : model; } }, { key: "timestamps", get: function get() {return [];} }, { key: "knexBinded", get: function get() {return this.knexBindInstance;}, set: function set(knex) {this.knexBindInstance = knex;} }, { key: "collection", get: function get() {return Array;} }, { key: "QueryBuilder", get: function get() {return _models_Pagination__WEBPACK_IMPORTED_MODULE_9__["default"];} }]);return ModelBase;}(Object(objection__WEBPACK_IMPORTED_MODULE_6__["mixin"])(objection__WEBPACK_IMPORTED_MODULE_6__["Model"], [_models_DateSession__WEBPACK_IMPORTED_MODULE_10__["default"]])); /***/ }), /***/ "./src/models/Option.js": /*!******************************!*\ !*** ./src/models/Option.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Option; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get"); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _lib_Metable_MetableCollection__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/Metable/MetableCollection */ "./src/lib/Metable/MetableCollection.js"); /* harmony import */ var _data_options__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/data/options */ "./src/data/options.js"); var Option = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(Option, _TenantModel);function Option() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Option);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Option).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Option, null, [{ key: "query", /** * Override the model query. * @param {...any} args - */value: function query() {var _get2,_this = this;for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];} return (_get2 = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Option), "query", this)).call.apply(_get2, [this].concat(args)).runAfter(function (result) { if (result instanceof _lib_Metable_MetableCollection__WEBPACK_IMPORTED_MODULE_7__["default"]) { result.setModel(_this.tenant()); result.setExtraColumns(['group']); } return result; }); } /** * Model collection. */ }, { key: "validateDefined", /** * Validates the given options is defined or either not. * @param {Array} options * @return {Boolean} */value: function validateDefined( options) { var notDefined = []; options.forEach(function (option) { if (!_data_options__WEBPACK_IMPORTED_MODULE_8__["default"][option.group]) { notDefined.push(option); } else if (!_data_options__WEBPACK_IMPORTED_MODULE_8__["default"][option.group].some(function (o) {return o.key === option.key;})) { notDefined.push(option); } }); return notDefined; } }, { key: "tableName", /** * Table name. */get: function get() {return 'options';} }, { key: "collection", get: function get() {return _lib_Metable_MetableCollection__WEBPACK_IMPORTED_MODULE_7__["default"];} }]);return Option;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/models/Pagination.js": /*!**********************************!*\ !*** ./src/models/Pagination.js ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PaginationQueryBuilder; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get"); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__); var PaginationQueryBuilder = /*#__PURE__*/function (_Model$QueryBuilder) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(PaginationQueryBuilder, _Model$QueryBuilder);function PaginationQueryBuilder() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, PaginationQueryBuilder);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PaginationQueryBuilder).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(PaginationQueryBuilder, [{ key: "pagination", value: function pagination( page, pageSize) { return _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PaginationQueryBuilder.prototype), "page", this).call(this, page, pageSize).runAfter( function (_ref) {var results = _ref.results,total = _ref.total; return { results: results, pagination: { total: total, page: page + 1, pageSize: pageSize } }; }); } }]);return PaginationQueryBuilder;}(objection__WEBPACK_IMPORTED_MODULE_6__["Model"].QueryBuilder); /***/ }), /***/ "./src/models/Permission.js": /*!**********************************!*\ !*** ./src/models/Permission.js ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Permission; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! path */ "path"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var Permission = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Permission, _TenantModel);function Permission() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Permission);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Permission).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Permission, null, [{ key: "tableName", /** * Table name of Role model. * @type {String} */get: function get() { return 'permissions'; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var Role = __webpack_require__(/*! @/models/Role */ "./src/models/Role.js"); return { /** * Permission model may belongs to role model. */ // role: { // relation: Model.BelongsToOneRelation, // modelBase: path.join(__dirname, 'Role').bindKnex(this.knexBinded), // join: { // from: 'permissions.role_id', // to: 'roles.id', // }, // }, // resource: { // relation: Model.BelongsToOneRelation, // modelBase: path.join(__dirname, 'Resource'), // join: { // from: 'permissions.', // to: '', // } // } }; } }]);return Permission;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_7__["default"]); /***/ }), /***/ "./src/models/Resource.js": /*!********************************!*\ !*** ./src/models/Resource.js ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Resource; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/Cachable/CachableQueryBuilder */ "./src/lib/Cachable/CachableQueryBuilder.js"); /* harmony import */ var _lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/Cachable/CachableModel */ "./src/lib/Cachable/CachableModel.js"); var Resource = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Resource, _mixin);function Resource() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Resource);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Resource).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Resource, null, [{ key: "tableName", /** * Table name. */get: function get() { return 'resources'; } /** * Extend query builder model. */ }, { key: "QueryBuilder", get: function get() { return _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_7__["default"]; } /** * Timestamp columns. */ }, { key: "hasTimestamps", get: function get() { return false; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var View = __webpack_require__(/*! @/models/View */ "./src/models/View.js"); var ResourceField = __webpack_require__(/*! @/models/ResourceField */ "./src/models/ResourceField.js"); var Permission = __webpack_require__(/*! @/models/Permission */ "./src/models/Permission.js"); return { /** * Resource model may has many views. */ views: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation, modelClass: this.relationBindKnex(View["default"]), join: { from: 'resources.id', to: 'views.resourceId' } }, /** * Resource model may has many fields. */ fields: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation, modelClass: this.relationBindKnex(ResourceField["default"]), join: { from: 'resources.id', to: 'resource_fields.resourceId' } }, /** * Resource model may has many associated permissions. */ permissions: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation, modelClass: this.relationBindKnex(Permission["default"]), join: { from: 'resources.id', through: { from: 'role_has_permissions.resourceId', to: 'role_has_permissions.permissionId' }, to: 'permissions.id' } } }; } }]);return Resource;}(Object(objection__WEBPACK_IMPORTED_MODULE_5__["mixin"])(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"], [_lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_8__["default"]])); /***/ }), /***/ "./src/models/ResourceField.js": /*!*************************************!*\ !*** ./src/models/ResourceField.js ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ResourceField; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! path */ "path"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var ResourceField = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ResourceField, _TenantModel);function ResourceField() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ResourceField);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ResourceField).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ResourceField, [{ key: "key", /** * Resource field key. */value: function key() { return Object(lodash__WEBPACK_IMPORTED_MODULE_5__["snakeCase"])(this.labelName); } /** * Relationship mapping. */ }], [{ key: "tableName", /** * Table name. */get: function get() {return 'resource_fields';} }, { key: "jsonAttributes", get: function get() {return ['options'];} /** * Model modifiers. */ }, { key: "modifiers", get: function get() {return { whereNotPredefined: function whereNotPredefined(query) {query.whereNot('predefined', true);} };} /** * Timestamp columns. */ }, { key: "hasTimestamps", get: function get() {return false;} /** * Virtual attributes. */ }, { key: "virtualAttributes", get: function get() {return ['key'];} }, { key: "relationMappings", get: function get() {var Resource = __webpack_require__(/*! @/models/Resource */ "./src/models/Resource.js");return { /** * Resource field may belongs to resource model. */resource: { relation: objection__WEBPACK_IMPORTED_MODULE_6__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(Resource["default"]), join: { from: 'resource_fields.resourceId', to: 'resources.id' } } }; } }]);return ResourceField;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_8__["default"]); /***/ }), /***/ "./src/models/ResourceFieldMetadata.js": /*!*********************************************!*\ !*** ./src/models/ResourceFieldMetadata.js ***! \*********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ResourceFieldMetadata; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _collection_ResourceFieldMetadataCollection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/collection/ResourceFieldMetadataCollection */ "./src/collection/ResourceFieldMetadataCollection.js"); var ResourceFieldMetadata = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ResourceFieldMetadata, _TenantModel);function ResourceFieldMetadata() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ResourceFieldMetadata);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ResourceFieldMetadata).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ResourceFieldMetadata, null, [{ key: "tableName", /** * Table name. */get: function get() { return 'resource_custom_fields_metadata'; } /** * Override the resource field metadata collection. */ }, { key: "collection", get: function get() { return _collection_ResourceFieldMetadataCollection__WEBPACK_IMPORTED_MODULE_6__["default"]; } }]);return ResourceFieldMetadata;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/models/Role.js": /*!****************************!*\ !*** ./src/models/Role.js ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Role; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var Role = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Role, _TenantModel);function Role() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Role);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Role).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Role, null, [{ key: "tableName", /** * Table name of Role model. * @type {String} */get: function get() { return 'roles'; } /** * Timestamp columns. */ }, { key: "hasTimestamps", get: function get() { return false; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var Permission = __webpack_require__(/*! @/models/Permission */ "./src/models/Permission.js"); var Resource = __webpack_require__(/*! @/models/Resource */ "./src/models/Resource.js"); var User = __webpack_require__(/*! @/models/TenantUser */ "./src/models/TenantUser.js"); var ResourceField = __webpack_require__(/*! @/models/ResourceField */ "./src/models/ResourceField.js"); return { /** * Role may has many permissions. */ permissions: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation, modelClass: Permission["default"].bindKnex(this.knexBinded), join: { from: 'roles.id', through: { from: 'role_has_permissions.roleId', to: 'role_has_permissions.permissionId' }, to: 'permissions.id' } }, /** * Role may has many resources. */ resources: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation, modelClass: Resource["default"].bindKnex(this.knexBinded), join: { from: 'roles.id', through: { from: 'role_has_permissions.roleId', to: 'role_has_permissions.resourceId' }, to: 'resources.id' } }, /** * Role may has resource field. */ field: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: ResourceField["default"].bindKnex(this.knexBinded), join: { from: 'roles.fieldId', to: 'resource_fields.id' } }, /** * Role may has many associated users. */ users: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation, modelClass: User["default"].bindKnex(this.knexBinded), join: { from: 'roles.id', through: { from: 'user_has_roles.roleId', to: 'user_has_roles.userId' }, to: 'users.id' } } }; } }]);return Role;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/models/Setting.js": /*!*******************************!*\ !*** ./src/models/Setting.js ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Setting; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _Auth__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Auth */ "./src/models/Auth.js"); var Setting = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Setting, _TenantModel);function Setting() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Setting);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Setting).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Setting, null, [{ key: "extraMetadataQuery", /** * Extra metadata query to query with the current authenticate user. * @param {Object} query */value: function extraMetadataQuery( query) { if (_Auth__WEBPACK_IMPORTED_MODULE_6__["default"].isLogged()) { query.where('user_id', _Auth__WEBPACK_IMPORTED_MODULE_6__["default"].userId()); } } }, { key: "tableName", /** * Table name */get: function get() {return 'settings';} /** * Timestamp columns. */ }, { key: "hasTimestamps", get: function get() {return false;} }]);return Setting;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/models/TenantModel.js": /*!***********************************!*\ !*** ./src/models/TenantModel.js ***! \***********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TenantModel; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get"); /* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_Model__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/Model */ "./src/models/Model.js"); var TenantModel = /*#__PURE__*/function (_BaseModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(TenantModel, _BaseModel);function TenantModel() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, TenantModel);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(TenantModel).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(TenantModel, null, [{ key: "tenant", value: function tenant() { if (!this.knexBinded) { throw new Error('Tenant knex is not binded yet.'); } return _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(TenantModel), "bindKnex", this).call(this, this.knexBinded); } /** * Allow to embed models to express request. */ }, { key: "requestModel", value: function requestModel() { return true; } }]);return TenantModel;}(_models_Model__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/models/TenantUser.js": /*!**********************************!*\ !*** ./src/models/TenantUser.js ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TenantUser; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! bcryptjs */ "bcryptjs"); /* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(bcryptjs__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); // import PermissionsService from '@/services/PermissionsService'; var TenantUser = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(TenantUser, _TenantModel);function TenantUser() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, TenantUser);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(TenantUser).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(TenantUser, [{ key: "verifyPassword", /** * Verify the password of the user. * @param {String} password - The given password. * @return {Boolean} */value: function verifyPassword( password) { return bcryptjs__WEBPACK_IMPORTED_MODULE_5___default.a.compareSync(password, this.password); } }, { key: "fullName", value: function fullName() { return "".concat(this.firstName, " ").concat(this.lastName || ''); } }], [{ key: "virtualAttributes", /** * Virtual attributes. */get: function get() {return ['fullName'];} /** * Table name */ }, { key: "tableName", get: function get() {return 'users';} /** * Timestamps columns. */ }, { key: "timestamps", get: function get() {return ['createdAt', 'updatedAt'];} /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() {var Role = __webpack_require__(/*! @/models/Role */ "./src/models/Role.js");return { roles: { relation: objection__WEBPACK_IMPORTED_MODULE_6__["Model"].ManyToManyRelation, modelClass: this.relationBindKnex(Role["default"]), join: { from: 'users.id', through: { from: 'user_has_roles.userId', to: 'user_has_roles.roleId' }, to: 'roles.id' } } };} }]);return TenantUser;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_7__["default"]); /***/ }), /***/ "./src/models/Vendor.js": /*!******************************!*\ !*** ./src/models/Vendor.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Vendor; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var Vendor = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Vendor, _TenantModel);function Vendor() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Vendor);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Vendor).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Vendor, null, [{ key: "tableName", /** * Table name */get: function get() { return 'vendors'; } /** * Model timestamps. */ }, { key: "timestamps", get: function get() { return ['createdAt', 'updatedAt']; } }]);return Vendor;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/models/View.js": /*!****************************!*\ !*** ./src/models/View.js ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return View; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/Cachable/CachableQueryBuilder */ "./src/lib/Cachable/CachableQueryBuilder.js"); /* harmony import */ var _lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/Cachable/CachableModel */ "./src/lib/Cachable/CachableModel.js"); var View = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(View, _mixin);function View() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, View);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(View).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(View, null, [{ key: "tableName", /** * Table name. */get: function get() { return 'views'; } /** * Model timestamps. */ }, { key: "timestamps", get: function get() { return ['createdAt', 'updatedAt']; } /** * Extend query builder model. */ }, { key: "QueryBuilder", get: function get() { return _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_7__["default"]; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var Resource = __webpack_require__(/*! @/models/Resource */ "./src/models/Resource.js"); var ViewColumn = __webpack_require__(/*! @/models/ViewColumn */ "./src/models/ViewColumn.js"); var ViewRole = __webpack_require__(/*! @/models/ViewRole */ "./src/models/ViewRole.js"); return { /** * View model belongs to resource model. */ resource: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(Resource["default"]), join: { from: 'views.resourceId', to: 'resources.id' } }, /** * View model may has many columns. */ columns: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation, modelClass: this.relationBindKnex(ViewColumn["default"]), join: { from: 'views.id', to: 'view_has_columns.viewId' } }, /** * View model may has many view roles. */ roles: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation, modelClass: this.relationBindKnex(ViewRole["default"]), join: { from: 'views.id', to: 'view_roles.viewId' } } }; } }]);return View;}(Object(objection__WEBPACK_IMPORTED_MODULE_5__["mixin"])(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"], [_lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_8__["default"]])); /***/ }), /***/ "./src/models/ViewColumn.js": /*!**********************************!*\ !*** ./src/models/ViewColumn.js ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ViewColumn; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var ViewColumn = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ViewColumn, _TenantModel);function ViewColumn() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ViewColumn);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ViewColumn).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ViewColumn, null, [{ key: "tableName", /** * Table name. */get: function get() { return 'view_has_columns'; } /** * Timestamp columns. */ }, { key: "hasTimestamps", get: function get() { return false; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var ResourceField = __webpack_require__(/*! @/models/ResourceField */ "./src/models/ResourceField.js"); return { /** * View role model may belongs to resource field model. */ field: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(ResourceField["default"]), join: { from: 'view_has_columns.fieldId', to: 'resource_fields.id' } } }; } }]);return ViewColumn;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/models/ViewRole.js": /*!********************************!*\ !*** ./src/models/ViewRole.js ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ViewRole; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); var ViewRole = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ViewRole, _TenantModel);function ViewRole() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ViewRole);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ViewRole).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ViewRole, null, [{ key: "virtualAttributes", /** * Virtual attributes. */get: function get() { return ['comparators']; } }, { key: "comparators", get: function get() { return [ 'equals', 'not_equal', 'contains', 'not_contain']; } /** * Table name. */ }, { key: "tableName", get: function get() { return 'view_roles'; } /** * Timestamp columns. */ }, { key: "hasTimestamps", get: function get() { return false; } /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() { var ResourceField = __webpack_require__(/*! @/models/ResourceField */ "./src/models/ResourceField.js"); var View = __webpack_require__(/*! @/models/View */ "./src/models/View.js"); return { /** * View role model may belongs to view model. */ view: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(View["default"]), join: { from: 'view_roles.viewId', to: 'views.id' } }, /** * View role model may belongs to resource field model. */ field: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(ResourceField["default"]), join: { from: 'view_roles.fieldId', to: 'resource_fields.id' } } }; } }]);return ViewRole;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]); /***/ }), /***/ "./src/server.js": /*!***********************!*\ !*** ./src/server.js ***! \***********************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var errorhandler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! errorhandler */ "errorhandler"); /* harmony import */ var errorhandler__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(errorhandler__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/app */ "./src/app.js"); _app__WEBPACK_IMPORTED_MODULE_1__["default"].use(errorhandler__WEBPACK_IMPORTED_MODULE_0___default.a); var server = _app__WEBPACK_IMPORTED_MODULE_1__["default"].listen(_app__WEBPACK_IMPORTED_MODULE_1__["default"].get('port'), function () { console.log( ' App is running at http://localhost:%d in %s mode', _app__WEBPACK_IMPORTED_MODULE_1__["default"].get('port'), _app__WEBPACK_IMPORTED_MODULE_1__["default"].get('env')); console.log(' Press CTRL-C to stop'); }); /* harmony default export */ __webpack_exports__["default"] = (server); /***/ }), /***/ "./src/services/Accounting/JournalEntry.js": /*!*************************************************!*\ !*** ./src/services/Accounting/JournalEntry.js ***! \*************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return JournalEntry; }); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}var JournalEntry = function JournalEntry(entry) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, JournalEntry); var defaults = { credit: 0, debit: 0 }; this.entry = _objectSpread({}, defaults, {}, entry); }; /***/ }), /***/ "./src/services/Accounting/JournalPoster.js": /*!**************************************************!*\ !*** ./src/services/Accounting/JournalPoster.js ***! \**************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return JournalPoster; }); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray"); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalEntry */ "./src/services/Accounting/JournalEntry.js"); /* harmony import */ var _models_AccountTransaction__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/models/AccountTransaction */ "./src/models/AccountTransaction.js"); /* harmony import */ var _models_AccountBalance__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/models/AccountBalance */ "./src/models/AccountBalance.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js"); /* harmony import */ var _models_Account__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js"); /* harmony import */ var _collection_NestedSet__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../collection/NestedSet */ "./src/collection/NestedSet/index.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} var JournalPoster = /*#__PURE__*/function () { /** * Journal poster constructor. */ function JournalPoster(accountsGraph) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, JournalPoster); this.entries = []; this.balancesChange = {}; this.deletedEntriesIds = []; this.accountsBalanceTable = {}; this.accountsGraph = accountsGraph; } /** * Writes the credit entry for the given account. * @param {JournalEntry} entry - */_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(JournalPoster, [{ key: "credit", value: function credit( entryModel) { if (entryModel instanceof _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_8__["default"] === false) { throw new Error('The entry is not instance of JournalEntry.'); } this.entries.push(entryModel.entry); this.setAccountBalanceChange(entryModel.entry, 'credit'); } /** * Writes the debit entry for the given account. * @param {JournalEntry} entry - */ }, { key: "debit", value: function debit( entryModel) { if (entryModel instanceof _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_8__["default"] === false) { throw new Error('The entry is not instance of JournalEntry.'); } this.entries.push(entryModel.entry); this.setAccountBalanceChange(entryModel.entry, 'debit'); } /** * Sets account balance change. * @param {JournalEntry} entry * @param {String} type */ }, { key: "setAccountBalanceChange", value: function setAccountBalanceChange( entry, entryType) {var _this = this; var depAccountsIds = this.accountsGraph.dependantsOf(entry.account); var balanceChangeEntry = { debit: entry.debit, credit: entry.credit, entryType: entryType, accountNormal: entry.accountNormal }; this._setAccountBalanceChange(_objectSpread({}, balanceChangeEntry, { accountId: entry.account })); // Effect parent accounts of the given account id. depAccountsIds.forEach(function (accountId) { _this._setAccountBalanceChange(_objectSpread({}, balanceChangeEntry, { accountId: accountId })); }); } /** * Sets account balance change. * @private */ }, { key: "_setAccountBalanceChange", value: function _setAccountBalanceChange(_ref) {var accountId = _ref.accountId,accountNormal = _ref.accountNormal,debit = _ref.debit,credit = _ref.credit,entryType = _ref.entryType; if (!this.balancesChange[accountId]) { this.balancesChange[accountId] = 0; } var change = 0; if (accountNormal === 'credit') { change = entryType === 'credit' ? credit : -1 * debit; } else if (accountNormal === 'debit') { change = entryType === 'debit' ? debit : -1 * credit; } this.balancesChange[accountId] += change; } /** * Mapping the balance change to list. */ }, { key: "mapBalanceChangesToList", value: function mapBalanceChangesToList() {var _this2 = this; var mappedList = []; Object.keys(this.balancesChange).forEach(function (accountId) { var balance = _this2.balancesChange[accountId]; mappedList.push({ account_id: accountId, amount: balance }); }); return mappedList; } /** * Saves the balance change of journal entries. */ }, { key: "saveBalance", value: function () {var _saveBalance = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee() {var balancesList, balanceUpdateOpers, balanceInsertOpers, balanceFindOneOpers, balanceAccounts;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0: balancesList = this.mapBalanceChangesToList(); balanceUpdateOpers = []; balanceInsertOpers = []; balanceFindOneOpers = []; balanceAccounts = []; balancesList.forEach(function (balance) { var oper = _models_AccountBalance__WEBPACK_IMPORTED_MODULE_10__["default"].tenant(). query(). findOne('account_id', balance.account_id); balanceFindOneOpers.push(oper); });_context.next = 8;return ( Promise.all(balanceFindOneOpers));case 8:balanceAccounts = _context.sent; balancesList.forEach(function (balance) { var method = balance.amount < 0 ? 'decrement' : 'increment'; // Detarmine if the account balance is already exists or not. var foundAccBalance = balanceAccounts.some( function (account) {return account && account.account_id === balance.account_id;}); if (foundAccBalance) { var query = _models_AccountBalance__WEBPACK_IMPORTED_MODULE_10__["default"].tenant(). query()[ method]('amount', Math.abs(balance.amount)). where('account_id', balance.account_id); balanceUpdateOpers.push(query); } else { var _query = _models_AccountBalance__WEBPACK_IMPORTED_MODULE_10__["default"].tenant().query().insert({ account_id: balance.account_id, amount: balance.amount, currency_code: 'USD' }); balanceInsertOpers.push(_query); } });_context.next = 12;return ( Promise.all([].concat(balanceUpdateOpers, balanceInsertOpers)));case 12:case "end":return _context.stop();}}}, _callee, this);}));function saveBalance() {return _saveBalance.apply(this, arguments);}return saveBalance;}() /** * Saves the stacked journal entries to the storage. */ }, { key: "saveEntries", value: function () {var _saveEntries = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2() {var saveOperations;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: saveOperations = []; this.entries.forEach(function (entry) { var oper = _models_AccountTransaction__WEBPACK_IMPORTED_MODULE_9__["default"].tenant(). query(). insert(_objectSpread({ accountId: entry.account }, Object(lodash__WEBPACK_IMPORTED_MODULE_6__["pick"])(entry, [ 'credit', 'debit', 'transactionType', 'date', 'userId', 'referenceType', 'referenceId', 'note', 'contactId', 'contactType']))); saveOperations.push(function () {return oper;}); });_context2.next = 4;return ( Object(_utils__WEBPACK_IMPORTED_MODULE_11__["promiseSerial"])(saveOperations));case 4:case "end":return _context2.stop();}}}, _callee2, this);}));function saveEntries() {return _saveEntries.apply(this, arguments);}return saveEntries;}() /** * Reverses the stacked journal entries. */ }, { key: "reverseEntries", value: function reverseEntries() { var reverseEntries = []; this.entries.forEach(function (entry) { var reverseEntry = _objectSpread({}, entry); if (entry.credit) { reverseEntry.debit = entry.credit; } if (entry.debit) { reverseEntry.credit = entry.debit; } reverseEntries.push(reverseEntry); }); this.entries = reverseEntries; } /** * * @param {Array} ids - */ }, { key: "removeEntries", value: function removeEntries() {var _this3 = this,_this$deletedEntriesI;var ids = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var targetIds = ids.length <= 0 ? this.entries.map(function (e) {return e.id;}) : ids; var removeEntries = this.entries.filter( function (e) {return targetIds.indexOf(e.id) !== -1;}); this.entries = this.entries.filter(function (e) {return targetIds.indexOf(e.id) === -1;}); removeEntries.forEach(function (entry) { entry.credit = -1 * entry.credit; entry.debit = -1 * entry.debit; _this3.setAccountBalanceChange(entry, entry.accountNormal); }); (_this$deletedEntriesI = this.deletedEntriesIds).push.apply(_this$deletedEntriesI, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(removeEntries.map(function (entry) {return entry.id;}))); } /** * Delete all the stacked entries. */ }, { key: "deleteEntries", value: function () {var _deleteEntries = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3() {return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:if (!( this.deletedEntriesIds.length > 0)) {_context3.next = 3;break;}_context3.next = 3;return ( _models_AccountTransaction__WEBPACK_IMPORTED_MODULE_9__["default"].tenant(). query(). whereIn('id', this.deletedEntriesIds)["delete"]());case 3:case "end":return _context3.stop();}}}, _callee3, this);}));function deleteEntries() {return _deleteEntries.apply(this, arguments);}return deleteEntries;}() /** * Retrieve the closing balance for the given account and closing date. * @param {Number} accountId - * @param {Date} closingDate - */ }, { key: "getClosingBalance", value: function getClosingBalance( accountId, closingDate) {var dateType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'day'; var closingBalance = 0; var momentClosingDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(closingDate); this.entries.forEach(function (entry) { // Can not continue if not before or event same closing date. if ( !momentClosingDate.isAfter(entry.date, dateType) && !momentClosingDate.isSame(entry.date, dateType) || entry.account !== accountId && accountId) { return; } if (entry.accountNormal === 'credit') { closingBalance += entry.credit ? entry.credit : -1 * entry.debit; } else if (entry.accountNormal === 'debit') { closingBalance += entry.debit ? entry.debit : -1 * entry.credit; } }); return closingBalance; } /** * Retrieve the given account balance with dependencies accounts. * @param {Number} accountId * @param {Date} closingDate * @param {String} dateType * @return {Number} */ }, { key: "getAccountBalance", value: function getAccountBalance( accountId, closingDate, dateType) {var _this4 = this; var accountNode = this.accountsGraph.getNodeData(accountId); var depAccountsIds = this.accountsGraph.dependenciesOf(accountId); var depAccounts = depAccountsIds.map(function (id) {return ( _this4.accountsGraph.getNodeData(id));}); var balance = 0; [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(depAccounts), [accountNode]).forEach(function (account) { // if (!this.accountsBalanceTable[account.id]) { var closingBalance = _this4.getClosingBalance( account.id, closingDate, dateType); _this4.accountsBalanceTable[account.id] = closingBalance; // } balance += _this4.accountsBalanceTable[account.id]; }); return balance; } /** * Retrieve the credit/debit sumation for the given account and date. * @param {Number} account - * @param {Date|String} closingDate - */ }, { key: "getTrialBalance", value: function getTrialBalance( accountId, closingDate, dateType) { var momentClosingDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(closingDate); var result = { credit: 0, debit: 0, balance: 0 }; this.entries.forEach(function (entry) { if ( !momentClosingDate.isAfter(entry.date, dateType) && !momentClosingDate.isSame(entry.date, dateType) || entry.account !== accountId && accountId) { return; } result.credit += entry.credit; result.debit += entry.debit; if (entry.accountNormal === 'credit') { result.balance += entry.credit - entry.debit; } else if (entry.accountNormal === 'debit') { result.balance += entry.debit - entry.credit; } }); return result; } /** * Retrieve trial balance of the given account with depends. * @param {Number} accountId * @param {Date} closingDate * @param {String} dateType * @return {Number} */ }, { key: "getTrialBalanceWithDepands", value: function getTrialBalanceWithDepands( accountId, closingDate, dateType) {var _this5 = this; var accountNode = this.accountsGraph.getNodeData(accountId); var depAccountsIds = this.accountsGraph.dependenciesOf(accountId); var depAccounts = depAccountsIds.map(function (id) {return ( _this5.accountsGraph.getNodeData(id));}); var trialBalance = { credit: 0, debit: 0, balance: 0 }; [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(depAccounts), [accountNode]).forEach(function (account) { var _trialBalance = _this5.getTrialBalance( account.id, closingDate, dateType); trialBalance.credit += _trialBalance.credit; trialBalance.debit += _trialBalance.debit; trialBalance.balance += _trialBalance.balance; }); return trialBalance; } }, { key: "getContactTrialBalance", value: function getContactTrialBalance( accountId, contactId, contactType, closingDate, openingDate) { var momentClosingDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(closingDate); var momentOpeningDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(openingDate); var trial = { credit: 0, debit: 0, balance: 0 }; this.entries.forEach(function (entry) { if ( closingDate && !momentClosingDate.isAfter(entry.date, 'day') && !momentClosingDate.isSame(entry.date, 'day') || openingDate && !momentOpeningDate.isBefore(entry.date, 'day') && !momentOpeningDate.isSame(entry.date) || accountId && entry.account !== accountId || contactId && entry.contactId !== contactId || entry.contactType !== contactType) { return; } if (entry.credit) { trial.balance -= entry.credit; trial.credit += entry.credit; } if (entry.debit) { trial.balance += entry.debit; trial.debit += entry.debit; } }); return trial; } /** * Retrieve total balnace of the given customer/vendor contact. * @param {Number} accountId * @param {Number} contactId * @param {String} contactType * @param {Date} closingDate */ }, { key: "getContactBalance", value: function getContactBalance( accountId, contactId, contactType, closingDate, openingDate) { var momentClosingDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(closingDate); var balance = 0; this.entries.forEach(function (entry) { if ( closingDate && !momentClosingDate.isAfter(entry.date, 'day') && !momentClosingDate.isSame(entry.date, 'day') || entry.account !== accountId && accountId || contactId && entry.contactId !== contactId || entry.contactType !== contactType) { return; } if (entry.credit) { balance -= entry.credit; } if (entry.debit) { balance += entry.debit; } }); return balance; } /** * Load fetched accounts journal entries. * @param {Array} entries - */ }, { key: "loadEntries", value: function loadEntries( entries) {var _this6 = this; entries.forEach(function (entry) { _this6.entries.push(_objectSpread({}, entry, { account: entry.account ? entry.account.id : entry.accountId, accountNormal: entry.account && entry.account.type ? entry.account.type.normal : entry.accountNormal })); }); } }, { key: "calculateEntriesBalanceChange", value: function calculateEntriesBalanceChange() {var _this7 = this; this.entries.forEach(function (entry) { if (entry.credit) { _this7.setAccountBalanceChange(entry, 'credit'); } if (entry.debit) { _this7.setAccountBalanceChange(entry, 'debit'); } }); } }]);return JournalPoster;}(); /***/ }), /***/ "./src/services/Cache/index.js": /*!*************************************!*\ !*** ./src/services/Cache/index.js ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var node_cache__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! node-cache */ "node-cache"); /* harmony import */ var node_cache__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(node_cache__WEBPACK_IMPORTED_MODULE_2__); var Cache = /*#__PURE__*/function () { function Cache() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Cache); this.cache = new node_cache__WEBPACK_IMPORTED_MODULE_2___default.a({ // stdTTL: 9999999, // checkperiod: 9999999 * 0.2, useClones: false }); }_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Cache, [{ key: "get", value: function get( key, storeFunction) {var _this = this; var value = this.cache.get(key); if (value) { return Promise.resolve(value); } return storeFunction().then(function (result) { _this.cache.set(key, result); return result; }); } }, { key: "set", value: function set( key, results) { this.cache.set(key, results); } }, { key: "del", value: function del( keys) { this.cache.del(keys); } }, { key: "delStartWith", value: function delStartWith() {var startStr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; if (!startStr) { return; } var keys = this.cache.keys();var _iteratorNormalCompletion = true;var _didIteratorError = false;var _iteratorError = undefined;try { for (var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {var key = _step.value; if (key.indexOf(startStr) === 0) { this.del(key); } }} catch (err) {_didIteratorError = true;_iteratorError = err;} finally {try {if (!_iteratorNormalCompletion && _iterator["return"] != null) {_iterator["return"]();}} finally {if (_didIteratorError) {throw _iteratorError;}}} } }, { key: "flush", value: function flush() { this.cache.flushAll(); } }]);return Cache;}(); /* harmony default export */ __webpack_exports__["default"] = (new Cache()); /***/ }), /***/ "./src/services/Logger/index.js": /*!**************************************!*\ !*** ./src/services/Logger/index.js ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var winston__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! winston */ "winston"); /* harmony import */ var winston__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(winston__WEBPACK_IMPORTED_MODULE_0__); var transports = { console: new winston__WEBPACK_IMPORTED_MODULE_0___default.a.transports.Console({ level: 'warn' }), file: new winston__WEBPACK_IMPORTED_MODULE_0___default.a.transports.File({ filename: 'stdout.log' }) }; /* harmony default export */ __webpack_exports__["default"] = (winston__WEBPACK_IMPORTED_MODULE_0___default.a.createLogger({ transports: [ transports.console, transports.file] })); /***/ }), /***/ "./src/services/Subscription/UserSubscription.js": /*!*******************************************************!*\ !*** ./src/services/Subscription/UserSubscription.js ***! \*******************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony default export */ __webpack_exports__["default"] = (function (Model) { return (/*#__PURE__*/function (_Model) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(UserSubscription, _Model);function UserSubscription() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, UserSubscription);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(UserSubscription).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(UserSubscription, [{ key: "onTrial", value: function onTrial() { } }, { key: "getSubscription", value: function getSubscription() { } }, { key: "newSubscription", value: function newSubscription() { } }, { key: "isSubcribedTo", value: function isSubcribedTo( plan) { } }]);return UserSubscription;}(Model)); }); /***/ }), /***/ "./src/services/mail.js": /*!******************************!*\ !*** ./src/services/mail.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var nodemailer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! nodemailer */ "nodemailer"); /* harmony import */ var nodemailer__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(nodemailer__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/../config/config */ "./config/config.js"); /* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_config__WEBPACK_IMPORTED_MODULE_1__); // create reusable transporter object using the default SMTP transport var transporter = nodemailer__WEBPACK_IMPORTED_MODULE_0___default.a.createTransport({ host: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.host, port: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.port, secure: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.secure, // true for 465, false for other ports auth: { user: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.username, pass: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.password } }); console.log({ host: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.host, port: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.port, secure: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.secure, // true for 465, false for other ports auth: { user: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.username, pass: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.password } }); /* harmony default export */ __webpack_exports__["default"] = (transporter); /***/ }), /***/ "./src/system/TenantsManager.js": /*!**************************************!*\ !*** ./src/system/TenantsManager.js ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TenantsManager; }); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator"); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator"); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var knex__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! knex */ "knex"); /* harmony import */ var knex__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(knex__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _system_models_Tenant__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/system/models/Tenant */ "./src/system/models/Tenant.js"); /* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/../config/config */ "./config/config.js"); /* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_config_config__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js"); /* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! uniqid */ "uniqid"); /* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(uniqid__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var _database_manager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/database/manager */ "./src/database/manager.js"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_12__); /* harmony import */ var _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/system/models/SystemUser */ "./src/system/models/SystemUser.js"); /* harmony import */ var _models_TenantUser__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/models/TenantUser */ "./src/models/TenantUser.js"); function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} // import TenantModel from '@/models/TenantModel'; // const TenantWebsite: { // tenantDb: Knex, // tenantId: Number, // tenantOrganizationId: String, // } var TenantsManager = /*#__PURE__*/function () { function TenantsManager() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, TenantsManager); this.knexCache = new Map(); }_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(TenantsManager, null, [{ key: "getTenant", value: function () {var _getTenant = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee( organizationId) {var tenant;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:_context.next = 2;return ( _system_models_Tenant__WEBPACK_IMPORTED_MODULE_7__["default"].query(). where('organization_id', organizationId).first());case 2:tenant = _context.sent;return _context.abrupt("return", tenant);case 4:case "end":return _context.stop();}}}, _callee);}));function getTenant(_x) {return _getTenant.apply(this, arguments);}return getTenant;}() /** * Creates a new tenant database. * @param {Integer} uniqId * @return {TenantWebsite} */ }, { key: "createTenant", value: function () {var _createTenant = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2( uniqId) {var organizationId, tenantOrganization, tenantDbName, tenantDb;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0: organizationId = uniqId || uniqid__WEBPACK_IMPORTED_MODULE_10___default()();_context2.next = 3;return ( _system_models_Tenant__WEBPACK_IMPORTED_MODULE_7__["default"].query().insert({ organization_id: organizationId }));case 3:tenantOrganization = _context2.sent; tenantDbName = "bigcapital_tenant_".concat(organizationId);_context2.next = 7;return ( _database_manager__WEBPACK_IMPORTED_MODULE_11__["default"].createDb(tenantDbName));case 7: tenantDb = TenantsManager.knexInstance(organizationId);_context2.next = 10;return ( tenantDb.migrate.latest());case 10:return _context2.abrupt("return", { tenantDb: tenantDb, tenantId: tenantOrganization.id, organizationId: organizationId });case 11:case "end":return _context2.stop();}}}, _callee2);}));function createTenant(_x2) {return _createTenant.apply(this, arguments);}return createTenant;}() /** * Drop tenant database of the given tenant website. * @param {TenantWebsite} tenantWebsite */ }, { key: "dropTenant", value: function () {var _dropTenant = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3( tenantWebsite) {var tenantDbName;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0: tenantDbName = "bigcapital_tenant_".concat(tenantWebsite.organizationId);_context3.next = 3;return ( _database_manager__WEBPACK_IMPORTED_MODULE_11__["default"].dropDb(tenantDbName));case 3:_context3.next = 5;return ( _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_13__["default"].query(). where('tenant_id', tenantWebsite.tenantId));case 5:case "end":return _context3.stop();}}}, _callee3);}));function dropTenant(_x3) {return _dropTenant.apply(this, arguments);}return dropTenant;}() /** * Creates a user that associate to the given tenant. */ }, { key: "createTenantUser", value: function () {var _createTenantUser = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee4( tenantWebsite, user) {var userInsert, systemUser, tenantUser;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0: userInsert = _objectSpread({}, user);_context4.next = 3;return ( _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_13__["default"].query().insert(_objectSpread({}, user, { tenant_id: tenantWebsite.tenantId })));case 3:systemUser = _context4.sent; _models_TenantModel__WEBPACK_IMPORTED_MODULE_9__["default"].knexBinded = tenantWebsite.tenantDb;_context4.next = 7;return ( _models_TenantUser__WEBPACK_IMPORTED_MODULE_14__["default"].bindKnex(tenantWebsite.tenantDb). query(). insert(_objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_12__["omit"])(userInsert, ['password']))));case 7:tenantUser = _context4.sent;return _context4.abrupt("return", _objectSpread({}, tenantUser, {}, systemUser));case 9:case "end":return _context4.stop();}}}, _callee4);}));function createTenantUser(_x4, _x5) {return _createTenantUser.apply(this, arguments);}return createTenantUser;}() /** * Retrieve all tenants metadata from system storage. */ }, { key: "getAllTenants", value: function getAllTenants() { return _system_models_Tenant__WEBPACK_IMPORTED_MODULE_7__["default"].query(); } /** * Retrieve the given organization id knex configuration. * @param {String} organizationId - */ }, { key: "getTenantKnexConfig", value: function getTenantKnexConfig( organizationId) { return { client: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.db_client, connection: { host: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.db_host, user: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.db_user, password: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.db_password, database: "".concat(_config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.db_name_prefix).concat(organizationId), charset: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.charset }, migrations: { directory: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.migrations_dir }, seeds: { directory: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.seeds_dir }, pool: { min: 0, max: 5 } }; } }, { key: "knexInstance", value: function knexInstance( organizationId) { var knexCache = new Map(); var knex = knexCache.get(organizationId); if (!knex) { knex = knex__WEBPACK_IMPORTED_MODULE_5___default()(_objectSpread({}, this.getTenantKnexConfig(organizationId), {}, Object(objection__WEBPACK_IMPORTED_MODULE_6__["knexSnakeCaseMappers"])({ upperCase: true }))); knexCache.set(organizationId, knex); } return knex; } }]);return TenantsManager;}(); /***/ }), /***/ "./src/system/models/Invite.js": /*!*************************************!*\ !*** ./src/system/models/Invite.js ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return UserInvite; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/system/models/SystemModel */ "./src/system/models/SystemModel.js"); var UserInvite = /*#__PURE__*/function (_SystemModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(UserInvite, _SystemModel);function UserInvite() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, UserInvite);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(UserInvite).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(UserInvite, null, [{ key: "tableName", /** * Table name. */get: function get() { return 'user_invites'; } }]);return UserInvite;}(_system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/system/models/PasswordReset.js": /*!********************************************!*\ !*** ./src/system/models/PasswordReset.js ***! \********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PasswordResets; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/system/models/SystemModel */ "./src/system/models/SystemModel.js"); var PasswordResets = /*#__PURE__*/function (_SystemModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(PasswordResets, _SystemModel);function PasswordResets() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, PasswordResets);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PasswordResets).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(PasswordResets, null, [{ key: "tableName", /** * Table name */get: function get() { return 'password_resets'; } }]);return PasswordResets;}(_system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/system/models/SubscriptionUsage.js": /*!************************************************!*\ !*** ./src/system/models/SubscriptionUsage.js ***! \************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SubscriptionUsage; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/system/models/SystemModel */ "./src/system/models/SystemModel.js"); var SubscriptionUsage = /*#__PURE__*/function (_SystemModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(SubscriptionUsage, _SystemModel);function SubscriptionUsage() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, SubscriptionUsage);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(SubscriptionUsage).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(SubscriptionUsage, null, [{ key: "tableName", /** * Table name */get: function get() { return 'subscriptions_usage'; } }]);return SubscriptionUsage;}(_system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/system/models/SystemModel.js": /*!******************************************!*\ !*** ./src/system/models/SystemModel.js ***! \******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SystemModel; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _models_Model__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/models/Model */ "./src/models/Model.js"); var SystemModel = /*#__PURE__*/function (_BaseModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default()(SystemModel, _BaseModel);function SystemModel() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, SystemModel);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(SystemModel).apply(this, arguments));}return SystemModel;}(_models_Model__WEBPACK_IMPORTED_MODULE_4__["default"]); /***/ }), /***/ "./src/system/models/SystemUser.js": /*!*****************************************!*\ !*** ./src/system/models/SystemUser.js ***! \*****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SystemUser; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection"); /* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! bcryptjs */ "bcryptjs"); /* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(bcryptjs__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _system_models_SystemModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/system/models/SystemModel */ "./src/system/models/SystemModel.js"); /* harmony import */ var _services_Subscription_UserSubscription__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Subscription/UserSubscription */ "./src/services/Subscription/UserSubscription.js"); var SystemUser = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(SystemUser, _mixin);function SystemUser() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, SystemUser);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(SystemUser).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(SystemUser, [{ key: "verifyPassword", /** * Verify the password of the user. * @param {String} password - The given password. * @return {Boolean} */value: function verifyPassword( password) { return bcryptjs__WEBPACK_IMPORTED_MODULE_6___default.a.compareSync(password, this.password); } }], [{ key: "tableName", /** * Table name. */get: function get() {return 'users';} /** * Timestamps columns. */ }, { key: "timestamps", get: function get() {return ['createdAt', 'updatedAt'];} /** * Relationship mapping. */ }, { key: "relationMappings", get: function get() {var Tenant = __webpack_require__(/*! @/system/models/Tenant */ "./src/system/models/Tenant.js");var SubscriptionUsage = __webpack_require__(/*! @/system/models/SubscriptionUsage */ "./src/system/models/SubscriptionUsage.js");return { tenant: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: Tenant["default"], join: { from: 'users.tenantId', to: 'tenants.id' } }, subscriptionUsage: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: SubscriptionUsage["default"], join: { from: 'users.id', to: 'subscriptions_usage.user_id' } } };} }]);return SystemUser;}(Object(objection__WEBPACK_IMPORTED_MODULE_5__["mixin"])(_system_models_SystemModel__WEBPACK_IMPORTED_MODULE_7__["default"], [_services_Subscription_UserSubscription__WEBPACK_IMPORTED_MODULE_8__["default"]])); /***/ }), /***/ "./src/system/models/Tenant.js": /*!*************************************!*\ !*** ./src/system/models/Tenant.js ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Tenant; }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn"); /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf"); /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits"); /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _models_Model__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/Model */ "./src/models/Model.js"); var Tenant = /*#__PURE__*/function (_BaseModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Tenant, _BaseModel);function Tenant() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Tenant);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Tenant).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Tenant, null, [{ key: "tableName", /** * Table name. */get: function get() { return 'tenants'; } }]);return Tenant;}(_models_Model__WEBPACK_IMPORTED_MODULE_5__["default"]); /***/ }), /***/ "./src/utils/index.js": /*!****************************!*\ !*** ./src/utils/index.js ***! \****************************/ /*! exports provided: hashPassword, origin, dateRangeCollection, dateRangeFormat, mapValuesDeep, mapKeysDeep, promiseSerial, flatToNestedArray */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hashPassword", function() { return hashPassword; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "origin", function() { return origin; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dateRangeCollection", function() { return dateRangeCollection; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dateRangeFormat", function() { return dateRangeFormat; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapValuesDeep", function() { return mapValuesDeep; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapKeysDeep", function() { return mapKeysDeep; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "promiseSerial", function() { return promiseSerial; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flatToNestedArray", function() { return flatToNestedArray; }); /* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! bcryptjs */ "bcryptjs"); /* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(bcryptjs__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! moment */ "moment"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash */ "lodash"); /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_2__); var _require = __webpack_require__(/*! lodash */ "lodash"),map = _require.map,isArray = _require.isArray,isPlainObject = _require.isPlainObject,mapKeys = _require.mapKeys,mapValues = _require.mapValues; var hashPassword = function hashPassword(password) {return ( new Promise(function (resolve) { bcryptjs__WEBPACK_IMPORTED_MODULE_0___default.a.genSalt(10, function (error, salt) { bcryptjs__WEBPACK_IMPORTED_MODULE_0___default.a.hash(password, salt, function (err, hash) { resolve(hash); }); }); }));}; var origin = function origin(request) {return "".concat(request.protocol, "://").concat(request.hostname);}; var dateRangeCollection = function dateRangeCollection( fromDate, toDate) {var addType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'day';var increment = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1; var collection = []; var momentFromDate = moment__WEBPACK_IMPORTED_MODULE_1___default()(fromDate); var dateFormat = ''; switch (addType) { case 'day': default: dateFormat = 'YYYY-MM-DD'; break; case 'month': case 'quarter': dateFormat = 'YYYY-MM'; break; case 'year': dateFormat = 'YYYY'; break;} for ( var i = momentFromDate; i.isBefore(toDate, addType) || i.isSame(toDate, addType); i.add(increment, "".concat(addType, "s"))) { collection.push(i.endOf(addType).format(dateFormat)); } return collection; }; var dateRangeFormat = function dateRangeFormat(rangeType) { switch (rangeType) { case 'year': return 'YYYY'; case 'month': case 'quarter': default: return 'YYYY-MM';} }; function mapKeysDeep(obj, cb, isRecursive) { if (!obj && !isRecursive) { return {}; } if (!isRecursive) { if ( typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') { return {}; } } if (Array.isArray(obj)) { return obj.map(function (item) {return mapKeysDeep(item, cb, true);}); } if (!lodash__WEBPACK_IMPORTED_MODULE_2___default.a.isPlainObject(obj)) { return obj; } var result = lodash__WEBPACK_IMPORTED_MODULE_2___default.a.mapKeys(obj, cb); return lodash__WEBPACK_IMPORTED_MODULE_2___default.a.mapValues(result, function (value) {return mapKeysDeep(value, cb, true);}); } var mapValuesDeep = function mapValuesDeep(v, callback) {return ( lodash__WEBPACK_IMPORTED_MODULE_2___default.a.isObject(v) ? lodash__WEBPACK_IMPORTED_MODULE_2___default.a.mapValues(v, function (v) {return mapValuesDeep(v, callback);}) : callback(v));}; var promiseSerial = function promiseSerial(funcs) { return funcs.reduce( function (promise, func) {return ( promise.then(function (result) {return ( func().then(Array.prototype.concat.bind(result)));}));}, Promise.resolve([])); }; var flatToNestedArray = function flatToNestedArray( data) {var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { id: 'id', parentId: 'parent_id' }; var map = {}; var nestedArray = []; data.forEach(function (item) { map[item[config.id]] = item; map[item[config.id]].children = []; }); data.forEach(function (item) { var parentItemId = item[config.parentId]; if (!item[config.parentId]) { nestedArray.push(item); } if (parentItemId) { map[parentItemId].children.push(item); } }); return nestedArray; }; /***/ }), /***/ 0: /*!*********************************************************!*\ !*** multi @babel/plugin-transform-runtime @/server.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(/*! @babel/plugin-transform-runtime */"@babel/plugin-transform-runtime"); module.exports = __webpack_require__(/*! @/server.js */"./src/server.js"); /***/ }), /***/ "@babel/plugin-transform-runtime": /*!**************************************************!*\ !*** external "@babel/plugin-transform-runtime" ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/plugin-transform-runtime"); /***/ }), /***/ "@babel/runtime/helpers/asyncToGenerator": /*!**********************************************************!*\ !*** external "@babel/runtime/helpers/asyncToGenerator" ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/asyncToGenerator"); /***/ }), /***/ "@babel/runtime/helpers/classCallCheck": /*!********************************************************!*\ !*** external "@babel/runtime/helpers/classCallCheck" ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/classCallCheck"); /***/ }), /***/ "@babel/runtime/helpers/createClass": /*!*****************************************************!*\ !*** external "@babel/runtime/helpers/createClass" ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/createClass"); /***/ }), /***/ "@babel/runtime/helpers/defineProperty": /*!********************************************************!*\ !*** external "@babel/runtime/helpers/defineProperty" ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/defineProperty"); /***/ }), /***/ "@babel/runtime/helpers/get": /*!*********************************************!*\ !*** external "@babel/runtime/helpers/get" ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/get"); /***/ }), /***/ "@babel/runtime/helpers/getPrototypeOf": /*!********************************************************!*\ !*** external "@babel/runtime/helpers/getPrototypeOf" ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/getPrototypeOf"); /***/ }), /***/ "@babel/runtime/helpers/inherits": /*!**************************************************!*\ !*** external "@babel/runtime/helpers/inherits" ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/inherits"); /***/ }), /***/ "@babel/runtime/helpers/objectWithoutProperties": /*!*****************************************************************!*\ !*** external "@babel/runtime/helpers/objectWithoutProperties" ***! \*****************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/objectWithoutProperties"); /***/ }), /***/ "@babel/runtime/helpers/possibleConstructorReturn": /*!*******************************************************************!*\ !*** external "@babel/runtime/helpers/possibleConstructorReturn" ***! \*******************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/possibleConstructorReturn"); /***/ }), /***/ "@babel/runtime/helpers/slicedToArray": /*!*******************************************************!*\ !*** external "@babel/runtime/helpers/slicedToArray" ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/slicedToArray"); /***/ }), /***/ "@babel/runtime/helpers/toConsumableArray": /*!***********************************************************!*\ !*** external "@babel/runtime/helpers/toConsumableArray" ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/toConsumableArray"); /***/ }), /***/ "@babel/runtime/helpers/typeof": /*!************************************************!*\ !*** external "@babel/runtime/helpers/typeof" ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/helpers/typeof"); /***/ }), /***/ "@babel/runtime/regenerator": /*!*********************************************!*\ !*** external "@babel/runtime/regenerator" ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("@babel/runtime/regenerator"); /***/ }), /***/ "app-root-path": /*!********************************!*\ !*** external "app-root-path" ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("app-root-path"); /***/ }), /***/ "bcryptjs": /*!***************************!*\ !*** external "bcryptjs" ***! \***************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("bcryptjs"); /***/ }), /***/ "crypto": /*!*************************!*\ !*** external "crypto" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("crypto"); /***/ }), /***/ "dotenv": /*!*************************!*\ !*** external "dotenv" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("dotenv"); /***/ }), /***/ "errorhandler": /*!*******************************!*\ !*** external "errorhandler" ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("errorhandler"); /***/ }), /***/ "express": /*!**************************!*\ !*** external "express" ***! \**************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("express"); /***/ }), /***/ "express-boom": /*!*******************************!*\ !*** external "express-boom" ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("express-boom"); /***/ }), /***/ "express-fileupload": /*!*************************************!*\ !*** external "express-fileupload" ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("express-fileupload"); /***/ }), /***/ "express-validator": /*!************************************!*\ !*** external "express-validator" ***! \************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("express-validator"); /***/ }), /***/ "fs": /*!*********************!*\ !*** external "fs" ***! \*********************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("fs"); /***/ }), /***/ "helmet": /*!*************************!*\ !*** external "helmet" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("helmet"); /***/ }), /***/ "i18n": /*!***********************!*\ !*** external "i18n" ***! \***********************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("i18n"); /***/ }), /***/ "jsonwebtoken": /*!*******************************!*\ !*** external "jsonwebtoken" ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("jsonwebtoken"); /***/ }), /***/ "knex": /*!***********************!*\ !*** external "knex" ***! \***********************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("knex"); /***/ }), /***/ "knex-db-manager": /*!**********************************!*\ !*** external "knex-db-manager" ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("knex-db-manager"); /***/ }), /***/ "lodash": /*!*************************!*\ !*** external "lodash" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("lodash"); /***/ }), /***/ "moment": /*!*************************!*\ !*** external "moment" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("moment"); /***/ }), /***/ "mustache": /*!***************************!*\ !*** external "mustache" ***! \***************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("mustache"); /***/ }), /***/ "node-cache": /*!*****************************!*\ !*** external "node-cache" ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("node-cache"); /***/ }), /***/ "nodemailer": /*!*****************************!*\ !*** external "nodemailer" ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("nodemailer"); /***/ }), /***/ "objection": /*!****************************!*\ !*** external "objection" ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("objection"); /***/ }), /***/ "path": /*!***********************!*\ !*** external "path" ***! \***********************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("path"); /***/ }), /***/ "uniqid": /*!*************************!*\ !*** external "uniqid" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("uniqid"); /***/ }), /***/ "winston": /*!**************************!*\ !*** external "winston" ***! \**************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("winston"); /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrL2Jvb3RzdHJhcCIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9jb25maWcvY29uZmlnLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL2NvbmZpZy9pbmRleC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9jb25maWcvc3lzdGVtS25leGZpbGUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2FwcC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvY29sbGVjdGlvbi9OZXN0ZWRTZXQvaW5kZXguanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2NvbGxlY3Rpb24vUmVzb3VyY2VGaWVsZE1ldGFkYXRhQ29sbGVjdGlvbi5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YS9SZXNvdXJjZUZpZWxkc0tleXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2RhdGEvb3B0aW9ucy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YWJhc2Uva25leC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YWJhc2UvbWFuYWdlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YWJhc2Uvb2JqZWN0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0FjY291bnRUeXBlcy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9BY2NvdW50aW5nLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0FjY291bnRzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0F1dGhlbnRpY2F0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0Jhc2VDb250cm9sbGVyLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0N1cnJlbmNpZXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvQ3VzdG9tZXJzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0V4Y2hhbmdlUmF0ZXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRXhwZW5zZXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRmluYW5jaWFsU3RhdGVtZW50cy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9GaW5hbmNpYWxTdGF0ZW1lbnRzL0FnaW5nUmVwb3J0LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvQmFsYW5jZVNoZWV0LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvRmluYW5jaWFsU3RhdGVtZW50TWl4aW4uanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRmluYW5jaWFsU3RhdGVtZW50cy9Kb3VybmFsU2hlZXQuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRmluYW5jaWFsU3RhdGVtZW50cy9QYXlhYmxlQWdpbmdTdW1tYXJ5LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvUHJvZml0TG9zc1NoZWV0LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvUmVjZWl2YWJsZUFnaW5nU3VtbWFyeS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9GaW5hbmNpYWxTdGF0ZW1lbnRzL1RyaWFsQmFsYW5jZVNoZWV0LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvZ2VuZXJhbExlZGdlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9JbnZpdGVVc2Vycy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9JdGVtQ2F0ZWdvcmllcy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9JdGVtcy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9NZWRpYS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9PcHRpb25zLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL1Jlc291cmNlcy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9Vc2Vycy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9WZW5kb3JzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL1ZpZXdzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2luZGV4LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL21pZGRsZXdhcmUvVGVuYW5jeU1pZGRsZXdhcmUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvbWlkZGxld2FyZS9qd3RBdXRoLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvQ2FjaGFibGUvQ2FjaGFibGVNb2RlbC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0NhY2hhYmxlL0NhY2hhYmxlUXVlcnlCdWlsZGVyLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvRGVwZW5kZW5jeUdyYXBoL2luZGV4LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvRHluYW1pY0ZpbHRlci9EeW5hbWljRmlsdGVyLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvRHluYW1pY0ZpbHRlci9EeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9EeW5hbWljRmlsdGVyL0R5bmFtaWNGaWx0ZXJSb2xlQWJzdHJ1Y3Rvci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0R5bmFtaWNGaWx0ZXIvRHluYW1pY0ZpbHRlclNvcnRCeS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0R5bmFtaWNGaWx0ZXIvRHluYW1pY0ZpbHRlclZpZXdzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvRHluYW1pY0ZpbHRlci9pbmRleC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0xvZ2ljRXZhbHVhdGlvbi9MZXhlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0xvZ2ljRXZhbHVhdGlvbi9QYXJzZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9Mb2dpY0V2YWx1YXRpb24vUXVlcnlQYXJzZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9NZXRhYmxlL01ldGFibGVDb2xsZWN0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvVmlld1JvbGVzQnVpbGRlci9pbmRleC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzIHN5bmMgL15cXC5cXC8uKiQvIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvQWNjb3VudC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL0FjY291bnRCYWxhbmNlLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvQWNjb3VudFRyYW5zYWN0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvQWNjb3VudFR5cGUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9BdXRoLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvQnVkZ2V0LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvQnVkZ2V0RW50cnkuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9DdXJyZW5jeS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL0N1c3RvbWVyLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvRGF0ZVNlc3Npb24uanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9FeGNoYW5nZVJhdGUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9FeHBlbnNlLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvRXhwZW5zZUNhdGVnb3J5LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvSXRlbS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL0l0ZW1DYXRlZ29yeS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL01hbnVhbEpvdXJuYWwuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9NZWRpYS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL01lZGlhTGluay5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL01ldGFibGUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9Nb2RlbC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL09wdGlvbi5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1BhZ2luYXRpb24uanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9QZXJtaXNzaW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvUmVzb3VyY2UuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvUmVzb3VyY2VGaWVsZE1ldGFkYXRhLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvUm9sZS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1NldHRpbmcuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9UZW5hbnRNb2RlbC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1RlbmFudFVzZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9WZW5kb3IuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9WaWV3LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvVmlld0NvbHVtbi5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1ZpZXdSb2xlLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2ZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbEVudHJ5LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2aWNlcy9BY2NvdW50aW5nL0pvdXJuYWxQb3N0ZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3NlcnZpY2VzL0NhY2hlL2luZGV4LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2aWNlcy9Mb2dnZXIvaW5kZXguanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3NlcnZpY2VzL1N1YnNjcmlwdGlvbi9Vc2VyU3Vic2NyaXB0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2aWNlcy9tYWlsLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zeXN0ZW0vVGVuYW50c01hbmFnZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvSW52aXRlLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zeXN0ZW0vbW9kZWxzL1Bhc3N3b3JkUmVzZXQuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvU3Vic2NyaXB0aW9uVXNhZ2UuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvU3lzdGVtTW9kZWwuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvU3lzdGVtVXNlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvc3lzdGVtL21vZGVscy9UZW5hbnQuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3V0aWxzL2luZGV4LmpzIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcGx1Z2luLXRyYW5zZm9ybS1ydW50aW1lXCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFwiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIiIsImV4dGVybmFsIFwiYXBwLXJvb3QtcGF0aFwiIiwiZXh0ZXJuYWwgXCJiY3J5cHRqc1wiIiwiZXh0ZXJuYWwgXCJjcnlwdG9cIiIsImV4dGVybmFsIFwiZG90ZW52XCIiLCJleHRlcm5hbCBcImVycm9yaGFuZGxlclwiIiwiZXh0ZXJuYWwgXCJleHByZXNzXCIiLCJleHRlcm5hbCBcImV4cHJlc3MtYm9vbVwiIiwiZXh0ZXJuYWwgXCJleHByZXNzLWZpbGV1cGxvYWRcIiIsImV4dGVybmFsIFwiZXhwcmVzcy12YWxpZGF0b3JcIiIsImV4dGVybmFsIFwiZnNcIiIsImV4dGVybmFsIFwiaGVsbWV0XCIiLCJleHRlcm5hbCBcImkxOG5cIiIsImV4dGVybmFsIFwianNvbndlYnRva2VuXCIiLCJleHRlcm5hbCBcImtuZXhcIiIsImV4dGVybmFsIFwia25leC1kYi1tYW5hZ2VyXCIiLCJleHRlcm5hbCBcImxvZGFzaFwiIiwiZXh0ZXJuYWwgXCJtb21lbnRcIiIsImV4dGVybmFsIFwibXVzdGFjaGVcIiIsImV4dGVybmFsIFwibm9kZS1jYWNoZVwiIiwiZXh0ZXJuYWwgXCJub2RlbWFpbGVyXCIiLCJleHRlcm5hbCBcIm9iamVjdGlvblwiIiwiZXh0ZXJuYWwgXCJwYXRoXCIiLCJleHRlcm5hbCBcInVuaXFpZFwiIiwiZXh0ZXJuYWwgXCJ3aW5zdG9uXCIiXSwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJkaXN0L1wiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4iLCJcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzeXN0ZW06IHtcbiAgICBkYl9jbGllbnQ6ICdteXNxbCcsXG4gICAgZGJfaG9zdDogJzEyNy4wLjAuMScsXG4gICAgZGJfdXNlcjogJ3Jvb3QnLFxuICAgIGRiX3Bhc3N3b3JkOiAncm9vdCcsXG4gICAgZGJfbmFtZTogJ2JpZ2NhcGl0YWxfc3lzdGVtJyxcbiAgICBtaWdyYXRpb25zX2RpcjogJy4vc3JjL3N5c3RlbS9taWdyYXRpb25zJyxcbiAgfSxcbiAgdGVuYW50OiB7XG4gICAgZGJfY2xpZW50OiAnbXlzcWwnLFxuICAgIGRiX25hbWVfcHJlZml4OiAnYmlnY2FwaXRhbF90ZW5hbnRfJyxcbiAgICBkYl9ob3N0OiAnMTI3LjAuMC4xJyxcbiAgICBkYl91c2VyOiAncm9vdCcsXG4gICAgZGJfcGFzc3dvcmQ6ICdyb290JyxcbiAgICBjaGFyc2V0OiAndXRmOCcsXG4gICAgbWlncmF0aW9uc19kaXI6ICdzcmMvZGF0YWJhc2UvbWlncmF0aW9ucycsXG4gICAgc2VlZHNfZGlyOiAnc3JjL2RhdGFiYXNlL3NlZWRzJyxcbiAgfSxcbiAgbWFuYWdlcjoge1xuICAgIHN1cGVyVXNlcjogJ3Jvb3QnLFxuICAgIHN1cGVyUGFzc3dvcmQ6ICdyb290JyxcbiAgfSxcbiAgbWFpbDoge1xuICAgIGhvc3Q6ICdzbXRwLm1haWx0cmFwLmlvJyxcbiAgICBwb3J0OiA1ODcsXG4gICAgc2VjdXJlOiBmYWxzZSxcbiAgICB1c2VybmFtZTogJzg0MmYzMzFkM2RjMDA1JyxcbiAgICBwYXNzd29yZDogJzE3MmY5N2IzNGYxYTE3JyxcbiAgfVxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuXG5kb3RlbnYuY29uZmlnKHtcbiAgcGF0aDogcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52LnRlc3QnKSxcbn0pO1xuIiwiY29uc3QgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcblxuY29uc3QgY29uZmlnRW52ID0ge1xuICBjbGllbnQ6IGNvbmZpZy5zeXN0ZW0uZGJfY2xpZW50LFxuICBjb25uZWN0aW9uOiB7XG4gICAgaG9zdDogY29uZmlnLnN5c3RlbS5kYl9ob3N0LFxuICAgIHVzZXI6IGNvbmZpZy5zeXN0ZW0uZGJfdXNlcixcbiAgICBwYXNzd29yZDogY29uZmlnLnN5c3RlbS5kYl9wYXNzd29yZCxcbiAgICBkYXRhYmFzZTogY29uZmlnLnN5c3RlbS5kYl9uYW1lLFxuICAgIGNoYXJzZXQ6ICd1dGY4JyxcbiAgfSxcbiAgbWlncmF0aW9uczoge1xuICAgIGRpcmVjdG9yeTogY29uZmlnLnN5c3RlbS5taWdyYXRpb25zX2RpcixcbiAgfSxcbiAgcG9vbDogeyBtaW46IDAsIG1heDogNyB9LFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRldmVsb3BtZW50OiBjb25maWdFbnYsXG4gIHByb2R1Y3Rpb246IGNvbmZpZ0Vudixcbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCBoZWxtZXQgZnJvbSAnaGVsbWV0JztcbmltcG9ydCBib29tIGZyb20gJ2V4cHJlc3MtYm9vbSc7XG5pbXBvcnQgaTE4biBmcm9tICdpMThuJztcbmltcG9ydCByb290UGF0aCBmcm9tICdhcHAtcm9vdC1wYXRoJztcbmltcG9ydCBmaWxlVXBsb2FkIGZyb20gJ2V4cHJlc3MtZmlsZXVwbG9hZCc7XG5pbXBvcnQgJy4uL2NvbmZpZyc7XG5pbXBvcnQgJ0AvZGF0YWJhc2Uvb2JqZWN0aW9uJztcbmltcG9ydCByb3V0ZXMgZnJvbSAnQC9odHRwJztcblxuZ2xvYmFsLnJvb3RQYXRoID0gcm9vdFBhdGgucGF0aDtcblxuY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4vLyBpMThuLmNvbmZpZ3VyZSh7XG4vLyAgIGxvY2FsZXM6IFsnZW4nXSxcbi8vICAgZGlyZWN0b3J5OiBgJHtfX2Rpcm5hbWV9L3Jlc291cmNlcy9sb2NhbGVgLFxuLy8gfSk7XG5cbi8vIC8vIGkxOG4gaW5pdCBwYXJzZXMgcmVxIGZvciBsYW5ndWFnZSBoZWFkZXJzLCBjb29raWVzLCBldGMuXG4vLyBhcHAudXNlKGkxOG4uaW5pdCk7XG5cbi8vIEV4cHJlc3MgY29uZmlndXJhdGlvblxuYXBwLnNldCgncG9ydCcsIHByb2Nlc3MuZW52LlBPUlQgfHwgMzAwMCk7XG5cbmFwcC51c2UoaGVsbWV0KCkpO1xuYXBwLnVzZShib29tKCkpO1xuYXBwLnVzZShleHByZXNzLmpzb24oKSk7XG5hcHAudXNlKGZpbGVVcGxvYWQoe1xuICBjcmVhdGVQYXJlbnRQYXRoOiB0cnVlLFxufSkpO1xuXG5yb3V0ZXMoYXBwKTtcblxuZXhwb3J0IGRlZmF1bHQgYXBwO1xuIiwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXN0ZWRTZXQge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgbWV0aG9kLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtXG4gICAqL1xuICBjb25zdHJ1Y3RvcihpdGVtcywgb3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIHBhcmVudElkOiAncGFyZW50X2lkJyxcbiAgICAgIGlkOiAnaWQnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMuaXRlbXMgPSBpdGVtcyB8fCBbXTtcbiAgICB0aGlzLnRyZWUgPSB0aGlzLmxpbmtDaGlsZHJlbigpO1xuICB9XG5cbiAgc2V0SXRlbXMoaXRlbXMpIHtcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy50cmVlID0gdGhpcy5saW5rQ2hpbGRyZW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIG5vZGVzIGNoaWxkcmVuLlxuICAgKi9cbiAgbGlua0NoaWxkcmVuKCkge1xuICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA8PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBtYXAgPSB7fTtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIG1hcFtpdGVtLmlkXSA9IGl0ZW07XG4gICAgICBtYXBbaXRlbS5pZF0uY2hpbGRyZW4gPSB7fTtcbiAgICB9KTtcblxuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgcGFyZW50Tm9kZUlkID0gaXRlbVt0aGlzLm9wdGlvbnMucGFyZW50SWRdO1xuICAgICAgaWYgKHBhcmVudE5vZGVJZCkge1xuICAgICAgICBtYXBbcGFyZW50Tm9kZUlkXS5jaGlsZHJlbltpdGVtLmlkXSA9IGl0ZW07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHRvQXJyYXkoKSB7XG4gICAgY29uc3Qgc3RhY2sgPSBbXTtcbiAgICBjb25zdCB0cmVlTm9kZXMgPSB0aGlzLml0ZW1zLm1hcCgoaSkgPT4gKHsgLi4uaSB9KSk7XG5cbiAgICBjb25zdCB3YWxrID0gKG5vZGVzKSA9PiB7XG4gICAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIGlmICghbm9kZVt0aGlzLm9wdGlvbnMucGFyZW50SWRdKSB7XG4gICAgICAgICAgc3RhY2sucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuTm9kZXMgPSBPYmplY3QudmFsdWVzKG5vZGUuY2hpbGRyZW4pXG4gICAgICAgICAgICAubWFwKChpKSA9PiAoeyAuLi5pIH0pKTtcblxuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbk5vZGVzO1xuICAgICAgICAgIHdhbGsoY2hpbGRyZW5Ob2Rlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgd2Fsayh0cmVlTm9kZXMpO1xuICAgIHJldHVybiBzdGFjaztcbiAgfVxuXG4gIGdldFRyZWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJlZTtcbiAgfVxuXG4gIGdldEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMudHJlZVtpZF0gfHwgbnVsbFxuICB9XG5cbiAgZ2V0UGFyZW50cyhpZCkge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBjb25zdCBwYXJlbnRzID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIGNvbnN0IHdhbGsgPSAoX2l0ZW0pID0+IHtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xuXG4gICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgcGFyZW50cy5wdXNoKF9pdGVtKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaXRlbVt0aGlzLm9wdGlvbnMucGFyZW50SWRdKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSB0aGlzLmdldEVsZW1lbnRCeUlkKF9pdGVtW3RoaXMub3B0aW9ucy5wYXJlbnRJZF0pOyAgXG5cbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgd2FsayhwYXJlbnRJdGVtKTtcbiAgICAgIH0gICAgICBcbiAgICB9O1xuICAgIHdhbGsoaXRlbSk7XG4gICAgcmV0dXJuIHBhcmVudHM7XG4gIH1cblxuICB0b0ZsYXR0ZW5BcnJheShub2RlTWFwcGVyKSB7XG4gICAgY29uc3QgZmxhdHRlblRyZWUgPSBbXTtcblxuICAgIGNvbnN0IHRyYXZlcnNhbCA9IChub2RlcywgcGFyZW50Tm9kZSkgPT4ge1xuICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBsZXQgbm9kZU1hcHBlZCA9IG5vZGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBub2RlTWFwcGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgbm9kZU1hcHBlZCA9IG5vZGVNYXBwZXIobm9kZU1hcHBlZCwgcGFyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmxhdHRlblRyZWUucHVzaChub2RlTWFwcGVkKTtcblxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0cmF2ZXJzYWwobm9kZS5jaGlsZHJlbiwgbm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgdHJhdmVyc2FsKHRoaXMuY29sbGVjdGlvbik7XG5cbiAgICByZXR1cm4gZmxhdHRlblRyZWU7XG4gIH1cbn1cbiIsImltcG9ydCBNZXRhYmxlQ29sbGVjdGlvbiBmcm9tICdAL2xpYi9NZXRhYmxlL01ldGFibGVDb2xsZWN0aW9uJztcbmltcG9ydCBSZXNvdXJjZUZpZWxkTWV0YWRhdGEgZnJvbSAnQC9tb2RlbHMvUmVzb3VyY2VGaWVsZE1ldGFkYXRhJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzb3VyY2VGaWVsZE1ldGFkYXRhQ29sbGVjdGlvbiBleHRlbmRzIE1ldGFibGVDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIG1ldGhvZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnNldE1vZGVsKFJlc291cmNlRmllbGRNZXRhZGF0YSk7XG4gICAgdGhpcy5leHRyYUNvbHVtbnMgPSBbJ3Jlc291cmNlX2lkJywgJ3Jlc291cmNlX2l0ZW1faWQnXTtcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuZXhwb3J0IGRlZmF1bHQge1xuICAvLyBFeHBlbnNlcy5cbiAgJ2V4cGVuc2VzJzoge1xuICAgICdleHBlbnNlX2FjY291bnQnOiB7XG4gICAgICBjb2x1bW46ICcgJyxcbiAgICAgIHJlbGF0aW9uOiAnYWNjb3VudHMubmFtZScsXG4gICAgfSxcbiAgICAncGF5bWVudF9hY2NvdW50Jzoge1xuICAgICAgY29sdW1uOiAncGF5bWVudF9hY2NvdW50X2lkJyxcbiAgICAgIHJlbGF0aW9uOiAnYWNjb3VudHMuaWQnLFxuICAgIH0sXG4gICAgJ2FjY291bnRfdHlwZSc6IHtcbiAgICAgIGNvbHVtbjogJ2FjY291bnRfdHlwZV9pZCcsXG4gICAgICByZWxhdGlvbjogJ2FjY291bnRfdHlwZXMuaWQnLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gQWNjb3VudHNcbiAgJ2FjY291bnRzJzoge1xuICAgICduYW1lJzoge1xuICAgICAgY29sdW1uOiAnbmFtZScsXG4gICAgfSxcbiAgICAndHlwZSc6IHtcbiAgICAgIGNvbHVtbjogJ2FjY291bnRfdHlwZV9pZCcsXG4gICAgICByZWxhdGlvbjogJ2FjY291bnRfdHlwZXMuaWQnLFxuICAgICAgcmVsYXRpb25Db2x1bW46ICdhY2NvdW50X3R5cGVzLmlkJyxcbiAgICB9LFxuICAgICdkZXNjcmlwdGlvbic6IHtcbiAgICAgIGNvbHVtbjogJ2Rlc2NyaXB0aW9uJyxcbiAgICB9LFxuICAgICdjb2RlJzoge1xuICAgICAgY29sdW1uOiAnY29kZScsXG4gICAgfSxcbiAgICAncm9vdF90eXBlJzoge1xuICAgICAgY29sdW1uOiAnYWNjb3VudF90eXBlX2lkJyxcbiAgICAgIHJlbGF0aW9uOiAnYWNjb3VudF90eXBlcy5pZCcsXG4gICAgICByZWxhdGlvbkNvbHVtbjogJ2FjY291bnRfdHlwZXMucm9vdF90eXBlJyxcbiAgICB9LFxuICAgICdjcmVhdGVkX2F0Jzoge1xuICAgICAgY29sdW1uOiAnY3JlYXRlZF9hdCcsXG4gICAgfSxcbiAgfSxcblxuICAvLyBJdGVtc1xuICAnaXRlbXMnOiB7XG4gICAgJ3R5cGUnOiB7XG4gICAgICBjb2x1bW46ICd0eXBlJyxcbiAgICB9LFxuICAgICduYW1lJzoge1xuICAgICAgY29sdW1uOiAnbmFtZScsXG4gICAgfSxcbiAgfSxcblxuICAvLyBNYW51YWwgSm91cm5hbHNcbiAgJ21hbnVhbF9qb3VybmFscyc6IHtcbiAgICAndHlwZSc6IHtcbiAgICAgIGNvbHVtbjogJ3RyYW5zYWN0aW9uX3R5cGUnLFxuICAgIH0sXG4gICAgJ3N0YXR1cyc6IHtcbiAgICAgIGNvbHVtbjogJ3N0YXR1cycsXG4gICAgfSxcbiAgICAnZGF0ZSc6IHtcbiAgICAgIGNvbHVtbjogJ2RhdGUnLFxuICAgIH0sXG4gICAgJ2pvdXJuYWxfbnVtYmVyJzoge1xuICAgICAgY29sdW1uOiAnam91cm5hbF9udW1iZXInLFxuICAgIH0sXG4gICAgJ2Ftb3VudCc6IHtcbiAgICAgIGNvbHVtbjogJ2Ftb3VudCcsXG4gICAgfSxcbiAgICAnY3JlYXRlZF9hdCc6IHtcbiAgICAgIGNvbHVtbjogJ2NyZWF0ZWRfYXQnLFxuICAgIH0sXG4gIH1cbn07XG4iLCJcblxuZXhwb3J0IGRlZmF1bHQge1xuICBvcmdhbml6YXRpb246IFtcbiAgICB7XG4gICAgICBrZXk6ICduYW1lJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnYmFzZV9jdXJyZW5jeScsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2luZHVzdHJ5JyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnbG9jYXRpb24nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdmaXNjYWxfeWVhcicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2xhbmd1YWdlJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIH0sXG4gICAgeyBcbiAgICAgIGtleTogJ3RpbWVfem9uZScsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2RhdGVfZm9ybWF0JyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIH0sXG4gIF0sXG59OyIsImltcG9ydCBLbmV4IGZyb20gJ2tuZXgnO1xuaW1wb3J0IHsga25leFNuYWtlQ2FzZU1hcHBlcnMgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IGtuZXhmaWxlIGZyb20gJ0AvLi4vY29uZmlnL3N5c3RlbUtuZXhmaWxlJztcblxuY29uc3QgY29uZmlnID0ga25leGZpbGVbcHJvY2Vzcy5lbnYuTk9ERV9FTlZdO1xuXG5jb25zdCBrbmV4ID0gS25leCh7XG4gIC4uLmNvbmZpZyxcbiAgLi4ua25leFNuYWtlQ2FzZU1hcHBlcnMoeyB1cHBlckNhc2U6IHRydWUgfSksXG59KTtcblxuZXhwb3J0IGRlZmF1bHQga25leDtcbiIsImltcG9ydCBrbmV4TWFuYWdlciBmcm9tICdrbmV4LWRiLW1hbmFnZXInO1xuaW1wb3J0IGtuZXhmaWxlIGZyb20gJ0AvLi4vY29uZmlnL3N5c3RlbUtuZXhmaWxlJztcbmltcG9ydCBjb25maWcgZnJvbSAnQC8uLi9jb25maWcvY29uZmlnJztcblxuY29uc3Qga25leENvbmZpZyA9IGtuZXhmaWxlW3Byb2Nlc3MuZW52Lk5PREVfRU5WXTtcblxuY29uc3QgZGJNYW5hZ2VyID0ga25leE1hbmFnZXIuZGF0YWJhc2VNYW5hZ2VyRmFjdG9yeSh7XG4gIGtuZXg6IGtuZXhDb25maWcsXG4gIGRiTWFuYWdlcjoge1xuICAgIGNvbGxhdGU6IFtdLFxuICAgIHN1cGVyVXNlcjogY29uZmlnLm1hbmFnZXIuc3VwZXJVc2VyLFxuICAgIHN1cGVyUGFzc3dvcmQ6IGNvbmZpZy5tYW5hZ2VyLnN1cGVyUGFzc3dvcmQsXG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGJNYW5hZ2VyOyIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBrbmV4IGZyb20gJ0AvZGF0YWJhc2Uva25leCc7XG5cbi8vIEJpbmQgYWxsIE1vZGVscyB0byBhIGtuZXggaW5zdGFuY2UuIElmIHlvdSBvbmx5IGhhdmUgb25lIGRhdGFiYXNlIGluXG4vLyB5b3VyIHNlcnZlciB0aGlzIGlzIGFsbCB5b3UgaGF2ZSB0byBkby4gRm9yIG11bHRpIGRhdGFiYXNlIHN5c3RlbXMsIHNlZVxuLy8gdGhlIE1vZGVsLmJpbmRLbmV4KCkgbWV0aG9kLlxuTW9kZWwua25leChrbmV4KTtcbiIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLFxuICAgICAgdGhpcy5nZXRBY2NvdW50VHlwZXNMaXN0LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5nZXRBY2NvdW50VHlwZXNMaXN0LmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGFjY291bnRzIHR5cGVzIGxpc3QuXG4gICAqL1xuICBnZXRBY2NvdW50VHlwZXNMaXN0OiB7XG4gICAgdmFsaWRhdGlvbjogW10sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBBY2NvdW50VHlwZSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGFjY291bnRUeXBlcyA9IGF3YWl0IEFjY291bnRUeXBlLnF1ZXJ5KCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIGFjY291bnRfdHlwZXM6IGFjY291bnRUeXBlcyxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgY2hlY2ssIHF1ZXJ5LCB2YWxpZGF0aW9uUmVzdWx0LCBwYXJhbSB9IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgZGlmZmVyZW5jZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgSm91cm5hbFBvc3RlciBmcm9tICdAL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbFBvc3Rlcic7XG5pbXBvcnQgSm91cm5hbEVudHJ5IGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsRW50cnknO1xuaW1wb3J0IHtcbiAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHMsXG4gIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyLFxufSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcbmltcG9ydCB7XG4gIER5bmFtaWNGaWx0ZXIsXG4gIER5bmFtaWNGaWx0ZXJTb3J0QnksXG4gIER5bmFtaWNGaWx0ZXJWaWV3cyxcbiAgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzLFxufSBmcm9tICdAL2xpYi9EeW5hbWljRmlsdGVyJztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy9tYW51YWwtam91cm5hbHMvOmlkJyxcbiAgICAgIHRoaXMuZ2V0TWFudWFsSm91cm5hbC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0TWFudWFsSm91cm5hbC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvbWFudWFsLWpvdXJuYWxzJyxcbiAgICAgIHRoaXMubWFudWFsSm91cm5hbHMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLm1hbnVhbEpvdXJuYWxzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvbWFrZS1qb3VybmFsLWVudHJpZXMnLFxuICAgICAgdGhpcy52YWxpZGF0ZU1lZGlhSWRzLFxuICAgICAgdGhpcy52YWxpZGF0ZUNvbnRhY3RFbnRyaWVzLFxuICAgICAgdGhpcy5tYWtlSm91cm5hbEVudHJpZXMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLm1ha2VKb3VybmFsRW50cmllcy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL21hbnVhbC1qb3VybmFscy86aWQvcHVibGlzaCcsXG4gICAgICB0aGlzLnB1Ymxpc2hNYW51YWxKb3VybmFsLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5wdWJsaXNoTWFudWFsSm91cm5hbC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL21hbnVhbC1qb3VybmFscy86aWQnLFxuICAgICAgdGhpcy52YWxpZGF0ZU1lZGlhSWRzLFxuICAgICAgdGhpcy52YWxpZGF0ZUNvbnRhY3RFbnRyaWVzLFxuICAgICAgdGhpcy5lZGl0TWFudWFsSm91cm5hbC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdE1hbnVhbEpvdXJuYWwuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmRlbGV0ZSgnL21hbnVhbC1qb3VybmFscy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVNYW51YWxKb3VybmFsLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVNYW51YWxKb3VybmFsLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy9tYW51YWwtam91cm5hbHMnLFxuICAgICAgdGhpcy5kZWxldGVCdWxrTWFudWFsSm91cm5hbHMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmRlbGV0ZUJ1bGtNYW51YWxKb3VybmFscy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL3JlY3VycmluZy1qb3VybmFsLWVudHJpZXMnLFxuICAgICAgdGhpcy5yZWN1cnJpbmdKb3VybmFsRW50cmllcy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucmVjdXJyaW5nSm91cm5hbEVudHJpZXMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJ3F1aWNrLWpvdXJuYWwtZW50cmllcycsXG4gICAgICB0aGlzLnF1aWNrSm91cm5hbEVudHJpZXMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnF1aWNrSm91cm5hbEVudHJpZXMuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgbWFudWFsIGpvdXJuYWxzLFxuICAgKi9cbiAgbWFudWFsSm91cm5hbHM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnY3VzdG9tX3ZpZXdfaWQnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzJykub3B0aW9uYWwoKS5pc0pTT04oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGZpbHRlcl9yb2xlczogW10sXG4gICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIHBhZ2Vfc2l6ZTogOTk5LFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgaWYgKGZpbHRlci5zdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMpIHtcbiAgICAgICAgZmlsdGVyLmZpbHRlcl9yb2xlcyA9IEpTT04ucGFyc2UoZmlsdGVyLnN0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcyk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IFJlc291cmNlLCBWaWV3LCBNYW51YWxKb3VybmFsIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcbiAgICAgIGNvbnN0IG1hbnVhbEpvdXJuYWxzUmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbmFtZScsICdtYW51YWxfam91cm5hbHMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghbWFudWFsSm91cm5hbHNSZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTF9KT1VSTkFMUy5SRVNPVVJDRS5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2aWV3ID0gYXdhaXQgVmlldy5xdWVyeSgpLm9uQnVpbGQoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlci5jdXN0b21fdmlld19pZCkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2lkJywgZmlsdGVyLmN1c3RvbV92aWV3X2lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdmYXZvdXJpdGUnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBidWlsZGVyLndoZXJlKCdyZXNvdXJjZV9pZCcsIG1hbnVhbEpvdXJuYWxzUmVzb3VyY2UuaWQpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ3JvbGVzLmZpZWxkJyk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgnY29sdW1ucycpO1xuICAgICAgICBidWlsZGVyLmZpcnN0KCk7XG4gICAgICAgIGJ1aWxkZXIucmVtZW1iZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXNvdXJjZUZpZWxkc0tleXMgPSBtYW51YWxKb3VybmFsc1Jlc291cmNlLmZpZWxkcy5tYXAoKGMpID0+IGMua2V5KTtcbiAgICAgIGNvbnN0IGR5bmFtaWNGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlcihNYW51YWxKb3VybmFsLnRhYmxlTmFtZSk7XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggdmlldyByb2xlcy5cbiAgICAgIGlmICh2aWV3ICYmIHZpZXcucm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2aWV3RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJWaWV3cyhcbiAgICAgICAgICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyh2aWV3LnJvbGVzKSxcbiAgICAgICAgICB2aWV3LnJvbGVzTG9naWNFeHByZXNzaW9uLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXZpZXdGaWx0ZXIudmFsaWRhdGVGaWx0ZXJSb2xlcygpKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnVklFVy5MT0dJQy5FWFBSRVNTSU9OLklOVkFMSUQnLCBjb2RlOiA0MDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZHluYW1pY0ZpbHRlci5zZXRGaWx0ZXIodmlld0ZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggZmlsdGVyIHJvbGVzLlxuICAgICAgaWYgKGZpbHRlci5maWx0ZXJfcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgYWNjb3VudHMgcmVzb3VyY2UgZmllbGRzLlxuICAgICAgICBjb25zdCBmaWx0ZXJSb2xlcyA9IG5ldyBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMoXG4gICAgICAgICAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIoZmlsdGVyLmZpbHRlcl9yb2xlcyksXG4gICAgICAgICAgbWFudWFsSm91cm5hbHNSZXNvdXJjZS5maWVsZHMsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKGZpbHRlclJvbGVzKTtcblxuICAgICAgICBpZiAoZmlsdGVyUm9sZXMudmFsaWRhdGVGaWx0ZXJSb2xlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdNQU5VQUwuSk9VUk5BTC5IQVMuTk8uRklFTERTJywgY29kZTogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGNvbHVtbiBzb3J0IG9yZGVyLlxuICAgICAgaWYgKGZpbHRlci5jb2x1bW5fc29ydF9vcmRlcikge1xuICAgICAgICBpZiAocmVzb3VyY2VGaWVsZHNLZXlzLmluZGV4T2YoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSA9PT0gLTEpIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdDT0xVTU4uU09SVC5PUkRFUi5OT1QuRk9VTkQnLCBjb2RlOiAzMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydEJ5RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJTb3J0QnkoXG4gICAgICAgICAgZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyLFxuICAgICAgICAgIGZpbHRlci5zb3J0X29yZGVyLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihzb3J0QnlGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgLy8gTWFudWFsIGpvdXJuYWxzLlxuICAgICAgY29uc3QgbWFudWFsSm91cm5hbHMgPSBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBkeW5hbWljRmlsdGVyLmJ1aWxkUXVlcnkoKShidWlsZGVyKTtcbiAgICAgIH0pLnBhZ2luYXRpb24oZmlsdGVyLnBhZ2UgLSAxLCBmaWx0ZXIucGFnZV9zaXplKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgbWFudWFsSm91cm5hbHMsXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBtZWRpYSBpZHMuXG4gICAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxIC1cbiAgICogQHBhcmFtIHtSZXNwb25zZX0gcmVzIC1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dCAtXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZU1lZGlhSWRzKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgY29uc3QgZm9ybSA9IHsgbWVkaWFfaWRzOiBbXSwgLi4ucmVxLmJvZHkgfTtcbiAgICBjb25zdCB7IE1lZGlhIH0gPSByZXEubW9kZWxzO1xuICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgLy8gVmFsaWRhdGUgaWYgbWVkaWEgaWRzIHdhcyBub3QgYWxyZWFkeSBleGlzdHMgb24gdGhlIHN0b3JhZ2UuXG4gICAgaWYgKGZvcm0ubWVkaWFfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHN0b3JlZE1lZGlhID0gYXdhaXQgTWVkaWEucXVlcnkoKS53aGVyZUluKCdpZCcsIGZvcm0ubWVkaWFfaWRzKTtcbiAgICAgIGNvbnN0IG5vdEZvdW5kTWVkaWEgPSBkaWZmZXJlbmNlKGZvcm0ubWVkaWFfaWRzLCBzdG9yZWRNZWRpYS5tYXAoKG0pID0+IG0uaWQpKTtcbiAgICAgIFxuICAgICAgaWYgKG5vdEZvdW5kTWVkaWEubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdNRURJQS5JRFMuTk9ULkZPVU5EJywgY29kZTogNDAwLCBpZHM6IG5vdEZvdW5kTWVkaWEgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcS5lcnJvclJlYXNvbnMgPSBBcnJheS5pc0FycmF5KHJlcS5lcnJvclJlYXNvbnMpICYmIHJlcS5lcnJvclJlYXNvbnMubGVuZ3RoXG4gICAgICA/IHJlcS5lcnJvclJlYXNvbnMucHVzaCguLi5lcnJvclJlYXNvbnMpIDogZXJyb3JSZWFzb25zO1xuICAgIG5leHQoKTsgXG4gIH0sXG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGZvcm0gZW50cmllcyB3aXRoIGNvbnRhY3QgY3VzdG9tZXJzIGFuZCB2ZW5kb3JzLiBcbiAgICogQHBhcmFtIHtSZXF1ZXN0fSByZXEgXG4gICAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlcyBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dCBcbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlQ29udGFjdEVudHJpZXMocmVxLCByZXMsIG5leHQpIHtcbiAgICBjb25zdCBmb3JtID0geyBlbnRyaWVzOiBbXSwgLi4ucmVxLmJvZHkgfTtcbiAgICBjb25zdCB7IEFjY291bnRUeXBlLCBWZW5kb3IsIEN1c3RvbWVyIH0gPSByZXEubW9kZWxzO1xuICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGVudHJpZXMgY29udGFjdCB0eXBlIGFuZCBpZHMuXG4gICAgY29uc3QgY3VzdG9tZXJzQ29udGFjdHMgPSBmb3JtLmVudHJpZXMuZmlsdGVyKGUgPT4gZS5jb250YWN0X3R5cGUgPT09ICdjdXN0b21lcicpO1xuICAgIGNvbnN0IHZlbmRvcnNDb250YWN0cyA9IGZvcm0uZW50cmllcy5maWx0ZXIoZSA9PiBlLmNvbnRhY3RfdHlwZSA9PT0gJ3ZlbmRvcicpO1xuXG4gICAgY29uc3QgYWNjb3VudHNUeXBlcyA9IGF3YWl0IEFjY291bnRUeXBlLnF1ZXJ5KCk7XG4gIFxuICAgIGNvbnN0IHBheWFibGVBY2NvdW50c1R5cGUgPSBhY2NvdW50c1R5cGVzLmZpbmQodCA9PiB0LmtleSA9PT0gJ2FjY291bnRzX3BheWFibGUnKTs7XG4gICAgY29uc3QgcmVjZWl2YWJsZUFjY291bnRzVHlwZSA9IGFjY291bnRzVHlwZXMuZmluZCh0ID0+IHQua2V5ID09PSAnYWNjb3VudHNfcmVjZWl2YWJsZScpO1xuXG4gICAgLy8gVmFsaWRhdGUgY3VzdG9tZXJzIGNvbnRhY3RzLlxuICAgIGlmIChjdXN0b21lcnNDb250YWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXN0b21lcnNDb250YWN0c0lkcyA9IGN1c3RvbWVyc0NvbnRhY3RzLm1hcChjID0+IGMuY29udGFjdF9pZCk7XG4gICAgICBjb25zdCBzdG9yZWRDb250YWN0cyA9IGF3YWl0IEN1c3RvbWVyLnF1ZXJ5KCkud2hlcmVJbignaWQnLCBjdXN0b21lcnNDb250YWN0c0lkcyk7XG5cbiAgICAgIGNvbnN0IHN0b3JlZENvbnRhY3RzSWRzID0gc3RvcmVkQ29udGFjdHMubWFwKGMgPT4gYy5pZCk7XG4gICAgICBjb25zdCBmb3JtRW50cmllc0N1c3RvbWVyc0lkcyA9IGZvcm0uZW50cmllcy5maWx0ZXIoZSA9PiBlLmNvbnRhY3RfdHlwZSA9PT0gJ2N1c3RvbWVyJyk7XG5cbiAgICAgIGNvbnN0IG5vdEZvdW5kQ29udGFjdHNJZHMgPSBkaWZmZXJlbmNlKFxuICAgICAgICBmb3JtRW50cmllc0N1c3RvbWVyc0lkcy5tYXAoYyA9PiBjLmNvbnRhY3RfaWQpLFxuICAgICAgICBzdG9yZWRDb250YWN0c0lkcyxcbiAgICAgICk7XG4gICAgICBpZiAobm90Rm91bmRDb250YWN0c0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NVU1RPTUVSUy5DT05UQUNUUy5OT1QuRk9VTkQnLCBjb2RlOiA1MDAsIGlkczogbm90Rm91bmRDb250YWN0c0lkcyB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm90UmVjZWl2YWJsZUFjY291bnRzID0gZm9ybUVudHJpZXNDdXN0b21lcnNJZHMuZmlsdGVyKFxuICAgICAgICBjID0+IHJlY2VpdmFibGVBY2NvdW50c1R5cGUgJiYgYy5jb250YWN0X2lkICE9PSByZWNlaXZhYmxlQWNjb3VudHNUeXBlLmlkKTtcbiAgICAgIFxuICAgICAgaWYgKG5vdFJlY2VpdmFibGVBY2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnQ1VTVE9NRVJTLkFDQ09VTlRTLk5PVC5SRUNFSVZBQkxFLlRZUEUnLFxuICAgICAgICAgIGNvZGU6IDcwMCxcbiAgICAgICAgICBpbmRleGVzOiBub3RSZWNlaXZhYmxlQWNjb3VudHMubWFwKGEgPT4gYS5pbmRleCksXG4gICAgICAgIH0pO1xuICAgICAgfSBcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB2ZW5kb3JzIGNvbnRhY3RzLlxuICAgIGlmICh2ZW5kb3JzQ29udGFjdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdmVuZG9yc0NvbnRhY3RzSWRzID0gdmVuZG9yc0NvbnRhY3RzLm1hcChjID0+IGMuY29udGFjdF9pZCk7XG4gICAgICBjb25zdCBzdG9yZWRDb250YWN0cyA9IGF3YWl0IFZlbmRvci5xdWVyeSgpLndoZXJlKCdpZCcsIHZlbmRvcnNDb250YWN0c0lkcyk7XG5cbiAgICAgIGNvbnN0IHN0b3JlZENvbnRhY3RzSWRzID0gc3RvcmVkQ29udGFjdHMubWFwKGMgPT4gYy5pZCk7XG4gICAgICBjb25zdCBmb3JtRW50cmllc1ZlbmRvcnNJZHMgPSBmb3JtLmVudHJpZXMuZmlsdGVyKGUgPT4gZS5jb250YWN0X3R5cGUgPT09ICd2ZW5kb3InKTtcblxuICAgICAgY29uc3Qgbm90Rm91bmRDb250YWN0c0lkcyA9IGRpZmZlcmVuY2UoXG4gICAgICAgIGZvcm1FbnRyaWVzVmVuZG9yc0lkcy5tYXAodiA9PiB2LmNvbnRhY3RfaWQpLFxuICAgICAgICBzdG9yZWRDb250YWN0c0lkcyxcbiAgICAgICk7XG4gICAgICBpZiAobm90Rm91bmRDb250YWN0c0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnVkVORE9SUy5DT05UQUNUUy5OT1QuRk9VTkQnLCBjb2RlOiA2MDAsIGlkczogbm90Rm91bmRDb250YWN0c0lkcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3RQYXlhYmxlQWNjb3VudHMgPSBmb3JtRW50cmllc1ZlbmRvcnNJZHMuZmlsdGVyKFxuICAgICAgICB2ID0+IHBheWFibGVBY2NvdW50c1R5cGUgJiYgdi5jb250YWN0X2lkID09PSBwYXlhYmxlQWNjb3VudHNUeXBlLmlkXG4gICAgICApO1xuICAgICAgaWYgKG5vdFBheWFibGVBY2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnVkVORE9SUy5BQ0NPVU5UUy5OT1QuUEFZQUJMRS5UWVBFJyxcbiAgICAgICAgICBjb2RlOiA4MDAsXG4gICAgICAgICAgaW5kZXhlczogbm90UGF5YWJsZUFjY291bnRzLm1hcChhID0+IGEuaW5kZXgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmVxLmVycm9yUmVhc29ucyA9IEFycmF5LmlzQXJyYXkocmVxLmVycm9yUmVhc29ucykgJiYgcmVxLmVycm9yUmVhc29ucy5sZW5ndGhcbiAgICAgID8gcmVxLmVycm9yUmVhc29ucy5wdXNoKC4uLmVycm9yUmVhc29ucykgOiBlcnJvclJlYXNvbnM7XG5cbiAgICBuZXh0KCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE1ha2Ugam91cm5hbCBlbnRyaXJlcy5cbiAgICovXG4gIG1ha2VKb3VybmFsRW50cmllczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCdkYXRlJykuZXhpc3RzKCkuaXNJU084NjAxKCksXG4gICAgICBjaGVjaygnam91cm5hbF9udW1iZXInKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygndHJhbnNhY3Rpb25fdHlwZScpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3JlZmVyZW5jZScpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSksXG4gICAgICBjaGVjaygnZGVzY3JpcHRpb24nKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdzdGF0dXMnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgY2hlY2soJ2VudHJpZXMnKS5pc0FycmF5KHsgbWluOiAyIH0pLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLmNyZWRpdCcpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouZGViaXQnKS5vcHRpb25hbCh7IG51bGxhYmxlOiB0cnVlIH0pLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLmFjY291bnRfaWQnKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5ub3RlJykub3B0aW9uYWwoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouY29udGFjdF9pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouY29udGFjdF90eXBlJykub3B0aW9uYWwoKS5pc0luKFsndmVuZG9yJywgJ2N1c3RvbWVyJ10pLFxuICAgICAgY2hlY2soJ21lZGlhX2lkcycpLm9wdGlvbmFsKCkuaXNBcnJheSgpLFxuICAgICAgY2hlY2soJ21lZGlhX2lkcy4qJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB0cmFuc2FjdGlvbl90eXBlOiAnam91cm5hbCcsXG4gICAgICAgIHJlZmVyZW5jZTogJycsXG4gICAgICAgIG1lZGlhX2lkczogW10sXG4gICAgICAgIC4uLnJlcS5ib2R5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgTWFudWFsSm91cm5hbCxcbiAgICAgICAgQWNjb3VudCxcbiAgICAgICAgTWVkaWFMaW5rLFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGxldCB0b3RhbENyZWRpdCA9IDA7XG4gICAgICBsZXQgdG90YWxEZWJpdCA9IDA7XG5cbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gWy4uLihyZXEuZXJyb3JSZWFzb25zIHx8IFtdKV07XG4gICAgICBjb25zdCBlbnRyaWVzID0gZm9ybS5lbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IChlbnRyeS5jcmVkaXQgfHwgZW50cnkuZGViaXQpKTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSBtb21lbnQoZm9ybS5kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcblxuICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICBpZiAoZW50cnkuY3JlZGl0ID4gMCkge1xuICAgICAgICAgIHRvdGFsQ3JlZGl0ICs9IGVudHJ5LmNyZWRpdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuZGViaXQgPiAwKSB7XG4gICAgICAgICAgdG90YWxEZWJpdCArPSBlbnRyeS5kZWJpdDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAodG90YWxDcmVkaXQgPD0gMCB8fCB0b3RhbERlYml0IDw9IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdDUkVESVQuREVCSVQuU1VNQVRJT04uU0hPVUxELk5PVC5FUVVBTC5aRVJPJyxcbiAgICAgICAgICBjb2RlOiA0MDAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRvdGFsQ3JlZGl0ICE9PSB0b3RhbERlYml0KSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NSRURJVC5ERUJJVC5OT1QuRVFVQUxTJywgY29kZTogMTAwIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybUVudHJpZXNBY2NvdW50c0lkcyA9IGVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkuYWNjb3VudF9pZCk7XG4gICAgICBjb25zdCBmb3JtRW50cmllc0NvbnRhY3RzSWRzID0gZW50cmllcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5jb250YWN0X2lkKTtcblxuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ2lkJywgZm9ybUVudHJpZXNBY2NvdW50c0lkcylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3R5cGUnKVxuICAgICAgICAucmVtZW1iZXIoKTtcblxuICAgICAgY29uc3Qgc3RvcmVkQWNjb3VudHNJZHMgPSBhY2NvdW50cy5tYXAoKGFjY291bnQpID0+IGFjY291bnQuaWQpO1xuXG5cbiAgICAgIGlmIChkaWZmZXJlbmNlKGZvcm1FbnRyaWVzQWNjb3VudHNJZHMsIHN0b3JlZEFjY291bnRzSWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0FDQ09VTlRTLklEUy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGpvdXJuYWxOdW1iZXIgPSBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdqb3VybmFsX251bWJlcicsIGZvcm0uam91cm5hbF9udW1iZXIpO1xuXG4gICAgICBpZiAoam91cm5hbE51bWJlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0pPVVJOQUwuTlVNQkVSLkFMUkVBRFkuRVhJU1RTJywgY29kZTogMzAwIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICAvLyBTYXZlIG1hbnVhbCBqb3VybmFsIHRhbnNhY3Rpb24uXG4gICAgICBjb25zdCBtYW51YWxKb3VybmFsID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgIHJlZmVyZW5jZTogZm9ybS5yZWZlcmVuY2UsXG4gICAgICAgIHRyYW5zYWN0aW9uX3R5cGU6ICdKb3VybmFsJyxcbiAgICAgICAgam91cm5hbF9udW1iZXI6IGZvcm0uam91cm5hbF9udW1iZXIsXG4gICAgICAgIGFtb3VudDogdG90YWxDcmVkaXQsXG4gICAgICAgIGRhdGU6IGZvcm1hdHRlZERhdGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBmb3JtLmRlc2NyaXB0aW9uLFxuICAgICAgICBzdGF0dXM6IGZvcm0uc3RhdHVzLFxuICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzRGVwR3JhcGggPSBhd2FpdCBBY2NvdW50LmRlcEdyYXBoKCkucXVlcnkoKTtcbiAgICAgIGNvbnN0IGpvdXJuYWxQb3N0ZXIgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0RlcEdyYXBoKTtcblxuICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICBjb25zdCBhY2NvdW50ID0gYWNjb3VudHMuZmluZCgoYSkgPT4gYS5pZCA9PT0gZW50cnkuYWNjb3VudF9pZCk7XG4gICAgICAgIGNvbnN0IGpvdXJhbmxFbnRyeSA9IG5ldyBKb3VybmFsRW50cnkoe1xuICAgICAgICAgIGRlYml0OiBlbnRyeS5kZWJpdCxcbiAgICAgICAgICBjcmVkaXQ6IGVudHJ5LmNyZWRpdCxcbiAgICAgICAgICBhY2NvdW50OiBhY2NvdW50LmlkLFxuICAgICAgICAgIHJlZmVyZW5jZVR5cGU6ICdKb3VybmFsJyxcbiAgICAgICAgICByZWZlcmVuY2VJZDogbWFudWFsSm91cm5hbC5pZCxcbiAgICAgICAgICBhY2NvdW50Tm9ybWFsOiBhY2NvdW50LnR5cGUubm9ybWFsLFxuICAgICAgICAgIGNvbnRhY3RUeXBlOiBlbnRyeS5jb250YWN0X3R5cGUsXG4gICAgICAgICAgY29udGFjdElkOiBlbnRyeS5jb250YWN0X2lkLFxuICAgICAgICAgIG5vdGU6IGVudHJ5Lm5vdGUsXG4gICAgICAgICAgZGF0ZTogZm9ybWF0dGVkRGF0ZSxcbiAgICAgICAgICB1c2VySWQ6IHVzZXIuaWQsXG4gICAgICAgICAgZHJhZnQ6ICFmb3JtLnN0YXR1cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlbnRyeS5kZWJpdCkge1xuICAgICAgICAgIGpvdXJuYWxQb3N0ZXIuZGViaXQoam91cmFubEVudHJ5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqb3VybmFsUG9zdGVyLmNyZWRpdChqb3VyYW5sRW50cnkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU2F2ZSBsaW5rZWQgbWVkaWEgdG8gdGhlIGpvdXJuYWwgbW9kZWwuXG4gICAgICBjb25zdCBidWxrU2F2ZU1lZGlhTGluayA9IFtdO1xuXG4gICAgICBmb3JtLm1lZGlhX2lkcy5mb3JFYWNoKChtZWRpYUlkKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wZXIgPSBNZWRpYUxpbmsucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIG1vZGVsX25hbWU6ICdKb3VybmFsJyxcbiAgICAgICAgICBtb2RlbF9pZDogbWFudWFsSm91cm5hbC5pZCxcbiAgICAgICAgICBtZWRpYV9pZDogbWVkaWFJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGJ1bGtTYXZlTWVkaWFMaW5rLnB1c2gob3Blcik7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2F2ZXMgdGhlIGpvdXJuYWwgZW50cmllcyBhbmQgYWNjb3VudHMgYmFsYW5jZSBjaGFuZ2VzLlxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAuLi5idWxrU2F2ZU1lZGlhTGluayxcbiAgICAgICAgam91cm5hbFBvc3Rlci5zYXZlRW50cmllcygpLFxuICAgICAgICAoZm9ybS5zdGF0dXMpICYmIGpvdXJuYWxQb3N0ZXIuc2F2ZUJhbGFuY2UoKSxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWQ6IG1hbnVhbEpvdXJuYWwuaWQgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogU2F2ZXMgcmVjdXJyaW5nIGpvdXJuYWwgZW50cmllcyB0ZW1wbGF0ZS5cbiAgICovXG4gIHJlY3VycmluZ0pvdXJuYWxFbnRyaWVzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ3RlbXBsYXRlX25hbWUnKS5leGlzdHMoKSxcbiAgICAgIGNoZWNrKCdyZWN1cnJlbmNlJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygnYWN0aXZlJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzJykuaXNBcnJheSh7IG1pbjogMSB9KSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouY3JlZGl0JykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouZGViaXQnKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5hY2NvdW50X2lkJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLioubm90ZScpLm9wdGlvbmFsKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIGdpdmVuIG1hbnVhbCBqb3VybmFsLlxuICAgKi9cbiAgZWRpdE1hbnVhbEpvdXJuYWw6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2RhdGUnKS5leGlzdHMoKS5pc0lTTzg2MDEoKSxcbiAgICAgIGNoZWNrKCdqb3VybmFsX251bWJlcicpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCd0cmFuc2FjdGlvbl90eXBlJykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygncmVmZXJlbmNlJykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KSxcbiAgICAgIGNoZWNrKCdkZXNjcmlwdGlvbicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2VudHJpZXMnKS5pc0FycmF5KHsgbWluOiAyIH0pLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5jcmVkaXQnKS5vcHRpb25hbCh7IG51bGxhYmxlOiB0cnVlIH0pLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLmRlYml0Jykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5hY2NvdW50X2lkJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouY29udGFjdF9pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouY29udGFjdF90eXBlJykub3B0aW9uYWwoKS5pc0luKFsndmVuZG9yJywgJ2N1c3RvbWVyJ10pLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLm5vdGUnKS5vcHRpb25hbCgpLFxuICAgICAgY2hlY2soJ21lZGlhX2lkcycpLm9wdGlvbmFsKCkuaXNBcnJheSgpLFxuICAgICAgY2hlY2soJ21lZGlhX2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB0cmFuc2FjdGlvbl90eXBlOiAnam91cm5hbCcsXG4gICAgICAgIHJlZmVyZW5jZTogJycsXG4gICAgICAgIG1lZGlhX2lkczogW10sXG4gICAgICAgIC4uLnJlcS5ib2R5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIE1hbnVhbEpvdXJuYWwsIEFjY291bnRUcmFuc2FjdGlvbiwgQWNjb3VudCwgTWVkaWEsIE1lZGlhTGluayxcbiAgICAgIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBtYW51YWxKb3VybmFsID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ21lZGlhJykuZmlyc3QoKTtcblxuICAgICAgaWYgKCFtYW51YWxKb3VybmFsKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTC5KT1VSTkFMLk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsZXQgdG90YWxDcmVkaXQgPSAwO1xuICAgICAgbGV0IHRvdGFsRGViaXQgPSAwO1xuXG4gICAgICBjb25zdCB7IHVzZXIgfSA9IHJlcTtcbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFsuLi4ocmVxLmVycm9yUmVhc29ucyB8fCBbXSldO1xuICAgICAgY29uc3QgZW50cmllcyA9IGZvcm0uZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiAoZW50cnkuY3JlZGl0IHx8IGVudHJ5LmRlYml0KSk7XG4gICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gbW9tZW50KGZvcm0uZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG5cbiAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgaWYgKGVudHJ5LmNyZWRpdCA+IDApIHtcbiAgICAgICAgICB0b3RhbENyZWRpdCArPSBlbnRyeS5jcmVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5LmRlYml0ID4gMCkge1xuICAgICAgICAgIHRvdGFsRGViaXQgKz0gZW50cnkuZGViaXQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHRvdGFsQ3JlZGl0IDw9IDAgfHwgdG90YWxEZWJpdCA8PSAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnQ1JFRElULkRFQklULlNVTUFUSU9OLlNIT1VMRC5OT1QuRVFVQUwuWkVSTycsXG4gICAgICAgICAgY29kZTogNDAwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbENyZWRpdCAhPT0gdG90YWxEZWJpdCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdDUkVESVQuREVCSVQuTk9ULkVRVUFMUycsIGNvZGU6IDEwMCB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpvdXJuYWxOdW1iZXIgPSBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdqb3VybmFsX251bWJlcicsIGZvcm0uam91cm5hbF9udW1iZXIpXG4gICAgICAgIC53aGVyZU5vdCgnaWQnLCBpZClcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmIChqb3VybmFsTnVtYmVyKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0pPVVJOQUwuTlVNQkVSLkFMUkVBRFkuRVhJU1RTJywgY29kZTogMzAwIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudHNJZHMgPSBlbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5LmFjY291bnRfaWQpO1xuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBhY2NvdW50c0lkcylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3R5cGUnKTtcblxuICAgICAgY29uc3Qgc3RvcmVkQWNjb3VudHNJZHMgPSBhY2NvdW50cy5tYXAoKGFjY291bnQpID0+IGFjY291bnQuaWQpO1xuXG4gICAgICBpZiAoZGlmZmVyZW5jZShhY2NvdW50c0lkcywgc3RvcmVkQWNjb3VudHNJZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQUNDT1VOVFMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBtYW51YWxKb3VybmFsLmlkKVxuICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICByZWZlcmVuY2U6IGZvcm0ucmVmZXJlbmNlLFxuICAgICAgICAgIHRyYW5zYWN0aW9uX3R5cGU6ICdKb3VybmFsJyxcbiAgICAgICAgICBqb3VybmFsTnVtYmVyOiBmb3JtLmpvdXJuYWxfbnVtYmVyLFxuICAgICAgICAgIGFtb3VudDogdG90YWxDcmVkaXQsXG4gICAgICAgICAgZGF0ZTogZm9ybWF0dGVkRGF0ZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZm9ybS5kZXNjcmlwdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdyZWZlcmVuY2VfdHlwZScsIFsnSm91cm5hbCddKVxuICAgICAgICAud2hlcmUoJ3JlZmVyZW5jZV9pZCcsIG1hbnVhbEpvdXJuYWwuaWQpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdhY2NvdW50LnR5cGUnKTtcblxuICAgICAgY29uc3QgYWNjb3VudHNEZXBHcmFwaCA9IGF3YWl0IEFjY291bnQuZGVwR3JhcGgoKS5xdWVyeSgpLnJlbWVtYmVyKCk7XG4gICAgICBjb25zdCBqb3VybmFsID0gbmV3IEpvdXJuYWxQb3N0ZXIoYWNjb3VudHNEZXBHcmFwaCk7XG5cbiAgICAgIGpvdXJuYWwubG9hZEVudHJpZXModHJhbnNhY3Rpb25zKTtcbiAgICAgIGpvdXJuYWwucmVtb3ZlRW50cmllcygpO1xuXG4gICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjY291bnQgPSBhY2NvdW50cy5maW5kKChhKSA9PiBhLmlkID09PSBlbnRyeS5hY2NvdW50X2lkKTtcblxuICAgICAgICBjb25zdCBqb3VyYW5sRW50cnkgPSBuZXcgSm91cm5hbEVudHJ5KHtcbiAgICAgICAgICBkZWJpdDogZW50cnkuZGViaXQsXG4gICAgICAgICAgY3JlZGl0OiBlbnRyeS5jcmVkaXQsXG4gICAgICAgICAgYWNjb3VudDogYWNjb3VudC5pZCxcbiAgICAgICAgICByZWZlcmVuY2VUeXBlOiAnSm91cm5hbCcsXG4gICAgICAgICAgcmVmZXJlbmNlSWQ6IG1hbnVhbEpvdXJuYWwuaWQsXG4gICAgICAgICAgYWNjb3VudE5vcm1hbDogYWNjb3VudC50eXBlLm5vcm1hbCxcbiAgICAgICAgICBub3RlOiBlbnRyeS5ub3RlLFxuICAgICAgICAgIGRhdGU6IGZvcm1hdHRlZERhdGUsXG4gICAgICAgICAgdXNlcklkOiB1c2VyLmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGVudHJ5LmRlYml0KSB7XG4gICAgICAgICAgam91cm5hbC5kZWJpdChqb3VyYW5sRW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpvdXJuYWwuY3JlZGl0KGpvdXJhbmxFbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBTYXZlIGxpbmtzIG9mIG5ldyBpbnNlcnRlZCBtZWRpYSB0aGF0IGFzc29jaWF0ZWQgdG8gdGhlIGpvdXJuYWwgbW9kZWwuXG4gICAgICBjb25zdCBqb3VybmFsTWVkaWFJZHMgPSBtYW51YWxKb3VybmFsLm1lZGlhLm1hcCgobSkgPT4gbS5pZCk7XG4gICAgICBjb25zdCBuZXdJbnNlcnRlZE1lZGlhID0gZGlmZmVyZW5jZShmb3JtLm1lZGlhX2lkcywgam91cm5hbE1lZGlhSWRzKTtcbiAgICAgIGNvbnN0IGJ1bGtTYXZlTWVkaWFMaW5rID0gW107XG5cbiAgICAgIG5ld0luc2VydGVkTWVkaWEuZm9yRWFjaCgobWVkaWFJZCkgPT4ge1xuICAgICAgICBjb25zdCBvcGVyID0gTWVkaWFMaW5rLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgICBtb2RlbF9uYW1lOiAnSm91cm5hbCcsXG4gICAgICAgICAgbW9kZWxfaWQ6IG1hbnVhbEpvdXJuYWwuaWQsXG4gICAgICAgICAgbWVkaWFfaWQ6IG1lZGlhSWQsXG4gICAgICAgIH0pO1xuICAgICAgICBidWxrU2F2ZU1lZGlhTGluay5wdXNoKG9wZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgLi4uYnVsa1NhdmVNZWRpYUxpbmssXG4gICAgICAgIGpvdXJuYWwuZGVsZXRlRW50cmllcygpLFxuICAgICAgICBqb3VybmFsLnNhdmVFbnRyaWVzKCksXG4gICAgICAgIGpvdXJuYWwuc2F2ZUJhbGFuY2UoKSxcbiAgICAgIF0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe30pO1xuICAgIH0sXG4gIH0sXG5cbiAgcHVibGlzaE1hbnVhbEpvdXJuYWw6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgTWFudWFsSm91cm5hbCxcbiAgICAgICAgQWNjb3VudFRyYW5zYWN0aW9uLFxuICAgICAgICBBY2NvdW50LFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCBtYW51YWxKb3VybmFsID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCFtYW51YWxKb3VybmFsKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTUFOVUFMLkpPVVJOQUwuTk9ULkZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChtYW51YWxKb3VybmFsLnN0YXR1cykge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTC5KT1VSTkFMLlBVQkxJU0hFRC5BTFJFQURZJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZUpvdXJuYWxUcmFuc2FjdGlvbk9wZXIgPSBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIG1hbnVhbEpvdXJuYWwuaWQpXG4gICAgICAgIC51cGRhdGUoeyBzdGF0dXM6IDEgfSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdyZWZlcmVuY2VfdHlwZScsIFsnSm91cm5hbCcsICdNYW51YWxKb3VybmFsJ10pXG4gICAgICAgIC53aGVyZSgncmVmZXJlbmNlX2lkJywgbWFudWFsSm91cm5hbC5pZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2FjY291bnQudHlwZScpO1xuXG4gICAgICBjb25zdCBhY2NvdW50c0RlcEdyYXBoID0gYXdhaXQgQWNjb3VudC5kZXBHcmFwaCgpLnF1ZXJ5KCkucmVtZW1iZXIoKTtcbiAgICAgIGNvbnN0IGpvdXJuYWwgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0RlcEdyYXBoKTtcblxuICAgICAgam91cm5hbC5sb2FkRW50cmllcyh0cmFuc2FjdGlvbnMpO1xuICAgICAgam91cm5hbC5jYWxjdWxhdGVFbnRyaWVzQmFsYW5jZUNoYW5nZSgpO1xuXG4gICAgICBjb25zdCB1cGRhdGVBY2NvdW50c1RyYW5zYWN0aW9uc09wZXIgPSBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmVJbignaWQnLCB0cmFuc2FjdGlvbnMubWFwKCh0KSA9PiB0LmlkKSlcbiAgICAgICAgLnVwZGF0ZSh7IGRyYWZ0OiAwIH0pO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHVwZGF0ZUpvdXJuYWxUcmFuc2FjdGlvbk9wZXIsXG4gICAgICAgIHVwZGF0ZUFjY291bnRzVHJhbnNhY3Rpb25zT3BlcixcbiAgICAgICAgam91cm5hbC5zYXZlQmFsYW5jZSgpLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIGdldE1hbnVhbEpvdXJuYWw6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgTWFudWFsSm91cm5hbCwgQWNjb3VudFRyYW5zYWN0aW9uLFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCBtYW51YWxKb3VybmFsID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ21lZGlhJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghbWFudWFsSm91cm5hbCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTC5KT1VSTkFMLk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9ICAgICBcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdyZWZlcmVuY2VfdHlwZScsIFsnSm91cm5hbCcsICdNYW51YWxKb3VybmFsJ10pXG4gICAgICAgIC53aGVyZSgncmVmZXJlbmNlX2lkJywgbWFudWFsSm91cm5hbC5pZCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIG1hbnVhbF9qb3VybmFsOiB7XG4gICAgICAgICAgLi4ubWFudWFsSm91cm5hbC50b0pTT04oKSxcbiAgICAgICAgICBlbnRyaWVzOiBbXG4gICAgICAgICAgICAuLi50cmFuc2FjdGlvbnMsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgbWFudWFsIGpvdXJuYWwgdHJhbnNhY3Rpb25zIGFuZCBhc3NvY2lhdGVkXG4gICAqIGFjY291bnRzIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIGRlbGV0ZU1hbnVhbEpvdXJuYWw6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIE1hbnVhbEpvdXJuYWwsXG4gICAgICAgIEFjY291bnRUcmFuc2FjdGlvbixcbiAgICAgICAgTWVkaWFMaW5rLFxuICAgICAgICBBY2NvdW50LFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IG1hbnVhbEpvdXJuYWwgPSBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIW1hbnVhbEpvdXJuYWwpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdNQU5VQUwuSk9VUk5BTC5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ3JlZmVyZW5jZV90eXBlJywgWydKb3VybmFsJywgJ01hbnVhbEpvdXJuYWwnXSlcbiAgICAgICAgLndoZXJlKCdyZWZlcmVuY2VfaWQnLCBtYW51YWxKb3VybmFsLmlkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnYWNjb3VudC50eXBlJyk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzRGVwR3JhcGggPSBhd2FpdCBBY2NvdW50LmRlcEdyYXBoKCkucXVlcnkoKS5yZW1lbWJlcigpO1xuICAgICAgY29uc3Qgam91cm5hbCA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzRGVwR3JhcGgpO1xuXG4gICAgICBqb3VybmFsLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9ucyk7XG4gICAgICBqb3VybmFsLnJlbW92ZUVudHJpZXMoKTtcblxuICAgICAgYXdhaXQgTWVkaWFMaW5rLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdtb2RlbF9uYW1lJywgJ0pvdXJuYWwnKVxuICAgICAgICAud2hlcmUoJ21vZGVsX2lkJywgbWFudWFsSm91cm5hbC5pZClcbiAgICAgICAgLmRlbGV0ZSgpO1xuXG4gICAgICBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIG1hbnVhbEpvdXJuYWwuaWQpXG4gICAgICAgIC5kZWxldGUoKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBqb3VybmFsLmRlbGV0ZUVudHJpZXMoKSxcbiAgICAgICAgam91cm5hbC5zYXZlQmFsYW5jZSgpLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIHJlY3VycmluZ0pvdXJuYWxzTGlzdDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdwYWdlJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ3BhZ2Vfc2l6ZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCd0ZW1wbGF0ZV9uYW1lJykub3B0aW9uYWwoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcblxuICBxdWlja0pvdXJuYWxFbnRyaWVzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ2RhdGUnKS5leGlzdHMoKS5pc0lTTzg2MDEoKSxcbiAgICAgIGNoZWNrKCdhbW91bnQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0Zsb2F0KCksXG4gICAgICBjaGVjaygnY3JlZGl0X2FjY291bnRfaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2RlYml0X2FjY291bnRfaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ3RyYW5zYWN0aW9uX3R5cGUnKS5leGlzdHMoKSxcbiAgICAgIGNoZWNrKCdub3RlJykub3B0aW9uYWwoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCB7IEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZvdW5kQWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGZvcm0uY3JlZGl0X2FjY291bnRfaWQpXG4gICAgICAgIC5vcldoZXJlKCdpZCcsIGZvcm0uZGViaXRfYWNjb3VudF9pZCk7XG5cbiAgICAgIGNvbnN0IGNyZWRpdEFjY291bnQgPSBmb3VuZEFjY291bnRzLmZpbmQoKGEpID0+IGEuaWQgPT09IGZvcm0uY3JlZGl0X2FjY291bnRfaWQpO1xuICAgICAgY29uc3QgZGViaXRBY2NvdW50ID0gZm91bmRBY2NvdW50cy5maW5kKChhKSA9PiBhLmlkID09PSBmb3JtLmRlYml0X2FjY291bnRfaWQpO1xuXG4gICAgICBpZiAoIWNyZWRpdEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ1JFRElUX0FDQ09VTlQuTk9ULkVYSVNUJywgY29kZTogMTAwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFkZWJpdEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnREVCSVRfQUNDT1VOVC5OT1QuRVhJU1QnLCBjb2RlOiAyMDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnN0IGpvdXJuYWxQb3N0ZXIgPSBuZXcgSm91cm5hbFBvc3RlcigpO1xuICAgICAgLy8gY29uc3Qgam91cm5hbENyZWRpdCA9IG5ldyBKb3VybmFsRW50cnkoe1xuICAgICAgLy8gICBkZWJpdDogXG4gICAgICAvLyAgIGFjY291bnQ6IGRlYml0QWNjb3VudC5pZCxcbiAgICAgIC8vICAgcmVmZXJlbmNlSWQ6IFxuICAgICAgLy8gfSlcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlcyBidWxrIG1hbnVhbCBqb3VybmFscy5cbiAgICovXG4gIGRlbGV0ZUJ1bGtNYW51YWxKb3VybmFsczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdpZHMnKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgcXVlcnkoJ2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7IC4uLnJlcS5xdWVyeSB9O1xuICAgICAgY29uc3QgeyBNYW51YWxKb3VybmFsLCBBY2NvdW50VHJhbnNhY3Rpb24sIEFjY291bnQsIE1lZGlhTGluayB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgbWFudWFsSm91cm5hbHMgPSBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ2lkJywgZmlsdGVyLmlkcyk7XG5cbiAgICAgIGNvbnN0IG5vdEZvdW5kTWFudWFsSm91cm5hbHMgPSBkaWZmZXJlbmNlKGZpbHRlci5pZHMsIG1hbnVhbEpvdXJuYWxzLm1hcChtID0+IG0uaWQpKTtcblxuICAgICAgaWYgKG5vdEZvdW5kTWFudWFsSm91cm5hbHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTC5KT1VSTkFMLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmVJbigncmVmZXJlbmNlX3R5cGUnLCBbJ0pvdXJuYWwnLCAnTWFudWFsSm91cm5hbCddKVxuICAgICAgICAud2hlcmVJbigncmVmZXJlbmNlX2lkJywgZmlsdGVyLmlkcyk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzRGVwR3JhcGggPSBhd2FpdCBBY2NvdW50LmRlcEdyYXBoKCkucXVlcnkoKS5yZW1lbWJlcigpO1xuICAgICAgY29uc3Qgam91cm5hbCA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzRGVwR3JhcGgpO1xuXG4gICAgICBqb3VybmFsLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9ucyk7XG4gICAgICBqb3VybmFsLnJlbW92ZUVudHJpZXMoKTtcblxuICAgICAgYXdhaXQgTWVkaWFMaW5rLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdtb2RlbF9uYW1lJywgJ0pvdXJuYWwnKVxuICAgICAgICAud2hlcmVJbignbW9kZWxfaWQnLCBmaWx0ZXIuaWRzKVxuICAgICAgICAuZGVsZXRlKCk7XG5cbiAgICAgIGF3YWl0IE1hbnVhbEpvdXJuYWwucXVlcnkoKVxuICAgICAgICAud2hlcmVJbignaWQnLCBmaWx0ZXIuaWRzKS5kZWxldGUoKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBqb3VybmFsLmRlbGV0ZUVudHJpZXMoKSxcbiAgICAgICAgam91cm5hbC5zYXZlQmFsYW5jZSgpLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZHM6IGZpbHRlci5pZHMgfSk7XG4gICAgfSxcbiAgfVxufTtcbiIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHtcbiAgY2hlY2ssXG4gIHZhbGlkYXRpb25SZXN1bHQsXG4gIHBhcmFtLFxuICBxdWVyeSxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgZGlmZmVyZW5jZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgSm91cm5hbFBvc3RlciBmcm9tICdAL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbFBvc3Rlcic7XG5pbXBvcnQgTmVzdGVkU2V0IGZyb20gJ0AvY29sbGVjdGlvbi9OZXN0ZWRTZXQnO1xuaW1wb3J0IHtcbiAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHMsXG4gIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyLFxufSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcbmltcG9ydCB7XG4gIER5bmFtaWNGaWx0ZXIsXG4gIER5bmFtaWNGaWx0ZXJTb3J0QnksXG4gIER5bmFtaWNGaWx0ZXJWaWV3cyxcbiAgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzLFxufSBmcm9tICdAL2xpYi9EeW5hbWljRmlsdGVyJztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IgbWV0aG9kLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIucG9zdCgnLycsXG4gICAgICB0aGlzLm5ld0FjY291bnQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLm5ld0FjY291bnQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQnLFxuICAgICAgdGhpcy5lZGl0QWNjb3VudC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdEFjY291bnQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLzppZCcsXG4gICAgICB0aGlzLmdldEFjY291bnQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldEFjY291bnQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmdldEFjY291bnRzTGlzdC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0QWNjb3VudHNMaXN0LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy8nLFxuICAgICAgdGhpcy5kZWxldGVCdWxrQWNjb3VudHMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmRlbGV0ZUJ1bGtBY2NvdW50cy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvOmlkJyxcbiAgICAgIHRoaXMuZGVsZXRlQWNjb3VudC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZGVsZXRlQWNjb3VudC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLzppZC9hY3RpdmUnLFxuICAgICAgdGhpcy5hY3RpdmVBY2NvdW50LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5hY3RpdmVBY2NvdW50LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkL2luYWN0aXZlJyxcbiAgICAgIHRoaXMuaW5hY3RpdmVBY2NvdW50LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5pbmFjdGl2ZUFjY291bnQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQvcmVjYWxjdWxhdGUtYmFsYW5jZScsXG4gICAgICB0aGlzLnJlY2FsY3VhbHRlQmFsYW5hY2UudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnJlY2FsY3VhbHRlQmFsYW5hY2UuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQvdHJhbnNmZXJfYWNjb3VudC86dG9BY2NvdW50JyxcbiAgICAgIHRoaXMudHJhbnNmZXJUb0Fub3RoZXJBY2NvdW50LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy50cmFuc2ZlclRvQW5vdGhlckFjY291bnQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy9idWxrLzp0eXBlKGFjdGl2YXRlfGluYWN0aXZhdGUpJyxcbiAgICAgIHRoaXMuYnVsa0luYWN0aXZhdGVBY2NvdW50cy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuYnVsa0luYWN0aXZhdGVBY2NvdW50cy5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGFjY291bnQuXG4gICAqL1xuICBuZXdBY2NvdW50OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ25hbWUnKS5leGlzdHMoKS5pc0xlbmd0aCh7IG1pbjogMyB9KVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdjb2RlJykub3B0aW9uYWwoKS5pc0xlbmd0aCh7IG1heDogMTAgfSlcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuZXNjYXBlKCksXG4gICAgICBjaGVjaygnYWNjb3VudF90eXBlX2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdkZXNjcmlwdGlvbicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCB7IEFjY291bnRUeXBlLCBBY2NvdW50IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBmb3VuZEFjY291bnRDb2RlUHJvbWlzZSA9IGZvcm0uY29kZVxuICAgICAgICA/IEFjY291bnQucXVlcnkoKS53aGVyZSgnY29kZScsIGZvcm0uY29kZSkgOiBudWxsO1xuXG4gICAgICBjb25zdCBmb3VuZEFjY291bnRUeXBlUHJvbWlzZSA9IEFjY291bnRUeXBlLnF1ZXJ5KClcbiAgICAgICAgLmZpbmRCeUlkKGZvcm0uYWNjb3VudF90eXBlX2lkKTtcblxuICAgICAgY29uc3QgW2ZvdW5kQWNjb3VudENvZGUsIGZvdW5kQWNjb3VudFR5cGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmb3VuZEFjY291bnRDb2RlUHJvbWlzZSwgZm91bmRBY2NvdW50VHlwZVByb21pc2UsXG4gICAgICBdKTtcblxuICAgICAgaWYgKGZvdW5kQWNjb3VudENvZGVQcm9taXNlICYmIGZvdW5kQWNjb3VudENvZGUubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTk9UX1VOSVFVRV9DT0RFJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghZm91bmRBY2NvdW50VHlwZSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTk9UX0VYSVNUX0FDQ09VTlRfVFlQRScsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkuaW5zZXJ0KHsgLi4uZm9ybSB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaXRlbTogeyB9IH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIGdpdmVuIGFjY291bnQgZGV0YWlscy5cbiAgICovXG4gIGVkaXRBY2NvdW50OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCduYW1lJykuZXhpc3RzKCkuaXNMZW5ndGgoeyBtaW46IDMgfSlcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuZXNjYXBlKCksXG4gICAgICBjaGVjaygnY29kZScpLmV4aXN0cygpLmlzTGVuZ3RoKHsgbWF4OiAxMCB9KVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdhY2NvdW50X3R5cGVfaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2Rlc2NyaXB0aW9uJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgQWNjb3VudFR5cGUgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IEFjY291bnQucXVlcnkoKS5maW5kQnlJZChpZCk7XG5cbiAgICAgIGlmICghYWNjb3VudCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvdW5kQWNjb3VudENvZGVQcm9taXNlID0gKGZvcm0uY29kZSAmJiBmb3JtLmNvZGUgIT09IGFjY291bnQuY29kZSlcbiAgICAgICAgPyBBY2NvdW50LnF1ZXJ5KCkud2hlcmUoJ2NvZGUnLCBmb3JtLmNvZGUpLndoZXJlTm90KCdpZCcsIGFjY291bnQuaWQpIDogbnVsbDtcblxuICAgICAgY29uc3QgZm91bmRBY2NvdW50VHlwZVByb21pc2UgPSAoZm9ybS5hY2NvdW50X3R5cGVfaWQgIT09IGFjY291bnQuYWNjb3VudF90eXBlX2lkKVxuICAgICAgICA/IEFjY291bnRUeXBlLnF1ZXJ5KCkud2hlcmUoJ2lkJywgZm9ybS5hY2NvdW50X3R5cGVfaWQpIDogbnVsbDtcblxuICAgICAgY29uc3QgW2ZvdW5kQWNjb3VudENvZGUsIGZvdW5kQWNjb3VudFR5cGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmb3VuZEFjY291bnRDb2RlUHJvbWlzZSwgZm91bmRBY2NvdW50VHlwZVByb21pc2UsXG4gICAgICBdKTtcbiAgICAgIGlmIChmb3VuZEFjY291bnRDb2RlLmxlbmd0aCA+IDAgJiYgZm91bmRBY2NvdW50Q29kZVByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ05PVF9VTklRVUVfQ09ERScsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZm91bmRBY2NvdW50VHlwZS5sZW5ndGggPD0gMCAmJiBmb3VuZEFjY291bnRUeXBlUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTk9UX0VYSVNUX0FDQ09VTlRfVFlQRScsIGNvZGU6IDExMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBhY2NvdW50LnBhdGNoKHsgLi4uZm9ybSB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogR2V0IGRldGFpbHMgb2YgdGhlIGdpdmVuIGFjY291bnQuXG4gICAqL1xuICBnZXRBY2NvdW50OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7IEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpLnJlbWVtYmVyKCkud2hlcmUoJ2lkJywgaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghYWNjb3VudCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGFjY291bnQ6IHsgLi4uYWNjb3VudCB9IH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZ2l2ZW4gYWNjb3VudC5cbiAgICovXG4gIGRlbGV0ZUFjY291bnQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgQWNjb3VudFRyYW5zYWN0aW9uIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IEFjY291bnQucXVlcnkoKS5maW5kQnlJZChpZCk7XG5cbiAgICAgIGlmICghYWNjb3VudCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChhY2NvdW50LnByZWRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0FDQ09VTlQuUFJFREVGSU5FRCcgLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudFRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnYWNjb3VudF9pZCcsIGFjY291bnQuaWQpO1xuXG4gICAgICBpZiAoYWNjb3VudFRyYW5zYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdBQ0NPVU5ULkhBUy5BU1NPQ0lBVEVELlRSQU5TQUNUSU9OUycsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkuZGVsZXRlQnlJZChhY2NvdW50LmlkKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgYWNjb3VudHMgbGlzdC5cbiAgICovXG4gIGdldEFjY291bnRzTGlzdDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdkaXNwbGF5X3R5cGUnKS5vcHRpb25hbCgpLmlzSW4oWyd0cmVlJywgJ2ZsYXQnXSksXG4gICAgICBxdWVyeSgnYWNjb3VudF90eXBlcycpLm9wdGlvbmFsKCkuaXNBcnJheSgpLFxuICAgICAgcXVlcnkoJ2FjY291bnRfdHlwZXMuKicpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdjdXN0b21fdmlld19pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcblxuICAgICAgcXVlcnkoJ3N0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcycpLm9wdGlvbmFsKCkuaXNKU09OKCksXG5cbiAgICAgIHF1ZXJ5KCdjb2x1bW5fc29ydF9ieScpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgnc29ydF9vcmRlcicpLm9wdGlvbmFsKCkuaXNJbihbJ2Rlc2MnLCAnYXNjJ10pLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgYWNjb3VudF90eXBlczogW10sXG4gICAgICAgIGRpc3BsYXlfdHlwZTogJ3RyZWUnLFxuICAgICAgICBmaWx0ZXJfcm9sZXM6IFtdLFxuICAgICAgICBzb3J0X29yZGVyOiAnYXNjJyxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmIChmaWx0ZXIuc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzKSB7XG4gICAgICAgIGZpbHRlci5maWx0ZXJfcm9sZXMgPSBKU09OLnBhcnNlKGZpbHRlci5zdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IFJlc291cmNlLCBBY2NvdW50LCBWaWV3IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGNvbnN0IGFjY291bnRzUmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC5yZW1lbWJlcigpXG4gICAgICAgIC53aGVyZSgnbmFtZScsICdhY2NvdW50cycpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdmaWVsZHMnKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgaWYgKCFhY2NvdW50c1Jlc291cmNlKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQUNDT1VOVFNfUkVTT1VSQ0VfTk9UX0ZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5cyA9IGFjY291bnRzUmVzb3VyY2UuZmllbGRzLm1hcCgoYykgPT4gYy5rZXkpO1xuXG4gICAgICBjb25zdCB2aWV3ID0gYXdhaXQgVmlldy5xdWVyeSgpLm9uQnVpbGQoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlci5jdXN0b21fdmlld19pZCkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2lkJywgZmlsdGVyLmN1c3RvbV92aWV3X2lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdmYXZvdXJpdGUnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBidWlsZGVyLndoZXJlKCdyZXNvdXJjZV9pZCcsIGFjY291bnRzUmVzb3VyY2UuaWQpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ3JvbGVzLmZpZWxkJyk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgnY29sdW1ucycpO1xuICAgICAgICBidWlsZGVyLmZpcnN0KCk7XG5cbiAgICAgICAgYnVpbGRlci5yZW1lbWJlcigpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkeW5hbWljRmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXIoQWNjb3VudC50YWJsZU5hbWUpO1xuXG4gICAgICBpZiAoZmlsdGVyLmNvbHVtbl9zb3J0X2J5KSB7XG4gICAgICAgIGlmIChyZXNvdXJjZUZpZWxkc0tleXMuaW5kZXhPZihmaWx0ZXIuY29sdW1uX3NvcnRfYnkpID09PSAtMSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NPTFVNTi5TT1JULk9SREVSLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0QnlGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlclNvcnRCeShcbiAgICAgICAgICBmaWx0ZXIuY29sdW1uX3NvcnRfYnksXG4gICAgICAgICAgZmlsdGVyLnNvcnRfb3JkZXIsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHNvcnRCeUZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZpZXcgcm9sZXMuXG4gICAgICBpZiAodmlldyAmJiB2aWV3LnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgdmlld0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyVmlld3MoXG4gICAgICAgICAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHModmlldy5yb2xlcyksXG4gICAgICAgICAgdmlldy5yb2xlc0xvZ2ljRXhwcmVzc2lvbixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCF2aWV3RmlsdGVyLnZhbGlkYXRlRmlsdGVyUm9sZXMoKSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuTE9HSUMuRVhQUkVTU0lPTi5JTlZBTElEJywgY29kZTogNDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHZpZXdGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgLy8gRmlsdGVyIHJvbGVzLlxuICAgICAgaWYgKGZpbHRlci5maWx0ZXJfcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgYWNjb3VudHMgcmVzb3VyY2UgZmllbGRzLlxuICAgICAgICBjb25zdCBmaWx0ZXJSb2xlcyA9IG5ldyBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMoXG4gICAgICAgICAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIoZmlsdGVyLmZpbHRlcl9yb2xlcyksXG4gICAgICAgICAgYWNjb3VudHNSZXNvdXJjZS5maWVsZHMsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKGZpbHRlclJvbGVzKTtcblxuICAgICAgICBpZiAoZmlsdGVyUm9sZXMudmFsaWRhdGVGaWx0ZXJSb2xlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdBQ0NPVU5UUy5SRVNPVVJDRS5IQVMuTk8uR0lWRU4uRklFTERTJywgY29kZTogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgICAucmVtZW1iZXIoKVxuICAgICAgICAub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubW9kaWZ5KCdmaWx0ZXJBY2NvdW50VHlwZXMnLCBmaWx0ZXIuYWNjb3VudF90eXBlcyk7XG4gICAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCd0eXBlJyk7XG4gICAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdiYWxhbmNlJyk7XG5cbiAgICAgICAgICBkeW5hbWljRmlsdGVyLmJ1aWxkUXVlcnkoKShidWlsZGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5lc3RlZEFjY291bnRzID0gQWNjb3VudC50b05lc3RlZEFycmF5KGFjY291bnRzKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgYWNjb3VudHM6IG5lc3RlZEFjY291bnRzLFxuICAgICAgICAuLi4odmlldykgPyB7XG4gICAgICAgICAgY3VzdG9tVmlld0lkOiB2aWV3LmlkLFxuICAgICAgICB9IDoge30sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZS1jYWxjdWxhdGVzIGJhbGFuY2Ugb2YgdGhlIGdpdmVuIGFjY291bnQuXG4gICAqL1xuICByZWNhbGN1YWx0ZUJhbGFuYWNlOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIEFjY291bnQsXG4gICAgICAgIEFjY291bnRUcmFuc2FjdGlvbixcbiAgICAgICAgQWNjb3VudEJhbGFuY2UsXG4gICAgICB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBBY2NvdW50LmZpbmRCeUlkKGlkKTtcblxuICAgICAgaWYgKCFhY2NvdW50KSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQUNDT1VOVC5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudFRyYW5zYWN0aW9ucyA9IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnYWNjb3VudF9pZCcsIGFjY291bnQuaWQpO1xuXG4gICAgICBjb25zdCBqb3VybmFsRW50cmllcyA9IG5ldyBKb3VybmFsUG9zdGVyKCk7XG4gICAgICBqb3VybmFsRW50cmllcy5sb2FkRnJvbUNvbGxlY3Rpb24oYWNjb3VudFRyYW5zYWN0aW9ucyk7XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgYmFsYW5jZSBvZiB0aGUgZ2l2ZW4gYWNjb3VudCBpZC5cbiAgICAgIGF3YWl0IEFjY291bnRCYWxhbmNlLnF1ZXJ5KCkud2hlcmUoJ2FjY291bnRfaWQnLCBhY2NvdW50LmlkKS5kZWxldGUoKTtcblxuICAgICAgLy8gU2F2ZSBjYWxjdWFsdGVkIGFjY291bnQgYmFsYW5jZS5cbiAgICAgIGF3YWl0IGpvdXJuYWxFbnRyaWVzLnNhdmVCYWxhbmNlKCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEFjdGl2ZSB0aGUgZ2l2ZW4gYWNjb3VudC5cbiAgICovXG4gIGFjdGl2ZUFjY291bnQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgQWNjb3VudCB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoIWFjY291bnQpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdBQ0NPVU5ULk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKVxuICAgICAgICAucGF0Y2goeyBhY3RpdmU6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiBhY2NvdW50LmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEluYWN0aXZlIHRoZSBnaXZlbiBhY2NvdW50LlxuICAgKi9cbiAgaW5hY3RpdmVBY2NvdW50OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7IEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpLmZpbmRCeUlkKGlkKTtcblxuICAgICAgaWYgKCFhY2NvdW50KSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQUNDT1VOVC5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZClcbiAgICAgICAgLnBhdGNoKHsgYWN0aXZlOiBmYWxzZSB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWQ6IGFjY291bnQuaWQgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogVHJhbnNmZXIgYWxsIGpvdXJuYWwgZW50cmllcyBvZiB0aGUgZ2l2ZW4gYWNjb3VudCB0byBhbm90aGVyIGFjY291bnQuXG4gICAqL1xuICB0cmFuc2ZlclRvQW5vdGhlckFjY291bnQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcGFyYW0oJ3RvQWNjb3VudCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zdCB7IGlkLCB0b0FjY291bnQ6IHRvQWNjb3VudElkIH0gPSByZXEucGFyYW1zO1xuXG4gICAgICAvLyBjb25zdCBbZnJvbUFjY291bnQsIHRvQWNjb3VudF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAvLyAgIEFjY291bnQucXVlcnkoKS5maW5kQnlJZChpZCksXG4gICAgICAvLyAgIEFjY291bnQucXVlcnkoKS5maW5kQnlJZCh0b0FjY291bnRJZCksXG4gICAgICAvLyBdKTtcblxuICAgICAgLy8gY29uc3QgZnJvbUFjY291bnRUcmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgLy8gICAud2hlcmUoJ2FjY291bnRfaWQnLCBmcm9tQWNjb3VudCk7XG5cbiAgICAgIC8vIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgZGVsZXRlQnVsa0FjY291bnRzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2lkcycpLmlzQXJyYXkoKSxcbiAgICAgIHF1ZXJ5KCdpZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyID0geyBpZHM6IFtdLCAuLi5yZXEucXVlcnkgfTtcbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgQWNjb3VudFRyYW5zYWN0aW9uIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIuaWRzLmxlbmd0aCkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmVJbignaWQnLCBmaWx0ZXIuaWRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBhY2NvdW50c0lkcyA9IGFjY291bnRzLm1hcCgoYSkgPT4gYS5pZCk7XG4gICAgICBjb25zdCBub3RGb3VuZEFjY291bnRzID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBhY2NvdW50c0lkcyk7XG4gICAgICBjb25zdCBwcmVkZWZpbmVkQWNjb3VudHMgPSBhY2NvdW50cy5maWx0ZXIoYWNjb3VudCA9PiBhY2NvdW50LnByZWRlZmluZWQpO1xuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGlmIChub3RGb3VuZEFjY291bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7XG4gICAgICAgICAgICB0eXBlOiAnQUNDT1VOVFMuSURTLk5PVC5GT1VORCcsXG4gICAgICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgICAgICBpZHM6IG5vdEZvdW5kQWNjb3VudHMsXG4gICAgICAgICAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHByZWRlZmluZWRBY2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnQUNDT1VOVC5QUkVERUZJTkVEJyxcbiAgICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgICAgaWRzOiBwcmVkZWZpbmVkQWNjb3VudHMubWFwKGEgPT4gYS5pZCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudHNUcmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmVJbignYWNjb3VudF9pZCcsIGFjY291bnRzSWRzKVxuICAgICAgICAuY291bnQoJ2lkIGFzIHRyYW5zYWN0aW9uc19jb3VudCcpXG4gICAgICAgIC5ncm91cEJ5KCdhY2NvdW50X2lkJylcbiAgICAgICAgLnNlbGVjdCgnYWNjb3VudF9pZCcpO1xuXG4gICAgICBjb25zdCBhY2NvdW50c0hhc1RyYW5zYWN0aW9ucyA9IFtdO1xuXG4gICAgICBhY2NvdW50c1RyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgICBpZiAodHJhbnNhY3Rpb24udHJhbnNhY3Rpb25zQ291bnQgPiAwKSB7XG4gICAgICAgICAgYWNjb3VudHNIYXNUcmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbi5hY2NvdW50SWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChhY2NvdW50c0hhc1RyYW5zYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnQUNDT1VOVC5IQVMuQVNTT0NJQVRFRC5UUkFOU0FDVElPTlMnLFxuICAgICAgICAgIGNvZGU6IDMwMCxcbiAgICAgICAgICBpZHM6IGFjY291bnRzSGFzVHJhbnNhY3Rpb25zXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdpZCcsIGFjY291bnRzLm1hcCgoYSkgPT4gYS5pZCkpXG4gICAgICAgIC5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogQnVsayBhY3Z0aXZhdGUvaW5hY3RpdmF0ZSB0aGUgZ2l2ZW4gYWNjb3VudHMuXG4gICAqL1xuICBidWxrSW5hY3RpdmF0ZUFjY291bnRzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2lkcycpLmlzQXJyYXkoeyBtaW46IDIgfSksXG4gICAgICBxdWVyeSgnaWRzLionKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcGFyYW0oJ3R5cGUnKS5leGlzdHMoKS5pc0luKFsnYWN0aXZhdGUnLCAnaW5hY3RpdmF0ZSddKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGlkczogW10sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHJlcS5wYXJhbXM7XG5cbiAgICAgIGNvbnN0IHN0b3JlZEFjY291bnRzID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpLndoZXJlSW4oJ2lkJywgZmlsdGVyLmlkcyk7XG4gICAgICBjb25zdCBzdG9yZWRBY2NvdW50c0lkcyA9IHN0b3JlZEFjY291bnRzLm1hcCgoYWNjb3VudCkgPT4gYWNjb3VudC5pZCk7XG4gICAgICBjb25zdCBub3RGb3VuZEFjY291bnRzID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBzdG9yZWRBY2NvdW50c0lkcyk7XG5cbiAgICAgIGlmIChub3RGb3VuZEFjY291bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdBQ0NPVU5UUy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZEFjY291bnRzID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdpZCcsIHN0b3JlZEFjY291bnRzSWRzKVxuICAgICAgICAucGF0Y2goe1xuICAgICAgICAgIGFjdGl2ZTogdHlwZSA9PT0gJ2FjdGl2YXRlJyA/IDEgOiAwLFxuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWRzOiBzdG9yZWRBY2NvdW50c0lkcyB9KTtcbiAgICB9XG4gIH1cbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGNoZWNrLCB2YWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcbmltcG9ydCBqd3QgZnJvbSAnanNvbndlYnRva2VuJztcbmltcG9ydCB7IHBpY2sgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHVuaXFpZCBmcm9tICd1bmlxaWQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IExvZ2dlciBmcm9tICdAL3NlcnZpY2VzL0xvZ2dlcic7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgU3lzdGVtVXNlciBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtVXNlcic7XG5pbXBvcnQgbWFpbCBmcm9tICdAL3NlcnZpY2VzL21haWwnO1xuaW1wb3J0IHsgaGFzaFBhc3N3b3JkIH0gZnJvbSAnQC91dGlscyc7XG5pbXBvcnQgZGJNYW5hZ2VyIGZyb20gJ0AvZGF0YWJhc2UvbWFuYWdlcic7XG5pbXBvcnQgVGVuYW50IGZyb20gJ0Avc3lzdGVtL21vZGVscy9UZW5hbnQnO1xuaW1wb3J0IFRlbmFudFVzZXIgZnJvbSAnQC9tb2RlbHMvVGVuYW50VXNlcic7XG5pbXBvcnQgVGVuYW50c01hbmFnZXIgZnJvbSAnQC9zeXN0ZW0vVGVuYW50c01hbmFnZXInO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCBQYXNzd29yZFJlc2V0IGZyb20gJ0Avc3lzdGVtL21vZGVscy9QYXNzd29yZFJlc2V0JztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBtZXRob2QuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5wb3N0KCcvbG9naW4nLFxuICAgICAgdGhpcy5sb2dpbi52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMubG9naW4uaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy9yZWdpc3RlcicsXG4gICAgICB0aGlzLnJlZ2lzdGVyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5yZWdpc3Rlci5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL3NlbmRfcmVzZXRfcGFzc3dvcmQnLFxuICAgICAgdGhpcy5zZW5kUmVzZXRQYXNzd29yZC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuc2VuZFJlc2V0UGFzc3dvcmQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy9yZXNldC86dG9rZW4nLFxuICAgICAgdGhpcy5yZXNldFBhc3N3b3JkLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5yZXNldFBhc3N3b3JkLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFVzZXIgbG9naW4gYXV0aGVudGljYXRpb24gcmVxdWVzdC5cbiAgICovXG4gIGxvZ2luOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ2NyZWRpZW50aWFsJykuZXhpc3RzKCkuaXNFbWFpbCgpLFxuICAgICAgY2hlY2soJ3Bhc3N3b3JkJykuZXhpc3RzKCkuaXNMZW5ndGgoeyBtaW46IDUgfSksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIGNvbnN0IHsgSldUX1NFQ1JFVF9LRVkgfSA9IHByb2Nlc3MuZW52O1xuXG4gICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ1NvbWVvbmUgdHJ5aW5nIHRvIGxvZ2luLicsIHsgZm9ybSB9KTtcblxuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndGVuYW50JylcbiAgICAgICAgLndoZXJlKCdlbWFpbCcsIGZvcm0uY3JlZGllbnRpYWwpXG4gICAgICAgIC5vcldoZXJlKCdwaG9uZV9udW1iZXInLCBmb3JtLmNyZWRpZW50aWFsKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdJTlZBTElEX0RFVEFJTFMnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCF1c2VyLnZlcmlmeVBhc3N3b3JkKGZvcm0ucGFzc3dvcmQpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdJTlZBTElEX0RFVEFJTFMnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCF1c2VyLmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVVNFUl9JTkFDVElWRScsIGNvZGU6IDExMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBsYXN0TG9naW5BdCA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuXG4gICAgICBjb25zdCB1cGRhdGVUZW5hbnRVc2VyID0gVGVuYW50VXNlci50ZW5hbnQoKS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCB1c2VyLmlkKVxuICAgICAgICAudXBkYXRlKHsgbGFzdF9sb2dpbl9hdDogbGFzdExvZ2luQXQgfSk7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZVN5c3RlbVVzZXIgPSBTeXN0ZW1Vc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIHVzZXIuaWQpXG4gICAgICAgIC51cGRhdGUoeyBsYXN0X2xvZ2luX2F0OiBsYXN0TG9naW5BdCB9KTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3VwZGF0ZVRlbmFudFVzZXIsIHVwZGF0ZVN5c3RlbVVzZXJdKTtcblxuICAgICAgY29uc3QgdG9rZW4gPSBqd3Quc2lnbihcbiAgICAgICAgeyBlbWFpbDogdXNlci5lbWFpbCwgX2lkOiB1c2VyLmlkIH0sXG4gICAgICAgIEpXVF9TRUNSRVRfS0VZLFxuICAgICAgICB7IGV4cGlyZXNJbjogJzFkJyB9LFxuICAgICAgKTtcbiAgICAgIExvZ2dlci5sb2coJ2luZm8nLCAnTG9nZ2luZyBzdWNjZXNzLicsIHsgZm9ybSB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgdG9rZW4sIHVzZXIgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IG9yZ2FuaXphdGlvbi5cbiAgICovXG4gIHJlZ2lzdGVyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ29yZ2FuaXphdGlvbl9uYW1lJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2ZpcnN0X25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygnbGFzdF9uYW1lJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2VtYWlsJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3Bob25lX251bWJlcicpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdwYXNzd29yZCcpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdjb3VudHJ5JykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ1NvbWVvbmUgdHJ5aW5nIHRvIHJlZ2lzdGVyLicsIHsgZm9ybSB9KTtcblxuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2VtYWlsJywgZm9ybS5lbWFpbClcbiAgICAgICAgLm9yV2hlcmUoJ3Bob25lX251bWJlcicsIGZvcm0ucGhvbmVfbnVtYmVyKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGlmICh1c2VyICYmIHVzZXIucGhvbmVOdW1iZXIgPT09IGZvcm0ucGhvbmVfbnVtYmVyKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1BIT05FX05VTUJFUl9FWElTVFMnLCBjb2RlOiAxMDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodXNlciAmJiB1c2VyLmVtYWlsID09PSBmb3JtLmVtYWlsKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0VNQUlMX0VYSVNUUycsIGNvZGU6IDIwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yZ2FuaXphdGlvbklkID0gdW5pcWlkKCk7XG4gICAgICBjb25zdCB0ZW5hbnRPcmdhbml6YXRpb24gPSBhd2FpdCBUZW5hbnQucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICBvcmdhbml6YXRpb25faWQ6IG9yZ2FuaXphdGlvbklkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGhhc2hlZFBhc3N3b3JkID0gYXdhaXQgaGFzaFBhc3N3b3JkKGZvcm0ucGFzc3dvcmQpO1xuICAgICAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICAgICAgLi4ucGljayhmb3JtLCBbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2VtYWlsJywgJ3Bob25lX251bWJlciddKSxcbiAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyZWRVc2VyID0gYXdhaXQgU3lzdGVtVXNlci5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgIC4uLnVzZXJJbnNlcnQsXG4gICAgICAgIHBhc3N3b3JkOiBoYXNoZWRQYXNzd29yZCxcbiAgICAgICAgdGVuYW50X2lkOiB0ZW5hbnRPcmdhbml6YXRpb24uaWQsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGRiTWFuYWdlci5jcmVhdGVEYihgYmlnY2FwaXRhbF90ZW5hbnRfJHtvcmdhbml6YXRpb25JZH1gKTtcblxuICAgICAgY29uc3QgdGVuYW50RGIgPSBUZW5hbnRzTWFuYWdlci5rbmV4SW5zdGFuY2Uob3JnYW5pemF0aW9uSWQpO1xuICAgICAgYXdhaXQgdGVuYW50RGIubWlncmF0ZS5sYXRlc3QoKTtcblxuICAgICAgVGVuYW50TW9kZWwua25leEJpbmRlZCA9IHRlbmFudERiO1xuXG4gICAgICBhd2FpdCBUZW5hbnRVc2VyLmJpbmRLbmV4KHRlbmFudERiKS5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgIC4uLnVzZXJJbnNlcnQsXG4gICAgICAgIGludml0ZV9hY2NlcHRlZF9hdDogbW9tZW50KCkuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXG4gICAgICB9KTtcbiAgICAgIExvZ2dlci5sb2coJ2luZm8nLCAnTmV3IHRlbmFudCBoYXMgYmVlbiBjcmVhdGVkLicsIHsgb3JnYW5pemF0aW9uSWQgfSk7XG5cbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGdsb2JhbC5yb290UGF0aCwgJ3ZpZXdzL21haWwvV2VsY29tZS5odG1sJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gTXVzdGFjaGUucmVuZGVyKHRlbXBsYXRlLCB7IC4uLmZvcm0gfSk7XG4gICAgICBjb25zdCBtYWlsT3B0aW9ucyA9IHtcbiAgICAgICAgdG86IHVzZXJJbnNlcnQuZW1haWwsXG4gICAgICAgIGZyb206IGAke3Byb2Nlc3MuZW52Lk1BSUxfRlJPTV9OQU1FfSAke3Byb2Nlc3MuZW52Lk1BSUxfRlJPTV9BRERSRVNTfWAsXG4gICAgICAgIHN1YmplY3Q6ICdXZWxjb21lIHRvIEJpZ2NhcGl0YWwnLFxuICAgICAgICBodG1sOiByZW5kZXJlZCxcbiAgICAgIH07XG4gICAgICBtYWlsLnNlbmRNYWlsKG1haWxPcHRpb25zLCAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgTG9nZ2VyLmxvZygnZXJyb3InLCAnRmFpbGVkIHNlbmQgd2VsY29tZSBtYWlsJywgeyBlcnJvciwgZm9ybSB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgTG9nZ2VyLmxvZygnaW5mbycsICdVc2VyIGhhcyBiZWVuIHNlbnQgd2VsY29tZSBlbWFpbCBzdWNjZXNzZnVseS4nLCB7IGZvcm0gfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgb3JnYW5pemF0aW9uX2lkOiBvcmdhbml6YXRpb25JZCxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFNlbmQgcmVzZXQgcGFzc3dvcmQgbGluayB2aWEgZW1haWwgb3IgU01TLlxuICAgKi9cbiAgc2VuZFJlc2V0UGFzc3dvcmQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnZW1haWwnKS5leGlzdHMoKS5pc0VtYWlsKCksXG4gICAgXSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIExvZ2dlci5sb2coJ2luZm8nLCAnVXNlciB0cnlpbmcgdG8gc2VuZCByZXNldCBwYXNzd29yZC4nLCB7IGZvcm0gfSk7XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KCkud2hlcmUoJ2VtYWlsJywgZm9ybS5lbWFpbCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnRU1BSUwuTk9ULlJFR0lTVEVSRUQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gRGVsZXRlIGFsbCBzdG9yZWQgdG9rZW5zIG9mIHJlc2V0IHBhc3N3b3JkIHRoYXQgYXNzb2NpYXRlIHRvIHRoZSBnaXZlIGVtYWlsLlxuICAgICAgYXdhaXQgUGFzc3dvcmRSZXNldC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnZW1haWwnLCBmb3JtLmVtYWlsKVxuICAgICAgICAuZGVsZXRlKCk7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gdW5pcWlkKCk7XG4gICAgICBjb25zdCBwYXNzd29yZFJlc2V0ID0gYXdhaXQgUGFzc3dvcmRSZXNldC5xdWVyeSgpXG4gICAgICAgIC5pbnNlcnQoeyBlbWFpbDogZm9ybS5lbWFpbCwgdG9rZW4gfSk7XG5cbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGdsb2JhbC5yb290UGF0aCwgJ3ZpZXdzL21haWwvUmVzZXRQYXNzd29yZC5odG1sJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gTXVzdGFjaGUucmVuZGVyKHRlbXBsYXRlLCB7XG4gICAgICAgIHVybDogYCR7cmVxLnByb3RvY29sfTovLyR7cmVxLmhvc3RuYW1lfS9yZXNldC8ke3Bhc3N3b3JkUmVzZXQudG9rZW59YCxcbiAgICAgICAgZmlyc3RfbmFtZTogdXNlci5maXJzdE5hbWUsXG4gICAgICAgIGxhc3RfbmFtZTogdXNlci5sYXN0TmFtZSxcbiAgICAgICAgLy8gY29udGFjdF91c19lbWFpbDogY29uZmlnLmNvbnRhY3RVc01haWwsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWFpbE9wdGlvbnMgPSB7XG4gICAgICAgIHRvOiB1c2VyLmVtYWlsLFxuICAgICAgICBmcm9tOiBgJHtwcm9jZXNzLmVudi5NQUlMX0ZST01fTkFNRX0gJHtwcm9jZXNzLmVudi5NQUlMX0ZST01fQUREUkVTU31gLFxuICAgICAgICBzdWJqZWN0OiAnQmlnY2FwaXRhbCAtIFBhc3N3b3JkIFJlc2V0JyxcbiAgICAgICAgaHRtbDogcmVuZGVyZWQsXG4gICAgICB9O1xuICAgICAgbWFpbC5zZW5kTWFpbChtYWlsT3B0aW9ucywgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0ZhaWxlZCBzZW5kIHJlc2V0IHBhc3N3b3JkIG1haWwnLCB7IGVycm9yLCBmb3JtIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ1VzZXIgaGFzIGJlZW4gc2VudCByZXNldCBwYXNzd29yZCBlbWFpbCBzdWNjZXNzZnVseS4nLCB7IGZvcm0gfSk7XG4gICAgICB9KTtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgZW1haWw6IHBhc3N3b3JkUmVzZXQuZW1haWwgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmVzZXQgcGFzc3dvcmQuXG4gICAqL1xuICByZXNldFBhc3N3b3JkOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ3Bhc3N3b3JkJykuZXhpc3RzKCkuaXNMZW5ndGgoeyBtaW46IDUgfSkuY3VzdG9tKCh2YWx1ZSwgeyByZXEgfSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgIT09IHJlcS5ib2R5LmNvbmZpcm1fcGFzc3dvcmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXNzd29yZHMgZG9uJ3QgbWF0Y2hcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ1VzZXIgdHJ5aW5nIHRvIHJlc2V0IHBhc3N3b3JkLicpO1xuICAgICAgY29uc3QgeyB0b2tlbiB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgcGFzc3dvcmQgfSA9IHJlcS5ib2R5O1xuXG4gICAgICBjb25zdCB0b2tlbk1vZGVsID0gYXdhaXQgUGFzc3dvcmRSZXNldC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgndG9rZW4nLCB0b2tlbilcbiAgICAgICAgLy8gLndoZXJlKCdjcmVhdGVkX2F0JywgJz49JywgRGF0ZS5ub3coKSAtIDM2MDAwMDApXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIXRva2VuTW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1RPS0VOX0lOVkFMSUQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2VtYWlsJywgdG9rZW5Nb2RlbC5lbWFpbCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdVU0VSX05PVF9GT1VORCcsIGNvZGU6IDEyMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNoZWRQYXNzd29yZCA9IGF3YWl0IGhhc2hQYXNzd29yZChwYXNzd29yZCk7XG5cbiAgICAgIGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2VtYWlsJywgdG9rZW5Nb2RlbC5lbWFpbClcbiAgICAgICAgLnVwZGF0ZSh7XG4gICAgICAgICAgcGFzc3dvcmQ6IGhhc2hlZFBhc3N3b3JkLFxuICAgICAgICB9KTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSByZXNldCBwYXNzd29yZCB0b2tlbi5cbiAgICAgIGF3YWl0IFBhc3N3b3JkUmVzZXQucXVlcnkoKS53aGVyZSgndG9rZW4nLCB0b2tlbikuZGVsZXRlKCk7XG4gICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ1VzZXIgcGFzc3dvcmQgaGFzIGJlZW4gcmVzZXQgc3VjY2Vzc2Z1bGx5LicpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe30pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiXG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUNvbnRyb2xsZXIge1xuXG59IiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBjaGVjaywgcGFyYW0sIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmFsbC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuYWxsLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvJyxcbiAgICAgIHRoaXMubmV3Q3VycmVuY3kudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLm5ld0N1cnJlbmN5LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkJyxcbiAgICAgIHRoaXMuZWRpdEN1cnJlbmN5LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5lZGl0Q3VycmVuY3kuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmRlbGV0ZSgnLzpjdXJyZW5jeV9jb2RlJyxcbiAgICAgIHRoaXMuZGVsZXRlQ3VycmVjeS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZGVsZXRlQ3VycmVjeS5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhbGwgcmVnaXN0ZXJlZCBjdXJyZW5jeSBkZXRhaWxzLlxuICAgKi9cbiAgYWxsOiB7XG4gICAgdmFsaWRhdGlvbjogW10sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBDdXJyZW5jeSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGN1cnJlbmNpZXMgPSBhd2FpdCBDdXJyZW5jeS5xdWVyeSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBjdXJyZW5jaWVzOiBbXG4gICAgICAgICAgLi4uY3VycmVuY2llcyxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgbmV3Q3VycmVuY3k6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnY3VycmVuY3lfbmFtZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdjdXJyZW5jeV9jb2RlJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCB7IEN1cnJlbmN5IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBmb3VuZEN1cnJlbmN5ID0gYXdhaXQgQ3VycmVuY3kucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2N1cnJlbmN5X2NvZGUnLCBmb3JtLmN1cnJlbmN5X2NvZGUpO1xuXG4gICAgICBpZiAoZm91bmRDdXJyZW5jeS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQ1VSUkVOQ1kuQ09ERS5BTFJFQURZLkVYSVNUUycsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBDdXJyZW5jeS5xdWVyeSgpXG4gICAgICAgIC5pbnNlcnQoeyAuLi5mb3JtIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBjdXJyZW5jeTogeyAuLi5mb3JtIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIGRlbGV0ZUN1cnJlY3k6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnY3VycmVuY3lfY29kZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IEN1cnJlbmN5IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgeyBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUgfSA9IHJlcS5wYXJhbXM7XG5cbiAgICAgIGF3YWl0IEN1cnJlbmN5LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdjdXJyZW5jeV9jb2RlJywgY3VycmVuY3lDb2RlKVxuICAgICAgICAuZGVsZXRlKCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGN1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSB9KTtcbiAgICB9LFxuICB9LFxuXG4gIGVkaXRDdXJyZW5jeToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY3VycmVuY3lfbmFtZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdjdXJyZW5jeV9jb2RlJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBDdXJyZW5jeSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgZm91bmRDdXJyZW5jeSA9IGF3YWl0IEN1cnJlbmN5LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdjdXJyZW5jeV9jb2RlJywgZm9ybS5jdXJyZW5jeV9jb2RlKS53aGVyZU5vdCgnaWQnLCBpZCk7XG5cbiAgICAgIGlmIChmb3VuZEN1cnJlbmN5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdDVVJSRU5DWS5DT0RFLkFMUkVBRFkuRVhJU1RTJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IEN1cnJlbmN5LnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLnVwZGF0ZSh7IC4uLmZvcm0gfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGN1cnJlbmN5OiB7IC4uLmZvcm0gfSB9KTtcbiAgICB9LFxuICB9LFxufTtcbiIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHtcbiAgY2hlY2ssXG4gIHBhcmFtLFxuICBxdWVyeSxcbiAgdmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgcGljayB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQge1xuICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyxcbiAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuaW1wb3J0IHtcbiAgRHluYW1pY0ZpbHRlcixcbiAgRHluYW1pY0ZpbHRlclNvcnRCeSxcbiAgRHluYW1pY0ZpbHRlclZpZXdzLFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59IGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXInO1xuXG5cbmNvbnN0IHZhbGlkYXRpb1JvbGVzID0gW1xuICBjaGVjaygnY3VzdG9tZXJfdHlwZScpXG4gICAgLmV4aXN0cygpXG4gICAgLmlzSW4oWydpbmRpdmlkdWFsJywgJ2J1c2luZXNzJ10pXG4gICAgLnRyaW0oKVxuICAgIC5lc2NhcGUoKSxcbiAgY2hlY2soJ2ZpcnN0X25hbWUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ2xhc3RfbmFtZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gIGNoZWNrKCdjb21wYW55X25hbWUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcblxuICBjaGVjaygnZGlzcGxheV9uYW1lJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gIGNoZWNrKCdlbWFpbCcpLm9wdGlvbmFsKCkuaXNFbWFpbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ3dvcmtfcGhvbmUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ3BlcnNvbmFsX3Bob25lJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG5cbiAgY2hlY2soJ2JpbGxpbmdfYWRkcmVzc19jaXR5Jykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdiaWxsaW5nX2FkZHJlc3NfY291bnRyeScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnYmlsbGluZ19hZGRyZXNzX2VtYWlsJykub3B0aW9uYWwoKS5pc0VtYWlsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnYmlsbGluZ19hZGRyZXNzX3ppcGNvZGUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ2JpbGxpbmdfYWRkcmVzc19waG9uZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnYmlsbGluZ19hZGRyZXNzX3N0YXRlJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG5cbiAgY2hlY2soJ3NoaXBwaW5nX2FkZHJlc3NfY2l0eScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnc2hpcHBpbmdfYWRkcmVzc19jb3VudHJ5Jykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdzaGlwcGluZ19hZGRyZXNzX2VtYWlsJykub3B0aW9uYWwoKS5pc0VtYWlsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnc2hpcHBpbmdfYWRkcmVzc196aXBfY29kZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnc2hpcHBpbmdfYWRkcmVzc19waG9uZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnc2hpcHBpbmdfYWRkcmVzc19zdGF0ZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gIGNoZWNrKCdub3RlJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdhY3RpdmUnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuXG4gIGNoZWNrKCdjdXN0b21fZmllbGRzJykub3B0aW9uYWwoKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICBjaGVjaygnY3VzdG9tX2ZpZWxkcy4qLmtleScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ2N1c3RvbV9maWVsZHMuKi52YWx1ZScpLmV4aXN0cygpLFxuXTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIucG9zdCgnLycsXG4gICAgICB0aGlzLm5ld0N1c3RvbWVyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5uZXdDdXN0b21lci5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLzppZCcsXG4gICAgICB0aGlzLmVkaXRDdXN0b21lci52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdEN1c3RvbWVyLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVDdXN0b21lci52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZGVsZXRlQ3VzdG9tZXIuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmxpc3RDdXN0b21lcnMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmxpc3RDdXN0b21lcnMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLzppZCcsXG4gICAgICB0aGlzLmdldEN1c3RvbWVyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5nZXRDdXN0b21lci5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBjdXN0b21lcnMgbGlzdCB3aXRoIHBhZ2luYXRpb24gYW5kIGN1c3RvbSB2aWV3IG1ldGFkYXRhLlxuICAgKi9cbiAgbGlzdEN1c3RvbWVyczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdjb2x1bW5fc29ydF9vcmRlcicpLm9wdGlvbmFsKCkuaXNJbihbJ2NyZWF0ZWRfYXQnXSksXG4gICAgICBxdWVyeSgnc29ydF9vcmRlcicpLm9wdGlvbmFsKCkuaXNJbihbJ2Rlc2MnLCAnYXNjJ10pLFxuICAgICAgcXVlcnkoJ3BhZ2UnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgncGFnZV9zaXplJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ2N1c3RvbV92aWV3X2lkJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ3N0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcycpLm9wdGlvbmFsKCkuaXNKU09OKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBSZXNvdXJjZSwgVmlldywgQ3VzdG9tZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcblxuICAgICAgY29uc3QgY3VzdG9tZXJzUmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbmFtZScsICdjdXN0b21lcnMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghY3VzdG9tZXJzUmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdDVVNUT01FUlMuUkVTT1VSQ0UuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBjb2x1bW5fc29ydF9vcmRlcjogJycsXG4gICAgICAgIHNvcnRfb3JkZXI6ICcnLFxuICAgICAgICBwYWdlOiAxLFxuICAgICAgICBwYWdlX3NpemU6IDEwLFxuICAgICAgICBjdXN0b21fdmlld19pZDogbnVsbCxcbiAgICAgICAgZmlsdGVyX3JvbGVzOiBbXSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmIChmaWx0ZXIuc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzKSB7XG4gICAgICAgIGZpbHRlci5maWx0ZXJfcm9sZXMgPSBKU09OLnBhcnNlKGZpbHRlci5zdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMpO1xuICAgICAgfVxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIuY3VzdG9tX3ZpZXdfaWQpIHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdpZCcsIGZpbHRlci5jdXN0b21fdmlld19pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnZmF2b3VyaXRlJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRlci53aGVyZSgncmVzb3VyY2VfaWQnLCBjdXN0b21lcnNSZXNvdXJjZS5pZCk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgncm9sZXMuZmllbGQnKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdjb2x1bW5zJyk7XG4gICAgICAgIGJ1aWxkZXIuZmlyc3QoKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHNLZXlzID0gY3VzdG9tZXJzUmVzb3VyY2UuZmllbGRzLm1hcCgoYykgPT4gYy5rZXkpO1xuICAgICAgY29uc3QgZHluYW1pY0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyKEN1c3RvbWVyLnRhYmxlTmFtZSk7XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggdmlldyByb2xlcy5cbiAgICAgIGlmICh2aWV3ICYmIHZpZXcucm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2aWV3RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJWaWV3cyhcbiAgICAgICAgICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyh2aWV3LnJvbGVzKSxcbiAgICAgICAgICB2aWV3LnJvbGVzTG9naWNFeHByZXNzaW9uLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXZpZXdGaWx0ZXIudmFsaWRhdGVGaWx0ZXJSb2xlcygpKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnVklFVy5MT0dJQy5FWFBSRVNTSU9OLklOVkFMSUQnLCBjb2RlOiA0MDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZHluYW1pY0ZpbHRlci5zZXRGaWx0ZXIodmlld0ZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggZmlsdGVyIHJvbGVzLlxuICAgICAgaWYgKGZpbHRlci5maWx0ZXJfcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgYWNjb3VudHMgcmVzb3VyY2UgZmllbGRzLlxuICAgICAgICBjb25zdCBmaWx0ZXJSb2xlcyA9IG5ldyBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMoXG4gICAgICAgICAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIoZmlsdGVyLmZpbHRlcl9yb2xlcyksXG4gICAgICAgICAgY3VzdG9tZXJzUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihmaWx0ZXJSb2xlcyk7XG5cbiAgICAgICAgaWYgKGZpbHRlclJvbGVzLnZhbGlkYXRlRmlsdGVyUm9sZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSVRFTVMuUkVTT1VSQ0UuSEFTLk5PLkZJRUxEUycsIGNvZGU6IDUwMCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGNvbHVtbiBzb3J0IG9yZGVyLlxuICAgICAgaWYgKGZpbHRlci5jb2x1bW5fc29ydF9vcmRlcikge1xuICAgICAgICBpZiAocmVzb3VyY2VGaWVsZHNLZXlzLmluZGV4T2YoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSA9PT0gLTEpIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdDT0xVTU4uU09SVC5PUkRFUi5OT1QuRk9VTkQnLCBjb2RlOiAzMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydEJ5RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJTb3J0QnkoXG4gICAgICAgICAgZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyLFxuICAgICAgICAgIGZpbHRlci5zb3J0X29yZGVyLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihzb3J0QnlGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgLy8gQ3VzdG9tZXJzIHF1ZXJ5LlxuICAgICAgY29uc3QgY3VzdG9tZXJzID0gYXdhaXQgQ3VzdG9tZXIucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuYnVpbGRRdWVyeSgpKGJ1aWxkZXIpO1xuICAgICAgfSkucGFnaW5hdGlvbihmaWx0ZXIucGFnZSAtIDEsIGZpbHRlci5wYWdlX3NpemUpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBjdXN0b21lcnMsXG4gICAgICAgIC4uLih2aWV3KSA/IHtcbiAgICAgICAgICBjdXN0b21WaWV3SWQ6IHZpZXcuaWQsXG4gICAgICAgIH0gOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU3VibWl0IGEgbmV3IGN1c3RvbWVyIGRldGFpbHMuXG4gICAqL1xuICBuZXdDdXN0b21lcjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIC4uLnZhbGlkYXRpb1JvbGVzLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgQ3VzdG9tZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuXG4gICAgICBjb25zdCBjdXN0b21lciA9IGF3YWl0IEN1c3RvbWVyLnF1ZXJ5KCkuaW5zZXJ0QW5kRmV0Y2goe1xuICAgICAgICAuLi5waWNrKGZvcm0sIFtcbiAgICAgICAgICAnY3VzdG9tZXJfdHlwZScsXG4gICAgICAgICAgJ2ZpcnN0X25hbWUnLFxuICAgICAgICAgICdsYXN0X25hbWUnLFxuICAgICAgICAgICdjb21wYW55X25hbWUnLFxuICAgICAgICAgICdkaXNwbGF5X25hbWUnLFxuICAgICAgICAgIFxuICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgJ3dvcmtfcGhvbmUnLFxuICAgICAgICAgICdwZXJzb25hbF9waG9uZScsXG5cbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzXzEnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfMicsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19jaXR5JyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX2NvdW50cnknLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfZW1haWwnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfemlwY29kZScsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19waG9uZScsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19zdGF0ZScsXG5cbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc18xJyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc18yJyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19jaXR5JyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19jb3VudHJ5JyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19lbWFpbCcsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfemlwY29kZScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfcGhvbmUnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3N0YXRlJyxcblxuICAgICAgICAgICdub3RlJyxcbiAgICAgICAgICAnYWN0aXZlJyxcbiAgICAgICAgXSksIFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiBjdXN0b21lci5pZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBFZGl0IGRldGFpbHMgb2YgdGhlIGdpdmVuIGN1c3RvbWVyIGlkLlxuICAgKi9cbiAgZWRpdEN1c3RvbWVyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIC4uLnZhbGlkYXRpb1JvbGVzLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyBDdXN0b21lciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGN1c3RvbWVyID0gYXdhaXQgQ3VzdG9tZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCFjdXN0b21lcikge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0NVU1RPTUVSLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IEN1c3RvbWVyLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLnBhdGNoKHtcbiAgICAgICAgLi4ucGljayhmb3JtLCBbXG4gICAgICAgICAgJ2N1c3RvbWVyX3R5cGUnLFxuICAgICAgICAgICdmaXJzdF9uYW1lJyxcbiAgICAgICAgICAnbGFzdF9uYW1lJyxcbiAgICAgICAgICAnY29tcGFueV9uYW1lJyxcbiAgICAgICAgICAnZGlzcGxheV9uYW1lJyxcbiAgICAgICAgICBcbiAgICAgICAgICAnZW1haWwnLFxuICAgICAgICAgICd3b3JrX3Bob25lJyxcbiAgICAgICAgICAncGVyc29uYWxfcGhvbmUnLFxuXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc18xJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzXzInLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19jb3VudHJ5JyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX2VtYWlsJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfcGhvbmUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3Nfc3RhdGUnLFxuXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMicsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY291bnRyeScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfZW1haWwnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3Bob25lJyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19zdGF0ZScsXG5cbiAgICAgICAgICAnbm90ZScsXG4gICAgICAgICAgJ2FjdGl2ZScsXG4gICAgICAgIF0pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZXRhaWxzIG9mIHRoZSBnaXZlbiBjdXN0b21lciBpZC5cbiAgICovXG4gIGdldEN1c3RvbWVyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IEN1c3RvbWVyIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IGN1c3RvbWVyID0gYXdhaXQgQ3VzdG9tZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCFjdXN0b21lcikge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0NVU1RPTUVSLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBjdXN0b21lciB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGdpdmVuIGN1c3RvbWVyLlxuICAgKi9cbiAgZGVsZXRlQ3VzdG9tZXI6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgQ3VzdG9tZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgY3VzdG9tZXIgPSBhd2FpdCBDdXN0b21lci5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIWN1c3RvbWVyKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQ1VTVE9NRVIuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IEN1c3RvbWVyLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmRlbGV0ZSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoKTtcbiAgICB9LFxuICB9XG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBjaGVjayxcbiAgcGFyYW0sXG4gIHF1ZXJ5LFxuICB2YWxpZGF0aW9uUmVzdWx0LFxufSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgbWV0aG9kLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJyxcbiAgICAgIHRoaXMuZXhjaGFuZ2VSYXRlcy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZXhjaGFuZ2VSYXRlcy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLycsXG4gICAgICB0aGlzLmFkZEV4Y2hhbmdlUmF0ZS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuYWRkRXhjaGFuZ2VSYXRlLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkJyxcbiAgICAgIHRoaXMuZWRpdEV4Y2hhbmdlUmF0ZS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdEV4Y2hhbmdlUmF0ZS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvYnVsaycsXG4gICAgICB0aGlzLmJ1bGtEZWxldGVFeGNoYW5nZVJhdGVzLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5idWxrRGVsZXRlRXhjaGFuZ2VSYXRlcy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvOmlkJyxcbiAgICAgIHRoaXMuZGVsZXRlRXhjaGFuZ2VSYXRlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVFeGNoYW5nZVJhdGUuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgZXhjaGFuZ2UgcmF0ZXMuXG4gICAqL1xuICBleGNoYW5nZVJhdGVzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ3BhZ2UnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgncGFnZV9zaXplJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgcGFnZV9zaXplOiAxMCxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgRXhjaGFuZ2VSYXRlIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZXhjaGFuZ2VSYXRlcyA9IGF3YWl0IEV4Y2hhbmdlUmF0ZS5xdWVyeSgpXG4gICAgICAgIC5wYWdpbmF0aW9uKGZpbHRlci5wYWdlIC0gMSwgZmlsdGVyLnBhZ2Vfc2l6ZSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGV4Y2hhbmdlX3JhdGVzOiBleGNoYW5nZVJhdGVzIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgZXhjaGFuZ2UgcmF0ZSBvbiB0aGUgZ2l2ZW4gZGF0ZS5cbiAgICovXG4gIGFkZEV4Y2hhbmdlUmF0ZToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCdleGNoYW5nZV9yYXRlJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9GbG9hdCgpLFxuICAgICAgY2hlY2soJ2N1cnJlbmN5X2NvZGUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygnZGF0ZScpLmV4aXN0cygpLmlzSVNPODYwMSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgRXhjaGFuZ2VSYXRlIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIGNvbnN0IGZvdW5kRXhjaGFuZ2VSYXRlID0gYXdhaXQgRXhjaGFuZ2VSYXRlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdjdXJyZW5jeV9jb2RlJywgZm9ybS5jdXJyZW5jeV9jb2RlKVxuICAgICAgICAud2hlcmUoJ2RhdGUnLCBmb3JtLmRhdGUpO1xuXG4gICAgICBpZiAoZm91bmRFeGNoYW5nZVJhdGUubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0VYQ0hBTkdFLlJBVEUuREFURS5QRVJJT0QuREVGSU5FRCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAuLi5mb3JtLFxuICAgICAgICBkYXRlOiBtb21lbnQoZm9ybS5kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoKTtcbiAgICB9LFxuICB9LFxuXG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIGdpdmVuIGV4Y2hhbmdlIHJhdGUuXG4gICAqL1xuICBlZGl0RXhjaGFuZ2VSYXRlOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdleGNoYW5nZV9yYXRlJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9GbG9hdCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyBFeGNoYW5nZVJhdGUgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZvdW5kRXhjaGFuZ2VSYXRlID0gYXdhaXQgRXhjaGFuZ2VSYXRlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKTtcblxuICAgICAgaWYgKCFmb3VuZEV4Y2hhbmdlUmF0ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdFWENIQU5HRS5SQVRFLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpXG4gICAgICAgIC51cGRhdGUoeyAuLi5mb3JtIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGdpdmVuIGV4Y2hhbmdlIHJhdGUgZnJvbSB0aGUgc3RvcmFnZS5cbiAgICovXG4gIGRlbGV0ZUV4Y2hhbmdlUmF0ZToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgRXhjaGFuZ2VSYXRlIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZm91bmRFeGNoYW5nZVJhdGUgPSBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKS53aGVyZSgnaWQnLCBpZCk7XG5cbiAgICAgIGlmICghZm91bmRFeGNoYW5nZVJhdGUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnRVhDSEFOR0UuUkFURS5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgRXhjaGFuZ2VSYXRlLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmRlbGV0ZSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIGJ1bGtEZWxldGVFeGNoYW5nZVJhdGVzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2lkcycpLmlzQXJyYXkoeyBtaW46IDIgfSksXG4gICAgICBxdWVyeSgnaWRzLionKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBpZHM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBFeGNoYW5nZVJhdGUgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBcbiAgICAgIGNvbnN0IGV4Y2hhbmdlUmF0ZXMgPSBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKS53aGVyZUluKCdpZCcsIGZpbHRlci5pZHMpO1xuICAgICAgY29uc3QgZXhjaGFuZ2VSYXRlc0lkcyA9IGV4Y2hhbmdlUmF0ZXMubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuaWQpO1xuICAgICAgY29uc3Qgbm90Rm91bmRFeFJhdGVzID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBleGNoYW5nZVJhdGVzSWRzKTtcbiAgICAgIFxuICAgICAgaWYgKG5vdEZvdW5kRXhSYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnRVhDSEFOR0UuUkFURVMuSVMuTk9ULkZPVU5EJywgY29kZTogMjAwLCBpZHM6IG5vdEZvdW5kRXhSYXRlcyB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKS53aGVyZUluKCdpZCcsIGV4Y2hhbmdlUmF0ZXNJZHMpLmRlbGV0ZSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZHM6IGV4Y2hhbmdlUmF0ZXNJZHMgfSk7XG4gICAgfSxcbiAgfSxcbn0iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBwYXJhbSxcbiAgcXVlcnksXG4gIHZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IGRpZmZlcmVuY2UsIHN1bUJ5LCBvbWl0IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCBKb3VybmFsRW50cnkgZnJvbSAnQC9zZXJ2aWNlcy9BY2NvdW50aW5nL0pvdXJuYWxFbnRyeSc7XG5pbXBvcnQgSldUQXV0aCBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9qd3RBdXRoJztcbmltcG9ydCB7XG4gIG1hcFZpZXdSb2xlc1RvQ29uZGl0aW9uYWxzLFxufSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcbmltcG9ydCB7XG4gIER5bmFtaWNGaWx0ZXIsXG4gIER5bmFtaWNGaWx0ZXJTb3J0QnksXG4gIER5bmFtaWNGaWx0ZXJWaWV3cyxcbiAgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzLFxufSBmcm9tICdAL2xpYi9EeW5hbWljRmlsdGVyJztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcbiAgICByb3V0ZXIudXNlKEpXVEF1dGgpO1xuXG4gICAgcm91dGVyLnBvc3QoJy8nLFxuICAgICAgdGhpcy5uZXdFeHBlbnNlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5uZXdFeHBlbnNlLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkL3B1Ymxpc2gnLFxuICAgICAgdGhpcy5wdWJsaXNoRXhwZW5zZS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucHVibGlzaEV4cGVuc2UuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmRlbGV0ZSgnLzppZCcsXG4gICAgICB0aGlzLmRlbGV0ZUV4cGVuc2UudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmRlbGV0ZUV4cGVuc2UuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQnLFxuICAgICAgdGhpcy51cGRhdGVFeHBlbnNlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy51cGRhdGVFeHBlbnNlLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLFxuICAgICAgdGhpcy5saXN0RXhwZW5zZXMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmxpc3RFeHBlbnNlcy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvOmlkJyxcbiAgICAgIHRoaXMuZ2V0RXhwZW5zZS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0RXhwZW5zZS5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIG5ldyBleHBlbnNlLlxuICAgKi9cbiAgbmV3RXhwZW5zZToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCdyZWZlcmVuY2Vfbm8nKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdwYXltZW50X2RhdGUnKS5pc0lTTzg2MDEoKS5vcHRpb25hbCgpLFxuICAgICAgY2hlY2soJ3BheW1lbnRfYWNjb3VudF9pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZGVzY3JpcHRpb24nKS5vcHRpb25hbCgpLFxuICAgICAgY2hlY2soJ2N1cnJlbmN5X2NvZGUnKS5vcHRpb25hbCgpLFxuICAgICAgY2hlY2soJ2V4Y2hhbmdlX3JhdGUnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvRmxvYXQoKSxcbiAgICAgIGNoZWNrKCdwdWJsaXNoJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcblxuICAgICAgY2hlY2soJ2NhdGVnb3JpZXMnKS5leGlzdHMoKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgY2hlY2soJ2NhdGVnb3JpZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcy4qLmV4cGVuc2VfYWNjb3VudF9pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcy4qLmFtb3VudCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9GbG9hdCgpLFxuICAgICAgY2hlY2soJ2NhdGVnb3JpZXMuKi5kZXNjcmlwdGlvbicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gICAgICBjaGVjaygnY3VzdG9tX2ZpZWxkcycpLm9wdGlvbmFsKCkuaXNBcnJheSh7IG1pbjogMCB9KSxcbiAgICAgIGNoZWNrKCdjdXN0b21fZmllbGRzLioua2V5JykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2N1c3RvbV9maWVsZHMuKi52YWx1ZScpLmV4aXN0cygpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgeyBFeHBlbnNlLCBFeHBlbnNlQ2F0ZWdvcnksIEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHB1Ymxpc2hlZDogZmFsc2UsXG4gICAgICAgIGN1c3RvbV9maWVsZHM6IFtdLFxuICAgICAgICBjYXRlZ29yaWVzOiBbXSxcbiAgICAgICAgLi4ucmVxLmJvZHksXG4gICAgICB9O1xuICAgICAgY29uc3QgdG90YWxBbW91bnQgPSBzdW1CeShmb3JtLmNhdGVnb3JpZXMsICdhbW91bnQnKTtcbiAgICAgIGNvbnN0IGV4cGVuc2VBY2NvdW50c0lkcyA9IGZvcm0uY2F0ZWdvcmllcy5tYXAoKGFjY291bnQpID0+IGFjY291bnQuZXhwZW5zZV9hY2NvdW50X2lkKVxuXG4gICAgICBjb25zdCBzdG9yZWRFeHBlbnNlQWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBleHBlbnNlQWNjb3VudHNJZHMpO1xuICAgICAgY29uc3Qgc3RvcmVkRXhwZW5zZUFjY291bnRzSWRzID0gc3RvcmVkRXhwZW5zZUFjY291bnRzLm1hcChhID0+IGEuaWQpO1xuICAgICAgXG4gICAgICBjb25zdCBub3RTdG9yZWRFeHBlbnNlc0FjY291bnRzSWRzID0gZGlmZmVyZW5jZShleHBlbnNlQWNjb3VudHNJZHMsIHN0b3JlZEV4cGVuc2VBY2NvdW50c0lkcyk7XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcblxuICAgICAgY29uc3QgcGF5bWVudEFjY291bnQgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmUoJ2lkJywgZm9ybS5wYXltZW50X2FjY291bnRfaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghcGF5bWVudEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdQQVlNRU5ULkFDQ09VTlQuTk9ULkZPVU5EJywgY29kZTogNTAwLCBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAobm90U3RvcmVkRXhwZW5zZXNBY2NvdW50c0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnRVhQRU5TRS5BQ0NPVU5UUy5JRFMuTk9ULlNUT1JFRCcsIGNvZGU6IDQwMCwgaWRzOiBub3RTdG9yZWRFeHBlbnNlc0FjY291bnRzSWRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbEFtb3VudCA8PSAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1RPVEFMLkFNT1VOVC5FUVVBTFMuWkVSTycsIGNvZGU6IDMwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgXG4gICAgICBjb25zdCBleHBlbnNlVHJhbnNhY3Rpb24gPSBhd2FpdCBFeHBlbnNlLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgdG90YWxfYW1vdW50OiB0b3RhbEFtb3VudCxcbiAgICAgICAgcGF5bWVudF9hY2NvdW50X2lkOiBmb3JtLnBheW1lbnRfYWNjb3VudF9pZCxcbiAgICAgICAgcmVmZXJlbmNlX25vOiBmb3JtLnJlZmVyZW5jZV9ubyxcbiAgICAgICAgZGVzY3JpcHRpb246IGZvcm0uZGVzY3JpcHRpb24sXG4gICAgICAgIHBheW1lbnRfZGF0ZTogbW9tZW50KGZvcm0ucGF5bWVudF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdXNlcl9pZDogdXNlci5pZCxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RvcmVFeHBlbnNlQ2F0ZWdvcmllc09wZXIgPSBbXTtcblxuICAgICAgZm9ybS5jYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5KSA9PiB7XG4gICAgICAgIGNvbnN0IG9wZXIgPSBFeHBlbnNlQ2F0ZWdvcnkucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIGV4cGVuc2VfaWQ6IGV4cGVuc2VUcmFuc2FjdGlvbi5pZCxcbiAgICAgICAgICAuLi5jYXRlZ29yeSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN0b3JlRXhwZW5zZUNhdGVnb3JpZXNPcGVyLnB1c2gob3Blcik7XG4gICAgICB9KTsgXG5cbiAgICAgIGNvbnN0IGFjY291bnRzRGVwR3JhcGggPSBhd2FpdCBBY2NvdW50LmRlcEdyYXBoKCkucXVlcnkoKTtcbiAgICAgIGNvbnN0IGpvdXJuYWxQb3N0ZXIgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0RlcEdyYXBoKTtcblxuICAgICAgY29uc3QgbWl4aW5FbnRyeSA9IHtcbiAgICAgICAgcmVmZXJlbmNlVHlwZTogJ0V4cGVuc2UnLFxuICAgICAgICByZWZlcmVuY2VJZDogZXhwZW5zZVRyYW5zYWN0aW9uLmlkLFxuICAgICAgICB1c2VySWQ6IHVzZXIuaWQsXG4gICAgICAgIGRyYWZ0OiAhZm9ybS5wdWJsaXNoLCAgXG4gICAgICB9O1xuICAgICAgY29uc3QgcGF5bWVudEpvdXJuYWxFbnRyeSA9IG5ldyBKb3VybmFsRW50cnkoe1xuICAgICAgICBjcmVkaXQ6IHRvdGFsQW1vdW50LFxuICAgICAgICBhY2NvdW50OiBwYXltZW50QWNjb3VudC5pZCxcbiAgICAgICAgLi4ubWl4aW5FbnRyeSxcbiAgICAgIH0pO1xuICAgICAgam91cm5hbFBvc3Rlci5jcmVkaXQocGF5bWVudEpvdXJuYWxFbnRyeSlcblxuICAgICAgZm9ybS5jYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4cGVuc2VKb3VybmFsRW50cnkgPSBuZXcgSm91cm5hbEVudHJ5KHtcbiAgICAgICAgICBhY2NvdW50OiBjYXRlZ29yeS5leHBlbnNlX2FjY291bnRfaWQsXG4gICAgICAgICAgZGViaXQ6IGNhdGVnb3J5LmFtb3VudCxcbiAgICAgICAgICBub3RlOiBjYXRlZ29yeS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAuLi5taXhpbkVudHJ5LFxuICAgICAgICB9KTtcbiAgICAgICAgam91cm5hbFBvc3Rlci5kZWJpdChleHBlbnNlSm91cm5hbEVudHJ5KTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAuLi5zdG9yZUV4cGVuc2VDYXRlZ29yaWVzT3BlcixcbiAgICAgICAgam91cm5hbFBvc3Rlci5zYXZlRW50cmllcygpLFxuICAgICAgICAoZm9ybS5zdGF0dXMpICYmIGpvdXJuYWxQb3N0ZXIuc2F2ZUJhbGFuY2UoKSxcbiAgICAgIF0pO1xuICAgICAgXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogZXhwZW5zZVRyYW5zYWN0aW9uLmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggdGhlIGdpdmVuIGV4cGVuc2UgaWQuXG4gICAqL1xuICBwdWJsaXNoRXhwZW5zZToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgRXhwZW5zZSwgQWNjb3VudFRyYW5zYWN0aW9uIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZXhwZW5zZSA9IGF3YWl0IEV4cGVuc2UucXVlcnkoKS5maW5kQnlJZChpZCk7XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcblxuICAgICAgaWYgKCFleHBlbnNlKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0VYUEVOU0UuTk9ULkZPVU5EJywgY29kZTogMTAwIH0pO1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBlbnNlLnB1Ymxpc2hlZCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdFWFBFTlNFLkFMUkVBRFkuUFVCTElTSEVEJywgY29kZTogMjAwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ3JlZmVyZW5jZV90eXBlJywgWydFeHBlbnNlJ10pXG4gICAgICAgIC53aGVyZSgncmVmZXJlbmNlX2lkJywgZXhwZW5zZS5pZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2FjY291bnQudHlwZScpO1xuXG4gICAgICBjb25zdCBhY2NvdW50c0RlcEdyYXBoID0gYXdhaXQgQWNjb3VudC5kZXBHcmFwaCgpLnF1ZXJ5KCkucmVtZW1iZXIoKTtcbiAgICAgIGNvbnN0IGpvdXJuYWwgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0RlcEdyYXBoKTtcblxuICAgICAgam91cm5hbC5sb2FkRW50cmllcyh0cmFuc2FjdGlvbnMpO1xuICAgICAgam91cm5hbC5jYWxjdWxhdGVFbnRyaWVzQmFsYW5jZUNoYW5nZSgpO1xuXG4gICAgICBjb25zdCB1cGRhdGVBY2NUcmFuc2FjdGlvbnNPcGVyID0gQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdyZWZlcmVuY2VfaWQnLCBleHBlbnNlLmlkKVxuICAgICAgICAud2hlcmUoJ3JlZmVyZW5jZV90eXBlJywgJ0V4cGVuc2UnKVxuICAgICAgICAucGF0Y2goe1xuICAgICAgICAgIGRyYWZ0OiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZUV4cGVuc2VPcGVyID0gRXhwZW5zZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBleHBlbnNlLmlkKVxuICAgICAgICAudXBkYXRlKHsgcHVibGlzaGVkOiB0cnVlIH0pO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHVwZGF0ZUFjY1RyYW5zYWN0aW9uc09wZXIsXG4gICAgICAgIHVwZGF0ZUV4cGVuc2VPcGVyLFxuICAgICAgICBqb3VybmFsLnNhdmVCYWxhbmNlKCksXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHBhZ2luYXRlZCBleHBlbnNlcyBsaXN0LlxuICAgKi9cbiAgbGlzdEV4cGVuc2VzOiB7XG4gICAgdmFsaWRhdGlvbjogWyAgICAgIFxuICAgICAgcXVlcnkoJ3BhZ2UnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgncGFnZV9zaXplJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuXG4gICAgICBxdWVyeSgnY3VzdG9tX3ZpZXdfaWQnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzJykub3B0aW9uYWwoKS5pc0pTT04oKSxcblxuICAgICAgcXVlcnkoJ2NvbHVtbl9zb3J0X2J5Jykub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdzb3J0X29yZGVyJykub3B0aW9uYWwoKS5pc0luKFsnZGVzYycsICdhc2MnXSksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIHNvcnRfb3JkZXI6ICdhc2MnLFxuICAgICAgICBmaWx0ZXJfcm9sZXM6IFtdLFxuICAgICAgICBwYWdlX3NpemU6IDE1LFxuICAgICAgICBwYWdlOiAxLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG4gICAgICBjb25zdCB7IFJlc291cmNlLCBFeHBlbnNlLCBWaWV3IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBleHBlbnNlc1Jlc291cmNlID0gYXdhaXQgUmVzb3VyY2UucXVlcnkoKVxuICAgICAgICAucmVtZW1iZXIoKVxuICAgICAgICAud2hlcmUoJ25hbWUnLCAnZXhwZW5zZXMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG4gICAgXG4gICAgICBjb25zdCBleHBlbnNlc1Jlc291cmNlRmllbGRzID0gZXhwZW5zZXNSZXNvdXJjZS5maWVsZHMubWFwKGYgPT4gZi5rZXkpO1xuXG4gICAgICBpZiAoIWV4cGVuc2VzUmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdFWFBFTlNFUy5SRVNPVVJDRS5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIuY3N1dG9tX3ZpZXdfaWQpIHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdpZCcsIGZpbHRlci5jc3V0b21fdmlld19pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnZmF2b3VyaXRlJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdyb2xlcy5maWVsZCcpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ2NvbHVtbnMnKTtcbiAgICAgICAgYnVpbGRlci5maXJzdCgpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkeW5hbWljRmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXIoRXhwZW5zZS50YWJsZU5hbWUpO1xuXG4gICAgICAvLyBDb2x1bW4gc29ydGluZy5cbiAgICAgIGlmIChmaWx0ZXIuY29sdW1uX3NvcnRfYnkpIHtcbiAgICAgICAgaWYgKGV4cGVuc2VzUmVzb3VyY2VGaWVsZHMuaW5kZXhPZihmaWx0ZXIuY29sdW1uX3NvcnRfYnkpID09PSAtMSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NPTFVNTi5TT1JULk9SREVSLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0QnlGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlclNvcnRCeShcbiAgICAgICAgICBmaWx0ZXIuY29sdW1uX3NvcnRfYnksXG4gICAgICAgICAgZmlsdGVyLnNvcnRfb3JkZXIsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHNvcnRCeUZpbHRlcik7ICAgICAgXG4gICAgICB9XG4gICAgICAvLyBDdXN0b20gdmlldyByb2xlcy5cbiAgICAgIGlmICh2aWV3ICYmIHZpZXcucm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2aWV3RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJWaWV3cyhcbiAgICAgICAgICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyh2aWV3LnJvbGVzKSxcbiAgICAgICAgICB2aWV3LnJvbGVzTG9naWNFeHByZXNzaW9uLFxuICAgICAgICApO1xuICAgICAgICBpZiAodmlld0ZpbHRlci52YWxpZGF0ZUZpbHRlclJvbGVzKCkpIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdWSUVXLkxPR0lDLkVYUFJFU1NJT04uSU5WQUxJRCcsIGNvZGU6IDQwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcih2aWV3RmlsdGVyKTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbHRlciByb2xlcy5cbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyX3JvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZmlsdGVyUm9sZXMgPSBuZXcgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzKFxuICAgICAgICAgIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyKGZpbHRlci5maWx0ZXJfcm9sZXMpLFxuICAgICAgICAgIGV4cGVuc2VzUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZmlsdGVyUm9sZXMudmFsaWRhdGVGaWx0ZXJSb2xlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdBQ0NPVU5UUy5SRVNPVVJDRS5IQVMuTk8uR0lWRU4uRklFTERTJywgY29kZTogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKGZpbHRlclJvbGVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4cGVuc2VzID0gYXdhaXQgRXhwZW5zZS5xdWVyeSgpLm9uQnVpbGQoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdwYXltZW50QWNjb3VudCcpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ2NhdGVnb3JpZXMnKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCd1c2VyJyk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuYnVpbGRRdWVyeSgpKGJ1aWxkZXIpO1xuICAgICAgfSkucGFnaW5hdGlvbihmaWx0ZXIucGFnZSAtIDEsIGZpbHRlci5wYWdlX3NpemUpOztcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgZXhwZW5zZXMsXG4gICAgICAgIHBhZ2Vfc2l6ZTogZmlsdGVyLnBhZ2Vfc2l6ZSxcbiAgICAgICAgcGFnZTogZmlsdGVyLnBhZ2UsXG4gICAgICAgIC4uLih2aWV3KSA/IHtcbiAgICAgICAgICB2aWV3Q29sdW1uczogdmlldy5jb2x1bW5zLFxuICAgICAgICAgIGN1c3RvbVZpZXdJZDogdmlldy5pZCxcbiAgICAgICAgIH0gOiB7fSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZ2l2ZW4gZXhwZW5zZSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGRlbGV0ZUV4cGVuc2U6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIEV4cGVuc2UsXG4gICAgICAgIEV4cGVuc2VDYXRlZ29yeSxcbiAgICAgICAgQWNjb3VudFRyYW5zYWN0aW9uLFxuICAgICAgICBBY2NvdW50LFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGV4cGVuc2UgPSBhd2FpdCBFeHBlbnNlLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghZXhwZW5zZSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoeyBlcnJvcnM6IFt7XG4gICAgICAgICAgdHlwZTogJ0VYUEVOU0UuTk9ULkZPVU5EJywgY29kZTogMjAwLFxuICAgICAgICB9XSB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IEV4cGVuc2VDYXRlZ29yeS5xdWVyeSgpLndoZXJlKCdleHBlbnNlX2lkJywgaWQpLmRlbGV0ZSgpO1xuICAgICAgXG4gICAgICBjb25zdCBkZWxldGVFeHBlbnNlT3BlciA9IEV4cGVuc2UucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZGVsZXRlKCk7XG4gICAgICBjb25zdCBleHBlbnNlVHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdyZWZlcmVuY2VfdHlwZScsICdFeHBlbnNlJylcbiAgICAgICAgLndoZXJlKCdyZWZlcmVuY2VfaWQnLCBleHBlbnNlLmlkKTtcblxuICAgICAgY29uc3QgYWNjb3VudHNEZXBHcmFwaCA9IGF3YWl0IEFjY291bnQuZGVwR3JhcGgoKS5xdWVyeSgpLnJlbWVtYmVyKCk7XG4gICAgICBjb25zdCBqb3VybmFsRW50cmllcyA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzRGVwR3JhcGgpO1xuXG4gICAgICBqb3VybmFsRW50cmllcy5sb2FkRW50cmllcyhleHBlbnNlVHJhbnNhY3Rpb25zKTtcbiAgICAgIGpvdXJuYWxFbnRyaWVzLnJlbW92ZUVudHJpZXMoKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBkZWxldGVFeHBlbnNlT3BlcixcbiAgICAgICAgam91cm5hbEVudHJpZXMuZGVsZXRlRW50cmllcygpLFxuICAgICAgICBqb3VybmFsRW50cmllcy5zYXZlQmFsYW5jZSgpLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoKTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZGV0YWlscyBvZiB0aGUgZ2l2ZW4gYWNjb3VudC5cbiAgICovXG4gIHVwZGF0ZUV4cGVuc2U6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ3JlZmVyZW5jZV9ubycpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3BheW1lbnRfZGF0ZScpLmlzSVNPODYwMSgpLm9wdGlvbmFsKCksXG4gICAgICBjaGVjaygncGF5bWVudF9hY2NvdW50X2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdkZXNjcmlwdGlvbicpLm9wdGlvbmFsKCksXG4gICAgICBjaGVjaygnY3VycmVuY3lfY29kZScpLm9wdGlvbmFsKCksXG4gICAgICBjaGVjaygnZXhjaGFuZ2VfcmF0ZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9GbG9hdCgpLFxuICAgICAgY2hlY2soJ3B1Ymxpc2gnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcycpLmV4aXN0cygpLmlzQXJyYXkoeyBtaW46IDEgfSksXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcy4qLmlkJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2NhdGVnb3JpZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcy4qLmV4cGVuc2VfYWNjb3VudF9pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcy4qLmFtb3VudCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9GbG9hdCgpLFxuICAgICAgY2hlY2soJ2NhdGVnb3JpZXMuKi5kZXNjcmlwdGlvbicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7IHVzZXIgfSA9IHJlcTtcbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgRXhwZW5zZSwgRXhwZW5zZUNhdGVnb3J5LCBBY2NvdW50VHJhbnNhY3Rpb24gfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICAgIGNhdGVnb3JpZXM6IFtdLFxuICAgICAgICAuLi5yZXEuYm9keSxcbiAgICAgIH07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZm9ybS5jYXRlZ29yaWVzKSkge1xuICAgICAgICBmb3JtLmNhdGVnb3JpZXMgPSBbZm9ybS5jYXRlZ29yaWVzXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4cGVuc2UgPSBhd2FpdCBFeHBlbnNlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnY2F0ZWdvcmllcycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIWV4cGVuc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdFWFBFTlNFLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcbiAgICAgIGNvbnN0IHBheW1lbnRBY2NvdW50ID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBmb3JtLnBheW1lbnRfYWNjb3VudF9pZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCFwYXltZW50QWNjb3VudCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdQQVlNRU5ULkFDQ09VTlQuTk9ULkZPVU5EJywgY29kZTogNDAwIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgY2F0ZWdvcmllc0hhc05vSWQgPSBmb3JtLmNhdGVnb3JpZXMuZmlsdGVyKGMgPT4gIWMuaWQpO1xuICAgICAgY29uc3QgY2F0ZWdvcmllc0hhc0lkID0gZm9ybS5jYXRlZ29yaWVzLmZpbHRlcihjID0+IGMuaWQpO1xuXG4gICAgICBjb25zdCBleHBlbnNlQ2F0ZWdvcmllc0lkcyA9IGV4cGVuc2UuY2F0ZWdvcmllcy5tYXAoKGMpID0+IGMuaWQpO1xuICAgICAgY29uc3QgZm9ybUV4cGVuc2VDYXRlZ29yaWVzSWRzID0gY2F0ZWdvcmllc0hhc0lkLm1hcChjID0+IGMuaWQpO1xuXG4gICAgICBjb25zdCBjYXRlZ29yaWVzSWRzRGVsZXRlZCA9IGRpZmZlcmVuY2UoXG4gICAgICAgIGZvcm1FeHBlbnNlQ2F0ZWdvcmllc0lkcywgZXhwZW5zZUNhdGVnb3JpZXNJZHMsXG4gICAgICApO1xuICAgICAgY29uc3QgY2F0ZWdvcmllc1Nob3VsZERlbGV0ZSA9IGRpZmZlcmVuY2UoXG4gICAgICAgIGV4cGVuc2VDYXRlZ29yaWVzSWRzLCBmb3JtRXhwZW5zZUNhdGVnb3JpZXNJZHMsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBmb3JtRXhwZW5zZXNBY2NvdW50c0lkcyA9IGZvcm0uY2F0ZWdvcmllcy5tYXAoYyA9PiBjLmV4cGVuc2VfYWNjb3VudF9pZCk7XG4gICAgICBjb25zdCBzdG9yZWRFeHBlbnNlQWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmb3JtRXhwZW5zZXNBY2NvdW50c0lkcyk7XG4gICAgICBjb25zdCBzdG9yZWRFeHBlbnNlQWNjb3VudHNJZHMgPSBzdG9yZWRFeHBlbnNlQWNjb3VudHMubWFwKGEgPT4gYS5pZCk7XG5cbiAgICAgIGNvbnN0IGV4cGVuc2VBY2NvdW50c0lkc05vdEZvdW5kID0gZGlmZmVyZW5jZShcbiAgICAgICAgZm9ybUV4cGVuc2VzQWNjb3VudHNJZHMsIHN0b3JlZEV4cGVuc2VBY2NvdW50c0lkcyxcbiAgICAgICk7IFxuICAgICAgY29uc3QgdG90YWxBbW91bnQgPSBzdW1CeShmb3JtLmNhdGVnb3JpZXMsICdhbW91bnQnKTtcblxuICAgICAgaWYgKGV4cGVuc2VBY2NvdW50c0lkc05vdEZvdW5kLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnRVhQRU5TRS5BQ0NPVU5UUy5JRFMuTk9ULkZPVU5EJywgY29kZTogNjAwLCBpZHM6IGV4cGVuc2VBY2NvdW50c0lkc05vdEZvdW5kIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjYXRlZ29yaWVzSWRzRGVsZXRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0VYUEVOU0UuQ0FURUdPUklFUy5JRFMuTk9ULkZPVU5EJywgY29kZTogMzAwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRvdGFsQW1vdW50IDw9IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnVE9UQUwuQU1PVU5ULkVRVUFMUy5aRVJPJywgY29kZTogNTAwIH0pO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFsbCBlcnJvciByZWFzb25zLlxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhwZW5zZUNhdGVnb3JpZXNNYXAgPSBuZXcgTWFwKGV4cGVuc2UuY2F0ZWdvcmllc1xuICAgICAgICAgIC5tYXAoY2F0ZWdvcnkgPT4gW2NhdGVnb3J5LmlkLCBjYXRlZ29yeV0pKTtcblxuICAgICAgY29uc3QgY2F0ZWdvcmllc0luc2VydE9wZXJzID0gW107XG4gICAgICBjb25zdCBjYXRlZ29yaWVzVXBkYXRlT3BlcnMgPSBbXTtcbiAgICAgIFxuICAgICAgY2F0ZWdvcmllc0hhc05vSWQuZm9yRWFjaCgoY2F0ZWdvcnkpID0+IHtcbiAgICAgICAgY29uc3Qgb3BlciA9IEV4cGVuc2VDYXRlZ29yeS5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgICAgLi4uY2F0ZWdvcnksXG4gICAgICAgICAgZXhwZW5zZV9pZDogZXhwZW5zZS5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNhdGVnb3JpZXNJbnNlcnRPcGVycy5wdXNoKG9wZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNhdGVnb3JpZXNIYXNJZC5mb3JFYWNoKChjYXRlZ29yeSkgPT4geyBcbiAgICAgICAgY29uc3Qgb3BlciA9IEV4cGVuc2VDYXRlZ29yeS5xdWVyeSgpLndoZXJlKCdpZCcsIGNhdGVnb3J5LmlkKVxuICAgICAgICAgIC5wYXRjaCh7XG4gICAgICAgICAgICAuLi5vbWl0KGNhdGVnb3J5LCBbJ2lkJ10pLFxuICAgICAgICAgIH0pO1xuICAgICAgICBjYXRlZ29yaWVzVXBkYXRlT3BlcnMucHVzaChvcGVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1cGRhdGVFeHBlbnNlT3BlciA9IEV4cGVuc2UucXVlcnkoKS53aGVyZSgnaWQnLCBpZClcbiAgICAgICAgLnVwZGF0ZSh7XG4gICAgICAgICAgcGF5bWVudF9kYXRlOiBtb21lbnQoZm9ybS5wYXltZW50X2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxuICAgICAgICAgIHRvdGFsX2Ftb3VudDogdG90YWxBbW91bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGZvcm0uZGVzY3JpcHRpb24sXG4gICAgICAgICAgcGF5bWVudF9hY2NvdW50X2lkOiBmb3JtLnBheW1lbnRfYWNjb3VudF9pZCxcbiAgICAgICAgICByZWZlcmVuY2Vfbm86IGZvcm0ucmVmZXJlbmNlX25vLFxuICAgICAgICB9KVxuXG4gICAgICBjb25zdCBkZWxldGVDYXRlZ29yaWVzT3BlciA9IChjYXRlZ29yaWVzU2hvdWxkRGVsZXRlLmxlbmd0aCA+IDApID9cbiAgICAgICAgRXhwZW5zZUNhdGVnb3J5LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBjYXRlZ29yaWVzU2hvdWxkRGVsZXRlKS5kZWxldGUoKSA6IFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBqb3VybmFsIGVudHJpZXMuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmVJbigncmVmZXJlbmNlX3R5cGUnLCBbJ0V4cGVuc2UnXSlcbiAgICAgICAgLndoZXJlKCdyZWZlcmVuY2VfaWQnLCBleHBlbnNlLmlkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnYWNjb3VudC50eXBlJyk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzRGVwR3JhcGggPSBhd2FpdCBBY2NvdW50LmRlcEdyYXBoKCkucXVlcnkoKS5yZW1lbWJlcigpO1xuICAgICAgY29uc3Qgam91cm5hbCA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzRGVwR3JhcGgpO1xuXG4gICAgICBqb3VybmFsLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9ucyk7XG4gICAgICBqb3VybmFsLnJlbW92ZUVudHJpZXMoKTtcblxuICAgICAgY29uc3QgbWl4aW5FbnRyeSA9IHtcbiAgICAgICAgcmVmZXJlbmNlVHlwZTogJ0V4cGVuc2UnLFxuICAgICAgICByZWZlcmVuY2VJZDogZXhwZW5zZS5pZCxcbiAgICAgICAgdXNlcklkOiB1c2VyLmlkLFxuICAgICAgICBkcmFmdDogIWZvcm0ucHVibGlzaCwgIFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBheW1lbnRKb3VybmFsRW50cnkgPSBuZXcgSm91cm5hbEVudHJ5KHtcbiAgICAgICAgY3JlZGl0OiB0b3RhbEFtb3VudCxcbiAgICAgICAgYWNjb3VudDogcGF5bWVudEFjY291bnQuaWQsXG4gICAgICAgIC4uLm1peGluRW50cnksXG4gICAgICB9KTtcbiAgICAgIGpvdXJuYWwuY3JlZGl0KHBheW1lbnRKb3VybmFsRW50cnkpO1xuXG4gICAgICBmb3JtLmNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnkpID0+IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgSm91cm5hbEVudHJ5KHtcbiAgICAgICAgICBhY2NvdW50OiBjYXRlZ29yeS5leHBlbnNlX2FjY291bnRfaWQsXG4gICAgICAgICAgZGViaXQ6IGNhdGVnb3J5LmFtb3VudCxcbiAgICAgICAgICBub3RlOiBjYXRlZ29yeS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAuLi5taXhpbkVudHJ5LFxuICAgICAgICB9KTtcbiAgICAgICAgam91cm5hbC5kZWJpdChlbnRyeSk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAuLi5jYXRlZ29yaWVzSW5zZXJ0T3BlcnMsXG4gICAgICAgIC4uLmNhdGVnb3JpZXNVcGRhdGVPcGVycyxcbiAgICAgICAgdXBkYXRlRXhwZW5zZU9wZXIsXG4gICAgICAgIGRlbGV0ZUNhdGVnb3JpZXNPcGVyLFxuXG4gICAgICAgIGpvdXJuYWwuc2F2ZUVudHJpZXMoKSxcbiAgICAgICAgKGZvcm0uc3RhdHVzKSAmJiBqb3VybmFsLnNhdmVCYWxhbmNlKCksXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRldGFpbHMgb2YgdGhlIGdpdmVuIGV4cGVuc2UgaWQuXG4gICAqL1xuICBnZXRFeHBlbnNlOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBFeHBlbnNlLCBBY2NvdW50VHJhbnNhY3Rpb24gfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGV4cGVuc2UgPSBhd2FpdCBFeHBlbnNlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnY2F0ZWdvcmllcycpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdwYXltZW50QWNjb3VudCcpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd1c2VyJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghZXhwZW5zZSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0VYUEVOU0UuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgam91cm5hbEVudHJpZXMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ3JlZmVyZW5jZV9pZCcsIGV4cGVuc2UuaWQpXG4gICAgICAgIC53aGVyZSgncmVmZXJlbmNlX3R5cGUnLCAnRXhwZW5zZScpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBleHBlbnNlOiB7XG4gICAgICAgICAgLi4uZXhwZW5zZSxcbiAgICAgICAgICBqb3VybmFsRW50cmllcyxcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcblxuaW1wb3J0IEJhbGFuY2VTaGVldENvbnRyb2xsZXIgZnJvbSAnLi9GaW5hbmNpYWxTdGF0ZW1lbnRzL0JhbGFuY2VTaGVldCc7XG5pbXBvcnQgVHJpYWxCYWxhbmNlU2hlZXRDb250cm9sbGVyIGZyb20gJy4vRmluYW5jaWFsU3RhdGVtZW50cy9UcmlhbEJhbGFuY2VTaGVldCc7XG5pbXBvcnQgR2VuZXJhbExlZGdlckNvbnRyb2xsZXIgZnJvbSAnLi9GaW5hbmNpYWxTdGF0ZW1lbnRzL2dlbmVyYWxMZWRnZXInO1xuaW1wb3J0IEpvdXJuYWxTaGVldENvbnRyb2xsZXIgZnJvbSAnLi9GaW5hbmNpYWxTdGF0ZW1lbnRzL0pvdXJuYWxTaGVldCc7XG5pbXBvcnQgUHJvZml0TG9zc0NvbnRyb2xsZXIgZnJvbSAnLi9GaW5hbmNpYWxTdGF0ZW1lbnRzL1Byb2ZpdExvc3NTaGVldCc7XG5pbXBvcnQgUmVjZWl2YWJsZUFnaW5nU3VtbWFyeSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudHMvUmVjZWl2YWJsZUFnaW5nU3VtbWFyeSc7XG5pbXBvcnQgUGF5YWJsZUFnaW5nU3VtbWFyeSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudHMvUGF5YWJsZUFnaW5nU3VtbWFyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLnVzZSgnL2JhbGFuY2Vfc2hlZXQnLCBCYWxhbmNlU2hlZXRDb250cm9sbGVyLnJvdXRlcigpKTtcbiAgICByb3V0ZXIudXNlKCcvcHJvZml0X2xvc3Nfc2hlZXQnLCBQcm9maXRMb3NzQ29udHJvbGxlci5yb3V0ZXIoKSk7XG4gICAgcm91dGVyLnVzZSgnL2dlbmVyYWxfbGVkZ2VyJywgR2VuZXJhbExlZGdlckNvbnRyb2xsZXIucm91dGVyKCkpO1xuICAgIHJvdXRlci51c2UoJy90cmlhbF9iYWxhbmNlX3NoZWV0JywgVHJpYWxCYWxhbmNlU2hlZXRDb250cm9sbGVyLnJvdXRlcigpKTtcbiAgICByb3V0ZXIudXNlKCcvam91cm5hbCcsIEpvdXJuYWxTaGVldENvbnRyb2xsZXIucm91dGVyKCkpO1xuICAgIHJvdXRlci51c2UoJy9yZWNlaXZhYmxlX2FnaW5nX3N1bW1hcnknLCBSZWNlaXZhYmxlQWdpbmdTdW1tYXJ5LnJvdXRlcigpKTtcbiAgICByb3V0ZXIudXNlKCcvcGF5YWJsZV9hZ2luZ19zdW1tYXJ5JywgUGF5YWJsZUFnaW5nU3VtbWFyeS5yb3V0ZXIoKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxufTtcbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBvbWl0LCByZXZlcnNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCYXNlQ29udHJvbGxlciBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvQmFzZUNvbnRyb2xsZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZ2luZ1JlcG9ydCBleHRlbmRzIEJhc2VDb250cm9sbGVye1xuXG4gIC8qKlxuICAgKiBFeHByZXNzIHZhbGlkYXRvciBtaWRkbGV3YXJlLiBcbiAgICogQHBhcmFtIHtSZXF1ZXN0fSByZXEgXG4gICAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlcyBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dCBcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZVJlc3VsdHMocmVxLCByZXMsIG5leHQpIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgbmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0ge0FycmF5fSBhZ2luZ1BlcmlvZHMgXG4gICAqIEBwYXJhbSB7TnVtZXJpY30gY3VzdG9tZXJCYWxhbmNlIFxuICAgKi9cbiAgc3RhdGljIGNvbnRhY3RBZ2luZ0JhbGFuY2UoYWdpbmdQZXJpb2RzLCByZWNlaXZhYmxlVG90YWxDcmVkaXQpIHtcbiAgICBsZXQgcHJldkFnaW5nID0gMDtcbiAgICBsZXQgcmVjZWl2YWJsZUNyZWRpdCA9IHJlY2VpdmFibGVUb3RhbENyZWRpdDtcbiAgICBsZXQgZGlmZiA9IHJlY2VpdmFibGVDcmVkaXQ7XG5cbiAgICBjb25zdCBwZXJpb2RzID0gcmV2ZXJzZShhZ2luZ1BlcmlvZHMpLm1hcCgoYWdpbmdQZXJpb2QpID0+IHsgXG4gICAgICBjb25zdCBhZ2luZ0Ftb3VudCA9IChhZ2luZ1BlcmlvZC5jbG9zaW5nQmFsYW5jZSAtIHByZXZBZ2luZyk7XG4gICAgICBjb25zdCBzdWJ0cmFjdCA9IE1hdGgubWluKGRpZmYsIGFnaW5nQW1vdW50KTtcbiAgICAgIGRpZmYgLT0gTWF0aC5taW4oYWdpbmdBbW91bnQsIGRpZmYpO1xuXG4gICAgICBjb25zdCB0b3RhbCA9IE1hdGgubWF4KGFnaW5nQW1vdW50IC0gc3VidHJhY3QsIDApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICAgIC4uLm9taXQoYWdpbmdQZXJpb2QsIFsnY2xvc2luZ0JhbGFuY2UnXSksXG4gICAgICAgIHRvdGFsLFxuICAgICAgfTtcbiAgICAgIHByZXZBZ2luZyA9IGFnaW5nUGVyaW9kLmNsb3NpbmdCYWxhbmNlO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbiAgICByZXR1cm4gcmV2ZXJzZShwZXJpb2RzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIHsqfSBhc0RheSBcbiAgICogQHBhcmFtIHsqfSBhZ2luZ0RheXNCZWZvcmUgXG4gICAqIEBwYXJhbSB7Kn0gYWdpbmdQZXJpb2RzRnJlcSBcbiAgICovXG4gIHN0YXRpYyBhZ2luZ1JhbmdlUGVyaW9kcyhhc0RheSwgYWdpbmdEYXlzQmVmb3JlLCBhZ2luZ1BlcmlvZHNGcmVxKSB7XG4gICAgY29uc3QgdG90YWxBZ2luZ0RheXMgPSBhZ2luZ0RheXNCZWZvcmUgKiBhZ2luZ1BlcmlvZHNGcmVxO1xuICAgIGNvbnN0IHN0YXJ0QWdpbmcgPSBtb21lbnQoYXNEYXkpLnN0YXJ0T2YoJ2RheScpO1xuICAgIGNvbnN0IGVuZEFnaW5nID0gc3RhcnRBZ2luZy5jbG9uZSgpLnN1YnRyYWN0KCdkYXlzJywgdG90YWxBZ2luZ0RheXMpLmVuZE9mKCdkYXknKTtcblxuICAgIGNvbnN0IGFnaW5nUGVyaW9kcyA9IFtdO1xuICAgIGNvbnN0IHN0YXJ0aW5nQWdpbmcgPSBzdGFydEFnaW5nLmNsb25lKCk7XG5cbiAgICBsZXQgYmVmb3JlRGF5cyA9IDE7XG4gICAgbGV0IHRvRGF5cyA9IDA7XG5cbiAgICB3aGlsZSAoc3RhcnRpbmdBZ2luZyA+IGVuZEFnaW5nKSB7XG4gICAgICBjb25zdCBjdXJyZW50QWdpbmcgPSBzdGFydGluZ0FnaW5nLmNsb25lKCk7XG4gICAgICBzdGFydGluZ0FnaW5nLnN1YnRyYWN0KCdkYXlzJywgYWdpbmdEYXlzQmVmb3JlKS5lbmRPZignZGF5Jyk7XG4gICAgICB0b0RheXMgKz0gYWdpbmdEYXlzQmVmb3JlO1xuXG4gICAgICBhZ2luZ1BlcmlvZHMucHVzaCh7XG4gICAgICAgIGZyb21fcGVyaW9kOiBtb21lbnQoY3VycmVudEFnaW5nKS50b0RhdGUoKSxcbiAgICAgICAgdG9fcGVyaW9kOiBtb21lbnQoc3RhcnRpbmdBZ2luZykudG9EYXRlKCksXG4gICAgICAgIGJlZm9yZV9kYXlzOiBiZWZvcmVEYXlzID09PSAxID8gMCA6IGJlZm9yZURheXMsXG4gICAgICAgIHRvX2RheXM6IHRvRGF5cyxcbiAgICAgICAgLi4uKHN0YXJ0aW5nQWdpbmcudmFsdWVPZigpID09PSBlbmRBZ2luZy52YWx1ZU9mKCkpID8ge1xuICAgICAgICAgIHRvX3BlcmlvZDogbnVsbCxcbiAgICAgICAgICB0b19kYXlzOiBudWxsLFxuICAgICAgICB9IDoge30sXG4gICAgICB9KTtcbiAgICAgIGJlZm9yZURheXMgKz0gYWdpbmdEYXlzQmVmb3JlO1xuICAgIH1cbiAgICByZXR1cm4gYWdpbmdQZXJpb2RzO1xuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0geyp9IGZpbHRlciBcbiAgICovXG4gIHN0YXRpYyBmb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlcikge1xuICAgIHJldHVybiAoYmFsYW5jZSkgPT4ge1xuICAgICAgbGV0IGZvcm1hdHRlZEJhbGFuY2UgPSBwYXJzZUZsb2F0KGJhbGFuY2UpO1xuICAgIFxuICAgICAgaWYgKGZpbHRlci5ub19jZW50cykge1xuICAgICAgICBmb3JtYXR0ZWRCYWxhbmNlID0gcGFyc2VJbnQoZm9ybWF0dGVkQmFsYW5jZSwgMTApO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlci5kaXZpZGVfMTAwMCkge1xuICAgICAgICBmb3JtYXR0ZWRCYWxhbmNlIC89IDEwMDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm9ybWF0dGVkQmFsYW5jZTtcbiAgICB9O1xuICB9XG59IiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBxdWVyeSwgb25lT2YsIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBwaWNrLCBkaWZmZXJlbmNlLCBncm91cEJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCB7IGRhdGVSYW5nZUNvbGxlY3Rpb24gfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCBEZXBlbmRlbmN5R3JhcGggZnJvbSAnQC9saWIvRGVwZW5kZW5jeUdyYXBoJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJ1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyQ2xvc3VyZSB9IGZyb20gJy4vRmluYW5jaWFsU3RhdGVtZW50TWl4aW4nO1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLmdldCgnLycsIFxuICAgICAgdGhpcy5iYWxhbmNlU2hlZXQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmJhbGFuY2VTaGVldC5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuICBcbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBiYWxhbmNlIHNoZWV0LlxuICAgKi9cbiAgYmFsYW5jZVNoZWV0OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2FjY291bnRpbmdfbWV0aG9kJykub3B0aW9uYWwoKS5pc0luKFsnY2FzaCcsICdhY2N1cmFsJ10pLFxuICAgICAgcXVlcnkoJ2Zyb21fZGF0ZScpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgndG9fZGF0ZScpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgnZGlzcGxheV9jb2x1bW5zX3R5cGUnKS5vcHRpb25hbCgpLmlzSW4oWydkYXRlX3BlcmlvZHMnLCAndG90YWwnXSksXG4gICAgICBxdWVyeSgnZGlzcGxheV9jb2x1bW5zX2J5Jykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSwgY2hlY2tGYWxzeTogdHJ1ZSB9KVxuICAgICAgICAuaXNJbihbJ3llYXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAncXVhcnRlciddKSxcbiAgICAgIHF1ZXJ5KCdudW1iZXJfZm9ybWF0Lm5vX2NlbnRzJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICAgIHF1ZXJ5KCdudW1iZXJfZm9ybWF0LmRpdmlkZV8xMDAwJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICAgIHF1ZXJ5KCdhY2NvdW50X2lkcycpLmlzQXJyYXkoKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ2FjY291bnRfaWRzLionKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBBY2NvdW50LCBBY2NvdW50VHlwZSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBkaXNwbGF5X2NvbHVtbnNfdHlwZTogJ3RvdGFsJyxcbiAgICAgICAgZGlzcGxheV9jb2x1bW5zX2J5OiAnJyxcbiAgICAgICAgZnJvbV9kYXRlOiBtb21lbnQoKS5zdGFydE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIHRvX2RhdGU6IG1vbWVudCgpLmVuZE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIG51bWJlcl9mb3JtYXQ6IHtcbiAgICAgICAgICBub19jZW50czogZmFsc2UsXG4gICAgICAgICAgZGl2aWRlXzEwMDA6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBub25lX3plcm86IGZhbHNlLFxuICAgICAgICBiYXNpczogJ2Nhc2gnLFxuICAgICAgICBhY2NvdW50X2lkczogW10sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyLmFjY291bnRfaWRzKSkge1xuICAgICAgICBmaWx0ZXIuYWNjb3VudF9pZHMgPSBbZmlsdGVyLmFjY291bnRfaWRzXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWNjb3VudCBiYWxhbmNlIGZvcm1tYXR0ZXIgYmFzZWQgb24gdGhlIGdpdmVuIHF1ZXJ5LlxuICAgICAgY29uc3QgYmFsYW5jZUZvcm1hdHRlciA9IGZvcm1hdE51bWJlckNsb3N1cmUoZmlsdGVyLm51bWJlcl9mb3JtYXQpO1xuICAgICAgY29uc3QgY29tcGFyYXRvckRhdGVUeXBlID0gZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAndG90YWwnID8gJ2RheScgOiBmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX2J5O1xuXG4gICAgICBjb25zdCBiYWxhbmNlU2hlZXRUeXBlcyA9IGF3YWl0IEFjY291bnRUeXBlLnF1ZXJ5KCkud2hlcmUoJ2JhbGFuY2Vfc2hlZXQnLCB0cnVlKTtcblxuICAgICAgLy8gRmV0Y2ggYWxsIGJhbGFuY2Ugc2hlZXQgYWNjb3VudHMgZnJvbSB0aGUgc3RvcmFnZS5cbiAgICAgIGNvbnN0IGFjY291bnRzID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC8vIC5yZW1lbWJlcignYmFsYW5jZV9zaGVldF9hY2NvdW50cycpXG4gICAgICAgIC53aGVyZUluKCdhY2NvdW50X3R5cGVfaWQnLCBiYWxhbmNlU2hlZXRUeXBlcy5tYXAoKGEpID0+IGEuaWQpKVxuICAgICAgICAubW9kaWZ5KCdmaWx0ZXJBY2NvdW50cycsIGZpbHRlci5hY2NvdW50X2lkcylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3R5cGUnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndHJhbnNhY3Rpb25zJylcbiAgICAgICAgLm1vZGlmeUdyYXBoKCd0cmFuc2FjdGlvbnMnLCAoYnVpbGRlcikgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubW9kaWZ5KCdmaWx0ZXJEYXRlUmFuZ2UnLCBudWxsLCBmaWx0ZXIudG9fZGF0ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBBY2NvdW50cyBkZXBlbmRlbmN5IGdyYXBoLlxuICAgICAgY29uc3QgYWNjb3VudHNHcmFwaCA9IERlcGVuZGVuY3lHcmFwaC5mcm9tQXJyYXkoXG4gICAgICAgIGFjY291bnRzLCB7IGl0ZW1JZDogJ2lkJywgcGFyZW50SXRlbUlkOiAncGFyZW50QWNjb3VudElkJyB9XG4gICAgICApO1xuICAgICAgLy8gTG9hZCBhbGwgZW50cmllcyB0aGF0IGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIGFjY291bnRzLlxuICAgICAgY29uc3Qgam91cm5hbEVudHJpZXNDb2xsZWN0ZWQgPSBBY2NvdW50LmNvbGxlY3RKb3VybmFsRW50cmllcyhhY2NvdW50cyk7XG4gICAgICBjb25zdCBqb3VybmFsRW50cmllcyA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzR3JhcGgpO1xuXG4gICAgICBqb3VybmFsRW50cmllcy5sb2FkRW50cmllcyhqb3VybmFsRW50cmllc0NvbGxlY3RlZCk7XG5cbiAgICAgIC8vIERhdGUgcmFuZ2UgY29sbGVjdGlvbi4gXG4gICAgICBjb25zdCBkYXRlUmFuZ2VTZXQgPSAoZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAnZGF0ZV9wZXJpb2RzJylcbiAgICAgICAgPyBkYXRlUmFuZ2VDb2xsZWN0aW9uKFxuICAgICAgICAgIGZpbHRlci5mcm9tX2RhdGUsIGZpbHRlci50b19kYXRlLCBjb21wYXJhdG9yRGF0ZVR5cGUsXG4gICAgICAgICkgOiBbXTtcblxuICAgICAgLy8gR2V0cyB0aGUgZGF0ZSByYW5nZSBzZXQgZnJvbSBzdGFydCB0byBlbmQgZGF0ZS5cbiAgICAgIGNvbnN0IHRvdGFsUGVyaW9kcyA9IChhY2NvdW50KSA9PiAoe1xuICAgICAgICB0b3RhbF9wZXJpb2RzOiBkYXRlUmFuZ2VTZXQubWFwKChkYXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gam91cm5hbEVudHJpZXMuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCwgZGF0ZSwgY29tcGFyYXRvckRhdGVUeXBlKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICBmb3JtYXR0ZWRfYW1vdW50OiBiYWxhbmNlRm9ybWF0dGVyKGFtb3VudCksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzTWFwcGVyVG9SZXNwb25zZSA9IChhY2NvdW50KSA9PiB7XG4gICAgICAgIC8vIENhbGN1bGF0ZXMgdGhlIGNsb3NpbmcgYmFsYW5jZSB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAgICAgICAgY29uc3QgY2xvc2luZ0JhbGFuY2UgPSBqb3VybmFsRW50cmllcy5nZXRBY2NvdW50QmFsYW5jZShhY2NvdW50LmlkLCBmaWx0ZXIudG9fZGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5waWNrKGFjY291bnQsIFsnaWQnLCAnaW5kZXgnLCAnbmFtZScsICdjb2RlJywgJ3BhcmVudEFjY291bnRJZCddKSxcblxuICAgICAgICAgIC8vIERhdGUgcGVyaW9kcyB3aGVuIGRpc3BsYXkgY29sdW1ucy5cbiAgICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAnZGF0ZV9wZXJpb2RzJykgJiYgdG90YWxQZXJpb2RzKGFjY291bnQpLFxuXG4gICAgICAgICAgdG90YWw6IHtcbiAgICAgICAgICAgIGFtb3VudDogY2xvc2luZ0JhbGFuY2UsXG4gICAgICAgICAgICBmb3JtYXR0ZWRfYW1vdW50OiBiYWxhbmNlRm9ybWF0dGVyKGNsb3NpbmdCYWxhbmNlKSxcbiAgICAgICAgICAgIGRhdGU6IGZpbHRlci50b19kYXRlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgICAvLyBSZXRyaWV2ZSBhbGwgYXNzZXRzIGFjY291bnRzLlxuICAgICAgY29uc3QgYXNzZXRzQWNjb3VudHMgPSBhY2NvdW50cy5maWx0ZXIoKGFjY291bnQpID0+IChcbiAgICAgICAgYWNjb3VudC50eXBlLm5vcm1hbCA9PT0gJ2RlYml0J1xuICAgICAgICAgICYmIChhY2NvdW50LnRyYW5zYWN0aW9ucy5sZW5ndGggPiAwIHx8ICFmaWx0ZXIubm9uZV96ZXJvKSkpXG4gICAgICAgICAgLm1hcChhY2NvdW50c01hcHBlclRvUmVzcG9uc2UpO1xuXG4gICAgICAvLyBSZXRyaWV2ZSBhbGwgbGlhYmlsaXR5IGFjY291bnRzLlxuICAgICAgY29uc3QgbGlhYmlsaXRpZXNBY2NvdW50cyA9IGFjY291bnRzLmZpbHRlcigoYWNjb3VudCkgPT4gKFxuICAgICAgICBhY2NvdW50LnR5cGUubm9ybWFsID09PSAnY3JlZGl0J1xuICAgICAgICAgICYmIChhY2NvdW50LnRyYW5zYWN0aW9ucy5sZW5ndGggPiAwIHx8ICFmaWx0ZXIubm9uZV96ZXJvKSkpXG4gICAgICAgICAgLm1hcChhY2NvdW50c01hcHBlclRvUmVzcG9uc2UpO1xuXG4gICAgICAvLyBSZXRyaWV2ZSB0aGUgYXNzZXQgYmFsYW5jZSBzaGVldC5cbiAgICAgIGNvbnN0IGFzc2V0c0FjY291bnRzUmVzcG9uc2UgPSBBY2NvdW50LnRvTmVzdGVkQXJyYXkoYXNzZXRzQWNjb3VudHMpO1xuXG4gICAgICAvLyBSZXRyaWV2ZSBsaWFiaWxpdGllcyBhbmQgZXF1aXR5IGJhbGFuY2Ugc2hlZXQuXG4gICAgICBjb25zdCBsaWFiaWxpdGllc0VxdWl0eVJlc3BvbnNlID0gQWNjb3VudC50b05lc3RlZEFycmF5KGxpYWJpbGl0aWVzQWNjb3VudHMpO1xuXG4gICAgICAvLyBSZXNwb25zZS5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIHF1ZXJ5OiB7IC4uLmZpbHRlciB9LFxuICAgICAgICBjb2x1bW5zOiB7IC4uLmRhdGVSYW5nZVNldCB9LFxuICAgICAgICBhY2NvdW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdBc3NldHMnLFxuICAgICAgICAgICAgdHlwZTogJ2Fzc2V0cycsXG4gICAgICAgICAgICBjaGlsZHJlbjogWy4uLmFzc2V0c0FjY291bnRzUmVzcG9uc2VdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0xpYWJpbGl0aWVzICYgRXF1aXR5JyxcbiAgICAgICAgICAgIHR5cGU6ICdsaWFiaWxpdGllc19lcXVpdHknLFxuICAgICAgICAgICAgY2hpbGRyZW46IFsuLi5saWFiaWxpdGllc0VxdWl0eVJlc3BvbnNlXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn0iLCJcblxuZXhwb3J0IGNvbnN0IGZvcm1hdE51bWJlckNsb3N1cmUgPSAoZmlsdGVyKSA9PiAoYmFsYW5jZSkgPT4ge1xuICBsZXQgZm9ybWF0dGVkQmFsYW5jZSA9IHBhcnNlRmxvYXQoYmFsYW5jZSk7XG5cbiAgaWYgKGZpbHRlci5ub19jZW50cykge1xuICAgIGZvcm1hdHRlZEJhbGFuY2UgPSBwYXJzZUludChmb3JtYXR0ZWRCYWxhbmNlLCAxMCk7XG4gIH1cbiAgaWYgKGZpbHRlci5kaXZpZGVfMTAwMCkge1xuICAgIGZvcm1hdHRlZEJhbGFuY2UgLz0gMTAwMDtcbiAgfVxuICByZXR1cm4gZm9ybWF0dGVkQmFsYW5jZTtcbn07IiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBxdWVyeSwgb25lT2YsIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBncm91cEJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCB7IGZvcm1hdE51bWJlckNsb3N1cmUgfSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudE1peGluJztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLCBcbiAgICAgIHRoaXMuam91cm5hbC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuam91cm5hbC5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgbGVkZ2VyIHJlcG9ydCBvZiB0aGUgZ2l2ZW4gYWNjb3VudC5cbiAgICovXG4gIGpvdXJuYWw6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnZnJvbV9kYXRlJykub3B0aW9uYWwoKS5pc0lTTzg2MDEoKSxcbiAgICAgIHF1ZXJ5KCd0b19kYXRlJykub3B0aW9uYWwoKS5pc0lTTzg2MDEoKSxcbiAgICAgIG9uZU9mKFtcbiAgICAgICAgcXVlcnkoJ3RyYW5zYWN0aW9uX3R5cGVzJykub3B0aW9uYWwoKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgICBxdWVyeSgndHJhbnNhY3Rpb25fdHlwZXMuKicpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIF0sIFtcbiAgICAgICAgcXVlcnkoJ3RyYW5zYWN0aW9uX3R5cGVzJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBdKSxcbiAgICAgIG9uZU9mKFtcbiAgICAgICAgcXVlcnkoJ2FjY291bnRfaWRzJykub3B0aW9uYWwoKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgICBxdWVyeSgnYWNjb3VudF9pZHMuKicpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIF0sIFtcbiAgICAgICAgcXVlcnkoJ2FjY291bnRfaWRzJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgXSksXG4gICAgICBxdWVyeSgnZnJvbV9yYW5nZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCd0b19yYW5nZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdudW1iZXJfZm9ybWF0Lm5vX2NlbnRzJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICAgIHF1ZXJ5KCdudW1iZXJfZm9ybWF0LmRpdmlkZV8xMDAwJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IEFjY291bnRUcmFuc2FjdGlvbiB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBmcm9tX2RhdGU6IG1vbWVudCgpLnN0YXJ0T2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdG9fZGF0ZTogbW9tZW50KCkuZW5kT2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgZnJvbV9yYW5nZTogbnVsbCxcbiAgICAgICAgdG9fcmFuZ2U6IG51bGwsXG4gICAgICAgIGFjY291bnRfaWRzOiBbXSxcbiAgICAgICAgdHJhbnNhY3Rpb25fdHlwZXM6IFtdLFxuICAgICAgICBudW1iZXJfZm9ybWF0OiB7XG4gICAgICAgICAgbm9fY2VudHM6IGZhbHNlLFxuICAgICAgICAgIGRpdmlkZV8xMDAwOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIudHJhbnNhY3Rpb25fdHlwZXMpKSB7XG4gICAgICAgIGZpbHRlci50cmFuc2FjdGlvbl90eXBlcyA9IFtmaWx0ZXIudHJhbnNhY3Rpb25fdHlwZXNdO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci5hY2NvdW50X2lkcykpIHtcbiAgICAgICAgZmlsdGVyLmFjY291bnRfaWRzID0gW2ZpbHRlci5hY2NvdW50X2lkc107XG4gICAgICB9XG4gICAgICBmaWx0ZXIuYWNjb3VudF9pZHMgPSBmaWx0ZXIuYWNjb3VudF9pZHMubWFwKChpZCkgPT4gcGFyc2VJbnQoaWQsIDEwKSk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzSm91cm5hbEVudHJpZXMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAvLyAucmVtZW1iZXIoKVxuICAgICAgICAubW9kaWZ5KCdmaWx0ZXJEYXRlUmFuZ2UnLCBmaWx0ZXIuZnJvbV9kYXRlLCBmaWx0ZXIudG9fZGF0ZSlcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyQWNjb3VudHMnLCBmaWx0ZXIuYWNjb3VudF9pZHMpXG4gICAgICAgIC5tb2RpZnkoJ2ZpbHRlclRyYW5zYWN0aW9uVHlwZXMnLCBmaWx0ZXIudHJhbnNhY3Rpb25fdHlwZXMpXG4gICAgICAgIC5tb2RpZnkoJ2ZpbHRlckFtb3VudFJhbmdlJywgZmlsdGVyLmZyb21fcmFuZ2UsIGZpbHRlci50b19yYW5nZSlcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2FjY291bnQudHlwZScpO1xuXG4gICAgICBjb25zdCBmb3JtYXROdW1iZXIgPSBmb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlci5udW1iZXJfZm9ybWF0KTtcblxuICAgICAgY29uc3Qgam91cm5hbEdyb3VwZWQgPSBncm91cEJ5KGFjY291bnRzSm91cm5hbEVudHJpZXMsXG4gICAgICAgIChlbnRyeSkgPT4gYCR7ZW50cnkucmVmZXJlbmNlSWR9LSR7ZW50cnkucmVmZXJlbmNlVHlwZX1gKTtcblxuICAgICAgY29uc3Qgam91cm5hbCA9IE9iamVjdC5rZXlzKGpvdXJuYWxHcm91cGVkKS5tYXAoKGtleSkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbnNHcm91cCA9IGpvdXJuYWxHcm91cGVkW2tleV07XG5cbiAgICAgICAgY29uc3Qgam91cm5hbFBvc3RlciA9IG5ldyBKb3VybmFsUG9zdGVyKCk7XG4gICAgICAgIGpvdXJuYWxQb3N0ZXIubG9hZEVudHJpZXModHJhbnNhY3Rpb25zR3JvdXApO1xuXG4gICAgICAgIGNvbnN0IHRyaWFsQmFsYW5jZSA9IGpvdXJuYWxQb3N0ZXIuZ2V0VHJpYWxCYWxhbmNlKCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDoga2V5LFxuICAgICAgICAgIGVudHJpZXM6IHRyYW5zYWN0aW9uc0dyb3VwLFxuXG4gICAgICAgICAgY3JlZGl0OiB0cmlhbEJhbGFuY2UuY3JlZGl0LFxuICAgICAgICAgIGRlYml0OiB0cmlhbEJhbGFuY2UuZGViaXQsXG5cbiAgICAgICAgICBmb3JtYXR0ZWRfY3JlZGl0OiBmb3JtYXROdW1iZXIodHJpYWxCYWxhbmNlLmNyZWRpdCksXG4gICAgICAgICAgZm9ybWF0dGVkX2RlYml0OiBmb3JtYXROdW1iZXIodHJpYWxCYWxhbmNlLmRlYml0KSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBxdWVyeTogeyAuLi5maWx0ZXIgfSxcbiAgICAgICAgam91cm5hbCxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgXG59IiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBxdWVyeSB9IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEpvdXJuYWxQb3N0ZXIgZnJvbSAnQC9zZXJ2aWNlcy9BY2NvdW50aW5nL0pvdXJuYWxQb3N0ZXInO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuaW1wb3J0IEFnaW5nUmVwb3J0IGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9GaW5hbmNpYWxTdGF0ZW1lbnRzL0FnaW5nUmVwb3J0JztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGF5YWJsZUFnaW5nU3VtbWFyeSBleHRlbmRzIEFnaW5nUmVwb3J0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHN0YXRpYyByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoXG4gICAgICAnLycsXG4gICAgICB0aGlzLnBheWFibGVBZ2luZ1N1bW1hcnlSb2xlcygpLFxuICAgICAgdGhpcy52YWxpZGF0ZVJlc3VsdHMsXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy52YWxpZGF0ZVZlbmRvcnNJZHMuYmluZCh0aGlzKSksXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5wYXlhYmxlQWdpbmdTdW1tYXJ5LmJpbmQodGhpcykpXG4gICAgKTtcbiAgICByZXR1cm4gcm91dGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgcmVwb3J0IHZlbmRvcnMgaWRzIHF1ZXJ5LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHZhbGlkYXRlVmVuZG9yc0lkcyhyZXEsIHJlcywgbmV4dCkge1xuICAgIGNvbnN0IHsgVmVuZG9yIH0gPSByZXEubW9kZWxzO1xuXG4gICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgdmVuZG9yc19pZHM6IFtdLFxuICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgIH07XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci52ZW5kb3JzX2lkcykpIHtcbiAgICAgIGZpbHRlci52ZW5kb3JzX2lkcyA9IFtmaWx0ZXIudmVuZG9yc19pZHNdO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLnZlbmRvcnNfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHN0b3JlZEN1c3RvbWVycyA9IGF3YWl0IFZlbmRvci5xdWVyeSgpLndoZXJlSW4oXG4gICAgICAgICdpZCcsXG4gICAgICAgIGZpbHRlci52ZW5kb3JzX2lkc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHN0b3JlZEN1c3RvbWVyc0lkcyA9IHN0b3JlZEN1c3RvbWVycy5tYXAoKGMpID0+IGMuaWQpO1xuICAgICAgY29uc3Qgbm90U3RvcmVkQ3VzdG9tZXJzSWRzID0gZGlmZmVyZW5jZShcbiAgICAgICAgc3RvcmVkQ3VzdG9tZXJzSWRzLFxuICAgICAgICBmaWx0ZXIsXG4gICAgICAgIHZlbmRvcnNfaWRzXG4gICAgICApO1xuXG4gICAgICBpZiAobm90U3RvcmVkQ3VzdG9tZXJzSWRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1ZFTkRPUlMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIG5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNlaXZhYmxlIGFnaW5nIHN1bW1hcnkgdmFsaWRhdGlvbiByb2xlcy5cbiAgICovXG4gIHN0YXRpYyBwYXlhYmxlQWdpbmdTdW1tYXJ5Um9sZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHF1ZXJ5KCdhc19kYXRlJykub3B0aW9uYWwoKS5pc0lTTzg2MDEoKSxcbiAgICAgIHF1ZXJ5KCdhZ2luZ19kYXlzX2JlZm9yZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdhZ2luZ19wZXJpb2RzJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQubm9fY2VudHMnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQuMTAwMF9kaXZpZGUnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ3ZlbmRvcnNfaWRzLionKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBwYXlhYmxlIGFnaW5nIHN1bW1hcnkgcmVwb3J0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHBheWFibGVBZ2luZ1N1bW1hcnkocmVxLCByZXMpIHtcbiAgICBjb25zdCB7IEN1c3RvbWVyLCBBY2NvdW50LCBBY2NvdW50VHJhbnNhY3Rpb24sIEFjY291bnRUeXBlIH0gPSByZXEubW9kZWxzO1xuICAgIGNvbnN0IHN0b3JlZFZlbmRvcnMgPSBhd2FpdCBDdXN0b21lci5xdWVyeSgpO1xuXG4gICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgYXNfZGF0ZTogbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICBhZ2luZ19kYXlzX2JlZm9yZTogMzAsXG4gICAgICBhZ2luZ19wZXJpb2RzOiAzLFxuICAgICAgbnVtYmVyX2Zvcm1hdDoge1xuICAgICAgICBub19jZW50czogZmFsc2UsXG4gICAgICAgIGRpdmlkZV8xMDAwOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICAuLi5yZXEucXVlcnksXG4gICAgfTtcbiAgICBjb25zdCBhY2NvdW50c1JlY2VpdmFibGVUeXBlID0gYXdhaXQgQWNjb3VudFR5cGUucXVlcnkoKVxuICAgICAgLndoZXJlKCdrZXknLCAnYWNjb3VudHNfcGF5YWJsZScpXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGNvbnN0IGFjY291bnRzUmVjZWl2YWJsZSA9IGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgLndoZXJlKCdhY2NvdW50X3R5cGVfaWQnLCBhY2NvdW50c1JlY2VpdmFibGVUeXBlLmlkKVxuICAgICAgLnJlbWVtYmVyKClcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgIC5tb2RpZnkoJ2ZpbHRlckRhdGVSYW5nZScsIG51bGwsIGZpbHRlci5hc19kYXRlKVxuICAgICAgLndoZXJlKCdhY2NvdW50X2lkJywgYWNjb3VudHNSZWNlaXZhYmxlLmlkKVxuICAgICAgLnJlbWVtYmVyKCk7XG5cbiAgICBjb25zdCBqb3VybmFsUG9zdGVyID0gbmV3IEpvdXJuYWxQb3N0ZXIoKTtcbiAgICBqb3VybmFsUG9zdGVyLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9ucyk7XG5cbiAgICBjb25zdCBhZ2luZ1BlcmlvZHMgPSB0aGlzLmFnaW5nUmFuZ2VQZXJpb2RzKFxuICAgICAgZmlsdGVyLmFzX2RhdGUsXG4gICAgICBmaWx0ZXIuYWdpbmdfZGF5c19iZWZvcmUsXG4gICAgICBmaWx0ZXIuYWdpbmdfcGVyaW9kc1xuICAgICk7XG4gICAgLy8gVG90YWwgYW1vdW50IGZvcm1tYXR0ZXIgYmFzZWQgb24gdGhlIGdpdmVuIHF1ZXJ5LlxuICAgIGNvbnN0IHRvdGFsRm9ybWF0dGVyID0gZm9ybWF0TnVtYmVyQ2xvc3VyZShmaWx0ZXIubnVtYmVyX2Zvcm1hdCk7XG5cbiAgICBjb25zdCB2ZW5kb3JzID0gc3RvcmVkVmVuZG9ycy5tYXAoKHZlbmRvcikgPT4ge1xuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0cmlhbCBiYWxhbmNlIHRvdGFsIG9mIHRoZSBnaXZlbiB2ZW5kb3IuXG4gICAgICBjb25zdCB2ZW5kb3JCYWxhbmNlID0gam91cm5hbFBvc3Rlci5nZXRDb250YWN0VHJpYWxCYWxhbmNlKFxuICAgICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICAgIHZlbmRvci5pZCxcbiAgICAgICAgJ3ZlbmRvcidcbiAgICAgICk7XG4gICAgICBjb25zdCBhZ2luZ0Nsb3NpbmdCYWxhbmNlID0gYWdpbmdQZXJpb2RzLm1hcCgoYWdpbmdQZXJpb2QpID0+IHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0cmlhbCBiYWxhbmNlIGJldHdlZW4gdGhlIGdpdmVuIGRhdGUgcGVyaW9kLlxuICAgICAgICBjb25zdCBhZ2luZ1RyaWFsQmFsYW5jZSA9IGpvdXJuYWxQb3N0ZXIuZ2V0Q29udGFjdFRyaWFsQmFsYW5jZShcbiAgICAgICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICAgICAgdmVuZG9yLmlkLFxuICAgICAgICAgICd2ZW5kb3InLFxuICAgICAgICAgIGFnaW5nUGVyaW9kLmZyb21fcGVyaW9kXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYWdpbmdQZXJpb2QsXG4gICAgICAgICAgY2xvc2luZ0JhbGFuY2U6IGFnaW5nVHJpYWxCYWxhbmNlLmRlYml0LFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBjb25zdCBhZ2luZyA9IHRoaXMuY29udGFjdEFnaW5nQmFsYW5jZShcbiAgICAgICAgYWdpbmdDbG9zaW5nQmFsYW5jZSxcbiAgICAgICAgdmVuZG9yQmFsYW5jZS5jcmVkaXRcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2ZW5kb3JfbmFtZTogdmVuZG9yLmRpc3BsYXlOYW1lLFxuICAgICAgICBhZ2luZzogYWdpbmcubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgZm9ybWF0dGVkX3RvdGFsOiB0b3RhbEZvcm1hdHRlcihpdGVtLnRvdGFsKSxcbiAgICAgICAgfSkpLFxuICAgICAgICB0b3RhbDogdmVuZG9yQmFsYW5jZS5iYWxhbmNlLFxuICAgICAgICBmb3JtYXR0ZWRfdG90YWw6IHRvdGFsRm9ybWF0dGVkKHZlbmRvckJhbGFuY2UuYmFsYW5jZSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWdpbmdDbG9zaW5nQmFsYW5jZSA9IGFnaW5nUGVyaW9kcy5tYXAoKGFnaW5nUGVyaW9kKSA9PiB7XG4gICAgICBjb25zdCBjbG9zaW5nVHJpYWxCYWxhbmNlID0gam91cm5hbFBvc3Rlci5nZXRDb250YWN0VHJpYWxCYWxhbmNlKFxuICAgICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICAgIG51bGwsXG4gICAgICAgICd2ZW5kb3InLFxuICAgICAgICBhZ2luZ1BlcmlvZC5mcm9tX3BlcmlvZFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFnaW5nUGVyaW9kLFxuICAgICAgICBjbG9zaW5nQmFsYW5jZTogY2xvc2luZ1RyaWFsQmFsYW5jZS5iYWxhbmNlLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRvdGFsQ2xvc2luZ0JhbGFuY2UgPSBqb3VybmFsUG9zdGVyLmdldENvbnRhY3RUcmlhbEJhbGFuY2UoXG4gICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICBudWxsLFxuICAgICAgJ3ZlbmRvcidcbiAgICApO1xuICAgIGNvbnN0IGFnaW5nVG90YWwgPSB0aGlzLmNvbnRhY3RBZ2luZ0JhbGFuY2UoXG4gICAgICBhZ2luZ0Nsb3NpbmdCYWxhbmNlLFxuICAgICAgdG90YWxDbG9zaW5nQmFsYW5jZS5jcmVkaXRcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgIGNvbHVtbnM6IFsgLi4uYWdpbmdQZXJpb2RzIF0sXG4gICAgICBhZ2luZzoge1xuICAgICAgICB2ZW5kb3JzLFxuICAgICAgICB0b3RhbDogW1xuICAgICAgICAgIC4uLmFnaW5nVG90YWwubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgIGZvcm1hdHRlZF90b3RhbDogdG90YWxGb3JtYXR0ZXIoaXRlbS50b3RhbCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBxdWVyeSwgb25lT2YsIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCB7IGRhdGVSYW5nZUNvbGxlY3Rpb24gfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCB7IGZvcm1hdE51bWJlckNsb3N1cmUgfSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudE1peGluJztcbmltcG9ydCBEZXBlbmRlbmN5R3JhcGggZnJvbSAnQC9saWIvRGVwZW5kZW5jeUdyYXBoJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJywgXG4gICAgICB0aGlzLnByb2ZpdExvc3NTaGVldC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucHJvZml0TG9zc1NoZWV0LmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHByb2ZpdC9sb3NzIGZpbmFuY2lhbCBzdGF0ZW1lbnQuXG4gICAqL1xuICBwcm9maXRMb3NzU2hlZXQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnYmFzaXMnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ2Zyb21fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBxdWVyeSgndG9fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC5ub19jZW50cycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC5kaXZpZGVfMTAwMCcpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCksXG4gICAgICBxdWVyeSgnYmFzaXMnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBxdWVyeSgnYWNjb3VudF9pZHMnKS5pc0FycmF5KCkub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdhY2NvdW50X2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdkaXNwbGF5X2NvbHVtbnNfdHlwZScpLm9wdGlvbmFsKCkuaXNJbihbXG4gICAgICAgICd0b3RhbCcsICdkYXRlX3BlcmlvZHMnLFxuICAgICAgXSksXG4gICAgICBxdWVyeSgnZGlzcGxheV9jb2x1bW5zX2J5Jykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSwgY2hlY2tGYWxzeTogdHJ1ZSB9KVxuICAgICAgICAuaXNJbihbJ3llYXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAncXVhcnRlciddKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IEFjY291bnQsIEFjY291bnRUeXBlIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBmcm9tX2RhdGU6IG1vbWVudCgpLnN0YXJ0T2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdG9fZGF0ZTogbW9tZW50KCkuZW5kT2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgbnVtYmVyX2Zvcm1hdDoge1xuICAgICAgICAgIG5vX2NlbnRzOiBmYWxzZSxcbiAgICAgICAgICBkaXZpZGVfMTAwMDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGJhc2lzOiAnYWNjdXJhbCcsXG4gICAgICAgIG5vbmVfemVybzogZmFsc2UsXG4gICAgICAgIGRpc3BsYXlfY29sdW1uc190eXBlOiAndG90YWwnLFxuICAgICAgICBkaXNwbGF5X2NvbHVtbnNfYnk6ICdtb250aCcsXG4gICAgICAgIGFjY291bnRfaWRzOiBbXSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIuYWNjb3VudF9pZHMpKSB7XG4gICAgICAgIGZpbHRlci5hY2NvdW50X2lkcyA9IFtmaWx0ZXIuYWNjb3VudF9pZHNdO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5jb21lU3RhdGVtZW50VHlwZXMgPSBhd2FpdCBBY2NvdW50VHlwZS5xdWVyeSgpLndoZXJlKCdpbmNvbWVfc2hlZXQnLCB0cnVlKTtcblxuICAgICAgLy8gRmV0Y2ggYWxsIGluY29tZSBhY2NvdW50cyBmcm9tIHN0b3JhZ2UuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgICAvLyAucmVtZW1iZXIoJ3Byb2ZpdF9sb3NzX2FjY291bnRzJylcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyQWNjb3VudHMnLCBmaWx0ZXIuYWNjb3VudF9pZHMpXG4gICAgICAgIC53aGVyZUluKCdhY2NvdW50X3R5cGVfaWQnLCBpbmNvbWVTdGF0ZW1lbnRUeXBlcy5tYXAoKHQpID0+IHQuaWQpKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndHlwZScpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd0cmFuc2FjdGlvbnMnKTtcblxuICAgICAgLy8gQWNjb3VudHMgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgIGNvbnN0IGFjY291bnRzR3JhcGggPSBEZXBlbmRlbmN5R3JhcGguZnJvbUFycmF5KFxuICAgICAgICBhY2NvdW50cywgeyBpdGVtSWQ6ICdpZCcsIHBhcmVudEl0ZW1JZDogJ3BhcmVudEFjY291bnRJZCcgfVxuICAgICAgKTtcblxuICAgICAgLy8gRmlsdGVyIGFsbCBub25lIHplcm8gYWNjb3VudHMgaWYgaXQgd2FzIGVuYWJsZWQuXG4gICAgICBjb25zdCBmaWx0ZXJlZEFjY291bnRzID0gYWNjb3VudHMuZmlsdGVyKChhY2NvdW50KSA9PiAoXG4gICAgICAgIGFjY291bnQudHJhbnNhY3Rpb25zLmxlbmd0aCA+IDAgfHwgIWZpbHRlci5ub25lX3plcm9cbiAgICAgICkpO1xuICAgICAgY29uc3Qgam91cm5hbEVudHJpZXNDb2xsZWN0ZWQgPSBBY2NvdW50LmNvbGxlY3RKb3VybmFsRW50cmllcyhhY2NvdW50cyk7XG4gICAgICBjb25zdCBqb3VybmFsRW50cmllcyA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzR3JhcGgpO1xuICAgICAgam91cm5hbEVudHJpZXMubG9hZEVudHJpZXMoam91cm5hbEVudHJpZXNDb2xsZWN0ZWQpO1xuXG4gICAgICAvLyBBY2NvdW50IGJhbGFuY2UgZm9ybW1hdHRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVlcnkuXG4gICAgICBjb25zdCBudW1iZXJGb3JtYXR0ZXIgPSBmb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlci5udW1iZXJfZm9ybWF0KTtcbiAgICAgIGNvbnN0IGNvbXBhcmF0b3JEYXRlVHlwZSA9IGZpbHRlci5kaXNwbGF5X2NvbHVtbnNfdHlwZSA9PT0gJ3RvdGFsJ1xuICAgICAgICA/ICdkYXknIDogZmlsdGVyLmRpc3BsYXlfY29sdW1uc19ieTtcblxuICAgICAgLy8gR2V0cyB0aGUgZGF0ZSByYW5nZSBzZXQgZnJvbSBzdGFydCB0byBlbmQgZGF0ZS5cbiAgICAgIGNvbnN0IGRhdGVSYW5nZVNldCA9IGRhdGVSYW5nZUNvbGxlY3Rpb24oXG4gICAgICAgIGZpbHRlci5mcm9tX2RhdGUsXG4gICAgICAgIGZpbHRlci50b19kYXRlLFxuICAgICAgICBjb21wYXJhdG9yRGF0ZVR5cGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBhY2NvdW50c01hcHBlciA9IChpbmNvbWVFeHBlbnNlQWNjb3VudHMpID0+IChcbiAgICAgICAgaW5jb21lRXhwZW5zZUFjY291bnRzLm1hcCgoYWNjb3VudCkgPT4gKHtcbiAgICAgICAgICAuLi5waWNrKGFjY291bnQsIFsnaWQnLCAnaW5kZXgnLCAnbmFtZScsICdjb2RlJywgJ3BhcmVudEFjY291bnRJZCddKSxcblxuICAgICAgICAgIC8vIFRvdGFsIGNsb3NpbmcgYmFsYW5jZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAndG90YWwnKSAmJiB7XG4gICAgICAgICAgICB0b3RhbDogKCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgYW1vdW50ID0gam91cm5hbEVudHJpZXMuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCwgZmlsdGVyLnRvX2RhdGUpO1xuICAgICAgICAgICAgICByZXR1cm4geyBhbW91bnQsIGRhdGU6IGZpbHRlci50b19kYXRlLCBmb3JtYXR0ZWRfYW1vdW50OiBudW1iZXJGb3JtYXR0ZXIoYW1vdW50KSB9O1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIERhdGUgcGVyaW9kcyB3aGVuIGRpc3BsYXkgY29sdW1ucyB0eXBlIGBwZXJpb2RzYC5cbiAgICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAnZGF0ZV9wZXJpb2RzJykgJiYge1xuICAgICAgICAgICAgcGVyaW9kczogZGF0ZVJhbmdlU2V0Lm1hcCgoZGF0ZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0eXBlID0gY29tcGFyYXRvckRhdGVUeXBlO1xuICAgICAgICAgICAgICBjb25zdCBhbW91bnQgPSBqb3VybmFsRW50cmllcy5nZXRBY2NvdW50QmFsYW5jZShhY2NvdW50LmlkLCBkYXRlLCB0eXBlKTtcblxuICAgICAgICAgICAgICByZXR1cm4geyBkYXRlLCBhbW91bnQsIGZvcm1hdHRlZF9hbW91bnQ6IG51bWJlckZvcm1hdHRlcihhbW91bnQpIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSkpO1xuXG4gICAgICBjb25zdCB0b3RhbEFjY291bnRzUmVkdWNlciA9IChpbmNvbWVFeHBlbnNlQWNjb3VudHMpID0+IChcbiAgICAgICAgaW5jb21lRXhwZW5zZUFjY291bnRzLnJlZHVjZSgoYWNjLCBhY2NvdW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gKGFjY291bnQpID8gYWNjb3VudC50b3RhbC5hbW91bnQgOiAwO1xuICAgICAgICAgIHJldHVybiBhbW91bnQgKyBhY2M7XG4gICAgICAgIH0sIDApKTtcblxuICAgICAgY29uc3QgYWNjb3VudHNJbmNvbWUgPSBBY2NvdW50LnRvTmVzdGVkQXJyYXkoYWNjb3VudHNNYXBwZXIoZmlsdGVyZWRBY2NvdW50c1xuICAgICAgICAuZmlsdGVyKChhY2NvdW50KSA9PiBhY2NvdW50LnR5cGUubm9ybWFsID09PSAnY3JlZGl0JykpKTtcblxuICAgICAgY29uc3QgYWNjb3VudHNFeHBlbnNlcyA9IEFjY291bnQudG9OZXN0ZWRBcnJheShhY2NvdW50c01hcHBlcihmaWx0ZXJlZEFjY291bnRzXG4gICAgICAgIC5maWx0ZXIoKGFjY291bnQpID0+IGFjY291bnQudHlwZS5ub3JtYWwgPT09ICdkZWJpdCcpKSk7XG5cbiAgICAgIC8vIEByZXR1cm4ge0FycmF5fVxuICAgICAgY29uc3QgdG90YWxQZXJpb2RzTWFwcGVyID0gKGluY29tZUV4cGVuc2VBY2NvdW50cykgPT4gKFxuICAgICAgICBPYmplY3QudmFsdWVzKGRhdGVSYW5nZVNldC5yZWR1Y2UoKGFjYywgZGF0ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBsZXQgYW1vdW50ID0gMDtcblxuICAgICAgICAgIGluY29tZUV4cGVuc2VBY2NvdW50cy5mb3JFYWNoKChhY2NvdW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGFjY291bnQucGVyaW9kc1tpbmRleF07XG4gICAgICAgICAgICBhbW91bnQgKz0gY3VycmVudERhdGUuYW1vdW50IHx8IDA7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYWNjW2RhdGVdID0geyBkYXRlLCBhbW91bnQsIGZvcm1hdHRlZF9hbW91bnQ6IG51bWJlckZvcm1hdHRlcihhbW91bnQpIH07XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pKSk7XG5cbiAgICAgIC8vIFRvdGFsIGluY29tZShkYXRlKSAtIFRvdGFsIGV4cGVuc2VzKGRhdGUpID0gTmV0IGluY29tZShkYXRlKVxuICAgICAgLy8gQHJldHVybiB7QXJyYXl9XG4gICAgICBjb25zdCBuZXRJbmNvbWVQZXJpb2RzTWFwcGVyID0gKHRvdGFsSW5jb21lQWNvY3VudHMsIHRvdGFsRXhwZW5zZUFjY291bnRzKSA9PiAoXG4gICAgICAgIGRhdGVSYW5nZVNldC5tYXAoKGRhdGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgdG90YWxJbmNvbWUgPSB0b3RhbEluY29tZUFjb2N1bnRzW2luZGV4XTtcbiAgICAgICAgICBjb25zdCB0b3RhbEV4cGVuc2VzID0gdG90YWxFeHBlbnNlQWNjb3VudHNbaW5kZXhdO1xuXG4gICAgICAgICAgbGV0IGFtb3VudCA9IHRvdGFsSW5jb21lLmFtb3VudCB8fCAwO1xuICAgICAgICAgIGFtb3VudCAtPSB0b3RhbEV4cGVuc2VzLmFtb3VudCB8fCAwO1xuICAgICAgICAgIHJldHVybiB7IGRhdGUsIGFtb3VudCwgZm9ybWF0dGVkX2Ftb3VudDogbnVtYmVyRm9ybWF0dGVyKGFtb3VudCkgfTtcbiAgICAgICAgfSkpO1xuXG4gICAgICAvLyBAcmV0dXJuIHtPYmplY3R9XG4gICAgICBjb25zdCBuZXRJbmNvbWVUb3RhbCA9ICh0b3RhbEluY29tZSwgdG90YWxFeHBlbnNlcykgPT4ge1xuICAgICAgICBjb25zdCBuZXRJbmNvbWVBbW91bnQgPSB0b3RhbEluY29tZS5hbW91bnQgLSB0b3RhbEV4cGVuc2VzLmFtb3VudDtcbiAgICAgICAgcmV0dXJuIHsgYW1vdW50OiBuZXRJbmNvbWVBbW91bnQsIGZvcm1hdHRlZF9hbW91bnQ6IG5ldEluY29tZUFtb3VudCwgZGF0ZTogZmlsdGVyLnRvX2RhdGUgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGluY29tZVJlc3BvbnNlID0ge1xuICAgICAgICBlbnRyeV9ub3JtYWw6ICdjcmVkaXQnLFxuICAgICAgICBhY2NvdW50czogYWNjb3VudHNJbmNvbWUsXG4gICAgICAgIC4uLihmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX3R5cGUgPT09ICd0b3RhbCcpICYmICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdG90YWxJbmNvbWVBY2NvdW50cyA9IHRvdGFsQWNjb3VudHNSZWR1Y2VyKGFjY291bnRzSW5jb21lKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG90YWw6IHtcbiAgICAgICAgICAgICAgYW1vdW50OiB0b3RhbEluY29tZUFjY291bnRzLFxuICAgICAgICAgICAgICBkYXRlOiBmaWx0ZXIudG9fZGF0ZSxcbiAgICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogbnVtYmVyRm9ybWF0dGVyKHRvdGFsSW5jb21lQWNjb3VudHMpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSgpLFxuICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAnZGF0ZV9wZXJpb2RzJykgJiYge1xuICAgICAgICAgIHRvdGFsX3BlcmlvZHM6IFtcbiAgICAgICAgICAgIC4uLnRvdGFsUGVyaW9kc01hcHBlcihhY2NvdW50c0luY29tZSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBleHBlbnNlUmVzcG9uc2UgPSB7XG4gICAgICAgIGVudHJ5X25vcm1hbDogJ2RlYml0JyxcbiAgICAgICAgYWNjb3VudHM6IGFjY291bnRzRXhwZW5zZXMsXG4gICAgICAgIC4uLihmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX3R5cGUgPT09ICd0b3RhbCcpICYmICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdG90YWxFeHBlbnNlc0FjY291bnRzID0gdG90YWxBY2NvdW50c1JlZHVjZXIoYWNjb3VudHNFeHBlbnNlcyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvdGFsOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogdG90YWxFeHBlbnNlc0FjY291bnRzLFxuICAgICAgICAgICAgICBkYXRlOiBmaWx0ZXIudG9fZGF0ZSxcbiAgICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogbnVtYmVyRm9ybWF0dGVyKHRvdGFsRXhwZW5zZXNBY2NvdW50cyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pKCksXG4gICAgICAgIC4uLihmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX3R5cGUgPT09ICdkYXRlX3BlcmlvZHMnKSAmJiB7XG4gICAgICAgICAgdG90YWxfcGVyaW9kczogW1xuICAgICAgICAgICAgLi4udG90YWxQZXJpb2RzTWFwcGVyKGFjY291bnRzRXhwZW5zZXMpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgbmV0SW5jb21lUmVzcG9uc2UgPSB7XG4gICAgICAgIC4uLihmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX3R5cGUgPT09ICd0b3RhbCcpICYmIHtcbiAgICAgICAgICB0b3RhbDoge1xuICAgICAgICAgICAgLi4ubmV0SW5jb21lVG90YWwoaW5jb21lUmVzcG9uc2UudG90YWwsIGV4cGVuc2VSZXNwb25zZS50b3RhbCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKGZpbHRlci5kaXNwbGF5X2NvbHVtbnNfdHlwZSA9PT0gJ2RhdGVfcGVyaW9kcycpICYmIHtcbiAgICAgICAgICB0b3RhbF9wZXJpb2RzOiBbXG4gICAgICAgICAgICAuLi5uZXRJbmNvbWVQZXJpb2RzTWFwcGVyKFxuICAgICAgICAgICAgICBpbmNvbWVSZXNwb25zZS50b3RhbF9wZXJpb2RzLFxuICAgICAgICAgICAgICBleHBlbnNlUmVzcG9uc2UudG90YWxfcGVyaW9kcyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBxdWVyeTogeyAuLi5maWx0ZXIgfSxcbiAgICAgICAgY29sdW1uczogWy4uLmRhdGVSYW5nZVNldF0sXG4gICAgICAgIHByb2ZpdExvc3M6IHtcbiAgICAgICAgICBpbmNvbWU6IGluY29tZVJlc3BvbnNlLFxuICAgICAgICAgIGV4cGVuc2VzOiBleHBlbnNlUmVzcG9uc2UsXG4gICAgICAgICAgbmV0X2luY29tZTogbmV0SW5jb21lUmVzcG9uc2UsXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59IiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBxdWVyeSwgb25lT2YgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBBZ2luZ1JlcG9ydCBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvRmluYW5jaWFsU3RhdGVtZW50cy9BZ2luZ1JlcG9ydCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY2VpdmFibGVBZ2luZ1N1bW1hcnkgZXh0ZW5kcyBBZ2luZ1JlcG9ydCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICBzdGF0aWMgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KFxuICAgICAgJy8nLFxuICAgICAgdGhpcy5yZWNlaXZhYmxlQWdpbmdTdW1tYXJ5Um9sZXMsXG4gICAgICB0aGlzLnZhbGlkYXRlUmVzdWx0cyxcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnZhbGlkYXRlQ3VzdG9tZXJzSWRzLmJpbmQodGhpcykpLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucmVjZWl2YWJsZUFnaW5nU3VtbWFyeS5iaW5kKHRoaXMpKVxuICAgICk7XG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHJlcG9ydCBjdXN0b21lcnMgaWRzIHF1ZXJ5LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHZhbGlkYXRlQ3VzdG9tZXJzSWRzKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgY29uc3QgeyBDdXN0b21lciB9ID0gcmVxLm1vZGVscztcblxuICAgIGNvbnNvbGUubG9nKHJlcS5xdWVyeSk7XG5cbiAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICBjdXN0b21lcl9pZHM6IFtdLFxuICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgIH07XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci5jdXN0b21lcl9pZHMpKSB7XG4gICAgICBmaWx0ZXIuY3VzdG9tZXJfaWRzID0gW2ZpbHRlci5jdXN0b21lcl9pZHNdO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLmN1c3RvbWVyX2lkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzdG9yZWRDdXN0b21lcnMgPSBhd2FpdCBDdXN0b21lci5xdWVyeSgpLndoZXJlSW4oXG4gICAgICAgICdpZCcsXG4gICAgICAgIGZpbHRlci5jdXN0b21lcl9pZHNcbiAgICAgICk7XG4gICAgICBjb25zdCBzdG9yZWRDdXN0b21lcnNJZHMgPSBzdG9yZWRDdXN0b21lcnMubWFwKChjKSA9PiBwYXJzZUludChjLmlkLCAxMCkpO1xuICAgICAgY29uc3Qgbm90U3RvcmVkQ3VzdG9tZXJzSWRzID0gZGlmZmVyZW5jZShcbiAgICAgICAgZmlsdGVyLmN1c3RvbWVyX2lkcy5tYXAoYSA9PiBwYXJzZUludChhLCAxMCkpLFxuICAgICAgICBzdG9yZWRDdXN0b21lcnNJZHNcbiAgICAgICk7XG5cbiAgICAgIGlmIChub3RTdG9yZWRDdXN0b21lcnNJZHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdDVVNUT01FUlMuSURTLk5PVC5GT1VORCcsXG4gICAgICAgICAgICAgIGNvZGU6IDMwMCxcbiAgICAgICAgICAgICAgaWRzOiBub3RTdG9yZWRDdXN0b21lcnNJZHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBuZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjZWl2YWJsZSBhZ2luZyBzdW1tYXJ5IHZhbGlkYXRpb24gcm9sZXMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlY2VpdmFibGVBZ2luZ1N1bW1hcnlSb2xlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcXVlcnkoJ2FzX2RhdGUnKS5vcHRpb25hbCgpLmlzSVNPODYwMSgpLFxuICAgICAgcXVlcnkoJ2FnaW5nX2RheXNfYmVmb3JlJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ2FnaW5nX3BlcmlvZHMnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC5ub19jZW50cycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC4xMDAwX2RpdmlkZScpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBvbmVPZihcbiAgICAgICAgW1xuICAgICAgICAgIHF1ZXJ5KCdjdXN0b21lcl9pZHMnKS5vcHRpb25hbCgpLmlzQXJyYXkoeyBtaW46IDEgfSksXG4gICAgICAgICAgcXVlcnkoJ2N1c3RvbWVyX2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgICAgXSxcbiAgICAgICAgW3F1ZXJ5KCdjdXN0b21lcl9pZHMnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCldXG4gICAgICApLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSByZWNlaXZhYmxlIGFnaW5nIHN1bW1hcnkgcmVwb3J0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlY2VpdmFibGVBZ2luZ1N1bW1hcnkocmVxLCByZXMpIHtcbiAgICBjb25zdCB7IEN1c3RvbWVyLCBBY2NvdW50LCBBY2NvdW50VHJhbnNhY3Rpb24sIEFjY291bnRUeXBlIH0gPSByZXEubW9kZWxzO1xuICAgIFxuICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgIGFzX2RhdGU6IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxuICAgICAgYWdpbmdfZGF5c19iZWZvcmU6IDMwLFxuICAgICAgYWdpbmdfcGVyaW9kczogMyxcbiAgICAgIG51bWJlcl9mb3JtYXQ6IHtcbiAgICAgICAgbm9fY2VudHM6IGZhbHNlLFxuICAgICAgICBkaXZpZGVfMTAwMDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgY3VzdG9tZXJfaWRzOiBbXSxcbiAgICAgIG5vbmVfemVybzogZmFsc2UsXG4gICAgICAuLi5yZXEucXVlcnksXG4gICAgfTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyLmN1c3RvbWVyX2lkcykpIHtcbiAgICAgIGZpbHRlci5jdXN0b21lcl9pZHMgPSBbZmlsdGVyLmN1c3RvbWVyX2lkc107XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVkQ3VzdG9tZXJzID0gYXdhaXQgQ3VzdG9tZXIucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICBpZiAoZmlsdGVyLmN1c3RvbWVyX2lkcykge1xuICAgICAgICBidWlsZGVyLm1vZGlmeSgnZmlsdGVyQ3VzdG9tZXJJZHMnLCBmaWx0ZXIuY3VzdG9tZXJfaWRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH0pO1xuICAgIGNvbnN0IGFjY291bnRzUmVjZWl2YWJsZVR5cGUgPSBhd2FpdCBBY2NvdW50VHlwZS5xdWVyeSgpXG4gICAgICAud2hlcmUoJ2tleScsICdhY2NvdW50c19yZWNlaXZhYmxlJylcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgY29uc3QgYWNjb3VudHNSZWNlaXZhYmxlID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAud2hlcmUoJ2FjY291bnRfdHlwZV9pZCcsIGFjY291bnRzUmVjZWl2YWJsZVR5cGUuaWQpXG4gICAgICAucmVtZW1iZXIoKVxuICAgICAgLmZpcnN0KCk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKS5vbkJ1aWxkKChxdWVyeSkgPT4ge1xuICAgICAgcXVlcnkubW9kaWZ5KCdmaWx0ZXJEYXRlUmFuZ2UnLCBudWxsLCBmaWx0ZXIuYXNfZGF0ZSlcbiAgICAgIHF1ZXJ5LndoZXJlKCdhY2NvdW50X2lkJywgYWNjb3VudHNSZWNlaXZhYmxlLmlkKVxuICAgICAgcXVlcnkubW9kaWZ5KCdmaWx0ZXJDb250YWN0VHlwZScsICdjdXN0b21lcicpO1xuXG4gICAgICBpZiAoZmlsdGVyLmN1c3RvbWVyX2lkcy5sZW5ndGg+IDApIHtcbiAgICAgICAgcXVlcnkubW9kaWZ5KCdmaWx0ZXJDb250YWN0SWRzJywgZmlsdGVyLmN1c3RvbWVyX2lkcylcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnJlbWVtYmVyKCk7XG4gICAgICByZXR1cm4gcXVlcnk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBqb3VybmFsUG9zdGVyID0gbmV3IEpvdXJuYWxQb3N0ZXIoKTtcbiAgICBqb3VybmFsUG9zdGVyLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9ucyk7XG5cbiAgICBjb25zdCBhZ2luZ1BlcmlvZHMgPSB0aGlzLmFnaW5nUmFuZ2VQZXJpb2RzKFxuICAgICAgZmlsdGVyLmFzX2RhdGUsXG4gICAgICBmaWx0ZXIuYWdpbmdfZGF5c19iZWZvcmUsXG4gICAgICBmaWx0ZXIuYWdpbmdfcGVyaW9kc1xuICAgICk7XG4gICAgLy8gVG90YWwgYW1vdW50IGZvcm1tYXR0ZXIgYmFzZWQgb24gdGhlIGdpdmVuIHF1ZXJ5LlxuICAgIGNvbnN0IHRvdGFsRm9ybWF0dGVyID0gdGhpcy5mb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlci5udW1iZXJfZm9ybWF0KTtcblxuICAgIGNvbnN0IGN1c3RvbWVycyA9IHN0b3JlZEN1c3RvbWVycy5tYXAoKGN1c3RvbWVyKSA9PiB7XG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIHRyaWFsIGJhbGFuY2UgdG90YWwgb2YgdGhlIGdpdmVuIGN1c3RvbWVyLlxuICAgICAgY29uc3QgY3VzdG9tZXJCYWxhbmNlID0gam91cm5hbFBvc3Rlci5nZXRDb250YWN0VHJpYWxCYWxhbmNlKFxuICAgICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICAgIGN1c3RvbWVyLmlkLFxuICAgICAgICAnY3VzdG9tZXInXG4gICAgICApO1xuICAgICAgY29uc3QgYWdpbmdDbG9zaW5nQmFsYW5jZSA9IGFnaW5nUGVyaW9kcy5tYXAoKGFnaW5nUGVyaW9kKSA9PiB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdHJpYWwgYmFsYW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlIHBlcmlvZC5cbiAgICAgICAgY29uc3QgYWdpbmdUcmlhbEJhbGFuY2UgPSBqb3VybmFsUG9zdGVyLmdldENvbnRhY3RUcmlhbEJhbGFuY2UoXG4gICAgICAgICAgYWNjb3VudHNSZWNlaXZhYmxlLmlkLFxuICAgICAgICAgIGN1c3RvbWVyLmlkLFxuICAgICAgICAgICdjdXN0b21lcicsXG4gICAgICAgICAgYWdpbmdQZXJpb2QuZnJvbV9wZXJpb2RcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5hZ2luZ1BlcmlvZCxcbiAgICAgICAgICBjbG9zaW5nQmFsYW5jZTogYWdpbmdUcmlhbEJhbGFuY2UuZGViaXQsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGFnaW5nID0gdGhpcy5jb250YWN0QWdpbmdCYWxhbmNlKFxuICAgICAgICBhZ2luZ0Nsb3NpbmdCYWxhbmNlLFxuICAgICAgICBjdXN0b21lckJhbGFuY2UuY3JlZGl0XG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VzdG9tZXJfbmFtZTogY3VzdG9tZXIuZGlzcGxheU5hbWUsXG4gICAgICAgIGFnaW5nOiBhZ2luZy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBmb3JtYXR0ZWRfdG90YWw6IHRvdGFsRm9ybWF0dGVyKGl0ZW0udG90YWwpLFxuICAgICAgICB9KSksXG4gICAgICAgIHRvdGFsOiBjdXN0b21lckJhbGFuY2UuYmFsYW5jZSxcbiAgICAgICAgZm9ybWF0dGVkX3RvdGFsOiB0b3RhbEZvcm1hdHRlcihjdXN0b21lckJhbGFuY2UuYmFsYW5jZSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWdpbmdDbG9zaW5nQmFsYW5jZSA9IGFnaW5nUGVyaW9kcy5tYXAoKGFnaW5nUGVyaW9kKSA9PiB7XG4gICAgICBjb25zdCBjbG9zaW5nVHJpYWxCYWxhbmNlID0gam91cm5hbFBvc3Rlci5nZXRDb250YWN0VHJpYWxCYWxhbmNlKFxuICAgICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICAgIG51bGwsXG4gICAgICAgICdjdXN0b21lcicsXG4gICAgICAgIGFnaW5nUGVyaW9kLmZyb21fcGVyaW9kXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYWdpbmdQZXJpb2QsXG4gICAgICAgIGNsb3NpbmdCYWxhbmNlOiBjbG9zaW5nVHJpYWxCYWxhbmNlLmJhbGFuY2UsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgdG90YWxDbG9zaW5nQmFsYW5jZSA9IGpvdXJuYWxQb3N0ZXIuZ2V0Q29udGFjdFRyaWFsQmFsYW5jZShcbiAgICAgIGFjY291bnRzUmVjZWl2YWJsZS5pZCxcbiAgICAgIG51bGwsXG4gICAgICAnY3VzdG9tZXInXG4gICAgKTtcbiAgICBjb25zdCBhZ2luZ1RvdGFsID0gdGhpcy5jb250YWN0QWdpbmdCYWxhbmNlKFxuICAgICAgYWdpbmdDbG9zaW5nQmFsYW5jZSxcbiAgICAgIHRvdGFsQ2xvc2luZ0JhbGFuY2UuY3JlZGl0XG4gICAgKTtcblxuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICBjb2x1bW5zOiBbLi4uYWdpbmdQZXJpb2RzXSxcbiAgICAgIGFnaW5nOiB7XG4gICAgICAgIGN1c3RvbWVycyxcbiAgICAgICAgdG90YWw6IFtcbiAgICAgICAgICAuLi5hZ2luZ1RvdGFsLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICBmb3JtYXR0ZWRfdG90YWw6IHRvdGFsRm9ybWF0dGVyKGl0ZW0udG90YWwpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgcXVlcnksIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgSm91cm5hbFBvc3RlciBmcm9tICdAL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbFBvc3Rlcic7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgRGVwZW5kZW5jeUdyYXBoIGZyb20gJ0AvbGliL0RlcGVuZGVuY3lHcmFwaCc7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXJDbG9zdXJlIH1mcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudE1peGluJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJyxcbiAgICAgIHRoaXMudHJpYWxCYWxhbmNlU2hlZXQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnRyaWFsQmFsYW5jZVNoZWV0LmhhbmRsZXIpKTtcbiAgICBcbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgdHJpYWwgYmFsYW5jZSBzaGVldC5cbiAgICovXG4gIHRyaWFsQmFsYW5jZVNoZWV0OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2Jhc2lzJykub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdmcm9tX2RhdGUnKS5vcHRpb25hbCgpLmlzSVNPODYwMSgpLFxuICAgICAgcXVlcnkoJ3RvX2RhdGUnKS5vcHRpb25hbCgpLmlzSVNPODYwMSgpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQubm9fY2VudHMnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQuMTAwMF9kaXZpZGUnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ2FjY291bnRfaWRzJykuaXNBcnJheSgpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgnYWNjb3VudF9pZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnYmFzaXMnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBBY2NvdW50IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBmcm9tX2RhdGU6IG1vbWVudCgpLnN0YXJ0T2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdG9fZGF0ZTogbW9tZW50KCkuZW5kT2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgbnVtYmVyX2Zvcm1hdDoge1xuICAgICAgICAgIG5vX2NlbnRzOiBmYWxzZSxcbiAgICAgICAgICBkaXZpZGVfMTAwMDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGJhc2lzOiAnYWNjdXJhbCcsXG4gICAgICAgIG5vbmVfemVybzogZmFsc2UsXG4gICAgICAgIGFjY291bnRfaWRzOiBbXSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIuYWNjb3VudF9pZHMpKSB7XG4gICAgICAgIGZpbHRlci5hY2NvdW50X2lkcyA9IFtmaWx0ZXIuYWNjb3VudF9pZHNdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgICAvLyAucmVtZW1iZXIoJ3RyaWFsX2JhbGFuY2VfYWNjb3VudHMnKVxuICAgICAgICAubW9kaWZ5KCdmaWx0ZXJBY2NvdW50cycsIGZpbHRlci5hY2NvdW50X2lkcylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3R5cGUnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndHJhbnNhY3Rpb25zJylcbiAgICAgICAgLm1vZGlmeUdyYXBoKCd0cmFuc2FjdGlvbnMnLCAoYnVpbGRlcikgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubW9kaWZ5KCdzdW1hdGlvbkNyZWRpdERlYml0Jyk7XG4gICAgICAgICAgYnVpbGRlci5tb2RpZnkoJ2ZpbHRlckRhdGVSYW5nZScsIGZpbHRlci5mcm9tX2RhdGUsIGZpbHRlci50b19kYXRlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEFjY291bnRzIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAgICBjb25zdCBhY2NvdW50c0dyYXBoID0gRGVwZW5kZW5jeUdyYXBoLmZyb21BcnJheShcbiAgICAgICAgYWNjb3VudHMsIHsgaXRlbUlkOiAnaWQnLCBwYXJlbnRJdGVtSWQ6ICdwYXJlbnRBY2NvdW50SWQnIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGpvdXJuYWxFbnRyaWVzQ29sbGVjdCA9IEFjY291bnQuY29sbGVjdEpvdXJuYWxFbnRyaWVzKGFjY291bnRzKTtcbiAgICAgIGNvbnN0IGpvdXJuYWxFbnRyaWVzID0gbmV3IEpvdXJuYWxQb3N0ZXIoYWNjb3VudHNHcmFwaCk7XG4gICAgICBqb3VybmFsRW50cmllcy5sb2FkRW50cmllcyhqb3VybmFsRW50cmllc0NvbGxlY3QpO1xuXG4gICAgICAvLyBBY2NvdW50IGJhbGFuY2UgZm9ybW1hdHRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVlcnkuXG4gICAgICBjb25zdCBiYWxhbmNlRm9ybWF0dGVyID0gZm9ybWF0TnVtYmVyQ2xvc3VyZShmaWx0ZXIubnVtYmVyX2Zvcm1hdCk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzUmVzcG9uc2UgPSBhY2NvdW50c1xuICAgICAgICAuZmlsdGVyKChhY2NvdW50KSA9PiAoXG4gICAgICAgICAgYWNjb3VudC50cmFuc2FjdGlvbnMubGVuZ3RoID4gMCB8fCAhZmlsdGVyLm5vbmVfemVyb1xuICAgICAgICApKVxuICAgICAgICAubWFwKChhY2NvdW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJpYWwgPSBqb3VybmFsRW50cmllcy5nZXRUcmlhbEJhbGFuY2VXaXRoRGVwYW5kcyhhY2NvdW50LmlkKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogYWNjb3VudC5pZCxcbiAgICAgICAgICAgIHBhcmVudEFjY291bnRJZDogYWNjb3VudC5wYXJlbnRBY2NvdW50SWQsXG4gICAgICAgICAgICBuYW1lOiBhY2NvdW50Lm5hbWUsXG4gICAgICAgICAgICBjb2RlOiBhY2NvdW50LmNvZGUsXG4gICAgICAgICAgICBhY2NvdW50Tm9ybWFsOiBhY2NvdW50LnR5cGUubm9ybWFsLFxuXG4gICAgICAgICAgICBjcmVkaXQ6IHRyaWFsLmNyZWRpdCxcbiAgICAgICAgICAgIGRlYml0OiB0cmlhbC5kZWJpdCxcbiAgICAgICAgICAgIGJhbGFuY2U6IHRyaWFsLmJhbGFuY2UsXG5cbiAgICAgICAgICAgIGZvcm1hdHRlZF9jcmVkaXQ6IGJhbGFuY2VGb3JtYXR0ZXIodHJpYWwuY3JlZGl0KSxcbiAgICAgICAgICAgIGZvcm1hdHRlZF9kZWJpdDogYmFsYW5jZUZvcm1hdHRlcih0cmlhbC5kZWJpdCksXG4gICAgICAgICAgICBmb3JtYXR0ZWRfYmFsYW5jZTogYmFsYW5jZUZvcm1hdHRlcih0cmlhbC5iYWxhbmNlKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgcXVlcnk6IHsgLi4uZmlsdGVyIH0sXG4gICAgICAgIGFjY291bnRzOiBbLi4uQWNjb3VudC50b05lc3RlZEFycmF5KGFjY291bnRzUmVzcG9uc2UpIF0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxufSIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgcXVlcnksIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBwaWNrLCBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCB7IGZvcm1hdE51bWJlckNsb3N1cmUgfSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudE1peGluJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBEZXBlbmRlbmN5R3JhcGggZnJvbSAnQC9saWIvRGVwZW5kZW5jeUdyYXBoJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJywgXG4gICAgICB0aGlzLmdlbmVyYWxMZWRnZXIudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdlbmVyYWxMZWRnZXIuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGdlbmVyYWwgbGVkZ2VyIGZpbmFuY2lhbCBzdGF0ZW1lbnQuXG4gICAqL1xuICBnZW5lcmFsTGVkZ2VyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2Zyb21fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBxdWVyeSgndG9fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBxdWVyeSgnYmFzaXMnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQubm9fY2VudHMnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQuZGl2aWRlXzEwMDAnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBxdWVyeSgnYWNjb3VudHNfaWRzJykub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdhY2NvdW50c19pZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnb3JkZXJCeScpLm9wdGlvbmFsKCkuaXNJbihbJ2NyZWF0ZWRfYXQnLCAnbmFtZScsICdjb2RlJ10pLFxuICAgICAgcXVlcnkoJ29yZGVyJykub3B0aW9uYWwoKS5pc0luKFsnZGVzYycsICdhc2MnXSksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBBY2NvdW50VHJhbnNhY3Rpb24sIEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgZnJvbV9kYXRlOiBtb21lbnQoKS5zdGFydE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIHRvX2RhdGU6IG1vbWVudCgpLmVuZE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIGJhc2lzOiAnY2FzaCcsXG4gICAgICAgIG51bWJlcl9mb3JtYXQ6IHtcbiAgICAgICAgICBub19jZW50czogZmFsc2UsXG4gICAgICAgICAgZGl2aWRlXzEwMDA6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBub25lX3plcm86IGZhbHNlLFxuICAgICAgICBhY2NvdW50c19pZHM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci5hY2NvdW50c19pZHMpKSB7XG4gICAgICAgIGZpbHRlci5hY2NvdW50c19pZHMgPSBbZmlsdGVyLmFjY291bnRzX2lkc107XG4gICAgICB9XG4gICAgICBmaWx0ZXIuYWNjb3VudHNfaWRzID0gZmlsdGVyLmFjY291bnRzX2lkcy5tYXAoKGlkKSA9PiBwYXJzZUludChpZCwgMTApKTtcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGlmIChmaWx0ZXIuYWNjb3VudHNfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmaWx0ZXIuYWNjb3VudHNfaWRzKTtcbiAgICAgICAgY29uc3QgYWNjb3VudHNJZHMgPSBhY2NvdW50cy5tYXAoKGEpID0+IGEuaWQpO1xuXG4gICAgICAgIGlmIChkaWZmZXJlbmNlKGZpbHRlci5hY2NvdW50c19pZHMsIGFjY291bnRzSWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnRklMVEVSLkFDQ09VTlRTLklEUy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcjogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLy8gLnJlbWVtYmVyKCdnZW5lcmFsX2xlZGdlcl9hY2NvdW50cycpXG4gICAgICAgIC5vcmRlckJ5KCdpbmRleCcsICdERVNDJylcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyQWNjb3VudHMnLCBmaWx0ZXIuYWNjb3VudHNfaWRzKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndHlwZScpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd0cmFuc2FjdGlvbnMnKVxuICAgICAgICAubW9kaWZ5R3JhcGgoJ3RyYW5zYWN0aW9ucycsIChidWlsZGVyKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5tb2RpZnkoJ2ZpbHRlckRhdGVSYW5nZScsIGZpbHRlci5mcm9tX2RhdGUsIGZpbHRlci50b19kYXRlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEFjY291bnRzIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAgICBjb25zdCBhY2NvdW50c0dyYXBoID0gRGVwZW5kZW5jeUdyYXBoLmZyb21BcnJheShcbiAgICAgICAgYWNjb3VudHMsIHsgaXRlbUlkOiAnaWQnLCBwYXJlbnRJdGVtSWQ6ICdwYXJlbnRBY2NvdW50SWQnIH1cbiAgICAgICk7XG4gXG4gICAgICBjb25zdCBvcGVuaW5nQmFsYW5jZVRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC8vIC5yZW1lbWJlcigpXG4gICAgICAgIC5tb2RpZnkoJ2ZpbHRlckRhdGVSYW5nZScsIG51bGwsIGZpbHRlci5mcm9tX2RhdGUpXG4gICAgICAgIC5tb2RpZnkoJ3N1bWF0aW9uQ3JlZGl0RGViaXQnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnYWNjb3VudC50eXBlJyk7XG5cbiAgICAgIGNvbnN0IGNsb3NpbmdCYWxhbmNlVHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLy8gLnJlbWVtYmVyKClcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyRGF0ZVJhbmdlJywgbnVsbCwgZmlsdGVyLnRvX2RhdGUpXG4gICAgICAgIC5tb2RpZnkoJ3N1bWF0aW9uQ3JlZGl0RGViaXQnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnYWNjb3VudC50eXBlJyk7XG5cbiAgICAgIGNvbnN0IG9wZWluZ0JhbGFuY2VDb2xsZWN0aW9uID0gbmV3IEpvdXJuYWxQb3N0ZXIoYWNjb3VudHNHcmFwaCk7XG4gICAgICBjb25zdCBjbG9zaW5nQmFsYW5jZUNvbGxlY3Rpb24gPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0dyYXBoKTtcblxuICAgICAgb3BlaW5nQmFsYW5jZUNvbGxlY3Rpb24ubG9hZEVudHJpZXMob3BlbmluZ0JhbGFuY2VUcmFuc2FjdGlvbnMpO1xuICAgICAgY2xvc2luZ0JhbGFuY2VDb2xsZWN0aW9uLmxvYWRFbnRyaWVzKGNsb3NpbmdCYWxhbmNlVHJhbnNhY3Rpb25zKTtcblxuICAgICAgLy8gVHJhbnNhY3Rpb24gYW1vdW50IGZvcm1hdHRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVlcnkuXG4gICAgICBjb25zdCBmb3JtYXROdW1iZXIgPSBmb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlci5udW1iZXJfZm9ybWF0KTtcblxuICAgICAgY29uc3QgYWNjb3VudHNSZXNwb25zZSA9IGFjY291bnRzXG4gICAgICAgIC5maWx0ZXIoKGFjY291bnQpID0+IChcbiAgICAgICAgICBhY2NvdW50LnRyYW5zYWN0aW9ucy5sZW5ndGggPiAwIHx8ICFmaWx0ZXIubm9uZV96ZXJvXG4gICAgICAgICkpXG4gICAgICAgIC5tYXAoKGFjY291bnQpID0+ICh7XG4gICAgICAgICAgLi4ucGljayhhY2NvdW50LCBbJ2lkJywgJ25hbWUnLCAnY29kZScsICdpbmRleCcsICdwYXJlbnRBY2NvdW50SWQnXSksXG4gICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAuLi5hY2NvdW50LnRyYW5zYWN0aW9ucy5tYXAoKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBhbW91bnQgPSAwO1xuXG4gICAgICAgICAgICAgIGlmIChhY2NvdW50LnR5cGUubm9ybWFsID09PSAnY3JlZGl0Jykge1xuICAgICAgICAgICAgICAgIGFtb3VudCArPSB0cmFuc2FjdGlvbi5jcmVkaXQgLSB0cmFuc2FjdGlvbi5kZWJpdDtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY2NvdW50LnR5cGUubm9ybWFsID09PSAnZGViaXQnKSB7XG4gICAgICAgICAgICAgICAgYW1vdW50ICs9IHRyYW5zYWN0aW9uLmRlYml0IC0gdHJhbnNhY3Rpb24uY3JlZGl0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucGljayh0cmFuc2FjdGlvbiwgWydpZCcsICdub3RlJywgJ3RyYW5zYWN0aW9uVHlwZScsICdyZWZlcmVuY2VUeXBlJyxcbiAgICAgICAgICAgICAgICAgICdyZWZlcmVuY2VJZCcsICdkYXRlJywgJ2NyZWF0ZWRBdCddKSxcbiAgICAgICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogZm9ybWF0TnVtYmVyKGFtb3VudCksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG9wZW5pbmc6ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcGVuaW5nQW1vdW50ID0gb3BlaW5nQmFsYW5jZUNvbGxlY3Rpb24uZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRhdGU6IGZpbHRlci5mcm9tX2RhdGUsXG4gICAgICAgICAgICAgIGFtb3VudDogb3BlbmluZ0Ftb3VudCxcbiAgICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogZm9ybWF0TnVtYmVyKG9wZW5pbmdBbW91bnQpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCksXG4gICAgICAgICAgY2xvc2luZzogKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsb3NpbmdBbW91bnQgPSBjbG9zaW5nQmFsYW5jZUNvbGxlY3Rpb24uZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRhdGU6IGZpbHRlci50b19kYXRlLFxuICAgICAgICAgICAgICBhbW91bnQ6IGNsb3NpbmdBbW91bnQsXG4gICAgICAgICAgICAgIGZvcm1hdHRlZF9hbW91bnQ6IGZvcm1hdE51bWJlcihjbG9zaW5nQW1vdW50KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIHF1ZXJ5OiB7IC4uLmZpbHRlciB9LFxuICAgICAgICBhY2NvdW50czogQWNjb3VudC50b05lc3RlZEFycmF5KGFjY291bnRzUmVzcG9uc2UpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn0iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB1bmlxaWQgZnJvbSAndW5pcWlkJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBib2R5LFxuICBwYXJhbSxcbiAgdmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBtYWlsIGZyb20gJ0Avc2VydmljZXMvbWFpbCc7XG5pbXBvcnQgeyBoYXNoUGFzc3dvcmQgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCBTeXN0ZW1Vc2VyIGZyb20gJ0Avc3lzdGVtL21vZGVscy9TeXN0ZW1Vc2VyJztcbmltcG9ydCBJbnZpdGUgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL0ludml0ZSc7XG5pbXBvcnQgVGVuYW50VXNlciBmcm9tICdAL21vZGVscy9UZW5hbnRVc2VyJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBUZW5hbnQgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL1RlbmFudCc7XG5pbXBvcnQgVGVuYW50c01hbmFnZXIgZnJvbSAnQC9zeXN0ZW0vVGVuYW50c01hbmFnZXInO1xuaW1wb3J0IGp3dEF1dGggZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvand0QXV0aCc7XG5pbXBvcnQgVGVuYW5jeU1pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvVGVuYW5jeU1pZGRsZXdhcmUnO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnQC9zZXJ2aWNlcy9Mb2dnZXInO1xuaW1wb3J0IE9wdGlvbiBmcm9tICdAL21vZGVscy9PcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci51c2UoJy9zZW5kJywgand0QXV0aCk7XG4gICAgcm91dGVyLnVzZSgnL3NlbmQnLCBUZW5hbmN5TWlkZGxld2FyZSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL3NlbmQnLFxuICAgICAgdGhpcy5pbnZpdGUudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmludml0ZS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL2FjY2VwdC86dG9rZW4nLFxuICAgICAgdGhpcy5hY2NlcHQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmFjY2VwdC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvaW52aXRlZC86dG9rZW4nLFxuICAgICAgdGhpcy5pbnZpdGVkLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5pbnZpdGVkLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEludml0ZSBhIHVzZXIgdG8gdGhlIGF1dGhvcml6ZWQgdXNlciBvcmdhbml6YXRpb24uXG4gICAqL1xuICBpbnZpdGU6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBib2R5KCdlbWFpbCcpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyB1c2VyIH0gPSByZXE7XG4gICAgICBjb25zdCB7IFRlbmFudFVzZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3VuZFVzZXIgPSBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdlbWFpbCcsIGZvcm0uZW1haWwpLmZpcnN0KCk7ICAgICAgXG5cbiAgICAgIGlmIChmb3VuZFVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdVU0VSLkVNQUlMLkFMUkVBRFkuUkVHSVNURVJFRCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0b2tlbiA9IHVuaXFpZCgpO1xuICAgICAgY29uc3QgaW52aXRlID0gYXdhaXQgSW52aXRlLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgZW1haWw6IGZvcm0uZW1haWwsXG4gICAgICAgIHRlbmFudF9pZDogdXNlci50ZW5hbnRJZCxcbiAgICAgICAgdG9rZW4sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHRlbmFudFVzZXIgPSBhd2FpdCBUZW5hbnRVc2VyLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgZmlyc3RfbmFtZTogZm9ybS5lbWFpbCxcbiAgICAgICAgZW1haWw6IGZvcm0uZW1haWwsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgT3B0aW9uIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3Qgb3JnYW5pemF0aW9uT3B0aW9ucyA9IGF3YWl0IE9wdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgna2V5JywgJ29yZ2FuaXphdGlvbl9uYW1lJyk7XG5cbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGdsb2JhbC5yb290UGF0aCwgJ3ZpZXdzL21haWwvVXNlckludml0ZS5odG1sJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgICAgY29uc3QgcmVuZGVyZWQgPSBNdXN0YWNoZS5yZW5kZXIodGVtcGxhdGUsIHtcbiAgICAgICAgYWNjZXB0VXJsOiBgJHtyZXEucHJvdG9jb2x9Oi8vJHtyZXEuaG9zdG5hbWV9L2ludml0ZS9hY2NlcHQvJHtpbnZpdGUudG9rZW59YCxcbiAgICAgICAgZnVsbE5hbWU6IGAke3VzZXIuZmlyc3ROYW1lfSAke3VzZXIubGFzdE5hbWV9YCxcbiAgICAgICAgZmlyc3ROYW1lOiB1c2VyLmZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWU6IHVzZXIubGFzdE5hbWUsXG4gICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsLFxuICAgICAgICBvcmdhbml6YXRpb25OYW1lOiBvcmdhbml6YXRpb25PcHRpb25zLmdldE1ldGEoJ29yZ2FuaXphdGlvbl9uYW1lJyksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1haWxPcHRpb25zID0ge1xuICAgICAgICB0bzogdXNlci5lbWFpbCxcbiAgICAgICAgZnJvbTogYCR7cHJvY2Vzcy5lbnYuTUFJTF9GUk9NX05BTUV9ICR7cHJvY2Vzcy5lbnYuTUFJTF9GUk9NX0FERFJFU1N9YCxcbiAgICAgICAgc3ViamVjdDogYCR7dXNlci5mdWxsTmFtZX0gaGFzIGludml0ZWQgeW91IHRvIGpvaW4gYSBCaWdjYXBpdGFsYCxcbiAgICAgICAgaHRtbDogcmVuZGVyZWQsXG4gICAgICB9O1xuICAgICAgbWFpbC5zZW5kTWFpbChtYWlsT3B0aW9ucywgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0ZhaWxlZCBzZW5kIHVzZXIgaW52aXRlIG1haWwnLCB7IGVycm9yLCBmb3JtIH0pO1xuICAgICAgICB9XG4gICAgICAgIExvZ2dlci5sb2coJ2luZm8nLCAnVXNlciBoYXMgYmVlbiBzZW50IGludml0ZSB1c2VyIGVtYWlsIHN1Y2Nlc3NmdWx5LicsIHsgZm9ybSB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBBY2NlcHJ0IHRoZSBpbnZpYXRpb24uXG4gICAqL1xuICBhY2NlcHQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnZmlyc3RfbmFtZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdsYXN0X25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygncGhvbmVfbnVtYmVyJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3Bhc3N3b3JkJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgcGFyYW0oJ3Rva2VuJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB0b2tlbiB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IGludml0ZVRva2VuID0gYXdhaXQgSW52aXRlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCd0b2tlbicsIHRva2VuKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIWludml0ZVRva2VuKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSU5WSVRFLlRPS0VOLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBsYW5ndWFnZTogJ2VuJyxcbiAgICAgICAgLi4ucmVxLmJvZHksXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3lzdGVtVXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ3Bob25lX251bWJlcicsIGZvcm0ucGhvbmVfbnVtYmVyKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoZXJlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBwaG9uZSBudW1iZXIuXG4gICAgICBpZiAoc3lzdGVtVXNlciAmJiBzeXN0ZW1Vc2VyLnBob25lTnVtYmVyID09PSBmb3JtLnBob25lX251bWJlcikge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ1BIT05FX01VTU5FUi5BTFJFQURZLkVYSVNUUycsIGNvZGU6IDQwMCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICAvLyBGaW5kIHRoZSB0ZW5hbnQgdGhhdCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiB0b2tlbi5cbiAgICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IFRlbmFudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpbnZpdGVUb2tlbi50ZW5hbnRJZCkuZmlyc3QoKTtcblxuICAgICAgY29uc3QgdGVuYW50RGIgPSBUZW5hbnRzTWFuYWdlci5rbmV4SW5zdGFuY2UodGVuYW50Lm9yZ2FuaXphdGlvbklkKTtcbiAgICAgIGNvbnN0IGhhc2hlZFBhc3N3b3JkID0gYXdhaXQgaGFzaFBhc3N3b3JkKGZvcm0ucGFzc3dvcmQpO1xuXG4gICAgICBjb25zdCB1c2VyRm9ybSA9IHtcbiAgICAgICAgZmlyc3RfbmFtZTogZm9ybS5maXJzdF9uYW1lLFxuICAgICAgICBsYXN0X25hbWU6IGZvcm0ubGFzdF9uYW1lLFxuICAgICAgICBlbWFpbDogaW52aXRlVG9rZW4uZW1haWwsXG4gICAgICAgIHBob25lX251bWJlcjogZm9ybS5waG9uZV9udW1iZXIsXG4gICAgICAgIGxhbmd1YWdlOiBmb3JtLmxhbmd1YWdlLFxuICAgICAgICBhY3RpdmU6IDEsXG4gICAgICB9O1xuICAgICAgVGVuYW50TW9kZWwua25leEJpbmRlZCA9IHRlbmFudERiO1xuXG4gICAgICBjb25zdCBmb3VuZFRlbmFudFVzZXIgPSBhd2FpdCBUZW5hbnRVc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdwaG9uZV9udW1iZXInLCBmb3JtLnBob25lX251bWJlcikuZmlyc3QoKTtcblxuICAgICAgaWYgKGZvdW5kVGVuYW50VXNlcikge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1BIT05FX05VTUJFUi5BTFJFQURZLkVYSVNUUycsIGNvZGU6IDQwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc2VydFVzZXJPcGVyID0gVGVuYW50VXNlci5iaW5kS25leCh0ZW5hbnREYilcbiAgICAgICAgLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdlbWFpbCcsIHVzZXJGb3JtLmVtYWlsKVxuICAgICAgICAucGF0Y2goe1xuICAgICAgICAgIC4uLnVzZXJGb3JtLFxuICAgICAgICAgIGludml0ZV9hY2NlcHRlZF9hdDogbW9tZW50KCkuZm9ybWF0KCdZWVlZL01NL0REJyksXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbnNlcnRTeXNVc2VyT3BlciA9IFN5c3RlbVVzZXIucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAuLi51c2VyRm9ybSxcbiAgICAgICAgcGFzc3dvcmQ6IGhhc2hlZFBhc3N3b3JkLFxuICAgICAgICB0ZW5hbnRfaWQ6IGludml0ZVRva2VuLnRlbmFudElkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRlbGV0ZUludml0ZVRva2VuT3BlciA9IEludml0ZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgndG9rZW4nLCBpbnZpdGVUb2tlbi50b2tlbikuZGVsZXRlKCk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgaW5zZXJ0VXNlck9wZXIsXG4gICAgICAgIGluc2VydFN5c1VzZXJPcGVyLFxuICAgICAgICBkZWxldGVJbnZpdGVUb2tlbk9wZXIsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBcbiAgICovXG4gIGludml0ZWQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndG9rZW4nKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IHRva2VuIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgaW52aXRlVG9rZW4gPSBhd2FpdCBJbnZpdGUucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ3Rva2VuJywgdG9rZW4pLmZpcnN0KCk7XG5cbiAgICAgIGlmICghaW52aXRlVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdJTlZJVEUuVE9LRU4uTk9ULkZPVU5EJywgY29kZTogMzAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbmQgdGhlIHRlbmFudCB0aGF0IGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHRva2VuLlxuICAgICAgY29uc3QgdGVuYW50ID0gYXdhaXQgVGVuYW50LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGludml0ZVRva2VuLnRlbmFudElkKS5maXJzdCgpO1xuXG4gICAgICBjb25zdCB0ZW5hbnREYiA9IFRlbmFudHNNYW5hZ2VyLmtuZXhJbnN0YW5jZSh0ZW5hbnQub3JnYW5pemF0aW9uSWQpO1xuICAgICAgY29uc3Qgb3JnYW5pemF0aW9uT3B0aW9ucyA9IGF3YWl0IE9wdGlvbi5iaW5kS25leCh0ZW5hbnREYikucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2tleScsICdvcmdhbml6YXRpb25fbmFtZScpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgb3JnYW5pemF0aW9uX25hbWU6IG9yZ2FuaXphdGlvbk9wdGlvbnMuZ2V0TWV0YSgnb3JnYW5pemF0aW9uX25hbWUnLCAnJykgICAgICAgICAgLFxuICAgICAgICAgIGludml0ZWRfZW1haWw6IGludml0ZVRva2VuLmVtYWlsLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn0iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBwYXJhbSxcbiAgdmFsaWRhdGlvblJlc3VsdCxcbiAgcXVlcnksXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICcuLi9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQge1xuICBEeW5hbWljRmlsdGVyLFxuICBEeW5hbWljRmlsdGVyU29ydEJ5LFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59IGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXInO1xuaW1wb3J0IHtcbiAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3RvciBtZXRob2QuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcbiAgICAvLyBjb25zdCBwZXJtaXQgPSBBdXRob3JpemF0aW9uKCdpdGVtc19jYXRlZ29yaWVzJyk7XG5cbiAgICByb3V0ZXIucG9zdCgnLzppZCcsXG4gICAgICB0aGlzLmVkaXRDYXRlZ29yeS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdENhdGVnb3J5LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvJyxcbiAgICAgIHRoaXMubmV3Q2F0ZWdvcnkudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLm5ld0NhdGVnb3J5LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy9idWxrJyxcbiAgICAgIHRoaXMuYnVsa0RlbGV0ZUNhdGVnb3JpZXMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmJ1bGtEZWxldGVDYXRlZ29yaWVzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVJdGVtLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVJdGVtLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86aWQnLFxuICAgICAgdGhpcy5nZXRDYXRlZ29yeS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0Q2F0ZWdvcnkuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmdldExpc3QudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldExpc3QuaGFuZGxlcikpO1xuXG4gICAgXG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGl0ZW0gY2F0ZWdvcnkuXG4gICAqL1xuICBuZXdDYXRlZ29yeToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCduYW1lJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3BhcmVudF9jYXRlZ29yeV9pZCcpXG4gICAgICAgIC5vcHRpb25hbCh7IG51bGxhYmxlOiB0cnVlLCBjaGVja0ZhbHN5OiB0cnVlIH0pXG4gICAgICAgIC5pc051bWVyaWMoKVxuICAgICAgICAudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdkZXNjcmlwdGlvbicpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIGNvbnN0IHsgSXRlbUNhdGVnb3J5IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBpZiAoZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWQpIHtcbiAgICAgICAgY29uc3QgZm91bmRQYXJlbnRDYXRlZ29yeSA9IGF3YWl0IEl0ZW1DYXRlZ29yeS5xdWVyeSgpXG4gICAgICAgICAgLndoZXJlKCdpZCcsIGZvcm0ucGFyZW50X2NhdGVnb3J5X2lkKVxuICAgICAgICAgIC5maXJzdCgpO1xuXG4gICAgICAgIGlmICghZm91bmRQYXJlbnRDYXRlZ29yeSkge1xuICAgICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZCgnVGhlIHBhcmVudCBjYXRlZ29yeSBJRCBpcyBub3QgZm91bmQuJywge1xuICAgICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUEFSRU5UX0NBVEVHT1JZX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAuLi5mb3JtLFxuICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBjYXRlZ29yeSB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBFZGl0IGRldGFpbHMgb2YgdGhlIGdpdmVuIGNhdGVnb3J5IGl0ZW0uXG4gICAqL1xuICBlZGl0Q2F0ZWdvcnk6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS50b0ludCgpLFxuICAgICAgY2hlY2soJ25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygncGFyZW50X2NhdGVnb3J5X2lkJylcbiAgICAgICAgLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUsIGNoZWNrRmFsc3k6IHRydWUgfSlcbiAgICAgICAgLmlzTnVtZXJpYygpXG4gICAgICAgIC50b0ludCgpLFxuICAgICAgY2hlY2soJ2Rlc2NyaXB0aW9uJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLFxuICAgICAgICAgIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyBJdGVtQ2F0ZWdvcnkgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBpdGVtQ2F0ZWdvcnkgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIWl0ZW1DYXRlZ29yeSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0lURU1fQ0FURUdPUlkuTk9ULkZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWRcbiAgICAgICAgJiYgZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWQgIT09IGl0ZW1DYXRlZ29yeS5wYXJlbnRfY2F0ZWdvcnlfaWRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBmb3VuZFBhcmVudENhdGVnb3J5ID0gYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KClcbiAgICAgICAgICAud2hlcmUoJ2lkJywgZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWQpXG4gICAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgICAgaWYgKCFmb3VuZFBhcmVudENhdGVnb3J5KSB7XG4gICAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKCdUaGUgcGFyZW50IGNhdGVnb3J5IElEIGlzIG5vdCBmb3VuZC4nLCB7XG4gICAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdQQVJFTlRfQ0FURUdPUllfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVJdGVtQ2F0ZWdvcnkgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpXG4gICAgICAgIC51cGRhdGUoeyAuLi5mb3JtIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGdpdmUgaXRlbSBjYXRlZ29yeS5cbiAgICovXG4gIGRlbGV0ZUl0ZW06IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgSXRlbUNhdGVnb3J5IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgaXRlbUNhdGVnb3J5ID0gYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgaWYgKCFpdGVtQ2F0ZWdvcnkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaXRlbUNhdGVnb3J5LmlkKVxuICAgICAgICAuZGVsZXRlKCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGl0ZW1zLlxuICAgKi9cbiAgZ2V0TGlzdDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdjb2x1bW5fc29ydF9vcmRlcicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgcXVlcnkoJ3NvcnRfb3JkZXInKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKS5pc0luKFsnZGVzYycsICdhc2MnXSksXG4gICAgICBxdWVyeSgnc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzJykub3B0aW9uYWwoKS5pc0pTT04oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgUmVzb3VyY2UsIEl0ZW1DYXRlZ29yeSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXNSZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCduYW1lJywgJ2l0ZW1zX2NhdGVnb3JpZXMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghY2F0ZWdvcmllc1Jlc291cmNlKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSVRFTVMuQ0FURUdPUklFUy5SRVNPVVJDRS5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGNvbHVtbl9zb3J0X29yZGVyOiAnJyxcbiAgICAgICAgc29ydF9vcmRlcjogJycsXG4gICAgICAgIGZpbHRlcl9yb2xlczogW10sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBpZiAoZmlsdGVyLnN0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcykge1xuICAgICAgICBmaWx0ZXIuZmlsdGVyX3JvbGVzID0gSlNPTi5wYXJzZShmaWx0ZXIuc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHNLZXlzID0gY2F0ZWdvcmllc1Jlc291cmNlLmZpZWxkcy5tYXAoKGMpID0+IGMua2V5KTtcbiAgICAgIGNvbnN0IGR5bmFtaWNGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlcihJdGVtQ2F0ZWdvcnkudGFibGVOYW1lKTtcblxuICAgICAgLy8gRHluYW1pYyBmaWx0ZXIgd2l0aCBmaWx0ZXIgcm9sZXMuXG4gICAgICBpZiAoZmlsdGVyLmZpbHRlcl9yb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBhY2NvdW50cyByZXNvdXJjZSBmaWVsZHMuXG4gICAgICAgIGNvbnN0IGZpbHRlclJvbGVzID0gbmV3IER5bmFtaWNGaWx0ZXJGaWx0ZXJSb2xlcyhcbiAgICAgICAgICBtYXBGaWx0ZXJSb2xlc1RvRHluYW1pY0ZpbHRlcihmaWx0ZXIuZmlsdGVyX3JvbGVzKSxcbiAgICAgICAgICBjYXRlZ29yaWVzUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBjYXRlZ29yaWVzUmVzb3VyY2Uuc2V0RmlsdGVyKGZpbHRlclJvbGVzKTtcblxuICAgICAgICBpZiAoZmlsdGVyUm9sZXMudmFsaWRhdGVGaWx0ZXJSb2xlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdJVEVNUy5SRVNPVVJDRS5IQVMuTk8uRklFTERTJywgY29kZTogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggY29sdW1uIHNvcnQgb3JkZXIuXG4gICAgICBpZiAoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSB7XG4gICAgICAgIGlmIChyZXNvdXJjZUZpZWxkc0tleXMuaW5kZXhPZihmaWx0ZXIuY29sdW1uX3NvcnRfb3JkZXIpID09PSAtMSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NPTFVNTi5TT1JULk9SREVSLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0QnlGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlclNvcnRCeShcbiAgICAgICAgICBmaWx0ZXIuY29sdW1uX3NvcnRfb3JkZXIsXG4gICAgICAgICAgZmlsdGVyLnNvcnRfb3JkZXIsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHNvcnRCeUZpbHRlcik7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuYnVpbGRRdWVyeSgpKGJ1aWxkZXIpO1xuXG4gICAgICAgIGJ1aWxkZXIuc2VsZWN0KFtcbiAgICAgICAgICAnKicsXG4gICAgICAgICAgSXRlbUNhdGVnb3J5LnJlbGF0ZWRRdWVyeSgnaXRlbXMnKS5jb3VudCgpLmFzKCdjb3VudCcpLFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBjYXRlZ29yaWVzIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRldGFpbHMgb2YgdGhlIGdpdmVuIGNhdGVnb3J5LlxuICAgKi9cbiAgZ2V0Q2F0ZWdvcnk6IHtcbiAgICB2YWxpZGF0aW9uOiBbcGFyYW0oJ2NhdGVnb3J5X2lkJykudG9JbnQoKV0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBjYXRlZ29yeV9pZDogY2F0ZWdvcnlJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgSXRlbUNhdGVnb3J5IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IEl0ZW1DYXRlZ29yeS53aGVyZSgnaWQnLCBjYXRlZ29yeUlkKS5mZXRjaCgpO1xuXG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdDQVRFR09SWV9OT1RfRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgY2F0ZWdvcnk6IGl0ZW0udG9KU09OKCkgfSk7XG4gICAgfSxcbiAgfSxcblxuXG4gIC8qKlxuICAgKiBCdWxrIGRlbGV0ZSB0aGUgZ2l2ZW4gaXRlbSBjYXRlZ29yaWVzLlxuICAgKi9cbiAgYnVsa0RlbGV0ZUNhdGVnb3JpZXM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnaWRzJykuaXNBcnJheSh7IG1pbjogMiB9KSxcbiAgICAgIHF1ZXJ5KCdpZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBpZHM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBJdGVtQ2F0ZWdvcnkgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBcbiAgICAgIGNvbnN0IGl0ZW1DYXRlZ29yaWVzID0gYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmaWx0ZXIuaWRzKTtcbiAgICAgIGNvbnN0IGl0ZW1DYXRlZ29yaWVzSWRzID0gaXRlbUNhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuaWQpO1xuICAgICAgY29uc3Qgbm90Rm91bmRDYXRlZ29yaWVzID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBpdGVtQ2F0ZWdvcmllc0lkcyk7XG5cbiAgICAgIGlmIChub3RGb3VuZENhdGVnb3JpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0lURU0uQ0FURUdPUklFUy5JRFMuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmaWx0ZXIuaWRzKS5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWRzOiBmaWx0ZXIuaWRzIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBjaGVjaywgcXVlcnksIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQge1xuICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyxcbiAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuaW1wb3J0IHtcbiAgRHluYW1pY0ZpbHRlcixcbiAgRHluYW1pY0ZpbHRlclNvcnRCeSxcbiAgRHluYW1pY0ZpbHRlclZpZXdzLFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59IGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXInO1xuaW1wb3J0IExvZ2dlciBmcm9tICdAL3NlcnZpY2VzL0xvZ2dlcic7XG5cbmNvbnN0IGZzUHJvbWlzZXMgPSBmcy5wcm9taXNlcztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkJyxcbiAgICAgIHRoaXMuZWRpdEl0ZW0udmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmVkaXRJdGVtLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvJyxcbiAgICAgIHRoaXMubmV3SXRlbS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMubmV3SXRlbS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvOmlkJyxcbiAgICAgIHRoaXMuZGVsZXRlSXRlbS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZGVsZXRlSXRlbS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvJyxcbiAgICAgIHRoaXMuYnVsa0RlbGV0ZUl0ZW1zLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5idWxrRGVsZXRlSXRlbXMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmxpc3RJdGVtcy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMubGlzdEl0ZW1zLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaXRlbS5cbiAgICovXG4gIG5ld0l0ZW06IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLFxuICAgICAgY2hlY2soJ3R5cGUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKClcbiAgICAgICAgLmlzSW4oWydzZXJ2aWNlJywgJ25vbi1pbnZlbnRvcnknLCAnaW52ZW50b3J5J10pLFxuICAgICAgY2hlY2soJ3NrdScpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2Nvc3RfcHJpY2UnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0Zsb2F0KCksXG4gICAgICBjaGVjaygnc2VsbF9wcmljZScpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvRmxvYXQoKSxcbiAgICAgIGNoZWNrKCdjb3N0X2FjY291bnRfaWQnKS5leGlzdHMoKS5pc0ludCgpLnRvSW50KCksXG4gICAgICBjaGVjaygnc2VsbF9hY2NvdW50X2lkJykuZXhpc3RzKCkuaXNJbnQoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2ludmVudG9yeV9hY2NvdW50X2lkJylcbiAgICAgICAgLmlmKGNoZWNrKCd0eXBlJykuZXF1YWxzKCdpbnZlbnRvcnknKSlcbiAgICAgICAgLmV4aXN0cygpXG4gICAgICAgIC5pc0ludCgpXG4gICAgICAgIC50b0ludCgpLFxuICAgICAgY2hlY2soJ2NhdGVnb3J5X2lkJykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KS5pc0ludCgpLnRvSW50KCksXG5cbiAgICAgIGNoZWNrKCdjdXN0b21fZmllbGRzJykub3B0aW9uYWwoKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgY2hlY2soJ2N1c3RvbV9maWVsZHMuKi5rZXknKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2N1c3RvbV9maWVsZHMuKi52YWx1ZScpLmV4aXN0cygpLFxuXG4gICAgICBjaGVjaygnbm90ZScpLm9wdGlvbmFsKCksXG5cbiAgICAgIGNoZWNrKCdtZWRpYV9pZHMnKS5vcHRpb25hbCgpLmlzQXJyYXkoKSxcbiAgICAgIGNoZWNrKCdtZWRpYV9pZHMuKicpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB1c2VyIH0gPSByZXE7XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBjdXN0b21fZmllbGRzOiBbXSxcbiAgICAgICAgbWVkaWFfaWRzOiBbXSxcbiAgICAgICAgLi4ucmVxLmJvZHksXG4gICAgICB9O1xuICAgICAgY29uc3Qge1xuICAgICAgICBBY2NvdW50LFxuICAgICAgICBSZXNvdXJjZSxcbiAgICAgICAgUmVzb3VyY2VGaWVsZCxcbiAgICAgICAgSXRlbUNhdGVnb3J5LFxuICAgICAgICBJdGVtLFxuICAgICAgICBNZWRpYUxpbmssXG4gICAgICB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgICBjb25zdCBjb3N0QWNjb3VudFByb21pc2UgPSBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQoZm9ybS5jb3N0X2FjY291bnRfaWQpO1xuICAgICAgY29uc3Qgc2VsbEFjY291bnRQcm9taXNlID0gQWNjb3VudC5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uc2VsbF9hY2NvdW50X2lkKTtcbiAgICAgIGNvbnN0IGludmVudG9yeUFjY291bnRQcm9taXNlID0gKGZvcm0udHlwZSA9PT0gJ2ludmVudG9yeScpXG4gICAgICAgID8gQWNjb3VudC5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uaW52ZW50b3J5X2FjY291bnRfaWQpIDogbnVsbDtcblxuICAgICAgY29uc3QgaXRlbUNhdGVnb3J5UHJvbWlzZSA9IChmb3JtLmNhdGVnb3J5X2lkKVxuICAgICAgICA/IEl0ZW1DYXRlZ29yeS5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uY2F0ZWdvcnlfaWQpIDogbnVsbDtcblxuICAgICAgLy8gVmFsaWRhdGUgdGhlIGN1c3RvbSBmaWVsZHMga2V5IGFuZCB2YWx1ZSB0eXBlLlxuICAgICAgaWYgKGZvcm0uY3VzdG9tX2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUZpZWxkc0tleXMgPSBmb3JtLmN1c3RvbV9maWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQua2V5KTtcblxuICAgICAgICAvLyBHZXQgcmVzb3VyY2UgaWQgdGhhbiBnZXQgYWxsIHJlc291cmNlIGZpZWxkcy5cbiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS53aGVyZSgnbmFtZScsICdpdGVtcycpLmZldGNoKCk7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IGF3YWl0IFJlc291cmNlRmllbGQucXVlcnkoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdyZXNvdXJjZV9pZCcsIHJlc291cmNlLmlkKTtcbiAgICAgICAgICBidWlsZGVyLndoZXJlSW4oJ2tleScsIGN1c3RvbUZpZWxkc0tleXMpO1xuICAgICAgICB9KS5mZXRjaEFsbCgpO1xuXG4gICAgICAgIGNvbnN0IHN0b3JlZEZpZWxkc0tleSA9IGZpZWxkcy5tYXAoKGYpID0+IGYuYXR0cmlidXRlcy5rZXkpO1xuXG4gICAgICAgIC8vIEdldCBhbGwgbm90IGRlZmluZWQgcmVzb3VyY2UgZmllbGRzLlxuICAgICAgICBjb25zdCBub3RGb3VuZEZpZWxkcyA9IGRpZmZlcmVuY2UoY3VzdG9tRmllbGRzS2V5cywgc3RvcmVkRmllbGRzS2V5KTtcblxuICAgICAgICBpZiAobm90Rm91bmRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0ZJRUxEX0tFWV9OT1RfRk9VTkQnLCBjb2RlOiAxNTAsIGZpZWxkczogbm90Rm91bmRGaWVsZHMgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IFtcbiAgICAgICAgY29zdEFjY291bnQsXG4gICAgICAgIHNlbGxBY2NvdW50LFxuICAgICAgICBpdGVtQ2F0ZWdvcnksXG4gICAgICAgIGludmVudG9yeUFjY291bnQsXG4gICAgICBdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBjb3N0QWNjb3VudFByb21pc2UsXG4gICAgICAgIHNlbGxBY2NvdW50UHJvbWlzZSxcbiAgICAgICAgaXRlbUNhdGVnb3J5UHJvbWlzZSxcbiAgICAgICAgaW52ZW50b3J5QWNjb3VudFByb21pc2UsXG4gICAgICBdKTtcbiAgICAgIGlmICghY29zdEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ09TVF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghc2VsbEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnU0VMTF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEyMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghaXRlbUNhdGVnb3J5ICYmIGZvcm0uY2F0ZWdvcnlfaWQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSVRFTV9DQVRFR09SWV9OT1RfRk9VTkQnLCBjb2RlOiAxNDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWludmVudG9yeUFjY291bnQgJiYgZm9ybS50eXBlID09PSAnaW52ZW50b3J5Jykge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdJTlZFTlRPUllfQUNDT1VOVF9OT1RfRk9VTkQnLCBjb2RlOiAxNTAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwgeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnVsa1NhdmVNZWRpYUxpbmtzID0gW107XG4gICAgICBjb25zdCBpdGVtID0gYXdhaXQgSXRlbS5xdWVyeSgpLmluc2VydEFuZEZldGNoKHtcbiAgICAgICAgbmFtZTogZm9ybS5uYW1lLFxuICAgICAgICB0eXBlOiBmb3JtLnR5cGUsXG4gICAgICAgIHNrdTogZm9ybS5za3UsXG4gICAgICAgIGNvc3RfcHJpY2U6IGZvcm0uY29zdF9wcmljZSxcbiAgICAgICAgc2VsbF9wcmljZTogZm9ybS5zZWxsX3ByaWNlLFxuICAgICAgICBzZWxsX2FjY291bnRfaWQ6IGZvcm0uc2VsbF9hY2NvdW50X2lkLFxuICAgICAgICBjb3N0X2FjY291bnRfaWQ6IGZvcm0uY29zdF9hY2NvdW50X2lkLFxuICAgICAgICBjdXJyZW5jeV9jb2RlOiBmb3JtLmN1cnJlbmN5X2NvZGUsXG4gICAgICAgIGNhdGVnb3J5X2lkOiBmb3JtLmNhdGVnb3J5X2lkLFxuICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgICBub3RlOiBmb3JtLm5vdGUsXG4gICAgICB9KTtcblxuICAgICAgZm9ybS5tZWRpYV9pZHMuZm9yRWFjaCgobWVkaWFJZCkgPT4ge1xuICAgICAgICBjb25zdCBvcGVyID0gTWVkaWFMaW5rLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgICBtb2RlbF9uYW1lOiAnSXRlbScsXG4gICAgICAgICAgbWVkaWFfaWQ6IG1lZGlhSWQsXG4gICAgICAgICAgbW9kZWxfaWQ6IGl0ZW0uaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBidWxrU2F2ZU1lZGlhTGlua3MucHVzaChvcGVyKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTYXZlIHRoZSBtZWRpYSBsaW5rcy5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgLi4uYnVsa1NhdmVNZWRpYUxpbmtzLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogaXRlbS5pZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBFZGl0IHRoZSBnaXZlbiBpdGVtLlxuICAgKi9cbiAgZWRpdEl0ZW06IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLFxuICAgICAgY2hlY2soJ3R5cGUnKVxuICAgICAgICAuZXhpc3RzKClcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuZXNjYXBlKClcbiAgICAgICAgLmlzSW4oWydwcm9kdWN0JywgJ3NlcnZpY2UnXSksXG4gICAgICBjaGVjaygnY29zdF9wcmljZScpLmV4aXN0cygpLmlzTnVtZXJpYygpLFxuICAgICAgY2hlY2soJ3NlbGxfcHJpY2UnKS5leGlzdHMoKS5pc051bWVyaWMoKSxcbiAgICAgIGNoZWNrKCdjb3N0X2FjY291bnRfaWQnKS5leGlzdHMoKS5pc0ludCgpLFxuICAgICAgY2hlY2soJ3NlbGxfYWNjb3VudF9pZCcpLmV4aXN0cygpLmlzSW50KCksXG4gICAgICBjaGVjaygnY2F0ZWdvcnlfaWQnKS5vcHRpb25hbCh7IG51bGxhYmxlOiB0cnVlIH0pLmlzSW50KCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdub3RlJykub3B0aW9uYWwoKSxcbiAgICAgIGNoZWNrKCdhdHRhY2htZW50Jykub3B0aW9uYWwoKSxcbiAgICAgIGNoZWNrKCcnKVxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgSXRlbSwgSXRlbUNhdGVnb3J5LCBNZWRpYUxpbmsgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuXG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBjdXN0b21fZmllbGRzOiBbXSxcbiAgICAgICAgLi4ucmVxLmJvZHksXG4gICAgICB9O1xuICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IEl0ZW0ucXVlcnkoKS5maW5kQnlJZChpZCkud2l0aEdyYXBoRmV0Y2hlZCgnbWVkaWEnKTtcblxuICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSVRFTS5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGNvbnN0IGNvc3RBY2NvdW50UHJvbWlzZSA9IEFjY291bnQucXVlcnkoKS5maW5kQnlJZChmb3JtLmNvc3RfYWNjb3VudF9pZCk7XG4gICAgICBjb25zdCBzZWxsQWNjb3VudFByb21pc2UgPSBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQoZm9ybS5zZWxsX2FjY291bnRfaWQpO1xuICAgICAgY29uc3QgaXRlbUNhdGVnb3J5UHJvbWlzZSA9IChmb3JtLmNhdGVnb3J5X2lkKVxuICAgICAgICA/IEl0ZW1DYXRlZ29yeS5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uY2F0ZWdvcnlfaWQpIDogbnVsbDtcblxuICAgICAgY29uc3QgW2Nvc3RBY2NvdW50LCBzZWxsQWNjb3VudCwgaXRlbUNhdGVnb3J5XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgY29zdEFjY291bnRQcm9taXNlLCBzZWxsQWNjb3VudFByb21pc2UsIGl0ZW1DYXRlZ29yeVByb21pc2UsXG4gICAgICBdKTtcbiAgICAgIGlmICghY29zdEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ09TVF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghc2VsbEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnU0VMTF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEyMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghaXRlbUNhdGVnb3J5ICYmIGZvcm0uY2F0ZWdvcnlfaWQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSVRFTV9DQVRFR09SWV9OT1RfRk9VTkQnLCBjb2RlOiAxNDAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSByZXEuZmlsZXMgJiYgcmVxLmZpbGVzLmF0dGFjaG1lbnQgPyByZXEuZmlsZXMuYXR0YWNobWVudCA6IG51bGw7XG4gICAgICBjb25zdCBhdHRhY2htZW50c01pbWVzID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZyddO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgYXR0YWNobWVudC5cbiAgICAgIGlmIChhdHRhY2htZW50ICYmIGF0dGFjaG1lbnRzTWltZXMuaW5kZXhPZihhdHRhY2htZW50Lm1pbWV0eXBlKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQVRUQUNITUVOVC5NSU5FVFlQRS5OT1QuU1VQUE9SVEVEJywgY29kZTogMTYwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYXR0YWNobWVudCkge1xuICAgICAgICBjb25zdCBwdWJsaWNQYXRoID0gJ3N0b3JhZ2UvYXBwL3B1YmxpYy8nO1xuICAgICAgICBjb25zdCB0ZW5hbnRQYXRoID0gYCR7cHVibGljUGF0aH0ke3JlcS5vcmdhbml6YXRpb25JZH1gO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnNQcm9taXNlcy51bmxpbmsoYCR7dGVuYW50UGF0aH0vJHtpdGVtLmF0dGFjaG1lbnRGaWxlfWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0RlbGV0ZSBpdGVtIGF0dGFjaG1lbnQgZmlsZSBkZWxldGUgZmFpbGVkLicsIHsgZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhdHRhY2htZW50Lm12KGAke3RlbmFudFBhdGh9LyR7YXR0YWNobWVudC5tZDV9LnBuZ2ApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdBVFRBQ0hNRU5ULlVQTE9BRC5GQUlMRUQnLCBjb2RlOiA2MDAgfV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZEl0ZW0gPSBhd2FpdCBJdGVtLnF1ZXJ5KCkuZmluZEJ5SWQoaWQpLnBhdGNoKHtcbiAgICAgICAgbmFtZTogZm9ybS5uYW1lLFxuICAgICAgICB0eXBlOiBmb3JtLnR5cGUsXG4gICAgICAgIGNvc3RfcHJpY2U6IGZvcm0uY29zdF9wcmljZSxcbiAgICAgICAgc2VsbF9wcmljZTogZm9ybS5zZWxsX3ByaWNlLFxuICAgICAgICBjdXJyZW5jeV9jb2RlOiBmb3JtLmN1cnJlbmN5X2NvZGUsXG4gICAgICAgIHNlbGxfYWNjb3VudF9pZDogZm9ybS5zZWxsX2FjY291bnRfaWQsXG4gICAgICAgIGNvc3RfYWNjb3VudF9pZDogZm9ybS5jb3N0X2FjY291bnRfaWQsXG4gICAgICAgIGNhdGVnb3J5X2lkOiBmb3JtLmNhdGVnb3J5X2lkLFxuICAgICAgICBub3RlOiBmb3JtLm5vdGUsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2F2ZSBsaW5rcyBvZiBuZXcgaW5zZXJ0ZWQgbWVkaWEgdGhhdCBhc3NvY2lhdGVkIHRvIHRoZSBpdGVtIG1vZGVsLlxuICAgICAgY29uc3QgaXRlbU1lZGlhSWRzID0gaXRlbS5tZWRpYS5tYXAoKG0pID0+IG0uaWQpO1xuICAgICAgY29uc3QgbmV3SW5zZXJ0ZWRNZWRpYSA9IGRpZmZlcmVuY2UoZm9ybS5tZWRpYV9pZHMsIGl0ZW1NZWRpYUlkcyk7XG4gICAgICBjb25zdCBidWxrU2F2ZU1lZGlhTGluayA9IFtdO1xuXG4gICAgICBuZXdJbnNlcnRlZE1lZGlhLmZvckVhY2goKG1lZGlhSWQpID0+IHtcbiAgICAgICAgY29uc3Qgb3BlciA9IE1lZGlhTGluay5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgICAgbW9kZWxfbmFtZTogJ0pvdXJuYWwnLFxuICAgICAgICAgIG1vZGVsX2lkOiBtYW51YWxKb3VybmFsLmlkLFxuICAgICAgICAgIG1lZGlhX2lkOiBtZWRpYUlkLFxuICAgICAgICB9KTtcbiAgICAgICAgYnVsa1NhdmVNZWRpYUxpbmsucHVzaChvcGVyKTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoWyAuLi5uZXdJbnNlcnRlZE1lZGlhIF0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogdXBkYXRlZEl0ZW0uaWQgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlIHRoZSBnaXZlbiBpdGVtIGZyb20gdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBkZWxldGVJdGVtOiB7XG4gICAgdmFsaWRhdGlvbjogW10sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgSXRlbSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBJdGVtLnF1ZXJ5KCkuZmluZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdJVEVNX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgdGhlIGZ1Y2tpbmcgdGhlIGdpdmVuIGl0ZW0gaWQuXG4gICAgICBhd2FpdCBJdGVtLnF1ZXJ5KCkuZmluZEJ5SWQoaXRlbS5pZCkuZGVsZXRlKCk7XG5cbiAgICAgIGlmIChpdGVtLmF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnN0IHB1YmxpY1BhdGggPSAnc3RvcmFnZS9hcHAvcHVibGljLyc7XG4gICAgICAgIGNvbnN0IHRlbmFudFBhdGggPSBgJHtwdWJsaWNQYXRofSR7cmVxLm9yZ2FuaXphdGlvbklkfWA7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmc1Byb21pc2VzLnVubGluayhgJHt0ZW5hbnRQYXRofS8ke2l0ZW0uYXR0YWNobWVudEZpbGV9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgTG9nZ2VyLmxvZygnZXJyb3InLCAnRGVsZXRlIGl0ZW0gYXR0YWNobWVudCBmaWxlIGRlbGV0ZSBmYWlsZWQuJywgeyBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogQnVsayBkZWxldGUgdGhlIGdpdmVuIGl0ZW1zIGlkcy5cbiAgICovXG4gIGJ1bGtEZWxldGVJdGVtczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdpZHMnKS5pc0FycmF5KHsgbWluOiAyIH0pLFxuICAgICAgcXVlcnkoJ2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7IGlkczogW10sIC4uLnJlcS5xdWVyeSB9O1xuICAgICAgY29uc3QgeyBJdGVtIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IEl0ZW0ucXVlcnkoKS53aGVyZUluKCdpZCcsIGZpbHRlci5pZHMpO1xuXG4gICAgICBjb25zdCBzdG9yZWRJdGVtc0lkcyA9IGl0ZW1zLm1hcCgoYSkgPT4gYS5pZCk7XG4gICAgICBjb25zdCBub3RGb3VuZEl0ZW1zID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBzdG9yZWRJdGVtc0lkcyk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBub3QgZm91bmQgaXRlbXMuXG4gICAgICBpZiAobm90Rm91bmRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSVRFTVMuTk9ULkZPVU5EJywgY29kZTogMjAwLCBpZHM6IG5vdEZvdW5kSXRlbXMgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgdGhlIGdpdmVuIGl0ZW1zIGlkcy5cbiAgICAgIGF3YWl0IEl0ZW0ucXVlcnkoKS53aGVyZUluKCdpZCcsIHN0b3JlZEl0ZW1zSWRzKS5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cml2ZSB0aGUgbGlzdCBpdGVtcyB3aXRoIHBhZ2luYXRpb24gbWV0YS5cbiAgICovXG4gIGxpc3RJdGVtczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdjb2x1bW5fc29ydF9vcmRlcicpLm9wdGlvbmFsKCkuaXNJbihbJ2NyZWF0ZWRfYXQnLCAnbmFtZScsICdhbW91bnQnLCAnc2t1J10pLFxuICAgICAgcXVlcnkoJ3NvcnRfb3JkZXInKS5vcHRpb25hbCgpLmlzSW4oWydkZXNjJywgJ2FzYyddKSxcbiAgICAgIHF1ZXJ5KCdwYWdlJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ3BhZ2Vfc2l6ZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdjdXN0b21fdmlld19pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdzdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMnKS5vcHRpb25hbCgpLmlzSlNPTigpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuICAgICAgY29uc3Qgdmlld0NvbmRpdGlvbnMgPSBbXTtcbiAgICAgIGNvbnN0IHsgUmVzb3VyY2UsIEl0ZW0sIFZpZXcgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBpdGVtc1Jlc291cmNlID0gYXdhaXQgUmVzb3VyY2UucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ25hbWUnLCAnaXRlbXMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghaXRlbXNSZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0lURU1TX1JFU09VUkNFX05PVF9GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGNvbHVtbl9zb3J0X29yZGVyOiAnJyxcbiAgICAgICAgc29ydF9vcmRlcjogJycsXG4gICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIHBhZ2Vfc2l6ZTogMTAsXG4gICAgICAgIGN1c3RvbV92aWV3X2lkOiBudWxsLFxuICAgICAgICBmaWx0ZXJfcm9sZXM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgaWYgKGZpbHRlci5zdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMpIHtcbiAgICAgICAgZmlsdGVyLmZpbHRlcl9yb2xlcyA9IEpTT04ucGFyc2UoZmlsdGVyLnN0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpZXcgPSBhd2FpdCBWaWV3LnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLmN1c3RvbV92aWV3X2lkKSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnaWQnLCBmaWx0ZXIuY3VzdG9tX3ZpZXdfaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2Zhdm91cml0ZScsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGJ1aWxkZXIud2hlcmUoJ3Jlc291cmNlX2lkJywgaXRlbXNSZXNvdXJjZS5pZCk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgncm9sZXMuZmllbGQnKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdjb2x1bW5zJyk7XG4gICAgICAgIGJ1aWxkZXIuZmlyc3QoKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHNLZXlzID0gaXRlbXNSZXNvdXJjZS5maWVsZHMubWFwKChjKSA9PiBjLmtleSk7XG4gICAgICBjb25zdCBkeW5hbWljRmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXIoSXRlbS50YWJsZU5hbWUpO1xuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIHZpZXcgcm9sZXMuXG4gICAgICBpZiAodmlldyAmJiB2aWV3LnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgdmlld0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyVmlld3MoXG4gICAgICAgICAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHModmlldy5yb2xlcyksXG4gICAgICAgICAgdmlldy5yb2xlc0xvZ2ljRXhwcmVzc2lvbixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCF2aWV3RmlsdGVyLnZhbGlkYXRlRmlsdGVyUm9sZXMoKSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuTE9HSUMuRVhQUkVTU0lPTi5JTlZBTElEJywgY29kZTogNDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHZpZXdGaWx0ZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGZpbHRlciByb2xlcy5cbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyX3JvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGFjY291bnRzIHJlc291cmNlIGZpZWxkcy5cbiAgICAgICAgY29uc3QgZmlsdGVyUm9sZXMgPSBuZXcgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzKFxuICAgICAgICAgIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyKGZpbHRlci5maWx0ZXJfcm9sZXMpLFxuICAgICAgICAgIGl0ZW1zUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihmaWx0ZXJSb2xlcyk7XG5cbiAgICAgICAgaWYgKGZpbHRlclJvbGVzLnZhbGlkYXRlRmlsdGVyUm9sZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSVRFTVMuUkVTT1VSQ0UuSEFTLk5PLkZJRUxEUycsIGNvZGU6IDUwMCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGNvbHVtbiBzb3J0IG9yZGVyLlxuICAgICAgaWYgKGZpbHRlci5jb2x1bW5fc29ydF9vcmRlcikge1xuICAgICAgICBpZiAocmVzb3VyY2VGaWVsZHNLZXlzLmluZGV4T2YoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSA9PT0gLTEpIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdDT0xVTU4uU09SVC5PUkRFUi5OT1QuRk9VTkQnLCBjb2RlOiAzMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydEJ5RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJTb3J0QnkoXG4gICAgICAgICAgZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyLFxuICAgICAgICAgIGZpbHRlci5zb3J0X29yZGVyLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihzb3J0QnlGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBJdGVtLnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ2Nvc3RBY2NvdW50Jyk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgnc2VsbEFjY291bnQnKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdpbnZlbnRvcnlBY2NvdW50Jyk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgnY2F0ZWdvcnknKTtcblxuICAgICAgICBkeW5hbWljRmlsdGVyLmJ1aWxkUXVlcnkoKShidWlsZGVyKTtcbiAgICAgIH0pLnBhZ2luYXRpb24oZmlsdGVyLnBhZ2UgLSAxLCBmaWx0ZXIucGFnZV9zaXplKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgaXRlbXMsXG4gICAgICAgIC4uLih2aWV3KSAmJiB7XG4gICAgICAgICAgY3VzdG9tVmlld0lkOiB2aWV3LmlkLFxuICAgICAgICAgIHZpZXdDb2x1bW5zOiB2aWV3LmNvbHVtbnMsXG4gICAgICAgICAgdmlld0NvbmRpdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxufTtcbiIsIlxuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBwYXJhbSxcbiAgcXVlcnksXG4gIHZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnQC9zZXJ2aWNlcy9Mb2dnZXInO1xuXG5jb25zdCBmc1Byb21pc2VzID0gZnMucHJvbWlzZXM7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLnBvc3QoJy91cGxvYWQnLFxuICAgICAgdGhpcy51cGxvYWQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnVwbG9hZC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvJyxcbiAgICAgIHRoaXMuZGVsZXRlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGUuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmdldC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0LmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGFsbCBvciB0aGUgZ2l2ZW4gYXR0YWNobWVudCBpZHMuXG4gICAqL1xuICBnZXQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnaWRzJyksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBNZWRpYSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IG1lZGlhID0gYXdhaXQgTWVkaWEucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG5cbiAgICAgICAgaWYgKHJlcS5xdWVyeS5pZHMpIHtcbiAgICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KHJlcS5xdWVyeS5pZHMpID8gcmVxLnF1ZXJ5LmlkcyA6IFtyZXEucXVlcnkuaWRzXTtcbiAgICAgICAgICBidWlsZGVyLndoZXJlSW4oJ2lkJywgaWRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IG1lZGlhIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgdGhlIGdpdmVuIGF0dGFjaG1lbnQgZmlsZS5cbiAgICovXG4gIHVwbG9hZDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIC8vIGNoZWNrKCdhdHRhY2htZW50JykuZXhpc3RzKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBpZiAoIXJlcS5maWxlcy5hdHRhY2htZW50KSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQVRUQUNITUVOVC5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcHVibGljUGF0aCA9ICdzdG9yYWdlL2FwcC9wdWJsaWMvJztcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzTWltZXMgPSBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJ107XG4gICAgICBjb25zdCB7IGF0dGFjaG1lbnQgfSA9IHJlcS5maWxlcztcbiAgICAgIGNvbnN0IHsgTWVkaWEgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgYXR0YWNobWVudC5cbiAgICAgIGlmIChhdHRhY2htZW50ICYmIGF0dGFjaG1lbnRzTWltZXMuaW5kZXhPZihhdHRhY2htZW50Lm1pbWV0eXBlKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQVRUQUNITUVOVC5NSU5FVFlQRS5OT1QuU1VQUE9SVEVEJywgY29kZTogMTYwIH0pO1xuICAgICAgfVxuICAgICAgLy8gQ2F0Y2ggYWxsIGVycm9yIHJlYXNvbnMgdG8gcmVzcG9uc2UgNDAwLlxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhdHRhY2htZW50Lm12KGAke3B1YmxpY1BhdGh9JHtyZXEub3JnYW5pemF0aW9uSWR9LyR7YXR0YWNobWVudC5tZDV9LnBuZ2ApO1xuICAgICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ0F0dGFjaG1lbnQgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ0F0dGFjaG1lbnQgdXBsb2FkaW5nIGZhaWxlZC4nLCB7IGVycm9yIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZWRpYSA9IGF3YWl0IE1lZGlhLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgYXR0YWNobWVudF9maWxlOiBgJHthdHRhY2htZW50Lm1kNX0ucG5nYCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgbWVkaWEgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgZ2l2ZW4gYXR0YWNobWVudCBpZHMgZnJvbSBmaWxlIHN5c3RlbSBhbmQgZGF0YWJhc2UuXG4gICAqL1xuICBkZWxldGU6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnaWRzJykuZXhpc3RzKCkuaXNBcnJheSgpLFxuICAgICAgcXVlcnkoJ2lkcy4qJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IE1lZGlhLCBNZWRpYUxpbmsgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KHJlcS5xdWVyeS5pZHMpID8gcmVxLnF1ZXJ5LmlkcyA6IFtyZXEucXVlcnkuaWRzXTtcbiAgICAgIGNvbnN0IG1lZGlhID0gYXdhaXQgTWVkaWEucXVlcnkoKS53aGVyZUluKCdpZCcsIGlkcyk7XG4gICAgICBjb25zdCBtZWRpYUlkcyA9IG1lZGlhLm1hcCgobSkgPT4gbS5pZCk7XG4gICAgICBjb25zdCBub3RGb3VuZE1lZGlhID0gZGlmZmVyZW5jZShpZHMsIG1lZGlhSWRzKTtcblxuICAgICAgaWYgKG5vdEZvdW5kTWVkaWEubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTUVESUEuSURTLk5PVC5GT1VORCcsIGNvZGU6IDIwMCwgaWRzOiBub3RGb3VuZE1lZGlhIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB1YmxpY1BhdGggPSAnc3RvcmFnZS9hcHAvcHVibGljLyc7XG4gICAgICBjb25zdCB0ZW5hbnRQYXRoID0gYCR7cHVibGljUGF0aH0ke3JlcS5vcmdhbml6YXRpb25JZH1gO1xuICAgICAgY29uc3QgdW5saW5rT3BlcnMgPSBbXTtcblxuICAgICAgbWVkaWEuZm9yRWFjaCgobWVkaWFNb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBvcGVyID0gZnNQcm9taXNlcy51bmxpbmsoYCR7dGVuYW50UGF0aH0vJHttZWRpYU1vZGVsLmF0dGFjaG1lbnRGaWxlfWApO1xuICAgICAgICB1bmxpbmtPcGVycy5wdXNoKG9wZXIpO1xuICAgICAgfSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh1bmxpbmtPcGVycykudGhlbigocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgcmVzb2x2ZWQuZm9yRWFjaCgoKSA9PiB7XG4gICAgICAgICAgTG9nZ2VyLmxvZygnZXJyb3InLCAnQXR0YWNobWVudCBmaWxlIGhhcyBiZWVuIGRlbGV0ZWQuJyk7XG4gICAgICAgIH0pOyBcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9ycykgPT4ge1xuICAgICAgICBlcnJvcnMuZm9yRWFjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBMb2dnZXIubG9nKCdlcnJvcicsICdEZWxldGUgaXRlbSBhdHRhY2htZW50IGZpbGUgZGVsZXRlIGZhaWxlZC4nLCB7IGVycm9yIH0pO1xuICAgICAgICB9KVxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IE1lZGlhTGluay5xdWVyeSgpLndoZXJlSW4oJ21lZGlhX2lkJywgbWVkaWFJZHMpLmRlbGV0ZSgpO1xuICAgICAgYXdhaXQgTWVkaWEucXVlcnkoKS53aGVyZUluKCdpZCcsIG1lZGlhSWRzKS5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGJvZHksIHF1ZXJ5LCB2YWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgcGljayB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLnBvc3QoJy8nLFxuICAgICAgdGhpcy5zYXZlT3B0aW9ucy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuc2F2ZU9wdGlvbnMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmdldE9wdGlvbnMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldE9wdGlvbnMuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogU2F2ZXMgdGhlIGdpdmVuIG9wdGlvbnMgdG8gdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBzYXZlT3B0aW9uczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGJvZHkoJ29wdGlvbnMnKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgYm9keSgnb3B0aW9ucy4qLmtleScpLmV4aXN0cygpLFxuICAgICAgYm9keSgnb3B0aW9ucy4qLnZhbHVlJykuZXhpc3RzKCksXG4gICAgICBib2R5KCdvcHRpb25zLiouZ3JvdXAnKS5leGlzdHMoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICdWQUxJREFUSU9OX0VSUk9SJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IE9wdGlvbiB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCBvcHRpb25zQ29sbGVjdGlvbnMgPSBhd2FpdCBPcHRpb24ucXVlcnkoKTtcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG4gICAgICBjb25zdCBub3REZWZpbmVkT3B0aW9ucyA9IE9wdGlvbi52YWxpZGF0ZURlZmluZWQoZm9ybS5vcHRpb25zKTtcblxuICAgICAgaWYgKG5vdERlZmluZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ09QVElPTlMuS0VZLk5PVC5ERUZJTkVEJyxcbiAgICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgICAga2V5czogbm90RGVmaW5lZE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5waWNrKG8sIFsna2V5JywgJ2dyb3VwJ10pIH0pKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGZvcm0ub3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgICAgb3B0aW9uc0NvbGxlY3Rpb25zLnNldE1ldGEoeyAuLi5vcHRpb24gfSk7XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IG9wdGlvbnNDb2xsZWN0aW9ucy5zYXZlTWV0YSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBvcHRpb25zOiBmb3JtIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbiBvcHRpb25zIGZyb20gdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBnZXRPcHRpb25zOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2tleScpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgnZ3JvdXAnKS5vcHRpb25hbCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ1ZBTElEQVRJT05fRVJST1InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgT3B0aW9uIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZmlsdGVyID0geyAuLi5yZXEucXVlcnkgfTtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCBPcHRpb24ucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIua2V5KSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgna2V5JywgZmlsdGVyLmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlci5ncm91cCkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2dyb3VwJywgZmlsdGVyLmdyb3VwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBvcHRpb25zOiBvcHRpb25zLm1ldGFkYXRhIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBwYXJhbSxcbiAgcXVlcnksXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvOnJlc291cmNlX3NsdWcvZGF0YScsXG4gICAgICB0aGlzLnJlc291cmNlRGF0YS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucmVzb3VyY2VEYXRhLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86cmVzb3VyY2Vfc2x1Zy9jb2x1bW5zJyxcbiAgICAgIHRoaXMucmVzb3VyY2VDb2x1bW5zLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5yZXNvdXJjZUNvbHVtbnMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLzpyZXNvdXJjZV9zbHVnL2ZpZWxkcycsXG4gICAgICB0aGlzLnJlc291cmNlRmllbGRzLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5yZXNvdXJjZUZpZWxkcy5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSByZXNvdXJjZSBkYXRhIG9mIHRoZSBnaXZlbiByZXNvdXJjZSBrZXkvc2x1Zy5cbiAgICovXG4gIHJlc291cmNlRGF0YToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdyZXNvdXJjZV9zbHVnJykudHJpbSgpLmVzY2FwZSgpLmV4aXN0cygpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBBY2NvdW50VHlwZSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHsgcmVzb3VyY2Vfc2x1ZzogcmVzb3VyY2VTbHVnIH0gPSByZXEucGFyYW1zO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgQWNjb3VudFR5cGUucXVlcnkoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgcmVzb3VyY2Vfc2x1ZzogcmVzb3VyY2VTbHVnLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgcmVzb3VyY2UgY29sdW1ucyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UuXG4gICAqL1xuICByZXNvdXJjZUNvbHVtbnM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgncmVzb3VyY2Vfc2x1ZycpLnRyaW0oKS5lc2NhcGUoKS5leGlzdHMoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgcmVzb3VyY2Vfc2x1ZzogcmVzb3VyY2VTbHVnIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBSZXNvdXJjZSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbmFtZScsIHJlc291cmNlU2x1ZylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2ZpZWxkcycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUkVTT1VSQ0UuU0xVRy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHMgPSByZXNvdXJjZS5maWVsZHNcbiAgICAgICAgLmZpbHRlcigoZmllbGQpID0+IGZpZWxkLmNvbHVtbmFibGUpXG4gICAgICAgIC5tYXAoKGZpZWxkKSA9PiAoe1xuICAgICAgICAgIGlkOiBmaWVsZC5pZCxcbiAgICAgICAgICBsYWJlbDogZmllbGQubGFiZWxOYW1lLFxuICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIHJlc291cmNlX2NvbHVtbnM6IHJlc291cmNlRmllbGRzLFxuICAgICAgICByZXNvdXJjZV9zbHVnOiByZXNvdXJjZVNsdWcsXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSByZXNvdXJjZSBmaWVsZHMgb2YgdGhlIGdpdmVuIHJlc291cmNlLlxuICAgKi9cbiAgcmVzb3VyY2VGaWVsZHM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgncmVzb3VyY2Vfc2x1ZycpLnRyaW0oKS5lc2NhcGUoKS5leGlzdHMoKSxcbiAgICAgIHF1ZXJ5KCdwcmVkZWZpbmVkJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICAgIHF1ZXJ5KCdidWlsdGluJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgcmVzb3VyY2Vfc2x1ZzogcmVzb3VyY2VTbHVnIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBSZXNvdXJjZSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbmFtZScsIHJlc291cmNlU2x1ZylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2ZpZWxkcycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUkVTT1VSQ0UuU0xVRy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgcmVzb3VyY2VfZmllbGRzOiByZXNvdXJjZS5maWVsZHMsXG4gICAgICAgIHJlc291cmNlX3NsdWc6IHJlc291cmNlU2x1ZyxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBjaGVjayxcbiAgcXVlcnksXG4gIHBhcmFtLFxuICB2YWxpZGF0aW9uUmVzdWx0LFxufSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgU3lzdGVtVXNlciBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtVXNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIucHV0KCcvOmlkL2luYWN0aXZlJyxcbiAgICAgIHRoaXMuaW5hY3RpdmVVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5pbmFjdGl2ZVVzZXIuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnB1dCgnLzppZC9hY3RpdmUnLFxuICAgICAgdGhpcy5hY3RpdmVVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5hY3RpdmVVc2VyLmhhbmRsZXIpKTtcbiAgXG4gICAgcm91dGVyLnBvc3QoJy86aWQnLFxuICAgICAgdGhpcy5lZGl0VXNlci52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdFVzZXIuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmxpc3RVc2Vycy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMubGlzdFVzZXJzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86aWQnLFxuICAgICAgdGhpcy5nZXRVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5nZXRVc2VyLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVVc2VyLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgZGV0YWlscyBvZiB0aGUgZ2l2ZW4gdXNlci5cbiAgICovXG4gIGVkaXRVc2VyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdmaXJzdF9uYW1lJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygnbGFzdF9uYW1lJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygnZW1haWwnKS5leGlzdHMoKS5pc0VtYWlsKCksXG4gICAgICBjaGVjaygncGhvbmVfbnVtYmVyJykub3B0aW9uYWwoKS5pc01vYmlsZVBob25lKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgVGVuYW50VXNlciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcblxuICAgICAgY29uc3QgZm91bmRVc2VycyA9IGF3YWl0IFRlbmFudFVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmVOb3QoJ2lkJywgaWQpXG4gICAgICAgIC5hbmRXaGVyZSgocSkgPT4ge1xuICAgICAgICAgIHEud2hlcmUoJ2VtYWlsJywgZm9ybS5lbWFpbCk7XG4gICAgICAgICAgcS5vcldoZXJlKCdwaG9uZV9udW1iZXInLCBmb3JtLnBob25lX251bWJlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBmb3VuZFVzZXJFbWFpbCA9IGZvdW5kVXNlcnMuZmluZCgodSkgPT4gdS5lbWFpbCA9PT0gZm9ybS5lbWFpbCk7XG4gICAgICBjb25zdCBmb3VuZFVzZXJQaG9uZSA9IGZvdW5kVXNlcnMuZmluZCgodSkgPT4gdS5waG9uZU51bWJlciA9PT0gZm9ybS5waG9uZV9udW1iZXIpO1xuXG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcblxuICAgICAgaWYgKGZvdW5kVXNlckVtYWlsKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0VNQUlMX0FMUkVBRFlfRVhJU1QnLCBjb2RlOiAxMDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZm91bmRVc2VyUGhvbmUpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnUEhPTkVfTlVNQkVSX0FMUkVBRFlfRVhJU1QnLCBjb2RlOiAxMjAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwgeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXJGb3JtID0ge1xuICAgICAgICBmaXJzdF9uYW1lOiBmb3JtLmZpcnN0X25hbWUsXG4gICAgICAgIGxhc3RfbmFtZTogZm9ybS5sYXN0X25hbWUsXG4gICAgICAgIGVtYWlsOiBmb3JtLmVtYWlsLFxuICAgICAgICBwaG9uZV9udW1iZXI6IGZvcm0ucGhvbmVfbnVtYmVyLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHVwZGF0ZVRlbmFudFVzZXIgPSBUZW5hbnRVc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKS51cGRhdGUoeyAuLi51c2VyRm9ybSB9KTtcblxuICAgICAgY29uc3QgdXBkYXRlU3lzdGVtVXNlciA9IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdXNlci5pZCkudXBkYXRlKHsgLi4udXNlckZvcm0gfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdXBkYXRlVGVuYW50VXNlciwgdXBkYXRlU3lzdGVtVXNlcixcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogU29mdCBkZWxldGluZyB0aGUgZ2l2ZW4gdXNlci5cbiAgICovXG4gIGRlbGV0ZVVzZXI6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgVGVuYW50VXNlciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBUZW5hbnRVc2VyLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1VTRVJfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRlbmFudFVzZXJEZWwgPSBUZW5hbnRVc2VyLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmRlbGV0ZSgpO1xuICAgICAgY29uc3Qgc3lzdGVtVXNlckRlbCA9IFN5c3RlbVVzZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZGVsZXRlKCk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGVuYW50VXNlckRlbCxcbiAgICAgICAgc3lzdGVtVXNlckRlbCxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgdXNlciBkZXRhaWxzIG9mIHRoZSBnaXZlbiB1c2VyIGlkLlxuICAgKi9cbiAgZ2V0VXNlcjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBUZW5hbnRVc2VyIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IFRlbmFudFVzZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgdXNlciB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiB1c2Vycy5cbiAgICovXG4gIGxpc3RVc2Vyczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdwYWdlX3NpemUnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgncGFnZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgcGFnZV9zaXplOiAxMCxcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgVGVuYW50VXNlciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHVzZXJzID0gYXdhaXQgVGVuYW50VXNlci5xdWVyeSgpXG4gICAgICAgIC5wYWdlKGZpbHRlci5wYWdlIC0gMSwgZmlsdGVyLnBhZ2Vfc2l6ZSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IHVzZXJzIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgaW5hY3RpdmVVc2VyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyB1c2VyIH0gPSByZXE7XG4gICAgICBjb25zdCB7IFRlbmFudFVzZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB0ZW5hbnRVc2VyID0gVGVuYW50VXNlci5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIXRlbmFudFVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdVU0VSLk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVUZW5hbnRVc2VyID0gVGVuYW50VXNlci5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZCkudXBkYXRlKHsgYWN0aXZlOiBmYWxzZSB9KTtcblxuICAgICAgY29uc3QgdXBkYXRlU3lzdGVtVXNlciA9IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdXNlci5pZCkudXBkYXRlKHsgYWN0aXZlOiBmYWxzZSB9KTtcbiAgICAgIFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB1cGRhdGVUZW5hbnRVc2VyLCB1cGRhdGVTeXN0ZW1Vc2VyLFxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiB0ZW5hbnRVc2VyLmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgYWN0aXZlVXNlcjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgeyBUZW5hbnRVc2VyIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgdGVuYW50VXNlciA9IFRlbmFudFVzZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF0ZW5hbnRVc2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVVNFUi5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlVGVuYW50VXNlciA9IFRlbmFudFVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpLnVwZGF0ZSh7IGFjdGl2ZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgdXBkYXRlU3lzdGVtVXNlciA9IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdXNlci5pZCkudXBkYXRlKHsgYWN0aXZlOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHVwZGF0ZVRlbmFudFVzZXIsIHVwZGF0ZVN5c3RlbVVzZXIsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiB0ZW5hbnRVc2VyLmlkIH0pO1xuICAgIH0sXG4gIH0sXG59OyIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHtcbiAgY2hlY2ssXG4gIHBhcmFtLFxuICBxdWVyeSxcbiAgdmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgcGljayB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQge1xuICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyxcbiAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuaW1wb3J0IHtcbiAgRHluYW1pY0ZpbHRlcixcbiAgRHluYW1pY0ZpbHRlclNvcnRCeSxcbiAgRHluYW1pY0ZpbHRlclZpZXdzLFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59IGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXInO1xuXG5cbmNvbnN0IHZhbGlkYXRpb1JvbGVzID0gW1xuICBjaGVjaygnZmlyc3RfbmFtZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnbGFzdF9uYW1lJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG5cbiAgY2hlY2soJ2NvbXBhbnlfbmFtZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gIGNoZWNrKCdkaXNwbGF5X25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG5cbiAgY2hlY2soJ2VtYWlsJykub3B0aW9uYWwoKS5pc0VtYWlsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnd29ya19waG9uZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygncGVyc29uYWxfcGhvbmUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcblxuICBjaGVjaygnYmlsbGluZ19hZGRyZXNzX2NpdHknKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ2JpbGxpbmdfYWRkcmVzc19jb3VudHJ5Jykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdiaWxsaW5nX2FkZHJlc3NfZW1haWwnKS5vcHRpb25hbCgpLmlzRW1haWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdiaWxsaW5nX2FkZHJlc3NfemlwY29kZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnYmlsbGluZ19hZGRyZXNzX3Bob25lJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdiaWxsaW5nX2FkZHJlc3Nfc3RhdGUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcblxuICBjaGVjaygnc2hpcHBpbmdfYWRkcmVzc19jaXR5Jykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdzaGlwcGluZ19hZGRyZXNzX2NvdW50cnknKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ3NoaXBwaW5nX2FkZHJlc3NfZW1haWwnKS5vcHRpb25hbCgpLmlzRW1haWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdzaGlwcGluZ19hZGRyZXNzX3ppcF9jb2RlJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdzaGlwcGluZ19hZGRyZXNzX3Bob25lJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdzaGlwcGluZ19hZGRyZXNzX3N0YXRlJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG5cbiAgY2hlY2soJ25vdGUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ2FjdGl2ZScpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG5cbiAgY2hlY2soJ2N1c3RvbV9maWVsZHMnKS5vcHRpb25hbCgpLmlzQXJyYXkoeyBtaW46IDEgfSksXG4gIGNoZWNrKCdjdXN0b21fZmllbGRzLioua2V5JykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnY3VzdG9tX2ZpZWxkcy4qLnZhbHVlJykuZXhpc3RzKCksXG5dO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5wb3N0KCcvJyxcbiAgICAgIHRoaXMubmV3VmVuZG9yLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5uZXdWZW5kb3IuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQnLFxuICAgICAgdGhpcy5lZGl0VmVuZG9yLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5lZGl0VmVuZG9yLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVWZW5kb3IudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmRlbGV0ZVZlbmRvci5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJyxcbiAgICAgIHRoaXMubGlzdFZlbmRvcnMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmxpc3RWZW5kb3JzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86aWQnLFxuICAgICAgdGhpcy5nZXRWZW5kb3IudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldFZlbmRvci5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB2ZW5kb3JzIGxpc3Qgd2l0aCBwYWdpbmF0aW9uIGFuZCBjdXN0b20gdmlldyBtZXRhZGF0YS5cbiAgICovXG4gIGxpc3RWZW5kb3JzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2NvbHVtbl9zb3J0X29yZGVyJykub3B0aW9uYWwoKS5pc0luKFsnY3JlYXRlZF9hdCddKSxcbiAgICAgIHF1ZXJ5KCdzb3J0X29yZGVyJykub3B0aW9uYWwoKS5pc0luKFsnZGVzYycsICdhc2MnXSksXG4gICAgICBxdWVyeSgncGFnZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdwYWdlX3NpemUnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnY3VzdG9tX3ZpZXdfaWQnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzJykub3B0aW9uYWwoKS5pc0pTT04oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IFJlc291cmNlLCBWaWV3LCBWZW5kb3IgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcblxuICAgICAgY29uc3QgdmVuZG9yc1Jlc291cmNlID0gYXdhaXQgUmVzb3VyY2UucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ25hbWUnLCAndmVuZG9ycycpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdmaWVsZHMnKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgaWYgKCF2ZW5kb3JzUmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdWRU5ET1JTLlJFU09VUkNFLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgY29sdW1uX3NvcnRfb3JkZXI6ICcnLFxuICAgICAgICBzb3J0X29yZGVyOiAnJyxcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgcGFnZV9zaXplOiAxMCxcbiAgICAgICAgY3VzdG9tX3ZpZXdfaWQ6IG51bGwsXG4gICAgICAgIGZpbHRlcl9yb2xlczogW10sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBpZiAoZmlsdGVyLnN0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcykge1xuICAgICAgICBmaWx0ZXIuZmlsdGVyX3JvbGVzID0gSlNPTi5wYXJzZShmaWx0ZXIuc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpZXcgPSBhd2FpdCBWaWV3LnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLmN1c3RvbV92aWV3X2lkKSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnaWQnLCBmaWx0ZXIuY3VzdG9tX3ZpZXdfaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2Zhdm91cml0ZScsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGJ1aWxkZXIud2hlcmUoJ3Jlc291cmNlX2lkJywgdmVuZG9yc1Jlc291cmNlLmlkKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdyb2xlcy5maWVsZCcpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ2NvbHVtbnMnKTtcbiAgICAgICAgYnVpbGRlci5maXJzdCgpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXNvdXJjZUZpZWxkc0tleXMgPSB2ZW5kb3JzUmVzb3VyY2UuZmllbGRzLm1hcCgoYykgPT4gYy5rZXkpO1xuICAgICAgY29uc3QgZHluYW1pY0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyKFZlbmRvci50YWJsZU5hbWUpO1xuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIHZpZXcgcm9sZXMuXG4gICAgICBpZiAodmlldyAmJiB2aWV3LnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgdmlld0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyVmlld3MoXG4gICAgICAgICAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHModmlldy5yb2xlcyksXG4gICAgICAgICAgdmlldy5yb2xlc0xvZ2ljRXhwcmVzc2lvbixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCF2aWV3RmlsdGVyLnZhbGlkYXRlRmlsdGVyUm9sZXMoKSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuTE9HSUMuRVhQUkVTU0lPTi5JTlZBTElEJywgY29kZTogNDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHZpZXdGaWx0ZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGZpbHRlciByb2xlcy5cbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyX3JvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGFjY291bnRzIHJlc291cmNlIGZpZWxkcy5cbiAgICAgICAgY29uc3QgZmlsdGVyUm9sZXMgPSBuZXcgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzKFxuICAgICAgICAgIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyKGZpbHRlci5maWx0ZXJfcm9sZXMpLFxuICAgICAgICAgIHZlbmRvcnNSZXNvdXJjZS5maWVsZHMsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKGZpbHRlclJvbGVzKTtcblxuICAgICAgICBpZiAoZmlsdGVyUm9sZXMudmFsaWRhdGVGaWx0ZXJSb2xlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdJVEVNUy5SRVNPVVJDRS5IQVMuTk8uRklFTERTJywgY29kZTogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggY29sdW1uIHNvcnQgb3JkZXIuXG4gICAgICBpZiAoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSB7XG4gICAgICAgIGlmIChyZXNvdXJjZUZpZWxkc0tleXMuaW5kZXhPZihmaWx0ZXIuY29sdW1uX3NvcnRfb3JkZXIpID09PSAtMSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NPTFVNTi5TT1JULk9SREVSLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0QnlGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlclNvcnRCeShcbiAgICAgICAgICBmaWx0ZXIuY29sdW1uX3NvcnRfb3JkZXIsXG4gICAgICAgICAgZmlsdGVyLnNvcnRfb3JkZXIsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHNvcnRCeUZpbHRlcik7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICAvLyBWZW5kb3JzIHF1ZXJ5LlxuICAgICAgY29uc3QgdmVuZG9ycyA9IGF3YWl0IFZlbmRvci5xdWVyeSgpLm9uQnVpbGQoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgZHluYW1pY0ZpbHRlci5idWlsZFF1ZXJ5KCkoYnVpbGRlcik7XG4gICAgICB9KS5wYWdpbmF0aW9uKGZpbHRlci5wYWdlIC0gMSwgZmlsdGVyLnBhZ2Vfc2l6ZSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIHZlbmRvcnMsXG4gICAgICAgIC4uLih2aWV3KSA/IHtcbiAgICAgICAgICBjdXN0b21WaWV3SWQ6IHZpZXcuaWQsXG4gICAgICAgIH0gOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU3VibWl0IGEgbmV3IHZlbmRvciBkZXRhaWxzLlxuICAgKi9cbiAgbmV3VmVuZG9yOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgLi4udmFsaWRhdGlvUm9sZXMsXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBWZW5kb3IgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuXG4gICAgICBjb25zdCB2ZW5kb3IgPSBhd2FpdCBWZW5kb3IucXVlcnkoKS5pbnNlcnRBbmRGZXRjaCh7XG4gICAgICAgIC4uLnBpY2soZm9ybSwgW1xuICAgICAgICAgICdmaXJzdF9uYW1lJyxcbiAgICAgICAgICAnbGFzdF9uYW1lJyxcbiAgICAgICAgICAnY29tcGFueV9uYW1lJyxcbiAgICAgICAgICAnZGlzcGxheV9uYW1lJyxcbiAgICAgICAgICBcbiAgICAgICAgICAnZW1haWwnLFxuICAgICAgICAgICd3b3JrX3Bob25lJyxcbiAgICAgICAgICAncGVyc29uYWxfcGhvbmUnLFxuXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc18xJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzXzInLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19jb3VudHJ5JyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX2VtYWlsJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfcGhvbmUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3Nfc3RhdGUnLFxuXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMicsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY291bnRyeScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfZW1haWwnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3Bob25lJyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19zdGF0ZScsXG5cbiAgICAgICAgICAnbm90ZScsXG4gICAgICAgICAgJ2FjdGl2ZScsXG4gICAgICAgIF0pLCBcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogdmVuZG9yLmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgZGV0YWlscyBvZiB0aGUgZ2l2ZW4gdmVuZG9yIGlkLlxuICAgKi9cbiAgZWRpdFZlbmRvcjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICAuLi52YWxpZGF0aW9Sb2xlcyxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIGNvbnN0IHsgVmVuZG9yIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgdmVuZG9yID0gYXdhaXQgVmVuZG9yLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdmVuZG9yKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVkVORE9SLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IFZlbmRvci5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS5wYXRjaCh7XG4gICAgICAgIC4uLnBpY2soZm9ybSwgW1xuICAgICAgICAgICdmaXJzdF9uYW1lJyxcbiAgICAgICAgICAnbGFzdF9uYW1lJyxcbiAgICAgICAgICAnY29tcGFueV9uYW1lJyxcbiAgICAgICAgICAnZGlzcGxheV9uYW1lJyxcbiAgICAgICAgICBcbiAgICAgICAgICAnZW1haWwnLFxuICAgICAgICAgICd3b3JrX3Bob25lJyxcbiAgICAgICAgICAncGVyc29uYWxfcGhvbmUnLFxuXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc18xJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzXzInLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19jb3VudHJ5JyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX2VtYWlsJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfcGhvbmUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3Nfc3RhdGUnLFxuXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMicsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY291bnRyeScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfZW1haWwnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3Bob25lJyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19zdGF0ZScsXG5cbiAgICAgICAgICAnbm90ZScsXG4gICAgICAgICAgJ2FjdGl2ZScsXG4gICAgICAgIF0pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZXRhaWxzIG9mIHRoZSBnaXZlbiB2ZW5kb3IgaWQuXG4gICAqL1xuICBnZXRWZW5kb3I6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgVmVuZG9yIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHZlbmRvciA9IGF3YWl0IFZlbmRvci5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIXZlbmRvcikge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1ZFTkRPUi5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgdmVuZG9yIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZ2l2ZW4gdmVuZG9yLlxuICAgKi9cbiAgZGVsZXRlVmVuZG9yOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IFZlbmRvciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB2ZW5kb3IgPSBhd2FpdCBWZW5kb3IucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF2ZW5kb3IpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdWRU5ET1IuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFZlbmRvci5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfVxufTtcbiIsImltcG9ydCB7IGRpZmZlcmVuY2UsIHBpY2sgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBjaGVjayxcbiAgcXVlcnksXG4gIHBhcmFtLFxuICBvbmVPZixcbiAgdmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVWaWV3Um9sZXMsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHJlc291cmNlOiAnaXRlbXMnLFxuXG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLFxuICAgICAgdGhpcy5saXN0Vmlld3MudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmxpc3RWaWV3cy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLycsXG4gICAgICB0aGlzLmNyZWF0ZVZpZXcudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmNyZWF0ZVZpZXcuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86dmlld19pZCcsXG4gICAgICB0aGlzLmVkaXRWaWV3LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5lZGl0Vmlldy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvOnZpZXdfaWQnLFxuICAgICAgdGhpcy5kZWxldGVWaWV3LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVWaWV3LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86dmlld19pZCcsXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5nZXRWaWV3LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86dmlld19pZC9yZXNvdXJjZScsXG4gICAgICB0aGlzLmdldFZpZXdSZXNvdXJjZS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0Vmlld1Jlc291cmNlLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIHZpZXdzIHRoYXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiByZXNvdXJjZS5cbiAgICovXG4gIGxpc3RWaWV3czoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIG9uZU9mKFtcbiAgICAgICAgcXVlcnkoJ3Jlc291cmNlX25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBdLCBbXG4gICAgICAgIHF1ZXJ5KCdyZXNvdXJjZV9pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBdKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgUmVzb3VyY2UsIFZpZXcgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7IC4uLnJlcS5xdWVyeSB9O1xuXG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLnJlc291cmNlX2lkKSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnaWQnLCBmaWx0ZXIucmVzb3VyY2VfaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIucmVzb3VyY2VfbmFtZSkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ25hbWUnLCBmaWx0ZXIucmVzb3VyY2VfbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRlci5maXJzdCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgVmlldy5xdWVyeSgpLndoZXJlKCdyZXNvdXJjZV9pZCcsIHJlc291cmNlLmlkKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgdmlld3MgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgdmlldyBkZXRhaWxzIG9mIHRoZSBnaXZlbiB2aWV3IGlkLlxuICAgKi9cbiAgZ2V0Vmlldzoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCd2aWV3X2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgdmlld19pZDogdmlld0lkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBWaWV3IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCB2aWV3ID0gYXdhaXQgVmlldy5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCB2aWV3SWQpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdyZXNvdXJjZScpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdjb2x1bW5zJylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3JvbGVzLmZpZWxkJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdmlldykge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1ZJRVdfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IHZpZXc6IHZpZXcudG9KU09OKCkgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlIHRoZSBnaXZlbiB2aWV3IG9mIHRoZSByZXNvdXJjZS5cbiAgICovXG4gIGRlbGV0ZVZpZXc6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndmlld19pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IFZpZXcgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB7IHZpZXdfaWQ6IHZpZXdJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHZpZXcgPSBhd2FpdCBWaWV3LnF1ZXJ5KCkuZmluZEJ5SWQodmlld0lkKTtcblxuICAgICAgaWYgKCF2aWV3KSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVklFV19OT1RfRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHZpZXcucHJlZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUFJFREVGSU5FRF9WSUVXJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdmlldy4kcmVsYXRlZFF1ZXJ5KCdyb2xlcycpLmRlbGV0ZSgpLFxuICAgICAgICB2aWV3LiRyZWxhdGVkUXVlcnkoJ2NvbHVtbnMnKS5kZWxldGUoKSxcbiAgICAgIF0pO1xuICAgICAgYXdhaXQgVmlldy5xdWVyeSgpLndoZXJlKCdpZCcsIHZpZXcuaWQpLmRlbGV0ZSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogdmlldy5pZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHZpZXcuXG4gICAqL1xuICBjcmVhdGVWaWV3OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ3Jlc291cmNlX25hbWUnKS5leGlzdHMoKS5lc2NhcGUoKS50cmltKCksXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdsb2dpY19leHByZXNzaW9uJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3JvbGVzJykuaXNBcnJheSh7IG1pbjogMSB9KSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmZpZWxkX2tleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmNvbXBhcmF0b3InKS5leGlzdHMoKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLnZhbHVlJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygncm9sZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY29sdW1ucycpLmV4aXN0cygpLmlzQXJyYXkoeyBtaW46IDEgfSksXG4gICAgICBjaGVjaygnY29sdW1ucy4qLmtleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdjb2x1bW5zLiouaW5kZXgnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgUmVzb3VyY2UsXG4gICAgICAgIFZpZXcsXG4gICAgICAgIFZpZXdDb2x1bW4sXG4gICAgICAgIFZpZXdSb2xlLFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3JtID0geyByb2xlczogW10sIC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KCkud2hlcmUoJ25hbWUnLCBmb3JtLnJlc291cmNlX25hbWUpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdSRVNPVVJDRV9OT1RfRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG4gICAgICBjb25zdCBmaWVsZHNTbHVncyA9IGZvcm0ucm9sZXMubWFwKChyb2xlKSA9PiByb2xlLmZpZWxkX2tleSk7XG5cbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzID0gYXdhaXQgcmVzb3VyY2UuJHJlbGF0ZWRRdWVyeSgnZmllbGRzJyk7XG4gICAgICBjb25zdCByZXNvdXJjZUZpZWxkc0tleXMgPSByZXNvdXJjZUZpZWxkcy5tYXAoKGYpID0+IGYua2V5KTtcbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5c01hcCA9IG5ldyBNYXAocmVzb3VyY2VGaWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLmtleSwgZmllbGRdKSk7XG4gICAgICBjb25zdCBjb2x1bW5zS2V5cyA9IGZvcm0uY29sdW1ucy5tYXAoKGMpID0+IGMua2V5KTtcblxuICAgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3RvcmVkIHJlc291cmNlIGZpZWxkcyBhbmQgc3VibWl0IGZpZWxkcyBrZXlzLlxuICAgICAgY29uc3Qgbm90Rm91bmRGaWVsZHMgPSBkaWZmZXJlbmNlKGZpZWxkc1NsdWdzLCByZXNvdXJjZUZpZWxkc0tleXMpO1xuXG4gICAgICBpZiAobm90Rm91bmRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdSRVNPVVJDRV9GSUVMRFNfTk9UX0VYSVNUJywgY29kZTogMTAwLCBmaWVsZHM6IG5vdEZvdW5kRmllbGRzIH0pO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3RvcmVkIHJlc291cmNlIGZpZWxkcyBhbmQgdGhlIHN1Ym1pdCBjb2x1bW5zIGtleXMuXG4gICAgICBjb25zdCBub3RGb3VuZENvbHVtbnMgPSBkaWZmZXJlbmNlKGNvbHVtbnNLZXlzLCByZXNvdXJjZUZpZWxkc0tleXMpO1xuXG4gICAgICBpZiAobm90Rm91bmRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ09MVU1OU19OT1RfRVhJU1QnLCBjb2RlOiAyMDAsIGNvbHVtbnM6IG5vdEZvdW5kQ29sdW1ucyB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlcyB0aGUgdmlldyBjb25kaXRpb25hbCBsb2dpYyBleHByZXNzaW9uLlxuICAgICAgaWYgKCF2YWxpZGF0ZVZpZXdSb2xlcyhmb3JtLnJvbGVzLCBmb3JtLmxvZ2ljX2V4cHJlc3Npb24pKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuUk9MRVMuTE9HSUMuRVhQUkVTU0lPTi5JTlZBTElEJywgY29kZTogNDAwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgdmlldyBkZXRhaWxzLlxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICBuYW1lOiBmb3JtLm5hbWUsXG4gICAgICAgIHByZWRlZmluZWQ6IGZhbHNlLFxuICAgICAgICByZXNvdXJjZV9pZDogcmVzb3VyY2UuaWQsXG4gICAgICAgIHJvbGVzX2xvZ2ljX2V4cHJlc3Npb246IGZvcm0ubG9naWNfZXhwcmVzc2lvbixcbiAgICAgIH0pO1xuICAgICAgLy8gU2F2ZSB2aWV3IHJvbGVzIGFzeW5jIG9wZXJhdGlvbnMuXG4gICAgICBjb25zdCBzYXZlVmlld1JvbGVzT3BlcnMgPSBbXTtcblxuICAgICAgZm9ybS5yb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTW9kZWwgPSByZXNvdXJjZUZpZWxkc0tleXNNYXAuZ2V0KHJvbGUuZmllbGRfa2V5KTtcblxuICAgICAgICBjb25zdCBzYXZlVmlld1JvbGVPcGVyID0gVmlld1JvbGUucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIC4uLnBpY2socm9sZSwgWydjb21wYXJhdG9yJywgJ3ZhbHVlJywgJ2luZGV4J10pLFxuICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgIHZpZXdfaWQ6IHZpZXcuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBzYXZlVmlld1JvbGVzT3BlcnMucHVzaChzYXZlVmlld1JvbGVPcGVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3JtLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTW9kZWwgPSByZXNvdXJjZUZpZWxkc0tleXNNYXAuZ2V0KGNvbHVtbi5rZXkpO1xuXG4gICAgICAgIGNvbnN0IHNhdmVWaWV3Q29sdW1uT3BlciA9IFZpZXdDb2x1bW4ucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgIHZpZXdfaWQ6IHZpZXcuaWQsXG4gICAgICAgICAgaW5kZXg6IGNvbHVtbi5pbmRleCxcbiAgICAgICAgfSk7XG4gICAgICAgIHNhdmVWaWV3Um9sZXNPcGVycy5wdXNoKHNhdmVWaWV3Q29sdW1uT3Blcik7XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHNhdmVWaWV3Um9sZXNPcGVycyk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiB2aWV3LmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIGdpdmVuIGN1c3RvbSB2aWV3IG1ldGFkYXRhLlxuICAgKi9cbiAgZWRpdFZpZXc6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndmlld19pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdsb2dpY19leHByZXNzaW9uJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gICAgICBjaGVjaygnY29sdW1ucycpLmV4aXN0cygpLmlzQXJyYXkoeyBtaW46IDEgfSksXG5cbiAgICAgIGNoZWNrKCdjb2x1bW5zLiouaWQnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY29sdW1ucy4qLmtleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdjb2x1bW5zLiouaW5kZXgnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuXG4gICAgICBjaGVjaygncm9sZXMnKS5pc0FycmF5KCksXG4gICAgICBjaGVjaygncm9sZXMuKi5pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmZpZWxkX2tleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmNvbXBhcmF0b3InKS5leGlzdHMoKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLnZhbHVlJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygncm9sZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IHZpZXdfaWQ6IHZpZXdJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIFZpZXcsIFZpZXdSb2xlLCBWaWV3Q29sdW1uLCBSZXNvdXJjZSxcbiAgICAgIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS53aGVyZSgnaWQnLCB2aWV3SWQpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdyb2xlcy5maWVsZCcpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdjb2x1bW5zJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdmlldykge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1JPTEVfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIHZpZXcucmVzb3VyY2VJZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2ZpZWxkcycpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd2aWV3cycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcbiAgICAgIGNvbnN0IGZpZWxkc1NsdWdzID0gZm9ybS5yb2xlcy5tYXAoKHJvbGUpID0+IHJvbGUuZmllbGRfa2V5KTtcbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5cyA9IHJlc291cmNlLmZpZWxkcy5tYXAoKGYpID0+IGYua2V5KTtcbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5c01hcCA9IG5ldyBNYXAocmVzb3VyY2UuZmllbGRzLm1hcCgoZmllbGQpID0+IFtmaWVsZC5rZXksIGZpZWxkXSkpO1xuICAgICAgY29uc3QgY29sdW1uc0tleXMgPSBmb3JtLmNvbHVtbnMubWFwKChjKSA9PiBjLmtleSk7XG5cbiAgICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0b3JlZCByZXNvdXJjZSBmaWVsZHMgYW5kIHN1Ym1pdCBmaWVsZHMga2V5cy5cbiAgICAgIGNvbnN0IG5vdEZvdW5kRmllbGRzID0gZGlmZmVyZW5jZShmaWVsZHNTbHVncywgcmVzb3VyY2VGaWVsZHNLZXlzKTtcblxuICAgICAgLy8gVmFsaWRhdGUgbm90IGZvdW5kIHJlc291cmNlIGZpZWxkcyBrZXlzLlxuICAgICAgaWYgKG5vdEZvdW5kRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdSRVNPVVJDRV9GSUVMRFNfTk9UX0VYSVNUJywgY29kZTogMTAwLCBmaWVsZHM6IG5vdEZvdW5kRmllbGRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0b3JlZCByZXNvdXJjZSBmaWVsZHMgYW5kIHRoZSBzdWJtaXQgY29sdW1ucyBrZXlzLlxuICAgICAgY29uc3Qgbm90Rm91bmRDb2x1bW5zID0gZGlmZmVyZW5jZShjb2x1bW5zS2V5cywgcmVzb3VyY2VGaWVsZHNLZXlzKTtcblxuICAgICAgLy8gVmFsaWRhdGUgbm90IGZvdW5kIHZpZXcgY29sdW1ucy5cbiAgICAgIGlmIChub3RGb3VuZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdSRVNPVVJDRV9DT0xVTU5TX05PVF9FWElTVCcsIGNvZGU6IDIwMCwgY29sdW1uczogbm90Rm91bmRDb2x1bW5zIH0pO1xuICAgICAgfVxuICAgICAgLy8gVmFsaWRhdGVzIHRoZSB2aWV3IGNvbmRpdGlvbmFsIGxvZ2ljIGV4cHJlc3Npb24uXG4gICAgICBpZiAoIXZhbGlkYXRlVmlld1JvbGVzKGZvcm0ucm9sZXMsIGZvcm0ubG9naWNfZXhwcmVzc2lvbikpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnVklFVy5ST0xFUy5MT0dJQy5FWFBSRVNTSU9OLklOVkFMSUQnLCBjb2RlOiA0MDAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpZXdSb2xlc0lkcyA9IHZpZXcucm9sZXMubWFwKChyKSA9PiByLmlkKTtcbiAgICAgIGNvbnN0IHZpZXdDb2x1bW5zSWRzID0gdmlldy5jb2x1bW5zLm1hcCgoYykgPT4gYy5pZCk7XG5cbiAgICAgIGNvbnN0IGZvcm1VcGRhdGVkUm9sZXMgPSBmb3JtLnJvbGVzLmZpbHRlcigocikgPT4gci5pZCk7XG4gICAgICBjb25zdCBmb3JtSW5zZXJ0Um9sZXMgPSBmb3JtLnJvbGVzLmZpbHRlcigocikgPT4gIXIuaWQpO1xuXG4gICAgICBjb25zdCBmb3JtUm9sZXNJZHMgPSBmb3JtVXBkYXRlZFJvbGVzLm1hcCgocikgPT4gci5pZCk7XG5cbiAgICAgIGNvbnN0IGZvcm1VcGRhdGVkQ29sdW1ucyA9IGZvcm0uY29sdW1ucy5maWx0ZXIoKHIpID0+IHIuaWQpO1xuICAgICAgY29uc3QgZm9ybUluc2VydGVkQ29sdW1ucyA9IGZvcm0uY29sdW1ucy5maWx0ZXIoKHIpID0+ICFyLmlkKTtcbiAgICAgIGNvbnN0IGZvcm1Db2x1bW5zSWRzID0gZm9ybVVwZGF0ZWRDb2x1bW5zLm1hcCgocikgPT4gci5pZCk7XG5cbiAgICAgIGNvbnN0IHJvbGVzSWRzU2hvdWxkRGVsZXRlZCA9IGRpZmZlcmVuY2Uodmlld1JvbGVzSWRzLCBmb3JtUm9sZXNJZHMpO1xuICAgICAgY29uc3QgY29sdW1uc0lkc1Nob3VsZERlbGV0ZSA9IGRpZmZlcmVuY2Uodmlld0NvbHVtbnNJZHMsIGZvcm1Db2x1bW5zSWRzKTtcblxuICAgICAgY29uc3Qgbm90Rm91bmRWaWV3Um9sZXNJZHMgPSBkaWZmZXJlbmNlKGZvcm1Sb2xlc0lkcywgdmlld1JvbGVzSWRzKTtcbiAgICAgIGNvbnN0IG5vdEZvdW5kVmlld0NvbHVtbnNJZHMgPSBkaWZmZXJlbmNlKHZpZXdDb2x1bW5zSWRzLCB2aWV3Q29sdW1uc0lkcyk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBub3QgZm91bmQgdmlldyByb2xlcyBpZHMuXG4gICAgICBpZiAobm90Rm91bmRWaWV3Um9sZXNJZHMubGVuZ3RoKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuUk9MRVMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDUwMCwgaWRzOiBub3RGb3VuZFZpZXdSb2xlc0lkcyB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBub3QgZm91bmQgdmlldyBjb2x1bW5zIGlkcy5cbiAgICAgIGlmIChub3RGb3VuZFZpZXdDb2x1bW5zSWRzLmxlbmd0aCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdWSUVXLkNPTFVNTlMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDYwMCwgaWRzOiBub3RGb3VuZFZpZXdDb2x1bW5zSWRzIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYXN5bmNPcGVycyA9IFtdO1xuXG4gICAgICAvLyBTYXZlIHZpZXcgZGV0YWlscy5cbiAgICAgIGF3YWl0IFZpZXcucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdmlldy5pZClcbiAgICAgICAgLnBhdGNoKHtcbiAgICAgICAgICBuYW1lOiBmb3JtLm5hbWUsXG4gICAgICAgICAgcm9sZXNfbG9naWNfZXhwcmVzc2lvbjogZm9ybS5sb2dpY19leHByZXNzaW9uLFxuICAgICAgICB9KTtcblxuICAgICAgLy8gVXBkYXRlIHZpZXcgcm9sZXMuXG4gICAgICBpZiAoZm9ybVVwZGF0ZWRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvcm1VcGRhdGVkUm9sZXMuZm9yRWFjaCgocm9sZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpZWxkTW9kZWwgPSByZXNvdXJjZUZpZWxkc0tleXNNYXAuZ2V0KHJvbGUuZmllbGRfa2V5KTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVPcGVyID0gVmlld1JvbGUucXVlcnkoKVxuICAgICAgICAgICAgLndoZXJlKCdpZCcsIHJvbGUuaWQpXG4gICAgICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICAgICAgLi4ucGljayhyb2xlLCBbJ2NvbXBhcmF0b3InLCAndmFsdWUnLCAnaW5kZXgnXSksXG4gICAgICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgYXN5bmNPcGVycy5wdXNoKHVwZGF0ZU9wZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIEluc2VydCBhIG5ldyB2aWV3IHJvbGVzLlxuICAgICAgaWYgKGZvcm1JbnNlcnRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvcm1JbnNlcnRSb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmllbGRNb2RlbCA9IHJlc291cmNlRmllbGRzS2V5c01hcC5nZXQocm9sZS5maWVsZF9rZXkpO1xuICAgICAgICAgIGNvbnN0IGluc2VydE9wZXIgPSBWaWV3Um9sZS5xdWVyeSgpXG4gICAgICAgICAgICAuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgLi4ucGljayhyb2xlLCBbJ2NvbXBhcmF0b3InLCAndmFsdWUnLCAnaW5kZXgnXSksXG4gICAgICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgICAgICB2aWV3X2lkOiB2aWV3LmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgYXN5bmNPcGVycy5wdXNoKGluc2VydE9wZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIERlbGV0ZSB2aWV3IHJvbGVzLlxuICAgICAgaWYgKHJvbGVzSWRzU2hvdWxkRGVsZXRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZU9wZXIgPSBWaWV3Um9sZS5xdWVyeSgpXG4gICAgICAgICAgLndoZXJlSW4oJ2lkJywgcm9sZXNJZHNTaG91bGREZWxldGVkKVxuICAgICAgICAgIC5kZWxldGUoKTtcbiAgICAgICAgYXN5bmNPcGVycy5wdXNoKGRlbGV0ZU9wZXIpO1xuICAgICAgfVxuICAgICAgLy8gSW5zZXJ0IGEgbmV3IHZpZXcgY29sdW1ucyB0byB0aGUgc3RvcmFnZS5cbiAgICAgIGlmIChmb3JtSW5zZXJ0ZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9ybUluc2VydGVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICBjb25zdCBmaWVsZE1vZGVsID0gcmVzb3VyY2VGaWVsZHNLZXlzTWFwLmdldChjb2x1bW4ua2V5KTtcbiAgICAgICAgICBjb25zdCBpbnNlcnRPcGVyID0gVmlld0NvbHVtbi5xdWVyeSgpXG4gICAgICAgICAgICAuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgZmllbGRfaWQ6IGZpZWxkTW9kZWwuaWQsXG4gICAgICAgICAgICAgIGluZGV4OiBjb2x1bW4uaW5kZXgsXG4gICAgICAgICAgICAgIHZpZXdfaWQ6IHZpZXcuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBhc3luY09wZXJzLnB1c2goaW5zZXJ0T3Blcik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gVXBkYXRlIHRoZSB2aWV3IGNvbHVtbnMgb24gdGhlIHN0b3JhZ2UuXG4gICAgICBpZiAoZm9ybVVwZGF0ZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9ybVVwZGF0ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZU9wZXIgPSBWaWV3Q29sdW1uLnF1ZXJ5KClcbiAgICAgICAgICAgIC53aGVyZSgnaWQnLCBjb2x1bW4uaWQpXG4gICAgICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICAgICAgaW5kZXg6IGNvbHVtbi5pbmRleCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGFzeW5jT3BlcnMucHVzaCh1cGRhdGVPcGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgdGhlIHZpZXcgY29sdW1ucyBmcm9tIHRoZSBzdG9yYWdlLlxuICAgICAgaWYgKGNvbHVtbnNJZHNTaG91bGREZWxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBkZWxldGVPcGVyID0gVmlld0NvbHVtbi5xdWVyeSgpXG4gICAgICAgICAgLndoZXJlSW4oJ2lkJywgY29sdW1uc0lkc1Nob3VsZERlbGV0ZSlcbiAgICAgICAgICAuZGVsZXRlKCk7XG4gICAgICAgIGFzeW5jT3BlcnMucHVzaChkZWxldGVPcGVyKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFzeW5jT3BlcnMpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoKTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSByZXNvdXJjZSBjb2x1bW5zIHRoYXQgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gY3VzdG9tIHZpZXcuXG4gICAqL1xuICBnZXRWaWV3UmVzb3VyY2U6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndmlld19pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IHZpZXdfaWQ6IHZpZXdJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgVmlldyB9ID0gcmVxLm1vZGVscztcbiAgICAgIFxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdmlld0lkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgncmVzb3VyY2UuZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdmlldykge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1ZJRVcuTk9ULkZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghdmlldy5yZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVklFVy5IQVMuTk9ULkFTU09DSUFURUQuUkVTT1VSQ0UnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNvdXJjZUNvbHVtbnMgPSB2aWV3LnJlc291cmNlLmZpZWxkc1xuICAgICAgICAuZmlsdGVyKChmaWVsZCkgPT4gZmllbGQuY29sdW1uYWJsZSlcbiAgICAgICAgLm1hcCgoZmllbGQpID0+ICh7XG4gICAgICAgICAgaWQ6IGZpZWxkLmlkLFxuICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbE5hbWUsXG4gICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgcmVzb3VyY2Vfc2x1Zzogdmlldy5yZXNvdXJjZS5uYW1lLFxuICAgICAgICByZXNvdXJjZV9jb2x1bW5zOiByZXNvdXJjZUNvbHVtbnMsXG4gICAgICAgIHJlc291cmNlX2ZpZWxkczogdmlldy5yZXNvdXJjZS5maWVsZHMsXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG59O1xuIiwiLy8gaW1wb3J0IE9BdXRoMiBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvT0F1dGgyJztcbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IEF1dGhlbnRpY2F0aW9uIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BdXRoZW50aWNhdGlvbic7XG5pbXBvcnQgSW52aXRlVXNlcnMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0ludml0ZVVzZXJzJztcbmltcG9ydCBVc2VycyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvVXNlcnMnO1xuLy8gaW1wb3J0IFJvbGVzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9Sb2xlcyc7XG5pbXBvcnQgSXRlbXMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0l0ZW1zJztcbmltcG9ydCBJdGVtQ2F0ZWdvcmllcyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvSXRlbUNhdGVnb3JpZXMnO1xuaW1wb3J0IEFjY291bnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BY2NvdW50cyc7XG5pbXBvcnQgQWNjb3VudFR5cGVzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BY2NvdW50VHlwZXMnO1xuLy8gaW1wb3J0IEFjY291bnRPcGVuaW5nQmFsYW5jZSBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvQWNjb3VudE9wZW5pbmdCYWxhbmNlJztcbmltcG9ydCBWaWV3cyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvVmlld3MnO1xuLy8gaW1wb3J0IEN1c3RvbUZpZWxkcyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvRmllbGRzJztcbmltcG9ydCBBY2NvdW50aW5nIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BY2NvdW50aW5nJztcbmltcG9ydCBGaW5hbmNpYWxTdGF0ZW1lbnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9GaW5hbmNpYWxTdGF0ZW1lbnRzJztcbmltcG9ydCBFeHBlbnNlcyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvRXhwZW5zZXMnO1xuaW1wb3J0IE9wdGlvbnMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL09wdGlvbnMnO1xuLy8gaW1wb3J0IEJ1ZGdldCBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvQnVkZ2V0Jztcbi8vIGltcG9ydCBCdWRnZXRSZXBvcnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9CdWRnZXRSZXBvcnRzJztcbmltcG9ydCBDdXJyZW5jaWVzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9DdXJyZW5jaWVzJztcbmltcG9ydCBDdXN0b21lcnMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0N1c3RvbWVycyc7XG5pbXBvcnQgVmVuZG9ycyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvVmVuZG9ycyc7XG4vLyBpbXBvcnQgU3VwcGxpZXJzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9TdXBwbGllcnMnO1xuLy8gaW1wb3J0IEJpbGxzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9CaWxscyc7XG4vLyBpbXBvcnQgQ3VycmVuY3lBZGp1c3RtZW50IGZyb20gJy4vY29udHJvbGxlcnMvQ3VycmVuY3lBZGp1c3RtZW50JztcbmltcG9ydCBSZXNvdXJjZXMgZnJvbSAnLi9jb250cm9sbGVycy9SZXNvdXJjZXMnO1xuaW1wb3J0IEV4Y2hhbmdlUmF0ZXMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0V4Y2hhbmdlUmF0ZXMnO1xuLy8gaW1wb3J0IFNhbGVzUmVwb3J0cyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvU2FsZXNSZXBvcnRzJztcbi8vIGltcG9ydCBQdXJjaGFzZXNSZXBvcnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9QdXJjaGFzZXNSZXBvcnRzJztcbmltcG9ydCBNZWRpYSBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvTWVkaWEnO1xuaW1wb3J0IEpXVEF1dGggZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvand0QXV0aCc7XG5pbXBvcnQgVGVuYW5jeU1pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvVGVuYW5jeU1pZGRsZXdhcmUnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IChhcHApID0+IHtcbiAgLy8gYXBwLnVzZSgnL2FwaS9vYXV0aDInLCBPQXV0aDIucm91dGVyKCkpO1xuICBhcHAudXNlKCcvYXBpL2F1dGgnLCBBdXRoZW50aWNhdGlvbi5yb3V0ZXIoKSk7XG4gIGFwcC51c2UoJy9hcGkvaW52aXRlJywgSW52aXRlVXNlcnMucm91dGVyKCkpO1xuXG4gIGNvbnN0IGRhc2hib2FyZCA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgZGFzaGJvYXJkLnVzZShKV1RBdXRoKTtcbiAgZGFzaGJvYXJkLnVzZShUZW5hbmN5TWlkZGxld2FyZSk7XG5cbiAgZGFzaGJvYXJkLnVzZSgnL2FwaS9jdXJyZW5jaWVzJywgQ3VycmVuY2llcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvdXNlcnMnLCBVc2Vycy5yb3V0ZXIoKSk7XG4gIC8vIGFwcC51c2UoJy9hcGkvcm9sZXMnLCBSb2xlcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvYWNjb3VudHMnLCBBY2NvdW50cy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvYWNjb3VudF90eXBlcycsIEFjY291bnRUeXBlcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvYWNjb3VudGluZycsIEFjY291bnRpbmcucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2FjY291bnRzX29wZW5pbmdfYmFsYW5jZXMnLCBBY2NvdW50T3BlbmluZ0JhbGFuY2Uucm91dGVyKCkpO1xuICBkYXNoYm9hcmQudXNlKCcvYXBpL3ZpZXdzJywgVmlld3Mucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2ZpZWxkcycsIEN1c3RvbUZpZWxkcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvaXRlbXMnLCBJdGVtcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvaXRlbV9jYXRlZ29yaWVzJywgSXRlbUNhdGVnb3JpZXMucm91dGVyKCkpO1xuICBkYXNoYm9hcmQudXNlKCcvYXBpL2V4cGVuc2VzJywgRXhwZW5zZXMucm91dGVyKCkpO1xuICBkYXNoYm9hcmQudXNlKCcvYXBpL2ZpbmFuY2lhbF9zdGF0ZW1lbnRzJywgRmluYW5jaWFsU3RhdGVtZW50cy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvb3B0aW9ucycsIE9wdGlvbnMucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2J1ZGdldF9yZXBvcnRzJywgQnVkZ2V0UmVwb3J0cy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvY3VzdG9tZXJzJywgQ3VzdG9tZXJzLnJvdXRlcigpKTtcbiAgZGFzaGJvYXJkLnVzZSgnL2FwaS92ZW5kb3JzJywgVmVuZG9ycy5yb3V0ZXIoKSk7XG4gIC8vIGFwcC51c2UoJy9hcGkvc3VwcGxpZXJzJywgU3VwcGxpZXJzLnJvdXRlcigpKTtcbiAgLy8gYXBwLnVzZSgnL2FwaS9iaWxscycsIEJpbGxzLnJvdXRlcigpKTtcbiAgLy8gYXBwLnVzZSgnL2FwaS9idWRnZXQnLCBCdWRnZXQucm91dGVyKCkpO1xuICBkYXNoYm9hcmQudXNlKCcvYXBpL3Jlc291cmNlcycsIFJlc291cmNlcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvZXhjaGFuZ2VfcmF0ZXMnLCBFeGNoYW5nZVJhdGVzLnJvdXRlcigpKTtcbiAgZGFzaGJvYXJkLnVzZSgnL2FwaS9tZWRpYScsIE1lZGlhLnJvdXRlcigpKTtcblxuICBhcHAudXNlKCcvJywgZGFzaGJvYXJkKTsgIFxuICAvLyBhcHAudXNlKCcvYXBpL2N1cnJlbmN5X2FkanVzdG1lbnQnLCBDdXJyZW5jeUFkanVzdG1lbnQucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL3JlcG9ydHMvc2FsZXMnLCBTYWxlc1JlcG9ydHMucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL3JlcG9ydHMvcHVyY2hhc2VzJywgUHVyY2hhc2VzUmVwb3J0cy5yb3V0ZXIoKSk7XG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IFRlbmFudHNNYW5hZ2VyIGZyb20gJ0Avc3lzdGVtL1RlbmFudHNNYW5hZ2VyJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmZ1bmN0aW9uIGxvYWRNb2RlbHNGcm9tRGlyZWN0b3J5KCkge1xuICBjb25zdCBtb2RlbHMgPSB7fTtcbiAgZnMucmVhZGRpclN5bmMoJ3NyYy9tb2RlbHMvJykuZm9yRWFjaCgoZmlsZW5hbWUpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHtcbiAgICAgIHBhdGg6IHBhdGguam9pbihfX2Rpcm5hbWUsICdzcmMvbW9kZWxzLycsIGZpbGVuYW1lKSxcbiAgICAgIG5hbWU6IGZpbGVuYW1lLnJlcGxhY2UoL1xcLlteLy5dKyQvLCAnJyksXG4gICAgfTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBtb2RlbC5yZXNvdXJjZSA9IHJlcXVpcmUoYEAvbW9kZWxzLyR7bW9kZWwubmFtZX1gKTtcbiAgICBtb2RlbHNbbW9kZWwubmFtZV0gPSBtb2RlbDtcbiAgfSk7XG4gIHJldHVybiBtb2RlbHM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICBjb25zdCBvcmdhbml6YXRpb25JZCA9IHJlcS5oZWFkZXJzWydvcmdhbml6YXRpb24taWQnXSB8fCByZXEucXVlcnkub3JnYW5pemF0aW9uO1xuICBjb25zdCBub3RGb3VuZE9yZ2FuaXphdGlvbiA9ICgpID0+IHJlcy5ib29tLnVuYXV0aG9yaXplZChcbiAgICAnT3JnYW5pemF0aW9uIGlkZW50aWNhdGlvbiBub3QgZm91bmQuJyxcbiAgICB7IGVycm9yczogW3sgdHlwZTogJ09SR0FOSVpBVElPTi5JRC5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0gfSxcbiAgKTtcblxuICBpZiAoIW9yZ2FuaXphdGlvbklkKSB7XG4gICAgcmV0dXJuIG5vdEZvdW5kT3JnYW5pemF0aW9uKCk7XG4gIH1cbiAgY29uc3QgdGVuYW50ID0gYXdhaXQgVGVuYW50c01hbmFnZXIuZ2V0VGVuYW50KG9yZ2FuaXphdGlvbklkKTtcblxuICAvLyBXaGVuIHRoZSBnaXZlbiBvcmdhbml6YXRpb24gaWQgbm90IGZvdW5kIG9uIHRoZSBzeXN0ZW0gc3RvcmFnZS5cbiAgaWYgKCF0ZW5hbnQpIHtcbiAgICByZXR1cm4gbm90Rm91bmRPcmdhbml6YXRpb24oKTtcbiAgfVxuICAvLyBXaGVuIHVzZXIgdGVuYW50IG5vdCBtYXRjaCB0aGUgZ2l2ZW4gb3JnYW5pemF0aW9uIGlkLlxuICBpZiAodGVuYW50LmlkICE9PSByZXEudXNlci50ZW5hbnRJZCkge1xuICAgIHJldHVybiByZXMuYm9vbS51bmF1dGhvcml6ZWQoKTtcbiAgfVxuICBjb25zdCBrbmV4ID0gVGVuYW50c01hbmFnZXIua25leEluc3RhbmNlKG9yZ2FuaXphdGlvbklkKTtcbiAgY29uc3QgbW9kZWxzID0gbG9hZE1vZGVsc0Zyb21EaXJlY3RvcnkoKTtcblxuICBUZW5hbnRNb2RlbC5rbmV4QmluZGVkID0ga25leDtcblxuICByZXEua25leCA9IGtuZXg7XG4gIHJlcS5vcmdhbml6YXRpb25JZCA9IG9yZ2FuaXphdGlvbklkO1xuICByZXEubW9kZWxzID0ge1xuICAgIC4uLk9iamVjdC52YWx1ZXMobW9kZWxzKS5yZWR1Y2UoKGFjYywgbW9kZWwpID0+IHsgICAgICBcbiAgICAgIGlmICh0eXBlb2YgbW9kZWwucmVzb3VyY2UuZGVmYXVsdC5yZXF1ZXN0TW9kZWwgPT09ICdmdW5jdGlvbicgJiYgXG4gICAgICAgIG1vZGVsLnJlc291cmNlLmRlZmF1bHQucmVxdWVzdE1vZGVsKCkgJiZcbiAgICAgICAgbW9kZWwubmFtZSAhPT0gJ1RlbmFudE1vZGVsJykge1xuICAgICAgICBhY2NbbW9kZWwubmFtZV0gPSBtb2RlbC5yZXNvdXJjZS5kZWZhdWx0LmJpbmRLbmV4KGtuZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSksXG4gIH07XG4gIG5leHQoKTtcbn07IiwiY29uc3QgYXN5bmNNaWRkbGV3YXJlID0gKGZuKSA9PiAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgUHJvbWlzZS5yZXNvbHZlKGZuKHJlcSwgcmVzLCBuZXh0KSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICBuZXh0KGVycm9yKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jTWlkZGxld2FyZTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIGNvbnNpc3RlbnQtcmV0dXJuICovXG5pbXBvcnQgand0IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgU3lzdGVtVXNlciBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtVXNlcic7XG5cbmNvbnN0IGF1dGhNaWRkbGV3YXJlID0gKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gIGNvbnN0IHsgSldUX1NFQ1JFVF9LRVkgfSA9IHByb2Nlc3MuZW52O1xuICBjb25zdCB0b2tlbiA9IHJlcS5oZWFkZXJzWyd4LWFjY2Vzcy10b2tlbiddIHx8IHJlcS5xdWVyeS50b2tlbjtcblxuICBjb25zdCBvbkVycm9yID0gKCkgPT4geyByZXMuYm9vbS51bmF1dGhvcml6ZWQoKTsgfTtcblxuICBpZiAoIXRva2VuKSB7IHJldHVybiBvbkVycm9yKCk7IH1cblxuICBjb25zdCB2ZXJpZnkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgand0LnZlcmlmeSh0b2tlbiwgSldUX1NFQ1JFVF9LRVksIGFzeW5jIChlcnJvciwgZGVjb2RlZCkgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICAgICAgcmVxLnVzZXIgPSBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KCkuZmluZEJ5SWQoZGVjb2RlZC5faWQpO1xuXG4gICAgICAgIGlmICghcmVxLnVzZXIpIHtcbiAgICAgICAgICByZXR1cm4gb25FcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGVjb2RlZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHZlcmlmeS50aGVuKCgpID0+IHsgbmV4dCgpOyB9KS5jYXRjaChvbkVycm9yKTtcbn07XG5leHBvcnQgZGVmYXVsdCBhdXRoTWlkZGxld2FyZTtcbiIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSAnQC9tb2RlbHMvTW9kZWwnO1xuaW1wb3J0IENhY2hlU2VydmljZSBmcm9tICdAL3NlcnZpY2VzL0NhY2hlJztcblxuZXhwb3J0IGRlZmF1bHQgKE1vZGVsKSA9PiB7XG4gIHJldHVybiBjbGFzcyBDYWNoYWJsZU1vZGVsIGV4dGVuZHMgTW9kZWx7XG4gICAgc3RhdGljIGZsdXNoQ2FjaGUoa2V5KSB7XG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSB0aGlzLm5hbWU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgQ2FjaGVTZXJ2aWNlLmRlbChgJHttb2RlbE5hbWV9LiR7a2V5fWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ2FjaGVTZXJ2aWNlLmRlbFN0YXJ0V2l0aChtb2RlbE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn0gIiwiaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBDYWNoZVNlcnZpY2UgZnJvbSAnQC9zZXJ2aWNlcy9DYWNoZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhY2hhYmxlUXVlcnlCdWlsZGVyIGV4dGVuZHMgUXVlcnlCdWlsZGVye1xuXG4gIGFzeW5jIHRoZW4oLi4uYXJncykge1xuICAgIC8vIEZsdXNoIG1vZGVsIGNhY2hlIGFmdGVyIGluc2VydCwgZGVsZXRlIG9yIHVwZGF0ZSB0cmFuc2FjdGlvbi5cbiAgICBpZiAodGhpcy5pc0luc2VydCgpIHx8IHRoaXMuaXNEZWxldGUoKSB8fCB0aGlzLmlzVXBkYXRlKCkpIHtcbiAgICAgIHRoaXMubW9kZWxDbGFzcygpLmZsdXNoQ2FjaGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FjaGVUYWcgJiYgdGhpcy5pc0ZpbmQoKSkge1xuICAgICAgdGhpcy5zZXRDYWNoZUtleSgpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JTdG9yZUNhY2hlKCkudGhlbiguLi5hcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuZXhlY3V0ZSgpO1xuICAgIFxuICAgICAgcmV0dXJuIHByb21pc2UudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0Q2FjaGUocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pLnRoZW4oLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3JTdG9yZUNhY2hlKCkge1xuICAgIGNvbnN0IHN0b3JlRnVuY3Rpb24gPSAoKSA9PiB0aGlzLmV4ZWN1dGUoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBDYWNoZVNlcnZpY2UuZ2V0KHRoaXMuY2FjaGVLZXksIHN0b3JlRnVuY3Rpb24pXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHsgcmVzb2x2ZShyZXN1bHQpOyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldENhY2hlKHJlc3VsdHMpIHtcbiAgICBDYWNoZVNlcnZpY2Uuc2V0KGAke3RoaXMuY2FjaGVLZXl9YCwgcmVzdWx0cywgdGhpcy5jYWNoZVNlY29uZHMpO1xuICB9XG5cbiAgZ2VuZXJhdGVDYWNoZUtleSgpIHtcbiAgICBjb25zdCBrbmV4U3FsID0gdGhpcy50b0tuZXhRdWVyeSgpLnRvU1FMKCk7XG4gICAgY29uc3QgaGFzaGVkUXVlcnkgPSBjcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKGtuZXhTcWwuc3FsKS5kaWdlc3QoXCJoZXhcIik7XG5cbiAgICByZXR1cm4gaGFzaGVkUXVlcnk7XG4gIH1cblxuICByZW1lbWJlcihrZXksIHNlY29uZHMpIHtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSB0aGlzLm1vZGVsQ2xhc3MoKS5uYW1lO1xuXG4gICAgdGhpcy5jYWNoZVNlY29uZHMgPSBzZWNvbmRzO1xuICAgIHRoaXMuY2FjaGVUYWcgPSAoa2V5KSA/IGAke21vZGVsTmFtZX0uJHtrZXl9YCA6IG1vZGVsTmFtZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2l0aEdyYXBoRmV0Y2hlZChyZWxhdGlvbiwgc2V0dGluZ3MpIHtcbiAgICBpZiAoIXRoaXMuZ3JhcGhBcHBlbmRzKSB7XG4gICAgICB0aGlzLmdyYXBoQXBwZW5kcyA9IFtyZWxhdGlvbl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ3JhcGhBcHBlbmRzLnB1c2gocmVsYXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIud2l0aEdyYXBoRmV0Y2hlZChyZWxhdGlvbiwgc2V0dGluZ3MpO1xuICB9XG5cbiAgc2V0Q2FjaGVLZXkoKSB7XG4gICAgY29uc3QgaGFzaGVkUXVlcnkgPSB0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoKTtcbiAgICBjb25zdCBhcHBlbmRzID0gKHRoaXMuZ3JhcGhBcHBlbmRzIHx8IFtdKS5qb2luKHRoaXMuZ3JhcGhBcHBlbmRzLCAnLCcpO1xuXG4gICAgdGhpcy5jYWNoZUtleSA9IGAke3RoaXMuY2FjaGVUYWd9LiR7aGFzaGVkUXVlcnl9LiR7YXBwZW5kc31gO1xuICB9XG59IiwiLyoqXG4gKiBBIHNpbXBsZSBkZXBlbmRlbmN5IGdyYXBoXG4gKi9cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGNyZWF0aW5nIGEgVG9wb2xvZ2ljYWwgU29ydCB1c2luZyBEZXB0aC1GaXJzdC1TZWFyY2ggb24gYSBzZXQgb2YgZWRnZXMuXG4gKlxuICogRGV0ZWN0cyBjeWNsZXMgYW5kIHRocm93cyBhbiBFcnJvciBpZiBvbmUgaXMgZGV0ZWN0ZWQgKHVubGVzcyB0aGUgXCJjaXJjdWxhclwiXG4gKiBwYXJhbWV0ZXIgaXMgXCJ0cnVlXCIgaW4gd2hpY2ggY2FzZSBpdCBpZ25vcmVzIHRoZW0pLlxuICpcbiAqIEBwYXJhbSBlZGdlcyBUaGUgc2V0IG9mIGVkZ2VzIHRvIERGUyB0aHJvdWdoXG4gKiBAcGFyYW0gbGVhdmVzT25seSBXaGV0aGVyIHRvIG9ubHkgcmV0dXJuIFwibGVhZlwiIG5vZGVzIChvbmVzIHdobyBoYXZlIG5vIGVkZ2VzKVxuICogQHBhcmFtIHJlc3VsdCBBbiBhcnJheSBpbiB3aGljaCB0aGUgcmVzdWx0cyB3aWxsIGJlIHBvcHVsYXRlZFxuICogQHBhcmFtIGNpcmN1bGFyIEEgYm9vbGVhbiB0byBhbGxvdyBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlREZTKGVkZ2VzLCBsZWF2ZXNPbmx5LCByZXN1bHQsIGNpcmN1bGFyKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHJldHVybiBmdW5jdGlvbihzdGFydCkge1xuICAgIGlmICh2aXNpdGVkW3N0YXJ0XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5DdXJyZW50UGF0aCA9IHt9O1xuICAgIHZhciBjdXJyZW50UGF0aCA9IFtdO1xuICAgIHZhciB0b2RvID0gW107IC8vIHVzZWQgYXMgYSBzdGFja1xuICAgIHRvZG8ucHVzaCh7IG5vZGU6IHN0YXJ0LCBwcm9jZXNzZWQ6IGZhbHNlIH0pO1xuICAgIHdoaWxlICh0b2RvLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdG9kb1t0b2RvLmxlbmd0aCAtIDFdOyAvLyBwZWVrIGF0IHRoZSB0b2RvIHN0YWNrXG4gICAgICB2YXIgcHJvY2Vzc2VkID0gY3VycmVudC5wcm9jZXNzZWQ7XG4gICAgICB2YXIgbm9kZSA9IGN1cnJlbnQubm9kZTtcbiAgICAgIGlmICghcHJvY2Vzc2VkKSB7XG4gICAgICAgIC8vIEhhdmVuJ3QgdmlzaXRlZCBlZGdlcyB5ZXQgKHZpc2l0aW5nIHBoYXNlKVxuICAgICAgICBpZiAodmlzaXRlZFtub2RlXSkge1xuICAgICAgICAgIHRvZG8ucG9wKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5DdXJyZW50UGF0aFtub2RlXSkge1xuICAgICAgICAgIC8vIEl0J3Mgbm90IGEgREFHXG4gICAgICAgICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICAgICAgICB0b2RvLnBvcCgpO1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgdG9sZXJhdGluZyBjeWNsZXMsIGRvbid0IHJldmlzaXQgdGhlIG5vZGVcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICAgIHRocm93IG5ldyBEZXBHcmFwaEN5Y2xlRXJyb3IoY3VycmVudFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5DdXJyZW50UGF0aFtub2RlXSA9IHRydWU7XG4gICAgICAgIGN1cnJlbnRQYXRoLnB1c2gobm9kZSk7XG4gICAgICAgIHZhciBub2RlRWRnZXMgPSBlZGdlc1tub2RlXTtcbiAgICAgICAgLy8gKHB1c2ggZWRnZXMgb250byB0aGUgdG9kbyBzdGFjayBpbiByZXZlcnNlIG9yZGVyIHRvIGJlIG9yZGVyLWNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIERGUyBpbXBsZW1lbnRhdGlvbilcbiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVFZGdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRvZG8ucHVzaCh7IG5vZGU6IG5vZGVFZGdlc1tpXSwgcHJvY2Vzc2VkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnByb2Nlc3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYXZlIHZpc2l0ZWQgZWRnZXMgKHN0YWNrIHVucm9sbGluZyBwaGFzZSlcbiAgICAgICAgdG9kby5wb3AoKTtcbiAgICAgICAgY3VycmVudFBhdGgucG9wKCk7XG4gICAgICAgIGluQ3VycmVudFBhdGhbbm9kZV0gPSBmYWxzZTtcbiAgICAgICAgdmlzaXRlZFtub2RlXSA9IHRydWU7XG4gICAgICAgIGlmICghbGVhdmVzT25seSB8fCBlZGdlc1tub2RlXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgRGVwZW5kZW5jeSBHcmFwaFxuICovXG52YXIgRGVwR3JhcGggPSAoRGVwR3JhcGggPSBmdW5jdGlvbiBEZXBHcmFwaChvcHRzKSB7XG4gIHRoaXMubm9kZXMgPSB7fTsgLy8gTm9kZSAtPiBOb2RlL0RhdGEgKHRyZWF0ZWQgbGlrZSBhIFNldClcbiAgdGhpcy5vdXRnb2luZ0VkZ2VzID0ge307IC8vIE5vZGUgLT4gW0RlcGVuZGVuY3kgTm9kZV1cbiAgdGhpcy5pbmNvbWluZ0VkZ2VzID0ge307IC8vIE5vZGUgLT4gW0RlcGVuZGFudCBOb2RlXVxuICB0aGlzLmNpcmN1bGFyID0gb3B0cyAmJiAhIW9wdHMuY2lyY3VsYXI7IC8vIEFsbG93cyBjaXJjdWxhciBkZXBzXG59KTtcblxuRGVwR3JhcGguZnJvbUFycmF5ID0gKGl0ZW1zLCBvcHRpb25zID0geyBpdGVtSWQ6ICdpZCcsIHBhcmVudEl0ZW1JZDogJ3BhcmVudF9pZCcgfSkgPT4ge1xuIGNvbnN0IGRlcEdyYXBoID0gbmV3IERlcEdyYXBoKCk7XG5cbiBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICBkZXBHcmFwaC5hZGROb2RlKGl0ZW1bb3B0aW9ucy5pdGVtSWRdLCBpdGVtKTtcbiB9KTtcbiBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gIGlmIChpdGVtW29wdGlvbnMucGFyZW50SXRlbUlkXSkge1xuICAgIGRlcEdyYXBoLmFkZERlcGVuZGVuY3koaXRlbVtvcHRpb25zLnBhcmVudEl0ZW1JZF0sIGl0ZW1bb3B0aW9ucy5pdGVtSWRdKTtcbiAgfVxuIH0pO1xuIHJldHVybiBkZXBHcmFwaDtcbn1cblxuRGVwR3JhcGgucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBzaXplOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5ub2RlcykubGVuZ3RoO1xuICB9LFxuICAvKipcbiAgICogQWRkIGEgbm9kZSB0byB0aGUgZGVwZW5kZW5jeSBncmFwaC4gSWYgYSBub2RlIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuXG4gICAqL1xuICBhZGROb2RlOiBmdW5jdGlvbihub2RlLCBkYXRhKSB7XG4gICAgaWYgKCF0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIC8vIENoZWNraW5nIHRoZSBhcmd1bWVudHMgbGVuZ3RoIGFsbG93cyB0aGUgdXNlciB0byBhZGQgYSBub2RlIHdpdGggdW5kZWZpbmVkIGRhdGFcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IG5vZGU7XG4gICAgICB9XG4gICAgICB0aGlzLm91dGdvaW5nRWRnZXNbbm9kZV0gPSBbXTtcbiAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXSA9IFtdO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZSBhIG5vZGUgZnJvbSB0aGUgZGVwZW5kZW5jeSBncmFwaC4gSWYgYSBub2RlIGRvZXMgbm90IGV4aXN0LCB0aGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuXG4gICAqL1xuICByZW1vdmVOb2RlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgZGVsZXRlIHRoaXMubm9kZXNbbm9kZV07XG4gICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdO1xuICAgICAgZGVsZXRlIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXTtcbiAgICAgIFt0aGlzLmluY29taW5nRWRnZXMsIHRoaXMub3V0Z29pbmdFZGdlc10uZm9yRWFjaChmdW5jdGlvbihlZGdlTGlzdCkge1xuICAgICAgICBPYmplY3Qua2V5cyhlZGdlTGlzdCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICB2YXIgaWR4ID0gZWRnZUxpc3Rba2V5XS5pbmRleE9mKG5vZGUpO1xuICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgZWRnZUxpc3Rba2V5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBub2RlIGV4aXN0cyBpbiB0aGUgZ3JhcGhcbiAgICovXG4gIGhhc05vZGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlKTtcbiAgfSxcbiAgLyoqXG4gICAqIEdldCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBub2RlIG5hbWVcbiAgICovXG4gIGdldE5vZGVEYXRhOiBmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXNbbm9kZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGFzc29jaWF0ZWQgZGF0YSBmb3IgYSBnaXZlbiBub2RlIG5hbWUuIElmIHRoZSBub2RlIGRvZXMgbm90IGV4aXN0LCB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yXG4gICAqL1xuICBzZXROb2RlRGF0YTogZnVuY3Rpb24obm9kZSwgZGF0YSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gbm9kZXMuIElmIGVpdGhlciBvZiB0aGUgbm9kZXMgZG9lcyBub3QgZXhpc3QsXG4gICAqIGFuIEVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgYWRkRGVwZW5kZW5jeTogZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgICBpZiAoIXRoaXMuaGFzTm9kZShmcm9tKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBmcm9tKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc05vZGUodG8pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIHRvKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5pbmRleE9mKHRvKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5wdXNoKHRvKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5jb21pbmdFZGdlc1t0b10uaW5kZXhPZihmcm9tKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1t0b10ucHVzaChmcm9tKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBkZXBlbmRlbmN5IGJldHdlZW4gdHdvIG5vZGVzLlxuICAgKi9cbiAgcmVtb3ZlRGVwZW5kZW5jeTogZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgICB2YXIgaWR4O1xuICAgIGlmICh0aGlzLmhhc05vZGUoZnJvbSkpIHtcbiAgICAgIGlkeCA9IHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5pbmRleE9mKHRvKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzTm9kZSh0bykpIHtcbiAgICAgIGlkeCA9IHRoaXMuaW5jb21pbmdFZGdlc1t0b10uaW5kZXhPZihmcm9tKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICB0aGlzLmluY29taW5nRWRnZXNbdG9dLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhbnkgY3VzdG9tIGRhdGEgaXMgYXR0YWNoZWRcbiAgICogdG8gdGhlIG5vZGVzLCBpdCB3aWxsIG9ubHkgYmUgc2hhbGxvdyBjb3BpZWQuXG4gICAqL1xuICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBEZXBHcmFwaCgpO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlLm5vZGVzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgICAgcmVzdWx0Lm5vZGVzW25dID0gc291cmNlLm5vZGVzW25dO1xuICAgICAgcmVzdWx0Lm91dGdvaW5nRWRnZXNbbl0gPSBzb3VyY2Uub3V0Z29pbmdFZGdlc1tuXS5zbGljZSgwKTtcbiAgICAgIHJlc3VsdC5pbmNvbWluZ0VkZ2VzW25dID0gc291cmNlLmluY29taW5nRWRnZXNbbl0uc2xpY2UoMCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBkZXBlbmRzIG9uICh0cmFuc2l0aXZlbHkpLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIGdyYXBoIGhhcyBhIGN5Y2xlLCBvciB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhbnkgb3RoZXIgbm9kZXMgd2lsbCBiZSByZXR1cm5lZFxuICAgKiBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBkZXBlbmRlbmNpZXNPZjogZnVuY3Rpb24obm9kZSwgbGVhdmVzT25seSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIHZhciBERlMgPSBjcmVhdGVERlMoXG4gICAgICAgIHRoaXMub3V0Z29pbmdFZGdlcyxcbiAgICAgICAgbGVhdmVzT25seSxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICB0aGlzLmNpcmN1bGFyXG4gICAgICApO1xuICAgICAgREZTKG5vZGUpO1xuICAgICAgdmFyIGlkeCA9IHJlc3VsdC5pbmRleE9mKG5vZGUpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJlc3VsdC5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogZ2V0IGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG5vZGVzIHRoYXQgZGVwZW5kIG9uIHRoZSBzcGVjaWZpZWQgbm9kZSAodHJhbnNpdGl2ZWx5KS5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBJZiBgbGVhdmVzT25seWAgaXMgdHJ1ZSwgb25seSBub2RlcyB0aGF0IGRvIG5vdCBoYXZlIGFueSBkZXBlbmRhbnRzIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGFycmF5LlxuICAgKi9cbiAgZGVwZW5kYW50c09mOiBmdW5jdGlvbihub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgdGhlIG92ZXJhbGwgcHJvY2Vzc2luZyBvcmRlciBmb3IgdGhlIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhbnkgb3RoZXIgbm9kZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIG92ZXJhbGxPcmRlcjogZnVuY3Rpb24obGVhdmVzT25seSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7IC8vIEVtcHR5IGdyYXBoXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5jaXJjdWxhcikge1xuICAgICAgICAvLyBMb29rIGZvciBjeWNsZXMgLSB3ZSBydW4gdGhlIERGUyBzdGFydGluZyBhdCBhbGwgdGhlIG5vZGVzIGluIGNhc2UgdGhlcmVcbiAgICAgICAgLy8gYXJlIHNldmVyYWwgZGlzY29ubmVjdGVkIHN1YmdyYXBocyBpbnNpZGUgdGhpcyBkZXBlbmRlbmN5IGdyYXBoLlxuICAgICAgICB2YXIgQ3ljbGVERlMgPSBjcmVhdGVERlModGhpcy5vdXRnb2luZ0VkZ2VzLCBmYWxzZSwgW10sIHRoaXMuY2lyY3VsYXIpO1xuICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgICAgICAgIEN5Y2xlREZTKG4pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICAvLyBGaW5kIGFsbCBwb3RlbnRpYWwgc3RhcnRpbmcgcG9pbnRzIChub2RlcyB3aXRoIG5vdGhpbmcgZGVwZW5kaW5nIG9uIHRoZW0pIGFuXG4gICAgICAvLyBydW4gYSBERlMgc3RhcnRpbmcgYXQgdGhlc2UgcG9pbnRzIHRvIGdldCB0aGUgb3JkZXJcbiAgICAgIGtleXNcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuaW5jb21pbmdFZGdlc1tub2RlXS5sZW5ndGggPT09IDA7XG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgICBERlMobik7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB3ZSdyZSBhbGxvd2luZyBjeWNsZXMgLSB3ZSBuZWVkIHRvIHJ1biB0aGUgREZTIGFnYWluc3QgYW55IHJlbWFpbmluZ1xuICAgICAgLy8gbm9kZXMgdGhhdCBkaWQgbm90IGVuZCB1cCBpbiB0aGUgaW5pdGlhbCByZXN1bHQgKGFzIHRoZXkgYXJlIHBhcnQgb2YgYVxuICAgICAgLy8gc3ViZ3JhcGggdGhhdCBkb2VzIG5vdCBoYXZlIGEgY2xlYXIgc3RhcnRpbmcgcG9pbnQpXG4gICAgICBpZiAodGhpcy5jaXJjdWxhcikge1xuICAgICAgICBrZXlzXG4gICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmluZGV4T2Yobm9kZSkgPT09IC0xO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgICAgICAgICAgREZTKG4pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSxcblxuICBtYXBOb2RlcyhtYXBwZXIpIHtcblxuICB9XG59O1xuXG4vKipcbiAqIEN5Y2xlIGVycm9yLCBpbmNsdWRpbmcgdGhlIHBhdGggb2YgdGhlIGN5Y2xlLlxuICovXG52YXIgRGVwR3JhcGhDeWNsZUVycm9yID0gKGV4cG9ydHMuRGVwR3JhcGhDeWNsZUVycm9yID0gZnVuY3Rpb24oY3ljbGVQYXRoKSB7XG4gIHZhciBtZXNzYWdlID0gXCJEZXBlbmRlbmN5IEN5Y2xlIEZvdW5kOiBcIiArIGN5Y2xlUGF0aC5qb2luKFwiIC0+IFwiKTtcbiAgdmFyIGluc3RhbmNlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBpbnN0YW5jZS5jeWNsZVBhdGggPSBjeWNsZVBhdGg7XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpKTtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoaW5zdGFuY2UsIERlcEdyYXBoQ3ljbGVFcnJvcik7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufSk7XG5EZXBHcmFwaEN5Y2xlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgY29uc3RydWN0b3I6IHtcbiAgICB2YWx1ZTogRXJyb3IsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pO1xuT2JqZWN0LnNldFByb3RvdHlwZU9mKERlcEdyYXBoQ3ljbGVFcnJvciwgRXJyb3IpO1xuXG5leHBvcnQgZGVmYXVsdCBEZXBHcmFwaDsiLCJpbXBvcnQgeyB1bmlxQnkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgYnVpbGRGaWx0ZXJSb2xlc0pvaW5zLFxufSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0ZpbHRlciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHRhYmxlTmFtZSAtXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YWJsZU5hbWUpIHtcbiAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTtcbiAgICB0aGlzLmZpbHRlcnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmlsdGVyLlxuICAgKiBAcGFyYW0geyp9IGZpbHRlclJvbGUgLVxuICAgKi9cbiAgc2V0RmlsdGVyKGZpbHRlclJvbGUpIHtcbiAgICBmaWx0ZXJSb2xlLnNldFRhYmxlTmFtZSh0aGlzLnRhYmxlTmFtZSk7XG4gICAgdGhpcy5maWx0ZXJzLnB1c2goZmlsdGVyUm9sZSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHF1ZXJpZXMgb2YgZmlsdGVyIHJvbGVzLlxuICAgKi9cbiAgYnVpbGRRdWVyeSgpIHtcbiAgICBjb25zdCBidWlsZGVyc0NhbGxiYWNrcyA9IFtdO1xuICAgIGNvbnN0IHRhYmxlQ29sdW1ucyA9IFtdO1xuXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4ge1xuICAgICAgY29uc3QgeyBmaWx0ZXJSb2xlcyB9ID0gZmlsdGVyO1xuICAgICAgYnVpbGRlcnNDYWxsYmFja3MucHVzaChmaWx0ZXIuYnVpbGRRdWVyeSgpKTtcbiAgICAgIHRhYmxlQ29sdW1ucy5wdXNoKC4uLihBcnJheS5pc0FycmF5KGZpbHRlclJvbGVzKSkgPyBmaWx0ZXJSb2xlcyA6IFtmaWx0ZXJSb2xlc10pO1xuICAgIH0pO1xuICAgIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgICAgYnVpbGRlcnNDYWxsYmFja3MuZm9yRWFjaCgoYnVpbGRlckNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGJ1aWxkZXJDYWxsYmFjayhidWlsZGVyKTtcbiAgICAgIH0pO1xuICAgICAgYnVpbGRGaWx0ZXJSb2xlc0pvaW5zKHRoaXMudGFibGVOYW1lLCB1bmlxQnkodGFibGVDb2x1bW5zLCAnY29sdW1uS2V5JykpKGJ1aWxkZXIpO1xuICAgIH07XG4gIH1cbn0iLCJpbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBEeW5hbWljRmlsdGVyUm9sZUFic3RydWN0b3IgZnJvbSAnQC9saWIvRHluYW1pY0ZpbHRlci9EeW5hbWljRmlsdGVyUm9sZUFic3RydWN0b3InO1xuaW1wb3J0IHtcbiAgYnVpbGRGaWx0ZXJRdWVyeSxcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbHRlclJvbGVzIGV4dGVuZHMgRHluYW1pY0ZpbHRlclJvbGVBYnN0cnVjdG9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIG1ldGhvZC5cbiAgICogQHBhcmFtIHtBcnJheX0gZmlsdGVyUm9sZXMgLVxuICAgKiBAcGFyYW0ge0FycmF5fSByZXNvdXJjZUZpZWxkcyAtXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmaWx0ZXJSb2xlcywgcmVzb3VyY2VGaWVsZHMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5maWx0ZXJSb2xlcyA9IGZpbHRlclJvbGVzLm1hcCgocm9sZSwgaW5kZXgpID0+ICh7XG4gICAgICAuLi5yb2xlLFxuICAgICAgaW5kZXg6IGluZGV4ICsgMSxcbiAgICAgIGNvbHVtbktleTogcm9sZS5maWVsZF9rZXksXG4gICAgICBjb25kaXRpb246IHJvbGUuY29tcGFyYXRvciA9PT0gJ0FORCcgPyAnJiYnIDogJ3x8JyxcbiAgICB9KSk7XG4gICAgdGhpcy5yZXNvdXJjZUZpZWxkcyA9IHJlc291cmNlRmllbGRzO1xuICB9XG5cbiAgdmFsaWRhdGVGaWx0ZXJSb2xlcygpIHtcbiAgICBjb25zdCBmaWx0ZXJGaWVsZHNLZXlzID0gdGhpcy5maWx0ZXJSb2xlcy5tYXAoKHIpID0+IHIuZmllbGRfa2V5KTtcbiAgICBjb25zdCByZXNvdXJjZUZpZWxkc0tleXMgPSB0aGlzLnJlc291cmNlRmllbGRzLm1hcCgocikgPT4gci5rZXkpO1xuXG4gICAgcmV0dXJuIGRpZmZlcmVuY2UoZmlsdGVyRmllbGRzS2V5cywgcmVzb3VyY2VGaWVsZHNLZXlzKTtcbiAgfVxuXG4gIC8vIEBwcml2YXRlXG4gIGJ1aWxkTG9naWNFeHByZXNzaW9uKCkge1xuICAgIGxldCBleHByZXNzaW9uID0gJyc7XG4gICAgdGhpcy5maWx0ZXJSb2xlcy5mb3JFYWNoKChyb2xlLCBpbmRleCkgPT4ge1xuICAgICAgZXhwcmVzc2lvbiArPSAoaW5kZXggPT09IDApXG4gICAgICAgID8gYCR7cm9sZS5pbmRleH0gYCA6IGAke3JvbGUuY29uZGl0aW9ufSAke3JvbGUuaW5kZXh9IGA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24udHJpbSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBkYXRhYmFzZSBxdWVyeSBvZiB2aWV3IHJvbGVzLlxuICAgKi9cbiAgYnVpbGRRdWVyeSgpIHtcbiAgICByZXR1cm4gKGJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IGxvZ2ljRXhwcmVzc2lvbiA9IHRoaXMuYnVpbGRMb2dpY0V4cHJlc3Npb24oKTtcbiAgICAgIGJ1aWxkRmlsdGVyUXVlcnkodGhpcy50YWJsZU5hbWUsIHRoaXMuZmlsdGVyUm9sZXMsIGxvZ2ljRXhwcmVzc2lvbikoYnVpbGRlcik7XG4gICAgfTtcbiAgfVxufSIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0ZpbHRlckFic3RydWN0b3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmZpbHRlclJvbGVzID0gW107XG4gICAgdGhpcy50YWJsZU5hbWUgPSAnJztcbiAgfVxuXG4gIHNldFRhYmxlTmFtZSh0YWJsZU5hbWUpIHtcbiAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJmYWNlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICBidWlsZExvZ2ljRXhwcmVzc2lvbigpIHt9XG5cbiAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gIHZhbGlkYXRlRmlsdGVyUm9sZXMoKSB7fVxuXG4gIC8qKlxuICAgKiBAaW50ZXJmYWNlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICBidWlsZFF1ZXJ5KCkge31cbn0iLCJpbXBvcnQgRHluYW1pY0ZpbHRlclJvbGVBYnN0cnVjdG9yIGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXIvRHluYW1pY0ZpbHRlclJvbGVBYnN0cnVjdG9yJztcbmltcG9ydCB7XG4gIGdldFJvbGVGaWVsZENvbHVtbixcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER5bmFtaWNGaWx0ZXJTb3J0QnkgZXh0ZW5kcyBEeW5hbWljRmlsdGVyUm9sZUFic3RydWN0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHNvcnRCeUZpZWxkS2V5LCBzb3J0RGlyZWN0aW9uKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuZmlsdGVyUm9sZXMgPSB7XG4gICAgICBjb2x1bW5LZXk6IHNvcnRCeUZpZWxkS2V5LFxuICAgICAgdmFsdWU6IHNvcnREaXJlY3Rpb24sXG4gICAgICBjb21wYXJhdG9yOiAnc29ydF9ieScsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgZGF0YWJhc2UgcXVlcnkgb2Ygc29ydCBieSBjb2x1bW4gb24gdGhlIGdpdmVuIGRpcmVjdGlvbi5cbiAgICovXG4gIGJ1aWxkUXVlcnkoKSB7IFxuICAgIGNvbnN0IHsgY29sdW1uS2V5ID0gbnVsbCwgdmFsdWUgPSBudWxsIH0gPSB0aGlzLmZpbHRlclJvbGVzO1xuXG4gICAgcmV0dXJuIChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZFJlbGF0aW9uID0gZ2V0Um9sZUZpZWxkQ29sdW1uKHRoaXMudGFibGVOYW1lLCBjb2x1bW5LZXkpO1xuICAgICAgaWYgKGNvbHVtbktleSkge1xuICAgICAgICBidWlsZGVyLm9yZGVyQnkoYCR7dGhpcy50YWJsZU5hbWV9LiR7ZmllbGRSZWxhdGlvbi5jb2x1bW59YCwgdmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IER5bmFtaWNGaWx0ZXJSb2xlQWJzdHJ1Y3RvciBmcm9tICdAL2xpYi9EeW5hbWljRmlsdGVyL0R5bmFtaWNGaWx0ZXJSb2xlQWJzdHJ1Y3Rvcic7XG5pbXBvcnQge1xuICB2YWxpZGF0ZVZpZXdSb2xlcyxcbiAgYnVpbGRGaWx0ZXJRdWVyeSxcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER5bmFtaWNGaWx0ZXJWaWV3cyBleHRlbmRzIER5bmFtaWNGaWx0ZXJSb2xlQWJzdHJ1Y3RvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBtZXRob2QuXG4gICAqIEBwYXJhbSB7Kn0gZmlsdGVyUm9sZXMgLVxuICAgKiBAcGFyYW0geyp9IGxvZ2ljRXhwcmVzc2lvbiAtXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmaWx0ZXJSb2xlcywgbG9naWNFeHByZXNzaW9uKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuZmlsdGVyUm9sZXMgPSBmaWx0ZXJSb2xlcztcbiAgICB0aGlzLmxvZ2ljRXhwcmVzc2lvbiA9IGxvZ2ljRXhwcmVzc2lvblxuICAgICAgLnJlcGxhY2UoJ0FORCcsICcmJicpXG4gICAgICAucmVwbGFjZSgnT1InLCAnfHwnKTtcblxuICAgIHRoaXMudGFibGVOYW1lID0gJyc7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgbG9naWMgZXhwcmVzc2lvbi5cbiAgICovXG4gIGJ1aWxkTG9naWNFeHByZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmxvZ2ljRXhwcmVzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgZmlsdGVyIHJvbGVzLlxuICAgKi9cbiAgdmFsaWRhdGVGaWx0ZXJSb2xlcygpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVWaWV3Um9sZXModGhpcy5maWx0ZXJSb2xlcywgdGhpcy5sb2dpY0V4cHJlc3Npb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBkYXRhYmFzZSBxdWVyeSBvZiB2aWV3IHJvbGVzLlxuICAgKi9cbiAgYnVpbGRRdWVyeSgpIHtcbiAgICByZXR1cm4gKGJ1aWxkZXIpID0+IHtcbiAgICAgIGJ1aWxkRmlsdGVyUXVlcnkodGhpcy50YWJsZU5hbWUsIHRoaXMuZmlsdGVyUm9sZXMsIHRoaXMubG9naWNFeHByZXNzaW9uKShidWlsZGVyKTtcbiAgICB9O1xuICB9XG59IiwiXG5cbmltcG9ydCBEeW5hbWljRmlsdGVyIGZyb20gJy4vRHluYW1pY0ZpbHRlcic7XG5pbXBvcnQgRHluYW1pY0ZpbHRlclNvcnRCeSBmcm9tICcuL0R5bmFtaWNGaWx0ZXJTb3J0QnknO1xuaW1wb3J0IER5bmFtaWNGaWx0ZXJWaWV3cyBmcm9tICcuL0R5bmFtaWNGaWx0ZXJWaWV3cyc7XG5pbXBvcnQgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzIGZyb20gJy4vRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzJztcblxuZXhwb3J0IHtcbiAgRHluYW1pY0ZpbHRlcixcbiAgRHluYW1pY0ZpbHRlclNvcnRCeSxcbiAgRHluYW1pY0ZpbHRlclZpZXdzLFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59OyIsIlxuY29uc3QgT3BlcmF0aW9uVHlwZSA9IHtcbiAgTE9HSUM6ICdMT0dJQycsXG4gIFNUUklORzogJ1NUUklORycsXG4gIENPTVBBUklTT046ICdDT01QQVJJU09OJyxcbiAgTUFUSDogJ01BVEgnLFxufTtcblxuZXhwb3J0IGNsYXNzIExleGVyIHtcbiAgLy8gb3BlcmF0aW9uIHRhYmxlXG4gIHN0YXRpYyBnZXQgb3B0YWJsZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJz0nOiBPcGVyYXRpb25UeXBlLkxPR0lDLFxuICAgICAgJyYnOiBPcGVyYXRpb25UeXBlLkxPR0lDLFxuICAgICAgJ3wnOiBPcGVyYXRpb25UeXBlLkxPR0lDLFxuICAgICAgJz8nOiBPcGVyYXRpb25UeXBlLkxPR0lDLFxuICAgICAgJzonOiBPcGVyYXRpb25UeXBlLkxPR0lDLFxuXG4gICAgICAnXFwnJzogT3BlcmF0aW9uVHlwZS5TVFJJTkcsXG4gICAgICAnXCInOiBPcGVyYXRpb25UeXBlLlNUUklORyxcblxuICAgICAgJyEnOiBPcGVyYXRpb25UeXBlLkNPTVBBUklTT04sXG4gICAgICAnPic6IE9wZXJhdGlvblR5cGUuQ09NUEFSSVNPTixcbiAgICAgICc8JzogT3BlcmF0aW9uVHlwZS5DT01QQVJJU09OLFxuXG4gICAgICAnKCc6IE9wZXJhdGlvblR5cGUuTUFUSCxcbiAgICAgICcpJzogT3BlcmF0aW9uVHlwZS5NQVRILFxuICAgICAgJysnOiBPcGVyYXRpb25UeXBlLk1BVEgsXG4gICAgICAnLSc6IE9wZXJhdGlvblR5cGUuTUFUSCxcbiAgICAgICcqJzogT3BlcmF0aW9uVHlwZS5NQVRILFxuICAgICAgJy8nOiBPcGVyYXRpb25UeXBlLk1BVEgsXG4gICAgICAnJSc6IE9wZXJhdGlvblR5cGUuTUFUSCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7Kn0gZXhwcmVzc2lvbiAtXG4gICAqL1xuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uKSB7XG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSAwO1xuICAgIHRoaXMuaW5wdXQgPSBleHByZXNzaW9uO1xuICAgIHRoaXMudG9rZW5MaXN0ID0gW107XG4gIH1cblxuICBnZXRUb2tlbnMoKSB7XG4gICAgbGV0IHRvaztcbiAgICBkbyB7XG4gICAgICAvLyByZWFkIGN1cnJlbnQgdG9rZW4sIHNvIHN0ZXAgc2hvdWxkIGJlIC0xXG4gICAgICB0b2sgPSB0aGlzLnBpY2tOZXh0KC0xKTtcbiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuY3VycmVudEluZGV4O1xuICAgICAgc3dpdGNoIChMZXhlci5vcHRhYmxlW3Rva10pIHtcbiAgICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLkxPR0lDOlxuICAgICAgICAgIC8vID09ICYmIHx8ID09PVxuICAgICAgICAgIHRoaXMucmVhZExvZ2ljT3B0KHRvayk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLlNUUklORzpcbiAgICAgICAgICB0aGlzLnJlYWRTdHJpbmcodG9rKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIE9wZXJhdGlvblR5cGUuQ09NUEFSSVNPTjpcbiAgICAgICAgICB0aGlzLnJlYWRDb21wYXJlKHRvayk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLk1BVEg6XG4gICAgICAgICAgdGhpcy5yZWNlaXZlVG9rZW4oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMucmVhZFZhbHVlKHRvayk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBwb3Mgbm90IGNoYW5nZWQsIHRoaXMgbG9vcCB3aWxsIGdvIGludG8gYSBpbmZpbml0ZSBsb29wLCBldmVyeSBzdGVwIG9mIHdoaWxlIGxvb3AsXG4gICAgICAvLyB3ZSBtdXN0IG1vdmUgdGhlIHBvcyBmb3J3YXJkXG4gICAgICAvLyBzbyBoZXJlIHdlIHNob3VsZCB0aHJvdyBlcnJvciwgZm9yIGV4YW1wbGUgYDEgJiAyYFxuICAgICAgaWYgKHBvcyA9PT0gdGhpcy5jdXJyZW50SW5kZXggJiYgdG9rICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGB1bmtvbncgdG9rZW4gJHt0b2t9IGZyb20gaW5wdXQgc3RyaW5nICR7dGhpcy5pbnB1dH1gKTtcbiAgICAgICAgZXJyLm5hbWUgPSAnVW5rbm93VG9rZW4nO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSB3aGlsZSAodG9rICE9PSB1bmRlZmluZWQpXG5cbiAgICByZXR1cm4gdGhpcy50b2tlbkxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogcmVhZCBuZXh0IHRva2VuLCB0aGUgaW5kZXggcGFyYW0gY2FuIHNldCBuZXh0IHN0ZXAsIGRlZmF1bHQgZ28gZm93YXJkIDEgc3RlcFxuICAgKlxuICAgKiBAcGFyYW0gaW5kZXggbmV4dCBwb3N0aW9uXG4gICAqL1xuICBwaWNrTmV4dChpbmRleCA9IDApIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dFtpbmRleCArIHRoaXMuY3VycmVudEluZGV4ICsgMV07XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgdG9rZW4gaW50byByZXN1bHQgdG9rZW5MaXN0LCBhbmQgbW92ZSB0aGUgcG9zIGluZGV4XG4gICAqXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKi9cbiAgcmVjZWl2ZVRva2VuKGluZGV4ID0gMSkge1xuICAgIGNvbnN0IHRvayA9IHRoaXMuaW5wdXQuc2xpY2UodGhpcy5jdXJyZW50SW5kZXgsIHRoaXMuY3VycmVudEluZGV4ICsgaW5kZXgpLnRyaW0oKTtcbiAgICAvLyBza2lwIGVtcHR5IHN0cmluZ1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMudG9rZW5MaXN0LnB1c2godG9rKTtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRJbmRleCArPSBpbmRleDtcbiAgfVxuXG4gIC8vICcgb3IgXCJcbiAgcmVhZFN0cmluZyh0b2spIHtcbiAgICBsZXQgbmV4dDtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGRvIHtcbiAgICAgIG5leHQgPSB0aGlzLnBpY2tOZXh0KGluZGV4KTtcbiAgICAgIGluZGV4ICs9IDE7XG4gICAgfSB3aGlsZSAobmV4dCAhPT0gdG9rICYmIG5leHQgIT09IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5yZWNlaXZlVG9rZW4oaW5kZXggKyAxKTtcbiAgfVxuXG4gIC8vID4gb3IgPCBvciA+PSBvciA8PSBvciAhPT1cbiAgLy8gdG9rIGluICg+LCA8LCAhKVxuICByZWFkQ29tcGFyZSh0b2spIHtcbiAgICBpZiAodGhpcy5waWNrTmV4dCgpICE9PSAnPScpIHtcbiAgICAgIHRoaXMucmVjZWl2ZVRva2VuKDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyAhPT1cbiAgICBpZiAodG9rID09PSAnIScgJiYgdGhpcy5waWNrTmV4dCgxKSA9PT0gJz0nKSB7XG4gICAgICB0aGlzLnJlY2VpdmVUb2tlbigzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZWNlaXZlVG9rZW4oMik7XG4gIH1cblxuICAvLyA9PT0gb3IgPT1cbiAgLy8gJiYgfHxcbiAgcmVhZExvZ2ljT3B0KHRvaykge1xuICAgIGlmICh0aGlzLnBpY2tOZXh0KCkgPT09IHRvaykge1xuICAgICAgLy8gPT09XG4gICAgICBpZiAodG9rID09PSAnPScgJiYgdGhpcy5waWNrTmV4dCgxKSA9PT0gdG9rKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlY2VpdmVUb2tlbigzKTtcbiAgICAgIH1cbiAgICAgIC8vID09ICYmIHx8XG4gICAgICByZXR1cm4gdGhpcy5yZWNlaXZlVG9rZW4oMik7XG4gICAgfVxuICAgIC8vIGhhbmRsZSBhcyAmJlxuICAgIC8vIGEgPyBiIDogYyBpcyBlcXVhbCB0byBhICYmIGIgfHwgY1xuICAgIGlmICh0b2sgPT09ICc/JyB8fCB0b2sgPT09ICc6Jykge1xuICAgICAgcmV0dXJuIHRoaXMucmVjZWl2ZVRva2VuKDEpO1xuICAgIH1cbiAgfVxuXG4gIHJlYWRWYWx1ZSh0b2spIHtcbiAgICBpZiAoIXRvaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgd2hpbGUgKCFMZXhlci5vcHRhYmxlW3Rva10gJiYgdG9rICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRvayA9IHRoaXMucGlja05leHQoaW5kZXgpO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgdGhpcy5yZWNlaXZlVG9rZW4oaW5kZXgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRva2VuKGV4cHJlc3Npb24pIHtcbiAgY29uc3QgbGV4ZXIgPSBuZXcgTGV4ZXIoZXhwcmVzc2lvbik7XG4gIHJldHVybiBsZXhlci5nZXRUb2tlbnMoKTtcbn1cbiIsImV4cG9ydCBjb25zdCBPUEVSQVRJT04gPSB7XG4gICchJzogNSxcbiAgJyonOiA0LFxuICAnLyc6IDQsXG4gICclJzogNCxcbiAgJysnOiAzLFxuICAnLSc6IDMsXG4gICc+JzogMixcbiAgJzwnOiAyLFxuICAnPj0nOiAyLFxuICAnPD0nOiAyLFxuICAnPT09JzogMixcbiAgJyE9PSc6IDIsXG4gICc9PSc6IDIsXG4gICchPSc6IDIsXG4gICcmJic6IDEsXG4gICd8fCc6IDEsXG4gICc/JzogMSxcbiAgJzonOiAxLFxufTtcblxuLy8gZXhwb3J0IGludGVyZmFjZSBOb2RlIHtcbi8vICAgbGVmdDogTm9kZSB8IHN0cmluZyB8IG51bGw7XG4vLyAgIHJpZ2h0OiBOb2RlIHwgc3RyaW5nIHwgbnVsbDtcbi8vICAgb3BlcmF0aW9uOiBzdHJpbmc7XG4vLyAgIGdyb3VwZWQ/OiBib29sZWFuO1xuLy8gfTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyIHtcblxuICBjb25zdHJ1Y3Rvcih0b2tlbikge1xuICAgIHRoaXMuaW5kZXggPSAtMTtcbiAgICB0aGlzLmJsb2NrTGV2ZWwgPSAwO1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHJldHVybiB7Tm9kZSB8IHN0cmluZ30gPS0gXG4gICAqL1xuICBwYXJzZSgpIHtcbiAgICBsZXQgdG9rO1xuICAgIGxldCByb290ID0ge1xuICAgICAgbGVmdDogbnVsbCxcbiAgICAgIHJpZ2h0OiBudWxsLFxuICAgICAgb3BlcmF0aW9uOiBudWxsLFxuICAgIH07XG5cbiAgICBkbyB7XG4gICAgICB0b2sgPSB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cbiAgICAgIGlmICh0b2sgPT09IG51bGwgfHwgdG9rID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChyb290LmxlZnQgPT09IG51bGwpIHtcbiAgICAgICAgcm9vdC5sZWZ0ID0gdG9rO1xuICAgICAgICByb290Lm9wZXJhdGlvbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cbiAgICAgICAgaWYgKCFyb290Lm9wZXJhdGlvbikge1xuICAgICAgICAgIHJldHVybiB0b2s7XG4gICAgICAgIH1cblxuICAgICAgICByb290LnJpZ2h0ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b2sgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcGVyYXRpb24gbXVzdCBiZSBzdHJpbmcsIGJ1dCBnZXQgJyArIEpTT04uc3RyaW5naWZ5KHRvaykpO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QgPSB0aGlzLmFkZE5vZGUodG9rLCB0aGlzLnBhcnNlU3RhdGVtZW50KCksIHJvb3QpO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHRvayk7XG5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIG5leHRUb2tlbigpIHtcbiAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5bdGhpcy5pbmRleF07XG4gIH1cblxuICBwcmV2VG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5bdGhpcy5pbmRleCAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIFxuICAgKiBAcGFyYW0ge05vZGV8U3RyaW5nfG51bGx9IHJpZ2h0IFxuICAgKiBAcGFyYW0ge05vZGV9IHJvb3QgXG4gICAqL1xuICBhZGROb2RlKG9wZXJhdGlvbiwgcmlnaHQsIHJvb3QpIHtcbiAgICBsZXQgcHJlID0gcm9vdDtcbiAgICBcbiAgICBpZiAodGhpcy5jb21wYXJlKHByZS5vcGVyYXRpb24sIG9wZXJhdGlvbikgPCAwICYmICFwcmUuZ3JvdXBlZCkge1xuICAgICAgXG4gICAgICB3aGlsZSAocHJlLnJpZ2h0ICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBwcmUucmlnaHQgIT09ICdzdHJpbmcnICYmXG4gICAgICAgIHRoaXMuY29tcGFyZShwcmUucmlnaHQub3BlcmF0aW9uLCBvcGVyYXRpb24pIDwgMCAmJiAhcHJlLnJpZ2h0Lmdyb3VwZWQpIHtcbiAgICAgICAgcHJlID0gcHJlLnJpZ2h0O1xuICAgICAgfVxuXG4gICAgICBwcmUucmlnaHQgPSB7XG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgbGVmdDogcHJlLnJpZ2h0LFxuICAgICAgICByaWdodCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IHByZSxcbiAgICAgIHJpZ2h0LFxuICAgICAgb3BlcmF0aW9uLFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIHtTdHJpbmd9IGEgXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiIFxuICAgKi9cbiAgY29tcGFyZShhLCBiKSB7XG4gICAgaWYgKCFPUEVSQVRJT04uaGFzT3duUHJvcGVydHkoYSkgfHwgIU9QRVJBVElPTi5oYXNPd25Qcm9wZXJ0eShiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3cgb3BlcmF0aW9uICR7YX0gb3IgJHtifWApO1xuICAgIH1cbiAgICByZXR1cm4gT1BFUkFUSU9OW2FdIC0gT1BFUkFUSU9OW2JdO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gc3RyaW5nIHwgTm9kZSB8IG51bGxcbiAgICovXG4gIHBhcnNlU3RhdGVtZW50KCkge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcbiAgICBpZiAodG9rZW4gPT09ICcoJykge1xuICAgICAgdGhpcy5ibG9ja0xldmVsICs9IDE7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5wYXJzZSgpO1xuICAgICAgdGhpcy5ibG9ja0xldmVsIC09IDE7XG5cbiAgICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgbm9kZS5ncm91cGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGlmICh0b2tlbiA9PT0gJyknKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4gPT09ICchJykge1xuICAgICAgcmV0dXJuIHsgbGVmdDogbnVsbCwgb3BlcmF0aW9uOiB0b2tlbiwgcmlnaHQ6IHRoaXMucGFyc2VTdGF0ZW1lbnQoKSB9XG4gICAgfVxuXG4gICAgLy8gMyA+IC0xMiBvciAtMTIgKyAxMFxuICAgIGlmICh0b2tlbiA9PT0gJy0nICYmIChPUEVSQVRJT05bdGhpcy5wcmV2VG9rZW4oKV0gPiAwIHx8IHRoaXMucHJldlRva2VuKCkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiB7IGxlZnQ6ICcwJywgb3BlcmF0aW9uOiB0b2tlbiwgcmlnaHQ6IHRoaXMucGFyc2VTdGF0ZW1lbnQoKSwgZ3JvdXBlZDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgT1BFUkFUSU9OIH0gZnJvbSAnLi9QYXJzZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBRdWVyeVBhcnNlciB7XG5cbiAgY29uc3RydWN0b3IodHJlZSwgcXVlcmllcykge1xuICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgdGhpcy5xdWVyaWVzID0gcXVlcmllcztcbiAgICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgfVxuXG4gIHNldFF1ZXJ5KHF1ZXJ5KSB7XG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5LmNsb25lKCk7XG4gIH1cblxuICBwYXJzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZU5vZGUodGhpcy50cmVlKTtcbiAgfVxuXG4gIHBhcnNlTm9kZShub2RlKSB7XG4gICAgaWYgKHR5cGVvZiBub2RlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3Qgbm9kZVF1ZXJ5ID0gdGhpcy5nZXRRdWVyeShub2RlKTtcbiAgICAgIHJldHVybiAocXVlcnkpID0+IHsgbm9kZVF1ZXJ5KHF1ZXJ5KTsgfTtcbiAgICB9XG4gICAgaWYgKE9QRVJBVElPTltub2RlLm9wZXJhdGlvbl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3cgZXhwcmVzc2lvbiAke25vZGUub3BlcmF0aW9ufWApO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0UXVlcnkgPSB0aGlzLmdldFF1ZXJ5KG5vZGUubGVmdCk7XG4gICAgY29uc3QgcmlnaHRRdWVyeSA9IHRoaXMuZ2V0UXVlcnkobm9kZS5yaWdodCk7XG5cbiAgICBzd2l0Y2ggKG5vZGUub3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICcmJic6XG4gICAgICBjYXNlICdBTkQnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChub2RlUXVlcnkpID0+IG5vZGVRdWVyeS53aGVyZSgocXVlcnkpID0+IHtcbiAgICAgICAgICBxdWVyeS53aGVyZSgocSkgPT4geyBsZWZ0UXVlcnkocSk7IH0pO1xuICAgICAgICAgIHF1ZXJ5LmFuZFdoZXJlKChxKSA9PiB7IHJpZ2h0UXVlcnkocSk7IH0pO1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ3x8JzpcbiAgICAgIGNhc2UgJ09SJzpcbiAgICAgICAgcmV0dXJuIChub2RlUXVlcnkpID0+IG5vZGVRdWVyeS53aGVyZSgocXVlcnkpID0+IHtcbiAgICAgICAgICBxdWVyeS53aGVyZSgocSkgPT4geyBsZWZ0UXVlcnkocSk7IH0pO1xuICAgICAgICAgIHF1ZXJ5Lm9yV2hlcmUoKHEpID0+IHsgcmlnaHRRdWVyeShxKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldFF1ZXJ5KG5vZGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdzdHJpbmcnICYmIG5vZGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlTm9kZShub2RlKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KG5vZGUpO1xuXG4gICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5xdWVyaWVzW25vZGVdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vdyBxdWVyeSB1bmRlciBpbmRleCAke25vZGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5xdWVyaWVzW25vZGVdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufSIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWV0YWJsZUNvbGxlY3Rpb24ge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgbWV0aG9kLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tZXRhZGF0YSA9IFtdO1xuICAgIHRoaXMuS0VZX0NPTFVNTiA9ICdrZXknO1xuICAgIHRoaXMuVkFMVUVfQ09MVU1OID0gJ3ZhbHVlJztcbiAgICB0aGlzLlRZUEVfQ09MVU1OID0gJ3R5cGUnO1xuICAgIHRoaXMubW9kZWwgPSBudWxsO1xuICAgIHRoaXMuZXh0cmFDb2x1bW5zID0gW107XG5cbiAgICB0aGlzLmV4dHJhUXVlcnkgPSAocXVlcnksIG1ldGEpID0+IHtcbiAgICAgIHF1ZXJ5LndoZXJlKCdrZXknLCBtZXRhW3RoaXMuS0VZX0NPTFVNTl0pO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1vZGVsIG9mIHRoaXMgbWV0YWRhdGEgY29sbGVjdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIC1cbiAgICovXG4gIHNldE1vZGVsKG1vZGVsKSB7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBleHRyYSBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zIC1cbiAgICovXG4gIHNldEV4dHJhQ29sdW1ucyhjb2x1bW5zKSB7XG4gICAgdGhpcy5leHRyYUNvbHVtbnMgPSBjb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGdpdmVuIG1ldGFkYXRhIGtleS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBNZXRhZGF0YSBvYmplY3QuXG4gICAqL1xuICBmaW5kTWV0YShwYXlsb2FkKSB7XG4gICAgY29uc3QgeyBrZXksIGV4dHJhQ29sdW1ucyB9ID0gdGhpcy5wYXJzZVBheWxvYWQocGF5bG9hZCk7XG5cbiAgICByZXR1cm4gdGhpcy5hbGxNZXRhZGF0YSgpLmZpbmQoKG1ldGEpID0+IHtcbiAgICAgIGNvbnN0IGlzU2FtZUtleSA9IG1ldGEua2V5ID09PSBrZXk7XG4gICAgICBjb25zdCBzYW1lRXh0cmFDb2x1bW5zID0gdGhpcy5leHRyYUNvbHVtbnMuc29tZSgoZXh0cmFDb2x1bW4pID0+IHtcbiAgICAgICAgcmV0dXJuICFleHRyYUNvbHVtbnMgfHwgKGV4dHJhQ29sdW1uc1tleHRyYUNvbHVtbl0gPT09IG1ldGFbZXh0cmFDb2x1bW5dKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGlzU2FtZUtleSAmJiBzYW1lRXh0cmFDb2x1bW5zO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGFsbCBtZXRhZGF0YS5cbiAgICovXG4gIGFsbE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLmZpbHRlcigobWV0YSkgPT4gIW1ldGEubWFya0FzRGVsZXRlZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgbWV0YWRhdGEgb2YgdGhlIGdpdmVuIGtleS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtXG4gICAqIEBwYXJhbSB7TWl4aWVkfSBkZWZhdWx0VmFsdWUgLVxuICAgKi9cbiAgZ2V0TWV0YShwYXlsb2FkLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZmluZE1ldGEocGF5bG9hZCk7XG4gICAgcmV0dXJuIG1ldGFkYXRhID8gbWV0YWRhdGEudmFsdWUgOiBkZWZhdWx0VmFsdWUgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTWFya2VzIHRoZSBtZXRhZGF0YSB0byBzaG91bGQgYmUgZGVsZXRlZC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtXG4gICAqL1xuICByZW1vdmVNZXRhKGtleSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5maW5kTWV0YShrZXkpO1xuXG4gICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICBtZXRhZGF0YS5tYXJrQXNEZWxldGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBtZXRhIGRhdGEgb2YgdGhlIGdpdmVuIGdyb3VwLlxuICAgKiBAcGFyYW0geyp9IGdyb3VwXG4gICAqL1xuICByZW1vdmVBbGxNZXRhKGdyb3VwID0gJ2RlZmF1bHQnKSB7XG4gICAgdGhpcy5tZXRhZGF0YSA9IHRoaXMubWV0YWRhdGEubWFwKChtZXRhKSA9PiAoe1xuICAgICAgLi4ubWV0YSxcbiAgICAgIG1hcmtBc0RlbGV0ZWQ6IHRydWUsXG4gICAgfSkpO1xuICB9XG5cbiAgc2V0RXh0cmFRdWVyeShjYWxsYmFjaykge1xuICAgIHRoaXMuZXh0cmFRdWVyeSA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbWV0YSBkYXRhIHRvIHRoZSBzdGFjay5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtXG4gICAqL1xuICBzZXRNZXRhKHBheWxvYWQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGtleTtcblxuICAgICAgbWV0YWRhdGEuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgICB0aGlzLnNldE1ldGEobWV0YS5rZXksIG1ldGEudmFsdWUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsga2V5LCB2YWx1ZSwgLi4uZXh0cmFDb2x1bW5zIH0gPSB0aGlzLnBhcnNlUGF5bG9hZChwYXlsb2FkLCBhcmdzWzBdKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZmluZE1ldGEocGF5bG9hZCk7XG5cbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIG1ldGFkYXRhLnZhbHVlID0gdmFsdWU7XG4gICAgICBtZXRhZGF0YS5tYXJrQXNVcGRhdGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhZGF0YS5wdXNoKHtcbiAgICAgICAgdmFsdWUsIGtleSwgLi4uZXh0cmFDb2x1bW5zLCBtYXJrQXNJbnNlcnRlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlUGF5bG9hZChwYXlsb2FkLCB2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgcGF5bG9hZCAhPT0gJ29iamVjdCcgPyB7IGtleTogcGF5bG9hZCwgdmFsdWUgfSA6IHsgLi4ucGF5bG9hZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVkIHRoZSBtb2RpZmllZC9kZWxldGVkIGFuZCBpbnNlcnRlZCBtZXRhZGF0YS5cbiAgICovXG4gIGFzeW5jIHNhdmVNZXRhKCkge1xuICAgIGNvbnN0IGluc2VydGVkID0gdGhpcy5tZXRhZGF0YS5maWx0ZXIoKG0pID0+IChtLm1hcmtBc0luc2VydGVkID09PSB0cnVlKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMubWV0YWRhdGEuZmlsdGVyKChtKSA9PiAobS5tYXJrQXNVcGRhdGVkID09PSB0cnVlKSk7XG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMubWV0YWRhdGEuZmlsdGVyKChtKSA9PiAobS5tYXJrQXNEZWxldGVkID09PSB0cnVlKSk7XG4gICAgY29uc3Qgb3BlcnMgPSBbXTtcblxuICAgIGlmIChkZWxldGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGRlbGV0ZWQuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgICBjb25zdCBkZWxldGVPcGVyID0gdGhpcy5tb2RlbC5xdWVyeSgpLm9uQnVpbGQoKHF1ZXJ5LCByZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLmV4dHJhUXVlcnkocXVlcnksIG1ldGEpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pLmRlbGV0ZSgpO1xuICAgICAgICBvcGVycy5wdXNoKGRlbGV0ZU9wZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGluc2VydGVkLmZvckVhY2goKG1ldGEpID0+IHtcbiAgICAgIGNvbnN0IGluc2VydE9wZXIgPSB0aGlzLm1vZGVsLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgW3RoaXMuS0VZX0NPTFVNTl06IG1ldGEua2V5LFxuICAgICAgICBbdGhpcy5WQUxVRV9DT0xVTU5dOiBtZXRhLnZhbHVlLFxuICAgICAgICAuLi50aGlzLmV4dHJhQ29sdW1ucy5yZWR1Y2UoKG9iaiwgY29sdW1uKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBtZXRhW2NvbHVtbl0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvYmpbY29sdW1uXSA9IG1ldGFbY29sdW1uXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSwge30pLFxuICAgICAgfSk7XG4gICAgICBvcGVycy5wdXNoKGluc2VydE9wZXIpO1xuICAgIH0pO1xuICAgIHVwZGF0ZWQuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlT3BlciA9IHRoaXMubW9kZWwucXVlcnkoKS5vbkJ1aWxkKChxdWVyeSkgPT4ge1xuICAgICAgICB0aGlzLmV4dHJhUXVlcnkocXVlcnksIG1ldGEpO1xuICAgICAgfSkucGF0Y2goe1xuICAgICAgICBbdGhpcy5WQUxVRV9DT0xVTU5dOiBtZXRhLnZhbHVlLFxuICAgICAgfSk7XG4gICAgICBvcGVycy5wdXNoKHVwZGF0ZU9wZXIpO1xuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKG9wZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgc3RvcmFnZS5cbiAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGtleSAtXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2UgLVxuICAgKi9cbiAgYXN5bmMgbG9hZCgpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucXVlcnkoKTtcblxuICAgIGNvbnN0IG1ldGFkYXRhQXJyYXkgPSB0aGlzLm1hcE1ldGFkYXRhQ29sbGVjdGlvbihtZXRhZGF0YSk7XG4gICAgbWV0YWRhdGFBcnJheS5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICB0aGlzLm1ldGFkYXRhLnB1c2gobWV0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHRoZSBtZXRhZGF0YSBiZWZvcmUgc2F2aW5nIHRvIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfEJvb2xlYW59IHZhbHVlIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlVHlwZSAtXG4gICAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ8Qm9vbGVhbn0gLVxuICAgKi9cbiAgc3RhdGljIGZvcm1hdE1ldGFWYWx1ZSh2YWx1ZSwgdmFsdWVUeXBlKSB7XG4gICAgbGV0IHBhcnNlZFZhbHVlO1xuXG4gICAgc3dpdGNoICh2YWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHBhcnNlZFZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZSA/ICcxJyA6ICcwJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSBKU09OLnN0cmluZ2lmeShwYXJzZWRWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGFuZCBwYXJzZSBtZXRhZGF0YSB0byBjb2xsZWN0aW9uIGVudHJpZXMuXG4gICAqIEBwYXJhbSB7TWV0YX0gYXR0ciAtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJzZVR5cGUgLVxuICAgKi9cbiAgbWFwTWV0YWRhdGEoYXR0ciwgcGFyc2VUeXBlID0gJ3BhcnNlJykge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGF0dHJbdGhpcy5LRVlfQ09MVU1OXSxcbiAgICAgIHZhbHVlOiAocGFyc2VUeXBlID09PSAncGFyc2UnKVxuICAgICAgICA/IE1ldGFibGVDb2xsZWN0aW9uLnBhcnNlTWV0YVZhbHVlKFxuICAgICAgICAgIGF0dHJbdGhpcy5WQUxVRV9DT0xVTU5dLFxuICAgICAgICAgIHRoaXMuVFlQRV9DT0xVTU4gPyBhdHRyW3RoaXMuVFlQRV9DT0xVTU5dIDogZmFsc2UsXG4gICAgICAgIClcbiAgICAgICAgOiBNZXRhYmxlQ29sbGVjdGlvbi5mb3JtYXRNZXRhVmFsdWUoXG4gICAgICAgICAgYXR0clt0aGlzLlZBTFVFX0NPTFVNTl0sXG4gICAgICAgICAgdGhpcy5UWVBFX0NPTFVNTiA/IGF0dHJbdGhpcy5UWVBFX0NPTFVNTl0gOiBmYWxzZSxcbiAgICAgICAgKSxcbiAgICAgIC4uLnRoaXMuZXh0cmFDb2x1bW5zLm1hcCgoZXh0cmFDb2wpID0+ICh7XG4gICAgICAgIFtleHRyYUNvbF06IGF0dHJbZXh0cmFDb2xdIHx8IG51bGwsXG4gICAgICB9KSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgbWV0YWRhdGEgdG8gdGhlIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbGxlY3Rpb24gLVxuICAgKi9cbiAgbWFwTWV0YWRhdGFUb0NvbGxlY3Rpb24obWV0YWRhdGEsIHBhcnNlVHlwZSA9ICdwYXJzZScpIHtcbiAgICByZXR1cm4gbWV0YWRhdGEubWFwKChtb2RlbCkgPT4gdGhpcy5tYXBNZXRhZGF0YVRvQ29sbGVjdGlvbihtb2RlbCwgcGFyc2VUeXBlKSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBtZXRhZGF0YSB0byB0aGUgbWV0YWJsZSBjb2xsZWN0aW9uLlxuICAgKiBAcGFyYW0ge0FycmF5fSBtZXRhIC1cbiAgICovXG4gIGZyb20obWV0YSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGEpKSB7XG4gICAgICBtZXRhLmZvckVhY2goKG0pID0+IHsgdGhpcy5mcm9tKG0pOyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tZXRhZGF0YS5wdXNoKG1ldGEpO1xuICB9XG5cbiAgdG9BcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kIHRvIGxvYWQgbWV0YWRhdGEgdG8gdGhlIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSB7QXJyYXl9IG1ldGEgXG4gICAqL1xuICBzdGF0aWMgZnJvbShtZXRhKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNZXRhYmxlQ29sbGVjdGlvbigpO1xuICAgIGNvbGxlY3Rpb24uZnJvbShtZXRhKTtcblxuICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IExleGVyIH0gZnJvbSAnQC9saWIvTG9naWNFdmFsdWF0aW9uL0xleGVyJztcbmltcG9ydCBQYXJzZXIgZnJvbSAnQC9saWIvTG9naWNFdmFsdWF0aW9uL1BhcnNlcic7XG5pbXBvcnQgUXVlcnlQYXJzZXIgZnJvbSAnQC9saWIvTG9naWNFdmFsdWF0aW9uL1F1ZXJ5UGFyc2VyJztcbmltcG9ydCByZXNvdXJjZUZpZWxkc0tleXMgZnJvbSAnQC9kYXRhL1Jlc291cmNlRmllbGRzS2V5cyc7XG5cbi8vICBjb25zdCByb2xlID0ge1xuLy8gICBjb21wYXRvdG9yOiBTdHJpbmcsXG4vLyAgIHZhbHVlOiBTdHJpbmcsXG4vLyAgIGNvbHVtbktleTogU3RyaW5nLFxuLy8gICBjb2x1bW5TbHVnOiBTdHJpbmcsXG4vLyAgIGluZGV4OiBOdW1iZXIsXG4vLyB9XG5cbi8qKlxuICogR2V0IGZpZWxkIGNvbHVtbiBtZXRhZGF0YSBhbmQgaXRzIHJlbGF0aW9uIHdpdGggb3RoZXIgdGFibGVzLlxuICogQHBhcmFtIHtTdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUgb2YgdGFyZ2V0IGNvbHVtbi5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjb2x1bW5LZXkgLSBUYXJnZXQgY29sdW1uIGtleSB0aGF0IHN0b3JlZCBpbiByZXNvdXJjZSBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvbGVGaWVsZENvbHVtbih0YWJsZU5hbWUsIGNvbHVtbktleSkge1xuICBjb25zdCB0YWJsZUZpZWxkcyA9IHJlc291cmNlRmllbGRzS2V5c1t0YWJsZU5hbWVdO1xuICByZXR1cm4gKHRhYmxlRmllbGRzW2NvbHVtbktleV0pID8gdGFibGVGaWVsZHNbY29sdW1uS2V5XSA6IG51bGw7XG59XG5cbi8qKlxuICogQnVpbGRzIHJvbGVzIHF1ZXJpZXMuXG4gKiBAcGFyYW0ge1N0cmluZ30gdGFibGVOYW1lIC1cbiAqIEBwYXJhbSB7T2JqZWN0fSByb2xlIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUm9sZVF1ZXJ5KHRhYmxlTmFtZSwgcm9sZSkge1xuICBjb25zdCBmaWVsZFJlbGF0aW9uID0gZ2V0Um9sZUZpZWxkQ29sdW1uKHRhYmxlTmFtZSwgcm9sZS5jb2x1bW5LZXkpO1xuICBjb25zdCBjb21wYXJhdG9yQ29sdW1uID0gZmllbGRSZWxhdGlvbi5yZWxhdGlvbkNvbHVtbiB8fCBgJHt0YWJsZU5hbWV9LiR7ZmllbGRSZWxhdGlvbi5jb2x1bW59YDtcblxuICBzd2l0Y2ggKHJvbGUuY29tcGFyYXRvcikge1xuICAgIGNhc2UgJ2VxdWFscyc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgICAgICBidWlsZGVyLndoZXJlKGNvbXBhcmF0b3JDb2x1bW4sIHJvbGUudmFsdWUpO1xuICAgICAgfTtcbiAgICBjYXNlICdub3RfZXF1YWwnOlxuICAgIGNhc2UgJ25vdF9lcXVhbHMnOlxuICAgICAgcmV0dXJuIChidWlsZGVyKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIud2hlcmVOb3QoY29tcGFyYXRvckNvbHVtbiwgcm9sZS52YWx1ZSk7XG4gICAgICB9O1xuICAgIGNhc2UgJ2NvbnRhaW4nOlxuICAgIGNhc2UgJ2NvbnRhaW5zJzpcbiAgICAgIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgICAgICBidWlsZGVyLndoZXJlKGNvbXBhcmF0b3JDb2x1bW4sICdMSUtFJywgYCUke3JvbGUudmFsdWV9JWApO1xuICAgICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgcmVsYXRpb24gdGFibGUgbmFtZSBmcm9tIHJlbGF0aW9uLlxuICogQHBhcmFtIHtTdHJpbmd9IGNvbHVtbiAtXG4gKiBAcmV0dXJuIHtTdHJpbmd9IC0gam9pbiByZWxhdGlvbiB0YWJsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFRhYmxlRnJvbVJlbGF0aW9uQ29sdW1uID0gKGNvbHVtbikgPT4ge1xuICBjb25zdCBzcGxpdGVkQ29sdW1uID0gY29sdW1uLnNwbGl0KCcuJyk7XG4gIHJldHVybiAoc3BsaXRlZENvbHVtbi5sZW5ndGggPiAwKSA/IHNwbGl0ZWRDb2x1bW5bMF0gOiAnJztcbn07XG5cbi8qKlxuICogQnVpbGRzIHZpZXcgcm9sZXMgam9pbiBxdWVyaWVzLlxuICogQHBhcmFtIHtTdHJpbmd9IHRhYmxlTmFtZSAtXG4gKiBAcGFyYW0ge0FycmF5fSByb2xlcyAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZpbHRlclJvbGVzSm9pbnModGFibGVOYW1lLCByb2xlcykge1xuICByZXR1cm4gKGJ1aWxkZXIpID0+IHtcbiAgICByb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZENvbHVtbiA9IGdldFJvbGVGaWVsZENvbHVtbih0YWJsZU5hbWUsIHJvbGUuY29sdW1uS2V5KTtcblxuICAgICAgaWYgKGZpZWxkQ29sdW1uLnJlbGF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IGdldFRhYmxlRnJvbVJlbGF0aW9uQ29sdW1uKGZpZWxkQ29sdW1uLnJlbGF0aW9uKTtcbiAgICAgICAgYnVpbGRlci5qb2luKGpvaW5UYWJsZSwgYCR7dGFibGVOYW1lfS4ke2ZpZWxkQ29sdW1uLmNvbHVtbn1gLCAnPScsIGZpZWxkQ29sdW1uLnJlbGF0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU29ydENvbHVtbkpvaW4odGFibGVOYW1lLCBzb3J0Q29sdW1uS2V5KSB7XG4gIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGZpZWxkQ29sdW1uID0gZ2V0Um9sZUZpZWxkQ29sdW1uKHRhYmxlTmFtZSwgc29ydENvbHVtbktleSk7XG5cbiAgICBpZiAoZmllbGRDb2x1bW4ucmVsYXRpb24pIHtcbiAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IGdldFRhYmxlRnJvbVJlbGF0aW9uQ29sdW1uKGZpZWxkQ29sdW1uLnJlbGF0aW9uKTtcbiAgICAgIGJ1aWxkZXIuam9pbihqb2luVGFibGUsIGAke3RhYmxlTmFtZX0uJHtmaWVsZENvbHVtbi5jb2x1bW59YCwgJz0nLCBmaWVsZENvbHVtbi5yZWxhdGlvbik7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBkYXRhYmFzZSBxdWVyeSBmcm9tIHN0b3JlZCB2aWV3IHJvbGVzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHJvbGVzIC1cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGaWx0ZXJSb2xlc1F1ZXJ5KHRhYmxlTmFtZSwgcm9sZXMsIGxvZ2ljRXhwcmVzc2lvbiA9ICcnKSB7XG4gIGNvbnN0IHJvbGVzSW5kZXhTZXQgPSB7fTtcblxuICByb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgcm9sZXNJbmRleFNldFtyb2xlLmluZGV4XSA9IGJ1aWxkUm9sZVF1ZXJ5KHRhYmxlTmFtZSwgcm9sZSk7XG4gIH0pO1xuICAvLyBMZXhlciBmb3IgbG9naWMgZXhwcmVzc2lvbi5cbiAgY29uc3QgbGV4ZXIgPSBuZXcgTGV4ZXIobG9naWNFeHByZXNzaW9uKTtcbiAgY29uc3QgdG9rZW5zID0gbGV4ZXIuZ2V0VG9rZW5zKCk7XG5cbiAgLy8gUGFyc2UgdGhlIGxvZ2ljIGV4cHJlc3Npb24uXG4gIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIodG9rZW5zKTtcbiAgY29uc3QgcGFyc2VkVHJlZSA9IHBhcnNlci5wYXJzZSgpO1xuXG4gIGNvbnN0IHF1ZXJ5UGFyc2VyID0gbmV3IFF1ZXJ5UGFyc2VyKHBhcnNlZFRyZWUsIHJvbGVzSW5kZXhTZXQpO1xuICByZXR1cm4gcXVlcnlQYXJzZXIucGFyc2UoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgZmlsdGVyIHF1ZXJ5IGZvciBxdWVyeSBidWlsZGVyLlxuICogQHBhcmFtIHtTdHJpbmd9IHRhYmxlTmFtZSAtXG4gKiBAcGFyYW0ge0FycmF5fSByb2xlcyAtXG4gKiBAcGFyYW0ge1N0cmluZ30gbG9naWNFeHByZXNzaW9uIC1cbiAqL1xuZXhwb3J0IGNvbnN0IGJ1aWxkRmlsdGVyUXVlcnkgPSAodGFibGVOYW1lLCByb2xlcywgbG9naWNFeHByZXNzaW9uKSA9PiB7XG4gIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgIGJ1aWxkRmlsdGVyUm9sZXNRdWVyeSh0YWJsZU5hbWUsIHJvbGVzLCBsb2dpY0V4cHJlc3Npb24pKGJ1aWxkZXIpO1xuICB9O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIHZpZXcgbG9naWMgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U3RyaW5nfSBsb2dpY0V4cHJlc3Npb24gLVxuICogQHBhcmFtIHtBcnJheX0gaW5kZXhlcyAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZpbHRlckxvZ2ljRXhwcmVzc2lvbihsb2dpY0V4cHJlc3Npb24sIGluZGV4ZXMpIHtcbiAgY29uc3QgbG9naWNFeHBJbmRleGVzID0gbG9naWNFeHByZXNzaW9uLm1hdGNoKC9cXGQrL2cpIHx8IFtdO1xuICByZXR1cm4gIWRpZmZlcmVuY2UobG9naWNFeHBJbmRleGVzLm1hcChOdW1iZXIpLCBpbmRleGVzKS5sZW5ndGg7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHZpZXcgcm9sZXMuXG4gKiBAcGFyYW0ge0FycmF5fSByb2xlcyAtXG4gKiBAcGFyYW0ge1N0cmluZ30gbG9naWNFeHByZXNzaW9uIC1cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVZpZXdSb2xlcyhyb2xlcywgbG9naWNFeHByZXNzaW9uKSB7XG4gIHJldHVybiB2YWxpZGF0ZUZpbHRlckxvZ2ljRXhwcmVzc2lvbihsb2dpY0V4cHJlc3Npb24sIHJvbGVzLm1hcCgocikgPT4gci5pbmRleCkpO1xufVxuXG4vKipcbiAqIE1hcGVzIHRoZSB2aWV3IHJvbGVzIHRvIHZpZXcgY29uZGl0aW9uYWxzLlxuICogQHBhcmFtIHtBcnJheX0gdmlld1JvbGVzIC1cbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHModmlld1JvbGVzKSB7XG4gIHJldHVybiB2aWV3Um9sZXMubWFwKCh2aWV3Um9sZSkgPT4gKHtcbiAgICBjb21wYXJhdG9yOiB2aWV3Um9sZS5jb21wYXJhdG9yLFxuICAgIHZhbHVlOiB2aWV3Um9sZS52YWx1ZSxcbiAgICBjb2x1bW5LZXk6IHZpZXdSb2xlLmZpZWxkLmtleSxcbiAgICBzbHVnOiB2aWV3Um9sZS5maWVsZC5zbHVnLFxuICAgIGluZGV4OiB2aWV3Um9sZS5pbmRleCxcbiAgfSkpO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBGaWx0ZXJSb2xlc1RvRHluYW1pY0ZpbHRlcihyb2xlcykge1xuICByZXR1cm4gcm9sZXMubWFwKChyb2xlKSA9PiAoe1xuICAgIC4uLnJvbGUsXG4gICAgY29sdW1uS2V5OiByb2xlLmZpZWxkS2V5LFxuICB9KSk7XG59XG5cbi8qKlxuICogQnVpbGRzIHNvcnQgY29sdW1uIHF1ZXJ5LlxuICogQHBhcmFtIHtTdHJpbmd9IHRhYmxlTmFtZSAtXG4gKiBAcGFyYW0ge1N0cmluZ30gY29sdW1uS2V5IC1cbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3J0RGlyZWN0aW9uIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU29ydENvbHVtblF1ZXJ5KHRhYmxlTmFtZSwgY29sdW1uS2V5LCBzb3J0RGlyZWN0aW9uKSB7XG4gIGNvbnN0IGZpZWxkUmVsYXRpb24gPSBnZXRSb2xlRmllbGRDb2x1bW4odGFibGVOYW1lLCBjb2x1bW5LZXkpO1xuICBjb25zdCBzb3J0Q29sdW1uID0gZmllbGRSZWxhdGlvbi5yZWxhdGlvbiB8fCBgJHt0YWJsZU5hbWV9LiR7ZmllbGRSZWxhdGlvbi5jb2x1bW59YDtcblxuICByZXR1cm4gKGJ1aWxkZXIpID0+IHtcbiAgICBidWlsZGVyLm9yZGVyQnkoc29ydENvbHVtbiwgc29ydERpcmVjdGlvbik7XG4gICAgYnVpbGRTb3J0Q29sdW1uSm9pbih0YWJsZU5hbWUsIGNvbHVtbktleSkoYnVpbGRlcik7XG4gIH07XG59IiwidmFyIG1hcCA9IHtcblx0XCIuL0FjY291bnRcIjogXCIuL3NyYy9tb2RlbHMvQWNjb3VudC5qc1wiLFxuXHRcIi4vQWNjb3VudC5qc1wiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50LmpzXCIsXG5cdFwiLi9BY2NvdW50QmFsYW5jZVwiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50QmFsYW5jZS5qc1wiLFxuXHRcIi4vQWNjb3VudEJhbGFuY2UuanNcIjogXCIuL3NyYy9tb2RlbHMvQWNjb3VudEJhbGFuY2UuanNcIixcblx0XCIuL0FjY291bnRUcmFuc2FjdGlvblwiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50VHJhbnNhY3Rpb24uanNcIixcblx0XCIuL0FjY291bnRUcmFuc2FjdGlvbi5qc1wiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50VHJhbnNhY3Rpb24uanNcIixcblx0XCIuL0FjY291bnRUeXBlXCI6IFwiLi9zcmMvbW9kZWxzL0FjY291bnRUeXBlLmpzXCIsXG5cdFwiLi9BY2NvdW50VHlwZS5qc1wiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50VHlwZS5qc1wiLFxuXHRcIi4vQXV0aFwiOiBcIi4vc3JjL21vZGVscy9BdXRoLmpzXCIsXG5cdFwiLi9BdXRoLmpzXCI6IFwiLi9zcmMvbW9kZWxzL0F1dGguanNcIixcblx0XCIuL0J1ZGdldFwiOiBcIi4vc3JjL21vZGVscy9CdWRnZXQuanNcIixcblx0XCIuL0J1ZGdldC5qc1wiOiBcIi4vc3JjL21vZGVscy9CdWRnZXQuanNcIixcblx0XCIuL0J1ZGdldEVudHJ5XCI6IFwiLi9zcmMvbW9kZWxzL0J1ZGdldEVudHJ5LmpzXCIsXG5cdFwiLi9CdWRnZXRFbnRyeS5qc1wiOiBcIi4vc3JjL21vZGVscy9CdWRnZXRFbnRyeS5qc1wiLFxuXHRcIi4vQ3VycmVuY3lcIjogXCIuL3NyYy9tb2RlbHMvQ3VycmVuY3kuanNcIixcblx0XCIuL0N1cnJlbmN5LmpzXCI6IFwiLi9zcmMvbW9kZWxzL0N1cnJlbmN5LmpzXCIsXG5cdFwiLi9DdXN0b21lclwiOiBcIi4vc3JjL21vZGVscy9DdXN0b21lci5qc1wiLFxuXHRcIi4vQ3VzdG9tZXIuanNcIjogXCIuL3NyYy9tb2RlbHMvQ3VzdG9tZXIuanNcIixcblx0XCIuL0RhdGVTZXNzaW9uXCI6IFwiLi9zcmMvbW9kZWxzL0RhdGVTZXNzaW9uLmpzXCIsXG5cdFwiLi9EYXRlU2Vzc2lvbi5qc1wiOiBcIi4vc3JjL21vZGVscy9EYXRlU2Vzc2lvbi5qc1wiLFxuXHRcIi4vRXhjaGFuZ2VSYXRlXCI6IFwiLi9zcmMvbW9kZWxzL0V4Y2hhbmdlUmF0ZS5qc1wiLFxuXHRcIi4vRXhjaGFuZ2VSYXRlLmpzXCI6IFwiLi9zcmMvbW9kZWxzL0V4Y2hhbmdlUmF0ZS5qc1wiLFxuXHRcIi4vRXhwZW5zZVwiOiBcIi4vc3JjL21vZGVscy9FeHBlbnNlLmpzXCIsXG5cdFwiLi9FeHBlbnNlLmpzXCI6IFwiLi9zcmMvbW9kZWxzL0V4cGVuc2UuanNcIixcblx0XCIuL0V4cGVuc2VDYXRlZ29yeVwiOiBcIi4vc3JjL21vZGVscy9FeHBlbnNlQ2F0ZWdvcnkuanNcIixcblx0XCIuL0V4cGVuc2VDYXRlZ29yeS5qc1wiOiBcIi4vc3JjL21vZGVscy9FeHBlbnNlQ2F0ZWdvcnkuanNcIixcblx0XCIuL0l0ZW1cIjogXCIuL3NyYy9tb2RlbHMvSXRlbS5qc1wiLFxuXHRcIi4vSXRlbS5qc1wiOiBcIi4vc3JjL21vZGVscy9JdGVtLmpzXCIsXG5cdFwiLi9JdGVtQ2F0ZWdvcnlcIjogXCIuL3NyYy9tb2RlbHMvSXRlbUNhdGVnb3J5LmpzXCIsXG5cdFwiLi9JdGVtQ2F0ZWdvcnkuanNcIjogXCIuL3NyYy9tb2RlbHMvSXRlbUNhdGVnb3J5LmpzXCIsXG5cdFwiLi9NYW51YWxKb3VybmFsXCI6IFwiLi9zcmMvbW9kZWxzL01hbnVhbEpvdXJuYWwuanNcIixcblx0XCIuL01hbnVhbEpvdXJuYWwuanNcIjogXCIuL3NyYy9tb2RlbHMvTWFudWFsSm91cm5hbC5qc1wiLFxuXHRcIi4vTWVkaWFcIjogXCIuL3NyYy9tb2RlbHMvTWVkaWEuanNcIixcblx0XCIuL01lZGlhLmpzXCI6IFwiLi9zcmMvbW9kZWxzL01lZGlhLmpzXCIsXG5cdFwiLi9NZWRpYUxpbmtcIjogXCIuL3NyYy9tb2RlbHMvTWVkaWFMaW5rLmpzXCIsXG5cdFwiLi9NZWRpYUxpbmsuanNcIjogXCIuL3NyYy9tb2RlbHMvTWVkaWFMaW5rLmpzXCIsXG5cdFwiLi9NZXRhYmxlXCI6IFwiLi9zcmMvbW9kZWxzL01ldGFibGUuanNcIixcblx0XCIuL01ldGFibGUuanNcIjogXCIuL3NyYy9tb2RlbHMvTWV0YWJsZS5qc1wiLFxuXHRcIi4vTW9kZWxcIjogXCIuL3NyYy9tb2RlbHMvTW9kZWwuanNcIixcblx0XCIuL01vZGVsLmpzXCI6IFwiLi9zcmMvbW9kZWxzL01vZGVsLmpzXCIsXG5cdFwiLi9PcHRpb25cIjogXCIuL3NyYy9tb2RlbHMvT3B0aW9uLmpzXCIsXG5cdFwiLi9PcHRpb24uanNcIjogXCIuL3NyYy9tb2RlbHMvT3B0aW9uLmpzXCIsXG5cdFwiLi9QYWdpbmF0aW9uXCI6IFwiLi9zcmMvbW9kZWxzL1BhZ2luYXRpb24uanNcIixcblx0XCIuL1BhZ2luYXRpb24uanNcIjogXCIuL3NyYy9tb2RlbHMvUGFnaW5hdGlvbi5qc1wiLFxuXHRcIi4vUGVybWlzc2lvblwiOiBcIi4vc3JjL21vZGVscy9QZXJtaXNzaW9uLmpzXCIsXG5cdFwiLi9QZXJtaXNzaW9uLmpzXCI6IFwiLi9zcmMvbW9kZWxzL1Blcm1pc3Npb24uanNcIixcblx0XCIuL1Jlc291cmNlXCI6IFwiLi9zcmMvbW9kZWxzL1Jlc291cmNlLmpzXCIsXG5cdFwiLi9SZXNvdXJjZS5qc1wiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZS5qc1wiLFxuXHRcIi4vUmVzb3VyY2VGaWVsZFwiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkLmpzXCIsXG5cdFwiLi9SZXNvdXJjZUZpZWxkLmpzXCI6IFwiLi9zcmMvbW9kZWxzL1Jlc291cmNlRmllbGQuanNcIixcblx0XCIuL1Jlc291cmNlRmllbGRNZXRhZGF0YVwiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkTWV0YWRhdGEuanNcIixcblx0XCIuL1Jlc291cmNlRmllbGRNZXRhZGF0YS5qc1wiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkTWV0YWRhdGEuanNcIixcblx0XCIuL1JvbGVcIjogXCIuL3NyYy9tb2RlbHMvUm9sZS5qc1wiLFxuXHRcIi4vUm9sZS5qc1wiOiBcIi4vc3JjL21vZGVscy9Sb2xlLmpzXCIsXG5cdFwiLi9TZXR0aW5nXCI6IFwiLi9zcmMvbW9kZWxzL1NldHRpbmcuanNcIixcblx0XCIuL1NldHRpbmcuanNcIjogXCIuL3NyYy9tb2RlbHMvU2V0dGluZy5qc1wiLFxuXHRcIi4vVGVuYW50TW9kZWxcIjogXCIuL3NyYy9tb2RlbHMvVGVuYW50TW9kZWwuanNcIixcblx0XCIuL1RlbmFudE1vZGVsLmpzXCI6IFwiLi9zcmMvbW9kZWxzL1RlbmFudE1vZGVsLmpzXCIsXG5cdFwiLi9UZW5hbnRVc2VyXCI6IFwiLi9zcmMvbW9kZWxzL1RlbmFudFVzZXIuanNcIixcblx0XCIuL1RlbmFudFVzZXIuanNcIjogXCIuL3NyYy9tb2RlbHMvVGVuYW50VXNlci5qc1wiLFxuXHRcIi4vVmVuZG9yXCI6IFwiLi9zcmMvbW9kZWxzL1ZlbmRvci5qc1wiLFxuXHRcIi4vVmVuZG9yLmpzXCI6IFwiLi9zcmMvbW9kZWxzL1ZlbmRvci5qc1wiLFxuXHRcIi4vVmlld1wiOiBcIi4vc3JjL21vZGVscy9WaWV3LmpzXCIsXG5cdFwiLi9WaWV3LmpzXCI6IFwiLi9zcmMvbW9kZWxzL1ZpZXcuanNcIixcblx0XCIuL1ZpZXdDb2x1bW5cIjogXCIuL3NyYy9tb2RlbHMvVmlld0NvbHVtbi5qc1wiLFxuXHRcIi4vVmlld0NvbHVtbi5qc1wiOiBcIi4vc3JjL21vZGVscy9WaWV3Q29sdW1uLmpzXCIsXG5cdFwiLi9WaWV3Um9sZVwiOiBcIi4vc3JjL21vZGVscy9WaWV3Um9sZS5qc1wiLFxuXHRcIi4vVmlld1JvbGUuanNcIjogXCIuL3NyYy9tb2RlbHMvVmlld1JvbGUuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi9zcmMvbW9kZWxzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLiokXCI7IiwiLyogZXNsaW50LWRpc2FibGUgZ2xvYmFsLXJlcXVpcmUgKi9cbmltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5pbXBvcnQge1xuICBidWlsZEZpbHRlclF1ZXJ5LFxuICBidWlsZFNvcnRDb2x1bW5RdWVyeSxcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5pbXBvcnQgQ2FjaGFibGVRdWVyeUJ1aWxkZXIgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVRdWVyeUJ1aWxkZXInO1xuaW1wb3J0IENhY2hhYmxlTW9kZWwgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVNb2RlbCc7XG5pbXBvcnQgeyBmbGF0VG9OZXN0ZWRBcnJheSB9IGZyb20gJ0AvdXRpbHMnO1xuaW1wb3J0IERlcGVuZGVuY3lHcmFwaCBmcm9tICdAL2xpYi9EZXBlbmRlbmN5R3JhcGgnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2NvdW50IGV4dGVuZHMgbWl4aW4oVGVuYW50TW9kZWwsIFtDYWNoYWJsZU1vZGVsXSkge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdhY2NvdW50cyc7XG4gIH1cblxuICAvKipcbiAgICogVGltZXN0YW1wcyBjb2x1bW5zLlxuICAgKi9cbiAgc3RhdGljIGdldCB0aW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRlbmQgcXVlcnkgYnVpbGRlciBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBnZXQgUXVlcnlCdWlsZGVyKCkge1xuICAgIHJldHVybiBDYWNoYWJsZVF1ZXJ5QnVpbGRlcjtcbiAgfVxuXG4gIHN0YXRpYyBnZXQganNvblNjaGVtYSAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAvLyBpZDoge3R5cGU6ICdpbnRlZ2VyJ30sXG4gICAgICAgIC8vIGJpcnRoZGF5OiB7dHlwZTogWydkYXRldGltZScsICdudWxsJ119LFxuICAgICAgICBjcmVhdGVkX2F0OiB7dHlwZTogJ2RhdGV0aW1lJ30sXG4gICAgICAgIC8vIHVwZGF0ZWQ6IHt0eXBlOiBbJ2RhdGV0aW1lJywgJ251bGwnXX1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJldHVybiBvdmVycmlkZS5cbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIFxuICAgKi9cbiAgc3RhdGljIHF1ZXJ5KC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gc3VwZXIucXVlcnkoLi4uYXJncykucnVuQWZ0ZXIoKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0RlcEdyYXBoID9cbiAgICAgICAgICBBY2NvdW50LnRvRGVwZW5kZW5jeUdyYXBoKHJlc3VsdCkgOlxuICAgICAgICAgIHRoaXMuY29sbGVjdGlvbi5mcm9tKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIGFycmF5IHJlc3VsdCB0byBkZXBlbmRlbmN5IGdyYXBoLlxuICAgKi9cbiAgc3RhdGljIGRlcEdyYXBoKCkge1xuICAgIHRoaXMuaXNEZXBHcmFwaCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTW9kZWwgbW9kaWZpZXJzLlxuICAgKi9cbiAgc3RhdGljIGdldCBtb2RpZmllcnMoKSB7XG4gICAgY29uc3QgVEFCTEVfTkFNRSA9IEFjY291bnQudGFibGVOYW1lO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlckFjY291bnRzKHF1ZXJ5LCBhY2NvdW50SWRzKSB7XG4gICAgICAgIGlmIChhY2NvdW50SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBxdWVyeS53aGVyZUluKGAke1RBQkxFX05BTUV9LmlkYCwgYWNjb3VudElkcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXJBY2NvdW50VHlwZXMocXVlcnksIHR5cGVzSWRzKSB7XG4gICAgICAgIGlmICh0eXBlc0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmVJbignYWNjb3VudF90eXBlcy5hY2NvdW5fdHlwZV9pZCcsIHR5cGVzSWRzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHZpZXdSb2xlc0J1aWxkZXIocXVlcnksIGNvbmRpdGlvbmFscywgZXhwcmVzc2lvbikge1xuICAgICAgICBidWlsZEZpbHRlclF1ZXJ5KEFjY291bnQudGFibGVOYW1lLCBjb25kaXRpb25hbHMsIGV4cHJlc3Npb24pKHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgICBzb3J0Q29sdW1uQnVpbGRlcihxdWVyeSwgY29sdW1uS2V5LCBkaXJlY3Rpb24pIHtcbiAgICAgICAgYnVpbGRTb3J0Q29sdW1uUXVlcnkoQWNjb3VudC50YWJsZU5hbWUsIGNvbHVtbktleSwgZGlyZWN0aW9uKShxdWVyeSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgQWNjb3VudFR5cGUgPSByZXF1aXJlKCdAL21vZGVscy9BY2NvdW50VHlwZScpO1xuICAgIGNvbnN0IEFjY291bnRCYWxhbmNlID0gcmVxdWlyZSgnQC9tb2RlbHMvQWNjb3VudEJhbGFuY2UnKTtcbiAgICBjb25zdCBBY2NvdW50VHJhbnNhY3Rpb24gPSByZXF1aXJlKCdAL21vZGVscy9BY2NvdW50VHJhbnNhY3Rpb24nKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIEFjY291bnQgbW9kZWwgbWF5IGJlbG9uZ3MgdG8gYWNjb3VudCB0eXBlLlxuICAgICAgICovXG4gICAgICB0eXBlOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnRUeXBlLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2FjY291bnRzLmFjY291bnRUeXBlSWQnLFxuICAgICAgICAgIHRvOiAnYWNjb3VudF90eXBlcy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFjY291bnQgbW9kZWwgbWF5IGhhcyBtYW55IGJhbGFuY2VzIGFjY291bnRzLlxuICAgICAgICovXG4gICAgICBiYWxhbmNlOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5IYXNPbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnRCYWxhbmNlLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRfYmFsYW5jZXMuYWNjb3VudElkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQWNjb3VudCBtb2RlbCBtYXkgaGFzIG1hbnkgdHJhbnNhY3Rpb25zLlxuICAgICAgICovXG4gICAgICB0cmFuc2FjdGlvbnM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkhhc01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnRUcmFuc2FjdGlvbi5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdhY2NvdW50cy5pZCcsXG4gICAgICAgICAgdG86ICdhY2NvdW50c190cmFuc2FjdGlvbnMuYWNjb3VudElkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBjb2xsZWN0Sm91cm5hbEVudHJpZXMoYWNjb3VudHMpIHtcbiAgICByZXR1cm4gZmxhdHRlbihhY2NvdW50cy5tYXAoKGFjY291bnQpID0+IGFjY291bnQudHJhbnNhY3Rpb25zLm1hcCgodHJhbnNhY3Rpb24pID0+ICh7XG4gICAgICBhY2NvdW50SWQ6IGFjY291bnQuaWQsXG4gICAgICAuLi50cmFuc2FjdGlvbixcbiAgICAgIGFjY291bnROb3JtYWw6IGFjY291bnQudHlwZS5ub3JtYWwsXG4gICAgfSkpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgZmxhdHRlbiBhY2NvdW50cyBsaXN0IHRvIG5lc3RlZCBhcnJheS4gXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFjY291bnRzIFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBcbiAgICovXG4gIHN0YXRpYyB0b05lc3RlZEFycmF5KGFjY291bnRzLCBvcHRpb25zID0geyBjaGlsZHJlbjogJ2NoaWxkcmVuJyB9KSB7XG4gICAgcmV0dXJuIGZsYXRUb05lc3RlZEFycmF5KGFjY291bnRzLCB7IGlkOiAnaWQnLCBwYXJlbnRJZDogJ3BhcmVudEFjY291bnRJZCcgfSlcbiAgfVxuXG4gIHN0YXRpYyB0b0RlcGVuZGVuY3lHcmFwaChhY2NvdW50cykge1xuICAgIHJldHVybiBEZXBlbmRlbmN5R3JhcGguZnJvbUFycmF5KFxuICAgICAgYWNjb3VudHMsIHsgaXRlbUlkOiAnaWQnLCBwYXJlbnRJdGVtSWQ6ICdwYXJlbnRBY2NvdW50SWQnIH1cbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2NvdW50QmFsYW5jZSBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnYWNjb3VudF9iYWxhbmNlcyc7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgQWNjb3VudCA9IHJlcXVpcmUoJ0AvbW9kZWxzL0FjY291bnQnKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY2NvdW50OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnYWNjb3VudF9iYWxhbmNlcy5hY2NvdW50X2lkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIG1peGluIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5pbXBvcnQgQ2FjaGFibGVRdWVyeUJ1aWxkZXIgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVRdWVyeUJ1aWxkZXInO1xuaW1wb3J0IENhY2hhYmxlTW9kZWwgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVNb2RlbCc7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNjb3VudFRyYW5zYWN0aW9uIGV4dGVuZHMgbWl4aW4oVGVuYW50TW9kZWwsIFtDYWNoYWJsZU1vZGVsXSkge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdhY2NvdW50c190cmFuc2FjdGlvbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcHMgY29sdW1ucy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gWydjcmVhdGVkQXQnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRlbmQgcXVlcnkgYnVpbGRlciBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBnZXQgUXVlcnlCdWlsZGVyKCkge1xuICAgIHJldHVybiBDYWNoYWJsZVF1ZXJ5QnVpbGRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBtb2RpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IG1vZGlmaWVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyQWNjb3VudHMocXVlcnksIGFjY291bnRzSWRzKSB7XG4gICAgICAgIGlmIChhY2NvdW50c0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmVJbignYWNjb3VudF9pZCcsIGFjY291bnRzSWRzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbHRlclRyYW5zYWN0aW9uVHlwZXMocXVlcnksIHR5cGVzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGVzKSAmJiB0eXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmVJbigncmVmZXJlbmNlX3R5cGUnLCB0eXBlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKCdyZWZlcmVuY2VfdHlwZScsIHR5cGVzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbHRlckRhdGVSYW5nZShxdWVyeSwgc3RhcnREYXRlLCBlbmREYXRlLCB0eXBlID0gJ2RheScpIHtcbiAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9ICdZWVlZLU1NLUREIEhIOm1tOnNzJztcbiAgICAgICAgY29uc3QgZnJvbURhdGUgPSBtb21lbnQoc3RhcnREYXRlKS5zdGFydE9mKHR5cGUpLmZvcm1hdChkYXRlRm9ybWF0KTtcbiAgICAgICAgY29uc3QgdG9EYXRlID0gbW9tZW50KGVuZERhdGUpLmVuZE9mKHR5cGUpLmZvcm1hdChkYXRlRm9ybWF0KTtcblxuICAgICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUoJ2RhdGUnLCAnPj0nLCBmcm9tRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZERhdGUpIHtcbiAgICAgICAgICBxdWVyeS53aGVyZSgnZGF0ZScsICc8PScsIHRvRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXJBbW91bnRSYW5nZShxdWVyeSwgZnJvbUFtb3VudCwgdG9BbW91bnQpIHtcbiAgICAgICAgaWYgKGZyb21BbW91bnQpIHtcbiAgICAgICAgICBxdWVyeS5hbmRXaGVyZSgocSkgPT4ge1xuICAgICAgICAgICAgcS53aGVyZSgnY3JlZGl0JywgJz49JywgZnJvbUFtb3VudCk7XG4gICAgICAgICAgICBxLm9yV2hlcmUoJ2RlYml0JywgJz49JywgZnJvbUFtb3VudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvQW1vdW50KSB7XG4gICAgICAgICAgcXVlcnkuYW5kV2hlcmUoKHEpID0+IHtcbiAgICAgICAgICAgIHEud2hlcmUoJ2NyZWRpdCcsICc8PScsIHRvQW1vdW50KTtcbiAgICAgICAgICAgIHEub3JXaGVyZSgnZGViaXQnLCAnPD0nLCB0b0Ftb3VudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzdW1hdGlvbkNyZWRpdERlYml0KHF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5LnN1bSgnY3JlZGl0IGFzIGNyZWRpdCcpO1xuICAgICAgICBxdWVyeS5zdW0oJ2RlYml0IGFzIGRlYml0Jyk7XG4gICAgICAgIHF1ZXJ5Lmdyb3VwQnkoJ2FjY291bnRfaWQnKTtcbiAgICAgIH0sXG4gICAgICBmaWx0ZXJDb250YWN0VHlwZShxdWVyeSwgY29udGFjdFR5cGUpIHtcbiAgICAgICAgcXVlcnkud2hlcmUoJ2NvbnRhY3RfdHlwZScsIGNvbnRhY3RUeXBlKTtcbiAgICAgIH0sXG4gICAgICBmaWx0ZXJDb250YWN0SWRzKHF1ZXJ5LCBjb250YWN0SWRzKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlSW4oJ2NvbnRhY3RfaWQnLCBjb250YWN0SWRzKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBBY2NvdW50ID0gcmVxdWlyZSgnQC9tb2RlbHMvQWNjb3VudCcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnQ6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoQWNjb3VudC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdhY2NvdW50c190cmFuc2FjdGlvbnMuYWNjb3VudElkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiLy8gaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBNb2RlbCwgbWl4aW4gfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCBDYWNoYWJsZU1vZGVsIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2NvdW50VHlwZSBleHRlbmRzIG1peGluKFRlbmFudE1vZGVsLCBbQ2FjaGFibGVNb2RlbF0pIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnYWNjb3VudF90eXBlcyc7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgQWNjb3VudCA9IHJlcXVpcmUoJ0AvbW9kZWxzL0FjY291bnQnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIEFjY291bnQgdHlwZSBtYXkgaGFzIG1hbnkgYXNzb2NpYXRlZCBhY2NvdW50cy5cbiAgICAgICAqL1xuICAgICAgYWNjb3VudHM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkhhc01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnYWNjb3VudF90eXBlcy5pZCcsXG4gICAgICAgICAgdG86ICdhY2NvdW50cy5hY2NvdW50VHlwZUlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdXRoIHtcbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHVzZXIoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYXV0aGVudGljYXRlZCB1c2VyLlxuICAgKiBAcGFyYW0ge1VzZXJ9IHVzZXJcbiAgICovXG4gIHN0YXRpYyBzZXRBdXRoZW50aWNhdGVkVXNlcih1c2VyKSB7XG4gICAgdGhpcy51c2VyID0gdXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgYXV0aGVudGljYXRlZCB1c2VyIElELlxuICAgKi9cbiAgc3RhdGljIHVzZXJJZCgpIHtcbiAgICBpZiAoIXRoaXMudXNlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51c2VyLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHVzZXIgaXMgbG9nZ2VkIG9yIG5vdC5cbiAgICovXG4gIHN0YXRpYyBpc0xvZ2dlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLnVzZXI7XG4gIH1cblxuICBzdGF0aWMgbG9nZ2VkT3V0KCkge1xuICAgIHRoaXMudXNlciA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9Nb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJ1ZGdldCBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnYnVkZ2V0cyc7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHZpcnR1YWxBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ3JhbmdlQnknLCAncmFuZ2VJbmNyZW1lbnQnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBtb2RpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IG1vZGlmaWVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyQnlZZWFyKHF1ZXJ5LCB5ZWFyKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKCd5ZWFyJywgeWVhcik7XG4gICAgICB9LFxuICAgICAgZmlsdGVyQnlJbmNvbWVTdGF0ZW1lbnQocXVlcnkpIHtcbiAgICAgICAgcXVlcnkud2hlcmUoJ2FjY291bnRfdHlwZXMnLCAnaW5jb21lX3N0YXRlbWVudCcpO1xuICAgICAgfSxcbiAgICAgIGZpbHRlckJ5UHJvZml0TG9zcyhxdWVyeSkge1xuICAgICAgICBxdWVyeS53aGVyZSgnYWNjb3VudHNfdHlwZXMnLCAncHJvZml0X2xvc3MnKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGdldCByYW5nZUJ5KCkge1xuICAgIHN3aXRjaCAodGhpcy5wZXJpb2QpIHtcbiAgICAgIGNhc2UgJ2hhbGYteWVhcic6XG4gICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgcmV0dXJuICdtb250aCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5wZXJpb2Q7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJhbmdlSW5jcmVtZW50KCkge1xuICAgIHN3aXRjaCAodGhpcy5wZXJpb2QpIHtcbiAgICAgIGNhc2UgJ2hhbGYteWVhcic6XG4gICAgICAgIHJldHVybiA2O1xuICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgIHJldHVybiAzO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJhbmdlT2Zmc2V0KCkge1xuICAgIHN3aXRjaCAodGhpcy5wZXJpb2QpIHtcbiAgICAgIGNhc2UgJ2hhbGYteWVhcic6IHJldHVybiA1O1xuICAgICAgY2FzZSAncXVhcnRlcic6IHJldHVybiAyO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIDA7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdWRnZXQgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ2J1ZGdldF9lbnRyaWVzJztcbiAgfVxufVxuIiwiaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3VycmVuY3kgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ2N1cnJlbmNpZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcHMgY29sdW1ucy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gWydjcmVhdGVkQXQnLCAndXBkYXRlZEF0J107XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1c3RvbWVyIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdjdXN0b21lcnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGVsIHRpbWVzdGFtcHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIFsnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCddO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGVsIG1vZGlmaWVycy5cbiAgICovXG4gIHN0YXRpYyBnZXQgbW9kaWZpZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJDdXN0b21lcklkcyhxdWVyeSwgY3VzdG9tZXJJZHMpIHtcbiAgICAgICAgcXVlcnkud2hlcmVJbignaWQnLCBjdXN0b21lcklkcyk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGRlZmF1bHQgKE1vZGVsKSA9PiB7XG4gIHJldHVybiBjbGFzcyBEYXRlU2Vzc2lvbiBleHRlbmRzIE1vZGVsIHtcblxuICAgIHN0YXRpYyBnZXQgdGltZXN0YW1wcygpIHtcbiAgICAgIHJldHVybiBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgICB9XG5cbiAgICAkYmVmb3JlVXBkYXRlKG9wdCwgY29udGV4dCkge1xuICAgICAgY29uc3QgbWF5YmVQcm9taXNlID0gc3VwZXIuJGJlZm9yZVVwZGF0ZShvcHQsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChEYXRlU2Vzc2lvbi50aW1lc3RhbXBzWzFdKSB7XG4gICAgICAgICAgdGhpc1tEYXRlU2Vzc2lvbi50aW1lc3RhbXBzWzFdXSA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAkYmVmb3JlSW5zZXJ0KGNvbnRleHQpIHtcbiAgICAgIGNvbnN0IG1heWJlUHJvbWlzZSA9IHN1cGVyLiRiZWZvcmVJbnNlcnQoY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKERhdGVTZXNzaW9uLnRpbWVzdGFtcHNbMF0pIHtcbiAgICAgICAgICB0aGlzW0RhdGVTZXNzaW9uLnRpbWVzdGFtcHNbMF1dID0gbW9tZW50KCkuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSIsImltcG9ydCBiY3J5cHQgZnJvbSAnYmNyeXB0anMnO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXhjaGFuZ2VSYXRlIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnZXhjaGFuZ2VfcmF0ZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcHMgY29sdW1ucy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gWydjcmVhdGVkQXQnLCAndXBkYXRlZEF0J107XG4gIH1cbn0iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IHsgdmlld1JvbGVzQnVpbGRlciB9IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHBlbnNlIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdleHBlbnNlc190cmFuc2FjdGlvbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY291bnQgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIHR5cGUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlZmVyZW5jZVR5cGUoKSB7XG4gICAgcmV0dXJuICdFeHBlbnNlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCB0aW1lc3RhbXBzLlxuICAgKi9cbiAgc3RhdGljIGdldCB0aW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBtb2RpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IG1vZGlmaWVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyQnlEYXRlUmFuZ2UocXVlcnksIHN0YXJ0RGF0ZSwgZW5kRGF0ZSkge1xuICAgICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUoJ2RhdGUnLCAnPj0nLCBzdGFydERhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmREYXRlKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUoJ2RhdGUnLCAnPD0nLCBlbmREYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbHRlckJ5QW1vdW50UmFuZ2UocXVlcnksIGZyb20sIHRvKSB7XG4gICAgICAgIGlmIChmcm9tKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUoJ2Ftb3VudCcsICc+PScsIGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0bykge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKCdhbW91bnQnLCAnPD0nLCB0byk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXJCeUV4cGVuc2VBY2NvdW50KHF1ZXJ5LCBhY2NvdW50SWQpIHtcbiAgICAgICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKCdleHBlbnNlX2FjY291bnRfaWQnLCBhY2NvdW50SWQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZmlsdGVyQnlQYXltZW50QWNjb3VudChxdWVyeSwgYWNjb3VudElkKSB7XG4gICAgICAgIGlmIChhY2NvdW50SWQpIHtcbiAgICAgICAgICBxdWVyeS53aGVyZSgncGF5bWVudF9hY2NvdW50X2lkJywgYWNjb3VudElkKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgdmlld1JvbGVzQnVpbGRlcihxdWVyeSwgY29uZGl0aW9uYWxzLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHZpZXdSb2xlc0J1aWxkZXIoY29uZGl0aW9uYWxzLCBleHByZXNzaW9uKShxdWVyeSk7XG4gICAgICB9LFxuXG4gICAgICBvcmRlckJ5KHF1ZXJ5KSB7XG4gICAgICAgIFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgQWNjb3VudCA9IHJlcXVpcmUoJ0AvbW9kZWxzL0FjY291bnQnKTtcbiAgICBjb25zdCBVc2VyID0gcmVxdWlyZSgnQC9tb2RlbHMvVGVuYW50VXNlcicpO1xuICAgIGNvbnN0IEV4cGVuc2VDYXRlZ29yeSA9IHJlcXVpcmUoJ0AvbW9kZWxzL0V4cGVuc2VDYXRlZ29yeScpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBwYXltZW50QWNjb3VudDoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChBY2NvdW50LmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2V4cGVuc2VzX3RyYW5zYWN0aW9ucy5wYXltZW50QWNjb3VudElkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjYXRlZ29yaWVzOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5IYXNNYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChFeHBlbnNlQ2F0ZWdvcnkuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnZXhwZW5zZXNfdHJhbnNhY3Rpb25zLmlkJyxcbiAgICAgICAgICB0bzogJ2V4cGVuc2VfdHJhbnNhY3Rpb25fY2F0ZWdvcmllcy5leHBlbnNlSWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoVXNlci5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdleHBlbnNlc190cmFuc2FjdGlvbnMudXNlcklkJyxcbiAgICAgICAgICB0bzogJ3VzZXJzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXhwZW5zZUNhdGVnb3J5IGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdleHBlbnNlX3RyYW5zYWN0aW9uX2NhdGVnb3JpZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IEFjY291bnQgPSByZXF1aXJlKCdAL21vZGVscy9BY2NvdW50Jyk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGVuc2VBY2NvdW50OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnZXhwZW5zZV90cmFuc2FjdGlvbl9jYXRlZ29yaWVzLmV4cGVuc2VBY2NvdW50SWQnLFxuICAgICAgICAgIHRvOiAnYWNjb3VudHMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IHtcbiAgYnVpbGRGaWx0ZXJRdWVyeSxcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEl0ZW0gZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ2l0ZW1zJztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCB0aW1lc3RhbXBzLlxuICAgKi9cbiAgc3RhdGljIGdldCB0aW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBtb2RpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IG1vZGlmaWVycygpIHtcbiAgICBjb25zdCBUQUJMRV9OQU1FID0gSXRlbS50YWJsZU5hbWU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc29ydEJ5KHF1ZXJ5LCBjb2x1bW5Tb3J0LCBzb3J0RGlyZWN0aW9uKSB7XG4gICAgICAgIHF1ZXJ5Lm9yZGVyQnkoY29sdW1uU29ydCwgc29ydERpcmVjdGlvbik7XG4gICAgICB9LFxuICAgICAgdmlld1JvbGVzQnVpbGRlcihxdWVyeSwgY29uZGl0aW9ucywgbG9naWNFeHByZXNzaW9uKSB7XG4gICAgICAgIGJ1aWxkRmlsdGVyUXVlcnkoSXRlbS50YWJsZU5hbWUsIGNvbmRpdGlvbnMsIGxvZ2ljRXhwcmVzc2lvbikocXVlcnkpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IE1lZGlhID0gcmVxdWlyZSgnQC9tb2RlbHMvTWVkaWEnKTtcbiAgICBjb25zdCBBY2NvdW50ID0gcmVxdWlyZSgnQC9tb2RlbHMvQWNjb3VudCcpO1xuICAgIGNvbnN0IEl0ZW1DYXRlZ29yeSA9IHJlcXVpcmUoJ0AvbW9kZWxzL0l0ZW1DYXRlZ29yeScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogSXRlbSBtYXkgYmVsb25ncyB0byBjYXRlb2dvcnkgbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEl0ZW1DYXRlZ29yeS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdpdGVtcy5jYXRlZ29yeUlkJyxcbiAgICAgICAgICB0bzogJ2l0ZW1zX2NhdGVnb3JpZXMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgY29zdEFjY291bnQ6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoQWNjb3VudC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdpdGVtcy5jb3N0QWNjb3VudElkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHNlbGxBY2NvdW50OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnaXRlbXMuc2VsbEFjY291bnRJZCcsXG4gICAgICAgICAgdG86ICdhY2NvdW50cy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBpbnZlbnRvcnlBY2NvdW50OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnaXRlbXMuaW52ZW50b3J5QWNjb3VudElkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIG1lZGlhOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5NYW55VG9NYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChNZWRpYS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdpdGVtcy5pZCcsXG4gICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgZnJvbTogJ21lZGlhX2xpbmtzLm1vZGVsX2lkJyxcbiAgICAgICAgICAgIHRvOiAnbWVkaWFfbGlua3MubWVkaWFfaWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86ICdtZWRpYS5pZCcsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJdGVtQ2F0ZWdvcnkgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdpdGVtc19jYXRlZ29yaWVzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBJdGVtID0gcmVxdWlyZSgnQC9tb2RlbHMvSXRlbScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogSXRlbSBjYXRlZ29yeSBtYXkgaGFzIG1hbnkgaXRlbXMuXG4gICAgICAgKi9cbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5IYXNNYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChJdGVtLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2l0ZW1zX2NhdGVnb3JpZXMuaWQnLFxuICAgICAgICAgIHRvOiAnaXRlbXMuY2F0ZWdvcnlJZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hbnVhbEpvdXJuYWwgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdtYW51YWxfam91cm5hbHMnO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGVsIHRpbWVzdGFtcHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIFsnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCddO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IE1lZGlhID0gcmVxdWlyZSgnQC9tb2RlbHMvTWVkaWEnKTtcblxuICAgIHJldHVybiB7XG4gICAgICBtZWRpYToge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuTWFueVRvTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoTWVkaWEuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnbWFudWFsX2pvdXJuYWxzLmlkJyxcbiAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICBmcm9tOiAnbWVkaWFfbGlua3MubW9kZWxfaWQnLFxuICAgICAgICAgICAgdG86ICdtZWRpYV9saW5rcy5tZWRpYV9pZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogJ21lZGlhLmlkJyxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lZGlhIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdtZWRpYSc7XG4gIH1cbn1cbiIsImltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lZGlhTGluayBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnbWVkaWFfbGlua3MnO1xuICB9XG59XG4iLCJpbXBvcnQga25leCBmcm9tICdAL2RhdGFiYXNlL2tuZXgnO1xuLy8gaW1wb3J0IGNhY2hlIGZyb20gJ21lbW9yeS1jYWNoZSc7XG5cbi8vIE1ldGFkYXRhXG5leHBvcnQgZGVmYXVsdCB7XG4gIE1FVEFEQVRBX0dST1VQOiAnZGVmYXVsdCcsXG4gIEtFWV9DT0xVTU46ICdrZXknLFxuICBWQUxVRV9DT0xVTU46ICd2YWx1ZScsXG4gIFRZUEVfQ09MVU1OOiAndHlwZScsXG5cbiAgZXh0cmFDb2x1bW5zOiBbXSxcbiAgbWV0YWRhdGE6IFtdLFxuICBzaG91bGRSZWxvYWQ6IHRydWUsXG4gIGV4dHJhTWV0YWRhdGFRdWVyeTogKCkgPT4ge30sXG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsdWUgY29sdW1uIGtleSB0byBxdWVyeSBmcm9tLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtXG4gICAqL1xuICBzZXRLZXlDb2x1bW5OYW1lKG5hbWUpIHtcbiAgICB0aGlzLktFWV9DT0xVTU4gPSBuYW1lO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGtleSBjb2x1bW4gbmFtZSB0byBxdWVyeSBmcm9tLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtXG4gICAqL1xuICBzZXRWYWx1ZUNvbHVtbk5hbWUobmFtZSkge1xuICAgIHRoaXMuVkFMVUVfQ09MVU1OID0gbmFtZTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0IGV4dHJhIGNvbHVtbnMgdG8gYmUgYWRkZWQgdG8gdGhlIHJvd3MuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnMgLVxuICAgKi9cbiAgc2V0RXh0cmFDb2x1bW5zKGNvbHVtbnMpIHtcbiAgICB0aGlzLmV4dHJhQ29sdW1ucyA9IGNvbHVtbnM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE1ldGFkYXRhIGRhdGFiYXNlIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge09iamVjdH0gcXVlcnkgLVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZ3JvdXBOYW1lIC1cbiAgICovXG4gIHdoZXJlUXVlcnkocXVlcnksIGtleSkge1xuICAgIGNvbnN0IGdyb3VwTmFtZSA9IHRoaXMuTUVUQURBVEFfR1JPVVA7XG5cbiAgICBpZiAoZ3JvdXBOYW1lKSB7XG4gICAgICBxdWVyeS53aGVyZSgnZ3JvdXAnLCBncm91cE5hbWUpO1xuICAgIH1cbiAgICBpZiAoa2V5KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlSW4oJ2tleScsIGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS53aGVyZSgna2V5Jywga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSBzdG9yYWdlLlxuICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0ga2V5IC1cbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZSAtXG4gICAqL1xuICBhc3luYyBsb2FkKGZvcmNlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5zaG91bGRSZWxvYWQgfHwgZm9yY2UpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhQ29sbGVjdGlvbiA9IGF3YWl0IHRoaXMucXVlcnkoKHF1ZXJ5KSA9PiB7XG4gICAgICAgIHRoaXMud2hlcmVRdWVyeShxdWVyeSk7XG4gICAgICAgIHRoaXMuZXh0cmFNZXRhZGF0YVF1ZXJ5KHF1ZXJ5KTtcbiAgICAgIH0pLmZldGNoQWxsKCk7XG5cbiAgICAgIHRoaXMuc2hvdWxkUmVsb2FkID0gZmFsc2U7XG4gICAgICB0aGlzLm1ldGFkYXRhID0gW107XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhQXJyYXkgPSB0aGlzLm1hcE1ldGFkYXRhQ29sbGVjdGlvbihtZXRhZGF0YUNvbGxlY3Rpb24pO1xuICAgICAgbWV0YWRhdGFBcnJheS5mb3JFYWNoKChtZXRhZGF0YSkgPT4geyB0aGlzLm1ldGFkYXRhLnB1c2gobWV0YWRhdGEpOyB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYWxsIHRoZSBtZXRhZGF0YSB0aGF0IGFzc29jaWF0ZSB3aXRoIHRoZSBjdXJyZW50IGdyb3VwLlxuICAgKi9cbiAgYXN5bmMgYWxsTWV0YShmb3JjZSA9IGZhbHNlKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkKGZvcmNlKTtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogRmluZCB0aGUgZ2l2ZW4gbWV0YWRhdGEga2V5LlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IC1cbiAgICogQHJldHVybiB7b2JqZWN0fSAtIE1ldGFkYXRhIG9iamVjdC5cbiAgICovXG4gIGZpbmRNZXRhKGtleSkge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLmZpbmQoKG1ldGEpID0+IG1ldGEua2V5ID09PSBrZXkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgbWV0YWRhdGEgb2YgdGhlIGN1cnJlbnQgZ3JvdXAuXG4gICAqIEBwYXJhbSB7Kn0ga2V5IC1cbiAgICovXG4gIGFzeW5jIGdldE1ldGEoa2V5LCBkZWZhdWx0VmFsdWUsIGZvcmNlID0gZmFsc2UpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWQoZm9yY2UpO1xuXG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmZpbmRNZXRhKGtleSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhID8gbWV0YWRhdGEudmFsdWUgOiBkZWZhdWx0VmFsdWUgfHwgZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE1hcmtlcyB0aGUgbWV0YWRhdGEgdG8gc2hvdWxkIGJlIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlTWV0YShrZXkpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZmluZE1ldGEoa2V5KTtcblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgbWV0YWRhdGEubWFya0FzRGVsZXRlZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuc2hvdWxkUmVsb2FkID0gdHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBtZXRhIGRhdGEgb2YgdGhlIGdpdmVuIGdyb3VwLlxuICAgKiBAcGFyYW0geyp9IGdyb3VwXG4gICAqL1xuICByZW1vdmVBbGxNZXRhKGdyb3VwID0gJ2RlZmF1bHQnKSB7XG4gICAgdGhpcy5tZXRkYXRhLm1hcCgobWV0YSkgPT4gKHtcbiAgICAgIC4uLihtZXRhLmdyb3VwICE9PSBncm91cCkgPyB7IG1hcmtBc0RlbGV0ZWQ6IHRydWUgfSA6IHt9LFxuICAgICAgLi4ubWV0YSxcbiAgICB9KSk7XG4gICAgdGhpcy5zaG91bGRSZWxvYWQgPSB0cnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1ldGEgZGF0YSB0byB0aGUgc3RhY2suXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgLVxuICAgKi9cbiAgYXN5bmMgc2V0TWV0YShrZXksIHZhbHVlLCBwYXlsb2FkKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBrZXk7XG4gICAgICBtZXRhZGF0YS5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0TWV0YShtZXRhLmtleSwgbWV0YS52YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZmluZE1ldGEoa2V5KTtcblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgbWV0YWRhdGEudmFsdWUgPSB2YWx1ZTtcbiAgICAgIG1ldGFkYXRhLm1hcmtBc1VwZGF0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFkYXRhLnB1c2goe1xuICAgICAgICB2YWx1ZSwga2V5LCAuLi5wYXlsb2FkLCBtYXJrQXNJbnNlcnRlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU2F2ZWQgdGhlIG1vZGlmaWVkIG1ldGFkYXRhLlxuICAgKi9cbiAgYXN5bmMgc2F2ZU1ldGEoKSB7XG4gICAgY29uc3QgaW5zZXJ0ZWQgPSB0aGlzLm1ldGFkYXRhLmZpbHRlcigobSkgPT4gKG0ubWFya0FzSW5zZXJ0ZWQgPT09IHRydWUpKTtcbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5tZXRhZGF0YS5maWx0ZXIoKG0pID0+IChtLm1hcmtBc1VwZGF0ZWQgPT09IHRydWUpKTtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5tZXRhZGF0YS5maWx0ZXIoKG0pID0+IChtLm1hcmtBc0RlbGV0ZWQgPT09IHRydWUpKTtcblxuICAgIGNvbnN0IG1ldGFkYXRhRGVsZXRlZEtleXMgPSBkZWxldGVkLm1hcCgobSkgPT4gbS5rZXkpO1xuICAgIGNvbnN0IG1ldGFkYXRhSW5zZXJ0ZWQgPSBpbnNlcnRlZC5tYXAoKG0pID0+IHRoaXMubWFwTWV0YWRhdGEobSwgJ2Zvcm1hdCcpKTtcbiAgICBjb25zdCBtZXRhZGF0YVVwZGF0ZWQgPSB1cGRhdGVkLm1hcCgobSkgPT4gdGhpcy5tYXBNZXRhZGF0YShtLCAnZm9ybWF0JykpO1xuXG4gICAgY29uc3QgYmF0Y2hVcGRhdGUgPSAoY29sbGVjdGlvbikgPT4ga25leC50cmFuc2FjdGlvbigodHJ4KSA9PiB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gY29sbGVjdGlvbi5tYXAoKHR1cGxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0ga25leCh0aGlzLnRhYmxlTmFtZSk7XG4gICAgICAgIHRoaXMud2hlcmVRdWVyeShxdWVyeSwgdHVwbGUua2V5KTtcbiAgICAgICAgdGhpcy5leHRyYU1ldGFkYXRhUXVlcnkocXVlcnkpO1xuICAgICAgICByZXR1cm4gcXVlcnkudXBkYXRlKHR1cGxlKS50cmFuc2FjdGluZyh0cngpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocXVlcmllcykudGhlbih0cnguY29tbWl0KS5jYXRjaCh0cngucm9sbGJhY2spO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAga25leC5pbnNlcnQobWV0YWRhdGFJbnNlcnRlZCkuaW50byh0aGlzLnRhYmxlTmFtZSksXG4gICAgICBiYXRjaFVwZGF0ZShtZXRhZGF0YVVwZGF0ZWQpLFxuICAgICAgbWV0YWRhdGFEZWxldGVkS2V5cy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5xdWVyeSgnd2hlcmVJbicsIHRoaXMuS0VZX0NPTFVNTiwgbWV0YWRhdGFEZWxldGVkS2V5cykuZGVzdHJveSh7XG4gICAgICAgICAgcmVxdWlyZTogdHJ1ZSxcbiAgICAgICAgfSkgOiBudWxsLFxuICAgIF0pO1xuICAgIHRoaXMuc2hvdWxkUmVsb2FkID0gdHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogUHVyZ2UgYWxsIHRoZSBjYWNoZWQgbWV0YWRhdGEgaW4gdGhlIG1lbW9yeS5cbiAgICovXG4gIHB1cmdlTWV0YWRhdGEoKSB7XG4gICAgdGhpcy5tZXRhZGF0YSA9IFtdO1xuICAgIHRoaXMuc2hvdWxkUmVsb2FkID0gdHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBtZXRhZGF0YSB2YWx1ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlVHlwZSAtXG4gICAqL1xuICBwYXJzZU1ldGFWYWx1ZSh2YWx1ZSwgdmFsdWVUeXBlKSB7XG4gICAgbGV0IHBhcnNlZFZhbHVlO1xuXG4gICAgc3dpdGNoICh2YWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmxvYXQnOlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IEJvb2xlYW4odmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IEpTT04ucGFyc2UocGFyc2VkVmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHBhcnNlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aGUgbWV0YWRhdGEgYmVmb3JlIHNhdmluZyB0byB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcnxCb29sZWFufSB2YWx1ZSAtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVR5cGUgLVxuICAgKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfEJvb2xlYW59IC1cbiAgICovXG4gIGZvcm1hdE1ldGFWYWx1ZSh2YWx1ZSwgdmFsdWVUeXBlKSB7XG4gICAgbGV0IHBhcnNlZFZhbHVlO1xuXG4gICAgc3dpdGNoICh2YWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHBhcnNlZFZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZSA/ICcxJyA6ICcwJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSBKU09OLnN0cmluZ2lmeShwYXJzZWRWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgfSxcblxuICBtYXBNZXRhZGF0YShhdHRyLCBwYXJzZVR5cGUgPSAncGFyc2UnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogYXR0clt0aGlzLktFWV9DT0xVTU5dLFxuICAgICAgdmFsdWU6IChwYXJzZVR5cGUgPT09ICdwYXJzZScpXG4gICAgICAgID8gdGhpcy5wYXJzZU1ldGFWYWx1ZShcbiAgICAgICAgICBhdHRyW3RoaXMuVkFMVUVfQ09MVU1OXSxcbiAgICAgICAgICB0aGlzLlRZUEVfQ09MVU1OID8gYXR0clt0aGlzLlRZUEVfQ09MVU1OXSA6IGZhbHNlLFxuICAgICAgICApXG4gICAgICAgIDogdGhpcy5mb3JtYXRNZXRhVmFsdWUoXG4gICAgICAgICAgYXR0clt0aGlzLlZBTFVFX0NPTFVNTl0sXG4gICAgICAgICAgdGhpcy5UWVBFX0NPTFVNTiA/IGF0dHJbdGhpcy5UWVBFX0NPTFVNTl0gOiBmYWxzZSxcbiAgICAgICAgKSxcbiAgICAgIC4uLnRoaXMuZXh0cmFDb2x1bW5zLm1hcCgoZXh0cmFDb2wpID0+ICh7XG4gICAgICAgIFtleHRyYUNvbF06IGF0dHJbZXh0cmFDb2xdIHx8IG51bGwsXG4gICAgICB9KSksXG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogUGFyc2UgdGhlIG1ldGFkYXRhIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbGxlY3Rpb24gLVxuICAgKi9cbiAgbWFwTWV0YWRhdGFDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIHBhcnNlVHlwZSA9ICdwYXJzZScpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5tYXAoKG1vZGVsKSA9PiB0aGlzLm1hcE1ldGFkYXRhKG1vZGVsLmF0dHJpYnV0ZXMsIHBhcnNlVHlwZSkpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgeyBzbmFrZUNhc2UsIGVhY2ggfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgbWFwS2V5c0RlZXAgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCBQYWdpbmF0aW9uUXVlcnlCdWlsZGVyIGZyb20gJ0AvbW9kZWxzL1BhZ2luYXRpb24nO1xuaW1wb3J0IERhdGVTZXNzaW9uIGZyb20gJ0AvbW9kZWxzL0RhdGVTZXNzaW9uJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kZWxCYXNlIGV4dGVuZHMgbWl4aW4oTW9kZWwsIFtEYXRlU2Vzc2lvbl0pIHtcblxuICBzdGF0aWMgZ2V0IHRpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgc3RhdGljIGdldCBrbmV4QmluZGVkKCkge1xuICAgIHJldHVybiB0aGlzLmtuZXhCaW5kSW5zdGFuY2U7XG4gIH1cblxuICBzdGF0aWMgc2V0IGtuZXhCaW5kZWQoa25leCkge1xuICAgIHRoaXMua25leEJpbmRJbnN0YW5jZSA9IGtuZXg7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIEFycmF5O1xuICB9XG5cbiAgc3RhdGljIHF1ZXJ5KC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gc3VwZXIucXVlcnkoLi4uYXJncykucnVuQWZ0ZXIoKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmZyb20ocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICAkZm9ybWF0SnNvbihqc29uLCBvcHQpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IG1hcEtleXNEZWVwKGpzb24sICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICByZXR1cm4gc25ha2VDYXNlKGtleSk7XG4gICAgfSk7XG4gICAgY29uc3QgcGFyc2VkSnNvbiA9IHN1cGVyLiRmb3JtYXRKc29uKHRyYW5zZm9ybWVkLCBvcHQpO1xuICAgIHJldHVybiBwYXJzZWRKc29uO1xuICB9XG5cbiAgc3RhdGljIGdldCBRdWVyeUJ1aWxkZXIoKSB7XG4gICAgcmV0dXJuIFBhZ2luYXRpb25RdWVyeUJ1aWxkZXI7XG4gIH1cblxuICBzdGF0aWMgcmVsYXRpb25CaW5kS25leChtb2RlbCkge1xuICAgIHJldHVybiB0aGlzLmtuZXhCaW5kZWQgPyBtb2RlbC5iaW5kS25leCh0aGlzLmtuZXhCaW5kZWQpIDogbW9kZWw7XG4gIH1cbn1cbiIsImltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5pbXBvcnQgTWV0YWJsZUNvbGxlY3Rpb24gZnJvbSAnQC9saWIvTWV0YWJsZS9NZXRhYmxlQ29sbGVjdGlvbic7XG5pbXBvcnQgZGVmaW5lZE9wdGlvbnMgZnJvbSAnQC9kYXRhL29wdGlvbnMnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9wdGlvbiBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ29wdGlvbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBtb2RlbCBxdWVyeS5cbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIC1cbiAgICovXG4gIHN0YXRpYyBxdWVyeSguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnF1ZXJ5KC4uLmFyZ3MpLnJ1bkFmdGVyKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBNZXRhYmxlQ29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQuc2V0TW9kZWwodGhpcy50ZW5hbnQoKSk7XG4gICAgICAgIHJlc3VsdC5zZXRFeHRyYUNvbHVtbnMoWydncm91cCddKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW9kZWwgY29sbGVjdGlvbi5cbiAgICovXG4gIHN0YXRpYyBnZXQgY29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gTWV0YWJsZUNvbGxlY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBnaXZlbiBvcHRpb25zIGlzIGRlZmluZWQgb3IgZWl0aGVyIG5vdC5cbiAgICogQHBhcmFtIHtBcnJheX0gb3B0aW9ucyBcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZURlZmluZWQob3B0aW9ucykge1xuICAgIGNvbnN0IG5vdERlZmluZWQgPSBbXTtcblxuICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoIWRlZmluZWRPcHRpb25zW29wdGlvbi5ncm91cF0pIHtcbiAgICAgICAgbm90RGVmaW5lZC5wdXNoKG9wdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKCFkZWZpbmVkT3B0aW9uc1tvcHRpb24uZ3JvdXBdLnNvbWUoKG8pID0+IG8ua2V5ID09PSBvcHRpb24ua2V5KSkge1xuICAgICAgICBub3REZWZpbmVkLnB1c2gob3B0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbm90RGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdpbmF0aW9uUXVlcnlCdWlsZGVyIGV4dGVuZHMgTW9kZWwuUXVlcnlCdWlsZGVyIHtcbiAgcGFnaW5hdGlvbihwYWdlLCBwYWdlU2l6ZSkge1xuICAgIHJldHVybiBzdXBlci5wYWdlKHBhZ2UsIHBhZ2VTaXplKS5ydW5BZnRlcihcbiAgICAgICh7IHJlc3VsdHMsIHRvdGFsIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXN1bHRzLFxuICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgcGFnZTogcGFnZSArIDEsXG4gICAgICAgICAgICBwYWdlU2l6ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgfVxufSIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbiBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUgb2YgUm9sZSBtb2RlbC5cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAncGVybWlzc2lvbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFJvbGUgPSByZXF1aXJlKCdAL21vZGVscy9Sb2xlJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBQZXJtaXNzaW9uIG1vZGVsIG1heSBiZWxvbmdzIHRvIHJvbGUgbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIC8vIHJvbGU6IHtcbiAgICAgIC8vICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgLy8gICBtb2RlbEJhc2U6IHBhdGguam9pbihfX2Rpcm5hbWUsICdSb2xlJykuYmluZEtuZXgodGhpcy5rbmV4QmluZGVkKSxcbiAgICAgIC8vICAgam9pbjoge1xuICAgICAgLy8gICAgIGZyb206ICdwZXJtaXNzaW9ucy5yb2xlX2lkJyxcbiAgICAgIC8vICAgICB0bzogJ3JvbGVzLmlkJyxcbiAgICAgIC8vICAgfSxcbiAgICAgIC8vIH0sXG5cbiAgICAgIC8vIHJlc291cmNlOiB7XG4gICAgICAvLyAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgIC8vICAgbW9kZWxCYXNlOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnUmVzb3VyY2UnKSxcbiAgICAgIC8vICAgam9pbjoge1xuICAgICAgLy8gICAgIGZyb206ICdwZXJtaXNzaW9ucy4nLFxuICAgICAgLy8gICAgIHRvOiAnJyxcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IENhY2hhYmxlUXVlcnlCdWlsZGVyIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlUXVlcnlCdWlsZGVyJztcbmltcG9ydCBDYWNoYWJsZU1vZGVsIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNvdXJjZSBleHRlbmRzIG1peGluKFRlbmFudE1vZGVsLCBbQ2FjaGFibGVNb2RlbF0pIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3Jlc291cmNlcyc7XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kIHF1ZXJ5IGJ1aWxkZXIgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0IFF1ZXJ5QnVpbGRlcigpIHtcbiAgICByZXR1cm4gQ2FjaGFibGVRdWVyeUJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogVGltZXN0YW1wIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IGhhc1RpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFZpZXcgPSByZXF1aXJlKCdAL21vZGVscy9WaWV3Jyk7XG4gICAgY29uc3QgUmVzb3VyY2VGaWVsZCA9IHJlcXVpcmUoJ0AvbW9kZWxzL1Jlc291cmNlRmllbGQnKTtcbiAgICBjb25zdCBQZXJtaXNzaW9uID0gcmVxdWlyZSgnQC9tb2RlbHMvUGVybWlzc2lvbicpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogUmVzb3VyY2UgbW9kZWwgbWF5IGhhcyBtYW55IHZpZXdzLlxuICAgICAgICovXG4gICAgICB2aWV3czoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuSGFzTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoVmlldy5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICAgIHRvOiAndmlld3MucmVzb3VyY2VJZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlc291cmNlIG1vZGVsIG1heSBoYXMgbWFueSBmaWVsZHMuXG4gICAgICAgKi9cbiAgICAgIGZpZWxkczoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuSGFzTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoUmVzb3VyY2VGaWVsZC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICAgIHRvOiAncmVzb3VyY2VfZmllbGRzLnJlc291cmNlSWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZXNvdXJjZSBtb2RlbCBtYXkgaGFzIG1hbnkgYXNzb2NpYXRlZCBwZXJtaXNzaW9ucy5cbiAgICAgICAqL1xuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLk1hbnlUb01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KFBlcm1pc3Npb24uZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAncmVzb3VyY2VzLmlkJyxcbiAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICBmcm9tOiAncm9sZV9oYXNfcGVybWlzc2lvbnMucmVzb3VyY2VJZCcsXG4gICAgICAgICAgICB0bzogJ3JvbGVfaGFzX3Blcm1pc3Npb25zLnBlcm1pc3Npb25JZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogJ3Blcm1pc3Npb25zLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzb3VyY2VGaWVsZCBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3Jlc291cmNlX2ZpZWxkcyc7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGpzb25BdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ29wdGlvbnMnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBtb2RpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IG1vZGlmaWVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2hlcmVOb3RQcmVkZWZpbmVkKHF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlTm90KCdwcmVkZWZpbmVkJywgdHJ1ZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGltZXN0YW1wIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IGhhc1RpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZpcnR1YWwgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdmlydHVhbEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsna2V5J107XG4gIH1cblxuICAvKipcbiAgICogUmVzb3VyY2UgZmllbGQga2V5LlxuICAgKi9cbiAga2V5KCkge1xuICAgIHJldHVybiBzbmFrZUNhc2UodGhpcy5sYWJlbE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFJlc291cmNlID0gcmVxdWlyZSgnQC9tb2RlbHMvUmVzb3VyY2UnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFJlc291cmNlIGZpZWxkIG1heSBiZWxvbmdzIHRvIHJlc291cmNlIG1vZGVsLlxuICAgICAgICovXG4gICAgICByZXNvdXJjZToge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChSZXNvdXJjZS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyZXNvdXJjZV9maWVsZHMucmVzb3VyY2VJZCcsXG4gICAgICAgICAgdG86ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IFJlc291cmNlRmllbGRNZXRhZGF0YUNvbGxlY3Rpb24gZnJvbSAnQC9jb2xsZWN0aW9uL1Jlc291cmNlRmllbGRNZXRhZGF0YUNvbGxlY3Rpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNvdXJjZUZpZWxkTWV0YWRhdGEgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdyZXNvdXJjZV9jdXN0b21fZmllbGRzX21ldGFkYXRhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgcmVzb3VyY2UgZmllbGQgbWV0YWRhdGEgY29sbGVjdGlvbi5cbiAgICovXG4gIHN0YXRpYyBnZXQgY29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gUmVzb3VyY2VGaWVsZE1ldGFkYXRhQ29sbGVjdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZSBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUgb2YgUm9sZSBtb2RlbC5cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAncm9sZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBjb2x1bW5zLlxuICAgKi9cbiAgc3RhdGljIGdldCBoYXNUaW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBQZXJtaXNzaW9uID0gcmVxdWlyZSgnQC9tb2RlbHMvUGVybWlzc2lvbicpO1xuICAgIGNvbnN0IFJlc291cmNlID0gcmVxdWlyZSgnQC9tb2RlbHMvUmVzb3VyY2UnKTtcbiAgICBjb25zdCBVc2VyID0gcmVxdWlyZSgnQC9tb2RlbHMvVGVuYW50VXNlcicpO1xuICAgIGNvbnN0IFJlc291cmNlRmllbGQgPSByZXF1aXJlKCdAL21vZGVscy9SZXNvdXJjZUZpZWxkJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBSb2xlIG1heSBoYXMgbWFueSBwZXJtaXNzaW9ucy5cbiAgICAgICAqL1xuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLk1hbnlUb01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogUGVybWlzc2lvbi5kZWZhdWx0LmJpbmRLbmV4KHRoaXMua25leEJpbmRlZCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAncm9sZXMuaWQnLFxuICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgIGZyb206ICdyb2xlX2hhc19wZXJtaXNzaW9ucy5yb2xlSWQnLFxuICAgICAgICAgICAgdG86ICdyb2xlX2hhc19wZXJtaXNzaW9ucy5wZXJtaXNzaW9uSWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86ICdwZXJtaXNzaW9ucy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJvbGUgbWF5IGhhcyBtYW55IHJlc291cmNlcy5cbiAgICAgICAqL1xuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5NYW55VG9NYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IFJlc291cmNlLmRlZmF1bHQuYmluZEtuZXgodGhpcy5rbmV4QmluZGVkKSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyb2xlcy5pZCcsXG4gICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgZnJvbTogJ3JvbGVfaGFzX3Blcm1pc3Npb25zLnJvbGVJZCcsXG4gICAgICAgICAgICB0bzogJ3JvbGVfaGFzX3Blcm1pc3Npb25zLnJlc291cmNlSWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSb2xlIG1heSBoYXMgcmVzb3VyY2UgZmllbGQuXG4gICAgICAgKi9cbiAgICAgIGZpZWxkOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogUmVzb3VyY2VGaWVsZC5kZWZhdWx0LmJpbmRLbmV4KHRoaXMua25leEJpbmRlZCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAncm9sZXMuZmllbGRJZCcsXG4gICAgICAgICAgdG86ICdyZXNvdXJjZV9maWVsZHMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSb2xlIG1heSBoYXMgbWFueSBhc3NvY2lhdGVkIHVzZXJzLlxuICAgICAgICovXG4gICAgICB1c2Vyczoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuTWFueVRvTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiBVc2VyLmRlZmF1bHQuYmluZEtuZXgodGhpcy5rbmV4QmluZGVkKSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyb2xlcy5pZCcsXG4gICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgZnJvbTogJ3VzZXJfaGFzX3JvbGVzLnJvbGVJZCcsXG4gICAgICAgICAgICB0bzogJ3VzZXJfaGFzX3JvbGVzLnVzZXJJZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogJ3VzZXJzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCBBdXRoIGZyb20gJy4vQXV0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNldHRpbmcgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3NldHRpbmdzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgY29sdW1ucy5cbiAgICovXG4gIHN0YXRpYyBnZXQgaGFzVGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmEgbWV0YWRhdGEgcXVlcnkgdG8gcXVlcnkgd2l0aCB0aGUgY3VycmVudCBhdXRoZW50aWNhdGUgdXNlci5cbiAgICogQHBhcmFtIHtPYmplY3R9IHF1ZXJ5XG4gICAqL1xuICBzdGF0aWMgZXh0cmFNZXRhZGF0YVF1ZXJ5KHF1ZXJ5KSB7XG4gICAgaWYgKEF1dGguaXNMb2dnZWQoKSkge1xuICAgICAgcXVlcnkud2hlcmUoJ3VzZXJfaWQnLCBBdXRoLnVzZXJJZCgpKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSAnQC9tb2RlbHMvTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZW5hbnRNb2RlbCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIHN0YXRpYyB0ZW5hbnQoKSB7XG4gICAgaWYgKCF0aGlzLmtuZXhCaW5kZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGVuYW50IGtuZXggaXMgbm90IGJpbmRlZCB5ZXQuJyk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5iaW5kS25leCh0aGlzLmtuZXhCaW5kZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIGVtYmVkIG1vZGVscyB0byBleHByZXNzIHJlcXVlc3QuXG4gICAqL1xuICBzdGF0aWMgcmVxdWVzdE1vZGVsKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCJpbXBvcnQgYmNyeXB0IGZyb20gJ2JjcnlwdGpzJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG4vLyBpbXBvcnQgUGVybWlzc2lvbnNTZXJ2aWNlIGZyb20gJ0Avc2VydmljZXMvUGVybWlzc2lvbnNTZXJ2aWNlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVuYW50VXNlciBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFZpcnR1YWwgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdmlydHVhbEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnZnVsbE5hbWUnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3VzZXJzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXBzIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIFsnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCddO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFJvbGUgPSByZXF1aXJlKCdAL21vZGVscy9Sb2xlJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm9sZXM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLk1hbnlUb01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KFJvbGUuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAndXNlcnMuaWQnLFxuICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgIGZyb206ICd1c2VyX2hhc19yb2xlcy51c2VySWQnLFxuICAgICAgICAgICAgdG86ICd1c2VyX2hhc19yb2xlcy5yb2xlSWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86ICdyb2xlcy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoZSBwYXNzd29yZCBvZiB0aGUgdXNlci5cbiAgICogQHBhcmFtICB7U3RyaW5nfSBwYXNzd29yZCAtIFRoZSBnaXZlbiBwYXNzd29yZC5cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIHZlcmlmeVBhc3N3b3JkKHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIGJjcnlwdC5jb21wYXJlU3luYyhwYXNzd29yZCwgdGhpcy5wYXNzd29yZCk7XG4gIH1cblxuICBmdWxsTmFtZSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5maXJzdE5hbWV9ICR7dGhpcy5sYXN0TmFtZSB8fCAnJ31gO1xuICB9XG59IiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVuZG9yIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICd2ZW5kb3JzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCB0aW1lc3RhbXBzLlxuICAgKi9cbiAgc3RhdGljIGdldCB0aW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIG1peGluIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5pbXBvcnQgQ2FjaGFibGVRdWVyeUJ1aWxkZXIgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVRdWVyeUJ1aWxkZXInO1xuaW1wb3J0IENhY2hhYmxlTW9kZWwgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcgZXh0ZW5kcyBtaXhpbihUZW5hbnRNb2RlbCwgW0NhY2hhYmxlTW9kZWxdKSB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICd2aWV3cyc7XG4gIH1cblxuICAvKipcbiAgICogTW9kZWwgdGltZXN0YW1wcy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gWydjcmVhdGVkQXQnLCAndXBkYXRlZEF0J107XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kIHF1ZXJ5IGJ1aWxkZXIgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0IFF1ZXJ5QnVpbGRlcigpIHtcbiAgICByZXR1cm4gQ2FjaGFibGVRdWVyeUJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgUmVzb3VyY2UgPSByZXF1aXJlKCdAL21vZGVscy9SZXNvdXJjZScpO1xuICAgIGNvbnN0IFZpZXdDb2x1bW4gPSByZXF1aXJlKCdAL21vZGVscy9WaWV3Q29sdW1uJyk7XG4gICAgY29uc3QgVmlld1JvbGUgPSByZXF1aXJlKCdAL21vZGVscy9WaWV3Um9sZScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogVmlldyBtb2RlbCBiZWxvbmdzIHRvIHJlc291cmNlIG1vZGVsLlxuICAgICAgICovXG4gICAgICByZXNvdXJjZToge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChSZXNvdXJjZS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICd2aWV3cy5yZXNvdXJjZUlkJyxcbiAgICAgICAgICB0bzogJ3Jlc291cmNlcy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZpZXcgbW9kZWwgbWF5IGhhcyBtYW55IGNvbHVtbnMuXG4gICAgICAgKi9cbiAgICAgIGNvbHVtbnM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkhhc01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KFZpZXdDb2x1bW4uZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAndmlld3MuaWQnLFxuICAgICAgICAgIHRvOiAndmlld19oYXNfY29sdW1ucy52aWV3SWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBWaWV3IG1vZGVsIG1heSBoYXMgbWFueSB2aWV3IHJvbGVzLlxuICAgICAgICovXG4gICAgICByb2xlczoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuSGFzTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoVmlld1JvbGUuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAndmlld3MuaWQnLFxuICAgICAgICAgIHRvOiAndmlld19yb2xlcy52aWV3SWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaWV3Q29sdW1uIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAndmlld19oYXNfY29sdW1ucyc7XG4gIH1cblxuICAvKipcbiAgICogVGltZXN0YW1wIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IGhhc1RpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgUmVzb3VyY2VGaWVsZCA9IHJlcXVpcmUoJ0AvbW9kZWxzL1Jlc291cmNlRmllbGQnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFZpZXcgcm9sZSBtb2RlbCBtYXkgYmVsb25ncyB0byByZXNvdXJjZSBmaWVsZCBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgZmllbGQ6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoUmVzb3VyY2VGaWVsZC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICd2aWV3X2hhc19jb2x1bW5zLmZpZWxkSWQnLFxuICAgICAgICAgIHRvOiAncmVzb3VyY2VfZmllbGRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld1JvbGUgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG5cbiAgLyoqXG4gICAqIFZpcnR1YWwgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdmlydHVhbEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnY29tcGFyYXRvcnMnXTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcGFyYXRvcnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdlcXVhbHMnLCAnbm90X2VxdWFsJywgJ2NvbnRhaW5zJywgJ25vdF9jb250YWluJyxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3ZpZXdfcm9sZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBjb2x1bW5zLlxuICAgKi9cbiAgc3RhdGljIGdldCBoYXNUaW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBSZXNvdXJjZUZpZWxkID0gcmVxdWlyZSgnQC9tb2RlbHMvUmVzb3VyY2VGaWVsZCcpO1xuICAgIGNvbnN0IFZpZXcgPSByZXF1aXJlKCdAL21vZGVscy9WaWV3Jyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBWaWV3IHJvbGUgbW9kZWwgbWF5IGJlbG9uZ3MgdG8gdmlldyBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgdmlldzoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChWaWV3LmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ3ZpZXdfcm9sZXMudmlld0lkJyxcbiAgICAgICAgICB0bzogJ3ZpZXdzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVmlldyByb2xlIG1vZGVsIG1heSBiZWxvbmdzIHRvIHJlc291cmNlIGZpZWxkIG1vZGVsLlxuICAgICAgICovXG4gICAgICBmaWVsZDoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChSZXNvdXJjZUZpZWxkLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ3ZpZXdfcm9sZXMuZmllbGRJZCcsXG4gICAgICAgICAgdG86ICdyZXNvdXJjZV9maWVsZHMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgZXJyb3JIYW5kbGVyIGZyb20gJ2Vycm9yaGFuZGxlcic7XG5pbXBvcnQgYXBwIGZyb20gJ0AvYXBwJztcblxuYXBwLnVzZShlcnJvckhhbmRsZXIpO1xuXG5jb25zdCBzZXJ2ZXIgPSBhcHAubGlzdGVuKGFwcC5nZXQoJ3BvcnQnKSwgKCkgPT4ge1xuICBjb25zb2xlLmxvZyhcbiAgICAnICBBcHAgaXMgcnVubmluZyBhdCBodHRwOi8vbG9jYWxob3N0OiVkIGluICVzIG1vZGUnLFxuICAgIGFwcC5nZXQoJ3BvcnQnKSxcbiAgICBhcHAuZ2V0KCdlbnYnKSxcbiAgKTtcbiAgY29uc29sZS5sb2coJyAgUHJlc3MgQ1RSTC1DIHRvIHN0b3AnKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzZXJ2ZXI7XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpvdXJuYWxFbnRyeSB7XG4gIGNvbnN0cnVjdG9yKGVudHJ5KSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjcmVkaXQ6IDAsXG4gICAgICBkZWJpdDogMCxcbiAgICB9O1xuICAgIHRoaXMuZW50cnkgPSB7IC4uLmRlZmF1bHRzLCAuLi5lbnRyeSB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBwaWNrIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBKb3VybmFsRW50cnkgZnJvbSAnQC9zZXJ2aWNlcy9BY2NvdW50aW5nL0pvdXJuYWxFbnRyeSc7XG5pbXBvcnQgQWNjb3VudFRyYW5zYWN0aW9uIGZyb20gJ0AvbW9kZWxzL0FjY291bnRUcmFuc2FjdGlvbic7XG5pbXBvcnQgQWNjb3VudEJhbGFuY2UgZnJvbSAnQC9tb2RlbHMvQWNjb3VudEJhbGFuY2UnO1xuaW1wb3J0IHsgcHJvbWlzZVNlcmlhbCB9IGZyb20gJ0AvdXRpbHMnO1xuaW1wb3J0IEFjY291bnQgZnJvbSAnQC9tb2RlbHMvQWNjb3VudCc7XG5pbXBvcnQgTmVzdGVkU2V0IGZyb20gJy4uLy4uL2NvbGxlY3Rpb24vTmVzdGVkU2V0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSm91cm5hbFBvc3RlciB7XG4gIC8qKlxuICAgKiBKb3VybmFsIHBvc3RlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFjY291bnRzR3JhcGgpIHtcbiAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgICB0aGlzLmJhbGFuY2VzQ2hhbmdlID0ge307XG4gICAgdGhpcy5kZWxldGVkRW50cmllc0lkcyA9IFtdO1xuXG4gICAgdGhpcy5hY2NvdW50c0JhbGFuY2VUYWJsZSA9IHt9O1xuICAgIHRoaXMuYWNjb3VudHNHcmFwaCA9IGFjY291bnRzR3JhcGg7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBjcmVkaXQgZW50cnkgZm9yIHRoZSBnaXZlbiBhY2NvdW50LlxuICAgKiBAcGFyYW0ge0pvdXJuYWxFbnRyeX0gZW50cnkgLVxuICAgKi9cbiAgY3JlZGl0KGVudHJ5TW9kZWwpIHtcbiAgICBpZiAoZW50cnlNb2RlbCBpbnN0YW5jZW9mIEpvdXJuYWxFbnRyeSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGVudHJ5IGlzIG5vdCBpbnN0YW5jZSBvZiBKb3VybmFsRW50cnkuJyk7XG4gICAgfVxuICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5TW9kZWwuZW50cnkpO1xuICAgIHRoaXMuc2V0QWNjb3VudEJhbGFuY2VDaGFuZ2UoZW50cnlNb2RlbC5lbnRyeSwgJ2NyZWRpdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgZGViaXQgZW50cnkgZm9yIHRoZSBnaXZlbiBhY2NvdW50LlxuICAgKiBAcGFyYW0ge0pvdXJuYWxFbnRyeX0gZW50cnkgLVxuICAgKi9cbiAgZGViaXQoZW50cnlNb2RlbCkge1xuICAgIGlmIChlbnRyeU1vZGVsIGluc3RhbmNlb2YgSm91cm5hbEVudHJ5ID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZW50cnkgaXMgbm90IGluc3RhbmNlIG9mIEpvdXJuYWxFbnRyeS4nKTtcbiAgICB9XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnlNb2RlbC5lbnRyeSk7XG4gICAgdGhpcy5zZXRBY2NvdW50QmFsYW5jZUNoYW5nZShlbnRyeU1vZGVsLmVudHJ5LCAnZGViaXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFjY291bnQgYmFsYW5jZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7Sm91cm5hbEVudHJ5fSBlbnRyeVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKi9cbiAgc2V0QWNjb3VudEJhbGFuY2VDaGFuZ2UoZW50cnksIGVudHJ5VHlwZSkge1xuICAgIGNvbnN0IGRlcEFjY291bnRzSWRzID0gdGhpcy5hY2NvdW50c0dyYXBoLmRlcGVuZGFudHNPZihlbnRyeS5hY2NvdW50KTtcblxuICAgIGNvbnN0IGJhbGFuY2VDaGFuZ2VFbnRyeSA9IHtcbiAgICAgIGRlYml0OiBlbnRyeS5kZWJpdCxcbiAgICAgIGNyZWRpdDogZW50cnkuY3JlZGl0LFxuICAgICAgZW50cnlUeXBlLFxuICAgICAgYWNjb3VudE5vcm1hbDogZW50cnkuYWNjb3VudE5vcm1hbCxcbiAgICB9O1xuICAgIHRoaXMuX3NldEFjY291bnRCYWxhbmNlQ2hhbmdlKHtcbiAgICAgIC4uLmJhbGFuY2VDaGFuZ2VFbnRyeSxcbiAgICAgIGFjY291bnRJZDogZW50cnkuYWNjb3VudCxcbiAgICB9KTtcblxuICAgIC8vIEVmZmVjdCBwYXJlbnQgYWNjb3VudHMgb2YgdGhlIGdpdmVuIGFjY291bnQgaWQuXG4gICAgZGVwQWNjb3VudHNJZHMuZm9yRWFjaCgoYWNjb3VudElkKSA9PiB7XG4gICAgICB0aGlzLl9zZXRBY2NvdW50QmFsYW5jZUNoYW5nZSh7XG4gICAgICAgIC4uLmJhbGFuY2VDaGFuZ2VFbnRyeSxcbiAgICAgICAgYWNjb3VudElkLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhY2NvdW50IGJhbGFuY2UgY2hhbmdlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NldEFjY291bnRCYWxhbmNlQ2hhbmdlKHtcbiAgICBhY2NvdW50SWQsXG4gICAgYWNjb3VudE5vcm1hbCxcbiAgICBkZWJpdCxcbiAgICBjcmVkaXQsXG4gICAgZW50cnlUeXBlLFxuICB9KSB7XG4gICAgaWYgKCF0aGlzLmJhbGFuY2VzQ2hhbmdlW2FjY291bnRJZF0pIHtcbiAgICAgIHRoaXMuYmFsYW5jZXNDaGFuZ2VbYWNjb3VudElkXSA9IDA7XG4gICAgfVxuICAgIGxldCBjaGFuZ2UgPSAwO1xuXG4gICAgaWYgKGFjY291bnROb3JtYWwgPT09ICdjcmVkaXQnKSB7XG4gICAgICBjaGFuZ2UgPSBlbnRyeVR5cGUgPT09ICdjcmVkaXQnID8gY3JlZGl0IDogLTEgKiBkZWJpdDtcbiAgICB9IGVsc2UgaWYgKGFjY291bnROb3JtYWwgPT09ICdkZWJpdCcpIHtcbiAgICAgIGNoYW5nZSA9IGVudHJ5VHlwZSA9PT0gJ2RlYml0JyA/IGRlYml0IDogLTEgKiBjcmVkaXQ7XG4gICAgfVxuICAgIHRoaXMuYmFsYW5jZXNDaGFuZ2VbYWNjb3VudElkXSArPSBjaGFuZ2U7XG4gIH1cblxuICAvKipcbiAgICogTWFwcGluZyB0aGUgYmFsYW5jZSBjaGFuZ2UgdG8gbGlzdC5cbiAgICovXG4gIG1hcEJhbGFuY2VDaGFuZ2VzVG9MaXN0KCkge1xuICAgIGNvbnN0IG1hcHBlZExpc3QgPSBbXTtcblxuICAgIE9iamVjdC5rZXlzKHRoaXMuYmFsYW5jZXNDaGFuZ2UpLmZvckVhY2goKGFjY291bnRJZCkgPT4ge1xuICAgICAgY29uc3QgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZXNDaGFuZ2VbYWNjb3VudElkXTtcblxuICAgICAgbWFwcGVkTGlzdC5wdXNoKHtcbiAgICAgICAgYWNjb3VudF9pZDogYWNjb3VudElkLFxuICAgICAgICBhbW91bnQ6IGJhbGFuY2UsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwcGVkTGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgYmFsYW5jZSBjaGFuZ2Ugb2Ygam91cm5hbCBlbnRyaWVzLlxuICAgKi9cbiAgYXN5bmMgc2F2ZUJhbGFuY2UoKSB7XG4gICAgY29uc3QgYmFsYW5jZXNMaXN0ID0gdGhpcy5tYXBCYWxhbmNlQ2hhbmdlc1RvTGlzdCgpO1xuICAgIGNvbnN0IGJhbGFuY2VVcGRhdGVPcGVycyA9IFtdO1xuICAgIGNvbnN0IGJhbGFuY2VJbnNlcnRPcGVycyA9IFtdO1xuICAgIGNvbnN0IGJhbGFuY2VGaW5kT25lT3BlcnMgPSBbXTtcbiAgICBsZXQgYmFsYW5jZUFjY291bnRzID0gW107XG5cbiAgICBiYWxhbmNlc0xpc3QuZm9yRWFjaCgoYmFsYW5jZSkgPT4ge1xuICAgICAgY29uc3Qgb3BlciA9IEFjY291bnRCYWxhbmNlLnRlbmFudCgpXG4gICAgICAgIC5xdWVyeSgpXG4gICAgICAgIC5maW5kT25lKCdhY2NvdW50X2lkJywgYmFsYW5jZS5hY2NvdW50X2lkKTtcbiAgICAgIGJhbGFuY2VGaW5kT25lT3BlcnMucHVzaChvcGVyKTtcbiAgICB9KTtcbiAgICBiYWxhbmNlQWNjb3VudHMgPSBhd2FpdCBQcm9taXNlLmFsbChiYWxhbmNlRmluZE9uZU9wZXJzKTtcblxuICAgIGJhbGFuY2VzTGlzdC5mb3JFYWNoKChiYWxhbmNlKSA9PiB7XG4gICAgICBjb25zdCBtZXRob2QgPSBiYWxhbmNlLmFtb3VudCA8IDAgPyAnZGVjcmVtZW50JyA6ICdpbmNyZW1lbnQnO1xuXG4gICAgICAvLyBEZXRhcm1pbmUgaWYgdGhlIGFjY291bnQgYmFsYW5jZSBpcyBhbHJlYWR5IGV4aXN0cyBvciBub3QuXG4gICAgICBjb25zdCBmb3VuZEFjY0JhbGFuY2UgPSBiYWxhbmNlQWNjb3VudHMuc29tZShcbiAgICAgICAgKGFjY291bnQpID0+IGFjY291bnQgJiYgYWNjb3VudC5hY2NvdW50X2lkID09PSBiYWxhbmNlLmFjY291bnRfaWRcbiAgICAgICk7XG5cbiAgICAgIGlmIChmb3VuZEFjY0JhbGFuY2UpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBBY2NvdW50QmFsYW5jZS50ZW5hbnQoKVxuICAgICAgICAgIC5xdWVyeSgpXG4gICAgICAgICAgW21ldGhvZF0oJ2Ftb3VudCcsIE1hdGguYWJzKGJhbGFuY2UuYW1vdW50KSlcbiAgICAgICAgICAud2hlcmUoJ2FjY291bnRfaWQnLCBiYWxhbmNlLmFjY291bnRfaWQpO1xuXG4gICAgICAgIGJhbGFuY2VVcGRhdGVPcGVycy5wdXNoKHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gQWNjb3VudEJhbGFuY2UudGVuYW50KCkucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIGFjY291bnRfaWQ6IGJhbGFuY2UuYWNjb3VudF9pZCxcbiAgICAgICAgICBhbW91bnQ6IGJhbGFuY2UuYW1vdW50LFxuICAgICAgICAgIGN1cnJlbmN5X2NvZGU6ICdVU0QnLFxuICAgICAgICB9KTtcbiAgICAgICAgYmFsYW5jZUluc2VydE9wZXJzLnB1c2gocXVlcnkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFsuLi5iYWxhbmNlVXBkYXRlT3BlcnMsIC4uLmJhbGFuY2VJbnNlcnRPcGVyc10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBzdGFja2VkIGpvdXJuYWwgZW50cmllcyB0byB0aGUgc3RvcmFnZS5cbiAgICovXG4gIGFzeW5jIHNhdmVFbnRyaWVzKCkge1xuICAgIGNvbnN0IHNhdmVPcGVyYXRpb25zID0gW107XG5cbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IG9wZXIgPSBBY2NvdW50VHJhbnNhY3Rpb24udGVuYW50KClcbiAgICAgICAgLnF1ZXJ5KClcbiAgICAgICAgLmluc2VydCh7XG4gICAgICAgICAgYWNjb3VudElkOiBlbnRyeS5hY2NvdW50LFxuICAgICAgICAgIC4uLnBpY2soZW50cnksIFtcbiAgICAgICAgICAgICdjcmVkaXQnLFxuICAgICAgICAgICAgJ2RlYml0JyxcbiAgICAgICAgICAgICd0cmFuc2FjdGlvblR5cGUnLFxuICAgICAgICAgICAgJ2RhdGUnLFxuICAgICAgICAgICAgJ3VzZXJJZCcsXG4gICAgICAgICAgICAncmVmZXJlbmNlVHlwZScsXG4gICAgICAgICAgICAncmVmZXJlbmNlSWQnLFxuICAgICAgICAgICAgJ25vdGUnLFxuICAgICAgICAgICAgJ2NvbnRhY3RJZCcsXG4gICAgICAgICAgICAnY29udGFjdFR5cGUnLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9KTtcbiAgICAgIHNhdmVPcGVyYXRpb25zLnB1c2goKCkgPT4gb3Blcik7XG4gICAgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVNlcmlhbChzYXZlT3BlcmF0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV2ZXJzZXMgdGhlIHN0YWNrZWQgam91cm5hbCBlbnRyaWVzLlxuICAgKi9cbiAgcmV2ZXJzZUVudHJpZXMoKSB7XG4gICAgY29uc3QgcmV2ZXJzZUVudHJpZXMgPSBbXTtcblxuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgcmV2ZXJzZUVudHJ5ID0geyAuLi5lbnRyeSB9O1xuXG4gICAgICBpZiAoZW50cnkuY3JlZGl0KSB7XG4gICAgICAgIHJldmVyc2VFbnRyeS5kZWJpdCA9IGVudHJ5LmNyZWRpdDtcbiAgICAgIH1cbiAgICAgIGlmIChlbnRyeS5kZWJpdCkge1xuICAgICAgICByZXZlcnNlRW50cnkuY3JlZGl0ID0gZW50cnkuZGViaXQ7XG4gICAgICB9XG4gICAgICByZXZlcnNlRW50cmllcy5wdXNoKHJldmVyc2VFbnRyeSk7XG4gICAgfSk7XG4gICAgdGhpcy5lbnRyaWVzID0gcmV2ZXJzZUVudHJpZXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gaWRzIC1cbiAgICovXG4gIHJlbW92ZUVudHJpZXMoaWRzID0gW10pIHtcbiAgICBjb25zdCB0YXJnZXRJZHMgPSBpZHMubGVuZ3RoIDw9IDAgPyB0aGlzLmVudHJpZXMubWFwKChlKSA9PiBlLmlkKSA6IGlkcztcbiAgICBjb25zdCByZW1vdmVFbnRyaWVzID0gdGhpcy5lbnRyaWVzLmZpbHRlcihcbiAgICAgIChlKSA9PiB0YXJnZXRJZHMuaW5kZXhPZihlLmlkKSAhPT0gLTFcbiAgICApO1xuXG4gICAgdGhpcy5lbnRyaWVzID0gdGhpcy5lbnRyaWVzLmZpbHRlcigoZSkgPT4gdGFyZ2V0SWRzLmluZGV4T2YoZS5pZCkgPT09IC0xKTtcblxuICAgIHJlbW92ZUVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGVudHJ5LmNyZWRpdCA9IC0xICogZW50cnkuY3JlZGl0O1xuICAgICAgZW50cnkuZGViaXQgPSAtMSAqIGVudHJ5LmRlYml0O1xuXG4gICAgICB0aGlzLnNldEFjY291bnRCYWxhbmNlQ2hhbmdlKGVudHJ5LCBlbnRyeS5hY2NvdW50Tm9ybWFsKTtcbiAgICB9KTtcbiAgICB0aGlzLmRlbGV0ZWRFbnRyaWVzSWRzLnB1c2goLi4ucmVtb3ZlRW50cmllcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5pZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbGwgdGhlIHN0YWNrZWQgZW50cmllcy5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUVudHJpZXMoKSB7XG4gICAgaWYgKHRoaXMuZGVsZXRlZEVudHJpZXNJZHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnRlbmFudCgpXG4gICAgICAgIC5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdpZCcsIHRoaXMuZGVsZXRlZEVudHJpZXNJZHMpXG4gICAgICAgIC5kZWxldGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGNsb3NpbmcgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFjY291bnQgYW5kIGNsb3NpbmcgZGF0ZS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFjY291bnRJZCAtXG4gICAqIEBwYXJhbSB7RGF0ZX0gY2xvc2luZ0RhdGUgLVxuICAgKi9cbiAgZ2V0Q2xvc2luZ0JhbGFuY2UoYWNjb3VudElkLCBjbG9zaW5nRGF0ZSwgZGF0ZVR5cGUgPSAnZGF5Jykge1xuICAgIGxldCBjbG9zaW5nQmFsYW5jZSA9IDA7XG4gICAgY29uc3QgbW9tZW50Q2xvc2luZ0RhdGUgPSBtb21lbnQoY2xvc2luZ0RhdGUpO1xuXG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAvLyBDYW4gbm90IGNvbnRpbnVlIGlmIG5vdCBiZWZvcmUgb3IgZXZlbnQgc2FtZSBjbG9zaW5nIGRhdGUuXG4gICAgICBpZiAoXG4gICAgICAgICghbW9tZW50Q2xvc2luZ0RhdGUuaXNBZnRlcihlbnRyeS5kYXRlLCBkYXRlVHlwZSkgJiZcbiAgICAgICAgICAhbW9tZW50Q2xvc2luZ0RhdGUuaXNTYW1lKGVudHJ5LmRhdGUsIGRhdGVUeXBlKSkgfHxcbiAgICAgICAgKGVudHJ5LmFjY291bnQgIT09IGFjY291bnRJZCAmJiBhY2NvdW50SWQpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LmFjY291bnROb3JtYWwgPT09ICdjcmVkaXQnKSB7XG4gICAgICAgIGNsb3NpbmdCYWxhbmNlICs9IGVudHJ5LmNyZWRpdCA/IGVudHJ5LmNyZWRpdCA6IC0xICogZW50cnkuZGViaXQ7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmFjY291bnROb3JtYWwgPT09ICdkZWJpdCcpIHtcbiAgICAgICAgY2xvc2luZ0JhbGFuY2UgKz0gZW50cnkuZGViaXQgPyBlbnRyeS5kZWJpdCA6IC0xICogZW50cnkuY3JlZGl0O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9zaW5nQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZ2l2ZW4gYWNjb3VudCBiYWxhbmNlIHdpdGggZGVwZW5kZW5jaWVzIGFjY291bnRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gYWNjb3VudElkXG4gICAqIEBwYXJhbSB7RGF0ZX0gY2xvc2luZ0RhdGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGVUeXBlXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICovXG4gIGdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCwgY2xvc2luZ0RhdGUsIGRhdGVUeXBlKSB7XG4gICAgY29uc3QgYWNjb3VudE5vZGUgPSB0aGlzLmFjY291bnRzR3JhcGguZ2V0Tm9kZURhdGEoYWNjb3VudElkKTtcbiAgICBjb25zdCBkZXBBY2NvdW50c0lkcyA9IHRoaXMuYWNjb3VudHNHcmFwaC5kZXBlbmRlbmNpZXNPZihhY2NvdW50SWQpO1xuICAgIGNvbnN0IGRlcEFjY291bnRzID0gZGVwQWNjb3VudHNJZHMubWFwKChpZCkgPT5cbiAgICAgIHRoaXMuYWNjb3VudHNHcmFwaC5nZXROb2RlRGF0YShpZClcbiAgICApO1xuICAgIGxldCBiYWxhbmNlID0gMDtcblxuICAgIFsuLi5kZXBBY2NvdW50cywgYWNjb3VudE5vZGVdLmZvckVhY2goKGFjY291bnQpID0+IHtcbiAgICAgIC8vIGlmICghdGhpcy5hY2NvdW50c0JhbGFuY2VUYWJsZVthY2NvdW50LmlkXSkge1xuICAgICAgY29uc3QgY2xvc2luZ0JhbGFuY2UgPSB0aGlzLmdldENsb3NpbmdCYWxhbmNlKFxuICAgICAgICBhY2NvdW50LmlkLFxuICAgICAgICBjbG9zaW5nRGF0ZSxcbiAgICAgICAgZGF0ZVR5cGVcbiAgICAgICk7XG4gICAgICB0aGlzLmFjY291bnRzQmFsYW5jZVRhYmxlW2FjY291bnQuaWRdID0gY2xvc2luZ0JhbGFuY2U7XG4gICAgICAvLyB9XG4gICAgICBiYWxhbmNlICs9IHRoaXMuYWNjb3VudHNCYWxhbmNlVGFibGVbYWNjb3VudC5pZF07XG4gICAgfSk7XG4gICAgcmV0dXJuIGJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGNyZWRpdC9kZWJpdCBzdW1hdGlvbiBmb3IgdGhlIGdpdmVuIGFjY291bnQgYW5kIGRhdGUuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhY2NvdW50IC1cbiAgICogQHBhcmFtIHtEYXRlfFN0cmluZ30gY2xvc2luZ0RhdGUgLVxuICAgKi9cbiAgZ2V0VHJpYWxCYWxhbmNlKGFjY291bnRJZCwgY2xvc2luZ0RhdGUsIGRhdGVUeXBlKSB7XG4gICAgY29uc3QgbW9tZW50Q2xvc2luZ0RhdGUgPSBtb21lbnQoY2xvc2luZ0RhdGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIGNyZWRpdDogMCxcbiAgICAgIGRlYml0OiAwLFxuICAgICAgYmFsYW5jZTogMCxcbiAgICB9O1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAoIW1vbWVudENsb3NpbmdEYXRlLmlzQWZ0ZXIoZW50cnkuZGF0ZSwgZGF0ZVR5cGUpICYmXG4gICAgICAgICAgIW1vbWVudENsb3NpbmdEYXRlLmlzU2FtZShlbnRyeS5kYXRlLCBkYXRlVHlwZSkpIHx8XG4gICAgICAgIChlbnRyeS5hY2NvdW50ICE9PSBhY2NvdW50SWQgJiYgYWNjb3VudElkKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5jcmVkaXQgKz0gZW50cnkuY3JlZGl0O1xuICAgICAgcmVzdWx0LmRlYml0ICs9IGVudHJ5LmRlYml0O1xuXG4gICAgICBpZiAoZW50cnkuYWNjb3VudE5vcm1hbCA9PT0gJ2NyZWRpdCcpIHtcbiAgICAgICAgcmVzdWx0LmJhbGFuY2UgKz0gZW50cnkuY3JlZGl0IC0gZW50cnkuZGViaXQ7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmFjY291bnROb3JtYWwgPT09ICdkZWJpdCcpIHtcbiAgICAgICAgcmVzdWx0LmJhbGFuY2UgKz0gZW50cnkuZGViaXQgLSBlbnRyeS5jcmVkaXQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0cmlhbCBiYWxhbmNlIG9mIHRoZSBnaXZlbiBhY2NvdW50IHdpdGggZGVwZW5kcy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFjY291bnRJZFxuICAgKiBAcGFyYW0ge0RhdGV9IGNsb3NpbmdEYXRlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRlVHlwZVxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqL1xuXG4gIGdldFRyaWFsQmFsYW5jZVdpdGhEZXBhbmRzKGFjY291bnRJZCwgY2xvc2luZ0RhdGUsIGRhdGVUeXBlKSB7XG4gICAgY29uc3QgYWNjb3VudE5vZGUgPSB0aGlzLmFjY291bnRzR3JhcGguZ2V0Tm9kZURhdGEoYWNjb3VudElkKTtcbiAgICBjb25zdCBkZXBBY2NvdW50c0lkcyA9IHRoaXMuYWNjb3VudHNHcmFwaC5kZXBlbmRlbmNpZXNPZihhY2NvdW50SWQpO1xuICAgIGNvbnN0IGRlcEFjY291bnRzID0gZGVwQWNjb3VudHNJZHMubWFwKChpZCkgPT5cbiAgICAgIHRoaXMuYWNjb3VudHNHcmFwaC5nZXROb2RlRGF0YShpZClcbiAgICApO1xuXG4gICAgY29uc3QgdHJpYWxCYWxhbmNlID0geyBjcmVkaXQ6IDAsIGRlYml0OiAwLCBiYWxhbmNlOiAwIH07XG5cbiAgICBbLi4uZGVwQWNjb3VudHMsIGFjY291bnROb2RlXS5mb3JFYWNoKChhY2NvdW50KSA9PiB7XG4gICAgICBjb25zdCBfdHJpYWxCYWxhbmNlID0gdGhpcy5nZXRUcmlhbEJhbGFuY2UoXG4gICAgICAgIGFjY291bnQuaWQsXG4gICAgICAgIGNsb3NpbmdEYXRlLFxuICAgICAgICBkYXRlVHlwZVxuICAgICAgKTtcblxuICAgICAgdHJpYWxCYWxhbmNlLmNyZWRpdCArPSBfdHJpYWxCYWxhbmNlLmNyZWRpdDtcbiAgICAgIHRyaWFsQmFsYW5jZS5kZWJpdCArPSBfdHJpYWxCYWxhbmNlLmRlYml0O1xuICAgICAgdHJpYWxCYWxhbmNlLmJhbGFuY2UgKz0gX3RyaWFsQmFsYW5jZS5iYWxhbmNlO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmlhbEJhbGFuY2U7XG4gIH1cblxuICBnZXRDb250YWN0VHJpYWxCYWxhbmNlKFxuICAgIGFjY291bnRJZCxcbiAgICBjb250YWN0SWQsXG4gICAgY29udGFjdFR5cGUsXG4gICAgY2xvc2luZ0RhdGUsXG4gICAgb3BlbmluZ0RhdGVcbiAgKSB7XG4gICAgY29uc3QgbW9tZW50Q2xvc2luZ0RhdGUgPSBtb21lbnQoY2xvc2luZ0RhdGUpO1xuICAgIGNvbnN0IG1vbWVudE9wZW5pbmdEYXRlID0gbW9tZW50KG9wZW5pbmdEYXRlKTtcbiAgICBjb25zdCB0cmlhbCA9IHtcbiAgICAgIGNyZWRpdDogMCxcbiAgICAgIGRlYml0OiAwLFxuICAgICAgYmFsYW5jZTogMCxcbiAgICB9O1xuXG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIChjbG9zaW5nRGF0ZSAmJlxuICAgICAgICAgICFtb21lbnRDbG9zaW5nRGF0ZS5pc0FmdGVyKGVudHJ5LmRhdGUsICdkYXknKSAmJlxuICAgICAgICAgICFtb21lbnRDbG9zaW5nRGF0ZS5pc1NhbWUoZW50cnkuZGF0ZSwgJ2RheScpKSB8fFxuICAgICAgICAob3BlbmluZ0RhdGUgJiZcbiAgICAgICAgICAhbW9tZW50T3BlbmluZ0RhdGUuaXNCZWZvcmUoZW50cnkuZGF0ZSwgJ2RheScpICYmXG4gICAgICAgICAgIW1vbWVudE9wZW5pbmdEYXRlLmlzU2FtZShlbnRyeS5kYXRlKSkgfHxcbiAgICAgICAgKGFjY291bnRJZCAmJiBlbnRyeS5hY2NvdW50ICE9PSBhY2NvdW50SWQpIHx8XG4gICAgICAgIChjb250YWN0SWQgJiYgZW50cnkuY29udGFjdElkICE9PSBjb250YWN0SWQpIHx8XG4gICAgICAgIGVudHJ5LmNvbnRhY3RUeXBlICE9PSBjb250YWN0VHlwZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlbnRyeS5jcmVkaXQpIHtcbiAgICAgICAgdHJpYWwuYmFsYW5jZSAtPSBlbnRyeS5jcmVkaXQ7XG4gICAgICAgIHRyaWFsLmNyZWRpdCArPSBlbnRyeS5jcmVkaXQ7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnkuZGViaXQpIHtcbiAgICAgICAgdHJpYWwuYmFsYW5jZSArPSBlbnRyeS5kZWJpdDtcbiAgICAgICAgdHJpYWwuZGViaXQgKz0gZW50cnkuZGViaXQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyaWFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRvdGFsIGJhbG5hY2Ugb2YgdGhlIGdpdmVuIGN1c3RvbWVyL3ZlbmRvciBjb250YWN0LlxuICAgKiBAcGFyYW0ge051bWJlcn0gYWNjb3VudElkXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjb250YWN0SWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRhY3RUeXBlXG4gICAqIEBwYXJhbSB7RGF0ZX0gY2xvc2luZ0RhdGVcbiAgICovXG4gIGdldENvbnRhY3RCYWxhbmNlKFxuICAgIGFjY291bnRJZCxcbiAgICBjb250YWN0SWQsXG4gICAgY29udGFjdFR5cGUsXG4gICAgY2xvc2luZ0RhdGUsXG4gICAgb3BlbmluZ0RhdGVcbiAgKSB7XG4gICAgY29uc3QgbW9tZW50Q2xvc2luZ0RhdGUgPSBtb21lbnQoY2xvc2luZ0RhdGUpO1xuICAgIGxldCBiYWxhbmNlID0gMDtcblxuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAoY2xvc2luZ0RhdGUgJiZcbiAgICAgICAgICAhbW9tZW50Q2xvc2luZ0RhdGUuaXNBZnRlcihlbnRyeS5kYXRlLCAnZGF5JykgJiZcbiAgICAgICAgICAhbW9tZW50Q2xvc2luZ0RhdGUuaXNTYW1lKGVudHJ5LmRhdGUsICdkYXknKSkgfHxcbiAgICAgICAgKGVudHJ5LmFjY291bnQgIT09IGFjY291bnRJZCAmJiBhY2NvdW50SWQpIHx8XG4gICAgICAgIChjb250YWN0SWQgJiYgZW50cnkuY29udGFjdElkICE9PSBjb250YWN0SWQpIHx8XG4gICAgICAgIGVudHJ5LmNvbnRhY3RUeXBlICE9PSBjb250YWN0VHlwZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlbnRyeS5jcmVkaXQpIHtcbiAgICAgICAgYmFsYW5jZSAtPSBlbnRyeS5jcmVkaXQ7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnkuZGViaXQpIHtcbiAgICAgICAgYmFsYW5jZSArPSBlbnRyeS5kZWJpdDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGZldGNoZWQgYWNjb3VudHMgam91cm5hbCBlbnRyaWVzLlxuICAgKiBAcGFyYW0ge0FycmF5fSBlbnRyaWVzIC1cbiAgICovXG4gIGxvYWRFbnRyaWVzKGVudHJpZXMpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICB0aGlzLmVudHJpZXMucHVzaCh7XG4gICAgICAgIC4uLmVudHJ5LFxuICAgICAgICBhY2NvdW50OiBlbnRyeS5hY2NvdW50ID8gZW50cnkuYWNjb3VudC5pZCA6IGVudHJ5LmFjY291bnRJZCxcbiAgICAgICAgYWNjb3VudE5vcm1hbDpcbiAgICAgICAgICBlbnRyeS5hY2NvdW50ICYmIGVudHJ5LmFjY291bnQudHlwZVxuICAgICAgICAgICAgPyBlbnRyeS5hY2NvdW50LnR5cGUubm9ybWFsXG4gICAgICAgICAgICA6IGVudHJ5LmFjY291bnROb3JtYWwsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNhbGN1bGF0ZUVudHJpZXNCYWxhbmNlQ2hhbmdlKCkge1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgaWYgKGVudHJ5LmNyZWRpdCkge1xuICAgICAgICB0aGlzLnNldEFjY291bnRCYWxhbmNlQ2hhbmdlKGVudHJ5LCAnY3JlZGl0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnkuZGViaXQpIHtcbiAgICAgICAgdGhpcy5zZXRBY2NvdW50QmFsYW5jZUNoYW5nZShlbnRyeSwgJ2RlYml0Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBOb2RlQ2FjaGUgZnJvbSAnbm9kZS1jYWNoZSc7XG5cbmNsYXNzIENhY2hlIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNhY2hlID0gbmV3IE5vZGVDYWNoZSh7XG4gICAgICAvLyBzdGRUVEw6IDk5OTk5OTksXG4gICAgICAvLyBjaGVja3BlcmlvZDogOTk5OTk5OSAqIDAuMixcbiAgICAgIHVzZUNsb25lczogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBnZXQoa2V5LCBzdG9yZUZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIFxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9yZUZ1bmN0aW9uKCkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICB0aGlzLmNhY2hlLnNldChrZXksIHJlc3VsdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgc2V0KGtleSwgcmVzdWx0cykge1xuICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgcmVzdWx0cyk7XG4gIH1cblxuICBkZWwoa2V5cykge1xuICAgIHRoaXMuY2FjaGUuZGVsKGtleXMpO1xuICB9XG5cbiAgZGVsU3RhcnRXaXRoKHN0YXJ0U3RyID0gJycpIHtcbiAgICBpZiAoIXN0YXJ0U3RyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IHRoaXMuY2FjaGUua2V5cygpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChrZXkuaW5kZXhPZihzdGFydFN0cikgPT09IDApIHtcbiAgICAgICAgdGhpcy5kZWwoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmbHVzaCgpIHtcbiAgICB0aGlzLmNhY2hlLmZsdXNoQWxsKCk7XG4gIH1cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBuZXcgQ2FjaGUoKTsiLCJpbXBvcnQgd2luc3RvbiBmcm9tICd3aW5zdG9uJztcblxuY29uc3QgdHJhbnNwb3J0cyA9IHtcbiAgY29uc29sZTogbmV3IHdpbnN0b24udHJhbnNwb3J0cy5Db25zb2xlKHsgbGV2ZWw6ICd3YXJuJyB9KSxcbiAgZmlsZTogbmV3IHdpbnN0b24udHJhbnNwb3J0cy5GaWxlKHsgZmlsZW5hbWU6ICdzdGRvdXQubG9nJyB9KSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpbnN0b24uY3JlYXRlTG9nZ2VyKHtcbiAgdHJhbnNwb3J0czogW1xuICAgIHRyYW5zcG9ydHMuY29uc29sZSxcbiAgICB0cmFuc3BvcnRzLmZpbGUsXG4gIF0sXG59KTtcbiIsIlxuXG5leHBvcnQgZGVmYXVsdCAoTW9kZWwpID0+IHtcbiAgcmV0dXJuIGNsYXNzIFVzZXJTdWJzY3JpcHRpb24gZXh0ZW5kcyBNb2RlbHtcblxuICAgIG9uVHJpYWwoKSB7XG4gICAgICBcbiAgICB9XG4gIFxuICAgIGdldFN1YnNjcmlwdGlvbigpIHtcbiAgXG4gICAgfVxuICBcbiAgICBuZXdTdWJzY3JpcHRpb24oKSB7XG4gICAgICBcbiAgICB9IFxuICBcbiAgICBpc1N1YmNyaWJlZFRvKHBsYW4pIHtcbiAgXG4gICAgfVxuICB9XG59OyIsImltcG9ydCBub2RlbWFpbGVyIGZyb20gJ25vZGVtYWlsZXInO1xuaW1wb3J0IGNvbmZpZyBmcm9tICdALy4uL2NvbmZpZy9jb25maWcnO1xuXG4vLyBjcmVhdGUgcmV1c2FibGUgdHJhbnNwb3J0ZXIgb2JqZWN0IHVzaW5nIHRoZSBkZWZhdWx0IFNNVFAgdHJhbnNwb3J0XG5jb25zdCB0cmFuc3BvcnRlciA9IG5vZGVtYWlsZXIuY3JlYXRlVHJhbnNwb3J0KHtcbiAgaG9zdDogY29uZmlnLm1haWwuaG9zdCxcbiAgcG9ydDogY29uZmlnLm1haWwucG9ydCxcbiAgc2VjdXJlOiBjb25maWcubWFpbC5zZWN1cmUsIC8vIHRydWUgZm9yIDQ2NSwgZmFsc2UgZm9yIG90aGVyIHBvcnRzXG4gIGF1dGg6IHtcbiAgICB1c2VyOiBjb25maWcubWFpbC51c2VybmFtZSxcbiAgICBwYXNzOiBjb25maWcubWFpbC5wYXNzd29yZCxcbiAgfSxcbn0pO1xuXG5jb25zb2xlLmxvZyh7XG4gIGhvc3Q6IGNvbmZpZy5tYWlsLmhvc3QsXG4gIHBvcnQ6IGNvbmZpZy5tYWlsLnBvcnQsXG4gIHNlY3VyZTogY29uZmlnLm1haWwuc2VjdXJlLCAvLyB0cnVlIGZvciA0NjUsIGZhbHNlIGZvciBvdGhlciBwb3J0c1xuICBhdXRoOiB7XG4gICAgdXNlcjogY29uZmlnLm1haWwudXNlcm5hbWUsXG4gICAgcGFzczogY29uZmlnLm1haWwucGFzc3dvcmQsXG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdHJhbnNwb3J0ZXI7XG4iLCJpbXBvcnQgS25leCBmcm9tICdrbmV4JztcbmltcG9ydCB7IGtuZXhTbmFrZUNhc2VNYXBwZXJzIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnQgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL1RlbmFudCc7XG5pbXBvcnQgY29uZmlnIGZyb20gJ0AvLi4vY29uZmlnL2NvbmZpZyc7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IHVuaXFpZCBmcm9tICd1bmlxaWQnO1xuaW1wb3J0IGRiTWFuYWdlciBmcm9tICdAL2RhdGFiYXNlL21hbmFnZXInO1xuaW1wb3J0IHsgb21pdCB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCBTeXN0ZW1Vc2VyIGZyb20gJ0Avc3lzdGVtL21vZGVscy9TeXN0ZW1Vc2VyJztcbmltcG9ydCBUZW5hbnRVc2VyIGZyb20gJ0AvbW9kZWxzL1RlbmFudFVzZXInO1xuLy8gaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuLy8gY29uc3QgVGVuYW50V2Vic2l0ZToge1xuLy8gICB0ZW5hbnREYjogS25leCxcbi8vICAgdGVuYW50SWQ6IE51bWJlcixcbi8vICAgdGVuYW50T3JnYW5pemF0aW9uSWQ6IFN0cmluZyxcbi8vIH1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVuYW50c01hbmFnZXIge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMua25leENhY2hlID0gbmV3IE1hcCgpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldFRlbmFudChvcmdhbml6YXRpb25JZCkge1xuICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IFRlbmFudC5xdWVyeSgpXG4gICAgICAud2hlcmUoJ29yZ2FuaXphdGlvbl9pZCcsIG9yZ2FuaXphdGlvbklkKS5maXJzdCgpO1xuXG4gICAgcmV0dXJuIHRlbmFudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHRlbmFudCBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtJbnRlZ2VyfSB1bmlxSWQgXG4gICAqIEByZXR1cm4ge1RlbmFudFdlYnNpdGV9XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY3JlYXRlVGVuYW50KHVuaXFJZCkge1xuICAgIGNvbnN0IG9yZ2FuaXphdGlvbklkID0gdW5pcUlkIHx8IHVuaXFpZCgpO1xuICAgIGNvbnN0IHRlbmFudE9yZ2FuaXphdGlvbiA9IGF3YWl0IFRlbmFudC5xdWVyeSgpLmluc2VydCh7XG4gICAgICBvcmdhbml6YXRpb25faWQ6IG9yZ2FuaXphdGlvbklkLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVuYW50RGJOYW1lID0gYGJpZ2NhcGl0YWxfdGVuYW50XyR7b3JnYW5pemF0aW9uSWR9YDtcbiAgICBhd2FpdCBkYk1hbmFnZXIuY3JlYXRlRGIodGVuYW50RGJOYW1lKTtcblxuICAgIGNvbnN0IHRlbmFudERiID0gVGVuYW50c01hbmFnZXIua25leEluc3RhbmNlKG9yZ2FuaXphdGlvbklkKTtcbiAgICBhd2FpdCB0ZW5hbnREYi5taWdyYXRlLmxhdGVzdCgpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB0ZW5hbnREYixcbiAgICAgIHRlbmFudElkOiB0ZW5hbnRPcmdhbml6YXRpb24uaWQsXG4gICAgICBvcmdhbml6YXRpb25JZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3AgdGVuYW50IGRhdGFiYXNlIG9mIHRoZSBnaXZlbiB0ZW5hbnQgd2Vic2l0ZS5cbiAgICogQHBhcmFtIHtUZW5hbnRXZWJzaXRlfSB0ZW5hbnRXZWJzaXRlIFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRyb3BUZW5hbnQodGVuYW50V2Vic2l0ZSkge1xuICAgIGNvbnN0IHRlbmFudERiTmFtZSA9IGBiaWdjYXBpdGFsX3RlbmFudF8ke3RlbmFudFdlYnNpdGUub3JnYW5pemF0aW9uSWR9YDtcbiAgICBhd2FpdCBkYk1hbmFnZXIuZHJvcERiKHRlbmFudERiTmFtZSk7XG5cbiAgICBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KClcbiAgICAgIC53aGVyZSgndGVuYW50X2lkJywgdGVuYW50V2Vic2l0ZS50ZW5hbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHVzZXIgdGhhdCBhc3NvY2lhdGUgdG8gdGhlIGdpdmVuIHRlbmFudC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVUZW5hbnRVc2VyKHRlbmFudFdlYnNpdGUsIHVzZXIpIHtcbiAgICBjb25zdCB1c2VySW5zZXJ0ID0geyAuLi51c2VyIH07XG5cbiAgICBjb25zdCBzeXN0ZW1Vc2VyID0gYXdhaXQgU3lzdGVtVXNlci5xdWVyeSgpLmluc2VydCh7XG4gICAgICAuLi51c2VyLFxuICAgICAgdGVuYW50X2lkOiB0ZW5hbnRXZWJzaXRlLnRlbmFudElkLFxuICAgIH0pO1xuICAgIFRlbmFudE1vZGVsLmtuZXhCaW5kZWQgPSB0ZW5hbnRXZWJzaXRlLnRlbmFudERiO1xuXG4gICAgY29uc3QgdGVuYW50VXNlciA9IGF3YWl0IFRlbmFudFVzZXIuYmluZEtuZXgodGVuYW50V2Vic2l0ZS50ZW5hbnREYilcbiAgICAgIC5xdWVyeSgpXG4gICAgICAuaW5zZXJ0KHtcbiAgICAgICAgLi4ub21pdCh1c2VySW5zZXJ0LCBbJ3Bhc3N3b3JkJ10pLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRlbmFudFVzZXIsXG4gICAgICAuLi5zeXN0ZW1Vc2VyXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhbGwgdGVuYW50cyBtZXRhZGF0YSBmcm9tIHN5c3RlbSBzdG9yYWdlLlxuICAgKi9cbiAgc3RhdGljIGdldEFsbFRlbmFudHMoKSB7XG4gICAgcmV0dXJuIFRlbmFudC5xdWVyeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBnaXZlbiBvcmdhbml6YXRpb24gaWQga25leCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3JnYW5pemF0aW9uSWQgLVxuICAgKi9cbiAgc3RhdGljIGdldFRlbmFudEtuZXhDb25maWcob3JnYW5pemF0aW9uSWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50OiBjb25maWcudGVuYW50LmRiX2NsaWVudCxcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgaG9zdDogY29uZmlnLnRlbmFudC5kYl9ob3N0LFxuICAgICAgICB1c2VyOiBjb25maWcudGVuYW50LmRiX3VzZXIsXG4gICAgICAgIHBhc3N3b3JkOiBjb25maWcudGVuYW50LmRiX3Bhc3N3b3JkLFxuICAgICAgICBkYXRhYmFzZTogYCR7Y29uZmlnLnRlbmFudC5kYl9uYW1lX3ByZWZpeH0ke29yZ2FuaXphdGlvbklkfWAsXG4gICAgICAgIGNoYXJzZXQ6IGNvbmZpZy50ZW5hbnQuY2hhcnNldCxcbiAgICAgIH0sXG4gICAgICBtaWdyYXRpb25zOiB7XG4gICAgICAgIGRpcmVjdG9yeTogY29uZmlnLnRlbmFudC5taWdyYXRpb25zX2RpcixcbiAgICAgIH0sXG4gICAgICBzZWVkczoge1xuICAgICAgICBkaXJlY3Rvcnk6IGNvbmZpZy50ZW5hbnQuc2VlZHNfZGlyLFxuICAgICAgfSxcbiAgICAgIHBvb2w6IHsgbWluOiAwLCBtYXg6IDUgfSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGtuZXhJbnN0YW5jZShvcmdhbml6YXRpb25JZCkge1xuICAgIGNvbnN0IGtuZXhDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25leCA9IGtuZXhDYWNoZS5nZXQob3JnYW5pemF0aW9uSWQpO1xuXG4gICAgaWYgKCFrbmV4KSB7XG4gICAgICBrbmV4ID0gS25leCh7XG4gICAgICAgIC4uLnRoaXMuZ2V0VGVuYW50S25leENvbmZpZyhvcmdhbml6YXRpb25JZCksXG4gICAgICAgIC4uLmtuZXhTbmFrZUNhc2VNYXBwZXJzKHsgdXBwZXJDYXNlOiB0cnVlIH0pLFxuICAgICAgfSk7XG4gICAgICBrbmV4Q2FjaGUuc2V0KG9yZ2FuaXphdGlvbklkLCBrbmV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGtuZXg7XG4gIH1cbn0iLCJpbXBvcnQgU3lzdGVtTW9kZWwgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL1N5c3RlbU1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlckludml0ZSBleHRlbmRzIFN5c3RlbU1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3VzZXJfaW52aXRlcyc7XG4gIH1cbn1cbiIsImltcG9ydCBTeXN0ZW1Nb2RlbCBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXNzd29yZFJlc2V0cyBleHRlbmRzIFN5c3RlbU1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAncGFzc3dvcmRfcmVzZXRzJztcbiAgfVxufVxuIiwiaW1wb3J0IFN5c3RlbU1vZGVsIGZyb20gJ0Avc3lzdGVtL21vZGVscy9TeXN0ZW1Nb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1YnNjcmlwdGlvblVzYWdlIGV4dGVuZHMgU3lzdGVtTW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdzdWJzY3JpcHRpb25zX3VzYWdlJztcbiAgfVxufVxuIiwiaW1wb3J0IEJhc2VNb2RlbCBmcm9tICdAL21vZGVscy9Nb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5c3RlbU1vZGVsIGV4dGVuZHMgQmFzZU1vZGVse1xufSIsImltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgYmNyeXB0IGZyb20gJ2JjcnlwdGpzJztcbmltcG9ydCBTeXN0ZW1Nb2RlbCBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtTW9kZWwnO1xuaW1wb3J0IFVzZXJTdWJzY3JpcHRpb24gZnJvbSAnQC9zZXJ2aWNlcy9TdWJzY3JpcHRpb24vVXNlclN1YnNjcmlwdGlvbic7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtVXNlciBleHRlbmRzIG1peGluKFN5c3RlbU1vZGVsLCBbVXNlclN1YnNjcmlwdGlvbl0pIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3VzZXJzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXBzIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIFsnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCddO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFRlbmFudCA9IHJlcXVpcmUoJ0Avc3lzdGVtL21vZGVscy9UZW5hbnQnKTtcbiAgICBjb25zdCBTdWJzY3JpcHRpb25Vc2FnZSA9IHJlcXVpcmUoJ0Avc3lzdGVtL21vZGVscy9TdWJzY3JpcHRpb25Vc2FnZScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbmFudDoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IFRlbmFudC5kZWZhdWx0LFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ3VzZXJzLnRlbmFudElkJyxcbiAgICAgICAgICB0bzogJ3RlbmFudHMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgc3Vic2NyaXB0aW9uVXNhZ2U6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiBTdWJzY3JpcHRpb25Vc2FnZS5kZWZhdWx0LFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ3VzZXJzLmlkJyxcbiAgICAgICAgICB0bzogJ3N1YnNjcmlwdGlvbnNfdXNhZ2UudXNlcl9pZCcsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgdGhlIHBhc3N3b3JkIG9mIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHBhc3N3b3JkIC0gVGhlIGdpdmVuIHBhc3N3b3JkLlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgdmVyaWZ5UGFzc3dvcmQocGFzc3dvcmQpIHtcbiAgICByZXR1cm4gYmNyeXB0LmNvbXBhcmVTeW5jKHBhc3N3b3JkLCB0aGlzLnBhc3N3b3JkKTtcbiAgfVxufVxuIiwiaW1wb3J0IEJhc2VNb2RlbCBmcm9tICdAL21vZGVscy9Nb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbmFudCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICd0ZW5hbnRzJztcbiAgfVxufVxuIiwiaW1wb3J0IGJjcnlwdCBmcm9tICdiY3J5cHRqcyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuY29uc3QgeyBtYXAsIGlzQXJyYXksIGlzUGxhaW5PYmplY3QsIG1hcEtleXMsIG1hcFZhbHVlcyB9ID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5cbmNvbnN0IGhhc2hQYXNzd29yZCA9IChwYXNzd29yZCkgPT5cbiAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBiY3J5cHQuZ2VuU2FsdCgxMCwgKGVycm9yLCBzYWx0KSA9PiB7XG4gICAgICBiY3J5cHQuaGFzaChwYXNzd29yZCwgc2FsdCwgKGVyciwgaGFzaCkgPT4ge1xuICAgICAgICByZXNvbHZlKGhhc2gpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG5jb25zdCBvcmlnaW4gPSAocmVxdWVzdCkgPT4gYCR7cmVxdWVzdC5wcm90b2NvbH06Ly8ke3JlcXVlc3QuaG9zdG5hbWV9YDtcblxuY29uc3QgZGF0ZVJhbmdlQ29sbGVjdGlvbiA9IChcbiAgZnJvbURhdGUsXG4gIHRvRGF0ZSxcbiAgYWRkVHlwZSA9ICdkYXknLFxuICBpbmNyZW1lbnQgPSAxXG4pID0+IHtcbiAgY29uc3QgY29sbGVjdGlvbiA9IFtdO1xuICBjb25zdCBtb21lbnRGcm9tRGF0ZSA9IG1vbWVudChmcm9tRGF0ZSk7XG4gIGxldCBkYXRlRm9ybWF0ID0gJyc7XG5cbiAgc3dpdGNoIChhZGRUeXBlKSB7XG4gICAgY2FzZSAnZGF5JzpcbiAgICBkZWZhdWx0OlxuICAgICAgZGF0ZUZvcm1hdCA9ICdZWVlZLU1NLUREJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgIGRhdGVGb3JtYXQgPSAnWVlZWS1NTSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIGRhdGVGb3JtYXQgPSAnWVlZWSc7XG4gICAgICBicmVhaztcbiAgfVxuICBmb3IgKFxuICAgIGxldCBpID0gbW9tZW50RnJvbURhdGU7XG4gICAgaS5pc0JlZm9yZSh0b0RhdGUsIGFkZFR5cGUpIHx8IGkuaXNTYW1lKHRvRGF0ZSwgYWRkVHlwZSk7XG4gICAgaS5hZGQoaW5jcmVtZW50LCBgJHthZGRUeXBlfXNgKVxuICApIHtcbiAgICBjb2xsZWN0aW9uLnB1c2goaS5lbmRPZihhZGRUeXBlKS5mb3JtYXQoZGF0ZUZvcm1hdCkpO1xuICB9XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufTtcblxuY29uc3QgZGF0ZVJhbmdlRm9ybWF0ID0gKHJhbmdlVHlwZSkgPT4ge1xuICBzd2l0Y2ggKHJhbmdlVHlwZSkge1xuICAgIGNhc2UgJ3llYXInOlxuICAgICAgcmV0dXJuICdZWVlZJztcbiAgICBjYXNlICdtb250aCc6XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnWVlZWS1NTSc7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIG1hcEtleXNEZWVwKG9iaiwgY2IsIGlzUmVjdXJzaXZlKSB7XG4gIGlmICghb2JqICYmICFpc1JlY3Vyc2l2ZSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBpZiAoIWlzUmVjdXJzaXZlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHxcbiAgICAgIHR5cGVvZiBvYmogPT09ICdudW1iZXInIHx8XG4gICAgICB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbidcbiAgICApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKChpdGVtKSA9PiBtYXBLZXlzRGVlcChpdGVtLCBjYiwgdHJ1ZSkpO1xuICB9XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IF8ubWFwS2V5cyhvYmosIGNiKTtcbiAgcmV0dXJuIF8ubWFwVmFsdWVzKHJlc3VsdCwgKHZhbHVlKSA9PiBtYXBLZXlzRGVlcCh2YWx1ZSwgY2IsIHRydWUpKTtcbn1cblxuY29uc3QgbWFwVmFsdWVzRGVlcCA9ICh2LCBjYWxsYmFjaykgPT5cbiAgXy5pc09iamVjdCh2KVxuICAgID8gXy5tYXBWYWx1ZXModiwgKHYpID0+IG1hcFZhbHVlc0RlZXAodiwgY2FsbGJhY2spKVxuICAgIDogY2FsbGJhY2sodik7XG5cbmNvbnN0IHByb21pc2VTZXJpYWwgPSAoZnVuY3MpID0+IHtcbiAgcmV0dXJuIGZ1bmNzLnJlZHVjZShcbiAgICAocHJvbWlzZSwgZnVuYykgPT5cbiAgICAgIHByb21pc2UudGhlbigocmVzdWx0KSA9PlxuICAgICAgICBmdW5jKCkudGhlbihBcnJheS5wcm90b3R5cGUuY29uY2F0LmJpbmQocmVzdWx0KSlcbiAgICAgICksXG4gICAgUHJvbWlzZS5yZXNvbHZlKFtdKVxuICApO1xufTtcblxuY29uc3QgZmxhdFRvTmVzdGVkQXJyYXkgPSAoXG4gIGRhdGEsXG4gIGNvbmZpZyA9IHsgaWQ6ICdpZCcsIHBhcmVudElkOiAncGFyZW50X2lkJyB9XG4pID0+IHtcbiAgY29uc3QgbWFwID0ge307XG4gIGNvbnN0IG5lc3RlZEFycmF5ID0gW107XG5cbiAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgbWFwW2l0ZW1bY29uZmlnLmlkXV0gPSBpdGVtO1xuICAgIG1hcFtpdGVtW2NvbmZpZy5pZF1dLmNoaWxkcmVuID0gW107XG4gIH0pO1xuXG4gIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGNvbnN0IHBhcmVudEl0ZW1JZCA9IGl0ZW1bY29uZmlnLnBhcmVudElkXTtcblxuICAgIGlmICghaXRlbVtjb25maWcucGFyZW50SWRdKSB7XG4gICAgICBuZXN0ZWRBcnJheS5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgICBpZiAocGFyZW50SXRlbUlkKSB7XG4gICAgICBtYXBbcGFyZW50SXRlbUlkXS5jaGlsZHJlbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG5lc3RlZEFycmF5O1xufTtcblxuZXhwb3J0IHtcbiAgaGFzaFBhc3N3b3JkLFxuICBvcmlnaW4sXG4gIGRhdGVSYW5nZUNvbGxlY3Rpb24sXG4gIGRhdGVSYW5nZUZvcm1hdCxcbiAgbWFwVmFsdWVzRGVlcCxcbiAgbWFwS2V5c0RlZXAsXG4gIHByb21pc2VTZXJpYWwsXG4gIGZsYXRUb05lc3RlZEFycmF5LFxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9wbHVnaW4tdHJhbnNmb3JtLXJ1bnRpbWVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJhcHAtcm9vdC1wYXRoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJjcnlwdGpzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNyeXB0b1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJkb3RlbnZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXJyb3JoYW5kbGVyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV4cHJlc3NcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXhwcmVzcy1ib29tXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV4cHJlc3MtZmlsZXVwbG9hZFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJleHByZXNzLXZhbGlkYXRvclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJoZWxtZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaTE4blwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJqc29ud2VidG9rZW5cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwia25leFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJrbmV4LWRiLW1hbmFnZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vbWVudFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtdXN0YWNoZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlLWNhY2hlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGVtYWlsZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwib2JqZWN0aW9uXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidW5pcWlkXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIndpbnN0b25cIik7Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM3QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2xIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1pBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbENBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDWEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDZkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdEtBO0FBd0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF4TUE7QUEwTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBNUlBO0FBOElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdjRCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEJBO0FBQ0E7QUFDQTtBQTBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDL2tCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdUQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUlBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM1WEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN01BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0RkE7QUF3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTdIQTtBQStIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdtQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMxQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeEdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE1SEE7QUE4SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNqSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDckxBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNyT0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDcE5BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzlHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2hLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0UEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUtBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25VQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBMURBO0FBNERBO0FBQ0E7QUFDQTtBQTlEQTtBQWdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFqSUE7QUFtSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFyQkE7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5ZUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBckJBO0FBdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNUpBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDclBBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFJQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JYQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBT0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUExR0E7QUE0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNwZEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN4RUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN4REE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDOUJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuRUE7QUFBQTs7OztBQUlBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzVWQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN0JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQTNCQTtBQStCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUE5RUE7QUFtRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQXZGQTtBQTRGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdEdBO0FBd0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsSEE7QUFvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWpJQTtBQW1JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdKQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxREE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQkE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQW5FQTtBQXVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3hRQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN6RkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBbkpBOztBQU9BOztBQU9BO0FBU0E7QUFDQTtBQUhBOztBQTZEQTs7QUFTQTs7QUFZQTs7QUFZQTs7Ozs7Ozs7Ozs7O0FDcElBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUEvQkE7Ozs7Ozs7Ozs7OztBQ0xBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFwREE7O0FBV0E7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDZkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNsR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQy9CQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQy9DQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUFPQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBekNBOzs7Ozs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNmQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBCQTtBQXNCQTs7Ozs7Ozs7Ozs7O0FDekNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBM0NBOztBQUdBOztBQVdBOztBQVdBOztBQU9BOztBQXFCQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNwRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDaEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDekZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBbkJBOztBQU9BOzs7Ozs7Ozs7Ozs7QUNkQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBbkRBOztBQU9BOztBQU9BOztBQU9BOzs7Ozs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeEVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbGRBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25EQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDckJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdElBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOztBQTlDQTs7QUFPQTs7QUFPQTs7Ozs7Ozs7Ozs7O0FDeEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzSEE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7QSIsInNvdXJjZVJvb3QiOiIifQ==