UNPKG

@silverbirder/caat

Version:

CaAT is the Google Apps Script Library that Calculate the Assigned Time.

366 lines (328 loc) 31.7 kB
function Group() { } function Member() { }/******/ (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 = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./src/index.ts"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./node_modules/webpack/buildin/global.js": /*!***********************************!*\ !*** (webpack)/buildin/global.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports) { var g; // This works in non-strict mode g = (function() { return this; })(); try { // This works if eval is allowed (see CSP) g = g || new Function("return this")(); } catch (e) { // This works if the window reference is available if (typeof window === "object") g = window; } // g can still be undefined, but nothing to do about it... // We return undefined, instead of nothing here, so it's // easier to handle this case. if(!global) { ...} module.exports = g; /***/ }), /***/ "./src/calendar/calendarAppImpl.ts": /*!*****************************************!*\ !*** ./src/calendar/calendarAppImpl.ts ***! \*****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); var CalendarAppImpl = /** @class */ (function () { function CalendarAppImpl() { } CalendarAppImpl.prototype.getCalendarById = function (id) { var calendar = CalendarApp.getCalendarById(id); return calendar; }; return CalendarAppImpl; }()); /* harmony default export */ __webpack_exports__["default"] = (CalendarAppImpl); /***/ }), /***/ "./src/group/groupImpl.ts": /*!********************************!*\ !*** ./src/group/groupImpl.ts ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/dateUtils */ "./src/utils/dateUtils.ts"); /* harmony import */ var _calendar_calendarAppImpl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../calendar/calendarAppImpl */ "./src/calendar/calendarAppImpl.ts"); var GroupImpl = /** @class */ (function () { function GroupImpl(id, config, calendar) { this.id = id; var defaultHolidayWords = { morning: new RegExp('(?!)'), afternoon: new RegExp('(?!)'), all: new RegExp('(?!)') }; var defaultConfig = { startDate: new Date(), endDate: new Date(), members: [], holidayWords: defaultHolidayWords }; this.config = config || defaultConfig; this.calendarApp = calendar || new _calendar_calendarAppImpl__WEBPACK_IMPORTED_MODULE_1__["default"](); } GroupImpl.prototype.fetchHolidays = function () { var _this = this; var holidays = []; var calendar = this.calendarApp.getCalendarById(this.id); calendar.getEvents(this.config.startDate, this.config.endDate).forEach(function (event) { var allDay = event.isAllDayEvent(); if (!allDay) { return; } var title = event.getTitle(); var am = _this.config.holidayWords.morning.test(title); var pm = _this.config.holidayWords.afternoon.test(title); var all = am === true || pm === true ? false : _this.config.holidayWords.all.test(title); if (am === false && pm === false && all === false) { return; } var members = _this.config.members.filter(function (member) { return member.match.test(title); }, title).map(function (member) { return member.name; }); var movePoint = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(event.getStartTime()); while (movePoint.getTime() < event.getEndTime().getTime()) { if (movePoint.getTime() <= _this.config.endDate.getTime() && movePoint.getTime() >= _this.config.startDate.getTime()) { holidays.push({ morning: am, afternoon: pm, all: all, title: title, inMember: members, toDate: Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(movePoint) }); } movePoint.setDate(movePoint.getDate() + 1); } }); return holidays; }; return GroupImpl; }()); /* harmony default export */ __webpack_exports__["default"] = (GroupImpl); /***/ }), /***/ "./src/index.ts": /*!**********************!*\ !*** ./src/index.ts ***! \**********************/ /*! exports provided: Member, Group */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var _member_memberImpl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./member/memberImpl */ "./src/member/memberImpl.ts"); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Member", function() { return _member_memberImpl__WEBPACK_IMPORTED_MODULE_0__["default"]; }); /* harmony import */ var _group_groupImpl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./group/groupImpl */ "./src/group/groupImpl.ts"); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Group", function() { return _group_groupImpl__WEBPACK_IMPORTED_MODULE_1__["default"]; }); global.Group = _group_groupImpl__WEBPACK_IMPORTED_MODULE_1__["default"]; global.Member = _member_memberImpl__WEBPACK_IMPORTED_MODULE_0__["default"]; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/member/memberImpl.ts": /*!**********************************!*\ !*** ./src/member/memberImpl.ts ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/dateUtils */ "./src/utils/dateUtils.ts"); /* harmony import */ var _calendar_calendarAppImpl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../calendar/calendarAppImpl */ "./src/calendar/calendarAppImpl.ts"); var MemberImpl = /** @class */ (function () { function MemberImpl(id, config, calendarApp) { this.id = id; var defaultConfig = { everyMinutes: 15, ignore: new RegExp('(?!)'), startDate: new Date(), endDate: new Date(), cutTimeRange: [] }; this.config = config || defaultConfig; this.calendarApp = calendarApp || new _calendar_calendarAppImpl__WEBPACK_IMPORTED_MODULE_1__["default"](); } MemberImpl.prototype.fetchSchedules = function () { var _this = this; var schedules = []; var calendar = this.calendarApp.getCalendarById(this.id); var workingTimeRange = []; calendar.getEvents(this.config.startDate, this.config.endDate).forEach(function (event) { var title = event.getTitle(); var startDate = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(event.getStartTime()); var endDate = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(event.getEndTime()); // Note: If you are OWNER and not attend the events, status is OWNER. var status = event.getMyStatus(); var ignore = _this.config.ignore.test(title); var allDay = event.isAllDayEvent(); // Note: Google Apps Script can't enum. var statusStr = status === null ? 'MAYBE' : status.toString(); var noNeedCalcAssignMinute = statusStr === 'NO' || ignore || allDay; var originalAssignMinute = _this._calcAssignMinute(startDate, endDate, [], []); var assignMinute = 0; var cut = false; if (!noNeedCalcAssignMinute) { assignMinute = _this._calcAssignMinute(startDate, endDate, _this.config.cutTimeRange, workingTimeRange); cut = originalAssignMinute !== assignMinute; } schedules.push({ status: statusStr, ignore: ignore, allDay: allDay, cut: cut, start: startDate, end: endDate, assignMinute: assignMinute, originalAssignMinute: originalAssignMinute, title: event.getTitle(), description: event.getDescription() }); }); return schedules; }; /* ex. start: 2020-01-01 11:00 end: 2020-01-01 13:00 cut: [{from: 2020-01-01 12:00, to: 2020-01-01 13:00}] => assignMinute = 60m; */ MemberImpl.prototype._calcAssignMinute = function (start, end, cut, work) { var calculatedAssignMinute = 0; var movePoint = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(start); while (movePoint.getTime() < end.getTime()) { movePoint.setTime(movePoint.getTime() + 1); var inCutTime = cut.some(function (range) { return (movePoint.getTime() <= range.to.getTime() && movePoint.getTime() >= range.from.getTime()); }); var isDuplicate = work.some(function (range) { return (movePoint.getTime() <= range.to.getTime() && movePoint.getTime() >= range.from.getTime()); }); movePoint.setTime(movePoint.getTime() - 1); if (!inCutTime && !isDuplicate) { calculatedAssignMinute += this.config.everyMinutes; var from = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(movePoint); var to = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(movePoint); to = new Date(to.setMinutes(to.getMinutes() + this.config.everyMinutes)); work.push({ from: from, to: to }); } movePoint.setMinutes(movePoint.getMinutes() + this.config.everyMinutes); } return calculatedAssignMinute; }; return MemberImpl; }()); /* harmony default export */ __webpack_exports__["default"] = (MemberImpl); /***/ }), /***/ "./src/utils/dateUtils.ts": /*!********************************!*\ !*** ./src/utils/dateUtils.ts ***! \********************************/ /*! exports provided: copyDate */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyDate", function() { return copyDate; }); function copyDate(d) { return new Date(d.getTime()); } ; /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY2FsZW5kYXIvY2FsZW5kYXJBcHBJbXBsLnRzIiwid2VicGFjazovLy8uL3NyYy9ncm91cC9ncm91cEltcGwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3NyYy9tZW1iZXIvbWVtYmVySW1wbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvZGF0ZVV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7OztBQ2xGQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0Qzs7QUFFNUM7Ozs7Ozs7Ozs7Ozs7QUNuQkE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNjLDhFQUFlLEVBQUM7Ozs7Ozs7Ozs7Ozs7QUNUL0I7QUFBQTtBQUFBO0FBQThDO0FBQ1k7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGlFQUFlO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiLDRCQUE0QixpRUFBUTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGlFQUFRO0FBQ3hDLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNjLHdFQUFTLEVBQUM7Ozs7Ozs7Ozs7Ozs7QUMzRHpCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTZDO0FBQ0g7QUFDMUMsZUFBZSx3REFBUztBQUN4QixnQkFBZ0IsMERBQVU7QUFDMkI7Ozs7Ozs7Ozs7Ozs7O0FDSnJEO0FBQUE7QUFBQTtBQUE4QztBQUNZO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsaUVBQWU7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixpRUFBUTtBQUNwQywwQkFBMEIsaUVBQVE7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsNkNBQTZDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlFQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGlFQUFRO0FBQ25DLHlCQUF5QixpRUFBUTtBQUNqQztBQUNBLDJCQUEyQixxQkFBcUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNjLHlFQUFVLEVBQUM7Ozs7Ozs7Ozs7Ozs7QUNyRjFCO0FBQUE7QUFBTztBQUNQO0FBQ0E7QUFDQSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LnRzXCIpO1xuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwidmFyIENhbGVuZGFyQXBwSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYWxlbmRhckFwcEltcGwoKSB7XG4gICAgfVxuICAgIENhbGVuZGFyQXBwSW1wbC5wcm90b3R5cGUuZ2V0Q2FsZW5kYXJCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciBjYWxlbmRhciA9IENhbGVuZGFyQXBwLmdldENhbGVuZGFyQnlJZChpZCk7XG4gICAgICAgIHJldHVybiBjYWxlbmRhcjtcbiAgICB9O1xuICAgIHJldHVybiBDYWxlbmRhckFwcEltcGw7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQ2FsZW5kYXJBcHBJbXBsO1xuIiwiaW1wb3J0IHsgY29weURhdGUgfSBmcm9tIFwiLi4vdXRpbHMvZGF0ZVV0aWxzXCI7XG5pbXBvcnQgQ2FsZW5kYXJBcHBJbXBsIGZyb20gXCIuLi9jYWxlbmRhci9jYWxlbmRhckFwcEltcGxcIjtcbnZhciBHcm91cEltcGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gR3JvdXBJbXBsKGlkLCBjb25maWcsIGNhbGVuZGFyKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdmFyIGRlZmF1bHRIb2xpZGF5V29yZHMgPSB7XG4gICAgICAgICAgICBtb3JuaW5nOiBuZXcgUmVnRXhwKCcoPyEpJyksXG4gICAgICAgICAgICBhZnRlcm5vb246IG5ldyBSZWdFeHAoJyg/ISknKSxcbiAgICAgICAgICAgIGFsbDogbmV3IFJlZ0V4cCgnKD8hKScpLFxuICAgICAgICB9O1xuICAgICAgICB2YXIgZGVmYXVsdENvbmZpZyA9IHtcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIGVuZERhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBtZW1iZXJzOiBbXSxcbiAgICAgICAgICAgIGhvbGlkYXlXb3JkczogZGVmYXVsdEhvbGlkYXlXb3Jkc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCBkZWZhdWx0Q29uZmlnO1xuICAgICAgICB0aGlzLmNhbGVuZGFyQXBwID0gY2FsZW5kYXIgfHwgbmV3IENhbGVuZGFyQXBwSW1wbCgpO1xuICAgIH1cbiAgICBHcm91cEltcGwucHJvdG90eXBlLmZldGNoSG9saWRheXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBob2xpZGF5cyA9IFtdO1xuICAgICAgICB2YXIgY2FsZW5kYXIgPSB0aGlzLmNhbGVuZGFyQXBwLmdldENhbGVuZGFyQnlJZCh0aGlzLmlkKTtcbiAgICAgICAgY2FsZW5kYXIuZ2V0RXZlbnRzKHRoaXMuY29uZmlnLnN0YXJ0RGF0ZSwgdGhpcy5jb25maWcuZW5kRGF0ZSkuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBhbGxEYXkgPSBldmVudC5pc0FsbERheUV2ZW50KCk7XG4gICAgICAgICAgICBpZiAoIWFsbERheSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0aXRsZSA9IGV2ZW50LmdldFRpdGxlKCk7XG4gICAgICAgICAgICB2YXIgYW0gPSBfdGhpcy5jb25maWcuaG9saWRheVdvcmRzLm1vcm5pbmcudGVzdCh0aXRsZSk7XG4gICAgICAgICAgICB2YXIgcG0gPSBfdGhpcy5jb25maWcuaG9saWRheVdvcmRzLmFmdGVybm9vbi50ZXN0KHRpdGxlKTtcbiAgICAgICAgICAgIHZhciBhbGwgPSBhbSA9PT0gdHJ1ZSB8fCBwbSA9PT0gdHJ1ZSA/IGZhbHNlIDogX3RoaXMuY29uZmlnLmhvbGlkYXlXb3Jkcy5hbGwudGVzdCh0aXRsZSk7XG4gICAgICAgICAgICBpZiAoYW0gPT09IGZhbHNlICYmIHBtID09PSBmYWxzZSAmJiBhbGwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1lbWJlcnMgPSBfdGhpcy5jb25maWcubWVtYmVycy5maWx0ZXIoZnVuY3Rpb24gKG1lbWJlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXIubWF0Y2gudGVzdCh0aXRsZSk7XG4gICAgICAgICAgICB9LCB0aXRsZSkubWFwKGZ1bmN0aW9uIChtZW1iZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyLm5hbWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBtb3ZlUG9pbnQgPSBjb3B5RGF0ZShldmVudC5nZXRTdGFydFRpbWUoKSk7XG4gICAgICAgICAgICB3aGlsZSAobW92ZVBvaW50LmdldFRpbWUoKSA8IGV2ZW50LmdldEVuZFRpbWUoKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAobW92ZVBvaW50LmdldFRpbWUoKSA8PSBfdGhpcy5jb25maWcuZW5kRGF0ZS5nZXRUaW1lKCkgJiYgbW92ZVBvaW50LmdldFRpbWUoKSA+PSBfdGhpcy5jb25maWcuc3RhcnREYXRlLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgICAgICBob2xpZGF5cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcm5pbmc6IGFtLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJub29uOiBwbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbDogYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5NZW1iZXI6IG1lbWJlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b0RhdGU6IGNvcHlEYXRlKG1vdmVQb2ludCksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtb3ZlUG9pbnQuc2V0RGF0ZShtb3ZlUG9pbnQuZ2V0RGF0ZSgpICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaG9saWRheXM7XG4gICAgfTtcbiAgICByZXR1cm4gR3JvdXBJbXBsO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEdyb3VwSW1wbDtcbiIsImltcG9ydCBNZW1iZXJJbXBsIGZyb20gXCIuL21lbWJlci9tZW1iZXJJbXBsXCI7XG5pbXBvcnQgR3JvdXBJbXBsIGZyb20gXCIuL2dyb3VwL2dyb3VwSW1wbFwiO1xuZ2xvYmFsLkdyb3VwID0gR3JvdXBJbXBsO1xuZ2xvYmFsLk1lbWJlciA9IE1lbWJlckltcGw7XG5leHBvcnQgeyBNZW1iZXJJbXBsIGFzIE1lbWJlciwgR3JvdXBJbXBsIGFzIEdyb3VwLCB9O1xuIiwiaW1wb3J0IHsgY29weURhdGUgfSBmcm9tIFwiLi4vdXRpbHMvZGF0ZVV0aWxzXCI7XG5pbXBvcnQgQ2FsZW5kYXJBcHBJbXBsIGZyb20gXCIuLi9jYWxlbmRhci9jYWxlbmRhckFwcEltcGxcIjtcbnZhciBNZW1iZXJJbXBsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1lbWJlckltcGwoaWQsIGNvbmZpZywgY2FsZW5kYXJBcHApIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB2YXIgZGVmYXVsdENvbmZpZyA9IHtcbiAgICAgICAgICAgIGV2ZXJ5TWludXRlczogMTUsXG4gICAgICAgICAgICBpZ25vcmU6IG5ldyBSZWdFeHAoJyg/ISknKSxcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIGVuZERhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBjdXRUaW1lUmFuZ2U6IFtdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCBkZWZhdWx0Q29uZmlnO1xuICAgICAgICB0aGlzLmNhbGVuZGFyQXBwID0gY2FsZW5kYXJBcHAgfHwgbmV3IENhbGVuZGFyQXBwSW1wbCgpO1xuICAgIH1cbiAgICBNZW1iZXJJbXBsLnByb3RvdHlwZS5mZXRjaFNjaGVkdWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHNjaGVkdWxlcyA9IFtdO1xuICAgICAgICB2YXIgY2FsZW5kYXIgPSB0aGlzLmNhbGVuZGFyQXBwLmdldENhbGVuZGFyQnlJZCh0aGlzLmlkKTtcbiAgICAgICAgdmFyIHdvcmtpbmdUaW1lUmFuZ2UgPSBbXTtcbiAgICAgICAgY2FsZW5kYXIuZ2V0RXZlbnRzKHRoaXMuY29uZmlnLnN0YXJ0RGF0ZSwgdGhpcy5jb25maWcuZW5kRGF0ZSkuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciB0aXRsZSA9IGV2ZW50LmdldFRpdGxlKCk7XG4gICAgICAgICAgICB2YXIgc3RhcnREYXRlID0gY29weURhdGUoZXZlbnQuZ2V0U3RhcnRUaW1lKCkpO1xuICAgICAgICAgICAgdmFyIGVuZERhdGUgPSBjb3B5RGF0ZShldmVudC5nZXRFbmRUaW1lKCkpO1xuICAgICAgICAgICAgLy8gTm90ZTogSWYgeW91IGFyZSBPV05FUiBhbmQgbm90IGF0dGVuZCB0aGUgZXZlbnRzLCBzdGF0dXMgaXMgT1dORVIuXG4gICAgICAgICAgICB2YXIgc3RhdHVzID0gZXZlbnQuZ2V0TXlTdGF0dXMoKTtcbiAgICAgICAgICAgIHZhciBpZ25vcmUgPSBfdGhpcy5jb25maWcuaWdub3JlLnRlc3QodGl0bGUpO1xuICAgICAgICAgICAgdmFyIGFsbERheSA9IGV2ZW50LmlzQWxsRGF5RXZlbnQoKTtcbiAgICAgICAgICAgIC8vIE5vdGU6IEdvb2dsZSBBcHBzIFNjcmlwdCBjYW4ndCBlbnVtLlxuICAgICAgICAgICAgdmFyIHN0YXR1c1N0ciA9IHN0YXR1cyA9PT0gbnVsbCA/ICdNQVlCRScgOiBzdGF0dXMudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHZhciBub05lZWRDYWxjQXNzaWduTWludXRlID0gc3RhdHVzU3RyID09PSAnTk8nIHx8IGlnbm9yZSB8fCBhbGxEYXk7XG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxBc3NpZ25NaW51dGUgPSBfdGhpcy5fY2FsY0Fzc2lnbk1pbnV0ZShzdGFydERhdGUsIGVuZERhdGUsIFtdLCBbXSk7XG4gICAgICAgICAgICB2YXIgYXNzaWduTWludXRlID0gMDtcbiAgICAgICAgICAgIHZhciBjdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghbm9OZWVkQ2FsY0Fzc2lnbk1pbnV0ZSkge1xuICAgICAgICAgICAgICAgIGFzc2lnbk1pbnV0ZSA9IF90aGlzLl9jYWxjQXNzaWduTWludXRlKHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgX3RoaXMuY29uZmlnLmN1dFRpbWVSYW5nZSwgd29ya2luZ1RpbWVSYW5nZSk7XG4gICAgICAgICAgICAgICAgY3V0ID0gb3JpZ2luYWxBc3NpZ25NaW51dGUgIT09IGFzc2lnbk1pbnV0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjaGVkdWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1c1N0cixcbiAgICAgICAgICAgICAgICBpZ25vcmU6IGlnbm9yZSxcbiAgICAgICAgICAgICAgICBhbGxEYXk6IGFsbERheSxcbiAgICAgICAgICAgICAgICBjdXQ6IGN1dCxcbiAgICAgICAgICAgICAgICBzdGFydDogc3RhcnREYXRlLFxuICAgICAgICAgICAgICAgIGVuZDogZW5kRGF0ZSxcbiAgICAgICAgICAgICAgICBhc3NpZ25NaW51dGU6IGFzc2lnbk1pbnV0ZSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEFzc2lnbk1pbnV0ZTogb3JpZ2luYWxBc3NpZ25NaW51dGUsXG4gICAgICAgICAgICAgICAgdGl0bGU6IGV2ZW50LmdldFRpdGxlKCksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGV2ZW50LmdldERlc2NyaXB0aW9uKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZXM7XG4gICAgfTtcbiAgICAvKlxuICAgICAgICBleC5cbiAgICAgICAgc3RhcnQ6IDIwMjAtMDEtMDEgMTE6MDBcbiAgICAgICAgZW5kOiAyMDIwLTAxLTAxIDEzOjAwXG4gICAgICAgIGN1dDogW3tmcm9tOiAyMDIwLTAxLTAxIDEyOjAwLCB0bzogMjAyMC0wMS0wMSAxMzowMH1dXG4gICAgICAgID0+IGFzc2lnbk1pbnV0ZSA9IDYwbTtcbiAgICAgKi9cbiAgICBNZW1iZXJJbXBsLnByb3RvdHlwZS5fY2FsY0Fzc2lnbk1pbnV0ZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kLCBjdXQsIHdvcmspIHtcbiAgICAgICAgdmFyIGNhbGN1bGF0ZWRBc3NpZ25NaW51dGUgPSAwO1xuICAgICAgICB2YXIgbW92ZVBvaW50ID0gY29weURhdGUoc3RhcnQpO1xuICAgICAgICB3aGlsZSAobW92ZVBvaW50LmdldFRpbWUoKSA8IGVuZC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIG1vdmVQb2ludC5zZXRUaW1lKG1vdmVQb2ludC5nZXRUaW1lKCkgKyAxKTtcbiAgICAgICAgICAgIHZhciBpbkN1dFRpbWUgPSBjdXQuc29tZShmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG1vdmVQb2ludC5nZXRUaW1lKCkgPD0gcmFuZ2UudG8uZ2V0VGltZSgpICYmIG1vdmVQb2ludC5nZXRUaW1lKCkgPj0gcmFuZ2UuZnJvbS5nZXRUaW1lKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgaXNEdXBsaWNhdGUgPSB3b3JrLnNvbWUoZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChtb3ZlUG9pbnQuZ2V0VGltZSgpIDw9IHJhbmdlLnRvLmdldFRpbWUoKSAmJiBtb3ZlUG9pbnQuZ2V0VGltZSgpID49IHJhbmdlLmZyb20uZ2V0VGltZSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbW92ZVBvaW50LnNldFRpbWUobW92ZVBvaW50LmdldFRpbWUoKSAtIDEpO1xuICAgICAgICAgICAgaWYgKCFpbkN1dFRpbWUgJiYgIWlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlZEFzc2lnbk1pbnV0ZSArPSB0aGlzLmNvbmZpZy5ldmVyeU1pbnV0ZXM7XG4gICAgICAgICAgICAgICAgdmFyIGZyb20gPSBjb3B5RGF0ZShtb3ZlUG9pbnQpO1xuICAgICAgICAgICAgICAgIHZhciB0byA9IGNvcHlEYXRlKG1vdmVQb2ludCk7XG4gICAgICAgICAgICAgICAgdG8gPSBuZXcgRGF0ZSh0by5zZXRNaW51dGVzKHRvLmdldE1pbnV0ZXMoKSArIHRoaXMuY29uZmlnLmV2ZXJ5TWludXRlcykpO1xuICAgICAgICAgICAgICAgIHdvcmsucHVzaCh7IGZyb206IGZyb20sIHRvOiB0byB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vdmVQb2ludC5zZXRNaW51dGVzKG1vdmVQb2ludC5nZXRNaW51dGVzKCkgKyB0aGlzLmNvbmZpZy5ldmVyeU1pbnV0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxjdWxhdGVkQXNzaWduTWludXRlO1xuICAgIH07XG4gICAgcmV0dXJuIE1lbWJlckltcGw7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgTWVtYmVySW1wbDtcbiIsImV4cG9ydCBmdW5jdGlvbiBjb3B5RGF0ZShkKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGQuZ2V0VGltZSgpKTtcbn1cbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=