UNPKG

object-difference-js

Version:

get deep difference between two JavaScript objects

614 lines (504 loc) 64.3 kB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define("ObjDiff", [], factory); else if(typeof exports === 'object') exports["ObjDiff"] = factory(); else root["ObjDiff"] = factory(); })(typeof self !== 'undefined' ? self : this, function() { return /******/ (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.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./src/anyToString.js": /*!****************************!*\ !*** ./src/anyToString.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = anyToString; function _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); } function anyToString(t) { if (typeof t === "boolean" || typeof t === "number" || typeof t === "string") { return t.toString(); } else if (t === null) { return "null"; } else if (t === undefined) { return "undefined"; } if (_typeof(t) === "symbol") { return "symbol"; } else if (t instanceof Date) { return t.toUTCString(); } else if (Array.isArray(t)) { return t.map(function (x) { return anyToString(x); }).join(", "); } else if (typeof t === "function") { return "function"; } return JSON.stringify(t); } module.exports = exports["default"]; /***/ }), /***/ "./src/index.js": /*!**********************!*\ !*** ./src/index.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectDifference = __webpack_require__(/*! ./objectDifference.js */ "./src/objectDifference.js"); var _default = { ObjectDifference: _objectDifference.GetObjectDifference }; exports.default = _default; module.exports = exports["default"]; /***/ }), /***/ "./src/objectDifference.js": /*!*********************************!*\ !*** ./src/objectDifference.js ***! \*********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GetObjectDifference = GetObjectDifference; var _anyToString = _interopRequireDefault(__webpack_require__(/*! ./anyToString.js */ "./src/anyToString.js")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _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); } var VALUE_CREATED = "created", VALUE_UPDATED = "updated", VALUE_DELETED = "deleted", NOT_COMPARABLE = "NA"; function _isBlank(t) { return t === "" || t === 0 || t === undefined || t === null || t === {} || Array.isArray(t) && t.length < 1; } function _isValue(t) { return !_isBlank(t) && (typeof t === "boolean" || typeof t === "number" || typeof t === "string"); } function _isDate(t) { return !_isBlank(t) && t instanceof Date; } function _isArray(t) { return !_isBlank(t) && Array.isArray(t); } function _isFunction(t) { return typeof t === "function"; } function _isSymbol(t) { return _typeof(t) === "symbol"; } function _isObject(t) { return !_isValue(t) && !_isBlank(t) && !_isDate(t) && !_isArray(t) && !_isFunction(t) && !_isSymbol(t); } function _getFullPropName(parentName, propertyName) { return parentName ? "".concat(parentName, ".").concat(propertyName) : propertyName; } function _getArrayDiffence(parentName, propertyName, a1, a2) { var diff = []; if (a1.length === a2.length) { for (var i = 0; i < a1.length; i++) { if (JSON.stringify(a1[i]) === JSON.stringify(a2[i])) { continue; } else { for (var _i = 0; _i < a1.length; _i++) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), "[".concat(_i, "]"), a1[_i], a2[_i])); // eslint-disable-line no-use-before-define } } } return diff; } if (a1.length > 30 || a2.length > 30) { diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_UPDATED, from: "Array[".concat(a1.length, "]"), to: "Array[".concat(a2.length, "]") }); return diff; } function comparer(otherArray) { return function (current) { return otherArray.filter(function (other) { return JSON.stringify(other) === JSON.stringify(current); }).length === 0; }; } var onlyInA1 = a1.filter(comparer(a2)); var onlyInA2 = a2.filter(comparer(a1)); for (var _i2 = 0; _i2 < onlyInA1.length; _i2++) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), "[".concat(_i2, "]"), onlyInA1[_i2], undefined)); // eslint-disable-line no-use-before-define } for (var _i3 = 0; _i3 < onlyInA2.length; _i3++) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), "[".concat(_i3, "]"), undefined, onlyInA2[_i3])); // eslint-disable-line no-use-before-define } return diff; } function _getArrayDiffenceByKey(parentName, propertyName, a1, a2, keyProp) { var diff = []; function comparer(otherArray) { return function (current) { return otherArray.filter(function (other) { return other[keyProp] === current[keyProp]; }).length === 0; }; } var onlyInA1 = a1.filter(comparer(a2)); var onlyInA2 = a2.filter(comparer(a1)); for (var i = 0; i < onlyInA1.length; i++) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), "[".concat(keyProp, "=").concat(onlyInA1[i][keyProp], "]"), onlyInA1[i], undefined)); // eslint-disable-line no-use-before-define } for (var _i4 = 0; _i4 < onlyInA2.length; _i4++) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), "[".concat(keyProp, "=").concat(onlyInA2[_i4][keyProp], "]"), undefined, onlyInA2[_i4])); // eslint-disable-line no-use-before-define } var _loop = function _loop(_i5) { var a2Item = a2.find(function (x) { return x[keyProp] === a1[_i5][keyProp]; }); if (a2Item) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), "[".concat(keyProp, "=").concat(a1[_i5][keyProp], "]"), a1[_i5], a2Item)); // eslint-disable-line no-use-before-define } }; for (var _i5 = 0; _i5 < a1.length; _i5++) { _loop(_i5); } return diff; } function _GetObjectDifference(parentName, propertyName, valueFrom, valueTo) { var config = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; var diff = []; if (propertyName === "__ob__" || propertyName === "__proto__") { return diff; } // case: 两个都是基础类型 if (_isValue(valueFrom) && _isValue(valueTo)) { if (valueFrom == valueTo) { // eslint-disable-line return diff; } diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_UPDATED, from: valueFrom, to: valueTo }); return diff; } // case: 排除有function的情况 if (_isFunction(valueFrom) || _isFunction(valueTo)) { diff.push({ property: _getFullPropName(parentName, propertyName), type: NOT_COMPARABLE, from: (0, _anyToString.default)(valueFrom), to: (0, _anyToString.default)(valueTo) }); return diff; } // case: 其中一个是symbol if (_isSymbol(valueFrom) || _isSymbol(valueTo)) { diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_UPDATED, from: (0, _anyToString.default)(valueFrom), to: (0, _anyToString.default)(valueTo) }); return diff; } // case: 两个都是日期 if (_isDate(valueFrom) && _isDate(valueTo)) { if (valueFrom.getTime() === valueTo.getTime()) { return diff; } diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_UPDATED, from: (0, _anyToString.default)(valueFrom), to: (0, _anyToString.default)(valueTo) }); return diff; } // case: 一个是日期,另一个是值 if (_isDate(valueTo) && _isValue(valueFrom)) { if (new Date(valueFrom).getTime() === valueTo.getTime()) { return diff; } diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_UPDATED, from: (0, _anyToString.default)(valueFrom), to: (0, _anyToString.default)(valueTo) }); return diff; } if (_isDate(valueFrom) && _isValue(valueTo)) { if (new Date(valueTo).getTime() === valueFrom.getTime()) { return diff; } diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_UPDATED, from: (0, _anyToString.default)(valueFrom), to: (0, _anyToString.default)(valueTo) }); return diff; } // case: 两个都是Blank if (_isBlank(valueFrom) && _isBlank(valueTo)) { return diff; } // case: From是blank, To不是 if (_isBlank(valueFrom) && _isValue(valueTo)) { if (!valueTo) { //eslint-disable-line return diff; } diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_CREATED, from: "", to: (0, _anyToString.default)(valueTo) }); return diff; } if (_isBlank(valueFrom) && _isDate(valueTo)) { diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_CREATED, from: "", to: (0, _anyToString.default)(valueTo) }); return diff; } if (_isBlank(valueFrom) && _isArray(valueTo)) { for (var i = 0; i < valueTo.length; i++) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), "[".concat(i, "]"), undefined, valueTo[i])); } return diff; } if (_isBlank(valueFrom) && _isObject(valueTo)) { Object.getOwnPropertyNames(valueTo).forEach(function (val, idx, array) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), val, undefined, valueTo[val])); }); return diff; } // case: From不是blank, To是 if ((_isValue(valueFrom) || _isDate(valueFrom) || _isArray(valueFrom) || _isObject(valueFrom)) && _isBlank(valueTo)) { if (!valueFrom) { return diff; } diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_DELETED, from: "", to: "" }); return diff; } // case: From是值或日期,To是Array if ((_isValue(valueFrom) || _isDate(valueFrom)) && _isArray(valueTo)) { diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_DELETED, from: "", to: "" }); for (var _i6 = 0; _i6 < valueTo.length; _i6++) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), "[".concat(_i6, "]"), undefined, valueTo[_i6])); } return diff; } // case: From是值或日期,To是Object if ((_isValue(valueFrom) || _isDate(valueFrom)) && _isObject(valueTo)) { diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_DELETED, from: "", to: "" }); Object.getOwnPropertyNames(valueTo).forEach(function (val, idx, array) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), val, undefined, valueTo[val])); }); return diff; } // case: From是Array,To是值或日期 if (_isArray(valueFrom) && (_isValue(valueTo) || _isDate(valueTo))) { diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_UPDATED, from: "Array[".concat(valueFrom.length, "]"), to: (0, _anyToString.default)(valueTo) }); return diff; } // case: From是Array,To是Array if (_isArray(valueFrom) && _isArray(valueTo)) { if (config.ArrayKeyProperty) { // check whether Array element has the key var missKeyProp = false; for (var _i7 = 0; _i7 < valueFrom.length; _i7++) { if (valueFrom[_i7][config.ArrayKeyProperty] === undefined) { missKeyProp = true; } } for (var _i8 = 0; _i8 < valueTo.length; _i8++) { if (valueTo[_i8][config.ArrayKeyProperty] === undefined) { missKeyProp = true; } } if (!missKeyProp) { diff = diff.concat(_getArrayDiffenceByKey(parentName, propertyName, valueFrom, valueTo, config.ArrayKeyProperty)); } else { diff = diff.concat(_getArrayDiffence(parentName, propertyName, valueFrom, valueTo)); } } else { diff = diff.concat(_getArrayDiffence(parentName, propertyName, valueFrom, valueTo)); } return diff; } // case: From是Array,To是Object if (_isArray(valueFrom) && _isObject(valueTo)) { diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_DELETED, from: "Array[".concat(valueFrom.length, "]"), to: "" }); Object.getOwnPropertyNames(valueTo).forEach(function (val, idx, array) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), val, undefined, valueTo[val])); }); return diff; } // case: From是Object,To是值或日期 if (_isObject(valueFrom) && (_isValue(valueTo) || _isDate(valueTo))) { diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_UPDATED, from: "{}", to: (0, _anyToString.default)(valueTo) }); return diff; } // case: From是Object,To是Array if (_isObject(valueFrom) && _isArray(valueTo)) { diff.push({ property: _getFullPropName(parentName, propertyName), type: VALUE_DELETED, from: "{}", to: (0, _anyToString.default)(valueTo) }); for (var _i9 = 0; _i9 < valueTo.length; _i9++) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), "[".concat(_i9, "]"), undefined, valueTo[_i9])); } return diff; } // case: From是Object,To是Object if (_isObject(valueFrom) && _isObject(valueTo)) { Object.getOwnPropertyNames(valueFrom).forEach(function (val, idx, array) { diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), val, valueFrom[val], valueTo[val])); }); Object.getOwnPropertyNames(valueTo).forEach(function (val, idx, array) { if (valueFrom[val] !== undefined) { return; } diff = diff.concat(_GetObjectDifference(_getFullPropName(parentName, propertyName), val, undefined, valueTo[val])); }); } return diff; } /** * Get deep difference between two objects. An empty array will be returned for two same objects comparing. * * @export * @param {*} propertyName object name, as the root property name * @param {*} valueFrom value comparing on the left * @param {*} valueTo value comparing on the right * @returns */ function GetObjectDifference(objectName, valueFrom, valueTo) { var config = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; return _GetObjectDifference("", objectName, valueFrom, valueTo, config); } /***/ }) /******/ }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9PYmpEaWZmL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9PYmpEaWZmL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL09iakRpZmYvLi9zcmMvYW55VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vT2JqRGlmZi8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9PYmpEaWZmLy4vc3JjL29iamVjdERpZmZlcmVuY2UuanMiXSwibmFtZXMiOlsiYW55VG9TdHJpbmciLCJ0IiwidG9TdHJpbmciLCJ1bmRlZmluZWQiLCJEYXRlIiwidG9VVENTdHJpbmciLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJ4Iiwiam9pbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJPYmplY3REaWZmZXJlbmNlIiwiVkFMVUVfQ1JFQVRFRCIsIlZBTFVFX1VQREFURUQiLCJWQUxVRV9ERUxFVEVEIiwiTk9UX0NPTVBBUkFCTEUiLCJfaXNCbGFuayIsImxlbmd0aCIsIl9pc1ZhbHVlIiwiX2lzRGF0ZSIsIl9pc0FycmF5IiwiX2lzRnVuY3Rpb24iLCJfaXNTeW1ib2wiLCJfaXNPYmplY3QiLCJfZ2V0RnVsbFByb3BOYW1lIiwicGFyZW50TmFtZSIsInByb3BlcnR5TmFtZSIsIl9nZXRBcnJheURpZmZlbmNlIiwiYTEiLCJhMiIsImRpZmYiLCJpIiwiY29uY2F0IiwiX0dldE9iamVjdERpZmZlcmVuY2UiLCJwdXNoIiwicHJvcGVydHkiLCJ0eXBlIiwiZnJvbSIsInRvIiwiY29tcGFyZXIiLCJvdGhlckFycmF5IiwiY3VycmVudCIsImZpbHRlciIsIm90aGVyIiwib25seUluQTEiLCJvbmx5SW5BMiIsIl9nZXRBcnJheURpZmZlbmNlQnlLZXkiLCJrZXlQcm9wIiwiYTJJdGVtIiwiZmluZCIsInZhbHVlRnJvbSIsInZhbHVlVG8iLCJjb25maWciLCJnZXRUaW1lIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJ2YWwiLCJpZHgiLCJhcnJheSIsIkFycmF5S2V5UHJvcGVydHkiLCJtaXNzS2V5UHJvcCIsIkdldE9iamVjdERpZmZlcmVuY2UiLCJvYmplY3ROYW1lIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdFQUF3RCxrQkFBa0I7QUFDMUU7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQXlDLGlDQUFpQztBQUMxRSx3SEFBZ0gsbUJBQW1CLEVBQUU7QUFDckk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xGZSxTQUFTQSxXQUFULENBQXFCQyxDQUFyQixFQUF3QjtBQUNyQyxNQUFJLE9BQU9BLENBQVAsS0FBYSxTQUFiLElBQTBCLE9BQU9BLENBQVAsS0FBYSxRQUF2QyxJQUFtRCxPQUFPQSxDQUFQLEtBQWEsUUFBcEUsRUFBOEU7QUFDNUUsV0FBT0EsQ0FBQyxDQUFDQyxRQUFGLEVBQVA7QUFDRCxHQUZELE1BRU8sSUFBSUQsQ0FBQyxLQUFLLElBQVYsRUFBZ0I7QUFDckIsV0FBTyxNQUFQO0FBQ0QsR0FGTSxNQUVBLElBQUlBLENBQUMsS0FBS0UsU0FBVixFQUFxQjtBQUMxQixXQUFPLFdBQVA7QUFDRDs7QUFDRCxNQUFJLFFBQU9GLENBQVAsTUFBYSxRQUFqQixFQUEyQjtBQUN6QixXQUFPLFFBQVA7QUFDRCxHQUZELE1BRU8sSUFBSUEsQ0FBQyxZQUFZRyxJQUFqQixFQUF1QjtBQUM1QixXQUFPSCxDQUFDLENBQUNJLFdBQUYsRUFBUDtBQUNELEdBRk0sTUFFQSxJQUFJQyxLQUFLLENBQUNDLE9BQU4sQ0FBY04sQ0FBZCxDQUFKLEVBQXNCO0FBQzNCLFdBQU9BLENBQUMsQ0FDTE8sR0FESSxDQUNBLFVBQUFDLENBQUMsRUFBSTtBQUNSLGFBQU9ULFdBQVcsQ0FBQ1MsQ0FBRCxDQUFsQjtBQUNELEtBSEksRUFJSkMsSUFKSSxDQUlDLElBSkQsQ0FBUDtBQUtELEdBTk0sTUFNQSxJQUFJLE9BQU9ULENBQVAsS0FBYSxVQUFqQixFQUE2QjtBQUNsQyxXQUFPLFVBQVA7QUFDRDs7QUFDRCxTQUFPVSxJQUFJLENBQUNDLFNBQUwsQ0FBZVgsQ0FBZixDQUFQO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZCRDs7ZUFDZTtBQUFFWSxrQkFBZ0I7QUFBbEIsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRGY7Ozs7OztBQUVBLElBQU1DLGFBQWEsR0FBRyxTQUF0QjtBQUFBLElBQ0VDLGFBQWEsR0FBRyxTQURsQjtBQUFBLElBRUVDLGFBQWEsR0FBRyxTQUZsQjtBQUFBLElBR0VDLGNBQWMsR0FBRyxJQUhuQjs7QUFLQSxTQUFTQyxRQUFULENBQWtCakIsQ0FBbEIsRUFBcUI7QUFDbkIsU0FBT0EsQ0FBQyxLQUFLLEVBQU4sSUFBWUEsQ0FBQyxLQUFLLENBQWxCLElBQXVCQSxDQUFDLEtBQUtFLFNBQTdCLElBQTBDRixDQUFDLEtBQUssSUFBaEQsSUFBd0RBLENBQUMsS0FBSyxFQUE5RCxJQUFxRUssS0FBSyxDQUFDQyxPQUFOLENBQWNOLENBQWQsS0FBb0JBLENBQUMsQ0FBQ2tCLE1BQUYsR0FBVyxDQUEzRztBQUNEOztBQUNELFNBQVNDLFFBQVQsQ0FBa0JuQixDQUFsQixFQUFxQjtBQUNuQixTQUFPLENBQUNpQixRQUFRLENBQUNqQixDQUFELENBQVQsS0FBaUIsT0FBT0EsQ0FBUCxLQUFhLFNBQWIsSUFBMEIsT0FBT0EsQ0FBUCxLQUFhLFFBQXZDLElBQW1ELE9BQU9BLENBQVAsS0FBYSxRQUFqRixDQUFQO0FBQ0Q7O0FBQ0QsU0FBU29CLE9BQVQsQ0FBaUJwQixDQUFqQixFQUFvQjtBQUNsQixTQUFPLENBQUNpQixRQUFRLENBQUNqQixDQUFELENBQVQsSUFBZ0JBLENBQUMsWUFBWUcsSUFBcEM7QUFDRDs7QUFDRCxTQUFTa0IsUUFBVCxDQUFrQnJCLENBQWxCLEVBQXFCO0FBQ25CLFNBQU8sQ0FBQ2lCLFFBQVEsQ0FBQ2pCLENBQUQsQ0FBVCxJQUFnQkssS0FBSyxDQUFDQyxPQUFOLENBQWNOLENBQWQsQ0FBdkI7QUFDRDs7QUFDRCxTQUFTc0IsV0FBVCxDQUFxQnRCLENBQXJCLEVBQXdCO0FBQ3RCLFNBQU8sT0FBT0EsQ0FBUCxLQUFhLFVBQXBCO0FBQ0Q7O0FBQ0QsU0FBU3VCLFNBQVQsQ0FBbUJ2QixDQUFuQixFQUFzQjtBQUNwQixTQUFPLFFBQU9BLENBQVAsTUFBYSxRQUFwQjtBQUNEOztBQUNELFNBQVN3QixTQUFULENBQW1CeEIsQ0FBbkIsRUFBc0I7QUFDcEIsU0FBTyxDQUFDbUIsUUFBUSxDQUFDbkIsQ0FBRCxDQUFULElBQWdCLENBQUNpQixRQUFRLENBQUNqQixDQUFELENBQXpCLElBQWdDLENBQUNvQixPQUFPLENBQUNwQixDQUFELENBQXhDLElBQStDLENBQUNxQixRQUFRLENBQUNyQixDQUFELENBQXhELElBQStELENBQUNzQixXQUFXLENBQUN0QixDQUFELENBQTNFLElBQWtGLENBQUN1QixTQUFTLENBQUN2QixDQUFELENBQW5HO0FBQ0Q7O0FBRUQsU0FBU3lCLGdCQUFULENBQTBCQyxVQUExQixFQUFzQ0MsWUFBdEMsRUFBb0Q7QUFDbEQsU0FBT0QsVUFBVSxhQUFNQSxVQUFOLGNBQW9CQyxZQUFwQixJQUFxQ0EsWUFBdEQ7QUFDRDs7QUFFRCxTQUFTQyxpQkFBVCxDQUEyQkYsVUFBM0IsRUFBdUNDLFlBQXZDLEVBQXFERSxFQUFyRCxFQUF5REMsRUFBekQsRUFBNkQ7QUFDM0QsTUFBSUMsSUFBSSxHQUFHLEVBQVg7O0FBRUEsTUFBSUYsRUFBRSxDQUFDWCxNQUFILEtBQWNZLEVBQUUsQ0FBQ1osTUFBckIsRUFBNkI7QUFDM0IsU0FBSyxJQUFJYyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHSCxFQUFFLENBQUNYLE1BQXZCLEVBQStCYyxDQUFDLEVBQWhDLEVBQW9DO0FBQ2xDLFVBQUl0QixJQUFJLENBQUNDLFNBQUwsQ0FBZWtCLEVBQUUsQ0FBQ0csQ0FBRCxDQUFqQixNQUEwQnRCLElBQUksQ0FBQ0MsU0FBTCxDQUFlbUIsRUFBRSxDQUFDRSxDQUFELENBQWpCLENBQTlCLEVBQXFEO0FBQ25EO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsYUFBSyxJQUFJQSxFQUFDLEdBQUcsQ0FBYixFQUFnQkEsRUFBQyxHQUFHSCxFQUFFLENBQUNYLE1BQXZCLEVBQStCYyxFQUFDLEVBQWhDLEVBQW9DO0FBQ2xDRCxjQUFJLEdBQUdBLElBQUksQ0FBQ0UsTUFBTCxDQUFZQyxvQkFBb0IsQ0FBQ1QsZ0JBQWdCLENBQUNDLFVBQUQsRUFBYUMsWUFBYixDQUFqQixhQUFpREssRUFBakQsUUFBdURILEVBQUUsQ0FBQ0csRUFBRCxDQUF6RCxFQUE4REYsRUFBRSxDQUFDRSxFQUFELENBQWhFLENBQWhDLENBQVAsQ0FEa0MsQ0FDNEU7QUFDL0c7QUFDRjtBQUNGOztBQUNELFdBQU9ELElBQVA7QUFDRDs7QUFFRCxNQUFJRixFQUFFLENBQUNYLE1BQUgsR0FBWSxFQUFaLElBQWtCWSxFQUFFLENBQUNaLE1BQUgsR0FBWSxFQUFsQyxFQUFzQztBQUNwQ2EsUUFBSSxDQUFDSSxJQUFMLENBQVU7QUFDUkMsY0FBUSxFQUFFWCxnQkFBZ0IsQ0FBQ0MsVUFBRCxFQUFhQyxZQUFiLENBRGxCO0FBRVJVLFVBQUksRUFBRXZCLGFBRkU7QUFHUndCLFVBQUksa0JBQVdULEVBQUUsQ0FBQ1gsTUFBZCxNQUhJO0FBSVJxQixRQUFFLGtCQUFXVCxFQUFFLENBQUNaLE1BQWQ7QUFKTSxLQUFWO0FBTUEsV0FBT2EsSUFBUDtBQUNEOztBQUVELFdBQVNTLFFBQVQsQ0FBa0JDLFVBQWxCLEVBQThCO0FBQzVCLFdBQU8sVUFBVUMsT0FBVixFQUFtQjtBQUN4QixhQUNFRCxVQUFVLENBQUNFLE1BQVgsQ0FBa0IsVUFBVUMsS0FBVixFQUFpQjtBQUNqQyxlQUFPbEMsSUFBSSxDQUFDQyxTQUFMLENBQWVpQyxLQUFmLE1BQTBCbEMsSUFBSSxDQUFDQyxTQUFMLENBQWUrQixPQUFmLENBQWpDO0FBQ0QsT0FGRCxFQUVHeEIsTUFGSCxLQUVjLENBSGhCO0FBS0QsS0FORDtBQU9EOztBQUVELE1BQUkyQixRQUFRLEdBQUdoQixFQUFFLENBQUNjLE1BQUgsQ0FBVUgsUUFBUSxDQUFDVixFQUFELENBQWxCLENBQWY7QUFFQSxNQUFJZ0IsUUFBUSxHQUFHaEIsRUFBRSxDQUFDYSxNQUFILENBQVVILFFBQVEsQ0FBQ1gsRUFBRCxDQUFsQixDQUFmOztBQUVBLE9BQUssSUFBSUcsR0FBQyxHQUFHLENBQWIsRUFBZ0JBLEdBQUMsR0FBR2EsUUFBUSxDQUFDM0IsTUFBN0IsRUFBcUNjLEdBQUMsRUFBdEMsRUFBMEM7QUFDeENELFFBQUksR0FBR0EsSUFBSSxDQUFDRSxNQUFMLENBQVlDLG9CQUFvQixDQUFDVCxnQkFBZ0IsQ0FBQ0MsVUFBRCxFQUFhQyxZQUFiLENBQWpCLGFBQWlESyxHQUFqRCxRQUF1RGEsUUFBUSxDQUFDYixHQUFELENBQS9ELEVBQW9FOUIsU0FBcEUsQ0FBaEMsQ0FBUCxDQUR3QyxDQUNnRjtBQUN6SDs7QUFFRCxPQUFLLElBQUk4QixHQUFDLEdBQUcsQ0FBYixFQUFnQkEsR0FBQyxHQUFHYyxRQUFRLENBQUM1QixNQUE3QixFQUFxQ2MsR0FBQyxFQUF0QyxFQUEwQztBQUN4Q0QsUUFBSSxHQUFHQSxJQUFJLENBQUNFLE1BQUwsQ0FBWUMsb0JBQW9CLENBQUNULGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FBakIsYUFBaURLLEdBQWpELFFBQXVEOUIsU0FBdkQsRUFBa0U0QyxRQUFRLENBQUNkLEdBQUQsQ0FBMUUsQ0FBaEMsQ0FBUCxDQUR3QyxDQUNnRjtBQUN6SDs7QUFFRCxTQUFPRCxJQUFQO0FBQ0Q7O0FBQ0QsU0FBU2dCLHNCQUFULENBQWdDckIsVUFBaEMsRUFBNENDLFlBQTVDLEVBQTBERSxFQUExRCxFQUE4REMsRUFBOUQsRUFBa0VrQixPQUFsRSxFQUEyRTtBQUN6RSxNQUFJakIsSUFBSSxHQUFHLEVBQVg7O0FBRUEsV0FBU1MsUUFBVCxDQUFrQkMsVUFBbEIsRUFBOEI7QUFDNUIsV0FBTyxVQUFVQyxPQUFWLEVBQW1CO0FBQ3hCLGFBQ0VELFVBQVUsQ0FBQ0UsTUFBWCxDQUFrQixVQUFVQyxLQUFWLEVBQWlCO0FBQ2pDLGVBQU9BLEtBQUssQ0FBQ0ksT0FBRCxDQUFMLEtBQW1CTixPQUFPLENBQUNNLE9BQUQsQ0FBakM7QUFDRCxPQUZELEVBRUc5QixNQUZILEtBRWMsQ0FIaEI7QUFLRCxLQU5EO0FBT0Q7O0FBRUQsTUFBSTJCLFFBQVEsR0FBR2hCLEVBQUUsQ0FBQ2MsTUFBSCxDQUFVSCxRQUFRLENBQUNWLEVBQUQsQ0FBbEIsQ0FBZjtBQUVBLE1BQUlnQixRQUFRLEdBQUdoQixFQUFFLENBQUNhLE1BQUgsQ0FBVUgsUUFBUSxDQUFDWCxFQUFELENBQWxCLENBQWY7O0FBRUEsT0FBSyxJQUFJRyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHYSxRQUFRLENBQUMzQixNQUE3QixFQUFxQ2MsQ0FBQyxFQUF0QyxFQUEwQztBQUN4Q0QsUUFBSSxHQUFHQSxJQUFJLENBQUNFLE1BQUwsQ0FBWUMsb0JBQW9CLENBQUNULGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FBakIsYUFBaURxQixPQUFqRCxjQUE0REgsUUFBUSxDQUFDYixDQUFELENBQVIsQ0FBWWdCLE9BQVosQ0FBNUQsUUFBcUZILFFBQVEsQ0FBQ2IsQ0FBRCxDQUE3RixFQUFrRzlCLFNBQWxHLENBQWhDLENBQVAsQ0FEd0MsQ0FDOEc7QUFDdko7O0FBRUQsT0FBSyxJQUFJOEIsR0FBQyxHQUFHLENBQWIsRUFBZ0JBLEdBQUMsR0FBR2MsUUFBUSxDQUFDNUIsTUFBN0IsRUFBcUNjLEdBQUMsRUFBdEMsRUFBMEM7QUFDeENELFFBQUksR0FBR0EsSUFBSSxDQUFDRSxNQUFMLENBQVlDLG9CQUFvQixDQUFDVCxnQkFBZ0IsQ0FBQ0MsVUFBRCxFQUFhQyxZQUFiLENBQWpCLGFBQWlEcUIsT0FBakQsY0FBNERGLFFBQVEsQ0FBQ2QsR0FBRCxDQUFSLENBQVlnQixPQUFaLENBQTVELFFBQXFGOUMsU0FBckYsRUFBZ0c0QyxRQUFRLENBQUNkLEdBQUQsQ0FBeEcsQ0FBaEMsQ0FBUCxDQUR3QyxDQUM4RztBQUN2Sjs7QUF2QndFLDZCQXlCaEVBLEdBekJnRTtBQTBCdkUsUUFBSWlCLE1BQU0sR0FBR25CLEVBQUUsQ0FBQ29CLElBQUgsQ0FBUSxVQUFBMUMsQ0FBQyxFQUFJO0FBQ3hCLGFBQU9BLENBQUMsQ0FBQ3dDLE9BQUQsQ0FBRCxLQUFlbkIsRUFBRSxDQUFDRyxHQUFELENBQUYsQ0FBTWdCLE9BQU4sQ0FBdEI7QUFDRCxLQUZZLENBQWI7O0FBSUEsUUFBSUMsTUFBSixFQUFZO0FBQ1ZsQixVQUFJLEdBQUdBLElBQUksQ0FBQ0UsTUFBTCxDQUFZQyxvQkFBb0IsQ0FBQ1QsZ0JBQWdCLENBQUNDLFVBQUQsRUFBYUMsWUFBYixDQUFqQixhQUFpRHFCLE9BQWpELGNBQTREbkIsRUFBRSxDQUFDRyxHQUFELENBQUYsQ0FBTWdCLE9BQU4sQ0FBNUQsUUFBK0VuQixFQUFFLENBQUNHLEdBQUQsQ0FBakYsRUFBc0ZpQixNQUF0RixDQUFoQyxDQUFQLENBRFUsQ0FDNkg7QUFDeEk7QUFoQ3NFOztBQXlCekUsT0FBSyxJQUFJakIsR0FBQyxHQUFHLENBQWIsRUFBZ0JBLEdBQUMsR0FBR0gsRUFBRSxDQUFDWCxNQUF2QixFQUErQmMsR0FBQyxFQUFoQyxFQUFvQztBQUFBLFVBQTNCQSxHQUEyQjtBQVFuQzs7QUFFRCxTQUFPRCxJQUFQO0FBQ0Q7O0FBRUQsU0FBU0csb0JBQVQsQ0FBOEJSLFVBQTlCLEVBQTBDQyxZQUExQyxFQUF3RHdCLFNBQXhELEVBQW1FQyxPQUFuRSxFQUF5RjtBQUFBLE1BQWJDLE1BQWEsdUVBQUosRUFBSTtBQUN2RixNQUFJdEIsSUFBSSxHQUFHLEVBQVg7O0FBRUEsTUFBSUosWUFBWSxLQUFLLFFBQWpCLElBQTZCQSxZQUFZLEtBQUssV0FBbEQsRUFBK0Q7QUFDN0QsV0FBT0ksSUFBUDtBQUNELEdBTHNGLENBTXZGOzs7QUFDQSxNQUFJWixRQUFRLENBQUNnQyxTQUFELENBQVIsSUFBdUJoQyxRQUFRLENBQUNpQyxPQUFELENBQW5DLEVBQThDO0FBQzVDLFFBQUlELFNBQVMsSUFBSUMsT0FBakIsRUFBMEI7QUFBRTtBQUMxQixhQUFPckIsSUFBUDtBQUNEOztBQUNEQSxRQUFJLENBQUNJLElBQUwsQ0FBVTtBQUNSQyxjQUFRLEVBQUVYLGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FEbEI7QUFFUlUsVUFBSSxFQUFFdkIsYUFGRTtBQUdSd0IsVUFBSSxFQUFFYSxTQUhFO0FBSVJaLFFBQUUsRUFBRWE7QUFKSSxLQUFWO0FBTUEsV0FBT3JCLElBQVA7QUFDRCxHQWxCc0YsQ0FvQnZGOzs7QUFDQSxNQUFJVCxXQUFXLENBQUM2QixTQUFELENBQVgsSUFBMEI3QixXQUFXLENBQUM4QixPQUFELENBQXpDLEVBQW9EO0FBQ2xEckIsUUFBSSxDQUFDSSxJQUFMLENBQVU7QUFDUkMsY0FBUSxFQUFFWCxnQkFBZ0IsQ0FBQ0MsVUFBRCxFQUFhQyxZQUFiLENBRGxCO0FBRVJVLFVBQUksRUFBRXJCLGNBRkU7QUFHUnNCLFVBQUksRUFBRSwwQkFBWWEsU0FBWixDQUhFO0FBSVJaLFFBQUUsRUFBRSwwQkFBWWEsT0FBWjtBQUpJLEtBQVY7QUFNQSxXQUFPckIsSUFBUDtBQUNELEdBN0JzRixDQStCdkY7OztBQUNBLE1BQUlSLFNBQVMsQ0FBQzRCLFNBQUQsQ0FBVCxJQUF3QjVCLFNBQVMsQ0FBQzZCLE9BQUQsQ0FBckMsRUFBZ0Q7QUFDOUNyQixRQUFJLENBQUNJLElBQUwsQ0FBVTtBQUNSQyxjQUFRLEVBQUVYLGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FEbEI7QUFFUlUsVUFBSSxFQUFFdkIsYUFGRTtBQUdSd0IsVUFBSSxFQUFFLDBCQUFZYSxTQUFaLENBSEU7QUFJUlosUUFBRSxFQUFFLDBCQUFZYSxPQUFaO0FBSkksS0FBVjtBQU1BLFdBQU9yQixJQUFQO0FBQ0QsR0F4Q3NGLENBMEN2Rjs7O0FBQ0EsTUFBSVgsT0FBTyxDQUFDK0IsU0FBRCxDQUFQLElBQXNCL0IsT0FBTyxDQUFDZ0MsT0FBRCxDQUFqQyxFQUE0QztBQUMxQyxRQUFJRCxTQUFTLENBQUNHLE9BQVYsT0FBd0JGLE9BQU8sQ0FBQ0UsT0FBUixFQUE1QixFQUErQztBQUM3QyxhQUFPdkIsSUFBUDtBQUNEOztBQUNEQSxRQUFJLENBQUNJLElBQUwsQ0FBVTtBQUNSQyxjQUFRLEVBQUVYLGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FEbEI7QUFFUlUsVUFBSSxFQUFFdkIsYUFGRTtBQUdSd0IsVUFBSSxFQUFFLDBCQUFZYSxTQUFaLENBSEU7QUFJUlosUUFBRSxFQUFFLDBCQUFZYSxPQUFaO0FBSkksS0FBVjtBQU1BLFdBQU9yQixJQUFQO0FBQ0QsR0F0RHNGLENBd0R2Rjs7O0FBQ0EsTUFBSVgsT0FBTyxDQUFDZ0MsT0FBRCxDQUFQLElBQW9CakMsUUFBUSxDQUFDZ0MsU0FBRCxDQUFoQyxFQUE2QztBQUMzQyxRQUFJLElBQUloRCxJQUFKLENBQVNnRCxTQUFULEVBQW9CRyxPQUFwQixPQUFrQ0YsT0FBTyxDQUFDRSxPQUFSLEVBQXRDLEVBQXlEO0FBQ3ZELGFBQU92QixJQUFQO0FBQ0Q7O0FBQ0RBLFFBQUksQ0FBQ0ksSUFBTCxDQUFVO0FBQ1JDLGNBQVEsRUFBRVgsZ0JBQWdCLENBQUNDLFVBQUQsRUFBYUMsWUFBYixDQURsQjtBQUVSVSxVQUFJLEVBQUV2QixhQUZFO0FBR1J3QixVQUFJLEVBQUUsMEJBQVlhLFNBQVosQ0FIRTtBQUlSWixRQUFFLEVBQUUsMEJBQVlhLE9BQVo7QUFKSSxLQUFWO0FBTUEsV0FBT3JCLElBQVA7QUFDRDs7QUFDRCxNQUFJWCxPQUFPLENBQUMrQixTQUFELENBQVAsSUFBc0JoQyxRQUFRLENBQUNpQyxPQUFELENBQWxDLEVBQTZDO0FBQzNDLFFBQUksSUFBSWpELElBQUosQ0FBU2lELE9BQVQsRUFBa0JFLE9BQWxCLE9BQWdDSCxTQUFTLENBQUNHLE9BQVYsRUFBcEMsRUFBeUQ7QUFDdkQsYUFBT3ZCLElBQVA7QUFDRDs7QUFDREEsUUFBSSxDQUFDSSxJQUFMLENBQVU7QUFDUkMsY0FBUSxFQUFFWCxnQkFBZ0IsQ0FBQ0MsVUFBRCxFQUFhQyxZQUFiLENBRGxCO0FBRVJVLFVBQUksRUFBRXZCLGFBRkU7QUFHUndCLFVBQUksRUFBRSwwQkFBWWEsU0FBWixDQUhFO0FBSVJaLFFBQUUsRUFBRSwwQkFBWWEsT0FBWjtBQUpJLEtBQVY7QUFNQSxXQUFPckIsSUFBUDtBQUNELEdBaEZzRixDQWtGdkY7OztBQUNBLE1BQUlkLFFBQVEsQ0FBQ2tDLFNBQUQsQ0FBUixJQUF1QmxDLFFBQVEsQ0FBQ21DLE9BQUQsQ0FBbkMsRUFBOEM7QUFDNUMsV0FBT3JCLElBQVA7QUFDRCxHQXJGc0YsQ0FzRnZGOzs7QUFDQSxNQUFJZCxRQUFRLENBQUNrQyxTQUFELENBQVIsSUFBdUJoQyxRQUFRLENBQUNpQyxPQUFELENBQW5DLEVBQThDO0FBQzVDLFFBQUcsQ0FBQ0EsT0FBSixFQUFhO0FBQUc7QUFDZCxhQUFPckIsSUFBUDtBQUNEOztBQUNEQSxRQUFJLENBQUNJLElBQUwsQ0FBVTtBQUNSQyxjQUFRLEVBQUVYLGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FEbEI7QUFFUlUsVUFBSSxFQUFFeEIsYUFGRTtBQUdSeUIsVUFBSSxFQUFFLEVBSEU7QUFJUkMsUUFBRSxFQUFFLDBCQUFZYSxPQUFaO0FBSkksS0FBVjtBQU1BLFdBQU9yQixJQUFQO0FBQ0Q7O0FBQ0QsTUFBSWQsUUFBUSxDQUFDa0MsU0FBRCxDQUFSLElBQXVCL0IsT0FBTyxDQUFDZ0MsT0FBRCxDQUFsQyxFQUE2QztBQUMzQ3JCLFFBQUksQ0FBQ0ksSUFBTCxDQUFVO0FBQ1JDLGNBQVEsRUFBRVgsZ0JBQWdCLENBQUNDLFVBQUQsRUFBYUMsWUFBYixDQURsQjtBQUVSVSxVQUFJLEVBQUV4QixhQUZFO0FBR1J5QixVQUFJLEVBQUUsRUFIRTtBQUlSQyxRQUFFLEVBQUUsMEJBQVlhLE9BQVo7QUFKSSxLQUFWO0FBTUEsV0FBT3JCLElBQVA7QUFDRDs7QUFDRCxNQUFJZCxRQUFRLENBQUNrQyxTQUFELENBQVIsSUFBdUI5QixRQUFRLENBQUMrQixPQUFELENBQW5DLEVBQThDO0FBQzVDLFNBQUssSUFBSXBCLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdvQixPQUFPLENBQUNsQyxNQUE1QixFQUFvQ2MsQ0FBQyxFQUFyQyxFQUF5QztBQUN2Q0QsVUFBSSxHQUFHQSxJQUFJLENBQUNFLE1BQUwsQ0FBWUMsb0JBQW9CLENBQUNULGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FBakIsYUFBaURLLENBQWpELFFBQXVEOUIsU0FBdkQsRUFBa0VrRCxPQUFPLENBQUNwQixDQUFELENBQXpFLENBQWhDLENBQVA7QUFDRDs7QUFDRCxXQUFPRCxJQUFQO0FBQ0Q7O0FBQ0QsTUFBSWQsUUFBUSxDQUFDa0MsU0FBRCxDQUFSLElBQXVCM0IsU0FBUyxDQUFDNEIsT0FBRCxDQUFwQyxFQUErQztBQUM3Q0csVUFBTSxDQUFDQyxtQkFBUCxDQUEyQkosT0FBM0IsRUFBb0NLLE9BQXBDLENBQTRDLFVBQVVDLEdBQVYsRUFBZUMsR0FBZixFQUFvQkMsS0FBcEIsRUFBMkI7QUFDckU3QixVQUFJLEdBQUdBLElBQUksQ0FBQ0UsTUFBTCxDQUFZQyxvQkFBb0IsQ0FBQ1QsZ0JBQWdCLENBQUNDLFVBQUQsRUFBYUMsWUFBYixDQUFqQixFQUE2QytCLEdBQTdDLEVBQWtEeEQsU0FBbEQsRUFBNkRrRCxPQUFPLENBQUNNLEdBQUQsQ0FBcEUsQ0FBaEMsQ0FBUDtBQUNELEtBRkQ7QUFHQSxXQUFPM0IsSUFBUDtBQUNELEdBdkhzRixDQXdIdkY7OztBQUNBLE1BQUksQ0FBQ1osUUFBUSxDQUFDZ0MsU0FBRCxDQUFSLElBQXVCL0IsT0FBTyxDQUFDK0IsU0FBRCxDQUE5QixJQUE2QzlCLFFBQVEsQ0FBQzhCLFNBQUQsQ0FBckQsSUFBb0UzQixTQUFTLENBQUMyQixTQUFELENBQTlFLEtBQThGbEMsUUFBUSxDQUFDbUMsT0FBRCxDQUExRyxFQUFxSDtBQUNuSCxRQUFJLENBQUNELFNBQUwsRUFBZ0I7QUFDZCxhQUFPcEIsSUFBUDtBQUNEOztBQUNEQSxRQUFJLENBQUNJLElBQUwsQ0FBVTtBQUNSQyxjQUFRLEVBQUVYLGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FEbEI7QUFFUlUsVUFBSSxFQUFFdEIsYUFGRTtBQUdSdUIsVUFBSSxFQUFFLEVBSEU7QUFJUkMsUUFBRSxFQUFFO0FBSkksS0FBVjtBQU1BLFdBQU9SLElBQVA7QUFDRCxHQXBJc0YsQ0FzSXZGOzs7QUFDQSxNQUFJLENBQUNaLFFBQVEsQ0FBQ2dDLFNBQUQsQ0FBUixJQUF1Qi9CLE9BQU8sQ0FBQytCLFNBQUQsQ0FBL0IsS0FBK0M5QixRQUFRLENBQUMrQixPQUFELENBQTNELEVBQXNFO0FBQ3BFckIsUUFBSSxDQUFDSSxJQUFMLENBQVU7QUFDUkMsY0FBUSxFQUFFWCxnQkFBZ0IsQ0FBQ0MsVUFBRCxFQUFhQyxZQUFiLENBRGxCO0FBRVJVLFVBQUksRUFBRXRCLGFBRkU7QUFHUnVCLFVBQUksRUFBRSxFQUhFO0FBSVJDLFFBQUUsRUFBRTtBQUpJLEtBQVY7O0FBT0EsU0FBSyxJQUFJUCxHQUFDLEdBQUcsQ0FBYixFQUFnQkEsR0FBQyxHQUFHb0IsT0FBTyxDQUFDbEMsTUFBNUIsRUFBb0NjLEdBQUMsRUFBckMsRUFBeUM7QUFDdkNELFVBQUksR0FBR0EsSUFBSSxDQUFDRSxNQUFMLENBQVlDLG9CQUFvQixDQUFDVCxnQkFBZ0IsQ0FBQ0MsVUFBRCxFQUFhQyxZQUFiLENBQWpCLGFBQWlESyxHQUFqRCxRQUF1RDlCLFNBQXZELEVBQWtFa0QsT0FBTyxDQUFDcEIsR0FBRCxDQUF6RSxDQUFoQyxDQUFQO0FBQ0Q7O0FBRUQsV0FBT0QsSUFBUDtBQUNELEdBcEpzRixDQXNKdkY7OztBQUNBLE1BQUksQ0FBQ1osUUFBUSxDQUFDZ0MsU0FBRCxDQUFSLElBQXVCL0IsT0FBTyxDQUFDK0IsU0FBRCxDQUEvQixLQUErQzNCLFNBQVMsQ0FBQzRCLE9BQUQsQ0FBNUQsRUFBdUU7QUFDckVyQixRQUFJLENBQUNJLElBQUwsQ0FBVTtBQUNSQyxjQUFRLEVBQUVYLGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FEbEI7QUFFUlUsVUFBSSxFQUFFdEIsYUFGRTtBQUdSdUIsVUFBSSxFQUFFLEVBSEU7QUFJUkMsUUFBRSxFQUFFO0FBSkksS0FBVjtBQU9BZ0IsVUFBTSxDQUFDQyxtQkFBUCxDQUEyQkosT0FBM0IsRUFBb0NLLE9BQXBDLENBQTRDLFVBQVVDLEdBQVYsRUFBZUMsR0FBZixFQUFvQkMsS0FBcEIsRUFBMkI7QUFDckU3QixVQUFJLEdBQUdBLElBQUksQ0FBQ0UsTUFBTCxDQUFZQyxvQkFBb0IsQ0FBQ1QsZ0JBQWdCLENBQUNDLFVBQUQsRUFBYUMsWUFBYixDQUFqQixFQUE2QytCLEdBQTdDLEVBQWtEeEQsU0FBbEQsRUFBNkRrRCxPQUFPLENBQUNNLEdBQUQsQ0FBcEUsQ0FBaEMsQ0FBUDtBQUNELEtBRkQ7QUFJQSxXQUFPM0IsSUFBUDtBQUNELEdBcEtzRixDQXNLdkY7OztBQUNBLE1BQUlWLFFBQVEsQ0FBQzhCLFNBQUQsQ0FBUixLQUF3QmhDLFFBQVEsQ0FBQ2lDLE9BQUQsQ0FBUixJQUFxQmhDLE9BQU8sQ0FBQ2dDLE9BQUQsQ0FBcEQsQ0FBSixFQUFvRTtBQUNsRXJCLFFBQUksQ0FBQ0ksSUFBTCxDQUFVO0FBQ1JDLGNBQVEsRUFBRVgsZ0JBQWdCLENBQUNDLFVBQUQsRUFBYUMsWUFBYixDQURsQjtBQUVSVSxVQUFJLEVBQUV2QixhQUZFO0FBR1J3QixVQUFJLGtCQUFXYSxTQUFTLENBQUNqQyxNQUFyQixNQUhJO0FBSVJxQixRQUFFLEVBQUUsMEJBQVlhLE9BQVo7QUFKSSxLQUFWO0FBTUEsV0FBT3JCLElBQVA7QUFDRCxHQS9Lc0YsQ0FpTHZGOzs7QUFDQSxNQUFJVixRQUFRLENBQUM4QixTQUFELENBQVIsSUFBdUI5QixRQUFRLENBQUMrQixPQUFELENBQW5DLEVBQThDO0FBQzVDLFFBQUlDLE1BQU0sQ0FBQ1EsZ0JBQVgsRUFBNkI7QUFDM0I7QUFDQSxVQUFJQyxXQUFXLEdBQUcsS0FBbEI7O0FBRUEsV0FBSyxJQUFJOUIsR0FBQyxHQUFHLENBQWIsRUFBZ0JBLEdBQUMsR0FBR21CLFNBQVMsQ0FBQ2pDLE1BQTlCLEVBQXNDYyxHQUFDLEVBQXZDLEVBQTJDO0FBQ3pDLFlBQUltQixTQUFTLENBQUNuQixHQUFELENBQVQsQ0FBYXFCLE1BQU0sQ0FBQ1EsZ0JBQXBCLE1BQTBDM0QsU0FBOUMsRUFBeUQ7QUFDdkQ0RCxxQkFBVyxHQUFHLElBQWQ7QUFDRDtBQUNGOztBQUNELFdBQUssSUFBSTlCLEdBQUMsR0FBRyxDQUFiLEVBQWdCQSxHQUFDLEdBQUdvQixPQUFPLENBQUNsQyxNQUE1QixFQUFvQ2MsR0FBQyxFQUFyQyxFQUF5QztBQUN2QyxZQUFJb0IsT0FBTyxDQUFDcEIsR0FBRCxDQUFQLENBQVdxQixNQUFNLENBQUNRLGdCQUFsQixNQUF3QzNELFNBQTVDLEVBQXVEO0FBQ3JENEQscUJBQVcsR0FBRyxJQUFkO0FBQ0Q7QUFDRjs7QUFFRCxVQUFJLENBQUNBLFdBQUwsRUFBa0I7QUFDaEIvQixZQUFJLEdBQUdBLElBQUksQ0FBQ0UsTUFBTCxDQUFZYyxzQkFBc0IsQ0FBQ3JCLFVBQUQsRUFBYUMsWUFBYixFQUEyQndCLFNBQTNCLEVBQXNDQyxPQUF0QyxFQUErQ0MsTUFBTSxDQUFDUSxnQkFBdEQsQ0FBbEMsQ0FBUDtBQUNELE9BRkQsTUFFTztBQUNMOUIsWUFBSSxHQUFHQSxJQUFJLENBQUNFLE1BQUwsQ0FBWUwsaUJBQWlCLENBQUNGLFVBQUQsRUFBYUMsWUFBYixFQUEyQndCLFNBQTNCLEVBQXNDQyxPQUF0QyxDQUE3QixDQUFQO0FBQ0Q7QUFDRixLQXBCRCxNQW9CTztBQUNMckIsVUFBSSxHQUFHQSxJQUFJLENBQUNFLE1BQUwsQ0FBWUwsaUJBQWlCLENBQUNGLFVBQUQsRUFBYUMsWUFBYixFQUEyQndCLFNBQTNCLEVBQXNDQyxPQUF0QyxDQUE3QixDQUFQO0FBQ0Q7O0FBQ0QsV0FBT3JCLElBQVA7QUFDRCxHQTNNc0YsQ0E2TXZGOzs7QUFDQSxNQUFJVixRQUFRLENBQUM4QixTQUFELENBQVIsSUFBdUIzQixTQUFTLENBQUM0QixPQUFELENBQXBDLEVBQStDO0FBQzdDckIsUUFBSSxDQUFDSSxJQUFMLENBQVU7QUFDUkMsY0FBUSxFQUFFWCxnQkFBZ0IsQ0FBQ0MsVUFBRCxFQUFhQyxZQUFiLENBRGxCO0FBRVJVLFVBQUksRUFBRXRCLGFBRkU7QUFHUnVCLFVBQUksa0JBQVdhLFNBQVMsQ0FBQ2pDLE1BQXJCLE1BSEk7QUFJUnFCLFFBQUUsRUFBRTtBQUpJLEtBQVY7QUFPQWdCLFVBQU0sQ0FBQ0MsbUJBQVAsQ0FBMkJKLE9BQTNCLEVBQW9DSyxPQUFwQyxDQUE0QyxVQUFVQyxHQUFWLEVBQWVDLEdBQWYsRUFBb0JDLEtBQXBCLEVBQTJCO0FBQ3JFN0IsVUFBSSxHQUFHQSxJQUFJLENBQUNFLE1BQUwsQ0FBWUMsb0JBQW9CLENBQUNULGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FBakIsRUFBNkMrQixHQUE3QyxFQUFrRHhELFNBQWxELEVBQTZEa0QsT0FBTyxDQUFDTSxHQUFELENBQXBFLENBQWhDLENBQVA7QUFDRCxLQUZEO0FBSUEsV0FBTzNCLElBQVA7QUFDRCxHQTNOc0YsQ0E2TnZGOzs7QUFDQSxNQUFJUCxTQUFTLENBQUMyQixTQUFELENBQVQsS0FBeUJoQyxRQUFRLENBQUNpQyxPQUFELENBQVIsSUFBcUJoQyxPQUFPLENBQUNnQyxPQUFELENBQXJELENBQUosRUFBcUU7QUFDbkVyQixRQUFJLENBQUNJLElBQUwsQ0FBVTtBQUNSQyxjQUFRLEVBQUVYLGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FEbEI7QUFFUlUsVUFBSSxFQUFFdkIsYUFGRTtBQUdSd0IsVUFBSSxFQUFFLElBSEU7QUFJUkMsUUFBRSxFQUFFLDBCQUFZYSxPQUFaO0FBSkksS0FBVjtBQU9BLFdBQU9yQixJQUFQO0FBQ0QsR0F2T3NGLENBd092Rjs7O0FBQ0EsTUFBSVAsU0FBUyxDQUFDMkIsU0FBRCxDQUFULElBQXdCOUIsUUFBUSxDQUFDK0IsT0FBRCxDQUFwQyxFQUErQztBQUM3Q3JCLFFBQUksQ0FBQ0ksSUFBTCxDQUFVO0FBQ1JDLGNBQVEsRUFBRVgsZ0JBQWdCLENBQUNDLFVBQUQsRUFBYUMsWUFBYixDQURsQjtBQUVSVSxVQUFJLEVBQUV0QixhQUZFO0FBR1J1QixVQUFJLEVBQUUsSUFIRTtBQUlSQyxRQUFFLEVBQUUsMEJBQVlhLE9BQVo7QUFKSSxLQUFWOztBQU1BLFNBQUssSUFBSXBCLEdBQUMsR0FBRyxDQUFiLEVBQWdCQSxHQUFDLEdBQUdvQixPQUFPLENBQUNsQyxNQUE1QixFQUFvQ2MsR0FBQyxFQUFyQyxFQUF5QztBQUN2Q0QsVUFBSSxHQUFHQSxJQUFJLENBQUNFLE1BQUwsQ0FBWUMsb0JBQW9CLENBQUNULGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLFlBQWIsQ0FBakIsYUFBaURLLEdBQWpELFFBQXVEOUIsU0FBdkQsRUFBa0VrRCxPQUFPLENBQUNwQixHQUFELENBQXpFLENBQWhDLENBQVA7QUFDRDs7QUFDRCxXQUFPRCxJQUFQO0FBQ0QsR0FwUHNGLENBc1B2Rjs7O0FBQ0EsTUFBSVAsU0FBUyxDQUFDMkIsU0FBRCxDQUFULElBQXdCM0IsU0FBUyxDQUFDNEIsT0FBRCxDQUFyQyxFQUFnRDtBQUM5Q0csVUFBTSxDQUFDQyxtQkFBUCxDQUEyQkwsU0FBM0IsRUFBc0NNLE9BQXRDLENBQThDLFVBQVVDLEdBQVYsRUFBZUMsR0FBZixFQUFvQkMsS0FBcEIsRUFBMkI7QUFDdkU3QixVQUFJLEdBQUdBLElBQUksQ0FBQ0UsTUFBTCxDQUFZQyxvQkFBb0IsQ0FBQ1QsZ0JBQWdCLENBQUNDLFVBQUQsRUFBYUMsWUFBYixDQUFqQixFQUE2QytCLEdBQTdDLEVBQWtEUCxTQUFTLENBQUNPLEdBQUQsQ0FBM0QsRUFBa0VOLE9BQU8sQ0FBQ00sR0FBRCxDQUF6RSxDQUFoQyxDQUFQO0FBQ0QsS0FGRDtBQUdBSCxVQUFNLENBQUNDLG1CQUFQLENBQTJCSixPQUEzQixFQUFvQ0ssT0FBcEMsQ0FBNEMsVUFBVUMsR0FBVixFQUFlQyxHQUFmLEVBQW9CQyxLQUFwQixFQUEyQjtBQUNyRSxVQUFJVCxTQUFTLENBQUNPLEdBQUQsQ0FBVCxLQUFtQnhELFNBQXZCLEVBQWtDO0FBQ2hDO0FBQ0Q7O0FBQ0Q2QixVQUFJLEdBQUdBLElBQUksQ0FBQ0UsTUFBTCxDQUFZQyxvQkFBb0IsQ0FBQ1QsZ0JBQWdCLENBQUNDLFVBQUQsRUFBYUMsWUFBYixDQUFqQixFQUE2QytCLEdBQTdDLEVBQWtEeEQsU0FBbEQsRUFBNkRrRCxPQUFPLENBQUNNLEdBQUQsQ0FBcEUsQ0FBaEMsQ0FBUDtBQUNELEtBTEQ7QUFNRDs7QUFFRCxTQUFPM0IsSUFBUDtBQUNEO0FBRUQ7Ozs7Ozs7Ozs7O0FBU08sU0FBU2dDLG1CQUFULENBQTZCQyxVQUE3QixFQUF5Q2IsU0FBekMsRUFBb0RDLE9BQXBELEVBQTBFO0FBQUEsTUFBYkMsTUFBYSx1RUFBSixFQUFJO0FBQy9FLFNBQU9uQixvQkFBb0IsQ0FBQyxFQUFELEVBQUs4QixVQUFMLEVBQWlCYixTQUFqQixFQUE0QkMsT0FBNUIsRUFBcUNDLE1BQXJDLENBQTNCO0FBQ0QsQyIsImZpbGUiOiJvYmplY3QtZGlmZmVyZW5jZS1qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiT2JqRGlmZlwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJPYmpEaWZmXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIk9iakRpZmZcIl0gPSBmYWN0b3J5KCk7XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvaW5kZXguanNcIik7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhbnlUb1N0cmluZyh0KSB7XHJcbiAgaWYgKHR5cGVvZiB0ID09PSBcImJvb2xlYW5cIiB8fCB0eXBlb2YgdCA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgcmV0dXJuIHQudG9TdHJpbmcoKTtcclxuICB9IGVsc2UgaWYgKHQgPT09IG51bGwpIHtcclxuICAgIHJldHVybiBcIm51bGxcIjtcclxuICB9IGVsc2UgaWYgKHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XHJcbiAgfVxyXG4gIGlmICh0eXBlb2YgdCA9PT0gXCJzeW1ib2xcIikge1xyXG4gICAgcmV0dXJuIFwic3ltYm9sXCI7XHJcbiAgfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgcmV0dXJuIHQudG9VVENTdHJpbmcoKTtcclxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodCkpIHtcclxuICAgIHJldHVybiB0XHJcbiAgICAgIC5tYXAoeCA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGFueVRvU3RyaW5nKHgpO1xyXG4gICAgICB9KVxyXG4gICAgICAuam9pbihcIiwgXCIpO1xyXG4gIH0gZWxzZSBpZiAodHlwZW9mIHQgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgcmV0dXJuIFwiZnVuY3Rpb25cIjtcclxuICB9XHJcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpO1xyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBHZXRPYmplY3REaWZmZXJlbmNlIGFzIE9iamVjdERpZmZlcmVuY2V9IGZyb20gXCIuL29iamVjdERpZmZlcmVuY2UuanNcIjtcclxuZXhwb3J0IGRlZmF1bHQgeyBPYmplY3REaWZmZXJlbmNlIH07XHJcbiIsImltcG9ydCBhbnlUb1N0cmluZyBmcm9tIFwiLi9hbnlUb1N0cmluZy5qc1wiO1xyXG5cclxuY29uc3QgVkFMVUVfQ1JFQVRFRCA9IFwiY3JlYXRlZFwiLFxyXG4gIFZBTFVFX1VQREFURUQgPSBcInVwZGF0ZWRcIixcclxuICBWQUxVRV9ERUxFVEVEID0gXCJkZWxldGVkXCIsXHJcbiAgTk9UX0NPTVBBUkFCTEUgPSBcIk5BXCI7XHJcblxyXG5mdW5jdGlvbiBfaXNCbGFuayh0KSB7XHJcbiAgcmV0dXJuIHQgPT09IFwiXCIgfHwgdCA9PT0gMCB8fCB0ID09PSB1bmRlZmluZWQgfHwgdCA9PT0gbnVsbCB8fCB0ID09PSB7fSB8fCAoQXJyYXkuaXNBcnJheSh0KSAmJiB0Lmxlbmd0aCA8IDEpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc1ZhbHVlKHQpIHtcclxuICByZXR1cm4gIV9pc0JsYW5rKHQpICYmICh0eXBlb2YgdCA9PT0gXCJib29sZWFuXCIgfHwgdHlwZW9mIHQgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHQgPT09IFwic3RyaW5nXCIpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0RhdGUodCkge1xyXG4gIHJldHVybiAhX2lzQmxhbmsodCkgJiYgdCBpbnN0YW5jZW9mIERhdGU7XHJcbn1cclxuZnVuY3Rpb24gX2lzQXJyYXkodCkge1xyXG4gIHJldHVybiAhX2lzQmxhbmsodCkgJiYgQXJyYXkuaXNBcnJheSh0KTtcclxufVxyXG5mdW5jdGlvbiBfaXNGdW5jdGlvbih0KSB7XHJcbiAgcmV0dXJuIHR5cGVvZiB0ID09PSBcImZ1bmN0aW9uXCI7XHJcbn1cclxuZnVuY3Rpb24gX2lzU3ltYm9sKHQpIHtcclxuICByZXR1cm4gdHlwZW9mIHQgPT09IFwic3ltYm9sXCI7XHJcbn1cclxuZnVuY3Rpb24gX2lzT2JqZWN0KHQpIHtcclxuICByZXR1cm4gIV9pc1ZhbHVlKHQpICYmICFfaXNCbGFuayh0KSAmJiAhX2lzRGF0ZSh0KSAmJiAhX2lzQXJyYXkodCkgJiYgIV9pc0Z1bmN0aW9uKHQpICYmICFfaXNTeW1ib2wodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9nZXRGdWxsUHJvcE5hbWUocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lKSB7XHJcbiAgcmV0dXJuIHBhcmVudE5hbWUgPyBgJHtwYXJlbnROYW1lfS4ke3Byb3BlcnR5TmFtZX1gIDogcHJvcGVydHlOYW1lO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfZ2V0QXJyYXlEaWZmZW5jZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUsIGExLCBhMikge1xyXG4gIGxldCBkaWZmID0gW107XHJcblxyXG4gIGlmIChhMS5sZW5ndGggPT09IGEyLmxlbmd0aCkge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoYTFbaV0pID09PSBKU09OLnN0cmluZ2lmeShhMltpXSkpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBkaWZmID0gZGlmZi5jb25jYXQoX0dldE9iamVjdERpZmZlcmVuY2UoX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLCBgWyR7aX1dYCwgYTFbaV0sIGEyW2ldKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkaWZmO1xyXG4gIH1cclxuXHJcbiAgaWYgKGExLmxlbmd0aCA+IDMwIHx8IGEyLmxlbmd0aCA+IDMwKSB7XHJcbiAgICBkaWZmLnB1c2goe1xyXG4gICAgICBwcm9wZXJ0eTogX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLFxyXG4gICAgICB0eXBlOiBWQUxVRV9VUERBVEVELFxyXG4gICAgICBmcm9tOiBgQXJyYXlbJHthMS5sZW5ndGh9XWAsXHJcbiAgICAgIHRvOiBgQXJyYXlbJHthMi5sZW5ndGh9XWBcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRpZmY7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBjb21wYXJlcihvdGhlckFycmF5KSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGN1cnJlbnQpIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBvdGhlckFycmF5LmZpbHRlcihmdW5jdGlvbiAob3RoZXIpIHtcclxuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvdGhlcikgPT09IEpTT04uc3RyaW5naWZ5KGN1cnJlbnQpO1xyXG4gICAgICAgIH0pLmxlbmd0aCA9PT0gMFxyXG4gICAgICApO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGxldCBvbmx5SW5BMSA9IGExLmZpbHRlcihjb21wYXJlcihhMikpO1xyXG5cclxuICBsZXQgb25seUluQTIgPSBhMi5maWx0ZXIoY29tcGFyZXIoYTEpKTtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbmx5SW5BMS5sZW5ndGg7IGkrKykge1xyXG4gICAgZGlmZiA9IGRpZmYuY29uY2F0KF9HZXRPYmplY3REaWZmZXJlbmNlKF9nZXRGdWxsUHJvcE5hbWUocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lKSwgYFske2l9XWAsIG9ubHlJbkExW2ldLCB1bmRlZmluZWQpKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxyXG4gIH1cclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbmx5SW5BMi5sZW5ndGg7IGkrKykge1xyXG4gICAgZGlmZiA9IGRpZmYuY29uY2F0KF9HZXRPYmplY3REaWZmZXJlbmNlKF9nZXRGdWxsUHJvcE5hbWUocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lKSwgYFske2l9XWAsIHVuZGVmaW5lZCwgb2