@silverbirder/rminc
Version:
rMinc is the Google Apps Script Library that register Mail in Calendar
635 lines (578 loc) • 58.9 kB
JavaScript
function User() {
}
function MailRule() {
}
function AmazonMailRule() {
}
function TohoCinemasMailRule() {
}
function ShokutakubinMailRule() {
}/******/ (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/index.ts":
/*!**********************!*\
!*** ./src/index.ts ***!
\**********************/
/*! exports provided: User, MailRule, AmazonMailRule, TohoCinemasMailRule, ShokutakubinMailRule */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var _user_userImpl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./user/userImpl */ "./src/user/userImpl.ts");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "User", function() { return _user_userImpl__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony import */ var _user_mailRule_amazonMailRule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./user/mailRule/amazonMailRule */ "./src/user/mailRule/amazonMailRule.ts");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AmazonMailRule", function() { return _user_mailRule_amazonMailRule__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony import */ var _user_mailRule_tohoCinemasMailRule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./user/mailRule/tohoCinemasMailRule */ "./src/user/mailRule/tohoCinemasMailRule.ts");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TohoCinemasMailRule", function() { return _user_mailRule_tohoCinemasMailRule__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/* harmony import */ var _user_mailRule_shokutakubinMailRule__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./user/mailRule/shokutakubinMailRule */ "./src/user/mailRule/shokutakubinMailRule.ts");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ShokutakubinMailRule", function() { return _user_mailRule_shokutakubinMailRule__WEBPACK_IMPORTED_MODULE_3__["default"]; });
/* harmony import */ var _user_mailRule_mailRule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./user/mailRule/mailRule */ "./src/user/mailRule/mailRule.ts");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MailRule", function() { return _user_mailRule_mailRule__WEBPACK_IMPORTED_MODULE_4__["default"]; });
global.User = _user_userImpl__WEBPACK_IMPORTED_MODULE_0__["default"];
global.MailRule = _user_mailRule_mailRule__WEBPACK_IMPORTED_MODULE_4__["default"];
global.AmazonMailRule = _user_mailRule_amazonMailRule__WEBPACK_IMPORTED_MODULE_1__["default"];
global.TohoCinemasMailRule = _user_mailRule_tohoCinemasMailRule__WEBPACK_IMPORTED_MODULE_2__["default"];
global.ShokutakubinMailRule = _user_mailRule_shokutakubinMailRule__WEBPACK_IMPORTED_MODULE_3__["default"];
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
/***/ }),
/***/ "./src/user/calendarApp/calendarAppImpl.ts":
/*!*************************************************!*\
!*** ./src/user/calendarApp/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.getCalendarByName = function (name) {
return CalendarApp.getCalendarsByName(name)[0];
};
CalendarAppImpl.prototype.createCalendar = function (name) {
return CalendarApp.createCalendar(name);
};
return CalendarAppImpl;
}());
/* harmony default export */ __webpack_exports__["default"] = (CalendarAppImpl);
/***/ }),
/***/ "./src/user/mail/mailApp/mailAppImpl.ts":
/*!**********************************************!*\
!*** ./src/user/mail/mailApp/mailAppImpl.ts ***!
\**********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
var MailAppImpl = /** @class */ (function () {
function MailAppImpl() {
}
MailAppImpl.prototype.search = function (q) {
return GmailApp.search(q);
};
MailAppImpl.prototype.getUserLabelByName = function (name) {
return GmailApp.getUserLabelByName(name);
};
MailAppImpl.prototype.createLabel = function (name) {
return GmailApp.createLabel(name);
};
return MailAppImpl;
}());
/* harmony default export */ __webpack_exports__["default"] = (MailAppImpl);
/***/ }),
/***/ "./src/user/mailRule/amazonMailRule.ts":
/*!*********************************************!*\
!*** ./src/user/mailRule/amazonMailRule.ts ***!
\*********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _mailRule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mailRule */ "./src/user/mailRule/mailRule.ts");
var __extends = (undefined && undefined.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var AmazonMailRule = /** @class */ (function (_super) {
__extends(AmazonMailRule, _super);
function AmazonMailRule() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.name = 'amazon';
_this.filteringKeyword = 'from:(shipment-tracking@amazon.co.jp) 発送';
return _this;
}
AmazonMailRule.prototype.extractLocation = function (body) {
// お届け先:</span><br> <p> <strong> XXXX 様 <br> XXX-XXXX <br> XXXX <br> XXXX <br> XXXX <br> </strong>
var messageMatch = new RegExp('お届け先.+?(?=<strong>)<strong>(.+?)(?=<\/strong>)', 's');
var matchedMessage = body.match(messageMatch);
if (matchedMessage === null) {
throw Error('Not found location message');
}
// XXXX 様 <br> XXX-XXXX <br> XXXX <br> XXXX <br> XXXX <br>
var message = matchedMessage[1];
var location = message.split(/<br\s?\/?>/).slice(1).join('').trim();
return location;
};
AmazonMailRule.prototype.extractDateRange = function (body, baseDate) {
// お届け予定日:</span><br> <strong>土曜日, 11/24 08:00 - 12:00</strong>
var messageMatch = new RegExp('お届け予定日?.+?(?=<strong>)<strong>(.+?)(?=<\/strong>)', 's');
var matchedMessage = body.match(messageMatch);
if (matchedMessage === null) {
throw Error('Not found date range message');
}
// 土曜日, 11/24 08:00 - 12:00
var message = matchedMessage[1];
// 11/24
var matchedDate = message.match(/(\d+\/\d+)/);
if (matchedDate === null) {
throw Error('Not found date range');
}
var deliveryDateStr = matchedDate[1];
// 08:00 - 12:00
var matchedTime = message.match(/(\d+:\d+)\s-\s(\d+:\d+)/);
var startTimeStr = '00:00';
var endTimeStr = '00:00';
if (matchedTime !== null) {
startTimeStr = matchedTime[1];
endTimeStr = matchedTime[2];
}
var deliveryDateAry = deliveryDateStr.split(/\//);
var startTimeAry = startTimeStr.split(/:/);
var endTimeAry = endTimeStr.split(/:/);
var month = parseInt(deliveryDateAry[0], 10);
var day = parseInt(deliveryDateAry[1], 10);
var startHour = parseInt(startTimeAry[0], 10);
var startMinute = parseInt(startTimeAry[1], 10);
var endHour = parseInt(endTimeAry[0], 10);
var endMinute = parseInt(endTimeAry[1], 10);
return {
start: new Date(baseDate.getFullYear(), month - 1, day, startHour, startMinute),
end: new Date(baseDate.getFullYear(), month - 1, day, endHour, endMinute)
};
};
AmazonMailRule.prototype.extractTitle = function (body) {
return '';
};
return AmazonMailRule;
}(_mailRule__WEBPACK_IMPORTED_MODULE_0__["default"]));
/* harmony default export */ __webpack_exports__["default"] = (AmazonMailRule);
/***/ }),
/***/ "./src/user/mailRule/mailRule.ts":
/*!***************************************!*\
!*** ./src/user/mailRule/mailRule.ts ***!
\***************************************/
/*! exports provided: default, LABEL */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LABEL", function() { return LABEL; });
var MailRule = /** @class */ (function () {
function MailRule(before, after) {
this.filteringKeyword = '';
this.name = '';
this.after = '';
this.before = '';
var now = new Date();
var tomorrow = new Date(now.getTime());
tomorrow.setDate(tomorrow.getDate() + 1);
var yesterday = new Date(now.getTime());
yesterday.setDate(yesterday.getDate() - 1);
this.before = this._dateFormat(before === undefined ? tomorrow : before);
this.after = this._dateFormat(after === undefined ? yesterday : after);
}
MailRule.prototype._dateFormat = function (d) {
var MM = ("0" + (d.getMonth() + 1)).slice(-2);
var DD = ("0" + d.getDate()).slice(-2);
return d.getFullYear() + "/" + MM + "/" + DD;
};
MailRule.prototype.buildQuery = function () {
return this.filteringKeyword + " -{label: " + this.buildLabel() + "} after:" + this.after + " before:" + this.before;
};
MailRule.prototype.buildLabel = function () {
return LABEL.CONFIRMED + "." + this.name;
};
return MailRule;
}());
/* harmony default export */ __webpack_exports__["default"] = (MailRule);
var LABEL = {
CONFIRMED: 'confirmed'
};
/***/ }),
/***/ "./src/user/mailRule/shokutakubinMailRule.ts":
/*!***************************************************!*\
!*** ./src/user/mailRule/shokutakubinMailRule.ts ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _mailRule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mailRule */ "./src/user/mailRule/mailRule.ts");
var __extends = (undefined && undefined.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var ShokutakubinMailRule = /** @class */ (function (_super) {
__extends(ShokutakubinMailRule, _super);
function ShokutakubinMailRule() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.name = 'shokutakubin';
_this.filteringKeyword = 'from:(shokutakubin@shmail.nifs.co.jp) 配送手配';
return _this;
}
ShokutakubinMailRule.prototype.extractLocation = function (body) {
/*
【お届け先住所】
〒XXXXXXX
XXXX
【お届け希望日】
*/
var messageMatch = new RegExp('【お届け先住所】(.+?)【お届け希望日】', 's');
var matchedMessage = body.match(messageMatch);
if (matchedMessage === null) {
throw Error('Not found location message');
}
var message = matchedMessage[1].trim();
var location = message.split(/\n/).join(' ').trim();
return location;
};
ShokutakubinMailRule.prototype.extractDateRange = function (body) {
/*
【お届け希望日】XXXX年XX月XX日(X)
【配送希望時間帯】19:00~21:00 or 午前中
*/
var messageDateMatch = new RegExp('【お届け希望日】(.+)');
var messageTimeMatch = new RegExp('【(配送希望時間帯|お届け希望時間帯)】(.+)');
var matchedDateMessage = body.match(messageDateMatch);
var matchedTimeMessage = body.match(messageTimeMatch);
if (matchedDateMessage === null || matchedTimeMessage === null) {
throw Error('Not found date range message');
}
// XXXX年XX月XX日(X)
var messageDate = matchedDateMessage[1];
// 19:00~21:00 or 午前中
var messageTime = matchedTimeMessage[2];
// XXXX年XX月XX日
var matchedDate = messageDate.match(/(\d+)年(\d+)月(\d+)日/);
if (matchedDate === null) {
throw Error('Not found date range');
}
var matchedTime = messageTime.match(/(\d+):(\d+)~(\d+):(\d+)/);
var startHour = 0;
var startMinute = 0;
var endHour = 0;
var endMinute = 0;
if (matchedTime !== null) {
startHour = parseInt(matchedTime[1], 10);
startMinute = parseInt(matchedTime[2], 10);
endHour = parseInt(matchedTime[3], 10);
endMinute = parseInt(matchedTime[4], 10);
}
else {
matchedTime = messageTime.match(/午前中/);
if (matchedTime !== null) {
startHour = 9;
startMinute = 0;
endHour = 12;
endMinute = 0;
}
}
var year = parseInt(matchedDate[1], 10);
var month = parseInt(matchedDate[2], 10);
var day = parseInt(matchedDate[3], 10);
return {
start: new Date(year, month - 1, day, startHour, startMinute),
end: new Date(year, month - 1, day, endHour, endMinute)
};
};
ShokutakubinMailRule.prototype.extractTitle = function (body) {
/*
・送り状No:XXXX
Title
*/
var messageMatch = new RegExp('送り状No.+?\n(.+?)\n', 's');
var matchedMessage = body.match(messageMatch);
if (matchedMessage === null) {
throw Error('Not found title message');
}
// Title
var title = matchedMessage[1].trim();
return title;
};
return ShokutakubinMailRule;
}(_mailRule__WEBPACK_IMPORTED_MODULE_0__["default"]));
/* harmony default export */ __webpack_exports__["default"] = (ShokutakubinMailRule);
/***/ }),
/***/ "./src/user/mailRule/tohoCinemasMailRule.ts":
/*!**************************************************!*\
!*** ./src/user/mailRule/tohoCinemasMailRule.ts ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _mailRule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mailRule */ "./src/user/mailRule/mailRule.ts");
var __extends = (undefined && undefined.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var TohoCinemasMailRule = /** @class */ (function (_super) {
__extends(TohoCinemasMailRule, _super);
function TohoCinemasMailRule() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.name = 'toho_cinemas';
_this.filteringKeyword = 'from:(i-net.ticket@ml.tohotheater.jp)';
return _this;
}
TohoCinemasMailRule.prototype.extractLocation = function (body) {
// ■映画館 Theater XXXX XXXX XXXX
var messageMatch = new RegExp('映画館(.+)');
var matchedMessage = body.match(messageMatch);
if (matchedMessage === null) {
throw Error('Not found location message');
}
// Theater XXXX XXXX XXXX
var message = matchedMessage[1].trim();
var location = message.replace(/^Theater/, '').trim();
return location;
};
TohoCinemasMailRule.prototype.extractDateRange = function (body) {
// ■上映日 Date 2018/9/23 ■時間 Time 18:30~
var messageMatch = new RegExp('上映日(.+)');
var matchedMessage = body.match(messageMatch);
if (matchedMessage === null) {
throw Error('Not found date range message');
}
// Date 2018/9/23 ■時間 Time 18:30~
var message = matchedMessage[1];
var matchedDate = message.match(/(\d+\/\d+\/\d+)/);
var matchedTime = message.match(/(\d+:\d+)/);
if (matchedDate === null || matchedTime === null) {
throw Error('Not found date range');
}
var dateStr = matchedDate[1];
var timeStr = matchedTime[1];
var dateAry = dateStr.split(/\//);
var timeAry = timeStr.split(/:/);
var year = parseInt(dateAry[0], 10);
var month = parseInt(dateAry[1], 10);
var day = parseInt(dateAry[2], 10);
var hour = parseInt(timeAry[0], 10);
var minute = parseInt(timeAry[1], 10);
return {
start: new Date(year, month - 1, day, hour, minute),
end: new Date(year, month - 1, day, hour, minute)
};
};
TohoCinemasMailRule.prototype.extractTitle = function (body) {
// ■映画名称 Movie (吹)プーと大人になった僕 CHRISTOPHER ROBIN / JAPANESE
var messageMatch = new RegExp('映画名称(.+)');
var matchedMessage = body.match(messageMatch);
if (matchedMessage === null) {
throw Error('Not found title message');
}
// (吹)プーと大人になった僕 CHRISTOPHER ROBIN / JAPANESE
var title = matchedMessage[1].trim().replace(/^Movie/, '').trim();
return title;
};
return TohoCinemasMailRule;
}(_mailRule__WEBPACK_IMPORTED_MODULE_0__["default"]));
/* harmony default export */ __webpack_exports__["default"] = (TohoCinemasMailRule);
/***/ }),
/***/ "./src/user/userImpl.ts":
/*!******************************!*\
!*** ./src/user/userImpl.ts ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _mail_mailApp_mailAppImpl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mail/mailApp/mailAppImpl */ "./src/user/mail/mailApp/mailAppImpl.ts");
/* harmony import */ var _calendarApp_calendarAppImpl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./calendarApp/calendarAppImpl */ "./src/user/calendarApp/calendarAppImpl.ts");
var UserImpl = /** @class */ (function () {
function UserImpl() {
this.mailApp = new _mail_mailApp_mailAppImpl__WEBPACK_IMPORTED_MODULE_0__["default"]();
this.mailRules = [];
this.stockMailThreads = [];
this.calendarApp = new _calendarApp_calendarAppImpl__WEBPACK_IMPORTED_MODULE_1__["default"]();
}
UserImpl.prototype.setMailRules = function (mailRules) {
var _this = this;
mailRules.forEach(function (mailRule) {
var mailLabel = mailRule.buildLabel();
mailRule.label = _this.mailApp.getUserLabelByName(mailLabel);
if (!mailRule.label) {
mailRule.label = _this.mailApp.createLabel(mailLabel);
}
mailRule.calendar = _this.calendarApp.getCalendarByName(mailLabel);
if (!mailRule.calendar) {
mailRule.calendar = _this.calendarApp.createCalendar(mailLabel);
}
});
this.mailRules = mailRules;
};
UserImpl.prototype.fetchMails = function () {
var _this = this;
this.mailRules.forEach(function (mailRule) {
var mailThreads = _this.mailApp.search(mailRule.buildQuery());
_this.stockMailThreads.push({ rule: mailRule, mailThreads: mailThreads });
});
};
UserImpl.prototype.doRMinc = function () {
this.stockMailThreads.forEach(function (stockMailThreads) {
stockMailThreads.mailThreads.forEach(function (mailThread) {
mailThread.getMessages().forEach(function (mailMessage) {
var body = mailMessage.getBody();
var mailDate = new Date(mailMessage.getDate().getTime());
var dateRange = stockMailThreads.rule.extractDateRange(body, mailDate);
var location = stockMailThreads.rule.extractLocation(body);
var title = stockMailThreads.rule.extractTitle(body);
var subject = title ? title : mailMessage.getSubject();
stockMailThreads.rule.calendar.createEvent(subject, dateRange.start, dateRange.end, {
description: mailThread.getPermalink(),
location: location
});
});
mailThread.addLabel(stockMailThreads.rule.label);
});
});
};
return UserImpl;
}());
/* harmony default export */ __webpack_exports__["default"] = (UserImpl);
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3VzZXIvY2FsZW5kYXJBcHAvY2FsZW5kYXJBcHBJbXBsLnRzIiwid2VicGFjazovLy8uL3NyYy91c2VyL21haWwvbWFpbEFwcC9tYWlsQXBwSW1wbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXNlci9tYWlsUnVsZS9hbWF6b25NYWlsUnVsZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXNlci9tYWlsUnVsZS9tYWlsUnVsZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXNlci9tYWlsUnVsZS9zaG9rdXRha3ViaW5NYWlsUnVsZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXNlci9tYWlsUnVsZS90b2hvQ2luZW1hc01haWxSdWxlLnRzIiwid2VicGFjazovLy8uL3NyYy91c2VyL3VzZXJJbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZE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QTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QywyQ0FBMkM7QUFDcEYsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQztBQUNjLHVFQUFRLEVBQUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9pbmRleC50c1wiKTtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsImltcG9ydCBVc2VySW1wbCBmcm9tIFwiLi91c2VyL3VzZXJJbXBsXCI7XG5pbXBvcnQgQW1hem9uTWFpbFJ1bGUgZnJvbSBcIi4vdXNlci9tYWlsUnVsZS9hbWF6b25NYWlsUnVsZVwiO1xuaW1wb3J0IFRvaG9DaW5lbWFzTWFpbFJ1bGUgZnJvbSBcIi4vdXNlci9tYWlsUnVsZS90b2hvQ2luZW1hc01haWxSdWxlXCI7XG5pbXBvcnQgU2hva3V0YWt1YmluTWFpbFJ1bGUgZnJvbSBcIi4vdXNlci9tYWlsUnVsZS9zaG9rdXRha3ViaW5NYWlsUnVsZVwiO1xuaW1wb3J0IE1haWxSdWxlIGZyb20gXCIuL3VzZXIvbWFpbFJ1bGUvbWFpbFJ1bGVcIjtcbmdsb2JhbC5Vc2VyID0gVXNlckltcGw7XG5nbG9iYWwuTWFpbFJ1bGUgPSBNYWlsUnVsZTtcbmdsb2JhbC5BbWF6b25NYWlsUnVsZSA9IEFtYXpvbk1haWxSdWxlO1xuZ2xvYmFsLlRvaG9DaW5lbWFzTWFpbFJ1bGUgPSBUb2hvQ2luZW1hc01haWxSdWxlO1xuZ2xvYmFsLlNob2t1dGFrdWJpbk1haWxSdWxlID0gU2hva3V0YWt1YmluTWFpbFJ1bGU7XG5leHBvcnQgeyBVc2VySW1wbCBhcyBVc2VyLCBNYWlsUnVsZSwgQW1hem9uTWFpbFJ1bGUsIFRvaG9DaW5lbWFzTWFpbFJ1bGUsIFNob2t1dGFrdWJpbk1haWxSdWxlLCB9O1xuIiwidmFyIENhbGVuZGFyQXBwSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYWxlbmRhckFwcEltcGwoKSB7XG4gICAgfVxuICAgIENhbGVuZGFyQXBwSW1wbC5wcm90b3R5cGUuZ2V0Q2FsZW5kYXJCeU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gQ2FsZW5kYXJBcHAuZ2V0Q2FsZW5kYXJzQnlOYW1lKG5hbWUpWzBdO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcHBJbXBsLnByb3RvdHlwZS5jcmVhdGVDYWxlbmRhciA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiBDYWxlbmRhckFwcC5jcmVhdGVDYWxlbmRhcihuYW1lKTtcbiAgICB9O1xuICAgIHJldHVybiBDYWxlbmRhckFwcEltcGw7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQ2FsZW5kYXJBcHBJbXBsO1xuIiwidmFyIE1haWxBcHBJbXBsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1haWxBcHBJbXBsKCkge1xuICAgIH1cbiAgICBNYWlsQXBwSW1wbC5wcm90b3R5cGUuc2VhcmNoID0gZnVuY3Rpb24gKHEpIHtcbiAgICAgICAgcmV0dXJuIEdtYWlsQXBwLnNlYXJjaChxKTtcbiAgICB9O1xuICAgIE1haWxBcHBJbXBsLnByb3RvdHlwZS5nZXRVc2VyTGFiZWxCeU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gR21haWxBcHAuZ2V0VXNlckxhYmVsQnlOYW1lKG5hbWUpO1xuICAgIH07XG4gICAgTWFpbEFwcEltcGwucHJvdG90eXBlLmNyZWF0ZUxhYmVsID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIEdtYWlsQXBwLmNyZWF0ZUxhYmVsKG5hbWUpO1xuICAgIH07XG4gICAgcmV0dXJuIE1haWxBcHBJbXBsO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IE1haWxBcHBJbXBsO1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5pbXBvcnQgTWFpbFJ1bGUgZnJvbSBcIi4vbWFpbFJ1bGVcIjtcbnZhciBBbWF6b25NYWlsUnVsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQW1hem9uTWFpbFJ1bGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQW1hem9uTWFpbFJ1bGUoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5uYW1lID0gJ2FtYXpvbic7XG4gICAgICAgIF90aGlzLmZpbHRlcmluZ0tleXdvcmQgPSAnZnJvbTooc2hpcG1lbnQtdHJhY2tpbmdAYW1hem9uLmNvLmpwKSDnmbrpgIEnO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEFtYXpvbk1haWxSdWxlLnByb3RvdHlwZS5leHRyYWN0TG9jYXRpb24gPSBmdW5jdGlvbiAoYm9keSkge1xuICAgICAgICAvLyDjgYrlsYrjgZHlhYjvvJo8L3NwYW4+PGJyPiA8cD4gPHN0cm9uZz4gWFhYWCDmp5ggPGJyPiBYWFgtWFhYWCA8YnI+IFhYWFggPGJyPiBYWFhYIDxicj4gWFhYWCA8YnI+IDwvc3Ryb25nPlxuICAgICAgICB2YXIgbWVzc2FnZU1hdGNoID0gbmV3IFJlZ0V4cCgn44GK5bGK44GR5YWILis/KD89PHN0cm9uZz4pPHN0cm9uZz4oLis/KSg/PTxcXC9zdHJvbmc+KScsICdzJyk7XG4gICAgICAgIHZhciBtYXRjaGVkTWVzc2FnZSA9IGJvZHkubWF0Y2gobWVzc2FnZU1hdGNoKTtcbiAgICAgICAgaWYgKG1hdGNoZWRNZXNzYWdlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTm90IGZvdW5kIGxvY2F0aW9uIG1lc3NhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAgWFhYWCDmp5ggPGJyPiBYWFgtWFhYWCA8YnI+IFhYWFggPGJyPiBYWFhYIDxicj4gWFhYWCA8YnI+XG4gICAgICAgIHZhciBtZXNzYWdlID0gbWF0Y2hlZE1lc3NhZ2VbMV07XG4gICAgICAgIHZhciBsb2NhdGlvbiA9IG1lc3NhZ2Uuc3BsaXQoLzxiclxccz9cXC8/Pi8pLnNsaWNlKDEpLmpvaW4oJycpLnRyaW0oKTtcbiAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xuICAgIH07XG4gICAgQW1hem9uTWFpbFJ1bGUucHJvdG90eXBlLmV4dHJhY3REYXRlUmFuZ2UgPSBmdW5jdGlvbiAoYm9keSwgYmFzZURhdGUpIHtcbiAgICAgICAgLy8g44GK5bGK44GR5LqI5a6a5pel77yaPC9zcGFuPjxicj4gPHN0cm9uZz7lnJ/mm5zml6UsIDExLzI0IDA4OjAwIC0gMTI6MDA8L3N0cm9uZz5cbiAgICAgICAgdmFyIG1lc3NhZ2VNYXRjaCA9IG5ldyBSZWdFeHAoJ+OBiuWxiuOBkeS6iOWumuaXpT8uKz8oPz08c3Ryb25nPik8c3Ryb25nPiguKz8pKD89PFxcL3N0cm9uZz4pJywgJ3MnKTtcbiAgICAgICAgdmFyIG1hdGNoZWRNZXNzYWdlID0gYm9keS5tYXRjaChtZXNzYWdlTWF0Y2gpO1xuICAgICAgICBpZiAobWF0Y2hlZE1lc3NhZ2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdOb3QgZm91bmQgZGF0ZSByYW5nZSBtZXNzYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5Zyf5puc5pelLCAxMS8yNCAwODowMCAtIDEyOjAwXG4gICAgICAgIHZhciBtZXNzYWdlID0gbWF0Y2hlZE1lc3NhZ2VbMV07XG4gICAgICAgIC8vIDExLzI0XG4gICAgICAgIHZhciBtYXRjaGVkRGF0ZSA9IG1lc3NhZ2UubWF0Y2goLyhcXGQrXFwvXFxkKykvKTtcbiAgICAgICAgaWYgKG1hdGNoZWREYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTm90IGZvdW5kIGRhdGUgcmFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsaXZlcnlEYXRlU3RyID0gbWF0Y2hlZERhdGVbMV07XG4gICAgICAgIC8vIDA4OjAwIC0gMTI6MDBcbiAgICAgICAgdmFyIG1hdGNoZWRUaW1lID0gbWVzc2FnZS5tYXRjaCgvKFxcZCs6XFxkKylcXHMtXFxzKFxcZCs6XFxkKykvKTtcbiAgICAgICAgdmFyIHN0YXJ0VGltZVN0ciA9ICcwMDowMCc7XG4gICAgICAgIHZhciBlbmRUaW1lU3RyID0gJzAwOjAwJztcbiAgICAgICAgaWYgKG1hdGNoZWRUaW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdGFydFRpbWVTdHIgPSBtYXRjaGVkVGltZVsxXTtcbiAgICAgICAgICAgIGVuZFRpbWVTdHIgPSBtYXRjaGVkVGltZVsyXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsaXZlcnlEYXRlQXJ5ID0gZGVsaXZlcnlEYXRlU3RyLnNwbGl0KC9cXC8vKTtcbiAgICAgICAgdmFyIHN0YXJ0VGltZUFyeSA9IHN0YXJ0VGltZVN0ci5zcGxpdCgvOi8pO1xuICAgICAgICB2YXIgZW5kVGltZUFyeSA9IGVuZFRpbWVTdHIuc3BsaXQoLzovKTtcbiAgICAgICAgdmFyIG1vbnRoID0gcGFyc2VJbnQoZGVsaXZlcnlEYXRlQXJ5WzBdLCAxMCk7XG4gICAgICAgIHZhciBkYXkgPSBwYXJzZUludChkZWxpdmVyeURhdGVBcnlbMV0sIDEwKTtcbiAgICAgICAgdmFyIHN0YXJ0SG91ciA9IHBhcnNlSW50KHN0YXJ0VGltZUFyeVswXSwgMTApO1xuICAgICAgICB2YXIgc3RhcnRNaW51dGUgPSBwYXJzZUludChzdGFydFRpbWVBcnlbMV0sIDEwKTtcbiAgICAgICAgdmFyIGVuZEhvdXIgPSBwYXJzZUludChlbmRUaW1lQXJ5WzBdLCAxMCk7XG4gICAgICAgIHZhciBlbmRNaW51dGUgPSBwYXJzZUludChlbmRUaW1lQXJ5WzFdLCAxMCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydDogbmV3IERhdGUoYmFzZURhdGUuZ2V0RnVsbFllYXIoKSwgbW9udGggLSAxLCBkYXksIHN0YXJ0SG91ciwgc3RhcnRNaW51dGUpLFxuICAgICAgICAgICAgZW5kOiBuZXcgRGF0ZShiYXNlRGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aCAtIDEsIGRheSwgZW5kSG91ciwgZW5kTWludXRlKVxuICAgICAgICB9O1xuICAgIH07XG4gICAgQW1hem9uTWFpbFJ1bGUucHJvdG90eXBlLmV4dHJhY3RUaXRsZSA9IGZ1bmN0aW9uIChib2R5KSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9O1xuICAgIHJldHVybiBBbWF6b25NYWlsUnVsZTtcbn0oTWFpbFJ1bGUpKTtcbmV4cG9ydCBkZWZhdWx0IEFtYXpvbk1haWxSdWxlO1xuIiwidmFyIE1haWxSdWxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1haWxSdWxlKGJlZm9yZSwgYWZ0ZXIpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdLZXl3b3JkID0gJyc7XG4gICAgICAgIHRoaXMubmFtZSA9ICcnO1xuICAgICAgICB0aGlzLmFmdGVyID0gJyc7XG4gICAgICAgIHRoaXMuYmVmb3JlID0gJyc7XG4gICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgdG9tb3Jyb3cgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpKTtcbiAgICAgICAgdG9tb3Jyb3cuc2V0RGF0ZSh0b21vcnJvdy5nZXREYXRlKCkgKyAxKTtcbiAgICAgICAgdmFyIHllc3RlcmRheSA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkpO1xuICAgICAgICB5ZXN0ZXJkYXkuc2V0RGF0ZSh5ZXN0ZXJkYXkuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgICAgIHRoaXMuYmVmb3JlID0gdGhpcy5fZGF0ZUZvcm1hdChiZWZvcmUgPT09IHVuZGVmaW5lZCA/IHRvbW9ycm93IDogYmVmb3JlKTtcbiAgICAgICAgdGhpcy5hZnRlciA9IHRoaXMuX2RhdGVGb3JtYXQoYWZ0ZXIgPT09IHVuZGVmaW5lZCA/IHllc3RlcmRheSA6IGFmdGVyKTtcbiAgICB9XG4gICAgTWFpbFJ1bGUucHJvdG90eXBlLl9kYXRlRm9ybWF0ID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgdmFyIE1NID0gKFwiMFwiICsgKGQuZ2V0TW9udGgoKSArIDEpKS5zbGljZSgtMik7XG4gICAgICAgIHZhciBERCA9IChcIjBcIiArIGQuZ2V0RGF0ZSgpKS5zbGljZSgtMik7XG4gICAgICAgIHJldHVybiBkLmdldEZ1bGxZZWFyKCkgKyBcIi9cIiArIE1NICsgXCIvXCIgKyBERDtcbiAgICB9O1xuICAgIE1haWxSdWxlLnByb3RvdHlwZS5idWlsZFF1ZXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJpbmdLZXl3b3JkICsgXCIgLXtsYWJlbDogXCIgKyB0aGlzLmJ1aWxkTGFiZWwoKSArIFwifSBhZnRlcjpcIiArIHRoaXMuYWZ0ZXIgKyBcIiBiZWZvcmU6XCIgKyB0aGlzLmJlZm9yZTtcbiAgICB9O1xuICAgIE1haWxSdWxlLnByb3RvdHlwZS5idWlsZExhYmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gTEFCRUwuQ09ORklSTUVEICsgXCIuXCIgKyB0aGlzLm5hbWU7XG4gICAgfTtcbiAgICByZXR1cm4gTWFpbFJ1bGU7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgTWFpbFJ1bGU7XG5leHBvcnQgdmFyIExBQkVMID0ge1xuICAgIENPTkZJUk1FRDogJ2NvbmZpcm1lZCcsXG59O1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5pbXBvcnQgTWFpbFJ1bGUgZnJvbSBcIi4vbWFpbFJ1bGVcIjtcbnZhciBTaG9rdXRha3ViaW5NYWlsUnVsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2hva3V0YWt1YmluTWFpbFJ1bGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2hva3V0YWt1YmluTWFpbFJ1bGUoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5uYW1lID0gJ3Nob2t1dGFrdWJpbic7XG4gICAgICAgIF90aGlzLmZpbHRlcmluZ0tleXdvcmQgPSAnZnJvbTooc2hva3V0YWt1YmluQHNobWFpbC5uaWZzLmNvLmpwKSDphY3pgIHmiYvphY0nO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFNob2t1dGFrdWJpbk1haWxSdWxlLnByb3RvdHlwZS5leHRyYWN0TG9jYXRpb24gPSBmdW5jdGlvbiAoYm9keSkge1xuICAgICAgICAvKlxuICAgICAgICDjgJDjgYrlsYrjgZHlhYjkvY/miYDjgJFcbiAgICAgICAgICDjgJJYWFhYWFhYXG4gICAgICAgICBYWFhYXG4gICAgICAgIOOAkOOBiuWxiuOBkeW4jOacm+aXpeOAkVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIG1lc3NhZ2VNYXRjaCA9IG5ldyBSZWdFeHAoJ+OAkOOBiuWxiuOBkeWFiOS9j+aJgOOAkSguKz8p44CQ44GK5bGK44GR5biM5pyb5pel44CRJywgJ3MnKTtcbiAgICAgICAgdmFyIG1hdGNoZWRNZXNzYWdlID0gYm9keS5tYXRjaChtZXNzYWdlTWF0Y2gpO1xuICAgICAgICBpZiAobWF0Y2hlZE1lc3NhZ2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdOb3QgZm91bmQgbG9jYXRpb24gbWVzc2FnZScpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtZXNzYWdlID0gbWF0Y2hlZE1lc3NhZ2VbMV0udHJpbSgpO1xuICAgICAgICB2YXIgbG9jYXRpb24gPSBtZXNzYWdlLnNwbGl0KC9cXG4vKS5qb2luKCcgJykudHJpbSgpO1xuICAgICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgfTtcbiAgICBTaG9rdXRha3ViaW5NYWlsUnVsZS5wcm90b3R5cGUuZXh0cmFjdERhdGVSYW5nZSA9IGZ1bmN0aW9uIChib2R5KSB7XG4gICAgICAgIC8qXG4gICAgICAgIOOAkOOBiuWxiuOBkeW4jOacm+aXpeOAkVhYWFjlubRYWOaciFhY5pel77yIWO+8iVxuICAgICAgICDjgJDphY3pgIHluIzmnJvmmYLplpPluK/jgJExOTowMO+9njIxOjAwIG9yIOWNiOWJjeS4rVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIG1lc3NhZ2VEYXRlTWF0Y2ggPSBuZXcgUmVnRXhwKCfjgJDjgYrlsYrjgZHluIzmnJvml6XjgJEoLispJyk7XG4gICAgICAgIHZhciBtZXNzYWdlVGltZU1hdGNoID0gbmV3IFJlZ0V4cCgn44CQKOmFjemAgeW4jOacm+aZgumWk+W4r3zjgYrlsYrjgZHluIzmnJvmmYLplpPluK8p44CRKC4rKScpO1xuICAgICAgICB2YXIgbWF0Y2hlZERhdGVNZXNzYWdlID0gYm9keS5tYXRjaChtZXNzYWdlRGF0ZU1hdGNoKTtcbiAgICAgICAgdmFyIG1hdGNoZWRUaW1lTWVzc2FnZSA9IGJvZHkubWF0Y2gobWVzc2FnZVRpbWVNYXRjaCk7XG4gICAgICAgIGlmIChtYXRjaGVkRGF0ZU1lc3NhZ2UgPT09IG51bGwgfHwgbWF0Y2hlZFRpbWVNZXNzYWdlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTm90IGZvdW5kIGRhdGUgcmFuZ2UgbWVzc2FnZScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFhYWFjlubRYWOaciFhY5pel77yIWO+8iVxuICAgICAgICB2YXIgbWVzc2FnZURhdGUgPSBtYXRjaGVkRGF0ZU1lc3NhZ2VbMV07XG4gICAgICAgIC8vIDE5OjAw772eMjE6MDAgb3Ig5Y2I5YmN5LitXG4gICAgICAgIHZhciBtZXNzYWdlVGltZSA9IG1hdGNoZWRUaW1lTWVzc2FnZVsyXTtcbiAgICAgICAgLy8gWFhYWOW5tFhY5pyIWFjml6VcbiAgICAgICAgdmFyIG1hdGNoZWREYXRlID0gbWVzc2FnZURhdGUubWF0Y2goLyhcXGQrKeW5tChcXGQrKeaciChcXGQrKeaXpS8pO1xuICAgICAgICBpZiAobWF0Y2hlZERhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdOb3QgZm91bmQgZGF0ZSByYW5nZScpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtYXRjaGVkVGltZSA9IG1lc3NhZ2VUaW1lLm1hdGNoKC8oXFxkKyk6KFxcZCsp772eKFxcZCspOihcXGQrKS8pO1xuICAgICAgICB2YXIgc3RhcnRIb3VyID0gMDtcbiAgICAgICAgdmFyIHN0YXJ0TWludXRlID0gMDtcbiAgICAgICAgdmFyIGVuZEhvdXIgPSAwO1xuICAgICAgICB2YXIgZW5kTWludXRlID0gMDtcbiAgICAgICAgaWYgKG1hdGNoZWRUaW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdGFydEhvdXIgPSBwYXJzZUludChtYXRjaGVkVGltZVsxXSwgMTApO1xuICAgICAgICAgICAgc3RhcnRNaW51dGUgPSBwYXJzZUludChtYXRjaGVkVGltZVsyXSwgMTApO1xuICAgICAgICAgICAgZW5kSG91ciA9IHBhcnNlSW50KG1hdGNoZWRUaW1lWzNdLCAxMCk7XG4gICAgICAgICAgICBlbmRNaW51dGUgPSBwYXJzZUludChtYXRjaGVkVGltZVs0XSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2hlZFRpbWUgPSBtZXNzYWdlVGltZS5tYXRjaCgv5Y2I5YmN5LitLyk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZFRpbWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzdGFydEhvdXIgPSA5O1xuICAgICAgICAgICAgICAgIHN0YXJ0TWludXRlID0gMDtcbiAgICAgICAgICAgICAgICBlbmRIb3VyID0gMTI7XG4gICAgICAgICAgICAgICAgZW5kTWludXRlID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgeWVhciA9IHBhcnNlSW50KG1hdGNoZWREYXRlWzFdLCAxMCk7XG4gICAgICAgIHZhciBtb250aCA9IHBhcnNlSW50KG1hdGNoZWREYXRlWzJdLCAxMCk7XG4gICAgICAgIHZhciBkYXkgPSBwYXJzZUludChtYXRjaGVkRGF0ZVszXSwgMTApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhcnQ6IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5LCBzdGFydEhvdXIsIHN0YXJ0TWludXRlKSxcbiAgICAgICAgICAgIGVuZDogbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGVuZEhvdXIsIGVuZE1pbnV0ZSksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBTaG9rdXRha3ViaW5NYWlsUnVsZS5wcm90b3R5cGUuZXh0cmFjdFRpdGxlID0gZnVuY3Rpb24gKGJvZHkpIHtcbiAgICAgICAgLypcbiAgICAgICAg44O76YCB44KK54q2Tm/vvJpYWFhYXG4gICAgICAgIFRpdGxlXG4gICAgICAgICAqL1xuICAgICAgICB2YXIgbWVzc2FnZU1hdGNoID0gbmV3IFJlZ0V4cCgn6YCB44