-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path9.bundle.js
1 lines (1 loc) · 47.3 KB
/
9.bundle.js
1
(window.webpackJsonp=window.webpackJsonp||[]).push([[9,12],{249:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27);\n\n\n\nfunction capitalizeFirstLetter(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nvar TaskList = function TaskList(props) {\n var indent = [];\n if (props.tasks) props.tasks.forEach(function (prop) {\n if (prop !== \'empty\') indent.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("option", {\n key: prop,\n value: prop\n }, capitalizeFirstLetter(prop)));\n });\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("select", {\n className: "focus__btnPanel-tasks",\n onChange: function onChange(e) {\n props.onTaskChange(e.target.value);\n }\n }, indent);\n};\n\nvar mapsStateToProps = function mapsStateToProps(state) {\n return {\n tasks: !!state.tasks ? Object.keys(state.tasks) : false\n };\n};\n\nvar ConnectedTaskList = Object(react_redux__WEBPACK_IMPORTED_MODULE_1__[/* connect */ "b"])(mapsStateToProps)(TaskList);\n/* harmony default export */ __webpack_exports__["default"] = (ConnectedTaskList);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL0NvbXBvbmVudHMvQXRvbWljQ29tcG9uZW50cy9UYXNrTGlzdC5qcz8wMDZkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcblxuZnVuY3Rpb24gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSk7XG59XG5cbmNvbnN0IFRhc2tMaXN0ID0gKHByb3BzKSA9PiB7XG4gICAgbGV0IGluZGVudCA9IFtdO1xuICAgIFxuICAgIGlmKHByb3BzLnRhc2tzKVxuICAgICAgICBwcm9wcy50YXNrcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgaWYocHJvcCAhPT0gJ2VtcHR5JylcbiAgICAgICAgICAgICAgICBpbmRlbnQucHVzaCg8b3B0aW9uIGtleT17cHJvcH0gdmFsdWU9e3Byb3B9PntjYXBpdGFsaXplRmlyc3RMZXR0ZXIocHJvcCl9PC9vcHRpb24+KVxuICAgICAgICB9KTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxzZWxlY3QgY2xhc3NOYW1lPSdmb2N1c19fYnRuUGFuZWwtdGFza3MnIG9uQ2hhbmdlPXsoZSk9PntcbiAgICAgICAgICAgIHByb3BzLm9uVGFza0NoYW5nZShlLnRhcmdldC52YWx1ZSlcbiAgICAgICAgfX0+XG4gICAgICAgICAgICB7aW5kZW50fVxuICAgICAgICA8L3NlbGVjdD5cbiAgICApXG59O1xuXG5jb25zdCBtYXBzU3RhdGVUb1Byb3BzID0gKHN0YXRlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFza3M6ICEhc3RhdGUudGFza3M/T2JqZWN0LmtleXMoc3RhdGUudGFza3MpOmZhbHNlXG4gICAgfVxufVxuY29uc3QgQ29ubmVjdGVkVGFza0xpc3QgPSBjb25uZWN0KG1hcHNTdGF0ZVRvUHJvcHMpKFRhc2tMaXN0KTtcblxuZXhwb3J0IGRlZmF1bHQgQ29ubmVjdGVkVGFza0xpc3Q7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUVBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///249\n')},481:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(0);\nvar react_default = /*#__PURE__*/__webpack_require__.n(react);\n\n// EXTERNAL MODULE: ./node_modules/react-redux/es/index.js + 17 modules\nvar es = __webpack_require__(27);\n\n// EXTERNAL MODULE: ./node_modules/moment/moment.js\nvar moment = __webpack_require__(20);\nvar moment_default = /*#__PURE__*/__webpack_require__.n(moment);\n\n// EXTERNAL MODULE: ./src/Components/AtomicComponents/TaskList.js\nvar TaskList = __webpack_require__(249);\n\n// EXTERNAL MODULE: ./node_modules/react-chartjs-2/es/index.js\nvar react_chartjs_2_es = __webpack_require__(364);\n\n// CONCATENATED MODULE: ./src/Components/AtomicComponents/Chart.js\n\n\n\nvar Chart_Chart = function Chart(props) {\n if (props.type === \'bar\') return react_default.a.createElement(react_chartjs_2_es["a" /* Bar */], {\n data: props.data,\n options: {\n title: {\n display: true,\n fontSize: 18,\n text: props.title\n },\n legend: false\n }\n });else if (props.type === \'line\') return react_default.a.createElement(react_chartjs_2_es["c" /* Line */], {\n data: props.data,\n options: {\n title: {\n display: true,\n fontSize: 18,\n text: props.title\n },\n legend: false,\n maintainAspectRatio: false,\n responsive: true\n }\n });else if (props.type === \'doughnut\') return react_default.a.createElement("div", {\n className: "doughnutChart"\n }, react_default.a.createElement(react_chartjs_2_es["b" /* Doughnut */], {\n data: props.data,\n options: {\n title: {\n display: true,\n fontSize: 18,\n text: props.title\n },\n legend: false,\n maintainAspectRatio: false,\n responsive: true\n }\n }), react_default.a.createElement("div", {\n className: "stats__doughnut-legend"\n }, react_default.a.createElement("span", {\n className: "stats__doughnut-legend-completed"\n }, "Completed"), react_default.a.createElement("span", {\n className: "stats__doughnut-legend-incomplete"\n }, "Incomplete")));\n};\n\n/* harmony default export */ var AtomicComponents_Chart = (Chart_Chart);\n// EXTERNAL MODULE: ./src/firebase/firebase.js\nvar firebase = __webpack_require__(29);\n\n// CONCATENATED MODULE: ./src/Components/Stats.js\nfunction _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\nvar Stats_Stats =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(Stats, _Component);\n\n function Stats(props) {\n var _this;\n\n _classCallCheck(this, Stats);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(Stats).call(this, props));\n /*the state contains value for the dropdown lists as those change,\n what is rendered in the component should also change*/\n\n _defineProperty(_assertThisInitialized(_this), "filterFetchedDataByDays", function (days) {\n var beginDate;\n if (days === \'month\') beginDate = moment_default()().subtract(1, \'month\').calendar().split(\'/\');else if (days === \'6months\') beginDate = moment_default()().subtract(6, \'month\').calendar().split(\'/\');else if (typeof days === \'number\') beginDate = moment_default()().subtract(days, \'days\').calendar().split(\'/\'); //logic for extrating datelist\n\n /*this logic is flawed and the whole logic should be implemented in a backend \n since all lot of extracting needs to be done which will\n spoil the user experience */\n\n beginDate = beginDate[2] + beginDate[0] + beginDate[1];\n var dateList;\n var allDatesInDB = Object.keys(_this.fetchedData).sort().reverse();\n\n if (allDatesInDB.indexOf(beginDate) === -1) {\n var diff = 10000,\n indx;\n allDatesInDB.every(function (date) {\n if (parseInt(date) - parseInt(beginDate) < 0) return false;\n\n if (parseInt(date) - parseInt(beginDate) < diff) {\n diff = parseInt(date) - parseInt(beginDate);\n indx = allDatesInDB.indexOf(date);\n }\n\n return true;\n });\n dateList = allDatesInDB.slice(allDatesInDB.indexOf(_this.props.date), allDatesInDB.indexOf(indx));\n } else dateList = allDatesInDB.slice(allDatesInDB.indexOf(_this.props.date), allDatesInDB.indexOf(beginDate));\n\n dateList.forEach(function (date) {\n _this.filteredData[date] = _this.fetchedData[date];\n });\n });\n\n _defineProperty(_assertThisInitialized(_this), "filterDataByTasks", function () {\n if (_this.fetchedData[_this.state.dashboard.task]) _this.filteredData = _this.fetchedData[_this.state.dashboard.task];\n });\n\n _defineProperty(_assertThisInitialized(_this), "formatDates", function (list) {\n _this.dateLabelList = [];\n list.forEach(function (date) {\n _this.dateLabelList.push(date.split(\'\').slice(6, 8).join(\'\') + \':\' + date.split(\'\').slice(4, 6).join(\'\') + \':\' + date.split(\'\').slice(0, 4).join(\'\'));\n });\n });\n\n _defineProperty(_assertThisInitialized(_this), "fetchData", function () {\n _this.fetchedData = undefined;\n _this.filteredData = {}; //Logic when data to be fetched is of today\n\n if (_this.state.dashboard.rangeOfData === \'today\') {\n firebase["a" /* default */].ref("users/".concat(_this.props.uid, "/data/").concat(_this.props.date)).once("value", function (snapshot) {\n if (snapshot.val()) {\n _this.fetchedData = snapshot.val();\n }\n }).then(function () {\n //******LOGIC TO FILTER DATA*******\n //if data is to be filtered for a specific task for today\n if (_this.state.dashboard.displayBy === \'tasks\') {\n _this.filterDataByTasks(); //setting state to map data\n\n\n _this.setState(function (state) {\n return _objectSpread({}, state, {\n type: \'bar\',\n data: {\n labels: Object.keys(_this.filteredData),\n datasets: [{\n label: \'Sessions\',\n data: Object.values(_this.filteredData).concat(0),\n backgroundColor: [\'rgba(31, 221, 114, 0.6)\', \'rgba(255, 75, 30, 0.6)\']\n }]\n }\n });\n }); //if data is to be filtered for all tasks for today\n\n } else if (_this.state.dashboard.displayBy === \'all\') {\n var labels = Object.keys(_this.fetchedData);\n var completed = [],\n incomplete = [];\n labels.forEach(function (label) {\n completed.push(_this.fetchedData[label].completed);\n incomplete.push(_this.fetchedData[label].incomplete);\n });\n\n _this.setState(function (state) {\n return _objectSpread({}, state, {\n type: \'doughnut\',\n data: {\n labels: labels,\n datasets: [{\n label: \'completed\',\n data: completed.concat(0),\n backgroundColor: \'rgba(31, 221, 114, 0.6)\'\n }, {\n label: \'incomplete\',\n data: incomplete.concat(0),\n backgroundColor: \'rgba(255, 75, 30, 0.6)\'\n }]\n }\n });\n });\n }\n }); //below is logic when data to be fetched is for some certain no of past days \n } else {\n var fetchDays;\n if (_this.state.dashboard.rangeOfData === \'week\') fetchDays = 7;else if (_this.state.dashboard.rangeOfData === \'month\') fetchDays = \'month\';else if (_this.state.dashboard.rangeOfData === \'6months\') fetchDays = \'6months\'; //so get all the data at once and then filter that locally rather than fetching data for each day \n\n firebase["a" /* default */].ref("users/".concat(_this.props.uid, "/data")).once("value", function (snapshot) {\n if (snapshot.val()) {\n if (snapshot.val()) _this.fetchedData = snapshot.val();\n }\n }).then(function () {\n /*filtering data for a specified number of days */\n _this.filterFetchedDataByDays(fetchDays);\n\n if (_this.state.dashboard.displayBy === \'tasks\') {\n //getting the labels and filtering them according to availability of the task on that date\n //================***********================\n var labels = Object.keys(_this.filteredData);\n labels = labels.filter(function (key) {\n if (Object.keys(_this.filteredData[key]).includes(!_this.state.dashboard.task ? _this.props.intialTask : _this.state.dashboard.task)) return true;\n }); //=================***********================\n\n var completed = [],\n incomplete = []; //fetching completed and incomplete session for the available date for the sellected task\n\n labels.forEach(function (date) {\n completed.push(_this.filteredData[date][!_this.state.dashboard.task ? _this.props.intialTask : _this.state.dashboard.task].completed);\n incomplete.push(_this.filteredData[date][!_this.state.dashboard.task ? _this.props.intialTask : _this.state.dashboard.task].incomplete);\n }); //this function formats the labels as dates\n\n _this.formatDates(labels); //setting state to map data\n\n\n _this.setState(function (state) {\n return _objectSpread({}, state, {\n type: \'line\',\n data: {\n labels: _this.dateLabelList,\n datasets: [{\n label: \'Completed\',\n data: completed.concat(0),\n borderColor: \'rgba(31, 221, 114, 0.6)\',\n pointHoverBackgroundColor: \'rgba(31, 221, 114, 0.6)\',\n fill: false\n }, {\n label: \'Incomplete\',\n data: incomplete.concat(0),\n borderColor: \'rgba(255, 75, 30, 0.6)\',\n pointHoverBackgroundColor: \'rgba(255, 75, 30, 0.6)\',\n fill: false\n }]\n }\n });\n });\n } else if (_this.state.dashboard.displayBy === \'all\') {\n //got the date list\n var dateList = Object.keys(_this.filteredData);\n var _labels = []; //fetching the tasks for labels\n\n dateList.forEach(function (date) {\n Object.keys(_this.filteredData[date]).forEach(function (label) {\n if (!_labels.includes(label)) _labels.push(label);\n });\n });\n var _completed = [],\n tempPushcompleted = [],\n _incomplete = [],\n tempPushincomplete = []; //summing up total complete and incomplete sessions for each task\n\n _labels.forEach(function (label) {\n tempPushcompleted = [], tempPushincomplete = [];\n dateList.forEach(function (date) {\n if (_this.filteredData[date][label]) {\n tempPushcompleted.push(_this.filteredData[date][label].completed);\n tempPushincomplete.push(_this.filteredData[date][label].incomplete);\n }\n });\n\n if (tempPushcompleted.length) {\n var sum = tempPushcompleted.reduce(function (accumulator, a) {\n return accumulator + a;\n });\n\n _completed.push(sum);\n }\n\n if (tempPushincomplete.length) {\n var _sum = tempPushincomplete.reduce(function (accumulator, a) {\n return accumulator + a;\n });\n\n _incomplete.push(_sum);\n }\n });\n\n _this.setState(function (state) {\n return _objectSpread({}, state, {\n type: \'doughnut\',\n data: {\n labels: _labels,\n datasets: [{\n label: \'completed\',\n data: _completed.concat(0),\n backgroundColor: \'rgba(31, 221, 114, 0.6)\'\n }, {\n label: \'incomplete\',\n data: _incomplete.concat(0),\n backgroundColor: \'rgba(255, 75, 30, 0.6)\'\n }]\n }\n });\n });\n }\n });\n }\n });\n\n _defineProperty(_assertThisInitialized(_this), "handleOnChange", function (identifier, value) {\n var Dash = _this.state.dashboard;\n Dash[identifier] = value;\n\n _this.setState(function (state) {\n return _objectSpread({}, state, {\n dashboard: Dash\n });\n });\n\n _this.fetchData();\n });\n\n _this.state = {\n dashboard: {\n displayBy: \'tasks\',\n rangeOfData: \'today\',\n task: \'\'\n },\n data: {},\n type: \'\',\n rotateClass: \'stats__chartboard\'\n };\n _this.fetchedData = undefined;\n _this.filteredData = {};\n _this.dateLabelList = [];\n return _this;\n }\n\n _createClass(Stats, [{\n key: "componentDidMount",\n value: function componentDidMount() {\n var _this2 = this;\n\n this.setState(function (state) {\n return _objectSpread({}, state, {\n dashboard: {\n displayBy: \'tasks\',\n rangeOfData: \'today\',\n task: _this2.props.intialTask\n }\n });\n });\n }\n /*As you will notice below on every change to the dropdown list "handleOnChange()" is called*/\n\n }, {\n key: "render",\n value: function render() {\n var _this3 = this;\n\n return react_default.a.createElement("div", {\n className: "stats"\n }, react_default.a.createElement("div", {\n className: "stats__dashboard"\n }, react_default.a.createElement("select", {\n name: "displayBy",\n className: "focus__btnPanel-tasks",\n onChange: function onChange(e) {\n _this3.handleOnChange(\'displayBy\', e.target.value);\n }\n }, react_default.a.createElement("option", {\n value: "tasks"\n }, "By Tasks"), react_default.a.createElement("option", {\n value: "all"\n }, "All")), react_default.a.createElement("select", {\n name: "rangeOfData",\n className: "focus__btnPanel-tasks",\n onChange: function onChange(e) {\n _this3.handleOnChange(\'rangeOfData\', e.target.value);\n }\n }, react_default.a.createElement("option", {\n value: "today"\n }, "Today"), react_default.a.createElement("option", {\n value: "week"\n }, "Last week"), react_default.a.createElement("option", {\n value: "month"\n }, "Last month"), react_default.a.createElement("option", {\n value: "6months"\n }, "Last 6 months")), this.state.dashboard.displayBy === \'tasks\' && react_default.a.createElement(TaskList["default"], {\n onTaskChange: function onTaskChange(task) {\n _this3.handleOnChange(\'task\', task);\n }\n })), react_default.a.createElement("div", {\n className: this.state.rotateClass\n }, this.state.type && react_default.a.createElement(AtomicComponents_Chart, {\n data: this.state.data,\n title: this.state.dashboard.task.toUpperCase(),\n type: this.state.type\n })));\n }\n }]);\n\n return Stats;\n}(react["Component"]);\n\n;\n\nvar mapStateToProps = function mapStateToProps(store) {\n return {\n uid: store.auth.cred.uid,\n date: Object.keys(store.data)[0],\n intialTask: Object.keys(store.tasks)[0]\n };\n};\n\n/* harmony default export */ var Components_Stats = __webpack_exports__["default"] = (Object(es["b" /* connect */])(mapStateToProps)(Stats_Stats));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL0NvbXBvbmVudHMvQXRvbWljQ29tcG9uZW50cy9DaGFydC5qcz9lZjE0Iiwid2VicGFjazovLy8uL3NyYy9Db21wb25lbnRzL1N0YXRzLmpzPzRjMTkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7QmFyLExpbmUsRG91Z2hudXR9IGZyb20gJ3JlYWN0LWNoYXJ0anMtMic7XG5cbmNvbnN0IENoYXJ0ID0gKHByb3BzKSA9PiB7XG4gICAgaWYocHJvcHMudHlwZSA9PT0gJ2JhcicpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFyIFxuICAgICAgICAgICAgICAgIGRhdGE9e3Byb3BzLmRhdGF9XG4gICAgICAgICAgICAgICAgb3B0aW9ucz17e1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTp7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6dHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6MTgsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHByb3BzLnRpdGxlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGxlZ2VuZDpmYWxzZVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICApXG4gICAgZWxzZSBpZihwcm9wcy50eXBlID09PSAnbGluZScpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8TGluZSBcbiAgICAgICAgICAgICAgICBkYXRhPXtwcm9wcy5kYXRhfVxuICAgICAgICAgICAgICAgIG9wdGlvbnM9e3tcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6e1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OnRydWUsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOjE4LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBwcm9wcy50aXRsZVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBsZWdlbmQ6ZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1haW50YWluQXNwZWN0UmF0aW8gOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICApXG4gICAgZWxzZSBpZihwcm9wcy50eXBlID09PSAnZG91Z2hudXQnKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkb3VnaG51dENoYXJ0XCI+XG4gICAgICAgICAgICAgICAgPERvdWdobnV0IFxuICAgICAgICAgICAgICAgIGRhdGE9e3Byb3BzLmRhdGF9XG4gICAgICAgICAgICAgICAgb3B0aW9ucz17e1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTp7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6dHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6MTgsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHByb3BzLnRpdGxlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGxlZ2VuZDpmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbyA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zaXZlOiB0cnVlXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nc3RhdHNfX2RvdWdobnV0LWxlZ2VuZCc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdzdGF0c19fZG91Z2hudXQtbGVnZW5kLWNvbXBsZXRlZCc+Q29tcGxldGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nc3RhdHNfX2RvdWdobnV0LWxlZ2VuZC1pbmNvbXBsZXRlJz5JbmNvbXBsZXRlPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSBcblxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ2hhcnQ7XG4iLCJpbXBvcnQgUmVhY3Qse0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5cbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IFRhc2tMaXN0IGZyb20gJy4vQXRvbWljQ29tcG9uZW50cy9UYXNrTGlzdCc7XG5pbXBvcnQgQ2hhcnQgZnJvbSAnLi9BdG9taWNDb21wb25lbnRzL0NoYXJ0JztcblxuaW1wb3J0IGRhdGFiYXNlIGZyb20gJy4uL2ZpcmViYXNlL2ZpcmViYXNlJztcblxuXG5jbGFzcyBTdGF0cyBleHRlbmRzIENvbXBvbmVudHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICAvKnRoZSBzdGF0ZSBjb250YWlucyB2YWx1ZSBmb3IgdGhlIGRyb3Bkb3duIGxpc3RzIGFzIHRob3NlIGNoYW5nZSxcbiAgICAgICAgIHdoYXQgaXMgcmVuZGVyZWQgaW4gdGhlIGNvbXBvbmVudCBzaG91bGQgYWxzbyBjaGFuZ2UqL1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZGFzaGJvYXJkOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheUJ5OiAndGFza3MnLFxuICAgICAgICAgICAgICAgIHJhbmdlT2ZEYXRhOiAndG9kYXknLFxuICAgICAgICAgICAgICAgIHRhc2s6ICcnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICB0eXBlOiAnJyxcbiAgICAgICAgICAgIHJvdGF0ZUNsYXNzIDogJ3N0YXRzX19jaGFydGJvYXJkJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmZldGNoZWREYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IHt9O1xuXG4gICAgICAgIHRoaXMuZGF0ZUxhYmVsTGlzdCA9IFtdO1xuICAgIH07XG5cbiAgICBmaWx0ZXJGZXRjaGVkRGF0YUJ5RGF5cyA9IChkYXlzKSA9PiB7XG4gICAgICAgIGxldCBiZWdpbkRhdGU7XG4gICAgICAgIGlmKGRheXMgPT09ICdtb250aCcpXG4gICAgICAgICAgICBiZWdpbkRhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5jYWxlbmRhcigpLnNwbGl0KCcvJyk7XG4gICAgICAgIGVsc2UgaWYoZGF5cyA9PT0gJzZtb250aHMnKVxuICAgICAgICAgICAgYmVnaW5EYXRlID0gbW9tZW50KCkuc3VidHJhY3QoNiwgJ21vbnRoJykuY2FsZW5kYXIoKS5zcGxpdCgnLycpO1xuICAgICAgICBlbHNlIGlmKHR5cGVvZihkYXlzKSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICBiZWdpbkRhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdChkYXlzLCAnZGF5cycpLmNhbGVuZGFyKCkuc3BsaXQoJy8nKTtcbiAgICAgICAgXG4gICAgICAgIFxuICAgICAgICAvL2xvZ2ljIGZvciBleHRyYXRpbmcgZGF0ZWxpc3RcbiAgICAgICAgLyp0aGlzIGxvZ2ljIGlzIGZsYXdlZCBhbmQgdGhlIHdob2xlIGxvZ2ljIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBhIGJhY2tlbmQgXG4gICAgICAgIHNpbmNlIGFsbCBsb3Qgb2YgZXh0cmFjdGluZyBuZWVkcyB0byBiZSBkb25lIHdoaWNoIHdpbGxcbiAgICAgICAgIHNwb2lsIHRoZSB1c2VyIGV4cGVyaWVuY2UgKi9cbiAgICAgICAgYmVnaW5EYXRlID0gYmVnaW5EYXRlWzJdK2JlZ2luRGF0ZVswXStiZWdpbkRhdGVbMV1cbiAgICAgICAgbGV0IGRhdGVMaXN0O1xuICAgICAgICBjb25zdCBhbGxEYXRlc0luREIgPSBPYmplY3Qua2V5cyh0aGlzLmZldGNoZWREYXRhKS5zb3J0KCkucmV2ZXJzZSgpO1xuICAgICAgICBcbiAgICAgICAgaWYoYWxsRGF0ZXNJbkRCLmluZGV4T2YoYmVnaW5EYXRlKSA9PT0gLTEpe1xuICAgICAgICAgICAgbGV0IGRpZmY9MTAwMDAsaW5keDtcblxuICAgICAgICAgICAgYWxsRGF0ZXNJbkRCLmV2ZXJ5KChkYXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYocGFyc2VJbnQoZGF0ZSkgLSBwYXJzZUludChiZWdpbkRhdGUpIDwgMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgaWYocGFyc2VJbnQoZGF0ZSkgLSBwYXJzZUludChiZWdpbkRhdGUpIDwgZGlmZil7XG4gICAgICAgICAgICAgICAgICAgIGRpZmYgPSBwYXJzZUludChkYXRlKSAtIHBhcnNlSW50KGJlZ2luRGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgaW5keCA9IGFsbERhdGVzSW5EQi5pbmRleE9mKGRhdGUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZGF0ZUxpc3QgPSBhbGxEYXRlc0luREIuc2xpY2UoYWxsRGF0ZXNJbkRCLmluZGV4T2YodGhpcy5wcm9wcy5kYXRlKSxhbGxEYXRlc0luREIuaW5kZXhPZihpbmR4KSk7XG4gICAgICAgIH1lbHNlXG4gICAgICAgICAgICBkYXRlTGlzdCA9IGFsbERhdGVzSW5EQi5zbGljZShhbGxEYXRlc0luREIuaW5kZXhPZih0aGlzLnByb3BzLmRhdGUpLGFsbERhdGVzSW5EQi5pbmRleE9mKGJlZ2luRGF0ZSkpOyAgICBcblxuICAgICAgICBkYXRlTGlzdC5mb3JFYWNoKChkYXRlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YVtkYXRlXSA9IHRoaXMuZmV0Y2hlZERhdGFbZGF0ZV07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZpbHRlckRhdGFCeVRhc2tzID0gKCkgPT4ge1xuICAgICAgICBpZih0aGlzLmZldGNoZWREYXRhW3RoaXMuc3RhdGUuZGFzaGJvYXJkLnRhc2tdKVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSB0aGlzLmZldGNoZWREYXRhW3RoaXMuc3RhdGUuZGFzaGJvYXJkLnRhc2tdXG4gICAgfVxuXG4gICAgZm9ybWF0RGF0ZXMgPSAobGlzdCkgPT4ge1xuICAgICAgICB0aGlzLmRhdGVMYWJlbExpc3QgPSBbXTtcbiAgICAgICAgbGlzdC5mb3JFYWNoKChkYXRlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGVMYWJlbExpc3QucHVzaChcbiAgICAgICAgICAgICAgICBkYXRlLnNwbGl0KCcnKS5zbGljZSg2LDgpLmpvaW4oJycpKyc6JytcbiAgICAgICAgICAgICAgICBkYXRlLnNwbGl0KCcnKS5zbGljZSg0LDYpLmpvaW4oJycpKyc6JytcbiAgICAgICAgICAgICAgICBkYXRlLnNwbGl0KCcnKS5zbGljZSgwLDQpLmpvaW4oJycpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vZmV0Y2hpbmcgZGF0YSBmcm9tIGZpcmViYXNlXG4gICAgZmV0Y2hEYXRhID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmZldGNoZWREYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IHt9O1xuICAgICAgICAvL0xvZ2ljIHdoZW4gZGF0YSB0byBiZSBmZXRjaGVkIGlzIG9mIHRvZGF5XG4gICAgICAgIGlmKHRoaXMuc3RhdGUuZGFzaGJvYXJkLnJhbmdlT2ZEYXRhID09PSAndG9kYXknKXtcbiAgICAgICAgICAgIGRhdGFiYXNlLnJlZihgdXNlcnMvJHt0aGlzLnByb3BzLnVpZH0vZGF0YS8ke3RoaXMucHJvcHMuZGF0ZX1gKS5vbmNlKFwidmFsdWVcIiwgKHNuYXBzaG90KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoc25hcHNob3QudmFsKCkpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZldGNoZWREYXRhID0gc25hcHNob3QudmFsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8qKioqKipMT0dJQyBUTyBGSUxURVIgREFUQSoqKioqKipcblxuICAgICAgICAgICAgICAgIC8vaWYgZGF0YSBpcyB0byBiZSBmaWx0ZXJlZCBmb3IgYSBzcGVjaWZpYyB0YXNrIGZvciB0b2RheVxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc3RhdGUuZGFzaGJvYXJkLmRpc3BsYXlCeSA9PT0gJ3Rhc2tzJyl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YUJ5VGFza3MoKVxuICAgICAgICAgICAgICAgICAgICAvL3NldHRpbmcgc3RhdGUgdG8gbWFwIGRhdGFcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKChzdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcmVkRGF0YSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDonU2Vzc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOk9iamVjdC52YWx1ZXModGhpcy5maWx0ZXJlZERhdGEpLmNvbmNhdCgwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZ2JhKDMxLCAyMjEsIDExNCwgMC42KScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmdiYSgyNTUsIDc1LCAzMCwgMC42KScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgZGF0YSBpcyB0byBiZSBmaWx0ZXJlZCBmb3IgYWxsIHRhc2tzIGZvciB0b2RheVxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuc3RhdGUuZGFzaGJvYXJkLmRpc3BsYXlCeSA9PT0gJ2FsbCcpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbHMgPSBPYmplY3Qua2V5cyh0aGlzLmZldGNoZWREYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgY29tcGxldGVkID0gW10sIGluY29tcGxldGUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICBsYWJlbHMuZm9yRWFjaCgobGFiZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZC5wdXNoKCh0aGlzLmZldGNoZWREYXRhW2xhYmVsXSkuY29tcGxldGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGxldGUucHVzaCgodGhpcy5mZXRjaGVkRGF0YVtsYWJlbF0pLmluY29tcGxldGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKChzdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RvdWdobnV0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IGxhYmVscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOidjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOmNvbXBsZXRlZC5jb25jYXQoMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjoncmdiYSgzMSwgMjIxLCAxMTQsIDAuNiknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOidpbmNvbXBsZXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6aW5jb21wbGV0ZS5jb25jYXQoMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6J3JnYmEoMjU1LCA3NSwgMzAsIDAuNiknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuIFxuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgLy9iZWxvdyBpcyBsb2dpYyB3aGVuIGRhdGEgdG8gYmUgZmV0Y2hlZCBpcyBmb3Igc29tZSBjZXJ0YWluIG5vIG9mIHBhc3QgZGF5cyBcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBsZXQgZmV0Y2hEYXlzO1xuICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5kYXNoYm9hcmQucmFuZ2VPZkRhdGEgPT09ICd3ZWVrJylcbiAgICAgICAgICAgICAgICBmZXRjaERheXMgPSA3O1xuICAgICAgICAgICAgZWxzZSBpZih0aGlzLnN0YXRlLmRhc2hib2FyZC5yYW5nZU9mRGF0YSA9PT0gJ21vbnRoJylcbiAgICAgICAgICAgICAgICBmZXRjaERheXMgPSAnbW9udGgnXG4gICAgICAgICAgICBlbHNlIGlmKHRoaXMuc3RhdGUuZGFzaGJvYXJkLnJhbmdlT2ZEYXRhID09PSAnNm1vbnRocycpXG4gICAgICAgICAgICAgICAgZmV0Y2hEYXlzID0gJzZtb250aHMnXG5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vc28gZ2V0IGFsbCB0aGUgZGF0YSBhdCBvbmNlIGFuZCB0aGVuIGZpbHRlciB0aGF0IGxvY2FsbHkgcmF0aGVyIHRoYW4gZmV0Y2hpbmcgZGF0YSBmb3IgZWFjaCBkYXkgXG4gICAgICAgICAgICBkYXRhYmFzZS5yZWYoYHVzZXJzLyR7dGhpcy5wcm9wcy51aWR9L2RhdGFgKS5vbmNlKFwidmFsdWVcIiwgKHNuYXBzaG90KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoc25hcHNob3QudmFsKCkpe1xuICAgICAgICAgICAgICAgICAgICBpZihzbmFwc2hvdC52YWwoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hlZERhdGEgPSBzbmFwc2hvdC52YWwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvKmZpbHRlcmluZyBkYXRhIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyAqL1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRmV0Y2hlZERhdGFCeURheXMoZmV0Y2hEYXlzKTtcblxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc3RhdGUuZGFzaGJvYXJkLmRpc3BsYXlCeSA9PT0gJ3Rhc2tzJyl7XG4gICAgICAgICAgICAgICAgICAgIC8vZ2V0dGluZyB0aGUgbGFiZWxzIGFuZCBmaWx0ZXJpbmcgdGhlbSBhY2NvcmRpbmcgdG8gYXZhaWxhYmlsaXR5IG9mIHRoZSB0YXNrIG9uIHRoYXQgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAvLz09PT09PT09PT09PT09PT0qKioqKioqKioqKj09PT09PT09PT09PT09PT1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVscyA9IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyZWREYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsYWJlbHMuZmlsdGVyKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyZWREYXRhW2tleV0pLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLnN0YXRlLmRhc2hib2FyZC50YXNrPyB0aGlzLnByb3BzLmludGlhbFRhc2sgOiB0aGlzLnN0YXRlLmRhc2hib2FyZC50YXNrKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy89PT09PT09PT09PT09PT09PSoqKioqKioqKioqPT09PT09PT09PT09PT09PVxuXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBsZXRlZCA9IFtdLCBpbmNvbXBsZXRlID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vZmV0Y2hpbmcgY29tcGxldGVkIGFuZCBpbmNvbXBsZXRlIHNlc3Npb24gZm9yIHRoZSBhdmFpbGFibGUgZGF0ZSBmb3IgdGhlIHNlbGxlY3RlZCB0YXNrXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKChkYXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQucHVzaCgodGhpcy5maWx0ZXJlZERhdGFbZGF0ZV1bIXRoaXMuc3RhdGUuZGFzaGJvYXJkLnRhc2s/IHRoaXMucHJvcHMuaW50aWFsVGFzayA6dGhpcy5zdGF0ZS5kYXNoYm9hcmQudGFza10pLmNvbXBsZXRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNvbXBsZXRlLnB1c2goKHRoaXMuZmlsdGVyZWREYXRhW2RhdGVdWyF0aGlzLnN0YXRlLmRhc2hib2FyZC50YXNrPyB0aGlzLnByb3BzLmludGlhbFRhc2sgOnRoaXMuc3RhdGUuZGFzaGJvYXJkLnRhc2tdKS5pbmNvbXBsZXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMgZnVuY3Rpb24gZm9ybWF0cyB0aGUgbGFiZWxzIGFzIGRhdGVzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0RGF0ZXMobGFiZWxzKVxuXG5cbiAgICAgICAgICAgICAgICAgICAgLy9zZXR0aW5nIHN0YXRlIHRvIG1hcCBkYXRhXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiB0aGlzLmRhdGVMYWJlbExpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDonQ29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogY29tcGxldGVkLmNvbmNhdCgwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICdyZ2JhKDMxLCAyMjEsIDExNCwgMC42KScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50SG92ZXJCYWNrZ3JvdW5kQ29sb3I6J3JnYmEoMzEsIDIyMSwgMTE0LCAwLjYpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6J0luY29tcGxldGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5jb21wbGV0ZS5jb25jYXQoMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogJ3JnYmEoMjU1LCA3NSwgMzAsIDAuNiknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRIb3ZlckJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCA3NSwgMzAsIDAuNiknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuc3RhdGUuZGFzaGJvYXJkLmRpc3BsYXlCeSA9PT0gJ2FsbCcpe1xuICAgICAgICAgICAgICAgICAgICAvL2dvdCB0aGUgZGF0ZSBsaXN0XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRlTGlzdCA9IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyZWREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vZmV0Y2hpbmcgdGhlIHRhc2tzIGZvciBsYWJlbHNcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUxpc3QuZm9yRWFjaCgoZGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJlZERhdGFbZGF0ZV0pLmZvckVhY2goKGxhYmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWxhYmVscy5pbmNsdWRlcyhsYWJlbCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBsZXRlZCA9IFtdLHRlbXBQdXNoY29tcGxldGVkID0gW10sIGluY29tcGxldGU9W10sdGVtcFB1c2hpbmNvbXBsZXRlID0gW107XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvL3N1bW1pbmcgdXAgdG90YWwgY29tcGxldGUgYW5kIGluY29tcGxldGUgc2Vzc2lvbnMgZm9yIGVhY2ggdGFza1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMuZm9yRWFjaCgobGFiZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBQdXNoY29tcGxldGVkID0gW10sIHRlbXBQdXNoaW5jb21wbGV0ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUxpc3QuZm9yRWFjaCgoZGF0ZSkgPT4geyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmZpbHRlcmVkRGF0YVtkYXRlXVtsYWJlbF0pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUHVzaGNvbXBsZXRlZC5wdXNoKHRoaXMuZmlsdGVyZWREYXRhW2RhdGVdW2xhYmVsXS5jb21wbGV0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUHVzaGluY29tcGxldGUucHVzaCh0aGlzLmZpbHRlcmVkRGF0YVtkYXRlXVtsYWJlbF0uaW5jb21wbGV0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wUHVzaGNvbXBsZXRlZC5sZW5ndGgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdW0gPSB0ZW1wUHVzaGNvbXBsZXRlZC5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBhKSA9PiBhY2N1bXVsYXRvciArIGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZC5wdXNoKHN1bSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRlbXBQdXNoaW5jb21wbGV0ZS5sZW5ndGgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdW0gPSB0ZW1wUHVzaGluY29tcGxldGUucmVkdWNlKChhY2N1bXVsYXRvciwgYSkgPT4gYWNjdW11bGF0b3IgKyBhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbXBsZXRlLnB1c2goc3VtKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZG91Z2hudXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsczogbGFiZWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6J2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6Y29tcGxldGVkLmNvbmNhdCgwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOidyZ2JhKDMxLCAyMjEsIDExNCwgMC42KSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6J2luY29tcGxldGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTppbmNvbXBsZXRlLmNvbmNhdCgwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjoncmdiYSgyNTUsIDc1LCAzMCwgMC42KSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBcbiAgICB9O1xuXG5cbiAgICAvKlxuICAgIHdoZW4gc29tZSBvcHRpb25zIGFyZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSB0cmlnZ2VyIHdoaWNoIHdpbGxcbiAgICAgdXBkYXRlIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50LCBpdCBmaXJzdCBtYWtlcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RhdGUgdGhlbiB1cGRhdGVzIGNvcHkgd2l0aCBcbiAgICAgcGFzc2VkIHZhbHVlLiBGdXJ0aGVyIHNldHMtc3RhdGUgd2l0aCB0aGlzIG5ldyBcIndhbm5hIGJlXCIgc3RhdGUuXG4gICAgIEFsdGhvdWdoIHRoZSBhY3R1YWwgY2hhbmdlIGkuZS4gdGhlIG1hcCB3aWxsIG5vdCBiZSByZW5kZXJlZCBhcyBkYXRhIGZvciB0aGlzIGN1cnJlbnQgc3RhdGUgaXMgbm90IGZldGNoZWRcbiAgICAgd2hpY2ggaXMgdHJpZ2dlcmVkIHdpdGggdGhlIFwiZmV0Y2hEYXRhKClcIlxuICAgICovXG4gICAgaGFuZGxlT25DaGFuZ2UgPSAoaWRlbnRpZmllcix2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBEYXNoID0gdGhpcy5zdGF0ZS5kYXNoYm9hcmQ7XG4gICAgICAgIERhc2hbaWRlbnRpZmllcl0gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUpID0+ICh7Li4uc3RhdGUsIGRhc2hib2FyZDpEYXNofSkpO1xuXG4gICAgICAgIHRoaXMuZmV0Y2hEYXRhKCk7XG4gICAgfTtcblxuICAgIGNvbXBvbmVudERpZE1vdW50KCl7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBkYXNoYm9hcmQ6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5Qnk6ICd0YXNrcycsXG4gICAgICAgICAgICAgICAgcmFuZ2VPZkRhdGE6ICd0b2RheScsXG4gICAgICAgICAgICAgICAgdGFzazogdGhpcy5wcm9wcy5pbnRpYWxUYXNrXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKkFzIHlvdSB3aWxsIG5vdGljZSBiZWxvdyBvbiBldmVyeSBjaGFuZ2UgdG8gdGhlIGRyb3Bkb3duIGxpc3QgXCJoYW5kbGVPbkNoYW5nZSgpXCIgaXMgY2FsbGVkKi9cbiAgICByZW5kZXIoKXtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3N0YXRzJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nc3RhdHNfX2Rhc2hib2FyZCcgPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIG5hbWU9J2Rpc3BsYXlCeSdcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdmb2N1c19fYnRuUGFuZWwtdGFza3MnXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVPbkNoYW5nZSgnZGlzcGxheUJ5JyxlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9J3Rhc2tzJz5CeSBUYXNrczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0nYWxsJz5BbGw8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIG5hbWU9J3JhbmdlT2ZEYXRhJ1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2ZvY3VzX19idG5QYW5lbC10YXNrcydcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlKCdyYW5nZU9mRGF0YScsZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSd0b2RheSc+VG9kYXk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9J3dlZWsnPkxhc3Qgd2Vlazwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0nbW9udGgnPkxhc3QgbW9udGg8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9JzZtb250aHMnPkxhc3QgNiBtb250aHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmRhc2hib2FyZC5kaXNwbGF5Qnk9PT0ndGFza3MnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICA8VGFza0xpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVGFza0NoYW5nZT0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UoJ3Rhc2snLHRhc2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0vPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5zdGF0ZS5yb3RhdGVDbGFzc30+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLnR5cGUgJiYgPENoYXJ0IGRhdGE9e3RoaXMuc3RhdGUuZGF0YX0gdGl0bGU9eyh0aGlzLnN0YXRlLmRhc2hib2FyZC50YXNrKS50b1VwcGVyQ2FzZSgpfSB0eXBlPXt0aGlzLnN0YXRlLnR5cGV9Lz59XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9O1xufTtcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHN0b3JlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdWlkOiBzdG9yZS5hdXRoLmNyZWQudWlkLFxuICAgICAgICBkYXRlOiBPYmplY3Qua2V5cyhzdG9yZS5kYXRhKVswXSxcbiAgICAgICAgaW50aWFsVGFzazogT2JqZWN0LmtleXMoc3RvcmUudGFza3MpWzBdXG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMpKFN0YXRzKTsiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFOQTtBQUZBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFSQTtBQUZBO0FBZ0JBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQVJBO0FBRkE7QUFhQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNEQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7OztBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUVBOzs7QUFIQTtBQXNCQTtBQUNBO0FBQ0E7QUFRQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBNURBO0FBOERBO0FBRUE7QUFDQTtBQWpFQTtBQW1FQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUEzRUE7QUE2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSEE7QUFIQTtBQUhBO0FBQUE7QUFDQTtBQW1CQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBUkE7QUFIQTtBQUFBO0FBcUJBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVZBO0FBSEE7QUFBQTtBQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQVJBO0FBSEE7QUFBQTtBQXFCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBelJBO0FBbVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBQ0E7QUFFQTtBQWxCQTtBQW1CQTtBQUNBOzs7QUFzUkE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFGQTtBQUFBO0FBUUE7QUFFQTtBQUNBOzs7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFBQTtBQUNBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBTUE7QUFFQTtBQUNBO0FBSkE7QUFVQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTs7OztBQXJXQTtBQUNBO0FBcVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///481\n')}}]);